@workflow/core 5.0.0-beta.2 → 5.0.0-beta.20

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 (247) hide show
  1. package/dist/attribute-changes.d.ts +7 -0
  2. package/dist/attribute-changes.d.ts.map +1 -0
  3. package/dist/attribute-changes.js +25 -0
  4. package/dist/capabilities.d.ts +22 -1
  5. package/dist/capabilities.d.ts.map +1 -1
  6. package/dist/capabilities.js +41 -4
  7. package/dist/capture-stack.d.ts +16 -0
  8. package/dist/capture-stack.d.ts.map +1 -0
  9. package/dist/capture-stack.js +21 -0
  10. package/dist/class-serialization.d.ts +32 -0
  11. package/dist/class-serialization.d.ts.map +1 -1
  12. package/dist/class-serialization.js +37 -1
  13. package/dist/classify-error.d.ts +11 -3
  14. package/dist/classify-error.d.ts.map +1 -1
  15. package/dist/classify-error.js +59 -6
  16. package/dist/context-errors.d.ts +27 -0
  17. package/dist/context-errors.d.ts.map +1 -0
  18. package/dist/context-errors.js +101 -0
  19. package/dist/context-violation-error.d.ts +97 -0
  20. package/dist/context-violation-error.d.ts.map +1 -0
  21. package/dist/context-violation-error.js +147 -0
  22. package/dist/create-hook.d.ts +40 -1
  23. package/dist/create-hook.d.ts.map +1 -1
  24. package/dist/create-hook.js +4 -3
  25. package/dist/define-hook.d.ts.map +1 -1
  26. package/dist/define-hook.js +20 -5
  27. package/dist/describe-error.d.ts +70 -0
  28. package/dist/describe-error.d.ts.map +1 -0
  29. package/dist/describe-error.js +165 -0
  30. package/dist/encryption.d.ts +22 -1
  31. package/dist/encryption.d.ts.map +1 -1
  32. package/dist/encryption.js +72 -27
  33. package/dist/events-consumer.d.ts +24 -0
  34. package/dist/events-consumer.d.ts.map +1 -1
  35. package/dist/events-consumer.js +79 -16
  36. package/dist/flushable-stream.d.ts +10 -10
  37. package/dist/flushable-stream.d.ts.map +1 -1
  38. package/dist/flushable-stream.js +18 -13
  39. package/dist/global.d.ts +15 -1
  40. package/dist/global.d.ts.map +1 -1
  41. package/dist/global.js +21 -3
  42. package/dist/index.d.ts +1 -0
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +2 -1
  45. package/dist/log-format.d.ts +25 -0
  46. package/dist/log-format.d.ts.map +1 -0
  47. package/dist/log-format.js +250 -0
  48. package/dist/logger.d.ts +28 -30
  49. package/dist/logger.d.ts.map +1 -1
  50. package/dist/logger.js +77 -31
  51. package/dist/private.d.ts +84 -0
  52. package/dist/private.d.ts.map +1 -1
  53. package/dist/private.js +80 -3
  54. package/dist/runtime/constants.d.ts +93 -0
  55. package/dist/runtime/constants.d.ts.map +1 -1
  56. package/dist/runtime/constants.js +168 -8
  57. package/dist/runtime/get-port-lazy.d.ts +25 -0
  58. package/dist/runtime/get-port-lazy.d.ts.map +1 -0
  59. package/dist/runtime/get-port-lazy.js +92 -0
  60. package/dist/runtime/get-world-lazy.d.ts +32 -0
  61. package/dist/runtime/get-world-lazy.d.ts.map +1 -0
  62. package/dist/runtime/get-world-lazy.js +56 -0
  63. package/dist/runtime/helpers.d.ts +50 -7
  64. package/dist/runtime/helpers.d.ts.map +1 -1
  65. package/dist/runtime/helpers.js +149 -31
  66. package/dist/runtime/replay-budget.d.ts +98 -0
  67. package/dist/runtime/replay-budget.d.ts.map +1 -0
  68. package/dist/runtime/replay-budget.js +191 -0
  69. package/dist/runtime/resume-hook.d.ts.map +1 -1
  70. package/dist/runtime/resume-hook.js +39 -23
  71. package/dist/runtime/run-id-time.d.ts +10 -0
  72. package/dist/runtime/run-id-time.d.ts.map +1 -0
  73. package/dist/runtime/run-id-time.js +31 -0
  74. package/dist/runtime/run.d.ts.map +1 -1
  75. package/dist/runtime/run.js +44 -9
  76. package/dist/runtime/runs.d.ts.map +1 -1
  77. package/dist/runtime/runs.js +4 -1
  78. package/dist/runtime/start.d.ts +30 -1
  79. package/dist/runtime/start.d.ts.map +1 -1
  80. package/dist/runtime/start.js +138 -20
  81. package/dist/runtime/step-executor.d.ts +91 -0
  82. package/dist/runtime/step-executor.d.ts.map +1 -0
  83. package/dist/runtime/step-executor.js +659 -0
  84. package/dist/runtime/step-handler.d.ts.map +1 -1
  85. package/dist/runtime/step-handler.js +699 -556
  86. package/dist/runtime/suspension-handler.d.ts +55 -6
  87. package/dist/runtime/suspension-handler.d.ts.map +1 -1
  88. package/dist/runtime/suspension-handler.js +282 -115
  89. package/dist/runtime/wait-continuation.d.ts +84 -0
  90. package/dist/runtime/wait-continuation.d.ts.map +1 -0
  91. package/dist/runtime/wait-continuation.js +92 -0
  92. package/dist/runtime/wait-until.d.ts +18 -0
  93. package/dist/runtime/wait-until.d.ts.map +1 -0
  94. package/dist/runtime/wait-until.js +42 -0
  95. package/dist/runtime/world-init.d.ts +75 -0
  96. package/dist/runtime/world-init.d.ts.map +1 -0
  97. package/dist/runtime/world-init.js +75 -0
  98. package/dist/runtime/world.d.ts.map +1 -1
  99. package/dist/runtime/world.js +47 -18
  100. package/dist/runtime.d.ts +11 -8
  101. package/dist/runtime.d.ts.map +1 -1
  102. package/dist/runtime.js +1234 -334
  103. package/dist/schemas.d.ts +1 -1
  104. package/dist/schemas.d.ts.map +1 -1
  105. package/dist/schemas.js +1 -1
  106. package/dist/serialization/client.d.ts +17 -0
  107. package/dist/serialization/client.d.ts.map +1 -0
  108. package/dist/serialization/client.js +48 -0
  109. package/dist/serialization/codec-devalue.d.ts +14 -0
  110. package/dist/serialization/codec-devalue.d.ts.map +1 -0
  111. package/dist/serialization/codec-devalue.js +98 -0
  112. package/dist/serialization/codec.d.ts +106 -0
  113. package/dist/serialization/codec.d.ts.map +1 -0
  114. package/dist/serialization/codec.js +17 -0
  115. package/dist/serialization/compression.d.ts +104 -0
  116. package/dist/serialization/compression.d.ts.map +1 -0
  117. package/dist/serialization/compression.js +260 -0
  118. package/dist/serialization/encryption.d.ts +33 -0
  119. package/dist/serialization/encryption.d.ts.map +1 -0
  120. package/dist/serialization/encryption.js +70 -0
  121. package/dist/serialization/errors.d.ts +34 -0
  122. package/dist/serialization/errors.d.ts.map +1 -0
  123. package/dist/serialization/errors.js +59 -0
  124. package/dist/serialization/format.d.ts +60 -0
  125. package/dist/serialization/format.d.ts.map +1 -0
  126. package/dist/serialization/format.js +97 -0
  127. package/dist/serialization/index.d.ts +19 -0
  128. package/dist/serialization/index.d.ts.map +1 -0
  129. package/dist/serialization/index.js +22 -0
  130. package/dist/serialization/reducers/class.d.ts +11 -0
  131. package/dist/serialization/reducers/class.d.ts.map +1 -0
  132. package/dist/serialization/reducers/class.js +68 -0
  133. package/dist/serialization/reducers/common.d.ts +16 -0
  134. package/dist/serialization/reducers/common.d.ts.map +1 -0
  135. package/dist/serialization/reducers/common.js +417 -0
  136. package/dist/serialization/reducers/step-function.d.ts +35 -0
  137. package/dist/serialization/reducers/step-function.d.ts.map +1 -0
  138. package/dist/serialization/reducers/step-function.js +88 -0
  139. package/dist/serialization/step.d.ts +17 -0
  140. package/dist/serialization/step.d.ts.map +1 -0
  141. package/dist/serialization/step.js +48 -0
  142. package/dist/serialization/types.d.ts +253 -0
  143. package/dist/serialization/types.d.ts.map +1 -0
  144. package/dist/serialization/types.js +25 -0
  145. package/dist/serialization/workflow.d.ts +29 -0
  146. package/dist/serialization/workflow.d.ts.map +1 -0
  147. package/dist/serialization/workflow.js +54 -0
  148. package/dist/serialization-format.d.ts +15 -0
  149. package/dist/serialization-format.d.ts.map +1 -1
  150. package/dist/serialization-format.js +209 -11
  151. package/dist/serialization.d.ts +313 -214
  152. package/dist/serialization.d.ts.map +1 -1
  153. package/dist/serialization.js +1417 -658
  154. package/dist/set-attributes.d.ts +13 -0
  155. package/dist/set-attributes.d.ts.map +1 -0
  156. package/dist/set-attributes.js +42 -0
  157. package/dist/sleep.d.ts.map +1 -1
  158. package/dist/sleep.js +3 -2
  159. package/dist/source-map.d.ts +5 -0
  160. package/dist/source-map.d.ts.map +1 -1
  161. package/dist/source-map.js +102 -10
  162. package/dist/step/context-storage.d.ts +16 -0
  163. package/dist/step/context-storage.d.ts.map +1 -1
  164. package/dist/step/context-storage.js +1 -1
  165. package/dist/step/get-closure-vars.d.ts.map +1 -1
  166. package/dist/step/get-closure-vars.js +3 -2
  167. package/dist/step/get-step-metadata.d.ts.map +1 -1
  168. package/dist/step/get-step-metadata.js +3 -2
  169. package/dist/step/get-workflow-metadata.d.ts.map +1 -1
  170. package/dist/step/get-workflow-metadata.js +3 -2
  171. package/dist/step/writable-stream.d.ts.map +1 -1
  172. package/dist/step/writable-stream.js +49 -5
  173. package/dist/step.d.ts.map +1 -1
  174. package/dist/step.js +98 -20
  175. package/dist/symbols.d.ts +28 -0
  176. package/dist/symbols.d.ts.map +1 -1
  177. package/dist/symbols.js +29 -1
  178. package/dist/telemetry/semantic-conventions.d.ts +30 -2
  179. package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
  180. package/dist/telemetry/semantic-conventions.js +21 -1
  181. package/dist/telemetry.d.ts +60 -0
  182. package/dist/telemetry.d.ts.map +1 -1
  183. package/dist/telemetry.js +82 -4
  184. package/dist/types.d.ts +6 -0
  185. package/dist/types.d.ts.map +1 -1
  186. package/dist/types.js +23 -1
  187. package/dist/util.d.ts +16 -6
  188. package/dist/util.d.ts.map +1 -1
  189. package/dist/util.js +25 -16
  190. package/dist/version.d.ts +1 -1
  191. package/dist/version.d.ts.map +1 -1
  192. package/dist/version.js +2 -2
  193. package/dist/vm/index.d.ts.map +1 -1
  194. package/dist/vm/index.js +3 -2
  195. package/dist/vm/script-cache.d.ts +28 -0
  196. package/dist/vm/script-cache.d.ts.map +1 -0
  197. package/dist/vm/script-cache.js +140 -0
  198. package/dist/workflow/abort-controller.d.ts +65 -0
  199. package/dist/workflow/abort-controller.d.ts.map +1 -0
  200. package/dist/workflow/abort-controller.js +260 -0
  201. package/dist/workflow/attribute-dispatcher.d.ts +6 -0
  202. package/dist/workflow/attribute-dispatcher.d.ts.map +1 -0
  203. package/dist/workflow/attribute-dispatcher.js +48 -0
  204. package/dist/workflow/create-hook.d.ts.map +1 -1
  205. package/dist/workflow/create-hook.js +23 -2
  206. package/dist/workflow/define-hook.d.ts +1 -1
  207. package/dist/workflow/define-hook.d.ts.map +1 -1
  208. package/dist/workflow/define-hook.js +8 -4
  209. package/dist/workflow/get-workflow-metadata.d.ts.map +1 -1
  210. package/dist/workflow/get-workflow-metadata.js +14 -3
  211. package/dist/workflow/hook.d.ts.map +1 -1
  212. package/dist/workflow/hook.js +207 -33
  213. package/dist/workflow/index.d.ts +1 -0
  214. package/dist/workflow/index.d.ts.map +1 -1
  215. package/dist/workflow/index.js +5 -3
  216. package/dist/workflow/set-attributes.d.ts +73 -0
  217. package/dist/workflow/set-attributes.d.ts.map +1 -0
  218. package/dist/workflow/set-attributes.js +65 -0
  219. package/dist/workflow/sleep.d.ts.map +1 -1
  220. package/dist/workflow/sleep.js +45 -8
  221. package/dist/workflow/world-init-stub.d.ts +15 -0
  222. package/dist/workflow/world-init-stub.d.ts.map +1 -0
  223. package/dist/workflow/world-init-stub.js +15 -0
  224. package/dist/workflow.d.ts.map +1 -1
  225. package/dist/workflow.js +148 -47
  226. package/docs/api-reference/create-hook.mdx +38 -0
  227. package/docs/api-reference/create-webhook.mdx +1 -0
  228. package/docs/api-reference/experimental-set-attributes.mdx +65 -0
  229. package/docs/api-reference/fetch.mdx +5 -0
  230. package/docs/api-reference/index.mdx +3 -0
  231. package/docs/foundations/cancellation.mdx +459 -0
  232. package/docs/foundations/errors-and-retries.mdx +7 -3
  233. package/docs/foundations/hooks.mdx +29 -0
  234. package/docs/foundations/idempotency.mdx +236 -11
  235. package/docs/foundations/index.mdx +3 -3
  236. package/docs/foundations/meta.json +3 -2
  237. package/docs/foundations/serialization.mdx +78 -42
  238. package/docs/foundations/starting-workflows.mdx +6 -2
  239. package/docs/foundations/streaming.mdx +14 -23
  240. package/docs/foundations/versioning.mdx +263 -0
  241. package/docs/how-it-works/cancellation.mdx +287 -0
  242. package/docs/how-it-works/code-transform.mdx +2 -2
  243. package/docs/how-it-works/encryption.mdx +2 -2
  244. package/docs/how-it-works/event-sourcing.mdx +2 -2
  245. package/docs/how-it-works/meta.json +2 -1
  246. package/package.json +22 -10
  247. package/docs/foundations/common-patterns.mdx +0 -265
@@ -0,0 +1,84 @@
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) simply 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
+ * Host clock skew beyond the near-elapsed threshold could in principle
54
+ * deliver such a continuation early enough to re-observe its wait and
55
+ * lose the re-enqueue to the burnt key; the threshold is the skew
56
+ * tolerance we accept for the benefit of exactly-one continuation per
57
+ * wait.
58
+ */
59
+ /**
60
+ * Maximum `delaySeconds` for a single wait-continuation message. Waits
61
+ * longer than this are chained across multiple hops. 23 hours: VQS
62
+ * messages have a 24h retention limit; the 1h buffer mirrors
63
+ * world-vercel's `MAX_DELAY_SECONDS`.
64
+ */
65
+ export declare const WAIT_CONTINUATION_MAX_DELAY_SECONDS = 82800;
66
+ /**
67
+ * Waits with at most this many seconds remaining use a second-bucketed
68
+ * idempotency key so an early-delivered continuation can re-enqueue its
69
+ * short-delay retry. This is also the host clock-skew tolerance for
70
+ * mid-range waits keyed on the bare correlationId.
71
+ */
72
+ export declare const NEAR_ELAPSED_WAIT_THRESHOLD_SECONDS = 2;
73
+ export interface WaitContinuationDispatch {
74
+ delaySeconds: number;
75
+ idempotencyKey: string;
76
+ }
77
+ /**
78
+ * Computes the queue delay and idempotency key for a wait-continuation
79
+ * message. `timeoutSeconds` is the time until the wait's `resumeAt`
80
+ * (floored at 1s by the suspension handler); `waitCorrelationId`
81
+ * identifies the wait so repeated suspension passes dedupe.
82
+ */
83
+ export declare function getWaitContinuationDispatch(timeoutSeconds: number, waitCorrelationId: string, now?: number): WaitContinuationDispatch;
84
+ //# sourceMappingURL=wait-continuation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wait-continuation.d.ts","sourceRoot":"","sources":["../../src/runtime/wait-continuation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyDG;AAEH;;;;;GAKG;AACH,eAAO,MAAM,mCAAmC,QAAS,CAAC;AAE1D;;;;;GAKG;AACH,eAAO,MAAM,mCAAmC,IAAI,CAAC;AAErD,MAAM,WAAW,wBAAwB;IACvC,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CACzC,cAAc,EAAE,MAAM,EACtB,iBAAiB,EAAE,MAAM,EACzB,GAAG,GAAE,MAAmB,GACvB,wBAAwB,CAc1B"}
@@ -0,0 +1,92 @@
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) simply 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
+ * Host clock skew beyond the near-elapsed threshold could in principle
54
+ * deliver such a continuation early enough to re-observe its wait and
55
+ * lose the re-enqueue to the burnt key; the threshold is the skew
56
+ * tolerance we accept for the benefit of exactly-one continuation per
57
+ * wait.
58
+ */
59
+ /**
60
+ * Maximum `delaySeconds` for a single wait-continuation message. Waits
61
+ * longer than this are chained across multiple hops. 23 hours: VQS
62
+ * messages have a 24h retention limit; the 1h buffer mirrors
63
+ * world-vercel's `MAX_DELAY_SECONDS`.
64
+ */
65
+ export const WAIT_CONTINUATION_MAX_DELAY_SECONDS = 82_800;
66
+ /**
67
+ * Waits with at most this many seconds remaining use a second-bucketed
68
+ * idempotency key so an early-delivered continuation can re-enqueue its
69
+ * short-delay retry. This is also the host clock-skew tolerance for
70
+ * mid-range waits keyed on the bare correlationId.
71
+ */
72
+ export const NEAR_ELAPSED_WAIT_THRESHOLD_SECONDS = 2;
73
+ /**
74
+ * Computes the queue delay and idempotency key for a wait-continuation
75
+ * message. `timeoutSeconds` is the time until the wait's `resumeAt`
76
+ * (floored at 1s by the suspension handler); `waitCorrelationId`
77
+ * identifies the wait so repeated suspension passes dedupe.
78
+ */
79
+ export function getWaitContinuationDispatch(timeoutSeconds, waitCorrelationId, now = Date.now()) {
80
+ if (timeoutSeconds <= NEAR_ELAPSED_WAIT_THRESHOLD_SECONDS) {
81
+ return {
82
+ delaySeconds: timeoutSeconds,
83
+ idempotencyKey: `${waitCorrelationId}:${Math.floor(now / 1000)}`,
84
+ };
85
+ }
86
+ const hop = Math.ceil(timeoutSeconds / WAIT_CONTINUATION_MAX_DELAY_SECONDS);
87
+ return {
88
+ delaySeconds: Math.min(timeoutSeconds, WAIT_CONTINUATION_MAX_DELAY_SECONDS),
89
+ idempotencyKey: hop === 1 ? waitCorrelationId : `${waitCorrelationId}:hop-${hop}`,
90
+ };
91
+ }
92
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FpdC1jb250aW51YXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS93YWl0LWNvbnRpbnVhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeURHO0FBRUg7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsTUFBTSxtQ0FBbUMsR0FBRyxNQUFNLENBQUM7QUFFMUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsTUFBTSxtQ0FBbUMsR0FBRyxDQUFDLENBQUM7QUFPckQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsMkJBQTJCLENBQ3pDLGNBQXNCLEVBQ3RCLGlCQUF5QixFQUN6QixNQUFjLElBQUksQ0FBQyxHQUFHLEVBQUU7SUFFeEIsSUFBSSxjQUFjLElBQUksbUNBQW1DLEVBQUUsQ0FBQztRQUMxRCxPQUFPO1lBQ0wsWUFBWSxFQUFFLGNBQWM7WUFDNUIsY0FBYyxFQUFFLEdBQUcsaUJBQWlCLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUU7U0FDakUsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsR0FBRyxtQ0FBbUMsQ0FBQyxDQUFDO0lBQzVFLE9BQU87UUFDTCxZQUFZLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsbUNBQW1DLENBQUM7UUFDM0UsY0FBYyxFQUNaLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxHQUFHLGlCQUFpQixRQUFRLEdBQUcsRUFBRTtLQUNwRSxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogV2FpdC1jb250aW51YXRpb24gZGlzcGF0Y2g6IGRlbGF5ICsgaWRlbXBvdGVuY3kta2V5IHNlbGVjdGlvbi5cbiAqXG4gKiBXaGVuIFYyIHN1c3BlbnNpb24gcHJvY2Vzc2luZyBvYnNlcnZlcyBhIHBlbmRpbmcgd2FpdCwgaXQgZW5xdWV1ZXMgYVxuICogZGVsYXllZCBcImNvbnRpbnVhdGlvblwiIG1lc3NhZ2UgdGhhdCBmaXJlcyBvbmNlIHRoZSB3YWl0IGVsYXBzZXMgYW5kXG4gKiBkcml2ZXMgdGhlIG5leHQgcmVwbGF5ICh3aGljaCBjb21wbGV0ZXMgdGhlIHdhaXQgdmlhIHRoZSBcImNvbXBsZXRlXG4gKiBlbGFwc2VkIHdhaXRzXCIgcGFzcykuIFRoaXMgbW9kdWxlIGRlY2lkZXMgdGhlIG1lc3NhZ2UncyBgZGVsYXlTZWNvbmRzYFxuICogYW5kIGBpZGVtcG90ZW5jeUtleWAuXG4gKlxuICogVGhlIGNvbnRpbnVhdGlvbiBpcyBrZXllZCBvbiB0aGUgd2FpdCdzIGNvcnJlbGF0aW9uSWQ6IHdoaWxlIGEgd2FpdCBpc1xuICogcGVuZGluZywgZXZlcnkgcmVwbGF5IHBhc3Mgb3ZlciB0aGUgcnVuIHJlLW9ic2VydmVzIGl0IChlLmcuLCBvbmNlIHBlclxuICogc3RlcCBjb21wbGV0aW9uIGluIGBQcm9taXNlLmFsbChbc3RlcHMuLi4sIHNsZWVwKCldKWApLCBhbmQgd2l0aG91dFxuICogZGVkdXBlIGVhY2ggcGFzcyB3b3VsZCBlbnF1ZXVlIGFub3RoZXIgZGVsYXllZCBjb250aW51YXRpb24g4oCUIGVhY2ggb25lXG4gKiBhIHNwdXJpb3VzIGZ1bGwgcmVwbGF5IHdoZW4gdGhlIHdhaXQgZWxhcHNlcywgYW5kIGVhY2ggYSBmcmVzaCBtZXNzYWdlXG4gKiB0aGF0IHJlc2V0cyB0aGUgZGVsaXZlcnktYXR0ZW1wdCBydW5hd2F5IGd1YXJkLiBBIGtleSBpcyBhdHRhY2hlZCBpblxuICogYWxsIGNhc2VzOiBzb21lIHdvcmxkcyAoZS5nLiB3b3JsZC1wb3N0Z3Jlcykgc2VyaWFsaXplIGtleS1sZXNzXG4gKiB3b3JrZmxvdyBtZXNzYWdlcyBwZXIgcnVuLCB3aGljaCB3b3VsZCBwYXJrIHRoZSBjb250aW51YXRpb24gYmVoaW5kXG4gKiB0aGUgaGFuZGxlcidzIG93biBpbmxpbmUgc3RlcCBleGVjdXRpb24gYW5kIGRlZmVhdCB0aGUgcmFjZSBzZW1hbnRpY3NcbiAqIHRoZSBjb250aW51YXRpb24gZXhpc3RzIHRvIHByb3ZpZGUuXG4gKlxuICogVGhlIGJhcmUgY29ycmVsYXRpb25JZCBjYW5ub3QgYmUgdGhlIGtleSBpbiBldmVyeSBjYXNlLCB0aG91Z2g6IHdvcmxkXG4gKiBkZWR1cGUgd2luZG93cyBvdXRsaXZlIHRoZSBmaXJzdCBkZWxpdmVyeSAoVlFTIGtlZXBzIGlkZW1wb3RlbmN5XG4gKiByZWNvcmRzIHVudGlsIG1lc3NhZ2UtcmV0ZW50aW9uIFRUTDsgd29ybGQtcG9zdGdyZXMga2VlcHMgYVxuICogY29tcGxldGVkLWtleXMgY2FjaGUpLCBzbyBvbmNlIGEga2V5IGhhcyBiZWVuIHVzZWQsIGEgbGF0ZXIgZW5xdWV1ZVxuICogdW5kZXIgdGhlIHNhbWUga2V5IGlzIHNpbGVudGx5IGRyb3BwZWQuIEFueSBzaXR1YXRpb24gd2hlcmUgYVxuICogY29udGludWF0aW9uIGlzIGRlbGl2ZXJlZCB3aGlsZSBpdHMgd2FpdCBpcyBzdGlsbCBwZW5kaW5nIHRoZXJlZm9yZVxuICogbmVlZHMgYSBmcmVzaCBrZXkgZm9yIHRoZSByZS1lbnF1ZXVlLCBvciB0aGUgd2FpdCdzIHRpbWVyIGlzIGxvc3QgYW5kXG4gKiB0aGUgcnVuIHN0YWxscyB1bnRpbCB1bnJlbGF0ZWQgdHJhZmZpYyBoYXBwZW5zIHRvIHdha2UgaXQuIFR3byBzdWNoXG4gKiBzaXR1YXRpb25zIGV4aXN0LCBlYWNoIHdpdGggaXRzIG93biBrZXkgdmFyaWF0aW9uOlxuICpcbiAqIC0gV2FpdHMgbG9uZ2VyIHRoYW4gdGhlIG1heGltdW0gcXVldWUgZGVsYXkgYXJlIGNoYWluZWQ6IHRoZSBkZWxheSBpc1xuICogICBjbGFtcGVkIHRvIGBXQUlUX0NPTlRJTlVBVElPTl9NQVhfREVMQVlfU0VDT05EU2AgKDIzaCDigJQgVlFTIG1lc3NhZ2VzXG4gKiAgIGhhdmUgYSAyNGggcmV0ZW50aW9uIGxpbWl0LCBhbmQgb25lIGhvdXIgb2YgYnVmZmVyIG1hdGNoZXNcbiAqICAgd29ybGQtdmVyY2VsJ3Mgb3duIGNsYW1wIGZvciBkZWxheWVkIHJlLWVucXVldWVzKSwgc28gdGhlXG4gKiAgIGNvbnRpbnVhdGlvbiBpbnRlbnRpb25hbGx5IGZpcmVzIGVhcmx5LCByZS1vYnNlcnZlcyB0aGUgd2FpdCwgYW5kXG4gKiAgIG11c3QgZW5xdWV1ZSB0aGUgbmV4dCBob3AuIFRoZSBrZXkgaXMgc3VmZml4ZWQgd2l0aCB0aGUgaG9wIGluZGV4XG4gKiAgIChgY2VpbCh0aW1lb3V0U2Vjb25kcyAvIG1heERlbGF5KWApOiBzdGFibGUgZm9yIGV2ZXJ5IHJlLW9ic2VydmF0aW9uXG4gKiAgIHdpdGhpbiB0aGUgc2FtZSBob3Agd2luZG93IChzbyBwYXNzZXMgZGVkdXBlKSwgZGVjcmVtZW50ZWQgYXQgZWFjaFxuICogICBob3AgZGVsaXZlcnkgKHNvIHRoZSBjaGFpbiBhbHdheXMgYWR2YW5jZXMpLiBXb3JsZHMgd2l0aG91dCBhIGRlbGF5XG4gKiAgIGxpbWl0ICh3b3JsZC1wb3N0Z3Jlcywgd29ybGQtbG9jYWwpIHNpbXBseSB0YWtlIHRoZSBzYW1lIOKJpDIzaCBob3BzLlxuICpcbiAqIC0gTmVhci1lbGFwc2VkIHdhaXRzICjiiaQycyByZW1haW5pbmcpIGdldCBhIHNlY29uZC1idWNrZXRlZCBzdWZmaXguIEFcbiAqICAgY29udGludWF0aW9uIGRlbGl2ZXJlZCBtYXJnaW5hbGx5IGVhcmx5IChjbG9jayBza2V3IGJldHdlZW4gdGhlXG4gKiAgIGVucXVldWluZyBhbmQgaGFuZGxpbmcgaG9zdHM7IHRoZSBjZWlsKCkgb24gdGhlIGRlbGF5IGNhbiBsZWF2ZSBhIH4wXG4gKiAgIG1hcmdpbikgcmUtb2JzZXJ2ZXMgdGhlIHdhaXQgYXMgcGVuZGluZyB3aXRoIH4xcyByZW1haW5pbmcgYW5kIG11c3RcbiAqICAgYmUgYWJsZSB0byBlbnF1ZXVlIGEgZnJlc2ggc2hvcnQtZGVsYXkgcmV0cnkuIFRoZSBidWNrZXQgc3VmZml4XG4gKiAgIGtlZXBzIHRoYXQgcmV0cnkgZW5xdWV1ZWFibGUgKGl0cyDiiaUxcyBkZWxheSBndWFyYW50ZWVzIGEgbGF0ZXJcbiAqICAgYnVja2V0KSB3aGlsZSBzdGlsbCBjb2xsYXBzaW5nIHNhbWUtaW5zdGFudCBkdXBsaWNhdGVzLlxuICpcbiAqIE1pZC1yYW5nZSB3YWl0cyAobW9yZSB0aGFuIHRoZSBuZWFyLWVsYXBzZWQgdGhyZXNob2xkLCBhdCBtb3N0IG9uZVxuICogaG9wKSB1c2UgdGhlIGJhcmUgY29ycmVsYXRpb25JZDogZXZlcnkgcmUtb2JzZXJ2YXRpb24gdGFyZ2V0cyB0aGUgc2FtZVxuICogZGVhZGxpbmUsIHNvIGRlZHVwaW5nIHRvIHRoZSBmaXJzdCBtZXNzYWdlIGlzIHNlbWFudGljYWxseSBsb3NzbGVzcy5cbiAqIEhvc3QgY2xvY2sgc2tldyBiZXlvbmQgdGhlIG5lYXItZWxhcHNlZCB0aHJlc2hvbGQgY291bGQgaW4gcHJpbmNpcGxlXG4gKiBkZWxpdmVyIHN1Y2ggYSBjb250aW51YXRpb24gZWFybHkgZW5vdWdoIHRvIHJlLW9ic2VydmUgaXRzIHdhaXQgYW5kXG4gKiBsb3NlIHRoZSByZS1lbnF1ZXVlIHRvIHRoZSBidXJudCBrZXk7IHRoZSB0aHJlc2hvbGQgaXMgdGhlIHNrZXdcbiAqIHRvbGVyYW5jZSB3ZSBhY2NlcHQgZm9yIHRoZSBiZW5lZml0IG9mIGV4YWN0bHktb25lIGNvbnRpbnVhdGlvbiBwZXJcbiAqIHdhaXQuXG4gKi9cblxuLyoqXG4gKiBNYXhpbXVtIGBkZWxheVNlY29uZHNgIGZvciBhIHNpbmdsZSB3YWl0LWNvbnRpbnVhdGlvbiBtZXNzYWdlLiBXYWl0c1xuICogbG9uZ2VyIHRoYW4gdGhpcyBhcmUgY2hhaW5lZCBhY3Jvc3MgbXVsdGlwbGUgaG9wcy4gMjMgaG91cnM6IFZRU1xuICogbWVzc2FnZXMgaGF2ZSBhIDI0aCByZXRlbnRpb24gbGltaXQ7IHRoZSAxaCBidWZmZXIgbWlycm9yc1xuICogd29ybGQtdmVyY2VsJ3MgYE1BWF9ERUxBWV9TRUNPTkRTYC5cbiAqL1xuZXhwb3J0IGNvbnN0IFdBSVRfQ09OVElOVUFUSU9OX01BWF9ERUxBWV9TRUNPTkRTID0gODJfODAwO1xuXG4vKipcbiAqIFdhaXRzIHdpdGggYXQgbW9zdCB0aGlzIG1hbnkgc2Vjb25kcyByZW1haW5pbmcgdXNlIGEgc2Vjb25kLWJ1Y2tldGVkXG4gKiBpZGVtcG90ZW5jeSBrZXkgc28gYW4gZWFybHktZGVsaXZlcmVkIGNvbnRpbnVhdGlvbiBjYW4gcmUtZW5xdWV1ZSBpdHNcbiAqIHNob3J0LWRlbGF5IHJldHJ5LiBUaGlzIGlzIGFsc28gdGhlIGhvc3QgY2xvY2stc2tldyB0b2xlcmFuY2UgZm9yXG4gKiBtaWQtcmFuZ2Ugd2FpdHMga2V5ZWQgb24gdGhlIGJhcmUgY29ycmVsYXRpb25JZC5cbiAqL1xuZXhwb3J0IGNvbnN0IE5FQVJfRUxBUFNFRF9XQUlUX1RIUkVTSE9MRF9TRUNPTkRTID0gMjtcblxuZXhwb3J0IGludGVyZmFjZSBXYWl0Q29udGludWF0aW9uRGlzcGF0Y2gge1xuICBkZWxheVNlY29uZHM6IG51bWJlcjtcbiAgaWRlbXBvdGVuY3lLZXk6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgcXVldWUgZGVsYXkgYW5kIGlkZW1wb3RlbmN5IGtleSBmb3IgYSB3YWl0LWNvbnRpbnVhdGlvblxuICogbWVzc2FnZS4gYHRpbWVvdXRTZWNvbmRzYCBpcyB0aGUgdGltZSB1bnRpbCB0aGUgd2FpdCdzIGByZXN1bWVBdGBcbiAqIChmbG9vcmVkIGF0IDFzIGJ5IHRoZSBzdXNwZW5zaW9uIGhhbmRsZXIpOyBgd2FpdENvcnJlbGF0aW9uSWRgXG4gKiBpZGVudGlmaWVzIHRoZSB3YWl0IHNvIHJlcGVhdGVkIHN1c3BlbnNpb24gcGFzc2VzIGRlZHVwZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdhaXRDb250aW51YXRpb25EaXNwYXRjaChcbiAgdGltZW91dFNlY29uZHM6IG51bWJlcixcbiAgd2FpdENvcnJlbGF0aW9uSWQ6IHN0cmluZyxcbiAgbm93OiBudW1iZXIgPSBEYXRlLm5vdygpXG4pOiBXYWl0Q29udGludWF0aW9uRGlzcGF0Y2gge1xuICBpZiAodGltZW91dFNlY29uZHMgPD0gTkVBUl9FTEFQU0VEX1dBSVRfVEhSRVNIT0xEX1NFQ09ORFMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGVsYXlTZWNvbmRzOiB0aW1lb3V0U2Vjb25kcyxcbiAgICAgIGlkZW1wb3RlbmN5S2V5OiBgJHt3YWl0Q29ycmVsYXRpb25JZH06JHtNYXRoLmZsb29yKG5vdyAvIDEwMDApfWAsXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IGhvcCA9IE1hdGguY2VpbCh0aW1lb3V0U2Vjb25kcyAvIFdBSVRfQ09OVElOVUFUSU9OX01BWF9ERUxBWV9TRUNPTkRTKTtcbiAgcmV0dXJuIHtcbiAgICBkZWxheVNlY29uZHM6IE1hdGgubWluKHRpbWVvdXRTZWNvbmRzLCBXQUlUX0NPTlRJTlVBVElPTl9NQVhfREVMQVlfU0VDT05EUyksXG4gICAgaWRlbXBvdGVuY3lLZXk6XG4gICAgICBob3AgPT09IDEgPyB3YWl0Q29ycmVsYXRpb25JZCA6IGAke3dhaXRDb3JyZWxhdGlvbklkfTpob3AtJHtob3B9YCxcbiAgfTtcbn1cbiJdfQ==
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FpdC11bnRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL3dhaXQtdW50aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxVQUFVLFNBQVMsQ0FBQyxPQUF5QjtJQUNqRCxLQUFLLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRTtRQUN0RCxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDckIsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FDM0IsT0FBeUIsRUFDekIsT0FBK0I7SUFFL0IsU0FBUyxDQUNQLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtRQUNwQixNQUFNLFlBQVksR0FDaEIsR0FBRyxFQUFFLElBQUksS0FBSyxZQUFZLElBQUksR0FBRyxFQUFFLElBQUksS0FBSyxpQkFBaUIsQ0FBQztRQUNoRSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDO2dCQUNILE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNmLENBQUM7WUFBQyxNQUFNLENBQUM7Z0JBQ1AsbURBQW1EO1lBQ3JELENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQ0gsQ0FBQztBQUNKLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLFdBQVcsQ0FBSSxFQUFvQjtJQUN2RCxNQUFNLE1BQU0sR0FBRyxFQUFFLEVBQUUsQ0FBQztJQUNwQixTQUFTLENBQ1AsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUU7UUFDaEIsZ0RBQWdEO1FBQ2hELGtEQUFrRDtRQUNsRCx5QkFBeUI7SUFDM0IsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNGLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gd2FpdFVudGlsKHByb21pc2U6IFByb21pc2U8dW5rbm93bj4pOiB2b2lkIHtcbiAgdm9pZCBpbXBvcnQoJ0B2ZXJjZWwvZnVuY3Rpb25zJykudGhlbigoeyB3YWl0VW50aWwgfSkgPT4ge1xuICAgIHdhaXRVbnRpbChwcm9taXNlKTtcbiAgfSk7XG59XG5cbi8qKlxuICogU2NoZWR1bGUgYSBiYWNrZ3JvdW5kIHByb21pc2UgdmlhIGB3YWl0VW50aWxgLCBndWFyYW50ZWVpbmcgdGhhdCB0aGVcbiAqIHByb21pc2UgaGFuZGVkIHRvIGB3YWl0VW50aWxgIGNhbiBuZXZlciByZWplY3QuIE5vdGhpbmcgY29uc3VtZXMgYVxuICogYHdhaXRVbnRpbGAgcHJvbWlzZSwgc28gYSByZWplY3Rpb24gc3VyZmFjZXMgYXMgYW4gYHVuaGFuZGxlZFJlamVjdGlvbmBcbiAqIGFuZCBjYW4gY3Jhc2ggdGhlIHByb2Nlc3Mg4oCUIGV2ZW4gd2hlbiB0aGUgc2FtZSB1bmRlcmx5aW5nIGVycm9yIGlzXG4gKiBjb3JyZWN0bHkgaGFuZGxlZCBieSBhbiBhd2FpdGVkIGNvcHkgZWxzZXdoZXJlLlxuICpcbiAqIEV4cGVjdGVkIGNsaWVudC1kaXNjb25uZWN0IGVycm9ycyAoYEFib3J0RXJyb3JgIC8gYFJlc3BvbnNlQWJvcnRlZGApXG4gKiBhcmUgaWdub3JlZC4gQW55IG90aGVyIGVycm9yIGlzIHBhc3NlZCB0byBgb25FcnJvcmAgYW5kIHN3YWxsb3dlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNhZmVXYWl0VW50aWwoXG4gIHByb21pc2U6IFByb21pc2U8dW5rbm93bj4sXG4gIG9uRXJyb3I6IChlcnI6IHVua25vd24pID0+IHZvaWRcbik6IHZvaWQge1xuICB3YWl0VW50aWwoXG4gICAgcHJvbWlzZS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICBjb25zdCBpc0Fib3J0RXJyb3IgPVxuICAgICAgICBlcnI/Lm5hbWUgPT09ICdBYm9ydEVycm9yJyB8fCBlcnI/Lm5hbWUgPT09ICdSZXNwb25zZUFib3J0ZWQnO1xuICAgICAgaWYgKCFpc0Fib3J0RXJyb3IpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBvbkVycm9yKGVycik7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIE5ldmVyIGxldCBvbkVycm9yIGJyZWFrIHRoZSBuby1yZWplY3QgZ3VhcmFudGVlLlxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgKTtcbn1cblxuLyoqXG4gKiBBIHNtYWxsIHdyYXBwZXIgYXJvdW5kIGB3YWl0VW50aWxgIHRoYXQgYWxzbyByZXR1cm5zXG4gKiB0aGUgcmVzdWx0IG9mIHRoZSBhd2FpdGVkIHByb21pc2UuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3YWl0ZWRVbnRpbDxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICBjb25zdCByZXN1bHQgPSBmbigpO1xuICB3YWl0VW50aWwoXG4gICAgcmVzdWx0LmNhdGNoKCgpID0+IHtcbiAgICAgIC8vIElnbm9yZSBlcnJvciBmcm9tIHRoZSBwcm9taXNlIGJlaW5nIHJlamVjdGVkLlxuICAgICAgLy8gSXQncyBleHBlY3RlZCB0aGF0IHRoZSBpbnZva2VyIG9mIGB3YWl0ZWRVbnRpbGBcbiAgICAgIC8vIHdpbGwgaGFuZGxlIHRoZSBlcnJvci5cbiAgICB9KVxuICApO1xuICByZXR1cm4gcmVzdWx0O1xufVxuIl19
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Server-only side-effect module that ensures `world.ts` is loaded so its
3
+ * module-load side effect — `globalThis[GetWorldFnKey] ??= getWorld` —
4
+ * fires in host bundles.
5
+ *
6
+ * # Why this exists
7
+ *
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
15
+ * globalThis registration never fires.
16
+ *
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.
33
+ *
34
+ * # Why a separate module instead of importing `./world.js` directly
35
+ *
36
+ * `world.ts` is internal to `@workflow/core` and not part of the public
37
+ * exports surface. Adding a dedicated public init entry (this file)
38
+ * keeps the side-effect intent obvious to anyone reading
39
+ * `packages/workflow/src/api.ts`, and lets the `workflow` export
40
+ * condition route to a stub for VM/step bundles (see below).
41
+ *
42
+ * # Why this doesn't break VM/step bundles
43
+ *
44
+ * The `@workflow/core/runtime/world-init` export resolves via the
45
+ * `workflow` condition to `./dist/workflow/world-init-stub.js`, an empty
46
+ * module. Esbuild runs the workflow VM and step bundlers with the
47
+ * `workflow` condition active, so they pick up the stub and never reach
48
+ * `world.ts`. Host bundlers (webpack, turbopack, Node.js) use the
49
+ * `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).
64
+ *
65
+ * # Maintenance notes
66
+ *
67
+ * 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.
73
+ */
74
+ import './world.js';
75
+ //# sourceMappingURL=world-init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"world-init.d.ts","sourceRoot":"","sources":["../../src/runtime/world-init.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwEG;AACH,OAAO,YAAY,CAAC"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Server-only side-effect module that ensures `world.ts` is loaded so its
3
+ * module-load side effect — `globalThis[GetWorldFnKey] ??= getWorld` —
4
+ * fires in host bundles.
5
+ *
6
+ * # Why this exists
7
+ *
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
15
+ * globalThis registration never fires.
16
+ *
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.
33
+ *
34
+ * # Why a separate module instead of importing `./world.js` directly
35
+ *
36
+ * `world.ts` is internal to `@workflow/core` and not part of the public
37
+ * exports surface. Adding a dedicated public init entry (this file)
38
+ * keeps the side-effect intent obvious to anyone reading
39
+ * `packages/workflow/src/api.ts`, and lets the `workflow` export
40
+ * condition route to a stub for VM/step bundles (see below).
41
+ *
42
+ * # Why this doesn't break VM/step bundles
43
+ *
44
+ * The `@workflow/core/runtime/world-init` export resolves via the
45
+ * `workflow` condition to `./dist/workflow/world-init-stub.js`, an empty
46
+ * module. Esbuild runs the workflow VM and step bundlers with the
47
+ * `workflow` condition active, so they pick up the stub and never reach
48
+ * `world.ts`. Host bundlers (webpack, turbopack, Node.js) use the
49
+ * `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).
64
+ *
65
+ * # Maintenance notes
66
+ *
67
+ * 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.
73
+ */
74
+ import './world.js';
75
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ybGQtaW5pdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL3dvcmxkLWluaXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXdFRztBQUNILE9BQU8sWUFBWSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTZXJ2ZXItb25seSBzaWRlLWVmZmVjdCBtb2R1bGUgdGhhdCBlbnN1cmVzIGB3b3JsZC50c2AgaXMgbG9hZGVkIHNvIGl0c1xuICogbW9kdWxlLWxvYWQgc2lkZSBlZmZlY3Qg4oCUIGBnbG9iYWxUaGlzW0dldFdvcmxkRm5LZXldID8/PSBnZXRXb3JsZGAg4oCUXG4gKiBmaXJlcyBpbiBob3N0IGJ1bmRsZXMuXG4gKlxuICogIyBXaHkgdGhpcyBleGlzdHNcbiAqXG4gKiBgZ2V0V29ybGRMYXp5KClgIGluIGAuL2dldC13b3JsZC1sYXp5LnRzYCBjaGVja3MgdGhlIGdsb2JhbFRoaXMgY2FjaGVcbiAqIChwb3B1bGF0ZWQgYnkgYHdvcmxkLnRzYCdzIG1vZHVsZS1sb2FkIHNpZGUgZWZmZWN0KSBiZWZvcmUgZmFsbGluZyBiYWNrXG4gKiB0byBhIHJ1bnRpbWUtYnVpbHQgZHluYW1pYyBgaW1wb3J0KCcuL3dvcmxkLmpzJylgLiBXaGVuIGEgc2VydmVyIHJvdXRlXG4gKiBvbmx5IGNvbnN1bWVzIGEgc2luZ2xlIGhlbHBlciB0aGF0IGdvZXMgdGhyb3VnaCBgZ2V0V29ybGRMYXp5YCDigJQgbW9zdFxuICogY29tbW9ubHkgYHN0YXJ0YCBmcm9tIGB3b3JrZmxvdy9hcGlgIOKAlCB3ZWJwYWNrL3R1cmJvcGFjayB0cmVlLXNoYWtlIHRoZVxuICogbmFtZWQgaW1wb3J0IGB7IGdldFdvcmxkIH0gZnJvbSAnLi9ydW50aW1lL3dvcmxkLmpzJ2Agb3V0IG9mXG4gKiBgcnVudGltZS50c2AsIHRha2luZyBgd29ybGQudHNgJ3MgbW9kdWxlIGV2YWx1YXRpb24gd2l0aCBpdC4gVGhlXG4gKiBnbG9iYWxUaGlzIHJlZ2lzdHJhdGlvbiBuZXZlciBmaXJlcy5cbiAqXG4gKiBgZ2V0V29ybGRMYXp5YCB0aGVuIGZhbGxzIHRocm91Z2ggdG8gaXRzIGR5bmFtaWMtaW1wb3J0IGZhbGxiYWNrLCB3aGljaFxuICogaXRzZWxmIGZhaWxzOiB3ZWJwYWNrIGlubGluZXMgYGdldC13b3JsZC1sYXp5LmpzYCBpbnRvIHRoZSBidW5kbGVkIHJvdXRlXG4gKiBmaWxlLCBzbyB0aGUgcmVsYXRpdmUgc3BlY2lmaWVyIGAuL3dvcmxkLmpzYCByZXNvbHZlcyBhZ2FpbnN0XG4gKiBgL3Zhci90YXNrLzxhcHA+Ly5uZXh0L3NlcnZlci9hcHAvPC4uLj4vcm91dGUuanNgIOKAlCB3aGVyZSBubyBzaWJsaW5nXG4gKiBgd29ybGQuanNgIGV4aXN0cyDigJQgYW5kIE5vZGUgdGhyb3dzIGBNT0RVTEVfTk9UX0ZPVU5EYC4gVGhlIHN5bXB0b20gaXMgYVxuICogY29sZC1zdGFydCByZWdyZXNzaW9uOiB0aGUgdmVyeSBmaXJzdCB1c2VyIHJlcXVlc3QgdGhhdCBnb2VzIHRocm91Z2hcbiAqIGBzdGFydCgpYCBmYWlscyB1bnRpbCBzb21lIG90aGVyIGNvZGUgcGF0aCAodHlwaWNhbGx5IHRoZSBxdWV1ZS1kcml2ZW5cbiAqIGAvLndlbGwta25vd24vd29ya2Zsb3cvdjEvZmxvd2Agcm91dGUsIHdoaWNoIHVzZXMgYGdldFdvcmxkYCBkaXJlY3RseVxuICogdmlhIGB3b3JrZmxvd0VudHJ5cG9pbnRgKSBoYXMgbG9hZGVkIGB3b3JsZC50c2AgYW5kIHBvcHVsYXRlZCB0aGVcbiAqIGNhY2hlLlxuICpcbiAqIEltcG9ydGluZyB0aGlzIG1vZHVsZSBmb3IgaXRzIHNpZGUgZWZmZWN0IOKAlCBleGFjdGx5IG9uY2UsIGZyb20gdGhlXG4gKiBob3N0LXNpZGUgYHdvcmtmbG93L2FwaWAgKGBwYWNrYWdlcy93b3JrZmxvdy9zcmMvYXBpLnRzYCkg4oCUIGd1YXJhbnRlZXNcbiAqIGB3b3JsZC50c2AgZW50ZXJzIHRoZSBidW5kbGUsIHRoZSBnbG9iYWwgaXMgcmVnaXN0ZXJlZCBhdCBtb2R1bGUgbG9hZCxcbiAqIGFuZCBgZ2V0V29ybGRMYXp5KClgIHNob3J0LWNpcmN1aXRzIHRvIHRoZSByZWdpc3RlcmVkIGZ1bmN0aW9uIG9uIHRoZVxuICogZmlyc3QgY2FsbC5cbiAqXG4gKiAjIFdoeSBhIHNlcGFyYXRlIG1vZHVsZSBpbnN0ZWFkIG9mIGltcG9ydGluZyBgLi93b3JsZC5qc2AgZGlyZWN0bHlcbiAqXG4gKiBgd29ybGQudHNgIGlzIGludGVybmFsIHRvIGBAd29ya2Zsb3cvY29yZWAgYW5kIG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWNcbiAqIGV4cG9ydHMgc3VyZmFjZS4gQWRkaW5nIGEgZGVkaWNhdGVkIHB1YmxpYyBpbml0IGVudHJ5ICh0aGlzIGZpbGUpXG4gKiBrZWVwcyB0aGUgc2lkZS1lZmZlY3QgaW50ZW50IG9idmlvdXMgdG8gYW55b25lIHJlYWRpbmdcbiAqIGBwYWNrYWdlcy93b3JrZmxvdy9zcmMvYXBpLnRzYCwgYW5kIGxldHMgdGhlIGB3b3JrZmxvd2AgZXhwb3J0XG4gKiBjb25kaXRpb24gcm91dGUgdG8gYSBzdHViIGZvciBWTS9zdGVwIGJ1bmRsZXMgKHNlZSBiZWxvdykuXG4gKlxuICogIyBXaHkgdGhpcyBkb2Vzbid0IGJyZWFrIFZNL3N0ZXAgYnVuZGxlc1xuICpcbiAqIFRoZSBgQHdvcmtmbG93L2NvcmUvcnVudGltZS93b3JsZC1pbml0YCBleHBvcnQgcmVzb2x2ZXMgdmlhIHRoZVxuICogYHdvcmtmbG93YCBjb25kaXRpb24gdG8gYC4vZGlzdC93b3JrZmxvdy93b3JsZC1pbml0LXN0dWIuanNgLCBhbiBlbXB0eVxuICogbW9kdWxlLiBFc2J1aWxkIHJ1bnMgdGhlIHdvcmtmbG93IFZNIGFuZCBzdGVwIGJ1bmRsZXJzIHdpdGggdGhlXG4gKiBgd29ya2Zsb3dgIGNvbmRpdGlvbiBhY3RpdmUsIHNvIHRoZXkgcGljayB1cCB0aGUgc3R1YiBhbmQgbmV2ZXIgcmVhY2hcbiAqIGB3b3JsZC50c2AuIEhvc3QgYnVuZGxlcnMgKHdlYnBhY2ssIHR1cmJvcGFjaywgTm9kZS5qcykgdXNlIHRoZVxuICogYGRlZmF1bHRgIChvciBgbm9kZWApIGNvbmRpdGlvbiBhbmQgcGljayB1cCB0aGlzIGZpbGUsIGxvYWRpbmdcbiAqIGB3b3JsZC50c2AgYXMgaW50ZW5kZWQuIFRoZSBzcGxpdCBrZWVwcyBgQHdvcmtmbG93L3dvcmxkLXZlcmNlbGAsXG4gKiBgQHdvcmtmbG93L3dvcmxkLWxvY2FsYCwgYGNib3IteGAsIGFuZCBvdGhlciBzZXJ2ZXItb25seSBkZXBzIG91dCBvZlxuICogdGhlIHdvcmtmbG93IHNhbmRib3ggYnVuZGxlLlxuICpcbiAqICMgV2h5IHdlIGtlZXAgdGhlIGBnZXRXb3JsZExhenlgIGR5bmFtaWMtaW1wb3J0IGZhbGxiYWNrXG4gKlxuICogVGhlIGZhbGxiYWNrIHJlbWFpbnMgaW4gYC4vZ2V0LXdvcmxkLWxhenkudHNgIGFzIGEgZGVmZW5zZS1pbi1kZXB0aCBmb3JcbiAqIGVudmlyb25tZW50cyB3ZSBoYXZlbid0IGFjY291bnRlZCBmb3IgKENKUyB0ZXN0IHJ1bm5lcnMsIHNjcmlwdHMgdGhhdFxuICogaW1wb3J0IGBzdGFydGAgd2l0aG91dCBnb2luZyB0aHJvdWdoIGB3b3JrZmxvdy9hcGlgLCBmdXR1cmUgYnVuZGxlcnNcbiAqIHdpdGggc3RyaWN0ZXIgdHJlZS1zaGFraW5nKS4gV2l0aCB0aGlzIGluaXQgbW9kdWxlIGluIHBsYWNlLCB0aGVcbiAqIGZhbGxiYWNrIHNob3VsZCBuZXZlciBmaXJlIGluIG5vcm1hbCB1c2Ug4oCUIGJ1dCBpZiBpdCBkb2VzLCB0aGVcbiAqIGR5bmFtaWMtaW1wb3J0IGJyYW5jaCBzdGlsbCByZXNvbHZlcyBjb3JyZWN0bHkgd2hlbiBgd29ybGQuanNgIGlzXG4gKiBwaHlzaWNhbGx5IGFkamFjZW50IG9uIGRpc2sgKGUuZy4sIGRpcmVjdCBOb2RlLmpzIGV4ZWN1dGlvbiBvZlxuICogdW5idW5kbGVkIHNvdXJjZSkuXG4gKlxuICogIyBNYWludGVuYW5jZSBub3Rlc1xuICpcbiAqIElmIHlvdSBhZGQgYW5vdGhlciBgZ2V0V29ybGRMYXp5KClgIGNvbnN1bWVyIHRoYXQncyByZWFjaGFibGUgZnJvbSBhXG4gKiBob3N0IHJvdXRlIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCBgd29ya2Zsb3cvYXBpYCAoZS5nLiwgYSBuZXcgaGVscGVyIGluXG4gKiBgd29ya2Zsb3cvcnVudGltZWApLCBtYWtlIHN1cmUgdGhhdCBlbnRyeSBhbHNvIGltcG9ydHMgdGhpcyBtb2R1bGUg4oCUXG4gKiBvciB0aGF0IGl0IHRyYW5zaXRpdmVseSByZWFjaGVzIGB3b3JsZC50c2AgdmlhIGEgbm9uLXRyZWUtc2hha2VhYmxlXG4gKiBwYXRoLiBBZGRpbmcgYSByZWdyZXNzaW9uIHRlc3QgaW4gYHdvcmxkLWluaXQudGVzdC50c2AgaXMgcHJlZmVycmVkIHRvXG4gKiByZWx5aW5nIG9uIGNhcmVmdWwgbWFudWFsIHRyYWNpbmcuXG4gKi9cbmltcG9ydCAnLi93b3JsZC5qcyc7XG4iXX0=
@@ -1 +1 @@
1
- {"version":3,"file":"world.d.ts","sourceRoot":"","sources":["../../src/runtime/world.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAqD7C;;;;;;;;;;;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;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,22 +1,31 @@
1
1
  import { createRequire } from 'node:module';
2
- import { resolve } from 'node:path';
3
2
  import { pathToFileURL } from 'node:url';
4
3
  import { isVercelWorldTarget, resolveWorkflowTargetWorld, } from '@workflow/utils';
5
4
  import { createLocalWorld } from '@workflow/world-local';
6
5
  import { createVercelWorld } from '@workflow/world-vercel';
7
- const require = createRequire(pathToFileURL(process.cwd() + '/package.json').href);
6
+ function getRuntimeRequire() {
7
+ // Resolve from the app root (process.cwd()) so custom world packages
8
+ // like @workflow/world-postgres can be found even though they're not
9
+ // dependencies of @workflow/core. Using import.meta.url would resolve
10
+ // from core's location, missing app-level packages.
11
+ try {
12
+ return createRequire(pathToFileURL(process.cwd() + '/package.json').href);
13
+ }
14
+ catch {
15
+ return createRequire(import.meta.url);
16
+ }
17
+ }
8
18
  const WorldCache = Symbol.for('@workflow/world//cache');
9
19
  const StubbedWorldCache = Symbol.for('@workflow/world//stubbedCache');
10
20
  const WorldCachePromise = Symbol.for('@workflow/world//cachePromise');
11
21
  const StubbedWorldCachePromise = Symbol.for('@workflow/world//stubbedCachePromise');
12
22
  const globalSymbols = globalThis;
13
- /**
14
- * Hides the dynamic import behind `new Function` to prevent bundlers from
15
- * trying to resolve it at build time, since the world module may not exist
16
- * at build time. Falls back to `require()` in environments where
17
- * `new Function`-based `import()` is unavailable (e.g. CJS test runners).
18
- */
19
- const dynamicImport = new Function('specifier', 'return import(specifier)');
23
+ // Dynamic import for custom world modules. Uses a standard import()
24
+ // wrapped in a try/catch with require() fallback for CJS test runners.
25
+ // Note: the previous `new Function('specifier', 'return import(specifier)')`
26
+ // pattern was replaced because Turbopack (Next.js) treats unresolvable
27
+ // dynamic imports from `new Function` as fatal build errors in the V2
28
+ // combined flow route context.
20
29
  function resolveModulePath(specifier) {
21
30
  // Already a file:// URL
22
31
  if (specifier.startsWith('file://')) {
@@ -28,11 +37,12 @@ function resolveModulePath(specifier) {
28
37
  }
29
38
  // Relative path - resolve relative to cwd and convert to file:// URL
30
39
  if (specifier.startsWith('./') || specifier.startsWith('../')) {
31
- return pathToFileURL(resolve(process.cwd(), specifier)).href;
40
+ return pathToFileURL(
41
+ /* turbopackIgnore: true */ process.cwd() + '/' + specifier).href;
32
42
  }
33
43
  // Package specifier - use require.resolve to find the package
34
44
  try {
35
- return pathToFileURL(require.resolve(specifier)).href;
45
+ return pathToFileURL(getRuntimeRequire().resolve(specifier)).href;
36
46
  }
37
47
  catch {
38
48
  return specifier;
@@ -76,16 +86,16 @@ export const createWorld = async () => {
76
86
  dataDir: process.env.WORKFLOW_LOCAL_DATA_DIR,
77
87
  });
78
88
  }
79
- // Try dynamic import() first ESM-first since this PR's purpose is ESM support.
80
- // Fall back to require() for environments where `new Function`-based import()
81
- // is unavailable (e.g. CJS test runners).
89
+ // Try require() first for custom worlds this avoids Turbopack tracing
90
+ // a dynamic import() that it can't statically resolve. Fall back to
91
+ // dynamic import() for ESM-only packages.
82
92
  let mod;
83
93
  try {
84
- const resolvedPath = resolveModulePath(targetWorld);
85
- mod = await dynamicImport(resolvedPath);
94
+ mod = getRuntimeRequire()(targetWorld);
86
95
  }
87
96
  catch {
88
- mod = require(targetWorld);
97
+ const resolvedPath = resolveModulePath(targetWorld);
98
+ mod = await import(/* webpackIgnore: true */ resolvedPath);
89
99
  }
90
100
  if (typeof mod === 'function') {
91
101
  return mod();
@@ -151,4 +161,23 @@ export const setWorld = (world) => {
151
161
  globalSymbols[WorldCachePromise] = undefined;
152
162
  globalSymbols[StubbedWorldCachePromise] = undefined;
153
163
  };
154
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ybGQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS93b3JsZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDcEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUN6QyxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLDBCQUEwQixHQUMzQixNQUFNLGlCQUFpQixDQUFDO0FBRXpCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRTNELE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FDM0IsYUFBYSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxJQUFJLENBQ3BELENBQUM7QUFFRixNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLHdCQUF3QixDQUFDLENBQUM7QUFDeEQsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLCtCQUErQixDQUFDLENBQUM7QUFDdEUsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLCtCQUErQixDQUFDLENBQUM7QUFDdEUsTUFBTSx3QkFBd0IsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUN6QyxzQ0FBc0MsQ0FDdkMsQ0FBQztBQUVGLE1BQU0sYUFBYSxHQUtmLFVBQVUsQ0FBQztBQUVmOzs7OztHQUtHO0FBQ0gsTUFBTSxhQUFhLEdBQUcsSUFBSSxRQUFRLENBQUMsV0FBVyxFQUFFLDBCQUEwQixDQUV6RCxDQUFDO0FBRWxCLFNBQVMsaUJBQWlCLENBQUMsU0FBaUI7SUFDMUMsd0JBQXdCO0lBQ3hCLElBQUksU0FBUyxDQUFDLFVBQVUsQ0FBQyxT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QUFFLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDN0QsYUFBYSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsU0FBUyxDQUFDO1lBQzdDLE1BQU0sR0FBRyxDQUFDO1FBQ1osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsYUFBYSxDQUFDLFVBQVUsQ0FBQyxHQUFHLE1BQU0sYUFBYSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDbkUsT0FBTyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDbkMsQ0FBQyxDQUFDO0FBRUY7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLENBQUMsS0FBd0IsRUFBUSxFQUFFO0lBQ3pELGFBQWEsQ0FBQyxVQUFVLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDbEMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsS0FBSyxDQUFDO0lBQ3pDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLFNBQVMsQ0FBQztJQUM3QyxhQUFhLENBQUMsd0JBQXdCLENBQUMsR0FBRyxTQUFTLENBQUM7QUFDdEQsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gJ25vZGU6bW9kdWxlJztcbmltcG9ydCB7IHJlc29sdmUgfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgcGF0aFRvRmlsZVVSTCB9IGZyb20gJ25vZGU6dXJsJztcbmltcG9ydCB7XG4gIGlzVmVyY2VsV29ybGRUYXJnZXQsXG4gIHJlc29sdmVXb3JrZmxvd1RhcmdldFdvcmxkLFxufSBmcm9tICdAd29ya2Zsb3cvdXRpbHMnO1xuaW1wb3J0IHR5cGUgeyBXb3JsZCB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBjcmVhdGVMb2NhbFdvcmxkIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkLWxvY2FsJztcbmltcG9ydCB7IGNyZWF0ZVZlcmNlbFdvcmxkIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkLXZlcmNlbCc7XG5cbmNvbnN0IHJlcXVpcmUgPSBjcmVhdGVSZXF1aXJlKFxuICBwYXRoVG9GaWxlVVJMKHByb2Nlc3MuY3dkKCkgKyAnL3BhY2thZ2UuanNvbicpLmhyZWZcbik7XG5cbmNvbnN0IFdvcmxkQ2FjaGUgPSBTeW1ib2wuZm9yKCdAd29ya2Zsb3cvd29ybGQvL2NhY2hlJyk7XG5jb25zdCBTdHViYmVkV29ybGRDYWNoZSA9IFN5bWJvbC5mb3IoJ0B3b3JrZmxvdy93b3JsZC8vc3R1YmJlZENhY2hlJyk7XG5jb25zdCBXb3JsZENhY2hlUHJvbWlzZSA9IFN5bWJvbC5mb3IoJ0B3b3JrZmxvdy93b3JsZC8vY2FjaGVQcm9taXNlJyk7XG5jb25zdCBTdHViYmVkV29ybGRDYWNoZVByb21pc2UgPSBTeW1ib2wuZm9yKFxuICAnQHdvcmtmbG93L3dvcmxkLy9zdHViYmVkQ2FjaGVQcm9taXNlJ1xuKTtcblxuY29uc3QgZ2xvYmFsU3ltYm9sczogdHlwZW9mIGdsb2JhbFRoaXMgJiB7XG4gIFtXb3JsZENhY2hlXT86IFdvcmxkO1xuICBbU3R1YmJlZFdvcmxkQ2FjaGVdPzogV29ybGQ7XG4gIFtXb3JsZENhY2hlUHJvbWlzZV0/OiBQcm9taXNlPFdvcmxkPjtcbiAgW1N0dWJiZWRXb3JsZENhY2hlUHJvbWlzZV0/OiBQcm9taXNlPFdvcmxkPjtcbn0gPSBnbG9iYWxUaGlzO1xuXG4vKipcbiAqIEhpZGVzIHRoZSBkeW5hbWljIGltcG9ydCBiZWhpbmQgYG5ldyBGdW5jdGlvbmAgdG8gcHJldmVudCBidW5kbGVycyBmcm9tXG4gKiB0cnlpbmcgdG8gcmVzb2x2ZSBpdCBhdCBidWlsZCB0aW1lLCBzaW5jZSB0aGUgd29ybGQgbW9kdWxlIG1heSBub3QgZXhpc3RcbiAqIGF0IGJ1aWxkIHRpbWUuIEZhbGxzIGJhY2sgdG8gYHJlcXVpcmUoKWAgaW4gZW52aXJvbm1lbnRzIHdoZXJlXG4gKiBgbmV3IEZ1bmN0aW9uYC1iYXNlZCBgaW1wb3J0KClgIGlzIHVuYXZhaWxhYmxlIChlLmcuIENKUyB0ZXN0IHJ1bm5lcnMpLlxuICovXG5jb25zdCBkeW5hbWljSW1wb3J0ID0gbmV3IEZ1bmN0aW9uKCdzcGVjaWZpZXInLCAncmV0dXJuIGltcG9ydChzcGVjaWZpZXIpJykgYXMgKFxuICBzcGVjaWZpZXI6IHN0cmluZ1xuKSA9PiBQcm9taXNlPGFueT47XG5cbmZ1bmN0aW9uIHJlc29sdmVNb2R1bGVQYXRoKHNwZWNpZmllcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gQWxyZWFkeSBhIGZpbGU6Ly8gVVJMXG4gIGlmIChzcGVjaWZpZXIuc3RhcnRzV2l0aCgnZmlsZTovLycpKSB7XG4gICAgcmV0dXJuIHNwZWNpZmllcjtcbiAgfVxuICAvLyBBYnNvbHV0ZSBwYXRoIC0gY29udmVydCB0byBmaWxlOi8vIFVSTFxuICBpZiAoc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgIHJldHVybiBwYXRoVG9GaWxlVVJMKHNwZWNpZmllcikuaHJlZjtcbiAgfVxuICAvLyBSZWxhdGl2ZSBwYXRoIC0gcmVzb2x2ZSByZWxhdGl2ZSB0byBjd2QgYW5kIGNvbnZlcnQgdG8gZmlsZTovLyBVUkxcbiAgaWYgKHNwZWNpZmllci5zdGFydHNXaXRoKCcuLycpIHx8IHNwZWNpZmllci5zdGFydHNXaXRoKCcuLi8nKSkge1xuICAgIHJldHVybiBwYXRoVG9GaWxlVVJMKHJlc29sdmUocHJvY2Vzcy5jd2QoKSwgc3BlY2lmaWVyKSkuaHJlZjtcbiAgfVxuICAvLyBQYWNrYWdlIHNwZWNpZmllciAtIHVzZSByZXF1aXJlLnJlc29sdmUgdG8gZmluZCB0aGUgcGFja2FnZVxuICB0cnkge1xuICAgIHJldHVybiBwYXRoVG9GaWxlVVJMKHJlcXVpcmUucmVzb2x2ZShzcGVjaWZpZXIpKS5ocmVmO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gc3BlY2lmaWVyO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgbmV3IHdvcmxkIGluc3RhbmNlIGJhc2VkIG9uIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAqIFdPUktGTE9XX1RBUkdFVF9XT1JMRCBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgdGFyZ2V0IHdvcmxkLlxuICpcbiAqIE5vdGU6IFdPUktGTE9XX1ZFUkNFTF8qIGVudiB2YXJzIChQUk9KRUNULCBURUFNLCBBVVRIX1RPS0VOLCBldGMuKSBhcmVcbiAqIGludGVudGlvbmFsbHkgTk9UIHJlYWQgaGVyZS4gVGhvc2UgYXJlIGZvciBDTEkvb2JzZXJ2YWJpbGl0eSB0b29saW5nIG9ubHlcbiAqIGFuZCBzaG91bGQgbm90IGFmZmVjdCBydW50aW1lIGJlaGF2aW9yLiBUaGUgVmVyY2VsIHJ1bnRpbWUgcHJvdmlkZXNcbiAqIGF1dGhlbnRpY2F0aW9uIHZpYSBPSURDIHRva2VucyBhbmQgcHJvamVjdCBjb250ZXh0IHZpYSBzeXN0ZW0gZW52IHZhcnNcbiAqIChWRVJDRUxfREVQTE9ZTUVOVF9JRCwgVkVSQ0VMX1BST0pFQ1RfSUQpLiBUb29saW5nIHRoYXQgbmVlZHMgdGhlc2UgZW52XG4gKiB2YXJzIHNob3VsZCBjYWxsIGNyZWF0ZVZlcmNlbFdvcmxkKCkgZGlyZWN0bHkgd2l0aCBhbiBleHBsaWNpdCBjb25maWcgYW5kXG4gKiB1c2Ugc2V0V29ybGQoKSB0byBpbmplY3QgdGhlIGluc3RhbmNlLlxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlV29ybGQgPSBhc3luYyAoKTogUHJvbWlzZTxXb3JsZD4gPT4ge1xuICBjb25zdCB0YXJnZXRXb3JsZCA9IHJlc29sdmVXb3JrZmxvd1RhcmdldFdvcmxkKCk7XG5cbiAgaWYgKGlzVmVyY2VsV29ybGRUYXJnZXQodGFyZ2V0V29ybGQpKSB7XG4gICAgLy8gV2FybiBpZiBXT1JLRkxPV19WRVJDRUxfKiBlbnYgdmFycyBhcmUgc2V0IGluc2lkZSBhIFZlcmNlbCBzZXJ2ZXJsZXNzXG4gICAgLy8gZnVuY3Rpb24gKFZFUkNFTD0xKSDigJQgdGhleSBoYXZlIG5vIGVmZmVjdCBhdCBydW50aW1lIGFuZCBsaWtlbHkgaW5kaWNhdGVcbiAgICAvLyBhIG1pc2NvbmZpZ3VyYXRpb24gKHVzZXIgbWFudWFsbHkgYWRkZWQgdGhlbSBhcyBWZXJjZWwgcHJvamVjdCBlbnYgdmFycyxcbiAgICAvLyB3aGljaCBpcyBub3QgbmVlZGVkKS4gV2UgZ2F0ZSBvbiBWRVJDRUw9MSBzbyB0aGUgd2FybmluZyBkb2VzIG5vdCBmaXJlXG4gICAgLy8gd2hlbiB0aGUgQ0xJIG9yIHdlYiBvYnNlcnZhYmlsaXR5IGFwcCBzZXRzIHRoZXNlIGVudiB2YXJzIGludGVudGlvbmFsbHkuXG4gICAgY29uc3Qgc3RhbGVFbnZWYXJzID0gW1xuICAgICAgJ1dPUktGTE9XX1ZFUkNFTF9QUk9KRUNUJyxcbiAgICAgICdXT1JLRkxPV19WRVJDRUxfVEVBTScsXG4gICAgICAnV09SS0ZMT1dfVkVSQ0VMX0FVVEhfVE9LRU4nLFxuICAgICAgJ1dPUktGTE9XX1ZFUkNFTF9FTlYnLFxuICAgIF0uZmlsdGVyKChrZXkpID0+IHByb2Nlc3MuZW52W2tleV0pO1xuICAgIGlmIChzdGFsZUVudlZhcnMubGVuZ3RoID4gMCAmJiBwcm9jZXNzLmVudi5WRVJDRUwgPT09ICcxJykge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgW3dvcmtmbG93XSBXYXJuaW5nOiAke3N0YWxlRW52VmFycy5qb2luKCcsICcpfSBlbnYgdmFyKHMpIGAgK1xuICAgICAgICAgICdhcmUgc2V0IGJ1dCBoYXZlIG5vIGVmZmVjdCBhdCBydW50aW1lLiBUaGVzZSBhcmUgb25seSB1c2VkIGJ5IHRoZSBXb3JrZmxvdyBDTEkuICcgK1xuICAgICAgICAgICdSZW1vdmUgdGhlbSBmcm9tIHlvdXIgVmVyY2VsIHByb2plY3QgZW52aXJvbm1lbnQgdmFyaWFibGVzLidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNyZWF0ZVZlcmNlbFdvcmxkKCk7XG4gIH1cblxuICBpZiAodGFyZ2V0V29ybGQgPT09ICdsb2NhbCcpIHtcbiAgICByZXR1cm4gY3JlYXRlTG9jYWxXb3JsZCh7XG4gICAgICBkYXRhRGlyOiBwcm9jZXNzLmVudi5XT1JLRkxPV19MT0NBTF9EQVRBX0RJUixcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFRyeSBkeW5hbWljIGltcG9ydCgpIGZpcnN0IOKAlCBFU00tZmlyc3Qgc2luY2UgdGhpcyBQUidzIHB1cnBvc2UgaXMgRVNNIHN1cHBvcnQuXG4gIC8vIEZhbGwgYmFjayB0byByZXF1aXJlKCkgZm9yIGVudmlyb25tZW50cyB3aGVyZSBgbmV3IEZ1bmN0aW9uYC1iYXNlZCBpbXBvcnQoKVxuICAvLyBpcyB1bmF2YWlsYWJsZSAoZS5nLiBDSlMgdGVzdCBydW5uZXJzKS5cbiAgbGV0IG1vZDogYW55O1xuICB0cnkge1xuICAgIGNvbnN0IHJlc29sdmVkUGF0aCA9IHJlc29sdmVNb2R1bGVQYXRoKHRhcmdldFdvcmxkKTtcbiAgICBtb2QgPSBhd2FpdCBkeW5hbWljSW1wb3J0KHJlc29sdmVkUGF0aCk7XG4gIH0gY2F0Y2gge1xuICAgIG1vZCA9IHJlcXVpcmUodGFyZ2V0V29ybGQpO1xuICB9XG4gIGlmICh0eXBlb2YgbW9kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIG1vZCgpIGFzIFdvcmxkO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBtb2QuZGVmYXVsdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBtb2QuZGVmYXVsdCgpIGFzIFdvcmxkO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBtb2QuY3JlYXRlV29ybGQgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gbW9kLmNyZWF0ZVdvcmxkKCkgYXMgV29ybGQ7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgYEludmFsaWQgdGFyZ2V0IHdvcmxkIG1vZHVsZTogJHt0YXJnZXRXb3JsZH0sIG11c3QgZXhwb3J0IGEgZGVmYXVsdCBmdW5jdGlvbiBvciBjcmVhdGVXb3JsZCBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBXb3JsZCBpbnN0YW5jZS5gXG4gICk7XG59O1xuXG5leHBvcnQgdHlwZSBXb3JsZEhhbmRsZXJzID0gUGljazxXb3JsZCwgJ2NyZWF0ZVF1ZXVlSGFuZGxlcicgfCAnc3BlY1ZlcnNpb24nPjtcblxuLyoqXG4gKiBTb21lIGZ1bmN0aW9ucyBmcm9tIHRoZSB3b3JsZCBhcmUgbmVlZGVkIGF0IGJ1aWxkIHRpbWUsIGJ1dCB3ZSBkbyBOT1Qgd2FudFxuICogdG8gY2FjaGUgdGhlIHdvcmxkIGluIHRob3NlIGluc3RhbmNlcyBmb3IgZ2VuZXJhbCB1c2UsIHNpbmNlIHdlIGRvbid0IGhhdmVcbiAqIHRoZSBjb3JyZWN0IGVudmlyb25tZW50IHZhcmlhYmxlcyBzZXQgeWV0LiBUaGlzIGlzIGEgc2FmZSBmdW5jdGlvbiB0b1xuICogY2FsbCBhdCBidWlsZCB0aW1lLCB0aGF0IG9ubHkgZ2l2ZXMgYWNjZXNzIHRvIG5vbi1lbnZpcm9ubWVudC1ib3VuZCB3b3JsZFxuICogZnVuY3Rpb25zLiBUaGUgb25seSBiaW5kaW5nIHZhbHVlIHNob3VsZCBiZSB0aGUgdGFyZ2V0IHdvcmxkLlxuICogT25jZSB3ZSBtaWdyYXRlIHRvIGEgZmlsZS1iYXNlZCBjb25maWd1cmF0aW9uICh3b3JrZmxvdy5jb25maWcudHMpLCB3ZSBzaG91bGRcbiAqIGJlIGFibGUgdG8gcmUtY29tYmluZSBnZXRXb3JsZCBhbmQgZ2V0V29ybGRIYW5kbGVycyBpbnRvIG9uZSBzaW5nbGV0b24uXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRXb3JsZEhhbmRsZXJzID0gYXN5bmMgKCk6IFByb21pc2U8V29ybGRIYW5kbGVycz4gPT4ge1xuICBpZiAoZ2xvYmFsU3ltYm9sc1tTdHViYmVkV29ybGRDYWNoZV0pIHtcbiAgICByZXR1cm4gZ2xvYmFsU3ltYm9sc1tTdHViYmVkV29ybGRDYWNoZV07XG4gIH1cbiAgLy8gU3RvcmUgdGhlIHByb21pc2UgaW1tZWRpYXRlbHkgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnMgd2l0aCBjb25jdXJyZW50IGNhbGxzLlxuICAvLyBDbGVhciBvbiByZWplY3Rpb24gc28gc3Vic2VxdWVudCBjYWxscyBjYW4gcmV0cnkgaW5zdGVhZCBvZiBjYWNoaW5nIHRoZSBmYWlsdXJlLlxuICBpZiAoIWdsb2JhbFN5bWJvbHNbU3R1YmJlZFdvcmxkQ2FjaGVQcm9taXNlXSkge1xuICAgIGdsb2JhbFN5bWJvbHNbU3R1YmJlZFdvcmxkQ2FjaGVQcm9taXNlXSA9IGNyZWF0ZVdvcmxkKCkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgZ2xvYmFsU3ltYm9sc1tTdHViYmVkV29ybGRDYWNoZVByb21pc2VdID0gdW5kZWZpbmVkO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH0pO1xuICB9XG4gIGNvbnN0IF93b3JsZCA9IGF3YWl0IGdsb2JhbFN5bWJvbHNbU3R1YmJlZFdvcmxkQ2FjaGVQcm9taXNlXTtcbiAgZ2xvYmFsU3ltYm9sc1tTdHViYmVkV29ybGRDYWNoZV0gPSBfd29ybGQ7XG4gIHJldHVybiB7XG4gICAgY3JlYXRlUXVldWVIYW5kbGVyOiBfd29ybGQuY3JlYXRlUXVldWVIYW5kbGVyLFxuICAgIHNwZWNWZXJzaW9uOiBfd29ybGQuc3BlY1ZlcnNpb24sXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0V29ybGQgPSBhc3luYyAoKTogUHJvbWlzZTxXb3JsZD4gPT4ge1xuICBpZiAoZ2xvYmFsU3ltYm9sc1tXb3JsZENhY2hlXSkge1xuICAgIHJldHVybiBnbG9iYWxTeW1ib2xzW1dvcmxkQ2FjaGVdO1xuICB9XG4gIC8vIFN0b3JlIHRoZSBwcm9taXNlIGltbWVkaWF0ZWx5IHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zIHdpdGggY29uY3VycmVudCBjYWxscy5cbiAgLy8gQ2xlYXIgb24gcmVqZWN0aW9uIHNvIHN1YnNlcXVlbnQgY2FsbHMgY2FuIHJldHJ5IGluc3RlYWQgb2YgY2FjaGluZyB0aGUgZmFpbHVyZS5cbiAgaWYgKCFnbG9iYWxTeW1ib2xzW1dvcmxkQ2FjaGVQcm9taXNlXSkge1xuICAgIGdsb2JhbFN5bWJvbHNbV29ybGRDYWNoZVByb21pc2VdID0gY3JlYXRlV29ybGQoKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICBnbG9iYWxTeW1ib2xzW1dvcmxkQ2FjaGVQcm9taXNlXSA9IHVuZGVmaW5lZDtcbiAgICAgIHRocm93IGVycjtcbiAgICB9KTtcbiAgfVxuICBnbG9iYWxTeW1ib2xzW1dvcmxkQ2FjaGVdID0gYXdhaXQgZ2xvYmFsU3ltYm9sc1tXb3JsZENhY2hlUHJvbWlzZV07XG4gIHJldHVybiBnbG9iYWxTeW1ib2xzW1dvcmxkQ2FjaGVdO1xufTtcblxuLyoqXG4gKiBSZXNldCB0aGUgY2FjaGVkIHdvcmxkIGluc3RhbmNlLiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgd2hlbiBlbnZpcm9ubWVudFxuICogdmFyaWFibGVzIGNoYW5nZSBhbmQgeW91IG5lZWQgdG8gcmVpbml0aWFsaXplIHRoZSB3b3JsZCB3aXRoIG5ldyBjb25maWcuXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRXb3JsZCA9ICh3b3JsZDogV29ybGQgfCB1bmRlZmluZWQpOiB2b2lkID0+IHtcbiAgZ2xvYmFsU3ltYm9sc1tXb3JsZENhY2hlXSA9IHdvcmxkO1xuICBnbG9iYWxTeW1ib2xzW1N0dWJiZWRXb3JsZENhY2hlXSA9IHdvcmxkO1xuICBnbG9iYWxTeW1ib2xzW1dvcmxkQ2FjaGVQcm9taXNlXSA9IHVuZGVmaW5lZDtcbiAgZ2xvYmFsU3ltYm9sc1tTdHViYmVkV29ybGRDYWNoZVByb21pc2VdID0gdW5kZWZpbmVkO1xufTtcbiJdfQ==
164
+ // Register getWorld on globalThis so getWorldLazy can call it directly when
165
+ // world.ts is statically present in the bundle. This avoids the relative
166
+ // dynamic import('./world.js') fallback in get-world-lazy.ts, which fails
167
+ // after Next.js inlines get-world-lazy.js into a route bundle (no sibling
168
+ // world.js exists at the bundled location).
169
+ //
170
+ // For server routes that only consume `start` (or another helper that goes
171
+ // through getWorldLazy without statically using getWorld), webpack/turbopack
172
+ // would otherwise tree-shake world.ts out of the bundle entirely. The
173
+ // host-only `./world-init.ts` module imports world.ts for its side effect
174
+ // and is itself imported by `packages/workflow/src/api.ts` so this
175
+ // registration runs in every server bundle that touches `workflow/api`.
176
+ //
177
+ // Step/VM bundles never reach this branch: they don't statically import
178
+ // world.ts, and `world-init` resolves to an empty stub via the `workflow`
179
+ // export condition.
180
+ const GetWorldFnKey = Symbol.for('@workflow/world//getWorldFn');
181
+ globalThis[GetWorldFnKey] ??=
182
+ getWorld;
183
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ybGQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS93b3JsZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDekMsT0FBTyxFQUNMLG1CQUFtQixFQUNuQiwwQkFBMEIsR0FDM0IsTUFBTSxpQkFBaUIsQ0FBQztBQUV6QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUUzRCxTQUFTLGlCQUFpQjtJQUN4QixxRUFBcUU7SUFDckUscUVBQXFFO0lBQ3JFLHNFQUFzRTtJQUN0RSxvREFBb0Q7SUFDcEQsSUFBSSxDQUFDO1FBQ0gsT0FBTyxhQUFhLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN4QyxDQUFDO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsd0JBQXdCLENBQUMsQ0FBQztBQUN4RCxNQUFNLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsK0JBQStCLENBQUMsQ0FBQztBQUN0RSxNQUFNLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsK0JBQStCLENBQUMsQ0FBQztBQUN0RSxNQUFNLHdCQUF3QixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQ3pDLHNDQUFzQyxDQUN2QyxDQUFDO0FBRUYsTUFBTSxhQUFhLEdBS2YsVUFBVSxDQUFDO0FBRWYsb0VBQW9FO0FBQ3BF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LENBQUMsNkJBQTZCLENBQUMsQ0FBQztBQUMvRCxVQUF5RCxDQUFDLGFBQWEsQ0FBQztJQUN2RSxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSAnbm9kZTptb2R1bGUnO1xuaW1wb3J0IHsgcGF0aFRvRmlsZVVSTCB9IGZyb20gJ25vZGU6dXJsJztcbmltcG9ydCB7XG4gIGlzVmVyY2VsV29ybGRUYXJnZXQsXG4gIHJlc29sdmVXb3JrZmxvd1RhcmdldFdvcmxkLFxufSBmcm9tICdAd29ya2Zsb3cvdXRpbHMnO1xuaW1wb3J0IHR5cGUgeyBXb3JsZCB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBjcmVhdGVMb2NhbFdvcmxkIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkLWxvY2FsJztcbmltcG9ydCB7IGNyZWF0ZVZlcmNlbFdvcmxkIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkLXZlcmNlbCc7XG5cbmZ1bmN0aW9uIGdldFJ1bnRpbWVSZXF1aXJlKCkge1xuICAvLyBSZXNvbHZlIGZyb20gdGhlIGFwcCByb290IChwcm9jZXNzLmN3ZCgpKSBzbyBjdXN0b20gd29ybGQgcGFja2FnZXNcbiAgLy8gbGlrZSBAd29ya2Zsb3cvd29ybGQtcG9zdGdyZXMgY2FuIGJlIGZvdW5kIGV2ZW4gdGhvdWdoIHRoZXkncmUgbm90XG4gIC8vIGRlcGVuZGVuY2llcyBvZiBAd29ya2Zsb3cvY29yZS4gVXNpbmcgaW1wb3J0Lm1ldGEudXJsIHdvdWxkIHJlc29sdmVcbiAgLy8gZnJvbSBjb3JlJ3MgbG9jYXRpb24sIG1pc3NpbmcgYXBwLWxldmVsIHBhY2thZ2VzLlxuICB0cnkge1xuICAgIHJldHVybiBjcmVhdGVSZXF1aXJlKHBhdGhUb0ZpbGVVUkwocHJvY2Vzcy5jd2QoKSArICcvcGFja2FnZS5qc29uJykuaHJlZik7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybCk7XG4gIH1cbn1cblxuY29uc3QgV29ybGRDYWNoZSA9IFN5bWJvbC5mb3IoJ0B3b3JrZmxvdy93b3JsZC8vY2FjaGUnKTtcbmNvbnN0IFN0dWJiZWRXb3JsZENhY2hlID0gU3ltYm9sLmZvcignQHdvcmtmbG93L3dvcmxkLy9zdHViYmVkQ2FjaGUnKTtcbmNvbnN0IFdvcmxkQ2FjaGVQcm9taXNlID0gU3ltYm9sLmZvcignQHdvcmtmbG93L3dvcmxkLy9jYWNoZVByb21pc2UnKTtcbmNvbnN0IFN0dWJiZWRXb3JsZENhY2hlUHJvbWlzZSA9IFN5bWJvbC5mb3IoXG4gICdAd29ya2Zsb3cvd29ybGQvL3N0dWJiZWRDYWNoZVByb21pc2UnXG4pO1xuXG5jb25zdCBnbG9iYWxTeW1ib2xzOiB0eXBlb2YgZ2xvYmFsVGhpcyAmIHtcbiAgW1dvcmxkQ2FjaGVdPzogV29ybGQ7XG4gIFtTdHViYmVkV29ybGRDYWNoZV0/OiBXb3JsZDtcbiAgW1dvcmxkQ2FjaGVQcm9taXNlXT86IFByb21pc2U8V29ybGQ+O1xuICBbU3R1YmJlZFdvcmxkQ2FjaGVQcm9taXNlXT86IFByb21pc2U8V29ybGQ+O1xufSA9IGdsb2JhbFRoaXM7XG5cbi8vIER5bmFtaWMgaW1wb3J0IGZvciBjdXN0b20gd29ybGQgbW9kdWxlcy4gVXNlcyBhIHN0YW5kYXJkIGltcG9ydCgpXG4vLyB3cmFwcGVkIGluIGEgdHJ5L2NhdGNoIHdpdGggcmVxdWlyZSgpIGZhbGxiYWNrIGZvciBDSlMgdGVzdCBydW5uZXJzLlxuLy8gTm90ZTogdGhlIHByZXZpb3VzIGBuZXcgRnVuY3Rpb24oJ3NwZWNpZmllcicsICdyZXR1cm4gaW1wb3J0KHNwZWNpZmllciknKWBcbi8vIHBhdHRlcm4gd2FzIHJlcGxhY2VkIGJlY2F1c2UgVHVyYm9wYWNrIChOZXh0LmpzKSB0cmVhdHMgdW5yZXNvbHZhYmxlXG4vLyBkeW5hbWljIGltcG9ydHMgZnJvbSBgbmV3IEZ1bmN0aW9uYCBhcyBmYXRhbCBidWlsZCBlcnJvcnMgaW4gdGhlIFYyXG4vLyBjb21iaW5lZCBmbG93IHJvdXRlIGNvbnRleHQuXG5cbmZ1bmN0aW9uIHJlc29sdmVNb2R1bGVQYXRoKHNwZWNpZmllcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gQWxyZWFkeSBhIGZpbGU6Ly8gVVJMXG4gIGlmIChzcGVjaWZpZXIuc3RhcnRzV2l0aCgnZmlsZTovLycpKSB7XG4gICAgcmV0dXJuIHNwZWNpZmllcjtcbiAgfVxuICAvLyBBYnNvbHV0ZSBwYXRoIC0gY29udmVydCB0byBmaWxlOi8vIFVSTFxuICBpZiAoc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgIHJldHVybiBwYXRoVG9GaWxlVVJMKHNwZWNpZmllcikuaHJlZjtcbiAgfVxuICAvLyBSZWxhdGl2ZSBwYXRoIC0gcmVzb2x2ZSByZWxhdGl2ZSB0byBjd2QgYW5kIGNvbnZlcnQgdG8gZmlsZTovLyBVUkxcbiAgaWYgKHNwZWNpZmllci5zdGFydHNXaXRoKCcuLycpIHx8IHNwZWNpZmllci5zdGFydHNXaXRoKCcuLi8nKSkge1xuICAgIHJldHVybiBwYXRoVG9GaWxlVVJMKFxuICAgICAgLyogdHVyYm9wYWNrSWdub3JlOiB0cnVlICovIHByb2Nlc3MuY3dkKCkgKyAnLycgKyBzcGVjaWZpZXJcbiAgICApLmhyZWY7XG4gIH1cbiAgLy8gUGFja2FnZSBzcGVjaWZpZXIgLSB1c2UgcmVxdWlyZS5yZXNvbHZlIHRvIGZpbmQgdGhlIHBhY2thZ2VcbiAgdHJ5IHtcbiAgICByZXR1cm4gcGF0aFRvRmlsZVVSTChnZXRSdW50aW1lUmVxdWlyZSgpLnJlc29sdmUoc3BlY2lmaWVyKSkuaHJlZjtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHNwZWNpZmllcjtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyB3b3JsZCBpbnN0YW5jZSBiYXNlZCBvbiBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG4gKiBXT1JLRkxPV19UQVJHRVRfV09STEQgaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlIHRhcmdldCB3b3JsZC5cbiAqXG4gKiBOb3RlOiBXT1JLRkxPV19WRVJDRUxfKiBlbnYgdmFycyAoUFJPSkVDVCwgVEVBTSwgQVVUSF9UT0tFTiwgZXRjLikgYXJlXG4gKiBpbnRlbnRpb25hbGx5IE5PVCByZWFkIGhlcmUuIFRob3NlIGFyZSBmb3IgQ0xJL29ic2VydmFiaWxpdHkgdG9vbGluZyBvbmx5XG4gKiBhbmQgc2hvdWxkIG5vdCBhZmZlY3QgcnVudGltZSBiZWhhdmlvci4gVGhlIFZlcmNlbCBydW50aW1lIHByb3ZpZGVzXG4gKiBhdXRoZW50aWNhdGlvbiB2aWEgT0lEQyB0b2tlbnMgYW5kIHByb2plY3QgY29udGV4dCB2aWEgc3lzdGVtIGVudiB2YXJzXG4gKiAoVkVSQ0VMX0RFUExPWU1FTlRfSUQsIFZFUkNFTF9QUk9KRUNUX0lEKS4gVG9vbGluZyB0aGF0IG5lZWRzIHRoZXNlIGVudlxuICogdmFycyBzaG91bGQgY2FsbCBjcmVhdGVWZXJjZWxXb3JsZCgpIGRpcmVjdGx5IHdpdGggYW4gZXhwbGljaXQgY29uZmlnIGFuZFxuICogdXNlIHNldFdvcmxkKCkgdG8gaW5qZWN0IHRoZSBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZVdvcmxkID0gYXN5bmMgKCk6IFByb21pc2U8V29ybGQ+ID0+IHtcbiAgY29uc3QgdGFyZ2V0V29ybGQgPSByZXNvbHZlV29ya2Zsb3dUYXJnZXRXb3JsZCgpO1xuXG4gIGlmIChpc1ZlcmNlbFdvcmxkVGFyZ2V0KHRhcmdldFdvcmxkKSkge1xuICAgIC8vIFdhcm4gaWYgV09SS0ZMT1dfVkVSQ0VMXyogZW52IHZhcnMgYXJlIHNldCBpbnNpZGUgYSBWZXJjZWwgc2VydmVybGVzc1xuICAgIC8vIGZ1bmN0aW9uIChWRVJDRUw9MSkg4oCUIHRoZXkgaGF2ZSBubyBlZmZlY3QgYXQgcnVudGltZSBhbmQgbGlrZWx5IGluZGljYXRlXG4gICAgLy8gYSBtaXNjb25maWd1cmF0aW9uICh1c2VyIG1hbnVhbGx5IGFkZGVkIHRoZW0gYXMgVmVyY2VsIHByb2plY3QgZW52IHZhcnMsXG4gICAgLy8gd2hpY2ggaXMgbm90IG5lZWRlZCkuIFdlIGdhdGUgb24gVkVSQ0VMPTEgc28gdGhlIHdhcm5pbmcgZG9lcyBub3QgZmlyZVxuICAgIC8vIHdoZW4gdGhlIENMSSBvciB3ZWIgb2JzZXJ2YWJpbGl0eSBhcHAgc2V0cyB0aGVzZSBlbnYgdmFycyBpbnRlbnRpb25hbGx5LlxuICAgIGNvbnN0IHN0YWxlRW52VmFycyA9IFtcbiAgICAgICdXT1JLRkxPV19WRVJDRUxfUFJPSkVDVCcsXG4gICAgICAnV09SS0ZMT1dfVkVSQ0VMX1RFQU0nLFxuICAgICAgJ1dPUktGTE9XX1ZFUkNFTF9BVVRIX1RPS0VOJyxcbiAgICAgICdXT1JLRkxPV19WRVJDRUxfRU5WJyxcbiAgICBdLmZpbHRlcigoa2V5KSA9PiBwcm9jZXNzLmVudltrZXldKTtcbiAgICBpZiAoc3RhbGVFbnZWYXJzLmxlbmd0aCA+IDAgJiYgcHJvY2Vzcy5lbnYuVkVSQ0VMID09PSAnMScpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFt3b3JrZmxvd10gV2FybmluZzogJHtzdGFsZUVudlZhcnMuam9pbignLCAnKX0gZW52IHZhcihzKSBgICtcbiAgICAgICAgICAnYXJlIHNldCBidXQgaGF2ZSBubyBlZmZlY3QgYXQgcnVudGltZS4gVGhlc2UgYXJlIG9ubHkgdXNlZCBieSB0aGUgV29ya2Zsb3cgQ0xJLiAnICtcbiAgICAgICAgICAnUmVtb3ZlIHRoZW0gZnJvbSB5b3VyIFZlcmNlbCBwcm9qZWN0IGVudmlyb25tZW50IHZhcmlhYmxlcy4nXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBjcmVhdGVWZXJjZWxXb3JsZCgpO1xuICB9XG5cbiAgaWYgKHRhcmdldFdvcmxkID09PSAnbG9jYWwnKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUxvY2FsV29ybGQoe1xuICAgICAgZGF0YURpcjogcHJvY2Vzcy5lbnYuV09SS0ZMT1dfTE9DQUxfREFUQV9ESVIsXG4gICAgfSk7XG4gIH1cblxuICAvLyBUcnkgcmVxdWlyZSgpIGZpcnN0IGZvciBjdXN0b20gd29ybGRzIOKAlCB0aGlzIGF2b2lkcyBUdXJib3BhY2sgdHJhY2luZ1xuICAvLyBhIGR5bmFtaWMgaW1wb3J0KCkgdGhhdCBpdCBjYW4ndCBzdGF0aWNhbGx5IHJlc29sdmUuIEZhbGwgYmFjayB0b1xuICAvLyBkeW5hbWljIGltcG9ydCgpIGZvciBFU00tb25seSBwYWNrYWdlcy5cbiAgbGV0IG1vZDogYW55O1xuICB0cnkge1xuICAgIG1vZCA9IGdldFJ1bnRpbWVSZXF1aXJlKCkodGFyZ2V0V29ybGQpO1xuICB9IGNhdGNoIHtcbiAgICBjb25zdCByZXNvbHZlZFBhdGggPSByZXNvbHZlTW9kdWxlUGF0aCh0YXJnZXRXb3JsZCk7XG4gICAgbW9kID0gYXdhaXQgaW1wb3J0KC8qIHdlYnBhY2tJZ25vcmU6IHRydWUgKi8gcmVzb2x2ZWRQYXRoKTtcbiAgfVxuICBpZiAodHlwZW9mIG1vZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBtb2QoKSBhcyBXb3JsZDtcbiAgfSBlbHNlIGlmICh0eXBlb2YgbW9kLmRlZmF1bHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gbW9kLmRlZmF1bHQoKSBhcyBXb3JsZDtcbiAgfSBlbHNlIGlmICh0eXBlb2YgbW9kLmNyZWF0ZVdvcmxkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIG1vZC5jcmVhdGVXb3JsZCgpIGFzIFdvcmxkO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBJbnZhbGlkIHRhcmdldCB3b3JsZCBtb2R1bGU6ICR7dGFyZ2V0V29ybGR9LCBtdXN0IGV4cG9ydCBhIGRlZmF1bHQgZnVuY3Rpb24gb3IgY3JlYXRlV29ybGQgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgV29ybGQgaW5zdGFuY2UuYFxuICApO1xufTtcblxuZXhwb3J0IHR5cGUgV29ybGRIYW5kbGVycyA9IFBpY2s8V29ybGQsICdjcmVhdGVRdWV1ZUhhbmRsZXInIHwgJ3NwZWNWZXJzaW9uJz47XG5cbi8qKlxuICogU29tZSBmdW5jdGlvbnMgZnJvbSB0aGUgd29ybGQgYXJlIG5lZWRlZCBhdCBidWlsZCB0aW1lLCBidXQgd2UgZG8gTk9UIHdhbnRcbiAqIHRvIGNhY2hlIHRoZSB3b3JsZCBpbiB0aG9zZSBpbnN0YW5jZXMgZm9yIGdlbmVyYWwgdXNlLCBzaW5jZSB3ZSBkb24ndCBoYXZlXG4gKiB0aGUgY29ycmVjdCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgc2V0IHlldC4gVGhpcyBpcyBhIHNhZmUgZnVuY3Rpb24gdG9cbiAqIGNhbGwgYXQgYnVpbGQgdGltZSwgdGhhdCBvbmx5IGdpdmVzIGFjY2VzcyB0byBub24tZW52aXJvbm1lbnQtYm91bmQgd29ybGRcbiAqIGZ1bmN0aW9ucy4gVGhlIG9ubHkgYmluZGluZyB2YWx1ZSBzaG91bGQgYmUgdGhlIHRhcmdldCB3b3JsZC5cbiAqIE9uY2Ugd2UgbWlncmF0ZSB0byBhIGZpbGUtYmFzZWQgY29uZmlndXJhdGlvbiAod29ya2Zsb3cuY29uZmlnLnRzKSwgd2Ugc2hvdWxkXG4gKiBiZSBhYmxlIHRvIHJlLWNvbWJpbmUgZ2V0V29ybGQgYW5kIGdldFdvcmxkSGFuZGxlcnMgaW50byBvbmUgc2luZ2xldG9uLlxuICovXG5leHBvcnQgY29uc3QgZ2V0V29ybGRIYW5kbGVycyA9IGFzeW5jICgpOiBQcm9taXNlPFdvcmxkSGFuZGxlcnM+ID0+IHtcbiAgaWYgKGdsb2JhbFN5bWJvbHNbU3R1YmJlZFdvcmxkQ2FjaGVdKSB7XG4gICAgcmV0dXJuIGdsb2JhbFN5bWJvbHNbU3R1YmJlZFdvcmxkQ2FjaGVdO1xuICB9XG4gIC8vIFN0b3JlIHRoZSBwcm9taXNlIGltbWVkaWF0ZWx5IHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zIHdpdGggY29uY3VycmVudCBjYWxscy5cbiAgLy8gQ2xlYXIgb24gcmVqZWN0aW9uIHNvIHN1YnNlcXVlbnQgY2FsbHMgY2FuIHJldHJ5IGluc3RlYWQgb2YgY2FjaGluZyB0aGUgZmFpbHVyZS5cbiAgaWYgKCFnbG9iYWxTeW1ib2xzW1N0dWJiZWRXb3JsZENhY2hlUHJvbWlzZV0pIHtcbiAgICBnbG9iYWxTeW1ib2xzW1N0dWJiZWRXb3JsZENhY2hlUHJvbWlzZV0gPSBjcmVhdGVXb3JsZCgpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgIGdsb2JhbFN5bWJvbHNbU3R1YmJlZFdvcmxkQ2FjaGVQcm9taXNlXSA9IHVuZGVmaW5lZDtcbiAgICAgIHRocm93IGVycjtcbiAgICB9KTtcbiAgfVxuICBjb25zdCBfd29ybGQgPSBhd2FpdCBnbG9iYWxTeW1ib2xzW1N0dWJiZWRXb3JsZENhY2hlUHJvbWlzZV07XG4gIGdsb2JhbFN5bWJvbHNbU3R1YmJlZFdvcmxkQ2FjaGVdID0gX3dvcmxkO1xuICByZXR1cm4ge1xuICAgIGNyZWF0ZVF1ZXVlSGFuZGxlcjogX3dvcmxkLmNyZWF0ZVF1ZXVlSGFuZGxlcixcbiAgICBzcGVjVmVyc2lvbjogX3dvcmxkLnNwZWNWZXJzaW9uLFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFdvcmxkID0gYXN5bmMgKCk6IFByb21pc2U8V29ybGQ+ID0+IHtcbiAgaWYgKGdsb2JhbFN5bWJvbHNbV29ybGRDYWNoZV0pIHtcbiAgICByZXR1cm4gZ2xvYmFsU3ltYm9sc1tXb3JsZENhY2hlXTtcbiAgfVxuICAvLyBTdG9yZSB0aGUgcHJvbWlzZSBpbW1lZGlhdGVseSB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9ucyB3aXRoIGNvbmN1cnJlbnQgY2FsbHMuXG4gIC8vIENsZWFyIG9uIHJlamVjdGlvbiBzbyBzdWJzZXF1ZW50IGNhbGxzIGNhbiByZXRyeSBpbnN0ZWFkIG9mIGNhY2hpbmcgdGhlIGZhaWx1cmUuXG4gIGlmICghZ2xvYmFsU3ltYm9sc1tXb3JsZENhY2hlUHJvbWlzZV0pIHtcbiAgICBnbG9iYWxTeW1ib2xzW1dvcmxkQ2FjaGVQcm9taXNlXSA9IGNyZWF0ZVdvcmxkKCkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgZ2xvYmFsU3ltYm9sc1tXb3JsZENhY2hlUHJvbWlzZV0gPSB1bmRlZmluZWQ7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfSk7XG4gIH1cbiAgZ2xvYmFsU3ltYm9sc1tXb3JsZENhY2hlXSA9IGF3YWl0IGdsb2JhbFN5bWJvbHNbV29ybGRDYWNoZVByb21pc2VdO1xuICByZXR1cm4gZ2xvYmFsU3ltYm9sc1tXb3JsZENhY2hlXTtcbn07XG5cbi8qKlxuICogUmVzZXQgdGhlIGNhY2hlZCB3b3JsZCBpbnN0YW5jZS4gVGhpcyBzaG91bGQgYmUgY2FsbGVkIHdoZW4gZW52aXJvbm1lbnRcbiAqIHZhcmlhYmxlcyBjaGFuZ2UgYW5kIHlvdSBuZWVkIHRvIHJlaW5pdGlhbGl6ZSB0aGUgd29ybGQgd2l0aCBuZXcgY29uZmlnLlxuICovXG5leHBvcnQgY29uc3Qgc2V0V29ybGQgPSAod29ybGQ6IFdvcmxkIHwgdW5kZWZpbmVkKTogdm9pZCA9PiB7XG4gIGdsb2JhbFN5bWJvbHNbV29ybGRDYWNoZV0gPSB3b3JsZDtcbiAgZ2xvYmFsU3ltYm9sc1tTdHViYmVkV29ybGRDYWNoZV0gPSB3b3JsZDtcbiAgZ2xvYmFsU3ltYm9sc1tXb3JsZENhY2hlUHJvbWlzZV0gPSB1bmRlZmluZWQ7XG4gIGdsb2JhbFN5bWJvbHNbU3R1YmJlZFdvcmxkQ2FjaGVQcm9taXNlXSA9IHVuZGVmaW5lZDtcbn07XG5cbi8vIFJlZ2lzdGVyIGdldFdvcmxkIG9uIGdsb2JhbFRoaXMgc28gZ2V0V29ybGRMYXp5IGNhbiBjYWxsIGl0IGRpcmVjdGx5IHdoZW5cbi8vIHdvcmxkLnRzIGlzIHN0YXRpY2FsbHkgcHJlc2VudCBpbiB0aGUgYnVuZGxlLiBUaGlzIGF2b2lkcyB0aGUgcmVsYXRpdmVcbi8vIGR5bmFtaWMgaW1wb3J0KCcuL3dvcmxkLmpzJykgZmFsbGJhY2sgaW4gZ2V0LXdvcmxkLWxhenkudHMsIHdoaWNoIGZhaWxzXG4vLyBhZnRlciBOZXh0LmpzIGlubGluZXMgZ2V0LXdvcmxkLWxhenkuanMgaW50byBhIHJvdXRlIGJ1bmRsZSAobm8gc2libGluZ1xuLy8gd29ybGQuanMgZXhpc3RzIGF0IHRoZSBidW5kbGVkIGxvY2F0aW9uKS5cbi8vXG4vLyBGb3Igc2VydmVyIHJvdXRlcyB0aGF0IG9ubHkgY29uc3VtZSBgc3RhcnRgIChvciBhbm90aGVyIGhlbHBlciB0aGF0IGdvZXNcbi8vIHRocm91Z2ggZ2V0V29ybGRMYXp5IHdpdGhvdXQgc3RhdGljYWxseSB1c2luZyBnZXRXb3JsZCksIHdlYnBhY2svdHVyYm9wYWNrXG4vLyB3b3VsZCBvdGhlcndpc2UgdHJlZS1zaGFrZSB3b3JsZC50cyBvdXQgb2YgdGhlIGJ1bmRsZSBlbnRpcmVseS4gVGhlXG4vLyBob3N0LW9ubHkgYC4vd29ybGQtaW5pdC50c2AgbW9kdWxlIGltcG9ydHMgd29ybGQudHMgZm9yIGl0cyBzaWRlIGVmZmVjdFxuLy8gYW5kIGlzIGl0c2VsZiBpbXBvcnRlZCBieSBgcGFja2FnZXMvd29ya2Zsb3cvc3JjL2FwaS50c2Agc28gdGhpc1xuLy8gcmVnaXN0cmF0aW9uIHJ1bnMgaW4gZXZlcnkgc2VydmVyIGJ1bmRsZSB0aGF0IHRvdWNoZXMgYHdvcmtmbG93L2FwaWAuXG4vL1xuLy8gU3RlcC9WTSBidW5kbGVzIG5ldmVyIHJlYWNoIHRoaXMgYnJhbmNoOiB0aGV5IGRvbid0IHN0YXRpY2FsbHkgaW1wb3J0XG4vLyB3b3JsZC50cywgYW5kIGB3b3JsZC1pbml0YCByZXNvbHZlcyB0byBhbiBlbXB0eSBzdHViIHZpYSB0aGUgYHdvcmtmbG93YFxuLy8gZXhwb3J0IGNvbmRpdGlvbi5cbmNvbnN0IEdldFdvcmxkRm5LZXkgPSBTeW1ib2wuZm9yKCdAd29ya2Zsb3cvd29ybGQvL2dldFdvcmxkRm4nKTtcbihnbG9iYWxUaGlzIGFzIHsgW0dldFdvcmxkRm5LZXldPzogKCkgPT4gUHJvbWlzZTxXb3JsZD4gfSlbR2V0V29ybGRGbktleV0gPz89XG4gIGdldFdvcmxkO1xuIl19