@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
package/dist/workflow/hook.js
CHANGED
|
@@ -1,12 +1,54 @@
|
|
|
1
|
-
import { HookConflictError,
|
|
1
|
+
import { HookConflictError, ReplayDivergenceError } from '@workflow/errors';
|
|
2
2
|
import { withResolvers } from '@workflow/utils';
|
|
3
3
|
import { EventConsumerResult } from '../events-consumer.js';
|
|
4
4
|
import { WorkflowSuspension } from '../global.js';
|
|
5
5
|
import { webhookLogger } from '../logger.js';
|
|
6
|
-
import { scheduleWhenIdle, } from '../private.js';
|
|
6
|
+
import { awaitEarlierDeliveries, registerDeliveryBarrier, scheduleWhenIdle, } from '../private.js';
|
|
7
|
+
import { WORKFLOW_DESERIALIZE } from '@workflow/serde';
|
|
8
|
+
import { getSerializationClass, RUN_CLASS_ID } from '../class-serialization.js';
|
|
7
9
|
import { hydrateStepReturnValue } from '../serialization.js';
|
|
10
|
+
/**
|
|
11
|
+
* Constructs a `Run` handle for the run that owns a conflicting hook
|
|
12
|
+
* token, for resolution through `hook.getConflict()`.
|
|
13
|
+
*
|
|
14
|
+
* The instance is created through the serialization class registry on
|
|
15
|
+
* the VM's globalThis — the same channel that revives serialized `Run`
|
|
16
|
+
* instances (e.g. `start()` return values crossing from a step into the
|
|
17
|
+
* workflow). The registered class is the VM bundle's plugin-compiled
|
|
18
|
+
* `Run`, whose methods are durable step proxies — safe to call from
|
|
19
|
+
* workflow code — and construction goes through its
|
|
20
|
+
* `WORKFLOW_DESERIALIZE` hook, exactly as the `Instance` reviver would.
|
|
21
|
+
*
|
|
22
|
+
* Returns `null` when a real `Run` cannot be constructed: the conflict
|
|
23
|
+
* event lacks `conflictingRunId` (written by an old world), or the VM's
|
|
24
|
+
* registry has no `Run` (a context that never evaluated the
|
|
25
|
+
* workflow-mode `create-hook` module, which aliases it under
|
|
26
|
+
* `RUN_CLASS_ID`). `getConflict` awaiters then reject with
|
|
27
|
+
* `HookConflictError` instead of resolving with a value that doesn't
|
|
28
|
+
* honor the `Run` contract.
|
|
29
|
+
*/
|
|
30
|
+
function createConflictingRun(ctx, conflictingRunId) {
|
|
31
|
+
if (typeof conflictingRunId !== 'string') {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
const RunClass = getSerializationClass(RUN_CLASS_ID, ctx.globalThis);
|
|
35
|
+
const deserialize = RunClass?.[WORKFLOW_DESERIALIZE];
|
|
36
|
+
if (typeof deserialize !== 'function') {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
return deserialize.call(RunClass, { runId: conflictingRunId });
|
|
40
|
+
}
|
|
8
41
|
export function createCreateHook(ctx) {
|
|
9
42
|
return function createHookImpl(options = {}) {
|
|
43
|
+
// Reject an explicit empty-string token. A token must either be omitted
|
|
44
|
+
// (or `undefined`/`null`) to get a randomly generated one, or be an
|
|
45
|
+
// explicit non-empty string. An empty string is almost always an
|
|
46
|
+
// accidental value (e.g. an unset variable) and would otherwise slip
|
|
47
|
+
// through the `??` below — which only falls back for nullish values — and
|
|
48
|
+
// be used as a meaningless, non-deterministic token.
|
|
49
|
+
if (options.token === '') {
|
|
50
|
+
throw new Error('`createHook()` was called with an empty string token. Pass a non-empty token, or omit the `token` option to use a randomly generated one.');
|
|
51
|
+
}
|
|
10
52
|
// Generate hook ID and token
|
|
11
53
|
const correlationId = `hook_${ctx.generateUlid()}`;
|
|
12
54
|
const token = options.token ?? ctx.generateNanoid();
|
|
@@ -19,16 +61,29 @@ export function createCreateHook(ctx) {
|
|
|
19
61
|
metadata: options.metadata,
|
|
20
62
|
isWebhook,
|
|
21
63
|
});
|
|
22
|
-
// Queue of hook
|
|
64
|
+
// Queue of buffered hook payloads (received before the workflow awaited
|
|
65
|
+
// the hook). Each entry's `claim()` builds the consumer-facing promise
|
|
66
|
+
// from the captured hydration outcome and orders it deterministically by
|
|
67
|
+
// event-log position against any concurrent branch-deciding resolution
|
|
68
|
+
// (see `ctx.pendingDeliveryBarriers`).
|
|
23
69
|
const payloadsQueue = [];
|
|
24
70
|
// Queue of promises that resolve to the next hook payload
|
|
25
71
|
const promises = [];
|
|
72
|
+
// Queue of promises that resolve once hook registration is confirmed
|
|
73
|
+
// (with `null`) or a token conflict is detected (with the conflicting
|
|
74
|
+
// `Run`). These back the `hook.getConflict()` getter.
|
|
75
|
+
const getConflictPromises = [];
|
|
26
76
|
let eventLogEmpty = false;
|
|
77
|
+
// Track if the event log confirms hook creation happened
|
|
78
|
+
let hasCreated = false;
|
|
27
79
|
// Track if the event log confirms disposal happened (replay no-op)
|
|
28
80
|
let hasDisposedEvent = false;
|
|
29
81
|
// Track if we have a conflict so we can reject future awaits
|
|
30
82
|
let hasConflict = false;
|
|
31
83
|
let conflictErrorRef = null;
|
|
84
|
+
// The conflicting run handle, shared by every `getConflict` await so
|
|
85
|
+
// repeated awaits observe the same instance deterministically.
|
|
86
|
+
let conflictRunRef = null;
|
|
32
87
|
webhookLogger.debug('Hook consumer setup', { correlationId, token });
|
|
33
88
|
ctx.eventsConsumer.subscribe((event) => {
|
|
34
89
|
// If there are no events and there are promises waiting,
|
|
@@ -36,7 +91,8 @@ export function createCreateHook(ctx) {
|
|
|
36
91
|
// In this case, the workflow should be suspended until the hook is resumed.
|
|
37
92
|
if (!event) {
|
|
38
93
|
eventLogEmpty = true;
|
|
39
|
-
if (promises.length > 0 && payloadsQueue.length === 0)
|
|
94
|
+
if ((promises.length > 0 && payloadsQueue.length === 0) ||
|
|
95
|
+
(getConflictPromises.length > 0 && !hasCreated && !hasConflict)) {
|
|
40
96
|
scheduleWhenIdle(ctx, () => {
|
|
41
97
|
ctx.onWorkflowError(new WorkflowSuspension(ctx.invocationsQueue, ctx.globalThis));
|
|
42
98
|
});
|
|
@@ -47,12 +103,29 @@ export function createCreateHook(ctx) {
|
|
|
47
103
|
// We're not interested in this event - the correlationId belongs to a different entity
|
|
48
104
|
return EventConsumerResult.NotConsumed;
|
|
49
105
|
}
|
|
106
|
+
const eventToken = 'eventData' in event && event.eventData && 'token' in event.eventData
|
|
107
|
+
? event.eventData.token
|
|
108
|
+
: undefined;
|
|
109
|
+
if (typeof eventToken === 'string' && eventToken !== token) {
|
|
110
|
+
ctx.promiseQueue = ctx.promiseQueue.then(() => {
|
|
111
|
+
ctx.onWorkflowError(new ReplayDivergenceError(`Replay divergence: hook event ${event.eventType} for ${correlationId} belongs to token "${eventToken}", but the current hook consumer expects "${token}"`, { eventId: event.eventId }));
|
|
112
|
+
});
|
|
113
|
+
return EventConsumerResult.Finished;
|
|
114
|
+
}
|
|
50
115
|
// Check for hook_created event to mark this hook as already created
|
|
51
116
|
if (event.eventType === 'hook_created') {
|
|
52
117
|
const queueItem = ctx.invocationsQueue.get(correlationId);
|
|
53
118
|
if (queueItem && queueItem.type === 'hook') {
|
|
54
119
|
queueItem.hasCreatedEvent = true;
|
|
55
120
|
}
|
|
121
|
+
hasCreated = true;
|
|
122
|
+
const pendingGetConflictPromises = getConflictPromises.slice();
|
|
123
|
+
getConflictPromises.length = 0;
|
|
124
|
+
ctx.promiseQueue = ctx.promiseQueue.then(() => {
|
|
125
|
+
for (const resolver of pendingGetConflictPromises) {
|
|
126
|
+
resolver.resolve(null);
|
|
127
|
+
}
|
|
128
|
+
});
|
|
56
129
|
return EventConsumerResult.Consumed;
|
|
57
130
|
}
|
|
58
131
|
// Handle hook_conflict event - another workflow is using this token
|
|
@@ -62,46 +135,117 @@ export function createCreateHook(ctx) {
|
|
|
62
135
|
// Store the conflict event so we can reject any awaited promises.
|
|
63
136
|
// Chain through promiseQueue to ensure deterministic ordering.
|
|
64
137
|
const conflictEvent = event;
|
|
65
|
-
const conflictError = new HookConflictError(conflictEvent.eventData.token);
|
|
138
|
+
const conflictError = new HookConflictError(conflictEvent.eventData.token, conflictEvent.eventData.conflictingRunId);
|
|
66
139
|
// Mark that we have a conflict so future awaits also reject
|
|
67
140
|
hasConflict = true;
|
|
68
141
|
conflictErrorRef = conflictError;
|
|
142
|
+
conflictRunRef = createConflictingRun(ctx, conflictEvent.eventData.conflictingRunId);
|
|
69
143
|
// Capture and drain pending promises synchronously so the null event
|
|
70
144
|
// handler won't see them and trigger a spurious WorkflowSuspension.
|
|
71
|
-
// The actual
|
|
145
|
+
// The actual settlements are deferred through promiseQueue for
|
|
146
|
+
// ordering. Payload awaiters reject with HookConflictError, while
|
|
147
|
+
// `getConflict` awaiters resolve with the conflicting run so the
|
|
148
|
+
// workflow can branch on the conflict without throwing. When no
|
|
149
|
+
// real `Run` can be constructed (see `createConflictingRun`),
|
|
150
|
+
// `getConflict` awaiters reject with the HookConflictError instead
|
|
151
|
+
// of resolving with a value that doesn't honor the `Run` contract.
|
|
72
152
|
const pendingPromises = promises.slice();
|
|
73
153
|
promises.length = 0;
|
|
154
|
+
const pendingGetConflictPromises = getConflictPromises.slice();
|
|
155
|
+
getConflictPromises.length = 0;
|
|
74
156
|
ctx.promiseQueue = ctx.promiseQueue.then(() => {
|
|
75
157
|
for (const resolver of pendingPromises) {
|
|
76
158
|
resolver.reject(conflictError);
|
|
77
159
|
}
|
|
160
|
+
for (const resolver of pendingGetConflictPromises) {
|
|
161
|
+
if (conflictRunRef) {
|
|
162
|
+
resolver.resolve(conflictRunRef);
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
resolver.reject(conflictError);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
78
168
|
});
|
|
79
169
|
return EventConsumerResult.Consumed;
|
|
80
170
|
}
|
|
81
171
|
if (event.eventType === 'hook_received') {
|
|
172
|
+
// Register a 'hook' delivery barrier at this event's log index so a
|
|
173
|
+
// later-in-log `wait_completed` is delivered only after this hook,
|
|
174
|
+
// and so this hook is delivered only after every earlier-in-log
|
|
175
|
+
// `wait_completed` — keeping any `Promise.race` against a wait
|
|
176
|
+
// deterministic and aligned with the committed event log, regardless
|
|
177
|
+
// of microtask-hop count, hydration time, or race-argument order.
|
|
178
|
+
// See `ctx.pendingDeliveryBarriers`.
|
|
179
|
+
const eventIndex = ctx.eventsConsumer.eventIndex;
|
|
180
|
+
const barrier = registerDeliveryBarrier(ctx, eventIndex, 'hook');
|
|
82
181
|
if (promises.length > 0) {
|
|
83
182
|
const next = promises.shift();
|
|
84
183
|
if (next) {
|
|
85
|
-
//
|
|
86
|
-
//
|
|
87
|
-
//
|
|
184
|
+
// A consumer is already awaiting. Hydrate through a promiseQueue
|
|
185
|
+
// slot (so async deserialization stays in event-log order), then
|
|
186
|
+
// defer behind earlier waits before resolving. The deferral runs
|
|
187
|
+
// OFF the serial queue (it may wait on an earlier wait delivery
|
|
188
|
+
// and blocking a queue slot on that would deadlock the queue).
|
|
88
189
|
ctx.pendingDeliveries++;
|
|
190
|
+
let hydrateOutcome;
|
|
89
191
|
ctx.promiseQueue = ctx.promiseQueue.then(async () => {
|
|
90
192
|
try {
|
|
91
193
|
const payload = await hydrateStepReturnValue(event.eventData.payload, ctx.runId, ctx.encryptionKey, ctx.globalThis);
|
|
92
|
-
|
|
194
|
+
hydrateOutcome = { ok: true, value: payload };
|
|
93
195
|
}
|
|
94
196
|
catch (error) {
|
|
95
|
-
|
|
197
|
+
hydrateOutcome = { ok: false, error };
|
|
96
198
|
}
|
|
97
199
|
finally {
|
|
98
200
|
ctx.pendingDeliveries--;
|
|
99
201
|
}
|
|
202
|
+
void awaitEarlierDeliveries(ctx, eventIndex, ['wait']).then(() => {
|
|
203
|
+
barrier.markDelivered();
|
|
204
|
+
if (hydrateOutcome.ok) {
|
|
205
|
+
next.resolve(hydrateOutcome.value);
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
next.reject(hydrateOutcome.error);
|
|
209
|
+
}
|
|
210
|
+
});
|
|
100
211
|
});
|
|
101
212
|
}
|
|
102
213
|
}
|
|
103
214
|
else {
|
|
104
|
-
|
|
215
|
+
// No consumer is awaiting yet. Hydrate through a promiseQueue slot
|
|
216
|
+
// at this log position and park the OUTCOME (value or error) for a
|
|
217
|
+
// later `iterator.next()` / `await hook` claim. We capture the
|
|
218
|
+
// outcome rather than eagerly resolving/rejecting a promise no
|
|
219
|
+
// consumer has attached to — a rejected unclaimed promise (e.g. a
|
|
220
|
+
// buffered encrypted payload with no key) would otherwise surface
|
|
221
|
+
// as an unhandled rejection and crash the process. `claim()` builds
|
|
222
|
+
// the consumer-facing promise on demand.
|
|
223
|
+
let outcome;
|
|
224
|
+
const hydrated = withResolvers();
|
|
225
|
+
const claim = () => hydrated.promise
|
|
226
|
+
.then(() => awaitEarlierDeliveries(ctx, eventIndex, ['wait']))
|
|
227
|
+
.then(() => {
|
|
228
|
+
barrier.markDelivered();
|
|
229
|
+
if (outcome && !outcome.ok) {
|
|
230
|
+
throw outcome.error;
|
|
231
|
+
}
|
|
232
|
+
return outcome.value;
|
|
233
|
+
});
|
|
234
|
+
ctx.pendingDeliveries++;
|
|
235
|
+
ctx.promiseQueue = ctx.promiseQueue.then(async () => {
|
|
236
|
+
try {
|
|
237
|
+
const payload = await hydrateStepReturnValue(event.eventData.payload, ctx.runId, ctx.encryptionKey, ctx.globalThis);
|
|
238
|
+
outcome = { ok: true, value: payload };
|
|
239
|
+
}
|
|
240
|
+
catch (error) {
|
|
241
|
+
outcome = { ok: false, error };
|
|
242
|
+
}
|
|
243
|
+
finally {
|
|
244
|
+
ctx.pendingDeliveries--;
|
|
245
|
+
hydrated.resolve();
|
|
246
|
+
}
|
|
247
|
+
});
|
|
248
|
+
payloadsQueue.push({ claim });
|
|
105
249
|
}
|
|
106
250
|
return EventConsumerResult.Consumed;
|
|
107
251
|
}
|
|
@@ -113,9 +257,9 @@ export function createCreateHook(ctx) {
|
|
|
113
257
|
// We're done processing any more events for this hook
|
|
114
258
|
return EventConsumerResult.Finished;
|
|
115
259
|
}
|
|
116
|
-
//
|
|
260
|
+
// This replay installed a different consumer than the stored event needs.
|
|
117
261
|
ctx.promiseQueue = ctx.promiseQueue.then(() => {
|
|
118
|
-
ctx.onWorkflowError(new
|
|
262
|
+
ctx.onWorkflowError(new ReplayDivergenceError(`Replay divergence: Unexpected event type for hook ${correlationId} (token: ${token}) "${event.eventType}"`, { eventId: event.eventId }));
|
|
119
263
|
});
|
|
120
264
|
return EventConsumerResult.Finished;
|
|
121
265
|
});
|
|
@@ -133,24 +277,15 @@ export function createCreateHook(ctx) {
|
|
|
133
277
|
return resolvers.promise;
|
|
134
278
|
}
|
|
135
279
|
if (payloadsQueue.length > 0) {
|
|
136
|
-
const
|
|
137
|
-
if (
|
|
138
|
-
//
|
|
139
|
-
//
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
}
|
|
146
|
-
catch (error) {
|
|
147
|
-
resolvers.reject(error);
|
|
148
|
-
}
|
|
149
|
-
finally {
|
|
150
|
-
ctx.pendingDeliveries--;
|
|
151
|
-
}
|
|
152
|
-
});
|
|
153
|
-
return resolvers.promise;
|
|
280
|
+
const nextDelivery = payloadsQueue.shift();
|
|
281
|
+
if (nextDelivery) {
|
|
282
|
+
// The payload was hydrated through a promiseQueue slot at its log
|
|
283
|
+
// position (buffering branch above). `claim()` builds the
|
|
284
|
+
// consumer-facing promise from that outcome, deferring behind any
|
|
285
|
+
// earlier-in-log wait and marking this hook delivered — so
|
|
286
|
+
// resolution order stays anchored to the event log, not this later
|
|
287
|
+
// claim site.
|
|
288
|
+
return nextDelivery.claim();
|
|
154
289
|
}
|
|
155
290
|
}
|
|
156
291
|
if (eventLogEmpty) {
|
|
@@ -161,6 +296,42 @@ export function createCreateHook(ctx) {
|
|
|
161
296
|
promises.push(resolvers);
|
|
162
297
|
return resolvers.promise;
|
|
163
298
|
}
|
|
299
|
+
// Helper function to create a promise that resolves with the hook's
|
|
300
|
+
// registration outcome: the conflicting `Run` when the token is owned
|
|
301
|
+
// by another active hook, `null` once this hook's registration is
|
|
302
|
+
// committed. Both fast-paths settle through `ctx.promiseQueue` so
|
|
303
|
+
// resolution order always matches event-log order.
|
|
304
|
+
function createGetConflictPromise() {
|
|
305
|
+
const resolvers = withResolvers();
|
|
306
|
+
if (hasCreated) {
|
|
307
|
+
ctx.promiseQueue = ctx.promiseQueue.then(() => {
|
|
308
|
+
resolvers.resolve(null);
|
|
309
|
+
});
|
|
310
|
+
return resolvers.promise;
|
|
311
|
+
}
|
|
312
|
+
if (hasConflict) {
|
|
313
|
+
ctx.promiseQueue = ctx.promiseQueue.then(() => {
|
|
314
|
+
if (conflictRunRef) {
|
|
315
|
+
resolvers.resolve(conflictRunRef);
|
|
316
|
+
}
|
|
317
|
+
else {
|
|
318
|
+
resolvers.reject(conflictErrorRef);
|
|
319
|
+
}
|
|
320
|
+
});
|
|
321
|
+
return resolvers.promise;
|
|
322
|
+
}
|
|
323
|
+
const queueItem = ctx.invocationsQueue.get(correlationId);
|
|
324
|
+
if (queueItem && queueItem.type === 'hook') {
|
|
325
|
+
queueItem.hasConflictAwaiter = true;
|
|
326
|
+
}
|
|
327
|
+
if (eventLogEmpty) {
|
|
328
|
+
scheduleWhenIdle(ctx, () => {
|
|
329
|
+
ctx.onWorkflowError(new WorkflowSuspension(ctx.invocationsQueue, ctx.globalThis));
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
getConflictPromises.push(resolvers);
|
|
333
|
+
return resolvers.promise;
|
|
334
|
+
}
|
|
164
335
|
// Helper function to dispose the hook
|
|
165
336
|
function disposeHook() {
|
|
166
337
|
if (isDisposed) {
|
|
@@ -190,6 +361,9 @@ export function createCreateHook(ctx) {
|
|
|
190
361
|
}
|
|
191
362
|
const hook = {
|
|
192
363
|
token,
|
|
364
|
+
getConflict() {
|
|
365
|
+
return createGetConflictPromise();
|
|
366
|
+
},
|
|
193
367
|
// biome-ignore lint/suspicious/noThenProperty: Intentionally thenable
|
|
194
368
|
then(onfulfilled, onrejected) {
|
|
195
369
|
return createHookPromise().then(onfulfilled, onrejected);
|
|
@@ -213,4 +387,4 @@ export function createCreateHook(ctx) {
|
|
|
213
387
|
return hook;
|
|
214
388
|
};
|
|
215
389
|
}
|
|
216
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9vay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93b3JrZmxvdy9ob29rLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzNFLE9BQU8sRUFBNkIsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHM0UsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2xELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDN0MsT0FBTyxFQUNMLGdCQUFnQixHQUVqQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUU3RCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsR0FBZ0M7SUFDL0QsT0FBTyxTQUFTLGNBQWMsQ0FBVSxVQUF1QixFQUFFO1FBQy9ELDZCQUE2QjtRQUM3QixNQUFNLGFBQWEsR0FBRyxRQUFRLEdBQUcsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDO1FBQ25ELE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLElBQUksR0FBRyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBRXBELHlFQUF5RTtRQUN6RSxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQztRQUU3QyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRTtZQUN0QyxJQUFJLEVBQUUsTUFBTTtZQUNaLGFBQWE7WUFDYixLQUFLO1lBQ0wsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO1lBQzFCLFNBQVM7U0FDVixDQUFDLENBQUM7UUFFSCxxRUFBcUU7UUFDckUsTUFBTSxhQUFhLEdBQXdCLEVBQUUsQ0FBQztRQUU5QywwREFBMEQ7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LENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLFdBQVc7U0FDOUIsQ0FBQztRQUVGLHFFQUFxRTtRQUNyRSxvRUFBb0U7UUFDcEUsaUNBQWlDO1FBQ2pDLE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztRQUNoRCxJQUFJLFNBQVMsSUFBSSxTQUFTLEtBQUssTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzdDLElBQVksQ0FBQyxTQUFTLENBQUMsR0FBRyxXQUFXLENBQUM7UUFDekMsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEhvb2tDb25mbGljdEVycm9yLCBXb3JrZmxvd1J1bnRpbWVFcnJvciB9IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHsgdHlwZSBQcm9taXNlV2l0aFJlc29sdmVycywgd2l0aFJlc29sdmVycyB9IGZyb20gJ0B3b3JrZmxvdy91dGlscyc7XG5pbXBvcnQgdHlwZSB7IEhvb2tDb25mbGljdEV2ZW50LCBIb29rUmVjZWl2ZWRFdmVudCB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgdHlwZSB7IEhvb2ssIEhvb2tPcHRpb25zIH0gZnJvbSAnLi4vY3JlYXRlLWhvb2suanMnO1xuaW1wb3J0IHsgRXZlbnRDb25zdW1lclJlc3VsdCB9IGZyb20gJy4uL2V2ZW50cy1jb25zdW1lci5qcyc7XG5pbXBvcnQgeyBXb3JrZmxvd1N1c3BlbnNpb24gfSBmcm9tICcuLi9nbG9iYWwuanMnO1xuaW1wb3J0IHsgd2ViaG9va0xvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQge1xuICBzY2hlZHVsZVdoZW5JZGxlLFxuICB0eXBlIFdvcmtmbG93T3JjaGVzdHJhdG9yQ29udGV4dCxcbn0gZnJvbSAnLi4vcHJpdmF0ZS5qcyc7XG5pbXBvcnQgeyBoeWRyYXRlU3RlcFJldHVyblZhbHVlIH0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbi5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDcmVhdGVIb29rKGN0eDogV29ya2Zsb3dPcmNoZXN0cmF0b3JDb250ZXh0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBjcmVhdGVIb29rSW1wbDxUID0gYW55PihvcHRpb25zOiBIb29rT3B0aW9ucyA9IHt9KTogSG9vazxUPiB7XG4gICAgLy8gR2VuZXJhdGUgaG9vayBJRCBhbmQgdG9rZW5cbiAgICBjb25zdCBjb3JyZWxhdGlvbklkID0gYGhvb2tfJHtjdHguZ2VuZXJhdGVVbGlkKCl9YDtcbiAgICBjb25zdCB0b2tlbiA9IG9wdGlvbnMudG9rZW4gPz8gY3R4LmdlbmVyYXRlTmFub2lkKCk7XG5cbiAgICAvLyBBZGQgaG9vayBjcmVhdGlvbiB0byBpbnZvY2F0aW9ucyBxdWV1ZSAodXNpbmcgTWFwIGZvciBPKDEpIG9wZXJhdGlvbnMpXG4gICAgY29uc3QgaXNXZWJob29rID0gb3B0aW9ucy5pc1dlYmhvb2sgPz8gZmFsc2U7XG5cbiAgICBjdHguaW52b2NhdGlvbnNRdWV1ZS5zZXQoY29ycmVsYXRpb25JZCwge1xuICAgICAgdHlwZTogJ2hvb2snLFxuICAgICAgY29ycmVsYXRpb25JZCxcbiAgICAgIHRva2VuLFxuICAgICAgbWV0YWRhdGE6IG9wdGlvbnMubWV0YWRhdGEsXG4gICAgICBpc1dlYmhvb2ssXG4gICAgfSk7XG5cbiAgICAvLyBRdWV1ZSBvZiBob29rIGV2ZW50cyB0aGF0IGhhdmUgYmVlbiByZWNlaXZlZCBidXQgbm90IHlldCBwcm9jZXNzZWRcbiAgICBjb25zdCBwYXlsb2Fkc1F1ZXVlOiBIb29rUmVjZWl2ZWRFdmVudFtdID0gW107XG5cbiAgICAvLyBRdWV1ZSBvZiBwcm9taXNlcyB0aGF0IHJlc29sdmUgdG8gdGhlIG5leHQgaG9vayBwYXlsb2FkXG4gICAgY29uc3QgcHJvbWlzZXM6IFByb21pc2VXaXRoUmVzb2x2ZXJzPFQ+W10gPSBbXTtcblxuICAgIGxldCBldmVudExvZ0VtcHR5ID0gZmFsc2U7XG5cbiAgICAvLyBUcmFjayBpZiB0aGUgZXZlbnQgbG9nIGNvbmZpcm1zIGRpc3Bvc2FsIGhhcHBlbmVkIChyZXBsYXkgbm8tb3ApXG4gICAgbGV0IGhhc0Rpc3Bvc2VkRXZlbnQgPSBmYWxzZTtcblxuICAgIC8vIFRyYWNrIGlmIHdlIGhhdmUgYSBjb25mbGljdCBzbyB3ZSBjYW4gcmVqZWN0IGZ1dHVyZSBhd2FpdHNcbiAgICBsZXQgaGFzQ29uZmxpY3QgPSBmYWxzZTtcbiAgICBsZXQgY29uZmxpY3RFcnJvclJlZjogSG9va0NvbmZsaWN0RXJyb3IgfCBudWxsID0gbnVsbDtcblxuICAgIHdlYmhvb2tMb2dnZXIuZGVidWcoJ0hvb2sgY29uc3VtZXIgc2V0dXAnLCB7IGNvcnJlbGF0aW9uSWQsIHRva2VuIH0pO1xuICAgIGN0eC5ldmVudHNDb25zdW1lci5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XG4gICAgICAvLyBJZiB0aGVyZSBhcmUgbm8gZXZlbnRzIGFuZCB0aGVyZSBhcmUgcHJvbWlzZXMgd2FpdGluZyxcbiAgICAgIC8vIGl0IG1lYW5zIHRoZSBob29rIGhhcyBiZWVuIGF3YWl0ZWQsIGJ1dCBhbiBpbmNvbWluZyBwYXlsb2FkIGhhcyBub3QgeWV0IGJlZW4gcmVjZWl2ZWQuXG4gICAgICAvLyBJbiB0aGlzIGNhc2UsIHRoZSB3b3JrZmxvdyBzaG91bGQgYmUgc3VzcGVuZGVkIHVudGlsIHRoZSBob29rIGlzIHJlc3VtZWQuXG4gICAgICBpZiAoIWV2ZW50KSB7XG4gICAgICAgIGV2ZW50TG9nRW1wdHkgPSB0cnVlO1xuXG4gICAgICAgIGlmIChwcm9taXNlcy5sZW5ndGggPiAwICYmIHBheWxvYWRzUXVldWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgc2NoZWR1bGVXaGVuSWRsZShjdHgsICgpID0+IHtcbiAgICAgICAgICAgIGN0eC5vbldvcmtmbG93RXJyb3IoXG4gICAgICAgICAgICAgIG5ldyBXb3JrZmxvd1N1c3BlbnNpb24oY3R4Lmludm9jYXRpb25zUXVldWUsIGN0eC5nbG9iYWxUaGlzKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5Ob3RDb25zdW1lZDtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50LmNvcnJlbGF0aW9uSWQgIT09IGNvcnJlbGF0aW9uSWQpIHtcbiAgICAgICAgLy8gV2UncmUgbm90IGludGVyZXN0ZWQgaW4gdGhpcyBldmVudCAtIHRoZSBjb3JyZWxhdGlvbklkIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgZW50aXR5XG4gICAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0Lk5vdENvbnN1bWVkO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBmb3IgaG9va19jcmVhdGVkIGV2ZW50IHRvIG1hcmsgdGhpcyBob29rIGFzIGFscmVhZHkgY3JlYXRlZFxuICAgICAgaWYgKGV2ZW50LmV2ZW50VHlwZSA9PT0gJ2hvb2tfY3JlYXRlZCcpIHtcbiAgICAgICAgY29uc3QgcXVldWVJdGVtID0gY3R4Lmludm9jYXRpb25zUXVldWUuZ2V0KGNvcnJlbGF0aW9uSWQpO1xuICAgICAgICBpZiAocXVldWVJdGVtICYmIHF1ZXVlSXRlbS50eXBlID09PSAnaG9vaycpIHtcbiAgICAgICAgICBxdWV1ZUl0ZW0uaGFzQ3JlYXRlZEV2ZW50ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5Db25zdW1lZDtcbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIGhvb2tfY29uZmxpY3QgZXZlbnQgLSBhbm90aGVyIHdvcmtmbG93IGlzIHVzaW5nIHRoaXMgdG9rZW5cbiAgICAgIGlmIChldmVudC5ldmVudFR5cGUgPT09ICdob29rX2NvbmZsaWN0Jykge1xuICAgICAgICAvLyBSZW1vdmUgdGhpcyBob29rIGZyb20gdGhlIGludm9jYXRpb25zIHF1ZXVlXG4gICAgICAgIGN0eC5pbnZvY2F0aW9uc1F1ZXVlLmRlbGV0ZShjb3JyZWxhdGlvbklkKTtcblxuICAgICAgICAvLyBTdG9yZSB0aGUgY29uZmxpY3QgZXZlbnQgc28gd2UgY2FuIHJlamVjdCBhbnkgYXdhaXRlZCBwcm9taXNlcy5cbiAgICAgICAgLy8gQ2hhaW4gdGhyb3VnaCBwcm9taXNlUXVldWUgdG8gZW5zdXJlIGRldGVybWluaXN0aWMgb3JkZXJpbmcuXG4gICAgICAgIGNvbnN0IGNvbmZsaWN0RXZlbnQgPSBldmVudCBhcyBIb29rQ29uZmxpY3RFdmVudDtcbiAgICAgICAgY29uc3QgY29uZmxpY3RFcnJvciA9IG5ldyBIb29rQ29uZmxpY3RFcnJvcihcbiAgICAgICAgICBjb25mbGljdEV2ZW50LmV2ZW50RGF0YS50b2tlblxuICAgICAgICApO1xuXG4gICAgICAgIC8vIE1hcmsgdGhhdCB3ZSBoYXZlIGEgY29uZmxpY3Qgc28gZnV0dXJlIGF3YWl0cyBhbHNvIHJlamVjdFxuICAgICAgICBoYXNDb25mbGljdCA9IHRydWU7XG4gICAgICAgIGNvbmZsaWN0RXJyb3JSZWYgPSBjb25mbGljdEVycm9yO1xuXG4gICAgICAgIC8vIENhcHR1cmUgYW5kIGRyYWluIHBlbmRpbmcgcHJvbWlzZXMgc3luY2hyb25vdXNseSBzbyB0aGUgbnVsbCBldmVudFxuICAgICAgICAvLyBoYW5kbGVyIHdvbid0IHNlZSB0aGVtIGFuZCB0cmlnZ2VyIGEgc3B1cmlvdXMgV29ya2Zsb3dTdXNwZW5zaW9uLlxuICAgICAgICAvLyBUaGUgYWN0dWFsIHJlamVjdGlvbnMgYXJlIGRlZmVycmVkIHRocm91Z2ggcHJvbWlzZVF1ZXVlIGZvciBvcmRlcmluZy5cbiAgICAgICAgY29uc3QgcGVuZGluZ1Byb21pc2VzID0gcHJvbWlzZXMuc2xpY2UoKTtcbiAgICAgICAgcHJvbWlzZXMubGVuZ3RoID0gMDtcblxuICAgICAgICBjdHgucHJvbWlzZVF1ZXVlID0gY3R4LnByb21pc2VRdWV1ZS50aGVuKCgpID0+IHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHJlc29sdmVyIG9mIHBlbmRpbmdQcm9taXNlcykge1xuICAgICAgICAgICAgcmVzb2x2ZXIucmVqZWN0KGNvbmZsaWN0RXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuQ29uc3VtZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudC5ldmVudFR5cGUgPT09ICdob29rX3JlY2VpdmVkJykge1xuICAgICAgICBpZiAocHJvbWlzZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IG5leHQgPSBwcm9taXNlcy5zaGlmdCgpO1xuICAgICAgICAgIGlmIChuZXh0KSB7XG4gICAgICAgICAgICAvLyBSZWNvbnN0cnVjdCB0aGUgcGF5bG9hZCBmcm9tIHRoZSBldmVudCBkYXRhLlxuICAgICAgICAgICAgLy8gQ2hhaW4gdGhyb3VnaCBjdHgucHJvbWlzZVF1ZXVlIHRvIGVuc3VyZSB0aGF0IGFzeW5jXG4gICAgICAgICAgICAvLyBkZXNlcmlhbGl6YXRpb24gKGUuZy4sIGRlY3J5cHRpb24pIHJlc29sdmVzIGluIGV2ZW50IGxvZyBvcmRlci5cbiAgICAgICAgICAgIGN0eC5wZW5kaW5nRGVsaXZlcmllcysrO1xuICAgICAgICAgICAgY3R4LnByb21pc2VRdWV1ZSA9IGN0eC5wcm9taXNlUXVldWUudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IGF3YWl0IGh5ZHJhdGVTdGVwUmV0dXJuVmFsdWUoXG4gICAgICAgICAgICAgICAgICBldmVudC5ldmVudERhdGEucGF5bG9hZCxcbiAgICAgICAgICAgICAgICAgIGN0eC5ydW5JZCxcbiAgICAgICAgICAgICAgICAgIGN0eC5lbmNyeXB0aW9uS2V5LFxuICAgICAgICAgICAgICAgICAgY3R4Lmdsb2JhbFRoaXNcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIG5leHQucmVzb2x2ZShwYXlsb2FkIGFzIFQpO1xuICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIG5leHQucmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBjdHgucGVuZGluZ0RlbGl2ZXJpZXMtLTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBheWxvYWRzUXVldWUucHVzaChldmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5Db25zdW1lZDtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50LmV2ZW50VHlwZSA9PT0gJ2hvb2tfZGlzcG9zZWQnKSB7XG4gICAgICAgIC8vIFRlcm1pbmFsIHN0YXRlIC0gcmVtb3ZlIGZyb20gcXVldWUgKGxpa2Ugc3RlcF9jb21wbGV0ZWQvd2FpdF9jb21wbGV0ZWQpXG4gICAgICAgIGN0eC5pbnZvY2F0aW9uc1F1ZXVlLmRlbGV0ZShjb3JyZWxhdGlvbklkKTtcbiAgICAgICAgLy8gTWFyayB0aGF0IHRoZSBldmVudCBsb2cgY29uZmlybXMgZGlzcG9zYWwgaGFwcGVuZWRcbiAgICAgICAgaGFzRGlzcG9zZWRFdmVudCA9IHRydWU7XG4gICAgICAgIC8vIFdlJ3JlIGRvbmUgcHJvY2Vzc2luZyBhbnkgbW9yZSBldmVudHMgZm9yIHRoaXMgaG9va1xuICAgICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5GaW5pc2hlZDtcbiAgICAgIH1cblxuICAgICAgLy8gQW4gdW5leHBlY3RlZCBldmVudCB0eXBlIGhhcyBiZWVuIHJlY2VpdmVkLCB0aGlzIGV2ZW50IGxvZyBsb29rcyBjb3JydXB0ZWQuIExldCdzIGZhaWwgaW1tZWRpYXRlbHkuXG4gICAgICBjdHgucHJvbWlzZVF1ZXVlID0gY3R4LnByb21pc2VRdWV1ZS50aGVuKCgpID0+IHtcbiAgICAgICAgY3R4Lm9uV29ya2Zsb3dFcnJvcihcbiAgICAgICAgICBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgICBgVW5leHBlY3RlZCBldmVudCB0eXBlIGZvciBob29rICR7Y29ycmVsYXRpb25JZH0gKHRva2VuOiAke3Rva2VufSkgXCIke2V2ZW50LmV2ZW50VHlwZX1cImBcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0LkZpbmlzaGVkO1xuICAgIH0pO1xuXG4gICAgLy8gVHJhY2sgaWYgdGhlIGhvb2sgaGFzIGJlZW4gZGlzcG9zZWRcbiAgICBsZXQgaXNEaXNwb3NlZCA9IGZhbHNlO1xuXG4gICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIG5ldyBwcm9taXNlIHRoYXQgd2FpdHMgZm9yIHRoZSBuZXh0IGhvb2sgcGF5bG9hZFxuICAgIGZ1bmN0aW9uIGNyZWF0ZUhvb2tQcm9taXNlKCk6IFByb21pc2U8VD4ge1xuICAgICAgY29uc3QgcmVzb2x2ZXJzID0gd2l0aFJlc29sdmVyczxUPigpO1xuXG4gICAgICAvLyBJZiB3ZSBoYXZlIGEgY29uZmxpY3QsIHJlamVjdCB0aHJvdWdoIHRoZSBwcm9taXNlUXVldWUgdG8gbWFpbnRhaW5cbiAgICAgIC8vIGRldGVybWluaXN0aWMgb3JkZXJpbmcgd2l0aCBhbnkgcHJpb3IgcXVldWVkIHJlc29sdXRpb25zLlxuICAgICAgaWYgKGhhc0NvbmZsaWN0ICYmIGNvbmZsaWN0RXJyb3JSZWYpIHtcbiAgICAgICAgY3R4LnByb21pc2VRdWV1ZSA9IGN0eC5wcm9taXNlUXVldWUudGhlbigoKSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZXJzLnJlamVjdChjb25mbGljdEVycm9yUmVmKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXNvbHZlcnMucHJvbWlzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHBheWxvYWRzUXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBuZXh0UGF5bG9hZCA9IHBheWxvYWRzUXVldWUuc2hpZnQoKTtcbiAgICAgICAgaWYgKG5leHRQYXlsb2FkKSB7XG4gICAgICAgICAgLy8gQ2hhaW4gdGhyb3VnaCBjdHgucHJvbWlzZVF1ZXVlIHRvIGVuc3VyZSB0aGF0IGFzeW5jXG4gICAgICAgICAgLy8gZGVzZXJpYWxpemF0aW9uIChlLmcuLCBkZWNyeXB0aW9uKSByZXNvbHZlcyBpbiBldmVudCBsb2cgb3JkZXIuXG4gICAgICAgICAgY3R4LnBlbmRpbmdEZWxpdmVyaWVzKys7XG4gICAgICAgICAgY3R4LnByb21pc2VRdWV1ZSA9IGN0eC5wcm9taXNlUXVldWUudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBwYXlsb2FkID0gYXdhaXQgaHlkcmF0ZVN0ZXBSZXR1cm5WYWx1ZShcbiAgICAgICAgICAgICAgICBuZXh0UGF5bG9hZC5ldmVudERhdGEucGF5bG9hZCxcbiAgICAgICAgICAgICAgICBjdHgucnVuSWQsXG4gICAgICAgICAgICAgICAgY3R4LmVuY3J5cHRpb25LZXksXG4gICAgICAgICAgICAgICAgY3R4Lmdsb2JhbFRoaXNcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgcmVzb2x2ZXJzLnJlc29sdmUocGF5bG9hZCBhcyBUKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIHJlc29sdmVycy5yZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgY3R4LnBlbmRpbmdEZWxpdmVyaWVzLS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmVycy5wcm9taXNlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudExvZ0VtcHR5KSB7XG4gICAgICAgIHNjaGVkdWxlV2hlbklkbGUoY3R4LCAoKSA9PiB7XG4gICAgICAgICAgY3R4Lm9uV29ya2Zsb3dFcnJvcihcbiAgICAgICAgICAgIG5ldyBXb3JrZmxvd1N1c3BlbnNpb24oY3R4Lmludm9jYXRpb25zUXVldWUsIGN0eC5nbG9iYWxUaGlzKVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBwcm9taXNlcy5wdXNoKHJlc29sdmVycyk7XG5cbiAgICAgIHJldHVybiByZXNvbHZlcnMucHJvbWlzZTtcbiAgICB9XG5cbiAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZGlzcG9zZSB0aGUgaG9va1xuICAgIGZ1bmN0aW9uIGRpc3Bvc2VIb29rKCk6IHZvaWQge1xuICAgICAgaWYgKGlzRGlzcG9zZWQpIHtcbiAgICAgICAgcmV0dXJuOyAvLyBBbHJlYWR5IGRpc3Bvc2VkLCBub3RoaW5nIHRvIGRvXG4gICAgICB9XG4gICAgICBpc0Rpc3Bvc2VkID0gdHJ1ZTtcblxuICAgICAgLy8gSWYgdGhlIGV2ZW50IGxvZyBhbHJlYWR5IGNvbnRhaW5zIGhvb2tfZGlzcG9zZWQsIHRoaXMgaXMgYSByZXBsYXkg4oCUIG5vLW9wXG4gICAgICBpZiAoaGFzRGlzcG9zZWRFdmVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCBkaXNwb3NlZCBmbGFnIG9uIHRoZSBleGlzdGluZyBxdWV1ZSBpdGVtXG4gICAgICBjb25zdCBxdWV1ZUl0ZW0gPSBjdHguaW52b2NhdGlvbnNRdWV1ZS5nZXQoY29ycmVsYXRpb25JZCk7XG4gICAgICBpZiAocXVldWVJdGVtICYmIHF1ZXVlSXRlbS50eXBlID09PSAnaG9vaycpIHtcbiAgICAgICAgcXVldWVJdGVtLmRpc3Bvc2VkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gRHJhaW4gYW55IHBlbmRpbmcgcHJvbWlzZXMgdGhhdCBhcmUgd2FpdGluZyBmb3IgcGF5bG9hZHMuXG4gICAgICAvLyBXaXRob3V0IHRoaXMsIHByb21pc2VzIGNyZWF0ZWQgYnkgYGF3YWl0IGhvb2tgIG9yIHRoZSBhc3luYyBpdGVyYXRvcidzXG4gICAgICAvLyBgeWllbGQgYXdhaXQgdGhpc2Agd291bGQgaGFuZyBmb3JldmVyIHNpbmNlIHRoZSBldmVudCBjb25zdW1lciB3aWxsXG4gICAgICAvLyBuZXZlciBkZWxpdmVyIGFub3RoZXIgaG9va19yZWNlaXZlZCBhZnRlciBkaXNwb3NhbC5cbiAgICAgIGlmIChwcm9taXNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHByb21pc2VzLmxlbmd0aCA9IDA7XG4gICAgICAgIHNjaGVkdWxlV2hlbklkbGUoY3R4LCAoKSA9PiB7XG4gICAgICAgICAgY3R4Lm9uV29ya2Zsb3dFcnJvcihcbiAgICAgICAgICAgIG5ldyBXb3JrZmxvd1N1c3BlbnNpb24oY3R4Lmludm9jYXRpb25zUXVldWUsIGN0eC5nbG9iYWxUaGlzKVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB3ZWJob29rTG9nZ2VyLmRlYnVnKCdIb29rIGRpc3Bvc2VkJywgeyBjb3JyZWxhdGlvbklkLCB0b2tlbiB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBob29rOiBIb29rPFQ+ID0ge1xuICAgICAgdG9rZW4sXG5cbiAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9UaGVuUHJvcGVydHk6IEludGVudGlvbmFsbHkgdGhlbmFibGVcbiAgICAgIHRoZW48VFJlc3VsdDEgPSBULCBUUmVzdWx0MiA9IG5ldmVyPihcbiAgICAgICAgb25mdWxmaWxsZWQ/OiAoKHZhbHVlOiBUKSA9PiBUUmVzdWx0MSB8IFByb21pc2VMaWtlPFRSZXN1bHQxPikgfCBudWxsLFxuICAgICAgICBvbnJlamVjdGVkPzogKChyZWFzb246IGFueSkgPT4gVFJlc3VsdDIgfCBQcm9taXNlTGlrZTxUUmVzdWx0Mj4pIHwgbnVsbFxuICAgICAgKTogUHJvbWlzZTxUUmVzdWx0MSB8IFRSZXN1bHQyPiB7XG4gICAgICAgIHJldHVybiBjcmVhdGVIb29rUHJvbWlzZSgpLnRoZW4ob25mdWxmaWxsZWQsIG9ucmVqZWN0ZWQpO1xuICAgICAgfSxcblxuICAgICAgLy8gU3VwcG9ydCBgZm9yIGF3YWl0IChjb25zdCBwYXlsb2FkIG9mIGhvb2spIHsg4oCmIH1gIHN5bnRheFxuICAgICAgYXN5bmMgKltTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7XG4gICAgICAgIHdoaWxlICghaXNEaXNwb3NlZCkge1xuICAgICAgICAgIHlpZWxkIGF3YWl0IHRoaXM7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIGRpc3Bvc2U6IGRpc3Bvc2VIb29rLFxuXG4gICAgICBbU3ltYm9sLmRpc3Bvc2VdOiBkaXNwb3NlSG9vayxcbiAgICB9O1xuXG4gICAgLy8gQWxzbyByZWdpc3RlciB3aXRoIHRoZSBWTSdzIFN5bWJvbC5kaXNwb3NlIHNvIGB1c2luZ2Agd29ya3MgaW5zaWRlXG4gICAgLy8gdGhlIHdvcmtmbG93IHNhbmRib3ggKHRoZSBWTSBtYXkgaGF2ZSBhIHBvbHlmaWxsZWQgU3ltYm9sLmRpc3Bvc2VcbiAgICAvLyB0aGF0IGRpZmZlcnMgZnJvbSB0aGUgaG9zdCdzKS5cbiAgICBjb25zdCB2bURpc3Bvc2UgPSBjdHguZ2xvYmFsVGhpcy5TeW1ib2wuZGlzcG9zZTtcbiAgICBpZiAodm1EaXNwb3NlICYmIHZtRGlzcG9zZSAhPT0gU3ltYm9sLmRpc3Bvc2UpIHtcbiAgICAgIChob29rIGFzIGFueSlbdm1EaXNwb3NlXSA9IGRpc3Bvc2VIb29rO1xuICAgIH1cblxuICAgIHJldHVybiBob29rO1xuICB9O1xufVxuIl19
|
|
390
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9vay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93b3JrZmxvdy9ob29rLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzVFLE9BQU8sRUFBNkIsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHM0UsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2xELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDN0MsT0FBTyxFQUNMLHNCQUFzQixFQUN0Qix1QkFBdUIsRUFDdkIsZ0JBQWdCLEdBRWpCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUVoRixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUU3RDs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILFNBQVMsb0JBQW9CLENBQzNCLEdBQWdDLEVBQ2hDLGdCQUFvQztJQUVwQyxJQUFJLE9BQU8sZ0JBQWdCLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDekMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsTUFBTSxRQUFRLEdBQUcscUJBQXFCLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxVQUFVLENBSXRELENBQUM7SUFDZCxNQUFNLFdBQVcsR0FBSSxRQUFnQixFQUFFLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUM5RCxJQUFJLE9BQU8sV0FBVyxLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQ3RDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNELE9B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RUFBc0U7WUFDdEUsSUFBSSxDQUNGLFdBQXFFLEVBQ3JFLFVBQXVFO2dCQUV2RSxPQUFPLGlCQUFpQixFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUMzRCxDQUFDO1lBRUQsMkRBQTJEO1lBQzNELEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQztnQkFDM0IsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDO29CQUNuQixNQUFNLE1BQU0sSUFBSSxDQUFDO2dCQUNuQixDQUFDO1lBQ0gsQ0FBQztZQUVELE9BQU8sRUFBRSxXQUFXO1lBRXBCLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLFdBQVc7U0FDOUIsQ0FBQztRQUVGLHFFQUFxRTtRQUNyRSxvRUFBb0U7UUFDcEUsaUNBQWlDO1FBQ2pDLE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztRQUNoRCxJQUFJLFNBQVMsSUFBSSxTQUFTLEtBQUssTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzdDLElBQVksQ0FBQyxTQUFTLENBQUMsR0FBRyxXQUFXLENBQUM7UUFDekMsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEhvb2tDb25mbGljdEVycm9yLCBSZXBsYXlEaXZlcmdlbmNlRXJyb3IgfSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB7IHR5cGUgUHJvbWlzZVdpdGhSZXNvbHZlcnMsIHdpdGhSZXNvbHZlcnMgfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMnO1xuaW1wb3J0IHR5cGUgeyBIb29rQ29uZmxpY3RFdmVudCB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgdHlwZSB7IEhvb2ssIEhvb2tPcHRpb25zIH0gZnJvbSAnLi4vY3JlYXRlLWhvb2suanMnO1xuaW1wb3J0IHsgRXZlbnRDb25zdW1lclJlc3VsdCB9IGZyb20gJy4uL2V2ZW50cy1jb25zdW1lci5qcyc7XG5pbXBvcnQgeyBXb3JrZmxvd1N1c3BlbnNpb24gfSBmcm9tICcuLi9nbG9iYWwuanMnO1xuaW1wb3J0IHsgd2ViaG9va0xvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQge1xuICBhd2FpdEVhcmxpZXJEZWxpdmVyaWVzLFxuICByZWdpc3RlckRlbGl2ZXJ5QmFycmllcixcbiAgc2NoZWR1bGVXaGVuSWRsZSxcbiAgdHlwZSBXb3JrZmxvd09yY2hlc3RyYXRvckNvbnRleHQsXG59IGZyb20gJy4uL3ByaXZhdGUuanMnO1xuaW1wb3J0IHsgV09SS0ZMT1dfREVTRVJJQUxJWkUgfSBmcm9tICdAd29ya2Zsb3cvc2VyZGUnO1xuaW1wb3J0IHsgZ2V0U2VyaWFsaXphdGlvbkNsYXNzLCBSVU5fQ0xBU1NfSUQgfSBmcm9tICcuLi9jbGFzcy1zZXJpYWxpemF0aW9uLmpzJztcbmltcG9ydCB0eXBlIHsgUnVuIH0gZnJvbSAnLi4vcnVudGltZS9ydW4uanMnO1xuaW1wb3J0IHsgaHlkcmF0ZVN0ZXBSZXR1cm5WYWx1ZSB9IGZyb20gJy4uL3NlcmlhbGl6YXRpb24uanMnO1xuXG4vKipcbiAqIENvbnN0cnVjdHMgYSBgUnVuYCBoYW5kbGUgZm9yIHRoZSBydW4gdGhhdCBvd25zIGEgY29uZmxpY3RpbmcgaG9va1xuICogdG9rZW4sIGZvciByZXNvbHV0aW9uIHRocm91Z2ggYGhvb2suZ2V0Q29uZmxpY3QoKWAuXG4gKlxuICogVGhlIGluc3RhbmNlIGlzIGNyZWF0ZWQgdGhyb3VnaCB0aGUgc2VyaWFsaXphdGlvbiBjbGFzcyByZWdpc3RyeSBvblxuICogdGhlIFZNJ3MgZ2xvYmFsVGhpcyDigJQgdGhlIHNhbWUgY2hhbm5lbCB0aGF0IHJldml2ZXMgc2VyaWFsaXplZCBgUnVuYFxuICogaW5zdGFuY2VzIChlLmcuIGBzdGFydCgpYCByZXR1cm4gdmFsdWVzIGNyb3NzaW5nIGZyb20gYSBzdGVwIGludG8gdGhlXG4gKiB3b3JrZmxvdykuIFRoZSByZWdpc3RlcmVkIGNsYXNzIGlzIHRoZSBWTSBidW5kbGUncyBwbHVnaW4tY29tcGlsZWRcbiAqIGBSdW5gLCB3aG9zZSBtZXRob2RzIGFyZSBkdXJhYmxlIHN0ZXAgcHJveGllcyDigJQgc2FmZSB0byBjYWxsIGZyb21cbiAqIHdvcmtmbG93IGNvZGUg4oCUIGFuZCBjb25zdHJ1Y3Rpb24gZ29lcyB0aHJvdWdoIGl0c1xuICogYFdPUktGTE9XX0RFU0VSSUFMSVpFYCBob29rLCBleGFjdGx5IGFzIHRoZSBgSW5zdGFuY2VgIHJldml2ZXIgd291bGQuXG4gKlxuICogUmV0dXJucyBgbnVsbGAgd2hlbiBhIHJlYWwgYFJ1bmAgY2Fubm90IGJlIGNvbnN0cnVjdGVkOiB0aGUgY29uZmxpY3RcbiAqIGV2ZW50IGxhY2tzIGBjb25mbGljdGluZ1J1bklkYCAod3JpdHRlbiBieSBhbiBvbGQgd29ybGQpLCBvciB0aGUgVk0nc1xuICogcmVnaXN0cnkgaGFzIG5vIGBSdW5gIChhIGNvbnRleHQgdGhhdCBuZXZlciBldmFsdWF0ZWQgdGhlXG4gKiB3b3JrZmxvdy1tb2RlIGBjcmVhdGUtaG9va2AgbW9kdWxlLCB3aGljaCBhbGlhc2VzIGl0IHVuZGVyXG4gKiBgUlVOX0NMQVNTX0lEYCkuIGBnZXRDb25mbGljdGAgYXdhaXRlcnMgdGhlbiByZWplY3Qgd2l0aFxuICogYEhvb2tDb25mbGljdEVycm9yYCBpbnN0ZWFkIG9mIHJlc29sdmluZyB3aXRoIGEgdmFsdWUgdGhhdCBkb2Vzbid0XG4gKiBob25vciB0aGUgYFJ1bmAgY29udHJhY3QuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUNvbmZsaWN0aW5nUnVuKFxuICBjdHg6IFdvcmtmbG93T3JjaGVzdHJhdG9yQ29udGV4dCxcbiAgY29uZmxpY3RpbmdSdW5JZDogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBSdW48dW5rbm93bj4gfCBudWxsIHtcbiAgaWYgKHR5cGVvZiBjb25mbGljdGluZ1J1bklkICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IFJ1bkNsYXNzID0gZ2V0U2VyaWFsaXphdGlvbkNsYXNzKFJVTl9DTEFTU19JRCwgY3R4Lmdsb2JhbFRoaXMpIGFzXG4gICAgfCAoYWJzdHJhY3QgbmV3IChcbiAgICAgICAgLi4uYXJnczogbmV2ZXJcbiAgICAgICkgPT4gUnVuPHVua25vd24+KVxuICAgIHwgdW5kZWZpbmVkO1xuICBjb25zdCBkZXNlcmlhbGl6ZSA9IChSdW5DbGFzcyBhcyBhbnkpPy5bV09SS0ZMT1dfREVTRVJJQUxJWkVdO1xuICBpZiAodHlwZW9mIGRlc2VyaWFsaXplICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIGRlc2VyaWFsaXplLmNhbGwoUnVuQ2xhc3MsIHsgcnVuSWQ6IGNvbmZsaWN0aW5nUnVuSWQgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDcmVhdGVIb29rKGN0eDogV29ya2Zsb3dPcmNoZXN0cmF0b3JDb250ZXh0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBjcmVhdGVIb29rSW1wbDxUID0gYW55PihvcHRpb25zOiBIb29rT3B0aW9ucyA9IHt9KTogSG9vazxUPiB7XG4gICAgLy8gUmVqZWN0IGFuIGV4cGxpY2l0IGVtcHR5LXN0cmluZyB0b2tlbi4gQSB0b2tlbiBtdXN0IGVpdGhlciBiZSBvbWl0dGVkXG4gICAgLy8gKG9yIGB1bmRlZmluZWRgL2BudWxsYCkgdG8gZ2V0IGEgcmFuZG9tbHkgZ2VuZXJhdGVkIG9uZSwgb3IgYmUgYW5cbiAgICAvLyBleHBsaWNpdCBub24tZW1wdHkgc3RyaW5nLiBBbiBlbXB0eSBzdHJpbmcgaXMgYWxtb3N0IGFsd2F5cyBhblxuICAgIC8vIGFjY2lkZW50YWwgdmFsdWUgKGUuZy4gYW4gdW5zZXQgdmFyaWFibGUpIGFuZCB3b3VsZCBvdGhlcndpc2Ugc2xpcFxuICAgIC8vIHRocm91Z2ggdGhlIGA/P2AgYmVsb3cg4oCUIHdoaWNoIG9ubHkgZmFsbHMgYmFjayBmb3IgbnVsbGlzaCB2YWx1ZXMg4oCUIGFuZFxuICAgIC8vIGJlIHVzZWQgYXMgYSBtZWFuaW5nbGVzcywgbm9uLWRldGVybWluaXN0aWMgdG9rZW4uXG4gICAgaWYgKG9wdGlvbnMudG9rZW4gPT09ICcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdgY3JlYXRlSG9vaygpYCB3YXMgY2FsbGVkIHdpdGggYW4gZW1wdHkgc3RyaW5nIHRva2VuLiBQYXNzIGEgbm9uLWVtcHR5IHRva2VuLCBvciBvbWl0IHRoZSBgdG9rZW5gIG9wdGlvbiB0byB1c2UgYSByYW5kb21seSBnZW5lcmF0ZWQgb25lLidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gR2VuZXJhdGUgaG9vayBJRCBhbmQgdG9rZW5cbiAgICBjb25zdCBjb3JyZWxhdGlvbklkID0gYGhvb2tfJHtjdHguZ2VuZXJhdGVVbGlkKCl9YDtcbiAgICBjb25zdCB0b2tlbiA9IG9wdGlvbnMudG9rZW4gPz8gY3R4LmdlbmVyYXRlTmFub2lkKCk7XG5cbiAgICAvLyBBZGQgaG9vayBjcmVhdGlvbiB0byBpbnZvY2F0aW9ucyBxdWV1ZSAodXNpbmcgTWFwIGZvciBPKDEpIG9wZXJhdGlvbnMpXG4gICAgY29uc3QgaXNXZWJob29rID0gb3B0aW9ucy5pc1dlYmhvb2sgPz8gZmFsc2U7XG5cbiAgICBjdHguaW52b2NhdGlvbnNRdWV1ZS5zZXQoY29ycmVsYXRpb25JZCwge1xuICAgICAgdHlwZTogJ2hvb2snLFxuICAgICAgY29ycmVsYXRpb25JZCxcbiAgICAgIHRva2VuLFxuICAgICAgbWV0YWRhdGE6IG9wdGlvbnMubWV0YWRhdGEsXG4gICAgICBpc1dlYmhvb2ssXG4gICAgfSk7XG5cbiAgICAvLyBRdWV1ZSBvZiBidWZmZXJlZCBob29rIHBheWxvYWRzIChyZWNlaXZlZCBiZWZvcmUgdGhlIHdvcmtmbG93IGF3YWl0ZWRcbiAgICAvLyB0aGUgaG9vaykuIEVhY2ggZW50cnkncyBgY2xhaW0oKWAgYnVpbGRzIHRoZSBjb25zdW1lci1mYWNpbmcgcHJvbWlzZVxuICAgIC8vIGZyb20gdGhlIGNhcHR1cmVkIGh5ZHJhdGlvbiBvdXRjb21lIGFuZCBvcmRlcnMgaXQgZGV0ZXJtaW5pc3RpY2FsbHkgYnlcbiAgICAvLyBldmVudC1sb2cgcG9zaXRpb24gYWdhaW5zdCBhbnkgY29uY3VycmVudCBicmFuY2gtZGVjaWRpbmcgcmVzb2x1dGlvblxuICAgIC8vIChzZWUgYGN0eC5wZW5kaW5nRGVsaXZlcnlCYXJyaWVyc2ApLlxuICAgIGNvbnN0IHBheWxvYWRzUXVldWU6IHsgY2xhaW06ICgpID0+IFByb21pc2U8VD4gfVtdID0gW107XG5cbiAgICAvLyBRdWV1ZSBvZiBwcm9taXNlcyB0aGF0IHJlc29sdmUgdG8gdGhlIG5leHQgaG9vayBwYXlsb2FkXG4gICAgY29uc3QgcHJvbWlzZXM6IFByb21pc2VXaXRoUmVzb2x2ZXJzPFQ+W10gPSBbXTtcblxuICAgIC8vIFF1ZXVlIG9mIHByb21pc2VzIHRoYXQgcmVzb2x2ZSBvbmNlIGhvb2sgcmVnaXN0cmF0aW9uIGlzIGNvbmZpcm1lZFxuICAgIC8vICh3aXRoIGBudWxsYCkgb3IgYSB0b2tlbiBjb25mbGljdCBpcyBkZXRlY3RlZCAod2l0aCB0aGUgY29uZmxpY3RpbmdcbiAgICAvLyBgUnVuYCkuIFRoZXNlIGJhY2sgdGhlIGBob29rLmdldENvbmZsaWN0KClgIGdldHRlci5cbiAgICBjb25zdCBnZXRDb25mbGljdFByb21pc2VzOiBQcm9taXNlV2l0aFJlc29sdmVyczxSdW48dW5rbm93bj4gfCBudWxsPltdID0gW107XG5cbiAgICBsZXQgZXZlbnRMb2dFbXB0eSA9IGZhbHNlO1xuXG4gICAgLy8gVHJhY2sgaWYgdGhlIGV2ZW50IGxvZyBjb25maXJtcyBob29rIGNyZWF0aW9uIGhhcHBlbmVkXG4gICAgbGV0IGhhc0NyZWF0ZWQgPSBmYWxzZTtcblxuICAgIC8vIFRyYWNrIGlmIHRoZSBldmVudCBsb2cgY29uZmlybXMgZGlzcG9zYWwgaGFwcGVuZWQgKHJlcGxheSBuby1vcClcbiAgICBsZXQgaGFzRGlzcG9zZWRFdmVudCA9IGZhbHNlO1xuXG4gICAgLy8gVHJhY2sgaWYgd2UgaGF2ZSBhIGNvbmZsaWN0IHNvIHdlIGNhbiByZWplY3QgZnV0dXJlIGF3YWl0c1xuICAgIGxldCBoYXNDb25mbGljdCA9IGZhbHNlO1xuICAgIGxldCBjb25mbGljdEVycm9yUmVmOiBIb29rQ29uZmxpY3RFcnJvciB8IG51bGwgPSBudWxsO1xuICAgIC8vIFRoZSBjb25mbGljdGluZyBydW4gaGFuZGxlLCBzaGFyZWQgYnkgZXZlcnkgYGdldENvbmZsaWN0YCBhd2FpdCBzb1xuICAgIC8vIHJlcGVhdGVkIGF3YWl0cyBvYnNlcnZlIHRoZSBzYW1lIGluc3RhbmNlIGRldGVybWluaXN0aWNhbGx5LlxuICAgIGxldCBjb25mbGljdFJ1blJlZjogUnVuPHVua25vd24+IHwgbnVsbCA9IG51bGw7XG5cbiAgICB3ZWJob29rTG9nZ2VyLmRlYnVnKCdIb29rIGNvbnN1bWVyIHNldHVwJywgeyBjb3JyZWxhdGlvbklkLCB0b2tlbiB9KTtcbiAgICBjdHguZXZlbnRzQ29uc3VtZXIuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgLy8gSWYgdGhlcmUgYXJlIG5vIGV2ZW50cyBhbmQgdGhlcmUgYXJlIHByb21pc2VzIHdhaXRpbmcsXG4gICAgICAvLyBpdCBtZWFucyB0aGUgaG9vayBoYXMgYmVlbiBhd2FpdGVkLCBidXQgYW4gaW5jb21pbmcgcGF5bG9hZCBoYXMgbm90IHlldCBiZWVuIHJlY2VpdmVkLlxuICAgICAgLy8gSW4gdGhpcyBjYXNlLCB0aGUgd29ya2Zsb3cgc2hvdWxkIGJlIHN1c3BlbmRlZCB1bnRpbCB0aGUgaG9vayBpcyByZXN1bWVkLlxuICAgICAgaWYgKCFldmVudCkge1xuICAgICAgICBldmVudExvZ0VtcHR5ID0gdHJ1ZTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgKHByb21pc2VzLmxlbmd0aCA+IDAgJiYgcGF5bG9hZHNRdWV1ZS5sZW5ndGggPT09IDApIHx8XG4gICAgICAgICAgKGdldENvbmZsaWN0UHJvbWlzZXMubGVuZ3RoID4gMCAmJiAhaGFzQ3JlYXRlZCAmJiAhaGFzQ29uZmxpY3QpXG4gICAgICAgICkge1xuICAgICAgICAgIHNjaGVkdWxlV2hlbklkbGUoY3R4LCAoKSA9PiB7XG4gICAgICAgICAgICBjdHgub25Xb3JrZmxvd0Vycm9yKFxuICAgICAgICAgICAgICBuZXcgV29ya2Zsb3dTdXNwZW5zaW9uKGN0eC5pbnZvY2F0aW9uc1F1ZXVlLCBjdHguZ2xvYmFsVGhpcylcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuTm90Q29uc3VtZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudC5jb3JyZWxhdGlvbklkICE9PSBjb3JyZWxhdGlvbklkKSB7XG4gICAgICAgIC8vIFdlJ3JlIG5vdCBpbnRlcmVzdGVkIGluIHRoaXMgZXZlbnQgLSB0aGUgY29ycmVsYXRpb25JZCBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IGVudGl0eVxuICAgICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5Ob3RDb25zdW1lZDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXZlbnRUb2tlbiA9XG4gICAgICAgICdldmVudERhdGEnIGluIGV2ZW50ICYmIGV2ZW50LmV2ZW50RGF0YSAmJiAndG9rZW4nIGluIGV2ZW50LmV2ZW50RGF0YVxuICAgICAgICAgID8gZXZlbnQuZXZlbnREYXRhLnRva2VuXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgIGlmICh0eXBlb2YgZXZlbnRUb2tlbiA9PT0gJ3N0cmluZycgJiYgZXZlbnRUb2tlbiAhPT0gdG9rZW4pIHtcbiAgICAgICAgY3R4LnByb21pc2VRdWV1ZSA9IGN0eC5wcm9taXNlUXVldWUudGhlbigoKSA9PiB7XG4gICAgICAgICAgY3R4Lm9uV29ya2Zsb3dFcnJvcihcbiAgICAgICAgICAgIG5ldyBSZXBsYXlEaXZlcmdlbmNlRXJyb3IoXG4gICAgICAgICAgICAgIGBSZXBsYXkgZGl2ZXJnZW5jZTogaG9vayBldmVudCAke2V2ZW50LmV2ZW50VHlwZX0gZm9yICR7Y29ycmVsYXRpb25JZH0gYmVsb25ncyB0byB0b2tlbiBcIiR7ZXZlbnRUb2tlbn1cIiwgYnV0IHRoZSBjdXJyZW50IGhvb2sgY29uc3VtZXIgZXhwZWN0cyBcIiR7dG9rZW59XCJgLFxuICAgICAgICAgICAgICB7IGV2ZW50SWQ6IGV2ZW50LmV2ZW50SWQgfVxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5GaW5pc2hlZDtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgZm9yIGhvb2tfY3JlYXRlZCBldmVudCB0byBtYXJrIHRoaXMgaG9vayBhcyBhbHJlYWR5IGNyZWF0ZWRcbiAgICAgIGlmIChldmVudC5ldmVudFR5cGUgPT09ICdob29rX2NyZWF0ZWQnKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlSXRlbSA9IGN0eC5pbnZvY2F0aW9uc1F1ZXVlLmdldChjb3JyZWxhdGlvbklkKTtcbiAgICAgICAgaWYgKHF1ZXVlSXRlbSAmJiBxdWV1ZUl0ZW0udHlwZSA9PT0gJ2hvb2snKSB7XG4gICAgICAgICAgcXVldWVJdGVtLmhhc0NyZWF0ZWRFdmVudCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaGFzQ3JlYXRlZCA9IHRydWU7XG5cbiAgICAgICAgY29uc3QgcGVuZGluZ0dldENvbmZsaWN0UHJvbWlzZXMgPSBnZXRDb25mbGljdFByb21pc2VzLnNsaWNlKCk7XG4gICAgICAgIGdldENvbmZsaWN0UHJvbWlzZXMubGVuZ3RoID0gMDtcbiAgICAgICAgY3R4LnByb21pc2VRdWV1ZSA9IGN0eC5wcm9taXNlUXVldWUudGhlbigoKSA9PiB7XG4gICAgICAgICAgZm9yIChjb25zdCByZXNvbHZlciBvZiBwZW5kaW5nR2V0Q29uZmxpY3RQcm9taXNlcykge1xuICAgICAgICAgICAgcmVzb2x2ZXIucmVzb2x2ZShudWxsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0LkNvbnN1bWVkO1xuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgaG9va19jb25mbGljdCBldmVudCAtIGFub3RoZXIgd29ya2Zsb3cgaXMgdXNpbmcgdGhpcyB0b2tlblxuICAgICAgaWYgKGV2ZW50LmV2ZW50VHlwZSA9PT0gJ2hvb2tfY29uZmxpY3QnKSB7XG4gICAgICAgIC8vIFJlbW92ZSB0aGlzIGhvb2sgZnJvbSB0aGUgaW52b2NhdGlvbnMgcXVldWVcbiAgICAgICAgY3R4Lmludm9jYXRpb25zUXVldWUuZGVsZXRlKGNvcnJlbGF0aW9uSWQpO1xuXG4gICAgICAgIC8vIFN0b3JlIHRoZSBjb25mbGljdCBldmVudCBzbyB3ZSBjYW4gcmVqZWN0IGFueSBhd2FpdGVkIHByb21pc2VzLlxuICAgICAgICAvLyBDaGFpbiB0aHJvdWdoIHByb21pc2VRdWV1ZSB0byBlbnN1cmUgZGV0ZXJtaW5pc3RpYyBvcmRlcmluZy5cbiAgICAgICAgY29uc3QgY29uZmxpY3RFdmVudCA9IGV2ZW50IGFzIEhvb2tDb25mbGljdEV2ZW50O1xuICAgICAgICBjb25zdCBjb25mbGljdEVycm9yID0gbmV3IEhvb2tDb25mbGljdEVycm9yKFxuICAgICAgICAgIGNvbmZsaWN0RXZlbnQuZXZlbnREYXRhLnRva2VuLFxuICAgICAgICAgIGNvbmZsaWN0RXZlbnQuZXZlbnREYXRhLmNvbmZsaWN0aW5nUnVuSWRcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBNYXJrIHRoYXQgd2UgaGF2ZSBhIGNvbmZsaWN0IHNvIGZ1dHVyZSBhd2FpdHMgYWxzbyByZWplY3RcbiAgICAgICAgaGFzQ29uZmxpY3QgPSB0cnVlO1xuICAgICAgICBjb25mbGljdEVycm9yUmVmID0gY29uZmxpY3RFcnJvcjtcbiAgICAgICAgY29uZmxpY3RSdW5SZWYgPSBjcmVhdGVDb25mbGljdGluZ1J1bihcbiAgICAgICAgICBjdHgsXG4gICAgICAgICAgY29uZmxpY3RFdmVudC5ldmVudERhdGEuY29uZmxpY3RpbmdSdW5JZFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIENhcHR1cmUgYW5kIGRyYWluIHBlbmRpbmcgcHJvbWlzZXMgc3luY2hyb25vdXNseSBzbyB0aGUgbnVsbCBldmVudFxuICAgICAgICAvLyBoYW5kbGVyIHdvbid0IHNlZSB0aGVtIGFuZCB0cmlnZ2VyIGEgc3B1cmlvdXMgV29ya2Zsb3dTdXNwZW5zaW9uLlxuICAgICAgICAvLyBUaGUgYWN0dWFsIHNldHRsZW1lbnRzIGFyZSBkZWZlcnJlZCB0aHJvdWdoIHByb21pc2VRdWV1ZSBmb3JcbiAgICAgICAgLy8gb3JkZXJpbmcuIFBheWxvYWQgYXdhaXRlcnMgcmVqZWN0IHdpdGggSG9va0NvbmZsaWN0RXJyb3IsIHdoaWxlXG4gICAgICAgIC8vIGBnZXRDb25mbGljdGAgYXdhaXRlcnMgcmVzb2x2ZSB3aXRoIHRoZSBjb25mbGljdGluZyBydW4gc28gdGhlXG4gICAgICAgIC8vIHdvcmtmbG93IGNhbiBicmFuY2ggb24gdGhlIGNvbmZsaWN0IHdpdGhvdXQgdGhyb3dpbmcuIFdoZW4gbm9cbiAgICAgICAgLy8gcmVhbCBgUnVuYCBjYW4gYmUgY29uc3RydWN0ZWQgKHNlZSBgY3JlYXRlQ29uZmxpY3RpbmdSdW5gKSxcbiAgICAgICAgLy8gYGdldENvbmZsaWN0YCBhd2FpdGVycyByZWplY3Qgd2l0aCB0aGUgSG9va0NvbmZsaWN0RXJyb3IgaW5zdGVhZFxuICAgICAgICAvLyBvZiByZXNvbHZpbmcgd2l0aCBhIHZhbHVlIHRoYXQgZG9lc24ndCBob25vciB0aGUgYFJ1bmAgY29udHJhY3QuXG4gICAgICAgIGNvbnN0IHBlbmRpbmdQcm9taXNlcyA9IHByb21pc2VzLnNsaWNlKCk7XG4gICAgICAgIHByb21pc2VzLmxlbmd0aCA9IDA7XG4gICAgICAgIGNvbnN0IHBlbmRpbmdHZXRDb25mbGljdFByb21pc2VzID0gZ2V0Q29uZmxpY3RQcm9taXNlcy5zbGljZSgpO1xuICAgICAgICBnZXRDb25mbGljdFByb21pc2VzLmxlbmd0aCA9IDA7XG5cbiAgICAgICAgY3R4LnByb21pc2VRdWV1ZSA9IGN0eC5wcm9taXNlUXVldWUudGhlbigoKSA9PiB7XG4gICAgICAgICAgZm9yIChjb25zdCByZXNvbHZlciBvZiBwZW5kaW5nUHJvbWlzZXMpIHtcbiAgICAgICAgICAgIHJlc29sdmVyLnJlamVjdChjb25mbGljdEVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yIChjb25zdCByZXNvbHZlciBvZiBwZW5kaW5nR2V0Q29uZmxpY3RQcm9taXNlcykge1xuICAgICAgICAgICAgaWYgKGNvbmZsaWN0UnVuUmVmKSB7XG4gICAgICAgICAgICAgIHJlc29sdmVyLnJlc29sdmUoY29uZmxpY3RSdW5SZWYpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZXIucmVqZWN0KGNvbmZsaWN0RXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuQ29uc3VtZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudC5ldmVudFR5cGUgPT09ICdob29rX3JlY2VpdmVkJykge1xuICAgICAgICAvLyBSZWdpc3RlciBhICdob29rJyBkZWxpdmVyeSBiYXJyaWVyIGF0IHRoaXMgZXZlbnQncyBsb2cgaW5kZXggc28gYVxuICAgICAgICAvLyBsYXRlci1pbi1sb2cgYHdhaXRfY29tcGxldGVkYCBpcyBkZWxpdmVyZWQgb25seSBhZnRlciB0aGlzIGhvb2ssXG4gICAgICAgIC8vIGFuZCBzbyB0aGlzIGhvb2sgaXMgZGVsaXZlcmVkIG9ubHkgYWZ0ZXIgZXZlcnkgZWFybGllci1pbi1sb2dcbiAgICAgICAgLy8gYHdhaXRfY29tcGxldGVkYCDigJQga2VlcGluZyBhbnkgYFByb21pc2UucmFjZWAgYWdhaW5zdCBhIHdhaXRcbiAgICAgICAgLy8gZGV0ZXJtaW5pc3RpYyBhbmQgYWxpZ25lZCB3aXRoIHRoZSBjb21taXR0ZWQgZXZlbnQgbG9nLCByZWdhcmRsZXNzXG4gICAgICAgIC8vIG9mIG1pY3JvdGFzay1ob3AgY291bnQsIGh5ZHJhdGlvbiB0aW1lLCBvciByYWNlLWFyZ3VtZW50IG9yZGVyLlxuICAgICAgICAvLyBTZWUgYGN0eC5wZW5kaW5nRGVsaXZlcnlCYXJyaWVyc2AuXG4gICAgICAgIGNvbnN0IGV2ZW50SW5kZXggPSBjdHguZXZlbnRzQ29uc3VtZXIuZXZlbnRJbmRleDtcbiAgICAgICAgY29uc3QgYmFycmllciA9IHJlZ2lzdGVyRGVsaXZlcnlCYXJyaWVyKGN0eCwgZXZlbnRJbmRleCwgJ2hvb2snKTtcblxuICAgICAgICBpZiAocHJvbWlzZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IG5leHQgPSBwcm9taXNlcy5zaGlmdCgpO1xuICAgICAgICAgIGlmIChuZXh0KSB7XG4gICAgICAgICAgICAvLyBBIGNvbnN1bWVyIGlzIGFscmVhZHkgYXdhaXRpbmcuIEh5ZHJhdGUgdGhyb3VnaCBhIHByb21pc2VRdWV1ZVxuICAgICAgICAgICAgLy8gc2xvdCAoc28gYXN5bmMgZGVzZXJpYWxpemF0aW9uIHN0YXlzIGluIGV2ZW50LWxvZyBvcmRlciksIHRoZW5cbiAgICAgICAgICAgIC8vIGRlZmVyIGJlaGluZCBlYXJsaWVyIHdhaXRzIGJlZm9yZSByZXNvbHZpbmcuIFRoZSBkZWZlcnJhbCBydW5zXG4gICAgICAgICAgICAvLyBPRkYgdGhlIHNlcmlhbCBxdWV1ZSAoaXQgbWF5IHdhaXQgb24gYW4gZWFybGllciB3YWl0IGRlbGl2ZXJ5XG4gICAgICAgICAgICAvLyBhbmQgYmxvY2tpbmcgYSBxdWV1ZSBzbG90IG9uIHRoYXQgd291bGQgZGVhZGxvY2sgdGhlIHF1ZXVlKS5cbiAgICAgICAgICAgIGN0eC5wZW5kaW5nRGVsaXZlcmllcysrO1xuICAgICAgICAgICAgbGV0IGh5ZHJhdGVPdXRjb21lOlxuICAgICAgICAgICAgICB8IHsgb2s6IHRydWU7IHZhbHVlOiBUIH1cbiAgICAgICAgICAgICAgfCB7IG9rOiBmYWxzZTsgZXJyb3I6IHVua25vd24gfTtcbiAgICAgICAgICAgIGN0eC5wcm9taXNlUXVldWUgPSBjdHgucHJvbWlzZVF1ZXVlLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSBhd2FpdCBoeWRyYXRlU3RlcFJldHVyblZhbHVlKFxuICAgICAgICAgICAgICAgICAgZXZlbnQuZXZlbnREYXRhLnBheWxvYWQsXG4gICAgICAgICAgICAgICAgICBjdHgucnVuSWQsXG4gICAgICAgICAgICAgICAgICBjdHguZW5jcnlwdGlvbktleSxcbiAgICAgICAgICAgICAgICAgIGN0eC5nbG9iYWxUaGlzXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBoeWRyYXRlT3V0Y29tZSA9IHsgb2s6IHRydWUsIHZhbHVlOiBwYXlsb2FkIGFzIFQgfTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBoeWRyYXRlT3V0Y29tZSA9IHsgb2s6IGZhbHNlLCBlcnJvciB9O1xuICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIGN0eC5wZW5kaW5nRGVsaXZlcmllcy0tO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHZvaWQgYXdhaXRFYXJsaWVyRGVsaXZlcmllcyhjdHgsIGV2ZW50SW5kZXgsIFsnd2FpdCddKS50aGVuKFxuICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgIGJhcnJpZXIubWFya0RlbGl2ZXJlZCgpO1xuICAgICAgICAgICAgICAgICAgaWYgKGh5ZHJhdGVPdXRjb21lLm9rKSB7XG4gICAgICAgICAgICAgICAgICAgIG5leHQucmVzb2x2ZShoeWRyYXRlT3V0Y29tZS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBuZXh0LnJlamVjdChoeWRyYXRlT3V0Y29tZS5lcnJvcik7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE5vIGNvbnN1bWVyIGlzIGF3YWl0aW5nIHlldC4gSHlkcmF0ZSB0aHJvdWdoIGEgcHJvbWlzZVF1ZXVlIHNsb3RcbiAgICAgICAgICAvLyBhdCB0aGlzIGxvZyBwb3NpdGlvbiBhbmQgcGFyayB0aGUgT1VUQ09NRSAodmFsdWUgb3IgZXJyb3IpIGZvciBhXG4gICAgICAgICAgLy8gbGF0ZXIgYGl0ZXJhdG9yLm5leHQoKWAgLyBgYXdhaXQgaG9va2AgY2xhaW0uIFdlIGNhcHR1cmUgdGhlXG4gICAgICAgICAgLy8gb3V0Y29tZSByYXRoZXIgdGhhbiBlYWdlcmx5IHJlc29sdmluZy9yZWplY3RpbmcgYSBwcm9taXNlIG5vXG4gICAgICAgICAgLy8gY29uc3VtZXIgaGFzIGF0dGFjaGVkIHRvIOKAlCBhIHJlamVjdGVkIHVuY2xhaW1lZCBwcm9taXNlIChlLmcuIGFcbiAgICAgICAgICAvLyBidWZmZXJlZCBlbmNyeXB0ZWQgcGF5bG9hZCB3aXRoIG5vIGtleSkgd291bGQgb3RoZXJ3aXNlIHN1cmZhY2VcbiAgICAgICAgICAvLyBhcyBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uIGFuZCBjcmFzaCB0aGUgcHJvY2Vzcy4gYGNsYWltKClgIGJ1aWxkc1xuICAgICAgICAgIC8vIHRoZSBjb25zdW1lci1mYWNpbmcgcHJvbWlzZSBvbiBkZW1hbmQuXG4gICAgICAgICAgbGV0IG91dGNvbWU6XG4gICAgICAgICAgICB8IHsgb2s6IHRydWU7IHZhbHVlOiBUIH1cbiAgICAgICAgICAgIHwgeyBvazogZmFsc2U7IGVycm9yOiB1bmtub3duIH1cbiAgICAgICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgICAgIGNvbnN0IGh5ZHJhdGVkID0gd2l0aFJlc29sdmVyczx2b2lkPigpO1xuXG4gICAgICAgICAgY29uc3QgY2xhaW0gPSAoKTogUHJvbWlzZTxUPiA9PlxuICAgICAgICAgICAgaHlkcmF0ZWQucHJvbWlzZVxuICAgICAgICAgICAgICAudGhlbigoKSA9PiBhd2FpdEVhcmxpZXJEZWxpdmVyaWVzKGN0eCwgZXZlbnRJbmRleCwgWyd3YWl0J10pKVxuICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgYmFycmllci5tYXJrRGVsaXZlcmVkKCk7XG4gICAgICAgICAgICAgICAgaWYgKG91dGNvbWUgJiYgIW91dGNvbWUub2spIHtcbiAgICAgICAgICAgICAgICAgIHRocm93IG91dGNvbWUuZXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiAob3V0Y29tZSBhcyB7IG9rOiB0cnVlOyB2YWx1ZTogVCB9KS52YWx1ZTtcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjdHgucGVuZGluZ0RlbGl2ZXJpZXMrKztcbiAgICAgICAgICBjdHgucHJvbWlzZVF1ZXVlID0gY3R4LnByb21pc2VRdWV1ZS50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSBhd2FpdCBoeWRyYXRlU3RlcFJldHVyblZhbHVlKFxuICAgICAgICAgICAgICAgIGV2ZW50LmV2ZW50RGF0YS5wYXlsb2FkLFxuICAgICAgICAgICAgICAgIGN0eC5ydW5JZCxcbiAgICAgICAgICAgICAgICBjdHguZW5jcnlwdGlvbktleSxcbiAgICAgICAgICAgICAgICBjdHguZ2xvYmFsVGhpc1xuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBvdXRjb21lID0geyBvazogdHJ1ZSwgdmFsdWU6IHBheWxvYWQgYXMgVCB9O1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgb3V0Y29tZSA9IHsgb2s6IGZhbHNlLCBlcnJvciB9O1xuICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgY3R4LnBlbmRpbmdEZWxpdmVyaWVzLS07XG4gICAgICAgICAgICAgIGh5ZHJhdGVkLnJlc29sdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBwYXlsb2Fkc1F1ZXVlLnB1c2goeyBjbGFpbSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0LkNvbnN1bWVkO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQuZXZlbnRUeXBlID09PSAnaG9va19kaXNwb3NlZCcpIHtcbiAgICAgICAgLy8gVGVybWluYWwgc3RhdGUgLSByZW1vdmUgZnJvbSBxdWV1ZSAobGlrZSBzdGVwX2NvbXBsZXRlZC93YWl0X2NvbXBsZXRlZClcbiAgICAgICAgY3R4Lmludm9jYXRpb25zUXVldWUuZGVsZXRlKGNvcnJlbGF0aW9uSWQpO1xuICAgICAgICAvLyBNYXJrIHRoYXQgdGhlIGV2ZW50IGxvZyBjb25maXJtcyBkaXNwb3NhbCBoYXBwZW5lZFxuICAgICAgICBoYXNEaXNwb3NlZEV2ZW50ID0gdHJ1ZTtcbiAgICAgICAgLy8gV2UncmUgZG9uZSBwcm9jZXNzaW5nIGFueSBtb3JlIGV2ZW50cyBmb3IgdGhpcyBob29rXG4gICAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0LkZpbmlzaGVkO1xuICAgICAgfVxuXG4gICAgICAvLyBUaGlzIHJlcGxheSBpbnN0YWxsZWQgYSBkaWZmZXJlbnQgY29uc3VtZXIgdGhhbiB0aGUgc3RvcmVkIGV2ZW50IG5lZWRzLlxuICAgICAgY3R4LnByb21pc2VRdWV1ZSA9IGN0eC5wcm9taXNlUXVldWUudGhlbigoKSA9PiB7XG4gICAgICAgIGN0eC5vbldvcmtmbG93RXJyb3IoXG4gICAgICAgICAgbmV3IFJlcGxheURpdmVyZ2VuY2VFcnJvcihcbiAgICAgICAgICAgIGBSZXBsYXkgZGl2ZXJnZW5jZTogVW5leHBlY3RlZCBldmVudCB0eXBlIGZvciBob29rICR7Y29ycmVsYXRpb25JZH0gKHRva2VuOiAke3Rva2VufSkgXCIke2V2ZW50LmV2ZW50VHlwZX1cImAsXG4gICAgICAgICAgICB7IGV2ZW50SWQ6IGV2ZW50LmV2ZW50SWQgfVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuRmluaXNoZWQ7XG4gICAgfSk7XG5cbiAgICAvLyBUcmFjayBpZiB0aGUgaG9vayBoYXMgYmVlbiBkaXNwb3NlZFxuICAgIGxldCBpc0Rpc3Bvc2VkID0gZmFsc2U7XG5cbiAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEgbmV3IHByb21pc2UgdGhhdCB3YWl0cyBmb3IgdGhlIG5leHQgaG9vayBwYXlsb2FkXG4gICAgZnVuY3Rpb24gY3JlYXRlSG9va1Byb21pc2UoKTogUHJvbWlzZTxUPiB7XG4gICAgICBjb25zdCByZXNvbHZlcnMgPSB3aXRoUmVzb2x2ZXJzPFQ+KCk7XG5cbiAgICAgIC8vIElmIHdlIGhhdmUgYSBjb25mbGljdCwgcmVqZWN0IHRocm91Z2ggdGhlIHByb21pc2VRdWV1ZSB0byBtYWludGFpblxuICAgICAgLy8gZGV0ZXJtaW5pc3RpYyBvcmRlcmluZyB3aXRoIGFueSBwcmlvciBxdWV1ZWQgcmVzb2x1dGlvbnMuXG4gICAgICBpZiAoaGFzQ29uZmxpY3QgJiYgY29uZmxpY3RFcnJvclJlZikge1xuICAgICAgICBjdHgucHJvbWlzZVF1ZXVlID0gY3R4LnByb21pc2VRdWV1ZS50aGVuKCgpID0+IHtcbiAgICAgICAgICByZXNvbHZlcnMucmVqZWN0KGNvbmZsaWN0RXJyb3JSZWYpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVycy5wcm9taXNlO1xuICAgICAgfVxuXG4gICAgICBpZiAocGF5bG9hZHNRdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IG5leHREZWxpdmVyeSA9IHBheWxvYWRzUXVldWUuc2hpZnQoKTtcbiAgICAgICAgaWYgKG5leHREZWxpdmVyeSkge1xuICAgICAgICAgIC8vIFRoZSBwYXlsb2FkIHdhcyBoeWRyYXRlZCB0aHJvdWdoIGEgcHJvbWlzZVF1ZXVlIHNsb3QgYXQgaXRzIGxvZ1xuICAgICAgICAgIC8vIHBvc2l0aW9uIChidWZmZXJpbmcgYnJhbmNoIGFib3ZlKS4gYGNsYWltKClgIGJ1aWxkcyB0aGVcbiAgICAgICAgICAvLyBjb25zdW1lci1mYWNpbmcgcHJvbWlzZSBmcm9tIHRoYXQgb3V0Y29tZSwgZGVmZXJyaW5nIGJlaGluZCBhbnlcbiAgICAgICAgICAvLyBlYXJsaWVyLWluLWxvZyB3YWl0IGFuZCBtYXJraW5nIHRoaXMgaG9vayBkZWxpdmVyZWQg4oCUIHNvXG4gICAgICAgICAgLy8gcmVzb2x1dGlvbiBvcmRlciBzdGF5cyBhbmNob3JlZCB0byB0aGUgZXZlbnQgbG9nLCBub3QgdGhpcyBsYXRlclxuICAgICAgICAgIC8vIGNsYWltIHNpdGUuXG4gICAgICAgICAgcmV0dXJuIG5leHREZWxpdmVyeS5jbGFpbSgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudExvZ0VtcHR5KSB7XG4gICAgICAgIHNjaGVkdWxlV2hlbklkbGUoY3R4LCAoKSA9PiB7XG4gICAgICAgICAgY3R4Lm9uV29ya2Zsb3dFcnJvcihcbiAgICAgICAgICAgIG5ldyBXb3JrZmxvd1N1c3BlbnNpb24oY3R4Lmludm9jYXRpb25zUXVldWUsIGN0eC5nbG9iYWxUaGlzKVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBwcm9taXNlcy5wdXNoKHJlc29sdmVycyk7XG5cbiAgICAgIHJldHVybiByZXNvbHZlcnMucHJvbWlzZTtcbiAgICB9XG5cbiAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGhvb2snc1xuICAgIC8vIHJlZ2lzdHJhdGlvbiBvdXRjb21lOiB0aGUgY29uZmxpY3RpbmcgYFJ1bmAgd2hlbiB0aGUgdG9rZW4gaXMgb3duZWRcbiAgICAvLyBieSBhbm90aGVyIGFjdGl2ZSBob29rLCBgbnVsbGAgb25jZSB0aGlzIGhvb2sncyByZWdpc3RyYXRpb24gaXNcbiAgICAvLyBjb21taXR0ZWQuIEJvdGggZmFzdC1wYXRocyBzZXR0bGUgdGhyb3VnaCBgY3R4LnByb21pc2VRdWV1ZWAgc29cbiAgICAvLyByZXNvbHV0aW9uIG9yZGVyIGFsd2F5cyBtYXRjaGVzIGV2ZW50LWxvZyBvcmRlci5cbiAgICBmdW5jdGlvbiBjcmVhdGVHZXRDb25mbGljdFByb21pc2UoKTogUHJvbWlzZTxSdW48dW5rbm93bj4gfCBudWxsPiB7XG4gICAgICBjb25zdCByZXNvbHZlcnMgPSB3aXRoUmVzb2x2ZXJzPFJ1bjx1bmtub3duPiB8IG51bGw+KCk7XG5cbiAgICAgIGlmIChoYXNDcmVhdGVkKSB7XG4gICAgICAgIGN0eC5wcm9taXNlUXVldWUgPSBjdHgucHJvbWlzZVF1ZXVlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHJlc29sdmVycy5yZXNvbHZlKG51bGwpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVycy5wcm9taXNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoaGFzQ29uZmxpY3QpIHtcbiAgICAgICAgY3R4LnByb21pc2VRdWV1ZSA9IGN0eC5wcm9taXNlUXVldWUudGhlbigoKSA9PiB7XG4gICAgICAgICAgaWYgKGNvbmZsaWN0UnVuUmVmKSB7XG4gICAgICAgICAgICByZXNvbHZlcnMucmVzb2x2ZShjb25mbGljdFJ1blJlZik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc29sdmVycy5yZWplY3QoY29uZmxpY3RFcnJvclJlZik7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVycy5wcm9taXNlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBxdWV1ZUl0ZW0gPSBjdHguaW52b2NhdGlvbnNRdWV1ZS5nZXQoY29ycmVsYXRpb25JZCk7XG4gICAgICBpZiAocXVldWVJdGVtICYmIHF1ZXVlSXRlbS50eXBlID09PSAnaG9vaycpIHtcbiAgICAgICAgcXVldWVJdGVtLmhhc0NvbmZsaWN0QXdhaXRlciA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudExvZ0VtcHR5KSB7XG4gICAgICAgIHNjaGVkdWxlV2hlbklkbGUoY3R4LCAoKSA9PiB7XG4gICAgICAgICAgY3R4Lm9uV29ya2Zsb3dFcnJvcihcbiAgICAgICAgICAgIG5ldyBXb3JrZmxvd1N1c3BlbnNpb24oY3R4Lmludm9jYXRpb25zUXVldWUsIGN0eC5nbG9iYWxUaGlzKVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBnZXRDb25mbGljdFByb21pc2VzLnB1c2gocmVzb2x2ZXJzKTtcbiAgICAgIHJldHVybiByZXNvbHZlcnMucHJvbWlzZTtcbiAgICB9XG5cbiAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZGlzcG9zZSB0aGUgaG9va1xuICAgIGZ1bmN0aW9uIGRpc3Bvc2VIb29rKCk6IHZvaWQge1xuICAgICAgaWYgKGlzRGlzcG9zZWQpIHtcbiAgICAgICAgcmV0dXJuOyAvLyBBbHJlYWR5IGRpc3Bvc2VkLCBub3RoaW5nIHRvIGRvXG4gICAgICB9XG4gICAgICBpc0Rpc3Bvc2VkID0gdHJ1ZTtcblxuICAgICAgLy8gSWYgdGhlIGV2ZW50IGxvZyBhbHJlYWR5IGNvbnRhaW5zIGhvb2tfZGlzcG9zZWQsIHRoaXMgaXMgYSByZXBsYXkg4oCUIG5vLW9wXG4gICAgICBpZiAoaGFzRGlzcG9zZWRFdmVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCBkaXNwb3NlZCBmbGFnIG9uIHRoZSBleGlzdGluZyBxdWV1ZSBpdGVtXG4gICAgICBjb25zdCBxdWV1ZUl0ZW0gPSBjdHguaW52b2NhdGlvbnNRdWV1ZS5nZXQoY29ycmVsYXRpb25JZCk7XG4gICAgICBpZiAocXVldWVJdGVtICYmIHF1ZXVlSXRlbS50eXBlID09PSAnaG9vaycpIHtcbiAgICAgICAgcXVldWVJdGVtLmRpc3Bvc2VkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gRHJhaW4gYW55IHBlbmRpbmcgcHJvbWlzZXMgdGhhdCBhcmUgd2FpdGluZyBmb3IgcGF5bG9hZHMuXG4gICAgICAvLyBXaXRob3V0IHRoaXMsIHByb21pc2VzIGNyZWF0ZWQgYnkgYGF3YWl0IGhvb2tgIG9yIHRoZSBhc3luYyBpdGVyYXRvcidzXG4gICAgICAvLyBgeWllbGQgYXdhaXQgdGhpc2Agd291bGQgaGFuZyBmb3JldmVyIHNpbmNlIHRoZSBldmVudCBjb25zdW1lciB3aWxsXG4gICAgICAvLyBuZXZlciBkZWxpdmVyIGFub3RoZXIgaG9va19yZWNlaXZlZCBhZnRlciBkaXNwb3NhbC5cbiAgICAgIGlmIChwcm9taXNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHByb21pc2VzLmxlbmd0aCA9IDA7XG4gICAgICAgIHNjaGVkdWxlV2hlbklkbGUoY3R4LCAoKSA9PiB7XG4gICAgICAgICAgY3R4Lm9uV29ya2Zsb3dFcnJvcihcbiAgICAgICAgICAgIG5ldyBXb3JrZmxvd1N1c3BlbnNpb24oY3R4Lmludm9jYXRpb25zUXVldWUsIGN0eC5nbG9iYWxUaGlzKVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB3ZWJob29rTG9nZ2VyLmRlYnVnKCdIb29rIGRpc3Bvc2VkJywgeyBjb3JyZWxhdGlvbklkLCB0b2tlbiB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBob29rOiBIb29rPFQ+ID0ge1xuICAgICAgdG9rZW4sXG5cbiAgICAgIGdldENvbmZsaWN0KCk6IFByb21pc2U8UnVuPHVua25vd24+IHwgbnVsbD4ge1xuICAgICAgICByZXR1cm4gY3JlYXRlR2V0Q29uZmxpY3RQcm9taXNlKCk7XG4gICAgICB9LFxuXG4gICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vVGhlblByb3BlcnR5OiBJbnRlbnRpb25hbGx5IHRoZW5hYmxlXG4gICAgICB0aGVuPFRSZXN1bHQxID0gVCwgVFJlc3VsdDIgPSBuZXZlcj4oXG4gICAgICAgIG9uZnVsZmlsbGVkPzogKCh2YWx1ZTogVCkgPT4gVFJlc3VsdDEgfCBQcm9taXNlTGlrZTxUUmVzdWx0MT4pIHwgbnVsbCxcbiAgICAgICAgb25yZWplY3RlZD86ICgocmVhc29uOiBhbnkpID0+IFRSZXN1bHQyIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDI+KSB8IG51bGxcbiAgICAgICk6IFByb21pc2U8VFJlc3VsdDEgfCBUUmVzdWx0Mj4ge1xuICAgICAgICByZXR1cm4gY3JlYXRlSG9va1Byb21pc2UoKS50aGVuKG9uZnVsZmlsbGVkLCBvbnJlamVjdGVkKTtcbiAgICAgIH0sXG5cbiAgICAgIC8vIFN1cHBvcnQgYGZvciBhd2FpdCAoY29uc3QgcGF5bG9hZCBvZiBob29rKSB7IOKApiB9YCBzeW50YXhcbiAgICAgIGFzeW5jICpbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xuICAgICAgICB3aGlsZSAoIWlzRGlzcG9zZWQpIHtcbiAgICAgICAgICB5aWVsZCBhd2FpdCB0aGlzO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICBkaXNwb3NlOiBkaXNwb3NlSG9vayxcblxuICAgICAgW1N5bWJvbC5kaXNwb3NlXTogZGlzcG9zZUhvb2ssXG4gICAgfTtcblxuICAgIC8vIEFsc28gcmVnaXN0ZXIgd2l0aCB0aGUgVk0ncyBTeW1ib2wuZGlzcG9zZSBzbyBgdXNpbmdgIHdvcmtzIGluc2lkZVxuICAgIC8vIHRoZSB3b3JrZmxvdyBzYW5kYm94ICh0aGUgVk0gbWF5IGhhdmUgYSBwb2x5ZmlsbGVkIFN5bWJvbC5kaXNwb3NlXG4gICAgLy8gdGhhdCBkaWZmZXJzIGZyb20gdGhlIGhvc3QncykuXG4gICAgY29uc3Qgdm1EaXNwb3NlID0gY3R4Lmdsb2JhbFRoaXMuU3ltYm9sLmRpc3Bvc2U7XG4gICAgaWYgKHZtRGlzcG9zZSAmJiB2bURpc3Bvc2UgIT09IFN5bWJvbC5kaXNwb3NlKSB7XG4gICAgICAoaG9vayBhcyBhbnkpW3ZtRGlzcG9zZV0gPSBkaXNwb3NlSG9vaztcbiAgICB9XG5cbiAgICByZXR1cm4gaG9vaztcbiAgfTtcbn1cbiJdfQ==
|
package/dist/workflow/index.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ export { sleep } from '../sleep.js';
|
|
|
5
5
|
export { createHook, createWebhook } from './create-hook.js';
|
|
6
6
|
export { defineHook } from './define-hook.js';
|
|
7
7
|
export { getWorkflowMetadata } from './get-workflow-metadata.js';
|
|
8
|
+
export { experimental_setAttributes, type SetAttributesOptions, setAttributes, } from './set-attributes.js';
|
|
8
9
|
export { getWritable } from './writable-stream.js';
|
|
9
10
|
export declare function getStepMetadata(): StepMetadata;
|
|
10
11
|
export declare function resumeHook(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/workflow/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/workflow/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAEjE,OAAO,EACL,UAAU,EACV,cAAc,EACd,KAAK,qBAAqB,GAC3B,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EACL,0BAA0B,EAC1B,KAAK,oBAAoB,EACzB,aAAa,GACd,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAInD,wBAAgB,eAAe,IAAI,YAAY,CAM9C;AACD,wBAAgB,UAAU,SAMzB"}
|
package/dist/workflow/index.js
CHANGED
|
@@ -1,15 +1,17 @@
|
|
|
1
|
+
import { throwNotInStepContext, throwUnavailableInWorkflowContext, } from '../context-errors.js';
|
|
1
2
|
export { FatalError, RetryableError, } from '@workflow/errors';
|
|
2
3
|
export { sleep } from '../sleep.js';
|
|
3
4
|
export { createHook, createWebhook } from './create-hook.js';
|
|
4
5
|
export { defineHook } from './define-hook.js';
|
|
5
6
|
export { getWorkflowMetadata } from './get-workflow-metadata.js';
|
|
7
|
+
export { experimental_setAttributes, setAttributes, } from './set-attributes.js';
|
|
6
8
|
export { getWritable } from './writable-stream.js';
|
|
7
9
|
// workflows can't use these functions, but we still need to provide
|
|
8
10
|
// the export so bundling doesn't fail when step and workflow are in same file
|
|
9
11
|
export function getStepMetadata() {
|
|
10
|
-
|
|
12
|
+
throwNotInStepContext('getStepMetadata()', 'https://workflow-sdk.dev/docs/api-reference/workflow/get-step-metadata', getStepMetadata);
|
|
11
13
|
}
|
|
12
14
|
export function resumeHook() {
|
|
13
|
-
|
|
15
|
+
throwUnavailableInWorkflowContext('resumeHook()', 'https://workflow-sdk.dev/docs/api-reference/workflow-api/resume-hook', resumeHook);
|
|
14
16
|
}
|
|
15
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd29ya2Zsb3cvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHFCQUFxQixFQUNyQixpQ0FBaUMsR0FDbEMsTUFBTSxzQkFBc0IsQ0FBQztBQUc5QixPQUFPLEVBQ0wsVUFBVSxFQUNWLGNBQWMsR0FFZixNQUFNLGtCQUFrQixDQUFDO0FBRTFCLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDcEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDOUMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDakUsT0FBTyxFQUNMLDBCQUEwQixFQUUxQixhQUFhLEdBQ2QsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFbkQsb0VBQW9FO0FBQ3BFLDhFQUE4RTtBQUM5RSxNQUFNLFVBQVUsZUFBZTtJQUM3QixxQkFBcUIsQ0FDbkIsbUJBQW1CLEVBQ25CLHdFQUF3RSxFQUN4RSxlQUFlLENBQ2hCLENBQUM7QUFDSixDQUFDO0FBQ0QsTUFBTSxVQUFVLFVBQVU7SUFDeEIsaUNBQWlDLENBQy9CLGNBQWMsRUFDZCxzRUFBc0UsRUFDdEUsVUFBVSxDQUNYLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgdGhyb3dOb3RJblN0ZXBDb250ZXh0LFxuICB0aHJvd1VuYXZhaWxhYmxlSW5Xb3JrZmxvd0NvbnRleHQsXG59IGZyb20gJy4uL2NvbnRleHQtZXJyb3JzLmpzJztcbmltcG9ydCB0eXBlIHsgU3RlcE1ldGFkYXRhIH0gZnJvbSAnLi4vc3RlcC9nZXQtc3RlcC1tZXRhZGF0YS5qcyc7XG5cbmV4cG9ydCB7XG4gIEZhdGFsRXJyb3IsXG4gIFJldHJ5YWJsZUVycm9yLFxuICB0eXBlIFJldHJ5YWJsZUVycm9yT3B0aW9ucyxcbn0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5leHBvcnQgdHlwZSB7IEhvb2ssIEhvb2tPcHRpb25zIH0gZnJvbSAnLi4vY3JlYXRlLWhvb2suanMnO1xuZXhwb3J0IHsgc2xlZXAgfSBmcm9tICcuLi9zbGVlcC5qcyc7XG5leHBvcnQgeyBjcmVhdGVIb29rLCBjcmVhdGVXZWJob29rIH0gZnJvbSAnLi9jcmVhdGUtaG9vay5qcyc7XG5leHBvcnQgeyBkZWZpbmVIb29rIH0gZnJvbSAnLi9kZWZpbmUtaG9vay5qcyc7XG5leHBvcnQgeyBnZXRXb3JrZmxvd01ldGFkYXRhIH0gZnJvbSAnLi9nZXQtd29ya2Zsb3ctbWV0YWRhdGEuanMnO1xuZXhwb3J0IHtcbiAgZXhwZXJpbWVudGFsX3NldEF0dHJpYnV0ZXMsXG4gIHR5cGUgU2V0QXR0cmlidXRlc09wdGlvbnMsXG4gIHNldEF0dHJpYnV0ZXMsXG59IGZyb20gJy4vc2V0LWF0dHJpYnV0ZXMuanMnO1xuZXhwb3J0IHsgZ2V0V3JpdGFibGUgfSBmcm9tICcuL3dyaXRhYmxlLXN0cmVhbS5qcyc7XG5cbi8vIHdvcmtmbG93cyBjYW4ndCB1c2UgdGhlc2UgZnVuY3Rpb25zLCBidXQgd2Ugc3RpbGwgbmVlZCB0byBwcm92aWRlXG4vLyB0aGUgZXhwb3J0IHNvIGJ1bmRsaW5nIGRvZXNuJ3QgZmFpbCB3aGVuIHN0ZXAgYW5kIHdvcmtmbG93IGFyZSBpbiBzYW1lIGZpbGVcbmV4cG9ydCBmdW5jdGlvbiBnZXRTdGVwTWV0YWRhdGEoKTogU3RlcE1ldGFkYXRhIHtcbiAgdGhyb3dOb3RJblN0ZXBDb250ZXh0KFxuICAgICdnZXRTdGVwTWV0YWRhdGEoKScsXG4gICAgJ2h0dHBzOi8vd29ya2Zsb3ctc2RrLmRldi9kb2NzL2FwaS1yZWZlcmVuY2Uvd29ya2Zsb3cvZ2V0LXN0ZXAtbWV0YWRhdGEnLFxuICAgIGdldFN0ZXBNZXRhZGF0YVxuICApO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlc3VtZUhvb2soKSB7XG4gIHRocm93VW5hdmFpbGFibGVJbldvcmtmbG93Q29udGV4dChcbiAgICAncmVzdW1lSG9vaygpJyxcbiAgICAnaHR0cHM6Ly93b3JrZmxvdy1zZGsuZGV2L2RvY3MvYXBpLXJlZmVyZW5jZS93b3JrZmxvdy1hcGkvcmVzdW1lLWhvb2snLFxuICAgIHJlc3VtZUhvb2tcbiAgKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Options accepted by `setAttributes`.
|
|
3
|
+
*/
|
|
4
|
+
export interface SetAttributesOptions {
|
|
5
|
+
/**
|
|
6
|
+
* Permit attribute keys that start with the reserved `$` prefix.
|
|
7
|
+
* **Default: `false`.**
|
|
8
|
+
*
|
|
9
|
+
* The `$` namespace is reserved for framework and library code that
|
|
10
|
+
* is built on top of the workflow SDK (telemetry, agent metadata,
|
|
11
|
+
* platform-emitted tags, etc.). User code MUST NOT write keys in
|
|
12
|
+
* this namespace; validation rejects them so accidental collisions
|
|
13
|
+
* with tooling-owned keys can't slip through.
|
|
14
|
+
*
|
|
15
|
+
* Only flip this to `true` if your caller is itself a framework or
|
|
16
|
+
* library that owns a `$`-prefixed sub-namespace and knows the
|
|
17
|
+
* conventions of any other tools writing into it. Misuse can
|
|
18
|
+
* conflict with observability surfaces, agent dashboards, or future
|
|
19
|
+
* platform features that rely on the reserved namespace.
|
|
20
|
+
*/
|
|
21
|
+
allowReservedAttributes?: boolean;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* @deprecated Use {@link SetAttributesOptions} instead.
|
|
25
|
+
*/
|
|
26
|
+
export type ExperimentalSetAttributesOptions = SetAttributesOptions;
|
|
27
|
+
/**
|
|
28
|
+
* Attach plaintext string key/value metadata to the current workflow run.
|
|
29
|
+
*
|
|
30
|
+
* Callable only from a workflow body (`'use workflow'`). The call is
|
|
31
|
+
* dispatched as a native `attr_set` event and materialized on the run.
|
|
32
|
+
*
|
|
33
|
+
* Validation runs in the VM (cheap, deterministic) before event
|
|
34
|
+
* dispatch - violations throw `FatalError` without writing an event. An
|
|
35
|
+
* empty record is a no-op. `value: undefined` removes the key from the
|
|
36
|
+
* run's attribute map.
|
|
37
|
+
*
|
|
38
|
+
* **Reserved namespace.** Keys starting with `$` are reserved for
|
|
39
|
+
* framework/library code (telemetry, agent metadata, etc.). User code
|
|
40
|
+
* trying to write a `$`-prefixed key throws `FatalError`. If you are a
|
|
41
|
+
* framework author and need to set a reserved key, pass
|
|
42
|
+
* `{ allowReservedAttributes: true }` as the second argument — see
|
|
43
|
+
* `SetAttributesOptions` for the trade-offs.
|
|
44
|
+
*
|
|
45
|
+
* **WARNING**: Calling e.g.
|
|
46
|
+
* `Promise.all([setAttributes({ a: '1' }), setAttributes({ a: '2' })])`
|
|
47
|
+
* is not guaranteed to be ordered consistently, but the equivalent
|
|
48
|
+
* sequential `.then()` chain is.
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* ```ts
|
|
52
|
+
* import { setAttributes } from 'workflow';
|
|
53
|
+
*
|
|
54
|
+
* export async function myWorkflow() {
|
|
55
|
+
* 'use workflow';
|
|
56
|
+
* await setAttributes({ phase: 'init' });
|
|
57
|
+
* // ... work ...
|
|
58
|
+
* await setAttributes({ phase: 'done', orderId: 'ord_123' });
|
|
59
|
+
* await setAttributes({ orderId: undefined }); // remove
|
|
60
|
+
* }
|
|
61
|
+
* ```
|
|
62
|
+
*
|
|
63
|
+
* @example Framework / library code writing into the reserved namespace.
|
|
64
|
+
* ```ts
|
|
65
|
+
* await setAttributes(
|
|
66
|
+
* { '$agent.kind': 'durable-agent' },
|
|
67
|
+
* { allowReservedAttributes: true }
|
|
68
|
+
* );
|
|
69
|
+
* ```
|
|
70
|
+
*/
|
|
71
|
+
export declare function setAttributes(attrs: Record<string, string | undefined>, options?: SetAttributesOptions): Promise<void>;
|
|
72
|
+
/**
|
|
73
|
+
* @deprecated The feature is no longer experimental — use
|
|
74
|
+
* {@link setAttributes} instead.
|
|
75
|
+
*/
|
|
76
|
+
export declare const experimental_setAttributes: typeof setAttributes;
|
|
77
|
+
//# sourceMappingURL=set-attributes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set-attributes.d.ts","sourceRoot":"","sources":["../../src/workflow/set-attributes.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;;;;;;;;;;;;;OAeG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC;AAED;;GAEG;AACH,MAAM,MAAM,gCAAgC,GAAG,oBAAoB,CAAC;AAEpE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EACzC,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,IAAI,CAAC,CAsBf;AAED;;;GAGG;AACH,eAAO,MAAM,0BAA0B,sBAAgB,CAAC"}
|