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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (310) hide show
  1. package/dist/attribute-changes.d.ts +5 -0
  2. package/dist/attribute-changes.d.ts.map +1 -0
  3. package/dist/attribute-changes.js +25 -0
  4. package/dist/capabilities.d.ts +35 -2
  5. package/dist/capabilities.d.ts.map +1 -1
  6. package/dist/capabilities.js +74 -5
  7. package/dist/capture-stack.d.ts +1 -1
  8. package/dist/capture-stack.js +2 -2
  9. package/dist/class-serialization.d.ts +32 -0
  10. package/dist/class-serialization.d.ts.map +1 -1
  11. package/dist/class-serialization.js +37 -1
  12. package/dist/classify-error.d.ts +19 -3
  13. package/dist/classify-error.d.ts.map +1 -1
  14. package/dist/classify-error.js +98 -6
  15. package/dist/context-violation-error.d.ts +5 -5
  16. package/dist/context-violation-error.d.ts.map +1 -1
  17. package/dist/context-violation-error.js +8 -6
  18. package/dist/create-hook.d.ts +72 -7
  19. package/dist/create-hook.d.ts.map +1 -1
  20. package/dist/create-hook.js +1 -1
  21. package/dist/define-hook.js +2 -2
  22. package/dist/describe-error.d.ts +7 -7
  23. package/dist/describe-error.d.ts.map +1 -1
  24. package/dist/describe-error.js +97 -12
  25. package/dist/encryption.d.ts +38 -4
  26. package/dist/encryption.d.ts.map +1 -1
  27. package/dist/encryption.js +96 -14
  28. package/dist/events-consumer.d.ts +271 -0
  29. package/dist/events-consumer.d.ts.map +1 -1
  30. package/dist/events-consumer.js +646 -42
  31. package/dist/flushable-stream.d.ts +56 -1
  32. package/dist/flushable-stream.d.ts.map +1 -1
  33. package/dist/flushable-stream.js +123 -11
  34. package/dist/global.d.ts +36 -2
  35. package/dist/global.d.ts.map +1 -1
  36. package/dist/global.js +21 -6
  37. package/dist/index.d.ts +2 -1
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +3 -2
  40. package/dist/log-format.d.ts +2 -2
  41. package/dist/log-format.js +7 -7
  42. package/dist/logger.d.ts +1 -0
  43. package/dist/logger.d.ts.map +1 -1
  44. package/dist/logger.js +10 -6
  45. package/dist/private.d.ts +226 -9
  46. package/dist/private.d.ts.map +1 -1
  47. package/dist/private.js +626 -7
  48. package/dist/replay-payload-cache.d.ts +64 -0
  49. package/dist/replay-payload-cache.d.ts.map +1 -0
  50. package/dist/replay-payload-cache.js +158 -0
  51. package/dist/runtime/compute-instance.d.ts +13 -0
  52. package/dist/runtime/compute-instance.d.ts.map +1 -0
  53. package/dist/runtime/compute-instance.js +14 -0
  54. package/dist/runtime/constants.d.ts +315 -0
  55. package/dist/runtime/constants.d.ts.map +1 -1
  56. package/dist/runtime/constants.js +502 -16
  57. package/dist/runtime/count-step-started-events.d.ts +52 -0
  58. package/dist/runtime/count-step-started-events.d.ts.map +1 -0
  59. package/dist/runtime/count-step-started-events.js +72 -0
  60. package/dist/runtime/deployment-guard.d.ts +99 -0
  61. package/dist/runtime/deployment-guard.d.ts.map +1 -0
  62. package/dist/runtime/deployment-guard.js +154 -0
  63. package/dist/runtime/get-port-lazy.d.ts +15 -0
  64. package/dist/runtime/get-port-lazy.d.ts.map +1 -1
  65. package/dist/runtime/get-port-lazy.js +75 -6
  66. package/dist/runtime/get-world-lazy.d.ts +5 -14
  67. package/dist/runtime/get-world-lazy.d.ts.map +1 -1
  68. package/dist/runtime/get-world-lazy.js +19 -29
  69. package/dist/runtime/helpers.d.ts +341 -29
  70. package/dist/runtime/helpers.d.ts.map +1 -1
  71. package/dist/runtime/helpers.js +559 -57
  72. package/dist/runtime/quickjs-assets.generated.d.ts +14 -0
  73. package/dist/runtime/quickjs-assets.generated.d.ts.map +1 -0
  74. package/dist/runtime/quickjs-assets.generated.js +30 -0
  75. package/dist/runtime/quickjs-entrypoint.d.ts +136 -0
  76. package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -0
  77. package/dist/runtime/quickjs-entrypoint.js +1686 -0
  78. package/dist/runtime/quickjs-runtime.d.ts +244 -0
  79. package/dist/runtime/quickjs-runtime.d.ts.map +1 -0
  80. package/dist/runtime/quickjs-runtime.js +2427 -0
  81. package/dist/runtime/quickjs-serde.d.ts +107 -0
  82. package/dist/runtime/quickjs-serde.d.ts.map +1 -0
  83. package/dist/runtime/quickjs-serde.js +2159 -0
  84. package/dist/runtime/replay-budget.d.ts +97 -0
  85. package/dist/runtime/replay-budget.d.ts.map +1 -0
  86. package/dist/runtime/replay-budget.js +139 -0
  87. package/dist/runtime/replay-recovery-reporter.d.ts +36 -0
  88. package/dist/runtime/replay-recovery-reporter.d.ts.map +1 -0
  89. package/dist/runtime/replay-recovery-reporter.js +64 -0
  90. package/dist/runtime/resume-hook.d.ts +91 -8
  91. package/dist/runtime/resume-hook.d.ts.map +1 -1
  92. package/dist/runtime/resume-hook.js +512 -89
  93. package/dist/runtime/resume-latency.d.ts +150 -0
  94. package/dist/runtime/resume-latency.d.ts.map +1 -0
  95. package/dist/runtime/resume-latency.js +155 -0
  96. package/dist/runtime/run-id-time.d.ts +19 -0
  97. package/dist/runtime/run-id-time.d.ts.map +1 -0
  98. package/dist/runtime/run-id-time.js +42 -0
  99. package/dist/runtime/run.d.ts +72 -7
  100. package/dist/runtime/run.d.ts.map +1 -1
  101. package/dist/runtime/run.js +280 -53
  102. package/dist/runtime/runs.d.ts +54 -3
  103. package/dist/runtime/runs.d.ts.map +1 -1
  104. package/dist/runtime/runs.js +126 -16
  105. package/dist/runtime/start.d.ts +101 -2
  106. package/dist/runtime/start.d.ts.map +1 -1
  107. package/dist/runtime/start.js +352 -61
  108. package/dist/runtime/step-executor.d.ts +205 -5
  109. package/dist/runtime/step-executor.d.ts.map +1 -1
  110. package/dist/runtime/step-executor.js +760 -127
  111. package/dist/runtime/step-latency.d.ts +220 -0
  112. package/dist/runtime/step-latency.d.ts.map +1 -0
  113. package/dist/runtime/step-latency.js +215 -0
  114. package/dist/runtime/step-ownership.d.ts +72 -0
  115. package/dist/runtime/step-ownership.d.ts.map +1 -0
  116. package/dist/runtime/step-ownership.js +114 -0
  117. package/dist/runtime/step-single-flight.d.ts +12 -0
  118. package/dist/runtime/step-single-flight.d.ts.map +1 -0
  119. package/dist/runtime/step-single-flight.js +75 -0
  120. package/dist/runtime/suspension-handler.d.ts +269 -7
  121. package/dist/runtime/suspension-handler.d.ts.map +1 -1
  122. package/dist/runtime/suspension-handler.js +1253 -125
  123. package/dist/runtime/unserializable-step.d.ts +34 -0
  124. package/dist/runtime/unserializable-step.d.ts.map +1 -0
  125. package/dist/runtime/unserializable-step.js +52 -0
  126. package/dist/runtime/vm-mode.d.ts +44 -0
  127. package/dist/runtime/vm-mode.d.ts.map +1 -0
  128. package/dist/runtime/vm-mode.js +62 -0
  129. package/dist/runtime/vm-serde-bundle.generated.d.ts +14 -0
  130. package/dist/runtime/vm-serde-bundle.generated.d.ts.map +1 -0
  131. package/dist/runtime/vm-serde-bundle.generated.js +16 -0
  132. package/dist/runtime/wait-continuation.d.ts +106 -0
  133. package/dist/runtime/wait-continuation.d.ts.map +1 -0
  134. package/dist/runtime/wait-continuation.js +136 -0
  135. package/dist/runtime/wait-until.d.ts +18 -0
  136. package/dist/runtime/wait-until.d.ts.map +1 -0
  137. package/dist/runtime/wait-until.js +42 -0
  138. package/dist/runtime/world-compatibility.d.ts +32 -0
  139. package/dist/runtime/world-compatibility.d.ts.map +1 -0
  140. package/dist/runtime/world-compatibility.js +44 -0
  141. package/dist/runtime/world-init.d.ts +17 -42
  142. package/dist/runtime/world-init.d.ts.map +1 -1
  143. package/dist/runtime/world-init.js +18 -43
  144. package/dist/runtime/world.d.ts +14 -2
  145. package/dist/runtime/world.d.ts.map +1 -1
  146. package/dist/runtime/world.js +75 -19
  147. package/dist/runtime.d.ts +10 -6
  148. package/dist/runtime.d.ts.map +1 -1
  149. package/dist/runtime.js +3741 -490
  150. package/dist/sealed-box.d.ts +167 -0
  151. package/dist/sealed-box.d.ts.map +1 -0
  152. package/dist/sealed-box.js +571 -0
  153. package/dist/serialization/client.d.ts +3 -3
  154. package/dist/serialization/client.d.ts.map +1 -1
  155. package/dist/serialization/client.js +8 -4
  156. package/dist/serialization/codec-devalue-vm.d.ts +16 -0
  157. package/dist/serialization/codec-devalue-vm.d.ts.map +1 -0
  158. package/dist/serialization/codec-devalue-vm.js +148 -0
  159. package/dist/serialization/codec-devalue.d.ts +1 -1
  160. package/dist/serialization/codec-devalue.d.ts.map +1 -1
  161. package/dist/serialization/codec-devalue.js +24 -6
  162. package/dist/serialization/codec.d.ts +37 -2
  163. package/dist/serialization/codec.d.ts.map +1 -1
  164. package/dist/serialization/codec.js +2 -2
  165. package/dist/serialization/compression.d.ts +105 -0
  166. package/dist/serialization/compression.d.ts.map +1 -0
  167. package/dist/serialization/compression.js +261 -0
  168. package/dist/serialization/encryption.d.ts +119 -17
  169. package/dist/serialization/encryption.d.ts.map +1 -1
  170. package/dist/serialization/encryption.js +152 -17
  171. package/dist/serialization/errors.d.ts +13 -0
  172. package/dist/serialization/errors.d.ts.map +1 -1
  173. package/dist/serialization/errors.js +20 -2
  174. package/dist/serialization/format.d.ts +6 -6
  175. package/dist/serialization/format.js +7 -7
  176. package/dist/serialization/hardened.d.ts +156 -0
  177. package/dist/serialization/hardened.d.ts.map +1 -0
  178. package/dist/serialization/hardened.js +538 -0
  179. package/dist/serialization/index.d.ts +10 -8
  180. package/dist/serialization/index.d.ts.map +1 -1
  181. package/dist/serialization/index.js +10 -8
  182. package/dist/serialization/reducers/class-vm.d.ts +20 -0
  183. package/dist/serialization/reducers/class-vm.d.ts.map +1 -0
  184. package/dist/serialization/reducers/class-vm.js +77 -0
  185. package/dist/serialization/reducers/class.d.ts.map +1 -1
  186. package/dist/serialization/reducers/class.js +11 -6
  187. package/dist/serialization/reducers/common-vm.d.ts +15 -0
  188. package/dist/serialization/reducers/common-vm.d.ts.map +1 -0
  189. package/dist/serialization/reducers/common-vm.js +616 -0
  190. package/dist/serialization/reducers/common.d.ts +1 -1
  191. package/dist/serialization/reducers/common.d.ts.map +1 -1
  192. package/dist/serialization/reducers/common.js +202 -62
  193. package/dist/serialization/reducers/step-function-vm.d.ts +44 -0
  194. package/dist/serialization/reducers/step-function-vm.d.ts.map +1 -0
  195. package/dist/serialization/reducers/step-function-vm.js +97 -0
  196. package/dist/serialization/reducers/step-function.d.ts.map +1 -1
  197. package/dist/serialization/reducers/step-function.js +25 -9
  198. package/dist/serialization/step.d.ts +4 -4
  199. package/dist/serialization/step.d.ts.map +1 -1
  200. package/dist/serialization/step.js +9 -5
  201. package/dist/serialization/types.d.ts +80 -1
  202. package/dist/serialization/types.d.ts.map +1 -1
  203. package/dist/serialization/types.js +15 -1
  204. package/dist/serialization/workflow-vm.d.ts +29 -0
  205. package/dist/serialization/workflow-vm.d.ts.map +1 -0
  206. package/dist/serialization/workflow-vm.js +74 -0
  207. package/dist/serialization-format.d.ts +64 -8
  208. package/dist/serialization-format.d.ts.map +1 -1
  209. package/dist/serialization-format.js +225 -73
  210. package/dist/serialization.d.ts +262 -34
  211. package/dist/serialization.d.ts.map +1 -1
  212. package/dist/serialization.js +1879 -274
  213. package/dist/set-attributes.d.ts +13 -0
  214. package/dist/set-attributes.d.ts.map +1 -0
  215. package/dist/set-attributes.js +60 -0
  216. package/dist/source-map.d.ts +25 -0
  217. package/dist/source-map.d.ts.map +1 -1
  218. package/dist/source-map.js +154 -10
  219. package/dist/step/context-storage.d.ts +61 -2
  220. package/dist/step/context-storage.d.ts.map +1 -1
  221. package/dist/step/context-storage.js +7 -5
  222. package/dist/step/writable-stream.d.ts +3 -3
  223. package/dist/step/writable-stream.d.ts.map +1 -1
  224. package/dist/step/writable-stream.js +72 -9
  225. package/dist/step.d.ts.map +1 -1
  226. package/dist/step.js +148 -27
  227. package/dist/symbols.d.ts +50 -0
  228. package/dist/symbols.d.ts.map +1 -1
  229. package/dist/symbols.js +51 -1
  230. package/dist/telemetry/semantic-conventions.d.ts +397 -2
  231. package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
  232. package/dist/telemetry/semantic-conventions.js +297 -3
  233. package/dist/telemetry.d.ts +91 -0
  234. package/dist/telemetry.d.ts.map +1 -1
  235. package/dist/telemetry.js +244 -17
  236. package/dist/test-support/orchestrator-context.d.ts +25 -0
  237. package/dist/test-support/orchestrator-context.d.ts.map +1 -0
  238. package/dist/test-support/orchestrator-context.js +101 -0
  239. package/dist/types.d.ts +6 -0
  240. package/dist/types.d.ts.map +1 -1
  241. package/dist/types.js +23 -1
  242. package/dist/util.d.ts +0 -5
  243. package/dist/util.d.ts.map +1 -1
  244. package/dist/util.js +1 -15
  245. package/dist/version.d.ts +1 -1
  246. package/dist/version.d.ts.map +1 -1
  247. package/dist/version.js +2 -2
  248. package/dist/vm/index.d.ts.map +1 -1
  249. package/dist/vm/index.js +84 -14
  250. package/dist/vm/script-cache.d.ts +26 -0
  251. package/dist/vm/script-cache.d.ts.map +1 -0
  252. package/dist/vm/script-cache.js +131 -0
  253. package/dist/vm/uint8array-base64.js +1 -1
  254. package/dist/workflow/abort-controller.d.ts +2 -2
  255. package/dist/workflow/abort-controller.d.ts.map +1 -1
  256. package/dist/workflow/abort-controller.js +88 -21
  257. package/dist/workflow/attribute-dispatcher.d.ts +6 -0
  258. package/dist/workflow/attribute-dispatcher.d.ts.map +1 -0
  259. package/dist/workflow/attribute-dispatcher.js +45 -0
  260. package/dist/workflow/create-hook.d.ts.map +1 -1
  261. package/dist/workflow/create-hook.js +24 -3
  262. package/dist/workflow/get-workflow-metadata.js +2 -2
  263. package/dist/workflow/hook.d.ts.map +1 -1
  264. package/dist/workflow/hook.js +304 -47
  265. package/dist/workflow/index.d.ts +1 -0
  266. package/dist/workflow/index.d.ts.map +1 -1
  267. package/dist/workflow/index.js +2 -1
  268. package/dist/workflow/set-attributes.d.ts +68 -0
  269. package/dist/workflow/set-attributes.d.ts.map +1 -0
  270. package/dist/workflow/set-attributes.js +60 -0
  271. package/dist/workflow/sleep.d.ts.map +1 -1
  272. package/dist/workflow/sleep.js +58 -12
  273. package/dist/workflow/world-init-stub.d.ts +3 -3
  274. package/dist/workflow/world-init-stub.js +4 -4
  275. package/dist/workflow.d.ts +95 -3
  276. package/dist/workflow.d.ts.map +1 -1
  277. package/dist/workflow.js +895 -561
  278. package/docs/api-reference/create-hook.mdx +89 -10
  279. package/docs/api-reference/create-webhook.mdx +16 -15
  280. package/docs/api-reference/define-hook.mdx +35 -33
  281. package/docs/api-reference/fatal-error.mdx +30 -8
  282. package/docs/api-reference/fetch.mdx +14 -10
  283. package/docs/api-reference/get-step-metadata.mdx +2 -2
  284. package/docs/api-reference/get-workflow-metadata.mdx +3 -3
  285. package/docs/api-reference/get-writable.mdx +7 -7
  286. package/docs/api-reference/index.mdx +4 -1
  287. package/docs/api-reference/retryable-error.mdx +1 -1
  288. package/docs/api-reference/set-attributes.mdx +61 -0
  289. package/docs/api-reference/sleep.mdx +4 -4
  290. package/docs/foundations/cancellation.mdx +31 -32
  291. package/docs/foundations/errors-and-retries.mdx +42 -11
  292. package/docs/foundations/hooks.mdx +64 -35
  293. package/docs/foundations/idempotency.mdx +244 -12
  294. package/docs/foundations/index.mdx +1 -23
  295. package/docs/foundations/meta.json +2 -1
  296. package/docs/foundations/serialization.mdx +21 -22
  297. package/docs/foundations/starting-workflows.mdx +106 -30
  298. package/docs/foundations/streaming.mdx +107 -59
  299. package/docs/foundations/versioning.mdx +263 -0
  300. package/docs/foundations/workflows-and-steps.mdx +9 -9
  301. package/docs/how-it-works/cancellation.mdx +63 -63
  302. package/docs/how-it-works/code-transform.mdx +83 -67
  303. package/docs/how-it-works/encryption.mdx +30 -26
  304. package/docs/how-it-works/event-sourcing.mdx +98 -34
  305. package/docs/how-it-works/framework-integrations.mdx +96 -337
  306. package/docs/how-it-works/understanding-directives.mdx +22 -22
  307. package/package.json +24 -15
  308. package/dist/runtime/step-handler.d.ts +0 -2
  309. package/dist/runtime/step-handler.d.ts.map +0 -1
  310. package/dist/runtime/step-handler.js +0 -776
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Wait-continuation dispatch: delay + idempotency-key selection.
3
+ *
4
+ * When V2 suspension processing observes a pending wait, it enqueues a
5
+ * delayed "continuation" message that fires once the wait elapses and
6
+ * drives the next replay (which completes the wait via the "complete
7
+ * elapsed waits" pass). This module decides the message's `delaySeconds`
8
+ * and `idempotencyKey`.
9
+ *
10
+ * The continuation is keyed on the wait's correlationId: while a wait is
11
+ * pending, every replay pass over the run re-observes it (e.g., once per
12
+ * step completion in `Promise.all([steps..., sleep()])`), and without
13
+ * dedupe each pass would enqueue another delayed continuation: each one
14
+ * a spurious full replay when the wait elapses, and each a fresh message
15
+ * that resets the delivery-attempt runaway guard. A key is attached in
16
+ * all cases: some worlds (e.g. world-postgres) serialize key-less
17
+ * workflow messages per run, which would park the continuation behind
18
+ * the handler's own inline step execution and defeat the race semantics
19
+ * the continuation exists to provide.
20
+ *
21
+ * The bare correlationId cannot be the key in every case, though: world
22
+ * dedupe windows outlive the first delivery (VQS keeps idempotency
23
+ * records until message-retention TTL; world-postgres keeps a
24
+ * completed-keys cache), so once a key has been used, a later enqueue
25
+ * under the same key is silently dropped. Any situation where a
26
+ * continuation is delivered while its wait is still pending therefore
27
+ * needs a fresh key for the re-enqueue, or the wait's timer is lost and
28
+ * the run stalls until unrelated traffic happens to wake it. Two such
29
+ * situations exist, each with its own key variation:
30
+ *
31
+ * - Waits longer than the maximum queue delay are chained: the delay is
32
+ * clamped to `WAIT_CONTINUATION_MAX_DELAY_SECONDS` (23h: VQS messages
33
+ * have a 24h retention limit, and one hour of buffer matches
34
+ * world-vercel's own clamp for delayed re-enqueues), so the
35
+ * continuation intentionally fires early, re-observes the wait, and
36
+ * must enqueue the next hop. The key is suffixed with the hop index
37
+ * (`ceil(timeoutSeconds / maxDelay)`): stable for every re-observation
38
+ * within the same hop window (so passes dedupe), decremented at each
39
+ * hop delivery (so the chain always advances). Worlds without a delay
40
+ * limit (world-postgres, world-local) take the same ≤23h hops.
41
+ *
42
+ * - Near-elapsed waits (≤2s remaining) get a second-bucketed suffix. A
43
+ * continuation delivered marginally early (clock skew between the
44
+ * enqueuing and handling hosts; the ceil() on the delay can leave a ~0
45
+ * margin) re-observes the wait as pending with ~1s remaining and must
46
+ * be able to enqueue a fresh short-delay retry. The bucket suffix
47
+ * keeps that retry enqueueable (its ≥1s delay guarantees a later
48
+ * bucket) while still collapsing same-instant duplicates.
49
+ *
50
+ * Mid-range waits (more than the near-elapsed threshold, at most one
51
+ * hop) use the bare correlationId: every re-observation targets the same
52
+ * deadline, so deduping to the first message is semantically lossless.
53
+ *
54
+ * That last case used to be the one hole in the scheme, and it was not
55
+ * theoretical. Any delivery early enough to re-observe its own wait as
56
+ * pending burns the bare key on the way in: the re-enqueue is dropped by
57
+ * the dedupe window, nothing else is scheduled to wake the run, and no
58
+ * backstop exists for a wait the way inline step ownership provides one
59
+ * for a step. The run sleeps forever. Waits over the threshold have zero
60
+ * tolerance for it, which is why an infrastructure change in delivery
61
+ * timing was able to strand runs across every published SDK version at
62
+ * once, all of them keyed this way.
63
+ *
64
+ * So the key is no longer derived from the wait alone. A continuation
65
+ * carries the wait it was armed for and its attempt number
66
+ * ({@link WorkflowInvokePayload.waitContinuation}), and an invocation
67
+ * that recognizes itself as the continuation for a wait that is still
68
+ * pending arms the next one at `attempt + 1`. Attempts advance ONLY when
69
+ * an early delivery actually happens, so the normal path is untouched:
70
+ * attempt 0 keys exactly as before, and every re-observation within one
71
+ * attempt still collapses to a single message.
72
+ */
73
+ import { envNumber } from '@workflow/world';
74
+ /**
75
+ * Maximum `delaySeconds` for a single wait-continuation message. Waits
76
+ * longer than this are chained across multiple hops. 23 hours leaves a 1h
77
+ * buffer under Vercel Queues' default 24h message TTL and mirrors
78
+ * world-vercel's `MAX_DELAY_SECONDS`.
79
+ */
80
+ export const WAIT_CONTINUATION_MAX_DELAY_SECONDS = 82_800;
81
+ /**
82
+ * Waits with at most this many seconds remaining use a second-bucketed
83
+ * idempotency key so an early-delivered continuation can re-enqueue its
84
+ * short-delay retry. This is also the host clock-skew tolerance for
85
+ * mid-range waits keyed on the bare correlationId.
86
+ */
87
+ export const NEAR_ELAPSED_WAIT_THRESHOLD_SECONDS = 2;
88
+ /** Effective max continuation delay. Override: `WORKFLOW_WAIT_CONTINUATION_MAX_DELAY_SECONDS`. */
89
+ const getWaitContinuationMaxDelaySeconds = () => envNumber('WORKFLOW_WAIT_CONTINUATION_MAX_DELAY_SECONDS', WAIT_CONTINUATION_MAX_DELAY_SECONDS, { integer: true, min: 1 });
90
+ /** Effective near-elapsed threshold. Override: `WORKFLOW_NEAR_ELAPSED_WAIT_THRESHOLD_SECONDS`. */
91
+ const getNearElapsedWaitThresholdSeconds = () => envNumber('WORKFLOW_NEAR_ELAPSED_WAIT_THRESHOLD_SECONDS', NEAR_ELAPSED_WAIT_THRESHOLD_SECONDS);
92
+ /**
93
+ * Computes the queue delay and idempotency key for a wait-continuation
94
+ * message. `timeoutSeconds` is the time until the wait's `resumeAt`
95
+ * (floored at 1s by the suspension handler); `waitCorrelationId`
96
+ * identifies the wait so repeated suspension passes dedupe.
97
+ *
98
+ * `attempt` is the number of continuations already spent on this wait, taken
99
+ * from the incoming message when this invocation IS one of them (see
100
+ * {@link WorkflowInvokePayload.waitContinuation}). It only ever moves when a
101
+ * continuation arrived before its wait elapsed, which is exactly when the
102
+ * previous key is spent and re-using it would drop the message. Attempt 0
103
+ * keys identically to the scheme before attempts existed, so the ordinary
104
+ * path — arm once, deliver once, complete — is byte-for-byte unchanged.
105
+ */
106
+ export function getWaitContinuationDispatch(timeoutSeconds, waitCorrelationId, now = Date.now(), attempt = 0) {
107
+ const dispatch = waitContinuationDispatchForAttemptZero(timeoutSeconds, waitCorrelationId, now);
108
+ if (attempt <= 0)
109
+ return dispatch;
110
+ return {
111
+ delaySeconds: dispatch.delaySeconds,
112
+ idempotencyKey: `${dispatch.idempotencyKey}:a${attempt}`,
113
+ };
114
+ }
115
+ function waitContinuationDispatchForAttemptZero(timeoutSeconds, waitCorrelationId, now) {
116
+ const maxDelaySeconds = getWaitContinuationMaxDelaySeconds();
117
+ // The near-elapsed branch returns the full remaining time as the delay, so
118
+ // its threshold can never exceed the max delay. Otherwise a wait between the
119
+ // max and the threshold would be dispatched with a delay above the max. Cap
120
+ // the threshold at the max so every branch yields a delay within it. (With
121
+ // defaults, threshold 2s and max 82_800s, this is a no-op; it only bites
122
+ // when the max is tuned down below the threshold for testing.)
123
+ const nearElapsedThreshold = Math.min(getNearElapsedWaitThresholdSeconds(), maxDelaySeconds);
124
+ if (timeoutSeconds <= nearElapsedThreshold) {
125
+ return {
126
+ delaySeconds: timeoutSeconds,
127
+ idempotencyKey: `${waitCorrelationId}:${Math.floor(now / 1000)}`,
128
+ };
129
+ }
130
+ const hop = Math.ceil(timeoutSeconds / maxDelaySeconds);
131
+ return {
132
+ delaySeconds: Math.min(timeoutSeconds, maxDelaySeconds),
133
+ idempotencyKey: hop === 1 ? waitCorrelationId : `${waitCorrelationId}:hop-${hop}`,
134
+ };
135
+ }
136
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FpdC1jb250aW51YXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS93YWl0LWNvbnRpbnVhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1RUc7QUFFSCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFNUM7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsTUFBTSxtQ0FBbUMsR0FBRyxNQUFNLENBQUM7QUFFMUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsTUFBTSxtQ0FBbUMsR0FBRyxDQUFDLENBQUM7QUFFckQsa0dBQWtHO0FBQ2xHLE1BQU0sa0NBQWtDLEdBQUcsR0FBVyxFQUFFLENBQ3RELFNBQVMsQ0FDUCw4Q0FBOEMsRUFDOUMsbUNBQW1DLEVBQ25DLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQzFCLENBQUM7QUFFSixrR0FBa0c7QUFDbEcsTUFBTSxrQ0FBa0MsR0FBRyxHQUFXLEVBQUUsQ0FDdEQsU0FBUyxDQUNQLDhDQUE4QyxFQUM5QyxtQ0FBbUMsQ0FDcEMsQ0FBQztBQU9KOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFNLFVBQVUsMkJBQTJCLENBQ3pDLGNBQXNCLEVBQ3RCLGlCQUF5QixFQUN6QixNQUFjLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFDeEIsT0FBTyxHQUFHLENBQUM7SUFFWCxNQUFNLFFBQVEsR0FBRyxzQ0FBc0MsQ0FDckQsY0FBYyxFQUNkLGlCQUFpQixFQUNqQixHQUFHLENBQ0osQ0FBQztJQUNGLElBQUksT0FBTyxJQUFJLENBQUM7UUFBRSxPQUFPLFFBQVEsQ0FBQztJQUNsQyxPQUFPO1FBQ0wsWUFBWSxFQUFFLFFBQVEsQ0FBQyxZQUFZO1FBQ25DLGNBQWMsRUFBRSxHQUFHLFFBQVEsQ0FBQyxjQUFjLEtBQUssT0FBTyxFQUFFO0tBQ3pELENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxzQ0FBc0MsQ0FDN0MsY0FBc0IsRUFDdEIsaUJBQXlCLEVBQ3pCLEdBQVc7SUFFWCxNQUFNLGVBQWUsR0FBRyxrQ0FBa0MsRUFBRSxDQUFDO0lBQzdELDJFQUEyRTtJQUMzRSw2RUFBNkU7SUFDN0UsNEVBQTRFO0lBQzVFLDJFQUEyRTtJQUMzRSx5RUFBeUU7SUFDekUsK0RBQStEO0lBQy9ELE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FDbkMsa0NBQWtDLEVBQUUsRUFDcEMsZUFBZSxDQUNoQixDQUFDO0lBQ0YsSUFBSSxjQUFjLElBQUksb0JBQW9CLEVBQUUsQ0FBQztRQUMzQyxPQUFPO1lBQ0wsWUFBWSxFQUFFLGNBQWM7WUFDNUIsY0FBYyxFQUFFLEdBQUcsaUJBQWlCLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUU7U0FDakUsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsR0FBRyxlQUFlLENBQUMsQ0FBQztJQUN4RCxPQUFPO1FBQ0wsWUFBWSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLGVBQWUsQ0FBQztRQUN2RCxjQUFjLEVBQ1osR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEdBQUcsaUJBQWlCLFFBQVEsR0FBRyxFQUFFO0tBQ3BFLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBXYWl0LWNvbnRpbnVhdGlvbiBkaXNwYXRjaDogZGVsYXkgKyBpZGVtcG90ZW5jeS1rZXkgc2VsZWN0aW9uLlxuICpcbiAqIFdoZW4gVjIgc3VzcGVuc2lvbiBwcm9jZXNzaW5nIG9ic2VydmVzIGEgcGVuZGluZyB3YWl0LCBpdCBlbnF1ZXVlcyBhXG4gKiBkZWxheWVkIFwiY29udGludWF0aW9uXCIgbWVzc2FnZSB0aGF0IGZpcmVzIG9uY2UgdGhlIHdhaXQgZWxhcHNlcyBhbmRcbiAqIGRyaXZlcyB0aGUgbmV4dCByZXBsYXkgKHdoaWNoIGNvbXBsZXRlcyB0aGUgd2FpdCB2aWEgdGhlIFwiY29tcGxldGVcbiAqIGVsYXBzZWQgd2FpdHNcIiBwYXNzKS4gVGhpcyBtb2R1bGUgZGVjaWRlcyB0aGUgbWVzc2FnZSdzIGBkZWxheVNlY29uZHNgXG4gKiBhbmQgYGlkZW1wb3RlbmN5S2V5YC5cbiAqXG4gKiBUaGUgY29udGludWF0aW9uIGlzIGtleWVkIG9uIHRoZSB3YWl0J3MgY29ycmVsYXRpb25JZDogd2hpbGUgYSB3YWl0IGlzXG4gKiBwZW5kaW5nLCBldmVyeSByZXBsYXkgcGFzcyBvdmVyIHRoZSBydW4gcmUtb2JzZXJ2ZXMgaXQgKGUuZy4sIG9uY2UgcGVyXG4gKiBzdGVwIGNvbXBsZXRpb24gaW4gYFByb21pc2UuYWxsKFtzdGVwcy4uLiwgc2xlZXAoKV0pYCksIGFuZCB3aXRob3V0XG4gKiBkZWR1cGUgZWFjaCBwYXNzIHdvdWxkIGVucXVldWUgYW5vdGhlciBkZWxheWVkIGNvbnRpbnVhdGlvbjogZWFjaCBvbmVcbiAqIGEgc3B1cmlvdXMgZnVsbCByZXBsYXkgd2hlbiB0aGUgd2FpdCBlbGFwc2VzLCBhbmQgZWFjaCBhIGZyZXNoIG1lc3NhZ2VcbiAqIHRoYXQgcmVzZXRzIHRoZSBkZWxpdmVyeS1hdHRlbXB0IHJ1bmF3YXkgZ3VhcmQuIEEga2V5IGlzIGF0dGFjaGVkIGluXG4gKiBhbGwgY2FzZXM6IHNvbWUgd29ybGRzIChlLmcuIHdvcmxkLXBvc3RncmVzKSBzZXJpYWxpemUga2V5LWxlc3NcbiAqIHdvcmtmbG93IG1lc3NhZ2VzIHBlciBydW4sIHdoaWNoIHdvdWxkIHBhcmsgdGhlIGNvbnRpbnVhdGlvbiBiZWhpbmRcbiAqIHRoZSBoYW5kbGVyJ3Mgb3duIGlubGluZSBzdGVwIGV4ZWN1dGlvbiBhbmQgZGVmZWF0IHRoZSByYWNlIHNlbWFudGljc1xuICogdGhlIGNvbnRpbnVhdGlvbiBleGlzdHMgdG8gcHJvdmlkZS5cbiAqXG4gKiBUaGUgYmFyZSBjb3JyZWxhdGlvbklkIGNhbm5vdCBiZSB0aGUga2V5IGluIGV2ZXJ5IGNhc2UsIHRob3VnaDogd29ybGRcbiAqIGRlZHVwZSB3aW5kb3dzIG91dGxpdmUgdGhlIGZpcnN0IGRlbGl2ZXJ5IChWUVMga2VlcHMgaWRlbXBvdGVuY3lcbiAqIHJlY29yZHMgdW50aWwgbWVzc2FnZS1yZXRlbnRpb24gVFRMOyB3b3JsZC1wb3N0Z3JlcyBrZWVwcyBhXG4gKiBjb21wbGV0ZWQta2V5cyBjYWNoZSksIHNvIG9uY2UgYSBrZXkgaGFzIGJlZW4gdXNlZCwgYSBsYXRlciBlbnF1ZXVlXG4gKiB1bmRlciB0aGUgc2FtZSBrZXkgaXMgc2lsZW50bHkgZHJvcHBlZC4gQW55IHNpdHVhdGlvbiB3aGVyZSBhXG4gKiBjb250aW51YXRpb24gaXMgZGVsaXZlcmVkIHdoaWxlIGl0cyB3YWl0IGlzIHN0aWxsIHBlbmRpbmcgdGhlcmVmb3JlXG4gKiBuZWVkcyBhIGZyZXNoIGtleSBmb3IgdGhlIHJlLWVucXVldWUsIG9yIHRoZSB3YWl0J3MgdGltZXIgaXMgbG9zdCBhbmRcbiAqIHRoZSBydW4gc3RhbGxzIHVudGlsIHVucmVsYXRlZCB0cmFmZmljIGhhcHBlbnMgdG8gd2FrZSBpdC4gVHdvIHN1Y2hcbiAqIHNpdHVhdGlvbnMgZXhpc3QsIGVhY2ggd2l0aCBpdHMgb3duIGtleSB2YXJpYXRpb246XG4gKlxuICogLSBXYWl0cyBsb25nZXIgdGhhbiB0aGUgbWF4aW11bSBxdWV1ZSBkZWxheSBhcmUgY2hhaW5lZDogdGhlIGRlbGF5IGlzXG4gKiAgIGNsYW1wZWQgdG8gYFdBSVRfQ09OVElOVUFUSU9OX01BWF9ERUxBWV9TRUNPTkRTYCAoMjNoOiBWUVMgbWVzc2FnZXNcbiAqICAgaGF2ZSBhIDI0aCByZXRlbnRpb24gbGltaXQsIGFuZCBvbmUgaG91ciBvZiBidWZmZXIgbWF0Y2hlc1xuICogICB3b3JsZC12ZXJjZWwncyBvd24gY2xhbXAgZm9yIGRlbGF5ZWQgcmUtZW5xdWV1ZXMpLCBzbyB0aGVcbiAqICAgY29udGludWF0aW9uIGludGVudGlvbmFsbHkgZmlyZXMgZWFybHksIHJlLW9ic2VydmVzIHRoZSB3YWl0LCBhbmRcbiAqICAgbXVzdCBlbnF1ZXVlIHRoZSBuZXh0IGhvcC4gVGhlIGtleSBpcyBzdWZmaXhlZCB3aXRoIHRoZSBob3AgaW5kZXhcbiAqICAgKGBjZWlsKHRpbWVvdXRTZWNvbmRzIC8gbWF4RGVsYXkpYCk6IHN0YWJsZSBmb3IgZXZlcnkgcmUtb2JzZXJ2YXRpb25cbiAqICAgd2l0aGluIHRoZSBzYW1lIGhvcCB3aW5kb3cgKHNvIHBhc3NlcyBkZWR1cGUpLCBkZWNyZW1lbnRlZCBhdCBlYWNoXG4gKiAgIGhvcCBkZWxpdmVyeSAoc28gdGhlIGNoYWluIGFsd2F5cyBhZHZhbmNlcykuIFdvcmxkcyB3aXRob3V0IGEgZGVsYXlcbiAqICAgbGltaXQgKHdvcmxkLXBvc3RncmVzLCB3b3JsZC1sb2NhbCkgdGFrZSB0aGUgc2FtZSDiiaQyM2ggaG9wcy5cbiAqXG4gKiAtIE5lYXItZWxhcHNlZCB3YWl0cyAo4omkMnMgcmVtYWluaW5nKSBnZXQgYSBzZWNvbmQtYnVja2V0ZWQgc3VmZml4LiBBXG4gKiAgIGNvbnRpbnVhdGlvbiBkZWxpdmVyZWQgbWFyZ2luYWxseSBlYXJseSAoY2xvY2sgc2tldyBiZXR3ZWVuIHRoZVxuICogICBlbnF1ZXVpbmcgYW5kIGhhbmRsaW5nIGhvc3RzOyB0aGUgY2VpbCgpIG9uIHRoZSBkZWxheSBjYW4gbGVhdmUgYSB+MFxuICogICBtYXJnaW4pIHJlLW9ic2VydmVzIHRoZSB3YWl0IGFzIHBlbmRpbmcgd2l0aCB+MXMgcmVtYWluaW5nIGFuZCBtdXN0XG4gKiAgIGJlIGFibGUgdG8gZW5xdWV1ZSBhIGZyZXNoIHNob3J0LWRlbGF5IHJldHJ5LiBUaGUgYnVja2V0IHN1ZmZpeFxuICogICBrZWVwcyB0aGF0IHJldHJ5IGVucXVldWVhYmxlIChpdHMg4omlMXMgZGVsYXkgZ3VhcmFudGVlcyBhIGxhdGVyXG4gKiAgIGJ1Y2tldCkgd2hpbGUgc3RpbGwgY29sbGFwc2luZyBzYW1lLWluc3RhbnQgZHVwbGljYXRlcy5cbiAqXG4gKiBNaWQtcmFuZ2Ugd2FpdHMgKG1vcmUgdGhhbiB0aGUgbmVhci1lbGFwc2VkIHRocmVzaG9sZCwgYXQgbW9zdCBvbmVcbiAqIGhvcCkgdXNlIHRoZSBiYXJlIGNvcnJlbGF0aW9uSWQ6IGV2ZXJ5IHJlLW9ic2VydmF0aW9uIHRhcmdldHMgdGhlIHNhbWVcbiAqIGRlYWRsaW5lLCBzbyBkZWR1cGluZyB0byB0aGUgZmlyc3QgbWVzc2FnZSBpcyBzZW1hbnRpY2FsbHkgbG9zc2xlc3MuXG4gKlxuICogVGhhdCBsYXN0IGNhc2UgdXNlZCB0byBiZSB0aGUgb25lIGhvbGUgaW4gdGhlIHNjaGVtZSwgYW5kIGl0IHdhcyBub3RcbiAqIHRoZW9yZXRpY2FsLiBBbnkgZGVsaXZlcnkgZWFybHkgZW5vdWdoIHRvIHJlLW9ic2VydmUgaXRzIG93biB3YWl0IGFzXG4gKiBwZW5kaW5nIGJ1cm5zIHRoZSBiYXJlIGtleSBvbiB0aGUgd2F5IGluOiB0aGUgcmUtZW5xdWV1ZSBpcyBkcm9wcGVkIGJ5XG4gKiB0aGUgZGVkdXBlIHdpbmRvdywgbm90aGluZyBlbHNlIGlzIHNjaGVkdWxlZCB0byB3YWtlIHRoZSBydW4sIGFuZCBub1xuICogYmFja3N0b3AgZXhpc3RzIGZvciBhIHdhaXQgdGhlIHdheSBpbmxpbmUgc3RlcCBvd25lcnNoaXAgcHJvdmlkZXMgb25lXG4gKiBmb3IgYSBzdGVwLiBUaGUgcnVuIHNsZWVwcyBmb3JldmVyLiBXYWl0cyBvdmVyIHRoZSB0aHJlc2hvbGQgaGF2ZSB6ZXJvXG4gKiB0b2xlcmFuY2UgZm9yIGl0LCB3aGljaCBpcyB3aHkgYW4gaW5mcmFzdHJ1Y3R1cmUgY2hhbmdlIGluIGRlbGl2ZXJ5XG4gKiB0aW1pbmcgd2FzIGFibGUgdG8gc3RyYW5kIHJ1bnMgYWNyb3NzIGV2ZXJ5IHB1Ymxpc2hlZCBTREsgdmVyc2lvbiBhdFxuICogb25jZSwgYWxsIG9mIHRoZW0ga2V5ZWQgdGhpcyB3YXkuXG4gKlxuICogU28gdGhlIGtleSBpcyBubyBsb25nZXIgZGVyaXZlZCBmcm9tIHRoZSB3YWl0IGFsb25lLiBBIGNvbnRpbnVhdGlvblxuICogY2FycmllcyB0aGUgd2FpdCBpdCB3YXMgYXJtZWQgZm9yIGFuZCBpdHMgYXR0ZW1wdCBudW1iZXJcbiAqICh7QGxpbmsgV29ya2Zsb3dJbnZva2VQYXlsb2FkLndhaXRDb250aW51YXRpb259KSwgYW5kIGFuIGludm9jYXRpb25cbiAqIHRoYXQgcmVjb2duaXplcyBpdHNlbGYgYXMgdGhlIGNvbnRpbnVhdGlvbiBmb3IgYSB3YWl0IHRoYXQgaXMgc3RpbGxcbiAqIHBlbmRpbmcgYXJtcyB0aGUgbmV4dCBvbmUgYXQgYGF0dGVtcHQgKyAxYC4gQXR0ZW1wdHMgYWR2YW5jZSBPTkxZIHdoZW5cbiAqIGFuIGVhcmx5IGRlbGl2ZXJ5IGFjdHVhbGx5IGhhcHBlbnMsIHNvIHRoZSBub3JtYWwgcGF0aCBpcyB1bnRvdWNoZWQ6XG4gKiBhdHRlbXB0IDAga2V5cyBleGFjdGx5IGFzIGJlZm9yZSwgYW5kIGV2ZXJ5IHJlLW9ic2VydmF0aW9uIHdpdGhpbiBvbmVcbiAqIGF0dGVtcHQgc3RpbGwgY29sbGFwc2VzIHRvIGEgc2luZ2xlIG1lc3NhZ2UuXG4gKi9cblxuaW1wb3J0IHsgZW52TnVtYmVyIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcblxuLyoqXG4gKiBNYXhpbXVtIGBkZWxheVNlY29uZHNgIGZvciBhIHNpbmdsZSB3YWl0LWNvbnRpbnVhdGlvbiBtZXNzYWdlLiBXYWl0c1xuICogbG9uZ2VyIHRoYW4gdGhpcyBhcmUgY2hhaW5lZCBhY3Jvc3MgbXVsdGlwbGUgaG9wcy4gMjMgaG91cnMgbGVhdmVzIGEgMWhcbiAqIGJ1ZmZlciB1bmRlciBWZXJjZWwgUXVldWVzJyBkZWZhdWx0IDI0aCBtZXNzYWdlIFRUTCBhbmQgbWlycm9yc1xuICogd29ybGQtdmVyY2VsJ3MgYE1BWF9ERUxBWV9TRUNPTkRTYC5cbiAqL1xuZXhwb3J0IGNvbnN0IFdBSVRfQ09OVElOVUFUSU9OX01BWF9ERUxBWV9TRUNPTkRTID0gODJfODAwO1xuXG4vKipcbiAqIFdhaXRzIHdpdGggYXQgbW9zdCB0aGlzIG1hbnkgc2Vjb25kcyByZW1haW5pbmcgdXNlIGEgc2Vjb25kLWJ1Y2tldGVkXG4gKiBpZGVtcG90ZW5jeSBrZXkgc28gYW4gZWFybHktZGVsaXZlcmVkIGNvbnRpbnVhdGlvbiBjYW4gcmUtZW5xdWV1ZSBpdHNcbiAqIHNob3J0LWRlbGF5IHJldHJ5LiBUaGlzIGlzIGFsc28gdGhlIGhvc3QgY2xvY2stc2tldyB0b2xlcmFuY2UgZm9yXG4gKiBtaWQtcmFuZ2Ugd2FpdHMga2V5ZWQgb24gdGhlIGJhcmUgY29ycmVsYXRpb25JZC5cbiAqL1xuZXhwb3J0IGNvbnN0IE5FQVJfRUxBUFNFRF9XQUlUX1RIUkVTSE9MRF9TRUNPTkRTID0gMjtcblxuLyoqIEVmZmVjdGl2ZSBtYXggY29udGludWF0aW9uIGRlbGF5LiBPdmVycmlkZTogYFdPUktGTE9XX1dBSVRfQ09OVElOVUFUSU9OX01BWF9ERUxBWV9TRUNPTkRTYC4gKi9cbmNvbnN0IGdldFdhaXRDb250aW51YXRpb25NYXhEZWxheVNlY29uZHMgPSAoKTogbnVtYmVyID0+XG4gIGVudk51bWJlcihcbiAgICAnV09SS0ZMT1dfV0FJVF9DT05USU5VQVRJT05fTUFYX0RFTEFZX1NFQ09ORFMnLFxuICAgIFdBSVRfQ09OVElOVUFUSU9OX01BWF9ERUxBWV9TRUNPTkRTLFxuICAgIHsgaW50ZWdlcjogdHJ1ZSwgbWluOiAxIH1cbiAgKTtcblxuLyoqIEVmZmVjdGl2ZSBuZWFyLWVsYXBzZWQgdGhyZXNob2xkLiBPdmVycmlkZTogYFdPUktGTE9XX05FQVJfRUxBUFNFRF9XQUlUX1RIUkVTSE9MRF9TRUNPTkRTYC4gKi9cbmNvbnN0IGdldE5lYXJFbGFwc2VkV2FpdFRocmVzaG9sZFNlY29uZHMgPSAoKTogbnVtYmVyID0+XG4gIGVudk51bWJlcihcbiAgICAnV09SS0ZMT1dfTkVBUl9FTEFQU0VEX1dBSVRfVEhSRVNIT0xEX1NFQ09ORFMnLFxuICAgIE5FQVJfRUxBUFNFRF9XQUlUX1RIUkVTSE9MRF9TRUNPTkRTXG4gICk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2FpdENvbnRpbnVhdGlvbkRpc3BhdGNoIHtcbiAgZGVsYXlTZWNvbmRzOiBudW1iZXI7XG4gIGlkZW1wb3RlbmN5S2V5OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIHF1ZXVlIGRlbGF5IGFuZCBpZGVtcG90ZW5jeSBrZXkgZm9yIGEgd2FpdC1jb250aW51YXRpb25cbiAqIG1lc3NhZ2UuIGB0aW1lb3V0U2Vjb25kc2AgaXMgdGhlIHRpbWUgdW50aWwgdGhlIHdhaXQncyBgcmVzdW1lQXRgXG4gKiAoZmxvb3JlZCBhdCAxcyBieSB0aGUgc3VzcGVuc2lvbiBoYW5kbGVyKTsgYHdhaXRDb3JyZWxhdGlvbklkYFxuICogaWRlbnRpZmllcyB0aGUgd2FpdCBzbyByZXBlYXRlZCBzdXNwZW5zaW9uIHBhc3NlcyBkZWR1cGUuXG4gKlxuICogYGF0dGVtcHRgIGlzIHRoZSBudW1iZXIgb2YgY29udGludWF0aW9ucyBhbHJlYWR5IHNwZW50IG9uIHRoaXMgd2FpdCwgdGFrZW5cbiAqIGZyb20gdGhlIGluY29taW5nIG1lc3NhZ2Ugd2hlbiB0aGlzIGludm9jYXRpb24gSVMgb25lIG9mIHRoZW0gKHNlZVxuICoge0BsaW5rIFdvcmtmbG93SW52b2tlUGF5bG9hZC53YWl0Q29udGludWF0aW9ufSkuIEl0IG9ubHkgZXZlciBtb3ZlcyB3aGVuIGFcbiAqIGNvbnRpbnVhdGlvbiBhcnJpdmVkIGJlZm9yZSBpdHMgd2FpdCBlbGFwc2VkLCB3aGljaCBpcyBleGFjdGx5IHdoZW4gdGhlXG4gKiBwcmV2aW91cyBrZXkgaXMgc3BlbnQgYW5kIHJlLXVzaW5nIGl0IHdvdWxkIGRyb3AgdGhlIG1lc3NhZ2UuIEF0dGVtcHQgMFxuICoga2V5cyBpZGVudGljYWxseSB0byB0aGUgc2NoZW1lIGJlZm9yZSBhdHRlbXB0cyBleGlzdGVkLCBzbyB0aGUgb3JkaW5hcnlcbiAqIHBhdGgg4oCUIGFybSBvbmNlLCBkZWxpdmVyIG9uY2UsIGNvbXBsZXRlIOKAlCBpcyBieXRlLWZvci1ieXRlIHVuY2hhbmdlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdhaXRDb250aW51YXRpb25EaXNwYXRjaChcbiAgdGltZW91dFNlY29uZHM6IG51bWJlcixcbiAgd2FpdENvcnJlbGF0aW9uSWQ6IHN0cmluZyxcbiAgbm93OiBudW1iZXIgPSBEYXRlLm5vdygpLFxuICBhdHRlbXB0ID0gMFxuKTogV2FpdENvbnRpbnVhdGlvbkRpc3BhdGNoIHtcbiAgY29uc3QgZGlzcGF0Y2ggPSB3YWl0Q29udGludWF0aW9uRGlzcGF0Y2hGb3JBdHRlbXB0WmVybyhcbiAgICB0aW1lb3V0U2Vjb25kcyxcbiAgICB3YWl0Q29ycmVsYXRpb25JZCxcbiAgICBub3dcbiAgKTtcbiAgaWYgKGF0dGVtcHQgPD0gMCkgcmV0dXJuIGRpc3BhdGNoO1xuICByZXR1cm4ge1xuICAgIGRlbGF5U2Vjb25kczogZGlzcGF0Y2guZGVsYXlTZWNvbmRzLFxuICAgIGlkZW1wb3RlbmN5S2V5OiBgJHtkaXNwYXRjaC5pZGVtcG90ZW5jeUtleX06YSR7YXR0ZW1wdH1gLFxuICB9O1xufVxuXG5mdW5jdGlvbiB3YWl0Q29udGludWF0aW9uRGlzcGF0Y2hGb3JBdHRlbXB0WmVybyhcbiAgdGltZW91dFNlY29uZHM6IG51bWJlcixcbiAgd2FpdENvcnJlbGF0aW9uSWQ6IHN0cmluZyxcbiAgbm93OiBudW1iZXJcbik6IFdhaXRDb250aW51YXRpb25EaXNwYXRjaCB7XG4gIGNvbnN0IG1heERlbGF5U2Vjb25kcyA9IGdldFdhaXRDb250aW51YXRpb25NYXhEZWxheVNlY29uZHMoKTtcbiAgLy8gVGhlIG5lYXItZWxhcHNlZCBicmFuY2ggcmV0dXJucyB0aGUgZnVsbCByZW1haW5pbmcgdGltZSBhcyB0aGUgZGVsYXksIHNvXG4gIC8vIGl0cyB0aHJlc2hvbGQgY2FuIG5ldmVyIGV4Y2VlZCB0aGUgbWF4IGRlbGF5LiBPdGhlcndpc2UgYSB3YWl0IGJldHdlZW4gdGhlXG4gIC8vIG1heCBhbmQgdGhlIHRocmVzaG9sZCB3b3VsZCBiZSBkaXNwYXRjaGVkIHdpdGggYSBkZWxheSBhYm92ZSB0aGUgbWF4LiBDYXBcbiAgLy8gdGhlIHRocmVzaG9sZCBhdCB0aGUgbWF4IHNvIGV2ZXJ5IGJyYW5jaCB5aWVsZHMgYSBkZWxheSB3aXRoaW4gaXQuIChXaXRoXG4gIC8vIGRlZmF1bHRzLCB0aHJlc2hvbGQgMnMgYW5kIG1heCA4Ml84MDBzLCB0aGlzIGlzIGEgbm8tb3A7IGl0IG9ubHkgYml0ZXNcbiAgLy8gd2hlbiB0aGUgbWF4IGlzIHR1bmVkIGRvd24gYmVsb3cgdGhlIHRocmVzaG9sZCBmb3IgdGVzdGluZy4pXG4gIGNvbnN0IG5lYXJFbGFwc2VkVGhyZXNob2xkID0gTWF0aC5taW4oXG4gICAgZ2V0TmVhckVsYXBzZWRXYWl0VGhyZXNob2xkU2Vjb25kcygpLFxuICAgIG1heERlbGF5U2Vjb25kc1xuICApO1xuICBpZiAodGltZW91dFNlY29uZHMgPD0gbmVhckVsYXBzZWRUaHJlc2hvbGQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGVsYXlTZWNvbmRzOiB0aW1lb3V0U2Vjb25kcyxcbiAgICAgIGlkZW1wb3RlbmN5S2V5OiBgJHt3YWl0Q29ycmVsYXRpb25JZH06JHtNYXRoLmZsb29yKG5vdyAvIDEwMDApfWAsXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IGhvcCA9IE1hdGguY2VpbCh0aW1lb3V0U2Vjb25kcyAvIG1heERlbGF5U2Vjb25kcyk7XG4gIHJldHVybiB7XG4gICAgZGVsYXlTZWNvbmRzOiBNYXRoLm1pbih0aW1lb3V0U2Vjb25kcywgbWF4RGVsYXlTZWNvbmRzKSxcbiAgICBpZGVtcG90ZW5jeUtleTpcbiAgICAgIGhvcCA9PT0gMSA/IHdhaXRDb3JyZWxhdGlvbklkIDogYCR7d2FpdENvcnJlbGF0aW9uSWR9OmhvcC0ke2hvcH1gLFxuICB9O1xufVxuIl19
@@ -0,0 +1,18 @@
1
+ export declare function waitUntil(promise: Promise<unknown>): void;
2
+ /**
3
+ * Schedule a background promise via `waitUntil`, guaranteeing that the
4
+ * promise handed to `waitUntil` can never reject. Nothing consumes a
5
+ * `waitUntil` promise, so a rejection surfaces as an `unhandledRejection`
6
+ * and can crash the process, even when the same underlying error is
7
+ * correctly handled by an awaited copy elsewhere.
8
+ *
9
+ * Expected client-disconnect errors (`AbortError` / `ResponseAborted`)
10
+ * are ignored. Any other error is passed to `onError` and swallowed.
11
+ */
12
+ export declare function safeWaitUntil(promise: Promise<unknown>, onError: (err: unknown) => void): void;
13
+ /**
14
+ * A small wrapper around `waitUntil` that also returns
15
+ * the result of the awaited promise.
16
+ */
17
+ export declare function waitedUntil<T>(fn: () => Promise<T>): Promise<T>;
18
+ //# sourceMappingURL=wait-until.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wait-until.d.ts","sourceRoot":"","sources":["../../src/runtime/wait-until.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAIzD;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,EACzB,OAAO,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,GAC9B,IAAI,CAcN;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAUrE"}
@@ -0,0 +1,42 @@
1
+ export function waitUntil(promise) {
2
+ void import('@vercel/functions').then(({ waitUntil }) => {
3
+ waitUntil(promise);
4
+ });
5
+ }
6
+ /**
7
+ * Schedule a background promise via `waitUntil`, guaranteeing that the
8
+ * promise handed to `waitUntil` can never reject. Nothing consumes a
9
+ * `waitUntil` promise, so a rejection surfaces as an `unhandledRejection`
10
+ * and can crash the process, even when the same underlying error is
11
+ * correctly handled by an awaited copy elsewhere.
12
+ *
13
+ * Expected client-disconnect errors (`AbortError` / `ResponseAborted`)
14
+ * are ignored. Any other error is passed to `onError` and swallowed.
15
+ */
16
+ export function safeWaitUntil(promise, onError) {
17
+ waitUntil(promise.catch((err) => {
18
+ const isAbortError = err?.name === 'AbortError' || err?.name === 'ResponseAborted';
19
+ if (!isAbortError) {
20
+ try {
21
+ onError(err);
22
+ }
23
+ catch {
24
+ // Never let onError break the no-reject guarantee.
25
+ }
26
+ }
27
+ }));
28
+ }
29
+ /**
30
+ * A small wrapper around `waitUntil` that also returns
31
+ * the result of the awaited promise.
32
+ */
33
+ export async function waitedUntil(fn) {
34
+ const result = fn();
35
+ waitUntil(result.catch(() => {
36
+ // Ignore error from the promise being rejected.
37
+ // It's expected that the invoker of `waitedUntil`
38
+ // will handle the error.
39
+ }));
40
+ return result;
41
+ }
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FpdC11bnRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL3dhaXQtdW50aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxVQUFVLFNBQVMsQ0FBQyxPQUF5QjtJQUNqRCxLQUFLLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRTtRQUN0RCxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDckIsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FDM0IsT0FBeUIsRUFDekIsT0FBK0I7SUFFL0IsU0FBUyxDQUNQLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtRQUNwQixNQUFNLFlBQVksR0FDaEIsR0FBRyxFQUFFLElBQUksS0FBSyxZQUFZLElBQUksR0FBRyxFQUFFLElBQUksS0FBSyxpQkFBaUIsQ0FBQztRQUNoRSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDO2dCQUNILE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNmLENBQUM7WUFBQyxNQUFNLENBQUM7Z0JBQ1AsbURBQW1EO1lBQ3JELENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQ0gsQ0FBQztBQUNKLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLFdBQVcsQ0FBSSxFQUFvQjtJQUN2RCxNQUFNLE1BQU0sR0FBRyxFQUFFLEVBQUUsQ0FBQztJQUNwQixTQUFTLENBQ1AsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUU7UUFDaEIsZ0RBQWdEO1FBQ2hELGtEQUFrRDtRQUNsRCx5QkFBeUI7SUFDM0IsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNGLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gd2FpdFVudGlsKHByb21pc2U6IFByb21pc2U8dW5rbm93bj4pOiB2b2lkIHtcbiAgdm9pZCBpbXBvcnQoJ0B2ZXJjZWwvZnVuY3Rpb25zJykudGhlbigoeyB3YWl0VW50aWwgfSkgPT4ge1xuICAgIHdhaXRVbnRpbChwcm9taXNlKTtcbiAgfSk7XG59XG5cbi8qKlxuICogU2NoZWR1bGUgYSBiYWNrZ3JvdW5kIHByb21pc2UgdmlhIGB3YWl0VW50aWxgLCBndWFyYW50ZWVpbmcgdGhhdCB0aGVcbiAqIHByb21pc2UgaGFuZGVkIHRvIGB3YWl0VW50aWxgIGNhbiBuZXZlciByZWplY3QuIE5vdGhpbmcgY29uc3VtZXMgYVxuICogYHdhaXRVbnRpbGAgcHJvbWlzZSwgc28gYSByZWplY3Rpb24gc3VyZmFjZXMgYXMgYW4gYHVuaGFuZGxlZFJlamVjdGlvbmBcbiAqIGFuZCBjYW4gY3Jhc2ggdGhlIHByb2Nlc3MsIGV2ZW4gd2hlbiB0aGUgc2FtZSB1bmRlcmx5aW5nIGVycm9yIGlzXG4gKiBjb3JyZWN0bHkgaGFuZGxlZCBieSBhbiBhd2FpdGVkIGNvcHkgZWxzZXdoZXJlLlxuICpcbiAqIEV4cGVjdGVkIGNsaWVudC1kaXNjb25uZWN0IGVycm9ycyAoYEFib3J0RXJyb3JgIC8gYFJlc3BvbnNlQWJvcnRlZGApXG4gKiBhcmUgaWdub3JlZC4gQW55IG90aGVyIGVycm9yIGlzIHBhc3NlZCB0byBgb25FcnJvcmAgYW5kIHN3YWxsb3dlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNhZmVXYWl0VW50aWwoXG4gIHByb21pc2U6IFByb21pc2U8dW5rbm93bj4sXG4gIG9uRXJyb3I6IChlcnI6IHVua25vd24pID0+IHZvaWRcbik6IHZvaWQge1xuICB3YWl0VW50aWwoXG4gICAgcHJvbWlzZS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICBjb25zdCBpc0Fib3J0RXJyb3IgPVxuICAgICAgICBlcnI/Lm5hbWUgPT09ICdBYm9ydEVycm9yJyB8fCBlcnI/Lm5hbWUgPT09ICdSZXNwb25zZUFib3J0ZWQnO1xuICAgICAgaWYgKCFpc0Fib3J0RXJyb3IpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBvbkVycm9yKGVycik7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIE5ldmVyIGxldCBvbkVycm9yIGJyZWFrIHRoZSBuby1yZWplY3QgZ3VhcmFudGVlLlxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgKTtcbn1cblxuLyoqXG4gKiBBIHNtYWxsIHdyYXBwZXIgYXJvdW5kIGB3YWl0VW50aWxgIHRoYXQgYWxzbyByZXR1cm5zXG4gKiB0aGUgcmVzdWx0IG9mIHRoZSBhd2FpdGVkIHByb21pc2UuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3YWl0ZWRVbnRpbDxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICBjb25zdCByZXN1bHQgPSBmbigpO1xuICB3YWl0VW50aWwoXG4gICAgcmVzdWx0LmNhdGNoKCgpID0+IHtcbiAgICAgIC8vIElnbm9yZSBlcnJvciBmcm9tIHRoZSBwcm9taXNlIGJlaW5nIHJlamVjdGVkLlxuICAgICAgLy8gSXQncyBleHBlY3RlZCB0aGF0IHRoZSBpbnZva2VyIG9mIGB3YWl0ZWRVbnRpbGBcbiAgICAgIC8vIHdpbGwgaGFuZGxlIHRoZSBlcnJvci5cbiAgICB9KVxuICApO1xuICByZXR1cm4gcmVzdWx0O1xufVxuIl19
@@ -0,0 +1,32 @@
1
+ import type { World } from '@workflow/world';
2
+ type WorldSpecVersionMetadata = Pick<World, 'specVersion'>;
3
+ /**
4
+ * Rejects a World this runtime cannot speak to.
5
+ *
6
+ * The accepted range is
7
+ * `[SPEC_VERSION_SUPPORTS_SLOT_IDENTITY, SPEC_VERSION_MAX_SUPPORTED]`. Below
8
+ * the floor means an old World package paired with a new runtime, which cannot
9
+ * serve the protocol this runtime speaks. A World that does not number events
10
+ * by position allocates ids the runtime cannot read positions out of. Above the
11
+ * ceiling means a World built against a newer spec than this runtime knows how
12
+ * to read.
13
+ *
14
+ * The floor is deliberately the slot-identity version rather than
15
+ * `SPEC_VERSION_CURRENT`, which now sits one above it at the sealed log. Two
16
+ * reasons, and both are about the window a spec bump is staged over:
17
+ *
18
+ * - `WORKFLOW_SEALED_LOG=0` puts a deployment back on slot identity, so its
19
+ * World declares the lower version. Flooring at the version we stamp by
20
+ * default would make that kill switch reject the very World it selects,
21
+ * turning a rollback into a startup failure.
22
+ * - A World package one version behind the runtime it ships alongside is the
23
+ * normal state mid-bump, and it can still serve the protocol: slot identity
24
+ * is what the runtime actually requires, and sealed logs are a capability on
25
+ * top of it that only the backend implements.
26
+ *
27
+ * The range narrows again when the sealed log becomes mandatory and the flag
28
+ * goes away, exactly as slot identity's own floor did.
29
+ */
30
+ export declare function assertWorldSupportsRuntimeProtocol(world: WorldSpecVersionMetadata): void;
31
+ export {};
32
+ //# sourceMappingURL=world-compatibility.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"world-compatibility.d.ts","sourceRoot":"","sources":["../../src/runtime/world-compatibility.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAM7C,KAAK,wBAAwB,GAAG,IAAI,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;AAE3D;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,kCAAkC,CAChD,KAAK,EAAE,wBAAwB,GAC9B,IAAI,CAkBN"}
@@ -0,0 +1,44 @@
1
+ import { WorkflowRuntimeError } from '@workflow/errors';
2
+ import { SPEC_VERSION_MAX_SUPPORTED, SPEC_VERSION_SUPPORTS_SLOT_IDENTITY, } from '@workflow/world';
3
+ /**
4
+ * Rejects a World this runtime cannot speak to.
5
+ *
6
+ * The accepted range is
7
+ * `[SPEC_VERSION_SUPPORTS_SLOT_IDENTITY, SPEC_VERSION_MAX_SUPPORTED]`. Below
8
+ * the floor means an old World package paired with a new runtime, which cannot
9
+ * serve the protocol this runtime speaks. A World that does not number events
10
+ * by position allocates ids the runtime cannot read positions out of. Above the
11
+ * ceiling means a World built against a newer spec than this runtime knows how
12
+ * to read.
13
+ *
14
+ * The floor is deliberately the slot-identity version rather than
15
+ * `SPEC_VERSION_CURRENT`, which now sits one above it at the sealed log. Two
16
+ * reasons, and both are about the window a spec bump is staged over:
17
+ *
18
+ * - `WORKFLOW_SEALED_LOG=0` puts a deployment back on slot identity, so its
19
+ * World declares the lower version. Flooring at the version we stamp by
20
+ * default would make that kill switch reject the very World it selects,
21
+ * turning a rollback into a startup failure.
22
+ * - A World package one version behind the runtime it ships alongside is the
23
+ * normal state mid-bump, and it can still serve the protocol: slot identity
24
+ * is what the runtime actually requires, and sealed logs are a capability on
25
+ * top of it that only the backend implements.
26
+ *
27
+ * The range narrows again when the sealed log becomes mandatory and the flag
28
+ * goes away, exactly as slot identity's own floor did.
29
+ */
30
+ export function assertWorldSupportsRuntimeProtocol(world) {
31
+ const declared = world.specVersion;
32
+ if (declared !== undefined &&
33
+ declared !== null &&
34
+ declared >= SPEC_VERSION_SUPPORTS_SLOT_IDENTITY &&
35
+ declared <= SPEC_VERSION_MAX_SUPPORTED) {
36
+ return;
37
+ }
38
+ const supportedVersion = declared ?? 'none';
39
+ throw new WorkflowRuntimeError(`This Workflow runtime supports Worlds with spec version ${SPEC_VERSION_SUPPORTS_SLOT_IDENTITY} ` +
40
+ `through ${SPEC_VERSION_MAX_SUPPORTED}, ` +
41
+ `but the configured World declares spec version ${supportedVersion}. ` +
42
+ 'Install a World package version compatible with the current Workflow runtime.');
43
+ }
44
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ybGQtY29tcGF0aWJpbGl0eS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL3dvcmxkLWNvbXBhdGliaWxpdHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFeEQsT0FBTyxFQUNMLDBCQUEwQixFQUMxQixtQ0FBbUMsR0FDcEMsTUFBTSxpQkFBaUIsQ0FBQztBQUl6Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQkc7QUFDSCxNQUFNLFVBQVUsa0NBQWtDLENBQ2hELEtBQStCO0lBRS9CLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUM7SUFDbkMsSUFDRSxRQUFRLEtBQUssU0FBUztRQUN0QixRQUFRLEtBQUssSUFBSTtRQUNqQixRQUFRLElBQUksbUNBQW1DO1FBQy9DLFFBQVEsSUFBSSwwQkFBMEIsRUFDdEMsQ0FBQztRQUNELE9BQU87SUFDVCxDQUFDO0lBRUQsTUFBTSxnQkFBZ0IsR0FBRyxRQUFRLElBQUksTUFBTSxDQUFDO0lBQzVDLE1BQU0sSUFBSSxvQkFBb0IsQ0FDNUIsMkRBQTJELG1DQUFtQyxHQUFHO1FBQy9GLFdBQVcsMEJBQTBCLElBQUk7UUFDekMsa0RBQWtELGdCQUFnQixJQUFJO1FBQ3RFLCtFQUErRSxDQUNsRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFdvcmtmbG93UnVudGltZUVycm9yIH0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQgdHlwZSB7IFdvcmxkIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7XG4gIFNQRUNfVkVSU0lPTl9NQVhfU1VQUE9SVEVELFxuICBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfU0xPVF9JREVOVElUWSxcbn0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcblxudHlwZSBXb3JsZFNwZWNWZXJzaW9uTWV0YWRhdGEgPSBQaWNrPFdvcmxkLCAnc3BlY1ZlcnNpb24nPjtcblxuLyoqXG4gKiBSZWplY3RzIGEgV29ybGQgdGhpcyBydW50aW1lIGNhbm5vdCBzcGVhayB0by5cbiAqXG4gKiBUaGUgYWNjZXB0ZWQgcmFuZ2UgaXNcbiAqIGBbU1BFQ19WRVJTSU9OX1NVUFBPUlRTX1NMT1RfSURFTlRJVFksIFNQRUNfVkVSU0lPTl9NQVhfU1VQUE9SVEVEXWAuIEJlbG93XG4gKiB0aGUgZmxvb3IgbWVhbnMgYW4gb2xkIFdvcmxkIHBhY2thZ2UgcGFpcmVkIHdpdGggYSBuZXcgcnVudGltZSwgd2hpY2ggY2Fubm90XG4gKiBzZXJ2ZSB0aGUgcHJvdG9jb2wgdGhpcyBydW50aW1lIHNwZWFrcy4gQSBXb3JsZCB0aGF0IGRvZXMgbm90IG51bWJlciBldmVudHNcbiAqIGJ5IHBvc2l0aW9uIGFsbG9jYXRlcyBpZHMgdGhlIHJ1bnRpbWUgY2Fubm90IHJlYWQgcG9zaXRpb25zIG91dCBvZi4gQWJvdmUgdGhlXG4gKiBjZWlsaW5nIG1lYW5zIGEgV29ybGQgYnVpbHQgYWdhaW5zdCBhIG5ld2VyIHNwZWMgdGhhbiB0aGlzIHJ1bnRpbWUga25vd3MgaG93XG4gKiB0byByZWFkLlxuICpcbiAqIFRoZSBmbG9vciBpcyBkZWxpYmVyYXRlbHkgdGhlIHNsb3QtaWRlbnRpdHkgdmVyc2lvbiByYXRoZXIgdGhhblxuICogYFNQRUNfVkVSU0lPTl9DVVJSRU5UYCwgd2hpY2ggbm93IHNpdHMgb25lIGFib3ZlIGl0IGF0IHRoZSBzZWFsZWQgbG9nLiBUd29cbiAqIHJlYXNvbnMsIGFuZCBib3RoIGFyZSBhYm91dCB0aGUgd2luZG93IGEgc3BlYyBidW1wIGlzIHN0YWdlZCBvdmVyOlxuICpcbiAqIC0gYFdPUktGTE9XX1NFQUxFRF9MT0c9MGAgcHV0cyBhIGRlcGxveW1lbnQgYmFjayBvbiBzbG90IGlkZW50aXR5LCBzbyBpdHNcbiAqICAgV29ybGQgZGVjbGFyZXMgdGhlIGxvd2VyIHZlcnNpb24uIEZsb29yaW5nIGF0IHRoZSB2ZXJzaW9uIHdlIHN0YW1wIGJ5XG4gKiAgIGRlZmF1bHQgd291bGQgbWFrZSB0aGF0IGtpbGwgc3dpdGNoIHJlamVjdCB0aGUgdmVyeSBXb3JsZCBpdCBzZWxlY3RzLFxuICogICB0dXJuaW5nIGEgcm9sbGJhY2sgaW50byBhIHN0YXJ0dXAgZmFpbHVyZS5cbiAqIC0gQSBXb3JsZCBwYWNrYWdlIG9uZSB2ZXJzaW9uIGJlaGluZCB0aGUgcnVudGltZSBpdCBzaGlwcyBhbG9uZ3NpZGUgaXMgdGhlXG4gKiAgIG5vcm1hbCBzdGF0ZSBtaWQtYnVtcCwgYW5kIGl0IGNhbiBzdGlsbCBzZXJ2ZSB0aGUgcHJvdG9jb2w6IHNsb3QgaWRlbnRpdHlcbiAqICAgaXMgd2hhdCB0aGUgcnVudGltZSBhY3R1YWxseSByZXF1aXJlcywgYW5kIHNlYWxlZCBsb2dzIGFyZSBhIGNhcGFiaWxpdHkgb25cbiAqICAgdG9wIG9mIGl0IHRoYXQgb25seSB0aGUgYmFja2VuZCBpbXBsZW1lbnRzLlxuICpcbiAqIFRoZSByYW5nZSBuYXJyb3dzIGFnYWluIHdoZW4gdGhlIHNlYWxlZCBsb2cgYmVjb21lcyBtYW5kYXRvcnkgYW5kIHRoZSBmbGFnXG4gKiBnb2VzIGF3YXksIGV4YWN0bHkgYXMgc2xvdCBpZGVudGl0eSdzIG93biBmbG9vciBkaWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRXb3JsZFN1cHBvcnRzUnVudGltZVByb3RvY29sKFxuICB3b3JsZDogV29ybGRTcGVjVmVyc2lvbk1ldGFkYXRhXG4pOiB2b2lkIHtcbiAgY29uc3QgZGVjbGFyZWQgPSB3b3JsZC5zcGVjVmVyc2lvbjtcbiAgaWYgKFxuICAgIGRlY2xhcmVkICE9PSB1bmRlZmluZWQgJiZcbiAgICBkZWNsYXJlZCAhPT0gbnVsbCAmJlxuICAgIGRlY2xhcmVkID49IFNQRUNfVkVSU0lPTl9TVVBQT1JUU19TTE9UX0lERU5USVRZICYmXG4gICAgZGVjbGFyZWQgPD0gU1BFQ19WRVJTSU9OX01BWF9TVVBQT1JURURcbiAgKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgc3VwcG9ydGVkVmVyc2lvbiA9IGRlY2xhcmVkID8/ICdub25lJztcbiAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgIGBUaGlzIFdvcmtmbG93IHJ1bnRpbWUgc3VwcG9ydHMgV29ybGRzIHdpdGggc3BlYyB2ZXJzaW9uICR7U1BFQ19WRVJTSU9OX1NVUFBPUlRTX1NMT1RfSURFTlRJVFl9IGAgK1xuICAgICAgYHRocm91Z2ggJHtTUEVDX1ZFUlNJT05fTUFYX1NVUFBPUlRFRH0sIGAgK1xuICAgICAgYGJ1dCB0aGUgY29uZmlndXJlZCBXb3JsZCBkZWNsYXJlcyBzcGVjIHZlcnNpb24gJHtzdXBwb3J0ZWRWZXJzaW9ufS4gYCArXG4gICAgICAnSW5zdGFsbCBhIFdvcmxkIHBhY2thZ2UgdmVyc2lvbiBjb21wYXRpYmxlIHdpdGggdGhlIGN1cnJlbnQgV29ya2Zsb3cgcnVudGltZS4nXG4gICk7XG59XG4iXX0=
@@ -1,35 +1,22 @@
1
1
  /**
2
2
  * Server-only side-effect module that ensures `world.ts` is loaded so its
3
- * module-load side effect `globalThis[GetWorldFnKey] ??= getWorld`
3
+ * module-load side effect (`globalThis[GetWorldFnKey] ??= getWorld`)
4
4
  * fires in host bundles.
5
5
  *
6
6
  * # Why this exists
7
7
  *
8
8
  * `getWorldLazy()` in `./get-world-lazy.ts` checks the globalThis cache
9
- * (populated by `world.ts`'s module-load side effect) before falling back
10
- * to a runtime-built dynamic `import('./world.js')`. When a server route
11
- * only consumes a single helper that goes through `getWorldLazy` — most
12
- * commonly `start` from `workflow/api` — webpack/turbopack tree-shake the
13
- * named import `{ getWorld } from './runtime/world.js'` out of
14
- * `runtime.ts`, taking `world.ts`'s module evaluation with it. The
9
+ * populated by `world.ts`'s module-load side effect. When a server route
10
+ * only consumes a helper that goes through `getWorldLazy` (for example
11
+ * `start` from `workflow/api`, or `defineHook().resume()` from `workflow`),
12
+ * webpack/turbopack can tree-shake the named import `{ getWorld }` out
13
+ * of `runtime.ts`, taking `world.ts`'s module evaluation with it. The
15
14
  * globalThis registration never fires.
16
15
  *
17
- * `getWorldLazy` then falls through to its dynamic-import fallback, which
18
- * itself fails: webpack inlines `get-world-lazy.js` into the bundled route
19
- * file, so the relative specifier `./world.js` resolves against
20
- * `/var/task/<app>/.next/server/app/<...>/route.js` where no sibling
21
- * `world.js` exists — and Node throws `MODULE_NOT_FOUND`. The symptom is a
22
- * cold-start regression: the very first user request that goes through
23
- * `start()` fails until some other code path (typically the queue-driven
24
- * `/.well-known/workflow/v1/flow` route, which uses `getWorld` directly
25
- * via `workflowEntrypoint`) has loaded `world.ts` and populated the
26
- * cache.
27
- *
28
- * Importing this module for its side effect — exactly once, from the
29
- * host-side `workflow/api` (`packages/workflow/src/api.ts`) — guarantees
30
- * `world.ts` enters the bundle, the global is registered at module load,
31
- * and `getWorldLazy()` short-circuits to the registered function on the
32
- * first call.
16
+ * Importing this module for its side effect from the host-side `workflow`
17
+ * and `workflow/api` entries guarantees `world.ts` enters the bundle, the
18
+ * global is registered at module load, and `getWorldLazy()` short-circuits
19
+ * to the registered function on the first call.
33
20
  *
34
21
  * # Why a separate module instead of importing `./world.js` directly
35
22
  *
@@ -47,29 +34,17 @@
47
34
  * `workflow` condition active, so they pick up the stub and never reach
48
35
  * `world.ts`. Host bundlers (webpack, turbopack, Node.js) use the
49
36
  * `default` (or `node`) condition and pick up this file, loading
50
- * `world.ts` as intended. The split keeps `@workflow/world-vercel`,
51
- * `@workflow/world-local`, `cbor-x`, and other server-only deps out of
52
- * the workflow sandbox bundle.
53
- *
54
- * # Why we keep the `getWorldLazy` dynamic-import fallback
55
- *
56
- * The fallback remains in `./get-world-lazy.ts` as a defense-in-depth for
57
- * environments we haven't accounted for (CJS test runners, scripts that
58
- * import `start` without going through `workflow/api`, future bundlers
59
- * with stricter tree-shaking). With this init module in place, the
60
- * fallback should never fire in normal use — but if it does, the
61
- * dynamic-import branch still resolves correctly when `world.js` is
62
- * physically adjacent on disk (e.g., direct Node.js execution of
63
- * unbundled source).
37
+ * `world.ts` as intended. The split keeps the configured world package
38
+ * and other server-only deps out of the workflow sandbox bundle.
64
39
  *
65
40
  * # Maintenance notes
66
41
  *
67
42
  * If you add another `getWorldLazy()` consumer that's reachable from a
68
- * host route without going through `workflow/api` (e.g., a new helper in
69
- * `workflow/runtime`), make sure that entry also imports this module
70
- * or that it transitively reaches `world.ts` via a non-tree-shakeable
71
- * path. Adding a regression test in `world-init.test.ts` is preferred to
72
- * relying on careful manual tracing.
43
+ * host route without going through `workflow` or `workflow/api`, make
44
+ * sure that entry also imports this module, or that it transitively
45
+ * reaches `world.ts` via a non-tree-shakeable path. Adding a regression
46
+ * test in `world-init.test.ts` is preferred to relying on careful manual
47
+ * tracing.
73
48
  */
74
49
  import './world.js';
75
50
  //# sourceMappingURL=world-init.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"world-init.d.ts","sourceRoot":"","sources":["../../src/runtime/world-init.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwEG;AACH,OAAO,YAAY,CAAC"}
1
+ {"version":3,"file":"world-init.d.ts","sourceRoot":"","sources":["../../src/runtime/world-init.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AACH,OAAO,YAAY,CAAC"}
@@ -1,35 +1,22 @@
1
1
  /**
2
2
  * Server-only side-effect module that ensures `world.ts` is loaded so its
3
- * module-load side effect `globalThis[GetWorldFnKey] ??= getWorld`
3
+ * module-load side effect (`globalThis[GetWorldFnKey] ??= getWorld`)
4
4
  * fires in host bundles.
5
5
  *
6
6
  * # Why this exists
7
7
  *
8
8
  * `getWorldLazy()` in `./get-world-lazy.ts` checks the globalThis cache
9
- * (populated by `world.ts`'s module-load side effect) before falling back
10
- * to a runtime-built dynamic `import('./world.js')`. When a server route
11
- * only consumes a single helper that goes through `getWorldLazy` — most
12
- * commonly `start` from `workflow/api` — webpack/turbopack tree-shake the
13
- * named import `{ getWorld } from './runtime/world.js'` out of
14
- * `runtime.ts`, taking `world.ts`'s module evaluation with it. The
9
+ * populated by `world.ts`'s module-load side effect. When a server route
10
+ * only consumes a helper that goes through `getWorldLazy` (for example
11
+ * `start` from `workflow/api`, or `defineHook().resume()` from `workflow`),
12
+ * webpack/turbopack can tree-shake the named import `{ getWorld }` out
13
+ * of `runtime.ts`, taking `world.ts`'s module evaluation with it. The
15
14
  * globalThis registration never fires.
16
15
  *
17
- * `getWorldLazy` then falls through to its dynamic-import fallback, which
18
- * itself fails: webpack inlines `get-world-lazy.js` into the bundled route
19
- * file, so the relative specifier `./world.js` resolves against
20
- * `/var/task/<app>/.next/server/app/<...>/route.js` where no sibling
21
- * `world.js` exists — and Node throws `MODULE_NOT_FOUND`. The symptom is a
22
- * cold-start regression: the very first user request that goes through
23
- * `start()` fails until some other code path (typically the queue-driven
24
- * `/.well-known/workflow/v1/flow` route, which uses `getWorld` directly
25
- * via `workflowEntrypoint`) has loaded `world.ts` and populated the
26
- * cache.
27
- *
28
- * Importing this module for its side effect — exactly once, from the
29
- * host-side `workflow/api` (`packages/workflow/src/api.ts`) — guarantees
30
- * `world.ts` enters the bundle, the global is registered at module load,
31
- * and `getWorldLazy()` short-circuits to the registered function on the
32
- * first call.
16
+ * Importing this module for its side effect from the host-side `workflow`
17
+ * and `workflow/api` entries guarantees `world.ts` enters the bundle, the
18
+ * global is registered at module load, and `getWorldLazy()` short-circuits
19
+ * to the registered function on the first call.
33
20
  *
34
21
  * # Why a separate module instead of importing `./world.js` directly
35
22
  *
@@ -47,29 +34,17 @@
47
34
  * `workflow` condition active, so they pick up the stub and never reach
48
35
  * `world.ts`. Host bundlers (webpack, turbopack, Node.js) use the
49
36
  * `default` (or `node`) condition and pick up this file, loading
50
- * `world.ts` as intended. The split keeps `@workflow/world-vercel`,
51
- * `@workflow/world-local`, `cbor-x`, and other server-only deps out of
52
- * the workflow sandbox bundle.
53
- *
54
- * # Why we keep the `getWorldLazy` dynamic-import fallback
55
- *
56
- * The fallback remains in `./get-world-lazy.ts` as a defense-in-depth for
57
- * environments we haven't accounted for (CJS test runners, scripts that
58
- * import `start` without going through `workflow/api`, future bundlers
59
- * with stricter tree-shaking). With this init module in place, the
60
- * fallback should never fire in normal use — but if it does, the
61
- * dynamic-import branch still resolves correctly when `world.js` is
62
- * physically adjacent on disk (e.g., direct Node.js execution of
63
- * unbundled source).
37
+ * `world.ts` as intended. The split keeps the configured world package
38
+ * and other server-only deps out of the workflow sandbox bundle.
64
39
  *
65
40
  * # Maintenance notes
66
41
  *
67
42
  * If you add another `getWorldLazy()` consumer that's reachable from a
68
- * host route without going through `workflow/api` (e.g., a new helper in
69
- * `workflow/runtime`), make sure that entry also imports this module
70
- * or that it transitively reaches `world.ts` via a non-tree-shakeable
71
- * path. Adding a regression test in `world-init.test.ts` is preferred to
72
- * relying on careful manual tracing.
43
+ * host route without going through `workflow` or `workflow/api`, make
44
+ * sure that entry also imports this module, or that it transitively
45
+ * reaches `world.ts` via a non-tree-shakeable path. Adding a regression
46
+ * test in `world-init.test.ts` is preferred to relying on careful manual
47
+ * tracing.
73
48
  */
74
49
  import './world.js';
75
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ybGQtaW5pdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL3dvcmxkLWluaXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXdFRztBQUNILE9BQU8sWUFBWSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTZXJ2ZXItb25seSBzaWRlLWVmZmVjdCBtb2R1bGUgdGhhdCBlbnN1cmVzIGB3b3JsZC50c2AgaXMgbG9hZGVkIHNvIGl0c1xuICogbW9kdWxlLWxvYWQgc2lkZSBlZmZlY3Qg4oCUIGBnbG9iYWxUaGlzW0dldFdvcmxkRm5LZXldID8/PSBnZXRXb3JsZGAg4oCUXG4gKiBmaXJlcyBpbiBob3N0IGJ1bmRsZXMuXG4gKlxuICogIyBXaHkgdGhpcyBleGlzdHNcbiAqXG4gKiBgZ2V0V29ybGRMYXp5KClgIGluIGAuL2dldC13b3JsZC1sYXp5LnRzYCBjaGVja3MgdGhlIGdsb2JhbFRoaXMgY2FjaGVcbiAqIChwb3B1bGF0ZWQgYnkgYHdvcmxkLnRzYCdzIG1vZHVsZS1sb2FkIHNpZGUgZWZmZWN0KSBiZWZvcmUgZmFsbGluZyBiYWNrXG4gKiB0byBhIHJ1bnRpbWUtYnVpbHQgZHluYW1pYyBgaW1wb3J0KCcuL3dvcmxkLmpzJylgLiBXaGVuIGEgc2VydmVyIHJvdXRlXG4gKiBvbmx5IGNvbnN1bWVzIGEgc2luZ2xlIGhlbHBlciB0aGF0IGdvZXMgdGhyb3VnaCBgZ2V0V29ybGRMYXp5YCDigJQgbW9zdFxuICogY29tbW9ubHkgYHN0YXJ0YCBmcm9tIGB3b3JrZmxvdy9hcGlgIOKAlCB3ZWJwYWNrL3R1cmJvcGFjayB0cmVlLXNoYWtlIHRoZVxuICogbmFtZWQgaW1wb3J0IGB7IGdldFdvcmxkIH0gZnJvbSAnLi9ydW50aW1lL3dvcmxkLmpzJ2Agb3V0IG9mXG4gKiBgcnVudGltZS50c2AsIHRha2luZyBgd29ybGQudHNgJ3MgbW9kdWxlIGV2YWx1YXRpb24gd2l0aCBpdC4gVGhlXG4gKiBnbG9iYWxUaGlzIHJlZ2lzdHJhdGlvbiBuZXZlciBmaXJlcy5cbiAqXG4gKiBgZ2V0V29ybGRMYXp5YCB0aGVuIGZhbGxzIHRocm91Z2ggdG8gaXRzIGR5bmFtaWMtaW1wb3J0IGZhbGxiYWNrLCB3aGljaFxuICogaXRzZWxmIGZhaWxzOiB3ZWJwYWNrIGlubGluZXMgYGdldC13b3JsZC1sYXp5LmpzYCBpbnRvIHRoZSBidW5kbGVkIHJvdXRlXG4gKiBmaWxlLCBzbyB0aGUgcmVsYXRpdmUgc3BlY2lmaWVyIGAuL3dvcmxkLmpzYCByZXNvbHZlcyBhZ2FpbnN0XG4gKiBgL3Zhci90YXNrLzxhcHA+Ly5uZXh0L3NlcnZlci9hcHAvPC4uLj4vcm91dGUuanNgIOKAlCB3aGVyZSBubyBzaWJsaW5nXG4gKiBgd29ybGQuanNgIGV4aXN0cyDigJQgYW5kIE5vZGUgdGhyb3dzIGBNT0RVTEVfTk9UX0ZPVU5EYC4gVGhlIHN5bXB0b20gaXMgYVxuICogY29sZC1zdGFydCByZWdyZXNzaW9uOiB0aGUgdmVyeSBmaXJzdCB1c2VyIHJlcXVlc3QgdGhhdCBnb2VzIHRocm91Z2hcbiAqIGBzdGFydCgpYCBmYWlscyB1bnRpbCBzb21lIG90aGVyIGNvZGUgcGF0aCAodHlwaWNhbGx5IHRoZSBxdWV1ZS1kcml2ZW5cbiAqIGAvLndlbGwta25vd24vd29ya2Zsb3cvdjEvZmxvd2Agcm91dGUsIHdoaWNoIHVzZXMgYGdldFdvcmxkYCBkaXJlY3RseVxuICogdmlhIGB3b3JrZmxvd0VudHJ5cG9pbnRgKSBoYXMgbG9hZGVkIGB3b3JsZC50c2AgYW5kIHBvcHVsYXRlZCB0aGVcbiAqIGNhY2hlLlxuICpcbiAqIEltcG9ydGluZyB0aGlzIG1vZHVsZSBmb3IgaXRzIHNpZGUgZWZmZWN0IOKAlCBleGFjdGx5IG9uY2UsIGZyb20gdGhlXG4gKiBob3N0LXNpZGUgYHdvcmtmbG93L2FwaWAgKGBwYWNrYWdlcy93b3JrZmxvdy9zcmMvYXBpLnRzYCkg4oCUIGd1YXJhbnRlZXNcbiAqIGB3b3JsZC50c2AgZW50ZXJzIHRoZSBidW5kbGUsIHRoZSBnbG9iYWwgaXMgcmVnaXN0ZXJlZCBhdCBtb2R1bGUgbG9hZCxcbiAqIGFuZCBgZ2V0V29ybGRMYXp5KClgIHNob3J0LWNpcmN1aXRzIHRvIHRoZSByZWdpc3RlcmVkIGZ1bmN0aW9uIG9uIHRoZVxuICogZmlyc3QgY2FsbC5cbiAqXG4gKiAjIFdoeSBhIHNlcGFyYXRlIG1vZHVsZSBpbnN0ZWFkIG9mIGltcG9ydGluZyBgLi93b3JsZC5qc2AgZGlyZWN0bHlcbiAqXG4gKiBgd29ybGQudHNgIGlzIGludGVybmFsIHRvIGBAd29ya2Zsb3cvY29yZWAgYW5kIG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWNcbiAqIGV4cG9ydHMgc3VyZmFjZS4gQWRkaW5nIGEgZGVkaWNhdGVkIHB1YmxpYyBpbml0IGVudHJ5ICh0aGlzIGZpbGUpXG4gKiBrZWVwcyB0aGUgc2lkZS1lZmZlY3QgaW50ZW50IG9idmlvdXMgdG8gYW55b25lIHJlYWRpbmdcbiAqIGBwYWNrYWdlcy93b3JrZmxvdy9zcmMvYXBpLnRzYCwgYW5kIGxldHMgdGhlIGB3b3JrZmxvd2AgZXhwb3J0XG4gKiBjb25kaXRpb24gcm91dGUgdG8gYSBzdHViIGZvciBWTS9zdGVwIGJ1bmRsZXMgKHNlZSBiZWxvdykuXG4gKlxuICogIyBXaHkgdGhpcyBkb2Vzbid0IGJyZWFrIFZNL3N0ZXAgYnVuZGxlc1xuICpcbiAqIFRoZSBgQHdvcmtmbG93L2NvcmUvcnVudGltZS93b3JsZC1pbml0YCBleHBvcnQgcmVzb2x2ZXMgdmlhIHRoZVxuICogYHdvcmtmbG93YCBjb25kaXRpb24gdG8gYC4vZGlzdC93b3JrZmxvdy93b3JsZC1pbml0LXN0dWIuanNgLCBhbiBlbXB0eVxuICogbW9kdWxlLiBFc2J1aWxkIHJ1bnMgdGhlIHdvcmtmbG93IFZNIGFuZCBzdGVwIGJ1bmRsZXJzIHdpdGggdGhlXG4gKiBgd29ya2Zsb3dgIGNvbmRpdGlvbiBhY3RpdmUsIHNvIHRoZXkgcGljayB1cCB0aGUgc3R1YiBhbmQgbmV2ZXIgcmVhY2hcbiAqIGB3b3JsZC50c2AuIEhvc3QgYnVuZGxlcnMgKHdlYnBhY2ssIHR1cmJvcGFjaywgTm9kZS5qcykgdXNlIHRoZVxuICogYGRlZmF1bHRgIChvciBgbm9kZWApIGNvbmRpdGlvbiBhbmQgcGljayB1cCB0aGlzIGZpbGUsIGxvYWRpbmdcbiAqIGB3b3JsZC50c2AgYXMgaW50ZW5kZWQuIFRoZSBzcGxpdCBrZWVwcyBgQHdvcmtmbG93L3dvcmxkLXZlcmNlbGAsXG4gKiBgQHdvcmtmbG93L3dvcmxkLWxvY2FsYCwgYGNib3IteGAsIGFuZCBvdGhlciBzZXJ2ZXItb25seSBkZXBzIG91dCBvZlxuICogdGhlIHdvcmtmbG93IHNhbmRib3ggYnVuZGxlLlxuICpcbiAqICMgV2h5IHdlIGtlZXAgdGhlIGBnZXRXb3JsZExhenlgIGR5bmFtaWMtaW1wb3J0IGZhbGxiYWNrXG4gKlxuICogVGhlIGZhbGxiYWNrIHJlbWFpbnMgaW4gYC4vZ2V0LXdvcmxkLWxhenkudHNgIGFzIGEgZGVmZW5zZS1pbi1kZXB0aCBmb3JcbiAqIGVudmlyb25tZW50cyB3ZSBoYXZlbid0IGFjY291bnRlZCBmb3IgKENKUyB0ZXN0IHJ1bm5lcnMsIHNjcmlwdHMgdGhhdFxuICogaW1wb3J0IGBzdGFydGAgd2l0aG91dCBnb2luZyB0aHJvdWdoIGB3b3JrZmxvdy9hcGlgLCBmdXR1cmUgYnVuZGxlcnNcbiAqIHdpdGggc3RyaWN0ZXIgdHJlZS1zaGFraW5nKS4gV2l0aCB0aGlzIGluaXQgbW9kdWxlIGluIHBsYWNlLCB0aGVcbiAqIGZhbGxiYWNrIHNob3VsZCBuZXZlciBmaXJlIGluIG5vcm1hbCB1c2Ug4oCUIGJ1dCBpZiBpdCBkb2VzLCB0aGVcbiAqIGR5bmFtaWMtaW1wb3J0IGJyYW5jaCBzdGlsbCByZXNvbHZlcyBjb3JyZWN0bHkgd2hlbiBgd29ybGQuanNgIGlzXG4gKiBwaHlzaWNhbGx5IGFkamFjZW50IG9uIGRpc2sgKGUuZy4sIGRpcmVjdCBOb2RlLmpzIGV4ZWN1dGlvbiBvZlxuICogdW5idW5kbGVkIHNvdXJjZSkuXG4gKlxuICogIyBNYWludGVuYW5jZSBub3Rlc1xuICpcbiAqIElmIHlvdSBhZGQgYW5vdGhlciBgZ2V0V29ybGRMYXp5KClgIGNvbnN1bWVyIHRoYXQncyByZWFjaGFibGUgZnJvbSBhXG4gKiBob3N0IHJvdXRlIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCBgd29ya2Zsb3cvYXBpYCAoZS5nLiwgYSBuZXcgaGVscGVyIGluXG4gKiBgd29ya2Zsb3cvcnVudGltZWApLCBtYWtlIHN1cmUgdGhhdCBlbnRyeSBhbHNvIGltcG9ydHMgdGhpcyBtb2R1bGUg4oCUXG4gKiBvciB0aGF0IGl0IHRyYW5zaXRpdmVseSByZWFjaGVzIGB3b3JsZC50c2AgdmlhIGEgbm9uLXRyZWUtc2hha2VhYmxlXG4gKiBwYXRoLiBBZGRpbmcgYSByZWdyZXNzaW9uIHRlc3QgaW4gYHdvcmxkLWluaXQudGVzdC50c2AgaXMgcHJlZmVycmVkIHRvXG4gKiByZWx5aW5nIG9uIGNhcmVmdWwgbWFudWFsIHRyYWNpbmcuXG4gKi9cbmltcG9ydCAnLi93b3JsZC5qcyc7XG4iXX0=
50
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ybGQtaW5pdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL3dvcmxkLWluaXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBK0NHO0FBQ0gsT0FBTyxZQUFZLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNlcnZlci1vbmx5IHNpZGUtZWZmZWN0IG1vZHVsZSB0aGF0IGVuc3VyZXMgYHdvcmxkLnRzYCBpcyBsb2FkZWQgc28gaXRzXG4gKiBtb2R1bGUtbG9hZCBzaWRlIGVmZmVjdCAoYGdsb2JhbFRoaXNbR2V0V29ybGRGbktleV0gPz89IGdldFdvcmxkYClcbiAqIGZpcmVzIGluIGhvc3QgYnVuZGxlcy5cbiAqXG4gKiAjIFdoeSB0aGlzIGV4aXN0c1xuICpcbiAqIGBnZXRXb3JsZExhenkoKWAgaW4gYC4vZ2V0LXdvcmxkLWxhenkudHNgIGNoZWNrcyB0aGUgZ2xvYmFsVGhpcyBjYWNoZVxuICogcG9wdWxhdGVkIGJ5IGB3b3JsZC50c2AncyBtb2R1bGUtbG9hZCBzaWRlIGVmZmVjdC4gV2hlbiBhIHNlcnZlciByb3V0ZVxuICogb25seSBjb25zdW1lcyBhIGhlbHBlciB0aGF0IGdvZXMgdGhyb3VnaCBgZ2V0V29ybGRMYXp5YCAoZm9yIGV4YW1wbGVcbiAqIGBzdGFydGAgZnJvbSBgd29ya2Zsb3cvYXBpYCwgb3IgYGRlZmluZUhvb2soKS5yZXN1bWUoKWAgZnJvbSBgd29ya2Zsb3dgKSxcbiAqIHdlYnBhY2svdHVyYm9wYWNrIGNhbiB0cmVlLXNoYWtlIHRoZSBuYW1lZCBpbXBvcnQgYHsgZ2V0V29ybGQgfWAgb3V0XG4gKiBvZiBgcnVudGltZS50c2AsIHRha2luZyBgd29ybGQudHNgJ3MgbW9kdWxlIGV2YWx1YXRpb24gd2l0aCBpdC4gVGhlXG4gKiBnbG9iYWxUaGlzIHJlZ2lzdHJhdGlvbiBuZXZlciBmaXJlcy5cbiAqXG4gKiBJbXBvcnRpbmcgdGhpcyBtb2R1bGUgZm9yIGl0cyBzaWRlIGVmZmVjdCBmcm9tIHRoZSBob3N0LXNpZGUgYHdvcmtmbG93YFxuICogYW5kIGB3b3JrZmxvdy9hcGlgIGVudHJpZXMgZ3VhcmFudGVlcyBgd29ybGQudHNgIGVudGVycyB0aGUgYnVuZGxlLCB0aGVcbiAqIGdsb2JhbCBpcyByZWdpc3RlcmVkIGF0IG1vZHVsZSBsb2FkLCBhbmQgYGdldFdvcmxkTGF6eSgpYCBzaG9ydC1jaXJjdWl0c1xuICogdG8gdGhlIHJlZ2lzdGVyZWQgZnVuY3Rpb24gb24gdGhlIGZpcnN0IGNhbGwuXG4gKlxuICogIyBXaHkgYSBzZXBhcmF0ZSBtb2R1bGUgaW5zdGVhZCBvZiBpbXBvcnRpbmcgYC4vd29ybGQuanNgIGRpcmVjdGx5XG4gKlxuICogYHdvcmxkLnRzYCBpcyBpbnRlcm5hbCB0byBgQHdvcmtmbG93L2NvcmVgIGFuZCBub3QgcGFydCBvZiB0aGUgcHVibGljXG4gKiBleHBvcnRzIHN1cmZhY2UuIEFkZGluZyBhIGRlZGljYXRlZCBwdWJsaWMgaW5pdCBlbnRyeSAodGhpcyBmaWxlKVxuICoga2VlcHMgdGhlIHNpZGUtZWZmZWN0IGludGVudCBvYnZpb3VzIHRvIGFueW9uZSByZWFkaW5nXG4gKiBgcGFja2FnZXMvd29ya2Zsb3cvc3JjL2FwaS50c2AsIGFuZCBsZXRzIHRoZSBgd29ya2Zsb3dgIGV4cG9ydFxuICogY29uZGl0aW9uIHJvdXRlIHRvIGEgc3R1YiBmb3IgVk0vc3RlcCBidW5kbGVzIChzZWUgYmVsb3cpLlxuICpcbiAqICMgV2h5IHRoaXMgZG9lc24ndCBicmVhayBWTS9zdGVwIGJ1bmRsZXNcbiAqXG4gKiBUaGUgYEB3b3JrZmxvdy9jb3JlL3J1bnRpbWUvd29ybGQtaW5pdGAgZXhwb3J0IHJlc29sdmVzIHZpYSB0aGVcbiAqIGB3b3JrZmxvd2AgY29uZGl0aW9uIHRvIGAuL2Rpc3Qvd29ya2Zsb3cvd29ybGQtaW5pdC1zdHViLmpzYCwgYW4gZW1wdHlcbiAqIG1vZHVsZS4gRXNidWlsZCBydW5zIHRoZSB3b3JrZmxvdyBWTSBhbmQgc3RlcCBidW5kbGVycyB3aXRoIHRoZVxuICogYHdvcmtmbG93YCBjb25kaXRpb24gYWN0aXZlLCBzbyB0aGV5IHBpY2sgdXAgdGhlIHN0dWIgYW5kIG5ldmVyIHJlYWNoXG4gKiBgd29ybGQudHNgLiBIb3N0IGJ1bmRsZXJzICh3ZWJwYWNrLCB0dXJib3BhY2ssIE5vZGUuanMpIHVzZSB0aGVcbiAqIGBkZWZhdWx0YCAob3IgYG5vZGVgKSBjb25kaXRpb24gYW5kIHBpY2sgdXAgdGhpcyBmaWxlLCBsb2FkaW5nXG4gKiBgd29ybGQudHNgIGFzIGludGVuZGVkLiBUaGUgc3BsaXQga2VlcHMgdGhlIGNvbmZpZ3VyZWQgd29ybGQgcGFja2FnZVxuICogYW5kIG90aGVyIHNlcnZlci1vbmx5IGRlcHMgb3V0IG9mIHRoZSB3b3JrZmxvdyBzYW5kYm94IGJ1bmRsZS5cbiAqXG4gKiAjIE1haW50ZW5hbmNlIG5vdGVzXG4gKlxuICogSWYgeW91IGFkZCBhbm90aGVyIGBnZXRXb3JsZExhenkoKWAgY29uc3VtZXIgdGhhdCdzIHJlYWNoYWJsZSBmcm9tIGFcbiAqIGhvc3Qgcm91dGUgd2l0aG91dCBnb2luZyB0aHJvdWdoIGB3b3JrZmxvd2Agb3IgYHdvcmtmbG93L2FwaWAsIG1ha2VcbiAqIHN1cmUgdGhhdCBlbnRyeSBhbHNvIGltcG9ydHMgdGhpcyBtb2R1bGUsIG9yIHRoYXQgaXQgdHJhbnNpdGl2ZWx5XG4gKiByZWFjaGVzIGB3b3JsZC50c2AgdmlhIGEgbm9uLXRyZWUtc2hha2VhYmxlIHBhdGguIEFkZGluZyBhIHJlZ3Jlc3Npb25cbiAqIHRlc3QgaW4gYHdvcmxkLWluaXQudGVzdC50c2AgaXMgcHJlZmVycmVkIHRvIHJlbHlpbmcgb24gY2FyZWZ1bCBtYW51YWxcbiAqIHRyYWNpbmcuXG4gKi9cbmltcG9ydCAnLi93b3JsZC5qcyc7XG4iXX0=
@@ -1,4 +1,16 @@
1
1
  import type { World } from '@workflow/world';
2
+ export type WorldFactoryModule = {
3
+ createWorld?: () => World | Promise<World>;
4
+ default?: (() => World | Promise<World>) | World;
5
+ };
6
+ /**
7
+ * Create a World instance from a world factory module. Shared by
8
+ * `createWorld()` (for the world package named by WORKFLOW_TARGET_WORLD) and
9
+ * tooling that loads a world module dynamically (e.g. the Nitro dev
10
+ * handler and `@workflow/world-testing`). World packages should export
11
+ * `createWorld()`.
12
+ */
13
+ export declare function createWorldFromModule(mod: WorldFactoryModule): World | Promise<World>;
2
14
  /**
3
15
  * Create a new world instance based on environment variables.
4
16
  * WORKFLOW_TARGET_WORLD is used to determine the target world.
@@ -8,8 +20,8 @@ import type { World } from '@workflow/world';
8
20
  * and should not affect runtime behavior. The Vercel runtime provides
9
21
  * authentication via OIDC tokens and project context via system env vars
10
22
  * (VERCEL_DEPLOYMENT_ID, VERCEL_PROJECT_ID). Tooling that needs these env
11
- * vars should call createVercelWorld() directly with an explicit config and
12
- * use setWorld() to inject the instance.
23
+ * vars should call the Vercel world's createWorld() directly with an explicit
24
+ * config and use setWorld() to inject the instance.
13
25
  */
14
26
  export declare const createWorld: () => Promise<World>;
15
27
  export type WorldHandlers = Pick<World, 'createQueueHandler' | 'specVersion'>;
@@ -1 +1 @@
1
- {"version":3,"file":"world.d.ts","sourceRoot":"","sources":["../../src/runtime/world.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AA4D7C;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,WAAW,QAAa,OAAO,CAAC,KAAK,CAqDjD,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,EAAE,oBAAoB,GAAG,aAAa,CAAC,CAAC;AAE9E;;;;;;;;GAQG;AACH,eAAO,MAAM,gBAAgB,QAAa,OAAO,CAAC,aAAa,CAkB9D,CAAC;AAEF,eAAO,MAAM,QAAQ,QAAa,OAAO,CAAC,KAAK,CAc9C,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,QAAQ,GAAI,OAAO,KAAK,GAAG,SAAS,KAAG,IAKnD,CAAC"}
1
+ {"version":3,"file":"world.d.ts","sourceRoot":"","sources":["../../src/runtime/world.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAiD7C,MAAM,MAAM,kBAAkB,GAAG;IAC/B,WAAW,CAAC,EAAE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAC3C,OAAO,CAAC,EAAE,CAAC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC;CAClD,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,kBAAkB,GACtB,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAcxB;AA8CD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,WAAW,QAAa,OAAO,CAAC,KAAK,CA6DjD,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,EAAE,oBAAoB,GAAG,aAAa,CAAC,CAAC;AAE9E;;;;;;;;GAQG;AACH,eAAO,MAAM,gBAAgB,QAAa,OAAO,CAAC,aAAa,CAoB9D,CAAC;AAEF,eAAO,MAAM,QAAQ,QAAa,OAAO,CAAC,KAAK,CAgB9C,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,QAAQ,GAAI,OAAO,KAAK,GAAG,SAAS,KAAG,IAKnD,CAAC"}