| 123456789101112131415161718192021222324252627282930313233 |
- import { Effect, Layer } from "effect"
- import { LocationServiceMap } from "../../location-layer"
- import { SessionRunCoordinator } from "../run-coordinator"
- import { SessionRunner } from "../runner"
- import { SessionSchema } from "../schema"
- import { SessionStore } from "../store"
- import { SessionExecution } from "../execution"
- import { logFailure } from "../logging"
- /** Current-process routing for implicit-local Locations. Future remote placement belongs here. */
- export const layer = Layer.effect(
- SessionExecution.Service,
- Effect.gen(function* () {
- const store = yield* SessionStore.Service
- const locations = yield* LocationServiceMap
- const coordinator = yield* SessionRunCoordinator.make<SessionSchema.ID, void, SessionRunner.RunError>({
- drain: Effect.fnUntraced(function* (sessionID: SessionSchema.ID, mode) {
- const session = yield* store.get(sessionID)
- if (!session) return yield* Effect.die(`Session not found: ${sessionID}`)
- return yield* SessionRunner.Service.use((runner) => runner.run({ sessionID, force: mode === "run" })).pipe(
- Effect.provide(locations.get(session.location)),
- )
- }),
- onFailure: (sessionID, cause) => logFailure("Failed to drain Session", sessionID, cause),
- })
- return SessionExecution.Service.of({
- interrupt: coordinator.interrupt,
- resume: coordinator.run,
- wake: coordinator.wake,
- })
- }),
- )
|