Skip to content

Commit 7801557

Browse files
authored
refactor(server): centralize session busy mapping (#27473)
1 parent e76cf96 commit 7801557

2 files changed

Lines changed: 10 additions & 9 deletions

File tree

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
import type { NotFoundError as StorageNotFoundError } from "@/storage/storage"
2+
import type { Session } from "@/session/session"
23
import { Effect } from "effect"
4+
import { HttpApiError } from "effect/unstable/httpapi"
35
import * as ApiError from "../errors"
46

57
export function mapStorageNotFound<A, R>(self: Effect.Effect<A, StorageNotFoundError, R>) {
68
return self.pipe(Effect.mapError((error) => ApiError.notFound(error.message)))
79
}
10+
11+
export function mapBusy<A, R>(self: Effect.Effect<A, Session.BusyError, R>) {
12+
return self.pipe(Effect.catchTag("SessionBusyError", () => Effect.fail(new HttpApiError.BadRequest({}))))
13+
}

packages/opencode/src/server/routes/instance/httpapi/handlers/session.ts

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,6 @@ export const sessionHandlers = HttpApiBuilder.group(InstanceHttpApi, "session",
5858
const bus = yield* Bus.Service
5959
const scope = yield* Scope.Scope
6060

61-
const mapBusy = <A, R>(
62-
effect: Effect.Effect<A, Session.BusyError, R>,
63-
): Effect.Effect<A, HttpApiError.BadRequest, R> =>
64-
effect.pipe(Effect.catchTag("SessionBusyError", () => Effect.fail(new HttpApiError.BadRequest({}))))
65-
6661
const list = Effect.fn("SessionHttpApi.list")(function* (ctx: { query: typeof ListQuery.Type }) {
6762
return yield* session.list({
6863
directory: ctx.query.scope === "project" ? undefined : ctx.query.directory,
@@ -334,20 +329,20 @@ export const sessionHandlers = HttpApiBuilder.group(InstanceHttpApi, "session",
334329
payload: typeof ShellPayload.Type
335330
}) {
336331
yield* requireSession(ctx.params.sessionID)
337-
return yield* mapBusy(promptSvc.shell({ ...ctx.payload, sessionID: ctx.params.sessionID }))
332+
return yield* SessionError.mapBusy(promptSvc.shell({ ...ctx.payload, sessionID: ctx.params.sessionID }))
338333
})
339334

340335
const revert = Effect.fn("SessionHttpApi.revert")(function* (ctx: {
341336
params: { sessionID: SessionID }
342337
payload: typeof RevertPayload.Type
343338
}) {
344339
yield* requireSession(ctx.params.sessionID)
345-
return yield* mapBusy(revertSvc.revert({ sessionID: ctx.params.sessionID, ...ctx.payload }))
340+
return yield* SessionError.mapBusy(revertSvc.revert({ sessionID: ctx.params.sessionID, ...ctx.payload }))
346341
})
347342

348343
const unrevert = Effect.fn("SessionHttpApi.unrevert")(function* (ctx: { params: { sessionID: SessionID } }) {
349344
yield* requireSession(ctx.params.sessionID)
350-
return yield* mapBusy(revertSvc.unrevert({ sessionID: ctx.params.sessionID }))
345+
return yield* SessionError.mapBusy(revertSvc.unrevert({ sessionID: ctx.params.sessionID }))
351346
})
352347

353348
const permissionRespond = Effect.fn("SessionHttpApi.permissionRespond")(function* (ctx: {
@@ -363,7 +358,7 @@ export const sessionHandlers = HttpApiBuilder.group(InstanceHttpApi, "session",
363358
params: { sessionID: SessionID; messageID: MessageID }
364359
}) {
365360
yield* requireSession(ctx.params.sessionID)
366-
yield* mapBusy(runState.assertNotBusy(ctx.params.sessionID))
361+
yield* SessionError.mapBusy(runState.assertNotBusy(ctx.params.sessionID))
367362
yield* session.removeMessage(ctx.params)
368363
return true
369364
})

0 commit comments

Comments
 (0)