Browse Source

fix(app): terminal url

Adam 3 weeks ago
parent
commit
2896b8a863

+ 17 - 9
packages/app/src/components/terminal-url.test.ts

@@ -2,26 +2,34 @@ import { describe, expect, test } from "bun:test"
 import { ptySocketUrl } from "./terminal-url"
 import { ptySocketUrl } from "./terminal-url"
 
 
 describe("ptySocketUrl", () => {
 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", {
     const url = ptySocketUrl("http://localhost:4096", "pty_1", "/repo", {
       host: "192.168.1.50:4096",
       host: "192.168.1.50:4096",
       protocol: "http:",
       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("uses secure websocket on https", () => {
+  test("does not use browser port for local dev", () => {
     const url = ptySocketUrl("http://localhost:4096", "pty_1", "/repo", {
     const url = ptySocketUrl("http://localhost:4096", "pty_1", "/repo", {
-      host: "opencode.local",
-      protocol: "https:",
+      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("https://opencode.local", "pty_1", "/repo", {
+      host: "localhost:3000",
+      protocol: "http:",
     })
     })
     expect(url.toString()).toBe("wss://opencode.local/pty/pty_1/connect?directory=%2Frepo")
     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")
     expect(url.toString()).toBe("wss://opencode.local:8443/pty/pty_1/connect?directory=%2Frepo")
   })
   })

+ 8 - 6
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 }) {
 export function ptySocketUrl(base: string, id: string, directory: string, origin: { host: string; protocol: string }) {
   const root = `${origin.protocol}//${origin.host}`
   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
   return url
 }
 }