@workflow/core 5.0.0-beta.4 → 5.0.0-beta.5

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.
Files changed (161) hide show
  1. package/dist/capture-stack.d.ts +16 -0
  2. package/dist/capture-stack.d.ts.map +1 -0
  3. package/dist/capture-stack.js +21 -0
  4. package/dist/classify-error.d.ts +7 -0
  5. package/dist/classify-error.d.ts.map +1 -1
  6. package/dist/classify-error.js +25 -4
  7. package/dist/context-errors.d.ts +27 -0
  8. package/dist/context-errors.d.ts.map +1 -0
  9. package/dist/context-errors.js +101 -0
  10. package/dist/context-violation-error.d.ts +97 -0
  11. package/dist/context-violation-error.d.ts.map +1 -0
  12. package/dist/context-violation-error.js +147 -0
  13. package/dist/create-hook.d.ts.map +1 -1
  14. package/dist/create-hook.js +4 -3
  15. package/dist/define-hook.d.ts.map +1 -1
  16. package/dist/define-hook.js +20 -5
  17. package/dist/describe-error.d.ts +70 -0
  18. package/dist/describe-error.d.ts.map +1 -0
  19. package/dist/describe-error.js +119 -0
  20. package/dist/encryption.d.ts.map +1 -1
  21. package/dist/encryption.js +4 -20
  22. package/dist/events-consumer.d.ts +7 -0
  23. package/dist/events-consumer.d.ts.map +1 -1
  24. package/dist/events-consumer.js +9 -2
  25. package/dist/flushable-stream.d.ts +10 -10
  26. package/dist/flushable-stream.d.ts.map +1 -1
  27. package/dist/flushable-stream.js +13 -12
  28. package/dist/global.d.ts +4 -0
  29. package/dist/global.d.ts.map +1 -1
  30. package/dist/global.js +8 -2
  31. package/dist/log-format.d.ts +25 -0
  32. package/dist/log-format.d.ts.map +1 -0
  33. package/dist/log-format.js +250 -0
  34. package/dist/logger.d.ts +28 -30
  35. package/dist/logger.d.ts.map +1 -1
  36. package/dist/logger.js +77 -31
  37. package/dist/private.js +3 -3
  38. package/dist/runtime/get-port-lazy.d.ts +10 -0
  39. package/dist/runtime/get-port-lazy.d.ts.map +1 -0
  40. package/dist/runtime/get-port-lazy.js +30 -0
  41. package/dist/runtime/get-world-lazy.d.ts +32 -0
  42. package/dist/runtime/get-world-lazy.d.ts.map +1 -0
  43. package/dist/runtime/get-world-lazy.js +56 -0
  44. package/dist/runtime/helpers.d.ts +38 -5
  45. package/dist/runtime/helpers.d.ts.map +1 -1
  46. package/dist/runtime/helpers.js +67 -18
  47. package/dist/runtime/resume-hook.js +4 -4
  48. package/dist/runtime/run.d.ts.map +1 -1
  49. package/dist/runtime/run.js +31 -6
  50. package/dist/runtime/start.js +3 -3
  51. package/dist/runtime/step-executor.d.ts +40 -0
  52. package/dist/runtime/step-executor.d.ts.map +1 -0
  53. package/dist/runtime/step-executor.js +480 -0
  54. package/dist/runtime/step-handler.d.ts.map +1 -1
  55. package/dist/runtime/step-handler.js +209 -111
  56. package/dist/runtime/suspension-handler.d.ts +22 -4
  57. package/dist/runtime/suspension-handler.d.ts.map +1 -1
  58. package/dist/runtime/suspension-handler.js +86 -73
  59. package/dist/runtime/world-init.d.ts +75 -0
  60. package/dist/runtime/world-init.d.ts.map +1 -0
  61. package/dist/runtime/world-init.js +75 -0
  62. package/dist/runtime/world.d.ts.map +1 -1
  63. package/dist/runtime/world.js +47 -18
  64. package/dist/runtime.d.ts +8 -7
  65. package/dist/runtime.d.ts.map +1 -1
  66. package/dist/runtime.js +649 -292
  67. package/dist/schemas.d.ts +1 -1
  68. package/dist/schemas.d.ts.map +1 -1
  69. package/dist/schemas.js +1 -1
  70. package/dist/serialization/client.d.ts +17 -0
  71. package/dist/serialization/client.d.ts.map +1 -0
  72. package/dist/serialization/client.js +44 -0
  73. package/dist/serialization/codec-devalue.d.ts +14 -0
  74. package/dist/serialization/codec-devalue.d.ts.map +1 -0
  75. package/dist/serialization/codec-devalue.js +98 -0
  76. package/dist/serialization/codec.d.ts +90 -0
  77. package/dist/serialization/codec.d.ts.map +1 -0
  78. package/dist/serialization/codec.js +17 -0
  79. package/dist/serialization/encryption.d.ts +32 -0
  80. package/dist/serialization/encryption.d.ts.map +1 -0
  81. package/dist/serialization/encryption.js +51 -0
  82. package/dist/serialization/errors.d.ts +21 -0
  83. package/dist/serialization/errors.d.ts.map +1 -0
  84. package/dist/serialization/errors.js +41 -0
  85. package/dist/serialization/format.d.ts +60 -0
  86. package/dist/serialization/format.d.ts.map +1 -0
  87. package/dist/serialization/format.js +97 -0
  88. package/dist/serialization/index.d.ts +18 -0
  89. package/dist/serialization/index.d.ts.map +1 -0
  90. package/dist/serialization/index.js +20 -0
  91. package/dist/serialization/reducers/class.d.ts +11 -0
  92. package/dist/serialization/reducers/class.d.ts.map +1 -0
  93. package/dist/serialization/reducers/class.js +68 -0
  94. package/dist/serialization/reducers/common.d.ts +16 -0
  95. package/dist/serialization/reducers/common.d.ts.map +1 -0
  96. package/dist/serialization/reducers/common.js +362 -0
  97. package/dist/serialization/reducers/step-function.d.ts +35 -0
  98. package/dist/serialization/reducers/step-function.d.ts.map +1 -0
  99. package/dist/serialization/reducers/step-function.js +88 -0
  100. package/dist/serialization/step.d.ts +17 -0
  101. package/dist/serialization/step.d.ts.map +1 -0
  102. package/dist/serialization/step.js +44 -0
  103. package/dist/serialization/types.d.ts +201 -0
  104. package/dist/serialization/types.d.ts.map +1 -0
  105. package/dist/serialization/types.js +21 -0
  106. package/dist/serialization/workflow.d.ts +29 -0
  107. package/dist/serialization/workflow.d.ts.map +1 -0
  108. package/dist/serialization/workflow.js +54 -0
  109. package/dist/serialization-format.d.ts.map +1 -1
  110. package/dist/serialization-format.js +77 -3
  111. package/dist/serialization.d.ts +202 -226
  112. package/dist/serialization.d.ts.map +1 -1
  113. package/dist/serialization.js +773 -633
  114. package/dist/sleep.d.ts.map +1 -1
  115. package/dist/sleep.js +3 -2
  116. package/dist/step/get-closure-vars.d.ts.map +1 -1
  117. package/dist/step/get-closure-vars.js +3 -2
  118. package/dist/step/get-step-metadata.d.ts.map +1 -1
  119. package/dist/step/get-step-metadata.js +3 -2
  120. package/dist/step/get-workflow-metadata.d.ts.map +1 -1
  121. package/dist/step/get-workflow-metadata.js +3 -2
  122. package/dist/step/writable-stream.d.ts.map +1 -1
  123. package/dist/step/writable-stream.js +3 -2
  124. package/dist/step.d.ts.map +1 -1
  125. package/dist/step.js +83 -16
  126. package/dist/symbols.d.ts +4 -0
  127. package/dist/symbols.d.ts.map +1 -1
  128. package/dist/symbols.js +5 -1
  129. package/dist/telemetry/semantic-conventions.d.ts +2 -2
  130. package/dist/telemetry/semantic-conventions.js +1 -1
  131. package/dist/util.d.ts +18 -3
  132. package/dist/util.d.ts.map +1 -1
  133. package/dist/util.js +28 -5
  134. package/dist/version.d.ts +1 -1
  135. package/dist/version.js +2 -2
  136. package/dist/vm/index.d.ts.map +1 -1
  137. package/dist/vm/index.js +3 -2
  138. package/dist/workflow/abort-controller.d.ts +65 -0
  139. package/dist/workflow/abort-controller.d.ts.map +1 -0
  140. package/dist/workflow/abort-controller.js +245 -0
  141. package/dist/workflow/create-hook.d.ts.map +1 -1
  142. package/dist/workflow/create-hook.js +3 -2
  143. package/dist/workflow/define-hook.d.ts +1 -1
  144. package/dist/workflow/define-hook.d.ts.map +1 -1
  145. package/dist/workflow/define-hook.js +8 -4
  146. package/dist/workflow/get-workflow-metadata.d.ts.map +1 -1
  147. package/dist/workflow/get-workflow-metadata.js +14 -3
  148. package/dist/workflow/index.d.ts.map +1 -1
  149. package/dist/workflow/index.js +4 -3
  150. package/dist/workflow/world-init-stub.d.ts +15 -0
  151. package/dist/workflow/world-init-stub.d.ts.map +1 -0
  152. package/dist/workflow/world-init-stub.js +15 -0
  153. package/dist/workflow.d.ts.map +1 -1
  154. package/dist/workflow.js +71 -28
  155. package/docs/foundations/cancellation.mdx +460 -0
  156. package/docs/foundations/errors-and-retries.mdx +7 -3
  157. package/docs/foundations/meta.json +1 -0
  158. package/docs/foundations/serialization.mdx +77 -41
  159. package/docs/how-it-works/cancellation.mdx +287 -0
  160. package/docs/how-it-works/meta.json +2 -1
  161. package/package.json +15 -6
@@ -0,0 +1,362 @@
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, RetryableError } 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
+ RangeError: makeErrorSubclassReducer('RangeError'),
161
+ ReferenceError: makeErrorSubclassReducer('ReferenceError'),
162
+ // RetryableError carries an extra `retryAfter` Date that we serialize as
163
+ // a numeric epoch timestamp. The Date reducer uses `instanceof global.Date`,
164
+ // which fails for Dates from a different VM realm; serializing as a
165
+ // number sidesteps that issue.
166
+ RetryableError: (value) => {
167
+ const base = reduceNamedErrorSubclassBase('RetryableError', value);
168
+ if (!base)
169
+ return false;
170
+ const retryAfterRaw = value.retryAfter;
171
+ let retryAfter;
172
+ if (retryAfterRaw &&
173
+ typeof retryAfterRaw === 'object' &&
174
+ typeof retryAfterRaw.getTime === 'function') {
175
+ const t = retryAfterRaw.getTime();
176
+ retryAfter = Number.isNaN(t) ? Date.now() + 1000 : t;
177
+ }
178
+ else if (typeof retryAfterRaw === 'string' ||
179
+ typeof retryAfterRaw === 'number') {
180
+ const t = new Date(retryAfterRaw).getTime();
181
+ retryAfter = Number.isNaN(t) ? Date.now() + 1000 : t;
182
+ }
183
+ else {
184
+ retryAfter = Date.now() + 1000;
185
+ }
186
+ return {
187
+ ...base,
188
+ retryAfter,
189
+ };
190
+ },
191
+ SyntaxError: makeErrorSubclassReducer('SyntaxError'),
192
+ TypeError: makeErrorSubclassReducer('TypeError'),
193
+ URIError: makeErrorSubclassReducer('URIError'),
194
+ // AggregateError is similar to other subclasses but also preserves the
195
+ // `errors` array. We extend the base helper's output here.
196
+ AggregateError: (value) => {
197
+ const base = reduceNamedErrorSubclassBase('AggregateError', value);
198
+ if (!base)
199
+ return false;
200
+ return {
201
+ ...base,
202
+ errors: value.errors,
203
+ };
204
+ },
205
+ // Base Error reducer — catch-all for any Error instance not matched by a
206
+ // specific subclass reducer above (including user Error subclasses without
207
+ // WORKFLOW_SERIALIZE). Preserves `name` so the error's identity is retained
208
+ // even though the exact class cannot be reconstructed.
209
+ Error: (value) => {
210
+ if (!types.isNativeError(value))
211
+ return false;
212
+ const reduced = {
213
+ name: value.name,
214
+ message: value.message,
215
+ stack: value.stack,
216
+ };
217
+ if ('cause' in value)
218
+ reduced.cause = value.cause;
219
+ return reduced;
220
+ },
221
+ Float32Array: (value) => value instanceof global.Float32Array && viewToBase64(value),
222
+ Float64Array: (value) => value instanceof global.Float64Array && viewToBase64(value),
223
+ Headers: (value) => value instanceof global.Headers && Array.from(value),
224
+ Int8Array: (value) => value instanceof global.Int8Array && viewToBase64(value),
225
+ Int16Array: (value) => value instanceof global.Int16Array && viewToBase64(value),
226
+ Int32Array: (value) => value instanceof global.Int32Array && viewToBase64(value),
227
+ Map: (value) => value instanceof global.Map && Array.from(value),
228
+ RegExp: (value) => value instanceof global.RegExp && {
229
+ source: value.source,
230
+ flags: value.flags,
231
+ },
232
+ // Request and Response are intentionally NOT in common reducers.
233
+ // They require mode-specific revivers (stream handling, etc.) and
234
+ // including them here without matching revivers would cause them
235
+ // to deserialize as plain objects.
236
+ Set: (value) => value instanceof global.Set && Array.from(value),
237
+ URL: (value) => value instanceof global.URL && value.href,
238
+ WorkflowFunction: (value) => {
239
+ // Only match function references with a workflowId property (set by
240
+ // the SWC compiler on workflow functions). Plain { workflowId } objects
241
+ // are NOT matched — this prevents infinite recursion since the reduced
242
+ // form { workflowId } is a plain object, not a function.
243
+ if (typeof value !== 'function')
244
+ return false;
245
+ const workflowId = value.workflowId;
246
+ if (typeof workflowId !== 'string')
247
+ return false;
248
+ return { workflowId };
249
+ },
250
+ URLSearchParams: (value) => {
251
+ if (!(value instanceof global.URLSearchParams))
252
+ return false;
253
+ if (value.size === 0)
254
+ return '.';
255
+ return String(value);
256
+ },
257
+ Uint8Array: (value) => value instanceof global.Uint8Array && viewToBase64(value),
258
+ Uint8ClampedArray: (value) => value instanceof global.Uint8ClampedArray && viewToBase64(value),
259
+ Uint16Array: (value) => value instanceof global.Uint16Array && viewToBase64(value),
260
+ Uint32Array: (value) => value instanceof global.Uint32Array && viewToBase64(value),
261
+ };
262
+ }
263
+ // ---- Revivers ----
264
+ export function getCommonRevivers(global = globalThis) {
265
+ return {
266
+ ArrayBuffer: (value) => reviveArrayBuffer(value, global),
267
+ BigInt: (value) => global.BigInt(value),
268
+ BigInt64Array: (value) => new global.BigInt64Array(reviveArrayBuffer(value, global)),
269
+ BigUint64Array: (value) => new global.BigUint64Array(reviveArrayBuffer(value, global)),
270
+ Date: (value) => new global.Date(value),
271
+ DOMException: (value) => {
272
+ const error = new global.DOMException(value.message, value.name);
273
+ if (value.stack !== undefined)
274
+ error.stack = value.stack;
275
+ // DOMException's constructor doesn't accept a cause option, so
276
+ // we set it manually when present in the serialized data.
277
+ if ('cause' in value)
278
+ error.cause = value.cause;
279
+ return error;
280
+ },
281
+ // Error subclass revivers reconstruct the correct built-in Error type.
282
+ // See `makeErrorSubclassReviver` for implementation details.
283
+ EvalError: makeErrorSubclassReviver(global, 'EvalError'),
284
+ // `FatalError` and `RetryableError` are not built-ins, so we resolve them
285
+ // from the consumer's `globalThis` via a `Symbol.for(...)` key registered
286
+ // by `@workflow/errors` on load. This makes `instanceof FatalError` work
287
+ // in user code that lives in a different realm than this reducer module
288
+ // (e.g. when the host hydrates a value destined for a workflow VM
289
+ // context). See the registration block at the bottom of
290
+ // `packages/errors/src/index.ts` for details. Falls back to the imported
291
+ // class for environments where no bundled `@workflow/errors` has loaded
292
+ // in the consumer realm.
293
+ FatalError: (value) => {
294
+ const Ctor = global[Symbol.for('@workflow/errors//FatalError')] ?? FatalError;
295
+ const error = new Ctor(value.message);
296
+ if (value.stack !== undefined)
297
+ error.stack = value.stack;
298
+ if ('cause' in value)
299
+ error.cause = value.cause;
300
+ return error;
301
+ },
302
+ RangeError: makeErrorSubclassReviver(global, 'RangeError'),
303
+ ReferenceError: makeErrorSubclassReviver(global, 'ReferenceError'),
304
+ RetryableError: (value) => {
305
+ // Use the context's `Date` constructor (matching the rest of this
306
+ // module) so the resulting `retryAfter` Date passes `instanceof
307
+ // global.Date` checks in the target realm. See the FatalError reviver
308
+ // above for why we resolve `RetryableError` from the consumer's
309
+ // globalThis instead of the imported class.
310
+ const Ctor = global[Symbol.for('@workflow/errors//RetryableError')] ?? RetryableError;
311
+ const error = new Ctor(value.message, {
312
+ retryAfter: new global.Date(value.retryAfter),
313
+ });
314
+ if (value.stack !== undefined)
315
+ error.stack = value.stack;
316
+ if ('cause' in value)
317
+ error.cause = value.cause;
318
+ return error;
319
+ },
320
+ SyntaxError: makeErrorSubclassReviver(global, 'SyntaxError'),
321
+ TypeError: makeErrorSubclassReviver(global, 'TypeError'),
322
+ URIError: makeErrorSubclassReviver(global, 'URIError'),
323
+ AggregateError: (value) => {
324
+ const opts = 'cause' in value ? { cause: value.cause } : undefined;
325
+ const error = new global.AggregateError(value.errors, value.message, opts);
326
+ if (value.stack !== undefined)
327
+ error.stack = value.stack;
328
+ return error;
329
+ },
330
+ // Base Error reviver — used for plain Error instances and unrecognized
331
+ // Error subclasses. Preserves `name` so the error's identity is retained.
332
+ Error: (value) => {
333
+ const opts = 'cause' in value ? { cause: value.cause } : undefined;
334
+ const error = new global.Error(value.message, opts);
335
+ error.name = value.name;
336
+ if (value.stack !== undefined)
337
+ error.stack = value.stack;
338
+ return error;
339
+ },
340
+ Float32Array: (value) => new global.Float32Array(reviveArrayBuffer(value, global)),
341
+ Float64Array: (value) => new global.Float64Array(reviveArrayBuffer(value, global)),
342
+ Headers: (value) => new global.Headers(value),
343
+ Int8Array: (value) => new global.Int8Array(reviveArrayBuffer(value, global)),
344
+ Int16Array: (value) => new global.Int16Array(reviveArrayBuffer(value, global)),
345
+ Int32Array: (value) => new global.Int32Array(reviveArrayBuffer(value, global)),
346
+ Map: (value) => new global.Map(value),
347
+ RegExp: (value) => new global.RegExp(value.source, value.flags),
348
+ Set: (value) => new global.Set(value),
349
+ URL: (value) => new global.URL(value),
350
+ WorkflowFunction: (value) => Object.assign(() => {
351
+ throw new Error('Workflow functions cannot be called directly. Use start() to invoke them.');
352
+ }, { workflowId: value.workflowId }),
353
+ URLSearchParams: (value) => new global.URLSearchParams(value === '.' ? '' : value),
354
+ Uint8Array: (value) => new global.Uint8Array(reviveArrayBuffer(value, global)),
355
+ Uint8ClampedArray: (value) => new global.Uint8ClampedArray(reviveArrayBuffer(value, global)),
356
+ Uint16Array: (value) => new global.Uint16Array(reviveArrayBuffer(value, global)),
357
+ Uint32Array: (value) => new global.Uint32Array(reviveArrayBuffer(value, global)),
358
+ };
359
+ }
360
+ // Re-export for use in legacy compat
361
+ export { revive };
362
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NlcmlhbGl6YXRpb24vcmVkdWNlcnMvY29tbW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7R0FTRztBQUVILE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUc5RCwyQkFBMkI7QUFFM0IsU0FBUyxtQkFBbUIsQ0FDMUIsS0FBc0IsRUFDdEIsTUFBYyxFQUNkLE1BQWM7SUFFZCxzREFBc0Q7SUFDdEQsSUFBSSxNQUFNLEtBQUssQ0FBQztRQUFFLE9BQU8sR0FBRyxDQUFDO0lBQzdCLDhEQUE4RDtJQUM5RCxNQUFNLEtBQUssR0FBRyxJQUFJLFVBQVUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3BELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDL0MsQ0FBQztBQUVELFNBQVMsWUFBWSxDQUFDLEtBQXNCO0lBQzFDLE9BQU8sbUJBQW1CLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUMvRSxDQUFDO0FBRUQsU0FBUyxpQkFBaUIsQ0FDeEIsS0FBYSxFQUNiLE1BQTJCO0lBRTNCLE1BQU0sTUFBTSxHQUFHLEtBQUssS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQzFDLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzdDLE1BQU0sV0FBVyxHQUFHLElBQUksTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsTUFB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LEVBQUUsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUNuQyxJQUFJLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDaEUsV0FBVyxFQUFFLENBQUMsS0FBYSxFQUFFLEVBQUUsQ0FDN0IsSUFBSSxNQUFNLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMxRCxXQUFXLEVBQUUsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUM3QixJQUFJLE1BQU0sQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0tBQzNELENBQUM7QUFDSixDQUFDO0FBRUQscUNBQXFDO0FBQ3JDLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29tbW9uIHJlZHVjZXJzIGFuZCByZXZpdmVycyBmb3IgdHlwZXMgc2hhcmVkIGFjcm9zcyBhbGwgc2VyaWFsaXphdGlvbiBtb2Rlcy5cbiAqXG4gKiBIYW5kbGVzOiBBcnJheUJ1ZmZlciwgQmlnSW50LCB0eXBlZCBhcnJheXMsIERhdGUsIEVycm9yLCBIZWFkZXJzLCBNYXAsIFNldCxcbiAqIFJlZ0V4cCwgUmVxdWVzdCwgUmVzcG9uc2UsIFVSTCwgVVJMU2VhcmNoUGFyYW1zLlxuICpcbiAqIE5vdGU6IFVzZXMgTm9kZS5qcyBCdWZmZXIgZm9yIGJhc2U2NCBlbmNvZGluZy9kZWNvZGluZy4gRm9yIGVudmlyb25tZW50c1xuICogd2l0aG91dCBCdWZmZXIgKGUuZy4gUXVpY2tKUyBWTSksIGEgcG9seWZpbGwgb3IgYWx0ZXJuYXRpdmUgYmFzZTY0XG4gKiBpbXBsZW1lbnRhdGlvbiB3aWxsIGJlIG5lZWRlZC5cbiAqL1xuXG5pbXBvcnQgeyB0eXBlcyB9IGZyb20gJ25vZGU6dXRpbCc7XG5pbXBvcnQgeyBGYXRhbEVycm9yLCBSZXRyeWFibGVFcnJvciB9IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHR5cGUgeyBSZWR1Y2VycywgUmV2aXZlcnMsIFNlcmlhbGl6YWJsZVNwZWNpYWwgfSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbi8vIC0tLS0gQmFzZTY0IGhlbHBlcnMgLS0tLVxuXG5mdW5jdGlvbiBhcnJheUJ1ZmZlclRvQmFzZTY0KFxuICB2YWx1ZTogQXJyYXlCdWZmZXJMaWtlLFxuICBvZmZzZXQ6IG51bWJlcixcbiAgbGVuZ3RoOiBudW1iZXJcbik6IHN0cmluZyB7XG4gIC8vIEF2b2lkIHJldHVybmluZyBmYWxzeSB2YWx1ZSBmb3IgemVyby1sZW5ndGggYnVmZmVyc1xuICBpZiAobGVuZ3RoID09PSAwKSByZXR1cm4gJy4nO1xuICAvLyBDcmVhdGUgYSBwcm9wZXIgY29weSB0byBhdm9pZCBBcnJheUJ1ZmZlciBkZXRhY2htZW50IGlzc3Vlc1xuICBjb25zdCB1aW50OCA9IG5ldyBVaW50OEFycmF5KHZhbHVlLCBvZmZzZXQsIGxlbmd0aCk7XG4gIHJldHVybiBCdWZmZXIuZnJvbSh1aW50OCkudG9TdHJpbmcoJ2Jhc2U2NCcpO1xufVxuXG5mdW5jdGlvbiB2aWV3VG9CYXNlNjQodmFsdWU6IEFycmF5QnVmZmVyVmlldyk6IHN0cmluZyB7XG4gIHJldHVybiBhcnJheUJ1ZmZlclRvQmFzZTY0KHZhbHVlLmJ1ZmZlciwgdmFsdWUuYnl0ZU9mZnNldCwgdmFsdWUuYnl0ZUxlbmd0aCk7XG59XG5cbmZ1bmN0aW9uIHJldml2ZUFycmF5QnVmZmVyKFxuICB2YWx1ZTogc3RyaW5nLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT5cbik6IEFycmF5QnVmZmVyIHtcbiAgY29uc3QgYmFzZTY0ID0gdmFsdWUgPT09ICcuJyA/ICcnIDogdmFsdWU7XG4gIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGJhc2U2NCwgJ2Jhc2U2NCcpO1xuICBjb25zdCBhcnJheUJ1ZmZlciA9IG5ldyBnbG9iYWwuQXJyYXlCdWZmZXIoYnVmZmVyLmxlbmd0aCk7XG4gIGNvbnN0IHVpbnQ4QXJyYXkgPSBuZXcgZ2xvYmFsLlVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpO1xuICB1aW50OEFycmF5LnNldChidWZmZXIpO1xuICByZXR1cm4gYXJyYXlCdWZmZXI7XG59XG5cbmZ1bmN0aW9uIHJldml2ZShzdHI6IHN0cmluZykge1xuICAvLyBkZXZhbHVlLnN0cmluZ2lmeSgpIGFsd2F5cyBwcm9kdWNlcyB2YWxpZCBKU09OOiBzcGVjaWFsIHZhbHVlc1xuICAvLyAodW5kZWZpbmVkLCBOYU4sIEluZmluaXR5LCAtMCkgYXJlIGVuY29kZWQgYXMgbmVnYXRpdmUgaW50ZWdlclxuICAvLyBzZW50aW5lbHMgYW5kIHRoZSByZW1haW5pbmcgc3RydWN0dXJlIGlzIG9yZGluYXJ5IEpTT04uIFBhcnNpbmdcbiAgLy8gd2l0aCBKU09OLnBhcnNlIHlpZWxkcyB0aGUgZmxhdHRlbmVkIGZvcm0gdGhhdCB1bmZsYXR0ZW4oKSBleHBlY3RzLlxuICByZXR1cm4gSlNPTi5wYXJzZShzdHIpO1xufVxuXG4vLyAtLS0tIEVycm9yIHN1YmNsYXNzIGhlbHBlcnMgLS0tLVxuXG4vKipcbiAqIFRoZSBzaGFyZWQgc2hhcGUgdGhhdCBldmVyeSBFcnJvci1zdWJjbGFzcyByZWR1Y2VyIGluIHRoaXMgbW9kdWxlXG4gKiBwcm9kdWNlcy4gU29tZSBzdWJjbGFzc2VzIChlLmcuIGBBZ2dyZWdhdGVFcnJvcmAsIGBSZXRyeWFibGVFcnJvcmApIGV4dGVuZFxuICogdGhpcyB3aXRoIGFkZGl0aW9uYWwgZmllbGRzIGJ5IHNwcmVhZGluZyB0aGUgYmFzZSBwYXlsb2FkLlxuICovXG50eXBlIEJhc2VFcnJvclBheWxvYWQgPSB7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgc3RhY2s/OiBzdHJpbmc7XG4gIGNhdXNlPzogdW5rbm93bjtcbn07XG5cbi8qKlxuICogU3Vic2V0IG9mIGBTZXJpYWxpemFibGVTcGVjaWFsYCBrZXlzIHdob3NlIHBheWxvYWQgc2hhcGUgaXMgZXhhY3RseSB0aGVcbiAqIGBCYXNlRXJyb3JQYXlsb2FkYC4gYG1ha2VFcnJvclN1YmNsYXNzUmVkdWNlcmAgaXMgY29uc3RyYWluZWQgdG8gb25seVxuICogdGhlc2Uga2V5cyBzbyBpdHMgcmV0dXJuIHR5cGUgaXMgc291bmQg4oCUIHN1YmNsYXNzZXMgdGhhdCBuZWVkIGV4dHJhXG4gKiBmaWVsZHMgKGxpa2UgYEFnZ3JlZ2F0ZUVycm9yLmVycm9yc2Agb3IgYFJldHJ5YWJsZUVycm9yLnJldHJ5QWZ0ZXJgKSB1c2VcbiAqIGByZWR1Y2VFcnJvckJhc2VgIGRpcmVjdGx5IGFuZCBleHRlbmQgdGhlIHJlc3VsdC5cbiAqL1xudHlwZSBTaW1wbGVFcnJvclN1YmNsYXNzS2V5ID0ge1xuICBbSyBpbiBrZXlvZiBTZXJpYWxpemFibGVTcGVjaWFsXTogU2VyaWFsaXphYmxlU3BlY2lhbFtLXSBleHRlbmRzIEJhc2VFcnJvclBheWxvYWRcbiAgICA/IEJhc2VFcnJvclBheWxvYWQgZXh0ZW5kcyBTZXJpYWxpemFibGVTcGVjaWFsW0tdXG4gICAgICA/IEtcbiAgICAgIDogbmV2ZXJcbiAgICA6IG5ldmVyO1xufVtrZXlvZiBTZXJpYWxpemFibGVTcGVjaWFsXTtcblxuLyoqXG4gKiBSZWR1Y2VzIGFueSBuYXRpdmUgRXJyb3IgaW5zdGFuY2UgdG8gdGhlIHNoYXJlZCBgQmFzZUVycm9yUGF5bG9hZGAgc2hhcGUsXG4gKiBwcmVzZXJ2aW5nIGBjYXVzZWAgb25seSB3aGVuIHByZXNlbnQgKHRvIGRpc3Rpbmd1aXNoIFwibm8gY2F1c2VcIiBmcm9tXG4gKiBcImNhdXNlIGlzIHVuZGVmaW5lZFwiKS4gVXNlZCBkaXJlY3RseSBieSByZWR1Y2VycyBmb3Igc3ViY2xhc3NlcyB0aGF0IG5lZWRcbiAqIHRvIGV4dGVuZCB0aGUgc2hhcGUgd2l0aCBhZGRpdGlvbmFsIGZpZWxkcy5cbiAqXG4gKiBgdHlwZXMuaXNOYXRpdmVFcnJvcigpYCBpcyB1c2VkIGluc3RlYWQgb2YgYGluc3RhbmNlb2ZgIGZvciBjcm9zcy1WTSBzYWZldHk6XG4gKiBlcnJvcnMgbWF5IG9yaWdpbmF0ZSBmcm9tIGEgZGlmZmVyZW50IFZNIGNvbnRleHQsIGFuZCBgaW5zdGFuY2VvZmAgZmFpbHNcbiAqIGFjcm9zcyBWTSBib3VuZGFyaWVzIHNpbmNlIGVhY2ggY29udGV4dCBoYXMgaXRzIG93biBFcnJvciBjb25zdHJ1Y3Rvci5cbiAqL1xuZnVuY3Rpb24gcmVkdWNlRXJyb3JCYXNlKHZhbHVlOiB1bmtub3duKTogQmFzZUVycm9yUGF5bG9hZCB8IGZhbHNlIHtcbiAgaWYgKCF0eXBlcy5pc05hdGl2ZUVycm9yKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCByZWR1Y2VkOiBCYXNlRXJyb3JQYXlsb2FkID0ge1xuICAgIG1lc3NhZ2U6IHZhbHVlLm1lc3NhZ2UsXG4gICAgc3RhY2s6IHZhbHVlLnN0YWNrLFxuICB9O1xuICBpZiAoJ2NhdXNlJyBpbiB2YWx1ZSkgcmVkdWNlZC5jYXVzZSA9ICh2YWx1ZSBhcyB7IGNhdXNlOiB1bmtub3duIH0pLmNhdXNlO1xuICByZXR1cm4gcmVkdWNlZDtcbn1cblxuLyoqXG4gKiBSZWR1Y2VzIGEgbmF0aXZlIGVycm9yIHRvIHRoZSBzaGFyZWQgYEJhc2VFcnJvclBheWxvYWRgLCBidXQgb25seSB3aGVuIGl0c1xuICogYG5hbWVgIGluc3RhbmNlIHByb3BlcnR5IG1hdGNoZXMgYHN1YmNsYXNzTmFtZWAuIFVzZWQgYnk6XG4gKiAgIC0gYG1ha2VFcnJvclN1YmNsYXNzUmVkdWNlcmAsIGZvciBzdWJjbGFzc2VzIHdob3NlIHNlcmlhbGl6ZWQgc2hhcGUgaXNcbiAqICAgICBleGFjdGx5IGBCYXNlRXJyb3JQYXlsb2FkYC5cbiAqICAgLSBJbmxpbmUgcmVkdWNlcnMgZm9yIHN1YmNsYXNzZXMgdGhhdCBleHRlbmQgdGhlIHNoYXBlIHdpdGggYWRkaXRpb25hbFxuICogICAgIGZpZWxkcyAoZS5nLiBgQWdncmVnYXRlRXJyb3IuZXJyb3JzYCwgYFJldHJ5YWJsZUVycm9yLnJldHJ5QWZ0ZXJgKS5cbiAqXG4gKiBNYXRjaGluZyBieSBgdmFsdWUubmFtZWAgKGluc3RlYWQgb2YgYHZhbHVlLmNvbnN0cnVjdG9yPy5uYW1lYCkgaXMgcm9idXN0XG4gKiB0byBidW5kbGVycyB0aGF0IGVtaXQgdGhlIGNsYXNzIGFzIGFuIGFub255bW91cyBleHByZXNzaW9uIOKAlCBlLmcuIFR1cmJvcGFja1xuICogY29tcGlsZXMgYGV4cG9ydCBjbGFzcyBGYXRhbEVycm9yIGV4dGVuZHMgRXJyb3Ige+KApn1gIHRvIGEgcmVnaXN0cmF0aW9uIGNhbGxcbiAqIGxpa2UgYGUucyhbXCJGYXRhbEVycm9yXCIsIDAsIGNsYXNzIGV4dGVuZHMgRXJyb3Ige+KApn1dKWAsIGFuZCB0aGUgcmVzdWx0aW5nXG4gKiBjb25zdHJ1Y3RvciBoYXMgYG5hbWUgPT09ICcnYC4gU2luY2UgZXZlcnkgRXJyb3Igc3ViY2xhc3Mgd2UgY2FyZSBhYm91dFxuICogc2V0cyBgdGhpcy5uYW1lYCBleHBsaWNpdGx5IGluIGl0cyBjb25zdHJ1Y3RvciAoYnVpbHQtaW4gc3ViY2xhc3NlcyBkbyB0aGlzXG4gKiBhdXRvbWF0aWNhbGx5OyBgRmF0YWxFcnJvcmAvYFJldHJ5YWJsZUVycm9yYCBkbyBpdCBpbiB1c2VyIGNvZGUpLCB0aGVcbiAqIGluc3RhbmNlIHByb3BlcnR5IGlzIHRoZSByZWxpYWJsZSBpZGVudGl0eSBtYXJrZXIgYWNyb3NzIHJlYWxtcyBhbmRcbiAqIGJ1bmRsZXJzLlxuICovXG5mdW5jdGlvbiByZWR1Y2VOYW1lZEVycm9yU3ViY2xhc3NCYXNlKFxuICBzdWJjbGFzc05hbWU6IHN0cmluZyxcbiAgdmFsdWU6IHVua25vd25cbik6IEJhc2VFcnJvclBheWxvYWQgfCBmYWxzZSB7XG4gIGlmICghdHlwZXMuaXNOYXRpdmVFcnJvcih2YWx1ZSkpIHJldHVybiBmYWxzZTtcbiAgaWYgKHZhbHVlLm5hbWUgIT09IHN1YmNsYXNzTmFtZSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gcmVkdWNlRXJyb3JCYXNlKHZhbHVlKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgcmVkdWNlciBmb3IgYSBidWlsdC1pbiBFcnJvciBzdWJjbGFzcyB3aG9zZSBzZXJpYWxpemVkIHNoYXBlIGlzXG4gKiBleGFjdGx5IGBCYXNlRXJyb3JQYXlsb2FkYCAobm8gZXh0cmEgZmllbGRzKS4gVGhlIHJlZHVjZXIgbWF0Y2hlcyBieVxuICogY29uc3RydWN0b3IgbmFtZSAoYWZ0ZXIgdGhlIGlzTmF0aXZlRXJyb3IgZ2F0ZSksIHNpbmNlIGBpbnN0YW5jZW9mYCBtYXlcbiAqIGZhaWwgYWNyb3NzIFZNIGJvdW5kYXJpZXMuXG4gKi9cbmZ1bmN0aW9uIG1ha2VFcnJvclN1YmNsYXNzUmVkdWNlcjxLIGV4dGVuZHMgU2ltcGxlRXJyb3JTdWJjbGFzc0tleT4oXG4gIHN1YmNsYXNzTmFtZTogS1xuKSB7XG4gIHJldHVybiAodmFsdWU6IHVua25vd24pOiBTZXJpYWxpemFibGVTcGVjaWFsW0tdIHwgZmFsc2UgPT4ge1xuICAgIGNvbnN0IGJhc2UgPSByZWR1Y2VOYW1lZEVycm9yU3ViY2xhc3NCYXNlKHN1YmNsYXNzTmFtZSwgdmFsdWUpO1xuICAgIGlmICghYmFzZSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBiYXNlIGFzIFNlcmlhbGl6YWJsZVNwZWNpYWxbS107XG4gIH07XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHJldml2ZXIgZm9yIGEgYnVpbHQtaW4gRXJyb3Igc3ViY2xhc3MuIFJlY29uc3RydWN0cyB0aGUgY29ycmVjdFxuICogYnVpbHQtaW4gRXJyb3IgdHlwZSB1c2luZyB0aGUgY29udGV4dCdzIGNvbnN0cnVjdG9yLiBUaGUgYGNhdXNlYCBvcHRpb24gaXNcbiAqIG9ubHkgcGFzc2VkIHdoZW4gdGhlIHNlcmlhbGl6ZWQgZGF0YSBpbmNsdWRlcyBpdCwgcHJlc2VydmluZyB0aGUgZGlzdGluY3Rpb25cbiAqIGJldHdlZW4gXCJubyBjYXVzZVwiIGFuZCBcImNhdXNlIGlzIHVuZGVmaW5lZFwiLlxuICovXG5mdW5jdGlvbiBtYWtlRXJyb3JTdWJjbGFzc1Jldml2ZXI8SyBleHRlbmRzIGtleW9mIFNlcmlhbGl6YWJsZVNwZWNpYWw+KFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIGN0b3JOYW1lOiBzdHJpbmdcbikge1xuICByZXR1cm4gKHZhbHVlOiBTZXJpYWxpemFibGVTcGVjaWFsW0tdKSA9PiB7XG4gICAgY29uc3QgdiA9IHZhbHVlIGFzIEJhc2VFcnJvclBheWxvYWQ7XG4gICAgY29uc3Qgb3B0cyA9ICdjYXVzZScgaW4gdiA/IHsgY2F1c2U6IHYuY2F1c2UgfSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBDdG9yID0gZ2xvYmFsW2N0b3JOYW1lXTtcbiAgICBjb25zdCBlcnJvcjogRXJyb3IgPSBuZXcgQ3Rvcih2Lm1lc3NhZ2UsIG9wdHMpO1xuICAgIGlmICh2LnN0YWNrICE9PSB1bmRlZmluZWQpIGVycm9yLnN0YWNrID0gdi5zdGFjaztcbiAgICByZXR1cm4gZXJyb3I7XG4gIH07XG59XG5cbi8vIC0tLS0gUmVkdWNlcnMgLS0tLVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29tbW9uUmVkdWNlcnMoXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXNcbik6IFBhcnRpYWw8UmVkdWNlcnM+IHtcbiAgcmV0dXJuIHtcbiAgICBBcnJheUJ1ZmZlcjogKHZhbHVlKSA9PlxuICAgICAgdmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuQXJyYXlCdWZmZXIgJiZcbiAgICAgIGFycmF5QnVmZmVyVG9CYXNlNjQodmFsdWUsIDAsIHZhbHVlLmJ5dGVMZW5ndGgpLFxuICAgIEJpZ0ludDogKHZhbHVlKSA9PiB0eXBlb2YgdmFsdWUgPT09ICdiaWdpbnQnICYmIHZhbHVlLnRvU3RyaW5nKCksXG4gICAgQmlnSW50NjRBcnJheTogKHZhbHVlKSA9PlxuICAgICAgdmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuQmlnSW50NjRBcnJheSAmJiB2aWV3VG9CYXNlNjQodmFsdWUpLFxuICAgIEJpZ1VpbnQ2NEFycmF5OiAodmFsdWUpID0+XG4gICAgICB2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5CaWdVaW50NjRBcnJheSAmJiB2aWV3VG9CYXNlNjQodmFsdWUpLFxuICAgIERhdGU6ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuRGF0ZSkpIHJldHVybiBmYWxzZTtcbiAgICAgIGNvbnN0IHZhbGlkID0gIU51bWJlci5pc05hTih2YWx1ZS5nZXREYXRlKCkpO1xuICAgICAgcmV0dXJuIHZhbGlkID8gdmFsdWUudG9JU09TdHJpbmcoKSA6ICcuJztcbiAgICB9LFxuICAgIC8vIERPTUV4Y2VwdGlvbiBpcyBhIHNwZWNpYWwgY2FzZTogaXQgYGluc3RhbmNlb2YgRXJyb3JgIGlzIHRydWUgaW4gTm9kZSxcbiAgICAvLyBidXQgYHR5cGVzLmlzTmF0aXZlRXJyb3IoKWAgcmV0dXJucyBGQUxTRSBmb3IgaXQsIHNvIHRoZSBnZW5lcmljIEVycm9yXG4gICAgLy8gcmVkdWNlciAod2hpY2ggZ2F0ZXMgb24gaXNOYXRpdmVFcnJvcikgd29uJ3QgbWF0Y2guIENoZWNrIGl0IGV4cGxpY2l0bHlcbiAgICAvLyBieSBjb25zdHJ1Y3RvciBuYW1lICsgRXJyb3IgaW5oZXJpdGFuY2Ugc28gd2UgY2F0Y2ggRE9NRXhjZXB0aW9ucyBmcm9tXG4gICAgLy8gYW55IHJlYWxtIChjcm9zcy1WTSBzYWZldHk6IGluc3RhbmNlb2YgZ2xvYmFsLkRPTUV4Y2VwdGlvbiB3b3VsZCBmYWlsXG4gICAgLy8gZm9yIGluc3RhbmNlcyBtaW50ZWQgaW4gYW5vdGhlciBjb250ZXh0KS5cbiAgICBET01FeGNlcHRpb246ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmIChcbiAgICAgICAgKHZhbHVlIGFzIHsgY29uc3RydWN0b3I/OiB7IG5hbWU/OiBzdHJpbmcgfSB9KS5jb25zdHJ1Y3Rvcj8ubmFtZSAhPT1cbiAgICAgICAgJ0RPTUV4Y2VwdGlvbidcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgZSA9IHZhbHVlIGFzIEVycm9yICYgeyBjYXVzZT86IHVua25vd24gfTtcbiAgICAgIGNvbnN0IHJlZHVjZWQ6IFNlcmlhbGl6YWJsZVNwZWNpYWxbJ0RPTUV4Y2VwdGlvbiddID0ge1xuICAgICAgICBtZXNzYWdlOiBlLm1lc3NhZ2UsXG4gICAgICAgIG5hbWU6IGUubmFtZSxcbiAgICAgICAgc3RhY2s6IGUuc3RhY2ssXG4gICAgICB9O1xuICAgICAgaWYgKCdjYXVzZScgaW4gZSkgcmVkdWNlZC5jYXVzZSA9IGUuY2F1c2U7XG4gICAgICByZXR1cm4gcmVkdWNlZDtcbiAgICB9LFxuICAgIC8vIEVycm9yIHN1YmNsYXNzIHJlZHVjZXJzIGFyZSBpbnRlbnRpb25hbGx5IHBsYWNlZCBiZWZvcmUgdGhlIGJhc2UgRXJyb3JcbiAgICAvLyByZWR1Y2VyIGJlY2F1c2UgZGV2YWx1ZSB1c2VzIGZpcnN0LW1hdGNoLXdpbnMuIFN1YmNsYXNzLXNwZWNpZmljIHJlZHVjZXJzXG4gICAgLy8gbXVzdCBiZSBjaGVja2VkIGZpcnN0IHNvIHRoYXQgZS5nLiBhIFR5cGVFcnJvciBpcyBzZXJpYWxpemVkIGFzIFwiVHlwZUVycm9yXCJcbiAgICAvLyByYXRoZXIgdGhhbiBmYWxsaW5nIHRocm91Z2ggdG8gdGhlIGdlbmVyaWMgXCJFcnJvclwiIHJlZHVjZXIuXG4gICAgLy8gU2VlIGBtYWtlRXJyb3JTdWJjbGFzc1JlZHVjZXJgIGZvciBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLlxuICAgIEV2YWxFcnJvcjogbWFrZUVycm9yU3ViY2xhc3NSZWR1Y2VyKCdFdmFsRXJyb3InKSxcbiAgICBGYXRhbEVycm9yOiBtYWtlRXJyb3JTdWJjbGFzc1JlZHVjZXIoJ0ZhdGFsRXJyb3InKSxcbiAgICBSYW5nZUVycm9yOiBtYWtlRXJyb3JTdWJjbGFzc1JlZHVjZXIoJ1JhbmdlRXJyb3InKSxcbiAgICBSZWZlcmVuY2VFcnJvcjogbWFrZUVycm9yU3ViY2xhc3NSZWR1Y2VyKCdSZWZlcmVuY2VFcnJvcicpLFxuICAgIC8vIFJldHJ5YWJsZUVycm9yIGNhcnJpZXMgYW4gZXh0cmEgYHJldHJ5QWZ0ZXJgIERhdGUgdGhhdCB3ZSBzZXJpYWxpemUgYXNcbiAgICAvLyBhIG51bWVyaWMgZXBvY2ggdGltZXN0YW1wLiBUaGUgRGF0ZSByZWR1Y2VyIHVzZXMgYGluc3RhbmNlb2YgZ2xvYmFsLkRhdGVgLFxuICAgIC8vIHdoaWNoIGZhaWxzIGZvciBEYXRlcyBmcm9tIGEgZGlmZmVyZW50IFZNIHJlYWxtOyBzZXJpYWxpemluZyBhcyBhXG4gICAgLy8gbnVtYmVyIHNpZGVzdGVwcyB0aGF0IGlzc3VlLlxuICAgIFJldHJ5YWJsZUVycm9yOiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IGJhc2UgPSByZWR1Y2VOYW1lZEVycm9yU3ViY2xhc3NCYXNlKCdSZXRyeWFibGVFcnJvcicsIHZhbHVlKTtcbiAgICAgIGlmICghYmFzZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgcmV0cnlBZnRlclJhdyA9ICh2YWx1ZSBhcyBSZXRyeWFibGVFcnJvcikucmV0cnlBZnRlciBhcyB1bmtub3duO1xuICAgICAgbGV0IHJldHJ5QWZ0ZXI6IG51bWJlcjtcbiAgICAgIGlmIChcbiAgICAgICAgcmV0cnlBZnRlclJhdyAmJlxuICAgICAgICB0eXBlb2YgcmV0cnlBZnRlclJhdyA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgdHlwZW9mIChyZXRyeUFmdGVyUmF3IGFzIHsgZ2V0VGltZT86IHVua25vd24gfSkuZ2V0VGltZSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHQgPSAocmV0cnlBZnRlclJhdyBhcyBEYXRlKS5nZXRUaW1lKCk7XG4gICAgICAgIHJldHJ5QWZ0ZXIgPSBOdW1iZXIuaXNOYU4odCkgPyBEYXRlLm5vdygpICsgMTAwMCA6IHQ7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICB0eXBlb2YgcmV0cnlBZnRlclJhdyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgdHlwZW9mIHJldHJ5QWZ0ZXJSYXcgPT09ICdudW1iZXInXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgdCA9IG5ldyBEYXRlKHJldHJ5QWZ0ZXJSYXcpLmdldFRpbWUoKTtcbiAgICAgICAgcmV0cnlBZnRlciA9IE51bWJlci5pc05hTih0KSA/IERhdGUubm93KCkgKyAxMDAwIDogdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHJ5QWZ0ZXIgPSBEYXRlLm5vdygpICsgMTAwMDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmJhc2UsXG4gICAgICAgIHJldHJ5QWZ0ZXIsXG4gICAgICB9IHNhdGlzZmllcyBTZXJpYWxpemFibGVTcGVjaWFsWydSZXRyeWFibGVFcnJvciddO1xuICAgIH0sXG4gICAgU3ludGF4RXJyb3I6IG1ha2VFcnJvclN1YmNsYXNzUmVkdWNlcignU3ludGF4RXJyb3InKSxcbiAgICBUeXBlRXJyb3I6IG1ha2VFcnJvclN1YmNsYXNzUmVkdWNlcignVHlwZUVycm9yJyksXG4gICAgVVJJRXJyb3I6IG1ha2VFcnJvclN1YmNsYXNzUmVkdWNlcignVVJJRXJyb3InKSxcbiAgICAvLyBBZ2dyZWdhdGVFcnJvciBpcyBzaW1pbGFyIHRvIG90aGVyIHN1YmNsYXNzZXMgYnV0IGFsc28gcHJlc2VydmVzIHRoZVxuICAgIC8vIGBlcnJvcnNgIGFycmF5LiBXZSBleHRlbmQgdGhlIGJhc2UgaGVscGVyJ3Mgb3V0cHV0IGhlcmUuXG4gICAgQWdncmVnYXRlRXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgYmFzZSA9IHJlZHVjZU5hbWVkRXJyb3JTdWJjbGFzc0Jhc2UoJ0FnZ3JlZ2F0ZUVycm9yJywgdmFsdWUpO1xuICAgICAgaWYgKCFiYXNlKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5iYXNlLFxuICAgICAgICBlcnJvcnM6ICh2YWx1ZSBhcyBBZ2dyZWdhdGVFcnJvcikuZXJyb3JzLFxuICAgICAgfSBzYXRpc2ZpZXMgU2VyaWFsaXphYmxlU3BlY2lhbFsnQWdncmVnYXRlRXJyb3InXTtcbiAgICB9LFxuICAgIC8vIEJhc2UgRXJyb3IgcmVkdWNlciDigJQgY2F0Y2gtYWxsIGZvciBhbnkgRXJyb3IgaW5zdGFuY2Ugbm90IG1hdGNoZWQgYnkgYVxuICAgIC8vIHNwZWNpZmljIHN1YmNsYXNzIHJlZHVjZXIgYWJvdmUgKGluY2x1ZGluZyB1c2VyIEVycm9yIHN1YmNsYXNzZXMgd2l0aG91dFxuICAgIC8vIFdPUktGTE9XX1NFUklBTElaRSkuIFByZXNlcnZlcyBgbmFtZWAgc28gdGhlIGVycm9yJ3MgaWRlbnRpdHkgaXMgcmV0YWluZWRcbiAgICAvLyBldmVuIHRob3VnaCB0aGUgZXhhY3QgY2xhc3MgY2Fubm90IGJlIHJlY29uc3RydWN0ZWQuXG4gICAgRXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCF0eXBlcy5pc05hdGl2ZUVycm9yKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgcmVkdWNlZDogU2VyaWFsaXphYmxlU3BlY2lhbFsnRXJyb3InXSA9IHtcbiAgICAgICAgbmFtZTogdmFsdWUubmFtZSxcbiAgICAgICAgbWVzc2FnZTogdmFsdWUubWVzc2FnZSxcbiAgICAgICAgc3RhY2s6IHZhbHVlLnN0YWNrLFxuICAgICAgfTtcbiAgICAgIGlmICgnY2F1c2UnIGluIHZhbHVlKSByZWR1Y2VkLmNhdXNlID0gdmFsdWUuY2F1c2U7XG4gICAgICByZXR1cm4gcmVkdWNlZDtcbiAgICB9LFxuICAgIEZsb2F0MzJBcnJheTogKHZhbHVlKSA9PlxuICAgICAgdmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuRmxvYXQzMkFycmF5ICYmIHZpZXdUb0Jhc2U2NCh2YWx1ZSksXG4gICAgRmxvYXQ2NEFycmF5OiAodmFsdWUpID0+XG4gICAgICB2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5GbG9hdDY0QXJyYXkgJiYgdmlld1RvQmFzZTY0KHZhbHVlKSxcbiAgICBIZWFkZXJzOiAodmFsdWUpID0+IHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLkhlYWRlcnMgJiYgQXJyYXkuZnJvbSh2YWx1ZSksXG4gICAgSW50OEFycmF5OiAodmFsdWUpID0+XG4gICAgICB2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5JbnQ4QXJyYXkgJiYgdmlld1RvQmFzZTY0KHZhbHVlKSxcbiAgICBJbnQxNkFycmF5OiAodmFsdWUpID0+XG4gICAgICB2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5JbnQxNkFycmF5ICYmIHZpZXdUb0Jhc2U2NCh2YWx1ZSksXG4gICAgSW50MzJBcnJheTogKHZhbHVlKSA9PlxuICAgICAgdmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuSW50MzJBcnJheSAmJiB2aWV3VG9CYXNlNjQodmFsdWUpLFxuICAgIE1hcDogKHZhbHVlKSA9PiB2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5NYXAgJiYgQXJyYXkuZnJvbSh2YWx1ZSksXG4gICAgUmVnRXhwOiAodmFsdWUpID0+XG4gICAgICB2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5SZWdFeHAgJiYge1xuICAgICAgICBzb3VyY2U6IHZhbHVlLnNvdXJjZSxcbiAgICAgICAgZmxhZ3M6IHZhbHVlLmZsYWdzLFxuICAgICAgfSxcbiAgICAvLyBSZXF1ZXN0IGFuZCBSZXNwb25zZSBhcmUgaW50ZW50aW9uYWxseSBOT1QgaW4gY29tbW9uIHJlZHVjZXJzLlxuICAgIC8vIFRoZXkgcmVxdWlyZSBtb2RlLXNwZWNpZmljIHJldml2ZXJzIChzdHJlYW0gaGFuZGxpbmcsIGV0Yy4pIGFuZFxuICAgIC8vIGluY2x1ZGluZyB0aGVtIGhlcmUgd2l0aG91dCBtYXRjaGluZyByZXZpdmVycyB3b3VsZCBjYXVzZSB0aGVtXG4gICAgLy8gdG8gZGVzZXJpYWxpemUgYXMgcGxhaW4gb2JqZWN0cy5cbiAgICBTZXQ6ICh2YWx1ZSkgPT4gdmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuU2V0ICYmIEFycmF5LmZyb20odmFsdWUpLFxuICAgIFVSTDogKHZhbHVlKSA9PiB2YWx1ZSBpbnN0YW5jZW9mIGdsb2JhbC5VUkwgJiYgdmFsdWUuaHJlZixcbiAgICBXb3JrZmxvd0Z1bmN0aW9uOiAodmFsdWUpID0+IHtcbiAgICAgIC8vIE9ubHkgbWF0Y2ggZnVuY3Rpb24gcmVmZXJlbmNlcyB3aXRoIGEgd29ya2Zsb3dJZCBwcm9wZXJ0eSAoc2V0IGJ5XG4gICAgICAvLyB0aGUgU1dDIGNvbXBpbGVyIG9uIHdvcmtmbG93IGZ1bmN0aW9ucykuIFBsYWluIHsgd29ya2Zsb3dJZCB9IG9iamVjdHNcbiAgICAgIC8vIGFyZSBOT1QgbWF0Y2hlZCDigJQgdGhpcyBwcmV2ZW50cyBpbmZpbml0ZSByZWN1cnNpb24gc2luY2UgdGhlIHJlZHVjZWRcbiAgICAgIC8vIGZvcm0geyB3b3JrZmxvd0lkIH0gaXMgYSBwbGFpbiBvYmplY3QsIG5vdCBhIGZ1bmN0aW9uLlxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3Qgd29ya2Zsb3dJZCA9ICh2YWx1ZSBhcyBhbnkpLndvcmtmbG93SWQ7XG4gICAgICBpZiAodHlwZW9mIHdvcmtmbG93SWQgIT09ICdzdHJpbmcnKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4geyB3b3JrZmxvd0lkIH07XG4gICAgfSxcbiAgICBVUkxTZWFyY2hQYXJhbXM6ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuVVJMU2VhcmNoUGFyYW1zKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKHZhbHVlLnNpemUgPT09IDApIHJldHVybiAnLic7XG4gICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgICB9LFxuICAgIFVpbnQ4QXJyYXk6ICh2YWx1ZSkgPT5cbiAgICAgIHZhbHVlIGluc3RhbmNlb2YgZ2xvYmFsLlVpbnQ4QXJyYXkgJiYgdmlld1RvQmFzZTY0KHZhbHVlKSxcbiAgICBVaW50OENsYW1wZWRBcnJheTogKHZhbHVlKSA9PlxuICAgICAgdmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuVWludDhDbGFtcGVkQXJyYXkgJiYgdmlld1RvQmFzZTY0KHZhbHVlKSxcbiAgICBVaW50MTZBcnJheTogKHZhbHVlKSA9PlxuICAgICAgdmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuVWludDE2QXJyYXkgJiYgdmlld1RvQmFzZTY0KHZhbHVlKSxcbiAgICBVaW50MzJBcnJheTogKHZhbHVlKSA9PlxuICAgICAgdmFsdWUgaW5zdGFuY2VvZiBnbG9iYWwuVWludDMyQXJyYXkgJiYgdmlld1RvQmFzZTY0KHZhbHVlKSxcbiAgfTtcbn1cblxuLy8gLS0tLSBSZXZpdmVycyAtLS0tXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb21tb25SZXZpdmVycyhcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpc1xuKTogUGFydGlhbDxSZXZpdmVycz4ge1xuICByZXR1cm4ge1xuICAgIEFycmF5QnVmZmVyOiAodmFsdWU6IHN0cmluZykgPT4gcmV2aXZlQXJyYXlCdWZmZXIodmFsdWUsIGdsb2JhbCksXG4gICAgQmlnSW50OiAodmFsdWU6IHN0cmluZykgPT4gZ2xvYmFsLkJpZ0ludCh2YWx1ZSksXG4gICAgQmlnSW50NjRBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+XG4gICAgICBuZXcgZ2xvYmFsLkJpZ0ludDY0QXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUsIGdsb2JhbCkpLFxuICAgIEJpZ1VpbnQ2NEFycmF5OiAodmFsdWU6IHN0cmluZykgPT5cbiAgICAgIG5ldyBnbG9iYWwuQmlnVWludDY0QXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUsIGdsb2JhbCkpLFxuICAgIERhdGU6ICh2YWx1ZSkgPT4gbmV3IGdsb2JhbC5EYXRlKHZhbHVlKSxcbiAgICBET01FeGNlcHRpb246ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgZ2xvYmFsLkRPTUV4Y2VwdGlvbih2YWx1ZS5tZXNzYWdlLCB2YWx1ZS5uYW1lKTtcbiAgICAgIGlmICh2YWx1ZS5zdGFjayAhPT0gdW5kZWZpbmVkKSBlcnJvci5zdGFjayA9IHZhbHVlLnN0YWNrO1xuICAgICAgLy8gRE9NRXhjZXB0aW9uJ3MgY29uc3RydWN0b3IgZG9lc24ndCBhY2NlcHQgYSBjYXVzZSBvcHRpb24sIHNvXG4gICAgICAvLyB3ZSBzZXQgaXQgbWFudWFsbHkgd2hlbiBwcmVzZW50IGluIHRoZSBzZXJpYWxpemVkIGRhdGEuXG4gICAgICBpZiAoJ2NhdXNlJyBpbiB2YWx1ZSkgZXJyb3IuY2F1c2UgPSB2YWx1ZS5jYXVzZTtcbiAgICAgIHJldHVybiBlcnJvcjtcbiAgICB9LFxuICAgIC8vIEVycm9yIHN1YmNsYXNzIHJldml2ZXJzIHJlY29uc3RydWN0IHRoZSBjb3JyZWN0IGJ1aWx0LWluIEVycm9yIHR5cGUuXG4gICAgLy8gU2VlIGBtYWtlRXJyb3JTdWJjbGFzc1Jldml2ZXJgIGZvciBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLlxuICAgIEV2YWxFcnJvcjogbWFrZUVycm9yU3ViY2xhc3NSZXZpdmVyKGdsb2JhbCwgJ0V2YWxFcnJvcicpLFxuICAgIC8vIGBGYXRhbEVycm9yYCBhbmQgYFJldHJ5YWJsZUVycm9yYCBhcmUgbm90IGJ1aWx0LWlucywgc28gd2UgcmVzb2x2ZSB0aGVtXG4gICAgLy8gZnJvbSB0aGUgY29uc3VtZXIncyBgZ2xvYmFsVGhpc2AgdmlhIGEgYFN5bWJvbC5mb3IoLi4uKWAga2V5IHJlZ2lzdGVyZWRcbiAgICAvLyBieSBgQHdvcmtmbG93L2Vycm9yc2Agb24gbG9hZC4gVGhpcyBtYWtlcyBgaW5zdGFuY2VvZiBGYXRhbEVycm9yYCB3b3JrXG4gICAgLy8gaW4gdXNlciBjb2RlIHRoYXQgbGl2ZXMgaW4gYSBkaWZmZXJlbnQgcmVhbG0gdGhhbiB0aGlzIHJlZHVjZXIgbW9kdWxlXG4gICAgLy8gKGUuZy4gd2hlbiB0aGUgaG9zdCBoeWRyYXRlcyBhIHZhbHVlIGRlc3RpbmVkIGZvciBhIHdvcmtmbG93IFZNXG4gICAgLy8gY29udGV4dCkuIFNlZSB0aGUgcmVnaXN0cmF0aW9uIGJsb2NrIGF0IHRoZSBib3R0b20gb2ZcbiAgICAvLyBgcGFja2FnZXMvZXJyb3JzL3NyYy9pbmRleC50c2AgZm9yIGRldGFpbHMuIEZhbGxzIGJhY2sgdG8gdGhlIGltcG9ydGVkXG4gICAgLy8gY2xhc3MgZm9yIGVudmlyb25tZW50cyB3aGVyZSBubyBidW5kbGVkIGBAd29ya2Zsb3cvZXJyb3JzYCBoYXMgbG9hZGVkXG4gICAgLy8gaW4gdGhlIGNvbnN1bWVyIHJlYWxtLlxuICAgIEZhdGFsRXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgQ3RvciA9XG4gICAgICAgICgoZ2xvYmFsIGFzIFJlY29yZDxzeW1ib2wsIHVua25vd24+KVtcbiAgICAgICAgICBTeW1ib2wuZm9yKCdAd29ya2Zsb3cvZXJyb3JzLy9GYXRhbEVycm9yJylcbiAgICAgICAgXSBhcyB0eXBlb2YgRmF0YWxFcnJvciB8IHVuZGVmaW5lZCkgPz8gRmF0YWxFcnJvcjtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEN0b3IodmFsdWUubWVzc2FnZSk7XG4gICAgICBpZiAodmFsdWUuc3RhY2sgIT09IHVuZGVmaW5lZCkgZXJyb3Iuc3RhY2sgPSB2YWx1ZS5zdGFjaztcbiAgICAgIGlmICgnY2F1c2UnIGluIHZhbHVlKSBlcnJvci5jYXVzZSA9IHZhbHVlLmNhdXNlO1xuICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH0sXG4gICAgUmFuZ2VFcnJvcjogbWFrZUVycm9yU3ViY2xhc3NSZXZpdmVyKGdsb2JhbCwgJ1JhbmdlRXJyb3InKSxcbiAgICBSZWZlcmVuY2VFcnJvcjogbWFrZUVycm9yU3ViY2xhc3NSZXZpdmVyKGdsb2JhbCwgJ1JlZmVyZW5jZUVycm9yJyksXG4gICAgUmV0cnlhYmxlRXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gVXNlIHRoZSBjb250ZXh0J3MgYERhdGVgIGNvbnN0cnVjdG9yIChtYXRjaGluZyB0aGUgcmVzdCBvZiB0aGlzXG4gICAgICAvLyBtb2R1bGUpIHNvIHRoZSByZXN1bHRpbmcgYHJldHJ5QWZ0ZXJgIERhdGUgcGFzc2VzIGBpbnN0YW5jZW9mXG4gICAgICAvLyBnbG9iYWwuRGF0ZWAgY2hlY2tzIGluIHRoZSB0YXJnZXQgcmVhbG0uIFNlZSB0aGUgRmF0YWxFcnJvciByZXZpdmVyXG4gICAgICAvLyBhYm92ZSBmb3Igd2h5IHdlIHJlc29sdmUgYFJldHJ5YWJsZUVycm9yYCBmcm9tIHRoZSBjb25zdW1lcidzXG4gICAgICAvLyBnbG9iYWxUaGlzIGluc3RlYWQgb2YgdGhlIGltcG9ydGVkIGNsYXNzLlxuICAgICAgY29uc3QgQ3RvciA9XG4gICAgICAgICgoZ2xvYmFsIGFzIFJlY29yZDxzeW1ib2wsIHVua25vd24+KVtcbiAgICAgICAgICBTeW1ib2wuZm9yKCdAd29ya2Zsb3cvZXJyb3JzLy9SZXRyeWFibGVFcnJvcicpXG4gICAgICAgIF0gYXMgdHlwZW9mIFJldHJ5YWJsZUVycm9yIHwgdW5kZWZpbmVkKSA/PyBSZXRyeWFibGVFcnJvcjtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEN0b3IodmFsdWUubWVzc2FnZSwge1xuICAgICAgICByZXRyeUFmdGVyOiBuZXcgZ2xvYmFsLkRhdGUodmFsdWUucmV0cnlBZnRlciksXG4gICAgICB9KTtcbiAgICAgIGlmICh2YWx1ZS5zdGFjayAhPT0gdW5kZWZpbmVkKSBlcnJvci5zdGFjayA9IHZhbHVlLnN0YWNrO1xuICAgICAgaWYgKCdjYXVzZScgaW4gdmFsdWUpIGVycm9yLmNhdXNlID0gdmFsdWUuY2F1c2U7XG4gICAgICByZXR1cm4gZXJyb3I7XG4gICAgfSxcbiAgICBTeW50YXhFcnJvcjogbWFrZUVycm9yU3ViY2xhc3NSZXZpdmVyKGdsb2JhbCwgJ1N5bnRheEVycm9yJyksXG4gICAgVHlwZUVycm9yOiBtYWtlRXJyb3JTdWJjbGFzc1Jldml2ZXIoZ2xvYmFsLCAnVHlwZUVycm9yJyksXG4gICAgVVJJRXJyb3I6IG1ha2VFcnJvclN1YmNsYXNzUmV2aXZlcihnbG9iYWwsICdVUklFcnJvcicpLFxuICAgIEFnZ3JlZ2F0ZUVycm9yOiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IG9wdHMgPSAnY2F1c2UnIGluIHZhbHVlID8geyBjYXVzZTogdmFsdWUuY2F1c2UgfSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IGdsb2JhbC5BZ2dyZWdhdGVFcnJvcihcbiAgICAgICAgdmFsdWUuZXJyb3JzLFxuICAgICAgICB2YWx1ZS5tZXNzYWdlLFxuICAgICAgICBvcHRzXG4gICAgICApO1xuICAgICAgaWYgKHZhbHVlLnN0YWNrICE9PSB1bmRlZmluZWQpIGVycm9yLnN0YWNrID0gdmFsdWUuc3RhY2s7XG4gICAgICByZXR1cm4gZXJyb3I7XG4gICAgfSxcbiAgICAvLyBCYXNlIEVycm9yIHJldml2ZXIg4oCUIHVzZWQgZm9yIHBsYWluIEVycm9yIGluc3RhbmNlcyBhbmQgdW5yZWNvZ25pemVkXG4gICAgLy8gRXJyb3Igc3ViY2xhc3Nlcy4gUHJlc2VydmVzIGBuYW1lYCBzbyB0aGUgZXJyb3IncyBpZGVudGl0eSBpcyByZXRhaW5lZC5cbiAgICBFcnJvcjogKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBvcHRzID0gJ2NhdXNlJyBpbiB2YWx1ZSA/IHsgY2F1c2U6IHZhbHVlLmNhdXNlIH0gOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBlcnJvciA9IG5ldyBnbG9iYWwuRXJyb3IodmFsdWUubWVzc2FnZSwgb3B0cyk7XG4gICAgICBlcnJvci5uYW1lID0gdmFsdWUubmFtZTtcbiAgICAgIGlmICh2YWx1ZS5zdGFjayAhPT0gdW5kZWZpbmVkKSBlcnJvci5zdGFjayA9IHZhbHVlLnN0YWNrO1xuICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH0sXG4gICAgRmxvYXQzMkFycmF5OiAodmFsdWU6IHN0cmluZykgPT5cbiAgICAgIG5ldyBnbG9iYWwuRmxvYXQzMkFycmF5KHJldml2ZUFycmF5QnVmZmVyKHZhbHVlLCBnbG9iYWwpKSxcbiAgICBGbG9hdDY0QXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PlxuICAgICAgbmV3IGdsb2JhbC5GbG9hdDY0QXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUsIGdsb2JhbCkpLFxuICAgIEhlYWRlcnM6ICh2YWx1ZSkgPT4gbmV3IGdsb2JhbC5IZWFkZXJzKHZhbHVlKSxcbiAgICBJbnQ4QXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PlxuICAgICAgbmV3IGdsb2JhbC5JbnQ4QXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUsIGdsb2JhbCkpLFxuICAgIEludDE2QXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PlxuICAgICAgbmV3IGdsb2JhbC5JbnQxNkFycmF5KHJldml2ZUFycmF5QnVmZmVyKHZhbHVlLCBnbG9iYWwpKSxcbiAgICBJbnQzMkFycmF5OiAodmFsdWU6IHN0cmluZykgPT5cbiAgICAgIG5ldyBnbG9iYWwuSW50MzJBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSwgZ2xvYmFsKSksXG4gICAgTWFwOiAodmFsdWUpID0+IG5ldyBnbG9iYWwuTWFwKHZhbHVlKSxcbiAgICBSZWdFeHA6ICh2YWx1ZSkgPT4gbmV3IGdsb2JhbC5SZWdFeHAodmFsdWUuc291cmNlLCB2YWx1ZS5mbGFncyksXG4gICAgU2V0OiAodmFsdWUpID0+IG5ldyBnbG9iYWwuU2V0KHZhbHVlKSxcbiAgICBVUkw6ICh2YWx1ZSkgPT4gbmV3IGdsb2JhbC5VUkwodmFsdWUpLFxuICAgIFdvcmtmbG93RnVuY3Rpb246ICh2YWx1ZSkgPT5cbiAgICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnV29ya2Zsb3cgZnVuY3Rpb25zIGNhbm5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuIFVzZSBzdGFydCgpIHRvIGludm9rZSB0aGVtLidcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICB7IHdvcmtmbG93SWQ6IHZhbHVlLndvcmtmbG93SWQgfVxuICAgICAgKSxcbiAgICBVUkxTZWFyY2hQYXJhbXM6ICh2YWx1ZSkgPT5cbiAgICAgIG5ldyBnbG9iYWwuVVJMU2VhcmNoUGFyYW1zKHZhbHVlID09PSAnLicgPyAnJyA6IHZhbHVlKSxcbiAgICBVaW50OEFycmF5OiAodmFsdWU6IHN0cmluZykgPT5cbiAgICAgIG5ldyBnbG9iYWwuVWludDhBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSwgZ2xvYmFsKSksXG4gICAgVWludDhDbGFtcGVkQXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PlxuICAgICAgbmV3IGdsb2JhbC5VaW50OENsYW1wZWRBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSwgZ2xvYmFsKSksXG4gICAgVWludDE2QXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PlxuICAgICAgbmV3IGdsb2JhbC5VaW50MTZBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSwgZ2xvYmFsKSksXG4gICAgVWludDMyQXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PlxuICAgICAgbmV3IGdsb2JhbC5VaW50MzJBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSwgZ2xvYmFsKSksXG4gIH07XG59XG5cbi8vIFJlLWV4cG9ydCBmb3IgdXNlIGluIGxlZ2FjeSBjb21wYXRcbmV4cG9ydCB7IHJldml2ZSB9O1xuIl19
@@ -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"}
@@ -0,0 +1,88 @@
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
+ // ---- Reducer ----
21
+ export function getStepFunctionReducer() {
22
+ return {
23
+ StepFunction: (value) => {
24
+ if (typeof value !== 'function')
25
+ return false;
26
+ const stepId = value.stepId;
27
+ if (typeof stepId !== 'string')
28
+ return false;
29
+ const closureVarsFn = value.__closureVarsFn;
30
+ const closureVars = closureVarsFn && typeof closureVarsFn === 'function'
31
+ ? closureVarsFn()
32
+ : undefined;
33
+ // `__boundThis` / `__boundArgs` are marker properties added by the
34
+ // step proxy's overridden `.bind` (see step.ts) to record the
35
+ // bound receiver and any prefilled arguments. Use `in` for
36
+ // `__boundThis` so we round-trip even when the bound `this` is
37
+ // `undefined`/`null`. `__boundArgs` is only set when the user
38
+ // actually supplied prefilled args, so a missing property means
39
+ // "no prefilled args".
40
+ const hasBoundThis = '__boundThis' in value;
41
+ const boundThis = hasBoundThis ? value.__boundThis : undefined;
42
+ const boundArgs = value.__boundArgs;
43
+ const payload = { stepId };
44
+ if (closureVars !== undefined)
45
+ payload.closureVars = closureVars;
46
+ if (hasBoundThis)
47
+ payload.boundThis = boundThis;
48
+ if (Array.isArray(boundArgs) && boundArgs.length > 0) {
49
+ payload.boundArgs = boundArgs;
50
+ }
51
+ return payload;
52
+ },
53
+ };
54
+ }
55
+ // ---- Reviver ----
56
+ /**
57
+ * Create the StepFunction reviver for workflow context.
58
+ *
59
+ * The reviver calls WORKFLOW_USE_STEP to create the step proxy,
60
+ * restoring the ability to call the step from workflow code. If the
61
+ * serialized payload includes `boundThis` (and optionally `boundArgs`),
62
+ * the reviver also re-binds the freshly-created proxy so a step proxy
63
+ * that was constructed with `.bind(this, …)` in the workflow bundle
64
+ * continues to carry that receiver and any prefilled arguments after
65
+ * being deserialized in another bundle (e.g. when passed as a step
66
+ * argument).
67
+ */
68
+ export function getStepFunctionReviver(global = globalThis) {
69
+ const useStep = global[Symbol.for('WORKFLOW_USE_STEP')];
70
+ return {
71
+ StepFunction: (value) => {
72
+ const stepId = value.stepId;
73
+ const closureVars = value.closureVars;
74
+ if (!useStep) {
75
+ throw new Error('WORKFLOW_USE_STEP not found on global object. Step functions cannot be deserialized outside workflow context.');
76
+ }
77
+ const proxy = closureVars
78
+ ? useStep(stepId, () => closureVars)
79
+ : useStep(stepId);
80
+ if ('boundThis' in value) {
81
+ const boundArgs = Array.isArray(value.boundArgs) ? value.boundArgs : [];
82
+ return proxy.bind(value.boundThis, ...boundArgs);
83
+ }
84
+ return proxy;
85
+ },
86
+ };
87
+ }
88
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1mdW5jdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJpYWxpemF0aW9uL3JlZHVjZXJzL3N0ZXAtZnVuY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUlILG9CQUFvQjtBQUVwQixNQUFNLFVBQVUsc0JBQXNCO0lBQ3BDLE9BQU87UUFDTCxZQUFZLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN0QixJQUFJLE9BQU8sS0FBSyxLQUFLLFVBQVU7Z0JBQUUsT0FBTyxLQUFLLENBQUM7WUFDOUMsTUFBTSxNQUFNLEdBQUksS0FBYSxDQUFDLE1BQU0sQ0FBQztZQUNyQyxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVE7Z0JBQUUsT0FBTyxLQUFLLENBQUM7WUFFN0MsTUFBTSxhQUFhLEdBQUksS0FBYSxDQUFDLGVBQWUsQ0FBQztZQUNyRCxNQUFNLFdBQVcsR0FDZixhQUFhLElBQUksT0FBTyxhQUFhLEtBQUssVUFBVTtnQkFDbEQsQ0FBQyxDQUFDLGFBQWEsRUFBRTtnQkFDakIsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUVoQixtRUFBbUU7WUFDbkUsOERBQThEO1lBQzlELDJEQUEyRDtZQUMzRCwrREFBK0Q7WUFDL0QsOERBQThEO1lBQzlELGdFQUFnRTtZQUNoRSx1QkFBdUI7WUFDdkIsTUFBTSxZQUFZLEdBQUcsYUFBYSxJQUFLLEtBQWEsQ0FBQztZQUNyRCxNQUFNLFNBQVMsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFFLEtBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUN4RSxNQUFNLFNBQVMsR0FBSSxLQUFhLENBQUMsV0FBb0MsQ0FBQztZQUV0RSxNQUFNLE9BQU8sR0FLVCxFQUFFLE1BQU0sRUFBRSxDQUFDO1lBQ2YsSUFBSSxXQUFXLEtBQUssU0FBUztnQkFBRSxPQUFPLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztZQUNqRSxJQUFJLFlBQVk7Z0JBQUUsT0FBTyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7WUFDaEQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3JELE9BQU8sQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1lBQ2hDLENBQUM7WUFFRCxPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUM7QUFFRCxvQkFBb0I7QUFFcEI7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLFVBQVUsc0JBQXNCLENBQ3BDLFNBQThCLFVBQVU7SUFFeEMsTUFBTSxPQUFPLEdBQUksTUFBYyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsQ0FLbEQsQ0FBQztJQUVkLE9BQU87UUFDTCxZQUFZLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN0QixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQzVCLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUM7WUFFdEMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNiLE1BQU0sSUFBSSxLQUFLLENBQ2IsK0dBQStHLENBQ2hILENBQUM7WUFDSixDQUFDO1lBRUQsTUFBTSxLQUFLLEdBQUcsV0FBVztnQkFDdkIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDO2dCQUNwQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRXBCLElBQUksV0FBVyxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUN6QixNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUN4RSxPQUFRLEtBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxHQUFHLFNBQVMsQ0FBQyxDQUFDO1lBQzVELENBQUM7WUFDRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUmVkdWNlciBhbmQgcmV2aXZlciBmb3Igc3RlcCBmdW5jdGlvbiByZWZlcmVuY2VzLlxuICpcbiAqIEluIHdvcmtmbG93IG1vZGUsIHN0ZXAgZnVuY3Rpb25zIGFyZSByZXBsYWNlZCBieSB0aGUgU1dDIHBsdWdpbiB3aXRoXG4gKiBwcm94aWVzIGNyZWF0ZWQgYnkgYGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXShcInN0ZXBJZFwiKWAuXG4gKiBUaGVzZSBwcm94aWVzIGhhdmUgYSBgLnN0ZXBJZGAgcHJvcGVydHkgYW5kIG9wdGlvbmFsbHkgYSBgLl9fY2xvc3VyZVZhcnNGbmBcbiAqIGZvciBjYXB0dXJlZCBjbG9zdXJlIHZhcmlhYmxlcy4gVGhleSBtYXkgYWRkaXRpb25hbGx5IGhhdmUgYC5fX2JvdW5kVGhpc2BcbiAqIChhbmQgcmFyZWx5IGAuX19ib3VuZEFyZ3NgKSB3aGVuIHRoZSBTV0MgcGx1Z2luIGVtaXR0ZWRcbiAqIGB1c2VTdGVwKC4uLikuYmluZCh0aGlzKWAgZm9yIGEgbmVzdGVkIGFycm93IHN0ZXAgdGhhdCBsZXhpY2FsbHlcbiAqIGNhcHR1cmVkIGB0aGlzYCAoc2VlIGBwYWNrYWdlcy9zd2MtcGx1Z2luLXdvcmtmbG93L3NwZWMubWRgIOKGkiBcIkxleGljYWxcbiAqIGB0aGlzYCBDYXB0dXJlIGluIE5lc3RlZCBBcnJvdyBTdGVwc1wiKS5cbiAqXG4gKiBUaGUgcmVkdWNlciBzZXJpYWxpemVzIHRoZW0gYXNcbiAqICAgYHsgc3RlcElkLCBjbG9zdXJlVmFycz8sIGJvdW5kVGhpcz8sIGJvdW5kQXJncz8gfWAuXG4gKiBUaGUgcmV2aXZlciByZWNvbnN0cnVjdHMgdGhlbSBieSBjYWxsaW5nIFdPUktGTE9XX1VTRV9TVEVQIGFuZCwgd2hlblxuICogYGJvdW5kVGhpc2AgKG9yIGBib3VuZEFyZ3NgKSBpcyBwcmVzZW50LCByZS1iaW5kaW5nIHRoZSByZXN1bHRpbmdcbiAqIHByb3h5IHNvIHRoZSBjYWxsZXIncyBjYXB0dXJlZCBgdGhpc2AgKGFuZCBwcmVmaWxsZWQgYXJncykgc3Vydml2ZSB0aGVcbiAqIHJvdW5kIHRyaXAuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBSZWR1Y2VycywgUmV2aXZlcnMgfSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbi8vIC0tLS0gUmVkdWNlciAtLS0tXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdGVwRnVuY3Rpb25SZWR1Y2VyKCk6IFBhcnRpYWw8UmVkdWNlcnM+IHtcbiAgcmV0dXJuIHtcbiAgICBTdGVwRnVuY3Rpb246ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3Qgc3RlcElkID0gKHZhbHVlIGFzIGFueSkuc3RlcElkO1xuICAgICAgaWYgKHR5cGVvZiBzdGVwSWQgIT09ICdzdHJpbmcnKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIGNvbnN0IGNsb3N1cmVWYXJzRm4gPSAodmFsdWUgYXMgYW55KS5fX2Nsb3N1cmVWYXJzRm47XG4gICAgICBjb25zdCBjbG9zdXJlVmFycyA9XG4gICAgICAgIGNsb3N1cmVWYXJzRm4gJiYgdHlwZW9mIGNsb3N1cmVWYXJzRm4gPT09ICdmdW5jdGlvbidcbiAgICAgICAgICA/IGNsb3N1cmVWYXJzRm4oKVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICAvLyBgX19ib3VuZFRoaXNgIC8gYF9fYm91bmRBcmdzYCBhcmUgbWFya2VyIHByb3BlcnRpZXMgYWRkZWQgYnkgdGhlXG4gICAgICAvLyBzdGVwIHByb3h5J3Mgb3ZlcnJpZGRlbiBgLmJpbmRgIChzZWUgc3RlcC50cykgdG8gcmVjb3JkIHRoZVxuICAgICAgLy8gYm91bmQgcmVjZWl2ZXIgYW5kIGFueSBwcmVmaWxsZWQgYXJndW1lbnRzLiBVc2UgYGluYCBmb3JcbiAgICAgIC8vIGBfX2JvdW5kVGhpc2Agc28gd2Ugcm91bmQtdHJpcCBldmVuIHdoZW4gdGhlIGJvdW5kIGB0aGlzYCBpc1xuICAgICAgLy8gYHVuZGVmaW5lZGAvYG51bGxgLiBgX19ib3VuZEFyZ3NgIGlzIG9ubHkgc2V0IHdoZW4gdGhlIHVzZXJcbiAgICAgIC8vIGFjdHVhbGx5IHN1cHBsaWVkIHByZWZpbGxlZCBhcmdzLCBzbyBhIG1pc3NpbmcgcHJvcGVydHkgbWVhbnNcbiAgICAgIC8vIFwibm8gcHJlZmlsbGVkIGFyZ3NcIi5cbiAgICAgIGNvbnN0IGhhc0JvdW5kVGhpcyA9ICdfX2JvdW5kVGhpcycgaW4gKHZhbHVlIGFzIGFueSk7XG4gICAgICBjb25zdCBib3VuZFRoaXMgPSBoYXNCb3VuZFRoaXMgPyAodmFsdWUgYXMgYW55KS5fX2JvdW5kVGhpcyA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGJvdW5kQXJncyA9ICh2YWx1ZSBhcyBhbnkpLl9fYm91bmRBcmdzIGFzIHVua25vd25bXSB8IHVuZGVmaW5lZDtcblxuICAgICAgY29uc3QgcGF5bG9hZDoge1xuICAgICAgICBzdGVwSWQ6IHN0cmluZztcbiAgICAgICAgY2xvc3VyZVZhcnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgICAgICBib3VuZFRoaXM/OiB1bmtub3duO1xuICAgICAgICBib3VuZEFyZ3M/OiB1bmtub3duW107XG4gICAgICB9ID0geyBzdGVwSWQgfTtcbiAgICAgIGlmIChjbG9zdXJlVmFycyAhPT0gdW5kZWZpbmVkKSBwYXlsb2FkLmNsb3N1cmVWYXJzID0gY2xvc3VyZVZhcnM7XG4gICAgICBpZiAoaGFzQm91bmRUaGlzKSBwYXlsb2FkLmJvdW5kVGhpcyA9IGJvdW5kVGhpcztcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGJvdW5kQXJncykgJiYgYm91bmRBcmdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcGF5bG9hZC5ib3VuZEFyZ3MgPSBib3VuZEFyZ3M7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYXlsb2FkO1xuICAgIH0sXG4gIH07XG59XG5cbi8vIC0tLS0gUmV2aXZlciAtLS0tXG5cbi8qKlxuICogQ3JlYXRlIHRoZSBTdGVwRnVuY3Rpb24gcmV2aXZlciBmb3Igd29ya2Zsb3cgY29udGV4dC5cbiAqXG4gKiBUaGUgcmV2aXZlciBjYWxscyBXT1JLRkxPV19VU0VfU1RFUCB0byBjcmVhdGUgdGhlIHN0ZXAgcHJveHksXG4gKiByZXN0b3JpbmcgdGhlIGFiaWxpdHkgdG8gY2FsbCB0aGUgc3RlcCBmcm9tIHdvcmtmbG93IGNvZGUuIElmIHRoZVxuICogc2VyaWFsaXplZCBwYXlsb2FkIGluY2x1ZGVzIGBib3VuZFRoaXNgIChhbmQgb3B0aW9uYWxseSBgYm91bmRBcmdzYCksXG4gKiB0aGUgcmV2aXZlciBhbHNvIHJlLWJpbmRzIHRoZSBmcmVzaGx5LWNyZWF0ZWQgcHJveHkgc28gYSBzdGVwIHByb3h5XG4gKiB0aGF0IHdhcyBjb25zdHJ1Y3RlZCB3aXRoIGAuYmluZCh0aGlzLCDigKYpYCBpbiB0aGUgd29ya2Zsb3cgYnVuZGxlXG4gKiBjb250aW51ZXMgdG8gY2FycnkgdGhhdCByZWNlaXZlciBhbmQgYW55IHByZWZpbGxlZCBhcmd1bWVudHMgYWZ0ZXJcbiAqIGJlaW5nIGRlc2VyaWFsaXplZCBpbiBhbm90aGVyIGJ1bmRsZSAoZS5nLiB3aGVuIHBhc3NlZCBhcyBhIHN0ZXBcbiAqIGFyZ3VtZW50KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN0ZXBGdW5jdGlvblJldml2ZXIoXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXNcbik6IFBhcnRpYWw8UmV2aXZlcnM+IHtcbiAgY29uc3QgdXNlU3RlcCA9IChnbG9iYWwgYXMgYW55KVtTeW1ib2wuZm9yKCdXT1JLRkxPV19VU0VfU1RFUCcpXSBhc1xuICAgIHwgKChcbiAgICAgICAgc3RlcElkOiBzdHJpbmcsXG4gICAgICAgIGNsb3N1cmVWYXJzRm4/OiAoKSA9PiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgICAgKSA9PiAoLi4uYXJnczogdW5rbm93bltdKSA9PiBQcm9taXNlPHVua25vd24+KVxuICAgIHwgdW5kZWZpbmVkO1xuXG4gIHJldHVybiB7XG4gICAgU3RlcEZ1bmN0aW9uOiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IHN0ZXBJZCA9IHZhbHVlLnN0ZXBJZDtcbiAgICAgIGNvbnN0IGNsb3N1cmVWYXJzID0gdmFsdWUuY2xvc3VyZVZhcnM7XG5cbiAgICAgIGlmICghdXNlU3RlcCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ1dPUktGTE9XX1VTRV9TVEVQIG5vdCBmb3VuZCBvbiBnbG9iYWwgb2JqZWN0LiBTdGVwIGZ1bmN0aW9ucyBjYW5ub3QgYmUgZGVzZXJpYWxpemVkIG91dHNpZGUgd29ya2Zsb3cgY29udGV4dC4nXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHByb3h5ID0gY2xvc3VyZVZhcnNcbiAgICAgICAgPyB1c2VTdGVwKHN0ZXBJZCwgKCkgPT4gY2xvc3VyZVZhcnMpXG4gICAgICAgIDogdXNlU3RlcChzdGVwSWQpO1xuXG4gICAgICBpZiAoJ2JvdW5kVGhpcycgaW4gdmFsdWUpIHtcbiAgICAgICAgY29uc3QgYm91bmRBcmdzID0gQXJyYXkuaXNBcnJheSh2YWx1ZS5ib3VuZEFyZ3MpID8gdmFsdWUuYm91bmRBcmdzIDogW107XG4gICAgICAgIHJldHVybiAocHJveHkgYXMgYW55KS5iaW5kKHZhbHVlLmJvdW5kVGhpcywgLi4uYm91bmRBcmdzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwcm94eTtcbiAgICB9LFxuICB9O1xufVxuIl19
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Step mode serialization.
3
+ *
4
+ * Used by the step handler for serializing step return values and
5
+ * deserializing step arguments. Supports encryption as a composable layer.
6
+ */
7
+ import type { CodecOptions } from './codec.js';
8
+ import { type CryptoKey } from './encryption.js';
9
+ /**
10
+ * Serialize a value from the step execution environment.
11
+ */
12
+ export declare function serialize(value: unknown, encryptionKey?: CryptoKey, options?: CodecOptions): Promise<Uint8Array | unknown>;
13
+ /**
14
+ * Deserialize a value for the step execution environment.
15
+ */
16
+ export declare function deserialize(data: Uint8Array | unknown, encryptionKey?: CryptoKey, options?: CodecOptions): Promise<unknown>;
17
+ //# sourceMappingURL=step.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"step.d.ts","sourceRoot":"","sources":["../../src/serialization/step.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,OAAO,EACL,KAAK,SAAS,EAGf,MAAM,iBAAiB,CAAC;AAKzB;;GAEG;AACH,wBAAsB,SAAS,CAC7B,KAAK,EAAE,OAAO,EACd,aAAa,CAAC,EAAE,SAAS,EACzB,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,UAAU,GAAG,OAAO,CAAC,CAY/B;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,UAAU,GAAG,OAAO,EAC1B,aAAa,CAAC,EAAE,SAAS,EACzB,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,OAAO,CAAC,CAmBlB"}