import * as Context from "effect/Context"; import * as Data from "effect/Data"; import * as Effect from "effect/Effect"; import type { ReplacedResourceState, ResourceState } from "./ResourceState.ts"; export class StateStoreError extends Data.TaggedError("StateStoreError")<{ message: string; cause?: Error; }> {} export class State extends Context.Service()( "AWS::Lambda::State", ) {} /** * State service interface. * * Resources are keyed by FQN (namespace-qualified key) which includes * the full namespace path plus the logical ID. The FQN is used as the * storage key while logicalId remains available in the persisted state * for provider operations. */ export interface StateService { listStacks(): Effect.Effect; listStages(stack: string): Effect.Effect; /** * Get a resource by its FQN (namespace-qualified key). */ get(request: { stack: string; stage: string; fqn: string; }): Effect.Effect; /** * List top-level resources that are still in replacement cleanup. * * Any additional backlog from repeated replacements is stored recursively * in the returned state's `old` chain. */ getReplacedResources(request: { stack: string; stage: string; }): Effect.Effect< ReadonlyArray, StateStoreError, never >; /** * Set a resource by its FQN (namespace-qualified key). */ set(request: { stack: string; stage: string; fqn: string; value: V; }): Effect.Effect; /** * Delete a resource by its FQN (namespace-qualified key). */ delete(request: { stack: string; stage: string; fqn: string; }): Effect.Effect; /** * List all resource FQNs in a stack/stage. */ list(request: { stack: string; stage: string; }): Effect.Effect; }