import * as Context from "effect/Context"; import * as Effect from "effect/Effect"; import * as Option from "effect/Option"; import type { HttpEffect } from "./Http.ts"; import type { Output } from "./Output.ts"; import { GenericService } from "./Util/service.ts"; export interface BaseExecutionContext { Type: string; id: string; env: Record; get(key: string): Effect.Effect; set(id: string, output: Output): Effect.Effect; exports?: Effect.Effect>; serve?( handler: HttpEffect, ): Effect.Effect; } export interface ExecutionContext< Ctx extends BaseExecutionContext = BaseExecutionContext, > extends Context.Service<`ExecutionContext<${Ctx["Type"]}>`, Ctx> {} export const ExecutionContext = GenericService<{ (type: Ctx["Type"]): ExecutionContext; }>()("Alchemy::ExecutionContext"); export const CurrentExecutionContext = Effect.serviceOption( ExecutionContext, ).pipe(Effect.map(Option.getOrUndefined));