@workflow/core 5.0.0-beta.3 → 5.0.0-beta.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/attribute-changes.d.ts +7 -0
- package/dist/attribute-changes.d.ts.map +1 -0
- package/dist/attribute-changes.js +25 -0
- package/dist/capabilities.d.ts +22 -1
- package/dist/capabilities.d.ts.map +1 -1
- package/dist/capabilities.js +41 -4
- package/dist/capture-stack.d.ts +16 -0
- package/dist/capture-stack.d.ts.map +1 -0
- package/dist/capture-stack.js +21 -0
- package/dist/class-serialization.d.ts +32 -0
- package/dist/class-serialization.d.ts.map +1 -1
- package/dist/class-serialization.js +37 -1
- package/dist/classify-error.d.ts +26 -3
- package/dist/classify-error.d.ts.map +1 -1
- package/dist/classify-error.js +103 -6
- package/dist/context-errors.d.ts +27 -0
- package/dist/context-errors.d.ts.map +1 -0
- package/dist/context-errors.js +101 -0
- package/dist/context-violation-error.d.ts +97 -0
- package/dist/context-violation-error.d.ts.map +1 -0
- package/dist/context-violation-error.js +147 -0
- package/dist/create-hook.d.ts +42 -3
- package/dist/create-hook.d.ts.map +1 -1
- package/dist/create-hook.js +4 -3
- package/dist/define-hook.d.ts.map +1 -1
- package/dist/define-hook.js +20 -5
- package/dist/describe-error.d.ts +70 -0
- package/dist/describe-error.d.ts.map +1 -0
- package/dist/describe-error.js +165 -0
- package/dist/encryption.d.ts +22 -1
- package/dist/encryption.d.ts.map +1 -1
- package/dist/encryption.js +72 -27
- package/dist/events-consumer.d.ts +25 -1
- package/dist/events-consumer.d.ts.map +1 -1
- package/dist/events-consumer.js +95 -16
- package/dist/flushable-stream.d.ts +10 -10
- package/dist/flushable-stream.d.ts.map +1 -1
- package/dist/flushable-stream.js +26 -15
- package/dist/global.d.ts +35 -1
- package/dist/global.d.ts.map +1 -1
- package/dist/global.js +21 -3
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/log-format.d.ts +25 -0
- package/dist/log-format.d.ts.map +1 -0
- package/dist/log-format.js +250 -0
- package/dist/logger.d.ts +29 -30
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +82 -32
- package/dist/private.d.ts +107 -2
- package/dist/private.d.ts.map +1 -1
- package/dist/private.js +80 -3
- package/dist/runtime/constants.d.ts +189 -0
- package/dist/runtime/constants.d.ts.map +1 -1
- package/dist/runtime/constants.js +310 -15
- package/dist/runtime/get-port-lazy.d.ts +25 -0
- package/dist/runtime/get-port-lazy.d.ts.map +1 -0
- package/dist/runtime/get-port-lazy.js +92 -0
- package/dist/runtime/get-world-lazy.d.ts +23 -0
- package/dist/runtime/get-world-lazy.d.ts.map +1 -0
- package/dist/runtime/get-world-lazy.js +46 -0
- package/dist/runtime/helpers.d.ts +57 -6
- package/dist/runtime/helpers.d.ts.map +1 -1
- package/dist/runtime/helpers.js +169 -32
- package/dist/runtime/replay-budget.d.ts +98 -0
- package/dist/runtime/replay-budget.d.ts.map +1 -0
- package/dist/runtime/replay-budget.js +192 -0
- package/dist/runtime/resume-hook.d.ts.map +1 -1
- package/dist/runtime/resume-hook.js +39 -23
- package/dist/runtime/run-id-time.d.ts +10 -0
- package/dist/runtime/run-id-time.d.ts.map +1 -0
- package/dist/runtime/run-id-time.js +31 -0
- package/dist/runtime/run.d.ts +6 -2
- package/dist/runtime/run.d.ts.map +1 -1
- package/dist/runtime/run.js +52 -10
- package/dist/runtime/runs.d.ts +36 -2
- package/dist/runtime/runs.d.ts.map +1 -1
- package/dist/runtime/runs.js +18 -7
- package/dist/runtime/start.d.ts +58 -1
- package/dist/runtime/start.d.ts.map +1 -1
- package/dist/runtime/start.js +160 -46
- package/dist/runtime/step-executor.d.ts +131 -0
- package/dist/runtime/step-executor.d.ts.map +1 -0
- package/dist/runtime/step-executor.js +818 -0
- package/dist/runtime/step-handler.d.ts.map +1 -1
- package/dist/runtime/step-handler.js +718 -557
- package/dist/runtime/step-latency.d.ts +131 -0
- package/dist/runtime/step-latency.d.ts.map +1 -0
- package/dist/runtime/step-latency.js +155 -0
- package/dist/runtime/step-ownership.d.ts +72 -0
- package/dist/runtime/step-ownership.d.ts.map +1 -0
- package/dist/runtime/step-ownership.js +114 -0
- package/dist/runtime/step-single-flight.d.ts +12 -0
- package/dist/runtime/step-single-flight.d.ts.map +1 -0
- package/dist/runtime/step-single-flight.js +69 -0
- package/dist/runtime/suspension-handler.d.ts +81 -7
- package/dist/runtime/suspension-handler.d.ts.map +1 -1
- package/dist/runtime/suspension-handler.js +355 -137
- package/dist/runtime/wait-continuation.d.ts +84 -0
- package/dist/runtime/wait-continuation.d.ts.map +1 -0
- package/dist/runtime/wait-continuation.js +105 -0
- package/dist/runtime/wait-until.d.ts +18 -0
- package/dist/runtime/wait-until.d.ts.map +1 -0
- package/dist/runtime/wait-until.js +42 -0
- package/dist/runtime/world-compatibility.d.ts +5 -0
- package/dist/runtime/world-compatibility.d.ts.map +1 -0
- package/dist/runtime/world-compatibility.js +12 -0
- package/dist/runtime/world-init.d.ts +50 -0
- package/dist/runtime/world-init.d.ts.map +1 -0
- package/dist/runtime/world-init.js +50 -0
- package/dist/runtime/world-target.d.ts +11 -0
- package/dist/runtime/world-target.d.ts.map +1 -0
- package/dist/runtime/world-target.js +15 -0
- package/dist/runtime/world.d.ts +21 -9
- package/dist/runtime/world.d.ts.map +1 -1
- package/dist/runtime/world.js +58 -83
- package/dist/runtime.d.ts +15 -10
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +1757 -326
- package/dist/schemas.d.ts +1 -1
- package/dist/schemas.d.ts.map +1 -1
- package/dist/schemas.js +1 -1
- package/dist/serialization/client.d.ts +17 -0
- package/dist/serialization/client.d.ts.map +1 -0
- package/dist/serialization/client.js +48 -0
- package/dist/serialization/codec-devalue.d.ts +14 -0
- package/dist/serialization/codec-devalue.d.ts.map +1 -0
- package/dist/serialization/codec-devalue.js +98 -0
- package/dist/serialization/codec.d.ts +106 -0
- package/dist/serialization/codec.d.ts.map +1 -0
- package/dist/serialization/codec.js +17 -0
- package/dist/serialization/compression.d.ts +104 -0
- package/dist/serialization/compression.d.ts.map +1 -0
- package/dist/serialization/compression.js +260 -0
- package/dist/serialization/encryption.d.ts +33 -0
- package/dist/serialization/encryption.d.ts.map +1 -0
- package/dist/serialization/encryption.js +70 -0
- package/dist/serialization/errors.d.ts +34 -0
- package/dist/serialization/errors.d.ts.map +1 -0
- package/dist/serialization/errors.js +59 -0
- package/dist/serialization/format.d.ts +60 -0
- package/dist/serialization/format.d.ts.map +1 -0
- package/dist/serialization/format.js +97 -0
- package/dist/serialization/index.d.ts +19 -0
- package/dist/serialization/index.d.ts.map +1 -0
- package/dist/serialization/index.js +22 -0
- package/dist/serialization/reducers/class.d.ts +11 -0
- package/dist/serialization/reducers/class.d.ts.map +1 -0
- package/dist/serialization/reducers/class.js +68 -0
- package/dist/serialization/reducers/common.d.ts +16 -0
- package/dist/serialization/reducers/common.d.ts.map +1 -0
- package/dist/serialization/reducers/common.js +417 -0
- package/dist/serialization/reducers/step-function.d.ts +35 -0
- package/dist/serialization/reducers/step-function.d.ts.map +1 -0
- package/dist/serialization/reducers/step-function.js +88 -0
- package/dist/serialization/step.d.ts +17 -0
- package/dist/serialization/step.d.ts.map +1 -0
- package/dist/serialization/step.js +48 -0
- package/dist/serialization/types.d.ts +253 -0
- package/dist/serialization/types.d.ts.map +1 -0
- package/dist/serialization/types.js +25 -0
- package/dist/serialization/workflow.d.ts +29 -0
- package/dist/serialization/workflow.d.ts.map +1 -0
- package/dist/serialization/workflow.js +54 -0
- package/dist/serialization-format.d.ts +16 -0
- package/dist/serialization-format.d.ts.map +1 -1
- package/dist/serialization-format.js +213 -50
- package/dist/serialization.d.ts +322 -214
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +1575 -664
- package/dist/set-attributes.d.ts +18 -0
- package/dist/set-attributes.d.ts.map +1 -0
- package/dist/set-attributes.js +61 -0
- package/dist/sleep.d.ts.map +1 -1
- package/dist/sleep.js +3 -2
- package/dist/source-map.d.ts +5 -0
- package/dist/source-map.d.ts.map +1 -1
- package/dist/source-map.js +102 -10
- package/dist/step/context-storage.d.ts +53 -0
- package/dist/step/context-storage.d.ts.map +1 -1
- package/dist/step/context-storage.js +1 -1
- package/dist/step/get-closure-vars.d.ts.map +1 -1
- package/dist/step/get-closure-vars.js +3 -2
- package/dist/step/get-step-metadata.d.ts.map +1 -1
- package/dist/step/get-step-metadata.js +3 -2
- package/dist/step/get-workflow-metadata.d.ts.map +1 -1
- package/dist/step/get-workflow-metadata.js +3 -2
- package/dist/step/writable-stream.d.ts.map +1 -1
- package/dist/step/writable-stream.js +58 -6
- package/dist/step-hydration-cache.d.ts +148 -0
- package/dist/step-hydration-cache.d.ts.map +1 -0
- package/dist/step-hydration-cache.js +171 -0
- package/dist/step.d.ts.map +1 -1
- package/dist/step.js +144 -25
- package/dist/symbols.d.ts +28 -0
- package/dist/symbols.d.ts.map +1 -1
- package/dist/symbols.js +29 -1
- package/dist/telemetry/semantic-conventions.d.ts +98 -2
- package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
- package/dist/telemetry/semantic-conventions.js +66 -1
- package/dist/telemetry.d.ts +68 -0
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +106 -4
- package/dist/types.d.ts +6 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +23 -1
- package/dist/util.d.ts +16 -6
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +25 -16
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +2 -2
- package/dist/vm/index.d.ts.map +1 -1
- package/dist/vm/index.js +3 -2
- package/dist/vm/script-cache.d.ts +28 -0
- package/dist/vm/script-cache.d.ts.map +1 -0
- package/dist/vm/script-cache.js +140 -0
- package/dist/workflow/abort-controller.d.ts +65 -0
- package/dist/workflow/abort-controller.d.ts.map +1 -0
- package/dist/workflow/abort-controller.js +277 -0
- package/dist/workflow/attribute-dispatcher.d.ts +6 -0
- package/dist/workflow/attribute-dispatcher.d.ts.map +1 -0
- package/dist/workflow/attribute-dispatcher.js +48 -0
- package/dist/workflow/create-hook.d.ts.map +1 -1
- package/dist/workflow/create-hook.js +25 -3
- package/dist/workflow/define-hook.d.ts +1 -1
- package/dist/workflow/define-hook.d.ts.map +1 -1
- package/dist/workflow/define-hook.js +8 -4
- package/dist/workflow/get-workflow-metadata.d.ts.map +1 -1
- package/dist/workflow/get-workflow-metadata.js +14 -3
- package/dist/workflow/hook.d.ts.map +1 -1
- package/dist/workflow/hook.js +207 -33
- package/dist/workflow/index.d.ts +1 -0
- package/dist/workflow/index.d.ts.map +1 -1
- package/dist/workflow/index.js +5 -3
- package/dist/workflow/set-attributes.d.ts +77 -0
- package/dist/workflow/set-attributes.d.ts.map +1 -0
- package/dist/workflow/set-attributes.js +65 -0
- package/dist/workflow/sleep.d.ts.map +1 -1
- package/dist/workflow/sleep.js +45 -8
- package/dist/workflow/world-init-stub.d.ts +15 -0
- package/dist/workflow/world-init-stub.d.ts.map +1 -0
- package/dist/workflow/world-init-stub.js +15 -0
- package/dist/workflow.d.ts +17 -1
- package/dist/workflow.d.ts.map +1 -1
- package/dist/workflow.js +190 -56
- package/docs/api-reference/create-hook.mdx +38 -0
- package/docs/api-reference/create-webhook.mdx +1 -0
- package/docs/api-reference/fetch.mdx +5 -0
- package/docs/api-reference/index.mdx +3 -0
- package/docs/api-reference/set-attributes.mdx +65 -0
- package/docs/foundations/cancellation.mdx +459 -0
- package/docs/foundations/errors-and-retries.mdx +7 -3
- package/docs/foundations/hooks.mdx +29 -0
- package/docs/foundations/idempotency.mdx +236 -11
- package/docs/foundations/index.mdx +1 -23
- package/docs/foundations/meta.json +3 -1
- package/docs/foundations/serialization.mdx +77 -41
- package/docs/foundations/starting-workflows.mdx +5 -1
- package/docs/foundations/streaming.mdx +14 -23
- package/docs/foundations/versioning.mdx +263 -0
- package/docs/how-it-works/cancellation.mdx +287 -0
- package/docs/how-it-works/code-transform.mdx +2 -2
- package/docs/how-it-works/encryption.mdx +2 -2
- package/docs/how-it-works/event-sourcing.mdx +2 -2
- package/docs/how-it-works/meta.json +2 -1
- package/package.json +32 -11
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
import { ReplayDivergenceError } from '@workflow/errors';
|
|
2
|
+
import { EventConsumerResult } from '../events-consumer.js';
|
|
3
|
+
import { hydrateStepReturnValue } from '../serialization.js';
|
|
4
|
+
import { ABORT_HOOK_TOKEN, ABORT_STREAM_NAME } from '../symbols.js';
|
|
5
|
+
import { getAbortStreamId } from '../util.js';
|
|
6
|
+
/**
|
|
7
|
+
* A lightweight AbortSignal implementation for the workflow VM context.
|
|
8
|
+
*
|
|
9
|
+
* `signal.aborted` and listeners are updated in two scenarios:
|
|
10
|
+
* 1. On first-run: when `abort()` is called in the workflow code
|
|
11
|
+
* 2. On replay: when the events consumer processes the `hook_received`
|
|
12
|
+
* event (chained through promiseQueue for deterministic ordering)
|
|
13
|
+
*
|
|
14
|
+
* On replay, `abort()` in the workflow code becomes a no-op since
|
|
15
|
+
* `_setAborted` was already called by the events consumer.
|
|
16
|
+
*/
|
|
17
|
+
export class WorkflowAbortSignal {
|
|
18
|
+
aborted = false;
|
|
19
|
+
reason = undefined;
|
|
20
|
+
[ABORT_STREAM_NAME];
|
|
21
|
+
[ABORT_HOOK_TOKEN];
|
|
22
|
+
#listeners = [];
|
|
23
|
+
#onabort = null;
|
|
24
|
+
get onabort() {
|
|
25
|
+
return this.#onabort;
|
|
26
|
+
}
|
|
27
|
+
set onabort(handler) {
|
|
28
|
+
this.#onabort = handler;
|
|
29
|
+
if (handler && this.aborted) {
|
|
30
|
+
handler.call(this);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
constructor(streamName, hookToken) {
|
|
34
|
+
this[ABORT_STREAM_NAME] = streamName;
|
|
35
|
+
this[ABORT_HOOK_TOKEN] = hookToken;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* @internal Sets aborted state and fires listeners.
|
|
39
|
+
* Called by abort() on first-run, or by the events consumer on replay.
|
|
40
|
+
* Idempotent — second call is a no-op.
|
|
41
|
+
*/
|
|
42
|
+
_setAborted(reason) {
|
|
43
|
+
if (this.aborted)
|
|
44
|
+
return;
|
|
45
|
+
this.aborted = true;
|
|
46
|
+
this.reason = reason;
|
|
47
|
+
if (this.#onabort) {
|
|
48
|
+
this.#onabort.call(this);
|
|
49
|
+
}
|
|
50
|
+
for (const listener of this.#listeners) {
|
|
51
|
+
listener();
|
|
52
|
+
}
|
|
53
|
+
this.#listeners = [];
|
|
54
|
+
}
|
|
55
|
+
addEventListener(type, listener) {
|
|
56
|
+
if (type !== 'abort')
|
|
57
|
+
return;
|
|
58
|
+
if (this.aborted) {
|
|
59
|
+
// Fire synchronously, not on a microtask. Native AbortSignal fires on a
|
|
60
|
+
// microtask per spec, but inside the workflow VM we deliberately diverge
|
|
61
|
+
// for deterministic replay: listener ordering must be tied to the
|
|
62
|
+
// orchestrator's sync execution path, not to microtask scheduling.
|
|
63
|
+
listener();
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
this.#listeners.push(listener);
|
|
67
|
+
}
|
|
68
|
+
removeEventListener(type, listener) {
|
|
69
|
+
if (type !== 'abort')
|
|
70
|
+
return;
|
|
71
|
+
this.#listeners = this.#listeners.filter((l) => l !== listener);
|
|
72
|
+
}
|
|
73
|
+
throwIfAborted() {
|
|
74
|
+
if (this.aborted) {
|
|
75
|
+
throw (this.reason ??
|
|
76
|
+
new DOMException('The operation was aborted.', 'AbortError'));
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Creates a workflow-context `AbortController` class that uses hooks for
|
|
82
|
+
* durable state and streams for real-time step propagation.
|
|
83
|
+
*
|
|
84
|
+
* Follows the same pattern as `createCreateHook()` in `workflow/hook.ts`:
|
|
85
|
+
* - Registers a hook in the invocations queue on construction
|
|
86
|
+
* - Subscribes to the events consumer for hook_created/hook_received events
|
|
87
|
+
* - `abort()` calls `_setAborted` + marks the hook for resumption
|
|
88
|
+
* - The suspension handler processes the abort (creates event + writes stream)
|
|
89
|
+
* - On replay, the events consumer calls `_setAborted` when hook_received
|
|
90
|
+
* is processed, and `abort()` in the workflow code becomes a no-op
|
|
91
|
+
*/
|
|
92
|
+
export function createCreateAbortController(ctx) {
|
|
93
|
+
return class WorkflowAbortController {
|
|
94
|
+
signal;
|
|
95
|
+
[ABORT_STREAM_NAME];
|
|
96
|
+
[ABORT_HOOK_TOKEN];
|
|
97
|
+
constructor() {
|
|
98
|
+
const id = ctx.generateUlid();
|
|
99
|
+
const streamName = getAbortStreamId(id);
|
|
100
|
+
const hookToken = `abrt_${id}`;
|
|
101
|
+
this[ABORT_STREAM_NAME] = streamName;
|
|
102
|
+
this[ABORT_HOOK_TOKEN] = hookToken;
|
|
103
|
+
this.signal = new WorkflowAbortSignal(streamName, hookToken);
|
|
104
|
+
// Register an internal system hook in the invocations queue.
|
|
105
|
+
// isSystem prevents token namespace conflicts with user hooks.
|
|
106
|
+
const correlationId = `hook_${ctx.generateUlid()}`;
|
|
107
|
+
ctx.invocationsQueue.set(correlationId, {
|
|
108
|
+
type: 'hook',
|
|
109
|
+
correlationId,
|
|
110
|
+
token: hookToken,
|
|
111
|
+
isWebhook: false,
|
|
112
|
+
isSystem: true,
|
|
113
|
+
});
|
|
114
|
+
// Subscribe to events for this hook's lifecycle
|
|
115
|
+
ctx.eventsConsumer.subscribe((event) => {
|
|
116
|
+
if (!event) {
|
|
117
|
+
return EventConsumerResult.NotConsumed;
|
|
118
|
+
}
|
|
119
|
+
if (event.correlationId !== correlationId) {
|
|
120
|
+
return EventConsumerResult.NotConsumed;
|
|
121
|
+
}
|
|
122
|
+
const eventToken = 'eventData' in event && event.eventData && 'token' in event.eventData
|
|
123
|
+
? event.eventData.token
|
|
124
|
+
: undefined;
|
|
125
|
+
if (typeof eventToken === 'string' &&
|
|
126
|
+
eventToken !== this[ABORT_HOOK_TOKEN]) {
|
|
127
|
+
ctx.promiseQueue = ctx.promiseQueue.then(() => {
|
|
128
|
+
ctx.onWorkflowError(new ReplayDivergenceError(`Replay divergence: abort hook event ${event.eventType} for ${correlationId} belongs to token "${eventToken}", but the current abort hook expects "${this[ABORT_HOOK_TOKEN]}"`, { eventId: event.eventId }));
|
|
129
|
+
});
|
|
130
|
+
return EventConsumerResult.Finished;
|
|
131
|
+
}
|
|
132
|
+
if (event.eventType === 'hook_created') {
|
|
133
|
+
const queueItem = ctx.invocationsQueue.get(correlationId);
|
|
134
|
+
if (queueItem && queueItem.type === 'hook') {
|
|
135
|
+
queueItem.hasCreatedEvent = true;
|
|
136
|
+
}
|
|
137
|
+
return EventConsumerResult.Consumed;
|
|
138
|
+
}
|
|
139
|
+
if (event.eventType === 'hook_received') {
|
|
140
|
+
// The abort was recorded in the event log (from a previous run's
|
|
141
|
+
// abort() call, or from a step/external abort). Update signal
|
|
142
|
+
// state and fire listeners at this deterministic point in the
|
|
143
|
+
// promiseQueue — same ordering as hook payload delivery.
|
|
144
|
+
//
|
|
145
|
+
// The payload is the dehydrated form written by the suspension
|
|
146
|
+
// handler (a Uint8Array, possibly encrypted). Hydrate it via the
|
|
147
|
+
// same machinery as regular hook payloads (workflow/hook.ts:117)
|
|
148
|
+
// so the reason round-trips with full type fidelity. Reading the
|
|
149
|
+
// raw payload here is a bug — it's not a plain object after
|
|
150
|
+
// dehydration, so `'reason' in payload` is false and reason
|
|
151
|
+
// ends up undefined on replay.
|
|
152
|
+
const rawPayload = event.eventData?.payload;
|
|
153
|
+
// Account this abort as a pending delivery, exactly like step
|
|
154
|
+
// results (step.ts) and hook payloads (workflow/hook.ts) do. The
|
|
155
|
+
// suspension handler dehydrates queued step arguments only once
|
|
156
|
+
// `scheduleWhenIdle` observes `pendingDeliveries === 0`. Without
|
|
157
|
+
// this counter, a step dispatched right after the abort — e.g. one
|
|
158
|
+
// that receives `controller.signal` — can have its arguments
|
|
159
|
+
// serialized while the abort is still in flight behind
|
|
160
|
+
// `await hydrateStepReturnValue`, capturing `signal.aborted === false`
|
|
161
|
+
// (and a missing reason). Bumping the counter holds the suspension
|
|
162
|
+
// until `_setAborted` has landed, so downstream serialization is
|
|
163
|
+
// deterministic regardless of reason-hydration (decryption) latency.
|
|
164
|
+
ctx.pendingDeliveries++;
|
|
165
|
+
ctx.promiseQueue = ctx.promiseQueue.then(async () => {
|
|
166
|
+
let reason;
|
|
167
|
+
try {
|
|
168
|
+
if (rawPayload !== undefined) {
|
|
169
|
+
try {
|
|
170
|
+
const hydrated = (await hydrateStepReturnValue(rawPayload, ctx.runId, ctx.encryptionKey, ctx.globalThis));
|
|
171
|
+
if (hydrated &&
|
|
172
|
+
typeof hydrated === 'object' &&
|
|
173
|
+
'reason' in hydrated) {
|
|
174
|
+
reason = hydrated.reason;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
// Best-effort: if hydration fails, fall back to undefined
|
|
179
|
+
// reason. The signal still aborts; the user just won't see
|
|
180
|
+
// the original reason. Matches WorkflowAbortSignal's spec
|
|
181
|
+
// fallback (DOMException AbortError).
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
this.signal._setAborted(reason);
|
|
185
|
+
}
|
|
186
|
+
finally {
|
|
187
|
+
ctx.pendingDeliveries--;
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
ctx.invocationsQueue.delete(correlationId);
|
|
191
|
+
// Multiple handlers can observe the same pending abort request and
|
|
192
|
+
// durably record it before replay removes the queue item. Abort is
|
|
193
|
+
// idempotent, so consume later matching receipts as no-ops instead
|
|
194
|
+
// of surfacing a corrupted event log after the first receipt.
|
|
195
|
+
return EventConsumerResult.Consumed;
|
|
196
|
+
}
|
|
197
|
+
if (event.eventType === 'hook_disposed') {
|
|
198
|
+
ctx.invocationsQueue.delete(correlationId);
|
|
199
|
+
return EventConsumerResult.Finished;
|
|
200
|
+
}
|
|
201
|
+
return EventConsumerResult.NotConsumed;
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
abort(reason) {
|
|
205
|
+
if (this.signal.aborted)
|
|
206
|
+
return; // no-op (already aborted, e.g. from replay)
|
|
207
|
+
// Update signal state and fire listeners synchronously
|
|
208
|
+
this.signal._setAborted(reason);
|
|
209
|
+
// Mark the hook for resumption so the suspension handler records
|
|
210
|
+
// the abort in the event log and writes the stream packet.
|
|
211
|
+
for (const [, item] of ctx.invocationsQueue) {
|
|
212
|
+
if (item.type === 'hook' && item.token === this[ABORT_HOOK_TOKEN]) {
|
|
213
|
+
item.abortRequested = true;
|
|
214
|
+
item.abortReason = reason;
|
|
215
|
+
break;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Creates a workflow-context `AbortSignal` object with static methods.
|
|
223
|
+
*/
|
|
224
|
+
export function createAbortSignalStatics() {
|
|
225
|
+
return {
|
|
226
|
+
abort(reason) {
|
|
227
|
+
const signal = new WorkflowAbortSignal('', '');
|
|
228
|
+
signal._setAborted(reason ?? new DOMException('The operation was aborted.', 'AbortError'));
|
|
229
|
+
return signal;
|
|
230
|
+
},
|
|
231
|
+
any(signals) {
|
|
232
|
+
const composite = new WorkflowAbortSignal('', '');
|
|
233
|
+
// Materialize the iterable once. Native AbortSignal.any does the same:
|
|
234
|
+
// single-shot iterables (e.g. generators) would otherwise produce zero
|
|
235
|
+
// entries on the second pass below.
|
|
236
|
+
const arr = Array.from(signals);
|
|
237
|
+
for (const signal of arr) {
|
|
238
|
+
if (signal.aborted) {
|
|
239
|
+
composite._setAborted(signal.reason);
|
|
240
|
+
return composite;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
// Listen to each signal — first one to abort wins. Track listeners so
|
|
244
|
+
// we can remove them after the composite aborts; otherwise the closures
|
|
245
|
+
// (capturing `composite`) prevent GC for any input signal that outlives
|
|
246
|
+
// the composite (e.g. a long-lived external controller).
|
|
247
|
+
const listeners = [];
|
|
248
|
+
const cleanup = () => {
|
|
249
|
+
for (const { signal, listener } of listeners) {
|
|
250
|
+
if (signal.removeEventListener) {
|
|
251
|
+
signal.removeEventListener('abort', listener);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
listeners.length = 0;
|
|
255
|
+
};
|
|
256
|
+
for (const signal of arr) {
|
|
257
|
+
if (!signal.addEventListener)
|
|
258
|
+
continue;
|
|
259
|
+
const listener = () => {
|
|
260
|
+
if (!composite.aborted) {
|
|
261
|
+
composite._setAborted(signal.reason);
|
|
262
|
+
cleanup();
|
|
263
|
+
}
|
|
264
|
+
};
|
|
265
|
+
listeners.push({ signal, listener });
|
|
266
|
+
signal.addEventListener('abort', listener);
|
|
267
|
+
}
|
|
268
|
+
return composite;
|
|
269
|
+
},
|
|
270
|
+
timeout() {
|
|
271
|
+
throw new Error('AbortSignal.timeout() is not supported in workflow functions. ' +
|
|
272
|
+
'Use sleep() with an AbortController instead. ' +
|
|
273
|
+
'See: /docs/errors/abort-signal-timeout-in-workflow');
|
|
274
|
+
},
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJvcnQtY29udHJvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93b3JrZmxvdy9hYm9ydC1jb250cm9sbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTVELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzdELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFOUM7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sT0FBTyxtQkFBbUI7SUFDOUIsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNoQixNQUFNLEdBQVksU0FBUyxDQUFDO0lBRW5CLENBQUMsaUJBQWlCLENBQUMsQ0FBUztJQUM1QixDQUFDLGdCQUFnQixDQUFDLENBQVM7SUFFcEMsVUFBVSxHQUFzQixFQUFFLENBQUM7SUFDbkMsUUFBUSxHQUFpRCxJQUFJLENBQUM7SUFFOUQsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxJQUFJLE9BQU8sQ0FBQyxPQUFxRDtRQUMvRCxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztRQUN4QixJQUFJLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDNUIsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQixDQUFDO0lBQ0gsQ0FBQztJQUVELFlBQVksVUFBa0IsRUFBRSxTQUFpQjtRQUMvQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxVQUFVLENBQUM7UUFDckMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcs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TUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLFNBQVMsRUFBRSxDQUFDO29CQUM3QyxJQUFJLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO3dCQUMvQixNQUFNLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO29CQUNoRCxDQUFDO2dCQUNILENBQUM7Z0JBQ0QsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDdkIsQ0FBQyxDQUFDO1lBRUYsS0FBSyxNQUFNLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFDekIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0I7b0JBQUUsU0FBUztnQkFDdkMsTUFBTSxRQUFRLEdBQUcsR0FBRyxFQUFFO29CQUNwQixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDO3dCQUN2QixTQUFTLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQzt3QkFDckMsT0FBTyxFQUFFLENBQUM7b0JBQ1osQ0FBQztnQkFDSCxDQUFDLENBQUM7Z0JBQ0YsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO2dCQUNyQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQzdDLENBQUM7WUFFRCxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBRUQsT0FBTztZQUNMLE1BQU0sSUFBSSxLQUFLLENBQ2IsZ0VBQWdFO2dCQUM5RCwrQ0FBK0M7Z0JBQy9DLG9EQUFvRCxDQUN2RCxDQUFDO1FBQ0osQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmVwbGF5RGl2ZXJnZW5jZUVycm9yIH0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQgeyBFdmVudENvbnN1bWVyUmVzdWx0IH0gZnJvbSAnLi4vZXZlbnRzLWNvbnN1bWVyLmpzJztcbmltcG9ydCB0eXBlIHsgV29ya2Zsb3dPcmNoZXN0cmF0b3JDb250ZXh0IH0gZnJvbSAnLi4vcHJpdmF0ZS5qcyc7XG5pbXBvcnQgeyBoeWRyYXRlU3RlcFJldHVyblZhbHVlIH0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbi5qcyc7XG5pbXBvcnQgeyBBQk9SVF9IT09LX1RPS0VOLCBBQk9SVF9TVFJFQU1fTkFNRSB9IGZyb20gJy4uL3N5bWJvbHMuanMnO1xuaW1wb3J0IHsgZ2V0QWJvcnRTdHJlYW1JZCB9IGZyb20gJy4uL3V0aWwuanMnO1xuXG4vKipcbiAqIEEgbGlnaHR3ZWlnaHQgQWJvcnRTaWduYWwgaW1wbGVtZW50YXRpb24gZm9yIHRoZSB3b3JrZmxvdyBWTSBjb250ZXh0LlxuICpcbiAqIGBzaWduYWwuYWJvcnRlZGAgYW5kIGxpc3RlbmVycyBhcmUgdXBkYXRlZCBpbiB0d28gc2NlbmFyaW9zOlxuICogMS4gT24gZmlyc3QtcnVuOiB3aGVuIGBhYm9ydCgpYCBpcyBjYWxsZWQgaW4gdGhlIHdvcmtmbG93IGNvZGVcbiAqIDIuIE9uIHJlcGxheTogd2hlbiB0aGUgZXZlbnRzIGNvbnN1bWVyIHByb2Nlc3NlcyB0aGUgYGhvb2tfcmVjZWl2ZWRgXG4gKiAgICBldmVudCAoY2hhaW5lZCB0aHJvdWdoIHByb21pc2VRdWV1ZSBmb3IgZGV0ZXJtaW5pc3RpYyBvcmRlcmluZylcbiAqXG4gKiBPbiByZXBsYXksIGBhYm9ydCgpYCBpbiB0aGUgd29ya2Zsb3cgY29kZSBiZWNvbWVzIGEgbm8tb3Agc2luY2VcbiAqIGBfc2V0QWJvcnRlZGAgd2FzIGFscmVhZHkgY2FsbGVkIGJ5IHRoZSBldmVudHMgY29uc3VtZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBXb3JrZmxvd0Fib3J0U2lnbmFsIHtcbiAgYWJvcnRlZCA9IGZhbHNlO1xuICByZWFzb246IHVua25vd24gPSB1bmRlZmluZWQ7XG5cbiAgcmVhZG9ubHkgW0FCT1JUX1NUUkVBTV9OQU1FXTogc3RyaW5nO1xuICByZWFkb25seSBbQUJPUlRfSE9PS19UT0tFTl06IHN0cmluZztcblxuICAjbGlzdGVuZXJzOiBBcnJheTwoKSA9PiB2b2lkPiA9IFtdO1xuICAjb25hYm9ydDogKCh0aGlzOiBXb3JrZmxvd0Fib3J0U2lnbmFsKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuXG4gIGdldCBvbmFib3J0KCk6ICgodGhpczogV29ya2Zsb3dBYm9ydFNpZ25hbCkgPT4gdm9pZCkgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy4jb25hYm9ydDtcbiAgfVxuXG4gIHNldCBvbmFib3J0KGhhbmRsZXI6ICgodGhpczogV29ya2Zsb3dBYm9ydFNpZ25hbCkgPT4gdm9pZCkgfCBudWxsKSB7XG4gICAgdGhpcy4jb25hYm9ydCA9IGhhbmRsZXI7XG4gICAgaWYgKGhhbmRsZXIgJiYgdGhpcy5hYm9ydGVkKSB7XG4gICAgICBoYW5kbGVyLmNhbGwodGhpcyk7XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3Ioc3RyZWFtTmFtZTogc3RyaW5nLCBob29rVG9rZW46IHN0cmluZykge1xuICAgIHRoaXNbQUJPUlRfU1RSRUFNX05BTUVdID0gc3RyZWFtTmFtZTtcbiAgICB0aGlzW0FCT1JUX0hPT0tfVE9LRU5dID0gaG9va1Rva2VuO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbCBTZXRzIGFib3J0ZWQgc3RhdGUgYW5kIGZpcmVzIGxpc3RlbmVycy5cbiAgICogQ2FsbGVkIGJ5IGFib3J0KCkgb24gZmlyc3QtcnVuLCBvciBieSB0aGUgZXZlbnRzIGNvbnN1bWVyIG9uIHJlcGxheS5cbiAgICogSWRlbXBvdGVudCDigJQgc2Vjb25kIGNhbGwgaXMgYSBuby1vcC5cbiAgICovXG4gIF9zZXRBYm9ydGVkKHJlYXNvbj86IHVua25vd24pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hYm9ydGVkKSByZXR1cm47XG4gICAgdGhpcy5hYm9ydGVkID0gdHJ1ZTtcbiAgICB0aGlzLnJlYXNvbiA9IHJlYXNvbjtcbiAgICBpZiAodGhpcy4jb25hYm9ydCkge1xuICAgICAgdGhpcy4jb25hYm9ydC5jYWxsKHRoaXMpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIHRoaXMuI2xpc3RlbmVycykge1xuICAgICAgbGlzdGVuZXIoKTtcbiAgICB9XG4gICAgdGhpcy4jbGlzdGVuZXJzID0gW107XG4gIH1cblxuICBhZGRFdmVudExpc3RlbmVyKHR5cGU6IHN0cmluZywgbGlzdGVuZXI6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBpZiAodHlwZSAhPT0gJ2Fib3J0JykgcmV0dXJuO1xuICAgIGlmICh0aGlzLmFib3J0ZWQpIHtcbiAgICAgIC8vIEZpcmUgc3luY2hyb25vdXNseSwgbm90IG9uIGEgbWljcm90YXNrLiBOYXRpdmUgQWJvcnRTaWduYWwgZmlyZXMgb24gYVxuICAgICAgLy8gbWljcm90YXNrIHBlciBzcGVjLCBidXQgaW5zaWRlIHRoZSB3b3JrZmxvdyBWTSB3ZSBkZWxpYmVyYXRlbHkgZGl2ZXJnZVxuICAgICAgLy8gZm9yIGRldGVybWluaXN0aWMgcmVwbGF5OiBsaXN0ZW5lciBvcmRlcmluZyBtdXN0IGJlIHRpZWQgdG8gdGhlXG4gICAgICAvLyBvcmNoZXN0cmF0b3IncyBzeW5jIGV4ZWN1dGlvbiBwYXRoLCBub3QgdG8gbWljcm90YXNrIHNjaGVkdWxpbmcuXG4gICAgICBsaXN0ZW5lcigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLiNsaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gIH1cblxuICByZW1vdmVFdmVudExpc3RlbmVyKHR5cGU6IHN0cmluZywgbGlzdGVuZXI6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBpZiAodHlwZSAhPT0gJ2Fib3J0JykgcmV0dXJuO1xuICAgIHRoaXMuI2xpc3RlbmVycyA9IHRoaXMuI2xpc3RlbmVycy5maWx0ZXIoKGwpID0+IGwgIT09IGxpc3RlbmVyKTtcbiAgfVxuXG4gIHRocm93SWZBYm9ydGVkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmFib3J0ZWQpIHtcbiAgICAgIHRocm93IChcbiAgICAgICAgdGhpcy5yZWFzb24gPz9cbiAgICAgICAgbmV3IERPTUV4Y2VwdGlvbignVGhlIG9wZXJhdGlvbiB3YXMgYWJvcnRlZC4nLCAnQWJvcnRFcnJvcicpXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSB3b3JrZmxvdy1jb250ZXh0IGBBYm9ydENvbnRyb2xsZXJgIGNsYXNzIHRoYXQgdXNlcyBob29rcyBmb3JcbiAqIGR1cmFibGUgc3RhdGUgYW5kIHN0cmVhbXMgZm9yIHJlYWwtdGltZSBzdGVwIHByb3BhZ2F0aW9uLlxuICpcbiAqIEZvbGxvd3MgdGhlIHNhbWUgcGF0dGVybiBhcyBgY3JlYXRlQ3JlYXRlSG9vaygpYCBpbiBgd29ya2Zsb3cvaG9vay50c2A6XG4gKiAtIFJlZ2lzdGVycyBhIGhvb2sgaW4gdGhlIGludm9jYXRpb25zIHF1ZXVlIG9uIGNvbnN0cnVjdGlvblxuICogLSBTdWJzY3JpYmVzIHRvIHRoZSBldmVudHMgY29uc3VtZXIgZm9yIGhvb2tfY3JlYXRlZC9ob29rX3JlY2VpdmVkIGV2ZW50c1xuICogLSBgYWJvcnQoKWAgY2FsbHMgYF9zZXRBYm9ydGVkYCArIG1hcmtzIHRoZSBob29rIGZvciByZXN1bXB0aW9uXG4gKiAtIFRoZSBzdXNwZW5zaW9uIGhhbmRsZXIgcHJvY2Vzc2VzIHRoZSBhYm9ydCAoY3JlYXRlcyBldmVudCArIHdyaXRlcyBzdHJlYW0pXG4gKiAtIE9uIHJlcGxheSwgdGhlIGV2ZW50cyBjb25zdW1lciBjYWxscyBgX3NldEFib3J0ZWRgIHdoZW4gaG9va19yZWNlaXZlZFxuICogICBpcyBwcm9jZXNzZWQsIGFuZCBgYWJvcnQoKWAgaW4gdGhlIHdvcmtmbG93IGNvZGUgYmVjb21lcyBhIG5vLW9wXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDcmVhdGVBYm9ydENvbnRyb2xsZXIoY3R4OiBXb3JrZmxvd09yY2hlc3RyYXRvckNvbnRleHQpIHtcbiAgcmV0dXJuIGNsYXNzIFdvcmtmbG93QWJvcnRDb250cm9sbGVyIHtcbiAgICByZWFkb25seSBzaWduYWw6IFdvcmtmbG93QWJvcnRTaWduYWw7XG4gICAgcmVhZG9ubHkgW0FCT1JUX1NUUkVBTV9OQU1FXTogc3RyaW5nO1xuICAgIHJlYWRvbmx5IFtBQk9SVF9IT09LX1RPS0VOXTogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICBjb25zdCBpZCA9IGN0eC5nZW5lcmF0ZVVsaWQoKTtcbiAgICAgIGNvbnN0IHN0cmVhbU5hbWUgPSBnZXRBYm9ydFN0cmVhbUlkKGlkKTtcbiAgICAgIGNvbnN0IGhvb2tUb2tlbiA9IGBhYnJ0XyR7aWR9YDtcblxuICAgICAgdGhpc1tBQk9SVF9TVFJFQU1fTkFNRV0gPSBzdHJlYW1OYW1lO1xuICAgICAgdGhpc1tBQk9SVF9IT09LX1RPS0VOXSA9IGhvb2tUb2tlbjtcbiAgICAgIHRoaXMuc2lnbmFsID0gbmV3IFdvcmtmbG93QWJvcnRTaWduYWwoc3RyZWFtTmFtZSwgaG9va1Rva2VuKTtcblxuICAgICAgLy8gUmVnaXN0ZXIgYW4gaW50ZXJuYWwgc3lzdGVtIGhvb2sgaW4gdGhlIGludm9jYXRpb25zIHF1ZXVlLlxuICAgICAgLy8gaXNTeXN0ZW0gcHJldmVudHMgdG9rZW4gbmFtZXNwYWNlIGNvbmZsaWN0cyB3aXRoIHVzZXIgaG9va3MuXG4gICAgICBjb25zdCBjb3JyZWxhdGlvbklkID0gYGhvb2tfJHtjdHguZ2VuZXJhdGVVbGlkKCl9YDtcbiAgICAgIGN0eC5pbnZvY2F0aW9uc1F1ZXVlLnNldChjb3JyZWxhdGlvbklkLCB7XG4gICAgICAgIHR5cGU6ICdob29rJyxcbiAgICAgICAgY29ycmVsYXRpb25JZCxcbiAgICAgICAgdG9rZW46IGhvb2tUb2tlbixcbiAgICAgICAgaXNXZWJob29rOiBmYWxzZSxcbiAgICAgICAgaXNTeXN0ZW06IHRydWUsXG4gICAgICB9KTtcblxuICAgICAgLy8gU3Vic2NyaWJlIHRvIGV2ZW50cyBmb3IgdGhpcyBob29rJ3MgbGlmZWN5Y2xlXG4gICAgICBjdHguZXZlbnRzQ29uc3VtZXIuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgICBpZiAoIWV2ZW50KSB7XG4gICAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuTm90Q29uc3VtZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXZlbnQuY29ycmVsYXRpb25JZCAhPT0gY29ycmVsYXRpb25JZCkge1xuICAgICAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0Lk5vdENvbnN1bWVkO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXZlbnRUb2tlbiA9XG4gICAgICAgICAgJ2V2ZW50RGF0YScgaW4gZXZlbnQgJiYgZXZlbnQuZXZlbnREYXRhICYmICd0b2tlbicgaW4gZXZlbnQuZXZlbnREYXRhXG4gICAgICAgICAgICA/IGV2ZW50LmV2ZW50RGF0YS50b2tlblxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIHR5cGVvZiBldmVudFRva2VuID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgIGV2ZW50VG9rZW4gIT09IHRoaXNbQUJPUlRfSE9PS19UT0tFTl1cbiAgICAgICAgKSB7XG4gICAgICAgICAgY3R4LnByb21pc2VRdWV1ZSA9IGN0eC5wcm9taXNlUXVldWUudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBjdHgub25Xb3JrZmxvd0Vycm9yKFxuICAgICAgICAgICAgICBuZXcgUmVwbGF5RGl2ZXJnZW5jZUVycm9yKFxuICAgICAgICAgICAgICAgIGBSZXBsYXkgZGl2ZXJnZW5jZTogYWJvcnQgaG9vayBldmVudCAke2V2ZW50LmV2ZW50VHlwZX0gZm9yICR7Y29ycmVsYXRpb25JZH0gYmVsb25ncyB0byB0b2tlbiBcIiR7ZXZlbnRUb2tlbn1cIiwgYnV0IHRoZSBjdXJyZW50IGFib3J0IGhvb2sgZXhwZWN0cyBcIiR7dGhpc1tBQk9SVF9IT09LX1RPS0VOXX1cImAsXG4gICAgICAgICAgICAgICAgeyBldmVudElkOiBldmVudC5ldmVudElkIH1cbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5GaW5pc2hlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudC5ldmVudFR5cGUgPT09ICdob29rX2NyZWF0ZWQnKSB7XG4gICAgICAgICAgY29uc3QgcXVldWVJdGVtID0gY3R4Lmludm9jYXRpb25zUXVldWUuZ2V0KGNvcnJlbGF0aW9uSWQpO1xuICAgICAgICAgIGlmIChxdWV1ZUl0ZW0gJiYgcXVldWVJdGVtLnR5cGUgPT09ICdob29rJykge1xuICAgICAgICAgICAgcXVldWVJdGVtLmhhc0NyZWF0ZWRFdmVudCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0LkNvbnN1bWVkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV2ZW50LmV2ZW50VHlwZSA9PT0gJ2hvb2tfcmVjZWl2ZWQnKSB7XG4gICAgICAgICAgLy8gVGhlIGFib3J0IHdhcyByZWNvcmRlZCBpbiB0aGUgZXZlbnQgbG9nIChmcm9tIGEgcHJldmlvdXMgcnVuJ3NcbiAgICAgICAgICAvLyBhYm9ydCgpIGNhbGwsIG9yIGZyb20gYSBzdGVwL2V4dGVybmFsIGFib3J0KS4gVXBkYXRlIHNpZ25hbFxuICAgICAgICAgIC8vIHN0YXRlIGFuZCBmaXJlIGxpc3RlbmVycyBhdCB0aGlzIGRldGVybWluaXN0aWMgcG9pbnQgaW4gdGhlXG4gICAgICAgICAgLy8gcHJvbWlzZVF1ZXVlIOKAlCBzYW1lIG9yZGVyaW5nIGFzIGhvb2sgcGF5bG9hZCBkZWxpdmVyeS5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIFRoZSBwYXlsb2FkIGlzIHRoZSBkZWh5ZHJhdGVkIGZvcm0gd3JpdHRlbiBieSB0aGUgc3VzcGVuc2lvblxuICAgICAgICAgIC8vIGhhbmRsZXIgKGEgVWludDhBcnJheSwgcG9zc2libHkgZW5jcnlwdGVkKS4gSHlkcmF0ZSBpdCB2aWEgdGhlXG4gICAgICAgICAgLy8gc2FtZSBtYWNoaW5lcnkgYXMgcmVndWxhciBob29rIHBheWxvYWRzICh3b3JrZmxvdy9ob29rLnRzOjExNylcbiAgICAgICAgICAvLyBzbyB0aGUgcmVhc29uIHJvdW5kLXRyaXBzIHdpdGggZnVsbCB0eXBlIGZpZGVsaXR5LiBSZWFkaW5nIHRoZVxuICAgICAgICAgIC8vIHJhdyBwYXlsb2FkIGhlcmUgaXMgYSBidWcg4oCUIGl0J3Mgbm90IGEgcGxhaW4gb2JqZWN0IGFmdGVyXG4gICAgICAgICAgLy8gZGVoeWRyYXRpb24sIHNvIGAncmVhc29uJyBpbiBwYXlsb2FkYCBpcyBmYWxzZSBhbmQgcmVhc29uXG4gICAgICAgICAgLy8gZW5kcyB1cCB1bmRlZmluZWQgb24gcmVwbGF5LlxuICAgICAgICAgIGNvbnN0IHJhd1BheWxvYWQgPSBldmVudC5ldmVudERhdGE/LnBheWxvYWQ7XG4gICAgICAgICAgLy8gQWNjb3VudCB0aGlzIGFib3J0IGFzIGEgcGVuZGluZyBkZWxpdmVyeSwgZXhhY3RseSBsaWtlIHN0ZXBcbiAgICAgICAgICAvLyByZXN1bHRzIChzdGVwLnRzKSBhbmQgaG9vayBwYXlsb2FkcyAod29ya2Zsb3cvaG9vay50cykgZG8uIFRoZVxuICAgICAgICAgIC8vIHN1c3BlbnNpb24gaGFuZGxlciBkZWh5ZHJhdGVzIHF1ZXVlZCBzdGVwIGFyZ3VtZW50cyBvbmx5IG9uY2VcbiAgICAgICAgICAvLyBgc2NoZWR1bGVXaGVuSWRsZWAgb2JzZXJ2ZXMgYHBlbmRpbmdEZWxpdmVyaWVzID09PSAwYC4gV2l0aG91dFxuICAgICAgICAgIC8vIHRoaXMgY291bnRlciwgYSBzdGVwIGRpc3BhdGNoZWQgcmlnaHQgYWZ0ZXIgdGhlIGFib3J0IOKAlCBlLmcuIG9uZVxuICAgICAgICAgIC8vIHRoYXQgcmVjZWl2ZXMgYGNvbnRyb2xsZXIuc2lnbmFsYCDigJQgY2FuIGhhdmUgaXRzIGFyZ3VtZW50c1xuICAgICAgICAgIC8vIHNlcmlhbGl6ZWQgd2hpbGUgdGhlIGFib3J0IGlzIHN0aWxsIGluIGZsaWdodCBiZWhpbmRcbiAgICAgICAgICAvLyBgYXdhaXQgaHlkcmF0ZVN0ZXBSZXR1cm5WYWx1ZWAsIGNhcHR1cmluZyBgc2lnbmFsLmFib3J0ZWQgPT09IGZhbHNlYFxuICAgICAgICAgIC8vIChhbmQgYSBtaXNzaW5nIHJlYXNvbikuIEJ1bXBpbmcgdGhlIGNvdW50ZXIgaG9sZHMgdGhlIHN1c3BlbnNpb25cbiAgICAgICAgICAvLyB1bnRpbCBgX3NldEFib3J0ZWRgIGhhcyBsYW5kZWQsIHNvIGRvd25zdHJlYW0gc2VyaWFsaXphdGlvbiBpc1xuICAgICAgICAgIC8vIGRldGVybWluaXN0aWMgcmVnYXJkbGVzcyBvZiByZWFzb24taHlkcmF0aW9uIChkZWNyeXB0aW9uKSBsYXRlbmN5LlxuICAgICAgICAgIGN0eC5wZW5kaW5nRGVsaXZlcmllcysrO1xuICAgICAgICAgIGN0eC5wcm9taXNlUXVldWUgPSBjdHgucHJvbWlzZVF1ZXVlLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgbGV0IHJlYXNvbjogdW5rbm93bjtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGlmIChyYXdQYXlsb2FkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgaHlkcmF0ZWQgPSAoYXdhaXQgaHlkcmF0ZVN0ZXBSZXR1cm5WYWx1ZShcbiAgICAgICAgICAgICAgICAgICAgcmF3UGF5bG9hZCxcbiAgICAgICAgICAgICAgICAgICAgY3R4LnJ1bklkLFxuICAgICAgICAgICAgICAgICAgICBjdHguZW5jcnlwdGlvbktleSxcbiAgICAgICAgICAgICAgICAgICAgY3R4Lmdsb2JhbFRoaXNcbiAgICAgICAgICAgICAgICAgICkpIGFzIHsgcmVhc29uPzogdW5rbm93biB9IHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBoeWRyYXRlZCAmJlxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgaHlkcmF0ZWQgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICAgICAgICAgICdyZWFzb24nIGluIGh5ZHJhdGVkXG4gICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmVhc29uID0gaHlkcmF0ZWQucmVhc29uO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgLy8gQmVzdC1lZmZvcnQ6IGlmIGh5ZHJhdGlvbiBmYWlscywgZmFsbCBiYWNrIHRvIHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgLy8gcmVhc29uLiBUaGUgc2lnbmFsIHN0aWxsIGFib3J0czsgdGhlIHVzZXIganVzdCB3b24ndCBzZWVcbiAgICAgICAgICAgICAgICAgIC8vIHRoZSBvcmlnaW5hbCByZWFzb24uIE1hdGNoZXMgV29ya2Zsb3dBYm9ydFNpZ25hbCdzIHNwZWNcbiAgICAgICAgICAgICAgICAgIC8vIGZhbGxiYWNrIChET01FeGNlcHRpb24gQWJvcnRFcnJvcikuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRoaXMuc2lnbmFsLl9zZXRBYm9ydGVkKHJlYXNvbik7XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICBjdHgucGVuZGluZ0RlbGl2ZXJpZXMtLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGN0eC5pbnZvY2F0aW9uc1F1ZXVlLmRlbGV0ZShjb3JyZWxhdGlvbklkKTtcbiAgICAgICAgICAvLyBNdWx0aXBsZSBoYW5kbGVycyBjYW4gb2JzZXJ2ZSB0aGUgc2FtZSBwZW5kaW5nIGFib3J0IHJlcXVlc3QgYW5kXG4gICAgICAgICAgLy8gZHVyYWJseSByZWNvcmQgaXQgYmVmb3JlIHJlcGxheSByZW1vdmVzIHRoZSBxdWV1ZSBpdGVtLiBBYm9ydCBpc1xuICAgICAgICAgIC8vIGlkZW1wb3RlbnQsIHNvIGNvbnN1bWUgbGF0ZXIgbWF0Y2hpbmcgcmVjZWlwdHMgYXMgbm8tb3BzIGluc3RlYWRcbiAgICAgICAgICAvLyBvZiBzdXJmYWNpbmcgYSBjb3JydXB0ZWQgZXZlbnQgbG9nIGFmdGVyIHRoZSBmaXJzdCByZWNlaXB0LlxuICAgICAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0LkNvbnN1bWVkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV2ZW50LmV2ZW50VHlwZSA9PT0gJ2hvb2tfZGlzcG9zZWQnKSB7XG4gICAgICAgICAgY3R4Lmludm9jYXRpb25zUXVldWUuZGVsZXRlKGNvcnJlbGF0aW9uSWQpO1xuICAgICAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0LkZpbmlzaGVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuTm90Q29uc3VtZWQ7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBhYm9ydChyZWFzb24/OiB1bmtub3duKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy5zaWduYWwuYWJvcnRlZCkgcmV0dXJuOyAvLyBuby1vcCAoYWxyZWFkeSBhYm9ydGVkLCBlLmcuIGZyb20gcmVwbGF5KVxuXG4gICAgICAvLyBVcGRhdGUgc2lnbmFsIHN0YXRlIGFuZCBmaXJlIGxpc3RlbmVycyBzeW5jaHJvbm91c2x5XG4gICAgICB0aGlzLnNpZ25hbC5fc2V0QWJvcnRlZChyZWFzb24pO1xuXG4gICAgICAvLyBNYXJrIHRoZSBob29rIGZvciByZXN1bXB0aW9uIHNvIHRoZSBzdXNwZW5zaW9uIGhhbmRsZXIgcmVjb3Jkc1xuICAgICAgLy8gdGhlIGFib3J0IGluIHRoZSBldmVudCBsb2cgYW5kIHdyaXRlcyB0aGUgc3RyZWFtIHBhY2tldC5cbiAgICAgIGZvciAoY29uc3QgWywgaXRlbV0gb2YgY3R4Lmludm9jYXRpb25zUXVldWUpIHtcbiAgICAgICAgaWYgKGl0ZW0udHlwZSA9PT0gJ2hvb2snICYmIGl0ZW0udG9rZW4gPT09IHRoaXNbQUJPUlRfSE9PS19UT0tFTl0pIHtcbiAgICAgICAgICBpdGVtLmFib3J0UmVxdWVzdGVkID0gdHJ1ZTtcbiAgICAgICAgICBpdGVtLmFib3J0UmVhc29uID0gcmVhc29uO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSB3b3JrZmxvdy1jb250ZXh0IGBBYm9ydFNpZ25hbGAgb2JqZWN0IHdpdGggc3RhdGljIG1ldGhvZHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBYm9ydFNpZ25hbFN0YXRpY3MoKToge1xuICBhYm9ydDogKHJlYXNvbj86IHVua25vd24pID0+IFdvcmtmbG93QWJvcnRTaWduYWw7XG4gIGFueTogKFxuICAgIHNpZ25hbHM6IEl0ZXJhYmxlPHtcbiAgICAgIGFib3J0ZWQ6IGJvb2xlYW47XG4gICAgICByZWFzb24/OiB1bmtub3duO1xuICAgICAgYWRkRXZlbnRMaXN0ZW5lcj86IEZ1bmN0aW9uO1xuICAgIH0+XG4gICkgPT4gV29ya2Zsb3dBYm9ydFNpZ25hbDtcbiAgdGltZW91dDogKCkgPT4gbmV2ZXI7XG59IHtcbiAgcmV0dXJuIHtcbiAgICBhYm9ydChyZWFzb24/OiB1bmtub3duKTogV29ya2Zsb3dBYm9ydFNpZ25hbCB7XG4gICAgICBjb25zdCBzaWduYWwgPSBuZXcgV29ya2Zsb3dBYm9ydFNpZ25hbCgnJywgJycpO1xuICAgICAgc2lnbmFsLl9zZXRBYm9ydGVkKFxuICAgICAgICByZWFzb24gPz8gbmV3IERPTUV4Y2VwdGlvbignVGhlIG9wZXJhdGlvbiB3YXMgYWJvcnRlZC4nLCAnQWJvcnRFcnJvcicpXG4gICAgICApO1xuICAgICAgcmV0dXJuIHNpZ25hbDtcbiAgICB9LFxuXG4gICAgYW55KFxuICAgICAgc2lnbmFsczogSXRlcmFibGU8e1xuICAgICAgICBhYm9ydGVkOiBib29sZWFuO1xuICAgICAgICByZWFzb24/OiB1bmtub3duO1xuICAgICAgICBhZGRFdmVudExpc3RlbmVyPzogRnVuY3Rpb247XG4gICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXI/OiBGdW5jdGlvbjtcbiAgICAgIH0+XG4gICAgKTogV29ya2Zsb3dBYm9ydFNpZ25hbCB7XG4gICAgICBjb25zdCBjb21wb3NpdGUgPSBuZXcgV29ya2Zsb3dBYm9ydFNpZ25hbCgnJywgJycpO1xuXG4gICAgICAvLyBNYXRlcmlhbGl6ZSB0aGUgaXRlcmFibGUgb25jZS4gTmF0aXZlIEFib3J0U2lnbmFsLmFueSBkb2VzIHRoZSBzYW1lOlxuICAgICAgLy8gc2luZ2xlLXNob3QgaXRlcmFibGVzIChlLmcuIGdlbmVyYXRvcnMpIHdvdWxkIG90aGVyd2lzZSBwcm9kdWNlIHplcm9cbiAgICAgIC8vIGVudHJpZXMgb24gdGhlIHNlY29uZCBwYXNzIGJlbG93LlxuICAgICAgY29uc3QgYXJyID0gQXJyYXkuZnJvbShzaWduYWxzKTtcblxuICAgICAgZm9yIChjb25zdCBzaWduYWwgb2YgYXJyKSB7XG4gICAgICAgIGlmIChzaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgIGNvbXBvc2l0ZS5fc2V0QWJvcnRlZChzaWduYWwucmVhc29uKTtcbiAgICAgICAgICByZXR1cm4gY29tcG9zaXRlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIExpc3RlbiB0byBlYWNoIHNpZ25hbCDigJQgZmlyc3Qgb25lIHRvIGFib3J0IHdpbnMuIFRyYWNrIGxpc3RlbmVycyBzb1xuICAgICAgLy8gd2UgY2FuIHJlbW92ZSB0aGVtIGFmdGVyIHRoZSBjb21wb3NpdGUgYWJvcnRzOyBvdGhlcndpc2UgdGhlIGNsb3N1cmVzXG4gICAgICAvLyAoY2FwdHVyaW5nIGBjb21wb3NpdGVgKSBwcmV2ZW50IEdDIGZvciBhbnkgaW5wdXQgc2lnbmFsIHRoYXQgb3V0bGl2ZXNcbiAgICAgIC8vIHRoZSBjb21wb3NpdGUgKGUuZy4gYSBsb25nLWxpdmVkIGV4dGVybmFsIGNvbnRyb2xsZXIpLlxuICAgICAgY29uc3QgbGlzdGVuZXJzOiBBcnJheTx7XG4gICAgICAgIHNpZ25hbDogKHR5cGVvZiBhcnIpW251bWJlcl07XG4gICAgICAgIGxpc3RlbmVyOiAoKSA9PiB2b2lkO1xuICAgICAgfT4gPSBbXTtcbiAgICAgIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgeyBzaWduYWwsIGxpc3RlbmVyIH0gb2YgbGlzdGVuZXJzKSB7XG4gICAgICAgICAgaWYgKHNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKSB7XG4gICAgICAgICAgICBzaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBsaXN0ZW5lcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxpc3RlbmVycy5sZW5ndGggPSAwO1xuICAgICAgfTtcblxuICAgICAgZm9yIChjb25zdCBzaWduYWwgb2YgYXJyKSB7XG4gICAgICAgIGlmICghc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBsaXN0ZW5lciA9ICgpID0+IHtcbiAgICAgICAgICBpZiAoIWNvbXBvc2l0ZS5hYm9ydGVkKSB7XG4gICAgICAgICAgICBjb21wb3NpdGUuX3NldEFib3J0ZWQoc2lnbmFsLnJlYXNvbik7XG4gICAgICAgICAgICBjbGVhbnVwKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBsaXN0ZW5lcnMucHVzaCh7IHNpZ25hbCwgbGlzdGVuZXIgfSk7XG4gICAgICAgIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGxpc3RlbmVyKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbXBvc2l0ZTtcbiAgICB9LFxuXG4gICAgdGltZW91dCgpOiBuZXZlciB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdBYm9ydFNpZ25hbC50aW1lb3V0KCkgaXMgbm90IHN1cHBvcnRlZCBpbiB3b3JrZmxvdyBmdW5jdGlvbnMuICcgK1xuICAgICAgICAgICdVc2Ugc2xlZXAoKSB3aXRoIGFuIEFib3J0Q29udHJvbGxlciBpbnN0ZWFkLiAnICtcbiAgICAgICAgICAnU2VlOiAvZG9jcy9lcnJvcnMvYWJvcnQtc2lnbmFsLXRpbWVvdXQtaW4td29ya2Zsb3cnXG4gICAgICApO1xuICAgIH0sXG4gIH07XG59XG4iXX0=
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { AttributeChange } from '@workflow/world';
|
|
2
|
+
import { type WorkflowOrchestratorContext } from '../private.js';
|
|
3
|
+
export declare function createSetAttributes(ctx: WorkflowOrchestratorContext): (changes: AttributeChange[], options?: {
|
|
4
|
+
allowReservedAttributes?: boolean;
|
|
5
|
+
}) => Promise<void>;
|
|
6
|
+
//# sourceMappingURL=attribute-dispatcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attribute-dispatcher.d.ts","sourceRoot":"","sources":["../../src/workflow/attribute-dispatcher.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAMvD,OAAO,EAEL,KAAK,2BAA2B,EACjC,MAAM,eAAe,CAAC;AAEvB,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,2BAA2B,IAEhE,SAAS,eAAe,EAAE,EAC1B,UAAS;IAAE,uBAAuB,CAAC,EAAE,OAAO,CAAA;CAAO,KAClD,OAAO,CAAC,IAAI,CAAC,CAsDjB"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { ReplayDivergenceError } from '@workflow/errors';
|
|
2
|
+
import { withResolvers } from '@workflow/utils';
|
|
3
|
+
import { EventConsumerResult } from '../events-consumer.js';
|
|
4
|
+
import { WorkflowSuspension, } from '../global.js';
|
|
5
|
+
import { scheduleWhenIdle, } from '../private.js';
|
|
6
|
+
export function createSetAttributes(ctx) {
|
|
7
|
+
return async function setAttributes(changes, options = {}) {
|
|
8
|
+
const { promise, resolve } = withResolvers();
|
|
9
|
+
const correlationId = `attr_${ctx.generateUlid()}`;
|
|
10
|
+
const queueItem = {
|
|
11
|
+
type: 'attribute',
|
|
12
|
+
correlationId,
|
|
13
|
+
changes,
|
|
14
|
+
...(options.allowReservedAttributes === true
|
|
15
|
+
? { allowReservedAttributes: true }
|
|
16
|
+
: {}),
|
|
17
|
+
};
|
|
18
|
+
ctx.invocationsQueue.set(correlationId, queueItem);
|
|
19
|
+
ctx.eventsConsumer.subscribe((event) => {
|
|
20
|
+
if (!event) {
|
|
21
|
+
scheduleWhenIdle(ctx, () => {
|
|
22
|
+
ctx.onWorkflowError(new WorkflowSuspension(ctx.invocationsQueue, ctx.globalThis));
|
|
23
|
+
});
|
|
24
|
+
return EventConsumerResult.NotConsumed;
|
|
25
|
+
}
|
|
26
|
+
if (event.correlationId !== correlationId) {
|
|
27
|
+
return EventConsumerResult.NotConsumed;
|
|
28
|
+
}
|
|
29
|
+
if (event.eventType !== 'attr_set' ||
|
|
30
|
+
event.eventData.writer.type !== 'workflow' ||
|
|
31
|
+
JSON.stringify(event.eventData.changes) !== JSON.stringify(changes) ||
|
|
32
|
+
(event.eventData.allowReservedAttributes === true) !==
|
|
33
|
+
(options.allowReservedAttributes === true)) {
|
|
34
|
+
ctx.promiseQueue = ctx.promiseQueue.then(() => {
|
|
35
|
+
ctx.onWorkflowError(new ReplayDivergenceError(`Replay divergence: Unexpected attribute event for ${correlationId}`, { eventId: event.eventId }));
|
|
36
|
+
});
|
|
37
|
+
return EventConsumerResult.Finished;
|
|
38
|
+
}
|
|
39
|
+
ctx.invocationsQueue.delete(correlationId);
|
|
40
|
+
ctx.promiseQueue = ctx.promiseQueue.then(() => {
|
|
41
|
+
resolve();
|
|
42
|
+
});
|
|
43
|
+
return EventConsumerResult.Finished;
|
|
44
|
+
});
|
|
45
|
+
return promise;
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0cmlidXRlLWRpc3BhdGNoZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd29ya2Zsb3cvYXR0cmlidXRlLWRpc3BhdGNoZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDekQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWhELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVELE9BQU8sRUFFTCxrQkFBa0IsR0FDbkIsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUNMLGdCQUFnQixHQUVqQixNQUFNLGVBQWUsQ0FBQztBQUV2QixNQUFNLFVBQVUsbUJBQW1CLENBQUMsR0FBZ0M7SUFDbEUsT0FBTyxLQUFLLFVBQVUsYUFBYSxDQUNqQyxPQUEwQixFQUMxQixVQUFpRCxFQUFFO1FBRW5ELE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEdBQUcsYUFBYSxFQUFRLENBQUM7UUFDbkQsTUFBTSxhQUFhLEdBQUcsUUFBUSxHQUFHLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQztRQUNuRCxNQUFNLFNBQVMsR0FBaUM7WUFDOUMsSUFBSSxFQUFFLFdBQVc7WUFDakIsYUFBYTtZQUNiLE9BQU87WUFDUCxHQUFHLENBQUMsT0FBTyxDQUFDLHVCQUF1QixLQUFLLElBQUk7Z0JBQzFDLENBQUMsQ0FBQyxFQUFFLHVCQUF1QixFQUFFLElBQUksRUFBRTtnQkFDbkMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUNSLENBQUM7UUFDRixHQUFHLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUVuRCxHQUFHLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3JDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDWCxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFO29CQUN6QixHQUFHLENBQUMsZUFBZSxDQUNqQixJQUFJLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLENBQUMsVUFBVSxDQUFDLENBQzdELENBQUM7Z0JBQ0osQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsT0FBTyxtQkFBbUIsQ0FBQyxXQUFXLENBQUM7WUFDekMsQ0FBQztZQUVELElBQUksS0FBSyxDQUFDLGFBQWEsS0FBSyxhQUFhLEVBQUUsQ0FBQztnQkFDMUMsT0FBTyxtQkFBbUIsQ0FBQyxXQUFXLENBQUM7WUFDekMsQ0FBQztZQUVELElBQ0UsS0FBSyxDQUFDLFNBQVMsS0FBSyxVQUFVO2dCQUM5QixLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssVUFBVTtnQkFDMUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDO2dCQUNuRSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsdUJBQXVCLEtBQUssSUFBSSxDQUFDO29CQUNoRCxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsS0FBSyxJQUFJLENBQUMsRUFDNUMsQ0FBQztnQkFDRCxHQUFHLENBQUMsWUFBWSxHQUFHLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtvQkFDNUMsR0FBRyxDQUFDLGVBQWUsQ0FDakIsSUFBSSxxQkFBcUIsQ0FDdkIscURBQXFELGFBQWEsRUFBRSxFQUNwRSxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQzNCLENBQ0YsQ0FBQztnQkFDSixDQUFDLENBQUMsQ0FBQztnQkFDSCxPQUFPLG1CQUFtQixDQUFDLFFBQVEsQ0FBQztZQUN0QyxDQUFDO1lBRUQsR0FBRyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUMzQyxHQUFHLENBQUMsWUFBWSxHQUFHLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtnQkFDNUMsT0FBTyxFQUFFLENBQUM7WUFDWixDQUFDLENBQUMsQ0FBQztZQUNILE9BQU8sbUJBQW1CLENBQUMsUUFBUSxDQUFDO1FBQ3RDLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlcGxheURpdmVyZ2VuY2VFcnJvciB9IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHsgd2l0aFJlc29sdmVycyB9IGZyb20gJ0B3b3JrZmxvdy91dGlscyc7XG5pbXBvcnQgdHlwZSB7IEF0dHJpYnV0ZUNoYW5nZSB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBFdmVudENvbnN1bWVyUmVzdWx0IH0gZnJvbSAnLi4vZXZlbnRzLWNvbnN1bWVyLmpzJztcbmltcG9ydCB7XG4gIHR5cGUgQXR0cmlidXRlSW52b2NhdGlvblF1ZXVlSXRlbSxcbiAgV29ya2Zsb3dTdXNwZW5zaW9uLFxufSBmcm9tICcuLi9nbG9iYWwuanMnO1xuaW1wb3J0IHtcbiAgc2NoZWR1bGVXaGVuSWRsZSxcbiAgdHlwZSBXb3JrZmxvd09yY2hlc3RyYXRvckNvbnRleHQsXG59IGZyb20gJy4uL3ByaXZhdGUuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2V0QXR0cmlidXRlcyhjdHg6IFdvcmtmbG93T3JjaGVzdHJhdG9yQ29udGV4dCkge1xuICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gc2V0QXR0cmlidXRlcyhcbiAgICBjaGFuZ2VzOiBBdHRyaWJ1dGVDaGFuZ2VbXSxcbiAgICBvcHRpb25zOiB7IGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzPzogYm9vbGVhbiB9ID0ge31cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBwcm9taXNlLCByZXNvbHZlIH0gPSB3aXRoUmVzb2x2ZXJzPHZvaWQ+KCk7XG4gICAgY29uc3QgY29ycmVsYXRpb25JZCA9IGBhdHRyXyR7Y3R4LmdlbmVyYXRlVWxpZCgpfWA7XG4gICAgY29uc3QgcXVldWVJdGVtOiBBdHRyaWJ1dGVJbnZvY2F0aW9uUXVldWVJdGVtID0ge1xuICAgICAgdHlwZTogJ2F0dHJpYnV0ZScsXG4gICAgICBjb3JyZWxhdGlvbklkLFxuICAgICAgY2hhbmdlcyxcbiAgICAgIC4uLihvcHRpb25zLmFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzID09PSB0cnVlXG4gICAgICAgID8geyBhbGxvd1Jlc2VydmVkQXR0cmlidXRlczogdHJ1ZSB9XG4gICAgICAgIDoge30pLFxuICAgIH07XG4gICAgY3R4Lmludm9jYXRpb25zUXVldWUuc2V0KGNvcnJlbGF0aW9uSWQsIHF1ZXVlSXRlbSk7XG5cbiAgICBjdHguZXZlbnRzQ29uc3VtZXIuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgaWYgKCFldmVudCkge1xuICAgICAgICBzY2hlZHVsZVdoZW5JZGxlKGN0eCwgKCkgPT4ge1xuICAgICAgICAgIGN0eC5vbldvcmtmbG93RXJyb3IoXG4gICAgICAgICAgICBuZXcgV29ya2Zsb3dTdXNwZW5zaW9uKGN0eC5pbnZvY2F0aW9uc1F1ZXVlLCBjdHguZ2xvYmFsVGhpcylcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuTm90Q29uc3VtZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudC5jb3JyZWxhdGlvbklkICE9PSBjb3JyZWxhdGlvbklkKSB7XG4gICAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0Lk5vdENvbnN1bWVkO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIGV2ZW50LmV2ZW50VHlwZSAhPT0gJ2F0dHJfc2V0JyB8fFxuICAgICAgICBldmVudC5ldmVudERhdGEud3JpdGVyLnR5cGUgIT09ICd3b3JrZmxvdycgfHxcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoZXZlbnQuZXZlbnREYXRhLmNoYW5nZXMpICE9PSBKU09OLnN0cmluZ2lmeShjaGFuZ2VzKSB8fFxuICAgICAgICAoZXZlbnQuZXZlbnREYXRhLmFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzID09PSB0cnVlKSAhPT1cbiAgICAgICAgICAob3B0aW9ucy5hbGxvd1Jlc2VydmVkQXR0cmlidXRlcyA9PT0gdHJ1ZSlcbiAgICAgICkge1xuICAgICAgICBjdHgucHJvbWlzZVF1ZXVlID0gY3R4LnByb21pc2VRdWV1ZS50aGVuKCgpID0+IHtcbiAgICAgICAgICBjdHgub25Xb3JrZmxvd0Vycm9yKFxuICAgICAgICAgICAgbmV3IFJlcGxheURpdmVyZ2VuY2VFcnJvcihcbiAgICAgICAgICAgICAgYFJlcGxheSBkaXZlcmdlbmNlOiBVbmV4cGVjdGVkIGF0dHJpYnV0ZSBldmVudCBmb3IgJHtjb3JyZWxhdGlvbklkfWAsXG4gICAgICAgICAgICAgIHsgZXZlbnRJZDogZXZlbnQuZXZlbnRJZCB9XG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0LkZpbmlzaGVkO1xuICAgICAgfVxuXG4gICAgICBjdHguaW52b2NhdGlvbnNRdWV1ZS5kZWxldGUoY29ycmVsYXRpb25JZCk7XG4gICAgICBjdHgucHJvbWlzZVF1ZXVlID0gY3R4LnByb21pc2VRdWV1ZS50aGVuKCgpID0+IHtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5GaW5pc2hlZDtcbiAgICB9KTtcblxuICAgIHJldHVybiBwcm9taXNlO1xuICB9O1xufVxuIl19
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-hook.d.ts","sourceRoot":"","sources":["../../src/workflow/create-hook.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"create-hook.d.ts","sourceRoot":"","sources":["../../src/workflow/create-hook.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,IAAI,EACJ,WAAW,EACX,mBAAmB,EACnB,OAAO,EACP,cAAc,EACf,MAAM,mBAAmB,CAAC;AAwB3B,wBAAgB,UAAU,CAAC,CAAC,GAAG,GAAG,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,CAalE;AAED,wBAAgB,aAAa,CAC3B,OAAO,EAAE,cAAc,GAAG;IAAE,WAAW,EAAE,QAAQ,CAAA;CAAE,GAClD,OAAO,CAAC,mBAAmB,CAAC,CAAC;AAChC,wBAAgB,aAAa,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC"}
|
|
@@ -1,10 +1,32 @@
|
|
|
1
|
+
import { createWorkflowUrl } from '@workflow/utils';
|
|
2
|
+
import { aliasSerializationClass, RUN_CLASS_ID, } from '../class-serialization.js';
|
|
3
|
+
import { throwNotInWorkflowContext } from '../context-errors.js';
|
|
4
|
+
import { Run } from '../runtime/run.js';
|
|
1
5
|
import { WORKFLOW_CREATE_HOOK } from '../symbols.js';
|
|
2
6
|
import { getWorkflowMetadata } from './get-workflow-metadata.js';
|
|
7
|
+
// Alias this bundle's `Run` class in the serialization class registry
|
|
8
|
+
// under the stable id, so the host-side hook event consumer can construct
|
|
9
|
+
// the conflicting run resolved by `hook.getConflict()` via the same
|
|
10
|
+
// registry that revives serialized `Run` instances (the SWC plugin
|
|
11
|
+
// already auto-registers `Run` here, but under a path-derived id the
|
|
12
|
+
// host cannot know statically).
|
|
13
|
+
//
|
|
14
|
+
// In workflow mode this module is compiled into the workflow bundle and
|
|
15
|
+
// executes inside the VM, so `Run` here is the plugin-compiled variant
|
|
16
|
+
// whose methods are durable step proxies. No environment guard is
|
|
17
|
+
// needed: the registry is keyed per-global, so a stray host-side import
|
|
18
|
+
// of this module registers the host's `Run` on the host's registry —
|
|
19
|
+
// which is the correct class for that context.
|
|
20
|
+
//
|
|
21
|
+
// The value import of `Run` also guarantees `runtime/run.js` is included
|
|
22
|
+
// in any bundle that uses hooks, so the registry entry exists whenever
|
|
23
|
+
// `getConflict()` can resolve.
|
|
24
|
+
aliasSerializationClass(RUN_CLASS_ID, Run);
|
|
3
25
|
export function createHook(options) {
|
|
4
26
|
// Inside the workflow VM, the hook function is stored in the globalThis object behind a symbol
|
|
5
27
|
const createHookFn = globalThis[WORKFLOW_CREATE_HOOK];
|
|
6
28
|
if (!createHookFn) {
|
|
7
|
-
|
|
29
|
+
throwNotInWorkflowContext('createHook()', 'https://workflow-sdk.dev/docs/api-reference/workflow/create-hook', createHook);
|
|
8
30
|
}
|
|
9
31
|
return createHookFn(options);
|
|
10
32
|
}
|
|
@@ -19,7 +41,7 @@ export function createWebhook(options) {
|
|
|
19
41
|
}
|
|
20
42
|
const hook = createHook({ ...rest, metadata, isWebhook: true });
|
|
21
43
|
const { url } = getWorkflowMetadata();
|
|
22
|
-
hook.url =
|
|
44
|
+
hook.url = createWorkflowUrl(url, { type: 'webhook', token: hook.token });
|
|
23
45
|
return hook;
|
|
24
46
|
}
|
|
25
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
47
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLWhvb2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd29ya2Zsb3cvY3JlYXRlLWhvb2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEQsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixZQUFZLEdBQ2IsTUFBTSwyQkFBMkIsQ0FBQztBQUNuQyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQVFqRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDeEMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRWpFLHNFQUFzRTtBQUN0RSwwRUFBMEU7QUFDMUUsb0VBQW9FO0FBQ3BFLG1FQUFtRTtBQUNuRSxxRUFBcUU7QUFDckUsZ0NBQWdDO0FBQ2hDLEVBQUU7QUFDRix3RUFBd0U7QUFDeEUsdUVBQXVFO0FBQ3ZFLGtFQUFrRTtBQUNsRSx3RUFBd0U7QUFDeEUscUVBQXFFO0FBQ3JFLCtDQUErQztBQUMvQyxFQUFFO0FBQ0YseUVBQXlFO0FBQ3pFLHVFQUF1RTtBQUN2RSwrQkFBK0I7QUFDL0IsdUJBQXVCLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBRTNDLE1BQU0sVUFBVSxVQUFVLENBQVUsT0FBcUI7SUFDdkQsK0ZBQStGO0lBQy9GLE1BQU0sWUFBWSxHQUFJLFVBQWtCLENBQ3RDLG9CQUFvQixDQUNHLENBQUM7SUFDMUIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ2xCLHlCQUF5QixDQUN2QixjQUFjLEVBQ2Qsa0VBQWtFLEVBQ2xFLFVBQVUsQ0FDWCxDQUFDO0lBQ0osQ0FBQztJQUNELE9BQU8sWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQy9CLENBQUM7QUFNRCxNQUFNLFVBQVUsYUFBYSxDQUMzQixPQUF3QjtJQUV4QixNQUFNLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksRUFBRSxHQUFHLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FFckQsQ0FBQztJQUVGLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQ2IsNEtBQTRLLENBQzdLLENBQUM7SUFDSixDQUFDO0lBRUQsSUFBSSxRQUF5RCxDQUFDO0lBQzlELElBQUksT0FBTyxXQUFXLEtBQUssV0FBVyxFQUFFLENBQUM7UUFDdkMsUUFBUSxHQUFHLEVBQUUsV0FBVyxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVELE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBRTlCLENBQUM7SUFFakMsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLG1CQUFtQixFQUFFLENBQUM7SUFDdEMsSUFBSSxDQUFDLEdBQUcsR0FBRyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUUxRSxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVXb3JrZmxvd1VybCB9IGZyb20gJ0B3b3JrZmxvdy91dGlscyc7XG5pbXBvcnQge1xuICBhbGlhc1NlcmlhbGl6YXRpb25DbGFzcyxcbiAgUlVOX0NMQVNTX0lELFxufSBmcm9tICcuLi9jbGFzcy1zZXJpYWxpemF0aW9uLmpzJztcbmltcG9ydCB7IHRocm93Tm90SW5Xb3JrZmxvd0NvbnRleHQgfSBmcm9tICcuLi9jb250ZXh0LWVycm9ycy5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEhvb2ssXG4gIEhvb2tPcHRpb25zLFxuICBSZXF1ZXN0V2l0aFJlc3BvbnNlLFxuICBXZWJob29rLFxuICBXZWJob29rT3B0aW9ucyxcbn0gZnJvbSAnLi4vY3JlYXRlLWhvb2suanMnO1xuaW1wb3J0IHsgUnVuIH0gZnJvbSAnLi4vcnVudGltZS9ydW4uanMnO1xuaW1wb3J0IHsgV09SS0ZMT1dfQ1JFQVRFX0hPT0sgfSBmcm9tICcuLi9zeW1ib2xzLmpzJztcbmltcG9ydCB7IGdldFdvcmtmbG93TWV0YWRhdGEgfSBmcm9tICcuL2dldC13b3JrZmxvdy1tZXRhZGF0YS5qcyc7XG5cbi8vIEFsaWFzIHRoaXMgYnVuZGxlJ3MgYFJ1bmAgY2xhc3MgaW4gdGhlIHNlcmlhbGl6YXRpb24gY2xhc3MgcmVnaXN0cnlcbi8vIHVuZGVyIHRoZSBzdGFibGUgaWQsIHNvIHRoZSBob3N0LXNpZGUgaG9vayBldmVudCBjb25zdW1lciBjYW4gY29uc3RydWN0XG4vLyB0aGUgY29uZmxpY3RpbmcgcnVuIHJlc29sdmVkIGJ5IGBob29rLmdldENvbmZsaWN0KClgIHZpYSB0aGUgc2FtZVxuLy8gcmVnaXN0cnkgdGhhdCByZXZpdmVzIHNlcmlhbGl6ZWQgYFJ1bmAgaW5zdGFuY2VzICh0aGUgU1dDIHBsdWdpblxuLy8gYWxyZWFkeSBhdXRvLXJlZ2lzdGVycyBgUnVuYCBoZXJlLCBidXQgdW5kZXIgYSBwYXRoLWRlcml2ZWQgaWQgdGhlXG4vLyBob3N0IGNhbm5vdCBrbm93IHN0YXRpY2FsbHkpLlxuLy9cbi8vIEluIHdvcmtmbG93IG1vZGUgdGhpcyBtb2R1bGUgaXMgY29tcGlsZWQgaW50byB0aGUgd29ya2Zsb3cgYnVuZGxlIGFuZFxuLy8gZXhlY3V0ZXMgaW5zaWRlIHRoZSBWTSwgc28gYFJ1bmAgaGVyZSBpcyB0aGUgcGx1Z2luLWNvbXBpbGVkIHZhcmlhbnRcbi8vIHdob3NlIG1ldGhvZHMgYXJlIGR1cmFibGUgc3RlcCBwcm94aWVzLiBObyBlbnZpcm9ubWVudCBndWFyZCBpc1xuLy8gbmVlZGVkOiB0aGUgcmVnaXN0cnkgaXMga2V5ZWQgcGVyLWdsb2JhbCwgc28gYSBzdHJheSBob3N0LXNpZGUgaW1wb3J0XG4vLyBvZiB0aGlzIG1vZHVsZSByZWdpc3RlcnMgdGhlIGhvc3QncyBgUnVuYCBvbiB0aGUgaG9zdCdzIHJlZ2lzdHJ5IOKAlFxuLy8gd2hpY2ggaXMgdGhlIGNvcnJlY3QgY2xhc3MgZm9yIHRoYXQgY29udGV4dC5cbi8vXG4vLyBUaGUgdmFsdWUgaW1wb3J0IG9mIGBSdW5gIGFsc28gZ3VhcmFudGVlcyBgcnVudGltZS9ydW4uanNgIGlzIGluY2x1ZGVkXG4vLyBpbiBhbnkgYnVuZGxlIHRoYXQgdXNlcyBob29rcywgc28gdGhlIHJlZ2lzdHJ5IGVudHJ5IGV4aXN0cyB3aGVuZXZlclxuLy8gYGdldENvbmZsaWN0KClgIGNhbiByZXNvbHZlLlxuYWxpYXNTZXJpYWxpemF0aW9uQ2xhc3MoUlVOX0NMQVNTX0lELCBSdW4pO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSG9vazxUID0gYW55PihvcHRpb25zPzogSG9va09wdGlvbnMpOiBIb29rPFQ+IHtcbiAgLy8gSW5zaWRlIHRoZSB3b3JrZmxvdyBWTSwgdGhlIGhvb2sgZnVuY3Rpb24gaXMgc3RvcmVkIGluIHRoZSBnbG9iYWxUaGlzIG9iamVjdCBiZWhpbmQgYSBzeW1ib2xcbiAgY29uc3QgY3JlYXRlSG9va0ZuID0gKGdsb2JhbFRoaXMgYXMgYW55KVtcbiAgICBXT1JLRkxPV19DUkVBVEVfSE9PS1xuICBdIGFzIHR5cGVvZiBjcmVhdGVIb29rPFQ+O1xuICBpZiAoIWNyZWF0ZUhvb2tGbikge1xuICAgIHRocm93Tm90SW5Xb3JrZmxvd0NvbnRleHQoXG4gICAgICAnY3JlYXRlSG9vaygpJyxcbiAgICAgICdodHRwczovL3dvcmtmbG93LXNkay5kZXYvZG9jcy9hcGktcmVmZXJlbmNlL3dvcmtmbG93L2NyZWF0ZS1ob29rJyxcbiAgICAgIGNyZWF0ZUhvb2tcbiAgICApO1xuICB9XG4gIHJldHVybiBjcmVhdGVIb29rRm4ob3B0aW9ucyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVXZWJob29rKFxuICBvcHRpb25zOiBXZWJob29rT3B0aW9ucyAmIHsgcmVzcG9uZFdpdGg6ICdtYW51YWwnIH1cbik6IFdlYmhvb2s8UmVxdWVzdFdpdGhSZXNwb25zZT47XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlV2ViaG9vayhvcHRpb25zPzogV2ViaG9va09wdGlvbnMpOiBXZWJob29rPFJlcXVlc3Q+O1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVdlYmhvb2soXG4gIG9wdGlvbnM/OiBXZWJob29rT3B0aW9uc1xuKTogV2ViaG9vazxSZXF1ZXN0PiB8IFdlYmhvb2s8UmVxdWVzdFdpdGhSZXNwb25zZT4ge1xuICBjb25zdCB7IHJlc3BvbmRXaXRoLCB0b2tlbiwgLi4ucmVzdCB9ID0gKG9wdGlvbnMgPz8ge30pIGFzIFdlYmhvb2tPcHRpb25zICYge1xuICAgIHRva2VuPzogc3RyaW5nO1xuICB9O1xuXG4gIGlmICh0b2tlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ2BjcmVhdGVXZWJob29rKClgIGRvZXMgbm90IGFjY2VwdCBhIGB0b2tlbmAgb3B0aW9uLiBXZWJob29rIHRva2VucyBhcmUgYWx3YXlzIHJhbmRvbWx5IGdlbmVyYXRlZC4gVXNlIGBjcmVhdGVIb29rKClgIHdpdGggYHJlc3VtZUhvb2soKWAgZm9yIGRldGVybWluaXN0aWMgdG9rZW4gcGF0dGVybnMuJ1xuICAgICk7XG4gIH1cblxuICBsZXQgbWV0YWRhdGE6IFBpY2s8V2ViaG9va09wdGlvbnMsICdyZXNwb25kV2l0aCc+IHwgdW5kZWZpbmVkO1xuICBpZiAodHlwZW9mIHJlc3BvbmRXaXRoICE9PSAndW5kZWZpbmVkJykge1xuICAgIG1ldGFkYXRhID0geyByZXNwb25kV2l0aCB9O1xuICB9XG5cbiAgY29uc3QgaG9vayA9IGNyZWF0ZUhvb2soeyAuLi5yZXN0LCBtZXRhZGF0YSwgaXNXZWJob29rOiB0cnVlIH0pIGFzXG4gICAgfCBXZWJob29rPFJlcXVlc3Q+XG4gICAgfCBXZWJob29rPFJlcXVlc3RXaXRoUmVzcG9uc2U+O1xuXG4gIGNvbnN0IHsgdXJsIH0gPSBnZXRXb3JrZmxvd01ldGFkYXRhKCk7XG4gIGhvb2sudXJsID0gY3JlYXRlV29ya2Zsb3dVcmwodXJsLCB7IHR5cGU6ICd3ZWJob29rJywgdG9rZW46IGhvb2sudG9rZW4gfSk7XG5cbiAgcmV0dXJuIGhvb2s7XG59XG4iXX0=
|
|
@@ -5,6 +5,6 @@ import type { Hook, HookOptions } from '../create-hook.js';
|
|
|
5
5
|
*/
|
|
6
6
|
export declare function defineHook<TInput, TOutput = TInput>(): {
|
|
7
7
|
create(options?: HookOptions): Hook<TOutput>;
|
|
8
|
-
resume(_token: string, _payload: TInput)
|
|
8
|
+
resume: (_token: string, _payload: TInput) => Promise<HookEntity | null>;
|
|
9
9
|
};
|
|
10
10
|
//# sourceMappingURL=define-hook.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"define-hook.d.ts","sourceRoot":"","sources":["../../src/workflow/define-hook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,IAAI,UAAU,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"define-hook.d.ts","sourceRoot":"","sources":["../../src/workflow/define-hook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,IAAI,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE1D,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAG3D;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM;qBAe9B,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC;qBAbpC,MAAM,YACJ,MAAM,KACf,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;EAgB9B"}
|
|
@@ -1,15 +1,19 @@
|
|
|
1
|
+
import { throwUnavailableInWorkflowContext } from '../context-errors.js';
|
|
1
2
|
import { createHook } from './create-hook.js';
|
|
2
3
|
/**
|
|
3
4
|
* NOTE: This is the implementation of `defineHook()` that is used in workflow contexts.
|
|
4
5
|
*/
|
|
5
6
|
export function defineHook() {
|
|
7
|
+
function resume(_token, _payload) {
|
|
8
|
+
// Referenced by name (not `this.resume`) so the stack strip works even
|
|
9
|
+
// if the caller destructured the hook.
|
|
10
|
+
throwUnavailableInWorkflowContext('defineHook().resume()', 'https://workflow-sdk.dev/docs/api-reference/workflow-api/resume-hook', resume);
|
|
11
|
+
}
|
|
6
12
|
return {
|
|
7
13
|
create(options) {
|
|
8
14
|
return createHook(options);
|
|
9
15
|
},
|
|
10
|
-
resume
|
|
11
|
-
throw new Error('`defineHook().resume()` can only be called from external contexts (e.g. API routes).');
|
|
12
|
-
},
|
|
16
|
+
resume,
|
|
13
17
|
};
|
|
14
18
|
}
|
|
15
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmaW5lLWhvb2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd29ya2Zsb3cvZGVmaW5lLWhvb2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFekUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRTlDOztHQUVHO0FBQ0gsTUFBTSxVQUFVLFVBQVU7SUFDeEIsU0FBUyxNQUFNLENBQ2IsTUFBYyxFQUNkLFFBQWdCO1FBRWhCLHVFQUF1RTtRQUN2RSx1Q0FBdUM7UUFDdkMsaUNBQWlDLENBQy9CLHVCQUF1QixFQUN2QixzRUFBc0UsRUFDdEUsTUFBTSxDQUNQLENBQUM7SUFDSixDQUFDO0lBRUQsT0FBTztRQUNMLE1BQU0sQ0FBQyxPQUFxQjtZQUMxQixPQUFPLFVBQVUsQ0FBVSxPQUFPLENBQUMsQ0FBQztRQUN0QyxDQUFDO1FBQ0QsTUFBTTtLQUNQLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBIb29rIGFzIEhvb2tFbnRpdHkgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgdGhyb3dVbmF2YWlsYWJsZUluV29ya2Zsb3dDb250ZXh0IH0gZnJvbSAnLi4vY29udGV4dC1lcnJvcnMuanMnO1xuaW1wb3J0IHR5cGUgeyBIb29rLCBIb29rT3B0aW9ucyB9IGZyb20gJy4uL2NyZWF0ZS1ob29rLmpzJztcbmltcG9ydCB7IGNyZWF0ZUhvb2sgfSBmcm9tICcuL2NyZWF0ZS1ob29rLmpzJztcblxuLyoqXG4gKiBOT1RFOiBUaGlzIGlzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBgZGVmaW5lSG9vaygpYCB0aGF0IGlzIHVzZWQgaW4gd29ya2Zsb3cgY29udGV4dHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVIb29rPFRJbnB1dCwgVE91dHB1dCA9IFRJbnB1dD4oKSB7XG4gIGZ1bmN0aW9uIHJlc3VtZShcbiAgICBfdG9rZW46IHN0cmluZyxcbiAgICBfcGF5bG9hZDogVElucHV0XG4gICk6IFByb21pc2U8SG9va0VudGl0eSB8IG51bGw+IHtcbiAgICAvLyBSZWZlcmVuY2VkIGJ5IG5hbWUgKG5vdCBgdGhpcy5yZXN1bWVgKSBzbyB0aGUgc3RhY2sgc3RyaXAgd29ya3MgZXZlblxuICAgIC8vIGlmIHRoZSBjYWxsZXIgZGVzdHJ1Y3R1cmVkIHRoZSBob29rLlxuICAgIHRocm93VW5hdmFpbGFibGVJbldvcmtmbG93Q29udGV4dChcbiAgICAgICdkZWZpbmVIb29rKCkucmVzdW1lKCknLFxuICAgICAgJ2h0dHBzOi8vd29ya2Zsb3ctc2RrLmRldi9kb2NzL2FwaS1yZWZlcmVuY2Uvd29ya2Zsb3ctYXBpL3Jlc3VtZS1ob29rJyxcbiAgICAgIHJlc3VtZVxuICAgICk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGNyZWF0ZShvcHRpb25zPzogSG9va09wdGlvbnMpOiBIb29rPFRPdXRwdXQ+IHtcbiAgICAgIHJldHVybiBjcmVhdGVIb29rPFRPdXRwdXQ+KG9wdGlvbnMpO1xuICAgIH0sXG4gICAgcmVzdW1lLFxuICB9O1xufVxuIl19
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-workflow-metadata.d.ts","sourceRoot":"","sources":["../../src/workflow/get-workflow-metadata.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"get-workflow-metadata.d.ts","sourceRoot":"","sources":["../../src/workflow/get-workflow-metadata.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,YAAY,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,aAAa,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,iBAAiB,EAAE,IAAI,CAAC;IAExB;;OAEG;IACH,GAAG,EAAE,MAAM,CAAC;IAEZ;;OAEG;IACH,QAAQ,EAAE;QACR;;;;WAIG;QACH,UAAU,EAAE,OAAO,CAAC;KACrB,CAAC;CACH;AAED,eAAO,MAAM,uBAAuB,eACY,CAAC;AAEjD,wBAAgB,mBAAmB,IAAI,gBAAgB,CAmBtD"}
|
|
@@ -1,11 +1,22 @@
|
|
|
1
|
+
import { redirectStackToCaller } from '../capture-stack.js';
|
|
2
|
+
import { NotInWorkflowOrStepContextError } from '../context-violation-error.js';
|
|
1
3
|
export const WORKFLOW_CONTEXT_SYMBOL =
|
|
2
4
|
/* @__PURE__ */ Symbol.for('WORKFLOW_CONTEXT');
|
|
3
5
|
export function getWorkflowMetadata() {
|
|
4
|
-
// Inside the workflow VM, the context is stored in the globalThis object
|
|
6
|
+
// Inside the workflow VM, the context is stored in the globalThis object
|
|
7
|
+
// behind a symbol.
|
|
5
8
|
const ctx = globalThis[WORKFLOW_CONTEXT_SYMBOL];
|
|
6
9
|
if (!ctx) {
|
|
7
|
-
|
|
10
|
+
// Use the shared `NotInWorkflowOrStepContextError` — it lives in
|
|
11
|
+
// `context-violation-error.ts` specifically so this file can throw it
|
|
12
|
+
// without creating a module-init cycle (the full `context-errors.ts`
|
|
13
|
+
// depends on this file's `WORKFLOW_CONTEXT_SYMBOL`).
|
|
14
|
+
const err = new NotInWorkflowOrStepContextError('getWorkflowMetadata()', 'https://workflow-sdk.dev/docs/api-reference/workflow/get-workflow-metadata');
|
|
15
|
+
// Redirect the stack to the caller so terminal overlays (Next.js,
|
|
16
|
+
// Turbopack, VS Code) point at the user's code rather than this frame.
|
|
17
|
+
redirectStackToCaller(err, getWorkflowMetadata);
|
|
18
|
+
throw err;
|
|
8
19
|
}
|
|
9
20
|
return ctx;
|
|
10
21
|
}
|
|
11
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LXdvcmtmbG93LW1ldGFkYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3dvcmtmbG93L2dldC13b3JrZmxvdy1tZXRhZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQW9DaEYsTUFBTSxDQUFDLE1BQU0sdUJBQXVCO0FBQ2xDLGVBQWUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFFakQsTUFBTSxVQUFVLG1CQUFtQjtJQUNqQyx5RUFBeUU7SUFDekUsbUJBQW1CO0lBQ25CLE1BQU0sR0FBRyxHQUFJLFVBQWtCLENBQUMsdUJBQXVCLENBQXFCLENBQUM7SUFDN0UsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ1QsaUVBQWlFO1FBQ2pFLHNFQUFzRTtRQUN0RSxxRUFBcUU7UUFDckUscURBQXFEO1FBQ3JELE1BQU0sR0FBRyxHQUFHLElBQUksK0JBQStCLENBQzdDLHVCQUF1QixFQUN2Qiw0RUFBNEUsQ0FDN0UsQ0FBQztRQUNGLGtFQUFrRTtRQUNsRSx1RUFBdUU7UUFDdkUscUJBQXFCLENBQUMsR0FBRyxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFDaEQsTUFBTSxHQUFHLENBQUM7SUFDWixDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmVkaXJlY3RTdGFja1RvQ2FsbGVyIH0gZnJvbSAnLi4vY2FwdHVyZS1zdGFjay5qcyc7XG5pbXBvcnQgeyBOb3RJbldvcmtmbG93T3JTdGVwQ29udGV4dEVycm9yIH0gZnJvbSAnLi4vY29udGV4dC12aW9sYXRpb24tZXJyb3IuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93TWV0YWRhdGEge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHdvcmtmbG93LlxuICAgKi9cbiAgd29ya2Zsb3dOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgd29ya2Zsb3cgcnVuLlxuICAgKi9cbiAgd29ya2Zsb3dSdW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaW1lc3RhbXAgd2hlbiB0aGUgd29ya2Zsb3cgcnVuIHN0YXJ0ZWQuXG4gICAqL1xuICB3b3JrZmxvd1N0YXJ0ZWRBdDogRGF0ZTtcblxuICAvKipcbiAgICogVGhlIFVSTCB3aGVyZSB0aGUgd29ya2Zsb3cgY2FuIGJlIHRyaWdnZXJlZC5cbiAgICovXG4gIHVybDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBGZWF0dXJlIGZsYWdzIGluZGljYXRpbmcgd2hpY2ggY2FwYWJpbGl0aWVzIGFyZSBhY3RpdmUgZm9yIHRoaXMgd29ya2Zsb3cgcnVuLlxuICAgKi9cbiAgZmVhdHVyZXM6IHtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIGVuY3J5cHRpb24gaXMgZW5hYmxlZCBmb3IgdGhpcyB3b3JrZmxvdyBydW4uXG4gICAgICogV2hlbiBgdHJ1ZWAsIHN0ZXAgaW5wdXRzLCBvdXRwdXRzLCBhbmQgb3RoZXIgc2VyaWFsaXplZCBkYXRhXG4gICAgICogYXJlIGVuY3J5cHRlZCBhdCByZXN0LlxuICAgICAqL1xuICAgIGVuY3J5cHRpb246IGJvb2xlYW47XG4gIH07XG59XG5cbmV4cG9ydCBjb25zdCBXT1JLRkxPV19DT05URVhUX1NZTUJPTCA9XG4gIC8qIEBfX1BVUkVfXyAqLyBTeW1ib2wuZm9yKCdXT1JLRkxPV19DT05URVhUJyk7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRXb3JrZmxvd01ldGFkYXRhKCk6IFdvcmtmbG93TWV0YWRhdGEge1xuICAvLyBJbnNpZGUgdGhlIHdvcmtmbG93IFZNLCB0aGUgY29udGV4dCBpcyBzdG9yZWQgaW4gdGhlIGdsb2JhbFRoaXMgb2JqZWN0XG4gIC8vIGJlaGluZCBhIHN5bWJvbC5cbiAgY29uc3QgY3R4ID0gKGdsb2JhbFRoaXMgYXMgYW55KVtXT1JLRkxPV19DT05URVhUX1NZTUJPTF0gYXMgV29ya2Zsb3dNZXRhZGF0YTtcbiAgaWYgKCFjdHgpIHtcbiAgICAvLyBVc2UgdGhlIHNoYXJlZCBgTm90SW5Xb3JrZmxvd09yU3RlcENvbnRleHRFcnJvcmAg4oCUIGl0IGxpdmVzIGluXG4gICAgLy8gYGNvbnRleHQtdmlvbGF0aW9uLWVycm9yLnRzYCBzcGVjaWZpY2FsbHkgc28gdGhpcyBmaWxlIGNhbiB0aHJvdyBpdFxuICAgIC8vIHdpdGhvdXQgY3JlYXRpbmcgYSBtb2R1bGUtaW5pdCBjeWNsZSAodGhlIGZ1bGwgYGNvbnRleHQtZXJyb3JzLnRzYFxuICAgIC8vIGRlcGVuZHMgb24gdGhpcyBmaWxlJ3MgYFdPUktGTE9XX0NPTlRFWFRfU1lNQk9MYCkuXG4gICAgY29uc3QgZXJyID0gbmV3IE5vdEluV29ya2Zsb3dPclN0ZXBDb250ZXh0RXJyb3IoXG4gICAgICAnZ2V0V29ya2Zsb3dNZXRhZGF0YSgpJyxcbiAgICAgICdodHRwczovL3dvcmtmbG93LXNkay5kZXYvZG9jcy9hcGktcmVmZXJlbmNlL3dvcmtmbG93L2dldC13b3JrZmxvdy1tZXRhZGF0YSdcbiAgICApO1xuICAgIC8vIFJlZGlyZWN0IHRoZSBzdGFjayB0byB0aGUgY2FsbGVyIHNvIHRlcm1pbmFsIG92ZXJsYXlzIChOZXh0LmpzLFxuICAgIC8vIFR1cmJvcGFjaywgVlMgQ29kZSkgcG9pbnQgYXQgdGhlIHVzZXIncyBjb2RlIHJhdGhlciB0aGFuIHRoaXMgZnJhbWUuXG4gICAgcmVkaXJlY3RTdGFja1RvQ2FsbGVyKGVyciwgZ2V0V29ya2Zsb3dNZXRhZGF0YSk7XG4gICAgdGhyb3cgZXJyO1xuICB9XG4gIHJldHVybiBjdHg7XG59XG4iXX0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hook.d.ts","sourceRoot":"","sources":["../../src/workflow/hook.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAI3D,OAAO,
|
|
1
|
+
{"version":3,"file":"hook.d.ts","sourceRoot":"","sources":["../../src/workflow/hook.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAI3D,OAAO,EAIL,KAAK,2BAA2B,EACjC,MAAM,eAAe,CAAC;AA6CvB,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,2BAA2B,IAChC,CAAC,GAAG,GAAG,EAAE,UAAS,WAAgB,KAAG,IAAI,CAAC,CAAC,CAAC,CA8b5E"}
|