@workflow/core 5.0.0-beta.34 → 5.0.0-beta.36

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 (83) hide show
  1. package/dist/classify-error.d.ts.map +1 -1
  2. package/dist/classify-error.js +5 -2
  3. package/dist/create-hook.d.ts +41 -22
  4. package/dist/create-hook.d.ts.map +1 -1
  5. package/dist/create-hook.js +1 -1
  6. package/dist/describe-error.d.ts.map +1 -1
  7. package/dist/describe-error.js +12 -1
  8. package/dist/flushable-stream.d.ts +29 -0
  9. package/dist/flushable-stream.d.ts.map +1 -1
  10. package/dist/flushable-stream.js +228 -2
  11. package/dist/global.d.ts +2 -0
  12. package/dist/global.d.ts.map +1 -1
  13. package/dist/global.js +1 -1
  14. package/dist/private.d.ts +6 -17
  15. package/dist/private.d.ts.map +1 -1
  16. package/dist/private.js +1 -1
  17. package/dist/replay-payload-cache.d.ts +56 -0
  18. package/dist/replay-payload-cache.d.ts.map +1 -0
  19. package/dist/replay-payload-cache.js +137 -0
  20. package/dist/runtime/constants.d.ts +11 -0
  21. package/dist/runtime/constants.d.ts.map +1 -1
  22. package/dist/runtime/constants.js +26 -1
  23. package/dist/runtime/get-port-lazy.js +4 -4
  24. package/dist/runtime/helpers.d.ts +57 -0
  25. package/dist/runtime/helpers.d.ts.map +1 -1
  26. package/dist/runtime/helpers.js +102 -3
  27. package/dist/runtime/resume-hook.d.ts +4 -1
  28. package/dist/runtime/resume-hook.d.ts.map +1 -1
  29. package/dist/runtime/resume-hook.js +23 -20
  30. package/dist/runtime/run-id-time.d.ts +9 -0
  31. package/dist/runtime/run-id-time.d.ts.map +1 -1
  32. package/dist/runtime/run-id-time.js +15 -4
  33. package/dist/runtime/start.d.ts.map +1 -1
  34. package/dist/runtime/start.js +38 -8
  35. package/dist/runtime/step-executor.d.ts +41 -0
  36. package/dist/runtime/step-executor.d.ts.map +1 -1
  37. package/dist/runtime/step-executor.js +137 -18
  38. package/dist/runtime/step-handler.js +3 -3
  39. package/dist/runtime/step-latency.d.ts +70 -4
  40. package/dist/runtime/step-latency.d.ts.map +1 -1
  41. package/dist/runtime/step-latency.js +59 -7
  42. package/dist/runtime/suspension-handler.d.ts +10 -1
  43. package/dist/runtime/suspension-handler.d.ts.map +1 -1
  44. package/dist/runtime/suspension-handler.js +22 -9
  45. package/dist/runtime.d.ts.map +1 -1
  46. package/dist/runtime.js +491 -115
  47. package/dist/serialization.d.ts +44 -4
  48. package/dist/serialization.d.ts.map +1 -1
  49. package/dist/serialization.js +88 -54
  50. package/dist/step/context-storage.d.ts +6 -0
  51. package/dist/step/context-storage.d.ts.map +1 -1
  52. package/dist/step/context-storage.js +1 -1
  53. package/dist/step.d.ts.map +1 -1
  54. package/dist/step.js +10 -16
  55. package/dist/symbols.d.ts +13 -0
  56. package/dist/symbols.d.ts.map +1 -1
  57. package/dist/symbols.js +14 -1
  58. package/dist/telemetry/semantic-conventions.d.ts +25 -0
  59. package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
  60. package/dist/telemetry/semantic-conventions.js +22 -1
  61. package/dist/version.d.ts +1 -1
  62. package/dist/version.js +2 -2
  63. package/dist/workflow/abort-controller.d.ts.map +1 -1
  64. package/dist/workflow/abort-controller.js +3 -2
  65. package/dist/workflow/hook.d.ts.map +1 -1
  66. package/dist/workflow/hook.js +22 -7
  67. package/dist/workflow.d.ts +12 -9
  68. package/dist/workflow.d.ts.map +1 -1
  69. package/dist/workflow.js +16 -10
  70. package/docs/api-reference/create-hook.mdx +43 -2
  71. package/docs/api-reference/define-hook.mdx +26 -24
  72. package/docs/api-reference/fatal-error.mdx +29 -7
  73. package/docs/api-reference/fetch.mdx +3 -4
  74. package/docs/api-reference/sleep.mdx +1 -1
  75. package/docs/foundations/hooks.mdx +1 -1
  76. package/docs/foundations/idempotency.mdx +16 -9
  77. package/docs/how-it-works/encryption.mdx +3 -3
  78. package/docs/how-it-works/event-sourcing.mdx +6 -6
  79. package/docs/how-it-works/framework-integrations.mdx +3 -3
  80. package/package.json +5 -5
  81. package/dist/step-hydration-cache.d.ts +0 -148
  82. package/dist/step-hydration-cache.d.ts.map +0 -1
  83. package/dist/step-hydration-cache.js +0 -171
@@ -1,6 +1,48 @@
1
1
  import { WorkflowRuntimeError } from '@workflow/errors';
2
2
  import { withResolvers } from '@workflow/utils';
3
3
  import { envNumber } from '@workflow/world';
4
+ import { STREAM_WRITE_BATCH_SYMBOL } from './symbols.js';
5
+ /**
6
+ * Flow-control knob: upper bound on chunks read-but-not-yet-durably-written
7
+ * while coalescing. Once this many chunks are outstanding the producer stops
8
+ * reading until the consumer drains a batch, so a fast producer paired with a
9
+ * slow server can't grow the in-memory queue without bound. Override:
10
+ * `WORKFLOW_STREAM_MAX_INFLIGHT_CHUNKS`.
11
+ *
12
+ * This is deliberately distinct from the per-request batch caps below: this
13
+ * bounds how much is *buffered*, those bound how much goes out in one
14
+ * `writeMulti`. Raising this must never let a single request exceed a wire
15
+ * limit — batch sizing enforces that independently.
16
+ */
17
+ export const MAX_INFLIGHT_CHUNKS = 1000;
18
+ const getMaxInflightChunks = () => envNumber('WORKFLOW_STREAM_MAX_INFLIGHT_CHUNKS', MAX_INFLIGHT_CHUNKS, {
19
+ integer: true,
20
+ min: 1,
21
+ });
22
+ /**
23
+ * Wire limit: maximum number of chunks in a single coalesced `writeMulti`.
24
+ * The server enforces a per-multi-write chunk cap (1,000 today); a batch is
25
+ * split at this bound so it can never be rejected wholesale, independently of
26
+ * the backpressure knob above. Override: `WORKFLOW_STREAM_MAX_CHUNKS_PER_BATCH`.
27
+ */
28
+ export const MAX_CHUNKS_PER_BATCH = 1000;
29
+ const getMaxChunksPerBatch = () => envNumber('WORKFLOW_STREAM_MAX_CHUNKS_PER_BATCH', MAX_CHUNKS_PER_BATCH, {
30
+ integer: true,
31
+ min: 1,
32
+ });
33
+ /**
34
+ * Wire limit: maximum cumulative bytes in a single coalesced `writeMulti`.
35
+ * Chunk *count* alone is not enough — 1,000 small chunks are ~100KB but 1,000
36
+ * file-sized chunks can be hundreds of MB, which platform request-body limits
37
+ * reject long before the count cap matters. A batch is split once adding the
38
+ * next chunk would exceed this (a single chunk larger than the cap still goes
39
+ * out alone). Default 1 MiB. Override: `WORKFLOW_STREAM_MAX_BYTES_PER_BATCH`.
40
+ */
41
+ export const MAX_BYTES_PER_BATCH = 1024 * 1024;
42
+ const getMaxBytesPerBatch = () => envNumber('WORKFLOW_STREAM_MAX_BYTES_PER_BATCH', MAX_BYTES_PER_BATCH, {
43
+ integer: true,
44
+ min: 1,
45
+ });
4
46
  /**
5
47
  * Polling interval (in ms) for lock release detection.
6
48
  *
@@ -167,7 +209,25 @@ export function pollReadableLock(readable, state) {
167
209
  * @param state - The flushable state tracker
168
210
  * @returns Promise that resolves when stream ends (not when done promise resolves)
169
211
  */
170
- export async function flushablePipe(source, sink, state) {
212
+ export function flushablePipe(source, sink, state) {
213
+ // When the sink can accept a batch of chunks in one durable write (server
214
+ // writables do), coalesce chunks that arrive while a previous batch is still
215
+ // in flight into a single server write. Without this, the WHATWG
216
+ // `WritableStream` contract serializes the sink one chunk per write() and the
217
+ // per-chunk `await writer.write()` in the fallback means the sink's buffer
218
+ // never holds more than one chunk — so its `writeMulti` batching path never
219
+ // engages and every chunk becomes its own server round trip.
220
+ const batchWrite = sink[STREAM_WRITE_BATCH_SYMBOL];
221
+ return typeof batchWrite === 'function'
222
+ ? flushablePipeCoalescing(source, sink, state, batchWrite)
223
+ : flushablePipePerChunk(source, sink, state);
224
+ }
225
+ /**
226
+ * Per-chunk variant of {@link flushablePipe}: awaits each `writer.write()`
227
+ * before reading the next chunk. Used for sinks without a durable batch write
228
+ * (plain `WritableStream`s, `TransformStream` writables on the read path).
229
+ */
230
+ async function flushablePipePerChunk(source, sink, state) {
171
231
  const reader = source.getReader();
172
232
  const writer = sink.getWriter();
173
233
  let cancelReason;
@@ -234,4 +294,170 @@ export async function flushablePipe(source, sink, state) {
234
294
  writer.releaseLock();
235
295
  }
236
296
  }
237
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmx1c2hhYmxlLXN0cmVhbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9mbHVzaGFibGUtc3RyZWFtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3hELE9BQU8sRUFBNkIsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0UsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTVDOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUNILE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLEVBQUUsQ0FBQztBQUV4QyxnRkFBZ0Y7QUFDaEYsTUFBTSxxQkFBcUIsR0FBRyxHQUFXLEVBQUUsQ0FDekMsU0FBUyxDQUFDLGdDQUFnQyxFQUFFLHFCQUFxQixFQUFFO0lBQ2pFLE9BQU8sRUFBRSxJQUFJO0lBQ2IsR0FBRyxFQUFFLENBQUM7Q0FDUCxDQUFDLENBQUM7QUE2QkwsTUFBTSxVQUFVLG9CQUFvQjtJQUNsQyxNQUFNLEtBQUssR0FBeUI7UUFDbEMsR0FBRyxhQUFhLEVBQVE7UUFDeEIsVUFBVSxFQUFFLENBQUM7UUFDYixZQUFZLEVBQUUsS0FBSztRQUNuQixXQUFXLEVBQUUsS0FBSztLQUNuQixDQUFDO0lBRUYseUVBQXlFO0lBQ3pFLHdFQUF3RTtJQUN4RSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUMsQ0FBQztJQUU5QixPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsMkJBQTJCLENBQUMsUUFBd0I7SUFDM0QsSUFBSSxRQUFRLENBQUMsTUFBTTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBRWxDLElBQUksTUFBK0MsQ0FBQztJQUNwRCxJQUFJLENBQUM7UUFDSCx5RUFBeUU7UUFDekUsTUFBTSxHQUFHLFFBQVEsQ0FBQyxTQUFTLEVBQUUs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QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFdvcmtmbG93UnVudGltZUVycm9yIH0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQgeyB0eXBlIFByb21pc2VXaXRoUmVzb2x2ZXJzLCB3aXRoUmVzb2x2ZXJzIH0gZnJvbSAnQHdvcmtmbG93L3V0aWxzJztcbmltcG9ydCB7IGVudk51bWJlciB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5cbi8qKlxuICogUG9sbGluZyBpbnRlcnZhbCAoaW4gbXMpIGZvciBsb2NrIHJlbGVhc2UgZGV0ZWN0aW9uLlxuICpcbiAqIFRoZSBXZWIgU3RyZWFtcyBBUEkgZG9lcyBub3QgZXhwb3NlIGFuIGV2ZW50IGZvciBcImxvY2sgcmVsZWFzZWQgYnV0IHN0cmVhbVxuICogc3RpbGwgb3BlblwiOyB3ZSBjYW4gb25seSBkaXN0aW5ndWlzaCB0aGF0IHN0YXRlIGJ5IHBlcmlvZGljYWxseSBhdHRlbXB0aW5nXG4gKiB0byBhY3F1aXJlIGEgcmVhZGVyL3dyaXRlci4gRm9yIHRoYXQgcmVhc29uIHdlIHVzZSBwb2xsaW5nIGluc3RlYWQgb2YgYVxuICogZnVsbHkgZXZlbnQtZHJpdmVuIGFwcHJvYWNoIGhlcmUuXG4gKlxuICogMTBtcyBpcyBjaG9zZW4gc28gdGhlIHBvbGxpbmcgdGljayBhbG1vc3QgbmV2ZXIgc2l0cyBvbiB0aGUgY3JpdGljYWwgcGF0aDpcbiAqIHRoZSBWMiBzdGVwLWV4ZWN1dG9yJ3MgYG9wc1NldHRsZWRgIHJhY2Ugd2FpdHMgZm9yIHRoaXMgc3RhdGUgdG8gcmVzb2x2ZVxuICogYWZ0ZXIgZWFjaCBzdGVwIGJvZHkgcmV0dXJucywgc28gYSBjb2Fyc2VyIGludGVydmFsICh0aGUgcHJldmlvdXMgMTAwbXMpXG4gKiBhZGRzIHZpc2libGUgcGVyLXN0ZXAgbGF0ZW5jeSB0byBzdHJlYW1pbmcgd29ya2Zsb3dzLiBXaXRoIGEgdW5pZm9ybWx5XG4gKiBkaXN0cmlidXRlZCBvZmZzZXQgYmV0d2VlbiBzdGVwIHJldHVybiBhbmQgdGhlIG5leHQgdGljaywgdGhlIGV4cGVjdGVkXG4gKiB3YWl0IGlzIGhhbGYgdGhlIGludGVydmFsIOKAlCBzbyAxMG1zIG1lYW5zIH41bXMgYXZlcmFnZSB3YWl0IHBlciBzdGVwXG4gKiBpbnN0ZWFkIG9mIH41MG1zLiBUaGUgcGVyLXRpY2sgd29yayBpcyBgd3JpdGFibGUubG9ja2VkYCBwbHVzIGFcbiAqIGBnZXRXcml0ZXIoKWAvYHJlbGVhc2VMb2NrKClgIHByb2JlLCBib3RoIG1pY3Jvc2Vjb25kLXNjYWxlOyAxMMOXIG1vcmVcbiAqIHRpY2tzIGR1cmluZyBhIHN0cmVhbSdzIGxpZmV0aW1lIGlzIG5vdCBtZWFzdXJhYmxlIGluIHByYWN0aWNlLlxuICovXG5leHBvcnQgY29uc3QgTE9DS19QT0xMX0lOVEVSVkFMX01TID0gMTA7XG5cbi8qKiBFZmZlY3RpdmUgbG9jay1wb2xsIGludGVydmFsLiBPdmVycmlkZTogYFdPUktGTE9XX0xPQ0tfUE9MTF9JTlRFUlZBTF9NU2AuICovXG5jb25zdCBnZXRMb2NrUG9sbEludGVydmFsTXMgPSAoKTogbnVtYmVyID0+XG4gIGVudk51bWJlcignV09SS0ZMT1dfTE9DS19QT0xMX0lOVEVSVkFMX01TJywgTE9DS19QT0xMX0lOVEVSVkFMX01TLCB7XG4gICAgaW50ZWdlcjogdHJ1ZSxcbiAgICBtaW46IDEsXG4gIH0pO1xuXG4vKipcbiAqIFN0YXRlIHRyYWNrZXIgZm9yIGZsdXNoYWJsZSBzdHJlYW0gb3BlcmF0aW9ucy5cbiAqIFJlc29sdmVzIHdoZW4gZWl0aGVyOlxuICogMS4gU3RyZWFtIGNvbXBsZXRlcyAoY2xvc2UvZXJyb3IpLCBPUlxuICogMi4gTG9jayBpcyByZWxlYXNlZCBBTkQgYWxsIHBlbmRpbmcgb3BlcmF0aW9ucyBhcmUgZmx1c2hlZFxuICpcbiAqIE5vdGU6IGBkb25lUmVzb2x2ZWRgIGFuZCBgc3RyZWFtRW5kZWRgIGFyZSBzZXBhcmF0ZTpcbiAqIC0gYGRvbmVSZXNvbHZlZGA6IFRoZSBgZG9uZWAgcHJvbWlzZSBoYXMgYmVlbiByZXNvbHZlZCAoc3RlcCBjYW4gY29tcGxldGUpXG4gKiAtIGBzdHJlYW1FbmRlZGA6IFRoZSB1bmRlcmx5aW5nIHN0cmVhbSBoYXMgYWN0dWFsbHkgY2xvc2VkL2Vycm9yZWRcbiAqXG4gKiBPbmNlIGBkb25lUmVzb2x2ZWRgIGlzIHNldCB0byB0cnVlLCB0aGUgYGRvbmVgIHByb21pc2Ugd2lsbCBub3QgcmVzb2x2ZVxuICogYWdhaW4uIFJlLWFjcXVpcmluZyBsb2NrcyBhZnRlciByZWxlYXNlIGlzIG5vdCBzdXBwb3J0ZWQgYXMgYSB3YXkgdG9cbiAqIHRyaWdnZXIgYWRkaXRpb25hbCBjb21wbGV0aW9uIHNpZ25hbGluZy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGbHVzaGFibGVTdHJlYW1TdGF0ZSBleHRlbmRzIFByb21pc2VXaXRoUmVzb2x2ZXJzPHZvaWQ+IHtcbiAgLyoqIE51bWJlciBvZiB3cml0ZSBvcGVyYXRpb25zIGN1cnJlbnRseSBpbiBmbGlnaHQgdG8gdGhlIHNlcnZlciAqL1xuICBwZW5kaW5nT3BzOiBudW1iZXI7XG4gIC8qKiBXaGV0aGVyIHRoZSBgZG9uZWAgcHJvbWlzZSBoYXMgYmVlbiByZXNvbHZlZCAqL1xuICBkb25lUmVzb2x2ZWQ6IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSBoYXMgYWN0dWFsbHkgY2xvc2VkL2Vycm9yZWQgKi9cbiAgc3RyZWFtRW5kZWQ6IGJvb2xlYW47XG4gIC8qKiBJbnRlcnZhbCBJRCBmb3Igd3JpdGFibGUgbG9jayBwb2xsaW5nIChpZiBhY3RpdmUpICovXG4gIHdyaXRhYmxlUG9sbGluZ0ludGVydmFsPzogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+O1xuICAvKiogSW50ZXJ2YWwgSUQgZm9yIHJlYWRhYmxlIGxvY2sgcG9sbGluZyAoaWYgYWN0aXZlKSAqL1xuICByZWFkYWJsZVBvbGxpbmdJbnRlcnZhbD86IFJldHVyblR5cGU8dHlwZW9mIHNldEludGVydmFsPjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZsdXNoYWJsZVN0YXRlKCk6IEZsdXNoYWJsZVN0cmVhbVN0YXRlIHtcbiAgY29uc3Qgc3RhdGU6IEZsdXNoYWJsZVN0cmVhbVN0YXRlID0ge1xuICAgIC4uLndpdGhSZXNvbHZlcnM8dm9pZD4oKSxcbiAgICBwZW5kaW5nT3BzOiAwLFxuICAgIGRvbmVSZXNvbHZlZDogZmFsc2UsXG4gICAgc3RyZWFtRW5kZWQ6IGZhbHNlLFxuICB9O1xuXG4gIC8vIFRoZSBydW50aW1lIGF3YWl0cyB0aGlzIHByb21pc2UgYWZ0ZXIgdXNlciBjb2RlIHJldHVybnMuIE9ic2VydmUgZWFybHlcbiAgLy8gc3RyZWFtIGZhaWx1cmVzIG5vdyBzbyB0aGV5IGRvIG5vdCBiZWNvbWUgdW5oYW5kbGVkIHJlamVjdGlvbnMgZmlyc3QuXG4gIHN0YXRlLnByb21pc2UuY2F0Y2goKCkgPT4ge30pO1xuXG4gIHJldHVybiBzdGF0ZTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBXcml0YWJsZVN0cmVhbSBpcyB1bmxvY2tlZCAodXNlciByZWxlYXNlZCBsb2NrKSB2cyBjbG9zZWQuXG4gKiBXaGVuIGEgc3RyZWFtIGlzIGNsb3NlZCwgLmxvY2tlZCBpcyBmYWxzZSBidXQgZ2V0V3JpdGVyKCkgdGhyb3dzLlxuICogV2Ugb25seSB3YW50IHRvIHJlc29sdmUgdmlhIHBvbGxpbmcgd2hlbiB0aGUgc3RyZWFtIGlzIHVubG9ja2VkLCBub3QgY2xvc2VkLlxuICogSWYgY2xvc2VkLCB0aGUgcHVtcCB3aWxsIGhhbmRsZSByZXNvbHV0aW9uIHZpYSB0aGUgc3RyZWFtIGVuZGluZyBuYXR1cmFsbHkuXG4gKi9cbmZ1bmN0aW9uIGlzV3JpdGFibGVVbmxvY2tlZE5vdENsb3NlZCh3cml0YWJsZTogV3JpdGFibGVTdHJlYW0pOiBib29sZWFuIHtcbiAgaWYgKHdyaXRhYmxlLmxvY2tlZCkgcmV0dXJuIGZhbHNlO1xuXG4gIGxldCB3cml0ZXI6IFdyaXRhYmxlU3RyZWFtRGVmYXVsdFdyaXRlciB8IHVuZGVmaW5lZDtcbiAgdHJ5IHtcbiAgICAvLyBUcnkgdG8gYWNxdWlyZSB3cml0ZXIgLSBpZiBzdWNjZXNzZnVsLCBzdHJlYW0gaXMgdW5sb2NrZWQgKG5vdCBjbG9zZWQpXG4gICAgd3JpdGVyID0gd3JpdGFibGUuZ2V0V3JpdGVyKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIGdldFdyaXRlcigpIHRocm93cyBpZiBzdHJlYW0gaXMgY2xvc2VkL2Vycm9yZWQgLSBsZXQgcHVtcCBoYW5kbGUgaXRcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB0cnkge1xuICAgIHdyaXRlci5yZWxlYXNlTG9jaygpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBJZiByZWxlYXNlTG9jaygpIHRocm93cyBmb3IgYW55IHJlYXNvbiwgY29uc2VydmF0aXZlbHkgdHJlYXQgdGhlXG4gICAgLy8gc3RyZWFtIGFzIGNsb3NlZC9lcnJvcmVkIHNvIGNhbGxlcnMgZG9uJ3QgYXNzdW1lIGl0J3Mgc2FmZSB0byB1c2UuXG4gICAgLy8gVGhlIHB1bXAgd2lsbCBvYnNlcnZlIHRoZSBmYWlsdXJlIHZpYSB0aGUgc3RyZWFtJ3MgZW5kIHN0YXRlLlxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIFJlYWRhYmxlU3RyZWFtIGlzIHVubG9ja2VkICh1c2VyIHJlbGVhc2VkIGxvY2spIHZzIGNsb3NlZC5cbiAqL1xuZnVuY3Rpb24gaXNSZWFkYWJsZVVubG9ja2VkTm90Q2xvc2VkKHJlYWRhYmxlOiBSZWFkYWJsZVN0cmVhbSk6IGJvb2xlYW4ge1xuICBpZiAocmVhZGFibGUubG9ja2VkKSByZXR1cm4gZmFsc2U7XG5cbiAgbGV0IHJlYWRlcjogUmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyIHwgdW5kZWZpbmVkO1xuICB0cnkge1xuICAgIC8vIFRyeSB0byBhY3F1aXJlIHJlYWRlciAtIGlmIHN1Y2Nlc3NmdWwsIHN0cmVhbSBpcyB1bmxvY2tlZCAobm90IGNsb3NlZClcbiAgICByZWFkZXIgPSByZWFkYWJsZS5nZXRSZWFkZXIoKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZ2V0UmVhZGVyKCkgdGhyb3dzIGlmIHN0cmVhbSBpcyBjbG9zZWQvZXJyb3JlZCAtIGxldCBwdW1wIGhhbmRsZSBpdFxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmVhZGVyLnJlbGVhc2VMb2NrKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIElmIHJlbGVhc2VMb2NrKCkgdGhyb3dzIGZvciBhbnkgcmVhc29uLCBjb25zZXJ2YXRpdmVseSB0cmVhdCB0aGVcbiAgICAvLyBzdHJlYW0gYXMgY2xvc2VkL2Vycm9yZWQgc28gY2FsbGVycyBkb24ndCBhc3N1bWUgaXQncyBzYWZlIHRvIHVzZS5cbiAgICAvLyBUaGUgcHVtcCB3aWxsIG9ic2VydmUgdGhlIGZhaWx1cmUgdmlhIHRoZSBzdHJlYW0ncyBlbmQgc3RhdGUuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogUG9sbHMgYSBXcml0YWJsZVN0cmVhbSB0byBjaGVjayBpZiB0aGUgdXNlciBoYXMgcmVsZWFzZWQgdGhlaXIgbG9jay5cbiAqIFJlc29sdmVzIHRoZSBkb25lIHByb21pc2Ugd2hlbiBsb2NrIGlzIHJlbGVhc2VkIGFuZCBubyBwZW5kaW5nIG9wcyByZW1haW4uXG4gKlxuICogTm90ZTogT25seSByZXNvbHZlcyBpZiBzdHJlYW0gaXMgdW5sb2NrZWQgYnV0IE5PVCBjbG9zZWQuIElmIHRoZSB1c2VyIGNsb3Nlc1xuICogdGhlIHN0cmVhbSwgdGhlIHB1bXAgd2lsbCBoYW5kbGUgcmVzb2x1dGlvbiB2aWEgdGhlIHN0cmVhbSBlbmRpbmcgbmF0dXJhbGx5LlxuICpcbiAqIFByb3RlY3Rpb246IElmIHBvbGxpbmcgaXMgYWxyZWFkeSBhY3RpdmUgb24gdGhpcyBzdGF0ZSwgdGhlIGV4aXN0aW5nIGludGVydmFsXG4gKiBpcyB1c2VkIHRvIGF2b2lkIGNyZWF0aW5nIG11bHRpcGxlIHNpbXVsdGFuZW91cyBwb2xsaW5nIG9wZXJhdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwb2xsV3JpdGFibGVMb2NrKFxuICB3cml0YWJsZTogV3JpdGFibGVTdHJlYW0sXG4gIHN0YXRlOiBGbHVzaGFibGVTdHJlYW1TdGF0ZVxuKTogdm9pZCB7XG4gIC8vIFByZXZlbnQgbXVsdGlwbGUgc2ltdWx0YW5lb3VzIHBvbGxpbmcgb24gdGhlIHNhbWUgc3RhdGVcbiAgaWYgKHN0YXRlLndyaXRhYmxlUG9sbGluZ0ludGVydmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBpbnRlcnZhbElkID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgIC8vIFN0b3AgcG9sbGluZyBpZiBhbHJlYWR5IHJlc29sdmVkIG9yIHN0cmVhbSBlbmRlZFxuICAgIGlmIChzdGF0ZS5kb25lUmVzb2x2ZWQgfHwgc3RhdGUuc3RyZWFtRW5kZWQpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJZCk7XG4gICAgICBzdGF0ZS53cml0YWJsZVBvbGxpbmdJbnRlcnZhbCA9IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBsb2NrIGlzIHJlbGVhc2VkIChub3QgY2xvc2VkKSBhbmQgbm8gcGVuZGluZyBvcHNcbiAgICBpZiAoaXNXcml0YWJsZVVubG9ja2VkTm90Q2xvc2VkKHdyaXRhYmxlKSAmJiBzdGF0ZS5wZW5kaW5nT3BzID09PSAwKSB7XG4gICAgICBzdGF0ZS5kb25lUmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgc3RhdGUucmVzb2x2ZSgpO1xuICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKTtcbiAgICAgIHN0YXRlLndyaXRhYmxlUG9sbGluZ0ludGVydmFsID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfSwgZ2V0TG9ja1BvbGxJbnRlcnZhbE1zKCkpO1xuXG4gIHN0YXRlLndyaXRhYmxlUG9sbGluZ0ludGVydmFsID0gaW50ZXJ2YWxJZDtcbn1cblxuLyoqXG4gKiBQb2xscyBhIFJlYWRhYmxlU3RyZWFtIHRvIGNoZWNrIGlmIHRoZSB1c2VyIGhhcyByZWxlYXNlZCB0aGVpciBsb2NrLlxuICogUmVzb2x2ZXMgdGhlIGRvbmUgcHJvbWlzZSB3aGVuIGxvY2sgaXMgcmVsZWFzZWQgYW5kIG5vIHBlbmRpbmcgb3BzIHJlbWFpbi5cbiAqXG4gKiBOb3RlOiBPbmx5IHJlc29sdmVzIGlmIHN0cmVhbSBpcyB1bmxvY2tlZCBidXQgTk9UIGNsb3NlZC4gSWYgdGhlIHVzZXIgY2xvc2VzXG4gKiB0aGUgc3RyZWFtLCB0aGUgcHVtcCB3aWxsIGhhbmRsZSByZXNvbHV0aW9uIHZpYSB0aGUgc3RyZWFtIGVuZGluZyBuYXR1cmFsbHkuXG4gKlxuICogUHJvdGVjdGlvbjogSWYgcG9sbGluZyBpcyBhbHJlYWR5IGFjdGl2ZSBvbiB0aGlzIHN0YXRlLCB0aGUgZXhpc3RpbmcgaW50ZXJ2YWxcbiAqIGlzIHVzZWQgdG8gYXZvaWQgY3JlYXRpbmcgbXVsdGlwbGUgc2ltdWx0YW5lb3VzIHBvbGxpbmcgb3BlcmF0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBvbGxSZWFkYWJsZUxvY2soXG4gIHJlYWRhYmxlOiBSZWFkYWJsZVN0cmVhbSxcbiAgc3RhdGU6IEZsdXNoYWJsZVN0cmVhbVN0YXRlXG4pOiB2b2lkIHtcbiAgLy8gUHJldmVudCBtdWx0aXBsZSBzaW11bHRhbmVvdXMgcG9sbGluZyBvbiB0aGUgc2FtZSBzdGF0ZVxuICBpZiAoc3RhdGUucmVhZGFibGVQb2xsaW5nSW50ZXJ2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGludGVydmFsSWQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgLy8gU3RvcCBwb2xsaW5nIGlmIGFscmVhZHkgcmVzb2x2ZWQgb3Igc3RyZWFtIGVuZGVkXG4gICAgaWYgKHN0YXRlLmRvbmVSZXNvbHZlZCB8fCBzdGF0ZS5zdHJlYW1FbmRlZCkge1xuICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKTtcbiAgICAgIHN0YXRlLnJlYWRhYmxlUG9sbGluZ0ludGVydmFsID0gdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGxvY2sgaXMgcmVsZWFzZWQgKG5vdCBjbG9zZWQpIGFuZCBubyBwZW5kaW5nIG9wc1xuICAgIGlmIChpc1JlYWRhYmxlVW5sb2NrZWROb3RDbG9zZWQocmVhZGFibGUpICYmIHN0YXRlLnBlbmRpbmdPcHMgPT09IDApIHtcbiAgICAgIHN0YXRlLmRvbmVSZXNvbHZlZCA9IHRydWU7XG4gICAgICBzdGF0ZS5yZXNvbHZlKCk7XG4gICAgICBjbGVhckludGVydmFsKGludGVydmFsSWQpO1xuICAgICAgc3RhdGUucmVhZGFibGVQb2xsaW5nSW50ZXJ2YWwgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9LCBnZXRMb2NrUG9sbEludGVydmFsTXMoKSk7XG5cbiAgc3RhdGUucmVhZGFibGVQb2xsaW5nSW50ZXJ2YWwgPSBpbnRlcnZhbElkO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmbHVzaGFibGUgcGlwZSBmcm9tIGEgUmVhZGFibGVTdHJlYW0gdG8gYSBXcml0YWJsZVN0cmVhbS5cbiAqIFVubGlrZSBwaXBlVG8oKSwgdGhpcyByZXNvbHZlcyB3aGVuOlxuICogMS4gVGhlIHNvdXJjZSBzdHJlYW0gY29tcGxldGVzIChjbG9zZS9lcnJvciksIE9SXG4gKiAyLiBUaGUgdXNlciByZWxlYXNlcyB0aGVpciBsb2NrIG9uIHVzZXJTdHJlYW0gQU5EIGFsbCBwZW5kaW5nIHdyaXRlcyBhcmUgZmx1c2hlZFxuICpcbiAqIEBwYXJhbSBzb3VyY2UgLSBUaGUgcmVhZGFibGUgc3RyZWFtIHRvIHJlYWQgZnJvbSAoZS5nLiwgdHJhbnNmb3JtJ3MgcmVhZGFibGUpXG4gKiBAcGFyYW0gc2luayAtIFRoZSB3cml0YWJsZSBzdHJlYW0gdG8gd3JpdGUgdG8gKGUuZy4sIHNlcnZlciB3cml0YWJsZSlcbiAqIEBwYXJhbSBzdGF0ZSAtIFRoZSBmbHVzaGFibGUgc3RhdGUgdHJhY2tlclxuICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gc3RyZWFtIGVuZHMgKG5vdCB3aGVuIGRvbmUgcHJvbWlzZSByZXNvbHZlcylcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZsdXNoYWJsZVBpcGUoXG4gIHNvdXJjZTogUmVhZGFibGVTdHJlYW0sXG4gIHNpbms6IFdyaXRhYmxlU3RyZWFtLFxuICBzdGF0ZTogRmx1c2hhYmxlU3RyZWFtU3RhdGVcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZWFkZXIgPSBzb3VyY2UuZ2V0UmVhZGVyKCk7XG4gIGNvbnN0IHdyaXRlciA9IHNpbmsuZ2V0V3JpdGVyKCk7XG4gIGxldCBjYW5jZWxSZWFzb246IHVua25vd247XG5cbiAgdHJ5IHtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgLy8gQ2hlY2sgaWYgc3RyZWFtIGhhcyBlbmRlZFxuICAgICAgaWYgKHN0YXRlLnN0cmVhbUVuZGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gUmVhZCBmcm9tIHNvdXJjZSAtIGRvbid0IGNvdW50IGFzIHBlbmRpbmcgb3Agc2luY2Ugd2UncmUganVzdCB3YWl0aW5nIGZvciBkYXRhXG4gICAgICAvLyBUaGUgaW1wb3J0YW50IG9wcyBhcmUgd3JpdGVzIHRvIHRoZSBzaW5rIChzZXJ2ZXIpXG4gICAgICBjb25zdCByZWFkUmVzdWx0ID0gYXdhaXQgUHJvbWlzZS5yYWNlKFtcbiAgICAgICAgcmVhZGVyLnJlYWQoKSxcbiAgICAgICAgd3JpdGVyLmNsb3NlZC50aGVuKCgpID0+IHtcbiAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoJ1dyaXRhYmxlIHN0cmVhbSBjbG9zZWQgcHJlbWF0dXJlbHknKTtcbiAgICAgICAgfSksXG4gICAgICBdKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgc3RyZWFtIGhhcyBlbmRlZCAoZS5nLiwgZHVlIHRvIGVycm9yIGluIGFub3RoZXIgcGF0aCkgYmVmb3JlIHByb2Nlc3NpbmdcbiAgICAgIGlmIChzdGF0ZS5zdHJlYW1FbmRlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChyZWFkUmVzdWx0LmRvbmUpIHtcbiAgICAgICAgLy8gU291cmNlIHN0cmVhbSBjb21wbGV0ZWQgLSBjbG9zZSBzaW5rIGFuZCByZXNvbHZlXG4gICAgICAgIHN0YXRlLnN0cmVhbUVuZGVkID0gdHJ1ZTtcbiAgICAgICAgYXdhaXQgd3JpdGVyLmNsb3NlKCk7XG4gICAgICAgIC8vIFJlc29sdmUgZG9uZSBwcm9taXNlIGlmIG5vdCBhbHJlYWR5IHJlc29sdmVkXG4gICAgICAgIGlmICghc3RhdGUuZG9uZVJlc29sdmVkKSB7XG4gICAgICAgICAgc3RhdGUuZG9uZVJlc29sdmVkID0gdHJ1ZTtcbiAgICAgICAgICBzdGF0ZS5yZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBDb3VudCB3cml0ZSBhcyBhIHBlbmRpbmcgb3AgLSB0aGlzIGlzIHdoYXQgd2UgbmVlZCB0byBmbHVzaFxuICAgICAgc3RhdGUucGVuZGluZ09wcysrO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgd3JpdGVyLndyaXRlKHJlYWRSZXN1bHQudmFsdWUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc3RhdGUucGVuZGluZ09wcy0tO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgc3RhdGUuc3RyZWFtRW5kZWQgPSB0cnVlO1xuICAgIGNhbmNlbFJlYXNvbiA9IGVycjtcbiAgICBpZiAoIXN0YXRlLmRvbmVSZXNvbHZlZCkge1xuICAgICAgc3RhdGUuZG9uZVJlc29sdmVkID0gdHJ1ZTtcbiAgICAgIHN0YXRlLnJlamVjdChlcnIpO1xuICAgIH1cbiAgICAvLyBQcm9wYWdhdGUgZXJyb3IgdGhyb3VnaCBmbHVzaGFibGVQaXBlJ3Mgb3duIHByb21pc2UgYXMgd2VsbC5cbiAgICAvLyBDYWxsZXJzIHRoYXQgcmVseSBvbiB0aGUgRmx1c2hhYmxlU3RyZWFtU3RhdGUgc2hvdWxkIHVzZSBgc3RhdGUucHJvbWlzZWAsXG4gICAgLy8gd2hpbGUgb3RoZXIgY2FsbGVycyBtYXkgZGVwZW5kIG9uIHRoaXMgcmVqZWN0aW9uLiBTb21lIGtub3duIGNhbGxlcnNcbiAgICAvLyBleHBsaWNpdGx5IGlnbm9yZSB0aGlzIHJlamVjdGlvbiAoYC5jYXRjaCgoKSA9PiB7fSlgKSBhbmQgcmVseSBzb2xlbHlcbiAgICAvLyBvbiBgc3RhdGUucmVqZWN0KGVycilgIGZvciBlcnJvciBoYW5kbGluZy5cbiAgICB0aHJvdyBlcnI7XG4gIH0gZmluYWxseSB7XG4gICAgLy8gQ2FuY2VsIHRoZSB1cHN0cmVhbSByZWFkZXIgc28gdGhlIHNvdXJjZSBrbm93cyB0byBzdG9wIGdlbmVyYXRpbmcgZGF0YS5cbiAgICAvLyBVc2VzIGNhbmNlbFJlYXNvbiAoc2V0IGluIHRoZSBjYXRjaCBibG9jaykgc28gdGhlIHNvdXJjZSByZWNlaXZlcyBjb250ZXh0XG4gICAgLy8gYWJvdXQgd2h5IGl0IHdhcyBjYW5jZWxsZWQuIE9uIG5vcm1hbCBjb21wbGV0aW9uIGNhbmNlbFJlYXNvbiBpcyB1bmRlZmluZWQsXG4gICAgLy8gd2hpY2ggaXMgYSBoYXJtbGVzcyBuby1vcCBvbiBhbiBhbHJlYWR5LWRvbmUgcmVhZGVyLlxuICAgIHJlYWRlci5jYW5jZWwoY2FuY2VsUmVhc29uKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgcmVhZGVyLnJlbGVhc2VMb2NrKCk7XG4gICAgd3JpdGVyLnJlbGVhc2VMb2NrKCk7XG4gIH1cbn1cbiJdfQ==
297
+ function wake(ctx, which) {
298
+ const resolve = ctx[which];
299
+ if (resolve) {
300
+ ctx[which] = null;
301
+ resolve();
302
+ }
303
+ }
304
+ /**
305
+ * How many leading queued chunks fit in one `writeMulti` without crossing the
306
+ * chunk-count or byte wire limits. Always returns at least 1 so a single chunk
307
+ * larger than the byte cap still makes progress (alone).
308
+ */
309
+ function nextBatchSize(ctx) {
310
+ let count = 0;
311
+ let bytes = 0;
312
+ for (const chunk of ctx.queue) {
313
+ if (count >= ctx.maxChunksPerBatch)
314
+ break;
315
+ if (count > 0 && bytes + chunk.byteLength > ctx.maxBytesPerBatch)
316
+ break;
317
+ count++;
318
+ bytes += chunk.byteLength;
319
+ }
320
+ return count;
321
+ }
322
+ /**
323
+ * Consumer loop: drains the queue one batch at a time, awaiting each batch so it
324
+ * is durable on the server before its chunks leave `pendingOps`. It takes as
325
+ * much of the queue as the wire limits allow each round, so chunks that arrived
326
+ * while the previous batch was in flight coalesce into the next server write.
327
+ *
328
+ * `pendingOps` is decremented only after `batchWrite` *succeeds*: on failure the
329
+ * chunks stay retained in the sink's buffer (see `WorkflowServerWritableStream`)
330
+ * and are therefore still "read but not durable", so they must keep counting.
331
+ * A throw propagates out of the loop; the pipe's producer then tears down.
332
+ */
333
+ async function drainBatches(ctx) {
334
+ while (true) {
335
+ if (ctx.queue.length === 0) {
336
+ if (ctx.sourceDone)
337
+ return;
338
+ await new Promise((resolve) => {
339
+ ctx.wakeConsumer = resolve;
340
+ });
341
+ continue;
342
+ }
343
+ const count = nextBatchSize(ctx);
344
+ const batch = ctx.queue.slice(0, count);
345
+ ctx.queue = ctx.queue.slice(count);
346
+ await ctx.batchWrite(batch);
347
+ ctx.state.pendingOps -= batch.length;
348
+ // Relieve producer backpressure now that this batch is durable.
349
+ wake(ctx, 'wakeProducer');
350
+ }
351
+ }
352
+ /**
353
+ * Await the next chunk while a batch write is in flight, racing three outcomes:
354
+ * a read result, the sink closing under us, or a server-write failure from the
355
+ * consumer (surfaced promptly even while blocked on the read). On normal
356
+ * completion the consumer only settles after the producer sets `sourceDone`, so
357
+ * its branch throws only on real failure.
358
+ */
359
+ function readNextChunk(reader, writer, consumer) {
360
+ return Promise.race([
361
+ reader.read(),
362
+ writer.closed.then(() => {
363
+ throw new WorkflowRuntimeError('Writable stream closed prematurely');
364
+ }),
365
+ consumer.then(() => {
366
+ throw new WorkflowRuntimeError('Stream consumer ended prematurely');
367
+ }, (err) => {
368
+ throw err;
369
+ }),
370
+ ]);
371
+ }
372
+ /**
373
+ * Backpressure: once too many chunks are outstanding, stop reading until the
374
+ * consumer drains a batch. Racing the consumer avoids a deadlock if it ends or
375
+ * fails while we wait.
376
+ */
377
+ async function awaitBackpressureRelief(ctx, consumer, maxInflight) {
378
+ if (ctx.state.pendingOps < maxInflight)
379
+ return;
380
+ await Promise.race([
381
+ new Promise((resolve) => {
382
+ ctx.wakeProducer = resolve;
383
+ }),
384
+ consumer.then(() => undefined, () => undefined),
385
+ ]);
386
+ }
387
+ /**
388
+ * Batching variant of {@link flushablePipe} for sinks that expose a durable
389
+ * batch write ({@link STREAM_WRITE_BATCH_SYMBOL}). A producer reads from
390
+ * `source` into a queue; {@link drainBatches} coalesces queued chunks into as
391
+ * few server writes as possible — turning a fast burst of chunks into a handful
392
+ * of round trips instead of one per chunk.
393
+ *
394
+ * Durability is preserved exactly as in the per-chunk path: `state.pendingOps`
395
+ * counts chunks that have been read but not yet durably written, so the
396
+ * lock-release completion (`pollWritableLock` / `pollReadableLock`) never fires
397
+ * while data is still queued or in flight, and the source-done path awaits every
398
+ * batch before closing.
399
+ */
400
+ async function flushablePipeCoalescing(source, sink, state, batchWrite) {
401
+ const reader = source.getReader();
402
+ const writer = sink.getWriter();
403
+ const maxInflight = getMaxInflightChunks();
404
+ let cancelReason;
405
+ const ctx = {
406
+ state,
407
+ batchWrite,
408
+ queue: [],
409
+ sourceDone: false,
410
+ wakeConsumer: null,
411
+ wakeProducer: null,
412
+ maxChunksPerBatch: getMaxChunksPerBatch(),
413
+ maxBytesPerBatch: getMaxBytesPerBatch(),
414
+ };
415
+ const consumer = drainBatches(ctx);
416
+ try {
417
+ while (!state.streamEnded) {
418
+ const readResult = await readNextChunk(reader, writer, consumer);
419
+ if (state.streamEnded)
420
+ return;
421
+ if (readResult.done) {
422
+ // Signal end-of-source and wait for every queued/in-flight batch to
423
+ // reach the server before closing, so no chunk is dropped.
424
+ ctx.sourceDone = true;
425
+ wake(ctx, 'wakeConsumer');
426
+ await consumer;
427
+ state.streamEnded = true;
428
+ await writer.close();
429
+ if (!state.doneResolved) {
430
+ state.doneResolved = true;
431
+ state.resolve();
432
+ }
433
+ return;
434
+ }
435
+ // Count the chunk as pending the moment it is read — it stays counted
436
+ // until its batch is durably written.
437
+ ctx.queue.push(readResult.value);
438
+ state.pendingOps++;
439
+ wake(ctx, 'wakeConsumer');
440
+ await awaitBackpressureRelief(ctx, consumer, maxInflight);
441
+ }
442
+ }
443
+ catch (err) {
444
+ state.streamEnded = true;
445
+ cancelReason = err;
446
+ // Let the consumer settle so its rejection (if any) is observed here rather
447
+ // than surfacing as an unhandled rejection.
448
+ ctx.sourceDone = true;
449
+ wake(ctx, 'wakeConsumer');
450
+ await consumer.catch(() => { });
451
+ if (!state.doneResolved) {
452
+ state.doneResolved = true;
453
+ state.reject(err);
454
+ }
455
+ throw err;
456
+ }
457
+ finally {
458
+ reader.cancel(cancelReason).catch(() => { });
459
+ reader.releaseLock();
460
+ writer.releaseLock();
461
+ }
462
+ }
463
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmx1c2hhYmxlLXN0cmVhbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9mbHVzaGFibGUtc3RyZWFtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3hELE9BQU8sRUFBNkIsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0UsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQVN6RDs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQztBQUV4QyxNQUFNLG9CQUFvQixHQUFHLEdBQVcsRUFBRSxDQUN4QyxTQUFTLENBQUMscUNBQXFDLEVBQUUsbUJBQW1CLEVBQUU7SUFDcEUsT0FBTyxFQUFFLElBQUk7SUFDYixHQUFHLEVBQUUsQ0FBQztDQUNQLENBQUMsQ0FBQztBQUVMOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDO0FBRXpDLE1BQU0sb0JBQW9CLEdBQUcsR0FBVyxFQUFFLENBQ3hDLFNBQVMsQ0FBQyxzQ0FBc0MsRUFBRSxvQkFBb0IsRUFBRTtJQUN0RSxPQUFPLEVBQUUsSUFBSTtJQUNiLEdBQUcsRUFBRSxDQUFDO0NBQ1AsQ0FBQyxDQUFDO0FBRUw7Ozs7Ozs7R0FPRztBQUNILE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFFL0MsTUFBTSxtQkFBbUIsR0FBRyxHQUFXLEVBQUUsQ0FDdkMsU0FBUyxDQUFDLHFDQUFxQyxFQUFFLG1CQUFtQixFQUFFO0lBQ3BFLE9BQU8sRUFBRSxJQUFJO0lBQ2IsR0FBRyxFQUFFLENBQUM7Q0FDUCxDQUFDLENBQUM7QUFFTDs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFD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QztRQUMvQixJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3hCLEtBQUssQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQzFCLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDcEIsQ0FBQztRQUNELE1BQU0sR0FBRyxDQUFDO0lBQ1osQ0FBQztZQUFTLENBQUM7UUFDVCxNQUFNLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUMsQ0FBQztRQUM1QyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDckIsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgV29ya2Zsb3dSdW50aW1lRXJyb3IgfSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB7IHR5cGUgUHJvbWlzZVdpdGhSZXNvbHZlcnMsIHdpdGhSZXNvbHZlcnMgfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMnO1xuaW1wb3J0IHsgZW52TnVtYmVyIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7IFNUUkVBTV9XUklURV9CQVRDSF9TWU1CT0wgfSBmcm9tICcuL3N5bWJvbHMuanMnO1xuXG4vKipcbiAqIEEgYmF0Y2hlZCwgZHVyYWJsZSB3cml0ZSBlbnRyeSBwb2ludCBhIHNpbmsgbWF5IGV4cG9zZSB1bmRlclxuICoge0BsaW5rIFNUUkVBTV9XUklURV9CQVRDSF9TWU1CT0x9LiBSZXNvbHZlcyBvbmNlIGV2ZXJ5IGNodW5rIGluIHRoZSBiYXRjaFxuICogaGFzIHJlYWNoZWQgdGhlIHNlcnZlci4gU2VlIGBXb3JrZmxvd1NlcnZlcldyaXRhYmxlU3RyZWFtYC5cbiAqL1xudHlwZSBCYXRjaFdyaXRlID0gKGNodW5rczogVWludDhBcnJheVtdKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG4vKipcbiAqIEZsb3ctY29udHJvbCBrbm9iOiB1cHBlciBib3VuZCBvbiBjaHVua3MgcmVhZC1idXQtbm90LXlldC1kdXJhYmx5LXdyaXR0ZW5cbiAqIHdoaWxlIGNvYWxlc2NpbmcuIE9uY2UgdGhpcyBtYW55IGNodW5rcyBhcmUgb3V0c3RhbmRpbmcgdGhlIHByb2R1Y2VyIHN0b3BzXG4gKiByZWFkaW5nIHVudGlsIHRoZSBjb25zdW1lciBkcmFpbnMgYSBiYXRjaCwgc28gYSBmYXN0IHByb2R1Y2VyIHBhaXJlZCB3aXRoIGFcbiAqIHNsb3cgc2VydmVyIGNhbid0IGdyb3cgdGhlIGluLW1lbW9yeSBxdWV1ZSB3aXRob3V0IGJvdW5kLiBPdmVycmlkZTpcbiAqIGBXT1JLRkxPV19TVFJFQU1fTUFYX0lORkxJR0hUX0NIVU5LU2AuXG4gKlxuICogVGhpcyBpcyBkZWxpYmVyYXRlbHkgZGlzdGluY3QgZnJvbSB0aGUgcGVyLXJlcXVlc3QgYmF0Y2ggY2FwcyBiZWxvdzogdGhpc1xuICogYm91bmRzIGhvdyBtdWNoIGlzICpidWZmZXJlZCosIHRob3NlIGJvdW5kIGhvdyBtdWNoIGdvZXMgb3V0IGluIG9uZVxuICogYHdyaXRlTXVsdGlgLiBSYWlzaW5nIHRoaXMgbXVzdCBuZXZlciBsZXQgYSBzaW5nbGUgcmVxdWVzdCBleGNlZWQgYSB3aXJlXG4gKiBsaW1pdCDigJQgYmF0Y2ggc2l6aW5nIGVuZm9yY2VzIHRoYXQgaW5kZXBlbmRlbnRseS5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9JTkZMSUdIVF9DSFVOS1MgPSAxMDAwO1xuXG5jb25zdCBnZXRNYXhJbmZsaWdodENodW5rcyA9ICgpOiBudW1iZXIgPT5cbiAgZW52TnVtYmVyKCdXT1JLRkxPV19TVFJFQU1fTUFYX0lORkxJR0hUX0NIVU5LUycsIE1BWF9JTkZMSUdIVF9DSFVOS1MsIHtcbiAgICBpbnRlZ2VyOiB0cnVlLFxuICAgIG1pbjogMSxcbiAgfSk7XG5cbi8qKlxuICogV2lyZSBsaW1pdDogbWF4aW11bSBudW1iZXIgb2YgY2h1bmtzIGluIGEgc2luZ2xlIGNvYWxlc2NlZCBgd3JpdGVNdWx0aWAuXG4gKiBUaGUgc2VydmVyIGVuZm9yY2VzIGEgcGVyLW11bHRpLXdyaXRlIGNodW5rIGNhcCAoMSwwMDAgdG9kYXkpOyBhIGJhdGNoIGlzXG4gKiBzcGxpdCBhdCB0aGlzIGJvdW5kIHNvIGl0IGNhbiBuZXZlciBiZSByZWplY3RlZCB3aG9sZXNhbGUsIGluZGVwZW5kZW50bHkgb2ZcbiAqIHRoZSBiYWNrcHJlc3N1cmUga25vYiBhYm92ZS4gT3ZlcnJpZGU6IGBXT1JLRkxPV19TVFJFQU1fTUFYX0NIVU5LU19QRVJfQkFUQ0hgLlxuICovXG5leHBvcnQgY29uc3QgTUFYX0NIVU5LU19QRVJfQkFUQ0ggPSAxMDAwO1xuXG5jb25zdCBnZXRNYXhDaHVua3NQZXJCYXRjaCA9ICgpOiBudW1iZXIgPT5cbiAgZW52TnVtYmVyKCdXT1JLRkxPV19TVFJFQU1fTUFYX0NIVU5LU19QRVJfQkFUQ0gnLCBNQVhfQ0hVTktTX1BFUl9CQVRDSCwge1xuICAgIGludGVnZXI6IHRydWUsXG4gICAgbWluOiAxLFxuICB9KTtcblxuLyoqXG4gKiBXaXJlIGxpbWl0OiBtYXhpbXVtIGN1bXVsYXRpdmUgYnl0ZXMgaW4gYSBzaW5nbGUgY29hbGVzY2VkIGB3cml0ZU11bHRpYC5cbiAqIENodW5rICpjb3VudCogYWxvbmUgaXMgbm90IGVub3VnaCDigJQgMSwwMDAgc21hbGwgY2h1bmtzIGFyZSB+MTAwS0IgYnV0IDEsMDAwXG4gKiBmaWxlLXNpemVkIGNodW5rcyBjYW4gYmUgaHVuZHJlZHMgb2YgTUIsIHdoaWNoIHBsYXRmb3JtIHJlcXVlc3QtYm9keSBsaW1pdHNcbiAqIHJlamVjdCBsb25nIGJlZm9yZSB0aGUgY291bnQgY2FwIG1hdHRlcnMuIEEgYmF0Y2ggaXMgc3BsaXQgb25jZSBhZGRpbmcgdGhlXG4gKiBuZXh0IGNodW5rIHdvdWxkIGV4Y2VlZCB0aGlzIChhIHNpbmdsZSBjaHVuayBsYXJnZXIgdGhhbiB0aGUgY2FwIHN0aWxsIGdvZXNcbiAqIG91dCBhbG9uZSkuIERlZmF1bHQgMSBNaUIuIE92ZXJyaWRlOiBgV09SS0ZMT1dfU1RSRUFNX01BWF9CWVRFU19QRVJfQkFUQ0hgLlxuICovXG5leHBvcnQgY29uc3QgTUFYX0JZVEVTX1BFUl9CQVRDSCA9IDEwMjQgKiAxMDI0O1xuXG5jb25zdCBnZXRNYXhCeXRlc1BlckJhdGNoID0gKCk6IG51bWJlciA9PlxuICBlbnZOdW1iZXIoJ1dPUktGTE9XX1NUUkVBTV9NQVhfQllURVNfUEVSX0JBVENIJywgTUFYX0JZVEVTX1BFUl9CQVRDSCwge1xuICAgIGludGVnZXI6IHRydWUsXG4gICAgbWluOiAxLFxuICB9KTtcblxuLyoqXG4gKiBQb2xsaW5nIGludGVydmFsIChpbiBtcykgZm9yIGxvY2sgcmVsZWFzZSBkZXRlY3Rpb24uXG4gKlxuICogVGhlIFdlYiBTdHJlYW1zIEFQSSBkb2VzIG5vdCBleHBvc2UgYW4gZXZlbnQgZm9yIFwibG9jayByZWxlYXNlZCBidXQgc3RyZWFtXG4gKiBzdGlsbCBvcGVuXCI7IHdlIGNhbiBvbmx5IGRpc3Rpbmd1aXNoIHRoYXQgc3RhdGUgYnkgcGVyaW9kaWNhbGx5IGF0dGVtcHRpbmdcbiAqIHRvIGFjcXVpcmUgYSByZWFkZXIvd3JpdGVyLiBGb3IgdGhhdCByZWFzb24gd2UgdXNlIHBvbGxpbmcgaW5zdGVhZCBvZiBhXG4gKiBmdWxseSBldmVudC1kcml2ZW4gYXBwcm9hY2ggaGVyZS5cbiAqXG4gKiAxMG1zIGlzIGNob3NlbiBzbyB0aGUgcG9sbGluZyB0aWNrIGFsbW9zdCBuZXZlciBzaXRzIG9uIHRoZSBjcml0aWNhbCBwYXRoOlxuICogdGhlIFYyIHN0ZXAtZXhlY3V0b3IncyBgb3BzU2V0dGxlZGAgcmFjZSB3YWl0cyBmb3IgdGhpcyBzdGF0ZSB0byByZXNvbHZlXG4gKiBhZnRlciBlYWNoIHN0ZXAgYm9keSByZXR1cm5zLCBzbyBhIGNvYXJzZXIgaW50ZXJ2YWwgKHRoZSBwcmV2aW91cyAxMDBtcylcbiAqIGFkZHMgdmlzaWJsZSBwZXItc3RlcCBsYXRlbmN5IHRvIHN0cmVhbWluZyB3b3JrZmxvd3MuIFdpdGggYSB1bmlmb3JtbHlcbiAqIGRpc3RyaWJ1dGVkIG9mZnNldCBiZXR3ZWVuIHN0ZXAgcmV0dXJuIGFuZCB0aGUgbmV4dCB0aWNrLCB0aGUgZXhwZWN0ZWRcbiAqIHdhaXQgaXMgaGFsZiB0aGUgaW50ZXJ2YWwg4oCUIHNvIDEwbXMgbWVhbnMgfjVtcyBhdmVyYWdlIHdhaXQgcGVyIHN0ZXBcbiAqIGluc3RlYWQgb2YgfjUwbXMuIFRoZSBwZXItdGljayB3b3JrIGlzIGB3cml0YWJsZS5sb2NrZWRgIHBsdXMgYVxuICogYGdldFdyaXRlcigpYC9gcmVsZWFzZUxvY2soKWAgcHJvYmUsIGJvdGggbWljcm9zZWNvbmQtc2NhbGU7IDEww5cgbW9yZVxuICogdGlja3MgZHVyaW5nIGEgc3RyZWFtJ3MgbGlmZXRpbWUgaXMgbm90IG1lYXN1cmFibGUgaW4gcHJhY3RpY2UuXG4gKi9cbmV4cG9ydCBjb25zdCBMT0NLX1BPTExfSU5URVJWQUxfTVMgPSAxMDtcblxuLyoqIEVmZmVjdGl2ZSBsb2NrLXBvbGwgaW50ZXJ2YWwuIE92ZXJyaWRlOiBgV09SS0ZMT1dfTE9DS19QT0xMX0lOVEVSVkFMX01TYC4gKi9cbmNvbnN0IGdldExvY2tQb2xsSW50ZXJ2YWxNcyA9ICgpOiBudW1iZXIgPT5cbiAgZW52TnVtYmVyKCdXT1JLRkxPV19MT0NLX1BPTExfSU5URVJWQUxfTVMnLCBMT0NLX1BPTExfSU5URVJWQUxfTVMsIHtcbiAgICBpbnRlZ2VyOiB0cnVlLFxuICAgIG1pbjogMSxcbiAgfSk7XG5cbi8qKlxuICogU3RhdGUgdHJhY2tlciBmb3IgZmx1c2hhYmxlIHN0cmVhbSBvcGVyYXRpb25zLlxuICogUmVzb2x2ZXMgd2hlbiBlaXRoZXI6XG4gKiAxLiBTdHJlYW0gY29tcGxldGVzIChjbG9zZS9lcnJvciksIE9SXG4gKiAyLiBMb2NrIGlzIHJlbGVhc2VkIEFORCBhbGwgcGVuZGluZyBvcGVyYXRpb25zIGFyZSBmbHVzaGVkXG4gKlxuICogTm90ZTogYGRvbmVSZXNvbHZlZGAgYW5kIGBzdHJlYW1FbmRlZGAgYXJlIHNlcGFyYXRlOlxuICogLSBgZG9uZVJlc29sdmVkYDogVGhlIGBkb25lYCBwcm9taXNlIGhhcyBiZWVuIHJlc29sdmVkIChzdGVwIGNhbiBjb21wbGV0ZSlcbiAqIC0gYHN0cmVhbUVuZGVkYDogVGhlIHVuZGVybHlpbmcgc3RyZWFtIGhhcyBhY3R1YWxseSBjbG9zZWQvZXJyb3JlZFxuICpcbiAqIE9uY2UgYGRvbmVSZXNvbHZlZGAgaXMgc2V0IHRvIHRydWUsIHRoZSBgZG9uZWAgcHJvbWlzZSB3aWxsIG5vdCByZXNvbHZlXG4gKiBhZ2Fpbi4gUmUtYWNxdWlyaW5nIGxvY2tzIGFmdGVyIHJlbGVhc2UgaXMgbm90IHN1cHBvcnRlZCBhcyBhIHdheSB0b1xuICogdHJpZ2dlciBhZGRpdGlvbmFsIGNvbXBsZXRpb24gc2lnbmFsaW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZsdXNoYWJsZVN0cmVhbVN0YXRlIGV4dGVuZHMgUHJvbWlzZVdpdGhSZXNvbHZlcnM8dm9pZD4ge1xuICAvKiogTnVtYmVyIG9mIHdyaXRlIG9wZXJhdGlvbnMgY3VycmVudGx5IGluIGZsaWdodCB0byB0aGUgc2VydmVyICovXG4gIHBlbmRpbmdPcHM6IG51bWJlcjtcbiAgLyoqIFdoZXRoZXIgdGhlIGBkb25lYCBwcm9taXNlIGhhcyBiZWVuIHJlc29sdmVkICovXG4gIGRvbmVSZXNvbHZlZDogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgdGhlIHVuZGVybHlpbmcgc3RyZWFtIGhhcyBhY3R1YWxseSBjbG9zZWQvZXJyb3JlZCAqL1xuICBzdHJlYW1FbmRlZDogYm9vbGVhbjtcbiAgLyoqIEludGVydmFsIElEIGZvciB3cml0YWJsZSBsb2NrIHBvbGxpbmcgKGlmIGFjdGl2ZSkgKi9cbiAgd3JpdGFibGVQb2xsaW5nSW50ZXJ2YWw/OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD47XG4gIC8qKiBJbnRlcnZhbCBJRCBmb3IgcmVhZGFibGUgbG9jayBwb2xsaW5nIChpZiBhY3RpdmUpICovXG4gIHJlYWRhYmxlUG9sbGluZ0ludGVydmFsPzogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRmx1c2hhYmxlU3RhdGUoKTogRmx1c2hhYmxlU3RyZWFtU3RhdGUge1xuICBjb25zdCBzdGF0ZTogRmx1c2hhYmxlU3RyZWFtU3RhdGUgPSB7XG4gICAgLi4ud2l0aFJlc29sdmVyczx2b2lkPigpLFxuICAgIHBlbmRpbmdPcHM6IDAsXG4gICAgZG9uZVJlc29sdmVkOiBmYWxzZSxcbiAgICBzdHJlYW1FbmRlZDogZmFsc2UsXG4gIH07XG5cbiAgLy8gVGhlIHJ1bnRpbWUgYXdhaXRzIHRoaXMgcHJvbWlzZSBhZnRlciB1c2VyIGNvZGUgcmV0dXJucy4gT2JzZXJ2ZSBlYXJseVxuICAvLyBzdHJlYW0gZmFpbHVyZXMgbm93IHNvIHRoZXkgZG8gbm90IGJlY29tZSB1bmhhbmRsZWQgcmVqZWN0aW9ucyBmaXJzdC5cbiAgc3RhdGUucHJvbWlzZS5jYXRjaCgoKSA9PiB7fSk7XG5cbiAgcmV0dXJuIHN0YXRlO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIFdyaXRhYmxlU3RyZWFtIGlzIHVubG9ja2VkICh1c2VyIHJlbGVhc2VkIGxvY2spIHZzIGNsb3NlZC5cbiAqIFdoZW4gYSBzdHJlYW0gaXMgY2xvc2VkLCAubG9ja2VkIGlzIGZhbHNlIGJ1dCBnZXRXcml0ZXIoKSB0aHJvd3MuXG4gKiBXZSBvbmx5IHdhbnQgdG8gcmVzb2x2ZSB2aWEgcG9sbGluZyB3aGVuIHRoZSBzdHJlYW0gaXMgdW5sb2NrZWQsIG5vdCBjbG9zZWQuXG4gKiBJZiBjbG9zZWQsIHRoZSBwdW1wIHdpbGwgaGFuZGxlIHJlc29sdXRpb24gdmlhIHRoZSBzdHJlYW0gZW5kaW5nIG5hdHVyYWxseS5cbiAqL1xuZnVuY3Rpb24gaXNXcml0YWJsZVVubG9ja2VkTm90Q2xvc2VkKHdyaXRhYmxlOiBXcml0YWJsZVN0cmVhbSk6IGJvb2xlYW4ge1xuICBpZiAod3JpdGFibGUubG9ja2VkKSByZXR1cm4gZmFsc2U7XG5cbiAgbGV0IHdyaXRlcjogV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyIHwgdW5kZWZpbmVkO1xuICB0cnkge1xuICAgIC8vIFRyeSB0byBhY3F1aXJlIHdyaXRlciAtIGlmIHN1Y2Nlc3NmdWwsIHN0cmVhbSBpcyB1bmxvY2tlZCAobm90IGNsb3NlZClcbiAgICB3cml0ZXIgPSB3cml0YWJsZS5nZXRXcml0ZXIoKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gZ2V0V3JpdGVyKCkgdGhyb3dzIGlmIHN0cmVhbSBpcyBjbG9zZWQvZXJyb3JlZCAtIGxldCBwdW1wIGhhbmRsZSBpdFxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgd3JpdGVyLnJlbGVhc2VMb2NrKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIElmIHJlbGVhc2VMb2NrKCkgdGhyb3dzIGZvciBhbnkgcmVhc29uLCBjb25zZXJ2YXRpdmVseSB0cmVhdCB0aGVcbiAgICAvLyBzdHJlYW0gYXMgY2xvc2VkL2Vycm9yZWQgc28gY2FsbGVycyBkb24ndCBhc3N1bWUgaXQncyBzYWZlIHRvIHVzZS5cbiAgICAvLyBUaGUgcHVtcCB3aWxsIG9ic2VydmUgdGhlIGZhaWx1cmUgdmlhIHRoZSBzdHJlYW0ncyBlbmQgc3RhdGUuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgUmVhZGFibGVTdHJlYW0gaXMgdW5sb2NrZWQgKHVzZXIgcmVsZWFzZWQgbG9jaykgdnMgY2xvc2VkLlxuICovXG5mdW5jdGlvbiBpc1JlYWRhYmxlVW5sb2NrZWROb3RDbG9zZWQocmVhZGFibGU6IFJlYWRhYmxlU3RyZWFtKTogYm9vbGVhbiB7XG4gIGlmIChyZWFkYWJsZS5sb2NrZWQpIHJldHVybiBmYWxzZTtcblxuICBsZXQgcmVhZGVyOiBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIgfCB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgLy8gVHJ5IHRvIGFjcXVpcmUgcmVhZGVyIC0gaWYgc3VjY2Vzc2Z1bCwgc3RyZWFtIGlzIHVubG9ja2VkIChub3QgY2xvc2VkKVxuICAgIHJlYWRlciA9IHJlYWRhYmxlLmdldFJlYWRlcigpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBnZXRSZWFkZXIoKSB0aHJvd3MgaWYgc3RyZWFtIGlzIGNsb3NlZC9lcnJvcmVkIC0gbGV0IHB1bXAgaGFuZGxlIGl0XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdHJ5IHtcbiAgICByZWFkZXIucmVsZWFzZUxvY2soKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gSWYgcmVsZWFzZUxvY2soKSB0aHJvd3MgZm9yIGFueSByZWFzb24sIGNvbnNlcnZhdGl2ZWx5IHRyZWF0IHRoZVxuICAgIC8vIHN0cmVhbSBhcyBjbG9zZWQvZXJyb3JlZCBzbyBjYWxsZXJzIGRvbid0IGFzc3VtZSBpdCdzIHNhZmUgdG8gdXNlLlxuICAgIC8vIFRoZSBwdW1wIHdpbGwgb2JzZXJ2ZSB0aGUgZmFpbHVyZSB2aWEgdGhlIHN0cmVhbSdzIGVuZCBzdGF0ZS5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBQb2xscyBhIFdyaXRhYmxlU3RyZWFtIHRvIGNoZWNrIGlmIHRoZSB1c2VyIGhhcyByZWxlYXNlZCB0aGVpciBsb2NrLlxuICogUmVzb2x2ZXMgdGhlIGRvbmUgcHJvbWlzZSB3aGVuIGxvY2sgaXMgcmVsZWFzZWQgYW5kIG5vIHBlbmRpbmcgb3BzIHJlbWFpbi5cbiAqXG4gKiBOb3RlOiBPbmx5IHJlc29sdmVzIGlmIHN0cmVhbSBpcyB1bmxvY2tlZCBidXQgTk9UIGNsb3NlZC4gSWYgdGhlIHVzZXIgY2xvc2VzXG4gKiB0aGUgc3RyZWFtLCB0aGUgcHVtcCB3aWxsIGhhbmRsZSByZXNvbHV0aW9uIHZpYSB0aGUgc3RyZWFtIGVuZGluZyBuYXR1cmFsbHkuXG4gKlxuICogUHJvdGVjdGlvbjogSWYgcG9sbGluZyBpcyBhbHJlYWR5IGFjdGl2ZSBvbiB0aGlzIHN0YXRlLCB0aGUgZXhpc3RpbmcgaW50ZXJ2YWxcbiAqIGlzIHVzZWQgdG8gYXZvaWQgY3JlYXRpbmcgbXVsdGlwbGUgc2ltdWx0YW5lb3VzIHBvbGxpbmcgb3BlcmF0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBvbGxXcml0YWJsZUxvY2soXG4gIHdyaXRhYmxlOiBXcml0YWJsZVN0cmVhbSxcbiAgc3RhdGU6IEZsdXNoYWJsZVN0cmVhbVN0YXRlXG4pOiB2b2lkIHtcbiAgLy8gUHJldmVudCBtdWx0aXBsZSBzaW11bHRhbmVvdXMgcG9sbGluZyBvbiB0aGUgc2FtZSBzdGF0ZVxuICBpZiAoc3RhdGUud3JpdGFibGVQb2xsaW5nSW50ZXJ2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGludGVydmFsSWQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgLy8gU3RvcCBwb2xsaW5nIGlmIGFscmVhZHkgcmVzb2x2ZWQgb3Igc3RyZWFtIGVuZGVkXG4gICAgaWYgKHN0YXRlLmRvbmVSZXNvbHZlZCB8fCBzdGF0ZS5zdHJlYW1FbmRlZCkge1xuICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKTtcbiAgICAgIHN0YXRlLndyaXRhYmxlUG9sbGluZ0ludGVydmFsID0gdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGxvY2sgaXMgcmVsZWFzZWQgKG5vdCBjbG9zZWQpIGFuZCBubyBwZW5kaW5nIG9wc1xuICAgIGlmIChpc1dyaXRhYmxlVW5sb2NrZWROb3RDbG9zZWQod3JpdGFibGUpICYmIHN0YXRlLnBlbmRpbmdPcHMgPT09IDApIHtcbiAgICAgIHN0YXRlLmRvbmVSZXNvbHZlZCA9IHRydWU7XG4gICAgICBzdGF0ZS5yZXNvbHZlKCk7XG4gICAgICBjbGVhckludGVydmFsKGludGVydmFsSWQpO1xuICAgICAgc3RhdGUud3JpdGFibGVQb2xsaW5nSW50ZXJ2YWwgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9LCBnZXRMb2NrUG9sbEludGVydmFsTXMoKSk7XG5cbiAgc3RhdGUud3JpdGFibGVQb2xsaW5nSW50ZXJ2YWwgPSBpbnRlcnZhbElkO1xufVxuXG4vKipcbiAqIFBvbGxzIGEgUmVhZGFibGVTdHJlYW0gdG8gY2hlY2sgaWYgdGhlIHVzZXIgaGFzIHJlbGVhc2VkIHRoZWlyIGxvY2suXG4gKiBSZXNvbHZlcyB0aGUgZG9uZSBwcm9taXNlIHdoZW4gbG9jayBpcyByZWxlYXNlZCBhbmQgbm8gcGVuZGluZyBvcHMgcmVtYWluLlxuICpcbiAqIE5vdGU6IE9ubHkgcmVzb2x2ZXMgaWYgc3RyZWFtIGlzIHVubG9ja2VkIGJ1dCBOT1QgY2xvc2VkLiBJZiB0aGUgdXNlciBjbG9zZXNcbiAqIHRoZSBzdHJlYW0sIHRoZSBwdW1wIHdpbGwgaGFuZGxlIHJlc29sdXRpb24gdmlhIHRoZSBzdHJlYW0gZW5kaW5nIG5hdHVyYWxseS5cbiAqXG4gKiBQcm90ZWN0aW9uOiBJZiBwb2xsaW5nIGlzIGFscmVhZHkgYWN0aXZlIG9uIHRoaXMgc3RhdGUsIHRoZSBleGlzdGluZyBpbnRlcnZhbFxuICogaXMgdXNlZCB0byBhdm9pZCBjcmVhdGluZyBtdWx0aXBsZSBzaW11bHRhbmVvdXMgcG9sbGluZyBvcGVyYXRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcG9sbFJlYWRhYmxlTG9jayhcbiAgcmVhZGFibGU6IFJlYWRhYmxlU3RyZWFtLFxuICBzdGF0ZTogRmx1c2hhYmxlU3RyZWFtU3RhdGVcbik6IHZvaWQge1xuICAvLyBQcmV2ZW50IG11bHRpcGxlIHNpbXVsdGFuZW91cyBwb2xsaW5nIG9uIHRoZSBzYW1lIHN0YXRlXG4gIGlmIChzdGF0ZS5yZWFkYWJsZVBvbGxpbmdJbnRlcnZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgaW50ZXJ2YWxJZCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAvLyBTdG9wIHBvbGxpbmcgaWYgYWxyZWFkeSByZXNvbHZlZCBvciBzdHJlYW0gZW5kZWRcbiAgICBpZiAoc3RhdGUuZG9uZVJlc29sdmVkIHx8IHN0YXRlLnN0cmVhbUVuZGVkKSB7XG4gICAgICBjbGVhckludGVydmFsKGludGVydmFsSWQpO1xuICAgICAgc3RhdGUucmVhZGFibGVQb2xsaW5nSW50ZXJ2YWwgPSB1bmRlZmluZWQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgbG9jayBpcyByZWxlYXNlZCAobm90IGNsb3NlZCkgYW5kIG5vIHBlbmRpbmcgb3BzXG4gICAgaWYgKGlzUmVhZGFibGVVbmxvY2tlZE5vdENsb3NlZChyZWFkYWJsZSkgJiYgc3RhdGUucGVuZGluZ09wcyA9PT0gMCkge1xuICAgICAgc3RhdGUuZG9uZVJlc29sdmVkID0gdHJ1ZTtcbiAgICAgIHN0YXRlLnJlc29sdmUoKTtcbiAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJZCk7XG4gICAgICBzdGF0ZS5yZWFkYWJsZVBvbGxpbmdJbnRlcnZhbCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH0sIGdldExvY2tQb2xsSW50ZXJ2YWxNcygpKTtcblxuICBzdGF0ZS5yZWFkYWJsZVBvbGxpbmdJbnRlcnZhbCA9IGludGVydmFsSWQ7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZsdXNoYWJsZSBwaXBlIGZyb20gYSBSZWFkYWJsZVN0cmVhbSB0byBhIFdyaXRhYmxlU3RyZWFtLlxuICogVW5saWtlIHBpcGVUbygpLCB0aGlzIHJlc29sdmVzIHdoZW46XG4gKiAxLiBUaGUgc291cmNlIHN0cmVhbSBjb21wbGV0ZXMgKGNsb3NlL2Vycm9yKSwgT1JcbiAqIDIuIFRoZSB1c2VyIHJlbGVhc2VzIHRoZWlyIGxvY2sgb24gdXNlclN0cmVhbSBBTkQgYWxsIHBlbmRpbmcgd3JpdGVzIGFyZSBmbHVzaGVkXG4gKlxuICogQHBhcmFtIHNvdXJjZSAtIFRoZSByZWFkYWJsZSBzdHJlYW0gdG8gcmVhZCBmcm9tIChlLmcuLCB0cmFuc2Zvcm0ncyByZWFkYWJsZSlcbiAqIEBwYXJhbSBzaW5rIC0gVGhlIHdyaXRhYmxlIHN0cmVhbSB0byB3cml0ZSB0byAoZS5nLiwgc2VydmVyIHdyaXRhYmxlKVxuICogQHBhcmFtIHN0YXRlIC0gVGhlIGZsdXNoYWJsZSBzdGF0ZSB0cmFja2VyXG4gKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBzdHJlYW0gZW5kcyAobm90IHdoZW4gZG9uZSBwcm9taXNlIHJlc29sdmVzKVxuICovXG5leHBvcnQgZnVuY3Rpb24gZmx1c2hhYmxlUGlwZShcbiAgc291cmNlOiBSZWFkYWJsZVN0cmVhbSxcbiAgc2luazogV3JpdGFibGVTdHJlYW0sXG4gIHN0YXRlOiBGbHVzaGFibGVTdHJlYW1TdGF0ZVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIFdoZW4gdGhlIHNpbmsgY2FuIGFjY2VwdCBhIGJhdGNoIG9mIGNodW5rcyBpbiBvbmUgZHVyYWJsZSB3cml0ZSAoc2VydmVyXG4gIC8vIHdyaXRhYmxlcyBkbyksIGNvYWxlc2NlIGNodW5rcyB0aGF0IGFycml2ZSB3aGlsZSBhIHByZXZpb3VzIGJhdGNoIGlzIHN0aWxsXG4gIC8vIGluIGZsaWdodCBpbnRvIGEgc2luZ2xlIHNlcnZlciB3cml0ZS4gV2l0aG91dCB0aGlzLCB0aGUgV0hBVFdHXG4gIC8vIGBXcml0YWJsZVN0cmVhbWAgY29udHJhY3Qgc2VyaWFsaXplcyB0aGUgc2luayBvbmUgY2h1bmsgcGVyIHdyaXRlKCkgYW5kIHRoZVxuICAvLyBwZXItY2h1bmsgYGF3YWl0IHdyaXRlci53cml0ZSgpYCBpbiB0aGUgZmFsbGJhY2sgbWVhbnMgdGhlIHNpbmsncyBidWZmZXJcbiAgLy8gbmV2ZXIgaG9sZHMgbW9yZSB0aGFuIG9uZSBjaHVuayDigJQgc28gaXRzIGB3cml0ZU11bHRpYCBiYXRjaGluZyBwYXRoIG5ldmVyXG4gIC8vIGVuZ2FnZXMgYW5kIGV2ZXJ5IGNodW5rIGJlY29tZXMgaXRzIG93biBzZXJ2ZXIgcm91bmQgdHJpcC5cbiAgY29uc3QgYmF0Y2hXcml0ZSA9IChzaW5rIGFzIHsgW1NUUkVBTV9XUklURV9CQVRDSF9TWU1CT0xdPzogQmF0Y2hXcml0ZSB9KVtcbiAgICBTVFJFQU1fV1JJVEVfQkFUQ0hfU1lNQk9MXG4gIF07XG4gIHJldHVybiB0eXBlb2YgYmF0Y2hXcml0ZSA9PT0gJ2Z1bmN0aW9uJ1xuICAgID8gZmx1c2hhYmxlUGlwZUNvYWxlc2Npbmcoc291cmNlLCBzaW5rLCBzdGF0ZSwgYmF0Y2hXcml0ZSlcbiAgICA6IGZsdXNoYWJsZVBpcGVQZXJDaHVuayhzb3VyY2UsIHNpbmssIHN0YXRlKTtcbn1cblxuLyoqXG4gKiBQZXItY2h1bmsgdmFyaWFudCBvZiB7QGxpbmsgZmx1c2hhYmxlUGlwZX06IGF3YWl0cyBlYWNoIGB3cml0ZXIud3JpdGUoKWBcbiAqIGJlZm9yZSByZWFkaW5nIHRoZSBuZXh0IGNodW5rLiBVc2VkIGZvciBzaW5rcyB3aXRob3V0IGEgZHVyYWJsZSBiYXRjaCB3cml0ZVxuICogKHBsYWluIGBXcml0YWJsZVN0cmVhbWBzLCBgVHJhbnNmb3JtU3RyZWFtYCB3cml0YWJsZXMgb24gdGhlIHJlYWQgcGF0aCkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZsdXNoYWJsZVBpcGVQZXJDaHVuayhcbiAgc291cmNlOiBSZWFkYWJsZVN0cmVhbSxcbiAgc2luazogV3JpdGFibGVTdHJlYW0sXG4gIHN0YXRlOiBGbHVzaGFibGVTdHJlYW1TdGF0ZVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlYWRlciA9IHNvdXJjZS5nZXRSZWFkZXIoKTtcbiAgY29uc3Qgd3JpdGVyID0gc2luay5nZXRXcml0ZXIoKTtcbiAgbGV0IGNhbmNlbFJlYXNvbjogdW5rbm93bjtcblxuICB0cnkge1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAvLyBDaGVjayBpZiBzdHJlYW0gaGFzIGVuZGVkXG4gICAgICBpZiAoc3RhdGUuc3RyZWFtRW5kZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBSZWFkIGZyb20gc291cmNlIC0gZG9uJ3QgY291bnQgYXMgcGVuZGluZyBvcCBzaW5jZSB3ZSdyZSBqdXN0IHdhaXRpbmcgZm9yIGRhdGFcbiAgICAgIC8vIFRoZSBpbXBvcnRhbnQgb3BzIGFyZSB3cml0ZXMgdG8gdGhlIHNpbmsgKHNlcnZlcilcbiAgICAgIGNvbnN0IHJlYWRSZXN1bHQgPSBhd2FpdCBQcm9taXNlLnJhY2UoW1xuICAgICAgICByZWFkZXIucmVhZCgpLFxuICAgICAgICB3cml0ZXIuY2xvc2VkLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcignV3JpdGFibGUgc3RyZWFtIGNsb3NlZCBwcmVtYXR1cmVseScpO1xuICAgICAgICB9KSxcbiAgICAgIF0pO1xuXG4gICAgICAvLyBDaGVjayBpZiBzdHJlYW0gaGFzIGVuZGVkIChlLmcuLCBkdWUgdG8gZXJyb3IgaW4gYW5vdGhlciBwYXRoKSBiZWZvcmUgcHJvY2Vzc2luZ1xuICAgICAgaWYgKHN0YXRlLnN0cmVhbUVuZGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlYWRSZXN1bHQuZG9uZSkge1xuICAgICAgICAvLyBTb3VyY2Ugc3RyZWFtIGNvbXBsZXRlZCAtIGNsb3NlIHNpbmsgYW5kIHJlc29sdmVcbiAgICAgICAgc3RhdGUuc3RyZWFtRW5kZWQgPSB0cnVlO1xuICAgICAgICBhd2FpdCB3cml0ZXIuY2xvc2UoKTtcbiAgICAgICAgLy8gUmVzb2x2ZSBkb25lIHByb21pc2UgaWYgbm90IGFscmVhZHkgcmVzb2x2ZWRcbiAgICAgICAgaWYgKCFzdGF0ZS5kb25lUmVzb2x2ZWQpIHtcbiAgICAgICAgICBzdGF0ZS5kb25lUmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgICAgIHN0YXRlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIENvdW50IHdyaXRlIGFzIGEgcGVuZGluZyBvcCAtIHRoaXMgaXMgd2hhdCB3ZSBuZWVkIHRvIGZsdXNoXG4gICAgICBzdGF0ZS5wZW5kaW5nT3BzKys7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB3cml0ZXIud3JpdGUocmVhZFJlc3VsdC52YWx1ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzdGF0ZS5wZW5kaW5nT3BzLS07XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBzdGF0ZS5zdHJlYW1FbmRlZCA9IHRydWU7XG4gICAgY2FuY2VsUmVhc29uID0gZXJyO1xuICAgIGlmICghc3RhdGUuZG9uZVJlc29sdmVkKSB7XG4gICAgICBzdGF0ZS5kb25lUmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgc3RhdGUucmVqZWN0KGVycik7XG4gICAgfVxuICAgIC8vIFByb3BhZ2F0ZSBlcnJvciB0aHJvdWdoIGZsdXNoYWJsZVBpcGUncyBvd24gcHJvbWlzZSBhcyB3ZWxsLlxuICAgIC8vIENhbGxlcnMgdGhhdCByZWx5IG9uIHRoZSBGbHVzaGFibGVTdHJlYW1TdGF0ZSBzaG91bGQgdXNlIGBzdGF0ZS5wcm9taXNlYCxcbiAgICAvLyB3aGlsZSBvdGhlciBjYWxsZXJzIG1heSBkZXBlbmQgb24gdGhpcyByZWplY3Rpb24uIFNvbWUga25vd24gY2FsbGVyc1xuICAgIC8vIGV4cGxpY2l0bHkgaWdub3JlIHRoaXMgcmVqZWN0aW9uIChgLmNhdGNoKCgpID0+IHt9KWApIGFuZCByZWx5IHNvbGVseVxuICAgIC8vIG9uIGBzdGF0ZS5yZWplY3QoZXJyKWAgZm9yIGVycm9yIGhhbmRsaW5nLlxuICAgIHRocm93IGVycjtcbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBDYW5jZWwgdGhlIHVwc3RyZWFtIHJlYWRlciBzbyB0aGUgc291cmNlIGtub3dzIHRvIHN0b3AgZ2VuZXJhdGluZyBkYXRhLlxuICAgIC8vIFVzZXMgY2FuY2VsUmVhc29uIChzZXQgaW4gdGhlIGNhdGNoIGJsb2NrKSBzbyB0aGUgc291cmNlIHJlY2VpdmVzIGNvbnRleHRcbiAgICAvLyBhYm91dCB3aHkgaXQgd2FzIGNhbmNlbGxlZC4gT24gbm9ybWFsIGNvbXBsZXRpb24gY2FuY2VsUmVhc29uIGlzIHVuZGVmaW5lZCxcbiAgICAvLyB3aGljaCBpcyBhIGhhcm1sZXNzIG5vLW9wIG9uIGFuIGFscmVhZHktZG9uZSByZWFkZXIuXG4gICAgcmVhZGVyLmNhbmNlbChjYW5jZWxSZWFzb24pLmNhdGNoKCgpID0+IHt9KTtcbiAgICByZWFkZXIucmVsZWFzZUxvY2soKTtcbiAgICB3cml0ZXIucmVsZWFzZUxvY2soKTtcbiAgfVxufVxuXG4vKipcbiAqIFNoYXJlZCwgbXV0YWJsZSBjb29yZGluYXRpb24gc3RhdGUgYmV0d2VlbiB0aGUgY29hbGVzY2luZyBwaXBlJ3MgcHJvZHVjZXJcbiAqIChyZWFkcyBmcm9tIHNvdXJjZSBpbnRvIGBxdWV1ZWApIGFuZCBjb25zdW1lciAoZHJhaW5zIGBxdWV1ZWAgaW4gYmF0Y2hlcykuXG4gKi9cbmludGVyZmFjZSBDb2FsZXNjZUNvbnRleHQge1xuICBzdGF0ZTogRmx1c2hhYmxlU3RyZWFtU3RhdGU7XG4gIGJhdGNoV3JpdGU6IEJhdGNoV3JpdGU7XG4gIC8qKiBDaHVua3MgcmVhZCBidXQgbm90IHlldCBoYW5kZWQgdG8gYSBiYXRjaCB3cml0ZS4gKi9cbiAgcXVldWU6IFVpbnQ4QXJyYXlbXTtcbiAgLyoqIFNldCBvbmNlIHRoZSBzb3VyY2UgaGFzIHJlcG9ydGVkIGBkb25lYC4gKi9cbiAgc291cmNlRG9uZTogYm9vbGVhbjtcbiAgLyoqIFJlc29sdmVyIHRoYXQgd2FrZXMgdGhlIGNvbnN1bWVyIHdoZW4gdGhlIHF1ZXVlIGdyb3dzIG9yIHRoZSBzb3VyY2UgZW5kcy4gKi9cbiAgd2FrZUNvbnN1bWVyOiAoKCkgPT4gdm9pZCkgfCBudWxsO1xuICAvKiogUmVzb2x2ZXIgdGhhdCB3YWtlcyB0aGUgcHJvZHVjZXIgd2hlbiB0aGUgY29uc3VtZXIgcmVsaWV2ZXMgYmFja3ByZXNzdXJlLiAqL1xuICB3YWtlUHJvZHVjZXI6ICgoKSA9PiB2b2lkKSB8IG51bGw7XG4gIC8qKiBXaXJlIGxpbWl0OiBtYXggY2h1bmtzIHBlciBjb2FsZXNjZWQgYHdyaXRlTXVsdGlgLiAqL1xuICBtYXhDaHVua3NQZXJCYXRjaDogbnVtYmVyO1xuICAvKiogV2lyZSBsaW1pdDogbWF4IGN1bXVsYXRpdmUgYnl0ZXMgcGVyIGNvYWxlc2NlZCBgd3JpdGVNdWx0aWAuICovXG4gIG1heEJ5dGVzUGVyQmF0Y2g6IG51bWJlcjtcbn1cblxuZnVuY3Rpb24gd2FrZShjdHg6IENvYWxlc2NlQ29udGV4dCwgd2hpY2g6ICd3YWtlQ29uc3VtZXInIHwgJ3dha2VQcm9kdWNlcicpIHtcbiAgY29uc3QgcmVzb2x2ZSA9IGN0eFt3aGljaF07XG4gIGlmIChyZXNvbHZlKSB7XG4gICAgY3R4W3doaWNoXSA9IG51bGw7XG4gICAgcmVzb2x2ZSgpO1xuICB9XG59XG5cbi8qKlxuICogSG93IG1hbnkgbGVhZGluZyBxdWV1ZWQgY2h1bmtzIGZpdCBpbiBvbmUgYHdyaXRlTXVsdGlgIHdpdGhvdXQgY3Jvc3NpbmcgdGhlXG4gKiBjaHVuay1jb3VudCBvciBieXRlIHdpcmUgbGltaXRzLiBBbHdheXMgcmV0dXJucyBhdCBsZWFzdCAxIHNvIGEgc2luZ2xlIGNodW5rXG4gKiBsYXJnZXIgdGhhbiB0aGUgYnl0ZSBjYXAgc3RpbGwgbWFrZXMgcHJvZ3Jlc3MgKGFsb25lKS5cbiAqL1xuZnVuY3Rpb24gbmV4dEJhdGNoU2l6ZShjdHg6IENvYWxlc2NlQ29udGV4dCk6IG51bWJlciB7XG4gIGxldCBjb3VudCA9IDA7XG4gIGxldCBieXRlcyA9IDA7XG4gIGZvciAoY29uc3QgY2h1bmsgb2YgY3R4LnF1ZXVlKSB7XG4gICAgaWYgKGNvdW50ID49IGN0eC5tYXhDaHVua3NQZXJCYXRjaCkgYnJlYWs7XG4gICAgaWYgKGNvdW50ID4gMCAmJiBieXRlcyArIGNodW5rLmJ5dGVMZW5ndGggPiBjdHgubWF4Qnl0ZXNQZXJCYXRjaCkgYnJlYWs7XG4gICAgY291bnQrKztcbiAgICBieXRlcyArPSBjaHVuay5ieXRlTGVuZ3RoO1xuICB9XG4gIHJldHVybiBjb3VudDtcbn1cblxuLyoqXG4gKiBDb25zdW1lciBsb29wOiBkcmFpbnMgdGhlIHF1ZXVlIG9uZSBiYXRjaCBhdCBhIHRpbWUsIGF3YWl0aW5nIGVhY2ggYmF0Y2ggc28gaXRcbiAqIGlzIGR1cmFibGUgb24gdGhlIHNlcnZlciBiZWZvcmUgaXRzIGNodW5rcyBsZWF2ZSBgcGVuZGluZ09wc2AuIEl0IHRha2VzIGFzXG4gKiBtdWNoIG9mIHRoZSBxdWV1ZSBhcyB0aGUgd2lyZSBsaW1pdHMgYWxsb3cgZWFjaCByb3VuZCwgc28gY2h1bmtzIHRoYXQgYXJyaXZlZFxuICogd2hpbGUgdGhlIHByZXZpb3VzIGJhdGNoIHdhcyBpbiBmbGlnaHQgY29hbGVzY2UgaW50byB0aGUgbmV4dCBzZXJ2ZXIgd3JpdGUuXG4gKlxuICogYHBlbmRpbmdPcHNgIGlzIGRlY3JlbWVudGVkIG9ubHkgYWZ0ZXIgYGJhdGNoV3JpdGVgICpzdWNjZWVkcyo6IG9uIGZhaWx1cmUgdGhlXG4gKiBjaHVua3Mgc3RheSByZXRhaW5lZCBpbiB0aGUgc2luaydzIGJ1ZmZlciAoc2VlIGBXb3JrZmxvd1NlcnZlcldyaXRhYmxlU3RyZWFtYClcbiAqIGFuZCBhcmUgdGhlcmVmb3JlIHN0aWxsIFwicmVhZCBidXQgbm90IGR1cmFibGVcIiwgc28gdGhleSBtdXN0IGtlZXAgY291bnRpbmcuXG4gKiBBIHRocm93IHByb3BhZ2F0ZXMgb3V0IG9mIHRoZSBsb29wOyB0aGUgcGlwZSdzIHByb2R1Y2VyIHRoZW4gdGVhcnMgZG93bi5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZHJhaW5CYXRjaGVzKGN0eDogQ29hbGVzY2VDb250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgaWYgKGN0eC5xdWV1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgIGlmIChjdHguc291cmNlRG9uZSkgcmV0dXJuO1xuICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgY3R4Lndha2VDb25zdW1lciA9IHJlc29sdmU7XG4gICAgICB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBjb3VudCA9IG5leHRCYXRjaFNpemUoY3R4KTtcbiAgICBjb25zdCBiYXRjaCA9IGN0eC5xdWV1ZS5zbGljZSgwLCBjb3VudCk7XG4gICAgY3R4LnF1ZXVlID0gY3R4LnF1ZXVlLnNsaWNlKGNvdW50KTtcbiAgICBhd2FpdCBjdHguYmF0Y2hXcml0ZShiYXRjaCk7XG4gICAgY3R4LnN0YXRlLnBlbmRpbmdPcHMgLT0gYmF0Y2gubGVuZ3RoO1xuICAgIC8vIFJlbGlldmUgcHJvZHVjZXIgYmFja3ByZXNzdXJlIG5vdyB0aGF0IHRoaXMgYmF0Y2ggaXMgZHVyYWJsZS5cbiAgICB3YWtlKGN0eCwgJ3dha2VQcm9kdWNlcicpO1xuICB9XG59XG5cbi8qKlxuICogQXdhaXQgdGhlIG5leHQgY2h1bmsgd2hpbGUgYSBiYXRjaCB3cml0ZSBpcyBpbiBmbGlnaHQsIHJhY2luZyB0aHJlZSBvdXRjb21lczpcbiAqIGEgcmVhZCByZXN1bHQsIHRoZSBzaW5rIGNsb3NpbmcgdW5kZXIgdXMsIG9yIGEgc2VydmVyLXdyaXRlIGZhaWx1cmUgZnJvbSB0aGVcbiAqIGNvbnN1bWVyIChzdXJmYWNlZCBwcm9tcHRseSBldmVuIHdoaWxlIGJsb2NrZWQgb24gdGhlIHJlYWQpLiBPbiBub3JtYWxcbiAqIGNvbXBsZXRpb24gdGhlIGNvbnN1bWVyIG9ubHkgc2V0dGxlcyBhZnRlciB0aGUgcHJvZHVjZXIgc2V0cyBgc291cmNlRG9uZWAsIHNvXG4gKiBpdHMgYnJhbmNoIHRocm93cyBvbmx5IG9uIHJlYWwgZmFpbHVyZS5cbiAqL1xuZnVuY3Rpb24gcmVhZE5leHRDaHVuayhcbiAgcmVhZGVyOiBSZWFkYWJsZVN0cmVhbURlZmF1bHRSZWFkZXIsXG4gIHdyaXRlcjogV3JpdGFibGVTdHJlYW1EZWZhdWx0V3JpdGVyLFxuICBjb25zdW1lcjogUHJvbWlzZTx2b2lkPlxuKTogUHJvbWlzZTxBd2FpdGVkPFJldHVyblR5cGU8UmVhZGFibGVTdHJlYW1EZWZhdWx0UmVhZGVyWydyZWFkJ10+Pj4ge1xuICByZXR1cm4gUHJvbWlzZS5yYWNlKFtcbiAgICByZWFkZXIucmVhZCgpLFxuICAgIHdyaXRlci5jbG9zZWQudGhlbigoKSA9PiB7XG4gICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoJ1dyaXRhYmxlIHN0cmVhbSBjbG9zZWQgcHJlbWF0dXJlbHknKTtcbiAgICB9KSxcbiAgICBjb25zdW1lci50aGVuKFxuICAgICAgKCkgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoJ1N0cmVhbSBjb25zdW1lciBlbmRlZCBwcmVtYXR1cmVseScpO1xuICAgICAgfSxcbiAgICAgIChlcnIpID0+IHtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgICksXG4gIF0pO1xufVxuXG4vKipcbiAqIEJhY2twcmVzc3VyZTogb25jZSB0b28gbWFueSBjaHVua3MgYXJlIG91dHN0YW5kaW5nLCBzdG9wIHJlYWRpbmcgdW50aWwgdGhlXG4gKiBjb25zdW1lciBkcmFpbnMgYSBiYXRjaC4gUmFjaW5nIHRoZSBjb25zdW1lciBhdm9pZHMgYSBkZWFkbG9jayBpZiBpdCBlbmRzIG9yXG4gKiBmYWlscyB3aGlsZSB3ZSB3YWl0LlxuICovXG5hc3luYyBmdW5jdGlvbiBhd2FpdEJhY2twcmVzc3VyZVJlbGllZihcbiAgY3R4OiBDb2FsZXNjZUNvbnRleHQsXG4gIGNvbnN1bWVyOiBQcm9taXNlPHZvaWQ+LFxuICBtYXhJbmZsaWdodDogbnVtYmVyXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGN0eC5zdGF0ZS5wZW5kaW5nT3BzIDwgbWF4SW5mbGlnaHQpIHJldHVybjtcbiAgYXdhaXQgUHJvbWlzZS5yYWNlKFtcbiAgICBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgY3R4Lndha2VQcm9kdWNlciA9IHJlc29sdmU7XG4gICAgfSksXG4gICAgY29uc3VtZXIudGhlbihcbiAgICAgICgpID0+IHVuZGVmaW5lZCxcbiAgICAgICgpID0+IHVuZGVmaW5lZFxuICAgICksXG4gIF0pO1xufVxuXG4vKipcbiAqIEJhdGNoaW5nIHZhcmlhbnQgb2Yge0BsaW5rIGZsdXNoYWJsZVBpcGV9IGZvciBzaW5rcyB0aGF0IGV4cG9zZSBhIGR1cmFibGVcbiAqIGJhdGNoIHdyaXRlICh7QGxpbmsgU1RSRUFNX1dSSVRFX0JBVENIX1NZTUJPTH0pLiBBIHByb2R1Y2VyIHJlYWRzIGZyb21cbiAqIGBzb3VyY2VgIGludG8gYSBxdWV1ZTsge0BsaW5rIGRyYWluQmF0Y2hlc30gY29hbGVzY2VzIHF1ZXVlZCBjaHVua3MgaW50byBhc1xuICogZmV3IHNlcnZlciB3cml0ZXMgYXMgcG9zc2libGUg4oCUIHR1cm5pbmcgYSBmYXN0IGJ1cnN0IG9mIGNodW5rcyBpbnRvIGEgaGFuZGZ1bFxuICogb2Ygcm91bmQgdHJpcHMgaW5zdGVhZCBvZiBvbmUgcGVyIGNodW5rLlxuICpcbiAqIER1cmFiaWxpdHkgaXMgcHJlc2VydmVkIGV4YWN0bHkgYXMgaW4gdGhlIHBlci1jaHVuayBwYXRoOiBgc3RhdGUucGVuZGluZ09wc2BcbiAqIGNvdW50cyBjaHVua3MgdGhhdCBoYXZlIGJlZW4gcmVhZCBidXQgbm90IHlldCBkdXJhYmx5IHdyaXR0ZW4sIHNvIHRoZVxuICogbG9jay1yZWxlYXNlIGNvbXBsZXRpb24gKGBwb2xsV3JpdGFibGVMb2NrYCAvIGBwb2xsUmVhZGFibGVMb2NrYCkgbmV2ZXIgZmlyZXNcbiAqIHdoaWxlIGRhdGEgaXMgc3RpbGwgcXVldWVkIG9yIGluIGZsaWdodCwgYW5kIHRoZSBzb3VyY2UtZG9uZSBwYXRoIGF3YWl0cyBldmVyeVxuICogYmF0Y2ggYmVmb3JlIGNsb3NpbmcuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZsdXNoYWJsZVBpcGVDb2FsZXNjaW5nKFxuICBzb3VyY2U6IFJlYWRhYmxlU3RyZWFtLFxuICBzaW5rOiBXcml0YWJsZVN0cmVhbSxcbiAgc3RhdGU6IEZsdXNoYWJsZVN0cmVhbVN0YXRlLFxuICBiYXRjaFdyaXRlOiBCYXRjaFdyaXRlXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVhZGVyID0gc291cmNlLmdldFJlYWRlcigpO1xuICBjb25zdCB3cml0ZXIgPSBzaW5rLmdldFdyaXRlcigpO1xuICBjb25zdCBtYXhJbmZsaWdodCA9IGdldE1heEluZmxpZ2h0Q2h1bmtzKCk7XG4gIGxldCBjYW5jZWxSZWFzb246IHVua25vd247XG5cbiAgY29uc3QgY3R4OiBDb2FsZXNjZUNvbnRleHQgPSB7XG4gICAgc3RhdGUsXG4gICAgYmF0Y2hXcml0ZSxcbiAgICBxdWV1ZTogW10sXG4gICAgc291cmNlRG9uZTogZmFsc2UsXG4gICAgd2FrZUNvbnN1bWVyOiBudWxsLFxuICAgIHdha2VQcm9kdWNlcjogbnVsbCxcbiAgICBtYXhDaHVua3NQZXJCYXRjaDogZ2V0TWF4Q2h1bmtzUGVyQmF0Y2goKSxcbiAgICBtYXhCeXRlc1BlckJhdGNoOiBnZXRNYXhCeXRlc1BlckJhdGNoKCksXG4gIH07XG4gIGNvbnN0IGNvbnN1bWVyID0gZHJhaW5CYXRjaGVzKGN0eCk7XG5cbiAgdHJ5IHtcbiAgICB3aGlsZSAoIXN0YXRlLnN0cmVhbUVuZGVkKSB7XG4gICAgICBjb25zdCByZWFkUmVzdWx0ID0gYXdhaXQgcmVhZE5leHRDaHVuayhyZWFkZXIsIHdyaXRlciwgY29uc3VtZXIpO1xuICAgICAgaWYgKHN0YXRlLnN0cmVhbUVuZGVkKSByZXR1cm47XG5cbiAgICAgIGlmIChyZWFkUmVzdWx0LmRvbmUpIHtcbiAgICAgICAgLy8gU2lnbmFsIGVuZC1vZi1zb3VyY2UgYW5kIHdhaXQgZm9yIGV2ZXJ5IHF1ZXVlZC9pbi1mbGlnaHQgYmF0Y2ggdG9cbiAgICAgICAgLy8gcmVhY2ggdGhlIHNlcnZlciBiZWZvcmUgY2xvc2luZywgc28gbm8gY2h1bmsgaXMgZHJvcHBlZC5cbiAgICAgICAgY3R4LnNvdXJjZURvbmUgPSB0cnVlO1xuICAgICAgICB3YWtlKGN0eCwgJ3dha2VDb25zdW1lcicpO1xuICAgICAgICBhd2FpdCBjb25zdW1lcjtcbiAgICAgICAgc3RhdGUuc3RyZWFtRW5kZWQgPSB0cnVlO1xuICAgICAgICBhd2FpdCB3cml0ZXIuY2xvc2UoKTtcbiAgICAgICAgaWYgKCFzdGF0ZS5kb25lUmVzb2x2ZWQpIHtcbiAgICAgICAgICBzdGF0ZS5kb25lUmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgICAgIHN0YXRlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIENvdW50IHRoZSBjaHVuayBhcyBwZW5kaW5nIHRoZSBtb21lbnQgaXQgaXMgcmVhZCDigJQgaXQgc3RheXMgY291bnRlZFxuICAgICAgLy8gdW50aWwgaXRzIGJhdGNoIGlzIGR1cmFibHkgd3JpdHRlbi5cbiAgICAgIGN0eC5xdWV1ZS5wdXNoKHJlYWRSZXN1bHQudmFsdWUgYXMgVWludDhBcnJheSk7XG4gICAgICBzdGF0ZS5wZW5kaW5nT3BzKys7XG4gICAgICB3YWtlKGN0eCwgJ3dha2VDb25zdW1lcicpO1xuXG4gICAgICBhd2FpdCBhd2FpdEJhY2twcmVzc3VyZVJlbGllZihjdHgsIGNvbnN1bWVyLCBtYXhJbmZsaWdodCk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBzdGF0ZS5zdHJlYW1FbmRlZCA9IHRydWU7XG4gICAgY2FuY2VsUmVhc29uID0gZXJyO1xuICAgIC8vIExldCB0aGUgY29uc3VtZXIgc2V0dGxlIHNvIGl0cyByZWplY3Rpb24gKGlmIGFueSkgaXMgb2JzZXJ2ZWQgaGVyZSByYXRoZXJcbiAgICAvLyB0aGFuIHN1cmZhY2luZyBhcyBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uLlxuICAgIGN0eC5zb3VyY2VEb25lID0gdHJ1ZTtcbiAgICB3YWtlKGN0eCwgJ3dha2VDb25zdW1lcicpO1xuICAgIGF3YWl0IGNvbnN1bWVyLmNhdGNoKCgpID0+IHt9KTtcbiAgICBpZiAoIXN0YXRlLmRvbmVSZXNvbHZlZCkge1xuICAgICAgc3RhdGUuZG9uZVJlc29sdmVkID0gdHJ1ZTtcbiAgICAgIHN0YXRlLnJlamVjdChlcnIpO1xuICAgIH1cbiAgICB0aHJvdyBlcnI7XG4gIH0gZmluYWxseSB7XG4gICAgcmVhZGVyLmNhbmNlbChjYW5jZWxSZWFzb24pLmNhdGNoKCgpID0+IHt9KTtcbiAgICByZWFkZXIucmVsZWFzZUxvY2soKTtcbiAgICB3cml0ZXIucmVsZWFzZUxvY2soKTtcbiAgfVxufVxuIl19
package/dist/global.d.ts CHANGED
@@ -33,6 +33,8 @@ export interface HookInvocationQueueItem {
33
33
  type: 'hook';
34
34
  correlationId: string;
35
35
  token: string;
36
+ /** Earliest time the token can be reused after the run ends. */
37
+ tokenRetentionUntil?: Date;
36
38
  metadata?: Serializable;
37
39
  hasCreatedEvent?: boolean;
38
40
  /** Whether the workflow is awaiting `hook.getConflict()` for this hook */
@@ -1 +1 @@
1
- {"version":3,"file":"global.d.ts","sourceRoot":"","sources":["../src/global.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,YAAY,EAAE,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC3C,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;;;;OAOG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,0EAA0E;IAC1E,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,IAAI,CAAC;IACf,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,4BAA4B;IAC3C,IAAI,EAAE,WAAW,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,uBAAuB,CAAC,EAAE,IAAI,CAAC;CAChC;AAED,MAAM,MAAM,SAAS,GACjB,uBAAuB,GACvB,uBAAuB,GACvB,uBAAuB,GACvB,4BAA4B,CAAC;AAEjC;;;;;GAKG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;gBAEP,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,UAAU;IAuFzE,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,kBAAkB;CAGvD;AAED,wBAAgB,OAAO,IAAI,KAAK,CAI/B"}
1
+ {"version":3,"file":"global.d.ts","sourceRoot":"","sources":["../src/global.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,YAAY,EAAE,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC3C,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;;;;OAOG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,gEAAgE;IAChE,mBAAmB,CAAC,EAAE,IAAI,CAAC;IAC3B,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,0EAA0E;IAC1E,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,IAAI,CAAC;IACf,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,4BAA4B;IAC3C,IAAI,EAAE,WAAW,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,uBAAuB,CAAC,EAAE,IAAI,CAAC;CAChC;AAED,MAAM,MAAM,SAAS,GACjB,uBAAuB,GACvB,uBAAuB,GACvB,uBAAuB,GACvB,4BAA4B,CAAC;AAEjC;;;;;GAKG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;gBAEP,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,UAAU;IAuFzE,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,kBAAkB;CAGvD;AAED,wBAAgB,OAAO,IAAI,KAAK,CAI/B"}
package/dist/global.js CHANGED
@@ -110,4 +110,4 @@ export class WorkflowSuspension extends Error {
110
110
  export function ENOTSUP() {
111
111
  throw new WorkflowRuntimeError('This API is not available inside a workflow function. Workflow functions run in a deterministic VM; move the call to a step function for full Node.js access.');
112
112
  }
113
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2xvYmFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2dsb2JhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFxRTVDOzs7OztHQUtHO0FBQ0gsTUFBTSxPQUFPLGtCQUFtQixTQUFRLEtBQUs7SUFDM0MsS0FBSyxDQUFjO0lBQ25CLFVBQVUsQ0FBb0I7SUFDOUIsU0FBUyxDQUFTO0lBQ2xCLFNBQVMsQ0FBUztJQUNsQixTQUFTLENBQVM7SUFDbEIsY0FBYyxDQUFTO0lBQ3ZCLGlCQUFpQixDQUFTO0lBQzFCLFVBQVUsQ0FBUztJQUVuQixZQUFZLFVBQWtDLEVBQUUsTUFBeUI7UUFDdkUsaURBQWlEO1FBQ2pELE1BQU0sS0FBSyxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUV2QyxzQ0FBc0M7UUFDdEMsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQ2xCLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztRQUNsQixJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7UUFDbEIsSUFBSSxjQUFjLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZCLElBQUksaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO1FBQzFCLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQztRQUNuQixLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3pCLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxNQUFNO2dCQUFFLFNBQVMsRUFBRSxDQUFDO2lCQUNqQyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFFLENBQUM7Z0JBQzlCLElBQUksSUFBSSxDQUFDLFFBQVE7b0JBQUUsaUJBQWlCLEVBQUUsQ0FBQztxQkFDbEMsSUFBSSxJQUFJLENBQUMsY0FBYztvQkFBRSxV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cmtmbG93UnVudGltZUVycm9yIH0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQgeyBwbHVyYWxpemUgfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMnO1xuaW1wb3J0IHR5cGUgeyBBdHRyaWJ1dGVDaGFuZ2UgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHR5cGUgeyBTZXJpYWxpemFibGUgfSBmcm9tICcuL3NjaGVtYXMuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN0ZXBJbnZvY2F0aW9uUXVldWVJdGVtIHtcbiAgdHlwZTogJ3N0ZXAnO1xuICBjb3JyZWxhdGlvbklkOiBzdHJpbmc7XG4gIHN0ZXBOYW1lOiBzdHJpbmc7XG4gIGFyZ3M6IFNlcmlhbGl6YWJsZVtdO1xuICBjbG9zdXJlVmFycz86IFJlY29yZDxzdHJpbmcsIFNlcmlhbGl6YWJsZT47XG4gIHRoaXNWYWw/OiBTZXJpYWxpemFibGU7XG4gIGhhc0NyZWF0ZWRFdmVudD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBJbmxpbmUgc3RlcCBvd25lcnNoaXAsIGRlcml2ZWQgZnJvbSB0aGUgc3RlcCdzIExBVEVTVCBgc3RlcF9zdGFydGVkYFxuICAgKiBkdXJpbmcgcmVwbGF5OiB0aGUgcXVldWUgbWVzc2FnZSBJRCBzdGFtcGVkIGJ5IHRoZSBpbnZvY2F0aW9uIHJ1bm5pbmdcbiAgICogdGhlIHN0ZXAgaW5saW5lLCBvciB1bmRlZmluZWQgd2hlbiB0aGUgbGF0ZXN0IHN0YXJ0IHdhcyB1bnN0YW1wZWQgKGFcbiAgICogcmV0cnkgYXR0ZW1wdCBkcml2ZW4gYnkgYSBxdWV1ZWQgc3RlcCBtZXNzYWdlLCBvciBhbiBvbGRlciBydW50aW1lKS5cbiAgICogTGF0ZXN0IHN0YXJ0IHdpbnMg4oCUIGFuIHVuc3RhbXBlZCBiYXJlIHN0YXJ0IGNsZWFycyBhIHByZXZpb3VzIHN0YW1wOyBhblxuICAgKiBvd25lci1yZWNvdmVyeSByZS1zdGFtcGVkIHN0YXJ0IHJlc3RvcmVzIGl0LlxuICAgKi9cbiAgb3duZXJNZXNzYWdlSWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBgY3JlYXRlZEF0YCAobXMpIG9mIHRoZSBzdGVwJ3MgbGF0ZXN0IG9ic2VydmVkIGBzdGVwX3N0YXJ0ZWRgLiBBbmNob3JzXG4gICAqIHRoZSBvd25lcnNoaXAgbGVhc2U6IGBsZWFzZVJlbWFpbmluZyA9IGxhc3RTdGFydGVkQXQgKyBsZWFzZSDiiJIgbm93YC5cbiAgICovXG4gIGxhc3RTdGFydGVkQXQ/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBXaGV0aGVyIGEgYHN0ZXBfcmV0cnlpbmdgIHdhcyBvYnNlcnZlZCBmb3IgdGhpcyBzdGVwLiBGcm9tIHRoYXQgcG9pbnRcbiAgICogdGhlIHN0ZXAgaXMgcXVldWUtb3duZWQgKHRoZSBkZWxheWVkIHJldHJ5IGhhbmRvZmYgb3IgcmVwbGF5IHJlcXVldWUpLFxuICAgKiBzbyBpbmxpbmUgb3duZXJzaGlwIGlzIHBlcm1hbmVudGx5IGxhcHNlZCBmb3IgdGhpcyBjb3JyZWxhdGlvbiBJRC5cbiAgICovXG4gIHNhd1JldHJ5aW5nPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBIb29rSW52b2NhdGlvblF1ZXVlSXRlbSB7XG4gIHR5cGU6ICdob29rJztcbiAgY29ycmVsYXRpb25JZDogc3RyaW5nO1xuICB0b2tlbjogc3RyaW5nO1xuICBtZXRhZGF0YT86IFNlcmlhbGl6YWJsZTtcbiAgaGFzQ3JlYXRlZEV2ZW50PzogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgdGhlIHdvcmtmbG93IGlzIGF3YWl0aW5nIGBob29rLmdldENvbmZsaWN0KClgIGZvciB0aGlzIGhvb2sgKi9cbiAgaGFzQ29uZmxpY3RBd2FpdGVyPzogYm9vbGVhbjtcbiAgZGlzcG9zZWQ/OiBib29sZWFuO1xuICBpc1dlYmhvb2s/OiBib29sZWFuO1xuICBpc1N5c3RlbT86IGJvb2xlYW47XG4gIGFib3J0UmVxdWVzdGVkPzogYm9vbGVhbjtcbiAgYWJvcnRSZWFzb24/OiB1bmtub3duO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdhaXRJbnZvY2F0aW9uUXVldWVJdGVtIHtcbiAgdHlwZTogJ3dhaXQnO1xuICBjb3JyZWxhdGlvbklkOiBzdHJpbmc7XG4gIHJlc3VtZUF0OiBEYXRlO1xuICBoYXNDcmVhdGVkRXZlbnQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEF0dHJpYnV0ZUludm9jYXRpb25RdWV1ZUl0ZW0ge1xuICB0eXBlOiAnYXR0cmlidXRlJztcbiAgY29ycmVsYXRpb25JZDogc3RyaW5nO1xuICBjaGFuZ2VzOiBBdHRyaWJ1dGVDaGFuZ2VbXTtcbiAgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXM/OiB0cnVlO1xufVxuXG5leHBvcnQgdHlwZSBRdWV1ZUl0ZW0gPVxuICB8IFN0ZXBJbnZvY2F0aW9uUXVldWVJdGVtXG4gIHwgSG9va0ludm9jYXRpb25RdWV1ZUl0ZW1cbiAgfCBXYWl0SW52b2NhdGlvblF1ZXVlSXRlbVxuICB8IEF0dHJpYnV0ZUludm9jYXRpb25RdWV1ZUl0ZW07XG5cbi8qKlxuICogQW4gZXJyb3IgdGhhdCBpcyB0aHJvd24gd2hlbiBvbmUgb3IgbW9yZSBvcGVyYXRpb25zIChzdGVwcy9ob29rcy9ldGMuKSBhcmUgY2FsbGVkIGJ1dCBkb1xuICogbm90IHlldCBoYXZlIGNvcnJlc3BvbmRpbmcgZW50cmllcyBpbiB0aGUgZXZlbnQgbG9nLiBUaGUgd29ya2Zsb3dcbiAqIGRpc3BhdGNoZXIgd2lsbCBjYXRjaCB0aGlzIGVycm9yIGFuZCBwdXNoIHRoZSBvcGVyYXRpb25zXG4gKiBvbnRvIHRoZSBxdWV1ZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFdvcmtmbG93U3VzcGVuc2lvbiBleHRlbmRzIEVycm9yIHtcbiAgc3RlcHM6IFF1ZXVlSXRlbVtdO1xuICBnbG9iYWxUaGlzOiB0eXBlb2YgZ2xvYmFsVGhpcztcbiAgc3RlcENvdW50OiBudW1iZXI7XG4gIGhvb2tDb3VudDogbnVtYmVyO1xuICB3YWl0Q291bnQ6IG51bWJlcjtcbiAgYXR0cmlidXRlQ291bnQ6IG51bWJlcjtcbiAgaG9va0Rpc3Bvc2VkQ291bnQ6IG51bWJlcjtcbiAgYWJvcnRDb3VudDogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKHN0ZXBzSW5wdXQ6IE1hcDxzdHJpbmcsIFF1ZXVlSXRlbT4sIGdsb2JhbDogdHlwZW9mIGdsb2JhbFRoaXMpIHtcbiAgICAvLyBDb252ZXJ0IE1hcCB0byBhcnJheSBmb3IgaXRlcmF0aW9uIGFuZCBzdG9yYWdlXG4gICAgY29uc3Qgc3RlcHMgPSBbLi4uc3RlcHNJbnB1dC52YWx1ZXMoKV07XG5cbiAgICAvLyBTaW5nbGUtcGFzcyBjb3VudGluZyBmb3IgZWZmaWNpZW5jeVxuICAgIGxldCBzdGVwQ291bnQgPSAwO1xuICAgIGxldCBob29rQ291bnQgPSAwO1xuICAgIGxldCB3YWl0Q291bnQgPSAwO1xuICAgIGxldCBhdHRyaWJ1dGVDb3VudCA9IDA7XG4gICAgbGV0IGhvb2tEaXNwb3NlZENvdW50ID0gMDtcbiAgICBsZXQgYWJvcnRDb3VudCA9IDA7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIHN0ZXBzKSB7XG4gICAgICBpZiAoaXRlbS50eXBlID09PSAnc3RlcCcpIHN0ZXBDb3VudCsrO1xuICAgICAgZWxzZSBpZiAoaXRlbS50eXBlID09PSAnaG9vaycpIHtcbiAgICAgICAgaWYgKGl0ZW0uZGlzcG9zZWQpIGhvb2tEaXNwb3NlZENvdW50Kys7XG4gICAgICAgIGVsc2UgaWYgKGl0ZW0uYWJvcnRSZXF1ZXN0ZWQpIGFib3J0Q291bnQrKztcbiAgICAgICAgZWxzZSBob29rQ291bnQrKztcbiAgICAgIH0gZWxzZSBpZiAoaXRlbS50eXBlID09PSAnd2FpdCcpIHdhaXRDb3VudCsrO1xuICAgICAgZWxzZSBpZiAoaXRlbS50eXBlID09PSAnYXR0cmlidXRlJykgYXR0cmlidXRlQ291bnQrKztcbiAgICB9XG5cbiAgICAvLyBCdWlsZCBkZXNjcmlwdGlvbiBwYXJ0c1xuICAgIGNvbnN0IHBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmIChzdGVwQ291bnQgPiAwKSB7XG4gICAgICBwYXJ0cy5wdXNoKGAke3N0ZXBDb3VudH0gJHtwbHVyYWxpemUoJ3N0ZXAnLCAnc3RlcHMnLCBzdGVwQ291bnQpfWApO1xuICAgIH1cbiAgICBpZiAoaG9va0NvdW50ID4gMCkge1xuICAgICAgcGFydHMucHVzaChgJHtob29rQ291bnR9ICR7cGx1cmFsaXplKCdob29rJywgJ2hvb2tzJywgaG9va0NvdW50KX1gKTtcbiAgICB9XG4gICAgaWYgKHdhaXRDb3VudCA+IDApIHtcbiAgICAgIHBhcnRzLnB1c2goYCR7d2FpdENvdW50fSAke3BsdXJhbGl6ZSgnd2FpdCcsICd3YWl0cycsIHdhaXRDb3VudCl9YCk7XG4gICAgfVxuICAgIGlmIChhdHRyaWJ1dGVDb3VudCA+IDApIHtcbiAgICAgIHBhcnRzLnB1c2goXG4gICAgICAgIGAke2F0dHJpYnV0ZUNvdW50fSAke3BsdXJhbGl6ZSgnYXR0cmlidXRlIHdyaXRlJywgJ2F0dHJpYnV0ZSB3cml0ZXMnLCBhdHRyaWJ1dGVDb3VudCl9YFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGhvb2tEaXNwb3NlZENvdW50ID4gMCkge1xuICAgICAgcGFydHMucHVzaChcbiAgICAgICAgYCR7aG9va0Rpc3Bvc2VkQ291bnR9IGhvb2sgJHtwbHVyYWxpemUoJ2Rpc3Bvc2FsJywgJ2Rpc3Bvc2FscycsIGhvb2tEaXNwb3NlZENvdW50KX1gXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIERldGVybWluZSB2ZXJiIChoYXMvaGF2ZSkgYW5kIGFjdGlvbiAocnVuL2NyZWF0ZWQvcmVjZWl2ZWQpXG4gICAgY29uc3QgdG90YWxDb3VudCA9XG4gICAgICBzdGVwQ291bnQgKyBob29rQ291bnQgKyB3YWl0Q291bnQgKyBhdHRyaWJ1dGVDb3VudCArIGhvb2tEaXNwb3NlZENvdW50O1xuICAgIGNvbnN0IGhhc09ySGF2ZSA9IHBsdXJhbGl6ZSgnaGFzJywgJ2hhdmUnLCB0b3RhbENvdW50KTtcbiAgICAvLyBQaWNrIGFjdGlvbiB2ZXJiOiB1c2UgXCJwcm9jZXNzZWRcIiB3aGVuIG1peGVkIHR5cGVzIGFyZSBwcmVzZW50XG4gICAgY29uc3QgdHlwZUNvdW50ID1cbiAgICAgIChzdGVwQ291bnQgPiAwID8gMSA6IDApICtcbiAgICAgIChob29rQ291bnQgPiAwID8gMSA6IDApICtcbiAgICAgICh3YWl0Q291bnQgPiAwID8gMSA6IDApICtcbiAgICAgIChhdHRyaWJ1dGVDb3VudCA+IDAgPyAxIDogMCkgK1xuICAgICAgKGhvb2tEaXNwb3NlZENvdW50ID4gMCA/IDEgOiAwKTtcbiAgICBsZXQgYWN0aW9uOiBzdHJpbmc7XG4gICAgaWYgKHR5cGVDb3VudCA+IDEpIHtcbiAgICAgIGFjdGlvbiA9ICdwcm9jZXNzZWQnO1xuICAgIH0gZWxzZSBpZiAoc3RlcENvdW50ID4gMCkge1xuICAgICAgYWN0aW9uID0gJ3J1bic7XG4gICAgfSBlbHNlIGlmIChob29rQ291bnQgPiAwKSB7XG4gICAgICBhY3Rpb24gPSAnY3JlYXRlZCc7XG4gICAgfSBlbHNlIGlmICh3YWl0Q291bnQgPiAwKSB7XG4gICAgICBhY3Rpb24gPSAnY3JlYXRlZCc7XG4gICAgfSBlbHNlIGlmIChhdHRyaWJ1dGVDb3VudCA+IDApIHtcbiAgICAgIGFjdGlvbiA9ICd3cml0dGVuJztcbiAgICB9IGVsc2UgaWYgKGhvb2tEaXNwb3NlZENvdW50ID4gMCkge1xuICAgICAgYWN0aW9uID0gJ3Byb2Nlc3NlZCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFjdGlvbiA9ICdyZWNlaXZlZCc7XG4gICAgfVxuXG4gICAgY29uc3QgZGVzY3JpcHRpb24gPVxuICAgICAgcGFydHMubGVuZ3RoID4gMFxuICAgICAgICA/IGAke3BhcnRzLmpvaW4oJyBhbmQgJyl9ICR7aGFzT3JIYXZlfSBub3QgYmVlbiAke2FjdGlvbn0geWV0YFxuICAgICAgICA6ICcwIHN0ZXBzIGhhdmUgbm90IGJlZW4gcnVuIHlldCc7IC8vIERlZmF1bHQgY2FzZSBmb3IgZW1wdHkgYXJyYXlcbiAgICBzdXBlcihkZXNjcmlwdGlvbik7XG4gICAgdGhpcy5uYW1lID0gJ1dvcmtmbG93U3VzcGVuc2lvbic7XG4gICAgdGhpcy5zdGVwcyA9IHN0ZXBzO1xuICAgIHRoaXMuZ2xvYmFsVGhpcyA9IGdsb2JhbDtcbiAgICB0aGlzLnN0ZXBDb3VudCA9IHN0ZXBDb3VudDtcbiAgICB0aGlzLmhvb2tDb3VudCA9IGhvb2tDb3VudDtcbiAgICB0aGlzLndhaXRDb3VudCA9IHdhaXRDb3VudDtcbiAgICB0aGlzLmF0dHJpYnV0ZUNvdW50ID0gYXR0cmlidXRlQ291bnQ7XG4gICAgdGhpcy5ob29rRGlzcG9zZWRDb3VudCA9IGhvb2tEaXNwb3NlZENvdW50O1xuICAgIHRoaXMuYWJvcnRDb3VudCA9IGFib3J0Q291bnQ7XG4gIH1cblxuICBzdGF0aWMgaXModmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBXb3JrZmxvd1N1c3BlbnNpb24ge1xuICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFdvcmtmbG93U3VzcGVuc2lvbjtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gRU5PVFNVUCgpOiBuZXZlciB7XG4gIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAnVGhpcyBBUEkgaXMgbm90IGF2YWlsYWJsZSBpbnNpZGUgYSB3b3JrZmxvdyBmdW5jdGlvbi4gV29ya2Zsb3cgZnVuY3Rpb25zIHJ1biBpbiBhIGRldGVybWluaXN0aWMgVk07IG1vdmUgdGhlIGNhbGwgdG8gYSBzdGVwIGZ1bmN0aW9uIGZvciBmdWxsIE5vZGUuanMgYWNjZXNzLidcbiAgKTtcbn1cbiJdfQ==
113
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2xvYmFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2dsb2JhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUF1RTVDOzs7OztHQUtHO0FBQ0gsTUFBTSxPQUFPLGtCQUFtQixTQUFRLEtBQUs7SUFDM0MsS0FBSyxDQUFjO0lBQ25CLFVBQVUsQ0FBb0I7SUFDOUIsU0FBUyxDQUFTO0lBQ2xCLFNBQVMsQ0FBUztJQUNsQixTQUFTLENBQVM7SUFDbEIsY0FBYyxDQUFTO0lBQ3ZCLGlCQUFpQixDQUFTO0lBQzFCLFVBQVUsQ0FBUztJQUVuQixZQUFZLFVBQWtDLEVBQUUsTUFBeUI7UUFDdkUsaURBQWlEO1FBQ2pELE1BQU0sS0FBSyxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUV2QyxzQ0FBc0M7UUFDdEMsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQ2xCLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztRQUNsQixJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7UUFDbEIsSUFBSSxjQUFjLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZCLElBQUksaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO1FBQzFCLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQztRQUNuQixLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3pCLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxNQUFNO2dCQUFFLFNBQVMsRUFBRSxDQUFDO2lCQUNqQyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFFLENBQUM7Z0JBQzlCLElBQUksSUFBSSxDQUFDLFFBQVE7b0JBQUUsaUJBQWlCLEVBQUUsQ0FBQztxQkFDbEMsSUFBSSxJQUFJLENBQUMsY0FBYztvQkFBRSxV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cmtmbG93UnVudGltZUVycm9yIH0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQgeyBwbHVyYWxpemUgfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMnO1xuaW1wb3J0IHR5cGUgeyBBdHRyaWJ1dGVDaGFuZ2UgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHR5cGUgeyBTZXJpYWxpemFibGUgfSBmcm9tICcuL3NjaGVtYXMuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN0ZXBJbnZvY2F0aW9uUXVldWVJdGVtIHtcbiAgdHlwZTogJ3N0ZXAnO1xuICBjb3JyZWxhdGlvbklkOiBzdHJpbmc7XG4gIHN0ZXBOYW1lOiBzdHJpbmc7XG4gIGFyZ3M6IFNlcmlhbGl6YWJsZVtdO1xuICBjbG9zdXJlVmFycz86IFJlY29yZDxzdHJpbmcsIFNlcmlhbGl6YWJsZT47XG4gIHRoaXNWYWw/OiBTZXJpYWxpemFibGU7XG4gIGhhc0NyZWF0ZWRFdmVudD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBJbmxpbmUgc3RlcCBvd25lcnNoaXAsIGRlcml2ZWQgZnJvbSB0aGUgc3RlcCdzIExBVEVTVCBgc3RlcF9zdGFydGVkYFxuICAgKiBkdXJpbmcgcmVwbGF5OiB0aGUgcXVldWUgbWVzc2FnZSBJRCBzdGFtcGVkIGJ5IHRoZSBpbnZvY2F0aW9uIHJ1bm5pbmdcbiAgICogdGhlIHN0ZXAgaW5saW5lLCBvciB1bmRlZmluZWQgd2hlbiB0aGUgbGF0ZXN0IHN0YXJ0IHdhcyB1bnN0YW1wZWQgKGFcbiAgICogcmV0cnkgYXR0ZW1wdCBkcml2ZW4gYnkgYSBxdWV1ZWQgc3RlcCBtZXNzYWdlLCBvciBhbiBvbGRlciBydW50aW1lKS5cbiAgICogTGF0ZXN0IHN0YXJ0IHdpbnMg4oCUIGFuIHVuc3RhbXBlZCBiYXJlIHN0YXJ0IGNsZWFycyBhIHByZXZpb3VzIHN0YW1wOyBhblxuICAgKiBvd25lci1yZWNvdmVyeSByZS1zdGFtcGVkIHN0YXJ0IHJlc3RvcmVzIGl0LlxuICAgKi9cbiAgb3duZXJNZXNzYWdlSWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBgY3JlYXRlZEF0YCAobXMpIG9mIHRoZSBzdGVwJ3MgbGF0ZXN0IG9ic2VydmVkIGBzdGVwX3N0YXJ0ZWRgLiBBbmNob3JzXG4gICAqIHRoZSBvd25lcnNoaXAgbGVhc2U6IGBsZWFzZVJlbWFpbmluZyA9IGxhc3RTdGFydGVkQXQgKyBsZWFzZSDiiJIgbm93YC5cbiAgICovXG4gIGxhc3RTdGFydGVkQXQ/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBXaGV0aGVyIGEgYHN0ZXBfcmV0cnlpbmdgIHdhcyBvYnNlcnZlZCBmb3IgdGhpcyBzdGVwLiBGcm9tIHRoYXQgcG9pbnRcbiAgICogdGhlIHN0ZXAgaXMgcXVldWUtb3duZWQgKHRoZSBkZWxheWVkIHJldHJ5IGhhbmRvZmYgb3IgcmVwbGF5IHJlcXVldWUpLFxuICAgKiBzbyBpbmxpbmUgb3duZXJzaGlwIGlzIHBlcm1hbmVudGx5IGxhcHNlZCBmb3IgdGhpcyBjb3JyZWxhdGlvbiBJRC5cbiAgICovXG4gIHNhd1JldHJ5aW5nPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBIb29rSW52b2NhdGlvblF1ZXVlSXRlbSB7XG4gIHR5cGU6ICdob29rJztcbiAgY29ycmVsYXRpb25JZDogc3RyaW5nO1xuICB0b2tlbjogc3RyaW5nO1xuICAvKiogRWFybGllc3QgdGltZSB0aGUgdG9rZW4gY2FuIGJlIHJldXNlZCBhZnRlciB0aGUgcnVuIGVuZHMuICovXG4gIHRva2VuUmV0ZW50aW9uVW50aWw/OiBEYXRlO1xuICBtZXRhZGF0YT86IFNlcmlhbGl6YWJsZTtcbiAgaGFzQ3JlYXRlZEV2ZW50PzogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgdGhlIHdvcmtmbG93IGlzIGF3YWl0aW5nIGBob29rLmdldENvbmZsaWN0KClgIGZvciB0aGlzIGhvb2sgKi9cbiAgaGFzQ29uZmxpY3RBd2FpdGVyPzogYm9vbGVhbjtcbiAgZGlzcG9zZWQ/OiBib29sZWFuO1xuICBpc1dlYmhvb2s/OiBib29sZWFuO1xuICBpc1N5c3RlbT86IGJvb2xlYW47XG4gIGFib3J0UmVxdWVzdGVkPzogYm9vbGVhbjtcbiAgYWJvcnRSZWFzb24/OiB1bmtub3duO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdhaXRJbnZvY2F0aW9uUXVldWVJdGVtIHtcbiAgdHlwZTogJ3dhaXQnO1xuICBjb3JyZWxhdGlvbklkOiBzdHJpbmc7XG4gIHJlc3VtZUF0OiBEYXRlO1xuICBoYXNDcmVhdGVkRXZlbnQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEF0dHJpYnV0ZUludm9jYXRpb25RdWV1ZUl0ZW0ge1xuICB0eXBlOiAnYXR0cmlidXRlJztcbiAgY29ycmVsYXRpb25JZDogc3RyaW5nO1xuICBjaGFuZ2VzOiBBdHRyaWJ1dGVDaGFuZ2VbXTtcbiAgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXM/OiB0cnVlO1xufVxuXG5leHBvcnQgdHlwZSBRdWV1ZUl0ZW0gPVxuICB8IFN0ZXBJbnZvY2F0aW9uUXVldWVJdGVtXG4gIHwgSG9va0ludm9jYXRpb25RdWV1ZUl0ZW1cbiAgfCBXYWl0SW52b2NhdGlvblF1ZXVlSXRlbVxuICB8IEF0dHJpYnV0ZUludm9jYXRpb25RdWV1ZUl0ZW07XG5cbi8qKlxuICogQW4gZXJyb3IgdGhhdCBpcyB0aHJvd24gd2hlbiBvbmUgb3IgbW9yZSBvcGVyYXRpb25zIChzdGVwcy9ob29rcy9ldGMuKSBhcmUgY2FsbGVkIGJ1dCBkb1xuICogbm90IHlldCBoYXZlIGNvcnJlc3BvbmRpbmcgZW50cmllcyBpbiB0aGUgZXZlbnQgbG9nLiBUaGUgd29ya2Zsb3dcbiAqIGRpc3BhdGNoZXIgd2lsbCBjYXRjaCB0aGlzIGVycm9yIGFuZCBwdXNoIHRoZSBvcGVyYXRpb25zXG4gKiBvbnRvIHRoZSBxdWV1ZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFdvcmtmbG93U3VzcGVuc2lvbiBleHRlbmRzIEVycm9yIHtcbiAgc3RlcHM6IFF1ZXVlSXRlbVtdO1xuICBnbG9iYWxUaGlzOiB0eXBlb2YgZ2xvYmFsVGhpcztcbiAgc3RlcENvdW50OiBudW1iZXI7XG4gIGhvb2tDb3VudDogbnVtYmVyO1xuICB3YWl0Q291bnQ6IG51bWJlcjtcbiAgYXR0cmlidXRlQ291bnQ6IG51bWJlcjtcbiAgaG9va0Rpc3Bvc2VkQ291bnQ6IG51bWJlcjtcbiAgYWJvcnRDb3VudDogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKHN0ZXBzSW5wdXQ6IE1hcDxzdHJpbmcsIFF1ZXVlSXRlbT4sIGdsb2JhbDogdHlwZW9mIGdsb2JhbFRoaXMpIHtcbiAgICAvLyBDb252ZXJ0IE1hcCB0byBhcnJheSBmb3IgaXRlcmF0aW9uIGFuZCBzdG9yYWdlXG4gICAgY29uc3Qgc3RlcHMgPSBbLi4uc3RlcHNJbnB1dC52YWx1ZXMoKV07XG5cbiAgICAvLyBTaW5nbGUtcGFzcyBjb3VudGluZyBmb3IgZWZmaWNpZW5jeVxuICAgIGxldCBzdGVwQ291bnQgPSAwO1xuICAgIGxldCBob29rQ291bnQgPSAwO1xuICAgIGxldCB3YWl0Q291bnQgPSAwO1xuICAgIGxldCBhdHRyaWJ1dGVDb3VudCA9IDA7XG4gICAgbGV0IGhvb2tEaXNwb3NlZENvdW50ID0gMDtcbiAgICBsZXQgYWJvcnRDb3VudCA9IDA7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIHN0ZXBzKSB7XG4gICAgICBpZiAoaXRlbS50eXBlID09PSAnc3RlcCcpIHN0ZXBDb3VudCsrO1xuICAgICAgZWxzZSBpZiAoaXRlbS50eXBlID09PSAnaG9vaycpIHtcbiAgICAgICAgaWYgKGl0ZW0uZGlzcG9zZWQpIGhvb2tEaXNwb3NlZENvdW50Kys7XG4gICAgICAgIGVsc2UgaWYgKGl0ZW0uYWJvcnRSZXF1ZXN0ZWQpIGFib3J0Q291bnQrKztcbiAgICAgICAgZWxzZSBob29rQ291bnQrKztcbiAgICAgIH0gZWxzZSBpZiAoaXRlbS50eXBlID09PSAnd2FpdCcpIHdhaXRDb3VudCsrO1xuICAgICAgZWxzZSBpZiAoaXRlbS50eXBlID09PSAnYXR0cmlidXRlJykgYXR0cmlidXRlQ291bnQrKztcbiAgICB9XG5cbiAgICAvLyBCdWlsZCBkZXNjcmlwdGlvbiBwYXJ0c1xuICAgIGNvbnN0IHBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmIChzdGVwQ291bnQgPiAwKSB7XG4gICAgICBwYXJ0cy5wdXNoKGAke3N0ZXBDb3VudH0gJHtwbHVyYWxpemUoJ3N0ZXAnLCAnc3RlcHMnLCBzdGVwQ291bnQpfWApO1xuICAgIH1cbiAgICBpZiAoaG9va0NvdW50ID4gMCkge1xuICAgICAgcGFydHMucHVzaChgJHtob29rQ291bnR9ICR7cGx1cmFsaXplKCdob29rJywgJ2hvb2tzJywgaG9va0NvdW50KX1gKTtcbiAgICB9XG4gICAgaWYgKHdhaXRDb3VudCA+IDApIHtcbiAgICAgIHBhcnRzLnB1c2goYCR7d2FpdENvdW50fSAke3BsdXJhbGl6ZSgnd2FpdCcsICd3YWl0cycsIHdhaXRDb3VudCl9YCk7XG4gICAgfVxuICAgIGlmIChhdHRyaWJ1dGVDb3VudCA+IDApIHtcbiAgICAgIHBhcnRzLnB1c2goXG4gICAgICAgIGAke2F0dHJpYnV0ZUNvdW50fSAke3BsdXJhbGl6ZSgnYXR0cmlidXRlIHdyaXRlJywgJ2F0dHJpYnV0ZSB3cml0ZXMnLCBhdHRyaWJ1dGVDb3VudCl9YFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGhvb2tEaXNwb3NlZENvdW50ID4gMCkge1xuICAgICAgcGFydHMucHVzaChcbiAgICAgICAgYCR7aG9va0Rpc3Bvc2VkQ291bnR9IGhvb2sgJHtwbHVyYWxpemUoJ2Rpc3Bvc2FsJywgJ2Rpc3Bvc2FscycsIGhvb2tEaXNwb3NlZENvdW50KX1gXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIERldGVybWluZSB2ZXJiIChoYXMvaGF2ZSkgYW5kIGFjdGlvbiAocnVuL2NyZWF0ZWQvcmVjZWl2ZWQpXG4gICAgY29uc3QgdG90YWxDb3VudCA9XG4gICAgICBzdGVwQ291bnQgKyBob29rQ291bnQgKyB3YWl0Q291bnQgKyBhdHRyaWJ1dGVDb3VudCArIGhvb2tEaXNwb3NlZENvdW50O1xuICAgIGNvbnN0IGhhc09ySGF2ZSA9IHBsdXJhbGl6ZSgnaGFzJywgJ2hhdmUnLCB0b3RhbENvdW50KTtcbiAgICAvLyBQaWNrIGFjdGlvbiB2ZXJiOiB1c2UgXCJwcm9jZXNzZWRcIiB3aGVuIG1peGVkIHR5cGVzIGFyZSBwcmVzZW50XG4gICAgY29uc3QgdHlwZUNvdW50ID1cbiAgICAgIChzdGVwQ291bnQgPiAwID8gMSA6IDApICtcbiAgICAgIChob29rQ291bnQgPiAwID8gMSA6IDApICtcbiAgICAgICh3YWl0Q291bnQgPiAwID8gMSA6IDApICtcbiAgICAgIChhdHRyaWJ1dGVDb3VudCA+IDAgPyAxIDogMCkgK1xuICAgICAgKGhvb2tEaXNwb3NlZENvdW50ID4gMCA/IDEgOiAwKTtcbiAgICBsZXQgYWN0aW9uOiBzdHJpbmc7XG4gICAgaWYgKHR5cGVDb3VudCA+IDEpIHtcbiAgICAgIGFjdGlvbiA9ICdwcm9jZXNzZWQnO1xuICAgIH0gZWxzZSBpZiAoc3RlcENvdW50ID4gMCkge1xuICAgICAgYWN0aW9uID0gJ3J1bic7XG4gICAgfSBlbHNlIGlmIChob29rQ291bnQgPiAwKSB7XG4gICAgICBhY3Rpb24gPSAnY3JlYXRlZCc7XG4gICAgfSBlbHNlIGlmICh3YWl0Q291bnQgPiAwKSB7XG4gICAgICBhY3Rpb24gPSAnY3JlYXRlZCc7XG4gICAgfSBlbHNlIGlmIChhdHRyaWJ1dGVDb3VudCA+IDApIHtcbiAgICAgIGFjdGlvbiA9ICd3cml0dGVuJztcbiAgICB9IGVsc2UgaWYgKGhvb2tEaXNwb3NlZENvdW50ID4gMCkge1xuICAgICAgYWN0aW9uID0gJ3Byb2Nlc3NlZCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFjdGlvbiA9ICdyZWNlaXZlZCc7XG4gICAgfVxuXG4gICAgY29uc3QgZGVzY3JpcHRpb24gPVxuICAgICAgcGFydHMubGVuZ3RoID4gMFxuICAgICAgICA/IGAke3BhcnRzLmpvaW4oJyBhbmQgJyl9ICR7aGFzT3JIYXZlfSBub3QgYmVlbiAke2FjdGlvbn0geWV0YFxuICAgICAgICA6ICcwIHN0ZXBzIGhhdmUgbm90IGJlZW4gcnVuIHlldCc7IC8vIERlZmF1bHQgY2FzZSBmb3IgZW1wdHkgYXJyYXlcbiAgICBzdXBlcihkZXNjcmlwdGlvbik7XG4gICAgdGhpcy5uYW1lID0gJ1dvcmtmbG93U3VzcGVuc2lvbic7XG4gICAgdGhpcy5zdGVwcyA9IHN0ZXBzO1xuICAgIHRoaXMuZ2xvYmFsVGhpcyA9IGdsb2JhbDtcbiAgICB0aGlzLnN0ZXBDb3VudCA9IHN0ZXBDb3VudDtcbiAgICB0aGlzLmhvb2tDb3VudCA9IGhvb2tDb3VudDtcbiAgICB0aGlzLndhaXRDb3VudCA9IHdhaXRDb3VudDtcbiAgICB0aGlzLmF0dHJpYnV0ZUNvdW50ID0gYXR0cmlidXRlQ291bnQ7XG4gICAgdGhpcy5ob29rRGlzcG9zZWRDb3VudCA9IGhvb2tEaXNwb3NlZENvdW50O1xuICAgIHRoaXMuYWJvcnRDb3VudCA9IGFib3J0Q291bnQ7XG4gIH1cblxuICBzdGF0aWMgaXModmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBXb3JrZmxvd1N1c3BlbnNpb24ge1xuICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFdvcmtmbG93U3VzcGVuc2lvbjtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gRU5PVFNVUCgpOiBuZXZlciB7XG4gIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAnVGhpcyBBUEkgaXMgbm90IGF2YWlsYWJsZSBpbnNpZGUgYSB3b3JrZmxvdyBmdW5jdGlvbi4gV29ya2Zsb3cgZnVuY3Rpb25zIHJ1biBpbiBhIGRldGVybWluaXN0aWMgVk07IG1vdmUgdGhlIGNhbGwgdG8gYSBzdGVwIGZ1bmN0aW9uIGZvciBmdWxsIE5vZGUuanMgYWNjZXNzLidcbiAgKTtcbn1cbiJdfQ==
package/dist/private.d.ts CHANGED
@@ -1,11 +1,12 @@
1
1
  /**
2
2
  * Utils used by the bundler when transforming code
3
3
  */
4
+ import type { WorldCapabilities } from '@workflow/world';
4
5
  import type { CryptoKey } from './encryption.js';
5
6
  import type { EventsConsumer } from './events-consumer.js';
6
7
  import type { QueueItem } from './global.js';
8
+ import type { ReplayPayloadCache } from './replay-payload-cache.js';
7
9
  import type { Serializable } from './schemas.js';
8
- import type { StepHydrationCache } from './step-hydration-cache.js';
9
10
  export type StepFunction<Args extends Serializable[] = any[], Result extends Serializable | unknown = unknown> = ((...args: Args) => Promise<Result>) & {
10
11
  maxRetries?: number;
11
12
  stepId?: string;
@@ -27,6 +28,7 @@ export declare function getStepFunction(stepId: string): StepFunction | undefine
27
28
  export interface WorkflowOrchestratorContext {
28
29
  runId: string;
29
30
  encryptionKey: CryptoKey | undefined;
31
+ worldCapabilities?: WorldCapabilities;
30
32
  globalThis: typeof globalThis;
31
33
  eventsConsumer: EventsConsumer;
32
34
  /**
@@ -85,23 +87,10 @@ export interface WorkflowOrchestratorContext {
85
87
  */
86
88
  pendingDeliveryBarriers?: Map<number, DeliveryBarrierEntry>;
87
89
  /**
88
- * Per-run memoization cache for hydrated step return values, keyed by the
89
- * `step_completed` event id. Owned by the inline replay loop in `runtime.ts`
90
- * and threaded through each `runWorkflow` call so it survives across replay
91
- * iterations of the SAME run (a fresh context is created each iteration) but
92
- * never leaks across unrelated runs.
93
- *
94
- * On replay K of a sequential N-step workflow, the step consumer would
95
- * otherwise re-decrypt and re-parse the results of all K already-completed
96
- * steps — O(N²) across an invocation. This cache makes a completed step's
97
- * result available in O(1) on subsequent replays. Only primitive results are
98
- * memoized, so a shared reference can never let one replay's mutation leak
99
- * into the next; see `step-hydration-cache.ts` for the full rationale.
100
- *
101
- * Optional so contexts that do not initialize it (test harnesses) degrade
102
- * gracefully to re-hydrating every replay — identical to previous behavior.
90
+ * Invocation-scoped cache of prepared serialized payloads and immutable final
91
+ * values. Prepared bytes survive fresh replay VMs; object graphs do not.
103
92
  */
104
- stepHydrationCache?: StepHydrationCache;
93
+ replayPayloadCache: ReplayPayloadCache;
105
94
  }
106
95
  /** The kind of branch-deciding delivery a barrier represents. */
107
96
  export type DeliveryKind = 'hook' | 'wait';
@@ -1 +1 @@
1
- {"version":3,"file":"private.d.ts","sourceRoot":"","sources":["../src/private.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,MAAM,MAAM,YAAY,CACtB,IAAI,SAAS,YAAY,EAAE,GAAG,GAAG,EAAE,EACnC,MAAM,SAAS,YAAY,GAAG,OAAO,GAAG,OAAO,IAC7C,CAAC,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG;IACzC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAsEF;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,QAGxE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAoBxE;AAOD,MAAM,WAAW,2BAA2B;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,SAAS,GAAG,SAAS,CAAC;IACrC,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,cAAc,EAAE,cAAc,CAAC;IAC/B;;;OAGG;IACH,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACzC,eAAe,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACxC,YAAY,EAAE,MAAM,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,MAAM,CAAC;IAC7B;;;;;;OAMG;IACH,YAAY,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B;;;;;;OAMG;IACH,iBAAiB,EAAE,MAAM,CAAC;IAC1B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6BG;IACH,uBAAuB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;IAC5D;;;;;;;;;;;;;;;;OAgBG;IACH,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;CACzC;AAED,iEAAiE;AACjE,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,CAAC;AAE3C,UAAU,oBAAoB;IAC5B,IAAI,EAAE,YAAY,CAAC;IACnB,gEAAgE;IAChE,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,2BAA2B,EAChC,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,gBAAgB,EAAE,SAAS,YAAY,EAAE,GACxC,OAAO,CAAC,IAAI,CAAC,CAkBf;AAED,gEAAgE;AAChE,MAAM,WAAW,eAAe;IAC9B;;;;;OAKG;IACH,aAAa,EAAE,MAAM,IAAI,CAAC;CAC3B;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,2BAA2B,EAChC,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,IAAI,EAAE,YAAY,GACjB,eAAe,CA6BjB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,2BAA2B,EAChC,EAAE,EAAE,MAAM,IAAI,GACb,IAAI,CAYN"}
1
+ {"version":3,"file":"private.d.ts","sourceRoot":"","sources":["../src/private.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,MAAM,MAAM,YAAY,CACtB,IAAI,SAAS,YAAY,EAAE,GAAG,GAAG,EAAE,EACnC,MAAM,SAAS,YAAY,GAAG,OAAO,GAAG,OAAO,IAC7C,CAAC,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG;IACzC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAsEF;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,QAGxE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAoBxE;AAOD,MAAM,WAAW,2BAA2B;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,SAAS,GAAG,SAAS,CAAC;IACrC,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,cAAc,EAAE,cAAc,CAAC;IAC/B;;;OAGG;IACH,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACzC,eAAe,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACxC,YAAY,EAAE,MAAM,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,MAAM,CAAC;IAC7B;;;;;;OAMG;IACH,YAAY,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B;;;;;;OAMG;IACH,iBAAiB,EAAE,MAAM,CAAC;IAC1B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6BG;IACH,uBAAuB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;IAC5D;;;OAGG;IACH,kBAAkB,EAAE,kBAAkB,CAAC;CACxC;AAED,iEAAiE;AACjE,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,CAAC;AAE3C,UAAU,oBAAoB;IAC5B,IAAI,EAAE,YAAY,CAAC;IACnB,gEAAgE;IAChE,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,2BAA2B,EAChC,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,gBAAgB,EAAE,SAAS,YAAY,EAAE,GACxC,OAAO,CAAC,IAAI,CAAC,CAkBf;AAED,gEAAgE;AAChE,MAAM,WAAW,eAAe;IAC9B;;;;;OAKG;IACH,aAAa,EAAE,MAAM,IAAI,CAAC;CAC3B;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,2BAA2B,EAChC,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,IAAI,EAAE,YAAY,GACjB,eAAe,CA6BjB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,2BAA2B,EAChC,EAAE,EAAE,MAAM,IAAI,GACb,IAAI,CAYN"}