@workflow/core 5.0.0-beta.35 → 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.
- package/dist/classify-error.d.ts.map +1 -1
- package/dist/classify-error.js +5 -2
- package/dist/create-hook.d.ts +41 -22
- package/dist/create-hook.d.ts.map +1 -1
- package/dist/create-hook.js +1 -1
- package/dist/describe-error.d.ts.map +1 -1
- package/dist/describe-error.js +12 -1
- package/dist/flushable-stream.d.ts +29 -0
- package/dist/flushable-stream.d.ts.map +1 -1
- package/dist/flushable-stream.js +228 -2
- package/dist/global.d.ts +2 -0
- package/dist/global.d.ts.map +1 -1
- package/dist/global.js +1 -1
- package/dist/private.d.ts +6 -17
- package/dist/private.d.ts.map +1 -1
- package/dist/private.js +1 -1
- package/dist/replay-payload-cache.d.ts +56 -0
- package/dist/replay-payload-cache.d.ts.map +1 -0
- package/dist/replay-payload-cache.js +137 -0
- package/dist/runtime/constants.d.ts +11 -0
- package/dist/runtime/constants.d.ts.map +1 -1
- package/dist/runtime/constants.js +26 -1
- package/dist/runtime/get-port-lazy.js +4 -4
- package/dist/runtime/helpers.d.ts +6 -4
- package/dist/runtime/helpers.d.ts.map +1 -1
- package/dist/runtime/helpers.js +23 -7
- package/dist/runtime/resume-hook.d.ts +4 -1
- package/dist/runtime/resume-hook.d.ts.map +1 -1
- package/dist/runtime/resume-hook.js +23 -20
- package/dist/runtime/step-executor.d.ts +39 -0
- package/dist/runtime/step-executor.d.ts.map +1 -1
- package/dist/runtime/step-executor.js +74 -4
- package/dist/runtime/step-handler.js +3 -3
- package/dist/runtime/suspension-handler.d.ts.map +1 -1
- package/dist/runtime/suspension-handler.js +2 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +372 -110
- package/dist/serialization.d.ts +44 -4
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +88 -54
- package/dist/step.d.ts.map +1 -1
- package/dist/step.js +10 -16
- package/dist/symbols.d.ts +13 -0
- package/dist/symbols.d.ts.map +1 -1
- package/dist/symbols.js +14 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +2 -2
- package/dist/workflow/abort-controller.d.ts.map +1 -1
- package/dist/workflow/abort-controller.js +3 -2
- package/dist/workflow/hook.d.ts.map +1 -1
- package/dist/workflow/hook.js +22 -7
- package/dist/workflow.d.ts +12 -9
- package/dist/workflow.d.ts.map +1 -1
- package/dist/workflow.js +16 -10
- package/docs/api-reference/create-hook.mdx +43 -2
- package/docs/api-reference/define-hook.mdx +26 -24
- package/docs/api-reference/fatal-error.mdx +29 -7
- package/docs/api-reference/fetch.mdx +3 -4
- package/docs/api-reference/sleep.mdx +1 -1
- package/docs/foundations/hooks.mdx +1 -1
- package/docs/foundations/idempotency.mdx +16 -9
- package/docs/how-it-works/encryption.mdx +3 -3
- package/docs/how-it-works/event-sourcing.mdx +6 -6
- package/docs/how-it-works/framework-integrations.mdx +2 -2
- package/package.json +5 -5
- package/dist/step-hydration-cache.d.ts +0 -148
- package/dist/step-hydration-cache.d.ts.map +0 -1
- package/dist/step-hydration-cache.js +0 -171
package/dist/flushable-stream.js
CHANGED
|
@@ -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
|
|
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 */
|
package/dist/global.d.ts.map
CHANGED
|
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2xvYmFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2dsb2JhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUF1RTVDOzs7OztHQUtHO0FBQ0gsTUFBTSxPQUFPLGtCQUFtQixTQUFRLEtBQUs7SUFDM0MsS0FBSyxDQUFjO0lBQ25CLFVBQVUsQ0FBb0I7SUFDOUIsU0FBUyxDQUFTO0lBQ2xCLFNBQVMsQ0FBUztJQUNsQixTQUFTLENBQVM7SUFDbEIsY0FBYyxDQUFTO0lBQ3ZCLGlCQUFpQixDQUFTO0lBQzFCLFVBQVUsQ0FBUztJQUVuQixZQUFZLFVBQWtDLEVBQUUsTUFBeUI7UUFDdkUsaURBQWlEO1FBQ2pELE1BQU0sS0FBSyxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUV2QyxzQ0FBc0M7UUFDdEMsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQ2xCLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztRQUNsQixJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7UUFDbEIsSUFBSSxjQUFjLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZCLElBQUksaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO1FBQzFCLElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQztRQUNuQixLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3pCLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxNQUFNO2dCQUFFLFNBQVMsRUFBRSxDQUFDO2lCQUNqQyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFFLENBQUM7Z0JBQzlCLElBQUksSUFBSSxDQUFDLFFBQVE7b0JBQUUsaUJBQWlCLEVBQUUsQ0FBQztxQkFDbEMsSUFBSSxJQUFJLENBQUMsY0FBYztvQkFBRSxVQUFVLEVBQUUsQ0FBQzs7b0JBQ3RDLFNBQVMsRUFBRSxDQUFDO1lBQ25CLENBQUM7aUJBQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLE1BQU07Z0JBQUUsU0FBUyxFQUFFLENBQUM7aUJBQ3hDLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxXQUFXO2dCQUFFLGNBQWMsRUFBRSxDQUFDO1FBQ3ZELENBQUM7UUFFRCwwQkFBMEI7UUFDMUIsTUFBTSxLQUFLLEdBQWEsRUFBRSxDQUFDO1FBQzNCLElBQUksU0FBUyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2xCLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxTQUFTLElBQUksU0FBUyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3RFLENBQUM7UUFDRCxJQUFJLFNBQVMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNsQixLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsU0FBUyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN0RSxDQUFDO1FBQ0QsSUFBSSxTQUFTLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDbEIsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLFNBQVMsSUFBSSxTQUFTLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdEUsQ0FBQztRQUNELElBQUksY0FBYyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3ZCLEtBQUssQ0FBQyxJQUFJLENBQ1IsR0FBRyxjQUFjLElBQUksU0FBUyxDQUFDLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLGNBQWMsQ0FBQyxFQUFFLENBQ3hGLENBQUM7UUFDSixDQUFDO1FBQ0QsSUFBSSxpQkFBaUIsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMxQixLQUFLLENBQUMsSUFBSSxDQUNSLEdBQUcsaUJBQWlCLFNBQVMsU0FBUyxDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUUsaUJBQWlCLENBQUMsRUFBRSxDQUNyRixDQUFDO1FBQ0osQ0FBQztRQUVELDhEQUE4RDtRQUM5RCxNQUFNLFVBQVUsR0FDZCxTQUFTLEdBQUcsU0FBUyxHQUFHLFNBQVMsR0FBRyxjQUFjLEdBQUcsaUJBQWlCLENBQUM7UUFDekUsTUFBTSxTQUFTLEdBQUcsU0FBUyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDdkQsaUVBQWlFO1FBQ2pFLE1BQU0sU0FBUyxHQUNiLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkIsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN2QixDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3ZCLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUIsQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEMsSUFBSSxNQUFjLENBQUM7UUFDbkIsSUFBSSxTQUFTLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDbEIsTUFBTSxHQUFHLFdBQVcsQ0FBQztRQUN2QixDQUFDO2FBQU0sSUFBSSxTQUFTLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDekIsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNqQixDQUFDO2FBQU0sSUFBSSxTQUFTLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDekIsTUFBTSxHQUFHLFNBQVMsQ0FBQztRQUNyQixDQUFDO2FBQU0sSUFBSSxTQUFTLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDekIsTUFBTSxHQUFHLFNBQVMsQ0FBQztRQUNyQixDQUFDO2FBQU0sSUFBSSxjQUFjLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDOUIsTUFBTSxHQUFHLFNBQVMsQ0FBQztRQUNyQixDQUFDO2FBQU0sSUFBSSxpQkFBaUIsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNqQyxNQUFNLEdBQUcsV0FBVyxDQUFDO1FBQ3ZCLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxHQUFHLFVBQVUsQ0FBQztRQUN0QixDQUFDO1FBRUQsTUFBTSxXQUFXLEdBQ2YsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQ2QsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxTQUFTLGFBQWEsTUFBTSxNQUFNO1lBQzlELENBQUMsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDLCtCQUErQjtRQUN0RSxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDbkIsSUFBSSxDQUFDLElBQUksR0FBRyxvQkFBb0IsQ0FBQztRQUNqQyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQztRQUN6QixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUMzQixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUMzQixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUMzQixJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQztRQUNyQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsaUJBQWlCLENBQUM7UUFDM0MsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7SUFDL0IsQ0FBQztJQUVELE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBYztRQUN0QixPQUFPLEtBQUssWUFBWSxrQkFBa0IsQ0FBQztJQUM3QyxDQUFDO0NBQ0Y7QUFFRCxNQUFNLFVBQVUsT0FBTztJQUNyQixNQUFNLElBQUksb0JBQW9CLENBQzVCLCtKQUErSixDQUNoSyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFdvcmtmbG93UnVudGltZUVycm9yIH0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQgeyBwbHVyYWxpemUgfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMnO1xuaW1wb3J0IHR5cGUgeyBBdHRyaWJ1dGVDaGFuZ2UgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHR5cGUgeyBTZXJpYWxpemFibGUgfSBmcm9tICcuL3NjaGVtYXMuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN0ZXBJbnZvY2F0aW9uUXVldWVJdGVtIHtcbiAgdHlwZTogJ3N0ZXAnO1xuICBjb3JyZWxhdGlvbklkOiBzdHJpbmc7XG4gIHN0ZXBOYW1lOiBzdHJpbmc7XG4gIGFyZ3M6IFNlcmlhbGl6YWJsZVtdO1xuICBjbG9zdXJlVmFycz86IFJlY29yZDxzdHJpbmcsIFNlcmlhbGl6YWJsZT47XG4gIHRoaXNWYWw/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
|
-
*
|
|
89
|
-
*
|
|
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
|
-
|
|
93
|
+
replayPayloadCache: ReplayPayloadCache;
|
|
105
94
|
}
|
|
106
95
|
/** The kind of branch-deciding delivery a barrier represents. */
|
|
107
96
|
export type DeliveryKind = 'hook' | 'wait';
|
package/dist/private.d.ts.map
CHANGED
|
@@ -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,
|
|
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"}
|