summaryrefslogtreecommitdiffhomepage
path: root/packages/sdk/js/src/v2/client.ts
diff options
context:
space:
mode:
authorAdam <[email protected]>2026-03-26 13:41:22 -0500
committerGitHub <[email protected]>2026-03-26 13:41:22 -0500
commitc7760b433b1bdbcaed7e7cd55d53b5b331f0f0fa (patch)
tree4d1a865b8890dc30767b66293923c15e2b3f6d24 /packages/sdk/js/src/v2/client.ts
parent2e6ac8ff49eabcb1b62c1bd504338e7449f80c6e (diff)
downloadopencode-c7760b433b1bdbcaed7e7cd55d53b5b331f0f0fa.tar.gz
opencode-c7760b433b1bdbcaed7e7cd55d53b5b331f0f0fa.zip
fix(app): more startup perf (#19288)
Diffstat (limited to 'packages/sdk/js/src/v2/client.ts')
-rw-r--r--packages/sdk/js/src/v2/client.ts48
1 files changed, 45 insertions, 3 deletions
diff --git a/packages/sdk/js/src/v2/client.ts b/packages/sdk/js/src/v2/client.ts
index ad956dd4b..e230a4b5d 100644
--- a/packages/sdk/js/src/v2/client.ts
+++ b/packages/sdk/js/src/v2/client.ts
@@ -5,6 +5,44 @@ import { type Config } from "./gen/client/types.gen.js"
import { OpencodeClient } from "./gen/sdk.gen.js"
export { type Config as OpencodeClientConfig, OpencodeClient }
+function pick(value: string | null, fallback?: string, encode?: (value: string) => string) {
+ if (!value) return
+ if (!fallback) return value
+ if (value === fallback) return fallback
+ if (encode && value === encode(fallback)) return fallback
+ return value
+}
+
+function rewrite(request: Request, values: { directory?: string; workspace?: string }) {
+ if (request.method !== "GET" && request.method !== "HEAD") return request
+
+ const url = new URL(request.url)
+ let changed = false
+
+ for (const [name, key] of [
+ ["x-opencode-directory", "directory"],
+ ["x-opencode-workspace", "workspace"],
+ ] as const) {
+ const value = pick(
+ request.headers.get(name),
+ key === "directory" ? values.directory : values.workspace,
+ key === "directory" ? encodeURIComponent : undefined,
+ )
+ if (!value) continue
+ if (!url.searchParams.has(key)) {
+ url.searchParams.set(key, value)
+ }
+ changed = true
+ }
+
+ if (!changed) return request
+
+ const next = new Request(url, request)
+ next.headers.delete("x-opencode-directory")
+ next.headers.delete("x-opencode-workspace")
+ return next
+}
+
export function createOpencodeClient(config?: Config & { directory?: string; experimental_workspaceID?: string }) {
if (!config?.fetch) {
const customFetch: any = (req: any) => {
@@ -19,11 +57,9 @@ export function createOpencodeClient(config?: Config & { directory?: string; exp
}
if (config?.directory) {
- const isNonASCII = /[^\x00-\x7F]/.test(config.directory)
- const encodedDirectory = isNonASCII ? encodeURIComponent(config.directory) : config.directory
config.headers = {
...config.headers,
- "x-opencode-directory": encodedDirectory,
+ "x-opencode-directory": encodeURIComponent(config.directory),
}
}
@@ -35,5 +71,11 @@ export function createOpencodeClient(config?: Config & { directory?: string; exp
}
const client = createClient(config)
+ client.interceptors.request.use((request) =>
+ rewrite(request, {
+ directory: config?.directory,
+ workspace: config?.experimental_workspaceID,
+ }),
+ )
return new OpencodeClient({ client })
}