From e34bbb394d0dcedf044237b126ccd17ac289f7b5 Mon Sep 17 00:00:00 2001 From: Kit Langton Date: Tue, 14 Apr 2026 19:40:05 -0400 Subject: [PATCH] refactor(file): use effectful HttpApi group builder Build the file HttpApi handlers with an effectful group callback so the file service is resolved once at layer construction time and the endpoint handlers close over the resulting methods. --- .../src/server/instance/httpapi/file.ts | 33 ++++++++++--------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/packages/opencode/src/server/instance/httpapi/file.ts b/packages/opencode/src/server/instance/httpapi/file.ts index d637912bb0..6287a5308f 100644 --- a/packages/opencode/src/server/instance/httpapi/file.ts +++ b/packages/opencode/src/server/instance/httpapi/file.ts @@ -58,24 +58,27 @@ const Api = HttpApi.make("file") }), ) -const list = Effect.fn("FileHttpApi.list")(function* (ctx: { query: { path?: string } }) { - const svc = yield* File.Service - return Schema.decodeUnknownSync(Schema.Array(File.Node))(yield* svc.list(ctx.query.path)) -}) +const FileLive = HttpApiBuilder.group( + Api, + "file", + Effect.fn("FileHttpApi.handlers")(function* (handlers) { + const svc = yield* File.Service -const content = Effect.fn("FileHttpApi.content")(function* (ctx: { query: { path: string } }) { - const svc = yield* File.Service - return Schema.decodeUnknownSync(File.Content)(yield* svc.read(ctx.query.path)) -}) + const list = Effect.fn("FileHttpApi.list")(function* (ctx: { query: { path?: string } }) { + return Schema.decodeUnknownSync(Schema.Array(File.Node))(yield* svc.list(ctx.query.path)) + }) -const status = Effect.fn("FileHttpApi.status")(function* () { - const svc = yield* File.Service - return Schema.decodeUnknownSync(Schema.Array(File.Info))(yield* svc.status()) -}) + const content = Effect.fn("FileHttpApi.content")(function* (ctx: { query: { path: string } }) { + return Schema.decodeUnknownSync(File.Content)(yield* svc.read(ctx.query.path)) + }) -const FileLive = HttpApiBuilder.group(Api, "file", (handlers) => - handlers.handle("list", list).handle("content", content).handle("status", status), -) + const status = Effect.fn("FileHttpApi.status")(function* () { + return Schema.decodeUnknownSync(Schema.Array(File.Info))(yield* svc.status()) + }) + + return handlers.handle("list", list).handle("content", content).handle("status", status) + }), +).pipe(Layer.provide(File.defaultLayer)) const web = lazy(() => HttpRouter.toWebHandler(