awaitly 1.35.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 +29 -4
  14. package/dist/result.d.ts +29 -4
  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-DGs0tySr.d.cts → types-B8NfNRGX.d.ts} +1078 -1502
  24. package/dist/{run-entry-BOuNyVoO.d.ts → types-BZ2f4MRR.d.cts} +1078 -1502
  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 +3 -168
  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-By77n4Fa.d.ts +0 -15
  75. package/dist/di-OJfsohf-.d.cts +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-4sV7mTqj.d.cts +0 -72
  123. package/dist/guards-BIX05ALH.d.ts +0 -72
  124. package/dist/hitl-DFn4Xa_l.d.cts +0 -468
  125. package/dist/hitl-DU5VpKq7.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-CnvBryQB.d.ts +0 -417
  133. package/dist/index-DEZEf8Fs.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-B-8PjnSR.d.cts +0 -831
  149. package/dist/persistence-entry-D8zRkLiT.d.ts +0 -831
  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-BziYHFkD.d.ts +0 -323
  235. package/dist/types-C5jLEUqY.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,11 +0,0 @@
1
- export { CircuitBreaker, CircuitBreakerConfig, CircuitBreakerStats, CircuitOpenError, CircuitState, circuitBreakerPresets, createCircuitBreaker, isCircuitOpenError } from './circuit-breaker.cjs';
2
- export { CombinedLimiterConfig, ConcurrencyLimiter, ConcurrencyLimiterConfig, ConcurrencyLimiterStats, CostBasedRateLimiter, CostBasedRateLimiterConfig, CostBasedRateLimiterStats, FixedWindowLimiter, FixedWindowLimiterConfig, FixedWindowLimiterStats, QueueFullError, RateLimitExceededError, RateLimiter, RateLimiterConfig, RateLimiterStats, createCombinedLimiter, createConcurrencyLimiter, createCostBasedRateLimiter, createFixedWindowLimiter, createRateLimiter, isQueueFullError, isRateLimitExceededError, rateLimiterPresets } from './ratelimit.cjs';
3
- export { CompensationAction, SagaCompensationError, SagaEvent, SagaResult, SagaStep, SagaStepOptions, SagaWorkflow, SagaWorkflowOptions, createSagaWorkflow, isSagaCompensationError, runSaga } from './saga.cjs';
4
- export { NamedPolicy, Policy, PolicyFactory, PolicyRegistry, StepOptionsBuilder, WithPoliciesOptions, conditionalPolicy, createPolicyApplier, createPolicyBundle, createPolicyRegistry, envPolicy, mergePolicies, retryPolicies, retryPolicy, servicePolicies, stepOptions, timeoutPolicies, timeoutPolicy, withPolicies, withPolicy } from './policies.cjs';
5
- import './run-entry-DGs0tySr.cjs';
6
- import './errors.cjs';
7
- import './tagged-error.cjs';
8
- import './slugs.cjs';
9
- import './persistence-entry-B-8PjnSR.cjs';
10
- import './types-C5jLEUqY.cjs';
11
- import '@standard-schema/spec';
@@ -1,11 +0,0 @@
1
- export { CircuitBreaker, CircuitBreakerConfig, CircuitBreakerStats, CircuitOpenError, CircuitState, circuitBreakerPresets, createCircuitBreaker, isCircuitOpenError } from './circuit-breaker.js';
2
- export { CombinedLimiterConfig, ConcurrencyLimiter, ConcurrencyLimiterConfig, ConcurrencyLimiterStats, CostBasedRateLimiter, CostBasedRateLimiterConfig, CostBasedRateLimiterStats, FixedWindowLimiter, FixedWindowLimiterConfig, FixedWindowLimiterStats, QueueFullError, RateLimitExceededError, RateLimiter, RateLimiterConfig, RateLimiterStats, createCombinedLimiter, createConcurrencyLimiter, createCostBasedRateLimiter, createFixedWindowLimiter, createRateLimiter, isQueueFullError, isRateLimitExceededError, rateLimiterPresets } from './ratelimit.js';
3
- export { CompensationAction, SagaCompensationError, SagaEvent, SagaResult, SagaStep, SagaStepOptions, SagaWorkflow, SagaWorkflowOptions, createSagaWorkflow, isSagaCompensationError, runSaga } from './saga.js';
4
- export { NamedPolicy, Policy, PolicyFactory, PolicyRegistry, StepOptionsBuilder, WithPoliciesOptions, conditionalPolicy, createPolicyApplier, createPolicyBundle, createPolicyRegistry, envPolicy, mergePolicies, retryPolicies, retryPolicy, servicePolicies, stepOptions, timeoutPolicies, timeoutPolicy, withPolicies, withPolicy } from './policies.js';
5
- import './run-entry-BOuNyVoO.js';
6
- import './errors.js';
7
- import './tagged-error.js';
8
- import './slugs.js';
9
- import './persistence-entry-D8zRkLiT.js';
10
- import './types-BziYHFkD.js';
11
- import '@standard-schema/spec';
@@ -1,11 +0,0 @@
1
- var Mt={"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 st(e){return`https://jagreehal.github.io/awaitly/rules/#${e}`}var kr=Object.keys(Mt);var je=class extends Error{_tag};function me(e,t){return class extends je{_tag=e;constructor(n,d){let l=t?.message?t.message(n??{}):e;if(super(l),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:st(t.slug),enumerable:!0,writable:!1,configurable:!1})}if(Object.setPrototypeOf(this,new.target.prototype),n&&typeof n=="object"){let o;if(t?.slug!==void 0){let{_tag:k,name:R,message:g,stack:r,code:w,hint:A,docsUrl:$,...G}=n;o=G}else{let{_tag:k,name:R,message:g,stack:r,...w}=n;o=w}let E=Object.prototype.hasOwnProperty.call(o,"cause"),b=E?o.cause:void 0;E&&delete o.cause;let M=d?.cause!==void 0;if(E&&M)throw new TypeError("TaggedError: cannot provide 'cause' in props when also setting ErrorOptions.cause");Object.assign(this,o),E&&(this.cause=b),M&&(this.cause=d?.cause)}else d?.cause!==void 0&&(this.cause=d.cause)}}}Object.defineProperty(me,Symbol.hasInstance,{value:e=>e instanceof je});(l=>{function e(o){return o instanceof Error}l.isError=e;function t(o){return o instanceof je}l.isTaggedError=t;function n(o,E){let b=o._tag,M=E[b];return M(o)}l.match=n;function d(o,E,b){let M=o._tag,k=E[M];return k?k(o):b(o)}l.matchPartial=d})(me||={});var at=class extends me("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`}){},it=class extends me("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`}){},ut=class extends me("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`:""}`}){},ct=class extends me("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`:""}`}){},lt=class extends me("ValidationError",{message:t=>`ValidationError: Invalid ${t.field} - ${t.reason}`}){},pt=class extends me("NotFoundError",{message:t=>t.id?`NotFoundError: ${t.resource} with id ${t.id} not found`:`NotFoundError: ${t.resource} not found`}){},mt=class extends me("UnauthorizedError",{message:t=>t.reason?`UnauthorizedError: ${t.reason}`:t.action&&t.resource?`UnauthorizedError: Not authorized to ${t.action} ${t.resource}`:"UnauthorizedError: Access denied"}){},dt=class extends me("NetworkError",{message:t=>t.url?`NetworkError: ${t.reason} (${t.url})`:`NetworkError: ${t.reason}`}){},Et=class extends me("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}`}){},_e=class extends me("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 ft(e){return{ok:!0,value:e}}var It=e=>typeof e=="object"&&e!==null&&"ok"in e&&typeof e.ok=="boolean"&&(e.ok?"value"in e:"error"in e),Ke=(e,t)=>{let n={},d=new Map;for(let l of Object.keys(e)){let o=e[l];typeof o=="function"&&(n[l]=(...E)=>{let b=(d.get(l)??0)+1;d.set(l,b);let M=b===1?l:`${l}#${b}`;return t(M,async()=>{let k=await o(...E);return It(k)?k:ft(k)})})}return n};function Ut(e){let t=e.trim().match(/^(\d+(?:\.\d+)?)\s*(ms|s|m|h|d)$/i);if(!t)return;let n=parseFloat(t[1]),d=t[2].toLowerCase();return{_tag:"Duration",millis:n*({ms:1,s:1e3,m:6e4,h:36e5,d:864e5}[d]??1)}}function qe(e){return new _e({cause:e})}function te(e){return{ok:!0,value:e}}function L(e,t){let n=t?.cause;return{ok:!1,error:e,...n!==void 0?{cause:n}:{}}}var gt=e=>e instanceof _e||typeof e=="object"&&e!==null&&"_tag"in e&&e._tag==="UnexpectedError";function Nt(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 n=t._tag.trim();if(n)return n}if(typeof t.tag=="string"){let n=t.tag.trim();if(n)return n}if(typeof t.code=="string"){let n=t.code.trim();if(n)return n}else if(typeof t.code=="number")return String(t.code);if(e instanceof Error&&e.name){let n=e.name.trim();if(n)return n}}return"unknown"}function Wt(e,t){if(!(!t||!e))return t[e]}function Xe(e){let{intent:t,domain:n,owner:d,tags:l,stateChanges:o,emits:E,calls:b}=e;if(!t&&!n&&!d&&!l?.length&&!o?.length&&!E?.length&&!b?.length)return;let M={};return t&&(M.intent=t),n&&(M.domain=n),d&&(M.owner=d),l?.length&&(M.tags=l),o?.length&&(M.stateChanges=o),E?.length&&(M.emits=E),b?.length&&(M.calls=b),M}function we(e,t,n,d,l){let o=Nt(e),E=Wt(o,t),b={tag:o,origin:n};return E!==void 0&&(b.classification=E),d!==void 0&&(b.attempt=d),l!==void 0&&(b.cumulativeDurationMs=l),b}var Ie=Symbol.for("step_timeout_marker");function yt(e){return typeof e!="object"||e===null?!1:e.type==="STEP_TIMEOUT"?!0:Ie in e}function Lt(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(Ie in e)return e[Ie]}}var Tt=Symbol("early-exit");function he(e,t){return{[Tt]:!0,error:e,meta:t}}function xe(e){return typeof e=="object"&&e!==null&&e[Tt]===!0}var Rt=Symbol("mapper-exception");function De(e){return{[Rt]:!0,thrown:e}}function Ft(e){return typeof e=="object"&&e!==null&&e[Rt]===!0}function Qe(e,t){let{backoff:n,initialDelay:d,maxDelay:l,jitter:o}=t,E;switch(n){case"fixed":E=d;break;case"linear":E=d*e;break;case"exponential":E=d*Math.pow(2,e-1);break}if(E=Math.min(E,l),o){let b=E*.25*Math.random();E=E+b}return Math.floor(E)}function Ge(e){return new Promise(t=>setTimeout(t,e))}var wt=Symbol("timeout"),He=Symbol("timeout-option");function jt(e){return typeof e=="object"&&e!==null&&e[He]===!0}async function Kt(e,t,n,d){let l=new AbortController,o=t.onTimeout??"error",E=()=>typeof o=="function"?o({name:n.name,key:n.key,ms:t.ms}):t.error??{type:"STEP_TIMEOUT",stepName:n.name,stepKey:n.key,timeoutMs:t.ms,attempt:n.attempt},b;d?.aborted&&l.abort(d.reason);let M;d&&!d.aborted&&(M=()=>l.abort(d.reason),d.addEventListener("abort",M,{once:!0}));let k=new Promise((g,r)=>{b=setTimeout(()=>{if(o!=="disconnect"&&l.abort(),o==="option"){r({[He]:!0,ms:t.ms});return}r({[wt]:!0,error:E()})},t.ms)}),R;t.signal?R=Promise.resolve(e(l.signal)):R=Promise.resolve(e());try{return await Promise.race([R,k])}catch(g){if(typeof g=="object"&&g!==null&&g[He]===!0)throw{[He]:!0,ms:t.ms};if(typeof g=="object"&&g!==null&&g[wt]===!0){o==="disconnect"&&R.catch(()=>{});let r=g.error;if(typeof r=="object"&&r!==null&&r.type!=="STEP_TIMEOUT"){let w={timeoutMs:t.ms,stepName:n.name,stepKey:n.key,attempt:n.attempt};Ie in r?r[Ie]=w:Object.defineProperty(r,Ie,{value:w,enumerable:!1,writable:!0,configurable:!1})}throw r}throw g}finally{clearTimeout(b),M&&d&&d.removeEventListener("abort",M)}}var Me={backoff:"exponential",initialDelay:100,maxDelay:3e4,jitter:!0,shouldRetry:()=>!0,onRetry:()=>{}};async function Be(e,t,n){if(typeof e!="function"){let h=e,le=t;if(typeof le!="function")throw new TypeError("[awaitly] run(deps, fn) requires a callback as the second argument. Example: run({ getUser }, async (s) => s.getUser(id))");return Be(({step:Re})=>le(Ke(h,Re),{step:Re}),n)}let d=e,l=t,{onError:o,onEvent:E,catchUnexpected:b,workflowId:M,workflowName:k,context:R,_workflowSignal:g}=l&&typeof l=="object"?l:{},r=M??crypto.randomUUID(),w=b??qe,A=[],$=0,G=h=>h??`step_${++$}`,i=h=>{let le=h.context!==void 0||R===void 0?h:{...h,context:R},fe=k!==void 0&&le.workflowName===void 0?{...le,workflowName:k}:le;if(fe.type==="step_success"){let Re=fe.stepId;for(let be=A.length-1;be>=0;be--){let z=A[be];if(z.type==="race"&&!z.winnerId){z.winnerId=Re;break}}}E?.(fe,R)},X=he,de=h=>xe(h),pe=(h,le)=>h,Te=h=>typeof h=="function"?!1:!!(h&&typeof h=="object"&&"ok"in h||h&&typeof h=="object"&&"then"in h&&typeof h.then=="function");try{let le=function(y){let P={};for(let[u,c]of Object.entries(y))if(typeof c=="function")P[u]=c;else if(c&&typeof c=="object"&&"fn"in c)P[u]=c.fn;else throw new TypeError(`step.all: operation "${u}" must be a function or { fn, errors? } object`);return P},fe=function(y,P){let u=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let c=performance.now(),s=!1;A.push({scopeId:u,type:"parallel"});let a=()=>{if(s)return;s=!0;let C=A.findIndex(O=>O.scopeId===u);C!==-1&&A.splice(C,1),i({type:"scope_end",workflowId:r,scopeId:u,ts:Date.now(),durationMs:performance.now()-c})};i({type:"scope_start",workflowId:r,scopeId:u,scopeType:"parallel",name:y,ts:Date.now()});try{let C=await P();if(a(),!C.ok)throw o?.(C.error,y,R),X(C.error,{origin:"result",resultCause:C.cause});return C.value}catch(C){throw a(),C}})()},Re=function(y,P){let u=Object.keys(y),c=P.name??`Parallel(${u.join(", ")})`,s=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let a=performance.now(),C=!1;A.push({scopeId:s,type:"parallel"});let O=()=>{if(C)return;C=!0;let U=A.findIndex(W=>W.scopeId===s);U!==-1&&A.splice(U,1),i({type:"scope_end",workflowId:r,scopeId:s,ts:Date.now(),durationMs:performance.now()-a})};i({type:"scope_start",workflowId:r,scopeId:s,scopeType:"parallel",name:c,ts:Date.now()});try{let U=await new Promise(j=>{if(u.length===0){j([]);return}let H=!1,ne=u.length,B=new Array(u.length);for(let Y=0;Y<u.length;Y++){let V=u[Y],J=Y;Promise.resolve(y[V]()).catch(_=>L({type:"PROMISE_REJECTED",cause:_},{cause:{type:"PROMISE_REJECTION",reason:_}})).then(_=>{if(!H){if(!_.ok){H=!0,j([{key:V,result:_}]);return}B[J]={key:V,result:_},ne--,ne===0&&j(B)}})}});O();let W={};for(let{key:j,result:H}of U){if(!H.ok)throw o?.(H.error,j,R),X(H.error,{origin:"result",resultCause:H.cause});W[j]=H.value}return W}catch(U){throw O(),U}})()};var Pe=le,Oe=fe,Se=Re;let h=(y,P,u)=>(async()=>{if(typeof y!="string"||y.length===0)throw new Error('[awaitly] step() requires an explicit string ID as the first argument. Example: step("fetchUser", () => fetchUser(id))');let c=u??{},s=Xe(c),a=y,C=c.key??y,O=c.key??y,{description:U,retry:W,timeout:j}=c,H=G(C),ne=E,B=ne?performance.now():0,V=Te(P)?()=>P:P,_={attempts:Math.max(1,W?.attempts??1),backoff:W?.backoff??Me.backoff,initialDelay:W?.initialDelay??Me.initialDelay,maxDelay:W?.maxDelay??Me.maxDelay,jitter:W?.jitter??Me.jitter,shouldRetry:W?.shouldRetry??Me.shouldRetry,onRetry:W?.onRetry??Me.onRetry};E&&i({type:"step_start",workflowId:r,stepId:H,stepKey:C,name:a,description:U,ts:Date.now(),...s&&{metadata:s}});let ye;for(let v=1;v<=_.attempts;v++){let x=ne?performance.now():0;try{let p;if(j?p=await Kt(V,j,{name:a,key:C,attempt:v},g):p=await V(),p.ok){let S=performance.now()-B;return i({type:"step_success",workflowId:r,stepId:H,stepKey:C,name:a,description:U,ts:Date.now(),durationMs:S,...s&&{metadata:s}}),O&&i({type:"step_complete",workflowId:r,stepKey:O,name:a,description:U,ts:Date.now(),durationMs:S,result:p,...s&&{metadata:s}}),p.value}if(ye=p,v<_.attempts&&_.shouldRetry(p.error,v)){let S=Qe(v,_);i({type:"step_retry",workflowId:r,stepId:H,stepKey:C,name:a,ts:Date.now(),attempt:v+1,maxAttempts:_.attempts,delayMs:S,error:p.error,...s&&{metadata:s},diagnostics:we(p.error,c.errorMeta,"result",v,performance.now()-B)}),_.onRetry(p.error,v,S),await Ge(S);continue}_.attempts>1&&i({type:"step_retries_exhausted",workflowId:r,stepId:H,stepKey:C,name:a,ts:Date.now(),durationMs:performance.now()-B,attempts:v,lastError:p.error,...s&&{metadata:s},diagnostics:we(p.error,c.errorMeta,"result",v,performance.now()-B)});break}catch(p){let S=performance.now()-x;if(jt(p)){let N=p.ms;i({type:"step_timeout",workflowId:r,stepId:H,stepKey:C,name:a,ts:Date.now(),timeoutMs:N,attempt:v,...s&&{metadata:s},diagnostics:we(p,c.errorMeta,"timeout",v)}),i({type:"step_success",workflowId:r,stepId:H,stepKey:C,name:a,description:U,ts:Date.now(),durationMs:performance.now()-B,...s&&{metadata:s}}),O&&i({type:"step_complete",workflowId:r,stepKey:O,name:a,description:U,ts:Date.now(),durationMs:performance.now()-B,result:te(void 0),...s&&{metadata:s}});return}if(de(p))throw i({type:"step_aborted",workflowId:r,stepId:H,stepKey:C,name:a,description:U,ts:Date.now(),durationMs:S,...s&&{metadata:s}}),p;if(yt(p)){let N=Lt(p),T=j?.ms??N?.timeoutMs??0;if(i({type:"step_timeout",workflowId:r,stepId:H,stepKey:C,name:a,ts:Date.now(),timeoutMs:T,attempt:v,...s&&{metadata:s},diagnostics:we(p,c.errorMeta,"timeout",v)}),v<_.attempts&&_.shouldRetry(p,v)){let Z=Qe(v,_);i({type:"step_retry",workflowId:r,stepId:H,stepKey:C,name:a,ts:Date.now(),attempt:v+1,maxAttempts:_.attempts,delayMs:Z,error:p,...s&&{metadata:s},diagnostics:we(p,c.errorMeta,"timeout",v,performance.now()-B)}),_.onRetry(p,v,Z),await Ge(Z);continue}_.attempts>1&&i({type:"step_retries_exhausted",workflowId:r,stepId:H,stepKey:C,name:a,ts:Date.now(),durationMs:performance.now()-B,attempts:v,lastError:p,...s&&{metadata:s},diagnostics:we(p,c.errorMeta,"timeout",v,performance.now()-B)});let K=performance.now()-B;throw i({type:"step_error",workflowId:r,stepId:H,stepKey:C,name:a,description:U,ts:Date.now(),durationMs:K,error:p,...s&&{metadata:s},diagnostics:we(p,c.errorMeta,"timeout",v,K)}),O&&i({type:"step_complete",workflowId:r,stepKey:O,name:a,description:U,ts:Date.now(),durationMs:K,result:L(p,{cause:p}),meta:{origin:"throw",thrown:p},...s&&{metadata:s}}),o?.(p,a,R),X(p,{origin:"throw",thrown:p})}if(v<_.attempts&&_.shouldRetry(p,v)){let N=Qe(v,_);i({type:"step_retry",workflowId:r,stepId:H,stepKey:C,name:a,ts:Date.now(),attempt:v+1,maxAttempts:_.attempts,delayMs:N,error:p,...s&&{metadata:s},diagnostics:we(p,c.errorMeta,"throw",v,performance.now()-B)}),_.onRetry(p,v,N),await Ge(N);continue}_.attempts>1&&!yt(p)&&i({type:"step_retries_exhausted",workflowId:r,stepId:H,stepKey:C,name:a,ts:Date.now(),durationMs:performance.now()-B,attempts:v,lastError:p,...s&&{metadata:s},diagnostics:we(p,c.errorMeta,"throw",v,performance.now()-B)});let I=performance.now()-B,D;try{D=w(p)}catch(N){throw De(N)}throw i({type:"step_error",workflowId:r,stepId:H,stepKey:C,name:a,description:U,ts:Date.now(),durationMs:I,error:D,...s&&{metadata:s},diagnostics:we(p,c.errorMeta,"throw",v,I)}),O&&i({type:"step_complete",workflowId:r,stepKey:O,name:a,description:U,ts:Date.now(),durationMs:I,result:L(D,{cause:p}),meta:{origin:"throw",thrown:p},...s&&{metadata:s}}),o?.(D,a,R),X(D,{origin:"throw",thrown:p})}}let m=ye,f=performance.now()-B,Q=pe(m.error,{origin:"result",resultCause:m.cause});throw i({type:"step_error",workflowId:r,stepId:H,stepKey:C,name:a,description:U,ts:Date.now(),durationMs:f,error:Q,...s&&{metadata:s},diagnostics:we(m.error,c.errorMeta,"result",_.attempts,f)}),O&&i({type:"step_complete",workflowId:r,stepKey:O,name:a,description:U,ts:Date.now(),durationMs:f,result:m,meta:{origin:"result",resultCause:m.cause},...s&&{metadata:s}}),o?.(Q,a,R),X(Q,{origin:"result",resultCause:m.cause})})();h.try=(y,P,u)=>{if(typeof y!="string"||y.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 c="error"in u?()=>u.error:u.onError;if(u.retry||u.timeout)return h.retry(y,async()=>{try{return te(await P())}catch(U){return L(c(U),{cause:U})}},{attempts:u.retry?.attempts??1,...u.retry??{},key:u.key,timeout:u.timeout});let s=u.key??y,a=y,C=y,O=E;return(async()=>{let U=O?performance.now():0;E&&i({type:"step_start",workflowId:r,stepId:C,stepKey:s,name:a,ts:Date.now()});try{let W=await P(),j=performance.now()-U;return i({type:"step_success",workflowId:r,stepId:C,stepKey:s,name:a,ts:Date.now(),durationMs:j}),s&&i({type:"step_complete",workflowId:r,stepKey:s,name:a,ts:Date.now(),durationMs:j,result:te(W)}),W}catch(W){let j=c(W),H=performance.now()-U,ne=pe(j,{origin:"throw",thrown:W});throw i({type:"step_error",workflowId:r,stepId:C,stepKey:s,name:a,ts:Date.now(),durationMs:H,error:ne}),s&&i({type:"step_complete",workflowId:r,stepKey:s,name:a,ts:Date.now(),durationMs:H,result:L(j,{cause:W}),meta:{origin:"throw",thrown:W}}),o?.(ne,a,R),X(ne,{origin:"throw",thrown:W})}})()},h.fromResult=(y,P,u)=>{if(typeof y!="string"||y.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 c=u.key??y,s=y,a=y,C="error"in u?()=>u.error:u.onError,O=E;return(async()=>{let U=O?performance.now():0;E&&i({type:"step_start",workflowId:r,stepId:a,stepKey:c,name:s,ts:Date.now()});let W=await P();if(W.ok){let j=performance.now()-U;return i({type:"step_success",workflowId:r,stepId:a,stepKey:c,name:s,ts:Date.now(),durationMs:j}),c&&i({type:"step_complete",workflowId:r,stepKey:c,name:s,ts:Date.now(),durationMs:j,result:te(W.value)}),W.value}else{let j=C(W.error),H=performance.now()-U,ne=pe(j,{origin:"result",resultCause:W.error});throw i({type:"step_error",workflowId:r,stepId:a,stepKey:c,name:s,ts:Date.now(),durationMs:H,error:ne}),c&&i({type:"step_complete",workflowId:r,stepKey:c,name:s,ts:Date.now(),durationMs:H,result:L(j,{cause:W.error}),meta:{origin:"result",resultCause:W.error}}),o?.(ne,s,R),X(ne,{origin:"result",resultCause:W.error})}})()},h.fromNullable=(y,P,u,c)=>{if(typeof y!="string"||y.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 h(y,async()=>{let s=await P();return s!=null?te(s):L(u())},c)},h.retry=(y,P,u)=>{if(typeof y!="string"||y.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 h(y,P,{key:u.key??y,retry:{attempts:u.attempts,backoff:u.backoff,initialDelay:u.initialDelay,maxDelay:u.maxDelay,jitter:u.jitter,shouldRetry:u.shouldRetry,onRetry:u.onRetry},timeout:u.timeout})},h.withTimeout=(y,P,u)=>{if(typeof y!="string"||y.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 h(y,P,{key:u.key??y,timeout:u})},h.sleep=(y,P,u)=>{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 c=typeof P=="string"?Ut(P):P;if(!c)throw new Error(`step.sleep: invalid duration '${P}'`);let s=c.millis,a=u?.signal;return h(y,async()=>{if(g?.aborted||a?.aborted){let C=new Error("Sleep aborted");throw C.name="AbortError",C}return new Promise((C,O)=>{let U={timeoutId:void 0},W=()=>{U.timeoutId&&clearTimeout(U.timeoutId);let j=new Error("Sleep aborted");j.name="AbortError",O(j)};g?.addEventListener("abort",W,{once:!0}),a?.addEventListener("abort",W,{once:!0}),U.timeoutId=setTimeout(()=>{g?.removeEventListener("abort",W),a?.removeEventListener("abort",W),C(te(void 0))},s)})},{key:u?.key??y,description:u?.description})},h.all=((...y)=>{if(typeof y[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 P=y[0],u=y[1];if(typeof u=="function")return fe(P,u);if(u&&typeof u=="object"&&!Array.isArray(u)){let s=le(u);return Re(s,{name:P})}throw new TypeError("step.all(name, ...): second argument must be a function (array form) or an object of operations (object form).")}),h.race=(y,P)=>{let u=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let c=performance.now(),s=!1,a={scopeId:u,type:"race",winnerId:void 0};A.push(a);let C=()=>{if(s)return;s=!0;let O=A.findIndex(U=>U.scopeId===u);O!==-1&&A.splice(O,1),i({type:"scope_end",workflowId:r,scopeId:u,ts:Date.now(),durationMs:performance.now()-c,winnerId:a.winnerId})};i({type:"scope_start",workflowId:r,scopeId:u,scopeType:"race",name:y,ts:Date.now()});try{let O=await P();if(C(),!O.ok)throw o?.(O.error,y,R),X(O.error,{origin:"result",resultCause:O.cause});return O.value}catch(O){throw C(),O}})()},h.if=(y,P,u)=>u(),h.label=h.if,h.branch=async(y,P)=>{let{condition:u,then:c,else:s}=P;if(u())return await c();if(s)return await s()},h.arm=(y,P)=>({fn:y,errors:P}),h.forEach=async(y,P,u)=>{let c=[],s=u.maxIterations,a=0,C="run"in u,O=Symbol.asyncIterator in P?P:(async function*(){yield*P})();for await(let U of O){if(s!==void 0&&a>=s)break;let W;C?W=await u.run(U,a):W=await u.item.handler(U,a,h),c.push(W),a++}return c},h.item=y=>({__forEachItemHandler:!0,handler:y}),h.dep=(y,P)=>P,h.workflow=(y,P,u)=>h(y,P,u),h.map=async(y,P,u,c)=>{let s=c?.concurrency??P.length;return h(y,()=>s>=P.length?kt(P.map((a,C)=>u(a,C))):(async()=>{let a=[];for(let C=0;C<P.length;C+=s){let O=P.slice(C,C+s),U=await kt(O.map((W,j)=>u(W,C+j)));if(!U.ok)return U;a.push(...U.value)}return te(a)})(),{key:c?.key})},h.withFallback=(y,P,u)=>{if(typeof y!="string"||y.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 c=u.key??y,s=y,a=G(c),C=E;return(async()=>{let O=C?performance.now():0;E&&i({type:"step_start",workflowId:r,stepId:a,stepKey:c,name:s,ts:Date.now()});let U;try{U=await P()}catch(B){if(de(B))throw i({type:"step_aborted",workflowId:r,stepId:a,stepKey:c,name:s,ts:Date.now(),durationMs:performance.now()-O}),B;let Y;try{Y=w(B)}catch(J){throw De(J)}if(u.on!==void 0&&u.on!==Y){let J=performance.now()-O;throw i({type:"step_error",workflowId:r,stepId:a,stepKey:c,name:s,ts:Date.now(),durationMs:J,error:Y}),c&&i({type:"step_complete",workflowId:r,stepKey:c,name:s,ts:Date.now(),durationMs:J,result:L(Y,{cause:B}),meta:{origin:"throw",thrown:B}}),o?.(Y,s,R),X(Y,{origin:"throw",thrown:B})}let V;try{V=await u.fallback()}catch(J){if(de(J))throw i({type:"step_aborted",workflowId:r,stepId:a,stepKey:c,name:s,ts:Date.now(),durationMs:performance.now()-O}),J;let _;try{_=w(J)}catch(m){throw De(m)}let ye=performance.now()-O;throw i({type:"step_error",workflowId:r,stepId:a,stepKey:c,name:s,ts:Date.now(),durationMs:ye,error:_}),c&&i({type:"step_complete",workflowId:r,stepKey:c,name:s,ts:Date.now(),durationMs:ye,result:L(_,{cause:J}),meta:{origin:"throw",thrown:J}}),o?.(_,s,R),X(_,{origin:"throw",thrown:J})}if(V.ok){let J=performance.now()-O;return i({type:"step_success",workflowId:r,stepId:a,stepKey:c,name:s,ts:Date.now(),durationMs:J}),c&&i({type:"step_complete",workflowId:r,stepKey:c,name:s,ts:Date.now(),durationMs:J,result:V,meta:{origin:"fallback",fallbackUsed:!0,fallbackReason:String(Y)}}),V.value}else{let J=performance.now()-O,_=pe(V.error,{origin:"result",resultCause:V.cause});throw i({type:"step_error",workflowId:r,stepId:a,stepKey:c,name:s,ts:Date.now(),durationMs:J,error:_}),c&&i({type:"step_complete",workflowId:r,stepKey:c,name:s,ts:Date.now(),durationMs:J,result:V,meta:{origin:"result",resultCause:V.cause}}),o?.(_,s,R),X(_,{origin:"result",resultCause:V.cause})}}if(U.ok){let B=performance.now()-O;return i({type:"step_success",workflowId:r,stepId:a,stepKey:c,name:s,ts:Date.now(),durationMs:B}),c&&i({type:"step_complete",workflowId:r,stepKey:c,name:s,ts:Date.now(),durationMs:B,result:U}),U.value}let W=U.error;if(u.on!==void 0&&u.on!==W){let B=performance.now()-O,Y=pe(W,{origin:"result",resultCause:U.cause});throw i({type:"step_error",workflowId:r,stepId:a,stepKey:c,name:s,ts:Date.now(),durationMs:B,error:Y}),c&&i({type:"step_complete",workflowId:r,stepKey:c,name:s,ts:Date.now(),durationMs:B,result:U,meta:{origin:"result",resultCause:U.cause}}),o?.(Y,s,R),X(Y,{origin:"result",resultCause:U.cause})}let j;try{j=await u.fallback()}catch(B){if(de(B))throw i({type:"step_aborted",workflowId:r,stepId:a,stepKey:c,name:s,ts:Date.now(),durationMs:performance.now()-O}),B;let Y;try{Y=w(B)}catch(J){throw De(J)}let V=performance.now()-O;throw i({type:"step_error",workflowId:r,stepId:a,stepKey:c,name:s,ts:Date.now(),durationMs:V,error:Y}),c&&i({type:"step_complete",workflowId:r,stepKey:c,name:s,ts:Date.now(),durationMs:V,result:L(Y,{cause:B}),meta:{origin:"throw",thrown:B}}),o?.(Y,s,R),X(Y,{origin:"throw",thrown:B})}if(j.ok){let B=performance.now()-O;return i({type:"step_success",workflowId:r,stepId:a,stepKey:c,name:s,ts:Date.now(),durationMs:B}),c&&i({type:"step_complete",workflowId:r,stepKey:c,name:s,ts:Date.now(),durationMs:B,result:j,meta:{origin:"fallback",fallbackUsed:!0,fallbackReason:String(W)}}),j.value}let H=performance.now()-O,ne=pe(j.error,{origin:"result",resultCause:j.cause});throw i({type:"step_error",workflowId:r,stepId:a,stepKey:c,name:s,ts:Date.now(),durationMs:H,error:ne}),c&&i({type:"step_complete",workflowId:r,stepKey:c,name:s,ts:Date.now(),durationMs:H,result:j,meta:{origin:"result",resultCause:j.cause}}),o?.(ne,s,R),X(ne,{origin:"result",resultCause:j.cause})})()},h.withResource=(y,P)=>{if(typeof y!="string"||y.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 u=y,c=y,s=G(u),a=E;return(async()=>{let C=a?performance.now():0;E&&i({type:"step_start",workflowId:r,stepId:s,stepKey:u,name:c,ts:Date.now()});let O;try{O=await P.acquire()}catch(V){if(de(V))throw i({type:"step_aborted",workflowId:r,stepId:s,stepKey:u,name:c,ts:Date.now(),durationMs:performance.now()-C}),V;let J;try{J=w(V)}catch(ye){throw De(ye)}let _=performance.now()-C;throw i({type:"step_error",workflowId:r,stepId:s,stepKey:u,name:c,ts:Date.now(),durationMs:_,error:J}),u&&i({type:"step_complete",workflowId:r,stepKey:u,name:c,ts:Date.now(),durationMs:_,result:L(J,{cause:V}),meta:{origin:"throw",thrown:V}}),o?.(J,c,R),X(J,{origin:"throw",thrown:V})}if(!O.ok){let V=performance.now()-C,J=pe(O.error,{origin:"result",resultCause:O.cause});throw i({type:"step_error",workflowId:r,stepId:s,stepKey:u,name:c,ts:Date.now(),durationMs:V,error:J}),u&&i({type:"step_complete",workflowId:r,stepKey:u,name:c,ts:Date.now(),durationMs:V,result:O,meta:{origin:"result",resultCause:O.cause}}),o?.(J,c,R),X(J,{origin:"result",resultCause:O.cause})}let U=O.value,W,j,H=!1;try{W=await P.use(U)}catch(V){if(de(V)){try{await P.release(U)}catch(J){console.warn(`[awaitly] step.withResource("${y}"): release threw after earlyExit:`,J)}throw V}j=V,H=!0}try{await P.release(U)}catch(V){console.warn(`[awaitly] step.withResource("${y}"): release threw:`,V)}if(H){let V;try{V=w(j)}catch(_){throw De(_)}let J=performance.now()-C;throw i({type:"step_error",workflowId:r,stepId:s,stepKey:u,name:c,ts:Date.now(),durationMs:J,error:V}),u&&i({type:"step_complete",workflowId:r,stepKey:u,name:c,ts:Date.now(),durationMs:J,result:L(V,{cause:j}),meta:{origin:"throw",thrown:j}}),o?.(V,c,R),X(V,{origin:"throw",thrown:j})}let ne=W;if(ne.ok){let V=performance.now()-C;return i({type:"step_success",workflowId:r,stepId:s,stepKey:u,name:c,ts:Date.now(),durationMs:V}),u&&i({type:"step_complete",workflowId:r,stepKey:u,name:c,ts:Date.now(),durationMs:V,result:ne}),ne.value}let B=performance.now()-C,Y=pe(ne.error,{origin:"result",resultCause:ne.cause});throw i({type:"step_error",workflowId:r,stepId:s,stepKey:u,name:c,ts:Date.now(),durationMs:B,error:Y}),u&&i({type:"step_complete",workflowId:r,stepKey:u,name:c,ts:Date.now(),durationMs:B,result:ne,meta:{origin:"result",resultCause:ne.cause}}),o?.(Y,c,R),X(Y,{origin:"result",resultCause:ne.cause})})()};let z=await d({step:h});if(process.env.NODE_ENV!=="production"&&z!==null&&typeof z=="object"&&"ok"in z&&typeof z.ok=="boolean"){let y=z;(y.ok===!0&&"value"in y||y.ok===!1&&"error"in y)&&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 te(z)}catch(h){if(Ft(h))throw h.thrown;if(de(h)){let fe=h.meta.origin==="throw"?h.meta.thrown:h.meta.origin==="result"?h.meta.resultCause:void 0;return L(h.error,{cause:fe})}let le=w(h);return o?.(le,"unexpected",R),L(le,{cause:h})}}Be.strict=(e,t)=>Be(e,t);async function kt(e){return e.length===0?te([]):new Promise(t=>{let n=!1,d=e.length,l=new Array(e.length);for(let o=0;o<e.length;o++){let E=o;Promise.resolve(e[E]).catch(b=>L({type:"PROMISE_REJECTED",cause:b},{cause:{type:"PROMISE_REJECTION",reason:b}})).then(b=>{if(!n){if(!b.ok){n=!0,t(b);return}l[E]=b.value,d--,d===0&&t(te(l))}})}})}var Ve=class extends Error{type="CIRCUIT_OPEN";circuitName;state;retryAfterMs;constructor(t){super(t.message??`Circuit breaker "${t.circuitName}" is ${t.state}. Retry after ${Math.ceil(t.retryAfterMs/1e3)}s`),this.name="CircuitOpenError",this.circuitName=t.circuitName,this.state=t.state,this.retryAfterMs=t.retryAfterMs}};function Bt(e){return typeof e=="object"&&e!==null&&e.type==="CIRCUIT_OPEN"}var Vt={failureThreshold:5,resetTimeout:3e4,windowSize:6e4,halfOpenMax:3};function $t(e,t){let n={...Vt,...t},d="CLOSED",l=[],o=null,E=null,b=0,M=0;function k(){let $=Date.now();l=l.filter(G=>$-G.timestamp<n.windowSize)}function R($){if(d!==$){let G=d;d=$,$==="HALF_OPEN"&&(M=0),n.onStateChange?.(G,$,e)}}function g(){return d!=="OPEN"||o===null?!1:Date.now()-o>=n.resetTimeout?(R("HALF_OPEN"),!0):!1}function r(){E=Date.now(),b++,d==="HALF_OPEN"&&(M++,M>=n.halfOpenMax&&(R("CLOSED"),l=[]))}function w($){let G=Date.now();o=G,k(),l.push({timestamp:G,error:$}),(d==="HALF_OPEN"||d==="CLOSED"&&l.length>=n.failureThreshold)&&R("OPEN")}function A(){if(d==="CLOSED")return 0;if(d==="OPEN"){if(g())return 0;let $=Date.now(),G=o?$-o:0;return Math.max(0,n.resetTimeout-G)}return 0}return{async execute($,G){let i=A();if(i>0)throw new Ve({circuitName:e,state:d,retryAfterMs:i});try{let X=await $();return r(),X}catch(X){throw w(X),X}},async executeResult($,G){let i=A();if(i>0)return L(new Ve({circuitName:e,state:d,retryAfterMs:i}));try{let X=await $();return X.ok?r():w(X.error),X}catch(X){throw w(X),X}},getState(){return d==="OPEN"&&g(),d},getStats(){return k(),{state:this.getState(),failureCount:l.length,successCount:b,lastFailureTime:o,lastSuccessTime:E,halfOpenSuccesses:M}},reset(){R("CLOSED"),l=[],M=0},forceOpen(){o=Date.now(),R("OPEN")},recordSuccess(){r()},recordFailure($){w($??new Error("Manual failure"))}}}var Ht={critical:{failureThreshold:3,resetTimeout:6e4,windowSize:3e4,halfOpenMax:1},standard:{failureThreshold:5,resetTimeout:3e4,windowSize:6e4,halfOpenMax:3},lenient:{failureThreshold:10,resetTimeout:15e3,windowSize:12e4,halfOpenMax:5}};function qt(e){return typeof e=="object"&&e!==null&&e.type==="RATE_LIMIT_EXCEEDED"}function xt(e){return typeof e=="object"&&e!==null&&e.type==="QUEUE_FULL"}function Ct(e,t){let{maxPerSecond:n,strategy:d="wait"}=t,l=t.burstCapacity??n*2,o=l,E=Date.now(),b=n/1e3,M=[];function k(){let r=Date.now(),A=(r-E)*b;o=Math.min(l,o+A),E=r}function R(){if(k(),o>=1)return o-=1,0;let r=1-o;return Math.ceil(r/b)}async function g(){return new Promise(r=>{let w=()=>{let A=R();A===0?r():(M.push(w),setTimeout(()=>{let $=M.indexOf(w);$!==-1&&(M.splice($,1),w())},A))};w()})}return{async execute(r){let w=R();if(w>0){if(d==="reject")throw{type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:w};await g()}return r()},async executeResult(r){let w=R();if(w>0){if(d==="reject")return L({type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:w});await g()}return r()},getStats(){return k(),{availableTokens:Math.floor(o),maxTokens:l,tokensPerSecond:n,waitingCount:M.length}},reset(){o=l,E=Date.now(),M.length=0}}}function ht(e,t){let{maxConcurrent:n,strategy:d="queue",maxQueueSize:l=1/0}=t,o=0,E=[];async function b(){if(o<n){o++;return}if(d==="reject")throw{type:"QUEUE_FULL",limiterName:e,queueSize:E.length,maxQueueSize:l};if(E.length>=l)throw{type:"QUEUE_FULL",limiterName:e,queueSize:E.length,maxQueueSize:l};return new Promise((k,R)=>{E.push({resolve:k,reject:R})})}function M(){o--,E.length>0&&o<n&&(o++,E.shift()?.resolve())}return{async execute(k){await b();try{return await k()}finally{M()}},async executeAll(k){let R=new Array(k.length),g=[];for(let r=0;r<k.length;r++){let w=r,A=this.execute(k[w]).then($=>{R[w]=$});g.push(A)}return await Promise.all(g),R},async executeResult(k){try{await b()}catch(R){if(xt(R))return L(R);throw R}try{return await k()}finally{M()}},getStats(){return{activeCount:o,maxConcurrent:n,queueSize:E.length,maxQueueSize:l}},reset(){for(o=0;E.length>0;)E.shift()?.reject(new Error("Limiter reset"))}}}function zt(e,t){let n=t.rate?Ct(`${e}-rate`,t.rate):void 0,d=t.concurrency?ht(`${e}-concurrency`,t.concurrency):void 0;return{rate:n,concurrency:d,async execute(l){let o=l;if(n){let E=o;o=()=>n.execute(E)}return d?d.execute(o):o()}}}function Jt(e,t){let{limit:n,windowMs:d=1e3,strategy:l="wait"}=t,o=Date.now(),E=0,b=[];function M(){let g=Date.now(),r=g-o;return r>=d?(o=g,E=0,0):d-r}function k(g){let r=M();return E+g<=n?(E+=g,0):r}async function R(g){return new Promise(r=>{let w=()=>{let A=k(g);A===0?r():(b.push({resolve:w,cost:g}),setTimeout(()=>{let $=b.findIndex(G=>G.resolve===w);$!==-1&&(b.splice($,1),w())},A))};w()})}return{async execute(g,r=1){if(r>n)throw{type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:d};let w=k(r);if(w>0){if(l==="reject")throw{type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:w};await R(r)}return g()},async executeResult(g,r=1){if(r>n)return L({type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:d});let w=k(r);if(w>0){if(l==="reject")return L({type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:w});await R(r)}return g()},getStats(){let g=M();return{requestCount:E,limit:n,windowMs:d,remainingMs:g,waitingCount:b.length}},reset(){o=Date.now(),E=0,b.length=0}}}function Yt(e,t){let{tokensPerSecond:n,strategy:d="wait"}=t,l=t.maxTokens??n*2,o=l,E=Date.now(),b=n/1e3,M=[];function k(){let r=Date.now(),A=(r-E)*b;o=Math.min(l,o+A),E=r}function R(r){if(k(),o>=r)return o-=r,0;let w=r-o;return Math.ceil(w/b)}async function g(r){return new Promise(w=>{let A=()=>{let $=R(r);$===0?w():(M.push({check:A,cost:r}),setTimeout(()=>{let G=M.findIndex(i=>i.check===A);G!==-1&&(M.splice(G,1),A())},$))};A()})}return{async execute(r,w=1){if(w>l)throw{type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:Math.ceil(w/b)};let A=R(w);if(A>0){if(d==="reject")throw{type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:A};await g(w)}return r()},async executeResult(r,w=1){if(w>l)return L({type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:Math.ceil(w/b)});let A=R(w);if(A>0){if(d==="reject")return L({type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:A});await g(w)}return r()},getStats(){return k(),{availableTokens:o,maxTokens:l,tokensPerSecond:n,waitingCount:M.length}},reset(){o=l,E=Date.now(),M.length=0}}}var Qt={api:{maxPerSecond:10,burstCapacity:20,strategy:"wait"},database:{maxConcurrent:10,strategy:"queue",maxQueueSize:100},external:{maxPerSecond:5,burstCapacity:10,strategy:"wait"}};var Gt="STREAM_WRITE_ERROR",Xt="STREAM_READ_ERROR",Zt="STREAM_CLOSE_ERROR";var er="STREAM_ENDED";function ze(e,t,n){return{type:Gt,reason:e,message:t,...n!==void 0?{cause:n}:{}}}function Ze(e,t,n){return{type:Xt,reason:e,message:t,...n!==void 0?{cause:n}:{}}}function et(e,t,n){return{type:Zt,reason:e,message:t,...n!==void 0?{cause:n}:{}}}function Je(e){return{type:er,finalPosition:e}}function St(e={}){let t=e.highWaterMark??16,n=e.lowWaterMark??Math.floor(t/2),d=e.onStateChange,l="flowing",o=0,E=[];function b(k){if(l!==k&&(l=k,d?.(k),k==="flowing"&&E.length>0)){let R=E;E=[];for(let g of R)g()}}function M(){l==="flowing"&&o>=t?b("paused"):l==="paused"&&o<=n&&b("flowing")}return{get state(){return l},get bufferedCount(){return o},get highWaterMark(){return t},get lowWaterMark(){return n},increment(){o++,M()},decrement(){o>0&&(o--,M())},setCount(k){o=Math.max(0,k),M()},waitForDrain(){return l==="flowing"?Promise.resolve():new Promise(k=>{E.push(k)})},reset(){o=0,E=[],b("flowing")}}}function tr(e){return{_tag:"Duration",millis:e}}function rr(e){return{_tag:"Duration",millis:e*1e3}}function nr(e){return{_tag:"Duration",millis:e*60*1e3}}function or(e){return{_tag:"Duration",millis:e*60*60*1e3}}function sr(e){return{_tag:"Duration",millis:e*24*60*60*1e3}}function bt(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 n=parseFloat(t[1]);switch(t[2].toLowerCase()){case"ms":return tr(n);case"s":return rr(n);case"m":return nr(n);case"h":return or(n);case"d":return sr(n);default:return}}function vt(e){return e.type==="step_complete"}function tt(e){return typeof e=="object"&&e!==null&&e.type==="WORKFLOW_CANCELLED"}function Pt(){let e=new Map;return{handleEvent:t=>{vt(t)&&e.set(t.stepKey,{result:t.result,meta:t.meta})},getResumeState:()=>({steps:new Map(e)}),clear:()=>e.clear()}}function ar(e){return typeof e=="object"&&e!==null&&e.__cachedMeta===!0}function ve(e,t,n){return L(e,{cause:{__cachedMeta:!0,originalCause:n,meta:t}})}function $e(e){return ar(e)?e.meta:{origin:"result",resultCause:e}}async function Ot(e,t){let n=e["~standard"].validate(t),d=n instanceof Promise?await n:n;return d.issues?L({type:"INPUT_VALIDATION_ERROR",issues:d.issues.map(l=>({message:l.message,path:l.path?.map(o=>typeof o=="object"?o.key:o)})),message:`Input validation failed: ${d.issues.map(l=>l.message).join(", ")}`}):te(d.value)}function rt(e,t){let n=d=>((...l)=>{let o=l.at(-1),E=l.length>0&&typeof o=="object"&&o!==null&&!Array.isArray(o)&&typeof o!="function",b=E?o:void 0,M=E?l.slice(0,-1):l,k={...t,...b?.deps??{}},R=b?{...b,deps:k}:{deps:k};return e[d](...M,R)});return{run:n("run"),runWithState:n("runWithState"),withDeps(d){return rt(e,{...t,...d})}}}var Ye=class extends Error{constructor(n,d,l){super(n);this.stepId=d;this.originalError=l;this.name="SnapshotDecodeError"}stepId;originalError};function nt(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=nt(e.cause)),t}return e.value!==void 0?e.value:e.stringRepresentation}function _t(e,t,n){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 d=t??{},l=n;async function o(k,R,g){let r=k??crypto.randomUUID(),w=g?.deps?{...d,...g.deps}:d,A=[],$=g?.createContext??l?.createContext,G=$?await $():void 0,i=g?.signal??l?.signal,X=g?.onEvent??l?.onEvent,de=g?.onError??l?.onError,pe=g?.shouldRun??l?.shouldRun,Te=g?.onBeforeStart??l?.onBeforeStart,Pe=g?.onAfterStep??l?.onAfterStep,Oe=g?.resumeState??l?.resumeState,Se=l?.catchUnexpected??qe,h={},le=(g?.devWarnings??l?.devWarnings)===!0&&process.env.NODE_ENV!=="production",fe=new Set,Re=new Set,be={workflowId:r,onEvent:X,context:G!==void 0?G:void 0,signal:i,input:{},ref:m=>h[m],set:(m,f)=>{le&&!fe.has(m)&&(fe.add(m),console.warn(`awaitly: ctx.set('${m}', ...) is deprecated for static analysis. Use step('id', fn, { out: '${m}' }) instead.`)),h[m]=f},get:m=>(le&&!Re.has(m)&&(Re.add(m),console.warn(`awaitly: ctx.get('${m}') is deprecated for static analysis. Use ctx.ref('${m}') instead for tracked dependencies.`)),h[m])},z=m=>{let f=m.context!==void 0||G===void 0?m:{...m,context:G},Q=f.workflowName===void 0?{...f,workflowName:e}:f;X?.(Q,G)},y=(m,f)=>{let Q={type:"WORKFLOW_CANCELLED",reason:m,lastStepKey:f};return L(Se(Q),{cause:Q})};if(i?.aborted){let m=typeof i.reason=="string"?i.reason:i.reason instanceof Error?i.reason.message:void 0;return z({type:"workflow_cancelled",workflowId:r,ts:Date.now(),durationMs:0,reason:m}),y(m)}if(pe){let m=performance.now();try{let f=await pe(r,G),Q=performance.now()-m;if(z({type:"hook_should_run",workflowId:r,ts:Date.now(),durationMs:Q,result:f,skipped:!f}),!f){let v=new Error("Workflow skipped by shouldRun hook");return L(Se(v),{cause:v})}}catch(f){let Q=performance.now()-m;return z({type:"hook_should_run_error",workflowId:r,ts:Date.now(),durationMs:Q,error:f}),L(Se(f),{cause:f})}}if(Te){let m=performance.now();try{let f=await Te(r,G),Q=performance.now()-m;if(z({type:"hook_before_start",workflowId:r,ts:Date.now(),durationMs:Q,result:f,skipped:!f}),!f){let v=new Error("Workflow skipped by onBeforeStart hook");return L(Se(v),{cause:v})}}catch(f){let Q=performance.now()-m;return z({type:"hook_before_start_error",workflowId:r,ts:Date.now(),durationMs:Q,error:f}),L(Se(f),{cause:f})}}let P=l?.inputSchema,u=l?.input;if(P){let m=await Ot(P,u);if(!m.ok)return L(m.error);be.input=m.value}else u!==void 0&&(be.input=u);let c=Date.now(),s=performance.now();z({type:"workflow_start",workflowId:r,ts:c});let a=g?.cache??l?.cache,C=g?.streamStore??l?.streamStore;if(Oe&&!a&&(a=new Map),Oe&&a){let m=typeof Oe=="function"?await Oe():Oe;m.steps instanceof Map||(console.warn(`awaitly: resumeState.steps is not a Map (got ${typeof m.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 m.steps=="object"&&m.steps!==null&&(m.steps=new Map(Object.entries(m.steps))));for(let[f,Q]of m.steps){let{result:v,meta:x}=Q;if(v.ok)a.set(f,v);else{let p=x??{origin:"result",resultCause:v.cause};a.set(f,ve(v.error,p,v.cause))}}}let O=g?.snapshot??l?.snapshot,U=l?.serialization;if(O&&!Oe){a||(a=new Map);let m=O,f=U?.decode;for(let[Q,v]of Object.entries(m.steps))if(Object.prototype.hasOwnProperty.call(m.steps,Q))try{if(v.ok){let x=f?f(v.value):v.value;a.set(Q,te(x))}else{let x=f?f(v.error):v.error,p=nt(v.cause),S=v.meta?.origin==="throw"?{origin:"throw",thrown:p}:{origin:"result",resultCause:p};a.set(Q,ve(x,S,p))}}catch(x){throw new Ye(`Failed to decode step "${Q}": ${x instanceof Error?x.message:String(x)}`,Q,x instanceof Error?x:void 0)}}let W=!1,j,H,ne=()=>{W=!0,j=typeof i?.reason=="string"?i.reason:i?.reason instanceof Error?i.reason.message:void 0};i&&!i.aborted&&i.addEventListener("abort",ne,{once:!0});let B=()=>{if(W||i?.aborted)throw{type:"WORKFLOW_CANCELLED",reason:j??(typeof i?.reason=="string"?i.reason:i?.reason instanceof Error?i.reason.message:void 0),lastStepKey:H}},Y=async(m,f,Q)=>{if(!Pe)return;let v=performance.now();try{await Pe(m,f,r,G);let x=performance.now()-v;z({type:"hook_after_step",workflowId:r,stepKey:m,ts:Date.now(),durationMs:x})}catch(x){let p=performance.now()-v;throw z({type:"hook_after_step_error",workflowId:r,stepKey:m,ts:Date.now(),durationMs:p,error:x}),x}},V=m=>{let f=async(x,p,S)=>{if(typeof x!="string")throw new Error('[awaitly] step() requires a string ID as the first argument. Example: step("fetchUser", () => fetchUser(id))');let I=x,D=S??{},N=I,T=Object.prototype.hasOwnProperty.call(D,"key")?D.key:I,{ttl:K,out:Z}=D;B();let re=Xe(D);if(T&&a&&a.has(T)){z({type:"step_cache_hit",workflowId:r,stepKey:T,name:N,ts:Date.now(),...re&&{metadata:re}});let F=a.get(T);if(F.ok)return H=T,Z&&(h[Z]=F.value),F.value;let q=$e(F.cause);throw he(F.error,q)}T&&a&&z({type:"step_cache_miss",workflowId:r,stepKey:T,name:N,ts:Date.now(),...re&&{metadata:re}});try{let F=await m(I,p,D);return Z&&(h[Z]=F),D.compensate&&A.push({stepName:N,value:F,compensate:D.compensate}),T&&(H=T,a&&a.set(T,te(F),K?{ttl:K}:void 0),await Y(T,te(F))),F}catch(F){if(T&&xe(F)){let q=F,ae=q.meta.origin==="result"?q.meta.resultCause:q.meta.origin==="throw"?q.meta.thrown:void 0,ee=ve(q.error,q.meta,ae);a&&a.set(T,ee,K?{ttl:K}:void 0),await Y(T,ee,q.meta)}throw F}};f.try=async(x,p,S)=>{let{ttl:I}=S,D=S.key??x,N=x;if(a&&a.has(D)){z({type:"step_cache_hit",workflowId:r,stepKey:D,name:N,ts:Date.now()});let T=a.get(D);if(T.ok)return T.value;let K=$e(T.cause);throw he(T.error,K)}a&&z({type:"step_cache_miss",workflowId:r,stepKey:D,name:N,ts:Date.now()});try{let T=await m.try(x,p,{...S,key:D});return S.compensate&&A.push({stepName:N,value:T,compensate:S.compensate}),a&&a.set(D,te(T),I?{ttl:I}:void 0),await Y(D,te(T)),T}catch(T){if(xe(T)){let K=T,Z=K.meta.origin==="result"?K.meta.resultCause:K.meta.origin==="throw"?K.meta.thrown:void 0,re=ve(K.error,K.meta,Z);a&&a.set(D,re,I?{ttl:I}:void 0),await Y(D,re,K.meta)}throw T}},f.fromResult=async(x,p,S)=>{let{ttl:I}=S,D=S.key??x,N=x;if(a&&a.has(D)){z({type:"step_cache_hit",workflowId:r,stepKey:D,name:N,ts:Date.now()});let T=a.get(D);if(T.ok)return T.value;let K=$e(T.cause);throw he(T.error,K)}a&&z({type:"step_cache_miss",workflowId:r,stepKey:D,name:N,ts:Date.now()});try{let T=await m.fromResult(x,p,{...S,key:D});return a&&a.set(D,te(T),I?{ttl:I}:void 0),await Y(D,te(T)),T}catch(T){if(xe(T)){let K=T,Z=K.meta.origin==="result"?K.meta.resultCause:K.meta.origin==="throw"?K.meta.thrown:void 0,re=ve(K.error,K.meta,Z);a&&a.set(D,re,I?{ttl:I}:void 0),await Y(D,re,K.meta)}throw T}},f.race=m.race,f.withFallback=async(x,p,S)=>{let I=S.key??x,D=x;if(a&&a.has(I)){z({type:"step_cache_hit",workflowId:r,stepKey:I,name:D,ts:Date.now()});let N=a.get(I);if(N.ok)return N.value;let T=$e(N.cause);throw he(N.error,T)}a&&z({type:"step_cache_miss",workflowId:r,stepKey:I,name:D,ts:Date.now()});try{let N=await m.withFallback(x,p,S);return a&&a.set(I,te(N)),await Y(I,te(N)),N}catch(N){if(xe(N)){let T=N,K=T.meta.origin==="result"?T.meta.resultCause:T.meta.origin==="throw"?T.meta.thrown:void 0,Z=ve(T.error,T.meta,K);a&&a.set(I,Z),await Y(I,Z,T.meta)}throw N}},f.withResource=async(x,p)=>{let S=x;try{let I=await m.withResource(x,p);return await Y(S,te(I)),I}catch(I){if(xe(I)){let D=I,N=D.meta.origin==="result"?D.meta.resultCause:D.meta.origin==="throw"?D.meta.thrown:void 0,T=ve(D.error,D.meta,N);await Y(S,T,D.meta)}throw I}},f.retry=(x,p,S)=>{let I={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 f(x,p,I)},f.withTimeout=(x,p,S)=>{let I={key:S.key,timeout:S,ttl:S.ttl};return f(x,p,I)},f.sleep=(x,p,S)=>{if(typeof x!="string"||x.length===0)throw new Error('[awaitly] step.sleep() requires an explicit string ID as the first argument. Example: step.sleep("delay", "5s")');let I=typeof p=="string"?At(p):p;if(!I)throw new Error(`step.sleep: invalid duration '${p}'`);let D=bt(I),N=S?.signal;return f(x,async()=>{if(i?.aborted||N?.aborted){let K=new Error("Sleep aborted");throw K.name="AbortError",K}return new Promise((K,Z)=>{let re={timeoutId:void 0},F=()=>{re.timeoutId&&clearTimeout(re.timeoutId);let q=new Error("Sleep aborted");q.name="AbortError",Z(q)};i?.addEventListener("abort",F,{once:!0}),N?.addEventListener("abort",F,{once:!0}),re.timeoutId=setTimeout(()=>{i?.removeEventListener("abort",F),N?.removeEventListener("abort",F),K(te(void 0))},D)})},{key:S?.key,ttl:S?.ttl,description:S?.description})};let Q=new Map,v=new Map;return f.getWritable=x=>{let p=x?.namespace??"default",S=x?.highWaterMark??16;if(!C)throw new Error("streamStore is required to use getWritable(). Pass a streamStore to createWorkflow options.");let I=`${r}:${p}`,D=Q.get(I);if(D&&!D.closed&&!D.aborted)return D.writer;let N=St({highWaterMark:S,onStateChange:q=>{z({type:"stream_backpressure",workflowId:r,namespace:p,bufferedCount:N.bufferedCount,state:q,ts:Date.now()})}}),T=0,K=!0,Z=!1,re=!1;z({type:"stream_created",workflowId:r,namespace:p,ts:Date.now()});let F={async write(q){if(re)return L(ze("closed","Stream is closed"));if(Z)return L(ze("aborted","Stream was aborted"));N.state==="paused"&&await N.waitForDrain();let ae={value:q,position:T,ts:Date.now()},ee=await C.append(r,p,ae);return ee.ok?(z({type:"stream_write",workflowId:r,namespace:p,position:T,ts:Date.now()}),T++,N.increment(),te(void 0)):(z({type:"stream_error",workflowId:r,namespace:p,error:ee.error,position:T,ts:Date.now()}),L(ze("store_error",ee.error.message,ee.error)))},async close(){if(re)return L(et("already_closed","Stream is already closed"));let q=await C.closeStream(r,p);return q.ok?(re=!0,K=!1,z({type:"stream_close",workflowId:r,namespace:p,finalPosition:T,ts:Date.now()}),Q.delete(I),te(void 0)):L(et("store_error",q.error.message,q.error))},abort(q){Z=!0,K=!1,re=!0,z({type:"stream_error",workflowId:r,namespace:p,error:q,position:T,ts:Date.now()}),Q.delete(I)},get writable(){return K},get position(){return T},get namespace(){return p}};return Q.set(I,{writer:F,backpressure:N,aborted:Z,closed:re}),F},f.getReadable=x=>{let p=x?.namespace??"default",S=x?.startIndex??0,I=x?.pollInterval??10,D=x?.pollTimeout??3e4;if(!C)throw new Error("streamStore is required to use getReadable(). Pass a streamStore to createWorkflow options.");let N=`${r}:${p}:${S}`,T=v.get(N);if(T&&!T.closed)return T.reader;let K=()=>{let Ce=`${r}:${p}`,se=Q.get(Ce);se&&se.backpressure.decrement()},Z=S,re=!0,F=!1,q=[],ae=0,ee={async read(){if(F)return L(Ze("closed","Reader is closed"));if(ae<q.length){let ce=q[ae++];return Z=ce.position+1,K(),z({type:"stream_read",workflowId:r,namespace:p,position:ce.position,ts:Date.now()}),te(ce.value)}let Ce=`${r}:${p}`,se=Date.now(),ue=Q.has(Ce),oe=await C.getMetadata(r,p),ie=oe.ok&&oe.value!==void 0;for(;Date.now()-se<D;){let ce=await C.read(r,p,Z,100);if(!ce.ok)return L(Ze("store_error",ce.error.message,ce.error));let We=ce.value;if(We.length>0){q=We,ae=1;let Fe=We[0];return Z=Fe.position+1,K(),z({type:"stream_read",workflowId:r,namespace:p,position:Fe.position,ts:Date.now()}),te(Fe.value)}let Le=Q.has(Ce),Ae=await C.getMetadata(r,p),ot=Ae.ok&&Ae.value!==void 0;if(Le&&(ue=!0),ot&&(ie=!0),Ae.ok&&Ae.value?.closed)return re=!1,L(Je(Z));if(ue&&!Le&&!ot)return re=!1,L(Je(Z));ie&&!Le&&Ae.ok&&Ae.value?.closed,await new Promise(Fe=>setTimeout(Fe,I))}return re=!1,L(Je(Z))},close(){F=!0,re=!1,q=[],v.delete(N)},get readable(){return re},get position(){return Z},get namespace(){return p}};return v.set(N,{reader:ee,position:Z,closed:F}),ee},f.streamForEach=async(x,p,S)=>{let I=S?.checkpointInterval??1,D=S?.concurrency??1,N=[],T=0,K=-1,Z=F=>typeof F=="object"&&F!==null&&"read"in F&&typeof F.read=="function",re=async(F,q,ae,ee)=>{let se=I>0&&q%I===0?`stream-foreach:${ee}:pos-${ae}`:void 0,ue=se??`stream-item-${ae}`,oe=await f(ue,()=>p(F,q),{key:se});return{index:q,position:ae,result:oe}};if(Z(x))if(D<=1){let F=x.position,q=await x.read();for(;q.ok;){let ae=q.value,{result:ee}=await re(ae,T,F,x.namespace);N.push(ee),K=F,T++,F=x.position,q=await x.read()}}else{let F=new Map,q=0,ae=0,ee=new Array(D).fill(null),Ce=async()=>{for(let ce=0;ce<ee.length;ce++)if(ee[ce]===null)return ce;let oe=ee.filter(ce=>ce!==null),ie=await Promise.race(oe);return F.set(ie.index,{position:ie.position,result:ie.result}),ee[ie.slotIndex]=null,ie.slotIndex},se=x.position,ue=await x.read();for(;ue.ok;){let oe=await Ce(),ie=q,ce=se,We=ue.value,Le=oe;ee[oe]=re(We,ie,ce,x.namespace).then(Ae=>({slotIndex:Le,...Ae})),ae++,q++,se=x.position,ue=await x.read()}for(let oe=0;oe<ee.length;oe++)if(ee[oe]!==null){let ie=await ee[oe];F.set(ie.index,{position:ie.position,result:ie.result})}for(let oe=0;oe<ae;oe++){let ie=F.get(oe);ie&&(N.push(ie.result),K=ie.position,T++)}}else if(D<=1){let F=0;for await(let q of x){let{result:ae}=await re(q,F,F,"async-iterable");N.push(ae),K=F,T++,F++}}else{let F=new Map,q=0,ae=0,ee=new Array(D).fill(null),Ce=async()=>{for(let oe=0;oe<ee.length;oe++)if(ee[oe]===null)return oe;let se=ee.filter(oe=>oe!==null),ue=await Promise.race(se);return F.set(ue.index,ue.result),ee[ue.slotIndex]=null,ue.slotIndex};for await(let se of x){let ue=await Ce(),oe=q,ie=ue;ee[ue]=re(se,oe,oe,"async-iterable").then(ce=>({slotIndex:ie,...ce})),ae++,q++}for(let se=0;se<ee.length;se++)if(ee[se]!==null){let ue=await ee[se];F.set(ue.index,ue.result)}for(let se=0;se<ae;se++)F.has(se)&&(N.push(F.get(se)),K=se,T++)}return{results:N,processedCount:T,lastPosition:K}},f.if=m.if,f.label=m.label,f.branch=m.branch,f.arm=m.arm,f.forEach=m.forEach,f.item=m.item,f.dep=m.dep,f.workflow=(x,p,S)=>f(x,p,S),f.all=(x,p,S)=>{let I=S!==void 0&&Object.prototype.hasOwnProperty.call(S,"key")?S:{...S,key:void 0};return f(x,async()=>te(await m.all(x,p)),I)},f.map=(x,p,S,I)=>{let D=I!==void 0&&Object.prototype.hasOwnProperty.call(I,"key")?I:{...I,key:void 0};return f(x,async()=>te(await m.map(x,p,S,I)),D)},f},J=({step:m})=>{let f=V(m);return R({step:f,steps:Ke(w??{},f),deps:w,ctx:be})},_;try{_=await Be(J,{onError:de,onEvent:X,catchUnexpected:Se,workflowId:r,workflowName:e,context:G,_workflowSignal:i})}finally{i&&i.removeEventListener("abort",ne)}if(!_.ok&&A.length>0){let m=[];for(let f=A.length-1;f>=0;f--){let Q=A[f];try{await Q.compensate(Q.value)}catch(v){m.push({stepName:Q.stepName,error:v})}}if(m.length>0){let f={type:"SAGA_COMPENSATION_ERROR",originalError:_.error,compensationErrors:m};_=L(f,{cause:_.cause})}}let ye=performance.now()-s;if(!_.ok){let m;if(tt(_.cause)&&(m=_.cause),!m&&W&&gt(_.error)){let f=_.cause;f!=null&&typeof f=="object"&&"name"in f&&f.name==="AbortError"&&(m={type:"WORKFLOW_CANCELLED",reason:j??(typeof i?.reason=="string"?i.reason:i?.reason instanceof Error?i.reason.message:void 0),lastStepKey:H})}if(m)return z({type:"workflow_cancelled",workflowId:r,ts:Date.now(),durationMs:ye,reason:m.reason,lastStepKey:m.lastStepKey}),m&&!tt(_.cause)?L(_.error,{cause:m}):_}if(_.ok&&W){let m=j??(typeof i?.reason=="string"?i.reason:i?.reason instanceof Error?i.reason.message:void 0);z({type:"workflow_cancelled",workflowId:r,ts:Date.now(),durationMs:ye,reason:m,lastStepKey:H});let f={type:"WORKFLOW_CANCELLED",reason:m,lastStepKey:H};return L(Se(f),{cause:f})}return _.ok?z({type:"workflow_success",workflowId:r,ts:Date.now(),durationMs:ye}):z({type:"workflow_error",workflowId:r,ts:Date.now(),durationMs:ye,error:_.error}),_}function E(k,R,g){let r,w,A;return typeof k=="string"?(r=k,w=R,A=g):(w=k,A=R),o(r,w,A)}async function b(k,R,g){let r,w,A;typeof k=="string"?(r=k,w=R,A=g):(w=k,A=R);let $=Pt(),G=A?.onEvent,X={...A,onEvent:(Te,Pe)=>{$.handleEvent(Te);try{G?.(Te,Pe)}catch{}}},de,pe;try{de=await o(r,w,X)}catch(Te){let Pe=l?.catchUnexpected??qe;de=L(Pe(Te),{cause:Te})}finally{pe=$.getResumeState()}return{result:de,resumeState:pe}}let M={withDeps:k=>rt(M,k),run:E,runWithState:b};return M}function ir(e){return typeof e=="object"&&e!==null&&e.type==="SAGA_COMPENSATION_ERROR"}function ur(e,t,n){return _t(e,t,n)}async function cr(e,t){let n=crypto.randomUUID(),d=performance.now(),l=[],o=k=>t?.onEvent?.(k);o({type:"saga_start",sagaId:n,ts:Date.now()});let M=Object.assign(async(k,R,g)=>{if(typeof k!="string"||k.length===0)throw new TypeError("step(name, operation, options?): first argument must be a string.");let r=await R();if(r.ok)return g?.compensate&&l.push({name:k,value:r.value,compensate:g.compensate}),r.value;throw he(r.error,{origin:"result",resultCause:r.cause})},{try:async(k,R,g)=>{if(typeof k!="string"||k.length===0)throw new TypeError("step.try(name, operation, options): first argument must be a string.");let r="error"in g?()=>g.error:g.onError;try{let w=await R();return g.compensate&&l.push({name:k,value:w,compensate:g.compensate}),w}catch(w){let A=r(w);throw he(A,{origin:"throw",thrown:w})}}});try{let k=await e({step:M});return o({type:"saga_success",sagaId:n,ts:Date.now(),durationMs:performance.now()-d}),te(k)}catch(k){let R=performance.now()-d,g=xe(k)?k.error:k;o({type:"saga_error",sagaId:n,ts:Date.now(),durationMs:R,error:g}),o({type:"saga_compensation_start",sagaId:n,ts:Date.now(),stepCount:l.length});let r=performance.now(),w=[];for(let A=l.length-1;A>=0;A--){let $=l[A];try{await $.compensate($.value),o({type:"saga_compensation_step",sagaId:n,stepName:$.name,ts:Date.now(),success:!0})}catch(G){w.push({stepName:$.name,error:G}),o({type:"saga_compensation_step",sagaId:n,stepName:$.name,ts:Date.now(),success:!1,error:G})}}if(o({type:"saga_compensation_end",sagaId:n,ts:Date.now(),durationMs:performance.now()-r,success:w.length===0,failedCount:w.length}),w.length>0){let A={type:"SAGA_COMPENSATION_ERROR",originalError:g,compensationErrors:w};if(t?.onError?.(A),t?.throwOnCompensationFailure)throw A;return L(A)}return t?.onError?.(g),xe(k)?L(g):L(new _e({cause:k}))}}function Ee(...e){let t={};for(let n of e)n.key!==void 0&&(t.key=n.key),n.retry!==void 0&&(t.retry=t.retry?{...t.retry,...n.retry}:{...n.retry}),n.timeout!==void 0&&(t.timeout=t.timeout?{...t.timeout,...n.timeout}:{...n.timeout});return t}function lr(...e){let t=Ee(...e);return n=>Ee(t,n??{})}function pr(e,...t){return{name:e,policy:Ee(...t)}}function ge(e){return{retry:e}}var Ne={none:ge({attempts:1}),transient:ge({attempts:3,backoff:"exponential",initialDelay:100,maxDelay:1e3,jitter:!0}),standard:ge({attempts:3,backoff:"exponential",initialDelay:200,maxDelay:5e3,jitter:!0}),aggressive:ge({attempts:5,backoff:"exponential",initialDelay:500,maxDelay:3e4,jitter:!0}),fixed:(e,t)=>ge({attempts:e,backoff:"fixed",initialDelay:t,jitter:!1}),linear:(e,t)=>ge({attempts:e,backoff:"linear",initialDelay:t,jitter:!0}),custom:e=>ge({backoff:"exponential",initialDelay:100,maxDelay:3e4,jitter:!0,...e})};function ke(e){return{timeout:e}}var Ue={none:{},fast:ke({ms:1e3}),api:ke({ms:5e3}),extended:ke({ms:3e4}),long:ke({ms:12e4}),ms:e=>ke({ms:e}),seconds:e=>ke({ms:e*1e3}),withError:(e,t)=>ke({ms:e,error:t}),withSignal:e=>ke({ms:e,signal:!0})},mr={httpApi:Ee(Ue.api,Ne.standard),database:Ee(Ue.extended,ge({attempts:2,backoff:"exponential",initialDelay:100,maxDelay:2e3,jitter:!0})),cache:Ee(Ue.fast,Ne.none),messageQueue:Ee(Ue.extended,Ne.aggressive),fileSystem:Ee(Ue.long,Ne.standard),rateLimited:Ee(ke({ms:1e4}),ge({attempts:5,backoff:"linear",initialDelay:1e3,maxDelay:1e4,jitter:!0}))};function Dt(e,t){return Ee(e,t??{})}function dr(e,t){let n=t??{};return Ee(...e,n)}function Er(e,t,n={}){return e?t:n}function fr(e,t=process.env.NODE_ENV??"development",n={}){return e[t]??n}function yr(){let e=new Map;return{register(t,n){e.set(t,n)},get(t){return e.get(t)},has(t){return e.has(t)},names(){return Array.from(e.keys())},apply(t,n){let d=e.get(t);if(!d)throw new Error(`Policy not found: ${t}`);return Dt(d,n)}}}function wr(){let e=[],t={key(n){return e.push({key:n}),t},policy(n){return e.push(n),t},timeout(n){return e.push(ke({ms:n})),t},retry(n){return e.push(ge(n)),t},retries(n){return e.push(Ne.custom({attempts:n})),t},build(){return Ee(...e)}};return t}export{Ve as CircuitOpenError,Ht as circuitBreakerPresets,Er as conditionalPolicy,$t as createCircuitBreaker,zt as createCombinedLimiter,ht as createConcurrencyLimiter,Yt as createCostBasedRateLimiter,Jt as createFixedWindowLimiter,lr as createPolicyApplier,pr as createPolicyBundle,yr as createPolicyRegistry,Ct as createRateLimiter,ur as createSagaWorkflow,fr as envPolicy,Bt as isCircuitOpenError,xt as isQueueFullError,qt as isRateLimitExceededError,ir as isSagaCompensationError,Ee as mergePolicies,Qt as rateLimiterPresets,Ne as retryPolicies,ge as retryPolicy,cr as runSaga,mr as servicePolicies,wr as stepOptions,Ue as timeoutPolicies,ke as timeoutPolicy,dr as withPolicies,Dt as withPolicy};
11
- //# sourceMappingURL=reliability.js.map