0122f38e09
publish-github-action / publish (push) Has been cancelled
Unify declared instance HTTP API endpoints under typed middleware routing, including event streaming and PTY WebSocket connect handling.\n\nPreserve PTY connect compatibility by checking missing PTYs before parsing optional cursor and ticket query fields, with regression coverage.
44 lines
1.4 KiB
TypeScript
44 lines
1.4 KiB
TypeScript
import { InstanceRef, WorkspaceRef } from "@/effect/instance-ref"
|
|
import { InstanceStore } from "@/project/instance-store"
|
|
import { Effect, Layer } from "effect"
|
|
import { HttpServerResponse } from "effect/unstable/http"
|
|
import { HttpApiMiddleware } from "effect/unstable/httpapi"
|
|
import { WorkspaceRouteContext } from "./workspace-routing"
|
|
|
|
export class InstanceContextMiddleware extends HttpApiMiddleware.Service<
|
|
InstanceContextMiddleware,
|
|
{
|
|
requires: WorkspaceRouteContext
|
|
}
|
|
>()("@opencode/ExperimentalHttpApiInstanceContext") {}
|
|
|
|
function decode(input: string): string {
|
|
try {
|
|
return decodeURIComponent(input)
|
|
} catch {
|
|
return input
|
|
}
|
|
}
|
|
|
|
function provideInstanceContext<E>(
|
|
effect: Effect.Effect<HttpServerResponse.HttpServerResponse, E>,
|
|
store: InstanceStore.Interface,
|
|
): Effect.Effect<HttpServerResponse.HttpServerResponse, E, WorkspaceRouteContext> {
|
|
return Effect.gen(function* () {
|
|
const route = yield* WorkspaceRouteContext
|
|
const ctx = yield* store.load({ directory: decode(route.directory) })
|
|
return yield* effect.pipe(
|
|
Effect.provideService(InstanceRef, ctx),
|
|
Effect.provideService(WorkspaceRef, route.workspaceID),
|
|
)
|
|
})
|
|
}
|
|
|
|
export const instanceContextLayer = Layer.effect(
|
|
InstanceContextMiddleware,
|
|
Effect.gen(function* () {
|
|
const store = yield* InstanceStore.Service
|
|
return InstanceContextMiddleware.of((effect) => provideInstanceContext(effect, store))
|
|
}),
|
|
)
|