fix(server): map busy sessions in http handlers (#27375)
This commit is contained in:
@@ -52,6 +52,14 @@ export const sessionHandlers = HttpApiBuilder.group(InstanceHttpApi, "session",
|
|||||||
const bus = yield* Bus.Service
|
const bus = yield* Bus.Service
|
||||||
const scope = yield* Scope.Scope
|
const scope = yield* Scope.Scope
|
||||||
|
|
||||||
|
const mapBusy = <A, E, R>(effect: Effect.Effect<A, E, R>): Effect.Effect<A, E | HttpApiError.BadRequest, R> =>
|
||||||
|
effect.pipe(
|
||||||
|
Effect.catchCause((cause): Effect.Effect<never, E | HttpApiError.BadRequest> => {
|
||||||
|
if (Cause.squash(cause) instanceof Session.BusyError) return Effect.fail(new HttpApiError.BadRequest({}))
|
||||||
|
return Effect.failCause(cause)
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
|
||||||
const list = Effect.fn("SessionHttpApi.list")(function* (ctx: { query: typeof ListQuery.Type }) {
|
const list = Effect.fn("SessionHttpApi.list")(function* (ctx: { query: typeof ListQuery.Type }) {
|
||||||
return yield* session.list({
|
return yield* session.list({
|
||||||
directory: ctx.query.scope === "project" ? undefined : ctx.query.directory,
|
directory: ctx.query.scope === "project" ? undefined : ctx.query.directory,
|
||||||
@@ -329,7 +337,7 @@ export const sessionHandlers = HttpApiBuilder.group(InstanceHttpApi, "session",
|
|||||||
payload: typeof ShellPayload.Type
|
payload: typeof ShellPayload.Type
|
||||||
}) {
|
}) {
|
||||||
yield* requireSession(ctx.params.sessionID)
|
yield* requireSession(ctx.params.sessionID)
|
||||||
return yield* promptSvc.shell({ ...ctx.payload, sessionID: ctx.params.sessionID })
|
return yield* mapBusy(promptSvc.shell({ ...ctx.payload, sessionID: ctx.params.sessionID }))
|
||||||
})
|
})
|
||||||
|
|
||||||
const revert = Effect.fn("SessionHttpApi.revert")(function* (ctx: {
|
const revert = Effect.fn("SessionHttpApi.revert")(function* (ctx: {
|
||||||
@@ -337,12 +345,12 @@ export const sessionHandlers = HttpApiBuilder.group(InstanceHttpApi, "session",
|
|||||||
payload: typeof RevertPayload.Type
|
payload: typeof RevertPayload.Type
|
||||||
}) {
|
}) {
|
||||||
yield* requireSession(ctx.params.sessionID)
|
yield* requireSession(ctx.params.sessionID)
|
||||||
return yield* revertSvc.revert({ sessionID: ctx.params.sessionID, ...ctx.payload })
|
return yield* mapBusy(revertSvc.revert({ sessionID: ctx.params.sessionID, ...ctx.payload }))
|
||||||
})
|
})
|
||||||
|
|
||||||
const unrevert = Effect.fn("SessionHttpApi.unrevert")(function* (ctx: { params: { sessionID: SessionID } }) {
|
const unrevert = Effect.fn("SessionHttpApi.unrevert")(function* (ctx: { params: { sessionID: SessionID } }) {
|
||||||
yield* requireSession(ctx.params.sessionID)
|
yield* requireSession(ctx.params.sessionID)
|
||||||
return yield* revertSvc.unrevert({ sessionID: ctx.params.sessionID })
|
return yield* mapBusy(revertSvc.unrevert({ sessionID: ctx.params.sessionID }))
|
||||||
})
|
})
|
||||||
|
|
||||||
const permissionRespond = Effect.fn("SessionHttpApi.permissionRespond")(function* (ctx: {
|
const permissionRespond = Effect.fn("SessionHttpApi.permissionRespond")(function* (ctx: {
|
||||||
@@ -358,7 +366,7 @@ export const sessionHandlers = HttpApiBuilder.group(InstanceHttpApi, "session",
|
|||||||
params: { sessionID: SessionID; messageID: MessageID }
|
params: { sessionID: SessionID; messageID: MessageID }
|
||||||
}) {
|
}) {
|
||||||
yield* requireSession(ctx.params.sessionID)
|
yield* requireSession(ctx.params.sessionID)
|
||||||
yield* runState.assertNotBusy(ctx.params.sessionID)
|
yield* mapBusy(runState.assertNotBusy(ctx.params.sessionID))
|
||||||
yield* session.removeMessage(ctx.params)
|
yield* session.removeMessage(ctx.params)
|
||||||
return true
|
return true
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
import { Provider } from "@/provider/provider"
|
import { Provider } from "@/provider/provider"
|
||||||
import { Session } from "@/session/session"
|
|
||||||
import { iife } from "@/util/iife"
|
import { iife } from "@/util/iife"
|
||||||
import { NamedError } from "@opencode-ai/core/util/error"
|
import { NamedError } from "@opencode-ai/core/util/error"
|
||||||
import * as Log from "@opencode-ai/core/util/log"
|
import * as Log from "@opencode-ai/core/util/log"
|
||||||
@@ -33,14 +32,6 @@ export const errorLayer = HttpRouter.middleware<{ handles: unknown }>()((effect)
|
|||||||
}),
|
}),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
if (error instanceof Session.BusyError) {
|
|
||||||
return Effect.succeed(
|
|
||||||
HttpServerResponse.jsonUnsafe(new NamedError.Unknown({ message: error.message }).toObject(), {
|
|
||||||
status: 400,
|
|
||||||
}),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
return Effect.succeed(
|
return Effect.succeed(
|
||||||
HttpServerResponse.jsonUnsafe(
|
HttpServerResponse.jsonUnsafe(
|
||||||
new NamedError.Unknown({
|
new NamedError.Unknown({
|
||||||
|
|||||||
Reference in New Issue
Block a user