awaitly 1.31.1 → 1.32.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 (169) hide show
  1. package/dist/adapters.cjs +2 -2
  2. package/dist/adapters.cjs.map +1 -1
  3. package/dist/adapters.d.cts +3 -1
  4. package/dist/adapters.d.ts +3 -1
  5. package/dist/adapters.js +2 -2
  6. package/dist/adapters.js.map +1 -1
  7. package/dist/batch.cjs +2 -2
  8. package/dist/batch.cjs.map +1 -1
  9. package/dist/batch.d.cts +3 -1
  10. package/dist/batch.d.ts +3 -1
  11. package/dist/batch.js +2 -2
  12. package/dist/batch.js.map +1 -1
  13. package/dist/circuit-breaker.cjs +2 -2
  14. package/dist/circuit-breaker.cjs.map +1 -1
  15. package/dist/circuit-breaker.d.cts +3 -1
  16. package/dist/circuit-breaker.d.ts +3 -1
  17. package/dist/circuit-breaker.js +2 -2
  18. package/dist/circuit-breaker.js.map +1 -1
  19. package/dist/conditional.d.cts +3 -1
  20. package/dist/conditional.d.ts +3 -1
  21. package/dist/core.cjs +2 -2
  22. package/dist/core.cjs.map +1 -1
  23. package/dist/core.d.cts +2 -1
  24. package/dist/core.d.ts +2 -1
  25. package/dist/core.js +2 -2
  26. package/dist/core.js.map +1 -1
  27. package/dist/diagnostics.cjs +3 -3
  28. package/dist/diagnostics.cjs.map +1 -1
  29. package/dist/diagnostics.d.cts +3 -1
  30. package/dist/diagnostics.d.ts +3 -1
  31. package/dist/diagnostics.js +3 -3
  32. package/dist/diagnostics.js.map +1 -1
  33. package/dist/durable.cjs +3 -3
  34. package/dist/durable.cjs.map +1 -1
  35. package/dist/durable.d.cts +8 -361
  36. package/dist/durable.d.ts +8 -361
  37. package/dist/durable.js +3 -3
  38. package/dist/durable.js.map +1 -1
  39. package/dist/engine.cjs +11 -0
  40. package/dist/engine.cjs.map +1 -0
  41. package/dist/engine.d.cts +114 -0
  42. package/dist/engine.d.ts +114 -0
  43. package/dist/engine.js +11 -0
  44. package/dist/engine.js.map +1 -0
  45. package/dist/errors-entry-CMH73Eym.d.cts +339 -0
  46. package/dist/errors-entry-DOt5UUl4.d.ts +339 -0
  47. package/dist/errors.cjs +1 -1
  48. package/dist/errors.cjs.map +1 -1
  49. package/dist/errors.d.cts +2 -318
  50. package/dist/errors.d.ts +2 -318
  51. package/dist/errors.js +1 -1
  52. package/dist/errors.js.map +1 -1
  53. package/dist/fetch.cjs +2 -2
  54. package/dist/fetch.cjs.map +1 -1
  55. package/dist/fetch.d.cts +3 -1
  56. package/dist/fetch.d.ts +3 -1
  57. package/dist/fetch.js +2 -2
  58. package/dist/fetch.js.map +1 -1
  59. package/dist/functional.cjs +1 -1
  60. package/dist/functional.cjs.map +1 -1
  61. package/dist/functional.d.cts +2 -0
  62. package/dist/functional.d.ts +2 -0
  63. package/dist/functional.js +1 -1
  64. package/dist/functional.js.map +1 -1
  65. package/dist/{guards-PU64_GKv.d.cts → guards-B79mP5Q8.d.cts} +3 -3
  66. package/dist/{guards-B5lgMJq0.d.ts → guards-BUq6NJCM.d.ts} +3 -3
  67. package/dist/{hitl-Dyiy0R1v.d.cts → hitl-BCqkMAHw.d.cts} +2 -2
  68. package/dist/{hitl-BjeSm1sJ.d.ts → hitl-BZtPx0aU.d.ts} +2 -2
  69. package/dist/hitl.cjs +2 -2
  70. package/dist/hitl.cjs.map +1 -1
  71. package/dist/hitl.d.cts +9 -6
  72. package/dist/hitl.d.ts +9 -6
  73. package/dist/hitl.js +2 -2
  74. package/dist/hitl.js.map +1 -1
  75. package/dist/index-BVUAOWGG.d.ts +417 -0
  76. package/dist/index-CQnpmUcC.d.cts +417 -0
  77. package/dist/index.cjs +1 -1
  78. package/dist/index.cjs.map +1 -1
  79. package/dist/index.d.cts +4 -3
  80. package/dist/index.d.ts +4 -3
  81. package/dist/index.js +1 -1
  82. package/dist/index.js.map +1 -1
  83. package/dist/otel.d.cts +3 -1
  84. package/dist/otel.d.ts +3 -1
  85. package/dist/{persistence-entry-B3ukwbb5.d.ts → persistence-entry-ClFhxd2Q.d.ts} +11 -5
  86. package/dist/{persistence-entry-CgVzswbg.d.cts → persistence-entry-jflY61az.d.cts} +11 -5
  87. package/dist/persistence.d.cts +6 -3
  88. package/dist/persistence.d.ts +6 -3
  89. package/dist/policies.d.cts +3 -1
  90. package/dist/policies.d.ts +3 -1
  91. package/dist/ratelimit.cjs +2 -2
  92. package/dist/ratelimit.cjs.map +1 -1
  93. package/dist/ratelimit.d.cts +3 -1
  94. package/dist/ratelimit.d.ts +3 -1
  95. package/dist/ratelimit.js +2 -2
  96. package/dist/ratelimit.js.map +1 -1
  97. package/dist/reliability.cjs +2 -2
  98. package/dist/reliability.cjs.map +1 -1
  99. package/dist/reliability.d.cts +3 -1
  100. package/dist/reliability.d.ts +3 -1
  101. package/dist/reliability.js +2 -2
  102. package/dist/reliability.js.map +1 -1
  103. package/dist/resolver.cjs +2 -2
  104. package/dist/resolver.cjs.map +1 -1
  105. package/dist/resolver.d.cts +5 -3
  106. package/dist/resolver.d.ts +5 -3
  107. package/dist/resolver.js +2 -2
  108. package/dist/resolver.js.map +1 -1
  109. package/dist/resource.cjs +2 -2
  110. package/dist/resource.cjs.map +1 -1
  111. package/dist/resource.d.cts +3 -1
  112. package/dist/resource.d.ts +3 -1
  113. package/dist/resource.js +2 -2
  114. package/dist/resource.js.map +1 -1
  115. package/dist/result/retry.cjs +1 -1
  116. package/dist/result/retry.cjs.map +1 -1
  117. package/dist/result/retry.d.cts +2 -0
  118. package/dist/result/retry.d.ts +2 -0
  119. package/dist/result/retry.js +1 -1
  120. package/dist/result/retry.js.map +1 -1
  121. package/dist/result.cjs +1 -1
  122. package/dist/result.cjs.map +1 -1
  123. package/dist/result.d.cts +8 -23
  124. package/dist/result.d.ts +8 -23
  125. package/dist/result.js +1 -1
  126. package/dist/result.js.map +1 -1
  127. package/dist/{run-entry-C1uFytM6.d.cts → run-entry-rw7zll_G.d.ts} +16 -45
  128. package/dist/{run-entry-C1uFytM6.d.ts → run-entry-yQu63Yj9.d.cts} +16 -45
  129. package/dist/run.cjs +2 -2
  130. package/dist/run.cjs.map +1 -1
  131. package/dist/run.d.cts +3 -1
  132. package/dist/run.d.ts +3 -1
  133. package/dist/run.js +2 -2
  134. package/dist/run.js.map +1 -1
  135. package/dist/saga.cjs +2 -2
  136. package/dist/saga.cjs.map +1 -1
  137. package/dist/saga.d.cts +3 -1
  138. package/dist/saga.d.ts +3 -1
  139. package/dist/saga.js +2 -2
  140. package/dist/saga.js.map +1 -1
  141. package/dist/singleflight.d.cts +3 -1
  142. package/dist/singleflight.d.ts +3 -1
  143. package/dist/streaming.cjs +4 -4
  144. package/dist/streaming.cjs.map +1 -1
  145. package/dist/streaming.d.cts +5 -3
  146. package/dist/streaming.d.ts +5 -3
  147. package/dist/streaming.js +4 -4
  148. package/dist/streaming.js.map +1 -1
  149. package/dist/testing.cjs +8 -4
  150. package/dist/testing.cjs.map +1 -1
  151. package/dist/testing.d.cts +87 -4
  152. package/dist/testing.d.ts +87 -4
  153. package/dist/testing.js +8 -4
  154. package/dist/testing.js.map +1 -1
  155. package/dist/{types-wa_wTOn3.d.ts → types-CuWK5AlK.d.ts} +1 -1
  156. package/dist/{types-DUWrNIJu.d.cts → types-uR3JpwvF.d.cts} +1 -1
  157. package/dist/webhook.cjs +2 -2
  158. package/dist/webhook.cjs.map +1 -1
  159. package/dist/webhook.d.cts +7 -4
  160. package/dist/webhook.d.ts +7 -4
  161. package/dist/webhook.js +2 -2
  162. package/dist/webhook.js.map +1 -1
  163. package/dist/workflow.cjs +3 -3
  164. package/dist/workflow.cjs.map +1 -1
  165. package/dist/workflow.d.cts +47 -11
  166. package/dist/workflow.d.ts +47 -11
  167. package/dist/workflow.js +3 -3
  168. package/dist/workflow.js.map +1 -1
  169. package/package.json +15 -1
@@ -2,4 +2,6 @@ export { CircuitBreaker, CircuitBreakerConfig, CircuitBreakerStats, CircuitOpenE
2
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
3
  export { CompensationAction, SagaCompensationError, SagaContext, SagaEvent, SagaResult, SagaStepOptions, SagaWorkflowOptions, createSagaWorkflow, isSagaCompensationError, runSaga } from './saga.cjs';
4
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-C1uFytM6.cjs';
5
+ import './run-entry-yQu63Yj9.cjs';
6
+ import './errors-entry-CMH73Eym.cjs';
7
+ import './tagged-error.cjs';
@@ -2,4 +2,6 @@ export { CircuitBreaker, CircuitBreakerConfig, CircuitBreakerStats, CircuitOpenE
2
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
3
  export { CompensationAction, SagaCompensationError, SagaContext, SagaEvent, SagaResult, SagaStepOptions, SagaWorkflowOptions, createSagaWorkflow, isSagaCompensationError, runSaga } from './saga.js';
4
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-C1uFytM6.js';
5
+ import './run-entry-rw7zll_G.js';
6
+ import './errors-entry-DOt5UUl4.js';
7
+ import './tagged-error.js';
@@ -1,7 +1,7 @@
1
- function _e(e){let r=e.trim().match(/^(\d+(?:\.\d+)?)\s*(ms|s|m|h|d)$/i);if(!r)return;let t=parseFloat(r[1]),l=r[2].toLowerCase();return{_tag:"Duration",millis:t*({ms:1,s:1e3,m:6e4,h:36e5,d:864e5}[l]??1)}}var ve="UNEXPECTED_ERROR";function De(e){return ve}function K(e){return{ok:!0,value:e}}function U(e,r){let t=r?.cause;return{ok:!1,error:e,...t!==void 0?{cause:t}:{}}}function Me(e){if(e==null)return"unknown";if(typeof e=="string")return e.trim()||"unknown";if(typeof e=="object"){let r=e;if(typeof r._tag=="string"){let t=r._tag.trim();if(t)return t}if(typeof r.tag=="string"){let t=r.tag.trim();if(t)return t}if(typeof r.code=="string"){let t=r.code.trim();if(t)return t}else if(typeof r.code=="number")return String(r.code);if(e instanceof Error&&e.name){let t=e.name.trim();if(t)return t}}return"unknown"}function Ie(e,r){if(!(!r||!e))return r[e]}function Ue(e){let{intent:r,domain:t,owner:l,tags:k,stateChanges:w,emits:R,calls:E}=e;if(!r&&!t&&!l&&!k?.length&&!w?.length&&!R?.length&&!E?.length)return;let C={};return r&&(C.intent=r),t&&(C.domain=t),l&&(C.owner=l),k?.length&&(C.tags=k),w?.length&&(C.stateChanges=w),R?.length&&(C.emits=R),E?.length&&(C.calls=E),C}function V(e,r,t,l,k){let w=Me(e),R=Ie(w,r),E={tag:w,origin:t};return R!==void 0&&(E.classification=R),l!==void 0&&(E.attempt=l),k!==void 0&&(E.cumulativeDurationMs=k),E}var te=Symbol.for("step_timeout_marker");function Te(e){return typeof e!="object"||e===null?!1:e.type==="STEP_TIMEOUT"?!0:te in e}function Ne(e){if(!(typeof e!="object"||e===null)){if(e.type==="STEP_TIMEOUT"){let r=e;return{timeoutMs:r.timeoutMs,stepName:r.stepName,stepKey:r.stepKey,attempt:r.attempt}}if(te in e)return e[te]}}var Ce=Symbol("early-exit");function re(e,r){return{[Ce]:!0,error:e,meta:r}}function ne(e){return typeof e=="object"&&e!==null&&e[Ce]===!0}var xe=Symbol("mapper-exception");function Z(e){return{[xe]:!0,thrown:e}}function Le(e){return typeof e=="object"&&e!==null&&e[xe]===!0}function we(e,r){let{backoff:t,initialDelay:l,maxDelay:k,jitter:w}=r,R;switch(t){case"fixed":R=l;break;case"linear":R=l*e;break;case"exponential":R=l*Math.pow(2,e-1);break}if(R=Math.min(R,k),w){let E=R*.25*Math.random();R=R+E}return Math.floor(R)}function fe(e){return new Promise(r=>setTimeout(r,e))}var ge=Symbol("timeout"),pe=Symbol("timeout-option");function Fe(e){return typeof e=="object"&&e!==null&&e[pe]===!0}async function je(e,r,t,l){let k=new AbortController,w=r.onTimeout??"error",R=()=>typeof w=="function"?w({name:t.name,key:t.key,ms:r.ms}):r.error??{type:"STEP_TIMEOUT",stepName:t.name,stepKey:t.key,timeoutMs:r.ms,attempt:t.attempt},E;l?.aborted&&k.abort(l.reason);let C;l&&!l.aborted&&(C=()=>k.abort(l.reason),l.addEventListener("abort",C,{once:!0}));let o=new Promise((p,u)=>{E=setTimeout(()=>{if(w!=="disconnect"&&k.abort(),w==="option"){u({[pe]:!0,ms:r.ms});return}u({[ge]:!0,error:R()})},r.ms)}),f;r.signal?f=Promise.resolve(e(k.signal)):f=Promise.resolve(e());try{return await Promise.race([f,o])}catch(p){if(typeof p=="object"&&p!==null&&p[pe]===!0)throw{[pe]:!0,ms:r.ms};if(typeof p=="object"&&p!==null&&p[ge]===!0){w==="disconnect"&&f.catch(()=>{});let u=p.error;if(typeof u=="object"&&u!==null&&u.type!=="STEP_TIMEOUT"){let m={timeoutMs:r.ms,stepName:t.name,stepKey:t.key,attempt:t.attempt};te in u?u[te]=m:Object.defineProperty(u,te,{value:m,enumerable:!1,writable:!0,configurable:!1})}throw u}throw p}finally{clearTimeout(E),C&&l&&l.removeEventListener("abort",C)}}var ee={backoff:"exponential",initialDelay:100,maxDelay:3e4,jitter:!0,retryOn:()=>!0,onRetry:()=>{}};async function ke(e,r){let{onError:t,onEvent:l,catchUnexpected:k,workflowId:w,workflowName:R,context:E,_workflowSignal:C}=r&&typeof r=="object"?r:{},o=w??crypto.randomUUID(),f=k??De,p=[],u=0,m=T=>T??`step_${++u}`,s=T=>{let Q=T.context!==void 0||E===void 0?T:{...T,context:E},z=R!==void 0&&Q.workflowName===void 0?{...Q,workflowName:R}:Q;if(z.type==="step_success"){let ue=z.stepId;for(let ce=p.length-1;ce>=0;ce--){let Y=p[ce];if(Y.type==="race"&&!Y.winnerId){Y.winnerId=ue;break}}}l?.(z,E)},S=re,F=T=>ne(T),j=(T,Q)=>T,B=T=>typeof T=="function"?!1:!!(T&&typeof T=="object"&&"ok"in T||T&&typeof T=="object"&&"then"in T&&typeof T.then=="function");try{let Q=function(c){let g={};for(let[i,a]of Object.entries(c))if(typeof a=="function")g[i]=a;else if(a&&typeof a=="object"&&"fn"in a)g[i]=a.fn;else throw new TypeError(`step.parallel: operation "${i}" must be a function or { fn, errors? } object`);return g},z=function(c,g){let i=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let a=performance.now(),n=!1;p.push({scopeId:i,type:"parallel"});let y=()=>{if(n)return;n=!0;let d=p.findIndex(x=>x.scopeId===i);d!==-1&&p.splice(d,1),s({type:"scope_end",workflowId:o,scopeId:i,ts:Date.now(),durationMs:performance.now()-a})};s({type:"scope_start",workflowId:o,scopeId:i,scopeType:"parallel",name:c,ts:Date.now()});try{let d=await g();if(y(),!d.ok)throw t?.(d.error,c,E),S(d.error,{origin:"result",resultCause:d.cause});return d.value}catch(d){throw y(),d}})()},ue=function(c,g){let i=Object.keys(c),a=g.name??`Parallel(${i.join(", ")})`,n=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let y=performance.now(),d=!1;p.push({scopeId:n,type:"parallel"});let x=()=>{if(d)return;d=!0;let h=p.findIndex(b=>b.scopeId===n);h!==-1&&p.splice(h,1),s({type:"scope_end",workflowId:o,scopeId:n,ts:Date.now(),durationMs:performance.now()-y})};s({type:"scope_start",workflowId:o,scopeId:n,scopeType:"parallel",name:a,ts:Date.now()});try{let h=await new Promise(A=>{if(i.length===0){A([]);return}let M=!1,L=i.length,O=new Array(i.length);for(let N=0;N<i.length;N++){let _=i[N],D=N;Promise.resolve(c[_]()).catch(v=>U({type:"PROMISE_REJECTED",cause:v},{cause:{type:"PROMISE_REJECTION",reason:v}})).then(v=>{if(!M){if(!v.ok){M=!0,A([{key:_,result:v}]);return}O[D]={key:_,result:v},L--,L===0&&A(O)}})}});x();let b={};for(let{key:A,result:M}of h){if(!M.ok)throw t?.(M.error,A,E),S(M.error,{origin:"result",resultCause:M.cause});b[A]=M.value}return b}catch(h){throw x(),h}})()};var at=Q,it=z,ut=ue;let T=(c,g,i)=>(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 a=i??{},n=Ue(a),y=c,d=a.key??c,x=a.key??c,{description:h,retry:b,timeout:A}=a,M=m(d),L=l,O=L?performance.now():0,_=B(g)?()=>g:g,v={attempts:Math.max(1,b?.attempts??1),backoff:b?.backoff??ee.backoff,initialDelay:b?.initialDelay??ee.initialDelay,maxDelay:b?.maxDelay??ee.maxDelay,jitter:b?.jitter??ee.jitter,retryOn:b?.retryOn??ee.retryOn,onRetry:b?.onRetry??ee.onRetry};l&&s({type:"step_start",workflowId:o,stepId:M,stepKey:d,name:y,description:h,ts:Date.now(),...n&&{metadata:n}});let G;for(let I=1;I<=v.attempts;I++){let Ae=L?performance.now():0;try{let P;if(A?P=await je(_,A,{name:y,key:d,attempt:I},C):P=await _(),P.ok){let J=performance.now()-O;return s({type:"step_success",workflowId:o,stepId:M,stepKey:d,name:y,description:h,ts:Date.now(),durationMs:J,...n&&{metadata:n}}),x&&s({type:"step_complete",workflowId:o,stepKey:x,name:y,description:h,ts:Date.now(),durationMs:J,result:P,...n&&{metadata:n}}),P.value}if(G=P,I<v.attempts&&v.retryOn(P.error,I)){let J=we(I,v);s({type:"step_retry",workflowId:o,stepId:M,stepKey:d,name:y,ts:Date.now(),attempt:I+1,maxAttempts:v.attempts,delayMs:J,error:P.error,...n&&{metadata:n},diagnostics:V(P.error,a.errorMeta,"result",I,performance.now()-O)}),v.onRetry(P.error,I,J),await fe(J);continue}v.attempts>1&&s({type:"step_retries_exhausted",workflowId:o,stepId:M,stepKey:d,name:y,ts:Date.now(),durationMs:performance.now()-O,attempts:I,lastError:P.error,...n&&{metadata:n},diagnostics:V(P.error,a.errorMeta,"result",I,performance.now()-O)});break}catch(P){let J=performance.now()-Ae;if(Fe(P)){let $=P.ms;s({type:"step_timeout",workflowId:o,stepId:M,stepKey:d,name:y,ts:Date.now(),timeoutMs:$,attempt:I,...n&&{metadata:n},diagnostics:V(P,a.errorMeta,"timeout",I)}),s({type:"step_success",workflowId:o,stepId:M,stepKey:d,name:y,description:h,ts:Date.now(),durationMs:performance.now()-O,...n&&{metadata:n}}),x&&s({type:"step_complete",workflowId:o,stepKey:x,name:y,description:h,ts:Date.now(),durationMs:performance.now()-O,result:K(void 0),...n&&{metadata:n}});return}if(F(P))throw s({type:"step_aborted",workflowId:o,stepId:M,stepKey:d,name:y,description:h,ts:Date.now(),durationMs:J,...n&&{metadata:n}}),P;if(Te(P)){let $=Ne(P),Oe=A?.ms??$?.timeoutMs??0;if(s({type:"step_timeout",workflowId:o,stepId:M,stepKey:d,name:y,ts:Date.now(),timeoutMs:Oe,attempt:I,...n&&{metadata:n},diagnostics:V(P,a.errorMeta,"timeout",I)}),I<v.attempts&&v.retryOn(P,I)){let de=we(I,v);s({type:"step_retry",workflowId:o,stepId:M,stepKey:d,name:y,ts:Date.now(),attempt:I+1,maxAttempts:v.attempts,delayMs:de,error:P,...n&&{metadata:n},diagnostics:V(P,a.errorMeta,"timeout",I,performance.now()-O)}),v.onRetry(P,I,de),await fe(de);continue}v.attempts>1&&s({type:"step_retries_exhausted",workflowId:o,stepId:M,stepKey:d,name:y,ts:Date.now(),durationMs:performance.now()-O,attempts:I,lastError:P,...n&&{metadata:n},diagnostics:V(P,a.errorMeta,"timeout",I,performance.now()-O)});let ye=performance.now()-O;throw s({type:"step_error",workflowId:o,stepId:M,stepKey:d,name:y,description:h,ts:Date.now(),durationMs:ye,error:P,...n&&{metadata:n},diagnostics:V(P,a.errorMeta,"timeout",I,ye)}),x&&s({type:"step_complete",workflowId:o,stepKey:x,name:y,description:h,ts:Date.now(),durationMs:ye,result:U(P,{cause:P}),meta:{origin:"throw",thrown:P},...n&&{metadata:n}}),t?.(P,y,E),S(P,{origin:"throw",thrown:P})}if(I<v.attempts&&v.retryOn(P,I)){let $=we(I,v);s({type:"step_retry",workflowId:o,stepId:M,stepKey:d,name:y,ts:Date.now(),attempt:I+1,maxAttempts:v.attempts,delayMs:$,error:P,...n&&{metadata:n},diagnostics:V(P,a.errorMeta,"throw",I,performance.now()-O)}),v.onRetry(P,I,$),await fe($);continue}v.attempts>1&&!Te(P)&&s({type:"step_retries_exhausted",workflowId:o,stepId:M,stepKey:d,name:y,ts:Date.now(),durationMs:performance.now()-O,attempts:I,lastError:P,...n&&{metadata:n},diagnostics:V(P,a.errorMeta,"throw",I,performance.now()-O)});let Ee=performance.now()-O,ae;try{ae=f(P)}catch($){throw Z($)}throw s({type:"step_error",workflowId:o,stepId:M,stepKey:d,name:y,description:h,ts:Date.now(),durationMs:Ee,error:ae,...n&&{metadata:n},diagnostics:V(P,a.errorMeta,"throw",I,Ee)}),x&&s({type:"step_complete",workflowId:o,stepKey:x,name:y,description:h,ts:Date.now(),durationMs:Ee,result:U(ae,{cause:P}),meta:{origin:"throw",thrown:P},...n&&{metadata:n}}),t?.(ae,y,E),S(ae,{origin:"throw",thrown:P})}}let H=G,le=performance.now()-O,me=j(H.error,{origin:"result",resultCause:H.cause});throw s({type:"step_error",workflowId:o,stepId:M,stepKey:d,name:y,description:h,ts:Date.now(),durationMs:le,error:me,...n&&{metadata:n},diagnostics:V(H.error,a.errorMeta,"result",v.attempts,le)}),x&&s({type:"step_complete",workflowId:o,stepKey:x,name:y,description:h,ts:Date.now(),durationMs:le,result:H,meta:{origin:"result",resultCause:H.cause},...n&&{metadata:n}}),t?.(me,y,E),S(me,{origin:"result",resultCause:H.cause})})();T.try=(c,g,i)=>{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 a=i.key??c,n=c,y=c,d="error"in i?()=>i.error:i.onError,x=l;return(async()=>{let h=x?performance.now():0;l&&s({type:"step_start",workflowId:o,stepId:y,stepKey:a,name:n,ts:Date.now()});try{let b=await g(),A=performance.now()-h;return s({type:"step_success",workflowId:o,stepId:y,stepKey:a,name:n,ts:Date.now(),durationMs:A}),a&&s({type:"step_complete",workflowId:o,stepKey:a,name:n,ts:Date.now(),durationMs:A,result:K(b)}),b}catch(b){let A=d(b),M=performance.now()-h,L=j(A,{origin:"throw",thrown:b});throw s({type:"step_error",workflowId:o,stepId:y,stepKey:a,name:n,ts:Date.now(),durationMs:M,error:L}),a&&s({type:"step_complete",workflowId:o,stepKey:a,name:n,ts:Date.now(),durationMs:M,result:U(A,{cause:b}),meta:{origin:"throw",thrown:b}}),t?.(L,n,E),S(L,{origin:"throw",thrown:b})}})()},T.fromResult=(c,g,i)=>{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 a=i.key??c,n=c,y=c,d="error"in i?()=>i.error:i.onError,x=l;return(async()=>{let h=x?performance.now():0;l&&s({type:"step_start",workflowId:o,stepId:y,stepKey:a,name:n,ts:Date.now()});let b=await g();if(b.ok){let A=performance.now()-h;return s({type:"step_success",workflowId:o,stepId:y,stepKey:a,name:n,ts:Date.now(),durationMs:A}),a&&s({type:"step_complete",workflowId:o,stepKey:a,name:n,ts:Date.now(),durationMs:A,result:K(b.value)}),b.value}else{let A=d(b.error),M=performance.now()-h,L=j(A,{origin:"result",resultCause:b.error});throw s({type:"step_error",workflowId:o,stepId:y,stepKey:a,name:n,ts:Date.now(),durationMs:M,error:L}),a&&s({type:"step_complete",workflowId:o,stepKey:a,name:n,ts:Date.now(),durationMs:M,result:U(A,{cause:b.error}),meta:{origin:"result",resultCause:b.error}}),t?.(L,n,E),S(L,{origin:"result",resultCause:b.error})}})()},T.fromNullable=(c,g,i,a)=>{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 T(c,async()=>{let n=await g();return n!=null?K(n):U(i())},a)},T.retry=(c,g,i)=>{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 T(c,g,{key:i.key??c,retry:{attempts:i.attempts,backoff:i.backoff,initialDelay:i.initialDelay,maxDelay:i.maxDelay,jitter:i.jitter,retryOn:i.retryOn,onRetry:i.onRetry},timeout:i.timeout})},T.withTimeout=(c,g,i)=>{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 T(c,g,{key:i.key??c,timeout:i})},T.sleep=(c,g,i)=>{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 a=typeof g=="string"?_e(g):g;if(!a)throw new Error(`step.sleep: invalid duration '${g}'`);let n=a.millis,y=i?.signal;return T(c,async()=>{if(C?.aborted||y?.aborted){let d=new Error("Sleep aborted");throw d.name="AbortError",d}return new Promise((d,x)=>{let h={timeoutId:void 0},b=()=>{h.timeoutId&&clearTimeout(h.timeoutId);let A=new Error("Sleep aborted");A.name="AbortError",x(A)};C?.addEventListener("abort",b,{once:!0}),y?.addEventListener("abort",b,{once:!0}),h.timeoutId=setTimeout(()=>{C?.removeEventListener("abort",b),y?.removeEventListener("abort",b),d(K(void 0))},n)})},{key:i?.key??c,description:i?.description})},T.parallel=((...c)=>{if(typeof c[0]!="string")throw new TypeError("step.parallel(name, ...): first argument must be a string (step name). Example: step.parallel('Fetch data', { user: () => fetchUser(), posts: () => fetchPosts() })");let g=c[0],i=c[1];if(typeof i=="function")return z(g,i);if(i&&typeof i=="object"&&!Array.isArray(i)){let n=Q(i);return ue(n,{name:g})}throw new TypeError("step.parallel(name, ...): second argument must be a function (array form) or an object of operations (object form).")}),T.race=(c,g)=>{let i=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let a=performance.now(),n=!1,y={scopeId:i,type:"race",winnerId:void 0};p.push(y);let d=()=>{if(n)return;n=!0;let x=p.findIndex(h=>h.scopeId===i);x!==-1&&p.splice(x,1),s({type:"scope_end",workflowId:o,scopeId:i,ts:Date.now(),durationMs:performance.now()-a,winnerId:y.winnerId})};s({type:"scope_start",workflowId:o,scopeId:i,scopeType:"race",name:c,ts:Date.now()});try{let x=await g();if(d(),!x.ok)throw t?.(x.error,c,E),S(x.error,{origin:"result",resultCause:x.cause});return x.value}catch(x){throw d(),x}})()},T.allSettled=(c,g)=>{let i=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let a=performance.now(),n=!1;p.push({scopeId:i,type:"allSettled"});let y=()=>{if(n)return;n=!0;let d=p.findIndex(x=>x.scopeId===i);d!==-1&&p.splice(d,1),s({type:"scope_end",workflowId:o,scopeId:i,ts:Date.now(),durationMs:performance.now()-a})};s({type:"scope_start",workflowId:o,scopeId:i,scopeType:"allSettled",name:c,ts:Date.now()});try{let d=await g();if(y(),!d.ok)throw t?.(d.error,c,E),S(d.error,{origin:"result",resultCause:d.cause});return d.value}catch(d){throw y(),d}})()},T.if=(c,g,i)=>i(),T.label=T.if,T.branch=async(c,g)=>{let{condition:i,then:a,else:n}=g;if(i())return await a();if(n)return await n()},T.arm=(c,g)=>({fn:c,errors:g}),T.forEach=async(c,g,i)=>{let a=[],n=i.maxIterations,y=0,d="run"in i,x=Symbol.asyncIterator in g?g:(async function*(){yield*g})();for await(let h of x){if(n!==void 0&&y>=n)break;let b;d?b=await i.run(h,y):b=await i.item.handler(h,y,T),a.push(b),y++}return a},T.item=c=>({__forEachItemHandler:!0,handler:c}),T.dep=(c,g)=>g,T.run=(c,g,i)=>T(c,()=>g,i),T.workflow=(c,g,i)=>T(c,g,i),T.andThen=(c,g,i,a)=>T(c,()=>i(g),a),T.match=async(c,g,i,a)=>T(c,async()=>{let n=await g;return n.ok?K(await i.ok(n.value)):K(await i.err(n.error,n.cause))},a),T.all=T.parallel,T.map=async(c,g,i,a)=>{let n=a?.concurrency??g.length;return T(c,()=>n>=g.length?Re(g.map((y,d)=>i(y,d))):(async()=>{let y=[];for(let d=0;d<g.length;d+=n){let x=g.slice(d,d+n),h=await Re(x.map((b,A)=>i(b,d+A)));if(!h.ok)return h;y.push(...h.value)}return K(y)})(),{key:a?.key})},T.withFallback=(c,g,i)=>{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 a=i.key??c,n=c,y=m(a),d=l;return(async()=>{let x=d?performance.now():0;l&&s({type:"step_start",workflowId:o,stepId:y,stepKey:a,name:n,ts:Date.now()});let h;try{h=await g()}catch(O){if(F(O))throw s({type:"step_aborted",workflowId:o,stepId:y,stepKey:a,name:n,ts:Date.now(),durationMs:performance.now()-x}),O;let N;try{N=f(O)}catch(D){throw Z(D)}if(i.on!==void 0&&i.on!==N){let D=performance.now()-x;throw s({type:"step_error",workflowId:o,stepId:y,stepKey:a,name:n,ts:Date.now(),durationMs:D,error:N}),a&&s({type:"step_complete",workflowId:o,stepKey:a,name:n,ts:Date.now(),durationMs:D,result:U(N,{cause:O}),meta:{origin:"throw",thrown:O}}),t?.(N,n,E),S(N,{origin:"throw",thrown:O})}let _;try{_=await i.fallback()}catch(D){if(F(D))throw s({type:"step_aborted",workflowId:o,stepId:y,stepKey:a,name:n,ts:Date.now(),durationMs:performance.now()-x}),D;let v;try{v=f(D)}catch(H){throw Z(H)}let G=performance.now()-x;throw s({type:"step_error",workflowId:o,stepId:y,stepKey:a,name:n,ts:Date.now(),durationMs:G,error:v}),a&&s({type:"step_complete",workflowId:o,stepKey:a,name:n,ts:Date.now(),durationMs:G,result:U(v,{cause:D}),meta:{origin:"throw",thrown:D}}),t?.(v,n,E),S(v,{origin:"throw",thrown:D})}if(_.ok){let D=performance.now()-x;return s({type:"step_success",workflowId:o,stepId:y,stepKey:a,name:n,ts:Date.now(),durationMs:D}),a&&s({type:"step_complete",workflowId:o,stepKey:a,name:n,ts:Date.now(),durationMs:D,result:_,meta:{origin:"fallback",fallbackUsed:!0,fallbackReason:String(N)}}),_.value}else{let D=performance.now()-x,v=j(_.error,{origin:"result",resultCause:_.cause});throw s({type:"step_error",workflowId:o,stepId:y,stepKey:a,name:n,ts:Date.now(),durationMs:D,error:v}),a&&s({type:"step_complete",workflowId:o,stepKey:a,name:n,ts:Date.now(),durationMs:D,result:_,meta:{origin:"result",resultCause:_.cause}}),t?.(v,n,E),S(v,{origin:"result",resultCause:_.cause})}}if(h.ok){let O=performance.now()-x;return s({type:"step_success",workflowId:o,stepId:y,stepKey:a,name:n,ts:Date.now(),durationMs:O}),a&&s({type:"step_complete",workflowId:o,stepKey:a,name:n,ts:Date.now(),durationMs:O,result:h}),h.value}let b=h.error;if(i.on!==void 0&&i.on!==b){let O=performance.now()-x,N=j(b,{origin:"result",resultCause:h.cause});throw s({type:"step_error",workflowId:o,stepId:y,stepKey:a,name:n,ts:Date.now(),durationMs:O,error:N}),a&&s({type:"step_complete",workflowId:o,stepKey:a,name:n,ts:Date.now(),durationMs:O,result:h,meta:{origin:"result",resultCause:h.cause}}),t?.(N,n,E),S(N,{origin:"result",resultCause:h.cause})}let A;try{A=await i.fallback()}catch(O){if(F(O))throw s({type:"step_aborted",workflowId:o,stepId:y,stepKey:a,name:n,ts:Date.now(),durationMs:performance.now()-x}),O;let N;try{N=f(O)}catch(D){throw Z(D)}let _=performance.now()-x;throw s({type:"step_error",workflowId:o,stepId:y,stepKey:a,name:n,ts:Date.now(),durationMs:_,error:N}),a&&s({type:"step_complete",workflowId:o,stepKey:a,name:n,ts:Date.now(),durationMs:_,result:U(N,{cause:O}),meta:{origin:"throw",thrown:O}}),t?.(N,n,E),S(N,{origin:"throw",thrown:O})}if(A.ok){let O=performance.now()-x;return s({type:"step_success",workflowId:o,stepId:y,stepKey:a,name:n,ts:Date.now(),durationMs:O}),a&&s({type:"step_complete",workflowId:o,stepKey:a,name:n,ts:Date.now(),durationMs:O,result:A,meta:{origin:"fallback",fallbackUsed:!0,fallbackReason:String(b)}}),A.value}let M=performance.now()-x,L=j(A.error,{origin:"result",resultCause:A.cause});throw s({type:"step_error",workflowId:o,stepId:y,stepKey:a,name:n,ts:Date.now(),durationMs:M,error:L}),a&&s({type:"step_complete",workflowId:o,stepKey:a,name:n,ts:Date.now(),durationMs:M,result:A,meta:{origin:"result",resultCause:A.cause}}),t?.(L,n,E),S(L,{origin:"result",resultCause:A.cause})})()},T.withResource=(c,g)=>{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 i=c,a=c,n=m(i),y=l;return(async()=>{let d=y?performance.now():0;l&&s({type:"step_start",workflowId:o,stepId:n,stepKey:i,name:a,ts:Date.now()});let x;try{x=await g.acquire()}catch(_){if(F(_))throw s({type:"step_aborted",workflowId:o,stepId:n,stepKey:i,name:a,ts:Date.now(),durationMs:performance.now()-d}),_;let D;try{D=f(_)}catch(G){throw Z(G)}let v=performance.now()-d;throw s({type:"step_error",workflowId:o,stepId:n,stepKey:i,name:a,ts:Date.now(),durationMs:v,error:D}),i&&s({type:"step_complete",workflowId:o,stepKey:i,name:a,ts:Date.now(),durationMs:v,result:U(D,{cause:_}),meta:{origin:"throw",thrown:_}}),t?.(D,a,E),S(D,{origin:"throw",thrown:_})}if(!x.ok){let _=performance.now()-d,D=j(x.error,{origin:"result",resultCause:x.cause});throw s({type:"step_error",workflowId:o,stepId:n,stepKey:i,name:a,ts:Date.now(),durationMs:_,error:D}),i&&s({type:"step_complete",workflowId:o,stepKey:i,name:a,ts:Date.now(),durationMs:_,result:x,meta:{origin:"result",resultCause:x.cause}}),t?.(D,a,E),S(D,{origin:"result",resultCause:x.cause})}let h=x.value,b,A,M=!1;try{b=await g.use(h)}catch(_){if(F(_)){try{await g.release(h)}catch(D){console.warn(`[awaitly] step.withResource("${c}"): release threw after earlyExit:`,D)}throw _}A=_,M=!0}try{await g.release(h)}catch(_){console.warn(`[awaitly] step.withResource("${c}"): release threw:`,_)}if(M){let _;try{_=f(A)}catch(v){throw Z(v)}let D=performance.now()-d;throw s({type:"step_error",workflowId:o,stepId:n,stepKey:i,name:a,ts:Date.now(),durationMs:D,error:_}),i&&s({type:"step_complete",workflowId:o,stepKey:i,name:a,ts:Date.now(),durationMs:D,result:U(_,{cause:A}),meta:{origin:"throw",thrown:A}}),t?.(_,a,E),S(_,{origin:"throw",thrown:A})}let L=b;if(L.ok){let _=performance.now()-d;return s({type:"step_success",workflowId:o,stepId:n,stepKey:i,name:a,ts:Date.now(),durationMs:_}),i&&s({type:"step_complete",workflowId:o,stepKey:i,name:a,ts:Date.now(),durationMs:_,result:L}),L.value}let O=performance.now()-d,N=j(L.error,{origin:"result",resultCause:L.cause});throw s({type:"step_error",workflowId:o,stepId:n,stepKey:i,name:a,ts:Date.now(),durationMs:O,error:N}),i&&s({type:"step_complete",workflowId:o,stepKey:i,name:a,ts:Date.now(),durationMs:O,result:L,meta:{origin:"result",resultCause:L.cause}}),t?.(N,a,E),S(N,{origin:"result",resultCause:L.cause})})()};let Y=await e({step:T});if(process.env.NODE_ENV!=="production"&&Y!==null&&typeof Y=="object"&&"ok"in Y&&typeof Y.ok=="boolean"){let c=Y;(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().
1
+ var ce=class extends Error{_tag};function B(t,e){return class extends ce{_tag=t;constructor(r,m){let g=e?.message?e.message(r??{}):t;if(super(g),this.name=t,Object.setPrototypeOf(this,new.target.prototype),r&&typeof r=="object"){let{_tag:l,name:T,message:E,stack:R,...o}=r,y=Object.prototype.hasOwnProperty.call(o,"cause"),c=y?o.cause:void 0;y&&delete o.cause;let u=m?.cause!==void 0;if(y&&u)throw new TypeError("TaggedError: cannot provide 'cause' in props when also setting ErrorOptions.cause");Object.assign(this,o),y&&(this.cause=c),u&&(this.cause=m?.cause)}else m?.cause!==void 0&&(this.cause=m.cause)}}}Object.defineProperty(B,Symbol.hasInstance,{value:t=>t instanceof ce});(g=>{function t(l){return l instanceof Error}g.isError=t;function e(l){return l instanceof ce}g.isTaggedError=e;function r(l,T){let E=l._tag,R=T[E];return R(l)}g.match=r;function m(l,T,E){let R=l._tag,o=T[R];return o?o(l):E(l)}g.matchPartial=m})(B||={});var Re=class extends B("TimeoutError",{message:e=>e.operation?`TimeoutError: ${e.operation} timed out after ${e.ms}ms`:`TimeoutError: Operation timed out after ${e.ms}ms`}){},xe=class extends B("RetryExhaustedError",{message:e=>e.operation?`RetryExhaustedError: ${e.operation} failed after ${e.attempts} attempts`:`RetryExhaustedError: Operation failed after ${e.attempts} attempts`}){},Ce=class extends B("RateLimitError",{message:e=>e.limiterName?`RateLimitError: Rate limit exceeded for ${e.limiterName}${e.retryAfterMs?`, retry after ${e.retryAfterMs}ms`:""}`:`RateLimitError: Rate limit exceeded${e.retryAfterMs?`, retry after ${e.retryAfterMs}ms`:""}`}){},Se=class extends B("CircuitBreakerOpenError",{message:e=>`CircuitBreakerOpenError: Circuit ${e.circuitName} is ${e.state??"OPEN"}${e.retryAfterMs?`, retry after ${Math.ceil(e.retryAfterMs/1e3)}s`:""}`}){},he=class extends B("ValidationError",{message:e=>`ValidationError: Invalid ${e.field} - ${e.reason}`}){},be=class extends B("NotFoundError",{message:e=>e.id?`NotFoundError: ${e.resource} with id ${e.id} not found`:`NotFoundError: ${e.resource} not found`}){},Pe=class extends B("UnauthorizedError",{message:e=>e.reason?`UnauthorizedError: ${e.reason}`:e.action&&e.resource?`UnauthorizedError: Not authorized to ${e.action} ${e.resource}`:"UnauthorizedError: Access denied"}){},Ae=class extends B("NetworkError",{message:e=>e.url?`NetworkError: ${e.reason} (${e.url})`:`NetworkError: ${e.reason}`}){},Oe=class extends B("CompensationError",{message:e=>`CompensationError: Failed to compensate step ${e.step}`}){},ee=class extends B("UnexpectedError",{message:e=>`UnexpectedError: ${e.cause instanceof Error?e.cause.message:String(e.cause??"unknown")}`}){};function We(t){let e=t.trim().match(/^(\d+(?:\.\d+)?)\s*(ms|s|m|h|d)$/i);if(!e)return;let r=parseFloat(e[1]),m=e[2].toLowerCase();return{_tag:"Duration",millis:r*({ms:1,s:1e3,m:6e4,h:36e5,d:864e5}[m]??1)}}function $e(t){return new ee({cause:t})}function K(t){return{ok:!0,value:t}}function N(t,e){let r=e?.cause;return{ok:!1,error:t,...r!==void 0?{cause:r}:{}}}function Ve(t){if(t==null)return"unknown";if(typeof t=="string")return t.trim()||"unknown";if(typeof t=="object"){let e=t;if(typeof e._tag=="string"){let r=e._tag.trim();if(r)return r}if(typeof e.tag=="string"){let r=e.tag.trim();if(r)return r}if(typeof e.code=="string"){let r=e.code.trim();if(r)return r}else if(typeof e.code=="number")return String(e.code);if(t instanceof Error&&t.name){let r=t.name.trim();if(r)return r}}return"unknown"}function He(t,e){if(!(!e||!t))return e[t]}function qe(t){let{intent:e,domain:r,owner:m,tags:g,stateChanges:l,emits:T,calls:E}=t;if(!e&&!r&&!m&&!g?.length&&!l?.length&&!T?.length&&!E?.length)return;let R={};return e&&(R.intent=e),r&&(R.domain=r),m&&(R.owner=m),g?.length&&(R.tags=g),l?.length&&(R.stateChanges=l),T?.length&&(R.emits=T),E?.length&&(R.calls=E),R}function V(t,e,r,m,g){let l=Ve(t),T=He(l,e),E={tag:l,origin:r};return T!==void 0&&(E.classification=T),m!==void 0&&(E.attempt=m),g!==void 0&&(E.cumulativeDurationMs=g),E}var ne=Symbol.for("step_timeout_marker");function _e(t){return typeof t!="object"||t===null?!1:t.type==="STEP_TIMEOUT"?!0:ne in t}function ze(t){if(!(typeof t!="object"||t===null)){if(t.type==="STEP_TIMEOUT"){let e=t;return{timeoutMs:e.timeoutMs,stepName:e.stepName,stepKey:e.stepKey,attempt:e.attempt}}if(ne in t)return t[ne]}}var Ie=Symbol("early-exit");function oe(t,e){return{[Ie]:!0,error:t,meta:e}}function se(t){return typeof t=="object"&&t!==null&&t[Ie]===!0}var Ne=Symbol("mapper-exception");function te(t){return{[Ne]:!0,thrown:t}}function Qe(t){return typeof t=="object"&&t!==null&&t[Ne]===!0}function Te(t,e){let{backoff:r,initialDelay:m,maxDelay:g,jitter:l}=e,T;switch(r){case"fixed":T=m;break;case"linear":T=m*t;break;case"exponential":T=m*Math.pow(2,t-1);break}if(T=Math.min(T,g),l){let E=T*.25*Math.random();T=T+E}return Math.floor(T)}function ke(t){return new Promise(e=>setTimeout(e,t))}var ve=Symbol("timeout"),Ee=Symbol("timeout-option");function Ye(t){return typeof t=="object"&&t!==null&&t[Ee]===!0}async function Xe(t,e,r,m){let g=new AbortController,l=e.onTimeout??"error",T=()=>typeof l=="function"?l({name:r.name,key:r.key,ms:e.ms}):e.error??{type:"STEP_TIMEOUT",stepName:r.name,stepKey:r.key,timeoutMs:e.ms,attempt:r.attempt},E;m?.aborted&&g.abort(m.reason);let R;m&&!m.aborted&&(R=()=>g.abort(m.reason),m.addEventListener("abort",R,{once:!0}));let o=new Promise((c,u)=>{E=setTimeout(()=>{if(l!=="disconnect"&&g.abort(),l==="option"){u({[Ee]:!0,ms:e.ms});return}u({[ve]:!0,error:T()})},e.ms)}),y;e.signal?y=Promise.resolve(t(g.signal)):y=Promise.resolve(t());try{return await Promise.race([y,o])}catch(c){if(typeof c=="object"&&c!==null&&c[Ee]===!0)throw{[Ee]:!0,ms:e.ms};if(typeof c=="object"&&c!==null&&c[ve]===!0){l==="disconnect"&&y.catch(()=>{});let u=c.error;if(typeof u=="object"&&u!==null&&u.type!=="STEP_TIMEOUT"){let d={timeoutMs:e.ms,stepName:r.name,stepKey:r.key,attempt:r.attempt};ne in u?u[ne]=d:Object.defineProperty(u,ne,{value:d,enumerable:!1,writable:!0,configurable:!1})}throw u}throw c}finally{clearTimeout(E),R&&m&&m.removeEventListener("abort",R)}}var re={backoff:"exponential",initialDelay:100,maxDelay:3e4,jitter:!0,retryOn:()=>!0,onRetry:()=>{}};async function Me(t,e){let{onError:r,onEvent:m,catchUnexpected:g,workflowId:l,workflowName:T,context:E,_workflowSignal:R}=e&&typeof e=="object"?e:{},o=l??crypto.randomUUID(),y=g??$e,c=[],u=0,d=k=>k??`step_${++u}`,s=k=>{let z=k.context!==void 0||E===void 0?k:{...k,context:E},X=T!==void 0&&z.workflowName===void 0?{...z,workflowName:T}:z;if(X.type==="step_success"){let le=X.stepId;for(let me=c.length-1;me>=0;me--){let Q=c[me];if(Q.type==="race"&&!Q.winnerId){Q.winnerId=le;break}}}m?.(X,E)},S=oe,F=k=>se(k),j=(k,z)=>k,W=k=>typeof k=="function"?!1:!!(k&&typeof k=="object"&&"ok"in k||k&&typeof k=="object"&&"then"in k&&typeof k.then=="function");try{let z=function(p){let x={};for(let[i,a]of Object.entries(p))if(typeof a=="function")x[i]=a;else if(a&&typeof a=="object"&&"fn"in a)x[i]=a.fn;else throw new TypeError(`step.parallel: operation "${i}" must be a function or { fn, errors? } object`);return x},X=function(p,x){let i=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let a=performance.now(),n=!1;c.push({scopeId:i,type:"parallel"});let f=()=>{if(n)return;n=!0;let w=c.findIndex(C=>C.scopeId===i);w!==-1&&c.splice(w,1),s({type:"scope_end",workflowId:o,scopeId:i,ts:Date.now(),durationMs:performance.now()-a})};s({type:"scope_start",workflowId:o,scopeId:i,scopeType:"parallel",name:p,ts:Date.now()});try{let w=await x();if(f(),!w.ok)throw r?.(w.error,p,E),S(w.error,{origin:"result",resultCause:w.cause});return w.value}catch(w){throw f(),w}})()},le=function(p,x){let i=Object.keys(p),a=x.name??`Parallel(${i.join(", ")})`,n=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let f=performance.now(),w=!1;c.push({scopeId:n,type:"parallel"});let C=()=>{if(w)return;w=!0;let h=c.findIndex(b=>b.scopeId===n);h!==-1&&c.splice(h,1),s({type:"scope_end",workflowId:o,scopeId:n,ts:Date.now(),durationMs:performance.now()-f})};s({type:"scope_start",workflowId:o,scopeId:n,scopeType:"parallel",name:a,ts:Date.now()});try{let h=await new Promise(A=>{if(i.length===0){A([]);return}let D=!1,L=i.length,O=new Array(i.length);for(let U=0;U<i.length;U++){let _=i[U],M=U;Promise.resolve(p[_]()).catch(v=>N({type:"PROMISE_REJECTED",cause:v},{cause:{type:"PROMISE_REJECTION",reason:v}})).then(v=>{if(!D){if(!v.ok){D=!0,A([{key:_,result:v}]);return}O[M]={key:_,result:v},L--,L===0&&A(O)}})}});C();let b={};for(let{key:A,result:D}of h){if(!D.ok)throw r?.(D.error,A,E),S(D.error,{origin:"result",resultCause:D.cause});b[A]=D.value}return b}catch(h){throw C(),h}})()};var wt=z,gt=X,Tt=le;let k=(p,x,i)=>(async()=>{if(typeof p!="string"||p.length===0)throw new Error('[awaitly] step() requires an explicit string ID as the first argument. Example: step("fetchUser", () => fetchUser(id))');let a=i??{},n=qe(a),f=p,w=a.key??p,C=a.key??p,{description:h,retry:b,timeout:A}=a,D=d(w),L=m,O=L?performance.now():0,_=W(x)?()=>x:x,v={attempts:Math.max(1,b?.attempts??1),backoff:b?.backoff??re.backoff,initialDelay:b?.initialDelay??re.initialDelay,maxDelay:b?.maxDelay??re.maxDelay,jitter:b?.jitter??re.jitter,retryOn:b?.retryOn??re.retryOn,onRetry:b?.onRetry??re.onRetry};m&&s({type:"step_start",workflowId:o,stepId:D,stepKey:w,name:f,description:h,ts:Date.now(),...n&&{metadata:n}});let Z;for(let I=1;I<=v.attempts;I++){let Be=L?performance.now():0;try{let P;if(A?P=await Xe(_,A,{name:f,key:w,attempt:I},R):P=await _(),P.ok){let G=performance.now()-O;return s({type:"step_success",workflowId:o,stepId:D,stepKey:w,name:f,description:h,ts:Date.now(),durationMs:G,...n&&{metadata:n}}),C&&s({type:"step_complete",workflowId:o,stepKey:C,name:f,description:h,ts:Date.now(),durationMs:G,result:P,...n&&{metadata:n}}),P.value}if(Z=P,I<v.attempts&&v.retryOn(P.error,I)){let G=Te(I,v);s({type:"step_retry",workflowId:o,stepId:D,stepKey:w,name:f,ts:Date.now(),attempt:I+1,maxAttempts:v.attempts,delayMs:G,error:P.error,...n&&{metadata:n},diagnostics:V(P.error,a.errorMeta,"result",I,performance.now()-O)}),v.onRetry(P.error,I,G),await ke(G);continue}v.attempts>1&&s({type:"step_retries_exhausted",workflowId:o,stepId:D,stepKey:w,name:f,ts:Date.now(),durationMs:performance.now()-O,attempts:I,lastError:P.error,...n&&{metadata:n},diagnostics:V(P.error,a.errorMeta,"result",I,performance.now()-O)});break}catch(P){let G=performance.now()-Be;if(Ye(P)){let Y=P.ms;s({type:"step_timeout",workflowId:o,stepId:D,stepKey:w,name:f,ts:Date.now(),timeoutMs:Y,attempt:I,...n&&{metadata:n},diagnostics:V(P,a.errorMeta,"timeout",I)}),s({type:"step_success",workflowId:o,stepId:D,stepKey:w,name:f,description:h,ts:Date.now(),durationMs:performance.now()-O,...n&&{metadata:n}}),C&&s({type:"step_complete",workflowId:o,stepKey:C,name:f,description:h,ts:Date.now(),durationMs:performance.now()-O,result:K(void 0),...n&&{metadata:n}});return}if(F(P))throw s({type:"step_aborted",workflowId:o,stepId:D,stepKey:w,name:f,description:h,ts:Date.now(),durationMs:G,...n&&{metadata:n}}),P;if(_e(P)){let Y=ze(P),Ke=A?.ms??Y?.timeoutMs??0;if(s({type:"step_timeout",workflowId:o,stepId:D,stepKey:w,name:f,ts:Date.now(),timeoutMs:Ke,attempt:I,...n&&{metadata:n},diagnostics:V(P,a.errorMeta,"timeout",I)}),I<v.attempts&&v.retryOn(P,I)){let ge=Te(I,v);s({type:"step_retry",workflowId:o,stepId:D,stepKey:w,name:f,ts:Date.now(),attempt:I+1,maxAttempts:v.attempts,delayMs:ge,error:P,...n&&{metadata:n},diagnostics:V(P,a.errorMeta,"timeout",I,performance.now()-O)}),v.onRetry(P,I,ge),await ke(ge);continue}v.attempts>1&&s({type:"step_retries_exhausted",workflowId:o,stepId:D,stepKey:w,name:f,ts:Date.now(),durationMs:performance.now()-O,attempts:I,lastError:P,...n&&{metadata:n},diagnostics:V(P,a.errorMeta,"timeout",I,performance.now()-O)});let we=performance.now()-O;throw s({type:"step_error",workflowId:o,stepId:D,stepKey:w,name:f,description:h,ts:Date.now(),durationMs:we,error:P,...n&&{metadata:n},diagnostics:V(P,a.errorMeta,"timeout",I,we)}),C&&s({type:"step_complete",workflowId:o,stepKey:C,name:f,description:h,ts:Date.now(),durationMs:we,result:N(P,{cause:P}),meta:{origin:"throw",thrown:P},...n&&{metadata:n}}),r?.(P,f,E),S(P,{origin:"throw",thrown:P})}if(I<v.attempts&&v.retryOn(P,I)){let Y=Te(I,v);s({type:"step_retry",workflowId:o,stepId:D,stepKey:w,name:f,ts:Date.now(),attempt:I+1,maxAttempts:v.attempts,delayMs:Y,error:P,...n&&{metadata:n},diagnostics:V(P,a.errorMeta,"throw",I,performance.now()-O)}),v.onRetry(P,I,Y),await ke(Y);continue}v.attempts>1&&!_e(P)&&s({type:"step_retries_exhausted",workflowId:o,stepId:D,stepKey:w,name:f,ts:Date.now(),durationMs:performance.now()-O,attempts:I,lastError:P,...n&&{metadata:n},diagnostics:V(P,a.errorMeta,"throw",I,performance.now()-O)});let fe=performance.now()-O,ue;try{ue=y(P)}catch(Y){throw te(Y)}throw s({type:"step_error",workflowId:o,stepId:D,stepKey:w,name:f,description:h,ts:Date.now(),durationMs:fe,error:ue,...n&&{metadata:n},diagnostics:V(P,a.errorMeta,"throw",I,fe)}),C&&s({type:"step_complete",workflowId:o,stepKey:C,name:f,description:h,ts:Date.now(),durationMs:fe,result:N(ue,{cause:P}),meta:{origin:"throw",thrown:P},...n&&{metadata:n}}),r?.(ue,f,E),S(ue,{origin:"throw",thrown:P})}}let J=Z,de=performance.now()-O,ye=j(J.error,{origin:"result",resultCause:J.cause});throw s({type:"step_error",workflowId:o,stepId:D,stepKey:w,name:f,description:h,ts:Date.now(),durationMs:de,error:ye,...n&&{metadata:n},diagnostics:V(J.error,a.errorMeta,"result",v.attempts,de)}),C&&s({type:"step_complete",workflowId:o,stepKey:C,name:f,description:h,ts:Date.now(),durationMs:de,result:J,meta:{origin:"result",resultCause:J.cause},...n&&{metadata:n}}),r?.(ye,f,E),S(ye,{origin:"result",resultCause:J.cause})})();k.try=(p,x,i)=>{if(typeof p!="string"||p.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 a=i.key??p,n=p,f=p,w="error"in i?()=>i.error:i.onError,C=m;return(async()=>{let h=C?performance.now():0;m&&s({type:"step_start",workflowId:o,stepId:f,stepKey:a,name:n,ts:Date.now()});try{let b=await x(),A=performance.now()-h;return s({type:"step_success",workflowId:o,stepId:f,stepKey:a,name:n,ts:Date.now(),durationMs:A}),a&&s({type:"step_complete",workflowId:o,stepKey:a,name:n,ts:Date.now(),durationMs:A,result:K(b)}),b}catch(b){let A=w(b),D=performance.now()-h,L=j(A,{origin:"throw",thrown:b});throw s({type:"step_error",workflowId:o,stepId:f,stepKey:a,name:n,ts:Date.now(),durationMs:D,error:L}),a&&s({type:"step_complete",workflowId:o,stepKey:a,name:n,ts:Date.now(),durationMs:D,result:N(A,{cause:b}),meta:{origin:"throw",thrown:b}}),r?.(L,n,E),S(L,{origin:"throw",thrown:b})}})()},k.fromResult=(p,x,i)=>{if(typeof p!="string"||p.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 a=i.key??p,n=p,f=p,w="error"in i?()=>i.error:i.onError,C=m;return(async()=>{let h=C?performance.now():0;m&&s({type:"step_start",workflowId:o,stepId:f,stepKey:a,name:n,ts:Date.now()});let b=await x();if(b.ok){let A=performance.now()-h;return s({type:"step_success",workflowId:o,stepId:f,stepKey:a,name:n,ts:Date.now(),durationMs:A}),a&&s({type:"step_complete",workflowId:o,stepKey:a,name:n,ts:Date.now(),durationMs:A,result:K(b.value)}),b.value}else{let A=w(b.error),D=performance.now()-h,L=j(A,{origin:"result",resultCause:b.error});throw s({type:"step_error",workflowId:o,stepId:f,stepKey:a,name:n,ts:Date.now(),durationMs:D,error:L}),a&&s({type:"step_complete",workflowId:o,stepKey:a,name:n,ts:Date.now(),durationMs:D,result:N(A,{cause:b.error}),meta:{origin:"result",resultCause:b.error}}),r?.(L,n,E),S(L,{origin:"result",resultCause:b.error})}})()},k.fromNullable=(p,x,i,a)=>{if(typeof p!="string"||p.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 k(p,async()=>{let n=await x();return n!=null?K(n):N(i())},a)},k.retry=(p,x,i)=>{if(typeof p!="string"||p.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 k(p,x,{key:i.key??p,retry:{attempts:i.attempts,backoff:i.backoff,initialDelay:i.initialDelay,maxDelay:i.maxDelay,jitter:i.jitter,retryOn:i.retryOn,onRetry:i.onRetry},timeout:i.timeout})},k.withTimeout=(p,x,i)=>{if(typeof p!="string"||p.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 k(p,x,{key:i.key??p,timeout:i})},k.sleep=(p,x,i)=>{if(typeof p!="string"||p.length===0)throw new Error('[awaitly] step.sleep() requires an explicit string ID as the first argument. Example: step.sleep("delay", "5s")');let a=typeof x=="string"?We(x):x;if(!a)throw new Error(`step.sleep: invalid duration '${x}'`);let n=a.millis,f=i?.signal;return k(p,async()=>{if(R?.aborted||f?.aborted){let w=new Error("Sleep aborted");throw w.name="AbortError",w}return new Promise((w,C)=>{let h={timeoutId:void 0},b=()=>{h.timeoutId&&clearTimeout(h.timeoutId);let A=new Error("Sleep aborted");A.name="AbortError",C(A)};R?.addEventListener("abort",b,{once:!0}),f?.addEventListener("abort",b,{once:!0}),h.timeoutId=setTimeout(()=>{R?.removeEventListener("abort",b),f?.removeEventListener("abort",b),w(K(void 0))},n)})},{key:i?.key??p,description:i?.description})},k.parallel=((...p)=>{if(typeof p[0]!="string")throw new TypeError("step.parallel(name, ...): first argument must be a string (step name). Example: step.parallel('Fetch data', { user: () => fetchUser(), posts: () => fetchPosts() })");let x=p[0],i=p[1];if(typeof i=="function")return X(x,i);if(i&&typeof i=="object"&&!Array.isArray(i)){let n=z(i);return le(n,{name:x})}throw new TypeError("step.parallel(name, ...): second argument must be a function (array form) or an object of operations (object form).")}),k.race=(p,x)=>{let i=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let a=performance.now(),n=!1,f={scopeId:i,type:"race",winnerId:void 0};c.push(f);let w=()=>{if(n)return;n=!0;let C=c.findIndex(h=>h.scopeId===i);C!==-1&&c.splice(C,1),s({type:"scope_end",workflowId:o,scopeId:i,ts:Date.now(),durationMs:performance.now()-a,winnerId:f.winnerId})};s({type:"scope_start",workflowId:o,scopeId:i,scopeType:"race",name:p,ts:Date.now()});try{let C=await x();if(w(),!C.ok)throw r?.(C.error,p,E),S(C.error,{origin:"result",resultCause:C.cause});return C.value}catch(C){throw w(),C}})()},k.allSettled=(p,x)=>{let i=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let a=performance.now(),n=!1;c.push({scopeId:i,type:"allSettled"});let f=()=>{if(n)return;n=!0;let w=c.findIndex(C=>C.scopeId===i);w!==-1&&c.splice(w,1),s({type:"scope_end",workflowId:o,scopeId:i,ts:Date.now(),durationMs:performance.now()-a})};s({type:"scope_start",workflowId:o,scopeId:i,scopeType:"allSettled",name:p,ts:Date.now()});try{let w=await x();if(f(),!w.ok)throw r?.(w.error,p,E),S(w.error,{origin:"result",resultCause:w.cause});return w.value}catch(w){throw f(),w}})()},k.if=(p,x,i)=>i(),k.label=k.if,k.branch=async(p,x)=>{let{condition:i,then:a,else:n}=x;if(i())return await a();if(n)return await n()},k.arm=(p,x)=>({fn:p,errors:x}),k.forEach=async(p,x,i)=>{let a=[],n=i.maxIterations,f=0,w="run"in i,C=Symbol.asyncIterator in x?x:(async function*(){yield*x})();for await(let h of C){if(n!==void 0&&f>=n)break;let b;w?b=await i.run(h,f):b=await i.item.handler(h,f,k),a.push(b),f++}return a},k.item=p=>({__forEachItemHandler:!0,handler:p}),k.dep=(p,x)=>x,k.run=(p,x,i)=>k(p,()=>x,i),k.workflow=(p,x,i)=>k(p,x,i),k.andThen=(p,x,i,a)=>k(p,()=>i(x),a),k.match=async(p,x,i,a)=>k(p,async()=>{let n=await x;return n.ok?K(await i.ok(n.value)):K(await i.err(n.error,n.cause))},a),k.all=k.parallel,k.map=async(p,x,i,a)=>{let n=a?.concurrency??x.length;return k(p,()=>n>=x.length?De(x.map((f,w)=>i(f,w))):(async()=>{let f=[];for(let w=0;w<x.length;w+=n){let C=x.slice(w,w+n),h=await De(C.map((b,A)=>i(b,w+A)));if(!h.ok)return h;f.push(...h.value)}return K(f)})(),{key:a?.key})},k.withFallback=(p,x,i)=>{if(typeof p!="string"||p.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 a=i.key??p,n=p,f=d(a),w=m;return(async()=>{let C=w?performance.now():0;m&&s({type:"step_start",workflowId:o,stepId:f,stepKey:a,name:n,ts:Date.now()});let h;try{h=await x()}catch(O){if(F(O))throw s({type:"step_aborted",workflowId:o,stepId:f,stepKey:a,name:n,ts:Date.now(),durationMs:performance.now()-C}),O;let U;try{U=y(O)}catch(M){throw te(M)}if(i.on!==void 0&&i.on!==U){let M=performance.now()-C;throw s({type:"step_error",workflowId:o,stepId:f,stepKey:a,name:n,ts:Date.now(),durationMs:M,error:U}),a&&s({type:"step_complete",workflowId:o,stepKey:a,name:n,ts:Date.now(),durationMs:M,result:N(U,{cause:O}),meta:{origin:"throw",thrown:O}}),r?.(U,n,E),S(U,{origin:"throw",thrown:O})}let _;try{_=await i.fallback()}catch(M){if(F(M))throw s({type:"step_aborted",workflowId:o,stepId:f,stepKey:a,name:n,ts:Date.now(),durationMs:performance.now()-C}),M;let v;try{v=y(M)}catch(J){throw te(J)}let Z=performance.now()-C;throw s({type:"step_error",workflowId:o,stepId:f,stepKey:a,name:n,ts:Date.now(),durationMs:Z,error:v}),a&&s({type:"step_complete",workflowId:o,stepKey:a,name:n,ts:Date.now(),durationMs:Z,result:N(v,{cause:M}),meta:{origin:"throw",thrown:M}}),r?.(v,n,E),S(v,{origin:"throw",thrown:M})}if(_.ok){let M=performance.now()-C;return s({type:"step_success",workflowId:o,stepId:f,stepKey:a,name:n,ts:Date.now(),durationMs:M}),a&&s({type:"step_complete",workflowId:o,stepKey:a,name:n,ts:Date.now(),durationMs:M,result:_,meta:{origin:"fallback",fallbackUsed:!0,fallbackReason:String(U)}}),_.value}else{let M=performance.now()-C,v=j(_.error,{origin:"result",resultCause:_.cause});throw s({type:"step_error",workflowId:o,stepId:f,stepKey:a,name:n,ts:Date.now(),durationMs:M,error:v}),a&&s({type:"step_complete",workflowId:o,stepKey:a,name:n,ts:Date.now(),durationMs:M,result:_,meta:{origin:"result",resultCause:_.cause}}),r?.(v,n,E),S(v,{origin:"result",resultCause:_.cause})}}if(h.ok){let O=performance.now()-C;return s({type:"step_success",workflowId:o,stepId:f,stepKey:a,name:n,ts:Date.now(),durationMs:O}),a&&s({type:"step_complete",workflowId:o,stepKey:a,name:n,ts:Date.now(),durationMs:O,result:h}),h.value}let b=h.error;if(i.on!==void 0&&i.on!==b){let O=performance.now()-C,U=j(b,{origin:"result",resultCause:h.cause});throw s({type:"step_error",workflowId:o,stepId:f,stepKey:a,name:n,ts:Date.now(),durationMs:O,error:U}),a&&s({type:"step_complete",workflowId:o,stepKey:a,name:n,ts:Date.now(),durationMs:O,result:h,meta:{origin:"result",resultCause:h.cause}}),r?.(U,n,E),S(U,{origin:"result",resultCause:h.cause})}let A;try{A=await i.fallback()}catch(O){if(F(O))throw s({type:"step_aborted",workflowId:o,stepId:f,stepKey:a,name:n,ts:Date.now(),durationMs:performance.now()-C}),O;let U;try{U=y(O)}catch(M){throw te(M)}let _=performance.now()-C;throw s({type:"step_error",workflowId:o,stepId:f,stepKey:a,name:n,ts:Date.now(),durationMs:_,error:U}),a&&s({type:"step_complete",workflowId:o,stepKey:a,name:n,ts:Date.now(),durationMs:_,result:N(U,{cause:O}),meta:{origin:"throw",thrown:O}}),r?.(U,n,E),S(U,{origin:"throw",thrown:O})}if(A.ok){let O=performance.now()-C;return s({type:"step_success",workflowId:o,stepId:f,stepKey:a,name:n,ts:Date.now(),durationMs:O}),a&&s({type:"step_complete",workflowId:o,stepKey:a,name:n,ts:Date.now(),durationMs:O,result:A,meta:{origin:"fallback",fallbackUsed:!0,fallbackReason:String(b)}}),A.value}let D=performance.now()-C,L=j(A.error,{origin:"result",resultCause:A.cause});throw s({type:"step_error",workflowId:o,stepId:f,stepKey:a,name:n,ts:Date.now(),durationMs:D,error:L}),a&&s({type:"step_complete",workflowId:o,stepKey:a,name:n,ts:Date.now(),durationMs:D,result:A,meta:{origin:"result",resultCause:A.cause}}),r?.(L,n,E),S(L,{origin:"result",resultCause:A.cause})})()},k.withResource=(p,x)=>{if(typeof p!="string"||p.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 i=p,a=p,n=d(i),f=m;return(async()=>{let w=f?performance.now():0;m&&s({type:"step_start",workflowId:o,stepId:n,stepKey:i,name:a,ts:Date.now()});let C;try{C=await x.acquire()}catch(_){if(F(_))throw s({type:"step_aborted",workflowId:o,stepId:n,stepKey:i,name:a,ts:Date.now(),durationMs:performance.now()-w}),_;let M;try{M=y(_)}catch(Z){throw te(Z)}let v=performance.now()-w;throw s({type:"step_error",workflowId:o,stepId:n,stepKey:i,name:a,ts:Date.now(),durationMs:v,error:M}),i&&s({type:"step_complete",workflowId:o,stepKey:i,name:a,ts:Date.now(),durationMs:v,result:N(M,{cause:_}),meta:{origin:"throw",thrown:_}}),r?.(M,a,E),S(M,{origin:"throw",thrown:_})}if(!C.ok){let _=performance.now()-w,M=j(C.error,{origin:"result",resultCause:C.cause});throw s({type:"step_error",workflowId:o,stepId:n,stepKey:i,name:a,ts:Date.now(),durationMs:_,error:M}),i&&s({type:"step_complete",workflowId:o,stepKey:i,name:a,ts:Date.now(),durationMs:_,result:C,meta:{origin:"result",resultCause:C.cause}}),r?.(M,a,E),S(M,{origin:"result",resultCause:C.cause})}let h=C.value,b,A,D=!1;try{b=await x.use(h)}catch(_){if(F(_)){try{await x.release(h)}catch(M){console.warn(`[awaitly] step.withResource("${p}"): release threw after earlyExit:`,M)}throw _}A=_,D=!0}try{await x.release(h)}catch(_){console.warn(`[awaitly] step.withResource("${p}"): release threw:`,_)}if(D){let _;try{_=y(A)}catch(v){throw te(v)}let M=performance.now()-w;throw s({type:"step_error",workflowId:o,stepId:n,stepKey:i,name:a,ts:Date.now(),durationMs:M,error:_}),i&&s({type:"step_complete",workflowId:o,stepKey:i,name:a,ts:Date.now(),durationMs:M,result:N(_,{cause:A}),meta:{origin:"throw",thrown:A}}),r?.(_,a,E),S(_,{origin:"throw",thrown:A})}let L=b;if(L.ok){let _=performance.now()-w;return s({type:"step_success",workflowId:o,stepId:n,stepKey:i,name:a,ts:Date.now(),durationMs:_}),i&&s({type:"step_complete",workflowId:o,stepKey:i,name:a,ts:Date.now(),durationMs:_,result:L}),L.value}let O=performance.now()-w,U=j(L.error,{origin:"result",resultCause:L.cause});throw s({type:"step_error",workflowId:o,stepId:n,stepKey:i,name:a,ts:Date.now(),durationMs:O,error:U}),i&&s({type:"step_complete",workflowId:o,stepKey:i,name:a,ts:Date.now(),durationMs:O,result:L,meta:{origin:"result",resultCause:L.cause}}),r?.(U,a,E),S(U,{origin:"result",resultCause:L.cause})})()};let Q=await t({step:k});if(process.env.NODE_ENV!=="production"&&Q!==null&&typeof Q=="object"&&"ok"in Q&&typeof Q.ok=="boolean"){let p=Q;(p.ok===!0&&"value"in p||p.ok===!1&&"error"in p)&&console.warn(`awaitly: Workflow executor returned a Result-like object. Return raw values, not ok() or err().
2
2
 
3
3
  Incorrect: return ok({ data });
4
4
  Correct: return { data };
5
5
 
6
- See: https://jagreehal.github.io/awaitly/guides/troubleshooting/#returning-ok-from-workflow-executor-double-wrapping`)}return K(Y)}catch(T){if(Le(T))throw T.thrown;if(F(T)){let z=T.meta.origin==="throw"?T.meta.thrown:T.meta.origin==="result"?T.meta.resultCause:void 0;return U(T.error,{cause:z})}let Q=f(T);return t?.(Q,"unexpected",E),U(Q,{cause:T})}}ke.strict=(e,r)=>ke(e,r);async function Re(e){return e.length===0?K([]):new Promise(r=>{let t=!1,l=e.length,k=new Array(e.length);for(let w=0;w<e.length;w++){let R=w;Promise.resolve(e[R]).catch(E=>U({type:"PROMISE_REJECTED",cause:E},{cause:{type:"PROMISE_REJECTION",reason:E}})).then(E=>{if(!t){if(!E.ok){t=!0,r(E);return}k[R]=E.value,l--,l===0&&r(K(k))}})}})}var ie=class extends Error{type="CIRCUIT_OPEN";circuitName;state;retryAfterMs;constructor(r){super(r.message??`Circuit breaker "${r.circuitName}" is ${r.state}. Retry after ${Math.ceil(r.retryAfterMs/1e3)}s`),this.name="CircuitOpenError",this.circuitName=r.circuitName,this.state=r.state,this.retryAfterMs=r.retryAfterMs}};function Ke(e){return typeof e=="object"&&e!==null&&e.type==="CIRCUIT_OPEN"}var Be={failureThreshold:5,resetTimeout:3e4,windowSize:6e4,halfOpenMax:3};function We(e,r){let t={...Be,...r},l="CLOSED",k=[],w=null,R=null,E=0,C=0;function o(){let S=Date.now();k=k.filter(F=>S-F.timestamp<t.windowSize)}function f(S){if(l!==S){let F=l;l=S,S==="HALF_OPEN"&&(C=0),t.onStateChange?.(F,S,e)}}function p(){return l!=="OPEN"||w===null?!1:Date.now()-w>=t.resetTimeout?(f("HALF_OPEN"),!0):!1}function u(){R=Date.now(),E++,l==="HALF_OPEN"&&(C++,C>=t.halfOpenMax&&(f("CLOSED"),k=[]))}function m(S){let F=Date.now();w=F,o(),k.push({timestamp:F,error:S}),(l==="HALF_OPEN"||l==="CLOSED"&&k.length>=t.failureThreshold)&&f("OPEN")}function s(){if(l==="CLOSED")return 0;if(l==="OPEN"){if(p())return 0;let S=Date.now(),F=w?S-w:0;return Math.max(0,t.resetTimeout-F)}return 0}return{async execute(S,F){let j=s();if(j>0)throw new ie({circuitName:e,state:l,retryAfterMs:j});try{let B=await S();return u(),B}catch(B){throw m(B),B}},async executeResult(S,F){let j=s();if(j>0)return U(new ie({circuitName:e,state:l,retryAfterMs:j}));try{let B=await S();return B.ok?u():m(B.error),B}catch(B){throw m(B),B}},getState(){return l==="OPEN"&&p(),l},getStats(){return o(),{state:this.getState(),failureCount:k.length,successCount:E,lastFailureTime:w,lastSuccessTime:R,halfOpenSuccesses:C}},reset(){f("CLOSED"),k=[],C=0},forceOpen(){w=Date.now(),f("OPEN")},recordSuccess(){u()},recordFailure(S){m(S??new Error("Manual failure"))}}}var Ve={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 qe(e){return typeof e=="object"&&e!==null&&e.type==="RATE_LIMIT_EXCEEDED"}function Se(e){return typeof e=="object"&&e!==null&&e.type==="QUEUE_FULL"}function he(e,r){let{maxPerSecond:t,strategy:l="wait"}=r,k=r.burstCapacity??t*2,w=k,R=Date.now(),E=t/1e3,C=[];function o(){let u=Date.now(),s=(u-R)*E;w=Math.min(k,w+s),R=u}function f(){if(o(),w>=1)return w-=1,0;let u=1-w;return Math.ceil(u/E)}async function p(){return new Promise(u=>{let m=()=>{let s=f();s===0?u():(C.push(m),setTimeout(()=>{let S=C.indexOf(m);S!==-1&&(C.splice(S,1),m())},s))};m()})}return{async execute(u){let m=f();if(m>0){if(l==="reject")throw{type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:m};await p()}return u()},async executeResult(u){let m=f();if(m>0){if(l==="reject")return U({type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:m});await p()}return u()},getStats(){return o(),{availableTokens:Math.floor(w),maxTokens:k,tokensPerSecond:t,waitingCount:C.length}},reset(){w=k,R=Date.now(),C.length=0}}}function be(e,r){let{maxConcurrent:t,strategy:l="queue",maxQueueSize:k=1/0}=r,w=0,R=[];async function E(){if(w<t){w++;return}if(l==="reject")throw{type:"QUEUE_FULL",limiterName:e,queueSize:R.length,maxQueueSize:k};if(R.length>=k)throw{type:"QUEUE_FULL",limiterName:e,queueSize:R.length,maxQueueSize:k};return new Promise((o,f)=>{R.push({resolve:o,reject:f})})}function C(){w--,R.length>0&&w<t&&(w++,R.shift()?.resolve())}return{async execute(o){await E();try{return await o()}finally{C()}},async executeAll(o){let f=new Array(o.length),p=[];for(let u=0;u<o.length;u++){let m=u,s=this.execute(o[m]).then(S=>{f[m]=S});p.push(s)}return await Promise.all(p),f},async executeResult(o){try{await E()}catch(f){if(Se(f))return U(f);throw f}try{return await o()}finally{C()}},getStats(){return{activeCount:w,maxConcurrent:t,queueSize:R.length,maxQueueSize:k}},reset(){for(w=0;R.length>0;)R.shift()?.reject(new Error("Limiter reset"))}}}function Xe(e,r){let t=r.rate?he(`${e}-rate`,r.rate):void 0,l=r.concurrency?be(`${e}-concurrency`,r.concurrency):void 0;return{rate:t,concurrency:l,async execute(k){let w=k;if(t){let R=w;w=()=>t.execute(R)}return l?l.execute(w):w()}}}function Qe(e,r){let{limit:t,windowMs:l=1e3,strategy:k="wait"}=r,w=Date.now(),R=0,E=[];function C(){let p=Date.now(),u=p-w;return u>=l?(w=p,R=0,0):l-u}function o(p){let u=C();return R+p<=t?(R+=p,0):u}async function f(p){return new Promise(u=>{let m=()=>{let s=o(p);s===0?u():(E.push({resolve:m,cost:p}),setTimeout(()=>{let S=E.findIndex(F=>F.resolve===m);S!==-1&&(E.splice(S,1),m())},s))};m()})}return{async execute(p,u=1){if(u>t)throw{type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:l};let m=o(u);if(m>0){if(k==="reject")throw{type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:m};await f(u)}return p()},async executeResult(p,u=1){if(u>t)return U({type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:l});let m=o(u);if(m>0){if(k==="reject")return U({type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:m});await f(u)}return p()},getStats(){let p=C();return{requestCount:R,limit:t,windowMs:l,remainingMs:p,waitingCount:E.length}},reset(){w=Date.now(),R=0,E.length=0}}}function Ye(e,r){let{tokensPerSecond:t,strategy:l="wait"}=r,k=r.maxTokens??t*2,w=k,R=Date.now(),E=t/1e3,C=[];function o(){let u=Date.now(),s=(u-R)*E;w=Math.min(k,w+s),R=u}function f(u){if(o(),w>=u)return w-=u,0;let m=u-w;return Math.ceil(m/E)}async function p(u){return new Promise(m=>{let s=()=>{let S=f(u);S===0?m():(C.push({check:s,cost:u}),setTimeout(()=>{let F=C.findIndex(j=>j.check===s);F!==-1&&(C.splice(F,1),s())},S))};s()})}return{async execute(u,m=1){if(m>k)throw{type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:Math.ceil(m/E)};let s=f(m);if(s>0){if(l==="reject")throw{type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:s};await p(m)}return u()},async executeResult(u,m=1){if(m>k)return U({type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:Math.ceil(m/E)});let s=f(m);if(s>0){if(l==="reject")return U({type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:s});await p(m)}return u()},getStats(){return o(),{availableTokens:w,maxTokens:k,tokensPerSecond:t,waitingCount:C.length}},reset(){w=k,R=Date.now(),C.length=0}}}var $e={api:{maxPerSecond:10,burstCapacity:20,strategy:"wait"},database:{maxConcurrent:10,strategy:"queue",maxQueueSize:100},external:{maxPerSecond:5,burstCapacity:10,strategy:"wait"}};function ze(e){return typeof e=="object"&&e!==null&&e.type==="SAGA_COMPENSATION_ERROR"}function He(e,r,t){if(typeof e!="string"||e.length===0)throw new TypeError("createSagaWorkflow(workflowName, deps, options?): first argument must be a non-empty string. Example: createSagaWorkflow('checkout', { reserveInventory, chargeCard })");return async l=>{let k=crypto.randomUUID(),w=performance.now(),R=[],E=f=>{let p=f.workflowName===void 0?{...f,workflowName:e}:f;t?.onEvent?.(p)};E({type:"saga_start",sagaId:k,ts:Date.now()});async function C(f){let p=[];E({type:"saga_compensation_start",sagaId:k,ts:Date.now(),stepCount:R.length});let u=performance.now();for(let m=R.length-1;m>=0;m--){let s=R[m];try{await s.compensate(s.value),E({type:"saga_compensation_step",sagaId:k,stepName:s.name,ts:Date.now(),success:!0})}catch(S){p.push({stepName:s.name,error:S}),E({type:"saga_compensation_step",sagaId:k,stepName:s.name,ts:Date.now(),success:!1,error:S})}}return E({type:"saga_compensation_end",sagaId:k,ts:Date.now(),durationMs:performance.now()-u,success:p.length===0,failedCount:p.length}),p}let o={step:async function(p,u,m){if(typeof p!="string"||p.length===0)throw new TypeError("saga.step(name, operation, options?): first argument must be a string (step name). Example: saga.step('createOrder', () => deps.createOrder(), { compensate: (o) => deps.cancelOrder(o) })");let s=await u();if(s.ok)return m?.compensate&&R.push({name:p,value:s.value,compensate:m.compensate}),s.value;throw re(s.error,{origin:"result",resultCause:s.cause})},tryStep:async function(p,u,m){if(typeof p!="string"||p.length===0)throw new TypeError("saga.tryStep(name, operation, options): first argument must be a string (step name). Example: saga.tryStep('riskyOp', () => deps.riskyOp(), { error: 'RISKY_FAILED' })");let s="error"in m?()=>m.error:m.onError;try{let S=await u();return m.compensate&&R.push({name:p,value:S,compensate:m.compensate}),S}catch(S){let F=s(S);throw re(F,{origin:"throw",thrown:S})}},getCompensations(){return R.map(f=>({name:f.name,hasValue:f.value!==void 0}))}};try{let f=await l({saga:o,deps:r}),p=performance.now()-w;return E({type:"saga_success",sagaId:k,ts:Date.now(),durationMs:p}),K(f)}catch(f){let p=performance.now()-w,u;ne(f)?u=f.error:u=f,E({type:"saga_error",sagaId:k,ts:Date.now(),durationMs:p,error:u});let m=await C(u);if(m.length>0){let s={type:"SAGA_COMPENSATION_ERROR",originalError:u,compensationErrors:m};if(t?.onError?.(s),t?.throwOnCompensationFailure)throw s;return U(s)}return t?.onError?.(u),ne(f)?U(u):U({type:"UNEXPECTED_ERROR",cause:{type:"UNCAUGHT_EXCEPTION",thrown:f}})}}}async function Je(e,r){let t=crypto.randomUUID(),l=performance.now(),k=[],w=C=>{r?.onEvent?.(C)};w({type:"saga_start",sagaId:t,ts:Date.now()});async function R(C){let o=[];w({type:"saga_compensation_start",sagaId:t,ts:Date.now(),stepCount:k.length});let f=performance.now();for(let p=k.length-1;p>=0;p--){let u=k[p];try{await u.compensate(u.value),w({type:"saga_compensation_step",sagaId:t,stepName:u.name,ts:Date.now(),success:!0})}catch(m){o.push({stepName:u.name,error:m}),w({type:"saga_compensation_step",sagaId:t,stepName:u.name,ts:Date.now(),success:!1,error:m})}}return w({type:"saga_compensation_end",sagaId:t,ts:Date.now(),durationMs:performance.now()-f,success:o.length===0,failedCount:o.length}),o}let E={step:async function(o,f,p){if(typeof o!="string"||o.length===0)throw new TypeError("saga.step(name, operation, options?): first argument must be a string (step name). Example: saga.step('createOrder', () => deps.createOrder(), { compensate: (o) => deps.cancelOrder(o) })");let u=await f();if(u.ok)return p?.compensate&&k.push({name:o,value:u.value,compensate:p.compensate}),u.value;throw re(u.error,{origin:"result",resultCause:u.cause})},tryStep:async function(o,f,p){if(typeof o!="string"||o.length===0)throw new TypeError("saga.tryStep(name, operation, options): first argument must be a string (step name). Example: saga.tryStep('riskyOp', () => deps.riskyOp(), { error: 'RISKY_FAILED' })");let u="error"in p?()=>p.error:p.onError;try{let m=await f();return p.compensate&&k.push({name:o,value:m,compensate:p.compensate}),m}catch(m){let s=u(m);throw re(s,{origin:"throw",thrown:m})}},getCompensations(){return k.map(C=>({name:C.name,hasValue:C.value!==void 0}))}};try{let C=await e({saga:E}),o=performance.now()-l;return w({type:"saga_success",sagaId:t,ts:Date.now(),durationMs:o}),K(C)}catch(C){let o=performance.now()-l,f;ne(C)?f=C.error:f=C,w({type:"saga_error",sagaId:t,ts:Date.now(),durationMs:o,error:f});let p=await R(f);if(p.length>0){let u={type:"SAGA_COMPENSATION_ERROR",originalError:f,compensationErrors:p};if(r?.onError?.(u),r?.throwOnCompensationFailure)throw u;return U(u)}return r?.onError?.(f),ne(C)?U(f):U({type:"UNEXPECTED_ERROR",cause:{type:"UNCAUGHT_EXCEPTION",thrown:C}})}}function W(...e){let r={};for(let t of e)t.key!==void 0&&(r.key=t.key),t.retry!==void 0&&(r.retry=r.retry?{...r.retry,...t.retry}:{...t.retry}),t.timeout!==void 0&&(r.timeout=r.timeout?{...r.timeout,...t.timeout}:{...t.timeout});return r}function Ge(...e){let r=W(...e);return t=>W(r,t??{})}function Ze(e,...r){return{name:e,policy:W(...r)}}function X(e){return{retry:e}}var se={none:X({attempts:1}),transient:X({attempts:3,backoff:"exponential",initialDelay:100,maxDelay:1e3,jitter:!0}),standard:X({attempts:3,backoff:"exponential",initialDelay:200,maxDelay:5e3,jitter:!0}),aggressive:X({attempts:5,backoff:"exponential",initialDelay:500,maxDelay:3e4,jitter:!0}),fixed:(e,r)=>X({attempts:e,backoff:"fixed",initialDelay:r,jitter:!1}),linear:(e,r)=>X({attempts:e,backoff:"linear",initialDelay:r,jitter:!0}),custom:e=>X({backoff:"exponential",initialDelay:100,maxDelay:3e4,jitter:!0,...e})};function q(e){return{timeout:e}}var oe={none:{},fast:q({ms:1e3}),api:q({ms:5e3}),extended:q({ms:3e4}),long:q({ms:12e4}),ms:e=>q({ms:e}),seconds:e=>q({ms:e*1e3}),withError:(e,r)=>q({ms:e,error:r}),withSignal:e=>q({ms:e,signal:!0})},et={httpApi:W(oe.api,se.standard),database:W(oe.extended,X({attempts:2,backoff:"exponential",initialDelay:100,maxDelay:2e3,jitter:!0})),cache:W(oe.fast,se.none),messageQueue:W(oe.extended,se.aggressive),fileSystem:W(oe.long,se.standard),rateLimited:W(q({ms:1e4}),X({attempts:5,backoff:"linear",initialDelay:1e3,maxDelay:1e4,jitter:!0}))};function Pe(e,r){return W(e,r??{})}function tt(e,r){let t=r??{};return W(...e,t)}function rt(e,r,t={}){return e?r:t}function nt(e,r=process.env.NODE_ENV??"development",t={}){return e[r]??t}function ot(){let e=new Map;return{register(r,t){e.set(r,t)},get(r){return e.get(r)},has(r){return e.has(r)},names(){return Array.from(e.keys())},apply(r,t){let l=e.get(r);if(!l)throw new Error(`Policy not found: ${r}`);return Pe(l,t)}}}function st(){let e=[],r={key(t){return e.push({key:t}),r},policy(t){return e.push(t),r},timeout(t){return e.push(q({ms:t})),r},retry(t){return e.push(X(t)),r},retries(t){return e.push(se.custom({attempts:t})),r},build(){return W(...e)}};return r}export{ie as CircuitOpenError,Ve as circuitBreakerPresets,rt as conditionalPolicy,We as createCircuitBreaker,Xe as createCombinedLimiter,be as createConcurrencyLimiter,Ye as createCostBasedRateLimiter,Qe as createFixedWindowLimiter,Ge as createPolicyApplier,Ze as createPolicyBundle,ot as createPolicyRegistry,he as createRateLimiter,He as createSagaWorkflow,nt as envPolicy,Ke as isCircuitOpenError,Se as isQueueFullError,qe as isRateLimitExceededError,ze as isSagaCompensationError,W as mergePolicies,$e as rateLimiterPresets,se as retryPolicies,X as retryPolicy,Je as runSaga,et as servicePolicies,st as stepOptions,oe as timeoutPolicies,q as timeoutPolicy,tt as withPolicies,Pe as withPolicy};
6
+ See: https://jagreehal.github.io/awaitly/guides/troubleshooting/#returning-ok-from-workflow-executor-double-wrapping`)}return K(Q)}catch(k){if(Qe(k))throw k.thrown;if(F(k)){let X=k.meta.origin==="throw"?k.meta.thrown:k.meta.origin==="result"?k.meta.resultCause:void 0;return N(k.error,{cause:X})}let z=y(k);return r?.(z,"unexpected",E),N(z,{cause:k})}}Me.strict=(t,e)=>Me(t,e);async function De(t){return t.length===0?K([]):new Promise(e=>{let r=!1,m=t.length,g=new Array(t.length);for(let l=0;l<t.length;l++){let T=l;Promise.resolve(t[T]).catch(E=>N({type:"PROMISE_REJECTED",cause:E},{cause:{type:"PROMISE_REJECTION",reason:E}})).then(E=>{if(!r){if(!E.ok){r=!0,e(E);return}g[T]=E.value,m--,m===0&&e(K(g))}})}})}var pe=class extends Error{type="CIRCUIT_OPEN";circuitName;state;retryAfterMs;constructor(e){super(e.message??`Circuit breaker "${e.circuitName}" is ${e.state}. Retry after ${Math.ceil(e.retryAfterMs/1e3)}s`),this.name="CircuitOpenError",this.circuitName=e.circuitName,this.state=e.state,this.retryAfterMs=e.retryAfterMs}};function Je(t){return typeof t=="object"&&t!==null&&t.type==="CIRCUIT_OPEN"}var Ge={failureThreshold:5,resetTimeout:3e4,windowSize:6e4,halfOpenMax:3};function Ze(t,e){let r={...Ge,...e},m="CLOSED",g=[],l=null,T=null,E=0,R=0;function o(){let S=Date.now();g=g.filter(F=>S-F.timestamp<r.windowSize)}function y(S){if(m!==S){let F=m;m=S,S==="HALF_OPEN"&&(R=0),r.onStateChange?.(F,S,t)}}function c(){return m!=="OPEN"||l===null?!1:Date.now()-l>=r.resetTimeout?(y("HALF_OPEN"),!0):!1}function u(){T=Date.now(),E++,m==="HALF_OPEN"&&(R++,R>=r.halfOpenMax&&(y("CLOSED"),g=[]))}function d(S){let F=Date.now();l=F,o(),g.push({timestamp:F,error:S}),(m==="HALF_OPEN"||m==="CLOSED"&&g.length>=r.failureThreshold)&&y("OPEN")}function s(){if(m==="CLOSED")return 0;if(m==="OPEN"){if(c())return 0;let S=Date.now(),F=l?S-l:0;return Math.max(0,r.resetTimeout-F)}return 0}return{async execute(S,F){let j=s();if(j>0)throw new pe({circuitName:t,state:m,retryAfterMs:j});try{let W=await S();return u(),W}catch(W){throw d(W),W}},async executeResult(S,F){let j=s();if(j>0)return N(new pe({circuitName:t,state:m,retryAfterMs:j}));try{let W=await S();return W.ok?u():d(W.error),W}catch(W){throw d(W),W}},getState(){return m==="OPEN"&&c(),m},getStats(){return o(),{state:this.getState(),failureCount:g.length,successCount:E,lastFailureTime:l,lastSuccessTime:T,halfOpenSuccesses:R}},reset(){y("CLOSED"),g=[],R=0},forceOpen(){l=Date.now(),y("OPEN")},recordSuccess(){u()},recordFailure(S){d(S??new Error("Manual failure"))}}}var et={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 tt(t){return typeof t=="object"&&t!==null&&t.type==="RATE_LIMIT_EXCEEDED"}function Ue(t){return typeof t=="object"&&t!==null&&t.type==="QUEUE_FULL"}function Le(t,e){let{maxPerSecond:r,strategy:m="wait"}=e,g=e.burstCapacity??r*2,l=g,T=Date.now(),E=r/1e3,R=[];function o(){let u=Date.now(),s=(u-T)*E;l=Math.min(g,l+s),T=u}function y(){if(o(),l>=1)return l-=1,0;let u=1-l;return Math.ceil(u/E)}async function c(){return new Promise(u=>{let d=()=>{let s=y();s===0?u():(R.push(d),setTimeout(()=>{let S=R.indexOf(d);S!==-1&&(R.splice(S,1),d())},s))};d()})}return{async execute(u){let d=y();if(d>0){if(m==="reject")throw{type:"RATE_LIMIT_EXCEEDED",limiterName:t,retryAfterMs:d};await c()}return u()},async executeResult(u){let d=y();if(d>0){if(m==="reject")return N({type:"RATE_LIMIT_EXCEEDED",limiterName:t,retryAfterMs:d});await c()}return u()},getStats(){return o(),{availableTokens:Math.floor(l),maxTokens:g,tokensPerSecond:r,waitingCount:R.length}},reset(){l=g,T=Date.now(),R.length=0}}}function Fe(t,e){let{maxConcurrent:r,strategy:m="queue",maxQueueSize:g=1/0}=e,l=0,T=[];async function E(){if(l<r){l++;return}if(m==="reject")throw{type:"QUEUE_FULL",limiterName:t,queueSize:T.length,maxQueueSize:g};if(T.length>=g)throw{type:"QUEUE_FULL",limiterName:t,queueSize:T.length,maxQueueSize:g};return new Promise((o,y)=>{T.push({resolve:o,reject:y})})}function R(){l--,T.length>0&&l<r&&(l++,T.shift()?.resolve())}return{async execute(o){await E();try{return await o()}finally{R()}},async executeAll(o){let y=new Array(o.length),c=[];for(let u=0;u<o.length;u++){let d=u,s=this.execute(o[d]).then(S=>{y[d]=S});c.push(s)}return await Promise.all(c),y},async executeResult(o){try{await E()}catch(y){if(Ue(y))return N(y);throw y}try{return await o()}finally{R()}},getStats(){return{activeCount:l,maxConcurrent:r,queueSize:T.length,maxQueueSize:g}},reset(){for(l=0;T.length>0;)T.shift()?.reject(new Error("Limiter reset"))}}}function rt(t,e){let r=e.rate?Le(`${t}-rate`,e.rate):void 0,m=e.concurrency?Fe(`${t}-concurrency`,e.concurrency):void 0;return{rate:r,concurrency:m,async execute(g){let l=g;if(r){let T=l;l=()=>r.execute(T)}return m?m.execute(l):l()}}}function nt(t,e){let{limit:r,windowMs:m=1e3,strategy:g="wait"}=e,l=Date.now(),T=0,E=[];function R(){let c=Date.now(),u=c-l;return u>=m?(l=c,T=0,0):m-u}function o(c){let u=R();return T+c<=r?(T+=c,0):u}async function y(c){return new Promise(u=>{let d=()=>{let s=o(c);s===0?u():(E.push({resolve:d,cost:c}),setTimeout(()=>{let S=E.findIndex(F=>F.resolve===d);S!==-1&&(E.splice(S,1),d())},s))};d()})}return{async execute(c,u=1){if(u>r)throw{type:"RATE_LIMIT_EXCEEDED",limiterName:t,retryAfterMs:m};let d=o(u);if(d>0){if(g==="reject")throw{type:"RATE_LIMIT_EXCEEDED",limiterName:t,retryAfterMs:d};await y(u)}return c()},async executeResult(c,u=1){if(u>r)return N({type:"RATE_LIMIT_EXCEEDED",limiterName:t,retryAfterMs:m});let d=o(u);if(d>0){if(g==="reject")return N({type:"RATE_LIMIT_EXCEEDED",limiterName:t,retryAfterMs:d});await y(u)}return c()},getStats(){let c=R();return{requestCount:T,limit:r,windowMs:m,remainingMs:c,waitingCount:E.length}},reset(){l=Date.now(),T=0,E.length=0}}}function ot(t,e){let{tokensPerSecond:r,strategy:m="wait"}=e,g=e.maxTokens??r*2,l=g,T=Date.now(),E=r/1e3,R=[];function o(){let u=Date.now(),s=(u-T)*E;l=Math.min(g,l+s),T=u}function y(u){if(o(),l>=u)return l-=u,0;let d=u-l;return Math.ceil(d/E)}async function c(u){return new Promise(d=>{let s=()=>{let S=y(u);S===0?d():(R.push({check:s,cost:u}),setTimeout(()=>{let F=R.findIndex(j=>j.check===s);F!==-1&&(R.splice(F,1),s())},S))};s()})}return{async execute(u,d=1){if(d>g)throw{type:"RATE_LIMIT_EXCEEDED",limiterName:t,retryAfterMs:Math.ceil(d/E)};let s=y(d);if(s>0){if(m==="reject")throw{type:"RATE_LIMIT_EXCEEDED",limiterName:t,retryAfterMs:s};await c(d)}return u()},async executeResult(u,d=1){if(d>g)return N({type:"RATE_LIMIT_EXCEEDED",limiterName:t,retryAfterMs:Math.ceil(d/E)});let s=y(d);if(s>0){if(m==="reject")return N({type:"RATE_LIMIT_EXCEEDED",limiterName:t,retryAfterMs:s});await c(d)}return u()},getStats(){return o(),{availableTokens:l,maxTokens:g,tokensPerSecond:r,waitingCount:R.length}},reset(){l=g,T=Date.now(),R.length=0}}}var st={api:{maxPerSecond:10,burstCapacity:20,strategy:"wait"},database:{maxConcurrent:10,strategy:"queue",maxQueueSize:100},external:{maxPerSecond:5,burstCapacity:10,strategy:"wait"}};function at(t){return typeof t=="object"&&t!==null&&t.type==="SAGA_COMPENSATION_ERROR"}function it(t,e,r){if(typeof t!="string"||t.length===0)throw new TypeError("createSagaWorkflow(workflowName, deps, options?): first argument must be a non-empty string. Example: createSagaWorkflow('checkout', { reserveInventory, chargeCard })");return async m=>{let g=crypto.randomUUID(),l=performance.now(),T=[],E=y=>{let c=y.workflowName===void 0?{...y,workflowName:t}:y;r?.onEvent?.(c)};E({type:"saga_start",sagaId:g,ts:Date.now()});async function R(y){let c=[];E({type:"saga_compensation_start",sagaId:g,ts:Date.now(),stepCount:T.length});let u=performance.now();for(let d=T.length-1;d>=0;d--){let s=T[d];try{await s.compensate(s.value),E({type:"saga_compensation_step",sagaId:g,stepName:s.name,ts:Date.now(),success:!0})}catch(S){c.push({stepName:s.name,error:S}),E({type:"saga_compensation_step",sagaId:g,stepName:s.name,ts:Date.now(),success:!1,error:S})}}return E({type:"saga_compensation_end",sagaId:g,ts:Date.now(),durationMs:performance.now()-u,success:c.length===0,failedCount:c.length}),c}let o={step:async function(c,u,d){if(typeof c!="string"||c.length===0)throw new TypeError("saga.step(name, operation, options?): first argument must be a string (step name). Example: saga.step('createOrder', () => deps.createOrder(), { compensate: (o) => deps.cancelOrder(o) })");let s=await u();if(s.ok)return d?.compensate&&T.push({name:c,value:s.value,compensate:d.compensate}),s.value;throw oe(s.error,{origin:"result",resultCause:s.cause})},tryStep:async function(c,u,d){if(typeof c!="string"||c.length===0)throw new TypeError("saga.tryStep(name, operation, options): first argument must be a string (step name). Example: saga.tryStep('riskyOp', () => deps.riskyOp(), { error: 'RISKY_FAILED' })");let s="error"in d?()=>d.error:d.onError;try{let S=await u();return d.compensate&&T.push({name:c,value:S,compensate:d.compensate}),S}catch(S){let F=s(S);throw oe(F,{origin:"throw",thrown:S})}},getCompensations(){return T.map(y=>({name:y.name,hasValue:y.value!==void 0}))}};try{let y=await m({saga:o,deps:e}),c=performance.now()-l;return E({type:"saga_success",sagaId:g,ts:Date.now(),durationMs:c}),K(y)}catch(y){let c=performance.now()-l,u;se(y)?u=y.error:u=y,E({type:"saga_error",sagaId:g,ts:Date.now(),durationMs:c,error:u});let d=await R(u);if(d.length>0){let s={type:"SAGA_COMPENSATION_ERROR",originalError:u,compensationErrors:d};if(r?.onError?.(s),r?.throwOnCompensationFailure)throw s;return N(s)}return r?.onError?.(u),se(y)?N(u):N(new ee({cause:y}))}}}async function ut(t,e){let r=crypto.randomUUID(),m=performance.now(),g=[],l=R=>{e?.onEvent?.(R)};l({type:"saga_start",sagaId:r,ts:Date.now()});async function T(R){let o=[];l({type:"saga_compensation_start",sagaId:r,ts:Date.now(),stepCount:g.length});let y=performance.now();for(let c=g.length-1;c>=0;c--){let u=g[c];try{await u.compensate(u.value),l({type:"saga_compensation_step",sagaId:r,stepName:u.name,ts:Date.now(),success:!0})}catch(d){o.push({stepName:u.name,error:d}),l({type:"saga_compensation_step",sagaId:r,stepName:u.name,ts:Date.now(),success:!1,error:d})}}return l({type:"saga_compensation_end",sagaId:r,ts:Date.now(),durationMs:performance.now()-y,success:o.length===0,failedCount:o.length}),o}let E={step:async function(o,y,c){if(typeof o!="string"||o.length===0)throw new TypeError("saga.step(name, operation, options?): first argument must be a string (step name). Example: saga.step('createOrder', () => deps.createOrder(), { compensate: (o) => deps.cancelOrder(o) })");let u=await y();if(u.ok)return c?.compensate&&g.push({name:o,value:u.value,compensate:c.compensate}),u.value;throw oe(u.error,{origin:"result",resultCause:u.cause})},tryStep:async function(o,y,c){if(typeof o!="string"||o.length===0)throw new TypeError("saga.tryStep(name, operation, options): first argument must be a string (step name). Example: saga.tryStep('riskyOp', () => deps.riskyOp(), { error: 'RISKY_FAILED' })");let u="error"in c?()=>c.error:c.onError;try{let d=await y();return c.compensate&&g.push({name:o,value:d,compensate:c.compensate}),d}catch(d){let s=u(d);throw oe(s,{origin:"throw",thrown:d})}},getCompensations(){return g.map(R=>({name:R.name,hasValue:R.value!==void 0}))}};try{let R=await t({saga:E}),o=performance.now()-m;return l({type:"saga_success",sagaId:r,ts:Date.now(),durationMs:o}),K(R)}catch(R){let o=performance.now()-m,y;se(R)?y=R.error:y=R,l({type:"saga_error",sagaId:r,ts:Date.now(),durationMs:o,error:y});let c=await T(y);if(c.length>0){let u={type:"SAGA_COMPENSATION_ERROR",originalError:y,compensationErrors:c};if(e?.onError?.(u),e?.throwOnCompensationFailure)throw u;return N(u)}return e?.onError?.(y),se(R)?N(y):N(new ee({cause:R}))}}function $(...t){let e={};for(let r of t)r.key!==void 0&&(e.key=r.key),r.retry!==void 0&&(e.retry=e.retry?{...e.retry,...r.retry}:{...r.retry}),r.timeout!==void 0&&(e.timeout=e.timeout?{...e.timeout,...r.timeout}:{...r.timeout});return e}function ct(...t){let e=$(...t);return r=>$(e,r??{})}function pt(t,...e){return{name:t,policy:$(...e)}}function q(t){return{retry:t}}var ie={none:q({attempts:1}),transient:q({attempts:3,backoff:"exponential",initialDelay:100,maxDelay:1e3,jitter:!0}),standard:q({attempts:3,backoff:"exponential",initialDelay:200,maxDelay:5e3,jitter:!0}),aggressive:q({attempts:5,backoff:"exponential",initialDelay:500,maxDelay:3e4,jitter:!0}),fixed:(t,e)=>q({attempts:t,backoff:"fixed",initialDelay:e,jitter:!1}),linear:(t,e)=>q({attempts:t,backoff:"linear",initialDelay:e,jitter:!0}),custom:t=>q({backoff:"exponential",initialDelay:100,maxDelay:3e4,jitter:!0,...t})};function H(t){return{timeout:t}}var ae={none:{},fast:H({ms:1e3}),api:H({ms:5e3}),extended:H({ms:3e4}),long:H({ms:12e4}),ms:t=>H({ms:t}),seconds:t=>H({ms:t*1e3}),withError:(t,e)=>H({ms:t,error:e}),withSignal:t=>H({ms:t,signal:!0})},lt={httpApi:$(ae.api,ie.standard),database:$(ae.extended,q({attempts:2,backoff:"exponential",initialDelay:100,maxDelay:2e3,jitter:!0})),cache:$(ae.fast,ie.none),messageQueue:$(ae.extended,ie.aggressive),fileSystem:$(ae.long,ie.standard),rateLimited:$(H({ms:1e4}),q({attempts:5,backoff:"linear",initialDelay:1e3,maxDelay:1e4,jitter:!0}))};function je(t,e){return $(t,e??{})}function mt(t,e){let r=e??{};return $(...t,r)}function Et(t,e,r={}){return t?e:r}function dt(t,e=process.env.NODE_ENV??"development",r={}){return t[e]??r}function yt(){let t=new Map;return{register(e,r){t.set(e,r)},get(e){return t.get(e)},has(e){return t.has(e)},names(){return Array.from(t.keys())},apply(e,r){let m=t.get(e);if(!m)throw new Error(`Policy not found: ${e}`);return je(m,r)}}}function ft(){let t=[],e={key(r){return t.push({key:r}),e},policy(r){return t.push(r),e},timeout(r){return t.push(H({ms:r})),e},retry(r){return t.push(q(r)),e},retries(r){return t.push(ie.custom({attempts:r})),e},build(){return $(...t)}};return e}export{pe as CircuitOpenError,et as circuitBreakerPresets,Et as conditionalPolicy,Ze as createCircuitBreaker,rt as createCombinedLimiter,Fe as createConcurrencyLimiter,ot as createCostBasedRateLimiter,nt as createFixedWindowLimiter,ct as createPolicyApplier,pt as createPolicyBundle,yt as createPolicyRegistry,Le as createRateLimiter,it as createSagaWorkflow,dt as envPolicy,Je as isCircuitOpenError,Ue as isQueueFullError,tt as isRateLimitExceededError,at as isSagaCompensationError,$ as mergePolicies,st as rateLimiterPresets,ie as retryPolicies,q as retryPolicy,ut as runSaga,lt as servicePolicies,ft as stepOptions,ae as timeoutPolicies,H as timeoutPolicy,mt as withPolicies,je as withPolicy};
7
7
  //# sourceMappingURL=reliability.js.map