@workflow/core 5.0.0-beta.4 → 5.0.0-beta.41
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/attribute-changes.d.ts +7 -0
- package/dist/attribute-changes.d.ts.map +1 -0
- package/dist/attribute-changes.js +25 -0
- package/dist/capabilities.d.ts +33 -1
- package/dist/capabilities.d.ts.map +1 -1
- package/dist/capabilities.js +71 -4
- package/dist/capture-stack.d.ts +16 -0
- package/dist/capture-stack.d.ts.map +1 -0
- package/dist/capture-stack.js +21 -0
- package/dist/class-serialization.d.ts +32 -0
- package/dist/class-serialization.d.ts.map +1 -1
- package/dist/class-serialization.js +37 -1
- package/dist/classify-error.d.ts +26 -3
- package/dist/classify-error.d.ts.map +1 -1
- package/dist/classify-error.js +109 -6
- package/dist/context-errors.d.ts +27 -0
- package/dist/context-errors.d.ts.map +1 -0
- package/dist/context-errors.js +101 -0
- package/dist/context-violation-error.d.ts +97 -0
- package/dist/context-violation-error.d.ts.map +1 -0
- package/dist/context-violation-error.js +149 -0
- package/dist/create-hook.d.ts +62 -4
- package/dist/create-hook.d.ts.map +1 -1
- package/dist/create-hook.js +4 -3
- package/dist/define-hook.d.ts.map +1 -1
- package/dist/define-hook.js +20 -5
- package/dist/describe-error.d.ts +70 -0
- package/dist/describe-error.d.ts.map +1 -0
- package/dist/describe-error.js +189 -0
- package/dist/encryption.d.ts +37 -3
- package/dist/encryption.d.ts.map +1 -1
- package/dist/encryption.js +97 -31
- package/dist/events-consumer.d.ts +147 -1
- package/dist/events-consumer.d.ts.map +1 -1
- package/dist/events-consumer.js +444 -43
- package/dist/flushable-stream.d.ts +65 -10
- package/dist/flushable-stream.d.ts.map +1 -1
- package/dist/flushable-stream.js +131 -18
- package/dist/global.d.ts +37 -1
- package/dist/global.d.ts.map +1 -1
- package/dist/global.js +21 -3
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/log-format.d.ts +25 -0
- package/dist/log-format.d.ts.map +1 -0
- package/dist/log-format.js +250 -0
- package/dist/logger.d.ts +29 -30
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +82 -32
- package/dist/private.d.ts +246 -8
- package/dist/private.d.ts.map +1 -1
- package/dist/private.js +345 -9
- package/dist/replay-payload-cache.d.ts +68 -0
- package/dist/replay-payload-cache.d.ts.map +1 -0
- package/dist/replay-payload-cache.js +160 -0
- package/dist/runtime/compute-instance.d.ts +12 -0
- package/dist/runtime/compute-instance.d.ts.map +1 -0
- package/dist/runtime/compute-instance.js +13 -0
- package/dist/runtime/constants.d.ts +251 -0
- package/dist/runtime/constants.d.ts.map +1 -1
- package/dist/runtime/constants.js +425 -16
- package/dist/runtime/count-step-started-events.d.ts +52 -0
- package/dist/runtime/count-step-started-events.d.ts.map +1 -0
- package/dist/runtime/count-step-started-events.js +72 -0
- package/dist/runtime/deployment-guard.d.ts +99 -0
- package/dist/runtime/deployment-guard.d.ts.map +1 -0
- package/dist/runtime/deployment-guard.js +154 -0
- package/dist/runtime/get-port-lazy.d.ts +25 -0
- package/dist/runtime/get-port-lazy.d.ts.map +1 -0
- package/dist/runtime/get-port-lazy.js +92 -0
- package/dist/runtime/get-world-lazy.d.ts +23 -0
- package/dist/runtime/get-world-lazy.d.ts.map +1 -0
- package/dist/runtime/get-world-lazy.js +46 -0
- package/dist/runtime/helpers.d.ts +327 -10
- package/dist/runtime/helpers.d.ts.map +1 -1
- package/dist/runtime/helpers.js +586 -40
- package/dist/runtime/quickjs-assets.generated.d.ts +14 -0
- package/dist/runtime/quickjs-assets.generated.d.ts.map +1 -0
- package/dist/runtime/quickjs-assets.generated.js +30 -0
- package/dist/runtime/quickjs-entrypoint.d.ts +124 -0
- package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -0
- package/dist/runtime/quickjs-entrypoint.js +1437 -0
- package/dist/runtime/quickjs-runtime.d.ts +228 -0
- package/dist/runtime/quickjs-runtime.d.ts.map +1 -0
- package/dist/runtime/quickjs-runtime.js +2372 -0
- package/dist/runtime/quickjs-serde.d.ts +107 -0
- package/dist/runtime/quickjs-serde.d.ts.map +1 -0
- package/dist/runtime/quickjs-serde.js +2098 -0
- package/dist/runtime/replay-budget.d.ts +89 -0
- package/dist/runtime/replay-budget.d.ts.map +1 -0
- package/dist/runtime/replay-budget.js +139 -0
- package/dist/runtime/replay-recovery-reporter.d.ts +36 -0
- package/dist/runtime/replay-recovery-reporter.d.ts.map +1 -0
- package/dist/runtime/replay-recovery-reporter.js +64 -0
- package/dist/runtime/resume-hook.d.ts +27 -4
- package/dist/runtime/resume-hook.d.ts.map +1 -1
- package/dist/runtime/resume-hook.js +452 -76
- package/dist/runtime/run-id-time.d.ts +19 -0
- package/dist/runtime/run-id-time.d.ts.map +1 -0
- package/dist/runtime/run-id-time.js +42 -0
- package/dist/runtime/run.d.ts +8 -2
- package/dist/runtime/run.d.ts.map +1 -1
- package/dist/runtime/run.js +62 -15
- package/dist/runtime/runs.d.ts +54 -3
- package/dist/runtime/runs.d.ts.map +1 -1
- package/dist/runtime/runs.js +119 -13
- package/dist/runtime/start.d.ts +70 -1
- package/dist/runtime/start.d.ts.map +1 -1
- package/dist/runtime/start.js +313 -60
- package/dist/runtime/step-executor.d.ts +177 -0
- package/dist/runtime/step-executor.d.ts.map +1 -0
- package/dist/runtime/step-executor.js +946 -0
- package/dist/runtime/step-latency.d.ts +197 -0
- package/dist/runtime/step-latency.d.ts.map +1 -0
- package/dist/runtime/step-latency.js +207 -0
- package/dist/runtime/step-ownership.d.ts +72 -0
- package/dist/runtime/step-ownership.d.ts.map +1 -0
- package/dist/runtime/step-ownership.js +114 -0
- package/dist/runtime/step-single-flight.d.ts +12 -0
- package/dist/runtime/step-single-flight.d.ts.map +1 -0
- package/dist/runtime/step-single-flight.js +69 -0
- package/dist/runtime/suspension-handler.d.ts +109 -7
- package/dist/runtime/suspension-handler.d.ts.map +1 -1
- package/dist/runtime/suspension-handler.js +486 -140
- package/dist/runtime/vm-mode.d.ts +44 -0
- package/dist/runtime/vm-mode.d.ts.map +1 -0
- package/dist/runtime/vm-mode.js +62 -0
- package/dist/runtime/vm-serde-bundle.generated.d.ts +14 -0
- package/dist/runtime/vm-serde-bundle.generated.d.ts.map +1 -0
- package/dist/runtime/vm-serde-bundle.generated.js +16 -0
- package/dist/runtime/wait-continuation.d.ts +84 -0
- package/dist/runtime/wait-continuation.d.ts.map +1 -0
- package/dist/runtime/wait-continuation.js +105 -0
- package/dist/runtime/wait-until.d.ts +18 -0
- package/dist/runtime/wait-until.d.ts.map +1 -0
- package/dist/runtime/wait-until.js +42 -0
- package/dist/runtime/world-compatibility.d.ts +20 -0
- package/dist/runtime/world-compatibility.d.ts.map +1 -0
- package/dist/runtime/world-compatibility.js +32 -0
- package/dist/runtime/world-init.d.ts +50 -0
- package/dist/runtime/world-init.d.ts.map +1 -0
- package/dist/runtime/world-init.js +50 -0
- package/dist/runtime/world.d.ts +14 -2
- package/dist/runtime/world.d.ts.map +1 -1
- package/dist/runtime/world.js +101 -26
- package/dist/runtime.d.ts +17 -12
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +3135 -328
- package/dist/schemas.d.ts +1 -1
- package/dist/schemas.d.ts.map +1 -1
- package/dist/schemas.js +1 -1
- package/dist/sealed-box.d.ts +167 -0
- package/dist/sealed-box.d.ts.map +1 -0
- package/dist/sealed-box.js +571 -0
- package/dist/serialization/client.d.ts +17 -0
- package/dist/serialization/client.d.ts.map +1 -0
- package/dist/serialization/client.js +48 -0
- package/dist/serialization/codec-devalue-vm.d.ts +16 -0
- package/dist/serialization/codec-devalue-vm.d.ts.map +1 -0
- package/dist/serialization/codec-devalue-vm.js +148 -0
- package/dist/serialization/codec-devalue.d.ts +14 -0
- package/dist/serialization/codec-devalue.d.ts.map +1 -0
- package/dist/serialization/codec-devalue.js +105 -0
- package/dist/serialization/codec.d.ts +125 -0
- package/dist/serialization/codec.d.ts.map +1 -0
- package/dist/serialization/codec.js +17 -0
- package/dist/serialization/compression.d.ts +104 -0
- package/dist/serialization/compression.d.ts.map +1 -0
- package/dist/serialization/compression.js +260 -0
- package/dist/serialization/encryption.d.ts +134 -0
- package/dist/serialization/encryption.d.ts.map +1 -0
- package/dist/serialization/encryption.js +186 -0
- package/dist/serialization/errors.d.ts +34 -0
- package/dist/serialization/errors.d.ts.map +1 -0
- package/dist/serialization/errors.js +59 -0
- package/dist/serialization/format.d.ts +60 -0
- package/dist/serialization/format.d.ts.map +1 -0
- package/dist/serialization/format.js +97 -0
- package/dist/serialization/hardened.d.ts +155 -0
- package/dist/serialization/hardened.d.ts.map +1 -0
- package/dist/serialization/hardened.js +523 -0
- package/dist/serialization/index.d.ts +20 -0
- package/dist/serialization/index.d.ts.map +1 -0
- package/dist/serialization/index.js +22 -0
- package/dist/serialization/reducers/class-vm.d.ts +20 -0
- package/dist/serialization/reducers/class-vm.d.ts.map +1 -0
- package/dist/serialization/reducers/class-vm.js +77 -0
- package/dist/serialization/reducers/class.d.ts +11 -0
- package/dist/serialization/reducers/class.d.ts.map +1 -0
- package/dist/serialization/reducers/class.js +73 -0
- package/dist/serialization/reducers/common-vm.d.ts +15 -0
- package/dist/serialization/reducers/common-vm.d.ts.map +1 -0
- package/dist/serialization/reducers/common-vm.js +579 -0
- package/dist/serialization/reducers/common.d.ts +16 -0
- package/dist/serialization/reducers/common.d.ts.map +1 -0
- package/dist/serialization/reducers/common.js +478 -0
- package/dist/serialization/reducers/step-function-vm.d.ts +44 -0
- package/dist/serialization/reducers/step-function-vm.d.ts.map +1 -0
- package/dist/serialization/reducers/step-function-vm.js +97 -0
- package/dist/serialization/reducers/step-function.d.ts +35 -0
- package/dist/serialization/reducers/step-function.d.ts.map +1 -0
- package/dist/serialization/reducers/step-function.js +104 -0
- package/dist/serialization/step.d.ts +17 -0
- package/dist/serialization/step.d.ts.map +1 -0
- package/dist/serialization/step.js +48 -0
- package/dist/serialization/types.d.ts +273 -0
- package/dist/serialization/types.d.ts.map +1 -0
- package/dist/serialization/types.js +35 -0
- package/dist/serialization/workflow-vm.d.ts +29 -0
- package/dist/serialization/workflow-vm.d.ts.map +1 -0
- package/dist/serialization/workflow-vm.js +71 -0
- package/dist/serialization/workflow.d.ts +29 -0
- package/dist/serialization/workflow.d.ts.map +1 -0
- package/dist/serialization/workflow.js +54 -0
- package/dist/serialization-format.d.ts +60 -4
- package/dist/serialization-format.d.ts.map +1 -1
- package/dist/serialization-format.js +276 -56
- package/dist/serialization.d.ts +374 -221
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +2300 -783
- package/dist/set-attributes.d.ts +13 -0
- package/dist/set-attributes.d.ts.map +1 -0
- package/dist/set-attributes.js +60 -0
- package/dist/sleep.d.ts.map +1 -1
- package/dist/sleep.js +3 -2
- package/dist/source-map.d.ts +25 -0
- package/dist/source-map.d.ts.map +1 -1
- package/dist/source-map.js +148 -10
- package/dist/step/context-storage.d.ts +61 -2
- package/dist/step/context-storage.d.ts.map +1 -1
- package/dist/step/context-storage.js +7 -5
- package/dist/step/get-closure-vars.d.ts.map +1 -1
- package/dist/step/get-closure-vars.js +3 -2
- package/dist/step/get-step-metadata.d.ts.map +1 -1
- package/dist/step/get-step-metadata.js +3 -2
- package/dist/step/get-workflow-metadata.d.ts.map +1 -1
- package/dist/step/get-workflow-metadata.js +3 -2
- package/dist/step/writable-stream.d.ts.map +1 -1
- package/dist/step/writable-stream.js +71 -7
- package/dist/step.d.ts.map +1 -1
- package/dist/step.js +225 -29
- package/dist/symbols.d.ts +54 -0
- package/dist/symbols.d.ts.map +1 -1
- package/dist/symbols.js +55 -1
- package/dist/telemetry/semantic-conventions.d.ts +265 -2
- package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
- package/dist/telemetry/semantic-conventions.js +190 -1
- package/dist/telemetry.d.ts +73 -0
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +153 -16
- package/dist/types.d.ts +6 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +23 -1
- package/dist/util.d.ts +16 -6
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +25 -16
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +2 -2
- package/dist/vm/index.d.ts.map +1 -1
- package/dist/vm/index.js +85 -14
- package/dist/vm/script-cache.d.ts +28 -0
- package/dist/vm/script-cache.d.ts.map +1 -0
- package/dist/vm/script-cache.js +140 -0
- package/dist/workflow/abort-controller.d.ts +65 -0
- package/dist/workflow/abort-controller.d.ts.map +1 -0
- package/dist/workflow/abort-controller.js +312 -0
- package/dist/workflow/attribute-dispatcher.d.ts +6 -0
- package/dist/workflow/attribute-dispatcher.d.ts.map +1 -0
- package/dist/workflow/attribute-dispatcher.js +48 -0
- package/dist/workflow/create-hook.d.ts.map +1 -1
- package/dist/workflow/create-hook.js +25 -3
- package/dist/workflow/define-hook.d.ts +1 -1
- package/dist/workflow/define-hook.d.ts.map +1 -1
- package/dist/workflow/define-hook.js +8 -4
- package/dist/workflow/get-workflow-metadata.d.ts.map +1 -1
- package/dist/workflow/get-workflow-metadata.js +14 -3
- package/dist/workflow/hook.d.ts.map +1 -1
- package/dist/workflow/hook.js +302 -36
- package/dist/workflow/index.d.ts +1 -0
- package/dist/workflow/index.d.ts.map +1 -1
- package/dist/workflow/index.js +5 -3
- package/dist/workflow/set-attributes.d.ts +68 -0
- package/dist/workflow/set-attributes.d.ts.map +1 -0
- package/dist/workflow/set-attributes.js +60 -0
- package/dist/workflow/sleep.d.ts.map +1 -1
- package/dist/workflow/sleep.js +57 -8
- package/dist/workflow/world-init-stub.d.ts +15 -0
- package/dist/workflow/world-init-stub.d.ts.map +1 -0
- package/dist/workflow/world-init-stub.js +15 -0
- package/dist/workflow.d.ts +79 -3
- package/dist/workflow.d.ts.map +1 -1
- package/dist/workflow.js +831 -553
- package/docs/api-reference/create-hook.mdx +79 -0
- package/docs/api-reference/create-webhook.mdx +1 -0
- package/docs/api-reference/define-hook.mdx +26 -24
- package/docs/api-reference/fatal-error.mdx +29 -7
- package/docs/api-reference/fetch.mdx +8 -4
- package/docs/api-reference/index.mdx +3 -0
- package/docs/api-reference/set-attributes.mdx +61 -0
- package/docs/api-reference/sleep.mdx +1 -1
- package/docs/foundations/cancellation.mdx +459 -0
- package/docs/foundations/errors-and-retries.mdx +7 -3
- package/docs/foundations/hooks.mdx +29 -0
- package/docs/foundations/idempotency.mdx +243 -11
- package/docs/foundations/index.mdx +1 -23
- package/docs/foundations/meta.json +3 -1
- package/docs/foundations/serialization.mdx +77 -41
- package/docs/foundations/starting-workflows.mdx +79 -2
- package/docs/foundations/streaming.mdx +14 -23
- package/docs/foundations/versioning.mdx +263 -0
- package/docs/how-it-works/cancellation.mdx +287 -0
- package/docs/how-it-works/code-transform.mdx +21 -17
- package/docs/how-it-works/encryption.mdx +5 -5
- package/docs/how-it-works/event-sourcing.mdx +17 -9
- package/docs/how-it-works/framework-integrations.mdx +96 -337
- package/docs/how-it-works/meta.json +2 -1
- package/package.json +31 -13
- package/dist/runtime/step-handler.d.ts +0 -2
- package/dist/runtime/step-handler.d.ts.map +0 -1
- package/dist/runtime/step-handler.js +0 -678
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VM engine selection for workflow execution.
|
|
3
|
+
*
|
|
4
|
+
* The Node.js `node:vm` engine is the default. The QuickJS WASM engine is
|
|
5
|
+
* opt-in via the `WORKFLOW_VM` env var or `executionContext.workflowVm`.
|
|
6
|
+
*
|
|
7
|
+
* Both engines implement the same event-replay execution model: on every
|
|
8
|
+
* workflow handler invocation the workflow function is re-executed from the
|
|
9
|
+
* top and the recorded event log resolves awaited primitives. The QuickJS
|
|
10
|
+
* engine runs the workflow code in a QuickJS WASM VM (via quickjs-wasi)
|
|
11
|
+
* instead of a `node:vm` context, which makes it usable on platforms that
|
|
12
|
+
* do not implement `node:vm` (e.g. Cloudflare Workers) and is the
|
|
13
|
+
* foundation for VM-memory snapshotting.
|
|
14
|
+
*/
|
|
15
|
+
import type { WorkflowRun } from '@workflow/world';
|
|
16
|
+
/**
|
|
17
|
+
* Known workflow VM engines. Any other `WORKFLOW_VM` value is treated as
|
|
18
|
+
* a misconfiguration and rejected at startup.
|
|
19
|
+
*/
|
|
20
|
+
export declare const WORKFLOW_VMS: readonly ["node", "quickjs"];
|
|
21
|
+
export type WorkflowVmMode = (typeof WORKFLOW_VMS)[number];
|
|
22
|
+
/**
|
|
23
|
+
* Read and validate the `WORKFLOW_VM` env var.
|
|
24
|
+
*
|
|
25
|
+
* Returns the configured engine, or `undefined` if unset/empty.
|
|
26
|
+
* Throws {@link WorkflowRuntimeError} if the value is set but not one of
|
|
27
|
+
* the known engines — catching misconfiguration early is better than
|
|
28
|
+
* silently falling back to the default.
|
|
29
|
+
*/
|
|
30
|
+
export declare function getWorkflowVmFromEnv(env?: NodeJS.ProcessEnv): WorkflowVmMode | undefined;
|
|
31
|
+
/**
|
|
32
|
+
* Whether to use the QuickJS WASM VM for a given run.
|
|
33
|
+
*
|
|
34
|
+
* The run's `executionContext.workflowVm` (stamped by the SDK at `start()`
|
|
35
|
+
* when `WORKFLOW_VM` is set on the client) takes precedence so a run keeps
|
|
36
|
+
* executing on the engine it started on. When the run doesn't specify an
|
|
37
|
+
* engine, the `WORKFLOW_VM` env var on the workflow handler decides.
|
|
38
|
+
* The default is the `node:vm` engine.
|
|
39
|
+
*
|
|
40
|
+
* Throws if `WORKFLOW_VM` or `executionContext.workflowVm` is set to an
|
|
41
|
+
* unknown value.
|
|
42
|
+
*/
|
|
43
|
+
export declare function useQuickJSVm(workflowRun: WorkflowRun): boolean;
|
|
44
|
+
//# sourceMappingURL=vm-mode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vm-mode.d.ts","sourceRoot":"","sources":["../../src/runtime/vm-mode.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD;;;GAGG;AACH,eAAO,MAAM,YAAY,8BAA+B,CAAC;AAEzD,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAE3D;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,cAAc,GAAG,SAAS,CAU5B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAc9D"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VM engine selection for workflow execution.
|
|
3
|
+
*
|
|
4
|
+
* The Node.js `node:vm` engine is the default. The QuickJS WASM engine is
|
|
5
|
+
* opt-in via the `WORKFLOW_VM` env var or `executionContext.workflowVm`.
|
|
6
|
+
*
|
|
7
|
+
* Both engines implement the same event-replay execution model: on every
|
|
8
|
+
* workflow handler invocation the workflow function is re-executed from the
|
|
9
|
+
* top and the recorded event log resolves awaited primitives. The QuickJS
|
|
10
|
+
* engine runs the workflow code in a QuickJS WASM VM (via quickjs-wasi)
|
|
11
|
+
* instead of a `node:vm` context, which makes it usable on platforms that
|
|
12
|
+
* do not implement `node:vm` (e.g. Cloudflare Workers) and is the
|
|
13
|
+
* foundation for VM-memory snapshotting.
|
|
14
|
+
*/
|
|
15
|
+
import { WorkflowRuntimeError } from '@workflow/errors';
|
|
16
|
+
/**
|
|
17
|
+
* Known workflow VM engines. Any other `WORKFLOW_VM` value is treated as
|
|
18
|
+
* a misconfiguration and rejected at startup.
|
|
19
|
+
*/
|
|
20
|
+
export const WORKFLOW_VMS = ['node', 'quickjs'];
|
|
21
|
+
/**
|
|
22
|
+
* Read and validate the `WORKFLOW_VM` env var.
|
|
23
|
+
*
|
|
24
|
+
* Returns the configured engine, or `undefined` if unset/empty.
|
|
25
|
+
* Throws {@link WorkflowRuntimeError} if the value is set but not one of
|
|
26
|
+
* the known engines — catching misconfiguration early is better than
|
|
27
|
+
* silently falling back to the default.
|
|
28
|
+
*/
|
|
29
|
+
export function getWorkflowVmFromEnv(env = process.env) {
|
|
30
|
+
const raw = env.WORKFLOW_VM;
|
|
31
|
+
if (raw === undefined || raw === '')
|
|
32
|
+
return undefined;
|
|
33
|
+
if (WORKFLOW_VMS.includes(raw)) {
|
|
34
|
+
return raw;
|
|
35
|
+
}
|
|
36
|
+
throw new WorkflowRuntimeError(`Invalid WORKFLOW_VM value: "${raw}". ` +
|
|
37
|
+
`Expected one of: ${WORKFLOW_VMS.join(', ')}.`);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Whether to use the QuickJS WASM VM for a given run.
|
|
41
|
+
*
|
|
42
|
+
* The run's `executionContext.workflowVm` (stamped by the SDK at `start()`
|
|
43
|
+
* when `WORKFLOW_VM` is set on the client) takes precedence so a run keeps
|
|
44
|
+
* executing on the engine it started on. When the run doesn't specify an
|
|
45
|
+
* engine, the `WORKFLOW_VM` env var on the workflow handler decides.
|
|
46
|
+
* The default is the `node:vm` engine.
|
|
47
|
+
*
|
|
48
|
+
* Throws if `WORKFLOW_VM` or `executionContext.workflowVm` is set to an
|
|
49
|
+
* unknown value.
|
|
50
|
+
*/
|
|
51
|
+
export function useQuickJSVm(workflowRun) {
|
|
52
|
+
const vmFromRun = workflowRun.executionContext?.workflowVm;
|
|
53
|
+
if (vmFromRun !== undefined) {
|
|
54
|
+
if (!WORKFLOW_VMS.includes(vmFromRun)) {
|
|
55
|
+
throw new WorkflowRuntimeError(`Invalid executionContext.workflowVm value: "${vmFromRun}". ` +
|
|
56
|
+
`Expected one of: ${WORKFLOW_VMS.join(', ')}.`);
|
|
57
|
+
}
|
|
58
|
+
return vmFromRun === 'quickjs';
|
|
59
|
+
}
|
|
60
|
+
return getWorkflowVmFromEnv() === 'quickjs';
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidm0tbW9kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL3ZtLW1vZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUVILE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBR3hEOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQVUsQ0FBQztBQUl6RDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUNsQyxNQUF5QixPQUFPLENBQUMsR0FBRztJQUVwQyxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsV0FBVyxDQUFDO0lBQzVCLElBQUksR0FBRyxLQUFLLFNBQVMsSUFBSSxHQUFHLEtBQUssRUFBRTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ3RELElBQUssWUFBa0MsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN0RCxPQUFPLEdBQXFCLENBQUM7SUFDL0IsQ0FBQztJQUNELE1BQU0sSUFBSSxvQkFBb0IsQ0FDNUIsK0JBQStCLEdBQUcsS0FBSztRQUNyQyxvQkFBb0IsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUNqRCxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FBQyxXQUF3QjtJQUNuRCxNQUFNLFNBQVMsR0FDYixXQUFXLENBQUMsZ0JBQ2IsRUFBRSxVQUFVLENBQUM7SUFDZCxJQUFJLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUUsWUFBa0MsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUM3RCxNQUFNLElBQUksb0JBQW9CLENBQzVCLCtDQUErQyxTQUFTLEtBQUs7Z0JBQzNELG9CQUFvQixZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQ2pELENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTyxTQUFTLEtBQUssU0FBUyxDQUFDO0lBQ2pDLENBQUM7SUFDRCxPQUFPLG9CQUFvQixFQUFFLEtBQUssU0FBUyxDQUFDO0FBQzlDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFZNIGVuZ2luZSBzZWxlY3Rpb24gZm9yIHdvcmtmbG93IGV4ZWN1dGlvbi5cbiAqXG4gKiBUaGUgTm9kZS5qcyBgbm9kZTp2bWAgZW5naW5lIGlzIHRoZSBkZWZhdWx0LiBUaGUgUXVpY2tKUyBXQVNNIGVuZ2luZSBpc1xuICogb3B0LWluIHZpYSB0aGUgYFdPUktGTE9XX1ZNYCBlbnYgdmFyIG9yIGBleGVjdXRpb25Db250ZXh0LndvcmtmbG93Vm1gLlxuICpcbiAqIEJvdGggZW5naW5lcyBpbXBsZW1lbnQgdGhlIHNhbWUgZXZlbnQtcmVwbGF5IGV4ZWN1dGlvbiBtb2RlbDogb24gZXZlcnlcbiAqIHdvcmtmbG93IGhhbmRsZXIgaW52b2NhdGlvbiB0aGUgd29ya2Zsb3cgZnVuY3Rpb24gaXMgcmUtZXhlY3V0ZWQgZnJvbSB0aGVcbiAqIHRvcCBhbmQgdGhlIHJlY29yZGVkIGV2ZW50IGxvZyByZXNvbHZlcyBhd2FpdGVkIHByaW1pdGl2ZXMuIFRoZSBRdWlja0pTXG4gKiBlbmdpbmUgcnVucyB0aGUgd29ya2Zsb3cgY29kZSBpbiBhIFF1aWNrSlMgV0FTTSBWTSAodmlhIHF1aWNranMtd2FzaSlcbiAqIGluc3RlYWQgb2YgYSBgbm9kZTp2bWAgY29udGV4dCwgd2hpY2ggbWFrZXMgaXQgdXNhYmxlIG9uIHBsYXRmb3JtcyB0aGF0XG4gKiBkbyBub3QgaW1wbGVtZW50IGBub2RlOnZtYCAoZS5nLiBDbG91ZGZsYXJlIFdvcmtlcnMpIGFuZCBpcyB0aGVcbiAqIGZvdW5kYXRpb24gZm9yIFZNLW1lbW9yeSBzbmFwc2hvdHRpbmcuXG4gKi9cblxuaW1wb3J0IHsgV29ya2Zsb3dSdW50aW1lRXJyb3IgfSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB0eXBlIHsgV29ya2Zsb3dSdW4gfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuXG4vKipcbiAqIEtub3duIHdvcmtmbG93IFZNIGVuZ2luZXMuIEFueSBvdGhlciBgV09SS0ZMT1dfVk1gIHZhbHVlIGlzIHRyZWF0ZWQgYXNcbiAqIGEgbWlzY29uZmlndXJhdGlvbiBhbmQgcmVqZWN0ZWQgYXQgc3RhcnR1cC5cbiAqL1xuZXhwb3J0IGNvbnN0IFdPUktGTE9XX1ZNUyA9IFsnbm9kZScsICdxdWlja2pzJ10gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFdvcmtmbG93Vm1Nb2RlID0gKHR5cGVvZiBXT1JLRkxPV19WTVMpW251bWJlcl07XG5cbi8qKlxuICogUmVhZCBhbmQgdmFsaWRhdGUgdGhlIGBXT1JLRkxPV19WTWAgZW52IHZhci5cbiAqXG4gKiBSZXR1cm5zIHRoZSBjb25maWd1cmVkIGVuZ2luZSwgb3IgYHVuZGVmaW5lZGAgaWYgdW5zZXQvZW1wdHkuXG4gKiBUaHJvd3Mge0BsaW5rIFdvcmtmbG93UnVudGltZUVycm9yfSBpZiB0aGUgdmFsdWUgaXMgc2V0IGJ1dCBub3Qgb25lIG9mXG4gKiB0aGUga25vd24gZW5naW5lcyDigJQgY2F0Y2hpbmcgbWlzY29uZmlndXJhdGlvbiBlYXJseSBpcyBiZXR0ZXIgdGhhblxuICogc2lsZW50bHkgZmFsbGluZyBiYWNrIHRvIHRoZSBkZWZhdWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V29ya2Zsb3dWbUZyb21FbnYoXG4gIGVudjogTm9kZUpTLlByb2Nlc3NFbnYgPSBwcm9jZXNzLmVudlxuKTogV29ya2Zsb3dWbU1vZGUgfCB1bmRlZmluZWQge1xuICBjb25zdCByYXcgPSBlbnYuV09SS0ZMT1dfVk07XG4gIGlmIChyYXcgPT09IHVuZGVmaW5lZCB8fCByYXcgPT09ICcnKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAoKFdPUktGTE9XX1ZNUyBhcyByZWFkb25seSBzdHJpbmdbXSkuaW5jbHVkZXMocmF3KSkge1xuICAgIHJldHVybiByYXcgYXMgV29ya2Zsb3dWbU1vZGU7XG4gIH1cbiAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgIGBJbnZhbGlkIFdPUktGTE9XX1ZNIHZhbHVlOiBcIiR7cmF3fVwiLiBgICtcbiAgICAgIGBFeHBlY3RlZCBvbmUgb2Y6ICR7V09SS0ZMT1dfVk1TLmpvaW4oJywgJyl9LmBcbiAgKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHRvIHVzZSB0aGUgUXVpY2tKUyBXQVNNIFZNIGZvciBhIGdpdmVuIHJ1bi5cbiAqXG4gKiBUaGUgcnVuJ3MgYGV4ZWN1dGlvbkNvbnRleHQud29ya2Zsb3dWbWAgKHN0YW1wZWQgYnkgdGhlIFNESyBhdCBgc3RhcnQoKWBcbiAqIHdoZW4gYFdPUktGTE9XX1ZNYCBpcyBzZXQgb24gdGhlIGNsaWVudCkgdGFrZXMgcHJlY2VkZW5jZSBzbyBhIHJ1biBrZWVwc1xuICogZXhlY3V0aW5nIG9uIHRoZSBlbmdpbmUgaXQgc3RhcnRlZCBvbi4gV2hlbiB0aGUgcnVuIGRvZXNuJ3Qgc3BlY2lmeSBhblxuICogZW5naW5lLCB0aGUgYFdPUktGTE9XX1ZNYCBlbnYgdmFyIG9uIHRoZSB3b3JrZmxvdyBoYW5kbGVyIGRlY2lkZXMuXG4gKiBUaGUgZGVmYXVsdCBpcyB0aGUgYG5vZGU6dm1gIGVuZ2luZS5cbiAqXG4gKiBUaHJvd3MgaWYgYFdPUktGTE9XX1ZNYCBvciBgZXhlY3V0aW9uQ29udGV4dC53b3JrZmxvd1ZtYCBpcyBzZXQgdG8gYW5cbiAqIHVua25vd24gdmFsdWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VRdWlja0pTVm0od29ya2Zsb3dSdW46IFdvcmtmbG93UnVuKTogYm9vbGVhbiB7XG4gIGNvbnN0IHZtRnJvbVJ1biA9IChcbiAgICB3b3JrZmxvd1J1bi5leGVjdXRpb25Db250ZXh0IGFzIHsgd29ya2Zsb3dWbT86IHN0cmluZyB9IHwgdW5kZWZpbmVkXG4gICk/LndvcmtmbG93Vm07XG4gIGlmICh2bUZyb21SdW4gIT09IHVuZGVmaW5lZCkge1xuICAgIGlmICghKFdPUktGTE9XX1ZNUyBhcyByZWFkb25seSBzdHJpbmdbXSkuaW5jbHVkZXModm1Gcm9tUnVuKSkge1xuICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICBgSW52YWxpZCBleGVjdXRpb25Db250ZXh0LndvcmtmbG93Vm0gdmFsdWU6IFwiJHt2bUZyb21SdW59XCIuIGAgK1xuICAgICAgICAgIGBFeHBlY3RlZCBvbmUgb2Y6ICR7V09SS0ZMT1dfVk1TLmpvaW4oJywgJyl9LmBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB2bUZyb21SdW4gPT09ICdxdWlja2pzJztcbiAgfVxuICByZXR1cm4gZ2V0V29ya2Zsb3dWbUZyb21FbnYoKSA9PT0gJ3F1aWNranMnO1xufVxuIl19
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-generated by scripts/build-vm-serde-bundle.js
|
|
3
|
+
* Do not edit manually.
|
|
4
|
+
*
|
|
5
|
+
* This is the VM serialization bundle — a self-contained IIFE that sets up
|
|
6
|
+
* the serialize/deserialize functions inside the QuickJS WASM VM. It
|
|
7
|
+
* includes devalue and all workflow-mode reducers/revivers. (TextEncoder,
|
|
8
|
+
* TextDecoder, and Headers are provided by quickjs-wasi's native C
|
|
9
|
+
* extensions — no JS polyfills are bundled.)
|
|
10
|
+
*
|
|
11
|
+
* Size: 25.6 KB minified
|
|
12
|
+
*/
|
|
13
|
+
export declare const VM_SERDE_BUNDLE: string;
|
|
14
|
+
//# sourceMappingURL=vm-serde-bundle.generated.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vm-serde-bundle.generated.d.ts","sourceRoot":"","sources":["../../src/runtime/vm-serde-bundle.generated.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,eAAe,EAAE,MAE7B,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-generated by scripts/build-vm-serde-bundle.js
|
|
3
|
+
* Do not edit manually.
|
|
4
|
+
*
|
|
5
|
+
* This is the VM serialization bundle — a self-contained IIFE that sets up
|
|
6
|
+
* the serialize/deserialize functions inside the QuickJS WASM VM. It
|
|
7
|
+
* includes devalue and all workflow-mode reducers/revivers. (TextEncoder,
|
|
8
|
+
* TextDecoder, and Headers are provided by quickjs-wasi's native C
|
|
9
|
+
* extensions — no JS polyfills are bundled.)
|
|
10
|
+
*
|
|
11
|
+
* Size: 25.6 KB minified
|
|
12
|
+
*/
|
|
13
|
+
export const VM_SERDE_BUNDLE = `"use strict";(()=>{var D="0123456789ABCDEFGHJKMNPQRSTVWXYZ";var w;(function(r){r.Base32IncorrectEncoding="B32_ENC_INVALID",r.DecodeTimeInvalidCharacter="DEC_TIME_CHAR",r.DecodeTimeValueMalformed="DEC_TIME_MALFORMED",r.EncodeTimeNegative="ENC_TIME_NEG",r.EncodeTimeSizeExceeded="ENC_TIME_SIZE_EXCEED",r.EncodeTimeValueMalformed="ENC_TIME_MALFORMED",r.PRNGDetectFailure="PRNG_DETECT",r.ULIDInvalid="ULID_INVALID",r.Unexpected="UNEXPECTED",r.UUIDInvalid="UUID_INVALID"})(w||(w={}));var O=class extends Error{constructor(e,t){super(\`\${t} (\${e})\`),this.name="ULIDError",this.code=e}};function Fr(r){let e=Math.floor(r()*32)%32;return D.charAt(e)}function sr(r,e,t){return e>r.length-1?r:r.substr(0,e)+t+r.substr(e+1)}function Wr(r){let e,t=r.length,n,o,s=r,p=31;for(;!e&&t-->=0;){if(n=s[t],o=D.indexOf(n),o===-1)throw new O(w.Base32IncorrectEncoding,"Incorrectly encoded string");if(o===p){s=sr(s,t,D[0]);continue}e=sr(s,t,D[o+1])}if(typeof e=="string")return e;throw new O(w.Base32IncorrectEncoding,"Failed incrementing string")}function Cr(r){let e=Pr(),t=e&&(e.crypto||e.msCrypto)||null;if(typeof t?.getRandomValues=="function")return()=>{let n=new Uint8Array(1);return t.getRandomValues(n),n[0]/255};if(typeof t?.randomBytes=="function")return()=>t.randomBytes(1).readUInt8()/255;throw new O(w.PRNGDetectFailure,"Failed to find a reliable PRNG")}function Pr(){return jr()?self:typeof window<"u"?window:typeof global<"u"?global:typeof globalThis<"u"?globalThis:null}function Br(r,e){let t="";for(;r>0;r--)t=Fr(e)+t;return t}function ar(r,e=10){if(isNaN(r))throw new O(w.EncodeTimeValueMalformed,\`Time must be a number: \${r}\`);if(r>0xffffffffffff)throw new O(w.EncodeTimeSizeExceeded,\`Cannot encode a time larger than \${0xffffffffffff}: \${r}\`);if(r<0)throw new O(w.EncodeTimeNegative,\`Time must be positive: \${r}\`);if(Number.isInteger(r)===!1)throw new O(w.EncodeTimeValueMalformed,\`Time must be an integer: \${r}\`);let t,n="";for(let o=e;o>0;o--)t=r%32,n=D.charAt(t)+n,r=(r-t)/32;return n}function jr(){return typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope}function ir(r){let e=r||Cr(),t=0,n;return function(s){let p=!s||isNaN(s)?Date.now():s;if(p<=t){let c=n=Wr(n);return ar(t,10)+c}t=p;let g=n=Br(16,e);return ar(p,10)+g}}var S=class extends Error{constructor(e,t,n,o){super(e),this.name="DevalueError",this.path=t.join(""),this.value=n,this.root=o}};var Kr=Object.getOwnPropertyNames(Object.prototype).sort().join("\\0");function fr(r){let e=Object.getPrototypeOf(r);return e===Object.prototype||e===null||Object.getPrototypeOf(e)===null||Object.getOwnPropertyNames(e).sort().join("\\0")===Kr}function yr(r){return Object.prototype.toString.call(r).slice(8,-1)}function Vr(r){switch(r){case'"':return'\\\\"';case"<":return"\\\\u003C";case"\\\\":return"\\\\\\\\";case\`
|
|
14
|
+
\`:return"\\\\n";case"\\r":return"\\\\r";case" ":return"\\\\t";case"\\b":return"\\\\b";case"\\f":return"\\\\f";case"\\u2028":return"\\\\u2028";case"\\u2029":return"\\\\u2029";default:return r<" "?\`\\\\u\${r.charCodeAt(0).toString(16).padStart(4,"0")}\`:""}}function I(r){let e="",t=0,n=r.length;for(let o=0;o<n;o+=1){let s=r[o],p=Vr(s);p&&(e+=r.slice(t,o)+p,t=o+1)}return\`"\${t===0?r:e+r.slice(t)}"\`}function lr(r){return Object.getOwnPropertySymbols(r).filter(e=>Object.getOwnPropertyDescriptor(r,e).enumerable)}var zr=/^[a-zA-Z_$][a-zA-Z_$0-9]*$/;function Z(r){return zr.test(r)?"."+r:"["+JSON.stringify(r)+"]"}function Y(r){return!(!Number.isInteger(r)||r<0||r>4294967294)}function ur(r){return!(!Number.isInteger(r)||r<0||r>4294967295)}function $r(r){if(r.length===0||r.length>1&&r.charCodeAt(0)===48)return!1;for(let e=0;e<r.length;e++){let t=r.charCodeAt(e);if(t<48||t>57)return!1}return Y(+r)}function Zr(r){for(var e=r.length-1;e>=0&&!$r(r[e]);e--);return e+1}function pr(r){let e=Object.keys(r);return e.length=Zr(e),e}function Yr(r){return new Uint8Array(r).toBase64()}function Gr(r){return Uint8Array.fromBase64(r).buffer}function Hr(r){return Buffer.from(r).toString("base64")}function Xr(r){return Uint8Array.from(Buffer.from(r,"base64")).buffer}function qr(r){let e=new Uint8Array(r),t="",n=32768;for(let o=0;o<e.length;o+=n){let s=e.subarray(o,o+n);t+=String.fromCharCode.apply(null,s)}return btoa(t)}function Jr(r){let e=atob(r),t=e.length,n=new Uint8Array(t);for(let o=0;o<t;o++)n[o]=e.charCodeAt(o);return n.buffer}var gr=typeof Uint8Array.fromBase64=="function",dr=typeof process=="object"&&process.versions?.node!==void 0,mr=gr?Yr:dr?Hr:qr,br=gr?Gr:dr?Xr:Jr;function W(r,e){if(!e)return r;let t={};for(let n of Object.keys(r))t[n]=e[n]??r[n];return t}var Qr=Object.freeze({kind:"not-plain"}),vr=Object.freeze({kind:"symbol-keys"}),re={identify:r=>r,typeOf:r=>r===null?"null":typeof r,toPrimitive:r=>r,tagOf:r=>yr(r),isThenable:r=>typeof r.then=="function",toPromise:r=>Promise.resolve(r),unbox:r=>r.valueOf(),toISOString:r=>isNaN(r.getDate())?"":r.toISOString(),toStringValue:r=>r.toString(),regExpInfo:r=>({source:r.source,flags:r.flags}),valuesOf:r=>r,entriesOf:r=>r,viewInfo:r=>({buffer:r.buffer,byteOffset:r.byteOffset,byteLength:r.byteLength,length:r.length,bufferByteLength:r.buffer.byteLength}),toArrayBuffer:r=>r,lengthOf:r=>r.length,hasOwn:(r,e)=>Object.hasOwn(r,e),indicesOf:r=>pr(r),shapeOf:r=>fr(r)?lr(r).length>0?vr:{kind:Object.getPrototypeOf(r)===null?"null-proto":"plain",keys:Object.keys(r)}:Qr,get:(r,e)=>r[e]},Er=Object.freeze(re),ee={fromPrimitive:r=>r,fromISOString:r=>new Date(r),fromStringValue:(r,e)=>r==="URL"?new URL(e):r==="URLSearchParams"?new URLSearchParams(e):Temporal[r.slice(9)].from(e),fromArrayBuffer:r=>r,fromRegExpInfo:(r,e)=>new RegExp(r,e),fromViewInfo:(r,e,t,n)=>{let o=globalThis[r];return t!==void 0?new o(e,t,n):new o(e)},box:r=>Object(r),createArray:r=>new Array(r),createSparseArray:r=>{let e=[];return e[4294967294]=void 0,delete e[4294967294],e.length=r,e},createObject:()=>({}),createNullPrototypeObject:()=>Object.create(null),createSet:()=>new Set,createMap:()=>new Map,set:(r,e,t)=>{r[e]=t},addValue:(r,e)=>{r.add(e)},addEntry:(r,e,t)=>{r.set(e,t)}},_r=Object.freeze(ee);function G(r,e,t){return C(JSON.parse(r),e,t)}function C(r,e,t){let n=W(_r,t?.operations);if(typeof r=="number")return g(r,!0);if(!Array.isArray(r)||r.length===0)throw new Error("Invalid input");let o=r,s=Array(o.length),p=null;function g(c,V=!1){if(c===-1)return n.fromPrimitive(void 0);if(c===-3)return n.fromPrimitive(NaN);if(c===-4)return n.fromPrimitive(1/0);if(c===-5)return n.fromPrimitive(-1/0);if(c===-6)return n.fromPrimitive(-0);if(V||typeof c!="number")throw new Error("Invalid input");if(c in s)return s[c];let i=o[c];if(!i||typeof i!="object")s[c]=n.fromPrimitive(i);else if(Array.isArray(i))if(typeof i[0]=="string"){let d=i[0],a=e&&Object.hasOwn(e,d)?e[d]:void 0;if(a){let y=i[1];if(typeof y!="number"&&(y=o.push(i[1])-1),Object.hasOwn(s,y))return s[c]=a(s[y]);if(p??(p=new Set),p.has(y))throw new Error("Invalid circular reference");return p.add(y),s[c]=a(g(y)),p.delete(y),s[c]}switch(d){case"Date":s[c]=n.fromISOString(i[1]);break;case"Set":let y=n.createSet();s[c]=y;for(let l=1;l<i.length;l+=1)n.addValue(y,g(i[l]));break;case"Map":let E=n.createMap();s[c]=E;for(let l=1;l<i.length;l+=2)n.addEntry(E,g(i[l]),g(i[l+1]));break;case"RegExp":s[c]=n.fromRegExpInfo(i[1],i[2]);break;case"Object":{let l=i[1];if(typeof o[l]=="object"&&o[l][0]!=="BigInt")throw new Error("Invalid input");s[c]=n.box(g(l));break}case"BigInt":s[c]=n.fromPrimitive(BigInt(i[1]));break;case"null":let A=n.createNullPrototypeObject();s[c]=A;for(let l=1;l<i.length;l+=2){if(i[l]==="__proto__")throw new Error("Cannot parse an object with a \`__proto__\` property");n.set(A,i[l],g(i[l+1]))}break;case"Int8Array":case"Uint8Array":case"Uint8ClampedArray":case"Int16Array":case"Uint16Array":case"Float16Array":case"Int32Array":case"Uint32Array":case"Float32Array":case"Float64Array":case"BigInt64Array":case"BigUint64Array":case"DataView":{if(o[i[1]][0]!=="ArrayBuffer")throw new Error("Invalid data");let l=g(i[1]);s[c]=n.fromViewInfo(d,l,i[2],i[3]);break}case"ArrayBuffer":{let l=i[1];if(typeof l!="string")throw new Error("Invalid ArrayBuffer encoding");s[c]=n.fromArrayBuffer(br(l));break}case"URL":case"URLSearchParams":case"Temporal.Duration":case"Temporal.Instant":case"Temporal.PlainDate":case"Temporal.PlainTime":case"Temporal.PlainDateTime":case"Temporal.PlainMonthDay":case"Temporal.PlainYearMonth":case"Temporal.ZonedDateTime":{s[c]=n.fromStringValue(d,i[1]);break}default:throw new Error(\`Unknown type \${d}\`)}}else if(i[0]===-7){let d=i[1];if(!ur(d))throw new Error("Invalid input");let a=n.createSparseArray(d);s[c]=a;for(let y=2;y<i.length;y+=2){let E=i[y];if(!Y(E)||E>=d)throw new Error("Invalid input");n.set(a,E,g(i[y+1]))}}else{let d=n.createArray(i.length);s[c]=d;for(let a=0;a<i.length;a+=1){let y=i[a];y!==-2&&n.set(d,a,g(y))}}else{let d=n.createObject();s[c]=d;for(let a of Object.keys(i)){if(a==="__proto__")throw new Error("Cannot parse an object with a \`__proto__\` property");n.set(d,a,g(i[a]))}}return s[c]}return g(0)}function H(r,e,t){let n=ae(!1,r,e,t);return typeof n=="string"?n:\`[\${n.join(",")}]\`}function ae(r,e,t,n){let o=W(Er,n?.operations),s=[],p=new Map,g=[];if(t)for(let a of Object.getOwnPropertyNames(t))g.push({key:a,fn:t[a]});let c=[],V=0;function i(a,y){let E=o.typeOf(a);if(E==="undefined")return-1;let A;if(E==="number"){if(A=o.toPrimitive(a),Number.isNaN(A))return-3;if(A===1/0)return-4;if(A===-1/0)return-5;if(A===0&&1/A<0)return-6}let l=o.identify(a);if(p.has(l))return p.get(l);y??(y=V++),p.set(l,y);for(let{key:T,fn:k}of g){let M=k(a);if(M)return s[y]=\`["\${T}",\${i(M)}]\`,y}if(E==="function")throw new S("Cannot stringify a function",c,a,e);if(E==="symbol")throw new S("Cannot stringify a Symbol primitive",c,a,e);let f="";if(E!=="object")f=wr(E==="number"?A:o.toPrimitive(a));else if(o.isThenable(a)){if(!r)throw new S("Cannot stringify a Promise or thenable \\u2014 use stringifyAsync instead",c,a,e);f=o.toPromise(a).then(T=>{let k=i(T,y);k<0&&(s[y]=k)})}else{let T=o.tagOf(a);switch(T){case"Number":case"String":case"Boolean":case"BigInt":f=\`["Object",\${i(o.unbox(a))}]\`;break;case"Date":f=\`["Date","\${o.toISOString(a)}"]\`;break;case"URL":f=\`["URL",\${I(o.toStringValue(a))}]\`;break;case"URLSearchParams":f=\`["URLSearchParams",\${I(o.toStringValue(a))}]\`;break;case"RegExp":let{source:k,flags:M}=o.regExpInfo(a);f=M?\`["RegExp",\${I(k)},"\${M}"]\`:\`["RegExp",\${I(k)}]\`;break;case"Array":{let u=!1,b=o.lengthOf(a);f="[";for(let m=0;m<b;m+=1)if(m>0&&(f+=","),o.hasOwn(a,m))c.push(\`[\${m}]\`),f+=i(o.get(a,m)),c.pop();else if(u)f+=-2;else{let x=o.indicesOf(a),nr=x.length,or=String(b).length,Dr=(b-nr)*3,Ur=4+or+nr*(or+1);if(Dr>Ur){f="["+-7+","+b;for(let z=0;z<x.length;z++){let $=x[z];c.push(\`[\${$}]\`),f+=","+$+","+i(o.get(a,$)),c.pop()}break}else u=!0,f+=-2}f+="]";break}case"Set":f='["Set"';for(let u of o.valuesOf(a))f+=\`,\${i(u)}\`;f+="]";break;case"Map":f='["Map"';for(let[u,b]of o.entriesOf(a)){let m=o.typeOf(u),x=m!=="object"&&m!=="function"&&m!=="symbol";c.push(\`.get(\${x?wr(o.toPrimitive(u)):"..."})\`),f+=\`,\${i(u)},\${i(b)}\`,c.pop()}f+="]";break;case"Int8Array":case"Uint8Array":case"Uint8ClampedArray":case"Int16Array":case"Uint16Array":case"Float16Array":case"Int32Array":case"Uint32Array":case"Float32Array":case"Float64Array":case"BigInt64Array":case"BigUint64Array":{let u=o.viewInfo(a);f='["'+T+'",'+i(u.buffer),u.byteLength!==u.bufferByteLength&&(f+=\`,\${u.byteOffset},\${u.length}\`),f+="]";break}case"DataView":{let u=o.viewInfo(a);f='["'+T+'",'+i(u.buffer),u.byteLength!==u.bufferByteLength&&(f+=\`,\${u.byteOffset},\${u.byteLength}\`),f+="]";break}case"ArrayBuffer":{f=\`["ArrayBuffer","\${mr(o.toArrayBuffer(a))}"]\`;break}case"Temporal.Duration":case"Temporal.Instant":case"Temporal.PlainDate":case"Temporal.PlainTime":case"Temporal.PlainDateTime":case"Temporal.PlainMonthDay":case"Temporal.PlainYearMonth":case"Temporal.ZonedDateTime":f=\`["\${T}",\${I(o.toStringValue(a))}]\`;break;default:{let u=o.shapeOf(a);if(u.kind==="not-plain")throw new S("Cannot stringify arbitrary non-POJOs",c,a,e);if(u.kind==="symbol-keys")throw new S("Cannot stringify POJOs with symbolic keys",c,a,e);if(u.kind==="null-proto"){f='["null"';for(let b of u.keys){if(b==="__proto__")throw new S("Cannot stringify objects with __proto__ keys",c,a,e);c.push(Z(b)),f+=\`,\${I(b)},\${i(o.get(a,b))}\`,c.pop()}f+="]"}else{f="{";let b=!1;for(let m of u.keys){if(m==="__proto__")throw new S("Cannot stringify objects with __proto__ keys",c,a,e);b&&(f+=","),b=!0,c.push(Z(m)),f+=\`\${I(m)}:\${i(o.get(a,m))}\`,c.pop()}f+="}"}}}}return s[y]=f,y}let d=i(e);return d<0?\`\${d}\`:s}function wr(r){let e=typeof r;return e==="string"?I(r):r===void 0?(-1).toString():r===0&&1/r<0?(-6).toString():e==="bigint"?\`["BigInt","\${r}"]\`:String(r)}var X=Symbol.for("workflow-serialize"),q=Symbol.for("workflow-deserialize");var J=Symbol.for("workflow-class-registry");function ie(r=globalThis){let e=r,t=e[J];return t||(t=new Map,e[J]=t),t}function Q(r,e){return ie(e).get(r)}function P(){return{Class:r=>{if(typeof r!="function")return!1;let e=r.classId;return typeof e!="string"?!1:{classId:e}},Instance:r=>{if(r===null||typeof r!="object")return!1;let e=r.constructor;if(!e||typeof e!="function")return!1;let t=e[X];if(typeof t!="function")return!1;let n=e.classId;if(typeof n!="string")throw new Error(\`Class "\${e.name}" with \${String(X)} must have a static "classId" property.\`);let o=t.call(e,r);return{classId:n,data:o}}}}function B(r=globalThis){return{Class:e=>{let t=e.classId,n=Q(t,r);if(!n)throw new Error(\`Class "\${t}" not found. Make sure the class is registered with registerSerializationClass.\`);return n},Instance:e=>{let t=e.classId,n=e.data,o=Q(t,r);if(!o)throw new Error(\`Class "\${t}" not found. Make sure the class is registered with registerSerializationClass.\`);let s=o[q];if(typeof s!="function")throw new Error(\`Class "\${t}" does not have a static \${String(q)} method.\`);return s.call(o,n)}}}function Or(r,e,t){if(t===0)return".";let n=new Uint8Array(r,e,t),o="";for(let s=0;s<n.length;s++)o+=String.fromCharCode(n[s]);return btoa(o)}function R(r){return Or(r.buffer,r.byteOffset,r.byteLength)}function _(r){if(r===".")return new ArrayBuffer(0);let e=atob(r),t=new Uint8Array(e.length);for(let n=0;n<e.length;n++)t[n]=e.charCodeAt(n);return t.buffer}function h(r){return e=>{if(!(e instanceof Error)||e.name!==r)return!1;let t={message:e.message,stack:e.stack};return"cause"in e&&(t.cause=e.cause),t}}function N(r){return e=>{let t=globalThis[r],n;return typeof t=="function"?n=new t(e.message):(n=new Error(e.message),n.name=r),e.stack!==void 0&&(n.stack=e.stack),"cause"in e&&(n.cause=e.cause),n}}function j(){return{ArrayBuffer:r=>r instanceof ArrayBuffer&&Or(r,0,r.byteLength),BigInt:r=>typeof r=="bigint"&&r.toString(),BigInt64Array:r=>r instanceof BigInt64Array&&R(r),BigUint64Array:r=>r instanceof BigUint64Array&&R(r),Date:r=>r instanceof Date?!Number.isNaN(r.getDate())?r.toISOString():".":!1,DOMException:r=>{if(!(r instanceof DOMException))return!1;let e={message:r.message,name:r.name,stack:r.stack};return"cause"in r&&(e.cause=r.cause),e},AggregateError:r=>{if(!(r instanceof Error)||r.name!=="AggregateError")return!1;let e={message:r.message,stack:r.stack,errors:r.errors};return"cause"in r&&(e.cause=r.cause),e},EvalError:h("EvalError"),FatalError:h("FatalError"),HookConflictError:r=>{if(!(r instanceof Error)||r.name!=="HookConflictError")return!1;let e={message:r.message,stack:r.stack,token:r.token};return r.conflictingRunId!==void 0&&(e.conflictingRunId=r.conflictingRunId),"cause"in r&&(e.cause=r.cause),e},RangeError:h("RangeError"),ReferenceError:h("ReferenceError"),RetryableError:r=>{if(!(r instanceof Error)||r.name!=="RetryableError")return!1;let e=r.retryAfter,t;if(e&&typeof e=="object"&&typeof e.getTime=="function"){let o=e.getTime();t=Number.isNaN(o)?Date.now()+1e3:o}else if(typeof e=="string"||typeof e=="number"){let o=new Date(e).getTime();t=Number.isNaN(o)?Date.now()+1e3:o}else t=Date.now()+1e3;let n={message:r.message,stack:r.stack,retryAfter:t};return"cause"in r&&(n.cause=r.cause),n},RuntimeDecryptionError:r=>{if(!(r instanceof Error)||r.name!=="RuntimeDecryptionError")return!1;let e={message:r.message,stack:r.stack},t=r.context;return t!==void 0&&(e.context=t),"cause"in r&&(e.cause=r.cause),e},SyntaxError:h("SyntaxError"),TypeError:h("TypeError"),URIError:h("URIError"),Error:r=>{if(!(r instanceof Error))return!1;let e={name:r.name,message:r.message,stack:r.stack};return"cause"in r&&(e.cause=r.cause),e},Float32Array:r=>r instanceof Float32Array&&R(r),Float64Array:r=>r instanceof Float64Array&&R(r),Int8Array:r=>r instanceof Int8Array&&R(r),Int16Array:r=>r instanceof Int16Array&&R(r),Int32Array:r=>r instanceof Int32Array&&R(r),Map:r=>r instanceof Map&&Array.from(r),RegExp:r=>r instanceof RegExp&&{source:r.source,flags:r.flags},Headers:r=>{let e=globalThis.Headers;return!e||!(r instanceof e)?!1:Array.from(r)},Request:r=>{let e=globalThis.Request;if(!e||!(r instanceof e)&&typeof r?.json!="function"||typeof r?.method!="string")return!1;let t={method:r.method,url:r.url,headers:r.headers,body:r.body,duplex:r.duplex},n=r[Symbol.for("WEBHOOK_RESPONSE_WRITABLE")];return n&&(t.responseWritable=n),t},Response:r=>{let e=globalThis.Response;return!e||!(r instanceof e)&&typeof r?.clone!="function"||typeof r?.status!="number"?!1:{type:r.type,url:r.url,status:r.status,statusText:r.statusText,headers:r.headers,body:r.body,redirected:r.redirected}},ReadableStream:(r=>{if(r==null)return!1;let e=globalThis.ReadableStream;if(!e||!(r instanceof e||Object.getPrototypeOf(r)===e.prototype))return!1;let t=r[Symbol.for("BODY_INIT")];if(t!==void 0)return{bodyInit:t};let n=r[Symbol.for("WORKFLOW_STREAM_NAME")];if(n){let o={name:n},s=r[Symbol.for("WORKFLOW_STREAM_TYPE")];s&&(o.type=s);let p=r[Symbol.for("WORKFLOW_STREAM_FRAMING")];return p&&(o.framing=p),o}return{name:"__empty"}}),WritableStream:(r=>{if(r==null)return!1;let e=globalThis.WritableStream;if(!e||!(r instanceof e||Object.getPrototypeOf(r)===e.prototype))return!1;let n={name:r[Symbol.for("WORKFLOW_STREAM_NAME")]||"__empty"},o=r[Symbol.for("WORKFLOW_STREAM_SERVER_RUN_ID")];typeof o=="string"&&(n.runId=o);let s=r[Symbol.for("WORKFLOW_STREAM_SERVER_DEPLOYMENT_ID")];return typeof s=="string"&&(n.deploymentId=s),n}),Set:r=>r instanceof Set&&Array.from(r),URL:r=>r instanceof URL&&r.href,WorkflowFunction:r=>{if(typeof r!="function")return!1;let e=r.workflowId;return typeof e!="string"?!1:{workflowId:e}},URLSearchParams:r=>r instanceof URLSearchParams?r.size===0?".":String(r):!1,Uint8Array:r=>r instanceof Uint8Array&&R(r),Uint8ClampedArray:r=>r instanceof Uint8ClampedArray&&R(r),Uint16Array:r=>r instanceof Uint16Array&&R(r),Uint32Array:r=>r instanceof Uint32Array&&R(r)}}function K(){return{ArrayBuffer:r=>_(r),BigInt:r=>BigInt(r),BigInt64Array:r=>new BigInt64Array(_(r)),BigUint64Array:r=>new BigUint64Array(_(r)),Date:r=>new Date(r),DOMException:r=>{let e=new DOMException(r.message,r.name);return r.stack!==void 0&&(e.stack=r.stack),"cause"in r&&(e.cause=r.cause),e},AggregateError:r=>{let e=new AggregateError(r.errors??[],r.message);return r.stack!==void 0&&(e.stack=r.stack),"cause"in r&&(e.cause=r.cause),e},EvalError:N("EvalError"),FatalError:r=>{let e=globalThis[Symbol.for("@workflow/errors//FatalError")],t;return typeof e=="function"?t=new e(r.message):(t=new Error(r.message),t.name="FatalError"),r.stack!==void 0&&(t.stack=r.stack),"cause"in r&&(t.cause=r.cause),t},HookConflictError:r=>{let e=globalThis[Symbol.for("@workflow/errors//HookConflictError")],t;return typeof e=="function"?t=new e(r.token,r.conflictingRunId):(t=new Error(r.message),t.name="HookConflictError",t.token=r.token,r.conflictingRunId!==void 0&&(t.conflictingRunId=r.conflictingRunId)),r.stack!==void 0&&(t.stack=r.stack),"cause"in r&&(t.cause=r.cause),t},RangeError:N("RangeError"),ReferenceError:N("ReferenceError"),RetryableError:r=>{let e=globalThis[Symbol.for("@workflow/errors//RetryableError")],t=new Date(r.retryAfter),n;return typeof e=="function"?n=new e(r.message,{retryAfter:t}):(n=new Error(r.message),n.name="RetryableError",n.retryAfter=t),r.stack!==void 0&&(n.stack=r.stack),"cause"in r&&(n.cause=r.cause),n},RuntimeDecryptionError:r=>{let e=globalThis[Symbol.for("@workflow/errors//RuntimeDecryptionError")],t;if(typeof e=="function"){let n={};"cause"in r&&(n.cause=r.cause),r.context!==void 0&&(n.context=r.context),t=new e(r.message,n)}else t=new Error(r.message),t.name="RuntimeDecryptionError",r.context!==void 0&&(t.context=r.context),"cause"in r&&(t.cause=r.cause);return r.stack!==void 0&&(t.stack=r.stack),t},SyntaxError:N("SyntaxError"),TypeError:N("TypeError"),URIError:N("URIError"),Error:r=>{let e=new Error(r.message);return e.name=r.name,r.stack!==void 0&&(e.stack=r.stack),"cause"in r&&(e.cause=r.cause),e},Float32Array:r=>new Float32Array(_(r)),Float64Array:r=>new Float64Array(_(r)),Int8Array:r=>new Int8Array(_(r)),Int16Array:r=>new Int16Array(_(r)),Int32Array:r=>new Int32Array(_(r)),Map:r=>new Map(r),RegExp:r=>new RegExp(r.source,r.flags),Set:r=>new Set(r),URL:r=>new URL(r),WorkflowFunction:r=>Object.assign(()=>{throw new Error("Workflow functions cannot be called directly. Use start() to invoke them.")},{workflowId:r.workflowId}),URLSearchParams:r=>new URLSearchParams(r==="."?"":r),Uint8Array:r=>new Uint8Array(_(r)),Uint8ClampedArray:r=>new Uint8ClampedArray(_(r)),Uint16Array:r=>new Uint16Array(_(r)),Uint32Array:r=>new Uint32Array(_(r)),Headers:r=>new globalThis.Headers(r),Request:r=>{let e=globalThis.Request;return e&&(r.json=e.prototype.json,r.text=e.prototype.text,r.arrayBuffer=e.prototype.arrayBuffer),r.responseWritable&&(r[Symbol.for("WEBHOOK_RESPONSE_WRITABLE")]=r.responseWritable),r},Response:r=>{let e=globalThis.Response;return e&&(r.json=e.prototype.json,r.text=e.prototype.text,r.arrayBuffer=e.prototype.arrayBuffer,e.prototype.bytes&&(r.bytes=e.prototype.bytes),e.prototype.clone&&(r.clone=e.prototype.clone)),r._body=r.body,r.ok=r.status>=200&&r.status<300,r.bodyUsed=!1,r},ReadableStream:r=>{let e=globalThis.ReadableStream,t=Object.create(e?e.prototype:{});return r&&"bodyInit"in r?t[Symbol.for("BODY_INIT")]=r.bodyInit:r&&"name"in r&&(t[Symbol.for("WORKFLOW_STREAM_NAME")]=r.name,r.type&&(t[Symbol.for("WORKFLOW_STREAM_TYPE")]=r.type),r.framing&&(t[Symbol.for("WORKFLOW_STREAM_FRAMING")]=r.framing)),t},WritableStream:r=>{let e=globalThis.WritableStream,t=Object.create(e?e.prototype:{});return r&&"name"in r&&(t[Symbol.for("WORKFLOW_STREAM_NAME")]=r.name),r&&typeof r.runId=="string"&&(t[Symbol.for("WORKFLOW_STREAM_SERVER_RUN_ID")]=r.runId),r&&typeof r.deploymentId=="string"&&(t[Symbol.for("WORKFLOW_STREAM_SERVER_DEPLOYMENT_ID")]=r.deploymentId),t}}}function Ir(){return{StepFunction:r=>{if(typeof r!="function")return!1;let e=r.stepId;if(typeof e!="string")return!1;let t=r.__closureVarsFn,n=t&&typeof t=="function"?t():void 0,o="__boundThis"in r,s=o?r.__boundThis:void 0,p=r.__boundArgs,g={stepId:e};return n!==void 0&&(g.closureVars=n),o&&(g.boundThis=s),Array.isArray(p)&&p.length>0&&(g.boundArgs=p),g}}}function Tr(r=globalThis){let e=r[Symbol.for("WORKFLOW_USE_STEP")];return{StepFunction:t=>{let n=t.stepId,o=t.closureVars;if(!e)throw new Error("WORKFLOW_USE_STEP not found on global object. Step functions cannot be deserialized outside workflow context.");let s=o?e(n,()=>o):e(n);if("boundThis"in t){let p=Array.isArray(t.boundArgs)?t.boundArgs:[];return s.bind(t.boundThis,...p)}return s}}}function kr(r){return r.length===4&&/^[a-z0-9]{4}$/.test(r)}var U={DEVALUE_V1:"devl",ENCRYPTED:"encr",SEALED:"encp",GZIP:"gzip",ZSTD:"zstd"};var ce=new TextEncoder,fe=new TextDecoder,L=Symbol.for("WORKFLOW_ABORT_STREAM_NAME"),v=Symbol.for("WORKFLOW_ABORT_HOOK_TOKEN");function hr(r,e){let t=e[L]??e.signal?.[L],n=e[v]??e.signal?.[v];if(!t)throw new Error("AbortController/AbortSignal stream name is not set");return{streamName:t,hookToken:n,aborted:r.aborted,reason:r.aborted?r.reason:void 0}}function Nr(r){let e=globalThis.__WorkflowAbortSignal;if(typeof e!="function")throw new Error("WorkflowAbortSignal is not registered in the VM (bootstrap not evaluated)");let t=new e(r.streamName,r.hookToken);return r.aborted&&t._setAborted(r.reason),t}function ye(){return{AbortController:r=>!r||typeof r!="object"||!r.signal||(r[L]??r.signal?.[L])===void 0?!1:hr(r.signal,r),AbortSignal:r=>!r||typeof r!="object"||r[L]===void 0?!1:hr(r,r)}}function le(){return{AbortController:r=>({[L]:r.streamName,[v]:r.hookToken,signal:Nr(r),abort:()=>{}}),AbortSignal:r=>Nr(r)}}function ue(r){switch(r){case"workflow":return{...ye(),...P(),...Ir(),...j()};case"step":return{...P(),...j()};case"client":return{...P(),...j()}}}function Lr(r){switch(r){case"workflow":return{...le(),...B(),...Tr(),...K()};case"step":return{...B(),...K()};case"client":return{...B(),...K(),StepFunction:()=>{throw new Error("Step functions cannot be deserialized in client context.")}}}}var F={formatPrefix:U.DEVALUE_V1,serialize(r,e){let t=ue(e),n=H(r,t);return ce.encode(n)},deserialize(r,e){let t=Lr(e),n=fe.decode(r);return G(n,t)},deserializeLegacy(r,e){let t=Lr(e);return C(r,t)}};var rr=4,er,tr;function pe(){return er||(er=new globalThis.TextEncoder),er}function ge(){return tr||(tr=new globalThis.TextDecoder),tr}function Mr(r){let e=F.serialize(r,"workflow"),t=pe().encode(U.DEVALUE_V1),n=new Uint8Array(t.length+e.length);return n.set(t,0),n.set(e,t.length),n}function xr(r){if(!(r instanceof Uint8Array)){if(F.deserializeLegacy)return F.deserializeLegacy(r,"workflow");throw new Error("Cannot deserialize non-binary data without legacy support")}if(r.length<rr)throw new Error("Data too short to contain format prefix");let e=ge().decode(r.subarray(0,rr));if(!kr(e))throw new Error(\`Invalid format prefix: "\${e}"\`);if(e===U.DEVALUE_V1){let t=r.subarray(rr);return F.deserialize(t,"workflow")}throw new Error(\`Unsupported serialization format: \${e}\`)}globalThis[Symbol.for("workflow-serialize")]=Mr;globalThis[Symbol.for("workflow-deserialize")]=xr;var de=ir(()=>Math.random());globalThis.__generateUlid=()=>{let r=globalThis.__ulidTimestamp;if(typeof r!="number")throw new Error("__generateUlid: globalThis.__ulidTimestamp must be a number set by the host before the serde bundle is evaluated. Without it, ULIDs would fall back to Date.now() and concurrent workflow invocations of the same resumption would produce divergent correlationIds.");return de(r)};})();
|
|
15
|
+
`;
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidm0tc2VyZGUtYnVuZGxlLmdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL3ZtLXNlcmRlLWJ1bmRsZS5nZW5lcmF0ZWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQVc7O0NBRXRDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEF1dG8tZ2VuZXJhdGVkIGJ5IHNjcmlwdHMvYnVpbGQtdm0tc2VyZGUtYnVuZGxlLmpzXG4gKiBEbyBub3QgZWRpdCBtYW51YWxseS5cbiAqXG4gKiBUaGlzIGlzIHRoZSBWTSBzZXJpYWxpemF0aW9uIGJ1bmRsZSDigJQgYSBzZWxmLWNvbnRhaW5lZCBJSUZFIHRoYXQgc2V0cyB1cFxuICogdGhlIHNlcmlhbGl6ZS9kZXNlcmlhbGl6ZSBmdW5jdGlvbnMgaW5zaWRlIHRoZSBRdWlja0pTIFdBU00gVk0uIEl0XG4gKiBpbmNsdWRlcyBkZXZhbHVlIGFuZCBhbGwgd29ya2Zsb3ctbW9kZSByZWR1Y2Vycy9yZXZpdmVycy4gKFRleHRFbmNvZGVyLFxuICogVGV4dERlY29kZXIsIGFuZCBIZWFkZXJzIGFyZSBwcm92aWRlZCBieSBxdWlja2pzLXdhc2kncyBuYXRpdmUgQ1xuICogZXh0ZW5zaW9ucyDigJQgbm8gSlMgcG9seWZpbGxzIGFyZSBidW5kbGVkLilcbiAqXG4gKiBTaXplOiAyNS42IEtCIG1pbmlmaWVkXG4gKi9cbmV4cG9ydCBjb25zdCBWTV9TRVJERV9CVU5ETEU6IHN0cmluZyA9IGBcInVzZSBzdHJpY3RcIjsoKCk9Pnt2YXIgRD1cIjAxMjM0NTY3ODlBQkNERUZHSEpLTU5QUVJTVFZXWFlaXCI7dmFyIHc7KGZ1bmN0aW9uKHIpe3IuQmFzZTMySW5jb3JyZWN0RW5jb2Rpbmc9XCJCMzJfRU5DX0lOVkFMSURcIixyLkRlY29kZVRpbWVJbnZhbGlkQ2hhcmFjdGVyPVwiREVDX1RJTUVfQ0hBUlwiLHIuRGVjb2RlVGltZVZhbHVlTWFsZm9ybWVkPVwiREVDX1RJTUVfTUFMRk9STUVEXCIsci5FbmNvZGVUaW1lTmVnYXRpdmU9XCJFTkNfVElNRV9ORUdcIixyLkVuY29kZVRpbWVTaXplRXhjZWVkZWQ9XCJFTkNfVElNRV9TSVpFX0VYQ0VFRFwiLHIuRW5jb2RlVGltZVZhbHVlTWFsZm9ybWVkPVwiRU5DX1RJTUVfTUFMRk9STUVEXCIsci5QUk5HRGV0ZWN0RmFpbHVyZT1cIlBSTkdfREVURUNUXCIsci5VTElESW52YWxpZD1cIlVMSURfSU5WQUxJRFwiLHIuVW5leHBlY3RlZD1cIlVORVhQRUNURURcIixyLlVVSURJbnZhbGlkPVwiVVVJRF9JTlZBTElEXCJ9KSh3fHwodz17fSkpO3ZhciBPPWNsYXNzIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IoZSx0KXtzdXBlcihcXGBcXCR7dH0gKFxcJHtlfSlcXGApLHRoaXMubmFtZT1cIlVMSURFcnJvclwiLHRoaXMuY29kZT1lfX07ZnVuY3Rpb24gRnIocil7bGV0IGU9TWF0aC5mbG9vcihyKCkqMzIpJTMyO3JldHVybiBELmNoYXJBdChlKX1mdW5jdGlvbiBzcihyLGUsdCl7cmV0dXJuIGU+ci5sZW5ndGgtMT9yOnIuc3Vic3RyKDAsZSkrdCtyLnN1YnN0cihlKzEpfWZ1bmN0aW9uIFdyKHIpe2xldCBlLHQ9ci5sZW5ndGgsbixvLHM9cixwPTMxO2Zvcig7IWUmJnQtLT49MDspe2lmKG49c1t0XSxvPUQuaW5kZXhPZihuKSxvPT09LTEpdGhyb3cgbmV3IE8ody5CYXNlMzJJbmNvcnJlY3RFbmNvZGluZyxcIkluY29ycmVjdGx5IGVuY29kZWQgc3RyaW5nXCIpO2lmKG89PT1wKXtzPXNyKHMsdCxEWzBdKTtjb250aW51ZX1lPXNyKHMsdCxEW28rMV0pfWlmKHR5cGVvZiBlPT1cInN0cmluZ1wiKXJldHVybiBlO3Rocm93IG5ldyBPKHcuQmFzZTMySW5jb3JyZWN0RW5jb2RpbmcsXCJGYWlsZWQgaW5jcmVtZW50aW5nIHN0cmluZ1wiKX1mdW5jdGlvbiBDcihyKXtsZXQgZT1QcigpLHQ9ZSYmKGUuY3J5cHRvfHxlLm1zQ3J5cHRvKXx8bnVsbDtpZih0eXBlb2YgdD8uZ2V0UmFuZG9tVmFsdWVzPT1cImZ1bmN0aW9uXCIpcmV0dXJuKCk9PntsZXQgbj1uZXcgVWludDhBcnJheSgxKTtyZXR1cm4gdC5nZXRSYW5kb21WYWx1ZXMobiksblswXS8yNTV9O2lmKHR5cGVvZiB0Py5yYW5kb21CeXRlcz09XCJmdW5jdGlvblwiKXJldHVybigpPT50LnJhbmRvbUJ5dGVzKDEpLnJlYWRVSW50OCgpLzI1NTt0aHJvdyBuZXcgTyh3LlBSTkdEZXRlY3RGYWlsdXJlLFwiRmFpbGVkIHRvIGZpbmQgYSByZWxpYWJsZSBQUk5HXCIpfWZ1bmN0aW9uIFByKCl7cmV0dXJuIGpyKCk/c2VsZjp0eXBlb2Ygd2luZG93PFwidVwiP3dpbmRvdzp0eXBlb2YgZ2xvYmFsPFwidVwiP2dsb2JhbDp0eXBlb2YgZ2xvYmFsVGhpczxcInVcIj9nbG9iYWxUaGlzOm51bGx9ZnVuY3Rpb24gQnIocixlKXtsZXQgdD1cIlwiO2Zvcig7cj4wO3ItLSl0PUZyKGUpK3Q7cmV0dXJuIHR9ZnVuY3Rpb24gYXIocixlPTEwKXtpZihpc05hTihyKSl0aHJvdyBuZXcgTyh3LkVuY29kZVRpbWVWYWx1ZU1hbGZvcm1lZCxcXGBUaW1lIG11c3QgYmUgYSBudW1iZXI6IFxcJHtyfVxcYCk7aWYocj4weGZmZmZmZmZmZmZmZil0aHJvdyBuZXcgTyh3LkVuY29kZVRpbWVTaXplRXhjZWVkZWQsXFxgQ2Fubm90IGVuY29kZSBhIHRpbWUgbGFyZ2VyIHRoYW4gXFwkezB4ZmZmZmZmZmZmZmZmfTogXFwke3J9XFxgKTtpZihyPDApdGhyb3cgbmV3IE8ody5FbmNvZGVUaW1lTmVnYXRpdmUsXFxgVGltZSBtdXN0IGJlIHBvc2l0aXZlOiBcXCR7cn1cXGApO2lmKE51bWJlci5pc0ludGVnZXIocik9PT0hMSl0aHJvdyBuZXcgTyh3LkVuY29kZVRpbWVWYWx1ZU1hbGZvcm1lZCxcXGBUaW1lIG11c3QgYmUgYW4gaW50ZWdlcjogXFwke3J9XFxgKTtsZXQgdCxuPVwiXCI7Zm9yKGxldCBvPWU7bz4wO28tLSl0PXIlMzIsbj1ELmNoYXJBdCh0KStuLHI9KHItdCkvMzI7cmV0dXJuIG59ZnVuY3Rpb24ganIoKXtyZXR1cm4gdHlwZW9mIFdvcmtlckdsb2JhbFNjb3BlPFwidVwiJiZzZWxmIGluc3RhbmNlb2YgV29ya2VyR2xvYmFsU2NvcGV9ZnVuY3Rpb24gaXIocil7bGV0IGU9cnx8Q3IoKSx0PTAsbjtyZXR1cm4gZnVuY3Rpb24ocyl7bGV0IHA9IXN8fGlzTmFOKHMpP0RhdGUubm93KCk6cztpZihwPD10KXtsZXQgYz1uPVdyKG4pO3JldHVybiBhcih0LDEwKStjfXQ9cDtsZXQgZz1uPUJyKDE2LGUpO3JldHVybiBhcihwLDEwKStnfX12YXIgUz1jbGFzcyBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKGUsdCxuLG8pe3N1cGVyKGUpLHRoaXMubmFtZT1cIkRldmFsdWVFcnJvclwiLHRoaXMucGF0aD10LmpvaW4oXCJcIiksdGhpcy52YWx1ZT1uLHRoaXMucm9vdD1vfX07dmFyIEtyPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKE9iamVjdC5wcm90b3R5cGUpLnNvcnQoKS5qb2luKFwiXFxcXDBcIik7ZnVuY3Rpb24gZnIocil7bGV0IGU9T2JqZWN0LmdldFByb3RvdHlwZU9mKHIpO3JldHVybiBlPT09T2JqZWN0LnByb3RvdHlwZXx8ZT09PW51bGx8fE9iamVjdC5nZXRQcm90b3R5cGVPZihlKT09PW51bGx8fE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGUpLnNvcnQoKS5qb2luKFwiXFxcXDBcIik9PT1Lcn1mdW5jdGlvbiB5cihyKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHIpLnNsaWNlKDgsLTEpfWZ1bmN0aW9uIFZyKHIpe3N3aXRjaChyKXtjYXNlJ1wiJzpyZXR1cm4nXFxcXFxcXFxcIic7Y2FzZVwiPFwiOnJldHVyblwiXFxcXFxcXFx1MDAzQ1wiO2Nhc2VcIlxcXFxcXFxcXCI6cmV0dXJuXCJcXFxcXFxcXFxcXFxcXFxcXCI7Y2FzZVxcYFxuXFxgOnJldHVyblwiXFxcXFxcXFxuXCI7Y2FzZVwiXFxcXHJcIjpyZXR1cm5cIlxcXFxcXFxcclwiO2Nhc2VcIlx0XCI6cmV0dXJuXCJcXFxcXFxcXHRcIjtjYXNlXCJcXFxcYlwiOnJldHVyblwiXFxcXFxcXFxiXCI7Y2FzZVwiXFxcXGZcIjpyZXR1cm5cIlxcXFxcXFxcZlwiO2Nhc2VcIlxcXFx1MjAyOFwiOnJldHVyblwiXFxcXFxcXFx1MjAyOFwiO2Nhc2VcIlxcXFx1MjAyOVwiOnJldHVyblwiXFxcXFxcXFx1MjAyOVwiO2RlZmF1bHQ6cmV0dXJuIHI8XCIgXCI/XFxgXFxcXFxcXFx1XFwke3IuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikucGFkU3RhcnQoNCxcIjBcIil9XFxgOlwiXCJ9fWZ1bmN0aW9uIEkocil7bGV0IGU9XCJcIix0PTAsbj1yLmxlbmd0aDtmb3IobGV0IG89MDtvPG47bys9MSl7bGV0IHM9cltvXSxwPVZyKHMpO3AmJihlKz1yLnNsaWNlKHQsbykrcCx0PW8rMSl9cmV0dXJuXFxgXCJcXCR7dD09PTA/cjplK3Iuc2xpY2UodCl9XCJcXGB9ZnVuY3Rpb24gbHIocil7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocikuZmlsdGVyKGU9Pk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocixlKS5lbnVtZXJhYmxlKX12YXIgenI9L15bYS16QS1aXyRdW2EtekEtWl8kMC05XSokLztmdW5jdGlvbiBaKHIpe3JldHVybiB6ci50ZXN0KHIpP1wiLlwiK3I6XCJbXCIrSlNPTi5zdHJpbmdpZnkocikrXCJdXCJ9ZnVuY3Rpb24gWShyKXtyZXR1cm4hKCFOdW1iZXIuaXNJbnRlZ2VyKHIpfHxyPDB8fHI+NDI5NDk2NzI5NCl9ZnVuY3Rpb24gdXIocil7cmV0dXJuISghTnVtYmVyLmlzSW50ZWdlcihyKXx8cjwwfHxyPjQyOTQ5NjcyOTUpfWZ1bmN0aW9uICRyKHIpe2lmKHIubGVuZ3RoPT09MHx8ci5sZW5ndGg+MSYmci5jaGFyQ29kZUF0KDApPT09NDgpcmV0dXJuITE7Zm9yKGxldCBlPTA7ZTxyLmxlbmd0aDtlKyspe2xldCB0PXIuY2hhckNvZGVBdChlKTtpZih0PDQ4fHx0PjU3KXJldHVybiExfXJldHVybiBZKCtyKX1mdW5jdGlvbiBacihyKXtmb3IodmFyIGU9ci5sZW5ndGgtMTtlPj0wJiYhJHIocltlXSk7ZS0tKTtyZXR1cm4gZSsxfWZ1bmN0aW9uIHByKHIpe2xldCBlPU9iamVjdC5rZXlzKHIpO3JldHVybiBlLmxlbmd0aD1acihlKSxlfWZ1bmN0aW9uIFlyKHIpe3JldHVybiBuZXcgVWludDhBcnJheShyKS50b0Jhc2U2NCgpfWZ1bmN0aW9uIEdyKHIpe3JldHVybiBVaW50OEFycmF5LmZyb21CYXNlNjQocikuYnVmZmVyfWZ1bmN0aW9uIEhyKHIpe3JldHVybiBCdWZmZXIuZnJvbShyKS50b1N0cmluZyhcImJhc2U2NFwiKX1mdW5jdGlvbiBYcihyKXtyZXR1cm4gVWludDhBcnJheS5mcm9tKEJ1ZmZlci5mcm9tKHIsXCJiYXNlNjRcIikpLmJ1ZmZlcn1mdW5jdGlvbiBxcihyKXtsZXQgZT1uZXcgVWludDhBcnJheShyKSx0PVwiXCIsbj0zMjc2ODtmb3IobGV0IG89MDtvPGUubGVuZ3RoO28rPW4pe2xldCBzPWUuc3ViYXJyYXkobyxvK24pO3QrPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxzKX1yZXR1cm4gYnRvYSh0KX1mdW5jdGlvbiBKcihyKXtsZXQgZT1hdG9iKHIpLHQ9ZS5sZW5ndGgsbj1uZXcgVWludDhBcnJheSh0KTtmb3IobGV0IG89MDtvPHQ7bysrKW5bb109ZS5jaGFyQ29kZUF0KG8pO3JldHVybiBuLmJ1ZmZlcn12YXIgZ3I9dHlwZW9mIFVpbnQ4QXJyYXkuZnJvbUJhc2U2ND09XCJmdW5jdGlvblwiLGRyPXR5cGVvZiBwcm9jZXNzPT1cIm9iamVjdFwiJiZwcm9jZXNzLnZlcnNpb25zPy5ub2RlIT09dm9pZCAwLG1yPWdyP1lyOmRyP0hyOnFyLGJyPWdyP0dyOmRyP1hyOkpyO2Z1bmN0aW9uIFcocixlKXtpZighZSlyZXR1cm4gcjtsZXQgdD17fTtmb3IobGV0IG4gb2YgT2JqZWN0LmtleXMocikpdFtuXT1lW25dPz9yW25dO3JldHVybiB0fXZhciBRcj1PYmplY3QuZnJlZXplKHtraW5kOlwibm90LXBsYWluXCJ9KSx2cj1PYmplY3QuZnJlZXplKHtraW5kOlwic3ltYm9sLWtleXNcIn0pLHJlPXtpZGVudGlmeTpyPT5yLHR5cGVPZjpyPT5yPT09bnVsbD9cIm51bGxcIjp0eXBlb2Ygcix0b1ByaW1pdGl2ZTpyPT5yLHRhZ09mOnI9PnlyKHIpLGlzVGhlbmFibGU6cj0+dHlwZW9mIHIudGhlbj09XCJmdW5jdGlvblwiLHRvUHJvbWlzZTpyPT5Qcm9taXNlLnJlc29sdmUociksdW5ib3g6cj0+ci52YWx1ZU9mKCksdG9JU09TdHJpbmc6cj0+aXNOYU4oci5nZXREYXRlKCkpP1wiXCI6ci50b0lTT1N0cmluZygpLHRvU3RyaW5nVmFsdWU6cj0+ci50b1N0cmluZygpLHJlZ0V4cEluZm86cj0+KHtzb3VyY2U6ci5zb3VyY2UsZmxhZ3M6ci5mbGFnc30pLHZhbHVlc09mOnI9PnIsZW50cmllc09mOnI9PnIsdmlld0luZm86cj0+KHtidWZmZXI6ci5idWZmZXIsYnl0ZU9mZnNldDpyLmJ5dGVPZmZzZXQsYnl0ZUxlbmd0aDpyLmJ5dGVMZW5ndGgsbGVuZ3RoOnIubGVuZ3RoLGJ1ZmZlckJ5dGVMZW5ndGg6ci5idWZmZXIuYnl0ZUxlbmd0aH0pLHRvQXJyYXlCdWZmZXI6cj0+cixsZW5ndGhPZjpyPT5yLmxlbmd0aCxoYXNPd246KHIsZSk9Pk9iamVjdC5oYXNPd24ocixlKSxpbmRpY2VzT2Y6cj0+cHIociksc2hhcGVPZjpyPT5mcihyKT9scihyKS5sZW5ndGg+MD92cjp7a2luZDpPYmplY3QuZ2V0UHJvdG90eXBlT2Yocik9PT1udWxsP1wibnVsbC1wcm90b1wiOlwicGxhaW5cIixrZXlzOk9iamVjdC5rZXlzKHIpfTpRcixnZXQ6KHIsZSk9PnJbZV19LEVyPU9iamVjdC5mcmVlemUocmUpLGVlPXtmcm9tUHJpbWl0aXZlOnI9PnIsZnJvbUlTT1N0cmluZzpyPT5uZXcgRGF0ZShyKSxmcm9tU3RyaW5nVmFsdWU6KHIsZSk9PnI9PT1cIlVSTFwiP25ldyBVUkwoZSk6cj09PVwiVVJMU2VhcmNoUGFyYW1zXCI/bmV3IFVSTFNlYXJjaFBhcmFtcyhlKTpUZW1wb3JhbFtyLnNsaWNlKDkpXS5mcm9tKGUpLGZyb21BcnJheUJ1ZmZlcjpyPT5yLGZyb21SZWdFeHBJbmZvOihyLGUpPT5uZXcgUmVnRXhwKHIsZSksZnJvbVZpZXdJbmZvOihyLGUsdCxuKT0+e2xldCBvPWdsb2JhbFRoaXNbcl07cmV0dXJuIHQhPT12b2lkIDA/bmV3IG8oZSx0LG4pOm5ldyBvKGUpfSxib3g6cj0+T2JqZWN0KHIpLGNyZWF0ZUFycmF5OnI9Pm5ldyBBcnJheShyKSxjcmVhdGVTcGFyc2VBcnJheTpyPT57bGV0IGU9W107cmV0dXJuIGVbNDI5NDk2NzI5NF09dm9pZCAwLGRlbGV0ZSBlWzQyOTQ5NjcyOTRdLGUubGVuZ3RoPXIsZX0sY3JlYXRlT2JqZWN0OigpPT4oe30pLGNyZWF0ZU51bGxQcm90b3R5cGVPYmplY3Q6KCk9Pk9iamVjdC5jcmVhdGUobnVsbCksY3JlYXRlU2V0OigpPT5uZXcgU2V0LGNyZWF0ZU1hcDooKT0+bmV3IE1hcCxzZXQ6KHIsZSx0KT0+e3JbZV09dH0sYWRkVmFsdWU6KHIsZSk9PntyLmFkZChlKX0sYWRkRW50cnk6KHIsZSx0KT0+e3Iuc2V0KGUsdCl9fSxfcj1PYmplY3QuZnJlZXplKGVlKTtmdW5jdGlvbiBHKHIsZSx0KXtyZXR1cm4gQyhKU09OLnBhcnNlKHIpLGUsdCl9ZnVuY3Rpb24gQyhyLGUsdCl7bGV0IG49Vyhfcix0Py5vcGVyYXRpb25zKTtpZih0eXBlb2Ygcj09XCJudW1iZXJcIilyZXR1cm4gZyhyLCEwKTtpZighQXJyYXkuaXNBcnJheShyKXx8ci5sZW5ndGg9PT0wKXRocm93IG5ldyBFcnJvcihcIkludmFsaWQgaW5wdXRcIik7bGV0IG89cixzPUFycmF5KG8ubGVuZ3RoKSxwPW51bGw7ZnVuY3Rpb24gZyhjLFY9ITEpe2lmKGM9PT0tMSlyZXR1cm4gbi5mcm9tUHJpbWl0aXZlKHZvaWQgMCk7aWYoYz09PS0zKXJldHVybiBuLmZyb21QcmltaXRpdmUoTmFOKTtpZihjPT09LTQpcmV0dXJuIG4uZnJvbVByaW1pdGl2ZSgxLzApO2lmKGM9PT0tNSlyZXR1cm4gbi5mcm9tUHJpbWl0aXZlKC0xLzApO2lmKGM9PT0tNilyZXR1cm4gbi5mcm9tUHJpbWl0aXZlKC0wKTtpZihWfHx0eXBlb2YgYyE9XCJudW1iZXJcIil0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGlucHV0XCIpO2lmKGMgaW4gcylyZXR1cm4gc1tjXTtsZXQgaT1vW2NdO2lmKCFpfHx0eXBlb2YgaSE9XCJvYmplY3RcIilzW2NdPW4uZnJvbVByaW1pdGl2ZShpKTtlbHNlIGlmKEFycmF5LmlzQXJyYXkoaSkpaWYodHlwZW9mIGlbMF09PVwic3RyaW5nXCIpe2xldCBkPWlbMF0sYT1lJiZPYmplY3QuaGFzT3duKGUsZCk/ZVtkXTp2b2lkIDA7aWYoYSl7bGV0IHk9aVsxXTtpZih0eXBlb2YgeSE9XCJudW1iZXJcIiYmKHk9by5wdXNoKGlbMV0pLTEpLE9iamVjdC5oYXNPd24ocyx5KSlyZXR1cm4gc1tjXT1hKHNbeV0pO2lmKHA/PyhwPW5ldyBTZXQpLHAuaGFzKHkpKXRocm93IG5ldyBFcnJvcihcIkludmFsaWQgY2lyY3VsYXIgcmVmZXJlbmNlXCIpO3JldHVybiBwLmFkZCh5KSxzW2NdPWEoZyh5KSkscC5kZWxldGUoeSksc1tjXX1zd2l0Y2goZCl7Y2FzZVwiRGF0ZVwiOnNbY109bi5mcm9tSVNPU3RyaW5nKGlbMV0pO2JyZWFrO2Nhc2VcIlNldFwiOmxldCB5PW4uY3JlYXRlU2V0KCk7c1tjXT15O2ZvcihsZXQgbD0xO2w8aS5sZW5ndGg7bCs9MSluLmFkZFZhbHVlKHksZyhpW2xdKSk7YnJlYWs7Y2FzZVwiTWFwXCI6bGV0IEU9bi5jcmVhdGVNYXAoKTtzW2NdPUU7Zm9yKGxldCBsPTE7bDxpLmxlbmd0aDtsKz0yKW4uYWRkRW50cnkoRSxnKGlbbF0pLGcoaVtsKzFdKSk7YnJlYWs7Y2FzZVwiUmVnRXhwXCI6c1tjXT1uLmZyb21SZWdFeHBJbmZvKGlbMV0saVsyXSk7YnJlYWs7Y2FzZVwiT2JqZWN0XCI6e2xldCBsPWlbMV07aWYodHlwZW9mIG9bbF09PVwib2JqZWN0XCImJm9bbF1bMF0hPT1cIkJpZ0ludFwiKXRocm93IG5ldyBFcnJvcihcIkludmFsaWQgaW5wdXRcIik7c1tjXT1uLmJveChnKGwpKTticmVha31jYXNlXCJCaWdJbnRcIjpzW2NdPW4uZnJvbVByaW1pdGl2ZShCaWdJbnQoaVsxXSkpO2JyZWFrO2Nhc2VcIm51bGxcIjpsZXQgQT1uLmNyZWF0ZU51bGxQcm90b3R5cGVPYmplY3QoKTtzW2NdPUE7Zm9yKGxldCBsPTE7bDxpLmxlbmd0aDtsKz0yKXtpZihpW2xdPT09XCJfX3Byb3RvX19cIil0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgcGFyc2UgYW4gb2JqZWN0IHdpdGggYSBcXGBfX3Byb3RvX19cXGAgcHJvcGVydHlcIik7bi5zZXQoQSxpW2xdLGcoaVtsKzFdKSl9YnJlYWs7Y2FzZVwiSW50OEFycmF5XCI6Y2FzZVwiVWludDhBcnJheVwiOmNhc2VcIlVpbnQ4Q2xhbXBlZEFycmF5XCI6Y2FzZVwiSW50MTZBcnJheVwiOmNhc2VcIlVpbnQxNkFycmF5XCI6Y2FzZVwiRmxvYXQxNkFycmF5XCI6Y2FzZVwiSW50MzJBcnJheVwiOmNhc2VcIlVpbnQzMkFycmF5XCI6Y2FzZVwiRmxvYXQzMkFycmF5XCI6Y2FzZVwiRmxvYXQ2NEFycmF5XCI6Y2FzZVwiQmlnSW50NjRBcnJheVwiOmNhc2VcIkJpZ1VpbnQ2NEFycmF5XCI6Y2FzZVwiRGF0YVZpZXdcIjp7aWYob1tpWzFdXVswXSE9PVwiQXJyYXlCdWZmZXJcIil0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGRhdGFcIik7bGV0IGw9ZyhpWzFdKTtzW2NdPW4uZnJvbVZpZXdJbmZvKGQsbCxpWzJdLGlbM10pO2JyZWFrfWNhc2VcIkFycmF5QnVmZmVyXCI6e2xldCBsPWlbMV07aWYodHlwZW9mIGwhPVwic3RyaW5nXCIpdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBBcnJheUJ1ZmZlciBlbmNvZGluZ1wiKTtzW2NdPW4uZnJvbUFycmF5QnVmZmVyKGJyKGwpKTticmVha31jYXNlXCJVUkxcIjpjYXNlXCJVUkxTZWFyY2hQYXJhbXNcIjpjYXNlXCJUZW1wb3JhbC5EdXJhdGlvblwiOmNhc2VcIlRlbXBvcmFsLkluc3RhbnRcIjpjYXNlXCJUZW1wb3JhbC5QbGFpbkRhdGVcIjpjYXNlXCJUZW1wb3JhbC5QbGFpblRpbWVcIjpjYXNlXCJUZW1wb3JhbC5QbGFpbkRhdGVUaW1lXCI6Y2FzZVwiVGVtcG9yYWwuUGxhaW5Nb250aERheVwiOmNhc2VcIlRlbXBvcmFsLlBsYWluWWVhck1vbnRoXCI6Y2FzZVwiVGVtcG9yYWwuWm9uZWREYXRlVGltZVwiOntzW2NdPW4uZnJvbVN0cmluZ1ZhbHVlKGQsaVsxXSk7YnJlYWt9ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoXFxgVW5rbm93biB0eXBlIFxcJHtkfVxcYCl9fWVsc2UgaWYoaVswXT09PS03KXtsZXQgZD1pWzFdO2lmKCF1cihkKSl0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGlucHV0XCIpO2xldCBhPW4uY3JlYXRlU3BhcnNlQXJyYXkoZCk7c1tjXT1hO2ZvcihsZXQgeT0yO3k8aS5sZW5ndGg7eSs9Mil7bGV0IEU9aVt5XTtpZighWShFKXx8RT49ZCl0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGlucHV0XCIpO24uc2V0KGEsRSxnKGlbeSsxXSkpfX1lbHNle2xldCBkPW4uY3JlYXRlQXJyYXkoaS5sZW5ndGgpO3NbY109ZDtmb3IobGV0IGE9MDthPGkubGVuZ3RoO2ErPTEpe2xldCB5PWlbYV07eSE9PS0yJiZuLnNldChkLGEsZyh5KSl9fWVsc2V7bGV0IGQ9bi5jcmVhdGVPYmplY3QoKTtzW2NdPWQ7Zm9yKGxldCBhIG9mIE9iamVjdC5rZXlzKGkpKXtpZihhPT09XCJfX3Byb3RvX19cIil0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgcGFyc2UgYW4gb2JqZWN0IHdpdGggYSBcXGBfX3Byb3RvX19cXGAgcHJvcGVydHlcIik7bi5zZXQoZCxhLGcoaVthXSkpfX1yZXR1cm4gc1tjXX1yZXR1cm4gZygwKX1mdW5jdGlvbiBIKHIsZSx0KXtsZXQgbj1hZSghMSxyLGUsdCk7cmV0dXJuIHR5cGVvZiBuPT1cInN0cmluZ1wiP246XFxgW1xcJHtuLmpvaW4oXCIsXCIpfV1cXGB9ZnVuY3Rpb24gYWUocixlLHQsbil7bGV0IG89VyhFcixuPy5vcGVyYXRpb25zKSxzPVtdLHA9bmV3IE1hcCxnPVtdO2lmKHQpZm9yKGxldCBhIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHQpKWcucHVzaCh7a2V5OmEsZm46dFthXX0pO2xldCBjPVtdLFY9MDtmdW5jdGlvbiBpKGEseSl7bGV0IEU9by50eXBlT2YoYSk7aWYoRT09PVwidW5kZWZpbmVkXCIpcmV0dXJuLTE7bGV0IEE7aWYoRT09PVwibnVtYmVyXCIpe2lmKEE9by50b1ByaW1pdGl2ZShhKSxOdW1iZXIuaXNOYU4oQSkpcmV0dXJuLTM7aWYoQT09PTEvMClyZXR1cm4tNDtpZihBPT09LTEvMClyZXR1cm4tNTtpZihBPT09MCYmMS9BPDApcmV0dXJuLTZ9bGV0IGw9by5pZGVudGlmeShhKTtpZihwLmhhcyhsKSlyZXR1cm4gcC5nZXQobCk7eT8/KHk9VisrKSxwLnNldChsLHkpO2ZvcihsZXR7a2V5OlQsZm46a31vZiBnKXtsZXQgTT1rKGEpO2lmKE0pcmV0dXJuIHNbeV09XFxgW1wiXFwke1R9XCIsXFwke2koTSl9XVxcYCx5fWlmKEU9PT1cImZ1bmN0aW9uXCIpdGhyb3cgbmV3IFMoXCJDYW5ub3Qgc3RyaW5naWZ5IGEgZnVuY3Rpb25cIixjLGEsZSk7aWYoRT09PVwic3ltYm9sXCIpdGhyb3cgbmV3IFMoXCJDYW5ub3Qgc3RyaW5naWZ5IGEgU3ltYm9sIHByaW1pdGl2ZVwiLGMsYSxlKTtsZXQgZj1cIlwiO2lmKEUhPT1cIm9iamVjdFwiKWY9d3IoRT09PVwibnVtYmVyXCI/QTpvLnRvUHJpbWl0aXZlKGEpKTtlbHNlIGlmKG8uaXNUaGVuYWJsZShhKSl7aWYoIXIpdGhyb3cgbmV3IFMoXCJDYW5ub3Qgc3RyaW5naWZ5IGEgUHJvbWlzZSBvciB0aGVuYWJsZSBcXFxcdTIwMTQgdXNlIHN0cmluZ2lmeUFzeW5jIGluc3RlYWRcIixjLGEsZSk7Zj1vLnRvUHJvbWlzZShhKS50aGVuKFQ9PntsZXQgaz1pKFQseSk7azwwJiYoc1t5XT1rKX0pfWVsc2V7bGV0IFQ9by50YWdPZihhKTtzd2l0Y2goVCl7Y2FzZVwiTnVtYmVyXCI6Y2FzZVwiU3RyaW5nXCI6Y2FzZVwiQm9vbGVhblwiOmNhc2VcIkJpZ0ludFwiOmY9XFxgW1wiT2JqZWN0XCIsXFwke2koby51bmJveChhKSl9XVxcYDticmVhaztjYXNlXCJEYXRlXCI6Zj1cXGBbXCJEYXRlXCIsXCJcXCR7by50b0lTT1N0cmluZyhhKX1cIl1cXGA7YnJlYWs7Y2FzZVwiVVJMXCI6Zj1cXGBbXCJVUkxcIixcXCR7SShvLnRvU3RyaW5nVmFsdWUoYSkpfV1cXGA7YnJlYWs7Y2FzZVwiVVJMU2VhcmNoUGFyYW1zXCI6Zj1cXGBbXCJVUkxTZWFyY2hQYXJhbXNcIixcXCR7SShvLnRvU3RyaW5nVmFsdWUoYSkpfV1cXGA7YnJlYWs7Y2FzZVwiUmVnRXhwXCI6bGV0e3NvdXJjZTprLGZsYWdzOk19PW8ucmVnRXhwSW5mbyhhKTtmPU0/XFxgW1wiUmVnRXhwXCIsXFwke0koayl9LFwiXFwke019XCJdXFxgOlxcYFtcIlJlZ0V4cFwiLFxcJHtJKGspfV1cXGA7YnJlYWs7Y2FzZVwiQXJyYXlcIjp7bGV0IHU9ITEsYj1vLmxlbmd0aE9mKGEpO2Y9XCJbXCI7Zm9yKGxldCBtPTA7bTxiO20rPTEpaWYobT4wJiYoZis9XCIsXCIpLG8uaGFzT3duKGEsbSkpYy5wdXNoKFxcYFtcXCR7bX1dXFxgKSxmKz1pKG8uZ2V0KGEsbSkpLGMucG9wKCk7ZWxzZSBpZih1KWYrPS0yO2Vsc2V7bGV0IHg9by5pbmRpY2VzT2YoYSksbnI9eC5sZW5ndGgsb3I9U3RyaW5nKGIpLmxlbmd0aCxEcj0oYi1ucikqMyxVcj00K29yK25yKihvcisxKTtpZihEcj5Vcil7Zj1cIltcIistNytcIixcIitiO2ZvcihsZXQgej0wO3o8eC5sZW5ndGg7eisrKXtsZXQgJD14W3pdO2MucHVzaChcXGBbXFwkeyR9XVxcYCksZis9XCIsXCIrJCtcIixcIitpKG8uZ2V0KGEsJCkpLGMucG9wKCl9YnJlYWt9ZWxzZSB1PSEwLGYrPS0yfWYrPVwiXVwiO2JyZWFrfWNhc2VcIlNldFwiOmY9J1tcIlNldFwiJztmb3IobGV0IHUgb2Ygby52YWx1ZXNPZihhKSlmKz1cXGAsXFwke2kodSl9XFxgO2YrPVwiXVwiO2JyZWFrO2Nhc2VcIk1hcFwiOmY9J1tcIk1hcFwiJztmb3IobGV0W3UsYl1vZiBvLmVudHJpZXNPZihhKSl7bGV0IG09by50eXBlT2YodSkseD1tIT09XCJvYmplY3RcIiYmbSE9PVwiZnVuY3Rpb25cIiYmbSE9PVwic3ltYm9sXCI7Yy5wdXNoKFxcYC5nZXQoXFwke3g/d3Ioby50b1ByaW1pdGl2ZSh1KSk6XCIuLi5cIn0pXFxgKSxmKz1cXGAsXFwke2kodSl9LFxcJHtpKGIpfVxcYCxjLnBvcCgpfWYrPVwiXVwiO2JyZWFrO2Nhc2VcIkludDhBcnJheVwiOmNhc2VcIlVpbnQ4QXJyYXlcIjpjYXNlXCJVaW50OENsYW1wZWRBcnJheVwiOmNhc2VcIkludDE2QXJyYXlcIjpjYXNlXCJVaW50MTZBcnJheVwiOmNhc2VcIkZsb2F0MTZBcnJheVwiOmNhc2VcIkludDMyQXJyYXlcIjpjYXNlXCJVaW50MzJBcnJheVwiOmNhc2VcIkZsb2F0MzJBcnJheVwiOmNhc2VcIkZsb2F0NjRBcnJheVwiOmNhc2VcIkJpZ0ludDY0QXJyYXlcIjpjYXNlXCJCaWdVaW50NjRBcnJheVwiOntsZXQgdT1vLnZpZXdJbmZvKGEpO2Y9J1tcIicrVCsnXCIsJytpKHUuYnVmZmVyKSx1LmJ5dGVMZW5ndGghPT11LmJ1ZmZlckJ5dGVMZW5ndGgmJihmKz1cXGAsXFwke3UuYnl0ZU9mZnNldH0sXFwke3UubGVuZ3RofVxcYCksZis9XCJdXCI7YnJlYWt9Y2FzZVwiRGF0YVZpZXdcIjp7bGV0IHU9by52aWV3SW5mbyhhKTtmPSdbXCInK1QrJ1wiLCcraSh1LmJ1ZmZlciksdS5ieXRlTGVuZ3RoIT09dS5idWZmZXJCeXRlTGVuZ3RoJiYoZis9XFxgLFxcJHt1LmJ5dGVPZmZzZXR9LFxcJHt1LmJ5dGVMZW5ndGh9XFxgKSxmKz1cIl1cIjticmVha31jYXNlXCJBcnJheUJ1ZmZlclwiOntmPVxcYFtcIkFycmF5QnVmZmVyXCIsXCJcXCR7bXIoby50b0FycmF5QnVmZmVyKGEpKX1cIl1cXGA7YnJlYWt9Y2FzZVwiVGVtcG9yYWwuRHVyYXRpb25cIjpjYXNlXCJUZW1wb3JhbC5JbnN0YW50XCI6Y2FzZVwiVGVtcG9yYWwuUGxhaW5EYXRlXCI6Y2FzZVwiVGVtcG9yYWwuUGxhaW5UaW1lXCI6Y2FzZVwiVGVtcG9yYWwuUGxhaW5EYXRlVGltZVwiOmNhc2VcIlRlbXBvcmFsLlBsYWluTW9udGhEYXlcIjpjYXNlXCJUZW1wb3JhbC5QbGFpblllYXJNb250aFwiOmNhc2VcIlRlbXBvcmFsLlpvbmVkRGF0ZVRpbWVcIjpmPVxcYFtcIlxcJHtUfVwiLFxcJHtJKG8udG9TdHJpbmdWYWx1ZShhKSl9XVxcYDticmVhaztkZWZhdWx0OntsZXQgdT1vLnNoYXBlT2YoYSk7aWYodS5raW5kPT09XCJub3QtcGxhaW5cIil0aHJvdyBuZXcgUyhcIkNhbm5vdCBzdHJpbmdpZnkgYXJiaXRyYXJ5IG5vbi1QT0pPc1wiLGMsYSxlKTtpZih1LmtpbmQ9PT1cInN5bWJvbC1rZXlzXCIpdGhyb3cgbmV3IFMoXCJDYW5ub3Qgc3RyaW5naWZ5IFBPSk9zIHdpdGggc3ltYm9saWMga2V5c1wiLGMsYSxlKTtpZih1LmtpbmQ9PT1cIm51bGwtcHJvdG9cIil7Zj0nW1wibnVsbFwiJztmb3IobGV0IGIgb2YgdS5rZXlzKXtpZihiPT09XCJfX3Byb3RvX19cIil0aHJvdyBuZXcgUyhcIkNhbm5vdCBzdHJpbmdpZnkgb2JqZWN0cyB3aXRoIF9fcHJvdG9fXyBrZXlzXCIsYyxhLGUpO2MucHVzaChaKGIpKSxmKz1cXGAsXFwke0koYil9LFxcJHtpKG8uZ2V0KGEsYikpfVxcYCxjLnBvcCgpfWYrPVwiXVwifWVsc2V7Zj1cIntcIjtsZXQgYj0hMTtmb3IobGV0IG0gb2YgdS5rZXlzKXtpZihtPT09XCJfX3Byb3RvX19cIil0aHJvdyBuZXcgUyhcIkNhbm5vdCBzdHJpbmdpZnkgb2JqZWN0cyB3aXRoIF9fcHJvdG9fXyBrZXlzXCIsYyxhLGUpO2ImJihmKz1cIixcIiksYj0hMCxjLnB1c2goWihtKSksZis9XFxgXFwke0kobSl9OlxcJHtpKG8uZ2V0KGEsbSkpfVxcYCxjLnBvcCgpfWYrPVwifVwifX19fXJldHVybiBzW3ldPWYseX1sZXQgZD1pKGUpO3JldHVybiBkPDA/XFxgXFwke2R9XFxgOnN9ZnVuY3Rpb24gd3Iocil7bGV0IGU9dHlwZW9mIHI7cmV0dXJuIGU9PT1cInN0cmluZ1wiP0kocik6cj09PXZvaWQgMD8oLTEpLnRvU3RyaW5nKCk6cj09PTAmJjEvcjwwPygtNikudG9TdHJpbmcoKTplPT09XCJiaWdpbnRcIj9cXGBbXCJCaWdJbnRcIixcIlxcJHtyfVwiXVxcYDpTdHJpbmcocil9dmFyIFg9U3ltYm9sLmZvcihcIndvcmtmbG93LXNlcmlhbGl6ZVwiKSxxPVN5bWJvbC5mb3IoXCJ3b3JrZmxvdy1kZXNlcmlhbGl6ZVwiKTt2YXIgSj1TeW1ib2wuZm9yKFwid29ya2Zsb3ctY2xhc3MtcmVnaXN0cnlcIik7ZnVuY3Rpb24gaWUocj1nbG9iYWxUaGlzKXtsZXQgZT1yLHQ9ZVtKXTtyZXR1cm4gdHx8KHQ9bmV3IE1hcCxlW0pdPXQpLHR9ZnVuY3Rpb24gUShyLGUpe3JldHVybiBpZShlKS5nZXQocil9ZnVuY3Rpb24gUCgpe3JldHVybntDbGFzczpyPT57aWYodHlwZW9mIHIhPVwiZnVuY3Rpb25cIilyZXR1cm4hMTtsZXQgZT1yLmNsYXNzSWQ7cmV0dXJuIHR5cGVvZiBlIT1cInN0cmluZ1wiPyExOntjbGFzc0lkOmV9fSxJbnN0YW5jZTpyPT57aWYocj09PW51bGx8fHR5cGVvZiByIT1cIm9iamVjdFwiKXJldHVybiExO2xldCBlPXIuY29uc3RydWN0b3I7aWYoIWV8fHR5cGVvZiBlIT1cImZ1bmN0aW9uXCIpcmV0dXJuITE7bGV0IHQ9ZVtYXTtpZih0eXBlb2YgdCE9XCJmdW5jdGlvblwiKXJldHVybiExO2xldCBuPWUuY2xhc3NJZDtpZih0eXBlb2YgbiE9XCJzdHJpbmdcIil0aHJvdyBuZXcgRXJyb3IoXFxgQ2xhc3MgXCJcXCR7ZS5uYW1lfVwiIHdpdGggXFwke1N0cmluZyhYKX0gbXVzdCBoYXZlIGEgc3RhdGljIFwiY2xhc3NJZFwiIHByb3BlcnR5LlxcYCk7bGV0IG89dC5jYWxsKGUscik7cmV0dXJue2NsYXNzSWQ6bixkYXRhOm99fX19ZnVuY3Rpb24gQihyPWdsb2JhbFRoaXMpe3JldHVybntDbGFzczplPT57bGV0IHQ9ZS5jbGFzc0lkLG49USh0LHIpO2lmKCFuKXRocm93IG5ldyBFcnJvcihcXGBDbGFzcyBcIlxcJHt0fVwiIG5vdCBmb3VuZC4gTWFrZSBzdXJlIHRoZSBjbGFzcyBpcyByZWdpc3RlcmVkIHdpdGggcmVnaXN0ZXJTZXJpYWxpemF0aW9uQ2xhc3MuXFxgKTtyZXR1cm4gbn0sSW5zdGFuY2U6ZT0+e2xldCB0PWUuY2xhc3NJZCxuPWUuZGF0YSxvPVEodCxyKTtpZighbyl0aHJvdyBuZXcgRXJyb3IoXFxgQ2xhc3MgXCJcXCR7dH1cIiBub3QgZm91bmQuIE1ha2Ugc3VyZSB0aGUgY2xhc3MgaXMgcmVnaXN0ZXJlZCB3aXRoIHJlZ2lzdGVyU2VyaWFsaXphdGlvbkNsYXNzLlxcYCk7bGV0IHM9b1txXTtpZih0eXBlb2YgcyE9XCJmdW5jdGlvblwiKXRocm93IG5ldyBFcnJvcihcXGBDbGFzcyBcIlxcJHt0fVwiIGRvZXMgbm90IGhhdmUgYSBzdGF0aWMgXFwke1N0cmluZyhxKX0gbWV0aG9kLlxcYCk7cmV0dXJuIHMuY2FsbChvLG4pfX19ZnVuY3Rpb24gT3IocixlLHQpe2lmKHQ9PT0wKXJldHVyblwiLlwiO2xldCBuPW5ldyBVaW50OEFycmF5KHIsZSx0KSxvPVwiXCI7Zm9yKGxldCBzPTA7czxuLmxlbmd0aDtzKyspbys9U3RyaW5nLmZyb21DaGFyQ29kZShuW3NdKTtyZXR1cm4gYnRvYShvKX1mdW5jdGlvbiBSKHIpe3JldHVybiBPcihyLmJ1ZmZlcixyLmJ5dGVPZmZzZXQsci5ieXRlTGVuZ3RoKX1mdW5jdGlvbiBfKHIpe2lmKHI9PT1cIi5cIilyZXR1cm4gbmV3IEFycmF5QnVmZmVyKDApO2xldCBlPWF0b2IociksdD1uZXcgVWludDhBcnJheShlLmxlbmd0aCk7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspdFtuXT1lLmNoYXJDb2RlQXQobik7cmV0dXJuIHQuYnVmZmVyfWZ1bmN0aW9uIGgocil7cmV0dXJuIGU9PntpZighKGUgaW5zdGFuY2VvZiBFcnJvcil8fGUubmFtZSE9PXIpcmV0dXJuITE7bGV0IHQ9e21lc3NhZ2U6ZS5tZXNzYWdlLHN0YWNrOmUuc3RhY2t9O3JldHVyblwiY2F1c2VcImluIGUmJih0LmNhdXNlPWUuY2F1c2UpLHR9fWZ1bmN0aW9uIE4ocil7cmV0dXJuIGU9PntsZXQgdD1nbG9iYWxUaGlzW3JdLG47cmV0dXJuIHR5cGVvZiB0PT1cImZ1bmN0aW9uXCI/bj1uZXcgdChlLm1lc3NhZ2UpOihuPW5ldyBFcnJvcihlLm1lc3NhZ2UpLG4ubmFtZT1yKSxlLnN0YWNrIT09dm9pZCAwJiYobi5zdGFjaz1lLnN0YWNrKSxcImNhdXNlXCJpbiBlJiYobi5jYXVzZT1lLmNhdXNlKSxufX1mdW5jdGlvbiBqKCl7cmV0dXJue0FycmF5QnVmZmVyOnI9PnIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciYmT3IociwwLHIuYnl0ZUxlbmd0aCksQmlnSW50OnI9PnR5cGVvZiByPT1cImJpZ2ludFwiJiZyLnRvU3RyaW5nKCksQmlnSW50NjRBcnJheTpyPT5yIGluc3RhbmNlb2YgQmlnSW50NjRBcnJheSYmUihyKSxCaWdVaW50NjRBcnJheTpyPT5yIGluc3RhbmNlb2YgQmlnVWludDY0QXJyYXkmJlIociksRGF0ZTpyPT5yIGluc3RhbmNlb2YgRGF0ZT8hTnVtYmVyLmlzTmFOKHIuZ2V0RGF0ZSgpKT9yLnRvSVNPU3RyaW5nKCk6XCIuXCI6ITEsRE9NRXhjZXB0aW9uOnI9PntpZighKHIgaW5zdGFuY2VvZiBET01FeGNlcHRpb24pKXJldHVybiExO2xldCBlPXttZXNzYWdlOnIubWVzc2FnZSxuYW1lOnIubmFtZSxzdGFjazpyLnN0YWNrfTtyZXR1cm5cImNhdXNlXCJpbiByJiYoZS5jYXVzZT1yLmNhdXNlKSxlfSxBZ2dyZWdhdGVFcnJvcjpyPT57aWYoIShyIGluc3RhbmNlb2YgRXJyb3IpfHxyLm5hbWUhPT1cIkFnZ3JlZ2F0ZUVycm9yXCIpcmV0dXJuITE7bGV0IGU9e21lc3NhZ2U6ci5tZXNzYWdlLHN0YWNrOnIuc3RhY2ssZXJyb3JzOnIuZXJyb3JzfTtyZXR1cm5cImNhdXNlXCJpbiByJiYoZS5jYXVzZT1yLmNhdXNlKSxlfSxFdmFsRXJyb3I6aChcIkV2YWxFcnJvclwiKSxGYXRhbEVycm9yOmgoXCJGYXRhbEVycm9yXCIpLEhvb2tDb25mbGljdEVycm9yOnI9PntpZighKHIgaW5zdGFuY2VvZiBFcnJvcil8fHIubmFtZSE9PVwiSG9va0NvbmZsaWN0RXJyb3JcIilyZXR1cm4hMTtsZXQgZT17bWVzc2FnZTpyLm1lc3NhZ2Usc3RhY2s6ci5zdGFjayx0b2tlbjpyLnRva2VufTtyZXR1cm4gci5jb25mbGljdGluZ1J1bklkIT09dm9pZCAwJiYoZS5jb25mbGljdGluZ1J1bklkPXIuY29uZmxpY3RpbmdSdW5JZCksXCJjYXVzZVwiaW4gciYmKGUuY2F1c2U9ci5jYXVzZSksZX0sUmFuZ2VFcnJvcjpoKFwiUmFuZ2VFcnJvclwiKSxSZWZlcmVuY2VFcnJvcjpoKFwiUmVmZXJlbmNlRXJyb3JcIiksUmV0cnlhYmxlRXJyb3I6cj0+e2lmKCEociBpbnN0YW5jZW9mIEVycm9yKXx8ci5uYW1lIT09XCJSZXRyeWFibGVFcnJvclwiKXJldHVybiExO2xldCBlPXIucmV0cnlBZnRlcix0O2lmKGUmJnR5cGVvZiBlPT1cIm9iamVjdFwiJiZ0eXBlb2YgZS5nZXRUaW1lPT1cImZ1bmN0aW9uXCIpe2xldCBvPWUuZ2V0VGltZSgpO3Q9TnVtYmVyLmlzTmFOKG8pP0RhdGUubm93KCkrMWUzOm99ZWxzZSBpZih0eXBlb2YgZT09XCJzdHJpbmdcInx8dHlwZW9mIGU9PVwibnVtYmVyXCIpe2xldCBvPW5ldyBEYXRlKGUpLmdldFRpbWUoKTt0PU51bWJlci5pc05hTihvKT9EYXRlLm5vdygpKzFlMzpvfWVsc2UgdD1EYXRlLm5vdygpKzFlMztsZXQgbj17bWVzc2FnZTpyLm1lc3NhZ2Usc3RhY2s6ci5zdGFjayxyZXRyeUFmdGVyOnR9O3JldHVyblwiY2F1c2VcImluIHImJihuLmNhdXNlPXIuY2F1c2UpLG59LFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3I6cj0+e2lmKCEociBpbnN0YW5jZW9mIEVycm9yKXx8ci5uYW1lIT09XCJSdW50aW1lRGVjcnlwdGlvbkVycm9yXCIpcmV0dXJuITE7bGV0IGU9e21lc3NhZ2U6ci5tZXNzYWdlLHN0YWNrOnIuc3RhY2t9LHQ9ci5jb250ZXh0O3JldHVybiB0IT09dm9pZCAwJiYoZS5jb250ZXh0PXQpLFwiY2F1c2VcImluIHImJihlLmNhdXNlPXIuY2F1c2UpLGV9LFN5bnRheEVycm9yOmgoXCJTeW50YXhFcnJvclwiKSxUeXBlRXJyb3I6aChcIlR5cGVFcnJvclwiKSxVUklFcnJvcjpoKFwiVVJJRXJyb3JcIiksRXJyb3I6cj0+e2lmKCEociBpbnN0YW5jZW9mIEVycm9yKSlyZXR1cm4hMTtsZXQgZT17bmFtZTpyLm5hbWUsbWVzc2FnZTpyLm1lc3NhZ2Usc3RhY2s6ci5zdGFja307cmV0dXJuXCJjYXVzZVwiaW4gciYmKGUuY2F1c2U9ci5jYXVzZSksZX0sRmxvYXQzMkFycmF5OnI9PnIgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkmJlIociksRmxvYXQ2NEFycmF5OnI9PnIgaW5zdGFuY2VvZiBGbG9hdDY0QXJyYXkmJlIociksSW50OEFycmF5OnI9PnIgaW5zdGFuY2VvZiBJbnQ4QXJyYXkmJlIociksSW50MTZBcnJheTpyPT5yIGluc3RhbmNlb2YgSW50MTZBcnJheSYmUihyKSxJbnQzMkFycmF5OnI9PnIgaW5zdGFuY2VvZiBJbnQzMkFycmF5JiZSKHIpLE1hcDpyPT5yIGluc3RhbmNlb2YgTWFwJiZBcnJheS5mcm9tKHIpLFJlZ0V4cDpyPT5yIGluc3RhbmNlb2YgUmVnRXhwJiZ7c291cmNlOnIuc291cmNlLGZsYWdzOnIuZmxhZ3N9LEhlYWRlcnM6cj0+e2xldCBlPWdsb2JhbFRoaXMuSGVhZGVycztyZXR1cm4hZXx8IShyIGluc3RhbmNlb2YgZSk/ITE6QXJyYXkuZnJvbShyKX0sUmVxdWVzdDpyPT57bGV0IGU9Z2xvYmFsVGhpcy5SZXF1ZXN0O2lmKCFlfHwhKHIgaW5zdGFuY2VvZiBlKSYmdHlwZW9mIHI/Lmpzb24hPVwiZnVuY3Rpb25cInx8dHlwZW9mIHI/Lm1ldGhvZCE9XCJzdHJpbmdcIilyZXR1cm4hMTtsZXQgdD17bWV0aG9kOnIubWV0aG9kLHVybDpyLnVybCxoZWFkZXJzOnIuaGVhZGVycyxib2R5OnIuYm9keSxkdXBsZXg6ci5kdXBsZXh9LG49cltTeW1ib2wuZm9yKFwiV0VCSE9PS19SRVNQT05TRV9XUklUQUJMRVwiKV07cmV0dXJuIG4mJih0LnJlc3BvbnNlV3JpdGFibGU9biksdH0sUmVzcG9uc2U6cj0+e2xldCBlPWdsb2JhbFRoaXMuUmVzcG9uc2U7cmV0dXJuIWV8fCEociBpbnN0YW5jZW9mIGUpJiZ0eXBlb2Ygcj8uY2xvbmUhPVwiZnVuY3Rpb25cInx8dHlwZW9mIHI/LnN0YXR1cyE9XCJudW1iZXJcIj8hMTp7dHlwZTpyLnR5cGUsdXJsOnIudXJsLHN0YXR1czpyLnN0YXR1cyxzdGF0dXNUZXh0OnIuc3RhdHVzVGV4dCxoZWFkZXJzOnIuaGVhZGVycyxib2R5OnIuYm9keSxyZWRpcmVjdGVkOnIucmVkaXJlY3RlZH19LFJlYWRhYmxlU3RyZWFtOihyPT57aWYocj09bnVsbClyZXR1cm4hMTtsZXQgZT1nbG9iYWxUaGlzLlJlYWRhYmxlU3RyZWFtO2lmKCFlfHwhKHIgaW5zdGFuY2VvZiBlfHxPYmplY3QuZ2V0UHJvdG90eXBlT2Yocik9PT1lLnByb3RvdHlwZSkpcmV0dXJuITE7bGV0IHQ9cltTeW1ib2wuZm9yKFwiQk9EWV9JTklUXCIpXTtpZih0IT09dm9pZCAwKXJldHVybntib2R5SW5pdDp0fTtsZXQgbj1yW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19TVFJFQU1fTkFNRVwiKV07aWYobil7bGV0IG89e25hbWU6bn0scz1yW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19TVFJFQU1fVFlQRVwiKV07cyYmKG8udHlwZT1zKTtsZXQgcD1yW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19TVFJFQU1fRlJBTUlOR1wiKV07cmV0dXJuIHAmJihvLmZyYW1pbmc9cCksb31yZXR1cm57bmFtZTpcIl9fZW1wdHlcIn19KSxXcml0YWJsZVN0cmVhbToocj0+e2lmKHI9PW51bGwpcmV0dXJuITE7bGV0IGU9Z2xvYmFsVGhpcy5Xcml0YWJsZVN0cmVhbTtpZighZXx8IShyIGluc3RhbmNlb2YgZXx8T2JqZWN0LmdldFByb3RvdHlwZU9mKHIpPT09ZS5wcm90b3R5cGUpKXJldHVybiExO2xldCBuPXtuYW1lOnJbU3ltYm9sLmZvcihcIldPUktGTE9XX1NUUkVBTV9OQU1FXCIpXXx8XCJfX2VtcHR5XCJ9LG89cltTeW1ib2wuZm9yKFwiV09SS0ZMT1dfU1RSRUFNX1NFUlZFUl9SVU5fSURcIildO3R5cGVvZiBvPT1cInN0cmluZ1wiJiYobi5ydW5JZD1vKTtsZXQgcz1yW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19TVFJFQU1fU0VSVkVSX0RFUExPWU1FTlRfSURcIildO3JldHVybiB0eXBlb2Ygcz09XCJzdHJpbmdcIiYmKG4uZGVwbG95bWVudElkPXMpLG59KSxTZXQ6cj0+ciBpbnN0YW5jZW9mIFNldCYmQXJyYXkuZnJvbShyKSxVUkw6cj0+ciBpbnN0YW5jZW9mIFVSTCYmci5ocmVmLFdvcmtmbG93RnVuY3Rpb246cj0+e2lmKHR5cGVvZiByIT1cImZ1bmN0aW9uXCIpcmV0dXJuITE7bGV0IGU9ci53b3JrZmxvd0lkO3JldHVybiB0eXBlb2YgZSE9XCJzdHJpbmdcIj8hMTp7d29ya2Zsb3dJZDplfX0sVVJMU2VhcmNoUGFyYW1zOnI9PnIgaW5zdGFuY2VvZiBVUkxTZWFyY2hQYXJhbXM/ci5zaXplPT09MD9cIi5cIjpTdHJpbmcocik6ITEsVWludDhBcnJheTpyPT5yIGluc3RhbmNlb2YgVWludDhBcnJheSYmUihyKSxVaW50OENsYW1wZWRBcnJheTpyPT5yIGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXkmJlIociksVWludDE2QXJyYXk6cj0+ciBpbnN0YW5jZW9mIFVpbnQxNkFycmF5JiZSKHIpLFVpbnQzMkFycmF5OnI9PnIgaW5zdGFuY2VvZiBVaW50MzJBcnJheSYmUihyKX19ZnVuY3Rpb24gSygpe3JldHVybntBcnJheUJ1ZmZlcjpyPT5fKHIpLEJpZ0ludDpyPT5CaWdJbnQociksQmlnSW50NjRBcnJheTpyPT5uZXcgQmlnSW50NjRBcnJheShfKHIpKSxCaWdVaW50NjRBcnJheTpyPT5uZXcgQmlnVWludDY0QXJyYXkoXyhyKSksRGF0ZTpyPT5uZXcgRGF0ZShyKSxET01FeGNlcHRpb246cj0+e2xldCBlPW5ldyBET01FeGNlcHRpb24oci5tZXNzYWdlLHIubmFtZSk7cmV0dXJuIHIuc3RhY2shPT12b2lkIDAmJihlLnN0YWNrPXIuc3RhY2spLFwiY2F1c2VcImluIHImJihlLmNhdXNlPXIuY2F1c2UpLGV9LEFnZ3JlZ2F0ZUVycm9yOnI9PntsZXQgZT1uZXcgQWdncmVnYXRlRXJyb3Ioci5lcnJvcnM/P1tdLHIubWVzc2FnZSk7cmV0dXJuIHIuc3RhY2shPT12b2lkIDAmJihlLnN0YWNrPXIuc3RhY2spLFwiY2F1c2VcImluIHImJihlLmNhdXNlPXIuY2F1c2UpLGV9LEV2YWxFcnJvcjpOKFwiRXZhbEVycm9yXCIpLEZhdGFsRXJyb3I6cj0+e2xldCBlPWdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIkB3b3JrZmxvdy9lcnJvcnMvL0ZhdGFsRXJyb3JcIildLHQ7cmV0dXJuIHR5cGVvZiBlPT1cImZ1bmN0aW9uXCI/dD1uZXcgZShyLm1lc3NhZ2UpOih0PW5ldyBFcnJvcihyLm1lc3NhZ2UpLHQubmFtZT1cIkZhdGFsRXJyb3JcIiksci5zdGFjayE9PXZvaWQgMCYmKHQuc3RhY2s9ci5zdGFjayksXCJjYXVzZVwiaW4gciYmKHQuY2F1c2U9ci5jYXVzZSksdH0sSG9va0NvbmZsaWN0RXJyb3I6cj0+e2xldCBlPWdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIkB3b3JrZmxvdy9lcnJvcnMvL0hvb2tDb25mbGljdEVycm9yXCIpXSx0O3JldHVybiB0eXBlb2YgZT09XCJmdW5jdGlvblwiP3Q9bmV3IGUoci50b2tlbixyLmNvbmZsaWN0aW5nUnVuSWQpOih0PW5ldyBFcnJvcihyLm1lc3NhZ2UpLHQubmFtZT1cIkhvb2tDb25mbGljdEVycm9yXCIsdC50b2tlbj1yLnRva2VuLHIuY29uZmxpY3RpbmdSdW5JZCE9PXZvaWQgMCYmKHQuY29uZmxpY3RpbmdSdW5JZD1yLmNvbmZsaWN0aW5nUnVuSWQpKSxyLnN0YWNrIT09dm9pZCAwJiYodC5zdGFjaz1yLnN0YWNrKSxcImNhdXNlXCJpbiByJiYodC5jYXVzZT1yLmNhdXNlKSx0fSxSYW5nZUVycm9yOk4oXCJSYW5nZUVycm9yXCIpLFJlZmVyZW5jZUVycm9yOk4oXCJSZWZlcmVuY2VFcnJvclwiKSxSZXRyeWFibGVFcnJvcjpyPT57bGV0IGU9Z2xvYmFsVGhpc1tTeW1ib2wuZm9yKFwiQHdvcmtmbG93L2Vycm9ycy8vUmV0cnlhYmxlRXJyb3JcIildLHQ9bmV3IERhdGUoci5yZXRyeUFmdGVyKSxuO3JldHVybiB0eXBlb2YgZT09XCJmdW5jdGlvblwiP249bmV3IGUoci5tZXNzYWdlLHtyZXRyeUFmdGVyOnR9KToobj1uZXcgRXJyb3Ioci5tZXNzYWdlKSxuLm5hbWU9XCJSZXRyeWFibGVFcnJvclwiLG4ucmV0cnlBZnRlcj10KSxyLnN0YWNrIT09dm9pZCAwJiYobi5zdGFjaz1yLnN0YWNrKSxcImNhdXNlXCJpbiByJiYobi5jYXVzZT1yLmNhdXNlKSxufSxSdW50aW1lRGVjcnlwdGlvbkVycm9yOnI9PntsZXQgZT1nbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJAd29ya2Zsb3cvZXJyb3JzLy9SdW50aW1lRGVjcnlwdGlvbkVycm9yXCIpXSx0O2lmKHR5cGVvZiBlPT1cImZ1bmN0aW9uXCIpe2xldCBuPXt9O1wiY2F1c2VcImluIHImJihuLmNhdXNlPXIuY2F1c2UpLHIuY29udGV4dCE9PXZvaWQgMCYmKG4uY29udGV4dD1yLmNvbnRleHQpLHQ9bmV3IGUoci5tZXNzYWdlLG4pfWVsc2UgdD1uZXcgRXJyb3Ioci5tZXNzYWdlKSx0Lm5hbWU9XCJSdW50aW1lRGVjcnlwdGlvbkVycm9yXCIsci5jb250ZXh0IT09dm9pZCAwJiYodC5jb250ZXh0PXIuY29udGV4dCksXCJjYXVzZVwiaW4gciYmKHQuY2F1c2U9ci5jYXVzZSk7cmV0dXJuIHIuc3RhY2shPT12b2lkIDAmJih0LnN0YWNrPXIuc3RhY2spLHR9LFN5bnRheEVycm9yOk4oXCJTeW50YXhFcnJvclwiKSxUeXBlRXJyb3I6TihcIlR5cGVFcnJvclwiKSxVUklFcnJvcjpOKFwiVVJJRXJyb3JcIiksRXJyb3I6cj0+e2xldCBlPW5ldyBFcnJvcihyLm1lc3NhZ2UpO3JldHVybiBlLm5hbWU9ci5uYW1lLHIuc3RhY2shPT12b2lkIDAmJihlLnN0YWNrPXIuc3RhY2spLFwiY2F1c2VcImluIHImJihlLmNhdXNlPXIuY2F1c2UpLGV9LEZsb2F0MzJBcnJheTpyPT5uZXcgRmxvYXQzMkFycmF5KF8ocikpLEZsb2F0NjRBcnJheTpyPT5uZXcgRmxvYXQ2NEFycmF5KF8ocikpLEludDhBcnJheTpyPT5uZXcgSW50OEFycmF5KF8ocikpLEludDE2QXJyYXk6cj0+bmV3IEludDE2QXJyYXkoXyhyKSksSW50MzJBcnJheTpyPT5uZXcgSW50MzJBcnJheShfKHIpKSxNYXA6cj0+bmV3IE1hcChyKSxSZWdFeHA6cj0+bmV3IFJlZ0V4cChyLnNvdXJjZSxyLmZsYWdzKSxTZXQ6cj0+bmV3IFNldChyKSxVUkw6cj0+bmV3IFVSTChyKSxXb3JrZmxvd0Z1bmN0aW9uOnI9Pk9iamVjdC5hc3NpZ24oKCk9Pnt0aHJvdyBuZXcgRXJyb3IoXCJXb3JrZmxvdyBmdW5jdGlvbnMgY2Fubm90IGJlIGNhbGxlZCBkaXJlY3RseS4gVXNlIHN0YXJ0KCkgdG8gaW52b2tlIHRoZW0uXCIpfSx7d29ya2Zsb3dJZDpyLndvcmtmbG93SWR9KSxVUkxTZWFyY2hQYXJhbXM6cj0+bmV3IFVSTFNlYXJjaFBhcmFtcyhyPT09XCIuXCI/XCJcIjpyKSxVaW50OEFycmF5OnI9Pm5ldyBVaW50OEFycmF5KF8ocikpLFVpbnQ4Q2xhbXBlZEFycmF5OnI9Pm5ldyBVaW50OENsYW1wZWRBcnJheShfKHIpKSxVaW50MTZBcnJheTpyPT5uZXcgVWludDE2QXJyYXkoXyhyKSksVWludDMyQXJyYXk6cj0+bmV3IFVpbnQzMkFycmF5KF8ocikpLEhlYWRlcnM6cj0+bmV3IGdsb2JhbFRoaXMuSGVhZGVycyhyKSxSZXF1ZXN0OnI9PntsZXQgZT1nbG9iYWxUaGlzLlJlcXVlc3Q7cmV0dXJuIGUmJihyLmpzb249ZS5wcm90b3R5cGUuanNvbixyLnRleHQ9ZS5wcm90b3R5cGUudGV4dCxyLmFycmF5QnVmZmVyPWUucHJvdG90eXBlLmFycmF5QnVmZmVyKSxyLnJlc3BvbnNlV3JpdGFibGUmJihyW1N5bWJvbC5mb3IoXCJXRUJIT09LX1JFU1BPTlNFX1dSSVRBQkxFXCIpXT1yLnJlc3BvbnNlV3JpdGFibGUpLHJ9LFJlc3BvbnNlOnI9PntsZXQgZT1nbG9iYWxUaGlzLlJlc3BvbnNlO3JldHVybiBlJiYoci5qc29uPWUucHJvdG90eXBlLmpzb24sci50ZXh0PWUucHJvdG90eXBlLnRleHQsci5hcnJheUJ1ZmZlcj1lLnByb3RvdHlwZS5hcnJheUJ1ZmZlcixlLnByb3RvdHlwZS5ieXRlcyYmKHIuYnl0ZXM9ZS5wcm90b3R5cGUuYnl0ZXMpLGUucHJvdG90eXBlLmNsb25lJiYoci5jbG9uZT1lLnByb3RvdHlwZS5jbG9uZSkpLHIuX2JvZHk9ci5ib2R5LHIub2s9ci5zdGF0dXM+PTIwMCYmci5zdGF0dXM8MzAwLHIuYm9keVVzZWQ9ITEscn0sUmVhZGFibGVTdHJlYW06cj0+e2xldCBlPWdsb2JhbFRoaXMuUmVhZGFibGVTdHJlYW0sdD1PYmplY3QuY3JlYXRlKGU/ZS5wcm90b3R5cGU6e30pO3JldHVybiByJiZcImJvZHlJbml0XCJpbiByP3RbU3ltYm9sLmZvcihcIkJPRFlfSU5JVFwiKV09ci5ib2R5SW5pdDpyJiZcIm5hbWVcImluIHImJih0W1N5bWJvbC5mb3IoXCJXT1JLRkxPV19TVFJFQU1fTkFNRVwiKV09ci5uYW1lLHIudHlwZSYmKHRbU3ltYm9sLmZvcihcIldPUktGTE9XX1NUUkVBTV9UWVBFXCIpXT1yLnR5cGUpLHIuZnJhbWluZyYmKHRbU3ltYm9sLmZvcihcIldPUktGTE9XX1NUUkVBTV9GUkFNSU5HXCIpXT1yLmZyYW1pbmcpKSx0fSxXcml0YWJsZVN0cmVhbTpyPT57bGV0IGU9Z2xvYmFsVGhpcy5Xcml0YWJsZVN0cmVhbSx0PU9iamVjdC5jcmVhdGUoZT9lLnByb3RvdHlwZTp7fSk7cmV0dXJuIHImJlwibmFtZVwiaW4gciYmKHRbU3ltYm9sLmZvcihcIldPUktGTE9XX1NUUkVBTV9OQU1FXCIpXT1yLm5hbWUpLHImJnR5cGVvZiByLnJ1bklkPT1cInN0cmluZ1wiJiYodFtTeW1ib2wuZm9yKFwiV09SS0ZMT1dfU1RSRUFNX1NFUlZFUl9SVU5fSURcIildPXIucnVuSWQpLHImJnR5cGVvZiByLmRlcGxveW1lbnRJZD09XCJzdHJpbmdcIiYmKHRbU3ltYm9sLmZvcihcIldPUktGTE9XX1NUUkVBTV9TRVJWRVJfREVQTE9ZTUVOVF9JRFwiKV09ci5kZXBsb3ltZW50SWQpLHR9fX1mdW5jdGlvbiBJcigpe3JldHVybntTdGVwRnVuY3Rpb246cj0+e2lmKHR5cGVvZiByIT1cImZ1bmN0aW9uXCIpcmV0dXJuITE7bGV0IGU9ci5zdGVwSWQ7aWYodHlwZW9mIGUhPVwic3RyaW5nXCIpcmV0dXJuITE7bGV0IHQ9ci5fX2Nsb3N1cmVWYXJzRm4sbj10JiZ0eXBlb2YgdD09XCJmdW5jdGlvblwiP3QoKTp2b2lkIDAsbz1cIl9fYm91bmRUaGlzXCJpbiByLHM9bz9yLl9fYm91bmRUaGlzOnZvaWQgMCxwPXIuX19ib3VuZEFyZ3MsZz17c3RlcElkOmV9O3JldHVybiBuIT09dm9pZCAwJiYoZy5jbG9zdXJlVmFycz1uKSxvJiYoZy5ib3VuZFRoaXM9cyksQXJyYXkuaXNBcnJheShwKSYmcC5sZW5ndGg+MCYmKGcuYm91bmRBcmdzPXApLGd9fX1mdW5jdGlvbiBUcihyPWdsb2JhbFRoaXMpe2xldCBlPXJbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXTtyZXR1cm57U3RlcEZ1bmN0aW9uOnQ9PntsZXQgbj10LnN0ZXBJZCxvPXQuY2xvc3VyZVZhcnM7aWYoIWUpdGhyb3cgbmV3IEVycm9yKFwiV09SS0ZMT1dfVVNFX1NURVAgbm90IGZvdW5kIG9uIGdsb2JhbCBvYmplY3QuIFN0ZXAgZnVuY3Rpb25zIGNhbm5vdCBiZSBkZXNlcmlhbGl6ZWQgb3V0c2lkZSB3b3JrZmxvdyBjb250ZXh0LlwiKTtsZXQgcz1vP2UobiwoKT0+byk6ZShuKTtpZihcImJvdW5kVGhpc1wiaW4gdCl7bGV0IHA9QXJyYXkuaXNBcnJheSh0LmJvdW5kQXJncyk/dC5ib3VuZEFyZ3M6W107cmV0dXJuIHMuYmluZCh0LmJvdW5kVGhpcywuLi5wKX1yZXR1cm4gc319fWZ1bmN0aW9uIGtyKHIpe3JldHVybiByLmxlbmd0aD09PTQmJi9eW2EtejAtOV17NH0kLy50ZXN0KHIpfXZhciBVPXtERVZBTFVFX1YxOlwiZGV2bFwiLEVOQ1JZUFRFRDpcImVuY3JcIixTRUFMRUQ6XCJlbmNwXCIsR1pJUDpcImd6aXBcIixaU1REOlwienN0ZFwifTt2YXIgY2U9bmV3IFRleHRFbmNvZGVyLGZlPW5ldyBUZXh0RGVjb2RlcixMPVN5bWJvbC5mb3IoXCJXT1JLRkxPV19BQk9SVF9TVFJFQU1fTkFNRVwiKSx2PVN5bWJvbC5mb3IoXCJXT1JLRkxPV19BQk9SVF9IT09LX1RPS0VOXCIpO2Z1bmN0aW9uIGhyKHIsZSl7bGV0IHQ9ZVtMXT8/ZS5zaWduYWw/LltMXSxuPWVbdl0/P2Uuc2lnbmFsPy5bdl07aWYoIXQpdGhyb3cgbmV3IEVycm9yKFwiQWJvcnRDb250cm9sbGVyL0Fib3J0U2lnbmFsIHN0cmVhbSBuYW1lIGlzIG5vdCBzZXRcIik7cmV0dXJue3N0cmVhbU5hbWU6dCxob29rVG9rZW46bixhYm9ydGVkOnIuYWJvcnRlZCxyZWFzb246ci5hYm9ydGVkP3IucmVhc29uOnZvaWQgMH19ZnVuY3Rpb24gTnIocil7bGV0IGU9Z2xvYmFsVGhpcy5fX1dvcmtmbG93QWJvcnRTaWduYWw7aWYodHlwZW9mIGUhPVwiZnVuY3Rpb25cIil0aHJvdyBuZXcgRXJyb3IoXCJXb3JrZmxvd0Fib3J0U2lnbmFsIGlzIG5vdCByZWdpc3RlcmVkIGluIHRoZSBWTSAoYm9vdHN0cmFwIG5vdCBldmFsdWF0ZWQpXCIpO2xldCB0PW5ldyBlKHIuc3RyZWFtTmFtZSxyLmhvb2tUb2tlbik7cmV0dXJuIHIuYWJvcnRlZCYmdC5fc2V0QWJvcnRlZChyLnJlYXNvbiksdH1mdW5jdGlvbiB5ZSgpe3JldHVybntBYm9ydENvbnRyb2xsZXI6cj0+IXJ8fHR5cGVvZiByIT1cIm9iamVjdFwifHwhci5zaWduYWx8fChyW0xdPz9yLnNpZ25hbD8uW0xdKT09PXZvaWQgMD8hMTpocihyLnNpZ25hbCxyKSxBYm9ydFNpZ25hbDpyPT4hcnx8dHlwZW9mIHIhPVwib2JqZWN0XCJ8fHJbTF09PT12b2lkIDA/ITE6aHIocixyKX19ZnVuY3Rpb24gbGUoKXtyZXR1cm57QWJvcnRDb250cm9sbGVyOnI9Pih7W0xdOnIuc3RyZWFtTmFtZSxbdl06ci5ob29rVG9rZW4sc2lnbmFsOk5yKHIpLGFib3J0OigpPT57fX0pLEFib3J0U2lnbmFsOnI9Pk5yKHIpfX1mdW5jdGlvbiB1ZShyKXtzd2l0Y2gocil7Y2FzZVwid29ya2Zsb3dcIjpyZXR1cm57Li4ueWUoKSwuLi5QKCksLi4uSXIoKSwuLi5qKCl9O2Nhc2VcInN0ZXBcIjpyZXR1cm57Li4uUCgpLC4uLmooKX07Y2FzZVwiY2xpZW50XCI6cmV0dXJuey4uLlAoKSwuLi5qKCl9fX1mdW5jdGlvbiBMcihyKXtzd2l0Y2gocil7Y2FzZVwid29ya2Zsb3dcIjpyZXR1cm57Li4ubGUoKSwuLi5CKCksLi4uVHIoKSwuLi5LKCl9O2Nhc2VcInN0ZXBcIjpyZXR1cm57Li4uQigpLC4uLksoKX07Y2FzZVwiY2xpZW50XCI6cmV0dXJuey4uLkIoKSwuLi5LKCksU3RlcEZ1bmN0aW9uOigpPT57dGhyb3cgbmV3IEVycm9yKFwiU3RlcCBmdW5jdGlvbnMgY2Fubm90IGJlIGRlc2VyaWFsaXplZCBpbiBjbGllbnQgY29udGV4dC5cIil9fX19dmFyIEY9e2Zvcm1hdFByZWZpeDpVLkRFVkFMVUVfVjEsc2VyaWFsaXplKHIsZSl7bGV0IHQ9dWUoZSksbj1IKHIsdCk7cmV0dXJuIGNlLmVuY29kZShuKX0sZGVzZXJpYWxpemUocixlKXtsZXQgdD1McihlKSxuPWZlLmRlY29kZShyKTtyZXR1cm4gRyhuLHQpfSxkZXNlcmlhbGl6ZUxlZ2FjeShyLGUpe2xldCB0PUxyKGUpO3JldHVybiBDKHIsdCl9fTt2YXIgcnI9NCxlcix0cjtmdW5jdGlvbiBwZSgpe3JldHVybiBlcnx8KGVyPW5ldyBnbG9iYWxUaGlzLlRleHRFbmNvZGVyKSxlcn1mdW5jdGlvbiBnZSgpe3JldHVybiB0cnx8KHRyPW5ldyBnbG9iYWxUaGlzLlRleHREZWNvZGVyKSx0cn1mdW5jdGlvbiBNcihyKXtsZXQgZT1GLnNlcmlhbGl6ZShyLFwid29ya2Zsb3dcIiksdD1wZSgpLmVuY29kZShVLkRFVkFMVUVfVjEpLG49bmV3IFVpbnQ4QXJyYXkodC5sZW5ndGgrZS5sZW5ndGgpO3JldHVybiBuLnNldCh0LDApLG4uc2V0KGUsdC5sZW5ndGgpLG59ZnVuY3Rpb24geHIocil7aWYoIShyIGluc3RhbmNlb2YgVWludDhBcnJheSkpe2lmKEYuZGVzZXJpYWxpemVMZWdhY3kpcmV0dXJuIEYuZGVzZXJpYWxpemVMZWdhY3kocixcIndvcmtmbG93XCIpO3Rocm93IG5ldyBFcnJvcihcIkNhbm5vdCBkZXNlcmlhbGl6ZSBub24tYmluYXJ5IGRhdGEgd2l0aG91dCBsZWdhY3kgc3VwcG9ydFwiKX1pZihyLmxlbmd0aDxycil0aHJvdyBuZXcgRXJyb3IoXCJEYXRhIHRvbyBzaG9ydCB0byBjb250YWluIGZvcm1hdCBwcmVmaXhcIik7bGV0IGU9Z2UoKS5kZWNvZGUoci5zdWJhcnJheSgwLHJyKSk7aWYoIWtyKGUpKXRocm93IG5ldyBFcnJvcihcXGBJbnZhbGlkIGZvcm1hdCBwcmVmaXg6IFwiXFwke2V9XCJcXGApO2lmKGU9PT1VLkRFVkFMVUVfVjEpe2xldCB0PXIuc3ViYXJyYXkocnIpO3JldHVybiBGLmRlc2VyaWFsaXplKHQsXCJ3b3JrZmxvd1wiKX10aHJvdyBuZXcgRXJyb3IoXFxgVW5zdXBwb3J0ZWQgc2VyaWFsaXphdGlvbiBmb3JtYXQ6IFxcJHtlfVxcYCl9Z2xvYmFsVGhpc1tTeW1ib2wuZm9yKFwid29ya2Zsb3ctc2VyaWFsaXplXCIpXT1NcjtnbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJ3b3JrZmxvdy1kZXNlcmlhbGl6ZVwiKV09eHI7dmFyIGRlPWlyKCgpPT5NYXRoLnJhbmRvbSgpKTtnbG9iYWxUaGlzLl9fZ2VuZXJhdGVVbGlkPSgpPT57bGV0IHI9Z2xvYmFsVGhpcy5fX3VsaWRUaW1lc3RhbXA7aWYodHlwZW9mIHIhPVwibnVtYmVyXCIpdGhyb3cgbmV3IEVycm9yKFwiX19nZW5lcmF0ZVVsaWQ6IGdsb2JhbFRoaXMuX191bGlkVGltZXN0YW1wIG11c3QgYmUgYSBudW1iZXIgc2V0IGJ5IHRoZSBob3N0IGJlZm9yZSB0aGUgc2VyZGUgYnVuZGxlIGlzIGV2YWx1YXRlZC4gV2l0aG91dCBpdCwgVUxJRHMgd291bGQgZmFsbCBiYWNrIHRvIERhdGUubm93KCkgYW5kIGNvbmN1cnJlbnQgd29ya2Zsb3cgaW52b2NhdGlvbnMgb2YgdGhlIHNhbWUgcmVzdW1wdGlvbiB3b3VsZCBwcm9kdWNlIGRpdmVyZ2VudCBjb3JyZWxhdGlvbklkcy5cIik7cmV0dXJuIGRlKHIpfTt9KSgpO1xuYDtcbiJdfQ==
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wait-continuation dispatch: delay + idempotency-key selection.
|
|
3
|
+
*
|
|
4
|
+
* When V2 suspension processing observes a pending wait, it enqueues a
|
|
5
|
+
* delayed "continuation" message that fires once the wait elapses and
|
|
6
|
+
* drives the next replay (which completes the wait via the "complete
|
|
7
|
+
* elapsed waits" pass). This module decides the message's `delaySeconds`
|
|
8
|
+
* and `idempotencyKey`.
|
|
9
|
+
*
|
|
10
|
+
* The continuation is keyed on the wait's correlationId: while a wait is
|
|
11
|
+
* pending, every replay pass over the run re-observes it (e.g., once per
|
|
12
|
+
* step completion in `Promise.all([steps..., sleep()])`), and without
|
|
13
|
+
* dedupe each pass would enqueue another delayed continuation — each one
|
|
14
|
+
* a spurious full replay when the wait elapses, and each a fresh message
|
|
15
|
+
* that resets the delivery-attempt runaway guard. A key is attached in
|
|
16
|
+
* all cases: some worlds (e.g. world-postgres) serialize key-less
|
|
17
|
+
* workflow messages per run, which would park the continuation behind
|
|
18
|
+
* the handler's own inline step execution and defeat the race semantics
|
|
19
|
+
* the continuation exists to provide.
|
|
20
|
+
*
|
|
21
|
+
* The bare correlationId cannot be the key in every case, though: world
|
|
22
|
+
* dedupe windows outlive the first delivery (VQS keeps idempotency
|
|
23
|
+
* records until message-retention TTL; world-postgres keeps a
|
|
24
|
+
* completed-keys cache), so once a key has been used, a later enqueue
|
|
25
|
+
* under the same key is silently dropped. Any situation where a
|
|
26
|
+
* continuation is delivered while its wait is still pending therefore
|
|
27
|
+
* needs a fresh key for the re-enqueue, or the wait's timer is lost and
|
|
28
|
+
* the run stalls until unrelated traffic happens to wake it. Two such
|
|
29
|
+
* situations exist, each with its own key variation:
|
|
30
|
+
*
|
|
31
|
+
* - Waits longer than the maximum queue delay are chained: the delay is
|
|
32
|
+
* clamped to `WAIT_CONTINUATION_MAX_DELAY_SECONDS` (23h — VQS messages
|
|
33
|
+
* have a 24h retention limit, and one hour of buffer matches
|
|
34
|
+
* world-vercel's own clamp for delayed re-enqueues), so the
|
|
35
|
+
* continuation intentionally fires early, re-observes the wait, and
|
|
36
|
+
* must enqueue the next hop. The key is suffixed with the hop index
|
|
37
|
+
* (`ceil(timeoutSeconds / maxDelay)`): stable for every re-observation
|
|
38
|
+
* within the same hop window (so passes dedupe), decremented at each
|
|
39
|
+
* hop delivery (so the chain always advances). Worlds without a delay
|
|
40
|
+
* limit (world-postgres, world-local) simply take the same ≤23h hops.
|
|
41
|
+
*
|
|
42
|
+
* - Near-elapsed waits (≤2s remaining) get a second-bucketed suffix. A
|
|
43
|
+
* continuation delivered marginally early (clock skew between the
|
|
44
|
+
* enqueuing and handling hosts; the ceil() on the delay can leave a ~0
|
|
45
|
+
* margin) re-observes the wait as pending with ~1s remaining and must
|
|
46
|
+
* be able to enqueue a fresh short-delay retry. The bucket suffix
|
|
47
|
+
* keeps that retry enqueueable (its ≥1s delay guarantees a later
|
|
48
|
+
* bucket) while still collapsing same-instant duplicates.
|
|
49
|
+
*
|
|
50
|
+
* Mid-range waits (more than the near-elapsed threshold, at most one
|
|
51
|
+
* hop) use the bare correlationId: every re-observation targets the same
|
|
52
|
+
* deadline, so deduping to the first message is semantically lossless.
|
|
53
|
+
* Host clock skew beyond the near-elapsed threshold could in principle
|
|
54
|
+
* deliver such a continuation early enough to re-observe its wait and
|
|
55
|
+
* lose the re-enqueue to the burnt key; the threshold is the skew
|
|
56
|
+
* tolerance we accept for the benefit of exactly-one continuation per
|
|
57
|
+
* wait.
|
|
58
|
+
*/
|
|
59
|
+
/**
|
|
60
|
+
* Maximum `delaySeconds` for a single wait-continuation message. Waits
|
|
61
|
+
* longer than this are chained across multiple hops. 23 hours leaves a 1h
|
|
62
|
+
* buffer under Vercel Queues' default 24h message TTL and mirrors
|
|
63
|
+
* world-vercel's `MAX_DELAY_SECONDS`.
|
|
64
|
+
*/
|
|
65
|
+
export declare const WAIT_CONTINUATION_MAX_DELAY_SECONDS = 82800;
|
|
66
|
+
/**
|
|
67
|
+
* Waits with at most this many seconds remaining use a second-bucketed
|
|
68
|
+
* idempotency key so an early-delivered continuation can re-enqueue its
|
|
69
|
+
* short-delay retry. This is also the host clock-skew tolerance for
|
|
70
|
+
* mid-range waits keyed on the bare correlationId.
|
|
71
|
+
*/
|
|
72
|
+
export declare const NEAR_ELAPSED_WAIT_THRESHOLD_SECONDS = 2;
|
|
73
|
+
export interface WaitContinuationDispatch {
|
|
74
|
+
delaySeconds: number;
|
|
75
|
+
idempotencyKey: string;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Computes the queue delay and idempotency key for a wait-continuation
|
|
79
|
+
* message. `timeoutSeconds` is the time until the wait's `resumeAt`
|
|
80
|
+
* (floored at 1s by the suspension handler); `waitCorrelationId`
|
|
81
|
+
* identifies the wait so repeated suspension passes dedupe.
|
|
82
|
+
*/
|
|
83
|
+
export declare function getWaitContinuationDispatch(timeoutSeconds: number, waitCorrelationId: string, now?: number): WaitContinuationDispatch;
|
|
84
|
+
//# sourceMappingURL=wait-continuation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wait-continuation.d.ts","sourceRoot":"","sources":["../../src/runtime/wait-continuation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyDG;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;;;;;GAKG;AACH,wBAAgB,2BAA2B,CACzC,cAAc,EAAE,MAAM,EACtB,iBAAiB,EAAE,MAAM,EACzB,GAAG,GAAE,MAAmB,GACvB,wBAAwB,CAyB1B"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wait-continuation dispatch: delay + idempotency-key selection.
|
|
3
|
+
*
|
|
4
|
+
* When V2 suspension processing observes a pending wait, it enqueues a
|
|
5
|
+
* delayed "continuation" message that fires once the wait elapses and
|
|
6
|
+
* drives the next replay (which completes the wait via the "complete
|
|
7
|
+
* elapsed waits" pass). This module decides the message's `delaySeconds`
|
|
8
|
+
* and `idempotencyKey`.
|
|
9
|
+
*
|
|
10
|
+
* The continuation is keyed on the wait's correlationId: while a wait is
|
|
11
|
+
* pending, every replay pass over the run re-observes it (e.g., once per
|
|
12
|
+
* step completion in `Promise.all([steps..., sleep()])`), and without
|
|
13
|
+
* dedupe each pass would enqueue another delayed continuation — each one
|
|
14
|
+
* a spurious full replay when the wait elapses, and each a fresh message
|
|
15
|
+
* that resets the delivery-attempt runaway guard. A key is attached in
|
|
16
|
+
* all cases: some worlds (e.g. world-postgres) serialize key-less
|
|
17
|
+
* workflow messages per run, which would park the continuation behind
|
|
18
|
+
* the handler's own inline step execution and defeat the race semantics
|
|
19
|
+
* the continuation exists to provide.
|
|
20
|
+
*
|
|
21
|
+
* The bare correlationId cannot be the key in every case, though: world
|
|
22
|
+
* dedupe windows outlive the first delivery (VQS keeps idempotency
|
|
23
|
+
* records until message-retention TTL; world-postgres keeps a
|
|
24
|
+
* completed-keys cache), so once a key has been used, a later enqueue
|
|
25
|
+
* under the same key is silently dropped. Any situation where a
|
|
26
|
+
* continuation is delivered while its wait is still pending therefore
|
|
27
|
+
* needs a fresh key for the re-enqueue, or the wait's timer is lost and
|
|
28
|
+
* the run stalls until unrelated traffic happens to wake it. Two such
|
|
29
|
+
* situations exist, each with its own key variation:
|
|
30
|
+
*
|
|
31
|
+
* - Waits longer than the maximum queue delay are chained: the delay is
|
|
32
|
+
* clamped to `WAIT_CONTINUATION_MAX_DELAY_SECONDS` (23h — VQS messages
|
|
33
|
+
* have a 24h retention limit, and one hour of buffer matches
|
|
34
|
+
* world-vercel's own clamp for delayed re-enqueues), so the
|
|
35
|
+
* continuation intentionally fires early, re-observes the wait, and
|
|
36
|
+
* must enqueue the next hop. The key is suffixed with the hop index
|
|
37
|
+
* (`ceil(timeoutSeconds / maxDelay)`): stable for every re-observation
|
|
38
|
+
* within the same hop window (so passes dedupe), decremented at each
|
|
39
|
+
* hop delivery (so the chain always advances). Worlds without a delay
|
|
40
|
+
* limit (world-postgres, world-local) simply take the same ≤23h hops.
|
|
41
|
+
*
|
|
42
|
+
* - Near-elapsed waits (≤2s remaining) get a second-bucketed suffix. A
|
|
43
|
+
* continuation delivered marginally early (clock skew between the
|
|
44
|
+
* enqueuing and handling hosts; the ceil() on the delay can leave a ~0
|
|
45
|
+
* margin) re-observes the wait as pending with ~1s remaining and must
|
|
46
|
+
* be able to enqueue a fresh short-delay retry. The bucket suffix
|
|
47
|
+
* keeps that retry enqueueable (its ≥1s delay guarantees a later
|
|
48
|
+
* bucket) while still collapsing same-instant duplicates.
|
|
49
|
+
*
|
|
50
|
+
* Mid-range waits (more than the near-elapsed threshold, at most one
|
|
51
|
+
* hop) use the bare correlationId: every re-observation targets the same
|
|
52
|
+
* deadline, so deduping to the first message is semantically lossless.
|
|
53
|
+
* Host clock skew beyond the near-elapsed threshold could in principle
|
|
54
|
+
* deliver such a continuation early enough to re-observe its wait and
|
|
55
|
+
* lose the re-enqueue to the burnt key; the threshold is the skew
|
|
56
|
+
* tolerance we accept for the benefit of exactly-one continuation per
|
|
57
|
+
* wait.
|
|
58
|
+
*/
|
|
59
|
+
import { envNumber } from '@workflow/world';
|
|
60
|
+
/**
|
|
61
|
+
* Maximum `delaySeconds` for a single wait-continuation message. Waits
|
|
62
|
+
* longer than this are chained across multiple hops. 23 hours leaves a 1h
|
|
63
|
+
* buffer under Vercel Queues' default 24h message TTL and mirrors
|
|
64
|
+
* world-vercel's `MAX_DELAY_SECONDS`.
|
|
65
|
+
*/
|
|
66
|
+
export const WAIT_CONTINUATION_MAX_DELAY_SECONDS = 82_800;
|
|
67
|
+
/**
|
|
68
|
+
* Waits with at most this many seconds remaining use a second-bucketed
|
|
69
|
+
* idempotency key so an early-delivered continuation can re-enqueue its
|
|
70
|
+
* short-delay retry. This is also the host clock-skew tolerance for
|
|
71
|
+
* mid-range waits keyed on the bare correlationId.
|
|
72
|
+
*/
|
|
73
|
+
export const NEAR_ELAPSED_WAIT_THRESHOLD_SECONDS = 2;
|
|
74
|
+
/** Effective max continuation delay. Override: `WORKFLOW_WAIT_CONTINUATION_MAX_DELAY_SECONDS`. */
|
|
75
|
+
const getWaitContinuationMaxDelaySeconds = () => envNumber('WORKFLOW_WAIT_CONTINUATION_MAX_DELAY_SECONDS', WAIT_CONTINUATION_MAX_DELAY_SECONDS, { integer: true, min: 1 });
|
|
76
|
+
/** Effective near-elapsed threshold. Override: `WORKFLOW_NEAR_ELAPSED_WAIT_THRESHOLD_SECONDS`. */
|
|
77
|
+
const getNearElapsedWaitThresholdSeconds = () => envNumber('WORKFLOW_NEAR_ELAPSED_WAIT_THRESHOLD_SECONDS', NEAR_ELAPSED_WAIT_THRESHOLD_SECONDS);
|
|
78
|
+
/**
|
|
79
|
+
* Computes the queue delay and idempotency key for a wait-continuation
|
|
80
|
+
* message. `timeoutSeconds` is the time until the wait's `resumeAt`
|
|
81
|
+
* (floored at 1s by the suspension handler); `waitCorrelationId`
|
|
82
|
+
* identifies the wait so repeated suspension passes dedupe.
|
|
83
|
+
*/
|
|
84
|
+
export function getWaitContinuationDispatch(timeoutSeconds, waitCorrelationId, now = Date.now()) {
|
|
85
|
+
const maxDelaySeconds = getWaitContinuationMaxDelaySeconds();
|
|
86
|
+
// The near-elapsed branch returns the full remaining time as the delay, so
|
|
87
|
+
// its threshold can never exceed the max delay — otherwise a wait between the
|
|
88
|
+
// max and the threshold would be dispatched with a delay above the max. Cap
|
|
89
|
+
// the threshold at the max so every branch yields a delay within it. (With
|
|
90
|
+
// defaults — threshold 2s, max 82_800s — this is a no-op; it only bites when
|
|
91
|
+
// the max is tuned down below the threshold for testing.)
|
|
92
|
+
const nearElapsedThreshold = Math.min(getNearElapsedWaitThresholdSeconds(), maxDelaySeconds);
|
|
93
|
+
if (timeoutSeconds <= nearElapsedThreshold) {
|
|
94
|
+
return {
|
|
95
|
+
delaySeconds: timeoutSeconds,
|
|
96
|
+
idempotencyKey: `${waitCorrelationId}:${Math.floor(now / 1000)}`,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
const hop = Math.ceil(timeoutSeconds / maxDelaySeconds);
|
|
100
|
+
return {
|
|
101
|
+
delaySeconds: Math.min(timeoutSeconds, maxDelaySeconds),
|
|
102
|
+
idempotencyKey: hop === 1 ? waitCorrelationId : `${waitCorrelationId}:hop-${hop}`,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FpdC1jb250aW51YXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS93YWl0LWNvbnRpbnVhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeURHO0FBRUgsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTVDOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sbUNBQW1DLEdBQUcsTUFBTSxDQUFDO0FBRTFEOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sbUNBQW1DLEdBQUcsQ0FBQyxDQUFDO0FBRXJELGtHQUFrRztBQUNsRyxNQUFNLGtDQUFrQyxHQUFHLEdBQVcsRUFBRSxDQUN0RCxTQUFTLENBQ1AsOENBQThDLEVBQzlDLG1DQUFtQyxFQUNuQyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUMxQixDQUFDO0FBRUosa0dBQWtHO0FBQ2xHLE1BQU0sa0NBQWtDLEdBQUcsR0FBVyxFQUFFLENBQ3RELFNBQVMsQ0FDUCw4Q0FBOEMsRUFDOUMsbUNBQW1DLENBQ3BDLENBQUM7QUFPSjs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSwyQkFBMkIsQ0FDekMsY0FBc0IsRUFDdEIsaUJBQXlCLEVBQ3pCLE1BQWMsSUFBSSxDQUFDLEdBQUcsRUFBRTtJQUV4QixNQUFNLGVBQWUsR0FBRyxrQ0FBa0MsRUFBRSxDQUFDO0lBQzdELDJFQUEyRTtJQUMzRSw4RUFBOEU7SUFDOUUsNEVBQTRFO0lBQzVFLDJFQUEyRTtJQUMzRSw2RUFBNkU7SUFDN0UsMERBQTBEO0lBQzFELE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FDbkMsa0NBQWtDLEVBQUUsRUFDcEMsZUFBZSxDQUNoQixDQUFDO0lBQ0YsSUFBSSxjQUFjLElBQUksb0JBQW9CLEVBQUUsQ0FBQztRQUMzQyxPQUFPO1lBQ0wsWUFBWSxFQUFFLGNBQWM7WUFDNUIsY0FBYyxFQUFFLEdBQUcsaUJBQWlCLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUU7U0FDakUsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsR0FBRyxlQUFlLENBQUMsQ0FBQztJQUN4RCxPQUFPO1FBQ0wsWUFBWSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLGVBQWUsQ0FBQztRQUN2RCxjQUFjLEVBQ1osR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEdBQUcsaUJBQWlCLFFBQVEsR0FBRyxFQUFFO0tBQ3BFLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBXYWl0LWNvbnRpbnVhdGlvbiBkaXNwYXRjaDogZGVsYXkgKyBpZGVtcG90ZW5jeS1rZXkgc2VsZWN0aW9uLlxuICpcbiAqIFdoZW4gVjIgc3VzcGVuc2lvbiBwcm9jZXNzaW5nIG9ic2VydmVzIGEgcGVuZGluZyB3YWl0LCBpdCBlbnF1ZXVlcyBhXG4gKiBkZWxheWVkIFwiY29udGludWF0aW9uXCIgbWVzc2FnZSB0aGF0IGZpcmVzIG9uY2UgdGhlIHdhaXQgZWxhcHNlcyBhbmRcbiAqIGRyaXZlcyB0aGUgbmV4dCByZXBsYXkgKHdoaWNoIGNvbXBsZXRlcyB0aGUgd2FpdCB2aWEgdGhlIFwiY29tcGxldGVcbiAqIGVsYXBzZWQgd2FpdHNcIiBwYXNzKS4gVGhpcyBtb2R1bGUgZGVjaWRlcyB0aGUgbWVzc2FnZSdzIGBkZWxheVNlY29uZHNgXG4gKiBhbmQgYGlkZW1wb3RlbmN5S2V5YC5cbiAqXG4gKiBUaGUgY29udGludWF0aW9uIGlzIGtleWVkIG9uIHRoZSB3YWl0J3MgY29ycmVsYXRpb25JZDogd2hpbGUgYSB3YWl0IGlzXG4gKiBwZW5kaW5nLCBldmVyeSByZXBsYXkgcGFzcyBvdmVyIHRoZSBydW4gcmUtb2JzZXJ2ZXMgaXQgKGUuZy4sIG9uY2UgcGVyXG4gKiBzdGVwIGNvbXBsZXRpb24gaW4gYFByb21pc2UuYWxsKFtzdGVwcy4uLiwgc2xlZXAoKV0pYCksIGFuZCB3aXRob3V0XG4gKiBkZWR1cGUgZWFjaCBwYXNzIHdvdWxkIGVucXVldWUgYW5vdGhlciBkZWxheWVkIGNvbnRpbnVhdGlvbiDigJQgZWFjaCBvbmVcbiAqIGEgc3B1cmlvdXMgZnVsbCByZXBsYXkgd2hlbiB0aGUgd2FpdCBlbGFwc2VzLCBhbmQgZWFjaCBhIGZyZXNoIG1lc3NhZ2VcbiAqIHRoYXQgcmVzZXRzIHRoZSBkZWxpdmVyeS1hdHRlbXB0IHJ1bmF3YXkgZ3VhcmQuIEEga2V5IGlzIGF0dGFjaGVkIGluXG4gKiBhbGwgY2FzZXM6IHNvbWUgd29ybGRzIChlLmcuIHdvcmxkLXBvc3RncmVzKSBzZXJpYWxpemUga2V5LWxlc3NcbiAqIHdvcmtmbG93IG1lc3NhZ2VzIHBlciBydW4sIHdoaWNoIHdvdWxkIHBhcmsgdGhlIGNvbnRpbnVhdGlvbiBiZWhpbmRcbiAqIHRoZSBoYW5kbGVyJ3Mgb3duIGlubGluZSBzdGVwIGV4ZWN1dGlvbiBhbmQgZGVmZWF0IHRoZSByYWNlIHNlbWFudGljc1xuICogdGhlIGNvbnRpbnVhdGlvbiBleGlzdHMgdG8gcHJvdmlkZS5cbiAqXG4gKiBUaGUgYmFyZSBjb3JyZWxhdGlvbklkIGNhbm5vdCBiZSB0aGUga2V5IGluIGV2ZXJ5IGNhc2UsIHRob3VnaDogd29ybGRcbiAqIGRlZHVwZSB3aW5kb3dzIG91dGxpdmUgdGhlIGZpcnN0IGRlbGl2ZXJ5IChWUVMga2VlcHMgaWRlbXBvdGVuY3lcbiAqIHJlY29yZHMgdW50aWwgbWVzc2FnZS1yZXRlbnRpb24gVFRMOyB3b3JsZC1wb3N0Z3JlcyBrZWVwcyBhXG4gKiBjb21wbGV0ZWQta2V5cyBjYWNoZSksIHNvIG9uY2UgYSBrZXkgaGFzIGJlZW4gdXNlZCwgYSBsYXRlciBlbnF1ZXVlXG4gKiB1bmRlciB0aGUgc2FtZSBrZXkgaXMgc2lsZW50bHkgZHJvcHBlZC4gQW55IHNpdHVhdGlvbiB3aGVyZSBhXG4gKiBjb250aW51YXRpb24gaXMgZGVsaXZlcmVkIHdoaWxlIGl0cyB3YWl0IGlzIHN0aWxsIHBlbmRpbmcgdGhlcmVmb3JlXG4gKiBuZWVkcyBhIGZyZXNoIGtleSBmb3IgdGhlIHJlLWVucXVldWUsIG9yIHRoZSB3YWl0J3MgdGltZXIgaXMgbG9zdCBhbmRcbiAqIHRoZSBydW4gc3RhbGxzIHVudGlsIHVucmVsYXRlZCB0cmFmZmljIGhhcHBlbnMgdG8gd2FrZSBpdC4gVHdvIHN1Y2hcbiAqIHNpdHVhdGlvbnMgZXhpc3QsIGVhY2ggd2l0aCBpdHMgb3duIGtleSB2YXJpYXRpb246XG4gKlxuICogLSBXYWl0cyBsb25nZXIgdGhhbiB0aGUgbWF4aW11bSBxdWV1ZSBkZWxheSBhcmUgY2hhaW5lZDogdGhlIGRlbGF5IGlzXG4gKiAgIGNsYW1wZWQgdG8gYFdBSVRfQ09OVElOVUFUSU9OX01BWF9ERUxBWV9TRUNPTkRTYCAoMjNoIOKAlCBWUVMgbWVzc2FnZXNcbiAqICAgaGF2ZSBhIDI0aCByZXRlbnRpb24gbGltaXQsIGFuZCBvbmUgaG91ciBvZiBidWZmZXIgbWF0Y2hlc1xuICogICB3b3JsZC12ZXJjZWwncyBvd24gY2xhbXAgZm9yIGRlbGF5ZWQgcmUtZW5xdWV1ZXMpLCBzbyB0aGVcbiAqICAgY29udGludWF0aW9uIGludGVudGlvbmFsbHkgZmlyZXMgZWFybHksIHJlLW9ic2VydmVzIHRoZSB3YWl0LCBhbmRcbiAqICAgbXVzdCBlbnF1ZXVlIHRoZSBuZXh0IGhvcC4gVGhlIGtleSBpcyBzdWZmaXhlZCB3aXRoIHRoZSBob3AgaW5kZXhcbiAqICAgKGBjZWlsKHRpbWVvdXRTZWNvbmRzIC8gbWF4RGVsYXkpYCk6IHN0YWJsZSBmb3IgZXZlcnkgcmUtb2JzZXJ2YXRpb25cbiAqICAgd2l0aGluIHRoZSBzYW1lIGhvcCB3aW5kb3cgKHNvIHBhc3NlcyBkZWR1cGUpLCBkZWNyZW1lbnRlZCBhdCBlYWNoXG4gKiAgIGhvcCBkZWxpdmVyeSAoc28gdGhlIGNoYWluIGFsd2F5cyBhZHZhbmNlcykuIFdvcmxkcyB3aXRob3V0IGEgZGVsYXlcbiAqICAgbGltaXQgKHdvcmxkLXBvc3RncmVzLCB3b3JsZC1sb2NhbCkgc2ltcGx5IHRha2UgdGhlIHNhbWUg4omkMjNoIGhvcHMuXG4gKlxuICogLSBOZWFyLWVsYXBzZWQgd2FpdHMgKOKJpDJzIHJlbWFpbmluZykgZ2V0IGEgc2Vjb25kLWJ1Y2tldGVkIHN1ZmZpeC4gQVxuICogICBjb250aW51YXRpb24gZGVsaXZlcmVkIG1hcmdpbmFsbHkgZWFybHkgKGNsb2NrIHNrZXcgYmV0d2VlbiB0aGVcbiAqICAgZW5xdWV1aW5nIGFuZCBoYW5kbGluZyBob3N0czsgdGhlIGNlaWwoKSBvbiB0aGUgZGVsYXkgY2FuIGxlYXZlIGEgfjBcbiAqICAgbWFyZ2luKSByZS1vYnNlcnZlcyB0aGUgd2FpdCBhcyBwZW5kaW5nIHdpdGggfjFzIHJlbWFpbmluZyBhbmQgbXVzdFxuICogICBiZSBhYmxlIHRvIGVucXVldWUgYSBmcmVzaCBzaG9ydC1kZWxheSByZXRyeS4gVGhlIGJ1Y2tldCBzdWZmaXhcbiAqICAga2VlcHMgdGhhdCByZXRyeSBlbnF1ZXVlYWJsZSAoaXRzIOKJpTFzIGRlbGF5IGd1YXJhbnRlZXMgYSBsYXRlclxuICogICBidWNrZXQpIHdoaWxlIHN0aWxsIGNvbGxhcHNpbmcgc2FtZS1pbnN0YW50IGR1cGxpY2F0ZXMuXG4gKlxuICogTWlkLXJhbmdlIHdhaXRzIChtb3JlIHRoYW4gdGhlIG5lYXItZWxhcHNlZCB0aHJlc2hvbGQsIGF0IG1vc3Qgb25lXG4gKiBob3ApIHVzZSB0aGUgYmFyZSBjb3JyZWxhdGlvbklkOiBldmVyeSByZS1vYnNlcnZhdGlvbiB0YXJnZXRzIHRoZSBzYW1lXG4gKiBkZWFkbGluZSwgc28gZGVkdXBpbmcgdG8gdGhlIGZpcnN0IG1lc3NhZ2UgaXMgc2VtYW50aWNhbGx5IGxvc3NsZXNzLlxuICogSG9zdCBjbG9jayBza2V3IGJleW9uZCB0aGUgbmVhci1lbGFwc2VkIHRocmVzaG9sZCBjb3VsZCBpbiBwcmluY2lwbGVcbiAqIGRlbGl2ZXIgc3VjaCBhIGNvbnRpbnVhdGlvbiBlYXJseSBlbm91Z2ggdG8gcmUtb2JzZXJ2ZSBpdHMgd2FpdCBhbmRcbiAqIGxvc2UgdGhlIHJlLWVucXVldWUgdG8gdGhlIGJ1cm50IGtleTsgdGhlIHRocmVzaG9sZCBpcyB0aGUgc2tld1xuICogdG9sZXJhbmNlIHdlIGFjY2VwdCBmb3IgdGhlIGJlbmVmaXQgb2YgZXhhY3RseS1vbmUgY29udGludWF0aW9uIHBlclxuICogd2FpdC5cbiAqL1xuXG5pbXBvcnQgeyBlbnZOdW1iZXIgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuXG4vKipcbiAqIE1heGltdW0gYGRlbGF5U2Vjb25kc2AgZm9yIGEgc2luZ2xlIHdhaXQtY29udGludWF0aW9uIG1lc3NhZ2UuIFdhaXRzXG4gKiBsb25nZXIgdGhhbiB0aGlzIGFyZSBjaGFpbmVkIGFjcm9zcyBtdWx0aXBsZSBob3BzLiAyMyBob3VycyBsZWF2ZXMgYSAxaFxuICogYnVmZmVyIHVuZGVyIFZlcmNlbCBRdWV1ZXMnIGRlZmF1bHQgMjRoIG1lc3NhZ2UgVFRMIGFuZCBtaXJyb3JzXG4gKiB3b3JsZC12ZXJjZWwncyBgTUFYX0RFTEFZX1NFQ09ORFNgLlxuICovXG5leHBvcnQgY29uc3QgV0FJVF9DT05USU5VQVRJT05fTUFYX0RFTEFZX1NFQ09ORFMgPSA4Ml84MDA7XG5cbi8qKlxuICogV2FpdHMgd2l0aCBhdCBtb3N0IHRoaXMgbWFueSBzZWNvbmRzIHJlbWFpbmluZyB1c2UgYSBzZWNvbmQtYnVja2V0ZWRcbiAqIGlkZW1wb3RlbmN5IGtleSBzbyBhbiBlYXJseS1kZWxpdmVyZWQgY29udGludWF0aW9uIGNhbiByZS1lbnF1ZXVlIGl0c1xuICogc2hvcnQtZGVsYXkgcmV0cnkuIFRoaXMgaXMgYWxzbyB0aGUgaG9zdCBjbG9jay1za2V3IHRvbGVyYW5jZSBmb3JcbiAqIG1pZC1yYW5nZSB3YWl0cyBrZXllZCBvbiB0aGUgYmFyZSBjb3JyZWxhdGlvbklkLlxuICovXG5leHBvcnQgY29uc3QgTkVBUl9FTEFQU0VEX1dBSVRfVEhSRVNIT0xEX1NFQ09ORFMgPSAyO1xuXG4vKiogRWZmZWN0aXZlIG1heCBjb250aW51YXRpb24gZGVsYXkuIE92ZXJyaWRlOiBgV09SS0ZMT1dfV0FJVF9DT05USU5VQVRJT05fTUFYX0RFTEFZX1NFQ09ORFNgLiAqL1xuY29uc3QgZ2V0V2FpdENvbnRpbnVhdGlvbk1heERlbGF5U2Vjb25kcyA9ICgpOiBudW1iZXIgPT5cbiAgZW52TnVtYmVyKFxuICAgICdXT1JLRkxPV19XQUlUX0NPTlRJTlVBVElPTl9NQVhfREVMQVlfU0VDT05EUycsXG4gICAgV0FJVF9DT05USU5VQVRJT05fTUFYX0RFTEFZX1NFQ09ORFMsXG4gICAgeyBpbnRlZ2VyOiB0cnVlLCBtaW46IDEgfVxuICApO1xuXG4vKiogRWZmZWN0aXZlIG5lYXItZWxhcHNlZCB0aHJlc2hvbGQuIE92ZXJyaWRlOiBgV09SS0ZMT1dfTkVBUl9FTEFQU0VEX1dBSVRfVEhSRVNIT0xEX1NFQ09ORFNgLiAqL1xuY29uc3QgZ2V0TmVhckVsYXBzZWRXYWl0VGhyZXNob2xkU2Vjb25kcyA9ICgpOiBudW1iZXIgPT5cbiAgZW52TnVtYmVyKFxuICAgICdXT1JLRkxPV19ORUFSX0VMQVBTRURfV0FJVF9USFJFU0hPTERfU0VDT05EUycsXG4gICAgTkVBUl9FTEFQU0VEX1dBSVRfVEhSRVNIT0xEX1NFQ09ORFNcbiAgKTtcblxuZXhwb3J0IGludGVyZmFjZSBXYWl0Q29udGludWF0aW9uRGlzcGF0Y2gge1xuICBkZWxheVNlY29uZHM6IG51bWJlcjtcbiAgaWRlbXBvdGVuY3lLZXk6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgcXVldWUgZGVsYXkgYW5kIGlkZW1wb3RlbmN5IGtleSBmb3IgYSB3YWl0LWNvbnRpbnVhdGlvblxuICogbWVzc2FnZS4gYHRpbWVvdXRTZWNvbmRzYCBpcyB0aGUgdGltZSB1bnRpbCB0aGUgd2FpdCdzIGByZXN1bWVBdGBcbiAqIChmbG9vcmVkIGF0IDFzIGJ5IHRoZSBzdXNwZW5zaW9uIGhhbmRsZXIpOyBgd2FpdENvcnJlbGF0aW9uSWRgXG4gKiBpZGVudGlmaWVzIHRoZSB3YWl0IHNvIHJlcGVhdGVkIHN1c3BlbnNpb24gcGFzc2VzIGRlZHVwZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdhaXRDb250aW51YXRpb25EaXNwYXRjaChcbiAgdGltZW91dFNlY29uZHM6IG51bWJlcixcbiAgd2FpdENvcnJlbGF0aW9uSWQ6IHN0cmluZyxcbiAgbm93OiBudW1iZXIgPSBEYXRlLm5vdygpXG4pOiBXYWl0Q29udGludWF0aW9uRGlzcGF0Y2gge1xuICBjb25zdCBtYXhEZWxheVNlY29uZHMgPSBnZXRXYWl0Q29udGludWF0aW9uTWF4RGVsYXlTZWNvbmRzKCk7XG4gIC8vIFRoZSBuZWFyLWVsYXBzZWQgYnJhbmNoIHJldHVybnMgdGhlIGZ1bGwgcmVtYWluaW5nIHRpbWUgYXMgdGhlIGRlbGF5LCBzb1xuICAvLyBpdHMgdGhyZXNob2xkIGNhbiBuZXZlciBleGNlZWQgdGhlIG1heCBkZWxheSDigJQgb3RoZXJ3aXNlIGEgd2FpdCBiZXR3ZWVuIHRoZVxuICAvLyBtYXggYW5kIHRoZSB0aHJlc2hvbGQgd291bGQgYmUgZGlzcGF0Y2hlZCB3aXRoIGEgZGVsYXkgYWJvdmUgdGhlIG1heC4gQ2FwXG4gIC8vIHRoZSB0aHJlc2hvbGQgYXQgdGhlIG1heCBzbyBldmVyeSBicmFuY2ggeWllbGRzIGEgZGVsYXkgd2l0aGluIGl0LiAoV2l0aFxuICAvLyBkZWZhdWx0cyDigJQgdGhyZXNob2xkIDJzLCBtYXggODJfODAwcyDigJQgdGhpcyBpcyBhIG5vLW9wOyBpdCBvbmx5IGJpdGVzIHdoZW5cbiAgLy8gdGhlIG1heCBpcyB0dW5lZCBkb3duIGJlbG93IHRoZSB0aHJlc2hvbGQgZm9yIHRlc3RpbmcuKVxuICBjb25zdCBuZWFyRWxhcHNlZFRocmVzaG9sZCA9IE1hdGgubWluKFxuICAgIGdldE5lYXJFbGFwc2VkV2FpdFRocmVzaG9sZFNlY29uZHMoKSxcbiAgICBtYXhEZWxheVNlY29uZHNcbiAgKTtcbiAgaWYgKHRpbWVvdXRTZWNvbmRzIDw9IG5lYXJFbGFwc2VkVGhyZXNob2xkKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRlbGF5U2Vjb25kczogdGltZW91dFNlY29uZHMsXG4gICAgICBpZGVtcG90ZW5jeUtleTogYCR7d2FpdENvcnJlbGF0aW9uSWR9OiR7TWF0aC5mbG9vcihub3cgLyAxMDAwKX1gLFxuICAgIH07XG4gIH1cblxuICBjb25zdCBob3AgPSBNYXRoLmNlaWwodGltZW91dFNlY29uZHMgLyBtYXhEZWxheVNlY29uZHMpO1xuICByZXR1cm4ge1xuICAgIGRlbGF5U2Vjb25kczogTWF0aC5taW4odGltZW91dFNlY29uZHMsIG1heERlbGF5U2Vjb25kcyksXG4gICAgaWRlbXBvdGVuY3lLZXk6XG4gICAgICBob3AgPT09IDEgPyB3YWl0Q29ycmVsYXRpb25JZCA6IGAke3dhaXRDb3JyZWxhdGlvbklkfTpob3AtJHtob3B9YCxcbiAgfTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export declare function waitUntil(promise: Promise<unknown>): void;
|
|
2
|
+
/**
|
|
3
|
+
* Schedule a background promise via `waitUntil`, guaranteeing that the
|
|
4
|
+
* promise handed to `waitUntil` can never reject. Nothing consumes a
|
|
5
|
+
* `waitUntil` promise, so a rejection surfaces as an `unhandledRejection`
|
|
6
|
+
* and can crash the process — even when the same underlying error is
|
|
7
|
+
* correctly handled by an awaited copy elsewhere.
|
|
8
|
+
*
|
|
9
|
+
* Expected client-disconnect errors (`AbortError` / `ResponseAborted`)
|
|
10
|
+
* are ignored. Any other error is passed to `onError` and swallowed.
|
|
11
|
+
*/
|
|
12
|
+
export declare function safeWaitUntil(promise: Promise<unknown>, onError: (err: unknown) => void): void;
|
|
13
|
+
/**
|
|
14
|
+
* A small wrapper around `waitUntil` that also returns
|
|
15
|
+
* the result of the awaited promise.
|
|
16
|
+
*/
|
|
17
|
+
export declare function waitedUntil<T>(fn: () => Promise<T>): Promise<T>;
|
|
18
|
+
//# sourceMappingURL=wait-until.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wait-until.d.ts","sourceRoot":"","sources":["../../src/runtime/wait-until.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAIzD;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,EACzB,OAAO,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,GAC9B,IAAI,CAcN;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAUrE"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export function waitUntil(promise) {
|
|
2
|
+
void import('@vercel/functions').then(({ waitUntil }) => {
|
|
3
|
+
waitUntil(promise);
|
|
4
|
+
});
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Schedule a background promise via `waitUntil`, guaranteeing that the
|
|
8
|
+
* promise handed to `waitUntil` can never reject. Nothing consumes a
|
|
9
|
+
* `waitUntil` promise, so a rejection surfaces as an `unhandledRejection`
|
|
10
|
+
* and can crash the process — even when the same underlying error is
|
|
11
|
+
* correctly handled by an awaited copy elsewhere.
|
|
12
|
+
*
|
|
13
|
+
* Expected client-disconnect errors (`AbortError` / `ResponseAborted`)
|
|
14
|
+
* are ignored. Any other error is passed to `onError` and swallowed.
|
|
15
|
+
*/
|
|
16
|
+
export function safeWaitUntil(promise, onError) {
|
|
17
|
+
waitUntil(promise.catch((err) => {
|
|
18
|
+
const isAbortError = err?.name === 'AbortError' || err?.name === 'ResponseAborted';
|
|
19
|
+
if (!isAbortError) {
|
|
20
|
+
try {
|
|
21
|
+
onError(err);
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
// Never let onError break the no-reject guarantee.
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}));
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* A small wrapper around `waitUntil` that also returns
|
|
31
|
+
* the result of the awaited promise.
|
|
32
|
+
*/
|
|
33
|
+
export async function waitedUntil(fn) {
|
|
34
|
+
const result = fn();
|
|
35
|
+
waitUntil(result.catch(() => {
|
|
36
|
+
// Ignore error from the promise being rejected.
|
|
37
|
+
// It's expected that the invoker of `waitedUntil`
|
|
38
|
+
// will handle the error.
|
|
39
|
+
}));
|
|
40
|
+
return result;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FpdC11bnRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL3dhaXQtdW50aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxVQUFVLFNBQVMsQ0FBQyxPQUF5QjtJQUNqRCxLQUFLLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRTtRQUN0RCxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDckIsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FDM0IsT0FBeUIsRUFDekIsT0FBK0I7SUFFL0IsU0FBUyxDQUNQLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtRQUNwQixNQUFNLFlBQVksR0FDaEIsR0FBRyxFQUFFLElBQUksS0FBSyxZQUFZLElBQUksR0FBRyxFQUFFLElBQUksS0FBSyxpQkFBaUIsQ0FBQztRQUNoRSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDO2dCQUNILE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNmLENBQUM7WUFBQyxNQUFNLENBQUM7Z0JBQ1AsbURBQW1EO1lBQ3JELENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQ0gsQ0FBQztBQUNKLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLFdBQVcsQ0FBSSxFQUFvQjtJQUN2RCxNQUFNLE1BQU0sR0FBRyxFQUFFLEVBQUUsQ0FBQztJQUNwQixTQUFTLENBQ1AsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUU7UUFDaEIsZ0RBQWdEO1FBQ2hELGtEQUFrRDtRQUNsRCx5QkFBeUI7SUFDM0IsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNGLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gd2FpdFVudGlsKHByb21pc2U6IFByb21pc2U8dW5rbm93bj4pOiB2b2lkIHtcbiAgdm9pZCBpbXBvcnQoJ0B2ZXJjZWwvZnVuY3Rpb25zJykudGhlbigoeyB3YWl0VW50aWwgfSkgPT4ge1xuICAgIHdhaXRVbnRpbChwcm9taXNlKTtcbiAgfSk7XG59XG5cbi8qKlxuICogU2NoZWR1bGUgYSBiYWNrZ3JvdW5kIHByb21pc2UgdmlhIGB3YWl0VW50aWxgLCBndWFyYW50ZWVpbmcgdGhhdCB0aGVcbiAqIHByb21pc2UgaGFuZGVkIHRvIGB3YWl0VW50aWxgIGNhbiBuZXZlciByZWplY3QuIE5vdGhpbmcgY29uc3VtZXMgYVxuICogYHdhaXRVbnRpbGAgcHJvbWlzZSwgc28gYSByZWplY3Rpb24gc3VyZmFjZXMgYXMgYW4gYHVuaGFuZGxlZFJlamVjdGlvbmBcbiAqIGFuZCBjYW4gY3Jhc2ggdGhlIHByb2Nlc3Mg4oCUIGV2ZW4gd2hlbiB0aGUgc2FtZSB1bmRlcmx5aW5nIGVycm9yIGlzXG4gKiBjb3JyZWN0bHkgaGFuZGxlZCBieSBhbiBhd2FpdGVkIGNvcHkgZWxzZXdoZXJlLlxuICpcbiAqIEV4cGVjdGVkIGNsaWVudC1kaXNjb25uZWN0IGVycm9ycyAoYEFib3J0RXJyb3JgIC8gYFJlc3BvbnNlQWJvcnRlZGApXG4gKiBhcmUgaWdub3JlZC4gQW55IG90aGVyIGVycm9yIGlzIHBhc3NlZCB0byBgb25FcnJvcmAgYW5kIHN3YWxsb3dlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNhZmVXYWl0VW50aWwoXG4gIHByb21pc2U6IFByb21pc2U8dW5rbm93bj4sXG4gIG9uRXJyb3I6IChlcnI6IHVua25vd24pID0+IHZvaWRcbik6IHZvaWQge1xuICB3YWl0VW50aWwoXG4gICAgcHJvbWlzZS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICBjb25zdCBpc0Fib3J0RXJyb3IgPVxuICAgICAgICBlcnI/Lm5hbWUgPT09ICdBYm9ydEVycm9yJyB8fCBlcnI/Lm5hbWUgPT09ICdSZXNwb25zZUFib3J0ZWQnO1xuICAgICAgaWYgKCFpc0Fib3J0RXJyb3IpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBvbkVycm9yKGVycik7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIE5ldmVyIGxldCBvbkVycm9yIGJyZWFrIHRoZSBuby1yZWplY3QgZ3VhcmFudGVlLlxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgKTtcbn1cblxuLyoqXG4gKiBBIHNtYWxsIHdyYXBwZXIgYXJvdW5kIGB3YWl0VW50aWxgIHRoYXQgYWxzbyByZXR1cm5zXG4gKiB0aGUgcmVzdWx0IG9mIHRoZSBhd2FpdGVkIHByb21pc2UuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3YWl0ZWRVbnRpbDxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICBjb25zdCByZXN1bHQgPSBmbigpO1xuICB3YWl0VW50aWwoXG4gICAgcmVzdWx0LmNhdGNoKCgpID0+IHtcbiAgICAgIC8vIElnbm9yZSBlcnJvciBmcm9tIHRoZSBwcm9taXNlIGJlaW5nIHJlamVjdGVkLlxuICAgICAgLy8gSXQncyBleHBlY3RlZCB0aGF0IHRoZSBpbnZva2VyIG9mIGB3YWl0ZWRVbnRpbGBcbiAgICAgIC8vIHdpbGwgaGFuZGxlIHRoZSBlcnJvci5cbiAgICB9KVxuICApO1xuICByZXR1cm4gcmVzdWx0O1xufVxuIl19
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { World } from '@workflow/world';
|
|
2
|
+
type WorldSpecVersionMetadata = Pick<World, 'specVersion'>;
|
|
3
|
+
/**
|
|
4
|
+
* Rejects a World this runtime cannot speak to.
|
|
5
|
+
*
|
|
6
|
+
* The accepted range is `[SPEC_VERSION_CURRENT, SPEC_VERSION_MAX_SUPPORTED]`.
|
|
7
|
+
* Below the current version means an old World package paired with a new
|
|
8
|
+
* runtime, which cannot serve the protocol this runtime speaks. Above the
|
|
9
|
+
* ceiling means a World built against a newer spec than this runtime knows how
|
|
10
|
+
* to read.
|
|
11
|
+
*
|
|
12
|
+
* The range has a floor and a ceiling rather than a single value because a
|
|
13
|
+
* World may opt into a spec version above the default: `world-vercel` declares
|
|
14
|
+
* the slot-identity version so its new runs are created with slot event ids,
|
|
15
|
+
* while every other World stays on the default. An equality check would make
|
|
16
|
+
* this runtime refuse the adapter shipped alongside it.
|
|
17
|
+
*/
|
|
18
|
+
export declare function assertWorldSupportsRuntimeProtocol(world: WorldSpecVersionMetadata): void;
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=world-compatibility.d.ts.map
|
|
@@ -0,0 +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;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kCAAkC,CAChD,KAAK,EAAE,wBAAwB,GAC9B,IAAI,CAkBN"}
|