footprintjs 10.0.1 → 10.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +2 -1
- package/CLAUDE.md +61 -7
- package/README.md +136 -312
- package/dist/esm/index.d.ts +62 -2
- package/dist/esm/index.js +13 -6
- package/dist/esm/lib/attempt/anySignal.d.ts +19 -0
- package/dist/esm/lib/attempt/anySignal.js +39 -0
- package/dist/esm/lib/attempt/call.d.ts +88 -0
- package/dist/esm/lib/attempt/call.js +129 -0
- package/dist/esm/lib/attempt/category.d.ts +37 -0
- package/dist/esm/lib/attempt/category.js +131 -0
- package/dist/esm/lib/attempt/correlation.d.ts +95 -0
- package/dist/esm/lib/attempt/correlation.js +178 -0
- package/dist/esm/lib/attempt/deadline.d.ts +44 -0
- package/dist/esm/lib/attempt/deadline.js +101 -0
- package/dist/esm/lib/attempt/decision.d.ts +52 -0
- package/dist/esm/lib/attempt/decision.js +134 -0
- package/dist/esm/lib/attempt/effect.d.ts +76 -0
- package/dist/esm/lib/attempt/effect.js +160 -0
- package/dist/esm/lib/attempt/errors.d.ts +41 -0
- package/dist/esm/lib/attempt/errors.js +44 -0
- package/dist/esm/lib/attempt/index.d.ts +18 -0
- package/dist/esm/lib/attempt/index.js +15 -0
- package/dist/esm/lib/attempt/name.d.ts +21 -0
- package/dist/esm/lib/attempt/name.js +43 -0
- package/dist/esm/lib/attempt/observed.d.ts +66 -0
- package/dist/esm/lib/attempt/observed.js +171 -0
- package/dist/esm/lib/attempt/policy.d.ts +45 -0
- package/dist/esm/lib/attempt/policy.js +83 -0
- package/dist/esm/lib/attempt/record.d.ts +11 -0
- package/dist/esm/lib/attempt/record.js +24 -0
- package/dist/esm/lib/attempt/retryLoopContext.d.ts +18 -0
- package/dist/esm/lib/attempt/retryLoopContext.js +24 -0
- package/dist/esm/lib/attempt/retryLoopTypes.d.ts +18 -0
- package/dist/esm/lib/attempt/retryLoopTypes.js +2 -0
- package/dist/esm/lib/attempt/runner.d.ts +157 -0
- package/dist/esm/lib/attempt/runner.js +523 -0
- package/dist/esm/lib/attempt/standalone.d.ts +47 -0
- package/dist/esm/lib/attempt/standalone.js +126 -0
- package/dist/esm/lib/attempt/types.d.ts +453 -0
- package/dist/esm/lib/attempt/types.js +16 -0
- package/dist/esm/lib/budget/index.d.ts +9 -0
- package/dist/esm/lib/budget/index.js +9 -0
- package/dist/esm/lib/budget/timeBudget.d.ts +136 -0
- package/dist/esm/lib/budget/timeBudget.js +666 -0
- package/dist/esm/lib/builder/FlowChartBuilder.d.ts +88 -3
- package/dist/esm/lib/builder/FlowChartBuilder.js +199 -9
- package/dist/esm/lib/builder/retryLoop.d.ts +56 -0
- package/dist/esm/lib/builder/retryLoop.js +283 -0
- package/dist/esm/lib/builder/types.d.ts +35 -1
- package/dist/esm/lib/builder/types.js +1 -1
- package/dist/esm/lib/decide/decide.js +2 -2
- package/dist/esm/lib/decide/index.d.ts +1 -1
- package/dist/esm/lib/decide/index.js +2 -2
- package/dist/esm/lib/decide/types.d.ts +3 -0
- package/dist/esm/lib/decide/types.js +1 -8
- package/dist/esm/lib/engine/graph/StageNode.d.ts +11 -1
- package/dist/esm/lib/engine/graph/StageNode.js +1 -1
- package/dist/esm/lib/engine/graph/prefixNodeTree.js +5 -1
- package/dist/esm/lib/engine/handlers/ChildrenExecutor.js +36 -6
- package/dist/esm/lib/engine/handlers/DeciderHandler.js +9 -5
- package/dist/esm/lib/engine/handlers/ResumeEntry.js +3 -1
- package/dist/esm/lib/engine/handlers/SelectorHandler.js +6 -5
- package/dist/esm/lib/engine/handlers/StageRunner.d.ts +8 -1
- package/dist/esm/lib/engine/handlers/StageRunner.js +36 -9
- package/dist/esm/lib/engine/handlers/SubflowExecutor.js +24 -5
- package/dist/esm/lib/engine/handlers/commitStage.d.ts +7 -0
- package/dist/esm/lib/engine/handlers/commitStage.js +22 -4
- package/dist/esm/lib/engine/handlers/stageError.d.ts +9 -0
- package/dist/esm/lib/engine/handlers/stageError.js +23 -1
- package/dist/esm/lib/engine/index.d.ts +2 -2
- package/dist/esm/lib/engine/index.js +1 -1
- package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +27 -13
- package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.js +68 -40
- package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.d.ts +4 -1
- package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.js +19 -2
- package/dist/esm/lib/engine/narrative/NarrativeFlowRecorder.d.ts +22 -3
- package/dist/esm/lib/engine/narrative/NarrativeFlowRecorder.js +61 -9
- package/dist/esm/lib/engine/narrative/NullControlFlowNarrativeGenerator.d.ts +1 -0
- package/dist/esm/lib/engine/narrative/NullControlFlowNarrativeGenerator.js +2 -1
- package/dist/esm/lib/engine/narrative/formatting/sentences.d.ts +23 -0
- package/dist/esm/lib/engine/narrative/formatting/sentences.js +127 -1
- package/dist/esm/lib/engine/narrative/index.d.ts +2 -2
- package/dist/esm/lib/engine/narrative/index.js +1 -1
- package/dist/esm/lib/engine/narrative/narrativeTypes.d.ts +27 -21
- package/dist/esm/lib/engine/narrative/narrativeTypes.js +1 -1
- package/dist/esm/lib/engine/narrative/recorders/ManifestFlowRecorder.d.ts +45 -2
- package/dist/esm/lib/engine/narrative/recorders/ManifestFlowRecorder.js +55 -2
- package/dist/esm/lib/engine/narrative/recorders/index.d.ts +1 -1
- package/dist/esm/lib/engine/narrative/recorders/index.js +1 -1
- package/dist/esm/lib/engine/narrative/types.d.ts +74 -5
- package/dist/esm/lib/engine/narrative/types.js +1 -1
- package/dist/esm/lib/engine/traversal/FlowchartTraverser.d.ts +59 -19
- package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +194 -118
- package/dist/esm/lib/engine/traversalContext.d.ts +7 -2
- package/dist/esm/lib/engine/traversalContext.js +6 -3
- package/dist/esm/lib/engine/types.d.ts +52 -57
- package/dist/esm/lib/engine/types.js +1 -1
- package/dist/esm/lib/errors/terminalFailure.d.ts +29 -0
- package/dist/esm/lib/errors/terminalFailure.js +60 -0
- package/dist/esm/lib/{decide → filter}/evaluator.d.ts +7 -2
- package/dist/esm/lib/filter/evaluator.js +135 -0
- package/dist/esm/lib/ids/idempotencyKey.d.ts +14 -0
- package/dist/esm/lib/ids/idempotencyKey.js +24 -0
- package/dist/esm/lib/memory/StageContext.d.ts +123 -3
- package/dist/esm/lib/memory/StageContext.js +245 -4
- package/dist/esm/lib/memory/attention.d.ts +26 -0
- package/dist/esm/lib/memory/attention.js +171 -0
- package/dist/esm/lib/memory/borrowedMutation.d.ts +8 -0
- package/dist/esm/lib/memory/borrowedMutation.js +14 -1
- package/dist/esm/lib/memory/frameTypes.d.ts +38 -0
- package/dist/esm/lib/memory/frameTypes.js +3 -1
- package/dist/esm/lib/memory/redaction.d.ts +12 -0
- package/dist/esm/lib/memory/redaction.js +54 -5
- package/dist/esm/lib/pause/record.js +10 -1
- package/dist/esm/lib/pause/types.d.ts +19 -0
- package/dist/esm/lib/pause/types.js +17 -1
- package/dist/esm/lib/reactive/createTypedScope.js +3 -1
- package/dist/esm/lib/reactive/types.d.ts +36 -4
- package/dist/esm/lib/reactive/types.js +3 -1
- package/dist/esm/lib/recorder/AttemptRecorder.d.ts +141 -0
- package/dist/esm/lib/recorder/AttemptRecorder.js +412 -0
- package/dist/esm/lib/recorder/ControlDepRecorder.d.ts +36 -2
- package/dist/esm/lib/recorder/ControlDepRecorder.js +50 -2
- package/dist/esm/lib/recorder/EmitRecorder.d.ts +3 -0
- package/dist/esm/lib/recorder/EmitRecorder.js +1 -1
- package/dist/esm/lib/recorder/InOutRecorder.d.ts +37 -1
- package/dist/esm/lib/recorder/InOutRecorder.js +75 -6
- package/dist/esm/lib/recorder/QualityRecorder.d.ts +32 -5
- package/dist/esm/lib/recorder/QualityRecorder.js +87 -29
- package/dist/esm/lib/recorder/TopologyRecorder.d.ts +35 -5
- package/dist/esm/lib/recorder/TopologyRecorder.js +76 -2
- package/dist/esm/lib/recorder/attemptMetricRows.d.ts +11 -0
- package/dist/esm/lib/recorder/attemptMetricRows.js +202 -0
- package/dist/esm/lib/recorder/attemptMetrics.d.ts +7 -0
- package/dist/esm/lib/recorder/attemptMetrics.js +165 -0
- package/dist/esm/lib/recorder/attemptMetricsTypes.d.ts +114 -0
- package/dist/esm/lib/recorder/attemptMetricsTypes.js +2 -0
- package/dist/esm/lib/recorder/attemptOTel.d.ts +78 -0
- package/dist/esm/lib/recorder/attemptOTel.js +107 -0
- package/dist/esm/lib/recorder/attemptSeries.d.ts +81 -0
- package/dist/esm/lib/recorder/attemptSeries.js +103 -0
- package/dist/esm/lib/recorder/hooks.d.ts +9 -0
- package/dist/esm/lib/recorder/hooks.js +4 -1
- package/dist/esm/lib/runner/DeferredObserverTier.js +13 -1
- package/dist/esm/lib/runner/ExecutionRuntime.d.ts +54 -6
- package/dist/esm/lib/runner/ExecutionRuntime.js +57 -5
- package/dist/esm/lib/runner/FlowChartExecutor.d.ts +46 -2
- package/dist/esm/lib/runner/FlowChartExecutor.js +330 -101
- package/dist/esm/lib/runner/RunnableChart.d.ts +6 -0
- package/dist/esm/lib/runner/RunnableChart.js +5 -1
- package/dist/esm/lib/runner/attach.d.ts +2 -1
- package/dist/esm/lib/runner/attach.js +8 -2
- package/dist/esm/lib/runner/checkpoint.js +3 -1
- package/dist/esm/lib/runner/deadline.d.ts +42 -0
- package/dist/esm/lib/runner/deadline.js +90 -0
- package/dist/esm/lib/runner/index.d.ts +3 -1
- package/dist/esm/lib/runner/index.js +2 -1
- package/dist/esm/lib/runner/options.d.ts +17 -0
- package/dist/esm/lib/runner/options.js +3 -1
- package/dist/esm/lib/runner/recordSink.d.ts +128 -0
- package/dist/esm/lib/runner/recordSink.js +296 -0
- package/dist/esm/lib/runner/resume.d.ts +3 -0
- package/dist/esm/lib/runner/resume.js +22 -2
- package/dist/esm/lib/runner/snapshot.d.ts +2 -2
- package/dist/esm/lib/runner/snapshot.js +6 -2
- package/dist/esm/lib/scope/ScopeFacade.d.ts +118 -4
- package/dist/esm/lib/scope/ScopeFacade.js +304 -7
- package/dist/esm/lib/scope/recorders/DebugRecorder.d.ts +17 -3
- package/dist/esm/lib/scope/recorders/DebugRecorder.js +79 -13
- package/dist/esm/lib/scope/recorders/MetricRecorder.d.ts +10 -0
- package/dist/esm/lib/scope/recorders/MetricRecorder.js +15 -2
- package/dist/esm/lib/scope/runtime.d.ts +3 -0
- package/dist/esm/lib/scope/runtime.js +1 -1
- package/dist/esm/lib/scope/types.d.ts +6 -0
- package/dist/esm/lib/scope/types.js +1 -1
- package/dist/esm/lib/sinks/fileSink.d.ts +135 -0
- package/dist/esm/lib/sinks/fileSink.js +387 -0
- package/dist/esm/recorders.d.ts +8 -2
- package/dist/esm/recorders.js +7 -1
- package/dist/esm/sinks.d.ts +23 -0
- package/dist/esm/sinks.js +23 -0
- package/dist/esm/trace.d.ts +2 -2
- package/dist/esm/trace.js +1 -1
- package/dist/index.js +77 -60
- package/dist/lib/attempt/anySignal.js +43 -0
- package/dist/lib/attempt/call.js +134 -0
- package/dist/lib/attempt/category.js +136 -0
- package/dist/lib/attempt/correlation.js +186 -0
- package/dist/lib/attempt/deadline.js +112 -0
- package/dist/lib/attempt/decision.js +139 -0
- package/dist/lib/attempt/effect.js +174 -0
- package/dist/lib/attempt/errors.js +49 -0
- package/dist/lib/attempt/index.js +26 -0
- package/dist/lib/attempt/name.js +48 -0
- package/dist/lib/attempt/observed.js +177 -0
- package/dist/lib/attempt/policy.js +92 -0
- package/dist/lib/attempt/record.js +29 -0
- package/dist/lib/attempt/retryLoopContext.js +31 -0
- package/dist/lib/attempt/retryLoopTypes.js +3 -0
- package/dist/lib/attempt/runner.js +530 -0
- package/dist/lib/attempt/standalone.js +130 -0
- package/dist/lib/attempt/types.js +17 -0
- package/dist/lib/budget/index.js +17 -0
- package/dist/lib/budget/timeBudget.js +674 -0
- package/dist/lib/builder/FlowChartBuilder.js +199 -9
- package/dist/lib/builder/retryLoop.js +287 -0
- package/dist/lib/builder/types.js +1 -1
- package/dist/lib/decide/decide.js +2 -2
- package/dist/lib/decide/index.js +2 -2
- package/dist/lib/decide/types.js +1 -8
- package/dist/lib/engine/graph/StageNode.js +1 -1
- package/dist/lib/engine/graph/prefixNodeTree.js +5 -1
- package/dist/lib/engine/handlers/ChildrenExecutor.js +36 -6
- package/dist/lib/engine/handlers/DeciderHandler.js +7 -3
- package/dist/lib/engine/handlers/ResumeEntry.js +3 -1
- package/dist/lib/engine/handlers/SelectorHandler.js +4 -3
- package/dist/lib/engine/handlers/StageRunner.js +36 -9
- package/dist/lib/engine/handlers/SubflowExecutor.js +24 -5
- package/dist/lib/engine/handlers/commitStage.js +24 -5
- package/dist/lib/engine/handlers/stageError.js +26 -2
- package/dist/lib/engine/index.js +1 -1
- package/dist/lib/engine/narrative/CombinedNarrativeRecorder.js +67 -39
- package/dist/lib/engine/narrative/FlowRecorderDispatcher.js +19 -2
- package/dist/lib/engine/narrative/NarrativeFlowRecorder.js +60 -8
- package/dist/lib/engine/narrative/NullControlFlowNarrativeGenerator.js +2 -1
- package/dist/lib/engine/narrative/formatting/sentences.js +131 -2
- package/dist/lib/engine/narrative/index.js +1 -1
- package/dist/lib/engine/narrative/narrativeTypes.js +1 -1
- package/dist/lib/engine/narrative/recorders/ManifestFlowRecorder.js +55 -2
- package/dist/lib/engine/narrative/recorders/index.js +1 -1
- package/dist/lib/engine/narrative/types.js +1 -1
- package/dist/lib/engine/traversal/FlowchartTraverser.js +192 -116
- package/dist/lib/engine/traversalContext.js +6 -3
- package/dist/lib/engine/types.js +1 -1
- package/dist/lib/errors/terminalFailure.js +64 -0
- package/dist/lib/filter/evaluator.js +139 -0
- package/dist/lib/ids/idempotencyKey.js +28 -0
- package/dist/lib/memory/StageContext.js +246 -5
- package/dist/lib/memory/attention.js +175 -0
- package/dist/lib/memory/borrowedMutation.js +16 -2
- package/dist/lib/memory/frameTypes.js +3 -1
- package/dist/lib/memory/redaction.js +54 -5
- package/dist/lib/pause/record.js +10 -1
- package/dist/lib/pause/types.js +17 -1
- package/dist/lib/reactive/createTypedScope.js +3 -1
- package/dist/lib/reactive/types.js +3 -1
- package/dist/lib/recorder/AttemptRecorder.js +417 -0
- package/dist/lib/recorder/ControlDepRecorder.js +50 -2
- package/dist/lib/recorder/EmitRecorder.js +1 -1
- package/dist/lib/recorder/InOutRecorder.js +75 -6
- package/dist/lib/recorder/QualityRecorder.js +87 -29
- package/dist/lib/recorder/TopologyRecorder.js +76 -2
- package/dist/lib/recorder/attemptMetricRows.js +209 -0
- package/dist/lib/recorder/attemptMetrics.js +174 -0
- package/dist/lib/recorder/attemptMetricsTypes.js +3 -0
- package/dist/lib/recorder/attemptOTel.js +111 -0
- package/dist/lib/recorder/attemptSeries.js +113 -0
- package/dist/lib/recorder/hooks.js +4 -1
- package/dist/lib/runner/DeferredObserverTier.js +13 -1
- package/dist/lib/runner/ExecutionRuntime.js +57 -5
- package/dist/lib/runner/FlowChartExecutor.js +330 -101
- package/dist/lib/runner/RunnableChart.js +5 -1
- package/dist/lib/runner/attach.js +8 -2
- package/dist/lib/runner/checkpoint.js +3 -1
- package/dist/lib/runner/deadline.js +94 -0
- package/dist/lib/runner/index.js +4 -2
- package/dist/lib/runner/options.js +3 -1
- package/dist/lib/runner/recordSink.js +302 -0
- package/dist/lib/runner/resume.js +22 -2
- package/dist/lib/runner/snapshot.js +6 -2
- package/dist/lib/scope/ScopeFacade.js +303 -6
- package/dist/lib/scope/recorders/DebugRecorder.js +79 -13
- package/dist/lib/scope/recorders/MetricRecorder.js +15 -2
- package/dist/lib/scope/runtime.js +1 -1
- package/dist/lib/scope/types.js +1 -1
- package/dist/lib/sinks/fileSink.js +392 -0
- package/dist/recorders.js +10 -2
- package/dist/sinks.js +32 -0
- package/dist/trace.js +1 -1
- package/dist/types/index.d.ts +62 -2
- package/dist/types/lib/attempt/anySignal.d.ts +19 -0
- package/dist/types/lib/attempt/call.d.ts +88 -0
- package/dist/types/lib/attempt/category.d.ts +37 -0
- package/dist/types/lib/attempt/correlation.d.ts +95 -0
- package/dist/types/lib/attempt/deadline.d.ts +44 -0
- package/dist/types/lib/attempt/decision.d.ts +52 -0
- package/dist/types/lib/attempt/effect.d.ts +76 -0
- package/dist/types/lib/attempt/errors.d.ts +41 -0
- package/dist/types/lib/attempt/index.d.ts +18 -0
- package/dist/types/lib/attempt/name.d.ts +21 -0
- package/dist/types/lib/attempt/observed.d.ts +66 -0
- package/dist/types/lib/attempt/policy.d.ts +45 -0
- package/dist/types/lib/attempt/record.d.ts +11 -0
- package/dist/types/lib/attempt/retryLoopContext.d.ts +18 -0
- package/dist/types/lib/attempt/retryLoopTypes.d.ts +18 -0
- package/dist/types/lib/attempt/runner.d.ts +157 -0
- package/dist/types/lib/attempt/standalone.d.ts +47 -0
- package/dist/types/lib/attempt/types.d.ts +453 -0
- package/dist/types/lib/budget/index.d.ts +9 -0
- package/dist/types/lib/budget/timeBudget.d.ts +136 -0
- package/dist/types/lib/builder/FlowChartBuilder.d.ts +88 -3
- package/dist/types/lib/builder/retryLoop.d.ts +56 -0
- package/dist/types/lib/builder/types.d.ts +35 -1
- package/dist/types/lib/decide/index.d.ts +1 -1
- package/dist/types/lib/decide/types.d.ts +3 -0
- package/dist/types/lib/engine/graph/StageNode.d.ts +11 -1
- package/dist/types/lib/engine/handlers/StageRunner.d.ts +8 -1
- package/dist/types/lib/engine/handlers/commitStage.d.ts +7 -0
- package/dist/types/lib/engine/handlers/stageError.d.ts +9 -0
- package/dist/types/lib/engine/index.d.ts +2 -2
- package/dist/types/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +27 -13
- package/dist/types/lib/engine/narrative/FlowRecorderDispatcher.d.ts +4 -1
- package/dist/types/lib/engine/narrative/NarrativeFlowRecorder.d.ts +22 -3
- package/dist/types/lib/engine/narrative/NullControlFlowNarrativeGenerator.d.ts +1 -0
- package/dist/types/lib/engine/narrative/formatting/sentences.d.ts +23 -0
- package/dist/types/lib/engine/narrative/index.d.ts +2 -2
- package/dist/types/lib/engine/narrative/narrativeTypes.d.ts +27 -21
- package/dist/types/lib/engine/narrative/recorders/ManifestFlowRecorder.d.ts +45 -2
- package/dist/types/lib/engine/narrative/recorders/index.d.ts +1 -1
- package/dist/types/lib/engine/narrative/types.d.ts +74 -5
- package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +59 -19
- package/dist/types/lib/engine/traversalContext.d.ts +7 -2
- package/dist/types/lib/engine/types.d.ts +52 -57
- package/dist/types/lib/errors/terminalFailure.d.ts +29 -0
- package/dist/types/lib/{decide → filter}/evaluator.d.ts +7 -2
- package/dist/types/lib/ids/idempotencyKey.d.ts +14 -0
- package/dist/types/lib/memory/StageContext.d.ts +123 -3
- package/dist/types/lib/memory/attention.d.ts +26 -0
- package/dist/types/lib/memory/borrowedMutation.d.ts +8 -0
- package/dist/types/lib/memory/frameTypes.d.ts +38 -0
- package/dist/types/lib/memory/redaction.d.ts +12 -0
- package/dist/types/lib/pause/types.d.ts +19 -0
- package/dist/types/lib/reactive/types.d.ts +36 -4
- package/dist/types/lib/recorder/AttemptRecorder.d.ts +141 -0
- package/dist/types/lib/recorder/ControlDepRecorder.d.ts +36 -2
- package/dist/types/lib/recorder/EmitRecorder.d.ts +3 -0
- package/dist/types/lib/recorder/InOutRecorder.d.ts +37 -1
- package/dist/types/lib/recorder/QualityRecorder.d.ts +32 -5
- package/dist/types/lib/recorder/TopologyRecorder.d.ts +35 -5
- package/dist/types/lib/recorder/attemptMetricRows.d.ts +11 -0
- package/dist/types/lib/recorder/attemptMetrics.d.ts +7 -0
- package/dist/types/lib/recorder/attemptMetricsTypes.d.ts +114 -0
- package/dist/types/lib/recorder/attemptOTel.d.ts +78 -0
- package/dist/types/lib/recorder/attemptSeries.d.ts +81 -0
- package/dist/types/lib/recorder/hooks.d.ts +9 -0
- package/dist/types/lib/runner/ExecutionRuntime.d.ts +54 -6
- package/dist/types/lib/runner/FlowChartExecutor.d.ts +46 -2
- package/dist/types/lib/runner/RunnableChart.d.ts +6 -0
- package/dist/types/lib/runner/attach.d.ts +2 -1
- package/dist/types/lib/runner/deadline.d.ts +42 -0
- package/dist/types/lib/runner/index.d.ts +3 -1
- package/dist/types/lib/runner/options.d.ts +17 -0
- package/dist/types/lib/runner/recordSink.d.ts +128 -0
- package/dist/types/lib/runner/resume.d.ts +3 -0
- package/dist/types/lib/runner/snapshot.d.ts +2 -2
- package/dist/types/lib/scope/ScopeFacade.d.ts +118 -4
- package/dist/types/lib/scope/recorders/DebugRecorder.d.ts +17 -3
- package/dist/types/lib/scope/recorders/MetricRecorder.d.ts +10 -0
- package/dist/types/lib/scope/runtime.d.ts +3 -0
- package/dist/types/lib/scope/types.d.ts +6 -0
- package/dist/types/lib/sinks/fileSink.d.ts +135 -0
- package/dist/types/recorders.d.ts +8 -2
- package/dist/types/sinks.d.ts +23 -0
- package/dist/types/trace.d.ts +2 -2
- package/package.json +20 -6
- package/dist/esm/lib/decide/evaluator.js +0 -130
- package/dist/lib/decide/evaluator.js +0 -134
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* attempt/deadline.ts — what the run's deadline IS, to everything that reads time (design §3.1, law 3).
|
|
4
|
+
*
|
|
5
|
+
* The deadline is one number, epoch milliseconds (`env.deadline`); the executor arms the run's signal to abort when
|
|
6
|
+
* it passes (`runner/deadline.ts · armRun`). Reaching it is NOT a cancellation: an attempt the deadline cuts short
|
|
7
|
+
* timed out (it had no answer in the time it had — law 4), and the series stops `no-time-left`, not `aborted`. So
|
|
8
|
+
* the reason the run's signal aborts with at the deadline is BRANDED here, and the attempt runner tells the two
|
|
9
|
+
* apart by the brand — never by the message, never by the clock.
|
|
10
|
+
*
|
|
11
|
+
* The brand is a module-private WeakSet: an ordinary `Error` (same message, same name a run with `timeoutMs` always
|
|
12
|
+
* rejected with), recognisable only by identity.
|
|
13
|
+
*/
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.armDeadline = exports.isAbortSignal = exports.setLongTimeout = exports.readDeadline = exports.isCancelled = exports.isDeadlineReason = exports.markTimeLimit = exports.deadlineReason = void 0;
|
|
16
|
+
const anySignal_js_1 = require("./anySignal.js");
|
|
17
|
+
const DEADLINE_REASONS = new WeakSet();
|
|
18
|
+
/** The reason the run's signal aborts with when its deadline passes — an `Error`, branded as the deadline's. */
|
|
19
|
+
function deadlineReason(message) {
|
|
20
|
+
const reason = new Error(message);
|
|
21
|
+
DEADLINE_REASONS.add(reason);
|
|
22
|
+
return reason;
|
|
23
|
+
}
|
|
24
|
+
exports.deadlineReason = deadlineReason;
|
|
25
|
+
/**
|
|
26
|
+
* Brand `reason` as a time limit — what an attempt's own cap aborts with (P2). An attempt's cap is the deadline of
|
|
27
|
+
* every call made inside it (`attempt/call.ts`), so a call it cuts ran out of time: `'timeout'`, never `'aborted'`.
|
|
28
|
+
* The run's own signal never aborts with it, so a stage attempt reads nothing new.
|
|
29
|
+
*/
|
|
30
|
+
function markTimeLimit(reason) {
|
|
31
|
+
DEADLINE_REASONS.add(reason);
|
|
32
|
+
return reason;
|
|
33
|
+
}
|
|
34
|
+
exports.markTimeLimit = markTimeLimit;
|
|
35
|
+
/** Whether `reason` is the run's deadline or an attempt's cap — a time limit, not a cancellation. */
|
|
36
|
+
function isDeadlineReason(reason) {
|
|
37
|
+
return typeof reason === 'object' && reason !== null && DEADLINE_REASONS.has(reason);
|
|
38
|
+
}
|
|
39
|
+
exports.isDeadlineReason = isDeadlineReason;
|
|
40
|
+
/** Whether the signal aborted for a reason OTHER than a time limit — a cancellation. */
|
|
41
|
+
function isCancelled(signal) {
|
|
42
|
+
return signal?.aborted === true && !isDeadlineReason(signal.reason);
|
|
43
|
+
}
|
|
44
|
+
exports.isCancelled = isCancelled;
|
|
45
|
+
/** A deadline as the engine reads one: a finite number (epoch ms), else none. */
|
|
46
|
+
function readDeadline(value) {
|
|
47
|
+
return typeof value === 'number' && Number.isFinite(value) ? value : undefined;
|
|
48
|
+
}
|
|
49
|
+
exports.readDeadline = readDeadline;
|
|
50
|
+
/** The longest delay a host timer honours (2^31 − 1 ms, ~24.8 days); a longer one fires at once. */
|
|
51
|
+
const MAX_TIMER_MS = 2_147_483_647;
|
|
52
|
+
/**
|
|
53
|
+
* `setTimeout` for any delay: a delay past the host's limit is waited in chunks, so a 30-day deadline does not fire
|
|
54
|
+
* in a millisecond. Returns the one call that cancels it.
|
|
55
|
+
*/
|
|
56
|
+
function setLongTimeout(fn, ms) {
|
|
57
|
+
let timer;
|
|
58
|
+
let cancelled = false;
|
|
59
|
+
const arm = (left) => {
|
|
60
|
+
timer = setTimeout(() => {
|
|
61
|
+
if (cancelled)
|
|
62
|
+
return;
|
|
63
|
+
if (left > MAX_TIMER_MS)
|
|
64
|
+
arm(left - MAX_TIMER_MS);
|
|
65
|
+
else
|
|
66
|
+
fn();
|
|
67
|
+
}, Math.min(left, MAX_TIMER_MS));
|
|
68
|
+
};
|
|
69
|
+
arm(Math.max(0, ms));
|
|
70
|
+
return () => {
|
|
71
|
+
cancelled = true;
|
|
72
|
+
if (timer !== undefined)
|
|
73
|
+
clearTimeout(timer);
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
exports.setLongTimeout = setLongTimeout;
|
|
77
|
+
/** Whether `value` is an AbortSignal (structurally — a signal from another realm counts). */
|
|
78
|
+
function isAbortSignal(value) {
|
|
79
|
+
return (typeof value === 'object' &&
|
|
80
|
+
value !== null &&
|
|
81
|
+
typeof value.aborted === 'boolean' &&
|
|
82
|
+
typeof value.addEventListener === 'function' &&
|
|
83
|
+
typeof value.removeEventListener === 'function');
|
|
84
|
+
}
|
|
85
|
+
exports.isAbortSignal = isAbortSignal;
|
|
86
|
+
/**
|
|
87
|
+
* Compose `signal` with a timer that aborts at `deadline` (epoch ms) with a branded {@link deadlineReason} — so the
|
|
88
|
+
* attempt runner's reading holds: the signal it is handed aborts at the deadline, as the run's does (`armRun`). A
|
|
89
|
+
* deadline already past aborts at once; without a deadline the signal is handed back as it is.
|
|
90
|
+
*/
|
|
91
|
+
function armDeadline(signal, deadline, message, now = Date.now) {
|
|
92
|
+
if (deadline === undefined)
|
|
93
|
+
return { signal, dispose: () => undefined };
|
|
94
|
+
const timer = new AbortController();
|
|
95
|
+
const composed = (0, anySignal_js_1.anySignal)([signal, timer.signal]);
|
|
96
|
+
const reason = deadlineReason(message);
|
|
97
|
+
const left = deadline - now();
|
|
98
|
+
let cancel = () => undefined;
|
|
99
|
+
if (left <= 0)
|
|
100
|
+
timer.abort(reason);
|
|
101
|
+
else
|
|
102
|
+
cancel = setLongTimeout(() => timer.abort(reason), left);
|
|
103
|
+
return {
|
|
104
|
+
signal: composed.signal,
|
|
105
|
+
dispose: () => {
|
|
106
|
+
cancel();
|
|
107
|
+
composed.dispose();
|
|
108
|
+
},
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
exports.armDeadline = armDeadline;
|
|
112
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVhZGxpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2F0dGVtcHQvZGVhZGxpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7OztHQVdHOzs7QUFFSCxpREFBMkM7QUFFM0MsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLE9BQU8sRUFBVSxDQUFDO0FBRS9DLGdIQUFnSDtBQUNoSCxTQUFnQixjQUFjLENBQUMsT0FBZTtJQUM1QyxNQUFNLE1BQU0sR0FBRyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNsQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDN0IsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUpELHdDQUlDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQWdCLGFBQWEsQ0FBbUIsTUFBUztJQUN2RCxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDN0IsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUhELHNDQUdDO0FBRUQscUdBQXFHO0FBQ3JHLFNBQWdCLGdCQUFnQixDQUFDLE1BQWU7SUFDOUMsT0FBTyxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksTUFBTSxLQUFLLElBQUksSUFBSSxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDdkYsQ0FBQztBQUZELDRDQUVDO0FBRUQsd0ZBQXdGO0FBQ3hGLFNBQWdCLFdBQVcsQ0FBQyxNQUErQjtJQUN6RCxPQUFPLE1BQU0sRUFBRSxPQUFPLEtBQUssSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3RFLENBQUM7QUFGRCxrQ0FFQztBQUVELGlGQUFpRjtBQUNqRixTQUFnQixZQUFZLENBQUMsS0FBYztJQUN6QyxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUNqRixDQUFDO0FBRkQsb0NBRUM7QUFFRCxvR0FBb0c7QUFDcEcsTUFBTSxZQUFZLEdBQUcsYUFBYSxDQUFDO0FBRW5DOzs7R0FHRztBQUNILFNBQWdCLGNBQWMsQ0FBQyxFQUFjLEVBQUUsRUFBVTtJQUN2RCxJQUFJLEtBQWdELENBQUM7SUFDckQsSUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ3RCLE1BQU0sR0FBRyxHQUFHLENBQUMsSUFBWSxFQUFFLEVBQUU7UUFDM0IsS0FBSyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDdEIsSUFBSSxTQUFTO2dCQUFFLE9BQU87WUFDdEIsSUFBSSxJQUFJLEdBQUcsWUFBWTtnQkFBRSxHQUFHLENBQUMsSUFBSSxHQUFHLFlBQVksQ0FBQyxDQUFDOztnQkFDN0MsRUFBRSxFQUFFLENBQUM7UUFDWixDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQztJQUNuQyxDQUFDLENBQUM7SUFDRixHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNyQixPQUFPLEdBQUcsRUFBRTtRQUNWLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxLQUFLLEtBQUssU0FBUztZQUFFLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQyxDQUFDLENBQUM7QUFDSixDQUFDO0FBZkQsd0NBZUM7QUFFRCw2RkFBNkY7QUFDN0YsU0FBZ0IsYUFBYSxDQUFDLEtBQWM7SUFDMUMsT0FBTyxDQUNMLE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFDekIsS0FBSyxLQUFLLElBQUk7UUFDZCxPQUFRLEtBQXFCLENBQUMsT0FBTyxLQUFLLFNBQVM7UUFDbkQsT0FBUSxLQUFxQixDQUFDLGdCQUFnQixLQUFLLFVBQVU7UUFDN0QsT0FBUSxLQUFxQixDQUFDLG1CQUFtQixLQUFLLFVBQVUsQ0FDakUsQ0FBQztBQUNKLENBQUM7QUFSRCxzQ0FRQztBQVFEOzs7O0dBSUc7QUFDSCxTQUFnQixXQUFXLENBQ3pCLE1BQStCLEVBQy9CLFFBQTRCLEVBQzVCLE9BQWUsRUFDZixNQUFvQixJQUFJLENBQUMsR0FBRztJQUU1QixJQUFJLFFBQVEsS0FBSyxTQUFTO1FBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDeEUsTUFBTSxLQUFLLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztJQUNwQyxNQUFNLFFBQVEsR0FBRyxJQUFBLHdCQUFTLEVBQUMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDbkQsTUFBTSxNQUFNLEdBQUcsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sSUFBSSxHQUFHLFFBQVEsR0FBRyxHQUFHLEVBQUUsQ0FBQztJQUM5QixJQUFJLE1BQU0sR0FBZSxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUM7SUFDekMsSUFBSSxJQUFJLElBQUksQ0FBQztRQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7O1FBQzlCLE1BQU0sR0FBRyxjQUFjLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM5RCxPQUFPO1FBQ0wsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNO1FBQ3ZCLE9BQU8sRUFBRSxHQUFHLEVBQUU7WUFDWixNQUFNLEVBQUUsQ0FBQztZQUNULFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNyQixDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUM7QUFyQkQsa0NBcUJDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBhdHRlbXB0L2RlYWRsaW5lLnRzIOKAlCB3aGF0IHRoZSBydW4ncyBkZWFkbGluZSBJUywgdG8gZXZlcnl0aGluZyB0aGF0IHJlYWRzIHRpbWUgKGRlc2lnbiDCpzMuMSwgbGF3IDMpLlxuICpcbiAqIFRoZSBkZWFkbGluZSBpcyBvbmUgbnVtYmVyLCBlcG9jaCBtaWxsaXNlY29uZHMgKGBlbnYuZGVhZGxpbmVgKTsgdGhlIGV4ZWN1dG9yIGFybXMgdGhlIHJ1bidzIHNpZ25hbCB0byBhYm9ydCB3aGVuXG4gKiBpdCBwYXNzZXMgKGBydW5uZXIvZGVhZGxpbmUudHMgwrcgYXJtUnVuYCkuIFJlYWNoaW5nIGl0IGlzIE5PVCBhIGNhbmNlbGxhdGlvbjogYW4gYXR0ZW1wdCB0aGUgZGVhZGxpbmUgY3V0cyBzaG9ydFxuICogdGltZWQgb3V0IChpdCBoYWQgbm8gYW5zd2VyIGluIHRoZSB0aW1lIGl0IGhhZCDigJQgbGF3IDQpLCBhbmQgdGhlIHNlcmllcyBzdG9wcyBgbm8tdGltZS1sZWZ0YCwgbm90IGBhYm9ydGVkYC4gU29cbiAqIHRoZSByZWFzb24gdGhlIHJ1bidzIHNpZ25hbCBhYm9ydHMgd2l0aCBhdCB0aGUgZGVhZGxpbmUgaXMgQlJBTkRFRCBoZXJlLCBhbmQgdGhlIGF0dGVtcHQgcnVubmVyIHRlbGxzIHRoZSB0d29cbiAqIGFwYXJ0IGJ5IHRoZSBicmFuZCDigJQgbmV2ZXIgYnkgdGhlIG1lc3NhZ2UsIG5ldmVyIGJ5IHRoZSBjbG9jay5cbiAqXG4gKiBUaGUgYnJhbmQgaXMgYSBtb2R1bGUtcHJpdmF0ZSBXZWFrU2V0OiBhbiBvcmRpbmFyeSBgRXJyb3JgIChzYW1lIG1lc3NhZ2UsIHNhbWUgbmFtZSBhIHJ1biB3aXRoIGB0aW1lb3V0TXNgIGFsd2F5c1xuICogcmVqZWN0ZWQgd2l0aCksIHJlY29nbmlzYWJsZSBvbmx5IGJ5IGlkZW50aXR5LlxuICovXG5cbmltcG9ydCB7IGFueVNpZ25hbCB9IGZyb20gJy4vYW55U2lnbmFsLmpzJztcblxuY29uc3QgREVBRExJTkVfUkVBU09OUyA9IG5ldyBXZWFrU2V0PG9iamVjdD4oKTtcblxuLyoqIFRoZSByZWFzb24gdGhlIHJ1bidzIHNpZ25hbCBhYm9ydHMgd2l0aCB3aGVuIGl0cyBkZWFkbGluZSBwYXNzZXMg4oCUIGFuIGBFcnJvcmAsIGJyYW5kZWQgYXMgdGhlIGRlYWRsaW5lJ3MuICovXG5leHBvcnQgZnVuY3Rpb24gZGVhZGxpbmVSZWFzb24obWVzc2FnZTogc3RyaW5nKTogRXJyb3Ige1xuICBjb25zdCByZWFzb24gPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gIERFQURMSU5FX1JFQVNPTlMuYWRkKHJlYXNvbik7XG4gIHJldHVybiByZWFzb247XG59XG5cbi8qKlxuICogQnJhbmQgYHJlYXNvbmAgYXMgYSB0aW1lIGxpbWl0IOKAlCB3aGF0IGFuIGF0dGVtcHQncyBvd24gY2FwIGFib3J0cyB3aXRoIChQMikuIEFuIGF0dGVtcHQncyBjYXAgaXMgdGhlIGRlYWRsaW5lIG9mXG4gKiBldmVyeSBjYWxsIG1hZGUgaW5zaWRlIGl0IChgYXR0ZW1wdC9jYWxsLnRzYCksIHNvIGEgY2FsbCBpdCBjdXRzIHJhbiBvdXQgb2YgdGltZTogYCd0aW1lb3V0J2AsIG5ldmVyIGAnYWJvcnRlZCdgLlxuICogVGhlIHJ1bidzIG93biBzaWduYWwgbmV2ZXIgYWJvcnRzIHdpdGggaXQsIHNvIGEgc3RhZ2UgYXR0ZW1wdCByZWFkcyBub3RoaW5nIG5ldy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcmtUaW1lTGltaXQ8VCBleHRlbmRzIG9iamVjdD4ocmVhc29uOiBUKTogVCB7XG4gIERFQURMSU5FX1JFQVNPTlMuYWRkKHJlYXNvbik7XG4gIHJldHVybiByZWFzb247XG59XG5cbi8qKiBXaGV0aGVyIGByZWFzb25gIGlzIHRoZSBydW4ncyBkZWFkbGluZSBvciBhbiBhdHRlbXB0J3MgY2FwIOKAlCBhIHRpbWUgbGltaXQsIG5vdCBhIGNhbmNlbGxhdGlvbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RlYWRsaW5lUmVhc29uKHJlYXNvbjogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIHJlYXNvbiA9PT0gJ29iamVjdCcgJiYgcmVhc29uICE9PSBudWxsICYmIERFQURMSU5FX1JFQVNPTlMuaGFzKHJlYXNvbik7XG59XG5cbi8qKiBXaGV0aGVyIHRoZSBzaWduYWwgYWJvcnRlZCBmb3IgYSByZWFzb24gT1RIRVIgdGhhbiBhIHRpbWUgbGltaXQg4oCUIGEgY2FuY2VsbGF0aW9uLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ2FuY2VsbGVkKHNpZ25hbDogQWJvcnRTaWduYWwgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHNpZ25hbD8uYWJvcnRlZCA9PT0gdHJ1ZSAmJiAhaXNEZWFkbGluZVJlYXNvbihzaWduYWwucmVhc29uKTtcbn1cblxuLyoqIEEgZGVhZGxpbmUgYXMgdGhlIGVuZ2luZSByZWFkcyBvbmU6IGEgZmluaXRlIG51bWJlciAoZXBvY2ggbXMpLCBlbHNlIG5vbmUuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZERlYWRsaW5lKHZhbHVlOiB1bmtub3duKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgTnVtYmVyLmlzRmluaXRlKHZhbHVlKSA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG4vKiogVGhlIGxvbmdlc3QgZGVsYXkgYSBob3N0IHRpbWVyIGhvbm91cnMgKDJeMzEg4oiSIDEgbXMsIH4yNC44IGRheXMpOyBhIGxvbmdlciBvbmUgZmlyZXMgYXQgb25jZS4gKi9cbmNvbnN0IE1BWF9USU1FUl9NUyA9IDJfMTQ3XzQ4M182NDc7XG5cbi8qKlxuICogYHNldFRpbWVvdXRgIGZvciBhbnkgZGVsYXk6IGEgZGVsYXkgcGFzdCB0aGUgaG9zdCdzIGxpbWl0IGlzIHdhaXRlZCBpbiBjaHVua3MsIHNvIGEgMzAtZGF5IGRlYWRsaW5lIGRvZXMgbm90IGZpcmVcbiAqIGluIGEgbWlsbGlzZWNvbmQuIFJldHVybnMgdGhlIG9uZSBjYWxsIHRoYXQgY2FuY2VscyBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldExvbmdUaW1lb3V0KGZuOiAoKSA9PiB2b2lkLCBtczogbnVtYmVyKTogKCkgPT4gdm9pZCB7XG4gIGxldCB0aW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWQ7XG4gIGxldCBjYW5jZWxsZWQgPSBmYWxzZTtcbiAgY29uc3QgYXJtID0gKGxlZnQ6IG51bWJlcikgPT4ge1xuICAgIHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAoY2FuY2VsbGVkKSByZXR1cm47XG4gICAgICBpZiAobGVmdCA+IE1BWF9USU1FUl9NUykgYXJtKGxlZnQgLSBNQVhfVElNRVJfTVMpO1xuICAgICAgZWxzZSBmbigpO1xuICAgIH0sIE1hdGgubWluKGxlZnQsIE1BWF9USU1FUl9NUykpO1xuICB9O1xuICBhcm0oTWF0aC5tYXgoMCwgbXMpKTtcbiAgcmV0dXJuICgpID0+IHtcbiAgICBjYW5jZWxsZWQgPSB0cnVlO1xuICAgIGlmICh0aW1lciAhPT0gdW5kZWZpbmVkKSBjbGVhclRpbWVvdXQodGltZXIpO1xuICB9O1xufVxuXG4vKiogV2hldGhlciBgdmFsdWVgIGlzIGFuIEFib3J0U2lnbmFsIChzdHJ1Y3R1cmFsbHkg4oCUIGEgc2lnbmFsIGZyb20gYW5vdGhlciByZWFsbSBjb3VudHMpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQWJvcnRTaWduYWwodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBBYm9ydFNpZ25hbCB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgdHlwZW9mICh2YWx1ZSBhcyBBYm9ydFNpZ25hbCkuYWJvcnRlZCA9PT0gJ2Jvb2xlYW4nICYmXG4gICAgdHlwZW9mICh2YWx1ZSBhcyBBYm9ydFNpZ25hbCkuYWRkRXZlbnRMaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIHR5cGVvZiAodmFsdWUgYXMgQWJvcnRTaWduYWwpLnJlbW92ZUV2ZW50TGlzdGVuZXIgPT09ICdmdW5jdGlvbidcbiAgKTtcbn1cblxuLyoqIEEgc2lnbmFsIHRoYXQgYWJvcnRzIGF0IGEgZGVhZGxpbmUgKG9yIHdpdGggaXRzIGlucHV0KSwgYW5kIHRoZSBvbmUgY2FsbCB0aGF0IHJlbGVhc2VzIGJvdGguICovXG5leHBvcnQgaW50ZXJmYWNlIEFybWVkRGVhZGxpbmUge1xuICByZWFkb25seSBzaWduYWw6IEFib3J0U2lnbmFsIHwgdW5kZWZpbmVkO1xuICBkaXNwb3NlKCk6IHZvaWQ7XG59XG5cbi8qKlxuICogQ29tcG9zZSBgc2lnbmFsYCB3aXRoIGEgdGltZXIgdGhhdCBhYm9ydHMgYXQgYGRlYWRsaW5lYCAoZXBvY2ggbXMpIHdpdGggYSBicmFuZGVkIHtAbGluayBkZWFkbGluZVJlYXNvbn0g4oCUIHNvIHRoZVxuICogYXR0ZW1wdCBydW5uZXIncyByZWFkaW5nIGhvbGRzOiB0aGUgc2lnbmFsIGl0IGlzIGhhbmRlZCBhYm9ydHMgYXQgdGhlIGRlYWRsaW5lLCBhcyB0aGUgcnVuJ3MgZG9lcyAoYGFybVJ1bmApLiBBXG4gKiBkZWFkbGluZSBhbHJlYWR5IHBhc3QgYWJvcnRzIGF0IG9uY2U7IHdpdGhvdXQgYSBkZWFkbGluZSB0aGUgc2lnbmFsIGlzIGhhbmRlZCBiYWNrIGFzIGl0IGlzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXJtRGVhZGxpbmUoXG4gIHNpZ25hbDogQWJvcnRTaWduYWwgfCB1bmRlZmluZWQsXG4gIGRlYWRsaW5lOiBudW1iZXIgfCB1bmRlZmluZWQsXG4gIG1lc3NhZ2U6IHN0cmluZyxcbiAgbm93OiAoKSA9PiBudW1iZXIgPSBEYXRlLm5vdyxcbik6IEFybWVkRGVhZGxpbmUge1xuICBpZiAoZGVhZGxpbmUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHsgc2lnbmFsLCBkaXNwb3NlOiAoKSA9PiB1bmRlZmluZWQgfTtcbiAgY29uc3QgdGltZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIGNvbnN0IGNvbXBvc2VkID0gYW55U2lnbmFsKFtzaWduYWwsIHRpbWVyLnNpZ25hbF0pO1xuICBjb25zdCByZWFzb24gPSBkZWFkbGluZVJlYXNvbihtZXNzYWdlKTtcbiAgY29uc3QgbGVmdCA9IGRlYWRsaW5lIC0gbm93KCk7XG4gIGxldCBjYW5jZWw6ICgpID0+IHZvaWQgPSAoKSA9PiB1bmRlZmluZWQ7XG4gIGlmIChsZWZ0IDw9IDApIHRpbWVyLmFib3J0KHJlYXNvbik7XG4gIGVsc2UgY2FuY2VsID0gc2V0TG9uZ1RpbWVvdXQoKCkgPT4gdGltZXIuYWJvcnQocmVhc29uKSwgbGVmdCk7XG4gIHJldHVybiB7XG4gICAgc2lnbmFsOiBjb21wb3NlZC5zaWduYWwsXG4gICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgY2FuY2VsKCk7XG4gICAgICBjb21wb3NlZC5kaXNwb3NlKCk7XG4gICAgfSxcbiAgfTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* attempt/decision.ts — the ONE retry rule table and the runner's evidence builder (design §3.1, §3.8, law 9).
|
|
4
|
+
*
|
|
5
|
+
* `retryRules(policy)` is the retry-or-stop decision as ordinary `decide()` rules over `AttemptInputs`, first
|
|
6
|
+
* match wins, default `retry` ("retryable"):
|
|
7
|
+
*
|
|
8
|
+
* 1 outcome = ok → done succeeded
|
|
9
|
+
* 2 outcome = paused → stop paused
|
|
10
|
+
* 3 aborted = true → stop aborted (the run's signal — the attempt's outcome stays its own)
|
|
11
|
+
* 4 attempt ≥ of → stop exhausted
|
|
12
|
+
* 5 retryOn = false → stop declined (a function rule: it shows the verdict it saw)
|
|
13
|
+
* 6 timeLeftAfterWaitMs ≤ 0 → stop no-time-left
|
|
14
|
+
* default → retry retryable
|
|
15
|
+
*
|
|
16
|
+
* Each rule's `label` IS the reason it names, so `reason` is a projection of the evidence, never a second
|
|
17
|
+
* vocabulary. The ceiling is `attempt/policy.ts · attemptCeiling`, the one reading the engine and the runner
|
|
18
|
+
* share.
|
|
19
|
+
*
|
|
20
|
+
* `decideAttempt` evaluates that table WITHOUT a scope (the runner has none — `decide()` needs a registered
|
|
21
|
+
* one) and builds the evidence `decide()` would build: the filter rows come from `decide()`'s own evaluator
|
|
22
|
+
* (`filter/evaluator.ts · evaluateFilter`), the function rows and the first-match loop mirror
|
|
23
|
+
* `decide/decide.ts` field for field and key for key. A property test pins that both paths give equal evidence
|
|
24
|
+
* for equal inputs (test/lib/attempt/property).
|
|
25
|
+
*
|
|
26
|
+
* Inputs are READ, one key at a time, only when a rule reaches them — so the user's `retryOn` and `backoffMs`
|
|
27
|
+
* run exactly when a retry needs them, as they did before the record existed.
|
|
28
|
+
*/
|
|
29
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
30
|
+
exports.decideAttempt = exports.retryRules = exports.RETRY_DEFAULT = void 0;
|
|
31
|
+
const summarize_js_1 = require("../capture/summarize.js");
|
|
32
|
+
const evaluator_js_1 = require("../filter/evaluator.js");
|
|
33
|
+
const policy_js_1 = require("./policy.js");
|
|
34
|
+
/** The table's default: no rule stopped the series, so it retries. */
|
|
35
|
+
exports.RETRY_DEFAULT = Object.freeze({ branch: 'retry', label: 'retryable' });
|
|
36
|
+
/** `decide()`'s summary length for an evidence value (filter/evaluator.ts, decide/evidence.ts). */
|
|
37
|
+
const MAX_VALUE_LEN = 80;
|
|
38
|
+
/**
|
|
39
|
+
* The retry rule table for `policy` — six `decide()` rules, then {@link RETRY_DEFAULT}. The ceiling is the
|
|
40
|
+
* whole number of attempts the policy allows, never fewer than one (`attemptCeiling`): a ceiling of `NaN` or
|
|
41
|
+
* `Infinity` cannot make rule 4 unreachable.
|
|
42
|
+
*/
|
|
43
|
+
function retryRules(policy) {
|
|
44
|
+
return [
|
|
45
|
+
{ when: { outcome: { eq: 'ok' } }, then: 'done', label: 'succeeded' },
|
|
46
|
+
{ when: { outcome: { eq: 'paused' } }, then: 'stop', label: 'paused' },
|
|
47
|
+
{ when: { aborted: { eq: true } }, then: 'stop', label: 'aborted' },
|
|
48
|
+
{ when: { attempt: { gte: (0, policy_js_1.attemptCeiling)(policy.attempts) } }, then: 'stop', label: 'exhausted' },
|
|
49
|
+
{ when: (inputs) => inputs.retryOn === false, then: 'stop', label: 'declined' },
|
|
50
|
+
{ when: { timeLeftAfterWaitMs: { lte: 0 } }, then: 'stop', label: 'no-time-left' },
|
|
51
|
+
];
|
|
52
|
+
}
|
|
53
|
+
exports.retryRules = retryRules;
|
|
54
|
+
/**
|
|
55
|
+
* Evaluate `rules` (a `retryRules` table) over `read` — first match wins — and build the evidence `decide()`
|
|
56
|
+
* would record with the default {@link RETRY_DEFAULT}. `read(key)` returns one input; it is called only for the
|
|
57
|
+
* keys the evaluated rules touch, in rule order.
|
|
58
|
+
*/
|
|
59
|
+
function decideAttempt(rules, read) {
|
|
60
|
+
const evaluated = [];
|
|
61
|
+
for (const [index, rule] of rules.entries()) {
|
|
62
|
+
const evidence = evaluateRule(rule, index, read);
|
|
63
|
+
evaluated.push(evidence);
|
|
64
|
+
if (evidence.matched)
|
|
65
|
+
return decided(evaluated, rule.then, rule.label);
|
|
66
|
+
}
|
|
67
|
+
return decided(evaluated, exports.RETRY_DEFAULT.branch, exports.RETRY_DEFAULT.label);
|
|
68
|
+
}
|
|
69
|
+
exports.decideAttempt = decideAttempt;
|
|
70
|
+
function decided(rules, chosen, label) {
|
|
71
|
+
// decide()'s key order: rules, chosen, default, defaultLabel.
|
|
72
|
+
const evidence = {
|
|
73
|
+
rules,
|
|
74
|
+
chosen,
|
|
75
|
+
default: exports.RETRY_DEFAULT.branch,
|
|
76
|
+
defaultLabel: exports.RETRY_DEFAULT.label,
|
|
77
|
+
};
|
|
78
|
+
return { evidence, next: chosen, reason: label };
|
|
79
|
+
}
|
|
80
|
+
/** One rule, as `decide/decide.ts · evaluateRule` evaluates it — minus the scope. */
|
|
81
|
+
function evaluateRule(rule, index, read) {
|
|
82
|
+
if (typeof rule.when === 'function') {
|
|
83
|
+
const inputs = [];
|
|
84
|
+
let matched;
|
|
85
|
+
let matchError;
|
|
86
|
+
try {
|
|
87
|
+
matched = rule.when(readingView(read, inputs));
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
matched = false;
|
|
91
|
+
matchError = error instanceof Error ? error.message : String(error);
|
|
92
|
+
}
|
|
93
|
+
const evidence = {
|
|
94
|
+
type: 'function',
|
|
95
|
+
ruleIndex: index,
|
|
96
|
+
branch: rule.then,
|
|
97
|
+
matched,
|
|
98
|
+
label: rule.label,
|
|
99
|
+
inputs,
|
|
100
|
+
...(matchError !== undefined && { matchError }),
|
|
101
|
+
};
|
|
102
|
+
return evidence;
|
|
103
|
+
}
|
|
104
|
+
let matched = false;
|
|
105
|
+
let conditions = [];
|
|
106
|
+
let matchError;
|
|
107
|
+
try {
|
|
108
|
+
({ matched, conditions } = (0, evaluator_js_1.evaluateFilter)(read, () => false, rule.when));
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
matchError = error instanceof Error ? error.message : String(error);
|
|
112
|
+
}
|
|
113
|
+
const evidence = {
|
|
114
|
+
type: 'filter',
|
|
115
|
+
ruleIndex: index,
|
|
116
|
+
branch: rule.then,
|
|
117
|
+
matched,
|
|
118
|
+
label: rule.label,
|
|
119
|
+
conditions,
|
|
120
|
+
...(matchError !== undefined && { matchError }),
|
|
121
|
+
};
|
|
122
|
+
return evidence;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* The inputs as a function rule sees them: each string-keyed read is recorded the way `decide()`'s evidence
|
|
126
|
+
* collector records a scope read (key, summary, not redacted — every input is a number, a name or a flag).
|
|
127
|
+
*/
|
|
128
|
+
function readingView(read, inputs) {
|
|
129
|
+
return new Proxy({}, {
|
|
130
|
+
get(_target, key) {
|
|
131
|
+
if (typeof key !== 'string')
|
|
132
|
+
return undefined;
|
|
133
|
+
const value = read(key);
|
|
134
|
+
inputs.push({ key, valueSummary: (0, summarize_js_1.summarizeValue)(value, MAX_VALUE_LEN), redacted: false });
|
|
135
|
+
return value;
|
|
136
|
+
},
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjaXNpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2F0dGVtcHQvZGVjaXNpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBCRzs7O0FBRUgsMERBQXlEO0FBVXpELHlEQUF3RDtBQUN4RCwyQ0FBNkM7QUFHN0Msc0VBQXNFO0FBQ3pELFFBQUEsYUFBYSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQVcsQ0FBQyxDQUFDO0FBRTdGLG1HQUFtRztBQUNuRyxNQUFNLGFBQWEsR0FBRyxFQUFFLENBQUM7QUFFekI7Ozs7R0FJRztBQUNILFNBQWdCLFVBQVUsQ0FBQyxNQUFxQztJQUM5RCxPQUFPO1FBQ0wsRUFBRSxJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUU7UUFDckUsRUFBRSxJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUU7UUFDdEUsRUFBRSxJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUU7UUFDbkUsRUFBRSxJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBQSwwQkFBYyxFQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFO1FBQ2pHLEVBQUUsSUFBSSxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxLQUFLLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUU7UUFDL0UsRUFBRSxJQUFJLEVBQUUsRUFBRSxtQkFBbUIsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRTtLQUNuRixDQUFDO0FBQ0osQ0FBQztBQVRELGdDQVNDO0FBU0Q7Ozs7R0FJRztBQUNILFNBQWdCLGFBQWEsQ0FDM0IsS0FBMkMsRUFDM0MsSUFBOEI7SUFFOUIsTUFBTSxTQUFTLEdBQW1CLEVBQUUsQ0FBQztJQUNyQyxLQUFLLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7UUFDNUMsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDakQsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN6QixJQUFJLFFBQVEsQ0FBQyxPQUFPO1lBQUUsT0FBTyxPQUFPLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFDRCxPQUFPLE9BQU8sQ0FBQyxTQUFTLEVBQUUscUJBQWEsQ0FBQyxNQUFNLEVBQUUscUJBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN2RSxDQUFDO0FBWEQsc0NBV0M7QUFFRCxTQUFTLE9BQU8sQ0FBQyxLQUFxQixFQUFFLE1BQWMsRUFBRSxLQUF5QjtJQUMvRSw4REFBOEQ7SUFDOUQsTUFBTSxRQUFRLEdBQXFCO1FBQ2pDLEtBQUs7UUFDTCxNQUFNO1FBQ04sT0FBTyxFQUFFLHFCQUFhLENBQUMsTUFBTTtRQUM3QixZQUFZLEVBQUUscUJBQWEsQ0FBQyxLQUFLO0tBQ2xDLENBQUM7SUFDRixPQUFPLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFxQixFQUFFLE1BQU0sRUFBRSxLQUFzQixFQUFFLENBQUM7QUFDbkYsQ0FBQztBQUVELHFGQUFxRjtBQUNyRixTQUFTLFlBQVksQ0FBQyxJQUErQixFQUFFLEtBQWEsRUFBRSxJQUE4QjtJQUNsRyxJQUFJLE9BQU8sSUFBSSxDQUFDLElBQUksS0FBSyxVQUFVLEVBQUUsQ0FBQztRQUNwQyxNQUFNLE1BQU0sR0FBZ0IsRUFBRSxDQUFDO1FBQy9CLElBQUksT0FBZ0IsQ0FBQztRQUNyQixJQUFJLFVBQThCLENBQUM7UUFDbkMsSUFBSSxDQUFDO1lBQ0gsT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ2pELENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUNoQixVQUFVLEdBQUcsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RFLENBQUM7UUFDRCxNQUFNLFFBQVEsR0FBeUI7WUFDckMsSUFBSSxFQUFFLFVBQVU7WUFDaEIsU0FBUyxFQUFFLEtBQUs7WUFDaEIsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2pCLE9BQU87WUFDUCxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7WUFDakIsTUFBTTtZQUNOLEdBQUcsQ0FBQyxVQUFVLEtBQUssU0FBUyxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUM7U0FDaEQsQ0FBQztRQUNGLE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFDRCxJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDcEIsSUFBSSxVQUFVLEdBQXFDLEVBQUUsQ0FBQztJQUN0RCxJQUFJLFVBQThCLENBQUM7SUFDbkMsSUFBSSxDQUFDO1FBQ0gsQ0FBQyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxJQUFBLDZCQUFjLEVBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBa0MsQ0FBQyxDQUFDLENBQUM7SUFDekcsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixVQUFVLEdBQUcsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFDRCxNQUFNLFFBQVEsR0FBdUI7UUFDbkMsSUFBSSxFQUFFLFFBQVE7UUFDZCxTQUFTLEVBQUUsS0FBSztRQUNoQixNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUk7UUFDakIsT0FBTztRQUNQLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztRQUNqQixVQUFVO1FBQ1YsR0FBRyxDQUFDLFVBQVUsS0FBSyxTQUFTLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQztLQUNoRCxDQUFDO0lBQ0YsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsV0FBVyxDQUFDLElBQThCLEVBQUUsTUFBbUI7SUFDdEUsT0FBTyxJQUFJLEtBQUssQ0FBQyxFQUFtQixFQUFFO1FBQ3BDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsR0FBRztZQUNkLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUTtnQkFBRSxPQUFPLFNBQVMsQ0FBQztZQUM5QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDeEIsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsSUFBQSw2QkFBYyxFQUFDLEtBQUssRUFBRSxhQUFhLENBQUMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUMxRixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBhdHRlbXB0L2RlY2lzaW9uLnRzIOKAlCB0aGUgT05FIHJldHJ5IHJ1bGUgdGFibGUgYW5kIHRoZSBydW5uZXIncyBldmlkZW5jZSBidWlsZGVyIChkZXNpZ24gwqczLjEsIMKnMy44LCBsYXcgOSkuXG4gKlxuICogYHJldHJ5UnVsZXMocG9saWN5KWAgaXMgdGhlIHJldHJ5LW9yLXN0b3AgZGVjaXNpb24gYXMgb3JkaW5hcnkgYGRlY2lkZSgpYCBydWxlcyBvdmVyIGBBdHRlbXB0SW5wdXRzYCwgZmlyc3RcbiAqIG1hdGNoIHdpbnMsIGRlZmF1bHQgYHJldHJ5YCAoXCJyZXRyeWFibGVcIik6XG4gKlxuICogICAxICBvdXRjb21lID0gb2sgICAgICAgICAgICAgICAgICAgIOKGkiBkb25lICBzdWNjZWVkZWRcbiAqICAgMiAgb3V0Y29tZSA9IHBhdXNlZCAgICAgICAgICAgICAgICDihpIgc3RvcCAgcGF1c2VkXG4gKiAgIDMgIGFib3J0ZWQgPSB0cnVlICAgICAgICAgICAgICAgICAg4oaSIHN0b3AgIGFib3J0ZWQgICAgICAgICh0aGUgcnVuJ3Mgc2lnbmFsIOKAlCB0aGUgYXR0ZW1wdCdzIG91dGNvbWUgc3RheXMgaXRzIG93bilcbiAqICAgNCAgYXR0ZW1wdCDiiaUgb2YgICAgICAgICAgICAgICAgICAgIOKGkiBzdG9wICBleGhhdXN0ZWRcbiAqICAgNSAgcmV0cnlPbiA9IGZhbHNlICAgICAgICAgICAgICAgICDihpIgc3RvcCAgZGVjbGluZWQgICAgICAgKGEgZnVuY3Rpb24gcnVsZTogaXQgc2hvd3MgdGhlIHZlcmRpY3QgaXQgc2F3KVxuICogICA2ICB0aW1lTGVmdEFmdGVyV2FpdE1zIOKJpCAwICAgICAgICAg4oaSIHN0b3AgIG5vLXRpbWUtbGVmdFxuICogICAgICBkZWZhdWx0ICAgICAgICAgICAgICAgICAgICAgICAgIOKGkiByZXRyeSByZXRyeWFibGVcbiAqXG4gKiBFYWNoIHJ1bGUncyBgbGFiZWxgIElTIHRoZSByZWFzb24gaXQgbmFtZXMsIHNvIGByZWFzb25gIGlzIGEgcHJvamVjdGlvbiBvZiB0aGUgZXZpZGVuY2UsIG5ldmVyIGEgc2Vjb25kXG4gKiB2b2NhYnVsYXJ5LiBUaGUgY2VpbGluZyBpcyBgYXR0ZW1wdC9wb2xpY3kudHMgwrcgYXR0ZW1wdENlaWxpbmdgLCB0aGUgb25lIHJlYWRpbmcgdGhlIGVuZ2luZSBhbmQgdGhlIHJ1bm5lclxuICogc2hhcmUuXG4gKlxuICogYGRlY2lkZUF0dGVtcHRgIGV2YWx1YXRlcyB0aGF0IHRhYmxlIFdJVEhPVVQgYSBzY29wZSAodGhlIHJ1bm5lciBoYXMgbm9uZSDigJQgYGRlY2lkZSgpYCBuZWVkcyBhIHJlZ2lzdGVyZWRcbiAqIG9uZSkgYW5kIGJ1aWxkcyB0aGUgZXZpZGVuY2UgYGRlY2lkZSgpYCB3b3VsZCBidWlsZDogdGhlIGZpbHRlciByb3dzIGNvbWUgZnJvbSBgZGVjaWRlKClgJ3Mgb3duIGV2YWx1YXRvclxuICogKGBmaWx0ZXIvZXZhbHVhdG9yLnRzIMK3IGV2YWx1YXRlRmlsdGVyYCksIHRoZSBmdW5jdGlvbiByb3dzIGFuZCB0aGUgZmlyc3QtbWF0Y2ggbG9vcCBtaXJyb3JcbiAqIGBkZWNpZGUvZGVjaWRlLnRzYCBmaWVsZCBmb3IgZmllbGQgYW5kIGtleSBmb3Iga2V5LiBBIHByb3BlcnR5IHRlc3QgcGlucyB0aGF0IGJvdGggcGF0aHMgZ2l2ZSBlcXVhbCBldmlkZW5jZVxuICogZm9yIGVxdWFsIGlucHV0cyAodGVzdC9saWIvYXR0ZW1wdC9wcm9wZXJ0eSkuXG4gKlxuICogSW5wdXRzIGFyZSBSRUFELCBvbmUga2V5IGF0IGEgdGltZSwgb25seSB3aGVuIGEgcnVsZSByZWFjaGVzIHRoZW0g4oCUIHNvIHRoZSB1c2VyJ3MgYHJldHJ5T25gIGFuZCBgYmFja29mZk1zYFxuICogcnVuIGV4YWN0bHkgd2hlbiBhIHJldHJ5IG5lZWRzIHRoZW0sIGFzIHRoZXkgZGlkIGJlZm9yZSB0aGUgcmVjb3JkIGV4aXN0ZWQuXG4gKi9cblxuaW1wb3J0IHsgc3VtbWFyaXplVmFsdWUgfSBmcm9tICcuLi9jYXB0dXJlL3N1bW1hcml6ZS5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIERlY2lkZVJ1bGUsXG4gIERlY2lzaW9uRXZpZGVuY2UsXG4gIEZpbHRlclJ1bGVFdmlkZW5jZSxcbiAgRnVuY3Rpb25SdWxlRXZpZGVuY2UsXG4gIFJlYWRJbnB1dCxcbiAgUnVsZUV2aWRlbmNlLFxuICBXaGVyZUZpbHRlcixcbn0gZnJvbSAnLi4vZGVjaWRlL3R5cGVzLmpzJztcbmltcG9ydCB7IGV2YWx1YXRlRmlsdGVyIH0gZnJvbSAnLi4vZmlsdGVyL2V2YWx1YXRvci5qcyc7XG5pbXBvcnQgeyBhdHRlbXB0Q2VpbGluZyB9IGZyb20gJy4vcG9saWN5LmpzJztcbmltcG9ydCB0eXBlIHsgQXR0ZW1wdElucHV0cywgQXR0ZW1wdE5leHQsIEF0dGVtcHRSZWFzb24sIFJldHJ5UG9saWN5IH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8qKiBUaGUgdGFibGUncyBkZWZhdWx0OiBubyBydWxlIHN0b3BwZWQgdGhlIHNlcmllcywgc28gaXQgcmV0cmllcy4gKi9cbmV4cG9ydCBjb25zdCBSRVRSWV9ERUZBVUxUID0gT2JqZWN0LmZyZWV6ZSh7IGJyYW5jaDogJ3JldHJ5JywgbGFiZWw6ICdyZXRyeWFibGUnIH0gYXMgY29uc3QpO1xuXG4vKiogYGRlY2lkZSgpYCdzIHN1bW1hcnkgbGVuZ3RoIGZvciBhbiBldmlkZW5jZSB2YWx1ZSAoZmlsdGVyL2V2YWx1YXRvci50cywgZGVjaWRlL2V2aWRlbmNlLnRzKS4gKi9cbmNvbnN0IE1BWF9WQUxVRV9MRU4gPSA4MDtcblxuLyoqXG4gKiBUaGUgcmV0cnkgcnVsZSB0YWJsZSBmb3IgYHBvbGljeWAg4oCUIHNpeCBgZGVjaWRlKClgIHJ1bGVzLCB0aGVuIHtAbGluayBSRVRSWV9ERUZBVUxUfS4gVGhlIGNlaWxpbmcgaXMgdGhlXG4gKiB3aG9sZSBudW1iZXIgb2YgYXR0ZW1wdHMgdGhlIHBvbGljeSBhbGxvd3MsIG5ldmVyIGZld2VyIHRoYW4gb25lIChgYXR0ZW1wdENlaWxpbmdgKTogYSBjZWlsaW5nIG9mIGBOYU5gIG9yXG4gKiBgSW5maW5pdHlgIGNhbm5vdCBtYWtlIHJ1bGUgNCB1bnJlYWNoYWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJldHJ5UnVsZXMocG9saWN5OiBQaWNrPFJldHJ5UG9saWN5LCAnYXR0ZW1wdHMnPik6IERlY2lkZVJ1bGU8QXR0ZW1wdElucHV0cz5bXSB7XG4gIHJldHVybiBbXG4gICAgeyB3aGVuOiB7IG91dGNvbWU6IHsgZXE6ICdvaycgfSB9LCB0aGVuOiAnZG9uZScsIGxhYmVsOiAnc3VjY2VlZGVkJyB9LFxuICAgIHsgd2hlbjogeyBvdXRjb21lOiB7IGVxOiAncGF1c2VkJyB9IH0sIHRoZW46ICdzdG9wJywgbGFiZWw6ICdwYXVzZWQnIH0sXG4gICAgeyB3aGVuOiB7IGFib3J0ZWQ6IHsgZXE6IHRydWUgfSB9LCB0aGVuOiAnc3RvcCcsIGxhYmVsOiAnYWJvcnRlZCcgfSxcbiAgICB7IHdoZW46IHsgYXR0ZW1wdDogeyBndGU6IGF0dGVtcHRDZWlsaW5nKHBvbGljeS5hdHRlbXB0cykgfSB9LCB0aGVuOiAnc3RvcCcsIGxhYmVsOiAnZXhoYXVzdGVkJyB9LFxuICAgIHsgd2hlbjogKGlucHV0cykgPT4gaW5wdXRzLnJldHJ5T24gPT09IGZhbHNlLCB0aGVuOiAnc3RvcCcsIGxhYmVsOiAnZGVjbGluZWQnIH0sXG4gICAgeyB3aGVuOiB7IHRpbWVMZWZ0QWZ0ZXJXYWl0TXM6IHsgbHRlOiAwIH0gfSwgdGhlbjogJ3N0b3AnLCBsYWJlbDogJ25vLXRpbWUtbGVmdCcgfSxcbiAgXTtcbn1cblxuLyoqIEEgZGVjaXNpb246IHRoZSBldmlkZW5jZSwgYW5kIGl0cyBjb21wYWN0IHByb2plY3Rpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIEF0dGVtcHREZWNpc2lvbiB7XG4gIHJlYWRvbmx5IGV2aWRlbmNlOiBEZWNpc2lvbkV2aWRlbmNlO1xuICByZWFkb25seSBuZXh0OiBBdHRlbXB0TmV4dDtcbiAgcmVhZG9ubHkgcmVhc29uOiBBdHRlbXB0UmVhc29uO1xufVxuXG4vKipcbiAqIEV2YWx1YXRlIGBydWxlc2AgKGEgYHJldHJ5UnVsZXNgIHRhYmxlKSBvdmVyIGByZWFkYCDigJQgZmlyc3QgbWF0Y2ggd2lucyDigJQgYW5kIGJ1aWxkIHRoZSBldmlkZW5jZSBgZGVjaWRlKClgXG4gKiB3b3VsZCByZWNvcmQgd2l0aCB0aGUgZGVmYXVsdCB7QGxpbmsgUkVUUllfREVGQVVMVH0uIGByZWFkKGtleSlgIHJldHVybnMgb25lIGlucHV0OyBpdCBpcyBjYWxsZWQgb25seSBmb3IgdGhlXG4gKiBrZXlzIHRoZSBldmFsdWF0ZWQgcnVsZXMgdG91Y2gsIGluIHJ1bGUgb3JkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNpZGVBdHRlbXB0KFxuICBydWxlczogcmVhZG9ubHkgRGVjaWRlUnVsZTxBdHRlbXB0SW5wdXRzPltdLFxuICByZWFkOiAoa2V5OiBzdHJpbmcpID0+IHVua25vd24sXG4pOiBBdHRlbXB0RGVjaXNpb24ge1xuICBjb25zdCBldmFsdWF0ZWQ6IFJ1bGVFdmlkZW5jZVtdID0gW107XG4gIGZvciAoY29uc3QgW2luZGV4LCBydWxlXSBvZiBydWxlcy5lbnRyaWVzKCkpIHtcbiAgICBjb25zdCBldmlkZW5jZSA9IGV2YWx1YXRlUnVsZShydWxlLCBpbmRleCwgcmVhZCk7XG4gICAgZXZhbHVhdGVkLnB1c2goZXZpZGVuY2UpO1xuICAgIGlmIChldmlkZW5jZS5tYXRjaGVkKSByZXR1cm4gZGVjaWRlZChldmFsdWF0ZWQsIHJ1bGUudGhlbiwgcnVsZS5sYWJlbCk7XG4gIH1cbiAgcmV0dXJuIGRlY2lkZWQoZXZhbHVhdGVkLCBSRVRSWV9ERUZBVUxULmJyYW5jaCwgUkVUUllfREVGQVVMVC5sYWJlbCk7XG59XG5cbmZ1bmN0aW9uIGRlY2lkZWQocnVsZXM6IFJ1bGVFdmlkZW5jZVtdLCBjaG9zZW46IHN0cmluZywgbGFiZWw6IHN0cmluZyB8IHVuZGVmaW5lZCk6IEF0dGVtcHREZWNpc2lvbiB7XG4gIC8vIGRlY2lkZSgpJ3Mga2V5IG9yZGVyOiBydWxlcywgY2hvc2VuLCBkZWZhdWx0LCBkZWZhdWx0TGFiZWwuXG4gIGNvbnN0IGV2aWRlbmNlOiBEZWNpc2lvbkV2aWRlbmNlID0ge1xuICAgIHJ1bGVzLFxuICAgIGNob3NlbixcbiAgICBkZWZhdWx0OiBSRVRSWV9ERUZBVUxULmJyYW5jaCxcbiAgICBkZWZhdWx0TGFiZWw6IFJFVFJZX0RFRkFVTFQubGFiZWwsXG4gIH07XG4gIHJldHVybiB7IGV2aWRlbmNlLCBuZXh0OiBjaG9zZW4gYXMgQXR0ZW1wdE5leHQsIHJlYXNvbjogbGFiZWwgYXMgQXR0ZW1wdFJlYXNvbiB9O1xufVxuXG4vKiogT25lIHJ1bGUsIGFzIGBkZWNpZGUvZGVjaWRlLnRzIMK3IGV2YWx1YXRlUnVsZWAgZXZhbHVhdGVzIGl0IOKAlCBtaW51cyB0aGUgc2NvcGUuICovXG5mdW5jdGlvbiBldmFsdWF0ZVJ1bGUocnVsZTogRGVjaWRlUnVsZTxBdHRlbXB0SW5wdXRzPiwgaW5kZXg6IG51bWJlciwgcmVhZDogKGtleTogc3RyaW5nKSA9PiB1bmtub3duKTogUnVsZUV2aWRlbmNlIHtcbiAgaWYgKHR5cGVvZiBydWxlLndoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICBjb25zdCBpbnB1dHM6IFJlYWRJbnB1dFtdID0gW107XG4gICAgbGV0IG1hdGNoZWQ6IGJvb2xlYW47XG4gICAgbGV0IG1hdGNoRXJyb3I6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgbWF0Y2hlZCA9IHJ1bGUud2hlbihyZWFkaW5nVmlldyhyZWFkLCBpbnB1dHMpKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbWF0Y2hlZCA9IGZhbHNlO1xuICAgICAgbWF0Y2hFcnJvciA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICB9XG4gICAgY29uc3QgZXZpZGVuY2U6IEZ1bmN0aW9uUnVsZUV2aWRlbmNlID0ge1xuICAgICAgdHlwZTogJ2Z1bmN0aW9uJyxcbiAgICAgIHJ1bGVJbmRleDogaW5kZXgsXG4gICAgICBicmFuY2g6IHJ1bGUudGhlbixcbiAgICAgIG1hdGNoZWQsXG4gICAgICBsYWJlbDogcnVsZS5sYWJlbCxcbiAgICAgIGlucHV0cyxcbiAgICAgIC4uLihtYXRjaEVycm9yICE9PSB1bmRlZmluZWQgJiYgeyBtYXRjaEVycm9yIH0pLFxuICAgIH07XG4gICAgcmV0dXJuIGV2aWRlbmNlO1xuICB9XG4gIGxldCBtYXRjaGVkID0gZmFsc2U7XG4gIGxldCBjb25kaXRpb25zOiBGaWx0ZXJSdWxlRXZpZGVuY2VbJ2NvbmRpdGlvbnMnXSA9IFtdO1xuICBsZXQgbWF0Y2hFcnJvcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICB0cnkge1xuICAgICh7IG1hdGNoZWQsIGNvbmRpdGlvbnMgfSA9IGV2YWx1YXRlRmlsdGVyKHJlYWQsICgpID0+IGZhbHNlLCBydWxlLndoZW4gYXMgV2hlcmVGaWx0ZXI8QXR0ZW1wdElucHV0cz4pKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBtYXRjaEVycm9yID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICB9XG4gIGNvbnN0IGV2aWRlbmNlOiBGaWx0ZXJSdWxlRXZpZGVuY2UgPSB7XG4gICAgdHlwZTogJ2ZpbHRlcicsXG4gICAgcnVsZUluZGV4OiBpbmRleCxcbiAgICBicmFuY2g6IHJ1bGUudGhlbixcbiAgICBtYXRjaGVkLFxuICAgIGxhYmVsOiBydWxlLmxhYmVsLFxuICAgIGNvbmRpdGlvbnMsXG4gICAgLi4uKG1hdGNoRXJyb3IgIT09IHVuZGVmaW5lZCAmJiB7IG1hdGNoRXJyb3IgfSksXG4gIH07XG4gIHJldHVybiBldmlkZW5jZTtcbn1cblxuLyoqXG4gKiBUaGUgaW5wdXRzIGFzIGEgZnVuY3Rpb24gcnVsZSBzZWVzIHRoZW06IGVhY2ggc3RyaW5nLWtleWVkIHJlYWQgaXMgcmVjb3JkZWQgdGhlIHdheSBgZGVjaWRlKClgJ3MgZXZpZGVuY2VcbiAqIGNvbGxlY3RvciByZWNvcmRzIGEgc2NvcGUgcmVhZCAoa2V5LCBzdW1tYXJ5LCBub3QgcmVkYWN0ZWQg4oCUIGV2ZXJ5IGlucHV0IGlzIGEgbnVtYmVyLCBhIG5hbWUgb3IgYSBmbGFnKS5cbiAqL1xuZnVuY3Rpb24gcmVhZGluZ1ZpZXcocmVhZDogKGtleTogc3RyaW5nKSA9PiB1bmtub3duLCBpbnB1dHM6IFJlYWRJbnB1dFtdKTogQXR0ZW1wdElucHV0cyB7XG4gIHJldHVybiBuZXcgUHJveHkoe30gYXMgQXR0ZW1wdElucHV0cywge1xuICAgIGdldChfdGFyZ2V0LCBrZXkpIHtcbiAgICAgIGlmICh0eXBlb2Yga2V5ICE9PSAnc3RyaW5nJykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHZhbHVlID0gcmVhZChrZXkpO1xuICAgICAgaW5wdXRzLnB1c2goeyBrZXksIHZhbHVlU3VtbWFyeTogc3VtbWFyaXplVmFsdWUodmFsdWUsIE1BWF9WQUxVRV9MRU4pLCByZWRhY3RlZDogZmFsc2UgfSk7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSxcbiAgfSk7XG59XG4iXX0=
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* attempt/effect.ts — side-effect safety (design §3.3, packet P3): the ONE reading of what an attempt did to an
|
|
4
|
+
* outside system, and the ONE rule for a touching target.
|
|
5
|
+
*
|
|
6
|
+
* - `touchesProblem` — the build law, asked at every door a touching declaration enters: the builder
|
|
7
|
+
* (`FlowChartBuilder · applyTouches` / `applyRetryPolicy`), the traverser for a StageNode a stage returns at run
|
|
8
|
+
* time (`FlowchartTraverser · admitDynamicNodes`), and the stage itself (`FlowchartTraverser · executeStage`, for
|
|
9
|
+
* a chart edited after `build()`). A touching target that may retry without an idempotency key is refused: a
|
|
10
|
+
* retry of a non-idempotent effect without one can apply it twice.
|
|
11
|
+
* - `callTouches` — the same law for `scope.$call(target, fn, policy, { touches, idempotencyKey })`.
|
|
12
|
+
* - `admitIdempotencyKey` — the key's format: 1–255 printable ASCII characters, no space. It travels in a request
|
|
13
|
+
* header (`Idempotency-Key`), so a control character could forge one; the refusal names the field, never the
|
|
14
|
+
* value.
|
|
15
|
+
* - `effectOf` — `ok → 'applied'`; a failure whose error declares `effect: 'none'` → `'none'`; anything else →
|
|
16
|
+
* `'unknown'`. A timeout is the absence of an answer (law 4), so it is never `'none'`.
|
|
17
|
+
* - `unknownEffectError` — what a series that ends without an answer after ANY attempt of unknown effect fails
|
|
18
|
+
* with, in place of the attempt's own error (its `cause`).
|
|
19
|
+
* - `interruptProblem` — a keyless touching stage may not be re-run by an `interrupt()` resume.
|
|
20
|
+
*/
|
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
exports.isCarriedTouches = exports.carriedTouches = exports.interruptProblem = exports.refuseKeylessRetry = exports.recordedKeyOf = exports.unknownEffectError = exports.effectOf = exports.callTouches = exports.admitIdempotencyKey = exports.touchesProblem = exports.MAX_IDEMPOTENCY_KEY_LENGTH = void 0;
|
|
23
|
+
const idempotencyKey_js_1 = require("../ids/idempotencyKey.js");
|
|
24
|
+
const errors_js_1 = require("./errors.js");
|
|
25
|
+
const name_js_1 = require("./name.js");
|
|
26
|
+
const policy_js_1 = require("./policy.js");
|
|
27
|
+
var idempotencyKey_js_2 = require("../ids/idempotencyKey.js");
|
|
28
|
+
Object.defineProperty(exports, "MAX_IDEMPOTENCY_KEY_LENGTH", { enumerable: true, get: function () { return idempotencyKey_js_2.MAX_IDEMPOTENCY_KEY_LENGTH; } });
|
|
29
|
+
/** Why `retry` with `touches` breaks the law — the shared words of every door. */
|
|
30
|
+
function retriedWithoutKey(system, attempts) {
|
|
31
|
+
return (`touches "${system}" and may retry (attempts: ${attempts}) but declares no idempotencyKey — a retry of an ` +
|
|
32
|
+
'outside effect without a key can apply it twice. Declare the key rule ' +
|
|
33
|
+
`(.touches('${system}', { idempotencyKey: ({ args }) => \`order-\${args.orderId}\` })), or retry once.`);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Why a touching declaration is refused, or `undefined` when it is admitted: `touches` must be `{ system,
|
|
37
|
+
* idempotencyKey? }` with `system` a name and the key rule a function; and a target that may retry (`retry`'s
|
|
38
|
+
* ceiling above 1) must declare the key rule.
|
|
39
|
+
*/
|
|
40
|
+
function touchesProblem(touches, retry) {
|
|
41
|
+
if (touches === null || typeof touches !== 'object') {
|
|
42
|
+
return 'touches must be { system, idempotencyKey? } — the outside system and the key rule';
|
|
43
|
+
}
|
|
44
|
+
const { system, idempotencyKey } = touches;
|
|
45
|
+
const nameProblem = (0, name_js_1.attemptNameProblem)(system);
|
|
46
|
+
if (nameProblem !== undefined)
|
|
47
|
+
return `touches.system ${nameProblem} — it is a name from code, never a value`;
|
|
48
|
+
if (idempotencyKey !== undefined && typeof idempotencyKey !== 'function') {
|
|
49
|
+
return ('touches.idempotencyKey must be a function of the execution ((ctx) => string) — a constant key would make ' +
|
|
50
|
+
'every run one operation');
|
|
51
|
+
}
|
|
52
|
+
const attempts = (0, policy_js_1.attemptCeiling)(retry?.attempts);
|
|
53
|
+
if (attempts > 1 && idempotencyKey === undefined)
|
|
54
|
+
return retriedWithoutKey(system, attempts);
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
exports.touchesProblem = touchesProblem;
|
|
58
|
+
/** `value` as an idempotency key (`ids/idempotencyKey.ts`, the one rule), or a `TypeError` that names `where`. */
|
|
59
|
+
function admitIdempotencyKey(where, value) {
|
|
60
|
+
const problem = (0, idempotencyKey_js_1.idempotencyKeyProblem)(value);
|
|
61
|
+
if (problem !== undefined) {
|
|
62
|
+
throw new TypeError(`${where}: idempotencyKey ${problem} (derive it from the input or the state, never from model output)`);
|
|
63
|
+
}
|
|
64
|
+
return value;
|
|
65
|
+
}
|
|
66
|
+
exports.admitIdempotencyKey = admitIdempotencyKey;
|
|
67
|
+
/**
|
|
68
|
+
* A `$call`'s side-effect declaration, admitted: `undefined` when it touches nothing; otherwise the system and the
|
|
69
|
+
* key, refused with a `TypeError` naming `where` when malformed, when a key comes without a system, or when the
|
|
70
|
+
* call may retry with no key — before anything is sent.
|
|
71
|
+
*/
|
|
72
|
+
function callTouches(where, options, policy) {
|
|
73
|
+
if (options === undefined)
|
|
74
|
+
return undefined;
|
|
75
|
+
if (options === null || typeof options !== 'object') {
|
|
76
|
+
throw new TypeError(`${where}: options must be { touches?, idempotencyKey? }`);
|
|
77
|
+
}
|
|
78
|
+
const { touches, idempotencyKey } = options;
|
|
79
|
+
if (touches === undefined) {
|
|
80
|
+
if (idempotencyKey !== undefined) {
|
|
81
|
+
throw new TypeError(`${where}: an idempotencyKey names an effect — declare the system it touches (touches)`);
|
|
82
|
+
}
|
|
83
|
+
return undefined;
|
|
84
|
+
}
|
|
85
|
+
const nameProblem = (0, name_js_1.attemptNameProblem)(touches);
|
|
86
|
+
if (nameProblem !== undefined) {
|
|
87
|
+
throw new TypeError(`${where}: touches ${nameProblem} — it is a name from code, never a value`);
|
|
88
|
+
}
|
|
89
|
+
const key = idempotencyKey === undefined ? undefined : admitIdempotencyKey(where, idempotencyKey);
|
|
90
|
+
const attempts = (0, policy_js_1.attemptCeiling)(policy.attempts);
|
|
91
|
+
if (attempts > 1 && key === undefined)
|
|
92
|
+
throw new TypeError(`${where}: ${retriedWithoutKey(touches, attempts)}`);
|
|
93
|
+
return { system: touches, ...(key !== undefined && { idempotencyKey: key }) };
|
|
94
|
+
}
|
|
95
|
+
exports.callTouches = callTouches;
|
|
96
|
+
/** What an attempt that ended `outcome` (with `error`, when it failed) did to the outside system. */
|
|
97
|
+
function effectOf(outcome, error) {
|
|
98
|
+
if (outcome === 'ok')
|
|
99
|
+
return 'applied';
|
|
100
|
+
if (outcome === 'failed' && declaresNoEffect(error))
|
|
101
|
+
return 'none';
|
|
102
|
+
return 'unknown';
|
|
103
|
+
}
|
|
104
|
+
exports.effectOf = effectOf;
|
|
105
|
+
/** The error itself says nothing was sent — `effect: 'none'`, read once; a value that cannot be read says nothing. */
|
|
106
|
+
function declaresNoEffect(error) {
|
|
107
|
+
if (error === null || typeof error !== 'object')
|
|
108
|
+
return false;
|
|
109
|
+
try {
|
|
110
|
+
return error.effect === 'none';
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* What a touching series fails with when any of its attempts left the effect unknown — never the attempt's own error,
|
|
118
|
+
* which a caller would read as a failure and retry. The key is the RECORDED one: under a redaction rule that names
|
|
119
|
+
* it, the error carries the placeholder, as every record does.
|
|
120
|
+
*/
|
|
121
|
+
function unknownEffectError(target, record, cause) {
|
|
122
|
+
return new errors_js_1.UnknownEffectError({
|
|
123
|
+
system: target.system,
|
|
124
|
+
...(recordedKeyOf(target) !== undefined && { idempotencyKey: recordedKeyOf(target) }),
|
|
125
|
+
attempts: record.attempt,
|
|
126
|
+
cause,
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
exports.unknownEffectError = unknownEffectError;
|
|
130
|
+
/** The key as records carry it: the served form when the caller gave one, else the key itself. */
|
|
131
|
+
function recordedKeyOf(target) {
|
|
132
|
+
return target.recordedKey ?? target.idempotencyKey;
|
|
133
|
+
}
|
|
134
|
+
exports.recordedKeyOf = recordedKeyOf;
|
|
135
|
+
/** The runner's refusal of a touching series that may retry with no key — the law, at the last door. */
|
|
136
|
+
function refuseKeylessRetry(target, attempts) {
|
|
137
|
+
if (attempts > 1 && target.idempotencyKey === undefined) {
|
|
138
|
+
throw new TypeError(`[footprint] ${retriedWithoutKey(target.system, attempts)}`);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
exports.refuseKeylessRetry = refuseKeylessRetry;
|
|
142
|
+
/**
|
|
143
|
+
* Why a touching stage may not be RE-RUN by an `interrupt()` resume, or `undefined` when it may (P3). A resume
|
|
144
|
+
* re-runs the stage's function from its top — a second attempt of its effect — so the law that refuses a keyless
|
|
145
|
+
* retry refuses a keyless re-run too. Asked when the stage interrupts (`StageRunner`) and when a checkpoint is
|
|
146
|
+
* resumed (`runner/resume.ts · planResume`, for a checkpoint made by another version of the chart).
|
|
147
|
+
*/
|
|
148
|
+
function interruptProblem(touches) {
|
|
149
|
+
if (touches === undefined || touches.idempotencyKey !== undefined)
|
|
150
|
+
return undefined;
|
|
151
|
+
return (`touches "${touches.system}" with no idempotencyKey, and a resume after interrupt() re-runs the stage from its ` +
|
|
152
|
+
'top — a second attempt of the effect without a key. Declare the key rule, or interrupt in a stage of its own.');
|
|
153
|
+
}
|
|
154
|
+
exports.interruptProblem = interruptProblem;
|
|
155
|
+
/** The touching declarations `resume()` builds around a key a checkpoint carried (`carriedTouches`). */
|
|
156
|
+
const CARRIED = new WeakSet();
|
|
157
|
+
/**
|
|
158
|
+
* The stand-in's declaration on a resume (P3): the paused stage's system, answering the key its checkpoint carried —
|
|
159
|
+
* the OPERATIONAL value, real (checkpoints are exempt from redaction by law). It is marked, so the run serves it
|
|
160
|
+
* like a key of unknown sources: under any state rule the records carry the placeholder (`isCarriedTouches`) — the
|
|
161
|
+
* resumed leg no longer holds the input the key was made of, so it cannot tell whether the key was masked.
|
|
162
|
+
*/
|
|
163
|
+
function carriedTouches(system, key) {
|
|
164
|
+
const touches = Object.freeze({ system, idempotencyKey: () => key });
|
|
165
|
+
CARRIED.add(touches);
|
|
166
|
+
return touches;
|
|
167
|
+
}
|
|
168
|
+
exports.carriedTouches = carriedTouches;
|
|
169
|
+
/** The declaration answers a key a checkpoint carried ({@link carriedTouches}). */
|
|
170
|
+
function isCarriedTouches(touches) {
|
|
171
|
+
return typeof touches === 'object' && touches !== null && CARRIED.has(touches);
|
|
172
|
+
}
|
|
173
|
+
exports.isCarriedTouches = isCarriedTouches;
|
|
174
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWZmZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9hdHRlbXB0L2VmZmVjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRzs7O0FBRUgsZ0VBQWlFO0FBQ2pFLDJDQUFpRDtBQUNqRCx1Q0FBK0M7QUFDL0MsMkNBQTZDO0FBRzdDLDhEQUFzRTtBQUE3RCwrSEFBQSwwQkFBMEIsT0FBQTtBQVluQyxrRkFBa0Y7QUFDbEYsU0FBUyxpQkFBaUIsQ0FBQyxNQUFjLEVBQUUsUUFBZ0I7SUFDekQsT0FBTyxDQUNMLFlBQVksTUFBTSw4QkFBOEIsUUFBUSxtREFBbUQ7UUFDM0csd0VBQXdFO1FBQ3hFLGNBQWMsTUFBTSxtRkFBbUYsQ0FDeEcsQ0FBQztBQUNKLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBZ0IsY0FBYyxDQUFDLE9BQWdCLEVBQUUsS0FBZ0Q7SUFDL0YsSUFBSSxPQUFPLEtBQUssSUFBSSxJQUFJLE9BQU8sT0FBTyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ3BELE9BQU8sbUZBQW1GLENBQUM7SUFDN0YsQ0FBQztJQUNELE1BQU0sRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLEdBQUcsT0FBZ0MsQ0FBQztJQUNwRSxNQUFNLFdBQVcsR0FBRyxJQUFBLDRCQUFrQixFQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQy9DLElBQUksV0FBVyxLQUFLLFNBQVM7UUFBRSxPQUFPLGtCQUFrQixXQUFXLDBDQUEwQyxDQUFDO0lBQzlHLElBQUksY0FBYyxLQUFLLFNBQVMsSUFBSSxPQUFPLGNBQWMsS0FBSyxVQUFVLEVBQUUsQ0FBQztRQUN6RSxPQUFPLENBQ0wsMkdBQTJHO1lBQzNHLHlCQUF5QixDQUMxQixDQUFDO0lBQ0osQ0FBQztJQUNELE1BQU0sUUFBUSxHQUFHLElBQUEsMEJBQWMsRUFBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDakQsSUFBSSxRQUFRLEdB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LENBQUM7QUFDSixDQUFDO0FBTkQsNENBTUM7QUFFRCx3R0FBd0c7QUFDeEcsTUFBTSxPQUFPLEdBQUcsSUFBSSxPQUFPLEVBQVUsQ0FBQztBQUV0Qzs7Ozs7R0FLRztBQUNILFNBQWdCLGNBQWMsQ0FBQyxNQUFjLEVBQUUsR0FBVztJQUN4RCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ3JFLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDckIsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQztBQUpELHdDQUlDO0FBRUQsbUZBQW1GO0FBQ25GLFNBQWdCLGdCQUFnQixDQUFDLE9BQWdCO0lBQy9DLE9BQU8sT0FBTyxPQUFPLEtBQUssUUFBUSxJQUFJLE9BQU8sS0FBSyxJQUFJLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNqRixDQUFDO0FBRkQsNENBRUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGF0dGVtcHQvZWZmZWN0LnRzIOKAlCBzaWRlLWVmZmVjdCBzYWZldHkgKGRlc2lnbiDCpzMuMywgcGFja2V0IFAzKTogdGhlIE9ORSByZWFkaW5nIG9mIHdoYXQgYW4gYXR0ZW1wdCBkaWQgdG8gYW5cbiAqIG91dHNpZGUgc3lzdGVtLCBhbmQgdGhlIE9ORSBydWxlIGZvciBhIHRvdWNoaW5nIHRhcmdldC5cbiAqXG4gKiAgIC0gYHRvdWNoZXNQcm9ibGVtYCDigJQgdGhlIGJ1aWxkIGxhdywgYXNrZWQgYXQgZXZlcnkgZG9vciBhIHRvdWNoaW5nIGRlY2xhcmF0aW9uIGVudGVyczogdGhlIGJ1aWxkZXJcbiAqICAgICAoYEZsb3dDaGFydEJ1aWxkZXIgwrcgYXBwbHlUb3VjaGVzYCAvIGBhcHBseVJldHJ5UG9saWN5YCksIHRoZSB0cmF2ZXJzZXIgZm9yIGEgU3RhZ2VOb2RlIGEgc3RhZ2UgcmV0dXJucyBhdCBydW5cbiAqICAgICB0aW1lIChgRmxvd2NoYXJ0VHJhdmVyc2VyIMK3IGFkbWl0RHluYW1pY05vZGVzYCksIGFuZCB0aGUgc3RhZ2UgaXRzZWxmIChgRmxvd2NoYXJ0VHJhdmVyc2VyIMK3IGV4ZWN1dGVTdGFnZWAsIGZvclxuICogICAgIGEgY2hhcnQgZWRpdGVkIGFmdGVyIGBidWlsZCgpYCkuIEEgdG91Y2hpbmcgdGFyZ2V0IHRoYXQgbWF5IHJldHJ5IHdpdGhvdXQgYW4gaWRlbXBvdGVuY3kga2V5IGlzIHJlZnVzZWQ6IGFcbiAqICAgICByZXRyeSBvZiBhIG5vbi1pZGVtcG90ZW50IGVmZmVjdCB3aXRob3V0IG9uZSBjYW4gYXBwbHkgaXQgdHdpY2UuXG4gKiAgIC0gYGNhbGxUb3VjaGVzYCDigJQgdGhlIHNhbWUgbGF3IGZvciBgc2NvcGUuJGNhbGwodGFyZ2V0LCBmbiwgcG9saWN5LCB7IHRvdWNoZXMsIGlkZW1wb3RlbmN5S2V5IH0pYC5cbiAqICAgLSBgYWRtaXRJZGVtcG90ZW5jeUtleWAg4oCUIHRoZSBrZXkncyBmb3JtYXQ6IDHigJMyNTUgcHJpbnRhYmxlIEFTQ0lJIGNoYXJhY3RlcnMsIG5vIHNwYWNlLiBJdCB0cmF2ZWxzIGluIGEgcmVxdWVzdFxuICogICAgIGhlYWRlciAoYElkZW1wb3RlbmN5LUtleWApLCBzbyBhIGNvbnRyb2wgY2hhcmFjdGVyIGNvdWxkIGZvcmdlIG9uZTsgdGhlIHJlZnVzYWwgbmFtZXMgdGhlIGZpZWxkLCBuZXZlciB0aGVcbiAqICAgICB2YWx1ZS5cbiAqICAgLSBgZWZmZWN0T2ZgIOKAlCBgb2sg4oaSICdhcHBsaWVkJ2A7IGEgZmFpbHVyZSB3aG9zZSBlcnJvciBkZWNsYXJlcyBgZWZmZWN0OiAnbm9uZSdgIOKGkiBgJ25vbmUnYDsgYW55dGhpbmcgZWxzZSDihpJcbiAqICAgICBgJ3Vua25vd24nYC4gQSB0aW1lb3V0IGlzIHRoZSBhYnNlbmNlIG9mIGFuIGFuc3dlciAobGF3IDQpLCBzbyBpdCBpcyBuZXZlciBgJ25vbmUnYC5cbiAqICAgLSBgdW5rbm93bkVmZmVjdEVycm9yYCDigJQgd2hhdCBhIHNlcmllcyB0aGF0IGVuZHMgd2l0aG91dCBhbiBhbnN3ZXIgYWZ0ZXIgQU5ZIGF0dGVtcHQgb2YgdW5rbm93biBlZmZlY3QgZmFpbHNcbiAqICAgICB3aXRoLCBpbiBwbGFjZSBvZiB0aGUgYXR0ZW1wdCdzIG93biBlcnJvciAoaXRzIGBjYXVzZWApLlxuICogICAtIGBpbnRlcnJ1cHRQcm9ibGVtYCDigJQgYSBrZXlsZXNzIHRvdWNoaW5nIHN0YWdlIG1heSBub3QgYmUgcmUtcnVuIGJ5IGFuIGBpbnRlcnJ1cHQoKWAgcmVzdW1lLlxuICovXG5cbmltcG9ydCB7IGlkZW1wb3RlbmN5S2V5UHJvYmxlbSB9IGZyb20gJy4uL2lkcy9pZGVtcG90ZW5jeUtleS5qcyc7XG5pbXBvcnQgeyBVbmtub3duRWZmZWN0RXJyb3IgfSBmcm9tICcuL2Vycm9ycy5qcyc7XG5pbXBvcnQgeyBhdHRlbXB0TmFtZVByb2JsZW0gfSBmcm9tICcuL25hbWUuanMnO1xuaW1wb3J0IHsgYXR0ZW1wdENlaWxpbmcgfSBmcm9tICcuL3BvbGljeS5qcyc7XG5pbXBvcnQgdHlwZSB7IEF0dGVtcHRFZmZlY3QsIEF0dGVtcHRPdXRjb21lLCBBdHRlbXB0UmVjb3JkLCBDYWxsT3B0aW9ucywgUmV0cnlQb2xpY3ksIFN0YWdlVG91Y2hlcyB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG5leHBvcnQgeyBNQVhfSURFTVBPVEVOQ1lfS0VZX0xFTkdUSCB9IGZyb20gJy4uL2lkcy9pZGVtcG90ZW5jeUtleS5qcyc7XG5cbi8qKlxuICogV2hhdCBhIHRvdWNoaW5nIHJ1bm5lciBzZXJpZXMgaXMgdG9sZCAoYEF0dGVtcHRSdW5PcHRpb25zLmVmZmVjdGApOiB0aGUgc3lzdGVtLCB0aGUgUkVBTCBrZXkgdGhlIGF0dGVtcHRzIGFyZSBtYWRlXG4gKiB1bmRlciwgYW5kIHRoZSBrZXkgYXMgcmVjb3JkcyBjYXJyeSBpdCAodGhlIHJ1bidzIHNlcnZlZCBmb3JtOyB0aGUgcmVhbCBvbmUgd2hlbiBubyBydWxlIGFwcGxpZXMpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVmZmVjdFRhcmdldCB7XG4gIHJlYWRvbmx5IHN5c3RlbTogc3RyaW5nO1xuICByZWFkb25seSBpZGVtcG90ZW5jeUtleT86IHN0cmluZztcbiAgcmVhZG9ubHkgcmVjb3JkZWRLZXk/OiBzdHJpbmc7XG59XG5cbi8qKiBXaHkgYHJldHJ5YCB3aXRoIGB0b3VjaGVzYCBicmVha3MgdGhlIGxhdyDigJQgdGhlIHNoYXJlZCB3b3JkcyBvZiBldmVyeSBkb29yLiAqL1xuZnVuY3Rpb24gcmV0cmllZFdpdGhvdXRLZXkoc3lzdGVtOiBzdHJpbmcsIGF0dGVtcHRzOiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gKFxuICAgIGB0b3VjaGVzIFwiJHtzeXN0ZW19XCIgYW5kIG1heSByZXRyeSAoYXR0ZW1wdHM6ICR7YXR0ZW1wdHN9KSBidXQgZGVjbGFyZXMgbm8gaWRlbXBvdGVuY3lLZXkg4oCUIGEgcmV0cnkgb2YgYW4gYCArXG4gICAgJ291dHNpZGUgZWZmZWN0IHdpdGhvdXQgYSBrZXkgY2FuIGFwcGx5IGl0IHR3aWNlLiBEZWNsYXJlIHRoZSBrZXkgcnVsZSAnICtcbiAgICBgKC50b3VjaGVzKCcke3N5c3RlbX0nLCB7IGlkZW1wb3RlbmN5S2V5OiAoeyBhcmdzIH0pID0+IFxcYG9yZGVyLVxcJHthcmdzLm9yZGVySWR9XFxgIH0pKSwgb3IgcmV0cnkgb25jZS5gXG4gICk7XG59XG5cbi8qKlxuICogV2h5IGEgdG91Y2hpbmcgZGVjbGFyYXRpb24gaXMgcmVmdXNlZCwgb3IgYHVuZGVmaW5lZGAgd2hlbiBpdCBpcyBhZG1pdHRlZDogYHRvdWNoZXNgIG11c3QgYmUgYHsgc3lzdGVtLFxuICogaWRlbXBvdGVuY3lLZXk/IH1gIHdpdGggYHN5c3RlbWAgYSBuYW1lIGFuZCB0aGUga2V5IHJ1bGUgYSBmdW5jdGlvbjsgYW5kIGEgdGFyZ2V0IHRoYXQgbWF5IHJldHJ5IChgcmV0cnlgJ3NcbiAqIGNlaWxpbmcgYWJvdmUgMSkgbXVzdCBkZWNsYXJlIHRoZSBrZXkgcnVsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvdWNoZXNQcm9ibGVtKHRvdWNoZXM6IHVua25vd24sIHJldHJ5OiBQaWNrPFJldHJ5UG9saWN5LCAnYXR0ZW1wdHMnPiB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICh0b3VjaGVzID09PSBudWxsIHx8IHR5cGVvZiB0b3VjaGVzICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiAndG91Y2hlcyBtdXN0IGJlIHsgc3lzdGVtLCBpZGVtcG90ZW5jeUtleT8gfSDigJQgdGhlIG91dHNpZGUgc3lzdGVtIGFuZCB0aGUga2V5IHJ1bGUnO1xuICB9XG4gIGNvbnN0IHsgc3lzdGVtLCBpZGVtcG90ZW5jeUtleSB9ID0gdG91Y2hlcyBhcyBQYXJ0aWFsPFN0YWdlVG91Y2hlcz47XG4gIGNvbnN0IG5hbWVQcm9ibGVtID0gYXR0ZW1wdE5hbWVQcm9ibGVtKHN5c3RlbSk7XG4gIGlmIChuYW1lUHJvYmxlbSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gYHRvdWNoZXMuc3lzdGVtICR7bmFtZVByb2JsZW19IOKAlCBpdCBpcyBhIG5hbWUgZnJvbSBjb2RlLCBuZXZlciBhIHZhbHVlYDtcbiAgaWYgKGlkZW1wb3RlbmN5S2V5ICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGlkZW1wb3RlbmN5S2V5ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICd0b3VjaGVzLmlkZW1wb3RlbmN5S2V5IG11c3QgYmUgYSBmdW5jdGlvbiBvZiB0aGUgZXhlY3V0aW9uICgoY3R4KSA9PiBzdHJpbmcpIOKAlCBhIGNvbnN0YW50IGtleSB3b3VsZCBtYWtlICcgK1xuICAgICAgJ2V2ZXJ5IHJ1biBvbmUgb3BlcmF0aW9uJ1xuICAgICk7XG4gIH1cbiAgY29uc3QgYXR0ZW1wdHMgPSBhdHRlbXB0Q2VpbGluZyhyZXRyeT8uYXR0ZW1wdHMpO1xuICBpZiAoYXR0ZW1wdHMgPiAxICYmIGlkZW1wb3RlbmN5S2V5ID09PSB1bmRlZmluZWQpIHJldHVybiByZXRyaWVkV2l0aG91dEtleShzeXN0ZW0gYXMgc3RyaW5nLCBhdHRlbXB0cyk7XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKiBgdmFsdWVgIGFzIGFuIGlkZW1wb3RlbmN5IGtleSAoYGlkcy9pZGVtcG90ZW5jeUtleS50c2AsIHRoZSBvbmUgcnVsZSksIG9yIGEgYFR5cGVFcnJvcmAgdGhhdCBuYW1lcyBgd2hlcmVgLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkbWl0SWRlbXBvdGVuY3lLZXkod2hlcmU6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICBjb25zdCBwcm9ibGVtID0gaWRlbXBvdGVuY3lLZXlQcm9ibGVtKHZhbHVlKTtcbiAgaWYgKHByb2JsZW0gIT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICBgJHt3aGVyZX06IGlkZW1wb3RlbmN5S2V5ICR7cHJvYmxlbX0gKGRlcml2ZSBpdCBmcm9tIHRoZSBpbnB1dCBvciB0aGUgc3RhdGUsIG5ldmVyIGZyb20gbW9kZWwgb3V0cHV0KWAsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gdmFsdWUgYXMgc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgYCRjYWxsYCdzIHNpZGUtZWZmZWN0IGRlY2xhcmF0aW9uLCBhZG1pdHRlZDogYHVuZGVmaW5lZGAgd2hlbiBpdCB0b3VjaGVzIG5vdGhpbmc7IG90aGVyd2lzZSB0aGUgc3lzdGVtIGFuZCB0aGVcbiAqIGtleSwgcmVmdXNlZCB3aXRoIGEgYFR5cGVFcnJvcmAgbmFtaW5nIGB3aGVyZWAgd2hlbiBtYWxmb3JtZWQsIHdoZW4gYSBrZXkgY29tZXMgd2l0aG91dCBhIHN5c3RlbSwgb3Igd2hlbiB0aGVcbiAqIGNhbGwgbWF5IHJldHJ5IHdpdGggbm8ga2V5IOKAlCBiZWZvcmUgYW55dGhpbmcgaXMgc2VudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhbGxUb3VjaGVzKFxuICB3aGVyZTogc3RyaW5nLFxuICBvcHRpb25zOiB1bmtub3duLFxuICBwb2xpY3k6IFBpY2s8UmV0cnlQb2xpY3ksICdhdHRlbXB0cyc+LFxuKTogeyByZWFkb25seSBzeXN0ZW06IHN0cmluZzsgcmVhZG9ubHkgaWRlbXBvdGVuY3lLZXk/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZCB7XG4gIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmIChvcHRpb25zID09PSBudWxsIHx8IHR5cGVvZiBvcHRpb25zICE9PSAnb2JqZWN0Jykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYCR7d2hlcmV9OiBvcHRpb25zIG11c3QgYmUgeyB0b3VjaGVzPywgaWRlbXBvdGVuY3lLZXk/IH1gKTtcbiAgfVxuICBjb25zdCB7IHRvdWNoZXMsIGlkZW1wb3RlbmN5S2V5IH0gPSBvcHRpb25zIGFzIENhbGxPcHRpb25zO1xuICBpZiAodG91Y2hlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKGlkZW1wb3RlbmN5S2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYCR7d2hlcmV9OiBhbiBpZGVtcG90ZW5jeUtleSBuYW1lcyBhbiBlZmZlY3Qg4oCUIGRlY2xhcmUgdGhlIHN5c3RlbSBpdCB0b3VjaGVzICh0b3VjaGVzKWApO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IG5hbWVQcm9ibGVtID0gYXR0ZW1wdE5hbWVQcm9ibGVtKHRvdWNoZXMpO1xuICBpZiAobmFtZVByb2JsZW0gIT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYCR7d2hlcmV9OiB0b3VjaGVzICR7bmFtZVByb2JsZW19IOKAlCBpdCBpcyBhIG5hbWUgZnJvbSBjb2RlLCBuZXZlciBhIHZhbHVlYCk7XG4gIH1cbiAgY29uc3Qga2V5ID0gaWRlbXBvdGVuY3lLZXkgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGFkbWl0SWRlbXBvdGVuY3lLZXkod2hlcmUsIGlkZW1wb3RlbmN5S2V5KTtcbiAgY29uc3QgYXR0ZW1wdHMgPSBhdHRlbXB0Q2VpbGluZyhwb2xpY3kuYXR0ZW1wdHMpO1xuICBpZiAoYXR0ZW1wdHMgPiAxICYmIGtleSA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgVHlwZUVycm9yKGAke3doZXJlfTogJHtyZXRyaWVkV2l0aG91dEtleSh0b3VjaGVzLCBhdHRlbXB0cyl9YCk7XG4gIHJldHVybiB7IHN5c3RlbTogdG91Y2hlcywgLi4uKGtleSAhPT0gdW5kZWZpbmVkICYmIHsgaWRlbXBvdGVuY3lLZXk6IGtleSB9KSB9O1xufVxuXG4vKiogV2hhdCBhbiBhdHRlbXB0IHRoYXQgZW5kZWQgYG91dGNvbWVgICh3aXRoIGBlcnJvcmAsIHdoZW4gaXQgZmFpbGVkKSBkaWQgdG8gdGhlIG91dHNpZGUgc3lzdGVtLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVmZmVjdE9mKG91dGNvbWU6IEF0dGVtcHRPdXRjb21lLCBlcnJvcjogdW5rbm93bik6IEF0dGVtcHRFZmZlY3Qge1xuICBpZiAob3V0Y29tZSA9PT0gJ29rJykgcmV0dXJuICdhcHBsaWVkJztcbiAgaWYgKG91dGNvbWUgPT09ICdmYWlsZWQnICYmIGRlY2xhcmVzTm9FZmZlY3QoZXJyb3IpKSByZXR1cm4gJ25vbmUnO1xuICByZXR1cm4gJ3Vua25vd24nO1xufVxuXG4vKiogVGhlIGVycm9yIGl0c2VsZiBzYXlzIG5vdGhpbmcgd2FzIHNlbnQg4oCUIGBlZmZlY3Q6ICdub25lJ2AsIHJlYWQgb25jZTsgYSB2YWx1ZSB0aGF0IGNhbm5vdCBiZSByZWFkIHNheXMgbm90aGluZy4gKi9cbmZ1bmN0aW9uIGRlY2xhcmVzTm9FZmZlY3QoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKGVycm9yID09PSBudWxsIHx8IHR5cGVvZiBlcnJvciAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gKGVycm9yIGFzIHsgZWZmZWN0PzogdW5rbm93biB9KS5lZmZlY3QgPT09ICdub25lJztcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogV2hhdCBhIHRvdWNoaW5nIHNlcmllcyBmYWlscyB3aXRoIHdoZW4gYW55IG9mIGl0cyBhdHRlbXB0cyBsZWZ0IHRoZSBlZmZlY3QgdW5rbm93biDigJQgbmV2ZXIgdGhlIGF0dGVtcHQncyBvd24gZXJyb3IsXG4gKiB3aGljaCBhIGNhbGxlciB3b3VsZCByZWFkIGFzIGEgZmFpbHVyZSBhbmQgcmV0cnkuIFRoZSBrZXkgaXMgdGhlIFJFQ09SREVEIG9uZTogdW5kZXIgYSByZWRhY3Rpb24gcnVsZSB0aGF0IG5hbWVzXG4gKiBpdCwgdGhlIGVycm9yIGNhcnJpZXMgdGhlIHBsYWNlaG9sZGVyLCBhcyBldmVyeSByZWNvcmQgZG9lcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVua25vd25FZmZlY3RFcnJvcih0YXJnZXQ6IEVmZmVjdFRhcmdldCwgcmVjb3JkOiBBdHRlbXB0UmVjb3JkLCBjYXVzZTogdW5rbm93bik6IFVua25vd25FZmZlY3RFcnJvciB7XG4gIHJldHVybiBuZXcgVW5rbm93bkVmZmVjdEVycm9yKHtcbiAgICBzeXN0ZW06IHRhcmdldC5zeXN0ZW0sXG4gICAgLi4uKHJlY29yZGVkS2V5T2YodGFyZ2V0KSAhPT0gdW5kZWZpbmVkICYmIHsgaWRlbXBvdGVuY3lLZXk6IHJlY29yZGVkS2V5T2YodGFyZ2V0KSB9KSxcbiAgICBhdHRlbXB0czogcmVjb3JkLmF0dGVtcHQsXG4gICAgY2F1c2UsXG4gIH0pO1xufVxuXG4vKiogVGhlIGtleSBhcyByZWNvcmRzIGNhcnJ5IGl0OiB0aGUgc2VydmVkIGZvcm0gd2hlbiB0aGUgY2FsbGVyIGdhdmUgb25lLCBlbHNlIHRoZSBrZXkgaXRzZWxmLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlY29yZGVkS2V5T2YodGFyZ2V0OiBFZmZlY3RUYXJnZXQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdGFyZ2V0LnJlY29yZGVkS2V5ID8/IHRhcmdldC5pZGVtcG90ZW5jeUtleTtcbn1cblxuLyoqIFRoZSBydW5uZXIncyByZWZ1c2FsIG9mIGEgdG91Y2hpbmcgc2VyaWVzIHRoYXQgbWF5IHJldHJ5IHdpdGggbm8ga2V5IOKAlCB0aGUgbGF3LCBhdCB0aGUgbGFzdCBkb29yLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZnVzZUtleWxlc3NSZXRyeSh0YXJnZXQ6IEVmZmVjdFRhcmdldCwgYXR0ZW1wdHM6IG51bWJlcik6IHZvaWQge1xuICBpZiAoYXR0ZW1wdHMgPiAxICYmIHRhcmdldC5pZGVtcG90ZW5jeUtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgW2Zvb3RwcmludF0gJHtyZXRyaWVkV2l0aG91dEtleSh0YXJnZXQuc3lzdGVtLCBhdHRlbXB0cyl9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBXaHkgYSB0b3VjaGluZyBzdGFnZSBtYXkgbm90IGJlIFJFLVJVTiBieSBhbiBgaW50ZXJydXB0KClgIHJlc3VtZSwgb3IgYHVuZGVmaW5lZGAgd2hlbiBpdCBtYXkgKFAzKS4gQSByZXN1bWVcbiAqIHJlLXJ1bnMgdGhlIHN0YWdlJ3MgZnVuY3Rpb24gZnJvbSBpdHMgdG9wIOKAlCBhIHNlY29uZCBhdHRlbXB0IG9mIGl0cyBlZmZlY3Qg4oCUIHNvIHRoZSBsYXcgdGhhdCByZWZ1c2VzIGEga2V5bGVzc1xuICogcmV0cnkgcmVmdXNlcyBhIGtleWxlc3MgcmUtcnVuIHRvby4gQXNrZWQgd2hlbiB0aGUgc3RhZ2UgaW50ZXJydXB0cyAoYFN0YWdlUnVubmVyYCkgYW5kIHdoZW4gYSBjaGVja3BvaW50IGlzXG4gKiByZXN1bWVkIChgcnVubmVyL3Jlc3VtZS50cyDCtyBwbGFuUmVzdW1lYCwgZm9yIGEgY2hlY2twb2ludCBtYWRlIGJ5IGFub3RoZXIgdmVyc2lvbiBvZiB0aGUgY2hhcnQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW50ZXJydXB0UHJvYmxlbSh0b3VjaGVzOiBTdGFnZVRvdWNoZXMgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAodG91Y2hlcyA9PT0gdW5kZWZpbmVkIHx8IHRvdWNoZXMuaWRlbXBvdGVuY3lLZXkgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIChcbiAgICBgdG91Y2hlcyBcIiR7dG91Y2hlcy5zeXN0ZW19XCIgd2l0aCBubyBpZGVtcG90ZW5jeUtleSwgYW5kIGEgcmVzdW1lIGFmdGVyIGludGVycnVwdCgpIHJlLXJ1bnMgdGhlIHN0YWdlIGZyb20gaXRzIGAgK1xuICAgICd0b3Ag4oCUIGEgc2Vjb25kIGF0dGVtcHQgb2YgdGhlIGVmZmVjdCB3aXRob3V0IGEga2V5LiBEZWNsYXJlIHRoZSBrZXkgcnVsZSwgb3IgaW50ZXJydXB0IGluIGEgc3RhZ2Ugb2YgaXRzIG93bi4nXG4gICk7XG59XG5cbi8qKiBUaGUgdG91Y2hpbmcgZGVjbGFyYXRpb25zIGByZXN1bWUoKWAgYnVpbGRzIGFyb3VuZCBhIGtleSBhIGNoZWNrcG9pbnQgY2FycmllZCAoYGNhcnJpZWRUb3VjaGVzYCkuICovXG5jb25zdCBDQVJSSUVEID0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpO1xuXG4vKipcbiAqIFRoZSBzdGFuZC1pbidzIGRlY2xhcmF0aW9uIG9uIGEgcmVzdW1lIChQMyk6IHRoZSBwYXVzZWQgc3RhZ2UncyBzeXN0ZW0sIGFuc3dlcmluZyB0aGUga2V5IGl0cyBjaGVja3BvaW50IGNhcnJpZWQg4oCUXG4gKiB0aGUgT1BFUkFUSU9OQUwgdmFsdWUsIHJlYWwgKGNoZWNrcG9pbnRzIGFyZSBleGVtcHQgZnJvbSByZWRhY3Rpb24gYnkgbGF3KS4gSXQgaXMgbWFya2VkLCBzbyB0aGUgcnVuIHNlcnZlcyBpdFxuICogbGlrZSBhIGtleSBvZiB1bmtub3duIHNvdXJjZXM6IHVuZGVyIGFueSBzdGF0ZSBydWxlIHRoZSByZWNvcmRzIGNhcnJ5IHRoZSBwbGFjZWhvbGRlciAoYGlzQ2FycmllZFRvdWNoZXNgKSDigJQgdGhlXG4gKiByZXN1bWVkIGxlZyBubyBsb25nZXIgaG9sZHMgdGhlIGlucHV0IHRoZSBrZXkgd2FzIG1hZGUgb2YsIHNvIGl0IGNhbm5vdCB0ZWxsIHdoZXRoZXIgdGhlIGtleSB3YXMgbWFza2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FycmllZFRvdWNoZXMoc3lzdGVtOiBzdHJpbmcsIGtleTogc3RyaW5nKTogU3RhZ2VUb3VjaGVzIHtcbiAgY29uc3QgdG91Y2hlcyA9IE9iamVjdC5mcmVlemUoeyBzeXN0ZW0sIGlkZW1wb3RlbmN5S2V5OiAoKSA9PiBrZXkgfSk7XG4gIENBUlJJRUQuYWRkKHRvdWNoZXMpO1xuICByZXR1cm4gdG91Y2hlcztcbn1cblxuLyoqIFRoZSBkZWNsYXJhdGlvbiBhbnN3ZXJzIGEga2V5IGEgY2hlY2twb2ludCBjYXJyaWVkICh7QGxpbmsgY2FycmllZFRvdWNoZXN9KS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0NhcnJpZWRUb3VjaGVzKHRvdWNoZXM6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiB0b3VjaGVzID09PSAnb2JqZWN0JyAmJiB0b3VjaGVzICE9PSBudWxsICYmIENBUlJJRUQuaGFzKHRvdWNoZXMpO1xufVxuIl19
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* attempt/errors.ts — the errors the attempt contract throws (design §3.3).
|
|
4
|
+
*
|
|
5
|
+
* - `AttemptTimeoutError` — the attempt's OWN timer ended it (`RetryPolicy.timeoutMs` / the run's deadline). A
|
|
6
|
+
* timeout is the absence of an answer, not a failure of the outside system (law 4); `errorCategory` reads it
|
|
7
|
+
* as `'timeout'`.
|
|
8
|
+
* - `UnknownEffectError` — a side-effecting target's last attempt ended with no answer, so nobody knows whether
|
|
9
|
+
* the effect happened. "Reconcile, do not retry blindly" is on the error, not in prose.
|
|
10
|
+
*
|
|
11
|
+
* The idempotency key is a VALUE: it rides the error as a field (a redaction rule selects it by name) and is
|
|
12
|
+
* never spelled in a message.
|
|
13
|
+
*/
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.UnknownEffectError = exports.AttemptTimeoutError = void 0;
|
|
16
|
+
/** The attempt's own time cap ran out before it answered. */
|
|
17
|
+
class AttemptTimeoutError extends Error {
|
|
18
|
+
/** The attempt that ran out of time, 1-based. */
|
|
19
|
+
attempt;
|
|
20
|
+
/** The cap it ran under, in milliseconds. */
|
|
21
|
+
timeoutMs;
|
|
22
|
+
constructor(attempt, timeoutMs, options) {
|
|
23
|
+
super(`attempt ${attempt} ran out of its ${timeoutMs}ms before it answered`);
|
|
24
|
+
this.name = 'AttemptTimeoutError';
|
|
25
|
+
this.attempt = attempt;
|
|
26
|
+
this.timeoutMs = timeoutMs;
|
|
27
|
+
if (options && Object.prototype.hasOwnProperty.call(options, 'cause'))
|
|
28
|
+
this.cause = options.cause;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
exports.AttemptTimeoutError = AttemptTimeoutError;
|
|
32
|
+
/** A side-effecting target's last attempt ended with no answer: whether the effect happened is unknown. */
|
|
33
|
+
class UnknownEffectError extends Error {
|
|
34
|
+
system;
|
|
35
|
+
attempts;
|
|
36
|
+
constructor(init) {
|
|
37
|
+
super(`"${init.system}": the effect of attempt ${init.attempts} is unknown — reconcile with the system ` +
|
|
38
|
+
'(look the operation up by its idempotency key) before trying again');
|
|
39
|
+
this.name = 'UnknownEffectError';
|
|
40
|
+
this.system = init.system;
|
|
41
|
+
if (init.idempotencyKey !== undefined)
|
|
42
|
+
this.idempotencyKey = init.idempotencyKey;
|
|
43
|
+
this.attempts = init.attempts;
|
|
44
|
+
if (Object.prototype.hasOwnProperty.call(init, 'cause'))
|
|
45
|
+
this.cause = init.cause;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
exports.UnknownEffectError = UnknownEffectError;
|
|
49
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9hdHRlbXB0L2Vycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7O0dBV0c7OztBQUVILDZEQUE2RDtBQUM3RCxNQUFhLG1CQUFvQixTQUFRLEtBQUs7SUFDNUMsaURBQWlEO0lBQ3hDLE9BQU8sQ0FBUztJQUN6Qiw2Q0FBNkM7SUFDcEMsU0FBUyxDQUFTO0lBRTNCLFlBQVksT0FBZSxFQUFFLFNBQWlCLEVBQUUsT0FBc0M7UUFDcEYsS0FBSyxDQUFDLFdBQVcsT0FBTyxtQkFBbUIsU0FBUyx1QkFBdUIsQ0FBQyxDQUFDO1FBQzdFLElBQUksQ0FBQyxJQUFJLEdBQUcscUJBQXFCLENBQUM7UUFDbEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDM0IsSUFBSSxPQUFPLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUM7WUFBRSxJQUFJLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7SUFDcEcsQ0FBQztDQUNGO0FBYkQsa0RBYUM7QUFjRCwyR0FBMkc7QUFDM0csTUFBYSxrQkFBbUIsU0FBUSxLQUFLO0lBQ2xDLE1BQU0sQ0FBUztJQUdmLFFBQVEsQ0FBUztJQUUxQixZQUFZLElBQXVCO1FBQ2pDLEtBQUssQ0FDSCxJQUFJLElBQUksQ0FBQyxNQUFNLDRCQUE0QixJQUFJLENBQUMsUUFBUSwwQ0FBMEM7WUFDaEcsb0VBQW9FLENBQ3ZFLENBQUM7UUFDRixJQUFJLENBQUMsSUFBSSxHQUFHLG9CQUFvQixDQUFDO1FBQ2pDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUMxQixJQUFJLElBQUksQ0FBQyxjQUFjLEtBQUssU0FBUztZQUFFLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUNqRixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDOUIsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQztZQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNuRixDQUFDO0NBQ0Y7QUFqQkQsZ0RBaUJDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBhdHRlbXB0L2Vycm9ycy50cyDigJQgdGhlIGVycm9ycyB0aGUgYXR0ZW1wdCBjb250cmFjdCB0aHJvd3MgKGRlc2lnbiDCpzMuMykuXG4gKlxuICogLSBgQXR0ZW1wdFRpbWVvdXRFcnJvcmAg4oCUIHRoZSBhdHRlbXB0J3MgT1dOIHRpbWVyIGVuZGVkIGl0IChgUmV0cnlQb2xpY3kudGltZW91dE1zYCAvIHRoZSBydW4ncyBkZWFkbGluZSkuIEFcbiAqICAgdGltZW91dCBpcyB0aGUgYWJzZW5jZSBvZiBhbiBhbnN3ZXIsIG5vdCBhIGZhaWx1cmUgb2YgdGhlIG91dHNpZGUgc3lzdGVtIChsYXcgNCk7IGBlcnJvckNhdGVnb3J5YCByZWFkcyBpdFxuICogICBhcyBgJ3RpbWVvdXQnYC5cbiAqIC0gYFVua25vd25FZmZlY3RFcnJvcmAg4oCUIGEgc2lkZS1lZmZlY3RpbmcgdGFyZ2V0J3MgbGFzdCBhdHRlbXB0IGVuZGVkIHdpdGggbm8gYW5zd2VyLCBzbyBub2JvZHkga25vd3Mgd2hldGhlclxuICogICB0aGUgZWZmZWN0IGhhcHBlbmVkLiBcIlJlY29uY2lsZSwgZG8gbm90IHJldHJ5IGJsaW5kbHlcIiBpcyBvbiB0aGUgZXJyb3IsIG5vdCBpbiBwcm9zZS5cbiAqXG4gKiBUaGUgaWRlbXBvdGVuY3kga2V5IGlzIGEgVkFMVUU6IGl0IHJpZGVzIHRoZSBlcnJvciBhcyBhIGZpZWxkIChhIHJlZGFjdGlvbiBydWxlIHNlbGVjdHMgaXQgYnkgbmFtZSkgYW5kIGlzXG4gKiBuZXZlciBzcGVsbGVkIGluIGEgbWVzc2FnZS5cbiAqL1xuXG4vKiogVGhlIGF0dGVtcHQncyBvd24gdGltZSBjYXAgcmFuIG91dCBiZWZvcmUgaXQgYW5zd2VyZWQuICovXG5leHBvcnQgY2xhc3MgQXR0ZW1wdFRpbWVvdXRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgLyoqIFRoZSBhdHRlbXB0IHRoYXQgcmFuIG91dCBvZiB0aW1lLCAxLWJhc2VkLiAqL1xuICByZWFkb25seSBhdHRlbXB0OiBudW1iZXI7XG4gIC8qKiBUaGUgY2FwIGl0IHJhbiB1bmRlciwgaW4gbWlsbGlzZWNvbmRzLiAqL1xuICByZWFkb25seSB0aW1lb3V0TXM6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihhdHRlbXB0OiBudW1iZXIsIHRpbWVvdXRNczogbnVtYmVyLCBvcHRpb25zPzogeyByZWFkb25seSBjYXVzZT86IHVua25vd24gfSkge1xuICAgIHN1cGVyKGBhdHRlbXB0ICR7YXR0ZW1wdH0gcmFuIG91dCBvZiBpdHMgJHt0aW1lb3V0TXN9bXMgYmVmb3JlIGl0IGFuc3dlcmVkYCk7XG4gICAgdGhpcy5uYW1lID0gJ0F0dGVtcHRUaW1lb3V0RXJyb3InO1xuICAgIHRoaXMuYXR0ZW1wdCA9IGF0dGVtcHQ7XG4gICAgdGhpcy50aW1lb3V0TXMgPSB0aW1lb3V0TXM7XG4gICAgaWYgKG9wdGlvbnMgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9wdGlvbnMsICdjYXVzZScpKSB0aGlzLmNhdXNlID0gb3B0aW9ucy5jYXVzZTtcbiAgfVxufVxuXG4vKiogV2hhdCBhbiBgVW5rbm93bkVmZmVjdEVycm9yYCBuYW1lcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVW5rbm93bkVmZmVjdEluaXQge1xuICAvKiogVGhlIG91dHNpZGUgc3lzdGVtIHRoZSBzdGFnZSB0b3VjaGVzIOKAlCBhIG5hbWUsIG5ldmVyIGEgdmFsdWUuICovXG4gIHJlYWRvbmx5IHN5c3RlbTogc3RyaW5nO1xuICAvKiogVGhlIGtleSB0aGUgZWZmZWN0IHdhcyBhdHRlbXB0ZWQgdW5kZXIg4oCUIGEgdmFsdWUsIGtlcHQgYXMgYSBmaWVsZCBhbmQgbmV2ZXIgcHV0IGluIHRoZSBtZXNzYWdlLiAqL1xuICByZWFkb25seSBpZGVtcG90ZW5jeUtleT86IHN0cmluZztcbiAgLyoqIEhvdyBtYW55IGF0dGVtcHRzIHJhbi4gKi9cbiAgcmVhZG9ubHkgYXR0ZW1wdHM6IG51bWJlcjtcbiAgLyoqIFRoZSBsYXN0IGF0dGVtcHQncyBvd24gZXJyb3IuICovXG4gIHJlYWRvbmx5IGNhdXNlPzogdW5rbm93bjtcbn1cblxuLyoqIEEgc2lkZS1lZmZlY3RpbmcgdGFyZ2V0J3MgbGFzdCBhdHRlbXB0IGVuZGVkIHdpdGggbm8gYW5zd2VyOiB3aGV0aGVyIHRoZSBlZmZlY3QgaGFwcGVuZWQgaXMgdW5rbm93bi4gKi9cbmV4cG9ydCBjbGFzcyBVbmtub3duRWZmZWN0RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IHN5c3RlbTogc3RyaW5nO1xuICAvKiogQWJzZW50IChub3QgYHVuZGVmaW5lZGApIHdoZW4gbm8ga2V5IHdhcyBnaXZlbiDigJQgYGRlY2xhcmVgLCBzbyBubyBjbGFzcyBmaWVsZCBpcyBlbWl0dGVkIGZvciBpdC4gKi9cbiAgZGVjbGFyZSByZWFkb25seSBpZGVtcG90ZW5jeUtleT86IHN0cmluZztcbiAgcmVhZG9ubHkgYXR0ZW1wdHM6IG51bWJlcjtcblxuICBjb25zdHJ1Y3Rvcihpbml0OiBVbmtub3duRWZmZWN0SW5pdCkge1xuICAgIHN1cGVyKFxuICAgICAgYFwiJHtpbml0LnN5c3RlbX1cIjogdGhlIGVmZmVjdCBvZiBhdHRlbXB0ICR7aW5pdC5hdHRlbXB0c30gaXMgdW5rbm93biDigJQgcmVjb25jaWxlIHdpdGggdGhlIHN5c3RlbSBgICtcbiAgICAgICAgJyhsb29rIHRoZSBvcGVyYXRpb24gdXAgYnkgaXRzIGlkZW1wb3RlbmN5IGtleSkgYmVmb3JlIHRyeWluZyBhZ2FpbicsXG4gICAgKTtcbiAgICB0aGlzLm5hbWUgPSAnVW5rbm93bkVmZmVjdEVycm9yJztcbiAgICB0aGlzLnN5c3RlbSA9IGluaXQuc3lzdGVtO1xuICAgIGlmIChpbml0LmlkZW1wb3RlbmN5S2V5ICE9PSB1bmRlZmluZWQpIHRoaXMuaWRlbXBvdGVuY3lLZXkgPSBpbml0LmlkZW1wb3RlbmN5S2V5O1xuICAgIHRoaXMuYXR0ZW1wdHMgPSBpbml0LmF0dGVtcHRzO1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoaW5pdCwgJ2NhdXNlJykpIHRoaXMuY2F1c2UgPSBpbml0LmNhdXNlO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* attempt/ — one runner, one record: every attempt the library runs is an `AttemptRecord` with the
|
|
4
|
+
* retry-or-stop decision that followed it (design docs/design/2026-10-time-and-failure-evidence.md).
|
|
5
|
+
*
|
|
6
|
+
* Public: the record's vocabulary, the one failure classifier, the one rule table, the two errors, and `attempt()`
|
|
7
|
+
* — the runner for code that is not a stage (P2). The loop itself (`runAttempts`), `runCall`, the evidence builder
|
|
8
|
+
* and `anySignal` are the engine's. `RetryPolicy` is declared in
|
|
9
|
+
* `./types.ts` and published through the builder's barrel, where it always was.
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.attempt = exports.UnknownEffectError = exports.AttemptTimeoutError = exports.retryRules = exports.TraceparentError = exports.parseTraceparent = exports.formatTraceparent = exports.errorCategory = void 0;
|
|
13
|
+
var category_js_1 = require("./category.js");
|
|
14
|
+
Object.defineProperty(exports, "errorCategory", { enumerable: true, get: function () { return category_js_1.errorCategory; } });
|
|
15
|
+
var correlation_js_1 = require("./correlation.js");
|
|
16
|
+
Object.defineProperty(exports, "formatTraceparent", { enumerable: true, get: function () { return correlation_js_1.formatTraceparent; } });
|
|
17
|
+
Object.defineProperty(exports, "parseTraceparent", { enumerable: true, get: function () { return correlation_js_1.parseTraceparent; } });
|
|
18
|
+
Object.defineProperty(exports, "TraceparentError", { enumerable: true, get: function () { return correlation_js_1.TraceparentError; } });
|
|
19
|
+
var decision_js_1 = require("./decision.js");
|
|
20
|
+
Object.defineProperty(exports, "retryRules", { enumerable: true, get: function () { return decision_js_1.retryRules; } });
|
|
21
|
+
var errors_js_1 = require("./errors.js");
|
|
22
|
+
Object.defineProperty(exports, "AttemptTimeoutError", { enumerable: true, get: function () { return errors_js_1.AttemptTimeoutError; } });
|
|
23
|
+
Object.defineProperty(exports, "UnknownEffectError", { enumerable: true, get: function () { return errors_js_1.UnknownEffectError; } });
|
|
24
|
+
var standalone_js_1 = require("./standalone.js");
|
|
25
|
+
Object.defineProperty(exports, "attempt", { enumerable: true, get: function () { return standalone_js_1.attempt; } });
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2F0dGVtcHQvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7OztHQVFHOzs7QUFFSCw2Q0FBOEM7QUFBckMsNEdBQUEsYUFBYSxPQUFBO0FBRXRCLG1EQUF5RjtBQUFoRixtSEFBQSxpQkFBaUIsT0FBQTtBQUFFLGtIQUFBLGdCQUFnQixPQUFBO0FBQUUsa0hBQUEsZ0JBQWdCLE9BQUE7QUFDOUQsNkNBQTJDO0FBQWxDLHlHQUFBLFVBQVUsT0FBQTtBQUVuQix5Q0FBc0U7QUFBN0QsZ0hBQUEsbUJBQW1CLE9BQUE7QUFBRSwrR0FBQSxrQkFBa0IsT0FBQTtBQUVoRCxpREFBMEM7QUFBakMsd0dBQUEsT0FBTyxPQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBhdHRlbXB0LyDigJQgb25lIHJ1bm5lciwgb25lIHJlY29yZDogZXZlcnkgYXR0ZW1wdCB0aGUgbGlicmFyeSBydW5zIGlzIGFuIGBBdHRlbXB0UmVjb3JkYCB3aXRoIHRoZVxuICogcmV0cnktb3Itc3RvcCBkZWNpc2lvbiB0aGF0IGZvbGxvd2VkIGl0IChkZXNpZ24gZG9jcy9kZXNpZ24vMjAyNi0xMC10aW1lLWFuZC1mYWlsdXJlLWV2aWRlbmNlLm1kKS5cbiAqXG4gKiBQdWJsaWM6IHRoZSByZWNvcmQncyB2b2NhYnVsYXJ5LCB0aGUgb25lIGZhaWx1cmUgY2xhc3NpZmllciwgdGhlIG9uZSBydWxlIHRhYmxlLCB0aGUgdHdvIGVycm9ycywgYW5kIGBhdHRlbXB0KClgXG4gKiDigJQgdGhlIHJ1bm5lciBmb3IgY29kZSB0aGF0IGlzIG5vdCBhIHN0YWdlIChQMikuIFRoZSBsb29wIGl0c2VsZiAoYHJ1bkF0dGVtcHRzYCksIGBydW5DYWxsYCwgdGhlIGV2aWRlbmNlIGJ1aWxkZXJcbiAqIGFuZCBgYW55U2lnbmFsYCBhcmUgdGhlIGVuZ2luZSdzLiBgUmV0cnlQb2xpY3lgIGlzIGRlY2xhcmVkIGluXG4gKiBgLi90eXBlcy50c2AgYW5kIHB1Ymxpc2hlZCB0aHJvdWdoIHRoZSBidWlsZGVyJ3MgYmFycmVsLCB3aGVyZSBpdCBhbHdheXMgd2FzLlxuICovXG5cbmV4cG9ydCB7IGVycm9yQ2F0ZWdvcnkgfSBmcm9tICcuL2NhdGVnb3J5LmpzJztcbmV4cG9ydCB0eXBlIHsgUGFyc2VkVHJhY2VwYXJlbnQsIFRyYWNlcGFyZW50RmllbGRzLCBUcmFjZXBhcmVudFJlZnVzYWwgfSBmcm9tICcuL2NvcnJlbGF0aW9uLmpzJztcbmV4cG9ydCB7IGZvcm1hdFRyYWNlcGFyZW50LCBwYXJzZVRyYWNlcGFyZW50LCBUcmFjZXBhcmVudEVycm9yIH0gZnJvbSAnLi9jb3JyZWxhdGlvbi5qcyc7XG5leHBvcnQgeyByZXRyeVJ1bGVzIH0gZnJvbSAnLi9kZWNpc2lvbi5qcyc7XG5leHBvcnQgdHlwZSB7IFVua25vd25FZmZlY3RJbml0IH0gZnJvbSAnLi9lcnJvcnMuanMnO1xuZXhwb3J0IHsgQXR0ZW1wdFRpbWVvdXRFcnJvciwgVW5rbm93bkVmZmVjdEVycm9yIH0gZnJvbSAnLi9lcnJvcnMuanMnO1xuZXhwb3J0IHR5cGUgeyBBdHRlbXB0T3B0aW9ucyB9IGZyb20gJy4vc3RhbmRhbG9uZS5qcyc7XG5leHBvcnQgeyBhdHRlbXB0IH0gZnJvbSAnLi9zdGFuZGFsb25lLmpzJztcbmV4cG9ydCB0eXBlIHtcbiAgQXR0ZW1wdENhdGVnb3J5LFxuICBBdHRlbXB0Q29udGV4dCxcbiAgQXR0ZW1wdEVmZmVjdCxcbiAgQXR0ZW1wdEVycm9yLFxuICBBdHRlbXB0SW5wdXRzLFxuICBBdHRlbXB0S2luZCxcbiAgQXR0ZW1wdE5leHQsXG4gIEF0dGVtcHRPdXRjb21lLFxuICBBdHRlbXB0UmVhc29uLFxuICBBdHRlbXB0UmVjb3JkLFxuICBBdHRlbXB0U3VtbWFyeSxcbiAgQ2FsbE9wdGlvbnMsXG4gIElkZW1wb3RlbmN5S2V5Q29udGV4dCxcbiAgTGF0ZVdyaXRlLFxuICBPYnNlcnZlZEF0dGVtcHQsXG4gIFJ1bkNvcnJlbGF0aW9uLFxuICBTdGFnZVRvdWNoZXMsXG59IGZyb20gJy4vdHlwZXMuanMnO1xuIl19
|