@workflow/core 5.0.0-beta.3 → 5.0.0-beta.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (268) hide show
  1. package/dist/attribute-changes.d.ts +7 -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 +22 -1
  5. package/dist/capabilities.d.ts.map +1 -1
  6. package/dist/capabilities.js +41 -4
  7. package/dist/capture-stack.d.ts +16 -0
  8. package/dist/capture-stack.d.ts.map +1 -0
  9. package/dist/capture-stack.js +21 -0
  10. package/dist/class-serialization.d.ts +32 -0
  11. package/dist/class-serialization.d.ts.map +1 -1
  12. package/dist/class-serialization.js +37 -1
  13. package/dist/classify-error.d.ts +26 -3
  14. package/dist/classify-error.d.ts.map +1 -1
  15. package/dist/classify-error.js +103 -6
  16. package/dist/context-errors.d.ts +27 -0
  17. package/dist/context-errors.d.ts.map +1 -0
  18. package/dist/context-errors.js +101 -0
  19. package/dist/context-violation-error.d.ts +97 -0
  20. package/dist/context-violation-error.d.ts.map +1 -0
  21. package/dist/context-violation-error.js +147 -0
  22. package/dist/create-hook.d.ts +42 -3
  23. package/dist/create-hook.d.ts.map +1 -1
  24. package/dist/create-hook.js +4 -3
  25. package/dist/define-hook.d.ts.map +1 -1
  26. package/dist/define-hook.js +20 -5
  27. package/dist/describe-error.d.ts +70 -0
  28. package/dist/describe-error.d.ts.map +1 -0
  29. package/dist/describe-error.js +165 -0
  30. package/dist/encryption.d.ts +22 -1
  31. package/dist/encryption.d.ts.map +1 -1
  32. package/dist/encryption.js +72 -27
  33. package/dist/events-consumer.d.ts +25 -1
  34. package/dist/events-consumer.d.ts.map +1 -1
  35. package/dist/events-consumer.js +95 -16
  36. package/dist/flushable-stream.d.ts +10 -10
  37. package/dist/flushable-stream.d.ts.map +1 -1
  38. package/dist/flushable-stream.js +26 -15
  39. package/dist/global.d.ts +35 -1
  40. package/dist/global.d.ts.map +1 -1
  41. package/dist/global.js +21 -3
  42. package/dist/index.d.ts +1 -0
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +2 -1
  45. package/dist/log-format.d.ts +25 -0
  46. package/dist/log-format.d.ts.map +1 -0
  47. package/dist/log-format.js +250 -0
  48. package/dist/logger.d.ts +29 -30
  49. package/dist/logger.d.ts.map +1 -1
  50. package/dist/logger.js +82 -32
  51. package/dist/private.d.ts +107 -2
  52. package/dist/private.d.ts.map +1 -1
  53. package/dist/private.js +80 -3
  54. package/dist/runtime/constants.d.ts +189 -0
  55. package/dist/runtime/constants.d.ts.map +1 -1
  56. package/dist/runtime/constants.js +310 -15
  57. package/dist/runtime/get-port-lazy.d.ts +25 -0
  58. package/dist/runtime/get-port-lazy.d.ts.map +1 -0
  59. package/dist/runtime/get-port-lazy.js +92 -0
  60. package/dist/runtime/get-world-lazy.d.ts +23 -0
  61. package/dist/runtime/get-world-lazy.d.ts.map +1 -0
  62. package/dist/runtime/get-world-lazy.js +46 -0
  63. package/dist/runtime/helpers.d.ts +57 -6
  64. package/dist/runtime/helpers.d.ts.map +1 -1
  65. package/dist/runtime/helpers.js +169 -32
  66. package/dist/runtime/replay-budget.d.ts +98 -0
  67. package/dist/runtime/replay-budget.d.ts.map +1 -0
  68. package/dist/runtime/replay-budget.js +192 -0
  69. package/dist/runtime/resume-hook.d.ts.map +1 -1
  70. package/dist/runtime/resume-hook.js +39 -23
  71. package/dist/runtime/run-id-time.d.ts +10 -0
  72. package/dist/runtime/run-id-time.d.ts.map +1 -0
  73. package/dist/runtime/run-id-time.js +31 -0
  74. package/dist/runtime/run.d.ts +6 -2
  75. package/dist/runtime/run.d.ts.map +1 -1
  76. package/dist/runtime/run.js +52 -10
  77. package/dist/runtime/runs.d.ts +36 -2
  78. package/dist/runtime/runs.d.ts.map +1 -1
  79. package/dist/runtime/runs.js +18 -7
  80. package/dist/runtime/start.d.ts +58 -1
  81. package/dist/runtime/start.d.ts.map +1 -1
  82. package/dist/runtime/start.js +160 -46
  83. package/dist/runtime/step-executor.d.ts +131 -0
  84. package/dist/runtime/step-executor.d.ts.map +1 -0
  85. package/dist/runtime/step-executor.js +818 -0
  86. package/dist/runtime/step-handler.d.ts.map +1 -1
  87. package/dist/runtime/step-handler.js +718 -557
  88. package/dist/runtime/step-latency.d.ts +131 -0
  89. package/dist/runtime/step-latency.d.ts.map +1 -0
  90. package/dist/runtime/step-latency.js +155 -0
  91. package/dist/runtime/step-ownership.d.ts +72 -0
  92. package/dist/runtime/step-ownership.d.ts.map +1 -0
  93. package/dist/runtime/step-ownership.js +114 -0
  94. package/dist/runtime/step-single-flight.d.ts +12 -0
  95. package/dist/runtime/step-single-flight.d.ts.map +1 -0
  96. package/dist/runtime/step-single-flight.js +69 -0
  97. package/dist/runtime/suspension-handler.d.ts +81 -7
  98. package/dist/runtime/suspension-handler.d.ts.map +1 -1
  99. package/dist/runtime/suspension-handler.js +355 -137
  100. package/dist/runtime/wait-continuation.d.ts +84 -0
  101. package/dist/runtime/wait-continuation.d.ts.map +1 -0
  102. package/dist/runtime/wait-continuation.js +105 -0
  103. package/dist/runtime/wait-until.d.ts +18 -0
  104. package/dist/runtime/wait-until.d.ts.map +1 -0
  105. package/dist/runtime/wait-until.js +42 -0
  106. package/dist/runtime/world-compatibility.d.ts +5 -0
  107. package/dist/runtime/world-compatibility.d.ts.map +1 -0
  108. package/dist/runtime/world-compatibility.js +12 -0
  109. package/dist/runtime/world-init.d.ts +50 -0
  110. package/dist/runtime/world-init.d.ts.map +1 -0
  111. package/dist/runtime/world-init.js +50 -0
  112. package/dist/runtime/world-target.d.ts +11 -0
  113. package/dist/runtime/world-target.d.ts.map +1 -0
  114. package/dist/runtime/world-target.js +15 -0
  115. package/dist/runtime/world.d.ts +21 -9
  116. package/dist/runtime/world.d.ts.map +1 -1
  117. package/dist/runtime/world.js +58 -83
  118. package/dist/runtime.d.ts +15 -10
  119. package/dist/runtime.d.ts.map +1 -1
  120. package/dist/runtime.js +1757 -326
  121. package/dist/schemas.d.ts +1 -1
  122. package/dist/schemas.d.ts.map +1 -1
  123. package/dist/schemas.js +1 -1
  124. package/dist/serialization/client.d.ts +17 -0
  125. package/dist/serialization/client.d.ts.map +1 -0
  126. package/dist/serialization/client.js +48 -0
  127. package/dist/serialization/codec-devalue.d.ts +14 -0
  128. package/dist/serialization/codec-devalue.d.ts.map +1 -0
  129. package/dist/serialization/codec-devalue.js +98 -0
  130. package/dist/serialization/codec.d.ts +106 -0
  131. package/dist/serialization/codec.d.ts.map +1 -0
  132. package/dist/serialization/codec.js +17 -0
  133. package/dist/serialization/compression.d.ts +104 -0
  134. package/dist/serialization/compression.d.ts.map +1 -0
  135. package/dist/serialization/compression.js +260 -0
  136. package/dist/serialization/encryption.d.ts +33 -0
  137. package/dist/serialization/encryption.d.ts.map +1 -0
  138. package/dist/serialization/encryption.js +70 -0
  139. package/dist/serialization/errors.d.ts +34 -0
  140. package/dist/serialization/errors.d.ts.map +1 -0
  141. package/dist/serialization/errors.js +59 -0
  142. package/dist/serialization/format.d.ts +60 -0
  143. package/dist/serialization/format.d.ts.map +1 -0
  144. package/dist/serialization/format.js +97 -0
  145. package/dist/serialization/index.d.ts +19 -0
  146. package/dist/serialization/index.d.ts.map +1 -0
  147. package/dist/serialization/index.js +22 -0
  148. package/dist/serialization/reducers/class.d.ts +11 -0
  149. package/dist/serialization/reducers/class.d.ts.map +1 -0
  150. package/dist/serialization/reducers/class.js +68 -0
  151. package/dist/serialization/reducers/common.d.ts +16 -0
  152. package/dist/serialization/reducers/common.d.ts.map +1 -0
  153. package/dist/serialization/reducers/common.js +417 -0
  154. package/dist/serialization/reducers/step-function.d.ts +35 -0
  155. package/dist/serialization/reducers/step-function.d.ts.map +1 -0
  156. package/dist/serialization/reducers/step-function.js +88 -0
  157. package/dist/serialization/step.d.ts +17 -0
  158. package/dist/serialization/step.d.ts.map +1 -0
  159. package/dist/serialization/step.js +48 -0
  160. package/dist/serialization/types.d.ts +253 -0
  161. package/dist/serialization/types.d.ts.map +1 -0
  162. package/dist/serialization/types.js +25 -0
  163. package/dist/serialization/workflow.d.ts +29 -0
  164. package/dist/serialization/workflow.d.ts.map +1 -0
  165. package/dist/serialization/workflow.js +54 -0
  166. package/dist/serialization-format.d.ts +16 -0
  167. package/dist/serialization-format.d.ts.map +1 -1
  168. package/dist/serialization-format.js +213 -50
  169. package/dist/serialization.d.ts +322 -214
  170. package/dist/serialization.d.ts.map +1 -1
  171. package/dist/serialization.js +1575 -664
  172. package/dist/set-attributes.d.ts +13 -0
  173. package/dist/set-attributes.d.ts.map +1 -0
  174. package/dist/set-attributes.js +56 -0
  175. package/dist/sleep.d.ts.map +1 -1
  176. package/dist/sleep.js +3 -2
  177. package/dist/source-map.d.ts +5 -0
  178. package/dist/source-map.d.ts.map +1 -1
  179. package/dist/source-map.js +102 -10
  180. package/dist/step/context-storage.d.ts +53 -0
  181. package/dist/step/context-storage.d.ts.map +1 -1
  182. package/dist/step/context-storage.js +1 -1
  183. package/dist/step/get-closure-vars.d.ts.map +1 -1
  184. package/dist/step/get-closure-vars.js +3 -2
  185. package/dist/step/get-step-metadata.d.ts.map +1 -1
  186. package/dist/step/get-step-metadata.js +3 -2
  187. package/dist/step/get-workflow-metadata.d.ts.map +1 -1
  188. package/dist/step/get-workflow-metadata.js +3 -2
  189. package/dist/step/writable-stream.d.ts.map +1 -1
  190. package/dist/step/writable-stream.js +58 -6
  191. package/dist/step-hydration-cache.d.ts +148 -0
  192. package/dist/step-hydration-cache.d.ts.map +1 -0
  193. package/dist/step-hydration-cache.js +171 -0
  194. package/dist/step.d.ts.map +1 -1
  195. package/dist/step.js +144 -25
  196. package/dist/symbols.d.ts +28 -0
  197. package/dist/symbols.d.ts.map +1 -1
  198. package/dist/symbols.js +29 -1
  199. package/dist/telemetry/semantic-conventions.d.ts +98 -2
  200. package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
  201. package/dist/telemetry/semantic-conventions.js +66 -1
  202. package/dist/telemetry.d.ts +68 -0
  203. package/dist/telemetry.d.ts.map +1 -1
  204. package/dist/telemetry.js +106 -4
  205. package/dist/types.d.ts +6 -0
  206. package/dist/types.d.ts.map +1 -1
  207. package/dist/types.js +23 -1
  208. package/dist/util.d.ts +16 -6
  209. package/dist/util.d.ts.map +1 -1
  210. package/dist/util.js +25 -16
  211. package/dist/version.d.ts +1 -1
  212. package/dist/version.d.ts.map +1 -1
  213. package/dist/version.js +2 -2
  214. package/dist/vm/index.d.ts.map +1 -1
  215. package/dist/vm/index.js +3 -2
  216. package/dist/vm/script-cache.d.ts +28 -0
  217. package/dist/vm/script-cache.d.ts.map +1 -0
  218. package/dist/vm/script-cache.js +140 -0
  219. package/dist/workflow/abort-controller.d.ts +65 -0
  220. package/dist/workflow/abort-controller.d.ts.map +1 -0
  221. package/dist/workflow/abort-controller.js +277 -0
  222. package/dist/workflow/attribute-dispatcher.d.ts +6 -0
  223. package/dist/workflow/attribute-dispatcher.d.ts.map +1 -0
  224. package/dist/workflow/attribute-dispatcher.js +48 -0
  225. package/dist/workflow/create-hook.d.ts.map +1 -1
  226. package/dist/workflow/create-hook.js +25 -3
  227. package/dist/workflow/define-hook.d.ts +1 -1
  228. package/dist/workflow/define-hook.d.ts.map +1 -1
  229. package/dist/workflow/define-hook.js +8 -4
  230. package/dist/workflow/get-workflow-metadata.d.ts.map +1 -1
  231. package/dist/workflow/get-workflow-metadata.js +14 -3
  232. package/dist/workflow/hook.d.ts.map +1 -1
  233. package/dist/workflow/hook.js +207 -33
  234. package/dist/workflow/index.d.ts +1 -0
  235. package/dist/workflow/index.d.ts.map +1 -1
  236. package/dist/workflow/index.js +5 -3
  237. package/dist/workflow/set-attributes.d.ts +73 -0
  238. package/dist/workflow/set-attributes.d.ts.map +1 -0
  239. package/dist/workflow/set-attributes.js +65 -0
  240. package/dist/workflow/sleep.d.ts.map +1 -1
  241. package/dist/workflow/sleep.js +45 -8
  242. package/dist/workflow/world-init-stub.d.ts +15 -0
  243. package/dist/workflow/world-init-stub.d.ts.map +1 -0
  244. package/dist/workflow/world-init-stub.js +15 -0
  245. package/dist/workflow.d.ts +17 -1
  246. package/dist/workflow.d.ts.map +1 -1
  247. package/dist/workflow.js +190 -56
  248. package/docs/api-reference/create-hook.mdx +38 -0
  249. package/docs/api-reference/create-webhook.mdx +1 -0
  250. package/docs/api-reference/experimental-set-attributes.mdx +65 -0
  251. package/docs/api-reference/fetch.mdx +5 -0
  252. package/docs/api-reference/index.mdx +3 -0
  253. package/docs/foundations/cancellation.mdx +459 -0
  254. package/docs/foundations/errors-and-retries.mdx +7 -3
  255. package/docs/foundations/hooks.mdx +29 -0
  256. package/docs/foundations/idempotency.mdx +236 -11
  257. package/docs/foundations/index.mdx +1 -23
  258. package/docs/foundations/meta.json +3 -1
  259. package/docs/foundations/serialization.mdx +77 -41
  260. package/docs/foundations/starting-workflows.mdx +5 -1
  261. package/docs/foundations/streaming.mdx +14 -23
  262. package/docs/foundations/versioning.mdx +263 -0
  263. package/docs/how-it-works/cancellation.mdx +287 -0
  264. package/docs/how-it-works/code-transform.mdx +2 -2
  265. package/docs/how-it-works/encryption.mdx +2 -2
  266. package/docs/how-it-works/event-sourcing.mdx +2 -2
  267. package/docs/how-it-works/meta.json +2 -1
  268. package/package.json +32 -11
@@ -0,0 +1,70 @@
1
+ import { type RunErrorCode } from '@workflow/errors';
2
+ /**
3
+ * Attribution of a workflow/step failure for presentation.
4
+ *
5
+ * - `user`: the error came from customer code (a step or workflow function
6
+ * threw, or a value they passed across a boundary wasn't serializable).
7
+ * - `sdk`: the SDK produced the error itself — an internal invariant broke,
8
+ * or a runtime guard rejected the call. These should be rare; when they
9
+ * happen we want to frame the terminal output as "this is us, not you."
10
+ */
11
+ export type ErrorAttribution = 'user' | 'sdk';
12
+ export interface ErrorDescription {
13
+ attribution: ErrorAttribution;
14
+ errorCode: RunErrorCode;
15
+ /**
16
+ * Short, class-aware hint to help a user understand what the error means.
17
+ * Only set for well-known SDK error classes (SerializationError,
18
+ * WorkflowRuntimeError, context-violation errors); `undefined` for plain
19
+ * user errors, where the stack is already the most useful thing to show.
20
+ */
21
+ hint?: string;
22
+ }
23
+ /**
24
+ * Error signal fields carried on persisted failure events (e.g.
25
+ * `run_failed` / `step_failed`). The shape is intentionally loose:
26
+ *
27
+ * - `errorCode` is typed as `string` rather than `RunErrorCode` because
28
+ * the value comes from stored JSON/CBOR and may predate the current
29
+ * enum — callers should not narrow on it blindly. Values that don't
30
+ * match a known `RUN_ERROR_CODES` entry fall through to USER_ERROR.
31
+ * - `errorName` is the thrown `Error#name`. It is not universally
32
+ * persisted today; callers that have access to it (either via an
33
+ * in-memory throw or a richer payload) can pass it in to sharpen
34
+ * the attribution and hint. When absent, `describeRunError` still
35
+ * returns a sensible attribution from `errorCode` alone.
36
+ */
37
+ export interface PersistedErrorSignal {
38
+ errorCode?: string;
39
+ errorName?: string;
40
+ }
41
+ /**
42
+ * Data-driven variant of {@link describeError} that works from persisted
43
+ * event fields instead of a live `Error` instance. Intended for CLI/web
44
+ * renderers that read failure events and no longer have the original
45
+ * thrown object.
46
+ */
47
+ export declare function describeRunError(signal: PersistedErrorSignal): ErrorDescription;
48
+ /**
49
+ * Describe an error for user-facing presentation. Purely informational —
50
+ * does not change any persisted event data or error classification used by
51
+ * the runtime.
52
+ *
53
+ * The attribution here is more nuanced than `classifyRunError`:
54
+ *
55
+ * - `SerializationError` is technically raised by the SDK, but it almost
56
+ * always points at something the caller did (passed a non-serializable
57
+ * value, didn't register a class). We attribute it to the user.
58
+ * - Context-violation errors (`NotInWorkflowContextError`, etc.) likewise
59
+ * describe a user mistake.
60
+ * - `WorkflowRuntimeError` (and subclasses like `StepNotRegisteredError`)
61
+ * indicates an internal SDK invariant broke — surface that as `sdk`.
62
+ *
63
+ * @param err The error value thrown by the workflow / step.
64
+ * @param errorCode Optional precomputed error code. Callers that already
65
+ * know the code (e.g. `REPLAY_TIMEOUT` or `MAX_DELIVERIES_EXCEEDED`, which
66
+ * `classifyRunError` can't derive from the error alone) should pass it so
67
+ * the attribution and hint reflect the actual failure category.
68
+ */
69
+ export declare function describeError(err: unknown, errorCode?: RunErrorCode): ErrorDescription;
70
+ //# sourceMappingURL=describe-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"describe-error.d.ts","sourceRoot":"","sources":["../src/describe-error.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,YAAY,EAGlB,MAAM,kBAAkB,CAAC;AAS1B;;;;;;;;GAQG;AACH,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,KAAK,CAAC;AAE9C,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,gBAAgB,CAAC;IAC9B,SAAS,EAAE,YAAY,CAAC;IACxB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,oBAAoB;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA2CD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,oBAAoB,GAC3B,gBAAgB,CA+ClB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,aAAa,CAC3B,GAAG,EAAE,OAAO,EACZ,SAAS,CAAC,EAAE,YAAY,GACvB,gBAAgB,CAoElB"}
@@ -0,0 +1,165 @@
1
+ import { CorruptedEventLogError, RUN_ERROR_CODES, SerializationError, WorkflowRuntimeError, } from '@workflow/errors';
2
+ import { classifyRunError } from './classify-error.js';
3
+ import { NotInStepContextError, NotInWorkflowContextError, NotInWorkflowOrStepContextError, UnavailableInWorkflowContextError, } from './context-errors.js';
4
+ const CONTEXT_ERROR_NAMES = new Set([
5
+ 'NotInWorkflowContextError',
6
+ 'NotInStepContextError',
7
+ 'NotInWorkflowOrStepContextError',
8
+ 'UnavailableInWorkflowContextError',
9
+ ]);
10
+ function isContextViolationError(err) {
11
+ return (err instanceof NotInWorkflowContextError ||
12
+ err instanceof NotInStepContextError ||
13
+ err instanceof NotInWorkflowOrStepContextError ||
14
+ err instanceof UnavailableInWorkflowContextError);
15
+ }
16
+ const SERIALIZATION_ERROR_HINT = 'A value passed across a workflow/step boundary could not be serialized. See the error message for the offending path and the Learn More link for details.';
17
+ const CONTEXT_ERROR_HINT = 'A workflow-only or step-only API was called from the wrong context. The error message includes the exact API and how to move the call.';
18
+ const RUNTIME_ERROR_HINT = 'This is an internal workflow SDK error, not a bug in your code. If it keeps happening, please report it with the stack trace and the runId.';
19
+ const CORRUPTED_EVENT_LOG_HINT = 'The workflow event log contains orphaned or mismatched events and cannot be replayed. This is an internal workflow SDK error; please report it with the runId.';
20
+ const REPLAY_TIMEOUT_HINT = 'The workflow replay between step boundaries took too long. This bounds workflow-VM and event-log replay time only — step bodies (`"use step"` functions) are excluded. This usually means the event log is unusually large or the workflow function is doing heavy synchronous work in workflow code outside of step bodies. Override the default budget via the WORKFLOW_REPLAY_TIMEOUT_MS env var if needed.';
21
+ const MAX_DELIVERIES_HINT = 'The workflow queue exceeded its max-delivery budget. This usually indicates a persistent runtime failure — check the most recent stack traces for the underlying cause.';
22
+ const WORLD_CONTRACT_HINT = 'The workflow backend returned data that violated the SDK contract. This is not retryable; please report it with the stack trace and runId.';
23
+ function normalizeErrorCode(code) {
24
+ // Values read back from persisted events are `string | undefined` — we
25
+ // only trust codes that match a known entry in `RUN_ERROR_CODES`.
26
+ const known = Object.values(RUN_ERROR_CODES);
27
+ if (code && known.includes(code)) {
28
+ return code;
29
+ }
30
+ return RUN_ERROR_CODES.USER_ERROR;
31
+ }
32
+ /**
33
+ * Data-driven variant of {@link describeError} that works from persisted
34
+ * event fields instead of a live `Error` instance. Intended for CLI/web
35
+ * renderers that read failure events and no longer have the original
36
+ * thrown object.
37
+ */
38
+ export function describeRunError(signal) {
39
+ const name = signal.errorName;
40
+ const errorCode = name === 'CorruptedEventLogError'
41
+ ? RUN_ERROR_CODES.CORRUPTED_EVENT_LOG
42
+ : normalizeErrorCode(signal.errorCode);
43
+ if (name === 'SerializationError') {
44
+ return { attribution: 'user', errorCode, hint: SERIALIZATION_ERROR_HINT };
45
+ }
46
+ if (name && CONTEXT_ERROR_NAMES.has(name)) {
47
+ return { attribution: 'user', errorCode, hint: CONTEXT_ERROR_HINT };
48
+ }
49
+ if (name === 'CorruptedEventLogError') {
50
+ return {
51
+ attribution: 'sdk',
52
+ errorCode,
53
+ hint: CORRUPTED_EVENT_LOG_HINT,
54
+ };
55
+ }
56
+ if (errorCode === RUN_ERROR_CODES.REPLAY_TIMEOUT) {
57
+ return { attribution: 'sdk', errorCode, hint: REPLAY_TIMEOUT_HINT };
58
+ }
59
+ if (errorCode === RUN_ERROR_CODES.MAX_DELIVERIES_EXCEEDED) {
60
+ return { attribution: 'sdk', errorCode, hint: MAX_DELIVERIES_HINT };
61
+ }
62
+ if (errorCode === RUN_ERROR_CODES.CORRUPTED_EVENT_LOG) {
63
+ return {
64
+ attribution: 'sdk',
65
+ errorCode,
66
+ hint: CORRUPTED_EVENT_LOG_HINT,
67
+ };
68
+ }
69
+ if (errorCode === RUN_ERROR_CODES.WORLD_CONTRACT_ERROR) {
70
+ return {
71
+ attribution: 'sdk',
72
+ errorCode,
73
+ hint: WORLD_CONTRACT_HINT,
74
+ };
75
+ }
76
+ if (name === 'WorkflowRuntimeError' || name === 'StepNotRegisteredError') {
77
+ return { attribution: 'sdk', errorCode, hint: RUNTIME_ERROR_HINT };
78
+ }
79
+ if (errorCode === RUN_ERROR_CODES.RUNTIME_ERROR) {
80
+ return { attribution: 'sdk', errorCode, hint: RUNTIME_ERROR_HINT };
81
+ }
82
+ return { attribution: 'user', errorCode };
83
+ }
84
+ /**
85
+ * Describe an error for user-facing presentation. Purely informational —
86
+ * does not change any persisted event data or error classification used by
87
+ * the runtime.
88
+ *
89
+ * The attribution here is more nuanced than `classifyRunError`:
90
+ *
91
+ * - `SerializationError` is technically raised by the SDK, but it almost
92
+ * always points at something the caller did (passed a non-serializable
93
+ * value, didn't register a class). We attribute it to the user.
94
+ * - Context-violation errors (`NotInWorkflowContextError`, etc.) likewise
95
+ * describe a user mistake.
96
+ * - `WorkflowRuntimeError` (and subclasses like `StepNotRegisteredError`)
97
+ * indicates an internal SDK invariant broke — surface that as `sdk`.
98
+ *
99
+ * @param err The error value thrown by the workflow / step.
100
+ * @param errorCode Optional precomputed error code. Callers that already
101
+ * know the code (e.g. `REPLAY_TIMEOUT` or `MAX_DELIVERIES_EXCEEDED`, which
102
+ * `classifyRunError` can't derive from the error alone) should pass it so
103
+ * the attribution and hint reflect the actual failure category.
104
+ */
105
+ export function describeError(err, errorCode) {
106
+ const effectiveCode = errorCode ?? classifyRunError(err);
107
+ if (SerializationError.is(err)) {
108
+ return {
109
+ attribution: 'user',
110
+ errorCode: effectiveCode,
111
+ hint: SERIALIZATION_ERROR_HINT,
112
+ };
113
+ }
114
+ if (isContextViolationError(err)) {
115
+ return {
116
+ attribution: 'user',
117
+ errorCode: effectiveCode,
118
+ hint: CONTEXT_ERROR_HINT,
119
+ };
120
+ }
121
+ if (CorruptedEventLogError.is(err)) {
122
+ return {
123
+ attribution: 'sdk',
124
+ errorCode: effectiveCode,
125
+ hint: CORRUPTED_EVENT_LOG_HINT,
126
+ };
127
+ }
128
+ if (err instanceof WorkflowRuntimeError) {
129
+ return {
130
+ attribution: 'sdk',
131
+ errorCode: effectiveCode,
132
+ hint: RUNTIME_ERROR_HINT,
133
+ };
134
+ }
135
+ if (effectiveCode === RUN_ERROR_CODES.REPLAY_TIMEOUT) {
136
+ return {
137
+ attribution: 'sdk',
138
+ errorCode: effectiveCode,
139
+ hint: REPLAY_TIMEOUT_HINT,
140
+ };
141
+ }
142
+ if (effectiveCode === RUN_ERROR_CODES.MAX_DELIVERIES_EXCEEDED) {
143
+ return {
144
+ attribution: 'sdk',
145
+ errorCode: effectiveCode,
146
+ hint: MAX_DELIVERIES_HINT,
147
+ };
148
+ }
149
+ if (effectiveCode === RUN_ERROR_CODES.CORRUPTED_EVENT_LOG) {
150
+ return {
151
+ attribution: 'sdk',
152
+ errorCode: effectiveCode,
153
+ hint: CORRUPTED_EVENT_LOG_HINT,
154
+ };
155
+ }
156
+ if (effectiveCode === RUN_ERROR_CODES.WORLD_CONTRACT_ERROR) {
157
+ return {
158
+ attribution: 'sdk',
159
+ errorCode: effectiveCode,
160
+ hint: WORLD_CONTRACT_HINT,
161
+ };
162
+ }
163
+ return { attribution: 'user', errorCode: effectiveCode };
164
+ }
165
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzY3JpYmUtZXJyb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZGVzY3JpYmUtZXJyb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixlQUFlLEVBRWYsa0JBQWtCLEVBQ2xCLG9CQUFvQixHQUNyQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFDTCxxQkFBcUIsRUFDckIseUJBQXlCLEVBQ3pCLCtCQUErQixFQUMvQixpQ0FBaUMsR0FDbEMsTUFBTSxxQkFBcUIsQ0FBQztBQTRDN0IsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUNsQywyQkFBMkI7SUFDM0IsdUJBQXVCO0lBQ3ZCLGlDQUFpQztJQUNqQyxtQ0FBbUM7Q0FDcEMsQ0FBQyxDQUFDO0FBRUgsU0FBUyx1QkFBdUIsQ0FBQyxHQUFZO0lBQzNDLE9BQU8sQ0FDTCxHQUFHLFlBQVkseUJBQXlCO1FBQ3hDLEdBQUcsWUFBWSxxQkFBcUI7UUFDcEMsR0FBRyxZQUFZLCtCQUErQjtRQUM5QyxHQUFHLFlBQVksaUNBQWlDLENBQ2pELENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSx3QkFBd0IsR0FDNUIsMkpBQTJKLENBQUM7QUFDOUosTUFBTSxrQkFBa0IsR0FDdEIsd0lBQXdJLENBQUM7QUFDM0ksTUFBTSxrQkFBa0IsR0FDdEIsNklBQTZJLENBQUM7QUFDaEosTUFBTSx3QkFBd0IsR0FDNUIsZ0tBQWdLLENBQUM7QUFDbkssTUFBTSxtQkFBbUIsR0FDdkIsZ1pBQWdaLENBQUM7QUFDblosTUFBTSxtQkFBbUIsR0FDdkIseUtBQXlLLENBQUM7QUFDNUssTUFBTSxtQkFBbUIsR0FDdkIsNElBQTRJLENBQUM7QUFFL0ksU0FBUyxrQkFBa0IsQ0FBQyxJQUF3QjtJQUNsRCx1RUFBdUU7SUFDdkUsa0VBQWtFO0lBQ2xFLE1B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QUFLO1lBQ2xCLFNBQVMsRUFBRSxhQUFhO1lBQ3hCLElBQUksRUFBRSx3QkFBd0I7U0FDL0IsQ0FBQztJQUNKLENBQUM7SUFFRCxJQUFJLGFBQWEsS0FBSyxlQUFlLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUMzRCxPQUFPO1lBQ0wsV0FBVyxFQUFFLEtBQUs7WUFDbEIsU0FBUyxFQUFFLGFBQWE7WUFDeEIsSUFBSSxFQUFFLG1CQUFtQjtTQUMxQixDQUFDO0lBQ0osQ0FBQztJQUVELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsQ0FBQztBQUMzRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29ycnVwdGVkRXZlbnRMb2dFcnJvcixcbiAgUlVOX0VSUk9SX0NPREVTLFxuICB0eXBlIFJ1bkVycm9yQ29kZSxcbiAgU2VyaWFsaXphdGlvbkVycm9yLFxuICBXb3JrZmxvd1J1bnRpbWVFcnJvcixcbn0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQgeyBjbGFzc2lmeVJ1bkVycm9yIH0gZnJvbSAnLi9jbGFzc2lmeS1lcnJvci5qcyc7XG5pbXBvcnQge1xuICBOb3RJblN0ZXBDb250ZXh0RXJyb3IsXG4gIE5vdEluV29ya2Zsb3dDb250ZXh0RXJyb3IsXG4gIE5vdEluV29ya2Zsb3dPclN0ZXBDb250ZXh0RXJyb3IsXG4gIFVuYXZhaWxhYmxlSW5Xb3JrZmxvd0NvbnRleHRFcnJvcixcbn0gZnJvbSAnLi9jb250ZXh0LWVycm9ycy5qcyc7XG5cbi8qKlxuICogQXR0cmlidXRpb24gb2YgYSB3b3JrZmxvdy9zdGVwIGZhaWx1cmUgZm9yIHByZXNlbnRhdGlvbi5cbiAqXG4gKiAtIGB1c2VyYDogdGhlIGVycm9yIGNhbWUgZnJvbSBjdXN0b21lciBjb2RlIChhIHN0ZXAgb3Igd29ya2Zsb3cgZnVuY3Rpb25cbiAqICAgdGhyZXcsIG9yIGEgdmFsdWUgdGhleSBwYXNzZWQgYWNyb3NzIGEgYm91bmRhcnkgd2Fzbid0IHNlcmlhbGl6YWJsZSkuXG4gKiAtIGBzZGtgOiB0aGUgU0RLIHByb2R1Y2VkIHRoZSBlcnJvciBpdHNlbGYg4oCUIGFuIGludGVybmFsIGludmFyaWFudCBicm9rZSxcbiAqICAgb3IgYSBydW50aW1lIGd1YXJkIHJlamVjdGVkIHRoZSBjYWxsLiBUaGVzZSBzaG91bGQgYmUgcmFyZTsgd2hlbiB0aGV5XG4gKiAgIGhhcHBlbiB3ZSB3YW50IHRvIGZyYW1lIHRoZSB0ZXJtaW5hbCBvdXRwdXQgYXMgXCJ0aGlzIGlzIHVzLCBub3QgeW91LlwiXG4gKi9cbmV4cG9ydCB0eXBlIEVycm9yQXR0cmlidXRpb24gPSAndXNlcicgfCAnc2RrJztcblxuZXhwb3J0IGludGVyZmFjZSBFcnJvckRlc2NyaXB0aW9uIHtcbiAgYXR0cmlidXRpb246IEVycm9yQXR0cmlidXRpb247XG4gIGVycm9yQ29kZTogUnVuRXJyb3JDb2RlO1xuICAvKipcbiAgICogU2hvcnQsIGNsYXNzLWF3YXJlIGhpbnQgdG8gaGVscCBhIHVzZXIgdW5kZXJzdGFuZCB3aGF0IHRoZSBlcnJvciBtZWFucy5cbiAgICogT25seSBzZXQgZm9yIHdlbGwta25vd24gU0RLIGVycm9yIGNsYXNzZXMgKFNlcmlhbGl6YXRpb25FcnJvcixcbiAgICogV29ya2Zsb3dSdW50aW1lRXJyb3IsIGNvbnRleHQtdmlvbGF0aW9uIGVycm9ycyk7IGB1bmRlZmluZWRgIGZvciBwbGFpblxuICAgKiB1c2VyIGVycm9ycywgd2hlcmUgdGhlIHN0YWNrIGlzIGFscmVhZHkgdGhlIG1vc3QgdXNlZnVsIHRoaW5nIHRvIHNob3cuXG4gICAqL1xuICBoaW50Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEVycm9yIHNpZ25hbCBmaWVsZHMgY2FycmllZCBvbiBwZXJzaXN0ZWQgZmFpbHVyZSBldmVudHMgKGUuZy5cbiAqIGBydW5fZmFpbGVkYCAvIGBzdGVwX2ZhaWxlZGApLiBUaGUgc2hhcGUgaXMgaW50ZW50aW9uYWxseSBsb29zZTpcbiAqXG4gKiAtIGBlcnJvckNvZGVgIGlzIHR5cGVkIGFzIGBzdHJpbmdgIHJhdGhlciB0aGFuIGBSdW5FcnJvckNvZGVgIGJlY2F1c2VcbiAqICAgdGhlIHZhbHVlIGNvbWVzIGZyb20gc3RvcmVkIEpTT04vQ0JPUiBhbmQgbWF5IHByZWRhdGUgdGhlIGN1cnJlbnRcbiAqICAgZW51bSDigJQgY2FsbGVycyBzaG91bGQgbm90IG5hcnJvdyBvbiBpdCBibGluZGx5LiBWYWx1ZXMgdGhhdCBkb24ndFxuICogICBtYXRjaCBhIGtub3duIGBSVU5fRVJST1JfQ09ERVNgIGVudHJ5IGZhbGwgdGhyb3VnaCB0byBVU0VSX0VSUk9SLlxuICogLSBgZXJyb3JOYW1lYCBpcyB0aGUgdGhyb3duIGBFcnJvciNuYW1lYC4gSXQgaXMgbm90IHVuaXZlcnNhbGx5XG4gKiAgIHBlcnNpc3RlZCB0b2RheTsgY2FsbGVycyB0aGF0IGhhdmUgYWNjZXNzIHRvIGl0IChlaXRoZXIgdmlhIGFuXG4gKiAgIGluLW1lbW9yeSB0aHJvdyBvciBhIHJpY2hlciBwYXlsb2FkKSBjYW4gcGFzcyBpdCBpbiB0byBzaGFycGVuXG4gKiAgIHRoZSBhdHRyaWJ1dGlvbiBhbmQgaGludC4gV2hlbiBhYnNlbnQsIGBkZXNjcmliZVJ1bkVycm9yYCBzdGlsbFxuICogICByZXR1cm5zIGEgc2Vuc2libGUgYXR0cmlidXRpb24gZnJvbSBgZXJyb3JDb2RlYCBhbG9uZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQZXJzaXN0ZWRFcnJvclNpZ25hbCB7XG4gIGVycm9yQ29kZT86IHN0cmluZztcbiAgZXJyb3JOYW1lPzogc3RyaW5nO1xufVxuXG5jb25zdCBDT05URVhUX0VSUk9SX05BTUVTID0gbmV3IFNldChbXG4gICdOb3RJbldvcmtmbG93Q29udGV4dEVycm9yJyxcbiAgJ05vdEluU3RlcENvbnRleHRFcnJvcicsXG4gICdOb3RJbldvcmtmbG93T3JTdGVwQ29udGV4dEVycm9yJyxcbiAgJ1VuYXZhaWxhYmxlSW5Xb3JrZmxvd0NvbnRleHRFcnJvcicsXG5dKTtcblxuZnVuY3Rpb24gaXNDb250ZXh0VmlvbGF0aW9uRXJyb3IoZXJyOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgZXJyIGluc3RhbmNlb2YgTm90SW5Xb3JrZmxvd0NvbnRleHRFcnJvciB8fFxuICAgIGVyciBpbnN0YW5jZW9mIE5vdEluU3RlcENvbnRleHRFcnJvciB8fFxuICAgIGVyciBpbnN0YW5jZW9mIE5vdEluV29ya2Zsb3dPclN0ZXBDb250ZXh0RXJyb3IgfHxcbiAgICBlcnIgaW5zdGFuY2VvZiBVbmF2YWlsYWJsZUluV29ya2Zsb3dDb250ZXh0RXJyb3JcbiAgKTtcbn1cblxuY29uc3QgU0VSSUFMSVpBVElPTl9FUlJPUl9ISU5UID1cbiAgJ0EgdmFsdWUgcGFzc2VkIGFjcm9zcyBhIHdvcmtmbG93L3N0ZXAgYm91bmRhcnkgY291bGQgbm90IGJlIHNlcmlhbGl6ZWQuIFNlZSB0aGUgZXJyb3IgbWVzc2FnZSBmb3IgdGhlIG9mZmVuZGluZyBwYXRoIGFuZCB0aGUgTGVhcm4gTW9yZSBsaW5rIGZvciBkZXRhaWxzLic7XG5jb25zdCBDT05URVhUX0VSUk9SX0hJTlQgPVxuICAnQSB3b3JrZmxvdy1vbmx5IG9yIHN0ZXAtb25seSBBUEkgd2FzIGNhbGxlZCBmcm9tIHRoZSB3cm9uZyBjb250ZXh0LiBUaGUgZXJyb3IgbWVzc2FnZSBpbmNsdWRlcyB0aGUgZXhhY3QgQVBJIGFuZCBob3cgdG8gbW92ZSB0aGUgY2FsbC4nO1xuY29uc3QgUlVOVElNRV9FUlJPUl9ISU5UID1cbiAgJ1RoaXMgaXMgYW4gaW50ZXJuYWwgd29ya2Zsb3cgU0RLIGVycm9yLCBub3QgYSBidWcgaW4geW91ciBjb2RlLiBJZiBpdCBrZWVwcyBoYXBwZW5pbmcsIHBsZWFzZSByZXBvcnQgaXQgd2l0aCB0aGUgc3RhY2sgdHJhY2UgYW5kIHRoZSBydW5JZC4nO1xuY29uc3QgQ09SUlVQVEVEX0VWRU5UX0xPR19ISU5UID1cbiAgJ1RoZSB3b3JrZmxvdyBldmVudCBsb2cgY29udGFpbnMgb3JwaGFuZWQgb3IgbWlzbWF0Y2hlZCBldmVudHMgYW5kIGNhbm5vdCBiZSByZXBsYXllZC4gVGhpcyBpcyBhbiBpbnRlcm5hbCB3b3JrZmxvdyBTREsgZXJyb3I7IHBsZWFzZSByZXBvcnQgaXQgd2l0aCB0aGUgcnVuSWQuJztcbmNvbnN0IFJFUExBWV9USU1FT1VUX0hJTlQgPVxuICAnVGhlIHdvcmtmbG93IHJlcGxheSBiZXR3ZWVuIHN0ZXAgYm91bmRhcmllcyB0b29rIHRvbyBsb25nLiBUaGlzIGJvdW5kcyB3b3JrZmxvdy1WTSBhbmQgZXZlbnQtbG9nIHJlcGxheSB0aW1lIG9ubHkg4oCUIHN0ZXAgYm9kaWVzIChgXCJ1c2Ugc3RlcFwiYCBmdW5jdGlvbnMpIGFyZSBleGNsdWRlZC4gVGhpcyB1c3VhbGx5IG1lYW5zIHRoZSBldmVudCBsb2cgaXMgdW51c3VhbGx5IGxhcmdlIG9yIHRoZSB3b3JrZmxvdyBmdW5jdGlvbiBpcyBkb2luZyBoZWF2eSBzeW5jaHJvbm91cyB3b3JrIGluIHdvcmtmbG93IGNvZGUgb3V0c2lkZSBvZiBzdGVwIGJvZGllcy4gT3ZlcnJpZGUgdGhlIGRlZmF1bHQgYnVkZ2V0IHZpYSB0aGUgV09SS0ZMT1dfUkVQTEFZX1RJTUVPVVRfTVMgZW52IHZhciBpZiBuZWVkZWQuJztcbmNvbnN0IE1BWF9ERUxJVkVSSUVTX0hJTlQgPVxuICAnVGhlIHdvcmtmbG93IHF1ZXVlIGV4Y2VlZGVkIGl0cyBtYXgtZGVsaXZlcnkgYnVkZ2V0LiBUaGlzIHVzdWFsbHkgaW5kaWNhdGVzIGEgcGVyc2lzdGVudCBydW50aW1lIGZhaWx1cmUg4oCUIGNoZWNrIHRoZSBtb3N0IHJlY2VudCBzdGFjayB0cmFjZXMgZm9yIHRoZSB1bmRlcmx5aW5nIGNhdXNlLic7XG5jb25zdCBXT1JMRF9DT05UUkFDVF9ISU5UID1cbiAgJ1RoZSB3b3JrZmxvdyBiYWNrZW5kIHJldHVybmVkIGRhdGEgdGhhdCB2aW9sYXRlZCB0aGUgU0RLIGNvbnRyYWN0LiBUaGlzIGlzIG5vdCByZXRyeWFibGU7IHBsZWFzZSByZXBvcnQgaXQgd2l0aCB0aGUgc3RhY2sgdHJhY2UgYW5kIHJ1bklkLic7XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUVycm9yQ29kZShjb2RlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBSdW5FcnJvckNvZGUge1xuICAvLyBWYWx1ZXMgcmVhZCBiYWNrIGZyb20gcGVyc2lzdGVkIGV2ZW50cyBhcmUgYHN0cmluZyB8IHVuZGVmaW5lZGAg4oCUIHdlXG4gIC8vIG9ubHkgdHJ1c3QgY29kZXMgdGhhdCBtYXRjaCBhIGtub3duIGVudHJ5IGluIGBSVU5fRVJST1JfQ09ERVNgLlxuICBjb25zdCBrbm93biA9IE9iamVjdC52YWx1ZXMoUlVOX0VSUk9SX0NPREVTKSBhcyByZWFkb25seSBzdHJpbmdbXTtcbiAgaWYgKGNvZGUgJiYga25vd24uaW5jbHVkZXMoY29kZSkpIHtcbiAgICByZXR1cm4gY29kZSBhcyBSdW5FcnJvckNvZGU7XG4gIH1cbiAgcmV0dXJuIFJVTl9FUlJPUl9DT0RFUy5VU0VSX0VSUk9SO1xufVxuXG4vKipcbiAqIERhdGEtZHJpdmVuIHZhcmlhbnQgb2Yge0BsaW5rIGRlc2NyaWJlRXJyb3J9IHRoYXQgd29ya3MgZnJvbSBwZXJzaXN0ZWRcbiAqIGV2ZW50IGZpZWxkcyBpbnN0ZWFkIG9mIGEgbGl2ZSBgRXJyb3JgIGluc3RhbmNlLiBJbnRlbmRlZCBmb3IgQ0xJL3dlYlxuICogcmVuZGVyZXJzIHRoYXQgcmVhZCBmYWlsdXJlIGV2ZW50cyBhbmQgbm8gbG9uZ2VyIGhhdmUgdGhlIG9yaWdpbmFsXG4gKiB0aHJvd24gb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVzY3JpYmVSdW5FcnJvcihcbiAgc2lnbmFsOiBQZXJzaXN0ZWRFcnJvclNpZ25hbFxuKTogRXJyb3JEZXNjcmlwdGlvbiB7XG4gIGNvbnN0IG5hbWUgPSBzaWduYWwuZXJyb3JOYW1lO1xuICBjb25zdCBlcnJvckNvZGUgPVxuICAgIG5hbWUgPT09ICdDb3JydXB0ZWRFdmVudExvZ0Vycm9yJ1xuICAgICAgPyBSVU5fRVJST1JfQ09ERVMuQ09SUlVQVEVEX0VWRU5UX0xPR1xuICAgICAgOiBub3JtYWxpemVFcnJvckNvZGUoc2lnbmFsLmVycm9yQ29kZSk7XG5cbiAgaWYgKG5hbWUgPT09ICdTZXJpYWxpemF0aW9uRXJyb3InKSB7XG4gICAgcmV0dXJuIHsgYXR0cmlidXRpb246ICd1c2VyJywgZXJyb3JDb2RlLCBoaW50OiBTRVJJQUxJWkFUSU9OX0VSUk9SX0hJTlQgfTtcbiAgfVxuICBpZiAobmFtZSAmJiBDT05URVhUX0VSUk9SX05BTUVTLmhhcyhuYW1lKSkge1xuICAgIHJldHVybiB7IGF0dHJpYnV0aW9uOiAndXNlcicsIGVycm9yQ29kZSwgaGludDogQ09OVEVYVF9FUlJPUl9ISU5UIH07XG4gIH1cbiAgaWYgKG5hbWUgPT09ICdDb3JydXB0ZWRFdmVudExvZ0Vycm9yJykge1xuICAgIHJldHVybiB7XG4gICAgICBhdHRyaWJ1dGlvbjogJ3NkaycsXG4gICAgICBlcnJvckNvZGUsXG4gICAgICBoaW50OiBDT1JSVVBURURfRVZFTlRfTE9HX0hJTlQsXG4gICAgfTtcbiAgfVxuICBpZiAoZXJyb3JDb2RlID09PSBSVU5fRVJST1JfQ09ERVMuUkVQTEFZX1RJTUVPVVQpIHtcbiAgICByZXR1cm4geyBhdHRyaWJ1dGlvbjogJ3NkaycsIGVycm9yQ29kZSwgaGludDogUkVQTEFZX1RJTUVPVVRfSElOVCB9O1xuICB9XG4gIGlmIChlcnJvckNvZGUgPT09IFJVTl9FUlJPUl9DT0RFUy5NQVhfREVMSVZFUklFU19FWENFRURFRCkge1xuICAgIHJldHVybiB7IGF0dHJpYnV0aW9uOiAnc2RrJywgZXJyb3JDb2RlLCBoaW50OiBNQVhfREVMSVZFUklFU19ISU5UIH07XG4gIH1cbiAgaWYgKGVycm9yQ29kZSA9PT0gUlVOX0VSUk9SX0NPREVTLkNPUlJVUFRFRF9FVkVOVF9MT0cpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYXR0cmlidXRpb246ICdzZGsnLFxuICAgICAgZXJyb3JDb2RlLFxuICAgICAgaGludDogQ09SUlVQVEVEX0VWRU5UX0xPR19ISU5ULFxuICAgIH07XG4gIH1cbiAgaWYgKGVycm9yQ29kZSA9PT0gUlVOX0VSUk9SX0NPREVTLldPUkxEX0NPTlRSQUNUX0VSUk9SKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGF0dHJpYnV0aW9uOiAnc2RrJyxcbiAgICAgIGVycm9yQ29kZSxcbiAgICAgIGhpbnQ6IFdPUkxEX0NPTlRSQUNUX0hJTlQsXG4gICAgfTtcbiAgfVxuICBpZiAobmFtZSA9PT0gJ1dvcmtmbG93UnVudGltZUVycm9yJyB8fCBuYW1lID09PSAnU3RlcE5vdFJlZ2lzdGVyZWRFcnJvcicpIHtcbiAgICByZXR1cm4geyBhdHRyaWJ1dGlvbjogJ3NkaycsIGVycm9yQ29kZSwgaGludDogUlVOVElNRV9FUlJPUl9ISU5UIH07XG4gIH1cbiAgaWYgKGVycm9yQ29kZSA9PT0gUlVOX0VSUk9SX0NPREVTLlJVTlRJTUVfRVJST1IpIHtcbiAgICByZXR1cm4geyBhdHRyaWJ1dGlvbjogJ3NkaycsIGVycm9yQ29kZSwgaGludDogUlVOVElNRV9FUlJPUl9ISU5UIH07XG4gIH1cbiAgcmV0dXJuIHsgYXR0cmlidXRpb246ICd1c2VyJywgZXJyb3JDb2RlIH07XG59XG5cbi8qKlxuICogRGVzY3JpYmUgYW4gZXJyb3IgZm9yIHVzZXItZmFjaW5nIHByZXNlbnRhdGlvbi4gUHVyZWx5IGluZm9ybWF0aW9uYWwg4oCUXG4gKiBkb2VzIG5vdCBjaGFuZ2UgYW55IHBlcnNpc3RlZCBldmVudCBkYXRhIG9yIGVycm9yIGNsYXNzaWZpY2F0aW9uIHVzZWQgYnlcbiAqIHRoZSBydW50aW1lLlxuICpcbiAqIFRoZSBhdHRyaWJ1dGlvbiBoZXJlIGlzIG1vcmUgbnVhbmNlZCB0aGFuIGBjbGFzc2lmeVJ1bkVycm9yYDpcbiAqXG4gKiAtIGBTZXJpYWxpemF0aW9uRXJyb3JgIGlzIHRlY2huaWNhbGx5IHJhaXNlZCBieSB0aGUgU0RLLCBidXQgaXQgYWxtb3N0XG4gKiAgIGFsd2F5cyBwb2ludHMgYXQgc29tZXRoaW5nIHRoZSBjYWxsZXIgZGlkIChwYXNzZWQgYSBub24tc2VyaWFsaXphYmxlXG4gKiAgIHZhbHVlLCBkaWRuJ3QgcmVnaXN0ZXIgYSBjbGFzcykuIFdlIGF0dHJpYnV0ZSBpdCB0byB0aGUgdXNlci5cbiAqIC0gQ29udGV4dC12aW9sYXRpb24gZXJyb3JzIChgTm90SW5Xb3JrZmxvd0NvbnRleHRFcnJvcmAsIGV0Yy4pIGxpa2V3aXNlXG4gKiAgIGRlc2NyaWJlIGEgdXNlciBtaXN0YWtlLlxuICogLSBgV29ya2Zsb3dSdW50aW1lRXJyb3JgIChhbmQgc3ViY2xhc3NlcyBsaWtlIGBTdGVwTm90UmVnaXN0ZXJlZEVycm9yYClcbiAqICAgaW5kaWNhdGVzIGFuIGludGVybmFsIFNESyBpbnZhcmlhbnQgYnJva2Ug4oCUIHN1cmZhY2UgdGhhdCBhcyBgc2RrYC5cbiAqXG4gKiBAcGFyYW0gZXJyIFRoZSBlcnJvciB2YWx1ZSB0aHJvd24gYnkgdGhlIHdvcmtmbG93IC8gc3RlcC5cbiAqIEBwYXJhbSBlcnJvckNvZGUgT3B0aW9uYWwgcHJlY29tcHV0ZWQgZXJyb3IgY29kZS4gQ2FsbGVycyB0aGF0IGFscmVhZHlcbiAqICAga25vdyB0aGUgY29kZSAoZS5nLiBgUkVQTEFZX1RJTUVPVVRgIG9yIGBNQVhfREVMSVZFUklFU19FWENFRURFRGAsIHdoaWNoXG4gKiAgIGBjbGFzc2lmeVJ1bkVycm9yYCBjYW4ndCBkZXJpdmUgZnJvbSB0aGUgZXJyb3IgYWxvbmUpIHNob3VsZCBwYXNzIGl0IHNvXG4gKiAgIHRoZSBhdHRyaWJ1dGlvbiBhbmQgaGludCByZWZsZWN0IHRoZSBhY3R1YWwgZmFpbHVyZSBjYXRlZ29yeS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlc2NyaWJlRXJyb3IoXG4gIGVycjogdW5rbm93bixcbiAgZXJyb3JDb2RlPzogUnVuRXJyb3JDb2RlXG4pOiBFcnJvckRlc2NyaXB0aW9uIHtcbiAgY29uc3QgZWZmZWN0aXZlQ29kZSA9IGVycm9yQ29kZSA/PyBjbGFzc2lmeVJ1bkVycm9yKGVycik7XG5cbiAgaWYgKFNlcmlhbGl6YXRpb25FcnJvci5pcyhlcnIpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGF0dHJpYnV0aW9uOiAndXNlcicsXG4gICAgICBlcnJvckNvZGU6IGVmZmVjdGl2ZUNvZGUsXG4gICAgICBoaW50OiBTRVJJQUxJWkFUSU9OX0VSUk9SX0hJTlQsXG4gICAgfTtcbiAgfVxuXG4gIGlmIChpc0NvbnRleHRWaW9sYXRpb25FcnJvcihlcnIpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGF0dHJpYnV0aW9uOiAndXNlcicsXG4gICAgICBlcnJvckNvZGU6IGVmZmVjdGl2ZUNvZGUsXG4gICAgICBoaW50OiBDT05URVhUX0VSUk9SX0hJTlQsXG4gICAgfTtcbiAgfVxuXG4gIGlmIChDb3JydXB0ZWRFdmVudExvZ0Vycm9yLmlzKGVycikpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYXR0cmlidXRpb246ICdzZGsnLFxuICAgICAgZXJyb3JDb2RlOiBlZmZlY3RpdmVDb2RlLFxuICAgICAgaGludDogQ09SUlVQVEVEX0VWRU5UX0xPR19ISU5ULFxuICAgIH07XG4gIH1cblxuICBpZiAoZXJyIGluc3RhbmNlb2YgV29ya2Zsb3dSdW50aW1lRXJyb3IpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYXR0cmlidXRpb246ICdzZGsnLFxuICAgICAgZXJyb3JDb2RlOiBlZmZlY3RpdmVDb2RlLFxuICAgICAgaGludDogUlVOVElNRV9FUlJPUl9ISU5ULFxuICAgIH07XG4gIH1cblxuICBpZiAoZWZmZWN0aXZlQ29kZSA9PT0gUlVOX0VSUk9SX0NPREVTLlJFUExBWV9USU1FT1VUKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGF0dHJpYnV0aW9uOiAnc2RrJyxcbiAgICAgIGVycm9yQ29kZTogZWZmZWN0aXZlQ29kZSxcbiAgICAgIGhpbnQ6IFJFUExBWV9USU1FT1VUX0hJTlQsXG4gICAgfTtcbiAgfVxuXG4gIGlmIChlZmZlY3RpdmVDb2RlID09PSBSVU5fRVJST1JfQ09ERVMuTUFYX0RFTElWRVJJRVNfRVhDRUVERUQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYXR0cmlidXRpb246ICdzZGsnLFxuICAgICAgZXJyb3JDb2RlOiBlZmZlY3RpdmVDb2RlLFxuICAgICAgaGludDogTUFYX0RFTElWRVJJRVNfSElOVCxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGVmZmVjdGl2ZUNvZGUgPT09IFJVTl9FUlJPUl9DT0RFUy5DT1JSVVBURURfRVZFTlRfTE9HKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGF0dHJpYnV0aW9uOiAnc2RrJyxcbiAgICAgIGVycm9yQ29kZTogZWZmZWN0aXZlQ29kZSxcbiAgICAgIGhpbnQ6IENPUlJVUFRFRF9FVkVOVF9MT0dfSElOVCxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGVmZmVjdGl2ZUNvZGUgPT09IFJVTl9FUlJPUl9DT0RFUy5XT1JMRF9DT05UUkFDVF9FUlJPUikge1xuICAgIHJldHVybiB7XG4gICAgICBhdHRyaWJ1dGlvbjogJ3NkaycsXG4gICAgICBlcnJvckNvZGU6IGVmZmVjdGl2ZUNvZGUsXG4gICAgICBoaW50OiBXT1JMRF9DT05UUkFDVF9ISU5ULFxuICAgIH07XG4gIH1cblxuICByZXR1cm4geyBhdHRyaWJ1dGlvbjogJ3VzZXInLCBlcnJvckNvZGU6IGVmZmVjdGl2ZUNvZGUgfTtcbn1cbiJdfQ==
@@ -22,10 +22,16 @@ export type CryptoKey = import('node:crypto').webcrypto.CryptoKey;
22
22
  * Callers should call this once per run (after `getEncryptionKeyForRun()`)
23
23
  * and pass the resulting `CryptoKey` to all subsequent encrypt/decrypt calls.
24
24
  *
25
+ * Pass `usages: ['encrypt']` (or `['decrypt']`) for cross-run scenarios
26
+ * where the caller should not be able to perform the inverse operation
27
+ * with the key — for example a child workflow writing into a parent
28
+ * run's forwarded WritableStream only needs to encrypt, never decrypt.
29
+ *
25
30
  * @param raw - Raw 32-byte AES-256 key (from World.getEncryptionKeyForRun)
31
+ * @param usages - Key usages. Defaults to `['encrypt', 'decrypt']`.
26
32
  * @returns CryptoKey ready for AES-GCM operations
27
33
  */
28
- export declare function importKey(raw: Uint8Array): Promise<import("crypto").webcrypto.CryptoKey>;
34
+ export declare function importKey(raw: Uint8Array, usages?: ReadonlyArray<'encrypt' | 'decrypt'>): Promise<import("crypto").webcrypto.CryptoKey>;
29
35
  /**
30
36
  * Encrypt data using AES-256-GCM.
31
37
  *
@@ -37,6 +43,21 @@ export declare function encrypt(key: CryptoKey, data: Uint8Array): Promise<Uint8
37
43
  /**
38
44
  * Decrypt data using AES-256-GCM.
39
45
  *
46
+ * Any failure inside the Web Crypto layer — most commonly an
47
+ * `OperationError: The operation failed for an operation-specific reason`
48
+ * raised by `AESCipherJob.onDone` when the GCM authentication tag does
49
+ * not verify — is rewrapped as {@link RuntimeDecryptionError}. The
50
+ * wrapped error carries the original DOMException as `cause`, plus a
51
+ * small diagnostic context (`operation`, input `byteLength`) to help
52
+ * disambiguate ciphertext corruption from key mismatch from truncated
53
+ * transport reads.
54
+ *
55
+ * Note: `data` is the raw AES payload (`[nonce][ciphertext + tag]`), not a
56
+ * format-prefixed envelope — callers strip the `encr` marker via
57
+ * `decodeFormatPrefix()` before reaching this function. The outer
58
+ * envelope's format prefix is therefore attached by the serialization
59
+ * layer (`serialization/encryption.ts`), which is the layer that has it.
60
+ *
40
61
  * @param key - CryptoKey from `importKey()`
41
62
  * @param data - `[nonce (12 bytes)][ciphertext + GCM auth tag]`
42
63
  * @returns Decrypted plaintext
@@ -1 +1 @@
1
- {"version":3,"file":"encryption.d.ts","sourceRoot":"","sources":["../src/encryption.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAKH,MAAM,MAAM,SAAS,GAAG,OAAO,aAAa,EAAE,SAAS,CAAC,SAAS,CAAC;AAMlE;;;;;;;;GAQG;AACH,wBAAsB,SAAS,CAAC,GAAG,EAAE,UAAU,iDAU9C;AAED;;;;;;GAMG;AACH,wBAAsB,OAAO,CAC3B,GAAG,EAAE,SAAS,EACd,IAAI,EAAE,UAAU,GACf,OAAO,CAAC,UAAU,CAAC,CAWrB;AAED;;;;;;GAMG;AACH,wBAAsB,OAAO,CAC3B,GAAG,EAAE,SAAS,EACd,IAAI,EAAE,UAAU,GACf,OAAO,CAAC,UAAU,CAAC,CAerB"}
1
+ {"version":3,"file":"encryption.d.ts","sourceRoot":"","sources":["../src/encryption.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;GAgBG;AAKH,MAAM,MAAM,SAAS,GAAG,OAAO,aAAa,EAAE,SAAS,CAAC,SAAS,CAAC;AAMlE;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,SAAS,CAC7B,GAAG,EAAE,UAAU,EACf,MAAM,GAAE,aAAa,CAAC,SAAS,GAAG,SAAS,CAA0B,iDAiBtE;AAED;;;;;;GAMG;AACH,wBAAsB,OAAO,CAC3B,GAAG,EAAE,SAAS,EACd,IAAI,EAAE,UAAU,GACf,OAAO,CAAC,UAAU,CAAC,CA4BrB;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,OAAO,CAC3B,GAAG,EAAE,SAAS,EACd,IAAI,EAAE,UAAU,GACf,OAAO,CAAC,UAAU,CAAC,CA0CrB"}
@@ -1,20 +1,4 @@
1
- /**
2
- * Browser-compatible AES-256-GCM encryption module.
3
- *
4
- * Uses the Web Crypto API (`globalThis.crypto.subtle`) which works in
5
- * both modern browsers and Node.js 20+. This module is intentionally
6
- * free of Node.js-specific imports so it can be bundled for the browser.
7
- *
8
- * The World interface (`getEncryptionKeyForRun`) returns a raw 32-byte
9
- * AES-256 key. Callers should use `importKey()` once to convert it to a
10
- * `CryptoKey`, then pass that to `encrypt()`/`decrypt()` for all
11
- * operations within the same run. This avoids repeated `importKey()`
12
- * calls on every encrypt/decrypt invocation.
13
- *
14
- * Wire format: `[nonce (12 bytes)][ciphertext + auth tag]`
15
- * The `encr` format prefix is NOT part of this module — it's added/stripped
16
- * by the serialization layer in `maybeEncrypt`/`maybeDecrypt`.
17
- */
1
+ import { RuntimeDecryptionError, WorkflowRuntimeError } from '@workflow/errors';
18
2
  const NONCE_LENGTH = 12;
19
3
  const TAG_LENGTH = 128; // bits
20
4
  const KEY_LENGTH = 32; // bytes (AES-256)
@@ -24,17 +8,24 @@ const KEY_LENGTH = 32; // bytes (AES-256)
24
8
  * Callers should call this once per run (after `getEncryptionKeyForRun()`)
25
9
  * and pass the resulting `CryptoKey` to all subsequent encrypt/decrypt calls.
26
10
  *
11
+ * Pass `usages: ['encrypt']` (or `['decrypt']`) for cross-run scenarios
12
+ * where the caller should not be able to perform the inverse operation
13
+ * with the key — for example a child workflow writing into a parent
14
+ * run's forwarded WritableStream only needs to encrypt, never decrypt.
15
+ *
27
16
  * @param raw - Raw 32-byte AES-256 key (from World.getEncryptionKeyForRun)
17
+ * @param usages - Key usages. Defaults to `['encrypt', 'decrypt']`.
28
18
  * @returns CryptoKey ready for AES-GCM operations
29
19
  */
30
- export async function importKey(raw) {
20
+ export async function importKey(raw, usages = ['encrypt', 'decrypt']) {
31
21
  if (raw.byteLength !== KEY_LENGTH) {
32
- throw new Error(`Encryption key must be exactly ${KEY_LENGTH} bytes, got ${raw.byteLength}`);
22
+ throw new WorkflowRuntimeError(`Encryption key must be exactly ${KEY_LENGTH} bytes, got ${raw.byteLength}`);
33
23
  }
34
- return globalThis.crypto.subtle.importKey('raw', raw, 'AES-GCM', false, [
35
- 'encrypt',
36
- 'decrypt',
37
- ]);
24
+ return globalThis.crypto.subtle.importKey('raw', raw, 'AES-GCM', false,
25
+ // `KeyUsage` is a DOM-lib type that's not in scope under `es2022`.
26
+ // The `ReadonlyArray<'encrypt' | 'decrypt'>` parameter type matches
27
+ // a strict subset of `KeyUsage[]`, so this cast is sound.
28
+ usages);
38
29
  }
39
30
  /**
40
31
  * Encrypt data using AES-256-GCM.
@@ -45,7 +36,22 @@ export async function importKey(raw) {
45
36
  */
46
37
  export async function encrypt(key, data) {
47
38
  const nonce = globalThis.crypto.getRandomValues(new Uint8Array(NONCE_LENGTH));
48
- const ciphertext = await globalThis.crypto.subtle.encrypt({ name: 'AES-GCM', iv: nonce, tagLength: TAG_LENGTH }, key, data);
39
+ let ciphertext;
40
+ try {
41
+ ciphertext = await globalThis.crypto.subtle.encrypt({ name: 'AES-GCM', iv: nonce, tagLength: TAG_LENGTH }, key, data);
42
+ }
43
+ catch (cause) {
44
+ // Re-wrap any Web Crypto failure (DOMException etc.) as a
45
+ // RuntimeDecryptionError. Failures here are rare — they happen e.g.
46
+ // when a CryptoKey was imported with `usages: ['decrypt']` only.
47
+ throw new RuntimeDecryptionError(`AES-256-GCM encryption failed: ${cause instanceof Error ? cause.message : String(cause)}`, {
48
+ cause,
49
+ context: {
50
+ operation: 'encrypt',
51
+ byteLength: data.byteLength,
52
+ },
53
+ });
54
+ }
49
55
  const result = new Uint8Array(NONCE_LENGTH + ciphertext.byteLength);
50
56
  result.set(nonce, 0);
51
57
  result.set(new Uint8Array(ciphertext), NONCE_LENGTH);
@@ -54,6 +60,21 @@ export async function encrypt(key, data) {
54
60
  /**
55
61
  * Decrypt data using AES-256-GCM.
56
62
  *
63
+ * Any failure inside the Web Crypto layer — most commonly an
64
+ * `OperationError: The operation failed for an operation-specific reason`
65
+ * raised by `AESCipherJob.onDone` when the GCM authentication tag does
66
+ * not verify — is rewrapped as {@link RuntimeDecryptionError}. The
67
+ * wrapped error carries the original DOMException as `cause`, plus a
68
+ * small diagnostic context (`operation`, input `byteLength`) to help
69
+ * disambiguate ciphertext corruption from key mismatch from truncated
70
+ * transport reads.
71
+ *
72
+ * Note: `data` is the raw AES payload (`[nonce][ciphertext + tag]`), not a
73
+ * format-prefixed envelope — callers strip the `encr` marker via
74
+ * `decodeFormatPrefix()` before reaching this function. The outer
75
+ * envelope's format prefix is therefore attached by the serialization
76
+ * layer (`serialization/encryption.ts`), which is the layer that has it.
77
+ *
57
78
  * @param key - CryptoKey from `importKey()`
58
79
  * @param data - `[nonce (12 bytes)][ciphertext + GCM auth tag]`
59
80
  * @returns Decrypted plaintext
@@ -61,11 +82,35 @@ export async function encrypt(key, data) {
61
82
  export async function decrypt(key, data) {
62
83
  const minLength = NONCE_LENGTH + TAG_LENGTH / 8; // nonce + auth tag
63
84
  if (data.byteLength < minLength) {
64
- throw new Error(`Encrypted data too short: expected at least ${minLength} bytes, got ${data.byteLength}`);
85
+ throw new RuntimeDecryptionError(`Encrypted data too short: expected at least ${minLength} bytes, got ${data.byteLength}`, {
86
+ context: {
87
+ operation: 'decrypt',
88
+ byteLength: data.byteLength,
89
+ },
90
+ });
65
91
  }
66
92
  const nonce = data.subarray(0, NONCE_LENGTH);
67
93
  const ciphertext = data.subarray(NONCE_LENGTH);
68
- const plaintext = await globalThis.crypto.subtle.decrypt({ name: 'AES-GCM', iv: nonce, tagLength: TAG_LENGTH }, key, ciphertext);
94
+ let plaintext;
95
+ try {
96
+ plaintext = await globalThis.crypto.subtle.decrypt({ name: 'AES-GCM', iv: nonce, tagLength: TAG_LENGTH }, key, ciphertext);
97
+ }
98
+ catch (cause) {
99
+ // The most common shape we see in the wild is a DOMException with
100
+ // `name: 'OperationError'` and message "The operation failed for
101
+ // an operation-specific reason" — this is what Web Crypto throws
102
+ // when the GCM auth tag does not verify. Re-throw as
103
+ // RuntimeDecryptionError, attaching diagnostic context (byte length)
104
+ // that the bare DOMException lacks.
105
+ const causeMsg = cause instanceof Error ? cause.message : String(cause);
106
+ throw new RuntimeDecryptionError(`AES-256-GCM decryption failed: ${causeMsg}`, {
107
+ cause,
108
+ context: {
109
+ operation: 'decrypt',
110
+ byteLength: data.byteLength,
111
+ },
112
+ });
113
+ }
69
114
  return new Uint8Array(plaintext);
70
115
  }
71
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jcnlwdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9lbmNyeXB0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBT0gsTUFBTSxZQUFZLEdBQUcsRUFBRSxDQUFDO0FBQ3hCLE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxDQUFDLE9BQU87QUFDL0IsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFDLENBQUMsa0JBQWtCO0FBRXpDOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxTQUFTLENBQUMsR0FBZTtJQUM3QyxJQUFJLEdBQUcsQ0FBQyxVQUFVLEtBQUssVUFBVSxFQUFFLENBQUM7UUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FDYixrQ0FBa0MsVUFBVSxlQUFlLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FDNUUsQ0FBQztJQUNKLENBQUM7SUFDRCxPQUFPLFVBQVUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUU7UUFDdEUsU0FBUztRQUNULFNBQVM7S0FDVixDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxPQUFPLENBQzNCLEdBQWMsRUFDZCxJQUFnQjtJQUVoQixNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO0lBQzlFLE1BQU0sVUFBVSxHQUFHLE1BQU0sVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUN2RCxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLEVBQ3JELEdBQUcsRUFDSCxJQUFJLENBQ0wsQ0FBQztJQUNGLE1BQU0sTUFBTSxHQUFHLElBQUksVUFBVSxDQUFDLFlBQVksR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDcEUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDckIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxVQUFVLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUNyRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxPQUFPLENBQzNCLEdBQWMsRUFDZCxJQUFnQjtJQUVoQixNQUFNLFNBQVMsR0FBRyxZQUFZLEdBQUcsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDLG1CQUFtQjtJQUNwRSxJQUFJLElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxFQUFFLENBQUM7UUFDaEMsTUFBTSxJQUFJLEtBQUssQ0FDYiwrQ0FBK0MsU0FBUyxlQUFlLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FDekYsQ0FBQztJQUNKLENBQUM7SUFDRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUM3QyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQy9DLE1BQU0sU0FBUyxHQUFHLE1BQU0sVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUN0RCxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLEVBQ3JELEdBQUcsRUFDSCxVQUFVLENBQ1gsQ0FBQztJQUNGLE9BQU8sSUFBSSxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDbkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQnJvd3Nlci1jb21wYXRpYmxlIEFFUy0yNTYtR0NNIGVuY3J5cHRpb24gbW9kdWxlLlxuICpcbiAqIFVzZXMgdGhlIFdlYiBDcnlwdG8gQVBJIChgZ2xvYmFsVGhpcy5jcnlwdG8uc3VidGxlYCkgd2hpY2ggd29ya3MgaW5cbiAqIGJvdGggbW9kZXJuIGJyb3dzZXJzIGFuZCBOb2RlLmpzIDIwKy4gVGhpcyBtb2R1bGUgaXMgaW50ZW50aW9uYWxseVxuICogZnJlZSBvZiBOb2RlLmpzLXNwZWNpZmljIGltcG9ydHMgc28gaXQgY2FuIGJlIGJ1bmRsZWQgZm9yIHRoZSBicm93c2VyLlxuICpcbiAqIFRoZSBXb3JsZCBpbnRlcmZhY2UgKGBnZXRFbmNyeXB0aW9uS2V5Rm9yUnVuYCkgcmV0dXJucyBhIHJhdyAzMi1ieXRlXG4gKiBBRVMtMjU2IGtleS4gQ2FsbGVycyBzaG91bGQgdXNlIGBpbXBvcnRLZXkoKWAgb25jZSB0byBjb252ZXJ0IGl0IHRvIGFcbiAqIGBDcnlwdG9LZXlgLCB0aGVuIHBhc3MgdGhhdCB0byBgZW5jcnlwdCgpYC9gZGVjcnlwdCgpYCBmb3IgYWxsXG4gKiBvcGVyYXRpb25zIHdpdGhpbiB0aGUgc2FtZSBydW4uIFRoaXMgYXZvaWRzIHJlcGVhdGVkIGBpbXBvcnRLZXkoKWBcbiAqIGNhbGxzIG9uIGV2ZXJ5IGVuY3J5cHQvZGVjcnlwdCBpbnZvY2F0aW9uLlxuICpcbiAqIFdpcmUgZm9ybWF0OiBgW25vbmNlICgxMiBieXRlcyldW2NpcGhlcnRleHQgKyBhdXRoIHRhZ11gXG4gKiBUaGUgYGVuY3JgIGZvcm1hdCBwcmVmaXggaXMgTk9UIHBhcnQgb2YgdGhpcyBtb2R1bGUg4oCUIGl0J3MgYWRkZWQvc3RyaXBwZWRcbiAqIGJ5IHRoZSBzZXJpYWxpemF0aW9uIGxheWVyIGluIGBtYXliZUVuY3J5cHRgL2BtYXliZURlY3J5cHRgLlxuICovXG5cbi8vIENyeXB0b0tleSBpcyBhIGdsb2JhbCB0eXBlIGluIGJyb3dzZXJzIGFuZCBOb2RlLmpzIDIwKywgYnV0IFR5cGVTY3JpcHQnc1xuLy8gYGVzMjAyMmAgbGliIGRvZXNuJ3QgaW5jbHVkZSBpdC4gUmUtZXhwb3J0IGl0IGZyb20gdGhlIG5vZGU6Y3J5cHRvIHR5cGVzXG4vLyBzbyBjb25zdW1lcnMgY2FuIHJlZmVyZW5jZSBpdCB3aXRob3V0IGFkZGluZyBgZG9tYCBsaWIuXG5leHBvcnQgdHlwZSBDcnlwdG9LZXkgPSBpbXBvcnQoJ25vZGU6Y3J5cHRvJykud2ViY3J5cHRvLkNyeXB0b0tleTtcblxuY29uc3QgTk9OQ0VfTEVOR1RIID0gMTI7XG5jb25zdCBUQUdfTEVOR1RIID0gMTI4OyAvLyBiaXRzXG5jb25zdCBLRVlfTEVOR1RIID0gMzI7IC8vIGJ5dGVzIChBRVMtMjU2KVxuXG4vKipcbiAqIEltcG9ydCBhIHJhdyBBRVMtMjU2IGtleSBhcyBhIGBDcnlwdG9LZXlgIGZvciB1c2Ugd2l0aCBgZW5jcnlwdCgpYC9gZGVjcnlwdCgpYC5cbiAqXG4gKiBDYWxsZXJzIHNob3VsZCBjYWxsIHRoaXMgb25jZSBwZXIgcnVuIChhZnRlciBgZ2V0RW5jcnlwdGlvbktleUZvclJ1bigpYClcbiAqIGFuZCBwYXNzIHRoZSByZXN1bHRpbmcgYENyeXB0b0tleWAgdG8gYWxsIHN1YnNlcXVlbnQgZW5jcnlwdC9kZWNyeXB0IGNhbGxzLlxuICpcbiAqIEBwYXJhbSByYXcgLSBSYXcgMzItYnl0ZSBBRVMtMjU2IGtleSAoZnJvbSBXb3JsZC5nZXRFbmNyeXB0aW9uS2V5Rm9yUnVuKVxuICogQHJldHVybnMgQ3J5cHRvS2V5IHJlYWR5IGZvciBBRVMtR0NNIG9wZXJhdGlvbnNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGltcG9ydEtleShyYXc6IFVpbnQ4QXJyYXkpIHtcbiAgaWYgKHJhdy5ieXRlTGVuZ3RoICE9PSBLRVlfTEVOR1RIKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEVuY3J5cHRpb24ga2V5IG11c3QgYmUgZXhhY3RseSAke0tFWV9MRU5HVEh9IGJ5dGVzLCBnb3QgJHtyYXcuYnl0ZUxlbmd0aH1gXG4gICAgKTtcbiAgfVxuICByZXR1cm4gZ2xvYmFsVGhpcy5jcnlwdG8uc3VidGxlLmltcG9ydEtleSgncmF3JywgcmF3LCAnQUVTLUdDTScsIGZhbHNlLCBbXG4gICAgJ2VuY3J5cHQnLFxuICAgICdkZWNyeXB0JyxcbiAgXSk7XG59XG5cbi8qKlxuICogRW5jcnlwdCBkYXRhIHVzaW5nIEFFUy0yNTYtR0NNLlxuICpcbiAqIEBwYXJhbSBrZXkgLSBDcnlwdG9LZXkgZnJvbSBgaW1wb3J0S2V5KClgXG4gKiBAcGFyYW0gZGF0YSAtIFBsYWludGV4dCB0byBlbmNyeXB0XG4gKiBAcmV0dXJucyBgW25vbmNlICgxMiBieXRlcyldW2NpcGhlcnRleHQgKyBHQ00gYXV0aCB0YWddYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5jcnlwdChcbiAga2V5OiBDcnlwdG9LZXksXG4gIGRhdGE6IFVpbnQ4QXJyYXlcbik6IFByb21pc2U8VWludDhBcnJheT4ge1xuICBjb25zdCBub25jZSA9IGdsb2JhbFRoaXMuY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheShOT05DRV9MRU5HVEgpKTtcbiAgY29uc3QgY2lwaGVydGV4dCA9IGF3YWl0IGdsb2JhbFRoaXMuY3J5cHRvLnN1YnRsZS5lbmNyeXB0KFxuICAgIHsgbmFtZTogJ0FFUy1HQ00nLCBpdjogbm9uY2UsIHRhZ0xlbmd0aDogVEFHX0xFTkdUSCB9LFxuICAgIGtleSxcbiAgICBkYXRhXG4gICk7XG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KE5PTkNFX0xFTkdUSCArIGNpcGhlcnRleHQuYnl0ZUxlbmd0aCk7XG4gIHJlc3VsdC5zZXQobm9uY2UsIDApO1xuICByZXN1bHQuc2V0KG5ldyBVaW50OEFycmF5KGNpcGhlcnRleHQpLCBOT05DRV9MRU5HVEgpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIERlY3J5cHQgZGF0YSB1c2luZyBBRVMtMjU2LUdDTS5cbiAqXG4gKiBAcGFyYW0ga2V5IC0gQ3J5cHRvS2V5IGZyb20gYGltcG9ydEtleSgpYFxuICogQHBhcmFtIGRhdGEgLSBgW25vbmNlICgxMiBieXRlcyldW2NpcGhlcnRleHQgKyBHQ00gYXV0aCB0YWddYFxuICogQHJldHVybnMgRGVjcnlwdGVkIHBsYWludGV4dFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVjcnlwdChcbiAga2V5OiBDcnlwdG9LZXksXG4gIGRhdGE6IFVpbnQ4QXJyYXlcbik6IFByb21pc2U8VWludDhBcnJheT4ge1xuICBjb25zdCBtaW5MZW5ndGggPSBOT05DRV9MRU5HVEggKyBUQUdfTEVOR1RIIC8gODsgLy8gbm9uY2UgKyBhdXRoIHRhZ1xuICBpZiAoZGF0YS5ieXRlTGVuZ3RoIDwgbWluTGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEVuY3J5cHRlZCBkYXRhIHRvbyBzaG9ydDogZXhwZWN0ZWQgYXQgbGVhc3QgJHttaW5MZW5ndGh9IGJ5dGVzLCBnb3QgJHtkYXRhLmJ5dGVMZW5ndGh9YFxuICAgICk7XG4gIH1cbiAgY29uc3Qgbm9uY2UgPSBkYXRhLnN1YmFycmF5KDAsIE5PTkNFX0xFTkdUSCk7XG4gIGNvbnN0IGNpcGhlcnRleHQgPSBkYXRhLnN1YmFycmF5KE5PTkNFX0xFTkdUSCk7XG4gIGNvbnN0IHBsYWludGV4dCA9IGF3YWl0IGdsb2JhbFRoaXMuY3J5cHRvLnN1YnRsZS5kZWNyeXB0KFxuICAgIHsgbmFtZTogJ0FFUy1HQ00nLCBpdjogbm9uY2UsIHRhZ0xlbmd0aDogVEFHX0xFTkdUSCB9LFxuICAgIGtleSxcbiAgICBjaXBoZXJ0ZXh0XG4gICk7XG4gIHJldHVybiBuZXcgVWludDhBcnJheShwbGFpbnRleHQpO1xufVxuIl19
116
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jcnlwdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9lbmNyeXB0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBeUJoRixNQUFNLFlBQVksR0FBRyxFQUFFLENBQUM7QUFDeEIsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLENBQUMsT0FBTztBQUMvQixNQUFNLFVBQVUsR0FBRyxFQUFFLENBQUMsQ0FBQyxrQkFBa0I7QUFFekM7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLFNBQVMsQ0FDN0IsR0FBZSxFQUNmLFNBQStDLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQztJQUVyRSxJQUFJLEdBQUcsQ0FBQyxVQUFVLEtBQUssVUFBVSxFQUFFLENBQUM7UUFDbEMsTUFBTSxJQUFJLG9CQUFvQixDQUM1QixrQ0FBa0MsVUFBVSxlQUFlLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FDNUUsQ0FBQztJQUNKLENBQUM7SUFDRCxPQUFPLFVBQVUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FDdkMsS0FBSyxFQUNMLEdBQUcsRUFDSCxTQUFTLEVBQ1QsS0FBSztJQUNMLG1FQUFtRTtJQUNuRSxvRUFBb0U7SUFDcEUsMERBQTBEO0lBQzFELE1BQW1DLENBQ3BDLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxPQUFPLENBQzNCLEdBQWMsRUFDZCxJQUFnQjtJQUVoQixNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO0lBQzlFLElBQUksVUFBdUIsQ0FBQztJQUM1QixJQUFJLENBQUM7UUFDSCxVQUFVLEdBQUcsTUFBTSxVQUFVLENBQUMsTUFBTSxD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ZWNyeXB0aW9uRXJyb3IsIFdvcmtmbG93UnVudGltZUVycm9yIH0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5cbi8qKlxuICogQnJvd3Nlci1jb21wYXRpYmxlIEFFUy0yNTYtR0NNIGVuY3J5cHRpb24gbW9kdWxlLlxuICpcbiAqIFVzZXMgdGhlIFdlYiBDcnlwdG8gQVBJIChgZ2xvYmFsVGhpcy5jcnlwdG8uc3VidGxlYCkgd2hpY2ggd29ya3MgaW5cbiAqIGJvdGggbW9kZXJuIGJyb3dzZXJzIGFuZCBOb2RlLmpzIDIwKy4gVGhpcyBtb2R1bGUgaXMgaW50ZW50aW9uYWxseVxuICogZnJlZSBvZiBOb2RlLmpzLXNwZWNpZmljIGltcG9ydHMgc28gaXQgY2FuIGJlIGJ1bmRsZWQgZm9yIHRoZSBicm93c2VyLlxuICpcbiAqIFRoZSBXb3JsZCBpbnRlcmZhY2UgKGBnZXRFbmNyeXB0aW9uS2V5Rm9yUnVuYCkgcmV0dXJucyBhIHJhdyAzMi1ieXRlXG4gKiBBRVMtMjU2IGtleS4gQ2FsbGVycyBzaG91bGQgdXNlIGBpbXBvcnRLZXkoKWAgb25jZSB0byBjb252ZXJ0IGl0IHRvIGFcbiAqIGBDcnlwdG9LZXlgLCB0aGVuIHBhc3MgdGhhdCB0byBgZW5jcnlwdCgpYC9gZGVjcnlwdCgpYCBmb3IgYWxsXG4gKiBvcGVyYXRpb25zIHdpdGhpbiB0aGUgc2FtZSBydW4uIFRoaXMgYXZvaWRzIHJlcGVhdGVkIGBpbXBvcnRLZXkoKWBcbiAqIGNhbGxzIG9uIGV2ZXJ5IGVuY3J5cHQvZGVjcnlwdCBpbnZvY2F0aW9uLlxuICpcbiAqIFdpcmUgZm9ybWF0OiBgW25vbmNlICgxMiBieXRlcyldW2NpcGhlcnRleHQgKyBhdXRoIHRhZ11gXG4gKiBUaGUgYGVuY3JgIGZvcm1hdCBwcmVmaXggaXMgTk9UIHBhcnQgb2YgdGhpcyBtb2R1bGUg4oCUIGl0J3MgYWRkZWQvc3RyaXBwZWRcbiAqIGJ5IHRoZSBzZXJpYWxpemF0aW9uIGxheWVyIGluIGBtYXliZUVuY3J5cHRgL2BtYXliZURlY3J5cHRgLlxuICovXG5cbi8vIENyeXB0b0tleSBpcyBhIGdsb2JhbCB0eXBlIGluIGJyb3dzZXJzIGFuZCBOb2RlLmpzIDIwKywgYnV0IFR5cGVTY3JpcHQnc1xuLy8gYGVzMjAyMmAgbGliIGRvZXNuJ3QgaW5jbHVkZSBpdC4gUmUtZXhwb3J0IGl0IGZyb20gdGhlIG5vZGU6Y3J5cHRvIHR5cGVzXG4vLyBzbyBjb25zdW1lcnMgY2FuIHJlZmVyZW5jZSBpdCB3aXRob3V0IGFkZGluZyBgZG9tYCBsaWIuXG5leHBvcnQgdHlwZSBDcnlwdG9LZXkgPSBpbXBvcnQoJ25vZGU6Y3J5cHRvJykud2ViY3J5cHRvLkNyeXB0b0tleTtcblxuY29uc3QgTk9OQ0VfTEVOR1RIID0gMTI7XG5jb25zdCBUQUdfTEVOR1RIID0gMTI4OyAvLyBiaXRzXG5jb25zdCBLRVlfTEVOR1RIID0gMzI7IC8vIGJ5dGVzIChBRVMtMjU2KVxuXG4vKipcbiAqIEltcG9ydCBhIHJhdyBBRVMtMjU2IGtleSBhcyBhIGBDcnlwdG9LZXlgIGZvciB1c2Ugd2l0aCBgZW5jcnlwdCgpYC9gZGVjcnlwdCgpYC5cbiAqXG4gKiBDYWxsZXJzIHNob3VsZCBjYWxsIHRoaXMgb25jZSBwZXIgcnVuIChhZnRlciBgZ2V0RW5jcnlwdGlvbktleUZvclJ1bigpYClcbiAqIGFuZCBwYXNzIHRoZSByZXN1bHRpbmcgYENyeXB0b0tleWAgdG8gYWxsIHN1YnNlcXVlbnQgZW5jcnlwdC9kZWNyeXB0IGNhbGxzLlxuICpcbiAqIFBhc3MgYHVzYWdlczogWydlbmNyeXB0J11gIChvciBgWydkZWNyeXB0J11gKSBmb3IgY3Jvc3MtcnVuIHNjZW5hcmlvc1xuICogd2hlcmUgdGhlIGNhbGxlciBzaG91bGQgbm90IGJlIGFibGUgdG8gcGVyZm9ybSB0aGUgaW52ZXJzZSBvcGVyYXRpb25cbiAqIHdpdGggdGhlIGtleSDigJQgZm9yIGV4YW1wbGUgYSBjaGlsZCB3b3JrZmxvdyB3cml0aW5nIGludG8gYSBwYXJlbnRcbiAqIHJ1bidzIGZvcndhcmRlZCBXcml0YWJsZVN0cmVhbSBvbmx5IG5lZWRzIHRvIGVuY3J5cHQsIG5ldmVyIGRlY3J5cHQuXG4gKlxuICogQHBhcmFtIHJhdyAtIFJhdyAzMi1ieXRlIEFFUy0yNTYga2V5IChmcm9tIFdvcmxkLmdldEVuY3J5cHRpb25LZXlGb3JSdW4pXG4gKiBAcGFyYW0gdXNhZ2VzIC0gS2V5IHVzYWdlcy4gRGVmYXVsdHMgdG8gYFsnZW5jcnlwdCcsICdkZWNyeXB0J11gLlxuICogQHJldHVybnMgQ3J5cHRvS2V5IHJlYWR5IGZvciBBRVMtR0NNIG9wZXJhdGlvbnNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGltcG9ydEtleShcbiAgcmF3OiBVaW50OEFycmF5LFxuICB1c2FnZXM6IFJlYWRvbmx5QXJyYXk8J2VuY3J5cHQnIHwgJ2RlY3J5cHQnPiA9IFsnZW5jcnlwdCcsICdkZWNyeXB0J11cbikge1xuICBpZiAocmF3LmJ5dGVMZW5ndGggIT09IEtFWV9MRU5HVEgpIHtcbiAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICBgRW5jcnlwdGlvbiBrZXkgbXVzdCBiZSBleGFjdGx5ICR7S0VZX0xFTkdUSH0gYnl0ZXMsIGdvdCAke3Jhdy5ieXRlTGVuZ3RofWBcbiAgICApO1xuICB9XG4gIHJldHVybiBnbG9iYWxUaGlzLmNyeXB0by5zdWJ0bGUuaW1wb3J0S2V5KFxuICAgICdyYXcnLFxuICAgIHJhdyxcbiAgICAnQUVTLUdDTScsXG4gICAgZmFsc2UsXG4gICAgLy8gYEtleVVzYWdlYCBpcyBhIERPTS1saWIgdHlwZSB0aGF0J3Mgbm90IGluIHNjb3BlIHVuZGVyIGBlczIwMjJgLlxuICAgIC8vIFRoZSBgUmVhZG9ubHlBcnJheTwnZW5jcnlwdCcgfCAnZGVjcnlwdCc+YCBwYXJhbWV0ZXIgdHlwZSBtYXRjaGVzXG4gICAgLy8gYSBzdHJpY3Qgc3Vic2V0IG9mIGBLZXlVc2FnZVtdYCwgc28gdGhpcyBjYXN0IGlzIHNvdW5kLlxuICAgIHVzYWdlcyBhcyAoJ2VuY3J5cHQnIHwgJ2RlY3J5cHQnKVtdXG4gICk7XG59XG5cbi8qKlxuICogRW5jcnlwdCBkYXRhIHVzaW5nIEFFUy0yNTYtR0NNLlxuICpcbiAqIEBwYXJhbSBrZXkgLSBDcnlwdG9LZXkgZnJvbSBgaW1wb3J0S2V5KClgXG4gKiBAcGFyYW0gZGF0YSAtIFBsYWludGV4dCB0byBlbmNyeXB0XG4gKiBAcmV0dXJucyBgW25vbmNlICgxMiBieXRlcyldW2NpcGhlcnRleHQgKyBHQ00gYXV0aCB0YWddYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5jcnlwdChcbiAga2V5OiBDcnlwdG9LZXksXG4gIGRhdGE6IFVpbnQ4QXJyYXlcbik6IFByb21pc2U8VWludDhBcnJheT4ge1xuICBjb25zdCBub25jZSA9IGdsb2JhbFRoaXMuY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheShOT05DRV9MRU5HVEgpKTtcbiAgbGV0IGNpcGhlcnRleHQ6IEFycmF5QnVmZmVyO1xuICB0cnkge1xuICAgIGNpcGhlcnRleHQgPSBhd2FpdCBnbG9iYWxUaGlzLmNyeXB0by5zdWJ0bGUuZW5jcnlwdChcbiAgICAgIHsgbmFtZTogJ0FFUy1HQ00nLCBpdjogbm9uY2UsIHRhZ0xlbmd0aDogVEFHX0xFTkdUSCB9LFxuICAgICAga2V5LFxuICAgICAgZGF0YVxuICAgICk7XG4gIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgLy8gUmUtd3JhcCBhbnkgV2ViIENyeXB0byBmYWlsdXJlIChET01FeGNlcHRpb24gZXRjLikgYXMgYVxuICAgIC8vIFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3IuIEZhaWx1cmVzIGhlcmUgYXJlIHJhcmUg4oCUIHRoZXkgaGFwcGVuIGUuZy5cbiAgICAvLyB3aGVuIGEgQ3J5cHRvS2V5IHdhcyBpbXBvcnRlZCB3aXRoIGB1c2FnZXM6IFsnZGVjcnlwdCddYCBvbmx5LlxuICAgIHRocm93IG5ldyBSdW50aW1lRGVjcnlwdGlvbkVycm9yKFxuICAgICAgYEFFUy0yNTYtR0NNIGVuY3J5cHRpb24gZmFpbGVkOiAke2NhdXNlIGluc3RhbmNlb2YgRXJyb3IgPyBjYXVzZS5tZXNzYWdlIDogU3RyaW5nKGNhdXNlKX1gLFxuICAgICAge1xuICAgICAgICBjYXVzZSxcbiAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgIG9wZXJhdGlvbjogJ2VuY3J5cHQnLFxuICAgICAgICAgIGJ5dGVMZW5ndGg6IGRhdGEuYnl0ZUxlbmd0aCxcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICApO1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KE5PTkNFX0xFTkdUSCArIGNpcGhlcnRleHQuYnl0ZUxlbmd0aCk7XG4gIHJlc3VsdC5zZXQobm9uY2UsIDApO1xuICByZXN1bHQuc2V0KG5ldyBVaW50OEFycmF5KGNpcGhlcnRleHQpLCBOT05DRV9MRU5HVEgpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIERlY3J5cHQgZGF0YSB1c2luZyBBRVMtMjU2LUdDTS5cbiAqXG4gKiBBbnkgZmFpbHVyZSBpbnNpZGUgdGhlIFdlYiBDcnlwdG8gbGF5ZXIg4oCUIG1vc3QgY29tbW9ubHkgYW5cbiAqIGBPcGVyYXRpb25FcnJvcjogVGhlIG9wZXJhdGlvbiBmYWlsZWQgZm9yIGFuIG9wZXJhdGlvbi1zcGVjaWZpYyByZWFzb25gXG4gKiByYWlzZWQgYnkgYEFFU0NpcGhlckpvYi5vbkRvbmVgIHdoZW4gdGhlIEdDTSBhdXRoZW50aWNhdGlvbiB0YWcgZG9lc1xuICogbm90IHZlcmlmeSDigJQgaXMgcmV3cmFwcGVkIGFzIHtAbGluayBSdW50aW1lRGVjcnlwdGlvbkVycm9yfS4gVGhlXG4gKiB3cmFwcGVkIGVycm9yIGNhcnJpZXMgdGhlIG9yaWdpbmFsIERPTUV4Y2VwdGlvbiBhcyBgY2F1c2VgLCBwbHVzIGFcbiAqIHNtYWxsIGRpYWdub3N0aWMgY29udGV4dCAoYG9wZXJhdGlvbmAsIGlucHV0IGBieXRlTGVuZ3RoYCkgdG8gaGVscFxuICogZGlzYW1iaWd1YXRlIGNpcGhlcnRleHQgY29ycnVwdGlvbiBmcm9tIGtleSBtaXNtYXRjaCBmcm9tIHRydW5jYXRlZFxuICogdHJhbnNwb3J0IHJlYWRzLlxuICpcbiAqIE5vdGU6IGBkYXRhYCBpcyB0aGUgcmF3IEFFUyBwYXlsb2FkIChgW25vbmNlXVtjaXBoZXJ0ZXh0ICsgdGFnXWApLCBub3QgYVxuICogZm9ybWF0LXByZWZpeGVkIGVudmVsb3BlIOKAlCBjYWxsZXJzIHN0cmlwIHRoZSBgZW5jcmAgbWFya2VyIHZpYVxuICogYGRlY29kZUZvcm1hdFByZWZpeCgpYCBiZWZvcmUgcmVhY2hpbmcgdGhpcyBmdW5jdGlvbi4gVGhlIG91dGVyXG4gKiBlbnZlbG9wZSdzIGZvcm1hdCBwcmVmaXggaXMgdGhlcmVmb3JlIGF0dGFjaGVkIGJ5IHRoZSBzZXJpYWxpemF0aW9uXG4gKiBsYXllciAoYHNlcmlhbGl6YXRpb24vZW5jcnlwdGlvbi50c2ApLCB3aGljaCBpcyB0aGUgbGF5ZXIgdGhhdCBoYXMgaXQuXG4gKlxuICogQHBhcmFtIGtleSAtIENyeXB0b0tleSBmcm9tIGBpbXBvcnRLZXkoKWBcbiAqIEBwYXJhbSBkYXRhIC0gYFtub25jZSAoMTIgYnl0ZXMpXVtjaXBoZXJ0ZXh0ICsgR0NNIGF1dGggdGFnXWBcbiAqIEByZXR1cm5zIERlY3J5cHRlZCBwbGFpbnRleHRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlY3J5cHQoXG4gIGtleTogQ3J5cHRvS2V5LFxuICBkYXRhOiBVaW50OEFycmF5XG4pOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgY29uc3QgbWluTGVuZ3RoID0gTk9OQ0VfTEVOR1RIICsgVEFHX0xFTkdUSCAvIDg7IC8vIG5vbmNlICsgYXV0aCB0YWdcbiAgaWYgKGRhdGEuYnl0ZUxlbmd0aCA8IG1pbkxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSdW50aW1lRGVjcnlwdGlvbkVycm9yKFxuICAgICAgYEVuY3J5cHRlZCBkYXRhIHRvbyBzaG9ydDogZXhwZWN0ZWQgYXQgbGVhc3QgJHttaW5MZW5ndGh9IGJ5dGVzLCBnb3QgJHtkYXRhLmJ5dGVMZW5ndGh9YCxcbiAgICAgIHtcbiAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgIG9wZXJhdGlvbjogJ2RlY3J5cHQnLFxuICAgICAgICAgIGJ5dGVMZW5ndGg6IGRhdGEuYnl0ZUxlbmd0aCxcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICApO1xuICB9XG4gIGNvbnN0IG5vbmNlID0gZGF0YS5zdWJhcnJheSgwLCBOT05DRV9MRU5HVEgpO1xuICBjb25zdCBjaXBoZXJ0ZXh0ID0gZGF0YS5zdWJhcnJheShOT05DRV9MRU5HVEgpO1xuICBsZXQgcGxhaW50ZXh0OiBBcnJheUJ1ZmZlcjtcbiAgdHJ5IHtcbiAgICBwbGFpbnRleHQgPSBhd2FpdCBnbG9iYWxUaGlzLmNyeXB0by5zdWJ0bGUuZGVjcnlwdChcbiAgICAgIHsgbmFtZTogJ0FFUy1HQ00nLCBpdjogbm9uY2UsIHRhZ0xlbmd0aDogVEFHX0xFTkdUSCB9LFxuICAgICAga2V5LFxuICAgICAgY2lwaGVydGV4dFxuICAgICk7XG4gIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgLy8gVGhlIG1vc3QgY29tbW9uIHNoYXBlIHdlIHNlZSBpbiB0aGUgd2lsZCBpcyBhIERPTUV4Y2VwdGlvbiB3aXRoXG4gICAgLy8gYG5hbWU6ICdPcGVyYXRpb25FcnJvcidgIGFuZCBtZXNzYWdlIFwiVGhlIG9wZXJhdGlvbiBmYWlsZWQgZm9yXG4gICAgLy8gYW4gb3BlcmF0aW9uLXNwZWNpZmljIHJlYXNvblwiIOKAlCB0aGlzIGlzIHdoYXQgV2ViIENyeXB0byB0aHJvd3NcbiAgICAvLyB3aGVuIHRoZSBHQ00gYXV0aCB0YWcgZG9lcyBub3QgdmVyaWZ5LiBSZS10aHJvdyBhc1xuICAgIC8vIFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3IsIGF0dGFjaGluZyBkaWFnbm9zdGljIGNvbnRleHQgKGJ5dGUgbGVuZ3RoKVxuICAgIC8vIHRoYXQgdGhlIGJhcmUgRE9NRXhjZXB0aW9uIGxhY2tzLlxuICAgIGNvbnN0IGNhdXNlTXNnID0gY2F1c2UgaW5zdGFuY2VvZiBFcnJvciA/IGNhdXNlLm1lc3NhZ2UgOiBTdHJpbmcoY2F1c2UpO1xuICAgIHRocm93IG5ldyBSdW50aW1lRGVjcnlwdGlvbkVycm9yKFxuICAgICAgYEFFUy0yNTYtR0NNIGRlY3J5cHRpb24gZmFpbGVkOiAke2NhdXNlTXNnfWAsXG4gICAgICB7XG4gICAgICAgIGNhdXNlLFxuICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgb3BlcmF0aW9uOiAnZGVjcnlwdCcsXG4gICAgICAgICAgYnl0ZUxlbmd0aDogZGF0YS5ieXRlTGVuZ3RoLFxuICAgICAgICB9LFxuICAgICAgfVxuICAgICk7XG4gIH1cbiAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHBsYWludGV4dCk7XG59XG4iXX0=
@@ -1,4 +1,11 @@
1
- import type { Event } from '@workflow/world';
1
+ import { type Event } from '@workflow/world';
2
+ /**
3
+ * Delay before firing the deferred unconsumed-event check after the promise
4
+ * queue has drained. Must be long enough for cross-VM microtask chains to
5
+ * propagate (resolve in host → workflow code in VM → subscribe call back
6
+ * in host). Any subscribe() arriving during this window cancels the check.
7
+ */
8
+ export declare const DEFERRED_CHECK_DELAY_MS = 100;
2
9
  export declare enum EventConsumerResult {
3
10
  /**
4
11
  * Callback consumed the event, but should not be removed from the callbacks list
@@ -15,6 +22,12 @@ export declare enum EventConsumerResult {
15
22
  }
16
23
  type EventConsumerCallback = (event: Event | null) => EventConsumerResult;
17
24
  export interface EventsConsumerOptions {
25
+ /**
26
+ * Callback invoked after an event has been consumed. Consumers such as the
27
+ * deterministic workflow clock must not observe events that are merely
28
+ * inspected while waiting for user code to subscribe to the next operation.
29
+ */
30
+ onConsumedEvent?: (event: Event) => void;
18
31
  /**
19
32
  * Callback invoked when a non-null event cannot be consumed by any registered
20
33
  * callback, indicating an orphaned or invalid event in the event log. The
@@ -35,6 +48,7 @@ export declare class EventsConsumer {
35
48
  eventIndex: number;
36
49
  readonly events: Event[];
37
50
  readonly callbacks: EventConsumerCallback[];
51
+ private onConsumedEvent?;
38
52
  private onUnconsumedEvent;
39
53
  private getPromiseQueue;
40
54
  private pendingUnconsumedCheck;
@@ -51,7 +65,17 @@ export declare class EventsConsumer {
51
65
  * @param fn - The callback function to register.
52
66
  */
53
67
  subscribe(fn: EventConsumerCallback): void;
68
+ private notifyConsumedEvent;
54
69
  private consume;
70
+ /**
71
+ * Offer `currentEvent` to each registered callback in turn. Returns true
72
+ * when a callback consumed a real (non-null) event and the drain should
73
+ * advance to the next event in the same synchronous pass; false otherwise
74
+ * (nothing consumed it, or the consumed event was the end-of-events
75
+ * sentinel).
76
+ */
77
+ private consumeOne;
78
+ private handleUnconsumed;
55
79
  }
56
80
  export {};
57
81
  //# sourceMappingURL=events-consumer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"events-consumer.d.ts","sourceRoot":"","sources":["../src/events-consumer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAG7C,oBAAY,mBAAmB;IAC7B;;OAEG;IACH,QAAQ,IAAA;IACR;;OAEG;IACH,WAAW,IAAA;IACX;;OAEG;IACH,QAAQ,IAAA;CACT;AAED,KAAK,qBAAqB,GAAG,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,KAAK,mBAAmB,CAAC;AAE1E,MAAM,WAAW,qBAAqB;IACpC;;;;;;OAMG;IACH,iBAAiB,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAC1C;;;;;OAKG;IACH,eAAe,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC;AAED,qBAAa,cAAc;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,CAAM;IAC9B,QAAQ,CAAC,SAAS,EAAE,qBAAqB,EAAE,CAAM;IACjD,OAAO,CAAC,iBAAiB,CAAyB;IAClD,OAAO,CAAC,eAAe,CAAsB;IAC7C,OAAO,CAAC,sBAAsB,CAA8B;IAC5D,OAAO,CAAC,wBAAwB,CAA8C;IAC9E,OAAO,CAAC,sBAAsB,CAAK;gBAEvB,MAAM,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,qBAAqB;IAO3D;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE,EAAE,qBAAqB;IAgBnC,OAAO,CAAC,OAAO,CA+Db;CACH"}
1
+ {"version":3,"file":"events-consumer.d.ts","sourceRoot":"","sources":["../src/events-consumer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,KAAK,EAAa,MAAM,iBAAiB,CAAC;AAGxD;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAmB3C,oBAAY,mBAAmB;IAC7B;;OAEG;IACH,QAAQ,IAAA;IACR;;OAEG;IACH,WAAW,IAAA;IACX;;OAEG;IACH,QAAQ,IAAA;CACT;AAED,KAAK,qBAAqB,GAAG,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,KAAK,mBAAmB,CAAC;AAE1E,MAAM,WAAW,qBAAqB;IACpC;;;;OAIG;IACH,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACzC;;;;;;OAMG;IACH,iBAAiB,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAC1C;;;;;OAKG;IACH,eAAe,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC;AAED,qBAAa,cAAc;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,CAAM;IAC9B,QAAQ,CAAC,SAAS,EAAE,qBAAqB,EAAE,CAAM;IACjD,OAAO,CAAC,eAAe,CAAC,CAAyB;IACjD,OAAO,CAAC,iBAAiB,CAAyB;IAClD,OAAO,CAAC,eAAe,CAAsB;IAC7C,OAAO,CAAC,sBAAsB,CAA8B;IAC5D,OAAO,CAAC,wBAAwB,CAA8C;IAC9E,OAAO,CAAC,sBAAsB,CAAK;gBAEvB,MAAM,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,qBAAqB;IAQ3D;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE,EAAE,qBAAqB;IAgBnC,OAAO,CAAC,mBAAmB;IAa3B,OAAO,CAAC,OAAO,CA0Bb;IAEF;;;;;;OAMG;IACH,OAAO,CAAC,UAAU;IAgClB,OAAO,CAAC,gBAAgB;CAqCzB"}