@workflow/core 5.0.0-beta.43 → 5.0.0-beta.46
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 +3 -5
- package/dist/attribute-changes.d.ts.map +1 -1
- package/dist/attribute-changes.js +2 -2
- package/dist/capabilities.d.ts +6 -6
- package/dist/capabilities.js +8 -8
- package/dist/capture-stack.d.ts +1 -1
- package/dist/capture-stack.js +2 -2
- package/dist/class-serialization.d.ts +8 -8
- package/dist/class-serialization.js +9 -9
- package/dist/classify-error.js +5 -5
- package/dist/context-violation-error.d.ts +5 -5
- package/dist/context-violation-error.d.ts.map +1 -1
- package/dist/context-violation-error.js +5 -5
- package/dist/create-hook.d.ts +2 -2
- package/dist/create-hook.js +1 -1
- package/dist/define-hook.js +2 -2
- package/dist/describe-error.d.ts +7 -7
- package/dist/describe-error.js +8 -8
- package/dist/encryption.d.ts +5 -5
- package/dist/encryption.js +7 -7
- package/dist/events-consumer.d.ts +20 -8
- package/dist/events-consumer.d.ts.map +1 -1
- package/dist/events-consumer.js +34 -12
- package/dist/flushable-stream.d.ts +4 -4
- package/dist/flushable-stream.js +13 -13
- package/dist/global.d.ts +4 -2
- package/dist/global.d.ts.map +1 -1
- package/dist/global.js +8 -5
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2 -2
- package/dist/log-format.d.ts +2 -2
- package/dist/log-format.js +5 -5
- package/dist/logger.js +4 -4
- package/dist/private.d.ts +29 -71
- package/dist/private.d.ts.map +1 -1
- package/dist/private.js +170 -38
- package/dist/replay-payload-cache.d.ts +1 -1
- package/dist/replay-payload-cache.js +4 -4
- package/dist/runtime/compute-instance.d.ts +4 -3
- package/dist/runtime/compute-instance.d.ts.map +1 -1
- package/dist/runtime/compute-instance.js +5 -4
- package/dist/runtime/constants.d.ts +24 -24
- package/dist/runtime/constants.d.ts.map +1 -1
- package/dist/runtime/constants.js +49 -43
- package/dist/runtime/count-step-started-events.d.ts +7 -7
- package/dist/runtime/count-step-started-events.js +4 -4
- package/dist/runtime/deployment-guard.d.ts +7 -7
- package/dist/runtime/deployment-guard.js +8 -8
- package/dist/runtime/get-port-lazy.d.ts +2 -2
- package/dist/runtime/get-port-lazy.d.ts.map +1 -1
- package/dist/runtime/get-port-lazy.js +37 -30
- package/dist/runtime/get-world-lazy.d.ts +2 -2
- package/dist/runtime/get-world-lazy.js +3 -3
- package/dist/runtime/helpers.d.ts +21 -21
- package/dist/runtime/helpers.js +27 -27
- package/dist/runtime/quickjs-entrypoint.d.ts +21 -10
- package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -1
- package/dist/runtime/quickjs-entrypoint.js +206 -81
- package/dist/runtime/quickjs-runtime.d.ts +31 -15
- package/dist/runtime/quickjs-runtime.d.ts.map +1 -1
- package/dist/runtime/quickjs-runtime.js +132 -77
- package/dist/runtime/quickjs-serde.d.ts +10 -10
- package/dist/runtime/quickjs-serde.js +20 -20
- package/dist/runtime/replay-budget.d.ts +4 -4
- package/dist/runtime/replay-budget.js +5 -5
- package/dist/runtime/replay-recovery-reporter.d.ts +1 -1
- package/dist/runtime/replay-recovery-reporter.js +2 -2
- package/dist/runtime/resume-hook.d.ts +27 -12
- package/dist/runtime/resume-hook.d.ts.map +1 -1
- package/dist/runtime/resume-hook.js +200 -200
- package/dist/runtime/resume-latency.d.ts +40 -30
- package/dist/runtime/resume-latency.d.ts.map +1 -1
- package/dist/runtime/resume-latency.js +7 -5
- package/dist/runtime/run-id-time.d.ts +2 -2
- package/dist/runtime/run-id-time.js +5 -5
- package/dist/runtime/run.d.ts +22 -5
- package/dist/runtime/run.d.ts.map +1 -1
- package/dist/runtime/run.js +106 -11
- package/dist/runtime/runs.d.ts +4 -4
- package/dist/runtime/runs.js +2 -2
- package/dist/runtime/start.d.ts +3 -3
- package/dist/runtime/start.d.ts.map +1 -1
- package/dist/runtime/start.js +29 -25
- package/dist/runtime/step-executor.d.ts +14 -14
- package/dist/runtime/step-executor.d.ts.map +1 -1
- package/dist/runtime/step-executor.js +54 -39
- package/dist/runtime/step-latency.d.ts +42 -25
- package/dist/runtime/step-latency.d.ts.map +1 -1
- package/dist/runtime/step-latency.js +29 -23
- package/dist/runtime/step-ownership.d.ts +6 -6
- package/dist/runtime/step-ownership.js +8 -8
- package/dist/runtime/step-single-flight.d.ts +1 -1
- package/dist/runtime/step-single-flight.d.ts.map +1 -1
- package/dist/runtime/step-single-flight.js +17 -11
- package/dist/runtime/suspension-handler.d.ts +38 -24
- package/dist/runtime/suspension-handler.d.ts.map +1 -1
- package/dist/runtime/suspension-handler.js +238 -103
- package/dist/runtime/unserializable-step.d.ts +34 -0
- package/dist/runtime/unserializable-step.d.ts.map +1 -0
- package/dist/runtime/unserializable-step.js +52 -0
- package/dist/runtime/vm-mode.d.ts +1 -1
- package/dist/runtime/vm-mode.js +2 -2
- package/dist/runtime/wait-continuation.d.ts +31 -9
- package/dist/runtime/wait-continuation.d.ts.map +1 -1
- package/dist/runtime/wait-continuation.js +44 -13
- package/dist/runtime/wait-until.d.ts +1 -1
- package/dist/runtime/wait-until.js +2 -2
- package/dist/runtime/world-compatibility.d.ts +20 -9
- package/dist/runtime/world-compatibility.d.ts.map +1 -1
- package/dist/runtime/world-compatibility.js +24 -13
- package/dist/runtime/world-init.d.ts +5 -5
- package/dist/runtime/world-init.js +6 -6
- package/dist/runtime/world.d.ts.map +1 -1
- package/dist/runtime/world.js +13 -3
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +427 -266
- package/dist/sealed-box.d.ts +7 -7
- package/dist/sealed-box.js +15 -15
- package/dist/serialization/client.js +2 -2
- package/dist/serialization/codec-devalue-vm.d.ts +1 -1
- package/dist/serialization/codec-devalue-vm.js +4 -4
- package/dist/serialization/codec-devalue.d.ts +1 -1
- package/dist/serialization/codec-devalue.js +2 -2
- package/dist/serialization/codec.d.ts +4 -4
- package/dist/serialization/codec.js +2 -2
- package/dist/serialization/compression.d.ts +12 -11
- package/dist/serialization/compression.d.ts.map +1 -1
- package/dist/serialization/compression.js +16 -15
- package/dist/serialization/encryption.d.ts +7 -7
- package/dist/serialization/encryption.d.ts.map +1 -1
- package/dist/serialization/encryption.js +8 -8
- package/dist/serialization/errors.js +2 -2
- package/dist/serialization/format.d.ts +6 -6
- package/dist/serialization/format.js +7 -7
- package/dist/serialization/hardened.d.ts +23 -22
- package/dist/serialization/hardened.d.ts.map +1 -1
- package/dist/serialization/hardened.js +47 -32
- package/dist/serialization/index.d.ts +1 -1
- package/dist/serialization/index.js +2 -2
- package/dist/serialization/reducers/class-vm.d.ts +1 -1
- package/dist/serialization/reducers/class-vm.js +2 -2
- package/dist/serialization/reducers/class.js +2 -2
- package/dist/serialization/reducers/common-vm.js +12 -12
- package/dist/serialization/reducers/common.js +12 -12
- package/dist/serialization/reducers/step-function-vm.d.ts +1 -1
- package/dist/serialization/reducers/step-function-vm.js +2 -2
- package/dist/serialization/reducers/step-function.js +2 -2
- package/dist/serialization/step.js +2 -2
- package/dist/serialization/types.d.ts +5 -5
- package/dist/serialization/types.js +2 -2
- package/dist/serialization/workflow-vm.d.ts +1 -1
- package/dist/serialization/workflow-vm.d.ts.map +1 -1
- package/dist/serialization/workflow-vm.js +13 -10
- package/dist/serialization-format.d.ts +11 -11
- package/dist/serialization-format.d.ts.map +1 -1
- package/dist/serialization-format.js +30 -24
- package/dist/serialization.d.ts +15 -16
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +116 -109
- package/dist/set-attributes.js +2 -2
- package/dist/source-map.d.ts +1 -1
- package/dist/source-map.d.ts.map +1 -1
- package/dist/source-map.js +18 -12
- package/dist/step/context-storage.d.ts +5 -5
- package/dist/step/context-storage.js +1 -1
- package/dist/step/writable-stream.d.ts +3 -3
- package/dist/step/writable-stream.js +7 -7
- package/dist/step.d.ts.map +1 -1
- package/dist/step.js +14 -22
- package/dist/symbols.d.ts +2 -2
- package/dist/symbols.js +3 -3
- package/dist/telemetry/semantic-conventions.d.ts +34 -17
- package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
- package/dist/telemetry/semantic-conventions.js +32 -17
- package/dist/telemetry.d.ts +3 -3
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +19 -10
- package/dist/test-support/orchestrator-context.d.ts.map +1 -1
- package/dist/test-support/orchestrator-context.js +12 -2
- package/dist/version.d.ts +1 -1
- package/dist/version.js +2 -2
- package/dist/vm/index.js +4 -4
- package/dist/vm/script-cache.d.ts.map +1 -1
- package/dist/vm/script-cache.js +23 -17
- package/dist/vm/uint8array-base64.js +1 -1
- package/dist/workflow/abort-controller.d.ts +1 -1
- package/dist/workflow/abort-controller.js +12 -12
- package/dist/workflow/attribute-dispatcher.d.ts.map +1 -1
- package/dist/workflow/attribute-dispatcher.js +3 -6
- package/dist/workflow/create-hook.js +2 -2
- package/dist/workflow/get-workflow-metadata.js +2 -2
- package/dist/workflow/hook.d.ts.map +1 -1
- package/dist/workflow/hook.js +21 -30
- package/dist/workflow/set-attributes.d.ts +1 -1
- package/dist/workflow/set-attributes.js +2 -2
- package/dist/workflow/sleep.js +2 -2
- package/dist/workflow/world-init-stub.d.ts +1 -1
- package/dist/workflow/world-init-stub.js +2 -2
- package/dist/workflow.d.ts +2 -2
- package/dist/workflow.js +26 -13
- package/docs/api-reference/create-hook.mdx +15 -15
- package/docs/api-reference/create-webhook.mdx +15 -15
- package/docs/api-reference/define-hook.mdx +10 -10
- package/docs/api-reference/fatal-error.mdx +2 -2
- package/docs/api-reference/fetch.mdx +7 -7
- package/docs/api-reference/get-step-metadata.mdx +2 -2
- package/docs/api-reference/get-workflow-metadata.mdx +3 -3
- package/docs/api-reference/get-writable.mdx +7 -7
- package/docs/api-reference/index.mdx +1 -1
- package/docs/api-reference/retryable-error.mdx +1 -1
- package/docs/api-reference/set-attributes.mdx +2 -2
- package/docs/api-reference/sleep.mdx +3 -3
- package/docs/foundations/cancellation.mdx +31 -31
- package/docs/foundations/errors-and-retries.mdx +42 -11
- package/docs/foundations/hooks.mdx +35 -35
- package/docs/foundations/idempotency.mdx +9 -9
- package/docs/foundations/serialization.mdx +21 -22
- package/docs/foundations/starting-workflows.mdx +36 -37
- package/docs/foundations/streaming.mdx +46 -41
- package/docs/foundations/versioning.mdx +3 -3
- package/docs/foundations/workflows-and-steps.mdx +9 -9
- package/docs/how-it-works/cancellation.mdx +62 -62
- package/docs/how-it-works/code-transform.mdx +66 -54
- package/docs/how-it-works/encryption.mdx +25 -21
- package/docs/how-it-works/event-sourcing.mdx +53 -35
- package/docs/how-it-works/framework-integrations.mdx +12 -12
- package/docs/how-it-works/understanding-directives.mdx +21 -21
- package/package.json +7 -7
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { globalSingleton } from '@workflow/utils';
|
|
1
2
|
import { runtimeLogger } from '../logger.js';
|
|
2
3
|
/**
|
|
3
4
|
* In-process single-flight for step body execution, keyed by
|
|
@@ -8,7 +9,7 @@ import { runtimeLogger } from '../logger.js';
|
|
|
8
9
|
* *death proof* only on platforms with a bounded invocation lifetime. On
|
|
9
10
|
* worlds without an invocation kill bound (world-local's single process,
|
|
10
11
|
* self-hosted deployments) a delayed backstop can fire while the owning
|
|
11
|
-
* execution is still mid-body
|
|
12
|
+
* execution is still mid-body, in the same process. This map absorbs that
|
|
12
13
|
* race: the loser awaits the winner's settlement and then acks WITHOUT
|
|
13
14
|
* executing. On Vercel Fluid compute it also absorbs same-instance races
|
|
14
15
|
* between an owner redelivery and a backstop.
|
|
@@ -17,32 +18,37 @@ import { runtimeLogger } from '../logger.js';
|
|
|
17
18
|
* after an early ack would consume the loser's queue message while the
|
|
18
19
|
* winner's outcome is still unknown, potentially orphaning the step with no
|
|
19
20
|
* message left to drive it. Awaiting settlement first keeps the at-least-once
|
|
20
|
-
* envelope intact
|
|
21
|
+
* envelope intact: if the loser's own invocation hits its deadline while
|
|
21
22
|
* waiting, its message redelivers and re-checks, degrading gracefully to
|
|
22
23
|
* polling.
|
|
23
24
|
*
|
|
24
25
|
* Cross-instance duplicates (two separate processes racing the same step)
|
|
25
|
-
* are out of scope here
|
|
26
|
+
* are out of scope here; that is what the ownership lease bounds on
|
|
26
27
|
* platforms where it is a death proof, and the documented residual risk on
|
|
27
28
|
* multi-instance self-hosted worlds (mitigate by raising
|
|
28
29
|
* `WORKFLOW_INLINE_OWNERSHIP_LEASE_SECONDS`).
|
|
29
30
|
*/
|
|
30
|
-
|
|
31
|
+
// On `globalThis` (see `globalSingleton`), not module scope: a per-copy map is
|
|
32
|
+
// not single-flight. Two invocations reaching this module through different
|
|
33
|
+
// bundler layers would each believe they were the only one in the process and
|
|
34
|
+
// both run the step body, degrading in-process dedup to the cross-process
|
|
35
|
+
// residual the doc above scopes out.
|
|
36
|
+
const singleFlight = globalSingleton('@workflow/core//stepSingleFlight', 1, () => ({ inFlight: new Map() }));
|
|
31
37
|
/**
|
|
32
38
|
* Run `execute` unless an execution for the same run + step correlation ID is
|
|
33
39
|
* already in flight in this process. The winner's result is returned to the
|
|
34
40
|
* winner; a loser awaits the winner's settlement (success OR failure) and
|
|
35
41
|
* then returns `{ type: 'skipped' }` so its caller acks without running the
|
|
36
|
-
* body. A winner failure is not propagated to the loser
|
|
42
|
+
* body. A winner failure is not propagated to the loser: the winner's own
|
|
37
43
|
* queue message redelivers and drives the retry, so exactly one message
|
|
38
44
|
* keeps owning the outcome.
|
|
39
45
|
*/
|
|
40
46
|
export async function runStepSingleFlight(runId, correlationId, execute) {
|
|
41
47
|
const key = `${runId}:${correlationId}`;
|
|
42
|
-
const existing =
|
|
48
|
+
const existing = singleFlight.inFlight.get(key);
|
|
43
49
|
if (existing) {
|
|
44
50
|
// warn (always printed, unlike debug/info): the single-flight is
|
|
45
|
-
// absorbing what would have been a duplicate execution
|
|
51
|
+
// absorbing what would have been a duplicate execution, typically a
|
|
46
52
|
// delayed backstop or retry message landing in the same process while
|
|
47
53
|
// the owner is still mid-body. Rare by design; a burst of these means
|
|
48
54
|
// leases are expiring under live executions (raise
|
|
@@ -53,17 +59,17 @@ export async function runStepSingleFlight(runId, correlationId, execute) {
|
|
|
53
59
|
}
|
|
54
60
|
catch {
|
|
55
61
|
// The winner failed (typically a transient world error). Its own queue
|
|
56
|
-
// message redelivers and retries; this loser still
|
|
62
|
+
// message redelivers and retries; this loser still skips.
|
|
57
63
|
}
|
|
58
64
|
return { type: 'skipped' };
|
|
59
65
|
}
|
|
60
66
|
const promise = execute();
|
|
61
|
-
|
|
67
|
+
singleFlight.inFlight.set(key, promise);
|
|
62
68
|
try {
|
|
63
69
|
return await promise;
|
|
64
70
|
}
|
|
65
71
|
finally {
|
|
66
|
-
|
|
72
|
+
singleFlight.inFlight.delete(key);
|
|
67
73
|
}
|
|
68
74
|
}
|
|
69
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
75
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1zaW5nbGUtZmxpZ2h0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvc3RlcC1zaW5nbGUtZmxpZ2h0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRzdDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EyQkc7QUFDSCwrRUFBK0U7QUFDL0UsNEVBQTRFO0FBQzVFLDhFQUE4RTtBQUM5RSwwRUFBMEU7QUFDMUUscUNBQXFDO0FBQ3JDLE1BQU0sWUFBWSxHQUFHLGVBQWUsQ0FDbEMsa0NBQWtDLEVBQ2xDLENBQUMsRUFDRCxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksR0FBRyxFQUF3QyxFQUFFLENBQUMsQ0FDdEUsQ0FBQztBQUVGOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxtQkFBbUIsQ0FDdkMsS0FBYSxFQUNiLGFBQXFCLEVBQ3JCLE9BQTJDO0lBRTNDLE1BQU0sR0FBRyxHQUFHLEdBQUcsS0FBSyxJQUFJLGFBQWEsRUFBRSxDQUFDO0lBQ3hDLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2hELElBQUksUUFBUSxFQUFFLENBQUM7UUFDYixpRUFBaUU7UUFDakUsb0VBQW9FO1FBQ3BFLHNFQUFzRTtRQUN0RSxzRUFBc0U7UUFDdEUsbURBQW1EO1FBQ25ELDRDQUE0QztRQUM1QyxhQUFhLENBQUMsSUFBSSxDQUNoQixzR0FBc0csRUFDdEcsRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsQ0FDaEQsQ0FBQztRQUNGLElBQUksQ0FBQztZQUNILE1BQU0sUUFBUSxDQUFDO1FBQ2pCLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCx1RUFBdUU7WUFDdkUsMERBQTBEO1FBQzVELENBQUM7UUFDRCxPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRCxNQUFNLE9BQU8sR0FBRyxPQUFPLEVBQUUsQ0FBQztJQUMxQixZQUFZLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDeEMsSUFBSSxDQUFDO1FBQ0gsT0FBTyxNQUFNLE9BQU8sQ0FBQztJQUN2QixDQUFDO1lBQVMsQ0FBQztRQUNULFlBQVksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2xvYmFsU2luZ2xldG9uIH0gZnJvbSAnQHdvcmtmbG93L3V0aWxzJztcbmltcG9ydCB7IHJ1bnRpbWVMb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBTdGVwRXhlY3V0aW9uUmVzdWx0IH0gZnJvbSAnLi9zdGVwLWV4ZWN1dG9yLmpzJztcblxuLyoqXG4gKiBJbi1wcm9jZXNzIHNpbmdsZS1mbGlnaHQgZm9yIHN0ZXAgYm9keSBleGVjdXRpb24sIGtleWVkIGJ5XG4gKiBgcnVuSWQ6Y29ycmVsYXRpb25JZGAuXG4gKlxuICogVGhpcyBpcyBhIHJlcXVpcmVkIGNvbXBhbmlvbiB0byBpbmxpbmUgc3RlcCBvd25lcnNoaXAgKHNlZVxuICogYGlzSW5saW5lT3duZXJzaGlwRW5hYmxlZGAgaW4gY29uc3RhbnRzLnRzKTogdGhlIG93bmVyc2hpcCBsZWFzZSBpcyBhXG4gKiAqZGVhdGggcHJvb2YqIG9ubHkgb24gcGxhdGZvcm1zIHdpdGggYSBib3VuZGVkIGludm9jYXRpb24gbGlmZXRpbWUuIE9uXG4gKiB3b3JsZHMgd2l0aG91dCBhbiBpbnZvY2F0aW9uIGtpbGwgYm91bmQgKHdvcmxkLWxvY2FsJ3Mgc2luZ2xlIHByb2Nlc3MsXG4gKiBzZWxmLWhvc3RlZCBkZXBsb3ltZW50cykgYSBkZWxheWVkIGJhY2tzdG9wIGNhbiBmaXJlIHdoaWxlIHRoZSBvd25pbmdcbiAqIGV4ZWN1dGlvbiBpcyBzdGlsbCBtaWQtYm9keSwgaW4gdGhlIHNhbWUgcHJvY2Vzcy4gVGhpcyBtYXAgYWJzb3JicyB0aGF0XG4gKiByYWNlOiB0aGUgbG9zZXIgYXdhaXRzIHRoZSB3aW5uZXIncyBzZXR0bGVtZW50IGFuZCB0aGVuIGFja3MgV0lUSE9VVFxuICogZXhlY3V0aW5nLiBPbiBWZXJjZWwgRmx1aWQgY29tcHV0ZSBpdCBhbHNvIGFic29yYnMgc2FtZS1pbnN0YW5jZSByYWNlc1xuICogYmV0d2VlbiBhbiBvd25lciByZWRlbGl2ZXJ5IGFuZCBhIGJhY2tzdG9wLlxuICpcbiAqIFRoZSBsb3NlciBtdXN0IG5vdCBhY2stYW5kLXNraXAgZWFybHkgKGJlZm9yZSB0aGUgd2lubmVyIHNldHRsZXMpOiBhIGNyYXNoXG4gKiBhZnRlciBhbiBlYXJseSBhY2sgd291bGQgY29uc3VtZSB0aGUgbG9zZXIncyBxdWV1ZSBtZXNzYWdlIHdoaWxlIHRoZVxuICogd2lubmVyJ3Mgb3V0Y29tZSBpcyBzdGlsbCB1bmtub3duLCBwb3RlbnRpYWxseSBvcnBoYW5pbmcgdGhlIHN0ZXAgd2l0aCBub1xuICogbWVzc2FnZSBsZWZ0IHRvIGRyaXZlIGl0LiBBd2FpdGluZyBzZXR0bGVtZW50IGZpcnN0IGtlZXBzIHRoZSBhdC1sZWFzdC1vbmNlXG4gKiBlbnZlbG9wZSBpbnRhY3Q6IGlmIHRoZSBsb3NlcidzIG93biBpbnZvY2F0aW9uIGhpdHMgaXRzIGRlYWRsaW5lIHdoaWxlXG4gKiB3YWl0aW5nLCBpdHMgbWVzc2FnZSByZWRlbGl2ZXJzIGFuZCByZS1jaGVja3MsIGRlZ3JhZGluZyBncmFjZWZ1bGx5IHRvXG4gKiBwb2xsaW5nLlxuICpcbiAqIENyb3NzLWluc3RhbmNlIGR1cGxpY2F0ZXMgKHR3byBzZXBhcmF0ZSBwcm9jZXNzZXMgcmFjaW5nIHRoZSBzYW1lIHN0ZXApXG4gKiBhcmUgb3V0IG9mIHNjb3BlIGhlcmU7IHRoYXQgaXMgd2hhdCB0aGUgb3duZXJzaGlwIGxlYXNlIGJvdW5kcyBvblxuICogcGxhdGZvcm1zIHdoZXJlIGl0IGlzIGEgZGVhdGggcHJvb2YsIGFuZCB0aGUgZG9jdW1lbnRlZCByZXNpZHVhbCByaXNrIG9uXG4gKiBtdWx0aS1pbnN0YW5jZSBzZWxmLWhvc3RlZCB3b3JsZHMgKG1pdGlnYXRlIGJ5IHJhaXNpbmdcbiAqIGBXT1JLRkxPV19JTkxJTkVfT1dORVJTSElQX0xFQVNFX1NFQ09ORFNgKS5cbiAqL1xuLy8gT24gYGdsb2JhbFRoaXNgIChzZWUgYGdsb2JhbFNpbmdsZXRvbmApLCBub3QgbW9kdWxlIHNjb3BlOiBhIHBlci1jb3B5IG1hcCBpc1xuLy8gbm90IHNpbmdsZS1mbGlnaHQuIFR3byBpbnZvY2F0aW9ucyByZWFjaGluZyB0aGlzIG1vZHVsZSB0aHJvdWdoIGRpZmZlcmVudFxuLy8gYnVuZGxlciBsYXllcnMgd291bGQgZWFjaCBiZWxpZXZlIHRoZXkgd2VyZSB0aGUgb25seSBvbmUgaW4gdGhlIHByb2Nlc3MgYW5kXG4vLyBib3RoIHJ1biB0aGUgc3RlcCBib2R5LCBkZWdyYWRpbmcgaW4tcHJvY2VzcyBkZWR1cCB0byB0aGUgY3Jvc3MtcHJvY2Vzc1xuLy8gcmVzaWR1YWwgdGhlIGRvYyBhYm92ZSBzY29wZXMgb3V0LlxuY29uc3Qgc2luZ2xlRmxpZ2h0ID0gZ2xvYmFsU2luZ2xldG9uKFxuICAnQHdvcmtmbG93L2NvcmUvL3N0ZXBTaW5nbGVGbGlnaHQnLFxuICAxLFxuICAoKSA9PiAoeyBpbkZsaWdodDogbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8U3RlcEV4ZWN1dGlvblJlc3VsdD4+KCkgfSlcbik7XG5cbi8qKlxuICogUnVuIGBleGVjdXRlYCB1bmxlc3MgYW4gZXhlY3V0aW9uIGZvciB0aGUgc2FtZSBydW4gKyBzdGVwIGNvcnJlbGF0aW9uIElEIGlzXG4gKiBhbHJlYWR5IGluIGZsaWdodCBpbiB0aGlzIHByb2Nlc3MuIFRoZSB3aW5uZXIncyByZXN1bHQgaXMgcmV0dXJuZWQgdG8gdGhlXG4gKiB3aW5uZXI7IGEgbG9zZXIgYXdhaXRzIHRoZSB3aW5uZXIncyBzZXR0bGVtZW50IChzdWNjZXNzIE9SIGZhaWx1cmUpIGFuZFxuICogdGhlbiByZXR1cm5zIGB7IHR5cGU6ICdza2lwcGVkJyB9YCBzbyBpdHMgY2FsbGVyIGFja3Mgd2l0aG91dCBydW5uaW5nIHRoZVxuICogYm9keS4gQSB3aW5uZXIgZmFpbHVyZSBpcyBub3QgcHJvcGFnYXRlZCB0byB0aGUgbG9zZXI6IHRoZSB3aW5uZXIncyBvd25cbiAqIHF1ZXVlIG1lc3NhZ2UgcmVkZWxpdmVycyBhbmQgZHJpdmVzIHRoZSByZXRyeSwgc28gZXhhY3RseSBvbmUgbWVzc2FnZVxuICoga2VlcHMgb3duaW5nIHRoZSBvdXRjb21lLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuU3RlcFNpbmdsZUZsaWdodChcbiAgcnVuSWQ6IHN0cmluZyxcbiAgY29ycmVsYXRpb25JZDogc3RyaW5nLFxuICBleGVjdXRlOiAoKSA9PiBQcm9taXNlPFN0ZXBFeGVjdXRpb25SZXN1bHQ+XG4pOiBQcm9taXNlPFN0ZXBFeGVjdXRpb25SZXN1bHQ+IHtcbiAgY29uc3Qga2V5ID0gYCR7cnVuSWR9OiR7Y29ycmVsYXRpb25JZH1gO1xuICBjb25zdCBleGlzdGluZyA9IHNpbmdsZUZsaWdodC5pbkZsaWdodC5nZXQoa2V5KTtcbiAgaWYgKGV4aXN0aW5nKSB7XG4gICAgLy8gd2FybiAoYWx3YXlzIHByaW50ZWQsIHVubGlrZSBkZWJ1Zy9pbmZvKTogdGhlIHNpbmdsZS1mbGlnaHQgaXNcbiAgICAvLyBhYnNvcmJpbmcgd2hhdCB3b3VsZCBoYXZlIGJlZW4gYSBkdXBsaWNhdGUgZXhlY3V0aW9uLCB0eXBpY2FsbHkgYVxuICAgIC8vIGRlbGF5ZWQgYmFja3N0b3Agb3IgcmV0cnkgbWVzc2FnZSBsYW5kaW5nIGluIHRoZSBzYW1lIHByb2Nlc3Mgd2hpbGVcbiAgICAvLyB0aGUgb3duZXIgaXMgc3RpbGwgbWlkLWJvZHkuIFJhcmUgYnkgZGVzaWduOyBhIGJ1cnN0IG9mIHRoZXNlIG1lYW5zXG4gICAgLy8gbGVhc2VzIGFyZSBleHBpcmluZyB1bmRlciBsaXZlIGV4ZWN1dGlvbnMgKHJhaXNlXG4gICAgLy8gV09SS0ZMT1dfSU5MSU5FX09XTkVSU0hJUF9MRUFTRV9TRUNPTkRTKS5cbiAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAnU3RlcCBleGVjdXRpb24gYWxyZWFkeSBpbiBmbGlnaHQgaW4gdGhpcyBwcm9jZXNzOyBhd2FpdGluZyBpdHMgc2V0dGxlbWVudCBpbnN0ZWFkIG9mIGV4ZWN1dGluZyBhZ2FpbicsXG4gICAgICB7IHdvcmtmbG93UnVuSWQ6IHJ1bklkLCBzdGVwSWQ6IGNvcnJlbGF0aW9uSWQgfVxuICAgICk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGV4aXN0aW5nO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gVGhlIHdpbm5lciBmYWlsZWQgKHR5cGljYWxseSBhIHRyYW5zaWVudCB3b3JsZCBlcnJvcikuIEl0cyBvd24gcXVldWVcbiAgICAgIC8vIG1lc3NhZ2UgcmVkZWxpdmVycyBhbmQgcmV0cmllczsgdGhpcyBsb3NlciBzdGlsbCBza2lwcy5cbiAgICB9XG4gICAgcmV0dXJuIHsgdHlwZTogJ3NraXBwZWQnIH07XG4gIH1cblxuICBjb25zdCBwcm9taXNlID0gZXhlY3V0ZSgpO1xuICBzaW5nbGVGbGlnaHQuaW5GbGlnaHQuc2V0KGtleSwgcHJvbWlzZSk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHByb21pc2U7XG4gIH0gZmluYWxseSB7XG4gICAgc2luZ2xlRmxpZ2h0LmluRmxpZ2h0LmRlbGV0ZShrZXkpO1xuICB9XG59XG4iXX0=
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { Span } from '@opentelemetry/api';
|
|
2
2
|
import { type SerializedData, type TraceCarrier, type ValidQueueName, type WorkflowRun, type World } from '@workflow/world';
|
|
3
3
|
import type { StepInvocationQueueItem, WorkflowSuspension } from '../global.js';
|
|
4
|
+
import { type GuestCodeExecution } from '../serialization/hardened.js';
|
|
4
5
|
import { type LoadedEventLog } from './helpers.js';
|
|
5
6
|
import { ReplayRecoveryReporter } from './replay-recovery-reporter.js';
|
|
6
7
|
import type { PreclaimedInlineStart } from './step-executor.js';
|
|
@@ -13,7 +14,7 @@ export interface SuspensionHandlerParams {
|
|
|
13
14
|
/**
|
|
14
15
|
* The runtime's loaded event log. Every event creation this suspension makes
|
|
15
16
|
* names the position it was derived from, so a backend that has recorded
|
|
16
|
-
* events the replay did not see can report them back on the write
|
|
17
|
+
* events the replay did not see can report them back on the write, or, if
|
|
17
18
|
* it would rather refuse than report, reject it with a 412. A rejection is
|
|
18
19
|
* not retried here: the event's correlation id was minted by *this* replay's
|
|
19
20
|
* seeded sequence, so re-committing it against a corrected log would persist
|
|
@@ -35,14 +36,14 @@ export interface SuspensionHandlerParams {
|
|
|
35
36
|
replayRecoveryReporter?: ReplayRecoveryReporter;
|
|
36
37
|
/**
|
|
37
38
|
* Resilient step dispatch: when provided (and the per-step eligibility gates
|
|
38
|
-
* pass
|
|
39
|
+
* pass, see the step ops below), each newly created non-inline step's
|
|
39
40
|
* `step_created` write is parallelized with its step-execution queue
|
|
40
41
|
* publish, and the queue message carries the serialized step input
|
|
41
42
|
* (`stepInput`) so the consumer can idempotently re-ensure the event if the
|
|
42
43
|
* direct write failed transiently. Steps queued this way are reported in
|
|
43
44
|
* {@link SuspensionHandlerResult.queuedStepCorrelationIds} so the caller
|
|
44
45
|
* skips them in its own dispatch pass. Omitted by callers that must not
|
|
45
|
-
* queue (terminal drain, tests)
|
|
46
|
+
* queue (terminal drain, tests); creates then behave exactly as before.
|
|
46
47
|
*/
|
|
47
48
|
stepDispatch?: {
|
|
48
49
|
/** The unified workflow queue this run's step messages are published to. */
|
|
@@ -57,9 +58,9 @@ export interface SuspensionHandlerParams {
|
|
|
57
58
|
* Inline step ownership: the queue message ID of the invocation this
|
|
58
59
|
* suspension runs in (the queue handler's meta). When present AND the
|
|
59
60
|
* batched fan-out engages, the lazy-inline steps' deferred writes are
|
|
60
|
-
* folded into the batch as `step_created` + `step_started` pairs
|
|
61
|
+
* folded into the batch as `step_created` + `step_started` pairs (the
|
|
61
62
|
* started row stamped with this ID, exactly like the lazy claim it
|
|
62
|
-
* replaces
|
|
63
|
+
* replaces), pre-claiming the steps the caller is about to run inline. See
|
|
63
64
|
* {@link SuspensionHandlerResult.inlineClaims}. Callers that never
|
|
64
65
|
* inline-execute (terminal drain) omit it, keeping their lazy steps on the
|
|
65
66
|
* plain deferred path.
|
|
@@ -69,8 +70,8 @@ export interface SuspensionHandlerParams {
|
|
|
69
70
|
* Lets the batched fan-out return before every chunk has committed: only
|
|
70
71
|
* the chunk carrying the pre-claimed inline pairs gates the handler's
|
|
71
72
|
* return (its claims are what the caller starts bodies from), while the
|
|
72
|
-
* trailing chunks' commits
|
|
73
|
-
* publishes
|
|
73
|
+
* trailing chunks' commits (and every chunk's in-flush step-message
|
|
74
|
+
* publishes) ride {@link SuspensionHandlerResult.deferredBatchWork}. A
|
|
74
75
|
* caller that opts in MUST await that promise before acking its delivery:
|
|
75
76
|
* the durability contract ("every create durable before ack") moves from
|
|
76
77
|
* the handler's return to that join, and nothing else re-drives a lost
|
|
@@ -90,16 +91,28 @@ export interface SuspensionHandlerResult {
|
|
|
90
91
|
* Correlation IDs for which this suspension call actually wrote the
|
|
91
92
|
* step_created event (as opposed to catching EntityConflictError because
|
|
92
93
|
* a concurrent handler wrote it first). Only the handler that wrote the
|
|
93
|
-
* step_created event should queue / inline-execute the step
|
|
94
|
+
* step_created event should queue / inline-execute the step; this
|
|
94
95
|
* guarantees a single owner per step, even when multiple handlers race
|
|
95
96
|
* into the same batch boundary.
|
|
96
97
|
*/
|
|
97
98
|
createdStepCorrelationIds: Set<string>;
|
|
99
|
+
/**
|
|
100
|
+
* Correlation IDs of steps whose arguments failed to serialize. Each was
|
|
101
|
+
* finalized here as `step_created` (with a placeholder input; the real
|
|
102
|
+
* input is precisely what refused to serialize) followed by `step_failed`
|
|
103
|
+
* carrying the SerializationError, so the next replay rejects the step's
|
|
104
|
+
* promise and a try/catch around the step call observes the error,
|
|
105
|
+
* exactly like a step-body failure. No step-execution message is
|
|
106
|
+
* dispatched for these, so the caller MUST force an in-process replay:
|
|
107
|
+
* when the failed step was the only pending work, nothing else will ever
|
|
108
|
+
* re-invoke the run to observe the terminal event.
|
|
109
|
+
*/
|
|
110
|
+
failedStepCorrelationIds: Set<string>;
|
|
98
111
|
/**
|
|
99
112
|
* Correlation IDs of steps this suspension call already published
|
|
100
113
|
* step-execution queue messages for, via resilient step dispatch (the
|
|
101
114
|
* `step_created` write parallelized with a `stepInput`-carrying queue
|
|
102
|
-
* publish). The caller MUST NOT dispatch these again
|
|
115
|
+
* publish). The caller MUST NOT dispatch these again: the message is
|
|
103
116
|
* already out (a duplicate would be deduped by its idempotency key, but
|
|
104
117
|
* costs a wasted round-trip). Empty when {@link SuspensionHandlerParams.stepDispatch}
|
|
105
118
|
* was not provided or no step was eligible.
|
|
@@ -134,12 +147,12 @@ export interface SuspensionHandlerResult {
|
|
|
134
147
|
* Pre-claimed inline starts, by correlation id: the per-step verdicts of
|
|
135
148
|
* the `step_created` + `step_started` pairs the batched fan-out committed
|
|
136
149
|
* for the lazy-inline steps. A step with an entry here is passed to
|
|
137
|
-
* `executeStep` as `preclaimedStart` INSTEAD of `lazyStepInput
|
|
150
|
+
* `executeStep` as `preclaimedStart` INSTEAD of `lazyStepInput`: its
|
|
138
151
|
* input already rode the pair, and the claim is settled: `owned: true`
|
|
139
152
|
* carries the started attempt-1 entity (input re-attached) so the body
|
|
140
153
|
* runs straight off the batch commit with no start write of its own;
|
|
141
154
|
* `owned: false` lost the pair's atomic create-claim to a concurrent
|
|
142
|
-
* writer, and executeStep returns `skipped` without running the body
|
|
155
|
+
* writer, and executeStep returns `skipped` without running the body,
|
|
143
156
|
* the same outcome as losing the lazy claim. Empty whenever the fold did
|
|
144
157
|
* not engage (batching off, no `ownerMessageId`, or the lone-inline case,
|
|
145
158
|
* which keeps the optimistic lazy path and its claim/body overlap).
|
|
@@ -147,20 +160,20 @@ export interface SuspensionHandlerResult {
|
|
|
147
160
|
* Crash window: the pair commits before the caller runs the body, so a
|
|
148
161
|
* crash between them leaves a started step stamped with this message's
|
|
149
162
|
* ID. Redelivery of the same message re-executes it via the owned-recovery
|
|
150
|
-
* path
|
|
163
|
+
* path, the exact machinery the lazy claim's crash window already uses.
|
|
151
164
|
*/
|
|
152
165
|
inlineClaims: Map<string, PreclaimedInlineStart>;
|
|
153
166
|
/**
|
|
154
167
|
* The highest slot the batched fan-out committed, when it ran. The batch's
|
|
155
168
|
* own events are not in the caller's loaded log (the next reload picks
|
|
156
169
|
* them up), so the caller folds this ceiling into the slot snapshot it
|
|
157
|
-
* hands the inline executions
|
|
170
|
+
* hands the inline executions; otherwise every inline terminal write
|
|
158
171
|
* would name a pre-batch position and be answered with a skipped-slot
|
|
159
172
|
* report echoing the events this suspension just wrote. Under
|
|
160
173
|
* {@link SuspensionHandlerParams.allowDeferredBatchWork} this covers the
|
|
161
174
|
* chunks that had committed by the handler's return (always the pair
|
|
162
175
|
* chunk); a trailing chunk that commits later is echoed back on the
|
|
163
|
-
* terminal writes like any foreign event
|
|
176
|
+
* terminal writes like any foreign event: reports the executor reads for
|
|
164
177
|
* position and discards.
|
|
165
178
|
*
|
|
166
179
|
* So the echo is only fully suppressed for a SINGLE-chunk fold. On a
|
|
@@ -168,7 +181,7 @@ export interface SuspensionHandlerResult {
|
|
|
168
181
|
* chunks are still in flight, and an inline terminal write issued in that
|
|
169
182
|
* window still names a position below them and still draws a report for
|
|
170
183
|
* their events. Bounded (trailing chunks only, large fan-outs only) and
|
|
171
|
-
* self-correcting on the next reload
|
|
184
|
+
* self-correcting on the next reload, and recorded so a report seen there
|
|
172
185
|
* reads as expected rather than as a bug.
|
|
173
186
|
*/
|
|
174
187
|
batchCommittedSlotCeiling?: number;
|
|
@@ -178,7 +191,7 @@ export interface SuspensionHandlerResult {
|
|
|
178
191
|
* trailing work exists: the commits of every chunk except the pair chunk,
|
|
179
192
|
* plus every chunk's step-message publishes (each chained on ITS OWN
|
|
180
193
|
* chunk's commit, so publish-after-create holds per step). The caller
|
|
181
|
-
* MUST await it before acking
|
|
194
|
+
* MUST await it before acking: a rejection here is a failed suspension
|
|
182
195
|
* write and fails the delivery exactly as it would have at the handler's
|
|
183
196
|
* return. Steps whose messages this work publishes are already in
|
|
184
197
|
* {@link queuedStepCorrelationIds} at return time.
|
|
@@ -216,17 +229,18 @@ export interface SuspensionHandlerResult {
|
|
|
216
229
|
* durably creating the user's hooks doesn't count as runtime overhead.
|
|
217
230
|
*/
|
|
218
231
|
hookCreationMs: number;
|
|
219
|
-
/**
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
232
|
+
/** Exact number of workflow-code executions observed during serialization. */
|
|
233
|
+
serializationBlockerCount: number;
|
|
234
|
+
/** Bounded sample used only for retention diagnostics. */
|
|
235
|
+
serializationBlockers: SuspensionSerializationBlocker[];
|
|
236
|
+
}
|
|
237
|
+
export interface SuspensionSerializationBlocker extends GuestCodeExecution {
|
|
238
|
+
source: 'step_input' | 'hook_metadata' | 'hook_abort';
|
|
239
|
+
correlationId: string;
|
|
226
240
|
}
|
|
227
241
|
/**
|
|
228
242
|
* Handles a workflow suspension by processing all pending operations (hooks, steps, waits).
|
|
229
|
-
* Creates events for all operations but does NOT queue step messages
|
|
243
|
+
* Creates events for all operations but does NOT queue step messages; returns the pending
|
|
230
244
|
* steps so the caller can decide which to execute inline vs queue to background.
|
|
231
245
|
*
|
|
232
246
|
* Processing order:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"suspension-handler.d.ts","sourceRoot":"","sources":["../../src/runtime/suspension-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"suspension-handler.d.ts","sourceRoot":"","sources":["../../src/runtime/suspension-handler.ts"],"names":[],"mappings":"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"}
|