@workflow/core 5.0.0-beta.5 → 5.0.0-beta.51
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/README.md +5 -0
- package/dist/attribute-changes.d.ts +5 -0
- package/dist/attribute-changes.d.ts.map +1 -0
- package/dist/attribute-changes.js +25 -0
- package/dist/capabilities.d.ts +35 -2
- package/dist/capabilities.d.ts.map +1 -1
- package/dist/capabilities.js +74 -5
- package/dist/capture-stack.d.ts +1 -1
- package/dist/capture-stack.js +2 -2
- 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 +19 -3
- package/dist/classify-error.d.ts.map +1 -1
- package/dist/classify-error.js +98 -6
- 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 +8 -6
- package/dist/create-hook.d.ts +72 -7
- package/dist/create-hook.d.ts.map +1 -1
- 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.d.ts.map +1 -1
- package/dist/describe-error.js +97 -12
- package/dist/encryption.d.ts +38 -4
- package/dist/encryption.d.ts.map +1 -1
- package/dist/encryption.js +96 -14
- package/dist/events-consumer.d.ts +297 -0
- package/dist/events-consumer.d.ts.map +1 -1
- package/dist/events-consumer.js +673 -42
- package/dist/flushable-stream.d.ts +97 -1
- package/dist/flushable-stream.d.ts.map +1 -1
- package/dist/flushable-stream.js +291 -11
- package/dist/global.d.ts +36 -2
- package/dist/global.d.ts.map +1 -1
- package/dist/global.js +21 -6
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/log-format.d.ts +2 -2
- package/dist/log-format.js +19 -12
- package/dist/logger.d.ts +1 -0
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +10 -6
- package/dist/private.d.ts +226 -9
- package/dist/private.d.ts.map +1 -1
- package/dist/private.js +626 -7
- package/dist/replay-divergence.d.ts +25 -0
- package/dist/replay-divergence.d.ts.map +1 -0
- package/dist/replay-divergence.js +61 -0
- package/dist/replay-payload-cache.d.ts +64 -0
- package/dist/replay-payload-cache.d.ts.map +1 -0
- package/dist/replay-payload-cache.js +158 -0
- package/dist/runtime/compute-instance.d.ts +13 -0
- package/dist/runtime/compute-instance.d.ts.map +1 -0
- package/dist/runtime/compute-instance.js +14 -0
- package/dist/runtime/constants.d.ts +315 -0
- package/dist/runtime/constants.d.ts.map +1 -1
- package/dist/runtime/constants.js +502 -16
- package/dist/runtime/count-step-started-events.d.ts +52 -0
- package/dist/runtime/count-step-started-events.d.ts.map +1 -0
- package/dist/runtime/count-step-started-events.js +72 -0
- package/dist/runtime/deployment-guard.d.ts +99 -0
- package/dist/runtime/deployment-guard.d.ts.map +1 -0
- package/dist/runtime/deployment-guard.js +154 -0
- package/dist/runtime/get-port-lazy.d.ts +15 -0
- package/dist/runtime/get-port-lazy.d.ts.map +1 -1
- package/dist/runtime/get-port-lazy.js +75 -6
- package/dist/runtime/get-world-lazy.d.ts +5 -14
- package/dist/runtime/get-world-lazy.d.ts.map +1 -1
- package/dist/runtime/get-world-lazy.js +19 -29
- package/dist/runtime/helpers.d.ts +415 -29
- package/dist/runtime/helpers.d.ts.map +1 -1
- package/dist/runtime/helpers.js +686 -57
- package/dist/runtime/quickjs-assets.generated.d.ts +14 -0
- package/dist/runtime/quickjs-assets.generated.d.ts.map +1 -0
- package/dist/runtime/quickjs-assets.generated.js +30 -0
- package/dist/runtime/quickjs-entrypoint.d.ts +158 -0
- package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -0
- package/dist/runtime/quickjs-entrypoint.js +1863 -0
- package/dist/runtime/quickjs-log-view.d.ts +129 -0
- package/dist/runtime/quickjs-log-view.d.ts.map +1 -0
- package/dist/runtime/quickjs-log-view.js +229 -0
- package/dist/runtime/quickjs-runtime.d.ts +244 -0
- package/dist/runtime/quickjs-runtime.d.ts.map +1 -0
- package/dist/runtime/quickjs-runtime.js +2427 -0
- package/dist/runtime/quickjs-serde.d.ts +107 -0
- package/dist/runtime/quickjs-serde.d.ts.map +1 -0
- package/dist/runtime/quickjs-serde.js +2159 -0
- package/dist/runtime/replay-budget.d.ts +97 -0
- package/dist/runtime/replay-budget.d.ts.map +1 -0
- package/dist/runtime/replay-budget.js +139 -0
- package/dist/runtime/replay-recovery-reporter.d.ts +36 -0
- package/dist/runtime/replay-recovery-reporter.d.ts.map +1 -0
- package/dist/runtime/replay-recovery-reporter.js +64 -0
- package/dist/runtime/resume-hook.d.ts +91 -8
- package/dist/runtime/resume-hook.d.ts.map +1 -1
- package/dist/runtime/resume-hook.js +512 -89
- package/dist/runtime/resume-latency.d.ts +150 -0
- package/dist/runtime/resume-latency.d.ts.map +1 -0
- package/dist/runtime/resume-latency.js +155 -0
- package/dist/runtime/run-id-time.d.ts +19 -0
- package/dist/runtime/run-id-time.d.ts.map +1 -0
- package/dist/runtime/run-id-time.js +42 -0
- package/dist/runtime/run.d.ts +72 -7
- package/dist/runtime/run.d.ts.map +1 -1
- package/dist/runtime/run.js +280 -53
- package/dist/runtime/runs.d.ts +54 -3
- package/dist/runtime/runs.d.ts.map +1 -1
- package/dist/runtime/runs.js +126 -16
- package/dist/runtime/start.d.ts +101 -2
- package/dist/runtime/start.d.ts.map +1 -1
- package/dist/runtime/start.js +352 -61
- package/dist/runtime/step-executor.d.ts +186 -5
- package/dist/runtime/step-executor.d.ts.map +1 -1
- package/dist/runtime/step-executor.js +768 -130
- package/dist/runtime/step-latency.d.ts +220 -0
- package/dist/runtime/step-latency.d.ts.map +1 -0
- package/dist/runtime/step-latency.js +215 -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 +75 -0
- package/dist/runtime/suspension-handler.d.ts +247 -7
- package/dist/runtime/suspension-handler.d.ts.map +1 -1
- package/dist/runtime/suspension-handler.js +1304 -125
- 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 +44 -0
- package/dist/runtime/vm-mode.d.ts.map +1 -0
- package/dist/runtime/vm-mode.js +62 -0
- package/dist/runtime/vm-serde-bundle.generated.d.ts +14 -0
- package/dist/runtime/vm-serde-bundle.generated.d.ts.map +1 -0
- package/dist/runtime/vm-serde-bundle.generated.js +16 -0
- package/dist/runtime/wait-continuation.d.ts +106 -0
- package/dist/runtime/wait-continuation.d.ts.map +1 -0
- package/dist/runtime/wait-continuation.js +136 -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 +32 -0
- package/dist/runtime/world-compatibility.d.ts.map +1 -0
- package/dist/runtime/world-compatibility.js +44 -0
- package/dist/runtime/world-init.d.ts +17 -42
- package/dist/runtime/world-init.d.ts.map +1 -1
- package/dist/runtime/world-init.js +18 -43
- package/dist/runtime/world.d.ts +14 -2
- package/dist/runtime/world.d.ts.map +1 -1
- package/dist/runtime/world.js +75 -19
- package/dist/runtime.d.ts +10 -6
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +3911 -489
- package/dist/sealed-box.d.ts +167 -0
- package/dist/sealed-box.d.ts.map +1 -0
- package/dist/sealed-box.js +571 -0
- package/dist/serialization/client.d.ts +3 -3
- package/dist/serialization/client.d.ts.map +1 -1
- package/dist/serialization/client.js +8 -4
- package/dist/serialization/codec-devalue-vm.d.ts +16 -0
- package/dist/serialization/codec-devalue-vm.d.ts.map +1 -0
- package/dist/serialization/codec-devalue-vm.js +148 -0
- package/dist/serialization/codec-devalue.d.ts +1 -1
- package/dist/serialization/codec-devalue.d.ts.map +1 -1
- package/dist/serialization/codec-devalue.js +24 -6
- package/dist/serialization/codec.d.ts +37 -2
- package/dist/serialization/codec.d.ts.map +1 -1
- package/dist/serialization/codec.js +2 -2
- package/dist/serialization/compression.d.ts +105 -0
- package/dist/serialization/compression.d.ts.map +1 -0
- package/dist/serialization/compression.js +261 -0
- package/dist/serialization/encryption.d.ts +119 -17
- package/dist/serialization/encryption.d.ts.map +1 -1
- package/dist/serialization/encryption.js +152 -17
- package/dist/serialization/errors.d.ts +13 -0
- package/dist/serialization/errors.d.ts.map +1 -1
- package/dist/serialization/errors.js +20 -2
- package/dist/serialization/format.d.ts +6 -6
- package/dist/serialization/format.js +7 -7
- package/dist/serialization/hardened.d.ts +156 -0
- package/dist/serialization/hardened.d.ts.map +1 -0
- package/dist/serialization/hardened.js +538 -0
- package/dist/serialization/index.d.ts +10 -8
- package/dist/serialization/index.d.ts.map +1 -1
- package/dist/serialization/index.js +10 -8
- package/dist/serialization/reducers/class-vm.d.ts +20 -0
- package/dist/serialization/reducers/class-vm.d.ts.map +1 -0
- package/dist/serialization/reducers/class-vm.js +77 -0
- package/dist/serialization/reducers/class.d.ts.map +1 -1
- package/dist/serialization/reducers/class.js +11 -6
- package/dist/serialization/reducers/common-vm.d.ts +15 -0
- package/dist/serialization/reducers/common-vm.d.ts.map +1 -0
- package/dist/serialization/reducers/common-vm.js +616 -0
- package/dist/serialization/reducers/common.d.ts +1 -1
- package/dist/serialization/reducers/common.d.ts.map +1 -1
- package/dist/serialization/reducers/common.js +202 -62
- package/dist/serialization/reducers/step-function-vm.d.ts +44 -0
- package/dist/serialization/reducers/step-function-vm.d.ts.map +1 -0
- package/dist/serialization/reducers/step-function-vm.js +97 -0
- package/dist/serialization/reducers/step-function.d.ts.map +1 -1
- package/dist/serialization/reducers/step-function.js +25 -9
- package/dist/serialization/step.d.ts +4 -4
- package/dist/serialization/step.d.ts.map +1 -1
- package/dist/serialization/step.js +9 -5
- package/dist/serialization/types.d.ts +80 -1
- package/dist/serialization/types.d.ts.map +1 -1
- package/dist/serialization/types.js +15 -1
- package/dist/serialization/workflow-vm.d.ts +29 -0
- package/dist/serialization/workflow-vm.d.ts.map +1 -0
- package/dist/serialization/workflow-vm.js +74 -0
- package/dist/serialization-format.d.ts +64 -8
- package/dist/serialization-format.d.ts.map +1 -1
- package/dist/serialization-format.js +225 -73
- package/dist/serialization.d.ts +262 -34
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +1885 -277
- package/dist/set-attributes.d.ts +13 -0
- package/dist/set-attributes.d.ts.map +1 -0
- package/dist/set-attributes.js +60 -0
- package/dist/source-map.d.ts +25 -0
- package/dist/source-map.d.ts.map +1 -1
- package/dist/source-map.js +154 -10
- package/dist/step/context-storage.d.ts +63 -2
- package/dist/step/context-storage.d.ts.map +1 -1
- package/dist/step/context-storage.js +7 -5
- package/dist/step/writable-stream.d.ts +3 -3
- package/dist/step/writable-stream.d.ts.map +1 -1
- package/dist/step/writable-stream.js +80 -13
- package/dist/step.d.ts.map +1 -1
- package/dist/step.js +148 -27
- package/dist/symbols.d.ts +50 -0
- package/dist/symbols.d.ts.map +1 -1
- package/dist/symbols.js +51 -1
- package/dist/telemetry/semantic-conventions.d.ts +433 -2
- package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
- package/dist/telemetry/semantic-conventions.js +319 -3
- package/dist/telemetry.d.ts +91 -0
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +244 -17
- package/dist/test-support/orchestrator-context.d.ts +25 -0
- package/dist/test-support/orchestrator-context.d.ts.map +1 -0
- package/dist/test-support/orchestrator-context.js +107 -0
- 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 +0 -5
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +1 -15
- 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 +84 -14
- package/dist/vm/script-cache.d.ts +26 -0
- package/dist/vm/script-cache.d.ts.map +1 -0
- package/dist/vm/script-cache.js +131 -0
- package/dist/vm/uint8array-base64.js +1 -1
- package/dist/workflow/abort-controller.d.ts +2 -2
- package/dist/workflow/abort-controller.d.ts.map +1 -1
- package/dist/workflow/abort-controller.js +88 -21
- 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 +45 -0
- package/dist/workflow/create-hook.d.ts.map +1 -1
- package/dist/workflow/create-hook.js +24 -3
- package/dist/workflow/get-workflow-metadata.js +2 -2
- package/dist/workflow/hook.d.ts.map +1 -1
- package/dist/workflow/hook.js +304 -47
- package/dist/workflow/index.d.ts +1 -0
- package/dist/workflow/index.d.ts.map +1 -1
- package/dist/workflow/index.js +2 -1
- package/dist/workflow/set-attributes.d.ts +68 -0
- package/dist/workflow/set-attributes.d.ts.map +1 -0
- package/dist/workflow/set-attributes.js +60 -0
- package/dist/workflow/sleep.d.ts.map +1 -1
- package/dist/workflow/sleep.js +58 -12
- package/dist/workflow/world-init-stub.d.ts +3 -3
- package/dist/workflow/world-init-stub.js +4 -4
- package/dist/workflow.d.ts +95 -3
- package/dist/workflow.d.ts.map +1 -1
- package/dist/workflow.js +900 -561
- package/docs/api-reference/create-hook.mdx +89 -10
- package/docs/api-reference/create-webhook.mdx +16 -15
- package/docs/api-reference/define-hook.mdx +35 -33
- package/docs/api-reference/fatal-error.mdx +30 -8
- package/docs/api-reference/fetch.mdx +14 -10
- 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 +4 -1
- package/docs/api-reference/retryable-error.mdx +1 -1
- package/docs/api-reference/set-attributes.mdx +61 -0
- package/docs/api-reference/sleep.mdx +4 -4
- package/docs/foundations/cancellation.mdx +31 -32
- package/docs/foundations/errors-and-retries.mdx +42 -11
- package/docs/foundations/hooks.mdx +64 -35
- package/docs/foundations/idempotency.mdx +244 -12
- package/docs/foundations/index.mdx +1 -23
- package/docs/foundations/meta.json +2 -1
- package/docs/foundations/serialization.mdx +21 -22
- package/docs/foundations/starting-workflows.mdx +106 -30
- package/docs/foundations/streaming.mdx +108 -60
- package/docs/foundations/versioning.mdx +263 -0
- package/docs/foundations/workflows-and-steps.mdx +9 -9
- package/docs/how-it-works/cancellation.mdx +63 -63
- package/docs/how-it-works/code-transform.mdx +83 -67
- package/docs/how-it-works/encryption.mdx +30 -26
- package/docs/how-it-works/event-sourcing.mdx +125 -34
- package/docs/how-it-works/framework-integrations.mdx +96 -337
- package/docs/how-it-works/understanding-directives.mdx +22 -22
- package/package.json +24 -15
- package/dist/runtime/step-handler.d.ts +0 -2
- package/dist/runtime/step-handler.d.ts.map +0 -1
- package/dist/runtime/step-handler.js +0 -776
package/dist/describe-error.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { RUN_ERROR_CODES, SerializationError, WorkflowRuntimeError, } from '@workflow/errors';
|
|
1
|
+
import { CorruptedEventLogError, RUN_ERROR_CODES, SerializationError, WorkflowRuntimeError, } from '@workflow/errors';
|
|
2
2
|
import { classifyRunError } from './classify-error.js';
|
|
3
3
|
import { NotInStepContextError, NotInWorkflowContextError, NotInWorkflowOrStepContextError, UnavailableInWorkflowContextError, } from './context-errors.js';
|
|
4
4
|
const CONTEXT_ERROR_NAMES = new Set([
|
|
@@ -16,10 +16,15 @@ function isContextViolationError(err) {
|
|
|
16
16
|
const SERIALIZATION_ERROR_HINT = 'A value passed across a workflow/step boundary could not be serialized. See the error message for the offending path and the Learn More link for details.';
|
|
17
17
|
const CONTEXT_ERROR_HINT = 'A workflow-only or step-only API was called from the wrong context. The error message includes the exact API and how to move the call.';
|
|
18
18
|
const RUNTIME_ERROR_HINT = 'This is an internal workflow SDK error, not a bug in your code. If it keeps happening, please report it with the stack trace and the runId.';
|
|
19
|
-
const
|
|
19
|
+
const CORRUPTED_EVENT_LOG_HINT = 'The workflow event log contains orphaned or mismatched events and cannot be replayed. This is an internal workflow SDK error; please report it with the runId.';
|
|
20
|
+
const REPLAY_TIMEOUT_HINT = 'The workflow replay between step boundaries took too long. This bounds workflow-VM and event-log replay time only — step bodies (`"use step"` functions) are excluded. This usually means the event log is unusually large or the workflow function is doing heavy synchronous work in workflow code outside of step bodies. Override the default budget via the WORKFLOW_REPLAY_TIMEOUT_MS env var if needed.';
|
|
20
21
|
const MAX_DELIVERIES_HINT = 'The workflow queue exceeded its max-delivery budget. This usually indicates a persistent runtime failure — check the most recent stack traces for the underlying cause.';
|
|
22
|
+
const MAX_EVENTS_HINT = 'The workflow exceeded the maximum number of events per run. This usually means unbounded work in the workflow function — e.g. a loop that keeps creating steps without terminating. Break long-running workflows into child workflows to stay under the limit.';
|
|
23
|
+
const STREAM_ERROR_HINT = 'Workflow stream infrastructure failed while reading or writing data. This is an SDK or backend failure, not an error in your workflow code; please retry the run and report persistent failures with the runId.';
|
|
24
|
+
const WORLD_CONTRACT_HINT = 'The workflow backend returned data that violated the SDK contract. This is not retryable; please report it with the stack trace and runId.';
|
|
25
|
+
const DEPLOYMENT_MISMATCH_HINT = "The run was delivered to a deployment other than the deployment it is pinned to, and was stopped to protect against code-skew errors after the runtime failed to re-route it there. Verify that the run's deployment is still available and that queue callbacks route to it.";
|
|
21
26
|
function normalizeErrorCode(code) {
|
|
22
|
-
// Values read back from persisted events are `string | undefined
|
|
27
|
+
// Values read back from persisted events are `string | undefined`, so we
|
|
23
28
|
// only trust codes that match a known entry in `RUN_ERROR_CODES`.
|
|
24
29
|
const known = Object.values(RUN_ERROR_CODES);
|
|
25
30
|
if (code && known.includes(code)) {
|
|
@@ -29,21 +34,27 @@ function normalizeErrorCode(code) {
|
|
|
29
34
|
}
|
|
30
35
|
/**
|
|
31
36
|
* Data-driven variant of {@link describeError} that works from persisted
|
|
32
|
-
* event fields instead of a live `Error` instance. Intended for
|
|
33
|
-
* renderers that read failure events and no longer
|
|
34
|
-
* thrown object.
|
|
37
|
+
* event fields instead of a live `Error` instance. Intended for command-line
|
|
38
|
+
* interface (CLI) and web renderers that read failure events and no longer
|
|
39
|
+
* have the original thrown object.
|
|
35
40
|
*/
|
|
36
41
|
export function describeRunError(signal) {
|
|
37
|
-
const errorCode = normalizeErrorCode(signal.errorCode);
|
|
38
42
|
const name = signal.errorName;
|
|
43
|
+
const errorCode = name === 'CorruptedEventLogError'
|
|
44
|
+
? RUN_ERROR_CODES.CORRUPTED_EVENT_LOG
|
|
45
|
+
: normalizeErrorCode(signal.errorCode);
|
|
39
46
|
if (name === 'SerializationError') {
|
|
40
47
|
return { attribution: 'user', errorCode, hint: SERIALIZATION_ERROR_HINT };
|
|
41
48
|
}
|
|
42
49
|
if (name && CONTEXT_ERROR_NAMES.has(name)) {
|
|
43
50
|
return { attribution: 'user', errorCode, hint: CONTEXT_ERROR_HINT };
|
|
44
51
|
}
|
|
45
|
-
if (name === '
|
|
46
|
-
return {
|
|
52
|
+
if (name === 'CorruptedEventLogError') {
|
|
53
|
+
return {
|
|
54
|
+
attribution: 'sdk',
|
|
55
|
+
errorCode,
|
|
56
|
+
hint: CORRUPTED_EVENT_LOG_HINT,
|
|
57
|
+
};
|
|
47
58
|
}
|
|
48
59
|
if (errorCode === RUN_ERROR_CODES.REPLAY_TIMEOUT) {
|
|
49
60
|
return { attribution: 'sdk', errorCode, hint: REPLAY_TIMEOUT_HINT };
|
|
@@ -51,13 +62,43 @@ export function describeRunError(signal) {
|
|
|
51
62
|
if (errorCode === RUN_ERROR_CODES.MAX_DELIVERIES_EXCEEDED) {
|
|
52
63
|
return { attribution: 'sdk', errorCode, hint: MAX_DELIVERIES_HINT };
|
|
53
64
|
}
|
|
65
|
+
if (errorCode === RUN_ERROR_CODES.MAX_EVENTS_EXCEEDED) {
|
|
66
|
+
return { attribution: 'user', errorCode, hint: MAX_EVENTS_HINT };
|
|
67
|
+
}
|
|
68
|
+
if (errorCode === RUN_ERROR_CODES.CORRUPTED_EVENT_LOG) {
|
|
69
|
+
return {
|
|
70
|
+
attribution: 'sdk',
|
|
71
|
+
errorCode,
|
|
72
|
+
hint: CORRUPTED_EVENT_LOG_HINT,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
if (errorCode === RUN_ERROR_CODES.STREAM_ERROR) {
|
|
76
|
+
return {
|
|
77
|
+
attribution: 'sdk',
|
|
78
|
+
errorCode,
|
|
79
|
+
hint: STREAM_ERROR_HINT,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
if (errorCode === RUN_ERROR_CODES.WORLD_CONTRACT_ERROR) {
|
|
83
|
+
return {
|
|
84
|
+
attribution: 'sdk',
|
|
85
|
+
errorCode,
|
|
86
|
+
hint: WORLD_CONTRACT_HINT,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
if (errorCode === RUN_ERROR_CODES.DEPLOYMENT_MISMATCH) {
|
|
90
|
+
return { attribution: 'sdk', errorCode, hint: DEPLOYMENT_MISMATCH_HINT };
|
|
91
|
+
}
|
|
92
|
+
if (name === 'WorkflowRuntimeError' || name === 'StepNotRegisteredError') {
|
|
93
|
+
return { attribution: 'sdk', errorCode, hint: RUNTIME_ERROR_HINT };
|
|
94
|
+
}
|
|
54
95
|
if (errorCode === RUN_ERROR_CODES.RUNTIME_ERROR) {
|
|
55
96
|
return { attribution: 'sdk', errorCode, hint: RUNTIME_ERROR_HINT };
|
|
56
97
|
}
|
|
57
98
|
return { attribution: 'user', errorCode };
|
|
58
99
|
}
|
|
59
100
|
/**
|
|
60
|
-
* Describe an error for user-facing presentation. Purely informational
|
|
101
|
+
* Describe an error for user-facing presentation. Purely informational: it
|
|
61
102
|
* does not change any persisted event data or error classification used by
|
|
62
103
|
* the runtime.
|
|
63
104
|
*
|
|
@@ -69,7 +110,7 @@ export function describeRunError(signal) {
|
|
|
69
110
|
* - Context-violation errors (`NotInWorkflowContextError`, etc.) likewise
|
|
70
111
|
* describe a user mistake.
|
|
71
112
|
* - `WorkflowRuntimeError` (and subclasses like `StepNotRegisteredError`)
|
|
72
|
-
* indicates an internal SDK invariant broke
|
|
113
|
+
* indicates an internal SDK invariant broke, so surface that as `sdk`.
|
|
73
114
|
*
|
|
74
115
|
* @param err The error value thrown by the workflow / step.
|
|
75
116
|
* @param errorCode Optional precomputed error code. Callers that already
|
|
@@ -93,6 +134,22 @@ export function describeError(err, errorCode) {
|
|
|
93
134
|
hint: CONTEXT_ERROR_HINT,
|
|
94
135
|
};
|
|
95
136
|
}
|
|
137
|
+
if (CorruptedEventLogError.is(err)) {
|
|
138
|
+
return {
|
|
139
|
+
attribution: 'sdk',
|
|
140
|
+
errorCode: effectiveCode,
|
|
141
|
+
hint: CORRUPTED_EVENT_LOG_HINT,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
// Check DEPLOYMENT_MISMATCH before the generic WorkflowRuntimeError branch:
|
|
145
|
+
// WorkflowDeploymentMismatchError subclasses it, but has its own code + hint.
|
|
146
|
+
if (effectiveCode === RUN_ERROR_CODES.DEPLOYMENT_MISMATCH) {
|
|
147
|
+
return {
|
|
148
|
+
attribution: 'sdk',
|
|
149
|
+
errorCode: effectiveCode,
|
|
150
|
+
hint: DEPLOYMENT_MISMATCH_HINT,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
96
153
|
if (err instanceof WorkflowRuntimeError) {
|
|
97
154
|
return {
|
|
98
155
|
attribution: 'sdk',
|
|
@@ -114,6 +171,34 @@ export function describeError(err, errorCode) {
|
|
|
114
171
|
hint: MAX_DELIVERIES_HINT,
|
|
115
172
|
};
|
|
116
173
|
}
|
|
174
|
+
if (effectiveCode === RUN_ERROR_CODES.MAX_EVENTS_EXCEEDED) {
|
|
175
|
+
return {
|
|
176
|
+
attribution: 'user',
|
|
177
|
+
errorCode: effectiveCode,
|
|
178
|
+
hint: MAX_EVENTS_HINT,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
if (effectiveCode === RUN_ERROR_CODES.CORRUPTED_EVENT_LOG) {
|
|
182
|
+
return {
|
|
183
|
+
attribution: 'sdk',
|
|
184
|
+
errorCode: effectiveCode,
|
|
185
|
+
hint: CORRUPTED_EVENT_LOG_HINT,
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
if (effectiveCode === RUN_ERROR_CODES.STREAM_ERROR) {
|
|
189
|
+
return {
|
|
190
|
+
attribution: 'sdk',
|
|
191
|
+
errorCode: effectiveCode,
|
|
192
|
+
hint: STREAM_ERROR_HINT,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
if (effectiveCode === RUN_ERROR_CODES.WORLD_CONTRACT_ERROR) {
|
|
196
|
+
return {
|
|
197
|
+
attribution: 'sdk',
|
|
198
|
+
errorCode: effectiveCode,
|
|
199
|
+
hint: WORLD_CONTRACT_HINT,
|
|
200
|
+
};
|
|
201
|
+
}
|
|
117
202
|
return { attribution: 'user', errorCode: effectiveCode };
|
|
118
203
|
}
|
|
119
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzY3JpYmUtZXJyb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZGVzY3JpYmUtZXJyb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLGVBQWUsRUFFZixrQkFBa0IsRUFDbEIsb0JBQW9CLEdBQ3JCLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUNMLHFCQUFxQixFQUNyQix5QkFBeUIsRUFDekIsK0JBQStCLEVBQy9CLGlDQUFpQyxHQUNsQyxNQUFNLHFCQUFxQixDQUFDO0FBNEM3QixNQUFNLG1CQUFtQixHQUFHLElBQUksR0FBRyxDQUFDO0lBQ2xDLDJCQUEyQjtJQUMzQix1QkFBdUI7SUFDdkIsaUNBQWlDO0lBQ2pDLG1DQUFtQztDQUNwQyxDQUFDLENBQUM7QUFFSCxTQUFTLHVCQUF1QixDQUFDLEdBQVk7SUFDM0MsT0FBTyxDQUNMLEdBQUcsWUFBWSx5QkFBeUI7UUFDeEMsR0FBRyxZQUFZLHFCQUFxQjtRQUNwQyxHQUFHLFlBQVksK0JBQStCO1FBQzlDLEdBQUcsWUFBWSxpQ0FBaUMsQ0FDakQsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLHdCQUF3QixHQUM1QiwySkFBMkosQ0FBQztBQUM5SixNQUFNLGtCQUFrQixHQUN0Qix3SUFBd0ksQ0FBQztBQUMzSSxNQUFNLGtCQUFrQixHQUN0Qiw2SUFBNkksQ0FBQztBQUNoSixNQUFNLG1CQUFtQixHQUN2QiwwS0FBMEssQ0FBQztBQUM3SyxNQUFNLG1CQUFtQixHQUN2Qix5S0FBeUssQ0FBQztBQUU1SyxTQUFTLGtCQUFrQixDQUFDLElBQXdCO0lBQ2xELHVFQUF1RTtJQUN2RSxrRUFBa0U7SUFDbEUsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQXNCLENBQUM7SUFDbEUsSUFBSSxJQUFJLElBQUksS0FBSyxDQUFDLFFBQVEs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RUQsSUFBSSxhQUFhLEtBQUssZUFBZSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDOUQsT0FBTztZQUNMLFdBQVcsRUFBRSxLQUFLO1lBQ2xCLFNBQVMsRUFBRSxhQUFhO1lBQ3hCLElBQUksRUFBRSxtQkFBbUI7U0FDMUIsQ0FBQztJQUNKLENBQUM7SUFFRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLENBQUM7QUFDM0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIFJVTl9FUlJPUl9DT0RFUyxcbiAgdHlwZSBSdW5FcnJvckNvZGUsXG4gIFNlcmlhbGl6YXRpb25FcnJvcixcbiAgV29ya2Zsb3dSdW50aW1lRXJyb3IsXG59IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHsgY2xhc3NpZnlSdW5FcnJvciB9IGZyb20gJy4vY2xhc3NpZnktZXJyb3IuanMnO1xuaW1wb3J0IHtcbiAgTm90SW5TdGVwQ29udGV4dEVycm9yLFxuICBOb3RJbldvcmtmbG93Q29udGV4dEVycm9yLFxuICBOb3RJbldvcmtmbG93T3JTdGVwQ29udGV4dEVycm9yLFxuICBVbmF2YWlsYWJsZUluV29ya2Zsb3dDb250ZXh0RXJyb3IsXG59IGZyb20gJy4vY29udGV4dC1lcnJvcnMuanMnO1xuXG4vKipcbiAqIEF0dHJpYnV0aW9uIG9mIGEgd29ya2Zsb3cvc3RlcCBmYWlsdXJlIGZvciBwcmVzZW50YXRpb24uXG4gKlxuICogLSBgdXNlcmA6IHRoZSBlcnJvciBjYW1lIGZyb20gY3VzdG9tZXIgY29kZSAoYSBzdGVwIG9yIHdvcmtmbG93IGZ1bmN0aW9uXG4gKiAgIHRocmV3LCBvciBhIHZhbHVlIHRoZXkgcGFzc2VkIGFjcm9zcyBhIGJvdW5kYXJ5IHdhc24ndCBzZXJpYWxpemFibGUpLlxuICogLSBgc2RrYDogdGhlIFNESyBwcm9kdWNlZCB0aGUgZXJyb3IgaXRzZWxmIOKAlCBhbiBpbnRlcm5hbCBpbnZhcmlhbnQgYnJva2UsXG4gKiAgIG9yIGEgcnVudGltZSBndWFyZCByZWplY3RlZCB0aGUgY2FsbC4gVGhlc2Ugc2hvdWxkIGJlIHJhcmU7IHdoZW4gdGhleVxuICogICBoYXBwZW4gd2Ugd2FudCB0byBmcmFtZSB0aGUgdGVybWluYWwgb3V0cHV0IGFzIFwidGhpcyBpcyB1cywgbm90IHlvdS5cIlxuICovXG5leHBvcnQgdHlwZSBFcnJvckF0dHJpYnV0aW9uID0gJ3VzZXInIHwgJ3Nkayc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXJyb3JEZXNjcmlwdGlvbiB7XG4gIGF0dHJpYnV0aW9uOiBFcnJvckF0dHJpYnV0aW9uO1xuICBlcnJvckNvZGU6IFJ1bkVycm9yQ29kZTtcbiAgLyoqXG4gICAqIFNob3J0LCBjbGFzcy1hd2FyZSBoaW50IHRvIGhlbHAgYSB1c2VyIHVuZGVyc3RhbmQgd2hhdCB0aGUgZXJyb3IgbWVhbnMuXG4gICAqIE9ubHkgc2V0IGZvciB3ZWxsLWtub3duIFNESyBlcnJvciBjbGFzc2VzIChTZXJpYWxpemF0aW9uRXJyb3IsXG4gICAqIFdvcmtmbG93UnVudGltZUVycm9yLCBjb250ZXh0LXZpb2xhdGlvbiBlcnJvcnMpOyBgdW5kZWZpbmVkYCBmb3IgcGxhaW5cbiAgICogdXNlciBlcnJvcnMsIHdoZXJlIHRoZSBzdGFjayBpcyBhbHJlYWR5IHRoZSBtb3N0IHVzZWZ1bCB0aGluZyB0byBzaG93LlxuICAgKi9cbiAgaGludD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBFcnJvciBzaWduYWwgZmllbGRzIGNhcnJpZWQgb24gcGVyc2lzdGVkIGZhaWx1cmUgZXZlbnRzIChlLmcuXG4gKiBgcnVuX2ZhaWxlZGAgLyBgc3RlcF9mYWlsZWRgKS4gVGhlIHNoYXBlIGlzIGludGVudGlvbmFsbHkgbG9vc2U6XG4gKlxuICogLSBgZXJyb3JDb2RlYCBpcyB0eXBlZCBhcyBgc3RyaW5nYCByYXRoZXIgdGhhbiBgUnVuRXJyb3JDb2RlYCBiZWNhdXNlXG4gKiAgIHRoZSB2YWx1ZSBjb21lcyBmcm9tIHN0b3JlZCBKU09OL0NCT1IgYW5kIG1heSBwcmVkYXRlIHRoZSBjdXJyZW50XG4gKiAgIGVudW0g4oCUIGNhbGxlcnMgc2hvdWxkIG5vdCBuYXJyb3cgb24gaXQgYmxpbmRseS4gVmFsdWVzIHRoYXQgZG9uJ3RcbiAqICAgbWF0Y2ggYSBrbm93biBgUlVOX0VSUk9SX0NPREVTYCBlbnRyeSBmYWxsIHRocm91Z2ggdG8gVVNFUl9FUlJPUi5cbiAqIC0gYGVycm9yTmFtZWAgaXMgdGhlIHRocm93biBgRXJyb3IjbmFtZWAuIEl0IGlzIG5vdCB1bml2ZXJzYWxseVxuICogICBwZXJzaXN0ZWQgdG9kYXk7IGNhbGxlcnMgdGhhdCBoYXZlIGFjY2VzcyB0byBpdCAoZWl0aGVyIHZpYSBhblxuICogICBpbi1tZW1vcnkgdGhyb3cgb3IgYSByaWNoZXIgcGF5bG9hZCkgY2FuIHBhc3MgaXQgaW4gdG8gc2hhcnBlblxuICogICB0aGUgYXR0cmlidXRpb24gYW5kIGhpbnQuIFdoZW4gYWJzZW50LCBgZGVzY3JpYmVSdW5FcnJvcmAgc3RpbGxcbiAqICAgcmV0dXJucyBhIHNlbnNpYmxlIGF0dHJpYnV0aW9uIGZyb20gYGVycm9yQ29kZWAgYWxvbmUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGVyc2lzdGVkRXJyb3JTaWduYWwge1xuICBlcnJvckNvZGU/OiBzdHJpbmc7XG4gIGVycm9yTmFtZT86IHN0cmluZztcbn1cblxuY29uc3QgQ09OVEVYVF9FUlJPUl9OQU1FUyA9IG5ldyBTZXQoW1xuICAnTm90SW5Xb3JrZmxvd0NvbnRleHRFcnJvcicsXG4gICdOb3RJblN0ZXBDb250ZXh0RXJyb3InLFxuICAnTm90SW5Xb3JrZmxvd09yU3RlcENvbnRleHRFcnJvcicsXG4gICdVbmF2YWlsYWJsZUluV29ya2Zsb3dDb250ZXh0RXJyb3InLFxuXSk7XG5cbmZ1bmN0aW9uIGlzQ29udGV4dFZpb2xhdGlvbkVycm9yKGVycjogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGVyciBpbnN0YW5jZW9mIE5vdEluV29ya2Zsb3dDb250ZXh0RXJyb3IgfHxcbiAgICBlcnIgaW5zdGFuY2VvZiBOb3RJblN0ZXBDb250ZXh0RXJyb3IgfHxcbiAgICBlcnIgaW5zdGFuY2VvZiBOb3RJbldvcmtmbG93T3JTdGVwQ29udGV4dEVycm9yIHx8XG4gICAgZXJyIGluc3RhbmNlb2YgVW5hdmFpbGFibGVJbldvcmtmbG93Q29udGV4dEVycm9yXG4gICk7XG59XG5cbmNvbnN0IFNFUklBTElaQVRJT05fRVJST1JfSElOVCA9XG4gICdBIHZhbHVlIHBhc3NlZCBhY3Jvc3MgYSB3b3JrZmxvdy9zdGVwIGJvdW5kYXJ5IGNvdWxkIG5vdCBiZSBzZXJpYWxpemVkLiBTZWUgdGhlIGVycm9yIG1lc3NhZ2UgZm9yIHRoZSBvZmZlbmRpbmcgcGF0aCBhbmQgdGhlIExlYXJuIE1vcmUgbGluayBmb3IgZGV0YWlscy4nO1xuY29uc3QgQ09OVEVYVF9FUlJPUl9ISU5UID1cbiAgJ0Egd29ya2Zsb3ctb25seSBvciBzdGVwLW9ubHkgQVBJIHdhcyBjYWxsZWQgZnJvbSB0aGUgd3JvbmcgY29udGV4dC4gVGhlIGVycm9yIG1lc3NhZ2UgaW5jbHVkZXMgdGhlIGV4YWN0IEFQSSBhbmQgaG93IHRvIG1vdmUgdGhlIGNhbGwuJztcbmNvbnN0IFJVTlRJTUVfRVJST1JfSElOVCA9XG4gICdUaGlzIGlzIGFuIGludGVybmFsIHdvcmtmbG93IFNESyBlcnJvciwgbm90IGEgYnVnIGluIHlvdXIgY29kZS4gSWYgaXQga2VlcHMgaGFwcGVuaW5nLCBwbGVhc2UgcmVwb3J0IGl0IHdpdGggdGhlIHN0YWNrIHRyYWNlIGFuZCB0aGUgcnVuSWQuJztcbmNvbnN0IFJFUExBWV9USU1FT1VUX0hJTlQgPVxuICAnVGhlIHdvcmtmbG93IHJlcGxheSB0b29rIHRvbyBsb25nLiBUaGlzIHVzdWFsbHkgbWVhbnMgdGhlIGV2ZW50IGxvZyBpcyB1bnVzdWFsbHkgbGFyZ2Ugb3IgdGhlIHdvcmtmbG93IGZ1bmN0aW9uIGlzIGRvaW5nIGhlYXZ5IHN5bmNocm9ub3VzIHdvcmsgYmV0d2VlbiBzdGVwIGJvdW5kYXJpZXMuJztcbmNvbnN0IE1BWF9ERUxJVkVSSUVTX0hJTlQgPVxuICAnVGhlIHdvcmtmbG93IHF1ZXVlIGV4Y2VlZGVkIGl0cyBtYXgtZGVsaXZlcnkgYnVkZ2V0LiBUaGlzIHVzdWFsbHkgaW5kaWNhdGVzIGEgcGVyc2lzdGVudCBydW50aW1lIGZhaWx1cmUg4oCUIGNoZWNrIHRoZSBtb3N0IHJlY2VudCBzdGFjayB0cmFjZXMgZm9yIHRoZSB1bmRlcmx5aW5nIGNhdXNlLic7XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUVycm9yQ29kZShjb2RlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBSdW5FcnJvckNvZGUge1xuICAvLyBWYWx1ZXMgcmVhZCBiYWNrIGZyb20gcGVyc2lzdGVkIGV2ZW50cyBhcmUgYHN0cmluZyB8IHVuZGVmaW5lZGAg4oCUIHdlXG4gIC8vIG9ubHkgdHJ1c3QgY29kZXMgdGhhdCBtYXRjaCBhIGtub3duIGVudHJ5IGluIGBSVU5fRVJST1JfQ09ERVNgLlxuICBjb25zdCBrbm93biA9IE9iamVjdC52YWx1ZXMoUlVOX0VSUk9SX0NPREVTKSBhcyByZWFkb25seSBzdHJpbmdbXTtcbiAgaWYgKGNvZGUgJiYga25vd24uaW5jbHVkZXMoY29kZSkpIHtcbiAgICByZXR1cm4gY29kZSBhcyBSdW5FcnJvckNvZGU7XG4gIH1cbiAgcmV0dXJuIFJVTl9FUlJPUl9DT0RFUy5VU0VSX0VSUk9SO1xufVxuXG4vKipcbiAqIERhdGEtZHJpdmVuIHZhcmlhbnQgb2Yge0BsaW5rIGRlc2NyaWJlRXJyb3J9IHRoYXQgd29ya3MgZnJvbSBwZXJzaXN0ZWRcbiAqIGV2ZW50IGZpZWxkcyBpbnN0ZWFkIG9mIGEgbGl2ZSBgRXJyb3JgIGluc3RhbmNlLiBJbnRlbmRlZCBmb3IgQ0xJL3dlYlxuICogcmVuZGVyZXJzIHRoYXQgcmVhZCBmYWlsdXJlIGV2ZW50cyBhbmQgbm8gbG9uZ2VyIGhhdmUgdGhlIG9yaWdpbmFsXG4gKiB0aHJvd24gb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVzY3JpYmVSdW5FcnJvcihcbiAgc2lnbmFsOiBQZXJzaXN0ZWRFcnJvclNpZ25hbFxuKTogRXJyb3JEZXNjcmlwdGlvbiB7XG4gIGNvbnN0IGVycm9yQ29kZSA9IG5vcm1hbGl6ZUVycm9yQ29kZShzaWduYWwuZXJyb3JDb2RlKTtcbiAgY29uc3QgbmFtZSA9IHNpZ25hbC5lcnJvck5hbWU7XG5cbiAgaWYgKG5hbWUgPT09ICdTZXJpYWxpemF0aW9uRXJyb3InKSB7XG4gICAgcmV0dXJuIHsgYXR0cmlidXRpb246ICd1c2VyJywgZXJyb3JDb2RlLCBoaW50OiBTRVJJQUxJWkFUSU9OX0VSUk9SX0hJTlQgfTtcbiAgfVxuICBpZiAobmFtZSAmJiBDT05URVhUX0VSUk9SX05BTUVTLmhhcyhuYW1lKSkge1xuICAgIHJldHVybiB7IGF0dHJpYnV0aW9uOiAndXNlcicsIGVycm9yQ29kZSwgaGludDogQ09OVEVYVF9FUlJPUl9ISU5UIH07XG4gIH1cbiAgaWYgKG5hbWUgPT09ICdXb3JrZmxvd1J1bnRpbWVFcnJvcicgfHwgbmFtZSA9PT0gJ1N0ZXBOb3RSZWdpc3RlcmVkRXJyb3InKSB7XG4gICAgcmV0dXJuIHsgYXR0cmlidXRpb246ICdzZGsnLCBlcnJvckNvZGUsIGhpbnQ6IFJVTlRJTUVfRVJST1JfSElOVCB9O1xuICB9XG4gIGlmIChlcnJvckNvZGUgPT09IFJVTl9FUlJPUl9DT0RFUy5SRVBMQVlfVElNRU9VVCkge1xuICAgIHJldHVybiB7IGF0dHJpYnV0aW9uOiAnc2RrJywgZXJyb3JDb2RlLCBoaW50OiBSRVBMQVlfVElNRU9VVF9ISU5UIH07XG4gIH1cbiAgaWYgKGVycm9yQ29kZSA9PT0gUlVOX0VSUk9SX0NPREVTLk1BWF9ERUxJVkVSSUVTX0VYQ0VFREVEKSB7XG4gICAgcmV0dXJuIHsgYXR0cmlidXRpb246ICdzZGsnLCBlcnJvckNvZGUsIGhpbnQ6IE1BWF9ERUxJVkVSSUVTX0hJTlQgfTtcbiAgfVxuICBpZiAoZXJyb3JDb2RlID09PSBSVU5fRVJST1JfQ09ERVMuUlVOVElNRV9FUlJPUikge1xuICAgIHJldHVybiB7IGF0dHJpYnV0aW9uOiAnc2RrJywgZXJyb3JDb2RlLCBoaW50OiBSVU5USU1FX0VSUk9SX0hJTlQgfTtcbiAgfVxuICByZXR1cm4geyBhdHRyaWJ1dGlvbjogJ3VzZXInLCBlcnJvckNvZGUgfTtcbn1cblxuLyoqXG4gKiBEZXNjcmliZSBhbiBlcnJvciBmb3IgdXNlci1mYWNpbmcgcHJlc2VudGF0aW9uLiBQdXJlbHkgaW5mb3JtYXRpb25hbCDigJRcbiAqIGRvZXMgbm90IGNoYW5nZSBhbnkgcGVyc2lzdGVkIGV2ZW50IGRhdGEgb3IgZXJyb3IgY2xhc3NpZmljYXRpb24gdXNlZCBieVxuICogdGhlIHJ1bnRpbWUuXG4gKlxuICogVGhlIGF0dHJpYnV0aW9uIGhlcmUgaXMgbW9yZSBudWFuY2VkIHRoYW4gYGNsYXNzaWZ5UnVuRXJyb3JgOlxuICpcbiAqIC0gYFNlcmlhbGl6YXRpb25FcnJvcmAgaXMgdGVjaG5pY2FsbHkgcmFpc2VkIGJ5IHRoZSBTREssIGJ1dCBpdCBhbG1vc3RcbiAqICAgYWx3YXlzIHBvaW50cyBhdCBzb21ldGhpbmcgdGhlIGNhbGxlciBkaWQgKHBhc3NlZCBhIG5vbi1zZXJpYWxpemFibGVcbiAqICAgdmFsdWUsIGRpZG4ndCByZWdpc3RlciBhIGNsYXNzKS4gV2UgYXR0cmlidXRlIGl0IHRvIHRoZSB1c2VyLlxuICogLSBDb250ZXh0LXZpb2xhdGlvbiBlcnJvcnMgKGBOb3RJbldvcmtmbG93Q29udGV4dEVycm9yYCwgZXRjLikgbGlrZXdpc2VcbiAqICAgZGVzY3JpYmUgYSB1c2VyIG1pc3Rha2UuXG4gKiAtIGBXb3JrZmxvd1J1bnRpbWVFcnJvcmAgKGFuZCBzdWJjbGFzc2VzIGxpa2UgYFN0ZXBOb3RSZWdpc3RlcmVkRXJyb3JgKVxuICogICBpbmRpY2F0ZXMgYW4gaW50ZXJuYWwgU0RLIGludmFyaWFudCBicm9rZSDigJQgc3VyZmFjZSB0aGF0IGFzIGBzZGtgLlxuICpcbiAqIEBwYXJhbSBlcnIgVGhlIGVycm9yIHZhbHVlIHRocm93biBieSB0aGUgd29ya2Zsb3cgLyBzdGVwLlxuICogQHBhcmFtIGVycm9yQ29kZSBPcHRpb25hbCBwcmVjb21wdXRlZCBlcnJvciBjb2RlLiBDYWxsZXJzIHRoYXQgYWxyZWFkeVxuICogICBrbm93IHRoZSBjb2RlIChlLmcuIGBSRVBMQVlfVElNRU9VVGAgb3IgYE1BWF9ERUxJVkVSSUVTX0VYQ0VFREVEYCwgd2hpY2hcbiAqICAgYGNsYXNzaWZ5UnVuRXJyb3JgIGNhbid0IGRlcml2ZSBmcm9tIHRoZSBlcnJvciBhbG9uZSkgc2hvdWxkIHBhc3MgaXQgc29cbiAqICAgdGhlIGF0dHJpYnV0aW9uIGFuZCBoaW50IHJlZmxlY3QgdGhlIGFjdHVhbCBmYWlsdXJlIGNhdGVnb3J5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVzY3JpYmVFcnJvcihcbiAgZXJyOiB1bmtub3duLFxuICBlcnJvckNvZGU/OiBSdW5FcnJvckNvZGVcbik6IEVycm9yRGVzY3JpcHRpb24ge1xuICBjb25zdCBlZmZlY3RpdmVDb2RlID0gZXJyb3JDb2RlID8/IGNsYXNzaWZ5UnVuRXJyb3IoZXJyKTtcblxuICBpZiAoU2VyaWFsaXphdGlvbkVycm9yLmlzKGVycikpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYXR0cmlidXRpb246ICd1c2VyJyxcbiAgICAgIGVycm9yQ29kZTogZWZmZWN0aXZlQ29kZSxcbiAgICAgIGhpbnQ6IFNFUklBTElaQVRJT05fRVJST1JfSElOVCxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGlzQ29udGV4dFZpb2xhdGlvbkVycm9yKGVycikpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYXR0cmlidXRpb246ICd1c2VyJyxcbiAgICAgIGVycm9yQ29kZTogZWZmZWN0aXZlQ29kZSxcbiAgICAgIGhpbnQ6IENPTlRFWFRfRVJST1JfSElOVCxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGVyciBpbnN0YW5jZW9mIFdvcmtmbG93UnVudGltZUVycm9yKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGF0dHJpYnV0aW9uOiAnc2RrJyxcbiAgICAgIGVycm9yQ29kZTogZWZmZWN0aXZlQ29kZSxcbiAgICAgIGhpbnQ6IFJVTlRJTUVfRVJST1JfSElOVCxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGVmZmVjdGl2ZUNvZGUgPT09IFJVTl9FUlJPUl9DT0RFUy5SRVBMQVlfVElNRU9VVCkge1xuICAgIHJldHVybiB7XG4gICAgICBhdHRyaWJ1dGlvbjogJ3NkaycsXG4gICAgICBlcnJvckNvZGU6IGVmZmVjdGl2ZUNvZGUsXG4gICAgICBoaW50OiBSRVBMQVlfVElNRU9VVF9ISU5ULFxuICAgIH07XG4gIH1cblxuICBpZiAoZWZmZWN0aXZlQ29kZSA9PT0gUlVOX0VSUk9SX0NPREVTLk1BWF9ERUxJVkVSSUVTX0VYQ0VFREVEKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGF0dHJpYnV0aW9uOiAnc2RrJyxcbiAgICAgIGVycm9yQ29kZTogZWZmZWN0aXZlQ29kZSxcbiAgICAgIGhpbnQ6IE1BWF9ERUxJVkVSSUVTX0hJTlQsXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7IGF0dHJpYnV0aW9uOiAndXNlcicsIGVycm9yQ29kZTogZWZmZWN0aXZlQ29kZSB9O1xufVxuIl19
|
|
204
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzY3JpYmUtZXJyb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZGVzY3JpYmUtZXJyb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixlQUFlLEVBRWYsa0JBQWtCLEVBQ2xCLG9CQUFvQixHQUNyQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFDTCxxQkFBcUIsRUFDckIseUJBQXlCLEVBQ3pCLCtCQUErQixFQUMvQixpQ0FBaUMsR0FDbEMsTUFBTSxxQkFBcUIsQ0FBQztBQTRDN0IsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUNsQywyQkFBMkI7SUFDM0IsdUJBQXVCO0lBQ3ZCLGlDQUFpQztJQUNqQyxtQ0FBbUM7Q0FDcEMsQ0FBQyxDQUFDO0FBRUgsU0FBUyx1QkFBdUIsQ0FBQyxHQUFZO0lBQzNDLE9BQU8sQ0FDTCxHQUFHLFlBQVkseUJBQXlCO1FBQ3hDLEdBQUcsWUFBWSxxQkFBcUI7UUFDcEMsR0FBRyxZQUFZLCtCQUErQjtRQUM5QyxHQUFHLFlBQVksaUNBQWlDLENBQ2pELENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSx3QkFBd0IsR0FDNUIsMkpBQTJKLENBQUM7QUFDOUosTUFBTSxrQkFBa0IsR0FDdEIsd0lBQXdJLENBQUM7QUFDM0ksTUFBTSxrQkFBa0IsR0FDdEIsNklBQTZJLENBQUM7QUFDaEosTUFBTSx3QkFBd0IsR0FDNUIsZ0tBQWdLLENBQUM7QUFDbkssTUFBTSxtQkFBbUIsR0FDdkIsZ1pBQWdaLENBQUM7QUFDblosTUFBTSxtQkFBbUIsR0FDdkIseUtBQXlLLENBQUM7QUFDNUssTUFBTSxlQUFlLEdBQ25CLGdRQUFnUSxDQUFDO0FBQ25RLE1BQU0saUJBQWlCLEdBQ3JCLGlOQUFpTixDQUFDO0FBQ3BOLE1BQU0sbUJBQW1CLEdBQ3ZCLDRJQUE0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Q0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNuRCxPQUFPO1lBQ0wsV0FBVyxFQUFFLEtBQUs7WUFDbEIsU0FBUyxFQUFFLGFBQWE7WUFDeEIsSUFBSSxFQUFFLGlCQUFpQjtTQUN4QixDQUFDO0lBQ0osQ0FBQztJQUVELElBQUksYUFBYSxLQUFLLGVBQWUsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzNELE9BQU87WUFDTCxXQUFXLEVBQUUsS0FBSztZQUNsQixTQUFTLEVBQUUsYUFBYTtZQUN4QixJQUFJLEVBQUUsbUJBQW1CO1NBQzFCLENBQUM7SUFDSixDQUFDO0lBRUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxDQUFDO0FBQzNELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb3JydXB0ZWRFdmVudExvZ0Vycm9yLFxuICBSVU5fRVJST1JfQ09ERVMsXG4gIHR5cGUgUnVuRXJyb3JDb2RlLFxuICBTZXJpYWxpemF0aW9uRXJyb3IsXG4gIFdvcmtmbG93UnVudGltZUVycm9yLFxufSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB7IGNsYXNzaWZ5UnVuRXJyb3IgfSBmcm9tICcuL2NsYXNzaWZ5LWVycm9yLmpzJztcbmltcG9ydCB7XG4gIE5vdEluU3RlcENvbnRleHRFcnJvcixcbiAgTm90SW5Xb3JrZmxvd0NvbnRleHRFcnJvcixcbiAgTm90SW5Xb3JrZmxvd09yU3RlcENvbnRleHRFcnJvcixcbiAgVW5hdmFpbGFibGVJbldvcmtmbG93Q29udGV4dEVycm9yLFxufSBmcm9tICcuL2NvbnRleHQtZXJyb3JzLmpzJztcblxuLyoqXG4gKiBBdHRyaWJ1dGlvbiBvZiBhIHdvcmtmbG93L3N0ZXAgZmFpbHVyZSBmb3IgcHJlc2VudGF0aW9uLlxuICpcbiAqIC0gYHVzZXJgOiB0aGUgZXJyb3IgY2FtZSBmcm9tIGN1c3RvbWVyIGNvZGUgKGEgc3RlcCBvciB3b3JrZmxvdyBmdW5jdGlvblxuICogICB0aHJldywgb3IgYSB2YWx1ZSB0aGV5IHBhc3NlZCBhY3Jvc3MgYSBib3VuZGFyeSB3YXNuJ3Qgc2VyaWFsaXphYmxlKS5cbiAqIC0gYHNka2A6IHRoZSBTREsgcHJvZHVjZWQgdGhlIGVycm9yIGl0c2VsZjogYW4gaW50ZXJuYWwgaW52YXJpYW50IGJyb2tlLFxuICogICBvciBhIHJ1bnRpbWUgZ3VhcmQgcmVqZWN0ZWQgdGhlIGNhbGwuIFRoZXNlIHNob3VsZCBiZSByYXJlOyB3aGVuIHRoZXlcbiAqICAgaGFwcGVuIHdlIHdhbnQgdG8gZnJhbWUgdGhlIHRlcm1pbmFsIG91dHB1dCBhcyBcInRoaXMgaXMgdXMsIG5vdCB5b3UuXCJcbiAqL1xuZXhwb3J0IHR5cGUgRXJyb3JBdHRyaWJ1dGlvbiA9ICd1c2VyJyB8ICdzZGsnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEVycm9yRGVzY3JpcHRpb24ge1xuICBhdHRyaWJ1dGlvbjogRXJyb3JBdHRyaWJ1dGlvbjtcbiAgZXJyb3JDb2RlOiBSdW5FcnJvckNvZGU7XG4gIC8qKlxuICAgKiBTaG9ydCwgY2xhc3MtYXdhcmUgaGludCB0byBoZWxwIGEgdXNlciB1bmRlcnN0YW5kIHdoYXQgdGhlIGVycm9yIG1lYW5zLlxuICAgKiBPbmx5IHNldCBmb3Igd2VsbC1rbm93biBTREsgZXJyb3IgY2xhc3NlcyAoU2VyaWFsaXphdGlvbkVycm9yLFxuICAgKiBXb3JrZmxvd1J1bnRpbWVFcnJvciwgY29udGV4dC12aW9sYXRpb24gZXJyb3JzKTsgYHVuZGVmaW5lZGAgZm9yIHBsYWluXG4gICAqIHVzZXIgZXJyb3JzLCB3aGVyZSB0aGUgc3RhY2sgaXMgYWxyZWFkeSB0aGUgbW9zdCB1c2VmdWwgdGhpbmcgdG8gc2hvdy5cbiAgICovXG4gIGhpbnQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogRXJyb3Igc2lnbmFsIGZpZWxkcyBjYXJyaWVkIG9uIHBlcnNpc3RlZCBmYWlsdXJlIGV2ZW50cyAoZS5nLlxuICogYHJ1bl9mYWlsZWRgIC8gYHN0ZXBfZmFpbGVkYCkuIFRoZSBzaGFwZSBpcyBpbnRlbnRpb25hbGx5IGxvb3NlOlxuICpcbiAqIC0gYGVycm9yQ29kZWAgaXMgdHlwZWQgYXMgYHN0cmluZ2AgcmF0aGVyIHRoYW4gYFJ1bkVycm9yQ29kZWAgYmVjYXVzZVxuICogICB0aGUgdmFsdWUgY29tZXMgZnJvbSBzdG9yZWQgSlNPTi9DQk9SIGFuZCBtYXkgcHJlZGF0ZSB0aGUgY3VycmVudFxuICogICBlbnVtLCBzbyBjYWxsZXJzIHNob3VsZCBub3QgbmFycm93IG9uIGl0IGJsaW5kbHkuIFZhbHVlcyB0aGF0IGRvbid0XG4gKiAgIG1hdGNoIGEga25vd24gYFJVTl9FUlJPUl9DT0RFU2AgZW50cnkgZmFsbCB0aHJvdWdoIHRvIFVTRVJfRVJST1IuXG4gKiAtIGBlcnJvck5hbWVgIGlzIHRoZSB0aHJvd24gYEVycm9yI25hbWVgLiBJdCBpcyBub3QgdW5pdmVyc2FsbHlcbiAqICAgcGVyc2lzdGVkIHRvZGF5OyBjYWxsZXJzIHRoYXQgaGF2ZSBhY2Nlc3MgdG8gaXQgKGVpdGhlciB2aWEgYW5cbiAqICAgaW4tbWVtb3J5IHRocm93IG9yIGEgcmljaGVyIHBheWxvYWQpIGNhbiBwYXNzIGl0IGluIHRvIHNoYXJwZW5cbiAqICAgdGhlIGF0dHJpYnV0aW9uIGFuZCBoaW50LiBXaGVuIGFic2VudCwgYGRlc2NyaWJlUnVuRXJyb3JgIHN0aWxsXG4gKiAgIHJldHVybnMgYSBzZW5zaWJsZSBhdHRyaWJ1dGlvbiBmcm9tIGBlcnJvckNvZGVgIGFsb25lLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBlcnNpc3RlZEVycm9yU2lnbmFsIHtcbiAgZXJyb3JDb2RlPzogc3RyaW5nO1xuICBlcnJvck5hbWU/OiBzdHJpbmc7XG59XG5cbmNvbnN0IENPTlRFWFRfRVJST1JfTkFNRVMgPSBuZXcgU2V0KFtcbiAgJ05vdEluV29ya2Zsb3dDb250ZXh0RXJyb3InLFxuICAnTm90SW5TdGVwQ29udGV4dEVycm9yJyxcbiAgJ05vdEluV29ya2Zsb3dPclN0ZXBDb250ZXh0RXJyb3InLFxuICAnVW5hdmFpbGFibGVJbldvcmtmbG93Q29udGV4dEVycm9yJyxcbl0pO1xuXG5mdW5jdGlvbiBpc0NvbnRleHRWaW9sYXRpb25FcnJvcihlcnI6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBlcnIgaW5zdGFuY2VvZiBOb3RJbldvcmtmbG93Q29udGV4dEVycm9yIHx8XG4gICAgZXJyIGluc3RhbmNlb2YgTm90SW5TdGVwQ29udGV4dEVycm9yIHx8XG4gICAgZXJyIGluc3RhbmNlb2YgTm90SW5Xb3JrZmxvd09yU3RlcENvbnRleHRFcnJvciB8fFxuICAgIGVyciBpbnN0YW5jZW9mIFVuYXZhaWxhYmxlSW5Xb3JrZmxvd0NvbnRleHRFcnJvclxuICApO1xufVxuXG5jb25zdCBTRVJJQUxJWkFUSU9OX0VSUk9SX0hJTlQgPVxuICAnQSB2YWx1ZSBwYXNzZWQgYWNyb3NzIGEgd29ya2Zsb3cvc3RlcCBib3VuZGFyeSBjb3VsZCBub3QgYmUgc2VyaWFsaXplZC4gU2VlIHRoZSBlcnJvciBtZXNzYWdlIGZvciB0aGUgb2ZmZW5kaW5nIHBhdGggYW5kIHRoZSBMZWFybiBNb3JlIGxpbmsgZm9yIGRldGFpbHMuJztcbmNvbnN0IENPTlRFWFRfRVJST1JfSElOVCA9XG4gICdBIHdvcmtmbG93LW9ubHkgb3Igc3RlcC1vbmx5IEFQSSB3YXMgY2FsbGVkIGZyb20gdGhlIHdyb25nIGNvbnRleHQuIFRoZSBlcnJvciBtZXNzYWdlIGluY2x1ZGVzIHRoZSBleGFjdCBBUEkgYW5kIGhvdyB0byBtb3ZlIHRoZSBjYWxsLic7XG5jb25zdCBSVU5USU1FX0VSUk9SX0hJTlQgPVxuICAnVGhpcyBpcyBhbiBpbnRlcm5hbCB3b3JrZmxvdyBTREsgZXJyb3IsIG5vdCBhIGJ1ZyBpbiB5b3VyIGNvZGUuIElmIGl0IGtlZXBzIGhhcHBlbmluZywgcGxlYXNlIHJlcG9ydCBpdCB3aXRoIHRoZSBzdGFjayB0cmFjZSBhbmQgdGhlIHJ1bklkLic7XG5jb25zdCBDT1JSVVBURURfRVZFTlRfTE9HX0hJTlQgPVxuICAnVGhlIHdvcmtmbG93IGV2ZW50IGxvZyBjb250YWlucyBvcnBoYW5lZCBvciBtaXNtYXRjaGVkIGV2ZW50cyBhbmQgY2Fubm90IGJlIHJlcGxheWVkLiBUaGlzIGlzIGFuIGludGVybmFsIHdvcmtmbG93IFNESyBlcnJvcjsgcGxlYXNlIHJlcG9ydCBpdCB3aXRoIHRoZSBydW5JZC4nO1xuY29uc3QgUkVQTEFZX1RJTUVPVVRfSElOVCA9XG4gICdUaGUgd29ya2Zsb3cgcmVwbGF5IGJldHdlZW4gc3RlcCBib3VuZGFyaWVzIHRvb2sgdG9vIGxvbmcuIFRoaXMgYm91bmRzIHdvcmtmbG93LVZNIGFuZCBldmVudC1sb2cgcmVwbGF5IHRpbWUgb25seSDigJQgc3RlcCBib2RpZXMgKGBcInVzZSBzdGVwXCJgIGZ1bmN0aW9ucykgYXJlIGV4Y2x1ZGVkLiBUaGlzIHVzdWFsbHkgbWVhbnMgdGhlIGV2ZW50IGxvZyBpcyB1bnVzdWFsbHkgbGFyZ2Ugb3IgdGhlIHdvcmtmbG93IGZ1bmN0aW9uIGlzIGRvaW5nIGhlYXZ5IHN5bmNocm9ub3VzIHdvcmsgaW4gd29ya2Zsb3cgY29kZSBvdXRzaWRlIG9mIHN0ZXAgYm9kaWVzLiBPdmVycmlkZSB0aGUgZGVmYXVsdCBidWRnZXQgdmlhIHRoZSBXT1JLRkxPV19SRVBMQVlfVElNRU9VVF9NUyBlbnYgdmFyIGlmIG5lZWRlZC4nO1xuY29uc3QgTUFYX0RFTElWRVJJRVNfSElOVCA9XG4gICdUaGUgd29ya2Zsb3cgcXVldWUgZXhjZWVkZWQgaXRzIG1heC1kZWxpdmVyeSBidWRnZXQuIFRoaXMgdXN1YWxseSBpbmRpY2F0ZXMgYSBwZXJzaXN0ZW50IHJ1bnRpbWUgZmFpbHVyZSDigJQgY2hlY2sgdGhlIG1vc3QgcmVjZW50IHN0YWNrIHRyYWNlcyBmb3IgdGhlIHVuZGVybHlpbmcgY2F1c2UuJztcbmNvbnN0IE1BWF9FVkVOVFNfSElOVCA9XG4gICdUaGUgd29ya2Zsb3cgZXhjZWVkZWQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGV2ZW50cyBwZXIgcnVuLiBUaGlzIHVzdWFsbHkgbWVhbnMgdW5ib3VuZGVkIHdvcmsgaW4gdGhlIHdvcmtmbG93IGZ1bmN0aW9uIOKAlCBlLmcuIGEgbG9vcCB0aGF0IGtlZXBzIGNyZWF0aW5nIHN0ZXBzIHdpdGhvdXQgdGVybWluYXRpbmcuIEJyZWFrIGxvbmctcnVubmluZyB3b3JrZmxvd3MgaW50byBjaGlsZCB3b3JrZmxvd3MgdG8gc3RheSB1bmRlciB0aGUgbGltaXQuJztcbmNvbnN0IFNUUkVBTV9FUlJPUl9ISU5UID1cbiAgJ1dvcmtmbG93IHN0cmVhbSBpbmZyYXN0cnVjdHVyZSBmYWlsZWQgd2hpbGUgcmVhZGluZyBvciB3cml0aW5nIGRhdGEuIFRoaXMgaXMgYW4gU0RLIG9yIGJhY2tlbmQgZmFpbHVyZSwgbm90IGFuIGVycm9yIGluIHlvdXIgd29ya2Zsb3cgY29kZTsgcGxlYXNlIHJldHJ5IHRoZSBydW4gYW5kIHJlcG9ydCBwZXJzaXN0ZW50IGZhaWx1cmVzIHdpdGggdGhlIHJ1bklkLic7XG5jb25zdCBXT1JMRF9DT05UUkFDVF9ISU5UID1cbiAgJ1RoZSB3b3JrZmxvdyBiYWNrZW5kIHJldHVybmVkIGRhdGEgdGhhdCB2aW9sYXRlZCB0aGUgU0RLIGNvbnRyYWN0LiBUaGlzIGlzIG5vdCByZXRyeWFibGU7IHBsZWFzZSByZXBvcnQgaXQgd2l0aCB0aGUgc3RhY2sgdHJhY2UgYW5kIHJ1bklkLic7XG5jb25zdCBERVBMT1lNRU5UX01JU01BVENIX0hJTlQgPVxuICBcIlRoZSBydW4gd2FzIGRlbGl2ZXJlZCB0byBhIGRlcGxveW1lbnQgb3RoZXIgdGhhbiB0aGUgZGVwbG95bWVudCBpdCBpcyBwaW5uZWQgdG8sIGFuZCB3YXMgc3RvcHBlZCB0byBwcm90ZWN0IGFnYWluc3QgY29kZS1za2V3IGVycm9ycyBhZnRlciB0aGUgcnVudGltZSBmYWlsZWQgdG8gcmUtcm91dGUgaXQgdGhlcmUuIFZlcmlmeSB0aGF0IHRoZSBydW4ncyBkZXBsb3ltZW50IGlzIHN0aWxsIGF2YWlsYWJsZSBhbmQgdGhhdCBxdWV1ZSBjYWxsYmFja3Mgcm91dGUgdG8gaXQuXCI7XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUVycm9yQ29kZShjb2RlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBSdW5FcnJvckNvZGUge1xuICAvLyBWYWx1ZXMgcmVhZCBiYWNrIGZyb20gcGVyc2lzdGVkIGV2ZW50cyBhcmUgYHN0cmluZyB8IHVuZGVmaW5lZGAsIHNvIHdlXG4gIC8vIG9ubHkgdHJ1c3QgY29kZXMgdGhhdCBtYXRjaCBhIGtub3duIGVudHJ5IGluIGBSVU5fRVJST1JfQ09ERVNgLlxuICBjb25zdCBrbm93biA9IE9iamVjdC52YWx1ZXMoUlVOX0VSUk9SX0NPREVTKSBhcyByZWFkb25seSBzdHJpbmdbXTtcbiAgaWYgKGNvZGUgJiYga25vd24uaW5jbHVkZXMoY29kZSkpIHtcbiAgICByZXR1cm4gY29kZSBhcyBSdW5FcnJvckNvZGU7XG4gIH1cbiAgcmV0dXJuIFJVTl9FUlJPUl9DT0RFUy5VU0VSX0VSUk9SO1xufVxuXG4vKipcbiAqIERhdGEtZHJpdmVuIHZhcmlhbnQgb2Yge0BsaW5rIGRlc2NyaWJlRXJyb3J9IHRoYXQgd29ya3MgZnJvbSBwZXJzaXN0ZWRcbiAqIGV2ZW50IGZpZWxkcyBpbnN0ZWFkIG9mIGEgbGl2ZSBgRXJyb3JgIGluc3RhbmNlLiBJbnRlbmRlZCBmb3IgY29tbWFuZC1saW5lXG4gKiBpbnRlcmZhY2UgKENMSSkgYW5kIHdlYiByZW5kZXJlcnMgdGhhdCByZWFkIGZhaWx1cmUgZXZlbnRzIGFuZCBubyBsb25nZXJcbiAqIGhhdmUgdGhlIG9yaWdpbmFsIHRocm93biBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXNjcmliZVJ1bkVycm9yKFxuICBzaWduYWw6IFBlcnNpc3RlZEVycm9yU2lnbmFsXG4pOiBFcnJvckRlc2NyaXB0aW9uIHtcbiAgY29uc3QgbmFtZSA9IHNpZ25hbC5lcnJvck5hbWU7XG4gIGNvbnN0IGVycm9yQ29kZSA9XG4gICAgbmFtZSA9PT0gJ0NvcnJ1cHRlZEV2ZW50TG9nRXJyb3InXG4gICAgICA/IFJVTl9FUlJPUl9DT0RFUy5DT1JSVVBURURfRVZFTlRfTE9HXG4gICAgICA6IG5vcm1hbGl6ZUVycm9yQ29kZShzaWduYWwuZXJyb3JDb2RlKTtcblxuICBpZiAobmFtZSA9PT0gJ1NlcmlhbGl6YXRpb25FcnJvcicpIHtcbiAgICByZXR1cm4geyBhdHRyaWJ1dGlvbjogJ3VzZXInLCBlcnJvckNvZGUsIGhpbnQ6IFNFUklBTElaQVRJT05fRVJST1JfSElOVCB9O1xuICB9XG4gIGlmIChuYW1lICYmIENPTlRFWFRfRVJST1JfTkFNRVMuaGFzKG5hbWUpKSB7XG4gICAgcmV0dXJuIHsgYXR0cmlidXRpb246ICd1c2VyJywgZXJyb3JDb2RlLCBoaW50OiBDT05URVhUX0VSUk9SX0hJTlQgfTtcbiAgfVxuICBpZiAobmFtZSA9PT0gJ0NvcnJ1cHRlZEV2ZW50TG9nRXJyb3InKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGF0dHJpYnV0aW9uOiAnc2RrJyxcbiAgICAgIGVycm9yQ29kZSxcbiAgICAgIGhpbnQ6IENPUlJVUFRFRF9FVkVOVF9MT0dfSElOVCxcbiAgICB9O1xuICB9XG4gIGlmIChlcnJvckNvZGUgPT09IFJVTl9FUlJPUl9DT0RFUy5SRVBMQVlfVElNRU9VVCkge1xuICAgIHJldHVybiB7IGF0dHJpYnV0aW9uOiAnc2RrJywgZXJyb3JDb2RlLCBoaW50OiBSRVBMQVlfVElNRU9VVF9ISU5UIH07XG4gIH1cbiAgaWYgKGVycm9yQ29kZSA9PT0gUlVOX0VSUk9SX0NPREVTLk1BWF9ERUxJVkVSSUVTX0VYQ0VFREVEKSB7XG4gICAgcmV0dXJuIHsgYXR0cmlidXRpb246ICdzZGsnLCBlcnJvckNvZGUsIGhpbnQ6IE1BWF9ERUxJVkVSSUVTX0hJTlQgfTtcbiAgfVxuICBpZiAoZXJyb3JDb2RlID09PSBSVU5fRVJST1JfQ09ERVMuTUFYX0VWRU5UU19FWENFRURFRCkge1xuICAgIHJldHVybiB7IGF0dHJpYnV0aW9uOiAndXNlcicsIGVycm9yQ29kZSwgaGludDogTUFYX0VWRU5UU19ISU5UIH07XG4gIH1cbiAgaWYgKGVycm9yQ29kZSA9PT0gUlVOX0VSUk9SX0NPREVTLkNPUlJVUFRFRF9FVkVOVF9MT0cpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYXR0cmlidXRpb246ICdzZGsnLFxuICAgICAgZXJyb3JDb2RlLFxuICAgICAgaGludDogQ09SUlVQVEVEX0VWRU5UX0xPR19ISU5ULFxuICAgIH07XG4gIH1cbiAgaWYgKGVycm9yQ29kZSA9PT0gUlVOX0VSUk9SX0NPREVTLlNUUkVBTV9FUlJPUikge1xuICAgIHJldHVybiB7XG4gICAgICBhdHRyaWJ1dGlvbjogJ3NkaycsXG4gICAgICBlcnJvckNvZGUsXG4gICAgICBoaW50OiBTVFJFQU1fRVJST1JfSElOVCxcbiAgICB9O1xuICB9XG4gIGlmIChlcnJvckNvZGUgPT09IFJVTl9FUlJPUl9DT0RFUy5XT1JMRF9DT05UUkFDVF9FUlJPUikge1xuICAgIHJldHVybiB7XG4gICAgICBhdHRyaWJ1dGlvbjogJ3NkaycsXG4gICAgICBlcnJvckNvZGUsXG4gICAgICBoaW50OiBXT1JMRF9DT05UUkFDVF9ISU5ULFxuICAgIH07XG4gIH1cbiAgaWYgKGVycm9yQ29kZSA9PT0gUlVOX0VSUk9SX0NPREVTLkRFUExPWU1FTlRfTUlTTUFUQ0gpIHtcbiAgICByZXR1cm4geyBhdHRyaWJ1dGlvbjogJ3NkaycsIGVycm9yQ29kZSwgaGludDogREVQTE9ZTUVOVF9NSVNNQVRDSF9ISU5UIH07XG4gIH1cbiAgaWYgKG5hbWUgPT09ICdXb3JrZmxvd1J1bnRpbWVFcnJvcicgfHwgbmFtZSA9PT0gJ1N0ZXBOb3RSZWdpc3RlcmVkRXJyb3InKSB7XG4gICAgcmV0dXJuIHsgYXR0cmlidXRpb246ICdzZGsnLCBlcnJvckNvZGUsIGhpbnQ6IFJVTlRJTUVfRVJST1JfSElOVCB9O1xuICB9XG4gIGlmIChlcnJvckNvZGUgPT09IFJVTl9FUlJPUl9DT0RFUy5SVU5USU1FX0VSUk9SKSB7XG4gICAgcmV0dXJuIHsgYXR0cmlidXRpb246ICdzZGsnLCBlcnJvckNvZGUsIGhpbnQ6IFJVTlRJTUVfRVJST1JfSElOVCB9O1xuICB9XG4gIHJldHVybiB7IGF0dHJpYnV0aW9uOiAndXNlcicsIGVycm9yQ29kZSB9O1xufVxuXG4vKipcbiAqIERlc2NyaWJlIGFuIGVycm9yIGZvciB1c2VyLWZhY2luZyBwcmVzZW50YXRpb24uIFB1cmVseSBpbmZvcm1hdGlvbmFsOiBpdFxuICogZG9lcyBub3QgY2hhbmdlIGFueSBwZXJzaXN0ZWQgZXZlbnQgZGF0YSBvciBlcnJvciBjbGFzc2lmaWNhdGlvbiB1c2VkIGJ5XG4gKiB0aGUgcnVudGltZS5cbiAqXG4gKiBUaGUgYXR0cmlidXRpb24gaGVyZSBpcyBtb3JlIG51YW5jZWQgdGhhbiBgY2xhc3NpZnlSdW5FcnJvcmA6XG4gKlxuICogLSBgU2VyaWFsaXphdGlvbkVycm9yYCBpcyB0ZWNobmljYWxseSByYWlzZWQgYnkgdGhlIFNESywgYnV0IGl0IGFsbW9zdFxuICogICBhbHdheXMgcG9pbnRzIGF0IHNvbWV0aGluZyB0aGUgY2FsbGVyIGRpZCAocGFzc2VkIGEgbm9uLXNlcmlhbGl6YWJsZVxuICogICB2YWx1ZSwgZGlkbid0IHJlZ2lzdGVyIGEgY2xhc3MpLiBXZSBhdHRyaWJ1dGUgaXQgdG8gdGhlIHVzZXIuXG4gKiAtIENvbnRleHQtdmlvbGF0aW9uIGVycm9ycyAoYE5vdEluV29ya2Zsb3dDb250ZXh0RXJyb3JgLCBldGMuKSBsaWtld2lzZVxuICogICBkZXNjcmliZSBhIHVzZXIgbWlzdGFrZS5cbiAqIC0gYFdvcmtmbG93UnVudGltZUVycm9yYCAoYW5kIHN1YmNsYXNzZXMgbGlrZSBgU3RlcE5vdFJlZ2lzdGVyZWRFcnJvcmApXG4gKiAgIGluZGljYXRlcyBhbiBpbnRlcm5hbCBTREsgaW52YXJpYW50IGJyb2tlLCBzbyBzdXJmYWNlIHRoYXQgYXMgYHNka2AuXG4gKlxuICogQHBhcmFtIGVyciBUaGUgZXJyb3IgdmFsdWUgdGhyb3duIGJ5IHRoZSB3b3JrZmxvdyAvIHN0ZXAuXG4gKiBAcGFyYW0gZXJyb3JDb2RlIE9wdGlvbmFsIHByZWNvbXB1dGVkIGVycm9yIGNvZGUuIENhbGxlcnMgdGhhdCBhbHJlYWR5XG4gKiAgIGtub3cgdGhlIGNvZGUgKGUuZy4gYFJFUExBWV9USU1FT1VUYCBvciBgTUFYX0RFTElWRVJJRVNfRVhDRUVERURgLCB3aGljaFxuICogICBgY2xhc3NpZnlSdW5FcnJvcmAgY2FuJ3QgZGVyaXZlIGZyb20gdGhlIGVycm9yIGFsb25lKSBzaG91bGQgcGFzcyBpdCBzb1xuICogICB0aGUgYXR0cmlidXRpb24gYW5kIGhpbnQgcmVmbGVjdCB0aGUgYWN0dWFsIGZhaWx1cmUgY2F0ZWdvcnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXNjcmliZUVycm9yKFxuICBlcnI6IHVua25vd24sXG4gIGVycm9yQ29kZT86IFJ1bkVycm9yQ29kZVxuKTogRXJyb3JEZXNjcmlwdGlvbiB7XG4gIGNvbnN0IGVmZmVjdGl2ZUNvZGUgPSBlcnJvckNvZGUgPz8gY2xhc3NpZnlSdW5FcnJvcihlcnIpO1xuXG4gIGlmIChTZXJpYWxpemF0aW9uRXJyb3IuaXMoZXJyKSkge1xuICAgIHJldHVybiB7XG4gICAgICBhdHRyaWJ1dGlvbjogJ3VzZXInLFxuICAgICAgZXJyb3JDb2RlOiBlZmZlY3RpdmVDb2RlLFxuICAgICAgaGludDogU0VSSUFMSVpBVElPTl9FUlJPUl9ISU5ULFxuICAgIH07XG4gIH1cblxuICBpZiAoaXNDb250ZXh0VmlvbGF0aW9uRXJyb3IoZXJyKSkge1xuICAgIHJldHVybiB7XG4gICAgICBhdHRyaWJ1dGlvbjogJ3VzZXInLFxuICAgICAgZXJyb3JDb2RlOiBlZmZlY3RpdmVDb2RlLFxuICAgICAgaGludDogQ09OVEVYVF9FUlJPUl9ISU5ULFxuICAgIH07XG4gIH1cblxuICBpZiAoQ29ycnVwdGVkRXZlbnRMb2dFcnJvci5pcyhlcnIpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGF0dHJpYnV0aW9uOiAnc2RrJyxcbiAgICAgIGVycm9yQ29kZTogZWZmZWN0aXZlQ29kZSxcbiAgICAgIGhpbnQ6IENPUlJVUFRFRF9FVkVOVF9MT0dfSElOVCxcbiAgICB9O1xuICB9XG5cbiAgLy8gQ2hlY2sgREVQTE9ZTUVOVF9NSVNNQVRDSCBiZWZvcmUgdGhlIGdlbmVyaWMgV29ya2Zsb3dSdW50aW1lRXJyb3IgYnJhbmNoOlxuICAvLyBXb3JrZmxvd0RlcGxveW1lbnRNaXNtYXRjaEVycm9yIHN1YmNsYXNzZXMgaXQsIGJ1dCBoYXMgaXRzIG93biBjb2RlICsgaGludC5cbiAgaWYgKGVmZmVjdGl2ZUNvZGUgPT09IFJVTl9FUlJPUl9DT0RFUy5ERVBMT1lNRU5UX01JU01BVENIKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGF0dHJpYnV0aW9uOiAnc2RrJyxcbiAgICAgIGVycm9yQ29kZTogZWZmZWN0aXZlQ29kZSxcbiAgICAgIGhpbnQ6IERFUExPWU1FTlRfTUlTTUFUQ0hfSElOVCxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGVyciBpbnN0YW5jZW9mIFdvcmtmbG93UnVudGltZUVycm9yKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGF0dHJpYnV0aW9uOiAnc2RrJyxcbiAgICAgIGVycm9yQ29kZTogZWZmZWN0aXZlQ29kZSxcbiAgICAgIGhpbnQ6IFJVTlRJTUVfRVJST1JfSElOVCxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGVmZmVjdGl2ZUNvZGUgPT09IFJVTl9FUlJPUl9DT0RFUy5SRVBMQVlfVElNRU9VVCkge1xuICAgIHJldHVybiB7XG4gICAgICBhdHRyaWJ1dGlvbjogJ3NkaycsXG4gICAgICBlcnJvckNvZGU6IGVmZmVjdGl2ZUNvZGUsXG4gICAgICBoaW50OiBSRVBMQVlfVElNRU9VVF9ISU5ULFxuICAgIH07XG4gIH1cblxuICBpZiAoZWZmZWN0aXZlQ29kZSA9PT0gUlVOX0VSUk9SX0NPREVTLk1BWF9ERUxJVkVSSUVTX0VYQ0VFREVEKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGF0dHJpYnV0aW9uOiAnc2RrJyxcbiAgICAgIGVycm9yQ29kZTogZWZmZWN0aXZlQ29kZSxcbiAgICAgIGhpbnQ6IE1BWF9ERUxJVkVSSUVTX0hJTlQsXG4gICAgfTtcbiAgfVxuXG4gIGlmIChlZmZlY3RpdmVDb2RlID09PSBSVU5fRVJST1JfQ09ERVMuTUFYX0VWRU5UU19FWENFRURFRCkge1xuICAgIHJldHVybiB7XG4gICAgICBhdHRyaWJ1dGlvbjogJ3VzZXInLFxuICAgICAgZXJyb3JDb2RlOiBlZmZlY3RpdmVDb2RlLFxuICAgICAgaGludDogTUFYX0VWRU5UU19ISU5ULFxuICAgIH07XG4gIH1cblxuICBpZiAoZWZmZWN0aXZlQ29kZSA9PT0gUlVOX0VSUk9SX0NPREVTLkNPUlJVUFRFRF9FVkVOVF9MT0cpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYXR0cmlidXRpb246ICdzZGsnLFxuICAgICAgZXJyb3JDb2RlOiBlZmZlY3RpdmVDb2RlLFxuICAgICAgaGludDogQ09SUlVQVEVEX0VWRU5UX0xPR19ISU5ULFxuICAgIH07XG4gIH1cblxuICBpZiAoZWZmZWN0aXZlQ29kZSA9PT0gUlVOX0VSUk9SX0NPREVTLlNUUkVBTV9FUlJPUikge1xuICAgIHJldHVybiB7XG4gICAgICBhdHRyaWJ1dGlvbjogJ3NkaycsXG4gICAgICBlcnJvckNvZGU6IGVmZmVjdGl2ZUNvZGUsXG4gICAgICBoaW50OiBTVFJFQU1fRVJST1JfSElOVCxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGVmZmVjdGl2ZUNvZGUgPT09IFJVTl9FUlJPUl9DT0RFUy5XT1JMRF9DT05UUkFDVF9FUlJPUikge1xuICAgIHJldHVybiB7XG4gICAgICBhdHRyaWJ1dGlvbjogJ3NkaycsXG4gICAgICBlcnJvckNvZGU6IGVmZmVjdGl2ZUNvZGUsXG4gICAgICBoaW50OiBXT1JMRF9DT05UUkFDVF9ISU5ULFxuICAgIH07XG4gIH1cblxuICByZXR1cm4geyBhdHRyaWJ1dGlvbjogJ3VzZXInLCBlcnJvckNvZGU6IGVmZmVjdGl2ZUNvZGUgfTtcbn1cbiJdfQ==
|
package/dist/encryption.d.ts
CHANGED
|
@@ -12,34 +12,68 @@
|
|
|
12
12
|
* calls on every encrypt/decrypt invocation.
|
|
13
13
|
*
|
|
14
14
|
* Wire format: `[nonce (12 bytes)][ciphertext + auth tag]`
|
|
15
|
-
* The `encr` format prefix is NOT part of this module
|
|
15
|
+
* The `encr` format prefix is NOT part of this module: it's added/stripped
|
|
16
16
|
* by the serialization layer in `maybeEncrypt`/`maybeDecrypt`.
|
|
17
17
|
*/
|
|
18
18
|
export type CryptoKey = import('node:crypto').webcrypto.CryptoKey;
|
|
19
|
+
/** AES-GCM nonce length in bytes. */
|
|
20
|
+
export declare const NONCE_LENGTH = 12;
|
|
21
|
+
/** AES-GCM authentication tag length in bits. */
|
|
22
|
+
export declare const TAG_LENGTH = 128;
|
|
23
|
+
/** AES-GCM authentication tag length in bytes. */
|
|
24
|
+
export declare const TAG_BYTES: number;
|
|
19
25
|
/**
|
|
20
26
|
* Import a raw AES-256 key as a `CryptoKey` for use with `encrypt()`/`decrypt()`.
|
|
21
27
|
*
|
|
22
28
|
* Callers should call this once per run (after `getEncryptionKeyForRun()`)
|
|
23
29
|
* and pass the resulting `CryptoKey` to all subsequent encrypt/decrypt calls.
|
|
24
30
|
*
|
|
31
|
+
* Pass `usages: ['encrypt']` (or `['decrypt']`) for cross-run scenarios
|
|
32
|
+
* where the caller should not be able to perform the inverse operation
|
|
33
|
+
* with the key. For example, a child workflow writing into a parent
|
|
34
|
+
* run's forwarded WritableStream only needs to encrypt, never decrypt.
|
|
35
|
+
*
|
|
25
36
|
* @param raw - Raw 32-byte AES-256 key (from World.getEncryptionKeyForRun)
|
|
37
|
+
* @param usages - Key usages. Defaults to `['encrypt', 'decrypt']`.
|
|
26
38
|
* @returns CryptoKey ready for AES-GCM operations
|
|
27
39
|
*/
|
|
28
|
-
export declare function importKey(raw: Uint8Array): Promise<import("crypto").webcrypto.CryptoKey>;
|
|
40
|
+
export declare function importKey(raw: Uint8Array, usages?: ReadonlyArray<'encrypt' | 'decrypt'>): Promise<import("crypto").webcrypto.CryptoKey>;
|
|
29
41
|
/**
|
|
30
42
|
* Encrypt data using AES-256-GCM.
|
|
31
43
|
*
|
|
32
44
|
* @param key - CryptoKey from `importKey()`
|
|
33
45
|
* @param data - Plaintext to encrypt
|
|
46
|
+
* @param aad - Optional additional authenticated data. Not encrypted, but
|
|
47
|
+
* covered by the GCM auth tag: decryption fails unless the exact same
|
|
48
|
+
* bytes are supplied. Used by the sealed-box layer to bind ciphertext to
|
|
49
|
+
* a `projectId|runId` context. Omit for no AAD (the legacy behavior).
|
|
34
50
|
* @returns `[nonce (12 bytes)][ciphertext + GCM auth tag]`
|
|
35
51
|
*/
|
|
36
|
-
export declare function encrypt(key: CryptoKey, data: Uint8Array): Promise<Uint8Array>;
|
|
52
|
+
export declare function encrypt(key: CryptoKey, data: Uint8Array, aad?: Uint8Array): Promise<Uint8Array>;
|
|
37
53
|
/**
|
|
38
54
|
* Decrypt data using AES-256-GCM.
|
|
39
55
|
*
|
|
56
|
+
* Any failure inside the Web Crypto layer (most commonly an
|
|
57
|
+
* `OperationError: The operation failed for an operation-specific reason`
|
|
58
|
+
* raised by `AESCipherJob.onDone` when the GCM authentication tag does
|
|
59
|
+
* not verify) is rewrapped as {@link RuntimeDecryptionError}. The
|
|
60
|
+
* wrapped error carries the original DOMException as `cause`, plus a
|
|
61
|
+
* small diagnostic context (`operation`, input `byteLength`) to help
|
|
62
|
+
* disambiguate ciphertext corruption from key mismatch from truncated
|
|
63
|
+
* transport reads.
|
|
64
|
+
*
|
|
65
|
+
* Note: `data` is the raw AES payload (`[nonce][ciphertext + tag]`), not a
|
|
66
|
+
* format-prefixed envelope: callers strip the `encr` marker via
|
|
67
|
+
* `decodeFormatPrefix()` before reaching this function. The outer
|
|
68
|
+
* envelope's format prefix is therefore attached by the serialization
|
|
69
|
+
* layer (`serialization/encryption.ts`), which is the layer that has it.
|
|
70
|
+
*
|
|
40
71
|
* @param key - CryptoKey from `importKey()`
|
|
41
72
|
* @param data - `[nonce (12 bytes)][ciphertext + GCM auth tag]`
|
|
73
|
+
* @param aad - Optional additional authenticated data. Must match the bytes
|
|
74
|
+
* passed to {@link encrypt} exactly, otherwise the GCM tag fails to verify
|
|
75
|
+
* and a {@link RuntimeDecryptionError} is thrown.
|
|
42
76
|
* @returns Decrypted plaintext
|
|
43
77
|
*/
|
|
44
|
-
export declare function decrypt(key: CryptoKey, data: Uint8Array): Promise<Uint8Array>;
|
|
78
|
+
export declare function decrypt(key: CryptoKey, data: Uint8Array, aad?: Uint8Array): Promise<Uint8Array>;
|
|
45
79
|
//# sourceMappingURL=encryption.d.ts.map
|
package/dist/encryption.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"encryption.d.ts","sourceRoot":"","sources":["../src/encryption.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;GAgBG;AAKH,MAAM,MAAM,SAAS,GAAG,OAAO,aAAa,EAAE,SAAS,CAAC,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"encryption.d.ts","sourceRoot":"","sources":["../src/encryption.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;GAgBG;AAKH,MAAM,MAAM,SAAS,GAAG,OAAO,aAAa,EAAE,SAAS,CAAC,SAAS,CAAC;AAElE,qCAAqC;AACrC,eAAO,MAAM,YAAY,KAAK,CAAC;AAC/B,iDAAiD;AACjD,eAAO,MAAM,UAAU,MAAM,CAAC;AAC9B,kDAAkD;AAClD,eAAO,MAAM,SAAS,QAAiB,CAAC;AAGxC;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,SAAS,CAC7B,GAAG,EAAE,UAAU,EACf,MAAM,GAAE,aAAa,CAAC,SAAS,GAAG,SAAS,CAA0B,iDAiBtE;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,OAAO,CAC3B,GAAG,EAAE,SAAS,EACd,IAAI,EAAE,UAAU,EAChB,GAAG,CAAC,EAAE,UAAU,GACf,OAAO,CAAC,UAAU,CAAC,CAiCrB;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAsB,OAAO,CAC3B,GAAG,EAAE,SAAS,EACd,IAAI,EAAE,UAAU,EAChB,GAAG,CAAC,EAAE,UAAU,GACf,OAAO,CAAC,UAAU,CAAC,CA+CrB"}
|
package/dist/encryption.js
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
|
-
import { WorkflowRuntimeError } from '@workflow/errors';
|
|
2
|
-
|
|
3
|
-
const
|
|
1
|
+
import { RuntimeDecryptionError, WorkflowRuntimeError } from '@workflow/errors';
|
|
2
|
+
/** AES-GCM nonce length in bytes. */
|
|
3
|
+
export const NONCE_LENGTH = 12;
|
|
4
|
+
/** AES-GCM authentication tag length in bits. */
|
|
5
|
+
export const TAG_LENGTH = 128;
|
|
6
|
+
/** AES-GCM authentication tag length in bytes. */
|
|
7
|
+
export const TAG_BYTES = TAG_LENGTH / 8;
|
|
4
8
|
const KEY_LENGTH = 32; // bytes (AES-256)
|
|
5
9
|
/**
|
|
6
10
|
* Import a raw AES-256 key as a `CryptoKey` for use with `encrypt()`/`decrypt()`.
|
|
@@ -8,28 +12,59 @@ const KEY_LENGTH = 32; // bytes (AES-256)
|
|
|
8
12
|
* Callers should call this once per run (after `getEncryptionKeyForRun()`)
|
|
9
13
|
* and pass the resulting `CryptoKey` to all subsequent encrypt/decrypt calls.
|
|
10
14
|
*
|
|
15
|
+
* Pass `usages: ['encrypt']` (or `['decrypt']`) for cross-run scenarios
|
|
16
|
+
* where the caller should not be able to perform the inverse operation
|
|
17
|
+
* with the key. For example, a child workflow writing into a parent
|
|
18
|
+
* run's forwarded WritableStream only needs to encrypt, never decrypt.
|
|
19
|
+
*
|
|
11
20
|
* @param raw - Raw 32-byte AES-256 key (from World.getEncryptionKeyForRun)
|
|
21
|
+
* @param usages - Key usages. Defaults to `['encrypt', 'decrypt']`.
|
|
12
22
|
* @returns CryptoKey ready for AES-GCM operations
|
|
13
23
|
*/
|
|
14
|
-
export async function importKey(raw) {
|
|
24
|
+
export async function importKey(raw, usages = ['encrypt', 'decrypt']) {
|
|
15
25
|
if (raw.byteLength !== KEY_LENGTH) {
|
|
16
26
|
throw new WorkflowRuntimeError(`Encryption key must be exactly ${KEY_LENGTH} bytes, got ${raw.byteLength}`);
|
|
17
27
|
}
|
|
18
|
-
return globalThis.crypto.subtle.importKey('raw', raw, 'AES-GCM', false,
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
]
|
|
28
|
+
return globalThis.crypto.subtle.importKey('raw', raw, 'AES-GCM', false,
|
|
29
|
+
// `KeyUsage` is a DOM-lib type that's not in scope under `es2022`.
|
|
30
|
+
// The `ReadonlyArray<'encrypt' | 'decrypt'>` parameter type matches
|
|
31
|
+
// a strict subset of `KeyUsage[]`, so this cast is sound.
|
|
32
|
+
usages);
|
|
22
33
|
}
|
|
23
34
|
/**
|
|
24
35
|
* Encrypt data using AES-256-GCM.
|
|
25
36
|
*
|
|
26
37
|
* @param key - CryptoKey from `importKey()`
|
|
27
38
|
* @param data - Plaintext to encrypt
|
|
39
|
+
* @param aad - Optional additional authenticated data. Not encrypted, but
|
|
40
|
+
* covered by the GCM auth tag: decryption fails unless the exact same
|
|
41
|
+
* bytes are supplied. Used by the sealed-box layer to bind ciphertext to
|
|
42
|
+
* a `projectId|runId` context. Omit for no AAD (the legacy behavior).
|
|
28
43
|
* @returns `[nonce (12 bytes)][ciphertext + GCM auth tag]`
|
|
29
44
|
*/
|
|
30
|
-
export async function encrypt(key, data) {
|
|
45
|
+
export async function encrypt(key, data, aad) {
|
|
31
46
|
const nonce = globalThis.crypto.getRandomValues(new Uint8Array(NONCE_LENGTH));
|
|
32
|
-
|
|
47
|
+
let ciphertext;
|
|
48
|
+
try {
|
|
49
|
+
ciphertext = await globalThis.crypto.subtle.encrypt({
|
|
50
|
+
name: 'AES-GCM',
|
|
51
|
+
iv: nonce,
|
|
52
|
+
tagLength: TAG_LENGTH,
|
|
53
|
+
...(aad ? { additionalData: aad } : {}),
|
|
54
|
+
}, key, data);
|
|
55
|
+
}
|
|
56
|
+
catch (cause) {
|
|
57
|
+
// Re-wrap any Web Crypto failure (DOMException etc.) as a
|
|
58
|
+
// RuntimeDecryptionError. Failures here are rare: they happen e.g.
|
|
59
|
+
// when a CryptoKey was imported with `usages: ['decrypt']` only.
|
|
60
|
+
throw new RuntimeDecryptionError(`AES-256-GCM encryption failed: ${cause instanceof Error ? cause.message : String(cause)}`, {
|
|
61
|
+
cause,
|
|
62
|
+
context: {
|
|
63
|
+
operation: 'encrypt',
|
|
64
|
+
byteLength: data.byteLength,
|
|
65
|
+
},
|
|
66
|
+
});
|
|
67
|
+
}
|
|
33
68
|
const result = new Uint8Array(NONCE_LENGTH + ciphertext.byteLength);
|
|
34
69
|
result.set(nonce, 0);
|
|
35
70
|
result.set(new Uint8Array(ciphertext), NONCE_LENGTH);
|
|
@@ -38,18 +73,65 @@ export async function encrypt(key, data) {
|
|
|
38
73
|
/**
|
|
39
74
|
* Decrypt data using AES-256-GCM.
|
|
40
75
|
*
|
|
76
|
+
* Any failure inside the Web Crypto layer (most commonly an
|
|
77
|
+
* `OperationError: The operation failed for an operation-specific reason`
|
|
78
|
+
* raised by `AESCipherJob.onDone` when the GCM authentication tag does
|
|
79
|
+
* not verify) is rewrapped as {@link RuntimeDecryptionError}. The
|
|
80
|
+
* wrapped error carries the original DOMException as `cause`, plus a
|
|
81
|
+
* small diagnostic context (`operation`, input `byteLength`) to help
|
|
82
|
+
* disambiguate ciphertext corruption from key mismatch from truncated
|
|
83
|
+
* transport reads.
|
|
84
|
+
*
|
|
85
|
+
* Note: `data` is the raw AES payload (`[nonce][ciphertext + tag]`), not a
|
|
86
|
+
* format-prefixed envelope: callers strip the `encr` marker via
|
|
87
|
+
* `decodeFormatPrefix()` before reaching this function. The outer
|
|
88
|
+
* envelope's format prefix is therefore attached by the serialization
|
|
89
|
+
* layer (`serialization/encryption.ts`), which is the layer that has it.
|
|
90
|
+
*
|
|
41
91
|
* @param key - CryptoKey from `importKey()`
|
|
42
92
|
* @param data - `[nonce (12 bytes)][ciphertext + GCM auth tag]`
|
|
93
|
+
* @param aad - Optional additional authenticated data. Must match the bytes
|
|
94
|
+
* passed to {@link encrypt} exactly, otherwise the GCM tag fails to verify
|
|
95
|
+
* and a {@link RuntimeDecryptionError} is thrown.
|
|
43
96
|
* @returns Decrypted plaintext
|
|
44
97
|
*/
|
|
45
|
-
export async function decrypt(key, data) {
|
|
98
|
+
export async function decrypt(key, data, aad) {
|
|
46
99
|
const minLength = NONCE_LENGTH + TAG_LENGTH / 8; // nonce + auth tag
|
|
47
100
|
if (data.byteLength < minLength) {
|
|
48
|
-
throw new
|
|
101
|
+
throw new RuntimeDecryptionError(`Encrypted data too short: expected at least ${minLength} bytes, got ${data.byteLength}`, {
|
|
102
|
+
context: {
|
|
103
|
+
operation: 'decrypt',
|
|
104
|
+
byteLength: data.byteLength,
|
|
105
|
+
},
|
|
106
|
+
});
|
|
49
107
|
}
|
|
50
108
|
const nonce = data.subarray(0, NONCE_LENGTH);
|
|
51
109
|
const ciphertext = data.subarray(NONCE_LENGTH);
|
|
52
|
-
|
|
110
|
+
let plaintext;
|
|
111
|
+
try {
|
|
112
|
+
plaintext = await globalThis.crypto.subtle.decrypt({
|
|
113
|
+
name: 'AES-GCM',
|
|
114
|
+
iv: nonce,
|
|
115
|
+
tagLength: TAG_LENGTH,
|
|
116
|
+
...(aad ? { additionalData: aad } : {}),
|
|
117
|
+
}, key, ciphertext);
|
|
118
|
+
}
|
|
119
|
+
catch (cause) {
|
|
120
|
+
// The most common shape we see in the wild is a DOMException with
|
|
121
|
+
// `name: 'OperationError'` and message "The operation failed for
|
|
122
|
+
// an operation-specific reason", which is what Web Crypto throws
|
|
123
|
+
// when the GCM auth tag does not verify. Re-throw as
|
|
124
|
+
// RuntimeDecryptionError, attaching diagnostic context (byte length)
|
|
125
|
+
// that the bare DOMException lacks.
|
|
126
|
+
const causeMsg = cause instanceof Error ? cause.message : String(cause);
|
|
127
|
+
throw new RuntimeDecryptionError(`AES-256-GCM decryption failed: ${causeMsg}`, {
|
|
128
|
+
cause,
|
|
129
|
+
context: {
|
|
130
|
+
operation: 'decrypt',
|
|
131
|
+
byteLength: data.byteLength,
|
|
132
|
+
},
|
|
133
|
+
});
|
|
134
|
+
}
|
|
53
135
|
return new Uint8Array(plaintext);
|
|
54
136
|
}
|
|
55
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jcnlwdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9lbmNyeXB0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBeUJ4RCxNQUFNLFlBQVksR0FBRyxFQUFFLENBQUM7QUFDeEIsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLENBQUMsT0FBTztBQUMvQixNQUFNLFVBQVUsR0FBRyxFQUFFLENBQUMsQ0FBQyxrQkFBa0I7QUFFekM7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLFNBQVMsQ0FBQyxHQUFlO0lBQzdDLElBQUksR0FBRyxDQUFDLFVBQVUsS0FBSyxVQUFVLEVBQUUsQ0FBQztRQUNsQyxNQUFNLElBQUksb0JBQW9CLENBQzVCLGtDQUFrQyxVQUFVLGVBQWUsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUM1RSxDQUFDO0lBQ0osQ0FBQztJQUNELE9BQU8sVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRTtRQUN0RSxTQUFTO1FBQ1QsU0FBUztLQUNWLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLE9BQU8sQ0FDM0IsR0FBYyxFQUNkLElBQWdCO0lBRWhCLE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLElBQUksVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7SUFDOUUsTUFBTSxVQUFVLEdBQUcsTUFBTSxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQ3ZELEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsRUFDckQsR0FBRyxFQUNILElBQUksQ0FDTCxDQUFDO0lBQ0YsTUFBTSxNQUFNLEdBQUcsSUFBSSxVQUFVLENBQUMsWUFBWSxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNwRSxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNyQixNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksVUFBVSxDQUFDLFVBQVUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ3JELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLE9BQU8sQ0FDM0IsR0FBYyxFQUNkLElBQWdCO0lBRWhCLE1BQU0sU0FBUyxHQUFHLFlBQVksR0FBRyxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUMsbUJBQW1CO0lBQ3BFLElBQUksSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLEVBQUUsQ0FBQztRQUNoQyxNQUFNLElBQUksb0JBQW9CLENBQzVCLCtDQUErQyxTQUFTLGVBQWUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUN6RixDQUFDO0lBQ0osQ0FBQztJQUNELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQzdDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDL0MsTUFBTSxTQUFTLEdBQUcsTUFBTSxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQ3RELEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsRUFDckQsR0FBRyxFQUNILFVBQVUsQ0FDWCxDQUFDO0lBQ0YsT0FBTyxJQUFJLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUNuQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgV29ya2Zsb3dSdW50aW1lRXJyb3IgfSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcblxuLyoqXG4gKiBCcm93c2VyLWNvbXBhdGlibGUgQUVTLTI1Ni1HQ00gZW5jcnlwdGlvbiBtb2R1bGUuXG4gKlxuICogVXNlcyB0aGUgV2ViIENyeXB0byBBUEkgKGBnbG9iYWxUaGlzLmNyeXB0by5zdWJ0bGVgKSB3aGljaCB3b3JrcyBpblxuICogYm90aCBtb2Rlcm4gYnJvd3NlcnMgYW5kIE5vZGUuanMgMjArLiBUaGlzIG1vZHVsZSBpcyBpbnRlbnRpb25hbGx5XG4gKiBmcmVlIG9mIE5vZGUuanMtc3BlY2lmaWMgaW1wb3J0cyBzbyBpdCBjYW4gYmUgYnVuZGxlZCBmb3IgdGhlIGJyb3dzZXIuXG4gKlxuICogVGhlIFdvcmxkIGludGVyZmFjZSAoYGdldEVuY3J5cHRpb25LZXlGb3JSdW5gKSByZXR1cm5zIGEgcmF3IDMyLWJ5dGVcbiAqIEFFUy0yNTYga2V5LiBDYWxsZXJzIHNob3VsZCB1c2UgYGltcG9ydEtleSgpYCBvbmNlIHRvIGNvbnZlcnQgaXQgdG8gYVxuICogYENyeXB0b0tleWAsIHRoZW4gcGFzcyB0aGF0IHRvIGBlbmNyeXB0KClgL2BkZWNyeXB0KClgIGZvciBhbGxcbiAqIG9wZXJhdGlvbnMgd2l0aGluIHRoZSBzYW1lIHJ1bi4gVGhpcyBhdm9pZHMgcmVwZWF0ZWQgYGltcG9ydEtleSgpYFxuICogY2FsbHMgb24gZXZlcnkgZW5jcnlwdC9kZWNyeXB0IGludm9jYXRpb24uXG4gKlxuICogV2lyZSBmb3JtYXQ6IGBbbm9uY2UgKDEyIGJ5dGVzKV1bY2lwaGVydGV4dCArIGF1dGggdGFnXWBcbiAqIFRoZSBgZW5jcmAgZm9ybWF0IHByZWZpeCBpcyBOT1QgcGFydCBvZiB0aGlzIG1vZHVsZSDigJQgaXQncyBhZGRlZC9zdHJpcHBlZFxuICogYnkgdGhlIHNlcmlhbGl6YXRpb24gbGF5ZXIgaW4gYG1heWJlRW5jcnlwdGAvYG1heWJlRGVjcnlwdGAuXG4gKi9cblxuLy8gQ3J5cHRvS2V5IGlzIGEgZ2xvYmFsIHR5cGUgaW4gYnJvd3NlcnMgYW5kIE5vZGUuanMgMjArLCBidXQgVHlwZVNjcmlwdCdzXG4vLyBgZXMyMDIyYCBsaWIgZG9lc24ndCBpbmNsdWRlIGl0LiBSZS1leHBvcnQgaXQgZnJvbSB0aGUgbm9kZTpjcnlwdG8gdHlwZXNcbi8vIHNvIGNvbnN1bWVycyBjYW4gcmVmZXJlbmNlIGl0IHdpdGhvdXQgYWRkaW5nIGBkb21gIGxpYi5cbmV4cG9ydCB0eXBlIENyeXB0b0tleSA9IGltcG9ydCgnbm9kZTpjcnlwdG8nKS53ZWJjcnlwdG8uQ3J5cHRvS2V5O1xuXG5jb25zdCBOT05DRV9MRU5HVEggPSAxMjtcbmNvbnN0IFRBR19MRU5HVEggPSAxMjg7IC8vIGJpdHNcbmNvbnN0IEtFWV9MRU5HVEggPSAzMjsgLy8gYnl0ZXMgKEFFUy0yNTYpXG5cbi8qKlxuICogSW1wb3J0IGEgcmF3IEFFUy0yNTYga2V5IGFzIGEgYENyeXB0b0tleWAgZm9yIHVzZSB3aXRoIGBlbmNyeXB0KClgL2BkZWNyeXB0KClgLlxuICpcbiAqIENhbGxlcnMgc2hvdWxkIGNhbGwgdGhpcyBvbmNlIHBlciBydW4gKGFmdGVyIGBnZXRFbmNyeXB0aW9uS2V5Rm9yUnVuKClgKVxuICogYW5kIHBhc3MgdGhlIHJlc3VsdGluZyBgQ3J5cHRvS2V5YCB0byBhbGwgc3Vic2VxdWVudCBlbmNyeXB0L2RlY3J5cHQgY2FsbHMuXG4gKlxuICogQHBhcmFtIHJhdyAtIFJhdyAzMi1ieXRlIEFFUy0yNTYga2V5IChmcm9tIFdvcmxkLmdldEVuY3J5cHRpb25LZXlGb3JSdW4pXG4gKiBAcmV0dXJucyBDcnlwdG9LZXkgcmVhZHkgZm9yIEFFUy1HQ00gb3BlcmF0aW9uc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW1wb3J0S2V5KHJhdzogVWludDhBcnJheSkge1xuICBpZiAocmF3LmJ5dGVMZW5ndGggIT09IEtFWV9MRU5HVEgpIHtcbiAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICBgRW5jcnlwdGlvbiBrZXkgbXVzdCBiZSBleGFjdGx5ICR7S0VZX0xFTkdUSH0gYnl0ZXMsIGdvdCAke3Jhdy5ieXRlTGVuZ3RofWBcbiAgICApO1xuICB9XG4gIHJldHVybiBnbG9iYWxUaGlzLmNyeXB0by5zdWJ0bGUuaW1wb3J0S2V5KCdyYXcnLCByYXcsICdBRVMtR0NNJywgZmFsc2UsIFtcbiAgICAnZW5jcnlwdCcsXG4gICAgJ2RlY3J5cHQnLFxuICBdKTtcbn1cblxuLyoqXG4gKiBFbmNyeXB0IGRhdGEgdXNpbmcgQUVTLTI1Ni1HQ00uXG4gKlxuICogQHBhcmFtIGtleSAtIENyeXB0b0tleSBmcm9tIGBpbXBvcnRLZXkoKWBcbiAqIEBwYXJhbSBkYXRhIC0gUGxhaW50ZXh0IHRvIGVuY3J5cHRcbiAqIEByZXR1cm5zIGBbbm9uY2UgKDEyIGJ5dGVzKV1bY2lwaGVydGV4dCArIEdDTSBhdXRoIHRhZ11gXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbmNyeXB0KFxuICBrZXk6IENyeXB0b0tleSxcbiAgZGF0YTogVWludDhBcnJheVxuKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gIGNvbnN0IG5vbmNlID0gZ2xvYmFsVGhpcy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50OEFycmF5KE5PTkNFX0xFTkdUSCkpO1xuICBjb25zdCBjaXBoZXJ0ZXh0ID0gYXdhaXQgZ2xvYmFsVGhpcy5jcnlwdG8uc3VidGxlLmVuY3J5cHQoXG4gICAgeyBuYW1lOiAnQUVTLUdDTScsIGl2OiBub25jZSwgdGFnTGVuZ3RoOiBUQUdfTEVOR1RIIH0sXG4gICAga2V5LFxuICAgIGRhdGFcbiAgKTtcbiAgY29uc3QgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkoTk9OQ0VfTEVOR1RIICsgY2lwaGVydGV4dC5ieXRlTGVuZ3RoKTtcbiAgcmVzdWx0LnNldChub25jZSwgMCk7XG4gIHJlc3VsdC5zZXQobmV3IFVpbnQ4QXJyYXkoY2lwaGVydGV4dCksIE5PTkNFX0xFTkdUSCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogRGVjcnlwdCBkYXRhIHVzaW5nIEFFUy0yNTYtR0NNLlxuICpcbiAqIEBwYXJhbSBrZXkgLSBDcnlwdG9LZXkgZnJvbSBgaW1wb3J0S2V5KClgXG4gKiBAcGFyYW0gZGF0YSAtIGBbbm9uY2UgKDEyIGJ5dGVzKV1bY2lwaGVydGV4dCArIEdDTSBhdXRoIHRhZ11gXG4gKiBAcmV0dXJucyBEZWNyeXB0ZWQgcGxhaW50ZXh0XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWNyeXB0KFxuICBrZXk6IENyeXB0b0tleSxcbiAgZGF0YTogVWludDhBcnJheVxuKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gIGNvbnN0IG1pbkxlbmd0aCA9IE5PTkNFX0xFTkdUSCArIFRBR19MRU5HVEggLyA4OyAvLyBub25jZSArIGF1dGggdGFnXG4gIGlmIChkYXRhLmJ5dGVMZW5ndGggPCBtaW5MZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICBgRW5jcnlwdGVkIGRhdGEgdG9vIHNob3J0OiBleHBlY3RlZCBhdCBsZWFzdCAke21pbkxlbmd0aH0gYnl0ZXMsIGdvdCAke2RhdGEuYnl0ZUxlbmd0aH1gXG4gICAgKTtcbiAgfVxuICBjb25zdCBub25jZSA9IGRhdGEuc3ViYXJyYXkoMCwgTk9OQ0VfTEVOR1RIKTtcbiAgY29uc3QgY2lwaGVydGV4dCA9IGRhdGEuc3ViYXJyYXkoTk9OQ0VfTEVOR1RIKTtcbiAgY29uc3QgcGxhaW50ZXh0ID0gYXdhaXQgZ2xvYmFsVGhpcy5jcnlwdG8uc3VidGxlLmRlY3J5cHQoXG4gICAgeyBuYW1lOiAnQUVTLUdDTScsIGl2OiBub25jZSwgdGFnTGVuZ3RoOiBUQUdfTEVOR1RIIH0sXG4gICAga2V5LFxuICAgIGNpcGhlcnRleHRcbiAgKTtcbiAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHBsYWludGV4dCk7XG59XG4iXX0=
|
|
137
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jcnlwdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9lbmNyeXB0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBeUJoRixxQ0FBcUM7QUFDckMsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQztBQUMvQixpREFBaUQ7QUFDakQsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQztBQUM5QixrREFBa0Q7QUFDbEQsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLFVBQVUsR0FBRyxDQUFDLENBQUM7QUFDeEMsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFDLENBQUMsa0JBQWtCO0FBRXpDOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxTQUFTLENBQzdCLEdBQWUsRUFDZixTQUErQyxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUM7SUFFckUsSUFBSSxHQUFHLENBQUMsVUFBVSxLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQ2xDLE1BQU0sSUFBSSxvQkFBb0IsQ0FDNUIsa0NBQWtDLFVBQVUsZUFBZSxHQUFHLENBQUMsVUFBVSxFQUFFLENBQzVFLENBQUM7SUFDSixDQUFDO0lBQ0QsT0FBTyxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQ3ZDLEtBQUssRUFDTCxHQUFHLEVBQ0gsU0FBUyxFQUNULEtBQUs7SUFDTCxtRUFBbUU7SUFDbkUsb0VBQW9FO0lBQ3BFLDBEQUEwRDtJQUMxRCxNQUFtQyxDQUNwQyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLE9BQU8sQ0FDM0IsR0FBYyxFQUNkLElBQWdCLEVBQ2hCLEdBQWdCO0lBRWhCLE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsZUFB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QUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEUsTUFBTSxJQUFJLHNCQUFzQixDQUM5QixrQ0FBa0MsUUFBUSxFQUFFLEVBQzVDO1lBQ0UsS0FBSztZQUNMLE9BQU8sRUFBRTtnQkFDUCxTQUFTLEVBQUUsU0FBUztnQkFDcEIsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO2FBQzVCO1NBQ0YsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUNELE9BQU8sSUFBSSxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDbkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3IsIFdvcmtmbG93UnVudGltZUVycm9yIH0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5cbi8qKlxuICogQnJvd3Nlci1jb21wYXRpYmxlIEFFUy0yNTYtR0NNIGVuY3J5cHRpb24gbW9kdWxlLlxuICpcbiAqIFVzZXMgdGhlIFdlYiBDcnlwdG8gQVBJIChgZ2xvYmFsVGhpcy5jcnlwdG8uc3VidGxlYCkgd2hpY2ggd29ya3MgaW5cbiAqIGJvdGggbW9kZXJuIGJyb3dzZXJzIGFuZCBOb2RlLmpzIDIwKy4gVGhpcyBtb2R1bGUgaXMgaW50ZW50aW9uYWxseVxuICogZnJlZSBvZiBOb2RlLmpzLXNwZWNpZmljIGltcG9ydHMgc28gaXQgY2FuIGJlIGJ1bmRsZWQgZm9yIHRoZSBicm93c2VyLlxuICpcbiAqIFRoZSBXb3JsZCBpbnRlcmZhY2UgKGBnZXRFbmNyeXB0aW9uS2V5Rm9yUnVuYCkgcmV0dXJucyBhIHJhdyAzMi1ieXRlXG4gKiBBRVMtMjU2IGtleS4gQ2FsbGVycyBzaG91bGQgdXNlIGBpbXBvcnRLZXkoKWAgb25jZSB0byBjb252ZXJ0IGl0IHRvIGFcbiAqIGBDcnlwdG9LZXlgLCB0aGVuIHBhc3MgdGhhdCB0byBgZW5jcnlwdCgpYC9gZGVjcnlwdCgpYCBmb3IgYWxsXG4gKiBvcGVyYXRpb25zIHdpdGhpbiB0aGUgc2FtZSBydW4uIFRoaXMgYXZvaWRzIHJlcGVhdGVkIGBpbXBvcnRLZXkoKWBcbiAqIGNhbGxzIG9uIGV2ZXJ5IGVuY3J5cHQvZGVjcnlwdCBpbnZvY2F0aW9uLlxuICpcbiAqIFdpcmUgZm9ybWF0OiBgW25vbmNlICgxMiBieXRlcyldW2NpcGhlcnRleHQgKyBhdXRoIHRhZ11gXG4gKiBUaGUgYGVuY3JgIGZvcm1hdCBwcmVmaXggaXMgTk9UIHBhcnQgb2YgdGhpcyBtb2R1bGU6IGl0J3MgYWRkZWQvc3RyaXBwZWRcbiAqIGJ5IHRoZSBzZXJpYWxpemF0aW9uIGxheWVyIGluIGBtYXliZUVuY3J5cHRgL2BtYXliZURlY3J5cHRgLlxuICovXG5cbi8vIENyeXB0b0tleSBpcyBhIGdsb2JhbCB0eXBlIGluIGJyb3dzZXJzIGFuZCBOb2RlLmpzIDIwKywgYnV0IFR5cGVTY3JpcHQnc1xuLy8gYGVzMjAyMmAgbGliIGRvZXNuJ3QgaW5jbHVkZSBpdC4gUmUtZXhwb3J0IGl0IGZyb20gdGhlIG5vZGU6Y3J5cHRvIHR5cGVzXG4vLyBzbyBjb25zdW1lcnMgY2FuIHJlZmVyZW5jZSBpdCB3aXRob3V0IGFkZGluZyBgZG9tYCBsaWIuXG5leHBvcnQgdHlwZSBDcnlwdG9LZXkgPSBpbXBvcnQoJ25vZGU6Y3J5cHRvJykud2ViY3J5cHRvLkNyeXB0b0tleTtcblxuLyoqIEFFUy1HQ00gbm9uY2UgbGVuZ3RoIGluIGJ5dGVzLiAqL1xuZXhwb3J0IGNvbnN0IE5PTkNFX0xFTkdUSCA9IDEyO1xuLyoqIEFFUy1HQ00gYXV0aGVudGljYXRpb24gdGFnIGxlbmd0aCBpbiBiaXRzLiAqL1xuZXhwb3J0IGNvbnN0IFRBR19MRU5HVEggPSAxMjg7XG4vKiogQUVTLUdDTSBhdXRoZW50aWNhdGlvbiB0YWcgbGVuZ3RoIGluIGJ5dGVzLiAqL1xuZXhwb3J0IGNvbnN0IFRBR19CWVRFUyA9IFRBR19MRU5HVEggLyA4O1xuY29uc3QgS0VZX0xFTkdUSCA9IDMyOyAvLyBieXRlcyAoQUVTLTI1NilcblxuLyoqXG4gKiBJbXBvcnQgYSByYXcgQUVTLTI1NiBrZXkgYXMgYSBgQ3J5cHRvS2V5YCBmb3IgdXNlIHdpdGggYGVuY3J5cHQoKWAvYGRlY3J5cHQoKWAuXG4gKlxuICogQ2FsbGVycyBzaG91bGQgY2FsbCB0aGlzIG9uY2UgcGVyIHJ1biAoYWZ0ZXIgYGdldEVuY3J5cHRpb25LZXlGb3JSdW4oKWApXG4gKiBhbmQgcGFzcyB0aGUgcmVzdWx0aW5nIGBDcnlwdG9LZXlgIHRvIGFsbCBzdWJzZXF1ZW50IGVuY3J5cHQvZGVjcnlwdCBjYWxscy5cbiAqXG4gKiBQYXNzIGB1c2FnZXM6IFsnZW5jcnlwdCddYCAob3IgYFsnZGVjcnlwdCddYCkgZm9yIGNyb3NzLXJ1biBzY2VuYXJpb3NcbiAqIHdoZXJlIHRoZSBjYWxsZXIgc2hvdWxkIG5vdCBiZSBhYmxlIHRvIHBlcmZvcm0gdGhlIGludmVyc2Ugb3BlcmF0aW9uXG4gKiB3aXRoIHRoZSBrZXkuIEZvciBleGFtcGxlLCBhIGNoaWxkIHdvcmtmbG93IHdyaXRpbmcgaW50byBhIHBhcmVudFxuICogcnVuJ3MgZm9yd2FyZGVkIFdyaXRhYmxlU3RyZWFtIG9ubHkgbmVlZHMgdG8gZW5jcnlwdCwgbmV2ZXIgZGVjcnlwdC5cbiAqXG4gKiBAcGFyYW0gcmF3IC0gUmF3IDMyLWJ5dGUgQUVTLTI1NiBrZXkgKGZyb20gV29ybGQuZ2V0RW5jcnlwdGlvbktleUZvclJ1bilcbiAqIEBwYXJhbSB1c2FnZXMgLSBLZXkgdXNhZ2VzLiBEZWZhdWx0cyB0byBgWydlbmNyeXB0JywgJ2RlY3J5cHQnXWAuXG4gKiBAcmV0dXJucyBDcnlwdG9LZXkgcmVhZHkgZm9yIEFFUy1HQ00gb3BlcmF0aW9uc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW1wb3J0S2V5KFxuICByYXc6IFVpbnQ4QXJyYXksXG4gIHVzYWdlczogUmVhZG9ubHlBcnJheTwnZW5jcnlwdCcgfCAnZGVjcnlwdCc+ID0gWydlbmNyeXB0JywgJ2RlY3J5cHQnXVxuKSB7XG4gIGlmIChyYXcuYnl0ZUxlbmd0aCAhPT0gS0VZX0xFTkdUSCkge1xuICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgIGBFbmNyeXB0aW9uIGtleSBtdXN0IGJlIGV4YWN0bHkgJHtLRVlfTEVOR1RIfSBieXRlcywgZ290ICR7cmF3LmJ5dGVMZW5ndGh9YFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGdsb2JhbFRoaXMuY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoXG4gICAgJ3JhdycsXG4gICAgcmF3LFxuICAgICdBRVMtR0NNJyxcbiAgICBmYWxzZSxcbiAgICAvLyBgS2V5VXNhZ2VgIGlzIGEgRE9NLWxpYiB0eXBlIHRoYXQncyBub3QgaW4gc2NvcGUgdW5kZXIgYGVzMjAyMmAuXG4gICAgLy8gVGhlIGBSZWFkb25seUFycmF5PCdlbmNyeXB0JyB8ICdkZWNyeXB0Jz5gIHBhcmFtZXRlciB0eXBlIG1hdGNoZXNcbiAgICAvLyBhIHN0cmljdCBzdWJzZXQgb2YgYEtleVVzYWdlW11gLCBzbyB0aGlzIGNhc3QgaXMgc291bmQuXG4gICAgdXNhZ2VzIGFzICgnZW5jcnlwdCcgfCAnZGVjcnlwdCcpW11cbiAgKTtcbn1cblxuLyoqXG4gKiBFbmNyeXB0IGRhdGEgdXNpbmcgQUVTLTI1Ni1HQ00uXG4gKlxuICogQHBhcmFtIGtleSAtIENyeXB0b0tleSBmcm9tIGBpbXBvcnRLZXkoKWBcbiAqIEBwYXJhbSBkYXRhIC0gUGxhaW50ZXh0IHRvIGVuY3J5cHRcbiAqIEBwYXJhbSBhYWQgLSBPcHRpb25hbCBhZGRpdGlvbmFsIGF1dGhlbnRpY2F0ZWQgZGF0YS4gTm90IGVuY3J5cHRlZCwgYnV0XG4gKiAgIGNvdmVyZWQgYnkgdGhlIEdDTSBhdXRoIHRhZzogZGVjcnlwdGlvbiBmYWlscyB1bmxlc3MgdGhlIGV4YWN0IHNhbWVcbiAqICAgYnl0ZXMgYXJlIHN1cHBsaWVkLiBVc2VkIGJ5IHRoZSBzZWFsZWQtYm94IGxheWVyIHRvIGJpbmQgY2lwaGVydGV4dCB0b1xuICogICBhIGBwcm9qZWN0SWR8cnVuSWRgIGNvbnRleHQuIE9taXQgZm9yIG5vIEFBRCAodGhlIGxlZ2FjeSBiZWhhdmlvcikuXG4gKiBAcmV0dXJucyBgW25vbmNlICgxMiBieXRlcyldW2NpcGhlcnRleHQgKyBHQ00gYXV0aCB0YWddYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5jcnlwdChcbiAga2V5OiBDcnlwdG9LZXksXG4gIGRhdGE6IFVpbnQ4QXJyYXksXG4gIGFhZD86IFVpbnQ4QXJyYXlcbik6IFByb21pc2U8VWludDhBcnJheT4ge1xuICBjb25zdCBub25jZSA9IGdsb2JhbFRoaXMuY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheShOT05DRV9MRU5HVEgpKTtcbiAgbGV0IGNpcGhlcnRleHQ6IEFycmF5QnVmZmVyO1xuICB0cnkge1xuICAgIGNpcGhlcnRleHQgPSBhd2FpdCBnbG9iYWxUaGlzLmNyeXB0by5zdWJ0bGUuZW5jcnlwdChcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ0FFUy1HQ00nLFxuICAgICAgICBpdjogbm9uY2UsXG4gICAgICAgIHRhZ0xlbmd0aDogVEFHX0xFTkdUSCxcbiAgICAgICAgLi4uKGFhZCA/IHsgYWRkaXRpb25hbERhdGE6IGFhZCB9IDoge30pLFxuICAgICAgfSxcbiAgICAgIGtleSxcbiAgICAgIGRhdGFcbiAgICApO1xuICB9IGNhdGNoIChjYXVzZSkge1xuICAgIC8vIFJlLXdyYXAgYW55IFdlYiBDcnlwdG8gZmFpbHVyZSAoRE9NRXhjZXB0aW9uIGV0Yy4pIGFzIGFcbiAgICAvLyBSdW50aW1lRGVjcnlwdGlvbkVycm9yLiBGYWlsdXJlcyBoZXJlIGFyZSByYXJlOiB0aGV5IGhhcHBlbiBlLmcuXG4gICAgLy8gd2hlbiBhIENyeXB0b0tleSB3YXMgaW1wb3J0ZWQgd2l0aCBgdXNhZ2VzOiBbJ2RlY3J5cHQnXWAgb25seS5cbiAgICB0aHJvdyBuZXcgUnVudGltZURlY3J5cHRpb25FcnJvcihcbiAgICAgIGBBRVMtMjU2LUdDTSBlbmNyeXB0aW9uIGZhaWxlZDogJHtjYXVzZSBpbnN0YW5jZW9mIEVycm9yID8gY2F1c2UubWVzc2FnZSA6IFN0cmluZyhjYXVzZSl9YCxcbiAgICAgIHtcbiAgICAgICAgY2F1c2UsXG4gICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICBvcGVyYXRpb246ICdlbmNyeXB0JyxcbiAgICAgICAgICBieXRlTGVuZ3RoOiBkYXRhLmJ5dGVMZW5ndGgsXG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgKTtcbiAgfVxuICBjb25zdCByZXN1bHQgPSBuZXcgVWludDhBcnJheShOT05DRV9MRU5HVEggKyBjaXBoZXJ0ZXh0LmJ5dGVMZW5ndGgpO1xuICByZXN1bHQuc2V0KG5vbmNlLCAwKTtcbiAgcmVzdWx0LnNldChuZXcgVWludDhBcnJheShjaXBoZXJ0ZXh0KSwgTk9OQ0VfTEVOR1RIKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBEZWNyeXB0IGRhdGEgdXNpbmcgQUVTLTI1Ni1HQ00uXG4gKlxuICogQW55IGZhaWx1cmUgaW5zaWRlIHRoZSBXZWIgQ3J5cHRvIGxheWVyIChtb3N0IGNvbW1vbmx5IGFuXG4gKiBgT3BlcmF0aW9uRXJyb3I6IFRoZSBvcGVyYXRpb24gZmFpbGVkIGZvciBhbiBvcGVyYXRpb24tc3BlY2lmaWMgcmVhc29uYFxuICogcmFpc2VkIGJ5IGBBRVNDaXBoZXJKb2Iub25Eb25lYCB3aGVuIHRoZSBHQ00gYXV0aGVudGljYXRpb24gdGFnIGRvZXNcbiAqIG5vdCB2ZXJpZnkpIGlzIHJld3JhcHBlZCBhcyB7QGxpbmsgUnVudGltZURlY3J5cHRpb25FcnJvcn0uIFRoZVxuICogd3JhcHBlZCBlcnJvciBjYXJyaWVzIHRoZSBvcmlnaW5hbCBET01FeGNlcHRpb24gYXMgYGNhdXNlYCwgcGx1cyBhXG4gKiBzbWFsbCBkaWFnbm9zdGljIGNvbnRleHQgKGBvcGVyYXRpb25gLCBpbnB1dCBgYnl0ZUxlbmd0aGApIHRvIGhlbHBcbiAqIGRpc2FtYmlndWF0ZSBjaXBoZXJ0ZXh0IGNvcnJ1cHRpb24gZnJvbSBrZXkgbWlzbWF0Y2ggZnJvbSB0cnVuY2F0ZWRcbiAqIHRyYW5zcG9ydCByZWFkcy5cbiAqXG4gKiBOb3RlOiBgZGF0YWAgaXMgdGhlIHJhdyBBRVMgcGF5bG9hZCAoYFtub25jZV1bY2lwaGVydGV4dCArIHRhZ11gKSwgbm90IGFcbiAqIGZvcm1hdC1wcmVmaXhlZCBlbnZlbG9wZTogY2FsbGVycyBzdHJpcCB0aGUgYGVuY3JgIG1hcmtlciB2aWFcbiAqIGBkZWNvZGVGb3JtYXRQcmVmaXgoKWAgYmVmb3JlIHJlYWNoaW5nIHRoaXMgZnVuY3Rpb24uIFRoZSBvdXRlclxuICogZW52ZWxvcGUncyBmb3JtYXQgcHJlZml4IGlzIHRoZXJlZm9yZSBhdHRhY2hlZCBieSB0aGUgc2VyaWFsaXphdGlvblxuICogbGF5ZXIgKGBzZXJpYWxpemF0aW9uL2VuY3J5cHRpb24udHNgKSwgd2hpY2ggaXMgdGhlIGxheWVyIHRoYXQgaGFzIGl0LlxuICpcbiAqIEBwYXJhbSBrZXkgLSBDcnlwdG9LZXkgZnJvbSBgaW1wb3J0S2V5KClgXG4gKiBAcGFyYW0gZGF0YSAtIGBbbm9uY2UgKDEyIGJ5dGVzKV1bY2lwaGVydGV4dCArIEdDTSBhdXRoIHRhZ11gXG4gKiBAcGFyYW0gYWFkIC0gT3B0aW9uYWwgYWRkaXRpb25hbCBhdXRoZW50aWNhdGVkIGRhdGEuIE11c3QgbWF0Y2ggdGhlIGJ5dGVzXG4gKiAgIHBhc3NlZCB0byB7QGxpbmsgZW5jcnlwdH0gZXhhY3RseSwgb3RoZXJ3aXNlIHRoZSBHQ00gdGFnIGZhaWxzIHRvIHZlcmlmeVxuICogICBhbmQgYSB7QGxpbmsgUnVudGltZURlY3J5cHRpb25FcnJvcn0gaXMgdGhyb3duLlxuICogQHJldHVybnMgRGVjcnlwdGVkIHBsYWludGV4dFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVjcnlwdChcbiAga2V5OiBDcnlwdG9LZXksXG4gIGRhdGE6IFVpbnQ4QXJyYXksXG4gIGFhZD86IFVpbnQ4QXJyYXlcbik6IFByb21pc2U8VWludDhBcnJheT4ge1xuICBjb25zdCBtaW5MZW5ndGggPSBOT05DRV9MRU5HVEggKyBUQUdfTEVOR1RIIC8gODsgLy8gbm9uY2UgKyBhdXRoIHRhZ1xuICBpZiAoZGF0YS5ieXRlTGVuZ3RoIDwgbWluTGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3IoXG4gICAgICBgRW5jcnlwdGVkIGRhdGEgdG9vIHNob3J0OiBleHBlY3RlZCBhdCBsZWFzdCAke21pbkxlbmd0aH0gYnl0ZXMsIGdvdCAke2RhdGEuYnl0ZUxlbmd0aH1gLFxuICAgICAge1xuICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgb3BlcmF0aW9uOiAnZGVjcnlwdCcsXG4gICAgICAgICAgYnl0ZUxlbmd0aDogZGF0YS5ieXRlTGVuZ3RoLFxuICAgICAgICB9LFxuICAgICAgfVxuICAgICk7XG4gIH1cbiAgY29uc3Qgbm9uY2UgPSBkYXRhLnN1YmFycmF5KDAsIE5PTkNFX0xFTkdUSCk7XG4gIGNvbnN0IGNpcGhlcnRleHQgPSBkYXRhLnN1YmFycmF5KE5PTkNFX0xFTkdUSCk7XG4gIGxldCBwbGFpbnRleHQ6IEFycmF5QnVmZmVyO1xuICB0cnkge1xuICAgIHBsYWludGV4dCA9IGF3YWl0IGdsb2JhbFRoaXMuY3J5cHRvLnN1YnRsZS5kZWNyeXB0KFxuICAgICAge1xuICAgICAgICBuYW1lOiAnQUVTLUdDTScsXG4gICAgICAgIGl2OiBub25jZSxcbiAgICAgICAgdGFnTGVuZ3RoOiBUQUdfTEVOR1RILFxuICAgICAgICAuLi4oYWFkID8geyBhZGRpdGlvbmFsRGF0YTogYWFkIH0gOiB7fSksXG4gICAgICB9LFxuICAgICAga2V5LFxuICAgICAgY2lwaGVydGV4dFxuICAgICk7XG4gIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgLy8gVGhlIG1vc3QgY29tbW9uIHNoYXBlIHdlIHNlZSBpbiB0aGUgd2lsZCBpcyBhIERPTUV4Y2VwdGlvbiB3aXRoXG4gICAgLy8gYG5hbWU6ICdPcGVyYXRpb25FcnJvcidgIGFuZCBtZXNzYWdlIFwiVGhlIG9wZXJhdGlvbiBmYWlsZWQgZm9yXG4gICAgLy8gYW4gb3BlcmF0aW9uLXNwZWNpZmljIHJlYXNvblwiLCB3aGljaCBpcyB3aGF0IFdlYiBDcnlwdG8gdGhyb3dzXG4gICAgLy8gd2hlbiB0aGUgR0NNIGF1dGggdGFnIGRvZXMgbm90IHZlcmlmeS4gUmUtdGhyb3cgYXNcbiAgICAvLyBSdW50aW1lRGVjcnlwdGlvbkVycm9yLCBhdHRhY2hpbmcgZGlhZ25vc3RpYyBjb250ZXh0IChieXRlIGxlbmd0aClcbiAgICAvLyB0aGF0IHRoZSBiYXJlIERPTUV4Y2VwdGlvbiBsYWNrcy5cbiAgICBjb25zdCBjYXVzZU1zZyA9IGNhdXNlIGluc3RhbmNlb2YgRXJyb3IgPyBjYXVzZS5tZXNzYWdlIDogU3RyaW5nKGNhdXNlKTtcbiAgICB0aHJvdyBuZXcgUnVudGltZURlY3J5cHRpb25FcnJvcihcbiAgICAgIGBBRVMtMjU2LUdDTSBkZWNyeXB0aW9uIGZhaWxlZDogJHtjYXVzZU1zZ31gLFxuICAgICAge1xuICAgICAgICBjYXVzZSxcbiAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgIG9wZXJhdGlvbjogJ2RlY3J5cHQnLFxuICAgICAgICAgIGJ5dGVMZW5ndGg6IGRhdGEuYnl0ZUxlbmd0aCxcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICApO1xuICB9XG4gIHJldHVybiBuZXcgVWludDhBcnJheShwbGFpbnRleHQpO1xufVxuIl19
|