@workflow/core 5.0.0-beta.4 → 5.0.0-beta.41
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/attribute-changes.d.ts +7 -0
- package/dist/attribute-changes.d.ts.map +1 -0
- package/dist/attribute-changes.js +25 -0
- package/dist/capabilities.d.ts +33 -1
- package/dist/capabilities.d.ts.map +1 -1
- package/dist/capabilities.js +71 -4
- package/dist/capture-stack.d.ts +16 -0
- package/dist/capture-stack.d.ts.map +1 -0
- package/dist/capture-stack.js +21 -0
- package/dist/class-serialization.d.ts +32 -0
- package/dist/class-serialization.d.ts.map +1 -1
- package/dist/class-serialization.js +37 -1
- package/dist/classify-error.d.ts +26 -3
- package/dist/classify-error.d.ts.map +1 -1
- package/dist/classify-error.js +109 -6
- package/dist/context-errors.d.ts +27 -0
- package/dist/context-errors.d.ts.map +1 -0
- package/dist/context-errors.js +101 -0
- package/dist/context-violation-error.d.ts +97 -0
- package/dist/context-violation-error.d.ts.map +1 -0
- package/dist/context-violation-error.js +149 -0
- package/dist/create-hook.d.ts +62 -4
- package/dist/create-hook.d.ts.map +1 -1
- package/dist/create-hook.js +4 -3
- package/dist/define-hook.d.ts.map +1 -1
- package/dist/define-hook.js +20 -5
- package/dist/describe-error.d.ts +70 -0
- package/dist/describe-error.d.ts.map +1 -0
- package/dist/describe-error.js +189 -0
- package/dist/encryption.d.ts +37 -3
- package/dist/encryption.d.ts.map +1 -1
- package/dist/encryption.js +97 -31
- package/dist/events-consumer.d.ts +147 -1
- package/dist/events-consumer.d.ts.map +1 -1
- package/dist/events-consumer.js +444 -43
- package/dist/flushable-stream.d.ts +65 -10
- package/dist/flushable-stream.d.ts.map +1 -1
- package/dist/flushable-stream.js +131 -18
- package/dist/global.d.ts +37 -1
- package/dist/global.d.ts.map +1 -1
- package/dist/global.js +21 -3
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/log-format.d.ts +25 -0
- package/dist/log-format.d.ts.map +1 -0
- package/dist/log-format.js +250 -0
- package/dist/logger.d.ts +29 -30
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +82 -32
- package/dist/private.d.ts +246 -8
- package/dist/private.d.ts.map +1 -1
- package/dist/private.js +345 -9
- package/dist/replay-payload-cache.d.ts +68 -0
- package/dist/replay-payload-cache.d.ts.map +1 -0
- package/dist/replay-payload-cache.js +160 -0
- package/dist/runtime/compute-instance.d.ts +12 -0
- package/dist/runtime/compute-instance.d.ts.map +1 -0
- package/dist/runtime/compute-instance.js +13 -0
- package/dist/runtime/constants.d.ts +251 -0
- package/dist/runtime/constants.d.ts.map +1 -1
- package/dist/runtime/constants.js +425 -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 +25 -0
- package/dist/runtime/get-port-lazy.d.ts.map +1 -0
- package/dist/runtime/get-port-lazy.js +92 -0
- package/dist/runtime/get-world-lazy.d.ts +23 -0
- package/dist/runtime/get-world-lazy.d.ts.map +1 -0
- package/dist/runtime/get-world-lazy.js +46 -0
- package/dist/runtime/helpers.d.ts +327 -10
- package/dist/runtime/helpers.d.ts.map +1 -1
- package/dist/runtime/helpers.js +586 -40
- 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 +124 -0
- package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -0
- package/dist/runtime/quickjs-entrypoint.js +1437 -0
- package/dist/runtime/quickjs-runtime.d.ts +228 -0
- package/dist/runtime/quickjs-runtime.d.ts.map +1 -0
- package/dist/runtime/quickjs-runtime.js +2372 -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 +2098 -0
- package/dist/runtime/replay-budget.d.ts +89 -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 +27 -4
- package/dist/runtime/resume-hook.d.ts.map +1 -1
- package/dist/runtime/resume-hook.js +452 -76
- 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 +8 -2
- package/dist/runtime/run.d.ts.map +1 -1
- package/dist/runtime/run.js +62 -15
- package/dist/runtime/runs.d.ts +54 -3
- package/dist/runtime/runs.d.ts.map +1 -1
- package/dist/runtime/runs.js +119 -13
- package/dist/runtime/start.d.ts +70 -1
- package/dist/runtime/start.d.ts.map +1 -1
- package/dist/runtime/start.js +313 -60
- package/dist/runtime/step-executor.d.ts +177 -0
- package/dist/runtime/step-executor.d.ts.map +1 -0
- package/dist/runtime/step-executor.js +946 -0
- package/dist/runtime/step-latency.d.ts +197 -0
- package/dist/runtime/step-latency.d.ts.map +1 -0
- package/dist/runtime/step-latency.js +207 -0
- package/dist/runtime/step-ownership.d.ts +72 -0
- package/dist/runtime/step-ownership.d.ts.map +1 -0
- package/dist/runtime/step-ownership.js +114 -0
- package/dist/runtime/step-single-flight.d.ts +12 -0
- package/dist/runtime/step-single-flight.d.ts.map +1 -0
- package/dist/runtime/step-single-flight.js +69 -0
- package/dist/runtime/suspension-handler.d.ts +109 -7
- package/dist/runtime/suspension-handler.d.ts.map +1 -1
- package/dist/runtime/suspension-handler.js +486 -140
- 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 +84 -0
- package/dist/runtime/wait-continuation.d.ts.map +1 -0
- package/dist/runtime/wait-continuation.js +105 -0
- package/dist/runtime/wait-until.d.ts +18 -0
- package/dist/runtime/wait-until.d.ts.map +1 -0
- package/dist/runtime/wait-until.js +42 -0
- package/dist/runtime/world-compatibility.d.ts +20 -0
- package/dist/runtime/world-compatibility.d.ts.map +1 -0
- package/dist/runtime/world-compatibility.js +32 -0
- package/dist/runtime/world-init.d.ts +50 -0
- package/dist/runtime/world-init.d.ts.map +1 -0
- package/dist/runtime/world-init.js +50 -0
- package/dist/runtime/world.d.ts +14 -2
- package/dist/runtime/world.d.ts.map +1 -1
- package/dist/runtime/world.js +101 -26
- package/dist/runtime.d.ts +17 -12
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +3135 -328
- package/dist/schemas.d.ts +1 -1
- package/dist/schemas.d.ts.map +1 -1
- package/dist/schemas.js +1 -1
- 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 +17 -0
- package/dist/serialization/client.d.ts.map +1 -0
- package/dist/serialization/client.js +48 -0
- 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 +14 -0
- package/dist/serialization/codec-devalue.d.ts.map +1 -0
- package/dist/serialization/codec-devalue.js +105 -0
- package/dist/serialization/codec.d.ts +125 -0
- package/dist/serialization/codec.d.ts.map +1 -0
- package/dist/serialization/codec.js +17 -0
- package/dist/serialization/compression.d.ts +104 -0
- package/dist/serialization/compression.d.ts.map +1 -0
- package/dist/serialization/compression.js +260 -0
- package/dist/serialization/encryption.d.ts +134 -0
- package/dist/serialization/encryption.d.ts.map +1 -0
- package/dist/serialization/encryption.js +186 -0
- package/dist/serialization/errors.d.ts +34 -0
- package/dist/serialization/errors.d.ts.map +1 -0
- package/dist/serialization/errors.js +59 -0
- package/dist/serialization/format.d.ts +60 -0
- package/dist/serialization/format.d.ts.map +1 -0
- package/dist/serialization/format.js +97 -0
- package/dist/serialization/hardened.d.ts +155 -0
- package/dist/serialization/hardened.d.ts.map +1 -0
- package/dist/serialization/hardened.js +523 -0
- package/dist/serialization/index.d.ts +20 -0
- package/dist/serialization/index.d.ts.map +1 -0
- package/dist/serialization/index.js +22 -0
- 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 +11 -0
- package/dist/serialization/reducers/class.d.ts.map +1 -0
- package/dist/serialization/reducers/class.js +73 -0
- 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 +579 -0
- package/dist/serialization/reducers/common.d.ts +16 -0
- package/dist/serialization/reducers/common.d.ts.map +1 -0
- package/dist/serialization/reducers/common.js +478 -0
- 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 +35 -0
- package/dist/serialization/reducers/step-function.d.ts.map +1 -0
- package/dist/serialization/reducers/step-function.js +104 -0
- package/dist/serialization/step.d.ts +17 -0
- package/dist/serialization/step.d.ts.map +1 -0
- package/dist/serialization/step.js +48 -0
- package/dist/serialization/types.d.ts +273 -0
- package/dist/serialization/types.d.ts.map +1 -0
- package/dist/serialization/types.js +35 -0
- 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 +71 -0
- package/dist/serialization/workflow.d.ts +29 -0
- package/dist/serialization/workflow.d.ts.map +1 -0
- package/dist/serialization/workflow.js +54 -0
- package/dist/serialization-format.d.ts +60 -4
- package/dist/serialization-format.d.ts.map +1 -1
- package/dist/serialization-format.js +276 -56
- package/dist/serialization.d.ts +374 -221
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +2300 -783
- 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/sleep.d.ts.map +1 -1
- package/dist/sleep.js +3 -2
- package/dist/source-map.d.ts +25 -0
- package/dist/source-map.d.ts.map +1 -1
- package/dist/source-map.js +148 -10
- package/dist/step/context-storage.d.ts +61 -2
- package/dist/step/context-storage.d.ts.map +1 -1
- package/dist/step/context-storage.js +7 -5
- package/dist/step/get-closure-vars.d.ts.map +1 -1
- package/dist/step/get-closure-vars.js +3 -2
- package/dist/step/get-step-metadata.d.ts.map +1 -1
- package/dist/step/get-step-metadata.js +3 -2
- package/dist/step/get-workflow-metadata.d.ts.map +1 -1
- package/dist/step/get-workflow-metadata.js +3 -2
- package/dist/step/writable-stream.d.ts.map +1 -1
- package/dist/step/writable-stream.js +71 -7
- package/dist/step.d.ts.map +1 -1
- package/dist/step.js +225 -29
- package/dist/symbols.d.ts +54 -0
- package/dist/symbols.d.ts.map +1 -1
- package/dist/symbols.js +55 -1
- package/dist/telemetry/semantic-conventions.d.ts +265 -2
- package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
- package/dist/telemetry/semantic-conventions.js +190 -1
- package/dist/telemetry.d.ts +73 -0
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +153 -16
- package/dist/types.d.ts +6 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +23 -1
- package/dist/util.d.ts +16 -6
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +25 -16
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +2 -2
- package/dist/vm/index.d.ts.map +1 -1
- package/dist/vm/index.js +85 -14
- package/dist/vm/script-cache.d.ts +28 -0
- package/dist/vm/script-cache.d.ts.map +1 -0
- package/dist/vm/script-cache.js +140 -0
- package/dist/workflow/abort-controller.d.ts +65 -0
- package/dist/workflow/abort-controller.d.ts.map +1 -0
- package/dist/workflow/abort-controller.js +312 -0
- package/dist/workflow/attribute-dispatcher.d.ts +6 -0
- package/dist/workflow/attribute-dispatcher.d.ts.map +1 -0
- package/dist/workflow/attribute-dispatcher.js +48 -0
- package/dist/workflow/create-hook.d.ts.map +1 -1
- package/dist/workflow/create-hook.js +25 -3
- package/dist/workflow/define-hook.d.ts +1 -1
- package/dist/workflow/define-hook.d.ts.map +1 -1
- package/dist/workflow/define-hook.js +8 -4
- package/dist/workflow/get-workflow-metadata.d.ts.map +1 -1
- package/dist/workflow/get-workflow-metadata.js +14 -3
- package/dist/workflow/hook.d.ts.map +1 -1
- package/dist/workflow/hook.js +302 -36
- package/dist/workflow/index.d.ts +1 -0
- package/dist/workflow/index.d.ts.map +1 -1
- package/dist/workflow/index.js +5 -3
- package/dist/workflow/set-attributes.d.ts +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 +57 -8
- package/dist/workflow/world-init-stub.d.ts +15 -0
- package/dist/workflow/world-init-stub.d.ts.map +1 -0
- package/dist/workflow/world-init-stub.js +15 -0
- package/dist/workflow.d.ts +79 -3
- package/dist/workflow.d.ts.map +1 -1
- package/dist/workflow.js +831 -553
- package/docs/api-reference/create-hook.mdx +79 -0
- package/docs/api-reference/create-webhook.mdx +1 -0
- package/docs/api-reference/define-hook.mdx +26 -24
- package/docs/api-reference/fatal-error.mdx +29 -7
- package/docs/api-reference/fetch.mdx +8 -4
- package/docs/api-reference/index.mdx +3 -0
- package/docs/api-reference/set-attributes.mdx +61 -0
- package/docs/api-reference/sleep.mdx +1 -1
- package/docs/foundations/cancellation.mdx +459 -0
- package/docs/foundations/errors-and-retries.mdx +7 -3
- package/docs/foundations/hooks.mdx +29 -0
- package/docs/foundations/idempotency.mdx +243 -11
- package/docs/foundations/index.mdx +1 -23
- package/docs/foundations/meta.json +3 -1
- package/docs/foundations/serialization.mdx +77 -41
- package/docs/foundations/starting-workflows.mdx +79 -2
- package/docs/foundations/streaming.mdx +14 -23
- package/docs/foundations/versioning.mdx +263 -0
- package/docs/how-it-works/cancellation.mdx +287 -0
- package/docs/how-it-works/code-transform.mdx +21 -17
- package/docs/how-it-works/encryption.mdx +5 -5
- package/docs/how-it-works/event-sourcing.mdx +17 -9
- package/docs/how-it-works/framework-integrations.mdx +96 -337
- package/docs/how-it-works/meta.json +2 -1
- package/package.json +31 -13
- 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 -678
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client (external) mode serialization.
|
|
3
|
+
*
|
|
4
|
+
* Used when starting workflows from the client side (serializing workflow
|
|
5
|
+
* arguments) and when receiving workflow return values. Supports encryption.
|
|
6
|
+
*/
|
|
7
|
+
import type { CodecOptions } from './codec.js';
|
|
8
|
+
import { type PayloadKey } from './encryption.js';
|
|
9
|
+
/**
|
|
10
|
+
* Serialize a value from the client environment (e.g. workflow arguments).
|
|
11
|
+
*/
|
|
12
|
+
export declare function serialize(value: unknown, encryptionKey?: PayloadKey, options?: CodecOptions): Promise<Uint8Array | unknown>;
|
|
13
|
+
/**
|
|
14
|
+
* Deserialize a value for the client environment (e.g. workflow return value).
|
|
15
|
+
*/
|
|
16
|
+
export declare function deserialize(data: Uint8Array | unknown, encryptionKey?: PayloadKey, options?: CodecOptions): Promise<unknown>;
|
|
17
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/serialization/client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C,OAAO,EAGL,KAAK,UAAU,EAChB,MAAM,iBAAiB,CAAC;AAKzB;;GAEG;AACH,wBAAsB,SAAS,CAC7B,KAAK,EAAE,OAAO,EACd,aAAa,CAAC,EAAE,UAAU,EAC1B,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,UAAU,GAAG,OAAO,CAAC,CAmB/B;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,UAAU,GAAG,OAAO,EAC1B,aAAa,CAAC,EAAE,UAAU,EAC1B,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,OAAO,CAAC,CAsBlB"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client (external) mode serialization.
|
|
3
|
+
*
|
|
4
|
+
* Used when starting workflows from the client side (serializing workflow
|
|
5
|
+
* arguments) and when receiving workflow return values. Supports encryption.
|
|
6
|
+
*/
|
|
7
|
+
import { SerializationError } from '@workflow/errors';
|
|
8
|
+
import { devalueCodec } from './codec-devalue.js';
|
|
9
|
+
import { compress, decompress } from './compression.js';
|
|
10
|
+
import { decrypt as decryptData, encrypt as encryptData, } from './encryption.js';
|
|
11
|
+
import { formatSerializationError, rethrowIfRuntimeError } from './errors.js';
|
|
12
|
+
import { decodeFormatPrefix, encodeWithFormatPrefix } from './format.js';
|
|
13
|
+
import { SerializationFormat } from './types.js';
|
|
14
|
+
/**
|
|
15
|
+
* Serialize a value from the client environment (e.g. workflow arguments).
|
|
16
|
+
*/
|
|
17
|
+
export async function serialize(value, encryptionKey, options) {
|
|
18
|
+
try {
|
|
19
|
+
const payload = devalueCodec.serialize(value, 'client', options);
|
|
20
|
+
const prefixed = encodeWithFormatPrefix(SerializationFormat.DEVALUE_V1, payload);
|
|
21
|
+
// Compress before encrypting — encrypted bytes don't compress.
|
|
22
|
+
const compressed = await compress(prefixed, options?.compression === true, options?.compressionStats);
|
|
23
|
+
return encryptData(compressed, encryptionKey);
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
rethrowIfRuntimeError(error);
|
|
27
|
+
const { message, hint } = formatSerializationError('client value', error);
|
|
28
|
+
throw new SerializationError(message, { hint, cause: error });
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Deserialize a value for the client environment (e.g. workflow return value).
|
|
33
|
+
*/
|
|
34
|
+
export async function deserialize(data, encryptionKey, options) {
|
|
35
|
+
const decrypted = await decompress(await decryptData(data, encryptionKey), options?.compressionStats);
|
|
36
|
+
if (!(decrypted instanceof Uint8Array)) {
|
|
37
|
+
if (devalueCodec.deserializeLegacy) {
|
|
38
|
+
return devalueCodec.deserializeLegacy(decrypted, 'client', options);
|
|
39
|
+
}
|
|
40
|
+
throw new Error('Cannot deserialize non-binary data without legacy support');
|
|
41
|
+
}
|
|
42
|
+
const { format, payload } = decodeFormatPrefix(decrypted);
|
|
43
|
+
if (format === SerializationFormat.DEVALUE_V1) {
|
|
44
|
+
return devalueCodec.deserialize(payload, 'client', options);
|
|
45
|
+
}
|
|
46
|
+
throw new Error(`Unsupported serialization format: ${format}`);
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcmlhbGl6YXRpb24vY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBRUgsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFdEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDeEQsT0FBTyxFQUNMLE9BQU8sSUFBSSxXQUFXLEVBQ3RCLE9BQU8sSUFBSSxXQUFXLEdBRXZCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLHdCQUF3QixFQUFFLHFCQUFxQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzlFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN6RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFakQ7O0dBRUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLFNBQVMsQ0FDN0IsS0FBYyxFQUNkLGFBQTBCLEVBQzFCLE9BQXNCO0lBRXRCLElBQUksQ0FBQztRQUNILE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNqRSxNQUFNLFFBQVEsR0FBRyxzQkFBc0IsQ0FDckMsbUJBQW1CLENBQUMsVUFBVSxFQUM5QixPQUFPLENBQ00sQ0FBQztRQUNoQiwrREFBK0Q7UUFDL0QsTUFBTSxVQUFVLEdBQUcsTUFBTSxRQUFRLENBQy9CLFFBQVEsRUFDUixPQUFPLEVBQUUsV0FBVyxLQUFLLElBQUksRUFDN0IsT0FBTyxFQUFFLGdCQUFnQixDQUMxQixDQUFDO1FBQ0YsT0FBTyxXQUFXLENBQUMsVUFBVSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0IsTUFBTSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyx3QkFBd0IsQ0FBQyxjQUFjLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDMUUsTUFBTSxJQUFJLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUNoRSxDQUFDO0FBQ0gsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxXQUFXLENBQy9CLElBQTBCLEVBQzFCLGFBQTBCLEVBQzFCLE9BQXNCO0lBRXRCLE1BQU0sU0FBUyxHQUFHLE1BQU0sVUFBVSxDQUNoQyxNQUFNLFdBQVcsQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLEVBQ3RDLE9BQU8sRUFBRSxnQkFBZ0IsQ0FDMUIsQ0FBQztJQUVGLElBQUksQ0FBQyxDQUFDLFNBQVMsWUFBWSxVQUFVLENBQUMsRUFBRSxDQUFDO1FBQ3ZDLElBQUksWUFBWSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDbkMsT0FBTyxZQUFZLENBQUMsaUJBQWlCLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN0RSxDQUFDO1FBQ0QsTUFBTSxJQUFJLEtBQUssQ0FDYiwyREFBMkQsQ0FDNUQsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBRTFELElBQUksTUFBTSxLQUFLLG1CQUFtQixDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzlDLE9BQU8sWUFBWSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFRCxNQUFNLElBQUksS0FBSyxDQUFDLHFDQUFxQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBQ2pFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENsaWVudCAoZXh0ZXJuYWwpIG1vZGUgc2VyaWFsaXphdGlvbi5cbiAqXG4gKiBVc2VkIHdoZW4gc3RhcnRpbmcgd29ya2Zsb3dzIGZyb20gdGhlIGNsaWVudCBzaWRlIChzZXJpYWxpemluZyB3b3JrZmxvd1xuICogYXJndW1lbnRzKSBhbmQgd2hlbiByZWNlaXZpbmcgd29ya2Zsb3cgcmV0dXJuIHZhbHVlcy4gU3VwcG9ydHMgZW5jcnlwdGlvbi5cbiAqL1xuXG5pbXBvcnQgeyBTZXJpYWxpemF0aW9uRXJyb3IgfSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB0eXBlIHsgQ29kZWNPcHRpb25zIH0gZnJvbSAnLi9jb2RlYy5qcyc7XG5pbXBvcnQgeyBkZXZhbHVlQ29kZWMgfSBmcm9tICcuL2NvZGVjLWRldmFsdWUuanMnO1xuaW1wb3J0IHsgY29tcHJlc3MsIGRlY29tcHJlc3MgfSBmcm9tICcuL2NvbXByZXNzaW9uLmpzJztcbmltcG9ydCB7XG4gIGRlY3J5cHQgYXMgZGVjcnlwdERhdGEsXG4gIGVuY3J5cHQgYXMgZW5jcnlwdERhdGEsXG4gIHR5cGUgUGF5bG9hZEtleSxcbn0gZnJvbSAnLi9lbmNyeXB0aW9uLmpzJztcbmltcG9ydCB7IGZvcm1hdFNlcmlhbGl6YXRpb25FcnJvciwgcmV0aHJvd0lmUnVudGltZUVycm9yIH0gZnJvbSAnLi9lcnJvcnMuanMnO1xuaW1wb3J0IHsgZGVjb2RlRm9ybWF0UHJlZml4LCBlbmNvZGVXaXRoRm9ybWF0UHJlZml4IH0gZnJvbSAnLi9mb3JtYXQuanMnO1xuaW1wb3J0IHsgU2VyaWFsaXphdGlvbkZvcm1hdCB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vKipcbiAqIFNlcmlhbGl6ZSBhIHZhbHVlIGZyb20gdGhlIGNsaWVudCBlbnZpcm9ubWVudCAoZS5nLiB3b3JrZmxvdyBhcmd1bWVudHMpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VyaWFsaXplKFxuICB2YWx1ZTogdW5rbm93bixcbiAgZW5jcnlwdGlvbktleT86IFBheWxvYWRLZXksXG4gIG9wdGlvbnM/OiBDb2RlY09wdGlvbnNcbik6IFByb21pc2U8VWludDhBcnJheSB8IHVua25vd24+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXlsb2FkID0gZGV2YWx1ZUNvZGVjLnNlcmlhbGl6ZSh2YWx1ZSwgJ2NsaWVudCcsIG9wdGlvbnMpO1xuICAgIGNvbnN0IHByZWZpeGVkID0gZW5jb2RlV2l0aEZvcm1hdFByZWZpeChcbiAgICAgIFNlcmlhbGl6YXRpb25Gb3JtYXQuREVWQUxVRV9WMSxcbiAgICAgIHBheWxvYWRcbiAgICApIGFzIFVpbnQ4QXJyYXk7XG4gICAgLy8gQ29tcHJlc3MgYmVmb3JlIGVuY3J5cHRpbmcg4oCUIGVuY3J5cHRlZCBieXRlcyBkb24ndCBjb21wcmVzcy5cbiAgICBjb25zdCBjb21wcmVzc2VkID0gYXdhaXQgY29tcHJlc3MoXG4gICAgICBwcmVmaXhlZCxcbiAgICAgIG9wdGlvbnM/LmNvbXByZXNzaW9uID09PSB0cnVlLFxuICAgICAgb3B0aW9ucz8uY29tcHJlc3Npb25TdGF0c1xuICAgICk7XG4gICAgcmV0dXJuIGVuY3J5cHREYXRhKGNvbXByZXNzZWQsIGVuY3J5cHRpb25LZXkpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldGhyb3dJZlJ1bnRpbWVFcnJvcihlcnJvcik7XG4gICAgY29uc3QgeyBtZXNzYWdlLCBoaW50IH0gPSBmb3JtYXRTZXJpYWxpemF0aW9uRXJyb3IoJ2NsaWVudCB2YWx1ZScsIGVycm9yKTtcbiAgICB0aHJvdyBuZXcgU2VyaWFsaXphdGlvbkVycm9yKG1lc3NhZ2UsIHsgaGludCwgY2F1c2U6IGVycm9yIH0pO1xuICB9XG59XG5cbi8qKlxuICogRGVzZXJpYWxpemUgYSB2YWx1ZSBmb3IgdGhlIGNsaWVudCBlbnZpcm9ubWVudCAoZS5nLiB3b3JrZmxvdyByZXR1cm4gdmFsdWUpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVzZXJpYWxpemUoXG4gIGRhdGE6IFVpbnQ4QXJyYXkgfCB1bmtub3duLFxuICBlbmNyeXB0aW9uS2V5PzogUGF5bG9hZEtleSxcbiAgb3B0aW9ucz86IENvZGVjT3B0aW9uc1xuKTogUHJvbWlzZTx1bmtub3duPiB7XG4gIGNvbnN0IGRlY3J5cHRlZCA9IGF3YWl0IGRlY29tcHJlc3MoXG4gICAgYXdhaXQgZGVjcnlwdERhdGEoZGF0YSwgZW5jcnlwdGlvbktleSksXG4gICAgb3B0aW9ucz8uY29tcHJlc3Npb25TdGF0c1xuICApO1xuXG4gIGlmICghKGRlY3J5cHRlZCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSB7XG4gICAgaWYgKGRldmFsdWVDb2RlYy5kZXNlcmlhbGl6ZUxlZ2FjeSkge1xuICAgICAgcmV0dXJuIGRldmFsdWVDb2RlYy5kZXNlcmlhbGl6ZUxlZ2FjeShkZWNyeXB0ZWQsICdjbGllbnQnLCBvcHRpb25zKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ0Nhbm5vdCBkZXNlcmlhbGl6ZSBub24tYmluYXJ5IGRhdGEgd2l0aG91dCBsZWdhY3kgc3VwcG9ydCdcbiAgICApO1xuICB9XG5cbiAgY29uc3QgeyBmb3JtYXQsIHBheWxvYWQgfSA9IGRlY29kZUZvcm1hdFByZWZpeChkZWNyeXB0ZWQpO1xuXG4gIGlmIChmb3JtYXQgPT09IFNlcmlhbGl6YXRpb25Gb3JtYXQuREVWQUxVRV9WMSkge1xuICAgIHJldHVybiBkZXZhbHVlQ29kZWMuZGVzZXJpYWxpemUocGF5bG9hZCwgJ2NsaWVudCcsIG9wdGlvbnMpO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBzZXJpYWxpemF0aW9uIGZvcm1hdDogJHtmb3JtYXR9YCk7XG59XG4iXX0=
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VM-compatible devalue codec.
|
|
3
|
+
*
|
|
4
|
+
* Same as codec-devalue.ts but uses VM-compatible reducers/revivers
|
|
5
|
+
* (no Node.js Buffer, no node:util). Safe to bundle into the QuickJS VM.
|
|
6
|
+
*/
|
|
7
|
+
import type { Codec } from './codec.js';
|
|
8
|
+
/**
|
|
9
|
+
* The workflow-mode reducer/reviver key sets — exported for the QuickJS
|
|
10
|
+
* host serde's exhaustiveness test (quickjs-serde.test.ts), which pins
|
|
11
|
+
* that the handle-space codec implements exactly these.
|
|
12
|
+
*/
|
|
13
|
+
export declare function getWorkflowModeReducerKeys(): string[];
|
|
14
|
+
export declare function getWorkflowModeReviverKeys(): string[];
|
|
15
|
+
export declare const devalueVmCodec: Codec;
|
|
16
|
+
//# sourceMappingURL=codec-devalue-vm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codec-devalue-vm.d.ts","sourceRoot":"","sources":["../../src/serialization/codec-devalue-vm.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,KAAK,EAAqB,MAAM,YAAY,CAAC;AAyI3D;;;;GAIG;AACH,wBAAgB,0BAA0B,IAAI,MAAM,EAAE,CAErD;AACD,wBAAgB,0BAA0B,IAAI,MAAM,EAAE,CAErD;AAED,eAAO,MAAM,cAAc,EAAE,KAyB5B,CAAC"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VM-compatible devalue codec.
|
|
3
|
+
*
|
|
4
|
+
* Same as codec-devalue.ts but uses VM-compatible reducers/revivers
|
|
5
|
+
* (no Node.js Buffer, no node:util). Safe to bundle into the QuickJS VM.
|
|
6
|
+
*/
|
|
7
|
+
import { parse, stringify, unflatten } from 'devalue';
|
|
8
|
+
import { getClassReducers, getClassRevivers } from './reducers/class-vm.js';
|
|
9
|
+
import { getCommonReducers, getCommonRevivers } from './reducers/common-vm.js';
|
|
10
|
+
import { getStepFunctionReducer, getStepFunctionReviver, } from './reducers/step-function-vm.js';
|
|
11
|
+
import { SerializationFormat } from './types.js';
|
|
12
|
+
const encoder = new TextEncoder();
|
|
13
|
+
const decoder = new TextDecoder();
|
|
14
|
+
// ---- AbortController / AbortSignal (workflow VM context) ----
|
|
15
|
+
// Mirrors the node:vm engine's workflow-context abort reducers/revivers in
|
|
16
|
+
// serialization.ts: reduce by reading the stream/hook symbols stamped at
|
|
17
|
+
// controller construction; revive to the bootstrap's WorkflowAbortSignal
|
|
18
|
+
// class (looked up lazily on globalThis — the serde bundle is evaluated
|
|
19
|
+
// before the bootstrap defines it).
|
|
20
|
+
const ABORT_STREAM_NAME = Symbol.for('WORKFLOW_ABORT_STREAM_NAME');
|
|
21
|
+
const ABORT_HOOK_TOKEN = Symbol.for('WORKFLOW_ABORT_HOOK_TOKEN');
|
|
22
|
+
function reduceAbortBySymbol(signal, holder) {
|
|
23
|
+
const streamName = holder[ABORT_STREAM_NAME] ?? holder.signal?.[ABORT_STREAM_NAME];
|
|
24
|
+
const hookToken = holder[ABORT_HOOK_TOKEN] ?? holder.signal?.[ABORT_HOOK_TOKEN];
|
|
25
|
+
if (!streamName) {
|
|
26
|
+
throw new Error('AbortController/AbortSignal stream name is not set');
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
streamName,
|
|
30
|
+
hookToken,
|
|
31
|
+
aborted: signal.aborted,
|
|
32
|
+
reason: signal.aborted ? signal.reason : undefined,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
function reviveAbortSignalVM(value) {
|
|
36
|
+
const Cls = globalThis.__WorkflowAbortSignal;
|
|
37
|
+
if (typeof Cls !== 'function') {
|
|
38
|
+
throw new Error('WorkflowAbortSignal is not registered in the VM (bootstrap not evaluated)');
|
|
39
|
+
}
|
|
40
|
+
const signal = new Cls(value.streamName, value.hookToken);
|
|
41
|
+
if (value.aborted)
|
|
42
|
+
signal._setAborted(value.reason);
|
|
43
|
+
return signal;
|
|
44
|
+
}
|
|
45
|
+
function getAbortReducersVM() {
|
|
46
|
+
return {
|
|
47
|
+
AbortController: (value) => {
|
|
48
|
+
if (!value || typeof value !== 'object' || !value.signal)
|
|
49
|
+
return false;
|
|
50
|
+
const hasAbortSymbol = value[ABORT_STREAM_NAME] ?? value.signal?.[ABORT_STREAM_NAME];
|
|
51
|
+
if (hasAbortSymbol === undefined)
|
|
52
|
+
return false;
|
|
53
|
+
return reduceAbortBySymbol(value.signal, value);
|
|
54
|
+
},
|
|
55
|
+
AbortSignal: (value) => {
|
|
56
|
+
if (!value || typeof value !== 'object')
|
|
57
|
+
return false;
|
|
58
|
+
if (value[ABORT_STREAM_NAME] === undefined)
|
|
59
|
+
return false;
|
|
60
|
+
return reduceAbortBySymbol(value, value);
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
function getAbortReviversVM() {
|
|
65
|
+
return {
|
|
66
|
+
AbortController: (value) => ({
|
|
67
|
+
[ABORT_STREAM_NAME]: value.streamName,
|
|
68
|
+
[ABORT_HOOK_TOKEN]: value.hookToken,
|
|
69
|
+
signal: reviveAbortSignalVM(value),
|
|
70
|
+
abort: () => { },
|
|
71
|
+
}),
|
|
72
|
+
AbortSignal: (value) => reviveAbortSignalVM(value),
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
function getReducersForMode(mode) {
|
|
76
|
+
switch (mode) {
|
|
77
|
+
case 'workflow':
|
|
78
|
+
return {
|
|
79
|
+
...getAbortReducersVM(),
|
|
80
|
+
...getClassReducers(),
|
|
81
|
+
...getStepFunctionReducer(),
|
|
82
|
+
...getCommonReducers(),
|
|
83
|
+
};
|
|
84
|
+
case 'step':
|
|
85
|
+
return {
|
|
86
|
+
...getClassReducers(),
|
|
87
|
+
...getCommonReducers(),
|
|
88
|
+
};
|
|
89
|
+
case 'client':
|
|
90
|
+
return {
|
|
91
|
+
...getClassReducers(),
|
|
92
|
+
...getCommonReducers(),
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
function getReviversForMode(mode) {
|
|
97
|
+
switch (mode) {
|
|
98
|
+
case 'workflow':
|
|
99
|
+
return {
|
|
100
|
+
...getAbortReviversVM(),
|
|
101
|
+
...getClassRevivers(),
|
|
102
|
+
...getStepFunctionReviver(),
|
|
103
|
+
...getCommonRevivers(),
|
|
104
|
+
};
|
|
105
|
+
case 'step':
|
|
106
|
+
return {
|
|
107
|
+
...getClassRevivers(),
|
|
108
|
+
...getCommonRevivers(),
|
|
109
|
+
};
|
|
110
|
+
case 'client':
|
|
111
|
+
return {
|
|
112
|
+
...getClassRevivers(),
|
|
113
|
+
...getCommonRevivers(),
|
|
114
|
+
StepFunction: () => {
|
|
115
|
+
throw new Error('Step functions cannot be deserialized in client context.');
|
|
116
|
+
},
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* The workflow-mode reducer/reviver key sets — exported for the QuickJS
|
|
122
|
+
* host serde's exhaustiveness test (quickjs-serde.test.ts), which pins
|
|
123
|
+
* that the handle-space codec implements exactly these.
|
|
124
|
+
*/
|
|
125
|
+
export function getWorkflowModeReducerKeys() {
|
|
126
|
+
return Object.keys(getReducersForMode('workflow'));
|
|
127
|
+
}
|
|
128
|
+
export function getWorkflowModeReviverKeys() {
|
|
129
|
+
return Object.keys(getReviversForMode('workflow'));
|
|
130
|
+
}
|
|
131
|
+
export const devalueVmCodec = {
|
|
132
|
+
formatPrefix: SerializationFormat.DEVALUE_V1,
|
|
133
|
+
serialize(value, mode) {
|
|
134
|
+
const reducers = getReducersForMode(mode);
|
|
135
|
+
const str = stringify(value, reducers);
|
|
136
|
+
return encoder.encode(str);
|
|
137
|
+
},
|
|
138
|
+
deserialize(data, mode) {
|
|
139
|
+
const revivers = getReviversForMode(mode);
|
|
140
|
+
const str = decoder.decode(data);
|
|
141
|
+
return parse(str, revivers);
|
|
142
|
+
},
|
|
143
|
+
deserializeLegacy(data, mode) {
|
|
144
|
+
const revivers = getReviversForMode(mode);
|
|
145
|
+
return unflatten(data, revivers);
|
|
146
|
+
},
|
|
147
|
+
};
|
|
148
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZWMtZGV2YWx1ZS12bS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJpYWxpemF0aW9uL2NvZGVjLWRldmFsdWUtdm0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0dBS0c7QUFFSCxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFdEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDNUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDL0UsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixzQkFBc0IsR0FDdkIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLEVBQWdDLG1CQUFtQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRS9FLE1BQU0sT0FBTyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7QUFDbEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztBQUVsQyxnRUFBZ0U7QUFDaEUsMkVBQTJFO0FBQzNFLHlFQUF5RTtBQUN6RSx5RUFBeUU7QUFDekUsd0VBQXdFO0FBQ3hFLG9DQUFvQztBQUNwQyxNQUFNLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsNEJBQTRCLENBQUMsQ0FBQztBQUNuRSxNQUFNLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsMkJBQTJCLENBQUMsQ0FBQztBQVNqRSxTQUFTLG1CQUFtQixDQUMxQixNQUE4QyxFQUM5QyxNQUFXO0lBRVgsTUFBTSxVQUFVLEdBQ2QsTUFBTSxDQUFDLGlCQUFpQixDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDbEUsTUFBTSxTQUFTLEdBQ2IsTUFBTSxDQUFDLGdCQUFnQixDQUFDLElBQUksTUFBTSxDQUFDLE1B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QU0sUUFBUSxHQUFHLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFDLE1BQU0sR0FBRyxHQUFHLFNBQVMsQ0FDbkIsS0FBSyxFQUNMLFFBQStDLENBQ2hELENBQUM7UUFDRixPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVELFdBQVcsQ0FBQyxJQUFnQixFQUFFLElBQXVCO1FBQ25ELE1BQU0sUUFBUSxHQUFHLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFDLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakMsT0FBTyxLQUFLLENBQUMsR0FBRyxFQUFFLFFBQStDLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRUQsaUJBQWlCLENBQUMsSUFBYSxFQUFFLElBQXVCO1FBQ3RELE1BQU0sUUFBUSxHQUFHLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFDLE9BQU8sU0FBUyxDQUNkLElBQWEsRUFDYixRQUErQyxDQUNoRCxDQUFDO0lBQ0osQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFZNLWNvbXBhdGlibGUgZGV2YWx1ZSBjb2RlYy5cbiAqXG4gKiBTYW1lIGFzIGNvZGVjLWRldmFsdWUudHMgYnV0IHVzZXMgVk0tY29tcGF0aWJsZSByZWR1Y2Vycy9yZXZpdmVyc1xuICogKG5vIE5vZGUuanMgQnVmZmVyLCBubyBub2RlOnV0aWwpLiBTYWZlIHRvIGJ1bmRsZSBpbnRvIHRoZSBRdWlja0pTIFZNLlxuICovXG5cbmltcG9ydCB7IHBhcnNlLCBzdHJpbmdpZnksIHVuZmxhdHRlbiB9IGZyb20gJ2RldmFsdWUnO1xuaW1wb3J0IHR5cGUgeyBDb2RlYywgU2VyaWFsaXphdGlvbk1vZGUgfSBmcm9tICcuL2NvZGVjLmpzJztcbmltcG9ydCB7IGdldENsYXNzUmVkdWNlcnMsIGdldENsYXNzUmV2aXZlcnMgfSBmcm9tICcuL3JlZHVjZXJzL2NsYXNzLXZtLmpzJztcbmltcG9ydCB7IGdldENvbW1vblJlZHVjZXJzLCBnZXRDb21tb25SZXZpdmVycyB9IGZyb20gJy4vcmVkdWNlcnMvY29tbW9uLXZtLmpzJztcbmltcG9ydCB7XG4gIGdldFN0ZXBGdW5jdGlvblJlZHVjZXIsXG4gIGdldFN0ZXBGdW5jdGlvblJldml2ZXIsXG59IGZyb20gJy4vcmVkdWNlcnMvc3RlcC1mdW5jdGlvbi12bS5qcyc7XG5pbXBvcnQgeyB0eXBlIFJlZHVjZXJzLCB0eXBlIFJldml2ZXJzLCBTZXJpYWxpemF0aW9uRm9ybWF0IH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbmNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbmNvbnN0IGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcblxuLy8gLS0tLSBBYm9ydENvbnRyb2xsZXIgLyBBYm9ydFNpZ25hbCAod29ya2Zsb3cgVk0gY29udGV4dCkgLS0tLVxuLy8gTWlycm9ycyB0aGUgbm9kZTp2bSBlbmdpbmUncyB3b3JrZmxvdy1jb250ZXh0IGFib3J0IHJlZHVjZXJzL3Jldml2ZXJzIGluXG4vLyBzZXJpYWxpemF0aW9uLnRzOiByZWR1Y2UgYnkgcmVhZGluZyB0aGUgc3RyZWFtL2hvb2sgc3ltYm9scyBzdGFtcGVkIGF0XG4vLyBjb250cm9sbGVyIGNvbnN0cnVjdGlvbjsgcmV2aXZlIHRvIHRoZSBib290c3RyYXAncyBXb3JrZmxvd0Fib3J0U2lnbmFsXG4vLyBjbGFzcyAobG9va2VkIHVwIGxhemlseSBvbiBnbG9iYWxUaGlzIOKAlCB0aGUgc2VyZGUgYnVuZGxlIGlzIGV2YWx1YXRlZFxuLy8gYmVmb3JlIHRoZSBib290c3RyYXAgZGVmaW5lcyBpdCkuXG5jb25zdCBBQk9SVF9TVFJFQU1fTkFNRSA9IFN5bWJvbC5mb3IoJ1dPUktGTE9XX0FCT1JUX1NUUkVBTV9OQU1FJyk7XG5jb25zdCBBQk9SVF9IT09LX1RPS0VOID0gU3ltYm9sLmZvcignV09SS0ZMT1dfQUJPUlRfSE9PS19UT0tFTicpO1xuXG50eXBlIEFib3J0U2VyaWFsaXplZCA9IHtcbiAgc3RyZWFtTmFtZTogc3RyaW5nO1xuICBob29rVG9rZW46IHN0cmluZztcbiAgYWJvcnRlZDogYm9vbGVhbjtcbiAgcmVhc29uPzogdW5rbm93bjtcbn07XG5cbmZ1bmN0aW9uIHJlZHVjZUFib3J0QnlTeW1ib2woXG4gIHNpZ25hbDogeyBhYm9ydGVkOiBib29sZWFuOyByZWFzb24/OiB1bmtub3duIH0sXG4gIGhvbGRlcjogYW55XG4pOiBBYm9ydFNlcmlhbGl6ZWQge1xuICBjb25zdCBzdHJlYW1OYW1lID1cbiAgICBob2xkZXJbQUJPUlRfU1RSRUFNX05BTUVdID8/IGhvbGRlci5zaWduYWw/LltBQk9SVF9TVFJFQU1fTkFNRV07XG4gIGNvbnN0IGhvb2tUb2tlbiA9XG4gICAgaG9sZGVyW0FCT1JUX0hPT0tfVE9LRU5dID8/IGhvbGRlci5zaWduYWw/LltBQk9SVF9IT09LX1RPS0VOXTtcbiAgaWYgKCFzdHJlYW1OYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdBYm9ydENvbnRyb2xsZXIvQWJvcnRTaWduYWwgc3RyZWFtIG5hbWUgaXMgbm90IHNldCcpO1xuICB9XG4gIHJldHVybiB7XG4gICAgc3RyZWFtTmFtZSxcbiAgICBob29rVG9rZW4sXG4gICAgYWJvcnRlZDogc2lnbmFsLmFib3J0ZWQsXG4gICAgcmVhc29uOiBzaWduYWwuYWJvcnRlZCA/IHNpZ25hbC5yZWFzb24gOiB1bmRlZmluZWQsXG4gIH07XG59XG5cbmZ1bmN0aW9uIHJldml2ZUFib3J0U2lnbmFsVk0odmFsdWU6IEFib3J0U2VyaWFsaXplZCkge1xuICBjb25zdCBDbHMgPSAoZ2xvYmFsVGhpcyBhcyBhbnkpLl9fV29ya2Zsb3dBYm9ydFNpZ25hbDtcbiAgaWYgKHR5cGVvZiBDbHMgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnV29ya2Zsb3dBYm9ydFNpZ25hbCBpcyBub3QgcmVnaXN0ZXJlZCBpbiB0aGUgVk0gKGJvb3RzdHJhcCBub3QgZXZhbHVhdGVkKSdcbiAgICApO1xuICB9XG4gIGNvbnN0IHNpZ25hbCA9IG5ldyBDbHModmFsdWUuc3RyZWFtTmFtZSwgdmFsdWUuaG9va1Rva2VuKTtcbiAgaWYgKHZhbHVlLmFib3J0ZWQpIHNpZ25hbC5fc2V0QWJvcnRlZCh2YWx1ZS5yZWFzb24pO1xuICByZXR1cm4gc2lnbmFsO1xufVxuXG5mdW5jdGlvbiBnZXRBYm9ydFJlZHVjZXJzVk0oKTogUGFydGlhbDxSZWR1Y2Vycz4ge1xuICByZXR1cm4ge1xuICAgIEFib3J0Q29udHJvbGxlcjogKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgIXZhbHVlLnNpZ25hbCkgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgaGFzQWJvcnRTeW1ib2wgPVxuICAgICAgICB2YWx1ZVtBQk9SVF9TVFJFQU1fTkFNRV0gPz8gdmFsdWUuc2lnbmFsPy5bQUJPUlRfU1RSRUFNX05BTUVdO1xuICAgICAgaWYgKGhhc0Fib3J0U3ltYm9sID09PSB1bmRlZmluZWQpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiByZWR1Y2VBYm9ydEJ5U3ltYm9sKHZhbHVlLnNpZ25hbCwgdmFsdWUpO1xuICAgIH0sXG4gICAgQWJvcnRTaWduYWw6ICh2YWx1ZSkgPT4ge1xuICAgICAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoKHZhbHVlIGFzIGFueSlbQUJPUlRfU1RSRUFNX05BTUVdID09PSB1bmRlZmluZWQpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiByZWR1Y2VBYm9ydEJ5U3ltYm9sKHZhbHVlIGFzIGFueSwgdmFsdWUpO1xuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldEFib3J0UmV2aXZlcnNWTSgpOiBQYXJ0aWFsPFJldml2ZXJzPiB7XG4gIHJldHVybiB7XG4gICAgQWJvcnRDb250cm9sbGVyOiAodmFsdWU6IEFib3J0U2VyaWFsaXplZCkgPT4gKHtcbiAgICAgIFtBQk9SVF9TVFJFQU1fTkFNRV06IHZhbHVlLnN0cmVhbU5hbWUsXG4gICAgICBbQUJPUlRfSE9PS19UT0tFTl06IHZhbHVlLmhvb2tUb2tlbixcbiAgICAgIHNpZ25hbDogcmV2aXZlQWJvcnRTaWduYWxWTSh2YWx1ZSksXG4gICAgICBhYm9ydDogKCkgPT4ge30sXG4gICAgfSksXG4gICAgQWJvcnRTaWduYWw6ICh2YWx1ZTogQWJvcnRTZXJpYWxpemVkKSA9PiByZXZpdmVBYm9ydFNpZ25hbFZNKHZhbHVlKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0UmVkdWNlcnNGb3JNb2RlKG1vZGU6IFNlcmlhbGl6YXRpb25Nb2RlKTogUGFydGlhbDxSZWR1Y2Vycz4ge1xuICBzd2l0Y2ggKG1vZGUpIHtcbiAgICBjYXNlICd3b3JrZmxvdyc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5nZXRBYm9ydFJlZHVjZXJzVk0oKSxcbiAgICAgICAgLi4uZ2V0Q2xhc3NSZWR1Y2VycygpLFxuICAgICAgICAuLi5nZXRTdGVwRnVuY3Rpb25SZWR1Y2VyKCksXG4gICAgICAgIC4uLmdldENvbW1vblJlZHVjZXJzKCksXG4gICAgICB9O1xuICAgIGNhc2UgJ3N0ZXAnOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uZ2V0Q2xhc3NSZWR1Y2VycygpLFxuICAgICAgICAuLi5nZXRDb21tb25SZWR1Y2VycygpLFxuICAgICAgfTtcbiAgICBjYXNlICdjbGllbnQnOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uZ2V0Q2xhc3NSZWR1Y2VycygpLFxuICAgICAgICAuLi5nZXRDb21tb25SZWR1Y2VycygpLFxuICAgICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRSZXZpdmVyc0Zvck1vZGUobW9kZTogU2VyaWFsaXphdGlvbk1vZGUpOiBQYXJ0aWFsPFJldml2ZXJzPiB7XG4gIHN3aXRjaCAobW9kZSkge1xuICAgIGNhc2UgJ3dvcmtmbG93JzpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmdldEFib3J0UmV2aXZlcnNWTSgpLFxuICAgICAgICAuLi5nZXRDbGFzc1Jldml2ZXJzKCksXG4gICAgICAgIC4uLmdldFN0ZXBGdW5jdGlvblJldml2ZXIoKSxcbiAgICAgICAgLi4uZ2V0Q29tbW9uUmV2aXZlcnMoKSxcbiAgICAgIH07XG4gICAgY2FzZSAnc3RlcCc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5nZXRDbGFzc1Jldml2ZXJzKCksXG4gICAgICAgIC4uLmdldENvbW1vblJldml2ZXJzKCksXG4gICAgICB9O1xuICAgIGNhc2UgJ2NsaWVudCc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5nZXRDbGFzc1Jldml2ZXJzKCksXG4gICAgICAgIC4uLmdldENvbW1vblJldml2ZXJzKCksXG4gICAgICAgIFN0ZXBGdW5jdGlvbjogKCkgPT4ge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICdTdGVwIGZ1bmN0aW9ucyBjYW5ub3QgYmUgZGVzZXJpYWxpemVkIGluIGNsaWVudCBjb250ZXh0LidcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSB3b3JrZmxvdy1tb2RlIHJlZHVjZXIvcmV2aXZlciBrZXkgc2V0cyDigJQgZXhwb3J0ZWQgZm9yIHRoZSBRdWlja0pTXG4gKiBob3N0IHNlcmRlJ3MgZXhoYXVzdGl2ZW5lc3MgdGVzdCAocXVpY2tqcy1zZXJkZS50ZXN0LnRzKSwgd2hpY2ggcGluc1xuICogdGhhdCB0aGUgaGFuZGxlLXNwYWNlIGNvZGVjIGltcGxlbWVudHMgZXhhY3RseSB0aGVzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdvcmtmbG93TW9kZVJlZHVjZXJLZXlzKCk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKGdldFJlZHVjZXJzRm9yTW9kZSgnd29ya2Zsb3cnKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0V29ya2Zsb3dNb2RlUmV2aXZlcktleXMoKTogc3RyaW5nW10ge1xuICByZXR1cm4gT2JqZWN0LmtleXMoZ2V0UmV2aXZlcnNGb3JNb2RlKCd3b3JrZmxvdycpKTtcbn1cblxuZXhwb3J0IGNvbnN0IGRldmFsdWVWbUNvZGVjOiBDb2RlYyA9IHtcbiAgZm9ybWF0UHJlZml4OiBTZXJpYWxpemF0aW9uRm9ybWF0LkRFVkFMVUVfVjEsXG5cbiAgc2VyaWFsaXplKHZhbHVlOiB1bmtub3duLCBtb2RlOiBTZXJpYWxpemF0aW9uTW9kZSk6IFVpbnQ4QXJyYXkge1xuICAgIGNvbnN0IHJlZHVjZXJzID0gZ2V0UmVkdWNlcnNGb3JNb2RlKG1vZGUpO1xuICAgIGNvbnN0IHN0ciA9IHN0cmluZ2lmeShcbiAgICAgIHZhbHVlLFxuICAgICAgcmVkdWNlcnMgYXMgUmVjb3JkPHN0cmluZywgKHZhbHVlOiBhbnkpID0+IGFueT5cbiAgICApO1xuICAgIHJldHVybiBlbmNvZGVyLmVuY29kZShzdHIpO1xuICB9LFxuXG4gIGRlc2VyaWFsaXplKGRhdGE6IFVpbnQ4QXJyYXksIG1vZGU6IFNlcmlhbGl6YXRpb25Nb2RlKTogdW5rbm93biB7XG4gICAgY29uc3QgcmV2aXZlcnMgPSBnZXRSZXZpdmVyc0Zvck1vZGUobW9kZSk7XG4gICAgY29uc3Qgc3RyID0gZGVjb2Rlci5kZWNvZGUoZGF0YSk7XG4gICAgcmV0dXJuIHBhcnNlKHN0ciwgcmV2aXZlcnMgYXMgUmVjb3JkPHN0cmluZywgKHZhbHVlOiBhbnkpID0+IGFueT4pO1xuICB9LFxuXG4gIGRlc2VyaWFsaXplTGVnYWN5KGRhdGE6IHVua25vd24sIG1vZGU6IFNlcmlhbGl6YXRpb25Nb2RlKTogdW5rbm93biB7XG4gICAgY29uc3QgcmV2aXZlcnMgPSBnZXRSZXZpdmVyc0Zvck1vZGUobW9kZSk7XG4gICAgcmV0dXJuIHVuZmxhdHRlbihcbiAgICAgIGRhdGEgYXMgYW55W10sXG4gICAgICByZXZpdmVycyBhcyBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PlxuICAgICk7XG4gIH0sXG59O1xuIl19
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Devalue codec implementation.
|
|
3
|
+
*
|
|
4
|
+
* Uses the `devalue` library for serialization. Handles custom types via
|
|
5
|
+
* reducers (serialize) and revivers (deserialize) which are composed
|
|
6
|
+
* internally based on the serialization mode.
|
|
7
|
+
*
|
|
8
|
+
* The reducer/reviver pattern is specific to devalue — other codecs
|
|
9
|
+
* (CBOR, JSON) would handle types differently (e.g. CBOR supports Date,
|
|
10
|
+
* typed arrays, Map, Set natively).
|
|
11
|
+
*/
|
|
12
|
+
import type { Codec } from './codec.js';
|
|
13
|
+
export declare const devalueCodec: Codec;
|
|
14
|
+
//# sourceMappingURL=codec-devalue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codec-devalue.d.ts","sourceRoot":"","sources":["../../src/serialization/codec-devalue.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,KAAK,EAAmC,MAAM,YAAY,CAAC;AAyFzE,eAAO,MAAM,YAAY,EAAE,KAmD1B,CAAC"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Devalue codec implementation.
|
|
3
|
+
*
|
|
4
|
+
* Uses the `devalue` library for serialization. Handles custom types via
|
|
5
|
+
* reducers (serialize) and revivers (deserialize) which are composed
|
|
6
|
+
* internally based on the serialization mode.
|
|
7
|
+
*
|
|
8
|
+
* The reducer/reviver pattern is specific to devalue — other codecs
|
|
9
|
+
* (CBOR, JSON) would handle types differently (e.g. CBOR supports Date,
|
|
10
|
+
* typed arrays, Map, Set natively).
|
|
11
|
+
*/
|
|
12
|
+
import { parse, stringify, unflatten } from 'devalue';
|
|
13
|
+
import { hardenedStringifyOperations, withGuestCodeStats } from './hardened.js';
|
|
14
|
+
import { getClassReducers, getClassRevivers } from './reducers/class.js';
|
|
15
|
+
import { getCommonReducers, getCommonRevivers } from './reducers/common.js';
|
|
16
|
+
import { getStepFunctionReducer, getStepFunctionReviver, } from './reducers/step-function.js';
|
|
17
|
+
import { SerializationFormat } from './types.js';
|
|
18
|
+
const encoder = new TextEncoder();
|
|
19
|
+
const decoder = new TextDecoder();
|
|
20
|
+
// ---- Reducer/Reviver composition per mode ----
|
|
21
|
+
function getReducersForMode(mode, global = globalThis, extraReducers) {
|
|
22
|
+
let base;
|
|
23
|
+
switch (mode) {
|
|
24
|
+
case 'workflow':
|
|
25
|
+
// Class/Instance MUST come before common (first-match-wins for Error subclasses)
|
|
26
|
+
base = {
|
|
27
|
+
...getClassReducers(),
|
|
28
|
+
...getStepFunctionReducer(),
|
|
29
|
+
...getCommonReducers(global),
|
|
30
|
+
};
|
|
31
|
+
break;
|
|
32
|
+
case 'step':
|
|
33
|
+
base = {
|
|
34
|
+
...getClassReducers(),
|
|
35
|
+
...getCommonReducers(global),
|
|
36
|
+
};
|
|
37
|
+
break;
|
|
38
|
+
case 'client':
|
|
39
|
+
base = {
|
|
40
|
+
...getClassReducers(),
|
|
41
|
+
...getCommonReducers(global),
|
|
42
|
+
};
|
|
43
|
+
break;
|
|
44
|
+
}
|
|
45
|
+
if (extraReducers) {
|
|
46
|
+
return { ...base, ...extraReducers };
|
|
47
|
+
}
|
|
48
|
+
return base;
|
|
49
|
+
}
|
|
50
|
+
function getReviversForMode(mode, global = globalThis, extraRevivers) {
|
|
51
|
+
let base;
|
|
52
|
+
switch (mode) {
|
|
53
|
+
case 'workflow':
|
|
54
|
+
base = {
|
|
55
|
+
...getClassRevivers(global),
|
|
56
|
+
...getStepFunctionReviver(global),
|
|
57
|
+
...getCommonRevivers(global),
|
|
58
|
+
};
|
|
59
|
+
break;
|
|
60
|
+
case 'step':
|
|
61
|
+
base = {
|
|
62
|
+
...getClassRevivers(global),
|
|
63
|
+
...getCommonRevivers(global),
|
|
64
|
+
};
|
|
65
|
+
break;
|
|
66
|
+
case 'client':
|
|
67
|
+
base = {
|
|
68
|
+
...getClassRevivers(global),
|
|
69
|
+
...getCommonRevivers(global),
|
|
70
|
+
StepFunction: () => {
|
|
71
|
+
throw new Error('Step functions cannot be deserialized in client context.');
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
break;
|
|
75
|
+
}
|
|
76
|
+
if (extraRevivers) {
|
|
77
|
+
return { ...base, ...extraRevivers };
|
|
78
|
+
}
|
|
79
|
+
return base;
|
|
80
|
+
}
|
|
81
|
+
// ---- Codec implementation ----
|
|
82
|
+
export const devalueCodec = {
|
|
83
|
+
formatPrefix: SerializationFormat.DEVALUE_V1,
|
|
84
|
+
serialize(value, mode, options) {
|
|
85
|
+
const reducers = getReducersForMode(mode, options?.global, options?.extraReducers);
|
|
86
|
+
// Hardened operations: devalue's own introspection (classification,
|
|
87
|
+
// built-in extraction, property reads) goes through captured host
|
|
88
|
+
// intrinsics and descriptor reads, so serializing a value constructed
|
|
89
|
+
// inside a workflow VM cannot execute sandbox code behind our back.
|
|
90
|
+
// Where workflow code must run (getters, proxies, custom serializers),
|
|
91
|
+
// the execution is recorded into `options.guestCodeStats`.
|
|
92
|
+
const str = withGuestCodeStats(options?.guestCodeStats, () => stringify(value, reducers, { operations: hardenedStringifyOperations }));
|
|
93
|
+
return encoder.encode(str);
|
|
94
|
+
},
|
|
95
|
+
deserialize(data, mode, options) {
|
|
96
|
+
const revivers = getReviversForMode(mode, options?.global, options?.extraRevivers);
|
|
97
|
+
const str = decoder.decode(data);
|
|
98
|
+
return parse(str, revivers);
|
|
99
|
+
},
|
|
100
|
+
deserializeLegacy(data, mode, options) {
|
|
101
|
+
const revivers = getReviversForMode(mode, options?.global, options?.extraRevivers);
|
|
102
|
+
return unflatten(data, revivers);
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZWMtZGV2YWx1ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJpYWxpemF0aW9uL2NvZGVjLWRldmFsdWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7R0FVRztBQUVILE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUV0RCxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDekUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDNUUsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixzQkFBc0IsR0FDdkIsTUFBTSw2QkFBNkIsQ0FBQztBQUNyQyxPQUFPLEVBQWdDLG1CQUFtQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRS9FLE1BQU0sT0FBTyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7QUFDbEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztBQUVsQyxpREFBaUQ7QUFFakQsU0FBUyxrQkFBa0IsQ0FDekIsSUFBdUIsRUFDdkIsU0FBOEIsVUFBVSxFQUN4QyxhQUFtRDtJQUVuRCxJQUFJLElBQXVCLENBQUM7SUFDNUIsUUFBUSxJQUFJLEVBQUUsQ0FBQztRQUNiLEtBQUssVUFBVTtZQUNiLGlGQUFpRjtZQUNqRixJQUFJLEdBQUc7Z0JBQ0wsR0FBRyxnQkFBZ0IsRUFBRTtnQkFDckIsR0FBRyxzQkFBc0IsRUFBRTtnQkFDM0IsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLENBQUM7YUFDN0IsQ0FBQztZQUNGLE1BQU07UUFDUixLQUFLLE1BQU07WUFDVCxJQUFJLEdBQUc7Z0JBQ0wsR0FBRyxnQkFBZ0IsRUFBRTtnQkFDckIsR0FBRyxpQkFB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QUNKLE9BQU8sRUFBRSxNQUFNLEVBQ2YsT0FBTyxFQUFFLGFBQWEsQ0FDdkIsQ0FBQztRQUNGLE9BQU8sU0FBUyxDQUFDLElBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUM1QyxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRGV2YWx1ZSBjb2RlYyBpbXBsZW1lbnRhdGlvbi5cbiAqXG4gKiBVc2VzIHRoZSBgZGV2YWx1ZWAgbGlicmFyeSBmb3Igc2VyaWFsaXphdGlvbi4gSGFuZGxlcyBjdXN0b20gdHlwZXMgdmlhXG4gKiByZWR1Y2VycyAoc2VyaWFsaXplKSBhbmQgcmV2aXZlcnMgKGRlc2VyaWFsaXplKSB3aGljaCBhcmUgY29tcG9zZWRcbiAqIGludGVybmFsbHkgYmFzZWQgb24gdGhlIHNlcmlhbGl6YXRpb24gbW9kZS5cbiAqXG4gKiBUaGUgcmVkdWNlci9yZXZpdmVyIHBhdHRlcm4gaXMgc3BlY2lmaWMgdG8gZGV2YWx1ZSDigJQgb3RoZXIgY29kZWNzXG4gKiAoQ0JPUiwgSlNPTikgd291bGQgaGFuZGxlIHR5cGVzIGRpZmZlcmVudGx5IChlLmcuIENCT1Igc3VwcG9ydHMgRGF0ZSxcbiAqIHR5cGVkIGFycmF5cywgTWFwLCBTZXQgbmF0aXZlbHkpLlxuICovXG5cbmltcG9ydCB7IHBhcnNlLCBzdHJpbmdpZnksIHVuZmxhdHRlbiB9IGZyb20gJ2RldmFsdWUnO1xuaW1wb3J0IHR5cGUgeyBDb2RlYywgQ29kZWNPcHRpb25zLCBTZXJpYWxpemF0aW9uTW9kZSB9IGZyb20gJy4vY29kZWMuanMnO1xuaW1wb3J0IHsgaGFyZGVuZWRTdHJpbmdpZnlPcGVyYXRpb25zLCB3aXRoR3Vlc3RDb2RlU3RhdHMgfSBmcm9tICcuL2hhcmRlbmVkLmpzJztcbmltcG9ydCB7IGdldENsYXNzUmVkdWNlcnMsIGdldENsYXNzUmV2aXZlcnMgfSBmcm9tICcuL3JlZHVjZXJzL2NsYXNzLmpzJztcbmltcG9ydCB7IGdldENvbW1vblJlZHVjZXJzLCBnZXRDb21tb25SZXZpdmVycyB9IGZyb20gJy4vcmVkdWNlcnMvY29tbW9uLmpzJztcbmltcG9ydCB7XG4gIGdldFN0ZXBGdW5jdGlvblJlZHVjZXIsXG4gIGdldFN0ZXBGdW5jdGlvblJldml2ZXIsXG59IGZyb20gJy4vcmVkdWNlcnMvc3RlcC1mdW5jdGlvbi5qcyc7XG5pbXBvcnQgeyB0eXBlIFJlZHVjZXJzLCB0eXBlIFJldml2ZXJzLCBTZXJpYWxpemF0aW9uRm9ybWF0IH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbmNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbmNvbnN0IGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcblxuLy8gLS0tLSBSZWR1Y2VyL1Jldml2ZXIgY29tcG9zaXRpb24gcGVyIG1vZGUgLS0tLVxuXG5mdW5jdGlvbiBnZXRSZWR1Y2Vyc0Zvck1vZGUoXG4gIG1vZGU6IFNlcmlhbGl6YXRpb25Nb2RlLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBleHRyYVJlZHVjZXJzPzogUmVjb3JkPHN0cmluZywgKHZhbHVlOiBhbnkpID0+IGFueT5cbik6IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogYW55KSA9PiBhbnk+IHtcbiAgbGV0IGJhc2U6IFBhcnRpYWw8UmVkdWNlcnM+O1xuICBzd2l0Y2ggKG1vZGUpIHtcbiAgICBjYXNlICd3b3JrZmxvdyc6XG4gICAgICAvLyBDbGFzcy9JbnN0YW5jZSBNVVNUIGNvbWUgYmVmb3JlIGNvbW1vbiAoZmlyc3QtbWF0Y2gtd2lucyBmb3IgRXJyb3Igc3ViY2xhc3NlcylcbiAgICAgIGJhc2UgPSB7XG4gICAgICAgIC4uLmdldENsYXNzUmVkdWNlcnMoKSxcbiAgICAgICAgLi4uZ2V0U3RlcEZ1bmN0aW9uUmVkdWNlcigpLFxuICAgICAgICAuLi5nZXRDb21tb25SZWR1Y2VycyhnbG9iYWwpLFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3N0ZXAnOlxuICAgICAgYmFzZSA9IHtcbiAgICAgICAgLi4uZ2V0Q2xhc3NSZWR1Y2VycygpLFxuICAgICAgICAuLi5nZXRDb21tb25SZWR1Y2VycyhnbG9iYWwpLFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2NsaWVudCc6XG4gICAgICBiYXNlID0ge1xuICAgICAgICAuLi5nZXRDbGFzc1JlZHVjZXJzKCksXG4gICAgICAgIC4uLmdldENvbW1vblJlZHVjZXJzKGdsb2JhbCksXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG4gIH1cbiAgaWYgKGV4dHJhUmVkdWNlcnMpIHtcbiAgICByZXR1cm4geyAuLi5iYXNlLCAuLi5leHRyYVJlZHVjZXJzIH0gYXMgUmVjb3JkPHN0cmluZywgKHZhbHVlOiBhbnkpID0+IGFueT47XG4gIH1cbiAgcmV0dXJuIGJhc2UgYXMgUmVjb3JkPHN0cmluZywgKHZhbHVlOiBhbnkpID0+IGFueT47XG59XG5cbmZ1bmN0aW9uIGdldFJldml2ZXJzRm9yTW9kZShcbiAgbW9kZTogU2VyaWFsaXphdGlvbk1vZGUsXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIGV4dHJhUmV2aXZlcnM/OiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PlxuKTogUmVjb3JkPHN0cmluZywgKHZhbHVlOiBhbnkpID0+IGFueT4ge1xuICBsZXQgYmFzZTogUGFydGlhbDxSZXZpdmVycz47XG4gIHN3aXRjaCAobW9kZSkge1xuICAgIGNhc2UgJ3dvcmtmbG93JzpcbiAgICAgIGJhc2UgPSB7XG4gICAgICAgIC4uLmdldENsYXNzUmV2aXZlcnMoZ2xvYmFsKSxcbiAgICAgICAgLi4uZ2V0U3RlcEZ1bmN0aW9uUmV2aXZlcihnbG9iYWwpLFxuICAgICAgICAuLi5nZXRDb21tb25SZXZpdmVycyhnbG9iYWwpLFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3N0ZXAnOlxuICAgICAgYmFzZSA9IHtcbiAgICAgICAgLi4uZ2V0Q2xhc3NSZXZpdmVycyhnbG9iYWwpLFxuICAgICAgICAuLi5nZXRDb21tb25SZXZpdmVycyhnbG9iYWwpLFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2NsaWVudCc6XG4gICAgICBiYXNlID0ge1xuICAgICAgICAuLi5nZXRDbGFzc1Jldml2ZXJzKGdsb2JhbCksXG4gICAgICAgIC4uLmdldENvbW1vblJldml2ZXJzKGdsb2JhbCksXG4gICAgICAgIFN0ZXBGdW5jdGlvbjogKCkgPT4ge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICdTdGVwIGZ1bmN0aW9ucyBjYW5ub3QgYmUgZGVzZXJpYWxpemVkIGluIGNsaWVudCBjb250ZXh0LidcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICB9XG4gIGlmIChleHRyYVJldml2ZXJzKSB7XG4gICAgcmV0dXJuIHsgLi4uYmFzZSwgLi4uZXh0cmFSZXZpdmVycyB9IGFzIFJlY29yZDxzdHJpbmcsICh2YWx1ZTogYW55KSA9PiBhbnk+O1xuICB9XG4gIHJldHVybiBiYXNlIGFzIFJlY29yZDxzdHJpbmcsICh2YWx1ZTogYW55KSA9PiBhbnk+O1xufVxuXG4vLyAtLS0tIENvZGVjIGltcGxlbWVudGF0aW9uIC0tLS1cblxuZXhwb3J0IGNvbnN0IGRldmFsdWVDb2RlYzogQ29kZWMgPSB7XG4gIGZvcm1hdFByZWZpeDogU2VyaWFsaXphdGlvbkZvcm1hdC5ERVZBTFVFX1YxLFxuXG4gIHNlcmlhbGl6ZShcbiAgICB2YWx1ZTogdW5rbm93bixcbiAgICBtb2RlOiBTZXJpYWxpemF0aW9uTW9kZSxcbiAgICBvcHRpb25zPzogQ29kZWNPcHRpb25zXG4gICk6IFVpbnQ4QXJyYXkge1xuICAgIGNvbnN0IHJlZHVjZXJzID0gZ2V0UmVkdWNlcnNGb3JNb2RlKFxuICAgICAgbW9kZSxcbiAgICAgIG9wdGlvbnM/Lmdsb2JhbCxcbiAgICAgIG9wdGlvbnM/LmV4dHJhUmVkdWNlcnNcbiAgICApO1xuICAgIC8vIEhhcmRlbmVkIG9wZXJhdGlvbnM6IGRldmFsdWUncyBvd24gaW50cm9zcGVjdGlvbiAoY2xhc3NpZmljYXRpb24sXG4gICAgLy8gYnVpbHQtaW4gZXh0cmFjdGlvbiwgcHJvcGVydHkgcmVhZHMpIGdvZXMgdGhyb3VnaCBjYXB0dXJlZCBob3N0XG4gICAgLy8gaW50cmluc2ljcyBhbmQgZGVzY3JpcHRvciByZWFkcywgc28gc2VyaWFsaXppbmcgYSB2YWx1ZSBjb25zdHJ1Y3RlZFxuICAgIC8vIGluc2lkZSBhIHdvcmtmbG93IFZNIGNhbm5vdCBleGVjdXRlIHNhbmRib3ggY29kZSBiZWhpbmQgb3VyIGJhY2suXG4gICAgLy8gV2hlcmUgd29ya2Zsb3cgY29kZSBtdXN0IHJ1biAoZ2V0dGVycywgcHJveGllcywgY3VzdG9tIHNlcmlhbGl6ZXJzKSxcbiAgICAvLyB0aGUgZXhlY3V0aW9uIGlzIHJlY29yZGVkIGludG8gYG9wdGlvbnMuZ3Vlc3RDb2RlU3RhdHNgLlxuICAgIGNvbnN0IHN0ciA9IHdpdGhHdWVzdENvZGVTdGF0cyhvcHRpb25zPy5ndWVzdENvZGVTdGF0cywgKCkgPT5cbiAgICAgIHN0cmluZ2lmeSh2YWx1ZSwgcmVkdWNlcnMsIHsgb3BlcmF0aW9uczogaGFyZGVuZWRTdHJpbmdpZnlPcGVyYXRpb25zIH0pXG4gICAgKTtcbiAgICByZXR1cm4gZW5jb2Rlci5lbmNvZGUoc3RyKTtcbiAgfSxcblxuICBkZXNlcmlhbGl6ZShcbiAgICBkYXRhOiBVaW50OEFycmF5LFxuICAgIG1vZGU6IFNlcmlhbGl6YXRpb25Nb2RlLFxuICAgIG9wdGlvbnM/OiBDb2RlY09wdGlvbnNcbiAgKTogdW5rbm93biB7XG4gICAgY29uc3QgcmV2aXZlcnMgPSBnZXRSZXZpdmVyc0Zvck1vZGUoXG4gICAgICBtb2RlLFxuICAgICAgb3B0aW9ucz8uZ2xvYmFsLFxuICAgICAgb3B0aW9ucz8uZXh0cmFSZXZpdmVyc1xuICAgICk7XG4gICAgY29uc3Qgc3RyID0gZGVjb2Rlci5kZWNvZGUoZGF0YSk7XG4gICAgcmV0dXJuIHBhcnNlKHN0ciwgcmV2aXZlcnMpO1xuICB9LFxuXG4gIGRlc2VyaWFsaXplTGVnYWN5KFxuICAgIGRhdGE6IHVua25vd24sXG4gICAgbW9kZTogU2VyaWFsaXphdGlvbk1vZGUsXG4gICAgb3B0aW9ucz86IENvZGVjT3B0aW9uc1xuICApOiB1bmtub3duIHtcbiAgICBjb25zdCByZXZpdmVycyA9IGdldFJldml2ZXJzRm9yTW9kZShcbiAgICAgIG1vZGUsXG4gICAgICBvcHRpb25zPy5nbG9iYWwsXG4gICAgICBvcHRpb25zPy5leHRyYVJldml2ZXJzXG4gICAgKTtcbiAgICByZXR1cm4gdW5mbGF0dGVuKGRhdGEgYXMgYW55W10sIHJldml2ZXJzKTtcbiAgfSxcbn07XG4iXX0=
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codec interface for serialization formats.
|
|
3
|
+
*
|
|
4
|
+
* A codec handles the core serialize/deserialize logic for a specific
|
|
5
|
+
* wire format (devalue, CBOR, JSON, etc.). Each codec is responsible
|
|
6
|
+
* for handling all supported data types internally — the caller only
|
|
7
|
+
* specifies which serialization mode to use.
|
|
8
|
+
*
|
|
9
|
+
* - **devalue**: Uses custom reducers/revivers for Date, Error, Map, Set,
|
|
10
|
+
* typed arrays, class instances, etc.
|
|
11
|
+
* - **cbor**: Would handle Date, typed arrays, Map, Set natively via the
|
|
12
|
+
* CBOR type system. Class instances would still need custom handling.
|
|
13
|
+
* - **json**: Would only support standard JSON types (primitives, arrays,
|
|
14
|
+
* plain objects). No Date, Map, Set, typed arrays, etc.
|
|
15
|
+
*/
|
|
16
|
+
import type { CompressionStats } from './compression.js';
|
|
17
|
+
import type { GuestCodeStats } from './hardened.js';
|
|
18
|
+
import type { FormatPrefix } from './types.js';
|
|
19
|
+
/**
|
|
20
|
+
* The serialization mode determines which types are supported and how
|
|
21
|
+
* they're handled. Different modes compose different sets of type handlers.
|
|
22
|
+
*
|
|
23
|
+
* - `workflow`: Runs inside the workflow VM. Includes class serialization,
|
|
24
|
+
* step function serialization. No stream handling.
|
|
25
|
+
* - `step`: Runs in the step executor (Node.js). Includes class serialization.
|
|
26
|
+
* No step function serialization. Stream handling at call sites.
|
|
27
|
+
* - `client`: Runs on the client side. Includes class serialization.
|
|
28
|
+
* No step function serialization. Stream handling at call sites.
|
|
29
|
+
*/
|
|
30
|
+
export type SerializationMode = 'workflow' | 'step' | 'client';
|
|
31
|
+
/**
|
|
32
|
+
* Options passed to codec serialize/deserialize to support VM-context
|
|
33
|
+
* serialization and mode-specific type handling.
|
|
34
|
+
*/
|
|
35
|
+
export interface CodecOptions {
|
|
36
|
+
/**
|
|
37
|
+
* The global object to use for `instanceof` checks and constructors.
|
|
38
|
+
* Defaults to `globalThis`. Must be set to the VM's global when
|
|
39
|
+
* serializing/deserializing data that crosses VM boundaries.
|
|
40
|
+
*/
|
|
41
|
+
global?: Record<string, any>;
|
|
42
|
+
/**
|
|
43
|
+
* Additional reducers to merge into the mode's default reducers.
|
|
44
|
+
* Used by dehydrate/hydrate functions that need stream handling
|
|
45
|
+
* or other mode-specific type reducers.
|
|
46
|
+
*/
|
|
47
|
+
extraReducers?: Record<string, (value: any) => any>;
|
|
48
|
+
/**
|
|
49
|
+
* Additional revivers to merge into the mode's default revivers.
|
|
50
|
+
* Used by dehydrate/hydrate functions that need stream handling
|
|
51
|
+
* or other mode-specific type revivers.
|
|
52
|
+
*/
|
|
53
|
+
extraRevivers?: Record<string, (value: any) => any>;
|
|
54
|
+
/**
|
|
55
|
+
* Whether to compress the serialized payload (write side only; zstd is
|
|
56
|
+
* preferred and gzip is the portable fallback). Reads dispatch compressed
|
|
57
|
+
* payloads by format prefix; zstd decoding still requires runtime or
|
|
58
|
+
* registered decoder support. Must only be enabled when the target run
|
|
59
|
+
* supports compressed payloads:
|
|
60
|
+
* run specVersion >= SPEC_VERSION_SUPPORTS_COMPRESSION, and for
|
|
61
|
+
* cross-deployment writes the target deployment's capabilities (see
|
|
62
|
+
* `getRunCapabilities` in capabilities.ts). Defaults to `false`.
|
|
63
|
+
*/
|
|
64
|
+
compression?: boolean;
|
|
65
|
+
/**
|
|
66
|
+
* Optional telemetry sink populated by the compression layer with what
|
|
67
|
+
* it did to the payload (whether it compressed, logical vs stored size).
|
|
68
|
+
* Used by the dehydrate/hydrate wrappers to emit OTel span attributes.
|
|
69
|
+
*/
|
|
70
|
+
compressionStats?: CompressionStats;
|
|
71
|
+
/**
|
|
72
|
+
* Optional sink populated by the hardened serializer with every
|
|
73
|
+
* workflow (guest) code execution that serialization could not avoid —
|
|
74
|
+
* getters, proxies, and custom `[WORKFLOW_SERIALIZE]` methods. A non-empty
|
|
75
|
+
* `executions` array means serialization may have perturbed VM state
|
|
76
|
+
* (it runs exactly once per payload and is never replayed, so any side
|
|
77
|
+
* effect it triggers diverges from replay).
|
|
78
|
+
*
|
|
79
|
+
* Every dehydrate path already reports this as span attributes. Passing a
|
|
80
|
+
* sink is for callers that need the executions *programmatically* — a
|
|
81
|
+
* retained-VM gate deciding whether the VM is still reusable. No caller
|
|
82
|
+
* does that yet, so nothing in the runtime currently passes one.
|
|
83
|
+
*
|
|
84
|
+
* Serialize side only.
|
|
85
|
+
*/
|
|
86
|
+
guestCodeStats?: GuestCodeStats;
|
|
87
|
+
}
|
|
88
|
+
export interface Codec {
|
|
89
|
+
/** The 4-character format prefix identifier (e.g. "devl", "cbor", "json") */
|
|
90
|
+
readonly formatPrefix: FormatPrefix;
|
|
91
|
+
/**
|
|
92
|
+
* Serialize a value to bytes.
|
|
93
|
+
*
|
|
94
|
+
* The codec handles all supported types internally based on the mode.
|
|
95
|
+
*
|
|
96
|
+
* @param value - The value to serialize
|
|
97
|
+
* @param mode - The serialization mode
|
|
98
|
+
* @param options - Optional global, extra reducers/revivers
|
|
99
|
+
* @returns The serialized payload (without format prefix)
|
|
100
|
+
*/
|
|
101
|
+
serialize(value: unknown, mode: SerializationMode, options?: CodecOptions): Uint8Array;
|
|
102
|
+
/**
|
|
103
|
+
* Deserialize bytes back to a value.
|
|
104
|
+
*
|
|
105
|
+
* The codec handles all supported types internally based on the mode.
|
|
106
|
+
*
|
|
107
|
+
* @param data - The serialized payload (without format prefix)
|
|
108
|
+
* @param mode - The serialization mode
|
|
109
|
+
* @param options - Optional global, extra revivers
|
|
110
|
+
* @returns The deserialized value
|
|
111
|
+
*/
|
|
112
|
+
deserialize(data: Uint8Array, mode: SerializationMode, options?: CodecOptions): unknown;
|
|
113
|
+
/**
|
|
114
|
+
* Deserialize legacy (pre-format-prefix) data.
|
|
115
|
+
* Used for backwards compatibility with specVersion 1 runs that stored
|
|
116
|
+
* data as plain JSON arrays instead of binary.
|
|
117
|
+
*
|
|
118
|
+
* @param data - The legacy data
|
|
119
|
+
* @param mode - The serialization mode
|
|
120
|
+
* @param options - Optional global, extra revivers
|
|
121
|
+
* @returns The deserialized value
|
|
122
|
+
*/
|
|
123
|
+
deserializeLegacy?(data: unknown, mode: SerializationMode, options?: CodecOptions): unknown;
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=codec.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codec.d.ts","sourceRoot":"","sources":["../../src/serialization/codec.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C;;;;;;;;;;GAUG;AACH,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE/D;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAE7B;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,GAAG,CAAC,CAAC;IAEpD;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,GAAG,CAAC,CAAC;IAEpD;;;;;;;;;OASG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IAEpC;;;;;;;;;;;;;;OAcG;IACH,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AAED,MAAM,WAAW,KAAK;IACpB,6EAA6E;IAC7E,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IAEpC;;;;;;;;;OASG;IACH,SAAS,CACP,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,iBAAiB,EACvB,OAAO,CAAC,EAAE,YAAY,GACrB,UAAU,CAAC;IAEd;;;;;;;;;OASG;IACH,WAAW,CACT,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,iBAAiB,EACvB,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC;IAEX;;;;;;;;;OASG;IACH,iBAAiB,CAAC,CAChB,IAAI,EAAE,OAAO,EACb,IAAI,EAAE,iBAAiB,EACvB,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC;CACZ"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codec interface for serialization formats.
|
|
3
|
+
*
|
|
4
|
+
* A codec handles the core serialize/deserialize logic for a specific
|
|
5
|
+
* wire format (devalue, CBOR, JSON, etc.). Each codec is responsible
|
|
6
|
+
* for handling all supported data types internally — the caller only
|
|
7
|
+
* specifies which serialization mode to use.
|
|
8
|
+
*
|
|
9
|
+
* - **devalue**: Uses custom reducers/revivers for Date, Error, Map, Set,
|
|
10
|
+
* typed arrays, class instances, etc.
|
|
11
|
+
* - **cbor**: Would handle Date, typed arrays, Map, Set natively via the
|
|
12
|
+
* CBOR type system. Class instances would still need custom handling.
|
|
13
|
+
* - **json**: Would only support standard JSON types (primitives, arrays,
|
|
14
|
+
* plain objects). No Date, Map, Set, typed arrays, etc.
|
|
15
|
+
*/
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VyaWFsaXphdGlvbi9jb2RlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29kZWMgaW50ZXJmYWNlIGZvciBzZXJpYWxpemF0aW9uIGZvcm1hdHMuXG4gKlxuICogQSBjb2RlYyBoYW5kbGVzIHRoZSBjb3JlIHNlcmlhbGl6ZS9kZXNlcmlhbGl6ZSBsb2dpYyBmb3IgYSBzcGVjaWZpY1xuICogd2lyZSBmb3JtYXQgKGRldmFsdWUsIENCT1IsIEpTT04sIGV0Yy4pLiBFYWNoIGNvZGVjIGlzIHJlc3BvbnNpYmxlXG4gKiBmb3IgaGFuZGxpbmcgYWxsIHN1cHBvcnRlZCBkYXRhIHR5cGVzIGludGVybmFsbHkg4oCUIHRoZSBjYWxsZXIgb25seVxuICogc3BlY2lmaWVzIHdoaWNoIHNlcmlhbGl6YXRpb24gbW9kZSB0byB1c2UuXG4gKlxuICogLSAqKmRldmFsdWUqKjogVXNlcyBjdXN0b20gcmVkdWNlcnMvcmV2aXZlcnMgZm9yIERhdGUsIEVycm9yLCBNYXAsIFNldCxcbiAqICAgdHlwZWQgYXJyYXlzLCBjbGFzcyBpbnN0YW5jZXMsIGV0Yy5cbiAqIC0gKipjYm9yKio6IFdvdWxkIGhhbmRsZSBEYXRlLCB0eXBlZCBhcnJheXMsIE1hcCwgU2V0IG5hdGl2ZWx5IHZpYSB0aGVcbiAqICAgQ0JPUiB0eXBlIHN5c3RlbS4gQ2xhc3MgaW5zdGFuY2VzIHdvdWxkIHN0aWxsIG5lZWQgY3VzdG9tIGhhbmRsaW5nLlxuICogLSAqKmpzb24qKjogV291bGQgb25seSBzdXBwb3J0IHN0YW5kYXJkIEpTT04gdHlwZXMgKHByaW1pdGl2ZXMsIGFycmF5cyxcbiAqICAgcGxhaW4gb2JqZWN0cykuIE5vIERhdGUsIE1hcCwgU2V0LCB0eXBlZCBhcnJheXMsIGV0Yy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IENvbXByZXNzaW9uU3RhdHMgfSBmcm9tICcuL2NvbXByZXNzaW9uLmpzJztcbmltcG9ydCB0eXBlIHsgR3Vlc3RDb2RlU3RhdHMgfSBmcm9tICcuL2hhcmRlbmVkLmpzJztcbmltcG9ydCB0eXBlIHsgRm9ybWF0UHJlZml4IH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8qKlxuICogVGhlIHNlcmlhbGl6YXRpb24gbW9kZSBkZXRlcm1pbmVzIHdoaWNoIHR5cGVzIGFyZSBzdXBwb3J0ZWQgYW5kIGhvd1xuICogdGhleSdyZSBoYW5kbGVkLiBEaWZmZXJlbnQgbW9kZXMgY29tcG9zZSBkaWZmZXJlbnQgc2V0cyBvZiB0eXBlIGhhbmRsZXJzLlxuICpcbiAqIC0gYHdvcmtmbG93YDogUnVucyBpbnNpZGUgdGhlIHdvcmtmbG93IFZNLiBJbmNsdWRlcyBjbGFzcyBzZXJpYWxpemF0aW9uLFxuICogICBzdGVwIGZ1bmN0aW9uIHNlcmlhbGl6YXRpb24uIE5vIHN0cmVhbSBoYW5kbGluZy5cbiAqIC0gYHN0ZXBgOiBSdW5zIGluIHRoZSBzdGVwIGV4ZWN1dG9yIChOb2RlLmpzKS4gSW5jbHVkZXMgY2xhc3Mgc2VyaWFsaXphdGlvbi5cbiAqICAgTm8gc3RlcCBmdW5jdGlvbiBzZXJpYWxpemF0aW9uLiBTdHJlYW0gaGFuZGxpbmcgYXQgY2FsbCBzaXRlcy5cbiAqIC0gYGNsaWVudGA6IFJ1bnMgb24gdGhlIGNsaWVudCBzaWRlLiBJbmNsdWRlcyBjbGFzcyBzZXJpYWxpemF0aW9uLlxuICogICBObyBzdGVwIGZ1bmN0aW9uIHNlcmlhbGl6YXRpb24uIFN0cmVhbSBoYW5kbGluZyBhdCBjYWxsIHNpdGVzLlxuICovXG5leHBvcnQgdHlwZSBTZXJpYWxpemF0aW9uTW9kZSA9ICd3b3JrZmxvdycgfCAnc3RlcCcgfCAnY2xpZW50JztcblxuLyoqXG4gKiBPcHRpb25zIHBhc3NlZCB0byBjb2RlYyBzZXJpYWxpemUvZGVzZXJpYWxpemUgdG8gc3VwcG9ydCBWTS1jb250ZXh0XG4gKiBzZXJpYWxpemF0aW9uIGFuZCBtb2RlLXNwZWNpZmljIHR5cGUgaGFuZGxpbmcuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29kZWNPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBnbG9iYWwgb2JqZWN0IHRvIHVzZSBmb3IgYGluc3RhbmNlb2ZgIGNoZWNrcyBhbmQgY29uc3RydWN0b3JzLlxuICAgKiBEZWZhdWx0cyB0byBgZ2xvYmFsVGhpc2AuIE11c3QgYmUgc2V0IHRvIHRoZSBWTSdzIGdsb2JhbCB3aGVuXG4gICAqIHNlcmlhbGl6aW5nL2Rlc2VyaWFsaXppbmcgZGF0YSB0aGF0IGNyb3NzZXMgVk0gYm91bmRhcmllcy5cbiAgICovXG4gIGdsb2JhbD86IFJlY29yZDxzdHJpbmcsIGFueT47XG5cbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgcmVkdWNlcnMgdG8gbWVyZ2UgaW50byB0aGUgbW9kZSdzIGRlZmF1bHQgcmVkdWNlcnMuXG4gICAqIFVzZWQgYnkgZGVoeWRyYXRlL2h5ZHJhdGUgZnVuY3Rpb25zIHRoYXQgbmVlZCBzdHJlYW0gaGFuZGxpbmdcbiAgICogb3Igb3RoZXIgbW9kZS1zcGVjaWZpYyB0eXBlIHJlZHVjZXJzLlxuICAgKi9cbiAgZXh0cmFSZWR1Y2Vycz86IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogYW55KSA9PiBhbnk+O1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIHJldml2ZXJzIHRvIG1lcmdlIGludG8gdGhlIG1vZGUncyBkZWZhdWx0IHJldml2ZXJzLlxuICAgKiBVc2VkIGJ5IGRlaHlkcmF0ZS9oeWRyYXRlIGZ1bmN0aW9ucyB0aGF0IG5lZWQgc3RyZWFtIGhhbmRsaW5nXG4gICAqIG9yIG90aGVyIG1vZGUtc3BlY2lmaWMgdHlwZSByZXZpdmVycy5cbiAgICovXG4gIGV4dHJhUmV2aXZlcnM/OiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBjb21wcmVzcyB0aGUgc2VyaWFsaXplZCBwYXlsb2FkICh3cml0ZSBzaWRlIG9ubHk7IHpzdGQgaXNcbiAgICogcHJlZmVycmVkIGFuZCBnemlwIGlzIHRoZSBwb3J0YWJsZSBmYWxsYmFjaykuIFJlYWRzIGRpc3BhdGNoIGNvbXByZXNzZWRcbiAgICogcGF5bG9hZHMgYnkgZm9ybWF0IHByZWZpeDsgenN0ZCBkZWNvZGluZyBzdGlsbCByZXF1aXJlcyBydW50aW1lIG9yXG4gICAqIHJlZ2lzdGVyZWQgZGVjb2RlciBzdXBwb3J0LiBNdXN0IG9ubHkgYmUgZW5hYmxlZCB3aGVuIHRoZSB0YXJnZXQgcnVuXG4gICAqIHN1cHBvcnRzIGNvbXByZXNzZWQgcGF5bG9hZHM6XG4gICAqIHJ1biBzcGVjVmVyc2lvbiA+PSBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ09NUFJFU1NJT04sIGFuZCBmb3JcbiAgICogY3Jvc3MtZGVwbG95bWVudCB3cml0ZXMgdGhlIHRhcmdldCBkZXBsb3ltZW50J3MgY2FwYWJpbGl0aWVzIChzZWVcbiAgICogYGdldFJ1bkNhcGFiaWxpdGllc2AgaW4gY2FwYWJpbGl0aWVzLnRzKS4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICovXG4gIGNvbXByZXNzaW9uPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogT3B0aW9uYWwgdGVsZW1ldHJ5IHNpbmsgcG9wdWxhdGVkIGJ5IHRoZSBjb21wcmVzc2lvbiBsYXllciB3aXRoIHdoYXRcbiAgICogaXQgZGlkIHRvIHRoZSBwYXlsb2FkICh3aGV0aGVyIGl0IGNvbXByZXNzZWQsIGxvZ2ljYWwgdnMgc3RvcmVkIHNpemUpLlxuICAgKiBVc2VkIGJ5IHRoZSBkZWh5ZHJhdGUvaHlkcmF0ZSB3cmFwcGVycyB0byBlbWl0IE9UZWwgc3BhbiBhdHRyaWJ1dGVzLlxuICAgKi9cbiAgY29tcHJlc3Npb25TdGF0cz86IENvbXByZXNzaW9uU3RhdHM7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIHNpbmsgcG9wdWxhdGVkIGJ5IHRoZSBoYXJkZW5lZCBzZXJpYWxpemVyIHdpdGggZXZlcnlcbiAgICogd29ya2Zsb3cgKGd1ZXN0KSBjb2RlIGV4ZWN1dGlvbiB0aGF0IHNlcmlhbGl6YXRpb24gY291bGQgbm90IGF2b2lkIOKAlFxuICAgKiBnZXR0ZXJzLCBwcm94aWVzLCBhbmQgY3VzdG9tIGBbV09SS0ZMT1dfU0VSSUFMSVpFXWAgbWV0aG9kcy4gQSBub24tZW1wdHlcbiAgICogYGV4ZWN1dGlvbnNgIGFycmF5IG1lYW5zIHNlcmlhbGl6YXRpb24gbWF5IGhhdmUgcGVydHVyYmVkIFZNIHN0YXRlXG4gICAqIChpdCBydW5zIGV4YWN0bHkgb25jZSBwZXIgcGF5bG9hZCBhbmQgaXMgbmV2ZXIgcmVwbGF5ZWQsIHNvIGFueSBzaWRlXG4gICAqIGVmZmVjdCBpdCB0cmlnZ2VycyBkaXZlcmdlcyBmcm9tIHJlcGxheSkuXG4gICAqXG4gICAqIEV2ZXJ5IGRlaHlkcmF0ZSBwYXRoIGFscmVhZHkgcmVwb3J0cyB0aGlzIGFzIHNwYW4gYXR0cmlidXRlcy4gUGFzc2luZyBhXG4gICAqIHNpbmsgaXMgZm9yIGNhbGxlcnMgdGhhdCBuZWVkIHRoZSBleGVjdXRpb25zICpwcm9ncmFtbWF0aWNhbGx5KiDigJQgYVxuICAgKiByZXRhaW5lZC1WTSBnYXRlIGRlY2lkaW5nIHdoZXRoZXIgdGhlIFZNIGlzIHN0aWxsIHJldXNhYmxlLiBObyBjYWxsZXJcbiAgICogZG9lcyB0aGF0IHlldCwgc28gbm90aGluZyBpbiB0aGUgcnVudGltZSBjdXJyZW50bHkgcGFzc2VzIG9uZS5cbiAgICpcbiAgICogU2VyaWFsaXplIHNpZGUgb25seS5cbiAgICovXG4gIGd1ZXN0Q29kZVN0YXRzPzogR3Vlc3RDb2RlU3RhdHM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29kZWMge1xuICAvKiogVGhlIDQtY2hhcmFjdGVyIGZvcm1hdCBwcmVmaXggaWRlbnRpZmllciAoZS5nLiBcImRldmxcIiwgXCJjYm9yXCIsIFwianNvblwiKSAqL1xuICByZWFkb25seSBmb3JtYXRQcmVmaXg6IEZvcm1hdFByZWZpeDtcblxuICAvKipcbiAgICogU2VyaWFsaXplIGEgdmFsdWUgdG8gYnl0ZXMuXG4gICAqXG4gICAqIFRoZSBjb2RlYyBoYW5kbGVzIGFsbCBzdXBwb3J0ZWQgdHlwZXMgaW50ZXJuYWxseSBiYXNlZCBvbiB0aGUgbW9kZS5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIHNlcmlhbGl6ZVxuICAgKiBAcGFyYW0gbW9kZSAtIFRoZSBzZXJpYWxpemF0aW9uIG1vZGVcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBnbG9iYWwsIGV4dHJhIHJlZHVjZXJzL3Jldml2ZXJzXG4gICAqIEByZXR1cm5zIFRoZSBzZXJpYWxpemVkIHBheWxvYWQgKHdpdGhvdXQgZm9ybWF0IHByZWZpeClcbiAgICovXG4gIHNlcmlhbGl6ZShcbiAgICB2YWx1ZTogdW5rbm93bixcbiAgICBtb2RlOiBTZXJpYWxpemF0aW9uTW9kZSxcbiAgICBvcHRpb25zPzogQ29kZWNPcHRpb25zXG4gICk6IFVpbnQ4QXJyYXk7XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplIGJ5dGVzIGJhY2sgdG8gYSB2YWx1ZS5cbiAgICpcbiAgICogVGhlIGNvZGVjIGhhbmRsZXMgYWxsIHN1cHBvcnRlZCB0eXBlcyBpbnRlcm5hbGx5IGJhc2VkIG9uIHRoZSBtb2RlLlxuICAgKlxuICAgKiBAcGFyYW0gZGF0YSAtIFRoZSBzZXJpYWxpemVkIHBheWxvYWQgKHdpdGhvdXQgZm9ybWF0IHByZWZpeClcbiAgICogQHBhcmFtIG1vZGUgLSBUaGUgc2VyaWFsaXphdGlvbiBtb2RlXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgZ2xvYmFsLCBleHRyYSByZXZpdmVyc1xuICAgKiBAcmV0dXJucyBUaGUgZGVzZXJpYWxpemVkIHZhbHVlXG4gICAqL1xuICBkZXNlcmlhbGl6ZShcbiAgICBkYXRhOiBVaW50OEFycmF5LFxuICAgIG1vZGU6IFNlcmlhbGl6YXRpb25Nb2RlLFxuICAgIG9wdGlvbnM/OiBDb2RlY09wdGlvbnNcbiAgKTogdW5rbm93bjtcblxuICAvKipcbiAgICogRGVzZXJpYWxpemUgbGVnYWN5IChwcmUtZm9ybWF0LXByZWZpeCkgZGF0YS5cbiAgICogVXNlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBzcGVjVmVyc2lvbiAxIHJ1bnMgdGhhdCBzdG9yZWRcbiAgICogZGF0YSBhcyBwbGFpbiBKU09OIGFycmF5cyBpbnN0ZWFkIG9mIGJpbmFyeS5cbiAgICpcbiAgICogQHBhcmFtIGRhdGEgLSBUaGUgbGVnYWN5IGRhdGFcbiAgICogQHBhcmFtIG1vZGUgLSBUaGUgc2VyaWFsaXphdGlvbiBtb2RlXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgZ2xvYmFsLCBleHRyYSByZXZpdmVyc1xuICAgKiBAcmV0dXJucyBUaGUgZGVzZXJpYWxpemVkIHZhbHVlXG4gICAqL1xuICBkZXNlcmlhbGl6ZUxlZ2FjeT8oXG4gICAgZGF0YTogdW5rbm93bixcbiAgICBtb2RlOiBTZXJpYWxpemF0aW9uTW9kZSxcbiAgICBvcHRpb25zPzogQ29kZWNPcHRpb25zXG4gICk6IHVua25vd247XG59XG4iXX0=
|