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,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* attempt/name.ts — the ONE rule for a name an attempt record carries (design §3.6, threat model, packet P2): the
|
|
4
|
+
* target of a `$call` / `attempt()`, a standalone series, and an observed report's target and source.
|
|
5
|
+
*
|
|
6
|
+
* A target is a NAME from code — `'stripe.quotes.create'` — never from a model and never a value. It rides every
|
|
7
|
+
* record, narrative line, recorder row and metric key exactly as given, so a name is refused unless it is a string
|
|
8
|
+
* of 1–{@link MAX_NAME_LENGTH} characters, not blank, with no control (C0, DEL, C1), format (zero-width, bidi
|
|
9
|
+
* overrides), surrogate, line/paragraph-separator, private-use or noncharacter code point:
|
|
10
|
+
* - an empty or blank name names nothing;
|
|
11
|
+
* - an overlong one is a value, or a flood of one;
|
|
12
|
+
* - a control or separator character forges a narrative line or a log record, and a bidi override hides what a
|
|
13
|
+
* line says.
|
|
14
|
+
* The refusal names the FIELD, never the value (P4's precedent): a rejected name may be exactly what must not be
|
|
15
|
+
* echoed. A `TypeError`, because a malformed name is the caller's code breaking its contract.
|
|
16
|
+
*/
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.admitAttemptName = exports.attemptNameProblem = exports.MAX_NAME_LENGTH = void 0;
|
|
19
|
+
/** The longest name an attempt record carries. */
|
|
20
|
+
exports.MAX_NAME_LENGTH = 128;
|
|
21
|
+
/**
|
|
22
|
+
* Control, format, surrogate, line/paragraph-separator, private-use and noncharacter code points — none may sit in a
|
|
23
|
+
* name.
|
|
24
|
+
*/
|
|
25
|
+
const FORBIDDEN = /[\p{Cc}\p{Cf}\p{Cs}\p{Zl}\p{Zp}\p{Co}\p{Noncharacter_Code_Point}]/u;
|
|
26
|
+
/** Why `value` is not a name, or `undefined` when it is one. */
|
|
27
|
+
function attemptNameProblem(value) {
|
|
28
|
+
if (typeof value !== 'string')
|
|
29
|
+
return 'must be a string';
|
|
30
|
+
if (value.trim().length === 0)
|
|
31
|
+
return 'must not be empty or blank';
|
|
32
|
+
if (value.length > exports.MAX_NAME_LENGTH)
|
|
33
|
+
return `must be at most ${exports.MAX_NAME_LENGTH} characters`;
|
|
34
|
+
if (FORBIDDEN.test(value))
|
|
35
|
+
return 'must not contain control, format or line-separator characters';
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
38
|
+
exports.attemptNameProblem = attemptNameProblem;
|
|
39
|
+
/** `value` as a name, or a `TypeError` that names `where` and `field` (never the value). */
|
|
40
|
+
function admitAttemptName(where, field, value) {
|
|
41
|
+
const problem = attemptNameProblem(value);
|
|
42
|
+
if (problem !== undefined) {
|
|
43
|
+
throw new TypeError(`${where}: ${field} ${problem} — it is a name from code, never a value`);
|
|
44
|
+
}
|
|
45
|
+
return value;
|
|
46
|
+
}
|
|
47
|
+
exports.admitAttemptName = admitAttemptName;
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFtZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvYXR0ZW1wdC9uYW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRzs7O0FBRUgsa0RBQWtEO0FBQ3JDLFFBQUEsZUFBZSxHQUFHLEdBQUcsQ0FBQztBQUVuQzs7O0dBR0c7QUFDSCxNQUFNLFNBQVMsR0FBRyxvRUFBb0UsQ0FBQztBQUV2RixnRUFBZ0U7QUFDaEUsU0FBZ0Isa0JBQWtCLENBQUMsS0FBYztJQUMvQyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFBRSxPQUFPLGtCQUFrQixDQUFDO0lBQ3pELElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyw0QkFBNEIsQ0FBQztJQUNuRSxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsdUJBQWU7UUFBRSxPQUFPLG1CQUFtQix1QkFBZSxhQUFhLENBQUM7SUFDM0YsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sK0RBQStELENBQUM7SUFDbEcsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQU5ELGdEQU1DO0FBRUQsNEZBQTRGO0FBQzVGLFNBQWdCLGdCQUFnQixDQUFDLEtBQWEsRUFBRSxLQUFhLEVBQUUsS0FBYztJQUMzRSxNQUFNLE9BQU8sR0FBRyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxQyxJQUFJLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUMxQixNQUFNLElBQUksU0FBUyxDQUFDLEdBQUcsS0FBSyxLQUFLLEtBQUssSUFBSSxPQUFPLDBDQUEwQyxDQUFDLENBQUM7SUFDL0YsQ0FBQztJQUNELE9BQU8sS0FBZSxDQUFDO0FBQ3pCLENBQUM7QUFORCw0Q0FNQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogYXR0ZW1wdC9uYW1lLnRzIOKAlCB0aGUgT05FIHJ1bGUgZm9yIGEgbmFtZSBhbiBhdHRlbXB0IHJlY29yZCBjYXJyaWVzIChkZXNpZ24gwqczLjYsIHRocmVhdCBtb2RlbCwgcGFja2V0IFAyKTogdGhlXG4gKiB0YXJnZXQgb2YgYSBgJGNhbGxgIC8gYGF0dGVtcHQoKWAsIGEgc3RhbmRhbG9uZSBzZXJpZXMsIGFuZCBhbiBvYnNlcnZlZCByZXBvcnQncyB0YXJnZXQgYW5kIHNvdXJjZS5cbiAqXG4gKiBBIHRhcmdldCBpcyBhIE5BTUUgZnJvbSBjb2RlIOKAlCBgJ3N0cmlwZS5xdW90ZXMuY3JlYXRlJ2Ag4oCUIG5ldmVyIGZyb20gYSBtb2RlbCBhbmQgbmV2ZXIgYSB2YWx1ZS4gSXQgcmlkZXMgZXZlcnlcbiAqIHJlY29yZCwgbmFycmF0aXZlIGxpbmUsIHJlY29yZGVyIHJvdyBhbmQgbWV0cmljIGtleSBleGFjdGx5IGFzIGdpdmVuLCBzbyBhIG5hbWUgaXMgcmVmdXNlZCB1bmxlc3MgaXQgaXMgYSBzdHJpbmdcbiAqIG9mIDHigJN7QGxpbmsgTUFYX05BTUVfTEVOR1RIfSBjaGFyYWN0ZXJzLCBub3QgYmxhbmssIHdpdGggbm8gY29udHJvbCAoQzAsIERFTCwgQzEpLCBmb3JtYXQgKHplcm8td2lkdGgsIGJpZGlcbiAqIG92ZXJyaWRlcyksIHN1cnJvZ2F0ZSwgbGluZS9wYXJhZ3JhcGgtc2VwYXJhdG9yLCBwcml2YXRlLXVzZSBvciBub25jaGFyYWN0ZXIgY29kZSBwb2ludDpcbiAqICAgLSBhbiBlbXB0eSBvciBibGFuayBuYW1lIG5hbWVzIG5vdGhpbmc7XG4gKiAgIC0gYW4gb3Zlcmxvbmcgb25lIGlzIGEgdmFsdWUsIG9yIGEgZmxvb2Qgb2Ygb25lO1xuICogICAtIGEgY29udHJvbCBvciBzZXBhcmF0b3IgY2hhcmFjdGVyIGZvcmdlcyBhIG5hcnJhdGl2ZSBsaW5lIG9yIGEgbG9nIHJlY29yZCwgYW5kIGEgYmlkaSBvdmVycmlkZSBoaWRlcyB3aGF0IGFcbiAqICAgICBsaW5lIHNheXMuXG4gKiBUaGUgcmVmdXNhbCBuYW1lcyB0aGUgRklFTEQsIG5ldmVyIHRoZSB2YWx1ZSAoUDQncyBwcmVjZWRlbnQpOiBhIHJlamVjdGVkIG5hbWUgbWF5IGJlIGV4YWN0bHkgd2hhdCBtdXN0IG5vdCBiZVxuICogZWNob2VkLiBBIGBUeXBlRXJyb3JgLCBiZWNhdXNlIGEgbWFsZm9ybWVkIG5hbWUgaXMgdGhlIGNhbGxlcidzIGNvZGUgYnJlYWtpbmcgaXRzIGNvbnRyYWN0LlxuICovXG5cbi8qKiBUaGUgbG9uZ2VzdCBuYW1lIGFuIGF0dGVtcHQgcmVjb3JkIGNhcnJpZXMuICovXG5leHBvcnQgY29uc3QgTUFYX05BTUVfTEVOR1RIID0gMTI4O1xuXG4vKipcbiAqIENvbnRyb2wsIGZvcm1hdCwgc3Vycm9nYXRlLCBsaW5lL3BhcmFncmFwaC1zZXBhcmF0b3IsIHByaXZhdGUtdXNlIGFuZCBub25jaGFyYWN0ZXIgY29kZSBwb2ludHMg4oCUIG5vbmUgbWF5IHNpdCBpbiBhXG4gKiBuYW1lLlxuICovXG5jb25zdCBGT1JCSURERU4gPSAvW1xccHtDY31cXHB7Q2Z9XFxwe0NzfVxccHtabH1cXHB7WnB9XFxwe0NvfVxccHtOb25jaGFyYWN0ZXJfQ29kZV9Qb2ludH1dL3U7XG5cbi8qKiBXaHkgYHZhbHVlYCBpcyBub3QgYSBuYW1lLCBvciBgdW5kZWZpbmVkYCB3aGVuIGl0IGlzIG9uZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhdHRlbXB0TmFtZVByb2JsZW0odmFsdWU6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykgcmV0dXJuICdtdXN0IGJlIGEgc3RyaW5nJztcbiAgaWYgKHZhbHVlLnRyaW0oKS5sZW5ndGggPT09IDApIHJldHVybiAnbXVzdCBub3QgYmUgZW1wdHkgb3IgYmxhbmsnO1xuICBpZiAodmFsdWUubGVuZ3RoID4gTUFYX05BTUVfTEVOR1RIKSByZXR1cm4gYG11c3QgYmUgYXQgbW9zdCAke01BWF9OQU1FX0xFTkdUSH0gY2hhcmFjdGVyc2A7XG4gIGlmIChGT1JCSURERU4udGVzdCh2YWx1ZSkpIHJldHVybiAnbXVzdCBub3QgY29udGFpbiBjb250cm9sLCBmb3JtYXQgb3IgbGluZS1zZXBhcmF0b3IgY2hhcmFjdGVycyc7XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKiBgdmFsdWVgIGFzIGEgbmFtZSwgb3IgYSBgVHlwZUVycm9yYCB0aGF0IG5hbWVzIGB3aGVyZWAgYW5kIGBmaWVsZGAgKG5ldmVyIHRoZSB2YWx1ZSkuICovXG5leHBvcnQgZnVuY3Rpb24gYWRtaXRBdHRlbXB0TmFtZSh3aGVyZTogc3RyaW5nLCBmaWVsZDogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XG4gIGNvbnN0IHByb2JsZW0gPSBhdHRlbXB0TmFtZVByb2JsZW0odmFsdWUpO1xuICBpZiAocHJvYmxlbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgJHt3aGVyZX06ICR7ZmllbGR9ICR7cHJvYmxlbX0g4oCUIGl0IGlzIGEgbmFtZSBmcm9tIGNvZGUsIG5ldmVyIGEgdmFsdWVgKTtcbiAgfVxuICByZXR1cm4gdmFsdWUgYXMgc3RyaW5nO1xufVxuIl19
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* attempt/observed.ts — an attempt the library did NOT run: an outside system's own retry (an SDK's), reported by an
|
|
4
|
+
* adapter through `AttemptContext.observed` (design §3.6, packet P2). Same record shape, kind `'observed'`.
|
|
5
|
+
*
|
|
6
|
+
* WHY: the incident behind this design was four 40 s attempts inside an SDK that the record called "one stage, one
|
|
7
|
+
* error". The best fix is one loop — the SDK's retries off, the call under `scope.$call`. Where an SDK must keep its
|
|
8
|
+
* retries, its adapter reports each one here, so the record says what happened rather than nothing.
|
|
9
|
+
*
|
|
10
|
+
* THREE LAWS.
|
|
11
|
+
* - A report is read, never trusted. Only the named fields are read, each ONCE (a getter cannot answer twice);
|
|
12
|
+
* a name is held to the one name rule (`name.ts`); numbers must be what they say. Anything else on the
|
|
13
|
+
* object — a request body, headers — is never read, so it can never reach a record ({@link readObservedReport}).
|
|
14
|
+
* - The error is served under the run's redaction rule (the owner's `serve`), like every attempt's error; the
|
|
15
|
+
* record keeps its named fields, and no hook is handed the adapter's error object (`raw` is dropped: the
|
|
16
|
+
* library never threw it, and an SDK error can carry its request).
|
|
17
|
+
* - An observed attempt never changes control flow. Its `decision` is the ONE rule table read over what the
|
|
18
|
+
* report states, under the default policy (every error retryable, no deadline) — the library's reading of the
|
|
19
|
+
* SDK's attempt, never the SDK's own decision, which the record cannot know. A report without `of` stands for
|
|
20
|
+
* the SDK's whole call: it is its last attempt, so a failure reads `exhausted`.
|
|
21
|
+
*
|
|
22
|
+
* SERIES. Reports are grouped by {@link ObservedSeriesBook}, owned by whoever owns the attempt they were reported
|
|
23
|
+
* on: a growing attempt number continues its target's series; a number that does not grow opens a new one (the
|
|
24
|
+
* SDK started another call).
|
|
25
|
+
*/
|
|
26
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
27
|
+
exports.ObservedSeriesBook = exports.MAX_OPEN_OBSERVED_SERIES = exports.observedRecord = exports.readObservedReport = void 0;
|
|
28
|
+
const category_js_1 = require("./category.js");
|
|
29
|
+
const decision_js_1 = require("./decision.js");
|
|
30
|
+
const name_js_1 = require("./name.js");
|
|
31
|
+
const record_js_1 = require("./record.js");
|
|
32
|
+
/** The outcomes a report may state — an SDK cannot pause a flowchart. */
|
|
33
|
+
const OUTCOMES = new Set(['ok', 'failed', 'timeout', 'aborted']);
|
|
34
|
+
const WHERE = 'observed()';
|
|
35
|
+
/**
|
|
36
|
+
* Read an adapter's report: the named fields only, each once. A malformed report is refused with a `TypeError`
|
|
37
|
+
* naming the field (never its value).
|
|
38
|
+
*/
|
|
39
|
+
function readObservedReport(report) {
|
|
40
|
+
if (report === null || typeof report !== 'object')
|
|
41
|
+
throw new TypeError(`${WHERE}: the report must be an object`);
|
|
42
|
+
const field = (name) => {
|
|
43
|
+
try {
|
|
44
|
+
return report[name];
|
|
45
|
+
}
|
|
46
|
+
catch (cause) {
|
|
47
|
+
throw new TypeError(`${WHERE}: the report's ${name} could not be read`, { cause });
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
const target = (0, name_js_1.admitAttemptName)(WHERE, 'target', field('target'));
|
|
51
|
+
const rawSource = field('source');
|
|
52
|
+
const source = rawSource === undefined ? 'sdk' : (0, name_js_1.admitAttemptName)(WHERE, 'source', rawSource);
|
|
53
|
+
const rawAttempt = field('attempt');
|
|
54
|
+
const attempt = rawAttempt === undefined ? 1 : count('attempt', rawAttempt);
|
|
55
|
+
const rawOf = field('of');
|
|
56
|
+
const of = rawOf === undefined ? undefined : count('of', rawOf);
|
|
57
|
+
if (of !== undefined && of < attempt)
|
|
58
|
+
throw new TypeError(`${WHERE}: of must be at least attempt`);
|
|
59
|
+
const outcome = field('outcome');
|
|
60
|
+
if (typeof outcome !== 'string' || !OUTCOMES.has(outcome)) {
|
|
61
|
+
throw new TypeError(`${WHERE}: outcome must be one of 'ok', 'failed', 'timeout', 'aborted'`);
|
|
62
|
+
}
|
|
63
|
+
const durationMs = field('durationMs');
|
|
64
|
+
if (typeof durationMs !== 'number' || !Number.isFinite(durationMs) || durationMs < 0) {
|
|
65
|
+
throw new TypeError(`${WHERE}: durationMs must be a finite number >= 0`);
|
|
66
|
+
}
|
|
67
|
+
const startedAt = field('startedAt');
|
|
68
|
+
if (startedAt !== undefined && (typeof startedAt !== 'number' || !Number.isFinite(startedAt))) {
|
|
69
|
+
throw new TypeError(`${WHERE}: startedAt must be a finite number (epoch ms)`);
|
|
70
|
+
}
|
|
71
|
+
const error = field('error');
|
|
72
|
+
return {
|
|
73
|
+
target,
|
|
74
|
+
source,
|
|
75
|
+
attempt,
|
|
76
|
+
...(of !== undefined && { of }),
|
|
77
|
+
outcome: outcome,
|
|
78
|
+
durationMs,
|
|
79
|
+
...(startedAt !== undefined && { startedAt: startedAt }),
|
|
80
|
+
...(error !== undefined && { error }),
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
exports.readObservedReport = readObservedReport;
|
|
84
|
+
function count(name, value) {
|
|
85
|
+
if (typeof value !== 'number' || !Number.isSafeInteger(value) || value < 1) {
|
|
86
|
+
throw new TypeError(`${WHERE}: ${name} must be a whole number >= 1`);
|
|
87
|
+
}
|
|
88
|
+
return value;
|
|
89
|
+
}
|
|
90
|
+
/** The frozen record of a report, and the served error (with `raw`) the `onAttempt` hook carries. */
|
|
91
|
+
function observedRecord(report, init) {
|
|
92
|
+
const failed = report.outcome !== 'ok';
|
|
93
|
+
const category = failed ? (0, category_js_1.errorCategory)(report.error, report.outcome) : undefined;
|
|
94
|
+
const served = failed && report.error !== undefined ? withoutRaw(init.serve(report.error)) : undefined;
|
|
95
|
+
const decision = (0, decision_js_1.decideAttempt)((0, decision_js_1.retryRules)({ attempts: report.of ?? report.attempt }), (key) => readInput(report, category, key));
|
|
96
|
+
const record = (0, record_js_1.freezeDeep)({
|
|
97
|
+
series: init.series,
|
|
98
|
+
kind: 'observed',
|
|
99
|
+
target: report.target,
|
|
100
|
+
source: report.source,
|
|
101
|
+
attempt: report.attempt,
|
|
102
|
+
...(report.of !== undefined && { of: report.of }),
|
|
103
|
+
startedAt: report.startedAt ?? init.now() - report.durationMs,
|
|
104
|
+
durationMs: report.durationMs,
|
|
105
|
+
outcome: report.outcome,
|
|
106
|
+
...(category !== undefined && { category }),
|
|
107
|
+
decision: decision.evidence,
|
|
108
|
+
next: decision.next,
|
|
109
|
+
reason: decision.reason,
|
|
110
|
+
...(served !== undefined && { error: (0, record_js_1.recordedError)(served) }),
|
|
111
|
+
});
|
|
112
|
+
return { record, ...(served !== undefined && { structuredError: served }) };
|
|
113
|
+
}
|
|
114
|
+
exports.observedRecord = observedRecord;
|
|
115
|
+
/**
|
|
116
|
+
* The served error without `raw`: the library never threw an adapter's error, and an SDK error can carry its
|
|
117
|
+
* request (headers, body) — so no hook is handed the value itself, only its served, named fields.
|
|
118
|
+
*/
|
|
119
|
+
function withoutRaw(served) {
|
|
120
|
+
return { ...served, raw: undefined };
|
|
121
|
+
}
|
|
122
|
+
/** The rule table's inputs as the report states them, under the default policy (no deadline, every error retryable). */
|
|
123
|
+
function readInput(report, category, key) {
|
|
124
|
+
switch (key) {
|
|
125
|
+
case 'outcome':
|
|
126
|
+
return report.outcome;
|
|
127
|
+
case 'category':
|
|
128
|
+
return category;
|
|
129
|
+
case 'aborted':
|
|
130
|
+
return report.outcome === 'aborted';
|
|
131
|
+
case 'attempt':
|
|
132
|
+
return report.attempt;
|
|
133
|
+
case 'of':
|
|
134
|
+
return report.of ?? report.attempt;
|
|
135
|
+
case 'timeLeftMs':
|
|
136
|
+
case 'timeLeftAfterWaitMs':
|
|
137
|
+
return Infinity;
|
|
138
|
+
case 'delayMs':
|
|
139
|
+
return 0;
|
|
140
|
+
case 'retryOn':
|
|
141
|
+
return true;
|
|
142
|
+
case 'keyPresent':
|
|
143
|
+
return false;
|
|
144
|
+
default:
|
|
145
|
+
return undefined;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
/** How many distinct target/source pairs one attempt's book remembers — past it, each report opens its own series. */
|
|
149
|
+
exports.MAX_OPEN_OBSERVED_SERIES = 256;
|
|
150
|
+
/**
|
|
151
|
+
* Groups one attempt's observed reports into series. A report continues the open series of its target and source
|
|
152
|
+
* while its attempt number grows; otherwise it opens a new one through `open` (the owner's next call-level series).
|
|
153
|
+
* Bounded: it remembers at most {@link MAX_OPEN_OBSERVED_SERIES} names.
|
|
154
|
+
*/
|
|
155
|
+
class ObservedSeriesBook {
|
|
156
|
+
openSeries;
|
|
157
|
+
open = new Map();
|
|
158
|
+
constructor(openSeries) {
|
|
159
|
+
this.openSeries = openSeries;
|
|
160
|
+
}
|
|
161
|
+
seriesFor(report) {
|
|
162
|
+
// Names hold no control character, so NUL cannot occur in either: the key is unambiguous.
|
|
163
|
+
const key = `${report.source}\u0000${report.target}`;
|
|
164
|
+
const current = this.open.get(key);
|
|
165
|
+
if (current !== undefined && report.attempt > current.last) {
|
|
166
|
+
current.last = report.attempt;
|
|
167
|
+
return current.series;
|
|
168
|
+
}
|
|
169
|
+
const series = this.openSeries();
|
|
170
|
+
if (current !== undefined || this.open.size < exports.MAX_OPEN_OBSERVED_SERIES) {
|
|
171
|
+
this.open.set(key, { series, last: report.attempt });
|
|
172
|
+
}
|
|
173
|
+
return series;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
exports.ObservedSeriesBook = ObservedSeriesBook;
|
|
177
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JzZXJ2ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2F0dGVtcHQvb2JzZXJ2ZWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVCRzs7O0FBR0gsK0NBQThDO0FBQzlDLCtDQUEwRDtBQUMxRCx1Q0FBNkM7QUFDN0MsMkNBQXdEO0FBR3hELHlFQUF5RTtBQUN6RSxNQUFNLFFBQVEsR0FBd0IsSUFBSSxHQUFHLENBQWlCLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztBQUV0RyxNQUFNLEtBQUssR0FBRyxZQUFZLENBQUM7QUFjM0I7OztHQUdHO0FBQ0gsU0FBZ0Isa0JBQWtCLENBQUMsTUFBZTtJQUNoRCxJQUFJLE1BQU0sS0FBSyxJQUFJLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUTtRQUFFLE1BQU0sSUFBSSxTQUFTLENBQUMsR0FBRyxLQUFLLGdDQUFnQyxDQUFDLENBQUM7SUFDakgsTUFBTSxLQUFLLEdBQUcsQ0FBQyxJQUFZLEVBQVcsRUFBRTtRQUN0QyxJQUFJLENBQUM7WUFDSCxPQUFRLE1BQWtDLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkQsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLElBQUksU0FBUyxDQUFDLEdBQUcsS0FBSyxrQkFBa0IsSUFBSSxvQkFBb0IsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDckYsQ0FBQztJQUNILENBQUMsQ0FBQztJQUNGLE1BQU0sTUFBTSxHQUFHLElBQUEsMEJBQWdCLEVBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUNsRSxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbEMsTUFBTSxNQUFNLEdBQUcsU0FBUyxLQUFLLFNBQVMs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IGF0dGVtcHQvb2JzZXJ2ZWQudHMg4oCUIGFuIGF0dGVtcHQgdGhlIGxpYnJhcnkgZGlkIE5PVCBydW46IGFuIG91dHNpZGUgc3lzdGVtJ3Mgb3duIHJldHJ5IChhbiBTREsncyksIHJlcG9ydGVkIGJ5IGFuXG4gKiBhZGFwdGVyIHRocm91Z2ggYEF0dGVtcHRDb250ZXh0Lm9ic2VydmVkYCAoZGVzaWduIMKnMy42LCBwYWNrZXQgUDIpLiBTYW1lIHJlY29yZCBzaGFwZSwga2luZCBgJ29ic2VydmVkJ2AuXG4gKlxuICogV0hZOiB0aGUgaW5jaWRlbnQgYmVoaW5kIHRoaXMgZGVzaWduIHdhcyBmb3VyIDQwIHMgYXR0ZW1wdHMgaW5zaWRlIGFuIFNESyB0aGF0IHRoZSByZWNvcmQgY2FsbGVkIFwib25lIHN0YWdlLCBvbmVcbiAqIGVycm9yXCIuIFRoZSBiZXN0IGZpeCBpcyBvbmUgbG9vcCDigJQgdGhlIFNESydzIHJldHJpZXMgb2ZmLCB0aGUgY2FsbCB1bmRlciBgc2NvcGUuJGNhbGxgLiBXaGVyZSBhbiBTREsgbXVzdCBrZWVwIGl0c1xuICogcmV0cmllcywgaXRzIGFkYXB0ZXIgcmVwb3J0cyBlYWNoIG9uZSBoZXJlLCBzbyB0aGUgcmVjb3JkIHNheXMgd2hhdCBoYXBwZW5lZCByYXRoZXIgdGhhbiBub3RoaW5nLlxuICpcbiAqIFRIUkVFIExBV1MuXG4gKiAgIC0gQSByZXBvcnQgaXMgcmVhZCwgbmV2ZXIgdHJ1c3RlZC4gT25seSB0aGUgbmFtZWQgZmllbGRzIGFyZSByZWFkLCBlYWNoIE9OQ0UgKGEgZ2V0dGVyIGNhbm5vdCBhbnN3ZXIgdHdpY2UpO1xuICogICAgIGEgbmFtZSBpcyBoZWxkIHRvIHRoZSBvbmUgbmFtZSBydWxlIChgbmFtZS50c2ApOyBudW1iZXJzIG11c3QgYmUgd2hhdCB0aGV5IHNheS4gQW55dGhpbmcgZWxzZSBvbiB0aGVcbiAqICAgICBvYmplY3Qg4oCUIGEgcmVxdWVzdCBib2R5LCBoZWFkZXJzIOKAlCBpcyBuZXZlciByZWFkLCBzbyBpdCBjYW4gbmV2ZXIgcmVhY2ggYSByZWNvcmQgKHtAbGluayByZWFkT2JzZXJ2ZWRSZXBvcnR9KS5cbiAqICAgLSBUaGUgZXJyb3IgaXMgc2VydmVkIHVuZGVyIHRoZSBydW4ncyByZWRhY3Rpb24gcnVsZSAodGhlIG93bmVyJ3MgYHNlcnZlYCksIGxpa2UgZXZlcnkgYXR0ZW1wdCdzIGVycm9yOyB0aGVcbiAqICAgICByZWNvcmQga2VlcHMgaXRzIG5hbWVkIGZpZWxkcywgYW5kIG5vIGhvb2sgaXMgaGFuZGVkIHRoZSBhZGFwdGVyJ3MgZXJyb3Igb2JqZWN0IChgcmF3YCBpcyBkcm9wcGVkOiB0aGVcbiAqICAgICBsaWJyYXJ5IG5ldmVyIHRocmV3IGl0LCBhbmQgYW4gU0RLIGVycm9yIGNhbiBjYXJyeSBpdHMgcmVxdWVzdCkuXG4gKiAgIC0gQW4gb2JzZXJ2ZWQgYXR0ZW1wdCBuZXZlciBjaGFuZ2VzIGNvbnRyb2wgZmxvdy4gSXRzIGBkZWNpc2lvbmAgaXMgdGhlIE9ORSBydWxlIHRhYmxlIHJlYWQgb3ZlciB3aGF0IHRoZVxuICogICAgIHJlcG9ydCBzdGF0ZXMsIHVuZGVyIHRoZSBkZWZhdWx0IHBvbGljeSAoZXZlcnkgZXJyb3IgcmV0cnlhYmxlLCBubyBkZWFkbGluZSkg4oCUIHRoZSBsaWJyYXJ5J3MgcmVhZGluZyBvZiB0aGVcbiAqICAgICBTREsncyBhdHRlbXB0LCBuZXZlciB0aGUgU0RLJ3Mgb3duIGRlY2lzaW9uLCB3aGljaCB0aGUgcmVjb3JkIGNhbm5vdCBrbm93LiBBIHJlcG9ydCB3aXRob3V0IGBvZmAgc3RhbmRzIGZvclxuICogICAgIHRoZSBTREsncyB3aG9sZSBjYWxsOiBpdCBpcyBpdHMgbGFzdCBhdHRlbXB0LCBzbyBhIGZhaWx1cmUgcmVhZHMgYGV4aGF1c3RlZGAuXG4gKlxuICogU0VSSUVTLiBSZXBvcnRzIGFyZSBncm91cGVkIGJ5IHtAbGluayBPYnNlcnZlZFNlcmllc0Jvb2t9LCBvd25lZCBieSB3aG9ldmVyIG93bnMgdGhlIGF0dGVtcHQgdGhleSB3ZXJlIHJlcG9ydGVkXG4gKiBvbjogYSBncm93aW5nIGF0dGVtcHQgbnVtYmVyIGNvbnRpbnVlcyBpdHMgdGFyZ2V0J3Mgc2VyaWVzOyBhIG51bWJlciB0aGF0IGRvZXMgbm90IGdyb3cgb3BlbnMgYSBuZXcgb25lICh0aGVcbiAqIFNESyBzdGFydGVkIGFub3RoZXIgY2FsbCkuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBTdHJ1Y3R1cmVkRXJyb3JJbmZvIH0gZnJvbSAnLi4vZXJyb3JzL2Vycm9ySW5mby5qcyc7XG5pbXBvcnQgeyBlcnJvckNhdGVnb3J5IH0gZnJvbSAnLi9jYXRlZ29yeS5qcyc7XG5pbXBvcnQgeyBkZWNpZGVBdHRlbXB0LCByZXRyeVJ1bGVzIH0gZnJvbSAnLi9kZWNpc2lvbi5qcyc7XG5pbXBvcnQgeyBhZG1pdEF0dGVtcHROYW1lIH0gZnJvbSAnLi9uYW1lLmpzJztcbmltcG9ydCB7IGZyZWV6ZURlZXAsIHJlY29yZGVkRXJyb3IgfSBmcm9tICcuL3JlY29yZC5qcyc7XG5pbXBvcnQgdHlwZSB7IEF0dGVtcHRDYXRlZ29yeSwgQXR0ZW1wdE91dGNvbWUsIEF0dGVtcHRSZWNvcmQgfSBmcm9tICcuL3R5cGVzLmpzJztcblxuLyoqIFRoZSBvdXRjb21lcyBhIHJlcG9ydCBtYXkgc3RhdGUg4oCUIGFuIFNESyBjYW5ub3QgcGF1c2UgYSBmbG93Y2hhcnQuICovXG5jb25zdCBPVVRDT01FUzogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQ8QXR0ZW1wdE91dGNvbWU+KFsnb2snLCAnZmFpbGVkJywgJ3RpbWVvdXQnLCAnYWJvcnRlZCddKTtcblxuY29uc3QgV0hFUkUgPSAnb2JzZXJ2ZWQoKSc7XG5cbi8qKiBBIHJlcG9ydCBhcyByZWFkOiBldmVyeSBmaWVsZCBvbmNlLCB2YWxpZGF0ZWQsIGRlZmF1bHRzIGFwcGxpZWQuICovXG5leHBvcnQgaW50ZXJmYWNlIE9ic2VydmVkUmVwb3J0IHtcbiAgcmVhZG9ubHkgdGFyZ2V0OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNvdXJjZTogc3RyaW5nO1xuICByZWFkb25seSBhdHRlbXB0OiBudW1iZXI7XG4gIHJlYWRvbmx5IG9mPzogbnVtYmVyO1xuICByZWFkb25seSBvdXRjb21lOiBFeGNsdWRlPEF0dGVtcHRPdXRjb21lLCAncGF1c2VkJz47XG4gIHJlYWRvbmx5IGR1cmF0aW9uTXM6IG51bWJlcjtcbiAgcmVhZG9ubHkgc3RhcnRlZEF0PzogbnVtYmVyO1xuICByZWFkb25seSBlcnJvcj86IHVua25vd247XG59XG5cbi8qKlxuICogUmVhZCBhbiBhZGFwdGVyJ3MgcmVwb3J0OiB0aGUgbmFtZWQgZmllbGRzIG9ubHksIGVhY2ggb25jZS4gQSBtYWxmb3JtZWQgcmVwb3J0IGlzIHJlZnVzZWQgd2l0aCBhIGBUeXBlRXJyb3JgXG4gKiBuYW1pbmcgdGhlIGZpZWxkIChuZXZlciBpdHMgdmFsdWUpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZE9ic2VydmVkUmVwb3J0KHJlcG9ydDogdW5rbm93bik6IE9ic2VydmVkUmVwb3J0IHtcbiAgaWYgKHJlcG9ydCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVwb3J0ICE9PSAnb2JqZWN0JykgdGhyb3cgbmV3IFR5cGVFcnJvcihgJHtXSEVSRX06IHRoZSByZXBvcnQgbXVzdCBiZSBhbiBvYmplY3RgKTtcbiAgY29uc3QgZmllbGQgPSAobmFtZTogc3RyaW5nKTogdW5rbm93biA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAocmVwb3J0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtuYW1lXTtcbiAgICB9IGNhdGNoIChjYXVzZSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgJHtXSEVSRX06IHRoZSByZXBvcnQncyAke25hbWV9IGNvdWxkIG5vdCBiZSByZWFkYCwgeyBjYXVzZSB9KTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHRhcmdldCA9IGFkbWl0QXR0ZW1wdE5hbWUoV0hFUkUsICd0YXJnZXQnLCBmaWVsZCgndGFyZ2V0JykpO1xuICBjb25zdCByYXdTb3VyY2UgPSBmaWVsZCgnc291cmNlJyk7XG4gIGNvbnN0IHNvdXJjZSA9IHJhd1NvdXJjZSA9PT0gdW5kZWZpbmVkID8gJ3NkaycgOiBhZG1pdEF0dGVtcHROYW1lKFdIRVJFLCAnc291cmNlJywgcmF3U291cmNlKTtcbiAgY29uc3QgcmF3QXR0ZW1wdCA9IGZpZWxkKCdhdHRlbXB0Jyk7XG4gIGNvbnN0IGF0dGVtcHQgPSByYXdBdHRlbXB0ID09PSB1bmRlZmluZWQgPyAxIDogY291bnQoJ2F0dGVtcHQnLCByYXdBdHRlbXB0KTtcbiAgY29uc3QgcmF3T2YgPSBmaWVsZCgnb2YnKTtcbiAgY29uc3Qgb2YgPSByYXdPZiA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogY291bnQoJ29mJywgcmF3T2YpO1xuICBpZiAob2YgIT09IHVuZGVmaW5lZCAmJiBvZiA8IGF0dGVtcHQpIHRocm93IG5ldyBUeXBlRXJyb3IoYCR7V0hFUkV9OiBvZiBtdXN0IGJlIGF0IGxlYXN0IGF0dGVtcHRgKTtcbiAgY29uc3Qgb3V0Y29tZSA9IGZpZWxkKCdvdXRjb21lJyk7XG4gIGlmICh0eXBlb2Ygb3V0Y29tZSAhPT0gJ3N0cmluZycgfHwgIU9VVENPTUVTLmhhcyhvdXRjb21lKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYCR7V0hFUkV9OiBvdXRjb21lIG11c3QgYmUgb25lIG9mICdvaycsICdmYWlsZWQnLCAndGltZW91dCcsICdhYm9ydGVkJ2ApO1xuICB9XG4gIGNvbnN0IGR1cmF0aW9uTXMgPSBmaWVsZCgnZHVyYXRpb25NcycpO1xuICBpZiAodHlwZW9mIGR1cmF0aW9uTXMgIT09ICdudW1iZXInIHx8ICFOdW1iZXIuaXNGaW5pdGUoZHVyYXRpb25NcykgfHwgZHVyYXRpb25NcyA8IDApIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGAke1dIRVJFfTogZHVyYXRpb25NcyBtdXN0IGJlIGEgZmluaXRlIG51bWJlciA+PSAwYCk7XG4gIH1cbiAgY29uc3Qgc3RhcnRlZEF0ID0gZmllbGQoJ3N0YXJ0ZWRBdCcpO1xuICBpZiAoc3RhcnRlZEF0ICE9PSB1bmRlZmluZWQgJiYgKHR5cGVvZiBzdGFydGVkQXQgIT09ICdudW1iZXInIHx8ICFOdW1iZXIuaXNGaW5pdGUoc3RhcnRlZEF0KSkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGAke1dIRVJFfTogc3RhcnRlZEF0IG11c3QgYmUgYSBmaW5pdGUgbnVtYmVyIChlcG9jaCBtcylgKTtcbiAgfVxuICBjb25zdCBlcnJvciA9IGZpZWxkKCdlcnJvcicpO1xuICByZXR1cm4ge1xuICAgIHRhcmdldCxcbiAgICBzb3VyY2UsXG4gICAgYXR0ZW1wdCxcbiAgICAuLi4ob2YgIT09IHVuZGVmaW5lZCAmJiB7IG9mIH0pLFxuICAgIG91dGNvbWU6IG91dGNvbWUgYXMgT2JzZXJ2ZWRSZXBvcnRbJ291dGNvbWUnXSxcbiAgICBkdXJhdGlvbk1zLFxuICAgIC4uLihzdGFydGVkQXQgIT09IHVuZGVmaW5lZCAmJiB7IHN0YXJ0ZWRBdDogc3RhcnRlZEF0IGFzIG51bWJlciB9KSxcbiAgICAuLi4oZXJyb3IgIT09IHVuZGVmaW5lZCAmJiB7IGVycm9yIH0pLFxuICB9O1xufVxuXG5mdW5jdGlvbiBjb3VudChuYW1lOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogbnVtYmVyIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ251bWJlcicgfHwgIU51bWJlci5pc1NhZmVJbnRlZ2VyKHZhbHVlKSB8fCB2YWx1ZSA8IDEpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGAke1dIRVJFfTogJHtuYW1lfSBtdXN0IGJlIGEgd2hvbGUgbnVtYmVyID49IDFgKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbi8qKiBXaGF0IHR1cm5zIGEgcmVwb3J0IGludG8gYSByZWNvcmQg4oCUIHRoZSBvd25lcidzIHNlcmllcywgY2xvY2sgYW5kIHNlcnZlZC1lcnJvciBydWxlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBPYnNlcnZlZFJlY29yZEluaXQge1xuICByZWFkb25seSBzZXJpZXM6IHN0cmluZztcbiAgcmVhZG9ubHkgbm93OiAoKSA9PiBudW1iZXI7XG4gIHJlYWRvbmx5IHNlcnZlOiAoZXJyb3I6IHVua25vd24pID0+IFN0cnVjdHVyZWRFcnJvckluZm87XG59XG5cbi8qKiBUaGUgZnJvemVuIHJlY29yZCBvZiBhIHJlcG9ydCwgYW5kIHRoZSBzZXJ2ZWQgZXJyb3IgKHdpdGggYHJhd2ApIHRoZSBgb25BdHRlbXB0YCBob29rIGNhcnJpZXMuICovXG5leHBvcnQgZnVuY3Rpb24gb2JzZXJ2ZWRSZWNvcmQoXG4gIHJlcG9ydDogT2JzZXJ2ZWRSZXBvcnQsXG4gIGluaXQ6IE9ic2VydmVkUmVjb3JkSW5pdCxcbik6IHsgcmVjb3JkOiBBdHRlbXB0UmVjb3JkOyBzdHJ1Y3R1cmVkRXJyb3I/OiBTdHJ1Y3R1cmVkRXJyb3JJbmZvIH0ge1xuICBjb25zdCBmYWlsZWQgPSByZXBvcnQub3V0Y29tZSAhPT0gJ29rJztcbiAgY29uc3QgY2F0ZWdvcnk6IEF0dGVtcHRDYXRlZ29yeSB8IHVuZGVmaW5lZCA9IGZhaWxlZCA/IGVycm9yQ2F0ZWdvcnkocmVwb3J0LmVycm9yLCByZXBvcnQub3V0Y29tZSkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHNlcnZlZCA9IGZhaWxlZCAmJiByZXBvcnQuZXJyb3IgIT09IHVuZGVmaW5lZCA/IHdpdGhvdXRSYXcoaW5pdC5zZXJ2ZShyZXBvcnQuZXJyb3IpKSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgZGVjaXNpb24gPSBkZWNpZGVBdHRlbXB0KHJldHJ5UnVsZXMoeyBhdHRlbXB0czogcmVwb3J0Lm9mID8/IHJlcG9ydC5hdHRlbXB0IH0pLCAoa2V5KSA9PlxuICAgIHJlYWRJbnB1dChyZXBvcnQsIGNhdGVnb3J5LCBrZXkpLFxuICApO1xuICBjb25zdCByZWNvcmQgPSBmcmVlemVEZWVwPEF0dGVtcHRSZWNvcmQ+KHtcbiAgICBzZXJpZXM6IGluaXQuc2VyaWVzLFxuICAgIGtpbmQ6ICdvYnNlcnZlZCcsXG4gICAgdGFyZ2V0OiByZXBvcnQudGFyZ2V0LFxuICAgIHNvdXJjZTogcmVwb3J0LnNvdXJjZSxcbiAgICBhdHRlbXB0OiByZXBvcnQuYXR0ZW1wdCxcbiAgICAuLi4ocmVwb3J0Lm9mICE9PSB1bmRlZmluZWQgJiYgeyBvZjogcmVwb3J0Lm9mIH0pLFxuICAgIHN0YXJ0ZWRBdDogcmVwb3J0LnN0YXJ0ZWRBdCA/PyBpbml0Lm5vdygpIC0gcmVwb3J0LmR1cmF0aW9uTXMsXG4gICAgZHVyYXRpb25NczogcmVwb3J0LmR1cmF0aW9uTXMsXG4gICAgb3V0Y29tZTogcmVwb3J0Lm91dGNvbWUsXG4gICAgLi4uKGNhdGVnb3J5ICE9PSB1bmRlZmluZWQgJiYgeyBjYXRlZ29yeSB9KSxcbiAgICBkZWNpc2lvbjogZGVjaXNpb24uZXZpZGVuY2UsXG4gICAgbmV4dDogZGVjaXNpb24ubmV4dCxcbiAgICByZWFzb246IGRlY2lzaW9uLnJlYXNvbixcbiAgICAuLi4oc2VydmVkICE9PSB1bmRlZmluZWQgJiYgeyBlcnJvcjogcmVjb3JkZWRFcnJvcihzZXJ2ZWQpIH0pLFxuICB9KTtcbiAgcmV0dXJuIHsgcmVjb3JkLCAuLi4oc2VydmVkICE9PSB1bmRlZmluZWQgJiYgeyBzdHJ1Y3R1cmVkRXJyb3I6IHNlcnZlZCB9KSB9O1xufVxuXG4vKipcbiAqIFRoZSBzZXJ2ZWQgZXJyb3Igd2l0aG91dCBgcmF3YDogdGhlIGxpYnJhcnkgbmV2ZXIgdGhyZXcgYW4gYWRhcHRlcidzIGVycm9yLCBhbmQgYW4gU0RLIGVycm9yIGNhbiBjYXJyeSBpdHNcbiAqIHJlcXVlc3QgKGhlYWRlcnMsIGJvZHkpIOKAlCBzbyBubyBob29rIGlzIGhhbmRlZCB0aGUgdmFsdWUgaXRzZWxmLCBvbmx5IGl0cyBzZXJ2ZWQsIG5hbWVkIGZpZWxkcy5cbiAqL1xuZnVuY3Rpb24gd2l0aG91dFJhdyhzZXJ2ZWQ6IFN0cnVjdHVyZWRFcnJvckluZm8pOiBTdHJ1Y3R1cmVkRXJyb3JJbmZvIHtcbiAgcmV0dXJuIHsgLi4uc2VydmVkLCByYXc6IHVuZGVmaW5lZCB9O1xufVxuXG4vKiogVGhlIHJ1bGUgdGFibGUncyBpbnB1dHMgYXMgdGhlIHJlcG9ydCBzdGF0ZXMgdGhlbSwgdW5kZXIgdGhlIGRlZmF1bHQgcG9saWN5IChubyBkZWFkbGluZSwgZXZlcnkgZXJyb3IgcmV0cnlhYmxlKS4gKi9cbmZ1bmN0aW9uIHJlYWRJbnB1dChyZXBvcnQ6IE9ic2VydmVkUmVwb3J0LCBjYXRlZ29yeTogQXR0ZW1wdENhdGVnb3J5IHwgdW5kZWZpbmVkLCBrZXk6IHN0cmluZyk6IHVua25vd24ge1xuICBzd2l0Y2ggKGtleSkge1xuICAgIGNhc2UgJ291dGNvbWUnOlxuICAgICAgcmV0dXJuIHJlcG9ydC5vdXRjb21lO1xuICAgIGNhc2UgJ2NhdGVnb3J5JzpcbiAgICAgIHJldHVybiBjYXRlZ29yeTtcbiAgICBjYXNlICdhYm9ydGVkJzpcbiAgICAgIHJldHVybiByZXBvcnQub3V0Y29tZSA9PT0gJ2Fib3J0ZWQnO1xuICAgIGNhc2UgJ2F0dGVtcHQnOlxuICAgICAgcmV0dXJuIHJlcG9ydC5hdHRlbXB0O1xuICAgIGNhc2UgJ29mJzpcbiAgICAgIHJldHVybiByZXBvcnQub2YgPz8gcmVwb3J0LmF0dGVtcHQ7XG4gICAgY2FzZSAndGltZUxlZnRNcyc6XG4gICAgY2FzZSAndGltZUxlZnRBZnRlcldhaXRNcyc6XG4gICAgICByZXR1cm4gSW5maW5pdHk7XG4gICAgY2FzZSAnZGVsYXlNcyc6XG4gICAgICByZXR1cm4gMDtcbiAgICBjYXNlICdyZXRyeU9uJzpcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGNhc2UgJ2tleVByZXNlbnQnOlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKiBIb3cgbWFueSBkaXN0aW5jdCB0YXJnZXQvc291cmNlIHBhaXJzIG9uZSBhdHRlbXB0J3MgYm9vayByZW1lbWJlcnMg4oCUIHBhc3QgaXQsIGVhY2ggcmVwb3J0IG9wZW5zIGl0cyBvd24gc2VyaWVzLiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9PUEVOX09CU0VSVkVEX1NFUklFUyA9IDI1NjtcblxuLyoqXG4gKiBHcm91cHMgb25lIGF0dGVtcHQncyBvYnNlcnZlZCByZXBvcnRzIGludG8gc2VyaWVzLiBBIHJlcG9ydCBjb250aW51ZXMgdGhlIG9wZW4gc2VyaWVzIG9mIGl0cyB0YXJnZXQgYW5kIHNvdXJjZVxuICogd2hpbGUgaXRzIGF0dGVtcHQgbnVtYmVyIGdyb3dzOyBvdGhlcndpc2UgaXQgb3BlbnMgYSBuZXcgb25lIHRocm91Z2ggYG9wZW5gICh0aGUgb3duZXIncyBuZXh0IGNhbGwtbGV2ZWwgc2VyaWVzKS5cbiAqIEJvdW5kZWQ6IGl0IHJlbWVtYmVycyBhdCBtb3N0IHtAbGluayBNQVhfT1BFTl9PQlNFUlZFRF9TRVJJRVN9IG5hbWVzLlxuICovXG5leHBvcnQgY2xhc3MgT2JzZXJ2ZWRTZXJpZXNCb29rIHtcbiAgcHJpdmF0ZSByZWFkb25seSBvcGVuID0gbmV3IE1hcDxzdHJpbmcsIHsgc2VyaWVzOiBzdHJpbmc7IGxhc3Q6IG51bWJlciB9PigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgb3BlblNlcmllczogKCkgPT4gc3RyaW5nKSB7fVxuXG4gIHNlcmllc0ZvcihyZXBvcnQ6IFBpY2s8T2JzZXJ2ZWRSZXBvcnQsICd0YXJnZXQnIHwgJ3NvdXJjZScgfCAnYXR0ZW1wdCc+KTogc3RyaW5nIHtcbiAgICAvLyBOYW1lcyBob2xkIG5vIGNvbnRyb2wgY2hhcmFjdGVyLCBzbyBOVUwgY2Fubm90IG9jY3VyIGluIGVpdGhlcjogdGhlIGtleSBpcyB1bmFtYmlndW91cy5cbiAgICBjb25zdCBrZXkgPSBgJHtyZXBvcnQuc291cmNlfVxcdTAwMDAke3JlcG9ydC50YXJnZXR9YDtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5vcGVuLmdldChrZXkpO1xuICAgIGlmIChjdXJyZW50ICE9PSB1bmRlZmluZWQgJiYgcmVwb3J0LmF0dGVtcHQgPiBjdXJyZW50Lmxhc3QpIHtcbiAgICAgIGN1cnJlbnQubGFzdCA9IHJlcG9ydC5hdHRlbXB0O1xuICAgICAgcmV0dXJuIGN1cnJlbnQuc2VyaWVzO1xuICAgIH1cbiAgICBjb25zdCBzZXJpZXMgPSB0aGlzLm9wZW5TZXJpZXMoKTtcbiAgICBpZiAoY3VycmVudCAhPT0gdW5kZWZpbmVkIHx8IHRoaXMub3Blbi5zaXplIDwgTUFYX09QRU5fT0JTRVJWRURfU0VSSUVTKSB7XG4gICAgICB0aGlzLm9wZW4uc2V0KGtleSwgeyBzZXJpZXMsIGxhc3Q6IHJlcG9ydC5hdHRlbXB0IH0pO1xuICAgIH1cbiAgICByZXR1cm4gc2VyaWVzO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* attempt/policy.ts — the ONE reading of a `RetryPolicy`'s ceiling, and the ONE rule for a valid policy.
|
|
4
|
+
*
|
|
5
|
+
* `attemptCeiling` is how many attempts a policy allows. Three readers ask it, so they can never disagree about a
|
|
6
|
+
* stage: the engine's gate (`FlowchartTraverser · executeStage` — does this stage retry at all?), the runner
|
|
7
|
+
* (`runAttempts` — every record's `of`) and the rule table (`retryRules` — rule 4's threshold).
|
|
8
|
+
*
|
|
9
|
+
* `retryPolicyProblem` says why a declared policy is refused. Two doors ask it, with the same words: the builder
|
|
10
|
+
* at build (`FlowChartBuilder · applyRetryPolicy`), and the traverser for a StageNode a stage returns at run time
|
|
11
|
+
* (`FlowchartTraverser · admitDynamicNodes`), which the builder never saw.
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.admitCallPolicy = exports.SINGLE_CALL = exports.attemptTimeoutMs = exports.cappedWaitMs = exports.backoffCeilingMs = exports.retryPolicyProblem = exports.attemptCeiling = void 0;
|
|
15
|
+
/**
|
|
16
|
+
* The attempts a policy allows: its whole number (a fraction is floored, as the 9.15 loop read it), and never
|
|
17
|
+
* fewer than one. Anything that is not a finite number of at least one — `NaN`, `Infinity`, `0`, a negative, a
|
|
18
|
+
* non-number — is `1`: a broken ceiling never loops.
|
|
19
|
+
*/
|
|
20
|
+
function attemptCeiling(attempts) {
|
|
21
|
+
const whole = typeof attempts === 'number' ? Math.floor(attempts) : NaN;
|
|
22
|
+
return Number.isFinite(whole) && whole >= 1 ? whole : 1;
|
|
23
|
+
}
|
|
24
|
+
exports.attemptCeiling = attemptCeiling;
|
|
25
|
+
/**
|
|
26
|
+
* Why `retry` is refused, or `undefined` when it is a valid policy: `attempts` must be a whole number ≥ 1, a
|
|
27
|
+
* declared `timeoutMs` a finite number > 0, and a declared `maxBackoffMs` a finite number ≥ 0. `attempts: 1` is
|
|
28
|
+
* valid on purpose — a policy declared but switched off (or, with a `timeoutMs`, a timeout with no retry).
|
|
29
|
+
*/
|
|
30
|
+
function retryPolicyProblem(retry) {
|
|
31
|
+
const { attempts, timeoutMs, maxBackoffMs } = retry;
|
|
32
|
+
if (!(typeof attempts === 'number' && Number.isInteger(attempts) && attempts >= 1)) {
|
|
33
|
+
return (`retry.attempts must be a whole number >= 1 (got ${String(attempts)}). ` +
|
|
34
|
+
'It counts TOTAL runs including the first, so `attempts: 3` means one run plus up to two retries; ' +
|
|
35
|
+
'`attempts: 1` means the policy is declared but currently off.');
|
|
36
|
+
}
|
|
37
|
+
if (timeoutMs !== undefined && attemptTimeoutMs(timeoutMs) === undefined) {
|
|
38
|
+
return (`retry.timeoutMs must be a finite number of milliseconds > 0 (got ${String(timeoutMs)}). ` +
|
|
39
|
+
'It caps ONE attempt; leave it out for an uncapped attempt.');
|
|
40
|
+
}
|
|
41
|
+
if (maxBackoffMs !== undefined && backoffCeilingMs(maxBackoffMs) === undefined) {
|
|
42
|
+
return (`retry.maxBackoffMs must be a finite number of milliseconds >= 0 (got ${String(maxBackoffMs)}). ` +
|
|
43
|
+
'It caps every wait between attempts; leave it out for an uncapped wait.');
|
|
44
|
+
}
|
|
45
|
+
return undefined;
|
|
46
|
+
}
|
|
47
|
+
exports.retryPolicyProblem = retryPolicyProblem;
|
|
48
|
+
/**
|
|
49
|
+
* The ceiling a policy puts on ONE wait (`maxBackoffMs`): a finite number ≥ 0, else none. The runner caps every
|
|
50
|
+
* wait at it (`waitAfter`), and the static budget check counts each wait at it — one reading, so the check's bound
|
|
51
|
+
* is the runner's law.
|
|
52
|
+
*/
|
|
53
|
+
function backoffCeilingMs(maxBackoffMs) {
|
|
54
|
+
return typeof maxBackoffMs === 'number' && Number.isFinite(maxBackoffMs) && maxBackoffMs >= 0
|
|
55
|
+
? maxBackoffMs
|
|
56
|
+
: undefined;
|
|
57
|
+
}
|
|
58
|
+
exports.backoffCeilingMs = backoffCeilingMs;
|
|
59
|
+
/** A wait the policy's `backoffMs` answered (already defended, `resolveBackoffMs`), capped at its declared ceiling. */
|
|
60
|
+
function cappedWaitMs(waitMs, maxBackoffMs) {
|
|
61
|
+
const ceiling = backoffCeilingMs(maxBackoffMs);
|
|
62
|
+
return ceiling === undefined ? waitMs : Math.min(waitMs, ceiling);
|
|
63
|
+
}
|
|
64
|
+
exports.cappedWaitMs = cappedWaitMs;
|
|
65
|
+
/**
|
|
66
|
+
* The cap a policy puts on one attempt: a finite number > 0, else none. The one reading the engine's gate and the
|
|
67
|
+
* runner share (the builder refuses any other declared value, `retryPolicyProblem`).
|
|
68
|
+
*/
|
|
69
|
+
function attemptTimeoutMs(timeoutMs) {
|
|
70
|
+
return typeof timeoutMs === 'number' && Number.isFinite(timeoutMs) && timeoutMs > 0 ? timeoutMs : undefined;
|
|
71
|
+
}
|
|
72
|
+
exports.attemptTimeoutMs = attemptTimeoutMs;
|
|
73
|
+
/** The policy of a call made with none: one attempt — still recorded (a single call is evidence too). */
|
|
74
|
+
exports.SINGLE_CALL = Object.freeze({ attempts: 1 });
|
|
75
|
+
/**
|
|
76
|
+
* A `$call` / `attempt()` policy as the caller handed it: absent means {@link SINGLE_CALL}; anything else must be a
|
|
77
|
+
* valid `RetryPolicy` (`retryPolicyProblem`) or it is refused with a `TypeError` naming `where` — at the call,
|
|
78
|
+
* before anything runs.
|
|
79
|
+
*/
|
|
80
|
+
function admitCallPolicy(where, policy) {
|
|
81
|
+
if (policy === undefined)
|
|
82
|
+
return exports.SINGLE_CALL;
|
|
83
|
+
if (policy === null || typeof policy !== 'object') {
|
|
84
|
+
throw new TypeError(`${where}: the policy must be a RetryPolicy object ({ attempts, timeoutMs?, backoffMs?, retryOn? })`);
|
|
85
|
+
}
|
|
86
|
+
const problem = retryPolicyProblem(policy);
|
|
87
|
+
if (problem !== undefined)
|
|
88
|
+
throw new TypeError(`${where}: ${problem}`);
|
|
89
|
+
return policy;
|
|
90
|
+
}
|
|
91
|
+
exports.admitCallPolicy = admitCallPolicy;
|
|
92
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9saWN5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9hdHRlbXB0L3BvbGljeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7R0FVRzs7O0FBSUg7Ozs7R0FJRztBQUNILFNBQWdCLGNBQWMsQ0FBQyxRQUFpQjtJQUM5QyxNQUFNLEtBQUssR0FBRyxPQUFPLFFBQVEsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztJQUN4RSxPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUQsQ0FBQztBQUhELHdDQUdDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQWdCLGtCQUFrQixDQUNoQyxLQUFtRTtJQUVuRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsR0FBRyxLQUFLLENBQUM7SUFDcEQsSUFBSSxDQUFDLENBQUMsT0FBTyxRQUFRLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksUUFBUSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDbkYsT0FBTyxDQUNMLG1EQUFtRCxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUs7WUFDeEUsbUdBQW1HO1lBQ25HLCtEQUErRCxDQUNoRSxDQUFDO0lBQ0osQ0FBQztJQUNELElBQUksU0FBUyxLQUFLLFNBQVMsSUFBSSxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN6RSxPQUFPLENBQ0wsb0VBQW9FLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSztZQUMxRiw0REFBNEQsQ0FDN0QsQ0FBQztJQUNKLENBQUM7SUFDRCxJQUFJLFlBQVksS0FBSyxTQUFTLElBQUksZ0JBQWdCLENBQUMsWUFBWSxDQUFDLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDL0UsT0FBTyxDQUNMLHdFQUF3RSxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQUs7WUFDakcseUVBQXlFLENBQzFFLENBQUM7SUFDSixDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQXhCRCxnREF3QkM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBZ0IsZ0JBQWdCLENBQUMsWUFBcUI7SUFDcEQsT0FBTyxPQUFPLFlBQVksS0FBSyxRQUFRLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsSUFBSSxZQUFZLElBQUksQ0FBQztRQUMzRixDQUFDLENBQUMsWUFBWTtRQUNkLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDaEIsQ0FBQztBQUpELDRDQUlDO0FBRUQsdUhBQXVIO0FBQ3ZILFNBQWdCLFlBQVksQ0FBQyxNQUFjLEVBQUUsWUFBcUI7SUFDaEUsTUFBTSxPQUFPLEdBQUcsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDL0MsT0FBTyxPQUFPLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3BFLENBQUM7QUFIRCxvQ0FHQztBQUVEOzs7R0FHRztBQUNILFNBQWdCLGdCQUFnQixDQUFDLFNBQWtCO0lBQ2pELE9BQU8sT0FBTyxTQUFTLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDOUcsQ0FBQztBQUZELDRDQUVDO0FBRUQseUdBQXlHO0FBQzVGLFFBQUEsV0FBVyxHQUFnQixNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7QUFFdkU7Ozs7R0FJRztBQUNILFNBQWdCLGVBQWUsQ0FBQyxLQUFhLEVBQUUsTUFBZTtJQUM1RCxJQUFJLE1BQU0sS0FBSyxTQUFTO1FBQUUsT0FBTyxtQkFBVyxDQUFDO0lBQzdDLElBQUksTUFBTSxLQUFLLElBQUksSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNsRCxNQUFNLElBQUksU0FBUyxDQUNqQixHQUFHLEtBQUssNEZBQTRGLENBQ3JHLENBQUM7SUFDSixDQUFDO0lBQ0QsTUFBTSxPQUFPLEdBQUcsa0JBQWtCLENBQUMsTUFBcUIsQ0FBQyxDQUFDO0lBQzFELElBQUksT0FBTyxLQUFLLFNBQVM7UUFBRSxNQUFNLElBQUksU0FBUyxDQUFDLEdBQUcsS0FBSyxLQUFLLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDdkUsT0FBTyxNQUFxQixDQUFDO0FBQy9CLENBQUM7QUFWRCwwQ0FVQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogYXR0ZW1wdC9wb2xpY3kudHMg4oCUIHRoZSBPTkUgcmVhZGluZyBvZiBhIGBSZXRyeVBvbGljeWAncyBjZWlsaW5nLCBhbmQgdGhlIE9ORSBydWxlIGZvciBhIHZhbGlkIHBvbGljeS5cbiAqXG4gKiBgYXR0ZW1wdENlaWxpbmdgIGlzIGhvdyBtYW55IGF0dGVtcHRzIGEgcG9saWN5IGFsbG93cy4gVGhyZWUgcmVhZGVycyBhc2sgaXQsIHNvIHRoZXkgY2FuIG5ldmVyIGRpc2FncmVlIGFib3V0IGFcbiAqIHN0YWdlOiB0aGUgZW5naW5lJ3MgZ2F0ZSAoYEZsb3djaGFydFRyYXZlcnNlciDCtyBleGVjdXRlU3RhZ2VgIOKAlCBkb2VzIHRoaXMgc3RhZ2UgcmV0cnkgYXQgYWxsPyksIHRoZSBydW5uZXJcbiAqIChgcnVuQXR0ZW1wdHNgIOKAlCBldmVyeSByZWNvcmQncyBgb2ZgKSBhbmQgdGhlIHJ1bGUgdGFibGUgKGByZXRyeVJ1bGVzYCDigJQgcnVsZSA0J3MgdGhyZXNob2xkKS5cbiAqXG4gKiBgcmV0cnlQb2xpY3lQcm9ibGVtYCBzYXlzIHdoeSBhIGRlY2xhcmVkIHBvbGljeSBpcyByZWZ1c2VkLiBUd28gZG9vcnMgYXNrIGl0LCB3aXRoIHRoZSBzYW1lIHdvcmRzOiB0aGUgYnVpbGRlclxuICogYXQgYnVpbGQgKGBGbG93Q2hhcnRCdWlsZGVyIMK3IGFwcGx5UmV0cnlQb2xpY3lgKSwgYW5kIHRoZSB0cmF2ZXJzZXIgZm9yIGEgU3RhZ2VOb2RlIGEgc3RhZ2UgcmV0dXJucyBhdCBydW4gdGltZVxuICogKGBGbG93Y2hhcnRUcmF2ZXJzZXIgwrcgYWRtaXREeW5hbWljTm9kZXNgKSwgd2hpY2ggdGhlIGJ1aWxkZXIgbmV2ZXIgc2F3LlxuICovXG5cbmltcG9ydCB0eXBlIHsgUmV0cnlQb2xpY3kgfSBmcm9tICcuL3R5cGVzLmpzJztcblxuLyoqXG4gKiBUaGUgYXR0ZW1wdHMgYSBwb2xpY3kgYWxsb3dzOiBpdHMgd2hvbGUgbnVtYmVyIChhIGZyYWN0aW9uIGlzIGZsb29yZWQsIGFzIHRoZSA5LjE1IGxvb3AgcmVhZCBpdCksIGFuZCBuZXZlclxuICogZmV3ZXIgdGhhbiBvbmUuIEFueXRoaW5nIHRoYXQgaXMgbm90IGEgZmluaXRlIG51bWJlciBvZiBhdCBsZWFzdCBvbmUg4oCUIGBOYU5gLCBgSW5maW5pdHlgLCBgMGAsIGEgbmVnYXRpdmUsIGFcbiAqIG5vbi1udW1iZXIg4oCUIGlzIGAxYDogYSBicm9rZW4gY2VpbGluZyBuZXZlciBsb29wcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF0dGVtcHRDZWlsaW5nKGF0dGVtcHRzOiB1bmtub3duKTogbnVtYmVyIHtcbiAgY29uc3Qgd2hvbGUgPSB0eXBlb2YgYXR0ZW1wdHMgPT09ICdudW1iZXInID8gTWF0aC5mbG9vcihhdHRlbXB0cykgOiBOYU47XG4gIHJldHVybiBOdW1iZXIuaXNGaW5pdGUod2hvbGUpICYmIHdob2xlID49IDEgPyB3aG9sZSA6IDE7XG59XG5cbi8qKlxuICogV2h5IGByZXRyeWAgaXMgcmVmdXNlZCwgb3IgYHVuZGVmaW5lZGAgd2hlbiBpdCBpcyBhIHZhbGlkIHBvbGljeTogYGF0dGVtcHRzYCBtdXN0IGJlIGEgd2hvbGUgbnVtYmVyIOKJpSAxLCBhXG4gKiBkZWNsYXJlZCBgdGltZW91dE1zYCBhIGZpbml0ZSBudW1iZXIgPiAwLCBhbmQgYSBkZWNsYXJlZCBgbWF4QmFja29mZk1zYCBhIGZpbml0ZSBudW1iZXIg4omlIDAuIGBhdHRlbXB0czogMWAgaXNcbiAqIHZhbGlkIG9uIHB1cnBvc2Ug4oCUIGEgcG9saWN5IGRlY2xhcmVkIGJ1dCBzd2l0Y2hlZCBvZmYgKG9yLCB3aXRoIGEgYHRpbWVvdXRNc2AsIGEgdGltZW91dCB3aXRoIG5vIHJldHJ5KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJldHJ5UG9saWN5UHJvYmxlbShcbiAgcmV0cnk6IFBpY2s8UmV0cnlQb2xpY3ksICdhdHRlbXB0cycgfCAndGltZW91dE1zJyB8ICdtYXhCYWNrb2ZmTXMnPixcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHsgYXR0ZW1wdHMsIHRpbWVvdXRNcywgbWF4QmFja29mZk1zIH0gPSByZXRyeTtcbiAgaWYgKCEodHlwZW9mIGF0dGVtcHRzID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNJbnRlZ2VyKGF0dGVtcHRzKSAmJiBhdHRlbXB0cyA+PSAxKSkge1xuICAgIHJldHVybiAoXG4gICAgICBgcmV0cnkuYXR0ZW1wdHMgbXVzdCBiZSBhIHdob2xlIG51bWJlciA+PSAxIChnb3QgJHtTdHJpbmcoYXR0ZW1wdHMpfSkuIGAgK1xuICAgICAgJ0l0IGNvdW50cyBUT1RBTCBydW5zIGluY2x1ZGluZyB0aGUgZmlyc3QsIHNvIGBhdHRlbXB0czogM2AgbWVhbnMgb25lIHJ1biBwbHVzIHVwIHRvIHR3byByZXRyaWVzOyAnICtcbiAgICAgICdgYXR0ZW1wdHM6IDFgIG1lYW5zIHRoZSBwb2xpY3kgaXMgZGVjbGFyZWQgYnV0IGN1cnJlbnRseSBvZmYuJ1xuICAgICk7XG4gIH1cbiAgaWYgKHRpbWVvdXRNcyAhPT0gdW5kZWZpbmVkICYmIGF0dGVtcHRUaW1lb3V0TXModGltZW91dE1zKSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGByZXRyeS50aW1lb3V0TXMgbXVzdCBiZSBhIGZpbml0ZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzID4gMCAoZ290ICR7U3RyaW5nKHRpbWVvdXRNcyl9KS4gYCArXG4gICAgICAnSXQgY2FwcyBPTkUgYXR0ZW1wdDsgbGVhdmUgaXQgb3V0IGZvciBhbiB1bmNhcHBlZCBhdHRlbXB0LidcbiAgICApO1xuICB9XG4gIGlmIChtYXhCYWNrb2ZmTXMgIT09IHVuZGVmaW5lZCAmJiBiYWNrb2ZmQ2VpbGluZ01zKG1heEJhY2tvZmZNcykgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiAoXG4gICAgICBgcmV0cnkubWF4QmFja29mZk1zIG11c3QgYmUgYSBmaW5pdGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyA+PSAwIChnb3QgJHtTdHJpbmcobWF4QmFja29mZk1zKX0pLiBgICtcbiAgICAgICdJdCBjYXBzIGV2ZXJ5IHdhaXQgYmV0d2VlbiBhdHRlbXB0czsgbGVhdmUgaXQgb3V0IGZvciBhbiB1bmNhcHBlZCB3YWl0LidcbiAgICApO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVGhlIGNlaWxpbmcgYSBwb2xpY3kgcHV0cyBvbiBPTkUgd2FpdCAoYG1heEJhY2tvZmZNc2ApOiBhIGZpbml0ZSBudW1iZXIg4omlIDAsIGVsc2Ugbm9uZS4gVGhlIHJ1bm5lciBjYXBzIGV2ZXJ5XG4gKiB3YWl0IGF0IGl0IChgd2FpdEFmdGVyYCksIGFuZCB0aGUgc3RhdGljIGJ1ZGdldCBjaGVjayBjb3VudHMgZWFjaCB3YWl0IGF0IGl0IOKAlCBvbmUgcmVhZGluZywgc28gdGhlIGNoZWNrJ3MgYm91bmRcbiAqIGlzIHRoZSBydW5uZXIncyBsYXcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiYWNrb2ZmQ2VpbGluZ01zKG1heEJhY2tvZmZNczogdW5rbm93bik6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB0eXBlb2YgbWF4QmFja29mZk1zID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNGaW5pdGUobWF4QmFja29mZk1zKSAmJiBtYXhCYWNrb2ZmTXMgPj0gMFxuICAgID8gbWF4QmFja29mZk1zXG4gICAgOiB1bmRlZmluZWQ7XG59XG5cbi8qKiBBIHdhaXQgdGhlIHBvbGljeSdzIGBiYWNrb2ZmTXNgIGFuc3dlcmVkIChhbHJlYWR5IGRlZmVuZGVkLCBgcmVzb2x2ZUJhY2tvZmZNc2ApLCBjYXBwZWQgYXQgaXRzIGRlY2xhcmVkIGNlaWxpbmcuICovXG5leHBvcnQgZnVuY3Rpb24gY2FwcGVkV2FpdE1zKHdhaXRNczogbnVtYmVyLCBtYXhCYWNrb2ZmTXM6IHVua25vd24pOiBudW1iZXIge1xuICBjb25zdCBjZWlsaW5nID0gYmFja29mZkNlaWxpbmdNcyhtYXhCYWNrb2ZmTXMpO1xuICByZXR1cm4gY2VpbGluZyA9PT0gdW5kZWZpbmVkID8gd2FpdE1zIDogTWF0aC5taW4od2FpdE1zLCBjZWlsaW5nKTtcbn1cblxuLyoqXG4gKiBUaGUgY2FwIGEgcG9saWN5IHB1dHMgb24gb25lIGF0dGVtcHQ6IGEgZmluaXRlIG51bWJlciA+IDAsIGVsc2Ugbm9uZS4gVGhlIG9uZSByZWFkaW5nIHRoZSBlbmdpbmUncyBnYXRlIGFuZCB0aGVcbiAqIHJ1bm5lciBzaGFyZSAodGhlIGJ1aWxkZXIgcmVmdXNlcyBhbnkgb3RoZXIgZGVjbGFyZWQgdmFsdWUsIGByZXRyeVBvbGljeVByb2JsZW1gKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF0dGVtcHRUaW1lb3V0TXModGltZW91dE1zOiB1bmtub3duKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHR5cGVvZiB0aW1lb3V0TXMgPT09ICdudW1iZXInICYmIE51bWJlci5pc0Zpbml0ZSh0aW1lb3V0TXMpICYmIHRpbWVvdXRNcyA+IDAgPyB0aW1lb3V0TXMgOiB1bmRlZmluZWQ7XG59XG5cbi8qKiBUaGUgcG9saWN5IG9mIGEgY2FsbCBtYWRlIHdpdGggbm9uZTogb25lIGF0dGVtcHQg4oCUIHN0aWxsIHJlY29yZGVkIChhIHNpbmdsZSBjYWxsIGlzIGV2aWRlbmNlIHRvbykuICovXG5leHBvcnQgY29uc3QgU0lOR0xFX0NBTEw6IFJldHJ5UG9saWN5ID0gT2JqZWN0LmZyZWV6ZSh7IGF0dGVtcHRzOiAxIH0pO1xuXG4vKipcbiAqIEEgYCRjYWxsYCAvIGBhdHRlbXB0KClgIHBvbGljeSBhcyB0aGUgY2FsbGVyIGhhbmRlZCBpdDogYWJzZW50IG1lYW5zIHtAbGluayBTSU5HTEVfQ0FMTH07IGFueXRoaW5nIGVsc2UgbXVzdCBiZSBhXG4gKiB2YWxpZCBgUmV0cnlQb2xpY3lgIChgcmV0cnlQb2xpY3lQcm9ibGVtYCkgb3IgaXQgaXMgcmVmdXNlZCB3aXRoIGEgYFR5cGVFcnJvcmAgbmFtaW5nIGB3aGVyZWAg4oCUIGF0IHRoZSBjYWxsLFxuICogYmVmb3JlIGFueXRoaW5nIHJ1bnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZG1pdENhbGxQb2xpY3kod2hlcmU6IHN0cmluZywgcG9saWN5OiB1bmtub3duKTogUmV0cnlQb2xpY3kge1xuICBpZiAocG9saWN5ID09PSB1bmRlZmluZWQpIHJldHVybiBTSU5HTEVfQ0FMTDtcbiAgaWYgKHBvbGljeSA9PT0gbnVsbCB8fCB0eXBlb2YgcG9saWN5ICE9PSAnb2JqZWN0Jykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICBgJHt3aGVyZX06IHRoZSBwb2xpY3kgbXVzdCBiZSBhIFJldHJ5UG9saWN5IG9iamVjdCAoeyBhdHRlbXB0cywgdGltZW91dE1zPywgYmFja29mZk1zPywgcmV0cnlPbj8gfSlgLFxuICAgICk7XG4gIH1cbiAgY29uc3QgcHJvYmxlbSA9IHJldHJ5UG9saWN5UHJvYmxlbShwb2xpY3kgYXMgUmV0cnlQb2xpY3kpO1xuICBpZiAocHJvYmxlbSAhPT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgVHlwZUVycm9yKGAke3doZXJlfTogJHtwcm9ibGVtfWApO1xuICByZXR1cm4gcG9saWN5IGFzIFJldHJ5UG9saWN5O1xufVxuIl19
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* attempt/record.ts — how an `AttemptRecord` holds what it holds: frozen to its leaves, and an error only as the run
|
|
4
|
+
* SERVES it, named fields only. One owner, so a record the runner makes (`runner.ts`) and a record an adapter
|
|
5
|
+
* reports (`observed.ts`) can never differ in what they keep.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.freezeDeep = exports.recordedError = void 0;
|
|
9
|
+
/** The record's copy of a served error: its named fields only — never `raw`, never an extra own key. */
|
|
10
|
+
function recordedError(served) {
|
|
11
|
+
return {
|
|
12
|
+
message: served.message,
|
|
13
|
+
...(served.name !== undefined && { name: served.name }),
|
|
14
|
+
...(served.code !== undefined && { code: served.code }),
|
|
15
|
+
...(served.issues !== undefined && { issues: served.issues.map((issue) => ({ ...issue, path: [...issue.path] })) }),
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
exports.recordedError = recordedError;
|
|
19
|
+
/** Freeze a record built of plain objects and arrays, to its leaves. */
|
|
20
|
+
function freezeDeep(value) {
|
|
21
|
+
if (value !== null && typeof value === 'object' && !Object.isFrozen(value)) {
|
|
22
|
+
Object.freeze(value);
|
|
23
|
+
for (const key of Object.keys(value))
|
|
24
|
+
freezeDeep(value[key]);
|
|
25
|
+
}
|
|
26
|
+
return value;
|
|
27
|
+
}
|
|
28
|
+
exports.freezeDeep = freezeDeep;
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9hdHRlbXB0L3JlY29yZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7R0FJRzs7O0FBS0gsd0dBQXdHO0FBQ3hHLFNBQWdCLGFBQWEsQ0FBQyxNQUEyQjtJQUN2RCxPQUFPO1FBQ0wsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO1FBQ3ZCLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLFNBQVMsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdkQsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssU0FBUyxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN2RCxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sS0FBSyxTQUFTLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQ3BILENBQUM7QUFDSixDQUFDO0FBUEQsc0NBT0M7QUFFRCx3RUFBd0U7QUFDeEUsU0FBZ0IsVUFBVSxDQUFJLEtBQVE7SUFDcEMsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUMzRSxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JCLEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7WUFBRSxVQUFVLENBQUUsS0FBaUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzVGLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFORCxnQ0FNQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogYXR0ZW1wdC9yZWNvcmQudHMg4oCUIGhvdyBhbiBgQXR0ZW1wdFJlY29yZGAgaG9sZHMgd2hhdCBpdCBob2xkczogZnJvemVuIHRvIGl0cyBsZWF2ZXMsIGFuZCBhbiBlcnJvciBvbmx5IGFzIHRoZSBydW5cbiAqIFNFUlZFUyBpdCwgbmFtZWQgZmllbGRzIG9ubHkuIE9uZSBvd25lciwgc28gYSByZWNvcmQgdGhlIHJ1bm5lciBtYWtlcyAoYHJ1bm5lci50c2ApIGFuZCBhIHJlY29yZCBhbiBhZGFwdGVyXG4gKiByZXBvcnRzIChgb2JzZXJ2ZWQudHNgKSBjYW4gbmV2ZXIgZGlmZmVyIGluIHdoYXQgdGhleSBrZWVwLlxuICovXG5cbmltcG9ydCB0eXBlIHsgU3RydWN0dXJlZEVycm9ySW5mbyB9IGZyb20gJy4uL2Vycm9ycy9lcnJvckluZm8uanMnO1xuaW1wb3J0IHR5cGUgeyBBdHRlbXB0RXJyb3IgfSBmcm9tICcuL3R5cGVzLmpzJztcblxuLyoqIFRoZSByZWNvcmQncyBjb3B5IG9mIGEgc2VydmVkIGVycm9yOiBpdHMgbmFtZWQgZmllbGRzIG9ubHkg4oCUIG5ldmVyIGByYXdgLCBuZXZlciBhbiBleHRyYSBvd24ga2V5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlY29yZGVkRXJyb3Ioc2VydmVkOiBTdHJ1Y3R1cmVkRXJyb3JJbmZvKTogQXR0ZW1wdEVycm9yIHtcbiAgcmV0dXJuIHtcbiAgICBtZXNzYWdlOiBzZXJ2ZWQubWVzc2FnZSxcbiAgICAuLi4oc2VydmVkLm5hbWUgIT09IHVuZGVmaW5lZCAmJiB7IG5hbWU6IHNlcnZlZC5uYW1lIH0pLFxuICAgIC4uLihzZXJ2ZWQuY29kZSAhPT0gdW5kZWZpbmVkICYmIHsgY29kZTogc2VydmVkLmNvZGUgfSksXG4gICAgLi4uKHNlcnZlZC5pc3N1ZXMgIT09IHVuZGVmaW5lZCAmJiB7IGlzc3Vlczogc2VydmVkLmlzc3Vlcy5tYXAoKGlzc3VlKSA9PiAoeyAuLi5pc3N1ZSwgcGF0aDogWy4uLmlzc3VlLnBhdGhdIH0pKSB9KSxcbiAgfTtcbn1cblxuLyoqIEZyZWV6ZSBhIHJlY29yZCBidWlsdCBvZiBwbGFpbiBvYmplY3RzIGFuZCBhcnJheXMsIHRvIGl0cyBsZWF2ZXMuICovXG5leHBvcnQgZnVuY3Rpb24gZnJlZXplRGVlcDxUPih2YWx1ZTogVCk6IFQge1xuICBpZiAodmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhT2JqZWN0LmlzRnJvemVuKHZhbHVlKSkge1xuICAgIE9iamVjdC5mcmVlemUodmFsdWUpO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHZhbHVlKSkgZnJlZXplRGVlcCgodmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0pO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.retryLoopBudget = exports.declareRetryLoopBudget = exports.takeRetryLoopCall = exports.registerRetryLoopCall = void 0;
|
|
4
|
+
const calls = new WeakMap();
|
|
5
|
+
function registerRetryLoopCall(target, port) {
|
|
6
|
+
if (calls.has(target))
|
|
7
|
+
throw new Error('retry loop: another call is already being prepared on this scope');
|
|
8
|
+
calls.set(target, port);
|
|
9
|
+
return () => {
|
|
10
|
+
if (calls.get(target) === port)
|
|
11
|
+
calls.delete(target);
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
exports.registerRetryLoopCall = registerRetryLoopCall;
|
|
15
|
+
/** Claimed once, so nested calls made by the user's callback do not inherit the outer call's logical identity. */
|
|
16
|
+
function takeRetryLoopCall(target) {
|
|
17
|
+
const port = calls.get(target);
|
|
18
|
+
calls.delete(target);
|
|
19
|
+
return port;
|
|
20
|
+
}
|
|
21
|
+
exports.takeRetryLoopCall = takeRetryLoopCall;
|
|
22
|
+
const budgets = new WeakMap();
|
|
23
|
+
function declareRetryLoopBudget(node, budget) {
|
|
24
|
+
budgets.set(node, Object.freeze({ ...budget }));
|
|
25
|
+
}
|
|
26
|
+
exports.declareRetryLoopBudget = declareRetryLoopBudget;
|
|
27
|
+
function retryLoopBudget(node) {
|
|
28
|
+
return budgets.get(node);
|
|
29
|
+
}
|
|
30
|
+
exports.retryLoopBudget = retryLoopBudget;
|
|
31
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV0cnlMb29wQ29udGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvYXR0ZW1wdC9yZXRyeUxvb3BDb250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQVNBLE1BQU0sS0FBSyxHQUFHLElBQUksT0FBTyxFQUE2QixDQUFDO0FBRXZELFNBQWdCLHFCQUFxQixDQUFDLE1BQWMsRUFBRSxJQUF1QjtJQUMzRSxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxrRUFBa0UsQ0FBQyxDQUFDO0lBQzNHLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3hCLE9BQU8sR0FBRyxFQUFFO1FBQ1YsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUk7WUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZELENBQUMsQ0FBQztBQUNKLENBQUM7QUFORCxzREFNQztBQUVELGtIQUFrSDtBQUNsSCxTQUFnQixpQkFBaUIsQ0FBQyxNQUFjO0lBQzlDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDL0IsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNyQixPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFKRCw4Q0FJQztBQVNELE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxFQUEyQixDQUFDO0FBQ3ZELFNBQWdCLHNCQUFzQixDQUFDLElBQVksRUFBRSxNQUF1QjtJQUMxRSxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDbEQsQ0FBQztBQUZELHdEQUVDO0FBQ0QsU0FBZ0IsZUFBZSxDQUFDLElBQVk7SUFDMUMsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzNCLENBQUM7QUFGRCwwQ0FFQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBJbnRlcm5hbCBvbmUtY2FsbCBwb3J0OiB0aGUgYnVpbGRlciBkZWNsYXJlcyBsb2dpY2FsIGlkZW50aXR5OyB0aGUgY2FsbCBvd25lciBzdGFtcHMgaXQgYmVmb3JlIGRpc3BhdGNoLiAqL1xuaW1wb3J0IHR5cGUgeyBSZXRyeUxvb3BDYWxsIH0gZnJvbSAnLi9yZXRyeUxvb3BUeXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IEF0dGVtcHRSZWNvcmQgfSBmcm9tICcuL3R5cGVzLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBSZXRyeUxvb3BDYWxsUG9ydCB7XG4gIHJlYWRvbmx5IGlkZW50aXR5OiBSZXRyeUxvb3BDYWxsO1xuICByZWFkb25seSByZWNvcmQ6IChyZWNvcmQ6IEF0dGVtcHRSZWNvcmQpID0+IHZvaWQ7XG59XG5cbmNvbnN0IGNhbGxzID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBSZXRyeUxvb3BDYWxsUG9ydD4oKTtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyUmV0cnlMb29wQ2FsbCh0YXJnZXQ6IG9iamVjdCwgcG9ydDogUmV0cnlMb29wQ2FsbFBvcnQpOiAoKSA9PiB2b2lkIHtcbiAgaWYgKGNhbGxzLmhhcyh0YXJnZXQpKSB0aHJvdyBuZXcgRXJyb3IoJ3JldHJ5IGxvb3A6IGFub3RoZXIgY2FsbCBpcyBhbHJlYWR5IGJlaW5nIHByZXBhcmVkIG9uIHRoaXMgc2NvcGUnKTtcbiAgY2FsbHMuc2V0KHRhcmdldCwgcG9ydCk7XG4gIHJldHVybiAoKSA9PiB7XG4gICAgaWYgKGNhbGxzLmdldCh0YXJnZXQpID09PSBwb3J0KSBjYWxscy5kZWxldGUodGFyZ2V0KTtcbiAgfTtcbn1cblxuLyoqIENsYWltZWQgb25jZSwgc28gbmVzdGVkIGNhbGxzIG1hZGUgYnkgdGhlIHVzZXIncyBjYWxsYmFjayBkbyBub3QgaW5oZXJpdCB0aGUgb3V0ZXIgY2FsbCdzIGxvZ2ljYWwgaWRlbnRpdHkuICovXG5leHBvcnQgZnVuY3Rpb24gdGFrZVJldHJ5TG9vcENhbGwodGFyZ2V0OiBvYmplY3QpOiBSZXRyeUxvb3BDYWxsUG9ydCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBvcnQgPSBjYWxscy5nZXQodGFyZ2V0KTtcbiAgY2FsbHMuZGVsZXRlKHRhcmdldCk7XG4gIHJldHVybiBwb3J0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJldHJ5TG9vcEJ1ZGdldCB7XG4gIHJlYWRvbmx5IHBhc3Nlcz86IG51bWJlcjtcbiAgcmVhZG9ubHkgcm9sZTogJ2NhbGxiYWNrJyB8ICdjb250cm9sJyB8ICd3YWl0JztcbiAgcmVhZG9ubHkgdGltZW91dE1zPzogbnVtYmVyO1xuICByZWFkb25seSB3YWl0TXM/OiBudW1iZXI7XG59XG5cbmNvbnN0IGJ1ZGdldHMgPSBuZXcgV2Vha01hcDxvYmplY3QsIFJldHJ5TG9vcEJ1ZGdldD4oKTtcbmV4cG9ydCBmdW5jdGlvbiBkZWNsYXJlUmV0cnlMb29wQnVkZ2V0KG5vZGU6IG9iamVjdCwgYnVkZ2V0OiBSZXRyeUxvb3BCdWRnZXQpOiB2b2lkIHtcbiAgYnVkZ2V0cy5zZXQobm9kZSwgT2JqZWN0LmZyZWV6ZSh7IC4uLmJ1ZGdldCB9KSk7XG59XG5leHBvcnQgZnVuY3Rpb24gcmV0cnlMb29wQnVkZ2V0KG5vZGU6IG9iamVjdCk6IFJldHJ5TG9vcEJ1ZGdldCB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBidWRnZXRzLmdldChub2RlKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV0cnlMb29wVHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2F0dGVtcHQvcmV0cnlMb29wVHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBMb2dpY2FsIGlkZW50aXR5IG9mIGFuIGV4cGxpY2l0IHJldHJ5IHdvcmtmbG93LiBQaHlzaWNhbCBhdHRlbXB0IGlkZW50aXRpZXMgcmVtYWluIHVuY2hhbmdlZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmV0cnlMb29wSWRlbnRpdHkge1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuICByZWFkb25seSBzZXJpZXM6IHN0cmluZztcbiAgcmVhZG9ubHkgYXR0ZW1wdDogbnVtYmVyO1xuICByZWFkb25seSBvZjogbnVtYmVyO1xufVxuXG4vKiogVGhlIHJvbGUgb2Ygb25lIHBoeXNpY2FsIGNhbGwgaW5zaWRlIGEgbG9naWNhbCBwYXNzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXRyeUxvb3BDYWxsIGV4dGVuZHMgUmV0cnlMb29wSWRlbnRpdHkge1xuICByZWFkb25seSBwaGFzZTogJ2F0dGVtcHQnIHwgJ3JlY29uY2lsZSc7XG59XG5cbi8qKiBUaGUgZXhwbGljaXQgY2hhcnQgZGVjaXNpb24sIGFmdGVyIHJlY29uY2lsaWF0aW9uOyBuZXZlciByZXdyaXRlcyBhIHBoeXNpY2FsIGNhbGwncyBvdXRjb21lLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXRyeUxvb3BEZWNpc2lvbiBleHRlbmRzIFJldHJ5TG9vcElkZW50aXR5IHtcbiAgcmVhZG9ubHkgZWZmZWN0OiAnYXBwbGllZCcgfCAnbm9uZScgfCAndW5rbm93bic7XG4gIHJlYWRvbmx5IHJlY29uY2lsZWQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5IG5leHQ6ICdyZXRyeScgfCAnZG9uZScgfCAnc3RvcCc7XG4gIHJlYWRvbmx5IHJlYXNvbjogc3RyaW5nO1xufVxuIl19
|