From 78015571bf95544d68403ce085c03c9829f33ceb Mon Sep 17 00:00:00 2001 From: Shoubhit Dash Date: Thu, 14 May 2026 12:50:36 +0530 Subject: [PATCH] refactor(server): centralize session busy mapping (#27473) --- .../instance/httpapi/handlers/session-errors.ts | 6 ++++++ .../routes/instance/httpapi/handlers/session.ts | 13 ++++--------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/packages/opencode/src/server/routes/instance/httpapi/handlers/session-errors.ts b/packages/opencode/src/server/routes/instance/httpapi/handlers/session-errors.ts index 0fef2e7763..d4ab0eb599 100644 --- a/packages/opencode/src/server/routes/instance/httpapi/handlers/session-errors.ts +++ b/packages/opencode/src/server/routes/instance/httpapi/handlers/session-errors.ts @@ -1,7 +1,13 @@ import type { NotFoundError as StorageNotFoundError } from "@/storage/storage" +import type { Session } from "@/session/session" import { Effect } from "effect" +import { HttpApiError } from "effect/unstable/httpapi" import * as ApiError from "../errors" export function mapStorageNotFound(self: Effect.Effect) { return self.pipe(Effect.mapError((error) => ApiError.notFound(error.message))) } + +export function mapBusy(self: Effect.Effect) { + return self.pipe(Effect.catchTag("SessionBusyError", () => Effect.fail(new HttpApiError.BadRequest({})))) +} diff --git a/packages/opencode/src/server/routes/instance/httpapi/handlers/session.ts b/packages/opencode/src/server/routes/instance/httpapi/handlers/session.ts index e3f79965da..6509aa2b1f 100644 --- a/packages/opencode/src/server/routes/instance/httpapi/handlers/session.ts +++ b/packages/opencode/src/server/routes/instance/httpapi/handlers/session.ts @@ -58,11 +58,6 @@ export const sessionHandlers = HttpApiBuilder.group(InstanceHttpApi, "session", const bus = yield* Bus.Service const scope = yield* Scope.Scope - const mapBusy = ( - effect: Effect.Effect, - ): Effect.Effect => - effect.pipe(Effect.catchTag("SessionBusyError", () => Effect.fail(new HttpApiError.BadRequest({})))) - const list = Effect.fn("SessionHttpApi.list")(function* (ctx: { query: typeof ListQuery.Type }) { return yield* session.list({ directory: ctx.query.scope === "project" ? undefined : ctx.query.directory, @@ -334,7 +329,7 @@ export const sessionHandlers = HttpApiBuilder.group(InstanceHttpApi, "session", payload: typeof ShellPayload.Type }) { yield* requireSession(ctx.params.sessionID) - return yield* mapBusy(promptSvc.shell({ ...ctx.payload, sessionID: ctx.params.sessionID })) + return yield* SessionError.mapBusy(promptSvc.shell({ ...ctx.payload, sessionID: ctx.params.sessionID })) }) const revert = Effect.fn("SessionHttpApi.revert")(function* (ctx: { @@ -342,12 +337,12 @@ export const sessionHandlers = HttpApiBuilder.group(InstanceHttpApi, "session", payload: typeof RevertPayload.Type }) { yield* requireSession(ctx.params.sessionID) - return yield* mapBusy(revertSvc.revert({ sessionID: ctx.params.sessionID, ...ctx.payload })) + return yield* SessionError.mapBusy(revertSvc.revert({ sessionID: ctx.params.sessionID, ...ctx.payload })) }) const unrevert = Effect.fn("SessionHttpApi.unrevert")(function* (ctx: { params: { sessionID: SessionID } }) { yield* requireSession(ctx.params.sessionID) - return yield* mapBusy(revertSvc.unrevert({ sessionID: ctx.params.sessionID })) + return yield* SessionError.mapBusy(revertSvc.unrevert({ sessionID: ctx.params.sessionID })) }) const permissionRespond = Effect.fn("SessionHttpApi.permissionRespond")(function* (ctx: { @@ -363,7 +358,7 @@ export const sessionHandlers = HttpApiBuilder.group(InstanceHttpApi, "session", params: { sessionID: SessionID; messageID: MessageID } }) { yield* requireSession(ctx.params.sessionID) - yield* mapBusy(runState.assertNotBusy(ctx.params.sessionID)) + yield* SessionError.mapBusy(runState.assertNotBusy(ctx.params.sessionID)) yield* session.removeMessage(ctx.params) return true })