@workflow/core 5.0.0-beta.5 → 5.0.0-beta.51
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/README.md +5 -0
- package/dist/attribute-changes.d.ts +5 -0
- package/dist/attribute-changes.d.ts.map +1 -0
- package/dist/attribute-changes.js +25 -0
- package/dist/capabilities.d.ts +35 -2
- package/dist/capabilities.d.ts.map +1 -1
- package/dist/capabilities.js +74 -5
- package/dist/capture-stack.d.ts +1 -1
- package/dist/capture-stack.js +2 -2
- 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 +19 -3
- package/dist/classify-error.d.ts.map +1 -1
- package/dist/classify-error.js +98 -6
- package/dist/context-violation-error.d.ts +5 -5
- package/dist/context-violation-error.d.ts.map +1 -1
- package/dist/context-violation-error.js +8 -6
- package/dist/create-hook.d.ts +72 -7
- package/dist/create-hook.d.ts.map +1 -1
- package/dist/create-hook.js +1 -1
- package/dist/define-hook.js +2 -2
- package/dist/describe-error.d.ts +7 -7
- package/dist/describe-error.d.ts.map +1 -1
- package/dist/describe-error.js +97 -12
- package/dist/encryption.d.ts +38 -4
- package/dist/encryption.d.ts.map +1 -1
- package/dist/encryption.js +96 -14
- package/dist/events-consumer.d.ts +297 -0
- package/dist/events-consumer.d.ts.map +1 -1
- package/dist/events-consumer.js +673 -42
- package/dist/flushable-stream.d.ts +97 -1
- package/dist/flushable-stream.d.ts.map +1 -1
- package/dist/flushable-stream.js +291 -11
- package/dist/global.d.ts +36 -2
- package/dist/global.d.ts.map +1 -1
- package/dist/global.js +21 -6
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/log-format.d.ts +2 -2
- package/dist/log-format.js +19 -12
- package/dist/logger.d.ts +1 -0
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +10 -6
- package/dist/private.d.ts +226 -9
- package/dist/private.d.ts.map +1 -1
- package/dist/private.js +626 -7
- package/dist/replay-divergence.d.ts +25 -0
- package/dist/replay-divergence.d.ts.map +1 -0
- package/dist/replay-divergence.js +61 -0
- package/dist/replay-payload-cache.d.ts +64 -0
- package/dist/replay-payload-cache.d.ts.map +1 -0
- package/dist/replay-payload-cache.js +158 -0
- package/dist/runtime/compute-instance.d.ts +13 -0
- package/dist/runtime/compute-instance.d.ts.map +1 -0
- package/dist/runtime/compute-instance.js +14 -0
- package/dist/runtime/constants.d.ts +315 -0
- package/dist/runtime/constants.d.ts.map +1 -1
- package/dist/runtime/constants.js +502 -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 +15 -0
- package/dist/runtime/get-port-lazy.d.ts.map +1 -1
- package/dist/runtime/get-port-lazy.js +75 -6
- package/dist/runtime/get-world-lazy.d.ts +5 -14
- package/dist/runtime/get-world-lazy.d.ts.map +1 -1
- package/dist/runtime/get-world-lazy.js +19 -29
- package/dist/runtime/helpers.d.ts +415 -29
- package/dist/runtime/helpers.d.ts.map +1 -1
- package/dist/runtime/helpers.js +686 -57
- 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 +158 -0
- package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -0
- package/dist/runtime/quickjs-entrypoint.js +1863 -0
- package/dist/runtime/quickjs-log-view.d.ts +129 -0
- package/dist/runtime/quickjs-log-view.d.ts.map +1 -0
- package/dist/runtime/quickjs-log-view.js +229 -0
- package/dist/runtime/quickjs-runtime.d.ts +244 -0
- package/dist/runtime/quickjs-runtime.d.ts.map +1 -0
- package/dist/runtime/quickjs-runtime.js +2427 -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 +2159 -0
- package/dist/runtime/replay-budget.d.ts +97 -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 +91 -8
- package/dist/runtime/resume-hook.d.ts.map +1 -1
- package/dist/runtime/resume-hook.js +512 -89
- package/dist/runtime/resume-latency.d.ts +150 -0
- package/dist/runtime/resume-latency.d.ts.map +1 -0
- package/dist/runtime/resume-latency.js +155 -0
- 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 +72 -7
- package/dist/runtime/run.d.ts.map +1 -1
- package/dist/runtime/run.js +280 -53
- package/dist/runtime/runs.d.ts +54 -3
- package/dist/runtime/runs.d.ts.map +1 -1
- package/dist/runtime/runs.js +126 -16
- package/dist/runtime/start.d.ts +101 -2
- package/dist/runtime/start.d.ts.map +1 -1
- package/dist/runtime/start.js +352 -61
- package/dist/runtime/step-executor.d.ts +186 -5
- package/dist/runtime/step-executor.d.ts.map +1 -1
- package/dist/runtime/step-executor.js +768 -130
- package/dist/runtime/step-latency.d.ts +220 -0
- package/dist/runtime/step-latency.d.ts.map +1 -0
- package/dist/runtime/step-latency.js +215 -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 +75 -0
- package/dist/runtime/suspension-handler.d.ts +247 -7
- package/dist/runtime/suspension-handler.d.ts.map +1 -1
- package/dist/runtime/suspension-handler.js +1304 -125
- package/dist/runtime/unserializable-step.d.ts +34 -0
- package/dist/runtime/unserializable-step.d.ts.map +1 -0
- package/dist/runtime/unserializable-step.js +52 -0
- package/dist/runtime/vm-mode.d.ts +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 +106 -0
- package/dist/runtime/wait-continuation.d.ts.map +1 -0
- package/dist/runtime/wait-continuation.js +136 -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 +32 -0
- package/dist/runtime/world-compatibility.d.ts.map +1 -0
- package/dist/runtime/world-compatibility.js +44 -0
- package/dist/runtime/world-init.d.ts +17 -42
- package/dist/runtime/world-init.d.ts.map +1 -1
- package/dist/runtime/world-init.js +18 -43
- package/dist/runtime/world.d.ts +14 -2
- package/dist/runtime/world.d.ts.map +1 -1
- package/dist/runtime/world.js +75 -19
- package/dist/runtime.d.ts +10 -6
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +3911 -489
- 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 +3 -3
- package/dist/serialization/client.d.ts.map +1 -1
- package/dist/serialization/client.js +8 -4
- 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 +1 -1
- package/dist/serialization/codec-devalue.d.ts.map +1 -1
- package/dist/serialization/codec-devalue.js +24 -6
- package/dist/serialization/codec.d.ts +37 -2
- package/dist/serialization/codec.d.ts.map +1 -1
- package/dist/serialization/codec.js +2 -2
- package/dist/serialization/compression.d.ts +105 -0
- package/dist/serialization/compression.d.ts.map +1 -0
- package/dist/serialization/compression.js +261 -0
- package/dist/serialization/encryption.d.ts +119 -17
- package/dist/serialization/encryption.d.ts.map +1 -1
- package/dist/serialization/encryption.js +152 -17
- package/dist/serialization/errors.d.ts +13 -0
- package/dist/serialization/errors.d.ts.map +1 -1
- package/dist/serialization/errors.js +20 -2
- package/dist/serialization/format.d.ts +6 -6
- package/dist/serialization/format.js +7 -7
- package/dist/serialization/hardened.d.ts +156 -0
- package/dist/serialization/hardened.d.ts.map +1 -0
- package/dist/serialization/hardened.js +538 -0
- package/dist/serialization/index.d.ts +10 -8
- package/dist/serialization/index.d.ts.map +1 -1
- package/dist/serialization/index.js +10 -8
- 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.map +1 -1
- package/dist/serialization/reducers/class.js +11 -6
- 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 +616 -0
- package/dist/serialization/reducers/common.d.ts +1 -1
- package/dist/serialization/reducers/common.d.ts.map +1 -1
- package/dist/serialization/reducers/common.js +202 -62
- 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.map +1 -1
- package/dist/serialization/reducers/step-function.js +25 -9
- package/dist/serialization/step.d.ts +4 -4
- package/dist/serialization/step.d.ts.map +1 -1
- package/dist/serialization/step.js +9 -5
- package/dist/serialization/types.d.ts +80 -1
- package/dist/serialization/types.d.ts.map +1 -1
- package/dist/serialization/types.js +15 -1
- 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 +74 -0
- package/dist/serialization-format.d.ts +64 -8
- package/dist/serialization-format.d.ts.map +1 -1
- package/dist/serialization-format.js +225 -73
- package/dist/serialization.d.ts +262 -34
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +1885 -277
- 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/source-map.d.ts +25 -0
- package/dist/source-map.d.ts.map +1 -1
- package/dist/source-map.js +154 -10
- package/dist/step/context-storage.d.ts +63 -2
- package/dist/step/context-storage.d.ts.map +1 -1
- package/dist/step/context-storage.js +7 -5
- package/dist/step/writable-stream.d.ts +3 -3
- package/dist/step/writable-stream.d.ts.map +1 -1
- package/dist/step/writable-stream.js +80 -13
- package/dist/step.d.ts.map +1 -1
- package/dist/step.js +148 -27
- package/dist/symbols.d.ts +50 -0
- package/dist/symbols.d.ts.map +1 -1
- package/dist/symbols.js +51 -1
- package/dist/telemetry/semantic-conventions.d.ts +433 -2
- package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
- package/dist/telemetry/semantic-conventions.js +319 -3
- package/dist/telemetry.d.ts +91 -0
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +244 -17
- package/dist/test-support/orchestrator-context.d.ts +25 -0
- package/dist/test-support/orchestrator-context.d.ts.map +1 -0
- package/dist/test-support/orchestrator-context.js +107 -0
- 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 +0 -5
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +1 -15
- 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 +84 -14
- package/dist/vm/script-cache.d.ts +26 -0
- package/dist/vm/script-cache.d.ts.map +1 -0
- package/dist/vm/script-cache.js +131 -0
- package/dist/vm/uint8array-base64.js +1 -1
- package/dist/workflow/abort-controller.d.ts +2 -2
- package/dist/workflow/abort-controller.d.ts.map +1 -1
- package/dist/workflow/abort-controller.js +88 -21
- 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 +45 -0
- package/dist/workflow/create-hook.d.ts.map +1 -1
- package/dist/workflow/create-hook.js +24 -3
- package/dist/workflow/get-workflow-metadata.js +2 -2
- package/dist/workflow/hook.d.ts.map +1 -1
- package/dist/workflow/hook.js +304 -47
- package/dist/workflow/index.d.ts +1 -0
- package/dist/workflow/index.d.ts.map +1 -1
- package/dist/workflow/index.js +2 -1
- 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 +58 -12
- package/dist/workflow/world-init-stub.d.ts +3 -3
- package/dist/workflow/world-init-stub.js +4 -4
- package/dist/workflow.d.ts +95 -3
- package/dist/workflow.d.ts.map +1 -1
- package/dist/workflow.js +900 -561
- package/docs/api-reference/create-hook.mdx +89 -10
- package/docs/api-reference/create-webhook.mdx +16 -15
- package/docs/api-reference/define-hook.mdx +35 -33
- package/docs/api-reference/fatal-error.mdx +30 -8
- package/docs/api-reference/fetch.mdx +14 -10
- package/docs/api-reference/get-step-metadata.mdx +2 -2
- package/docs/api-reference/get-workflow-metadata.mdx +3 -3
- package/docs/api-reference/get-writable.mdx +7 -7
- package/docs/api-reference/index.mdx +4 -1
- package/docs/api-reference/retryable-error.mdx +1 -1
- package/docs/api-reference/set-attributes.mdx +61 -0
- package/docs/api-reference/sleep.mdx +4 -4
- package/docs/foundations/cancellation.mdx +31 -32
- package/docs/foundations/errors-and-retries.mdx +42 -11
- package/docs/foundations/hooks.mdx +64 -35
- package/docs/foundations/idempotency.mdx +244 -12
- package/docs/foundations/index.mdx +1 -23
- package/docs/foundations/meta.json +2 -1
- package/docs/foundations/serialization.mdx +21 -22
- package/docs/foundations/starting-workflows.mdx +106 -30
- package/docs/foundations/streaming.mdx +108 -60
- package/docs/foundations/versioning.mdx +263 -0
- package/docs/foundations/workflows-and-steps.mdx +9 -9
- package/docs/how-it-works/cancellation.mdx +63 -63
- package/docs/how-it-works/code-transform.mdx +83 -67
- package/docs/how-it-works/encryption.mdx +30 -26
- package/docs/how-it-works/event-sourcing.mdx +125 -34
- package/docs/how-it-works/framework-integrations.mdx +96 -337
- package/docs/how-it-works/understanding-directives.mdx +22 -22
- package/package.json +24 -15
- 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 -776
package/dist/workflow/index.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ export { sleep } from '../sleep.js';
|
|
|
5
5
|
export { createHook, createWebhook } from './create-hook.js';
|
|
6
6
|
export { defineHook } from './define-hook.js';
|
|
7
7
|
export { getWorkflowMetadata } from './get-workflow-metadata.js';
|
|
8
|
+
export { type SetAttributesOptions, setAttributes, } from './set-attributes.js';
|
|
8
9
|
export { getWritable } from './writable-stream.js';
|
|
9
10
|
export declare function getStepMetadata(): StepMetadata;
|
|
10
11
|
export declare function resumeHook(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/workflow/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAEjE,OAAO,EACL,UAAU,EACV,cAAc,EACd,KAAK,qBAAqB,GAC3B,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAInD,wBAAgB,eAAe,IAAI,YAAY,CAM9C;AACD,wBAAgB,UAAU,SAMzB"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/workflow/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAEjE,OAAO,EACL,UAAU,EACV,cAAc,EACd,KAAK,qBAAqB,GAC3B,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EACL,KAAK,oBAAoB,EACzB,aAAa,GACd,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAInD,wBAAgB,eAAe,IAAI,YAAY,CAM9C;AACD,wBAAgB,UAAU,SAMzB"}
|
package/dist/workflow/index.js
CHANGED
|
@@ -4,6 +4,7 @@ export { sleep } from '../sleep.js';
|
|
|
4
4
|
export { createHook, createWebhook } from './create-hook.js';
|
|
5
5
|
export { defineHook } from './define-hook.js';
|
|
6
6
|
export { getWorkflowMetadata } from './get-workflow-metadata.js';
|
|
7
|
+
export { setAttributes, } from './set-attributes.js';
|
|
7
8
|
export { getWritable } from './writable-stream.js';
|
|
8
9
|
// workflows can't use these functions, but we still need to provide
|
|
9
10
|
// the export so bundling doesn't fail when step and workflow are in same file
|
|
@@ -13,4 +14,4 @@ export function getStepMetadata() {
|
|
|
13
14
|
export function resumeHook() {
|
|
14
15
|
throwUnavailableInWorkflowContext('resumeHook()', 'https://workflow-sdk.dev/docs/api-reference/workflow-api/resume-hook', resumeHook);
|
|
15
16
|
}
|
|
16
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd29ya2Zsb3cvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHFCQUFxQixFQUNyQixpQ0FBaUMsR0FDbEMsTUFBTSxzQkFBc0IsQ0FBQztBQUc5QixPQUFPLEVBQ0wsVUFBVSxFQUNWLGNBQWMsR0FFZixNQUFNLGtCQUFrQixDQUFDO0FBRTFCLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDcEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDOUMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDakUsT0FBTyxFQUVMLGFBQWEsR0FDZCxNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVuRCxvRUFBb0U7QUFDcEUsOEVBQThFO0FBQzlFLE1BQU0sVUFBVSxlQUFlO0lBQzdCLHFCQUFxQixDQUNuQixtQkFBbUIsRUFDbkIsd0VBQXdFLEVBQ3hFLGVBQWUsQ0FDaEIsQ0FBQztBQUNKLENBQUM7QUFDRCxNQUFNLFVBQVUsVUFBVTtJQUN4QixpQ0FBaUMsQ0FDL0IsY0FBYyxFQUNkLHNFQUFzRSxFQUN0RSxVQUFVLENBQ1gsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICB0aHJvd05vdEluU3RlcENvbnRleHQsXG4gIHRocm93VW5hdmFpbGFibGVJbldvcmtmbG93Q29udGV4dCxcbn0gZnJvbSAnLi4vY29udGV4dC1lcnJvcnMuanMnO1xuaW1wb3J0IHR5cGUgeyBTdGVwTWV0YWRhdGEgfSBmcm9tICcuLi9zdGVwL2dldC1zdGVwLW1ldGFkYXRhLmpzJztcblxuZXhwb3J0IHtcbiAgRmF0YWxFcnJvcixcbiAgUmV0cnlhYmxlRXJyb3IsXG4gIHR5cGUgUmV0cnlhYmxlRXJyb3JPcHRpb25zLFxufSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmV4cG9ydCB0eXBlIHsgSG9vaywgSG9va09wdGlvbnMgfSBmcm9tICcuLi9jcmVhdGUtaG9vay5qcyc7XG5leHBvcnQgeyBzbGVlcCB9IGZyb20gJy4uL3NsZWVwLmpzJztcbmV4cG9ydCB7IGNyZWF0ZUhvb2ssIGNyZWF0ZVdlYmhvb2sgfSBmcm9tICcuL2NyZWF0ZS1ob29rLmpzJztcbmV4cG9ydCB7IGRlZmluZUhvb2sgfSBmcm9tICcuL2RlZmluZS1ob29rLmpzJztcbmV4cG9ydCB7IGdldFdvcmtmbG93TWV0YWRhdGEgfSBmcm9tICcuL2dldC13b3JrZmxvdy1tZXRhZGF0YS5qcyc7XG5leHBvcnQge1xuICB0eXBlIFNldEF0dHJpYnV0ZXNPcHRpb25zLFxuICBzZXRBdHRyaWJ1dGVzLFxufSBmcm9tICcuL3NldC1hdHRyaWJ1dGVzLmpzJztcbmV4cG9ydCB7IGdldFdyaXRhYmxlIH0gZnJvbSAnLi93cml0YWJsZS1zdHJlYW0uanMnO1xuXG4vLyB3b3JrZmxvd3MgY2FuJ3QgdXNlIHRoZXNlIGZ1bmN0aW9ucywgYnV0IHdlIHN0aWxsIG5lZWQgdG8gcHJvdmlkZVxuLy8gdGhlIGV4cG9ydCBzbyBidW5kbGluZyBkb2Vzbid0IGZhaWwgd2hlbiBzdGVwIGFuZCB3b3JrZmxvdyBhcmUgaW4gc2FtZSBmaWxlXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RlcE1ldGFkYXRhKCk6IFN0ZXBNZXRhZGF0YSB7XG4gIHRocm93Tm90SW5TdGVwQ29udGV4dChcbiAgICAnZ2V0U3RlcE1ldGFkYXRhKCknLFxuICAgICdodHRwczovL3dvcmtmbG93LXNkay5kZXYvZG9jcy9hcGktcmVmZXJlbmNlL3dvcmtmbG93L2dldC1zdGVwLW1ldGFkYXRhJyxcbiAgICBnZXRTdGVwTWV0YWRhdGFcbiAgKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZXN1bWVIb29rKCkge1xuICB0aHJvd1VuYXZhaWxhYmxlSW5Xb3JrZmxvd0NvbnRleHQoXG4gICAgJ3Jlc3VtZUhvb2soKScsXG4gICAgJ2h0dHBzOi8vd29ya2Zsb3ctc2RrLmRldi9kb2NzL2FwaS1yZWZlcmVuY2Uvd29ya2Zsb3ctYXBpL3Jlc3VtZS1ob29rJyxcbiAgICByZXN1bWVIb29rXG4gICk7XG59XG4iXX0=
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Options accepted by `setAttributes`.
|
|
3
|
+
*/
|
|
4
|
+
export interface SetAttributesOptions {
|
|
5
|
+
/**
|
|
6
|
+
* Permit attribute keys that start with the reserved `$` prefix.
|
|
7
|
+
* **Default: `false`.**
|
|
8
|
+
*
|
|
9
|
+
* The `$` namespace is reserved for framework and library code that
|
|
10
|
+
* is built on top of the workflow SDK (telemetry, agent metadata,
|
|
11
|
+
* platform-emitted tags, etc.). User code MUST NOT write keys in
|
|
12
|
+
* this namespace; validation rejects them so accidental collisions
|
|
13
|
+
* with tooling-owned keys can't slip through.
|
|
14
|
+
*
|
|
15
|
+
* Only flip this to `true` if your caller is itself a framework or
|
|
16
|
+
* library that owns a `$`-prefixed sub-namespace and knows the
|
|
17
|
+
* conventions of any other tools writing into it. Misuse can
|
|
18
|
+
* conflict with observability surfaces, agent dashboards, or future
|
|
19
|
+
* platform features that rely on the reserved namespace.
|
|
20
|
+
*/
|
|
21
|
+
allowReservedAttributes?: boolean;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Attach plaintext string key/value metadata to the current workflow run.
|
|
25
|
+
*
|
|
26
|
+
* Callable only from a workflow body (`'use workflow'`). The call is
|
|
27
|
+
* dispatched as a native `attr_set` event and materialized on the run.
|
|
28
|
+
*
|
|
29
|
+
* Validation runs in the VM (cheap, deterministic) before event
|
|
30
|
+
* dispatch - violations throw `FatalError` without writing an event. An
|
|
31
|
+
* empty record is a no-op. `value: undefined` removes the key from the
|
|
32
|
+
* run's attribute map.
|
|
33
|
+
*
|
|
34
|
+
* **Reserved namespace.** Keys starting with `$` are reserved for
|
|
35
|
+
* framework/library code (telemetry, agent metadata, etc.). User code
|
|
36
|
+
* trying to write a `$`-prefixed key throws `FatalError`. If you are a
|
|
37
|
+
* framework author and need to set a reserved key, pass
|
|
38
|
+
* `{ allowReservedAttributes: true }` as the second argument; see
|
|
39
|
+
* `SetAttributesOptions` for the trade-offs.
|
|
40
|
+
*
|
|
41
|
+
* **WARNING**: Calling e.g.
|
|
42
|
+
* `Promise.all([setAttributes({ a: '1' }), setAttributes({ a: '2' })])`
|
|
43
|
+
* is not guaranteed to be ordered consistently, but the equivalent
|
|
44
|
+
* sequential `.then()` chain is.
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* ```ts
|
|
48
|
+
* import { setAttributes } from 'workflow';
|
|
49
|
+
*
|
|
50
|
+
* export async function myWorkflow() {
|
|
51
|
+
* 'use workflow';
|
|
52
|
+
* await setAttributes({ phase: 'init' });
|
|
53
|
+
* // ... work ...
|
|
54
|
+
* await setAttributes({ phase: 'done', orderId: 'ord_123' });
|
|
55
|
+
* await setAttributes({ orderId: undefined }); // remove
|
|
56
|
+
* }
|
|
57
|
+
* ```
|
|
58
|
+
*
|
|
59
|
+
* @example Framework / library code writing into the reserved namespace.
|
|
60
|
+
* ```ts
|
|
61
|
+
* await setAttributes(
|
|
62
|
+
* { '$agent.kind': 'durable-agent' },
|
|
63
|
+
* { allowReservedAttributes: true }
|
|
64
|
+
* );
|
|
65
|
+
* ```
|
|
66
|
+
*/
|
|
67
|
+
export declare function setAttributes(attrs: Record<string, string | undefined>, options?: SetAttributesOptions): Promise<void>;
|
|
68
|
+
//# sourceMappingURL=set-attributes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set-attributes.d.ts","sourceRoot":"","sources":["../../src/workflow/set-attributes.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;;;;;;;;;;;;;OAeG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EACzC,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,IAAI,CAAC,CAsBf"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { FatalError } from '@workflow/errors';
|
|
2
|
+
import { normalizeAttributeChanges } from '../attribute-changes.js';
|
|
3
|
+
import { WORKFLOW_SET_ATTRIBUTES } from '../symbols.js';
|
|
4
|
+
/**
|
|
5
|
+
* Attach plaintext string key/value metadata to the current workflow run.
|
|
6
|
+
*
|
|
7
|
+
* Callable only from a workflow body (`'use workflow'`). The call is
|
|
8
|
+
* dispatched as a native `attr_set` event and materialized on the run.
|
|
9
|
+
*
|
|
10
|
+
* Validation runs in the VM (cheap, deterministic) before event
|
|
11
|
+
* dispatch - violations throw `FatalError` without writing an event. An
|
|
12
|
+
* empty record is a no-op. `value: undefined` removes the key from the
|
|
13
|
+
* run's attribute map.
|
|
14
|
+
*
|
|
15
|
+
* **Reserved namespace.** Keys starting with `$` are reserved for
|
|
16
|
+
* framework/library code (telemetry, agent metadata, etc.). User code
|
|
17
|
+
* trying to write a `$`-prefixed key throws `FatalError`. If you are a
|
|
18
|
+
* framework author and need to set a reserved key, pass
|
|
19
|
+
* `{ allowReservedAttributes: true }` as the second argument; see
|
|
20
|
+
* `SetAttributesOptions` for the trade-offs.
|
|
21
|
+
*
|
|
22
|
+
* **WARNING**: Calling e.g.
|
|
23
|
+
* `Promise.all([setAttributes({ a: '1' }), setAttributes({ a: '2' })])`
|
|
24
|
+
* is not guaranteed to be ordered consistently, but the equivalent
|
|
25
|
+
* sequential `.then()` chain is.
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```ts
|
|
29
|
+
* import { setAttributes } from 'workflow';
|
|
30
|
+
*
|
|
31
|
+
* export async function myWorkflow() {
|
|
32
|
+
* 'use workflow';
|
|
33
|
+
* await setAttributes({ phase: 'init' });
|
|
34
|
+
* // ... work ...
|
|
35
|
+
* await setAttributes({ phase: 'done', orderId: 'ord_123' });
|
|
36
|
+
* await setAttributes({ orderId: undefined }); // remove
|
|
37
|
+
* }
|
|
38
|
+
* ```
|
|
39
|
+
*
|
|
40
|
+
* @example Framework / library code writing into the reserved namespace.
|
|
41
|
+
* ```ts
|
|
42
|
+
* await setAttributes(
|
|
43
|
+
* { '$agent.kind': 'durable-agent' },
|
|
44
|
+
* { allowReservedAttributes: true }
|
|
45
|
+
* );
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
export async function setAttributes(attrs, options = {}) {
|
|
49
|
+
const changes = normalizeAttributeChanges(attrs, options);
|
|
50
|
+
if (changes.length === 0)
|
|
51
|
+
return;
|
|
52
|
+
const allowReservedAttributes = options.allowReservedAttributes === true;
|
|
53
|
+
const dispatchSetAttributes = globalThis[WORKFLOW_SET_ATTRIBUTES];
|
|
54
|
+
if (!dispatchSetAttributes) {
|
|
55
|
+
throw new FatalError('setAttributes() called outside a workflow runtime context. ' +
|
|
56
|
+
'It must be called from within a workflow body (`use workflow`).');
|
|
57
|
+
}
|
|
58
|
+
await dispatchSetAttributes(changes, allowReservedAttributes ? { allowReservedAttributes: true } : {});
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0LWF0dHJpYnV0ZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd29ya2Zsb3cvc2V0LWF0dHJpYnV0ZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRTlDLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQXlCeEQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EyQ0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGFBQWEsQ0FDakMsS0FBeUMsRUFDekMsVUFBZ0MsRUFBRTtJQUVsQyxNQUFNLE9BQU8sR0FBRyx5QkFBeUIsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDMUQsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPO0lBQ2pDLE1BQU0sdUJBQXVCLEdBQUcsT0FBTyxDQUFDLHVCQUF1QixLQUFLLElBQUksQ0FBQztJQUN6RSxNQUFNLHFCQUFxQixHQUFJLFVBQXNDLENBQ25FLHVCQUF1QixDQU1aLENBQUM7SUFDZCxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUMzQixNQUFNLElBQUksVUFBVSxDQUNsQiw2REFBNkQ7WUFDM0QsaUVBQWlFLENBQ3BFLENBQUM7SUFDSixDQUFDO0lBQ0QsTUFBTSxxQkFBcUIsQ0FDekIsT0FBTyxFQUNQLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxFQUFFLHVCQUF1QixFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQ2pFLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRmF0YWxFcnJvciB9IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHR5cGUgeyBBdHRyaWJ1dGVDaGFuZ2UgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgbm9ybWFsaXplQXR0cmlidXRlQ2hhbmdlcyB9IGZyb20gJy4uL2F0dHJpYnV0ZS1jaGFuZ2VzLmpzJztcbmltcG9ydCB7IFdPUktGTE9XX1NFVF9BVFRSSUJVVEVTIH0gZnJvbSAnLi4vc3ltYm9scy5qcyc7XG5cbi8qKlxuICogT3B0aW9ucyBhY2NlcHRlZCBieSBgc2V0QXR0cmlidXRlc2AuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2V0QXR0cmlidXRlc09wdGlvbnMge1xuICAvKipcbiAgICogUGVybWl0IGF0dHJpYnV0ZSBrZXlzIHRoYXQgc3RhcnQgd2l0aCB0aGUgcmVzZXJ2ZWQgYCRgIHByZWZpeC5cbiAgICogKipEZWZhdWx0OiBgZmFsc2VgLioqXG4gICAqXG4gICAqIFRoZSBgJGAgbmFtZXNwYWNlIGlzIHJlc2VydmVkIGZvciBmcmFtZXdvcmsgYW5kIGxpYnJhcnkgY29kZSB0aGF0XG4gICAqIGlzIGJ1aWx0IG9uIHRvcCBvZiB0aGUgd29ya2Zsb3cgU0RLICh0ZWxlbWV0cnksIGFnZW50IG1ldGFkYXRhLFxuICAgKiBwbGF0Zm9ybS1lbWl0dGVkIHRhZ3MsIGV0Yy4pLiBVc2VyIGNvZGUgTVVTVCBOT1Qgd3JpdGUga2V5cyBpblxuICAgKiB0aGlzIG5hbWVzcGFjZTsgdmFsaWRhdGlvbiByZWplY3RzIHRoZW0gc28gYWNjaWRlbnRhbCBjb2xsaXNpb25zXG4gICAqIHdpdGggdG9vbGluZy1vd25lZCBrZXlzIGNhbid0IHNsaXAgdGhyb3VnaC5cbiAgICpcbiAgICogT25seSBmbGlwIHRoaXMgdG8gYHRydWVgIGlmIHlvdXIgY2FsbGVyIGlzIGl0c2VsZiBhIGZyYW1ld29yayBvclxuICAgKiBsaWJyYXJ5IHRoYXQgb3ducyBhIGAkYC1wcmVmaXhlZCBzdWItbmFtZXNwYWNlIGFuZCBrbm93cyB0aGVcbiAgICogY29udmVudGlvbnMgb2YgYW55IG90aGVyIHRvb2xzIHdyaXRpbmcgaW50byBpdC4gTWlzdXNlIGNhblxuICAgKiBjb25mbGljdCB3aXRoIG9ic2VydmFiaWxpdHkgc3VyZmFjZXMsIGFnZW50IGRhc2hib2FyZHMsIG9yIGZ1dHVyZVxuICAgKiBwbGF0Zm9ybSBmZWF0dXJlcyB0aGF0IHJlbHkgb24gdGhlIHJlc2VydmVkIG5hbWVzcGFjZS5cbiAgICovXG4gIGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBdHRhY2ggcGxhaW50ZXh0IHN0cmluZyBrZXkvdmFsdWUgbWV0YWRhdGEgdG8gdGhlIGN1cnJlbnQgd29ya2Zsb3cgcnVuLlxuICpcbiAqIENhbGxhYmxlIG9ubHkgZnJvbSBhIHdvcmtmbG93IGJvZHkgKGAndXNlIHdvcmtmbG93J2ApLiBUaGUgY2FsbCBpc1xuICogZGlzcGF0Y2hlZCBhcyBhIG5hdGl2ZSBgYXR0cl9zZXRgIGV2ZW50IGFuZCBtYXRlcmlhbGl6ZWQgb24gdGhlIHJ1bi5cbiAqXG4gKiBWYWxpZGF0aW9uIHJ1bnMgaW4gdGhlIFZNIChjaGVhcCwgZGV0ZXJtaW5pc3RpYykgYmVmb3JlIGV2ZW50XG4gKiBkaXNwYXRjaCAtIHZpb2xhdGlvbnMgdGhyb3cgYEZhdGFsRXJyb3JgIHdpdGhvdXQgd3JpdGluZyBhbiBldmVudC4gQW5cbiAqIGVtcHR5IHJlY29yZCBpcyBhIG5vLW9wLiBgdmFsdWU6IHVuZGVmaW5lZGAgcmVtb3ZlcyB0aGUga2V5IGZyb20gdGhlXG4gKiBydW4ncyBhdHRyaWJ1dGUgbWFwLlxuICpcbiAqICoqUmVzZXJ2ZWQgbmFtZXNwYWNlLioqIEtleXMgc3RhcnRpbmcgd2l0aCBgJGAgYXJlIHJlc2VydmVkIGZvclxuICogZnJhbWV3b3JrL2xpYnJhcnkgY29kZSAodGVsZW1ldHJ5LCBhZ2VudCBtZXRhZGF0YSwgZXRjLikuIFVzZXIgY29kZVxuICogdHJ5aW5nIHRvIHdyaXRlIGEgYCRgLXByZWZpeGVkIGtleSB0aHJvd3MgYEZhdGFsRXJyb3JgLiBJZiB5b3UgYXJlIGFcbiAqIGZyYW1ld29yayBhdXRob3IgYW5kIG5lZWQgdG8gc2V0IGEgcmVzZXJ2ZWQga2V5LCBwYXNzXG4gKiBgeyBhbGxvd1Jlc2VydmVkQXR0cmlidXRlczogdHJ1ZSB9YCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50OyBzZWVcbiAqIGBTZXRBdHRyaWJ1dGVzT3B0aW9uc2AgZm9yIHRoZSB0cmFkZS1vZmZzLlxuICpcbiAqICoqV0FSTklORyoqOiBDYWxsaW5nIGUuZy5cbiAqIGBQcm9taXNlLmFsbChbc2V0QXR0cmlidXRlcyh7IGE6ICcxJyB9KSwgc2V0QXR0cmlidXRlcyh7IGE6ICcyJyB9KV0pYFxuICogaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgb3JkZXJlZCBjb25zaXN0ZW50bHksIGJ1dCB0aGUgZXF1aXZhbGVudFxuICogc2VxdWVudGlhbCBgLnRoZW4oKWAgY2hhaW4gaXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBzZXRBdHRyaWJ1dGVzIH0gZnJvbSAnd29ya2Zsb3cnO1xuICpcbiAqIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBteVdvcmtmbG93KCkge1xuICogICAndXNlIHdvcmtmbG93JztcbiAqICAgYXdhaXQgc2V0QXR0cmlidXRlcyh7IHBoYXNlOiAnaW5pdCcgfSk7XG4gKiAgIC8vIC4uLiB3b3JrIC4uLlxuICogICBhd2FpdCBzZXRBdHRyaWJ1dGVzKHsgcGhhc2U6ICdkb25lJywgb3JkZXJJZDogJ29yZF8xMjMnIH0pO1xuICogICBhd2FpdCBzZXRBdHRyaWJ1dGVzKHsgb3JkZXJJZDogdW5kZWZpbmVkIH0pOyAvLyByZW1vdmVcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlIEZyYW1ld29yayAvIGxpYnJhcnkgY29kZSB3cml0aW5nIGludG8gdGhlIHJlc2VydmVkIG5hbWVzcGFjZS5cbiAqIGBgYHRzXG4gKiBhd2FpdCBzZXRBdHRyaWJ1dGVzKFxuICogICB7ICckYWdlbnQua2luZCc6ICdkdXJhYmxlLWFnZW50JyB9LFxuICogICB7IGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzOiB0cnVlIH1cbiAqICk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldEF0dHJpYnV0ZXMoXG4gIGF0dHJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+LFxuICBvcHRpb25zOiBTZXRBdHRyaWJ1dGVzT3B0aW9ucyA9IHt9XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY2hhbmdlcyA9IG5vcm1hbGl6ZUF0dHJpYnV0ZUNoYW5nZXMoYXR0cnMsIG9wdGlvbnMpO1xuICBpZiAoY2hhbmdlcy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgY29uc3QgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXMgPSBvcHRpb25zLmFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzID09PSB0cnVlO1xuICBjb25zdCBkaXNwYXRjaFNldEF0dHJpYnV0ZXMgPSAoZ2xvYmFsVGhpcyBhcyBSZWNvcmQ8c3ltYm9sLCB1bmtub3duPilbXG4gICAgV09SS0ZMT1dfU0VUX0FUVFJJQlVURVNcbiAgXSBhc1xuICAgIHwgKChcbiAgICAgICAgY2hhbmdlczogQXR0cmlidXRlQ2hhbmdlW10sXG4gICAgICAgIG9wdGlvbnM/OiB7IGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzPzogYm9vbGVhbiB9XG4gICAgICApID0+IFByb21pc2U8dm9pZD4pXG4gICAgfCB1bmRlZmluZWQ7XG4gIGlmICghZGlzcGF0Y2hTZXRBdHRyaWJ1dGVzKSB7XG4gICAgdGhyb3cgbmV3IEZhdGFsRXJyb3IoXG4gICAgICAnc2V0QXR0cmlidXRlcygpIGNhbGxlZCBvdXRzaWRlIGEgd29ya2Zsb3cgcnVudGltZSBjb250ZXh0LiAnICtcbiAgICAgICAgJ0l0IG11c3QgYmUgY2FsbGVkIGZyb20gd2l0aGluIGEgd29ya2Zsb3cgYm9keSAoYHVzZSB3b3JrZmxvd2ApLidcbiAgICApO1xuICB9XG4gIGF3YWl0IGRpc3BhdGNoU2V0QXR0cmlidXRlcyhcbiAgICBjaGFuZ2VzLFxuICAgIGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzID8geyBhbGxvd1Jlc2VydmVkQXR0cmlidXRlczogdHJ1ZSB9IDoge31cbiAgKTtcbn1cbiJdfQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sleep.d.ts","sourceRoot":"","sources":["../../src/workflow/sleep.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AAGtC,OAAO,
|
|
1
|
+
{"version":3,"file":"sleep.d.ts","sourceRoot":"","sources":["../../src/workflow/sleep.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AAGtC,OAAO,EAIL,KAAK,2BAA2B,EACjC,MAAM,eAAe,CAAC;AAEvB,wBAAgB,WAAW,CAAC,GAAG,EAAE,2BAA2B,IAExD,OAAO,WAAW,GAAG,IAAI,GAAG,MAAM,KACjC,OAAO,CAAC,IAAI,CAAC,CAgIjB"}
|
package/dist/workflow/sleep.js
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ReplayDivergenceError } from '@workflow/errors';
|
|
2
2
|
import { parseDurationToDate, withResolvers } from '@workflow/utils';
|
|
3
3
|
import { EventConsumerResult } from '../events-consumer.js';
|
|
4
|
-
import {
|
|
5
|
-
import { scheduleWhenIdle, } from '../private.js';
|
|
4
|
+
import { awaitEarlierDeliveries, registerDeliveryBarrier, scheduleWorkflowSuspension, } from '../private.js';
|
|
6
5
|
export function createSleep(ctx) {
|
|
7
6
|
return async function sleepImpl(param) {
|
|
8
7
|
const { promise, resolve } = withResolvers();
|
|
@@ -20,9 +19,7 @@ export function createSleep(ctx) {
|
|
|
20
19
|
// If there are no events and we're waiting for wait_completed,
|
|
21
20
|
// suspend the workflow until the wait fires
|
|
22
21
|
if (!event) {
|
|
23
|
-
|
|
24
|
-
ctx.onWorkflowError(new WorkflowSuspension(ctx.invocationsQueue, ctx.globalThis));
|
|
25
|
-
});
|
|
22
|
+
scheduleWorkflowSuspension(ctx);
|
|
26
23
|
return EventConsumerResult.NotConsumed;
|
|
27
24
|
}
|
|
28
25
|
if (event.correlationId !== correlationId) {
|
|
@@ -42,22 +39,71 @@ export function createSleep(ctx) {
|
|
|
42
39
|
}
|
|
43
40
|
// Check for wait_completed event
|
|
44
41
|
if (event.eventType === 'wait_completed') {
|
|
42
|
+
const eventResumeAt = event.eventData?.resumeAt;
|
|
43
|
+
if (eventResumeAt !== undefined) {
|
|
44
|
+
const queueItem = ctx.invocationsQueue.get(correlationId);
|
|
45
|
+
const expectedResumeAt = queueItem && queueItem.type === 'wait'
|
|
46
|
+
? queueItem.resumeAt
|
|
47
|
+
: resumeAt;
|
|
48
|
+
const eventResumeAtDate = new Date(eventResumeAt);
|
|
49
|
+
const eventResumeAtMs = eventResumeAtDate.getTime();
|
|
50
|
+
const expectedResumeAtMs = expectedResumeAt.getTime();
|
|
51
|
+
const eventResumeAtForMessage = Number.isFinite(eventResumeAtMs)
|
|
52
|
+
? eventResumeAtDate.toISOString()
|
|
53
|
+
: String(eventResumeAt);
|
|
54
|
+
if (eventResumeAtMs !== expectedResumeAtMs) {
|
|
55
|
+
ctx.promiseQueue = ctx.promiseQueue.then(() => {
|
|
56
|
+
ctx.onWorkflowError(new ReplayDivergenceError(`Replay divergence: wait_completed event for ${correlationId} has resumeAt "${eventResumeAtForMessage}", but the current wait consumer expects "${expectedResumeAt.toISOString()}"`, { eventId: event.eventId }));
|
|
57
|
+
});
|
|
58
|
+
return EventConsumerResult.Finished;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
45
61
|
// Remove this wait from the invocations queue (O(1) delete using Map)
|
|
46
62
|
ctx.invocationsQueue.delete(correlationId);
|
|
47
|
-
//
|
|
48
|
-
//
|
|
49
|
-
|
|
63
|
+
// This `wait_completed` is a branch-deciding resolution the workflow
|
|
64
|
+
// may `Promise.race` against a hook payload, or await on a branch
|
|
65
|
+
// parallel to one awaiting a step. Order it deterministically by
|
|
66
|
+
// event-log position (see `pendingDeliveryBarriers`):
|
|
67
|
+
// - Register a 'wait' barrier at this event's index so a LATER-in-log
|
|
68
|
+
// hook payload or step result is delivered only after this wait.
|
|
69
|
+
// - Before resolving, defer behind every EARLIER-in-log HOOK and STEP
|
|
70
|
+
// delivery so this wait does not preempt one the committed log
|
|
71
|
+
// ordered first. Then mark this wait delivered to release the later
|
|
72
|
+
// deliveries gated on it.
|
|
73
|
+
const eventIndex = ctx.eventsConsumer.eventIndex;
|
|
74
|
+
const barrier = registerDeliveryBarrier(ctx, eventIndex, 'wait');
|
|
75
|
+
// The deferral is captured HERE, while consuming the event, and not
|
|
76
|
+
// after the queue tail below: same reasoning as step.ts. An earlier
|
|
77
|
+
// step or hook whose hydration slot sits in that tail has usually
|
|
78
|
+
// delivered, and so deregistered its barrier, by the time the tail
|
|
79
|
+
// resolves. Read then, it would be invisible and this wait would skip
|
|
80
|
+
// both the gate AND `awaitEarlierDeliveries`' macrotask yield, letting
|
|
81
|
+
// it overtake the branch that earlier delivery just woke. Every event
|
|
82
|
+
// in one drain window is consumed before any slot runs, so capturing
|
|
83
|
+
// at consumption time sees all of them.
|
|
84
|
+
const earlierDelivered = awaitEarlierDeliveries(ctx, eventIndex, 'wait');
|
|
85
|
+
// Defer + resolve in a DETACHED promise (not chained onto the serial
|
|
86
|
+
// `promiseQueue`). `awaitEarlierDeliveries` may wait on an earlier
|
|
87
|
+
// hook or step delivery whose own resolution is itself driven by the
|
|
88
|
+
// promiseQueue; blocking a queue slot on it would deadlock the serial
|
|
89
|
+
// queue. We still anchor to the queue tail first so prior queued
|
|
90
|
+
// hydration/ordering work runs in event-log order.
|
|
91
|
+
const queueAtCompletion = ctx.promiseQueue;
|
|
92
|
+
void queueAtCompletion
|
|
93
|
+
.then(() => earlierDelivered)
|
|
94
|
+
.then(() => {
|
|
95
|
+
barrier.markDelivered();
|
|
50
96
|
resolve();
|
|
51
97
|
});
|
|
52
98
|
return EventConsumerResult.Finished;
|
|
53
99
|
}
|
|
54
|
-
//
|
|
100
|
+
// This replay installed a different consumer than the stored event needs.
|
|
55
101
|
ctx.promiseQueue = ctx.promiseQueue.then(() => {
|
|
56
|
-
ctx.onWorkflowError(new
|
|
102
|
+
ctx.onWorkflowError(new ReplayDivergenceError(`Replay divergence: Unexpected event type for wait ${correlationId} "${event.eventType}"`, { eventId: event.eventId }));
|
|
57
103
|
});
|
|
58
104
|
return EventConsumerResult.Finished;
|
|
59
105
|
});
|
|
60
106
|
return promise;
|
|
61
107
|
};
|
|
62
108
|
}
|
|
63
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xlZXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd29ya2Zsb3cvc2xlZXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDeEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXJFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVELE9BQU8sRUFBZ0Msa0JBQWtCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDaEYsT0FBTyxFQUNMLGdCQUFnQixHQUVqQixNQUFNLGVBQWUsQ0FBQztBQUV2QixNQUFNLFVBQVUsV0FBVyxDQUFDLEdBQWdDO0lBQzFELE9BQU8sS0FBSyxVQUFVLFNBQVMsQ0FDN0IsS0FBa0M7UUFFbEMsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsR0FBRyxhQUFhLEVBQVEsQ0FBQztRQUNuRCxNQUFNLGFBQWEsR0FBRyxRQUFRLEdBQUcsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDO1FBRW5ELDRCQUE0QjtRQUM1QixNQUFNLFFBQVEsR0FBRyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU1QyxnRUFBZ0U7UUFDaEUsTUFBTSxRQUFRLEdBQTRCO1lBQ3hDLElBQUksRUFBRSxNQUFNO1lBQ1osYUFBYTtZQUNiLFFBQVE7U0FDVCxDQUFDO1FBQ0YsR0FBRyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFbEQsR0FBRyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNyQywrREFBK0Q7WUFDL0QsNENBQTRDO1lBQzVDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDWCxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFO29CQUN6QixHQUFHLENBQUMsZUFBZSxDQUNqQixJQUFJLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLENBQUMsVUFBVSxDQUFDLENBQzdELENBQUM7Z0JBQ0osQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsT0FBTyxtQkFBbUIsQ0FBQyxXQUFXLENBQUM7WUFDekMsQ0FBQztZQUVELElBQUksS0FBSyxDQUFDLGFBQWEsS0FBSyxhQUFhLEVBQUUsQ0FBQztnQkFDMUMsdUZBQXVGO2dCQUN2RixPQUFPLG1CQUFtQixDQUFDLFdBQVcsQ0FBQztZQUN6QyxDQUFDO1lBRUQsNkVBQTZFO1lBQzdFLElBQUksS0FBSyxDQUFDLFNBQVMsS0FBSyxjQUFjLEVBQUUsQ0FBQztnQkFDdkMsdUVBQXVFO2dCQUN2RSx3QkFBd0I7Z0JBQ3hCLE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQzFELElBQUksU0FBUyxJQUFJLFNBQVMsQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFFLENBQUM7b0JBQzNDLFNBQVMsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO29CQUNqQyxTQUFTLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDO2dCQUNoRCxDQUFDO2dCQUNELE9BQU8sbUJBQW1CLENBQUMsUUFBUSxDQUFDO1lBQ3RDLENBQUM7WUFFRCxpQ0FBaUM7WUFDakMsSUFBSSxLQUFLLENBQUMsU0FBUyxLQUFLLGdCQUFnQixFQUFFLENBQUM7Z0JBQ3pDLHNFQUFzRTtnQkFDdEUsR0FBRyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFFM0MsMERBQTBEO2dCQUMxRCxxREFBcUQ7Z0JBQ3JELEdBQUcsQ0FBQyxZQUFZLEdBQUcsR0FBRyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO29CQUM1QyxPQUFPLEVBQUUsQ0FBQztnQkFDWixDQUFDLENBQUMsQ0FBQztnQkFDSCxPQUFPLG1CQUFtQixDQUFDLFFBQVEsQ0FBQztZQUN0QyxDQUFDO1lBRUQsc0dBQXNHO1lBQ3RHLEdBQUcsQ0FBQyxZQUFZLEdBQUcsR0FBRyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO2dCQUM1QyxHQUFHLENBQUMsZUFBZSxDQUNqQixJQUFJLG9CQUFvQixDQUN0QixrQ0FBa0MsYUFBYSxLQUFLLEtBQUssQ0FBQyxTQUFTLEdBQUcsQ0FDdkUsQ0FDRixDQUFDO1lBQ0osQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPLG1CQUFtQixDQUFDLFFBQVEsQ0FBQztRQUN0QyxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBXb3JrZmxvd1J1bnRpbWVFcnJvciB9IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHsgcGFyc2VEdXJhdGlvblRvRGF0ZSwgd2l0aFJlc29sdmVycyB9IGZyb20gJ0B3b3JrZmxvdy91dGlscyc7XG5pbXBvcnQgdHlwZSB7IFN0cmluZ1ZhbHVlIH0gZnJvbSAnbXMnO1xuaW1wb3J0IHsgRXZlbnRDb25zdW1lclJlc3VsdCB9IGZyb20gJy4uL2V2ZW50cy1jb25zdW1lci5qcyc7XG5pbXBvcnQgeyB0eXBlIFdhaXRJbnZvY2F0aW9uUXVldWVJdGVtLCBXb3JrZmxvd1N1c3BlbnNpb24gfSBmcm9tICcuLi9nbG9iYWwuanMnO1xuaW1wb3J0IHtcbiAgc2NoZWR1bGVXaGVuSWRsZSxcbiAgdHlwZSBXb3JrZmxvd09yY2hlc3RyYXRvckNvbnRleHQsXG59IGZyb20gJy4uL3ByaXZhdGUuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2xlZXAoY3R4OiBXb3JrZmxvd09yY2hlc3RyYXRvckNvbnRleHQpIHtcbiAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIHNsZWVwSW1wbChcbiAgICBwYXJhbTogU3RyaW5nVmFsdWUgfCBEYXRlIHwgbnVtYmVyXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgcHJvbWlzZSwgcmVzb2x2ZSB9ID0gd2l0aFJlc29sdmVyczx2b2lkPigpO1xuICAgIGNvbnN0IGNvcnJlbGF0aW9uSWQgPSBgd2FpdF8ke2N0eC5nZW5lcmF0ZVVsaWQoKX1gO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSByZXN1bWUgdGltZVxuICAgIGNvbnN0IHJlc3VtZUF0ID0gcGFyc2VEdXJhdGlvblRvRGF0ZShwYXJhbSk7XG5cbiAgICAvLyBBZGQgd2FpdCB0byBpbnZvY2F0aW9ucyBxdWV1ZSAodXNpbmcgTWFwIGZvciBPKDEpIG9wZXJhdGlvbnMpXG4gICAgY29uc3Qgd2FpdEl0ZW06IFdhaXRJbnZvY2F0aW9uUXVldWVJdGVtID0ge1xuICAgICAgdHlwZTogJ3dhaXQnLFxuICAgICAgY29ycmVsYXRpb25JZCxcbiAgICAgIHJlc3VtZUF0LFxuICAgIH07XG4gICAgY3R4Lmludm9jYXRpb25zUXVldWUuc2V0KGNvcnJlbGF0aW9uSWQsIHdhaXRJdGVtKTtcblxuICAgIGN0eC5ldmVudHNDb25zdW1lci5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XG4gICAgICAvLyBJZiB0aGVyZSBhcmUgbm8gZXZlbnRzIGFuZCB3ZSdyZSB3YWl0aW5nIGZvciB3YWl0X2NvbXBsZXRlZCxcbiAgICAgIC8vIHN1c3BlbmQgdGhlIHdvcmtmbG93IHVudGlsIHRoZSB3YWl0IGZpcmVzXG4gICAgICBpZiAoIWV2ZW50KSB7XG4gICAgICAgIHNjaGVkdWxlV2hlbklkbGUoY3R4LCAoKSA9PiB7XG4gICAgICAgICAgY3R4Lm9uV29ya2Zsb3dFcnJvcihcbiAgICAgICAgICAgIG5ldyBXb3JrZmxvd1N1c3BlbnNpb24oY3R4Lmludm9jYXRpb25zUXVldWUsIGN0eC5nbG9iYWxUaGlzKVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5Ob3RDb25zdW1lZDtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50LmNvcnJlbGF0aW9uSWQgIT09IGNvcnJlbGF0aW9uSWQpIHtcbiAgICAgICAgLy8gV2UncmUgbm90IGludGVyZXN0ZWQgaW4gdGhpcyBldmVudCAtIHRoZSBjb3JyZWxhdGlvbklkIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgZW50aXR5XG4gICAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0Lk5vdENvbnN1bWVkO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBmb3Igd2FpdF9jcmVhdGVkIGV2ZW50IHRvIG1hcmsgdGhpcyB3YWl0IGFzIGhhdmluZyB0aGUgZXZlbnQgY3JlYXRlZFxuICAgICAgaWYgKGV2ZW50LmV2ZW50VHlwZSA9PT0gJ3dhaXRfY3JlYXRlZCcpIHtcbiAgICAgICAgLy8gTWFyayB0aGlzIHdhaXQgYXMgaGF2aW5nIHRoZSBjcmVhdGVkIGV2ZW50LCBidXQga2VlcCBpdCBpbiB0aGUgcXVldWVcbiAgICAgICAgLy8gTygxKSBsb29rdXAgdXNpbmcgTWFwXG4gICAgICAgIGNvbnN0IHF1ZXVlSXRlbSA9IGN0eC5pbnZvY2F0aW9uc1F1ZXVlLmdldChjb3JyZWxhdGlvbklkKTtcbiAgICAgICAgaWYgKHF1ZXVlSXRlbSAmJiBxdWV1ZUl0ZW0udHlwZSA9PT0gJ3dhaXQnKSB7XG4gICAgICAgICAgcXVldWVJdGVtLmhhc0NyZWF0ZWRFdmVudCA9IHRydWU7XG4gICAgICAgICAgcXVldWVJdGVtLnJlc3VtZUF0ID0gZXZlbnQuZXZlbnREYXRhLnJlc3VtZUF0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0LkNvbnN1bWVkO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBmb3Igd2FpdF9jb21wbGV0ZWQgZXZlbnRcbiAgICAgIGlmIChldmVudC5ldmVudFR5cGUgPT09ICd3YWl0X2NvbXBsZXRlZCcpIHtcbiAgICAgICAgLy8gUmVtb3ZlIHRoaXMgd2FpdCBmcm9tIHRoZSBpbnZvY2F0aW9ucyBxdWV1ZSAoTygxKSBkZWxldGUgdXNpbmcgTWFwKVxuICAgICAgICBjdHguaW52b2NhdGlvbnNRdWV1ZS5kZWxldGUoY29ycmVsYXRpb25JZCk7XG5cbiAgICAgICAgLy8gV2FpdCBoYXMgZWxhcHNlZCAtIGNoYWluIHRocm91Z2ggcHJvbWlzZVF1ZXVlIHRvIGVuc3VyZVxuICAgICAgICAvLyBkZXRlcm1pbmlzdGljIG9yZGVyaW5nIG9mIGFsbCBwcm9taXNlIHJlc29sdXRpb25zLlxuICAgICAgICBjdHgucHJvbWlzZVF1ZXVlID0gY3R4LnByb21pc2VRdWV1ZS50aGVuKCgpID0+IHtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5GaW5pc2hlZDtcbiAgICAgIH1cblxuICAgICAgLy8gQW4gdW5leHBlY3RlZCBldmVudCB0eXBlIGhhcyBiZWVuIHJlY2VpdmVkLCB0aGlzIGV2ZW50IGxvZyBsb29rcyBjb3JydXB0ZWQuIExldCdzIGZhaWwgaW1tZWRpYXRlbHkuXG4gICAgICBjdHgucHJvbWlzZVF1ZXVlID0gY3R4LnByb21pc2VRdWV1ZS50aGVuKCgpID0+IHtcbiAgICAgICAgY3R4Lm9uV29ya2Zsb3dFcnJvcihcbiAgICAgICAgICBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgICBgVW5leHBlY3RlZCBldmVudCB0eXBlIGZvciB3YWl0ICR7Y29ycmVsYXRpb25JZH0gXCIke2V2ZW50LmV2ZW50VHlwZX1cImBcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0LkZpbmlzaGVkO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH07XG59XG4iXX0=
|
|
109
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xlZXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd29ya2Zsb3cvc2xlZXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDekQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXJFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTVELE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsdUJBQXVCLEVBQ3ZCLDBCQUEwQixHQUUzQixNQUFNLGVBQWUsQ0FBQztBQUV2QixNQUFNLFVBQVUsV0FBVyxDQUFDLEdBQWdDO0lBQzFELE9BQU8sS0FBSyxVQUFVLFNBQVMsQ0FDN0IsS0FBa0M7UUFFbEMsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsR0FBRyxhQUFhLEVBQVEsQ0FBQztRQUNuRCxNQUFNLGFBQWEsR0FBRyxRQUFRLEdBQUcsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDO1FBRW5ELDRCQUE0QjtRQUM1QixNQUFNLFFBQVEsR0FBRyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU1QyxnRUFBZ0U7UUFDaEUsTUFBTSxRQUFRLEdBQTRCO1lBQ3hDLElBQUksRUFBRSxNQUFNO1lBQ1osYUFBYTtZQUNiLFFBQVE7U0FDVCxDQUFDO1FBQ0YsR0FBRyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFbEQsR0FBRyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNyQywrREFBK0Q7WUFDL0QsNENBQTRDO1lBQzVDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDWCwwQkFBMEIsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDaEMsT0FBTyxtQkFBbUIsQ0FBQyxXQUFXLENBQUM7WUFD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ICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB7IHBhcnNlRHVyYXRpb25Ub0RhdGUsIHdpdGhSZXNvbHZlcnMgfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMnO1xuaW1wb3J0IHR5cGUgeyBTdHJpbmdWYWx1ZSB9IGZyb20gJ21zJztcbmltcG9ydCB7IEV2ZW50Q29uc3VtZXJSZXN1bHQgfSBmcm9tICcuLi9ldmVudHMtY29uc3VtZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBXYWl0SW52b2NhdGlvblF1ZXVlSXRlbSB9IGZyb20gJy4uL2dsb2JhbC5qcyc7XG5pbXBvcnQge1xuICBhd2FpdEVhcmxpZXJEZWxpdmVyaWVzLFxuICByZWdpc3RlckRlbGl2ZXJ5QmFycmllcixcbiAgc2NoZWR1bGVXb3JrZmxvd1N1c3BlbnNpb24sXG4gIHR5cGUgV29ya2Zsb3dPcmNoZXN0cmF0b3JDb250ZXh0LFxufSBmcm9tICcuLi9wcml2YXRlLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNsZWVwKGN0eDogV29ya2Zsb3dPcmNoZXN0cmF0b3JDb250ZXh0KSB7XG4gIHJldHVybiBhc3luYyBmdW5jdGlvbiBzbGVlcEltcGwoXG4gICAgcGFyYW06IFN0cmluZ1ZhbHVlIHwgRGF0ZSB8IG51bWJlclxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IHByb21pc2UsIHJlc29sdmUgfSA9IHdpdGhSZXNvbHZlcnM8dm9pZD4oKTtcbiAgICBjb25zdCBjb3JyZWxhdGlvbklkID0gYHdhaXRfJHtjdHguZ2VuZXJhdGVVbGlkKCl9YDtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgcmVzdW1lIHRpbWVcbiAgICBjb25zdCByZXN1bWVBdCA9IHBhcnNlRHVyYXRpb25Ub0RhdGUocGFyYW0pO1xuXG4gICAgLy8gQWRkIHdhaXQgdG8gaW52b2NhdGlvbnMgcXVldWUgKHVzaW5nIE1hcCBmb3IgTygxKSBvcGVyYXRpb25zKVxuICAgIGNvbnN0IHdhaXRJdGVtOiBXYWl0SW52b2NhdGlvblF1ZXVlSXRlbSA9IHtcbiAgICAgIHR5cGU6ICd3YWl0JyxcbiAgICAgIGNvcnJlbGF0aW9uSWQsXG4gICAgICByZXN1bWVBdCxcbiAgICB9O1xuICAgIGN0eC5pbnZvY2F0aW9uc1F1ZXVlLnNldChjb3JyZWxhdGlvbklkLCB3YWl0SXRlbSk7XG5cbiAgICBjdHguZXZlbnRzQ29uc3VtZXIuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgLy8gSWYgdGhlcmUgYXJlIG5vIGV2ZW50cyBhbmQgd2UncmUgd2FpdGluZyBmb3Igd2FpdF9jb21wbGV0ZWQsXG4gICAgICAvLyBzdXNwZW5kIHRoZSB3b3JrZmxvdyB1bnRpbCB0aGUgd2FpdCBmaXJlc1xuICAgICAgaWYgKCFldmVudCkge1xuICAgICAgICBzY2hlZHVsZVdvcmtmbG93U3VzcGVuc2lvbihjdHgpO1xuICAgICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5Ob3RDb25zdW1lZDtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50LmNvcnJlbGF0aW9uSWQgIT09IGNvcnJlbGF0aW9uSWQpIHtcbiAgICAgICAgLy8gV2UncmUgbm90IGludGVyZXN0ZWQgaW4gdGhpcyBldmVudCAtIHRoZSBjb3JyZWxhdGlvbklkIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgZW50aXR5XG4gICAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0Lk5vdENvbnN1bWVkO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBmb3Igd2FpdF9jcmVhdGVkIGV2ZW50IHRvIG1hcmsgdGhpcyB3YWl0IGFzIGhhdmluZyB0aGUgZXZlbnQgY3JlYXRlZFxuICAgICAgaWYgKGV2ZW50LmV2ZW50VHlwZSA9PT0gJ3dhaXRfY3JlYXRlZCcpIHtcbiAgICAgICAgLy8gTWFyayB0aGlzIHdhaXQgYXMgaGF2aW5nIHRoZSBjcmVhdGVkIGV2ZW50LCBidXQga2VlcCBpdCBpbiB0aGUgcXVldWVcbiAgICAgICAgLy8gTygxKSBsb29rdXAgdXNpbmcgTWFwXG4gICAgICAgIGNvbnN0IHF1ZXVlSXRlbSA9IGN0eC5pbnZvY2F0aW9uc1F1ZXVlLmdldChjb3JyZWxhdGlvbklkKTtcbiAgICAgICAgaWYgKHF1ZXVlSXRlbSAmJiBxdWV1ZUl0ZW0udHlwZSA9PT0gJ3dhaXQnKSB7XG4gICAgICAgICAgcXVldWVJdGVtLmhhc0NyZWF0ZWRFdmVudCA9IHRydWU7XG4gICAgICAgICAgcXVldWVJdGVtLnJlc3VtZUF0ID0gZXZlbnQuZXZlbnREYXRhLnJlc3VtZUF0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0LkNvbnN1bWVkO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBmb3Igd2FpdF9jb21wbGV0ZWQgZXZlbnRcbiAgICAgIGlmIChldmVudC5ldmVudFR5cGUgPT09ICd3YWl0X2NvbXBsZXRlZCcpIHtcbiAgICAgICAgY29uc3QgZXZlbnRSZXN1bWVBdCA9IGV2ZW50LmV2ZW50RGF0YT8ucmVzdW1lQXQ7XG4gICAgICAgIGlmIChldmVudFJlc3VtZUF0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb25zdCBxdWV1ZUl0ZW0gPSBjdHguaW52b2NhdGlvbnNRdWV1ZS5nZXQoY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgY29uc3QgZXhwZWN0ZWRSZXN1bWVBdCA9XG4gICAgICAgICAgICBxdWV1ZUl0ZW0gJiYgcXVldWVJdGVtLnR5cGUgPT09ICd3YWl0J1xuICAgICAgICAgICAgICA/IHF1ZXVlSXRlbS5yZXN1bWVBdFxuICAgICAgICAgICAgICA6IHJlc3VtZUF0O1xuICAgICAgICAgIGNvbnN0IGV2ZW50UmVzdW1lQXREYXRlID0gbmV3IERhdGUoZXZlbnRSZXN1bWVBdCk7XG4gICAgICAgICAgY29uc3QgZXZlbnRSZXN1bWVBdE1zID0gZXZlbnRSZXN1bWVBdERhdGUuZ2V0VGltZSgpO1xuICAgICAgICAgIGNvbnN0IGV4cGVjdGVkUmVzdW1lQXRNcyA9IGV4cGVjdGVkUmVzdW1lQXQuZ2V0VGltZSgpO1xuICAgICAgICAgIGNvbnN0IGV2ZW50UmVzdW1lQXRGb3JNZXNzYWdlID0gTnVtYmVyLmlzRmluaXRlKGV2ZW50UmVzdW1lQXRNcylcbiAgICAgICAgICAgID8gZXZlbnRSZXN1bWVBdERhdGUudG9JU09TdHJpbmcoKVxuICAgICAgICAgICAgOiBTdHJpbmcoZXZlbnRSZXN1bWVBdCk7XG5cbiAgICAgICAgICBpZiAoZXZlbnRSZXN1bWVBdE1zICE9PSBleHBlY3RlZFJlc3VtZUF0TXMpIHtcbiAgICAgICAgICAgIGN0eC5wcm9taXNlUXVldWUgPSBjdHgucHJvbWlzZVF1ZXVlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICBjdHgub25Xb3JrZmxvd0Vycm9yKFxuICAgICAgICAgICAgICAgIG5ldyBSZXBsYXlEaXZlcmdlbmNlRXJyb3IoXG4gICAgICAgICAgICAgICAgICBgUmVwbGF5IGRpdmVyZ2VuY2U6IHdhaXRfY29tcGxldGVkIGV2ZW50IGZvciAke2NvcnJlbGF0aW9uSWR9IGhhcyByZXN1bWVBdCBcIiR7ZXZlbnRSZXN1bWVBdEZvck1lc3NhZ2V9XCIsIGJ1dCB0aGUgY3VycmVudCB3YWl0IGNvbnN1bWVyIGV4cGVjdHMgXCIke2V4cGVjdGVkUmVzdW1lQXQudG9JU09TdHJpbmcoKX1cImAsXG4gICAgICAgICAgICAgICAgICB7IGV2ZW50SWQ6IGV2ZW50LmV2ZW50SWQgfVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuRmluaXNoZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVtb3ZlIHRoaXMgd2FpdCBmcm9tIHRoZSBpbnZvY2F0aW9ucyBxdWV1ZSAoTygxKSBkZWxldGUgdXNpbmcgTWFwKVxuICAgICAgICBjdHguaW52b2NhdGlvbnNRdWV1ZS5kZWxldGUoY29ycmVsYXRpb25JZCk7XG5cbiAgICAgICAgLy8gVGhpcyBgd2FpdF9jb21wbGV0ZWRgIGlzIGEgYnJhbmNoLWRlY2lkaW5nIHJlc29sdXRpb24gdGhlIHdvcmtmbG93XG4gICAgICAgIC8vIG1heSBgUHJvbWlzZS5yYWNlYCBhZ2FpbnN0IGEgaG9vayBwYXlsb2FkLCBvciBhd2FpdCBvbiBhIGJyYW5jaFxuICAgICAgICAvLyBwYXJhbGxlbCB0byBvbmUgYXdhaXRpbmcgYSBzdGVwLiBPcmRlciBpdCBkZXRlcm1pbmlzdGljYWxseSBieVxuICAgICAgICAvLyBldmVudC1sb2cgcG9zaXRpb24gKHNlZSBgcGVuZGluZ0RlbGl2ZXJ5QmFycmllcnNgKTpcbiAgICAgICAgLy8gIC0gUmVnaXN0ZXIgYSAnd2FpdCcgYmFycmllciBhdCB0aGlzIGV2ZW50J3MgaW5kZXggc28gYSBMQVRFUi1pbi1sb2dcbiAgICAgICAgLy8gICAgaG9vayBwYXlsb2FkIG9yIHN0ZXAgcmVzdWx0IGlzIGRlbGl2ZXJlZCBvbmx5IGFmdGVyIHRoaXMgd2FpdC5cbiAgICAgICAgLy8gIC0gQmVmb3JlIHJlc29sdmluZywgZGVmZXIgYmVoaW5kIGV2ZXJ5IEVBUkxJRVItaW4tbG9nIEhPT0sgYW5kIFNURVBcbiAgICAgICAgLy8gICAgZGVsaXZlcnkgc28gdGhpcyB3YWl0IGRvZXMgbm90IHByZWVtcHQgb25lIHRoZSBjb21taXR0ZWQgbG9nXG4gICAgICAgIC8vICAgIG9yZGVyZWQgZmlyc3QuIFRoZW4gbWFyayB0aGlzIHdhaXQgZGVsaXZlcmVkIHRvIHJlbGVhc2UgdGhlIGxhdGVyXG4gICAgICAgIC8vICAgIGRlbGl2ZXJpZXMgZ2F0ZWQgb24gaXQuXG4gICAgICAgIGNvbnN0IGV2ZW50SW5kZXggPSBjdHguZXZlbnRzQ29uc3VtZXIuZXZlbnRJbmRleDtcbiAgICAgICAgY29uc3QgYmFycmllciA9IHJlZ2lzdGVyRGVsaXZlcnlCYXJyaWVyKGN0eCwgZXZlbnRJbmRleCwgJ3dhaXQnKTtcbiAgICAgICAgLy8gVGhlIGRlZmVycmFsIGlzIGNhcHR1cmVkIEhFUkUsIHdoaWxlIGNvbnN1bWluZyB0aGUgZXZlbnQsIGFuZCBub3RcbiAgICAgICAgLy8gYWZ0ZXIgdGhlIHF1ZXVlIHRhaWwgYmVsb3c6IHNhbWUgcmVhc29uaW5nIGFzIHN0ZXAudHMuIEFuIGVhcmxpZXJcbiAgICAgICAgLy8gc3RlcCBvciBob29rIHdob3NlIGh5ZHJhdGlvbiBzbG90IHNpdHMgaW4gdGhhdCB0YWlsIGhhcyB1c3VhbGx5XG4gICAgICAgIC8vIGRlbGl2ZXJlZCwgYW5kIHNvIGRlcmVnaXN0ZXJlZCBpdHMgYmFycmllciwgYnkgdGhlIHRpbWUgdGhlIHRhaWxcbiAgICAgICAgLy8gcmVzb2x2ZXMuIFJlYWQgdGhlbiwgaXQgd291bGQgYmUgaW52aXNpYmxlIGFuZCB0aGlzIHdhaXQgd291bGQgc2tpcFxuICAgICAgICAvLyBib3RoIHRoZSBnYXRlIEFORCBgYXdhaXRFYXJsaWVyRGVsaXZlcmllc2AnIG1hY3JvdGFzayB5aWVsZCwgbGV0dGluZ1xuICAgICAgICAvLyBpdCBvdmVydGFrZSB0aGUgYnJhbmNoIHRoYXQgZWFybGllciBkZWxpdmVyeSBqdXN0IHdva2UuIEV2ZXJ5IGV2ZW50XG4gICAgICAgIC8vIGluIG9uZSBkcmFpbiB3aW5kb3cgaXMgY29uc3VtZWQgYmVmb3JlIGFueSBzbG90IHJ1bnMsIHNvIGNhcHR1cmluZ1xuICAgICAgICAvLyBhdCBjb25zdW1wdGlvbiB0aW1lIHNlZXMgYWxsIG9mIHRoZW0uXG4gICAgICAgIGNvbnN0IGVhcmxpZXJEZWxpdmVyZWQgPSBhd2FpdEVhcmxpZXJEZWxpdmVyaWVzKFxuICAgICAgICAgIGN0eCxcbiAgICAgICAgICBldmVudEluZGV4LFxuICAgICAgICAgICd3YWl0J1xuICAgICAgICApO1xuICAgICAgICAvLyBEZWZlciArIHJlc29sdmUgaW4gYSBERVRBQ0hFRCBwcm9taXNlIChub3QgY2hhaW5lZCBvbnRvIHRoZSBzZXJpYWxcbiAgICAgICAgLy8gYHByb21pc2VRdWV1ZWApLiBgYXdhaXRFYXJsaWVyRGVsaXZlcmllc2AgbWF5IHdhaXQgb24gYW4gZWFybGllclxuICAgICAgICAvLyBob29rIG9yIHN0ZXAgZGVsaXZlcnkgd2hvc2Ugb3duIHJlc29sdXRpb24gaXMgaXRzZWxmIGRyaXZlbiBieSB0aGVcbiAgICAgICAgLy8gcHJvbWlzZVF1ZXVlOyBibG9ja2luZyBhIHF1ZXVlIHNsb3Qgb24gaXQgd291bGQgZGVhZGxvY2sgdGhlIHNlcmlhbFxuICAgICAgICAvLyBxdWV1ZS4gV2Ugc3RpbGwgYW5jaG9yIHRvIHRoZSBxdWV1ZSB0YWlsIGZpcnN0IHNvIHByaW9yIHF1ZXVlZFxuICAgICAgICAvLyBoeWRyYXRpb24vb3JkZXJpbmcgd29yayBydW5zIGluIGV2ZW50LWxvZyBvcmRlci5cbiAgICAgICAgY29uc3QgcXVldWVBdENvbXBsZXRpb24gPSBjdHgucHJvbWlzZVF1ZXVlO1xuICAgICAgICB2b2lkIHF1ZXVlQXRDb21wbGV0aW9uXG4gICAgICAgICAgLnRoZW4oKCkgPT4gZWFybGllckRlbGl2ZXJlZClcbiAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBiYXJyaWVyLm1hcmtEZWxpdmVyZWQoKTtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuRmluaXNoZWQ7XG4gICAgICB9XG5cbiAgICAgIC8vIFRoaXMgcmVwbGF5IGluc3RhbGxlZCBhIGRpZmZlcmVudCBjb25zdW1lciB0aGFuIHRoZSBzdG9yZWQgZXZlbnQgbmVlZHMuXG4gICAgICBjdHgucHJvbWlzZVF1ZXVlID0gY3R4LnByb21pc2VRdWV1ZS50aGVuKCgpID0+IHtcbiAgICAgICAgY3R4Lm9uV29ya2Zsb3dFcnJvcihcbiAgICAgICAgICBuZXcgUmVwbGF5RGl2ZXJnZW5jZUVycm9yKFxuICAgICAgICAgICAgYFJlcGxheSBkaXZlcmdlbmNlOiBVbmV4cGVjdGVkIGV2ZW50IHR5cGUgZm9yIHdhaXQgJHtjb3JyZWxhdGlvbklkfSBcIiR7ZXZlbnQuZXZlbnRUeXBlfVwiYCxcbiAgICAgICAgICAgIHsgZXZlbnRJZDogZXZlbnQuZXZlbnRJZCB9XG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5GaW5pc2hlZDtcbiAgICB9KTtcblxuICAgIHJldHVybiBwcm9taXNlO1xuICB9O1xufVxuIl19
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* VM/step-bundle stub for `@workflow/core/runtime/world-init`.
|
|
3
3
|
*
|
|
4
|
-
* Resolved via the `workflow` export condition. Empty by design
|
|
4
|
+
* Resolved via the `workflow` export condition. Empty by design: the host
|
|
5
5
|
* is responsible for loading `world.ts` and populating the globalThis
|
|
6
6
|
* world cache before any VM or step code executes. Including this module
|
|
7
7
|
* (rather than letting the resolver fall through to the host file) keeps
|
|
8
|
-
* `world.ts` and
|
|
9
|
-
*
|
|
8
|
+
* `world.ts` and the configured server-only world package out of the
|
|
9
|
+
* workflow sandbox.
|
|
10
10
|
*
|
|
11
11
|
* See `../runtime/world-init.ts` for the host-side implementation and the
|
|
12
12
|
* full rationale.
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* VM/step-bundle stub for `@workflow/core/runtime/world-init`.
|
|
3
3
|
*
|
|
4
|
-
* Resolved via the `workflow` export condition. Empty by design
|
|
4
|
+
* Resolved via the `workflow` export condition. Empty by design: the host
|
|
5
5
|
* is responsible for loading `world.ts` and populating the globalThis
|
|
6
6
|
* world cache before any VM or step code executes. Including this module
|
|
7
7
|
* (rather than letting the resolver fall through to the host file) keeps
|
|
8
|
-
* `world.ts` and
|
|
9
|
-
*
|
|
8
|
+
* `world.ts` and the configured server-only world package out of the
|
|
9
|
+
* workflow sandbox.
|
|
10
10
|
*
|
|
11
11
|
* See `../runtime/world-init.ts` for the host-side implementation and the
|
|
12
12
|
* full rationale.
|
|
13
13
|
*/
|
|
14
14
|
export {};
|
|
15
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ybGQtaW5pdC1zdHViLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3dvcmtmbG93L3dvcmxkLWluaXQtc3R1Yi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7O0dBWUciLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFZNL3N0ZXAtYnVuZGxlIHN0dWIgZm9yIGBAd29ya2Zsb3cvY29yZS9ydW50aW1lL3dvcmxkLWluaXRgLlxuICpcbiAqIFJlc29sdmVkIHZpYSB0aGUgYHdvcmtmbG93YCBleHBvcnQgY29uZGl0aW9uLiBFbXB0eSBieSBkZXNpZ246IHRoZSBob3N0XG4gKiBpcyByZXNwb25zaWJsZSBmb3IgbG9hZGluZyBgd29ybGQudHNgIGFuZCBwb3B1bGF0aW5nIHRoZSBnbG9iYWxUaGlzXG4gKiB3b3JsZCBjYWNoZSBiZWZvcmUgYW55IFZNIG9yIHN0ZXAgY29kZSBleGVjdXRlcy4gSW5jbHVkaW5nIHRoaXMgbW9kdWxlXG4gKiAocmF0aGVyIHRoYW4gbGV0dGluZyB0aGUgcmVzb2x2ZXIgZmFsbCB0aHJvdWdoIHRvIHRoZSBob3N0IGZpbGUpIGtlZXBzXG4gKiBgd29ybGQudHNgIGFuZCB0aGUgY29uZmlndXJlZCBzZXJ2ZXItb25seSB3b3JsZCBwYWNrYWdlIG91dCBvZiB0aGVcbiAqIHdvcmtmbG93IHNhbmRib3guXG4gKlxuICogU2VlIGAuLi9ydW50aW1lL3dvcmxkLWluaXQudHNgIGZvciB0aGUgaG9zdC1zaWRlIGltcGxlbWVudGF0aW9uIGFuZCB0aGVcbiAqIGZ1bGwgcmF0aW9uYWxlLlxuICovXG5cbmV4cG9ydCB7fTtcbiJdfQ==
|
package/dist/workflow.d.ts
CHANGED
|
@@ -1,4 +1,96 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type {
|
|
3
|
-
|
|
1
|
+
import type { Script } from 'node:vm';
|
|
2
|
+
import type { Event, WorkflowRun, WorldCapabilities } from '@workflow/world';
|
|
3
|
+
import { WorkflowSuspension } from './global.js';
|
|
4
|
+
import { ReplayPayloadCache } from './replay-payload-cache.js';
|
|
5
|
+
import type { PayloadKey } from './serialization/encryption.js';
|
|
6
|
+
/** Everything needed to cold-start a workflow VM over an event log. */
|
|
7
|
+
interface WorkflowSessionOptions {
|
|
8
|
+
readonly workflowCode: string;
|
|
9
|
+
readonly workflowRun: WorkflowRun;
|
|
10
|
+
readonly events: Event[];
|
|
11
|
+
readonly encryptionKey: PayloadKey | undefined;
|
|
12
|
+
readonly replayPayloadCache: ReplayPayloadCache;
|
|
13
|
+
readonly compiledWorkflowScripts?: CompiledWorkflowScripts;
|
|
14
|
+
readonly runReadyBarrier?: Promise<unknown>;
|
|
15
|
+
readonly worldCapabilities?: WorldCapabilities;
|
|
16
|
+
}
|
|
17
|
+
/** Context-independent V8 scripts that can be evaluated in any fresh VM. */
|
|
18
|
+
export interface CompiledWorkflowScripts {
|
|
19
|
+
readonly bundleScript: Script;
|
|
20
|
+
readonly workflowLookupScript: Script;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Compile the workflow bundle before its run snapshot is available.
|
|
24
|
+
*
|
|
25
|
+
* Compilation depends only on the route's bundle string and the workflow name
|
|
26
|
+
* persisted on the run, not the event log or VM context. The runtime starts
|
|
27
|
+
* this promise while `run_started` loads the replay snapshot, then evaluates
|
|
28
|
+
* the scripts only after it has created the fresh context.
|
|
29
|
+
*/
|
|
30
|
+
export declare function compileWorkflowBundle(workflowCode: string, workflowName: string): Promise<CompiledWorkflowScripts>;
|
|
31
|
+
/**
|
|
32
|
+
* A live workflow VM, parked at a suspension boundary. `resume` advances it
|
|
33
|
+
* by appending events instead of replaying from scratch.
|
|
34
|
+
*/
|
|
35
|
+
export interface WorkflowSession {
|
|
36
|
+
readonly workflowRun: WorkflowRun;
|
|
37
|
+
readonly argumentCount: number;
|
|
38
|
+
resume(events: Event[]): Promise<WorkflowResumeResult>;
|
|
39
|
+
}
|
|
40
|
+
/** A finished execution attempt: the workflow's output or a live boundary. */
|
|
41
|
+
export type WorkflowResult = {
|
|
42
|
+
readonly type: 'completed';
|
|
43
|
+
readonly output: unknown;
|
|
44
|
+
/** `typeof` the raw return value, for telemetry. */
|
|
45
|
+
readonly resultType: string;
|
|
46
|
+
} | {
|
|
47
|
+
readonly type: 'suspended';
|
|
48
|
+
readonly suspension: WorkflowSuspension;
|
|
49
|
+
readonly session: WorkflowSession;
|
|
50
|
+
/**
|
|
51
|
+
* Events the replay walked past unclaimed and is still holding, if any.
|
|
52
|
+
* Ordinary on a suspension, and only actionable across a run's
|
|
53
|
+
* suspensions, so it is reported for telemetry rather than acted on here.
|
|
54
|
+
*/
|
|
55
|
+
readonly parked?: {
|
|
56
|
+
readonly count: number;
|
|
57
|
+
readonly eventId: string;
|
|
58
|
+
readonly eventType: string;
|
|
59
|
+
};
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* `resume` can additionally decline: `{ type: 'replay' }` means "this
|
|
63
|
+
* session is unusable, cold-replay instead". A fresh replay never declines.
|
|
64
|
+
*/
|
|
65
|
+
export type WorkflowResumeResult = WorkflowResult | {
|
|
66
|
+
readonly type: 'replay';
|
|
67
|
+
};
|
|
68
|
+
/** Cold-start: build a fresh VM session and replay it over `events`. */
|
|
69
|
+
export declare function replayWorkflow(options: WorkflowSessionOptions): Promise<WorkflowResult>;
|
|
70
|
+
/** Warm-start: advance a retained session by appending events. */
|
|
71
|
+
export declare function resumeWorkflow(session: WorkflowSession, events: Event[]): Promise<WorkflowResumeResult>;
|
|
72
|
+
/**
|
|
73
|
+
* Single-shot replay: execute the workflow over `events` and either return
|
|
74
|
+
* its output or throw its suspension. Kept for the extensive existing test
|
|
75
|
+
* suites; production code goes through `replayWorkflow`/`resumeWorkflow`.
|
|
76
|
+
*/
|
|
77
|
+
export declare function runWorkflow(workflowCode: string, workflowRun: WorkflowRun, events: Event[], encryptionKey: PayloadKey | undefined,
|
|
78
|
+
/**
|
|
79
|
+
* Optional per-run cache for replay payload preparation and immutable final
|
|
80
|
+
* values. Owned by the inline execution loop for this invocation.
|
|
81
|
+
*/
|
|
82
|
+
replayPayloadCache?: ReplayPayloadCache,
|
|
83
|
+
/**
|
|
84
|
+
* Turbo mode only: resolves once the backgrounded `run_started` has landed.
|
|
85
|
+
* Threaded into the end-of-run drain so fire-and-forget `*_created` writes
|
|
86
|
+
* committed at workflow completion order after the run's creation. Undefined
|
|
87
|
+
* outside turbo, where `run_started` is awaited up front.
|
|
88
|
+
*/
|
|
89
|
+
runReadyBarrier?: Promise<unknown>,
|
|
90
|
+
/**
|
|
91
|
+
* Features supported by the World executing this workflow. Missing
|
|
92
|
+
* capabilities are treated as unsupported.
|
|
93
|
+
*/
|
|
94
|
+
worldCapabilities?: WorldCapabilities): Promise<Uint8Array | unknown>;
|
|
95
|
+
export {};
|
|
4
96
|
//# sourceMappingURL=workflow.d.ts.map
|
package/dist/workflow.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../src/workflow.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../src/workflow.ts"],"names":[],"mappings":"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"}
|