diff --git a/packages/app/src/components/terminal-url.test.ts b/packages/app/src/components/terminal-url.test.ts index c07e3fa95..8548d7087 100644 --- a/packages/app/src/components/terminal-url.test.ts +++ b/packages/app/src/components/terminal-url.test.ts @@ -2,26 +2,34 @@ import { describe, expect, test } from "bun:test" import { ptySocketUrl } from "./terminal-url" describe("ptySocketUrl", () => { - test("uses browser host instead of sdk host", () => { + test("uses sdk host for absolute server url", () => { const url = ptySocketUrl("http://localhost:4096", "pty_1", "/repo", { host: "192.168.1.50:4096", protocol: "http:", }) - expect(url.toString()).toBe("ws://192.168.1.50:4096/pty/pty_1/connect?directory=%2Frepo") + expect(url.toString()).toBe("ws://localhost:4096/pty/pty_1/connect?directory=%2Frepo") + }) + + test("does not use browser port for local dev", () => { + const url = ptySocketUrl("http://localhost:4096", "pty_1", "/repo", { + host: "localhost:3000", + protocol: "http:", + }) + expect(url.toString()).toBe("ws://localhost:4096/pty/pty_1/connect?directory=%2Frepo") }) test("uses secure websocket on https", () => { - const url = ptySocketUrl("http://localhost:4096", "pty_1", "/repo", { - host: "opencode.local", - protocol: "https:", + const url = ptySocketUrl("https://opencode.local", "pty_1", "/repo", { + host: "localhost:3000", + protocol: "http:", }) expect(url.toString()).toBe("wss://opencode.local/pty/pty_1/connect?directory=%2Frepo") }) - test("preserves browser port", () => { - const url = ptySocketUrl("http://localhost:4096", "pty_1", "/repo", { - host: "opencode.local:8443", - protocol: "https:", + test("preserves base url port", () => { + const url = ptySocketUrl("https://opencode.local:8443", "pty_1", "/repo", { + host: "localhost:3000", + protocol: "http:", }) expect(url.toString()).toBe("wss://opencode.local:8443/pty/pty_1/connect?directory=%2Frepo") }) diff --git a/packages/app/src/components/terminal-url.ts b/packages/app/src/components/terminal-url.ts index c2c9fb53c..5f28e0e31 100644 --- a/packages/app/src/components/terminal-url.ts +++ b/packages/app/src/components/terminal-url.ts @@ -1,10 +1,12 @@ export function ptySocketUrl(base: string, id: string, directory: string, origin: { host: string; protocol: string }) { const root = `${origin.protocol}//${origin.host}` - const current = new URL(root) - const prefix = /^https?:\/\//.test(base) ? base : new URL(base || "/", root).toString() - const url = new URL(prefix.replace(/\/+$/, "") + `/pty/${id}/connect?directory=${encodeURIComponent(directory)}`) - url.hostname = current.hostname - url.port = current.port - url.protocol = origin.protocol === "https:" ? "wss:" : "ws:" + const absolute = /^https?:\/\//.test(base) + const resolved = absolute ? new URL(base) : new URL(base || "/", root) + + const url = new URL(resolved) + url.pathname = resolved.pathname.replace(/\/+$/, "") + `/pty/${id}/connect` + url.search = "" + url.searchParams.set("directory", directory) + url.protocol = resolved.protocol === "https:" ? "wss:" : "ws:" return url }