From eadda11ec9a83f4aab555896e79feebd7eb1f314 Mon Sep 17 00:00:00 2001 From: Kit Langton Date: Fri, 8 May 2026 23:41:20 -0400 Subject: [PATCH] refactor(server): use JSON response for OpenAPI doc route (#26447) --- .../src/server/routes/instance/httpapi/server.ts | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/packages/opencode/src/server/routes/instance/httpapi/server.ts b/packages/opencode/src/server/routes/instance/httpapi/server.ts index 696fcc4c29..1171df3e6a 100644 --- a/packages/opencode/src/server/routes/instance/httpapi/server.ts +++ b/packages/opencode/src/server/routes/instance/httpapi/server.ts @@ -155,13 +155,15 @@ const instanceRoutes = Layer.mergeAll(rawInstanceRoutes, instanceApiRoutes).pipe ]), ) -const openApiDocument = OpenApi.fromApi(PublicApi) -const openApiDocumentJson = JSON.stringify(openApiDocument) +// `OpenApi.fromApi` is non-trivial; defer until /doc is actually hit so +// processes that never serve it (CLI, scripts) don't pay at module load. +// `HttpServerResponse.jsonUnsafe` runs JSON.stringify eagerly, so caching +// the response also caches the serialized body — every /doc request reuses +// the same Uint8Array instead of re-stringifying the spec. +const docResponse = lazy(() => HttpServerResponse.jsonUnsafe(OpenApi.fromApi(PublicApi))) const docRoute = HttpRouter.use((router) => - router.add("GET", "/doc", () => - Effect.succeed(HttpServerResponse.text(openApiDocumentJson, { headers: { "content-type": "application/json" } })), - ), + router.add("GET", "/doc", () => Effect.succeed(docResponse())), ).pipe(Layer.provide(authOnlyRouterLayer)) const uiRoute = HttpRouter.use((router) =>