@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,417 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Common reducers and revivers for types shared across all serialization modes.
|
|
3
|
+
*
|
|
4
|
+
* Handles: ArrayBuffer, BigInt, typed arrays, Date, Error, Headers, Map, Set,
|
|
5
|
+
* RegExp, Request, Response, URL, URLSearchParams.
|
|
6
|
+
*
|
|
7
|
+
* Note: Uses Node.js Buffer for base64 encoding/decoding. For environments
|
|
8
|
+
* without Buffer (e.g. QuickJS VM), a polyfill or alternative base64
|
|
9
|
+
* implementation will be needed.
|
|
10
|
+
*/
|
|
11
|
+
import { types } from 'node:util';
|
|
12
|
+
import { FatalError, HookConflictError, RetryableError, RuntimeDecryptionError, } from '@workflow/errors';
|
|
13
|
+
// ---- Base64 helpers ----
|
|
14
|
+
function arrayBufferToBase64(value, offset, length) {
|
|
15
|
+
// Avoid returning falsy value for zero-length buffers
|
|
16
|
+
if (length === 0)
|
|
17
|
+
return '.';
|
|
18
|
+
// Create a proper copy to avoid ArrayBuffer detachment issues
|
|
19
|
+
const uint8 = new Uint8Array(value, offset, length);
|
|
20
|
+
return Buffer.from(uint8).toString('base64');
|
|
21
|
+
}
|
|
22
|
+
function viewToBase64(value) {
|
|
23
|
+
return arrayBufferToBase64(value.buffer, value.byteOffset, value.byteLength);
|
|
24
|
+
}
|
|
25
|
+
function reviveArrayBuffer(value, global) {
|
|
26
|
+
const base64 = value === '.' ? '' : value;
|
|
27
|
+
const buffer = Buffer.from(base64, 'base64');
|
|
28
|
+
const arrayBuffer = new global.ArrayBuffer(buffer.length);
|
|
29
|
+
const uint8Array = new global.Uint8Array(arrayBuffer);
|
|
30
|
+
uint8Array.set(buffer);
|
|
31
|
+
return arrayBuffer;
|
|
32
|
+
}
|
|
33
|
+
function revive(str) {
|
|
34
|
+
// devalue.stringify() always produces valid JSON: special values
|
|
35
|
+
// (undefined, NaN, Infinity, -0) are encoded as negative integer
|
|
36
|
+
// sentinels and the remaining structure is ordinary JSON. Parsing
|
|
37
|
+
// with JSON.parse yields the flattened form that unflatten() expects.
|
|
38
|
+
return JSON.parse(str);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Reduces any native Error instance to the shared `BaseErrorPayload` shape,
|
|
42
|
+
* preserving `cause` only when present (to distinguish "no cause" from
|
|
43
|
+
* "cause is undefined"). Used directly by reducers for subclasses that need
|
|
44
|
+
* to extend the shape with additional fields.
|
|
45
|
+
*
|
|
46
|
+
* `types.isNativeError()` is used instead of `instanceof` for cross-VM safety:
|
|
47
|
+
* errors may originate from a different VM context, and `instanceof` fails
|
|
48
|
+
* across VM boundaries since each context has its own Error constructor.
|
|
49
|
+
*/
|
|
50
|
+
function reduceErrorBase(value) {
|
|
51
|
+
if (!types.isNativeError(value))
|
|
52
|
+
return false;
|
|
53
|
+
const reduced = {
|
|
54
|
+
message: value.message,
|
|
55
|
+
stack: value.stack,
|
|
56
|
+
};
|
|
57
|
+
if ('cause' in value)
|
|
58
|
+
reduced.cause = value.cause;
|
|
59
|
+
return reduced;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Reduces a native error to the shared `BaseErrorPayload`, but only when its
|
|
63
|
+
* `name` instance property matches `subclassName`. Used by:
|
|
64
|
+
* - `makeErrorSubclassReducer`, for subclasses whose serialized shape is
|
|
65
|
+
* exactly `BaseErrorPayload`.
|
|
66
|
+
* - Inline reducers for subclasses that extend the shape with additional
|
|
67
|
+
* fields (e.g. `AggregateError.errors`, `RetryableError.retryAfter`).
|
|
68
|
+
*
|
|
69
|
+
* Matching by `value.name` (instead of `value.constructor?.name`) is robust
|
|
70
|
+
* to bundlers that emit the class as an anonymous expression — e.g. Turbopack
|
|
71
|
+
* compiles `export class FatalError extends Error {…}` to a registration call
|
|
72
|
+
* like `e.s(["FatalError", 0, class extends Error {…}])`, and the resulting
|
|
73
|
+
* constructor has `name === ''`. Since every Error subclass we care about
|
|
74
|
+
* sets `this.name` explicitly in its constructor (built-in subclasses do this
|
|
75
|
+
* automatically; `FatalError`/`RetryableError` do it in user code), the
|
|
76
|
+
* instance property is the reliable identity marker across realms and
|
|
77
|
+
* bundlers.
|
|
78
|
+
*/
|
|
79
|
+
function reduceNamedErrorSubclassBase(subclassName, value) {
|
|
80
|
+
if (!types.isNativeError(value))
|
|
81
|
+
return false;
|
|
82
|
+
if (value.name !== subclassName)
|
|
83
|
+
return false;
|
|
84
|
+
return reduceErrorBase(value);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Creates a reducer for a built-in Error subclass whose serialized shape is
|
|
88
|
+
* exactly `BaseErrorPayload` (no extra fields). The reducer matches by
|
|
89
|
+
* constructor name (after the isNativeError gate), since `instanceof` may
|
|
90
|
+
* fail across VM boundaries.
|
|
91
|
+
*/
|
|
92
|
+
function makeErrorSubclassReducer(subclassName) {
|
|
93
|
+
return (value) => {
|
|
94
|
+
const base = reduceNamedErrorSubclassBase(subclassName, value);
|
|
95
|
+
if (!base)
|
|
96
|
+
return false;
|
|
97
|
+
return base;
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Creates a reviver for a built-in Error subclass. Reconstructs the correct
|
|
102
|
+
* built-in Error type using the context's constructor. The `cause` option is
|
|
103
|
+
* only passed when the serialized data includes it, preserving the distinction
|
|
104
|
+
* between "no cause" and "cause is undefined".
|
|
105
|
+
*/
|
|
106
|
+
function makeErrorSubclassReviver(global, ctorName) {
|
|
107
|
+
return (value) => {
|
|
108
|
+
const v = value;
|
|
109
|
+
const opts = 'cause' in v ? { cause: v.cause } : undefined;
|
|
110
|
+
const Ctor = global[ctorName];
|
|
111
|
+
const error = new Ctor(v.message, opts);
|
|
112
|
+
if (v.stack !== undefined)
|
|
113
|
+
error.stack = v.stack;
|
|
114
|
+
return error;
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
// ---- Reducers ----
|
|
118
|
+
export function getCommonReducers(global = globalThis) {
|
|
119
|
+
return {
|
|
120
|
+
ArrayBuffer: (value) => value instanceof global.ArrayBuffer &&
|
|
121
|
+
arrayBufferToBase64(value, 0, value.byteLength),
|
|
122
|
+
BigInt: (value) => typeof value === 'bigint' && value.toString(),
|
|
123
|
+
BigInt64Array: (value) => value instanceof global.BigInt64Array && viewToBase64(value),
|
|
124
|
+
BigUint64Array: (value) => value instanceof global.BigUint64Array && viewToBase64(value),
|
|
125
|
+
Date: (value) => {
|
|
126
|
+
if (!(value instanceof global.Date))
|
|
127
|
+
return false;
|
|
128
|
+
const valid = !Number.isNaN(value.getDate());
|
|
129
|
+
return valid ? value.toISOString() : '.';
|
|
130
|
+
},
|
|
131
|
+
// DOMException is a special case: it `instanceof Error` is true in Node,
|
|
132
|
+
// but `types.isNativeError()` returns FALSE for it, so the generic Error
|
|
133
|
+
// reducer (which gates on isNativeError) won't match. Check it explicitly
|
|
134
|
+
// by constructor name + Error inheritance so we catch DOMExceptions from
|
|
135
|
+
// any realm (cross-VM safety: instanceof global.DOMException would fail
|
|
136
|
+
// for instances minted in another context).
|
|
137
|
+
DOMException: (value) => {
|
|
138
|
+
if (value === null || typeof value !== 'object')
|
|
139
|
+
return false;
|
|
140
|
+
if (value.constructor?.name !==
|
|
141
|
+
'DOMException')
|
|
142
|
+
return false;
|
|
143
|
+
const e = value;
|
|
144
|
+
const reduced = {
|
|
145
|
+
message: e.message,
|
|
146
|
+
name: e.name,
|
|
147
|
+
stack: e.stack,
|
|
148
|
+
};
|
|
149
|
+
if ('cause' in e)
|
|
150
|
+
reduced.cause = e.cause;
|
|
151
|
+
return reduced;
|
|
152
|
+
},
|
|
153
|
+
// Error subclass reducers are intentionally placed before the base Error
|
|
154
|
+
// reducer because devalue uses first-match-wins. Subclass-specific reducers
|
|
155
|
+
// must be checked first so that e.g. a TypeError is serialized as "TypeError"
|
|
156
|
+
// rather than falling through to the generic "Error" reducer.
|
|
157
|
+
// See `makeErrorSubclassReducer` for implementation details.
|
|
158
|
+
EvalError: makeErrorSubclassReducer('EvalError'),
|
|
159
|
+
FatalError: makeErrorSubclassReducer('FatalError'),
|
|
160
|
+
HookConflictError: (value) => {
|
|
161
|
+
const base = reduceNamedErrorSubclassBase('HookConflictError', value);
|
|
162
|
+
if (!base)
|
|
163
|
+
return false;
|
|
164
|
+
const error = value;
|
|
165
|
+
const reduced = {
|
|
166
|
+
...base,
|
|
167
|
+
token: error.token,
|
|
168
|
+
};
|
|
169
|
+
if (error.conflictingRunId !== undefined) {
|
|
170
|
+
reduced.conflictingRunId = error.conflictingRunId;
|
|
171
|
+
}
|
|
172
|
+
return reduced;
|
|
173
|
+
},
|
|
174
|
+
RangeError: makeErrorSubclassReducer('RangeError'),
|
|
175
|
+
ReferenceError: makeErrorSubclassReducer('ReferenceError'),
|
|
176
|
+
// RetryableError carries an extra `retryAfter` Date that we serialize as
|
|
177
|
+
// a numeric epoch timestamp. The Date reducer uses `instanceof global.Date`,
|
|
178
|
+
// which fails for Dates from a different VM realm; serializing as a
|
|
179
|
+
// number sidesteps that issue.
|
|
180
|
+
RetryableError: (value) => {
|
|
181
|
+
const base = reduceNamedErrorSubclassBase('RetryableError', value);
|
|
182
|
+
if (!base)
|
|
183
|
+
return false;
|
|
184
|
+
const retryAfterRaw = value.retryAfter;
|
|
185
|
+
let retryAfter;
|
|
186
|
+
if (retryAfterRaw &&
|
|
187
|
+
typeof retryAfterRaw === 'object' &&
|
|
188
|
+
typeof retryAfterRaw.getTime === 'function') {
|
|
189
|
+
const t = retryAfterRaw.getTime();
|
|
190
|
+
retryAfter = Number.isNaN(t) ? Date.now() + 1000 : t;
|
|
191
|
+
}
|
|
192
|
+
else if (typeof retryAfterRaw === 'string' ||
|
|
193
|
+
typeof retryAfterRaw === 'number') {
|
|
194
|
+
const t = new Date(retryAfterRaw).getTime();
|
|
195
|
+
retryAfter = Number.isNaN(t) ? Date.now() + 1000 : t;
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
retryAfter = Date.now() + 1000;
|
|
199
|
+
}
|
|
200
|
+
return {
|
|
201
|
+
...base,
|
|
202
|
+
retryAfter,
|
|
203
|
+
};
|
|
204
|
+
},
|
|
205
|
+
// RuntimeDecryptionError carries an extra `context` object (operation,
|
|
206
|
+
// byteLength, formatPrefix) that the generic Error reducer would drop.
|
|
207
|
+
// Preserve it so the diagnostic data survives the run-error round trip.
|
|
208
|
+
RuntimeDecryptionError: (value) => {
|
|
209
|
+
const base = reduceNamedErrorSubclassBase('RuntimeDecryptionError', value);
|
|
210
|
+
if (!base)
|
|
211
|
+
return false;
|
|
212
|
+
const reduced = {
|
|
213
|
+
...base,
|
|
214
|
+
};
|
|
215
|
+
const context = value.context;
|
|
216
|
+
if (context !== undefined) {
|
|
217
|
+
reduced.context = context;
|
|
218
|
+
}
|
|
219
|
+
return reduced;
|
|
220
|
+
},
|
|
221
|
+
SyntaxError: makeErrorSubclassReducer('SyntaxError'),
|
|
222
|
+
TypeError: makeErrorSubclassReducer('TypeError'),
|
|
223
|
+
URIError: makeErrorSubclassReducer('URIError'),
|
|
224
|
+
// AggregateError is similar to other subclasses but also preserves the
|
|
225
|
+
// `errors` array. We extend the base helper's output here.
|
|
226
|
+
AggregateError: (value) => {
|
|
227
|
+
const base = reduceNamedErrorSubclassBase('AggregateError', value);
|
|
228
|
+
if (!base)
|
|
229
|
+
return false;
|
|
230
|
+
return {
|
|
231
|
+
...base,
|
|
232
|
+
errors: value.errors,
|
|
233
|
+
};
|
|
234
|
+
},
|
|
235
|
+
// Base Error reducer — catch-all for any Error instance not matched by a
|
|
236
|
+
// specific subclass reducer above (including user Error subclasses without
|
|
237
|
+
// WORKFLOW_SERIALIZE). Preserves `name` so the error's identity is retained
|
|
238
|
+
// even though the exact class cannot be reconstructed.
|
|
239
|
+
Error: (value) => {
|
|
240
|
+
if (!types.isNativeError(value))
|
|
241
|
+
return false;
|
|
242
|
+
const reduced = {
|
|
243
|
+
name: value.name,
|
|
244
|
+
message: value.message,
|
|
245
|
+
stack: value.stack,
|
|
246
|
+
};
|
|
247
|
+
if ('cause' in value)
|
|
248
|
+
reduced.cause = value.cause;
|
|
249
|
+
return reduced;
|
|
250
|
+
},
|
|
251
|
+
Float32Array: (value) => value instanceof global.Float32Array && viewToBase64(value),
|
|
252
|
+
Float64Array: (value) => value instanceof global.Float64Array && viewToBase64(value),
|
|
253
|
+
Headers: (value) => value instanceof global.Headers && Array.from(value),
|
|
254
|
+
Int8Array: (value) => value instanceof global.Int8Array && viewToBase64(value),
|
|
255
|
+
Int16Array: (value) => value instanceof global.Int16Array && viewToBase64(value),
|
|
256
|
+
Int32Array: (value) => value instanceof global.Int32Array && viewToBase64(value),
|
|
257
|
+
Map: (value) => value instanceof global.Map && Array.from(value),
|
|
258
|
+
RegExp: (value) => value instanceof global.RegExp && {
|
|
259
|
+
source: value.source,
|
|
260
|
+
flags: value.flags,
|
|
261
|
+
},
|
|
262
|
+
// Request and Response are intentionally NOT in common reducers.
|
|
263
|
+
// They require mode-specific revivers (stream handling, etc.) and
|
|
264
|
+
// including them here without matching revivers would cause them
|
|
265
|
+
// to deserialize as plain objects.
|
|
266
|
+
Set: (value) => value instanceof global.Set && Array.from(value),
|
|
267
|
+
URL: (value) => value instanceof global.URL && value.href,
|
|
268
|
+
WorkflowFunction: (value) => {
|
|
269
|
+
// Only match function references with a workflowId property (set by
|
|
270
|
+
// the SWC compiler on workflow functions). Plain { workflowId } objects
|
|
271
|
+
// are NOT matched — this prevents infinite recursion since the reduced
|
|
272
|
+
// form { workflowId } is a plain object, not a function.
|
|
273
|
+
if (typeof value !== 'function')
|
|
274
|
+
return false;
|
|
275
|
+
const workflowId = value.workflowId;
|
|
276
|
+
if (typeof workflowId !== 'string')
|
|
277
|
+
return false;
|
|
278
|
+
return { workflowId };
|
|
279
|
+
},
|
|
280
|
+
URLSearchParams: (value) => {
|
|
281
|
+
if (!(value instanceof global.URLSearchParams))
|
|
282
|
+
return false;
|
|
283
|
+
if (value.size === 0)
|
|
284
|
+
return '.';
|
|
285
|
+
return String(value);
|
|
286
|
+
},
|
|
287
|
+
Uint8Array: (value) => value instanceof global.Uint8Array && viewToBase64(value),
|
|
288
|
+
Uint8ClampedArray: (value) => value instanceof global.Uint8ClampedArray && viewToBase64(value),
|
|
289
|
+
Uint16Array: (value) => value instanceof global.Uint16Array && viewToBase64(value),
|
|
290
|
+
Uint32Array: (value) => value instanceof global.Uint32Array && viewToBase64(value),
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
// ---- Revivers ----
|
|
294
|
+
export function getCommonRevivers(global = globalThis) {
|
|
295
|
+
return {
|
|
296
|
+
ArrayBuffer: (value) => reviveArrayBuffer(value, global),
|
|
297
|
+
BigInt: (value) => global.BigInt(value),
|
|
298
|
+
BigInt64Array: (value) => new global.BigInt64Array(reviveArrayBuffer(value, global)),
|
|
299
|
+
BigUint64Array: (value) => new global.BigUint64Array(reviveArrayBuffer(value, global)),
|
|
300
|
+
Date: (value) => new global.Date(value),
|
|
301
|
+
DOMException: (value) => {
|
|
302
|
+
const error = new global.DOMException(value.message, value.name);
|
|
303
|
+
if (value.stack !== undefined)
|
|
304
|
+
error.stack = value.stack;
|
|
305
|
+
// DOMException's constructor doesn't accept a cause option, so
|
|
306
|
+
// we set it manually when present in the serialized data.
|
|
307
|
+
if ('cause' in value)
|
|
308
|
+
error.cause = value.cause;
|
|
309
|
+
return error;
|
|
310
|
+
},
|
|
311
|
+
// Error subclass revivers reconstruct the correct built-in Error type.
|
|
312
|
+
// See `makeErrorSubclassReviver` for implementation details.
|
|
313
|
+
EvalError: makeErrorSubclassReviver(global, 'EvalError'),
|
|
314
|
+
// `FatalError` and `RetryableError` are not built-ins, so we resolve them
|
|
315
|
+
// from the consumer's `globalThis` via a `Symbol.for(...)` key registered
|
|
316
|
+
// by `@workflow/errors` on load. This makes `instanceof FatalError` work
|
|
317
|
+
// in user code that lives in a different realm than this reducer module
|
|
318
|
+
// (e.g. when the host hydrates a value destined for a workflow VM
|
|
319
|
+
// context). See the registration block at the bottom of
|
|
320
|
+
// `packages/errors/src/index.ts` for details. Falls back to the imported
|
|
321
|
+
// class for environments where no bundled `@workflow/errors` has loaded
|
|
322
|
+
// in the consumer realm.
|
|
323
|
+
FatalError: (value) => {
|
|
324
|
+
const Ctor = global[Symbol.for('@workflow/errors//FatalError')] ?? FatalError;
|
|
325
|
+
const error = new Ctor(value.message);
|
|
326
|
+
if (value.stack !== undefined)
|
|
327
|
+
error.stack = value.stack;
|
|
328
|
+
if ('cause' in value)
|
|
329
|
+
error.cause = value.cause;
|
|
330
|
+
return error;
|
|
331
|
+
},
|
|
332
|
+
HookConflictError: (value) => {
|
|
333
|
+
const Ctor = global[Symbol.for('@workflow/errors//HookConflictError')] ?? HookConflictError;
|
|
334
|
+
const error = new Ctor(value.token, value.conflictingRunId);
|
|
335
|
+
if (value.stack !== undefined)
|
|
336
|
+
error.stack = value.stack;
|
|
337
|
+
if ('cause' in value) {
|
|
338
|
+
error.cause = value.cause;
|
|
339
|
+
}
|
|
340
|
+
return error;
|
|
341
|
+
},
|
|
342
|
+
RangeError: makeErrorSubclassReviver(global, 'RangeError'),
|
|
343
|
+
ReferenceError: makeErrorSubclassReviver(global, 'ReferenceError'),
|
|
344
|
+
RetryableError: (value) => {
|
|
345
|
+
// Use the context's `Date` constructor (matching the rest of this
|
|
346
|
+
// module) so the resulting `retryAfter` Date passes `instanceof
|
|
347
|
+
// global.Date` checks in the target realm. See the FatalError reviver
|
|
348
|
+
// above for why we resolve `RetryableError` from the consumer's
|
|
349
|
+
// globalThis instead of the imported class.
|
|
350
|
+
const Ctor = global[Symbol.for('@workflow/errors//RetryableError')] ?? RetryableError;
|
|
351
|
+
const error = new Ctor(value.message, {
|
|
352
|
+
retryAfter: new global.Date(value.retryAfter),
|
|
353
|
+
});
|
|
354
|
+
if (value.stack !== undefined)
|
|
355
|
+
error.stack = value.stack;
|
|
356
|
+
if ('cause' in value)
|
|
357
|
+
error.cause = value.cause;
|
|
358
|
+
return error;
|
|
359
|
+
},
|
|
360
|
+
RuntimeDecryptionError: (value) => {
|
|
361
|
+
// Resolve from the consumer's globalThis (see the FatalError reviver
|
|
362
|
+
// above) so `instanceof RuntimeDecryptionError` holds across realms.
|
|
363
|
+
const Ctor = global[Symbol.for('@workflow/errors//RuntimeDecryptionError')] ??
|
|
364
|
+
RuntimeDecryptionError;
|
|
365
|
+
const opts = {};
|
|
366
|
+
if ('cause' in value)
|
|
367
|
+
opts.cause = value.cause;
|
|
368
|
+
if (value.context !== undefined)
|
|
369
|
+
opts.context = value.context;
|
|
370
|
+
const error = new Ctor(value.message, opts);
|
|
371
|
+
if (value.stack !== undefined)
|
|
372
|
+
error.stack = value.stack;
|
|
373
|
+
return error;
|
|
374
|
+
},
|
|
375
|
+
SyntaxError: makeErrorSubclassReviver(global, 'SyntaxError'),
|
|
376
|
+
TypeError: makeErrorSubclassReviver(global, 'TypeError'),
|
|
377
|
+
URIError: makeErrorSubclassReviver(global, 'URIError'),
|
|
378
|
+
AggregateError: (value) => {
|
|
379
|
+
const opts = 'cause' in value ? { cause: value.cause } : undefined;
|
|
380
|
+
const error = new global.AggregateError(value.errors, value.message, opts);
|
|
381
|
+
if (value.stack !== undefined)
|
|
382
|
+
error.stack = value.stack;
|
|
383
|
+
return error;
|
|
384
|
+
},
|
|
385
|
+
// Base Error reviver — used for plain Error instances and unrecognized
|
|
386
|
+
// Error subclasses. Preserves `name` so the error's identity is retained.
|
|
387
|
+
Error: (value) => {
|
|
388
|
+
const opts = 'cause' in value ? { cause: value.cause } : undefined;
|
|
389
|
+
const error = new global.Error(value.message, opts);
|
|
390
|
+
error.name = value.name;
|
|
391
|
+
if (value.stack !== undefined)
|
|
392
|
+
error.stack = value.stack;
|
|
393
|
+
return error;
|
|
394
|
+
},
|
|
395
|
+
Float32Array: (value) => new global.Float32Array(reviveArrayBuffer(value, global)),
|
|
396
|
+
Float64Array: (value) => new global.Float64Array(reviveArrayBuffer(value, global)),
|
|
397
|
+
Headers: (value) => new global.Headers(value),
|
|
398
|
+
Int8Array: (value) => new global.Int8Array(reviveArrayBuffer(value, global)),
|
|
399
|
+
Int16Array: (value) => new global.Int16Array(reviveArrayBuffer(value, global)),
|
|
400
|
+
Int32Array: (value) => new global.Int32Array(reviveArrayBuffer(value, global)),
|
|
401
|
+
Map: (value) => new global.Map(value),
|
|
402
|
+
RegExp: (value) => new global.RegExp(value.source, value.flags),
|
|
403
|
+
Set: (value) => new global.Set(value),
|
|
404
|
+
URL: (value) => new global.URL(value),
|
|
405
|
+
WorkflowFunction: (value) => Object.assign(() => {
|
|
406
|
+
throw new Error('Workflow functions cannot be called directly. Use start() to invoke them.');
|
|
407
|
+
}, { workflowId: value.workflowId }),
|
|
408
|
+
URLSearchParams: (value) => new global.URLSearchParams(value === '.' ? '' : value),
|
|
409
|
+
Uint8Array: (value) => new global.Uint8Array(reviveArrayBuffer(value, global)),
|
|
410
|
+
Uint8ClampedArray: (value) => new global.Uint8ClampedArray(reviveArrayBuffer(value, global)),
|
|
411
|
+
Uint16Array: (value) => new global.Uint16Array(reviveArrayBuffer(value, global)),
|
|
412
|
+
Uint32Array: (value) => new global.Uint32Array(reviveArrayBuffer(value, global)),
|
|
413
|
+
};
|
|
414
|
+
}
|
|
415
|
+
// Re-export for use in legacy compat
|
|
416
|
+
export { revive };
|
|
417
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcmlhbGl6YXRpb24vcmVkdWNlcnMvY29tbW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7R0FTRztBQUVILE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUNMLFVBQVUsRUFDVixpQkFBaUIsRUFDakIsY0FBYyxFQUNkLHNCQUFzQixHQUN2QixNQUFNLGtCQUFrQixDQUFDO0FBRzFCLDJCQUEyQjtBQUUzQixTQUFTLG1CQUFtQixDQUMxQixLQUFzQixFQUN0QixNQUFjLEVBQ2QsTUFBYztJQUVkLHNEQUFzRDtJQUN0RCxJQUFJLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxHQUFHLENBQUM7SUFDN0IsOERBQThEO0lBQzlELE1BQU0sS0FBSyxHQUFHLElBQUksVUFBVSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDcEQsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMvQyxDQUFDO0FBRUQsU0FBUyxZQUFZLENBQUMsS0FBc0I7SUFDMUMsT0FBTyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQy9FLENBQUM7QUFFRCxTQUFTLGlCQUFpQixDQUN4QixLQUFhLEVBQ2IsTUFBMkI7SUFFM0IsTUFBTSxNQUFNLEdBQUcsS0FBSyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDMUMsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDN0MsTUFBTSxXQUFXLEdBQUcsSUFBSSxNQUFNLENB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QWlCLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2hFLFdBQVcsRUFBRSxDQUFDLEtBQWEsRUFBRSxFQUFFLENBQzdCLElBQUksTUFBTSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDMUQsV0FBVyxFQUFFLENBQUMsS0FBYSxFQUFFLEVBQUUsQ0FDN0IsSUFBSSxNQUFNLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztLQUMzRCxDQUFDO0FBQ0osQ0FBQztBQUVELHFDQUFxQztBQUNyQyxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbW1vbiByZWR1Y2VycyBhbmQgcmV2aXZlcnMgZm9yIHR5cGVzIHNoYXJlZCBhY3Jvc3MgYWxsIHNlcmlhbGl6YXRpb24gbW9kZXMuXG4gKlxuICogSGFuZGxlczogQXJyYXlCdWZmZXIsIEJpZ0ludCwgdHlwZWQgYXJyYXlzLCBEYXRlLCBFcnJvciwgSGVhZGVycywgTWFwLCBTZXQsXG4gKiBSZWdFeHAsIFJlcXVlc3QsIFJlc3BvbnNlLCBVUkwsIFVSTFNlYXJjaFBhcmFtcy5cbiAqXG4gKiBOb3RlOiBVc2VzIE5vZGUuanMgQnVmZmVyIGZvciBiYXNlNjQgZW5jb2RpbmcvZGVjb2RpbmcuIEZvciBlbnZpcm9ubWVudHNcbiAqIHdpdGhvdXQgQnVmZmVyIChlLmcuIFF1aWNrSlMgVk0pLCBhIHBvbHlmaWxsIG9yIGFsdGVybmF0aXZlIGJhc2U2NFxuICogaW1wbGVtZW50YXRpb24gd2lsbCBiZSBuZWVkZWQuXG4gKi9cblxuaW1wb3J0IHsgdHlwZXMgfSBmcm9tICdub2RlOnV0aWwnO1xuaW1wb3J0IHtcbiAgRmF0YWxFcnJvcixcbiAgSG9va0NvbmZsaWN0RXJyb3IsXG4gIFJldHJ5YWJsZUVycm9yLFxuICBSdW50aW1lRGVjcnlwdGlvbkVycm9yLFxufSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB0eXBlIHsgUmVkdWNlcnMsIFJldml2ZXJzLCBTZXJpYWxpemFibGVTcGVjaWFsIH0gZnJvbSAnLi4vdHlwZXMuanMnO1xuXG4vLyAtLS0tIEJhc2U2NCBoZWxwZXJzIC0tLS1cblxuZnVuY3Rpb24gYXJyYXlCdWZmZXJUb0Jhc2U2NChcbiAgdmFsdWU6IEFycmF5QnVmZmVyTGlrZSxcbiAgb2Zmc2V0OiBudW1iZXIsXG4gIGxlbmd0aDogbnVtYmVyXG4pOiBzdHJpbmcge1xuICAvLyBBdm9pZCByZXR1cm5pbmcgZmFsc3kgdmFsdWUgZm9yIHplcm8tbGVuZ3RoIGJ1ZmZlcnNcbiAgaWYgKGxlbmd0aCA9PT0gMCkgcmV0dXJuICcuJztcbiAgLy8gQ3JlYXRlIGEgcHJvcGVyIGNvcHkgdG8gYXZvaWQgQXJyYXlCdWZmZXIgZGV0YWNobWVudCBpc3N1ZXNcbiAgY29uc3QgdWludDggPSBuZXcgVWludDhBcnJheSh2YWx1ZSwgb2Zmc2V0LCBsZW5ndGgpO1xuICByZXR1cm4gQnVmZmVyLmZyb20odWludDgpLnRvU3RyaW5nKCdiYXNlNjQnKTtcbn1cblxuZnVuY3Rpb24gdmlld1RvQmFzZTY0KHZhbHVlOiBBcnJheUJ1ZmZlclZpZXcpOiBzdHJpbmcge1xuICByZXR1cm4gYXJyYXlCdWZmZXJUb0Jhc2U2NCh2YWx1ZS5idWZmZXIsIHZhbHVlLmJ5dGVPZmZzZXQsIHZhbHVlLmJ5dGVMZW5ndGgpO1xufVxuXG5mdW5jdGlvbiByZXZpdmVBcnJheUJ1ZmZlcihcbiAgdmFsdWU6IHN0cmluZyxcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4pOiBBcnJheUJ1ZmZlciB7XG4gIGNvbnN0IGJhc2U2NCA9IHZhbHVlID09PSAnLicgPyAnJyA6IHZhbHVlO1xuICBjb25zdCBidWZmZXIgPSBCdWZmZXIuZnJvbShiYXNlNjQsICdiYXNlNjQnKTtcbiAgY29uc3QgYXJyYXlCdWZmZXIgPSBuZXcgZ2xvYmFsLkFycmF5QnVmZmVyKGJ1ZmZlci5sZW5ndGgpO1xuICBjb25zdCB1aW50OEFycmF5ID0gbmV3IGdsb2JhbC5VaW50OEFycmF5KGFycmF5QnVmZmVyKTtcbiAgdWludDhBcnJheS5zZXQoYnVmZmVyKTtcbiAgcmV0dXJuIGFycmF5QnVmZmVyO1xufVxuXG5mdW5jdGlvbiByZXZpdmUoc3RyOiBzdHJpbmcpIHtcbiAgLy8gZGV2YWx1ZS5zdHJpbmdpZnkoKSBhbHdheXMgcHJvZHVjZXMgdmFsaWQgSlNPTjogc3BlY2lhbCB2YWx1ZXNcbiAgLy8gKHVuZGVmaW5lZCwgTmFOLCBJbmZpbml0eSwgLTApIGFyZSBlbmNvZGVkIGFzIG5lZ2F0aXZlIGludGVnZXJcbiAgLy8gc2VudGluZWxzIGFuZCB0aGUgcmVtYWluaW5nIHN0cnVjdHVyZSBpcyBvcmRpbmFyeSBKU09OLiBQYXJzaW5nXG4gIC8vIHdpdGggSlNPTi5wYXJzZSB5aWVsZHMgdGhlIGZsYXR0ZW5lZCBmb3JtIHRoYXQgdW5mbGF0dGVuKCkgZXhwZWN0cy5cbiAgcmV0dXJuIEpTT04ucGFyc2Uoc3RyKTtcbn1cblxuLy8gLS0tLSBFcnJvciBzdWJjbGFzcyBoZWxwZXJzIC0tLS1cblxuLyoqXG4gKiBUaGUgc2hhcmVkIHNoYXBlIHRoYXQgZXZlcnkgRXJyb3Itc3ViY2xhc3MgcmVkdWNlciBpbiB0aGlzIG1vZHVsZVxuICogcHJvZHVjZXMuIFNvbWUgc3ViY2xhc3NlcyAoZS5nLiBgQWdncmVnYXRlRXJyb3JgLCBgUmV0cnlhYmxlRXJyb3JgKSBleHRlbmRcbiAqIHRoaXMgd2l0aCBhZGRpdGlvbmFsIGZpZWxkcyBieSBzcHJlYWRpbmcgdGhlIGJhc2UgcGF5bG9hZC5cbiAqL1xudHlwZSBCYXNlRXJyb3JQYXlsb2FkID0ge1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIHN0YWNrPzogc3RyaW5nO1xuICBjYXVzZT86IHVua25vd247XG59O1xuXG4vKipcbiAqIFN1YnNldCBvZiBgU2VyaWFsaXphYmxlU3BlY2lhbGAga2V5cyB3aG9zZSBwYXlsb2FkIHNoYXBlIGlzIGV4YWN0bHkgdGhlXG4gKiBgQmFzZUVycm9yUGF5bG9hZGAuIGBtYWtlRXJyb3JTdWJjbGFzc1JlZHVjZXJgIGlzIGNvbnN0cmFpbmVkIHRvIG9ubHlcbiAqIHRoZXNlIGtleXMgc28gaXRzIHJldHVybiB0eXBlIGlzIHNvdW5kIOKAlCBzdWJjbGFzc2VzIHRoYXQgbmVlZCBleHRyYVxuICogZmllbGRzIChsaWtlIGBBZ2dyZWdhdGVFcnJvci5lcnJvcnNgIG9yIGBSZXRyeWFibGVFcnJvci5yZXRyeUFmdGVyYCkgdXNlXG4gKiBgcmVkdWNlRXJyb3JCYXNlYCBkaXJlY3RseSBhbmQgZXh0ZW5kIHRoZSByZXN1bHQuXG4gKi9cbnR5cGUgU2ltcGxlRXJyb3JTdWJjbGFzc0tleSA9IHtcbiAgW0sgaW4ga2V5b2YgU2VyaWFsaXphYmxlU3BlY2lhbF06IFNlcmlhbGl6YWJsZVNwZWNpYWxbS10gZXh0ZW5kcyBCYXNlRXJyb3JQYXlsb2FkXG4gICAgPyBCYXNlRXJyb3JQYXlsb2FkIGV4dGVuZHMgU2VyaWFsaXphYmxlU3BlY2lhbFtLXVxuICAgICAgPyBLXG4gICAgICA6IG5ldmVyXG4gICAgOiBuZXZlcjtcbn1ba2V5b2YgU2VyaWFsaXphYmxlU3BlY2lhbF07XG5cbi8qKlxuICogUmVkdWNlcyBhbnkgbmF0aXZlIEVycm9yIGluc3RhbmNlIHRvIHRoZSBzaGFyZWQgYEJhc2VFcnJvclBheWxvYWRgIHNoYXBlLFxuICogcHJlc2VydmluZyBgY2F1c2VgIG9ubHkgd2hlbiBwcmVzZW50ICh0byBkaXN0aW5ndWlzaCBcIm5vIGNhdXNlXCIgZnJvbVxuICogXCJjYXVzZSBpcyB1bmRlZmluZWRcIikuIFVzZWQgZGlyZWN0bHkgYnkgcmVkdWNlcnMgZm9yIHN1YmNsYXNzZXMgdGhhdCBuZWVkXG4gKiB0byBleHRlbmQgdGhlIHNoYXBlIHdpdGggYWRkaXRpb25hbCBmaWVsZHMuXG4gKlxuICogYHR5cGVzLmlzTmF0aXZlRXJyb3IoKWAgaXMgdXNlZCBpbnN0ZWFkIG9mIGBpbnN0YW5jZW9mYCBmb3IgY3Jvc3MtVk0gc2FmZXR5OlxuICogZXJyb3JzIG1heSBvcmlnaW5hdGUgZnJvbSBhIGRpZmZlcmVudCBWTSBjb250ZXh0LCBhbmQgYGluc3RhbmNlb2ZgIGZhaWxzXG4gKiBhY3Jvc3MgVk0gYm91bmRhcmllcyBzaW5jZSBlYWNoIGNvbnRleHQgaGFzIGl0cyBvd24gRXJyb3IgY29uc3RydWN0b3IuXG4gKi9cbmZ1bmN0aW9uIHJlZHVjZUVycm9yQmFzZSh2YWx1ZTogdW5rbm93bik6IEJhc2VFcnJvclBheWxvYWQgfCBmYWxzZSB7XG4gIGlmICghdHlwZXMuaXNOYXRpdmVFcnJvcih2YWx1ZSkpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgcmVkdWNlZDogQmFzZUVycm9yUGF5bG9hZCA9IHtcbiAgICBtZXNzYWdlOiB2YWx1ZS5tZXNzYWdlLFxuICAgIHN0YWNrOiB2YWx1ZS5zdGFjayxcbiAgfTtcbiAgaWYgKCdjYXVzZScgaW4gdmFsdWUpIHJlZHVjZWQuY2F1c2UgPSAodmFsdWUgYXMgeyBjYXVzZTogdW5rbm93biB9KS5jYXVzZTtcbiAgcmV0dXJuIHJlZHVjZWQ7XG59XG5cbi8qKlxuICogUmVkdWNlcyBhIG5hdGl2ZSBlcnJvciB0byB0aGUgc2hhcmVkIGBCYXNlRXJyb3JQYXlsb2FkYCwgYnV0IG9ubHkgd2hlbiBpdHNcbiAqIGBuYW1lYCBpbnN0YW5jZSBwcm9wZXJ0eSBtYXRjaGVzIGBzdWJjbGFzc05hbWVgLiBVc2VkIGJ5OlxuICogICAtIGBtYWtlRXJyb3JTdWJjbGFzc1JlZHVjZXJgLCBmb3Igc3ViY2xhc3NlcyB3aG9zZSBzZXJpYWxpemVkIHNoYXBlIGlzXG4gKiAgICAgZXhhY3RseSBgQmFzZUVycm9yUGF5bG9hZGAuXG4gKiAgIC0gSW5saW5lIHJlZHVjZXJzIGZvciBzdWJjbGFzc2VzIHRoYXQgZXh0ZW5kIHRoZSBzaGFwZSB3aXRoIGFkZGl0aW9uYWxcbiAqICAgICBmaWVsZHMgKGUuZy4gYEFnZ3JlZ2F0ZUVycm9yLmVycm9yc2AsIGBSZXRyeWFibGVFcnJvci5yZXRyeUFmdGVyYCkuXG4gKlxuICogTWF0Y2hpbmcgYnkgYHZhbHVlLm5hbWVgIChpbnN0ZWFkIG9mIGB2YWx1ZS5jb25zdHJ1Y3Rvcj8ubmFtZWApIGlzIHJvYnVzdFxuICogdG8gYnVuZGxlcnMgdGhhdCBlbWl0IHRoZSBjbGFzcyBhcyBhbiBhbm9ueW1vdXMgZXhwcmVzc2lvbiDigJQgZS5nLiBUdXJib3BhY2tcbiAqIGNvbXBpbGVzIGBleHBvcnQgY2xhc3MgRmF0YWxFcnJvciBleHRlbmRzIEVycm9yIHvigKZ9YCB0byBhIHJlZ2lzdHJhdGlvbiBjYWxsXG4gKiBsaWtlIGBlLnMoW1wiRmF0YWxFcnJvclwiLCAwLCBjbGFzcyBleHRlbmRzIEVycm9yIHvigKZ9XSlgLCBhbmQgdGhlIHJlc3VsdGluZ1xuICogY29uc3RydWN0b3IgaGFzIGBuYW1lID09PSAnJ2AuIFNpbmNlIGV2ZXJ5IEVycm9yIHN1YmNsYXNzIHdlIGNhcmUgYWJvdXRcbiAqIHNldHMgYHRoaXMubmFtZWAgZXhwbGljaXRseSBpbiBpdHMgY29uc3RydWN0b3IgKGJ1aWx0LWluIHN1YmNsYXNzZXMgZG8gdGhpc1xuICogYXV0b21hdGljYWxseTsgYEZhdGFsRXJyb3JgL2BSZXRyeWFibGVFcnJvcmAgZG8gaXQgaW4gdXNlciBjb2RlKSwgdGhlXG4gKiBpbnN0YW5jZSBwcm9wZXJ0eSBpcyB0aGUgcmVsaWFibGUgaWRlbnRpdHkgbWFya2VyIGFjcm9zcyByZWFsbXMgYW5kXG4gKiBidW5kbGVycy5cbiAqL1xuZnVuY3Rpb24gcmVkdWNlTmFtZWRFcnJvclN1YmNsYXNzQmFzZShcbiAgc3ViY2xhc3NOYW1lOiBzdHJpbmcsXG4gIHZhbHVlOiB1bmtub3duXG4pOiBCYXNlRXJyb3JQYXlsb2FkIHwgZmFsc2Uge1xuICBpZiAoIXR5cGVzLmlzTmF0aXZlRXJyb3IodmFsdWUpKSByZXR1cm4gZmFsc2U7XG4gIGlmICh2YWx1ZS5uYW1lICE9PSBzdWJjbGFzc05hbWUpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHJlZHVjZUVycm9yQmFzZSh2YWx1ZSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHJlZHVjZXIgZm9yIGEgYnVpbHQtaW4gRXJyb3Igc3ViY2xhc3Mgd2hvc2Ugc2VyaWFsaXplZCBzaGFwZSBpc1xuICogZXhhY3RseSBgQmFzZUVycm9yUGF5bG9hZGAgKG5vIGV4dHJhIGZpZWxkcykuIFRoZSByZWR1Y2VyIG1hdGNoZXMgYnlcbiAqIGNvbnN0cnVjdG9yIG5hbWUgKGFmdGVyIHRoZSBpc05hdGl2ZUVycm9yIGdhdGUpLCBzaW5jZSBgaW5zdGFuY2VvZmAgbWF5XG4gKiBmYWlsIGFjcm9zcyBWTSBib3VuZGFyaWVzLlxuICovXG5mdW5jdGlvbiBtYWtlRXJyb3JTdWJjbGFzc1JlZHVjZXI8SyBleHRlbmRzIFNpbXBsZUVycm9yU3ViY2xhc3NLZXk+KFxuICBzdWJjbGFzc05hbWU6IEtcbikge1xuICByZXR1cm4gKHZhbHVlOiB1bmtub3duKTogU2VyaWFsaXphYmxlU3BlY2lhbFtLXSB8IGZhbHNlID0+IHtcbiAgICBjb25zdCBiYXNlID0gcmVkdWNlTmFtZWRFcnJvclN1YmNsYXNzQmFzZShzdWJjbGFzc05hbWUsIHZhbHVlKTtcbiAgICBpZiAoIWJhc2UpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gYmFzZSBhcyBTZXJpYWxpemFibGVTcGVjaWFsW0tdO1xuICB9O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSByZXZpdmVyIGZvciBhIGJ1aWx0LWluIEVycm9yIHN1YmNsYXNzLiBSZWNvbnN0cnVjdHMgdGhlIGNvcnJlY3RcbiAqIGJ1aWx0LWluIEVycm9yIHR5cGUgdXNpbmcgdGhlIGNvbnRleHQncyBjb25zdHJ1Y3Rvci4gVGhlIGBjYXVzZWAgb3B0aW9uIGlzXG4gKiBvbmx5IHBhc3NlZCB3aGVuIHRoZSBzZXJpYWxpemVkIGRhdGEgaW5jbHVkZXMgaXQsIHByZXNlcnZpbmcgdGhlIGRpc3RpbmN0aW9uXG4gKiBiZXR3ZWVuIFwibm8gY2F1c2VcIiBhbmQgXCJjYXVzZSBpcyB1bmRlZmluZWRcIi5cbiAqL1xuZnVuY3Rpb24gbWFrZUVycm9yU3ViY2xhc3NSZXZpdmVyPEsgZXh0ZW5kcyBrZXlvZiBTZXJpYWxpemFibGVTcGVjaWFsPihcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBjdG9yTmFtZTogc3RyaW5nXG4pIHtcbiAgcmV0dXJuICh2YWx1ZTogU2VyaWFsaXphYmxlU3BlY2lhbFtLXSkgPT4ge1xuICAgIGNvbnN0IHYgPSB2YWx1ZSBhcyBCYXNlRXJyb3JQYXlsb2FkO1xuICAgIGNvbnN0IG9wdHMgPSAnY2F1c2UnIGluIHYgPyB7IGNhdXNlOiB2LmNhdXNlIH0gOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgQ3RvciA9IGdsb2JhbFtjdG9yTmFtZV07XG4gICAgY29uc3QgZXJyb3I6IEVycm9yID0gbmV3IEN0b3Iodi5tZXNzYWdlLCBvcHRzKTtcbiAgICBpZiAodi5zdGFjayAhPT0gdW5kZWZpbmVkKSBlcnJvci5zdGFjayA9IHYuc3RhY2s7XG4gICAgcmV0dXJuIGVycm9yO1xuICB9O1xufVxuXG4vLyAtLS0tIFJlZHVjZXJzIC0tLS1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbW1vblJlZHVjZXJzKFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzXG4pOiBQYXJ0aWFsPFJlZHVjZXJzPiB7XG4gIHJldHVybiB7XG4gICAgQXJyYXlCdWZmZXI6ICh2YWx1ZSkgPT5cbiAgICAgIHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLkFycmF5QnVmZmVyICYmXG4gICAgICBhcnJheUJ1ZmZlclRvQmFzZTY0KHZhbHVlLCAwLCB2YWx1ZS5ieXRlTGVuZ3RoKSxcbiAgICBCaWdJbnQ6ICh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSAnYmlnaW50JyAmJiB2YWx1ZS50b1N0cmluZygpLFxuICAgIEJpZ0ludDY0QXJyYXk6ICh2YWx1ZSkgPT5cbiAgICAgIHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLkJpZ0ludDY0QXJyYXkgJiYgdmlld1RvQmFzZTY0KHZhbHVlKSxcbiAgICBCaWdVaW50NjRBcnJheTogKHZhbHVlKSA9PlxuICAgICAgdmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuQmlnVWludDY0QXJyYXkgJiYgdmlld1RvQmFzZTY0KHZhbHVlKSxcbiAgICBEYXRlOiAodmFsdWUpID0+IHtcbiAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLkRhdGUpKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCB2YWxpZCA9ICFOdW1iZXIuaXNOYU4odmFsdWUuZ2V0RGF0ZSgpKTtcbiAgICAgIHJldHVybiB2YWxpZCA/IHZhbHVlLnRvSVNPU3RyaW5nKCkgOiAnLic7XG4gICAgfSxcbiAgICAvLyBET01FeGNlcHRpb24gaXMgYSBzcGVjaWFsIGNhc2U6IGl0IGBpbnN0YW5jZW9mIEVycm9yYCBpcyB0cnVlIGluIE5vZGUsXG4gICAgLy8gYnV0IGB0eXBlcy5pc05hdGl2ZUVycm9yKClgIHJldHVybnMgRkFMU0UgZm9yIGl0LCBzbyB0aGUgZ2VuZXJpYyBFcnJvclxuICAgIC8vIHJlZHVjZXIgKHdoaWNoIGdhdGVzIG9uIGlzTmF0aXZlRXJyb3IpIHdvbid0IG1hdGNoLiBDaGVjayBpdCBleHBsaWNpdGx5XG4gICAgLy8gYnkgY29uc3RydWN0b3IgbmFtZSArIEVycm9yIGluaGVyaXRhbmNlIHNvIHdlIGNhdGNoIERPTUV4Y2VwdGlvbnMgZnJvbVxuICAgIC8vIGFueSByZWFsbSAoY3Jvc3MtVk0gc2FmZXR5OiBpbnN0YW5jZW9mIGdsb2JhbC5ET01FeGNlcHRpb24gd291bGQgZmFpbFxuICAgIC8vIGZvciBpbnN0YW5jZXMgbWludGVkIGluIGFub3RoZXIgY29udGV4dCkuXG4gICAgRE9NRXhjZXB0aW9uOiAodmFsdWUpID0+IHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoXG4gICAgICAgICh2YWx1ZSBhcyB7IGNvbnN0cnVjdG9yPzogeyBuYW1lPzogc3RyaW5nIH0gfSkuY29uc3RydWN0b3I/Lm5hbWUgIT09XG4gICAgICAgICdET01FeGNlcHRpb24nXG4gICAgICApXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IGUgPSB2YWx1ZSBhcyBFcnJvciAmIHsgY2F1c2U/OiB1bmtub3duIH07XG4gICAgICBjb25zdCByZWR1Y2VkOiBTZXJpYWxpemFibGVTcGVjaWFsWydET01FeGNlcHRpb24nXSA9IHtcbiAgICAgICAgbWVzc2FnZTogZS5tZXNzYWdlLFxuICAgICAgICBuYW1lOiBlLm5hbWUsXG4gICAgICAgIHN0YWNrOiBlLnN0YWNrLFxuICAgICAgfTtcbiAgICAgIGlmICgnY2F1c2UnIGluIGUpIHJlZHVjZWQuY2F1c2UgPSBlLmNhdXNlO1xuICAgICAgcmV0dXJuIHJlZHVjZWQ7XG4gICAgfSxcbiAgICAvLyBFcnJvciBzdWJjbGFzcyByZWR1Y2VycyBhcmUgaW50ZW50aW9uYWxseSBwbGFjZWQgYmVmb3JlIHRoZSBiYXNlIEVycm9yXG4gICAgLy8gcmVkdWNlciBiZWNhdXNlIGRldmFsdWUgdXNlcyBmaXJzdC1tYXRjaC13aW5zLiBTdWJjbGFzcy1zcGVjaWZpYyByZWR1Y2Vyc1xuICAgIC8vIG11c3QgYmUgY2hlY2tlZCBmaXJzdCBzbyB0aGF0IGUuZy4gYSBUeXBlRXJyb3IgaXMgc2VyaWFsaXplZCBhcyBcIlR5cGVFcnJvclwiXG4gICAgLy8gcmF0aGVyIHRoYW4gZmFsbGluZyB0aHJvdWdoIHRvIHRoZSBnZW5lcmljIFwiRXJyb3JcIiByZWR1Y2VyLlxuICAgIC8vIFNlZSBgbWFrZUVycm9yU3ViY2xhc3NSZWR1Y2VyYCBmb3IgaW1wbGVtZW50YXRpb24gZGV0YWlscy5cbiAgICBFdmFsRXJyb3I6IG1ha2VFcnJvclN1YmNsYXNzUmVkdWNlcignRXZhbEVycm9yJyksXG4gICAgRmF0YWxFcnJvcjogbWFrZUVycm9yU3ViY2xhc3NSZWR1Y2VyKCdGYXRhbEVycm9yJyksXG4gICAgSG9va0NvbmZsaWN0RXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgYmFzZSA9IHJlZHVjZU5hbWVkRXJyb3JTdWJjbGFzc0Jhc2UoJ0hvb2tDb25mbGljdEVycm9yJywgdmFsdWUpO1xuICAgICAgaWYgKCFiYXNlKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCBlcnJvciA9IHZhbHVlIGFzIEhvb2tDb25mbGljdEVycm9yO1xuICAgICAgY29uc3QgcmVkdWNlZDogU2VyaWFsaXphYmxlU3BlY2lhbFsnSG9va0NvbmZsaWN0RXJyb3InXSA9IHtcbiAgICAgICAgLi4uYmFzZSxcbiAgICAgICAgdG9rZW46IGVycm9yLnRva2VuLFxuICAgICAgfTtcbiAgICAgIGlmIChlcnJvci5jb25mbGljdGluZ1J1bklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmVkdWNlZC5jb25mbGljdGluZ1J1bklkID0gZXJyb3IuY29uZmxpY3RpbmdSdW5JZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZWR1Y2VkO1xuICAgIH0sXG4gICAgUmFuZ2VFcnJvcjogbWFrZUVycm9yU3ViY2xhc3NSZWR1Y2VyKCdSYW5nZUVycm9yJyksXG4gICAgUmVmZXJlbmNlRXJyb3I6IG1ha2VFcnJvclN1YmNsYXNzUmVkdWNlcignUmVmZXJlbmNlRXJyb3InKSxcbiAgICAvLyBSZXRyeWFibGVFcnJvciBjYXJyaWVzIGFuIGV4dHJhIGByZXRyeUFmdGVyYCBEYXRlIHRoYXQgd2Ugc2VyaWFsaXplIGFzXG4gICAgLy8gYSBudW1lcmljIGVwb2NoIHRpbWVzdGFtcC4gVGhlIERhdGUgcmVkdWNlciB1c2VzIGBpbnN0YW5jZW9mIGdsb2JhbC5EYXRlYCxcbiAgICAvLyB3aGljaCBmYWlscyBmb3IgRGF0ZXMgZnJvbSBhIGRpZmZlcmVudCBWTSByZWFsbTsgc2VyaWFsaXppbmcgYXMgYVxuICAgIC8vIG51bWJlciBzaWRlc3RlcHMgdGhhdCBpc3N1ZS5cbiAgICBSZXRyeWFibGVFcnJvcjogKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBiYXNlID0gcmVkdWNlTmFtZWRFcnJvclN1YmNsYXNzQmFzZSgnUmV0cnlhYmxlRXJyb3InLCB2YWx1ZSk7XG4gICAgICBpZiAoIWJhc2UpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IHJldHJ5QWZ0ZXJSYXcgPSAodmFsdWUgYXMgUmV0cnlhYmxlRXJyb3IpLnJldHJ5QWZ0ZXIgYXMgdW5rbm93bjtcbiAgICAgIGxldCByZXRyeUFmdGVyOiBudW1iZXI7XG4gICAgICBpZiAoXG4gICAgICAgIHJldHJ5QWZ0ZXJSYXcgJiZcbiAgICAgICAgdHlwZW9mIHJldHJ5QWZ0ZXJSYXcgPT09ICdvYmplY3QnICYmXG4gICAgICAgIHR5cGVvZiAocmV0cnlBZnRlclJhdyBhcyB7IGdldFRpbWU/OiB1bmtub3duIH0pLmdldFRpbWUgPT09ICdmdW5jdGlvbidcbiAgICAgICkge1xuICAgICAgICBjb25zdCB0ID0gKHJldHJ5QWZ0ZXJSYXcgYXMgRGF0ZSkuZ2V0VGltZSgpO1xuICAgICAgICByZXRyeUFmdGVyID0gTnVtYmVyLmlzTmFOKHQpID8gRGF0ZS5ub3coKSArIDEwMDAgOiB0O1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgdHlwZW9mIHJldHJ5QWZ0ZXJSYXcgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgIHR5cGVvZiByZXRyeUFmdGVyUmF3ID09PSAnbnVtYmVyJ1xuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHQgPSBuZXcgRGF0ZShyZXRyeUFmdGVyUmF3KS5nZXRUaW1lKCk7XG4gICAgICAgIHJldHJ5QWZ0ZXIgPSBOdW1iZXIuaXNOYU4odCkgPyBEYXRlLm5vdygpICsgMTAwMCA6IHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXRyeUFmdGVyID0gRGF0ZS5ub3coKSArIDEwMDA7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5iYXNlLFxuICAgICAgICByZXRyeUFmdGVyLFxuICAgICAgfSBzYXRpc2ZpZXMgU2VyaWFsaXphYmxlU3BlY2lhbFsnUmV0cnlhYmxlRXJyb3InXTtcbiAgICB9LFxuICAgIC8vIFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3IgY2FycmllcyBhbiBleHRyYSBgY29udGV4dGAgb2JqZWN0IChvcGVyYXRpb24sXG4gICAgLy8gYnl0ZUxlbmd0aCwgZm9ybWF0UHJlZml4KSB0aGF0IHRoZSBnZW5lcmljIEVycm9yIHJlZHVjZXIgd291bGQgZHJvcC5cbiAgICAvLyBQcmVzZXJ2ZSBpdCBzbyB0aGUgZGlhZ25vc3RpYyBkYXRhIHN1cnZpdmVzIHRoZSBydW4tZXJyb3Igcm91bmQgdHJpcC5cbiAgICBSdW50aW1lRGVjcnlwdGlvbkVycm9yOiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IGJhc2UgPSByZWR1Y2VOYW1lZEVycm9yU3ViY2xhc3NCYXNlKFxuICAgICAgICAnUnVudGltZURlY3J5cHRpb25FcnJvcicsXG4gICAgICAgIHZhbHVlXG4gICAgICApO1xuICAgICAgaWYgKCFiYXNlKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCByZWR1Y2VkOiBTZXJpYWxpemFibGVTcGVjaWFsWydSdW50aW1lRGVjcnlwdGlvbkVycm9yJ10gPSB7XG4gICAgICAgIC4uLmJhc2UsXG4gICAgICB9O1xuICAgICAgY29uc3QgY29udGV4dCA9ICh2YWx1ZSBhcyBSdW50aW1lRGVjcnlwdGlvbkVycm9yKS5jb250ZXh0O1xuICAgICAgaWYgKGNvbnRleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZWR1Y2VkLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlZHVjZWQ7XG4gICAgfSxcbiAgICBTeW50YXhFcnJvcjogbWFrZUVycm9yU3ViY2xhc3NSZWR1Y2VyKCdTeW50YXhFcnJvcicpLFxuICAgIFR5cGVFcnJvcjogbWFrZUVycm9yU3ViY2xhc3NSZWR1Y2VyKCdUeXBlRXJyb3InKSxcbiAgICBVUklFcnJvcjogbWFrZUVycm9yU3ViY2xhc3NSZWR1Y2VyKCdVUklFcnJvcicpLFxuICAgIC8vIEFnZ3JlZ2F0ZUVycm9yIGlzIHNpbWlsYXIgdG8gb3RoZXIgc3ViY2xhc3NlcyBidXQgYWxzbyBwcmVzZXJ2ZXMgdGhlXG4gICAgLy8gYGVycm9yc2AgYXJyYXkuIFdlIGV4dGVuZCB0aGUgYmFzZSBoZWxwZXIncyBvdXRwdXQgaGVyZS5cbiAgICBBZ2dyZWdhdGVFcnJvcjogKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBiYXNlID0gcmVkdWNlTmFtZWRFcnJvclN1YmNsYXNzQmFzZSgnQWdncmVnYXRlRXJyb3InLCB2YWx1ZSk7XG4gICAgICBpZiAoIWJhc2UpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmJhc2UsXG4gICAgICAgIGVycm9yczogKHZhbHVlIGFzIEFnZ3JlZ2F0ZUVycm9yKS5lcnJvcnMsXG4gICAgICB9IHNhdGlzZmllcyBTZXJpYWxpemFibGVTcGVjaWFsWydBZ2dyZWdhdGVFcnJvciddO1xuICAgIH0sXG4gICAgLy8gQmFzZSBFcnJvciByZWR1Y2VyIOKAlCBjYXRjaC1hbGwgZm9yIGFueSBFcnJvciBpbnN0YW5jZSBub3QgbWF0Y2hlZCBieSBhXG4gICAgLy8gc3BlY2lmaWMgc3ViY2xhc3MgcmVkdWNlciBhYm92ZSAoaW5jbHVkaW5nIHVzZXIgRXJyb3Igc3ViY2xhc3NlcyB3aXRob3V0XG4gICAgLy8gV09SS0ZMT1dfU0VSSUFMSVpFKS4gUHJlc2VydmVzIGBuYW1lYCBzbyB0aGUgZXJyb3IncyBpZGVudGl0eSBpcyByZXRhaW5lZFxuICAgIC8vIGV2ZW4gdGhvdWdoIHRoZSBleGFjdCBjbGFzcyBjYW5ub3QgYmUgcmVjb25zdHJ1Y3RlZC5cbiAgICBFcnJvcjogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoIXR5cGVzLmlzTmF0aXZlRXJyb3IodmFsdWUpKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCByZWR1Y2VkOiBTZXJpYWxpemFibGVTcGVjaWFsWydFcnJvciddID0ge1xuICAgICAgICBuYW1lOiB2YWx1ZS5uYW1lLFxuICAgICAgICBtZXNzYWdlOiB2YWx1ZS5tZXNzYWdlLFxuICAgICAgICBzdGFjazogdmFsdWUuc3RhY2ssXG4gICAgICB9O1xuICAgICAgaWYgKCdjYXVzZScgaW4gdmFsdWUpIHJlZHVjZWQuY2F1c2UgPSB2YWx1ZS5jYXVzZTtcbiAgICAgIHJldHVybiByZWR1Y2VkO1xuICAgIH0sXG4gICAgRmxvYXQzMkFycmF5OiAodmFsdWUpID0+XG4gICAgICB2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5GbG9hdDMyQXJyYXkgJiYgdmlld1RvQmFzZTY0KHZhbHVlKSxcbiAgICBGbG9hdDY0QXJyYXk6ICh2YWx1ZSkgPT5cbiAgICAgIHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLkZsb2F0NjRBcnJheSAmJiB2aWV3VG9CYXNlNjQodmFsdWUpLFxuICAgIEhlYWRlcnM6ICh2YWx1ZSkgPT4gdmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuSGVhZGVycyAmJiBBcnJheS5mcm9tKHZhbHVlKSxcbiAgICBJbnQ4QXJyYXk6ICh2YWx1ZSkgPT5cbiAgICAgIHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLkludDhBcnJheSAmJiB2aWV3VG9CYXNlNjQodmFsdWUpLFxuICAgIEludDE2QXJyYXk6ICh2YWx1ZSkgPT5cbiAgICAgIHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLkludDE2QXJyYXkgJiYgdmlld1RvQmFzZTY0KHZhbHVlKSxcbiAgICBJbnQzMkFycmF5OiAodmFsdWUpID0+XG4gICAgICB2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5JbnQzMkFycmF5ICYmIHZpZXdUb0Jhc2U2NCh2YWx1ZSksXG4gICAgTWFwOiAodmFsdWUpID0+IHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLk1hcCAmJiBBcnJheS5mcm9tKHZhbHVlKSxcbiAgICBSZWdFeHA6ICh2YWx1ZSkgPT5cbiAgICAgIHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLlJlZ0V4cCAmJiB7XG4gICAgICAgIHNvdXJjZTogdmFsdWUuc291cmNlLFxuICAgICAgICBmbGFnczogdmFsdWUuZmxhZ3MsXG4gICAgICB9LFxuICAgIC8vIFJlcXVlc3QgYW5kIFJlc3BvbnNlIGFyZSBpbnRlbnRpb25hbGx5IE5PVCBpbiBjb21tb24gcmVkdWNlcnMuXG4gICAgLy8gVGhleSByZXF1aXJlIG1vZGUtc3BlY2lmaWMgcmV2aXZlcnMgKHN0cmVhbSBoYW5kbGluZywgZXRjLikgYW5kXG4gICAgLy8gaW5jbHVkaW5nIHRoZW0gaGVyZSB3aXRob3V0IG1hdGNoaW5nIHJldml2ZXJzIHdvdWxkIGNhdXNlIHRoZW1cbiAgICAvLyB0byBkZXNlcmlhbGl6ZSBhcyBwbGFpbiBvYmplY3RzLlxuICAgIFNldDogKHZhbHVlKSA9PiB2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5TZXQgJiYgQXJyYXkuZnJvbSh2YWx1ZSksXG4gICAgVVJMOiAodmFsdWUpID0+IHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLlVSTCAmJiB2YWx1ZS5ocmVmLFxuICAgIFdvcmtmbG93RnVuY3Rpb246ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gT25seSBtYXRjaCBmdW5jdGlvbiByZWZlcmVuY2VzIHdpdGggYSB3b3JrZmxvd0lkIHByb3BlcnR5IChzZXQgYnlcbiAgICAgIC8vIHRoZSBTV0MgY29tcGlsZXIgb24gd29ya2Zsb3cgZnVuY3Rpb25zKS4gUGxhaW4geyB3b3JrZmxvd0lkIH0gb2JqZWN0c1xuICAgICAgLy8gYXJlIE5PVCBtYXRjaGVkIOKAlCB0aGlzIHByZXZlbnRzIGluZmluaXRlIHJlY3Vyc2lvbiBzaW5jZSB0aGUgcmVkdWNlZFxuICAgICAgLy8gZm9ybSB7IHdvcmtmbG93SWQgfSBpcyBhIHBsYWluIG9iamVjdCwgbm90IGEgZnVuY3Rpb24uXG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCB3b3JrZmxvd0lkID0gKHZhbHVlIGFzIGFueSkud29ya2Zsb3dJZDtcbiAgICAgIGlmICh0eXBlb2Ygd29ya2Zsb3dJZCAhPT0gJ3N0cmluZycpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiB7IHdvcmtmbG93SWQgfTtcbiAgICB9LFxuICAgIFVSTFNlYXJjaFBhcmFtczogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5VUkxTZWFyY2hQYXJhbXMpKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAodmFsdWUuc2l6ZSA9PT0gMCkgcmV0dXJuICcuJztcbiAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAgIH0sXG4gICAgVWludDhBcnJheTogKHZhbHVlKSA9PlxuICAgICAgdmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuVWludDhBcnJheSAmJiB2aWV3VG9CYXNlNjQodmFsdWUpLFxuICAgIFVpbnQ4Q2xhbXBlZEFycmF5OiAodmFsdWUpID0+XG4gICAgICB2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5VaW50OENsYW1wZWRBcnJheSAmJiB2aWV3VG9CYXNlNjQodmFsdWUpLFxuICAgIFVpbnQxNkFycmF5OiAodmFsdWUpID0+XG4gICAgICB2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5VaW50MTZBcnJheSAmJiB2aWV3VG9CYXNlNjQodmFsdWUpLFxuICAgIFVpbnQzMkFycmF5OiAodmFsdWUpID0+XG4gICAgICB2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5VaW50MzJBcnJheSAmJiB2aWV3VG9CYXNlNjQodmFsdWUpLFxuICB9O1xufVxuXG4vLyAtLS0tIFJldml2ZXJzIC0tLS1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbW1vblJldml2ZXJzKFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzXG4pOiBQYXJ0aWFsPFJldml2ZXJzPiB7XG4gIHJldHVybiB7XG4gICAgQXJyYXlCdWZmZXI6ICh2YWx1ZTogc3RyaW5nKSA9PiByZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSwgZ2xvYmFsKSxcbiAgICBCaWdJbnQ6ICh2YWx1ZTogc3RyaW5nKSA9PiBnbG9iYWwuQmlnSW50KHZhbHVlKSxcbiAgICBCaWdJbnQ2NEFycmF5OiAodmFsdWU6IHN0cmluZykgPT5cbiAgICAgIG5ldyBnbG9iYWwuQmlnSW50NjRBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSwgZ2xvYmFsKSksXG4gICAgQmlnVWludDY0QXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PlxuICAgICAgbmV3IGdsb2JhbC5CaWdVaW50NjRBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSwgZ2xvYmFsKSksXG4gICAgRGF0ZTogKHZhbHVlKSA9PiBuZXcgZ2xvYmFsLkRhdGUodmFsdWUpLFxuICAgIERPTUV4Y2VwdGlvbjogKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBlcnJvciA9IG5ldyBnbG9iYWwuRE9NRXhjZXB0aW9uKHZhbHVlLm1lc3NhZ2UsIHZhbHVlLm5hbWUpO1xuICAgICAgaWYgKHZhbHVlLnN0YWNrICE9PSB1bmRlZmluZWQpIGVycm9yLnN0YWNrID0gdmFsdWUuc3RhY2s7XG4gICAgICAvLyBET01FeGNlcHRpb24ncyBjb25zdHJ1Y3RvciBkb2Vzbid0IGFjY2VwdCBhIGNhdXNlIG9wdGlvbiwgc29cbiAgICAgIC8vIHdlIHNldCBpdCBtYW51YWxseSB3aGVuIHByZXNlbnQgaW4gdGhlIHNlcmlhbGl6ZWQgZGF0YS5cbiAgICAgIGlmICgnY2F1c2UnIGluIHZhbHVlKSBlcnJvci5jYXVzZSA9IHZhbHVlLmNhdXNlO1xuICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH0sXG4gICAgLy8gRXJyb3Igc3ViY2xhc3MgcmV2aXZlcnMgcmVjb25zdHJ1Y3QgdGhlIGNvcnJlY3QgYnVpbHQtaW4gRXJyb3IgdHlwZS5cbiAgICAvLyBTZWUgYG1ha2VFcnJvclN1YmNsYXNzUmV2aXZlcmAgZm9yIGltcGxlbWVudGF0aW9uIGRldGFpbHMuXG4gICAgRXZhbEVycm9yOiBtYWtlRXJyb3JTdWJjbGFzc1Jldml2ZXIoZ2xvYmFsLCAnRXZhbEVycm9yJyksXG4gICAgLy8gYEZhdGFsRXJyb3JgIGFuZCBgUmV0cnlhYmxlRXJyb3JgIGFyZSBub3QgYnVpbHQtaW5zLCBzbyB3ZSByZXNvbHZlIHRoZW1cbiAgICAvLyBmcm9tIHRoZSBjb25zdW1lcidzIGBnbG9iYWxUaGlzYCB2aWEgYSBgU3ltYm9sLmZvciguLi4pYCBrZXkgcmVnaXN0ZXJlZFxuICAgIC8vIGJ5IGBAd29ya2Zsb3cvZXJyb3JzYCBvbiBsb2FkLiBUaGlzIG1ha2VzIGBpbnN0YW5jZW9mIEZhdGFsRXJyb3JgIHdvcmtcbiAgICAvLyBpbiB1c2VyIGNvZGUgdGhhdCBsaXZlcyBpbiBhIGRpZmZlcmVudCByZWFsbSB0aGFuIHRoaXMgcmVkdWNlciBtb2R1bGVcbiAgICAvLyAoZS5nLiB3aGVuIHRoZSBob3N0IGh5ZHJhdGVzIGEgdmFsdWUgZGVzdGluZWQgZm9yIGEgd29ya2Zsb3cgVk1cbiAgICAvLyBjb250ZXh0KS4gU2VlIHRoZSByZWdpc3RyYXRpb24gYmxvY2sgYXQgdGhlIGJvdHRvbSBvZlxuICAgIC8vIGBwYWNrYWdlcy9lcnJvcnMvc3JjL2luZGV4LnRzYCBmb3IgZGV0YWlscy4gRmFsbHMgYmFjayB0byB0aGUgaW1wb3J0ZWRcbiAgICAvLyBjbGFzcyBmb3IgZW52aXJvbm1lbnRzIHdoZXJlIG5vIGJ1bmRsZWQgYEB3b3JrZmxvdy9lcnJvcnNgIGhhcyBsb2FkZWRcbiAgICAvLyBpbiB0aGUgY29uc3VtZXIgcmVhbG0uXG4gICAgRmF0YWxFcnJvcjogKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBDdG9yID1cbiAgICAgICAgKChnbG9iYWwgYXMgUmVjb3JkPHN5bWJvbCwgdW5rbm93bj4pW1xuICAgICAgICAgIFN5bWJvbC5mb3IoJ0B3b3JrZmxvdy9lcnJvcnMvL0ZhdGFsRXJyb3InKVxuICAgICAgICBdIGFzIHR5cGVvZiBGYXRhbEVycm9yIHwgdW5kZWZpbmVkKSA/PyBGYXRhbEVycm9yO1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgQ3Rvcih2YWx1ZS5tZXNzYWdlKTtcbiAgICAgIGlmICh2YWx1ZS5zdGFjayAhPT0gdW5kZWZpbmVkKSBlcnJvci5zdGFjayA9IHZhbHVlLnN0YWNrO1xuICAgICAgaWYgKCdjYXVzZScgaW4gdmFsdWUpIGVycm9yLmNhdXNlID0gdmFsdWUuY2F1c2U7XG4gICAgICByZXR1cm4gZXJyb3I7XG4gICAgfSxcbiAgICBIb29rQ29uZmxpY3RFcnJvcjogKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBDdG9yID1cbiAgICAgICAgKChnbG9iYWwgYXMgUmVjb3JkPHN5bWJvbCwgdW5rbm93bj4pW1xuICAgICAgICAgIFN5bWJvbC5mb3IoJ0B3b3JrZmxvdy9lcnJvcnMvL0hvb2tDb25mbGljdEVycm9yJylcbiAgICAgICAgXSBhcyB0eXBlb2YgSG9va0NvbmZsaWN0RXJyb3IgfCB1bmRlZmluZWQpID8/IEhvb2tDb25mbGljdEVycm9yO1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgQ3Rvcih2YWx1ZS50b2tlbiwgdmFsdWUuY29uZmxpY3RpbmdSdW5JZCk7XG4gICAgICBpZiAodmFsdWUuc3RhY2sgIT09IHVuZGVmaW5lZCkgZXJyb3Iuc3RhY2sgPSB2YWx1ZS5zdGFjaztcbiAgICAgIGlmICgnY2F1c2UnIGluIHZhbHVlKSB7XG4gICAgICAgIChlcnJvciBhcyBFcnJvciAmIHsgY2F1c2U/OiB1bmtub3duIH0pLmNhdXNlID0gdmFsdWUuY2F1c2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gZXJyb3I7XG4gICAgfSxcbiAgICBSYW5nZUVycm9yOiBtYWtlRXJyb3JTdWJjbGFzc1Jldml2ZXIoZ2xvYmFsLCAnUmFuZ2VFcnJvcicpLFxuICAgIFJlZmVyZW5jZUVycm9yOiBtYWtlRXJyb3JTdWJjbGFzc1Jldml2ZXIoZ2xvYmFsLCAnUmVmZXJlbmNlRXJyb3InKSxcbiAgICBSZXRyeWFibGVFcnJvcjogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBVc2UgdGhlIGNvbnRleHQncyBgRGF0ZWAgY29uc3RydWN0b3IgKG1hdGNoaW5nIHRoZSByZXN0IG9mIHRoaXNcbiAgICAgIC8vIG1vZHVsZSkgc28gdGhlIHJlc3VsdGluZyBgcmV0cnlBZnRlcmAgRGF0ZSBwYXNzZXMgYGluc3RhbmNlb2ZcbiAgICAgIC8vIGdsb2JhbC5EYXRlYCBjaGVja3MgaW4gdGhlIHRhcmdldCByZWFsbS4gU2VlIHRoZSBGYXRhbEVycm9yIHJldml2ZXJcbiAgICAgIC8vIGFib3ZlIGZvciB3aHkgd2UgcmVzb2x2ZSBgUmV0cnlhYmxlRXJyb3JgIGZyb20gdGhlIGNvbnN1bWVyJ3NcbiAgICAgIC8vIGdsb2JhbFRoaXMgaW5zdGVhZCBvZiB0aGUgaW1wb3J0ZWQgY2xhc3MuXG4gICAgICBjb25zdCBDdG9yID1cbiAgICAgICAgKChnbG9iYWwgYXMgUmVjb3JkPHN5bWJvbCwgdW5rbm93bj4pW1xuICAgICAgICAgIFN5bWJvbC5mb3IoJ0B3b3JrZmxvdy9lcnJvcnMvL1JldHJ5YWJsZUVycm9yJylcbiAgICAgICAgXSBhcyB0eXBlb2YgUmV0cnlhYmxlRXJyb3IgfCB1bmRlZmluZWQpID8/IFJldHJ5YWJsZUVycm9yO1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgQ3Rvcih2YWx1ZS5tZXNzYWdlLCB7XG4gICAgICAgIHJldHJ5QWZ0ZXI6IG5ldyBnbG9iYWwuRGF0ZSh2YWx1ZS5yZXRyeUFmdGVyKSxcbiAgICAgIH0pO1xuICAgICAgaWYgKHZhbHVlLnN0YWNrICE9PSB1bmRlZmluZWQpIGVycm9yLnN0YWNrID0gdmFsdWUuc3RhY2s7XG4gICAgICBpZiAoJ2NhdXNlJyBpbiB2YWx1ZSkgZXJyb3IuY2F1c2UgPSB2YWx1ZS5jYXVzZTtcbiAgICAgIHJldHVybiBlcnJvcjtcbiAgICB9LFxuICAgIFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gUmVzb2x2ZSBmcm9tIHRoZSBjb25zdW1lcidzIGdsb2JhbFRoaXMgKHNlZSB0aGUgRmF0YWxFcnJvciByZXZpdmVyXG4gICAgICAvLyBhYm92ZSkgc28gYGluc3RhbmNlb2YgUnVudGltZURlY3J5cHRpb25FcnJvcmAgaG9sZHMgYWNyb3NzIHJlYWxtcy5cbiAgICAgIGNvbnN0IEN0b3IgPVxuICAgICAgICAoKGdsb2JhbCBhcyBSZWNvcmQ8c3ltYm9sLCB1bmtub3duPilbXG4gICAgICAgICAgU3ltYm9sLmZvcignQHdvcmtmbG93L2Vycm9ycy8vUnVudGltZURlY3J5cHRpb25FcnJvcicpXG4gICAgICAgIF0gYXMgdHlwZW9mIFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3IgfCB1bmRlZmluZWQpID8/XG4gICAgICAgIFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3I7XG4gICAgICBjb25zdCBvcHRzOiBDb25zdHJ1Y3RvclBhcmFtZXRlcnM8dHlwZW9mIFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3I+WzFdID0ge307XG4gICAgICBpZiAoJ2NhdXNlJyBpbiB2YWx1ZSkgb3B0cy5jYXVzZSA9IHZhbHVlLmNhdXNlO1xuICAgICAgaWYgKHZhbHVlLmNvbnRleHQgIT09IHVuZGVmaW5lZCkgb3B0cy5jb250ZXh0ID0gdmFsdWUuY29udGV4dDtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEN0b3IodmFsdWUubWVzc2FnZSwgb3B0cyk7XG4gICAgICBpZiAodmFsdWUuc3RhY2sgIT09IHVuZGVmaW5lZCkgZXJyb3Iuc3RhY2sgPSB2YWx1ZS5zdGFjaztcbiAgICAgIHJldHVybiBlcnJvcjtcbiAgICB9LFxuICAgIFN5bnRheEVycm9yOiBtYWtlRXJyb3JTdWJjbGFzc1Jldml2ZXIoZ2xvYmFsLCAnU3ludGF4RXJyb3InKSxcbiAgICBUeXBlRXJyb3I6IG1ha2VFcnJvclN1YmNsYXNzUmV2aXZlcihnbG9iYWwsICdUeXBlRXJyb3InKSxcbiAgICBVUklFcnJvcjogbWFrZUVycm9yU3ViY2xhc3NSZXZpdmVyKGdsb2JhbCwgJ1VSSUVycm9yJyksXG4gICAgQWdncmVnYXRlRXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3Qgb3B0cyA9ICdjYXVzZScgaW4gdmFsdWUgPyB7IGNhdXNlOiB2YWx1ZS5jYXVzZSB9IDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgZ2xvYmFsLkFnZ3JlZ2F0ZUVycm9yKFxuICAgICAgICB2YWx1ZS5lcnJvcnMsXG4gICAgICAgIHZhbHVlLm1lc3NhZ2UsXG4gICAgICAgIG9wdHNcbiAgICAgICk7XG4gICAgICBpZiAodmFsdWUuc3RhY2sgIT09IHVuZGVmaW5lZCkgZXJyb3Iuc3RhY2sgPSB2YWx1ZS5zdGFjaztcbiAgICAgIHJldHVybiBlcnJvcjtcbiAgICB9LFxuICAgIC8vIEJhc2UgRXJyb3IgcmV2aXZlciDigJQgdXNlZCBmb3IgcGxhaW4gRXJyb3IgaW5zdGFuY2VzIGFuZCB1bnJlY29nbml6ZWRcbiAgICAvLyBFcnJvciBzdWJjbGFzc2VzLiBQcmVzZXJ2ZXMgYG5hbWVgIHNvIHRoZSBlcnJvcidzIGlkZW50aXR5IGlzIHJldGFpbmVkLlxuICAgIEVycm9yOiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IG9wdHMgPSAnY2F1c2UnIGluIHZhbHVlID8geyBjYXVzZTogdmFsdWUuY2F1c2UgfSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IGdsb2JhbC5FcnJvcih2YWx1ZS5tZXNzYWdlLCBvcHRzKTtcbiAgICAgIGVycm9yLm5hbWUgPSB2YWx1ZS5uYW1lO1xuICAgICAgaWYgKHZhbHVlLnN0YWNrICE9PSB1bmRlZmluZWQpIGVycm9yLnN0YWNrID0gdmFsdWUuc3RhY2s7XG4gICAgICByZXR1cm4gZXJyb3I7XG4gICAgfSxcbiAgICBGbG9hdDMyQXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PlxuICAgICAgbmV3IGdsb2JhbC5GbG9hdDMyQXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUsIGdsb2JhbCkpLFxuICAgIEZsb2F0NjRBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+XG4gICAgICBuZXcgZ2xvYmFsLkZsb2F0NjRBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSwgZ2xvYmFsKSksXG4gICAgSGVhZGVyczogKHZhbHVlKSA9PiBuZXcgZ2xvYmFsLkhlYWRlcnModmFsdWUpLFxuICAgIEludDhBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+XG4gICAgICBuZXcgZ2xvYmFsLkludDhBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSwgZ2xvYmFsKSksXG4gICAgSW50MTZBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+XG4gICAgICBuZXcgZ2xvYmFsLkludDE2QXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUsIGdsb2JhbCkpLFxuICAgIEludDMyQXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PlxuICAgICAgbmV3IGdsb2JhbC5JbnQzMkFycmF5KHJldml2ZUFycmF5QnVmZmVyKHZhbHVlLCBnbG9iYWwpKSxcbiAgICBNYXA6ICh2YWx1ZSkgPT4gbmV3IGdsb2JhbC5NYXAodmFsdWUpLFxuICAgIFJlZ0V4cDogKHZhbHVlKSA9PiBuZXcgZ2xvYmFsLlJlZ0V4cCh2YWx1ZS5zb3VyY2UsIHZhbHVlLmZsYWdzKSxcbiAgICBTZXQ6ICh2YWx1ZSkgPT4gbmV3IGdsb2JhbC5TZXQodmFsdWUpLFxuICAgIFVSTDogKHZhbHVlKSA9PiBuZXcgZ2xvYmFsLlVSTCh2YWx1ZSksXG4gICAgV29ya2Zsb3dGdW5jdGlvbjogKHZhbHVlKSA9PlxuICAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICdXb3JrZmxvdyBmdW5jdGlvbnMgY2Fubm90IGJlIGNhbGxlZCBkaXJlY3RseS4gVXNlIHN0YXJ0KCkgdG8gaW52b2tlIHRoZW0uJ1xuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICAgIHsgd29ya2Zsb3dJZDogdmFsdWUud29ya2Zsb3dJZCB9XG4gICAgICApLFxuICAgIFVSTFNlYXJjaFBhcmFtczogKHZhbHVlKSA9PlxuICAgICAgbmV3IGdsb2JhbC5VUkxTZWFyY2hQYXJhbXModmFsdWUgPT09ICcuJyA/ICcnIDogdmFsdWUpLFxuICAgIFVpbnQ4QXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PlxuICAgICAgbmV3IGdsb2JhbC5VaW50OEFycmF5KHJldml2ZUFycmF5QnVmZmVyKHZhbHVlLCBnbG9iYWwpKSxcbiAgICBVaW50OENsYW1wZWRBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+XG4gICAgICBuZXcgZ2xvYmFsLlVpbnQ4Q2xhbXBlZEFycmF5KHJldml2ZUFycmF5QnVmZmVyKHZhbHVlLCBnbG9iYWwpKSxcbiAgICBVaW50MTZBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+XG4gICAgICBuZXcgZ2xvYmFsLlVpbnQxNkFycmF5KHJldml2ZUFycmF5QnVmZmVyKHZhbHVlLCBnbG9iYWwpKSxcbiAgICBVaW50MzJBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+XG4gICAgICBuZXcgZ2xvYmFsLlVpbnQzMkFycmF5KHJldml2ZUFycmF5QnVmZmVyKHZhbHVlLCBnbG9iYWwpKSxcbiAgfTtcbn1cblxuLy8gUmUtZXhwb3J0IGZvciB1c2UgaW4gbGVnYWN5IGNvbXBhdFxuZXhwb3J0IHsgcmV2aXZlIH07XG4iXX0=
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reducer and reviver for step function references.
|
|
3
|
+
*
|
|
4
|
+
* In workflow mode, step functions are replaced by the SWC plugin with
|
|
5
|
+
* proxies created by `globalThis[Symbol.for("WORKFLOW_USE_STEP")]("stepId")`.
|
|
6
|
+
* These proxies have a `.stepId` property and optionally a `.__closureVarsFn`
|
|
7
|
+
* for captured closure variables. They may additionally have `.__boundThis`
|
|
8
|
+
* (and rarely `.__boundArgs`) when the SWC plugin emitted
|
|
9
|
+
* `useStep(...).bind(this)` for a nested arrow step that lexically
|
|
10
|
+
* captured `this` (see `packages/swc-plugin-workflow/spec.md` → "Lexical
|
|
11
|
+
* `this` Capture in Nested Arrow Steps").
|
|
12
|
+
*
|
|
13
|
+
* The reducer serializes them as
|
|
14
|
+
* `{ stepId, closureVars?, boundThis?, boundArgs? }`.
|
|
15
|
+
* The reviver reconstructs them by calling WORKFLOW_USE_STEP and, when
|
|
16
|
+
* `boundThis` (or `boundArgs`) is present, re-binding the resulting
|
|
17
|
+
* proxy so the caller's captured `this` (and prefilled args) survive the
|
|
18
|
+
* round trip.
|
|
19
|
+
*/
|
|
20
|
+
import type { Reducers, Revivers } from '../types.js';
|
|
21
|
+
export declare function getStepFunctionReducer(): Partial<Reducers>;
|
|
22
|
+
/**
|
|
23
|
+
* Create the StepFunction reviver for workflow context.
|
|
24
|
+
*
|
|
25
|
+
* The reviver calls WORKFLOW_USE_STEP to create the step proxy,
|
|
26
|
+
* restoring the ability to call the step from workflow code. If the
|
|
27
|
+
* serialized payload includes `boundThis` (and optionally `boundArgs`),
|
|
28
|
+
* the reviver also re-binds the freshly-created proxy so a step proxy
|
|
29
|
+
* that was constructed with `.bind(this, …)` in the workflow bundle
|
|
30
|
+
* continues to carry that receiver and any prefilled arguments after
|
|
31
|
+
* being deserialized in another bundle (e.g. when passed as a step
|
|
32
|
+
* argument).
|
|
33
|
+
*/
|
|
34
|
+
export declare function getStepFunctionReviver(global?: Record<string, any>): Partial<Revivers>;
|
|
35
|
+
//# sourceMappingURL=step-function.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"step-function.d.ts","sourceRoot":"","sources":["../../../src/serialization/reducers/step-function.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAItD,wBAAgB,sBAAsB,IAAI,OAAO,CAAC,QAAQ,CAAC,CAuC1D;AAID;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAc,GACvC,OAAO,CAAC,QAAQ,CAAC,CA8BnB"}
|