diff options
| author | Kit Langton <[email protected]> | 2026-05-03 14:23:29 -0400 |
|---|---|---|
| committer | GitHub <[email protected]> | 2026-05-03 18:23:29 +0000 |
| commit | 387220f368ca3a31d94b4be3937d9d825ebd888c (patch) | |
| tree | b9e1c49c993618c5137bb1016124f1019cb78e2f /packages/app/src/utils | |
| parent | adb7cb1037d24aa18021133b5993fa81869d8ba0 (diff) | |
| download | opencode-387220f368ca3a31d94b4be3937d9d825ebd888c.tar.gz opencode-387220f368ca3a31d94b4be3937d9d825ebd888c.zip | |
fix(server): support desktop PTY websockets with HttpApi (#25598)
Diffstat (limited to 'packages/app/src/utils')
| -rw-r--r-- | packages/app/src/utils/terminal-websocket-url.test.ts | 36 | ||||
| -rw-r--r-- | packages/app/src/utils/terminal-websocket-url.ts | 16 |
2 files changed, 52 insertions, 0 deletions
diff --git a/packages/app/src/utils/terminal-websocket-url.test.ts b/packages/app/src/utils/terminal-websocket-url.test.ts new file mode 100644 index 000000000..c85863abd --- /dev/null +++ b/packages/app/src/utils/terminal-websocket-url.test.ts @@ -0,0 +1,36 @@ +import { describe, expect, test } from "bun:test" +import { terminalWebSocketURL } from "./terminal-websocket-url" + +describe("terminalWebSocketURL", () => { + test("uses query auth without embedding credentials in websocket URL", () => { + const url = terminalWebSocketURL({ + url: "http://127.0.0.1:49365", + id: "pty_test", + directory: "/tmp/project", + cursor: 0, + sameOrigin: false, + username: "opencode", + password: "secret", + }) + + expect(url.protocol).toBe("ws:") + expect(url.username).toBe("") + expect(url.password).toBe("") + expect(url.searchParams.get("auth_token")).toBe(btoa("opencode:secret")) + }) + + test("omits query auth for same-origin websocket URL", () => { + const url = terminalWebSocketURL({ + url: "https://app.example.test", + id: "pty_test", + directory: "/tmp/project", + cursor: 10, + sameOrigin: true, + username: "opencode", + password: "secret", + }) + + expect(url.protocol).toBe("wss:") + expect(url.searchParams.has("auth_token")).toBe(false) + }) +}) diff --git a/packages/app/src/utils/terminal-websocket-url.ts b/packages/app/src/utils/terminal-websocket-url.ts new file mode 100644 index 000000000..146df16b7 --- /dev/null +++ b/packages/app/src/utils/terminal-websocket-url.ts @@ -0,0 +1,16 @@ +export function terminalWebSocketURL(input: { + url: string + id: string + directory: string + cursor: number + sameOrigin: boolean + username: string + password?: string +}) { + const next = new URL(`${input.url}/pty/${input.id}/connect`) + next.searchParams.set("directory", input.directory) + next.searchParams.set("cursor", String(input.cursor)) + next.protocol = next.protocol === "https:" ? "wss:" : "ws:" + if (!input.sameOrigin && input.password) next.searchParams.set("auth_token", btoa(`${input.username}:${input.password}`)) + return next +} |
