@workflow/core 5.0.0-beta.0 → 5.0.0-beta.10

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 (222) hide show
  1. package/README.md +1 -1
  2. package/dist/attribute-changes.d.ts +7 -0
  3. package/dist/attribute-changes.d.ts.map +1 -0
  4. package/dist/attribute-changes.js +25 -0
  5. package/dist/capabilities.js +1 -1
  6. package/dist/capture-stack.d.ts +16 -0
  7. package/dist/capture-stack.d.ts.map +1 -0
  8. package/dist/capture-stack.js +21 -0
  9. package/dist/class-serialization.js +1 -1
  10. package/dist/classify-error.d.ts +11 -3
  11. package/dist/classify-error.d.ts.map +1 -1
  12. package/dist/classify-error.js +56 -6
  13. package/dist/context-errors.d.ts +27 -0
  14. package/dist/context-errors.d.ts.map +1 -0
  15. package/dist/context-errors.js +101 -0
  16. package/dist/context-violation-error.d.ts +97 -0
  17. package/dist/context-violation-error.d.ts.map +1 -0
  18. package/dist/context-violation-error.js +147 -0
  19. package/dist/create-hook.d.ts.map +1 -1
  20. package/dist/create-hook.js +4 -3
  21. package/dist/define-hook.d.ts.map +1 -1
  22. package/dist/define-hook.js +20 -5
  23. package/dist/describe-error.d.ts +70 -0
  24. package/dist/describe-error.d.ts.map +1 -0
  25. package/dist/describe-error.js +165 -0
  26. package/dist/encryption.d.ts +22 -1
  27. package/dist/encryption.d.ts.map +1 -1
  28. package/dist/encryption.js +72 -27
  29. package/dist/events-consumer.d.ts +7 -0
  30. package/dist/events-consumer.d.ts.map +1 -1
  31. package/dist/events-consumer.js +18 -3
  32. package/dist/flushable-stream.d.ts +10 -10
  33. package/dist/flushable-stream.d.ts.map +1 -1
  34. package/dist/flushable-stream.js +18 -13
  35. package/dist/global.d.ts +4 -0
  36. package/dist/global.d.ts.map +1 -1
  37. package/dist/global.js +8 -2
  38. package/dist/index.d.ts +1 -0
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +2 -1
  41. package/dist/log-format.d.ts +25 -0
  42. package/dist/log-format.d.ts.map +1 -0
  43. package/dist/log-format.js +250 -0
  44. package/dist/logger.d.ts +28 -30
  45. package/dist/logger.d.ts.map +1 -1
  46. package/dist/logger.js +77 -31
  47. package/dist/private.d.ts +5 -5
  48. package/dist/private.d.ts.map +1 -1
  49. package/dist/private.js +8 -8
  50. package/dist/runtime/constants.d.ts +48 -0
  51. package/dist/runtime/constants.d.ts.map +1 -1
  52. package/dist/runtime/constants.js +91 -8
  53. package/dist/runtime/get-port-lazy.d.ts +10 -0
  54. package/dist/runtime/get-port-lazy.d.ts.map +1 -0
  55. package/dist/runtime/get-port-lazy.js +30 -0
  56. package/dist/runtime/get-world-lazy.d.ts +32 -0
  57. package/dist/runtime/get-world-lazy.d.ts.map +1 -0
  58. package/dist/runtime/get-world-lazy.js +56 -0
  59. package/dist/runtime/helpers.d.ts +40 -7
  60. package/dist/runtime/helpers.d.ts.map +1 -1
  61. package/dist/runtime/helpers.js +93 -36
  62. package/dist/runtime/replay-budget.d.ts +98 -0
  63. package/dist/runtime/replay-budget.d.ts.map +1 -0
  64. package/dist/runtime/replay-budget.js +191 -0
  65. package/dist/runtime/resume-hook.d.ts.map +1 -1
  66. package/dist/runtime/resume-hook.js +5 -4
  67. package/dist/runtime/run.d.ts +10 -32
  68. package/dist/runtime/run.d.ts.map +1 -1
  69. package/dist/runtime/run.js +83 -33
  70. package/dist/runtime/runs.d.ts +1 -1
  71. package/dist/runtime/runs.d.ts.map +1 -1
  72. package/dist/runtime/runs.js +7 -4
  73. package/dist/runtime/start.js +17 -6
  74. package/dist/runtime/step-executor.d.ts +40 -0
  75. package/dist/runtime/step-executor.d.ts.map +1 -0
  76. package/dist/runtime/step-executor.js +492 -0
  77. package/dist/runtime/step-handler.d.ts +0 -5
  78. package/dist/runtime/step-handler.d.ts.map +1 -1
  79. package/dist/runtime/step-handler.js +227 -119
  80. package/dist/runtime/suspension-handler.d.ts +22 -4
  81. package/dist/runtime/suspension-handler.d.ts.map +1 -1
  82. package/dist/runtime/suspension-handler.js +90 -73
  83. package/dist/runtime/world-init.d.ts +75 -0
  84. package/dist/runtime/world-init.d.ts.map +1 -0
  85. package/dist/runtime/world-init.js +75 -0
  86. package/dist/runtime/world.d.ts +4 -3
  87. package/dist/runtime/world.d.ts.map +1 -1
  88. package/dist/runtime/world.js +98 -9
  89. package/dist/runtime.d.ts +8 -7
  90. package/dist/runtime.d.ts.map +1 -1
  91. package/dist/runtime.js +810 -324
  92. package/dist/schemas.d.ts +1 -1
  93. package/dist/schemas.d.ts.map +1 -1
  94. package/dist/schemas.js +1 -1
  95. package/dist/serialization/client.d.ts +17 -0
  96. package/dist/serialization/client.d.ts.map +1 -0
  97. package/dist/serialization/client.js +45 -0
  98. package/dist/serialization/codec-devalue.d.ts +14 -0
  99. package/dist/serialization/codec-devalue.d.ts.map +1 -0
  100. package/dist/serialization/codec-devalue.js +98 -0
  101. package/dist/serialization/codec.d.ts +90 -0
  102. package/dist/serialization/codec.d.ts.map +1 -0
  103. package/dist/serialization/codec.js +17 -0
  104. package/dist/serialization/encryption.d.ts +32 -0
  105. package/dist/serialization/encryption.d.ts.map +1 -0
  106. package/dist/serialization/encryption.js +67 -0
  107. package/dist/serialization/errors.d.ts +34 -0
  108. package/dist/serialization/errors.d.ts.map +1 -0
  109. package/dist/serialization/errors.js +59 -0
  110. package/dist/serialization/format.d.ts +60 -0
  111. package/dist/serialization/format.d.ts.map +1 -0
  112. package/dist/serialization/format.js +97 -0
  113. package/dist/serialization/index.d.ts +18 -0
  114. package/dist/serialization/index.d.ts.map +1 -0
  115. package/dist/serialization/index.js +20 -0
  116. package/dist/serialization/reducers/class.d.ts +11 -0
  117. package/dist/serialization/reducers/class.d.ts.map +1 -0
  118. package/dist/serialization/reducers/class.js +68 -0
  119. package/dist/serialization/reducers/common.d.ts +16 -0
  120. package/dist/serialization/reducers/common.d.ts.map +1 -0
  121. package/dist/serialization/reducers/common.js +417 -0
  122. package/dist/serialization/reducers/step-function.d.ts +35 -0
  123. package/dist/serialization/reducers/step-function.d.ts.map +1 -0
  124. package/dist/serialization/reducers/step-function.js +88 -0
  125. package/dist/serialization/step.d.ts +17 -0
  126. package/dist/serialization/step.d.ts.map +1 -0
  127. package/dist/serialization/step.js +45 -0
  128. package/dist/serialization/types.d.ts +222 -0
  129. package/dist/serialization/types.d.ts.map +1 -0
  130. package/dist/serialization/types.js +21 -0
  131. package/dist/serialization/workflow.d.ts +29 -0
  132. package/dist/serialization/workflow.d.ts.map +1 -0
  133. package/dist/serialization/workflow.js +54 -0
  134. package/dist/serialization-format.d.ts +16 -2
  135. package/dist/serialization-format.d.ts.map +1 -1
  136. package/dist/serialization-format.js +104 -5
  137. package/dist/serialization.d.ts +217 -224
  138. package/dist/serialization.d.ts.map +1 -1
  139. package/dist/serialization.js +940 -643
  140. package/dist/set-attributes.d.ts +13 -0
  141. package/dist/set-attributes.d.ts.map +1 -0
  142. package/dist/set-attributes.js +40 -0
  143. package/dist/sleep.d.ts.map +1 -1
  144. package/dist/sleep.js +3 -2
  145. package/dist/source-map.d.ts.map +1 -1
  146. package/dist/source-map.js +44 -6
  147. package/dist/step/context-storage.d.ts +14 -0
  148. package/dist/step/context-storage.d.ts.map +1 -1
  149. package/dist/step/context-storage.js +1 -1
  150. package/dist/step/get-closure-vars.d.ts.map +1 -1
  151. package/dist/step/get-closure-vars.js +3 -2
  152. package/dist/step/get-step-metadata.d.ts.map +1 -1
  153. package/dist/step/get-step-metadata.js +3 -2
  154. package/dist/step/get-workflow-metadata.d.ts.map +1 -1
  155. package/dist/step/get-workflow-metadata.js +3 -2
  156. package/dist/step/writable-stream.d.ts.map +1 -1
  157. package/dist/step/writable-stream.js +39 -5
  158. package/dist/step.d.ts.map +1 -1
  159. package/dist/step.js +97 -19
  160. package/dist/symbols.d.ts +20 -0
  161. package/dist/symbols.d.ts.map +1 -1
  162. package/dist/symbols.js +21 -1
  163. package/dist/telemetry/semantic-conventions.d.ts +2 -2
  164. package/dist/telemetry/semantic-conventions.js +1 -1
  165. package/dist/telemetry.js +1 -1
  166. package/dist/types.d.ts +6 -0
  167. package/dist/types.d.ts.map +1 -1
  168. package/dist/types.js +23 -1
  169. package/dist/util.d.ts +18 -3
  170. package/dist/util.d.ts.map +1 -1
  171. package/dist/util.js +28 -5
  172. package/dist/version.d.ts +1 -1
  173. package/dist/version.d.ts.map +1 -1
  174. package/dist/version.js +2 -2
  175. package/dist/vm/index.d.ts.map +1 -1
  176. package/dist/vm/index.js +3 -2
  177. package/dist/vm/uint8array-base64.js +1 -1
  178. package/dist/vm/uuid.js +1 -1
  179. package/dist/workflow/abort-controller.d.ts +65 -0
  180. package/dist/workflow/abort-controller.d.ts.map +1 -0
  181. package/dist/workflow/abort-controller.js +260 -0
  182. package/dist/workflow/create-hook.d.ts.map +1 -1
  183. package/dist/workflow/create-hook.js +3 -2
  184. package/dist/workflow/define-hook.d.ts +1 -1
  185. package/dist/workflow/define-hook.d.ts.map +1 -1
  186. package/dist/workflow/define-hook.js +8 -4
  187. package/dist/workflow/get-workflow-metadata.d.ts +11 -0
  188. package/dist/workflow/get-workflow-metadata.d.ts.map +1 -1
  189. package/dist/workflow/get-workflow-metadata.js +14 -3
  190. package/dist/workflow/hook.d.ts.map +1 -1
  191. package/dist/workflow/hook.js +13 -4
  192. package/dist/workflow/index.d.ts +1 -0
  193. package/dist/workflow/index.d.ts.map +1 -1
  194. package/dist/workflow/index.js +5 -3
  195. package/dist/workflow/set-attributes.d.ts +74 -0
  196. package/dist/workflow/set-attributes.d.ts.map +1 -0
  197. package/dist/workflow/set-attributes.js +66 -0
  198. package/dist/workflow/sleep.d.ts.map +1 -1
  199. package/dist/workflow/sleep.js +22 -3
  200. package/dist/workflow/world-init-stub.d.ts +15 -0
  201. package/dist/workflow/world-init-stub.d.ts.map +1 -0
  202. package/dist/workflow/world-init-stub.js +15 -0
  203. package/dist/workflow/writable-stream.js +1 -1
  204. package/dist/workflow.d.ts.map +1 -1
  205. package/dist/workflow.js +84 -31
  206. package/docs/api-reference/create-webhook.mdx +37 -18
  207. package/docs/api-reference/experimental-set-attributes.mdx +63 -0
  208. package/docs/api-reference/get-workflow-metadata.mdx +61 -0
  209. package/docs/api-reference/index.mdx +3 -0
  210. package/docs/foundations/cancellation.mdx +460 -0
  211. package/docs/foundations/errors-and-retries.mdx +7 -3
  212. package/docs/foundations/index.mdx +3 -3
  213. package/docs/foundations/meta.json +3 -2
  214. package/docs/foundations/serialization.mdx +78 -42
  215. package/docs/foundations/starting-workflows.mdx +6 -2
  216. package/docs/foundations/versioning.mdx +263 -0
  217. package/docs/how-it-works/cancellation.mdx +287 -0
  218. package/docs/how-it-works/code-transform.mdx +8 -7
  219. package/docs/how-it-works/event-sourcing.mdx +2 -2
  220. package/docs/how-it-works/meta.json +2 -1
  221. package/package.json +19 -10
  222. package/docs/foundations/common-patterns.mdx +0 -265
package/dist/schemas.d.ts CHANGED
@@ -11,5 +11,5 @@
11
11
  */
12
12
  export type Serializable = string | number | boolean | null | undefined | Serializable[] | {
13
13
  [key: string]: Serializable;
14
- } | ArrayBuffer | bigint | BigInt64Array | BigUint64Array | Date | DOMException | Float32Array | Float64Array | Headers | Int8Array | Int16Array | Int32Array | Map<Serializable, Serializable> | ReadableStream<Uint8Array> | RegExp | Response | Set<Serializable> | URL | URLSearchParams | Uint8Array | Uint8ClampedArray | Uint16Array | Uint32Array | WritableStream<Uint8Array> | ((...args: Serializable[]) => Promise<Serializable>);
14
+ } | ArrayBuffer | bigint | BigInt64Array | BigUint64Array | Date | DOMException | Error | Float32Array | Float64Array | Headers | Int8Array | Int16Array | Int32Array | Map<Serializable, Serializable> | ReadableStream<Uint8Array> | RegExp | Response | Set<Serializable> | URL | URLSearchParams | Uint8Array | Uint8ClampedArray | Uint16Array | Uint32Array | WritableStream<Uint8Array> | AbortController | AbortSignal | ((...args: Serializable[]) => Promise<Serializable>);
15
15
  //# sourceMappingURL=schemas.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,MAAM,MAAM,YAAY,GAEpB,MAAM,GACN,MAAM,GACN,OAAO,GACP,IAAI,GACJ,SAAS,GACT,YAAY,EAAE,GACd;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAAA;CAAE,GAG/B,WAAW,GACX,MAAM,GACN,aAAa,GACb,cAAc,GACd,IAAI,GACJ,YAAY,GACZ,YAAY,GACZ,YAAY,GACZ,OAAO,GACP,SAAS,GACT,UAAU,GACV,UAAU,GACV,GAAG,CAAC,YAAY,EAAE,YAAY,CAAC,GAC/B,cAAc,CAAC,UAAU,CAAC,GAC1B,MAAM,GACN,QAAQ,GACR,GAAG,CAAC,YAAY,CAAC,GACjB,GAAG,GACH,eAAe,GACf,UAAU,GACV,iBAAiB,GACjB,WAAW,GACX,WAAW,GACX,cAAc,CAAC,UAAU,CAAC,GAC1B,CAAC,CAAC,GAAG,IAAI,EAAE,YAAY,EAAE,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,MAAM,MAAM,YAAY,GAEpB,MAAM,GACN,MAAM,GACN,OAAO,GACP,IAAI,GACJ,SAAS,GACT,YAAY,EAAE,GACd;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAAA;CAAE,GAG/B,WAAW,GACX,MAAM,GACN,aAAa,GACb,cAAc,GACd,IAAI,GACJ,YAAY,GACZ,KAAK,GACL,YAAY,GACZ,YAAY,GACZ,OAAO,GACP,SAAS,GACT,UAAU,GACV,UAAU,GACV,GAAG,CAAC,YAAY,EAAE,YAAY,CAAC,GAC/B,cAAc,CAAC,UAAU,CAAC,GAC1B,MAAM,GACN,QAAQ,GACR,GAAG,CAAC,YAAY,CAAC,GACjB,GAAG,GACH,eAAe,GACf,UAAU,GACV,iBAAiB,GACjB,WAAW,GACX,WAAW,GACX,cAAc,CAAC,UAAU,CAAC,GAC1B,eAAe,GACf,WAAW,GACX,CAAC,CAAC,GAAG,IAAI,EAAE,YAAY,EAAE,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC"}
package/dist/schemas.js CHANGED
@@ -1,2 +1,2 @@
1
1
  export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zY2hlbWFzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ==
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zY2hlbWFzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEEgc2VyaWFsaXphYmxlIHZhbHVlOlxuICogQW55IHZhbGlkIEpTT04gb2JqZWN0IGlzIHNlcmlhbGl6YWJsZVxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHNcbiAqIC8vIGFueSB2YWxpZCBKU09OIG9iamVjdCBpcyBzZXJpYWxpemFibGVcbiAqIGNvbnN0IGFueUpzb246IFNlcmlhbGl6YWJsZSA9IHsgZm9vOiBcImJhclwiIH07XG4gKiBgYGBcbiAqL1xuZXhwb3J0IHR5cGUgU2VyaWFsaXphYmxlID1cbiAgLy8gU3RhbmRhcmQgSlNPTiB0eXBlc1xuICB8IHN0cmluZ1xuICB8IG51bWJlclxuICB8IGJvb2xlYW5cbiAgfCBudWxsXG4gIHwgdW5kZWZpbmVkXG4gIHwgU2VyaWFsaXphYmxlW11cbiAgfCB7IFtrZXk6IHN0cmluZ106IFNlcmlhbGl6YWJsZSB9XG4gIC8vIFNwZWNpYWwgdHlwZXMgdGhhdCBuZWVkIHNwZWNpYWwgaGFuZGxpbmcgd2hlblxuICAvLyBzZXJpYWxpemVkL2Rlc2VyaWFsaXplZCAoc2VlIGBzZXJpYWxpemF0aW9uLnRzYClcbiAgfCBBcnJheUJ1ZmZlclxuICB8IGJpZ2ludFxuICB8IEJpZ0ludDY0QXJyYXlcbiAgfCBCaWdVaW50NjRBcnJheVxuICB8IERhdGVcbiAgfCBET01FeGNlcHRpb25cbiAgfCBFcnJvclxuICB8IEZsb2F0MzJBcnJheVxuICB8IEZsb2F0NjRBcnJheVxuICB8IEhlYWRlcnNcbiAgfCBJbnQ4QXJyYXlcbiAgfCBJbnQxNkFycmF5XG4gIHwgSW50MzJBcnJheVxuICB8IE1hcDxTZXJpYWxpemFibGUsIFNlcmlhbGl6YWJsZT5cbiAgfCBSZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5PlxuICB8IFJlZ0V4cFxuICB8IFJlc3BvbnNlXG4gIHwgU2V0PFNlcmlhbGl6YWJsZT5cbiAgfCBVUkxcbiAgfCBVUkxTZWFyY2hQYXJhbXNcbiAgfCBVaW50OEFycmF5XG4gIHwgVWludDhDbGFtcGVkQXJyYXlcbiAgfCBVaW50MTZBcnJheVxuICB8IFVpbnQzMkFycmF5XG4gIHwgV3JpdGFibGVTdHJlYW08VWludDhBcnJheT5cbiAgfCBBYm9ydENvbnRyb2xsZXJcbiAgfCBBYm9ydFNpZ25hbFxuICB8ICgoLi4uYXJnczogU2VyaWFsaXphYmxlW10pID0+IFByb21pc2U8U2VyaWFsaXphYmxlPik7IC8vIFN0ZXAgZnVuY3Rpb25cbiJdfQ==
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Client (external) mode serialization.
3
+ *
4
+ * Used when starting workflows from the client side (serializing workflow
5
+ * arguments) and when receiving workflow return values. Supports encryption.
6
+ */
7
+ import type { CodecOptions } from './codec.js';
8
+ import { type CryptoKey } from './encryption.js';
9
+ /**
10
+ * Serialize a value from the client environment (e.g. workflow arguments).
11
+ */
12
+ export declare function serialize(value: unknown, encryptionKey?: CryptoKey, options?: CodecOptions): Promise<Uint8Array | unknown>;
13
+ /**
14
+ * Deserialize a value for the client environment (e.g. workflow return value).
15
+ */
16
+ export declare function deserialize(data: Uint8Array | unknown, encryptionKey?: CryptoKey, options?: CodecOptions): Promise<unknown>;
17
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/serialization/client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,OAAO,EACL,KAAK,SAAS,EAGf,MAAM,iBAAiB,CAAC;AAKzB;;GAEG;AACH,wBAAsB,SAAS,CAC7B,KAAK,EAAE,OAAO,EACd,aAAa,CAAC,EAAE,SAAS,EACzB,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,UAAU,GAAG,OAAO,CAAC,CAa/B;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,UAAU,GAAG,OAAO,EAC1B,aAAa,CAAC,EAAE,SAAS,EACzB,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,OAAO,CAAC,CAmBlB"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Client (external) mode serialization.
3
+ *
4
+ * Used when starting workflows from the client side (serializing workflow
5
+ * arguments) and when receiving workflow return values. Supports encryption.
6
+ */
7
+ import { SerializationError } from '@workflow/errors';
8
+ import { devalueCodec } from './codec-devalue.js';
9
+ import { decrypt as decryptData, encrypt as encryptData, } from './encryption.js';
10
+ import { formatSerializationError, rethrowIfRuntimeError } from './errors.js';
11
+ import { decodeFormatPrefix, encodeWithFormatPrefix } from './format.js';
12
+ import { SerializationFormat } from './types.js';
13
+ /**
14
+ * Serialize a value from the client environment (e.g. workflow arguments).
15
+ */
16
+ export async function serialize(value, encryptionKey, options) {
17
+ try {
18
+ const payload = devalueCodec.serialize(value, 'client', options);
19
+ const prefixed = encodeWithFormatPrefix(SerializationFormat.DEVALUE_V1, payload);
20
+ return encryptData(prefixed, encryptionKey);
21
+ }
22
+ catch (error) {
23
+ rethrowIfRuntimeError(error);
24
+ const { message, hint } = formatSerializationError('client value', error);
25
+ throw new SerializationError(message, { hint, cause: error });
26
+ }
27
+ }
28
+ /**
29
+ * Deserialize a value for the client environment (e.g. workflow return value).
30
+ */
31
+ export async function deserialize(data, encryptionKey, options) {
32
+ const decrypted = await decryptData(data, encryptionKey);
33
+ if (!(decrypted instanceof Uint8Array)) {
34
+ if (devalueCodec.deserializeLegacy) {
35
+ return devalueCodec.deserializeLegacy(decrypted, 'client', options);
36
+ }
37
+ throw new Error('Cannot deserialize non-binary data without legacy support');
38
+ }
39
+ const { format, payload } = decodeFormatPrefix(decrypted);
40
+ if (format === SerializationFormat.DEVALUE_V1) {
41
+ return devalueCodec.deserialize(payload, 'client', options);
42
+ }
43
+ throw new Error(`Unsupported serialization format: ${format}`);
44
+ }
45
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcmlhbGl6YXRpb24vY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBRUgsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFdEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFFTCxPQUFPLElBQUksV0FBVyxFQUN0QixPQUFPLElBQUksV0FBVyxHQUN2QixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM5RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDekUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRWpEOztHQUVHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxTQUFTLENBQzdCLEtBQWMsRUFDZCxhQUF5QixFQUN6QixPQUFzQjtJQUV0QixJQUFJLENBQUM7UUFDSCxNQUFNLE9BQU8sR0FBRyxZQUFZLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDakUsTUFBTSxRQUFRLEdBQUcsc0JBQXNCLENBQ3JDLG1CQUFtQixDQUFDLFVBQVUsRUFDOUIsT0FBTyxDQUNNLENBQUM7UUFDaEIsT0FBTyxXQUFXLENBQUMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0IsTUFBTSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsR0FBRyx3QkFBd0IsQ0FBQyxjQUFjLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDMUUsTUFBTSxJQUFJLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUNoRSxDQUFDO0FBQ0gsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxXQUFXLENBQy9CLElBQTBCLEVBQzFCLGFBQXlCLEVBQ3pCLE9BQXNCO0lBRXRCLE1BQU0sU0FBUyxHQUFHLE1BQU0sV0FBVyxDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQztJQUV6RCxJQUFJLENBQUMsQ0FBQyxTQUFTLFlBQVksVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUN2QyxJQUFJLFlBQVksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQ25DLE9BQU8sWUFBWSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDdEUsQ0FBQztRQUNELE1BQU0sSUFBSSxLQUFLLENBQ2IsMkRBQTJELENBQzVELENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUUxRCxJQUFJLE1BQU0sS0FBSyxtQkFBbUIsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUM5QyxPQUFPLFlBQVksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsTUFBTSxFQUFFLENBQUMsQ0FBQztBQUNqRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDbGllbnQgKGV4dGVybmFsKSBtb2RlIHNlcmlhbGl6YXRpb24uXG4gKlxuICogVXNlZCB3aGVuIHN0YXJ0aW5nIHdvcmtmbG93cyBmcm9tIHRoZSBjbGllbnQgc2lkZSAoc2VyaWFsaXppbmcgd29ya2Zsb3dcbiAqIGFyZ3VtZW50cykgYW5kIHdoZW4gcmVjZWl2aW5nIHdvcmtmbG93IHJldHVybiB2YWx1ZXMuIFN1cHBvcnRzIGVuY3J5cHRpb24uXG4gKi9cblxuaW1wb3J0IHsgU2VyaWFsaXphdGlvbkVycm9yIH0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQgdHlwZSB7IENvZGVjT3B0aW9ucyB9IGZyb20gJy4vY29kZWMuanMnO1xuaW1wb3J0IHsgZGV2YWx1ZUNvZGVjIH0gZnJvbSAnLi9jb2RlYy1kZXZhbHVlLmpzJztcbmltcG9ydCB7XG4gIHR5cGUgQ3J5cHRvS2V5LFxuICBkZWNyeXB0IGFzIGRlY3J5cHREYXRhLFxuICBlbmNyeXB0IGFzIGVuY3J5cHREYXRhLFxufSBmcm9tICcuL2VuY3J5cHRpb24uanMnO1xuaW1wb3J0IHsgZm9ybWF0U2VyaWFsaXphdGlvbkVycm9yLCByZXRocm93SWZSdW50aW1lRXJyb3IgfSBmcm9tICcuL2Vycm9ycy5qcyc7XG5pbXBvcnQgeyBkZWNvZGVGb3JtYXRQcmVmaXgsIGVuY29kZVdpdGhGb3JtYXRQcmVmaXggfSBmcm9tICcuL2Zvcm1hdC5qcyc7XG5pbXBvcnQgeyBTZXJpYWxpemF0aW9uRm9ybWF0IH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8qKlxuICogU2VyaWFsaXplIGEgdmFsdWUgZnJvbSB0aGUgY2xpZW50IGVudmlyb25tZW50IChlLmcuIHdvcmtmbG93IGFyZ3VtZW50cykuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXJpYWxpemUoXG4gIHZhbHVlOiB1bmtub3duLFxuICBlbmNyeXB0aW9uS2V5PzogQ3J5cHRvS2V5LFxuICBvcHRpb25zPzogQ29kZWNPcHRpb25zXG4pOiBQcm9taXNlPFVpbnQ4QXJyYXkgfCB1bmtub3duPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcGF5bG9hZCA9IGRldmFsdWVDb2RlYy5zZXJpYWxpemUodmFsdWUsICdjbGllbnQnLCBvcHRpb25zKTtcbiAgICBjb25zdCBwcmVmaXhlZCA9IGVuY29kZVdpdGhGb3JtYXRQcmVmaXgoXG4gICAgICBTZXJpYWxpemF0aW9uRm9ybWF0LkRFVkFMVUVfVjEsXG4gICAgICBwYXlsb2FkXG4gICAgKSBhcyBVaW50OEFycmF5O1xuICAgIHJldHVybiBlbmNyeXB0RGF0YShwcmVmaXhlZCwgZW5jcnlwdGlvbktleSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0aHJvd0lmUnVudGltZUVycm9yKGVycm9yKTtcbiAgICBjb25zdCB7IG1lc3NhZ2UsIGhpbnQgfSA9IGZvcm1hdFNlcmlhbGl6YXRpb25FcnJvcignY2xpZW50IHZhbHVlJywgZXJyb3IpO1xuICAgIHRocm93IG5ldyBTZXJpYWxpemF0aW9uRXJyb3IobWVzc2FnZSwgeyBoaW50LCBjYXVzZTogZXJyb3IgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBEZXNlcmlhbGl6ZSBhIHZhbHVlIGZvciB0aGUgY2xpZW50IGVudmlyb25tZW50IChlLmcuIHdvcmtmbG93IHJldHVybiB2YWx1ZSkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZXNlcmlhbGl6ZShcbiAgZGF0YTogVWludDhBcnJheSB8IHVua25vd24sXG4gIGVuY3J5cHRpb25LZXk/OiBDcnlwdG9LZXksXG4gIG9wdGlvbnM/OiBDb2RlY09wdGlvbnNcbik6IFByb21pc2U8dW5rbm93bj4ge1xuICBjb25zdCBkZWNyeXB0ZWQgPSBhd2FpdCBkZWNyeXB0RGF0YShkYXRhLCBlbmNyeXB0aW9uS2V5KTtcblxuICBpZiAoIShkZWNyeXB0ZWQgaW5zdGFuY2VvZiBVaW50OEFycmF5KSkge1xuICAgIGlmIChkZXZhbHVlQ29kZWMuZGVzZXJpYWxpemVMZWdhY3kpIHtcbiAgICAgIHJldHVybiBkZXZhbHVlQ29kZWMuZGVzZXJpYWxpemVMZWdhY3koZGVjcnlwdGVkLCAnY2xpZW50Jywgb3B0aW9ucyk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdDYW5ub3QgZGVzZXJpYWxpemUgbm9uLWJpbmFyeSBkYXRhIHdpdGhvdXQgbGVnYWN5IHN1cHBvcnQnXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHsgZm9ybWF0LCBwYXlsb2FkIH0gPSBkZWNvZGVGb3JtYXRQcmVmaXgoZGVjcnlwdGVkKTtcblxuICBpZiAoZm9ybWF0ID09PSBTZXJpYWxpemF0aW9uRm9ybWF0LkRFVkFMVUVfVjEpIHtcbiAgICByZXR1cm4gZGV2YWx1ZUNvZGVjLmRlc2VyaWFsaXplKHBheWxvYWQsICdjbGllbnQnLCBvcHRpb25zKTtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgc2VyaWFsaXphdGlvbiBmb3JtYXQ6ICR7Zm9ybWF0fWApO1xufVxuIl19
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Devalue codec implementation.
3
+ *
4
+ * Uses the `devalue` library for serialization. Handles custom types via
5
+ * reducers (serialize) and revivers (deserialize) which are composed
6
+ * internally based on the serialization mode.
7
+ *
8
+ * The reducer/reviver pattern is specific to devalue — other codecs
9
+ * (CBOR, JSON) would handle types differently (e.g. CBOR supports Date,
10
+ * typed arrays, Map, Set natively).
11
+ */
12
+ import type { Codec } from './codec.js';
13
+ export declare const devalueCodec: Codec;
14
+ //# sourceMappingURL=codec-devalue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codec-devalue.d.ts","sourceRoot":"","sources":["../../src/serialization/codec-devalue.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,KAAK,EAAmC,MAAM,YAAY,CAAC;AAwFzE,eAAO,MAAM,YAAY,EAAE,KA2C1B,CAAC"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Devalue codec implementation.
3
+ *
4
+ * Uses the `devalue` library for serialization. Handles custom types via
5
+ * reducers (serialize) and revivers (deserialize) which are composed
6
+ * internally based on the serialization mode.
7
+ *
8
+ * The reducer/reviver pattern is specific to devalue — other codecs
9
+ * (CBOR, JSON) would handle types differently (e.g. CBOR supports Date,
10
+ * typed arrays, Map, Set natively).
11
+ */
12
+ import { parse, stringify, unflatten } from 'devalue';
13
+ import { getClassReducers, getClassRevivers } from './reducers/class.js';
14
+ import { getCommonReducers, getCommonRevivers } from './reducers/common.js';
15
+ import { getStepFunctionReducer, getStepFunctionReviver, } from './reducers/step-function.js';
16
+ import { SerializationFormat } from './types.js';
17
+ const encoder = new TextEncoder();
18
+ const decoder = new TextDecoder();
19
+ // ---- Reducer/Reviver composition per mode ----
20
+ function getReducersForMode(mode, global = globalThis, extraReducers) {
21
+ let base;
22
+ switch (mode) {
23
+ case 'workflow':
24
+ // Class/Instance MUST come before common (first-match-wins for Error subclasses)
25
+ base = {
26
+ ...getClassReducers(),
27
+ ...getStepFunctionReducer(),
28
+ ...getCommonReducers(global),
29
+ };
30
+ break;
31
+ case 'step':
32
+ base = {
33
+ ...getClassReducers(),
34
+ ...getCommonReducers(global),
35
+ };
36
+ break;
37
+ case 'client':
38
+ base = {
39
+ ...getClassReducers(),
40
+ ...getCommonReducers(global),
41
+ };
42
+ break;
43
+ }
44
+ if (extraReducers) {
45
+ return { ...base, ...extraReducers };
46
+ }
47
+ return base;
48
+ }
49
+ function getReviversForMode(mode, global = globalThis, extraRevivers) {
50
+ let base;
51
+ switch (mode) {
52
+ case 'workflow':
53
+ base = {
54
+ ...getClassRevivers(global),
55
+ ...getStepFunctionReviver(global),
56
+ ...getCommonRevivers(global),
57
+ };
58
+ break;
59
+ case 'step':
60
+ base = {
61
+ ...getClassRevivers(global),
62
+ ...getCommonRevivers(global),
63
+ };
64
+ break;
65
+ case 'client':
66
+ base = {
67
+ ...getClassRevivers(global),
68
+ ...getCommonRevivers(global),
69
+ StepFunction: () => {
70
+ throw new Error('Step functions cannot be deserialized in client context.');
71
+ },
72
+ };
73
+ break;
74
+ }
75
+ if (extraRevivers) {
76
+ return { ...base, ...extraRevivers };
77
+ }
78
+ return base;
79
+ }
80
+ // ---- Codec implementation ----
81
+ export const devalueCodec = {
82
+ formatPrefix: SerializationFormat.DEVALUE_V1,
83
+ serialize(value, mode, options) {
84
+ const reducers = getReducersForMode(mode, options?.global, options?.extraReducers);
85
+ const str = stringify(value, reducers);
86
+ return encoder.encode(str);
87
+ },
88
+ deserialize(data, mode, options) {
89
+ const revivers = getReviversForMode(mode, options?.global, options?.extraRevivers);
90
+ const str = decoder.decode(data);
91
+ return parse(str, revivers);
92
+ },
93
+ deserializeLegacy(data, mode, options) {
94
+ const revivers = getReviversForMode(mode, options?.global, options?.extraRevivers);
95
+ return unflatten(data, revivers);
96
+ },
97
+ };
98
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZWMtZGV2YWx1ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJpYWxpemF0aW9uL2NvZGVjLWRldmFsdWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7R0FVRztBQUVILE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUV0RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN6RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM1RSxPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLHNCQUFzQixHQUN2QixNQUFNLDZCQUE2QixDQUFDO0FBQ3JDLE9BQU8sRUFBZ0MsbUJBQW1CLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFL0UsTUFBTSxPQUFPLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztBQUNsQyxNQUFNLE9BQU8sR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO0FBRWxDLGlEQUFpRDtBQUVqRCxTQUFTLGtCQUFrQixDQUN6QixJQUF1QixFQUN2QixTQUE4QixVQUFVLEVBQ3hDLGFBQW1EO0lBRW5ELElBQUksSUFBdUIsQ0FBQztJQUM1QixRQUFRLElBQUksRUFBRSxDQUFDO1FBQ2IsS0FBSyxVQUFVO1lBQ2IsaUZBQWlGO1lBQ2pGLElBQUksR0FBRztnQkFDTCxHQUFHLGdCQUFnQixFQUFFO2dCQUNyQixHQUFHLHNCQUFzQixFQUFFO2dCQUMzQixHQUFHLGlCQUFpQixDQUFDLE1BQU0sQ0FBQzthQUM3QixDQUFDO1lBQ0YsTUFBTTtRQUNSLEtBQUssTUFBTTtZQUNULElBQUksR0FBRztnQkFDTCxHQUFHLGdCQUFnQixFQUFFO2dCQUNyQixHQUFHLGlCQUFpQixDQUFDLE1BQU0sQ0FBQzthQUM3QixDQUFDO1lBQ0YsTUFBTTtRQUNSLEtBQUssUUFBUTtZQUNYLElBQUksR0FBRztnQkFDTCxHQUFHLGdCQUFnQixFQUFFO2dCQUNyQixHQUFHLGlCQUFpQixDQUFDLE1BQU0sQ0FBQzthQUM3QixDQUFDO1lBQ0YsTUFBTTtJQUNWLENBQUM7SUFDRCxJQUFJLGFBQWEsRUFBRSxDQUFDO1FBQ2xCLE9BQU8sRUFBRSxHQUFHLElBQUksRUFBRSxHQUFHLGFBQWEsRUFBeUMsQ0FBQztJQUM5RSxDQUFDO0lBQ0QsT0FBTyxJQUEyQyxDQUFDO0FBQ3JELENBQUM7QUFFRCxTQUFTLGtCQUFrQixDQUN6QixJQUF1QixFQUN2QixTQUE4QixVQUFVLEVBQ3hDLGFBQW1EO0lBRW5ELElBQUksSUFBdUIsQ0FBQztJQUM1QixRQUFRLElBQUksRUFBRSxDQUFDO1FBQ2IsS0FBSyxVQUFVO1lBQ2IsSUFBSSxHQUFHO2dCQUNMLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxDQUFDO2dCQUMzQixHQUFHLHNCQUFzQixDQUFDLE1BQU0sQ0FBQztnQkFDakMsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLENBQUM7YUFDN0IsQ0FBQztZQUNGLE1BQU07UUFDUixLQUFLLE1BQU07WUFDVCxJQUFJLEdBQUc7Z0JBQ0wsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUM7Z0JBQzNCLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxDQUFDO2FBQzdCLENBQUM7WUFDRixNQUFNO1FBQ1IsS0FBSyxRQUFRO1lBQ1gsSUFBSSxHQUFHO2dCQUNMLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxDQUFDO2dCQUMzQixHQUFHLGlCQUFpQixDQUFDLE1BQU0sQ0FBQztnQkFDNUIsWUFBWSxFQUFFLEdBQUcsRUFBRTtvQkFDakIsTUFBTSxJQUFJLEtBQUssQ0FDYiwwREFBMEQsQ0FDM0QsQ0FBQztnQkFDSixDQUFDO2FBQ0YsQ0FBQztZQUNGLE1BQU07SUFDVixDQUFDO0lBQ0QsSUFBSSxhQUFhLEVBQUUsQ0FBQztRQUNsQixPQUFPLEVBQUUsR0FBRyxJQUFJLEVBQUUsR0FBRyxhQUFhLEVBQXlDLENBQUM7SUFDOUUsQ0FBQztJQUNELE9BQU8sSUFBMkMsQ0FBQztBQUNyRCxDQUFDO0FBRUQsaUNBQWlDO0FBRWpDLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBVTtJQUNqQyxZQUFZLEVBQUUsbUJBQW1CLENBQUMsVUFBVTtJQUU1QyxTQUFTLENBQ1AsS0FBYyxFQUNkLElBQXVCLEVBQ3ZCLE9BQXNCO1FBRXRCLE1BQU0sUUFBUSxHQUFHLGtCQUFrQixDQUNqQyxJQUFJLEVBQ0osT0FBTyxFQUFFLE1BQU0sRUFDZixPQUFPLEVBQUUsYUFBYSxDQUN2QixDQUFDO1FBQ0YsTUFBTSxHQUFHLEdBQUcsU0FBUyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN2QyxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVELFdBQVcsQ0FDVCxJQUFnQixFQUNoQixJQUF1QixFQUN2QixPQUFzQjtRQUV0QixNQUFNLFFBQVEsR0FBRyxrQkFBa0IsQ0FDakMsSUFBSSxFQUNKLE9BQU8sRUFBRSxNQUFNLEVBQ2YsT0FBTyxFQUFFLGFBQWEsQ0FDdkIsQ0FBQztRQUNGLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakMsT0FBTyxLQUFLLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxpQkFBaUIsQ0FDZixJQUFhLEVBQ2IsSUFBdUIsRUFDdkIsT0FBc0I7UUFFdEIsTUFBTSxRQUFRLEdBQUcsa0JBQWtCLENBQ2pDLElBQUksRUFDSixPQUFPLEVBQUUsTUFBTSxFQUNmLE9BQU8sRUFBRSxhQUFhLENBQ3ZCLENBQUM7UUFDRixPQUFPLFNBQVMsQ0FBQyxJQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDNUMsQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIERldmFsdWUgY29kZWMgaW1wbGVtZW50YXRpb24uXG4gKlxuICogVXNlcyB0aGUgYGRldmFsdWVgIGxpYnJhcnkgZm9yIHNlcmlhbGl6YXRpb24uIEhhbmRsZXMgY3VzdG9tIHR5cGVzIHZpYVxuICogcmVkdWNlcnMgKHNlcmlhbGl6ZSkgYW5kIHJldml2ZXJzIChkZXNlcmlhbGl6ZSkgd2hpY2ggYXJlIGNvbXBvc2VkXG4gKiBpbnRlcm5hbGx5IGJhc2VkIG9uIHRoZSBzZXJpYWxpemF0aW9uIG1vZGUuXG4gKlxuICogVGhlIHJlZHVjZXIvcmV2aXZlciBwYXR0ZXJuIGlzIHNwZWNpZmljIHRvIGRldmFsdWUg4oCUIG90aGVyIGNvZGVjc1xuICogKENCT1IsIEpTT04pIHdvdWxkIGhhbmRsZSB0eXBlcyBkaWZmZXJlbnRseSAoZS5nLiBDQk9SIHN1cHBvcnRzIERhdGUsXG4gKiB0eXBlZCBhcnJheXMsIE1hcCwgU2V0IG5hdGl2ZWx5KS5cbiAqL1xuXG5pbXBvcnQgeyBwYXJzZSwgc3RyaW5naWZ5LCB1bmZsYXR0ZW4gfSBmcm9tICdkZXZhbHVlJztcbmltcG9ydCB0eXBlIHsgQ29kZWMsIENvZGVjT3B0aW9ucywgU2VyaWFsaXphdGlvbk1vZGUgfSBmcm9tICcuL2NvZGVjLmpzJztcbmltcG9ydCB7IGdldENsYXNzUmVkdWNlcnMsIGdldENsYXNzUmV2aXZlcnMgfSBmcm9tICcuL3JlZHVjZXJzL2NsYXNzLmpzJztcbmltcG9ydCB7IGdldENvbW1vblJlZHVjZXJzLCBnZXRDb21tb25SZXZpdmVycyB9IGZyb20gJy4vcmVkdWNlcnMvY29tbW9uLmpzJztcbmltcG9ydCB7XG4gIGdldFN0ZXBGdW5jdGlvblJlZHVjZXIsXG4gIGdldFN0ZXBGdW5jdGlvblJldml2ZXIsXG59IGZyb20gJy4vcmVkdWNlcnMvc3RlcC1mdW5jdGlvbi5qcyc7XG5pbXBvcnQgeyB0eXBlIFJlZHVjZXJzLCB0eXBlIFJldml2ZXJzLCBTZXJpYWxpemF0aW9uRm9ybWF0IH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbmNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbmNvbnN0IGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcblxuLy8gLS0tLSBSZWR1Y2VyL1Jldml2ZXIgY29tcG9zaXRpb24gcGVyIG1vZGUgLS0tLVxuXG5mdW5jdGlvbiBnZXRSZWR1Y2Vyc0Zvck1vZGUoXG4gIG1vZGU6IFNlcmlhbGl6YXRpb25Nb2RlLFxuICBnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzLFxuICBleHRyYVJlZHVjZXJzPzogUmVjb3JkPHN0cmluZywgKHZhbHVlOiBhbnkpID0+IGFueT5cbik6IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogYW55KSA9PiBhbnk+IHtcbiAgbGV0IGJhc2U6IFBhcnRpYWw8UmVkdWNlcnM+O1xuICBzd2l0Y2ggKG1vZGUpIHtcbiAgICBjYXNlICd3b3JrZmxvdyc6XG4gICAgICAvLyBDbGFzcy9JbnN0YW5jZSBNVVNUIGNvbWUgYmVmb3JlIGNvbW1vbiAoZmlyc3QtbWF0Y2gtd2lucyBmb3IgRXJyb3Igc3ViY2xhc3NlcylcbiAgICAgIGJhc2UgPSB7XG4gICAgICAgIC4uLmdldENsYXNzUmVkdWNlcnMoKSxcbiAgICAgICAgLi4uZ2V0U3RlcEZ1bmN0aW9uUmVkdWNlcigpLFxuICAgICAgICAuLi5nZXRDb21tb25SZWR1Y2VycyhnbG9iYWwpLFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3N0ZXAnOlxuICAgICAgYmFzZSA9IHtcbiAgICAgICAgLi4uZ2V0Q2xhc3NSZWR1Y2VycygpLFxuICAgICAgICAuLi5nZXRDb21tb25SZWR1Y2VycyhnbG9iYWwpLFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2NsaWVudCc6XG4gICAgICBiYXNlID0ge1xuICAgICAgICAuLi5nZXRDbGFzc1JlZHVjZXJzKCksXG4gICAgICAgIC4uLmdldENvbW1vblJlZHVjZXJzKGdsb2JhbCksXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG4gIH1cbiAgaWYgKGV4dHJhUmVkdWNlcnMpIHtcbiAgICByZXR1cm4geyAuLi5iYXNlLCAuLi5leHRyYVJlZHVjZXJzIH0gYXMgUmVjb3JkPHN0cmluZywgKHZhbHVlOiBhbnkpID0+IGFueT47XG4gIH1cbiAgcmV0dXJuIGJhc2UgYXMgUmVjb3JkPHN0cmluZywgKHZhbHVlOiBhbnkpID0+IGFueT47XG59XG5cbmZ1bmN0aW9uIGdldFJldml2ZXJzRm9yTW9kZShcbiAgbW9kZTogU2VyaWFsaXphdGlvbk1vZGUsXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMsXG4gIGV4dHJhUmV2aXZlcnM/OiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PlxuKTogUmVjb3JkPHN0cmluZywgKHZhbHVlOiBhbnkpID0+IGFueT4ge1xuICBsZXQgYmFzZTogUGFydGlhbDxSZXZpdmVycz47XG4gIHN3aXRjaCAobW9kZSkge1xuICAgIGNhc2UgJ3dvcmtmbG93JzpcbiAgICAgIGJhc2UgPSB7XG4gICAgICAgIC4uLmdldENsYXNzUmV2aXZlcnMoZ2xvYmFsKSxcbiAgICAgICAgLi4uZ2V0U3RlcEZ1bmN0aW9uUmV2aXZlcihnbG9iYWwpLFxuICAgICAgICAuLi5nZXRDb21tb25SZXZpdmVycyhnbG9iYWwpLFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3N0ZXAnOlxuICAgICAgYmFzZSA9IHtcbiAgICAgICAgLi4uZ2V0Q2xhc3NSZXZpdmVycyhnbG9iYWwpLFxuICAgICAgICAuLi5nZXRDb21tb25SZXZpdmVycyhnbG9iYWwpLFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2NsaWVudCc6XG4gICAgICBiYXNlID0ge1xuICAgICAgICAuLi5nZXRDbGFzc1Jldml2ZXJzKGdsb2JhbCksXG4gICAgICAgIC4uLmdldENvbW1vblJldml2ZXJzKGdsb2JhbCksXG4gICAgICAgIFN0ZXBGdW5jdGlvbjogKCkgPT4ge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICdTdGVwIGZ1bmN0aW9ucyBjYW5ub3QgYmUgZGVzZXJpYWxpemVkIGluIGNsaWVudCBjb250ZXh0LidcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICB9XG4gIGlmIChleHRyYVJldml2ZXJzKSB7XG4gICAgcmV0dXJuIHsgLi4uYmFzZSwgLi4uZXh0cmFSZXZpdmVycyB9IGFzIFJlY29yZDxzdHJpbmcsICh2YWx1ZTogYW55KSA9PiBhbnk+O1xuICB9XG4gIHJldHVybiBiYXNlIGFzIFJlY29yZDxzdHJpbmcsICh2YWx1ZTogYW55KSA9PiBhbnk+O1xufVxuXG4vLyAtLS0tIENvZGVjIGltcGxlbWVudGF0aW9uIC0tLS1cblxuZXhwb3J0IGNvbnN0IGRldmFsdWVDb2RlYzogQ29kZWMgPSB7XG4gIGZvcm1hdFByZWZpeDogU2VyaWFsaXphdGlvbkZvcm1hdC5ERVZBTFVFX1YxLFxuXG4gIHNlcmlhbGl6ZShcbiAgICB2YWx1ZTogdW5rbm93bixcbiAgICBtb2RlOiBTZXJpYWxpemF0aW9uTW9kZSxcbiAgICBvcHRpb25zPzogQ29kZWNPcHRpb25zXG4gICk6IFVpbnQ4QXJyYXkge1xuICAgIGNvbnN0IHJlZHVjZXJzID0gZ2V0UmVkdWNlcnNGb3JNb2RlKFxuICAgICAgbW9kZSxcbiAgICAgIG9wdGlvbnM/Lmdsb2JhbCxcbiAgICAgIG9wdGlvbnM/LmV4dHJhUmVkdWNlcnNcbiAgICApO1xuICAgIGNvbnN0IHN0ciA9IHN0cmluZ2lmeSh2YWx1ZSwgcmVkdWNlcnMpO1xuICAgIHJldHVybiBlbmNvZGVyLmVuY29kZShzdHIpO1xuICB9LFxuXG4gIGRlc2VyaWFsaXplKFxuICAgIGRhdGE6IFVpbnQ4QXJyYXksXG4gICAgbW9kZTogU2VyaWFsaXphdGlvbk1vZGUsXG4gICAgb3B0aW9ucz86IENvZGVjT3B0aW9uc1xuICApOiB1bmtub3duIHtcbiAgICBjb25zdCByZXZpdmVycyA9IGdldFJldml2ZXJzRm9yTW9kZShcbiAgICAgIG1vZGUsXG4gICAgICBvcHRpb25zPy5nbG9iYWwsXG4gICAgICBvcHRpb25zPy5leHRyYVJldml2ZXJzXG4gICAgKTtcbiAgICBjb25zdCBzdHIgPSBkZWNvZGVyLmRlY29kZShkYXRhKTtcbiAgICByZXR1cm4gcGFyc2Uoc3RyLCByZXZpdmVycyk7XG4gIH0sXG5cbiAgZGVzZXJpYWxpemVMZWdhY3koXG4gICAgZGF0YTogdW5rbm93bixcbiAgICBtb2RlOiBTZXJpYWxpemF0aW9uTW9kZSxcbiAgICBvcHRpb25zPzogQ29kZWNPcHRpb25zXG4gICk6IHVua25vd24ge1xuICAgIGNvbnN0IHJldml2ZXJzID0gZ2V0UmV2aXZlcnNGb3JNb2RlKFxuICAgICAgbW9kZSxcbiAgICAgIG9wdGlvbnM/Lmdsb2JhbCxcbiAgICAgIG9wdGlvbnM/LmV4dHJhUmV2aXZlcnNcbiAgICApO1xuICAgIHJldHVybiB1bmZsYXR0ZW4oZGF0YSBhcyBhbnlbXSwgcmV2aXZlcnMpO1xuICB9LFxufTtcbiJdfQ==
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Codec interface for serialization formats.
3
+ *
4
+ * A codec handles the core serialize/deserialize logic for a specific
5
+ * wire format (devalue, CBOR, JSON, etc.). Each codec is responsible
6
+ * for handling all supported data types internally — the caller only
7
+ * specifies which serialization mode to use.
8
+ *
9
+ * - **devalue**: Uses custom reducers/revivers for Date, Error, Map, Set,
10
+ * typed arrays, class instances, etc.
11
+ * - **cbor**: Would handle Date, typed arrays, Map, Set natively via the
12
+ * CBOR type system. Class instances would still need custom handling.
13
+ * - **json**: Would only support standard JSON types (primitives, arrays,
14
+ * plain objects). No Date, Map, Set, typed arrays, etc.
15
+ */
16
+ import type { FormatPrefix } from './types.js';
17
+ /**
18
+ * The serialization mode determines which types are supported and how
19
+ * they're handled. Different modes compose different sets of type handlers.
20
+ *
21
+ * - `workflow`: Runs inside the workflow VM. Includes class serialization,
22
+ * step function serialization. No stream handling.
23
+ * - `step`: Runs in the step handler (Node.js). Includes class serialization.
24
+ * No step function serialization. Stream handling at call sites.
25
+ * - `client`: Runs on the client side. Includes class serialization.
26
+ * No step function serialization. Stream handling at call sites.
27
+ */
28
+ export type SerializationMode = 'workflow' | 'step' | 'client';
29
+ /**
30
+ * Options passed to codec serialize/deserialize to support VM-context
31
+ * serialization and mode-specific type handling.
32
+ */
33
+ export interface CodecOptions {
34
+ /**
35
+ * The global object to use for `instanceof` checks and constructors.
36
+ * Defaults to `globalThis`. Must be set to the VM's global when
37
+ * serializing/deserializing data that crosses VM boundaries.
38
+ */
39
+ global?: Record<string, any>;
40
+ /**
41
+ * Additional reducers to merge into the mode's default reducers.
42
+ * Used by dehydrate/hydrate functions that need stream handling
43
+ * or other mode-specific type reducers.
44
+ */
45
+ extraReducers?: Record<string, (value: any) => any>;
46
+ /**
47
+ * Additional revivers to merge into the mode's default revivers.
48
+ * Used by dehydrate/hydrate functions that need stream handling
49
+ * or other mode-specific type revivers.
50
+ */
51
+ extraRevivers?: Record<string, (value: any) => any>;
52
+ }
53
+ export interface Codec {
54
+ /** The 4-character format prefix identifier (e.g. "devl", "cbor", "json") */
55
+ readonly formatPrefix: FormatPrefix;
56
+ /**
57
+ * Serialize a value to bytes.
58
+ *
59
+ * The codec handles all supported types internally based on the mode.
60
+ *
61
+ * @param value - The value to serialize
62
+ * @param mode - The serialization mode
63
+ * @param options - Optional global, extra reducers/revivers
64
+ * @returns The serialized payload (without format prefix)
65
+ */
66
+ serialize(value: unknown, mode: SerializationMode, options?: CodecOptions): Uint8Array;
67
+ /**
68
+ * Deserialize bytes back to a value.
69
+ *
70
+ * The codec handles all supported types internally based on the mode.
71
+ *
72
+ * @param data - The serialized payload (without format prefix)
73
+ * @param mode - The serialization mode
74
+ * @param options - Optional global, extra revivers
75
+ * @returns The deserialized value
76
+ */
77
+ deserialize(data: Uint8Array, mode: SerializationMode, options?: CodecOptions): unknown;
78
+ /**
79
+ * Deserialize legacy (pre-format-prefix) data.
80
+ * Used for backwards compatibility with specVersion 1 runs that stored
81
+ * data as plain JSON arrays instead of binary.
82
+ *
83
+ * @param data - The legacy data
84
+ * @param mode - The serialization mode
85
+ * @param options - Optional global, extra revivers
86
+ * @returns The deserialized value
87
+ */
88
+ deserializeLegacy?(data: unknown, mode: SerializationMode, options?: CodecOptions): unknown;
89
+ }
90
+ //# sourceMappingURL=codec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codec.d.ts","sourceRoot":"","sources":["../../src/serialization/codec.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C;;;;;;;;;;GAUG;AACH,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE/D;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAE7B;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,GAAG,CAAC,CAAC;IAEpD;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,GAAG,CAAC,CAAC;CACrD;AAED,MAAM,WAAW,KAAK;IACpB,6EAA6E;IAC7E,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IAEpC;;;;;;;;;OASG;IACH,SAAS,CACP,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,iBAAiB,EACvB,OAAO,CAAC,EAAE,YAAY,GACrB,UAAU,CAAC;IAEd;;;;;;;;;OASG;IACH,WAAW,CACT,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,iBAAiB,EACvB,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC;IAEX;;;;;;;;;OASG;IACH,iBAAiB,CAAC,CAChB,IAAI,EAAE,OAAO,EACb,IAAI,EAAE,iBAAiB,EACvB,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC;CACZ"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Codec interface for serialization formats.
3
+ *
4
+ * A codec handles the core serialize/deserialize logic for a specific
5
+ * wire format (devalue, CBOR, JSON, etc.). Each codec is responsible
6
+ * for handling all supported data types internally — the caller only
7
+ * specifies which serialization mode to use.
8
+ *
9
+ * - **devalue**: Uses custom reducers/revivers for Date, Error, Map, Set,
10
+ * typed arrays, class instances, etc.
11
+ * - **cbor**: Would handle Date, typed arrays, Map, Set natively via the
12
+ * CBOR type system. Class instances would still need custom handling.
13
+ * - **json**: Would only support standard JSON types (primitives, arrays,
14
+ * plain objects). No Date, Map, Set, typed arrays, etc.
15
+ */
16
+ export {};
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VyaWFsaXphdGlvbi9jb2RlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29kZWMgaW50ZXJmYWNlIGZvciBzZXJpYWxpemF0aW9uIGZvcm1hdHMuXG4gKlxuICogQSBjb2RlYyBoYW5kbGVzIHRoZSBjb3JlIHNlcmlhbGl6ZS9kZXNlcmlhbGl6ZSBsb2dpYyBmb3IgYSBzcGVjaWZpY1xuICogd2lyZSBmb3JtYXQgKGRldmFsdWUsIENCT1IsIEpTT04sIGV0Yy4pLiBFYWNoIGNvZGVjIGlzIHJlc3BvbnNpYmxlXG4gKiBmb3IgaGFuZGxpbmcgYWxsIHN1cHBvcnRlZCBkYXRhIHR5cGVzIGludGVybmFsbHkg4oCUIHRoZSBjYWxsZXIgb25seVxuICogc3BlY2lmaWVzIHdoaWNoIHNlcmlhbGl6YXRpb24gbW9kZSB0byB1c2UuXG4gKlxuICogLSAqKmRldmFsdWUqKjogVXNlcyBjdXN0b20gcmVkdWNlcnMvcmV2aXZlcnMgZm9yIERhdGUsIEVycm9yLCBNYXAsIFNldCxcbiAqICAgdHlwZWQgYXJyYXlzLCBjbGFzcyBpbnN0YW5jZXMsIGV0Yy5cbiAqIC0gKipjYm9yKio6IFdvdWxkIGhhbmRsZSBEYXRlLCB0eXBlZCBhcnJheXMsIE1hcCwgU2V0IG5hdGl2ZWx5IHZpYSB0aGVcbiAqICAgQ0JPUiB0eXBlIHN5c3RlbS4gQ2xhc3MgaW5zdGFuY2VzIHdvdWxkIHN0aWxsIG5lZWQgY3VzdG9tIGhhbmRsaW5nLlxuICogLSAqKmpzb24qKjogV291bGQgb25seSBzdXBwb3J0IHN0YW5kYXJkIEpTT04gdHlwZXMgKHByaW1pdGl2ZXMsIGFycmF5cyxcbiAqICAgcGxhaW4gb2JqZWN0cykuIE5vIERhdGUsIE1hcCwgU2V0LCB0eXBlZCBhcnJheXMsIGV0Yy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEZvcm1hdFByZWZpeCB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vKipcbiAqIFRoZSBzZXJpYWxpemF0aW9uIG1vZGUgZGV0ZXJtaW5lcyB3aGljaCB0eXBlcyBhcmUgc3VwcG9ydGVkIGFuZCBob3dcbiAqIHRoZXkncmUgaGFuZGxlZC4gRGlmZmVyZW50IG1vZGVzIGNvbXBvc2UgZGlmZmVyZW50IHNldHMgb2YgdHlwZSBoYW5kbGVycy5cbiAqXG4gKiAtIGB3b3JrZmxvd2A6IFJ1bnMgaW5zaWRlIHRoZSB3b3JrZmxvdyBWTS4gSW5jbHVkZXMgY2xhc3Mgc2VyaWFsaXphdGlvbixcbiAqICAgc3RlcCBmdW5jdGlvbiBzZXJpYWxpemF0aW9uLiBObyBzdHJlYW0gaGFuZGxpbmcuXG4gKiAtIGBzdGVwYDogUnVucyBpbiB0aGUgc3RlcCBoYW5kbGVyIChOb2RlLmpzKS4gSW5jbHVkZXMgY2xhc3Mgc2VyaWFsaXphdGlvbi5cbiAqICAgTm8gc3RlcCBmdW5jdGlvbiBzZXJpYWxpemF0aW9uLiBTdHJlYW0gaGFuZGxpbmcgYXQgY2FsbCBzaXRlcy5cbiAqIC0gYGNsaWVudGA6IFJ1bnMgb24gdGhlIGNsaWVudCBzaWRlLiBJbmNsdWRlcyBjbGFzcyBzZXJpYWxpemF0aW9uLlxuICogICBObyBzdGVwIGZ1bmN0aW9uIHNlcmlhbGl6YXRpb24uIFN0cmVhbSBoYW5kbGluZyBhdCBjYWxsIHNpdGVzLlxuICovXG5leHBvcnQgdHlwZSBTZXJpYWxpemF0aW9uTW9kZSA9ICd3b3JrZmxvdycgfCAnc3RlcCcgfCAnY2xpZW50JztcblxuLyoqXG4gKiBPcHRpb25zIHBhc3NlZCB0byBjb2RlYyBzZXJpYWxpemUvZGVzZXJpYWxpemUgdG8gc3VwcG9ydCBWTS1jb250ZXh0XG4gKiBzZXJpYWxpemF0aW9uIGFuZCBtb2RlLXNwZWNpZmljIHR5cGUgaGFuZGxpbmcuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29kZWNPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBnbG9iYWwgb2JqZWN0IHRvIHVzZSBmb3IgYGluc3RhbmNlb2ZgIGNoZWNrcyBhbmQgY29uc3RydWN0b3JzLlxuICAgKiBEZWZhdWx0cyB0byBgZ2xvYmFsVGhpc2AuIE11c3QgYmUgc2V0IHRvIHRoZSBWTSdzIGdsb2JhbCB3aGVuXG4gICAqIHNlcmlhbGl6aW5nL2Rlc2VyaWFsaXppbmcgZGF0YSB0aGF0IGNyb3NzZXMgVk0gYm91bmRhcmllcy5cbiAgICovXG4gIGdsb2JhbD86IFJlY29yZDxzdHJpbmcsIGFueT47XG5cbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgcmVkdWNlcnMgdG8gbWVyZ2UgaW50byB0aGUgbW9kZSdzIGRlZmF1bHQgcmVkdWNlcnMuXG4gICAqIFVzZWQgYnkgZGVoeWRyYXRlL2h5ZHJhdGUgZnVuY3Rpb25zIHRoYXQgbmVlZCBzdHJlYW0gaGFuZGxpbmdcbiAgICogb3Igb3RoZXIgbW9kZS1zcGVjaWZpYyB0eXBlIHJlZHVjZXJzLlxuICAgKi9cbiAgZXh0cmFSZWR1Y2Vycz86IFJlY29yZDxzdHJpbmcsICh2YWx1ZTogYW55KSA9PiBhbnk+O1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIHJldml2ZXJzIHRvIG1lcmdlIGludG8gdGhlIG1vZGUncyBkZWZhdWx0IHJldml2ZXJzLlxuICAgKiBVc2VkIGJ5IGRlaHlkcmF0ZS9oeWRyYXRlIGZ1bmN0aW9ucyB0aGF0IG5lZWQgc3RyZWFtIGhhbmRsaW5nXG4gICAqIG9yIG90aGVyIG1vZGUtc3BlY2lmaWMgdHlwZSByZXZpdmVycy5cbiAgICovXG4gIGV4dHJhUmV2aXZlcnM/OiBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55Pjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb2RlYyB7XG4gIC8qKiBUaGUgNC1jaGFyYWN0ZXIgZm9ybWF0IHByZWZpeCBpZGVudGlmaWVyIChlLmcuIFwiZGV2bFwiLCBcImNib3JcIiwgXCJqc29uXCIpICovXG4gIHJlYWRvbmx5IGZvcm1hdFByZWZpeDogRm9ybWF0UHJlZml4O1xuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgYSB2YWx1ZSB0byBieXRlcy5cbiAgICpcbiAgICogVGhlIGNvZGVjIGhhbmRsZXMgYWxsIHN1cHBvcnRlZCB0eXBlcyBpbnRlcm5hbGx5IGJhc2VkIG9uIHRoZSBtb2RlLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gc2VyaWFsaXplXG4gICAqIEBwYXJhbSBtb2RlIC0gVGhlIHNlcmlhbGl6YXRpb24gbW9kZVxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIGdsb2JhbCwgZXh0cmEgcmVkdWNlcnMvcmV2aXZlcnNcbiAgICogQHJldHVybnMgVGhlIHNlcmlhbGl6ZWQgcGF5bG9hZCAod2l0aG91dCBmb3JtYXQgcHJlZml4KVxuICAgKi9cbiAgc2VyaWFsaXplKFxuICAgIHZhbHVlOiB1bmtub3duLFxuICAgIG1vZGU6IFNlcmlhbGl6YXRpb25Nb2RlLFxuICAgIG9wdGlvbnM/OiBDb2RlY09wdGlvbnNcbiAgKTogVWludDhBcnJheTtcblxuICAvKipcbiAgICogRGVzZXJpYWxpemUgYnl0ZXMgYmFjayB0byBhIHZhbHVlLlxuICAgKlxuICAgKiBUaGUgY29kZWMgaGFuZGxlcyBhbGwgc3VwcG9ydGVkIHR5cGVzIGludGVybmFsbHkgYmFzZWQgb24gdGhlIG1vZGUuXG4gICAqXG4gICAqIEBwYXJhbSBkYXRhIC0gVGhlIHNlcmlhbGl6ZWQgcGF5bG9hZCAod2l0aG91dCBmb3JtYXQgcHJlZml4KVxuICAgKiBAcGFyYW0gbW9kZSAtIFRoZSBzZXJpYWxpemF0aW9uIG1vZGVcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBnbG9iYWwsIGV4dHJhIHJldml2ZXJzXG4gICAqIEByZXR1cm5zIFRoZSBkZXNlcmlhbGl6ZWQgdmFsdWVcbiAgICovXG4gIGRlc2VyaWFsaXplKFxuICAgIGRhdGE6IFVpbnQ4QXJyYXksXG4gICAgbW9kZTogU2VyaWFsaXphdGlvbk1vZGUsXG4gICAgb3B0aW9ucz86IENvZGVjT3B0aW9uc1xuICApOiB1bmtub3duO1xuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZSBsZWdhY3kgKHByZS1mb3JtYXQtcHJlZml4KSBkYXRhLlxuICAgKiBVc2VkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIHNwZWNWZXJzaW9uIDEgcnVucyB0aGF0IHN0b3JlZFxuICAgKiBkYXRhIGFzIHBsYWluIEpTT04gYXJyYXlzIGluc3RlYWQgb2YgYmluYXJ5LlxuICAgKlxuICAgKiBAcGFyYW0gZGF0YSAtIFRoZSBsZWdhY3kgZGF0YVxuICAgKiBAcGFyYW0gbW9kZSAtIFRoZSBzZXJpYWxpemF0aW9uIG1vZGVcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBnbG9iYWwsIGV4dHJhIHJldml2ZXJzXG4gICAqIEByZXR1cm5zIFRoZSBkZXNlcmlhbGl6ZWQgdmFsdWVcbiAgICovXG4gIGRlc2VyaWFsaXplTGVnYWN5PyhcbiAgICBkYXRhOiB1bmtub3duLFxuICAgIG1vZGU6IFNlcmlhbGl6YXRpb25Nb2RlLFxuICAgIG9wdGlvbnM/OiBDb2RlY09wdGlvbnNcbiAgKTogdW5rbm93bjtcbn1cbiJdfQ==
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Composable encryption layer for serialized data.
3
+ *
4
+ * Wraps/unwraps serialized payloads with AES-256-GCM encryption,
5
+ * using the format prefix system to mark encrypted data.
6
+ */
7
+ import { type CryptoKey } from '../encryption.js';
8
+ export type { CryptoKey };
9
+ /**
10
+ * Encryption key parameter type. Accepts a resolved key, undefined (no encryption),
11
+ * or a promise that resolves to either.
12
+ */
13
+ export type EncryptionKeyParam = CryptoKey | undefined | Promise<CryptoKey | undefined>;
14
+ /**
15
+ * Encrypt a format-prefixed payload if a key is provided.
16
+ * Wraps the data with the 'encr' format prefix.
17
+ *
18
+ * @param data - The format-prefixed serialized data
19
+ * @param key - Encryption key (undefined to skip encryption)
20
+ * @returns The encrypted data with 'encr' prefix, or the original data if no key
21
+ */
22
+ export declare function encrypt(data: Uint8Array | unknown, key: CryptoKey | undefined): Promise<Uint8Array | unknown>;
23
+ /**
24
+ * Decrypt a format-prefixed payload if it's encrypted.
25
+ * Strips the 'encr' format prefix and decrypts the inner payload.
26
+ *
27
+ * @param data - The potentially encrypted data
28
+ * @param key - Encryption key (undefined to skip decryption)
29
+ * @returns The decrypted inner payload, or the original data if not encrypted
30
+ */
31
+ export declare function decrypt(data: Uint8Array | unknown, key: CryptoKey | undefined): Promise<Uint8Array | unknown>;
32
+ //# sourceMappingURL=encryption.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encryption.d.ts","sourceRoot":"","sources":["../../src/serialization/encryption.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAGL,KAAK,SAAS,EACf,MAAM,kBAAkB,CAAC;AAQ1B,YAAY,EAAE,SAAS,EAAE,CAAC;AAE1B;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAC1B,SAAS,GACT,SAAS,GACT,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC;AAEnC;;;;;;;GAOG;AACH,wBAAsB,OAAO,CAC3B,IAAI,EAAE,UAAU,GAAG,OAAO,EAC1B,GAAG,EAAE,SAAS,GAAG,SAAS,GACzB,OAAO,CAAC,UAAU,GAAG,OAAO,CAAC,CAI/B;AAED;;;;;;;GAOG;AACH,wBAAsB,OAAO,CAC3B,IAAI,EAAE,UAAU,GAAG,OAAO,EAC1B,GAAG,EAAE,SAAS,GAAG,SAAS,GACzB,OAAO,CAAC,UAAU,GAAG,OAAO,CAAC,CAqC/B"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Composable encryption layer for serialized data.
3
+ *
4
+ * Wraps/unwraps serialized payloads with AES-256-GCM encryption,
5
+ * using the format prefix system to mark encrypted data.
6
+ */
7
+ import { RuntimeDecryptionError } from '@workflow/errors';
8
+ import { decrypt as aesGcmDecrypt, encrypt as aesGcmEncrypt, } from '../encryption.js';
9
+ import { decodeFormatPrefix, encodeWithFormatPrefix, peekFormatPrefix, } from './format.js';
10
+ import { SerializationFormat } from './types.js';
11
+ /**
12
+ * Encrypt a format-prefixed payload if a key is provided.
13
+ * Wraps the data with the 'encr' format prefix.
14
+ *
15
+ * @param data - The format-prefixed serialized data
16
+ * @param key - Encryption key (undefined to skip encryption)
17
+ * @returns The encrypted data with 'encr' prefix, or the original data if no key
18
+ */
19
+ export async function encrypt(data, key) {
20
+ if (!key || !(data instanceof Uint8Array))
21
+ return data;
22
+ const encrypted = await aesGcmEncrypt(key, data);
23
+ return encodeWithFormatPrefix(SerializationFormat.ENCRYPTED, encrypted);
24
+ }
25
+ /**
26
+ * Decrypt a format-prefixed payload if it's encrypted.
27
+ * Strips the 'encr' format prefix and decrypts the inner payload.
28
+ *
29
+ * @param data - The potentially encrypted data
30
+ * @param key - Encryption key (undefined to skip decryption)
31
+ * @returns The decrypted inner payload, or the original data if not encrypted
32
+ */
33
+ export async function decrypt(data, key) {
34
+ // Non-binary data is returned as-is.
35
+ if (!(data instanceof Uint8Array))
36
+ return data;
37
+ const format = peekFormatPrefix(data);
38
+ // If the data is encrypted but no key was provided, fail fast.
39
+ if (format === SerializationFormat.ENCRYPTED && !key) {
40
+ throw new RuntimeDecryptionError('Encrypted data encountered but no encryption key is available. ' +
41
+ 'Encryption is not configured or no key was provided for this run.', {
42
+ context: {
43
+ operation: 'decrypt',
44
+ byteLength: data.byteLength,
45
+ formatPrefix: 'encr',
46
+ },
47
+ });
48
+ }
49
+ // If the data is not encrypted, return it unchanged.
50
+ if (format !== SerializationFormat.ENCRYPTED)
51
+ return data;
52
+ const { payload } = decodeFormatPrefix(data);
53
+ try {
54
+ return await aesGcmDecrypt(key, payload);
55
+ }
56
+ catch (error) {
57
+ // The low-level AES layer only sees the stripped payload, so it cannot
58
+ // record the outer envelope prefix. This layer peeked it (`encr`), so
59
+ // enrich the diagnostic context with the real format prefix before
60
+ // rethrowing.
61
+ if (RuntimeDecryptionError.is(error) && error.context) {
62
+ error.context.formatPrefix = format;
63
+ }
64
+ throw error;
65
+ }
66
+ }
67
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jcnlwdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXJpYWxpemF0aW9uL2VuY3J5cHRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0dBS0c7QUFFSCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMxRCxPQUFPLEVBQ0wsT0FBTyxJQUFJLGFBQWEsRUFDeEIsT0FBTyxJQUFJLGFBQWEsR0FFekIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLHNCQUFzQixFQUN0QixnQkFBZ0IsR0FDakIsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBYWpEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLE9BQU8sQ0FDM0IsSUFBMEIsRUFDMUIsR0FBMEI7SUFFMUIsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxZQUFZLFVBQVUsQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3ZELE1BQU0sU0FBUyxHQUFHLE1BQU0sYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNqRCxPQUFPLHNCQUFzQixDQUFDLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUMxRSxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsT0FBTyxDQUMzQixJQUEwQixFQUMxQixHQUEwQjtJQUUxQixxQ0FBcUM7SUFDckMsSUFBSSxDQUFDLENBQUMsSUFBSSxZQUFZLFVBQVUsQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBRS9DLE1BQU0sTUFBTSxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBRXRDLCtEQUErRDtJQUMvRCxJQUFJLE1BQU0sS0FBSyxtQkFBbUIsQ0FBQyxTQUFTLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNyRCxNQUFNLElBQUksc0JBQXNCLENBQzlCLGlFQUFpRTtZQUMvRCxtRUFBbUUsRUFDckU7WUFDRSxPQUFPLEVBQUU7Z0JBQ1AsU0FBUyxFQUFFLFNBQVM7Z0JBQ3BCLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtnQkFDM0IsWUFBWSxFQUFFLE1BQU07YUFDckI7U0FDRixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQscURBQXFEO0lBQ3JELElBQUksTUFBTSxLQUFLLG1CQUFtQixDQUFDLFNBQVM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUUxRCxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0MsSUFBSSxDQUFDO1FBQ0gsT0FBTyxNQUFNLGFBQWEsQ0FBQyxHQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZix1RUFBdUU7UUFDdkUsc0VBQXNFO1FBQ3RFLG1FQUFtRTtRQUNuRSxjQUFjO1FBQ2QsSUFBSSxzQkFBc0IsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3RELEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQztRQUN0QyxDQUFDO1FBQ0QsTUFBTSxLQUFLLENBQUM7SUFDZCxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29tcG9zYWJsZSBlbmNyeXB0aW9uIGxheWVyIGZvciBzZXJpYWxpemVkIGRhdGEuXG4gKlxuICogV3JhcHMvdW53cmFwcyBzZXJpYWxpemVkIHBheWxvYWRzIHdpdGggQUVTLTI1Ni1HQ00gZW5jcnlwdGlvbixcbiAqIHVzaW5nIHRoZSBmb3JtYXQgcHJlZml4IHN5c3RlbSB0byBtYXJrIGVuY3J5cHRlZCBkYXRhLlxuICovXG5cbmltcG9ydCB7IFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3IgfSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB7XG4gIGRlY3J5cHQgYXMgYWVzR2NtRGVjcnlwdCxcbiAgZW5jcnlwdCBhcyBhZXNHY21FbmNyeXB0LFxuICB0eXBlIENyeXB0b0tleSxcbn0gZnJvbSAnLi4vZW5jcnlwdGlvbi5qcyc7XG5pbXBvcnQge1xuICBkZWNvZGVGb3JtYXRQcmVmaXgsXG4gIGVuY29kZVdpdGhGb3JtYXRQcmVmaXgsXG4gIHBlZWtGb3JtYXRQcmVmaXgsXG59IGZyb20gJy4vZm9ybWF0LmpzJztcbmltcG9ydCB7IFNlcmlhbGl6YXRpb25Gb3JtYXQgfSBmcm9tICcuL3R5cGVzLmpzJztcblxuZXhwb3J0IHR5cGUgeyBDcnlwdG9LZXkgfTtcblxuLyoqXG4gKiBFbmNyeXB0aW9uIGtleSBwYXJhbWV0ZXIgdHlwZS4gQWNjZXB0cyBhIHJlc29sdmVkIGtleSwgdW5kZWZpbmVkIChubyBlbmNyeXB0aW9uKSxcbiAqIG9yIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGVpdGhlci5cbiAqL1xuZXhwb3J0IHR5cGUgRW5jcnlwdGlvbktleVBhcmFtID1cbiAgfCBDcnlwdG9LZXlcbiAgfCB1bmRlZmluZWRcbiAgfCBQcm9taXNlPENyeXB0b0tleSB8IHVuZGVmaW5lZD47XG5cbi8qKlxuICogRW5jcnlwdCBhIGZvcm1hdC1wcmVmaXhlZCBwYXlsb2FkIGlmIGEga2V5IGlzIHByb3ZpZGVkLlxuICogV3JhcHMgdGhlIGRhdGEgd2l0aCB0aGUgJ2VuY3InIGZvcm1hdCBwcmVmaXguXG4gKlxuICogQHBhcmFtIGRhdGEgLSBUaGUgZm9ybWF0LXByZWZpeGVkIHNlcmlhbGl6ZWQgZGF0YVxuICogQHBhcmFtIGtleSAtIEVuY3J5cHRpb24ga2V5ICh1bmRlZmluZWQgdG8gc2tpcCBlbmNyeXB0aW9uKVxuICogQHJldHVybnMgVGhlIGVuY3J5cHRlZCBkYXRhIHdpdGggJ2VuY3InIHByZWZpeCwgb3IgdGhlIG9yaWdpbmFsIGRhdGEgaWYgbm8ga2V5XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbmNyeXB0KFxuICBkYXRhOiBVaW50OEFycmF5IHwgdW5rbm93bixcbiAga2V5OiBDcnlwdG9LZXkgfCB1bmRlZmluZWRcbik6IFByb21pc2U8VWludDhBcnJheSB8IHVua25vd24+IHtcbiAgaWYgKCFrZXkgfHwgIShkYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHJldHVybiBkYXRhO1xuICBjb25zdCBlbmNyeXB0ZWQgPSBhd2FpdCBhZXNHY21FbmNyeXB0KGtleSwgZGF0YSk7XG4gIHJldHVybiBlbmNvZGVXaXRoRm9ybWF0UHJlZml4KFNlcmlhbGl6YXRpb25Gb3JtYXQuRU5DUllQVEVELCBlbmNyeXB0ZWQpO1xufVxuXG4vKipcbiAqIERlY3J5cHQgYSBmb3JtYXQtcHJlZml4ZWQgcGF5bG9hZCBpZiBpdCdzIGVuY3J5cHRlZC5cbiAqIFN0cmlwcyB0aGUgJ2VuY3InIGZvcm1hdCBwcmVmaXggYW5kIGRlY3J5cHRzIHRoZSBpbm5lciBwYXlsb2FkLlxuICpcbiAqIEBwYXJhbSBkYXRhIC0gVGhlIHBvdGVudGlhbGx5IGVuY3J5cHRlZCBkYXRhXG4gKiBAcGFyYW0ga2V5IC0gRW5jcnlwdGlvbiBrZXkgKHVuZGVmaW5lZCB0byBza2lwIGRlY3J5cHRpb24pXG4gKiBAcmV0dXJucyBUaGUgZGVjcnlwdGVkIGlubmVyIHBheWxvYWQsIG9yIHRoZSBvcmlnaW5hbCBkYXRhIGlmIG5vdCBlbmNyeXB0ZWRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlY3J5cHQoXG4gIGRhdGE6IFVpbnQ4QXJyYXkgfCB1bmtub3duLFxuICBrZXk6IENyeXB0b0tleSB8IHVuZGVmaW5lZFxuKTogUHJvbWlzZTxVaW50OEFycmF5IHwgdW5rbm93bj4ge1xuICAvLyBOb24tYmluYXJ5IGRhdGEgaXMgcmV0dXJuZWQgYXMtaXMuXG4gIGlmICghKGRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KSkgcmV0dXJuIGRhdGE7XG5cbiAgY29uc3QgZm9ybWF0ID0gcGVla0Zvcm1hdFByZWZpeChkYXRhKTtcblxuICAvLyBJZiB0aGUgZGF0YSBpcyBlbmNyeXB0ZWQgYnV0IG5vIGtleSB3YXMgcHJvdmlkZWQsIGZhaWwgZmFzdC5cbiAgaWYgKGZvcm1hdCA9PT0gU2VyaWFsaXphdGlvbkZvcm1hdC5FTkNSWVBURUQgJiYgIWtleSkge1xuICAgIHRocm93IG5ldyBSdW50aW1lRGVjcnlwdGlvbkVycm9yKFxuICAgICAgJ0VuY3J5cHRlZCBkYXRhIGVuY291bnRlcmVkIGJ1dCBubyBlbmNyeXB0aW9uIGtleSBpcyBhdmFpbGFibGUuICcgK1xuICAgICAgICAnRW5jcnlwdGlvbiBpcyBub3QgY29uZmlndXJlZCBvciBubyBrZXkgd2FzIHByb3ZpZGVkIGZvciB0aGlzIHJ1bi4nLFxuICAgICAge1xuICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgb3BlcmF0aW9uOiAnZGVjcnlwdCcsXG4gICAgICAgICAgYnl0ZUxlbmd0aDogZGF0YS5ieXRlTGVuZ3RoLFxuICAgICAgICAgIGZvcm1hdFByZWZpeDogJ2VuY3InLFxuICAgICAgICB9LFxuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvLyBJZiB0aGUgZGF0YSBpcyBub3QgZW5jcnlwdGVkLCByZXR1cm4gaXQgdW5jaGFuZ2VkLlxuICBpZiAoZm9ybWF0ICE9PSBTZXJpYWxpemF0aW9uRm9ybWF0LkVOQ1JZUFRFRCkgcmV0dXJuIGRhdGE7XG5cbiAgY29uc3QgeyBwYXlsb2FkIH0gPSBkZWNvZGVGb3JtYXRQcmVmaXgoZGF0YSk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGFlc0djbURlY3J5cHQoa2V5ISwgcGF5bG9hZCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gVGhlIGxvdy1sZXZlbCBBRVMgbGF5ZXIgb25seSBzZWVzIHRoZSBzdHJpcHBlZCBwYXlsb2FkLCBzbyBpdCBjYW5ub3RcbiAgICAvLyByZWNvcmQgdGhlIG91dGVyIGVudmVsb3BlIHByZWZpeC4gVGhpcyBsYXllciBwZWVrZWQgaXQgKGBlbmNyYCksIHNvXG4gICAgLy8gZW5yaWNoIHRoZSBkaWFnbm9zdGljIGNvbnRleHQgd2l0aCB0aGUgcmVhbCBmb3JtYXQgcHJlZml4IGJlZm9yZVxuICAgIC8vIHJldGhyb3dpbmcuXG4gICAgaWYgKFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3IuaXMoZXJyb3IpICYmIGVycm9yLmNvbnRleHQpIHtcbiAgICAgIGVycm9yLmNvbnRleHQuZm9ybWF0UHJlZml4ID0gZm9ybWF0O1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuIl19
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Shared error formatting utility for serialization failures.
3
+ *
4
+ * Used by the mode-specific serializers (workflow, step, client) to
5
+ * produce consistent error messages with devalue path information.
6
+ *
7
+ * Returns a `{ message, hint }` pair so callers can throw a
8
+ * `SerializationError(message, { hint, cause })` and have the hint flow
9
+ * through the standard friendly-errors framing instead of being baked
10
+ * into the message string.
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;
25
+ /**
26
+ * Format a serialization error with context about what failed.
27
+ * Extracts path, value, and reason from devalue's DevalueError when available.
28
+ * Logs the problematic value to the console for better debugging.
29
+ */
30
+ export declare function formatSerializationError(context: string, error: unknown): {
31
+ message: string;
32
+ hint: string;
33
+ };
34
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Shared error formatting utility for serialization failures.
3
+ *
4
+ * Used by the mode-specific serializers (workflow, step, client) to
5
+ * produce consistent error messages with devalue path information.
6
+ *
7
+ * Returns a `{ message, hint }` pair so callers can throw a
8
+ * `SerializationError(message, { hint, cause })` and have the hint flow
9
+ * through the standard friendly-errors framing instead of being baked
10
+ * into the message string.
11
+ */
12
+ import { RuntimeDecryptionError } from '@workflow/errors';
13
+ import { DevalueError } from 'devalue';
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
+ }
32
+ /**
33
+ * Format a serialization error with context about what failed.
34
+ * Extracts path, value, and reason from devalue's DevalueError when available.
35
+ * Logs the problematic value to the console for better debugging.
36
+ */
37
+ export function formatSerializationError(context, error) {
38
+ // `returning` for outputs, `passing` for everything that crosses the
39
+ // boundary the other way (arguments, stream messages, etc.).
40
+ const verb = context.includes('return value') ? 'returning' : 'passing';
41
+ let message = `Failed to serialize ${context}`;
42
+ if (error instanceof DevalueError && error.path) {
43
+ message += ` at path "${error.path}"`;
44
+ }
45
+ // Workflow can serialize a much richer set than the devalue defaults —
46
+ // classes registered via `WORKFLOW_SERIALIZE`, FatalError / RetryableError
47
+ // subclasses, AbortSignal, etc. Pointing at the foundations doc keeps
48
+ // this hint accurate as the supported set grows, instead of repeating
49
+ // a hardcoded list that drifts out of sync.
50
+ const hint = `Ensure you're ${verb} workflow serializable types. Check the serialization docs to see what's serializable: https://workflow-sdk.dev/docs/foundations/serialization`;
51
+ if (error instanceof DevalueError && error.value !== undefined) {
52
+ runtimeLogger.error('Serialization failed', {
53
+ context,
54
+ problematicValue: error.value,
55
+ });
56
+ }
57
+ return { message, hint };
58
+ }
59
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcmlhbGl6YXRpb24vZXJyb3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFFSCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFN0M7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQUMsS0FBYztJQUNsRCxJQUFJLHNCQUFzQixDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sS0FBSyxDQUFDO0lBQ2QsQ0FBQztBQUNILENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLHdCQUF3QixDQUN0QyxPQUFlLEVBQ2YsS0FBYztJQUVkLHFFQUFxRTtJQUNyRSw2REFBNkQ7SUFDN0QsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDeEUsSUFBSSxPQUFPLEdBQUcsdUJBQXVCLE9BQU8sRUFBRSxDQUFDO0lBQy9DLElBQUksS0FBSyxZQUFZLFlBQVksSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDaEQsT0FBTyxJQUFJLGFBQWEsS0FBSyxDQUFDLElBQUksR0FBRyxDQUFDO0lBQ3hDLENBQUM7SUFDRCx1RUFBdUU7SUFDdkUsMkVBQTJFO0lBQzNFLHNFQUFzRTtJQUN0RSxzRUFBc0U7SUFDdEUsNENBQTRDO0lBQzVDLE1BQU0sSUFBSSxHQUFHLGlCQUFpQixJQUFJLGdKQUFnSixDQUFDO0lBQ25MLElBQUksS0FBSyxZQUFZLFlBQVksSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQy9ELGFBQWEsQ0FBQyxLQUFLLENBQUMsc0JBQXNCLEVBQUU7WUFDMUMsT0FBTztZQUNQLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxLQUFLO1NBQzlCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDO0FBQzNCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNoYXJlZCBlcnJvciBmb3JtYXR0aW5nIHV0aWxpdHkgZm9yIHNlcmlhbGl6YXRpb24gZmFpbHVyZXMuXG4gKlxuICogVXNlZCBieSB0aGUgbW9kZS1zcGVjaWZpYyBzZXJpYWxpemVycyAod29ya2Zsb3csIHN0ZXAsIGNsaWVudCkgdG9cbiAqIHByb2R1Y2UgY29uc2lzdGVudCBlcnJvciBtZXNzYWdlcyB3aXRoIGRldmFsdWUgcGF0aCBpbmZvcm1hdGlvbi5cbiAqXG4gKiBSZXR1cm5zIGEgYHsgbWVzc2FnZSwgaGludCB9YCBwYWlyIHNvIGNhbGxlcnMgY2FuIHRocm93IGFcbiAqIGBTZXJpYWxpemF0aW9uRXJyb3IobWVzc2FnZSwgeyBoaW50LCBjYXVzZSB9KWAgYW5kIGhhdmUgdGhlIGhpbnQgZmxvd1xuICogdGhyb3VnaCB0aGUgc3RhbmRhcmQgZnJpZW5kbHktZXJyb3JzIGZyYW1pbmcgaW5zdGVhZCBvZiBiZWluZyBiYWtlZFxuICogaW50byB0aGUgbWVzc2FnZSBzdHJpbmcuXG4gKi9cblxuaW1wb3J0IHsgUnVudGltZURlY3J5cHRpb25FcnJvciB9IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHsgRGV2YWx1ZUVycm9yIH0gZnJvbSAnZGV2YWx1ZSc7XG5pbXBvcnQgeyBydW50aW1lTG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcblxuLyoqXG4gKiBSZXRocm93IFNESyBydW50aW1lIGVycm9ycyB0aGF0IG11c3Qgbm90IGJlIHJlZnJhbWVkIGFzXG4gKiBgU2VyaWFsaXphdGlvbkVycm9yYC5cbiAqXG4gKiBUaGUgc2VyaWFsaXplL2RlaHlkcmF0ZSB3cmFwcGVycyBjYXRjaCBldmVyeSB0aHJvdyBhbmQgcmVmcmFtZSBpdCBhcyBhXG4gKiBgU2VyaWFsaXphdGlvbkVycm9yYCAod2hpY2ggY2xhc3NpZmllcyBhcyBgVVNFUl9FUlJPUmApLiBUaGF0J3MgY29ycmVjdFxuICogZm9yIGdlbnVpbmUgc2VyaWFsaXphdGlvbiBmYWlsdXJlcywgYnV0IGEgYFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3JgIGZyb21cbiAqIHRoZSBBRVMtR0NNIGxheWVyIGlzIGFuIFNESy1pbnRlcm5hbCBmYWlsdXJlIHRoYXQgbXVzdCBrZWVwIGl0cyBpZGVudGl0eVxuICogc28gdGhlIHJ1bi1mYWlsdXJlIGNsYXNzaWZpZXIgcm91dGVzIGl0IHRvIGBSVU5USU1FX0VSUk9SYC4gQ2FsbCB0aGlzIGF0XG4gKiB0aGUgdG9wIG9mIGVhY2ggc2VyaWFsaXplIGNhdGNoIGJsb2NrIHRvIGxldCB0aG9zZSBlcnJvcnMgcHJvcGFnYXRlXG4gKiB1bmNoYW5nZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXRocm93SWZSdW50aW1lRXJyb3IoZXJyb3I6IHVua25vd24pOiB2b2lkIHtcbiAgaWYgKFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3IuaXMoZXJyb3IpKSB7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuLyoqXG4gKiBGb3JtYXQgYSBzZXJpYWxpemF0aW9uIGVycm9yIHdpdGggY29udGV4dCBhYm91dCB3aGF0IGZhaWxlZC5cbiAqIEV4dHJhY3RzIHBhdGgsIHZhbHVlLCBhbmQgcmVhc29uIGZyb20gZGV2YWx1ZSdzIERldmFsdWVFcnJvciB3aGVuIGF2YWlsYWJsZS5cbiAqIExvZ3MgdGhlIHByb2JsZW1hdGljIHZhbHVlIHRvIHRoZSBjb25zb2xlIGZvciBiZXR0ZXIgZGVidWdnaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0U2VyaWFsaXphdGlvbkVycm9yKFxuICBjb250ZXh0OiBzdHJpbmcsXG4gIGVycm9yOiB1bmtub3duXG4pOiB7IG1lc3NhZ2U6IHN0cmluZzsgaGludDogc3RyaW5nIH0ge1xuICAvLyBgcmV0dXJuaW5nYCBmb3Igb3V0cHV0cywgYHBhc3NpbmdgIGZvciBldmVyeXRoaW5nIHRoYXQgY3Jvc3NlcyB0aGVcbiAgLy8gYm91bmRhcnkgdGhlIG90aGVyIHdheSAoYXJndW1lbnRzLCBzdHJlYW0gbWVzc2FnZXMsIGV0Yy4pLlxuICBjb25zdCB2ZXJiID0gY29udGV4dC5pbmNsdWRlcygncmV0dXJuIHZhbHVlJykgPyAncmV0dXJuaW5nJyA6ICdwYXNzaW5nJztcbiAgbGV0IG1lc3NhZ2UgPSBgRmFpbGVkIHRvIHNlcmlhbGl6ZSAke2NvbnRleHR9YDtcbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgRGV2YWx1ZUVycm9yICYmIGVycm9yLnBhdGgpIHtcbiAgICBtZXNzYWdlICs9IGAgYXQgcGF0aCBcIiR7ZXJyb3IucGF0aH1cImA7XG4gIH1cbiAgLy8gV29ya2Zsb3cgY2FuIHNlcmlhbGl6ZSBhIG11Y2ggcmljaGVyIHNldCB0aGFuIHRoZSBkZXZhbHVlIGRlZmF1bHRzIOKAlFxuICAvLyBjbGFzc2VzIHJlZ2lzdGVyZWQgdmlhIGBXT1JLRkxPV19TRVJJQUxJWkVgLCBGYXRhbEVycm9yIC8gUmV0cnlhYmxlRXJyb3JcbiAgLy8gc3ViY2xhc3NlcywgQWJvcnRTaWduYWwsIGV0Yy4gUG9pbnRpbmcgYXQgdGhlIGZvdW5kYXRpb25zIGRvYyBrZWVwc1xuICAvLyB0aGlzIGhpbnQgYWNjdXJhdGUgYXMgdGhlIHN1cHBvcnRlZCBzZXQgZ3Jvd3MsIGluc3RlYWQgb2YgcmVwZWF0aW5nXG4gIC8vIGEgaGFyZGNvZGVkIGxpc3QgdGhhdCBkcmlmdHMgb3V0IG9mIHN5bmMuXG4gIGNvbnN0IGhpbnQgPSBgRW5zdXJlIHlvdSdyZSAke3ZlcmJ9IHdvcmtmbG93IHNlcmlhbGl6YWJsZSB0eXBlcy4gQ2hlY2sgdGhlIHNlcmlhbGl6YXRpb24gZG9jcyB0byBzZWUgd2hhdCdzIHNlcmlhbGl6YWJsZTogaHR0cHM6Ly93b3JrZmxvdy1zZGsuZGV2L2RvY3MvZm91bmRhdGlvbnMvc2VyaWFsaXphdGlvbmA7XG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIERldmFsdWVFcnJvciAmJiBlcnJvci52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcnVudGltZUxvZ2dlci5lcnJvcignU2VyaWFsaXphdGlvbiBmYWlsZWQnLCB7XG4gICAgICBjb250ZXh0LFxuICAgICAgcHJvYmxlbWF0aWNWYWx1ZTogZXJyb3IudmFsdWUsXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHsgbWVzc2FnZSwgaGludCB9O1xufVxuIl19