effect(server): typed errors in session/sync handlers, fix concurrency (#27146)
This commit is contained in:
@@ -38,7 +38,9 @@ export const instanceHandlers = HttpApiBuilder.group(InstanceHttpApi, "instance"
|
|||||||
})
|
})
|
||||||
|
|
||||||
const getVcs = Effect.fn("InstanceHttpApi.vcs")(function* () {
|
const getVcs = Effect.fn("InstanceHttpApi.vcs")(function* () {
|
||||||
const [branch, default_branch] = yield* Effect.all([vcs.branch(), vcs.defaultBranch()], { concurrency: 2 })
|
const [branch, default_branch] = yield* Effect.all([vcs.branch(), vcs.defaultBranch()], {
|
||||||
|
concurrency: "unbounded",
|
||||||
|
})
|
||||||
return { branch, default_branch }
|
return { branch, default_branch }
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@@ -36,6 +36,12 @@ import {
|
|||||||
} from "../groups/session"
|
} from "../groups/session"
|
||||||
import * as SessionError from "./session-errors"
|
import * as SessionError from "./session-errors"
|
||||||
|
|
||||||
|
const tryParseJson = (text: string) =>
|
||||||
|
Effect.try({
|
||||||
|
try: () => JSON.parse(text) as unknown,
|
||||||
|
catch: () => new HttpApiError.BadRequest({}),
|
||||||
|
})
|
||||||
|
|
||||||
export const sessionHandlers = HttpApiBuilder.group(InstanceHttpApi, "session", (handlers) =>
|
export const sessionHandlers = HttpApiBuilder.group(InstanceHttpApi, "session", (handlers) =>
|
||||||
Effect.gen(function* () {
|
Effect.gen(function* () {
|
||||||
const session = yield* Session.Service
|
const session = yield* Session.Service
|
||||||
@@ -160,10 +166,7 @@ export const sessionHandlers = HttpApiBuilder.group(InstanceHttpApi, "session",
|
|||||||
const body = yield* Effect.orDie(ctx.request.text)
|
const body = yield* Effect.orDie(ctx.request.text)
|
||||||
if (body.trim().length === 0) return yield* create({})
|
if (body.trim().length === 0) return yield* create({})
|
||||||
|
|
||||||
const json = yield* Effect.try({
|
const json = yield* tryParseJson(body)
|
||||||
try: () => JSON.parse(body) as unknown,
|
|
||||||
catch: () => new HttpApiError.BadRequest({}),
|
|
||||||
})
|
|
||||||
const payload = yield* Schema.decodeUnknownEffect(Session.CreateInput)(json).pipe(
|
const payload = yield* Schema.decodeUnknownEffect(Session.CreateInput)(json).pipe(
|
||||||
Effect.mapError(() => new HttpApiError.BadRequest({})),
|
Effect.mapError(() => new HttpApiError.BadRequest({})),
|
||||||
)
|
)
|
||||||
@@ -211,10 +214,7 @@ export const sessionHandlers = HttpApiBuilder.group(InstanceHttpApi, "session",
|
|||||||
const body = yield* Effect.orDie(ctx.request.text)
|
const body = yield* Effect.orDie(ctx.request.text)
|
||||||
if (body.trim().length === 0) return yield* fork({ params: ctx.params })
|
if (body.trim().length === 0) return yield* fork({ params: ctx.params })
|
||||||
|
|
||||||
const json = yield* Effect.try({
|
const json = yield* tryParseJson(body)
|
||||||
try: () => JSON.parse(body) as unknown,
|
|
||||||
catch: () => new HttpApiError.BadRequest({}),
|
|
||||||
})
|
|
||||||
const payload = yield* Schema.decodeUnknownEffect(ForkPayload)(json).pipe(
|
const payload = yield* Schema.decodeUnknownEffect(ForkPayload)(json).pipe(
|
||||||
Effect.mapError(() => new HttpApiError.BadRequest({})),
|
Effect.mapError(() => new HttpApiError.BadRequest({})),
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import { lte } from "drizzle-orm"
|
|||||||
import { not } from "drizzle-orm"
|
import { not } from "drizzle-orm"
|
||||||
import { or } from "drizzle-orm"
|
import { or } from "drizzle-orm"
|
||||||
import { Effect, Scope } from "effect"
|
import { Effect, Scope } from "effect"
|
||||||
import { HttpApiBuilder } from "effect/unstable/httpapi"
|
import { HttpApiBuilder, HttpApiError } from "effect/unstable/httpapi"
|
||||||
import { InstanceHttpApi } from "../api"
|
import { InstanceHttpApi } from "../api"
|
||||||
import { HistoryPayload, ReplayPayload, SessionPayload } from "../groups/sync"
|
import { HistoryPayload, ReplayPayload, SessionPayload } from "../groups/sync"
|
||||||
import * as Log from "@opencode-ai/core/util/log"
|
import * as Log from "@opencode-ai/core/util/log"
|
||||||
@@ -59,7 +59,7 @@ export const syncHandlers = HttpApiBuilder.group(InstanceHttpApi, "sync", (handl
|
|||||||
|
|
||||||
const steal = Effect.fn("SyncHttpApi.steal")(function* (ctx: { payload: typeof SessionPayload.Type }) {
|
const steal = Effect.fn("SyncHttpApi.steal")(function* (ctx: { payload: typeof SessionPayload.Type }) {
|
||||||
const workspaceID = yield* InstanceState.workspaceID
|
const workspaceID = yield* InstanceState.workspaceID
|
||||||
if (!workspaceID) throw new Error("Cannot steal session without workspace context")
|
if (!workspaceID) return yield* new HttpApiError.BadRequest({})
|
||||||
|
|
||||||
yield* sync.run(Session.Event.Updated, {
|
yield* sync.run(Session.Event.Updated, {
|
||||||
sessionID: ctx.payload.sessionID,
|
sessionID: ctx.payload.sessionID,
|
||||||
|
|||||||
Reference in New Issue
Block a user