@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
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Event } from '@workflow/world';
|
|
2
|
+
import type { EventsConsumer } from './events-consumer.js';
|
|
3
|
+
import type { QueueItem } from './global.js';
|
|
4
|
+
/**
|
|
5
|
+
* Step, wait, hook and attribute correlation ids share one ULID draw per
|
|
6
|
+
* entity, prefixed by kind (`step_<ulid>`, `wait_<ulid>`, `hook_<ulid>`,
|
|
7
|
+
* `attr_<ulid>`). A replay that drew the same ordinal for a different kind of
|
|
8
|
+
* entity than the one the log recorded there produces an event nobody can
|
|
9
|
+
* consume, and the decisive fact for diagnosing that is which pending
|
|
10
|
+
* invocation currently holds the ordinal. This looks it up by the shared ULID
|
|
11
|
+
* body, so a `wait_created` the log holds at a position where the replay is
|
|
12
|
+
* waiting on `step_<same ulid>` names that step.
|
|
13
|
+
*/
|
|
14
|
+
export declare function findPendingItemAtOrdinal(invocationsQueue: Map<string, QueueItem>, correlationId: string): QueueItem | undefined;
|
|
15
|
+
/**
|
|
16
|
+
* The detail appended to a `ReplayDivergenceError` raised because the replay
|
|
17
|
+
* could not place an event. Callers keep their own leading sentence (tests and
|
|
18
|
+
* users match on it) and append this after it.
|
|
19
|
+
*
|
|
20
|
+
* Example:
|
|
21
|
+
* `pending at this id: step drainStep (step_01K…). consumer: index=41,
|
|
22
|
+
* length=44, parked=0, lastConsumed=evnt_01K…`
|
|
23
|
+
*/
|
|
24
|
+
export declare function describeDivergenceContext(event: Event, invocationsQueue: Map<string, QueueItem>, eventsConsumer: EventsConsumer): string;
|
|
25
|
+
//# sourceMappingURL=replay-divergence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replay-divergence.d.ts","sourceRoot":"","sources":["../src/replay-divergence.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CACtC,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,EACxC,aAAa,EAAE,MAAM,GACpB,SAAS,GAAG,SAAS,CASvB;AAsBD;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,KAAK,EACZ,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,EACxC,cAAc,EAAE,cAAc,GAC7B,MAAM,CASR"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Step, wait, hook and attribute correlation ids share one ULID draw per
|
|
3
|
+
* entity, prefixed by kind (`step_<ulid>`, `wait_<ulid>`, `hook_<ulid>`,
|
|
4
|
+
* `attr_<ulid>`). A replay that drew the same ordinal for a different kind of
|
|
5
|
+
* entity than the one the log recorded there produces an event nobody can
|
|
6
|
+
* consume, and the decisive fact for diagnosing that is which pending
|
|
7
|
+
* invocation currently holds the ordinal. This looks it up by the shared ULID
|
|
8
|
+
* body, so a `wait_created` the log holds at a position where the replay is
|
|
9
|
+
* waiting on `step_<same ulid>` names that step.
|
|
10
|
+
*/
|
|
11
|
+
export function findPendingItemAtOrdinal(invocationsQueue, correlationId) {
|
|
12
|
+
const exact = invocationsQueue.get(correlationId);
|
|
13
|
+
if (exact)
|
|
14
|
+
return exact;
|
|
15
|
+
const body = ordinalBody(correlationId);
|
|
16
|
+
if (!body)
|
|
17
|
+
return undefined;
|
|
18
|
+
for (const [id, item] of invocationsQueue) {
|
|
19
|
+
if (ordinalBody(id) === body)
|
|
20
|
+
return item;
|
|
21
|
+
}
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
function ordinalBody(correlationId) {
|
|
25
|
+
const at = correlationId.indexOf('_');
|
|
26
|
+
return at === -1 ? undefined : correlationId.slice(at + 1);
|
|
27
|
+
}
|
|
28
|
+
function describeQueueItem(item) {
|
|
29
|
+
switch (item.type) {
|
|
30
|
+
case 'step':
|
|
31
|
+
return `step ${item.stepName} (${item.correlationId})`;
|
|
32
|
+
case 'hook':
|
|
33
|
+
return `hook (${item.correlationId})`;
|
|
34
|
+
case 'wait':
|
|
35
|
+
return `wait (${item.correlationId})`;
|
|
36
|
+
case 'attribute':
|
|
37
|
+
return `attribute (${item.correlationId})`;
|
|
38
|
+
}
|
|
39
|
+
item;
|
|
40
|
+
return 'unknown';
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* The detail appended to a `ReplayDivergenceError` raised because the replay
|
|
44
|
+
* could not place an event. Callers keep their own leading sentence (tests and
|
|
45
|
+
* users match on it) and append this after it.
|
|
46
|
+
*
|
|
47
|
+
* Example:
|
|
48
|
+
* `pending at this id: step drainStep (step_01K…). consumer: index=41,
|
|
49
|
+
* length=44, parked=0, lastConsumed=evnt_01K…`
|
|
50
|
+
*/
|
|
51
|
+
export function describeDivergenceContext(event, invocationsQueue, eventsConsumer) {
|
|
52
|
+
const pending = event.correlationId
|
|
53
|
+
? findPendingItemAtOrdinal(invocationsQueue, event.correlationId)
|
|
54
|
+
: undefined;
|
|
55
|
+
const snapshot = eventsConsumer.describe();
|
|
56
|
+
return [
|
|
57
|
+
`pending at this id: ${pending ? describeQueueItem(pending) : 'none'}.`,
|
|
58
|
+
`consumer: index=${snapshot.index}, length=${snapshot.length}, parked=${snapshot.parked}, lastConsumed=${snapshot.lastConsumedEventId ?? 'none'}`,
|
|
59
|
+
].join(' ');
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwbGF5LWRpdmVyZ2VuY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcmVwbGF5LWRpdmVyZ2VuY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUE7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxVQUFVLHdCQUF3QixDQUN0QyxnQkFBd0MsRUFDeEMsYUFBcUI7SUFFckIsTUFBTSxLQUFLLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ2xELElBQUksS0FBSztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ3hCLE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN4QyxJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQzVCLEtBQUssTUFBTSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1FBQzFDLElBQUksV0FBVyxDQUFDLEVBQUUsQ0FBQyxLQUFLLElBQUk7WUFBRSxPQUFPLElBQUksQ0FBQztJQUM1QyxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLGFBQXFCO0lBQ3hDLE1BQU0sRUFBRSxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdEMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDN0QsQ0FBQztBQUVELFNBQVMsaUJBQWlCLENBQUMsSUFBZTtJQUN4QyxRQUFRLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNsQixLQUFLLE1BQU07WUFDVCxPQUFPLFFBQVEsSUFBSSxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsYUFBYSxHQUFHLENBQUM7UUFDekQsS0FBSyxNQUFNO1lBQ1QsT0FBTyxTQUFTLElBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQztRQUN4QyxLQUFLLE1BQU07WUFDVCxPQUFPLFNBQVMsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDO1FBQ3hDLEtBQUssV0FBVztZQUNkLE9BQU8sY0FBYyxJQUFJLENBQUMsYUFBYSxHQUFHLENBQUM7SUFDL0MsQ0FBQztJQUNELElBQW9CLENBQUM7SUFDckIsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxVQUFVLHlCQUF5QixDQUN2QyxLQUFZLEVBQ1osZ0JBQXdDLEVBQ3hDLGNBQThCO0lBRTlCLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxhQUFhO1FBQ2pDLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsYUFBYSxDQUFDO1FBQ2pFLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDZCxNQUFNLFFBQVEsR0FBRyxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDM0MsT0FBTztRQUNMLHVCQUF1QixPQUFPLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUc7UUFDdkUsbUJBQW1CLFFBQVEsQ0FBQyxLQUFLLFlBQVksUUFBUSxDQUFDLE1BQU0sWUFBWSxRQUFRLENBQUMsTUFBTSxrQkFBa0IsUUFBUSxDQUFDLG1CQUFtQixJQUFJLE1BQU0sRUFBRTtLQUNsSixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEV2ZW50IH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB0eXBlIHsgRXZlbnRzQ29uc3VtZXIgfSBmcm9tICcuL2V2ZW50cy1jb25zdW1lci5qcyc7XG5pbXBvcnQgdHlwZSB7IFF1ZXVlSXRlbSB9IGZyb20gJy4vZ2xvYmFsLmpzJztcblxuLyoqXG4gKiBTdGVwLCB3YWl0LCBob29rIGFuZCBhdHRyaWJ1dGUgY29ycmVsYXRpb24gaWRzIHNoYXJlIG9uZSBVTElEIGRyYXcgcGVyXG4gKiBlbnRpdHksIHByZWZpeGVkIGJ5IGtpbmQgKGBzdGVwXzx1bGlkPmAsIGB3YWl0Xzx1bGlkPmAsIGBob29rXzx1bGlkPmAsXG4gKiBgYXR0cl88dWxpZD5gKS4gQSByZXBsYXkgdGhhdCBkcmV3IHRoZSBzYW1lIG9yZGluYWwgZm9yIGEgZGlmZmVyZW50IGtpbmQgb2ZcbiAqIGVudGl0eSB0aGFuIHRoZSBvbmUgdGhlIGxvZyByZWNvcmRlZCB0aGVyZSBwcm9kdWNlcyBhbiBldmVudCBub2JvZHkgY2FuXG4gKiBjb25zdW1lLCBhbmQgdGhlIGRlY2lzaXZlIGZhY3QgZm9yIGRpYWdub3NpbmcgdGhhdCBpcyB3aGljaCBwZW5kaW5nXG4gKiBpbnZvY2F0aW9uIGN1cnJlbnRseSBob2xkcyB0aGUgb3JkaW5hbC4gVGhpcyBsb29rcyBpdCB1cCBieSB0aGUgc2hhcmVkIFVMSURcbiAqIGJvZHksIHNvIGEgYHdhaXRfY3JlYXRlZGAgdGhlIGxvZyBob2xkcyBhdCBhIHBvc2l0aW9uIHdoZXJlIHRoZSByZXBsYXkgaXNcbiAqIHdhaXRpbmcgb24gYHN0ZXBfPHNhbWUgdWxpZD5gIG5hbWVzIHRoYXQgc3RlcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRQZW5kaW5nSXRlbUF0T3JkaW5hbChcbiAgaW52b2NhdGlvbnNRdWV1ZTogTWFwPHN0cmluZywgUXVldWVJdGVtPixcbiAgY29ycmVsYXRpb25JZDogc3RyaW5nXG4pOiBRdWV1ZUl0ZW0gfCB1bmRlZmluZWQge1xuICBjb25zdCBleGFjdCA9IGludm9jYXRpb25zUXVldWUuZ2V0KGNvcnJlbGF0aW9uSWQpO1xuICBpZiAoZXhhY3QpIHJldHVybiBleGFjdDtcbiAgY29uc3QgYm9keSA9IG9yZGluYWxCb2R5KGNvcnJlbGF0aW9uSWQpO1xuICBpZiAoIWJvZHkpIHJldHVybiB1bmRlZmluZWQ7XG4gIGZvciAoY29uc3QgW2lkLCBpdGVtXSBvZiBpbnZvY2F0aW9uc1F1ZXVlKSB7XG4gICAgaWYgKG9yZGluYWxCb2R5KGlkKSA9PT0gYm9keSkgcmV0dXJuIGl0ZW07XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gb3JkaW5hbEJvZHkoY29ycmVsYXRpb25JZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgYXQgPSBjb3JyZWxhdGlvbklkLmluZGV4T2YoJ18nKTtcbiAgcmV0dXJuIGF0ID09PSAtMSA/IHVuZGVmaW5lZCA6IGNvcnJlbGF0aW9uSWQuc2xpY2UoYXQgKyAxKTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVRdWV1ZUl0ZW0oaXRlbTogUXVldWVJdGVtKTogc3RyaW5nIHtcbiAgc3dpdGNoIChpdGVtLnR5cGUpIHtcbiAgICBjYXNlICdzdGVwJzpcbiAgICAgIHJldHVybiBgc3RlcCAke2l0ZW0uc3RlcE5hbWV9ICgke2l0ZW0uY29ycmVsYXRpb25JZH0pYDtcbiAgICBjYXNlICdob29rJzpcbiAgICAgIHJldHVybiBgaG9vayAoJHtpdGVtLmNvcnJlbGF0aW9uSWR9KWA7XG4gICAgY2FzZSAnd2FpdCc6XG4gICAgICByZXR1cm4gYHdhaXQgKCR7aXRlbS5jb3JyZWxhdGlvbklkfSlgO1xuICAgIGNhc2UgJ2F0dHJpYnV0ZSc6XG4gICAgICByZXR1cm4gYGF0dHJpYnV0ZSAoJHtpdGVtLmNvcnJlbGF0aW9uSWR9KWA7XG4gIH1cbiAgaXRlbSBzYXRpc2ZpZXMgbmV2ZXI7XG4gIHJldHVybiAndW5rbm93bic7XG59XG5cbi8qKlxuICogVGhlIGRldGFpbCBhcHBlbmRlZCB0byBhIGBSZXBsYXlEaXZlcmdlbmNlRXJyb3JgIHJhaXNlZCBiZWNhdXNlIHRoZSByZXBsYXlcbiAqIGNvdWxkIG5vdCBwbGFjZSBhbiBldmVudC4gQ2FsbGVycyBrZWVwIHRoZWlyIG93biBsZWFkaW5nIHNlbnRlbmNlICh0ZXN0cyBhbmRcbiAqIHVzZXJzIG1hdGNoIG9uIGl0KSBhbmQgYXBwZW5kIHRoaXMgYWZ0ZXIgaXQuXG4gKlxuICogRXhhbXBsZTpcbiAqIGBwZW5kaW5nIGF0IHRoaXMgaWQ6IHN0ZXAgZHJhaW5TdGVwIChzdGVwXzAxS+KApikuIGNvbnN1bWVyOiBpbmRleD00MSxcbiAqIGxlbmd0aD00NCwgcGFya2VkPTAsIGxhc3RDb25zdW1lZD1ldm50XzAxS+KApmBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlc2NyaWJlRGl2ZXJnZW5jZUNvbnRleHQoXG4gIGV2ZW50OiBFdmVudCxcbiAgaW52b2NhdGlvbnNRdWV1ZTogTWFwPHN0cmluZywgUXVldWVJdGVtPixcbiAgZXZlbnRzQ29uc3VtZXI6IEV2ZW50c0NvbnN1bWVyXG4pOiBzdHJpbmcge1xuICBjb25zdCBwZW5kaW5nID0gZXZlbnQuY29ycmVsYXRpb25JZFxuICAgID8gZmluZFBlbmRpbmdJdGVtQXRPcmRpbmFsKGludm9jYXRpb25zUXVldWUsIGV2ZW50LmNvcnJlbGF0aW9uSWQpXG4gICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHNuYXBzaG90ID0gZXZlbnRzQ29uc3VtZXIuZGVzY3JpYmUoKTtcbiAgcmV0dXJuIFtcbiAgICBgcGVuZGluZyBhdCB0aGlzIGlkOiAke3BlbmRpbmcgPyBkZXNjcmliZVF1ZXVlSXRlbShwZW5kaW5nKSA6ICdub25lJ30uYCxcbiAgICBgY29uc3VtZXI6IGluZGV4PSR7c25hcHNob3QuaW5kZXh9LCBsZW5ndGg9JHtzbmFwc2hvdC5sZW5ndGh9LCBwYXJrZWQ9JHtzbmFwc2hvdC5wYXJrZWR9LCBsYXN0Q29uc3VtZWQ9JHtzbmFwc2hvdC5sYXN0Q29uc3VtZWRFdmVudElkID8/ICdub25lJ31gLFxuICBdLmpvaW4oJyAnKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type { Event, WorkflowRun } from '@workflow/world';
|
|
2
|
+
import type { PayloadKey } from './serialization/encryption.js';
|
|
3
|
+
import { type PreparedReplayPayload, type ReplayPayloadPreparer } from './serialization.js';
|
|
4
|
+
type ReplayPayloadField = 'result' | 'error' | 'payload';
|
|
5
|
+
/**
|
|
6
|
+
* Invocation-scoped cache for replay payload hydration.
|
|
7
|
+
*
|
|
8
|
+
* A workflow invocation may replay the same event log through several fresh
|
|
9
|
+
* VMs. This cache keeps the VM-independent decrypt/decompress result across
|
|
10
|
+
* those replays. Deserialization still runs against each VM's globals so every
|
|
11
|
+
* replay receives fresh object graphs and correctly revived Workflow objects.
|
|
12
|
+
*
|
|
13
|
+
* Successful prepared plaintext and memoized primitive step results remain
|
|
14
|
+
* resident for the invocation lifetime. Their memory never crosses workflow
|
|
15
|
+
* runs or queue deliveries.
|
|
16
|
+
*/
|
|
17
|
+
export declare class ReplayPayloadCache {
|
|
18
|
+
private readonly preparer;
|
|
19
|
+
private readonly preparedPayloads;
|
|
20
|
+
private readonly primitiveStepResults;
|
|
21
|
+
private readonly encryptionKey;
|
|
22
|
+
private nextUnscannedEventIndex;
|
|
23
|
+
constructor(encryptionKey: PayloadKey | undefined | Promise<PayloadKey | undefined>, preparer?: ReplayPayloadPreparer);
|
|
24
|
+
/** Start preparing an event payload as soon as its frame is decoded. */
|
|
25
|
+
prepareEvent(event: Event): void;
|
|
26
|
+
/**
|
|
27
|
+
* Start every missing binary preparation before workflow execution. Failures
|
|
28
|
+
* are intentionally retained: the ordered event consumer must observe the
|
|
29
|
+
* original rejection before that entry becomes retryable.
|
|
30
|
+
*/
|
|
31
|
+
prewarm(workflowRun: WorkflowRun, events: Event[]): Promise<void>;
|
|
32
|
+
/** Rescan the next event log after an authoritative replacement. */
|
|
33
|
+
resetScan(): void;
|
|
34
|
+
/** Return the workflow input after shared host-side preparation. */
|
|
35
|
+
prepareWorkflowInput(workflowRun: WorkflowRun): Promise<PreparedReplayPayload>;
|
|
36
|
+
/**
|
|
37
|
+
* Return an event payload after shared host-side preparation. A rejected
|
|
38
|
+
* preparation is evicted only after this ordered consumer requests it, so a
|
|
39
|
+
* later replay can retry without hiding the original failure.
|
|
40
|
+
*/
|
|
41
|
+
prepareEventPayload(eventId: string, field: ReplayPayloadField, value: unknown): Promise<PreparedReplayPayload>;
|
|
42
|
+
/**
|
|
43
|
+
* Reuse final step values only when sharing them across VMs is unobservable.
|
|
44
|
+
* Objects always run `hydrate` again to produce a fresh VM-specific value;
|
|
45
|
+
* every primitive is safe to reuse directly.
|
|
46
|
+
*/
|
|
47
|
+
getStepResult(eventId: string, hydrate: () => Promise<unknown>): Promise<unknown>;
|
|
48
|
+
/**
|
|
49
|
+
* Consumer-facing lookup. Binary payloads share preparation; legacy values
|
|
50
|
+
* bypass the cache because their flattened representation may be mutated.
|
|
51
|
+
*/
|
|
52
|
+
private consumePreparation;
|
|
53
|
+
/** Start preparation once and share the exact in-flight promise. */
|
|
54
|
+
private ensurePreparation;
|
|
55
|
+
/** Normalize synchronous and asynchronous preparers to one promise contract. */
|
|
56
|
+
private runPreparation;
|
|
57
|
+
/** Start one event's binary payload unless another path already did. */
|
|
58
|
+
private prepareEventIfMissing;
|
|
59
|
+
private startPreparation;
|
|
60
|
+
private workflowInputKey;
|
|
61
|
+
private eventPayloadKey;
|
|
62
|
+
}
|
|
63
|
+
export {};
|
|
64
|
+
//# sourceMappingURL=replay-payload-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replay-payload-cache.d.ts","sourceRoot":"","sources":["../src/replay-payload-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EACL,KAAK,qBAAqB,EAE1B,KAAK,qBAAqB,EAC3B,MAAM,oBAAoB,CAAC;AAE5B,KAAK,kBAAkB,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;AASzD;;;;;;;;;;;GAWG;AACH,qBAAa,kBAAkB;IAW3B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAV3B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAG7B;IACJ,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAA8B;IACnE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAkC;IAChE,OAAO,CAAC,uBAAuB,CAAK;gBAGlC,aAAa,EAAE,UAAU,GAAG,SAAS,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,EACtD,QAAQ,GAAE,qBAA4C;IAKzE,wEAAwE;IACxE,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAOhC;;;;OAIG;IACG,OAAO,CAAC,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBvE,oEAAoE;IACpE,SAAS,IAAI,IAAI;IAIjB,oEAAoE;IACpE,oBAAoB,CAClB,WAAW,EAAE,WAAW,GACvB,OAAO,CAAC,qBAAqB,CAAC;IAOjC;;;;OAIG;IACH,mBAAmB,CACjB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,kBAAkB,EACzB,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,qBAAqB,CAAC;IAIjC;;;;OAIG;IACG,aAAa,CACjB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,GAC9B,OAAO,CAAC,OAAO,CAAC;IAYnB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAe1B,oEAAoE;IACpE,OAAO,CAAC,iBAAiB;IAYzB,gFAAgF;YAClE,cAAc;IAI5B,wEAAwE;IACxE,OAAO,CAAC,qBAAqB;IAqC7B,OAAO,CAAC,gBAAgB;IAUxB,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,eAAe;CAGxB"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { prepareReplayPayload, } from './serialization.js';
|
|
2
|
+
function isMemoizablePrimitive(value) {
|
|
3
|
+
if (value === null)
|
|
4
|
+
return true;
|
|
5
|
+
const type = typeof value;
|
|
6
|
+
if (type === 'object' || type === 'function')
|
|
7
|
+
return false;
|
|
8
|
+
return true;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Invocation-scoped cache for replay payload hydration.
|
|
12
|
+
*
|
|
13
|
+
* A workflow invocation may replay the same event log through several fresh
|
|
14
|
+
* VMs. This cache keeps the VM-independent decrypt/decompress result across
|
|
15
|
+
* those replays. Deserialization still runs against each VM's globals so every
|
|
16
|
+
* replay receives fresh object graphs and correctly revived Workflow objects.
|
|
17
|
+
*
|
|
18
|
+
* Successful prepared plaintext and memoized primitive step results remain
|
|
19
|
+
* resident for the invocation lifetime. Their memory never crosses workflow
|
|
20
|
+
* runs or queue deliveries.
|
|
21
|
+
*/
|
|
22
|
+
export class ReplayPayloadCache {
|
|
23
|
+
preparer;
|
|
24
|
+
preparedPayloads = new Map();
|
|
25
|
+
primitiveStepResults = new Map();
|
|
26
|
+
encryptionKey;
|
|
27
|
+
nextUnscannedEventIndex = 0;
|
|
28
|
+
constructor(encryptionKey, preparer = prepareReplayPayload) {
|
|
29
|
+
this.preparer = preparer;
|
|
30
|
+
this.encryptionKey = Promise.resolve(encryptionKey);
|
|
31
|
+
}
|
|
32
|
+
/** Start preparing an event payload as soon as its frame is decoded. */
|
|
33
|
+
prepareEvent(event) {
|
|
34
|
+
const preparation = this.prepareEventIfMissing(event);
|
|
35
|
+
// Streaming preparation is speculative. Its ordered consumer observes the
|
|
36
|
+
// original rejection and makes that cache entry retryable.
|
|
37
|
+
void preparation?.catch(() => { });
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Start every missing binary preparation before workflow execution. Failures
|
|
41
|
+
* are intentionally retained: the ordered event consumer must observe the
|
|
42
|
+
* original rejection before that entry becomes retryable.
|
|
43
|
+
*/
|
|
44
|
+
async prewarm(workflowRun, events) {
|
|
45
|
+
const preparations = [];
|
|
46
|
+
const workflowInput = this.startPreparation(this.workflowInputKey(workflowRun.runId), workflowRun.input);
|
|
47
|
+
if (workflowInput)
|
|
48
|
+
preparations.push(workflowInput);
|
|
49
|
+
for (let index = this.nextUnscannedEventIndex; index < events.length; index++) {
|
|
50
|
+
const event = events[index];
|
|
51
|
+
const preparation = this.prepareEventIfMissing(event);
|
|
52
|
+
if (preparation)
|
|
53
|
+
preparations.push(preparation);
|
|
54
|
+
}
|
|
55
|
+
this.nextUnscannedEventIndex = events.length;
|
|
56
|
+
// Prewarming is speculative and must not fail replay before the matching
|
|
57
|
+
// event is consumed. allSettled also attaches rejection handlers eagerly.
|
|
58
|
+
await Promise.allSettled(preparations);
|
|
59
|
+
}
|
|
60
|
+
/** Rescan the next event log after an authoritative replacement. */
|
|
61
|
+
resetScan() {
|
|
62
|
+
this.nextUnscannedEventIndex = 0;
|
|
63
|
+
}
|
|
64
|
+
/** Return the workflow input after shared host-side preparation. */
|
|
65
|
+
prepareWorkflowInput(workflowRun) {
|
|
66
|
+
return this.consumePreparation(this.workflowInputKey(workflowRun.runId), workflowRun.input);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Return an event payload after shared host-side preparation. A rejected
|
|
70
|
+
* preparation is evicted only after this ordered consumer requests it, so a
|
|
71
|
+
* later replay can retry without hiding the original failure.
|
|
72
|
+
*/
|
|
73
|
+
prepareEventPayload(eventId, field, value) {
|
|
74
|
+
return this.consumePreparation(this.eventPayloadKey(eventId, field), value);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Reuse final step values only when sharing them across VMs is unobservable.
|
|
78
|
+
* Objects always run `hydrate` again to produce a fresh VM-specific value;
|
|
79
|
+
* every primitive is safe to reuse directly.
|
|
80
|
+
*/
|
|
81
|
+
async getStepResult(eventId, hydrate) {
|
|
82
|
+
if (this.primitiveStepResults.has(eventId)) {
|
|
83
|
+
return this.primitiveStepResults.get(eventId);
|
|
84
|
+
}
|
|
85
|
+
const value = await hydrate();
|
|
86
|
+
if (isMemoizablePrimitive(value)) {
|
|
87
|
+
this.primitiveStepResults.set(eventId, value);
|
|
88
|
+
}
|
|
89
|
+
return value;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Consumer-facing lookup. Binary payloads share preparation; legacy values
|
|
93
|
+
* bypass the cache because their flattened representation may be mutated.
|
|
94
|
+
*/
|
|
95
|
+
consumePreparation(cacheKey, value) {
|
|
96
|
+
if (!(value instanceof Uint8Array))
|
|
97
|
+
return this.runPreparation(value);
|
|
98
|
+
const preparation = this.ensurePreparation(cacheKey, value);
|
|
99
|
+
void preparation.catch(() => {
|
|
100
|
+
if (this.preparedPayloads.get(cacheKey) === preparation) {
|
|
101
|
+
this.preparedPayloads.delete(cacheKey);
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
return preparation;
|
|
105
|
+
}
|
|
106
|
+
/** Start preparation once and share the exact in-flight promise. */
|
|
107
|
+
ensurePreparation(cacheKey, value) {
|
|
108
|
+
const cached = this.preparedPayloads.get(cacheKey);
|
|
109
|
+
if (cached)
|
|
110
|
+
return cached;
|
|
111
|
+
const preparation = this.runPreparation(value);
|
|
112
|
+
this.preparedPayloads.set(cacheKey, preparation);
|
|
113
|
+
return preparation;
|
|
114
|
+
}
|
|
115
|
+
/** Normalize synchronous and asynchronous preparers to one promise contract. */
|
|
116
|
+
async runPreparation(value) {
|
|
117
|
+
return this.preparer(value, await this.encryptionKey);
|
|
118
|
+
}
|
|
119
|
+
/** Start one event's binary payload unless another path already did. */
|
|
120
|
+
prepareEventIfMissing(event) {
|
|
121
|
+
let field;
|
|
122
|
+
let value;
|
|
123
|
+
switch (event.eventType) {
|
|
124
|
+
case 'run_created':
|
|
125
|
+
return this.startPreparation(this.workflowInputKey(event.runId), event.eventData.input);
|
|
126
|
+
case 'run_started':
|
|
127
|
+
return this.startPreparation(this.workflowInputKey(event.runId), event.eventData?.input);
|
|
128
|
+
case 'step_completed':
|
|
129
|
+
field = 'result';
|
|
130
|
+
value = event.eventData?.result;
|
|
131
|
+
break;
|
|
132
|
+
case 'step_failed':
|
|
133
|
+
field = 'error';
|
|
134
|
+
value = event.eventData?.error;
|
|
135
|
+
break;
|
|
136
|
+
case 'hook_received':
|
|
137
|
+
field = 'payload';
|
|
138
|
+
value = event.eventData?.payload;
|
|
139
|
+
break;
|
|
140
|
+
default:
|
|
141
|
+
return undefined;
|
|
142
|
+
}
|
|
143
|
+
return this.startPreparation(this.eventPayloadKey(event.eventId, field), value);
|
|
144
|
+
}
|
|
145
|
+
startPreparation(cacheKey, value) {
|
|
146
|
+
if (!(value instanceof Uint8Array) || this.preparedPayloads.has(cacheKey)) {
|
|
147
|
+
return undefined;
|
|
148
|
+
}
|
|
149
|
+
return this.ensurePreparation(cacheKey, value);
|
|
150
|
+
}
|
|
151
|
+
workflowInputKey(runId) {
|
|
152
|
+
return `run:${runId}:input`;
|
|
153
|
+
}
|
|
154
|
+
eventPayloadKey(eventId, field) {
|
|
155
|
+
return `event:${eventId}:${field}`;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwbGF5LXBheWxvYWQtY2FjaGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcmVwbGF5LXBheWxvYWQtY2FjaGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUVMLG9CQUFvQixHQUVyQixNQUFNLG9CQUFvQixDQUFDO0FBSTVCLFNBQVMscUJBQXFCLENBQUMsS0FBYztJQUMzQyxJQUFJLEtBQUssS0FBSyxJQUFJO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDaEMsTUFBTSxJQUFJLEdBQUcsT0FBTyxLQUFLLENBQUM7SUFDMUIsSUFBSSxJQUFJLEtBQUssUUFBUSxJQUFJLElBQUksS0FBSyxVQUFVO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDM0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLE9BQU8sa0JBQWtCO0lBV1Y7SUFWRixnQkFBZ0IsR0FBRyxJQUFJLEdBQUcsRUFHeEMsQ0FBQztJQUNhLG9CQUFvQixHQUFHLElBQUksR0FBRyxFQUFtQixDQUFDO0lBQ2xELGFBQWEsQ0FBa0M7SUFDeEQsdUJBQXVCLEdBQUcsQ0FBQyxDQUFDO0lBRXBDLFlBQ0UsYUFBdUUsRUFDdEQsV0FBa0Msb0JBQW9CO1FBQXRELGFBQVEsR0FBUixRQUFRLENBQThDO1FBRXZFLElBQUksQ0FBQyxhQUFhLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRUQsd0VBQXdFO0lBQ3hFLFlBQVksQ0FBQyxLQUFZO1FBQ3ZCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0RCwwRUFBMEU7UUFDMUUsMkRBQTJEO1FBQzNELEtBQUssV0FBVyxFQUFFLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FB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QUssQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDO2dCQUNoQyxNQUFNO1lBQ1IsS0FBSyxhQUFhO2dCQUNoQixLQUFLLEdBQUcsT0FBTyxDQUFDO2dCQUNoQixLQUFLLEdBQUcsS0FBSyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUM7Z0JBQy9CLE1BQU07WUFDUixLQUFLLGVBQWU7Z0JBQ2xCLEtBQUssR0FBRyxTQUFTLENBQUM7Z0JBQ2xCLEtBQUssR0FBRyxLQUFLLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQztnQkFDakMsTUFBTTtZQUNSO2dCQUNFLE9BQU8sU0FBUyxDQUFDO1FBQ3JCLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FDMUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxFQUMxQyxLQUFLLENBQ04sQ0FBQztJQUNKLENBQUM7SUFFTyxnQkFBZ0IsQ0FDdEIsUUFBZ0IsRUFDaEIsS0FBYztRQUVkLElBQUksQ0FBQyxDQUFDLEtBQUssWUFBWSxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDMUUsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRU8sZ0JBQWdCLENBQUMsS0FBYTtRQUNwQyxPQUFPLE9BQU8sS0FBSyxRQUFRLENBQUM7SUFDOUIsQ0FBQztJQUVPLGVBQWUsQ0FBQyxPQUFlLEVBQUUsS0FBeUI7UUFDaEUsT0FBTyxTQUFTLE9BQU8sSUFBSSxLQUFLLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEV2ZW50LCBXb3JrZmxvd1J1biB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgdHlwZSB7IFBheWxvYWRLZXkgfSBmcm9tICcuL3NlcmlhbGl6YXRpb24vZW5jcnlwdGlvbi5qcyc7XG5pbXBvcnQge1xuICB0eXBlIFByZXBhcmVkUmVwbGF5UGF5bG9hZCxcbiAgcHJlcGFyZVJlcGxheVBheWxvYWQsXG4gIHR5cGUgUmVwbGF5UGF5bG9hZFByZXBhcmVyLFxufSBmcm9tICcuL3NlcmlhbGl6YXRpb24uanMnO1xuXG50eXBlIFJlcGxheVBheWxvYWRGaWVsZCA9ICdyZXN1bHQnIHwgJ2Vycm9yJyB8ICdwYXlsb2FkJztcblxuZnVuY3Rpb24gaXNNZW1vaXphYmxlUHJpbWl0aXZlKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuIHRydWU7XG4gIGNvbnN0IHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIGlmICh0eXBlID09PSAnb2JqZWN0JyB8fCB0eXBlID09PSAnZnVuY3Rpb24nKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIEludm9jYXRpb24tc2NvcGVkIGNhY2hlIGZvciByZXBsYXkgcGF5bG9hZCBoeWRyYXRpb24uXG4gKlxuICogQSB3b3JrZmxvdyBpbnZvY2F0aW9uIG1heSByZXBsYXkgdGhlIHNhbWUgZXZlbnQgbG9nIHRocm91Z2ggc2V2ZXJhbCBmcmVzaFxuICogVk1zLiBUaGlzIGNhY2hlIGtlZXBzIHRoZSBWTS1pbmRlcGVuZGVudCBkZWNyeXB0L2RlY29tcHJlc3MgcmVzdWx0IGFjcm9zc1xuICogdGhvc2UgcmVwbGF5cy4gRGVzZXJpYWxpemF0aW9uIHN0aWxsIHJ1bnMgYWdhaW5zdCBlYWNoIFZNJ3MgZ2xvYmFscyBzbyBldmVyeVxuICogcmVwbGF5IHJlY2VpdmVzIGZyZXNoIG9iamVjdCBncmFwaHMgYW5kIGNvcnJlY3RseSByZXZpdmVkIFdvcmtmbG93IG9iamVjdHMuXG4gKlxuICogU3VjY2Vzc2Z1bCBwcmVwYXJlZCBwbGFpbnRleHQgYW5kIG1lbW9pemVkIHByaW1pdGl2ZSBzdGVwIHJlc3VsdHMgcmVtYWluXG4gKiByZXNpZGVudCBmb3IgdGhlIGludm9jYXRpb24gbGlmZXRpbWUuIFRoZWlyIG1lbW9yeSBuZXZlciBjcm9zc2VzIHdvcmtmbG93XG4gKiBydW5zIG9yIHF1ZXVlIGRlbGl2ZXJpZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBSZXBsYXlQYXlsb2FkQ2FjaGUge1xuICBwcml2YXRlIHJlYWRvbmx5IHByZXBhcmVkUGF5bG9hZHMgPSBuZXcgTWFwPFxuICAgIHN0cmluZyxcbiAgICBQcm9taXNlPFByZXBhcmVkUmVwbGF5UGF5bG9hZD5cbiAgPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHByaW1pdGl2ZVN0ZXBSZXN1bHRzID0gbmV3IE1hcDxzdHJpbmcsIHVua25vd24+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZW5jcnlwdGlvbktleTogUHJvbWlzZTxQYXlsb2FkS2V5IHwgdW5kZWZpbmVkPjtcbiAgcHJpdmF0ZSBuZXh0VW5zY2FubmVkRXZlbnRJbmRleCA9IDA7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgZW5jcnlwdGlvbktleTogUGF5bG9hZEtleSB8IHVuZGVmaW5lZCB8IFByb21pc2U8UGF5bG9hZEtleSB8IHVuZGVmaW5lZD4sXG4gICAgcHJpdmF0ZSByZWFkb25seSBwcmVwYXJlcjogUmVwbGF5UGF5bG9hZFByZXBhcmVyID0gcHJlcGFyZVJlcGxheVBheWxvYWRcbiAgKSB7XG4gICAgdGhpcy5lbmNyeXB0aW9uS2V5ID0gUHJvbWlzZS5yZXNvbHZlKGVuY3J5cHRpb25LZXkpO1xuICB9XG5cbiAgLyoqIFN0YXJ0IHByZXBhcmluZyBhbiBldmVudCBwYXlsb2FkIGFzIHNvb24gYXMgaXRzIGZyYW1lIGlzIGRlY29kZWQuICovXG4gIHByZXBhcmVFdmVudChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBwcmVwYXJhdGlvbiA9IHRoaXMucHJlcGFyZUV2ZW50SWZNaXNzaW5nKGV2ZW50KTtcbiAgICAvLyBTdHJlYW1pbmcgcHJlcGFyYXRpb24gaXMgc3BlY3VsYXRpdmUuIEl0cyBvcmRlcmVkIGNvbnN1bWVyIG9ic2VydmVzIHRoZVxuICAgIC8vIG9yaWdpbmFsIHJlamVjdGlvbiBhbmQgbWFrZXMgdGhhdCBjYWNoZSBlbnRyeSByZXRyeWFibGUuXG4gICAgdm9pZCBwcmVwYXJhdGlvbj8uY2F0Y2goKCkgPT4ge30pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0IGV2ZXJ5IG1pc3NpbmcgYmluYXJ5IHByZXBhcmF0aW9uIGJlZm9yZSB3b3JrZmxvdyBleGVjdXRpb24uIEZhaWx1cmVzXG4gICAqIGFyZSBpbnRlbnRpb25hbGx5IHJldGFpbmVkOiB0aGUgb3JkZXJlZCBldmVudCBjb25zdW1lciBtdXN0IG9ic2VydmUgdGhlXG4gICAqIG9yaWdpbmFsIHJlamVjdGlvbiBiZWZvcmUgdGhhdCBlbnRyeSBiZWNvbWVzIHJldHJ5YWJsZS5cbiAgICovXG4gIGFzeW5jIHByZXdhcm0od29ya2Zsb3dSdW46IFdvcmtmbG93UnVuLCBldmVudHM6IEV2ZW50W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwcmVwYXJhdGlvbnM6IFByb21pc2U8UHJlcGFyZWRSZXBsYXlQYXlsb2FkPltdID0gW107XG4gICAgY29uc3Qgd29ya2Zsb3dJbnB1dCA9IHRoaXMuc3RhcnRQcmVwYXJhdGlvbihcbiAgICAgIHRoaXMud29ya2Zsb3dJbnB1dEtleSh3b3JrZmxvd1J1bi5ydW5JZCksXG4gICAgICB3b3JrZmxvd1J1bi5pbnB1dFxuICAgICk7XG4gICAgaWYgKHdvcmtmbG93SW5wdXQpIHByZXBhcmF0aW9ucy5wdXNoKHdvcmtmbG93SW5wdXQpO1xuICAgIGZvciAoXG4gICAgICBsZXQgaW5kZXggPSB0aGlzLm5leHRVbnNjYW5uZWRFdmVudEluZGV4O1xuICAgICAgaW5kZXggPCBldmVudHMubGVuZ3RoO1xuICAgICAgaW5kZXgrK1xuICAgICkge1xuICAgICAgY29uc3QgZXZlbnQgPSBldmVudHNbaW5kZXhdO1xuICAgICAgY29uc3QgcHJlcGFyYXRpb24gPSB0aGlzLnByZXBhcmVFdmVudElmTWlzc2luZyhldmVudCk7XG4gICAgICBpZiAocHJlcGFyYXRpb24pIHByZXBhcmF0aW9ucy5wdXNoKHByZXBhcmF0aW9uKTtcbiAgICB9XG4gICAgdGhpcy5uZXh0VW5zY2FubmVkRXZlbnRJbmRleCA9IGV2ZW50cy5sZW5ndGg7XG5cbiAgICAvLyBQcmV3YXJtaW5nIGlzIHNwZWN1bGF0aXZlIGFuZCBtdXN0IG5vdCBmYWlsIHJlcGxheSBiZWZvcmUgdGhlIG1hdGNoaW5nXG4gICAgLy8gZXZlbnQgaXMgY29uc3VtZWQuIGFsbFNldHRsZWQgYWxzbyBhdHRhY2hlcyByZWplY3Rpb24gaGFuZGxlcnMgZWFnZXJseS5cbiAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQocHJlcGFyYXRpb25zKTtcbiAgfVxuXG4gIC8qKiBSZXNjYW4gdGhlIG5leHQgZXZlbnQgbG9nIGFmdGVyIGFuIGF1dGhvcml0YXRpdmUgcmVwbGFjZW1lbnQuICovXG4gIHJlc2V0U2NhbigpOiB2b2lkIHtcbiAgICB0aGlzLm5leHRVbnNjYW5uZWRFdmVudEluZGV4ID0gMDtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gdGhlIHdvcmtmbG93IGlucHV0IGFmdGVyIHNoYXJlZCBob3N0LXNpZGUgcHJlcGFyYXRpb24uICovXG4gIHByZXBhcmVXb3JrZmxvd0lucHV0KFxuICAgIHdvcmtmbG93UnVuOiBXb3JrZmxvd1J1blxuICApOiBQcm9taXNlPFByZXBhcmVkUmVwbGF5UGF5bG9hZD4ge1xuICAgIHJldHVybiB0aGlzLmNvbnN1bWVQcmVwYXJhdGlvbihcbiAgICAgIHRoaXMud29ya2Zsb3dJbnB1dEtleSh3b3JrZmxvd1J1bi5ydW5JZCksXG4gICAgICB3b3JrZmxvd1J1bi5pbnB1dFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGFuIGV2ZW50IHBheWxvYWQgYWZ0ZXIgc2hhcmVkIGhvc3Qtc2lkZSBwcmVwYXJhdGlvbi4gQSByZWplY3RlZFxuICAgKiBwcmVwYXJhdGlvbiBpcyBldmljdGVkIG9ubHkgYWZ0ZXIgdGhpcyBvcmRlcmVkIGNvbnN1bWVyIHJlcXVlc3RzIGl0LCBzbyBhXG4gICAqIGxhdGVyIHJlcGxheSBjYW4gcmV0cnkgd2l0aG91dCBoaWRpbmcgdGhlIG9yaWdpbmFsIGZhaWx1cmUuXG4gICAqL1xuICBwcmVwYXJlRXZlbnRQYXlsb2FkKFxuICAgIGV2ZW50SWQ6IHN0cmluZyxcbiAgICBmaWVsZDogUmVwbGF5UGF5bG9hZEZpZWxkLFxuICAgIHZhbHVlOiB1bmtub3duXG4gICk6IFByb21pc2U8UHJlcGFyZWRSZXBsYXlQYXlsb2FkPiB7XG4gICAgcmV0dXJuIHRoaXMuY29uc3VtZVByZXBhcmF0aW9uKHRoaXMuZXZlbnRQYXlsb2FkS2V5KGV2ZW50SWQsIGZpZWxkKSwgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldXNlIGZpbmFsIHN0ZXAgdmFsdWVzIG9ubHkgd2hlbiBzaGFyaW5nIHRoZW0gYWNyb3NzIFZNcyBpcyB1bm9ic2VydmFibGUuXG4gICAqIE9iamVjdHMgYWx3YXlzIHJ1biBgaHlkcmF0ZWAgYWdhaW4gdG8gcHJvZHVjZSBhIGZyZXNoIFZNLXNwZWNpZmljIHZhbHVlO1xuICAgKiBldmVyeSBwcmltaXRpdmUgaXMgc2FmZSB0byByZXVzZSBkaXJlY3RseS5cbiAgICovXG4gIGFzeW5jIGdldFN0ZXBSZXN1bHQoXG4gICAgZXZlbnRJZDogc3RyaW5nLFxuICAgIGh5ZHJhdGU6ICgpID0+IFByb21pc2U8dW5rbm93bj5cbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgaWYgKHRoaXMucHJpbWl0aXZlU3RlcFJlc3VsdHMuaGFzKGV2ZW50SWQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcmltaXRpdmVTdGVwUmVzdWx0cy5nZXQoZXZlbnRJZCk7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSBhd2FpdCBoeWRyYXRlKCk7XG4gICAgaWYgKGlzTWVtb2l6YWJsZVByaW1pdGl2ZSh2YWx1ZSkpIHtcbiAgICAgIHRoaXMucHJpbWl0aXZlU3RlcFJlc3VsdHMuc2V0KGV2ZW50SWQsIHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnN1bWVyLWZhY2luZyBsb29rdXAuIEJpbmFyeSBwYXlsb2FkcyBzaGFyZSBwcmVwYXJhdGlvbjsgbGVnYWN5IHZhbHVlc1xuICAgKiBieXBhc3MgdGhlIGNhY2hlIGJlY2F1c2UgdGhlaXIgZmxhdHRlbmVkIHJlcHJlc2VudGF0aW9uIG1heSBiZSBtdXRhdGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBjb25zdW1lUHJlcGFyYXRpb24oXG4gICAgY2FjaGVLZXk6IHN0cmluZyxcbiAgICB2YWx1ZTogdW5rbm93blxuICApOiBQcm9taXNlPFByZXBhcmVkUmVwbGF5UGF5bG9hZD4ge1xuICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHJldHVybiB0aGlzLnJ1blByZXBhcmF0aW9uKHZhbHVlKTtcblxuICAgIGNvbnN0IHByZXBhcmF0aW9uID0gdGhpcy5lbnN1cmVQcmVwYXJhdGlvbihjYWNoZUtleSwgdmFsdWUpO1xuICAgIHZvaWQgcHJlcGFyYXRpb24uY2F0Y2goKCkgPT4ge1xuICAgICAgaWYgKHRoaXMucHJlcGFyZWRQYXlsb2Fkcy5nZXQoY2FjaGVLZXkpID09PSBwcmVwYXJhdGlvbikge1xuICAgICAgICB0aGlzLnByZXBhcmVkUGF5bG9hZHMuZGVsZXRlKGNhY2hlS2V5KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcHJlcGFyYXRpb247XG4gIH1cblxuICAvKiogU3RhcnQgcHJlcGFyYXRpb24gb25jZSBhbmQgc2hhcmUgdGhlIGV4YWN0IGluLWZsaWdodCBwcm9taXNlLiAqL1xuICBwcml2YXRlIGVuc3VyZVByZXBhcmF0aW9uKFxuICAgIGNhY2hlS2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IFVpbnQ4QXJyYXlcbiAgKTogUHJvbWlzZTxQcmVwYXJlZFJlcGxheVBheWxvYWQ+IHtcbiAgICBjb25zdCBjYWNoZWQgPSB0aGlzLnByZXBhcmVkUGF5bG9hZHMuZ2V0KGNhY2hlS2V5KTtcbiAgICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuXG4gICAgY29uc3QgcHJlcGFyYXRpb24gPSB0aGlzLnJ1blByZXBhcmF0aW9uKHZhbHVlKTtcbiAgICB0aGlzLnByZXBhcmVkUGF5bG9hZHMuc2V0KGNhY2hlS2V5LCBwcmVwYXJhdGlvbik7XG4gICAgcmV0dXJuIHByZXBhcmF0aW9uO1xuICB9XG5cbiAgLyoqIE5vcm1hbGl6ZSBzeW5jaHJvbm91cyBhbmQgYXN5bmNocm9ub3VzIHByZXBhcmVycyB0byBvbmUgcHJvbWlzZSBjb250cmFjdC4gKi9cbiAgcHJpdmF0ZSBhc3luYyBydW5QcmVwYXJhdGlvbih2YWx1ZTogdW5rbm93bik6IFByb21pc2U8UHJlcGFyZWRSZXBsYXlQYXlsb2FkPiB7XG4gICAgcmV0dXJuIHRoaXMucHJlcGFyZXIodmFsdWUsIGF3YWl0IHRoaXMuZW5jcnlwdGlvbktleSk7XG4gIH1cblxuICAvKiogU3RhcnQgb25lIGV2ZW50J3MgYmluYXJ5IHBheWxvYWQgdW5sZXNzIGFub3RoZXIgcGF0aCBhbHJlYWR5IGRpZC4gKi9cbiAgcHJpdmF0ZSBwcmVwYXJlRXZlbnRJZk1pc3NpbmcoXG4gICAgZXZlbnQ6IEV2ZW50XG4gICk6IFByb21pc2U8UHJlcGFyZWRSZXBsYXlQYXlsb2FkPiB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGZpZWxkOiBSZXBsYXlQYXlsb2FkRmllbGQ7XG4gICAgbGV0IHZhbHVlOiB1bmtub3duO1xuICAgIHN3aXRjaCAoZXZlbnQuZXZlbnRUeXBlKSB7XG4gICAgICBjYXNlICdydW5fY3JlYXRlZCc6XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXJ0UHJlcGFyYXRpb24oXG4gICAgICAgICAgdGhpcy53b3JrZmxvd0lucHV0S2V5KGV2ZW50LnJ1bklkKSxcbiAgICAgICAgICBldmVudC5ldmVudERhdGEuaW5wdXRcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgJ3J1bl9zdGFydGVkJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnRQcmVwYXJhdGlvbihcbiAgICAgICAgICB0aGlzLndvcmtmbG93SW5wdXRLZXkoZXZlbnQucnVuSWQpLFxuICAgICAgICAgIGV2ZW50LmV2ZW50RGF0YT8uaW5wdXRcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgJ3N0ZXBfY29tcGxldGVkJzpcbiAgICAgICAgZmllbGQgPSAncmVzdWx0JztcbiAgICAgICAgdmFsdWUgPSBldmVudC5ldmVudERhdGE/LnJlc3VsdDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzdGVwX2ZhaWxlZCc6XG4gICAgICAgIGZpZWxkID0gJ2Vycm9yJztcbiAgICAgICAgdmFsdWUgPSBldmVudC5ldmVudERhdGE/LmVycm9yO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2hvb2tfcmVjZWl2ZWQnOlxuICAgICAgICBmaWVsZCA9ICdwYXlsb2FkJztcbiAgICAgICAgdmFsdWUgPSBldmVudC5ldmVudERhdGE/LnBheWxvYWQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3RhcnRQcmVwYXJhdGlvbihcbiAgICAgIHRoaXMuZXZlbnRQYXlsb2FkS2V5KGV2ZW50LmV2ZW50SWQsIGZpZWxkKSxcbiAgICAgIHZhbHVlXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhcnRQcmVwYXJhdGlvbihcbiAgICBjYWNoZUtleTogc3RyaW5nLFxuICAgIHZhbHVlOiB1bmtub3duXG4gICk6IFByb21pc2U8UHJlcGFyZWRSZXBsYXlQYXlsb2FkPiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB8fCB0aGlzLnByZXBhcmVkUGF5bG9hZHMuaGFzKGNhY2hlS2V5KSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZW5zdXJlUHJlcGFyYXRpb24oY2FjaGVLZXksIHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgd29ya2Zsb3dJbnB1dEtleShydW5JZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHJ1bjoke3J1bklkfTppbnB1dGA7XG4gIH1cblxuICBwcml2YXRlIGV2ZW50UGF5bG9hZEtleShldmVudElkOiBzdHJpbmcsIGZpZWxkOiBSZXBsYXlQYXlsb2FkRmllbGQpOiBzdHJpbmcge1xuICAgIHJldHVybiBgZXZlbnQ6JHtldmVudElkfToke2ZpZWxkfWA7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Identifier for the compute instance (microVM) this module was loaded into.
|
|
3
|
+
*
|
|
4
|
+
* Vercel exposes no native per-instance ID under Fluid compute (`AWS_LAMBDA_*`
|
|
5
|
+
* is blocked), so we synthesize one at module load: a prefixed ULID
|
|
6
|
+
* (`cinst_<ulid>`, per the `wrun_`/`step_` convention) whose timestamp is the
|
|
7
|
+
* instance's birth time. Stable for the instance's life and shared by every
|
|
8
|
+
* invocation it handles, including the concurrent ones Fluid packs onto it;
|
|
9
|
+
* cold starts mint fresh IDs. Emitted as the OpenTelemetry `faas.instance`
|
|
10
|
+
* attribute.
|
|
11
|
+
*/
|
|
12
|
+
export declare const COMPUTE_INSTANCE_ID: string;
|
|
13
|
+
//# sourceMappingURL=compute-instance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compute-instance.d.ts","sourceRoot":"","sources":["../../src/runtime/compute-instance.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AACH,eAAO,MAAM,mBAAmB,QAAoB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ulid } from 'ulid';
|
|
2
|
+
/**
|
|
3
|
+
* Identifier for the compute instance (microVM) this module was loaded into.
|
|
4
|
+
*
|
|
5
|
+
* Vercel exposes no native per-instance ID under Fluid compute (`AWS_LAMBDA_*`
|
|
6
|
+
* is blocked), so we synthesize one at module load: a prefixed ULID
|
|
7
|
+
* (`cinst_<ulid>`, per the `wrun_`/`step_` convention) whose timestamp is the
|
|
8
|
+
* instance's birth time. Stable for the instance's life and shared by every
|
|
9
|
+
* invocation it handles, including the concurrent ones Fluid packs onto it;
|
|
10
|
+
* cold starts mint fresh IDs. Emitted as the OpenTelemetry `faas.instance`
|
|
11
|
+
* attribute.
|
|
12
|
+
*/
|
|
13
|
+
export const COMPUTE_INSTANCE_ID = `cinst_${ulid()}`;
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcHV0ZS1pbnN0YW5jZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL2NvbXB1dGUtaW5zdGFuY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUU1Qjs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsU0FBUyxJQUFJLEVBQUUsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdWxpZCB9IGZyb20gJ3VsaWQnO1xuXG4vKipcbiAqIElkZW50aWZpZXIgZm9yIHRoZSBjb21wdXRlIGluc3RhbmNlIChtaWNyb1ZNKSB0aGlzIG1vZHVsZSB3YXMgbG9hZGVkIGludG8uXG4gKlxuICogVmVyY2VsIGV4cG9zZXMgbm8gbmF0aXZlIHBlci1pbnN0YW5jZSBJRCB1bmRlciBGbHVpZCBjb21wdXRlIChgQVdTX0xBTUJEQV8qYFxuICogaXMgYmxvY2tlZCksIHNvIHdlIHN5bnRoZXNpemUgb25lIGF0IG1vZHVsZSBsb2FkOiBhIHByZWZpeGVkIFVMSURcbiAqIChgY2luc3RfPHVsaWQ+YCwgcGVyIHRoZSBgd3J1bl9gL2BzdGVwX2AgY29udmVudGlvbikgd2hvc2UgdGltZXN0YW1wIGlzIHRoZVxuICogaW5zdGFuY2UncyBiaXJ0aCB0aW1lLiBTdGFibGUgZm9yIHRoZSBpbnN0YW5jZSdzIGxpZmUgYW5kIHNoYXJlZCBieSBldmVyeVxuICogaW52b2NhdGlvbiBpdCBoYW5kbGVzLCBpbmNsdWRpbmcgdGhlIGNvbmN1cnJlbnQgb25lcyBGbHVpZCBwYWNrcyBvbnRvIGl0O1xuICogY29sZCBzdGFydHMgbWludCBmcmVzaCBJRHMuIEVtaXR0ZWQgYXMgdGhlIE9wZW5UZWxlbWV0cnkgYGZhYXMuaW5zdGFuY2VgXG4gKiBhdHRyaWJ1dGUuXG4gKi9cbmV4cG9ydCBjb25zdCBDT01QVVRFX0lOU1RBTkNFX0lEID0gYGNpbnN0XyR7dWxpZCgpfWA7XG4iXX0=
|