@workflow/core 5.0.0-beta.4 → 5.0.0-beta.41

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (322) 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 +33 -1
  5. package/dist/capabilities.d.ts.map +1 -1
  6. package/dist/capabilities.js +71 -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 +109 -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 +149 -0
  22. package/dist/create-hook.d.ts +62 -4
  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 +189 -0
  30. package/dist/encryption.d.ts +37 -3
  31. package/dist/encryption.d.ts.map +1 -1
  32. package/dist/encryption.js +97 -31
  33. package/dist/events-consumer.d.ts +147 -1
  34. package/dist/events-consumer.d.ts.map +1 -1
  35. package/dist/events-consumer.js +444 -43
  36. package/dist/flushable-stream.d.ts +65 -10
  37. package/dist/flushable-stream.d.ts.map +1 -1
  38. package/dist/flushable-stream.js +131 -18
  39. package/dist/global.d.ts +37 -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 +246 -8
  52. package/dist/private.d.ts.map +1 -1
  53. package/dist/private.js +345 -9
  54. package/dist/replay-payload-cache.d.ts +68 -0
  55. package/dist/replay-payload-cache.d.ts.map +1 -0
  56. package/dist/replay-payload-cache.js +160 -0
  57. package/dist/runtime/compute-instance.d.ts +12 -0
  58. package/dist/runtime/compute-instance.d.ts.map +1 -0
  59. package/dist/runtime/compute-instance.js +13 -0
  60. package/dist/runtime/constants.d.ts +251 -0
  61. package/dist/runtime/constants.d.ts.map +1 -1
  62. package/dist/runtime/constants.js +425 -16
  63. package/dist/runtime/count-step-started-events.d.ts +52 -0
  64. package/dist/runtime/count-step-started-events.d.ts.map +1 -0
  65. package/dist/runtime/count-step-started-events.js +72 -0
  66. package/dist/runtime/deployment-guard.d.ts +99 -0
  67. package/dist/runtime/deployment-guard.d.ts.map +1 -0
  68. package/dist/runtime/deployment-guard.js +154 -0
  69. package/dist/runtime/get-port-lazy.d.ts +25 -0
  70. package/dist/runtime/get-port-lazy.d.ts.map +1 -0
  71. package/dist/runtime/get-port-lazy.js +92 -0
  72. package/dist/runtime/get-world-lazy.d.ts +23 -0
  73. package/dist/runtime/get-world-lazy.d.ts.map +1 -0
  74. package/dist/runtime/get-world-lazy.js +46 -0
  75. package/dist/runtime/helpers.d.ts +327 -10
  76. package/dist/runtime/helpers.d.ts.map +1 -1
  77. package/dist/runtime/helpers.js +586 -40
  78. package/dist/runtime/quickjs-assets.generated.d.ts +14 -0
  79. package/dist/runtime/quickjs-assets.generated.d.ts.map +1 -0
  80. package/dist/runtime/quickjs-assets.generated.js +30 -0
  81. package/dist/runtime/quickjs-entrypoint.d.ts +124 -0
  82. package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -0
  83. package/dist/runtime/quickjs-entrypoint.js +1437 -0
  84. package/dist/runtime/quickjs-runtime.d.ts +228 -0
  85. package/dist/runtime/quickjs-runtime.d.ts.map +1 -0
  86. package/dist/runtime/quickjs-runtime.js +2372 -0
  87. package/dist/runtime/quickjs-serde.d.ts +107 -0
  88. package/dist/runtime/quickjs-serde.d.ts.map +1 -0
  89. package/dist/runtime/quickjs-serde.js +2098 -0
  90. package/dist/runtime/replay-budget.d.ts +89 -0
  91. package/dist/runtime/replay-budget.d.ts.map +1 -0
  92. package/dist/runtime/replay-budget.js +139 -0
  93. package/dist/runtime/replay-recovery-reporter.d.ts +36 -0
  94. package/dist/runtime/replay-recovery-reporter.d.ts.map +1 -0
  95. package/dist/runtime/replay-recovery-reporter.js +64 -0
  96. package/dist/runtime/resume-hook.d.ts +27 -4
  97. package/dist/runtime/resume-hook.d.ts.map +1 -1
  98. package/dist/runtime/resume-hook.js +452 -76
  99. package/dist/runtime/run-id-time.d.ts +19 -0
  100. package/dist/runtime/run-id-time.d.ts.map +1 -0
  101. package/dist/runtime/run-id-time.js +42 -0
  102. package/dist/runtime/run.d.ts +8 -2
  103. package/dist/runtime/run.d.ts.map +1 -1
  104. package/dist/runtime/run.js +62 -15
  105. package/dist/runtime/runs.d.ts +54 -3
  106. package/dist/runtime/runs.d.ts.map +1 -1
  107. package/dist/runtime/runs.js +119 -13
  108. package/dist/runtime/start.d.ts +70 -1
  109. package/dist/runtime/start.d.ts.map +1 -1
  110. package/dist/runtime/start.js +313 -60
  111. package/dist/runtime/step-executor.d.ts +177 -0
  112. package/dist/runtime/step-executor.d.ts.map +1 -0
  113. package/dist/runtime/step-executor.js +946 -0
  114. package/dist/runtime/step-latency.d.ts +197 -0
  115. package/dist/runtime/step-latency.d.ts.map +1 -0
  116. package/dist/runtime/step-latency.js +207 -0
  117. package/dist/runtime/step-ownership.d.ts +72 -0
  118. package/dist/runtime/step-ownership.d.ts.map +1 -0
  119. package/dist/runtime/step-ownership.js +114 -0
  120. package/dist/runtime/step-single-flight.d.ts +12 -0
  121. package/dist/runtime/step-single-flight.d.ts.map +1 -0
  122. package/dist/runtime/step-single-flight.js +69 -0
  123. package/dist/runtime/suspension-handler.d.ts +109 -7
  124. package/dist/runtime/suspension-handler.d.ts.map +1 -1
  125. package/dist/runtime/suspension-handler.js +486 -140
  126. package/dist/runtime/vm-mode.d.ts +44 -0
  127. package/dist/runtime/vm-mode.d.ts.map +1 -0
  128. package/dist/runtime/vm-mode.js +62 -0
  129. package/dist/runtime/vm-serde-bundle.generated.d.ts +14 -0
  130. package/dist/runtime/vm-serde-bundle.generated.d.ts.map +1 -0
  131. package/dist/runtime/vm-serde-bundle.generated.js +16 -0
  132. package/dist/runtime/wait-continuation.d.ts +84 -0
  133. package/dist/runtime/wait-continuation.d.ts.map +1 -0
  134. package/dist/runtime/wait-continuation.js +105 -0
  135. package/dist/runtime/wait-until.d.ts +18 -0
  136. package/dist/runtime/wait-until.d.ts.map +1 -0
  137. package/dist/runtime/wait-until.js +42 -0
  138. package/dist/runtime/world-compatibility.d.ts +20 -0
  139. package/dist/runtime/world-compatibility.d.ts.map +1 -0
  140. package/dist/runtime/world-compatibility.js +32 -0
  141. package/dist/runtime/world-init.d.ts +50 -0
  142. package/dist/runtime/world-init.d.ts.map +1 -0
  143. package/dist/runtime/world-init.js +50 -0
  144. package/dist/runtime/world.d.ts +14 -2
  145. package/dist/runtime/world.d.ts.map +1 -1
  146. package/dist/runtime/world.js +101 -26
  147. package/dist/runtime.d.ts +17 -12
  148. package/dist/runtime.d.ts.map +1 -1
  149. package/dist/runtime.js +3135 -328
  150. package/dist/schemas.d.ts +1 -1
  151. package/dist/schemas.d.ts.map +1 -1
  152. package/dist/schemas.js +1 -1
  153. package/dist/sealed-box.d.ts +167 -0
  154. package/dist/sealed-box.d.ts.map +1 -0
  155. package/dist/sealed-box.js +571 -0
  156. package/dist/serialization/client.d.ts +17 -0
  157. package/dist/serialization/client.d.ts.map +1 -0
  158. package/dist/serialization/client.js +48 -0
  159. package/dist/serialization/codec-devalue-vm.d.ts +16 -0
  160. package/dist/serialization/codec-devalue-vm.d.ts.map +1 -0
  161. package/dist/serialization/codec-devalue-vm.js +148 -0
  162. package/dist/serialization/codec-devalue.d.ts +14 -0
  163. package/dist/serialization/codec-devalue.d.ts.map +1 -0
  164. package/dist/serialization/codec-devalue.js +105 -0
  165. package/dist/serialization/codec.d.ts +125 -0
  166. package/dist/serialization/codec.d.ts.map +1 -0
  167. package/dist/serialization/codec.js +17 -0
  168. package/dist/serialization/compression.d.ts +104 -0
  169. package/dist/serialization/compression.d.ts.map +1 -0
  170. package/dist/serialization/compression.js +260 -0
  171. package/dist/serialization/encryption.d.ts +134 -0
  172. package/dist/serialization/encryption.d.ts.map +1 -0
  173. package/dist/serialization/encryption.js +186 -0
  174. package/dist/serialization/errors.d.ts +34 -0
  175. package/dist/serialization/errors.d.ts.map +1 -0
  176. package/dist/serialization/errors.js +59 -0
  177. package/dist/serialization/format.d.ts +60 -0
  178. package/dist/serialization/format.d.ts.map +1 -0
  179. package/dist/serialization/format.js +97 -0
  180. package/dist/serialization/hardened.d.ts +155 -0
  181. package/dist/serialization/hardened.d.ts.map +1 -0
  182. package/dist/serialization/hardened.js +523 -0
  183. package/dist/serialization/index.d.ts +20 -0
  184. package/dist/serialization/index.d.ts.map +1 -0
  185. package/dist/serialization/index.js +22 -0
  186. package/dist/serialization/reducers/class-vm.d.ts +20 -0
  187. package/dist/serialization/reducers/class-vm.d.ts.map +1 -0
  188. package/dist/serialization/reducers/class-vm.js +77 -0
  189. package/dist/serialization/reducers/class.d.ts +11 -0
  190. package/dist/serialization/reducers/class.d.ts.map +1 -0
  191. package/dist/serialization/reducers/class.js +73 -0
  192. package/dist/serialization/reducers/common-vm.d.ts +15 -0
  193. package/dist/serialization/reducers/common-vm.d.ts.map +1 -0
  194. package/dist/serialization/reducers/common-vm.js +579 -0
  195. package/dist/serialization/reducers/common.d.ts +16 -0
  196. package/dist/serialization/reducers/common.d.ts.map +1 -0
  197. package/dist/serialization/reducers/common.js +478 -0
  198. package/dist/serialization/reducers/step-function-vm.d.ts +44 -0
  199. package/dist/serialization/reducers/step-function-vm.d.ts.map +1 -0
  200. package/dist/serialization/reducers/step-function-vm.js +97 -0
  201. package/dist/serialization/reducers/step-function.d.ts +35 -0
  202. package/dist/serialization/reducers/step-function.d.ts.map +1 -0
  203. package/dist/serialization/reducers/step-function.js +104 -0
  204. package/dist/serialization/step.d.ts +17 -0
  205. package/dist/serialization/step.d.ts.map +1 -0
  206. package/dist/serialization/step.js +48 -0
  207. package/dist/serialization/types.d.ts +273 -0
  208. package/dist/serialization/types.d.ts.map +1 -0
  209. package/dist/serialization/types.js +35 -0
  210. package/dist/serialization/workflow-vm.d.ts +29 -0
  211. package/dist/serialization/workflow-vm.d.ts.map +1 -0
  212. package/dist/serialization/workflow-vm.js +71 -0
  213. package/dist/serialization/workflow.d.ts +29 -0
  214. package/dist/serialization/workflow.d.ts.map +1 -0
  215. package/dist/serialization/workflow.js +54 -0
  216. package/dist/serialization-format.d.ts +60 -4
  217. package/dist/serialization-format.d.ts.map +1 -1
  218. package/dist/serialization-format.js +276 -56
  219. package/dist/serialization.d.ts +374 -221
  220. package/dist/serialization.d.ts.map +1 -1
  221. package/dist/serialization.js +2300 -783
  222. package/dist/set-attributes.d.ts +13 -0
  223. package/dist/set-attributes.d.ts.map +1 -0
  224. package/dist/set-attributes.js +60 -0
  225. package/dist/sleep.d.ts.map +1 -1
  226. package/dist/sleep.js +3 -2
  227. package/dist/source-map.d.ts +25 -0
  228. package/dist/source-map.d.ts.map +1 -1
  229. package/dist/source-map.js +148 -10
  230. package/dist/step/context-storage.d.ts +61 -2
  231. package/dist/step/context-storage.d.ts.map +1 -1
  232. package/dist/step/context-storage.js +7 -5
  233. package/dist/step/get-closure-vars.d.ts.map +1 -1
  234. package/dist/step/get-closure-vars.js +3 -2
  235. package/dist/step/get-step-metadata.d.ts.map +1 -1
  236. package/dist/step/get-step-metadata.js +3 -2
  237. package/dist/step/get-workflow-metadata.d.ts.map +1 -1
  238. package/dist/step/get-workflow-metadata.js +3 -2
  239. package/dist/step/writable-stream.d.ts.map +1 -1
  240. package/dist/step/writable-stream.js +71 -7
  241. package/dist/step.d.ts.map +1 -1
  242. package/dist/step.js +225 -29
  243. package/dist/symbols.d.ts +54 -0
  244. package/dist/symbols.d.ts.map +1 -1
  245. package/dist/symbols.js +55 -1
  246. package/dist/telemetry/semantic-conventions.d.ts +265 -2
  247. package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
  248. package/dist/telemetry/semantic-conventions.js +190 -1
  249. package/dist/telemetry.d.ts +73 -0
  250. package/dist/telemetry.d.ts.map +1 -1
  251. package/dist/telemetry.js +153 -16
  252. package/dist/types.d.ts +6 -0
  253. package/dist/types.d.ts.map +1 -1
  254. package/dist/types.js +23 -1
  255. package/dist/util.d.ts +16 -6
  256. package/dist/util.d.ts.map +1 -1
  257. package/dist/util.js +25 -16
  258. package/dist/version.d.ts +1 -1
  259. package/dist/version.d.ts.map +1 -1
  260. package/dist/version.js +2 -2
  261. package/dist/vm/index.d.ts.map +1 -1
  262. package/dist/vm/index.js +85 -14
  263. package/dist/vm/script-cache.d.ts +28 -0
  264. package/dist/vm/script-cache.d.ts.map +1 -0
  265. package/dist/vm/script-cache.js +140 -0
  266. package/dist/workflow/abort-controller.d.ts +65 -0
  267. package/dist/workflow/abort-controller.d.ts.map +1 -0
  268. package/dist/workflow/abort-controller.js +312 -0
  269. package/dist/workflow/attribute-dispatcher.d.ts +6 -0
  270. package/dist/workflow/attribute-dispatcher.d.ts.map +1 -0
  271. package/dist/workflow/attribute-dispatcher.js +48 -0
  272. package/dist/workflow/create-hook.d.ts.map +1 -1
  273. package/dist/workflow/create-hook.js +25 -3
  274. package/dist/workflow/define-hook.d.ts +1 -1
  275. package/dist/workflow/define-hook.d.ts.map +1 -1
  276. package/dist/workflow/define-hook.js +8 -4
  277. package/dist/workflow/get-workflow-metadata.d.ts.map +1 -1
  278. package/dist/workflow/get-workflow-metadata.js +14 -3
  279. package/dist/workflow/hook.d.ts.map +1 -1
  280. package/dist/workflow/hook.js +302 -36
  281. package/dist/workflow/index.d.ts +1 -0
  282. package/dist/workflow/index.d.ts.map +1 -1
  283. package/dist/workflow/index.js +5 -3
  284. package/dist/workflow/set-attributes.d.ts +68 -0
  285. package/dist/workflow/set-attributes.d.ts.map +1 -0
  286. package/dist/workflow/set-attributes.js +60 -0
  287. package/dist/workflow/sleep.d.ts.map +1 -1
  288. package/dist/workflow/sleep.js +57 -8
  289. package/dist/workflow/world-init-stub.d.ts +15 -0
  290. package/dist/workflow/world-init-stub.d.ts.map +1 -0
  291. package/dist/workflow/world-init-stub.js +15 -0
  292. package/dist/workflow.d.ts +79 -3
  293. package/dist/workflow.d.ts.map +1 -1
  294. package/dist/workflow.js +831 -553
  295. package/docs/api-reference/create-hook.mdx +79 -0
  296. package/docs/api-reference/create-webhook.mdx +1 -0
  297. package/docs/api-reference/define-hook.mdx +26 -24
  298. package/docs/api-reference/fatal-error.mdx +29 -7
  299. package/docs/api-reference/fetch.mdx +8 -4
  300. package/docs/api-reference/index.mdx +3 -0
  301. package/docs/api-reference/set-attributes.mdx +61 -0
  302. package/docs/api-reference/sleep.mdx +1 -1
  303. package/docs/foundations/cancellation.mdx +459 -0
  304. package/docs/foundations/errors-and-retries.mdx +7 -3
  305. package/docs/foundations/hooks.mdx +29 -0
  306. package/docs/foundations/idempotency.mdx +243 -11
  307. package/docs/foundations/index.mdx +1 -23
  308. package/docs/foundations/meta.json +3 -1
  309. package/docs/foundations/serialization.mdx +77 -41
  310. package/docs/foundations/starting-workflows.mdx +79 -2
  311. package/docs/foundations/streaming.mdx +14 -23
  312. package/docs/foundations/versioning.mdx +263 -0
  313. package/docs/how-it-works/cancellation.mdx +287 -0
  314. package/docs/how-it-works/code-transform.mdx +21 -17
  315. package/docs/how-it-works/encryption.mdx +5 -5
  316. package/docs/how-it-works/event-sourcing.mdx +17 -9
  317. package/docs/how-it-works/framework-integrations.mdx +96 -337
  318. package/docs/how-it-works/meta.json +2 -1
  319. package/package.json +31 -13
  320. package/dist/runtime/step-handler.d.ts +0 -2
  321. package/dist/runtime/step-handler.d.ts.map +0 -1
  322. package/dist/runtime/step-handler.js +0 -678
@@ -0,0 +1,7 @@
1
+ import { type AttributeChange } from '@workflow/world';
2
+ interface AttributeChangeOptions {
3
+ allowReservedAttributes?: boolean;
4
+ }
5
+ export declare function normalizeAttributeChanges(attrs: Record<string, string | undefined>, options?: AttributeChangeOptions): AttributeChange[];
6
+ export {};
7
+ //# sourceMappingURL=attribute-changes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attribute-changes.d.ts","sourceRoot":"","sources":["../src/attribute-changes.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,eAAe,EAGrB,MAAM,iBAAiB,CAAC;AAEzB,UAAU,sBAAsB;IAC9B,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC;AAED,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EACzC,OAAO,GAAE,sBAA2B,GACnC,eAAe,EAAE,CA4BnB"}
@@ -0,0 +1,25 @@
1
+ import { FatalError } from '@workflow/errors';
2
+ import { AttributeValidationError, validateAttributeChanges, } from '@workflow/world';
3
+ export function normalizeAttributeChanges(attrs, options = {}) {
4
+ if (attrs === null || typeof attrs !== 'object' || Array.isArray(attrs)) {
5
+ throw new FatalError(`setAttributes requires a plain object, got ${attrs === null ? 'null' : Array.isArray(attrs) ? 'array' : typeof attrs}`);
6
+ }
7
+ const changes = Object.entries(attrs).map(([key, value]) => ({
8
+ key,
9
+ value: value === undefined ? null : value,
10
+ }));
11
+ if (changes.length === 0)
12
+ return changes;
13
+ const allowReservedAttributes = options.allowReservedAttributes === true;
14
+ try {
15
+ validateAttributeChanges(changes, { allowReservedAttributes });
16
+ }
17
+ catch (err) {
18
+ if (err instanceof AttributeValidationError) {
19
+ throw new FatalError(err.message);
20
+ }
21
+ throw err;
22
+ }
23
+ return changes;
24
+ }
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0cmlidXRlLWNoYW5nZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvYXR0cmlidXRlLWNoYW5nZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzlDLE9BQU8sRUFFTCx3QkFBd0IsRUFDeEIsd0JBQXdCLEdBQ3pCLE1BQU0saUJBQWlCLENBQUM7QUFNekIsTUFBTSxVQUFVLHlCQUF5QixDQUN2QyxLQUF5QyxFQUN6QyxVQUFrQyxFQUFFO0lBRXBDLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3hFLE1BQU0sSUFBSSxVQUFVLENBQ2xCLDhDQUNFLEtBQUssS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQ3BFLEVBQUUsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU0sT0FBTyxHQUFzQixNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FDMUQsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNqQixHQUFHO1FBQ0gsS0FBSyxFQUFFLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSztLQUMxQyxDQUFDLENBQ0gsQ0FBQztJQUNGLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxPQUFPLENBQUM7SUFFekMsTUFBTSx1QkFBdUIsR0FBRyxPQUFPLENBQUMsdUJBQXVCLEtBQUssSUFBSSxDQUFDO0lBQ3pFLElBQUksQ0FBQztRQUNILHdCQUF3QixDQUFDLE9BQU8sRUFBRSxFQUFFLHVCQUF1QixFQUFFLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNiLElBQUksR0FBRyxZQUFZLHdCQUF3QixFQUFFLENBQUM7WUFDNUMsTUFBTSxJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDcEMsQ0FBQztRQUNELE1BQU0sR0FBRyxDQUFDO0lBQ1osQ0FBQztJQUVELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGYXRhbEVycm9yIH0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQge1xuICB0eXBlIEF0dHJpYnV0ZUNoYW5nZSxcbiAgQXR0cmlidXRlVmFsaWRhdGlvbkVycm9yLFxuICB2YWxpZGF0ZUF0dHJpYnV0ZUNoYW5nZXMsXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5cbmludGVyZmFjZSBBdHRyaWJ1dGVDaGFuZ2VPcHRpb25zIHtcbiAgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXM/OiBib29sZWFuO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplQXR0cmlidXRlQ2hhbmdlcyhcbiAgYXR0cnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4sXG4gIG9wdGlvbnM6IEF0dHJpYnV0ZUNoYW5nZU9wdGlvbnMgPSB7fVxuKTogQXR0cmlidXRlQ2hhbmdlW10ge1xuICBpZiAoYXR0cnMgPT09IG51bGwgfHwgdHlwZW9mIGF0dHJzICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KGF0dHJzKSkge1xuICAgIHRocm93IG5ldyBGYXRhbEVycm9yKFxuICAgICAgYHNldEF0dHJpYnV0ZXMgcmVxdWlyZXMgYSBwbGFpbiBvYmplY3QsIGdvdCAke1xuICAgICAgICBhdHRycyA9PT0gbnVsbCA/ICdudWxsJyA6IEFycmF5LmlzQXJyYXkoYXR0cnMpID8gJ2FycmF5JyA6IHR5cGVvZiBhdHRyc1xuICAgICAgfWBcbiAgICApO1xuICB9XG5cbiAgY29uc3QgY2hhbmdlczogQXR0cmlidXRlQ2hhbmdlW10gPSBPYmplY3QuZW50cmllcyhhdHRycykubWFwKFxuICAgIChba2V5LCB2YWx1ZV0pID0+ICh7XG4gICAgICBrZXksXG4gICAgICB2YWx1ZTogdmFsdWUgPT09IHVuZGVmaW5lZCA/IG51bGwgOiB2YWx1ZSxcbiAgICB9KVxuICApO1xuICBpZiAoY2hhbmdlcy5sZW5ndGggPT09IDApIHJldHVybiBjaGFuZ2VzO1xuXG4gIGNvbnN0IGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzID0gb3B0aW9ucy5hbGxvd1Jlc2VydmVkQXR0cmlidXRlcyA9PT0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICB2YWxpZGF0ZUF0dHJpYnV0ZUNoYW5nZXMoY2hhbmdlcywgeyBhbGxvd1Jlc2VydmVkQXR0cmlidXRlcyB9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKGVyciBpbnN0YW5jZW9mIEF0dHJpYnV0ZVZhbGlkYXRpb25FcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEZhdGFsRXJyb3IoZXJyLm1lc3NhZ2UpO1xuICAgIH1cbiAgICB0aHJvdyBlcnI7XG4gIH1cblxuICByZXR1cm4gY2hhbmdlcztcbn1cbiJdfQ==
@@ -15,11 +15,33 @@
15
15
  * `@workflow/core` version that supports it
16
16
  * 3. The `getRunCapabilities()` function will automatically include it
17
17
  *
18
+ * ## Adding a new non-format capability
19
+ *
20
+ * Some capabilities aren't serialization format prefixes — e.g.
21
+ * byte-stream wire framing is an envelope around chunks rather than
22
+ * a content format. For those, add a boolean field to `RunCapabilities`
23
+ * and an entry in `CAPABILITY_VERSION_TABLE` below.
24
+ *
18
25
  * ## History
19
26
  *
20
27
  * - `encr` (AES-256-GCM encryption): added in `4.2.0-beta.64`
21
28
  * Commit: 7618ac36 "Wire AES-GCM encryption into serialization layer (#1251)"
22
29
  * https://github.com/vercel/workflow/commit/7618ac36
30
+ * - `framedByteStreams` (wire-level chunk framing for byte streams): added in `5.0.0-beta.15`
31
+ * - `gzip` (gzip payload compression): added in `5.0.0-beta.18`
32
+ * - `zstd` (zstd payload compression, preferred codec): added in `5.0.0-beta.18`
33
+ * alongside gzip — they co-ship, so any run that can read one can read both.
34
+ * - `encp` (X25519 sealed-box encryption for cross-run writes): added in
35
+ * `5.0.0-beta.37`. Note that producers do **not** gate `encp` on this table:
36
+ * they gate on the presence of `encryptionPublicKey` on the target run,
37
+ * which a run only carries if the deployment that created it could also
38
+ * open `encp`. The entry exists so the capability set stays a complete,
39
+ * auditable description of a run's decoding ability.
40
+ * - Lazy hook resume ("consumer re-ensures `hook_received` from `hookInput`"):
41
+ * deliberately NOT tracked here. Rather than predict a release cutoff, the
42
+ * run's creating deployment stamps an explicit `hookResumeInputVersion`
43
+ * execution-context marker; `resumeHook()` gates the parallel fast path on
44
+ * that marker (mirrored onto the hook's resumeContext by the server).
23
45
  */
24
46
  import { type SerializationFormatType } from './serialization.js';
25
47
  /**
@@ -32,6 +54,15 @@ export interface RunCapabilities {
32
54
  * if encryption is supported, etc.
33
55
  */
34
56
  supportedFormats: ReadonlySet<SerializationFormatType>;
57
+ /**
58
+ * Whether the target run can decode wire-framed byte streams. When true,
59
+ * byte streams (`type: 'bytes'` ReadableStreams passed across boundaries)
60
+ * are wrapped in a length-prefixed frame envelope on the wire so the
61
+ * reader can identify chunk boundaries — which enables auto-reconnect
62
+ * on transient stream errors. When false, byte streams are written as
63
+ * raw bytes (the legacy format) for compatibility with older runs.
64
+ */
65
+ framedByteStreams: boolean;
35
66
  }
36
67
  /**
37
68
  * Look up what serialization capabilities a workflow run supports based on
@@ -39,7 +70,8 @@ export interface RunCapabilities {
39
70
  *
40
71
  * When the version is `undefined`, not a string, or not a valid semver string
41
72
  * (e.g. very old runs that predate the field, or corrupted metadata),
42
- * we assume the most conservative capabilities (baseline formats only).
73
+ * we assume the most conservative capabilities (baseline formats only,
74
+ * non-format capabilities all `false`).
43
75
  */
44
76
  export declare function getRunCapabilities(workflowCoreVersion: string | undefined): RunCapabilities;
45
77
  //# sourceMappingURL=capabilities.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,OAAO,EAEL,KAAK,uBAAuB,EAC7B,MAAM,oBAAoB,CAAC;AAE5B;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;OAIG;IACH,gBAAgB,EAAE,WAAW,CAAC,uBAAuB,CAAC,CAAC;CACxD;AA0BD;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,mBAAmB,EAAE,MAAM,GAAG,SAAS,GACtC,eAAe,CAcjB"}
1
+ {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AAGH,OAAO,EAEL,KAAK,uBAAuB,EAC7B,MAAM,oBAAoB,CAAC;AAE5B;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;OAIG;IACH,gBAAgB,EAAE,WAAW,CAAC,uBAAuB,CAAC,CAAC;IAEvD;;;;;;;OAOG;IACH,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AA8DD;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,mBAAmB,EAAE,MAAM,GAAG,SAAS,GACtC,eAAe,CA4BjB"}
@@ -15,11 +15,33 @@
15
15
  * `@workflow/core` version that supports it
16
16
  * 3. The `getRunCapabilities()` function will automatically include it
17
17
  *
18
+ * ## Adding a new non-format capability
19
+ *
20
+ * Some capabilities aren't serialization format prefixes — e.g.
21
+ * byte-stream wire framing is an envelope around chunks rather than
22
+ * a content format. For those, add a boolean field to `RunCapabilities`
23
+ * and an entry in `CAPABILITY_VERSION_TABLE` below.
24
+ *
18
25
  * ## History
19
26
  *
20
27
  * - `encr` (AES-256-GCM encryption): added in `4.2.0-beta.64`
21
28
  * Commit: 7618ac36 "Wire AES-GCM encryption into serialization layer (#1251)"
22
29
  * https://github.com/vercel/workflow/commit/7618ac36
30
+ * - `framedByteStreams` (wire-level chunk framing for byte streams): added in `5.0.0-beta.15`
31
+ * - `gzip` (gzip payload compression): added in `5.0.0-beta.18`
32
+ * - `zstd` (zstd payload compression, preferred codec): added in `5.0.0-beta.18`
33
+ * alongside gzip — they co-ship, so any run that can read one can read both.
34
+ * - `encp` (X25519 sealed-box encryption for cross-run writes): added in
35
+ * `5.0.0-beta.37`. Note that producers do **not** gate `encp` on this table:
36
+ * they gate on the presence of `encryptionPublicKey` on the target run,
37
+ * which a run only carries if the deployment that created it could also
38
+ * open `encp`. The entry exists so the capability set stays a complete,
39
+ * auditable description of a run's decoding ability.
40
+ * - Lazy hook resume ("consumer re-ensures `hook_received` from `hookInput`"):
41
+ * deliberately NOT tracked here. Rather than predict a release cutoff, the
42
+ * run's creating deployment stamps an explicit `hookResumeInputVersion`
43
+ * execution-context marker; `resumeHook()` gates the parallel fast path on
44
+ * that marker (mirrored onto the hook's resumeContext by the server).
23
45
  */
24
46
  import semver from 'semver';
25
47
  import { SerializationFormat, } from './serialization.js';
@@ -30,10 +52,42 @@ import { SerializationFormat, } from './serialization.js';
30
52
  */
31
53
  const FORMAT_VERSION_TABLE = [
32
54
  { format: SerializationFormat.ENCRYPTED, minVersion: '4.2.0-beta.64' },
55
+ // TODO(release): verify this matches the actual version that ships payload
56
+ // compression. If a "Version Packages (beta)" PR merges before this change,
57
+ // bump to the next beta. A too-low cutoff makes new producers write
58
+ // compressed payloads to consumers that cannot decompress them; too-high
59
+ // merely delays the optimization (safe). gzip and zstd ship together, so
60
+ // they share a min version — a run that can read one can read both.
61
+ { format: SerializationFormat.GZIP, minVersion: '5.0.0-beta.18' },
62
+ { format: SerializationFormat.ZSTD, minVersion: '5.0.0-beta.18' },
63
+ // TODO(release): verify this matches the actual version that ships sealed-box
64
+ // encryption. If a "Version Packages (beta)" PR merges before this change,
65
+ // bump to the next beta. Unlike the entries above, a wrong cutoff here is
66
+ // not a correctness hazard: producers gate `encp` on the target run carrying
67
+ // an `encryptionPublicKey`, not on this table (see History above).
68
+ { format: SerializationFormat.SEALED, minVersion: '5.0.0-beta.37' },
33
69
  // Future entries:
34
70
  // { format: SerializationFormat.CBOR, minVersion: '5.x.y' },
35
71
  // { format: SerializationFormat.ENCRYPTED_V2, minVersion: '5.x.y' },
36
72
  ];
73
+ /**
74
+ * Maps non-format capability flags (booleans on `RunCapabilities`) to the
75
+ * minimum `@workflow/core` version that introduced support for them.
76
+ */
77
+ const CAPABILITY_VERSION_TABLE = [
78
+ // TODO(release): verify this matches the actual version that ships byte-stream
79
+ // framing. If a "Version Packages (beta)" PR merges before this change, bump
80
+ // to the next beta. A too-low cutoff makes new producers write framed bytes to
81
+ // consumers that cannot unframe them (silent corruption); too-high merely
82
+ // delays the optimization (safe).
83
+ { capability: 'framedByteStreams', minVersion: '5.0.0-beta.15' },
84
+ // NOTE: lazy hook resume ("does the consumer re-ensure `hook_received` from
85
+ // the queue message's `hookInput`?") is intentionally NOT gated here. A
86
+ // version-compare against a predicted release cutoff is a guess; instead the
87
+ // run's creating deployment stamps an explicit `hookResumeInputVersion`
88
+ // marker into its execution context, which the server mirrors onto the hook's
89
+ // resumeContext. `resumeHook()` gates the parallel fast path on that marker.
90
+ ];
37
91
  /**
38
92
  * The set of formats supported by all specVersion 2 runs, regardless of
39
93
  * `@workflow/core` version. These are the baseline formats that were present
@@ -48,11 +102,15 @@ const BASELINE_FORMATS = new Set([
48
102
  *
49
103
  * When the version is `undefined`, not a string, or not a valid semver string
50
104
  * (e.g. very old runs that predate the field, or corrupted metadata),
51
- * we assume the most conservative capabilities (baseline formats only).
105
+ * we assume the most conservative capabilities (baseline formats only,
106
+ * non-format capabilities all `false`).
52
107
  */
53
108
  export function getRunCapabilities(workflowCoreVersion) {
54
109
  if (!workflowCoreVersion || !semver.valid(workflowCoreVersion)) {
55
- return { supportedFormats: BASELINE_FORMATS };
110
+ return {
111
+ supportedFormats: BASELINE_FORMATS,
112
+ framedByteStreams: false,
113
+ };
56
114
  }
57
115
  const formats = new Set(BASELINE_FORMATS);
58
116
  for (const { format, minVersion } of FORMAT_VERSION_TABLE) {
@@ -60,6 +118,15 @@ export function getRunCapabilities(workflowCoreVersion) {
60
118
  formats.add(format);
61
119
  }
62
120
  }
63
- return { supportedFormats: formats };
121
+ const result = {
122
+ supportedFormats: formats,
123
+ framedByteStreams: false,
124
+ };
125
+ for (const { capability, minVersion } of CAPABILITY_VERSION_TABLE) {
126
+ if (semver.gte(workflowCoreVersion, minVersion)) {
127
+ result[capability] = true;
128
+ }
129
+ }
130
+ return result;
64
131
  }
65
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FwYWJpbGl0aWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NhcGFiaWxpdGllcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUVILE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQ0wsbUJBQW1CLEdBRXBCLE1BQU0sb0JBQW9CLENBQUM7QUFjNUI7Ozs7R0FJRztBQUNILE1BQU0sb0JBQW9CLEdBR3JCO0lBQ0gsRUFBRSxNQUFNLEVBQUUsbUJBQW1CLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUU7SUFDdEUsa0JBQWtCO0lBQ2xCLDZEQUE2RDtJQUM3RCxxRUFBcUU7Q0FDdEUsQ0FBQztBQUVGOzs7O0dBSUc7QUFDSCxNQUFNLGdCQUFnQixHQUF5QyxJQUFJLEdBQUcsQ0FBQztJQUNyRSxtQkFBbUIsQ0FBQyxVQUFVO0NBQy9CLENBQUMsQ0FBQztBQUVIOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQ2hDLG1CQUF1QztJQUV2QyxJQUFJLENBQUMsbUJBQW1CLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLEVBQUUsQ0FBQztRQUMvRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQztJQUNoRCxDQUFDO0lBRUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLENBQTBCLGdCQUFnQixDQUFDLENBQUM7SUFFbkUsS0FBSyxNQUFNLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxJQUFJLG9CQUFvQixFQUFFLENBQUM7UUFDMUQsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLG1CQUFtQixFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDaEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN0QixDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsQ0FBQztBQUN2QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDYXBhYmlsaXRpZXMgdGFibGUgZm9yIHdvcmtmbG93IHJ1bnMgYmFzZWQgb24gdGhlaXIgYEB3b3JrZmxvdy9jb3JlYCB2ZXJzaW9uLlxuICpcbiAqIFdoZW4gcmVzdW1pbmcgYSBob29rIG9yIHdlYmhvb2ssIHRoZSBwYXlsb2FkIG11c3QgYmUgZW5jb2RlZCBpbiBhIGZvcm1hdFxuICogdGhhdCB0aGUgKnRhcmdldCogd29ya2Zsb3cgcnVuJ3MgZGVwbG95bWVudCBjYW4gZGVjb2RlLiBUaGlzIG1vZHVsZSBwcm92aWRlc1xuICogYSB3YXkgdG8gbG9vayB1cCB3aGF0IHNlcmlhbGl6YXRpb24gZm9ybWF0cyBhIGdpdmVuIGBAd29ya2Zsb3cvY29yZWAgdmVyc2lvblxuICogc3VwcG9ydHMsIHNvIHRoYXQgbmV3ZXIgZGVwbG95bWVudHMgY2FuIGF2b2lkIGVuY29kaW5nIHBheWxvYWRzIGluIGZvcm1hdHNcbiAqIHRoYXQgb2xkZXIgZGVwbG95bWVudHMgZG9uJ3QgdW5kZXJzdGFuZCAoZS5nLiwgdGhlIGBlbmNyYCBlbmNyeXB0aW9uIGZvcm1hdCkuXG4gKlxuICogIyMgQWRkaW5nIGEgbmV3IGZvcm1hdFxuICpcbiAqIFdoZW4gYSBuZXcgc2VyaWFsaXphdGlvbiBmb3JtYXQgaXMgaW50cm9kdWNlZDpcbiAqIDEuIEFkZCB0aGUgZm9ybWF0IGNvbnN0YW50IHRvIGBTZXJpYWxpemF0aW9uRm9ybWF0YCBpbiBgc2VyaWFsaXphdGlvbi50c2BcbiAqIDIuIEFkZCBhbiBlbnRyeSB0byBgRk9STUFUX1ZFUlNJT05fVEFCTEVgIGJlbG93IHdpdGggdGhlIG1pbmltdW1cbiAqICAgIGBAd29ya2Zsb3cvY29yZWAgdmVyc2lvbiB0aGF0IHN1cHBvcnRzIGl0XG4gKiAzLiBUaGUgYGdldFJ1bkNhcGFiaWxpdGllcygpYCBmdW5jdGlvbiB3aWxsIGF1dG9tYXRpY2FsbHkgaW5jbHVkZSBpdFxuICpcbiAqICMjIEhpc3RvcnlcbiAqXG4gKiAtIGBlbmNyYCAoQUVTLTI1Ni1HQ00gZW5jcnlwdGlvbik6IGFkZGVkIGluIGA0LjIuMC1iZXRhLjY0YFxuICogICBDb21taXQ6IDc2MThhYzM2IFwiV2lyZSBBRVMtR0NNIGVuY3J5cHRpb24gaW50byBzZXJpYWxpemF0aW9uIGxheWVyICgjMTI1MSlcIlxuICogICBodHRwczovL2dpdGh1Yi5jb20vdmVyY2VsL3dvcmtmbG93L2NvbW1pdC83NjE4YWMzNlxuICovXG5cbmltcG9ydCBzZW12ZXIgZnJvbSAnc2VtdmVyJztcbmltcG9ydCB7XG4gIFNlcmlhbGl6YXRpb25Gb3JtYXQsXG4gIHR5cGUgU2VyaWFsaXphdGlvbkZvcm1hdFR5cGUsXG59IGZyb20gJy4vc2VyaWFsaXphdGlvbi5qcyc7XG5cbi8qKlxuICogQ2FwYWJpbGl0aWVzIG9mIGEgd29ya2Zsb3cgcnVuIGJhc2VkIG9uIGl0cyBgQHdvcmtmbG93L2NvcmVgIHZlcnNpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVuQ2FwYWJpbGl0aWVzIHtcbiAgLyoqXG4gICAqIFRoZSBzZXQgb2Ygc2VyaWFsaXphdGlvbiBmb3JtYXQgcHJlZml4ZXMgdGhhdCB0aGUgdGFyZ2V0IHJ1biBjYW4gZGVjb2RlLlxuICAgKiBVc2UgYHN1cHBvcnRlZEZvcm1hdHMuaGFzKFNlcmlhbGl6YXRpb25Gb3JtYXQuRU5DUllQVEVEKWAgdG8gY2hlY2tcbiAgICogaWYgZW5jcnlwdGlvbiBpcyBzdXBwb3J0ZWQsIGV0Yy5cbiAgICovXG4gIHN1cHBvcnRlZEZvcm1hdHM6IFJlYWRvbmx5U2V0PFNlcmlhbGl6YXRpb25Gb3JtYXRUeXBlPjtcbn1cblxuLyoqXG4gKiBNYXBzIHNlcmlhbGl6YXRpb24gZm9ybWF0IGlkZW50aWZpZXJzIHRvIHRoZSBtaW5pbXVtIGBAd29ya2Zsb3cvY29yZWBcbiAqIHZlcnNpb24gdGhhdCBpbnRyb2R1Y2VkIHN1cHBvcnQgZm9yIHRoZW0uIEZvcm1hdHMgbm90IGxpc3RlZCBoZXJlIGFyZVxuICogYXNzdW1lZCB0byBiZSBzdXBwb3J0ZWQgYnkgYWxsIHNwZWNWZXJzaW9uIDIgcnVucyAoZS5nLiwgYGRldmxgKS5cbiAqL1xuY29uc3QgRk9STUFUX1ZFUlNJT05fVEFCTEU6IFJlYWRvbmx5QXJyYXk8e1xuICBmb3JtYXQ6IFNlcmlhbGl6YXRpb25Gb3JtYXRUeXBlO1xuICBtaW5WZXJzaW9uOiBzdHJpbmc7XG59PiA9IFtcbiAgeyBmb3JtYXQ6IFNlcmlhbGl6YXRpb25Gb3JtYXQuRU5DUllQVEVELCBtaW5WZXJzaW9uOiAnNC4yLjAtYmV0YS42NCcgfSxcbiAgLy8gRnV0dXJlIGVudHJpZXM6XG4gIC8vIHsgZm9ybWF0OiBTZXJpYWxpemF0aW9uRm9ybWF0LkNCT1IsIG1pblZlcnNpb246ICc1LngueScgfSxcbiAgLy8geyBmb3JtYXQ6IFNlcmlhbGl6YXRpb25Gb3JtYXQuRU5DUllQVEVEX1YyLCBtaW5WZXJzaW9uOiAnNS54LnknIH0sXG5dO1xuXG4vKipcbiAqIFRoZSBzZXQgb2YgZm9ybWF0cyBzdXBwb3J0ZWQgYnkgYWxsIHNwZWNWZXJzaW9uIDIgcnVucywgcmVnYXJkbGVzcyBvZlxuICogYEB3b3JrZmxvdy9jb3JlYCB2ZXJzaW9uLiBUaGVzZSBhcmUgdGhlIGJhc2VsaW5lIGZvcm1hdHMgdGhhdCB3ZXJlIHByZXNlbnRcbiAqIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBzcGVjVmVyc2lvbiAyIHByb3RvY29sLlxuICovXG5jb25zdCBCQVNFTElORV9GT1JNQVRTOiBSZWFkb25seVNldDxTZXJpYWxpemF0aW9uRm9ybWF0VHlwZT4gPSBuZXcgU2V0KFtcbiAgU2VyaWFsaXphdGlvbkZvcm1hdC5ERVZBTFVFX1YxLFxuXSk7XG5cbi8qKlxuICogTG9vayB1cCB3aGF0IHNlcmlhbGl6YXRpb24gY2FwYWJpbGl0aWVzIGEgd29ya2Zsb3cgcnVuIHN1cHBvcnRzIGJhc2VkIG9uXG4gKiBpdHMgYEB3b3JrZmxvdy9jb3JlYCB2ZXJzaW9uIHN0cmluZyAoZnJvbSBgZXhlY3V0aW9uQ29udGV4dC53b3JrZmxvd0NvcmVWZXJzaW9uYCkuXG4gKlxuICogV2hlbiB0aGUgdmVyc2lvbiBpcyBgdW5kZWZpbmVkYCwgbm90IGEgc3RyaW5nLCBvciBub3QgYSB2YWxpZCBzZW12ZXIgc3RyaW5nXG4gKiAoZS5nLiB2ZXJ5IG9sZCBydW5zIHRoYXQgcHJlZGF0ZSB0aGUgZmllbGQsIG9yIGNvcnJ1cHRlZCBtZXRhZGF0YSksXG4gKiB3ZSBhc3N1bWUgdGhlIG1vc3QgY29uc2VydmF0aXZlIGNhcGFiaWxpdGllcyAoYmFzZWxpbmUgZm9ybWF0cyBvbmx5KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJ1bkNhcGFiaWxpdGllcyhcbiAgd29ya2Zsb3dDb3JlVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBSdW5DYXBhYmlsaXRpZXMge1xuICBpZiAoIXdvcmtmbG93Q29yZVZlcnNpb24gfHwgIXNlbXZlci52YWxpZCh3b3JrZmxvd0NvcmVWZXJzaW9uKSkge1xuICAgIHJldHVybiB7IHN1cHBvcnRlZEZvcm1hdHM6IEJBU0VMSU5FX0ZPUk1BVFMgfTtcbiAgfVxuXG4gIGNvbnN0IGZvcm1hdHMgPSBuZXcgU2V0PFNlcmlhbGl6YXRpb25Gb3JtYXRUeXBlPihCQVNFTElORV9GT1JNQVRTKTtcblxuICBmb3IgKGNvbnN0IHsgZm9ybWF0LCBtaW5WZXJzaW9uIH0gb2YgRk9STUFUX1ZFUlNJT05fVEFCTEUpIHtcbiAgICBpZiAoc2VtdmVyLmd0ZSh3b3JrZmxvd0NvcmVWZXJzaW9uLCBtaW5WZXJzaW9uKSkge1xuICAgICAgZm9ybWF0cy5hZGQoZm9ybWF0KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBzdXBwb3J0ZWRGb3JtYXRzOiBmb3JtYXRzIH07XG59XG4iXX0=
132
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FwYWJpbGl0aWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NhcGFiaWxpdGllcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0Q0c7QUFFSCxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUNMLG1CQUFtQixHQUVwQixNQUFNLG9CQUFvQixDQUFDO0FBd0I1Qjs7OztHQUlHO0FBQ0gsTUFBTSxvQkFBb0IsR0FHckI7SUFDSCxFQUFFLE1BQU0sRUFBRSxtQkFBbUIsQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBRTtJQUN0RSwyRUFBMkU7SUFDM0UsNEVBQTRFO0lBQzVFLG9FQUFvRTtJQUNwRSx5RUFBeUU7SUFDekUseUVBQXlFO0lBQ3pFLG9FQUFvRTtJQUNwRSxFQUFFLE1BQU0sRUFBRSxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBRTtJQUNqRSxFQUFFLE1BQU0sRUFBRSxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBRTtJQUNqRSw4RUFBOEU7SUFDOUUsMkVBQTJFO0lBQzNFLDBFQUEwRTtJQUMxRSw2RUFBNkU7SUFDN0UsbUVBQW1FO0lBQ25FLEVBQUUsTUFBTSxFQUFFLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsZUFBZSxFQUFFO0lBQ25FLGtCQUFrQjtJQUNsQiw2REFBNkQ7SUFDN0QscUVBQXFFO0NBQ3RFLENBQUM7QUFFRjs7O0dBR0c7QUFDSCxNQUFNLHdCQUF3QixHQUd6QjtJQUNILCtFQUErRTtJQUMvRSw2RUFBNkU7SUFDN0UsK0VBQStFO0lBQy9FLDBFQUEwRTtJQUMxRSxrQ0FBa0M7SUFDbEMsRUFBRSxVQUFVLEVBQUUsbUJBQW1CLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBRTtJQUNoRSw0RUFBNEU7SUFDNUUsd0VBQXdFO0lBQ3hFLDZFQUE2RTtJQUM3RSx3RUFBd0U7SUFDeEUsOEVBQThFO0lBQzlFLDZFQUE2RTtDQUM5RSxDQUFDO0FBRUY7Ozs7R0FJRztBQUNILE1BQU0sZ0JBQWdCLEdBQXlDLElBQUksR0FBRyxDQUFDO0lBQ3JFLG1CQUFtQixDQUFDLFVBQVU7Q0FDL0IsQ0FBQyxDQUFDO0FBRUg7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQ2hDLG1CQUF1QztJQUV2QyxJQUFJLENBQUMsbUJBQW1CLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLEVBQUUsQ0FBQztRQUMvRCxPQUFPO1lBQ0wsZ0JBQWdCLEVBQUUsZ0JBQWdCO1lBQ2xDLGlCQUFpQixFQUFFLEtBQUs7U0FDekIsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBMEIsZ0JBQWdCLENBQUMsQ0FBQztJQUVuRSxLQUFLLE1BQU0sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLElBQUksb0JBQW9CLEVBQUUsQ0FBQztRQUMxRCxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUNoRCxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RCLENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQW9CO1FBQzlCLGdCQUFnQixFQUFFLE9BQU87UUFDekIsaUJBQWlCLEVBQUUsS0FBSztLQUN6QixDQUFDO0lBRUYsS0FBSyxNQUFNLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxJQUFJLHdCQUF3QixFQUFFLENBQUM7UUFDbEUsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLG1CQUFtQixFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDaEQsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUksQ0FBQztRQUM1QixDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENhcGFiaWxpdGllcyB0YWJsZSBmb3Igd29ya2Zsb3cgcnVucyBiYXNlZCBvbiB0aGVpciBgQHdvcmtmbG93L2NvcmVgIHZlcnNpb24uXG4gKlxuICogV2hlbiByZXN1bWluZyBhIGhvb2sgb3Igd2ViaG9vaywgdGhlIHBheWxvYWQgbXVzdCBiZSBlbmNvZGVkIGluIGEgZm9ybWF0XG4gKiB0aGF0IHRoZSAqdGFyZ2V0KiB3b3JrZmxvdyBydW4ncyBkZXBsb3ltZW50IGNhbiBkZWNvZGUuIFRoaXMgbW9kdWxlIHByb3ZpZGVzXG4gKiBhIHdheSB0byBsb29rIHVwIHdoYXQgc2VyaWFsaXphdGlvbiBmb3JtYXRzIGEgZ2l2ZW4gYEB3b3JrZmxvdy9jb3JlYCB2ZXJzaW9uXG4gKiBzdXBwb3J0cywgc28gdGhhdCBuZXdlciBkZXBsb3ltZW50cyBjYW4gYXZvaWQgZW5jb2RpbmcgcGF5bG9hZHMgaW4gZm9ybWF0c1xuICogdGhhdCBvbGRlciBkZXBsb3ltZW50cyBkb24ndCB1bmRlcnN0YW5kIChlLmcuLCB0aGUgYGVuY3JgIGVuY3J5cHRpb24gZm9ybWF0KS5cbiAqXG4gKiAjIyBBZGRpbmcgYSBuZXcgZm9ybWF0XG4gKlxuICogV2hlbiBhIG5ldyBzZXJpYWxpemF0aW9uIGZvcm1hdCBpcyBpbnRyb2R1Y2VkOlxuICogMS4gQWRkIHRoZSBmb3JtYXQgY29uc3RhbnQgdG8gYFNlcmlhbGl6YXRpb25Gb3JtYXRgIGluIGBzZXJpYWxpemF0aW9uLnRzYFxuICogMi4gQWRkIGFuIGVudHJ5IHRvIGBGT1JNQVRfVkVSU0lPTl9UQUJMRWAgYmVsb3cgd2l0aCB0aGUgbWluaW11bVxuICogICAgYEB3b3JrZmxvdy9jb3JlYCB2ZXJzaW9uIHRoYXQgc3VwcG9ydHMgaXRcbiAqIDMuIFRoZSBgZ2V0UnVuQ2FwYWJpbGl0aWVzKClgIGZ1bmN0aW9uIHdpbGwgYXV0b21hdGljYWxseSBpbmNsdWRlIGl0XG4gKlxuICogIyMgQWRkaW5nIGEgbmV3IG5vbi1mb3JtYXQgY2FwYWJpbGl0eVxuICpcbiAqIFNvbWUgY2FwYWJpbGl0aWVzIGFyZW4ndCBzZXJpYWxpemF0aW9uIGZvcm1hdCBwcmVmaXhlcyDigJQgZS5nLlxuICogYnl0ZS1zdHJlYW0gd2lyZSBmcmFtaW5nIGlzIGFuIGVudmVsb3BlIGFyb3VuZCBjaHVua3MgcmF0aGVyIHRoYW5cbiAqIGEgY29udGVudCBmb3JtYXQuIEZvciB0aG9zZSwgYWRkIGEgYm9vbGVhbiBmaWVsZCB0byBgUnVuQ2FwYWJpbGl0aWVzYFxuICogYW5kIGFuIGVudHJ5IGluIGBDQVBBQklMSVRZX1ZFUlNJT05fVEFCTEVgIGJlbG93LlxuICpcbiAqICMjIEhpc3RvcnlcbiAqXG4gKiAtIGBlbmNyYCAoQUVTLTI1Ni1HQ00gZW5jcnlwdGlvbik6IGFkZGVkIGluIGA0LjIuMC1iZXRhLjY0YFxuICogICBDb21taXQ6IDc2MThhYzM2IFwiV2lyZSBBRVMtR0NNIGVuY3J5cHRpb24gaW50byBzZXJpYWxpemF0aW9uIGxheWVyICgjMTI1MSlcIlxuICogICBodHRwczovL2dpdGh1Yi5jb20vdmVyY2VsL3dvcmtmbG93L2NvbW1pdC83NjE4YWMzNlxuICogLSBgZnJhbWVkQnl0ZVN0cmVhbXNgICh3aXJlLWxldmVsIGNodW5rIGZyYW1pbmcgZm9yIGJ5dGUgc3RyZWFtcyk6IGFkZGVkIGluIGA1LjAuMC1iZXRhLjE1YFxuICogLSBgZ3ppcGAgKGd6aXAgcGF5bG9hZCBjb21wcmVzc2lvbik6IGFkZGVkIGluIGA1LjAuMC1iZXRhLjE4YFxuICogLSBgenN0ZGAgKHpzdGQgcGF5bG9hZCBjb21wcmVzc2lvbiwgcHJlZmVycmVkIGNvZGVjKTogYWRkZWQgaW4gYDUuMC4wLWJldGEuMThgXG4gKiAgIGFsb25nc2lkZSBnemlwIOKAlCB0aGV5IGNvLXNoaXAsIHNvIGFueSBydW4gdGhhdCBjYW4gcmVhZCBvbmUgY2FuIHJlYWQgYm90aC5cbiAqIC0gYGVuY3BgIChYMjU1MTkgc2VhbGVkLWJveCBlbmNyeXB0aW9uIGZvciBjcm9zcy1ydW4gd3JpdGVzKTogYWRkZWQgaW5cbiAqICAgYDUuMC4wLWJldGEuMzdgLiBOb3RlIHRoYXQgcHJvZHVjZXJzIGRvICoqbm90KiogZ2F0ZSBgZW5jcGAgb24gdGhpcyB0YWJsZTpcbiAqICAgdGhleSBnYXRlIG9uIHRoZSBwcmVzZW5jZSBvZiBgZW5jcnlwdGlvblB1YmxpY0tleWAgb24gdGhlIHRhcmdldCBydW4sXG4gKiAgIHdoaWNoIGEgcnVuIG9ubHkgY2FycmllcyBpZiB0aGUgZGVwbG95bWVudCB0aGF0IGNyZWF0ZWQgaXQgY291bGQgYWxzb1xuICogICBvcGVuIGBlbmNwYC4gVGhlIGVudHJ5IGV4aXN0cyBzbyB0aGUgY2FwYWJpbGl0eSBzZXQgc3RheXMgYSBjb21wbGV0ZSxcbiAqICAgYXVkaXRhYmxlIGRlc2NyaXB0aW9uIG9mIGEgcnVuJ3MgZGVjb2RpbmcgYWJpbGl0eS5cbiAqIC0gTGF6eSBob29rIHJlc3VtZSAoXCJjb25zdW1lciByZS1lbnN1cmVzIGBob29rX3JlY2VpdmVkYCBmcm9tIGBob29rSW5wdXRgXCIpOlxuICogICBkZWxpYmVyYXRlbHkgTk9UIHRyYWNrZWQgaGVyZS4gUmF0aGVyIHRoYW4gcHJlZGljdCBhIHJlbGVhc2UgY3V0b2ZmLCB0aGVcbiAqICAgcnVuJ3MgY3JlYXRpbmcgZGVwbG95bWVudCBzdGFtcHMgYW4gZXhwbGljaXQgYGhvb2tSZXN1bWVJbnB1dFZlcnNpb25gXG4gKiAgIGV4ZWN1dGlvbi1jb250ZXh0IG1hcmtlcjsgYHJlc3VtZUhvb2soKWAgZ2F0ZXMgdGhlIHBhcmFsbGVsIGZhc3QgcGF0aCBvblxuICogICB0aGF0IG1hcmtlciAobWlycm9yZWQgb250byB0aGUgaG9vaydzIHJlc3VtZUNvbnRleHQgYnkgdGhlIHNlcnZlcikuXG4gKi9cblxuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuaW1wb3J0IHtcbiAgU2VyaWFsaXphdGlvbkZvcm1hdCxcbiAgdHlwZSBTZXJpYWxpemF0aW9uRm9ybWF0VHlwZSxcbn0gZnJvbSAnLi9zZXJpYWxpemF0aW9uLmpzJztcblxuLyoqXG4gKiBDYXBhYmlsaXRpZXMgb2YgYSB3b3JrZmxvdyBydW4gYmFzZWQgb24gaXRzIGBAd29ya2Zsb3cvY29yZWAgdmVyc2lvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSdW5DYXBhYmlsaXRpZXMge1xuICAvKipcbiAgICogVGhlIHNldCBvZiBzZXJpYWxpemF0aW9uIGZvcm1hdCBwcmVmaXhlcyB0aGF0IHRoZSB0YXJnZXQgcnVuIGNhbiBkZWNvZGUuXG4gICAqIFVzZSBgc3VwcG9ydGVkRm9ybWF0cy5oYXMoU2VyaWFsaXphdGlvbkZvcm1hdC5FTkNSWVBURUQpYCB0byBjaGVja1xuICAgKiBpZiBlbmNyeXB0aW9uIGlzIHN1cHBvcnRlZCwgZXRjLlxuICAgKi9cbiAgc3VwcG9ydGVkRm9ybWF0czogUmVhZG9ubHlTZXQ8U2VyaWFsaXphdGlvbkZvcm1hdFR5cGU+O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSB0YXJnZXQgcnVuIGNhbiBkZWNvZGUgd2lyZS1mcmFtZWQgYnl0ZSBzdHJlYW1zLiBXaGVuIHRydWUsXG4gICAqIGJ5dGUgc3RyZWFtcyAoYHR5cGU6ICdieXRlcydgIFJlYWRhYmxlU3RyZWFtcyBwYXNzZWQgYWNyb3NzIGJvdW5kYXJpZXMpXG4gICAqIGFyZSB3cmFwcGVkIGluIGEgbGVuZ3RoLXByZWZpeGVkIGZyYW1lIGVudmVsb3BlIG9uIHRoZSB3aXJlIHNvIHRoZVxuICAgKiByZWFkZXIgY2FuIGlkZW50aWZ5IGNodW5rIGJvdW5kYXJpZXMg4oCUIHdoaWNoIGVuYWJsZXMgYXV0by1yZWNvbm5lY3RcbiAgICogb24gdHJhbnNpZW50IHN0cmVhbSBlcnJvcnMuIFdoZW4gZmFsc2UsIGJ5dGUgc3RyZWFtcyBhcmUgd3JpdHRlbiBhc1xuICAgKiByYXcgYnl0ZXMgKHRoZSBsZWdhY3kgZm9ybWF0KSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHJ1bnMuXG4gICAqL1xuICBmcmFtZWRCeXRlU3RyZWFtczogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBNYXBzIHNlcmlhbGl6YXRpb24gZm9ybWF0IGlkZW50aWZpZXJzIHRvIHRoZSBtaW5pbXVtIGBAd29ya2Zsb3cvY29yZWBcbiAqIHZlcnNpb24gdGhhdCBpbnRyb2R1Y2VkIHN1cHBvcnQgZm9yIHRoZW0uIEZvcm1hdHMgbm90IGxpc3RlZCBoZXJlIGFyZVxuICogYXNzdW1lZCB0byBiZSBzdXBwb3J0ZWQgYnkgYWxsIHNwZWNWZXJzaW9uIDIgcnVucyAoZS5nLiwgYGRldmxgKS5cbiAqL1xuY29uc3QgRk9STUFUX1ZFUlNJT05fVEFCTEU6IFJlYWRvbmx5QXJyYXk8e1xuICBmb3JtYXQ6IFNlcmlhbGl6YXRpb25Gb3JtYXRUeXBlO1xuICBtaW5WZXJzaW9uOiBzdHJpbmc7XG59PiA9IFtcbiAgeyBmb3JtYXQ6IFNlcmlhbGl6YXRpb25Gb3JtYXQuRU5DUllQVEVELCBtaW5WZXJzaW9uOiAnNC4yLjAtYmV0YS42NCcgfSxcbiAgLy8gVE9ETyhyZWxlYXNlKTogdmVyaWZ5IHRoaXMgbWF0Y2hlcyB0aGUgYWN0dWFsIHZlcnNpb24gdGhhdCBzaGlwcyBwYXlsb2FkXG4gIC8vIGNvbXByZXNzaW9uLiBJZiBhIFwiVmVyc2lvbiBQYWNrYWdlcyAoYmV0YSlcIiBQUiBtZXJnZXMgYmVmb3JlIHRoaXMgY2hhbmdlLFxuICAvLyBidW1wIHRvIHRoZSBuZXh0IGJldGEuIEEgdG9vLWxvdyBjdXRvZmYgbWFrZXMgbmV3IHByb2R1Y2VycyB3cml0ZVxuICAvLyBjb21wcmVzc2VkIHBheWxvYWRzIHRvIGNvbnN1bWVycyB0aGF0IGNhbm5vdCBkZWNvbXByZXNzIHRoZW07IHRvby1oaWdoXG4gIC8vIG1lcmVseSBkZWxheXMgdGhlIG9wdGltaXphdGlvbiAoc2FmZSkuIGd6aXAgYW5kIHpzdGQgc2hpcCB0b2dldGhlciwgc29cbiAgLy8gdGhleSBzaGFyZSBhIG1pbiB2ZXJzaW9uIOKAlCBhIHJ1biB0aGF0IGNhbiByZWFkIG9uZSBjYW4gcmVhZCBib3RoLlxuICB7IGZvcm1hdDogU2VyaWFsaXphdGlvbkZvcm1hdC5HWklQLCBtaW5WZXJzaW9uOiAnNS4wLjAtYmV0YS4xOCcgfSxcbiAgeyBmb3JtYXQ6IFNlcmlhbGl6YXRpb25Gb3JtYXQuWlNURCwgbWluVmVyc2lvbjogJzUuMC4wLWJldGEuMTgnIH0sXG4gIC8vIFRPRE8ocmVsZWFzZSk6IHZlcmlmeSB0aGlzIG1hdGNoZXMgdGhlIGFjdHVhbCB2ZXJzaW9uIHRoYXQgc2hpcHMgc2VhbGVkLWJveFxuICAvLyBlbmNyeXB0aW9uLiBJZiBhIFwiVmVyc2lvbiBQYWNrYWdlcyAoYmV0YSlcIiBQUiBtZXJnZXMgYmVmb3JlIHRoaXMgY2hhbmdlLFxuICAvLyBidW1wIHRvIHRoZSBuZXh0IGJldGEuIFVubGlrZSB0aGUgZW50cmllcyBhYm92ZSwgYSB3cm9uZyBjdXRvZmYgaGVyZSBpc1xuICAvLyBub3QgYSBjb3JyZWN0bmVzcyBoYXphcmQ6IHByb2R1Y2VycyBnYXRlIGBlbmNwYCBvbiB0aGUgdGFyZ2V0IHJ1biBjYXJyeWluZ1xuICAvLyBhbiBgZW5jcnlwdGlvblB1YmxpY0tleWAsIG5vdCBvbiB0aGlzIHRhYmxlIChzZWUgSGlzdG9yeSBhYm92ZSkuXG4gIHsgZm9ybWF0OiBTZXJpYWxpemF0aW9uRm9ybWF0LlNFQUxFRCwgbWluVmVyc2lvbjogJzUuMC4wLWJldGEuMzcnIH0sXG4gIC8vIEZ1dHVyZSBlbnRyaWVzOlxuICAvLyB7IGZvcm1hdDogU2VyaWFsaXphdGlvbkZvcm1hdC5DQk9SLCBtaW5WZXJzaW9uOiAnNS54LnknIH0sXG4gIC8vIHsgZm9ybWF0OiBTZXJpYWxpemF0aW9uRm9ybWF0LkVOQ1JZUFRFRF9WMiwgbWluVmVyc2lvbjogJzUueC55JyB9LFxuXTtcblxuLyoqXG4gKiBNYXBzIG5vbi1mb3JtYXQgY2FwYWJpbGl0eSBmbGFncyAoYm9vbGVhbnMgb24gYFJ1bkNhcGFiaWxpdGllc2ApIHRvIHRoZVxuICogbWluaW11bSBgQHdvcmtmbG93L2NvcmVgIHZlcnNpb24gdGhhdCBpbnRyb2R1Y2VkIHN1cHBvcnQgZm9yIHRoZW0uXG4gKi9cbmNvbnN0IENBUEFCSUxJVFlfVkVSU0lPTl9UQUJMRTogUmVhZG9ubHlBcnJheTx7XG4gIGNhcGFiaWxpdHk6IGtleW9mIE9taXQ8UnVuQ2FwYWJpbGl0aWVzLCAnc3VwcG9ydGVkRm9ybWF0cyc+O1xuICBtaW5WZXJzaW9uOiBzdHJpbmc7XG59PiA9IFtcbiAgLy8gVE9ETyhyZWxlYXNlKTogdmVyaWZ5IHRoaXMgbWF0Y2hlcyB0aGUgYWN0dWFsIHZlcnNpb24gdGhhdCBzaGlwcyBieXRlLXN0cmVhbVxuICAvLyBmcmFtaW5nLiBJZiBhIFwiVmVyc2lvbiBQYWNrYWdlcyAoYmV0YSlcIiBQUiBtZXJnZXMgYmVmb3JlIHRoaXMgY2hhbmdlLCBidW1wXG4gIC8vIHRvIHRoZSBuZXh0IGJldGEuIEEgdG9vLWxvdyBjdXRvZmYgbWFrZXMgbmV3IHByb2R1Y2VycyB3cml0ZSBmcmFtZWQgYnl0ZXMgdG9cbiAgLy8gY29uc3VtZXJzIHRoYXQgY2Fubm90IHVuZnJhbWUgdGhlbSAoc2lsZW50IGNvcnJ1cHRpb24pOyB0b28taGlnaCBtZXJlbHlcbiAgLy8gZGVsYXlzIHRoZSBvcHRpbWl6YXRpb24gKHNhZmUpLlxuICB7IGNhcGFiaWxpdHk6ICdmcmFtZWRCeXRlU3RyZWFtcycsIG1pblZlcnNpb246ICc1LjAuMC1iZXRhLjE1JyB9LFxuICAvLyBOT1RFOiBsYXp5IGhvb2sgcmVzdW1lIChcImRvZXMgdGhlIGNvbnN1bWVyIHJlLWVuc3VyZSBgaG9va19yZWNlaXZlZGAgZnJvbVxuICAvLyB0aGUgcXVldWUgbWVzc2FnZSdzIGBob29rSW5wdXRgP1wiKSBpcyBpbnRlbnRpb25hbGx5IE5PVCBnYXRlZCBoZXJlLiBBXG4gIC8vIHZlcnNpb24tY29tcGFyZSBhZ2FpbnN0IGEgcHJlZGljdGVkIHJlbGVhc2UgY3V0b2ZmIGlzIGEgZ3Vlc3M7IGluc3RlYWQgdGhlXG4gIC8vIHJ1bidzIGNyZWF0aW5nIGRlcGxveW1lbnQgc3RhbXBzIGFuIGV4cGxpY2l0IGBob29rUmVzdW1lSW5wdXRWZXJzaW9uYFxuICAvLyBtYXJrZXIgaW50byBpdHMgZXhlY3V0aW9uIGNvbnRleHQsIHdoaWNoIHRoZSBzZXJ2ZXIgbWlycm9ycyBvbnRvIHRoZSBob29rJ3NcbiAgLy8gcmVzdW1lQ29udGV4dC4gYHJlc3VtZUhvb2soKWAgZ2F0ZXMgdGhlIHBhcmFsbGVsIGZhc3QgcGF0aCBvbiB0aGF0IG1hcmtlci5cbl07XG5cbi8qKlxuICogVGhlIHNldCBvZiBmb3JtYXRzIHN1cHBvcnRlZCBieSBhbGwgc3BlY1ZlcnNpb24gMiBydW5zLCByZWdhcmRsZXNzIG9mXG4gKiBgQHdvcmtmbG93L2NvcmVgIHZlcnNpb24uIFRoZXNlIGFyZSB0aGUgYmFzZWxpbmUgZm9ybWF0cyB0aGF0IHdlcmUgcHJlc2VudFxuICogZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHNwZWNWZXJzaW9uIDIgcHJvdG9jb2wuXG4gKi9cbmNvbnN0IEJBU0VMSU5FX0ZPUk1BVFM6IFJlYWRvbmx5U2V0PFNlcmlhbGl6YXRpb25Gb3JtYXRUeXBlPiA9IG5ldyBTZXQoW1xuICBTZXJpYWxpemF0aW9uRm9ybWF0LkRFVkFMVUVfVjEsXG5dKTtcblxuLyoqXG4gKiBMb29rIHVwIHdoYXQgc2VyaWFsaXphdGlvbiBjYXBhYmlsaXRpZXMgYSB3b3JrZmxvdyBydW4gc3VwcG9ydHMgYmFzZWQgb25cbiAqIGl0cyBgQHdvcmtmbG93L2NvcmVgIHZlcnNpb24gc3RyaW5nIChmcm9tIGBleGVjdXRpb25Db250ZXh0LndvcmtmbG93Q29yZVZlcnNpb25gKS5cbiAqXG4gKiBXaGVuIHRoZSB2ZXJzaW9uIGlzIGB1bmRlZmluZWRgLCBub3QgYSBzdHJpbmcsIG9yIG5vdCBhIHZhbGlkIHNlbXZlciBzdHJpbmdcbiAqIChlLmcuIHZlcnkgb2xkIHJ1bnMgdGhhdCBwcmVkYXRlIHRoZSBmaWVsZCwgb3IgY29ycnVwdGVkIG1ldGFkYXRhKSxcbiAqIHdlIGFzc3VtZSB0aGUgbW9zdCBjb25zZXJ2YXRpdmUgY2FwYWJpbGl0aWVzIChiYXNlbGluZSBmb3JtYXRzIG9ubHksXG4gKiBub24tZm9ybWF0IGNhcGFiaWxpdGllcyBhbGwgYGZhbHNlYCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSdW5DYXBhYmlsaXRpZXMoXG4gIHdvcmtmbG93Q29yZVZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogUnVuQ2FwYWJpbGl0aWVzIHtcbiAgaWYgKCF3b3JrZmxvd0NvcmVWZXJzaW9uIHx8ICFzZW12ZXIudmFsaWQod29ya2Zsb3dDb3JlVmVyc2lvbikpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3VwcG9ydGVkRm9ybWF0czogQkFTRUxJTkVfRk9STUFUUyxcbiAgICAgIGZyYW1lZEJ5dGVTdHJlYW1zOiBmYWxzZSxcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgZm9ybWF0cyA9IG5ldyBTZXQ8U2VyaWFsaXphdGlvbkZvcm1hdFR5cGU+KEJBU0VMSU5FX0ZPUk1BVFMpO1xuXG4gIGZvciAoY29uc3QgeyBmb3JtYXQsIG1pblZlcnNpb24gfSBvZiBGT1JNQVRfVkVSU0lPTl9UQUJMRSkge1xuICAgIGlmIChzZW12ZXIuZ3RlKHdvcmtmbG93Q29yZVZlcnNpb24sIG1pblZlcnNpb24pKSB7XG4gICAgICBmb3JtYXRzLmFkZChmb3JtYXQpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJlc3VsdDogUnVuQ2FwYWJpbGl0aWVzID0ge1xuICAgIHN1cHBvcnRlZEZvcm1hdHM6IGZvcm1hdHMsXG4gICAgZnJhbWVkQnl0ZVN0cmVhbXM6IGZhbHNlLFxuICB9O1xuXG4gIGZvciAoY29uc3QgeyBjYXBhYmlsaXR5LCBtaW5WZXJzaW9uIH0gb2YgQ0FQQUJJTElUWV9WRVJTSU9OX1RBQkxFKSB7XG4gICAgaWYgKHNlbXZlci5ndGUod29ya2Zsb3dDb3JlVmVyc2lvbiwgbWluVmVyc2lvbikpIHtcbiAgICAgIHJlc3VsdFtjYXBhYmlsaXR5XSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiJdfQ==
@@ -0,0 +1,16 @@
1
+ /**
2
+ * V8-only (Node, Bun, Chrome, Deno). Rewrites `err.stack` so the top frame is
3
+ * the caller of `stackStartFn` instead of the framework function that threw.
4
+ * Without this, terminal overlays (Next.js, Turbopack, VS Code) render the
5
+ * code frame at our `throw` site inside `@workflow/core`, which is useless
6
+ * to the user.
7
+ *
8
+ * No-op on engines that don't expose `Error.captureStackTrace` — the stack
9
+ * degrades gracefully to the default behavior.
10
+ *
11
+ * Kept in its own tiny module so callers that can't participate in the
12
+ * `context-errors.ts` ↔ `workflow/get-workflow-metadata.ts` import cycle can
13
+ * still pull in the helper without pulling in the full error classes.
14
+ */
15
+ export declare function redirectStackToCaller(err: Error, stackStartFn: Function): void;
16
+ //# sourceMappingURL=capture-stack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture-stack.d.ts","sourceRoot":"","sources":["../src/capture-stack.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,KAAK,EAEV,YAAY,EAAE,QAAQ,GACrB,IAAI,CAON"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * V8-only (Node, Bun, Chrome, Deno). Rewrites `err.stack` so the top frame is
3
+ * the caller of `stackStartFn` instead of the framework function that threw.
4
+ * Without this, terminal overlays (Next.js, Turbopack, VS Code) render the
5
+ * code frame at our `throw` site inside `@workflow/core`, which is useless
6
+ * to the user.
7
+ *
8
+ * No-op on engines that don't expose `Error.captureStackTrace` — the stack
9
+ * degrades gracefully to the default behavior.
10
+ *
11
+ * Kept in its own tiny module so callers that can't participate in the
12
+ * `context-errors.ts` ↔ `workflow/get-workflow-metadata.ts` import cycle can
13
+ * still pull in the helper without pulling in the full error classes.
14
+ */
15
+ export function redirectStackToCaller(err,
16
+ // biome-ignore lint/complexity/noBannedTypes: signature matches Error.captureStackTrace
17
+ stackStartFn) {
18
+ const capture = Error.captureStackTrace;
19
+ capture?.(err, stackStartFn);
20
+ }
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FwdHVyZS1zdGFjay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jYXB0dXJlLXN0YWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQ25DLEdBQVU7QUFDVix3RkFBd0Y7QUFDeEYsWUFBc0I7SUFFdEIsTUFBTSxPQUFPLEdBQ1gsS0FHRCxDQUFDLGlCQUFpQixDQUFDO0lBQ3BCLE9BQU8sRUFBRSxDQUFDLEdBQUcsRUFBRSxZQUFZLENBQUMsQ0FBQztBQUMvQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBWOC1vbmx5IChOb2RlLCBCdW4sIENocm9tZSwgRGVubykuIFJld3JpdGVzIGBlcnIuc3RhY2tgIHNvIHRoZSB0b3AgZnJhbWUgaXNcbiAqIHRoZSBjYWxsZXIgb2YgYHN0YWNrU3RhcnRGbmAgaW5zdGVhZCBvZiB0aGUgZnJhbWV3b3JrIGZ1bmN0aW9uIHRoYXQgdGhyZXcuXG4gKiBXaXRob3V0IHRoaXMsIHRlcm1pbmFsIG92ZXJsYXlzIChOZXh0LmpzLCBUdXJib3BhY2ssIFZTIENvZGUpIHJlbmRlciB0aGVcbiAqIGNvZGUgZnJhbWUgYXQgb3VyIGB0aHJvd2Agc2l0ZSBpbnNpZGUgYEB3b3JrZmxvdy9jb3JlYCwgd2hpY2ggaXMgdXNlbGVzc1xuICogdG8gdGhlIHVzZXIuXG4gKlxuICogTm8tb3Agb24gZW5naW5lcyB0aGF0IGRvbid0IGV4cG9zZSBgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2VgIOKAlCB0aGUgc3RhY2tcbiAqIGRlZ3JhZGVzIGdyYWNlZnVsbHkgdG8gdGhlIGRlZmF1bHQgYmVoYXZpb3IuXG4gKlxuICogS2VwdCBpbiBpdHMgb3duIHRpbnkgbW9kdWxlIHNvIGNhbGxlcnMgdGhhdCBjYW4ndCBwYXJ0aWNpcGF0ZSBpbiB0aGVcbiAqIGBjb250ZXh0LWVycm9ycy50c2Ag4oaUIGB3b3JrZmxvdy9nZXQtd29ya2Zsb3ctbWV0YWRhdGEudHNgIGltcG9ydCBjeWNsZSBjYW5cbiAqIHN0aWxsIHB1bGwgaW4gdGhlIGhlbHBlciB3aXRob3V0IHB1bGxpbmcgaW4gdGhlIGZ1bGwgZXJyb3IgY2xhc3Nlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZGlyZWN0U3RhY2tUb0NhbGxlcihcbiAgZXJyOiBFcnJvcixcbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29tcGxleGl0eS9ub0Jhbm5lZFR5cGVzOiBzaWduYXR1cmUgbWF0Y2hlcyBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZVxuICBzdGFja1N0YXJ0Rm46IEZ1bmN0aW9uXG4pOiB2b2lkIHtcbiAgY29uc3QgY2FwdHVyZSA9IChcbiAgICBFcnJvciBhcyB1bmtub3duIGFzIHtcbiAgICAgIGNhcHR1cmVTdGFja1RyYWNlPzogKHRhcmdldDogb2JqZWN0LCBmbjogRnVuY3Rpb24pID0+IHZvaWQ7XG4gICAgfVxuICApLmNhcHR1cmVTdGFja1RyYWNlO1xuICBjYXB0dXJlPy4oZXJyLCBzdGFja1N0YXJ0Rm4pO1xufVxuIl19
@@ -18,6 +18,38 @@
18
18
  * when serializing instances (e.g., step return values).
19
19
  */
20
20
  export declare function registerSerializationClass(classId: string, cls: Function): void;
21
+ /**
22
+ * Stable, well-known registry id for the SDK's `Run` class.
23
+ *
24
+ * The SWC plugin auto-registers `Run` under a *path-derived* id (e.g.
25
+ * `class//./node_modules/@workflow/core/dist/runtime/run//Run`), which
26
+ * varies with the app's dependency layout and bundler. Host-side code
27
+ * that needs to construct `Run` instances inside the workflow VM (e.g.
28
+ * the hook event consumer resolving `hook.getConflict()`) cannot know
29
+ * that id statically, so the workflow-mode `create-hook` module also
30
+ * aliases the bundle's `Run` under this stable id at evaluation time.
31
+ *
32
+ * The `workflow` pseudo-path cannot collide with plugin-derived ids,
33
+ * which always use real relative module paths (`./…` / `../…`).
34
+ */
35
+ export declare const RUN_CLASS_ID = "class//workflow//Run";
36
+ /**
37
+ * Register an additional registry id for a class without touching its
38
+ * `classId` property.
39
+ *
40
+ * Unlike {@link registerSerializationClass}, this is safe to call for a
41
+ * class the SWC plugin has already registered: the plugin's inlined IIFE
42
+ * defines `classId` as non-configurable, so a second `defineProperty`
43
+ * would throw. Aliasing only adds a registry entry — the class keeps
44
+ * serializing under its primary (path-derived) id, while lookups succeed
45
+ * under both.
46
+ *
47
+ * Registration is per-global by construction: evaluated inside the
48
+ * workflow VM it registers the VM's compiled class on the VM's registry;
49
+ * evaluated on the host it registers the host class on the host's
50
+ * registry. Each context resolves its own correct variant.
51
+ */
52
+ export declare function aliasSerializationClass(classId: string, cls: Function, global?: Record<string, any>): void;
21
53
  /**
22
54
  * Find a registered class constructor by ID (used during deserialization)
23
55
  *
@@ -1 +1 @@
1
- {"version":3,"file":"class-serialization.d.ts","sourceRoot":"","sources":["../src/class-serialization.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAuBH;;;;;;;;;;;GAWG;AAEH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,QASxE;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAE1B,QAAQ,GAAG,SAAS,CAEtB"}
1
+ {"version":3,"file":"class-serialization.d.ts","sourceRoot":"","sources":["../src/class-serialization.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAuBH;;;;;;;;;;;GAWG;AAEH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,QASxE;AAED;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,YAAY,yBAAyB,CAAC;AAEnD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,EAEf,GAAG,EAAE,QAAQ,EACb,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAc,QAGzC;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAE1B,QAAQ,GAAG,SAAS,CAEtB"}
@@ -44,6 +44,42 @@ export function registerSerializationClass(classId, cls) {
44
44
  configurable: false,
45
45
  });
46
46
  }
47
+ /**
48
+ * Stable, well-known registry id for the SDK's `Run` class.
49
+ *
50
+ * The SWC plugin auto-registers `Run` under a *path-derived* id (e.g.
51
+ * `class//./node_modules/@workflow/core/dist/runtime/run//Run`), which
52
+ * varies with the app's dependency layout and bundler. Host-side code
53
+ * that needs to construct `Run` instances inside the workflow VM (e.g.
54
+ * the hook event consumer resolving `hook.getConflict()`) cannot know
55
+ * that id statically, so the workflow-mode `create-hook` module also
56
+ * aliases the bundle's `Run` under this stable id at evaluation time.
57
+ *
58
+ * The `workflow` pseudo-path cannot collide with plugin-derived ids,
59
+ * which always use real relative module paths (`./…` / `../…`).
60
+ */
61
+ export const RUN_CLASS_ID = 'class//workflow//Run';
62
+ /**
63
+ * Register an additional registry id for a class without touching its
64
+ * `classId` property.
65
+ *
66
+ * Unlike {@link registerSerializationClass}, this is safe to call for a
67
+ * class the SWC plugin has already registered: the plugin's inlined IIFE
68
+ * defines `classId` as non-configurable, so a second `defineProperty`
69
+ * would throw. Aliasing only adds a registry entry — the class keeps
70
+ * serializing under its primary (path-derived) id, while lookups succeed
71
+ * under both.
72
+ *
73
+ * Registration is per-global by construction: evaluated inside the
74
+ * workflow VM it registers the VM's compiled class on the VM's registry;
75
+ * evaluated on the host it registers the host class on the host's
76
+ * registry. Each context resolves its own correct variant.
77
+ */
78
+ export function aliasSerializationClass(classId,
79
+ // biome-ignore lint/complexity/noBannedTypes: We need to use Function to represent class constructors
80
+ cls, global = globalThis) {
81
+ getRegistry(global).set(classId, cls);
82
+ }
47
83
  /**
48
84
  * Find a registered class constructor by ID (used during deserialization)
49
85
  *
@@ -58,4 +94,4 @@ export function getSerializationClass(classId, global
58
94
  ) {
59
95
  return getRegistry(global).get(classId);
60
96
  }
61
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Mtc2VyaWFsaXphdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jbGFzcy1zZXJpYWxpemF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUt2RDs7Ozs7R0FLRztBQUNILFNBQVMsV0FBVyxDQUFDLFNBQThCLFVBQVU7SUFDM0QsTUFBTSxDQUFDLEdBQUcsTUFBYSxDQUFDO0lBQ3hCLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQyx1QkFBdUIsQ0FBOEIsQ0FBQztJQUN2RSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDZCxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNyQixDQUFDLENBQUMsdUJBQXVCLENBQUMsR0FBRyxRQUFRLENBQUM7SUFDeEMsQ0FBQztJQUNELE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7R0FXRztBQUNILHNHQUFzRztBQUN0RyxNQUFNLFVBQVUsMEJBQTBCLENBQUMsT0FBZSxFQUFFLEdBQWE7SUFDdkUsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNoQyw2Q0FBNkM7SUFDN0MsTUFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFO1FBQ3BDLEtBQUssRUFBRSxPQUFPO1FBQ2QsUUFBUSxFQUFFLEtBQUs7UUFDZixVQUFVLEVBQUUsS0FBSztRQUNqQixZQUFZLEVBQUUsS0FBSztLQUNwQixDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQ25DLE9BQWUsRUFDZixNQUEyQjtBQUMzQixzR0FBc0c7O0lBRXRHLE9BQU8sV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUMxQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDbGFzcyBzZXJpYWxpemF0aW9uIHV0aWxpdGllcy5cbiAqXG4gKiBUaGlzIG1vZHVsZSBpcyBzZXBhcmF0ZSBmcm9tIHByaXZhdGUudHMgdG8gYXZvaWQgcHVsbGluZyBpbiBOb2RlLmpzLW9ubHlcbiAqIGRlcGVuZGVuY2llcyAobGlrZSBhc3luY19ob29rcyB2aWEgZ2V0LWNsb3N1cmUtdmFycy50cykgd2hlbiB1c2VkIGluXG4gKiB3b3JrZmxvdyBidW5kbGVzLlxuICovXG5cbmltcG9ydCB7IFdPUktGTE9XX0NMQVNTX1JFR0lTVFJZIH0gZnJvbSAnLi9zeW1ib2xzLmpzJztcblxuLy8gYmlvbWUtaWdub3JlIGxpbnQvY29tcGxleGl0eS9ub0Jhbm5lZFR5cGVzOiBXZSBuZWVkIHRvIHVzZSBGdW5jdGlvbiB0byByZXByZXNlbnQgY2xhc3MgY29uc3RydWN0b3JzXG50eXBlIENsYXNzUmVnaXN0cnkgPSBNYXA8c3RyaW5nLCBGdW5jdGlvbj47XG5cbi8qKlxuICogR2V0IG9yIGNyZWF0ZSB0aGUgY2xhc3MgcmVnaXN0cnkgb24gdGhlIGdpdmVuIGdsb2JhbCBvYmplY3QuXG4gKiBUaGlzIHdvcmtzIGlzb21vcnBoaWNhbGx5IGluIGJvdGggc3RlcCBtb2RlIChtYWluIGNvbnRleHQpIGFuZCB3b3JrZmxvdyBtb2RlIChWTSBjb250ZXh0KS5cbiAqXG4gKiBAcGFyYW0gZ2xvYmFsIC0gVGhlIGdsb2JhbCBvYmplY3QgdG8gdXNlLiBEZWZhdWx0cyB0byBnbG9iYWxUaGlzLCBidXQgY2FuIGJlIGEgVk0ncyBnbG9iYWwuXG4gKi9cbmZ1bmN0aW9uIGdldFJlZ2lzdHJ5KGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PiA9IGdsb2JhbFRoaXMpOiBDbGFzc1JlZ2lzdHJ5IHtcbiAgY29uc3QgZyA9IGdsb2JhbCBhcyBhbnk7XG4gIGxldCByZWdpc3RyeSA9IGdbV09SS0ZMT1dfQ0xBU1NfUkVHSVNUUlldIGFzIENsYXNzUmVnaXN0cnkgfCB1bmRlZmluZWQ7XG4gIGlmICghcmVnaXN0cnkpIHtcbiAgICByZWdpc3RyeSA9IG5ldyBNYXAoKTtcbiAgICBnW1dPUktGTE9XX0NMQVNTX1JFR0lTVFJZXSA9IHJlZ2lzdHJ5O1xuICB9XG4gIHJldHVybiByZWdpc3RyeTtcbn1cblxuLyoqXG4gKiBSZWdpc3RlciBhIGNsYXNzIGNvbnN0cnVjdG9yIGZvciBzZXJpYWxpemF0aW9uLlxuICogVGhpcyBhbGxvd3MgY2xhc3MgY29uc3RydWN0b3JzIHRvIGJlIGRlc2VyaWFsaXplZCBieSBsb29raW5nIHVwIHRoZSBjbGFzc0lkLlxuICpcbiAqIE5vdGU6IFRoZSBTV0MgcGx1Z2luIG5vdyBpbmxpbmVzIGVxdWl2YWxlbnQgcmVnaXN0cmF0aW9uIGxvZ2ljIGFzIGFcbiAqIHNlbGYtY29udGFpbmVkIElJRkUgKHVzaW5nIHRoZSBzYW1lIGdsb2JhbFRoaXMgU3ltYm9sLWtleWVkIHJlZ2lzdHJ5KSxcbiAqIHNvIHRoaXMgZnVuY3Rpb24gaXMgbm8gbG9uZ2VyIGltcG9ydGVkIGJ5IGdlbmVyYXRlZCBjb2RlLiBJdCBpcyByZXRhaW5lZFxuICogZm9yIHByb2dyYW1tYXRpYyB1c2UgYW5kIHRlc3RpbmcuXG4gKlxuICogQWxzbyBzZXRzIHRoZSBgY2xhc3NJZGAgcHJvcGVydHkgb24gdGhlIGNsYXNzIHNvIHRoZSBzZXJpYWxpemVyIGNhbiBmaW5kIGl0XG4gKiB3aGVuIHNlcmlhbGl6aW5nIGluc3RhbmNlcyAoZS5nLiwgc3RlcCByZXR1cm4gdmFsdWVzKS5cbiAqL1xuLy8gYmlvbWUtaWdub3JlIGxpbnQvY29tcGxleGl0eS9ub0Jhbm5lZFR5cGVzOiBXZSBuZWVkIHRvIHVzZSBGdW5jdGlvbiB0byByZXByZXNlbnQgY2xhc3MgY29uc3RydWN0b3JzXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJTZXJpYWxpemF0aW9uQ2xhc3MoY2xhc3NJZDogc3RyaW5nLCBjbHM6IEZ1bmN0aW9uKSB7XG4gIGdldFJlZ2lzdHJ5KCkuc2V0KGNsYXNzSWQsIGNscyk7XG4gIC8vIFNldCBjbGFzc0lkIG9uIHRoZSBjbGFzcyBmb3Igc2VyaWFsaXphdGlvblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY2xzLCAnY2xhc3NJZCcsIHtcbiAgICB2YWx1ZTogY2xhc3NJZCxcbiAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgfSk7XG59XG5cbi8qKlxuICogRmluZCBhIHJlZ2lzdGVyZWQgY2xhc3MgY29uc3RydWN0b3IgYnkgSUQgKHVzZWQgZHVyaW5nIGRlc2VyaWFsaXphdGlvbilcbiAqXG4gKiBAcGFyYW0gY2xhc3NJZCAtIFRoZSBjbGFzcyBJRCB0byBsb29rIHVwXG4gKiBAcGFyYW0gZ2xvYmFsIC0gVGhlIGdsb2JhbCBvYmplY3QgdG8gY2hlY2suIFRoaXMgZW5zdXJlcyB3b3JrZmxvdyBjb2RlIHJ1bm5pbmdcbiAqICAgICAgICAgICAgICAgICBpbiBhIFZNIG9ubHkgYWNjZXNzZXMgY2xhc3NlcyByZWdpc3RlcmVkIG9uIHRoZSBWTSdzIGdsb2JhbCxcbiAqICAgICAgICAgICAgICAgICBtYXRjaGluZyBwcm9kdWN0aW9uIHNlcnZlcmxlc3MgYmVoYXZpb3Igd2hlcmUgd29ya2Zsb3cgY29kZVxuICogICAgICAgICAgICAgICAgIHJ1bnMgaW4gaXNvbGF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2VyaWFsaXphdGlvbkNsYXNzKFxuICBjbGFzc0lkOiBzdHJpbmcsXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PlxuICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb21wbGV4aXR5L25vQmFubmVkVHlwZXM6IFdlIG5lZWQgdG8gdXNlIEZ1bmN0aW9uIHRvIHJlcHJlc2VudCBjbGFzcyBjb25zdHJ1Y3RvcnNcbik6IEZ1bmN0aW9uIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGdldFJlZ2lzdHJ5KGdsb2JhbCkuZ2V0KGNsYXNzSWQpO1xufVxuIl19
97
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Mtc2VyaWFsaXphdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jbGFzcy1zZXJpYWxpemF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUt2RDs7Ozs7R0FLRztBQUNILFNBQVMsV0FBVyxDQUFDLFNBQThCLFVBQVU7SUFDM0QsTUFBTSxDQUFDLEdBQUcsTUFBYSxDQUFDO0lBQ3hCLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQyx1QkFBdUIsQ0FBOEIsQ0FBQztJQUN2RSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDZCxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNyQixDQUFDLENBQUMsdUJBQXVCLENBQUMsR0FBRyxRQUFRLENBQUM7SUFDeEMsQ0FBQztJQUNELE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7R0FXRztBQUNILHNHQUFzRztBQUN0RyxNQUFNLFVBQVUsMEJBQTBCLENBQUMsT0FBZSxFQUFFLEdBQWE7SUFDdkUsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNoQyw2Q0FBNkM7SUFDN0MsTUFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFO1FBQ3BDLEtBQUssRUFBRSxPQUFPO1FBQ2QsUUFBUSxFQUFFLEtBQUs7UUFDZixVQUFVLEVBQUUsS0FBSztRQUNqQixZQUFZLEVBQUUsS0FBSztLQUNwQixDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxzQkFBc0IsQ0FBQztBQUVuRDs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxNQUFNLFVBQVUsdUJBQXVCLENBQ3JDLE9BQWU7QUFDZixzR0FBc0c7QUFDdEcsR0FBYSxFQUNiLFNBQThCLFVBQVU7SUFFeEMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDeEMsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUNuQyxPQUFlLEVBQ2YsTUFBMkI7QUFDM0Isc0dBQXNHOztJQUV0RyxPQUFPLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDMUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ2xhc3Mgc2VyaWFsaXphdGlvbiB1dGlsaXRpZXMuXG4gKlxuICogVGhpcyBtb2R1bGUgaXMgc2VwYXJhdGUgZnJvbSBwcml2YXRlLnRzIHRvIGF2b2lkIHB1bGxpbmcgaW4gTm9kZS5qcy1vbmx5XG4gKiBkZXBlbmRlbmNpZXMgKGxpa2UgYXN5bmNfaG9va3MgdmlhIGdldC1jbG9zdXJlLXZhcnMudHMpIHdoZW4gdXNlZCBpblxuICogd29ya2Zsb3cgYnVuZGxlcy5cbiAqL1xuXG5pbXBvcnQgeyBXT1JLRkxPV19DTEFTU19SRUdJU1RSWSB9IGZyb20gJy4vc3ltYm9scy5qcyc7XG5cbi8vIGJpb21lLWlnbm9yZSBsaW50L2NvbXBsZXhpdHkvbm9CYW5uZWRUeXBlczogV2UgbmVlZCB0byB1c2UgRnVuY3Rpb24gdG8gcmVwcmVzZW50IGNsYXNzIGNvbnN0cnVjdG9yc1xudHlwZSBDbGFzc1JlZ2lzdHJ5ID0gTWFwPHN0cmluZywgRnVuY3Rpb24+O1xuXG4vKipcbiAqIEdldCBvciBjcmVhdGUgdGhlIGNsYXNzIHJlZ2lzdHJ5IG9uIHRoZSBnaXZlbiBnbG9iYWwgb2JqZWN0LlxuICogVGhpcyB3b3JrcyBpc29tb3JwaGljYWxseSBpbiBib3RoIHN0ZXAgbW9kZSAobWFpbiBjb250ZXh0KSBhbmQgd29ya2Zsb3cgbW9kZSAoVk0gY29udGV4dCkuXG4gKlxuICogQHBhcmFtIGdsb2JhbCAtIFRoZSBnbG9iYWwgb2JqZWN0IHRvIHVzZS4gRGVmYXVsdHMgdG8gZ2xvYmFsVGhpcywgYnV0IGNhbiBiZSBhIFZNJ3MgZ2xvYmFsLlxuICovXG5mdW5jdGlvbiBnZXRSZWdpc3RyeShnbG9iYWw6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBnbG9iYWxUaGlzKTogQ2xhc3NSZWdpc3RyeSB7XG4gIGNvbnN0IGcgPSBnbG9iYWwgYXMgYW55O1xuICBsZXQgcmVnaXN0cnkgPSBnW1dPUktGTE9XX0NMQVNTX1JFR0lTVFJZXSBhcyBDbGFzc1JlZ2lzdHJ5IHwgdW5kZWZpbmVkO1xuICBpZiAoIXJlZ2lzdHJ5KSB7XG4gICAgcmVnaXN0cnkgPSBuZXcgTWFwKCk7XG4gICAgZ1tXT1JLRkxPV19DTEFTU19SRUdJU1RSWV0gPSByZWdpc3RyeTtcbiAgfVxuICByZXR1cm4gcmVnaXN0cnk7XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgYSBjbGFzcyBjb25zdHJ1Y3RvciBmb3Igc2VyaWFsaXphdGlvbi5cbiAqIFRoaXMgYWxsb3dzIGNsYXNzIGNvbnN0cnVjdG9ycyB0byBiZSBkZXNlcmlhbGl6ZWQgYnkgbG9va2luZyB1cCB0aGUgY2xhc3NJZC5cbiAqXG4gKiBOb3RlOiBUaGUgU1dDIHBsdWdpbiBub3cgaW5saW5lcyBlcXVpdmFsZW50IHJlZ2lzdHJhdGlvbiBsb2dpYyBhcyBhXG4gKiBzZWxmLWNvbnRhaW5lZCBJSUZFICh1c2luZyB0aGUgc2FtZSBnbG9iYWxUaGlzIFN5bWJvbC1rZXllZCByZWdpc3RyeSksXG4gKiBzbyB0aGlzIGZ1bmN0aW9uIGlzIG5vIGxvbmdlciBpbXBvcnRlZCBieSBnZW5lcmF0ZWQgY29kZS4gSXQgaXMgcmV0YWluZWRcbiAqIGZvciBwcm9ncmFtbWF0aWMgdXNlIGFuZCB0ZXN0aW5nLlxuICpcbiAqIEFsc28gc2V0cyB0aGUgYGNsYXNzSWRgIHByb3BlcnR5IG9uIHRoZSBjbGFzcyBzbyB0aGUgc2VyaWFsaXplciBjYW4gZmluZCBpdFxuICogd2hlbiBzZXJpYWxpemluZyBpbnN0YW5jZXMgKGUuZy4sIHN0ZXAgcmV0dXJuIHZhbHVlcykuXG4gKi9cbi8vIGJpb21lLWlnbm9yZSBsaW50L2NvbXBsZXhpdHkvbm9CYW5uZWRUeXBlczogV2UgbmVlZCB0byB1c2UgRnVuY3Rpb24gdG8gcmVwcmVzZW50IGNsYXNzIGNvbnN0cnVjdG9yc1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyU2VyaWFsaXphdGlvbkNsYXNzKGNsYXNzSWQ6IHN0cmluZywgY2xzOiBGdW5jdGlvbikge1xuICBnZXRSZWdpc3RyeSgpLnNldChjbGFzc0lkLCBjbHMpO1xuICAvLyBTZXQgY2xhc3NJZCBvbiB0aGUgY2xhc3MgZm9yIHNlcmlhbGl6YXRpb25cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNscywgJ2NsYXNzSWQnLCB7XG4gICAgdmFsdWU6IGNsYXNzSWQsXG4gICAgd3JpdGFibGU6IGZhbHNlLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gIH0pO1xufVxuXG4vKipcbiAqIFN0YWJsZSwgd2VsbC1rbm93biByZWdpc3RyeSBpZCBmb3IgdGhlIFNESydzIGBSdW5gIGNsYXNzLlxuICpcbiAqIFRoZSBTV0MgcGx1Z2luIGF1dG8tcmVnaXN0ZXJzIGBSdW5gIHVuZGVyIGEgKnBhdGgtZGVyaXZlZCogaWQgKGUuZy5cbiAqIGBjbGFzcy8vLi9ub2RlX21vZHVsZXMvQHdvcmtmbG93L2NvcmUvZGlzdC9ydW50aW1lL3J1bi8vUnVuYCksIHdoaWNoXG4gKiB2YXJpZXMgd2l0aCB0aGUgYXBwJ3MgZGVwZW5kZW5jeSBsYXlvdXQgYW5kIGJ1bmRsZXIuIEhvc3Qtc2lkZSBjb2RlXG4gKiB0aGF0IG5lZWRzIHRvIGNvbnN0cnVjdCBgUnVuYCBpbnN0YW5jZXMgaW5zaWRlIHRoZSB3b3JrZmxvdyBWTSAoZS5nLlxuICogdGhlIGhvb2sgZXZlbnQgY29uc3VtZXIgcmVzb2x2aW5nIGBob29rLmdldENvbmZsaWN0KClgKSBjYW5ub3Qga25vd1xuICogdGhhdCBpZCBzdGF0aWNhbGx5LCBzbyB0aGUgd29ya2Zsb3ctbW9kZSBgY3JlYXRlLWhvb2tgIG1vZHVsZSBhbHNvXG4gKiBhbGlhc2VzIHRoZSBidW5kbGUncyBgUnVuYCB1bmRlciB0aGlzIHN0YWJsZSBpZCBhdCBldmFsdWF0aW9uIHRpbWUuXG4gKlxuICogVGhlIGB3b3JrZmxvd2AgcHNldWRvLXBhdGggY2Fubm90IGNvbGxpZGUgd2l0aCBwbHVnaW4tZGVyaXZlZCBpZHMsXG4gKiB3aGljaCBhbHdheXMgdXNlIHJlYWwgcmVsYXRpdmUgbW9kdWxlIHBhdGhzIChgLi/igKZgIC8gYC4uL+KApmApLlxuICovXG5leHBvcnQgY29uc3QgUlVOX0NMQVNTX0lEID0gJ2NsYXNzLy93b3JrZmxvdy8vUnVuJztcblxuLyoqXG4gKiBSZWdpc3RlciBhbiBhZGRpdGlvbmFsIHJlZ2lzdHJ5IGlkIGZvciBhIGNsYXNzIHdpdGhvdXQgdG91Y2hpbmcgaXRzXG4gKiBgY2xhc3NJZGAgcHJvcGVydHkuXG4gKlxuICogVW5saWtlIHtAbGluayByZWdpc3RlclNlcmlhbGl6YXRpb25DbGFzc30sIHRoaXMgaXMgc2FmZSB0byBjYWxsIGZvciBhXG4gKiBjbGFzcyB0aGUgU1dDIHBsdWdpbiBoYXMgYWxyZWFkeSByZWdpc3RlcmVkOiB0aGUgcGx1Z2luJ3MgaW5saW5lZCBJSUZFXG4gKiBkZWZpbmVzIGBjbGFzc0lkYCBhcyBub24tY29uZmlndXJhYmxlLCBzbyBhIHNlY29uZCBgZGVmaW5lUHJvcGVydHlgXG4gKiB3b3VsZCB0aHJvdy4gQWxpYXNpbmcgb25seSBhZGRzIGEgcmVnaXN0cnkgZW50cnkg4oCUIHRoZSBjbGFzcyBrZWVwc1xuICogc2VyaWFsaXppbmcgdW5kZXIgaXRzIHByaW1hcnkgKHBhdGgtZGVyaXZlZCkgaWQsIHdoaWxlIGxvb2t1cHMgc3VjY2VlZFxuICogdW5kZXIgYm90aC5cbiAqXG4gKiBSZWdpc3RyYXRpb24gaXMgcGVyLWdsb2JhbCBieSBjb25zdHJ1Y3Rpb246IGV2YWx1YXRlZCBpbnNpZGUgdGhlXG4gKiB3b3JrZmxvdyBWTSBpdCByZWdpc3RlcnMgdGhlIFZNJ3MgY29tcGlsZWQgY2xhc3Mgb24gdGhlIFZNJ3MgcmVnaXN0cnk7XG4gKiBldmFsdWF0ZWQgb24gdGhlIGhvc3QgaXQgcmVnaXN0ZXJzIHRoZSBob3N0IGNsYXNzIG9uIHRoZSBob3N0J3NcbiAqIHJlZ2lzdHJ5LiBFYWNoIGNvbnRleHQgcmVzb2x2ZXMgaXRzIG93biBjb3JyZWN0IHZhcmlhbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhbGlhc1NlcmlhbGl6YXRpb25DbGFzcyhcbiAgY2xhc3NJZDogc3RyaW5nLFxuICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb21wbGV4aXR5L25vQmFubmVkVHlwZXM6IFdlIG5lZWQgdG8gdXNlIEZ1bmN0aW9uIHRvIHJlcHJlc2VudCBjbGFzcyBjb25zdHJ1Y3RvcnNcbiAgY2xzOiBGdW5jdGlvbixcbiAgZ2xvYmFsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gZ2xvYmFsVGhpc1xuKSB7XG4gIGdldFJlZ2lzdHJ5KGdsb2JhbCkuc2V0KGNsYXNzSWQsIGNscyk7XG59XG5cbi8qKlxuICogRmluZCBhIHJlZ2lzdGVyZWQgY2xhc3MgY29uc3RydWN0b3IgYnkgSUQgKHVzZWQgZHVyaW5nIGRlc2VyaWFsaXphdGlvbilcbiAqXG4gKiBAcGFyYW0gY2xhc3NJZCAtIFRoZSBjbGFzcyBJRCB0byBsb29rIHVwXG4gKiBAcGFyYW0gZ2xvYmFsIC0gVGhlIGdsb2JhbCBvYmplY3QgdG8gY2hlY2suIFRoaXMgZW5zdXJlcyB3b3JrZmxvdyBjb2RlIHJ1bm5pbmdcbiAqICAgICAgICAgICAgICAgICBpbiBhIFZNIG9ubHkgYWNjZXNzZXMgY2xhc3NlcyByZWdpc3RlcmVkIG9uIHRoZSBWTSdzIGdsb2JhbCxcbiAqICAgICAgICAgICAgICAgICBtYXRjaGluZyBwcm9kdWN0aW9uIHNlcnZlcmxlc3MgYmVoYXZpb3Igd2hlcmUgd29ya2Zsb3cgY29kZVxuICogICAgICAgICAgICAgICAgIHJ1bnMgaW4gaXNvbGF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2VyaWFsaXphdGlvbkNsYXNzKFxuICBjbGFzc0lkOiBzdHJpbmcsXG4gIGdsb2JhbDogUmVjb3JkPHN0cmluZywgYW55PlxuICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb21wbGV4aXR5L25vQmFubmVkVHlwZXM6IFdlIG5lZWQgdG8gdXNlIEZ1bmN0aW9uIHRvIHJlcHJlc2VudCBjbGFzcyBjb25zdHJ1Y3RvcnNcbik6IEZ1bmN0aW9uIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGdldFJlZ2lzdHJ5KGdsb2JhbCkuZ2V0KGNsYXNzSWQpO1xufVxuIl19
@@ -1,12 +1,35 @@
1
- import { type RunErrorCode } from '@workflow/errors';
1
+ import { type RunErrorCode, WorkflowWorldError } from '@workflow/errors';
2
2
  /**
3
3
  * Classify an error that caused a workflow run to fail.
4
4
  *
5
5
  * After the structural separation of infrastructure vs user code error
6
6
  * handling, the only errors that reach the `run_failed` try/catch are:
7
7
  * - User code errors (throws from workflow functions, propagated step failures)
8
- * - WorkflowRuntimeError and subclasses (corrupted event log, missing
9
- * timestamps, workflow/step not registered, etc.)
8
+ * - WorkflowRuntimeError and subclasses (missing timestamps, workflow/step
9
+ * not registered, corrupted event log, etc.)
10
+ *
11
+ * Uses each subclass's `.is()` static (a name-based duck check) instead of
12
+ * a single `instanceof` check because workflows execute in a separate
13
+ * `vm` realm: the VM-context `WorkflowRuntimeError` and the host-context
14
+ * one are distinct classes, so `instanceof` returns `false` for any error
15
+ * thrown inside the workflow VM and we'd misclassify genuine runtime
16
+ * errors as user errors.
17
+ */
18
+ export declare function isWorldContractError(err: unknown): err is WorkflowWorldError;
19
+ /**
20
+ * True when an error from a world (workflow-server) call is a transient
21
+ * infrastructure failure that should be retried by redelivering the queue
22
+ * message, rather than failing the run. A fresh invocation will likely
23
+ * succeed once the backend (or the firewall in front of it) recovers.
24
+ *
25
+ * - `ThrottleError` (429): rate limited / load shed
26
+ * - `WorkflowWorldError` with `status >= 500`: server-side error
27
+ * - `WorkflowWorldError` with a retryable transport `code` (`TRANSPORT` /
28
+ * `TIMEOUT`): the request never produced a usable response
29
+ *
30
+ * Uses `.is()` name-based duck checks (not `instanceof`) for the same
31
+ * cross-`vm`-realm reason described on `classifyRunError`.
10
32
  */
33
+ export declare function isRetryableWorldError(err: unknown): boolean;
11
34
  export declare function classifyRunError(err: unknown): RunErrorCode;
12
35
  //# sourceMappingURL=classify-error.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"classify-error.d.ts","sourceRoot":"","sources":["../src/classify-error.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,YAAY,EAGlB,MAAM,kBAAkB,CAAC;AAE1B;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,YAAY,CAK3D"}
1
+ {"version":3,"file":"classify-error.d.ts","sourceRoot":"","sources":["../src/classify-error.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,YAAY,EAOjB,kBAAkB,EACnB,MAAM,kBAAkB,CAAC;AAsC1B;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,kBAAkB,CAe5E;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAW3D;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,YAAY,CAkC3D"}
@@ -1,17 +1,120 @@
1
- import { RUN_ERROR_CODES, WorkflowRuntimeError, } from '@workflow/errors';
1
+ import { CorruptedEventLogError, MaxEventsExceededError, ReplayDivergenceError, RUN_ERROR_CODES, RuntimeDecryptionError, StepNotRegisteredError, ThrottleError, WorkflowDeploymentMismatchError, WorkflowNotRegisteredError, WorkflowRuntimeError, WorkflowWorldError, } from '@workflow/errors';
2
+ const WORLD_CONTRACT_ERROR_CODES = new Set([
3
+ 'PARSE_ERROR',
4
+ 'SCHEMA_VALIDATION',
5
+ RUN_ERROR_CODES.WORLD_CONTRACT_ERROR,
6
+ ]);
7
+ /**
8
+ * `WorkflowWorldError.code` values that mark a transient transport failure
9
+ * (set by world-vercel's HTTP client): `TRANSPORT` covers an exhausted
10
+ * RetryAgent (`UND_ERR_REQ_RETRY` — e.g. the firewall in front of
11
+ * workflow-server shedding load with 429/503), a dropped socket, or a
12
+ * connect/DNS failure; `TIMEOUT` covers a request that exceeded the client
13
+ * timeout. Both are infrastructure failures a fresh invocation can recover
14
+ * from. Kept distinct from `WORLD_CONTRACT_ERROR_CODES` so a transport blip is
15
+ * never misclassified as the server returning a malformed response.
16
+ */
17
+ const RETRYABLE_WORLD_ERROR_CODES = new Set(['TRANSPORT', 'TIMEOUT']);
18
+ /**
19
+ * Set of error names that should classify as generic `RUNTIME_ERROR`. Each
20
+ * `*.is()` static does a name-based duck check, so subclassing alone is
21
+ * not enough — we have to enumerate every concrete subclass we want to
22
+ * recognize. Keep in sync with the `WorkflowRuntimeError` class hierarchy
23
+ * in `@workflow/errors`.
24
+ */
25
+ const RUNTIME_ERROR_CHECKS = [
26
+ WorkflowRuntimeError.is,
27
+ StepNotRegisteredError.is,
28
+ WorkflowNotRegisteredError.is,
29
+ // SDK-level encryption failures (most notably AES-GCM auth-tag
30
+ // mismatches surfacing as a native `OperationError` from
31
+ // `AESCipherJob.onDone`) are wrapped in `RuntimeDecryptionError` at
32
+ // the encryption module boundary.
33
+ RuntimeDecryptionError.is,
34
+ ];
2
35
  /**
3
36
  * Classify an error that caused a workflow run to fail.
4
37
  *
5
38
  * After the structural separation of infrastructure vs user code error
6
39
  * handling, the only errors that reach the `run_failed` try/catch are:
7
40
  * - User code errors (throws from workflow functions, propagated step failures)
8
- * - WorkflowRuntimeError and subclasses (corrupted event log, missing
9
- * timestamps, workflow/step not registered, etc.)
41
+ * - WorkflowRuntimeError and subclasses (missing timestamps, workflow/step
42
+ * not registered, corrupted event log, etc.)
43
+ *
44
+ * Uses each subclass's `.is()` static (a name-based duck check) instead of
45
+ * a single `instanceof` check because workflows execute in a separate
46
+ * `vm` realm: the VM-context `WorkflowRuntimeError` and the host-context
47
+ * one are distinct classes, so `instanceof` returns `false` for any error
48
+ * thrown inside the workflow VM and we'd misclassify genuine runtime
49
+ * errors as user errors.
50
+ */
51
+ export function isWorldContractError(err) {
52
+ if (!WorkflowWorldError.is(err) || err.status !== undefined) {
53
+ return false;
54
+ }
55
+ const cause = 'cause' in err ? err.cause : undefined;
56
+ return ((err.code !== undefined && WORLD_CONTRACT_ERROR_CODES.has(err.code)) ||
57
+ err.message.startsWith('Failed to parse response body for ') ||
58
+ err.message.startsWith('Schema validation failed for ') ||
59
+ (typeof cause === 'object' &&
60
+ cause !== null &&
61
+ 'name' in cause &&
62
+ cause.name === 'ZodError'));
63
+ }
64
+ /**
65
+ * True when an error from a world (workflow-server) call is a transient
66
+ * infrastructure failure that should be retried by redelivering the queue
67
+ * message, rather than failing the run. A fresh invocation will likely
68
+ * succeed once the backend (or the firewall in front of it) recovers.
69
+ *
70
+ * - `ThrottleError` (429): rate limited / load shed
71
+ * - `WorkflowWorldError` with `status >= 500`: server-side error
72
+ * - `WorkflowWorldError` with a retryable transport `code` (`TRANSPORT` /
73
+ * `TIMEOUT`): the request never produced a usable response
74
+ *
75
+ * Uses `.is()` name-based duck checks (not `instanceof`) for the same
76
+ * cross-`vm`-realm reason described on `classifyRunError`.
10
77
  */
78
+ export function isRetryableWorldError(err) {
79
+ if (ThrottleError.is(err)) {
80
+ return true;
81
+ }
82
+ if (!WorkflowWorldError.is(err)) {
83
+ return false;
84
+ }
85
+ if (err.status !== undefined && err.status >= 500) {
86
+ return true;
87
+ }
88
+ return err.code !== undefined && RETRYABLE_WORLD_ERROR_CODES.has(err.code);
89
+ }
11
90
  export function classifyRunError(err) {
12
- if (err instanceof WorkflowRuntimeError) {
13
- return RUN_ERROR_CODES.RUNTIME_ERROR;
91
+ if (ReplayDivergenceError.is(err)) {
92
+ return RUN_ERROR_CODES.REPLAY_DIVERGENCE;
93
+ }
94
+ if (CorruptedEventLogError.is(err)) {
95
+ return RUN_ERROR_CODES.CORRUPTED_EVENT_LOG;
96
+ }
97
+ if (MaxEventsExceededError.is(err)) {
98
+ return RUN_ERROR_CODES.MAX_EVENTS_EXCEEDED;
99
+ }
100
+ if (WorkflowDeploymentMismatchError.is(err)) {
101
+ return RUN_ERROR_CODES.DEPLOYMENT_MISMATCH;
102
+ }
103
+ // World-layer faults — both a malformed response (contract violation) and a
104
+ // transient infrastructure failure (throttle / 5xx / transport / timeout,
105
+ // e.g. a firewall challenge) — are the backend's fault, not the user's.
106
+ // Bucket them under WORLD_CONTRACT_ERROR rather than USER_ERROR so dashboards
107
+ // attribute an outage correctly. Note the retryable variants are normally
108
+ // redelivered via the queue (see `isRetryableWorldError`) and only reach this
109
+ // terminal classification if the run ultimately gives up.
110
+ if (isWorldContractError(err) || isRetryableWorldError(err)) {
111
+ return RUN_ERROR_CODES.WORLD_CONTRACT_ERROR;
112
+ }
113
+ for (const isMatch of RUNTIME_ERROR_CHECKS) {
114
+ if (isMatch(err)) {
115
+ return RUN_ERROR_CODES.RUNTIME_ERROR;
116
+ }
14
117
  }
15
118
  return RUN_ERROR_CODES.USER_ERROR;
16
119
  }
17
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3NpZnktZXJyb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY2xhc3NpZnktZXJyb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLGVBQWUsRUFDZixvQkFBb0IsR0FDckIsTUFBTSxrQkFBa0IsQ0FBQztBQUUxQjs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxHQUFZO0lBQzNDLElBQUksR0FBRyxZQUFZLG9CQUFvQixFQUFFLENBQUM7UUFDeEMsT0FBTyxlQUFlLENBQUMsYUFBYSxDQUFDO0lBQ3ZDLENBQUM7SUFDRCxPQUFPLGVBQWUsQ0FBQyxVQUFVLENBQUM7QUFDcEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIHR5cGUgUnVuRXJyb3JDb2RlLFxuICBSVU5fRVJST1JfQ09ERVMsXG4gIFdvcmtmbG93UnVudGltZUVycm9yLFxufSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcblxuLyoqXG4gKiBDbGFzc2lmeSBhbiBlcnJvciB0aGF0IGNhdXNlZCBhIHdvcmtmbG93IHJ1biB0byBmYWlsLlxuICpcbiAqIEFmdGVyIHRoZSBzdHJ1Y3R1cmFsIHNlcGFyYXRpb24gb2YgaW5mcmFzdHJ1Y3R1cmUgdnMgdXNlciBjb2RlIGVycm9yXG4gKiBoYW5kbGluZywgdGhlIG9ubHkgZXJyb3JzIHRoYXQgcmVhY2ggdGhlIGBydW5fZmFpbGVkYCB0cnkvY2F0Y2ggYXJlOlxuICogLSBVc2VyIGNvZGUgZXJyb3JzICh0aHJvd3MgZnJvbSB3b3JrZmxvdyBmdW5jdGlvbnMsIHByb3BhZ2F0ZWQgc3RlcCBmYWlsdXJlcylcbiAqIC0gV29ya2Zsb3dSdW50aW1lRXJyb3IgYW5kIHN1YmNsYXNzZXMgKGNvcnJ1cHRlZCBldmVudCBsb2csIG1pc3NpbmdcbiAqICAgdGltZXN0YW1wcywgd29ya2Zsb3cvc3RlcCBub3QgcmVnaXN0ZXJlZCwgZXRjLilcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsYXNzaWZ5UnVuRXJyb3IoZXJyOiB1bmtub3duKTogUnVuRXJyb3JDb2RlIHtcbiAgaWYgKGVyciBpbnN0YW5jZW9mIFdvcmtmbG93UnVudGltZUVycm9yKSB7XG4gICAgcmV0dXJuIFJVTl9FUlJPUl9DT0RFUy5SVU5USU1FX0VSUk9SO1xuICB9XG4gIHJldHVybiBSVU5fRVJST1JfQ09ERVMuVVNFUl9FUlJPUjtcbn1cbiJdfQ==
120
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3NpZnktZXJyb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY2xhc3NpZnktZXJyb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHNCQUFzQixFQUN0QixzQkFBc0IsRUFDdEIscUJBQXFCLEVBQ3JCLGVBQWUsRUFFZixzQkFBc0IsRUFDdEIsc0JBQXNCLEVBQ3RCLGFBQWEsRUFDYiwrQkFBK0IsRUFDL0IsMEJBQTBCLEVBQzFCLG9CQUFvQixFQUNwQixrQkFBa0IsR0FDbkIsTUFBTSxrQkFBa0IsQ0FBQztBQUUxQixNQUFNLDBCQUEwQixHQUFHLElBQUksR0FBRyxDQUFDO0lBQ3pDLGFBQWE7SUFDYixtQkFBbUI7SUFDbkIsZUFBZSxDQUFDLG9CQUFvQjtDQUNyQyxDQUFDLENBQUM7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLDJCQUEyQixHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7QUFFdEU7Ozs7OztHQU1HO0FBQ0gsTUFBTSxvQkFBb0IsR0FBRztJQUMzQixvQkFBb0IsQ0FBQyxFQUFFO0lBQ3ZCLHNCQUFzQixDQUFDLEVBQUU7SUFDekIsMEJBQTBCLENBQUMsRUFBRTtJQUM3QiwrREFBK0Q7SUFDL0QseURBQXlEO0lBQ3pELG9FQUFvRTtJQUNwRSxrQ0FBa0M7SUFDbEMsc0JBQXNCLENBQUMsRUFBRTtDQUMxQixDQUFDO0FBRUY7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUFDLEdBQVk7SUFDL0MsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQzVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELE1BQU0sS0FBSyxHQUFHLE9BQU8sSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNyRCxPQUFPLENBQ0wsQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLFNBQVMsSUFBSSwwQkFBMEIsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BFLEdBQUcsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLG9DQUFvQyxDQUFDO1FBQzVELEdBQUcsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLCtCQUErQixDQUFDO1FBQ3ZELENBQUMsT0FBTyxLQUFLLEtBQUssUUFBUTtZQUN4QixLQUFLLEtBQUssSUFBSTtZQUNkLE1BQU0sSUFBSSxLQUFLO1lBQ2YsS0FBSyxDQUFDLElBQUksS0FBSyxVQUFVLENBQUMsQ0FDN0IsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUFDLEdBQVk7SUFDaEQsSUFBSSxhQUFhLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDMUIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ2hDLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUNELElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxTQUFTLElBQUksR0FBRyxDQUFDLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNsRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQyxJQUFJLEtBQUssU0FBUyxJQUFJLDJCQUEyQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDN0UsQ0FBQztBQUVELE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxHQUFZO0lBQzNDLElBQUkscUJBQXFCLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDbEMsT0FBTyxlQUFlLENBQUMsaUJBQWlCLENBQUM7SUFDM0MsQ0FBQztJQUVELElBQUksc0JBQXNCLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDbkMsT0FBTyxlQUFlLENBQUMsbUJBQW1CLENBQUM7SUFDN0MsQ0FBQztJQUVELElBQUksc0JBQXNCLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDbkMsT0FBTyxlQUFlLENBQUMsbUJBQW1CLENBQUM7SUFDN0MsQ0FBQztJQUVELElBQUksK0JBQStCLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDNUMsT0FBTyxlQUFlLENBQUMsbUJBQW1CLENBQUM7SUFDN0MsQ0FBQztJQUVELDRFQUE0RTtJQUM1RSwwRUFBMEU7SUFDMUUsd0VBQXdFO0lBQ3hFLDhFQUE4RTtJQUM5RSwwRUFBMEU7SUFDMUUsOEVBQThFO0lBQzlFLDBEQUEwRDtJQUMxRCxJQUFJLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxJQUFJLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDNUQsT0FBTyxlQUFlLENBQUMsb0JBQW9CLENBQUM7SUFDOUMsQ0FBQztJQUVELEtBQUssTUFBTSxPQUFPLElBQUksb0JBQW9CLEVBQUUsQ0FBQztRQUMzQyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2pCLE9BQU8sZUFBZSxDQUFDLGFBQWEsQ0FBQztRQUN2QyxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sZUFBZSxDQUFDLFVBQVUsQ0FBQztBQUNwQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29ycnVwdGVkRXZlbnRMb2dFcnJvcixcbiAgTWF4RXZlbnRzRXhjZWVkZWRFcnJvcixcbiAgUmVwbGF5RGl2ZXJnZW5jZUVycm9yLFxuICBSVU5fRVJST1JfQ09ERVMsXG4gIHR5cGUgUnVuRXJyb3JDb2RlLFxuICBSdW50aW1lRGVjcnlwdGlvbkVycm9yLFxuICBTdGVwTm90UmVnaXN0ZXJlZEVycm9yLFxuICBUaHJvdHRsZUVycm9yLFxuICBXb3JrZmxvd0RlcGxveW1lbnRNaXNtYXRjaEVycm9yLFxuICBXb3JrZmxvd05vdFJlZ2lzdGVyZWRFcnJvcixcbiAgV29ya2Zsb3dSdW50aW1lRXJyb3IsXG4gIFdvcmtmbG93V29ybGRFcnJvcixcbn0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5cbmNvbnN0IFdPUkxEX0NPTlRSQUNUX0VSUk9SX0NPREVTID0gbmV3IFNldChbXG4gICdQQVJTRV9FUlJPUicsXG4gICdTQ0hFTUFfVkFMSURBVElPTicsXG4gIFJVTl9FUlJPUl9DT0RFUy5XT1JMRF9DT05UUkFDVF9FUlJPUixcbl0pO1xuXG4vKipcbiAqIGBXb3JrZmxvd1dvcmxkRXJyb3IuY29kZWAgdmFsdWVzIHRoYXQgbWFyayBhIHRyYW5zaWVudCB0cmFuc3BvcnQgZmFpbHVyZVxuICogKHNldCBieSB3b3JsZC12ZXJjZWwncyBIVFRQIGNsaWVudCk6IGBUUkFOU1BPUlRgIGNvdmVycyBhbiBleGhhdXN0ZWRcbiAqIFJldHJ5QWdlbnQgKGBVTkRfRVJSX1JFUV9SRVRSWWAg4oCUIGUuZy4gdGhlIGZpcmV3YWxsIGluIGZyb250IG9mXG4gKiB3b3JrZmxvdy1zZXJ2ZXIgc2hlZGRpbmcgbG9hZCB3aXRoIDQyOS81MDMpLCBhIGRyb3BwZWQgc29ja2V0LCBvciBhXG4gKiBjb25uZWN0L0ROUyBmYWlsdXJlOyBgVElNRU9VVGAgY292ZXJzIGEgcmVxdWVzdCB0aGF0IGV4Y2VlZGVkIHRoZSBjbGllbnRcbiAqIHRpbWVvdXQuIEJvdGggYXJlIGluZnJhc3RydWN0dXJlIGZhaWx1cmVzIGEgZnJlc2ggaW52b2NhdGlvbiBjYW4gcmVjb3ZlclxuICogZnJvbS4gS2VwdCBkaXN0aW5jdCBmcm9tIGBXT1JMRF9DT05UUkFDVF9FUlJPUl9DT0RFU2Agc28gYSB0cmFuc3BvcnQgYmxpcCBpc1xuICogbmV2ZXIgbWlzY2xhc3NpZmllZCBhcyB0aGUgc2VydmVyIHJldHVybmluZyBhIG1hbGZvcm1lZCByZXNwb25zZS5cbiAqL1xuY29uc3QgUkVUUllBQkxFX1dPUkxEX0VSUk9SX0NPREVTID0gbmV3IFNldChbJ1RSQU5TUE9SVCcsICdUSU1FT1VUJ10pO1xuXG4vKipcbiAqIFNldCBvZiBlcnJvciBuYW1lcyB0aGF0IHNob3VsZCBjbGFzc2lmeSBhcyBnZW5lcmljIGBSVU5USU1FX0VSUk9SYC4gRWFjaFxuICogYCouaXMoKWAgc3RhdGljIGRvZXMgYSBuYW1lLWJhc2VkIGR1Y2sgY2hlY2ssIHNvIHN1YmNsYXNzaW5nIGFsb25lIGlzXG4gKiBub3QgZW5vdWdoIOKAlCB3ZSBoYXZlIHRvIGVudW1lcmF0ZSBldmVyeSBjb25jcmV0ZSBzdWJjbGFzcyB3ZSB3YW50IHRvXG4gKiByZWNvZ25pemUuIEtlZXAgaW4gc3luYyB3aXRoIHRoZSBgV29ya2Zsb3dSdW50aW1lRXJyb3JgIGNsYXNzIGhpZXJhcmNoeVxuICogaW4gYEB3b3JrZmxvdy9lcnJvcnNgLlxuICovXG5jb25zdCBSVU5USU1FX0VSUk9SX0NIRUNLUyA9IFtcbiAgV29ya2Zsb3dSdW50aW1lRXJyb3IuaXMsXG4gIFN0ZXBOb3RSZWdpc3RlcmVkRXJyb3IuaXMsXG4gIFdvcmtmbG93Tm90UmVnaXN0ZXJlZEVycm9yLmlzLFxuICAvLyBTREstbGV2ZWwgZW5jcnlwdGlvbiBmYWlsdXJlcyAobW9zdCBub3RhYmx5IEFFUy1HQ00gYXV0aC10YWdcbiAgLy8gbWlzbWF0Y2hlcyBzdXJmYWNpbmcgYXMgYSBuYXRpdmUgYE9wZXJhdGlvbkVycm9yYCBmcm9tXG4gIC8vIGBBRVNDaXBoZXJKb2Iub25Eb25lYCkgYXJlIHdyYXBwZWQgaW4gYFJ1bnRpbWVEZWNyeXB0aW9uRXJyb3JgIGF0XG4gIC8vIHRoZSBlbmNyeXB0aW9uIG1vZHVsZSBib3VuZGFyeS5cbiAgUnVudGltZURlY3J5cHRpb25FcnJvci5pcyxcbl07XG5cbi8qKlxuICogQ2xhc3NpZnkgYW4gZXJyb3IgdGhhdCBjYXVzZWQgYSB3b3JrZmxvdyBydW4gdG8gZmFpbC5cbiAqXG4gKiBBZnRlciB0aGUgc3RydWN0dXJhbCBzZXBhcmF0aW9uIG9mIGluZnJhc3RydWN0dXJlIHZzIHVzZXIgY29kZSBlcnJvclxuICogaGFuZGxpbmcsIHRoZSBvbmx5IGVycm9ycyB0aGF0IHJlYWNoIHRoZSBgcnVuX2ZhaWxlZGAgdHJ5L2NhdGNoIGFyZTpcbiAqIC0gVXNlciBjb2RlIGVycm9ycyAodGhyb3dzIGZyb20gd29ya2Zsb3cgZnVuY3Rpb25zLCBwcm9wYWdhdGVkIHN0ZXAgZmFpbHVyZXMpXG4gKiAtIFdvcmtmbG93UnVudGltZUVycm9yIGFuZCBzdWJjbGFzc2VzIChtaXNzaW5nIHRpbWVzdGFtcHMsIHdvcmtmbG93L3N0ZXBcbiAqICAgbm90IHJlZ2lzdGVyZWQsIGNvcnJ1cHRlZCBldmVudCBsb2csIGV0Yy4pXG4gKlxuICogVXNlcyBlYWNoIHN1YmNsYXNzJ3MgYC5pcygpYCBzdGF0aWMgKGEgbmFtZS1iYXNlZCBkdWNrIGNoZWNrKSBpbnN0ZWFkIG9mXG4gKiBhIHNpbmdsZSBgaW5zdGFuY2VvZmAgY2hlY2sgYmVjYXVzZSB3b3JrZmxvd3MgZXhlY3V0ZSBpbiBhIHNlcGFyYXRlXG4gKiBgdm1gIHJlYWxtOiB0aGUgVk0tY29udGV4dCBgV29ya2Zsb3dSdW50aW1lRXJyb3JgIGFuZCB0aGUgaG9zdC1jb250ZXh0XG4gKiBvbmUgYXJlIGRpc3RpbmN0IGNsYXNzZXMsIHNvIGBpbnN0YW5jZW9mYCByZXR1cm5zIGBmYWxzZWAgZm9yIGFueSBlcnJvclxuICogdGhyb3duIGluc2lkZSB0aGUgd29ya2Zsb3cgVk0gYW5kIHdlJ2QgbWlzY2xhc3NpZnkgZ2VudWluZSBydW50aW1lXG4gKiBlcnJvcnMgYXMgdXNlciBlcnJvcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1dvcmxkQ29udHJhY3RFcnJvcihlcnI6IHVua25vd24pOiBlcnIgaXMgV29ya2Zsb3dXb3JsZEVycm9yIHtcbiAgaWYgKCFXb3JrZmxvd1dvcmxkRXJyb3IuaXMoZXJyKSB8fCBlcnIuc3RhdHVzICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBjYXVzZSA9ICdjYXVzZScgaW4gZXJyID8gZXJyLmNhdXNlIDogdW5kZWZpbmVkO1xuICByZXR1cm4gKFxuICAgIChlcnIuY29kZSAhPT0gdW5kZWZpbmVkICYmIFdPUkxEX0NPTlRSQUNUX0VSUk9SX0NPREVTLmhhcyhlcnIuY29kZSkpIHx8XG4gICAgZXJyLm1lc3NhZ2Uuc3RhcnRzV2l0aCgnRmFpbGVkIHRvIHBhcnNlIHJlc3BvbnNlIGJvZHkgZm9yICcpIHx8XG4gICAgZXJyLm1lc3NhZ2Uuc3RhcnRzV2l0aCgnU2NoZW1hIHZhbGlkYXRpb24gZmFpbGVkIGZvciAnKSB8fFxuICAgICh0eXBlb2YgY2F1c2UgPT09ICdvYmplY3QnICYmXG4gICAgICBjYXVzZSAhPT0gbnVsbCAmJlxuICAgICAgJ25hbWUnIGluIGNhdXNlICYmXG4gICAgICBjYXVzZS5uYW1lID09PSAnWm9kRXJyb3InKVxuICApO1xufVxuXG4vKipcbiAqIFRydWUgd2hlbiBhbiBlcnJvciBmcm9tIGEgd29ybGQgKHdvcmtmbG93LXNlcnZlcikgY2FsbCBpcyBhIHRyYW5zaWVudFxuICogaW5mcmFzdHJ1Y3R1cmUgZmFpbHVyZSB0aGF0IHNob3VsZCBiZSByZXRyaWVkIGJ5IHJlZGVsaXZlcmluZyB0aGUgcXVldWVcbiAqIG1lc3NhZ2UsIHJhdGhlciB0aGFuIGZhaWxpbmcgdGhlIHJ1bi4gQSBmcmVzaCBpbnZvY2F0aW9uIHdpbGwgbGlrZWx5XG4gKiBzdWNjZWVkIG9uY2UgdGhlIGJhY2tlbmQgKG9yIHRoZSBmaXJld2FsbCBpbiBmcm9udCBvZiBpdCkgcmVjb3ZlcnMuXG4gKlxuICogLSBgVGhyb3R0bGVFcnJvcmAgKDQyOSk6IHJhdGUgbGltaXRlZCAvIGxvYWQgc2hlZFxuICogLSBgV29ya2Zsb3dXb3JsZEVycm9yYCB3aXRoIGBzdGF0dXMgPj0gNTAwYDogc2VydmVyLXNpZGUgZXJyb3JcbiAqIC0gYFdvcmtmbG93V29ybGRFcnJvcmAgd2l0aCBhIHJldHJ5YWJsZSB0cmFuc3BvcnQgYGNvZGVgIChgVFJBTlNQT1JUYCAvXG4gKiAgIGBUSU1FT1VUYCk6IHRoZSByZXF1ZXN0IG5ldmVyIHByb2R1Y2VkIGEgdXNhYmxlIHJlc3BvbnNlXG4gKlxuICogVXNlcyBgLmlzKClgIG5hbWUtYmFzZWQgZHVjayBjaGVja3MgKG5vdCBgaW5zdGFuY2VvZmApIGZvciB0aGUgc2FtZVxuICogY3Jvc3MtYHZtYC1yZWFsbSByZWFzb24gZGVzY3JpYmVkIG9uIGBjbGFzc2lmeVJ1bkVycm9yYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmV0cnlhYmxlV29ybGRFcnJvcihlcnI6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKFRocm90dGxlRXJyb3IuaXMoZXJyKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmICghV29ya2Zsb3dXb3JsZEVycm9yLmlzKGVycikpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGVyci5zdGF0dXMgIT09IHVuZGVmaW5lZCAmJiBlcnIuc3RhdHVzID49IDUwMCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBlcnIuY29kZSAhPT0gdW5kZWZpbmVkICYmIFJFVFJZQUJMRV9XT1JMRF9FUlJPUl9DT0RFUy5oYXMoZXJyLmNvZGUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xhc3NpZnlSdW5FcnJvcihlcnI6IHVua25vd24pOiBSdW5FcnJvckNvZGUge1xuICBpZiAoUmVwbGF5RGl2ZXJnZW5jZUVycm9yLmlzKGVycikpIHtcbiAgICByZXR1cm4gUlVOX0VSUk9SX0NPREVTLlJFUExBWV9ESVZFUkdFTkNFO1xuICB9XG5cbiAgaWYgKENvcnJ1cHRlZEV2ZW50TG9nRXJyb3IuaXMoZXJyKSkge1xuICAgIHJldHVybiBSVU5fRVJST1JfQ09ERVMuQ09SUlVQVEVEX0VWRU5UX0xPRztcbiAgfVxuXG4gIGlmIChNYXhFdmVudHNFeGNlZWRlZEVycm9yLmlzKGVycikpIHtcbiAgICByZXR1cm4gUlVOX0VSUk9SX0NPREVTLk1BWF9FVkVOVFNfRVhDRUVERUQ7XG4gIH1cblxuICBpZiAoV29ya2Zsb3dEZXBsb3ltZW50TWlzbWF0Y2hFcnJvci5pcyhlcnIpKSB7XG4gICAgcmV0dXJuIFJVTl9FUlJPUl9DT0RFUy5ERVBMT1lNRU5UX01JU01BVENIO1xuICB9XG5cbiAgLy8gV29ybGQtbGF5ZXIgZmF1bHRzIOKAlCBib3RoIGEgbWFsZm9ybWVkIHJlc3BvbnNlIChjb250cmFjdCB2aW9sYXRpb24pIGFuZCBhXG4gIC8vIHRyYW5zaWVudCBpbmZyYXN0cnVjdHVyZSBmYWlsdXJlICh0aHJvdHRsZSAvIDV4eCAvIHRyYW5zcG9ydCAvIHRpbWVvdXQsXG4gIC8vIGUuZy4gYSBmaXJld2FsbCBjaGFsbGVuZ2UpIOKAlCBhcmUgdGhlIGJhY2tlbmQncyBmYXVsdCwgbm90IHRoZSB1c2VyJ3MuXG4gIC8vIEJ1Y2tldCB0aGVtIHVuZGVyIFdPUkxEX0NPTlRSQUNUX0VSUk9SIHJhdGhlciB0aGFuIFVTRVJfRVJST1Igc28gZGFzaGJvYXJkc1xuICAvLyBhdHRyaWJ1dGUgYW4gb3V0YWdlIGNvcnJlY3RseS4gTm90ZSB0aGUgcmV0cnlhYmxlIHZhcmlhbnRzIGFyZSBub3JtYWxseVxuICAvLyByZWRlbGl2ZXJlZCB2aWEgdGhlIHF1ZXVlIChzZWUgYGlzUmV0cnlhYmxlV29ybGRFcnJvcmApIGFuZCBvbmx5IHJlYWNoIHRoaXNcbiAgLy8gdGVybWluYWwgY2xhc3NpZmljYXRpb24gaWYgdGhlIHJ1biB1bHRpbWF0ZWx5IGdpdmVzIHVwLlxuICBpZiAoaXNXb3JsZENvbnRyYWN0RXJyb3IoZXJyKSB8fCBpc1JldHJ5YWJsZVdvcmxkRXJyb3IoZXJyKSkge1xuICAgIHJldHVybiBSVU5fRVJST1JfQ09ERVMuV09STERfQ09OVFJBQ1RfRVJST1I7XG4gIH1cblxuICBmb3IgKGNvbnN0IGlzTWF0Y2ggb2YgUlVOVElNRV9FUlJPUl9DSEVDS1MpIHtcbiAgICBpZiAoaXNNYXRjaChlcnIpKSB7XG4gICAgICByZXR1cm4gUlVOX0VSUk9SX0NPREVTLlJVTlRJTUVfRVJST1I7XG4gICAgfVxuICB9XG4gIHJldHVybiBSVU5fRVJST1JfQ09ERVMuVVNFUl9FUlJPUjtcbn1cbiJdfQ==