client.ts 1.6 KB

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