aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar MichaƂ Warda <michalwarda@users.noreply.github.com> 2023-02-13 12:08:11 +0100
committerGravatar GitHub <noreply@github.com> 2023-02-13 03:08:11 -0800
commitf310d7414b3a9863d99773317620e93c1e8b6693 (patch)
treeaa1f57ccbbe4a546329884da8ea3bc394fa92af4
parent739de2c9cd19736b6d088a9f127b52709e72909b (diff)
downloadbun-f310d7414b3a9863d99773317620e93c1e8b6693.tar.gz
bun-f310d7414b3a9863d99773317620e93c1e8b6693.tar.zst
bun-f310d7414b3a9863d99773317620e93c1e8b6693.zip
Add dynamic port assigning to Bun.serve (#2062)
-rw-r--r--src/bun.js/api/server.zig7
-rw-r--r--src/deps/uws.zig9
-rw-r--r--test/bun.js/bun-server.test.ts29
3 files changed, 40 insertions, 5 deletions
diff --git a/src/bun.js/api/server.zig b/src/bun.js/api/server.zig
index 029ce6533..62d8f602a 100644
--- a/src/bun.js/api/server.zig
+++ b/src/bun.js/api/server.zig
@@ -408,10 +408,6 @@ pub const ServerConfig = struct {
}
}
- if (args.port == 0) {
- JSC.throwInvalidArguments("Invalid port: must be > 0", .{}, global, exception);
- }
-
if (args.base_uri.len > 0) {
args.base_url = URL.parse(args.base_uri);
if (args.base_url.hostname.len == 0) {
@@ -4308,7 +4304,8 @@ pub fn NewServer(comptime ssl_enabled_: bool, comptime debug_mode_: bool) type {
}
pub fn getPort(this: *ThisServer) JSC.JSValue {
- return JSC.JSValue.jsNumber(this.config.port);
+ var listener = this.listener orelse return JSC.JSValue.jsNumber(this.config.port);
+ return JSC.JSValue.jsNumber(listener.getLocalPort());
}
pub fn getPendingRequests(this: *ThisServer) JSC.JSValue {
diff --git a/src/deps/uws.zig b/src/deps/uws.zig
index 6925fce19..73eb72649 100644
--- a/src/deps/uws.zig
+++ b/src/deps/uws.zig
@@ -987,6 +987,9 @@ pub const ListenSocket = opaque {
pub fn close(this: *ListenSocket, ssl: bool) void {
us_listen_socket_close(@boolToInt(ssl), this);
}
+ pub fn getLocalPort(this: *ListenSocket, ssl: bool) i32 {
+ return us_socket_local_port(@boolToInt(ssl), this);
+ }
};
extern fn us_listen_socket_close(ssl: i32, ls: *ListenSocket) void;
extern fn uws_app_close(ssl: i32, app: *uws_app_s) void;
@@ -1058,6 +1061,12 @@ pub fn NewApp(comptime ssl: bool) type {
}
return us_listen_socket_close(ssl_flag, @ptrCast(*uws.ListenSocket, this));
}
+ pub inline fn getLocalPort(this: *ThisApp.ListenSocket) i32 {
+ if (comptime is_bindgen) {
+ unreachable;
+ }
+ return us_socket_local_port(ssl_flag, @ptrCast(*uws.Socket, this));
+ }
};
pub fn get(
diff --git a/test/bun.js/bun-server.test.ts b/test/bun.js/bun-server.test.ts
new file mode 100644
index 000000000..667d7bdca
--- /dev/null
+++ b/test/bun.js/bun-server.test.ts
@@ -0,0 +1,29 @@
+import { describe, expect, test } from "bun:test";
+
+describe("Server", () => {
+ test("returns active port when initializing server with 0 port", () => {
+ const server = Bun.serve({
+ fetch() {
+ return new Response("Hello");
+ },
+ port: 0,
+ });
+
+ expect(server.port).not.toBe(0);
+ expect(server.port).toBeDefined();
+ server.stop();
+ });
+
+ test("allows connecting to server", async () => {
+ const server = Bun.serve({
+ fetch() {
+ return new Response("Hello");
+ },
+ port: 0,
+ });
+
+ const response = await fetch(`http://${server.hostname}:${server.port}`);
+ expect(await response.text()).toBe("Hello");
+ server.stop();
+ });
+});