@workflow/core 5.0.0-beta.3 → 5.0.0-beta.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/attribute-changes.d.ts +7 -0
- package/dist/attribute-changes.d.ts.map +1 -0
- package/dist/attribute-changes.js +25 -0
- package/dist/capabilities.d.ts +22 -1
- package/dist/capabilities.d.ts.map +1 -1
- package/dist/capabilities.js +41 -4
- package/dist/capture-stack.d.ts +16 -0
- package/dist/capture-stack.d.ts.map +1 -0
- package/dist/capture-stack.js +21 -0
- package/dist/class-serialization.d.ts +32 -0
- package/dist/class-serialization.d.ts.map +1 -1
- package/dist/class-serialization.js +37 -1
- package/dist/classify-error.d.ts +26 -3
- package/dist/classify-error.d.ts.map +1 -1
- package/dist/classify-error.js +103 -6
- package/dist/context-errors.d.ts +27 -0
- package/dist/context-errors.d.ts.map +1 -0
- package/dist/context-errors.js +101 -0
- package/dist/context-violation-error.d.ts +97 -0
- package/dist/context-violation-error.d.ts.map +1 -0
- package/dist/context-violation-error.js +147 -0
- package/dist/create-hook.d.ts +42 -3
- package/dist/create-hook.d.ts.map +1 -1
- package/dist/create-hook.js +4 -3
- package/dist/define-hook.d.ts.map +1 -1
- package/dist/define-hook.js +20 -5
- package/dist/describe-error.d.ts +70 -0
- package/dist/describe-error.d.ts.map +1 -0
- package/dist/describe-error.js +165 -0
- package/dist/encryption.d.ts +22 -1
- package/dist/encryption.d.ts.map +1 -1
- package/dist/encryption.js +72 -27
- package/dist/events-consumer.d.ts +25 -1
- package/dist/events-consumer.d.ts.map +1 -1
- package/dist/events-consumer.js +95 -16
- package/dist/flushable-stream.d.ts +10 -10
- package/dist/flushable-stream.d.ts.map +1 -1
- package/dist/flushable-stream.js +26 -15
- package/dist/global.d.ts +35 -1
- package/dist/global.d.ts.map +1 -1
- package/dist/global.js +21 -3
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/log-format.d.ts +25 -0
- package/dist/log-format.d.ts.map +1 -0
- package/dist/log-format.js +250 -0
- package/dist/logger.d.ts +29 -30
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +82 -32
- package/dist/private.d.ts +107 -2
- package/dist/private.d.ts.map +1 -1
- package/dist/private.js +80 -3
- package/dist/runtime/constants.d.ts +189 -0
- package/dist/runtime/constants.d.ts.map +1 -1
- package/dist/runtime/constants.js +310 -15
- package/dist/runtime/get-port-lazy.d.ts +25 -0
- package/dist/runtime/get-port-lazy.d.ts.map +1 -0
- package/dist/runtime/get-port-lazy.js +92 -0
- package/dist/runtime/get-world-lazy.d.ts +23 -0
- package/dist/runtime/get-world-lazy.d.ts.map +1 -0
- package/dist/runtime/get-world-lazy.js +46 -0
- package/dist/runtime/helpers.d.ts +57 -6
- package/dist/runtime/helpers.d.ts.map +1 -1
- package/dist/runtime/helpers.js +169 -32
- package/dist/runtime/replay-budget.d.ts +98 -0
- package/dist/runtime/replay-budget.d.ts.map +1 -0
- package/dist/runtime/replay-budget.js +192 -0
- package/dist/runtime/resume-hook.d.ts.map +1 -1
- package/dist/runtime/resume-hook.js +39 -23
- package/dist/runtime/run-id-time.d.ts +10 -0
- package/dist/runtime/run-id-time.d.ts.map +1 -0
- package/dist/runtime/run-id-time.js +31 -0
- package/dist/runtime/run.d.ts +6 -2
- package/dist/runtime/run.d.ts.map +1 -1
- package/dist/runtime/run.js +52 -10
- package/dist/runtime/runs.d.ts +36 -2
- package/dist/runtime/runs.d.ts.map +1 -1
- package/dist/runtime/runs.js +18 -7
- package/dist/runtime/start.d.ts +58 -1
- package/dist/runtime/start.d.ts.map +1 -1
- package/dist/runtime/start.js +160 -46
- package/dist/runtime/step-executor.d.ts +131 -0
- package/dist/runtime/step-executor.d.ts.map +1 -0
- package/dist/runtime/step-executor.js +818 -0
- package/dist/runtime/step-handler.d.ts.map +1 -1
- package/dist/runtime/step-handler.js +718 -557
- package/dist/runtime/step-latency.d.ts +131 -0
- package/dist/runtime/step-latency.d.ts.map +1 -0
- package/dist/runtime/step-latency.js +155 -0
- package/dist/runtime/step-ownership.d.ts +72 -0
- package/dist/runtime/step-ownership.d.ts.map +1 -0
- package/dist/runtime/step-ownership.js +114 -0
- package/dist/runtime/step-single-flight.d.ts +12 -0
- package/dist/runtime/step-single-flight.d.ts.map +1 -0
- package/dist/runtime/step-single-flight.js +69 -0
- package/dist/runtime/suspension-handler.d.ts +81 -7
- package/dist/runtime/suspension-handler.d.ts.map +1 -1
- package/dist/runtime/suspension-handler.js +355 -137
- package/dist/runtime/wait-continuation.d.ts +84 -0
- package/dist/runtime/wait-continuation.d.ts.map +1 -0
- package/dist/runtime/wait-continuation.js +105 -0
- package/dist/runtime/wait-until.d.ts +18 -0
- package/dist/runtime/wait-until.d.ts.map +1 -0
- package/dist/runtime/wait-until.js +42 -0
- package/dist/runtime/world-compatibility.d.ts +5 -0
- package/dist/runtime/world-compatibility.d.ts.map +1 -0
- package/dist/runtime/world-compatibility.js +12 -0
- package/dist/runtime/world-init.d.ts +50 -0
- package/dist/runtime/world-init.d.ts.map +1 -0
- package/dist/runtime/world-init.js +50 -0
- package/dist/runtime/world-target.d.ts +11 -0
- package/dist/runtime/world-target.d.ts.map +1 -0
- package/dist/runtime/world-target.js +15 -0
- package/dist/runtime/world.d.ts +21 -9
- package/dist/runtime/world.d.ts.map +1 -1
- package/dist/runtime/world.js +58 -83
- package/dist/runtime.d.ts +15 -10
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +1757 -326
- package/dist/schemas.d.ts +1 -1
- package/dist/schemas.d.ts.map +1 -1
- package/dist/schemas.js +1 -1
- package/dist/serialization/client.d.ts +17 -0
- package/dist/serialization/client.d.ts.map +1 -0
- package/dist/serialization/client.js +48 -0
- package/dist/serialization/codec-devalue.d.ts +14 -0
- package/dist/serialization/codec-devalue.d.ts.map +1 -0
- package/dist/serialization/codec-devalue.js +98 -0
- package/dist/serialization/codec.d.ts +106 -0
- package/dist/serialization/codec.d.ts.map +1 -0
- package/dist/serialization/codec.js +17 -0
- package/dist/serialization/compression.d.ts +104 -0
- package/dist/serialization/compression.d.ts.map +1 -0
- package/dist/serialization/compression.js +260 -0
- package/dist/serialization/encryption.d.ts +33 -0
- package/dist/serialization/encryption.d.ts.map +1 -0
- package/dist/serialization/encryption.js +70 -0
- package/dist/serialization/errors.d.ts +34 -0
- package/dist/serialization/errors.d.ts.map +1 -0
- package/dist/serialization/errors.js +59 -0
- package/dist/serialization/format.d.ts +60 -0
- package/dist/serialization/format.d.ts.map +1 -0
- package/dist/serialization/format.js +97 -0
- package/dist/serialization/index.d.ts +19 -0
- package/dist/serialization/index.d.ts.map +1 -0
- package/dist/serialization/index.js +22 -0
- package/dist/serialization/reducers/class.d.ts +11 -0
- package/dist/serialization/reducers/class.d.ts.map +1 -0
- package/dist/serialization/reducers/class.js +68 -0
- package/dist/serialization/reducers/common.d.ts +16 -0
- package/dist/serialization/reducers/common.d.ts.map +1 -0
- package/dist/serialization/reducers/common.js +417 -0
- package/dist/serialization/reducers/step-function.d.ts +35 -0
- package/dist/serialization/reducers/step-function.d.ts.map +1 -0
- package/dist/serialization/reducers/step-function.js +88 -0
- package/dist/serialization/step.d.ts +17 -0
- package/dist/serialization/step.d.ts.map +1 -0
- package/dist/serialization/step.js +48 -0
- package/dist/serialization/types.d.ts +253 -0
- package/dist/serialization/types.d.ts.map +1 -0
- package/dist/serialization/types.js +25 -0
- package/dist/serialization/workflow.d.ts +29 -0
- package/dist/serialization/workflow.d.ts.map +1 -0
- package/dist/serialization/workflow.js +54 -0
- package/dist/serialization-format.d.ts +16 -0
- package/dist/serialization-format.d.ts.map +1 -1
- package/dist/serialization-format.js +213 -50
- package/dist/serialization.d.ts +322 -214
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +1575 -664
- package/dist/set-attributes.d.ts +13 -0
- package/dist/set-attributes.d.ts.map +1 -0
- package/dist/set-attributes.js +56 -0
- package/dist/sleep.d.ts.map +1 -1
- package/dist/sleep.js +3 -2
- package/dist/source-map.d.ts +5 -0
- package/dist/source-map.d.ts.map +1 -1
- package/dist/source-map.js +102 -10
- package/dist/step/context-storage.d.ts +53 -0
- package/dist/step/context-storage.d.ts.map +1 -1
- package/dist/step/context-storage.js +1 -1
- package/dist/step/get-closure-vars.d.ts.map +1 -1
- package/dist/step/get-closure-vars.js +3 -2
- package/dist/step/get-step-metadata.d.ts.map +1 -1
- package/dist/step/get-step-metadata.js +3 -2
- package/dist/step/get-workflow-metadata.d.ts.map +1 -1
- package/dist/step/get-workflow-metadata.js +3 -2
- package/dist/step/writable-stream.d.ts.map +1 -1
- package/dist/step/writable-stream.js +58 -6
- package/dist/step-hydration-cache.d.ts +148 -0
- package/dist/step-hydration-cache.d.ts.map +1 -0
- package/dist/step-hydration-cache.js +171 -0
- package/dist/step.d.ts.map +1 -1
- package/dist/step.js +144 -25
- package/dist/symbols.d.ts +28 -0
- package/dist/symbols.d.ts.map +1 -1
- package/dist/symbols.js +29 -1
- package/dist/telemetry/semantic-conventions.d.ts +98 -2
- package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
- package/dist/telemetry/semantic-conventions.js +66 -1
- package/dist/telemetry.d.ts +68 -0
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +106 -4
- package/dist/types.d.ts +6 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +23 -1
- package/dist/util.d.ts +16 -6
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +25 -16
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +2 -2
- package/dist/vm/index.d.ts.map +1 -1
- package/dist/vm/index.js +3 -2
- package/dist/vm/script-cache.d.ts +28 -0
- package/dist/vm/script-cache.d.ts.map +1 -0
- package/dist/vm/script-cache.js +140 -0
- package/dist/workflow/abort-controller.d.ts +65 -0
- package/dist/workflow/abort-controller.d.ts.map +1 -0
- package/dist/workflow/abort-controller.js +277 -0
- package/dist/workflow/attribute-dispatcher.d.ts +6 -0
- package/dist/workflow/attribute-dispatcher.d.ts.map +1 -0
- package/dist/workflow/attribute-dispatcher.js +48 -0
- package/dist/workflow/create-hook.d.ts.map +1 -1
- package/dist/workflow/create-hook.js +25 -3
- package/dist/workflow/define-hook.d.ts +1 -1
- package/dist/workflow/define-hook.d.ts.map +1 -1
- package/dist/workflow/define-hook.js +8 -4
- package/dist/workflow/get-workflow-metadata.d.ts.map +1 -1
- package/dist/workflow/get-workflow-metadata.js +14 -3
- package/dist/workflow/hook.d.ts.map +1 -1
- package/dist/workflow/hook.js +207 -33
- package/dist/workflow/index.d.ts +1 -0
- package/dist/workflow/index.d.ts.map +1 -1
- package/dist/workflow/index.js +5 -3
- package/dist/workflow/set-attributes.d.ts +73 -0
- package/dist/workflow/set-attributes.d.ts.map +1 -0
- package/dist/workflow/set-attributes.js +65 -0
- package/dist/workflow/sleep.d.ts.map +1 -1
- package/dist/workflow/sleep.js +45 -8
- package/dist/workflow/world-init-stub.d.ts +15 -0
- package/dist/workflow/world-init-stub.d.ts.map +1 -0
- package/dist/workflow/world-init-stub.js +15 -0
- package/dist/workflow.d.ts +17 -1
- package/dist/workflow.d.ts.map +1 -1
- package/dist/workflow.js +190 -56
- package/docs/api-reference/create-hook.mdx +38 -0
- package/docs/api-reference/create-webhook.mdx +1 -0
- package/docs/api-reference/experimental-set-attributes.mdx +65 -0
- package/docs/api-reference/fetch.mdx +5 -0
- package/docs/api-reference/index.mdx +3 -0
- package/docs/foundations/cancellation.mdx +459 -0
- package/docs/foundations/errors-and-retries.mdx +7 -3
- package/docs/foundations/hooks.mdx +29 -0
- package/docs/foundations/idempotency.mdx +236 -11
- package/docs/foundations/index.mdx +1 -23
- package/docs/foundations/meta.json +3 -1
- package/docs/foundations/serialization.mdx +77 -41
- package/docs/foundations/starting-workflows.mdx +5 -1
- package/docs/foundations/streaming.mdx +14 -23
- package/docs/foundations/versioning.mdx +263 -0
- package/docs/how-it-works/cancellation.mdx +287 -0
- package/docs/how-it-works/code-transform.mdx +2 -2
- package/docs/how-it-works/encryption.mdx +2 -2
- package/docs/how-it-works/event-sourcing.mdx +2 -2
- package/docs/how-it-works/meta.json +2 -1
- package/package.json +32 -11
package/dist/logger.js
CHANGED
|
@@ -1,41 +1,91 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { composeLogLine } from './log-format.js';
|
|
2
2
|
import { getActiveSpan } from './telemetry.js';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
3
|
+
/**
|
|
4
|
+
* Lightweight `DEBUG=` pattern matcher. Replaces the `debug` package, which
|
|
5
|
+
* was previously a static dependency of this module — that import path
|
|
6
|
+
* pulled `debug/src/node` and its dynamic `require('tty')` into the
|
|
7
|
+
* generated Next.js webpack flow route, breaking the V2 combined-bundle
|
|
8
|
+
* build with `Dynamic require of "tty" is not supported`. Keeping this
|
|
9
|
+
* module free of `debug` is a prerequisite for V2 webpack builds.
|
|
10
|
+
*/
|
|
11
|
+
function matchesDebugNamespace(namespace, patternList) {
|
|
12
|
+
if (!patternList) {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
let enabled = false;
|
|
16
|
+
for (const rawPattern of patternList.split(',')) {
|
|
17
|
+
const pattern = rawPattern.trim();
|
|
18
|
+
if (!pattern) {
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
const isNegated = pattern.startsWith('-');
|
|
22
|
+
const candidate = isNegated ? pattern.slice(1) : pattern;
|
|
23
|
+
const regex = new RegExp(`^${candidate.replace(/[|\\{}()[\]^$+?.]/g, '\\$&').replace(/\*/g, '.*')}$`);
|
|
24
|
+
if (regex.test(namespace)) {
|
|
25
|
+
enabled = !isNegated;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return enabled;
|
|
29
|
+
}
|
|
30
|
+
function createLogger(namespace, options = {}) {
|
|
31
|
+
const build = (parentMetadata) => {
|
|
32
|
+
const getDebugNamespace = (level) => options.debugNamespace ?? `workflow:${namespace}:${level}`;
|
|
33
|
+
const logger = (level) => {
|
|
34
|
+
const debugNamespace = getDebugNamespace(level);
|
|
35
|
+
return (message, metadata) => {
|
|
36
|
+
const hasParent = Object.keys(parentMetadata).length > 0;
|
|
37
|
+
const hasCallSite = metadata && Object.keys(metadata).length > 0;
|
|
38
|
+
const merged = hasParent || hasCallSite
|
|
39
|
+
? { ...parentMetadata, ...(metadata ?? {}) }
|
|
40
|
+
: undefined;
|
|
41
|
+
// Always output error/warn to console so users see critical issues.
|
|
42
|
+
// debug/info only output when DEBUG env var matches the namespace.
|
|
43
|
+
//
|
|
44
|
+
// Compose the framing + structured fields + (trimmed) stack into a
|
|
45
|
+
// single string so the runtime's `console.error` / `util.inspect`
|
|
46
|
+
// doesn't quote-escape multi-line stacks or paragraph hints inside
|
|
47
|
+
// a JSON-y object dump. The framing line stays at the top with the
|
|
48
|
+
// structured fields right under it; the stack body — with framework
|
|
49
|
+
// internal frames collapsed — sits at the bottom. See log-format.ts.
|
|
50
|
+
if (level === 'error' || level === 'warn') {
|
|
51
|
+
const out = level === 'error' ? console.error : console.warn;
|
|
52
|
+
out(composeLogLine('[workflow-sdk]', message, merged));
|
|
53
|
+
}
|
|
54
|
+
const debugEnabled = matchesDebugNamespace(debugNamespace, process.env.DEBUG);
|
|
55
|
+
if (debugEnabled) {
|
|
56
|
+
console.debug(`[${debugNamespace}] ${message}`, merged ?? '');
|
|
57
|
+
getActiveSpan()
|
|
58
|
+
.then((span) => {
|
|
59
|
+
span?.addEvent(`${level}.${namespace}`, { message, ...merged });
|
|
60
|
+
})
|
|
61
|
+
.catch(() => {
|
|
62
|
+
// Silently ignore telemetry errors
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
};
|
|
67
|
+
return {
|
|
68
|
+
debug: logger('debug'),
|
|
69
|
+
info: logger('info'),
|
|
70
|
+
warn: logger('warn'),
|
|
71
|
+
error: logger('error'),
|
|
72
|
+
child: (metadata) => build({ ...parentMetadata, ...metadata }),
|
|
73
|
+
forRun: (workflowRunId, workflowName, extra) => build({
|
|
74
|
+
...parentMetadata,
|
|
75
|
+
workflowRunId,
|
|
76
|
+
...(workflowName !== undefined ? { workflowName } : {}),
|
|
77
|
+
...(extra ?? {}),
|
|
78
|
+
}),
|
|
27
79
|
};
|
|
28
80
|
};
|
|
29
|
-
return {
|
|
30
|
-
debug: logger('debug'),
|
|
31
|
-
info: logger('info'),
|
|
32
|
-
warn: logger('warn'),
|
|
33
|
-
error: logger('error'),
|
|
34
|
-
};
|
|
81
|
+
return build({});
|
|
35
82
|
}
|
|
36
83
|
export const stepLogger = createLogger('step');
|
|
37
84
|
export const runtimeLogger = createLogger('runtime');
|
|
38
85
|
export const webhookLogger = createLogger('webhook');
|
|
39
86
|
export const eventsLogger = createLogger('events');
|
|
40
87
|
export const adapterLogger = createLogger('adapter');
|
|
41
|
-
|
|
88
|
+
export const buildLogger = createLogger('build', {
|
|
89
|
+
debugNamespace: 'workflow:build',
|
|
90
|
+
});
|
|
91
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2xvZ2dlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBbUMvQzs7Ozs7OztHQU9HO0FBQ0gsU0FBUyxxQkFBcUIsQ0FDNUIsU0FBaUIsRUFDakIsV0FBK0I7SUFFL0IsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2pCLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNwQixLQUFLLE1BQU0sVUFBVSxJQUFJLFdBQVcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNoRCxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbEMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2IsU0FBUztRQUNYLENBQUM7UUFFRCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzFDLE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1FBQ3pELE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxDQUN0QixJQUFJLFNBQVMsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLEVBQUUsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxDQUM1RSxDQUFDO1FBRUYsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDMUIsT0FBTyxHQUFHLENBQUMsU0FBUyxDQUFDO1FBQ3ZCLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxP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YixHQUFHLENBQUMsWUFBWSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUN2RCxHQUFHLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQzthQUNqQixDQUFDO1NBQ0wsQ0FBQztJQUNKLENBQUMsQ0FBQztJQUVGLE9BQU8sS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ25CLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQy9DLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDckQsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUNyRCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ25ELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDckQsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLFlBQVksQ0FBQyxPQUFPLEVBQUU7SUFDL0MsY0FBYyxFQUFFLGdCQUFnQjtDQUNqQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb21wb3NlTG9nTGluZSB9IGZyb20gJy4vbG9nLWZvcm1hdC5qcyc7XG5pbXBvcnQgeyBnZXRBY3RpdmVTcGFuIH0gZnJvbSAnLi90ZWxlbWV0cnkuanMnO1xuXG50eXBlIExvZ01ldGFkYXRhID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbnR5cGUgTG9nRm4gPSAobWVzc2FnZTogc3RyaW5nLCBtZXRhZGF0YT86IExvZ01ldGFkYXRhKSA9PiB2b2lkO1xuXG5leHBvcnQgaW50ZXJmYWNlIExvZ2dlciB7XG4gIGRlYnVnOiBMb2dGbjtcbiAgaW5mbzogTG9nRm47XG4gIHdhcm46IExvZ0ZuO1xuICBlcnJvcjogTG9nRm47XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgY2hpbGQgbG9nZ2VyIHRoYXQgbWVyZ2VzIHRoZSBnaXZlbiBtZXRhZGF0YSBpbnRvIGV2ZXJ5IGNhbGwuXG4gICAqIFVzZWZ1bCBmb3IgYXR0YWNoaW5nIHN0YWJsZSBjb250ZXh0IChlLmcuIGB3b3JrZmxvd1J1bklkYCwgYHdvcmtmbG93TmFtZWAsXG4gICAqIGBzdGVwSWRgKSBzbyBjYWxsZXJzIGRvbid0IGhhdmUgdG8gcmVwZWF0IGl0IG9uIGV2ZXJ5IGxvZy5cbiAgICpcbiAgICogQ2FsbC1zaXRlIG1ldGFkYXRhIHdpbnMgb24gY29uZmxpY3QsIHNvIGNoaWxkcmVuIGNhbiBzdGlsbCBvdmVycmlkZS5cbiAgICovXG4gIGNoaWxkOiAobWV0YWRhdGE6IExvZ01ldGFkYXRhKSA9PiBMb2dnZXI7XG4gIC8qKlxuICAgKiBDb252ZW5pZW5jZSBjaGlsZCBsb2dnZXIgZm9yIGEgd29ya2Zsb3cgcnVuLiBFcXVpdmFsZW50IHRvXG4gICAqIGBsb2dnZXIuY2hpbGQoeyB3b3JrZmxvd1J1bklkLCB3b3JrZmxvd05hbWUgfSlgLCBidXQgY2VudHJhbGl6ZWQgc28gYWxsXG4gICAqIHJ1bnRpbWUgY29kZSBzdHJ1Y3R1cmVzIHJ1biBtZXRhZGF0YSBjb25zaXN0ZW50bHkuXG4gICAqL1xuICBmb3JSdW46IChcbiAgICB3b3JrZmxvd1J1bklkOiBzdHJpbmcsXG4gICAgd29ya2Zsb3dOYW1lPzogc3RyaW5nLFxuICAgIGV4dHJhPzogTG9nTWV0YWRhdGFcbiAgKSA9PiBMb2dnZXI7XG59XG5cbnR5cGUgTG9nZ2VyT3B0aW9ucyA9IHtcbiAgZGVidWdOYW1lc3BhY2U/OiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIExpZ2h0d2VpZ2h0IGBERUJVRz1gIHBhdHRlcm4gbWF0Y2hlci4gUmVwbGFjZXMgdGhlIGBkZWJ1Z2AgcGFja2FnZSwgd2hpY2hcbiAqIHdhcyBwcmV2aW91c2x5IGEgc3RhdGljIGRlcGVuZGVuY3kgb2YgdGhpcyBtb2R1bGUg4oCUIHRoYXQgaW1wb3J0IHBhdGhcbiAqIHB1bGxlZCBgZGVidWcvc3JjL25vZGVgIGFuZCBpdHMgZHluYW1pYyBgcmVxdWlyZSgndHR5JylgIGludG8gdGhlXG4gKiBnZW5lcmF0ZWQgTmV4dC5qcyB3ZWJwYWNrIGZsb3cgcm91dGUsIGJyZWFraW5nIHRoZSBWMiBjb21iaW5lZC1idW5kbGVcbiAqIGJ1aWxkIHdpdGggYER5bmFtaWMgcmVxdWlyZSBvZiBcInR0eVwiIGlzIG5vdCBzdXBwb3J0ZWRgLiBLZWVwaW5nIHRoaXNcbiAqIG1vZHVsZSBmcmVlIG9mIGBkZWJ1Z2AgaXMgYSBwcmVyZXF1aXNpdGUgZm9yIFYyIHdlYnBhY2sgYnVpbGRzLlxuICovXG5mdW5jdGlvbiBtYXRjaGVzRGVidWdOYW1lc3BhY2UoXG4gIG5hbWVzcGFjZTogc3RyaW5nLFxuICBwYXR0ZXJuTGlzdDogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBib29sZWFuIHtcbiAgaWYgKCFwYXR0ZXJuTGlzdCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGxldCBlbmFibGVkID0gZmFsc2U7XG4gIGZvciAoY29uc3QgcmF3UGF0dGVybiBvZiBwYXR0ZXJuTGlzdC5zcGxpdCgnLCcpKSB7XG4gICAgY29uc3QgcGF0dGVybiA9IHJhd1BhdHRlcm4udHJpbSgpO1xuICAgIGlmICghcGF0dGVybikge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgaXNOZWdhdGVkID0gcGF0dGVybi5zdGFydHNXaXRoKCctJyk7XG4gICAgY29uc3QgY2FuZGlkYXRlID0gaXNOZWdhdGVkID8gcGF0dGVybi5zbGljZSgxKSA6IHBhdHRlcm47XG4gICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKFxuICAgICAgYF4ke2NhbmRpZGF0ZS5yZXBsYWNlKC9bfFxcXFx7fSgpW1xcXV4kKz8uXS9nLCAnXFxcXCQmJykucmVwbGFjZSgvXFwqL2csICcuKicpfSRgXG4gICAgKTtcblxuICAgIGlmIChyZWdleC50ZXN0KG5hbWVzcGFjZSkpIHtcbiAgICAgIGVuYWJsZWQgPSAhaXNOZWdhdGVkO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlbmFibGVkO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVMb2dnZXIobmFtZXNwYWNlOiBzdHJpbmcsIG9wdGlvbnM6IExvZ2dlck9wdGlvbnMgPSB7fSk6IExvZ2dlciB7XG4gIGNvbnN0IGJ1aWxkID0gKHBhcmVudE1ldGFkYXRhOiBMb2dNZXRhZGF0YSk6IExvZ2dlciA9PiB7XG4gICAgY29uc3QgZ2V0RGVidWdOYW1lc3BhY2UgPSAobGV2ZWw6IHN0cmluZykgPT5cbiAgICAgIG9wdGlvbnMuZGVidWdOYW1lc3BhY2UgPz8gYHdvcmtmbG93OiR7bmFtZXNwYWNlfToke2xldmVsfWA7XG5cbiAgICBjb25zdCBsb2dnZXIgPSAobGV2ZWw6IHN0cmluZyk6IExvZ0ZuID0+IHtcbiAgICAgIGNvbnN0IGRlYnVnTmFtZXNwYWNlID0gZ2V0RGVidWdOYW1lc3BhY2UobGV2ZWwpO1xuXG4gICAgICByZXR1cm4gKG1lc3NhZ2UsIG1ldGFkYXRhKSA9PiB7XG4gICAgICAgIGNvbnN0IGhhc1BhcmVudCA9IE9iamVjdC5rZXlzKHBhcmVudE1ldGFkYXRhKS5sZW5ndGggPiAwO1xuICAgICAgICBjb25zdCBoYXNDYWxsU2l0ZSA9IG1ldGFkYXRhICYmIE9iamVjdC5rZXlzKG1ldGFkYXRhKS5sZW5ndGggPiAwO1xuICAgICAgICBjb25zdCBtZXJnZWQgPVxuICAgICAgICAgIGhhc1BhcmVudCB8fCBoYXNDYWxsU2l0ZVxuICAgICAgICAgICAgPyB7IC4uLnBhcmVudE1ldGFkYXRhLCAuLi4obWV0YWRhdGEgPz8ge30pIH1cbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIC8vIEFsd2F5cyBvdXRwdXQgZXJyb3Ivd2FybiB0byBjb25zb2xlIHNvIHVzZXJzIHNlZSBjcml0aWNhbCBpc3N1ZXMuXG4gICAgICAgIC8vIGRlYnVnL2luZm8gb25seSBvdXRwdXQgd2hlbiBERUJVRyBlbnYgdmFyIG1hdGNoZXMgdGhlIG5hbWVzcGFjZS5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gQ29tcG9zZSB0aGUgZnJhbWluZyArIHN0cnVjdHVyZWQgZmllbGRzICsgKHRyaW1tZWQpIHN0YWNrIGludG8gYVxuICAgICAgICAvLyBzaW5nbGUgc3RyaW5nIHNvIHRoZSBydW50aW1lJ3MgYGNvbnNvbGUuZXJyb3JgIC8gYHV0aWwuaW5zcGVjdGBcbiAgICAgICAgLy8gZG9lc24ndCBxdW90ZS1lc2NhcGUgbXVsdGktbGluZSBzdGFja3Mgb3IgcGFyYWdyYXBoIGhpbnRzIGluc2lkZVxuICAgICAgICAvLyBhIEpTT04teSBvYmplY3QgZHVtcC4gVGhlIGZyYW1pbmcgbGluZSBzdGF5cyBhdCB0aGUgdG9wIHdpdGggdGhlXG4gICAgICAgIC8vIHN0cnVjdHVyZWQgZmllbGRzIHJpZ2h0IHVuZGVyIGl0OyB0aGUgc3RhY2sgYm9keSDigJQgd2l0aCBmcmFtZXdvcmtcbiAgICAgICAgLy8gaW50ZXJuYWwgZnJhbWVzIGNvbGxhcHNlZCDigJQgc2l0cyBhdCB0aGUgYm90dG9tLiBTZWUgbG9nLWZvcm1hdC50cy5cbiAgICAgICAgaWYgKGxldmVsID09PSAnZXJyb3InIHx8IGxldmVsID09PSAnd2FybicpIHtcbiAgICAgICAgICBjb25zdCBvdXQgPSBsZXZlbCA9PT0gJ2Vycm9yJyA/IGNvbnNvbGUuZXJyb3IgOiBjb25zb2xlLndhcm47XG4gICAgICAgICAgb3V0KGNvbXBvc2VMb2dMaW5lKCdbd29ya2Zsb3ctc2RrXScsIG1lc3NhZ2UsIG1lcmdlZCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGVidWdFbmFibGVkID0gbWF0Y2hlc0RlYnVnTmFtZXNwYWNlKFxuICAgICAgICAgIGRlYnVnTmFtZXNwYWNlLFxuICAgICAgICAgIHByb2Nlc3MuZW52LkRFQlVHXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGRlYnVnRW5hYmxlZCkge1xuICAgICAgICAgIGNvbnNvbGUuZGVidWcoYFske2RlYnVnTmFtZXNwYWNlfV0gJHttZXNzYWdlfWAsIG1lcmdlZCA/PyAnJyk7XG4gICAgICAgICAgZ2V0QWN0aXZlU3BhbigpXG4gICAgICAgICAgICAudGhlbigoc3BhbikgPT4ge1xuICAgICAgICAgICAgICBzcGFuPy5hZGRFdmVudChgJHtsZXZlbH0uJHtuYW1lc3BhY2V9YCwgeyBtZXNzYWdlLCAuLi5tZXJnZWQgfSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgLy8gU2lsZW50bHkgaWdub3JlIHRlbGVtZXRyeSBlcnJvcnNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH07XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGVidWc6IGxvZ2dlcignZGVidWcnKSxcbiAgICAgIGluZm86IGxvZ2dlcignaW5mbycpLFxuICAgICAgd2FybjogbG9nZ2VyKCd3YXJuJyksXG4gICAgICBlcnJvcjogbG9nZ2VyKCdlcnJvcicpLFxuICAgICAgY2hpbGQ6IChtZXRhZGF0YSkgPT4gYnVpbGQoeyAuLi5wYXJlbnRNZXRhZGF0YSwgLi4ubWV0YWRhdGEgfSksXG4gICAgICBmb3JSdW46ICh3b3JrZmxvd1J1bklkLCB3b3JrZmxvd05hbWUsIGV4dHJhKSA9PlxuICAgICAgICBidWlsZCh7XG4gICAgICAgICAgLi4ucGFyZW50TWV0YWRhdGEsXG4gICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAuLi4od29ya2Zsb3dOYW1lICE9PSB1bmRlZmluZWQgPyB7IHdvcmtmbG93TmFtZSB9IDoge30pLFxuICAgICAgICAgIC4uLihleHRyYSA/PyB7fSksXG4gICAgICAgIH0pLFxuICAgIH07XG4gIH07XG5cbiAgcmV0dXJuIGJ1aWxkKHt9KTtcbn1cblxuZXhwb3J0IGNvbnN0IHN0ZXBMb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ3N0ZXAnKTtcbmV4cG9ydCBjb25zdCBydW50aW1lTG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdydW50aW1lJyk7XG5leHBvcnQgY29uc3Qgd2ViaG9va0xvZ2dlciA9IGNyZWF0ZUxvZ2dlcignd2ViaG9vaycpO1xuZXhwb3J0IGNvbnN0IGV2ZW50c0xvZ2dlciA9IGNyZWF0ZUxvZ2dlcignZXZlbnRzJyk7XG5leHBvcnQgY29uc3QgYWRhcHRlckxvZ2dlciA9IGNyZWF0ZUxvZ2dlcignYWRhcHRlcicpO1xuZXhwb3J0IGNvbnN0IGJ1aWxkTG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdidWlsZCcsIHtcbiAgZGVidWdOYW1lc3BhY2U6ICd3b3JrZmxvdzpidWlsZCcsXG59KTtcbiJdfQ==
|
package/dist/private.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ import type { CryptoKey } from './encryption.js';
|
|
|
5
5
|
import type { EventsConsumer } from './events-consumer.js';
|
|
6
6
|
import type { QueueItem } from './global.js';
|
|
7
7
|
import type { Serializable } from './schemas.js';
|
|
8
|
+
import type { StepHydrationCache } from './step-hydration-cache.js';
|
|
8
9
|
export type StepFunction<Args extends Serializable[] = any[], Result extends Serializable | unknown = unknown> = ((...args: Args) => Promise<Result>) & {
|
|
9
10
|
maxRetries?: number;
|
|
10
11
|
stepId?: string;
|
|
@@ -46,11 +47,102 @@ export interface WorkflowOrchestratorContext {
|
|
|
46
47
|
promiseQueue: Promise<void>;
|
|
47
48
|
/**
|
|
48
49
|
* Counter of in-flight async data delivery operations (step result
|
|
49
|
-
* hydration, hook payload hydration). Suspensions
|
|
50
|
-
* to reach 0 before firing, to avoid preempting data
|
|
50
|
+
* hydration, hook payload hydration, abort signal hydration). Suspensions
|
|
51
|
+
* must wait for this to reach 0 before firing, to avoid preempting data
|
|
52
|
+
* delivery — e.g. dehydrating a step's arguments while an abort that should
|
|
53
|
+
* be reflected in those arguments is still hydrating its reason.
|
|
51
54
|
*/
|
|
52
55
|
pendingDeliveries: number;
|
|
56
|
+
/**
|
|
57
|
+
* Ordered registry of in-flight "branch-deciding" deliveries — the
|
|
58
|
+
* resolutions a workflow typically `Promise.race`s on: buffered hook
|
|
59
|
+
* payloads (`hook_received`) and wait completions (`wait_completed`).
|
|
60
|
+
* Keyed by the delivery's position (index) in the consumed event log.
|
|
61
|
+
*
|
|
62
|
+
* The problem: a buffered hook payload is observed via the async hook
|
|
63
|
+
* iterator (`yield await this`), costing extra microtask hops, while a
|
|
64
|
+
* `wait_completed` resolves with fewer hops — and a reused sleep can
|
|
65
|
+
* resolve in an entirely earlier loop iteration. Either way, the
|
|
66
|
+
* resolution that the committed event log ordered first can lose a
|
|
67
|
+
* `Promise.race` to a faster- or already-resolved competitor, diverging
|
|
68
|
+
* from the log and surfacing as `CorruptedEventLogError`.
|
|
69
|
+
*
|
|
70
|
+
* The fix is a strict, deterministic delivery order anchored on
|
|
71
|
+
* event-log position: a delivery does not resolve to the workflow until
|
|
72
|
+
* every earlier-in-log delivery of the OPPOSITE kind has been delivered.
|
|
73
|
+
* (Opposite kind only: sequential same-kind hook payloads must not block
|
|
74
|
+
* one another, and a wait need not wait behind a later wait.) Because the
|
|
75
|
+
* gate is "the earlier delivery resolved", not "won a timing race", the
|
|
76
|
+
* outcome is independent of microtask hops, hydration/decryption time,
|
|
77
|
+
* and `Promise.race` argument order.
|
|
78
|
+
*
|
|
79
|
+
* Index is used rather than the `eventId` string because `eventId` is an
|
|
80
|
+
* opaque, world-assigned value not guaranteed to sort in creation order
|
|
81
|
+
* (only the bundled ULID worlds happen to).
|
|
82
|
+
*
|
|
83
|
+
* Optional so older/out-of-tree contexts (and lightweight test harnesses)
|
|
84
|
+
* that do not initialize it degrade gracefully to the previous behavior.
|
|
85
|
+
*/
|
|
86
|
+
pendingDeliveryBarriers?: Map<number, DeliveryBarrierEntry>;
|
|
87
|
+
/**
|
|
88
|
+
* Per-run memoization cache for hydrated step return values, keyed by the
|
|
89
|
+
* `step_completed` event id. Owned by the inline replay loop in `runtime.ts`
|
|
90
|
+
* and threaded through each `runWorkflow` call so it survives across replay
|
|
91
|
+
* iterations of the SAME run (a fresh context is created each iteration) but
|
|
92
|
+
* never leaks across unrelated runs.
|
|
93
|
+
*
|
|
94
|
+
* On replay K of a sequential N-step workflow, the step consumer would
|
|
95
|
+
* otherwise re-decrypt and re-parse the results of all K already-completed
|
|
96
|
+
* steps — O(N²) across an invocation. This cache makes a completed step's
|
|
97
|
+
* result available in O(1) on subsequent replays. Only primitive results are
|
|
98
|
+
* memoized, so a shared reference can never let one replay's mutation leak
|
|
99
|
+
* into the next; see `step-hydration-cache.ts` for the full rationale.
|
|
100
|
+
*
|
|
101
|
+
* Optional so contexts that do not initialize it (test harnesses) degrade
|
|
102
|
+
* gracefully to re-hydrating every replay — identical to previous behavior.
|
|
103
|
+
*/
|
|
104
|
+
stepHydrationCache?: StepHydrationCache;
|
|
105
|
+
}
|
|
106
|
+
/** The kind of branch-deciding delivery a barrier represents. */
|
|
107
|
+
export type DeliveryKind = 'hook' | 'wait';
|
|
108
|
+
interface DeliveryBarrierEntry {
|
|
109
|
+
kind: DeliveryKind;
|
|
110
|
+
/** Resolves once this delivery has resolved to the workflow. */
|
|
111
|
+
delivered: Promise<void>;
|
|
53
112
|
}
|
|
113
|
+
/**
|
|
114
|
+
* Awaits, in strict event-log order, every still-registered delivery whose
|
|
115
|
+
* index is earlier than `eventIndex` AND whose kind is in `deferBehindKinds`,
|
|
116
|
+
* so that this resolution is handed to the workflow only after all relevant
|
|
117
|
+
* earlier-in-log deliveries have been. This is what keeps a `Promise.race`
|
|
118
|
+
* deterministic and aligned with the committed event log, independent of
|
|
119
|
+
* microtask-hop counts, hydration time, or race-argument order.
|
|
120
|
+
*
|
|
121
|
+
* `deferBehindKinds` is the opposite kind(s): a hook defers behind earlier
|
|
122
|
+
* WAITS (not earlier hooks — those are sequential same-entity payloads), a
|
|
123
|
+
* wait defers behind earlier HOOKS.
|
|
124
|
+
*/
|
|
125
|
+
export declare function awaitEarlierDeliveries(ctx: WorkflowOrchestratorContext, eventIndex: number | undefined, deferBehindKinds: readonly DeliveryKind[]): Promise<void>;
|
|
126
|
+
/** Handle for a registered branch-deciding delivery barrier. */
|
|
127
|
+
export interface DeliveryBarrier {
|
|
128
|
+
/**
|
|
129
|
+
* Mark this delivery as delivered to the workflow. Resolves its
|
|
130
|
+
* `delivered` promise so any later-in-log opposite-kind delivery gated on
|
|
131
|
+
* it (via {@link awaitEarlierDeliveries}) may proceed, and removes it from
|
|
132
|
+
* the registry. Idempotent.
|
|
133
|
+
*/
|
|
134
|
+
markDelivered: () => void;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Register a branch-deciding delivery at its event-log index so that later
|
|
138
|
+
* opposite-kind deliveries can be ordered strictly after it. Returns an inert
|
|
139
|
+
* handle when `pendingDeliveryBarriers` is not initialized.
|
|
140
|
+
*
|
|
141
|
+
* To guarantee a later delivery gated on this one can never hang when this
|
|
142
|
+
* delivery is abandoned (the workflow took a different branch or is
|
|
143
|
+
* suspending and never observes it), the barrier auto-resolves at idle.
|
|
144
|
+
*/
|
|
145
|
+
export declare function registerDeliveryBarrier(ctx: WorkflowOrchestratorContext, eventIndex: number | undefined, kind: DeliveryKind): DeliveryBarrier;
|
|
54
146
|
/**
|
|
55
147
|
* Schedule a callback to fire only after all pending data deliveries
|
|
56
148
|
* (step results, hook payloads) and async deserialization have completed.
|
|
@@ -58,6 +150,19 @@ export interface WorkflowOrchestratorContext {
|
|
|
58
150
|
* if > 0, wait for promiseQueue → repeat. This handles the multi-round
|
|
59
151
|
* delivery pattern where each hook payload delivery cycle appends new
|
|
60
152
|
* async work to the promiseQueue.
|
|
153
|
+
*
|
|
154
|
+
* The initial `setTimeout(0)` macrotask is load-bearing and must NOT be
|
|
155
|
+
* downgraded to a microtask (`queueMicrotask`/`Promise.resolve().then`).
|
|
156
|
+
* `pendingDeliveries` only guards the host-side hydration window; between a
|
|
157
|
+
* delivery's `resolve()` and the workflow VM body running its continuation to
|
|
158
|
+
* register the next subscriber, `pendingDeliveries` is already 0 even though
|
|
159
|
+
* the VM is mid-reaction. Node does not guarantee a microtask scheduled in
|
|
160
|
+
* the host context settles after the cross-VM promise chain (resolve in host
|
|
161
|
+
* → workflow code in VM → subscribe back in host); the macrotask boundary
|
|
162
|
+
* gives that chain time to run, so the suspension does not preempt a sibling
|
|
163
|
+
* delivery still in flight. Empirically, replacing it with `queueMicrotask`
|
|
164
|
+
* breaks hook/sleep `Promise.race` ordering (CorruptedEventLogError).
|
|
61
165
|
*/
|
|
62
166
|
export declare function scheduleWhenIdle(ctx: WorkflowOrchestratorContext, fn: () => void): void;
|
|
167
|
+
export {};
|
|
63
168
|
//# sourceMappingURL=private.d.ts.map
|
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;
|
|
1
|
+
{"version":3,"file":"private.d.ts","sourceRoot":"","sources":["../src/private.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,MAAM,MAAM,YAAY,CACtB,IAAI,SAAS,YAAY,EAAE,GAAG,GAAG,EAAE,EACnC,MAAM,SAAS,YAAY,GAAG,OAAO,GAAG,OAAO,IAC7C,CAAC,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG;IACzC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAsEF;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,QAGxE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAoBxE;AAOD,MAAM,WAAW,2BAA2B;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,SAAS,GAAG,SAAS,CAAC;IACrC,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,cAAc,EAAE,cAAc,CAAC;IAC/B;;;OAGG;IACH,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACzC,eAAe,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACxC,YAAY,EAAE,MAAM,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,MAAM,CAAC;IAC7B;;;;;;OAMG;IACH,YAAY,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B;;;;;;OAMG;IACH,iBAAiB,EAAE,MAAM,CAAC;IAC1B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6BG;IACH,uBAAuB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;IAC5D;;;;;;;;;;;;;;;;OAgBG;IACH,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;CACzC;AAED,iEAAiE;AACjE,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,CAAC;AAE3C,UAAU,oBAAoB;IAC5B,IAAI,EAAE,YAAY,CAAC;IACnB,gEAAgE;IAChE,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,2BAA2B,EAChC,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,gBAAgB,EAAE,SAAS,YAAY,EAAE,GACxC,OAAO,CAAC,IAAI,CAAC,CAkBf;AAED,gEAAgE;AAChE,MAAM,WAAW,eAAe;IAC9B;;;;;OAKG;IACH,aAAa,EAAE,MAAM,IAAI,CAAC;CAC3B;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,2BAA2B,EAChC,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,IAAI,EAAE,YAAY,GACjB,eAAe,CA6BjB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,2BAA2B,EAChC,EAAE,EAAE,MAAM,IAAI,GACb,IAAI,CAYN"}
|
package/dist/private.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Utils used by the bundler when transforming code
|
|
3
3
|
*/
|
|
4
|
+
import { withResolvers } from '@workflow/utils';
|
|
4
5
|
const RegisteredStepsKey = Symbol.for('@workflow/core//registeredSteps');
|
|
5
6
|
const globalSymbols = globalThis;
|
|
6
7
|
// biome-ignore lint/suspicious/noAssignInExpressions: /
|
|
7
8
|
const registeredSteps = (globalSymbols[RegisteredStepsKey] ??= new Map());
|
|
8
|
-
const
|
|
9
|
+
const BUILTIN_RESPONSE_STEP_NAMES = new Set([
|
|
9
10
|
'__builtin_response_array_buffer',
|
|
10
11
|
'__builtin_response_json',
|
|
11
12
|
'__builtin_response_text',
|
|
@@ -41,7 +42,7 @@ function getStepIdAliasCandidates(stepId) {
|
|
|
41
42
|
return Array.from(modulePathAliases, (aliasModulePath) => `step//${aliasModulePath}//${fnName}`);
|
|
42
43
|
}
|
|
43
44
|
function getBuiltinResponseStepAlias(stepId) {
|
|
44
|
-
if (!
|
|
45
|
+
if (!BUILTIN_RESPONSE_STEP_NAMES.has(stepId)) {
|
|
45
46
|
return undefined;
|
|
46
47
|
}
|
|
47
48
|
for (const [registeredStepId, stepFn] of registeredSteps.entries()) {
|
|
@@ -85,6 +86,70 @@ export function getStepFunction(stepId) {
|
|
|
85
86
|
}
|
|
86
87
|
return undefined;
|
|
87
88
|
}
|
|
89
|
+
/**
|
|
90
|
+
* Awaits, in strict event-log order, every still-registered delivery whose
|
|
91
|
+
* index is earlier than `eventIndex` AND whose kind is in `deferBehindKinds`,
|
|
92
|
+
* so that this resolution is handed to the workflow only after all relevant
|
|
93
|
+
* earlier-in-log deliveries have been. This is what keeps a `Promise.race`
|
|
94
|
+
* deterministic and aligned with the committed event log, independent of
|
|
95
|
+
* microtask-hop counts, hydration time, or race-argument order.
|
|
96
|
+
*
|
|
97
|
+
* `deferBehindKinds` is the opposite kind(s): a hook defers behind earlier
|
|
98
|
+
* WAITS (not earlier hooks — those are sequential same-entity payloads), a
|
|
99
|
+
* wait defers behind earlier HOOKS.
|
|
100
|
+
*/
|
|
101
|
+
export async function awaitEarlierDeliveries(ctx, eventIndex, deferBehindKinds) {
|
|
102
|
+
// Defensive: tolerate contexts that predate this field (test harnesses).
|
|
103
|
+
if (eventIndex === undefined ||
|
|
104
|
+
!ctx.pendingDeliveryBarriers ||
|
|
105
|
+
ctx.pendingDeliveryBarriers.size === 0) {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
const earlier = [];
|
|
109
|
+
for (const [index, entry] of ctx.pendingDeliveryBarriers) {
|
|
110
|
+
if (index < eventIndex && deferBehindKinds.includes(entry.kind)) {
|
|
111
|
+
earlier.push(entry.delivered);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
if (earlier.length > 0) {
|
|
115
|
+
await Promise.all(earlier);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Register a branch-deciding delivery at its event-log index so that later
|
|
120
|
+
* opposite-kind deliveries can be ordered strictly after it. Returns an inert
|
|
121
|
+
* handle when `pendingDeliveryBarriers` is not initialized.
|
|
122
|
+
*
|
|
123
|
+
* To guarantee a later delivery gated on this one can never hang when this
|
|
124
|
+
* delivery is abandoned (the workflow took a different branch or is
|
|
125
|
+
* suspending and never observes it), the barrier auto-resolves at idle.
|
|
126
|
+
*/
|
|
127
|
+
export function registerDeliveryBarrier(ctx, eventIndex, kind) {
|
|
128
|
+
const barriers = ctx.pendingDeliveryBarriers;
|
|
129
|
+
if (!barriers || eventIndex === undefined) {
|
|
130
|
+
return { markDelivered: () => { } };
|
|
131
|
+
}
|
|
132
|
+
let done = false;
|
|
133
|
+
const { promise, resolve } = withResolvers();
|
|
134
|
+
const entry = { kind, delivered: promise };
|
|
135
|
+
barriers.set(eventIndex, entry);
|
|
136
|
+
const finish = () => {
|
|
137
|
+
if (done) {
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
done = true;
|
|
141
|
+
if (barriers.get(eventIndex) === entry) {
|
|
142
|
+
barriers.delete(eventIndex);
|
|
143
|
+
}
|
|
144
|
+
resolve();
|
|
145
|
+
};
|
|
146
|
+
// Safety net: if this delivery is never delivered to the workflow (its
|
|
147
|
+
// branch was not taken / the run is suspending), resolve at idle so a
|
|
148
|
+
// later opposite-kind delivery gated on it cannot deadlock and the
|
|
149
|
+
// registry cannot leak an entry per abandoned delivery.
|
|
150
|
+
scheduleWhenIdle(ctx, finish);
|
|
151
|
+
return { markDelivered: finish };
|
|
152
|
+
}
|
|
88
153
|
/**
|
|
89
154
|
* Schedule a callback to fire only after all pending data deliveries
|
|
90
155
|
* (step results, hook payloads) and async deserialization have completed.
|
|
@@ -92,6 +157,18 @@ export function getStepFunction(stepId) {
|
|
|
92
157
|
* if > 0, wait for promiseQueue → repeat. This handles the multi-round
|
|
93
158
|
* delivery pattern where each hook payload delivery cycle appends new
|
|
94
159
|
* async work to the promiseQueue.
|
|
160
|
+
*
|
|
161
|
+
* The initial `setTimeout(0)` macrotask is load-bearing and must NOT be
|
|
162
|
+
* downgraded to a microtask (`queueMicrotask`/`Promise.resolve().then`).
|
|
163
|
+
* `pendingDeliveries` only guards the host-side hydration window; between a
|
|
164
|
+
* delivery's `resolve()` and the workflow VM body running its continuation to
|
|
165
|
+
* register the next subscriber, `pendingDeliveries` is already 0 even though
|
|
166
|
+
* the VM is mid-reaction. Node does not guarantee a microtask scheduled in
|
|
167
|
+
* the host context settles after the cross-VM promise chain (resolve in host
|
|
168
|
+
* → workflow code in VM → subscribe back in host); the macrotask boundary
|
|
169
|
+
* gives that chain time to run, so the suspension does not preempt a sibling
|
|
170
|
+
* delivery still in flight. Empirically, replacing it with `queueMicrotask`
|
|
171
|
+
* breaks hook/sleep `Promise.race` ordering (CorruptedEventLogError).
|
|
95
172
|
*/
|
|
96
173
|
export function scheduleWhenIdle(ctx, fn) {
|
|
97
174
|
const check = () => {
|
|
@@ -107,4 +184,4 @@ export function scheduleWhenIdle(ctx, fn) {
|
|
|
107
184
|
};
|
|
108
185
|
setTimeout(check, 0);
|
|
109
186
|
}
|
|
110
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpdmF0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9wcml2YXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBZUgsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7QUFFekUsTUFBTSxhQUFhLEdBRWYsVUFBVSxDQUFDO0FBRWYsd0RBQXdEO0FBQ3hELE1BQU0sZUFBZSxHQUFHLENBQUMsYUFBYSxDQUFDLGtCQUFrQixDQUFDLEtBQUssSUFBSSxHQUFHLEVBR25FLENBQUMsQ0FBQztBQUVMLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDakMsaUNBQWlDO0lBQ2pDLHlCQUF5QjtJQUN6Qix5QkFBeUI7Q0FDMUIsQ0FBQyxDQUFDO0FBRUgsU0FBUyx3QkFBd0IsQ0FBQyxNQUFjO0lBQzlDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDakMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssTUFBTSxFQUFFLENBQUM7UUFDOUMsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVCLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4QixNQUFNLGlCQUFpQixHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFFNUMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxlQUF1QixFQUFFLEVBQUU7UUFDM0MsSUFBSSxlQUFlLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDbkMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3pDLENBQUM7SUFDSCxDQUFDLENBQUM7SUFFRixJQUFJLFVBQVUsQ0FBQyxVQUFVLENBQUMsY0FBYyxD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akIsSUFBSSxHQUFHLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDOUIsaUVBQWlFO1lBQ2pFLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtnQkFDekIsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN2QixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7YUFBTSxDQUFDO1lBQ04sRUFBRSxFQUFFLENBQUM7UUFDUCxDQUFDO0lBQ0gsQ0FBQyxDQUFDO0lBQ0YsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN2QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBVdGlscyB1c2VkIGJ5IHRoZSBidW5kbGVyIHdoZW4gdHJhbnNmb3JtaW5nIGNvZGVcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IENyeXB0b0tleSB9IGZyb20gJy4vZW5jcnlwdGlvbi5qcyc7XG5pbXBvcnQgdHlwZSB7IEV2ZW50c0NvbnN1bWVyIH0gZnJvbSAnLi9ldmVudHMtY29uc3VtZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBRdWV1ZUl0ZW0gfSBmcm9tICcuL2dsb2JhbC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNlcmlhbGl6YWJsZSB9IGZyb20gJy4vc2NoZW1hcy5qcyc7XG5cbmV4cG9ydCB0eXBlIFN0ZXBGdW5jdGlvbjxcbiAgQXJncyBleHRlbmRzIFNlcmlhbGl6YWJsZVtdID0gYW55W10sXG4gIFJlc3VsdCBleHRlbmRzIFNlcmlhbGl6YWJsZSB8IHVua25vd24gPSB1bmtub3duLFxuPiA9ICgoLi4uYXJnczogQXJncykgPT4gUHJvbWlzZTxSZXN1bHQ+KSAmIHtcbiAgbWF4UmV0cmllcz86IG51bWJlcjtcbiAgc3RlcElkPzogc3RyaW5nO1xufTtcblxuY29uc3QgUmVnaXN0ZXJlZFN0ZXBzS2V5ID0gU3ltYm9sLmZvcignQHdvcmtmbG93L2NvcmUvL3JlZ2lzdGVyZWRTdGVwcycpO1xuXG5jb25zdCBnbG9iYWxTeW1ib2xzOiB0eXBlb2YgZ2xvYmFsVGhpcyAmIHtcbiAgW1JlZ2lzdGVyZWRTdGVwc0tleV0/OiBNYXA8c3RyaW5nLCBTdGVwRnVuY3Rpb24+O1xufSA9IGdsb2JhbFRoaXM7XG5cbi8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9Bc3NpZ25JbkV4cHJlc3Npb25zOiAvXG5jb25zdCByZWdpc3RlcmVkU3RlcHMgPSAoZ2xvYmFsU3ltYm9sc1tSZWdpc3RlcmVkU3RlcHNLZXldID8/PSBuZXcgTWFwPFxuICBzdHJpbmcsXG4gIFN0ZXBGdW5jdGlvblxuPigpKTtcblxuY29uc3QgQlVJTFRJTl9TVEVQX05BTUVTID0gbmV3IFNldChbXG4gICdfX2J1aWx0aW5fcmVzcG9uc2VfYXJyYXlfYnVmZmVyJyxcbiAgJ19fYnVpbHRpbl9yZXNwb25zZV9qc29uJyxcbiAgJ19fYnVpbHRpbl9yZXNwb25zZV90ZXh0Jyxcbl0pO1xuXG5mdW5jdGlvbiBnZXRTdGVwSWRBbGlhc0NhbmRpZGF0ZXMoc3RlcElkOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHBhcnRzID0gc3RlcElkLnNwbGl0KCcvLycpO1xuICBpZiAocGFydHMubGVuZ3RoICE9PSAzIHx8IHBhcnRzWzBdICE9PSAnc3RlcCcpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBtb2R1bGVQYXRoID0gcGFydHNbMV07XG4gIGNvbnN0IGZuTmFtZSA9IHBhcnRzWzJdO1xuICBjb25zdCBtb2R1bGVQYXRoQWxpYXNlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGNvbnN0IGFkZEFsaWFzID0gKGFsaWFzTW9kdWxlUGF0aDogc3RyaW5nKSA9PiB7XG4gICAgaWYgKGFsaWFzTW9kdWxlUGF0aCAhPT0gbW9kdWxlUGF0aCkge1xuICAgICAgbW9kdWxlUGF0aEFsaWFzZXMuYWRkKGFsaWFzTW9kdWxlUGF0aCk7XG4gICAgfVxuICB9O1xuXG4gIGlmIChtb2R1bGVQYXRoLnN0YXJ0c1dpdGgoJy4vd29ya2Zsb3dzLycpKSB7XG4gICAgY29uc3Qgd29ya2Zsb3dSZWxhdGl2ZVBhdGggPSBtb2R1bGVQYXRoLnNsaWNlKCcuLycubGVuZ3RoKTtcbiAgICBhZGRBbGlhcyhgLi9leGFtcGxlLyR7d29ya2Zsb3dSZWxhdGl2ZVBhdGh9YCk7XG4gICAgYWRkQWxpYXMoYC4vc3JjLyR7d29ya2Zsb3dSZWxhdGl2ZVBhdGh9YCk7XG4gIH0gZWxzZSBpZiAobW9kdWxlUGF0aC5zdGFydHNXaXRoKCcuL2V4YW1wbGUvd29ya2Zsb3dzLycpKSB7XG4gICAgY29uc3Qgd29ya2Zsb3dSZWxhdGl2ZVBhdGggPSBtb2R1bGVQYXRoLnNsaWNlKCcuL2V4YW1wbGUvJy5sZW5ndGgpO1xuICAgIGFkZEFsaWFzKGAuLyR7d29ya2Zsb3dSZWxhdGl2ZVBhdGh9YCk7XG4gICAgYWRkQWxpYXMoYC4vc3JjLyR7d29ya2Zsb3dSZWxhdGl2ZVBhdGh9YCk7XG4gIH0gZWxzZSBpZiAobW9kdWxlUGF0aC5zdGFydHNXaXRoKCcuL3NyYy93b3JrZmxvd3MvJykpIHtcbiAgICBjb25zdCB3b3JrZmxvd1JlbGF0aXZlUGF0aCA9IG1vZHVsZVBhdGguc2xpY2UoJy4vc3JjLycubGVuZ3RoKTtcbiAgICBhZGRBbGlhcyhgLi8ke3dvcmtmbG93UmVsYXRpdmVQYXRofWApO1xuICAgIGFkZEFsaWFzKGAuL2V4YW1wbGUvJHt3b3JrZmxvd1JlbGF0aXZlUGF0aH1gKTtcbiAgfVxuXG4gIHJldHVybiBBcnJheS5mcm9tKFxuICAgIG1vZHVsZVBhdGhBbGlhc2VzLFxuICAgIChhbGlhc01vZHVsZVBhdGgpID0+IGBzdGVwLy8ke2FsaWFzTW9kdWxlUGF0aH0vLyR7Zm5OYW1lfWBcbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0QnVpbHRpblJlc3BvbnNlU3RlcEFsaWFzKHN0ZXBJZDogc3RyaW5nKTogU3RlcEZ1bmN0aW9uIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFCVUlMVElOX1NURVBfTkFNRVMuaGFzKHN0ZXBJZCkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgZm9yIChjb25zdCBbcmVnaXN0ZXJlZFN0ZXBJZCwgc3RlcEZuXSBvZiByZWdpc3RlcmVkU3RlcHMuZW50cmllcygpKSB7XG4gICAgaWYgKHJlZ2lzdGVyZWRTdGVwSWQuZW5kc1dpdGgoYC8vJHtzdGVwSWR9YCkpIHtcbiAgICAgIHJldHVybiBzdGVwRm47XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZWdpc3RlciBhIHN0ZXAgZnVuY3Rpb24gdG8gYmUgc2VydmVkIGluIHRoZSBzZXJ2ZXIgYnVuZGxlLlxuICogQWxzbyBzZXRzIHRoZSBzdGVwSWQgcHJvcGVydHkgb24gdGhlIGZ1bmN0aW9uIGZvciBzZXJpYWxpemF0aW9uIHN1cHBvcnQuXG4gKlxuICogTm90ZTogVGhlIFNXQyBjb21waWxlciBwbHVnaW4gbm8gbG9uZ2VyIGdlbmVyYXRlcyBjYWxscyB0byB0aGlzIGZ1bmN0aW9uLlxuICogU3RlcCByZWdpc3RyYXRpb24gaXMgbm93IGlubGluZWQgYXMgYSBzZWxmLWNvbnRhaW5lZCBJSUZFIHRoYXQgd3JpdGVzXG4gKiBkaXJlY3RseSB0byB0aGUgZ2xvYmFsIE1hcCBhdCBTeW1ib2wuZm9yKFwiQHdvcmtmbG93L2NvcmUvL3JlZ2lzdGVyZWRTdGVwc1wiKS5cbiAqIFRoaXMgZnVuY3Rpb24gaXMga2VwdCBmb3IgaW50ZXJuYWwvdGVzdCB1c2Ugb25seS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyU3RlcEZ1bmN0aW9uKHN0ZXBJZDogc3RyaW5nLCBzdGVwRm46IFN0ZXBGdW5jdGlvbikge1xuICByZWdpc3RlcmVkU3RlcHMuc2V0KHN0ZXBJZCwgc3RlcEZuKTtcbiAgc3RlcEZuLnN0ZXBJZCA9IHN0ZXBJZDtcbn1cblxuLyoqXG4gKiBGaW5kIGEgcmVnaXN0ZXJlZCBzdGVwIGZ1bmN0aW9uIGJ5IG5hbWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN0ZXBGdW5jdGlvbihzdGVwSWQ6IHN0cmluZyk6IFN0ZXBGdW5jdGlvbiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRpcmVjdE1hdGNoID0gcmVnaXN0ZXJlZFN0ZXBzLmdldChzdGVwSWQpO1xuICBpZiAoZGlyZWN0TWF0Y2gpIHtcbiAgICByZXR1cm4gZGlyZWN0TWF0Y2g7XG4gIH1cblxuICAvLyBTdXBwb3J0IGVxdWl2YWxlbnQgd29ya2Zsb3cgcGF0aCBhbGlhc2VzIGluIG1peGVkIHN5bWxpbmsgZW52aXJvbm1lbnRzLlxuICBmb3IgKGNvbnN0IGFsaWFzU3RlcElkIG9mIGdldFN0ZXBJZEFsaWFzQ2FuZGlkYXRlcyhzdGVwSWQpKSB7XG4gICAgY29uc3QgYWxpYXNNYXRjaCA9IHJlZ2lzdGVyZWRTdGVwcy5nZXQoYWxpYXNTdGVwSWQpO1xuICAgIGlmIChhbGlhc01hdGNoKSB7XG4gICAgICByZXR1cm4gYWxpYXNNYXRjaDtcbiAgICB9XG4gIH1cblxuICBjb25zdCBidWlsdGluQWxpYXNNYXRjaCA9IGdldEJ1aWx0aW5SZXNwb25zZVN0ZXBBbGlhcyhzdGVwSWQpO1xuICBpZiAoYnVpbHRpbkFsaWFzTWF0Y2gpIHtcbiAgICByZXR1cm4gYnVpbHRpbkFsaWFzTWF0Y2g7XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vLyBOb3RlOiBfX3ByaXZhdGVfZ2V0Q2xvc3VyZVZhcnMgaXMgbm8gbG9uZ2VyIHJlLWV4cG9ydGVkIGhlcmUuXG4vLyBUaGUgU1dDIGNvbXBpbGVyIHBsdWdpbiBub3cgaW5saW5lcyBjbG9zdXJlIHZhcmlhYmxlIGFjY2VzcyBhcyBhXG4vLyBzZWxmLWNvbnRhaW5lZCBJSUZFIHRoYXQgcmVhZHMgZGlyZWN0bHkgZnJvbSB0aGUgZ2xvYmFsIEFzeW5jTG9jYWxTdG9yYWdlXG4vLyBhdCBTeW1ib2wuZm9yKFwiV09SS0ZMT1dfU1RFUF9DT05URVhUX1NUT1JBR0VcIikuXG5cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2Zsb3dPcmNoZXN0cmF0b3JDb250ZXh0IHtcbiAgcnVuSWQ6IHN0cmluZztcbiAgZW5jcnlwdGlvbktleTogQ3J5cHRvS2V5IHwgdW5kZWZpbmVkO1xuICBnbG9iYWxUaGlzOiB0eXBlb2YgZ2xvYmFsVGhpcztcbiAgZXZlbnRzQ29uc3VtZXI6IEV2ZW50c0NvbnN1bWVyO1xuICAvKipcbiAgICogTWFwIG9mIHBlbmRpbmcgaW52b2NhdGlvbnMga2V5ZWQgYnkgY29ycmVsYXRpb25JZC5cbiAgICogVXNpbmcgTWFwIGluc3RlYWQgb2YgQXJyYXkgZm9yIE8oMSkgbG9va3VwL2RlbGV0ZSBvcGVyYXRpb25zLlxuICAgKi9cbiAgaW52b2NhdGlvbnNRdWV1ZTogTWFwPHN0cmluZywgUXVldWVJdGVtPjtcbiAgb25Xb3JrZmxvd0Vycm9yOiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkO1xuICBnZW5lcmF0ZVVsaWQ6ICgpID0+IHN0cmluZztcbiAgZ2VuZXJhdGVOYW5vaWQ6ICgpID0+IHN0cmluZztcbiAgLyoqXG4gICAqIFNlcXVlbnRpYWwgcHJvbWlzZSBxdWV1ZSB0aGF0IGVuc3VyZXMgYWxsIGV2ZW50LWRyaXZlbiBwcm9taXNlIHJlc29sdXRpb25zXG4gICAqIChzdGVwIHJlc3VsdHMsIGhvb2sgcGF5bG9hZHMsIGZhaWx1cmVzLCBzdXNwZW5zaW9ucykgaGFwcGVuIGluIGV2ZW50IGxvZ1xuICAgKiBvcmRlci4gRXZlcnkgcmVzb2x2ZSwgcmVqZWN0LCBvciB3b3JrZmxvdyBlcnJvciBpcyBjaGFpbmVkIHRocm91Z2ggdGhpc1xuICAgKiBxdWV1ZSBzbyB0aGF0IGV2ZW4gaWYgaW5kaXZpZHVhbCBvcGVyYXRpb25zIHRha2UgdmFyaWFibGUgdGltZSAoZS5nLixcbiAgICogYXN5bmMgZGVjcnlwdGlvbiksIHByb21pc2VzIHJlc29sdmUgZGV0ZXJtaW5pc3RpY2FsbHkuXG4gICAqL1xuICBwcm9taXNlUXVldWU6IFByb21pc2U8dm9pZD47XG4gIC8qKlxuICAgKiBDb3VudGVyIG9mIGluLWZsaWdodCBhc3luYyBkYXRhIGRlbGl2ZXJ5IG9wZXJhdGlvbnMgKHN0ZXAgcmVzdWx0XG4gICAqIGh5ZHJhdGlvbiwgaG9vayBwYXlsb2FkIGh5ZHJhdGlvbikuIFN1c3BlbnNpb25zIG11c3Qgd2FpdCBmb3IgdGhpc1xuICAgKiB0byByZWFjaCAwIGJlZm9yZSBmaXJpbmcsIHRvIGF2b2lkIHByZWVtcHRpbmcgZGF0YSBkZWxpdmVyeS5cbiAgICovXG4gIHBlbmRpbmdEZWxpdmVyaWVzOiBudW1iZXI7XG59XG5cbi8qKlxuICogU2NoZWR1bGUgYSBjYWxsYmFjayB0byBmaXJlIG9ubHkgYWZ0ZXIgYWxsIHBlbmRpbmcgZGF0YSBkZWxpdmVyaWVzXG4gKiAoc3RlcCByZXN1bHRzLCBob29rIHBheWxvYWRzKSBhbmQgYXN5bmMgZGVzZXJpYWxpemF0aW9uIGhhdmUgY29tcGxldGVkLlxuICogVXNlcyBhIHBvbGxpbmcgbG9vcDogc2V0VGltZW91dCgwKSDihpIgY2hlY2sgcGVuZGluZ0RlbGl2ZXJpZXMg4oaSXG4gKiBpZiA+IDAsIHdhaXQgZm9yIHByb21pc2VRdWV1ZSDihpIgcmVwZWF0LiBUaGlzIGhhbmRsZXMgdGhlIG11bHRpLXJvdW5kXG4gKiBkZWxpdmVyeSBwYXR0ZXJuIHdoZXJlIGVhY2ggaG9vayBwYXlsb2FkIGRlbGl2ZXJ5IGN5Y2xlIGFwcGVuZHMgbmV3XG4gKiBhc3luYyB3b3JrIHRvIHRoZSBwcm9taXNlUXVldWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzY2hlZHVsZVdoZW5JZGxlKFxuICBjdHg6IFdvcmtmbG93T3JjaGVzdHJhdG9yQ29udGV4dCxcbiAgZm46ICgpID0+IHZvaWRcbik6IHZvaWQge1xuICBjb25zdCBjaGVjayA9ICgpID0+IHtcbiAgICBpZiAoY3R4LnBlbmRpbmdEZWxpdmVyaWVzID4gMCkge1xuICAgICAgLy8gU3RpbGwgZGVsaXZlcmluZyBkYXRhIOKAlCB3YWl0IGZvciBxdWV1ZSB0byBkcmFpbiwgdGhlbiByZS1jaGVja1xuICAgICAgY3R4LnByb21pc2VRdWV1ZS50aGVuKCgpID0+IHtcbiAgICAgICAgc2V0VGltZW91dChjaGVjaywgMCk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm4oKTtcbiAgICB9XG4gIH07XG4gIHNldFRpbWVvdXQoY2hlY2ssIDApO1xufVxuIl19
|
|
187
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpdmF0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9wcml2YXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBZWhELE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO0FBRXpFLE1BQU0sYUFBYSxHQUVmLFVBQVUsQ0FBQztBQUVmLHdEQUF3RDtBQUN4RCxNQUFNLGVBQWUsR0FBRyxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLElBQUksR0FBRyxFQUduRSxDQUFDLENBQUM7QUFFTCxNQUFNLDJCQUEyQixHQUFHLElBQUksR0FBRyxDQUFDO0lBQzFDLGlDQUFpQztJQUNqQyx5QkFBeUI7SUFDekIseUJBQXlCO0NBQzFCLENBQUMsQ0FBQztBQUVILFNBQVMsd0JBQXdCLENBQUMsTUFBYztJQUM5QyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pDLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLE1BQU0sRUFBRSxDQUFDO1FBQzlDLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1QixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEIsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBRTVDLE1BQU0sUUFBUSxHQUFHLENBQUMsZUFBdUIsRUFBRSxFQUFFO1FBQzNDLElBQUksZUFBZSxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQ25DLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN6QyxDQUFDO0lBQ0gsQ0FB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aWxzIHVzZWQgYnkgdGhlIGJ1bmRsZXIgd2hlbiB0cmFuc2Zvcm1pbmcgY29kZVxuICovXG5cbmltcG9ydCB7IHdpdGhSZXNvbHZlcnMgfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMnO1xuaW1wb3J0IHR5cGUgeyBDcnlwdG9LZXkgfSBmcm9tICcuL2VuY3J5cHRpb24uanMnO1xuaW1wb3J0IHR5cGUgeyBFdmVudHNDb25zdW1lciB9IGZyb20gJy4vZXZlbnRzLWNvbnN1bWVyLmpzJztcbmltcG9ydCB0eXBlIHsgUXVldWVJdGVtIH0gZnJvbSAnLi9nbG9iYWwuanMnO1xuaW1wb3J0IHR5cGUgeyBTZXJpYWxpemFibGUgfSBmcm9tICcuL3NjaGVtYXMuanMnO1xuaW1wb3J0IHR5cGUgeyBTdGVwSHlkcmF0aW9uQ2FjaGUgfSBmcm9tICcuL3N0ZXAtaHlkcmF0aW9uLWNhY2hlLmpzJztcblxuZXhwb3J0IHR5cGUgU3RlcEZ1bmN0aW9uPFxuICBBcmdzIGV4dGVuZHMgU2VyaWFsaXphYmxlW10gPSBhbnlbXSxcbiAgUmVzdWx0IGV4dGVuZHMgU2VyaWFsaXphYmxlIHwgdW5rbm93biA9IHVua25vd24sXG4+ID0gKCguLi5hcmdzOiBBcmdzKSA9PiBQcm9taXNlPFJlc3VsdD4pICYge1xuICBtYXhSZXRyaWVzPzogbnVtYmVyO1xuICBzdGVwSWQ/OiBzdHJpbmc7XG59O1xuXG5jb25zdCBSZWdpc3RlcmVkU3RlcHNLZXkgPSBTeW1ib2wuZm9yKCdAd29ya2Zsb3cvY29yZS8vcmVnaXN0ZXJlZFN0ZXBzJyk7XG5cbmNvbnN0IGdsb2JhbFN5bWJvbHM6IHR5cGVvZiBnbG9iYWxUaGlzICYge1xuICBbUmVnaXN0ZXJlZFN0ZXBzS2V5XT86IE1hcDxzdHJpbmcsIFN0ZXBGdW5jdGlvbj47XG59ID0gZ2xvYmFsVGhpcztcblxuLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0Fzc2lnbkluRXhwcmVzc2lvbnM6IC9cbmNvbnN0IHJlZ2lzdGVyZWRTdGVwcyA9IChnbG9iYWxTeW1ib2xzW1JlZ2lzdGVyZWRTdGVwc0tleV0gPz89IG5ldyBNYXA8XG4gIHN0cmluZyxcbiAgU3RlcEZ1bmN0aW9uXG4+KCkpO1xuXG5jb25zdCBCVUlMVElOX1JFU1BPTlNFX1NURVBfTkFNRVMgPSBuZXcgU2V0KFtcbiAgJ19fYnVpbHRpbl9yZXNwb25zZV9hcnJheV9idWZmZXInLFxuICAnX19idWlsdGluX3Jlc3BvbnNlX2pzb24nLFxuICAnX19idWlsdGluX3Jlc3BvbnNlX3RleHQnLFxuXSk7XG5cbmZ1bmN0aW9uIGdldFN0ZXBJZEFsaWFzQ2FuZGlkYXRlcyhzdGVwSWQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgcGFydHMgPSBzdGVwSWQuc3BsaXQoJy8vJyk7XG4gIGlmIChwYXJ0cy5sZW5ndGggIT09IDMgfHwgcGFydHNbMF0gIT09ICdzdGVwJykge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IG1vZHVsZVBhdGggPSBwYXJ0c1sxXTtcbiAgY29uc3QgZm5OYW1lID0gcGFydHNbMl07XG4gIGNvbnN0IG1vZHVsZVBhdGhBbGlhc2VzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgY29uc3QgYWRkQWxpYXMgPSAoYWxpYXNNb2R1bGVQYXRoOiBzdHJpbmcpID0+IHtcbiAgICBpZiAoYWxpYXNNb2R1bGVQYXRoICE9PSBtb2R1bGVQYXRoKSB7XG4gICAgICBtb2R1bGVQYXRoQWxpYXNlcy5hZGQoYWxpYXNNb2R1bGVQYXRoKTtcbiAgICB9XG4gIH07XG5cbiAgaWYgKG1vZHVsZVBhdGguc3RhcnRzV2l0aCgnLi93b3JrZmxvd3MvJykpIHtcbiAgICBjb25zdCB3b3JrZmxvd1JlbGF0aXZlUGF0aCA9IG1vZHVsZVBhdGguc2xpY2UoJy4vJy5sZW5ndGgpO1xuICAgIGFkZEFsaWFzKGAuL2V4YW1wbGUvJHt3b3JrZmxvd1JlbGF0aXZlUGF0aH1gKTtcbiAgICBhZGRBbGlhcyhgLi9zcmMvJHt3b3JrZmxvd1JlbGF0aXZlUGF0aH1gKTtcbiAgfSBlbHNlIGlmIChtb2R1bGVQYXRoLnN0YXJ0c1dpdGgoJy4vZXhhbXBsZS93b3JrZmxvd3MvJykpIHtcbiAgICBjb25zdCB3b3JrZmxvd1JlbGF0aXZlUGF0aCA9IG1vZHVsZVBhdGguc2xpY2UoJy4vZXhhbXBsZS8nLmxlbmd0aCk7XG4gICAgYWRkQWxpYXMoYC4vJHt3b3JrZmxvd1JlbGF0aXZlUGF0aH1gKTtcbiAgICBhZGRBbGlhcyhgLi9zcmMvJHt3b3JrZmxvd1JlbGF0aXZlUGF0aH1gKTtcbiAgfSBlbHNlIGlmIChtb2R1bGVQYXRoLnN0YXJ0c1dpdGgoJy4vc3JjL3dvcmtmbG93cy8nKSkge1xuICAgIGNvbnN0IHdvcmtmbG93UmVsYXRpdmVQYXRoID0gbW9kdWxlUGF0aC5zbGljZSgnLi9zcmMvJy5sZW5ndGgpO1xuICAgIGFkZEFsaWFzKGAuLyR7d29ya2Zsb3dSZWxhdGl2ZVBhdGh9YCk7XG4gICAgYWRkQWxpYXMoYC4vZXhhbXBsZS8ke3dvcmtmbG93UmVsYXRpdmVQYXRofWApO1xuICB9XG5cbiAgcmV0dXJuIEFycmF5LmZyb20oXG4gICAgbW9kdWxlUGF0aEFsaWFzZXMsXG4gICAgKGFsaWFzTW9kdWxlUGF0aCkgPT4gYHN0ZXAvLyR7YWxpYXNNb2R1bGVQYXRofS8vJHtmbk5hbWV9YFxuICApO1xufVxuXG5mdW5jdGlvbiBnZXRCdWlsdGluUmVzcG9uc2VTdGVwQWxpYXMoc3RlcElkOiBzdHJpbmcpOiBTdGVwRnVuY3Rpb24gfCB1bmRlZmluZWQge1xuICBpZiAoIUJVSUxUSU5fUkVTUE9OU0VfU1RFUF9OQU1FUy5oYXMoc3RlcElkKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBmb3IgKGNvbnN0IFtyZWdpc3RlcmVkU3RlcElkLCBzdGVwRm5dIG9mIHJlZ2lzdGVyZWRTdGVwcy5lbnRyaWVzKCkpIHtcbiAgICBpZiAocmVnaXN0ZXJlZFN0ZXBJZC5lbmRzV2l0aChgLy8ke3N0ZXBJZH1gKSkge1xuICAgICAgcmV0dXJuIHN0ZXBGbjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVyIGEgc3RlcCBmdW5jdGlvbiB0byBiZSBzZXJ2ZWQgaW4gdGhlIHNlcnZlciBidW5kbGUuXG4gKiBBbHNvIHNldHMgdGhlIHN0ZXBJZCBwcm9wZXJ0eSBvbiB0aGUgZnVuY3Rpb24gZm9yIHNlcmlhbGl6YXRpb24gc3VwcG9ydC5cbiAqXG4gKiBOb3RlOiBUaGUgU1dDIGNvbXBpbGVyIHBsdWdpbiBubyBsb25nZXIgZ2VuZXJhdGVzIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24uXG4gKiBTdGVwIHJlZ2lzdHJhdGlvbiBpcyBub3cgaW5saW5lZCBhcyBhIHNlbGYtY29udGFpbmVkIElJRkUgdGhhdCB3cml0ZXNcbiAqIGRpcmVjdGx5IHRvIHRoZSBnbG9iYWwgTWFwIGF0IFN5bWJvbC5mb3IoXCJAd29ya2Zsb3cvY29yZS8vcmVnaXN0ZXJlZFN0ZXBzXCIpLlxuICogVGhpcyBmdW5jdGlvbiBpcyBrZXB0IGZvciBpbnRlcm5hbC90ZXN0IHVzZSBvbmx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJTdGVwRnVuY3Rpb24oc3RlcElkOiBzdHJpbmcsIHN0ZXBGbjogU3RlcEZ1bmN0aW9uKSB7XG4gIHJlZ2lzdGVyZWRTdGVwcy5zZXQoc3RlcElkLCBzdGVwRm4pO1xuICBzdGVwRm4uc3RlcElkID0gc3RlcElkO1xufVxuXG4vKipcbiAqIEZpbmQgYSByZWdpc3RlcmVkIHN0ZXAgZnVuY3Rpb24gYnkgbmFtZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RlcEZ1bmN0aW9uKHN0ZXBJZDogc3RyaW5nKTogU3RlcEZ1bmN0aW9uIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZGlyZWN0TWF0Y2ggPSByZWdpc3RlcmVkU3RlcHMuZ2V0KHN0ZXBJZCk7XG4gIGlmIChkaXJlY3RNYXRjaCkge1xuICAgIHJldHVybiBkaXJlY3RNYXRjaDtcbiAgfVxuXG4gIC8vIFN1cHBvcnQgZXF1aXZhbGVudCB3b3JrZmxvdyBwYXRoIGFsaWFzZXMgaW4gbWl4ZWQgc3ltbGluayBlbnZpcm9ubWVudHMuXG4gIGZvciAoY29uc3QgYWxpYXNTdGVwSWQgb2YgZ2V0U3RlcElkQWxpYXNDYW5kaWRhdGVzKHN0ZXBJZCkpIHtcbiAgICBjb25zdCBhbGlhc01hdGNoID0gcmVnaXN0ZXJlZFN0ZXBzLmdldChhbGlhc1N0ZXBJZCk7XG4gICAgaWYgKGFsaWFzTWF0Y2gpIHtcbiAgICAgIHJldHVybiBhbGlhc01hdGNoO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGJ1aWx0aW5BbGlhc01hdGNoID0gZ2V0QnVpbHRpblJlc3BvbnNlU3RlcEFsaWFzKHN0ZXBJZCk7XG4gIGlmIChidWlsdGluQWxpYXNNYXRjaCkge1xuICAgIHJldHVybiBidWlsdGluQWxpYXNNYXRjaDtcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8vIE5vdGU6IF9fcHJpdmF0ZV9nZXRDbG9zdXJlVmFycyBpcyBubyBsb25nZXIgcmUtZXhwb3J0ZWQgaGVyZS5cbi8vIFRoZSBTV0MgY29tcGlsZXIgcGx1Z2luIG5vdyBpbmxpbmVzIGNsb3N1cmUgdmFyaWFibGUgYWNjZXNzIGFzIGFcbi8vIHNlbGYtY29udGFpbmVkIElJRkUgdGhhdCByZWFkcyBkaXJlY3RseSBmcm9tIHRoZSBnbG9iYWwgQXN5bmNMb2NhbFN0b3JhZ2Vcbi8vIGF0IFN5bWJvbC5mb3IoXCJXT1JLRkxPV19TVEVQX0NPTlRFWFRfU1RPUkFHRVwiKS5cblxuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd09yY2hlc3RyYXRvckNvbnRleHQge1xuICBydW5JZDogc3RyaW5nO1xuICBlbmNyeXB0aW9uS2V5OiBDcnlwdG9LZXkgfCB1bmRlZmluZWQ7XG4gIGdsb2JhbFRoaXM6IHR5cGVvZiBnbG9iYWxUaGlzO1xuICBldmVudHNDb25zdW1lcjogRXZlbnRzQ29uc3VtZXI7XG4gIC8qKlxuICAgKiBNYXAgb2YgcGVuZGluZyBpbnZvY2F0aW9ucyBrZXllZCBieSBjb3JyZWxhdGlvbklkLlxuICAgKiBVc2luZyBNYXAgaW5zdGVhZCBvZiBBcnJheSBmb3IgTygxKSBsb29rdXAvZGVsZXRlIG9wZXJhdGlvbnMuXG4gICAqL1xuICBpbnZvY2F0aW9uc1F1ZXVlOiBNYXA8c3RyaW5nLCBRdWV1ZUl0ZW0+O1xuICBvbldvcmtmbG93RXJyb3I6IChlcnJvcjogRXJyb3IpID0+IHZvaWQ7XG4gIGdlbmVyYXRlVWxpZDogKCkgPT4gc3RyaW5nO1xuICBnZW5lcmF0ZU5hbm9pZDogKCkgPT4gc3RyaW5nO1xuICAvKipcbiAgICogU2VxdWVudGlhbCBwcm9taXNlIHF1ZXVlIHRoYXQgZW5zdXJlcyBhbGwgZXZlbnQtZHJpdmVuIHByb21pc2UgcmVzb2x1dGlvbnNcbiAgICogKHN0ZXAgcmVzdWx0cywgaG9vayBwYXlsb2FkcywgZmFpbHVyZXMsIHN1c3BlbnNpb25zKSBoYXBwZW4gaW4gZXZlbnQgbG9nXG4gICAqIG9yZGVyLiBFdmVyeSByZXNvbHZlLCByZWplY3QsIG9yIHdvcmtmbG93IGVycm9yIGlzIGNoYWluZWQgdGhyb3VnaCB0aGlzXG4gICAqIHF1ZXVlIHNvIHRoYXQgZXZlbiBpZiBpbmRpdmlkdWFsIG9wZXJhdGlvbnMgdGFrZSB2YXJpYWJsZSB0aW1lIChlLmcuLFxuICAgKiBhc3luYyBkZWNyeXB0aW9uKSwgcHJvbWlzZXMgcmVzb2x2ZSBkZXRlcm1pbmlzdGljYWxseS5cbiAgICovXG4gIHByb21pc2VRdWV1ZTogUHJvbWlzZTx2b2lkPjtcbiAgLyoqXG4gICAqIENvdW50ZXIgb2YgaW4tZmxpZ2h0IGFzeW5jIGRhdGEgZGVsaXZlcnkgb3BlcmF0aW9ucyAoc3RlcCByZXN1bHRcbiAgICogaHlkcmF0aW9uLCBob29rIHBheWxvYWQgaHlkcmF0aW9uLCBhYm9ydCBzaWduYWwgaHlkcmF0aW9uKS4gU3VzcGVuc2lvbnNcbiAgICogbXVzdCB3YWl0IGZvciB0aGlzIHRvIHJlYWNoIDAgYmVmb3JlIGZpcmluZywgdG8gYXZvaWQgcHJlZW1wdGluZyBkYXRhXG4gICAqIGRlbGl2ZXJ5IOKAlCBlLmcuIGRlaHlkcmF0aW5nIGEgc3RlcCdzIGFyZ3VtZW50cyB3aGlsZSBhbiBhYm9ydCB0aGF0IHNob3VsZFxuICAgKiBiZSByZWZsZWN0ZWQgaW4gdGhvc2UgYXJndW1lbnRzIGlzIHN0aWxsIGh5ZHJhdGluZyBpdHMgcmVhc29uLlxuICAgKi9cbiAgcGVuZGluZ0RlbGl2ZXJpZXM6IG51bWJlcjtcbiAgLyoqXG4gICAqIE9yZGVyZWQgcmVnaXN0cnkgb2YgaW4tZmxpZ2h0IFwiYnJhbmNoLWRlY2lkaW5nXCIgZGVsaXZlcmllcyDigJQgdGhlXG4gICAqIHJlc29sdXRpb25zIGEgd29ya2Zsb3cgdHlwaWNhbGx5IGBQcm9taXNlLnJhY2VgcyBvbjogYnVmZmVyZWQgaG9va1xuICAgKiBwYXlsb2FkcyAoYGhvb2tfcmVjZWl2ZWRgKSBhbmQgd2FpdCBjb21wbGV0aW9ucyAoYHdhaXRfY29tcGxldGVkYCkuXG4gICAqIEtleWVkIGJ5IHRoZSBkZWxpdmVyeSdzIHBvc2l0aW9uIChpbmRleCkgaW4gdGhlIGNvbnN1bWVkIGV2ZW50IGxvZy5cbiAgICpcbiAgICogVGhlIHByb2JsZW06IGEgYnVmZmVyZWQgaG9vayBwYXlsb2FkIGlzIG9ic2VydmVkIHZpYSB0aGUgYXN5bmMgaG9va1xuICAgKiBpdGVyYXRvciAoYHlpZWxkIGF3YWl0IHRoaXNgKSwgY29zdGluZyBleHRyYSBtaWNyb3Rhc2sgaG9wcywgd2hpbGUgYVxuICAgKiBgd2FpdF9jb21wbGV0ZWRgIHJlc29sdmVzIHdpdGggZmV3ZXIgaG9wcyDigJQgYW5kIGEgcmV1c2VkIHNsZWVwIGNhblxuICAgKiByZXNvbHZlIGluIGFuIGVudGlyZWx5IGVhcmxpZXIgbG9vcCBpdGVyYXRpb24uIEVpdGhlciB3YXksIHRoZVxuICAgKiByZXNvbHV0aW9uIHRoYXQgdGhlIGNvbW1pdHRlZCBldmVudCBsb2cgb3JkZXJlZCBmaXJzdCBjYW4gbG9zZSBhXG4gICAqIGBQcm9taXNlLnJhY2VgIHRvIGEgZmFzdGVyLSBvciBhbHJlYWR5LXJlc29sdmVkIGNvbXBldGl0b3IsIGRpdmVyZ2luZ1xuICAgKiBmcm9tIHRoZSBsb2cgYW5kIHN1cmZhY2luZyBhcyBgQ29ycnVwdGVkRXZlbnRMb2dFcnJvcmAuXG4gICAqXG4gICAqIFRoZSBmaXggaXMgYSBzdHJpY3QsIGRldGVybWluaXN0aWMgZGVsaXZlcnkgb3JkZXIgYW5jaG9yZWQgb25cbiAgICogZXZlbnQtbG9nIHBvc2l0aW9uOiBhIGRlbGl2ZXJ5IGRvZXMgbm90IHJlc29sdmUgdG8gdGhlIHdvcmtmbG93IHVudGlsXG4gICAqIGV2ZXJ5IGVhcmxpZXItaW4tbG9nIGRlbGl2ZXJ5IG9mIHRoZSBPUFBPU0lURSBraW5kIGhhcyBiZWVuIGRlbGl2ZXJlZC5cbiAgICogKE9wcG9zaXRlIGtpbmQgb25seTogc2VxdWVudGlhbCBzYW1lLWtpbmQgaG9vayBwYXlsb2FkcyBtdXN0IG5vdCBibG9ja1xuICAgKiBvbmUgYW5vdGhlciwgYW5kIGEgd2FpdCBuZWVkIG5vdCB3YWl0IGJlaGluZCBhIGxhdGVyIHdhaXQuKSBCZWNhdXNlIHRoZVxuICAgKiBnYXRlIGlzIFwidGhlIGVhcmxpZXIgZGVsaXZlcnkgcmVzb2x2ZWRcIiwgbm90IFwid29uIGEgdGltaW5nIHJhY2VcIiwgdGhlXG4gICAqIG91dGNvbWUgaXMgaW5kZXBlbmRlbnQgb2YgbWljcm90YXNrIGhvcHMsIGh5ZHJhdGlvbi9kZWNyeXB0aW9uIHRpbWUsXG4gICAqIGFuZCBgUHJvbWlzZS5yYWNlYCBhcmd1bWVudCBvcmRlci5cbiAgICpcbiAgICogSW5kZXggaXMgdXNlZCByYXRoZXIgdGhhbiB0aGUgYGV2ZW50SWRgIHN0cmluZyBiZWNhdXNlIGBldmVudElkYCBpcyBhblxuICAgKiBvcGFxdWUsIHdvcmxkLWFzc2lnbmVkIHZhbHVlIG5vdCBndWFyYW50ZWVkIHRvIHNvcnQgaW4gY3JlYXRpb24gb3JkZXJcbiAgICogKG9ubHkgdGhlIGJ1bmRsZWQgVUxJRCB3b3JsZHMgaGFwcGVuIHRvKS5cbiAgICpcbiAgICogT3B0aW9uYWwgc28gb2xkZXIvb3V0LW9mLXRyZWUgY29udGV4dHMgKGFuZCBsaWdodHdlaWdodCB0ZXN0IGhhcm5lc3NlcylcbiAgICogdGhhdCBkbyBub3QgaW5pdGlhbGl6ZSBpdCBkZWdyYWRlIGdyYWNlZnVsbHkgdG8gdGhlIHByZXZpb3VzIGJlaGF2aW9yLlxuICAgKi9cbiAgcGVuZGluZ0RlbGl2ZXJ5QmFycmllcnM/OiBNYXA8bnVtYmVyLCBEZWxpdmVyeUJhcnJpZXJFbnRyeT47XG4gIC8qKlxuICAgKiBQZXItcnVuIG1lbW9pemF0aW9uIGNhY2hlIGZvciBoeWRyYXRlZCBzdGVwIHJldHVybiB2YWx1ZXMsIGtleWVkIGJ5IHRoZVxuICAgKiBgc3RlcF9jb21wbGV0ZWRgIGV2ZW50IGlkLiBPd25lZCBieSB0aGUgaW5saW5lIHJlcGxheSBsb29wIGluIGBydW50aW1lLnRzYFxuICAgKiBhbmQgdGhyZWFkZWQgdGhyb3VnaCBlYWNoIGBydW5Xb3JrZmxvd2AgY2FsbCBzbyBpdCBzdXJ2aXZlcyBhY3Jvc3MgcmVwbGF5XG4gICAqIGl0ZXJhdGlvbnMgb2YgdGhlIFNBTUUgcnVuIChhIGZyZXNoIGNvbnRleHQgaXMgY3JlYXRlZCBlYWNoIGl0ZXJhdGlvbikgYnV0XG4gICAqIG5ldmVyIGxlYWtzIGFjcm9zcyB1bnJlbGF0ZWQgcnVucy5cbiAgICpcbiAgICogT24gcmVwbGF5IEsgb2YgYSBzZXF1ZW50aWFsIE4tc3RlcCB3b3JrZmxvdywgdGhlIHN0ZXAgY29uc3VtZXIgd291bGRcbiAgICogb3RoZXJ3aXNlIHJlLWRlY3J5cHQgYW5kIHJlLXBhcnNlIHRoZSByZXN1bHRzIG9mIGFsbCBLIGFscmVhZHktY29tcGxldGVkXG4gICAqIHN0ZXBzIOKAlCBPKE7CsikgYWNyb3NzIGFuIGludm9jYXRpb24uIFRoaXMgY2FjaGUgbWFrZXMgYSBjb21wbGV0ZWQgc3RlcCdzXG4gICAqIHJlc3VsdCBhdmFpbGFibGUgaW4gTygxKSBvbiBzdWJzZXF1ZW50IHJlcGxheXMuIE9ubHkgcHJpbWl0aXZlIHJlc3VsdHMgYXJlXG4gICAqIG1lbW9pemVkLCBzbyBhIHNoYXJlZCByZWZlcmVuY2UgY2FuIG5ldmVyIGxldCBvbmUgcmVwbGF5J3MgbXV0YXRpb24gbGVha1xuICAgKiBpbnRvIHRoZSBuZXh0OyBzZWUgYHN0ZXAtaHlkcmF0aW9uLWNhY2hlLnRzYCBmb3IgdGhlIGZ1bGwgcmF0aW9uYWxlLlxuICAgKlxuICAgKiBPcHRpb25hbCBzbyBjb250ZXh0cyB0aGF0IGRvIG5vdCBpbml0aWFsaXplIGl0ICh0ZXN0IGhhcm5lc3NlcykgZGVncmFkZVxuICAgKiBncmFjZWZ1bGx5IHRvIHJlLWh5ZHJhdGluZyBldmVyeSByZXBsYXkg4oCUIGlkZW50aWNhbCB0byBwcmV2aW91cyBiZWhhdmlvci5cbiAgICovXG4gIHN0ZXBIeWRyYXRpb25DYWNoZT86IFN0ZXBIeWRyYXRpb25DYWNoZTtcbn1cblxuLyoqIFRoZSBraW5kIG9mIGJyYW5jaC1kZWNpZGluZyBkZWxpdmVyeSBhIGJhcnJpZXIgcmVwcmVzZW50cy4gKi9cbmV4cG9ydCB0eXBlIERlbGl2ZXJ5S2luZCA9ICdob29rJyB8ICd3YWl0JztcblxuaW50ZXJmYWNlIERlbGl2ZXJ5QmFycmllckVudHJ5IHtcbiAga2luZDogRGVsaXZlcnlLaW5kO1xuICAvKiogUmVzb2x2ZXMgb25jZSB0aGlzIGRlbGl2ZXJ5IGhhcyByZXNvbHZlZCB0byB0aGUgd29ya2Zsb3cuICovXG4gIGRlbGl2ZXJlZDogUHJvbWlzZTx2b2lkPjtcbn1cblxuLyoqXG4gKiBBd2FpdHMsIGluIHN0cmljdCBldmVudC1sb2cgb3JkZXIsIGV2ZXJ5IHN0aWxsLXJlZ2lzdGVyZWQgZGVsaXZlcnkgd2hvc2VcbiAqIGluZGV4IGlzIGVhcmxpZXIgdGhhbiBgZXZlbnRJbmRleGAgQU5EIHdob3NlIGtpbmQgaXMgaW4gYGRlZmVyQmVoaW5kS2luZHNgLFxuICogc28gdGhhdCB0aGlzIHJlc29sdXRpb24gaXMgaGFuZGVkIHRvIHRoZSB3b3JrZmxvdyBvbmx5IGFmdGVyIGFsbCByZWxldmFudFxuICogZWFybGllci1pbi1sb2cgZGVsaXZlcmllcyBoYXZlIGJlZW4uIFRoaXMgaXMgd2hhdCBrZWVwcyBhIGBQcm9taXNlLnJhY2VgXG4gKiBkZXRlcm1pbmlzdGljIGFuZCBhbGlnbmVkIHdpdGggdGhlIGNvbW1pdHRlZCBldmVudCBsb2csIGluZGVwZW5kZW50IG9mXG4gKiBtaWNyb3Rhc2staG9wIGNvdW50cywgaHlkcmF0aW9uIHRpbWUsIG9yIHJhY2UtYXJndW1lbnQgb3JkZXIuXG4gKlxuICogYGRlZmVyQmVoaW5kS2luZHNgIGlzIHRoZSBvcHBvc2l0ZSBraW5kKHMpOiBhIGhvb2sgZGVmZXJzIGJlaGluZCBlYXJsaWVyXG4gKiBXQUlUUyAobm90IGVhcmxpZXIgaG9va3Mg4oCUIHRob3NlIGFyZSBzZXF1ZW50aWFsIHNhbWUtZW50aXR5IHBheWxvYWRzKSwgYVxuICogd2FpdCBkZWZlcnMgYmVoaW5kIGVhcmxpZXIgSE9PS1MuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhd2FpdEVhcmxpZXJEZWxpdmVyaWVzKFxuICBjdHg6IFdvcmtmbG93T3JjaGVzdHJhdG9yQ29udGV4dCxcbiAgZXZlbnRJbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICBkZWZlckJlaGluZEtpbmRzOiByZWFkb25seSBEZWxpdmVyeUtpbmRbXVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIERlZmVuc2l2ZTogdG9sZXJhdGUgY29udGV4dHMgdGhhdCBwcmVkYXRlIHRoaXMgZmllbGQgKHRlc3QgaGFybmVzc2VzKS5cbiAgaWYgKFxuICAgIGV2ZW50SW5kZXggPT09IHVuZGVmaW5lZCB8fFxuICAgICFjdHgucGVuZGluZ0RlbGl2ZXJ5QmFycmllcnMgfHxcbiAgICBjdHgucGVuZGluZ0RlbGl2ZXJ5QmFycmllcnMuc2l6ZSA9PT0gMFxuICApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgZWFybGllcjogUHJvbWlzZTx2b2lkPltdID0gW107XG4gIGZvciAoY29uc3QgW2luZGV4LCBlbnRyeV0gb2YgY3R4LnBlbmRpbmdEZWxpdmVyeUJhcnJpZXJzKSB7XG4gICAgaWYgKGluZGV4IDwgZXZlbnRJbmRleCAmJiBkZWZlckJlaGluZEtpbmRzLmluY2x1ZGVzKGVudHJ5LmtpbmQpKSB7XG4gICAgICBlYXJsaWVyLnB1c2goZW50cnkuZGVsaXZlcmVkKTtcbiAgICB9XG4gIH1cbiAgaWYgKGVhcmxpZXIubGVuZ3RoID4gMCkge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKGVhcmxpZXIpO1xuICB9XG59XG5cbi8qKiBIYW5kbGUgZm9yIGEgcmVnaXN0ZXJlZCBicmFuY2gtZGVjaWRpbmcgZGVsaXZlcnkgYmFycmllci4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVsaXZlcnlCYXJyaWVyIHtcbiAgLyoqXG4gICAqIE1hcmsgdGhpcyBkZWxpdmVyeSBhcyBkZWxpdmVyZWQgdG8gdGhlIHdvcmtmbG93LiBSZXNvbHZlcyBpdHNcbiAgICogYGRlbGl2ZXJlZGAgcHJvbWlzZSBzbyBhbnkgbGF0ZXItaW4tbG9nIG9wcG9zaXRlLWtpbmQgZGVsaXZlcnkgZ2F0ZWQgb25cbiAgICogaXQgKHZpYSB7QGxpbmsgYXdhaXRFYXJsaWVyRGVsaXZlcmllc30pIG1heSBwcm9jZWVkLCBhbmQgcmVtb3ZlcyBpdCBmcm9tXG4gICAqIHRoZSByZWdpc3RyeS4gSWRlbXBvdGVudC5cbiAgICovXG4gIG1hcmtEZWxpdmVyZWQ6ICgpID0+IHZvaWQ7XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgYSBicmFuY2gtZGVjaWRpbmcgZGVsaXZlcnkgYXQgaXRzIGV2ZW50LWxvZyBpbmRleCBzbyB0aGF0IGxhdGVyXG4gKiBvcHBvc2l0ZS1raW5kIGRlbGl2ZXJpZXMgY2FuIGJlIG9yZGVyZWQgc3RyaWN0bHkgYWZ0ZXIgaXQuIFJldHVybnMgYW4gaW5lcnRcbiAqIGhhbmRsZSB3aGVuIGBwZW5kaW5nRGVsaXZlcnlCYXJyaWVyc2AgaXMgbm90IGluaXRpYWxpemVkLlxuICpcbiAqIFRvIGd1YXJhbnRlZSBhIGxhdGVyIGRlbGl2ZXJ5IGdhdGVkIG9uIHRoaXMgb25lIGNhbiBuZXZlciBoYW5nIHdoZW4gdGhpc1xuICogZGVsaXZlcnkgaXMgYWJhbmRvbmVkICh0aGUgd29ya2Zsb3cgdG9vayBhIGRpZmZlcmVudCBicmFuY2ggb3IgaXNcbiAqIHN1c3BlbmRpbmcgYW5kIG5ldmVyIG9ic2VydmVzIGl0KSwgdGhlIGJhcnJpZXIgYXV0by1yZXNvbHZlcyBhdCBpZGxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJEZWxpdmVyeUJhcnJpZXIoXG4gIGN0eDogV29ya2Zsb3dPcmNoZXN0cmF0b3JDb250ZXh0LFxuICBldmVudEluZGV4OiBudW1iZXIgfCB1bmRlZmluZWQsXG4gIGtpbmQ6IERlbGl2ZXJ5S2luZFxuKTogRGVsaXZlcnlCYXJyaWVyIHtcbiAgY29uc3QgYmFycmllcnMgPSBjdHgucGVuZGluZ0RlbGl2ZXJ5QmFycmllcnM7XG4gIGlmICghYmFycmllcnMgfHwgZXZlbnRJbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHsgbWFya0RlbGl2ZXJlZDogKCkgPT4ge30gfTtcbiAgfVxuXG4gIGxldCBkb25lID0gZmFsc2U7XG4gIGNvbnN0IHsgcHJvbWlzZSwgcmVzb2x2ZSB9ID0gd2l0aFJlc29sdmVyczx2b2lkPigpO1xuICBjb25zdCBlbnRyeTogRGVsaXZlcnlCYXJyaWVyRW50cnkgPSB7IGtpbmQsIGRlbGl2ZXJlZDogcHJvbWlzZSB9O1xuICBiYXJyaWVycy5zZXQoZXZlbnRJbmRleCwgZW50cnkpO1xuXG4gIGNvbnN0IGZpbmlzaCA9ICgpID0+IHtcbiAgICBpZiAoZG9uZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkb25lID0gdHJ1ZTtcbiAgICBpZiAoYmFycmllcnMuZ2V0KGV2ZW50SW5kZXgpID09PSBlbnRyeSkge1xuICAgICAgYmFycmllcnMuZGVsZXRlKGV2ZW50SW5kZXgpO1xuICAgIH1cbiAgICByZXNvbHZlKCk7XG4gIH07XG5cbiAgLy8gU2FmZXR5IG5ldDogaWYgdGhpcyBkZWxpdmVyeSBpcyBuZXZlciBkZWxpdmVyZWQgdG8gdGhlIHdvcmtmbG93IChpdHNcbiAgLy8gYnJhbmNoIHdhcyBub3QgdGFrZW4gLyB0aGUgcnVuIGlzIHN1c3BlbmRpbmcpLCByZXNvbHZlIGF0IGlkbGUgc28gYVxuICAvLyBsYXRlciBvcHBvc2l0ZS1raW5kIGRlbGl2ZXJ5IGdhdGVkIG9uIGl0IGNhbm5vdCBkZWFkbG9jayBhbmQgdGhlXG4gIC8vIHJlZ2lzdHJ5IGNhbm5vdCBsZWFrIGFuIGVudHJ5IHBlciBhYmFuZG9uZWQgZGVsaXZlcnkuXG4gIHNjaGVkdWxlV2hlbklkbGUoY3R4LCBmaW5pc2gpO1xuXG4gIHJldHVybiB7IG1hcmtEZWxpdmVyZWQ6IGZpbmlzaCB9O1xufVxuXG4vKipcbiAqIFNjaGVkdWxlIGEgY2FsbGJhY2sgdG8gZmlyZSBvbmx5IGFmdGVyIGFsbCBwZW5kaW5nIGRhdGEgZGVsaXZlcmllc1xuICogKHN0ZXAgcmVzdWx0cywgaG9vayBwYXlsb2FkcykgYW5kIGFzeW5jIGRlc2VyaWFsaXphdGlvbiBoYXZlIGNvbXBsZXRlZC5cbiAqIFVzZXMgYSBwb2xsaW5nIGxvb3A6IHNldFRpbWVvdXQoMCkg4oaSIGNoZWNrIHBlbmRpbmdEZWxpdmVyaWVzIOKGklxuICogaWYgPiAwLCB3YWl0IGZvciBwcm9taXNlUXVldWUg4oaSIHJlcGVhdC4gVGhpcyBoYW5kbGVzIHRoZSBtdWx0aS1yb3VuZFxuICogZGVsaXZlcnkgcGF0dGVybiB3aGVyZSBlYWNoIGhvb2sgcGF5bG9hZCBkZWxpdmVyeSBjeWNsZSBhcHBlbmRzIG5ld1xuICogYXN5bmMgd29yayB0byB0aGUgcHJvbWlzZVF1ZXVlLlxuICpcbiAqIFRoZSBpbml0aWFsIGBzZXRUaW1lb3V0KDApYCBtYWNyb3Rhc2sgaXMgbG9hZC1iZWFyaW5nIGFuZCBtdXN0IE5PVCBiZVxuICogZG93bmdyYWRlZCB0byBhIG1pY3JvdGFzayAoYHF1ZXVlTWljcm90YXNrYC9gUHJvbWlzZS5yZXNvbHZlKCkudGhlbmApLlxuICogYHBlbmRpbmdEZWxpdmVyaWVzYCBvbmx5IGd1YXJkcyB0aGUgaG9zdC1zaWRlIGh5ZHJhdGlvbiB3aW5kb3c7IGJldHdlZW4gYVxuICogZGVsaXZlcnkncyBgcmVzb2x2ZSgpYCBhbmQgdGhlIHdvcmtmbG93IFZNIGJvZHkgcnVubmluZyBpdHMgY29udGludWF0aW9uIHRvXG4gKiByZWdpc3RlciB0aGUgbmV4dCBzdWJzY3JpYmVyLCBgcGVuZGluZ0RlbGl2ZXJpZXNgIGlzIGFscmVhZHkgMCBldmVuIHRob3VnaFxuICogdGhlIFZNIGlzIG1pZC1yZWFjdGlvbi4gTm9kZSBkb2VzIG5vdCBndWFyYW50ZWUgYSBtaWNyb3Rhc2sgc2NoZWR1bGVkIGluXG4gKiB0aGUgaG9zdCBjb250ZXh0IHNldHRsZXMgYWZ0ZXIgdGhlIGNyb3NzLVZNIHByb21pc2UgY2hhaW4gKHJlc29sdmUgaW4gaG9zdFxuICog4oaSIHdvcmtmbG93IGNvZGUgaW4gVk0g4oaSIHN1YnNjcmliZSBiYWNrIGluIGhvc3QpOyB0aGUgbWFjcm90YXNrIGJvdW5kYXJ5XG4gKiBnaXZlcyB0aGF0IGNoYWluIHRpbWUgdG8gcnVuLCBzbyB0aGUgc3VzcGVuc2lvbiBkb2VzIG5vdCBwcmVlbXB0IGEgc2libGluZ1xuICogZGVsaXZlcnkgc3RpbGwgaW4gZmxpZ2h0LiBFbXBpcmljYWxseSwgcmVwbGFjaW5nIGl0IHdpdGggYHF1ZXVlTWljcm90YXNrYFxuICogYnJlYWtzIGhvb2svc2xlZXAgYFByb21pc2UucmFjZWAgb3JkZXJpbmcgKENvcnJ1cHRlZEV2ZW50TG9nRXJyb3IpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2NoZWR1bGVXaGVuSWRsZShcbiAgY3R4OiBXb3JrZmxvd09yY2hlc3RyYXRvckNvbnRleHQsXG4gIGZuOiAoKSA9PiB2b2lkXG4pOiB2b2lkIHtcbiAgY29uc3QgY2hlY2sgPSAoKSA9PiB7XG4gICAgaWYgKGN0eC5wZW5kaW5nRGVsaXZlcmllcyA+IDApIHtcbiAgICAgIC8vIFN0aWxsIGRlbGl2ZXJpbmcgZGF0YSDigJQgd2FpdCBmb3IgcXVldWUgdG8gZHJhaW4sIHRoZW4gcmUtY2hlY2tcbiAgICAgIGN0eC5wcm9taXNlUXVldWUudGhlbigoKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQoY2hlY2ssIDApO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZuKCk7XG4gICAgfVxuICB9O1xuICBzZXRUaW1lb3V0KGNoZWNrLCAwKTtcbn1cbiJdfQ==
|