@workflow/core 5.0.0-beta.43 → 5.0.0-beta.44
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/capabilities.d.ts +4 -4
- package/dist/capabilities.js +5 -5
- package/dist/capture-stack.d.ts +1 -1
- package/dist/capture-stack.js +2 -2
- package/dist/class-serialization.d.ts +8 -8
- package/dist/class-serialization.js +9 -9
- package/dist/classify-error.js +5 -5
- package/dist/context-violation-error.d.ts +5 -5
- package/dist/context-violation-error.d.ts.map +1 -1
- package/dist/context-violation-error.js +5 -5
- package/dist/create-hook.d.ts +2 -2
- package/dist/create-hook.js +1 -1
- package/dist/define-hook.js +2 -2
- package/dist/describe-error.d.ts +7 -7
- package/dist/describe-error.js +8 -8
- package/dist/encryption.d.ts +5 -5
- package/dist/encryption.js +7 -7
- package/dist/events-consumer.d.ts +19 -7
- package/dist/events-consumer.d.ts.map +1 -1
- package/dist/events-consumer.js +33 -12
- package/dist/flushable-stream.d.ts +4 -4
- package/dist/flushable-stream.js +12 -12
- package/dist/global.d.ts +1 -1
- package/dist/global.js +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2 -2
- package/dist/log-format.d.ts +2 -2
- package/dist/log-format.js +5 -5
- package/dist/logger.js +4 -4
- package/dist/private.d.ts +21 -65
- package/dist/private.d.ts.map +1 -1
- package/dist/private.js +160 -38
- package/dist/replay-payload-cache.d.ts +1 -1
- package/dist/replay-payload-cache.js +4 -4
- package/dist/runtime/compute-instance.d.ts +4 -3
- package/dist/runtime/compute-instance.d.ts.map +1 -1
- package/dist/runtime/compute-instance.js +5 -4
- package/dist/runtime/constants.d.ts +24 -24
- package/dist/runtime/constants.d.ts.map +1 -1
- package/dist/runtime/constants.js +49 -43
- package/dist/runtime/count-step-started-events.d.ts +7 -7
- package/dist/runtime/count-step-started-events.js +4 -4
- package/dist/runtime/deployment-guard.d.ts +7 -7
- package/dist/runtime/deployment-guard.js +8 -8
- package/dist/runtime/get-port-lazy.d.ts +2 -2
- package/dist/runtime/get-port-lazy.d.ts.map +1 -1
- package/dist/runtime/get-port-lazy.js +37 -30
- package/dist/runtime/get-world-lazy.d.ts +2 -2
- package/dist/runtime/get-world-lazy.js +3 -3
- package/dist/runtime/helpers.d.ts +18 -18
- package/dist/runtime/helpers.js +27 -27
- package/dist/runtime/quickjs-entrypoint.d.ts +21 -10
- package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -1
- package/dist/runtime/quickjs-entrypoint.js +199 -81
- package/dist/runtime/quickjs-runtime.d.ts +31 -15
- package/dist/runtime/quickjs-runtime.d.ts.map +1 -1
- package/dist/runtime/quickjs-runtime.js +126 -77
- package/dist/runtime/quickjs-serde.d.ts +10 -10
- package/dist/runtime/quickjs-serde.js +20 -20
- package/dist/runtime/replay-budget.d.ts +4 -4
- package/dist/runtime/replay-budget.js +5 -5
- package/dist/runtime/replay-recovery-reporter.d.ts +1 -1
- package/dist/runtime/replay-recovery-reporter.js +2 -2
- package/dist/runtime/resume-hook.d.ts +2 -2
- package/dist/runtime/resume-hook.js +27 -27
- package/dist/runtime/resume-latency.d.ts +25 -25
- package/dist/runtime/resume-latency.d.ts.map +1 -1
- package/dist/runtime/resume-latency.js +4 -4
- package/dist/runtime/run-id-time.d.ts +2 -2
- package/dist/runtime/run-id-time.js +5 -5
- package/dist/runtime/run.d.ts +21 -4
- package/dist/runtime/run.d.ts.map +1 -1
- package/dist/runtime/run.js +104 -10
- package/dist/runtime/runs.d.ts +4 -4
- package/dist/runtime/runs.js +2 -2
- package/dist/runtime/start.d.ts +3 -3
- package/dist/runtime/start.d.ts.map +1 -1
- package/dist/runtime/start.js +27 -23
- package/dist/runtime/step-executor.d.ts +14 -14
- package/dist/runtime/step-executor.d.ts.map +1 -1
- package/dist/runtime/step-executor.js +54 -39
- package/dist/runtime/step-latency.d.ts +14 -14
- package/dist/runtime/step-latency.js +11 -11
- package/dist/runtime/step-ownership.d.ts +6 -6
- package/dist/runtime/step-ownership.js +8 -8
- package/dist/runtime/step-single-flight.d.ts +1 -1
- package/dist/runtime/step-single-flight.d.ts.map +1 -1
- package/dist/runtime/step-single-flight.js +17 -11
- package/dist/runtime/suspension-handler.d.ts +29 -17
- package/dist/runtime/suspension-handler.d.ts.map +1 -1
- package/dist/runtime/suspension-handler.js +206 -71
- package/dist/runtime/unserializable-step.d.ts +34 -0
- package/dist/runtime/unserializable-step.d.ts.map +1 -0
- package/dist/runtime/unserializable-step.js +52 -0
- package/dist/runtime/vm-mode.d.ts +1 -1
- package/dist/runtime/vm-mode.js +2 -2
- package/dist/runtime/wait-continuation.d.ts +31 -9
- package/dist/runtime/wait-continuation.d.ts.map +1 -1
- package/dist/runtime/wait-continuation.js +44 -13
- package/dist/runtime/wait-until.d.ts +1 -1
- package/dist/runtime/wait-until.js +2 -2
- package/dist/runtime/world-compatibility.d.ts +20 -9
- package/dist/runtime/world-compatibility.d.ts.map +1 -1
- package/dist/runtime/world-compatibility.js +24 -13
- package/dist/runtime/world-init.d.ts +5 -5
- package/dist/runtime/world-init.js +6 -6
- package/dist/runtime/world.d.ts.map +1 -1
- package/dist/runtime/world.js +13 -3
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +300 -206
- package/dist/sealed-box.d.ts +7 -7
- package/dist/sealed-box.js +15 -15
- package/dist/serialization/client.js +2 -2
- package/dist/serialization/codec-devalue-vm.d.ts +1 -1
- package/dist/serialization/codec-devalue-vm.js +4 -4
- package/dist/serialization/codec-devalue.d.ts +1 -1
- package/dist/serialization/codec-devalue.js +2 -2
- package/dist/serialization/codec.d.ts +4 -4
- package/dist/serialization/codec.js +2 -2
- package/dist/serialization/compression.d.ts +12 -11
- package/dist/serialization/compression.d.ts.map +1 -1
- package/dist/serialization/compression.js +16 -15
- package/dist/serialization/encryption.d.ts +7 -7
- package/dist/serialization/encryption.d.ts.map +1 -1
- package/dist/serialization/encryption.js +8 -8
- package/dist/serialization/errors.js +2 -2
- package/dist/serialization/format.d.ts +6 -6
- package/dist/serialization/format.js +7 -7
- package/dist/serialization/hardened.d.ts +18 -18
- package/dist/serialization/hardened.d.ts.map +1 -1
- package/dist/serialization/hardened.js +41 -32
- package/dist/serialization/index.d.ts +1 -1
- package/dist/serialization/index.js +2 -2
- package/dist/serialization/reducers/class-vm.d.ts +1 -1
- package/dist/serialization/reducers/class-vm.js +2 -2
- package/dist/serialization/reducers/class.js +2 -2
- package/dist/serialization/reducers/common-vm.js +12 -12
- package/dist/serialization/reducers/common.js +12 -12
- package/dist/serialization/reducers/step-function-vm.d.ts +1 -1
- package/dist/serialization/reducers/step-function-vm.js +2 -2
- package/dist/serialization/reducers/step-function.js +2 -2
- package/dist/serialization/step.js +2 -2
- package/dist/serialization/types.d.ts +5 -5
- package/dist/serialization/types.js +2 -2
- package/dist/serialization/workflow-vm.d.ts +1 -1
- package/dist/serialization/workflow-vm.d.ts.map +1 -1
- package/dist/serialization/workflow-vm.js +13 -10
- package/dist/serialization-format.d.ts +11 -11
- package/dist/serialization-format.d.ts.map +1 -1
- package/dist/serialization-format.js +29 -23
- package/dist/serialization.d.ts +10 -10
- package/dist/serialization.js +98 -98
- package/dist/set-attributes.js +2 -2
- package/dist/source-map.d.ts +1 -1
- package/dist/source-map.d.ts.map +1 -1
- package/dist/source-map.js +18 -12
- package/dist/step/context-storage.d.ts +5 -5
- package/dist/step/context-storage.js +1 -1
- package/dist/step/writable-stream.d.ts +3 -3
- package/dist/step/writable-stream.js +7 -7
- package/dist/step.js +12 -12
- package/dist/symbols.d.ts +2 -2
- package/dist/symbols.js +3 -3
- package/dist/telemetry/semantic-conventions.d.ts +21 -13
- package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
- package/dist/telemetry/semantic-conventions.js +21 -15
- package/dist/telemetry.d.ts +3 -3
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +19 -10
- package/dist/test-support/orchestrator-context.d.ts.map +1 -1
- package/dist/test-support/orchestrator-context.js +12 -2
- package/dist/version.d.ts +1 -1
- package/dist/version.js +2 -2
- package/dist/vm/index.js +4 -4
- package/dist/vm/script-cache.d.ts.map +1 -1
- package/dist/vm/script-cache.js +23 -17
- package/dist/vm/uint8array-base64.js +1 -1
- package/dist/workflow/abort-controller.d.ts +1 -1
- package/dist/workflow/abort-controller.js +12 -12
- package/dist/workflow/create-hook.js +2 -2
- package/dist/workflow/get-workflow-metadata.js +2 -2
- package/dist/workflow/hook.js +16 -16
- package/dist/workflow/set-attributes.d.ts +1 -1
- package/dist/workflow/set-attributes.js +2 -2
- package/dist/workflow/sleep.js +2 -2
- package/dist/workflow/world-init-stub.d.ts +1 -1
- package/dist/workflow/world-init-stub.js +2 -2
- package/dist/workflow.d.ts +2 -2
- package/dist/workflow.js +21 -7
- package/docs/api-reference/create-hook.mdx +15 -15
- package/docs/api-reference/create-webhook.mdx +15 -15
- package/docs/api-reference/define-hook.mdx +10 -10
- package/docs/api-reference/fatal-error.mdx +2 -2
- package/docs/api-reference/fetch.mdx +7 -7
- package/docs/api-reference/get-step-metadata.mdx +2 -2
- package/docs/api-reference/get-workflow-metadata.mdx +3 -3
- package/docs/api-reference/get-writable.mdx +7 -7
- package/docs/api-reference/index.mdx +1 -1
- package/docs/api-reference/retryable-error.mdx +1 -1
- package/docs/api-reference/set-attributes.mdx +2 -2
- package/docs/api-reference/sleep.mdx +3 -3
- package/docs/foundations/cancellation.mdx +31 -31
- package/docs/foundations/errors-and-retries.mdx +42 -11
- package/docs/foundations/hooks.mdx +35 -35
- package/docs/foundations/idempotency.mdx +9 -9
- package/docs/foundations/serialization.mdx +21 -22
- package/docs/foundations/starting-workflows.mdx +36 -37
- package/docs/foundations/streaming.mdx +46 -41
- package/docs/foundations/versioning.mdx +3 -3
- package/docs/foundations/workflows-and-steps.mdx +9 -9
- package/docs/how-it-works/cancellation.mdx +62 -62
- package/docs/how-it-works/code-transform.mdx +66 -54
- package/docs/how-it-works/encryption.mdx +25 -21
- package/docs/how-it-works/event-sourcing.mdx +53 -35
- package/docs/how-it-works/framework-integrations.mdx +12 -12
- package/docs/how-it-works/understanding-directives.mdx +21 -21
- package/package.json +7 -7
|
@@ -11,7 +11,7 @@ export type DeploymentAffinityOutcome =
|
|
|
11
11
|
/** Misrouted and out of budget (or unroutable); `run_failed` recorded. */
|
|
12
12
|
| 'failed';
|
|
13
13
|
/**
|
|
14
|
-
* `spanAttributes` is present only on a misrouted delivery
|
|
14
|
+
* `spanAttributes` is present only on a misrouted delivery: mismatches are
|
|
15
15
|
* rare, so the presence of `workflow.deployment.pinned_id` on a span *is* the
|
|
16
16
|
* signal that one happened, and `recovered` separates the ones a re-route fixed
|
|
17
17
|
* from the ones that kept misrouting.
|
|
@@ -22,7 +22,7 @@ export interface DeploymentAffinityResult {
|
|
|
22
22
|
}
|
|
23
23
|
/**
|
|
24
24
|
* Arguments handed to a call site's re-enqueue closure. The guard owns the
|
|
25
|
-
* policy
|
|
25
|
+
* policy (counting, backoff, logging, telemetry, escalation) and the call
|
|
26
26
|
* site owns only the shape of the message it needs to put back on the queue.
|
|
27
27
|
*/
|
|
28
28
|
export interface ReenqueueArgs {
|
|
@@ -42,9 +42,9 @@ export interface ReenqueueArgs {
|
|
|
42
42
|
* Guards deployment affinity: a run may only execute on the deployment it is
|
|
43
43
|
* pinned to.
|
|
44
44
|
*
|
|
45
|
-
* A run's `deploymentId` is fixed when it starts
|
|
45
|
+
* A run's `deploymentId` is fixed when it starts: the deployment that called
|
|
46
46
|
* `start()`, or whatever `start({ deploymentId })` resolved to (an explicit id
|
|
47
|
-
* or `'latest'`)
|
|
47
|
+
* or `'latest'`). No replay or step execution may happen anywhere else:
|
|
48
48
|
* the bundles here may not match the run's persisted history, and any step
|
|
49
49
|
* dispatched from here derives the per-run encryption key from the wrong
|
|
50
50
|
* deployment's master key, which surfaces as a `RuntimeDecryptionError` the
|
|
@@ -58,8 +58,8 @@ export interface ReenqueueArgs {
|
|
|
58
58
|
* spent, mirroring how a replay divergence gets bounded recovery replays before
|
|
59
59
|
* being recorded as a corrupted event log.
|
|
60
60
|
*
|
|
61
|
-
* Callers must pass a run entity they already have in hand
|
|
62
|
-
* loads the run for other reasons
|
|
61
|
+
* Callers must pass a run entity they already have in hand (every call site
|
|
62
|
+
* loads the run for other reasons), so the guard costs no extra round trip.
|
|
63
63
|
* (`world.getDeploymentId()` reads the ambient deployment id, e.g.
|
|
64
64
|
* `VERCEL_DEPLOYMENT_ID`, and does not call the backend either.)
|
|
65
65
|
*
|
|
@@ -92,7 +92,7 @@ export declare function guardDeploymentAffinity({ world, run, requestId, retryCo
|
|
|
92
92
|
* Ordering barrier awaited once a mismatch is confirmed, before either
|
|
93
93
|
* stopping action. Under turbo the `run_started` write is backgrounded, and
|
|
94
94
|
* both outcomes hand the run off (to a `run_failed` here, or to the pinned
|
|
95
|
-
* deployment's own `run_started`)
|
|
95
|
+
* deployment's own `run_started`), so that write must have landed first.
|
|
96
96
|
*/
|
|
97
97
|
beforeStop?: () => Promise<void>;
|
|
98
98
|
}): Promise<DeploymentAffinityResult>;
|
|
@@ -26,9 +26,9 @@ function result(outcome, pinnedDeploymentId, attempts) {
|
|
|
26
26
|
* Guards deployment affinity: a run may only execute on the deployment it is
|
|
27
27
|
* pinned to.
|
|
28
28
|
*
|
|
29
|
-
* A run's `deploymentId` is fixed when it starts
|
|
29
|
+
* A run's `deploymentId` is fixed when it starts: the deployment that called
|
|
30
30
|
* `start()`, or whatever `start({ deploymentId })` resolved to (an explicit id
|
|
31
|
-
* or `'latest'`)
|
|
31
|
+
* or `'latest'`). No replay or step execution may happen anywhere else:
|
|
32
32
|
* the bundles here may not match the run's persisted history, and any step
|
|
33
33
|
* dispatched from here derives the per-run encryption key from the wrong
|
|
34
34
|
* deployment's master key, which surfaces as a `RuntimeDecryptionError` the
|
|
@@ -42,8 +42,8 @@ function result(outcome, pinnedDeploymentId, attempts) {
|
|
|
42
42
|
* spent, mirroring how a replay divergence gets bounded recovery replays before
|
|
43
43
|
* being recorded as a corrupted event log.
|
|
44
44
|
*
|
|
45
|
-
* Callers must pass a run entity they already have in hand
|
|
46
|
-
* loads the run for other reasons
|
|
45
|
+
* Callers must pass a run entity they already have in hand (every call site
|
|
46
|
+
* loads the run for other reasons), so the guard costs no extra round trip.
|
|
47
47
|
* (`world.getDeploymentId()` reads the ambient deployment id, e.g.
|
|
48
48
|
* `VERCEL_DEPLOYMENT_ID`, and does not call the backend either.)
|
|
49
49
|
*
|
|
@@ -99,7 +99,7 @@ export async function guardDeploymentAffinity({ world, run, requestId, retryCoun
|
|
|
99
99
|
}
|
|
100
100
|
catch (failError) {
|
|
101
101
|
// Run already reached a terminal state (a concurrent writer failed it, or
|
|
102
|
-
// it was
|
|
102
|
+
// it was canceled/expired), so still stop. Anything else is a transient
|
|
103
103
|
// persistence failure: rethrow so the queue redelivers and we try again.
|
|
104
104
|
if (!EntityConflictError.is(failError) &&
|
|
105
105
|
!RunExpiredError.is(failError)) {
|
|
@@ -110,7 +110,7 @@ export async function guardDeploymentAffinity({ world, run, requestId, retryCoun
|
|
|
110
110
|
};
|
|
111
111
|
if (reenqueue && retryCount < maxRetries) {
|
|
112
112
|
const attempt = retryCount + 1;
|
|
113
|
-
// Exponential, capped: 1s, 2s, 4s
|
|
113
|
+
// Exponential, capped: 1s, 2s, 4s. Cheap insurance against a hot
|
|
114
114
|
// re-enqueue loop, and time for a mid-flight routing change to settle.
|
|
115
115
|
const delaySeconds = Math.min(2 ** retryCount, MAX_REROUTE_DELAY_SECONDS);
|
|
116
116
|
try {
|
|
@@ -130,7 +130,7 @@ export async function guardDeploymentAffinity({ world, run, requestId, retryCoun
|
|
|
130
130
|
if (!isDeploymentUnavailableError?.(reenqueueError)) {
|
|
131
131
|
throw reenqueueError;
|
|
132
132
|
}
|
|
133
|
-
// The World explicitly classified the target as unavailable
|
|
133
|
+
// The World explicitly classified the target as unavailable: deleted,
|
|
134
134
|
// aged out of its retention window, or otherwise undiscoverable. Burning
|
|
135
135
|
// the rest of the budget on a deployment that provably cannot be reached
|
|
136
136
|
// only delays the failure, so fail now.
|
|
@@ -151,4 +151,4 @@ export async function guardDeploymentAffinity({ world, run, requestId, retryCoun
|
|
|
151
151
|
: 'Workflow run received by a deployment it is not pinned to; failing the run', logContext);
|
|
152
152
|
return failRun(retryCount);
|
|
153
153
|
}
|
|
154
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95bWVudC1ndWFyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL2RlcGxveW1lbnQtZ3VhcmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLG1CQUFtQixFQUNuQixlQUFlLEVBQ2YsZUFBZSxFQUNmLCtCQUErQixHQUNoQyxNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsaUNBQWlDLEdBR2xDLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN4RCxPQUFPLEtBQUssU0FBUyxNQUFNLHNDQUFzQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWpFLCtDQUErQztBQUMvQyxNQUFNLHlCQUF5QixHQUFHLENBQUMsQ0FBQztBQXlCcEMsd0NBQXdDO0FBQ3hDLE1BQU0sUUFBUSxHQUE2QixFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsQ0FBQztBQUVuRTs7O0dBR0c7QUFDSCxTQUFTLE1BQU0sQ0FDYixPQUE4QixFQUM5QixrQkFBMEIsRUFDMUIsUUFBZ0I7SUFFaEIsT0FBTztRQUNMLE9BQU87UUFDUCxjQUFjLEVBQUU7WUFDZCxHQUFHLFNBQVMsQ0FBQyw2QkFBNkIsQ0FBQyxrQkFBa0IsQ0FBQztZQUM5RCxHQUFHLFNBQVMsQ0FBQyxvQ0FBb0MsQ0FBQyxRQUFRLENBQUM7WUFDM0QsR0FBRyxTQUFTLENBQUMsbUNBQW1DLENBQUMsT0FBTyxLQUFLLFVBQVUsQ0FBQztTQUN6RTtLQUNGLENBQUM7QUFDSixDQUFDO0FBcUJEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBK0JHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSx1QkFBdUIsQ0FBQyxFQUM1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QU87Z0JBQ3JDLFlBQVk7YUFDYixDQUFDLENBQUM7WUFDSCxhQUFhLENBQUMsSUFBSSxDQUNoQiw2RkFBNkYsRUFDN0YsRUFBRSxHQUFHLFVBQVUsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLENBQ3pDLENBQUM7WUFDRixPQUFPLE1BQU0sQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN2RCxDQUFDO1FBQUMsT0FBTyxjQUFjLEVBQUUsQ0FBQztZQUN4QiwwRUFBMEU7WUFDMUUsdUVBQXVFO1lBQ3ZFLHFFQUFxRTtZQUNyRSxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO2dCQUNwRCxNQUFNLGNBQWMsQ0FBQztZQUN2QixDQUFDO1lBRUQsdUVBQXVFO1lBQ3ZFLHlFQUF5RTtZQUN6RSx5RUFBeUU7WUFDekUsd0NBQXdDO1lBQ3hDLGFBQWEsQ0FBQyxLQUFLLENBQ2pCLGlGQUFpRixFQUNqRjtnQkFDRSxHQUFHLFVBQVU7Z0JBQ2IsT0FBTztnQkFDUCxZQUFZLEVBQ1YsY0FBYyxZQUFZLEtBQUs7b0JBQzdCLENBQUMsQ0FBQyxjQUFjLENBQUMsT0FBTztvQkFDeEIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUM7YUFDN0IsQ0FDRixDQUFDO1lBQ0YseUVBQXlFO1lBQ3pFLGVBQWU7WUFDZixPQUFPLE9BQU8sQ0FBQyxDQUFDLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDcEMsQ0FBQztJQUNILENBQUM7SUFFRCxhQUFhLENBQUMsS0FBSyxDQUNqQixVQUFVLEdBQUcsQ0FBQztRQUNaLENBQUMsQ0FBQyxrR0FBa0c7UUFDcEcsQ0FBQyxDQUFDLDRFQUE0RSxFQUNoRixVQUFVLENBQ1gsQ0FBQztJQUNGLE9BQU8sT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQzdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBFbnRpdHlDb25mbGljdEVycm9yLFxuICBSVU5fRVJST1JfQ09ERVMsXG4gIFJ1bkV4cGlyZWRFcnJvcixcbiAgV29ya2Zsb3dEZXBsb3ltZW50TWlzbWF0Y2hFcnJvcixcbn0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQge1xuICBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NPTVBSRVNTSU9OLFxuICB0eXBlIFdvcmtmbG93UnVuLFxuICB0eXBlIFdvcmxkLFxufSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgcnVudGltZUxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBkZWh5ZHJhdGVSdW5FcnJvciB9IGZyb20gJy4uL3NlcmlhbGl6YXRpb24uanMnO1xuaW1wb3J0ICogYXMgQXR0cmlidXRlIGZyb20gJy4uL3RlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9ucy5qcyc7XG5pbXBvcnQgeyBnZXREZXBsb3ltZW50TWlzbWF0Y2hNYXhSZXRyaWVzIH0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuXG4vKiogQ2FwIG9uIHRoZSByZS1yb3V0ZSBiYWNrb2ZmLCBpbiBzZWNvbmRzLiAqL1xuY29uc3QgTUFYX1JFUk9VVEVfREVMQVlfU0VDT05EUyA9IDg7XG5cbi8qKlxuICogSG93IHRoZSBndWFyZCByZXNvbHZlZCBhIGRlbGl2ZXJ5LiBCb3RoIG5vbi1gY29udGludWVgIG91dGNvbWVzIG1lYW4gdGhlXG4gKiBjYWxsZXIgbXVzdCBhY2sgdGhlIG1lc3NhZ2UgYW5kIHJldHVybiB3aXRob3V0IGV4ZWN1dGluZyBhbnl0aGluZy5cbiAqL1xuZXhwb3J0IHR5cGUgRGVwbG95bWVudEFmZmluaXR5T3V0Y29tZSA9XG4gIC8qKiBUaGUgcnVuIGJlbG9uZ3MgaGVyZSAob3IgdGhpcyB3b3JsZCBoYXMgbm8gZGVwbG95bWVudCBhZmZpbml0eSkuICovXG4gIHwgJ2NvbnRpbnVlJ1xuICAvKiogTWlzcm91dGVkOyByZS1lbnF1ZXVlZCBhdCB0aGUgcnVuJ3Mgb3duIGRlcGxveW1lbnQuICovXG4gIHwgJ3Jlcm91dGVkJ1xuICAvKiogTWlzcm91dGVkIGFuZCBvdXQgb2YgYnVkZ2V0IChvciB1bnJvdXRhYmxlKTsgYHJ1bl9mYWlsZWRgIHJlY29yZGVkLiAqL1xuICB8ICdmYWlsZWQnO1xuXG4vKipcbiAqIGBzcGFuQXR0cmlidXRlc2AgaXMgcHJlc2VudCBvbmx5IG9uIGEgbWlzcm91dGVkIGRlbGl2ZXJ5IOKAlCBtaXNtYXRjaGVzIGFyZVxuICogcmFyZSwgc28gdGhlIHByZXNlbmNlIG9mIGB3b3JrZmxvdy5kZXBsb3ltZW50LnBpbm5lZF9pZGAgb24gYSBzcGFuICppcyogdGhlXG4gKiBzaWduYWwgdGhhdCBvbmUgaGFwcGVuZWQsIGFuZCBgcmVjb3ZlcmVkYCBzZXBhcmF0ZXMgdGhlIG9uZXMgYSByZS1yb3V0ZSBmaXhlZFxuICogZnJvbSB0aGUgb25lcyB0aGF0IGtlcHQgbWlzcm91dGluZy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXBsb3ltZW50QWZmaW5pdHlSZXN1bHQge1xuICBvdXRjb21lOiBEZXBsb3ltZW50QWZmaW5pdHlPdXRjb21lO1xuICBzcGFuQXR0cmlidXRlcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+O1xufVxuXG4vKiogVGhlIGNvbW1vbiBjYXNlLCBhbGxvY2F0aW9uLWZyZWUuICovXG5jb25zdCBDT05USU5VRTogRGVwbG95bWVudEFmZmluaXR5UmVzdWx0ID0geyBvdXRjb21lOiAnY29udGludWUnIH07XG5cbi8qKlxuICogQnVpbGRzIGEgc3RvcHBpbmcgcmVzdWx0LiBgYXR0ZW1wdHNgIGlzIHRoZSByZS1yb3V0ZSBjb3VudCAqaW5jbHVkaW5nKiB0aGlzXG4gKiBpbnZvY2F0aW9uJ3Mgb3duIGF0dGVtcHQsIHNvIHRoZSBzcGFuIGF0dHJpYnV0ZSByZWFkcyBhcyBcImF0dGVtcHRzIHNvIGZhclwiLlxuICovXG5mdW5jdGlvbiByZXN1bHQoXG4gIG91dGNvbWU6ICdyZXJvdXRlZCcgfCAnZmFpbGVkJyxcbiAgcGlubmVkRGVwbG95bWVudElkOiBzdHJpbmcsXG4gIGF0dGVtcHRzOiBudW1iZXJcbik6IERlcGxveW1lbnRBZmZpbml0eVJlc3VsdCB7XG4gIHJldHVybiB7XG4gICAgb3V0Y29tZSxcbiAgICBzcGFuQXR0cmlidXRlczoge1xuICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuUGlubmVkRGVwbG95bWVudElkKHBpbm5lZERlcGxveW1lbnRJZCksXG4gICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dEZXBsb3ltZW50TWlzbWF0Y2hSZXRyeUNvdW50KGF0dGVtcHRzKSxcbiAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0RlcGxveW1lbnRNaXNtYXRjaFJlY292ZXJlZChvdXRjb21lID09PSAncmVyb3V0ZWQnKSxcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIEFyZ3VtZW50cyBoYW5kZWQgdG8gYSBjYWxsIHNpdGUncyByZS1lbnF1ZXVlIGNsb3N1cmUuIFRoZSBndWFyZCBvd25zIHRoZVxuICogcG9saWN5IOKAlCBjb3VudGluZywgYmFja29mZiwgbG9nZ2luZywgdGVsZW1ldHJ5LCBlc2NhbGF0aW9uIOKAlCBhbmQgdGhlIGNhbGxcbiAqIHNpdGUgb3ducyBvbmx5IHRoZSBzaGFwZSBvZiB0aGUgbWVzc2FnZSBpdCBuZWVkcyB0byBwdXQgYmFjayBvbiB0aGUgcXVldWUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVlbnF1ZXVlQXJncyB7XG4gIC8qKiBUaGUgZGVwbG95bWVudCB0byB0YXJnZXQ6IHRoZSBvbmUgdGhlIHJ1biBpcyBwaW5uZWQgdG8uICovXG4gIGRlcGxveW1lbnRJZDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHJ1bidzIHNwZWMgdmVyc2lvbiwgc28gdGhlIHdvcmxkIHBpY2tzIHRoZSByaWdodCBxdWV1ZSB0cmFuc3BvcnRcbiAgICogKENCT1IgdnMgSlNPTikuIFVuZGVmaW5lZCBvbiBsZWdhY3kgcnVucyB0aGF0IHByZWRhdGUgdGhlIGZpZWxkOyB3b3JsZHNcbiAgICogdGhlbiBmYWxsIGJhY2sgdG8gdGhlaXIgY3VycmVudCBkZWZhdWx0LlxuICAgKi9cbiAgc3BlY1ZlcnNpb246IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgZGVwbG95bWVudE1pc21hdGNoUmV0cnlDb3VudDogbnVtYmVyO1xuICAvKiogQmFja29mZiBiZWZvcmUgdGhlIHJlLXJvdXRlZCBtZXNzYWdlIGJlY29tZXMgdmlzaWJsZS4gKi9cbiAgZGVsYXlTZWNvbmRzOiBudW1iZXI7XG59XG5cbi8qKlxuICogR3VhcmRzIGRlcGxveW1lbnQgYWZmaW5pdHk6IGEgcnVuIG1heSBvbmx5IGV4ZWN1dGUgb24gdGhlIGRlcGxveW1lbnQgaXQgaXNcbiAqIHBpbm5lZCB0by5cbiAqXG4gKiBBIHJ1bidzIGBkZXBsb3ltZW50SWRgIGlzIGZpeGVkIHdoZW4gaXQgc3RhcnRzIOKAlCB0aGUgZGVwbG95bWVudCB0aGF0IGNhbGxlZFxuICogYHN0YXJ0KClgLCBvciB3aGF0ZXZlciBgc3RhcnQoeyBkZXBsb3ltZW50SWQgfSlgIHJlc29sdmVkIHRvIChhbiBleHBsaWNpdCBpZFxuICogb3IgYCdsYXRlc3QnYCkg4oCUIGFuZCBubyByZXBsYXkgb3Igc3RlcCBleGVjdXRpb24gbWF5IGhhcHBlbiBhbnl3aGVyZSBlbHNlOlxuICogdGhlIGJ1bmRsZXMgaGVyZSBtYXkgbm90IG1hdGNoIHRoZSBydW4ncyBwZXJzaXN0ZWQgaGlzdG9yeSwgYW5kIGFueSBzdGVwXG4gKiBkaXNwYXRjaGVkIGZyb20gaGVyZSBkZXJpdmVzIHRoZSBwZXItcnVuIGVuY3J5cHRpb24ga2V5IGZyb20gdGhlIHdyb25nXG4gKiBkZXBsb3ltZW50J3MgbWFzdGVyIGtleSwgd2hpY2ggc3VyZmFjZXMgYXMgYSBgUnVudGltZURlY3J5cHRpb25FcnJvcmAgdGhlXG4gKiBxdWV1ZSByZXRyeSBjYWxsYmFjayBzd2FsbG93cyBpbnRvIGEgYmxhbmsgXCJleGNlZWRlZCBtYXggcmV0cmllc1wiLlxuICpcbiAqIEEgbWlzcm91dGVkIGRlbGl2ZXJ5IGlzIG5vdCB0cmVhdGVkIGFzIHBlcm1hbmVudC4gUmF0aGVyIHRoYW4gZmFpbGluZ1xuICogaW1tZWRpYXRlbHksIHJlLWVucXVldWUgdGhlIG1lc3NhZ2UgKmV4cGxpY2l0bHkgdGFyZ2V0ZWQqIGF0IHRoZSBydW4ncyBvd25cbiAqIGRlcGxveW1lbnQ7IHRoYXQgc2VuZCBpcyBzdHJpY3RseSBiZXR0ZXItYWRkcmVzc2VkIHRoYW4gdGhlIG9uZSB0aGF0XG4gKiBtaXNyb3V0ZWQsIHdoaWNoIGluaGVyaXRlZCB0aGUgcHJvZHVjaW5nIGRlcGxveW1lbnQncyBhbWJpZW50IGlkLiBGYWlsIG9ubHlcbiAqIG9uY2UgdGhlIGJ1ZGdldCAoYFdPUktGTE9XX0RFUExPWU1FTlRfTUlTTUFUQ0hfTUFYX1JFVFJJRVNgLCBkZWZhdWx0IDMpIGlzXG4gKiBzcGVudCwgbWlycm9yaW5nIGhvdyBhIHJlcGxheSBkaXZlcmdlbmNlIGdldHMgYm91bmRlZCByZWNvdmVyeSByZXBsYXlzIGJlZm9yZVxuICogYmVpbmcgcmVjb3JkZWQgYXMgYSBjb3JydXB0ZWQgZXZlbnQgbG9nLlxuICpcbiAqIENhbGxlcnMgbXVzdCBwYXNzIGEgcnVuIGVudGl0eSB0aGV5IGFscmVhZHkgaGF2ZSBpbiBoYW5kIOKAlCBldmVyeSBjYWxsIHNpdGVcbiAqIGxvYWRzIHRoZSBydW4gZm9yIG90aGVyIHJlYXNvbnMg4oCUIHNvIHRoZSBndWFyZCBjb3N0cyBubyBleHRyYSByb3VuZCB0cmlwLlxuICogKGB3b3JsZC5nZXREZXBsb3ltZW50SWQoKWAgcmVhZHMgdGhlIGFtYmllbnQgZGVwbG95bWVudCBpZCwgZS5nLlxuICogYFZFUkNFTF9ERVBMT1lNRU5UX0lEYCwgYW5kIGRvZXMgbm90IGNhbGwgdGhlIGJhY2tlbmQgZWl0aGVyLilcbiAqXG4gKiBUaGUgZmFpbHVyZSBpcyByZWNvcmRlZCAqKndpdGhvdXQgcmVzb2x2aW5nIHRoZSBydW4ncyBlbmNyeXB0aW9uIGtleSoqOiB0aGVcbiAqIGtleSBpcyBmZXRjaGVkIGZyb20gdGhlIHBpbm5lZCBkZXBsb3ltZW50J3MgQVBJLCBvZnRlbiB1bmF2YWlsYWJsZSBvbmNlIHRoYXRcbiAqIGRlcGxveW1lbnQgaXMgcGFzdCBpdHMgcmV0ZW50aW9uIHdpbmRvdywgc28gZGVwZW5kaW5nIG9uIGl0IHdvdWxkIHRocm93IGhlcmVcbiAqIGluc3RlYWQgb2YgcmVjb3JkaW5nIHRoZSBmYWlsdXJlLiBUaGUgcGF5bG9hZCBpcyB3cml0dGVuIHVuZW5jcnlwdGVkIChpdFxuICogaG9sZHMgb25seSBkZXBsb3ltZW50IGlkcywgbm90aGluZyBzZW5zaXRpdmUpLCBhbmQgdGhlIHBsYWludGV4dCBgZXJyb3JDb2RlYFxuICogaXMgdGhlIHNpZ25hbCBvYnNlcnZhYmlsaXR5IGFuZCB0aGUgVUkga2V5IG9mZi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGd1YXJkRGVwbG95bWVudEFmZmluaXR5KHtcbiAgd29ybGQsXG4gIHJ1bixcbiAgcmVxdWVzdElkLFxuICByZXRyeUNvdW50ID0gMCxcbiAgcmVlbnF1ZXVlLFxuICBpc0RlcGxveW1lbnRVbmF2YWlsYWJsZUVycm9yLFxuICBiZWZvcmVTdG9wLFxufToge1xuICB3b3JsZDogV29ybGQ7XG4gIHJ1bjogUGljazxXb3JrZmxvd1J1biwgJ3J1bklkJyB8ICdkZXBsb3ltZW50SWQnIHwgJ3NwZWNWZXJzaW9uJz47XG4gIHJlcXVlc3RJZD86IHN0cmluZztcbiAgLyoqIGBkZXBsb3ltZW50TWlzbWF0Y2hSZXRyeUNvdW50YCBmcm9tIHRoZSBpbmNvbWluZyBtZXNzYWdlLCBpZiBhbnkuICovXG4gIHJldHJ5Q291bnQ/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBQdXRzIHRoaXMgZGVsaXZlcnkncyBtZXNzYWdlIGJhY2sgb24gdGhlIHF1ZXVlLCB0YXJnZXRlZCBhdCB0aGUgcnVuJ3Mgb3duXG4gICAqIGRlcGxveW1lbnQuIE9taXR0ZWQgYnkgY2FsbGVycyB0aGF0IGNhbm5vdCByZWNvbnN0cnVjdCB0aGVpciBtZXNzYWdlLCB3aGljaFxuICAgKiBtYWtlcyB0aGUgZ3VhcmQgZmFpbC1mYXN0LlxuICAgKi9cbiAgcmVlbnF1ZXVlPzogKGFyZ3M6IFJlZW5xdWV1ZUFyZ3MpID0+IFByb21pc2U8dm9pZD47XG4gIC8qKlxuICAgKiBDbGFzc2lmaWVzIGEgcmUtZW5xdWV1ZSBmYWlsdXJlIGFzIGRlZmluaXRpdmUgcHJvb2YgdGhhdCB0aGUgcGlubmVkXG4gICAqIGRlcGxveW1lbnQgY2Fubm90IHJlY2VpdmUgdGhlIG1lc3NhZ2UuIFVuY2xhc3NpZmllZCBmYWlsdXJlcyBhcmUgcmV0cmllZFxuICAgKiBieSByZWplY3RpbmcgdGhlIGhhbmRsZXIgYW5kIGxlYXZpbmcgdGhlIGN1cnJlbnQgcXVldWUgbWVzc2FnZSB1bmFja2VkLlxuICAgKi9cbiAgaXNEZXBsb3ltZW50VW5hdmFpbGFibGVFcnJvcj86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgLyoqXG4gICAqIE9yZGVyaW5nIGJhcnJpZXIgYXdhaXRlZCBvbmNlIGEgbWlzbWF0Y2ggaXMgY29uZmlybWVkLCBiZWZvcmUgZWl0aGVyXG4gICAqIHN0b3BwaW5nIGFjdGlvbi4gVW5kZXIgdHVyYm8gdGhlIGBydW5fc3RhcnRlZGAgd3JpdGUgaXMgYmFja2dyb3VuZGVkLCBhbmRcbiAgICogYm90aCBvdXRjb21lcyBoYW5kIHRoZSBydW4gb2ZmICh0byBhIGBydW5fZmFpbGVkYCBoZXJlLCBvciB0byB0aGUgcGlubmVkXG4gICAqIGRlcGxveW1lbnQncyBvd24gYHJ1bl9zdGFydGVkYCkg4oCUIHNvIHRoYXQgd3JpdGUgbXVzdCBoYXZlIGxhbmRlZCBmaXJzdC5cbiAgICovXG4gIGJlZm9yZVN0b3A/OiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xufSk6IFByb21pc2U8RGVwbG95bWVudEFmZmluaXR5UmVzdWx0PiB7XG4gIC8vIERlcGxveW1lbnQgYWZmaW5pdHkgaXMgb25seSBtZWFuaW5nZnVsIGluIHdvcmxkcyB3aG9zZSBkZXBsb3ltZW50cyBhcmVcbiAgLy8gYXRvbWljIGFuZCBpbW11dGFibGUsIHdoaWNoIHRoZSBXb3JsZCBkZWNsYXJlcyAod29ybGQtdmVyY2VsIGRvZXMpIGFuZFxuICAvLyBjYXBhYmlsaXRpZXMgZGVmYXVsdCB0byB1bnN1cHBvcnRlZC4gTG9jYWwgYW5kIHNlbGYtaG9zdGVkIHdvcmxkcyByZXBvcnQgYVxuICAvLyBzeW50aGV0aWMgZGVwbG95bWVudCBpZCAoZS5nLiBgZHBsX2xvY2FsQDxzZGstdmVyc2lvbj5gKSB0aGF0IGxlZ2l0aW1hdGVseVxuICAvLyBkaWZmZXJzIGFjcm9zcyBTREsgdmVyc2lvbnMgd2l0aGluIG9uZSBsb2dpY2FsIGVudmlyb25tZW50LCBzbyBndWFyZGluZ1xuICAvLyB0aGVtIHdvdWxkIGZhaWwgb3JkaW5hcnkgbG9jYWwgcnVucyBhZnRlciBhIHZlcnNpb24gYnVtcC5cbiAgaWYgKHdvcmxkLmNhcGFiaWxpdGllcz8uZGVwbG95bWVudEFmZmluaXR5ICE9PSB0cnVlKSB7XG4gICAgcmV0dXJuIENPTlRJTlVFO1xuICB9XG5cbiAgY29uc3QgY3VycmVudERlcGxveW1lbnRJZCA9IGF3YWl0IHdvcmxkLmdldERlcGxveW1lbnRJZCgpO1xuICBpZiAocnVuLmRlcGxveW1lbnRJZCA9PT0gY3VycmVudERlcGxveW1lbnRJZCkge1xuICAgIHJldHVybiBDT05USU5VRTtcbiAgfVxuXG4gIGF3YWl0IGJlZm9yZVN0b3A/LigpO1xuXG4gIGNvbnN0IG1heFJldHJpZXMgPSBnZXREZXBsb3ltZW50TWlzbWF0Y2hNYXhSZXRyaWVzKCk7XG4gIGNvbnN0IGxvZ0NvbnRleHQgPSB7XG4gICAgd29ya2Zsb3dSdW5JZDogcnVuLnJ1bklkLFxuICAgIHBpbm5lZERlcGxveW1lbnRJZDogcnVuLmRlcGxveW1lbnRJZCxcbiAgICBhY3R1YWxEZXBsb3ltZW50SWQ6IGN1cnJlbnREZXBsb3ltZW50SWQsXG4gICAgcmV0cnlDb3VudCxcbiAgICBtYXhSZXRyaWVzLFxuICB9O1xuXG4gIC8qKlxuICAgKiBSZWNvcmRzIHRoZSB0ZXJtaW5hbCBgcnVuX2ZhaWxlZGAuIE1pcnJvcnMgYHJlY29yZEZhdGFsUnVuRXJyb3JgOiBpdFxuICAgKiByZWNvcmRzIGFuZCByZXR1cm5zIHJhdGhlciB0aGFuIHRocm93aW5nLCBzbyB0aGUgY2FsbGVyIGFja3MgdGhlIG1lc3NhZ2VcbiAgICogaW5zdGVhZCBvZiBsZXR0aW5nIHRoZSBxdWV1ZSByZWRlbGl2ZXIgYSBydW4gdGhhdCBpcyBub3cgdGVybWluYWwuXG4gICAqL1xuICBjb25zdCBmYWlsUnVuID0gYXN5bmMgKFxuICAgIHJlY292ZXJ5QXR0ZW1wdHM6IG51bWJlcixcbiAgICBjYXVzZT86IHVua25vd25cbiAgKTogUHJvbWlzZTxEZXBsb3ltZW50QWZmaW5pdHlSZXN1bHQ+ID0+IHtcbiAgICBjb25zdCBlcnJvciA9IG5ldyBXb3JrZmxvd0RlcGxveW1lbnRNaXNtYXRjaEVycm9yKFxuICAgICAgcnVuLnJ1bklkLFxuICAgICAgcnVuLmRlcGxveW1lbnRJZCxcbiAgICAgIGN1cnJlbnREZXBsb3ltZW50SWQsXG4gICAgICB7IHJlY292ZXJ5QXR0ZW1wdHMsIGNhdXNlIH1cbiAgICApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICAgIHJ1bi5ydW5JZCxcbiAgICAgICAge1xuICAgICAgICAgIGV2ZW50VHlwZTogJ3J1bl9mYWlsZWQnLFxuICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgIC8vIFVuZW5jcnlwdGVkICh1bmRlZmluZWQga2V5KTogc2VlIHRoZSBub3RlIG9uXG4gICAgICAgICAgICAvLyBgZ3VhcmREZXBsb3ltZW50QWZmaW5pdHlgLiBkZWh5ZHJhdGUvaHlkcmF0ZSBhcmUgc2VsZi1kZXNjcmliaW5nLFxuICAgICAgICAgICAgLy8gc28gdGhpcyByZWFkcyBiYWNrIHdpdGhvdXQgYSBrZXkuXG4gICAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlUnVuRXJyb3IoXG4gICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICBydW4ucnVuSWQsXG4gICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAocnVuLnNwZWNWZXJzaW9uID8/IDApID49IFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DT01QUkVTU0lPTlxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGVycm9yQ29kZTogUlVOX0VSUk9SX0NPREVTLkRFUExPWU1FTlRfTUlTTUFUQ0gsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgeyByZXF1ZXN0SWQgfVxuICAgICAgKTtcbiAgICB9IGNhdGNoIChmYWlsRXJyb3IpIHtcbiAgICAgIC8vIFJ1biBhbHJlYWR5IHJlYWNoZWQgYSB0ZXJtaW5hbCBzdGF0ZSAoYSBjb25jdXJyZW50IHdyaXRlciBmYWlsZWQgaXQsIG9yXG4gICAgICAvLyBpdCB3YXMgY2FuY2VsbGVkL2V4cGlyZWQpIOKAlCBzdGlsbCBzdG9wLiBBbnl0aGluZyBlbHNlIGlzIGEgdHJhbnNpZW50XG4gICAgICAvLyBwZXJzaXN0ZW5jZSBmYWlsdXJlOiByZXRocm93IHNvIHRoZSBxdWV1ZSByZWRlbGl2ZXJzIGFuZCB3ZSB0cnkgYWdhaW4uXG4gICAgICBpZiAoXG4gICAgICAgICFFbnRpdHlDb25mbGljdEVycm9yLmlzKGZhaWxFcnJvcikgJiZcbiAgICAgICAgIVJ1bkV4cGlyZWRFcnJvci5pcyhmYWlsRXJyb3IpXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgZmFpbEVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0KCdmYWlsZWQnLCBydW4uZGVwbG95bWVudElkLCByZWNvdmVyeUF0dGVtcHRzKTtcbiAgfTtcblxuICBpZiAocmVlbnF1ZXVlICYmIHJldHJ5Q291bnQgPCBtYXhSZXRyaWVzKSB7XG4gICAgY29uc3QgYXR0ZW1wdCA9IHJldHJ5Q291bnQgKyAxO1xuICAgIC8vIEV4cG9uZW50aWFsLCBjYXBwZWQ6IDFzLCAycywgNHMg4oCUIGNoZWFwIGluc3VyYW5jZSBhZ2FpbnN0IGEgaG90XG4gICAgLy8gcmUtZW5xdWV1ZSBsb29wLCBhbmQgdGltZSBmb3IgYSBtaWQtZmxpZ2h0IHJvdXRpbmcgY2hhbmdlIHRvIHNldHRsZS5cbiAgICBjb25zdCBkZWxheVNlY29uZHMgPSBNYXRoLm1pbigyICoqIHJldHJ5Q291bnQsIE1BWF9SRVJPVVRFX0RFTEFZX1NFQ09ORFMpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCByZWVucXVldWUoe1xuICAgICAgICBkZXBsb3ltZW50SWQ6IHJ1bi5kZXBsb3ltZW50SWQsXG4gICAgICAgIHNwZWNWZXJzaW9uOiBydW4uc3BlY1ZlcnNpb24sXG4gICAgICAgIGRlcGxveW1lbnRNaXNtYXRjaFJldHJ5Q291bnQ6IGF0dGVtcHQsXG4gICAgICAgIGRlbGF5U2Vjb25kcyxcbiAgICAgIH0pO1xuICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAnV29ya2Zsb3cgcnVuIHJlY2VpdmVkIGJ5IGEgZGVwbG95bWVudCBpdCBpcyBub3QgcGlubmVkIHRvOyByZS1yb3V0aW5nIHRvIGl0cyBvd24gZGVwbG95bWVudCcsXG4gICAgICAgIHsgLi4ubG9nQ29udGV4dCwgYXR0ZW1wdCwgZGVsYXlTZWNvbmRzIH1cbiAgICAgICk7XG4gICAgICByZXR1cm4gcmVzdWx0KCdyZXJvdXRlZCcsIHJ1bi5kZXBsb3ltZW50SWQsIGF0dGVtcHQpO1xuICAgIH0gY2F0Y2ggKHJlZW5xdWV1ZUVycm9yKSB7XG4gICAgICAvLyBBIGdlbmVyaWMgc2VuZCBmYWlsdXJlIGNhbiBiZSB0cmFuc2llbnQgKDQyOSwgNXh4LCBjb25uZWN0L0ROUykuIERvIG5vdFxuICAgICAgLy8gdHVybiBvbmUgaW5mcmFzdHJ1Y3R1cmUgYmxpcCBpbnRvIGEgdGVybWluYWwgcnVuIGZhaWx1cmU6IHJlamVjdCB0aGVcbiAgICAgIC8vIGhhbmRsZXIgc28gdGhlIGN1cnJlbnQgbWVzc2FnZSByZW1haW5zIHVuYWNrZWQgYW5kIGlzIHJlZGVsaXZlcmVkLlxuICAgICAgaWYgKCFpc0RlcGxveW1lbnRVbmF2YWlsYWJsZUVycm9yPy4ocmVlbnF1ZXVlRXJyb3IpKSB7XG4gICAgICAgIHRocm93IHJlZW5xdWV1ZUVycm9yO1xuICAgICAgfVxuXG4gICAgICAvLyBUaGUgV29ybGQgZXhwbGljaXRseSBjbGFzc2lmaWVkIHRoZSB0YXJnZXQgYXMgdW5hdmFpbGFibGUg4oCUIGRlbGV0ZWQsXG4gICAgICAvLyBhZ2VkIG91dCBvZiBpdHMgcmV0ZW50aW9uIHdpbmRvdywgb3Igb3RoZXJ3aXNlIHVuZGlzY292ZXJhYmxlLiBCdXJuaW5nXG4gICAgICAvLyB0aGUgcmVzdCBvZiB0aGUgYnVkZ2V0IG9uIGEgZGVwbG95bWVudCB0aGF0IHByb3ZhYmx5IGNhbm5vdCBiZSByZWFjaGVkXG4gICAgICAvLyBvbmx5IGRlbGF5cyB0aGUgZmFpbHVyZSwgc28gZmFpbCBub3cuXG4gICAgICBydW50aW1lTG9nZ2VyLmVycm9yKFxuICAgICAgICAnQ2Fubm90IHJlLXJvdXRlIGEgbWlzcm91dGVkIHdvcmtmbG93IHJ1biB0byBpdHMgb3duIGRlcGxveW1lbnQ7IGZhaWxpbmcgdGhlIHJ1bicsXG4gICAgICAgIHtcbiAgICAgICAgICAuLi5sb2dDb250ZXh0LFxuICAgICAgICAgIGF0dGVtcHQsXG4gICAgICAgICAgZXJyb3JNZXNzYWdlOlxuICAgICAgICAgICAgcmVlbnF1ZXVlRXJyb3IgaW5zdGFuY2VvZiBFcnJvclxuICAgICAgICAgICAgICA/IHJlZW5xdWV1ZUVycm9yLm1lc3NhZ2VcbiAgICAgICAgICAgICAgOiBTdHJpbmcocmVlbnF1ZXVlRXJyb3IpLFxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgLy8gUmVjb3ZlcnkgbmV2ZXIgYWN0dWFsbHkgaGFwcGVuZWQsIHNvIHJlcG9ydCAwIGF0dGVtcHRzIGFuZCBsZXQgYGNhdXNlYFxuICAgICAgLy8gZXhwbGFpbiB3aHkuXG4gICAgICByZXR1cm4gZmFpbFJ1bigwLCByZWVucXVldWVFcnJvcik7XG4gICAgfVxuICB9XG5cbiAgcnVudGltZUxvZ2dlci5lcnJvcihcbiAgICByZXRyeUNvdW50ID4gMFxuICAgICAgPyAnV29ya2Zsb3cgcnVuIGtlcHQgYXJyaXZpbmcgYXQgYSBkZXBsb3ltZW50IGl0IGlzIG5vdCBwaW5uZWQgdG8gYWZ0ZXIgcmUtcm91dGluZzsgZmFpbGluZyB0aGUgcnVuJ1xuICAgICAgOiAnV29ya2Zsb3cgcnVuIHJlY2VpdmVkIGJ5IGEgZGVwbG95bWVudCBpdCBpcyBub3QgcGlubmVkIHRvOyBmYWlsaW5nIHRoZSBydW4nLFxuICAgIGxvZ0NvbnRleHRcbiAgKTtcbiAgcmV0dXJuIGZhaWxSdW4ocmV0cnlDb3VudCk7XG59XG4iXX0=
|
|
154
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95bWVudC1ndWFyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL2RlcGxveW1lbnQtZ3VhcmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLG1CQUFtQixFQUNuQixlQUFlLEVBQ2YsZUFBZSxFQUNmLCtCQUErQixHQUNoQyxNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsaUNBQWlDLEdBR2xDLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN4RCxPQUFPLEtBQUssU0FBUyxNQUFNLHNDQUFzQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWpFLCtDQUErQztBQUMvQyxNQUFNLHlCQUF5QixHQUFHLENBQUMsQ0FBQztBQXlCcEMsd0NBQXdDO0FBQ3hDLE1BQU0sUUFBUSxHQUE2QixFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsQ0FBQztBQUVuRTs7O0dBR0c7QUFDSCxTQUFTLE1BQU0sQ0FDYixPQUE4QixFQUM5QixrQkFBMEIsRUFDMUIsUUFBZ0I7SUFFaEIsT0FBTztRQUNMLE9BQU87UUFDUCxjQUFjLEVBQUU7WUFDZCxHQUFHLFNBQVMsQ0FBQyw2QkFBNkIsQ0FBQyxrQkFBa0IsQ0FBQztZQUM5RCxHQUFHLFNBQVMsQ0FBQyxvQ0FBb0MsQ0FBQyxRQUFRLENBQUM7WUFDM0QsR0FBRyxTQUFTLENBQUMsbUNBQW1DLENBQUMsT0FBTyxLQUFLLFVBQVUsQ0FBQztTQUN6RTtLQUNGLENBQUM7QUFDSixDQUFDO0FBcUJEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBK0JHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSx1QkFBdUIsQ0FBQyxFQUM1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QU87Z0JBQ3JDLFlBQVk7YUFDYixDQUFDLENBQUM7WUFDSCxhQUFhLENBQUMsSUFBSSxDQUNoQiw2RkFBNkYsRUFDN0YsRUFBRSxHQUFHLFVBQVUsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLENBQ3pDLENBQUM7WUFDRixPQUFPLE1BQU0sQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN2RCxDQUFDO1FBQUMsT0FBTyxjQUFjLEVBQUUsQ0FBQztZQUN4QiwwRUFBMEU7WUFDMUUsdUVBQXVFO1lBQ3ZFLHFFQUFxRTtZQUNyRSxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO2dCQUNwRCxNQUFNLGNBQWMsQ0FBQztZQUN2QixDQUFDO1lBRUQsc0VBQXNFO1lBQ3RFLHlFQUF5RTtZQUN6RSx5RUFBeUU7WUFDekUsd0NBQXdDO1lBQ3hDLGFBQWEsQ0FBQyxLQUFLLENBQ2pCLGlGQUFpRixFQUNqRjtnQkFDRSxHQUFHLFVBQVU7Z0JBQ2IsT0FBTztnQkFDUCxZQUFZLEVBQ1YsY0FBYyxZQUFZLEtBQUs7b0JBQzdCLENBQUMsQ0FBQyxjQUFjLENBQUMsT0FBTztvQkFDeEIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUM7YUFDN0IsQ0FDRixDQUFDO1lBQ0YseUVBQXlFO1lBQ3pFLGVBQWU7WUFDZixPQUFPLE9BQU8sQ0FBQyxDQUFDLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDcEMsQ0FBQztJQUNILENBQUM7SUFFRCxhQUFhLENBQUMsS0FBSyxDQUNqQixVQUFVLEdBQUcsQ0FBQztRQUNaLENBQUMsQ0FBQyxrR0FBa0c7UUFDcEcsQ0FBQyxDQUFDLDRFQUE0RSxFQUNoRixVQUFVLENBQ1gsQ0FBQztJQUNGLE9BQU8sT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQzdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBFbnRpdHlDb25mbGljdEVycm9yLFxuICBSVU5fRVJST1JfQ09ERVMsXG4gIFJ1bkV4cGlyZWRFcnJvcixcbiAgV29ya2Zsb3dEZXBsb3ltZW50TWlzbWF0Y2hFcnJvcixcbn0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQge1xuICBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NPTVBSRVNTSU9OLFxuICB0eXBlIFdvcmtmbG93UnVuLFxuICB0eXBlIFdvcmxkLFxufSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgcnVudGltZUxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBkZWh5ZHJhdGVSdW5FcnJvciB9IGZyb20gJy4uL3NlcmlhbGl6YXRpb24uanMnO1xuaW1wb3J0ICogYXMgQXR0cmlidXRlIGZyb20gJy4uL3RlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9ucy5qcyc7XG5pbXBvcnQgeyBnZXREZXBsb3ltZW50TWlzbWF0Y2hNYXhSZXRyaWVzIH0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuXG4vKiogQ2FwIG9uIHRoZSByZS1yb3V0ZSBiYWNrb2ZmLCBpbiBzZWNvbmRzLiAqL1xuY29uc3QgTUFYX1JFUk9VVEVfREVMQVlfU0VDT05EUyA9IDg7XG5cbi8qKlxuICogSG93IHRoZSBndWFyZCByZXNvbHZlZCBhIGRlbGl2ZXJ5LiBCb3RoIG5vbi1gY29udGludWVgIG91dGNvbWVzIG1lYW4gdGhlXG4gKiBjYWxsZXIgbXVzdCBhY2sgdGhlIG1lc3NhZ2UgYW5kIHJldHVybiB3aXRob3V0IGV4ZWN1dGluZyBhbnl0aGluZy5cbiAqL1xuZXhwb3J0IHR5cGUgRGVwbG95bWVudEFmZmluaXR5T3V0Y29tZSA9XG4gIC8qKiBUaGUgcnVuIGJlbG9uZ3MgaGVyZSAob3IgdGhpcyB3b3JsZCBoYXMgbm8gZGVwbG95bWVudCBhZmZpbml0eSkuICovXG4gIHwgJ2NvbnRpbnVlJ1xuICAvKiogTWlzcm91dGVkOyByZS1lbnF1ZXVlZCBhdCB0aGUgcnVuJ3Mgb3duIGRlcGxveW1lbnQuICovXG4gIHwgJ3Jlcm91dGVkJ1xuICAvKiogTWlzcm91dGVkIGFuZCBvdXQgb2YgYnVkZ2V0IChvciB1bnJvdXRhYmxlKTsgYHJ1bl9mYWlsZWRgIHJlY29yZGVkLiAqL1xuICB8ICdmYWlsZWQnO1xuXG4vKipcbiAqIGBzcGFuQXR0cmlidXRlc2AgaXMgcHJlc2VudCBvbmx5IG9uIGEgbWlzcm91dGVkIGRlbGl2ZXJ5OiBtaXNtYXRjaGVzIGFyZVxuICogcmFyZSwgc28gdGhlIHByZXNlbmNlIG9mIGB3b3JrZmxvdy5kZXBsb3ltZW50LnBpbm5lZF9pZGAgb24gYSBzcGFuICppcyogdGhlXG4gKiBzaWduYWwgdGhhdCBvbmUgaGFwcGVuZWQsIGFuZCBgcmVjb3ZlcmVkYCBzZXBhcmF0ZXMgdGhlIG9uZXMgYSByZS1yb3V0ZSBmaXhlZFxuICogZnJvbSB0aGUgb25lcyB0aGF0IGtlcHQgbWlzcm91dGluZy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXBsb3ltZW50QWZmaW5pdHlSZXN1bHQge1xuICBvdXRjb21lOiBEZXBsb3ltZW50QWZmaW5pdHlPdXRjb21lO1xuICBzcGFuQXR0cmlidXRlcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+O1xufVxuXG4vKiogVGhlIGNvbW1vbiBjYXNlLCBhbGxvY2F0aW9uLWZyZWUuICovXG5jb25zdCBDT05USU5VRTogRGVwbG95bWVudEFmZmluaXR5UmVzdWx0ID0geyBvdXRjb21lOiAnY29udGludWUnIH07XG5cbi8qKlxuICogQnVpbGRzIGEgc3RvcHBpbmcgcmVzdWx0LiBgYXR0ZW1wdHNgIGlzIHRoZSByZS1yb3V0ZSBjb3VudCAqaW5jbHVkaW5nKiB0aGlzXG4gKiBpbnZvY2F0aW9uJ3Mgb3duIGF0dGVtcHQsIHNvIHRoZSBzcGFuIGF0dHJpYnV0ZSByZWFkcyBhcyBcImF0dGVtcHRzIHNvIGZhclwiLlxuICovXG5mdW5jdGlvbiByZXN1bHQoXG4gIG91dGNvbWU6ICdyZXJvdXRlZCcgfCAnZmFpbGVkJyxcbiAgcGlubmVkRGVwbG95bWVudElkOiBzdHJpbmcsXG4gIGF0dGVtcHRzOiBudW1iZXJcbik6IERlcGxveW1lbnRBZmZpbml0eVJlc3VsdCB7XG4gIHJldHVybiB7XG4gICAgb3V0Y29tZSxcbiAgICBzcGFuQXR0cmlidXRlczoge1xuICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuUGlubmVkRGVwbG95bWVudElkKHBpbm5lZERlcGxveW1lbnRJZCksXG4gICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dEZXBsb3ltZW50TWlzbWF0Y2hSZXRyeUNvdW50KGF0dGVtcHRzKSxcbiAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0RlcGxveW1lbnRNaXNtYXRjaFJlY292ZXJlZChvdXRjb21lID09PSAncmVyb3V0ZWQnKSxcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIEFyZ3VtZW50cyBoYW5kZWQgdG8gYSBjYWxsIHNpdGUncyByZS1lbnF1ZXVlIGNsb3N1cmUuIFRoZSBndWFyZCBvd25zIHRoZVxuICogcG9saWN5IChjb3VudGluZywgYmFja29mZiwgbG9nZ2luZywgdGVsZW1ldHJ5LCBlc2NhbGF0aW9uKSBhbmQgdGhlIGNhbGxcbiAqIHNpdGUgb3ducyBvbmx5IHRoZSBzaGFwZSBvZiB0aGUgbWVzc2FnZSBpdCBuZWVkcyB0byBwdXQgYmFjayBvbiB0aGUgcXVldWUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVlbnF1ZXVlQXJncyB7XG4gIC8qKiBUaGUgZGVwbG95bWVudCB0byB0YXJnZXQ6IHRoZSBvbmUgdGhlIHJ1biBpcyBwaW5uZWQgdG8uICovXG4gIGRlcGxveW1lbnRJZDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHJ1bidzIHNwZWMgdmVyc2lvbiwgc28gdGhlIHdvcmxkIHBpY2tzIHRoZSByaWdodCBxdWV1ZSB0cmFuc3BvcnRcbiAgICogKENCT1IgdnMgSlNPTikuIFVuZGVmaW5lZCBvbiBsZWdhY3kgcnVucyB0aGF0IHByZWRhdGUgdGhlIGZpZWxkOyB3b3JsZHNcbiAgICogdGhlbiBmYWxsIGJhY2sgdG8gdGhlaXIgY3VycmVudCBkZWZhdWx0LlxuICAgKi9cbiAgc3BlY1ZlcnNpb246IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgZGVwbG95bWVudE1pc21hdGNoUmV0cnlDb3VudDogbnVtYmVyO1xuICAvKiogQmFja29mZiBiZWZvcmUgdGhlIHJlLXJvdXRlZCBtZXNzYWdlIGJlY29tZXMgdmlzaWJsZS4gKi9cbiAgZGVsYXlTZWNvbmRzOiBudW1iZXI7XG59XG5cbi8qKlxuICogR3VhcmRzIGRlcGxveW1lbnQgYWZmaW5pdHk6IGEgcnVuIG1heSBvbmx5IGV4ZWN1dGUgb24gdGhlIGRlcGxveW1lbnQgaXQgaXNcbiAqIHBpbm5lZCB0by5cbiAqXG4gKiBBIHJ1bidzIGBkZXBsb3ltZW50SWRgIGlzIGZpeGVkIHdoZW4gaXQgc3RhcnRzOiB0aGUgZGVwbG95bWVudCB0aGF0IGNhbGxlZFxuICogYHN0YXJ0KClgLCBvciB3aGF0ZXZlciBgc3RhcnQoeyBkZXBsb3ltZW50SWQgfSlgIHJlc29sdmVkIHRvIChhbiBleHBsaWNpdCBpZFxuICogb3IgYCdsYXRlc3QnYCkuIE5vIHJlcGxheSBvciBzdGVwIGV4ZWN1dGlvbiBtYXkgaGFwcGVuIGFueXdoZXJlIGVsc2U6XG4gKiB0aGUgYnVuZGxlcyBoZXJlIG1heSBub3QgbWF0Y2ggdGhlIHJ1bidzIHBlcnNpc3RlZCBoaXN0b3J5LCBhbmQgYW55IHN0ZXBcbiAqIGRpc3BhdGNoZWQgZnJvbSBoZXJlIGRlcml2ZXMgdGhlIHBlci1ydW4gZW5jcnlwdGlvbiBrZXkgZnJvbSB0aGUgd3JvbmdcbiAqIGRlcGxveW1lbnQncyBtYXN0ZXIga2V5LCB3aGljaCBzdXJmYWNlcyBhcyBhIGBSdW50aW1lRGVjcnlwdGlvbkVycm9yYCB0aGVcbiAqIHF1ZXVlIHJldHJ5IGNhbGxiYWNrIHN3YWxsb3dzIGludG8gYSBibGFuayBcImV4Y2VlZGVkIG1heCByZXRyaWVzXCIuXG4gKlxuICogQSBtaXNyb3V0ZWQgZGVsaXZlcnkgaXMgbm90IHRyZWF0ZWQgYXMgcGVybWFuZW50LiBSYXRoZXIgdGhhbiBmYWlsaW5nXG4gKiBpbW1lZGlhdGVseSwgcmUtZW5xdWV1ZSB0aGUgbWVzc2FnZSAqZXhwbGljaXRseSB0YXJnZXRlZCogYXQgdGhlIHJ1bidzIG93blxuICogZGVwbG95bWVudDsgdGhhdCBzZW5kIGlzIHN0cmljdGx5IGJldHRlci1hZGRyZXNzZWQgdGhhbiB0aGUgb25lIHRoYXRcbiAqIG1pc3JvdXRlZCwgd2hpY2ggaW5oZXJpdGVkIHRoZSBwcm9kdWNpbmcgZGVwbG95bWVudCdzIGFtYmllbnQgaWQuIEZhaWwgb25seVxuICogb25jZSB0aGUgYnVkZ2V0IChgV09SS0ZMT1dfREVQTE9ZTUVOVF9NSVNNQVRDSF9NQVhfUkVUUklFU2AsIGRlZmF1bHQgMykgaXNcbiAqIHNwZW50LCBtaXJyb3JpbmcgaG93IGEgcmVwbGF5IGRpdmVyZ2VuY2UgZ2V0cyBib3VuZGVkIHJlY292ZXJ5IHJlcGxheXMgYmVmb3JlXG4gKiBiZWluZyByZWNvcmRlZCBhcyBhIGNvcnJ1cHRlZCBldmVudCBsb2cuXG4gKlxuICogQ2FsbGVycyBtdXN0IHBhc3MgYSBydW4gZW50aXR5IHRoZXkgYWxyZWFkeSBoYXZlIGluIGhhbmQgKGV2ZXJ5IGNhbGwgc2l0ZVxuICogbG9hZHMgdGhlIHJ1biBmb3Igb3RoZXIgcmVhc29ucyksIHNvIHRoZSBndWFyZCBjb3N0cyBubyBleHRyYSByb3VuZCB0cmlwLlxuICogKGB3b3JsZC5nZXREZXBsb3ltZW50SWQoKWAgcmVhZHMgdGhlIGFtYmllbnQgZGVwbG95bWVudCBpZCwgZS5nLlxuICogYFZFUkNFTF9ERVBMT1lNRU5UX0lEYCwgYW5kIGRvZXMgbm90IGNhbGwgdGhlIGJhY2tlbmQgZWl0aGVyLilcbiAqXG4gKiBUaGUgZmFpbHVyZSBpcyByZWNvcmRlZCAqKndpdGhvdXQgcmVzb2x2aW5nIHRoZSBydW4ncyBlbmNyeXB0aW9uIGtleSoqOiB0aGVcbiAqIGtleSBpcyBmZXRjaGVkIGZyb20gdGhlIHBpbm5lZCBkZXBsb3ltZW50J3MgQVBJLCBvZnRlbiB1bmF2YWlsYWJsZSBvbmNlIHRoYXRcbiAqIGRlcGxveW1lbnQgaXMgcGFzdCBpdHMgcmV0ZW50aW9uIHdpbmRvdywgc28gZGVwZW5kaW5nIG9uIGl0IHdvdWxkIHRocm93IGhlcmVcbiAqIGluc3RlYWQgb2YgcmVjb3JkaW5nIHRoZSBmYWlsdXJlLiBUaGUgcGF5bG9hZCBpcyB3cml0dGVuIHVuZW5jcnlwdGVkIChpdFxuICogaG9sZHMgb25seSBkZXBsb3ltZW50IGlkcywgbm90aGluZyBzZW5zaXRpdmUpLCBhbmQgdGhlIHBsYWludGV4dCBgZXJyb3JDb2RlYFxuICogaXMgdGhlIHNpZ25hbCBvYnNlcnZhYmlsaXR5IGFuZCB0aGUgVUkga2V5IG9mZi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGd1YXJkRGVwbG95bWVudEFmZmluaXR5KHtcbiAgd29ybGQsXG4gIHJ1bixcbiAgcmVxdWVzdElkLFxuICByZXRyeUNvdW50ID0gMCxcbiAgcmVlbnF1ZXVlLFxuICBpc0RlcGxveW1lbnRVbmF2YWlsYWJsZUVycm9yLFxuICBiZWZvcmVTdG9wLFxufToge1xuICB3b3JsZDogV29ybGQ7XG4gIHJ1bjogUGljazxXb3JrZmxvd1J1biwgJ3J1bklkJyB8ICdkZXBsb3ltZW50SWQnIHwgJ3NwZWNWZXJzaW9uJz47XG4gIHJlcXVlc3RJZD86IHN0cmluZztcbiAgLyoqIGBkZXBsb3ltZW50TWlzbWF0Y2hSZXRyeUNvdW50YCBmcm9tIHRoZSBpbmNvbWluZyBtZXNzYWdlLCBpZiBhbnkuICovXG4gIHJldHJ5Q291bnQ/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBQdXRzIHRoaXMgZGVsaXZlcnkncyBtZXNzYWdlIGJhY2sgb24gdGhlIHF1ZXVlLCB0YXJnZXRlZCBhdCB0aGUgcnVuJ3Mgb3duXG4gICAqIGRlcGxveW1lbnQuIE9taXR0ZWQgYnkgY2FsbGVycyB0aGF0IGNhbm5vdCByZWNvbnN0cnVjdCB0aGVpciBtZXNzYWdlLCB3aGljaFxuICAgKiBtYWtlcyB0aGUgZ3VhcmQgZmFpbC1mYXN0LlxuICAgKi9cbiAgcmVlbnF1ZXVlPzogKGFyZ3M6IFJlZW5xdWV1ZUFyZ3MpID0+IFByb21pc2U8dm9pZD47XG4gIC8qKlxuICAgKiBDbGFzc2lmaWVzIGEgcmUtZW5xdWV1ZSBmYWlsdXJlIGFzIGRlZmluaXRpdmUgcHJvb2YgdGhhdCB0aGUgcGlubmVkXG4gICAqIGRlcGxveW1lbnQgY2Fubm90IHJlY2VpdmUgdGhlIG1lc3NhZ2UuIFVuY2xhc3NpZmllZCBmYWlsdXJlcyBhcmUgcmV0cmllZFxuICAgKiBieSByZWplY3RpbmcgdGhlIGhhbmRsZXIgYW5kIGxlYXZpbmcgdGhlIGN1cnJlbnQgcXVldWUgbWVzc2FnZSB1bmFja2VkLlxuICAgKi9cbiAgaXNEZXBsb3ltZW50VW5hdmFpbGFibGVFcnJvcj86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgLyoqXG4gICAqIE9yZGVyaW5nIGJhcnJpZXIgYXdhaXRlZCBvbmNlIGEgbWlzbWF0Y2ggaXMgY29uZmlybWVkLCBiZWZvcmUgZWl0aGVyXG4gICAqIHN0b3BwaW5nIGFjdGlvbi4gVW5kZXIgdHVyYm8gdGhlIGBydW5fc3RhcnRlZGAgd3JpdGUgaXMgYmFja2dyb3VuZGVkLCBhbmRcbiAgICogYm90aCBvdXRjb21lcyBoYW5kIHRoZSBydW4gb2ZmICh0byBhIGBydW5fZmFpbGVkYCBoZXJlLCBvciB0byB0aGUgcGlubmVkXG4gICAqIGRlcGxveW1lbnQncyBvd24gYHJ1bl9zdGFydGVkYCksIHNvIHRoYXQgd3JpdGUgbXVzdCBoYXZlIGxhbmRlZCBmaXJzdC5cbiAgICovXG4gIGJlZm9yZVN0b3A/OiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xufSk6IFByb21pc2U8RGVwbG95bWVudEFmZmluaXR5UmVzdWx0PiB7XG4gIC8vIERlcGxveW1lbnQgYWZmaW5pdHkgaXMgb25seSBtZWFuaW5nZnVsIGluIHdvcmxkcyB3aG9zZSBkZXBsb3ltZW50cyBhcmVcbiAgLy8gYXRvbWljIGFuZCBpbW11dGFibGUsIHdoaWNoIHRoZSBXb3JsZCBkZWNsYXJlcyAod29ybGQtdmVyY2VsIGRvZXMpIGFuZFxuICAvLyBjYXBhYmlsaXRpZXMgZGVmYXVsdCB0byB1bnN1cHBvcnRlZC4gTG9jYWwgYW5kIHNlbGYtaG9zdGVkIHdvcmxkcyByZXBvcnQgYVxuICAvLyBzeW50aGV0aWMgZGVwbG95bWVudCBpZCAoZS5nLiBgZHBsX2xvY2FsQDxzZGstdmVyc2lvbj5gKSB0aGF0IGxlZ2l0aW1hdGVseVxuICAvLyBkaWZmZXJzIGFjcm9zcyBTREsgdmVyc2lvbnMgd2l0aGluIG9uZSBsb2dpY2FsIGVudmlyb25tZW50LCBzbyBndWFyZGluZ1xuICAvLyB0aGVtIHdvdWxkIGZhaWwgb3JkaW5hcnkgbG9jYWwgcnVucyBhZnRlciBhIHZlcnNpb24gYnVtcC5cbiAgaWYgKHdvcmxkLmNhcGFiaWxpdGllcz8uZGVwbG95bWVudEFmZmluaXR5ICE9PSB0cnVlKSB7XG4gICAgcmV0dXJuIENPTlRJTlVFO1xuICB9XG5cbiAgY29uc3QgY3VycmVudERlcGxveW1lbnRJZCA9IGF3YWl0IHdvcmxkLmdldERlcGxveW1lbnRJZCgpO1xuICBpZiAocnVuLmRlcGxveW1lbnRJZCA9PT0gY3VycmVudERlcGxveW1lbnRJZCkge1xuICAgIHJldHVybiBDT05USU5VRTtcbiAgfVxuXG4gIGF3YWl0IGJlZm9yZVN0b3A/LigpO1xuXG4gIGNvbnN0IG1heFJldHJpZXMgPSBnZXREZXBsb3ltZW50TWlzbWF0Y2hNYXhSZXRyaWVzKCk7XG4gIGNvbnN0IGxvZ0NvbnRleHQgPSB7XG4gICAgd29ya2Zsb3dSdW5JZDogcnVuLnJ1bklkLFxuICAgIHBpbm5lZERlcGxveW1lbnRJZDogcnVuLmRlcGxveW1lbnRJZCxcbiAgICBhY3R1YWxEZXBsb3ltZW50SWQ6IGN1cnJlbnREZXBsb3ltZW50SWQsXG4gICAgcmV0cnlDb3VudCxcbiAgICBtYXhSZXRyaWVzLFxuICB9O1xuXG4gIC8qKlxuICAgKiBSZWNvcmRzIHRoZSB0ZXJtaW5hbCBgcnVuX2ZhaWxlZGAuIE1pcnJvcnMgYHJlY29yZEZhdGFsUnVuRXJyb3JgOiBpdFxuICAgKiByZWNvcmRzIGFuZCByZXR1cm5zIHJhdGhlciB0aGFuIHRocm93aW5nLCBzbyB0aGUgY2FsbGVyIGFja3MgdGhlIG1lc3NhZ2VcbiAgICogaW5zdGVhZCBvZiBsZXR0aW5nIHRoZSBxdWV1ZSByZWRlbGl2ZXIgYSBydW4gdGhhdCBpcyBub3cgdGVybWluYWwuXG4gICAqL1xuICBjb25zdCBmYWlsUnVuID0gYXN5bmMgKFxuICAgIHJlY292ZXJ5QXR0ZW1wdHM6IG51bWJlcixcbiAgICBjYXVzZT86IHVua25vd25cbiAgKTogUHJvbWlzZTxEZXBsb3ltZW50QWZmaW5pdHlSZXN1bHQ+ID0+IHtcbiAgICBjb25zdCBlcnJvciA9IG5ldyBXb3JrZmxvd0RlcGxveW1lbnRNaXNtYXRjaEVycm9yKFxuICAgICAgcnVuLnJ1bklkLFxuICAgICAgcnVuLmRlcGxveW1lbnRJZCxcbiAgICAgIGN1cnJlbnREZXBsb3ltZW50SWQsXG4gICAgICB7IHJlY292ZXJ5QXR0ZW1wdHMsIGNhdXNlIH1cbiAgICApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICAgIHJ1bi5ydW5JZCxcbiAgICAgICAge1xuICAgICAgICAgIGV2ZW50VHlwZTogJ3J1bl9mYWlsZWQnLFxuICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgIC8vIFVuZW5jcnlwdGVkICh1bmRlZmluZWQga2V5KTogc2VlIHRoZSBub3RlIG9uXG4gICAgICAgICAgICAvLyBgZ3VhcmREZXBsb3ltZW50QWZmaW5pdHlgLiBkZWh5ZHJhdGUvaHlkcmF0ZSBhcmUgc2VsZi1kZXNjcmliaW5nLFxuICAgICAgICAgICAgLy8gc28gdGhpcyByZWFkcyBiYWNrIHdpdGhvdXQgYSBrZXkuXG4gICAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlUnVuRXJyb3IoXG4gICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICBydW4ucnVuSWQsXG4gICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAocnVuLnNwZWNWZXJzaW9uID8/IDApID49IFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DT01QUkVTU0lPTlxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGVycm9yQ29kZTogUlVOX0VSUk9SX0NPREVTLkRFUExPWU1FTlRfTUlTTUFUQ0gsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgeyByZXF1ZXN0SWQgfVxuICAgICAgKTtcbiAgICB9IGNhdGNoIChmYWlsRXJyb3IpIHtcbiAgICAgIC8vIFJ1biBhbHJlYWR5IHJlYWNoZWQgYSB0ZXJtaW5hbCBzdGF0ZSAoYSBjb25jdXJyZW50IHdyaXRlciBmYWlsZWQgaXQsIG9yXG4gICAgICAvLyBpdCB3YXMgY2FuY2VsZWQvZXhwaXJlZCksIHNvIHN0aWxsIHN0b3AuIEFueXRoaW5nIGVsc2UgaXMgYSB0cmFuc2llbnRcbiAgICAgIC8vIHBlcnNpc3RlbmNlIGZhaWx1cmU6IHJldGhyb3cgc28gdGhlIHF1ZXVlIHJlZGVsaXZlcnMgYW5kIHdlIHRyeSBhZ2Fpbi5cbiAgICAgIGlmIChcbiAgICAgICAgIUVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZmFpbEVycm9yKSAmJlxuICAgICAgICAhUnVuRXhwaXJlZEVycm9yLmlzKGZhaWxFcnJvcilcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBmYWlsRXJyb3I7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQoJ2ZhaWxlZCcsIHJ1bi5kZXBsb3ltZW50SWQsIHJlY292ZXJ5QXR0ZW1wdHMpO1xuICB9O1xuXG4gIGlmIChyZWVucXVldWUgJiYgcmV0cnlDb3VudCA8IG1heFJldHJpZXMpIHtcbiAgICBjb25zdCBhdHRlbXB0ID0gcmV0cnlDb3VudCArIDE7XG4gICAgLy8gRXhwb25lbnRpYWwsIGNhcHBlZDogMXMsIDJzLCA0cy4gQ2hlYXAgaW5zdXJhbmNlIGFnYWluc3QgYSBob3RcbiAgICAvLyByZS1lbnF1ZXVlIGxvb3AsIGFuZCB0aW1lIGZvciBhIG1pZC1mbGlnaHQgcm91dGluZyBjaGFuZ2UgdG8gc2V0dGxlLlxuICAgIGNvbnN0IGRlbGF5U2Vjb25kcyA9IE1hdGgubWluKDIgKiogcmV0cnlDb3VudCwgTUFYX1JFUk9VVEVfREVMQVlfU0VDT05EUyk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHJlZW5xdWV1ZSh7XG4gICAgICAgIGRlcGxveW1lbnRJZDogcnVuLmRlcGxveW1lbnRJZCxcbiAgICAgICAgc3BlY1ZlcnNpb246IHJ1bi5zcGVjVmVyc2lvbixcbiAgICAgICAgZGVwbG95bWVudE1pc21hdGNoUmV0cnlDb3VudDogYXR0ZW1wdCxcbiAgICAgICAgZGVsYXlTZWNvbmRzLFxuICAgICAgfSk7XG4gICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICdXb3JrZmxvdyBydW4gcmVjZWl2ZWQgYnkgYSBkZXBsb3ltZW50IGl0IGlzIG5vdCBwaW5uZWQgdG87IHJlLXJvdXRpbmcgdG8gaXRzIG93biBkZXBsb3ltZW50JyxcbiAgICAgICAgeyAuLi5sb2dDb250ZXh0LCBhdHRlbXB0LCBkZWxheVNlY29uZHMgfVxuICAgICAgKTtcbiAgICAgIHJldHVybiByZXN1bHQoJ3Jlcm91dGVkJywgcnVuLmRlcGxveW1lbnRJZCwgYXR0ZW1wdCk7XG4gICAgfSBjYXRjaCAocmVlbnF1ZXVlRXJyb3IpIHtcbiAgICAgIC8vIEEgZ2VuZXJpYyBzZW5kIGZhaWx1cmUgY2FuIGJlIHRyYW5zaWVudCAoNDI5LCA1eHgsIGNvbm5lY3QvRE5TKS4gRG8gbm90XG4gICAgICAvLyB0dXJuIG9uZSBpbmZyYXN0cnVjdHVyZSBibGlwIGludG8gYSB0ZXJtaW5hbCBydW4gZmFpbHVyZTogcmVqZWN0IHRoZVxuICAgICAgLy8gaGFuZGxlciBzbyB0aGUgY3VycmVudCBtZXNzYWdlIHJlbWFpbnMgdW5hY2tlZCBhbmQgaXMgcmVkZWxpdmVyZWQuXG4gICAgICBpZiAoIWlzRGVwbG95bWVudFVuYXZhaWxhYmxlRXJyb3I/LihyZWVucXVldWVFcnJvcikpIHtcbiAgICAgICAgdGhyb3cgcmVlbnF1ZXVlRXJyb3I7XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBXb3JsZCBleHBsaWNpdGx5IGNsYXNzaWZpZWQgdGhlIHRhcmdldCBhcyB1bmF2YWlsYWJsZTogZGVsZXRlZCxcbiAgICAgIC8vIGFnZWQgb3V0IG9mIGl0cyByZXRlbnRpb24gd2luZG93LCBvciBvdGhlcndpc2UgdW5kaXNjb3ZlcmFibGUuIEJ1cm5pbmdcbiAgICAgIC8vIHRoZSByZXN0IG9mIHRoZSBidWRnZXQgb24gYSBkZXBsb3ltZW50IHRoYXQgcHJvdmFibHkgY2Fubm90IGJlIHJlYWNoZWRcbiAgICAgIC8vIG9ubHkgZGVsYXlzIHRoZSBmYWlsdXJlLCBzbyBmYWlsIG5vdy5cbiAgICAgIHJ1bnRpbWVMb2dnZXIuZXJyb3IoXG4gICAgICAgICdDYW5ub3QgcmUtcm91dGUgYSBtaXNyb3V0ZWQgd29ya2Zsb3cgcnVuIHRvIGl0cyBvd24gZGVwbG95bWVudDsgZmFpbGluZyB0aGUgcnVuJyxcbiAgICAgICAge1xuICAgICAgICAgIC4uLmxvZ0NvbnRleHQsXG4gICAgICAgICAgYXR0ZW1wdCxcbiAgICAgICAgICBlcnJvck1lc3NhZ2U6XG4gICAgICAgICAgICByZWVucXVldWVFcnJvciBpbnN0YW5jZW9mIEVycm9yXG4gICAgICAgICAgICAgID8gcmVlbnF1ZXVlRXJyb3IubWVzc2FnZVxuICAgICAgICAgICAgICA6IFN0cmluZyhyZWVucXVldWVFcnJvciksXG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICAvLyBSZWNvdmVyeSBuZXZlciBhY3R1YWxseSBoYXBwZW5lZCwgc28gcmVwb3J0IDAgYXR0ZW1wdHMgYW5kIGxldCBgY2F1c2VgXG4gICAgICAvLyBleHBsYWluIHdoeS5cbiAgICAgIHJldHVybiBmYWlsUnVuKDAsIHJlZW5xdWV1ZUVycm9yKTtcbiAgICB9XG4gIH1cblxuICBydW50aW1lTG9nZ2VyLmVycm9yKFxuICAgIHJldHJ5Q291bnQgPiAwXG4gICAgICA/ICdXb3JrZmxvdyBydW4ga2VwdCBhcnJpdmluZyBhdCBhIGRlcGxveW1lbnQgaXQgaXMgbm90IHBpbm5lZCB0byBhZnRlciByZS1yb3V0aW5nOyBmYWlsaW5nIHRoZSBydW4nXG4gICAgICA6ICdXb3JrZmxvdyBydW4gcmVjZWl2ZWQgYnkgYSBkZXBsb3ltZW50IGl0IGlzIG5vdCBwaW5uZWQgdG87IGZhaWxpbmcgdGhlIHJ1bicsXG4gICAgbG9nQ29udGV4dFxuICApO1xuICByZXR1cm4gZmFpbFJ1bihyZXRyeUNvdW50KTtcbn1cbiJdfQ==
|
|
@@ -10,9 +10,9 @@ export declare function getPortLazy(): Promise<number | undefined>;
|
|
|
10
10
|
/**
|
|
11
11
|
* Resets the per-process port cache. Intended for tests; not used on the hot
|
|
12
12
|
* path. Callers must let any in-flight lookup settle (await the pending
|
|
13
|
-
* `getPortLazy()` call) before resetting: clearing `
|
|
13
|
+
* `getPortLazy()` call) before resetting: clearing `portState.inFlight` here does not
|
|
14
14
|
* cancel an already-scheduled resolution, so a late `.then` could otherwise
|
|
15
|
-
* repopulate `
|
|
15
|
+
* repopulate `portState.cachedPort` after the reset and bleed into the next test.
|
|
16
16
|
*/
|
|
17
17
|
export declare function resetPortCacheForTesting(): void;
|
|
18
18
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-port-lazy.d.ts","sourceRoot":"","sources":["../../src/runtime/get-port-lazy.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"get-port-lazy.d.ts","sourceRoot":"","sources":["../../src/runtime/get-port-lazy.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AA8BH,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CA4C/D;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,IAAI,IAAI,CAI/C;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACvC,EAAE,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,GACpC,IAAI,CAIN"}
|
|
@@ -8,32 +8,39 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import { createRequire } from 'node:module';
|
|
10
10
|
import { pathToFileURL } from 'node:url';
|
|
11
|
-
|
|
11
|
+
import { globalSingleton } from '@workflow/utils';
|
|
12
|
+
// All three live on `globalThis` (see `globalSingleton`) rather than at module
|
|
13
|
+
// scope. The resolved port is a fact about the process, not about one copy of
|
|
14
|
+
// this module, and per-copy caches would each pay the ~60ms `lsof` discovery
|
|
15
|
+
// and could each pin their own answer.
|
|
16
|
+
const portState = globalSingleton('@workflow/core//devServerPort', 1, () => ({
|
|
17
|
+
getPort: undefined,
|
|
18
|
+
cachedPort: undefined,
|
|
19
|
+
inFlight: undefined,
|
|
20
|
+
}));
|
|
12
21
|
// Per-process cache of the resolved port. The workflow server listens on a
|
|
13
22
|
// stable port for the lifetime of the process, but `getPort()` rediscovers it
|
|
14
|
-
// on every call by querying the OS for the process's listening sockets
|
|
23
|
+
// on every call by querying the OS for the process's listening sockets. On
|
|
15
24
|
// macOS that shells out to `lsof` (~60ms), which the runtime pays on EVERY
|
|
16
25
|
// workflow replay or step invocation. Since the port does not change within a
|
|
17
|
-
// process, resolve it once and reuse it. `
|
|
26
|
+
// process, resolve it once and reuse it. `portState.inFlight`
|
|
18
27
|
// dedupes concurrent first calls so discovery never runs more than once.
|
|
19
28
|
//
|
|
20
|
-
// The first concrete port is pinned for the lifetime of the process
|
|
29
|
+
// The first concrete port is pinned for the lifetime of the process: there is
|
|
21
30
|
// no per-call re-resolution. This is safe because the runtime only runs inside
|
|
22
31
|
// the already-listening dev-server process, and `getPort()` -> `getAllPorts()`
|
|
23
32
|
// returns a deterministic order, so repeated calls would resolve the same port
|
|
24
33
|
// anyway.
|
|
25
|
-
let _cachedPort;
|
|
26
|
-
let _inFlight;
|
|
27
34
|
export async function getPortLazy() {
|
|
28
35
|
// Fast path: already resolved a concrete port for this process.
|
|
29
|
-
if (
|
|
30
|
-
return
|
|
36
|
+
if (portState.cachedPort !== undefined) {
|
|
37
|
+
return portState.cachedPort;
|
|
31
38
|
}
|
|
32
|
-
// A discovery is already running
|
|
33
|
-
if (
|
|
34
|
-
return
|
|
39
|
+
// A discovery is already running, so share it rather than starting a second.
|
|
40
|
+
if (portState.inFlight) {
|
|
41
|
+
return portState.inFlight;
|
|
35
42
|
}
|
|
36
|
-
if (!
|
|
43
|
+
if (!portState.getPort) {
|
|
37
44
|
try {
|
|
38
45
|
// Construct specifier at runtime to defeat bundler static analysis.
|
|
39
46
|
const spec = ['@workflow/utils', 'get-port'].join('/');
|
|
@@ -41,42 +48,42 @@ export async function getPortLazy() {
|
|
|
41
48
|
// import.meta.url is unavailable in CJS re-bundled outputs.
|
|
42
49
|
const _require = createRequire(pathToFileURL(process.cwd() + '/package.json').href);
|
|
43
50
|
const mod = _require(spec);
|
|
44
|
-
|
|
51
|
+
portState.getPort = mod.getPort;
|
|
45
52
|
}
|
|
46
53
|
catch {
|
|
47
54
|
// Module not available (e.g., in a browser or minimal bundle)
|
|
48
|
-
|
|
55
|
+
portState.getPort = async () => undefined;
|
|
49
56
|
}
|
|
50
57
|
}
|
|
51
|
-
// `
|
|
58
|
+
// `portState.getPort` is always assigned by the block above; the fallback keeps the
|
|
52
59
|
// type non-nullable without a non-null assertion.
|
|
53
|
-
const resolver =
|
|
54
|
-
|
|
60
|
+
const resolver = portState.getPort ?? (async () => undefined);
|
|
61
|
+
portState.inFlight = resolver()
|
|
55
62
|
.then((port) => {
|
|
56
63
|
// Only cache a concrete port. A transient `undefined` (e.g. the server is
|
|
57
|
-
// not listening yet on the
|
|
64
|
+
// not listening yet on the first replay) must not poison the cache:
|
|
58
65
|
// leaving it unset lets the next call retry discovery.
|
|
59
66
|
if (typeof port === 'number') {
|
|
60
|
-
|
|
67
|
+
portState.cachedPort = port;
|
|
61
68
|
}
|
|
62
69
|
return port;
|
|
63
70
|
})
|
|
64
71
|
.finally(() => {
|
|
65
|
-
|
|
72
|
+
portState.inFlight = undefined;
|
|
66
73
|
});
|
|
67
|
-
return
|
|
74
|
+
return portState.inFlight;
|
|
68
75
|
}
|
|
69
76
|
/**
|
|
70
77
|
* Resets the per-process port cache. Intended for tests; not used on the hot
|
|
71
78
|
* path. Callers must let any in-flight lookup settle (await the pending
|
|
72
|
-
* `getPortLazy()` call) before resetting: clearing `
|
|
79
|
+
* `getPortLazy()` call) before resetting: clearing `portState.inFlight` here does not
|
|
73
80
|
* cancel an already-scheduled resolution, so a late `.then` could otherwise
|
|
74
|
-
* repopulate `
|
|
81
|
+
* repopulate `portState.cachedPort` after the reset and bleed into the next test.
|
|
75
82
|
*/
|
|
76
83
|
export function resetPortCacheForTesting() {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
84
|
+
portState.getPort = undefined;
|
|
85
|
+
portState.cachedPort = undefined;
|
|
86
|
+
portState.inFlight = undefined;
|
|
80
87
|
}
|
|
81
88
|
/**
|
|
82
89
|
* Installs a fake port resolver and clears the cache. Test-only seam: the real
|
|
@@ -85,8 +92,8 @@ export function resetPortCacheForTesting() {
|
|
|
85
92
|
* the only deterministic way to exercise the caching contract.
|
|
86
93
|
*/
|
|
87
94
|
export function setPortResolverForTesting(fn) {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
95
|
+
portState.getPort = fn;
|
|
96
|
+
portState.cachedPort = undefined;
|
|
97
|
+
portState.inFlight = undefined;
|
|
91
98
|
}
|
|
92
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
99
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LXBvcnQtbGF6eS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL2dldC1wb3J0LWxhenkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7R0FPRztBQUVILE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFbEQsK0VBQStFO0FBQy9FLDhFQUE4RTtBQUM5RSw2RUFBNkU7QUFDN0UsdUNBQXVDO0FBQ3ZDLE1BQU0sU0FBUyxHQUFHLGVBQWUsQ0FBQywrQkFBK0IsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUMzRSxPQUFPLEVBQUUsU0FBNEQ7SUFDckUsVUFBVSxFQUFFLFNBQStCO0lBQzNDLFFBQVEsRUFBRSxTQUFvRDtDQUMvRCxDQUFDLENBQUMsQ0FBQztBQUVKLDJFQUEyRTtBQUMzRSw4RUFBOEU7QUFDOUUsMkVBQTJFO0FBQzNFLDJFQUEyRTtBQUMzRSw4RUFBOEU7QUFDOUUsOERBQThEO0FBQzlELHlFQUF5RTtBQUN6RSxFQUFFO0FBQ0YsOEVBQThFO0FBQzlFLCtFQUErRTtBQUMvRSwrRUFBK0U7QUFDL0UsK0VBQStFO0FBQy9FLFVBQVU7QUFFVixNQUFNLENBQUMsS0FBSyxVQUFVLFdBQVc7SUFDL0IsZ0VBQWdFO0lBQ2hFLElBQUksU0FBUyxDQUFDLFVBQVUsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN2QyxPQUFPLFNBQVMsQ0FBQyxVQUFVLENBQUM7SUFDOUIsQ0FBQztJQUNELDZFQUE2RTtJQUM3RSxJQUFJLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN2QixPQUFPLFNBQVMsQ0FBQyxRQUFRLENBQUM7SUFDNUIsQ0FBQztJQUVELElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDO1lBQ0gsb0VBQW9FO1lBQ3BFLE1BQU0sSUFBSSxHQUFHLENBQUMsaUJBQWlCLEVBQUUsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZELG1FQUFtRTtZQUNuRSw0REFBNEQ7WUFDNUQsTUFBTSxRQUFRLEdBQUcsYUFBYSxDQUM1QixhQUFhLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLElBQUksQ0FDcEQsQ0FBQztZQUNGLE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMzQixTQUFTLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUM7UUFDbEMsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLDhEQUE4RDtZQUM5RCxTQUFTLENBQUMsT0FBTyxHQUFHLEtBQUssSUFBSSxFQUFFLENBQUMsU0FBUyxDQUFDO1FBQzVDLENBQUM7SUFDSCxDQUFDO0lBRUQsb0ZBQW9GO0lBQ3BGLGtEQUFrRDtJQUNsRCxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM5RCxTQUFTLENBQUMsUUFBUSxHQUFHLFFBQVEsRUFBRTtTQUM1QixJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtRQUNiLDBFQUEwRTtRQUMxRSxvRUFBb0U7UUFDcEUsdURBQXVEO1FBQ3ZELElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDN0IsU0FBUyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDOUIsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQyxDQUFDO1NBQ0QsT0FBTyxDQUFDLEdBQUcsRUFBRTtRQUNaLFNBQVMsQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDO0lBQ2pDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsT0FBTyxTQUFTLENBQUMsUUFBUSxDQUFDO0FBQzVCLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsd0JBQXdCO0lBQ3RDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDO0lBQzlCLFNBQVMsQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO0lBQ2pDLFNBQVMsQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDO0FBQ2pDLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSx5QkFBeUIsQ0FDdkMsRUFBcUM7SUFFckMsU0FBUyxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7SUFDdkIsU0FBUyxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7SUFDakMsU0FBUyxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUM7QUFDakMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTGF6eSBsb2FkZXIgZm9yIGdldFBvcnQgdGhhdCBwcmV2ZW50cyBidW5kbGVycyAoVHVyYm9wYWNrLCBlc2J1aWxkKVxuICogZnJvbSBzdGF0aWNhbGx5IHRyYWNpbmcgQHdvcmtmbG93L3V0aWxzL2dldC1wb3J0IGFuZCBpdHMgZmlsZXN5c3RlbVxuICogb3BlcmF0aW9ucyAocmVhZGRpciwgcmVhZEZpbGUsIHJlYWRsaW5rKSBpbnRvIHRoZSBmbG93IHJvdXRlIGJ1bmRsZS5cbiAqXG4gKiBVc2VzIGNyZWF0ZVJlcXVpcmUgd2l0aCBhIGR5bmFtaWNhbGx5IGNvbnN0cnVjdGVkIHNwZWNpZmllciBzbyB0aGVcbiAqIGRlcGVuZGVuY3kgaXMgaW52aXNpYmxlIHRvIGJ1bmRsZXIgc3RhdGljIGFuYWx5c2lzLlxuICovXG5cbmltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tICdub2RlOm1vZHVsZSc7XG5pbXBvcnQgeyBwYXRoVG9GaWxlVVJMIH0gZnJvbSAnbm9kZTp1cmwnO1xuaW1wb3J0IHsgZ2xvYmFsU2luZ2xldG9uIH0gZnJvbSAnQHdvcmtmbG93L3V0aWxzJztcblxuLy8gQWxsIHRocmVlIGxpdmUgb24gYGdsb2JhbFRoaXNgIChzZWUgYGdsb2JhbFNpbmdsZXRvbmApIHJhdGhlciB0aGFuIGF0IG1vZHVsZVxuLy8gc2NvcGUuIFRoZSByZXNvbHZlZCBwb3J0IGlzIGEgZmFjdCBhYm91dCB0aGUgcHJvY2Vzcywgbm90IGFib3V0IG9uZSBjb3B5IG9mXG4vLyB0aGlzIG1vZHVsZSwgYW5kIHBlci1jb3B5IGNhY2hlcyB3b3VsZCBlYWNoIHBheSB0aGUgfjYwbXMgYGxzb2ZgIGRpc2NvdmVyeVxuLy8gYW5kIGNvdWxkIGVhY2ggcGluIHRoZWlyIG93biBhbnN3ZXIuXG5jb25zdCBwb3J0U3RhdGUgPSBnbG9iYWxTaW5nbGV0b24oJ0B3b3JrZmxvdy9jb3JlLy9kZXZTZXJ2ZXJQb3J0JywgMSwgKCkgPT4gKHtcbiAgZ2V0UG9ydDogdW5kZWZpbmVkIGFzICgoKSA9PiBQcm9taXNlPG51bWJlciB8IHVuZGVmaW5lZD4pIHwgdW5kZWZpbmVkLFxuICBjYWNoZWRQb3J0OiB1bmRlZmluZWQgYXMgbnVtYmVyIHwgdW5kZWZpbmVkLFxuICBpbkZsaWdodDogdW5kZWZpbmVkIGFzIFByb21pc2U8bnVtYmVyIHwgdW5kZWZpbmVkPiB8IHVuZGVmaW5lZCxcbn0pKTtcblxuLy8gUGVyLXByb2Nlc3MgY2FjaGUgb2YgdGhlIHJlc29sdmVkIHBvcnQuIFRoZSB3b3JrZmxvdyBzZXJ2ZXIgbGlzdGVucyBvbiBhXG4vLyBzdGFibGUgcG9ydCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBwcm9jZXNzLCBidXQgYGdldFBvcnQoKWAgcmVkaXNjb3ZlcnMgaXRcbi8vIG9uIGV2ZXJ5IGNhbGwgYnkgcXVlcnlpbmcgdGhlIE9TIGZvciB0aGUgcHJvY2VzcydzIGxpc3RlbmluZyBzb2NrZXRzLiBPblxuLy8gbWFjT1MgdGhhdCBzaGVsbHMgb3V0IHRvIGBsc29mYCAofjYwbXMpLCB3aGljaCB0aGUgcnVudGltZSBwYXlzIG9uIEVWRVJZXG4vLyB3b3JrZmxvdyByZXBsYXkgb3Igc3RlcCBpbnZvY2F0aW9uLiBTaW5jZSB0aGUgcG9ydCBkb2VzIG5vdCBjaGFuZ2Ugd2l0aGluIGFcbi8vIHByb2Nlc3MsIHJlc29sdmUgaXQgb25jZSBhbmQgcmV1c2UgaXQuIGBwb3J0U3RhdGUuaW5GbGlnaHRgXG4vLyBkZWR1cGVzIGNvbmN1cnJlbnQgZmlyc3QgY2FsbHMgc28gZGlzY292ZXJ5IG5ldmVyIHJ1bnMgbW9yZSB0aGFuIG9uY2UuXG4vL1xuLy8gVGhlIGZpcnN0IGNvbmNyZXRlIHBvcnQgaXMgcGlubmVkIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIHByb2Nlc3M6IHRoZXJlIGlzXG4vLyBubyBwZXItY2FsbCByZS1yZXNvbHV0aW9uLiBUaGlzIGlzIHNhZmUgYmVjYXVzZSB0aGUgcnVudGltZSBvbmx5IHJ1bnMgaW5zaWRlXG4vLyB0aGUgYWxyZWFkeS1saXN0ZW5pbmcgZGV2LXNlcnZlciBwcm9jZXNzLCBhbmQgYGdldFBvcnQoKWAgLT4gYGdldEFsbFBvcnRzKClgXG4vLyByZXR1cm5zIGEgZGV0ZXJtaW5pc3RpYyBvcmRlciwgc28gcmVwZWF0ZWQgY2FsbHMgd291bGQgcmVzb2x2ZSB0aGUgc2FtZSBwb3J0XG4vLyBhbnl3YXkuXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQb3J0TGF6eSgpOiBQcm9taXNlPG51bWJlciB8IHVuZGVmaW5lZD4ge1xuICAvLyBGYXN0IHBhdGg6IGFscmVhZHkgcmVzb2x2ZWQgYSBjb25jcmV0ZSBwb3J0IGZvciB0aGlzIHByb2Nlc3MuXG4gIGlmIChwb3J0U3RhdGUuY2FjaGVkUG9ydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHBvcnRTdGF0ZS5jYWNoZWRQb3J0O1xuICB9XG4gIC8vIEEgZGlzY292ZXJ5IGlzIGFscmVhZHkgcnVubmluZywgc28gc2hhcmUgaXQgcmF0aGVyIHRoYW4gc3RhcnRpbmcgYSBzZWNvbmQuXG4gIGlmIChwb3J0U3RhdGUuaW5GbGlnaHQpIHtcbiAgICByZXR1cm4gcG9ydFN0YXRlLmluRmxpZ2h0O1xuICB9XG5cbiAgaWYgKCFwb3J0U3RhdGUuZ2V0UG9ydCkge1xuICAgIHRyeSB7XG4gICAgICAvLyBDb25zdHJ1Y3Qgc3BlY2lmaWVyIGF0IHJ1bnRpbWUgdG8gZGVmZWF0IGJ1bmRsZXIgc3RhdGljIGFuYWx5c2lzLlxuICAgICAgY29uc3Qgc3BlYyA9IFsnQHdvcmtmbG93L3V0aWxzJywgJ2dldC1wb3J0J10uam9pbignLycpO1xuICAgICAgLy8gVXNlIHByb2Nlc3MuY3dkKCktYmFzZWQgY3JlYXRlUmVxdWlyZSBmb3IgQ0pTL0VTTSBjb21wYXRpYmlsaXR5LlxuICAgICAgLy8gaW1wb3J0Lm1ldGEudXJsIGlzIHVuYXZhaWxhYmxlIGluIENKUyByZS1idW5kbGVkIG91dHB1dHMuXG4gICAgICBjb25zdCBfcmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoXG4gICAgICAgIHBhdGhUb0ZpbGVVUkwocHJvY2Vzcy5jd2QoKSArICcvcGFja2FnZS5qc29uJykuaHJlZlxuICAgICAgKTtcbiAgICAgIGNvbnN0IG1vZCA9IF9yZXF1aXJlKHNwZWMpO1xuICAgICAgcG9ydFN0YXRlLmdldFBvcnQgPSBtb2QuZ2V0UG9ydDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIE1vZHVsZSBub3QgYXZhaWxhYmxlIChlLmcuLCBpbiBhIGJyb3dzZXIgb3IgbWluaW1hbCBidW5kbGUpXG4gICAgICBwb3J0U3RhdGUuZ2V0UG9ydCA9IGFzeW5jICgpID0+IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvLyBgcG9ydFN0YXRlLmdldFBvcnRgIGlzIGFsd2F5cyBhc3NpZ25lZCBieSB0aGUgYmxvY2sgYWJvdmU7IHRoZSBmYWxsYmFjayBrZWVwcyB0aGVcbiAgLy8gdHlwZSBub24tbnVsbGFibGUgd2l0aG91dCBhIG5vbi1udWxsIGFzc2VydGlvbi5cbiAgY29uc3QgcmVzb2x2ZXIgPSBwb3J0U3RhdGUuZ2V0UG9ydCA/PyAoYXN5bmMgKCkgPT4gdW5kZWZpbmVkKTtcbiAgcG9ydFN0YXRlLmluRmxpZ2h0ID0gcmVzb2x2ZXIoKVxuICAgIC50aGVuKChwb3J0KSA9PiB7XG4gICAgICAvLyBPbmx5IGNhY2hlIGEgY29uY3JldGUgcG9ydC4gQSB0cmFuc2llbnQgYHVuZGVmaW5lZGAgKGUuZy4gdGhlIHNlcnZlciBpc1xuICAgICAgLy8gbm90IGxpc3RlbmluZyB5ZXQgb24gdGhlIGZpcnN0IHJlcGxheSkgbXVzdCBub3QgcG9pc29uIHRoZSBjYWNoZTpcbiAgICAgIC8vIGxlYXZpbmcgaXQgdW5zZXQgbGV0cyB0aGUgbmV4dCBjYWxsIHJldHJ5IGRpc2NvdmVyeS5cbiAgICAgIGlmICh0eXBlb2YgcG9ydCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgcG9ydFN0YXRlLmNhY2hlZFBvcnQgPSBwb3J0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBvcnQ7XG4gICAgfSlcbiAgICAuZmluYWxseSgoKSA9PiB7XG4gICAgICBwb3J0U3RhdGUuaW5GbGlnaHQgPSB1bmRlZmluZWQ7XG4gICAgfSk7XG4gIHJldHVybiBwb3J0U3RhdGUuaW5GbGlnaHQ7XG59XG5cbi8qKlxuICogUmVzZXRzIHRoZSBwZXItcHJvY2VzcyBwb3J0IGNhY2hlLiBJbnRlbmRlZCBmb3IgdGVzdHM7IG5vdCB1c2VkIG9uIHRoZSBob3RcbiAqIHBhdGguIENhbGxlcnMgbXVzdCBsZXQgYW55IGluLWZsaWdodCBsb29rdXAgc2V0dGxlIChhd2FpdCB0aGUgcGVuZGluZ1xuICogYGdldFBvcnRMYXp5KClgIGNhbGwpIGJlZm9yZSByZXNldHRpbmc6IGNsZWFyaW5nIGBwb3J0U3RhdGUuaW5GbGlnaHRgIGhlcmUgZG9lcyBub3RcbiAqIGNhbmNlbCBhbiBhbHJlYWR5LXNjaGVkdWxlZCByZXNvbHV0aW9uLCBzbyBhIGxhdGUgYC50aGVuYCBjb3VsZCBvdGhlcndpc2VcbiAqIHJlcG9wdWxhdGUgYHBvcnRTdGF0ZS5jYWNoZWRQb3J0YCBhZnRlciB0aGUgcmVzZXQgYW5kIGJsZWVkIGludG8gdGhlIG5leHQgdGVzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0UG9ydENhY2hlRm9yVGVzdGluZygpOiB2b2lkIHtcbiAgcG9ydFN0YXRlLmdldFBvcnQgPSB1bmRlZmluZWQ7XG4gIHBvcnRTdGF0ZS5jYWNoZWRQb3J0ID0gdW5kZWZpbmVkO1xuICBwb3J0U3RhdGUuaW5GbGlnaHQgPSB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogSW5zdGFsbHMgYSBmYWtlIHBvcnQgcmVzb2x2ZXIgYW5kIGNsZWFycyB0aGUgY2FjaGUuIFRlc3Qtb25seSBzZWFtOiB0aGUgcmVhbFxuICogcmVzb2x2ZXIgaXMgbG9hZGVkIHZpYSBgY3JlYXRlUmVxdWlyZWAgd2l0aCBhIHJ1bnRpbWUtYnVpbHQgc3BlY2lmaWVyICh0b1xuICogaGlkZSBpdCBmcm9tIGJ1bmRsZXJzKSwgd2hpY2ggYWxzbyBkZWZlYXRzIG1vZHVsZSBtb2NraW5nLCBzbyBpbmplY3Rpb24gaXNcbiAqIHRoZSBvbmx5IGRldGVybWluaXN0aWMgd2F5IHRvIGV4ZXJjaXNlIHRoZSBjYWNoaW5nIGNvbnRyYWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0UG9ydFJlc29sdmVyRm9yVGVzdGluZyhcbiAgZm46ICgpID0+IFByb21pc2U8bnVtYmVyIHwgdW5kZWZpbmVkPlxuKTogdm9pZCB7XG4gIHBvcnRTdGF0ZS5nZXRQb3J0ID0gZm47XG4gIHBvcnRTdGF0ZS5jYWNoZWRQb3J0ID0gdW5kZWZpbmVkO1xuICBwb3J0U3RhdGUuaW5GbGlnaHQgPSB1bmRlZmluZWQ7XG59XG4iXX0=
|
|
@@ -9,9 +9,9 @@
|
|
|
9
9
|
*
|
|
10
10
|
* Resolution order, in priority:
|
|
11
11
|
*
|
|
12
|
-
* 1. `globalThis[WorldCacheKey]
|
|
12
|
+
* 1. `globalThis[WorldCacheKey]`: populated by a successful prior
|
|
13
13
|
* `getWorld()` call. This is the steady-state hot path.
|
|
14
|
-
* 2. `globalThis[GetWorldFnKey]
|
|
14
|
+
* 2. `globalThis[GetWorldFnKey]`: populated by the module-load side
|
|
15
15
|
* effect at the bottom of `./world.ts`. Fires on every server bundle
|
|
16
16
|
* that reaches this file via `workflow` or `workflow/api` (which import
|
|
17
17
|
* `./world-init.ts` for its side effect; see that file for the full
|
|
@@ -9,9 +9,9 @@
|
|
|
9
9
|
*
|
|
10
10
|
* Resolution order, in priority:
|
|
11
11
|
*
|
|
12
|
-
* 1. `globalThis[WorldCacheKey]
|
|
12
|
+
* 1. `globalThis[WorldCacheKey]`: populated by a successful prior
|
|
13
13
|
* `getWorld()` call. This is the steady-state hot path.
|
|
14
|
-
* 2. `globalThis[GetWorldFnKey]
|
|
14
|
+
* 2. `globalThis[GetWorldFnKey]`: populated by the module-load side
|
|
15
15
|
* effect at the bottom of `./world.ts`. Fires on every server bundle
|
|
16
16
|
* that reaches this file via `workflow` or `workflow/api` (which import
|
|
17
17
|
* `./world-init.ts` for its side effect; see that file for the full
|
|
@@ -43,4 +43,4 @@ export async function getWorldLazy() {
|
|
|
43
43
|
}
|
|
44
44
|
throw new Error('Workflow world runtime was not initialized. Import from the host workflow entrypoints (`workflow`, `workflow/api`, or `workflow/runtime`) so @workflow/core/runtime/world-init can register getWorld before getWorldLazy() is used.');
|
|
45
45
|
}
|
|
46
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
46
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LXdvcmxkLWxhenkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9nZXQtd29ybGQtbGF6eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUdILE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTlFLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsd0JBQXdCLENBQUMsQ0FBQztBQUMzRCxNQUFNLG9CQUFvQixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsK0JBQStCLENBQUMsQ0FBQztBQUN6RSxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLDZCQUE2QixDQUFDLENBQUM7QUFRaEUsTUFBTSxDQUFDLEtBQUssVUFBVSxZQUFZO0lBQ2hDLE1BQU0sQ0FBQyxHQUFHLFVBQThCLENBQUM7SUFDekMsSUFBSSxDQUFDLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztRQUNyQixrQ0FBa0MsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztRQUNyRCxPQUFPLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBQ0QsSUFBSSxDQUFDLENBQUMsb0JBQW9CLENBQUMsRUFBRSxDQUFDO1FBQzVCLENBQUMsQ0FBQyxhQUFhLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQ2pELGtDQUFrQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO1FBQ3JELE9BQU8sQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFDRCwwRUFBMEU7SUFDMUUseUNBQXlDO0lBQ3pDLE1BQU0sVUFBVSxHQUFHLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNwQyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ2YsTUFBTSxLQUFLLEdBQUcsTUFBTSxVQUFVLEVBQUUsQ0FBQztRQUNqQyxrQ0FBa0MsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQyxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFDRCxNQUFNLElBQUksS0FBSyxDQUNiLHFPQUFxTyxDQUN0TyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTGF6eSBhY2Nlc3NvciBmb3IgdGhlIFdvcmxkIHNpbmdsZXRvbiB2aWEgZ2xvYmFsVGhpcyBzeW1ib2xzLlxuICpcbiAqIFRoaXMgbW9kdWxlIGV4aXN0cyB0byBicmVhayB0aGUgc3RhdGljIGltcG9ydCBjaGFpbiBmcm9tIHN0ZXAtc2lkZVxuICogbW9kdWxlcyAoc2VyaWFsaXphdGlvbiwgcnVuLCBoZWxwZXJzLCBzdGFydCkgdG8gd29ybGQudHMuIFdpdGhvdXQgaXQsXG4gKiBlc2J1aWxkIGJ1bmRsZXMgd29ybGQudHMgKGFuZCBpdHMgdHJhbnNpdGl2ZSBkZXBzOiB3b3JsZC1sb2NhbCxcbiAqIHdvcmxkLXZlcmNlbCwgcHJvY2Vzcy5jd2QoKSwgZXRjLikgaW50byB0aGUgc3RlcCByZWdpc3RyYXRpb25zIGJ1bmRsZSxcbiAqIHdoaWNoIHRyaWdnZXJzIFR1cmJvcGFjayBORlQgdHJhY2luZyBlcnJvcnMgaW4gdGhlIFYyIGNvbWJpbmVkIGZsb3cgcm91dGUuXG4gKlxuICogUmVzb2x1dGlvbiBvcmRlciwgaW4gcHJpb3JpdHk6XG4gKlxuICogMS4gYGdsb2JhbFRoaXNbV29ybGRDYWNoZUtleV1gOiBwb3B1bGF0ZWQgYnkgYSBzdWNjZXNzZnVsIHByaW9yXG4gKiAgICBgZ2V0V29ybGQoKWAgY2FsbC4gVGhpcyBpcyB0aGUgc3RlYWR5LXN0YXRlIGhvdCBwYXRoLlxuICogMi4gYGdsb2JhbFRoaXNbR2V0V29ybGRGbktleV1gOiBwb3B1bGF0ZWQgYnkgdGhlIG1vZHVsZS1sb2FkIHNpZGVcbiAqICAgIGVmZmVjdCBhdCB0aGUgYm90dG9tIG9mIGAuL3dvcmxkLnRzYC4gRmlyZXMgb24gZXZlcnkgc2VydmVyIGJ1bmRsZVxuICogICAgdGhhdCByZWFjaGVzIHRoaXMgZmlsZSB2aWEgYHdvcmtmbG93YCBvciBgd29ya2Zsb3cvYXBpYCAod2hpY2ggaW1wb3J0XG4gKiAgICBgLi93b3JsZC1pbml0LnRzYCBmb3IgaXRzIHNpZGUgZWZmZWN0OyBzZWUgdGhhdCBmaWxlIGZvciB0aGUgZnVsbFxuICogICAgcmF0aW9uYWxlKS4gVGhpcyBpcyB0aGUgY29sZC1zdGFydCBwYXRoIGZvciByb3V0ZXMgdGhhdCBjb25zdW1lIGhvc3RcbiAqICAgIGhlbHBlcnMgd2l0aG91dCBhbnkgcHJpb3Igd29ya2Zsb3cgcnVuLlxuICovXG5cbmltcG9ydCB0eXBlIHsgV29ybGQgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgYXNzZXJ0V29ybGRTdXBwb3J0c1J1bnRpbWVQcm90b2NvbCB9IGZyb20gJy4vd29ybGQtY29tcGF0aWJpbGl0eS5qcyc7XG5cbmNvbnN0IFdvcmxkQ2FjaGVLZXkgPSBTeW1ib2wuZm9yKCdAd29ya2Zsb3cvd29ybGQvL2NhY2hlJyk7XG5jb25zdCBXb3JsZENhY2hlUHJvbWlzZUtleSA9IFN5bWJvbC5mb3IoJ0B3b3JrZmxvdy93b3JsZC8vY2FjaGVQcm9taXNlJyk7XG5jb25zdCBHZXRXb3JsZEZuS2V5ID0gU3ltYm9sLmZvcignQHdvcmtmbG93L3dvcmxkLy9nZXRXb3JsZEZuJyk7XG5cbnR5cGUgR2xvYmFsV29ybGRDYWNoZSA9IHR5cGVvZiBnbG9iYWxUaGlzICYge1xuICBbV29ybGRDYWNoZUtleV0/OiBXb3JsZDtcbiAgW1dvcmxkQ2FjaGVQcm9taXNlS2V5XT86IFByb21pc2U8V29ybGQ+O1xuICBbR2V0V29ybGRGbktleV0/OiAoKSA9PiBQcm9taXNlPFdvcmxkPjtcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRXb3JsZExhenkoKTogUHJvbWlzZTxXb3JsZD4ge1xuICBjb25zdCBnID0gZ2xvYmFsVGhpcyBhcyBHbG9iYWxXb3JsZENhY2hlO1xuICBpZiAoZ1tXb3JsZENhY2hlS2V5XSkge1xuICAgIGFzc2VydFdvcmxkU3VwcG9ydHNSdW50aW1lUHJvdG9jb2woZ1tXb3JsZENhY2hlS2V5XSk7XG4gICAgcmV0dXJuIGdbV29ybGRDYWNoZUtleV07XG4gIH1cbiAgaWYgKGdbV29ybGRDYWNoZVByb21pc2VLZXldKSB7XG4gICAgZ1tXb3JsZENhY2hlS2V5XSA9IGF3YWl0IGdbV29ybGRDYWNoZVByb21pc2VLZXldO1xuICAgIGFzc2VydFdvcmxkU3VwcG9ydHNSdW50aW1lUHJvdG9jb2woZ1tXb3JsZENhY2hlS2V5XSk7XG4gICAgcmV0dXJuIGdbV29ybGRDYWNoZUtleV07XG4gIH1cbiAgLy8gd29ybGQtaW5pdCBzdGF0aWNhbGx5IGltcG9ydHMgd29ybGQudHMgaW4gaG9zdCBidW5kbGVzLCB3aGljaCByZWdpc3RlcnNcbiAgLy8gZ2V0V29ybGQgb24gZ2xvYmFsVGhpcyBhdCBtb2R1bGUgbG9hZC5cbiAgY29uc3QgZ2V0V29ybGRGbiA9IGdbR2V0V29ybGRGbktleV07XG4gIGlmIChnZXRXb3JsZEZuKSB7XG4gICAgY29uc3Qgd29ybGQgPSBhd2FpdCBnZXRXb3JsZEZuKCk7XG4gICAgYXNzZXJ0V29ybGRTdXBwb3J0c1J1bnRpbWVQcm90b2NvbCh3b3JsZCk7XG4gICAgcmV0dXJuIHdvcmxkO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICAnV29ya2Zsb3cgd29ybGQgcnVudGltZSB3YXMgbm90IGluaXRpYWxpemVkLiBJbXBvcnQgZnJvbSB0aGUgaG9zdCB3b3JrZmxvdyBlbnRyeXBvaW50cyAoYHdvcmtmbG93YCwgYHdvcmtmbG93L2FwaWAsIG9yIGB3b3JrZmxvdy9ydW50aW1lYCkgc28gQHdvcmtmbG93L2NvcmUvcnVudGltZS93b3JsZC1pbml0IGNhbiByZWdpc3RlciBnZXRXb3JsZCBiZWZvcmUgZ2V0V29ybGRMYXp5KCkgaXMgdXNlZC4nXG4gICk7XG59XG4iXX0=
|
|
@@ -20,7 +20,7 @@ export interface HealthCheckResult {
|
|
|
20
20
|
/**
|
|
21
21
|
* `@workflow/core` version of the responding deployment, used for
|
|
22
22
|
* capability detection (see `getRunCapabilities`). Omitted when the
|
|
23
|
-
* responding deployment did not provide the field as a string
|
|
23
|
+
* responding deployment did not provide the field as a string:
|
|
24
24
|
* for example, an older `@workflow/core` that predates this field,
|
|
25
25
|
* or a non-JSON plain-text health response.
|
|
26
26
|
*/
|
|
@@ -35,7 +35,7 @@ export interface HealthCheckResult {
|
|
|
35
35
|
*/
|
|
36
36
|
encryptionPublicKey?: string;
|
|
37
37
|
/**
|
|
38
|
-
* The responding deployment's `HOOK_RESUME_INPUT_VERSION
|
|
38
|
+
* The responding deployment's `HOOK_RESUME_INPUT_VERSION`: the protocol
|
|
39
39
|
* version at which the *consumer* (queue-message target) re-ensures the
|
|
40
40
|
* `hook_received` event from `hookInput` on replay. A cross-deployment
|
|
41
41
|
* `start()` stamps the *target's* value (not the caller's) into the new
|
|
@@ -75,7 +75,7 @@ export interface HealthCheckOptions {
|
|
|
75
75
|
* Queue namespace of the target deployment (e.g. `'eve'` for topics like
|
|
76
76
|
* `__eve_wkf_workflow_*`). Falls back to `WORKFLOW_QUEUE_NAMESPACE` in the
|
|
77
77
|
* calling process. Cross-context callers (e.g. the observability
|
|
78
|
-
* dashboard) must pass the target deployment's namespace explicitly
|
|
78
|
+
* dashboard) must pass the target deployment's namespace explicitly:
|
|
79
79
|
* the env fallback resolves in the caller's process, and a message
|
|
80
80
|
* published to a mismatched topic has no consumer, so the check would
|
|
81
81
|
* always time out.
|
|
@@ -93,7 +93,7 @@ export declare function healthCheck(world: World, options?: HealthCheckOptions):
|
|
|
93
93
|
* re-sorted. Every append source is already in canonical order relative to the
|
|
94
94
|
* tail (a cursor-delimited page, or a write-response delta), so receipt order is
|
|
95
95
|
* the order to keep, and re-sorting here would only cost a pass over the log.
|
|
96
|
-
* Nothing downstream may assume the tail is the newest event
|
|
96
|
+
* Nothing downstream may assume the tail is the newest event. See
|
|
97
97
|
* {@link maxEventSlot}.
|
|
98
98
|
*/
|
|
99
99
|
export declare function appendUniqueEvents(target: Event[], events: readonly Event[], targetIds?: Set<string>): void;
|
|
@@ -104,7 +104,7 @@ export declare function appendUniqueEvents(target: Event[], events: readonly Eve
|
|
|
104
104
|
*
|
|
105
105
|
* `preloadedEvents` is loaded `sortOrder: 'asc'` and is never re-sorted
|
|
106
106
|
* client-side, so a `hook_received` spliced in by the lazy-resume consumer must
|
|
107
|
-
* land in `eventId` order
|
|
107
|
+
* land in `eventId` order: a plain `push` would place a late-committing
|
|
108
108
|
* earlier event after events that sort before it, corrupting replay.
|
|
109
109
|
*
|
|
110
110
|
* Lexicographic string order is the log's order: a slot id is a fixed-width
|
|
@@ -190,7 +190,7 @@ export interface SkippedSlotReport {
|
|
|
190
190
|
* would raise the log's highest position past a position whose event is
|
|
191
191
|
* missing. Later writes read that maximum to say what they have seen, so each
|
|
192
192
|
* would claim a position it never saw, and the World only reports the span a
|
|
193
|
-
* write skips
|
|
193
|
+
* write skips: it would never send the missing one. Dropping costs one more
|
|
194
194
|
* round of the same events on the next write and keeps the log a prefix of the
|
|
195
195
|
* truth, which the note above {@link mergeReportedEvents} explains is always an
|
|
196
196
|
* available answer.
|
|
@@ -265,7 +265,7 @@ export declare function findEventSlotGap(events: readonly Event[]): EventSlotGap
|
|
|
265
265
|
*
|
|
266
266
|
* A hole can be transient. The World allocates a slot inside the insert that
|
|
267
267
|
* occupies it, so two concurrent writers can collide, one retry past the other,
|
|
268
|
-
* and the higher slot commit first
|
|
268
|
+
* and the higher slot commit first, leaving a window in which the lower one is
|
|
269
269
|
* genuinely absent from a strongly-consistent read and fills in a moment later.
|
|
270
270
|
* The window is one commit wide, so a short backoff clears it; anything that
|
|
271
271
|
* survives all three re-reads is a position no write will ever occupy.
|
|
@@ -276,7 +276,7 @@ export declare const SLOT_GAP_RECHECK_ATTEMPTS = 3;
|
|
|
276
276
|
* out, and return the settled log alongside the hole that survived.
|
|
277
277
|
*
|
|
278
278
|
* Reads are strongly consistent, so a hole is not an artifact of *when* the log
|
|
279
|
-
* was read
|
|
279
|
+
* was read, but it can be an artifact of a write that had not committed yet
|
|
280
280
|
* (see {@link SLOT_GAP_RECHECK_ATTEMPTS}). Distinguishing the two costs a
|
|
281
281
|
* re-read, which is only ever paid by a replay that already found a hole.
|
|
282
282
|
*
|
|
@@ -295,7 +295,7 @@ export declare function settleEventSlotGap(runId: string, loaded: LoadedEventLog
|
|
|
295
295
|
* One integer says it because the World keeps its positions dense: a writer
|
|
296
296
|
* that names slot N is claiming to hold every event from 1 to N and nothing
|
|
297
297
|
* above. The World answers by numbering the write above whatever the log has
|
|
298
|
-
* actually reached and handing back the events on the slots in between
|
|
298
|
+
* actually reached and handing back the events on the slots in between: the
|
|
299
299
|
* ones this writer decided without.
|
|
300
300
|
*
|
|
301
301
|
* Density is the World's invariant, not a claim about this particular read. A
|
|
@@ -326,14 +326,14 @@ export declare function slotSnapshotParams(events: readonly Event[]): SlotSnapsh
|
|
|
326
326
|
* The events a rejecting World attached to a `PreconditionFailedError`, when it
|
|
327
327
|
* returned the ones the client's snapshot was missing inline.
|
|
328
328
|
*
|
|
329
|
-
* Returns `null` for anything else
|
|
329
|
+
* Returns `null` for anything else: no details, a World that did not implement
|
|
330
330
|
* this, or a payload that does not narrow cleanly. Callers fall back to
|
|
331
331
|
* reloading the event log, which is always correct; this is untrusted-shaped
|
|
332
332
|
* data on a failure path, so nothing here is repaired.
|
|
333
333
|
*
|
|
334
334
|
* `runId` is the caller's run. Every event must belong to it: the delta is
|
|
335
335
|
* merged straight into the replay's log, and one foreign event there is a
|
|
336
|
-
* corrupt log rather than a corrected one
|
|
336
|
+
* corrupt log rather than a corrected one: the replay would consume a
|
|
337
337
|
* correlation id for an event that does not exist on this run.
|
|
338
338
|
*/
|
|
339
339
|
export declare function preconditionEventDelta(error: unknown, runId: string): {
|
|
@@ -349,19 +349,19 @@ export type EventCreator = (data: CreateEventRequest, params?: CreateEventParams
|
|
|
349
349
|
export declare function withHealthCheck(handler: (req: Request) => Promise<Response>, worldSpecVersion?: number): (req: Request) => Promise<Response>;
|
|
350
350
|
/**
|
|
351
351
|
* Idempotency key for a step's background-dispatch queue message, scoped to
|
|
352
|
-
* the step's IDENTITY
|
|
352
|
+
* the step's IDENTITY, correlation id plus (hashed) step name, rather than
|
|
353
353
|
* the bare correlation id.
|
|
354
354
|
*
|
|
355
355
|
* The scoping matters for resilient step dispatch under the precondition
|
|
356
356
|
* guard: a guard-rejected `step_created` leaves its (revoked) step message in
|
|
357
357
|
* flight, and the corrected replay may re-derive the same correlation id for
|
|
358
358
|
* a DIFFERENT step. Under a bare-correlationId key the corrected replay's
|
|
359
|
-
* dispatch would silently dedupe against the revoked in-flight message
|
|
359
|
+
* dispatch would silently dedupe against the revoked in-flight message,
|
|
360
360
|
* which then resolves `skipped` against the re-created entity (the server's
|
|
361
|
-
* stepName fence rejects its bare start)
|
|
361
|
+
* stepName fence rejects its bare start), and the legitimate step would
|
|
362
362
|
* never be executed. Scoping by step name keeps every dedup property that
|
|
363
363
|
* matters (crash recovery re-dispatch, concurrent handlers, the delayed
|
|
364
|
-
* retry sharing the suspension re-dispatch's key
|
|
364
|
+
* retry sharing the suspension re-dispatch's key: all name the same step)
|
|
365
365
|
* while letting the corrected schedule's dispatch through.
|
|
366
366
|
*
|
|
367
367
|
* Every producer of a step-dispatch (or step-retry) message must use this
|
|
@@ -391,15 +391,15 @@ export declare function getQueueOverhead(message: {
|
|
|
391
391
|
* If the world doesn't support encryption or the run has no key configured,
|
|
392
392
|
* the cached value is `undefined`.
|
|
393
393
|
*
|
|
394
|
-
* The resolved value is deliberately the *full* capability
|
|
395
|
-
* key plus the run's X25519 keypair
|
|
394
|
+
* The resolved value is deliberately the *full* capability (the symmetric AES
|
|
395
|
+
* key plus the run's X25519 keypair), not just a `CryptoKey`. A run reading
|
|
396
396
|
* its own event log can encounter sealed (`encp`) payloads that another run
|
|
397
397
|
* wrote to it (a cross-deployment hook resumption, say), and opening those
|
|
398
398
|
* needs the keypair. Resolving only the symmetric key would leave those
|
|
399
399
|
* payloads unopenable and wedge the run.
|
|
400
400
|
*
|
|
401
401
|
* Used by step / workflow handlers to defer the (potentially expensive)
|
|
402
|
-
* key fetch until the first code path that actually needs it
|
|
402
|
+
* key fetch until the first code path that actually needs it: typically
|
|
403
403
|
* input hydration on the success path, or error dehydration on a failure
|
|
404
404
|
* path. Both paths can race-call the accessor without triggering duplicate
|
|
405
405
|
* fetches.
|