awaitly 1.34.0 → 2.0.0

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 (241) hide show
  1. package/dist/{duration.d.ts → di-BDlT7InM.d.cts} +15 -1
  2. package/dist/{duration.d.cts → di-BbFFfO8y.d.ts} +15 -1
  3. package/dist/errors-DtXvrCiO.d.cts +708 -0
  4. package/dist/errors-DtXvrCiO.d.ts +708 -0
  5. package/dist/index.cjs +4594 -1
  6. package/dist/index.cjs.map +1 -1
  7. package/dist/index.d.cts +1970 -141
  8. package/dist/index.d.ts +1970 -141
  9. package/dist/index.js +4398 -1
  10. package/dist/index.js.map +1 -1
  11. package/dist/result.cjs +641 -1
  12. package/dist/result.cjs.map +1 -1
  13. package/dist/result.d.cts +35 -5
  14. package/dist/result.d.ts +35 -5
  15. package/dist/result.js +561 -1
  16. package/dist/result.js.map +1 -1
  17. package/dist/testing.cjs +4202 -8
  18. package/dist/testing.cjs.map +1 -1
  19. package/dist/testing.d.cts +2 -6
  20. package/dist/testing.d.ts +2 -6
  21. package/dist/testing.js +4154 -8
  22. package/dist/testing.js.map +1 -1
  23. package/dist/{run-entry-D2MmJFj9.d.cts → types-B8NfNRGX.d.ts} +1152 -1499
  24. package/dist/{run-entry-Dduz-is2.d.ts → types-BZ2f4MRR.d.cts} +1152 -1499
  25. package/dist/workflow.cjs +7096 -6
  26. package/dist/workflow.cjs.map +1 -1
  27. package/dist/workflow.d.cts +3346 -22
  28. package/dist/workflow.d.ts +3346 -22
  29. package/dist/workflow.js +6929 -6
  30. package/dist/workflow.js.map +1 -1
  31. package/package.json +13 -178
  32. package/dist/adapters.cjs +0 -7
  33. package/dist/adapters.cjs.map +0 -1
  34. package/dist/adapters.d.cts +0 -179
  35. package/dist/adapters.d.ts +0 -179
  36. package/dist/adapters.js +0 -7
  37. package/dist/adapters.js.map +0 -1
  38. package/dist/batch.cjs +0 -7
  39. package/dist/batch.cjs.map +0 -1
  40. package/dist/batch.d.cts +0 -200
  41. package/dist/batch.d.ts +0 -200
  42. package/dist/batch.js +0 -7
  43. package/dist/batch.js.map +0 -1
  44. package/dist/bind-deps.cjs +0 -2
  45. package/dist/bind-deps.cjs.map +0 -1
  46. package/dist/bind-deps.d.cts +0 -28
  47. package/dist/bind-deps.d.ts +0 -28
  48. package/dist/bind-deps.js +0 -2
  49. package/dist/bind-deps.js.map +0 -1
  50. package/dist/cache.cjs +0 -2
  51. package/dist/cache.cjs.map +0 -1
  52. package/dist/cache.d.cts +0 -269
  53. package/dist/cache.d.ts +0 -269
  54. package/dist/cache.js +0 -2
  55. package/dist/cache.js.map +0 -1
  56. package/dist/circuit-breaker.cjs +0 -7
  57. package/dist/circuit-breaker.cjs.map +0 -1
  58. package/dist/circuit-breaker.d.cts +0 -211
  59. package/dist/circuit-breaker.d.ts +0 -211
  60. package/dist/circuit-breaker.js +0 -7
  61. package/dist/circuit-breaker.js.map +0 -1
  62. package/dist/conditional.cjs +0 -2
  63. package/dist/conditional.cjs.map +0 -1
  64. package/dist/conditional.d.cts +0 -252
  65. package/dist/conditional.d.ts +0 -252
  66. package/dist/conditional.js +0 -2
  67. package/dist/conditional.js.map +0 -1
  68. package/dist/core.cjs +0 -7
  69. package/dist/core.cjs.map +0 -1
  70. package/dist/core.d.cts +0 -5
  71. package/dist/core.d.ts +0 -5
  72. package/dist/core.js +0 -7
  73. package/dist/core.js.map +0 -1
  74. package/dist/di-COl5oFnR.d.cts +0 -15
  75. package/dist/di-CyDj_JyZ.d.ts +0 -15
  76. package/dist/diagnostics.cjs +0 -8
  77. package/dist/diagnostics.cjs.map +0 -1
  78. package/dist/diagnostics.d.cts +0 -68
  79. package/dist/diagnostics.d.ts +0 -68
  80. package/dist/diagnostics.js +0 -8
  81. package/dist/diagnostics.js.map +0 -1
  82. package/dist/durable.cjs +0 -11
  83. package/dist/durable.cjs.map +0 -1
  84. package/dist/durable.d.cts +0 -9
  85. package/dist/durable.d.ts +0 -9
  86. package/dist/durable.js +0 -11
  87. package/dist/durable.js.map +0 -1
  88. package/dist/duration.cjs +0 -2
  89. package/dist/duration.cjs.map +0 -1
  90. package/dist/duration.js +0 -2
  91. package/dist/duration.js.map +0 -1
  92. package/dist/engine.cjs +0 -11
  93. package/dist/engine.cjs.map +0 -1
  94. package/dist/engine.d.cts +0 -115
  95. package/dist/engine.d.ts +0 -115
  96. package/dist/engine.js +0 -11
  97. package/dist/engine.js.map +0 -1
  98. package/dist/errors.cjs +0 -2
  99. package/dist/errors.cjs.map +0 -1
  100. package/dist/errors.d.cts +0 -361
  101. package/dist/errors.d.ts +0 -361
  102. package/dist/errors.js +0 -2
  103. package/dist/errors.js.map +0 -1
  104. package/dist/fetch.cjs +0 -7
  105. package/dist/fetch.cjs.map +0 -1
  106. package/dist/fetch.d.cts +0 -86
  107. package/dist/fetch.d.ts +0 -86
  108. package/dist/fetch.js +0 -7
  109. package/dist/fetch.js.map +0 -1
  110. package/dist/flow.cjs +0 -7
  111. package/dist/flow.cjs.map +0 -1
  112. package/dist/flow.d.cts +0 -163
  113. package/dist/flow.d.ts +0 -163
  114. package/dist/flow.js +0 -7
  115. package/dist/flow.js.map +0 -1
  116. package/dist/functional.cjs +0 -2
  117. package/dist/functional.cjs.map +0 -1
  118. package/dist/functional.d.cts +0 -444
  119. package/dist/functional.d.ts +0 -444
  120. package/dist/functional.js +0 -2
  121. package/dist/functional.js.map +0 -1
  122. package/dist/guards-BodHXLzX.d.cts +0 -72
  123. package/dist/guards-CeWoQ8fn.d.ts +0 -72
  124. package/dist/hitl-BPE_1UiM.d.cts +0 -468
  125. package/dist/hitl-byp570uC.d.ts +0 -468
  126. package/dist/hitl.cjs +0 -7
  127. package/dist/hitl.cjs.map +0 -1
  128. package/dist/hitl.d.cts +0 -442
  129. package/dist/hitl.d.ts +0 -442
  130. package/dist/hitl.js +0 -7
  131. package/dist/hitl.js.map +0 -1
  132. package/dist/index-BYT3amEz.d.ts +0 -417
  133. package/dist/index-C_ak66jy.d.cts +0 -417
  134. package/dist/match-entry-DjI2bLpD.d.cts +0 -209
  135. package/dist/match-entry-DjI2bLpD.d.ts +0 -209
  136. package/dist/match.cjs +0 -2
  137. package/dist/match.cjs.map +0 -1
  138. package/dist/match.d.cts +0 -1
  139. package/dist/match.d.ts +0 -1
  140. package/dist/match.js +0 -2
  141. package/dist/match.js.map +0 -1
  142. package/dist/otel.cjs +0 -2
  143. package/dist/otel.cjs.map +0 -1
  144. package/dist/otel.d.cts +0 -188
  145. package/dist/otel.d.ts +0 -188
  146. package/dist/otel.js +0 -2
  147. package/dist/otel.js.map +0 -1
  148. package/dist/persistence-entry-DOMx3woy.d.ts +0 -822
  149. package/dist/persistence-entry-ymCA4iDu.d.cts +0 -822
  150. package/dist/persistence.cjs +0 -2
  151. package/dist/persistence.cjs.map +0 -1
  152. package/dist/persistence.d.cts +0 -7
  153. package/dist/persistence.d.ts +0 -7
  154. package/dist/persistence.js +0 -2
  155. package/dist/persistence.js.map +0 -1
  156. package/dist/policies.cjs +0 -2
  157. package/dist/policies.cjs.map +0 -1
  158. package/dist/policies.d.cts +0 -379
  159. package/dist/policies.d.ts +0 -379
  160. package/dist/policies.js +0 -2
  161. package/dist/policies.js.map +0 -1
  162. package/dist/ratelimit.cjs +0 -7
  163. package/dist/ratelimit.cjs.map +0 -1
  164. package/dist/ratelimit.d.cts +0 -458
  165. package/dist/ratelimit.d.ts +0 -458
  166. package/dist/ratelimit.js +0 -7
  167. package/dist/ratelimit.js.map +0 -1
  168. package/dist/reliability.cjs +0 -11
  169. package/dist/reliability.cjs.map +0 -1
  170. package/dist/reliability.d.cts +0 -11
  171. package/dist/reliability.d.ts +0 -11
  172. package/dist/reliability.js +0 -11
  173. package/dist/reliability.js.map +0 -1
  174. package/dist/resolver.cjs +0 -7
  175. package/dist/resolver.cjs.map +0 -1
  176. package/dist/resolver.d.cts +0 -68
  177. package/dist/resolver.d.ts +0 -68
  178. package/dist/resolver.js +0 -7
  179. package/dist/resolver.js.map +0 -1
  180. package/dist/resource.cjs +0 -7
  181. package/dist/resource.cjs.map +0 -1
  182. package/dist/resource.d.cts +0 -174
  183. package/dist/resource.d.ts +0 -174
  184. package/dist/resource.js +0 -7
  185. package/dist/resource.js.map +0 -1
  186. package/dist/result/retry.cjs +0 -2
  187. package/dist/result/retry.cjs.map +0 -1
  188. package/dist/result/retry.d.cts +0 -70
  189. package/dist/result/retry.d.ts +0 -70
  190. package/dist/result/retry.js +0 -2
  191. package/dist/result/retry.js.map +0 -1
  192. package/dist/retry.cjs +0 -2
  193. package/dist/retry.cjs.map +0 -1
  194. package/dist/retry.d.cts +0 -388
  195. package/dist/retry.d.ts +0 -388
  196. package/dist/retry.js +0 -2
  197. package/dist/retry.js.map +0 -1
  198. package/dist/run.cjs +0 -7
  199. package/dist/run.cjs.map +0 -1
  200. package/dist/run.d.cts +0 -4
  201. package/dist/run.d.ts +0 -4
  202. package/dist/run.js +0 -7
  203. package/dist/run.js.map +0 -1
  204. package/dist/saga.cjs +0 -11
  205. package/dist/saga.cjs.map +0 -1
  206. package/dist/saga.d.cts +0 -164
  207. package/dist/saga.d.ts +0 -164
  208. package/dist/saga.js +0 -11
  209. package/dist/saga.js.map +0 -1
  210. package/dist/singleflight.cjs +0 -2
  211. package/dist/singleflight.cjs.map +0 -1
  212. package/dist/singleflight.d.cts +0 -145
  213. package/dist/singleflight.d.ts +0 -145
  214. package/dist/singleflight.js +0 -2
  215. package/dist/singleflight.js.map +0 -1
  216. package/dist/slugs.cjs +0 -2
  217. package/dist/slugs.cjs.map +0 -1
  218. package/dist/slugs.d.cts +0 -67
  219. package/dist/slugs.d.ts +0 -67
  220. package/dist/slugs.js +0 -2
  221. package/dist/slugs.js.map +0 -1
  222. package/dist/streaming.cjs +0 -9
  223. package/dist/streaming.cjs.map +0 -1
  224. package/dist/streaming.d.cts +0 -596
  225. package/dist/streaming.d.ts +0 -596
  226. package/dist/streaming.js +0 -9
  227. package/dist/streaming.js.map +0 -1
  228. package/dist/tagged-error.cjs +0 -2
  229. package/dist/tagged-error.cjs.map +0 -1
  230. package/dist/tagged-error.d.cts +0 -275
  231. package/dist/tagged-error.d.ts +0 -275
  232. package/dist/tagged-error.js +0 -2
  233. package/dist/tagged-error.js.map +0 -1
  234. package/dist/types-DQmzO9f4.d.ts +0 -323
  235. package/dist/types-qBUOYi-4.d.cts +0 -323
  236. package/dist/webhook.cjs +0 -7
  237. package/dist/webhook.cjs.map +0 -1
  238. package/dist/webhook.d.cts +0 -499
  239. package/dist/webhook.d.ts +0 -499
  240. package/dist/webhook.js +0 -7
  241. package/dist/webhook.js.map +0 -1
@@ -1,9 +0,0 @@
1
- export { C as ConcurrentExecutionError, D as DeleteStatesOptions, a as DeleteStatesResult, b as DurableOptions, c as DurableWorkflowEvent, I as IdempotencyConflictError, L as LeaseExpiredError, P as PersistenceError, V as VersionMismatchError, W as WorkflowLock, d as durable, i as isConcurrentExecution, e as isIdempotencyConflict, f as isLeaseExpired, g as isPersistenceError, h as isVersionMismatch } from './index-C_ak66jy.cjs';
2
- export { S as SnapshotStore, W as WorkflowCancelledError } from './persistence-entry-ymCA4iDu.cjs';
3
- export { i as isWorkflowCancelled } from './guards-BodHXLzX.cjs';
4
- import './run-entry-D2MmJFj9.cjs';
5
- import './errors.cjs';
6
- import './tagged-error.cjs';
7
- import './slugs.cjs';
8
- import './types-qBUOYi-4.cjs';
9
- import '@standard-schema/spec';
package/dist/durable.d.ts DELETED
@@ -1,9 +0,0 @@
1
- export { C as ConcurrentExecutionError, D as DeleteStatesOptions, a as DeleteStatesResult, b as DurableOptions, c as DurableWorkflowEvent, I as IdempotencyConflictError, L as LeaseExpiredError, P as PersistenceError, V as VersionMismatchError, W as WorkflowLock, d as durable, i as isConcurrentExecution, e as isIdempotencyConflict, f as isLeaseExpired, g as isPersistenceError, h as isVersionMismatch } from './index-BYT3amEz.js';
2
- export { S as SnapshotStore, W as WorkflowCancelledError } from './persistence-entry-DOMx3woy.js';
3
- export { i as isWorkflowCancelled } from './guards-CeWoQ8fn.js';
4
- import './run-entry-Dduz-is2.js';
5
- import './errors.js';
6
- import './tagged-error.js';
7
- import './slugs.js';
8
- import './types-DQmzO9f4.js';
9
- import '@standard-schema/spec';
package/dist/durable.js DELETED
@@ -1,11 +0,0 @@
1
- var Pt={"step-require-id":"step-require-id","step-no-immediate-execution":"step-no-immediate-execution","step-require-thunk-for-key":"step-require-thunk-for-key","step-no-bare-await":"step-no-bare-await","step-no-try-catch-wrap":"step-no-try-catch-wrap","step-stable-cache-keys":"step-stable-cache-keys","workflow-no-floating":"workflow-no-floating","workflow-options-position":"workflow-options-position","workflow-callback-shape":"workflow-callback-shape","workflow-no-callable-form":"workflow-no-callable-form","workflow-no-dynamic-import":"workflow-no-dynamic-import","result-no-floating":"result-no-floating","result-require-handling":"result-require-handling","result-no-double-wrap":"result-no-double-wrap","result-no-manual-propagation":"result-no-manual-propagation","result-no-direct-ok-err":"result-no-direct-ok-err","error-check-unexpected-first":"error-check-unexpected-first","error-access-cause":"error-access-cause","error-normalize":"error-normalize","error-no-throw-in-deps":"error-no-throw-in-deps","concurrency-no-promise-all":"concurrency-no-promise-all","concurrency-no-promise-race":"concurrency-no-promise-race","concurrency-no-promise-allsettled":"concurrency-no-promise-allsettled","runtime-step-timeout":"runtime-step-timeout","runtime-step-aborted":"runtime-step-aborted","runtime-retry-exhausted":"runtime-retry-exhausted","runtime-rate-limit":"runtime-rate-limit","runtime-circuit-open":"runtime-circuit-open","runtime-unexpected":"runtime-unexpected","runtime-resolver-not-found":"runtime-resolver-not-found","runtime-saga-compensation":"runtime-saga-compensation"};function it(e){return`https://jagreehal.github.io/awaitly/rules/#${e}`}var ar=Object.keys(Pt);var je=class extends Error{_tag};function we(e,t){return class extends je{_tag=e;constructor(s,a){let E=t?.message?t.message(s??{}):e;if(super(E),this.name=e,t?.slug!==void 0){if(!t.hint)throw new TypeError(`TaggedError: 'hint' is required when 'slug' is set (slug: "${t.slug}")`);Object.defineProperty(this,"code",{value:t.slug,enumerable:!0,writable:!1,configurable:!1}),Object.defineProperty(this,"hint",{value:t.hint,enumerable:!0,writable:!1,configurable:!1}),Object.defineProperty(this,"docsUrl",{value:it(t.slug),enumerable:!0,writable:!1,configurable:!1})}if(Object.setPrototypeOf(this,new.target.prototype),s&&typeof s=="object"){let p;if(t?.slug!==void 0){let{_tag:u,name:Y,message:W,stack:C,code:ae,hint:d,docsUrl:ee,...X}=s;p=X}else{let{_tag:u,name:Y,message:W,stack:C,...ae}=s;p=ae}let R=Object.prototype.hasOwnProperty.call(p,"cause"),h=R?p.cause:void 0;R&&delete p.cause;let B=a?.cause!==void 0;if(R&&B)throw new TypeError("TaggedError: cannot provide 'cause' in props when also setting ErrorOptions.cause");Object.assign(this,p),R&&(this.cause=h),B&&(this.cause=a?.cause)}else a?.cause!==void 0&&(this.cause=a.cause)}}}Object.defineProperty(we,Symbol.hasInstance,{value:e=>e instanceof je});(E=>{function e(p){return p instanceof Error}E.isError=e;function t(p){return p instanceof je}E.isTaggedError=t;function s(p,R){let h=p._tag,B=R[h];return B(p)}E.match=s;function a(p,R,h){let B=p._tag,u=R[B];return u?u(p):h(p)}E.matchPartial=a})(we||={});var ut=class extends we("TimeoutError",{slug:"runtime-step-timeout",hint:"Increase the step's timeout option, or check why the upstream operation is slow.",message:t=>t.operation?`TimeoutError: ${t.operation} timed out after ${t.ms}ms`:`TimeoutError: Operation timed out after ${t.ms}ms`}){},lt=class extends we("RetryExhaustedError",{slug:"runtime-retry-exhausted",hint:"All retry attempts failed. Inspect lastError and decide whether to surface it or compensate.",message:t=>t.operation?`RetryExhaustedError: ${t.operation} failed after ${t.attempts} attempts`:`RetryExhaustedError: Operation failed after ${t.attempts} attempts`}){},ct=class extends we("RateLimitError",{slug:"runtime-rate-limit",hint:"Wait retryAfterMs before retrying, or apply step.cache to deduplicate calls.",message:t=>t.limiterName?`RateLimitError: Rate limit exceeded for ${t.limiterName}${t.retryAfterMs?`, retry after ${t.retryAfterMs}ms`:""}`:`RateLimitError: Rate limit exceeded${t.retryAfterMs?`, retry after ${t.retryAfterMs}ms`:""}`}){},pt=class extends we("CircuitBreakerOpenError",{slug:"runtime-circuit-open",hint:"The circuit is open. Wait for it to half-open or fall back to a degraded path.",message:t=>`CircuitBreakerOpenError: Circuit ${t.circuitName} is ${t.state??"OPEN"}${t.retryAfterMs?`, retry after ${Math.ceil(t.retryAfterMs/1e3)}s`:""}`}){},dt=class extends we("ValidationError",{message:t=>`ValidationError: Invalid ${t.field} - ${t.reason}`}){},mt=class extends we("NotFoundError",{message:t=>t.id?`NotFoundError: ${t.resource} with id ${t.id} not found`:`NotFoundError: ${t.resource} not found`}){},ft=class extends we("UnauthorizedError",{message:t=>t.reason?`UnauthorizedError: ${t.reason}`:t.action&&t.resource?`UnauthorizedError: Not authorized to ${t.action} ${t.resource}`:"UnauthorizedError: Access denied"}){},Et=class extends we("NetworkError",{message:t=>t.url?`NetworkError: ${t.reason} (${t.url})`:`NetworkError: ${t.reason}`}){},wt=class extends we("CompensationError",{slug:"runtime-saga-compensation",hint:"A saga compensation step failed. Inspect compensationError and ensure compensation is idempotent.",message:t=>`CompensationError: Failed to compensate step ${t.step}`}){},Ke=class extends we("UnexpectedError",{slug:"runtime-unexpected",hint:"An unexpected exception escaped a step. Inspect cause; consider returning a typed Result instead of throwing.",message:t=>`UnexpectedError: ${t.cause instanceof Error?t.cause.message:String(t.cause??"unknown")}`}){};function Ot(e){let t=e.trim().match(/^(\d+(?:\.\d+)?)\s*(ms|s|m|h|d)$/i);if(!t)return;let s=parseFloat(t[1]),a=t[2].toLowerCase();return{_tag:"Duration",millis:s*({ms:1,s:1e3,m:6e4,h:36e5,d:864e5}[a]??1)}}function Be(e){return new Ke({cause:e})}function Q(e){return{ok:!0,value:e}}function A(e,t){let s=t?.cause;return{ok:!1,error:e,...s!==void 0?{cause:s}:{}}}var Rt=e=>e instanceof Ke||typeof e=="object"&&e!==null&&"_tag"in e&&e._tag==="UnexpectedError";function It(e){if(e==null)return"unknown";if(typeof e=="string")return e.trim()||"unknown";if(typeof e=="object"){let t=e;if(typeof t._tag=="string"){let s=t._tag.trim();if(s)return s}if(typeof t.tag=="string"){let s=t.tag.trim();if(s)return s}if(typeof t.code=="string"){let s=t.code.trim();if(s)return s}else if(typeof t.code=="number")return String(t.code);if(e instanceof Error&&e.name){let s=e.name.trim();if(s)return s}}return"unknown"}function Mt(e,t){if(!(!t||!e))return t[e]}function Ye(e){let{intent:t,domain:s,owner:a,tags:E,stateChanges:p,emits:R,calls:h}=e;if(!t&&!s&&!a&&!E?.length&&!p?.length&&!R?.length&&!h?.length)return;let B={};return t&&(B.intent=t),s&&(B.domain=s),a&&(B.owner=a),E?.length&&(B.tags=E),p?.length&&(B.stateChanges=p),R?.length&&(B.emits=R),h?.length&&(B.calls=h),B}function ke(e,t,s,a,E){let p=It(e),R=Mt(p,t),h={tag:p,origin:s};return R!==void 0&&(h.classification=R),a!==void 0&&(h.attempt=a),E!==void 0&&(h.cumulativeDurationMs=E),h}var De=Symbol.for("step_timeout_marker");function yt(e){return typeof e!="object"||e===null?!1:e.type==="STEP_TIMEOUT"?!0:De in e}function Ut(e){if(!(typeof e!="object"||e===null)){if(e.type==="STEP_TIMEOUT"){let t=e;return{timeoutMs:t.timeoutMs,stepName:t.stepName,stepKey:t.stepKey,attempt:t.attempt}}if(De in e)return e[De]}}var Tt=Symbol("early-exit");function Pe(e,t){return{[Tt]:!0,error:e,meta:t}}function be(e){return typeof e=="object"&&e!==null&&e[Tt]===!0}var ht=Symbol("mapper-exception");function Ae(e){return{[ht]:!0,thrown:e}}function Wt(e){return typeof e=="object"&&e!==null&&e[ht]===!0}function Je(e,t){let{backoff:s,initialDelay:a,maxDelay:E,jitter:p}=t,R;switch(s){case"fixed":R=a;break;case"linear":R=a*e;break;case"exponential":R=a*Math.pow(2,e-1);break}if(R=Math.min(R,E),p){let h=R*.25*Math.random();R=R+h}return Math.floor(R)}function ze(e){return new Promise(t=>setTimeout(t,e))}var gt=Symbol("timeout"),Ve=Symbol("timeout-option");function Nt(e){return typeof e=="object"&&e!==null&&e[Ve]===!0}async function jt(e,t,s,a){let E=new AbortController,p=t.onTimeout??"error",R=()=>typeof p=="function"?p({name:s.name,key:s.key,ms:t.ms}):t.error??{type:"STEP_TIMEOUT",stepName:s.name,stepKey:s.key,timeoutMs:t.ms,attempt:s.attempt},h;a?.aborted&&E.abort(a.reason);let B;a&&!a.aborted&&(B=()=>E.abort(a.reason),a.addEventListener("abort",B,{once:!0}));let u=new Promise((W,C)=>{h=setTimeout(()=>{if(p!=="disconnect"&&E.abort(),p==="option"){C({[Ve]:!0,ms:t.ms});return}C({[gt]:!0,error:R()})},t.ms)}),Y;t.signal?Y=Promise.resolve(e(E.signal)):Y=Promise.resolve(e());try{return await Promise.race([Y,u])}catch(W){if(typeof W=="object"&&W!==null&&W[Ve]===!0)throw{[Ve]:!0,ms:t.ms};if(typeof W=="object"&&W!==null&&W[gt]===!0){p==="disconnect"&&Y.catch(()=>{});let C=W.error;if(typeof C=="object"&&C!==null&&C.type!=="STEP_TIMEOUT"){let ae={timeoutMs:t.ms,stepName:s.name,stepKey:s.key,attempt:s.attempt};De in C?C[De]=ae:Object.defineProperty(C,De,{value:ae,enumerable:!1,writable:!0,configurable:!1})}throw C}throw W}finally{clearTimeout(h),B&&a&&a.removeEventListener("abort",B)}}var _e={backoff:"exponential",initialDelay:100,maxDelay:3e4,jitter:!0,shouldRetry:()=>!0,onRetry:()=>{}};async function $e(e,t){let{onError:s,onEvent:a,catchUnexpected:E,workflowId:p,workflowName:R,context:h,_workflowSignal:B}=t&&typeof t=="object"?t:{},u=p??crypto.randomUUID(),Y=E??Be,W=[],C=0,ae=g=>g??`step_${++C}`,d=g=>{let pe=g.context!==void 0||h===void 0?g:{...g,context:h},oe=R!==void 0&&pe.workflowName===void 0?{...pe,workflowName:R}:pe;if(oe.type==="step_success"){let H=oe.stepId;for(let ie=W.length-1;ie>=0;ie--){let te=W[ie];if(te.type==="race"&&!te.winnerId){te.winnerId=H;break}}}a?.(oe,h)},ee=Pe,X=g=>be(g),K=(g,pe)=>g,ce=g=>typeof g=="function"?!1:!!(g&&typeof g=="object"&&"ok"in g||g&&typeof g=="object"&&"then"in g&&typeof g.then=="function");try{let pe=function(c){let x={};for(let[o,r]of Object.entries(c))if(typeof r=="function")x[o]=r;else if(r&&typeof r=="object"&&"fn"in r)x[o]=r.fn;else throw new TypeError(`step.all: operation "${o}" must be a function or { fn, errors? } object`);return x},oe=function(c,x){let o=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let r=performance.now(),n=!1;W.push({scopeId:o,type:"parallel"});let m=()=>{if(n)return;n=!0;let T=W.findIndex(b=>b.scopeId===o);T!==-1&&W.splice(T,1),d({type:"scope_end",workflowId:u,scopeId:o,ts:Date.now(),durationMs:performance.now()-r})};d({type:"scope_start",workflowId:u,scopeId:o,scopeType:"parallel",name:c,ts:Date.now()});try{let T=await x();if(m(),!T.ok)throw s?.(T.error,c,h),ee(T.error,{origin:"result",resultCause:T.cause});return T.value}catch(T){throw m(),T}})()},H=function(c,x){let o=Object.keys(c),r=x.name??`Parallel(${o.join(", ")})`,n=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let m=performance.now(),T=!1;W.push({scopeId:n,type:"parallel"});let b=()=>{if(T)return;T=!0;let l=W.findIndex(_=>_.scopeId===n);l!==-1&&W.splice(l,1),d({type:"scope_end",workflowId:u,scopeId:n,ts:Date.now(),durationMs:performance.now()-m})};d({type:"scope_start",workflowId:u,scopeId:n,scopeType:"parallel",name:r,ts:Date.now()});try{let l=await new Promise(O=>{if(o.length===0){O([]);return}let L=!1,$=o.length,I=new Array(o.length);for(let z=0;z<o.length;z++){let N=o[z],q=z;Promise.resolve(c[N]()).catch(M=>A({type:"PROMISE_REJECTED",cause:M},{cause:{type:"PROMISE_REJECTION",reason:M}})).then(M=>{if(!L){if(!M.ok){L=!0,O([{key:N,result:M}]);return}I[q]={key:N,result:M},$--,$===0&&O(I)}})}});b();let _={};for(let{key:O,result:L}of l){if(!L.ok)throw s?.(L.error,O,h),ee(L.error,{origin:"result",resultCause:L.cause});_[O]=L.value}return _}catch(l){throw b(),l}})()};var Ee=pe,ge=oe,ye=H;let g=(c,x,o)=>(async()=>{if(typeof c!="string"||c.length===0)throw new Error('[awaitly] step() requires an explicit string ID as the first argument. Example: step("fetchUser", () => fetchUser(id))');let r=o??{},n=Ye(r),m=c,T=r.key??c,b=r.key??c,{description:l,retry:_,timeout:O}=r,L=ae(T),$=a,I=$?performance.now():0,N=ce(x)?()=>x:x,M={attempts:Math.max(1,_?.attempts??1),backoff:_?.backoff??_e.backoff,initialDelay:_?.initialDelay??_e.initialDelay,maxDelay:_?.maxDelay??_e.maxDelay,jitter:_?.jitter??_e.jitter,shouldRetry:_?.shouldRetry??_e.shouldRetry,onRetry:_?.onRetry??_e.onRetry};a&&d({type:"step_start",workflowId:u,stepId:L,stepKey:T,name:m,description:l,ts:Date.now(),...n&&{metadata:n}});let Te;for(let i=1;i<=M.attempts;i++){let w=$?performance.now():0;try{let f;if(O?f=await jt(N,O,{name:m,key:T,attempt:i},B):f=await N(),f.ok){let J=performance.now()-I;return d({type:"step_success",workflowId:u,stepId:L,stepKey:T,name:m,description:l,ts:Date.now(),durationMs:J,...n&&{metadata:n}}),b&&d({type:"step_complete",workflowId:u,stepKey:b,name:m,description:l,ts:Date.now(),durationMs:J,result:f,...n&&{metadata:n}}),f.value}if(Te=f,i<M.attempts&&M.shouldRetry(f.error,i)){let J=Je(i,M);d({type:"step_retry",workflowId:u,stepId:L,stepKey:T,name:m,ts:Date.now(),attempt:i+1,maxAttempts:M.attempts,delayMs:J,error:f.error,...n&&{metadata:n},diagnostics:ke(f.error,r.errorMeta,"result",i,performance.now()-I)}),M.onRetry(f.error,i,J),await ze(J);continue}M.attempts>1&&d({type:"step_retries_exhausted",workflowId:u,stepId:L,stepKey:T,name:m,ts:Date.now(),durationMs:performance.now()-I,attempts:i,lastError:f.error,...n&&{metadata:n},diagnostics:ke(f.error,r.errorMeta,"result",i,performance.now()-I)});break}catch(f){let J=performance.now()-w;if(Nt(f)){let S=f.ms;d({type:"step_timeout",workflowId:u,stepId:L,stepKey:T,name:m,ts:Date.now(),timeoutMs:S,attempt:i,...n&&{metadata:n},diagnostics:ke(f,r.errorMeta,"timeout",i)}),d({type:"step_success",workflowId:u,stepId:L,stepKey:T,name:m,description:l,ts:Date.now(),durationMs:performance.now()-I,...n&&{metadata:n}}),b&&d({type:"step_complete",workflowId:u,stepKey:b,name:m,description:l,ts:Date.now(),durationMs:performance.now()-I,result:Q(void 0),...n&&{metadata:n}});return}if(X(f))throw d({type:"step_aborted",workflowId:u,stepId:L,stepKey:T,name:m,description:l,ts:Date.now(),durationMs:J,...n&&{metadata:n}}),f;if(yt(f)){let S=Ut(f),P=O?.ms??S?.timeoutMs??0;if(d({type:"step_timeout",workflowId:u,stepId:L,stepKey:T,name:m,ts:Date.now(),timeoutMs:P,attempt:i,...n&&{metadata:n},diagnostics:ke(f,r.errorMeta,"timeout",i)}),i<M.attempts&&M.shouldRetry(f,i)){let j=Je(i,M);d({type:"step_retry",workflowId:u,stepId:L,stepKey:T,name:m,ts:Date.now(),attempt:i+1,maxAttempts:M.attempts,delayMs:j,error:f,...n&&{metadata:n},diagnostics:ke(f,r.errorMeta,"timeout",i,performance.now()-I)}),M.onRetry(f,i,j),await ze(j);continue}M.attempts>1&&d({type:"step_retries_exhausted",workflowId:u,stepId:L,stepKey:T,name:m,ts:Date.now(),durationMs:performance.now()-I,attempts:i,lastError:f,...n&&{metadata:n},diagnostics:ke(f,r.errorMeta,"timeout",i,performance.now()-I)});let D=performance.now()-I;throw d({type:"step_error",workflowId:u,stepId:L,stepKey:T,name:m,description:l,ts:Date.now(),durationMs:D,error:f,...n&&{metadata:n},diagnostics:ke(f,r.errorMeta,"timeout",i,D)}),b&&d({type:"step_complete",workflowId:u,stepKey:b,name:m,description:l,ts:Date.now(),durationMs:D,result:A(f,{cause:f}),meta:{origin:"throw",thrown:f},...n&&{metadata:n}}),s?.(f,m,h),ee(f,{origin:"throw",thrown:f})}if(i<M.attempts&&M.shouldRetry(f,i)){let S=Je(i,M);d({type:"step_retry",workflowId:u,stepId:L,stepKey:T,name:m,ts:Date.now(),attempt:i+1,maxAttempts:M.attempts,delayMs:S,error:f,...n&&{metadata:n},diagnostics:ke(f,r.errorMeta,"throw",i,performance.now()-I)}),M.onRetry(f,i,S),await ze(S);continue}M.attempts>1&&!yt(f)&&d({type:"step_retries_exhausted",workflowId:u,stepId:L,stepKey:T,name:m,ts:Date.now(),durationMs:performance.now()-I,attempts:i,lastError:f,...n&&{metadata:n},diagnostics:ke(f,r.errorMeta,"throw",i,performance.now()-I)});let y=performance.now()-I,v;try{v=Y(f)}catch(S){throw Ae(S)}throw d({type:"step_error",workflowId:u,stepId:L,stepKey:T,name:m,description:l,ts:Date.now(),durationMs:y,error:v,...n&&{metadata:n},diagnostics:ke(f,r.errorMeta,"throw",i,y)}),b&&d({type:"step_complete",workflowId:u,stepKey:b,name:m,description:l,ts:Date.now(),durationMs:y,result:A(v,{cause:f}),meta:{origin:"throw",thrown:f},...n&&{metadata:n}}),s?.(v,m,h),ee(v,{origin:"throw",thrown:f})}}let Re=Te,ue=performance.now()-I,xe=K(Re.error,{origin:"result",resultCause:Re.cause});throw d({type:"step_error",workflowId:u,stepId:L,stepKey:T,name:m,description:l,ts:Date.now(),durationMs:ue,error:xe,...n&&{metadata:n},diagnostics:ke(Re.error,r.errorMeta,"result",M.attempts,ue)}),b&&d({type:"step_complete",workflowId:u,stepKey:b,name:m,description:l,ts:Date.now(),durationMs:ue,result:Re,meta:{origin:"result",resultCause:Re.cause},...n&&{metadata:n}}),s?.(xe,m,h),ee(xe,{origin:"result",resultCause:Re.cause})})();g.try=(c,x,o)=>{if(typeof c!="string"||c.length===0)throw new Error('[awaitly] step.try() requires an explicit string ID as the first argument. Example: step.try("parse", () => JSON.parse(str), { error: "PARSE_ERROR" })');let r="error"in o?()=>o.error:o.onError;if(o.retry||o.timeout)return g.retry(c,async()=>{try{return Q(await x())}catch(l){return A(r(l),{cause:l})}},{attempts:o.retry?.attempts??1,...o.retry??{},key:o.key,timeout:o.timeout});let n=o.key??c,m=c,T=c,b=a;return(async()=>{let l=b?performance.now():0;a&&d({type:"step_start",workflowId:u,stepId:T,stepKey:n,name:m,ts:Date.now()});try{let _=await x(),O=performance.now()-l;return d({type:"step_success",workflowId:u,stepId:T,stepKey:n,name:m,ts:Date.now(),durationMs:O}),n&&d({type:"step_complete",workflowId:u,stepKey:n,name:m,ts:Date.now(),durationMs:O,result:Q(_)}),_}catch(_){let O=r(_),L=performance.now()-l,$=K(O,{origin:"throw",thrown:_});throw d({type:"step_error",workflowId:u,stepId:T,stepKey:n,name:m,ts:Date.now(),durationMs:L,error:$}),n&&d({type:"step_complete",workflowId:u,stepKey:n,name:m,ts:Date.now(),durationMs:L,result:A(O,{cause:_}),meta:{origin:"throw",thrown:_}}),s?.($,m,h),ee($,{origin:"throw",thrown:_})}})()},g.fromResult=(c,x,o)=>{if(typeof c!="string"||c.length===0)throw new Error('[awaitly] step.fromResult() requires an explicit string ID as the first argument. Example: step.fromResult("callProvider", () => callProvider(input), { onError: (e) => ({ type: "FAILED" }) })');let r=o.key??c,n=c,m=c,T="error"in o?()=>o.error:o.onError,b=a;return(async()=>{let l=b?performance.now():0;a&&d({type:"step_start",workflowId:u,stepId:m,stepKey:r,name:n,ts:Date.now()});let _=await x();if(_.ok){let O=performance.now()-l;return d({type:"step_success",workflowId:u,stepId:m,stepKey:r,name:n,ts:Date.now(),durationMs:O}),r&&d({type:"step_complete",workflowId:u,stepKey:r,name:n,ts:Date.now(),durationMs:O,result:Q(_.value)}),_.value}else{let O=T(_.error),L=performance.now()-l,$=K(O,{origin:"result",resultCause:_.error});throw d({type:"step_error",workflowId:u,stepId:m,stepKey:r,name:n,ts:Date.now(),durationMs:L,error:$}),r&&d({type:"step_complete",workflowId:u,stepKey:r,name:n,ts:Date.now(),durationMs:L,result:A(O,{cause:_.error}),meta:{origin:"result",resultCause:_.error}}),s?.($,n,h),ee($,{origin:"result",resultCause:_.error})}})()},g.fromNullable=(c,x,o,r)=>{if(typeof c!="string"||c.length===0)throw new Error('[awaitly] step.fromNullable() requires an explicit string ID as the first argument. Example: step.fromNullable("getUser", () => db.find(id), () => ({ type: "NOT_FOUND" }))');return g(c,async()=>{let n=await x();return n!=null?Q(n):A(o())},r)},g.retry=(c,x,o)=>{if(typeof c!="string"||c.length===0)throw new Error('[awaitly] step.retry() requires an explicit string ID as the first argument. Example: step.retry("fetchData", () => fetchData(), { attempts: 3 })');return g(c,x,{key:o.key??c,retry:{attempts:o.attempts,backoff:o.backoff,initialDelay:o.initialDelay,maxDelay:o.maxDelay,jitter:o.jitter,shouldRetry:o.shouldRetry,onRetry:o.onRetry},timeout:o.timeout})},g.withTimeout=(c,x,o)=>{if(typeof c!="string"||c.length===0)throw new Error('[awaitly] step.withTimeout() requires an explicit string ID as the first argument. Example: step.withTimeout("slowOp", () => slowOp(), { ms: 5000 })');return g(c,x,{key:o.key??c,timeout:o})},g.sleep=(c,x,o)=>{if(typeof c!="string"||c.length===0)throw new Error('[awaitly] step.sleep() requires an explicit string ID as the first argument. Example: step.sleep("delay", "5s")');let r=typeof x=="string"?Ot(x):x;if(!r)throw new Error(`step.sleep: invalid duration '${x}'`);let n=r.millis,m=o?.signal;return g(c,async()=>{if(B?.aborted||m?.aborted){let T=new Error("Sleep aborted");throw T.name="AbortError",T}return new Promise((T,b)=>{let l={timeoutId:void 0},_=()=>{l.timeoutId&&clearTimeout(l.timeoutId);let O=new Error("Sleep aborted");O.name="AbortError",b(O)};B?.addEventListener("abort",_,{once:!0}),m?.addEventListener("abort",_,{once:!0}),l.timeoutId=setTimeout(()=>{B?.removeEventListener("abort",_),m?.removeEventListener("abort",_),T(Q(void 0))},n)})},{key:o?.key??c,description:o?.description})},g.all=((...c)=>{if(typeof c[0]!="string")throw new TypeError("step.all(name, ...): first argument must be a string (step name). Example: step.all('Fetch data', { user: () => fetchUser(), posts: () => fetchPosts() })");let x=c[0],o=c[1];if(typeof o=="function")return oe(x,o);if(o&&typeof o=="object"&&!Array.isArray(o)){let n=pe(o);return H(n,{name:x})}throw new TypeError("step.all(name, ...): second argument must be a function (array form) or an object of operations (object form).")}),g.race=(c,x)=>{let o=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let r=performance.now(),n=!1,m={scopeId:o,type:"race",winnerId:void 0};W.push(m);let T=()=>{if(n)return;n=!0;let b=W.findIndex(l=>l.scopeId===o);b!==-1&&W.splice(b,1),d({type:"scope_end",workflowId:u,scopeId:o,ts:Date.now(),durationMs:performance.now()-r,winnerId:m.winnerId})};d({type:"scope_start",workflowId:u,scopeId:o,scopeType:"race",name:c,ts:Date.now()});try{let b=await x();if(T(),!b.ok)throw s?.(b.error,c,h),ee(b.error,{origin:"result",resultCause:b.cause});return b.value}catch(b){throw T(),b}})()},g.if=(c,x,o)=>o(),g.label=g.if,g.branch=async(c,x)=>{let{condition:o,then:r,else:n}=x;if(o())return await r();if(n)return await n()},g.arm=(c,x)=>({fn:c,errors:x}),g.forEach=async(c,x,o)=>{let r=[],n=o.maxIterations,m=0,T="run"in o,b=Symbol.asyncIterator in x?x:(async function*(){yield*x})();for await(let l of b){if(n!==void 0&&m>=n)break;let _;T?_=await o.run(l,m):_=await o.item.handler(l,m,g),r.push(_),m++}return r},g.item=c=>({__forEachItemHandler:!0,handler:c}),g.dep=(c,x)=>x,g.workflow=(c,x,o)=>g(c,x,o),g.map=async(c,x,o,r)=>{let n=r?.concurrency??x.length;return g(c,()=>n>=x.length?kt(x.map((m,T)=>o(m,T))):(async()=>{let m=[];for(let T=0;T<x.length;T+=n){let b=x.slice(T,T+n),l=await kt(b.map((_,O)=>o(_,T+O)));if(!l.ok)return l;m.push(...l.value)}return Q(m)})(),{key:r?.key})},g.withFallback=(c,x,o)=>{if(typeof c!="string"||c.length===0)throw new Error('[awaitly] step.withFallback() requires an explicit string ID as the first argument. Example: step.withFallback("getUser", () => fetchUser(id), { fallback: () => fetchFromCache(id) })');let r=o.key??c,n=c,m=ae(r),T=a;return(async()=>{let b=T?performance.now():0;a&&d({type:"step_start",workflowId:u,stepId:m,stepKey:r,name:n,ts:Date.now()});let l;try{l=await x()}catch(I){if(X(I))throw d({type:"step_aborted",workflowId:u,stepId:m,stepKey:r,name:n,ts:Date.now(),durationMs:performance.now()-b}),I;let z;try{z=Y(I)}catch(q){throw Ae(q)}if(o.on!==void 0&&o.on!==z){let q=performance.now()-b;throw d({type:"step_error",workflowId:u,stepId:m,stepKey:r,name:n,ts:Date.now(),durationMs:q,error:z}),r&&d({type:"step_complete",workflowId:u,stepKey:r,name:n,ts:Date.now(),durationMs:q,result:A(z,{cause:I}),meta:{origin:"throw",thrown:I}}),s?.(z,n,h),ee(z,{origin:"throw",thrown:I})}let N;try{N=await o.fallback()}catch(q){if(X(q))throw d({type:"step_aborted",workflowId:u,stepId:m,stepKey:r,name:n,ts:Date.now(),durationMs:performance.now()-b}),q;let M;try{M=Y(q)}catch(Re){throw Ae(Re)}let Te=performance.now()-b;throw d({type:"step_error",workflowId:u,stepId:m,stepKey:r,name:n,ts:Date.now(),durationMs:Te,error:M}),r&&d({type:"step_complete",workflowId:u,stepKey:r,name:n,ts:Date.now(),durationMs:Te,result:A(M,{cause:q}),meta:{origin:"throw",thrown:q}}),s?.(M,n,h),ee(M,{origin:"throw",thrown:q})}if(N.ok){let q=performance.now()-b;return d({type:"step_success",workflowId:u,stepId:m,stepKey:r,name:n,ts:Date.now(),durationMs:q}),r&&d({type:"step_complete",workflowId:u,stepKey:r,name:n,ts:Date.now(),durationMs:q,result:N,meta:{origin:"fallback",fallbackUsed:!0,fallbackReason:String(z)}}),N.value}else{let q=performance.now()-b,M=K(N.error,{origin:"result",resultCause:N.cause});throw d({type:"step_error",workflowId:u,stepId:m,stepKey:r,name:n,ts:Date.now(),durationMs:q,error:M}),r&&d({type:"step_complete",workflowId:u,stepKey:r,name:n,ts:Date.now(),durationMs:q,result:N,meta:{origin:"result",resultCause:N.cause}}),s?.(M,n,h),ee(M,{origin:"result",resultCause:N.cause})}}if(l.ok){let I=performance.now()-b;return d({type:"step_success",workflowId:u,stepId:m,stepKey:r,name:n,ts:Date.now(),durationMs:I}),r&&d({type:"step_complete",workflowId:u,stepKey:r,name:n,ts:Date.now(),durationMs:I,result:l}),l.value}let _=l.error;if(o.on!==void 0&&o.on!==_){let I=performance.now()-b,z=K(_,{origin:"result",resultCause:l.cause});throw d({type:"step_error",workflowId:u,stepId:m,stepKey:r,name:n,ts:Date.now(),durationMs:I,error:z}),r&&d({type:"step_complete",workflowId:u,stepKey:r,name:n,ts:Date.now(),durationMs:I,result:l,meta:{origin:"result",resultCause:l.cause}}),s?.(z,n,h),ee(z,{origin:"result",resultCause:l.cause})}let O;try{O=await o.fallback()}catch(I){if(X(I))throw d({type:"step_aborted",workflowId:u,stepId:m,stepKey:r,name:n,ts:Date.now(),durationMs:performance.now()-b}),I;let z;try{z=Y(I)}catch(q){throw Ae(q)}let N=performance.now()-b;throw d({type:"step_error",workflowId:u,stepId:m,stepKey:r,name:n,ts:Date.now(),durationMs:N,error:z}),r&&d({type:"step_complete",workflowId:u,stepKey:r,name:n,ts:Date.now(),durationMs:N,result:A(z,{cause:I}),meta:{origin:"throw",thrown:I}}),s?.(z,n,h),ee(z,{origin:"throw",thrown:I})}if(O.ok){let I=performance.now()-b;return d({type:"step_success",workflowId:u,stepId:m,stepKey:r,name:n,ts:Date.now(),durationMs:I}),r&&d({type:"step_complete",workflowId:u,stepKey:r,name:n,ts:Date.now(),durationMs:I,result:O,meta:{origin:"fallback",fallbackUsed:!0,fallbackReason:String(_)}}),O.value}let L=performance.now()-b,$=K(O.error,{origin:"result",resultCause:O.cause});throw d({type:"step_error",workflowId:u,stepId:m,stepKey:r,name:n,ts:Date.now(),durationMs:L,error:$}),r&&d({type:"step_complete",workflowId:u,stepKey:r,name:n,ts:Date.now(),durationMs:L,result:O,meta:{origin:"result",resultCause:O.cause}}),s?.($,n,h),ee($,{origin:"result",resultCause:O.cause})})()},g.withResource=(c,x)=>{if(typeof c!="string"||c.length===0)throw new Error('[awaitly] step.withResource() requires an explicit string ID as the first argument. Example: step.withResource("useDb", { acquire: () => connect(), use: (db) => query(db), release: (db) => db.close() })');let o=c,r=c,n=ae(o),m=a;return(async()=>{let T=m?performance.now():0;a&&d({type:"step_start",workflowId:u,stepId:n,stepKey:o,name:r,ts:Date.now()});let b;try{b=await x.acquire()}catch(N){if(X(N))throw d({type:"step_aborted",workflowId:u,stepId:n,stepKey:o,name:r,ts:Date.now(),durationMs:performance.now()-T}),N;let q;try{q=Y(N)}catch(Te){throw Ae(Te)}let M=performance.now()-T;throw d({type:"step_error",workflowId:u,stepId:n,stepKey:o,name:r,ts:Date.now(),durationMs:M,error:q}),o&&d({type:"step_complete",workflowId:u,stepKey:o,name:r,ts:Date.now(),durationMs:M,result:A(q,{cause:N}),meta:{origin:"throw",thrown:N}}),s?.(q,r,h),ee(q,{origin:"throw",thrown:N})}if(!b.ok){let N=performance.now()-T,q=K(b.error,{origin:"result",resultCause:b.cause});throw d({type:"step_error",workflowId:u,stepId:n,stepKey:o,name:r,ts:Date.now(),durationMs:N,error:q}),o&&d({type:"step_complete",workflowId:u,stepKey:o,name:r,ts:Date.now(),durationMs:N,result:b,meta:{origin:"result",resultCause:b.cause}}),s?.(q,r,h),ee(q,{origin:"result",resultCause:b.cause})}let l=b.value,_,O,L=!1;try{_=await x.use(l)}catch(N){if(X(N)){try{await x.release(l)}catch(q){console.warn(`[awaitly] step.withResource("${c}"): release threw after earlyExit:`,q)}throw N}O=N,L=!0}try{await x.release(l)}catch(N){console.warn(`[awaitly] step.withResource("${c}"): release threw:`,N)}if(L){let N;try{N=Y(O)}catch(M){throw Ae(M)}let q=performance.now()-T;throw d({type:"step_error",workflowId:u,stepId:n,stepKey:o,name:r,ts:Date.now(),durationMs:q,error:N}),o&&d({type:"step_complete",workflowId:u,stepKey:o,name:r,ts:Date.now(),durationMs:q,result:A(N,{cause:O}),meta:{origin:"throw",thrown:O}}),s?.(N,r,h),ee(N,{origin:"throw",thrown:O})}let $=_;if($.ok){let N=performance.now()-T;return d({type:"step_success",workflowId:u,stepId:n,stepKey:o,name:r,ts:Date.now(),durationMs:N}),o&&d({type:"step_complete",workflowId:u,stepKey:o,name:r,ts:Date.now(),durationMs:N,result:$}),$.value}let I=performance.now()-T,z=K($.error,{origin:"result",resultCause:$.cause});throw d({type:"step_error",workflowId:u,stepId:n,stepKey:o,name:r,ts:Date.now(),durationMs:I,error:z}),o&&d({type:"step_complete",workflowId:u,stepKey:o,name:r,ts:Date.now(),durationMs:I,result:$,meta:{origin:"result",resultCause:$.cause}}),s?.(z,r,h),ee(z,{origin:"result",resultCause:$.cause})})()};let te=await e({step:g});if(process.env.NODE_ENV!=="production"&&te!==null&&typeof te=="object"&&"ok"in te&&typeof te.ok=="boolean"){let c=te;(c.ok===!0&&"value"in c||c.ok===!1&&"error"in c)&&console.warn(`awaitly: Workflow executor returned a Result-like object. Return raw values, not ok() or err().
2
-
3
- Incorrect: return ok({ data });
4
- Correct: return { data };
5
-
6
- See: https://jagreehal.github.io/awaitly/guides/troubleshooting/#returning-ok-from-workflow-executor-double-wrapping`)}return Q(te)}catch(g){if(Wt(g))throw g.thrown;if(X(g)){let oe=g.meta.origin==="throw"?g.meta.thrown:g.meta.origin==="result"?g.meta.resultCause:void 0;return A(g.error,{cause:oe})}let pe=Y(g);return s?.(pe,"unexpected",h),A(pe,{cause:g})}}$e.strict=(e,t)=>$e(e,t);async function kt(e){return e.length===0?Q([]):new Promise(t=>{let s=!1,a=e.length,E=new Array(e.length);for(let p=0;p<e.length;p++){let R=p;Promise.resolve(e[R]).catch(h=>A({type:"PROMISE_REJECTED",cause:h},{cause:{type:"PROMISE_REJECTION",reason:h}})).then(h=>{if(!s){if(!h.ok){s=!0,t(h);return}E[R]=h.value,a--,a===0&&t(Q(E))}})}})}function Xe(e){return e.type==="step_complete"}function Oe(e){return typeof e=="object"&&e!==null&&e.type==="WORKFLOW_CANCELLED"}var ve=class extends Error{constructor(s,a=[]){super(s);this.errors=a;this.name="SnapshotFormatError"}};var Ie=class extends Error{constructor(s,a,E){super(s);this.stepId=a;this.originalError=E;this.name="SnapshotDecodeError"}};function Kt(e){let t=[];if(typeof e!="object"||e===null)return{valid:!1,errors:["Snapshot must be an object"]};let s=e;if("formatVersion"in s?s.formatVersion!==1&&t.push(`Invalid formatVersion: expected 1, got ${s.formatVersion}`):t.push("Missing required field: formatVersion"),!("steps"in s))t.push("Missing required field: steps");else if(typeof s.steps!="object"||s.steps===null)t.push("steps must be an object");else{let a=s.steps;for(let[E,p]of Object.entries(a)){if(typeof p!="object"||p===null){t.push(`steps["${E}"] must be an object`);continue}let R=p;"ok"in R?typeof R.ok!="boolean"?t.push(`steps["${E}"].ok must be a boolean`):R.ok===!1&&("error"in R||t.push(`steps["${E}"] is error result but missing error field`),"cause"in R||t.push(`steps["${E}"] is error result but missing cause field`)):t.push(`steps["${E}"] missing required field: ok`)}}if(!("execution"in s))t.push("Missing required field: execution");else if(typeof s.execution!="object"||s.execution===null)t.push("execution must be an object");else{let a=s.execution;"status"in a?["running","completed","failed"].includes(a.status)||t.push("execution.status must be one of: running, completed, failed"):t.push("execution missing required field: status"),"lastUpdated"in a?typeof a.lastUpdated!="string"&&t.push("execution.lastUpdated must be a string (ISO timestamp)"):t.push("execution missing required field: lastUpdated")}return t.length>0?{valid:!1,errors:t}:{valid:!0,snapshot:e}}function St(e){let t=Kt(e);if(!t.valid)throw new ve(`Invalid snapshot format: ${t.errors[0]}`,t.errors);return t.snapshot}function Ct(e,t){let s=Object.create(null);for(let[R,h]of Object.entries(e.steps))Object.prototype.hasOwnProperty.call(e.steps,R)&&(s[R]=h);for(let[R,h]of Object.entries(t.steps))Object.prototype.hasOwnProperty.call(t.steps,R)&&(s[R]=h);let a=e.metadata||t.metadata?{...e.metadata,...t.metadata}:void 0,p=[...(e.warnings||[]).filter(R=>!Object.prototype.hasOwnProperty.call(t.steps,R.stepId)),...t.warnings||[]];return{formatVersion:1,steps:s,execution:{...t.execution},metadata:a,warnings:p.length>0?p:void 0}}var xt=1e3;function Ge(e){let t={type:"error",name:e.name,message:e.message};e.stack&&(t.stack=e.stack);let s=e;return s.cause!==void 0&&(s.cause instanceof Error?t.cause=Ge(s.cause):t.cause=Ze(s.cause)),t}function Ze(e){let t,s=!1;try{t=String(e),t.length>xt&&(t=t.slice(0,xt),s=!0)}catch{t="[unable to convert to string]"}let a=e===null?"null":typeof e=="object"?e.constructor?.name??"Object":typeof e,E;try{let R=JSON.stringify(e);R!==void 0&&(E=JSON.parse(R))}catch{}let p={type:"thrown",originalType:a,stringRepresentation:t};return E!==void 0&&(p.value=E),s&&(p.truncated=!0),p}function Qe(e){if(e.type==="error"){let t=new Error(e.message);return t.name=e.name,e.stack&&(t.stack=e.stack),e.cause&&(t.cause=Qe(e.cause)),t}return e.value!==void 0?e.value:e.stringRepresentation}function Ft(e){return typeof e=="object"&&e!==null&&e.__cachedMeta===!0}function Ce(e,t,s){return A(e,{cause:{__cachedMeta:!0,originalCause:s,meta:t}})}function Fe(e){return Ft(e)?e.meta:{origin:"result",resultCause:e}}function Le(){let e=new Map;return{handleEvent:t=>{Xe(t)&&e.set(t.stepKey,{result:t.result,meta:t.meta})},getResumeState:()=>({steps:new Map(e)}),clear:()=>e.clear()}}var $t="STREAM_WRITE_ERROR",Bt="STREAM_READ_ERROR",Ht="STREAM_CLOSE_ERROR";var qt="STREAM_ENDED";function He(e,t,s){return{type:$t,reason:e,message:t,...s!==void 0?{cause:s}:{}}}function et(e,t,s){return{type:Bt,reason:e,message:t,...s!==void 0?{cause:s}:{}}}function tt(e,t,s){return{type:Ht,reason:e,message:t,...s!==void 0?{cause:s}:{}}}function qe(e){return{type:qt,finalPosition:e}}function bt(e={}){let t=e.highWaterMark??16,s=e.lowWaterMark??Math.floor(t/2),a=e.onStateChange,E="flowing",p=0,R=[];function h(u){if(E!==u&&(E=u,a?.(u),u==="flowing"&&R.length>0)){let Y=R;R=[];for(let W of Y)W()}}function B(){E==="flowing"&&p>=t?h("paused"):E==="paused"&&p<=s&&h("flowing")}return{get state(){return E},get bufferedCount(){return p},get highWaterMark(){return t},get lowWaterMark(){return s},increment(){p++,B()},decrement(){p>0&&(p--,B())},setCount(u){p=Math.max(0,u),B()},waitForDrain(){return E==="flowing"?Promise.resolve():new Promise(u=>{R.push(u)})},reset(){p=0,R=[],h("flowing")}}}function Jt(e){return{_tag:"Duration",millis:e}}function zt(e){return{_tag:"Duration",millis:e*1e3}}function Yt(e){return{_tag:"Duration",millis:e*60*1e3}}function Xt(e){return{_tag:"Duration",millis:e*60*60*1e3}}function Gt(e){return{_tag:"Duration",millis:e*24*60*60*1e3}}function vt(e){return e.millis}function At(e){let t=e.trim().match(/^(\d+(?:\.\d+)?)\s*(ms|s|m|h|d)$/i);if(!t)return;let s=parseFloat(t[1]);switch(t[2].toLowerCase()){case"ms":return Jt(s);case"s":return zt(s);case"m":return Yt(s);case"h":return Xt(s);case"d":return Gt(s);default:return}}async function _t(e,t){let s=e["~standard"].validate(t),a=s instanceof Promise?await s:s;return a.issues?A({type:"INPUT_VALIDATION_ERROR",issues:a.issues.map(E=>({message:E.message,path:E.path?.map(p=>typeof p=="object"?p.key:p)})),message:`Input validation failed: ${a.issues.map(E=>E.message).join(", ")}`}):Q(a.value)}function rt(e,t){let s=a=>((...E)=>{let p=E.at(-1),R=E.length>0&&typeof p=="object"&&p!==null&&!Array.isArray(p)&&typeof p!="function",h=R?p:void 0,B=R?E.slice(0,-1):E,u={...t,...h?.deps??{}},Y=h?{...h,deps:u}:{deps:u};return e[a](...B,Y)});return{run:s("run"),runWithState:s("runWithState"),withDeps(a){return rt(e,{...t,...a})}}}function nt(e,t,s){if(typeof e!="string"||e.length===0)throw new TypeError("createWorkflow(workflowName, deps, options?): first argument must be a non-empty string. Example: createWorkflow('checkout', { chargeCard, sendEmail })");let a=t??{},E=s;async function p(u,Y,W){let C=u??crypto.randomUUID(),ae=W?.deps?{...a,...W.deps}:a,d=[],ee=W?.createContext??E?.createContext,X=ee?await ee():void 0,K=W?.signal??E?.signal,ce=W?.onEvent??E?.onEvent,Ee=W?.onError??E?.onError,ge=W?.shouldRun??E?.shouldRun,ye=W?.onBeforeStart??E?.onBeforeStart,g=W?.onAfterStep??E?.onAfterStep,pe=W?.resumeState??E?.resumeState,oe=E?.catchUnexpected??Be,H={},ie=(W?.devWarnings??E?.devWarnings)===!0&&process.env.NODE_ENV!=="production",te=new Set,c=new Set,x={workflowId:C,onEvent:ce,context:X!==void 0?X:void 0,signal:K,input:{},ref:i=>H[i],set:(i,w)=>{ie&&!te.has(i)&&(te.add(i),console.warn(`awaitly: ctx.set('${i}', ...) is deprecated for static analysis. Use step('id', fn, { out: '${i}' }) instead.`)),H[i]=w},get:i=>(ie&&!c.has(i)&&(c.add(i),console.warn(`awaitly: ctx.get('${i}') is deprecated for static analysis. Use ctx.ref('${i}') instead for tracked dependencies.`)),H[i])},o=i=>{let w=i.context!==void 0||X===void 0?i:{...i,context:X},f=w.workflowName===void 0?{...w,workflowName:e}:w;ce?.(f,X)},r=(i,w)=>{let f={type:"WORKFLOW_CANCELLED",reason:i,lastStepKey:w};return A(oe(f),{cause:f})};if(K?.aborted){let i=typeof K.reason=="string"?K.reason:K.reason instanceof Error?K.reason.message:void 0;return o({type:"workflow_cancelled",workflowId:C,ts:Date.now(),durationMs:0,reason:i}),r(i)}if(ge){let i=performance.now();try{let w=await ge(C,X),f=performance.now()-i;if(o({type:"hook_should_run",workflowId:C,ts:Date.now(),durationMs:f,result:w,skipped:!w}),!w){let J=new Error("Workflow skipped by shouldRun hook");return A(oe(J),{cause:J})}}catch(w){let f=performance.now()-i;return o({type:"hook_should_run_error",workflowId:C,ts:Date.now(),durationMs:f,error:w}),A(oe(w),{cause:w})}}if(ye){let i=performance.now();try{let w=await ye(C,X),f=performance.now()-i;if(o({type:"hook_before_start",workflowId:C,ts:Date.now(),durationMs:f,result:w,skipped:!w}),!w){let J=new Error("Workflow skipped by onBeforeStart hook");return A(oe(J),{cause:J})}}catch(w){let f=performance.now()-i;return o({type:"hook_before_start_error",workflowId:C,ts:Date.now(),durationMs:f,error:w}),A(oe(w),{cause:w})}}let n=E?.inputSchema,m=E?.input;if(n){let i=await _t(n,m);if(!i.ok)return A(i.error);x.input=i.value}else m!==void 0&&(x.input=m);let T=Date.now(),b=performance.now();o({type:"workflow_start",workflowId:C,ts:T});let l=W?.cache??E?.cache,_=W?.streamStore??E?.streamStore;if(pe&&!l&&(l=new Map),pe&&l){let i=typeof pe=="function"?await pe():pe;i.steps instanceof Map||(console.warn(`awaitly: resumeState.steps is not a Map (got ${typeof i.steps}). This usually happens when state is serialized with JSON.stringify() directly.
7
- Use stringifyState() and parseState() from 'awaitly/persistence' instead:
8
- import { stringifyState, parseState } from 'awaitly/persistence';
9
- const json = stringifyState(state); // Save this
10
- const restored = parseState(json); // Load this`),typeof i.steps=="object"&&i.steps!==null&&(i.steps=new Map(Object.entries(i.steps))));for(let[w,f]of i.steps){let{result:J,meta:y}=f;if(J.ok)l.set(w,J);else{let v=y??{origin:"result",resultCause:J.cause};l.set(w,Ce(J.error,v,J.cause))}}}let O=W?.snapshot??E?.snapshot,L=E?.serialization;if(O&&!pe){l||(l=new Map);let i=O,w=L?.decode;for(let[f,J]of Object.entries(i.steps))if(Object.prototype.hasOwnProperty.call(i.steps,f))try{if(J.ok){let y=w?w(J.value):J.value;l.set(f,Q(y))}else{let y=w?w(J.error):J.error,v=Qe(J.cause),S=J.meta?.origin==="throw"?{origin:"throw",thrown:v}:{origin:"result",resultCause:v};l.set(f,Ce(y,S,v))}}catch(y){throw new Ie(`Failed to decode step "${f}": ${y instanceof Error?y.message:String(y)}`,f,y instanceof Error?y:void 0)}}let $=!1,I,z,N=()=>{$=!0,I=typeof K?.reason=="string"?K.reason:K?.reason instanceof Error?K.reason.message:void 0};K&&!K.aborted&&K.addEventListener("abort",N,{once:!0});let q=()=>{if($||K?.aborted)throw{type:"WORKFLOW_CANCELLED",reason:I??(typeof K?.reason=="string"?K.reason:K?.reason instanceof Error?K.reason.message:void 0),lastStepKey:z}},M=async(i,w,f)=>{if(!g)return;let J=performance.now();try{await g(i,w,C,X);let y=performance.now()-J;o({type:"hook_after_step",workflowId:C,stepKey:i,ts:Date.now(),durationMs:y})}catch(y){let v=performance.now()-J;throw o({type:"hook_after_step_error",workflowId:C,stepKey:i,ts:Date.now(),durationMs:v,error:y}),y}},Te=i=>{let w=async(y,v,S)=>{if(typeof y!="string")throw new Error('[awaitly] step() requires a string ID as the first argument. Example: step("fetchUser", () => fetchUser(id))');let P=y,D=S??{},j=P,k=Object.prototype.hasOwnProperty.call(D,"key")?D.key:P,{ttl:F,out:re}=D;q();let Z=Ye(D);if(k&&l&&l.has(k)){o({type:"step_cache_hit",workflowId:C,stepKey:k,name:j,ts:Date.now(),...Z&&{metadata:Z}});let U=l.get(k);if(U.ok)return z=k,re&&(H[re]=U.value),U.value;let V=Fe(U.cause);throw Pe(U.error,V)}k&&l&&o({type:"step_cache_miss",workflowId:C,stepKey:k,name:j,ts:Date.now(),...Z&&{metadata:Z}});try{let U=await i(P,v,D);return re&&(H[re]=U),D.compensate&&d.push({stepName:j,value:U,compensate:D.compensate}),k&&(z=k,l&&l.set(k,Q(U),F?{ttl:F}:void 0),await M(k,Q(U))),U}catch(U){if(k&&be(U)){let V=U,le=V.meta.origin==="result"?V.meta.resultCause:V.meta.origin==="throw"?V.meta.thrown:void 0,G=Ce(V.error,V.meta,le);l&&l.set(k,G,F?{ttl:F}:void 0),await M(k,G,V.meta)}throw U}};w.try=async(y,v,S)=>{let{ttl:P}=S,D=S.key??y,j=y;if(l&&l.has(D)){o({type:"step_cache_hit",workflowId:C,stepKey:D,name:j,ts:Date.now()});let k=l.get(D);if(k.ok)return k.value;let F=Fe(k.cause);throw Pe(k.error,F)}l&&o({type:"step_cache_miss",workflowId:C,stepKey:D,name:j,ts:Date.now()});try{let k=await i.try(y,v,{...S,key:D});return S.compensate&&d.push({stepName:j,value:k,compensate:S.compensate}),l&&l.set(D,Q(k),P?{ttl:P}:void 0),await M(D,Q(k)),k}catch(k){if(be(k)){let F=k,re=F.meta.origin==="result"?F.meta.resultCause:F.meta.origin==="throw"?F.meta.thrown:void 0,Z=Ce(F.error,F.meta,re);l&&l.set(D,Z,P?{ttl:P}:void 0),await M(D,Z,F.meta)}throw k}},w.fromResult=async(y,v,S)=>{let{ttl:P}=S,D=S.key??y,j=y;if(l&&l.has(D)){o({type:"step_cache_hit",workflowId:C,stepKey:D,name:j,ts:Date.now()});let k=l.get(D);if(k.ok)return k.value;let F=Fe(k.cause);throw Pe(k.error,F)}l&&o({type:"step_cache_miss",workflowId:C,stepKey:D,name:j,ts:Date.now()});try{let k=await i.fromResult(y,v,{...S,key:D});return l&&l.set(D,Q(k),P?{ttl:P}:void 0),await M(D,Q(k)),k}catch(k){if(be(k)){let F=k,re=F.meta.origin==="result"?F.meta.resultCause:F.meta.origin==="throw"?F.meta.thrown:void 0,Z=Ce(F.error,F.meta,re);l&&l.set(D,Z,P?{ttl:P}:void 0),await M(D,Z,F.meta)}throw k}},w.race=i.race,w.withFallback=async(y,v,S)=>{let P=S.key??y,D=y;if(l&&l.has(P)){o({type:"step_cache_hit",workflowId:C,stepKey:P,name:D,ts:Date.now()});let j=l.get(P);if(j.ok)return j.value;let k=Fe(j.cause);throw Pe(j.error,k)}l&&o({type:"step_cache_miss",workflowId:C,stepKey:P,name:D,ts:Date.now()});try{let j=await i.withFallback(y,v,S);return l&&l.set(P,Q(j)),await M(P,Q(j)),j}catch(j){if(be(j)){let k=j,F=k.meta.origin==="result"?k.meta.resultCause:k.meta.origin==="throw"?k.meta.thrown:void 0,re=Ce(k.error,k.meta,F);l&&l.set(P,re),await M(P,re,k.meta)}throw j}},w.withResource=async(y,v)=>{let S=y;try{let P=await i.withResource(y,v);return await M(S,Q(P)),P}catch(P){if(be(P)){let D=P,j=D.meta.origin==="result"?D.meta.resultCause:D.meta.origin==="throw"?D.meta.thrown:void 0,k=Ce(D.error,D.meta,j);await M(S,k,D.meta)}throw P}},w.retry=(y,v,S)=>{let P={key:S.key,retry:{attempts:S.attempts,backoff:S.backoff,initialDelay:S.initialDelay,maxDelay:S.maxDelay,jitter:S.jitter,shouldRetry:S.shouldRetry,onRetry:S.onRetry},timeout:S.timeout,ttl:S.ttl};return w(y,v,P)},w.withTimeout=(y,v,S)=>{let P={key:S.key,timeout:S,ttl:S.ttl};return w(y,v,P)},w.sleep=(y,v,S)=>{if(typeof y!="string"||y.length===0)throw new Error('[awaitly] step.sleep() requires an explicit string ID as the first argument. Example: step.sleep("delay", "5s")');let P=typeof v=="string"?At(v):v;if(!P)throw new Error(`step.sleep: invalid duration '${v}'`);let D=vt(P),j=S?.signal;return w(y,async()=>{if(K?.aborted||j?.aborted){let F=new Error("Sleep aborted");throw F.name="AbortError",F}return new Promise((F,re)=>{let Z={timeoutId:void 0},U=()=>{Z.timeoutId&&clearTimeout(Z.timeoutId);let V=new Error("Sleep aborted");V.name="AbortError",re(V)};K?.addEventListener("abort",U,{once:!0}),j?.addEventListener("abort",U,{once:!0}),Z.timeoutId=setTimeout(()=>{K?.removeEventListener("abort",U),j?.removeEventListener("abort",U),F(Q(void 0))},D)})},{key:S?.key,ttl:S?.ttl,description:S?.description})};let f=new Map,J=new Map;return w.getWritable=y=>{let v=y?.namespace??"default",S=y?.highWaterMark??16;if(!_)throw new Error("streamStore is required to use getWritable(). Pass a streamStore to createWorkflow options.");let P=`${C}:${v}`,D=f.get(P);if(D&&!D.closed&&!D.aborted)return D.writer;let j=bt({highWaterMark:S,onStateChange:V=>{o({type:"stream_backpressure",workflowId:C,namespace:v,bufferedCount:j.bufferedCount,state:V,ts:Date.now()})}}),k=0,F=!0,re=!1,Z=!1;o({type:"stream_created",workflowId:C,namespace:v,ts:Date.now()});let U={async write(V){if(Z)return A(He("closed","Stream is closed"));if(re)return A(He("aborted","Stream was aborted"));j.state==="paused"&&await j.waitForDrain();let le={value:V,position:k,ts:Date.now()},G=await _.append(C,v,le);return G.ok?(o({type:"stream_write",workflowId:C,namespace:v,position:k,ts:Date.now()}),k++,j.increment(),Q(void 0)):(o({type:"stream_error",workflowId:C,namespace:v,error:G.error,position:k,ts:Date.now()}),A(He("store_error",G.error.message,G.error)))},async close(){if(Z)return A(tt("already_closed","Stream is already closed"));let V=await _.closeStream(C,v);return V.ok?(Z=!0,F=!1,o({type:"stream_close",workflowId:C,namespace:v,finalPosition:k,ts:Date.now()}),f.delete(P),Q(void 0)):A(tt("store_error",V.error.message,V.error))},abort(V){re=!0,F=!1,Z=!0,o({type:"stream_error",workflowId:C,namespace:v,error:V,position:k,ts:Date.now()}),f.delete(P)},get writable(){return F},get position(){return k},get namespace(){return v}};return f.set(P,{writer:U,backpressure:j,aborted:re,closed:Z}),U},w.getReadable=y=>{let v=y?.namespace??"default",S=y?.startIndex??0,P=y?.pollInterval??10,D=y?.pollTimeout??3e4;if(!_)throw new Error("streamStore is required to use getReadable(). Pass a streamStore to createWorkflow options.");let j=`${C}:${v}:${S}`,k=J.get(j);if(k&&!k.closed)return k.reader;let F=()=>{let he=`${C}:${v}`,se=f.get(he);se&&se.backpressure.decrement()},re=S,Z=!0,U=!1,V=[],le=0,G={async read(){if(U)return A(et("closed","Reader is closed"));if(le<V.length){let fe=V[le++];return re=fe.position+1,F(),o({type:"stream_read",workflowId:C,namespace:v,position:fe.position,ts:Date.now()}),Q(fe.value)}let he=`${C}:${v}`,se=Date.now(),me=f.has(he),ne=await _.getMetadata(C,v),de=ne.ok&&ne.value!==void 0;for(;Date.now()-se<D;){let fe=await _.read(C,v,re,100);if(!fe.ok)return A(et("store_error",fe.error.message,fe.error));let Ue=fe.value;if(Ue.length>0){V=Ue,le=1;let Ne=Ue[0];return re=Ne.position+1,F(),o({type:"stream_read",workflowId:C,namespace:v,position:Ne.position,ts:Date.now()}),Q(Ne.value)}let We=f.has(he),Se=await _.getMetadata(C,v),at=Se.ok&&Se.value!==void 0;if(We&&(me=!0),at&&(de=!0),Se.ok&&Se.value?.closed)return Z=!1,A(qe(re));if(me&&!We&&!at)return Z=!1,A(qe(re));de&&!We&&Se.ok&&Se.value?.closed,await new Promise(Ne=>setTimeout(Ne,P))}return Z=!1,A(qe(re))},close(){U=!0,Z=!1,V=[],J.delete(j)},get readable(){return Z},get position(){return re},get namespace(){return v}};return J.set(j,{reader:G,position:re,closed:U}),G},w.streamForEach=async(y,v,S)=>{let P=S?.checkpointInterval??1,D=S?.concurrency??1,j=[],k=0,F=-1,re=U=>typeof U=="object"&&U!==null&&"read"in U&&typeof U.read=="function",Z=async(U,V,le,G)=>{let se=P>0&&V%P===0?`stream-foreach:${G}:pos-${le}`:void 0,me=se??`stream-item-${le}`,ne=await w(me,()=>v(U,V),{key:se});return{index:V,position:le,result:ne}};if(re(y))if(D<=1){let U=y.position,V=await y.read();for(;V.ok;){let le=V.value,{result:G}=await Z(le,k,U,y.namespace);j.push(G),F=U,k++,U=y.position,V=await y.read()}}else{let U=new Map,V=0,le=0,G=new Array(D).fill(null),he=async()=>{for(let fe=0;fe<G.length;fe++)if(G[fe]===null)return fe;let ne=G.filter(fe=>fe!==null),de=await Promise.race(ne);return U.set(de.index,{position:de.position,result:de.result}),G[de.slotIndex]=null,de.slotIndex},se=y.position,me=await y.read();for(;me.ok;){let ne=await he(),de=V,fe=se,Ue=me.value,We=ne;G[ne]=Z(Ue,de,fe,y.namespace).then(Se=>({slotIndex:We,...Se})),le++,V++,se=y.position,me=await y.read()}for(let ne=0;ne<G.length;ne++)if(G[ne]!==null){let de=await G[ne];U.set(de.index,{position:de.position,result:de.result})}for(let ne=0;ne<le;ne++){let de=U.get(ne);de&&(j.push(de.result),F=de.position,k++)}}else if(D<=1){let U=0;for await(let V of y){let{result:le}=await Z(V,U,U,"async-iterable");j.push(le),F=U,k++,U++}}else{let U=new Map,V=0,le=0,G=new Array(D).fill(null),he=async()=>{for(let ne=0;ne<G.length;ne++)if(G[ne]===null)return ne;let se=G.filter(ne=>ne!==null),me=await Promise.race(se);return U.set(me.index,me.result),G[me.slotIndex]=null,me.slotIndex};for await(let se of y){let me=await he(),ne=V,de=me;G[me]=Z(se,ne,ne,"async-iterable").then(fe=>({slotIndex:de,...fe})),le++,V++}for(let se=0;se<G.length;se++)if(G[se]!==null){let me=await G[se];U.set(me.index,me.result)}for(let se=0;se<le;se++)U.has(se)&&(j.push(U.get(se)),F=se,k++)}return{results:j,processedCount:k,lastPosition:F}},w.if=i.if,w.label=i.label,w.branch=i.branch,w.arm=i.arm,w.forEach=i.forEach,w.item=i.item,w.dep=i.dep,w.workflow=(y,v,S)=>w(y,v,S),w.all=(y,v,S)=>{let P=S!==void 0&&Object.prototype.hasOwnProperty.call(S,"key")?S:{...S,key:void 0};return w(y,async()=>Q(await i.all(y,v)),P)},w.map=(y,v,S,P)=>{let D=P!==void 0&&Object.prototype.hasOwnProperty.call(P,"key")?P:{...P,key:void 0};return w(y,async()=>Q(await i.map(y,v,S,P)),D)},w},Re=({step:i})=>Y({step:Te(i),deps:ae,ctx:x}),ue;try{ue=await $e(Re,{onError:Ee,onEvent:ce,catchUnexpected:oe,workflowId:C,workflowName:e,context:X,_workflowSignal:K})}finally{K&&K.removeEventListener("abort",N)}if(!ue.ok&&d.length>0){let i=[];for(let w=d.length-1;w>=0;w--){let f=d[w];try{await f.compensate(f.value)}catch(J){i.push({stepName:f.stepName,error:J})}}if(i.length>0){let w={type:"SAGA_COMPENSATION_ERROR",originalError:ue.error,compensationErrors:i};ue=A(w,{cause:ue.cause})}}let xe=performance.now()-b;if(!ue.ok){let i;if(Oe(ue.cause)&&(i=ue.cause),!i&&$&&Rt(ue.error)){let w=ue.cause;w!=null&&typeof w=="object"&&"name"in w&&w.name==="AbortError"&&(i={type:"WORKFLOW_CANCELLED",reason:I??(typeof K?.reason=="string"?K.reason:K?.reason instanceof Error?K.reason.message:void 0),lastStepKey:z})}if(i)return o({type:"workflow_cancelled",workflowId:C,ts:Date.now(),durationMs:xe,reason:i.reason,lastStepKey:i.lastStepKey}),i&&!Oe(ue.cause)?A(ue.error,{cause:i}):ue}if(ue.ok&&$){let i=I??(typeof K?.reason=="string"?K.reason:K?.reason instanceof Error?K.reason.message:void 0);o({type:"workflow_cancelled",workflowId:C,ts:Date.now(),durationMs:xe,reason:i,lastStepKey:z});let w={type:"WORKFLOW_CANCELLED",reason:i,lastStepKey:z};return A(oe(w),{cause:w})}return ue.ok?o({type:"workflow_success",workflowId:C,ts:Date.now(),durationMs:xe}):o({type:"workflow_error",workflowId:C,ts:Date.now(),durationMs:xe,error:ue.error}),ue}function R(u,Y,W){let C,ae,d;return typeof u=="string"?(C=u,ae=Y,d=W):(ae=u,d=Y),p(C,ae,d)}async function h(u,Y,W){let C,ae,d;typeof u=="string"?(C=u,ae=Y,d=W):(ae=u,d=Y);let ee=Le(),X=d?.onEvent,ce={...d,onEvent:(ye,g)=>{ee.handleEvent(ye);try{X?.(ye,g)}catch{}}},Ee,ge;try{Ee=await p(C,ae,ce)}catch(ye){let g=E?.catchUnexpected??Be;Ee=A(g(ye),{cause:ye})}finally{ge=ee.getResumeState()}return{result:Ee,resumeState:ge}}let B={withDeps:u=>rt(B,u),run:R,runWithState:h};return B}var ot;function Zt(){let e=new Map;return{async save(t,s){e.set(t,{snapshot:s,updatedAt:new Date})},async load(t){return e.get(t)?.snapshot??null},async delete(t){e.delete(t)},async list(t){let s=t?.prefix??"",a=t?.limit??100,E=[];for(let[p,R]of e.entries())if(!(s&&!p.startsWith(s))&&(E.push({id:p,updatedAt:R.updatedAt.toISOString()}),E.length>=a))break;return E.sort((p,R)=>R.updatedAt.localeCompare(p.updatedAt)),E},async close(){}}}function Qt(){return ot===void 0&&(ot=Zt()),ot}function er(e){return typeof e=="object"&&e!==null&&e.type==="VERSION_MISMATCH"}function tr(e){return typeof e=="object"&&e!==null&&e.type==="CONCURRENT_EXECUTION"}function rr(e){return typeof e=="object"&&e!==null&&e.type==="PERSISTENCE_ERROR"}function nr(e){return typeof e=="object"&&e!==null&&e.type==="LEASE_EXPIRED"}function or(e){return typeof e=="object"&&e!==null&&e.type==="IDEMPOTENCY_CONFLICT"}function Dt(e){return typeof e.tryAcquire=="function"&&typeof e.release=="function"}var st=new Set,Me=new Map,sr={async run(e,t,s){let{id:a,store:E,version:p=1,allowConcurrent:R=!1,lockTtlMs:h=6e4,heartbeatIntervalMs:B,abortOnLeaseLoss:u,metadata:Y,signal:W,createContext:C,onEvent:ae,onError:d,onVersionMismatch:ee,idempotencyKey:X,input:K}=s,ce=E??Qt(),Ee;if(X){let H=`idem:${X}`,ie=Me.get(H);if(ie)return await ie;Me.set(H,new Promise(te=>{Ee=te}));try{let te=await ce.load(H);if(te){if(K!==void 0&&te.metadata?.input!==void 0){let c=JSON.stringify(te.metadata.input),x=JSON.stringify(K);if(c!==x){let o=A({type:"IDEMPOTENCY_CONFLICT",idempotencyKey:X,workflowId:a,message:`Idempotency key '${X}' already used with different input for workflow '${a}'.`});return Ee(o),Me.delete(H),Ee=void 0,o}}if(te.execution.status==="completed"&&te.metadata?.finalResult!==void 0){let c=te.metadata.finalResult;return Ee(c),Me.delete(H),Ee=void 0,c}if(te.execution.status==="running"){let c=A({type:"CONCURRENT_EXECUTION",workflowId:a,message:`Workflow '${a}' with idempotency key '${X}' is already running.`,reason:"cross-process"});return Ee(c),Me.delete(H),Ee=void 0,c}}}catch{}try{await ce.save(H,{formatVersion:1,steps:{},execution:{status:"running",lastUpdated:new Date().toISOString()},metadata:{workflowId:a,idempotencyKey:X,input:K}})}catch{}}if(!R&&st.has(a)){let H={type:"CONCURRENT_EXECUTION",workflowId:a,message:`Workflow '${a}' is already running. Set allowConcurrent: true to allow parallel executions.`,reason:"in-process"};return A(H)}let ge=null;if(!R&&Dt(ce)){let H;try{H=await ce.tryAcquire(a,{ttlMs:h})}catch(ie){let te={type:"PERSISTENCE_ERROR",operation:"load",workflowId:a,cause:ie,message:`Failed to acquire lock for workflow '${a}': ${ie instanceof Error?ie.message:String(ie)}`};return A(te)}if(H===null){let ie={type:"CONCURRENT_EXECUTION",workflowId:a,message:`Workflow '${a}' is already running (lease held by another process). Set allowConcurrent: true to allow parallel executions.`,reason:"cross-process"};return A(ie)}ge=H.ownerToken}let ye,g,pe=ce;if(ge&&typeof pe.renew=="function"){let H=B??Math.floor(h/3);g=new AbortController,ye=setInterval(async()=>{try{await pe.renew(a,ge,{ttlMs:h})||g.abort(new Error("Lease expired"))}catch{g.abort(new Error("Lease renewal failed"))}},H)}st.add(a);let oe;try{let H=null;try{H=await ce.load(a)}catch(r){let n={type:"PERSISTENCE_ERROR",operation:"load",workflowId:a,cause:r,message:`Failed to load state for workflow '${a}': ${r instanceof Error?r.message:String(r)}`};return oe=A(n),A(n)}if(H)try{St(H)}catch(r){if(r instanceof ve){let n={type:"PERSISTENCE_ERROR",operation:"load",workflowId:a,cause:r,message:`Invalid snapshot format for workflow '${a}': ${r.message}`};return oe=A(n),A(n)}throw r}if(H){let r=typeof H.metadata?.version=="number"?H.metadata.version:1;if(r!==p){let n={type:"VERSION_MISMATCH",workflowId:a,storedVersion:r,requestedVersion:p,currentVersion:p,message:`Workflow '${a}' has stored state at version ${r} but this run requested version ${p}. Migrate the stored state to the new version, or clear state for this id (e.g. durable.deleteState(store, '${a}')) and re-run.`};if(!ee)return oe=A(n),A(n);let m=await Promise.resolve(ee({id:a,storedVersion:r,requestedVersion:p}));if(m==="throw")return oe=A(n),A(n);if(m==="clear"){try{await ce.delete(a)}catch{}H=null}else H=m.migratedSnapshot}}let ie=(r,n)=>{ae&&ae(r,n)},te=Le(),c={snapshot:H,onAfterStep:async(r,n,m,T)=>{try{let b=te.getResumeState(),l={};for(let[L,$]of b.steps)if($.result.ok)l[L]={ok:!0,value:$.result.value};else{let I=$.result.cause,z=I instanceof Error?Ge(I):Ze(I),N=$.meta?.origin==="throw"?"throw":"result";l[L]={ok:!1,error:$.result.error,cause:z,meta:{origin:N}}}let _={formatVersion:1,workflowName:a,steps:l,execution:{status:"running",lastUpdated:new Date().toISOString(),currentStepId:r},metadata:{...H?.metadata??{},...Y,version:p,lastStepKey:r}},O=H?Ct(H,_):_;if(O.warnings&&O.warnings.length>0){let L=new Set(Object.keys(_.steps)),$=O.warnings.filter(I=>!L.has(I.stepId));O={...O,warnings:$.length>0?$:void 0}}await ce.save(a,O),ie({type:"persist_success",workflowId:m,stepKey:r,ts:Date.now(),context:T},T)}catch(b){ie({type:"persist_error",workflowId:m,stepKey:r,error:b,ts:Date.now(),context:T},T)}},onEvent:(r,n)=>{te.handleEvent(r),ie(r,n)},onError:d,signal:g&&W?AbortSignal.any([W,g.signal]):g?.signal??W,createContext:C},x;try{x=nt(a,e,c)}catch(r){if(r instanceof ve){let n={type:"PERSISTENCE_ERROR",operation:"load",workflowId:a,cause:r,message:`Invalid snapshot format for workflow '${a}': ${r.message}`};return oe=A(n),A(n)}throw r}let o;try{o=await x.run(t)}catch(r){if(r instanceof ve||r instanceof Ie){let n={type:"PERSISTENCE_ERROR",operation:"load",workflowId:a,cause:r,message:`Invalid snapshot format for workflow '${a}': ${r.message}`};return oe=A(n),A(n)}throw r}if(u!==!1&&g?.signal.aborted){let r=A({type:"LEASE_EXPIRED",workflowId:a,message:`Lease expired for workflow '${a}' during execution. The workflow may have been reclaimed by another process.`});return oe=r,r}if(o.ok){try{await ce.delete(a)}catch(r){let n={type:"PERSISTENCE_ERROR",operation:"delete",workflowId:a,cause:r,message:`Failed to delete state for workflow '${a}': ${r instanceof Error?r.message:String(r)}`};return oe=A(n),A(n)}if(X){let r=`idem:${X}`;try{await ce.save(r,{formatVersion:1,steps:{},execution:{status:"completed",lastUpdated:new Date().toISOString(),completedAt:new Date().toISOString()},metadata:{workflowId:a,idempotencyKey:X,input:K,finalResult:o}})}catch{}}}return oe=o,o}finally{if(st.delete(a),Ee&&(Ee(oe),Me.delete(`idem:${X}`)),ye&&clearInterval(ye),ge!==null&&Dt(ce))try{await ce.release(a,ge)}catch{}}},async clearState(e){let t=e;if(typeof t.clear=="function"){await t.clear();return}let s=100;for(;;){let a=await e.list({limit:s});if(a.length===0)break;let E=a.map(p=>p.id);if(await this.deleteStates(e,E,{continueOnError:!0}),a.length<s)break}},async hasState(e,t){try{return await e.load(t)!==null}catch{return!1}},async deleteState(e,t){try{return await e.delete(t),!0}catch{return!1}},async deleteStates(e,t,s={}){let{concurrency:a=10,continueOnError:E=!0}=s;if(t.length===0)return{deleted:0};let p=[],R=0,h=async u=>{try{await e.delete(u),R++}catch(Y){if(E)p.push({id:u,error:Y});else throw Y}},B=Math.max(1,a);for(let u=0;u<t.length;u+=B){let Y=t.slice(u,u+B);await Promise.all(Y.map(W=>h(W)))}return p.length>0?{deleted:R,errors:p}:{deleted:R}},async listPending(e,t){try{return await e.list(t)}catch{return[]}}};export{sr as durable,tr as isConcurrentExecution,or as isIdempotencyConflict,nr as isLeaseExpired,rr as isPersistenceError,er as isVersionMismatch,Oe as isWorkflowCancelled};
11
- //# sourceMappingURL=durable.js.map