diff --git a/webui/src/lib/bootstrap.ts b/webui/src/lib/bootstrap.ts index 434fe685..483e4740 100644 --- a/webui/src/lib/bootstrap.ts +++ b/webui/src/lib/bootstrap.ts @@ -72,20 +72,20 @@ export function deriveWsUrl( wsUrl?: string | null, ): string { const query = `?token=${encodeURIComponent(token)}`; - if (wsUrl && /^(wss?|nanobot-host):\/\//i.test(wsUrl)) { - const join = wsUrl.includes("?") ? "&" : "?"; - return `${wsUrl}${join}token=${encodeURIComponent(token)}`; - } const path = wsPath && wsPath.startsWith("/") ? wsPath : `/${wsPath || ""}`; - if (typeof window === "undefined") { - return `ws://127.0.0.1:8765${path}${query}`; - } - if (window.location.port === "5173") { + if (typeof window !== "undefined" && window.location.port === "5173") { const host = window.location.hostname.includes(":") ? `[${window.location.hostname}]` : window.location.hostname; return `ws://${host}:8765${path}${query}`; } + if (wsUrl && /^(wss?|nanobot-host):\/\//i.test(wsUrl)) { + const join = wsUrl.includes("?") ? "&" : "?"; + return `${wsUrl}${join}token=${encodeURIComponent(token)}`; + } + if (typeof window === "undefined") { + return `ws://127.0.0.1:8765${path}${query}`; + } const scheme = window.location.protocol === "https:" ? "wss" : "ws"; const host = window.location.host; return `${scheme}://${host}${path}${query}`; diff --git a/webui/src/tests/bootstrap.test.ts b/webui/src/tests/bootstrap.test.ts index 27ed3a8b..8bac034e 100644 --- a/webui/src/tests/bootstrap.test.ts +++ b/webui/src/tests/bootstrap.test.ts @@ -14,6 +14,19 @@ describe("bootstrap helpers", () => { ); }); + it("overrides the server-provided websocket URL when on dev server port 5173", () => { + vi.stubGlobal("window", { + location: { + port: "5173", + hostname: "192.168.1.100", + protocol: "http:", + }, + }); + expect(deriveWsUrl("/", "tok", "ws://127.0.0.1:8765/")).toBe( + "ws://192.168.1.100:8765/?token=tok", + ); + }); + it("preserves the host socket bridge URL", () => { expect(deriveWsUrl("/", "tok en", "nanobot-host://engine/")).toBe( "nanobot-host://engine/?token=tok%20en",