client.ts 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. export * from "./gen/types.gen.js"
  2. import { createClient } from "./gen/client/client.gen.js"
  3. import { type Config } from "./gen/client/types.gen.js"
  4. import { OpencodeClient } from "./gen/sdk.gen.js"
  5. export { type Config as OpencodeClientConfig, OpencodeClient }
  6. function pick(value: string | null, fallback?: string) {
  7. if (!value) return
  8. if (!fallback) return value
  9. if (value === fallback) return fallback
  10. if (value === encodeURIComponent(fallback)) return fallback
  11. return value
  12. }
  13. function rewrite(request: Request, directory?: string) {
  14. if (request.method !== "GET" && request.method !== "HEAD") return request
  15. const value = pick(request.headers.get("x-opencode-directory"), directory)
  16. if (!value) return request
  17. const url = new URL(request.url)
  18. if (!url.searchParams.has("directory")) {
  19. url.searchParams.set("directory", value)
  20. }
  21. const next = new Request(url, request)
  22. next.headers.delete("x-opencode-directory")
  23. return next
  24. }
  25. export function createOpencodeClient(config?: Config & { directory?: string }) {
  26. if (!config?.fetch) {
  27. const customFetch: any = (req: any) => {
  28. // @ts-ignore
  29. req.timeout = false
  30. return fetch(req)
  31. }
  32. config = {
  33. ...config,
  34. fetch: customFetch,
  35. }
  36. }
  37. if (config?.directory) {
  38. config.headers = {
  39. ...config.headers,
  40. "x-opencode-directory": encodeURIComponent(config.directory),
  41. }
  42. }
  43. const client = createClient(config)
  44. client.interceptors.request.use((request) => rewrite(request, config?.directory))
  45. return new OpencodeClient({ client })
  46. }