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

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 (317) hide show
  1. package/README.md +5 -0
  2. package/dist/attribute-changes.d.ts +5 -0
  3. package/dist/attribute-changes.d.ts.map +1 -0
  4. package/dist/attribute-changes.js +25 -0
  5. package/dist/capabilities.d.ts +35 -2
  6. package/dist/capabilities.d.ts.map +1 -1
  7. package/dist/capabilities.js +74 -5
  8. package/dist/capture-stack.d.ts +1 -1
  9. package/dist/capture-stack.js +2 -2
  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 +19 -3
  14. package/dist/classify-error.d.ts.map +1 -1
  15. package/dist/classify-error.js +98 -6
  16. package/dist/context-violation-error.d.ts +5 -5
  17. package/dist/context-violation-error.d.ts.map +1 -1
  18. package/dist/context-violation-error.js +8 -6
  19. package/dist/create-hook.d.ts +72 -7
  20. package/dist/create-hook.d.ts.map +1 -1
  21. package/dist/create-hook.js +1 -1
  22. package/dist/define-hook.js +2 -2
  23. package/dist/describe-error.d.ts +7 -7
  24. package/dist/describe-error.d.ts.map +1 -1
  25. package/dist/describe-error.js +97 -12
  26. package/dist/encryption.d.ts +38 -4
  27. package/dist/encryption.d.ts.map +1 -1
  28. package/dist/encryption.js +96 -14
  29. package/dist/events-consumer.d.ts +297 -0
  30. package/dist/events-consumer.d.ts.map +1 -1
  31. package/dist/events-consumer.js +673 -42
  32. package/dist/flushable-stream.d.ts +97 -1
  33. package/dist/flushable-stream.d.ts.map +1 -1
  34. package/dist/flushable-stream.js +291 -11
  35. package/dist/global.d.ts +36 -2
  36. package/dist/global.d.ts.map +1 -1
  37. package/dist/global.js +21 -6
  38. package/dist/index.d.ts +2 -1
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +3 -2
  41. package/dist/log-format.d.ts +2 -2
  42. package/dist/log-format.js +19 -12
  43. package/dist/logger.d.ts +1 -0
  44. package/dist/logger.d.ts.map +1 -1
  45. package/dist/logger.js +10 -6
  46. package/dist/private.d.ts +226 -9
  47. package/dist/private.d.ts.map +1 -1
  48. package/dist/private.js +626 -7
  49. package/dist/replay-divergence.d.ts +25 -0
  50. package/dist/replay-divergence.d.ts.map +1 -0
  51. package/dist/replay-divergence.js +61 -0
  52. package/dist/replay-payload-cache.d.ts +64 -0
  53. package/dist/replay-payload-cache.d.ts.map +1 -0
  54. package/dist/replay-payload-cache.js +158 -0
  55. package/dist/runtime/compute-instance.d.ts +13 -0
  56. package/dist/runtime/compute-instance.d.ts.map +1 -0
  57. package/dist/runtime/compute-instance.js +14 -0
  58. package/dist/runtime/constants.d.ts +315 -0
  59. package/dist/runtime/constants.d.ts.map +1 -1
  60. package/dist/runtime/constants.js +502 -16
  61. package/dist/runtime/count-step-started-events.d.ts +52 -0
  62. package/dist/runtime/count-step-started-events.d.ts.map +1 -0
  63. package/dist/runtime/count-step-started-events.js +72 -0
  64. package/dist/runtime/deployment-guard.d.ts +99 -0
  65. package/dist/runtime/deployment-guard.d.ts.map +1 -0
  66. package/dist/runtime/deployment-guard.js +154 -0
  67. package/dist/runtime/get-port-lazy.d.ts +15 -0
  68. package/dist/runtime/get-port-lazy.d.ts.map +1 -1
  69. package/dist/runtime/get-port-lazy.js +75 -6
  70. package/dist/runtime/get-world-lazy.d.ts +5 -14
  71. package/dist/runtime/get-world-lazy.d.ts.map +1 -1
  72. package/dist/runtime/get-world-lazy.js +19 -29
  73. package/dist/runtime/helpers.d.ts +415 -29
  74. package/dist/runtime/helpers.d.ts.map +1 -1
  75. package/dist/runtime/helpers.js +686 -57
  76. package/dist/runtime/quickjs-assets.generated.d.ts +14 -0
  77. package/dist/runtime/quickjs-assets.generated.d.ts.map +1 -0
  78. package/dist/runtime/quickjs-assets.generated.js +30 -0
  79. package/dist/runtime/quickjs-entrypoint.d.ts +158 -0
  80. package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -0
  81. package/dist/runtime/quickjs-entrypoint.js +1863 -0
  82. package/dist/runtime/quickjs-log-view.d.ts +129 -0
  83. package/dist/runtime/quickjs-log-view.d.ts.map +1 -0
  84. package/dist/runtime/quickjs-log-view.js +229 -0
  85. package/dist/runtime/quickjs-runtime.d.ts +244 -0
  86. package/dist/runtime/quickjs-runtime.d.ts.map +1 -0
  87. package/dist/runtime/quickjs-runtime.js +2427 -0
  88. package/dist/runtime/quickjs-serde.d.ts +107 -0
  89. package/dist/runtime/quickjs-serde.d.ts.map +1 -0
  90. package/dist/runtime/quickjs-serde.js +2159 -0
  91. package/dist/runtime/replay-budget.d.ts +97 -0
  92. package/dist/runtime/replay-budget.d.ts.map +1 -0
  93. package/dist/runtime/replay-budget.js +139 -0
  94. package/dist/runtime/replay-recovery-reporter.d.ts +36 -0
  95. package/dist/runtime/replay-recovery-reporter.d.ts.map +1 -0
  96. package/dist/runtime/replay-recovery-reporter.js +64 -0
  97. package/dist/runtime/resume-hook.d.ts +91 -8
  98. package/dist/runtime/resume-hook.d.ts.map +1 -1
  99. package/dist/runtime/resume-hook.js +512 -89
  100. package/dist/runtime/resume-latency.d.ts +150 -0
  101. package/dist/runtime/resume-latency.d.ts.map +1 -0
  102. package/dist/runtime/resume-latency.js +155 -0
  103. package/dist/runtime/run-id-time.d.ts +19 -0
  104. package/dist/runtime/run-id-time.d.ts.map +1 -0
  105. package/dist/runtime/run-id-time.js +42 -0
  106. package/dist/runtime/run.d.ts +72 -7
  107. package/dist/runtime/run.d.ts.map +1 -1
  108. package/dist/runtime/run.js +280 -53
  109. package/dist/runtime/runs.d.ts +54 -3
  110. package/dist/runtime/runs.d.ts.map +1 -1
  111. package/dist/runtime/runs.js +126 -16
  112. package/dist/runtime/start.d.ts +101 -2
  113. package/dist/runtime/start.d.ts.map +1 -1
  114. package/dist/runtime/start.js +352 -61
  115. package/dist/runtime/step-executor.d.ts +186 -5
  116. package/dist/runtime/step-executor.d.ts.map +1 -1
  117. package/dist/runtime/step-executor.js +768 -130
  118. package/dist/runtime/step-latency.d.ts +220 -0
  119. package/dist/runtime/step-latency.d.ts.map +1 -0
  120. package/dist/runtime/step-latency.js +215 -0
  121. package/dist/runtime/step-ownership.d.ts +72 -0
  122. package/dist/runtime/step-ownership.d.ts.map +1 -0
  123. package/dist/runtime/step-ownership.js +114 -0
  124. package/dist/runtime/step-single-flight.d.ts +12 -0
  125. package/dist/runtime/step-single-flight.d.ts.map +1 -0
  126. package/dist/runtime/step-single-flight.js +75 -0
  127. package/dist/runtime/suspension-handler.d.ts +247 -7
  128. package/dist/runtime/suspension-handler.d.ts.map +1 -1
  129. package/dist/runtime/suspension-handler.js +1304 -125
  130. package/dist/runtime/unserializable-step.d.ts +34 -0
  131. package/dist/runtime/unserializable-step.d.ts.map +1 -0
  132. package/dist/runtime/unserializable-step.js +52 -0
  133. package/dist/runtime/vm-mode.d.ts +44 -0
  134. package/dist/runtime/vm-mode.d.ts.map +1 -0
  135. package/dist/runtime/vm-mode.js +62 -0
  136. package/dist/runtime/vm-serde-bundle.generated.d.ts +14 -0
  137. package/dist/runtime/vm-serde-bundle.generated.d.ts.map +1 -0
  138. package/dist/runtime/vm-serde-bundle.generated.js +16 -0
  139. package/dist/runtime/wait-continuation.d.ts +106 -0
  140. package/dist/runtime/wait-continuation.d.ts.map +1 -0
  141. package/dist/runtime/wait-continuation.js +136 -0
  142. package/dist/runtime/wait-until.d.ts +18 -0
  143. package/dist/runtime/wait-until.d.ts.map +1 -0
  144. package/dist/runtime/wait-until.js +42 -0
  145. package/dist/runtime/world-compatibility.d.ts +32 -0
  146. package/dist/runtime/world-compatibility.d.ts.map +1 -0
  147. package/dist/runtime/world-compatibility.js +44 -0
  148. package/dist/runtime/world-init.d.ts +17 -42
  149. package/dist/runtime/world-init.d.ts.map +1 -1
  150. package/dist/runtime/world-init.js +18 -43
  151. package/dist/runtime/world.d.ts +14 -2
  152. package/dist/runtime/world.d.ts.map +1 -1
  153. package/dist/runtime/world.js +75 -19
  154. package/dist/runtime.d.ts +10 -6
  155. package/dist/runtime.d.ts.map +1 -1
  156. package/dist/runtime.js +3911 -489
  157. package/dist/sealed-box.d.ts +167 -0
  158. package/dist/sealed-box.d.ts.map +1 -0
  159. package/dist/sealed-box.js +571 -0
  160. package/dist/serialization/client.d.ts +3 -3
  161. package/dist/serialization/client.d.ts.map +1 -1
  162. package/dist/serialization/client.js +8 -4
  163. package/dist/serialization/codec-devalue-vm.d.ts +16 -0
  164. package/dist/serialization/codec-devalue-vm.d.ts.map +1 -0
  165. package/dist/serialization/codec-devalue-vm.js +148 -0
  166. package/dist/serialization/codec-devalue.d.ts +1 -1
  167. package/dist/serialization/codec-devalue.d.ts.map +1 -1
  168. package/dist/serialization/codec-devalue.js +24 -6
  169. package/dist/serialization/codec.d.ts +37 -2
  170. package/dist/serialization/codec.d.ts.map +1 -1
  171. package/dist/serialization/codec.js +2 -2
  172. package/dist/serialization/compression.d.ts +105 -0
  173. package/dist/serialization/compression.d.ts.map +1 -0
  174. package/dist/serialization/compression.js +261 -0
  175. package/dist/serialization/encryption.d.ts +119 -17
  176. package/dist/serialization/encryption.d.ts.map +1 -1
  177. package/dist/serialization/encryption.js +152 -17
  178. package/dist/serialization/errors.d.ts +13 -0
  179. package/dist/serialization/errors.d.ts.map +1 -1
  180. package/dist/serialization/errors.js +20 -2
  181. package/dist/serialization/format.d.ts +6 -6
  182. package/dist/serialization/format.js +7 -7
  183. package/dist/serialization/hardened.d.ts +156 -0
  184. package/dist/serialization/hardened.d.ts.map +1 -0
  185. package/dist/serialization/hardened.js +538 -0
  186. package/dist/serialization/index.d.ts +10 -8
  187. package/dist/serialization/index.d.ts.map +1 -1
  188. package/dist/serialization/index.js +10 -8
  189. package/dist/serialization/reducers/class-vm.d.ts +20 -0
  190. package/dist/serialization/reducers/class-vm.d.ts.map +1 -0
  191. package/dist/serialization/reducers/class-vm.js +77 -0
  192. package/dist/serialization/reducers/class.d.ts.map +1 -1
  193. package/dist/serialization/reducers/class.js +11 -6
  194. package/dist/serialization/reducers/common-vm.d.ts +15 -0
  195. package/dist/serialization/reducers/common-vm.d.ts.map +1 -0
  196. package/dist/serialization/reducers/common-vm.js +616 -0
  197. package/dist/serialization/reducers/common.d.ts +1 -1
  198. package/dist/serialization/reducers/common.d.ts.map +1 -1
  199. package/dist/serialization/reducers/common.js +202 -62
  200. package/dist/serialization/reducers/step-function-vm.d.ts +44 -0
  201. package/dist/serialization/reducers/step-function-vm.d.ts.map +1 -0
  202. package/dist/serialization/reducers/step-function-vm.js +97 -0
  203. package/dist/serialization/reducers/step-function.d.ts.map +1 -1
  204. package/dist/serialization/reducers/step-function.js +25 -9
  205. package/dist/serialization/step.d.ts +4 -4
  206. package/dist/serialization/step.d.ts.map +1 -1
  207. package/dist/serialization/step.js +9 -5
  208. package/dist/serialization/types.d.ts +80 -1
  209. package/dist/serialization/types.d.ts.map +1 -1
  210. package/dist/serialization/types.js +15 -1
  211. package/dist/serialization/workflow-vm.d.ts +29 -0
  212. package/dist/serialization/workflow-vm.d.ts.map +1 -0
  213. package/dist/serialization/workflow-vm.js +74 -0
  214. package/dist/serialization-format.d.ts +64 -8
  215. package/dist/serialization-format.d.ts.map +1 -1
  216. package/dist/serialization-format.js +225 -73
  217. package/dist/serialization.d.ts +262 -34
  218. package/dist/serialization.d.ts.map +1 -1
  219. package/dist/serialization.js +1885 -277
  220. package/dist/set-attributes.d.ts +13 -0
  221. package/dist/set-attributes.d.ts.map +1 -0
  222. package/dist/set-attributes.js +60 -0
  223. package/dist/source-map.d.ts +25 -0
  224. package/dist/source-map.d.ts.map +1 -1
  225. package/dist/source-map.js +154 -10
  226. package/dist/step/context-storage.d.ts +63 -2
  227. package/dist/step/context-storage.d.ts.map +1 -1
  228. package/dist/step/context-storage.js +7 -5
  229. package/dist/step/writable-stream.d.ts +3 -3
  230. package/dist/step/writable-stream.d.ts.map +1 -1
  231. package/dist/step/writable-stream.js +80 -13
  232. package/dist/step.d.ts.map +1 -1
  233. package/dist/step.js +148 -27
  234. package/dist/symbols.d.ts +50 -0
  235. package/dist/symbols.d.ts.map +1 -1
  236. package/dist/symbols.js +51 -1
  237. package/dist/telemetry/semantic-conventions.d.ts +433 -2
  238. package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
  239. package/dist/telemetry/semantic-conventions.js +319 -3
  240. package/dist/telemetry.d.ts +91 -0
  241. package/dist/telemetry.d.ts.map +1 -1
  242. package/dist/telemetry.js +244 -17
  243. package/dist/test-support/orchestrator-context.d.ts +25 -0
  244. package/dist/test-support/orchestrator-context.d.ts.map +1 -0
  245. package/dist/test-support/orchestrator-context.js +107 -0
  246. package/dist/types.d.ts +6 -0
  247. package/dist/types.d.ts.map +1 -1
  248. package/dist/types.js +23 -1
  249. package/dist/util.d.ts +0 -5
  250. package/dist/util.d.ts.map +1 -1
  251. package/dist/util.js +1 -15
  252. package/dist/version.d.ts +1 -1
  253. package/dist/version.d.ts.map +1 -1
  254. package/dist/version.js +2 -2
  255. package/dist/vm/index.d.ts.map +1 -1
  256. package/dist/vm/index.js +84 -14
  257. package/dist/vm/script-cache.d.ts +26 -0
  258. package/dist/vm/script-cache.d.ts.map +1 -0
  259. package/dist/vm/script-cache.js +131 -0
  260. package/dist/vm/uint8array-base64.js +1 -1
  261. package/dist/workflow/abort-controller.d.ts +2 -2
  262. package/dist/workflow/abort-controller.d.ts.map +1 -1
  263. package/dist/workflow/abort-controller.js +88 -21
  264. package/dist/workflow/attribute-dispatcher.d.ts +6 -0
  265. package/dist/workflow/attribute-dispatcher.d.ts.map +1 -0
  266. package/dist/workflow/attribute-dispatcher.js +45 -0
  267. package/dist/workflow/create-hook.d.ts.map +1 -1
  268. package/dist/workflow/create-hook.js +24 -3
  269. package/dist/workflow/get-workflow-metadata.js +2 -2
  270. package/dist/workflow/hook.d.ts.map +1 -1
  271. package/dist/workflow/hook.js +304 -47
  272. package/dist/workflow/index.d.ts +1 -0
  273. package/dist/workflow/index.d.ts.map +1 -1
  274. package/dist/workflow/index.js +2 -1
  275. package/dist/workflow/set-attributes.d.ts +68 -0
  276. package/dist/workflow/set-attributes.d.ts.map +1 -0
  277. package/dist/workflow/set-attributes.js +60 -0
  278. package/dist/workflow/sleep.d.ts.map +1 -1
  279. package/dist/workflow/sleep.js +58 -12
  280. package/dist/workflow/world-init-stub.d.ts +3 -3
  281. package/dist/workflow/world-init-stub.js +4 -4
  282. package/dist/workflow.d.ts +95 -3
  283. package/dist/workflow.d.ts.map +1 -1
  284. package/dist/workflow.js +900 -561
  285. package/docs/api-reference/create-hook.mdx +89 -10
  286. package/docs/api-reference/create-webhook.mdx +16 -15
  287. package/docs/api-reference/define-hook.mdx +35 -33
  288. package/docs/api-reference/fatal-error.mdx +30 -8
  289. package/docs/api-reference/fetch.mdx +14 -10
  290. package/docs/api-reference/get-step-metadata.mdx +2 -2
  291. package/docs/api-reference/get-workflow-metadata.mdx +3 -3
  292. package/docs/api-reference/get-writable.mdx +7 -7
  293. package/docs/api-reference/index.mdx +4 -1
  294. package/docs/api-reference/retryable-error.mdx +1 -1
  295. package/docs/api-reference/set-attributes.mdx +61 -0
  296. package/docs/api-reference/sleep.mdx +4 -4
  297. package/docs/foundations/cancellation.mdx +31 -32
  298. package/docs/foundations/errors-and-retries.mdx +42 -11
  299. package/docs/foundations/hooks.mdx +64 -35
  300. package/docs/foundations/idempotency.mdx +244 -12
  301. package/docs/foundations/index.mdx +1 -23
  302. package/docs/foundations/meta.json +2 -1
  303. package/docs/foundations/serialization.mdx +21 -22
  304. package/docs/foundations/starting-workflows.mdx +106 -30
  305. package/docs/foundations/streaming.mdx +108 -60
  306. package/docs/foundations/versioning.mdx +263 -0
  307. package/docs/foundations/workflows-and-steps.mdx +9 -9
  308. package/docs/how-it-works/cancellation.mdx +63 -63
  309. package/docs/how-it-works/code-transform.mdx +83 -67
  310. package/docs/how-it-works/encryption.mdx +30 -26
  311. package/docs/how-it-works/event-sourcing.mdx +125 -34
  312. package/docs/how-it-works/framework-integrations.mdx +96 -337
  313. package/docs/how-it-works/understanding-directives.mdx +22 -22
  314. package/package.json +24 -15
  315. package/dist/runtime/step-handler.d.ts +0 -2
  316. package/dist/runtime/step-handler.d.ts.map +0 -1
  317. package/dist/runtime/step-handler.js +0 -776
@@ -0,0 +1,25 @@
1
+ import type { Event } from '@workflow/world';
2
+ import type { EventsConsumer } from './events-consumer.js';
3
+ import type { QueueItem } from './global.js';
4
+ /**
5
+ * Step, wait, hook and attribute correlation ids share one ULID draw per
6
+ * entity, prefixed by kind (`step_<ulid>`, `wait_<ulid>`, `hook_<ulid>`,
7
+ * `attr_<ulid>`). A replay that drew the same ordinal for a different kind of
8
+ * entity than the one the log recorded there produces an event nobody can
9
+ * consume, and the decisive fact for diagnosing that is which pending
10
+ * invocation currently holds the ordinal. This looks it up by the shared ULID
11
+ * body, so a `wait_created` the log holds at a position where the replay is
12
+ * waiting on `step_<same ulid>` names that step.
13
+ */
14
+ export declare function findPendingItemAtOrdinal(invocationsQueue: Map<string, QueueItem>, correlationId: string): QueueItem | undefined;
15
+ /**
16
+ * The detail appended to a `ReplayDivergenceError` raised because the replay
17
+ * could not place an event. Callers keep their own leading sentence (tests and
18
+ * users match on it) and append this after it.
19
+ *
20
+ * Example:
21
+ * `pending at this id: step drainStep (step_01K…). consumer: index=41,
22
+ * length=44, parked=0, lastConsumed=evnt_01K…`
23
+ */
24
+ export declare function describeDivergenceContext(event: Event, invocationsQueue: Map<string, QueueItem>, eventsConsumer: EventsConsumer): string;
25
+ //# sourceMappingURL=replay-divergence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replay-divergence.d.ts","sourceRoot":"","sources":["../src/replay-divergence.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CACtC,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,EACxC,aAAa,EAAE,MAAM,GACpB,SAAS,GAAG,SAAS,CASvB;AAsBD;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,KAAK,EACZ,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,EACxC,cAAc,EAAE,cAAc,GAC7B,MAAM,CASR"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Step, wait, hook and attribute correlation ids share one ULID draw per
3
+ * entity, prefixed by kind (`step_<ulid>`, `wait_<ulid>`, `hook_<ulid>`,
4
+ * `attr_<ulid>`). A replay that drew the same ordinal for a different kind of
5
+ * entity than the one the log recorded there produces an event nobody can
6
+ * consume, and the decisive fact for diagnosing that is which pending
7
+ * invocation currently holds the ordinal. This looks it up by the shared ULID
8
+ * body, so a `wait_created` the log holds at a position where the replay is
9
+ * waiting on `step_<same ulid>` names that step.
10
+ */
11
+ export function findPendingItemAtOrdinal(invocationsQueue, correlationId) {
12
+ const exact = invocationsQueue.get(correlationId);
13
+ if (exact)
14
+ return exact;
15
+ const body = ordinalBody(correlationId);
16
+ if (!body)
17
+ return undefined;
18
+ for (const [id, item] of invocationsQueue) {
19
+ if (ordinalBody(id) === body)
20
+ return item;
21
+ }
22
+ return undefined;
23
+ }
24
+ function ordinalBody(correlationId) {
25
+ const at = correlationId.indexOf('_');
26
+ return at === -1 ? undefined : correlationId.slice(at + 1);
27
+ }
28
+ function describeQueueItem(item) {
29
+ switch (item.type) {
30
+ case 'step':
31
+ return `step ${item.stepName} (${item.correlationId})`;
32
+ case 'hook':
33
+ return `hook (${item.correlationId})`;
34
+ case 'wait':
35
+ return `wait (${item.correlationId})`;
36
+ case 'attribute':
37
+ return `attribute (${item.correlationId})`;
38
+ }
39
+ item;
40
+ return 'unknown';
41
+ }
42
+ /**
43
+ * The detail appended to a `ReplayDivergenceError` raised because the replay
44
+ * could not place an event. Callers keep their own leading sentence (tests and
45
+ * users match on it) and append this after it.
46
+ *
47
+ * Example:
48
+ * `pending at this id: step drainStep (step_01K…). consumer: index=41,
49
+ * length=44, parked=0, lastConsumed=evnt_01K…`
50
+ */
51
+ export function describeDivergenceContext(event, invocationsQueue, eventsConsumer) {
52
+ const pending = event.correlationId
53
+ ? findPendingItemAtOrdinal(invocationsQueue, event.correlationId)
54
+ : undefined;
55
+ const snapshot = eventsConsumer.describe();
56
+ return [
57
+ `pending at this id: ${pending ? describeQueueItem(pending) : 'none'}.`,
58
+ `consumer: index=${snapshot.index}, length=${snapshot.length}, parked=${snapshot.parked}, lastConsumed=${snapshot.lastConsumedEventId ?? 'none'}`,
59
+ ].join(' ');
60
+ }
61
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwbGF5LWRpdmVyZ2VuY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcmVwbGF5LWRpdmVyZ2VuY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUE7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxVQUFVLHdCQUF3QixDQUN0QyxnQkFBd0MsRUFDeEMsYUFBcUI7SUFFckIsTUFBTSxLQUFLLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ2xELElBQUksS0FBSztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ3hCLE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN4QyxJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQzVCLEtBQUssTUFBTSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1FBQzFDLElBQUksV0FBVyxDQUFDLEVBQUUsQ0FBQyxLQUFLLElBQUk7WUFBRSxPQUFPLElBQUksQ0FBQztJQUM1QyxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLGFBQXFCO0lBQ3hDLE1BQU0sRUFBRSxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdEMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDN0QsQ0FBQztBQUVELFNBQVMsaUJBQWlCLENBQUMsSUFBZTtJQUN4QyxRQUFRLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNsQixLQUFLLE1BQU07WUFDVCxPQUFPLFFBQVEsSUFBSSxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsYUFBYSxHQUFHLENBQUM7UUFDekQsS0FBSyxNQUFNO1lBQ1QsT0FBTyxTQUFTLElBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQztRQUN4QyxLQUFLLE1BQU07WUFDVCxPQUFPLFNBQVMsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDO1FBQ3hDLEtBQUssV0FBVztZQUNkLE9BQU8sY0FBYyxJQUFJLENBQUMsYUFBYSxHQUFHLENBQUM7SUFDL0MsQ0FBQztJQUNELElBQW9CLENBQUM7SUFDckIsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxVQUFVLHlCQUF5QixDQUN2QyxLQUFZLEVBQ1osZ0JBQXdDLEVBQ3hDLGNBQThCO0lBRTlCLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxhQUFhO1FBQ2pDLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsYUFBYSxDQUFDO1FBQ2pFLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDZCxNQUFNLFFBQVEsR0FBRyxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDM0MsT0FBTztRQUNMLHVCQUF1QixPQUFPLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUc7UUFDdkUsbUJBQW1CLFFBQVEsQ0FBQyxLQUFLLFlBQVksUUFBUSxDQUFDLE1BQU0sWUFBWSxRQUFRLENBQUMsTUFBTSxrQkFBa0IsUUFBUSxDQUFDLG1CQUFtQixJQUFJLE1BQU0sRUFBRTtLQUNsSixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEV2ZW50IH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB0eXBlIHsgRXZlbnRzQ29uc3VtZXIgfSBmcm9tICcuL2V2ZW50cy1jb25zdW1lci5qcyc7XG5pbXBvcnQgdHlwZSB7IFF1ZXVlSXRlbSB9IGZyb20gJy4vZ2xvYmFsLmpzJztcblxuLyoqXG4gKiBTdGVwLCB3YWl0LCBob29rIGFuZCBhdHRyaWJ1dGUgY29ycmVsYXRpb24gaWRzIHNoYXJlIG9uZSBVTElEIGRyYXcgcGVyXG4gKiBlbnRpdHksIHByZWZpeGVkIGJ5IGtpbmQgKGBzdGVwXzx1bGlkPmAsIGB3YWl0Xzx1bGlkPmAsIGBob29rXzx1bGlkPmAsXG4gKiBgYXR0cl88dWxpZD5gKS4gQSByZXBsYXkgdGhhdCBkcmV3IHRoZSBzYW1lIG9yZGluYWwgZm9yIGEgZGlmZmVyZW50IGtpbmQgb2ZcbiAqIGVudGl0eSB0aGFuIHRoZSBvbmUgdGhlIGxvZyByZWNvcmRlZCB0aGVyZSBwcm9kdWNlcyBhbiBldmVudCBub2JvZHkgY2FuXG4gKiBjb25zdW1lLCBhbmQgdGhlIGRlY2lzaXZlIGZhY3QgZm9yIGRpYWdub3NpbmcgdGhhdCBpcyB3aGljaCBwZW5kaW5nXG4gKiBpbnZvY2F0aW9uIGN1cnJlbnRseSBob2xkcyB0aGUgb3JkaW5hbC4gVGhpcyBsb29rcyBpdCB1cCBieSB0aGUgc2hhcmVkIFVMSURcbiAqIGJvZHksIHNvIGEgYHdhaXRfY3JlYXRlZGAgdGhlIGxvZyBob2xkcyBhdCBhIHBvc2l0aW9uIHdoZXJlIHRoZSByZXBsYXkgaXNcbiAqIHdhaXRpbmcgb24gYHN0ZXBfPHNhbWUgdWxpZD5gIG5hbWVzIHRoYXQgc3RlcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRQZW5kaW5nSXRlbUF0T3JkaW5hbChcbiAgaW52b2NhdGlvbnNRdWV1ZTogTWFwPHN0cmluZywgUXVldWVJdGVtPixcbiAgY29ycmVsYXRpb25JZDogc3RyaW5nXG4pOiBRdWV1ZUl0ZW0gfCB1bmRlZmluZWQge1xuICBjb25zdCBleGFjdCA9IGludm9jYXRpb25zUXVldWUuZ2V0KGNvcnJlbGF0aW9uSWQpO1xuICBpZiAoZXhhY3QpIHJldHVybiBleGFjdDtcbiAgY29uc3QgYm9keSA9IG9yZGluYWxCb2R5KGNvcnJlbGF0aW9uSWQpO1xuICBpZiAoIWJvZHkpIHJldHVybiB1bmRlZmluZWQ7XG4gIGZvciAoY29uc3QgW2lkLCBpdGVtXSBvZiBpbnZvY2F0aW9uc1F1ZXVlKSB7XG4gICAgaWYgKG9yZGluYWxCb2R5KGlkKSA9PT0gYm9keSkgcmV0dXJuIGl0ZW07XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gb3JkaW5hbEJvZHkoY29ycmVsYXRpb25JZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgYXQgPSBjb3JyZWxhdGlvbklkLmluZGV4T2YoJ18nKTtcbiAgcmV0dXJuIGF0ID09PSAtMSA/IHVuZGVmaW5lZCA6IGNvcnJlbGF0aW9uSWQuc2xpY2UoYXQgKyAxKTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVRdWV1ZUl0ZW0oaXRlbTogUXVldWVJdGVtKTogc3RyaW5nIHtcbiAgc3dpdGNoIChpdGVtLnR5cGUpIHtcbiAgICBjYXNlICdzdGVwJzpcbiAgICAgIHJldHVybiBgc3RlcCAke2l0ZW0uc3RlcE5hbWV9ICgke2l0ZW0uY29ycmVsYXRpb25JZH0pYDtcbiAgICBjYXNlICdob29rJzpcbiAgICAgIHJldHVybiBgaG9vayAoJHtpdGVtLmNvcnJlbGF0aW9uSWR9KWA7XG4gICAgY2FzZSAnd2FpdCc6XG4gICAgICByZXR1cm4gYHdhaXQgKCR7aXRlbS5jb3JyZWxhdGlvbklkfSlgO1xuICAgIGNhc2UgJ2F0dHJpYnV0ZSc6XG4gICAgICByZXR1cm4gYGF0dHJpYnV0ZSAoJHtpdGVtLmNvcnJlbGF0aW9uSWR9KWA7XG4gIH1cbiAgaXRlbSBzYXRpc2ZpZXMgbmV2ZXI7XG4gIHJldHVybiAndW5rbm93bic7XG59XG5cbi8qKlxuICogVGhlIGRldGFpbCBhcHBlbmRlZCB0byBhIGBSZXBsYXlEaXZlcmdlbmNlRXJyb3JgIHJhaXNlZCBiZWNhdXNlIHRoZSByZXBsYXlcbiAqIGNvdWxkIG5vdCBwbGFjZSBhbiBldmVudC4gQ2FsbGVycyBrZWVwIHRoZWlyIG93biBsZWFkaW5nIHNlbnRlbmNlICh0ZXN0cyBhbmRcbiAqIHVzZXJzIG1hdGNoIG9uIGl0KSBhbmQgYXBwZW5kIHRoaXMgYWZ0ZXIgaXQuXG4gKlxuICogRXhhbXBsZTpcbiAqIGBwZW5kaW5nIGF0IHRoaXMgaWQ6IHN0ZXAgZHJhaW5TdGVwIChzdGVwXzAxS+KApikuIGNvbnN1bWVyOiBpbmRleD00MSxcbiAqIGxlbmd0aD00NCwgcGFya2VkPTAsIGxhc3RDb25zdW1lZD1ldm50XzAxS+KApmBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlc2NyaWJlRGl2ZXJnZW5jZUNvbnRleHQoXG4gIGV2ZW50OiBFdmVudCxcbiAgaW52b2NhdGlvbnNRdWV1ZTogTWFwPHN0cmluZywgUXVldWVJdGVtPixcbiAgZXZlbnRzQ29uc3VtZXI6IEV2ZW50c0NvbnN1bWVyXG4pOiBzdHJpbmcge1xuICBjb25zdCBwZW5kaW5nID0gZXZlbnQuY29ycmVsYXRpb25JZFxuICAgID8gZmluZFBlbmRpbmdJdGVtQXRPcmRpbmFsKGludm9jYXRpb25zUXVldWUsIGV2ZW50LmNvcnJlbGF0aW9uSWQpXG4gICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHNuYXBzaG90ID0gZXZlbnRzQ29uc3VtZXIuZGVzY3JpYmUoKTtcbiAgcmV0dXJuIFtcbiAgICBgcGVuZGluZyBhdCB0aGlzIGlkOiAke3BlbmRpbmcgPyBkZXNjcmliZVF1ZXVlSXRlbShwZW5kaW5nKSA6ICdub25lJ30uYCxcbiAgICBgY29uc3VtZXI6IGluZGV4PSR7c25hcHNob3QuaW5kZXh9LCBsZW5ndGg9JHtzbmFwc2hvdC5sZW5ndGh9LCBwYXJrZWQ9JHtzbmFwc2hvdC5wYXJrZWR9LCBsYXN0Q29uc3VtZWQ9JHtzbmFwc2hvdC5sYXN0Q29uc3VtZWRFdmVudElkID8/ICdub25lJ31gLFxuICBdLmpvaW4oJyAnKTtcbn1cbiJdfQ==
@@ -0,0 +1,64 @@
1
+ import type { Event, WorkflowRun } from '@workflow/world';
2
+ import type { PayloadKey } from './serialization/encryption.js';
3
+ import { type PreparedReplayPayload, type ReplayPayloadPreparer } from './serialization.js';
4
+ type ReplayPayloadField = 'result' | 'error' | 'payload';
5
+ /**
6
+ * Invocation-scoped cache for replay payload hydration.
7
+ *
8
+ * A workflow invocation may replay the same event log through several fresh
9
+ * VMs. This cache keeps the VM-independent decrypt/decompress result across
10
+ * those replays. Deserialization still runs against each VM's globals so every
11
+ * replay receives fresh object graphs and correctly revived Workflow objects.
12
+ *
13
+ * Successful prepared plaintext and memoized primitive step results remain
14
+ * resident for the invocation lifetime. Their memory never crosses workflow
15
+ * runs or queue deliveries.
16
+ */
17
+ export declare class ReplayPayloadCache {
18
+ private readonly preparer;
19
+ private readonly preparedPayloads;
20
+ private readonly primitiveStepResults;
21
+ private readonly encryptionKey;
22
+ private nextUnscannedEventIndex;
23
+ constructor(encryptionKey: PayloadKey | undefined | Promise<PayloadKey | undefined>, preparer?: ReplayPayloadPreparer);
24
+ /** Start preparing an event payload as soon as its frame is decoded. */
25
+ prepareEvent(event: Event): void;
26
+ /**
27
+ * Start every missing binary preparation before workflow execution. Failures
28
+ * are intentionally retained: the ordered event consumer must observe the
29
+ * original rejection before that entry becomes retryable.
30
+ */
31
+ prewarm(workflowRun: WorkflowRun, events: Event[]): Promise<void>;
32
+ /** Rescan the next event log after an authoritative replacement. */
33
+ resetScan(): void;
34
+ /** Return the workflow input after shared host-side preparation. */
35
+ prepareWorkflowInput(workflowRun: WorkflowRun): Promise<PreparedReplayPayload>;
36
+ /**
37
+ * Return an event payload after shared host-side preparation. A rejected
38
+ * preparation is evicted only after this ordered consumer requests it, so a
39
+ * later replay can retry without hiding the original failure.
40
+ */
41
+ prepareEventPayload(eventId: string, field: ReplayPayloadField, value: unknown): Promise<PreparedReplayPayload>;
42
+ /**
43
+ * Reuse final step values only when sharing them across VMs is unobservable.
44
+ * Objects always run `hydrate` again to produce a fresh VM-specific value;
45
+ * every primitive is safe to reuse directly.
46
+ */
47
+ getStepResult(eventId: string, hydrate: () => Promise<unknown>): Promise<unknown>;
48
+ /**
49
+ * Consumer-facing lookup. Binary payloads share preparation; legacy values
50
+ * bypass the cache because their flattened representation may be mutated.
51
+ */
52
+ private consumePreparation;
53
+ /** Start preparation once and share the exact in-flight promise. */
54
+ private ensurePreparation;
55
+ /** Normalize synchronous and asynchronous preparers to one promise contract. */
56
+ private runPreparation;
57
+ /** Start one event's binary payload unless another path already did. */
58
+ private prepareEventIfMissing;
59
+ private startPreparation;
60
+ private workflowInputKey;
61
+ private eventPayloadKey;
62
+ }
63
+ export {};
64
+ //# sourceMappingURL=replay-payload-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replay-payload-cache.d.ts","sourceRoot":"","sources":["../src/replay-payload-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EACL,KAAK,qBAAqB,EAE1B,KAAK,qBAAqB,EAC3B,MAAM,oBAAoB,CAAC;AAE5B,KAAK,kBAAkB,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;AASzD;;;;;;;;;;;GAWG;AACH,qBAAa,kBAAkB;IAW3B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAV3B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAG7B;IACJ,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAA8B;IACnE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAkC;IAChE,OAAO,CAAC,uBAAuB,CAAK;gBAGlC,aAAa,EAAE,UAAU,GAAG,SAAS,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,EACtD,QAAQ,GAAE,qBAA4C;IAKzE,wEAAwE;IACxE,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAOhC;;;;OAIG;IACG,OAAO,CAAC,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBvE,oEAAoE;IACpE,SAAS,IAAI,IAAI;IAIjB,oEAAoE;IACpE,oBAAoB,CAClB,WAAW,EAAE,WAAW,GACvB,OAAO,CAAC,qBAAqB,CAAC;IAOjC;;;;OAIG;IACH,mBAAmB,CACjB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,kBAAkB,EACzB,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,qBAAqB,CAAC;IAIjC;;;;OAIG;IACG,aAAa,CACjB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,GAC9B,OAAO,CAAC,OAAO,CAAC;IAYnB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAe1B,oEAAoE;IACpE,OAAO,CAAC,iBAAiB;IAYzB,gFAAgF;YAClE,cAAc;IAI5B,wEAAwE;IACxE,OAAO,CAAC,qBAAqB;IAqC7B,OAAO,CAAC,gBAAgB;IAUxB,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,eAAe;CAGxB"}
@@ -0,0 +1,158 @@
1
+ import { prepareReplayPayload, } from './serialization.js';
2
+ function isMemoizablePrimitive(value) {
3
+ if (value === null)
4
+ return true;
5
+ const type = typeof value;
6
+ if (type === 'object' || type === 'function')
7
+ return false;
8
+ return true;
9
+ }
10
+ /**
11
+ * Invocation-scoped cache for replay payload hydration.
12
+ *
13
+ * A workflow invocation may replay the same event log through several fresh
14
+ * VMs. This cache keeps the VM-independent decrypt/decompress result across
15
+ * those replays. Deserialization still runs against each VM's globals so every
16
+ * replay receives fresh object graphs and correctly revived Workflow objects.
17
+ *
18
+ * Successful prepared plaintext and memoized primitive step results remain
19
+ * resident for the invocation lifetime. Their memory never crosses workflow
20
+ * runs or queue deliveries.
21
+ */
22
+ export class ReplayPayloadCache {
23
+ preparer;
24
+ preparedPayloads = new Map();
25
+ primitiveStepResults = new Map();
26
+ encryptionKey;
27
+ nextUnscannedEventIndex = 0;
28
+ constructor(encryptionKey, preparer = prepareReplayPayload) {
29
+ this.preparer = preparer;
30
+ this.encryptionKey = Promise.resolve(encryptionKey);
31
+ }
32
+ /** Start preparing an event payload as soon as its frame is decoded. */
33
+ prepareEvent(event) {
34
+ const preparation = this.prepareEventIfMissing(event);
35
+ // Streaming preparation is speculative. Its ordered consumer observes the
36
+ // original rejection and makes that cache entry retryable.
37
+ void preparation?.catch(() => { });
38
+ }
39
+ /**
40
+ * Start every missing binary preparation before workflow execution. Failures
41
+ * are intentionally retained: the ordered event consumer must observe the
42
+ * original rejection before that entry becomes retryable.
43
+ */
44
+ async prewarm(workflowRun, events) {
45
+ const preparations = [];
46
+ const workflowInput = this.startPreparation(this.workflowInputKey(workflowRun.runId), workflowRun.input);
47
+ if (workflowInput)
48
+ preparations.push(workflowInput);
49
+ for (let index = this.nextUnscannedEventIndex; index < events.length; index++) {
50
+ const event = events[index];
51
+ const preparation = this.prepareEventIfMissing(event);
52
+ if (preparation)
53
+ preparations.push(preparation);
54
+ }
55
+ this.nextUnscannedEventIndex = events.length;
56
+ // Prewarming is speculative and must not fail replay before the matching
57
+ // event is consumed. allSettled also attaches rejection handlers eagerly.
58
+ await Promise.allSettled(preparations);
59
+ }
60
+ /** Rescan the next event log after an authoritative replacement. */
61
+ resetScan() {
62
+ this.nextUnscannedEventIndex = 0;
63
+ }
64
+ /** Return the workflow input after shared host-side preparation. */
65
+ prepareWorkflowInput(workflowRun) {
66
+ return this.consumePreparation(this.workflowInputKey(workflowRun.runId), workflowRun.input);
67
+ }
68
+ /**
69
+ * Return an event payload after shared host-side preparation. A rejected
70
+ * preparation is evicted only after this ordered consumer requests it, so a
71
+ * later replay can retry without hiding the original failure.
72
+ */
73
+ prepareEventPayload(eventId, field, value) {
74
+ return this.consumePreparation(this.eventPayloadKey(eventId, field), value);
75
+ }
76
+ /**
77
+ * Reuse final step values only when sharing them across VMs is unobservable.
78
+ * Objects always run `hydrate` again to produce a fresh VM-specific value;
79
+ * every primitive is safe to reuse directly.
80
+ */
81
+ async getStepResult(eventId, hydrate) {
82
+ if (this.primitiveStepResults.has(eventId)) {
83
+ return this.primitiveStepResults.get(eventId);
84
+ }
85
+ const value = await hydrate();
86
+ if (isMemoizablePrimitive(value)) {
87
+ this.primitiveStepResults.set(eventId, value);
88
+ }
89
+ return value;
90
+ }
91
+ /**
92
+ * Consumer-facing lookup. Binary payloads share preparation; legacy values
93
+ * bypass the cache because their flattened representation may be mutated.
94
+ */
95
+ consumePreparation(cacheKey, value) {
96
+ if (!(value instanceof Uint8Array))
97
+ return this.runPreparation(value);
98
+ const preparation = this.ensurePreparation(cacheKey, value);
99
+ void preparation.catch(() => {
100
+ if (this.preparedPayloads.get(cacheKey) === preparation) {
101
+ this.preparedPayloads.delete(cacheKey);
102
+ }
103
+ });
104
+ return preparation;
105
+ }
106
+ /** Start preparation once and share the exact in-flight promise. */
107
+ ensurePreparation(cacheKey, value) {
108
+ const cached = this.preparedPayloads.get(cacheKey);
109
+ if (cached)
110
+ return cached;
111
+ const preparation = this.runPreparation(value);
112
+ this.preparedPayloads.set(cacheKey, preparation);
113
+ return preparation;
114
+ }
115
+ /** Normalize synchronous and asynchronous preparers to one promise contract. */
116
+ async runPreparation(value) {
117
+ return this.preparer(value, await this.encryptionKey);
118
+ }
119
+ /** Start one event's binary payload unless another path already did. */
120
+ prepareEventIfMissing(event) {
121
+ let field;
122
+ let value;
123
+ switch (event.eventType) {
124
+ case 'run_created':
125
+ return this.startPreparation(this.workflowInputKey(event.runId), event.eventData.input);
126
+ case 'run_started':
127
+ return this.startPreparation(this.workflowInputKey(event.runId), event.eventData?.input);
128
+ case 'step_completed':
129
+ field = 'result';
130
+ value = event.eventData?.result;
131
+ break;
132
+ case 'step_failed':
133
+ field = 'error';
134
+ value = event.eventData?.error;
135
+ break;
136
+ case 'hook_received':
137
+ field = 'payload';
138
+ value = event.eventData?.payload;
139
+ break;
140
+ default:
141
+ return undefined;
142
+ }
143
+ return this.startPreparation(this.eventPayloadKey(event.eventId, field), value);
144
+ }
145
+ startPreparation(cacheKey, value) {
146
+ if (!(value instanceof Uint8Array) || this.preparedPayloads.has(cacheKey)) {
147
+ return undefined;
148
+ }
149
+ return this.ensurePreparation(cacheKey, value);
150
+ }
151
+ workflowInputKey(runId) {
152
+ return `run:${runId}:input`;
153
+ }
154
+ eventPayloadKey(eventId, field) {
155
+ return `event:${eventId}:${field}`;
156
+ }
157
+ }
158
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwbGF5LXBheWxvYWQtY2FjaGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcmVwbGF5LXBheWxvYWQtY2FjaGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUVMLG9CQUFvQixHQUVyQixNQUFNLG9CQUFvQixDQUFDO0FBSTVCLFNBQVMscUJBQXFCLENBQUMsS0FBYztJQUMzQyxJQUFJLEtBQUssS0FBSyxJQUFJO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDaEMsTUFBTSxJQUFJLEdBQUcsT0FBTyxLQUFLLENBQUM7SUFDMUIsSUFBSSxJQUFJLEtBQUssUUFBUSxJQUFJLElBQUksS0FBSyxVQUFVO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDM0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLE9BQU8sa0JBQWtCO0lBV1Y7SUFWRixnQkFBZ0IsR0FBRyxJQUFJLEdBQUcsRUFHeEMsQ0FBQztJQUNhLG9CQUFvQixHQUFHLElBQUksR0FBRyxFQUFtQixDQUFDO0lBQ2xELGFBQWEsQ0FBa0M7SUFDeEQsdUJBQXVCLEdBQUcsQ0FBQyxDQUFDO0lBRXBDLFlBQ0UsYUFBdUUsRUFDdEQsV0FBa0Msb0JBQW9CO1FBQXRELGFBQVEsR0FBUixRQUFRLENBQThDO1FBRXZFLElBQUksQ0FBQyxhQUFhLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRUQsd0VBQXdFO0lBQ3hFLFlBQVksQ0FBQyxLQUFZO1FBQ3ZCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0RCwwRUFBMEU7UUFDMUUsMkRBQTJEO1FBQzNELEtBQUssV0FBVyxFQUFFLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FB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QUssQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDO2dCQUNoQyxNQUFNO1lBQ1IsS0FBSyxhQUFhO2dCQUNoQixLQUFLLEdBQUcsT0FBTyxDQUFDO2dCQUNoQixLQUFLLEdBQUcsS0FBSyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUM7Z0JBQy9CLE1BQU07WUFDUixLQUFLLGVBQWU7Z0JBQ2xCLEtBQUssR0FBRyxTQUFTLENBQUM7Z0JBQ2xCLEtBQUssR0FBRyxLQUFLLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQztnQkFDakMsTUFBTTtZQUNSO2dCQUNFLE9BQU8sU0FBUyxDQUFDO1FBQ3JCLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FDMUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxFQUMxQyxLQUFLLENBQ04sQ0FBQztJQUNKLENBQUM7SUFFTyxnQkFBZ0IsQ0FDdEIsUUFBZ0IsRUFDaEIsS0FBYztRQUVkLElBQUksQ0FBQyxDQUFDLEtBQUssWUFBWSxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDMUUsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRU8sZ0JBQWdCLENBQUMsS0FBYTtRQUNwQyxPQUFPLE9BQU8sS0FBSyxRQUFRLENBQUM7SUFDOUIsQ0FBQztJQUVPLGVBQWUsQ0FBQyxPQUFlLEVBQUUsS0FBeUI7UUFDaEUsT0FBTyxTQUFTLE9BQU8sSUFBSSxLQUFLLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEV2ZW50LCBXb3JrZmxvd1J1biB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgdHlwZSB7IFBheWxvYWRLZXkgfSBmcm9tICcuL3NlcmlhbGl6YXRpb24vZW5jcnlwdGlvbi5qcyc7XG5pbXBvcnQge1xuICB0eXBlIFByZXBhcmVkUmVwbGF5UGF5bG9hZCxcbiAgcHJlcGFyZVJlcGxheVBheWxvYWQsXG4gIHR5cGUgUmVwbGF5UGF5bG9hZFByZXBhcmVyLFxufSBmcm9tICcuL3NlcmlhbGl6YXRpb24uanMnO1xuXG50eXBlIFJlcGxheVBheWxvYWRGaWVsZCA9ICdyZXN1bHQnIHwgJ2Vycm9yJyB8ICdwYXlsb2FkJztcblxuZnVuY3Rpb24gaXNNZW1vaXphYmxlUHJpbWl0aXZlKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuIHRydWU7XG4gIGNvbnN0IHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIGlmICh0eXBlID09PSAnb2JqZWN0JyB8fCB0eXBlID09PSAnZnVuY3Rpb24nKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIEludm9jYXRpb24tc2NvcGVkIGNhY2hlIGZvciByZXBsYXkgcGF5bG9hZCBoeWRyYXRpb24uXG4gKlxuICogQSB3b3JrZmxvdyBpbnZvY2F0aW9uIG1heSByZXBsYXkgdGhlIHNhbWUgZXZlbnQgbG9nIHRocm91Z2ggc2V2ZXJhbCBmcmVzaFxuICogVk1zLiBUaGlzIGNhY2hlIGtlZXBzIHRoZSBWTS1pbmRlcGVuZGVudCBkZWNyeXB0L2RlY29tcHJlc3MgcmVzdWx0IGFjcm9zc1xuICogdGhvc2UgcmVwbGF5cy4gRGVzZXJpYWxpemF0aW9uIHN0aWxsIHJ1bnMgYWdhaW5zdCBlYWNoIFZNJ3MgZ2xvYmFscyBzbyBldmVyeVxuICogcmVwbGF5IHJlY2VpdmVzIGZyZXNoIG9iamVjdCBncmFwaHMgYW5kIGNvcnJlY3RseSByZXZpdmVkIFdvcmtmbG93IG9iamVjdHMuXG4gKlxuICogU3VjY2Vzc2Z1bCBwcmVwYXJlZCBwbGFpbnRleHQgYW5kIG1lbW9pemVkIHByaW1pdGl2ZSBzdGVwIHJlc3VsdHMgcmVtYWluXG4gKiByZXNpZGVudCBmb3IgdGhlIGludm9jYXRpb24gbGlmZXRpbWUuIFRoZWlyIG1lbW9yeSBuZXZlciBjcm9zc2VzIHdvcmtmbG93XG4gKiBydW5zIG9yIHF1ZXVlIGRlbGl2ZXJpZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBSZXBsYXlQYXlsb2FkQ2FjaGUge1xuICBwcml2YXRlIHJlYWRvbmx5IHByZXBhcmVkUGF5bG9hZHMgPSBuZXcgTWFwPFxuICAgIHN0cmluZyxcbiAgICBQcm9taXNlPFByZXBhcmVkUmVwbGF5UGF5bG9hZD5cbiAgPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHByaW1pdGl2ZVN0ZXBSZXN1bHRzID0gbmV3IE1hcDxzdHJpbmcsIHVua25vd24+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZW5jcnlwdGlvbktleTogUHJvbWlzZTxQYXlsb2FkS2V5IHwgdW5kZWZpbmVkPjtcbiAgcHJpdmF0ZSBuZXh0VW5zY2FubmVkRXZlbnRJbmRleCA9IDA7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgZW5jcnlwdGlvbktleTogUGF5bG9hZEtleSB8IHVuZGVmaW5lZCB8IFByb21pc2U8UGF5bG9hZEtleSB8IHVuZGVmaW5lZD4sXG4gICAgcHJpdmF0ZSByZWFkb25seSBwcmVwYXJlcjogUmVwbGF5UGF5bG9hZFByZXBhcmVyID0gcHJlcGFyZVJlcGxheVBheWxvYWRcbiAgKSB7XG4gICAgdGhpcy5lbmNyeXB0aW9uS2V5ID0gUHJvbWlzZS5yZXNvbHZlKGVuY3J5cHRpb25LZXkpO1xuICB9XG5cbiAgLyoqIFN0YXJ0IHByZXBhcmluZyBhbiBldmVudCBwYXlsb2FkIGFzIHNvb24gYXMgaXRzIGZyYW1lIGlzIGRlY29kZWQuICovXG4gIHByZXBhcmVFdmVudChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBwcmVwYXJhdGlvbiA9IHRoaXMucHJlcGFyZUV2ZW50SWZNaXNzaW5nKGV2ZW50KTtcbiAgICAvLyBTdHJlYW1pbmcgcHJlcGFyYXRpb24gaXMgc3BlY3VsYXRpdmUuIEl0cyBvcmRlcmVkIGNvbnN1bWVyIG9ic2VydmVzIHRoZVxuICAgIC8vIG9yaWdpbmFsIHJlamVjdGlvbiBhbmQgbWFrZXMgdGhhdCBjYWNoZSBlbnRyeSByZXRyeWFibGUuXG4gICAgdm9pZCBwcmVwYXJhdGlvbj8uY2F0Y2goKCkgPT4ge30pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0IGV2ZXJ5IG1pc3NpbmcgYmluYXJ5IHByZXBhcmF0aW9uIGJlZm9yZSB3b3JrZmxvdyBleGVjdXRpb24uIEZhaWx1cmVzXG4gICAqIGFyZSBpbnRlbnRpb25hbGx5IHJldGFpbmVkOiB0aGUgb3JkZXJlZCBldmVudCBjb25zdW1lciBtdXN0IG9ic2VydmUgdGhlXG4gICAqIG9yaWdpbmFsIHJlamVjdGlvbiBiZWZvcmUgdGhhdCBlbnRyeSBiZWNvbWVzIHJldHJ5YWJsZS5cbiAgICovXG4gIGFzeW5jIHByZXdhcm0od29ya2Zsb3dSdW46IFdvcmtmbG93UnVuLCBldmVudHM6IEV2ZW50W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwcmVwYXJhdGlvbnM6IFByb21pc2U8UHJlcGFyZWRSZXBsYXlQYXlsb2FkPltdID0gW107XG4gICAgY29uc3Qgd29ya2Zsb3dJbnB1dCA9IHRoaXMuc3RhcnRQcmVwYXJhdGlvbihcbiAgICAgIHRoaXMud29ya2Zsb3dJbnB1dEtleSh3b3JrZmxvd1J1bi5ydW5JZCksXG4gICAgICB3b3JrZmxvd1J1bi5pbnB1dFxuICAgICk7XG4gICAgaWYgKHdvcmtmbG93SW5wdXQpIHByZXBhcmF0aW9ucy5wdXNoKHdvcmtmbG93SW5wdXQpO1xuICAgIGZvciAoXG4gICAgICBsZXQgaW5kZXggPSB0aGlzLm5leHRVbnNjYW5uZWRFdmVudEluZGV4O1xuICAgICAgaW5kZXggPCBldmVudHMubGVuZ3RoO1xuICAgICAgaW5kZXgrK1xuICAgICkge1xuICAgICAgY29uc3QgZXZlbnQgPSBldmVudHNbaW5kZXhdO1xuICAgICAgY29uc3QgcHJlcGFyYXRpb24gPSB0aGlzLnByZXBhcmVFdmVudElmTWlzc2luZyhldmVudCk7XG4gICAgICBpZiAocHJlcGFyYXRpb24pIHByZXBhcmF0aW9ucy5wdXNoKHByZXBhcmF0aW9uKTtcbiAgICB9XG4gICAgdGhpcy5uZXh0VW5zY2FubmVkRXZlbnRJbmRleCA9IGV2ZW50cy5sZW5ndGg7XG5cbiAgICAvLyBQcmV3YXJtaW5nIGlzIHNwZWN1bGF0aXZlIGFuZCBtdXN0IG5vdCBmYWlsIHJlcGxheSBiZWZvcmUgdGhlIG1hdGNoaW5nXG4gICAgLy8gZXZlbnQgaXMgY29uc3VtZWQuIGFsbFNldHRsZWQgYWxzbyBhdHRhY2hlcyByZWplY3Rpb24gaGFuZGxlcnMgZWFnZXJseS5cbiAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQocHJlcGFyYXRpb25zKTtcbiAgfVxuXG4gIC8qKiBSZXNjYW4gdGhlIG5leHQgZXZlbnQgbG9nIGFmdGVyIGFuIGF1dGhvcml0YXRpdmUgcmVwbGFjZW1lbnQuICovXG4gIHJlc2V0U2NhbigpOiB2b2lkIHtcbiAgICB0aGlzLm5leHRVbnNjYW5uZWRFdmVudEluZGV4ID0gMDtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gdGhlIHdvcmtmbG93IGlucHV0IGFmdGVyIHNoYXJlZCBob3N0LXNpZGUgcHJlcGFyYXRpb24uICovXG4gIHByZXBhcmVXb3JrZmxvd0lucHV0KFxuICAgIHdvcmtmbG93UnVuOiBXb3JrZmxvd1J1blxuICApOiBQcm9taXNlPFByZXBhcmVkUmVwbGF5UGF5bG9hZD4ge1xuICAgIHJldHVybiB0aGlzLmNvbnN1bWVQcmVwYXJhdGlvbihcbiAgICAgIHRoaXMud29ya2Zsb3dJbnB1dEtleSh3b3JrZmxvd1J1bi5ydW5JZCksXG4gICAgICB3b3JrZmxvd1J1bi5pbnB1dFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGFuIGV2ZW50IHBheWxvYWQgYWZ0ZXIgc2hhcmVkIGhvc3Qtc2lkZSBwcmVwYXJhdGlvbi4gQSByZWplY3RlZFxuICAgKiBwcmVwYXJhdGlvbiBpcyBldmljdGVkIG9ubHkgYWZ0ZXIgdGhpcyBvcmRlcmVkIGNvbnN1bWVyIHJlcXVlc3RzIGl0LCBzbyBhXG4gICAqIGxhdGVyIHJlcGxheSBjYW4gcmV0cnkgd2l0aG91dCBoaWRpbmcgdGhlIG9yaWdpbmFsIGZhaWx1cmUuXG4gICAqL1xuICBwcmVwYXJlRXZlbnRQYXlsb2FkKFxuICAgIGV2ZW50SWQ6IHN0cmluZyxcbiAgICBmaWVsZDogUmVwbGF5UGF5bG9hZEZpZWxkLFxuICAgIHZhbHVlOiB1bmtub3duXG4gICk6IFByb21pc2U8UHJlcGFyZWRSZXBsYXlQYXlsb2FkPiB7XG4gICAgcmV0dXJuIHRoaXMuY29uc3VtZVByZXBhcmF0aW9uKHRoaXMuZXZlbnRQYXlsb2FkS2V5KGV2ZW50SWQsIGZpZWxkKSwgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldXNlIGZpbmFsIHN0ZXAgdmFsdWVzIG9ubHkgd2hlbiBzaGFyaW5nIHRoZW0gYWNyb3NzIFZNcyBpcyB1bm9ic2VydmFibGUuXG4gICAqIE9iamVjdHMgYWx3YXlzIHJ1biBgaHlkcmF0ZWAgYWdhaW4gdG8gcHJvZHVjZSBhIGZyZXNoIFZNLXNwZWNpZmljIHZhbHVlO1xuICAgKiBldmVyeSBwcmltaXRpdmUgaXMgc2FmZSB0byByZXVzZSBkaXJlY3RseS5cbiAgICovXG4gIGFzeW5jIGdldFN0ZXBSZXN1bHQoXG4gICAgZXZlbnRJZDogc3RyaW5nLFxuICAgIGh5ZHJhdGU6ICgpID0+IFByb21pc2U8dW5rbm93bj5cbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgaWYgKHRoaXMucHJpbWl0aXZlU3RlcFJlc3VsdHMuaGFzKGV2ZW50SWQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcmltaXRpdmVTdGVwUmVzdWx0cy5nZXQoZXZlbnRJZCk7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSBhd2FpdCBoeWRyYXRlKCk7XG4gICAgaWYgKGlzTWVtb2l6YWJsZVByaW1pdGl2ZSh2YWx1ZSkpIHtcbiAgICAgIHRoaXMucHJpbWl0aXZlU3RlcFJlc3VsdHMuc2V0KGV2ZW50SWQsIHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnN1bWVyLWZhY2luZyBsb29rdXAuIEJpbmFyeSBwYXlsb2FkcyBzaGFyZSBwcmVwYXJhdGlvbjsgbGVnYWN5IHZhbHVlc1xuICAgKiBieXBhc3MgdGhlIGNhY2hlIGJlY2F1c2UgdGhlaXIgZmxhdHRlbmVkIHJlcHJlc2VudGF0aW9uIG1heSBiZSBtdXRhdGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBjb25zdW1lUHJlcGFyYXRpb24oXG4gICAgY2FjaGVLZXk6IHN0cmluZyxcbiAgICB2YWx1ZTogdW5rbm93blxuICApOiBQcm9taXNlPFByZXBhcmVkUmVwbGF5UGF5bG9hZD4ge1xuICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHJldHVybiB0aGlzLnJ1blByZXBhcmF0aW9uKHZhbHVlKTtcblxuICAgIGNvbnN0IHByZXBhcmF0aW9uID0gdGhpcy5lbnN1cmVQcmVwYXJhdGlvbihjYWNoZUtleSwgdmFsdWUpO1xuICAgIHZvaWQgcHJlcGFyYXRpb24uY2F0Y2goKCkgPT4ge1xuICAgICAgaWYgKHRoaXMucHJlcGFyZWRQYXlsb2Fkcy5nZXQoY2FjaGVLZXkpID09PSBwcmVwYXJhdGlvbikge1xuICAgICAgICB0aGlzLnByZXBhcmVkUGF5bG9hZHMuZGVsZXRlKGNhY2hlS2V5KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcHJlcGFyYXRpb247XG4gIH1cblxuICAvKiogU3RhcnQgcHJlcGFyYXRpb24gb25jZSBhbmQgc2hhcmUgdGhlIGV4YWN0IGluLWZsaWdodCBwcm9taXNlLiAqL1xuICBwcml2YXRlIGVuc3VyZVByZXBhcmF0aW9uKFxuICAgIGNhY2hlS2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IFVpbnQ4QXJyYXlcbiAgKTogUHJvbWlzZTxQcmVwYXJlZFJlcGxheVBheWxvYWQ+IHtcbiAgICBjb25zdCBjYWNoZWQgPSB0aGlzLnByZXBhcmVkUGF5bG9hZHMuZ2V0KGNhY2hlS2V5KTtcbiAgICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuXG4gICAgY29uc3QgcHJlcGFyYXRpb24gPSB0aGlzLnJ1blByZXBhcmF0aW9uKHZhbHVlKTtcbiAgICB0aGlzLnByZXBhcmVkUGF5bG9hZHMuc2V0KGNhY2hlS2V5LCBwcmVwYXJhdGlvbik7XG4gICAgcmV0dXJuIHByZXBhcmF0aW9uO1xuICB9XG5cbiAgLyoqIE5vcm1hbGl6ZSBzeW5jaHJvbm91cyBhbmQgYXN5bmNocm9ub3VzIHByZXBhcmVycyB0byBvbmUgcHJvbWlzZSBjb250cmFjdC4gKi9cbiAgcHJpdmF0ZSBhc3luYyBydW5QcmVwYXJhdGlvbih2YWx1ZTogdW5rbm93bik6IFByb21pc2U8UHJlcGFyZWRSZXBsYXlQYXlsb2FkPiB7XG4gICAgcmV0dXJuIHRoaXMucHJlcGFyZXIodmFsdWUsIGF3YWl0IHRoaXMuZW5jcnlwdGlvbktleSk7XG4gIH1cblxuICAvKiogU3RhcnQgb25lIGV2ZW50J3MgYmluYXJ5IHBheWxvYWQgdW5sZXNzIGFub3RoZXIgcGF0aCBhbHJlYWR5IGRpZC4gKi9cbiAgcHJpdmF0ZSBwcmVwYXJlRXZlbnRJZk1pc3NpbmcoXG4gICAgZXZlbnQ6IEV2ZW50XG4gICk6IFByb21pc2U8UHJlcGFyZWRSZXBsYXlQYXlsb2FkPiB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGZpZWxkOiBSZXBsYXlQYXlsb2FkRmllbGQ7XG4gICAgbGV0IHZhbHVlOiB1bmtub3duO1xuICAgIHN3aXRjaCAoZXZlbnQuZXZlbnRUeXBlKSB7XG4gICAgICBjYXNlICdydW5fY3JlYXRlZCc6XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXJ0UHJlcGFyYXRpb24oXG4gICAgICAgICAgdGhpcy53b3JrZmxvd0lucHV0S2V5KGV2ZW50LnJ1bklkKSxcbiAgICAgICAgICBldmVudC5ldmVudERhdGEuaW5wdXRcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgJ3J1bl9zdGFydGVkJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnRQcmVwYXJhdGlvbihcbiAgICAgICAgICB0aGlzLndvcmtmbG93SW5wdXRLZXkoZXZlbnQucnVuSWQpLFxuICAgICAgICAgIGV2ZW50LmV2ZW50RGF0YT8uaW5wdXRcbiAgICAgICAgKTtcbiAgICAgIGNhc2UgJ3N0ZXBfY29tcGxldGVkJzpcbiAgICAgICAgZmllbGQgPSAncmVzdWx0JztcbiAgICAgICAgdmFsdWUgPSBldmVudC5ldmVudERhdGE/LnJlc3VsdDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzdGVwX2ZhaWxlZCc6XG4gICAgICAgIGZpZWxkID0gJ2Vycm9yJztcbiAgICAgICAgdmFsdWUgPSBldmVudC5ldmVudERhdGE/LmVycm9yO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2hvb2tfcmVjZWl2ZWQnOlxuICAgICAgICBmaWVsZCA9ICdwYXlsb2FkJztcbiAgICAgICAgdmFsdWUgPSBldmVudC5ldmVudERhdGE/LnBheWxvYWQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3RhcnRQcmVwYXJhdGlvbihcbiAgICAgIHRoaXMuZXZlbnRQYXlsb2FkS2V5KGV2ZW50LmV2ZW50SWQsIGZpZWxkKSxcbiAgICAgIHZhbHVlXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhcnRQcmVwYXJhdGlvbihcbiAgICBjYWNoZUtleTogc3RyaW5nLFxuICAgIHZhbHVlOiB1bmtub3duXG4gICk6IFByb21pc2U8UHJlcGFyZWRSZXBsYXlQYXlsb2FkPiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB8fCB0aGlzLnByZXBhcmVkUGF5bG9hZHMuaGFzKGNhY2hlS2V5KSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZW5zdXJlUHJlcGFyYXRpb24oY2FjaGVLZXksIHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgd29ya2Zsb3dJbnB1dEtleShydW5JZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYHJ1bjoke3J1bklkfTppbnB1dGA7XG4gIH1cblxuICBwcml2YXRlIGV2ZW50UGF5bG9hZEtleShldmVudElkOiBzdHJpbmcsIGZpZWxkOiBSZXBsYXlQYXlsb2FkRmllbGQpOiBzdHJpbmcge1xuICAgIHJldHVybiBgZXZlbnQ6JHtldmVudElkfToke2ZpZWxkfWA7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Identifier for the compute instance (microVM) this module was loaded into.
3
+ *
4
+ * Vercel exposes no native per-instance ID under Fluid compute (`AWS_LAMBDA_*`
5
+ * is blocked), so we synthesize one at module load: a prefixed ULID
6
+ * (`cinst_<ulid>`, per the `wrun_`/`step_` convention) whose timestamp is the
7
+ * instance's birth time. Stable for the instance's life and shared by every
8
+ * invocation it handles, including the concurrent ones Fluid packs onto it;
9
+ * cold starts mint fresh IDs. Emitted as the OpenTelemetry `faas.instance`
10
+ * attribute.
11
+ */
12
+ export declare const COMPUTE_INSTANCE_ID: string;
13
+ //# sourceMappingURL=compute-instance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compute-instance.d.ts","sourceRoot":"","sources":["../../src/runtime/compute-instance.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AACH,eAAO,MAAM,mBAAmB,QAAoB,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { ulid } from 'ulid';
2
+ /**
3
+ * Identifier for the compute instance (microVM) this module was loaded into.
4
+ *
5
+ * Vercel exposes no native per-instance ID under Fluid compute (`AWS_LAMBDA_*`
6
+ * is blocked), so we synthesize one at module load: a prefixed ULID
7
+ * (`cinst_<ulid>`, per the `wrun_`/`step_` convention) whose timestamp is the
8
+ * instance's birth time. Stable for the instance's life and shared by every
9
+ * invocation it handles, including the concurrent ones Fluid packs onto it;
10
+ * cold starts mint fresh IDs. Emitted as the OpenTelemetry `faas.instance`
11
+ * attribute.
12
+ */
13
+ export const COMPUTE_INSTANCE_ID = `cinst_${ulid()}`;
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcHV0ZS1pbnN0YW5jZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL2NvbXB1dGUtaW5zdGFuY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUU1Qjs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsU0FBUyxJQUFJLEVBQUUsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdWxpZCB9IGZyb20gJ3VsaWQnO1xuXG4vKipcbiAqIElkZW50aWZpZXIgZm9yIHRoZSBjb21wdXRlIGluc3RhbmNlIChtaWNyb1ZNKSB0aGlzIG1vZHVsZSB3YXMgbG9hZGVkIGludG8uXG4gKlxuICogVmVyY2VsIGV4cG9zZXMgbm8gbmF0aXZlIHBlci1pbnN0YW5jZSBJRCB1bmRlciBGbHVpZCBjb21wdXRlIChgQVdTX0xBTUJEQV8qYFxuICogaXMgYmxvY2tlZCksIHNvIHdlIHN5bnRoZXNpemUgb25lIGF0IG1vZHVsZSBsb2FkOiBhIHByZWZpeGVkIFVMSURcbiAqIChgY2luc3RfPHVsaWQ+YCwgcGVyIHRoZSBgd3J1bl9gL2BzdGVwX2AgY29udmVudGlvbikgd2hvc2UgdGltZXN0YW1wIGlzIHRoZVxuICogaW5zdGFuY2UncyBiaXJ0aCB0aW1lLiBTdGFibGUgZm9yIHRoZSBpbnN0YW5jZSdzIGxpZmUgYW5kIHNoYXJlZCBieSBldmVyeVxuICogaW52b2NhdGlvbiBpdCBoYW5kbGVzLCBpbmNsdWRpbmcgdGhlIGNvbmN1cnJlbnQgb25lcyBGbHVpZCBwYWNrcyBvbnRvIGl0O1xuICogY29sZCBzdGFydHMgbWludCBmcmVzaCBJRHMuIEVtaXR0ZWQgYXMgdGhlIE9wZW5UZWxlbWV0cnkgYGZhYXMuaW5zdGFuY2VgXG4gKiBhdHRyaWJ1dGUuXG4gKi9cbmV4cG9ydCBjb25zdCBDT01QVVRFX0lOU1RBTkNFX0lEID0gYGNpbnN0XyR7dWxpZCgpfWA7XG4iXX0=