local.ts 1.4 KB

123456789101112131415161718192021222324252627282930313233
  1. import { Effect, Layer } from "effect"
  2. import { LocationServiceMap } from "../../location-layer"
  3. import { SessionRunCoordinator } from "../run-coordinator"
  4. import { SessionRunner } from "../runner"
  5. import { SessionSchema } from "../schema"
  6. import { SessionStore } from "../store"
  7. import { SessionExecution } from "../execution"
  8. import { logFailure } from "../logging"
  9. /** Current-process routing for implicit-local Locations. Future remote placement belongs here. */
  10. export const layer = Layer.effect(
  11. SessionExecution.Service,
  12. Effect.gen(function* () {
  13. const store = yield* SessionStore.Service
  14. const locations = yield* LocationServiceMap
  15. const coordinator = yield* SessionRunCoordinator.make<SessionSchema.ID, void, SessionRunner.RunError>({
  16. drain: Effect.fnUntraced(function* (sessionID: SessionSchema.ID, mode) {
  17. const session = yield* store.get(sessionID)
  18. if (!session) return yield* Effect.die(`Session not found: ${sessionID}`)
  19. return yield* SessionRunner.Service.use((runner) => runner.run({ sessionID, force: mode === "run" })).pipe(
  20. Effect.provide(locations.get(session.location)),
  21. )
  22. }),
  23. onFailure: (sessionID, cause) => logFailure("Failed to drain Session", sessionID, cause),
  24. })
  25. return SessionExecution.Service.of({
  26. interrupt: coordinator.interrupt,
  27. resume: coordinator.run,
  28. wake: coordinator.wake,
  29. })
  30. }),
  31. )