@workflow/core 5.0.0-beta.5 → 5.0.0-beta.50

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.
Files changed (310) hide show
  1. package/dist/attribute-changes.d.ts +5 -0
  2. package/dist/attribute-changes.d.ts.map +1 -0
  3. package/dist/attribute-changes.js +25 -0
  4. package/dist/capabilities.d.ts +35 -2
  5. package/dist/capabilities.d.ts.map +1 -1
  6. package/dist/capabilities.js +74 -5
  7. package/dist/capture-stack.d.ts +1 -1
  8. package/dist/capture-stack.js +2 -2
  9. package/dist/class-serialization.d.ts +32 -0
  10. package/dist/class-serialization.d.ts.map +1 -1
  11. package/dist/class-serialization.js +37 -1
  12. package/dist/classify-error.d.ts +19 -3
  13. package/dist/classify-error.d.ts.map +1 -1
  14. package/dist/classify-error.js +98 -6
  15. package/dist/context-violation-error.d.ts +5 -5
  16. package/dist/context-violation-error.d.ts.map +1 -1
  17. package/dist/context-violation-error.js +8 -6
  18. package/dist/create-hook.d.ts +72 -7
  19. package/dist/create-hook.d.ts.map +1 -1
  20. package/dist/create-hook.js +1 -1
  21. package/dist/define-hook.js +2 -2
  22. package/dist/describe-error.d.ts +7 -7
  23. package/dist/describe-error.d.ts.map +1 -1
  24. package/dist/describe-error.js +97 -12
  25. package/dist/encryption.d.ts +38 -4
  26. package/dist/encryption.d.ts.map +1 -1
  27. package/dist/encryption.js +96 -14
  28. package/dist/events-consumer.d.ts +271 -0
  29. package/dist/events-consumer.d.ts.map +1 -1
  30. package/dist/events-consumer.js +646 -42
  31. package/dist/flushable-stream.d.ts +56 -1
  32. package/dist/flushable-stream.d.ts.map +1 -1
  33. package/dist/flushable-stream.js +123 -11
  34. package/dist/global.d.ts +36 -2
  35. package/dist/global.d.ts.map +1 -1
  36. package/dist/global.js +21 -6
  37. package/dist/index.d.ts +2 -1
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +3 -2
  40. package/dist/log-format.d.ts +2 -2
  41. package/dist/log-format.js +7 -7
  42. package/dist/logger.d.ts +1 -0
  43. package/dist/logger.d.ts.map +1 -1
  44. package/dist/logger.js +10 -6
  45. package/dist/private.d.ts +226 -9
  46. package/dist/private.d.ts.map +1 -1
  47. package/dist/private.js +626 -7
  48. package/dist/replay-payload-cache.d.ts +64 -0
  49. package/dist/replay-payload-cache.d.ts.map +1 -0
  50. package/dist/replay-payload-cache.js +158 -0
  51. package/dist/runtime/compute-instance.d.ts +13 -0
  52. package/dist/runtime/compute-instance.d.ts.map +1 -0
  53. package/dist/runtime/compute-instance.js +14 -0
  54. package/dist/runtime/constants.d.ts +315 -0
  55. package/dist/runtime/constants.d.ts.map +1 -1
  56. package/dist/runtime/constants.js +502 -16
  57. package/dist/runtime/count-step-started-events.d.ts +52 -0
  58. package/dist/runtime/count-step-started-events.d.ts.map +1 -0
  59. package/dist/runtime/count-step-started-events.js +72 -0
  60. package/dist/runtime/deployment-guard.d.ts +99 -0
  61. package/dist/runtime/deployment-guard.d.ts.map +1 -0
  62. package/dist/runtime/deployment-guard.js +154 -0
  63. package/dist/runtime/get-port-lazy.d.ts +15 -0
  64. package/dist/runtime/get-port-lazy.d.ts.map +1 -1
  65. package/dist/runtime/get-port-lazy.js +75 -6
  66. package/dist/runtime/get-world-lazy.d.ts +5 -14
  67. package/dist/runtime/get-world-lazy.d.ts.map +1 -1
  68. package/dist/runtime/get-world-lazy.js +19 -29
  69. package/dist/runtime/helpers.d.ts +341 -29
  70. package/dist/runtime/helpers.d.ts.map +1 -1
  71. package/dist/runtime/helpers.js +559 -57
  72. package/dist/runtime/quickjs-assets.generated.d.ts +14 -0
  73. package/dist/runtime/quickjs-assets.generated.d.ts.map +1 -0
  74. package/dist/runtime/quickjs-assets.generated.js +30 -0
  75. package/dist/runtime/quickjs-entrypoint.d.ts +136 -0
  76. package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -0
  77. package/dist/runtime/quickjs-entrypoint.js +1686 -0
  78. package/dist/runtime/quickjs-runtime.d.ts +244 -0
  79. package/dist/runtime/quickjs-runtime.d.ts.map +1 -0
  80. package/dist/runtime/quickjs-runtime.js +2427 -0
  81. package/dist/runtime/quickjs-serde.d.ts +107 -0
  82. package/dist/runtime/quickjs-serde.d.ts.map +1 -0
  83. package/dist/runtime/quickjs-serde.js +2159 -0
  84. package/dist/runtime/replay-budget.d.ts +97 -0
  85. package/dist/runtime/replay-budget.d.ts.map +1 -0
  86. package/dist/runtime/replay-budget.js +139 -0
  87. package/dist/runtime/replay-recovery-reporter.d.ts +36 -0
  88. package/dist/runtime/replay-recovery-reporter.d.ts.map +1 -0
  89. package/dist/runtime/replay-recovery-reporter.js +64 -0
  90. package/dist/runtime/resume-hook.d.ts +91 -8
  91. package/dist/runtime/resume-hook.d.ts.map +1 -1
  92. package/dist/runtime/resume-hook.js +512 -89
  93. package/dist/runtime/resume-latency.d.ts +150 -0
  94. package/dist/runtime/resume-latency.d.ts.map +1 -0
  95. package/dist/runtime/resume-latency.js +155 -0
  96. package/dist/runtime/run-id-time.d.ts +19 -0
  97. package/dist/runtime/run-id-time.d.ts.map +1 -0
  98. package/dist/runtime/run-id-time.js +42 -0
  99. package/dist/runtime/run.d.ts +72 -7
  100. package/dist/runtime/run.d.ts.map +1 -1
  101. package/dist/runtime/run.js +280 -53
  102. package/dist/runtime/runs.d.ts +54 -3
  103. package/dist/runtime/runs.d.ts.map +1 -1
  104. package/dist/runtime/runs.js +126 -16
  105. package/dist/runtime/start.d.ts +101 -2
  106. package/dist/runtime/start.d.ts.map +1 -1
  107. package/dist/runtime/start.js +352 -61
  108. package/dist/runtime/step-executor.d.ts +205 -5
  109. package/dist/runtime/step-executor.d.ts.map +1 -1
  110. package/dist/runtime/step-executor.js +760 -127
  111. package/dist/runtime/step-latency.d.ts +220 -0
  112. package/dist/runtime/step-latency.d.ts.map +1 -0
  113. package/dist/runtime/step-latency.js +215 -0
  114. package/dist/runtime/step-ownership.d.ts +72 -0
  115. package/dist/runtime/step-ownership.d.ts.map +1 -0
  116. package/dist/runtime/step-ownership.js +114 -0
  117. package/dist/runtime/step-single-flight.d.ts +12 -0
  118. package/dist/runtime/step-single-flight.d.ts.map +1 -0
  119. package/dist/runtime/step-single-flight.js +75 -0
  120. package/dist/runtime/suspension-handler.d.ts +269 -7
  121. package/dist/runtime/suspension-handler.d.ts.map +1 -1
  122. package/dist/runtime/suspension-handler.js +1253 -125
  123. package/dist/runtime/unserializable-step.d.ts +34 -0
  124. package/dist/runtime/unserializable-step.d.ts.map +1 -0
  125. package/dist/runtime/unserializable-step.js +52 -0
  126. package/dist/runtime/vm-mode.d.ts +44 -0
  127. package/dist/runtime/vm-mode.d.ts.map +1 -0
  128. package/dist/runtime/vm-mode.js +62 -0
  129. package/dist/runtime/vm-serde-bundle.generated.d.ts +14 -0
  130. package/dist/runtime/vm-serde-bundle.generated.d.ts.map +1 -0
  131. package/dist/runtime/vm-serde-bundle.generated.js +16 -0
  132. package/dist/runtime/wait-continuation.d.ts +106 -0
  133. package/dist/runtime/wait-continuation.d.ts.map +1 -0
  134. package/dist/runtime/wait-continuation.js +136 -0
  135. package/dist/runtime/wait-until.d.ts +18 -0
  136. package/dist/runtime/wait-until.d.ts.map +1 -0
  137. package/dist/runtime/wait-until.js +42 -0
  138. package/dist/runtime/world-compatibility.d.ts +32 -0
  139. package/dist/runtime/world-compatibility.d.ts.map +1 -0
  140. package/dist/runtime/world-compatibility.js +44 -0
  141. package/dist/runtime/world-init.d.ts +17 -42
  142. package/dist/runtime/world-init.d.ts.map +1 -1
  143. package/dist/runtime/world-init.js +18 -43
  144. package/dist/runtime/world.d.ts +14 -2
  145. package/dist/runtime/world.d.ts.map +1 -1
  146. package/dist/runtime/world.js +75 -19
  147. package/dist/runtime.d.ts +10 -6
  148. package/dist/runtime.d.ts.map +1 -1
  149. package/dist/runtime.js +3741 -490
  150. package/dist/sealed-box.d.ts +167 -0
  151. package/dist/sealed-box.d.ts.map +1 -0
  152. package/dist/sealed-box.js +571 -0
  153. package/dist/serialization/client.d.ts +3 -3
  154. package/dist/serialization/client.d.ts.map +1 -1
  155. package/dist/serialization/client.js +8 -4
  156. package/dist/serialization/codec-devalue-vm.d.ts +16 -0
  157. package/dist/serialization/codec-devalue-vm.d.ts.map +1 -0
  158. package/dist/serialization/codec-devalue-vm.js +148 -0
  159. package/dist/serialization/codec-devalue.d.ts +1 -1
  160. package/dist/serialization/codec-devalue.d.ts.map +1 -1
  161. package/dist/serialization/codec-devalue.js +24 -6
  162. package/dist/serialization/codec.d.ts +37 -2
  163. package/dist/serialization/codec.d.ts.map +1 -1
  164. package/dist/serialization/codec.js +2 -2
  165. package/dist/serialization/compression.d.ts +105 -0
  166. package/dist/serialization/compression.d.ts.map +1 -0
  167. package/dist/serialization/compression.js +261 -0
  168. package/dist/serialization/encryption.d.ts +119 -17
  169. package/dist/serialization/encryption.d.ts.map +1 -1
  170. package/dist/serialization/encryption.js +152 -17
  171. package/dist/serialization/errors.d.ts +13 -0
  172. package/dist/serialization/errors.d.ts.map +1 -1
  173. package/dist/serialization/errors.js +20 -2
  174. package/dist/serialization/format.d.ts +6 -6
  175. package/dist/serialization/format.js +7 -7
  176. package/dist/serialization/hardened.d.ts +156 -0
  177. package/dist/serialization/hardened.d.ts.map +1 -0
  178. package/dist/serialization/hardened.js +538 -0
  179. package/dist/serialization/index.d.ts +10 -8
  180. package/dist/serialization/index.d.ts.map +1 -1
  181. package/dist/serialization/index.js +10 -8
  182. package/dist/serialization/reducers/class-vm.d.ts +20 -0
  183. package/dist/serialization/reducers/class-vm.d.ts.map +1 -0
  184. package/dist/serialization/reducers/class-vm.js +77 -0
  185. package/dist/serialization/reducers/class.d.ts.map +1 -1
  186. package/dist/serialization/reducers/class.js +11 -6
  187. package/dist/serialization/reducers/common-vm.d.ts +15 -0
  188. package/dist/serialization/reducers/common-vm.d.ts.map +1 -0
  189. package/dist/serialization/reducers/common-vm.js +616 -0
  190. package/dist/serialization/reducers/common.d.ts +1 -1
  191. package/dist/serialization/reducers/common.d.ts.map +1 -1
  192. package/dist/serialization/reducers/common.js +202 -62
  193. package/dist/serialization/reducers/step-function-vm.d.ts +44 -0
  194. package/dist/serialization/reducers/step-function-vm.d.ts.map +1 -0
  195. package/dist/serialization/reducers/step-function-vm.js +97 -0
  196. package/dist/serialization/reducers/step-function.d.ts.map +1 -1
  197. package/dist/serialization/reducers/step-function.js +25 -9
  198. package/dist/serialization/step.d.ts +4 -4
  199. package/dist/serialization/step.d.ts.map +1 -1
  200. package/dist/serialization/step.js +9 -5
  201. package/dist/serialization/types.d.ts +80 -1
  202. package/dist/serialization/types.d.ts.map +1 -1
  203. package/dist/serialization/types.js +15 -1
  204. package/dist/serialization/workflow-vm.d.ts +29 -0
  205. package/dist/serialization/workflow-vm.d.ts.map +1 -0
  206. package/dist/serialization/workflow-vm.js +74 -0
  207. package/dist/serialization-format.d.ts +64 -8
  208. package/dist/serialization-format.d.ts.map +1 -1
  209. package/dist/serialization-format.js +225 -73
  210. package/dist/serialization.d.ts +262 -34
  211. package/dist/serialization.d.ts.map +1 -1
  212. package/dist/serialization.js +1879 -274
  213. package/dist/set-attributes.d.ts +13 -0
  214. package/dist/set-attributes.d.ts.map +1 -0
  215. package/dist/set-attributes.js +60 -0
  216. package/dist/source-map.d.ts +25 -0
  217. package/dist/source-map.d.ts.map +1 -1
  218. package/dist/source-map.js +154 -10
  219. package/dist/step/context-storage.d.ts +61 -2
  220. package/dist/step/context-storage.d.ts.map +1 -1
  221. package/dist/step/context-storage.js +7 -5
  222. package/dist/step/writable-stream.d.ts +3 -3
  223. package/dist/step/writable-stream.d.ts.map +1 -1
  224. package/dist/step/writable-stream.js +72 -9
  225. package/dist/step.d.ts.map +1 -1
  226. package/dist/step.js +148 -27
  227. package/dist/symbols.d.ts +50 -0
  228. package/dist/symbols.d.ts.map +1 -1
  229. package/dist/symbols.js +51 -1
  230. package/dist/telemetry/semantic-conventions.d.ts +397 -2
  231. package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
  232. package/dist/telemetry/semantic-conventions.js +297 -3
  233. package/dist/telemetry.d.ts +91 -0
  234. package/dist/telemetry.d.ts.map +1 -1
  235. package/dist/telemetry.js +244 -17
  236. package/dist/test-support/orchestrator-context.d.ts +25 -0
  237. package/dist/test-support/orchestrator-context.d.ts.map +1 -0
  238. package/dist/test-support/orchestrator-context.js +101 -0
  239. package/dist/types.d.ts +6 -0
  240. package/dist/types.d.ts.map +1 -1
  241. package/dist/types.js +23 -1
  242. package/dist/util.d.ts +0 -5
  243. package/dist/util.d.ts.map +1 -1
  244. package/dist/util.js +1 -15
  245. package/dist/version.d.ts +1 -1
  246. package/dist/version.d.ts.map +1 -1
  247. package/dist/version.js +2 -2
  248. package/dist/vm/index.d.ts.map +1 -1
  249. package/dist/vm/index.js +84 -14
  250. package/dist/vm/script-cache.d.ts +26 -0
  251. package/dist/vm/script-cache.d.ts.map +1 -0
  252. package/dist/vm/script-cache.js +131 -0
  253. package/dist/vm/uint8array-base64.js +1 -1
  254. package/dist/workflow/abort-controller.d.ts +2 -2
  255. package/dist/workflow/abort-controller.d.ts.map +1 -1
  256. package/dist/workflow/abort-controller.js +88 -21
  257. package/dist/workflow/attribute-dispatcher.d.ts +6 -0
  258. package/dist/workflow/attribute-dispatcher.d.ts.map +1 -0
  259. package/dist/workflow/attribute-dispatcher.js +45 -0
  260. package/dist/workflow/create-hook.d.ts.map +1 -1
  261. package/dist/workflow/create-hook.js +24 -3
  262. package/dist/workflow/get-workflow-metadata.js +2 -2
  263. package/dist/workflow/hook.d.ts.map +1 -1
  264. package/dist/workflow/hook.js +304 -47
  265. package/dist/workflow/index.d.ts +1 -0
  266. package/dist/workflow/index.d.ts.map +1 -1
  267. package/dist/workflow/index.js +2 -1
  268. package/dist/workflow/set-attributes.d.ts +68 -0
  269. package/dist/workflow/set-attributes.d.ts.map +1 -0
  270. package/dist/workflow/set-attributes.js +60 -0
  271. package/dist/workflow/sleep.d.ts.map +1 -1
  272. package/dist/workflow/sleep.js +58 -12
  273. package/dist/workflow/world-init-stub.d.ts +3 -3
  274. package/dist/workflow/world-init-stub.js +4 -4
  275. package/dist/workflow.d.ts +95 -3
  276. package/dist/workflow.d.ts.map +1 -1
  277. package/dist/workflow.js +895 -561
  278. package/docs/api-reference/create-hook.mdx +89 -10
  279. package/docs/api-reference/create-webhook.mdx +16 -15
  280. package/docs/api-reference/define-hook.mdx +35 -33
  281. package/docs/api-reference/fatal-error.mdx +30 -8
  282. package/docs/api-reference/fetch.mdx +14 -10
  283. package/docs/api-reference/get-step-metadata.mdx +2 -2
  284. package/docs/api-reference/get-workflow-metadata.mdx +3 -3
  285. package/docs/api-reference/get-writable.mdx +7 -7
  286. package/docs/api-reference/index.mdx +4 -1
  287. package/docs/api-reference/retryable-error.mdx +1 -1
  288. package/docs/api-reference/set-attributes.mdx +61 -0
  289. package/docs/api-reference/sleep.mdx +4 -4
  290. package/docs/foundations/cancellation.mdx +31 -32
  291. package/docs/foundations/errors-and-retries.mdx +42 -11
  292. package/docs/foundations/hooks.mdx +64 -35
  293. package/docs/foundations/idempotency.mdx +244 -12
  294. package/docs/foundations/index.mdx +1 -23
  295. package/docs/foundations/meta.json +2 -1
  296. package/docs/foundations/serialization.mdx +21 -22
  297. package/docs/foundations/starting-workflows.mdx +106 -30
  298. package/docs/foundations/streaming.mdx +107 -59
  299. package/docs/foundations/versioning.mdx +263 -0
  300. package/docs/foundations/workflows-and-steps.mdx +9 -9
  301. package/docs/how-it-works/cancellation.mdx +63 -63
  302. package/docs/how-it-works/code-transform.mdx +83 -67
  303. package/docs/how-it-works/encryption.mdx +30 -26
  304. package/docs/how-it-works/event-sourcing.mdx +98 -34
  305. package/docs/how-it-works/framework-integrations.mdx +96 -337
  306. package/docs/how-it-works/understanding-directives.mdx +22 -22
  307. package/package.json +24 -15
  308. package/dist/runtime/step-handler.d.ts +0 -2
  309. package/dist/runtime/step-handler.d.ts.map +0 -1
  310. package/dist/runtime/step-handler.js +0 -776
@@ -1,51 +1,186 @@
1
1
  /**
2
2
  * Composable encryption layer for serialized data.
3
3
  *
4
- * Wraps/unwraps serialized payloads with AES-256-GCM encryption,
5
- * using the format prefix system to mark encrypted data.
4
+ * Wraps/unwraps serialized payloads with either symmetric AES-256-GCM
5
+ * encryption (`encr`) or an asymmetric sealed box (`encp`), using the format
6
+ * prefix system to mark which. See {@link PayloadKey} for how a caller
7
+ * declares which capabilities it holds.
6
8
  */
7
- import { WorkflowRuntimeError } from '@workflow/errors';
8
- import { decrypt as aesGcmDecrypt, encrypt as aesGcmEncrypt, } from '../encryption.js';
9
+ import { RuntimeDecryptionError } from '@workflow/errors';
10
+ import { decrypt as aesGcmDecrypt, encrypt as aesGcmEncrypt, importKey as importAesKey, } from '../encryption.js';
11
+ import { deriveRunKeyPair, open as openSealed, seal as sealToPublicKey, } from '../sealed-box.js';
9
12
  import { decodeFormatPrefix, encodeWithFormatPrefix, peekFormatPrefix, } from './format.js';
10
13
  import { SerializationFormat } from './types.js';
14
+ /**
15
+ * Brands distinguishing the structured key variants from a bare `CryptoKey`.
16
+ *
17
+ * `Symbol.for` rather than `Symbol()` because these values cross realm
18
+ * boundaries (host ↔ workflow VM), and the global symbol registry is shared
19
+ * across realms while unique symbols are not.
20
+ */
21
+ const SEAL_TARGET_BRAND = Symbol.for('workflow.serialization.sealTarget');
22
+ const RUN_KEYS_BRAND = Symbol.for('workflow.serialization.runKeys');
23
+ /**
24
+ * Build a write-only seal capability for a recipient run's public key.
25
+ *
26
+ * @param recipientPublicKey - The recipient run's raw 32-byte X25519 public key
27
+ * @param aad - Additional authenticated data, conventionally `runAad(projectId, runId)`
28
+ */
29
+ export function sealTo(recipientPublicKey, aad) {
30
+ return { [SEAL_TARGET_BRAND]: true, recipientPublicKey, aad };
31
+ }
32
+ /**
33
+ * Bundle a run's symmetric key with the keypair that opens payloads sealed
34
+ * to it.
35
+ */
36
+ export function runPayloadKeys(aes, keyPair, aad) {
37
+ return { [RUN_KEYS_BRAND]: true, aes, keyPair, aad };
38
+ }
39
+ /**
40
+ * Build the full key capability for a run from its raw 32-byte key material,
41
+ * the value `World.getEncryptionKeyForRun()` returns.
42
+ *
43
+ * Use this anywhere a run reads its own event log: it yields a key that opens
44
+ * both its own symmetric (`encr`) payloads and sealed (`encp`) payloads other
45
+ * runs wrote to it. Resolving only `importKey(material)` would leave the
46
+ * reader unable to open sealed writes.
47
+ */
48
+ export async function deriveRunPayloadKeys(runKeyMaterial) {
49
+ const [aes, keyPair] = await Promise.all([
50
+ importAesKey(runKeyMaterial),
51
+ deriveRunKeyPair(runKeyMaterial),
52
+ ]);
53
+ return runPayloadKeys(aes, keyPair);
54
+ }
55
+ export function isSealTarget(value) {
56
+ return (typeof value === 'object' &&
57
+ value !== null &&
58
+ value[SEAL_TARGET_BRAND] === true);
59
+ }
60
+ export function isRunPayloadKeys(value) {
61
+ return (typeof value === 'object' &&
62
+ value !== null &&
63
+ value[RUN_KEYS_BRAND] === true);
64
+ }
65
+ /**
66
+ * The symmetric key to use for `encr` operations, or undefined when this key
67
+ * has no symmetric capability (i.e. it is a seal-only target).
68
+ */
69
+ export function aesKeyOf(key) {
70
+ if (!key)
71
+ return undefined;
72
+ if (isRunPayloadKeys(key))
73
+ return key.aes;
74
+ if (isSealTarget(key))
75
+ return undefined;
76
+ return key;
77
+ }
78
+ export async function resolveEncryptionKey(key) {
79
+ return typeof key === 'function' ? key() : key;
80
+ }
11
81
  /**
12
82
  * Encrypt a format-prefixed payload if a key is provided.
13
- * Wraps the data with the 'encr' format prefix.
83
+ *
84
+ * Wraps the data with the `encr` prefix for symmetric keys, or the `encp`
85
+ * prefix when handed a {@link SealTarget}, a cross-run writer that holds
86
+ * only the recipient's public key.
14
87
  *
15
88
  * @param data - The format-prefixed serialized data
16
89
  * @param key - Encryption key (undefined to skip encryption)
17
- * @returns The encrypted data with 'encr' prefix, or the original data if no key
90
+ * @returns The encrypted data with its format prefix, or the original data if no key
18
91
  */
19
92
  export async function encrypt(data, key) {
20
93
  if (!key || !(data instanceof Uint8Array))
21
94
  return data;
22
- const encrypted = await aesGcmEncrypt(key, data);
95
+ if (isSealTarget(key)) {
96
+ const sealed = await sealToPublicKey(key.recipientPublicKey, data, key.aad);
97
+ return encodeWithFormatPrefix(SerializationFormat.SEALED, sealed);
98
+ }
99
+ // Symmetric path: a run's own payloads, including when the caller holds
100
+ // the full `RunPayloadKeys` bundle and *could* seal. See `PayloadKey`.
101
+ const aesKey = isRunPayloadKeys(key) ? key.aes : key;
102
+ const encrypted = await aesGcmEncrypt(aesKey, data);
23
103
  return encodeWithFormatPrefix(SerializationFormat.ENCRYPTED, encrypted);
24
104
  }
25
105
  /**
26
- * Decrypt a format-prefixed payload if it's encrypted.
27
- * Strips the 'encr' format prefix and decrypts the inner payload.
106
+ * Decrypt a format-prefixed payload if it's encrypted or sealed.
107
+ *
108
+ * Strips the `encr`/`encp` format prefix and recovers the inner payload.
109
+ * Opening a sealed (`encp`) payload requires the run's X25519 keypair, so the
110
+ * caller must supply {@link RunPayloadKeys}; a bare symmetric key cannot do
111
+ * it, and neither can a {@link SealTarget} (which is write-only by design).
28
112
  *
29
113
  * @param data - The potentially encrypted data
30
114
  * @param key - Encryption key (undefined to skip decryption)
31
115
  * @returns The decrypted inner payload, or the original data if not encrypted
32
116
  */
117
+ /**
118
+ * Open a sealed (`encp`) envelope. Split out from {@link decrypt} to keep
119
+ * each scheme's error handling readable on its own.
120
+ */
121
+ async function openSealedEnvelope(data, key) {
122
+ // Sealed payloads need the private scalar. Anything else (no key, a bare
123
+ // symmetric key, or a write-only seal target) cannot open them.
124
+ if (!isRunPayloadKeys(key)) {
125
+ throw new RuntimeDecryptionError('Sealed data encountered but no run keypair is available. ' +
126
+ "Opening a sealed payload requires the run's own encryption key " +
127
+ 'material; a symmetric key or a seal-only target cannot decrypt it.', {
128
+ context: {
129
+ operation: 'decrypt',
130
+ byteLength: data.byteLength,
131
+ formatPrefix: 'encp',
132
+ },
133
+ });
134
+ }
135
+ const { payload } = decodeFormatPrefix(data);
136
+ try {
137
+ return await openSealed(key.keyPair, payload, key.aad);
138
+ }
139
+ catch (error) {
140
+ // The sealed-box layer only sees the stripped payload, so it cannot
141
+ // record the outer envelope prefix. Enrich it here before rethrowing.
142
+ if (RuntimeDecryptionError.is(error) && error.context) {
143
+ error.context.formatPrefix = SerializationFormat.SEALED;
144
+ }
145
+ throw error;
146
+ }
147
+ }
33
148
  export async function decrypt(data, key) {
34
149
  // Non-binary data is returned as-is.
35
150
  if (!(data instanceof Uint8Array))
36
151
  return data;
37
152
  const format = peekFormatPrefix(data);
38
- // If the data is encrypted but no key was provided, fail fast.
39
- // Uses WorkflowRuntimeError to preserve the error contract from the
40
- // legacy maybeDecrypt() implementation that callers may rely on.
41
- if (format === SerializationFormat.ENCRYPTED && !key) {
42
- throw new WorkflowRuntimeError('Encrypted data encountered but no encryption key is available. ' +
43
- 'Encryption is not configured or no key was provided for this run.');
153
+ if (format === SerializationFormat.SEALED) {
154
+ return openSealedEnvelope(data, key);
44
155
  }
45
156
  // If the data is not encrypted, return it unchanged.
46
157
  if (format !== SerializationFormat.ENCRYPTED)
47
158
  return data;
159
+ // If the data is encrypted but no symmetric key is available, fail fast.
160
+ const aesKey = aesKeyOf(key);
161
+ if (!aesKey) {
162
+ throw new RuntimeDecryptionError('Encrypted data encountered but no encryption key is available. ' +
163
+ 'Encryption is not configured or no key was provided for this run.', {
164
+ context: {
165
+ operation: 'decrypt',
166
+ byteLength: data.byteLength,
167
+ formatPrefix: 'encr',
168
+ },
169
+ });
170
+ }
48
171
  const { payload } = decodeFormatPrefix(data);
49
- return aesGcmDecrypt(key, payload);
172
+ try {
173
+ return await aesGcmDecrypt(aesKey, payload);
174
+ }
175
+ catch (error) {
176
+ // The low-level AES layer only sees the stripped payload, so it cannot
177
+ // record the outer envelope prefix. This layer peeked it (`encr`), so
178
+ // enrich the diagnostic context with the real format prefix before
179
+ // rethrowing.
180
+ if (RuntimeDecryptionError.is(error) && error.context) {
181
+ error.context.formatPrefix = format;
182
+ }
183
+ throw error;
184
+ }
50
185
  }
51
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jcnlwdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJpYWxpemF0aW9uL2VuY3J5cHRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0dBS0c7QUFFSCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN4RCxPQUFPLEVBQ0wsT0FBTyxJQUFJLGFBQWEsRUFDeEIsT0FBTyxJQUFJLGFBQWEsR0FFekIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLHNCQUFzQixFQUN0QixnQkFBZ0IsR0FDakIsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBYWpEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLE9BQU8sQ0FDM0IsSUFBMEIsRUFDMUIsR0FBMEI7SUFFMUIsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxZQUFZLFVBQVUsQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3ZELE1BQU0sU0FBUyxHQUFHLE1BQU0sYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNqRCxPQUFPLHNCQUFzQixDQUFDLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUMxRSxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsT0FBTyxDQUMzQixJQUEwQixFQUMxQixHQUEwQjtJQUUxQixxQ0FBcUM7SUFDckMsSUFBSSxDQUFDLENBQUMsSUFBSSxZQUFZLFVBQVUsQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBRS9DLE1BQU0sTUFBTSxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBRXRDLCtEQUErRDtJQUMvRCxvRUFBb0U7SUFDcEUsaUVBQWlFO0lBQ2pFLElBQUksTUFBTSxLQUFLLG1CQUFtQixDQUFDLFNBQVMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3JELE1BQU0sSUFBSSxvQkFBb0IsQ0FDNUIsaUVBQWlFO1lBQy9ELG1FQUFtRSxDQUN0RSxDQUFDO0lBQ0osQ0FBQztJQUVELHFEQUFxRDtJQUNyRCxJQUFJLE1BQU0sS0FBSyxtQkFBbUIsQ0FBQyxTQUFTO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFFMUQsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzdDLE9BQU8sYUFBYSxDQUFDLEdBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN0QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb21wb3NhYmxlIGVuY3J5cHRpb24gbGF5ZXIgZm9yIHNlcmlhbGl6ZWQgZGF0YS5cbiAqXG4gKiBXcmFwcy91bndyYXBzIHNlcmlhbGl6ZWQgcGF5bG9hZHMgd2l0aCBBRVMtMjU2LUdDTSBlbmNyeXB0aW9uLFxuICogdXNpbmcgdGhlIGZvcm1hdCBwcmVmaXggc3lzdGVtIHRvIG1hcmsgZW5jcnlwdGVkIGRhdGEuXG4gKi9cblxuaW1wb3J0IHsgV29ya2Zsb3dSdW50aW1lRXJyb3IgfSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB7XG4gIGRlY3J5cHQgYXMgYWVzR2NtRGVjcnlwdCxcbiAgZW5jcnlwdCBhcyBhZXNHY21FbmNyeXB0LFxuICB0eXBlIENyeXB0b0tleSxcbn0gZnJvbSAnLi4vZW5jcnlwdGlvbi5qcyc7XG5pbXBvcnQge1xuICBkZWNvZGVGb3JtYXRQcmVmaXgsXG4gIGVuY29kZVdpdGhGb3JtYXRQcmVmaXgsXG4gIHBlZWtGb3JtYXRQcmVmaXgsXG59IGZyb20gJy4vZm9ybWF0LmpzJztcbmltcG9ydCB7IFNlcmlhbGl6YXRpb25Gb3JtYXQgfSBmcm9tICcuL3R5cGVzLmpzJztcblxuZXhwb3J0IHR5cGUgeyBDcnlwdG9LZXkgfTtcblxuLyoqXG4gKiBFbmNyeXB0aW9uIGtleSBwYXJhbWV0ZXIgdHlwZS4gQWNjZXB0cyBhIHJlc29sdmVkIGtleSwgdW5kZWZpbmVkIChubyBlbmNyeXB0aW9uKSxcbiAqIG9yIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGVpdGhlci5cbiAqL1xuZXhwb3J0IHR5cGUgRW5jcnlwdGlvbktleVBhcmFtID1cbiAgfCBDcnlwdG9LZXlcbiAgfCB1bmRlZmluZWRcbiAgfCBQcm9taXNlPENyeXB0b0tleSB8IHVuZGVmaW5lZD47XG5cbi8qKlxuICogRW5jcnlwdCBhIGZvcm1hdC1wcmVmaXhlZCBwYXlsb2FkIGlmIGEga2V5IGlzIHByb3ZpZGVkLlxuICogV3JhcHMgdGhlIGRhdGEgd2l0aCB0aGUgJ2VuY3InIGZvcm1hdCBwcmVmaXguXG4gKlxuICogQHBhcmFtIGRhdGEgLSBUaGUgZm9ybWF0LXByZWZpeGVkIHNlcmlhbGl6ZWQgZGF0YVxuICogQHBhcmFtIGtleSAtIEVuY3J5cHRpb24ga2V5ICh1bmRlZmluZWQgdG8gc2tpcCBlbmNyeXB0aW9uKVxuICogQHJldHVybnMgVGhlIGVuY3J5cHRlZCBkYXRhIHdpdGggJ2VuY3InIHByZWZpeCwgb3IgdGhlIG9yaWdpbmFsIGRhdGEgaWYgbm8ga2V5XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbmNyeXB0KFxuICBkYXRhOiBVaW50OEFycmF5IHwgdW5rbm93bixcbiAga2V5OiBDcnlwdG9LZXkgfCB1bmRlZmluZWRcbik6IFByb21pc2U8VWludDhBcnJheSB8IHVua25vd24+IHtcbiAgaWYgKCFrZXkgfHwgIShkYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHJldHVybiBkYXRhO1xuICBjb25zdCBlbmNyeXB0ZWQgPSBhd2FpdCBhZXNHY21FbmNyeXB0KGtleSwgZGF0YSk7XG4gIHJldHVybiBlbmNvZGVXaXRoRm9ybWF0UHJlZml4KFNlcmlhbGl6YXRpb25Gb3JtYXQuRU5DUllQVEVELCBlbmNyeXB0ZWQpO1xufVxuXG4vKipcbiAqIERlY3J5cHQgYSBmb3JtYXQtcHJlZml4ZWQgcGF5bG9hZCBpZiBpdCdzIGVuY3J5cHRlZC5cbiAqIFN0cmlwcyB0aGUgJ2VuY3InIGZvcm1hdCBwcmVmaXggYW5kIGRlY3J5cHRzIHRoZSBpbm5lciBwYXlsb2FkLlxuICpcbiAqIEBwYXJhbSBkYXRhIC0gVGhlIHBvdGVudGlhbGx5IGVuY3J5cHRlZCBkYXRhXG4gKiBAcGFyYW0ga2V5IC0gRW5jcnlwdGlvbiBrZXkgKHVuZGVmaW5lZCB0byBza2lwIGRlY3J5cHRpb24pXG4gKiBAcmV0dXJucyBUaGUgZGVjcnlwdGVkIGlubmVyIHBheWxvYWQsIG9yIHRoZSBvcmlnaW5hbCBkYXRhIGlmIG5vdCBlbmNyeXB0ZWRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlY3J5cHQoXG4gIGRhdGE6IFVpbnQ4QXJyYXkgfCB1bmtub3duLFxuICBrZXk6IENyeXB0b0tleSB8IHVuZGVmaW5lZFxuKTogUHJvbWlzZTxVaW50OEFycmF5IHwgdW5rbm93bj4ge1xuICAvLyBOb24tYmluYXJ5IGRhdGEgaXMgcmV0dXJuZWQgYXMtaXMuXG4gIGlmICghKGRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KSkgcmV0dXJuIGRhdGE7XG5cbiAgY29uc3QgZm9ybWF0ID0gcGVla0Zvcm1hdFByZWZpeChkYXRhKTtcblxuICAvLyBJZiB0aGUgZGF0YSBpcyBlbmNyeXB0ZWQgYnV0IG5vIGtleSB3YXMgcHJvdmlkZWQsIGZhaWwgZmFzdC5cbiAgLy8gVXNlcyBXb3JrZmxvd1J1bnRpbWVFcnJvciB0byBwcmVzZXJ2ZSB0aGUgZXJyb3IgY29udHJhY3QgZnJvbSB0aGVcbiAgLy8gbGVnYWN5IG1heWJlRGVjcnlwdCgpIGltcGxlbWVudGF0aW9uIHRoYXQgY2FsbGVycyBtYXkgcmVseSBvbi5cbiAgaWYgKGZvcm1hdCA9PT0gU2VyaWFsaXphdGlvbkZvcm1hdC5FTkNSWVBURUQgJiYgIWtleSkge1xuICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICdFbmNyeXB0ZWQgZGF0YSBlbmNvdW50ZXJlZCBidXQgbm8gZW5jcnlwdGlvbiBrZXkgaXMgYXZhaWxhYmxlLiAnICtcbiAgICAgICAgJ0VuY3J5cHRpb24gaXMgbm90IGNvbmZpZ3VyZWQgb3Igbm8ga2V5IHdhcyBwcm92aWRlZCBmb3IgdGhpcyBydW4uJ1xuICAgICk7XG4gIH1cblxuICAvLyBJZiB0aGUgZGF0YSBpcyBub3QgZW5jcnlwdGVkLCByZXR1cm4gaXQgdW5jaGFuZ2VkLlxuICBpZiAoZm9ybWF0ICE9PSBTZXJpYWxpemF0aW9uRm9ybWF0LkVOQ1JZUFRFRCkgcmV0dXJuIGRhdGE7XG5cbiAgY29uc3QgeyBwYXlsb2FkIH0gPSBkZWNvZGVGb3JtYXRQcmVmaXgoZGF0YSk7XG4gIHJldHVybiBhZXNHY21EZWNyeXB0KGtleSEsIHBheWxvYWQpO1xufVxuIl19
186
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jcnlwdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJpYWxpemF0aW9uL2VuY3J5cHRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7R0FPRztBQUVILE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzFELE9BQU8sRUFDTCxPQUFPLElBQUksYUFBYSxFQUN4QixPQUFPLElBQUksYUFBYSxFQUV4QixTQUFTLElBQUksWUFBWSxHQUMxQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsSUFBSSxJQUFJLFVBQVUsRUFFbEIsSUFBSSxJQUFJLGVBQWUsR0FDeEIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLHNCQUFzQixFQUN0QixnQkFBZ0IsR0FDakIsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBSWpEOzs7Ozs7R0FNRztBQUNILE1BQU0saUJBQWlCLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO0FBQzFFLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztBQXVFcEU7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsTUFBTSxDQUNwQixrQkFBOEIsRUFDOUIsR0FBZ0I7SUFFaEIsT0FBTyxFQUFFLENBQUMsaUJBQWlCLENBQUMsRUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFDaEUsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQzVCLEdBQWMsRUFDZCxPQUFtQixFQUNuQixHQUFnQjtJQUVoQixPQUFPLEVBQUUsQ0FBQyxjQUFjLENBQUMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN2RCxDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLG9CQUFvQixDQUN4QyxjQUEwQjtJQUUxQixNQUFNLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQztRQUN2QyxZQUFZLENBQUMsY0FBYyxDQUFDO1FBQzVCLGdCQUFnQixDQUFDLGNBQWMsQ0FBQztLQUNqQyxDQUFDLENBQUM7SUFDSCxPQUFPLGNBQWMsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDdEMsQ0FBQztBQUVELE1BQU0sVUFBVSxZQUFZLENBQUMsS0FBYztJQUN6QyxPQUFPLENBQ0wsT0FBTyxLQUFLLEtBQUssUUFBUTtRQUN6QixLQUFLLEtBQUssSUFBSTtRQUNiLEtBQTZCLENBQUMsaUJBQWlCLENBQUMsS0FBSyxJQUFJLENBQzNELENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxVQUFVLGdCQUFnQixDQUFDLEtBQWM7SUFDN0MsT0FBTyxDQUNMLE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFDekIsS0FBSyxLQUFLLElBQUk7UUFDYixLQUFpQyxDQUFDLGNBQWMsQ0FBQyxLQUFLLElBQUksQ0FDNUQsQ0FBQztBQUNKLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsUUFBUSxDQUFDLEdBQTJCO0lBQ2xELElBQUksQ0FBQyxHQUFHO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDM0IsSUFBSSxnQkFBZ0IsQ0FBQyxHQUFHLENBQUM7UUFBRSxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUM7SUFDMUMsSUFBSSxZQUFZLENBQUMsR0FBRyxDQUFDO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDeEMsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBWUQsTUFBTSxDQUFDLEtBQUssVUFBVSxvQkFBb0IsQ0FDeEMsR0FBdUI7SUFFdkIsT0FBTyxPQUFPLEdBQUcsS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7QUFDakQsQ0FBQztBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLE9BQU8sQ0FDM0IsSUFBMEIsRUFDMUIsR0FBMkI7SUFFM0IsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxZQUFZLFVBQVUsQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBRXZELElBQUksWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDdEIsTUFBTSxNQUFNLEdBQUcsTUFBTSxlQUFlLENBQUMsR0FBRyxDQUFDLGtCQUFrQixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUUsT0FBTyxzQkFBc0IsQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVELHdFQUF3RTtJQUN4RSx1RUFBdUU7SUFDdkUsTUFBTSxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztJQUNyRCxNQUFNLFNBQVMsR0FBRyxNQUFNLGFBQWEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDcEQsT0FBTyxzQkFBc0IsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDMUUsQ0FBQztBQUVEOzs7Ozs7Ozs7OztHQVdHO0FBQ0g7OztHQUdHO0FBQ0gsS0FBSyxVQUFVLGtCQUFrQixDQUMvQixJQUFnQixFQUNoQixHQUEyQjtJQUUzQix5RUFBeUU7SUFDekUsZ0VBQWdFO0lBQ2hFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQzNCLE1BQU0sSUFBSSxzQkFBc0IsQ0FDOUIsMkRBQTJEO1lBQ3pELGlFQUFpRTtZQUNqRSxvRUFBb0UsRUFDdEU7WUFDRSxPQUFPLEVBQUU7Z0JBQ1AsU0FBUyxFQUFFLFNBQVM7Z0JBQ3BCLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtnQkFDM0IsWUFBWSxFQUFFLE1BQU07YUFDckI7U0FDRixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzdDLElBQUksQ0FBQztRQUNILE9BQU8sTUFBTSxVQUFVLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2Ysb0VBQW9FO1FBQ3BFLHNFQUFzRTtRQUN0RSxJQUFJLHNCQUFzQixDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDdEQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEdBQUcsbUJBQW1CLENBQUMsTUFBTSxDQUFDO1FBQzFELENBQUM7UUFDRCxNQUFNLEtBQUssQ0FBQztJQUNkLENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBTSxDQUFDLEtBQUssVUFBVSxPQUFPLENBQzNCLElBQTBCLEVBQzFCLEdBQTJCO0lBRTNCLHFDQUFxQztJQUNyQyxJQUFJLENBQUMsQ0FBQyxJQUFJLFlBQVksVUFBVSxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFFL0MsTUFBTSxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFdEMsSUFBSSxNQUFNLEtBQUssbUJBQW1CLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDMUMsT0FBTyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELHFEQUFxRDtJQUNyRCxJQUFJLE1BQU0sS0FBSyxtQkFBbUIsQ0FBQyxTQUFTO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFFMUQseUVBQXlFO0lBQ3pFLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM3QixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDWixNQUFNLElBQUksc0JBQXNCLENBQzlCLGlFQUFpRTtZQUMvRCxtRUFBbUUsRUFDckU7WUFDRSxPQUFPLEVBQUU7Z0JBQ1AsU0FBUyxFQUFFLFNBQVM7Z0JBQ3BCLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtnQkFDM0IsWUFBWSxFQUFFLE1BQU07YUFDckI7U0FDRixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzdDLElBQUksQ0FBQztRQUNILE9BQU8sTUFBTSxhQUFhLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsdUVBQXVFO1FBQ3ZFLHNFQUFzRTtRQUN0RSxtRUFBbUU7UUFDbkUsY0FBYztRQUNkLElBQUksc0JBQXNCLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN0RCxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUM7UUFDdEMsQ0FBQztRQUNELE1BQU0sS0FBSyxDQUFDO0lBQ2QsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbXBvc2FibGUgZW5jcnlwdGlvbiBsYXllciBmb3Igc2VyaWFsaXplZCBkYXRhLlxuICpcbiAqIFdyYXBzL3Vud3JhcHMgc2VyaWFsaXplZCBwYXlsb2FkcyB3aXRoIGVpdGhlciBzeW1tZXRyaWMgQUVTLTI1Ni1HQ01cbiAqIGVuY3J5cHRpb24gKGBlbmNyYCkgb3IgYW4gYXN5bW1ldHJpYyBzZWFsZWQgYm94IChgZW5jcGApLCB1c2luZyB0aGUgZm9ybWF0XG4gKiBwcmVmaXggc3lzdGVtIHRvIG1hcmsgd2hpY2guIFNlZSB7QGxpbmsgUGF5bG9hZEtleX0gZm9yIGhvdyBhIGNhbGxlclxuICogZGVjbGFyZXMgd2hpY2ggY2FwYWJpbGl0aWVzIGl0IGhvbGRzLlxuICovXG5cbmltcG9ydCB7IFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3IgfSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB7XG4gIGRlY3J5cHQgYXMgYWVzR2NtRGVjcnlwdCxcbiAgZW5jcnlwdCBhcyBhZXNHY21FbmNyeXB0LFxuICB0eXBlIENyeXB0b0tleSxcbiAgaW1wb3J0S2V5IGFzIGltcG9ydEFlc0tleSxcbn0gZnJvbSAnLi4vZW5jcnlwdGlvbi5qcyc7XG5pbXBvcnQge1xuICBkZXJpdmVSdW5LZXlQYWlyLFxuICBvcGVuIGFzIG9wZW5TZWFsZWQsXG4gIHR5cGUgUnVuS2V5UGFpcixcbiAgc2VhbCBhcyBzZWFsVG9QdWJsaWNLZXksXG59IGZyb20gJy4uL3NlYWxlZC1ib3guanMnO1xuaW1wb3J0IHtcbiAgZGVjb2RlRm9ybWF0UHJlZml4LFxuICBlbmNvZGVXaXRoRm9ybWF0UHJlZml4LFxuICBwZWVrRm9ybWF0UHJlZml4LFxufSBmcm9tICcuL2Zvcm1hdC5qcyc7XG5pbXBvcnQgeyBTZXJpYWxpemF0aW9uRm9ybWF0IH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbmV4cG9ydCB0eXBlIHsgQ3J5cHRvS2V5LCBSdW5LZXlQYWlyIH07XG5cbi8qKlxuICogQnJhbmRzIGRpc3Rpbmd1aXNoaW5nIHRoZSBzdHJ1Y3R1cmVkIGtleSB2YXJpYW50cyBmcm9tIGEgYmFyZSBgQ3J5cHRvS2V5YC5cbiAqXG4gKiBgU3ltYm9sLmZvcmAgcmF0aGVyIHRoYW4gYFN5bWJvbCgpYCBiZWNhdXNlIHRoZXNlIHZhbHVlcyBjcm9zcyByZWFsbVxuICogYm91bmRhcmllcyAoaG9zdCDihpQgd29ya2Zsb3cgVk0pLCBhbmQgdGhlIGdsb2JhbCBzeW1ib2wgcmVnaXN0cnkgaXMgc2hhcmVkXG4gKiBhY3Jvc3MgcmVhbG1zIHdoaWxlIHVuaXF1ZSBzeW1ib2xzIGFyZSBub3QuXG4gKi9cbmNvbnN0IFNFQUxfVEFSR0VUX0JSQU5EID0gU3ltYm9sLmZvcignd29ya2Zsb3cuc2VyaWFsaXphdGlvbi5zZWFsVGFyZ2V0Jyk7XG5jb25zdCBSVU5fS0VZU19CUkFORCA9IFN5bWJvbC5mb3IoJ3dvcmtmbG93LnNlcmlhbGl6YXRpb24ucnVuS2V5cycpO1xuXG4vKipcbiAqIEEgd3JpdGUtb25seSBjYXBhYmlsaXR5OiBzZWFsIHBheWxvYWRzIHRvIGEgcnVuJ3MgWDI1NTE5IHB1YmxpYyBrZXkuXG4gKlxuICogVGhpcyBpcyB3aGF0IGEgKmNyb3NzLXJ1biogd3JpdGVyIGhvbGRzOiBhIGhvb2sgcmVzdW1wdGlvbiB0YXJnZXRpbmdcbiAqIGFub3RoZXIgcnVuLCBvciBhIGNoaWxkIHdvcmtmbG93IHdyaXRpbmcgaW50byBhIHBhcmVudCdzIGZvcndhcmRlZCBzdHJlYW0uXG4gKiBJdCBjYXJyaWVzIG5vIGFiaWxpdHkgdG8gZGVjcnlwdCBhbnl0aGluZywgYW5kIGJlY2F1c2UgaXQgaXMgYSBkaXN0aW5jdFxuICogbm9taW5hbCB0eXBlIGl0IGNhbm5vdCBiZSBtaXN0YWtlbiBmb3Igc3ltbWV0cmljIGtleSBtYXRlcmlhbC5cbiAqXG4gKiBUaGF0IGxhc3QgcHJvcGVydHkgbWF0dGVycyBtb3JlIHRoYW4gaXQgbG9va3M6IGEgcmF3IDMyLWJ5dGUgWDI1NTE5IHB1YmxpY1xuICoga2V5IGlzIGEgKnN0cnVjdHVyYWxseSB2YWxpZCogQUVTLTI1NiBrZXksIHNvIGhhbmRpbmcgb25lIHRvXG4gKiBgaW1wb3J0S2V5KC4uLiwgJ0FFUy1HQ00nKWAgc3VjY2VlZHMgYW5kIHNpbGVudGx5IHByb2R1Y2VzIGNpcGhlcnRleHQgdGhhdFxuICogbm9ib2R5IGNhbiBldmVyIG9wZW4uIFJvdXRpbmcgcHVibGljIGtleXMgZXhjbHVzaXZlbHkgdGhyb3VnaFxuICoge0BsaW5rIHNlYWxUb30gbWFrZXMgdGhhdCBtaXN0YWtlIHVucmVwcmVzZW50YWJsZSByYXRoZXIgdGhhbiBtZXJlbHlcbiAqIGRpc2NvdXJhZ2VkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlYWxUYXJnZXQge1xuICByZWFkb25seSBbU0VBTF9UQVJHRVRfQlJBTkRdOiB0cnVlO1xuICAvKiogVGhlIHJlY2lwaWVudCBydW4ncyByYXcgMzItYnl0ZSBYMjU1MTkgcHVibGljIGtleS4gKi9cbiAgcmVhZG9ubHkgcmVjaXBpZW50UHVibGljS2V5OiBVaW50OEFycmF5O1xuICAvKiogQWRkaXRpb25hbCBhdXRoZW50aWNhdGVkIGRhdGEgYmluZGluZyB0aGUgcGF5bG9hZCB0byB0aGUgcmVjaXBpZW50IHJ1bi4gKi9cbiAgcmVhZG9ubHkgYWFkPzogVWludDhBcnJheTtcbn1cblxuLyoqXG4gKiBUaGUgZnVsbCBrZXkgY2FwYWJpbGl0eSBvZiBhIHJ1bidzICpvd24qIHJ1bnRpbWUgKGFuZCBvZiBvMTF5IHRvb2xpbmdcbiAqIGFjdGluZyBvbiBpdHMgYmVoYWxmKTogdGhlIHN5bW1ldHJpYyBrZXkgZm9yIGl0cyBvd24gcGF5bG9hZHMsIHBsdXMgdGhlXG4gKiBrZXlwYWlyIG5lZWRlZCB0byBvcGVuIHNlYWxlZCBwYXlsb2FkcyB0aGF0IG90aGVyIHJ1bnMgd3JvdGUgdG8gaXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVuUGF5bG9hZEtleXMge1xuICByZWFkb25seSBbUlVOX0tFWVNfQlJBTkRdOiB0cnVlO1xuICAvKiogU3ltbWV0cmljIEFFUy0yNTYtR0NNIGtleTogdGhlIHJ1bidzIG93biBgZW5jcmAgcGF5bG9hZHMuICovXG4gIHJlYWRvbmx5IGFlczogQ3J5cHRvS2V5O1xuICAvKiogWDI1NTE5IGtleXBhaXI6IG9wZW5zIGBlbmNwYCBwYXlsb2FkcyBzZWFsZWQgdG8gdGhpcyBydW4uICovXG4gIHJlYWRvbmx5IGtleVBhaXI6IFJ1bktleVBhaXI7XG4gIC8qKiBBZGRpdGlvbmFsIGF1dGhlbnRpY2F0ZWQgZGF0YSBleHBlY3RlZCBvbiBzZWFsZWQgcGF5bG9hZHMuICovXG4gIHJlYWRvbmx5IGFhZD86IFVpbnQ4QXJyYXk7XG59XG5cbi8qKlxuICogQSByZXNvbHZlZCBrZXkgZm9yIHJlYWRpbmcgb3Igd3JpdGluZyBhIHNlcmlhbGl6ZWQgcGF5bG9hZC5cbiAqXG4gKiBUaGUgYmFyZSBgQ3J5cHRvS2V5YCB2YXJpYW50IGlzIHRoZSBoaXN0b3JpY2FsIHNoYXBlIGFuZCByZW1haW5zIHZhbGlkOiBpdFxuICogbWVhbnMgXCJzeW1tZXRyaWMgb25seVwiLCB3aGljaCBpcyBleGFjdGx5IHJpZ2h0IGZvciBhIHJ1biB0aGF0IHByZWRhdGVzXG4gKiBzZWFsZWQgYm94ZXMgb3IgZm9yIGFueSBzYW1lLXJ1biBwYXlsb2FkLiBUaGUgc3RydWN0dXJlZCB2YXJpYW50cyBhcmVcbiAqIGFkZGl0aXZlOlxuICpcbiAqIHwgVmFyaWFudCAgICAgICAgICAgIHwgV3JpdGVzICB8IFJlYWRzICAgICAgICAgIHwgSGVsZCBieSAgICAgICAgICAgICAgICAgIHxcbiAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHxcbiAqIHwgYENyeXB0b0tleWAgICAgICAgIHwgYGVuY3JgICB8IGBlbmNyYCAgICAgICAgIHwgc2FtZS1ydW4gKGxlZ2FjeSBzaGFwZSkgIHxcbiAqIHwge0BsaW5rIFJ1blBheWxvYWRLZXlzfSB8IGBlbmNyYCAgfCBgZW5jcmAsIGBlbmNwYCB8IHRoZSBvd25pbmcgcnVuLCBvMTF5ICAgICB8XG4gKiB8IHtAbGluayBTZWFsVGFyZ2V0fSB8IGBlbmNwYCAgfCAobm9uZSkgICAgICAgICB8IGNyb3NzLXJ1biB3cml0ZXJzICAgICAgICB8XG4gKlxuICogQSBydW4ncyBvd24gcGF5bG9hZHMgZGVsaWJlcmF0ZWx5IHN0YXkgc3ltbWV0cmljIGV2ZW4gd2hlbiB0aGUgd3JpdGVyIGNvdWxkXG4gKiBzZWFsOiBzZWFsaW5nIGNvc3RzIGEgZnJlc2ggRUNESCBwZXIgZW52ZWxvcGUgYW5kIDMyIGV4dHJhIGJ5dGVzLCBhbmQgYnV5c1xuICogbm90aGluZyB3aGVuIHRoZSB3cml0ZXIgYWxyZWFkeSBob2xkcyB0aGUgZGVjcnlwdGlvbiBrZXkuXG4gKi9cbmV4cG9ydCB0eXBlIFBheWxvYWRLZXkgPSBDcnlwdG9LZXkgfCBTZWFsVGFyZ2V0IHwgUnVuUGF5bG9hZEtleXM7XG5cbi8qKlxuICogVGhlIHN1YnNldCBvZiB7QGxpbmsgUGF5bG9hZEtleX0gdGhhdCBjYW4gYWN0dWFsbHkgKnJlYWQqIGEgcGF5bG9hZC5cbiAqXG4gKiBFeGNsdWRlcyB7QGxpbmsgU2VhbFRhcmdldH0sIHdoaWNoIGlzIHdyaXRlLW9ubHkgYnkgY29uc3RydWN0aW9uOiBpdCBob2xkcyBhXG4gKiBwdWJsaWMga2V5LCBzbyBpdCBjYW4gb3BlbiBuZWl0aGVyIGBlbmNwYCAobmVlZHMgdGhlIHByaXZhdGUgc2NhbGFyKSBub3JcbiAqIGBlbmNyYCAobmVlZHMgdGhlIHN5bW1ldHJpYyBrZXkpLiBEZWNyeXB0LXNpZGUgc2lnbmF0dXJlcyBzaG91bGQgdGFrZSB0aGlzXG4gKiByYXRoZXIgdGhhbiBgUGF5bG9hZEtleWAsIHNvIHBhc3NpbmcgYSBzZWFsIHRhcmdldCBpcyBhIGNvbXBpbGUgZXJyb3IgaW5zdGVhZFxuICogb2YgYSBndWFyYW50ZWVkIHJ1bnRpbWUgZmFpbHVyZS5cbiAqL1xuZXhwb3J0IHR5cGUgRGVjcnlwdGlvbktleSA9IENyeXB0b0tleSB8IFJ1blBheWxvYWRLZXlzO1xuXG4vKipcbiAqIEJ1aWxkIGEgd3JpdGUtb25seSBzZWFsIGNhcGFiaWxpdHkgZm9yIGEgcmVjaXBpZW50IHJ1bidzIHB1YmxpYyBrZXkuXG4gKlxuICogQHBhcmFtIHJlY2lwaWVudFB1YmxpY0tleSAtIFRoZSByZWNpcGllbnQgcnVuJ3MgcmF3IDMyLWJ5dGUgWDI1NTE5IHB1YmxpYyBrZXlcbiAqIEBwYXJhbSBhYWQgLSBBZGRpdGlvbmFsIGF1dGhlbnRpY2F0ZWQgZGF0YSwgY29udmVudGlvbmFsbHkgYHJ1bkFhZChwcm9qZWN0SWQsIHJ1bklkKWBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlYWxUbyhcbiAgcmVjaXBpZW50UHVibGljS2V5OiBVaW50OEFycmF5LFxuICBhYWQ/OiBVaW50OEFycmF5XG4pOiBTZWFsVGFyZ2V0IHtcbiAgcmV0dXJuIHsgW1NFQUxfVEFSR0VUX0JSQU5EXTogdHJ1ZSwgcmVjaXBpZW50UHVibGljS2V5LCBhYWQgfTtcbn1cblxuLyoqXG4gKiBCdW5kbGUgYSBydW4ncyBzeW1tZXRyaWMga2V5IHdpdGggdGhlIGtleXBhaXIgdGhhdCBvcGVucyBwYXlsb2FkcyBzZWFsZWRcbiAqIHRvIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcnVuUGF5bG9hZEtleXMoXG4gIGFlczogQ3J5cHRvS2V5LFxuICBrZXlQYWlyOiBSdW5LZXlQYWlyLFxuICBhYWQ/OiBVaW50OEFycmF5XG4pOiBSdW5QYXlsb2FkS2V5cyB7XG4gIHJldHVybiB7IFtSVU5fS0VZU19CUkFORF06IHRydWUsIGFlcywga2V5UGFpciwgYWFkIH07XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIGZ1bGwga2V5IGNhcGFiaWxpdHkgZm9yIGEgcnVuIGZyb20gaXRzIHJhdyAzMi1ieXRlIGtleSBtYXRlcmlhbCxcbiAqIHRoZSB2YWx1ZSBgV29ybGQuZ2V0RW5jcnlwdGlvbktleUZvclJ1bigpYCByZXR1cm5zLlxuICpcbiAqIFVzZSB0aGlzIGFueXdoZXJlIGEgcnVuIHJlYWRzIGl0cyBvd24gZXZlbnQgbG9nOiBpdCB5aWVsZHMgYSBrZXkgdGhhdCBvcGVuc1xuICogYm90aCBpdHMgb3duIHN5bW1ldHJpYyAoYGVuY3JgKSBwYXlsb2FkcyBhbmQgc2VhbGVkIChgZW5jcGApIHBheWxvYWRzIG90aGVyXG4gKiBydW5zIHdyb3RlIHRvIGl0LiBSZXNvbHZpbmcgb25seSBgaW1wb3J0S2V5KG1hdGVyaWFsKWAgd291bGQgbGVhdmUgdGhlXG4gKiByZWFkZXIgdW5hYmxlIHRvIG9wZW4gc2VhbGVkIHdyaXRlcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlcml2ZVJ1blBheWxvYWRLZXlzKFxuICBydW5LZXlNYXRlcmlhbDogVWludDhBcnJheVxuKTogUHJvbWlzZTxSdW5QYXlsb2FkS2V5cz4ge1xuICBjb25zdCBbYWVzLCBrZXlQYWlyXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBpbXBvcnRBZXNLZXkocnVuS2V5TWF0ZXJpYWwpLFxuICAgIGRlcml2ZVJ1bktleVBhaXIocnVuS2V5TWF0ZXJpYWwpLFxuICBdKTtcbiAgcmV0dXJuIHJ1blBheWxvYWRLZXlzKGFlcywga2V5UGFpcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1NlYWxUYXJnZXQodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBTZWFsVGFyZ2V0IHtcbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICAodmFsdWUgYXMgUGFydGlhbDxTZWFsVGFyZ2V0PilbU0VBTF9UQVJHRVRfQlJBTkRdID09PSB0cnVlXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1J1blBheWxvYWRLZXlzKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUnVuUGF5bG9hZEtleXMge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgICh2YWx1ZSBhcyBQYXJ0aWFsPFJ1blBheWxvYWRLZXlzPilbUlVOX0tFWVNfQlJBTkRdID09PSB0cnVlXG4gICk7XG59XG5cbi8qKlxuICogVGhlIHN5bW1ldHJpYyBrZXkgdG8gdXNlIGZvciBgZW5jcmAgb3BlcmF0aW9ucywgb3IgdW5kZWZpbmVkIHdoZW4gdGhpcyBrZXlcbiAqIGhhcyBubyBzeW1tZXRyaWMgY2FwYWJpbGl0eSAoaS5lLiBpdCBpcyBhIHNlYWwtb25seSB0YXJnZXQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWVzS2V5T2Yoa2V5OiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkKTogQ3J5cHRvS2V5IHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFrZXkpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmIChpc1J1blBheWxvYWRLZXlzKGtleSkpIHJldHVybiBrZXkuYWVzO1xuICBpZiAoaXNTZWFsVGFyZ2V0KGtleSkpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBrZXk7XG59XG5cbi8qKlxuICogRW5jcnlwdGlvbiBrZXkgcGFyYW1ldGVyIHR5cGUuIEFjY2VwdHMgYSByZXNvbHZlZCBrZXksIHVuZGVmaW5lZCAobm8gZW5jcnlwdGlvbiksXG4gKiBhIHByb21pc2UsIG9yIGEgcmVzb2x2ZXIgdGhhdCBjYW4gZGVmZXIgZmV0Y2hpbmcgdGhlIGtleSB1bnRpbCBkYXRhIG5lZWRzIGl0LlxuICovXG5leHBvcnQgdHlwZSBFbmNyeXB0aW9uS2V5UGFyYW0gPVxuICB8IFBheWxvYWRLZXlcbiAgfCB1bmRlZmluZWRcbiAgfCBQcm9taXNlPFBheWxvYWRLZXkgfCB1bmRlZmluZWQ+XG4gIHwgKCgpID0+IFByb21pc2U8UGF5bG9hZEtleSB8IHVuZGVmaW5lZD4pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUVuY3J5cHRpb25LZXkoXG4gIGtleTogRW5jcnlwdGlvbktleVBhcmFtXG4pOiBQcm9taXNlPFBheWxvYWRLZXkgfCB1bmRlZmluZWQ+IHtcbiAgcmV0dXJuIHR5cGVvZiBrZXkgPT09ICdmdW5jdGlvbicgPyBrZXkoKSA6IGtleTtcbn1cblxuLyoqXG4gKiBFbmNyeXB0IGEgZm9ybWF0LXByZWZpeGVkIHBheWxvYWQgaWYgYSBrZXkgaXMgcHJvdmlkZWQuXG4gKlxuICogV3JhcHMgdGhlIGRhdGEgd2l0aCB0aGUgYGVuY3JgIHByZWZpeCBmb3Igc3ltbWV0cmljIGtleXMsIG9yIHRoZSBgZW5jcGBcbiAqIHByZWZpeCB3aGVuIGhhbmRlZCBhIHtAbGluayBTZWFsVGFyZ2V0fSwgYSBjcm9zcy1ydW4gd3JpdGVyIHRoYXQgaG9sZHNcbiAqIG9ubHkgdGhlIHJlY2lwaWVudCdzIHB1YmxpYyBrZXkuXG4gKlxuICogQHBhcmFtIGRhdGEgLSBUaGUgZm9ybWF0LXByZWZpeGVkIHNlcmlhbGl6ZWQgZGF0YVxuICogQHBhcmFtIGtleSAtIEVuY3J5cHRpb24ga2V5ICh1bmRlZmluZWQgdG8gc2tpcCBlbmNyeXB0aW9uKVxuICogQHJldHVybnMgVGhlIGVuY3J5cHRlZCBkYXRhIHdpdGggaXRzIGZvcm1hdCBwcmVmaXgsIG9yIHRoZSBvcmlnaW5hbCBkYXRhIGlmIG5vIGtleVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5jcnlwdChcbiAgZGF0YTogVWludDhBcnJheSB8IHVua25vd24sXG4gIGtleTogUGF5bG9hZEtleSB8IHVuZGVmaW5lZFxuKTogUHJvbWlzZTxVaW50OEFycmF5IHwgdW5rbm93bj4ge1xuICBpZiAoIWtleSB8fCAhKGRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KSkgcmV0dXJuIGRhdGE7XG5cbiAgaWYgKGlzU2VhbFRhcmdldChrZXkpKSB7XG4gICAgY29uc3Qgc2VhbGVkID0gYXdhaXQgc2VhbFRvUHVibGljS2V5KGtleS5yZWNpcGllbnRQdWJsaWNLZXksIGRhdGEsIGtleS5hYWQpO1xuICAgIHJldHVybiBlbmNvZGVXaXRoRm9ybWF0UHJlZml4KFNlcmlhbGl6YXRpb25Gb3JtYXQuU0VBTEVELCBzZWFsZWQpO1xuICB9XG5cbiAgLy8gU3ltbWV0cmljIHBhdGg6IGEgcnVuJ3Mgb3duIHBheWxvYWRzLCBpbmNsdWRpbmcgd2hlbiB0aGUgY2FsbGVyIGhvbGRzXG4gIC8vIHRoZSBmdWxsIGBSdW5QYXlsb2FkS2V5c2AgYnVuZGxlIGFuZCAqY291bGQqIHNlYWwuIFNlZSBgUGF5bG9hZEtleWAuXG4gIGNvbnN0IGFlc0tleSA9IGlzUnVuUGF5bG9hZEtleXMoa2V5KSA/IGtleS5hZXMgOiBrZXk7XG4gIGNvbnN0IGVuY3J5cHRlZCA9IGF3YWl0IGFlc0djbUVuY3J5cHQoYWVzS2V5LCBkYXRhKTtcbiAgcmV0dXJuIGVuY29kZVdpdGhGb3JtYXRQcmVmaXgoU2VyaWFsaXphdGlvbkZvcm1hdC5FTkNSWVBURUQsIGVuY3J5cHRlZCk7XG59XG5cbi8qKlxuICogRGVjcnlwdCBhIGZvcm1hdC1wcmVmaXhlZCBwYXlsb2FkIGlmIGl0J3MgZW5jcnlwdGVkIG9yIHNlYWxlZC5cbiAqXG4gKiBTdHJpcHMgdGhlIGBlbmNyYC9gZW5jcGAgZm9ybWF0IHByZWZpeCBhbmQgcmVjb3ZlcnMgdGhlIGlubmVyIHBheWxvYWQuXG4gKiBPcGVuaW5nIGEgc2VhbGVkIChgZW5jcGApIHBheWxvYWQgcmVxdWlyZXMgdGhlIHJ1bidzIFgyNTUxOSBrZXlwYWlyLCBzbyB0aGVcbiAqIGNhbGxlciBtdXN0IHN1cHBseSB7QGxpbmsgUnVuUGF5bG9hZEtleXN9OyBhIGJhcmUgc3ltbWV0cmljIGtleSBjYW5ub3QgZG9cbiAqIGl0LCBhbmQgbmVpdGhlciBjYW4gYSB7QGxpbmsgU2VhbFRhcmdldH0gKHdoaWNoIGlzIHdyaXRlLW9ubHkgYnkgZGVzaWduKS5cbiAqXG4gKiBAcGFyYW0gZGF0YSAtIFRoZSBwb3RlbnRpYWxseSBlbmNyeXB0ZWQgZGF0YVxuICogQHBhcmFtIGtleSAtIEVuY3J5cHRpb24ga2V5ICh1bmRlZmluZWQgdG8gc2tpcCBkZWNyeXB0aW9uKVxuICogQHJldHVybnMgVGhlIGRlY3J5cHRlZCBpbm5lciBwYXlsb2FkLCBvciB0aGUgb3JpZ2luYWwgZGF0YSBpZiBub3QgZW5jcnlwdGVkXG4gKi9cbi8qKlxuICogT3BlbiBhIHNlYWxlZCAoYGVuY3BgKSBlbnZlbG9wZS4gU3BsaXQgb3V0IGZyb20ge0BsaW5rIGRlY3J5cHR9IHRvIGtlZXBcbiAqIGVhY2ggc2NoZW1lJ3MgZXJyb3IgaGFuZGxpbmcgcmVhZGFibGUgb24gaXRzIG93bi5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gb3BlblNlYWxlZEVudmVsb3BlKFxuICBkYXRhOiBVaW50OEFycmF5LFxuICBrZXk6IFBheWxvYWRLZXkgfCB1bmRlZmluZWRcbik6IFByb21pc2U8VWludDhBcnJheT4ge1xuICAvLyBTZWFsZWQgcGF5bG9hZHMgbmVlZCB0aGUgcHJpdmF0ZSBzY2FsYXIuIEFueXRoaW5nIGVsc2UgKG5vIGtleSwgYSBiYXJlXG4gIC8vIHN5bW1ldHJpYyBrZXksIG9yIGEgd3JpdGUtb25seSBzZWFsIHRhcmdldCkgY2Fubm90IG9wZW4gdGhlbS5cbiAgaWYgKCFpc1J1blBheWxvYWRLZXlzKGtleSkpIHtcbiAgICB0aHJvdyBuZXcgUnVudGltZURlY3J5cHRpb25FcnJvcihcbiAgICAgICdTZWFsZWQgZGF0YSBlbmNvdW50ZXJlZCBidXQgbm8gcnVuIGtleXBhaXIgaXMgYXZhaWxhYmxlLiAnICtcbiAgICAgICAgXCJPcGVuaW5nIGEgc2VhbGVkIHBheWxvYWQgcmVxdWlyZXMgdGhlIHJ1bidzIG93biBlbmNyeXB0aW9uIGtleSBcIiArXG4gICAgICAgICdtYXRlcmlhbDsgYSBzeW1tZXRyaWMga2V5IG9yIGEgc2VhbC1vbmx5IHRhcmdldCBjYW5ub3QgZGVjcnlwdCBpdC4nLFxuICAgICAge1xuICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgb3BlcmF0aW9uOiAnZGVjcnlwdCcsXG4gICAgICAgICAgYnl0ZUxlbmd0aDogZGF0YS5ieXRlTGVuZ3RoLFxuICAgICAgICAgIGZvcm1hdFByZWZpeDogJ2VuY3AnLFxuICAgICAgICB9LFxuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBjb25zdCB7IHBheWxvYWQgfSA9IGRlY29kZUZvcm1hdFByZWZpeChkYXRhKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgb3BlblNlYWxlZChrZXkua2V5UGFpciwgcGF5bG9hZCwga2V5LmFhZCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gVGhlIHNlYWxlZC1ib3ggbGF5ZXIgb25seSBzZWVzIHRoZSBzdHJpcHBlZCBwYXlsb2FkLCBzbyBpdCBjYW5ub3RcbiAgICAvLyByZWNvcmQgdGhlIG91dGVyIGVudmVsb3BlIHByZWZpeC4gRW5yaWNoIGl0IGhlcmUgYmVmb3JlIHJldGhyb3dpbmcuXG4gICAgaWYgKFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3IuaXMoZXJyb3IpICYmIGVycm9yLmNvbnRleHQpIHtcbiAgICAgIGVycm9yLmNvbnRleHQuZm9ybWF0UHJlZml4ID0gU2VyaWFsaXphdGlvbkZvcm1hdC5TRUFMRUQ7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWNyeXB0KFxuICBkYXRhOiBVaW50OEFycmF5IHwgdW5rbm93bixcbiAga2V5OiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkXG4pOiBQcm9taXNlPFVpbnQ4QXJyYXkgfCB1bmtub3duPiB7XG4gIC8vIE5vbi1iaW5hcnkgZGF0YSBpcyByZXR1cm5lZCBhcy1pcy5cbiAgaWYgKCEoZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSByZXR1cm4gZGF0YTtcblxuICBjb25zdCBmb3JtYXQgPSBwZWVrRm9ybWF0UHJlZml4KGRhdGEpO1xuXG4gIGlmIChmb3JtYXQgPT09IFNlcmlhbGl6YXRpb25Gb3JtYXQuU0VBTEVEKSB7XG4gICAgcmV0dXJuIG9wZW5TZWFsZWRFbnZlbG9wZShkYXRhLCBrZXkpO1xuICB9XG5cbiAgLy8gSWYgdGhlIGRhdGEgaXMgbm90IGVuY3J5cHRlZCwgcmV0dXJuIGl0IHVuY2hhbmdlZC5cbiAgaWYgKGZvcm1hdCAhPT0gU2VyaWFsaXphdGlvbkZvcm1hdC5FTkNSWVBURUQpIHJldHVybiBkYXRhO1xuXG4gIC8vIElmIHRoZSBkYXRhIGlzIGVuY3J5cHRlZCBidXQgbm8gc3ltbWV0cmljIGtleSBpcyBhdmFpbGFibGUsIGZhaWwgZmFzdC5cbiAgY29uc3QgYWVzS2V5ID0gYWVzS2V5T2Yoa2V5KTtcbiAgaWYgKCFhZXNLZXkpIHtcbiAgICB0aHJvdyBuZXcgUnVudGltZURlY3J5cHRpb25FcnJvcihcbiAgICAgICdFbmNyeXB0ZWQgZGF0YSBlbmNvdW50ZXJlZCBidXQgbm8gZW5jcnlwdGlvbiBrZXkgaXMgYXZhaWxhYmxlLiAnICtcbiAgICAgICAgJ0VuY3J5cHRpb24gaXMgbm90IGNvbmZpZ3VyZWQgb3Igbm8ga2V5IHdhcyBwcm92aWRlZCBmb3IgdGhpcyBydW4uJyxcbiAgICAgIHtcbiAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgIG9wZXJhdGlvbjogJ2RlY3J5cHQnLFxuICAgICAgICAgIGJ5dGVMZW5ndGg6IGRhdGEuYnl0ZUxlbmd0aCxcbiAgICAgICAgICBmb3JtYXRQcmVmaXg6ICdlbmNyJyxcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgY29uc3QgeyBwYXlsb2FkIH0gPSBkZWNvZGVGb3JtYXRQcmVmaXgoZGF0YSk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGFlc0djbURlY3J5cHQoYWVzS2V5LCBwYXlsb2FkKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBUaGUgbG93LWxldmVsIEFFUyBsYXllciBvbmx5IHNlZXMgdGhlIHN0cmlwcGVkIHBheWxvYWQsIHNvIGl0IGNhbm5vdFxuICAgIC8vIHJlY29yZCB0aGUgb3V0ZXIgZW52ZWxvcGUgcHJlZml4LiBUaGlzIGxheWVyIHBlZWtlZCBpdCAoYGVuY3JgKSwgc29cbiAgICAvLyBlbnJpY2ggdGhlIGRpYWdub3N0aWMgY29udGV4dCB3aXRoIHRoZSByZWFsIGZvcm1hdCBwcmVmaXggYmVmb3JlXG4gICAgLy8gcmV0aHJvd2luZy5cbiAgICBpZiAoUnVudGltZURlY3J5cHRpb25FcnJvci5pcyhlcnJvcikgJiYgZXJyb3IuY29udGV4dCkge1xuICAgICAgZXJyb3IuY29udGV4dC5mb3JtYXRQcmVmaXggPSBmb3JtYXQ7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG4iXX0=
@@ -9,6 +9,19 @@
9
9
  * through the standard friendly-errors framing instead of being baked
10
10
  * into the message string.
11
11
  */
12
+ /**
13
+ * Rethrow SDK runtime errors that must not be reframed as
14
+ * `SerializationError`.
15
+ *
16
+ * The serialize/dehydrate wrappers catch every throw and reframe it as a
17
+ * `SerializationError` (which classifies as `USER_ERROR`). That's correct
18
+ * for genuine serialization failures, but a `RuntimeDecryptionError` from
19
+ * the AES-GCM layer is an SDK-internal failure that must keep its identity
20
+ * so the run-failure classifier routes it to `RUNTIME_ERROR`. Call this at
21
+ * the top of each serialize catch block to let those errors propagate
22
+ * unchanged.
23
+ */
24
+ export declare function rethrowIfRuntimeError(error: unknown): void;
12
25
  /**
13
26
  * Format a serialization error with context about what failed.
14
27
  * Extracts path, value, and reason from devalue's DevalueError when available.
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/serialization/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,OAAO,GACb;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAqBnC"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/serialization/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAI1D;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,OAAO,GACb;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAqBnC"}
@@ -9,8 +9,26 @@
9
9
  * through the standard friendly-errors framing instead of being baked
10
10
  * into the message string.
11
11
  */
12
+ import { RuntimeDecryptionError } from '@workflow/errors';
12
13
  import { DevalueError } from 'devalue';
13
14
  import { runtimeLogger } from '../logger.js';
15
+ /**
16
+ * Rethrow SDK runtime errors that must not be reframed as
17
+ * `SerializationError`.
18
+ *
19
+ * The serialize/dehydrate wrappers catch every throw and reframe it as a
20
+ * `SerializationError` (which classifies as `USER_ERROR`). That's correct
21
+ * for genuine serialization failures, but a `RuntimeDecryptionError` from
22
+ * the AES-GCM layer is an SDK-internal failure that must keep its identity
23
+ * so the run-failure classifier routes it to `RUNTIME_ERROR`. Call this at
24
+ * the top of each serialize catch block to let those errors propagate
25
+ * unchanged.
26
+ */
27
+ export function rethrowIfRuntimeError(error) {
28
+ if (RuntimeDecryptionError.is(error)) {
29
+ throw error;
30
+ }
31
+ }
14
32
  /**
15
33
  * Format a serialization error with context about what failed.
16
34
  * Extracts path, value, and reason from devalue's DevalueError when available.
@@ -24,7 +42,7 @@ export function formatSerializationError(context, error) {
24
42
  if (error instanceof DevalueError && error.path) {
25
43
  message += ` at path "${error.path}"`;
26
44
  }
27
- // Workflow can serialize a much richer set than the devalue defaults
45
+ // Workflow can serialize a much richer set than the devalue defaults:
28
46
  // classes registered via `WORKFLOW_SERIALIZE`, FatalError / RetryableError
29
47
  // subclasses, AbortSignal, etc. Pointing at the foundations doc keeps
30
48
  // this hint accurate as the supported set grows, instead of repeating
@@ -38,4 +56,4 @@ export function formatSerializationError(context, error) {
38
56
  }
39
57
  return { message, hint };
40
58
  }
41
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcmlhbGl6YXRpb24vZXJyb3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFFSCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFN0M7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSx3QkFBd0IsQ0FDdEMsT0FBZSxFQUNmLEtBQWM7SUFFZCxxRUFBcUU7SUFDckUsNkRBQTZEO0lBQzdELE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3hFLElBQUksT0FBTyxHQUFHLHVCQUF1QixPQUFPLEVBQUUsQ0FBQztJQUMvQyxJQUFJLEtBQUssWUFBWSxZQUFZLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2hELE9BQU8sSUFBSSxhQUFhLEtBQUssQ0FBQyxJQUFJLEdBQUcsQ0FBQztJQUN4QyxDQUFDO0lBQ0QsdUVBQXVFO0lBQ3ZFLDJFQUEyRTtJQUMzRSxzRUFBc0U7SUFDdEUsc0VBQXNFO0lBQ3RFLDRDQUE0QztJQUM1QyxNQUFNLElBQUksR0FBRyxpQkFBaUIsSUFBSSxnSkFBZ0osQ0FBQztJQUNuTCxJQUFJLEtBQUssWUFBWSxZQUFZLElBQUksS0FBSyxDQUFDLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUMvRCxhQUFhLENBQUMsS0FBSyxDQUFDLHNCQUFzQixFQUFFO1lBQzFDLE9BQU87WUFDUCxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsS0FBSztTQUM5QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUMzQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTaGFyZWQgZXJyb3IgZm9ybWF0dGluZyB1dGlsaXR5IGZvciBzZXJpYWxpemF0aW9uIGZhaWx1cmVzLlxuICpcbiAqIFVzZWQgYnkgdGhlIG1vZGUtc3BlY2lmaWMgc2VyaWFsaXplcnMgKHdvcmtmbG93LCBzdGVwLCBjbGllbnQpIHRvXG4gKiBwcm9kdWNlIGNvbnNpc3RlbnQgZXJyb3IgbWVzc2FnZXMgd2l0aCBkZXZhbHVlIHBhdGggaW5mb3JtYXRpb24uXG4gKlxuICogUmV0dXJucyBhIGB7IG1lc3NhZ2UsIGhpbnQgfWAgcGFpciBzbyBjYWxsZXJzIGNhbiB0aHJvdyBhXG4gKiBgU2VyaWFsaXphdGlvbkVycm9yKG1lc3NhZ2UsIHsgaGludCwgY2F1c2UgfSlgIGFuZCBoYXZlIHRoZSBoaW50IGZsb3dcbiAqIHRocm91Z2ggdGhlIHN0YW5kYXJkIGZyaWVuZGx5LWVycm9ycyBmcmFtaW5nIGluc3RlYWQgb2YgYmVpbmcgYmFrZWRcbiAqIGludG8gdGhlIG1lc3NhZ2Ugc3RyaW5nLlxuICovXG5cbmltcG9ydCB7IERldmFsdWVFcnJvciB9IGZyb20gJ2RldmFsdWUnO1xuaW1wb3J0IHsgcnVudGltZUxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5cbi8qKlxuICogRm9ybWF0IGEgc2VyaWFsaXphdGlvbiBlcnJvciB3aXRoIGNvbnRleHQgYWJvdXQgd2hhdCBmYWlsZWQuXG4gKiBFeHRyYWN0cyBwYXRoLCB2YWx1ZSwgYW5kIHJlYXNvbiBmcm9tIGRldmFsdWUncyBEZXZhbHVlRXJyb3Igd2hlbiBhdmFpbGFibGUuXG4gKiBMb2dzIHRoZSBwcm9ibGVtYXRpYyB2YWx1ZSB0byB0aGUgY29uc29sZSBmb3IgYmV0dGVyIGRlYnVnZ2luZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFNlcmlhbGl6YXRpb25FcnJvcihcbiAgY29udGV4dDogc3RyaW5nLFxuICBlcnJvcjogdW5rbm93blxuKTogeyBtZXNzYWdlOiBzdHJpbmc7IGhpbnQ6IHN0cmluZyB9IHtcbiAgLy8gYHJldHVybmluZ2AgZm9yIG91dHB1dHMsIGBwYXNzaW5nYCBmb3IgZXZlcnl0aGluZyB0aGF0IGNyb3NzZXMgdGhlXG4gIC8vIGJvdW5kYXJ5IHRoZSBvdGhlciB3YXkgKGFyZ3VtZW50cywgc3RyZWFtIG1lc3NhZ2VzLCBldGMuKS5cbiAgY29uc3QgdmVyYiA9IGNvbnRleHQuaW5jbHVkZXMoJ3JldHVybiB2YWx1ZScpID8gJ3JldHVybmluZycgOiAncGFzc2luZyc7XG4gIGxldCBtZXNzYWdlID0gYEZhaWxlZCB0byBzZXJpYWxpemUgJHtjb250ZXh0fWA7XG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIERldmFsdWVFcnJvciAmJiBlcnJvci5wYXRoKSB7XG4gICAgbWVzc2FnZSArPSBgIGF0IHBhdGggXCIke2Vycm9yLnBhdGh9XCJgO1xuICB9XG4gIC8vIFdvcmtmbG93IGNhbiBzZXJpYWxpemUgYSBtdWNoIHJpY2hlciBzZXQgdGhhbiB0aGUgZGV2YWx1ZSBkZWZhdWx0cyDigJRcbiAgLy8gY2xhc3NlcyByZWdpc3RlcmVkIHZpYSBgV09SS0ZMT1dfU0VSSUFMSVpFYCwgRmF0YWxFcnJvciAvIFJldHJ5YWJsZUVycm9yXG4gIC8vIHN1YmNsYXNzZXMsIEFib3J0U2lnbmFsLCBldGMuIFBvaW50aW5nIGF0IHRoZSBmb3VuZGF0aW9ucyBkb2Mga2VlcHNcbiAgLy8gdGhpcyBoaW50IGFjY3VyYXRlIGFzIHRoZSBzdXBwb3J0ZWQgc2V0IGdyb3dzLCBpbnN0ZWFkIG9mIHJlcGVhdGluZ1xuICAvLyBhIGhhcmRjb2RlZCBsaXN0IHRoYXQgZHJpZnRzIG91dCBvZiBzeW5jLlxuICBjb25zdCBoaW50ID0gYEVuc3VyZSB5b3UncmUgJHt2ZXJifSB3b3JrZmxvdyBzZXJpYWxpemFibGUgdHlwZXMuIENoZWNrIHRoZSBzZXJpYWxpemF0aW9uIGRvY3MgdG8gc2VlIHdoYXQncyBzZXJpYWxpemFibGU6IGh0dHBzOi8vd29ya2Zsb3ctc2RrLmRldi9kb2NzL2ZvdW5kYXRpb25zL3NlcmlhbGl6YXRpb25gO1xuICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBEZXZhbHVlRXJyb3IgJiYgZXJyb3IudmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgIHJ1bnRpbWVMb2dnZXIuZXJyb3IoJ1NlcmlhbGl6YXRpb24gZmFpbGVkJywge1xuICAgICAgY29udGV4dCxcbiAgICAgIHByb2JsZW1hdGljVmFsdWU6IGVycm9yLnZhbHVlLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiB7IG1lc3NhZ2UsIGhpbnQgfTtcbn1cbiJdfQ==
59
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcmlhbGl6YXRpb24vZXJyb3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFFSCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFN0M7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQUMsS0FBYztJQUNsRCxJQUFJLHNCQUFzQixDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sS0FBSyxDQUFDO0lBQ2QsQ0FBQztBQUNILENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLHdCQUF3QixDQUN0QyxPQUFlLEVBQ2YsS0FBYztJQUVkLHFFQUFxRTtJQUNyRSw2REFBNkQ7SUFDN0QsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDeEUsSUFBSSxPQUFPLEdBQUcsdUJBQXVCLE9BQU8sRUFBRSxDQUFDO0lBQy9DLElBQUksS0FBSyxZQUFZLFlBQVksSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDaEQsT0FBTyxJQUFJLGFBQWEsS0FBSyxDQUFDLElBQUksR0FBRyxDQUFDO0lBQ3hDLENBQUM7SUFDRCxzRUFBc0U7SUFDdEUsMkVBQTJFO0lBQzNFLHNFQUFzRTtJQUN0RSxzRUFBc0U7SUFDdEUsNENBQTRDO0lBQzVDLE1BQU0sSUFBSSxHQUFHLGlCQUFpQixJQUFJLGdKQUFnSixDQUFDO0lBQ25MLElBQUksS0FBSyxZQUFZLFlBQVksSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQy9ELGFBQWEsQ0FBQyxLQUFLLENBQUMsc0JBQXNCLEVBQUU7WUFDMUMsT0FBTztZQUNQLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxLQUFLO1NBQzlCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDO0FBQzNCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNoYXJlZCBlcnJvciBmb3JtYXR0aW5nIHV0aWxpdHkgZm9yIHNlcmlhbGl6YXRpb24gZmFpbHVyZXMuXG4gKlxuICogVXNlZCBieSB0aGUgbW9kZS1zcGVjaWZpYyBzZXJpYWxpemVycyAod29ya2Zsb3csIHN0ZXAsIGNsaWVudCkgdG9cbiAqIHByb2R1Y2UgY29uc2lzdGVudCBlcnJvciBtZXNzYWdlcyB3aXRoIGRldmFsdWUgcGF0aCBpbmZvcm1hdGlvbi5cbiAqXG4gKiBSZXR1cm5zIGEgYHsgbWVzc2FnZSwgaGludCB9YCBwYWlyIHNvIGNhbGxlcnMgY2FuIHRocm93IGFcbiAqIGBTZXJpYWxpemF0aW9uRXJyb3IobWVzc2FnZSwgeyBoaW50LCBjYXVzZSB9KWAgYW5kIGhhdmUgdGhlIGhpbnQgZmxvd1xuICogdGhyb3VnaCB0aGUgc3RhbmRhcmQgZnJpZW5kbHktZXJyb3JzIGZyYW1pbmcgaW5zdGVhZCBvZiBiZWluZyBiYWtlZFxuICogaW50byB0aGUgbWVzc2FnZSBzdHJpbmcuXG4gKi9cblxuaW1wb3J0IHsgUnVudGltZURlY3J5cHRpb25FcnJvciB9IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHsgRGV2YWx1ZUVycm9yIH0gZnJvbSAnZGV2YWx1ZSc7XG5pbXBvcnQgeyBydW50aW1lTG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcblxuLyoqXG4gKiBSZXRocm93IFNESyBydW50aW1lIGVycm9ycyB0aGF0IG11c3Qgbm90IGJlIHJlZnJhbWVkIGFzXG4gKiBgU2VyaWFsaXphdGlvbkVycm9yYC5cbiAqXG4gKiBUaGUgc2VyaWFsaXplL2RlaHlkcmF0ZSB3cmFwcGVycyBjYXRjaCBldmVyeSB0aHJvdyBhbmQgcmVmcmFtZSBpdCBhcyBhXG4gKiBgU2VyaWFsaXphdGlvbkVycm9yYCAod2hpY2ggY2xhc3NpZmllcyBhcyBgVVNFUl9FUlJPUmApLiBUaGF0J3MgY29ycmVjdFxuICogZm9yIGdlbnVpbmUgc2VyaWFsaXphdGlvbiBmYWlsdXJlcywgYnV0IGEgYFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3JgIGZyb21cbiAqIHRoZSBBRVMtR0NNIGxheWVyIGlzIGFuIFNESy1pbnRlcm5hbCBmYWlsdXJlIHRoYXQgbXVzdCBrZWVwIGl0cyBpZGVudGl0eVxuICogc28gdGhlIHJ1bi1mYWlsdXJlIGNsYXNzaWZpZXIgcm91dGVzIGl0IHRvIGBSVU5USU1FX0VSUk9SYC4gQ2FsbCB0aGlzIGF0XG4gKiB0aGUgdG9wIG9mIGVhY2ggc2VyaWFsaXplIGNhdGNoIGJsb2NrIHRvIGxldCB0aG9zZSBlcnJvcnMgcHJvcGFnYXRlXG4gKiB1bmNoYW5nZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXRocm93SWZSdW50aW1lRXJyb3IoZXJyb3I6IHVua25vd24pOiB2b2lkIHtcbiAgaWYgKFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3IuaXMoZXJyb3IpKSB7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuLyoqXG4gKiBGb3JtYXQgYSBzZXJpYWxpemF0aW9uIGVycm9yIHdpdGggY29udGV4dCBhYm91dCB3aGF0IGZhaWxlZC5cbiAqIEV4dHJhY3RzIHBhdGgsIHZhbHVlLCBhbmQgcmVhc29uIGZyb20gZGV2YWx1ZSdzIERldmFsdWVFcnJvciB3aGVuIGF2YWlsYWJsZS5cbiAqIExvZ3MgdGhlIHByb2JsZW1hdGljIHZhbHVlIHRvIHRoZSBjb25zb2xlIGZvciBiZXR0ZXIgZGVidWdnaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0U2VyaWFsaXphdGlvbkVycm9yKFxuICBjb250ZXh0OiBzdHJpbmcsXG4gIGVycm9yOiB1bmtub3duXG4pOiB7IG1lc3NhZ2U6IHN0cmluZzsgaGludDogc3RyaW5nIH0ge1xuICAvLyBgcmV0dXJuaW5nYCBmb3Igb3V0cHV0cywgYHBhc3NpbmdgIGZvciBldmVyeXRoaW5nIHRoYXQgY3Jvc3NlcyB0aGVcbiAgLy8gYm91bmRhcnkgdGhlIG90aGVyIHdheSAoYXJndW1lbnRzLCBzdHJlYW0gbWVzc2FnZXMsIGV0Yy4pLlxuICBjb25zdCB2ZXJiID0gY29udGV4dC5pbmNsdWRlcygncmV0dXJuIHZhbHVlJykgPyAncmV0dXJuaW5nJyA6ICdwYXNzaW5nJztcbiAgbGV0IG1lc3NhZ2UgPSBgRmFpbGVkIHRvIHNlcmlhbGl6ZSAke2NvbnRleHR9YDtcbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgRGV2YWx1ZUVycm9yICYmIGVycm9yLnBhdGgpIHtcbiAgICBtZXNzYWdlICs9IGAgYXQgcGF0aCBcIiR7ZXJyb3IucGF0aH1cImA7XG4gIH1cbiAgLy8gV29ya2Zsb3cgY2FuIHNlcmlhbGl6ZSBhIG11Y2ggcmljaGVyIHNldCB0aGFuIHRoZSBkZXZhbHVlIGRlZmF1bHRzOlxuICAvLyBjbGFzc2VzIHJlZ2lzdGVyZWQgdmlhIGBXT1JLRkxPV19TRVJJQUxJWkVgLCBGYXRhbEVycm9yIC8gUmV0cnlhYmxlRXJyb3JcbiAgLy8gc3ViY2xhc3NlcywgQWJvcnRTaWduYWwsIGV0Yy4gUG9pbnRpbmcgYXQgdGhlIGZvdW5kYXRpb25zIGRvYyBrZWVwc1xuICAvLyB0aGlzIGhpbnQgYWNjdXJhdGUgYXMgdGhlIHN1cHBvcnRlZCBzZXQgZ3Jvd3MsIGluc3RlYWQgb2YgcmVwZWF0aW5nXG4gIC8vIGEgaGFyZGNvZGVkIGxpc3QgdGhhdCBkcmlmdHMgb3V0IG9mIHN5bmMuXG4gIGNvbnN0IGhpbnQgPSBgRW5zdXJlIHlvdSdyZSAke3ZlcmJ9IHdvcmtmbG93IHNlcmlhbGl6YWJsZSB0eXBlcy4gQ2hlY2sgdGhlIHNlcmlhbGl6YXRpb24gZG9jcyB0byBzZWUgd2hhdCdzIHNlcmlhbGl6YWJsZTogaHR0cHM6Ly93b3JrZmxvdy1zZGsuZGV2L2RvY3MvZm91bmRhdGlvbnMvc2VyaWFsaXphdGlvbmA7XG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIERldmFsdWVFcnJvciAmJiBlcnJvci52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcnVudGltZUxvZ2dlci5lcnJvcignU2VyaWFsaXphdGlvbiBmYWlsZWQnLCB7XG4gICAgICBjb250ZXh0LFxuICAgICAgcHJvYmxlbWF0aWNWYWx1ZTogZXJyb3IudmFsdWUsXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHsgbWVzc2FnZSwgaGludCB9O1xufVxuIl19
@@ -4,14 +4,14 @@
4
4
  * All serialized payloads are prefixed with a 4-byte format identifier that
5
5
  * allows the deserializer to determine how to decode the payload. This enables:
6
6
  *
7
- * 1. Self-describing payloads the World layer is agnostic to serialization format
8
- * 2. Gradual migration old runs keep working, new runs can use new formats
9
- * 3. Composability encryption can wrap any format ("encr" wrapping "devl")
10
- * 4. Debugging raw data inspection immediately reveals the format
7
+ * 1. Self-describing payloads: the World layer is agnostic to serialization format
8
+ * 2. Gradual migration: old runs keep working, new runs can use new formats
9
+ * 3. Composability: encryption can wrap any format ("encr" wrapping "devl")
10
+ * 4. Debugging: raw data inspection immediately reveals the format
11
11
  *
12
12
  * Format: [4 bytes: format identifier][payload]
13
13
  *
14
- * The format prefix is open-ended any 4-character [a-z0-9] string is valid.
14
+ * The format prefix is open-ended: any 4-character [a-z0-9] string is valid.
15
15
  * This allows new codecs to be added without modifying this module.
16
16
  */
17
17
  import { type FormatPrefix } from './types.js';
@@ -43,7 +43,7 @@ export declare function isEncrypted(data: Uint8Array | unknown): boolean;
43
43
  *
44
44
  * Unlike the legacy implementation which only accepted known formats
45
45
  * (`devl`, `encr`), this function accepts any valid format prefix
46
- * (`[a-z0-9]{4}`). This is intentional for forward compatibility
46
+ * (`[a-z0-9]{4}`). This is intentional for forward compatibility, so
47
47
  * new codecs (e.g. `cbor`) can be added without modifying this module.
48
48
  * Callers are responsible for checking whether they support the returned
49
49
  * format and throwing an appropriate error if not (e.g. "Unsupported
@@ -4,14 +4,14 @@
4
4
  * All serialized payloads are prefixed with a 4-byte format identifier that
5
5
  * allows the deserializer to determine how to decode the payload. This enables:
6
6
  *
7
- * 1. Self-describing payloads the World layer is agnostic to serialization format
8
- * 2. Gradual migration old runs keep working, new runs can use new formats
9
- * 3. Composability encryption can wrap any format ("encr" wrapping "devl")
10
- * 4. Debugging raw data inspection immediately reveals the format
7
+ * 1. Self-describing payloads: the World layer is agnostic to serialization format
8
+ * 2. Gradual migration: old runs keep working, new runs can use new formats
9
+ * 3. Composability: encryption can wrap any format ("encr" wrapping "devl")
10
+ * 4. Debugging: raw data inspection immediately reveals the format
11
11
  *
12
12
  * Format: [4 bytes: format identifier][payload]
13
13
  *
14
- * The format prefix is open-ended any 4-character [a-z0-9] string is valid.
14
+ * The format prefix is open-ended: any 4-character [a-z0-9] string is valid.
15
15
  * This allows new codecs to be added without modifying this module.
16
16
  */
17
17
  import { isFormatPrefix, SerializationFormat, } from './types.js';
@@ -65,7 +65,7 @@ export function isEncrypted(data) {
65
65
  *
66
66
  * Unlike the legacy implementation which only accepted known formats
67
67
  * (`devl`, `encr`), this function accepts any valid format prefix
68
- * (`[a-z0-9]{4}`). This is intentional for forward compatibility
68
+ * (`[a-z0-9]{4}`). This is intentional for forward compatibility, so
69
69
  * new codecs (e.g. `cbor`) can be added without modifying this module.
70
70
  * Callers are responsible for checking whether they support the returned
71
71
  * format and throwing an appropriate error if not (e.g. "Unsupported
@@ -94,4 +94,4 @@ export function decodeFormatPrefix(data) {
94
94
  const payload = data.subarray(FORMAT_PREFIX_LENGTH);
95
95
  return { format: str, payload };
96
96
  }
97
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcmlhbGl6YXRpb24vZm9ybWF0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFFTCxjQUFjLEVBQ2QsbUJBQW1CLEdBQ3BCLE1BQU0sWUFBWSxDQUFDO0FBRXBCLDJDQUEyQztBQUMzQyxNQUFNLG9CQUFvQixHQUFHLENBQUMsQ0FBQztBQUUvQixNQUFNLGFBQWEsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO0FBQ3hDLE1BQU0sYUFBYSxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7QUFFeEM7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLHNCQUFzQixDQUNwQyxNQUFvQixFQUNwQixPQUE2QjtJQUU3QixJQUFJLENBQUMsQ0FBQyxPQUFPLFlBQVksVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUNyQyxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQsTUFBTSxXQUFXLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNqRCxNQUFNLE1BQU0sR0FBRyxJQUFJLFVBQVUsQ0FBQyxvQkFBb0IsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDckUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDM0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztJQUMxQyxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUM5QixJQUEwQjtJQUUxQixJQUFJLENBQUMsQ0FBQyxJQUFJLFlBQVksVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxvQkFBb0IsRUFBRSxDQUFDO1FBQ3hFLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLG9CQUFvQixDQUFDLENBQUM7SUFDM0QsTUFBTSxHQUFHLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUM5QyxPQUFPLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDMUMsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FBQyxJQUEwQjtJQUNwRCxPQUFPLGdCQUFnQixDQUFDLElBQUksQ0FBQyxLQUFLLG1CQUFtQixDQUFDLFNBQVMsQ0FBQztBQUNsRSxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsSUFBMEI7SUFJM0QsdUVBQXVFO0lBQ3ZFLElBQUksQ0FBQyxDQUFDLElBQUksWUFBWSxVQUFVLENBQUMsRUFBRSxDQUFDO1FBQ2xDLE9BQU87WUFDTCxNQUFNLEVBQUUsbUJBQW1CLENBQUMsVUFBVTtZQUN0QyxPQUFPLEVBQUUsSUFBSSxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN4RCxDQUFDO0lBQ0osQ0FBQztJQUVELElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxvQkFBb0IsRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sSUFBSSxLQUFLLENBQ2IsOERBQThELG9CQUFvQixlQUFlLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FDL0csQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO0lBQzNELE1BQU0sR0FBRyxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7SUFFOUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQ2IsMkJBQTJCLEdBQUcsc0NBQXNDLENBQ3JFLENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBQ3BELE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxDQUFDO0FBQ2xDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEZvcm1hdCBwcmVmaXggc3lzdGVtIGZvciBzZXJpYWxpemVkIHBheWxvYWRzLlxuICpcbiAqIEFsbCBzZXJpYWxpemVkIHBheWxvYWRzIGFyZSBwcmVmaXhlZCB3aXRoIGEgNC1ieXRlIGZvcm1hdCBpZGVudGlmaWVyIHRoYXRcbiAqIGFsbG93cyB0aGUgZGVzZXJpYWxpemVyIHRvIGRldGVybWluZSBob3cgdG8gZGVjb2RlIHRoZSBwYXlsb2FkLiBUaGlzIGVuYWJsZXM6XG4gKlxuICogMS4gU2VsZi1kZXNjcmliaW5nIHBheWxvYWRzIOKAlCB0aGUgV29ybGQgbGF5ZXIgaXMgYWdub3N0aWMgdG8gc2VyaWFsaXphdGlvbiBmb3JtYXRcbiAqIDIuIEdyYWR1YWwgbWlncmF0aW9uIOKAlCBvbGQgcnVucyBrZWVwIHdvcmtpbmcsIG5ldyBydW5zIGNhbiB1c2UgbmV3IGZvcm1hdHNcbiAqIDMuIENvbXBvc2FiaWxpdHkg4oCUIGVuY3J5cHRpb24gY2FuIHdyYXAgYW55IGZvcm1hdCAoXCJlbmNyXCIgd3JhcHBpbmcgXCJkZXZsXCIpXG4gKiA0LiBEZWJ1Z2dpbmcg4oCUIHJhdyBkYXRhIGluc3BlY3Rpb24gaW1tZWRpYXRlbHkgcmV2ZWFscyB0aGUgZm9ybWF0XG4gKlxuICogRm9ybWF0OiBbNCBieXRlczogZm9ybWF0IGlkZW50aWZpZXJdW3BheWxvYWRdXG4gKlxuICogVGhlIGZvcm1hdCBwcmVmaXggaXMgb3Blbi1lbmRlZCDigJQgYW55IDQtY2hhcmFjdGVyIFthLXowLTldIHN0cmluZyBpcyB2YWxpZC5cbiAqIFRoaXMgYWxsb3dzIG5ldyBjb2RlY3MgdG8gYmUgYWRkZWQgd2l0aG91dCBtb2RpZnlpbmcgdGhpcyBtb2R1bGUuXG4gKi9cblxuaW1wb3J0IHtcbiAgdHlwZSBGb3JtYXRQcmVmaXgsXG4gIGlzRm9ybWF0UHJlZml4LFxuICBTZXJpYWxpemF0aW9uRm9ybWF0LFxufSBmcm9tICcuL3R5cGVzLmpzJztcblxuLyoqIExlbmd0aCBvZiB0aGUgZm9ybWF0IHByZWZpeCBpbiBieXRlcyAqL1xuY29uc3QgRk9STUFUX1BSRUZJWF9MRU5HVEggPSA0O1xuXG5jb25zdCBmb3JtYXRFbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG5jb25zdCBmb3JtYXREZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG5cbi8qKlxuICogRW5jb2RlIGEgcGF5bG9hZCB3aXRoIGEgZm9ybWF0IHByZWZpeC5cbiAqXG4gKiBAcGFyYW0gZm9ybWF0IC0gVGhlIGZvcm1hdCBpZGVudGlmaWVyICg0IGNoYXJzLCBbYS16MC05XSlcbiAqIEBwYXJhbSBwYXlsb2FkIC0gVGhlIHNlcmlhbGl6ZWQgcGF5bG9hZCBieXRlc1xuICogQHJldHVybnMgQSBuZXcgVWludDhBcnJheSB3aXRoIGZvcm1hdCBwcmVmaXggcHJlcGVuZGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVXaXRoRm9ybWF0UHJlZml4KFxuICBmb3JtYXQ6IEZvcm1hdFByZWZpeCxcbiAgcGF5bG9hZDogVWludDhBcnJheSB8IHVua25vd25cbik6IFVpbnQ4QXJyYXkgfCB1bmtub3duIHtcbiAgaWYgKCEocGF5bG9hZCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSB7XG4gICAgcmV0dXJuIHBheWxvYWQ7XG4gIH1cblxuICBjb25zdCBwcmVmaXhCeXRlcyA9IGZvcm1hdEVuY29kZXIuZW5jb2RlKGZvcm1hdCk7XG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KEZPUk1BVF9QUkVGSVhfTEVOR1RIICsgcGF5bG9hZC5sZW5ndGgpO1xuICByZXN1bHQuc2V0KHByZWZpeEJ5dGVzLCAwKTtcbiAgcmVzdWx0LnNldChwYXlsb2FkLCBGT1JNQVRfUFJFRklYX0xFTkdUSCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogUGVlayBhdCB0aGUgZm9ybWF0IHByZWZpeCB3aXRob3V0IGNvbnN1bWluZyBpdC5cbiAqXG4gKiBSZXR1cm5zIHRoZSBwcmVmaXggaWYgaXQncyBhIHZhbGlkIGZvcm1hdCBwcmVmaXggKFthLXowLTldezR9KSxcbiAqIG9yIG51bGwgaWYgdGhlIGRhdGEgaXMgbGVnYWN5L25vbi1iaW5hcnkgb3IgZG9lc24ndCBzdGFydCB3aXRoIGFcbiAqIHZhbGlkIHByZWZpeC5cbiAqXG4gKiBAcGFyYW0gZGF0YSAtIFRoZSBmb3JtYXQtcHJlZml4ZWQgZGF0YVxuICogQHJldHVybnMgVGhlIGZvcm1hdCBwcmVmaXgsIG9yIG51bGxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBlZWtGb3JtYXRQcmVmaXgoXG4gIGRhdGE6IFVpbnQ4QXJyYXkgfCB1bmtub3duXG4pOiBGb3JtYXRQcmVmaXggfCBudWxsIHtcbiAgaWYgKCEoZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHx8IGRhdGEubGVuZ3RoIDwgRk9STUFUX1BSRUZJWF9MRU5HVEgpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCBwcmVmaXhCeXRlcyA9IGRhdGEuc3ViYXJyYXkoMCwgRk9STUFUX1BSRUZJWF9MRU5HVEgpO1xuICBjb25zdCBzdHIgPSBmb3JtYXREZWNvZGVyLmRlY29kZShwcmVmaXhCeXRlcyk7XG4gIHJldHVybiBpc0Zvcm1hdFByZWZpeChzdHIpID8gc3RyIDogbnVsbDtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBkYXRhIGlzIGVuY3J5cHRlZCAoaGFzICdlbmNyJyBmb3JtYXQgcHJlZml4KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRW5jcnlwdGVkKGRhdGE6IFVpbnQ4QXJyYXkgfCB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiBwZWVrRm9ybWF0UHJlZml4KGRhdGEpID09PSBTZXJpYWxpemF0aW9uRm9ybWF0LkVOQ1JZUFRFRDtcbn1cblxuLyoqXG4gKiBEZWNvZGUgYSBmb3JtYXQtcHJlZml4ZWQgcGF5bG9hZC5cbiAqXG4gKiBVbmxpa2UgdGhlIGxlZ2FjeSBpbXBsZW1lbnRhdGlvbiB3aGljaCBvbmx5IGFjY2VwdGVkIGtub3duIGZvcm1hdHNcbiAqIChgZGV2bGAsIGBlbmNyYCksIHRoaXMgZnVuY3Rpb24gYWNjZXB0cyBhbnkgdmFsaWQgZm9ybWF0IHByZWZpeFxuICogKGBbYS16MC05XXs0fWApLiBUaGlzIGlzIGludGVudGlvbmFsIGZvciBmb3J3YXJkIGNvbXBhdGliaWxpdHkg4oCUXG4gKiBuZXcgY29kZWNzIChlLmcuIGBjYm9yYCkgY2FuIGJlIGFkZGVkIHdpdGhvdXQgbW9kaWZ5aW5nIHRoaXMgbW9kdWxlLlxuICogQ2FsbGVycyBhcmUgcmVzcG9uc2libGUgZm9yIGNoZWNraW5nIHdoZXRoZXIgdGhleSBzdXBwb3J0IHRoZSByZXR1cm5lZFxuICogZm9ybWF0IGFuZCB0aHJvd2luZyBhbiBhcHByb3ByaWF0ZSBlcnJvciBpZiBub3QgKGUuZy4gXCJVbnN1cHBvcnRlZFxuICogc2VyaWFsaXphdGlvbiBmb3JtYXRcIikuXG4gKlxuICogQHBhcmFtIGRhdGEgLSBUaGUgZm9ybWF0LXByZWZpeGVkIGRhdGFcbiAqIEByZXR1cm5zIEFuIG9iamVjdCB3aXRoIHRoZSBmb3JtYXQgcHJlZml4IGFuZCBwYXlsb2FkXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBkYXRhIGlzIHRvbyBzaG9ydCBvciBoYXMgYW4gaW52YWxpZCBwcmVmaXhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUZvcm1hdFByZWZpeChkYXRhOiBVaW50OEFycmF5IHwgdW5rbm93bik6IHtcbiAgZm9ybWF0OiBGb3JtYXRQcmVmaXg7XG4gIHBheWxvYWQ6IFVpbnQ4QXJyYXk7XG59IHtcbiAgLy8gQ29tcGF0IGZvciBsZWdhY3kgc3BlY1ZlcnNpb24gMSBydW5zIHRoYXQgZG9uJ3QgaGF2ZSBhIGZvcm1hdCBwcmVmaXhcbiAgaWYgKCEoZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZvcm1hdDogU2VyaWFsaXphdGlvbkZvcm1hdC5ERVZBTFVFX1YxLFxuICAgICAgcGF5bG9hZDogbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKEpTT04uc3RyaW5naWZ5KGRhdGEpKSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGRhdGEubGVuZ3RoIDwgRk9STUFUX1BSRUZJWF9MRU5HVEgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRGF0YSB0b28gc2hvcnQgdG8gY29udGFpbiBmb3JtYXQgcHJlZml4OiBleHBlY3RlZCBhdCBsZWFzdCAke0ZPUk1BVF9QUkVGSVhfTEVOR1RIfSBieXRlcywgZ290ICR7ZGF0YS5sZW5ndGh9YFxuICAgICk7XG4gIH1cblxuICBjb25zdCBwcmVmaXhCeXRlcyA9IGRhdGEuc3ViYXJyYXkoMCwgRk9STUFUX1BSRUZJWF9MRU5HVEgpO1xuICBjb25zdCBzdHIgPSBmb3JtYXREZWNvZGVyLmRlY29kZShwcmVmaXhCeXRlcyk7XG5cbiAgaWYgKCFpc0Zvcm1hdFByZWZpeChzdHIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEludmFsaWQgZm9ybWF0IHByZWZpeDogXCIke3N0cn1cIi4gTXVzdCBiZSA0IGNoYXJhY3RlcnMgb2YgW2EtejAtOV0uYFxuICAgICk7XG4gIH1cblxuICBjb25zdCBwYXlsb2FkID0gZGF0YS5zdWJhcnJheShGT1JNQVRfUFJFRklYX0xFTkdUSCk7XG4gIHJldHVybiB7IGZvcm1hdDogc3RyLCBwYXlsb2FkIH07XG59XG4iXX0=
97
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcmlhbGl6YXRpb24vZm9ybWF0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFFTCxjQUFjLEVBQ2QsbUJBQW1CLEdBQ3BCLE1BQU0sWUFBWSxDQUFDO0FBRXBCLDJDQUEyQztBQUMzQyxNQUFNLG9CQUFvQixHQUFHLENBQUMsQ0FBQztBQUUvQixNQUFNLGFBQWEsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO0FBQ3hDLE1BQU0sYUFBYSxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7QUFFeEM7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLHNCQUFzQixDQUNwQyxNQUFvQixFQUNwQixPQUE2QjtJQUU3QixJQUFJLENBQUMsQ0FBQyxPQUFPLFlBQVksVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUNyQyxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQsTUFBTSxXQUFXLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNqRCxNQUFNLE1BQU0sR0FBRyxJQUFJLFVBQVUsQ0FBQyxvQkFBb0IsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDckUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDM0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztJQUMxQyxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUM5QixJQUEwQjtJQUUxQixJQUFJLENBQUMsQ0FBQyxJQUFJLFlBQVksVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxvQkFBb0IsRUFBRSxDQUFDO1FBQ3hFLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLG9CQUFvQixDQUFDLENBQUM7SUFDM0QsTUFBTSxHQUFHLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUM5QyxPQUFPLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDMUMsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FBQyxJQUEwQjtJQUNwRCxPQUFPLGdCQUFnQixDQUFDLElBQUksQ0FBQyxLQUFLLG1CQUFtQixDQUFDLFNBQVMsQ0FBQztBQUNsRSxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsSUFBMEI7SUFJM0QsdUVBQXVFO0lBQ3ZFLElBQUksQ0FBQyxDQUFDLElBQUksWUFBWSxVQUFVLENBQUMsRUFBRSxDQUFDO1FBQ2xDLE9BQU87WUFDTCxNQUFNLEVBQUUsbUJBQW1CLENBQUMsVUFBVTtZQUN0QyxPQUFPLEVBQUUsSUFBSSxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN4RCxDQUFDO0lBQ0osQ0FBQztJQUVELElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxvQkFBb0IsRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sSUFBSSxLQUFLLENBQ2IsOERBQThELG9CQUFvQixlQUFlLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FDL0csQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO0lBQzNELE1BQU0sR0FBRyxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7SUFFOUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQ2IsMkJBQTJCLEdBQUcsc0NBQXNDLENBQ3JFLENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBQ3BELE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxDQUFDO0FBQ2xDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEZvcm1hdCBwcmVmaXggc3lzdGVtIGZvciBzZXJpYWxpemVkIHBheWxvYWRzLlxuICpcbiAqIEFsbCBzZXJpYWxpemVkIHBheWxvYWRzIGFyZSBwcmVmaXhlZCB3aXRoIGEgNC1ieXRlIGZvcm1hdCBpZGVudGlmaWVyIHRoYXRcbiAqIGFsbG93cyB0aGUgZGVzZXJpYWxpemVyIHRvIGRldGVybWluZSBob3cgdG8gZGVjb2RlIHRoZSBwYXlsb2FkLiBUaGlzIGVuYWJsZXM6XG4gKlxuICogMS4gU2VsZi1kZXNjcmliaW5nIHBheWxvYWRzOiB0aGUgV29ybGQgbGF5ZXIgaXMgYWdub3N0aWMgdG8gc2VyaWFsaXphdGlvbiBmb3JtYXRcbiAqIDIuIEdyYWR1YWwgbWlncmF0aW9uOiBvbGQgcnVucyBrZWVwIHdvcmtpbmcsIG5ldyBydW5zIGNhbiB1c2UgbmV3IGZvcm1hdHNcbiAqIDMuIENvbXBvc2FiaWxpdHk6IGVuY3J5cHRpb24gY2FuIHdyYXAgYW55IGZvcm1hdCAoXCJlbmNyXCIgd3JhcHBpbmcgXCJkZXZsXCIpXG4gKiA0LiBEZWJ1Z2dpbmc6IHJhdyBkYXRhIGluc3BlY3Rpb24gaW1tZWRpYXRlbHkgcmV2ZWFscyB0aGUgZm9ybWF0XG4gKlxuICogRm9ybWF0OiBbNCBieXRlczogZm9ybWF0IGlkZW50aWZpZXJdW3BheWxvYWRdXG4gKlxuICogVGhlIGZvcm1hdCBwcmVmaXggaXMgb3Blbi1lbmRlZDogYW55IDQtY2hhcmFjdGVyIFthLXowLTldIHN0cmluZyBpcyB2YWxpZC5cbiAqIFRoaXMgYWxsb3dzIG5ldyBjb2RlY3MgdG8gYmUgYWRkZWQgd2l0aG91dCBtb2RpZnlpbmcgdGhpcyBtb2R1bGUuXG4gKi9cblxuaW1wb3J0IHtcbiAgdHlwZSBGb3JtYXRQcmVmaXgsXG4gIGlzRm9ybWF0UHJlZml4LFxuICBTZXJpYWxpemF0aW9uRm9ybWF0LFxufSBmcm9tICcuL3R5cGVzLmpzJztcblxuLyoqIExlbmd0aCBvZiB0aGUgZm9ybWF0IHByZWZpeCBpbiBieXRlcyAqL1xuY29uc3QgRk9STUFUX1BSRUZJWF9MRU5HVEggPSA0O1xuXG5jb25zdCBmb3JtYXRFbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG5jb25zdCBmb3JtYXREZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG5cbi8qKlxuICogRW5jb2RlIGEgcGF5bG9hZCB3aXRoIGEgZm9ybWF0IHByZWZpeC5cbiAqXG4gKiBAcGFyYW0gZm9ybWF0IC0gVGhlIGZvcm1hdCBpZGVudGlmaWVyICg0IGNoYXJzLCBbYS16MC05XSlcbiAqIEBwYXJhbSBwYXlsb2FkIC0gVGhlIHNlcmlhbGl6ZWQgcGF5bG9hZCBieXRlc1xuICogQHJldHVybnMgQSBuZXcgVWludDhBcnJheSB3aXRoIGZvcm1hdCBwcmVmaXggcHJlcGVuZGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVXaXRoRm9ybWF0UHJlZml4KFxuICBmb3JtYXQ6IEZvcm1hdFByZWZpeCxcbiAgcGF5bG9hZDogVWludDhBcnJheSB8IHVua25vd25cbik6IFVpbnQ4QXJyYXkgfCB1bmtub3duIHtcbiAgaWYgKCEocGF5bG9hZCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSB7XG4gICAgcmV0dXJuIHBheWxvYWQ7XG4gIH1cblxuICBjb25zdCBwcmVmaXhCeXRlcyA9IGZvcm1hdEVuY29kZXIuZW5jb2RlKGZvcm1hdCk7XG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KEZPUk1BVF9QUkVGSVhfTEVOR1RIICsgcGF5bG9hZC5sZW5ndGgpO1xuICByZXN1bHQuc2V0KHByZWZpeEJ5dGVzLCAwKTtcbiAgcmVzdWx0LnNldChwYXlsb2FkLCBGT1JNQVRfUFJFRklYX0xFTkdUSCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogUGVlayBhdCB0aGUgZm9ybWF0IHByZWZpeCB3aXRob3V0IGNvbnN1bWluZyBpdC5cbiAqXG4gKiBSZXR1cm5zIHRoZSBwcmVmaXggaWYgaXQncyBhIHZhbGlkIGZvcm1hdCBwcmVmaXggKFthLXowLTldezR9KSxcbiAqIG9yIG51bGwgaWYgdGhlIGRhdGEgaXMgbGVnYWN5L25vbi1iaW5hcnkgb3IgZG9lc24ndCBzdGFydCB3aXRoIGFcbiAqIHZhbGlkIHByZWZpeC5cbiAqXG4gKiBAcGFyYW0gZGF0YSAtIFRoZSBmb3JtYXQtcHJlZml4ZWQgZGF0YVxuICogQHJldHVybnMgVGhlIGZvcm1hdCBwcmVmaXgsIG9yIG51bGxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBlZWtGb3JtYXRQcmVmaXgoXG4gIGRhdGE6IFVpbnQ4QXJyYXkgfCB1bmtub3duXG4pOiBGb3JtYXRQcmVmaXggfCBudWxsIHtcbiAgaWYgKCEoZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHx8IGRhdGEubGVuZ3RoIDwgRk9STUFUX1BSRUZJWF9MRU5HVEgpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCBwcmVmaXhCeXRlcyA9IGRhdGEuc3ViYXJyYXkoMCwgRk9STUFUX1BSRUZJWF9MRU5HVEgpO1xuICBjb25zdCBzdHIgPSBmb3JtYXREZWNvZGVyLmRlY29kZShwcmVmaXhCeXRlcyk7XG4gIHJldHVybiBpc0Zvcm1hdFByZWZpeChzdHIpID8gc3RyIDogbnVsbDtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBkYXRhIGlzIGVuY3J5cHRlZCAoaGFzICdlbmNyJyBmb3JtYXQgcHJlZml4KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRW5jcnlwdGVkKGRhdGE6IFVpbnQ4QXJyYXkgfCB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiBwZWVrRm9ybWF0UHJlZml4KGRhdGEpID09PSBTZXJpYWxpemF0aW9uRm9ybWF0LkVOQ1JZUFRFRDtcbn1cblxuLyoqXG4gKiBEZWNvZGUgYSBmb3JtYXQtcHJlZml4ZWQgcGF5bG9hZC5cbiAqXG4gKiBVbmxpa2UgdGhlIGxlZ2FjeSBpbXBsZW1lbnRhdGlvbiB3aGljaCBvbmx5IGFjY2VwdGVkIGtub3duIGZvcm1hdHNcbiAqIChgZGV2bGAsIGBlbmNyYCksIHRoaXMgZnVuY3Rpb24gYWNjZXB0cyBhbnkgdmFsaWQgZm9ybWF0IHByZWZpeFxuICogKGBbYS16MC05XXs0fWApLiBUaGlzIGlzIGludGVudGlvbmFsIGZvciBmb3J3YXJkIGNvbXBhdGliaWxpdHksIHNvXG4gKiBuZXcgY29kZWNzIChlLmcuIGBjYm9yYCkgY2FuIGJlIGFkZGVkIHdpdGhvdXQgbW9kaWZ5aW5nIHRoaXMgbW9kdWxlLlxuICogQ2FsbGVycyBhcmUgcmVzcG9uc2libGUgZm9yIGNoZWNraW5nIHdoZXRoZXIgdGhleSBzdXBwb3J0IHRoZSByZXR1cm5lZFxuICogZm9ybWF0IGFuZCB0aHJvd2luZyBhbiBhcHByb3ByaWF0ZSBlcnJvciBpZiBub3QgKGUuZy4gXCJVbnN1cHBvcnRlZFxuICogc2VyaWFsaXphdGlvbiBmb3JtYXRcIikuXG4gKlxuICogQHBhcmFtIGRhdGEgLSBUaGUgZm9ybWF0LXByZWZpeGVkIGRhdGFcbiAqIEByZXR1cm5zIEFuIG9iamVjdCB3aXRoIHRoZSBmb3JtYXQgcHJlZml4IGFuZCBwYXlsb2FkXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBkYXRhIGlzIHRvbyBzaG9ydCBvciBoYXMgYW4gaW52YWxpZCBwcmVmaXhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUZvcm1hdFByZWZpeChkYXRhOiBVaW50OEFycmF5IHwgdW5rbm93bik6IHtcbiAgZm9ybWF0OiBGb3JtYXRQcmVmaXg7XG4gIHBheWxvYWQ6IFVpbnQ4QXJyYXk7XG59IHtcbiAgLy8gQ29tcGF0IGZvciBsZWdhY3kgc3BlY1ZlcnNpb24gMSBydW5zIHRoYXQgZG9uJ3QgaGF2ZSBhIGZvcm1hdCBwcmVmaXhcbiAgaWYgKCEoZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZvcm1hdDogU2VyaWFsaXphdGlvbkZvcm1hdC5ERVZBTFVFX1YxLFxuICAgICAgcGF5bG9hZDogbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKEpTT04uc3RyaW5naWZ5KGRhdGEpKSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGRhdGEubGVuZ3RoIDwgRk9STUFUX1BSRUZJWF9MRU5HVEgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRGF0YSB0b28gc2hvcnQgdG8gY29udGFpbiBmb3JtYXQgcHJlZml4OiBleHBlY3RlZCBhdCBsZWFzdCAke0ZPUk1BVF9QUkVGSVhfTEVOR1RIfSBieXRlcywgZ290ICR7ZGF0YS5sZW5ndGh9YFxuICAgICk7XG4gIH1cblxuICBjb25zdCBwcmVmaXhCeXRlcyA9IGRhdGEuc3ViYXJyYXkoMCwgRk9STUFUX1BSRUZJWF9MRU5HVEgpO1xuICBjb25zdCBzdHIgPSBmb3JtYXREZWNvZGVyLmRlY29kZShwcmVmaXhCeXRlcyk7XG5cbiAgaWYgKCFpc0Zvcm1hdFByZWZpeChzdHIpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEludmFsaWQgZm9ybWF0IHByZWZpeDogXCIke3N0cn1cIi4gTXVzdCBiZSA0IGNoYXJhY3RlcnMgb2YgW2EtejAtOV0uYFxuICAgICk7XG4gIH1cblxuICBjb25zdCBwYXlsb2FkID0gZGF0YS5zdWJhcnJheShGT1JNQVRfUFJFRklYX0xFTkdUSCk7XG4gIHJldHVybiB7IGZvcm1hdDogc3RyLCBwYXlsb2FkIH07XG59XG4iXX0=
@@ -0,0 +1,156 @@
1
+ /**
2
+ * Hardened introspection for serializing values that may originate inside a
3
+ * workflow VM (`node:vm`) sandbox realm.
4
+ *
5
+ * Serialization runs on the host, but the values it inspects were
6
+ * constructed by workflow code, so a naive dynamic operation like
7
+ * `value.toISOString()`, `Array.from(map)`, or `Object.prototype.toString`
8
+ * dispatches into the sandbox realm and executes workflow code (patched
9
+ * prototype methods, getters, proxy traps, `Symbol.toStringTag` accessors).
10
+ * That is a determinism hazard: serialization happens exactly once per
11
+ * payload (never again on replay), so any workflow-visible side effect it
12
+ * triggers exists only on the live execution path and diverges from replay.
13
+ *
14
+ * This module makes serialization side-effect free wherever the data allows
15
+ * it, and *observable* where it does not:
16
+ *
17
+ * - **Classification** uses engine-level brand checks (`node:util` `types`,
18
+ * internal-slot probes) instead of `instanceof` / `Object.prototype.toString`,
19
+ * which makes it immune to `Symbol.hasInstance`, `Symbol.toStringTag`, and
20
+ * reassigned globals.
21
+ * - **Extraction** goes through intrinsics captured at module load (host
22
+ * boot, before any workflow code runs). Internal slots are realm-agnostic,
23
+ * so host intrinsics read VM-realm objects without touching the sandbox's
24
+ * (patchable) prototypes.
25
+ * - **Property access** reads through descriptors, so plain data never
26
+ * invokes anything. Where workflow code *must* run because the data itself
27
+ * lives behind it (getters, proxies, custom `[WORKFLOW_SERIALIZE]`
28
+ * methods, `toString()` on toStringTag-branded objects such as Temporal
29
+ * polyfills), the execution is preserved for compatibility and recorded
30
+ * in the active {@link GuestCodeStats} sink, so callers (e.g. a retained-VM
31
+ * gate) can react.
32
+ *
33
+ * **Recording is not prevention.** For the recorded cases the determinism
34
+ * hazard is still live: a getter that calls `Math.random()` advances the
35
+ * run's seeded PRNG during serialization, and because serialization happens
36
+ * exactly once and is never replayed, every subsequent draw (including the
37
+ * correlation ids derived from that stream) shifts relative to replay. The
38
+ * report is the only trace of that; acting on it (warning, demoting a
39
+ * retained VM to replay) is left to the caller.
40
+ *
41
+ * The recorder is ambient module state, set for the duration of a
42
+ * synchronous `stringify` call via {@link withGuestCodeStats}. devalue's
43
+ * `stringify` is fully synchronous, so this is safe without async context.
44
+ */
45
+ import type { StringifyOperations } from 'devalue';
46
+ /**
47
+ * A single instance of workflow (guest) code executing during serialization.
48
+ */
49
+ export interface GuestCodeExecution {
50
+ /**
51
+ * What forced the execution:
52
+ * - `getter`: an accessor property was invoked to read data
53
+ * - `proxy`: a proxy was introspected, firing its traps. Note this also
54
+ * implies a **shape change**: brand checks answer "not that type" for a
55
+ * proxy, so a proxied `Map` serializes as a plain object rather than as a
56
+ * `Map`, and this report is the only evidence of it. (Such values were
57
+ * never serializable before, since the internal-slot reads in the previous
58
+ * implementation threw on them, so the shape change replaces a crash,
59
+ * but it is silent.)
60
+ * - `method`: a workflow-defined function was invoked (e.g. a custom
61
+ * `[WORKFLOW_SERIALIZE]` serializer, `toString()` on a
62
+ * `Symbol.toStringTag`-branded object, a duck-typed `getTime()`, or a
63
+ * `__closureVarsFn` this package did not generate)
64
+ */
65
+ kind: 'getter' | 'proxy' | 'method';
66
+ /** Best-effort context: the property key, method name, or tag involved. */
67
+ detail?: string;
68
+ }
69
+ /**
70
+ * Mutable sink recording workflow-code execution serialization could not
71
+ * avoid. `executions` contains the first five samples and `totalExecutions`
72
+ * is the exact count.
73
+ */
74
+ export interface GuestCodeStats {
75
+ executions: GuestCodeExecution[];
76
+ totalExecutions?: number;
77
+ }
78
+ export declare const GUEST_CODE_EXECUTION_SAMPLE_LIMIT = 5;
79
+ /**
80
+ * Runs `fn` (synchronously) with `stats` as the active guest-code sink.
81
+ * Nested calls stack correctly; a `null`/`undefined` sink disables
82
+ * recording without disabling hardening.
83
+ */
84
+ export declare function withGuestCodeStats<T>(stats: GuestCodeStats | undefined, fn: () => T): T;
85
+ /** Marks a function as having been passed to `useStep`. */
86
+ export declare function markUseStepClosureFn<T extends object>(fn: T): T;
87
+ /** Whether `fn` was marked by {@link markUseStepClosureFn}. */
88
+ export declare function isUseStepClosureFn(fn: unknown): boolean;
89
+ export declare function recordGuestCode(kind: GuestCodeExecution['kind'], detail?: string): void;
90
+ /** `Date.prototype.getDate`, for invalid-date checks. */
91
+ export declare const dateGetDate: (thisArg: unknown) => number;
92
+ /** `Date.prototype.getTime`. */
93
+ export declare const dateGetTime: (thisArg: unknown) => number;
94
+ /** `Date.prototype.toISOString`. */
95
+ export declare const dateToISOString: (thisArg: unknown) => string;
96
+ /** `RegExp.prototype.source` getter. */
97
+ export declare const regExpSource: (value: unknown) => string;
98
+ /** `RegExp.prototype.flags` getter. */
99
+ export declare const regExpFlags: (value: unknown) => string;
100
+ /** `ArrayBuffer.prototype.byteLength` getter (internal slot read). */
101
+ export declare const arrayBufferByteLength: (value: unknown) => number;
102
+ /**
103
+ * Reads `value[key]` with `[[Get]]` semantics, but through descriptors:
104
+ * plain data properties never invoke anything; accessor properties are
105
+ * invoked (the data lives behind them) and recorded; proxies fall back to
106
+ * a plain read (their traps are the only access path) and are recorded.
107
+ */
108
+ export declare function readProperty(value: unknown, key: PropertyKey): unknown;
109
+ /**
110
+ * `key in value` semantics without firing proxy traps for ordinary
111
+ * objects. Proxies fall back to the `in` operator and are recorded.
112
+ */
113
+ export declare function hasProperty(value: unknown, key: PropertyKey): boolean;
114
+ /**
115
+ * `value instanceof C` semantics for a known `C.prototype`, without
116
+ * consulting `Symbol.hasInstance` (which workflow code can define). Used
117
+ * for host classes that are injected into the sandbox (Headers, URL,
118
+ * URLSearchParams, DOMException), where the instances (from any realm the
119
+ * host handed the class to) carry the host prototype in their chain.
120
+ *
121
+ * Proxies are walked rather than rejected: `Reflect.getPrototypeOf` fires
122
+ * the proxy's `getPrototypeOf` trap, matching `instanceof` semantics, and
123
+ * real values depend on that: Next.js hands the runtime a proxied
124
+ * `NextRequest`, and answering "not a Request" for it would silently break
125
+ * webhooks. The traps are guest-observable, so the proxy is recorded.
126
+ */
127
+ export declare function isInstanceOfPrototype(value: unknown, prototype: object | undefined): boolean;
128
+ /** `URL.prototype.href` getter. */
129
+ export declare function urlHref(value: URL): string;
130
+ /** `URLSearchParams.prototype.toString`: returns `''` iff empty. */
131
+ export declare function urlSearchParamsToString(value: URLSearchParams): string;
132
+ /**
133
+ * Iterates a Headers instance through the captured host iterator, so the
134
+ * iterator object, and its `next`, are host-realm.
135
+ */
136
+ export declare function headersToEntries(value: Headers): [string, string][];
137
+ /**
138
+ * Iterates a genuine Map's entries entirely through host intrinsics: the
139
+ * iterator object is created by the host `Map.prototype.entries`, so its
140
+ * realm, and therefore its `next`, is the host's, not the sandbox's.
141
+ */
142
+ export declare function mapToEntries(value: Map<unknown, unknown>): [unknown, unknown][];
143
+ /** See {@link mapToEntries}. */
144
+ export declare function setToValues(value: Set<unknown>): unknown[];
145
+ /**
146
+ * The bytes of an `ArrayBufferView`, read via internal-slot getters, so
147
+ * own-property shadowing and prototype patches cannot change which bytes
148
+ * are serialized.
149
+ */
150
+ export declare function viewInfo(value: ArrayBufferView): {
151
+ buffer: ArrayBufferLike;
152
+ byteOffset: number;
153
+ byteLength: number;
154
+ };
155
+ export declare const hardenedStringifyOperations: Partial<StringifyOperations>;
156
+ //# sourceMappingURL=hardened.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hardened.d.ts","sourceRoot":"","sources":["../../src/serialization/hardened.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AAIH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAKnD;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;;;;;;;;;;;;;OAcG;IACH,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;IACpC,2EAA2E;IAC3E,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,kBAAkB,EAAE,CAAC;IACjC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,eAAO,MAAM,iCAAiC,IAAI,CAAC;AAUnD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAClC,KAAK,EAAE,cAAc,GAAG,SAAS,EACjC,EAAE,EAAE,MAAM,CAAC,GACV,CAAC,CAWH;AAyBD,2DAA2D;AAC3D,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,MAAM,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CAG/D;AAED,+DAA+D;AAC/D,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAEvD;AAED,wBAAgB,eAAe,CAC7B,IAAI,EAAE,kBAAkB,CAAC,MAAM,CAAC,EAChC,MAAM,CAAC,EAAE,MAAM,GACd,IAAI,CAUN;AAwCD,yDAAyD;AACzD,eAAO,MAAM,WAAW,8BAAsC,CAAC;AAC/D,gCAAgC;AAChC,eAAO,MAAM,WAAW,8BAAsC,CAAC;AAC/D,oCAAoC;AACpC,eAAO,MAAM,eAAe,8BAA0C,CAAC;AACvE,wCAAwC;AACxC,eAAO,MAAM,YAAY,UAlBd,OAAO,WAkByD,CAAC;AAC5E,uCAAuC;AACvC,eAAO,MAAM,WAAW,UApBb,OAAO,WAoBuD,CAAC;AAC1E,sEAAsE;AACtE,eAAO,MAAM,qBAAqB,UAtBvB,OAAO,WAyBjB,CAAC;AAiGF;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAiCtE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAsBrE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,OAAO,EACd,SAAS,EAAE,MAAM,GAAG,SAAS,GAC5B,OAAO,CAWT;AASD,mCAAmC;AACnC,wBAAgB,OAAO,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM,CAM1C;AAED,oEAAoE;AACpE,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAMtE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAMnE;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,GAC3B,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAEtB;AAED,gCAAgC;AAChC,wBAAgB,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,OAAO,EAAE,CAE1D;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,eAAe,GAAG;IAChD,MAAM,EAAE,eAAe,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB,CAaA;AAyFD,eAAO,MAAM,2BAA2B,EAAE,OAAO,CAAC,mBAAmB,CAgFpE,CAAC"}