@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,150 @@
|
|
|
1
|
+
import type { HookResumeTiming } from '@workflow/world';
|
|
2
|
+
/**
|
|
3
|
+
* Hook-triggered time-to-resume (TTR): wall-clock from entry into
|
|
4
|
+
* `resumeHook()` (T0) to the first line of the next durable step (T7), plus a
|
|
5
|
+
* decomposition into non-overlapping phases that sum exactly to it.
|
|
6
|
+
*
|
|
7
|
+
* ```text
|
|
8
|
+
* T0 resumeHook() entered
|
|
9
|
+
* producer_prep : hook lookup, serialization, encryption
|
|
10
|
+
* T1 queue publish requested
|
|
11
|
+
* queue_delivery : network + VQS delivery (incl. any affinity re-route)
|
|
12
|
+
* T2 final consumer's queue handler entered
|
|
13
|
+
* resume_setup : affinity check, hook_received re-ensure, replay preload
|
|
14
|
+
* T3 replay begins
|
|
15
|
+
* replay : VM/session creation and workflow replay
|
|
16
|
+
* T4 next durable step encountered
|
|
17
|
+
* step_dispatch : suspension handling, inline batch or queue dispatch
|
|
18
|
+
* T5 step_started request begins
|
|
19
|
+
* step_claim : the claim round trip
|
|
20
|
+
* T6 step_started response returned
|
|
21
|
+
* step_prepare : key resolution, argument hydration, context setup
|
|
22
|
+
* T7 immediately before stepFn.apply()
|
|
23
|
+
* ```
|
|
24
|
+
*
|
|
25
|
+
* The producer's `hook_received` write is awaited inside `producer_prep`
|
|
26
|
+
* (the wake is only published after it commits). Older producers may report
|
|
27
|
+
* `lazy`, where the consumer materializes the event from `hookInput`, or
|
|
28
|
+
* `parallel`, where the write raced the publish. The write has no phase of
|
|
29
|
+
* its own; it remains visible as a contextual span (`hook.resume`).
|
|
30
|
+
*
|
|
31
|
+
* T0/T1 are stamped on the producer's machine and T2..T7 on the consumer's, so
|
|
32
|
+
* the measurement is subject to cross-machine clock skew. Rather than clamp
|
|
33
|
+
* (which would break the sum-equals-total property this decomposition exists
|
|
34
|
+
* for), a non-monotonic boundary set drops the whole sample; see
|
|
35
|
+
* {@link computeResumeTtrAttributes}.
|
|
36
|
+
*/
|
|
37
|
+
/** What caused the resumption being measured. Only hooks are measured today. */
|
|
38
|
+
export type ResumeTrigger = 'hook';
|
|
39
|
+
/**
|
|
40
|
+
* Which `resumeHook()` dispatch path produced this resume.
|
|
41
|
+
*
|
|
42
|
+
* Current producers always send `sequential` (durable write, then wake).
|
|
43
|
+
* Older producers may send `lazy` (the consumer materializes the event from
|
|
44
|
+
* `hookInput`) or `parallel` (the write raced the publish).
|
|
45
|
+
*/
|
|
46
|
+
export type ResumeStrategy = 'lazy' | 'parallel' | 'sequential';
|
|
47
|
+
/**
|
|
48
|
+
* How the consuming invocation initialized its replay state:
|
|
49
|
+
*
|
|
50
|
+
* - `hook_preload`: the hoisted `hook_received` write returned a usable
|
|
51
|
+
* replay preload, so neither `run_started` nor the initial `events.list` ran.
|
|
52
|
+
* - `run_started`: the generic `run_started` setup ran (including the fast
|
|
53
|
+
* path's fallback, where the hoisted write succeeded but returned no usable
|
|
54
|
+
* preload).
|
|
55
|
+
* - `event_load`: neither setup ran because the run arrived already loaded,
|
|
56
|
+
* so setup was a plain event load. No current path produces it (the one
|
|
57
|
+
* preloaded-run path, the background-step fall-through, consumes the
|
|
58
|
+
* tracking on its own step first); it is the honest default rather than a
|
|
59
|
+
* live value, and keeps the dimension total if such a path is added.
|
|
60
|
+
*/
|
|
61
|
+
export type ResumeSetupSource = 'hook_preload' | 'run_started' | 'event_load';
|
|
62
|
+
/** Whether the measured step ran in the resuming invocation or a queued one. */
|
|
63
|
+
export type ResumeStepExecution = 'inline' | 'dispatched';
|
|
64
|
+
/**
|
|
65
|
+
* The resume boundaries observed so far, threaded from the queue handler into
|
|
66
|
+
* `executeStep`. Producer fields arrive on the queue message
|
|
67
|
+
* ({@link HookResumeTiming}); consumer fields are stamped by the invocation
|
|
68
|
+
* that replays the resume.
|
|
69
|
+
*
|
|
70
|
+
* The runtime holds at most one of these per invocation and CONSUMES it when
|
|
71
|
+
* it hands it to the execution that will attempt the next durable step, so a
|
|
72
|
+
* later step in the same invocation (or a retry of the same step) never
|
|
73
|
+
* re-reports the same resumption. Within one inline batch the object is
|
|
74
|
+
* shared by every step and the {@link ResumeTtrTracking.reported} latch picks
|
|
75
|
+
* the single reporter.
|
|
76
|
+
*/
|
|
77
|
+
export interface ResumeTtrTracking {
|
|
78
|
+
trigger: ResumeTrigger;
|
|
79
|
+
/** Absent only if an older producer omitted it from the queue message. */
|
|
80
|
+
strategy?: ResumeStrategy;
|
|
81
|
+
/** T0: entry into `resumeHook()`. */
|
|
82
|
+
resumeRequestedAtMs: number;
|
|
83
|
+
/** T1: immediately before the queue publish was requested. */
|
|
84
|
+
queuePublishRequestedAtMs: number;
|
|
85
|
+
/**
|
|
86
|
+
* T2: entry into the FINAL consumer's queue handler. A delivery that
|
|
87
|
+
* re-routes for deployment affinity never stamps this, so the re-routed hop
|
|
88
|
+
* stays inside `queue_delivery` where it belongs.
|
|
89
|
+
*/
|
|
90
|
+
consumerStartedAtMs: number;
|
|
91
|
+
/** T3: this invocation's first replay pass. */
|
|
92
|
+
replayStartedAtMs?: number;
|
|
93
|
+
/** T4: replay first encountered a durable step after the resume. */
|
|
94
|
+
nextStepEncounteredAtMs?: number;
|
|
95
|
+
setupSource?: ResumeSetupSource;
|
|
96
|
+
stepExecution: ResumeStepExecution;
|
|
97
|
+
/**
|
|
98
|
+
* One-shot latch, set by the step executor once this resumption has been
|
|
99
|
+
* reported. Every step of an inline batch is handed the SAME tracking
|
|
100
|
+
* object, so the first one to reach user code takes the measurement and the
|
|
101
|
+
* rest see this and skip: one resumption, one sample, without pinning the
|
|
102
|
+
* sample to a step that may lose its create-claim and never run.
|
|
103
|
+
*
|
|
104
|
+
* Deliberately not part of {@link HookResumeTiming}: it is invocation-local
|
|
105
|
+
* state, and a queue message carries the boundaries, not the claim.
|
|
106
|
+
*/
|
|
107
|
+
reported?: boolean;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Rebuild tracking from a queue message's timing object. Returns undefined for
|
|
111
|
+
* a message that carries none (an older producer, or any non-hook delivery);
|
|
112
|
+
* the caller then reports no TTR.
|
|
113
|
+
*/
|
|
114
|
+
export declare function resumeTrackingFromMessage(timing: HookResumeTiming | undefined, stepExecution: ResumeStepExecution): ResumeTtrTracking | undefined;
|
|
115
|
+
/**
|
|
116
|
+
* Serialize tracking back onto a queue message, for the case where the
|
|
117
|
+
* resuming invocation dispatches the next durable step to another invocation
|
|
118
|
+
* instead of running it inline. Returns undefined when the tracking is not
|
|
119
|
+
* complete enough to be worth forwarding.
|
|
120
|
+
*/
|
|
121
|
+
export declare function resumeTimingForMessage(tracking: ResumeTtrTracking | undefined): HookResumeTiming | undefined;
|
|
122
|
+
/**
|
|
123
|
+
* Compute the TTR span attributes for a step that is the first durable step
|
|
124
|
+
* following a hook resume. Returns undefined (emitting nothing at all) when
|
|
125
|
+
* any of these hold:
|
|
126
|
+
*
|
|
127
|
+
* - the invocation carries no resume tracking (not a hook resume, or an older
|
|
128
|
+
* queue message with no timing);
|
|
129
|
+
* - this is a retry (`attempt !== 1`), which measures a re-execution rather
|
|
130
|
+
* than the resumption;
|
|
131
|
+
* - a required boundary is missing, non-finite, or out of order.
|
|
132
|
+
*
|
|
133
|
+
* `step_claim_ms` is the one phase that may be individually omitted. Under
|
|
134
|
+
* optimistic inline start the `step_started` claim is deliberately NOT awaited
|
|
135
|
+
* before the body runs, so its completion instant does not exist yet at T7;
|
|
136
|
+
* rather than invent one, the claim phase is dropped and `step_prepare_ms`
|
|
137
|
+
* spans T5→T7. The sum-equals-total property holds either way.
|
|
138
|
+
*/
|
|
139
|
+
export declare function computeResumeTtrAttributes(params: {
|
|
140
|
+
tracking: ResumeTtrTracking | undefined;
|
|
141
|
+
/** The attempt number of the execution about to run. */
|
|
142
|
+
attempt: number;
|
|
143
|
+
/** T5: `Date.now()` immediately before the `step_started` request. */
|
|
144
|
+
stepClaimStartedAtMs: number | undefined;
|
|
145
|
+
/** T6: `Date.now()` once the `step_started` response returned. */
|
|
146
|
+
stepClaimCompletedAtMs: number | undefined;
|
|
147
|
+
/** T7: `Date.now()` immediately before `stepFn.apply()`. */
|
|
148
|
+
stepCodeStartedAtMs: number;
|
|
149
|
+
}): Record<string, string | number> | undefined;
|
|
150
|
+
//# sourceMappingURL=resume-latency.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resume-latency.d.ts","sourceRoot":"","sources":["../../src/runtime/resume-latency.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAGxD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,gFAAgF;AAChF,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC;AAEnC;;;;;;GAMG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,UAAU,GAAG,YAAY,CAAC;AAEhE;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,iBAAiB,GAAG,cAAc,GAAG,aAAa,GAAG,YAAY,CAAC;AAE9E,gFAAgF;AAChF,MAAM,MAAM,mBAAmB,GAAG,QAAQ,GAAG,YAAY,CAAC;AAE1D;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,aAAa,CAAC;IACvB,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,qCAAqC;IACrC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,8DAA8D;IAC9D,yBAAyB,EAAE,MAAM,CAAC;IAClC;;;;OAIG;IACH,mBAAmB,EAAE,MAAM,CAAC;IAC5B,+CAA+C;IAC/C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,oEAAoE;IACpE,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC,aAAa,EAAE,mBAAmB,CAAC;IACnC;;;;;;;;;OASG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,gBAAgB,GAAG,SAAS,EACpC,aAAa,EAAE,mBAAmB,GACjC,iBAAiB,GAAG,SAAS,CAkC/B;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,iBAAiB,GAAG,SAAS,GACtC,gBAAgB,GAAG,SAAS,CAkB9B;AA6CD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE;IACjD,QAAQ,EAAE,iBAAiB,GAAG,SAAS,CAAC;IACxC,wDAAwD;IACxD,OAAO,EAAE,MAAM,CAAC;IAChB,sEAAsE;IACtE,oBAAoB,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,kEAAkE;IAClE,sBAAsB,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3C,4DAA4D;IAC5D,mBAAmB,EAAE,MAAM,CAAC;CAC7B,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,GAAG,SAAS,CAoD9C"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import * as Attribute from '../telemetry/semantic-conventions.js';
|
|
2
|
+
/**
|
|
3
|
+
* Rebuild tracking from a queue message's timing object. Returns undefined for
|
|
4
|
+
* a message that carries none (an older producer, or any non-hook delivery);
|
|
5
|
+
* the caller then reports no TTR.
|
|
6
|
+
*/
|
|
7
|
+
export function resumeTrackingFromMessage(timing, stepExecution) {
|
|
8
|
+
if (!timing)
|
|
9
|
+
return undefined;
|
|
10
|
+
if (!Number.isFinite(timing.resumeRequestedAtMs) ||
|
|
11
|
+
!Number.isFinite(timing.queuePublishRequestedAtMs)) {
|
|
12
|
+
return undefined;
|
|
13
|
+
}
|
|
14
|
+
return {
|
|
15
|
+
trigger: 'hook',
|
|
16
|
+
...(timing.strategy === 'lazy' ||
|
|
17
|
+
timing.strategy === 'parallel' ||
|
|
18
|
+
timing.strategy === 'sequential'
|
|
19
|
+
? { strategy: timing.strategy }
|
|
20
|
+
: {}),
|
|
21
|
+
resumeRequestedAtMs: timing.resumeRequestedAtMs,
|
|
22
|
+
queuePublishRequestedAtMs: timing.queuePublishRequestedAtMs,
|
|
23
|
+
// A dispatched step reads the resuming invocation's boundaries off the
|
|
24
|
+
// message; an inline one has them stamped locally by the caller, which
|
|
25
|
+
// overwrites this placeholder immediately after construction.
|
|
26
|
+
consumerStartedAtMs: timing.consumerStartedAtMs ?? Number.NaN,
|
|
27
|
+
...(timing.replayStartedAtMs !== undefined
|
|
28
|
+
? { replayStartedAtMs: timing.replayStartedAtMs }
|
|
29
|
+
: {}),
|
|
30
|
+
...(timing.nextStepEncounteredAtMs !== undefined
|
|
31
|
+
? { nextStepEncounteredAtMs: timing.nextStepEncounteredAtMs }
|
|
32
|
+
: {}),
|
|
33
|
+
...(timing.setupSource === 'hook_preload' ||
|
|
34
|
+
timing.setupSource === 'run_started' ||
|
|
35
|
+
timing.setupSource === 'event_load'
|
|
36
|
+
? { setupSource: timing.setupSource }
|
|
37
|
+
: {}),
|
|
38
|
+
stepExecution,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Serialize tracking back onto a queue message, for the case where the
|
|
43
|
+
* resuming invocation dispatches the next durable step to another invocation
|
|
44
|
+
* instead of running it inline. Returns undefined when the tracking is not
|
|
45
|
+
* complete enough to be worth forwarding.
|
|
46
|
+
*/
|
|
47
|
+
export function resumeTimingForMessage(tracking) {
|
|
48
|
+
if (!tracking)
|
|
49
|
+
return undefined;
|
|
50
|
+
if (!Number.isFinite(tracking.consumerStartedAtMs))
|
|
51
|
+
return undefined;
|
|
52
|
+
return {
|
|
53
|
+
resumeRequestedAtMs: tracking.resumeRequestedAtMs,
|
|
54
|
+
queuePublishRequestedAtMs: tracking.queuePublishRequestedAtMs,
|
|
55
|
+
...(tracking.strategy !== undefined ? { strategy: tracking.strategy } : {}),
|
|
56
|
+
consumerStartedAtMs: tracking.consumerStartedAtMs,
|
|
57
|
+
...(tracking.replayStartedAtMs !== undefined
|
|
58
|
+
? { replayStartedAtMs: tracking.replayStartedAtMs }
|
|
59
|
+
: {}),
|
|
60
|
+
...(tracking.nextStepEncounteredAtMs !== undefined
|
|
61
|
+
? { nextStepEncounteredAtMs: tracking.nextStepEncounteredAtMs }
|
|
62
|
+
: {}),
|
|
63
|
+
...(tracking.setupSource !== undefined
|
|
64
|
+
? { setupSource: tracking.setupSource }
|
|
65
|
+
: {}),
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Validate that every required boundary is a finite epoch-ms value and that
|
|
70
|
+
* the whole sequence is non-decreasing. Returns undefined otherwise, which
|
|
71
|
+
* suppresses the metric entirely rather than reporting a phase that never
|
|
72
|
+
* happened or a negative duration.
|
|
73
|
+
*/
|
|
74
|
+
function validateBoundaries(b) {
|
|
75
|
+
const ordered = [
|
|
76
|
+
b.resumeRequestedAtMs,
|
|
77
|
+
b.queuePublishRequestedAtMs,
|
|
78
|
+
b.consumerStartedAtMs,
|
|
79
|
+
b.replayStartedAtMs,
|
|
80
|
+
b.nextStepEncounteredAtMs,
|
|
81
|
+
b.stepClaimStartedAtMs,
|
|
82
|
+
...(b.stepClaimCompletedAtMs !== undefined
|
|
83
|
+
? [b.stepClaimCompletedAtMs]
|
|
84
|
+
: []),
|
|
85
|
+
b.stepCodeStartedAtMs,
|
|
86
|
+
];
|
|
87
|
+
for (const value of ordered) {
|
|
88
|
+
if (typeof value !== 'number' || !Number.isFinite(value))
|
|
89
|
+
return undefined;
|
|
90
|
+
}
|
|
91
|
+
for (let i = 1; i < ordered.length; i++) {
|
|
92
|
+
if (ordered[i] < ordered[i - 1])
|
|
93
|
+
return undefined;
|
|
94
|
+
}
|
|
95
|
+
return ordered;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Compute the TTR span attributes for a step that is the first durable step
|
|
99
|
+
* following a hook resume. Returns undefined (emitting nothing at all) when
|
|
100
|
+
* any of these hold:
|
|
101
|
+
*
|
|
102
|
+
* - the invocation carries no resume tracking (not a hook resume, or an older
|
|
103
|
+
* queue message with no timing);
|
|
104
|
+
* - this is a retry (`attempt !== 1`), which measures a re-execution rather
|
|
105
|
+
* than the resumption;
|
|
106
|
+
* - a required boundary is missing, non-finite, or out of order.
|
|
107
|
+
*
|
|
108
|
+
* `step_claim_ms` is the one phase that may be individually omitted. Under
|
|
109
|
+
* optimistic inline start the `step_started` claim is deliberately NOT awaited
|
|
110
|
+
* before the body runs, so its completion instant does not exist yet at T7;
|
|
111
|
+
* rather than invent one, the claim phase is dropped and `step_prepare_ms`
|
|
112
|
+
* spans T5→T7. The sum-equals-total property holds either way.
|
|
113
|
+
*/
|
|
114
|
+
export function computeResumeTtrAttributes(params) {
|
|
115
|
+
const { tracking } = params;
|
|
116
|
+
if (!tracking || params.attempt !== 1)
|
|
117
|
+
return undefined;
|
|
118
|
+
if (tracking.replayStartedAtMs === undefined ||
|
|
119
|
+
tracking.nextStepEncounteredAtMs === undefined ||
|
|
120
|
+
params.stepClaimStartedAtMs === undefined) {
|
|
121
|
+
return undefined;
|
|
122
|
+
}
|
|
123
|
+
const boundaries = {
|
|
124
|
+
resumeRequestedAtMs: tracking.resumeRequestedAtMs,
|
|
125
|
+
queuePublishRequestedAtMs: tracking.queuePublishRequestedAtMs,
|
|
126
|
+
consumerStartedAtMs: tracking.consumerStartedAtMs,
|
|
127
|
+
replayStartedAtMs: tracking.replayStartedAtMs,
|
|
128
|
+
nextStepEncounteredAtMs: tracking.nextStepEncounteredAtMs,
|
|
129
|
+
stepClaimStartedAtMs: params.stepClaimStartedAtMs,
|
|
130
|
+
stepClaimCompletedAtMs: params.stepClaimCompletedAtMs,
|
|
131
|
+
stepCodeStartedAtMs: params.stepCodeStartedAtMs,
|
|
132
|
+
};
|
|
133
|
+
if (!validateBoundaries(boundaries))
|
|
134
|
+
return undefined;
|
|
135
|
+
const { resumeRequestedAtMs: t0, queuePublishRequestedAtMs: t1, consumerStartedAtMs: t2, replayStartedAtMs: t3, nextStepEncounteredAtMs: t4, stepClaimStartedAtMs: t5, stepClaimCompletedAtMs: t6, stepCodeStartedAtMs: t7, } = boundaries;
|
|
136
|
+
return {
|
|
137
|
+
...Attribute.ResumeTotalMs(t7 - t0),
|
|
138
|
+
...Attribute.ResumeProducerPrepMs(t1 - t0),
|
|
139
|
+
...Attribute.ResumeQueueDeliveryMs(t2 - t1),
|
|
140
|
+
...Attribute.ResumeSetupMs(t3 - t2),
|
|
141
|
+
...Attribute.ResumeReplayMs(t4 - t3),
|
|
142
|
+
...Attribute.ResumeStepDispatchMs(t5 - t4),
|
|
143
|
+
...(t6 !== undefined ? Attribute.ResumeStepClaimMs(t6 - t5) : {}),
|
|
144
|
+
...Attribute.ResumeStepPrepareMs(t7 - (t6 ?? t5)),
|
|
145
|
+
...Attribute.ResumeTrigger(tracking.trigger),
|
|
146
|
+
...(tracking.strategy !== undefined
|
|
147
|
+
? Attribute.ResumeStrategy(tracking.strategy)
|
|
148
|
+
: {}),
|
|
149
|
+
...(tracking.setupSource !== undefined
|
|
150
|
+
? Attribute.ResumeSetupSource(tracking.setupSource)
|
|
151
|
+
: {}),
|
|
152
|
+
...Attribute.ResumeStepExecution(tracking.stepExecution),
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdW1lLWxhdGVuY3kuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9yZXN1bWUtbGF0ZW5jeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEtBQUssU0FBUyxNQUFNLHNDQUFzQyxDQUFDO0FBbUhsRTs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLHlCQUF5QixDQUN2QyxNQUFvQyxFQUNwQyxhQUFrQztJQUVsQyxJQUFJLENBQUMsTUFBTTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQzlCLElBQ0UsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQztRQUM1QyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLHlCQUF5QixDQUFDLEVBQ2xELENBQUM7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsT0FBTztRQUNMLE9BQU8sRUFBRSxNQUFNO1FBQ2YsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEtBQUssTUFBTTtZQUM5QixNQUFNLENBQUMsUUFBUSxLQUFLLFVBQVU7WUFDOUIsTUFBTSxDQUFDLFFBQVEsS0FBSyxZQUFZO1lBQzlCLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFO1lBQy9CLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDUCxtQkFBbUIsRUFBRSxNQUFNLENBQUMsbUJBQW1CO1FBQy9DLHlCQUF5QixFQUFFLE1BQU0sQ0FBQyx5QkFBeUI7UUFDM0QsdUVBQXVFO1FBQ3ZFLHVFQUF1RTtRQUN2RSw4REFBOEQ7UUFDOUQsbUJBQW1CLEVBQUUsTUFBTSxDQUFDLG1CQUFtQixJQUFJLE1BQU0sQ0FBQyxHQUFHO1FBQzdELEdBQUcsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLEtBQUssU0FBUztZQUN4QyxDQUFDLENBQUMsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLENBQUMsaUJBQWlCLEVBQUU7WUFDakQsQ0FB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QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBIb29rUmVzdW1lVGltaW5nIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCAqIGFzIEF0dHJpYnV0ZSBmcm9tICcuLi90ZWxlbWV0cnkvc2VtYW50aWMtY29udmVudGlvbnMuanMnO1xuXG4vKipcbiAqIEhvb2stdHJpZ2dlcmVkIHRpbWUtdG8tcmVzdW1lIChUVFIpOiB3YWxsLWNsb2NrIGZyb20gZW50cnkgaW50b1xuICogYHJlc3VtZUhvb2soKWAgKFQwKSB0byB0aGUgZmlyc3QgbGluZSBvZiB0aGUgbmV4dCBkdXJhYmxlIHN0ZXAgKFQ3KSwgcGx1cyBhXG4gKiBkZWNvbXBvc2l0aW9uIGludG8gbm9uLW92ZXJsYXBwaW5nIHBoYXNlcyB0aGF0IHN1bSBleGFjdGx5IHRvIGl0LlxuICpcbiAqIGBgYHRleHRcbiAqIFQwIHJlc3VtZUhvb2soKSBlbnRlcmVkXG4gKiAgICAgIHByb2R1Y2VyX3ByZXAgICA6IGhvb2sgbG9va3VwLCBzZXJpYWxpemF0aW9uLCBlbmNyeXB0aW9uXG4gKiBUMSBxdWV1ZSBwdWJsaXNoIHJlcXVlc3RlZFxuICogICAgICBxdWV1ZV9kZWxpdmVyeSAgOiBuZXR3b3JrICsgVlFTIGRlbGl2ZXJ5IChpbmNsLiBhbnkgYWZmaW5pdHkgcmUtcm91dGUpXG4gKiBUMiBmaW5hbCBjb25zdW1lcidzIHF1ZXVlIGhhbmRsZXIgZW50ZXJlZFxuICogICAgICByZXN1bWVfc2V0dXAgICAgOiBhZmZpbml0eSBjaGVjaywgaG9va19yZWNlaXZlZCByZS1lbnN1cmUsIHJlcGxheSBwcmVsb2FkXG4gKiBUMyByZXBsYXkgYmVnaW5zXG4gKiAgICAgIHJlcGxheSAgICAgICAgICA6IFZNL3Nlc3Npb24gY3JlYXRpb24gYW5kIHdvcmtmbG93IHJlcGxheVxuICogVDQgbmV4dCBkdXJhYmxlIHN0ZXAgZW5jb3VudGVyZWRcbiAqICAgICAgc3RlcF9kaXNwYXRjaCAgIDogc3VzcGVuc2lvbiBoYW5kbGluZywgaW5saW5lIGJhdGNoIG9yIHF1ZXVlIGRpc3BhdGNoXG4gKiBUNSBzdGVwX3N0YXJ0ZWQgcmVxdWVzdCBiZWdpbnNcbiAqICAgICAgc3RlcF9jbGFpbSAgICAgIDogdGhlIGNsYWltIHJvdW5kIHRyaXBcbiAqIFQ2IHN0ZXBfc3RhcnRlZCByZXNwb25zZSByZXR1cm5lZFxuICogICAgICBzdGVwX3ByZXBhcmUgICAgOiBrZXkgcmVzb2x1dGlvbiwgYXJndW1lbnQgaHlkcmF0aW9uLCBjb250ZXh0IHNldHVwXG4gKiBUNyBpbW1lZGlhdGVseSBiZWZvcmUgc3RlcEZuLmFwcGx5KClcbiAqIGBgYFxuICpcbiAqIFRoZSBwcm9kdWNlcidzIGBob29rX3JlY2VpdmVkYCB3cml0ZSBpcyBhd2FpdGVkIGluc2lkZSBgcHJvZHVjZXJfcHJlcGBcbiAqICh0aGUgd2FrZSBpcyBvbmx5IHB1Ymxpc2hlZCBhZnRlciBpdCBjb21taXRzKS4gT2xkZXIgcHJvZHVjZXJzIG1heSByZXBvcnRcbiAqIGBsYXp5YCwgd2hlcmUgdGhlIGNvbnN1bWVyIG1hdGVyaWFsaXplcyB0aGUgZXZlbnQgZnJvbSBgaG9va0lucHV0YCwgb3JcbiAqIGBwYXJhbGxlbGAsIHdoZXJlIHRoZSB3cml0ZSByYWNlZCB0aGUgcHVibGlzaC4gVGhlIHdyaXRlIGhhcyBubyBwaGFzZSBvZlxuICogaXRzIG93bjsgaXQgcmVtYWlucyB2aXNpYmxlIGFzIGEgY29udGV4dHVhbCBzcGFuIChgaG9vay5yZXN1bWVgKS5cbiAqXG4gKiBUMC9UMSBhcmUgc3RhbXBlZCBvbiB0aGUgcHJvZHVjZXIncyBtYWNoaW5lIGFuZCBUMi4uVDcgb24gdGhlIGNvbnN1bWVyJ3MsIHNvXG4gKiB0aGUgbWVhc3VyZW1lbnQgaXMgc3ViamVjdCB0byBjcm9zcy1tYWNoaW5lIGNsb2NrIHNrZXcuIFJhdGhlciB0aGFuIGNsYW1wXG4gKiAod2hpY2ggd291bGQgYnJlYWsgdGhlIHN1bS1lcXVhbHMtdG90YWwgcHJvcGVydHkgdGhpcyBkZWNvbXBvc2l0aW9uIGV4aXN0c1xuICogZm9yKSwgYSBub24tbW9ub3RvbmljIGJvdW5kYXJ5IHNldCBkcm9wcyB0aGUgd2hvbGUgc2FtcGxlOyBzZWVcbiAqIHtAbGluayBjb21wdXRlUmVzdW1lVHRyQXR0cmlidXRlc30uXG4gKi9cblxuLyoqIFdoYXQgY2F1c2VkIHRoZSByZXN1bXB0aW9uIGJlaW5nIG1lYXN1cmVkLiBPbmx5IGhvb2tzIGFyZSBtZWFzdXJlZCB0b2RheS4gKi9cbmV4cG9ydCB0eXBlIFJlc3VtZVRyaWdnZXIgPSAnaG9vayc7XG5cbi8qKlxuICogV2hpY2ggYHJlc3VtZUhvb2soKWAgZGlzcGF0Y2ggcGF0aCBwcm9kdWNlZCB0aGlzIHJlc3VtZS5cbiAqXG4gKiBDdXJyZW50IHByb2R1Y2VycyBhbHdheXMgc2VuZCBgc2VxdWVudGlhbGAgKGR1cmFibGUgd3JpdGUsIHRoZW4gd2FrZSkuXG4gKiBPbGRlciBwcm9kdWNlcnMgbWF5IHNlbmQgYGxhenlgICh0aGUgY29uc3VtZXIgbWF0ZXJpYWxpemVzIHRoZSBldmVudCBmcm9tXG4gKiBgaG9va0lucHV0YCkgb3IgYHBhcmFsbGVsYCAodGhlIHdyaXRlIHJhY2VkIHRoZSBwdWJsaXNoKS5cbiAqL1xuZXhwb3J0IHR5cGUgUmVzdW1lU3RyYXRlZ3kgPSAnbGF6eScgfCAncGFyYWxsZWwnIHwgJ3NlcXVlbnRpYWwnO1xuXG4vKipcbiAqIEhvdyB0aGUgY29uc3VtaW5nIGludm9jYXRpb24gaW5pdGlhbGl6ZWQgaXRzIHJlcGxheSBzdGF0ZTpcbiAqXG4gKiAtIGBob29rX3ByZWxvYWRgOiB0aGUgaG9pc3RlZCBgaG9va19yZWNlaXZlZGAgd3JpdGUgcmV0dXJuZWQgYSB1c2FibGVcbiAqICAgcmVwbGF5IHByZWxvYWQsIHNvIG5laXRoZXIgYHJ1bl9zdGFydGVkYCBub3IgdGhlIGluaXRpYWwgYGV2ZW50cy5saXN0YCByYW4uXG4gKiAtIGBydW5fc3RhcnRlZGA6IHRoZSBnZW5lcmljIGBydW5fc3RhcnRlZGAgc2V0dXAgcmFuIChpbmNsdWRpbmcgdGhlIGZhc3RcbiAqICAgcGF0aCdzIGZhbGxiYWNrLCB3aGVyZSB0aGUgaG9pc3RlZCB3cml0ZSBzdWNjZWVkZWQgYnV0IHJldHVybmVkIG5vIHVzYWJsZVxuICogICBwcmVsb2FkKS5cbiAqIC0gYGV2ZW50X2xvYWRgOiBuZWl0aGVyIHNldHVwIHJhbiBiZWNhdXNlIHRoZSBydW4gYXJyaXZlZCBhbHJlYWR5IGxvYWRlZCxcbiAqICAgc28gc2V0dXAgd2FzIGEgcGxhaW4gZXZlbnQgbG9hZC4gTm8gY3VycmVudCBwYXRoIHByb2R1Y2VzIGl0ICh0aGUgb25lXG4gKiAgIHByZWxvYWRlZC1ydW4gcGF0aCwgdGhlIGJhY2tncm91bmQtc3RlcCBmYWxsLXRocm91Z2gsIGNvbnN1bWVzIHRoZVxuICogICB0cmFja2luZyBvbiBpdHMgb3duIHN0ZXAgZmlyc3QpOyBpdCBpcyB0aGUgaG9uZXN0IGRlZmF1bHQgcmF0aGVyIHRoYW4gYVxuICogICBsaXZlIHZhbHVlLCBhbmQga2VlcHMgdGhlIGRpbWVuc2lvbiB0b3RhbCBpZiBzdWNoIGEgcGF0aCBpcyBhZGRlZC5cbiAqL1xuZXhwb3J0IHR5cGUgUmVzdW1lU2V0dXBTb3VyY2UgPSAnaG9va19wcmVsb2FkJyB8ICdydW5fc3RhcnRlZCcgfCAnZXZlbnRfbG9hZCc7XG5cbi8qKiBXaGV0aGVyIHRoZSBtZWFzdXJlZCBzdGVwIHJhbiBpbiB0aGUgcmVzdW1pbmcgaW52b2NhdGlvbiBvciBhIHF1ZXVlZCBvbmUuICovXG5leHBvcnQgdHlwZSBSZXN1bWVTdGVwRXhlY3V0aW9uID0gJ2lubGluZScgfCAnZGlzcGF0Y2hlZCc7XG5cbi8qKlxuICogVGhlIHJlc3VtZSBib3VuZGFyaWVzIG9ic2VydmVkIHNvIGZhciwgdGhyZWFkZWQgZnJvbSB0aGUgcXVldWUgaGFuZGxlciBpbnRvXG4gKiBgZXhlY3V0ZVN0ZXBgLiBQcm9kdWNlciBmaWVsZHMgYXJyaXZlIG9uIHRoZSBxdWV1ZSBtZXNzYWdlXG4gKiAoe0BsaW5rIEhvb2tSZXN1bWVUaW1pbmd9KTsgY29uc3VtZXIgZmllbGRzIGFyZSBzdGFtcGVkIGJ5IHRoZSBpbnZvY2F0aW9uXG4gKiB0aGF0IHJlcGxheXMgdGhlIHJlc3VtZS5cbiAqXG4gKiBUaGUgcnVudGltZSBob2xkcyBhdCBtb3N0IG9uZSBvZiB0aGVzZSBwZXIgaW52b2NhdGlvbiBhbmQgQ09OU1VNRVMgaXQgd2hlblxuICogaXQgaGFuZHMgaXQgdG8gdGhlIGV4ZWN1dGlvbiB0aGF0IHdpbGwgYXR0ZW1wdCB0aGUgbmV4dCBkdXJhYmxlIHN0ZXAsIHNvIGFcbiAqIGxhdGVyIHN0ZXAgaW4gdGhlIHNhbWUgaW52b2NhdGlvbiAob3IgYSByZXRyeSBvZiB0aGUgc2FtZSBzdGVwKSBuZXZlclxuICogcmUtcmVwb3J0cyB0aGUgc2FtZSByZXN1bXB0aW9uLiBXaXRoaW4gb25lIGlubGluZSBiYXRjaCB0aGUgb2JqZWN0IGlzXG4gKiBzaGFyZWQgYnkgZXZlcnkgc3RlcCBhbmQgdGhlIHtAbGluayBSZXN1bWVUdHJUcmFja2luZy5yZXBvcnRlZH0gbGF0Y2ggcGlja3NcbiAqIHRoZSBzaW5nbGUgcmVwb3J0ZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzdW1lVHRyVHJhY2tpbmcge1xuICB0cmlnZ2VyOiBSZXN1bWVUcmlnZ2VyO1xuICAvKiogQWJzZW50IG9ubHkgaWYgYW4gb2xkZXIgcHJvZHVjZXIgb21pdHRlZCBpdCBmcm9tIHRoZSBxdWV1ZSBtZXNzYWdlLiAqL1xuICBzdHJhdGVneT86IFJlc3VtZVN0cmF0ZWd5O1xuICAvKiogVDA6IGVudHJ5IGludG8gYHJlc3VtZUhvb2soKWAuICovXG4gIHJlc3VtZVJlcXVlc3RlZEF0TXM6IG51bWJlcjtcbiAgLyoqIFQxOiBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIHF1ZXVlIHB1Ymxpc2ggd2FzIHJlcXVlc3RlZC4gKi9cbiAgcXVldWVQdWJsaXNoUmVxdWVzdGVkQXRNczogbnVtYmVyO1xuICAvKipcbiAgICogVDI6IGVudHJ5IGludG8gdGhlIEZJTkFMIGNvbnN1bWVyJ3MgcXVldWUgaGFuZGxlci4gQSBkZWxpdmVyeSB0aGF0XG4gICAqIHJlLXJvdXRlcyBmb3IgZGVwbG95bWVudCBhZmZpbml0eSBuZXZlciBzdGFtcHMgdGhpcywgc28gdGhlIHJlLXJvdXRlZCBob3BcbiAgICogc3RheXMgaW5zaWRlIGBxdWV1ZV9kZWxpdmVyeWAgd2hlcmUgaXQgYmVsb25ncy5cbiAgICovXG4gIGNvbnN1bWVyU3RhcnRlZEF0TXM6IG51bWJlcjtcbiAgLyoqIFQzOiB0aGlzIGludm9jYXRpb24ncyBmaXJzdCByZXBsYXkgcGFzcy4gKi9cbiAgcmVwbGF5U3RhcnRlZEF0TXM/OiBudW1iZXI7XG4gIC8qKiBUNDogcmVwbGF5IGZpcnN0IGVuY291bnRlcmVkIGEgZHVyYWJsZSBzdGVwIGFmdGVyIHRoZSByZXN1bWUuICovXG4gIG5leHRTdGVwRW5jb3VudGVyZWRBdE1zPzogbnVtYmVyO1xuICBzZXR1cFNvdXJjZT86IFJlc3VtZVNldHVwU291cmNlO1xuICBzdGVwRXhlY3V0aW9uOiBSZXN1bWVTdGVwRXhlY3V0aW9uO1xuICAvKipcbiAgICogT25lLXNob3QgbGF0Y2gsIHNldCBieSB0aGUgc3RlcCBleGVjdXRvciBvbmNlIHRoaXMgcmVzdW1wdGlvbiBoYXMgYmVlblxuICAgKiByZXBvcnRlZC4gRXZlcnkgc3RlcCBvZiBhbiBpbmxpbmUgYmF0Y2ggaXMgaGFuZGVkIHRoZSBTQU1FIHRyYWNraW5nXG4gICAqIG9iamVjdCwgc28gdGhlIGZpcnN0IG9uZSB0byByZWFjaCB1c2VyIGNvZGUgdGFrZXMgdGhlIG1lYXN1cmVtZW50IGFuZCB0aGVcbiAgICogcmVzdCBzZWUgdGhpcyBhbmQgc2tpcDogb25lIHJlc3VtcHRpb24sIG9uZSBzYW1wbGUsIHdpdGhvdXQgcGlubmluZyB0aGVcbiAgICogc2FtcGxlIHRvIGEgc3RlcCB0aGF0IG1heSBsb3NlIGl0cyBjcmVhdGUtY2xhaW0gYW5kIG5ldmVyIHJ1bi5cbiAgICpcbiAgICogRGVsaWJlcmF0ZWx5IG5vdCBwYXJ0IG9mIHtAbGluayBIb29rUmVzdW1lVGltaW5nfTogaXQgaXMgaW52b2NhdGlvbi1sb2NhbFxuICAgKiBzdGF0ZSwgYW5kIGEgcXVldWUgbWVzc2FnZSBjYXJyaWVzIHRoZSBib3VuZGFyaWVzLCBub3QgdGhlIGNsYWltLlxuICAgKi9cbiAgcmVwb3J0ZWQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFJlYnVpbGQgdHJhY2tpbmcgZnJvbSBhIHF1ZXVlIG1lc3NhZ2UncyB0aW1pbmcgb2JqZWN0LiBSZXR1cm5zIHVuZGVmaW5lZCBmb3JcbiAqIGEgbWVzc2FnZSB0aGF0IGNhcnJpZXMgbm9uZSAoYW4gb2xkZXIgcHJvZHVjZXIsIG9yIGFueSBub24taG9vayBkZWxpdmVyeSk7XG4gKiB0aGUgY2FsbGVyIHRoZW4gcmVwb3J0cyBubyBUVFIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXN1bWVUcmFja2luZ0Zyb21NZXNzYWdlKFxuICB0aW1pbmc6IEhvb2tSZXN1bWVUaW1pbmcgfCB1bmRlZmluZWQsXG4gIHN0ZXBFeGVjdXRpb246IFJlc3VtZVN0ZXBFeGVjdXRpb25cbik6IFJlc3VtZVR0clRyYWNraW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCF0aW1pbmcpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmIChcbiAgICAhTnVtYmVyLmlzRmluaXRlKHRpbWluZy5yZXN1bWVSZXF1ZXN0ZWRBdE1zKSB8fFxuICAgICFOdW1iZXIuaXNGaW5pdGUodGltaW5nLnF1ZXVlUHVibGlzaFJlcXVlc3RlZEF0TXMpXG4gICkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB0cmlnZ2VyOiAnaG9vaycsXG4gICAgLi4uKHRpbWluZy5zdHJhdGVneSA9PT0gJ2xhenknIHx8XG4gICAgdGltaW5nLnN0cmF0ZWd5ID09PSAncGFyYWxsZWwnIHx8XG4gICAgdGltaW5nLnN0cmF0ZWd5ID09PSAnc2VxdWVudGlhbCdcbiAgICAgID8geyBzdHJhdGVneTogdGltaW5nLnN0cmF0ZWd5IH1cbiAgICAgIDoge30pLFxuICAgIHJlc3VtZVJlcXVlc3RlZEF0TXM6IHRpbWluZy5yZXN1bWVSZXF1ZXN0ZWRBdE1zLFxuICAgIHF1ZXVlUHVibGlzaFJlcXVlc3RlZEF0TXM6IHRpbWluZy5xdWV1ZVB1Ymxpc2hSZXF1ZXN0ZWRBdE1zLFxuICAgIC8vIEEgZGlzcGF0Y2hlZCBzdGVwIHJlYWRzIHRoZSByZXN1bWluZyBpbnZvY2F0aW9uJ3MgYm91bmRhcmllcyBvZmYgdGhlXG4gICAgLy8gbWVzc2FnZTsgYW4gaW5saW5lIG9uZSBoYXMgdGhlbSBzdGFtcGVkIGxvY2FsbHkgYnkgdGhlIGNhbGxlciwgd2hpY2hcbiAgICAvLyBvdmVyd3JpdGVzIHRoaXMgcGxhY2Vob2xkZXIgaW1tZWRpYXRlbHkgYWZ0ZXIgY29uc3RydWN0aW9uLlxuICAgIGNvbnN1bWVyU3RhcnRlZEF0TXM6IHRpbWluZy5jb25zdW1lclN0YXJ0ZWRBdE1zID8/IE51bWJlci5OYU4sXG4gICAgLi4uKHRpbWluZy5yZXBsYXlTdGFydGVkQXRNcyAhPT0gdW5kZWZpbmVkXG4gICAgICA/IHsgcmVwbGF5U3RhcnRlZEF0TXM6IHRpbWluZy5yZXBsYXlTdGFydGVkQXRNcyB9XG4gICAgICA6IHt9KSxcbiAgICAuLi4odGltaW5nLm5leHRTdGVwRW5jb3VudGVyZWRBdE1zICE9PSB1bmRlZmluZWRcbiAgICAgID8geyBuZXh0U3RlcEVuY291bnRlcmVkQXRNczogdGltaW5nLm5leHRTdGVwRW5jb3VudGVyZWRBdE1zIH1cbiAgICAgIDoge30pLFxuICAgIC4uLih0aW1pbmcuc2V0dXBTb3VyY2UgPT09ICdob29rX3ByZWxvYWQnIHx8XG4gICAgdGltaW5nLnNldHVwU291cmNlID09PSAncnVuX3N0YXJ0ZWQnIHx8XG4gICAgdGltaW5nLnNldHVwU291cmNlID09PSAnZXZlbnRfbG9hZCdcbiAgICAgID8geyBzZXR1cFNvdXJjZTogdGltaW5nLnNldHVwU291cmNlIH1cbiAgICAgIDoge30pLFxuICAgIHN0ZXBFeGVjdXRpb24sXG4gIH07XG59XG5cbi8qKlxuICogU2VyaWFsaXplIHRyYWNraW5nIGJhY2sgb250byBhIHF1ZXVlIG1lc3NhZ2UsIGZvciB0aGUgY2FzZSB3aGVyZSB0aGVcbiAqIHJlc3VtaW5nIGludm9jYXRpb24gZGlzcGF0Y2hlcyB0aGUgbmV4dCBkdXJhYmxlIHN0ZXAgdG8gYW5vdGhlciBpbnZvY2F0aW9uXG4gKiBpbnN0ZWFkIG9mIHJ1bm5pbmcgaXQgaW5saW5lLiBSZXR1cm5zIHVuZGVmaW5lZCB3aGVuIHRoZSB0cmFja2luZyBpcyBub3RcbiAqIGNvbXBsZXRlIGVub3VnaCB0byBiZSB3b3J0aCBmb3J3YXJkaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzdW1lVGltaW5nRm9yTWVzc2FnZShcbiAgdHJhY2tpbmc6IFJlc3VtZVR0clRyYWNraW5nIHwgdW5kZWZpbmVkXG4pOiBIb29rUmVzdW1lVGltaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCF0cmFja2luZykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUodHJhY2tpbmcuY29uc3VtZXJTdGFydGVkQXRNcykpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiB7XG4gICAgcmVzdW1lUmVxdWVzdGVkQXRNczogdHJhY2tpbmcucmVzdW1lUmVxdWVzdGVkQXRNcyxcbiAgICBxdWV1ZVB1Ymxpc2hSZXF1ZXN0ZWRBdE1zOiB0cmFja2luZy5xdWV1ZVB1Ymxpc2hSZXF1ZXN0ZWRBdE1zLFxuICAgIC4uLih0cmFja2luZy5zdHJhdGVneSAhPT0gdW5kZWZpbmVkID8geyBzdHJhdGVneTogdHJhY2tpbmcuc3RyYXRlZ3kgfSA6IHt9KSxcbiAgICBjb25zdW1lclN0YXJ0ZWRBdE1zOiB0cmFja2luZy5jb25zdW1lclN0YXJ0ZWRBdE1zLFxuICAgIC4uLih0cmFja2luZy5yZXBsYXlTdGFydGVkQXRNcyAhPT0gdW5kZWZpbmVkXG4gICAgICA/IHsgcmVwbGF5U3RhcnRlZEF0TXM6IHRyYWNraW5nLnJlcGxheVN0YXJ0ZWRBdE1zIH1cbiAgICAgIDoge30pLFxuICAgIC4uLih0cmFja2luZy5uZXh0U3RlcEVuY291bnRlcmVkQXRNcyAhPT0gdW5kZWZpbmVkXG4gICAgICA/IHsgbmV4dFN0ZXBFbmNvdW50ZXJlZEF0TXM6IHRyYWNraW5nLm5leHRTdGVwRW5jb3VudGVyZWRBdE1zIH1cbiAgICAgIDoge30pLFxuICAgIC4uLih0cmFja2luZy5zZXR1cFNvdXJjZSAhPT0gdW5kZWZpbmVkXG4gICAgICA/IHsgc2V0dXBTb3VyY2U6IHRyYWNraW5nLnNldHVwU291cmNlIH1cbiAgICAgIDoge30pLFxuICB9O1xufVxuXG4vKiogRXZlcnkgYm91bmRhcnkgdGhlIGVtaXNzaW9uIGdhdGUgcmVxdWlyZXMsIHBsdXMgdGhlIG9wdGlvbmFsIGNsYWltIGVuZC4gKi9cbmludGVyZmFjZSBSZXN1bWVCb3VuZGFyaWVzIHtcbiAgLyoqIFQwICovIHJlc3VtZVJlcXVlc3RlZEF0TXM6IG51bWJlcjtcbiAgLyoqIFQxICovIHF1ZXVlUHVibGlzaFJlcXVlc3RlZEF0TXM6IG51bWJlcjtcbiAgLyoqIFQyICovIGNvbnN1bWVyU3RhcnRlZEF0TXM6IG51bWJlcjtcbiAgLyoqIFQzICovIHJlcGxheVN0YXJ0ZWRBdE1zOiBudW1iZXI7XG4gIC8qKiBUNCAqLyBuZXh0U3RlcEVuY291bnRlcmVkQXRNczogbnVtYmVyO1xuICAvKiogVDUgKi8gc3RlcENsYWltU3RhcnRlZEF0TXM6IG51bWJlcjtcbiAgLyoqIFQ2OiBhYnNlbnQgb24gdGhlIG9wdGltaXN0aWMtc3RhcnQgcGF0aDsgc2VlIGJlbG93LiAqL1xuICBzdGVwQ2xhaW1Db21wbGV0ZWRBdE1zOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIC8qKiBUNyAqLyBzdGVwQ29kZVN0YXJ0ZWRBdE1zOiBudW1iZXI7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgdGhhdCBldmVyeSByZXF1aXJlZCBib3VuZGFyeSBpcyBhIGZpbml0ZSBlcG9jaC1tcyB2YWx1ZSBhbmQgdGhhdFxuICogdGhlIHdob2xlIHNlcXVlbmNlIGlzIG5vbi1kZWNyZWFzaW5nLiBSZXR1cm5zIHVuZGVmaW5lZCBvdGhlcndpc2UsIHdoaWNoXG4gKiBzdXBwcmVzc2VzIHRoZSBtZXRyaWMgZW50aXJlbHkgcmF0aGVyIHRoYW4gcmVwb3J0aW5nIGEgcGhhc2UgdGhhdCBuZXZlclxuICogaGFwcGVuZWQgb3IgYSBuZWdhdGl2ZSBkdXJhdGlvbi5cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVCb3VuZGFyaWVzKFxuICBiOiBSZXN1bWVCb3VuZGFyaWVzXG4pOiByZWFkb25seSBudW1iZXJbXSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG9yZGVyZWQgPSBbXG4gICAgYi5yZXN1bWVSZXF1ZXN0ZWRBdE1zLFxuICAgIGIucXVldWVQdWJsaXNoUmVxdWVzdGVkQXRNcyxcbiAgICBiLmNvbnN1bWVyU3RhcnRlZEF0TXMsXG4gICAgYi5yZXBsYXlTdGFydGVkQXRNcyxcbiAgICBiLm5leHRTdGVwRW5jb3VudGVyZWRBdE1zLFxuICAgIGIuc3RlcENsYWltU3RhcnRlZEF0TXMsXG4gICAgLi4uKGIuc3RlcENsYWltQ29tcGxldGVkQXRNcyAhPT0gdW5kZWZpbmVkXG4gICAgICA/IFtiLnN0ZXBDbGFpbUNvbXBsZXRlZEF0TXNdXG4gICAgICA6IFtdKSxcbiAgICBiLnN0ZXBDb2RlU3RhcnRlZEF0TXMsXG4gIF07XG4gIGZvciAoY29uc3QgdmFsdWUgb2Ygb3JkZXJlZCkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdudW1iZXInIHx8ICFOdW1iZXIuaXNGaW5pdGUodmFsdWUpKSByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgb3JkZXJlZC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChvcmRlcmVkW2ldIDwgb3JkZXJlZFtpIC0gMV0pIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIG9yZGVyZWQ7XG59XG5cbi8qKlxuICogQ29tcHV0ZSB0aGUgVFRSIHNwYW4gYXR0cmlidXRlcyBmb3IgYSBzdGVwIHRoYXQgaXMgdGhlIGZpcnN0IGR1cmFibGUgc3RlcFxuICogZm9sbG93aW5nIGEgaG9vayByZXN1bWUuIFJldHVybnMgdW5kZWZpbmVkIChlbWl0dGluZyBub3RoaW5nIGF0IGFsbCkgd2hlblxuICogYW55IG9mIHRoZXNlIGhvbGQ6XG4gKlxuICogLSB0aGUgaW52b2NhdGlvbiBjYXJyaWVzIG5vIHJlc3VtZSB0cmFja2luZyAobm90IGEgaG9vayByZXN1bWUsIG9yIGFuIG9sZGVyXG4gKiAgIHF1ZXVlIG1lc3NhZ2Ugd2l0aCBubyB0aW1pbmcpO1xuICogLSB0aGlzIGlzIGEgcmV0cnkgKGBhdHRlbXB0ICE9PSAxYCksIHdoaWNoIG1lYXN1cmVzIGEgcmUtZXhlY3V0aW9uIHJhdGhlclxuICogICB0aGFuIHRoZSByZXN1bXB0aW9uO1xuICogLSBhIHJlcXVpcmVkIGJvdW5kYXJ5IGlzIG1pc3NpbmcsIG5vbi1maW5pdGUsIG9yIG91dCBvZiBvcmRlci5cbiAqXG4gKiBgc3RlcF9jbGFpbV9tc2AgaXMgdGhlIG9uZSBwaGFzZSB0aGF0IG1heSBiZSBpbmRpdmlkdWFsbHkgb21pdHRlZC4gVW5kZXJcbiAqIG9wdGltaXN0aWMgaW5saW5lIHN0YXJ0IHRoZSBgc3RlcF9zdGFydGVkYCBjbGFpbSBpcyBkZWxpYmVyYXRlbHkgTk9UIGF3YWl0ZWRcbiAqIGJlZm9yZSB0aGUgYm9keSBydW5zLCBzbyBpdHMgY29tcGxldGlvbiBpbnN0YW50IGRvZXMgbm90IGV4aXN0IHlldCBhdCBUNztcbiAqIHJhdGhlciB0aGFuIGludmVudCBvbmUsIHRoZSBjbGFpbSBwaGFzZSBpcyBkcm9wcGVkIGFuZCBgc3RlcF9wcmVwYXJlX21zYFxuICogc3BhbnMgVDXihpJUNy4gVGhlIHN1bS1lcXVhbHMtdG90YWwgcHJvcGVydHkgaG9sZHMgZWl0aGVyIHdheS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVSZXN1bWVUdHJBdHRyaWJ1dGVzKHBhcmFtczoge1xuICB0cmFja2luZzogUmVzdW1lVHRyVHJhY2tpbmcgfCB1bmRlZmluZWQ7XG4gIC8qKiBUaGUgYXR0ZW1wdCBudW1iZXIgb2YgdGhlIGV4ZWN1dGlvbiBhYm91dCB0byBydW4uICovXG4gIGF0dGVtcHQ6IG51bWJlcjtcbiAgLyoqIFQ1OiBgRGF0ZS5ub3coKWAgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBgc3RlcF9zdGFydGVkYCByZXF1ZXN0LiAqL1xuICBzdGVwQ2xhaW1TdGFydGVkQXRNczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAvKiogVDY6IGBEYXRlLm5vdygpYCBvbmNlIHRoZSBgc3RlcF9zdGFydGVkYCByZXNwb25zZSByZXR1cm5lZC4gKi9cbiAgc3RlcENsYWltQ29tcGxldGVkQXRNczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAvKiogVDc6IGBEYXRlLm5vdygpYCBpbW1lZGlhdGVseSBiZWZvcmUgYHN0ZXBGbi5hcHBseSgpYC4gKi9cbiAgc3RlcENvZGVTdGFydGVkQXRNczogbnVtYmVyO1xufSk6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlcj4gfCB1bmRlZmluZWQge1xuICBjb25zdCB7IHRyYWNraW5nIH0gPSBwYXJhbXM7XG4gIGlmICghdHJhY2tpbmcgfHwgcGFyYW1zLmF0dGVtcHQgIT09IDEpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmIChcbiAgICB0cmFja2luZy5yZXBsYXlTdGFydGVkQXRNcyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgdHJhY2tpbmcubmV4dFN0ZXBFbmNvdW50ZXJlZEF0TXMgPT09IHVuZGVmaW5lZCB8fFxuICAgIHBhcmFtcy5zdGVwQ2xhaW1TdGFydGVkQXRNcyA9PT0gdW5kZWZpbmVkXG4gICkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBib3VuZGFyaWVzOiBSZXN1bWVCb3VuZGFyaWVzID0ge1xuICAgIHJlc3VtZVJlcXVlc3RlZEF0TXM6IHRyYWNraW5nLnJlc3VtZVJlcXVlc3RlZEF0TXMsXG4gICAgcXVldWVQdWJsaXNoUmVxdWVzdGVkQXRNczogdHJhY2tpbmcucXVldWVQdWJsaXNoUmVxdWVzdGVkQXRNcyxcbiAgICBjb25zdW1lclN0YXJ0ZWRBdE1zOiB0cmFja2luZy5jb25zdW1lclN0YXJ0ZWRBdE1zLFxuICAgIHJlcGxheVN0YXJ0ZWRBdE1zOiB0cmFja2luZy5yZXBsYXlTdGFydGVkQXRNcyxcbiAgICBuZXh0U3RlcEVuY291bnRlcmVkQXRNczogdHJhY2tpbmcubmV4dFN0ZXBFbmNvdW50ZXJlZEF0TXMsXG4gICAgc3RlcENsYWltU3RhcnRlZEF0TXM6IHBhcmFtcy5zdGVwQ2xhaW1TdGFydGVkQXRNcyxcbiAgICBzdGVwQ2xhaW1Db21wbGV0ZWRBdE1zOiBwYXJhbXMuc3RlcENsYWltQ29tcGxldGVkQXRNcyxcbiAgICBzdGVwQ29kZVN0YXJ0ZWRBdE1zOiBwYXJhbXMuc3RlcENvZGVTdGFydGVkQXRNcyxcbiAgfTtcbiAgaWYgKCF2YWxpZGF0ZUJvdW5kYXJpZXMoYm91bmRhcmllcykpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3Qge1xuICAgIHJlc3VtZVJlcXVlc3RlZEF0TXM6IHQwLFxuICAgIHF1ZXVlUHVibGlzaFJlcXVlc3RlZEF0TXM6IHQxLFxuICAgIGNvbnN1bWVyU3RhcnRlZEF0TXM6IHQyLFxuICAgIHJlcGxheVN0YXJ0ZWRBdE1zOiB0MyxcbiAgICBuZXh0U3RlcEVuY291bnRlcmVkQXRNczogdDQsXG4gICAgc3RlcENsYWltU3RhcnRlZEF0TXM6IHQ1LFxuICAgIHN0ZXBDbGFpbUNvbXBsZXRlZEF0TXM6IHQ2LFxuICAgIHN0ZXBDb2RlU3RhcnRlZEF0TXM6IHQ3LFxuICB9ID0gYm91bmRhcmllcztcblxuICByZXR1cm4ge1xuICAgIC4uLkF0dHJpYnV0ZS5SZXN1bWVUb3RhbE1zKHQ3IC0gdDApLFxuICAgIC4uLkF0dHJpYnV0ZS5SZXN1bWVQcm9kdWNlclByZXBNcyh0MSAtIHQwKSxcbiAgICAuLi5BdHRyaWJ1dGUuUmVzdW1lUXVldWVEZWxpdmVyeU1zKHQyIC0gdDEpLFxuICAgIC4uLkF0dHJpYnV0ZS5SZXN1bWVTZXR1cE1zKHQzIC0gdDIpLFxuICAgIC4uLkF0dHJpYnV0ZS5SZXN1bWVSZXBsYXlNcyh0NCAtIHQzKSxcbiAgICAuLi5BdHRyaWJ1dGUuUmVzdW1lU3RlcERpc3BhdGNoTXModDUgLSB0NCksXG4gICAgLi4uKHQ2ICE9PSB1bmRlZmluZWQgPyBBdHRyaWJ1dGUuUmVzdW1lU3RlcENsYWltTXModDYgLSB0NSkgOiB7fSksXG4gICAgLi4uQXR0cmlidXRlLlJlc3VtZVN0ZXBQcmVwYXJlTXModDcgLSAodDYgPz8gdDUpKSxcbiAgICAuLi5BdHRyaWJ1dGUuUmVzdW1lVHJpZ2dlcih0cmFja2luZy50cmlnZ2VyKSxcbiAgICAuLi4odHJhY2tpbmcuc3RyYXRlZ3kgIT09IHVuZGVmaW5lZFxuICAgICAgPyBBdHRyaWJ1dGUuUmVzdW1lU3RyYXRlZ3kodHJhY2tpbmcuc3RyYXRlZ3kpXG4gICAgICA6IHt9KSxcbiAgICAuLi4odHJhY2tpbmcuc2V0dXBTb3VyY2UgIT09IHVuZGVmaW5lZFxuICAgICAgPyBBdHRyaWJ1dGUuUmVzdW1lU2V0dXBTb3VyY2UodHJhY2tpbmcuc2V0dXBTb3VyY2UpXG4gICAgICA6IHt9KSxcbiAgICAuLi5BdHRyaWJ1dGUuUmVzdW1lU3RlcEV4ZWN1dGlvbih0cmFja2luZy5zdGVwRXhlY3V0aW9uKSxcbiAgfTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extracts the run's creation timestamp (epoch milliseconds) from a `wrun_`
|
|
3
|
+
* run ID by decoding the embedded ULID time component.
|
|
4
|
+
*
|
|
5
|
+
* `@workflow/world-vercel`'s region-tagged run IDs mark an ID as carrying
|
|
6
|
+
* metadata by setting the most-significant bit of the ULID's 48-bit
|
|
7
|
+
* timestamp, which would otherwise skew the decoded time past the year 6400.
|
|
8
|
+
* The tag-bit handling is delegated to the scheme's own codec
|
|
9
|
+
* (`decode()` returns the ULID with the tag bit cleared), so if the tagged
|
|
10
|
+
* layout ever evolves (the scheme carries a 5-bit version field for exactly
|
|
11
|
+
* that), this anchor keeps tracking the codec instead of silently diverging.
|
|
12
|
+
* For untagged input `decode()` is a passthrough.
|
|
13
|
+
*
|
|
14
|
+
* Returns `undefined` when `runId` is not a decodable `wrun_<ulid>` (e.g. a
|
|
15
|
+
* legacy/non-ULID id, or a test fixture like `wrun_test`); callers fall back to
|
|
16
|
+
* an authoritative timestamp from the run snapshot (`createdAt`) in that case.
|
|
17
|
+
*/
|
|
18
|
+
export declare function runIdCreatedAt(runId: string): number | undefined;
|
|
19
|
+
//# sourceMappingURL=run-id-time.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-id-time.d.ts","sourceRoot":"","sources":["../../src/runtime/run-id-time.ts"],"names":[],"mappings":"AAeA;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAShE"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { decode } from '@workflow/world-vercel/run-id';
|
|
2
|
+
import { decodeTime } from 'ulid';
|
|
3
|
+
/**
|
|
4
|
+
* Run IDs are minted client-side in `start()` as `wrun_<ulid>` (via
|
|
5
|
+
* `World.createRunId()` when the world provides one, else a plain ULID; see
|
|
6
|
+
* `runtime/helpers.ts`). A ULID encodes its creation time in its first 48 bits,
|
|
7
|
+
* so the run's creation timestamp is recoverable from the run ID alone,
|
|
8
|
+
* without any server round-trip or run-snapshot load. This is the earliest
|
|
9
|
+
* replay-stable timestamp a delivery has (the run ID arrives in the queue
|
|
10
|
+
* payload), which lets the workflow VM be seeded and clock-initialized before
|
|
11
|
+
* `run_started`.
|
|
12
|
+
*/
|
|
13
|
+
const RUN_ID_PREFIX = 'wrun_';
|
|
14
|
+
/**
|
|
15
|
+
* Extracts the run's creation timestamp (epoch milliseconds) from a `wrun_`
|
|
16
|
+
* run ID by decoding the embedded ULID time component.
|
|
17
|
+
*
|
|
18
|
+
* `@workflow/world-vercel`'s region-tagged run IDs mark an ID as carrying
|
|
19
|
+
* metadata by setting the most-significant bit of the ULID's 48-bit
|
|
20
|
+
* timestamp, which would otherwise skew the decoded time past the year 6400.
|
|
21
|
+
* The tag-bit handling is delegated to the scheme's own codec
|
|
22
|
+
* (`decode()` returns the ULID with the tag bit cleared), so if the tagged
|
|
23
|
+
* layout ever evolves (the scheme carries a 5-bit version field for exactly
|
|
24
|
+
* that), this anchor keeps tracking the codec instead of silently diverging.
|
|
25
|
+
* For untagged input `decode()` is a passthrough.
|
|
26
|
+
*
|
|
27
|
+
* Returns `undefined` when `runId` is not a decodable `wrun_<ulid>` (e.g. a
|
|
28
|
+
* legacy/non-ULID id, or a test fixture like `wrun_test`); callers fall back to
|
|
29
|
+
* an authoritative timestamp from the run snapshot (`createdAt`) in that case.
|
|
30
|
+
*/
|
|
31
|
+
export function runIdCreatedAt(runId) {
|
|
32
|
+
const ulidPart = runId.startsWith(RUN_ID_PREFIX)
|
|
33
|
+
? runId.slice(RUN_ID_PREFIX.length)
|
|
34
|
+
: runId;
|
|
35
|
+
try {
|
|
36
|
+
return decodeTime(decode(ulidPart).ulid);
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVuLWlkLXRpbWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9ydW4taWQtdGltZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVsQzs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUM7QUFFOUI7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLEtBQWE7SUFDMUMsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUM7UUFDOUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQztRQUNuQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ1YsSUFBSSxDQUFDO1FBQ0gsT0FBTyxVQUFVLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlY29kZSB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZC12ZXJjZWwvcnVuLWlkJztcbmltcG9ydCB7IGRlY29kZVRpbWUgfSBmcm9tICd1bGlkJztcblxuLyoqXG4gKiBSdW4gSURzIGFyZSBtaW50ZWQgY2xpZW50LXNpZGUgaW4gYHN0YXJ0KClgIGFzIGB3cnVuXzx1bGlkPmAgKHZpYVxuICogYFdvcmxkLmNyZWF0ZVJ1bklkKClgIHdoZW4gdGhlIHdvcmxkIHByb3ZpZGVzIG9uZSwgZWxzZSBhIHBsYWluIFVMSUQ7IHNlZVxuICogYHJ1bnRpbWUvaGVscGVycy50c2ApLiBBIFVMSUQgZW5jb2RlcyBpdHMgY3JlYXRpb24gdGltZSBpbiBpdHMgZmlyc3QgNDggYml0cyxcbiAqIHNvIHRoZSBydW4ncyBjcmVhdGlvbiB0aW1lc3RhbXAgaXMgcmVjb3ZlcmFibGUgZnJvbSB0aGUgcnVuIElEIGFsb25lLFxuICogd2l0aG91dCBhbnkgc2VydmVyIHJvdW5kLXRyaXAgb3IgcnVuLXNuYXBzaG90IGxvYWQuIFRoaXMgaXMgdGhlIGVhcmxpZXN0XG4gKiByZXBsYXktc3RhYmxlIHRpbWVzdGFtcCBhIGRlbGl2ZXJ5IGhhcyAodGhlIHJ1biBJRCBhcnJpdmVzIGluIHRoZSBxdWV1ZVxuICogcGF5bG9hZCksIHdoaWNoIGxldHMgdGhlIHdvcmtmbG93IFZNIGJlIHNlZWRlZCBhbmQgY2xvY2staW5pdGlhbGl6ZWQgYmVmb3JlXG4gKiBgcnVuX3N0YXJ0ZWRgLlxuICovXG5jb25zdCBSVU5fSURfUFJFRklYID0gJ3dydW5fJztcblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgcnVuJ3MgY3JlYXRpb24gdGltZXN0YW1wIChlcG9jaCBtaWxsaXNlY29uZHMpIGZyb20gYSBgd3J1bl9gXG4gKiBydW4gSUQgYnkgZGVjb2RpbmcgdGhlIGVtYmVkZGVkIFVMSUQgdGltZSBjb21wb25lbnQuXG4gKlxuICogYEB3b3JrZmxvdy93b3JsZC12ZXJjZWxgJ3MgcmVnaW9uLXRhZ2dlZCBydW4gSURzIG1hcmsgYW4gSUQgYXMgY2FycnlpbmdcbiAqIG1ldGFkYXRhIGJ5IHNldHRpbmcgdGhlIG1vc3Qtc2lnbmlmaWNhbnQgYml0IG9mIHRoZSBVTElEJ3MgNDgtYml0XG4gKiB0aW1lc3RhbXAsIHdoaWNoIHdvdWxkIG90aGVyd2lzZSBza2V3IHRoZSBkZWNvZGVkIHRpbWUgcGFzdCB0aGUgeWVhciA2NDAwLlxuICogVGhlIHRhZy1iaXQgaGFuZGxpbmcgaXMgZGVsZWdhdGVkIHRvIHRoZSBzY2hlbWUncyBvd24gY29kZWNcbiAqIChgZGVjb2RlKClgIHJldHVybnMgdGhlIFVMSUQgd2l0aCB0aGUgdGFnIGJpdCBjbGVhcmVkKSwgc28gaWYgdGhlIHRhZ2dlZFxuICogbGF5b3V0IGV2ZXIgZXZvbHZlcyAodGhlIHNjaGVtZSBjYXJyaWVzIGEgNS1iaXQgdmVyc2lvbiBmaWVsZCBmb3IgZXhhY3RseVxuICogdGhhdCksIHRoaXMgYW5jaG9yIGtlZXBzIHRyYWNraW5nIHRoZSBjb2RlYyBpbnN0ZWFkIG9mIHNpbGVudGx5IGRpdmVyZ2luZy5cbiAqIEZvciB1bnRhZ2dlZCBpbnB1dCBgZGVjb2RlKClgIGlzIGEgcGFzc3Rocm91Z2guXG4gKlxuICogUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIGBydW5JZGAgaXMgbm90IGEgZGVjb2RhYmxlIGB3cnVuXzx1bGlkPmAgKGUuZy4gYVxuICogbGVnYWN5L25vbi1VTElEIGlkLCBvciBhIHRlc3QgZml4dHVyZSBsaWtlIGB3cnVuX3Rlc3RgKTsgY2FsbGVycyBmYWxsIGJhY2sgdG9cbiAqIGFuIGF1dGhvcml0YXRpdmUgdGltZXN0YW1wIGZyb20gdGhlIHJ1biBzbmFwc2hvdCAoYGNyZWF0ZWRBdGApIGluIHRoYXQgY2FzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1bklkQ3JlYXRlZEF0KHJ1bklkOiBzdHJpbmcpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCB1bGlkUGFydCA9IHJ1bklkLnN0YXJ0c1dpdGgoUlVOX0lEX1BSRUZJWClcbiAgICA/IHJ1bklkLnNsaWNlKFJVTl9JRF9QUkVGSVgubGVuZ3RoKVxuICAgIDogcnVuSWQ7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGRlY29kZVRpbWUoZGVjb2RlKHVsaWRQYXJ0KS51bGlkKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuIl19
|
package/dist/runtime/run.d.ts
CHANGED
|
@@ -1,6 +1,25 @@
|
|
|
1
1
|
import { WORKFLOW_DESERIALIZE, WORKFLOW_SERIALIZE } from '@workflow/serde';
|
|
2
|
-
import {
|
|
3
|
-
import { type StopSleepOptions, type StopSleepResult } from './runs.js';
|
|
2
|
+
import type { WorkflowRunStatus } from '@workflow/world';
|
|
3
|
+
import { type CancelRunOptions, type StopSleepOptions, type StopSleepResult } from './runs.js';
|
|
4
|
+
/** @internal */
|
|
5
|
+
export declare function getReturnValuePollIntervalMs(): number;
|
|
6
|
+
/** @internal */
|
|
7
|
+
export declare function getReturnValueWaitTimeoutMs(): number;
|
|
8
|
+
/** @internal */
|
|
9
|
+
export declare function getReturnValueMaxLongPolls(): number;
|
|
10
|
+
/**
|
|
11
|
+
* Whether `await run.returnValue` may use the World's long poll
|
|
12
|
+
* (`runs.waitForTerminalStatus`) instead of interval-polling `runs.get`.
|
|
13
|
+
*
|
|
14
|
+
* Default **ON** wherever the World implements the method; a World that does
|
|
15
|
+
* not is already on the interval path with nothing to switch off. Reads
|
|
16
|
+
* `process.env.WORKFLOW_RETURN_VALUE_LONG_POLL` lazily; an explicit `'0'` /
|
|
17
|
+
* `'false'` is the kill switch, restoring the fixed-interval poll exactly as
|
|
18
|
+
* it behaved before the fast path existed.
|
|
19
|
+
*
|
|
20
|
+
* @internal
|
|
21
|
+
*/
|
|
22
|
+
export declare function isReturnValueLongPollEnabled(): boolean;
|
|
4
23
|
/**
|
|
5
24
|
* A `ReadableStream` extended with workflow-specific helpers.
|
|
6
25
|
*/
|
|
@@ -8,7 +27,7 @@ export type WorkflowReadableStream<R = any> = ReadableStream<R> & {
|
|
|
8
27
|
/**
|
|
9
28
|
* Returns the tail index (index of the last known chunk, 0-based) of the
|
|
10
29
|
* underlying workflow stream. Useful for resolving a negative `startIndex`
|
|
11
|
-
* into an absolute position
|
|
30
|
+
* into an absolute position, for example, when building reconnection
|
|
12
31
|
* endpoints that need to inform the client where the stream starts.
|
|
13
32
|
*
|
|
14
33
|
* Returns `-1` when no chunks have been written yet.
|
|
@@ -30,8 +49,8 @@ export interface WorkflowReadableStreamOptions {
|
|
|
30
49
|
*/
|
|
31
50
|
startIndex?: number;
|
|
32
51
|
/**
|
|
33
|
-
* Any asynchronous operations
|
|
34
|
-
* environment
|
|
52
|
+
* Any asynchronous operations to complete before pausing or terminating the
|
|
53
|
+
* execution environment
|
|
35
54
|
* (i.e. using [`waitUntil()`](https://developer.mozilla.org/docs/Web/API/ExtendableEvent/waitUntil) or similar).
|
|
36
55
|
*/
|
|
37
56
|
ops?: Promise<any>[];
|
|
@@ -42,6 +61,32 @@ export interface WorkflowReadableStreamOptions {
|
|
|
42
61
|
*/
|
|
43
62
|
global?: Record<string, any>;
|
|
44
63
|
}
|
|
64
|
+
/**
|
|
65
|
+
* Options for configuring a writable onto a workflow run's stream.
|
|
66
|
+
*/
|
|
67
|
+
export interface WorkflowRunWritableStreamOptions {
|
|
68
|
+
/**
|
|
69
|
+
* An optional namespace to distinguish between multiple streams associated
|
|
70
|
+
* with the same workflow run.
|
|
71
|
+
*/
|
|
72
|
+
namespace?: string;
|
|
73
|
+
/**
|
|
74
|
+
* Any asynchronous operations to complete before pausing or terminating the
|
|
75
|
+
* execution environment
|
|
76
|
+
* (i.e. using [`waitUntil()`](https://developer.mozilla.org/docs/Web/API/ExtendableEvent/waitUntil) or similar).
|
|
77
|
+
*
|
|
78
|
+
* Writes are acknowledged on buffer entry, so a caller that needs them
|
|
79
|
+
* durable before the environment goes away should pass an array here and
|
|
80
|
+
* await it after releasing the writer lock.
|
|
81
|
+
*/
|
|
82
|
+
ops?: Promise<any>[];
|
|
83
|
+
/**
|
|
84
|
+
* The global object to use for reducing types from the global scope.
|
|
85
|
+
*
|
|
86
|
+
* Defaults to {@link [`globalThis`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/globalThis)}.
|
|
87
|
+
*/
|
|
88
|
+
global?: Record<string, any>;
|
|
89
|
+
}
|
|
45
90
|
/**
|
|
46
91
|
* A handler class for a workflow run.
|
|
47
92
|
*/
|
|
@@ -72,8 +117,12 @@ export declare class Run<TResult> {
|
|
|
72
117
|
wakeUp(options?: StopSleepOptions): Promise<StopSleepResult>;
|
|
73
118
|
/**
|
|
74
119
|
* Cancels the workflow run.
|
|
120
|
+
*
|
|
121
|
+
* @param options - Optional cancellation settings. `cancelReason` records a
|
|
122
|
+
* free-text reason (max 512 chars) on the run_cancelled event, surfaced in
|
|
123
|
+
* the run detail view.
|
|
75
124
|
*/
|
|
76
|
-
cancel(): Promise<void>;
|
|
125
|
+
cancel(options?: CancelRunOptions): Promise<void>;
|
|
77
126
|
/**
|
|
78
127
|
* Whether the workflow run exists.
|
|
79
128
|
*/
|
|
@@ -84,7 +133,7 @@ export declare class Run<TResult> {
|
|
|
84
133
|
get status(): Promise<WorkflowRunStatus>;
|
|
85
134
|
/**
|
|
86
135
|
* The return value of the workflow run.
|
|
87
|
-
* Polls the workflow return value until
|
|
136
|
+
* Polls the workflow return value until the workflow run completes.
|
|
88
137
|
*/
|
|
89
138
|
get returnValue(): Promise<TResult>;
|
|
90
139
|
/**
|
|
@@ -122,6 +171,22 @@ export declare class Run<TResult> {
|
|
|
122
171
|
* @returns A `WorkflowReadableStream` for the workflow run.
|
|
123
172
|
*/
|
|
124
173
|
getReadable<R = any>(options?: WorkflowReadableStreamOptions): WorkflowReadableStream<R>;
|
|
174
|
+
/** The writable stream of the workflow run. */
|
|
175
|
+
get writable(): WritableStream;
|
|
176
|
+
/**
|
|
177
|
+
* Returns a writable that appends to this run's stream.
|
|
178
|
+
*
|
|
179
|
+
* Initialization is deferred until the first write. The run must already
|
|
180
|
+
* exist. The writable may be forwarded through `start()` and into steps, but
|
|
181
|
+
* grants no read access or additional authorization.
|
|
182
|
+
*
|
|
183
|
+
* @remarks
|
|
184
|
+
* `writer.close()` closes the shared stream. Contributors should call
|
|
185
|
+
* `releaseLock()`, which also drains pending writes.
|
|
186
|
+
*
|
|
187
|
+
* @param options - The writable stream options.
|
|
188
|
+
*/
|
|
189
|
+
getWritable<W = any>(options?: WorkflowRunWritableStreamOptions): WritableStream<W>;
|
|
125
190
|
}
|
|
126
191
|
/**
|
|
127
192
|
* Retrieves a `Run` object for a given run ID.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/runtime/run.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/runtime/run.ts"],"names":[],"mappings":"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"}
|