From d3e4b35f2b0f1f88f9987e6aa6a4c577cddde060 Mon Sep 17 00:00:00 2001 From: chengyongru <61816729+chengyongru@users.noreply.github.com> Date: Fri, 24 Jul 2026 18:40:09 +0800 Subject: [PATCH] fix(webui): honor custom gateway port with Vite (#5076) --- webui/src/lib/bootstrap.ts | 10 +++++++++- webui/src/tests/bootstrap.test.ts | 13 +++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/webui/src/lib/bootstrap.ts b/webui/src/lib/bootstrap.ts index b7fafef9..d65c2b16 100644 --- a/webui/src/lib/bootstrap.ts +++ b/webui/src/lib/bootstrap.ts @@ -116,7 +116,15 @@ export function deriveWsUrl( const host = window.location.hostname.includes(":") ? `[${window.location.hostname}]` : window.location.hostname; - return `ws://${host}:8765${path}${query}`; + let scheme = "ws"; + let port = "8765"; + if (wsUrl && /^wss?:\/\//i.test(wsUrl)) { + const upstream = new URL(wsUrl); + scheme = upstream.protocol === "wss:" ? "wss" : "ws"; + port = upstream.port; + } + const authority = port ? `${host}:${port}` : host; + return `${scheme}://${authority}${path}${query}`; } if (wsUrl && /^(wss?|nanobot-host):\/\//i.test(wsUrl)) { const join = wsUrl.includes("?") ? "&" : "?"; diff --git a/webui/src/tests/bootstrap.test.ts b/webui/src/tests/bootstrap.test.ts index 1378ff50..6ee98bbf 100644 --- a/webui/src/tests/bootstrap.test.ts +++ b/webui/src/tests/bootstrap.test.ts @@ -32,6 +32,19 @@ describe("bootstrap helpers", () => { ); }); + it("keeps the gateway websocket port when Vite proxies a custom target", () => { + vi.stubGlobal("window", { + location: { + port: "5173", + hostname: "127.0.0.1", + protocol: "http:", + }, + }); + expect(deriveWsUrl("/ws", "tok", "ws://127.0.0.1:8899/ws")).toBe( + "ws://127.0.0.1:8899/ws?token=tok", + ); + }); + it("preserves the host socket bridge URL", () => { expect(deriveWsUrl("/", "tok en", "nanobot-host://engine/")).toBe( "nanobot-host://engine/?token=tok%20en",