@workflow/core 5.0.0-beta.42 → 5.0.0-beta.44
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/dist/capabilities.d.ts +4 -4
- package/dist/capabilities.js +5 -5
- package/dist/capture-stack.d.ts +1 -1
- package/dist/capture-stack.js +2 -2
- package/dist/class-serialization.d.ts +8 -8
- package/dist/class-serialization.js +9 -9
- package/dist/classify-error.js +5 -5
- package/dist/context-violation-error.d.ts +5 -5
- package/dist/context-violation-error.d.ts.map +1 -1
- package/dist/context-violation-error.js +5 -5
- package/dist/create-hook.d.ts +10 -6
- package/dist/create-hook.d.ts.map +1 -1
- package/dist/create-hook.js +1 -1
- package/dist/define-hook.js +2 -2
- package/dist/describe-error.d.ts +7 -7
- package/dist/describe-error.js +8 -8
- package/dist/encryption.d.ts +5 -5
- package/dist/encryption.js +7 -7
- package/dist/events-consumer.d.ts +19 -7
- package/dist/events-consumer.d.ts.map +1 -1
- package/dist/events-consumer.js +33 -12
- package/dist/flushable-stream.d.ts +4 -4
- package/dist/flushable-stream.js +12 -12
- package/dist/global.d.ts +1 -1
- package/dist/global.js +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2 -2
- package/dist/log-format.d.ts +2 -2
- package/dist/log-format.js +5 -5
- package/dist/logger.js +4 -4
- package/dist/private.d.ts +39 -64
- package/dist/private.d.ts.map +1 -1
- package/dist/private.js +294 -48
- package/dist/replay-payload-cache.d.ts +1 -1
- package/dist/replay-payload-cache.js +4 -4
- package/dist/runtime/compute-instance.d.ts +4 -3
- package/dist/runtime/compute-instance.d.ts.map +1 -1
- package/dist/runtime/compute-instance.js +5 -4
- package/dist/runtime/constants.d.ts +46 -19
- package/dist/runtime/constants.d.ts.map +1 -1
- package/dist/runtime/constants.js +76 -38
- package/dist/runtime/count-step-started-events.d.ts +7 -7
- package/dist/runtime/count-step-started-events.js +4 -4
- package/dist/runtime/deployment-guard.d.ts +7 -7
- package/dist/runtime/deployment-guard.js +8 -8
- package/dist/runtime/get-port-lazy.d.ts +2 -2
- package/dist/runtime/get-port-lazy.d.ts.map +1 -1
- package/dist/runtime/get-port-lazy.js +37 -30
- package/dist/runtime/get-world-lazy.d.ts +2 -2
- package/dist/runtime/get-world-lazy.js +3 -3
- package/dist/runtime/helpers.d.ts +18 -18
- package/dist/runtime/helpers.js +27 -27
- package/dist/runtime/quickjs-entrypoint.d.ts +23 -10
- package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -1
- package/dist/runtime/quickjs-entrypoint.js +200 -81
- package/dist/runtime/quickjs-runtime.d.ts +31 -15
- package/dist/runtime/quickjs-runtime.d.ts.map +1 -1
- package/dist/runtime/quickjs-runtime.js +126 -77
- package/dist/runtime/quickjs-serde.d.ts +10 -10
- package/dist/runtime/quickjs-serde.js +20 -20
- package/dist/runtime/replay-budget.d.ts +4 -4
- package/dist/runtime/replay-budget.js +5 -5
- package/dist/runtime/replay-recovery-reporter.d.ts +1 -1
- package/dist/runtime/replay-recovery-reporter.js +2 -2
- package/dist/runtime/resume-hook.d.ts +2 -2
- package/dist/runtime/resume-hook.js +27 -27
- package/dist/runtime/resume-latency.d.ts +25 -25
- package/dist/runtime/resume-latency.d.ts.map +1 -1
- package/dist/runtime/resume-latency.js +4 -4
- package/dist/runtime/run-id-time.d.ts +2 -2
- package/dist/runtime/run-id-time.js +5 -5
- package/dist/runtime/run.d.ts +21 -4
- package/dist/runtime/run.d.ts.map +1 -1
- package/dist/runtime/run.js +154 -35
- package/dist/runtime/runs.d.ts +4 -4
- package/dist/runtime/runs.js +2 -2
- package/dist/runtime/start.d.ts +3 -3
- package/dist/runtime/start.d.ts.map +1 -1
- package/dist/runtime/start.js +27 -23
- package/dist/runtime/step-executor.d.ts +59 -11
- package/dist/runtime/step-executor.d.ts.map +1 -1
- package/dist/runtime/step-executor.js +116 -42
- package/dist/runtime/step-latency.d.ts +20 -14
- package/dist/runtime/step-latency.d.ts.map +1 -1
- package/dist/runtime/step-latency.js +13 -11
- package/dist/runtime/step-ownership.d.ts +6 -6
- package/dist/runtime/step-ownership.js +8 -8
- package/dist/runtime/step-single-flight.d.ts +1 -1
- package/dist/runtime/step-single-flight.d.ts.map +1 -1
- package/dist/runtime/step-single-flight.js +17 -11
- package/dist/runtime/suspension-handler.d.ts +99 -7
- package/dist/runtime/suspension-handler.d.ts.map +1 -1
- package/dist/runtime/suspension-handler.js +678 -57
- package/dist/runtime/unserializable-step.d.ts +34 -0
- package/dist/runtime/unserializable-step.d.ts.map +1 -0
- package/dist/runtime/unserializable-step.js +52 -0
- package/dist/runtime/vm-mode.d.ts +1 -1
- package/dist/runtime/vm-mode.js +2 -2
- package/dist/runtime/wait-continuation.d.ts +31 -9
- package/dist/runtime/wait-continuation.d.ts.map +1 -1
- package/dist/runtime/wait-continuation.js +44 -13
- package/dist/runtime/wait-until.d.ts +1 -1
- package/dist/runtime/wait-until.js +2 -2
- package/dist/runtime/world-compatibility.d.ts +20 -9
- package/dist/runtime/world-compatibility.d.ts.map +1 -1
- package/dist/runtime/world-compatibility.js +24 -13
- package/dist/runtime/world-init.d.ts +5 -5
- package/dist/runtime/world-init.js +6 -6
- package/dist/runtime/world.d.ts.map +1 -1
- package/dist/runtime/world.js +13 -3
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +417 -213
- package/dist/sealed-box.d.ts +7 -7
- package/dist/sealed-box.js +15 -15
- package/dist/serialization/client.js +2 -2
- package/dist/serialization/codec-devalue-vm.d.ts +1 -1
- package/dist/serialization/codec-devalue-vm.js +4 -4
- package/dist/serialization/codec-devalue.d.ts +1 -1
- package/dist/serialization/codec-devalue.js +2 -2
- package/dist/serialization/codec.d.ts +4 -4
- package/dist/serialization/codec.js +2 -2
- package/dist/serialization/compression.d.ts +12 -11
- package/dist/serialization/compression.d.ts.map +1 -1
- package/dist/serialization/compression.js +16 -15
- package/dist/serialization/encryption.d.ts +7 -7
- package/dist/serialization/encryption.d.ts.map +1 -1
- package/dist/serialization/encryption.js +8 -8
- package/dist/serialization/errors.js +2 -2
- package/dist/serialization/format.d.ts +6 -6
- package/dist/serialization/format.js +7 -7
- package/dist/serialization/hardened.d.ts +18 -18
- package/dist/serialization/hardened.d.ts.map +1 -1
- package/dist/serialization/hardened.js +41 -32
- package/dist/serialization/index.d.ts +1 -1
- package/dist/serialization/index.js +2 -2
- package/dist/serialization/reducers/class-vm.d.ts +1 -1
- package/dist/serialization/reducers/class-vm.js +2 -2
- package/dist/serialization/reducers/class.js +2 -2
- package/dist/serialization/reducers/common-vm.js +12 -12
- package/dist/serialization/reducers/common.js +12 -12
- package/dist/serialization/reducers/step-function-vm.d.ts +1 -1
- package/dist/serialization/reducers/step-function-vm.js +2 -2
- package/dist/serialization/reducers/step-function.js +2 -2
- package/dist/serialization/step.js +2 -2
- package/dist/serialization/types.d.ts +5 -5
- package/dist/serialization/types.js +2 -2
- package/dist/serialization/workflow-vm.d.ts +1 -1
- package/dist/serialization/workflow-vm.d.ts.map +1 -1
- package/dist/serialization/workflow-vm.js +13 -10
- package/dist/serialization-format.d.ts +11 -11
- package/dist/serialization-format.d.ts.map +1 -1
- package/dist/serialization-format.js +29 -23
- package/dist/serialization.d.ts +20 -12
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +141 -99
- package/dist/set-attributes.js +2 -2
- package/dist/source-map.d.ts +1 -1
- package/dist/source-map.d.ts.map +1 -1
- package/dist/source-map.js +18 -12
- package/dist/step/context-storage.d.ts +5 -5
- package/dist/step/context-storage.js +1 -1
- package/dist/step/writable-stream.d.ts +3 -3
- package/dist/step/writable-stream.js +7 -7
- package/dist/step.js +12 -12
- package/dist/symbols.d.ts +2 -2
- package/dist/symbols.js +3 -3
- package/dist/telemetry/semantic-conventions.d.ts +21 -13
- package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
- package/dist/telemetry/semantic-conventions.js +21 -15
- package/dist/telemetry.d.ts +9 -3
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +40 -10
- package/dist/test-support/orchestrator-context.d.ts.map +1 -1
- package/dist/test-support/orchestrator-context.js +12 -2
- package/dist/version.d.ts +1 -1
- package/dist/version.js +2 -2
- package/dist/vm/index.js +4 -4
- package/dist/vm/script-cache.d.ts.map +1 -1
- package/dist/vm/script-cache.js +23 -17
- package/dist/vm/uint8array-base64.js +1 -1
- package/dist/workflow/abort-controller.d.ts +1 -1
- package/dist/workflow/abort-controller.js +12 -12
- package/dist/workflow/create-hook.js +3 -3
- package/dist/workflow/get-workflow-metadata.js +2 -2
- package/dist/workflow/hook.js +18 -18
- package/dist/workflow/set-attributes.d.ts +1 -1
- package/dist/workflow/set-attributes.js +2 -2
- package/dist/workflow/sleep.js +2 -2
- package/dist/workflow/world-init-stub.d.ts +1 -1
- package/dist/workflow/world-init-stub.js +2 -2
- package/dist/workflow.d.ts +2 -2
- package/dist/workflow.js +36 -14
- package/docs/api-reference/create-hook.mdx +15 -15
- package/docs/api-reference/create-webhook.mdx +15 -15
- package/docs/api-reference/define-hook.mdx +10 -10
- package/docs/api-reference/fatal-error.mdx +2 -2
- package/docs/api-reference/fetch.mdx +7 -7
- package/docs/api-reference/get-step-metadata.mdx +2 -2
- package/docs/api-reference/get-workflow-metadata.mdx +3 -3
- package/docs/api-reference/get-writable.mdx +7 -7
- package/docs/api-reference/index.mdx +1 -1
- package/docs/api-reference/retryable-error.mdx +1 -1
- package/docs/api-reference/set-attributes.mdx +2 -2
- package/docs/api-reference/sleep.mdx +3 -3
- package/docs/foundations/cancellation.mdx +31 -31
- package/docs/foundations/errors-and-retries.mdx +42 -11
- package/docs/foundations/hooks.mdx +37 -37
- package/docs/foundations/idempotency.mdx +9 -9
- package/docs/foundations/serialization.mdx +21 -22
- package/docs/foundations/starting-workflows.mdx +36 -37
- package/docs/foundations/streaming.mdx +68 -39
- package/docs/foundations/versioning.mdx +3 -3
- package/docs/foundations/workflows-and-steps.mdx +9 -9
- package/docs/how-it-works/cancellation.mdx +62 -62
- package/docs/how-it-works/code-transform.mdx +66 -54
- package/docs/how-it-works/encryption.mdx +25 -21
- package/docs/how-it-works/event-sourcing.mdx +84 -28
- package/docs/how-it-works/framework-integrations.mdx +12 -12
- package/docs/how-it-works/understanding-directives.mdx +21 -21
- package/package.json +7 -7
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared shape for finalizing a step whose arguments failed to serialize
|
|
3
|
+
* (used by both the node:vm suspension handler and the QuickJS entrypoint).
|
|
4
|
+
*
|
|
5
|
+
* The world requires a `step_created` before any terminal step event, and
|
|
6
|
+
* the step's real input is precisely what refused to serialize, so the
|
|
7
|
+
* finalization writes a placeholder input. The marker string makes the
|
|
8
|
+
* placeholder distinguishable from a genuine zero-argument step in
|
|
9
|
+
* `workflow inspect steps` and the observability UI: a reader sees
|
|
10
|
+
* "input unavailable" instead of "no arguments".
|
|
11
|
+
*/
|
|
12
|
+
export declare const UNSERIALIZABLE_STEP_INPUT_MARKER = "[input unavailable: step argument serialization failed]";
|
|
13
|
+
/**
|
|
14
|
+
* The placeholder value serialized into the failed step's `step_created`
|
|
15
|
+
* input. Matches the `{ args, closureVars, thisVal }` triple
|
|
16
|
+
* `dehydrateStepArguments` / the QuickJS bootstrap produce for real steps,
|
|
17
|
+
* so every consumer hydrates it uniformly, plus the structural flag the
|
|
18
|
+
* step executor checks before running user code (see
|
|
19
|
+
* {@link isUnserializableStepInputPlaceholder}).
|
|
20
|
+
*/
|
|
21
|
+
export declare function unserializableStepInputPlaceholder(): Record<string, unknown>;
|
|
22
|
+
/**
|
|
23
|
+
* Whether a hydrated step input is the finalization placeholder.
|
|
24
|
+
*
|
|
25
|
+
* Finalization writes `step_created` (placeholder) and `step_failed` as two
|
|
26
|
+
* separate durable writes; a crash or transient failure between them leaves
|
|
27
|
+
* a pending step whose stored input is the placeholder. Redelivery then
|
|
28
|
+
* dispatches that step through normal crash recovery: the executor calls
|
|
29
|
+
* this before running user code and completes the intended failure (a fatal
|
|
30
|
+
* SerializationError → `step_failed`) instead of silently invoking the step
|
|
31
|
+
* body with placeholder arguments.
|
|
32
|
+
*/
|
|
33
|
+
export declare function isUnserializableStepInputPlaceholder(hydratedInput: unknown): boolean;
|
|
34
|
+
//# sourceMappingURL=unserializable-step.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unserializable-step.d.ts","sourceRoot":"","sources":["../../src/runtime/unserializable-step.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,eAAO,MAAM,gCAAgC,4DACc,CAAC;AAU5D;;;;;;;GAOG;AACH,wBAAgB,kCAAkC,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAO5E;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,oCAAoC,CAClD,aAAa,EAAE,OAAO,GACrB,OAAO,CAMT"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared shape for finalizing a step whose arguments failed to serialize
|
|
3
|
+
* (used by both the node:vm suspension handler and the QuickJS entrypoint).
|
|
4
|
+
*
|
|
5
|
+
* The world requires a `step_created` before any terminal step event, and
|
|
6
|
+
* the step's real input is precisely what refused to serialize, so the
|
|
7
|
+
* finalization writes a placeholder input. The marker string makes the
|
|
8
|
+
* placeholder distinguishable from a genuine zero-argument step in
|
|
9
|
+
* `workflow inspect steps` and the observability UI: a reader sees
|
|
10
|
+
* "input unavailable" instead of "no arguments".
|
|
11
|
+
*/
|
|
12
|
+
export const UNSERIALIZABLE_STEP_INPUT_MARKER = '[input unavailable: step argument serialization failed]';
|
|
13
|
+
/**
|
|
14
|
+
* Structural discriminator on the placeholder's top level. The
|
|
15
|
+
* `{ args, closureVars, thisVal }` triple is built by the SDK (user code
|
|
16
|
+
* never controls its top-level keys), so this flag cannot false-positive on
|
|
17
|
+
* a legitimate input, unlike the display marker inside `args`.
|
|
18
|
+
*/
|
|
19
|
+
const UNSERIALIZABLE_FLAG = '__workflowUnserializableStepInput';
|
|
20
|
+
/**
|
|
21
|
+
* The placeholder value serialized into the failed step's `step_created`
|
|
22
|
+
* input. Matches the `{ args, closureVars, thisVal }` triple
|
|
23
|
+
* `dehydrateStepArguments` / the QuickJS bootstrap produce for real steps,
|
|
24
|
+
* so every consumer hydrates it uniformly, plus the structural flag the
|
|
25
|
+
* step executor checks before running user code (see
|
|
26
|
+
* {@link isUnserializableStepInputPlaceholder}).
|
|
27
|
+
*/
|
|
28
|
+
export function unserializableStepInputPlaceholder() {
|
|
29
|
+
return {
|
|
30
|
+
args: [UNSERIALIZABLE_STEP_INPUT_MARKER],
|
|
31
|
+
closureVars: [],
|
|
32
|
+
thisVal: undefined,
|
|
33
|
+
[UNSERIALIZABLE_FLAG]: true,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Whether a hydrated step input is the finalization placeholder.
|
|
38
|
+
*
|
|
39
|
+
* Finalization writes `step_created` (placeholder) and `step_failed` as two
|
|
40
|
+
* separate durable writes; a crash or transient failure between them leaves
|
|
41
|
+
* a pending step whose stored input is the placeholder. Redelivery then
|
|
42
|
+
* dispatches that step through normal crash recovery: the executor calls
|
|
43
|
+
* this before running user code and completes the intended failure (a fatal
|
|
44
|
+
* SerializationError → `step_failed`) instead of silently invoking the step
|
|
45
|
+
* body with placeholder arguments.
|
|
46
|
+
*/
|
|
47
|
+
export function isUnserializableStepInputPlaceholder(hydratedInput) {
|
|
48
|
+
return (typeof hydratedInput === 'object' &&
|
|
49
|
+
hydratedInput !== null &&
|
|
50
|
+
hydratedInput[UNSERIALIZABLE_FLAG] === true);
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5zZXJpYWxpemFibGUtc3RlcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL3Vuc2VyaWFsaXphYmxlLXN0ZXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sQ0FBQyxNQUFNLGdDQUFnQyxHQUMzQyx5REFBeUQsQ0FBQztBQUU1RDs7Ozs7R0FLRztBQUNILE1BQU0sbUJBQW1CLEdBQUcsbUNBQW1DLENBQUM7QUFFaEU7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxrQ0FBa0M7SUFDaEQsT0FBTztRQUNMLElBQUksRUFBRSxDQUFDLGdDQUFnQyxDQUFDO1FBQ3hDLFdBQVcsRUFBRSxFQUFFO1FBQ2YsT0FBTyxFQUFFLFNBQVM7UUFDbEIsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLElBQUk7S0FDNUIsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxVQUFVLG9DQUFvQyxDQUNsRCxhQUFzQjtJQUV0QixPQUFPLENBQ0wsT0FBTyxhQUFhLEtBQUssUUFBUTtRQUNqQyxhQUFhLEtBQUssSUFBSTtRQUNyQixhQUF5QyxDQUFDLG1CQUFtQixDQUFDLEtBQUssSUFBSSxDQUN6RSxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU2hhcmVkIHNoYXBlIGZvciBmaW5hbGl6aW5nIGEgc3RlcCB3aG9zZSBhcmd1bWVudHMgZmFpbGVkIHRvIHNlcmlhbGl6ZVxuICogKHVzZWQgYnkgYm90aCB0aGUgbm9kZTp2bSBzdXNwZW5zaW9uIGhhbmRsZXIgYW5kIHRoZSBRdWlja0pTIGVudHJ5cG9pbnQpLlxuICpcbiAqIFRoZSB3b3JsZCByZXF1aXJlcyBhIGBzdGVwX2NyZWF0ZWRgIGJlZm9yZSBhbnkgdGVybWluYWwgc3RlcCBldmVudCwgYW5kXG4gKiB0aGUgc3RlcCdzIHJlYWwgaW5wdXQgaXMgcHJlY2lzZWx5IHdoYXQgcmVmdXNlZCB0byBzZXJpYWxpemUsIHNvIHRoZVxuICogZmluYWxpemF0aW9uIHdyaXRlcyBhIHBsYWNlaG9sZGVyIGlucHV0LiBUaGUgbWFya2VyIHN0cmluZyBtYWtlcyB0aGVcbiAqIHBsYWNlaG9sZGVyIGRpc3Rpbmd1aXNoYWJsZSBmcm9tIGEgZ2VudWluZSB6ZXJvLWFyZ3VtZW50IHN0ZXAgaW5cbiAqIGB3b3JrZmxvdyBpbnNwZWN0IHN0ZXBzYCBhbmQgdGhlIG9ic2VydmFiaWxpdHkgVUk6IGEgcmVhZGVyIHNlZXNcbiAqIFwiaW5wdXQgdW5hdmFpbGFibGVcIiBpbnN0ZWFkIG9mIFwibm8gYXJndW1lbnRzXCIuXG4gKi9cbmV4cG9ydCBjb25zdCBVTlNFUklBTElaQUJMRV9TVEVQX0lOUFVUX01BUktFUiA9XG4gICdbaW5wdXQgdW5hdmFpbGFibGU6IHN0ZXAgYXJndW1lbnQgc2VyaWFsaXphdGlvbiBmYWlsZWRdJztcblxuLyoqXG4gKiBTdHJ1Y3R1cmFsIGRpc2NyaW1pbmF0b3Igb24gdGhlIHBsYWNlaG9sZGVyJ3MgdG9wIGxldmVsLiBUaGVcbiAqIGB7IGFyZ3MsIGNsb3N1cmVWYXJzLCB0aGlzVmFsIH1gIHRyaXBsZSBpcyBidWlsdCBieSB0aGUgU0RLICh1c2VyIGNvZGVcbiAqIG5ldmVyIGNvbnRyb2xzIGl0cyB0b3AtbGV2ZWwga2V5cyksIHNvIHRoaXMgZmxhZyBjYW5ub3QgZmFsc2UtcG9zaXRpdmUgb25cbiAqIGEgbGVnaXRpbWF0ZSBpbnB1dCwgdW5saWtlIHRoZSBkaXNwbGF5IG1hcmtlciBpbnNpZGUgYGFyZ3NgLlxuICovXG5jb25zdCBVTlNFUklBTElaQUJMRV9GTEFHID0gJ19fd29ya2Zsb3dVbnNlcmlhbGl6YWJsZVN0ZXBJbnB1dCc7XG5cbi8qKlxuICogVGhlIHBsYWNlaG9sZGVyIHZhbHVlIHNlcmlhbGl6ZWQgaW50byB0aGUgZmFpbGVkIHN0ZXAncyBgc3RlcF9jcmVhdGVkYFxuICogaW5wdXQuIE1hdGNoZXMgdGhlIGB7IGFyZ3MsIGNsb3N1cmVWYXJzLCB0aGlzVmFsIH1gIHRyaXBsZVxuICogYGRlaHlkcmF0ZVN0ZXBBcmd1bWVudHNgIC8gdGhlIFF1aWNrSlMgYm9vdHN0cmFwIHByb2R1Y2UgZm9yIHJlYWwgc3RlcHMsXG4gKiBzbyBldmVyeSBjb25zdW1lciBoeWRyYXRlcyBpdCB1bmlmb3JtbHksIHBsdXMgdGhlIHN0cnVjdHVyYWwgZmxhZyB0aGVcbiAqIHN0ZXAgZXhlY3V0b3IgY2hlY2tzIGJlZm9yZSBydW5uaW5nIHVzZXIgY29kZSAoc2VlXG4gKiB7QGxpbmsgaXNVbnNlcmlhbGl6YWJsZVN0ZXBJbnB1dFBsYWNlaG9sZGVyfSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bnNlcmlhbGl6YWJsZVN0ZXBJbnB1dFBsYWNlaG9sZGVyKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIHtcbiAgICBhcmdzOiBbVU5TRVJJQUxJWkFCTEVfU1RFUF9JTlBVVF9NQVJLRVJdLFxuICAgIGNsb3N1cmVWYXJzOiBbXSxcbiAgICB0aGlzVmFsOiB1bmRlZmluZWQsXG4gICAgW1VOU0VSSUFMSVpBQkxFX0ZMQUddOiB0cnVlLFxuICB9O1xufVxuXG4vKipcbiAqIFdoZXRoZXIgYSBoeWRyYXRlZCBzdGVwIGlucHV0IGlzIHRoZSBmaW5hbGl6YXRpb24gcGxhY2Vob2xkZXIuXG4gKlxuICogRmluYWxpemF0aW9uIHdyaXRlcyBgc3RlcF9jcmVhdGVkYCAocGxhY2Vob2xkZXIpIGFuZCBgc3RlcF9mYWlsZWRgIGFzIHR3b1xuICogc2VwYXJhdGUgZHVyYWJsZSB3cml0ZXM7IGEgY3Jhc2ggb3IgdHJhbnNpZW50IGZhaWx1cmUgYmV0d2VlbiB0aGVtIGxlYXZlc1xuICogYSBwZW5kaW5nIHN0ZXAgd2hvc2Ugc3RvcmVkIGlucHV0IGlzIHRoZSBwbGFjZWhvbGRlci4gUmVkZWxpdmVyeSB0aGVuXG4gKiBkaXNwYXRjaGVzIHRoYXQgc3RlcCB0aHJvdWdoIG5vcm1hbCBjcmFzaCByZWNvdmVyeTogdGhlIGV4ZWN1dG9yIGNhbGxzXG4gKiB0aGlzIGJlZm9yZSBydW5uaW5nIHVzZXIgY29kZSBhbmQgY29tcGxldGVzIHRoZSBpbnRlbmRlZCBmYWlsdXJlIChhIGZhdGFsXG4gKiBTZXJpYWxpemF0aW9uRXJyb3Ig4oaSIGBzdGVwX2ZhaWxlZGApIGluc3RlYWQgb2Ygc2lsZW50bHkgaW52b2tpbmcgdGhlIHN0ZXBcbiAqIGJvZHkgd2l0aCBwbGFjZWhvbGRlciBhcmd1bWVudHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1Vuc2VyaWFsaXphYmxlU3RlcElucHV0UGxhY2Vob2xkZXIoXG4gIGh5ZHJhdGVkSW5wdXQ6IHVua25vd25cbik6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiBoeWRyYXRlZElucHV0ID09PSAnb2JqZWN0JyAmJlxuICAgIGh5ZHJhdGVkSW5wdXQgIT09IG51bGwgJiZcbiAgICAoaHlkcmF0ZWRJbnB1dCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbVU5TRVJJQUxJWkFCTEVfRkxBR10gPT09IHRydWVcbiAgKTtcbn1cbiJdfQ==
|
|
@@ -24,7 +24,7 @@ export type WorkflowVmMode = (typeof WORKFLOW_VMS)[number];
|
|
|
24
24
|
*
|
|
25
25
|
* Returns the configured engine, or `undefined` if unset/empty.
|
|
26
26
|
* Throws {@link WorkflowRuntimeError} if the value is set but not one of
|
|
27
|
-
* the known engines
|
|
27
|
+
* the known engines, since catching misconfiguration early is better than
|
|
28
28
|
* silently falling back to the default.
|
|
29
29
|
*/
|
|
30
30
|
export declare function getWorkflowVmFromEnv(env?: NodeJS.ProcessEnv): WorkflowVmMode | undefined;
|
package/dist/runtime/vm-mode.js
CHANGED
|
@@ -23,7 +23,7 @@ export const WORKFLOW_VMS = ['node', 'quickjs'];
|
|
|
23
23
|
*
|
|
24
24
|
* Returns the configured engine, or `undefined` if unset/empty.
|
|
25
25
|
* Throws {@link WorkflowRuntimeError} if the value is set but not one of
|
|
26
|
-
* the known engines
|
|
26
|
+
* the known engines, since catching misconfiguration early is better than
|
|
27
27
|
* silently falling back to the default.
|
|
28
28
|
*/
|
|
29
29
|
export function getWorkflowVmFromEnv(env = process.env) {
|
|
@@ -59,4 +59,4 @@ export function useQuickJSVm(workflowRun) {
|
|
|
59
59
|
}
|
|
60
60
|
return getWorkflowVmFromEnv() === 'quickjs';
|
|
61
61
|
}
|
|
62
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
62
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidm0tbW9kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL3ZtLW1vZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUVILE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBR3hEOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQVUsQ0FBQztBQUl6RDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUNsQyxNQUF5QixPQUFPLENBQUMsR0FBRztJQUVwQyxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsV0FBVyxDQUFDO0lBQzVCLElBQUksR0FBRyxLQUFLLFNBQVMsSUFBSSxHQUFHLEtBQUssRUFBRTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ3RELElBQUssWUFBa0MsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN0RCxPQUFPLEdBQXFCLENBQUM7SUFDL0IsQ0FBQztJQUNELE1BQU0sSUFBSSxvQkFBb0IsQ0FDNUIsK0JBQStCLEdBQUcsS0FBSztRQUNyQyxvQkFBb0IsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUNqRCxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FBQyxXQUF3QjtJQUNuRCxNQUFNLFNBQVMsR0FDYixXQUFXLENBQUMsZ0JBQ2IsRUFBRSxVQUFVLENBQUM7SUFDZCxJQUFJLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUUsWUFBa0MsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUM3RCxNQUFNLElBQUksb0JBQW9CLENBQzVCLCtDQUErQyxTQUFTLEtBQUs7Z0JBQzNELG9CQUFvQixZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQ2pELENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTyxTQUFTLEtBQUssU0FBUyxDQUFDO0lBQ2pDLENBQUM7SUFDRCxPQUFPLG9CQUFvQixFQUFFLEtBQUssU0FBUyxDQUFDO0FBQzlDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFZNIGVuZ2luZSBzZWxlY3Rpb24gZm9yIHdvcmtmbG93IGV4ZWN1dGlvbi5cbiAqXG4gKiBUaGUgTm9kZS5qcyBgbm9kZTp2bWAgZW5naW5lIGlzIHRoZSBkZWZhdWx0LiBUaGUgUXVpY2tKUyBXQVNNIGVuZ2luZSBpc1xuICogb3B0LWluIHZpYSB0aGUgYFdPUktGTE9XX1ZNYCBlbnYgdmFyIG9yIGBleGVjdXRpb25Db250ZXh0LndvcmtmbG93Vm1gLlxuICpcbiAqIEJvdGggZW5naW5lcyBpbXBsZW1lbnQgdGhlIHNhbWUgZXZlbnQtcmVwbGF5IGV4ZWN1dGlvbiBtb2RlbDogb24gZXZlcnlcbiAqIHdvcmtmbG93IGhhbmRsZXIgaW52b2NhdGlvbiB0aGUgd29ya2Zsb3cgZnVuY3Rpb24gaXMgcmUtZXhlY3V0ZWQgZnJvbSB0aGVcbiAqIHRvcCBhbmQgdGhlIHJlY29yZGVkIGV2ZW50IGxvZyByZXNvbHZlcyBhd2FpdGVkIHByaW1pdGl2ZXMuIFRoZSBRdWlja0pTXG4gKiBlbmdpbmUgcnVucyB0aGUgd29ya2Zsb3cgY29kZSBpbiBhIFF1aWNrSlMgV0FTTSBWTSAodmlhIHF1aWNranMtd2FzaSlcbiAqIGluc3RlYWQgb2YgYSBgbm9kZTp2bWAgY29udGV4dCwgd2hpY2ggbWFrZXMgaXQgdXNhYmxlIG9uIHBsYXRmb3JtcyB0aGF0XG4gKiBkbyBub3QgaW1wbGVtZW50IGBub2RlOnZtYCAoZS5nLiBDbG91ZGZsYXJlIFdvcmtlcnMpIGFuZCBpcyB0aGVcbiAqIGZvdW5kYXRpb24gZm9yIFZNLW1lbW9yeSBzbmFwc2hvdHRpbmcuXG4gKi9cblxuaW1wb3J0IHsgV29ya2Zsb3dSdW50aW1lRXJyb3IgfSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB0eXBlIHsgV29ya2Zsb3dSdW4gfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuXG4vKipcbiAqIEtub3duIHdvcmtmbG93IFZNIGVuZ2luZXMuIEFueSBvdGhlciBgV09SS0ZMT1dfVk1gIHZhbHVlIGlzIHRyZWF0ZWQgYXNcbiAqIGEgbWlzY29uZmlndXJhdGlvbiBhbmQgcmVqZWN0ZWQgYXQgc3RhcnR1cC5cbiAqL1xuZXhwb3J0IGNvbnN0IFdPUktGTE9XX1ZNUyA9IFsnbm9kZScsICdxdWlja2pzJ10gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFdvcmtmbG93Vm1Nb2RlID0gKHR5cGVvZiBXT1JLRkxPV19WTVMpW251bWJlcl07XG5cbi8qKlxuICogUmVhZCBhbmQgdmFsaWRhdGUgdGhlIGBXT1JLRkxPV19WTWAgZW52IHZhci5cbiAqXG4gKiBSZXR1cm5zIHRoZSBjb25maWd1cmVkIGVuZ2luZSwgb3IgYHVuZGVmaW5lZGAgaWYgdW5zZXQvZW1wdHkuXG4gKiBUaHJvd3Mge0BsaW5rIFdvcmtmbG93UnVudGltZUVycm9yfSBpZiB0aGUgdmFsdWUgaXMgc2V0IGJ1dCBub3Qgb25lIG9mXG4gKiB0aGUga25vd24gZW5naW5lcywgc2luY2UgY2F0Y2hpbmcgbWlzY29uZmlndXJhdGlvbiBlYXJseSBpcyBiZXR0ZXIgdGhhblxuICogc2lsZW50bHkgZmFsbGluZyBiYWNrIHRvIHRoZSBkZWZhdWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V29ya2Zsb3dWbUZyb21FbnYoXG4gIGVudjogTm9kZUpTLlByb2Nlc3NFbnYgPSBwcm9jZXNzLmVudlxuKTogV29ya2Zsb3dWbU1vZGUgfCB1bmRlZmluZWQge1xuICBjb25zdCByYXcgPSBlbnYuV09SS0ZMT1dfVk07XG4gIGlmIChyYXcgPT09IHVuZGVmaW5lZCB8fCByYXcgPT09ICcnKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAoKFdPUktGTE9XX1ZNUyBhcyByZWFkb25seSBzdHJpbmdbXSkuaW5jbHVkZXMocmF3KSkge1xuICAgIHJldHVybiByYXcgYXMgV29ya2Zsb3dWbU1vZGU7XG4gIH1cbiAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgIGBJbnZhbGlkIFdPUktGTE9XX1ZNIHZhbHVlOiBcIiR7cmF3fVwiLiBgICtcbiAgICAgIGBFeHBlY3RlZCBvbmUgb2Y6ICR7V09SS0ZMT1dfVk1TLmpvaW4oJywgJyl9LmBcbiAgKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRvIHVzZSB0aGUgUXVpY2tKUyBXQVNNIFZNIGZvciBhIGdpdmVuIHJ1bi5cbiAqXG4gKiBUaGUgcnVuJ3MgYGV4ZWN1dGlvbkNvbnRleHQud29ya2Zsb3dWbWAgKHN0YW1wZWQgYnkgdGhlIFNESyBhdCBgc3RhcnQoKWBcbiAqIHdoZW4gYFdPUktGTE9XX1ZNYCBpcyBzZXQgb24gdGhlIGNsaWVudCkgdGFrZXMgcHJlY2VkZW5jZSBzbyBhIHJ1biBrZWVwc1xuICogZXhlY3V0aW5nIG9uIHRoZSBlbmdpbmUgaXQgc3RhcnRlZCBvbi4gV2hlbiB0aGUgcnVuIGRvZXNuJ3Qgc3BlY2lmeSBhblxuICogZW5naW5lLCB0aGUgYFdPUktGTE9XX1ZNYCBlbnYgdmFyIG9uIHRoZSB3b3JrZmxvdyBoYW5kbGVyIGRlY2lkZXMuXG4gKiBUaGUgZGVmYXVsdCBpcyB0aGUgYG5vZGU6dm1gIGVuZ2luZS5cbiAqXG4gKiBUaHJvd3MgaWYgYFdPUktGTE9XX1ZNYCBvciBgZXhlY3V0aW9uQ29udGV4dC53b3JrZmxvd1ZtYCBpcyBzZXQgdG8gYW5cbiAqIHVua25vd24gdmFsdWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VRdWlja0pTVm0od29ya2Zsb3dSdW46IFdvcmtmbG93UnVuKTogYm9vbGVhbiB7XG4gIGNvbnN0IHZtRnJvbVJ1biA9IChcbiAgICB3b3JrZmxvd1J1bi5leGVjdXRpb25Db250ZXh0IGFzIHsgd29ya2Zsb3dWbT86IHN0cmluZyB9IHwgdW5kZWZpbmVkXG4gICk/LndvcmtmbG93Vm07XG4gIGlmICh2bUZyb21SdW4gIT09IHVuZGVmaW5lZCkge1xuICAgIGlmICghKFdPUktGTE9XX1ZNUyBhcyByZWFkb25seSBzdHJpbmdbXSkuaW5jbHVkZXModm1Gcm9tUnVuKSkge1xuICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICBgSW52YWxpZCBleGVjdXRpb25Db250ZXh0LndvcmtmbG93Vm0gdmFsdWU6IFwiJHt2bUZyb21SdW59XCIuIGAgK1xuICAgICAgICAgIGBFeHBlY3RlZCBvbmUgb2Y6ICR7V09SS0ZMT1dfVk1TLmpvaW4oJywgJyl9LmBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB2bUZyb21SdW4gPT09ICdxdWlja2pzJztcbiAgfVxuICByZXR1cm4gZ2V0V29ya2Zsb3dWbUZyb21FbnYoKSA9PT0gJ3F1aWNranMnO1xufVxuIl19
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* The continuation is keyed on the wait's correlationId: while a wait is
|
|
11
11
|
* pending, every replay pass over the run re-observes it (e.g., once per
|
|
12
12
|
* step completion in `Promise.all([steps..., sleep()])`), and without
|
|
13
|
-
* dedupe each pass would enqueue another delayed continuation
|
|
13
|
+
* dedupe each pass would enqueue another delayed continuation: each one
|
|
14
14
|
* a spurious full replay when the wait elapses, and each a fresh message
|
|
15
15
|
* that resets the delivery-attempt runaway guard. A key is attached in
|
|
16
16
|
* all cases: some worlds (e.g. world-postgres) serialize key-less
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
* situations exist, each with its own key variation:
|
|
30
30
|
*
|
|
31
31
|
* - Waits longer than the maximum queue delay are chained: the delay is
|
|
32
|
-
* clamped to `WAIT_CONTINUATION_MAX_DELAY_SECONDS` (23h
|
|
32
|
+
* clamped to `WAIT_CONTINUATION_MAX_DELAY_SECONDS` (23h: VQS messages
|
|
33
33
|
* have a 24h retention limit, and one hour of buffer matches
|
|
34
34
|
* world-vercel's own clamp for delayed re-enqueues), so the
|
|
35
35
|
* continuation intentionally fires early, re-observes the wait, and
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
* (`ceil(timeoutSeconds / maxDelay)`): stable for every re-observation
|
|
38
38
|
* within the same hop window (so passes dedupe), decremented at each
|
|
39
39
|
* hop delivery (so the chain always advances). Worlds without a delay
|
|
40
|
-
* limit (world-postgres, world-local)
|
|
40
|
+
* limit (world-postgres, world-local) take the same ≤23h hops.
|
|
41
41
|
*
|
|
42
42
|
* - Near-elapsed waits (≤2s remaining) get a second-bucketed suffix. A
|
|
43
43
|
* continuation delivered marginally early (clock skew between the
|
|
@@ -50,11 +50,25 @@
|
|
|
50
50
|
* Mid-range waits (more than the near-elapsed threshold, at most one
|
|
51
51
|
* hop) use the bare correlationId: every re-observation targets the same
|
|
52
52
|
* deadline, so deduping to the first message is semantically lossless.
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
53
|
+
*
|
|
54
|
+
* That last case used to be the one hole in the scheme, and it was not
|
|
55
|
+
* theoretical. Any delivery early enough to re-observe its own wait as
|
|
56
|
+
* pending burns the bare key on the way in: the re-enqueue is dropped by
|
|
57
|
+
* the dedupe window, nothing else is scheduled to wake the run, and no
|
|
58
|
+
* backstop exists for a wait the way inline step ownership provides one
|
|
59
|
+
* for a step. The run sleeps forever. Waits over the threshold have zero
|
|
60
|
+
* tolerance for it, which is why an infrastructure change in delivery
|
|
61
|
+
* timing was able to strand runs across every published SDK version at
|
|
62
|
+
* once, all of them keyed this way.
|
|
63
|
+
*
|
|
64
|
+
* So the key is no longer derived from the wait alone. A continuation
|
|
65
|
+
* carries the wait it was armed for and its attempt number
|
|
66
|
+
* ({@link WorkflowInvokePayload.waitContinuation}), and an invocation
|
|
67
|
+
* that recognizes itself as the continuation for a wait that is still
|
|
68
|
+
* pending arms the next one at `attempt + 1`. Attempts advance ONLY when
|
|
69
|
+
* an early delivery actually happens, so the normal path is untouched:
|
|
70
|
+
* attempt 0 keys exactly as before, and every re-observation within one
|
|
71
|
+
* attempt still collapses to a single message.
|
|
58
72
|
*/
|
|
59
73
|
/**
|
|
60
74
|
* Maximum `delaySeconds` for a single wait-continuation message. Waits
|
|
@@ -79,6 +93,14 @@ export interface WaitContinuationDispatch {
|
|
|
79
93
|
* message. `timeoutSeconds` is the time until the wait's `resumeAt`
|
|
80
94
|
* (floored at 1s by the suspension handler); `waitCorrelationId`
|
|
81
95
|
* identifies the wait so repeated suspension passes dedupe.
|
|
96
|
+
*
|
|
97
|
+
* `attempt` is the number of continuations already spent on this wait, taken
|
|
98
|
+
* from the incoming message when this invocation IS one of them (see
|
|
99
|
+
* {@link WorkflowInvokePayload.waitContinuation}). It only ever moves when a
|
|
100
|
+
* continuation arrived before its wait elapsed, which is exactly when the
|
|
101
|
+
* previous key is spent and re-using it would drop the message. Attempt 0
|
|
102
|
+
* keys identically to the scheme before attempts existed, so the ordinary
|
|
103
|
+
* path — arm once, deliver once, complete — is byte-for-byte unchanged.
|
|
82
104
|
*/
|
|
83
|
-
export declare function getWaitContinuationDispatch(timeoutSeconds: number, waitCorrelationId: string, now?: number): WaitContinuationDispatch;
|
|
105
|
+
export declare function getWaitContinuationDispatch(timeoutSeconds: number, waitCorrelationId: string, now?: number, attempt?: number): WaitContinuationDispatch;
|
|
84
106
|
//# sourceMappingURL=wait-continuation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wait-continuation.d.ts","sourceRoot":"","sources":["../../src/runtime/wait-continuation.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"wait-continuation.d.ts","sourceRoot":"","sources":["../../src/runtime/wait-continuation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuEG;AAIH;;;;;GAKG;AACH,eAAO,MAAM,mCAAmC,QAAS,CAAC;AAE1D;;;;;GAKG;AACH,eAAO,MAAM,mCAAmC,IAAI,CAAC;AAiBrD,MAAM,WAAW,wBAAwB;IACvC,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,2BAA2B,CACzC,cAAc,EAAE,MAAM,EACtB,iBAAiB,EAAE,MAAM,EACzB,GAAG,GAAE,MAAmB,EACxB,OAAO,SAAI,GACV,wBAAwB,CAW1B"}
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* The continuation is keyed on the wait's correlationId: while a wait is
|
|
11
11
|
* pending, every replay pass over the run re-observes it (e.g., once per
|
|
12
12
|
* step completion in `Promise.all([steps..., sleep()])`), and without
|
|
13
|
-
* dedupe each pass would enqueue another delayed continuation
|
|
13
|
+
* dedupe each pass would enqueue another delayed continuation: each one
|
|
14
14
|
* a spurious full replay when the wait elapses, and each a fresh message
|
|
15
15
|
* that resets the delivery-attempt runaway guard. A key is attached in
|
|
16
16
|
* all cases: some worlds (e.g. world-postgres) serialize key-less
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
* situations exist, each with its own key variation:
|
|
30
30
|
*
|
|
31
31
|
* - Waits longer than the maximum queue delay are chained: the delay is
|
|
32
|
-
* clamped to `WAIT_CONTINUATION_MAX_DELAY_SECONDS` (23h
|
|
32
|
+
* clamped to `WAIT_CONTINUATION_MAX_DELAY_SECONDS` (23h: VQS messages
|
|
33
33
|
* have a 24h retention limit, and one hour of buffer matches
|
|
34
34
|
* world-vercel's own clamp for delayed re-enqueues), so the
|
|
35
35
|
* continuation intentionally fires early, re-observes the wait, and
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
* (`ceil(timeoutSeconds / maxDelay)`): stable for every re-observation
|
|
38
38
|
* within the same hop window (so passes dedupe), decremented at each
|
|
39
39
|
* hop delivery (so the chain always advances). Worlds without a delay
|
|
40
|
-
* limit (world-postgres, world-local)
|
|
40
|
+
* limit (world-postgres, world-local) take the same ≤23h hops.
|
|
41
41
|
*
|
|
42
42
|
* - Near-elapsed waits (≤2s remaining) get a second-bucketed suffix. A
|
|
43
43
|
* continuation delivered marginally early (clock skew between the
|
|
@@ -50,11 +50,25 @@
|
|
|
50
50
|
* Mid-range waits (more than the near-elapsed threshold, at most one
|
|
51
51
|
* hop) use the bare correlationId: every re-observation targets the same
|
|
52
52
|
* deadline, so deduping to the first message is semantically lossless.
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
53
|
+
*
|
|
54
|
+
* That last case used to be the one hole in the scheme, and it was not
|
|
55
|
+
* theoretical. Any delivery early enough to re-observe its own wait as
|
|
56
|
+
* pending burns the bare key on the way in: the re-enqueue is dropped by
|
|
57
|
+
* the dedupe window, nothing else is scheduled to wake the run, and no
|
|
58
|
+
* backstop exists for a wait the way inline step ownership provides one
|
|
59
|
+
* for a step. The run sleeps forever. Waits over the threshold have zero
|
|
60
|
+
* tolerance for it, which is why an infrastructure change in delivery
|
|
61
|
+
* timing was able to strand runs across every published SDK version at
|
|
62
|
+
* once, all of them keyed this way.
|
|
63
|
+
*
|
|
64
|
+
* So the key is no longer derived from the wait alone. A continuation
|
|
65
|
+
* carries the wait it was armed for and its attempt number
|
|
66
|
+
* ({@link WorkflowInvokePayload.waitContinuation}), and an invocation
|
|
67
|
+
* that recognizes itself as the continuation for a wait that is still
|
|
68
|
+
* pending arms the next one at `attempt + 1`. Attempts advance ONLY when
|
|
69
|
+
* an early delivery actually happens, so the normal path is untouched:
|
|
70
|
+
* attempt 0 keys exactly as before, and every re-observation within one
|
|
71
|
+
* attempt still collapses to a single message.
|
|
58
72
|
*/
|
|
59
73
|
import { envNumber } from '@workflow/world';
|
|
60
74
|
/**
|
|
@@ -80,15 +94,32 @@ const getNearElapsedWaitThresholdSeconds = () => envNumber('WORKFLOW_NEAR_ELAPSE
|
|
|
80
94
|
* message. `timeoutSeconds` is the time until the wait's `resumeAt`
|
|
81
95
|
* (floored at 1s by the suspension handler); `waitCorrelationId`
|
|
82
96
|
* identifies the wait so repeated suspension passes dedupe.
|
|
97
|
+
*
|
|
98
|
+
* `attempt` is the number of continuations already spent on this wait, taken
|
|
99
|
+
* from the incoming message when this invocation IS one of them (see
|
|
100
|
+
* {@link WorkflowInvokePayload.waitContinuation}). It only ever moves when a
|
|
101
|
+
* continuation arrived before its wait elapsed, which is exactly when the
|
|
102
|
+
* previous key is spent and re-using it would drop the message. Attempt 0
|
|
103
|
+
* keys identically to the scheme before attempts existed, so the ordinary
|
|
104
|
+
* path — arm once, deliver once, complete — is byte-for-byte unchanged.
|
|
83
105
|
*/
|
|
84
|
-
export function getWaitContinuationDispatch(timeoutSeconds, waitCorrelationId, now = Date.now()) {
|
|
106
|
+
export function getWaitContinuationDispatch(timeoutSeconds, waitCorrelationId, now = Date.now(), attempt = 0) {
|
|
107
|
+
const dispatch = waitContinuationDispatchForAttemptZero(timeoutSeconds, waitCorrelationId, now);
|
|
108
|
+
if (attempt <= 0)
|
|
109
|
+
return dispatch;
|
|
110
|
+
return {
|
|
111
|
+
delaySeconds: dispatch.delaySeconds,
|
|
112
|
+
idempotencyKey: `${dispatch.idempotencyKey}:a${attempt}`,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
function waitContinuationDispatchForAttemptZero(timeoutSeconds, waitCorrelationId, now) {
|
|
85
116
|
const maxDelaySeconds = getWaitContinuationMaxDelaySeconds();
|
|
86
117
|
// The near-elapsed branch returns the full remaining time as the delay, so
|
|
87
|
-
// its threshold can never exceed the max delay
|
|
118
|
+
// its threshold can never exceed the max delay. Otherwise a wait between the
|
|
88
119
|
// max and the threshold would be dispatched with a delay above the max. Cap
|
|
89
120
|
// the threshold at the max so every branch yields a delay within it. (With
|
|
90
|
-
// defaults
|
|
91
|
-
// the max is tuned down below the threshold for testing.)
|
|
121
|
+
// defaults, threshold 2s and max 82_800s, this is a no-op; it only bites
|
|
122
|
+
// when the max is tuned down below the threshold for testing.)
|
|
92
123
|
const nearElapsedThreshold = Math.min(getNearElapsedWaitThresholdSeconds(), maxDelaySeconds);
|
|
93
124
|
if (timeoutSeconds <= nearElapsedThreshold) {
|
|
94
125
|
return {
|
|
@@ -102,4 +133,4 @@ export function getWaitContinuationDispatch(timeoutSeconds, waitCorrelationId, n
|
|
|
102
133
|
idempotencyKey: hop === 1 ? waitCorrelationId : `${waitCorrelationId}:hop-${hop}`,
|
|
103
134
|
};
|
|
104
135
|
}
|
|
105
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FpdC1jb250aW51YXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS93YWl0LWNvbnRpbnVhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeURHO0FBRUgsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTVDOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sbUNBQW1DLEdBQUcsTUFBTSxDQUFDO0FBRTFEOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sbUNBQW1DLEdBQUcsQ0FBQyxDQUFDO0FBRXJELGtHQUFrRztBQUNsRyxNQUFNLGtDQUFrQyxHQUFHLEdBQVcsRUFBRSxDQUN0RCxTQUFTLENBQ1AsOENBQThDLEVBQzlDLG1DQUFtQyxFQUNuQyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUMxQixDQUFDO0FBRUosa0dBQWtHO0FBQ2xHLE1BQU0sa0NBQWtDLEdBQUcsR0FBVyxFQUFFLENBQ3RELFNBQVMsQ0FDUCw4Q0FBOEMsRUFDOUMsbUNBQW1DLENBQ3BDLENBQUM7QUFPSjs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSwyQkFBMkIsQ0FDekMsY0FBc0IsRUFDdEIsaUJBQXlCLEVBQ3pCLE1BQWMsSUFBSSxDQUFDLEdBQUcsRUFBRTtJQUV4QixNQUFNLGVBQWUsR0FBRyxrQ0FBa0MsRUFBRSxDQUFDO0lBQzdELDJFQUEyRTtJQUMzRSw4RUFBOEU7SUFDOUUsNEVBQTRFO0lBQzVFLDJFQUEyRTtJQUMzRSw2RUFBNkU7SUFDN0UsMERBQTBEO0lBQzFELE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FDbkMsa0NBQWtDLEVBQUUsRUFDcEMsZUFBZSxDQUNoQixDQUFDO0lBQ0YsSUFBSSxjQUFjLElBQUksb0JBQW9CLEVBQUUsQ0FBQztRQUMzQyxPQUFPO1lBQ0wsWUFBWSxFQUFFLGNBQWM7WUFDNUIsY0FBYyxFQUFFLEdBQUcsaUJBQWlCLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUU7U0FDakUsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsR0FBRyxlQUFlLENBQUMsQ0FBQztJQUN4RCxPQUFPO1FBQ0wsWUFBWSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLGVBQWUsQ0FBQztRQUN2RCxjQUFjLEVBQ1osR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEdBQUcsaUJBQWlCLFFBQVEsR0FBRyxFQUFFO0tBQ3BFLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBXYWl0LWNvbnRpbnVhdGlvbiBkaXNwYXRjaDogZGVsYXkgKyBpZGVtcG90ZW5jeS1rZXkgc2VsZWN0aW9uLlxuICpcbiAqIFdoZW4gVjIgc3VzcGVuc2lvbiBwcm9jZXNzaW5nIG9ic2VydmVzIGEgcGVuZGluZyB3YWl0LCBpdCBlbnF1ZXVlcyBhXG4gKiBkZWxheWVkIFwiY29udGludWF0aW9uXCIgbWVzc2FnZSB0aGF0IGZpcmVzIG9uY2UgdGhlIHdhaXQgZWxhcHNlcyBhbmRcbiAqIGRyaXZlcyB0aGUgbmV4dCByZXBsYXkgKHdoaWNoIGNvbXBsZXRlcyB0aGUgd2FpdCB2aWEgdGhlIFwiY29tcGxldGVcbiAqIGVsYXBzZWQgd2FpdHNcIiBwYXNzKS4gVGhpcyBtb2R1bGUgZGVjaWRlcyB0aGUgbWVzc2FnZSdzIGBkZWxheVNlY29uZHNgXG4gKiBhbmQgYGlkZW1wb3RlbmN5S2V5YC5cbiAqXG4gKiBUaGUgY29udGludWF0aW9uIGlzIGtleWVkIG9uIHRoZSB3YWl0J3MgY29ycmVsYXRpb25JZDogd2hpbGUgYSB3YWl0IGlzXG4gKiBwZW5kaW5nLCBldmVyeSByZXBsYXkgcGFzcyBvdmVyIHRoZSBydW4gcmUtb2JzZXJ2ZXMgaXQgKGUuZy4sIG9uY2UgcGVyXG4gKiBzdGVwIGNvbXBsZXRpb24gaW4gYFByb21pc2UuYWxsKFtzdGVwcy4uLiwgc2xlZXAoKV0pYCksIGFuZCB3aXRob3V0XG4gKiBkZWR1cGUgZWFjaCBwYXNzIHdvdWxkIGVucXVldWUgYW5vdGhlciBkZWxheWVkIGNvbnRpbnVhdGlvbiDigJQgZWFjaCBvbmVcbiAqIGEgc3B1cmlvdXMgZnVsbCByZXBsYXkgd2hlbiB0aGUgd2FpdCBlbGFwc2VzLCBhbmQgZWFjaCBhIGZyZXNoIG1lc3NhZ2VcbiAqIHRoYXQgcmVzZXRzIHRoZSBkZWxpdmVyeS1hdHRlbXB0IHJ1bmF3YXkgZ3VhcmQuIEEga2V5IGlzIGF0dGFjaGVkIGluXG4gKiBhbGwgY2FzZXM6IHNvbWUgd29ybGRzIChlLmcuIHdvcmxkLXBvc3RncmVzKSBzZXJpYWxpemUga2V5LWxlc3NcbiAqIHdvcmtmbG93IG1lc3NhZ2VzIHBlciBydW4sIHdoaWNoIHdvdWxkIHBhcmsgdGhlIGNvbnRpbnVhdGlvbiBiZWhpbmRcbiAqIHRoZSBoYW5kbGVyJ3Mgb3duIGlubGluZSBzdGVwIGV4ZWN1dGlvbiBhbmQgZGVmZWF0IHRoZSByYWNlIHNlbWFudGljc1xuICogdGhlIGNvbnRpbnVhdGlvbiBleGlzdHMgdG8gcHJvdmlkZS5cbiAqXG4gKiBUaGUgYmFyZSBjb3JyZWxhdGlvbklkIGNhbm5vdCBiZSB0aGUga2V5IGluIGV2ZXJ5IGNhc2UsIHRob3VnaDogd29ybGRcbiAqIGRlZHVwZSB3aW5kb3dzIG91dGxpdmUgdGhlIGZpcnN0IGRlbGl2ZXJ5IChWUVMga2VlcHMgaWRlbXBvdGVuY3lcbiAqIHJlY29yZHMgdW50aWwgbWVzc2FnZS1yZXRlbnRpb24gVFRMOyB3b3JsZC1wb3N0Z3JlcyBrZWVwcyBhXG4gKiBjb21wbGV0ZWQta2V5cyBjYWNoZSksIHNvIG9uY2UgYSBrZXkgaGFzIGJlZW4gdXNlZCwgYSBsYXRlciBlbnF1ZXVlXG4gKiB1bmRlciB0aGUgc2FtZSBrZXkgaXMgc2lsZW50bHkgZHJvcHBlZC4gQW55IHNpdHVhdGlvbiB3aGVyZSBhXG4gKiBjb250aW51YXRpb24gaXMgZGVsaXZlcmVkIHdoaWxlIGl0cyB3YWl0IGlzIHN0aWxsIHBlbmRpbmcgdGhlcmVmb3JlXG4gKiBuZWVkcyBhIGZyZXNoIGtleSBmb3IgdGhlIHJlLWVucXVldWUsIG9yIHRoZSB3YWl0J3MgdGltZXIgaXMgbG9zdCBhbmRcbiAqIHRoZSBydW4gc3RhbGxzIHVudGlsIHVucmVsYXRlZCB0cmFmZmljIGhhcHBlbnMgdG8gd2FrZSBpdC4gVHdvIHN1Y2hcbiAqIHNpdHVhdGlvbnMgZXhpc3QsIGVhY2ggd2l0aCBpdHMgb3duIGtleSB2YXJpYXRpb246XG4gKlxuICogLSBXYWl0cyBsb25nZXIgdGhhbiB0aGUgbWF4aW11bSBxdWV1ZSBkZWxheSBhcmUgY2hhaW5lZDogdGhlIGRlbGF5IGlzXG4gKiAgIGNsYW1wZWQgdG8gYFdBSVRfQ09OVElOVUFUSU9OX01BWF9ERUxBWV9TRUNPTkRTYCAoMjNoIOKAlCBWUVMgbWVzc2FnZXNcbiAqICAgaGF2ZSBhIDI0aCByZXRlbnRpb24gbGltaXQsIGFuZCBvbmUgaG91ciBvZiBidWZmZXIgbWF0Y2hlc1xuICogICB3b3JsZC12ZXJjZWwncyBvd24gY2xhbXAgZm9yIGRlbGF5ZWQgcmUtZW5xdWV1ZXMpLCBzbyB0aGVcbiAqICAgY29udGludWF0aW9uIGludGVudGlvbmFsbHkgZmlyZXMgZWFybHksIHJlLW9ic2VydmVzIHRoZSB3YWl0LCBhbmRcbiAqICAgbXVzdCBlbnF1ZXVlIHRoZSBuZXh0IGhvcC4gVGhlIGtleSBpcyBzdWZmaXhlZCB3aXRoIHRoZSBob3AgaW5kZXhcbiAqICAgKGBjZWlsKHRpbWVvdXRTZWNvbmRzIC8gbWF4RGVsYXkpYCk6IHN0YWJsZSBmb3IgZXZlcnkgcmUtb2JzZXJ2YXRpb25cbiAqICAgd2l0aGluIHRoZSBzYW1lIGhvcCB3aW5kb3cgKHNvIHBhc3NlcyBkZWR1cGUpLCBkZWNyZW1lbnRlZCBhdCBlYWNoXG4gKiAgIGhvcCBkZWxpdmVyeSAoc28gdGhlIGNoYWluIGFsd2F5cyBhZHZhbmNlcykuIFdvcmxkcyB3aXRob3V0IGEgZGVsYXlcbiAqICAgbGltaXQgKHdvcmxkLXBvc3RncmVzLCB3b3JsZC1sb2NhbCkgc2ltcGx5IHRha2UgdGhlIHNhbWUg4omkMjNoIGhvcHMuXG4gKlxuICogLSBOZWFyLWVsYXBzZWQgd2FpdHMgKOKJpDJzIHJlbWFpbmluZykgZ2V0IGEgc2Vjb25kLWJ1Y2tldGVkIHN1ZmZpeC4gQVxuICogICBjb250aW51YXRpb24gZGVsaXZlcmVkIG1hcmdpbmFsbHkgZWFybHkgKGNsb2NrIHNrZXcgYmV0d2VlbiB0aGVcbiAqICAgZW5xdWV1aW5nIGFuZCBoYW5kbGluZyBob3N0czsgdGhlIGNlaWwoKSBvbiB0aGUgZGVsYXkgY2FuIGxlYXZlIGEgfjBcbiAqICAgbWFyZ2luKSByZS1vYnNlcnZlcyB0aGUgd2FpdCBhcyBwZW5kaW5nIHdpdGggfjFzIHJlbWFpbmluZyBhbmQgbXVzdFxuICogICBiZSBhYmxlIHRvIGVucXVldWUgYSBmcmVzaCBzaG9ydC1kZWxheSByZXRyeS4gVGhlIGJ1Y2tldCBzdWZmaXhcbiAqICAga2VlcHMgdGhhdCByZXRyeSBlbnF1ZXVlYWJsZSAoaXRzIOKJpTFzIGRlbGF5IGd1YXJhbnRlZXMgYSBsYXRlclxuICogICBidWNrZXQpIHdoaWxlIHN0aWxsIGNvbGxhcHNpbmcgc2FtZS1pbnN0YW50IGR1cGxpY2F0ZXMuXG4gKlxuICogTWlkLXJhbmdlIHdhaXRzIChtb3JlIHRoYW4gdGhlIG5lYXItZWxhcHNlZCB0aHJlc2hvbGQsIGF0IG1vc3Qgb25lXG4gKiBob3ApIHVzZSB0aGUgYmFyZSBjb3JyZWxhdGlvbklkOiBldmVyeSByZS1vYnNlcnZhdGlvbiB0YXJnZXRzIHRoZSBzYW1lXG4gKiBkZWFkbGluZSwgc28gZGVkdXBpbmcgdG8gdGhlIGZpcnN0IG1lc3NhZ2UgaXMgc2VtYW50aWNhbGx5IGxvc3NsZXNzLlxuICogSG9zdCBjbG9jayBza2V3IGJleW9uZCB0aGUgbmVhci1lbGFwc2VkIHRocmVzaG9sZCBjb3VsZCBpbiBwcmluY2lwbGVcbiAqIGRlbGl2ZXIgc3VjaCBhIGNvbnRpbnVhdGlvbiBlYXJseSBlbm91Z2ggdG8gcmUtb2JzZXJ2ZSBpdHMgd2FpdCBhbmRcbiAqIGxvc2UgdGhlIHJlLWVucXVldWUgdG8gdGhlIGJ1cm50IGtleTsgdGhlIHRocmVzaG9sZCBpcyB0aGUgc2tld1xuICogdG9sZXJhbmNlIHdlIGFjY2VwdCBmb3IgdGhlIGJlbmVmaXQgb2YgZXhhY3RseS1vbmUgY29udGludWF0aW9uIHBlclxuICogd2FpdC5cbiAqL1xuXG5pbXBvcnQgeyBlbnZOdW1iZXIgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuXG4vKipcbiAqIE1heGltdW0gYGRlbGF5U2Vjb25kc2AgZm9yIGEgc2luZ2xlIHdhaXQtY29udGludWF0aW9uIG1lc3NhZ2UuIFdhaXRzXG4gKiBsb25nZXIgdGhhbiB0aGlzIGFyZSBjaGFpbmVkIGFjcm9zcyBtdWx0aXBsZSBob3BzLiAyMyBob3VycyBsZWF2ZXMgYSAxaFxuICogYnVmZmVyIHVuZGVyIFZlcmNlbCBRdWV1ZXMnIGRlZmF1bHQgMjRoIG1lc3NhZ2UgVFRMIGFuZCBtaXJyb3JzXG4gKiB3b3JsZC12ZXJjZWwncyBgTUFYX0RFTEFZX1NFQ09ORFNgLlxuICovXG5leHBvcnQgY29uc3QgV0FJVF9DT05USU5VQVRJT05fTUFYX0RFTEFZX1NFQ09ORFMgPSA4Ml84MDA7XG5cbi8qKlxuICogV2FpdHMgd2l0aCBhdCBtb3N0IHRoaXMgbWFueSBzZWNvbmRzIHJlbWFpbmluZyB1c2UgYSBzZWNvbmQtYnVja2V0ZWRcbiAqIGlkZW1wb3RlbmN5IGtleSBzbyBhbiBlYXJseS1kZWxpdmVyZWQgY29udGludWF0aW9uIGNhbiByZS1lbnF1ZXVlIGl0c1xuICogc2hvcnQtZGVsYXkgcmV0cnkuIFRoaXMgaXMgYWxzbyB0aGUgaG9zdCBjbG9jay1za2V3IHRvbGVyYW5jZSBmb3JcbiAqIG1pZC1yYW5nZSB3YWl0cyBrZXllZCBvbiB0aGUgYmFyZSBjb3JyZWxhdGlvbklkLlxuICovXG5leHBvcnQgY29uc3QgTkVBUl9FTEFQU0VEX1dBSVRfVEhSRVNIT0xEX1NFQ09ORFMgPSAyO1xuXG4vKiogRWZmZWN0aXZlIG1heCBjb250aW51YXRpb24gZGVsYXkuIE92ZXJyaWRlOiBgV09SS0ZMT1dfV0FJVF9DT05USU5VQVRJT05fTUFYX0RFTEFZX1NFQ09ORFNgLiAqL1xuY29uc3QgZ2V0V2FpdENvbnRpbnVhdGlvbk1heERlbGF5U2Vjb25kcyA9ICgpOiBudW1iZXIgPT5cbiAgZW52TnVtYmVyKFxuICAgICdXT1JLRkxPV19XQUlUX0NPTlRJTlVBVElPTl9NQVhfREVMQVlfU0VDT05EUycsXG4gICAgV0FJVF9DT05USU5VQVRJT05fTUFYX0RFTEFZX1NFQ09ORFMsXG4gICAgeyBpbnRlZ2VyOiB0cnVlLCBtaW46IDEgfVxuICApO1xuXG4vKiogRWZmZWN0aXZlIG5lYXItZWxhcHNlZCB0aHJlc2hvbGQuIE92ZXJyaWRlOiBgV09SS0ZMT1dfTkVBUl9FTEFQU0VEX1dBSVRfVEhSRVNIT0xEX1NFQ09ORFNgLiAqL1xuY29uc3QgZ2V0TmVhckVsYXBzZWRXYWl0VGhyZXNob2xkU2Vjb25kcyA9ICgpOiBudW1iZXIgPT5cbiAgZW52TnVtYmVyKFxuICAgICdXT1JLRkxPV19ORUFSX0VMQVBTRURfV0FJVF9USFJFU0hPTERfU0VDT05EUycsXG4gICAgTkVBUl9FTEFQU0VEX1dBSVRfVEhSRVNIT0xEX1NFQ09ORFNcbiAgKTtcblxuZXhwb3J0IGludGVyZmFjZSBXYWl0Q29udGludWF0aW9uRGlzcGF0Y2gge1xuICBkZWxheVNlY29uZHM6IG51bWJlcjtcbiAgaWRlbXBvdGVuY3lLZXk6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgcXVldWUgZGVsYXkgYW5kIGlkZW1wb3RlbmN5IGtleSBmb3IgYSB3YWl0LWNvbnRpbnVhdGlvblxuICogbWVzc2FnZS4gYHRpbWVvdXRTZWNvbmRzYCBpcyB0aGUgdGltZSB1bnRpbCB0aGUgd2FpdCdzIGByZXN1bWVBdGBcbiAqIChmbG9vcmVkIGF0IDFzIGJ5IHRoZSBzdXNwZW5zaW9uIGhhbmRsZXIpOyBgd2FpdENvcnJlbGF0aW9uSWRgXG4gKiBpZGVudGlmaWVzIHRoZSB3YWl0IHNvIHJlcGVhdGVkIHN1c3BlbnNpb24gcGFzc2VzIGRlZHVwZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdhaXRDb250aW51YXRpb25EaXNwYXRjaChcbiAgdGltZW91dFNlY29uZHM6IG51bWJlcixcbiAgd2FpdENvcnJlbGF0aW9uSWQ6IHN0cmluZyxcbiAgbm93OiBudW1iZXIgPSBEYXRlLm5vdygpXG4pOiBXYWl0Q29udGludWF0aW9uRGlzcGF0Y2gge1xuICBjb25zdCBtYXhEZWxheVNlY29uZHMgPSBnZXRXYWl0Q29udGludWF0aW9uTWF4RGVsYXlTZWNvbmRzKCk7XG4gIC8vIFRoZSBuZWFyLWVsYXBzZWQgYnJhbmNoIHJldHVybnMgdGhlIGZ1bGwgcmVtYWluaW5nIHRpbWUgYXMgdGhlIGRlbGF5LCBzb1xuICAvLyBpdHMgdGhyZXNob2xkIGNhbiBuZXZlciBleGNlZWQgdGhlIG1heCBkZWxheSDigJQgb3RoZXJ3aXNlIGEgd2FpdCBiZXR3ZWVuIHRoZVxuICAvLyBtYXggYW5kIHRoZSB0aHJlc2hvbGQgd291bGQgYmUgZGlzcGF0Y2hlZCB3aXRoIGEgZGVsYXkgYWJvdmUgdGhlIG1heC4gQ2FwXG4gIC8vIHRoZSB0aHJlc2hvbGQgYXQgdGhlIG1heCBzbyBldmVyeSBicmFuY2ggeWllbGRzIGEgZGVsYXkgd2l0aGluIGl0LiAoV2l0aFxuICAvLyBkZWZhdWx0cyDigJQgdGhyZXNob2xkIDJzLCBtYXggODJfODAwcyDigJQgdGhpcyBpcyBhIG5vLW9wOyBpdCBvbmx5IGJpdGVzIHdoZW5cbiAgLy8gdGhlIG1heCBpcyB0dW5lZCBkb3duIGJlbG93IHRoZSB0aHJlc2hvbGQgZm9yIHRlc3RpbmcuKVxuICBjb25zdCBuZWFyRWxhcHNlZFRocmVzaG9sZCA9IE1hdGgubWluKFxuICAgIGdldE5lYXJFbGFwc2VkV2FpdFRocmVzaG9sZFNlY29uZHMoKSxcbiAgICBtYXhEZWxheVNlY29uZHNcbiAgKTtcbiAgaWYgKHRpbWVvdXRTZWNvbmRzIDw9IG5lYXJFbGFwc2VkVGhyZXNob2xkKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRlbGF5U2Vjb25kczogdGltZW91dFNlY29uZHMsXG4gICAgICBpZGVtcG90ZW5jeUtleTogYCR7d2FpdENvcnJlbGF0aW9uSWR9OiR7TWF0aC5mbG9vcihub3cgLyAxMDAwKX1gLFxuICAgIH07XG4gIH1cblxuICBjb25zdCBob3AgPSBNYXRoLmNlaWwodGltZW91dFNlY29uZHMgLyBtYXhEZWxheVNlY29uZHMpO1xuICByZXR1cm4ge1xuICAgIGRlbGF5U2Vjb25kczogTWF0aC5taW4odGltZW91dFNlY29uZHMsIG1heERlbGF5U2Vjb25kcyksXG4gICAgaWRlbXBvdGVuY3lLZXk6XG4gICAgICBob3AgPT09IDEgPyB3YWl0Q29ycmVsYXRpb25JZCA6IGAke3dhaXRDb3JyZWxhdGlvbklkfTpob3AtJHtob3B9YCxcbiAgfTtcbn1cbiJdfQ==
|
|
136
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FpdC1jb250aW51YXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS93YWl0LWNvbnRpbnVhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1RUc7QUFFSCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFNUM7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsTUFBTSxtQ0FBbUMsR0FBRyxNQUFNLENBQUM7QUFFMUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsTUFBTSxtQ0FBbUMsR0FBRyxDQUFDLENBQUM7QUFFckQsa0dBQWtHO0FBQ2xHLE1BQU0sa0NBQWtDLEdBQUcsR0FBVyxFQUFFLENBQ3RELFNBQVMsQ0FDUCw4Q0FBOEMsRUFDOUMsbUNBQW1DLEVBQ25DLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQzFCLENBQUM7QUFFSixrR0FBa0c7QUFDbEcsTUFBTSxrQ0FBa0MsR0FBRyxHQUFXLEVBQUUsQ0FDdEQsU0FBUyxDQUNQLDhDQUE4QyxFQUM5QyxtQ0FBbUMsQ0FDcEMsQ0FBQztBQU9KOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFNLFVBQVUsMkJBQTJCLENBQ3pDLGNBQXNCLEVBQ3RCLGlCQUF5QixFQUN6QixNQUFjLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFDeEIsT0FBTyxHQUFHLENBQUM7SUFFWCxNQUFNLFFBQVEsR0FBRyxzQ0FBc0MsQ0FDckQsY0FBYyxFQUNkLGlCQUFpQixFQUNqQixHQUFHLENBQ0osQ0FBQztJQUNGLElBQUksT0FBTyxJQUFJLENBQUM7UUFBRSxPQUFPLFFBQVEsQ0FBQztJQUNsQyxPQUFPO1FBQ0wsWUFBWSxFQUFFLFFBQVEsQ0FBQyxZQUFZO1FBQ25DLGNBQWMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxjQUFjLEtBQUssT0FBTyxFQUFFO0tBQ3pELENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxzQ0FBc0MsQ0FDN0MsY0FBc0IsRUFDdEIsaUJBQXlCLEVBQ3pCLEdBQVc7SUFFWCxNQUFNLGVBQWUsR0FBRyxrQ0FBa0MsRUFBRSxDQUFDO0lBQzdELDJFQUEyRTtJQUMzRSw2RUFBNkU7SUFDN0UsNEVBQTRFO0lBQzVFLDJFQUEyRTtJQUMzRSx5RUFBeUU7SUFDekUsK0RBQStEO0lBQy9ELE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FDbkMsa0NBQWtDLEVBQUUsRUFDcEMsZUFBZSxDQUNoQixDQUFDO0lBQ0YsSUFBSSxjQUFjLElBQUksb0JBQW9CLEVBQUUsQ0FBQztRQUMzQyxPQUFPO1lBQ0wsWUFBWSxFQUFFLGNBQWM7WUFDNUIsY0FBYyxFQUFFLEdBQUcsaUJBQWlCLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUU7U0FDakUsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsR0FBRyxlQUFlLENBQUMsQ0FBQztJQUN4RCxPQUFPO1FBQ0wsWUFBWSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLGVBQWUsQ0FBQztRQUN2RCxjQUFjLEVBQ1osR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEdBQUcsaUJBQWlCLFFBQVEsR0FBRyxFQUFFO0tBQ3BFLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBXYWl0LWNvbnRpbnVhdGlvbiBkaXNwYXRjaDogZGVsYXkgKyBpZGVtcG90ZW5jeS1rZXkgc2VsZWN0aW9uLlxuICpcbiAqIFdoZW4gVjIgc3VzcGVuc2lvbiBwcm9jZXNzaW5nIG9ic2VydmVzIGEgcGVuZGluZyB3YWl0LCBpdCBlbnF1ZXVlcyBhXG4gKiBkZWxheWVkIFwiY29udGludWF0aW9uXCIgbWVzc2FnZSB0aGF0IGZpcmVzIG9uY2UgdGhlIHdhaXQgZWxhcHNlcyBhbmRcbiAqIGRyaXZlcyB0aGUgbmV4dCByZXBsYXkgKHdoaWNoIGNvbXBsZXRlcyB0aGUgd2FpdCB2aWEgdGhlIFwiY29tcGxldGVcbiAqIGVsYXBzZWQgd2FpdHNcIiBwYXNzKS4gVGhpcyBtb2R1bGUgZGVjaWRlcyB0aGUgbWVzc2FnZSdzIGBkZWxheVNlY29uZHNgXG4gKiBhbmQgYGlkZW1wb3RlbmN5S2V5YC5cbiAqXG4gKiBUaGUgY29udGludWF0aW9uIGlzIGtleWVkIG9uIHRoZSB3YWl0J3MgY29ycmVsYXRpb25JZDogd2hpbGUgYSB3YWl0IGlzXG4gKiBwZW5kaW5nLCBldmVyeSByZXBsYXkgcGFzcyBvdmVyIHRoZSBydW4gcmUtb2JzZXJ2ZXMgaXQgKGUuZy4sIG9uY2UgcGVyXG4gKiBzdGVwIGNvbXBsZXRpb24gaW4gYFByb21pc2UuYWxsKFtzdGVwcy4uLiwgc2xlZXAoKV0pYCksIGFuZCB3aXRob3V0XG4gKiBkZWR1cGUgZWFjaCBwYXNzIHdvdWxkIGVucXVldWUgYW5vdGhlciBkZWxheWVkIGNvbnRpbnVhdGlvbjogZWFjaCBvbmVcbiAqIGEgc3B1cmlvdXMgZnVsbCByZXBsYXkgd2hlbiB0aGUgd2FpdCBlbGFwc2VzLCBhbmQgZWFjaCBhIGZyZXNoIG1lc3NhZ2VcbiAqIHRoYXQgcmVzZXRzIHRoZSBkZWxpdmVyeS1hdHRlbXB0IHJ1bmF3YXkgZ3VhcmQuIEEga2V5IGlzIGF0dGFjaGVkIGluXG4gKiBhbGwgY2FzZXM6IHNvbWUgd29ybGRzIChlLmcuIHdvcmxkLXBvc3RncmVzKSBzZXJpYWxpemUga2V5LWxlc3NcbiAqIHdvcmtmbG93IG1lc3NhZ2VzIHBlciBydW4sIHdoaWNoIHdvdWxkIHBhcmsgdGhlIGNvbnRpbnVhdGlvbiBiZWhpbmRcbiAqIHRoZSBoYW5kbGVyJ3Mgb3duIGlubGluZSBzdGVwIGV4ZWN1dGlvbiBhbmQgZGVmZWF0IHRoZSByYWNlIHNlbWFudGljc1xuICogdGhlIGNvbnRpbnVhdGlvbiBleGlzdHMgdG8gcHJvdmlkZS5cbiAqXG4gKiBUaGUgYmFyZSBjb3JyZWxhdGlvbklkIGNhbm5vdCBiZSB0aGUga2V5IGluIGV2ZXJ5IGNhc2UsIHRob3VnaDogd29ybGRcbiAqIGRlZHVwZSB3aW5kb3dzIG91dGxpdmUgdGhlIGZpcnN0IGRlbGl2ZXJ5IChWUVMga2VlcHMgaWRlbXBvdGVuY3lcbiAqIHJlY29yZHMgdW50aWwgbWVzc2FnZS1yZXRlbnRpb24gVFRMOyB3b3JsZC1wb3N0Z3JlcyBrZWVwcyBhXG4gKiBjb21wbGV0ZWQta2V5cyBjYWNoZSksIHNvIG9uY2UgYSBrZXkgaGFzIGJlZW4gdXNlZCwgYSBsYXRlciBlbnF1ZXVlXG4gKiB1bmRlciB0aGUgc2FtZSBrZXkgaXMgc2lsZW50bHkgZHJvcHBlZC4gQW55IHNpdHVhdGlvbiB3aGVyZSBhXG4gKiBjb250aW51YXRpb24gaXMgZGVsaXZlcmVkIHdoaWxlIGl0cyB3YWl0IGlzIHN0aWxsIHBlbmRpbmcgdGhlcmVmb3JlXG4gKiBuZWVkcyBhIGZyZXNoIGtleSBmb3IgdGhlIHJlLWVucXVldWUsIG9yIHRoZSB3YWl0J3MgdGltZXIgaXMgbG9zdCBhbmRcbiAqIHRoZSBydW4gc3RhbGxzIHVudGlsIHVucmVsYXRlZCB0cmFmZmljIGhhcHBlbnMgdG8gd2FrZSBpdC4gVHdvIHN1Y2hcbiAqIHNpdHVhdGlvbnMgZXhpc3QsIGVhY2ggd2l0aCBpdHMgb3duIGtleSB2YXJpYXRpb246XG4gKlxuICogLSBXYWl0cyBsb25nZXIgdGhhbiB0aGUgbWF4aW11bSBxdWV1ZSBkZWxheSBhcmUgY2hhaW5lZDogdGhlIGRlbGF5IGlzXG4gKiAgIGNsYW1wZWQgdG8gYFdBSVRfQ09OVElOVUFUSU9OX01BWF9ERUxBWV9TRUNPTkRTYCAoMjNoOiBWUVMgbWVzc2FnZXNcbiAqICAgaGF2ZSBhIDI0aCByZXRlbnRpb24gbGltaXQsIGFuZCBvbmUgaG91ciBvZiBidWZmZXIgbWF0Y2hlc1xuICogICB3b3JsZC12ZXJjZWwncyBvd24gY2xhbXAgZm9yIGRlbGF5ZWQgcmUtZW5xdWV1ZXMpLCBzbyB0aGVcbiAqICAgY29udGludWF0aW9uIGludGVudGlvbmFsbHkgZmlyZXMgZWFybHksIHJlLW9ic2VydmVzIHRoZSB3YWl0LCBhbmRcbiAqICAgbXVzdCBlbnF1ZXVlIHRoZSBuZXh0IGhvcC4gVGhlIGtleSBpcyBzdWZmaXhlZCB3aXRoIHRoZSBob3AgaW5kZXhcbiAqICAgKGBjZWlsKHRpbWVvdXRTZWNvbmRzIC8gbWF4RGVsYXkpYCk6IHN0YWJsZSBmb3IgZXZlcnkgcmUtb2JzZXJ2YXRpb25cbiAqICAgd2l0aGluIHRoZSBzYW1lIGhvcCB3aW5kb3cgKHNvIHBhc3NlcyBkZWR1cGUpLCBkZWNyZW1lbnRlZCBhdCBlYWNoXG4gKiAgIGhvcCBkZWxpdmVyeSAoc28gdGhlIGNoYWluIGFsd2F5cyBhZHZhbmNlcykuIFdvcmxkcyB3aXRob3V0IGEgZGVsYXlcbiAqICAgbGltaXQgKHdvcmxkLXBvc3RncmVzLCB3b3JsZC1sb2NhbCkgdGFrZSB0aGUgc2FtZSDiiaQyM2ggaG9wcy5cbiAqXG4gKiAtIE5lYXItZWxhcHNlZCB3YWl0cyAo4omkMnMgcmVtYWluaW5nKSBnZXQgYSBzZWNvbmQtYnVja2V0ZWQgc3VmZml4LiBBXG4gKiAgIGNvbnRpbnVhdGlvbiBkZWxpdmVyZWQgbWFyZ2luYWxseSBlYXJseSAoY2xvY2sgc2tldyBiZXR3ZWVuIHRoZVxuICogICBlbnF1ZXVpbmcgYW5kIGhhbmRsaW5nIGhvc3RzOyB0aGUgY2VpbCgpIG9uIHRoZSBkZWxheSBjYW4gbGVhdmUgYSB+MFxuICogICBtYXJnaW4pIHJlLW9ic2VydmVzIHRoZSB3YWl0IGFzIHBlbmRpbmcgd2l0aCB+MXMgcmVtYWluaW5nIGFuZCBtdXN0XG4gKiAgIGJlIGFibGUgdG8gZW5xdWV1ZSBhIGZyZXNoIHNob3J0LWRlbGF5IHJldHJ5LiBUaGUgYnVja2V0IHN1ZmZpeFxuICogICBrZWVwcyB0aGF0IHJldHJ5IGVucXVldWVhYmxlIChpdHMg4omlMXMgZGVsYXkgZ3VhcmFudGVlcyBhIGxhdGVyXG4gKiAgIGJ1Y2tldCkgd2hpbGUgc3RpbGwgY29sbGFwc2luZyBzYW1lLWluc3RhbnQgZHVwbGljYXRlcy5cbiAqXG4gKiBNaWQtcmFuZ2Ugd2FpdHMgKG1vcmUgdGhhbiB0aGUgbmVhci1lbGFwc2VkIHRocmVzaG9sZCwgYXQgbW9zdCBvbmVcbiAqIGhvcCkgdXNlIHRoZSBiYXJlIGNvcnJlbGF0aW9uSWQ6IGV2ZXJ5IHJlLW9ic2VydmF0aW9uIHRhcmdldHMgdGhlIHNhbWVcbiAqIGRlYWRsaW5lLCBzbyBkZWR1cGluZyB0byB0aGUgZmlyc3QgbWVzc2FnZSBpcyBzZW1hbnRpY2FsbHkgbG9zc2xlc3MuXG4gKlxuICogVGhhdCBsYXN0IGNhc2UgdXNlZCB0byBiZSB0aGUgb25lIGhvbGUgaW4gdGhlIHNjaGVtZSwgYW5kIGl0IHdhcyBub3RcbiAqIHRoZW9yZXRpY2FsLiBBbnkgZGVsaXZlcnkgZWFybHkgZW5vdWdoIHRvIHJlLW9ic2VydmUgaXRzIG93biB3YWl0IGFzXG4gKiBwZW5kaW5nIGJ1cm5zIHRoZSBiYXJlIGtleSBvbiB0aGUgd2F5IGluOiB0aGUgcmUtZW5xdWV1ZSBpcyBkcm9wcGVkIGJ5XG4gKiB0aGUgZGVkdXBlIHdpbmRvdywgbm90aGluZyBlbHNlIGlzIHNjaGVkdWxlZCB0byB3YWtlIHRoZSBydW4sIGFuZCBub1xuICogYmFja3N0b3AgZXhpc3RzIGZvciBhIHdhaXQgdGhlIHdheSBpbmxpbmUgc3RlcCBvd25lcnNoaXAgcHJvdmlkZXMgb25lXG4gKiBmb3IgYSBzdGVwLiBUaGUgcnVuIHNsZWVwcyBmb3JldmVyLiBXYWl0cyBvdmVyIHRoZSB0aHJlc2hvbGQgaGF2ZSB6ZXJvXG4gKiB0b2xlcmFuY2UgZm9yIGl0LCB3aGljaCBpcyB3aHkgYW4gaW5mcmFzdHJ1Y3R1cmUgY2hhbmdlIGluIGRlbGl2ZXJ5XG4gKiB0aW1pbmcgd2FzIGFibGUgdG8gc3RyYW5kIHJ1bnMgYWNyb3NzIGV2ZXJ5IHB1Ymxpc2hlZCBTREsgdmVyc2lvbiBhdFxuICogb25jZSwgYWxsIG9mIHRoZW0ga2V5ZWQgdGhpcyB3YXkuXG4gKlxuICogU28gdGhlIGtleSBpcyBubyBsb25nZXIgZGVyaXZlZCBmcm9tIHRoZSB3YWl0IGFsb25lLiBBIGNvbnRpbnVhdGlvblxuICogY2FycmllcyB0aGUgd2FpdCBpdCB3YXMgYXJtZWQgZm9yIGFuZCBpdHMgYXR0ZW1wdCBudW1iZXJcbiAqICh7QGxpbmsgV29ya2Zsb3dJbnZva2VQYXlsb2FkLndhaXRDb250aW51YXRpb259KSwgYW5kIGFuIGludm9jYXRpb25cbiAqIHRoYXQgcmVjb2duaXplcyBpdHNlbGYgYXMgdGhlIGNvbnRpbnVhdGlvbiBmb3IgYSB3YWl0IHRoYXQgaXMgc3RpbGxcbiAqIHBlbmRpbmcgYXJtcyB0aGUgbmV4dCBvbmUgYXQgYGF0dGVtcHQgKyAxYC4gQXR0ZW1wdHMgYWR2YW5jZSBPTkxZIHdoZW5cbiAqIGFuIGVhcmx5IGRlbGl2ZXJ5IGFjdHVhbGx5IGhhcHBlbnMsIHNvIHRoZSBub3JtYWwgcGF0aCBpcyB1bnRvdWNoZWQ6XG4gKiBhdHRlbXB0IDAga2V5cyBleGFjdGx5IGFzIGJlZm9yZSwgYW5kIGV2ZXJ5IHJlLW9ic2VydmF0aW9uIHdpdGhpbiBvbmVcbiAqIGF0dGVtcHQgc3RpbGwgY29sbGFwc2VzIHRvIGEgc2luZ2xlIG1lc3NhZ2UuXG4gKi9cblxuaW1wb3J0IHsgZW52TnVtYmVyIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcblxuLyoqXG4gKiBNYXhpbXVtIGBkZWxheVNlY29uZHNgIGZvciBhIHNpbmdsZSB3YWl0LWNvbnRpbnVhdGlvbiBtZXNzYWdlLiBXYWl0c1xuICogbG9uZ2VyIHRoYW4gdGhpcyBhcmUgY2hhaW5lZCBhY3Jvc3MgbXVsdGlwbGUgaG9wcy4gMjMgaG91cnMgbGVhdmVzIGEgMWhcbiAqIGJ1ZmZlciB1bmRlciBWZXJjZWwgUXVldWVzJyBkZWZhdWx0IDI0aCBtZXNzYWdlIFRUTCBhbmQgbWlycm9yc1xuICogd29ybGQtdmVyY2VsJ3MgYE1BWF9ERUxBWV9TRUNPTkRTYC5cbiAqL1xuZXhwb3J0IGNvbnN0IFdBSVRfQ09OVElOVUFUSU9OX01BWF9ERUxBWV9TRUNPTkRTID0gODJfODAwO1xuXG4vKipcbiAqIFdhaXRzIHdpdGggYXQgbW9zdCB0aGlzIG1hbnkgc2Vjb25kcyByZW1haW5pbmcgdXNlIGEgc2Vjb25kLWJ1Y2tldGVkXG4gKiBpZGVtcG90ZW5jeSBrZXkgc28gYW4gZWFybHktZGVsaXZlcmVkIGNvbnRpbnVhdGlvbiBjYW4gcmUtZW5xdWV1ZSBpdHNcbiAqIHNob3J0LWRlbGF5IHJldHJ5LiBUaGlzIGlzIGFsc28gdGhlIGhvc3QgY2xvY2stc2tldyB0b2xlcmFuY2UgZm9yXG4gKiBtaWQtcmFuZ2Ugd2FpdHMga2V5ZWQgb24gdGhlIGJhcmUgY29ycmVsYXRpb25JZC5cbiAqL1xuZXhwb3J0IGNvbnN0IE5FQVJfRUxBUFNFRF9XQUlUX1RIUkVTSE9MRF9TRUNPTkRTID0gMjtcblxuLyoqIEVmZmVjdGl2ZSBtYXggY29udGludWF0aW9uIGRlbGF5LiBPdmVycmlkZTogYFdPUktGTE9XX1dBSVRfQ09OVElOVUFUSU9OX01BWF9ERUxBWV9TRUNPTkRTYC4gKi9cbmNvbnN0IGdldFdhaXRDb250aW51YXRpb25NYXhEZWxheVNlY29uZHMgPSAoKTogbnVtYmVyID0+XG4gIGVudk51bWJlcihcbiAgICAnV09SS0ZMT1dfV0FJVF9DT05USU5VQVRJT05fTUFYX0RFTEFZX1NFQ09ORFMnLFxuICAgIFdBSVRfQ09OVElOVUFUSU9OX01BWF9ERUxBWV9TRUNPTkRTLFxuICAgIHsgaW50ZWdlcjogdHJ1ZSwgbWluOiAxIH1cbiAgKTtcblxuLyoqIEVmZmVjdGl2ZSBuZWFyLWVsYXBzZWQgdGhyZXNob2xkLiBPdmVycmlkZTogYFdPUktGTE9XX05FQVJfRUxBUFNFRF9XQUlUX1RIUkVTSE9MRF9TRUNPTkRTYC4gKi9cbmNvbnN0IGdldE5lYXJFbGFwc2VkV2FpdFRocmVzaG9sZFNlY29uZHMgPSAoKTogbnVtYmVyID0+XG4gIGVudk51bWJlcihcbiAgICAnV09SS0ZMT1dfTkVBUl9FTEFQU0VEX1dBSVRfVEhSRVNIT0xEX1NFQ09ORFMnLFxuICAgIE5FQVJfRUxBUFNFRF9XQUlUX1RIUkVTSE9MRF9TRUNPTkRTXG4gICk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2FpdENvbnRpbnVhdGlvbkRpc3BhdGNoIHtcbiAgZGVsYXlTZWNvbmRzOiBudW1iZXI7XG4gIGlkZW1wb3RlbmN5S2V5OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIHF1ZXVlIGRlbGF5IGFuZCBpZGVtcG90ZW5jeSBrZXkgZm9yIGEgd2FpdC1jb250aW51YXRpb25cbiAqIG1lc3NhZ2UuIGB0aW1lb3V0U2Vjb25kc2AgaXMgdGhlIHRpbWUgdW50aWwgdGhlIHdhaXQncyBgcmVzdW1lQXRgXG4gKiAoZmxvb3JlZCBhdCAxcyBieSB0aGUgc3VzcGVuc2lvbiBoYW5kbGVyKTsgYHdhaXRDb3JyZWxhdGlvbklkYFxuICogaWRlbnRpZmllcyB0aGUgd2FpdCBzbyByZXBlYXRlZCBzdXNwZW5zaW9uIHBhc3NlcyBkZWR1cGUuXG4gKlxuICogYGF0dGVtcHRgIGlzIHRoZSBudW1iZXIgb2YgY29udGludWF0aW9ucyBhbHJlYWR5IHNwZW50IG9uIHRoaXMgd2FpdCwgdGFrZW5cbiAqIGZyb20gdGhlIGluY29taW5nIG1lc3NhZ2Ugd2hlbiB0aGlzIGludm9jYXRpb24gSVMgb25lIG9mIHRoZW0gKHNlZVxuICoge0BsaW5rIFdvcmtmbG93SW52b2tlUGF5bG9hZC53YWl0Q29udGludWF0aW9ufSkuIEl0IG9ubHkgZXZlciBtb3ZlcyB3aGVuIGFcbiAqIGNvbnRpbnVhdGlvbiBhcnJpdmVkIGJlZm9yZSBpdHMgd2FpdCBlbGFwc2VkLCB3aGljaCBpcyBleGFjdGx5IHdoZW4gdGhlXG4gKiBwcmV2aW91cyBrZXkgaXMgc3BlbnQgYW5kIHJlLXVzaW5nIGl0IHdvdWxkIGRyb3AgdGhlIG1lc3NhZ2UuIEF0dGVtcHQgMFxuICoga2V5cyBpZGVudGljYWxseSB0byB0aGUgc2NoZW1lIGJlZm9yZSBhdHRlbXB0cyBleGlzdGVkLCBzbyB0aGUgb3JkaW5hcnlcbiAqIHBhdGgg4oCUIGFybSBvbmNlLCBkZWxpdmVyIG9uY2UsIGNvbXBsZXRlIOKAlCBpcyBieXRlLWZvci1ieXRlIHVuY2hhbmdlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdhaXRDb250aW51YXRpb25EaXNwYXRjaChcbiAgdGltZW91dFNlY29uZHM6IG51bWJlcixcbiAgd2FpdENvcnJlbGF0aW9uSWQ6IHN0cmluZyxcbiAgbm93OiBudW1iZXIgPSBEYXRlLm5vdygpLFxuICBhdHRlbXB0ID0gMFxuKTogV2FpdENvbnRpbnVhdGlvbkRpc3BhdGNoIHtcbiAgY29uc3QgZGlzcGF0Y2ggPSB3YWl0Q29udGludWF0aW9uRGlzcGF0Y2hGb3JBdHRlbXB0WmVybyhcbiAgICB0aW1lb3V0U2Vjb25kcyxcbiAgICB3YWl0Q29ycmVsYXRpb25JZCxcbiAgICBub3dcbiAgKTtcbiAgaWYgKGF0dGVtcHQgPD0gMCkgcmV0dXJuIGRpc3BhdGNoO1xuICByZXR1cm4ge1xuICAgIGRlbGF5U2Vjb25kczogZGlzcGF0Y2guZGVsYXlTZWNvbmRzLFxuICAgIGlkZW1wb3RlbmN5S2V5OiBgJHtkaXNwYXRjaC5pZGVtcG90ZW5jeUtleX06YSR7YXR0ZW1wdH1gLFxuICB9O1xufVxuXG5mdW5jdGlvbiB3YWl0Q29udGludWF0aW9uRGlzcGF0Y2hGb3JBdHRlbXB0WmVybyhcbiAgdGltZW91dFNlY29uZHM6IG51bWJlcixcbiAgd2FpdENvcnJlbGF0aW9uSWQ6IHN0cmluZyxcbiAgbm93OiBudW1iZXJcbik6IFdhaXRDb250aW51YXRpb25EaXNwYXRjaCB7XG4gIGNvbnN0IG1heERlbGF5U2Vjb25kcyA9IGdldFdhaXRDb250aW51YXRpb25NYXhEZWxheVNlY29uZHMoKTtcbiAgLy8gVGhlIG5lYXItZWxhcHNlZCBicmFuY2ggcmV0dXJucyB0aGUgZnVsbCByZW1haW5pbmcgdGltZSBhcyB0aGUgZGVsYXksIHNvXG4gIC8vIGl0cyB0aHJlc2hvbGQgY2FuIG5ldmVyIGV4Y2VlZCB0aGUgbWF4IGRlbGF5LiBPdGhlcndpc2UgYSB3YWl0IGJldHdlZW4gdGhlXG4gIC8vIG1heCBhbmQgdGhlIHRocmVzaG9sZCB3b3VsZCBiZSBkaXNwYXRjaGVkIHdpdGggYSBkZWxheSBhYm92ZSB0aGUgbWF4LiBDYXBcbiAgLy8gdGhlIHRocmVzaG9sZCBhdCB0aGUgbWF4IHNvIGV2ZXJ5IGJyYW5jaCB5aWVsZHMgYSBkZWxheSB3aXRoaW4gaXQuIChXaXRoXG4gIC8vIGRlZmF1bHRzLCB0aHJlc2hvbGQgMnMgYW5kIG1heCA4Ml84MDBzLCB0aGlzIGlzIGEgbm8tb3A7IGl0IG9ubHkgYml0ZXNcbiAgLy8gd2hlbiB0aGUgbWF4IGlzIHR1bmVkIGRvd24gYmVsb3cgdGhlIHRocmVzaG9sZCBmb3IgdGVzdGluZy4pXG4gIGNvbnN0IG5lYXJFbGFwc2VkVGhyZXNob2xkID0gTWF0aC5taW4oXG4gICAgZ2V0TmVhckVsYXBzZWRXYWl0VGhyZXNob2xkU2Vjb25kcygpLFxuICAgIG1heERlbGF5U2Vjb25kc1xuICApO1xuICBpZiAodGltZW91dFNlY29uZHMgPD0gbmVhckVsYXBzZWRUaHJlc2hvbGQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGVsYXlTZWNvbmRzOiB0aW1lb3V0U2Vjb25kcyxcbiAgICAgIGlkZW1wb3RlbmN5S2V5OiBgJHt3YWl0Q29ycmVsYXRpb25JZH06JHtNYXRoLmZsb29yKG5vdyAvIDEwMDApfWAsXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IGhvcCA9IE1hdGguY2VpbCh0aW1lb3V0U2Vjb25kcyAvIG1heERlbGF5U2Vjb25kcyk7XG4gIHJldHVybiB7XG4gICAgZGVsYXlTZWNvbmRzOiBNYXRoLm1pbih0aW1lb3V0U2Vjb25kcywgbWF4RGVsYXlTZWNvbmRzKSxcbiAgICBpZGVtcG90ZW5jeUtleTpcbiAgICAgIGhvcCA9PT0gMSA/IHdhaXRDb3JyZWxhdGlvbklkIDogYCR7d2FpdENvcnJlbGF0aW9uSWR9OmhvcC0ke2hvcH1gLFxuICB9O1xufVxuIl19
|
|
@@ -3,7 +3,7 @@ export declare function waitUntil(promise: Promise<unknown>): void;
|
|
|
3
3
|
* Schedule a background promise via `waitUntil`, guaranteeing that the
|
|
4
4
|
* promise handed to `waitUntil` can never reject. Nothing consumes a
|
|
5
5
|
* `waitUntil` promise, so a rejection surfaces as an `unhandledRejection`
|
|
6
|
-
* and can crash the process
|
|
6
|
+
* and can crash the process, even when the same underlying error is
|
|
7
7
|
* correctly handled by an awaited copy elsewhere.
|
|
8
8
|
*
|
|
9
9
|
* Expected client-disconnect errors (`AbortError` / `ResponseAborted`)
|
|
@@ -7,7 +7,7 @@ export function waitUntil(promise) {
|
|
|
7
7
|
* Schedule a background promise via `waitUntil`, guaranteeing that the
|
|
8
8
|
* promise handed to `waitUntil` can never reject. Nothing consumes a
|
|
9
9
|
* `waitUntil` promise, so a rejection surfaces as an `unhandledRejection`
|
|
10
|
-
* and can crash the process
|
|
10
|
+
* and can crash the process, even when the same underlying error is
|
|
11
11
|
* correctly handled by an awaited copy elsewhere.
|
|
12
12
|
*
|
|
13
13
|
* Expected client-disconnect errors (`AbortError` / `ResponseAborted`)
|
|
@@ -39,4 +39,4 @@ export async function waitedUntil(fn) {
|
|
|
39
39
|
}));
|
|
40
40
|
return result;
|
|
41
41
|
}
|
|
42
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
42
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FpdC11bnRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL3dhaXQtdW50aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxVQUFVLFNBQVMsQ0FBQyxPQUF5QjtJQUNqRCxLQUFLLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRTtRQUN0RCxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDckIsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FDM0IsT0FBeUIsRUFDekIsT0FBK0I7SUFFL0IsU0FBUyxDQUNQLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtRQUNwQixNQUFNLFlBQVksR0FDaEIsR0FBRyxFQUFFLElBQUksS0FBSyxZQUFZLElBQUksR0FBRyxFQUFFLElBQUksS0FBSyxpQkFBaUIsQ0FBQztRQUNoRSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDO2dCQUNILE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNmLENBQUM7WUFBQyxNQUFNLENBQUM7Z0JBQ1AsbURBQW1EO1lBQ3JELENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQ0gsQ0FBQztBQUNKLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLFdBQVcsQ0FBSSxFQUFvQjtJQUN2RCxNQUFNLE1BQU0sR0FBRyxFQUFFLEVBQUUsQ0FBQztJQUNwQixTQUFTLENBQ1AsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUU7UUFDaEIsZ0RBQWdEO1FBQ2hELGtEQUFrRDtRQUNsRCx5QkFBeUI7SUFDM0IsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNGLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gd2FpdFVudGlsKHByb21pc2U6IFByb21pc2U8dW5rbm93bj4pOiB2b2lkIHtcbiAgdm9pZCBpbXBvcnQoJ0B2ZXJjZWwvZnVuY3Rpb25zJykudGhlbigoeyB3YWl0VW50aWwgfSkgPT4ge1xuICAgIHdhaXRVbnRpbChwcm9taXNlKTtcbiAgfSk7XG59XG5cbi8qKlxuICogU2NoZWR1bGUgYSBiYWNrZ3JvdW5kIHByb21pc2UgdmlhIGB3YWl0VW50aWxgLCBndWFyYW50ZWVpbmcgdGhhdCB0aGVcbiAqIHByb21pc2UgaGFuZGVkIHRvIGB3YWl0VW50aWxgIGNhbiBuZXZlciByZWplY3QuIE5vdGhpbmcgY29uc3VtZXMgYVxuICogYHdhaXRVbnRpbGAgcHJvbWlzZSwgc28gYSByZWplY3Rpb24gc3VyZmFjZXMgYXMgYW4gYHVuaGFuZGxlZFJlamVjdGlvbmBcbiAqIGFuZCBjYW4gY3Jhc2ggdGhlIHByb2Nlc3MsIGV2ZW4gd2hlbiB0aGUgc2FtZSB1bmRlcmx5aW5nIGVycm9yIGlzXG4gKiBjb3JyZWN0bHkgaGFuZGxlZCBieSBhbiBhd2FpdGVkIGNvcHkgZWxzZXdoZXJlLlxuICpcbiAqIEV4cGVjdGVkIGNsaWVudC1kaXNjb25uZWN0IGVycm9ycyAoYEFib3J0RXJyb3JgIC8gYFJlc3BvbnNlQWJvcnRlZGApXG4gKiBhcmUgaWdub3JlZC4gQW55IG90aGVyIGVycm9yIGlzIHBhc3NlZCB0byBgb25FcnJvcmAgYW5kIHN3YWxsb3dlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNhZmVXYWl0VW50aWwoXG4gIHByb21pc2U6IFByb21pc2U8dW5rbm93bj4sXG4gIG9uRXJyb3I6IChlcnI6IHVua25vd24pID0+IHZvaWRcbik6IHZvaWQge1xuICB3YWl0VW50aWwoXG4gICAgcHJvbWlzZS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICBjb25zdCBpc0Fib3J0RXJyb3IgPVxuICAgICAgICBlcnI/Lm5hbWUgPT09ICdBYm9ydEVycm9yJyB8fCBlcnI/Lm5hbWUgPT09ICdSZXNwb25zZUFib3J0ZWQnO1xuICAgICAgaWYgKCFpc0Fib3J0RXJyb3IpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBvbkVycm9yKGVycik7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIE5ldmVyIGxldCBvbkVycm9yIGJyZWFrIHRoZSBuby1yZWplY3QgZ3VhcmFudGVlLlxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgKTtcbn1cblxuLyoqXG4gKiBBIHNtYWxsIHdyYXBwZXIgYXJvdW5kIGB3YWl0VW50aWxgIHRoYXQgYWxzbyByZXR1cm5zXG4gKiB0aGUgcmVzdWx0IG9mIHRoZSBhd2FpdGVkIHByb21pc2UuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3YWl0ZWRVbnRpbDxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICBjb25zdCByZXN1bHQgPSBmbigpO1xuICB3YWl0VW50aWwoXG4gICAgcmVzdWx0LmNhdGNoKCgpID0+IHtcbiAgICAgIC8vIElnbm9yZSBlcnJvciBmcm9tIHRoZSBwcm9taXNlIGJlaW5nIHJlamVjdGVkLlxuICAgICAgLy8gSXQncyBleHBlY3RlZCB0aGF0IHRoZSBpbnZva2VyIG9mIGB3YWl0ZWRVbnRpbGBcbiAgICAgIC8vIHdpbGwgaGFuZGxlIHRoZSBlcnJvci5cbiAgICB9KVxuICApO1xuICByZXR1cm4gcmVzdWx0O1xufVxuIl19
|
|
@@ -3,18 +3,29 @@ type WorldSpecVersionMetadata = Pick<World, 'specVersion'>;
|
|
|
3
3
|
/**
|
|
4
4
|
* Rejects a World this runtime cannot speak to.
|
|
5
5
|
*
|
|
6
|
-
* The accepted range is
|
|
7
|
-
*
|
|
8
|
-
*
|
|
6
|
+
* The accepted range is
|
|
7
|
+
* `[SPEC_VERSION_SUPPORTS_SLOT_IDENTITY, SPEC_VERSION_MAX_SUPPORTED]`. Below
|
|
8
|
+
* the floor means an old World package paired with a new runtime, which cannot
|
|
9
|
+
* serve the protocol this runtime speaks. A World that does not number events
|
|
10
|
+
* by position allocates ids the runtime cannot read positions out of. Above the
|
|
9
11
|
* ceiling means a World built against a newer spec than this runtime knows how
|
|
10
12
|
* to read.
|
|
11
13
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
14
|
+
* The floor is deliberately the slot-identity version rather than
|
|
15
|
+
* `SPEC_VERSION_CURRENT`, which now sits one above it at the sealed log. Two
|
|
16
|
+
* reasons, and both are about the window a spec bump is staged over:
|
|
17
|
+
*
|
|
18
|
+
* - `WORKFLOW_SEALED_LOG=0` puts a deployment back on slot identity, so its
|
|
19
|
+
* World declares the lower version. Flooring at the version we stamp by
|
|
20
|
+
* default would make that kill switch reject the very World it selects,
|
|
21
|
+
* turning a rollback into a startup failure.
|
|
22
|
+
* - A World package one version behind the runtime it ships alongside is the
|
|
23
|
+
* normal state mid-bump, and it can still serve the protocol: slot identity
|
|
24
|
+
* is what the runtime actually requires, and sealed logs are a capability on
|
|
25
|
+
* top of it that only the backend implements.
|
|
26
|
+
*
|
|
27
|
+
* The range narrows again when the sealed log becomes mandatory and the flag
|
|
28
|
+
* goes away, exactly as slot identity's own floor did.
|
|
18
29
|
*/
|
|
19
30
|
export declare function assertWorldSupportsRuntimeProtocol(world: WorldSpecVersionMetadata): void;
|
|
20
31
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"world-compatibility.d.ts","sourceRoot":"","sources":["../../src/runtime/world-compatibility.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAM7C,KAAK,wBAAwB,GAAG,IAAI,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;AAE3D
|
|
1
|
+
{"version":3,"file":"world-compatibility.d.ts","sourceRoot":"","sources":["../../src/runtime/world-compatibility.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAM7C,KAAK,wBAAwB,GAAG,IAAI,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;AAE3D;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,kCAAkC,CAChD,KAAK,EAAE,wBAAwB,GAC9B,IAAI,CAkBN"}
|
|
@@ -1,33 +1,44 @@
|
|
|
1
1
|
import { WorkflowRuntimeError } from '@workflow/errors';
|
|
2
|
-
import {
|
|
2
|
+
import { SPEC_VERSION_MAX_SUPPORTED, SPEC_VERSION_SUPPORTS_SLOT_IDENTITY, } from '@workflow/world';
|
|
3
3
|
/**
|
|
4
4
|
* Rejects a World this runtime cannot speak to.
|
|
5
5
|
*
|
|
6
|
-
* The accepted range is
|
|
7
|
-
*
|
|
8
|
-
*
|
|
6
|
+
* The accepted range is
|
|
7
|
+
* `[SPEC_VERSION_SUPPORTS_SLOT_IDENTITY, SPEC_VERSION_MAX_SUPPORTED]`. Below
|
|
8
|
+
* the floor means an old World package paired with a new runtime, which cannot
|
|
9
|
+
* serve the protocol this runtime speaks. A World that does not number events
|
|
10
|
+
* by position allocates ids the runtime cannot read positions out of. Above the
|
|
9
11
|
* ceiling means a World built against a newer spec than this runtime knows how
|
|
10
12
|
* to read.
|
|
11
13
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
14
|
+
* The floor is deliberately the slot-identity version rather than
|
|
15
|
+
* `SPEC_VERSION_CURRENT`, which now sits one above it at the sealed log. Two
|
|
16
|
+
* reasons, and both are about the window a spec bump is staged over:
|
|
17
|
+
*
|
|
18
|
+
* - `WORKFLOW_SEALED_LOG=0` puts a deployment back on slot identity, so its
|
|
19
|
+
* World declares the lower version. Flooring at the version we stamp by
|
|
20
|
+
* default would make that kill switch reject the very World it selects,
|
|
21
|
+
* turning a rollback into a startup failure.
|
|
22
|
+
* - A World package one version behind the runtime it ships alongside is the
|
|
23
|
+
* normal state mid-bump, and it can still serve the protocol: slot identity
|
|
24
|
+
* is what the runtime actually requires, and sealed logs are a capability on
|
|
25
|
+
* top of it that only the backend implements.
|
|
26
|
+
*
|
|
27
|
+
* The range narrows again when the sealed log becomes mandatory and the flag
|
|
28
|
+
* goes away, exactly as slot identity's own floor did.
|
|
18
29
|
*/
|
|
19
30
|
export function assertWorldSupportsRuntimeProtocol(world) {
|
|
20
31
|
const declared = world.specVersion;
|
|
21
32
|
if (declared !== undefined &&
|
|
22
33
|
declared !== null &&
|
|
23
|
-
declared >=
|
|
34
|
+
declared >= SPEC_VERSION_SUPPORTS_SLOT_IDENTITY &&
|
|
24
35
|
declared <= SPEC_VERSION_MAX_SUPPORTED) {
|
|
25
36
|
return;
|
|
26
37
|
}
|
|
27
38
|
const supportedVersion = declared ?? 'none';
|
|
28
|
-
throw new WorkflowRuntimeError(`This Workflow runtime supports Worlds with spec version ${
|
|
39
|
+
throw new WorkflowRuntimeError(`This Workflow runtime supports Worlds with spec version ${SPEC_VERSION_SUPPORTS_SLOT_IDENTITY} ` +
|
|
29
40
|
`through ${SPEC_VERSION_MAX_SUPPORTED}, ` +
|
|
30
41
|
`but the configured World declares spec version ${supportedVersion}. ` +
|
|
31
42
|
'Install a World package version compatible with the current Workflow runtime.');
|
|
32
43
|
}
|
|
33
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
44
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ybGQtY29tcGF0aWJpbGl0eS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL3dvcmxkLWNvbXBhdGliaWxpdHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFeEQsT0FBTyxFQUNMLDBCQUEwQixFQUMxQixtQ0FBbUMsR0FDcEMsTUFBTSxpQkFBaUIsQ0FBQztBQUl6Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQkc7QUFDSCxNQUFNLFVBQVUsa0NBQWtDLENBQ2hELEtBQStCO0lBRS9CLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUM7SUFDbkMsSUFDRSxRQUFRLEtBQUssU0FBUztRQUN0QixRQUFRLEtBQUssSUFBSTtRQUNqQixRQUFRLElBQUksbUNBQW1DO1FBQy9DLFFBQVEsSUFBSSwwQkFBMEIsRUFDdEMsQ0FBQztRQUNELE9BQU87SUFDVCxDQUFDO0lBRUQsTUFBTSxnQkFBZ0IsR0FBRyxRQUFRLElBQUksTUFBTSxDQUFDO0lBQzVDLE1BQU0sSUFBSSxvQkFBb0IsQ0FDNUIsMkRBQTJELG1DQUFtQyxHQUFHO1FBQy9GLFdBQVcsMEJBQTBCLElBQUk7UUFDekMsa0RBQWtELGdCQUFnQixJQUFJO1FBQ3RFLCtFQUErRSxDQUNsRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFdvcmtmbG93UnVudGltZUVycm9yIH0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQgdHlwZSB7IFdvcmxkIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7XG4gIFNQRUNfVkVSU0lPTl9NQVhfU1VQUE9SVEVELFxuICBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfU0xPVF9JREVOVElUWSxcbn0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcblxudHlwZSBXb3JsZFNwZWNWZXJzaW9uTWV0YWRhdGEgPSBQaWNrPFdvcmxkLCAnc3BlY1ZlcnNpb24nPjtcblxuLyoqXG4gKiBSZWplY3RzIGEgV29ybGQgdGhpcyBydW50aW1lIGNhbm5vdCBzcGVhayB0by5cbiAqXG4gKiBUaGUgYWNjZXB0ZWQgcmFuZ2UgaXNcbiAqIGBbU1BFQ19WRVJTSU9OX1NVUFBPUlRTX1NMT1RfSURFTlRJVFksIFNQRUNfVkVSU0lPTl9NQVhfU1VQUE9SVEVEXWAuIEJlbG93XG4gKiB0aGUgZmxvb3IgbWVhbnMgYW4gb2xkIFdvcmxkIHBhY2thZ2UgcGFpcmVkIHdpdGggYSBuZXcgcnVudGltZSwgd2hpY2ggY2Fubm90XG4gKiBzZXJ2ZSB0aGUgcHJvdG9jb2wgdGhpcyBydW50aW1lIHNwZWFrcy4gQSBXb3JsZCB0aGF0IGRvZXMgbm90IG51bWJlciBldmVudHNcbiAqIGJ5IHBvc2l0aW9uIGFsbG9jYXRlcyBpZHMgdGhlIHJ1bnRpbWUgY2Fubm90IHJlYWQgcG9zaXRpb25zIG91dCBvZi4gQWJvdmUgdGhlXG4gKiBjZWlsaW5nIG1lYW5zIGEgV29ybGQgYnVpbHQgYWdhaW5zdCBhIG5ld2VyIHNwZWMgdGhhbiB0aGlzIHJ1bnRpbWUga25vd3MgaG93XG4gKiB0byByZWFkLlxuICpcbiAqIFRoZSBmbG9vciBpcyBkZWxpYmVyYXRlbHkgdGhlIHNsb3QtaWRlbnRpdHkgdmVyc2lvbiByYXRoZXIgdGhhblxuICogYFNQRUNfVkVSU0lPTl9DVVJSRU5UYCwgd2hpY2ggbm93IHNpdHMgb25lIGFib3ZlIGl0IGF0IHRoZSBzZWFsZWQgbG9nLiBUd29cbiAqIHJlYXNvbnMsIGFuZCBib3RoIGFyZSBhYm91dCB0aGUgd2luZG93IGEgc3BlYyBidW1wIGlzIHN0YWdlZCBvdmVyOlxuICpcbiAqIC0gYFdPUktGTE9XX1NFQUxFRF9MT0c9MGAgcHV0cyBhIGRlcGxveW1lbnQgYmFjayBvbiBzbG90IGlkZW50aXR5LCBzbyBpdHNcbiAqICAgV29ybGQgZGVjbGFyZXMgdGhlIGxvd2VyIHZlcnNpb24uIEZsb29yaW5nIGF0IHRoZSB2ZXJzaW9uIHdlIHN0YW1wIGJ5XG4gKiAgIGRlZmF1bHQgd291bGQgbWFrZSB0aGF0IGtpbGwgc3dpdGNoIHJlamVjdCB0aGUgdmVyeSBXb3JsZCBpdCBzZWxlY3RzLFxuICogICB0dXJuaW5nIGEgcm9sbGJhY2sgaW50byBhIHN0YXJ0dXAgZmFpbHVyZS5cbiAqIC0gQSBXb3JsZCBwYWNrYWdlIG9uZSB2ZXJzaW9uIGJlaGluZCB0aGUgcnVudGltZSBpdCBzaGlwcyBhbG9uZ3NpZGUgaXMgdGhlXG4gKiAgIG5vcm1hbCBzdGF0ZSBtaWQtYnVtcCwgYW5kIGl0IGNhbiBzdGlsbCBzZXJ2ZSB0aGUgcHJvdG9jb2w6IHNsb3QgaWRlbnRpdHlcbiAqICAgaXMgd2hhdCB0aGUgcnVudGltZSBhY3R1YWxseSByZXF1aXJlcywgYW5kIHNlYWxlZCBsb2dzIGFyZSBhIGNhcGFiaWxpdHkgb25cbiAqICAgdG9wIG9mIGl0IHRoYXQgb25seSB0aGUgYmFja2VuZCBpbXBsZW1lbnRzLlxuICpcbiAqIFRoZSByYW5nZSBuYXJyb3dzIGFnYWluIHdoZW4gdGhlIHNlYWxlZCBsb2cgYmVjb21lcyBtYW5kYXRvcnkgYW5kIHRoZSBmbGFnXG4gKiBnb2VzIGF3YXksIGV4YWN0bHkgYXMgc2xvdCBpZGVudGl0eSdzIG93biBmbG9vciBkaWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRXb3JsZFN1cHBvcnRzUnVudGltZVByb3RvY29sKFxuICB3b3JsZDogV29ybGRTcGVjVmVyc2lvbk1ldGFkYXRhXG4pOiB2b2lkIHtcbiAgY29uc3QgZGVjbGFyZWQgPSB3b3JsZC5zcGVjVmVyc2lvbjtcbiAgaWYgKFxuICAgIGRlY2xhcmVkICE9PSB1bmRlZmluZWQgJiZcbiAgICBkZWNsYXJlZCAhPT0gbnVsbCAmJlxuICAgIGRlY2xhcmVkID49IFNQRUNfVkVSU0lPTl9TVVBQT1JUU19TTE9UX0lERU5USVRZICYmXG4gICAgZGVjbGFyZWQgPD0gU1BFQ19WRVJTSU9OX01BWF9TVVBQT1JURURcbiAgKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgc3VwcG9ydGVkVmVyc2lvbiA9IGRlY2xhcmVkID8/ICdub25lJztcbiAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgIGBUaGlzIFdvcmtmbG93IHJ1bnRpbWUgc3VwcG9ydHMgV29ybGRzIHdpdGggc3BlYyB2ZXJzaW9uICR7U1BFQ19WRVJTSU9OX1NVUFBPUlRTX1NMT1RfSURFTlRJVFl9IGAgK1xuICAgICAgYHRocm91Z2ggJHtTUEVDX1ZFUlNJT05fTUFYX1NVUFBPUlRFRH0sIGAgK1xuICAgICAgYGJ1dCB0aGUgY29uZmlndXJlZCBXb3JsZCBkZWNsYXJlcyBzcGVjIHZlcnNpb24gJHtzdXBwb3J0ZWRWZXJzaW9ufS4gYCArXG4gICAgICAnSW5zdGFsbCBhIFdvcmxkIHBhY2thZ2UgdmVyc2lvbiBjb21wYXRpYmxlIHdpdGggdGhlIGN1cnJlbnQgV29ya2Zsb3cgcnVudGltZS4nXG4gICk7XG59XG4iXX0=
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Server-only side-effect module that ensures `world.ts` is loaded so its
|
|
3
|
-
* module-load side effect
|
|
3
|
+
* module-load side effect (`globalThis[GetWorldFnKey] ??= getWorld`)
|
|
4
4
|
* fires in host bundles.
|
|
5
5
|
*
|
|
6
6
|
* # Why this exists
|
|
7
7
|
*
|
|
8
8
|
* `getWorldLazy()` in `./get-world-lazy.ts` checks the globalThis cache
|
|
9
9
|
* populated by `world.ts`'s module-load side effect. When a server route
|
|
10
|
-
* only consumes a helper that goes through `getWorldLazy`
|
|
11
|
-
* `start` from `workflow/api`, or `defineHook().resume()` from `workflow`
|
|
12
|
-
*
|
|
10
|
+
* only consumes a helper that goes through `getWorldLazy` (for example
|
|
11
|
+
* `start` from `workflow/api`, or `defineHook().resume()` from `workflow`),
|
|
12
|
+
* webpack/turbopack can tree-shake the named import `{ getWorld }` out
|
|
13
13
|
* of `runtime.ts`, taking `world.ts`'s module evaluation with it. The
|
|
14
14
|
* globalThis registration never fires.
|
|
15
15
|
*
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
*
|
|
42
42
|
* If you add another `getWorldLazy()` consumer that's reachable from a
|
|
43
43
|
* host route without going through `workflow` or `workflow/api`, make
|
|
44
|
-
* sure that entry also imports this module
|
|
44
|
+
* sure that entry also imports this module, or that it transitively
|
|
45
45
|
* reaches `world.ts` via a non-tree-shakeable path. Adding a regression
|
|
46
46
|
* test in `world-init.test.ts` is preferred to relying on careful manual
|
|
47
47
|
* tracing.
|