{"version":3,"file":"effect-gate.d.ts","sourceRoot":"","sources":["../../../src/harness/execution/effect-gate.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,qBAAa,cAAe,SAAQ,KAAK;IACxC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAErC,YAAY,YAAY,EAAE,OAAO,CAAC,IAAI,CAAC,EAItC;CACD;AAED,4EAA4E;AAC5E,MAAM,WAAW,IAAI;IACpB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;CAC7B;AAED,0DAA0D;AAC1D,MAAM,WAAW,WAAW;IAC3B,UAAU,CAAC,YAAY,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC9C,WAAW,IAAI,IAAI,CAAC;IACpB,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;CAC1B;AAOD,kFAAkF;AAClF,wBAAgB,UAAU,IAAI;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,WAAW,CAAA;CAAE,CAiCjE","sourcesContent":["/** Expected internal control flow when cancellation wins effect admission. */\nexport class AbortRequested extends Error {\n\treadonly cancellation: Promise<void>;\n\n\tconstructor(cancellation: Promise<void>) {\n\t\tsuper(\"Abort requested\");\n\t\tthis.name = \"AbortRequested\";\n\t\tthis.cancellation = cancellation;\n\t}\n}\n\n/** Procedure-facing synchronous admission capability for one drive pass. */\nexport interface Gate {\n\treadonly signal: AbortSignal;\n\tadmit<T>(invoke: () => T): T;\n}\n\n/** Owner-facing lifecycle controls for one drive pass. */\nexport interface GateControl {\n\tbeginAbort(cancellation: Promise<void>): void;\n\tsignalAbort(): void;\n\tclose(error: Error): void;\n}\n\ntype GateState =\n\t| { status: \"open\" }\n\t| { status: \"aborting\"; cancellation: Promise<void> }\n\t| { status: \"closed\"; error: Error };\n\n/** Create separate procedure-facing and owner-facing views of one effect gate. */\nexport function createGate(): { gate: Gate; control: GateControl } {\n\tlet state: GateState = { status: \"open\" };\n\tconst controller = new AbortController();\n\n\tconst check = (): void => {\n\t\tif (state.status === \"aborting\") throw new AbortRequested(state.cancellation);\n\t\tif (state.status === \"closed\") throw state.error;\n\t};\n\n\treturn {\n\t\tgate: {\n\t\t\tadmit<T>(invoke: () => T): T {\n\t\t\t\tcheck();\n\t\t\t\treturn invoke();\n\t\t\t},\n\t\t\tsignal: controller.signal,\n\t\t},\n\t\tcontrol: {\n\t\t\tbeginAbort(cancellation) {\n\t\t\t\tif (state.status !== \"open\") return;\n\t\t\t\tstate = { status: \"aborting\", cancellation };\n\t\t\t},\n\t\t\tsignalAbort() {\n\t\t\t\tif (state.status !== \"aborting\" || controller.signal.aborted) return;\n\t\t\t\tcontroller.abort(new AbortRequested(state.cancellation));\n\t\t\t},\n\t\t\tclose(error) {\n\t\t\t\tif (state.status === \"closed\") return;\n\t\t\t\tstate = { status: \"closed\", error };\n\t\t\t\tif (!controller.signal.aborted) controller.abort(error);\n\t\t\t},\n\t\t},\n\t};\n}\n"]}