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
@@ -1,7 +1,7 @@
1
- "use strict";var we=Object.defineProperty;var He=Object.getOwnPropertyDescriptor;var Je=Object.getOwnPropertyNames;var Ge=Object.prototype.hasOwnProperty;var Ze=(e,t)=>{for(var r in t)we(e,r,{get:t[r],enumerable:!0})},et=(e,t,r,l)=>{if(t&&typeof t=="object"||typeof t=="function")for(let T of Je(t))!Ge.call(e,T)&&T!==r&&we(e,T,{get:()=>t[T],enumerable:!(l=He(t,T))||l.enumerable});return e};var tt=e=>et(we({},"__esModule",{value:!0}),e);var Et={};Ze(Et,{CircuitOpenError:()=>ae,circuitBreakerPresets:()=>ve,conditionalPolicy:()=>qe,createCircuitBreaker:()=>_e,createCombinedLimiter:()=>Me,createConcurrencyLimiter:()=>Re,createCostBasedRateLimiter:()=>Ue,createFixedWindowLimiter:()=>Ie,createPolicyApplier:()=>Ke,createPolicyBundle:()=>Be,createPolicyRegistry:()=>Qe,createRateLimiter:()=>ke,createSagaWorkflow:()=>Fe,envPolicy:()=>Xe,isCircuitOpenError:()=>Oe,isQueueFullError:()=>ge,isRateLimitExceededError:()=>De,isSagaCompensationError:()=>Le,mergePolicies:()=>B,rateLimiterPresets:()=>Ne,retryPolicies:()=>ee,retryPolicy:()=>q,runSaga:()=>je,servicePolicies:()=>We,stepOptions:()=>Ye,timeoutPolicies:()=>Z,timeoutPolicy:()=>V,withPolicies:()=>Ve,withPolicy:()=>Ce});module.exports=tt(Et);function rt(e){let t=e.trim().match(/^(\d+(?:\.\d+)?)\s*(ms|s|m|h|d)$/i);if(!t)return;let r=parseFloat(t[1]),l=t[2].toLowerCase();return{_tag:"Duration",millis:r*({ms:1,s:1e3,m:6e4,h:36e5,d:864e5}[l]??1)}}var nt="UNEXPECTED_ERROR";function ot(e){return nt}function K(e){return{ok:!0,value:e}}function U(e,t){let r=t?.cause;return{ok:!1,error:e,...r!==void 0?{cause:r}:{}}}function st(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 r=t._tag.trim();if(r)return r}if(typeof t.tag=="string"){let r=t.tag.trim();if(r)return r}if(typeof t.code=="string"){let r=t.code.trim();if(r)return r}else if(typeof t.code=="number")return String(t.code);if(e instanceof Error&&e.name){let r=e.name.trim();if(r)return r}}return"unknown"}function at(e,t){if(!(!t||!e))return t[e]}function it(e){let{intent:t,domain:r,owner:l,tags:T,stateChanges:w,emits:R,calls:E}=e;if(!t&&!r&&!l&&!T?.length&&!w?.length&&!R?.length&&!E?.length)return;let C={};return t&&(C.intent=t),r&&(C.domain=r),l&&(C.owner=l),T?.length&&(C.tags=T),w?.length&&(C.stateChanges=w),R?.length&&(C.emits=R),E?.length&&(C.calls=E),C}function X(e,t,r,l,T){let w=st(e),R=at(w,t),E={tag:w,origin:r};return R!==void 0&&(E.classification=R),l!==void 0&&(E.attempt=l),T!==void 0&&(E.cumulativeDurationMs=T),E}var ne=Symbol.for("step_timeout_marker");function xe(e){return typeof e!="object"||e===null?!1:e.type==="STEP_TIMEOUT"?!0:ne in e}function ut(e){if(!(typeof e!="object"||e===null)){if(e.type==="STEP_TIMEOUT"){let t=e;return{timeoutMs:t.timeoutMs,stepName:t.stepName,stepKey:t.stepKey,attempt:t.attempt}}if(ne in e)return e[ne]}}var Pe=Symbol("early-exit");function oe(e,t){return{[Pe]:!0,error:e,meta:t}}function se(e){return typeof e=="object"&&e!==null&&e[Pe]===!0}var Ae=Symbol("mapper-exception");function te(e){return{[Ae]:!0,thrown:e}}function ct(e){return typeof e=="object"&&e!==null&&e[Ae]===!0}function fe(e,t){let{backoff:r,initialDelay:l,maxDelay:T,jitter:w}=t,R;switch(r){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,T),w){let E=R*.25*Math.random();R=R+E}return Math.floor(R)}function Te(e){return new Promise(t=>setTimeout(t,e))}var Se=Symbol("timeout"),pe=Symbol("timeout-option");function pt(e){return typeof e=="object"&&e!==null&&e[pe]===!0}async function lt(e,t,r,l){let T=new AbortController,w=t.onTimeout??"error",R=()=>typeof w=="function"?w({name:r.name,key:r.key,ms:t.ms}):t.error??{type:"STEP_TIMEOUT",stepName:r.name,stepKey:r.key,timeoutMs:t.ms,attempt:r.attempt},E;l?.aborted&&T.abort(l.reason);let C;l&&!l.aborted&&(C=()=>T.abort(l.reason),l.addEventListener("abort",C,{once:!0}));let o=new Promise((p,u)=>{E=setTimeout(()=>{if(w!=="disconnect"&&T.abort(),w==="option"){u({[pe]:!0,ms:t.ms});return}u({[Se]:!0,error:R()})},t.ms)}),f;t.signal?f=Promise.resolve(e(T.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:t.ms};if(typeof p=="object"&&p!==null&&p[Se]===!0){w==="disconnect"&&f.catch(()=>{});let u=p.error;if(typeof u=="object"&&u!==null&&u.type!=="STEP_TIMEOUT"){let m={timeoutMs:t.ms,stepName:r.name,stepKey:r.key,attempt:r.attempt};ne in u?u[ne]=m:Object.defineProperty(u,ne,{value:m,enumerable:!1,writable:!0,configurable:!1})}throw u}throw p}finally{clearTimeout(E),C&&l&&l.removeEventListener("abort",C)}}var re={backoff:"exponential",initialDelay:100,maxDelay:3e4,jitter:!0,retryOn:()=>!0,onRetry:()=>{}};async function he(e,t){let{onError:r,onEvent:l,catchUnexpected:T,workflowId:w,workflowName:R,context:E,_workflowSignal:C}=t&&typeof t=="object"?t:{},o=w??crypto.randomUUID(),f=T??ot,p=[],u=0,m=g=>g??`step_${++u}`,s=g=>{let Q=g.context!==void 0||E===void 0?g:{...g,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=oe,F=g=>se(g),j=(g,Q)=>g,W=g=>typeof g=="function"?!1:!!(g&&typeof g=="object"&&"ok"in g||g&&typeof g=="object"&&"then"in g&&typeof g.then=="function");try{let Q=function(c){let k={};for(let[i,a]of Object.entries(c))if(typeof a=="function")k[i]=a;else if(a&&typeof a=="object"&&"fn"in a)k[i]=a.fn;else throw new TypeError(`step.parallel: operation "${i}" must be a function or { fn, errors? } object`);return k},z=function(c,k){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 k();if(y(),!d.ok)throw r?.(d.error,c,E),S(d.error,{origin:"result",resultCause:d.cause});return d.value}catch(d){throw y(),d}})()},ue=function(c,k){let i=Object.keys(c),a=k.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 r?.(M.error,A,E),S(M.error,{origin:"result",resultCause:M.cause});b[A]=M.value}return b}catch(h){throw x(),h}})()};var yt=Q,dt=z,wt=ue;let g=(c,k,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=it(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,_=W(k)?()=>k:k,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};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 $e=L?performance.now():0;try{let P;if(A?P=await lt(_,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=fe(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:X(P.error,a.errorMeta,"result",I,performance.now()-O)}),v.onRetry(P.error,I,J),await Te(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:X(P.error,a.errorMeta,"result",I,performance.now()-O)});break}catch(P){let J=performance.now()-$e;if(pt(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:X(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(xe(P)){let $=ut(P),ze=A?.ms??$?.timeoutMs??0;if(s({type:"step_timeout",workflowId:o,stepId:M,stepKey:d,name:y,ts:Date.now(),timeoutMs:ze,attempt:I,...n&&{metadata:n},diagnostics:X(P,a.errorMeta,"timeout",I)}),I<v.attempts&&v.retryOn(P,I)){let de=fe(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:X(P,a.errorMeta,"timeout",I,performance.now()-O)}),v.onRetry(P,I,de),await Te(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:X(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:X(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}}),r?.(P,y,E),S(P,{origin:"throw",thrown:P})}if(I<v.attempts&&v.retryOn(P,I)){let $=fe(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:X(P,a.errorMeta,"throw",I,performance.now()-O)}),v.onRetry(P,I,$),await Te($);continue}v.attempts>1&&!xe(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:X(P,a.errorMeta,"throw",I,performance.now()-O)});let Ee=performance.now()-O,ie;try{ie=f(P)}catch($){throw te($)}throw s({type:"step_error",workflowId:o,stepId:M,stepKey:d,name:y,description:h,ts:Date.now(),durationMs:Ee,error:ie,...n&&{metadata:n},diagnostics:X(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(ie,{cause:P}),meta:{origin:"throw",thrown:P},...n&&{metadata:n}}),r?.(ie,y,E),S(ie,{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:X(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}}),r?.(me,y,E),S(me,{origin:"result",resultCause:H.cause})})();g.try=(c,k,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 k(),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}}),r?.(L,n,E),S(L,{origin:"throw",thrown:b})}})()},g.fromResult=(c,k,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 k();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}}),r?.(L,n,E),S(L,{origin:"result",resultCause:b.error})}})()},g.fromNullable=(c,k,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 g(c,async()=>{let n=await k();return n!=null?K(n):U(i())},a)},g.retry=(c,k,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 g(c,k,{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})},g.withTimeout=(c,k,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 g(c,k,{key:i.key??c,timeout:i})},g.sleep=(c,k,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 k=="string"?rt(k):k;if(!a)throw new Error(`step.sleep: invalid duration '${k}'`);let n=a.millis,y=i?.signal;return g(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})},g.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 k=c[0],i=c[1];if(typeof i=="function")return z(k,i);if(i&&typeof i=="object"&&!Array.isArray(i)){let n=Q(i);return ue(n,{name:k})}throw new TypeError("step.parallel(name, ...): second argument must be a function (array form) or an object of operations (object form).")}),g.race=(c,k)=>{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 k();if(d(),!x.ok)throw r?.(x.error,c,E),S(x.error,{origin:"result",resultCause:x.cause});return x.value}catch(x){throw d(),x}})()},g.allSettled=(c,k)=>{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 k();if(y(),!d.ok)throw r?.(d.error,c,E),S(d.error,{origin:"result",resultCause:d.cause});return d.value}catch(d){throw y(),d}})()},g.if=(c,k,i)=>i(),g.label=g.if,g.branch=async(c,k)=>{let{condition:i,then:a,else:n}=k;if(i())return await a();if(n)return await n()},g.arm=(c,k)=>({fn:c,errors:k}),g.forEach=async(c,k,i)=>{let a=[],n=i.maxIterations,y=0,d="run"in i,x=Symbol.asyncIterator in k?k:(async function*(){yield*k})();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,g),a.push(b),y++}return a},g.item=c=>({__forEachItemHandler:!0,handler:c}),g.dep=(c,k)=>k,g.run=(c,k,i)=>g(c,()=>k,i),g.workflow=(c,k,i)=>g(c,k,i),g.andThen=(c,k,i,a)=>g(c,()=>i(k),a),g.match=async(c,k,i,a)=>g(c,async()=>{let n=await k;return n.ok?K(await i.ok(n.value)):K(await i.err(n.error,n.cause))},a),g.all=g.parallel,g.map=async(c,k,i,a)=>{let n=a?.concurrency??k.length;return g(c,()=>n>=k.length?be(k.map((y,d)=>i(y,d))):(async()=>{let y=[];for(let d=0;d<k.length;d+=n){let x=k.slice(d,d+n),h=await be(x.map((b,A)=>i(b,d+A)));if(!h.ok)return h;y.push(...h.value)}return K(y)})(),{key:a?.key})},g.withFallback=(c,k,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 k()}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 te(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}}),r?.(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 te(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}}),r?.(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}}),r?.(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}}),r?.(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 te(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}}),r?.(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}}),r?.(L,n,E),S(L,{origin:"result",resultCause:A.cause})})()},g.withResource=(c,k)=>{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 k.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 te(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:_}}),r?.(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}}),r?.(D,a,E),S(D,{origin:"result",resultCause:x.cause})}let h=x.value,b,A,M=!1;try{b=await k.use(h)}catch(_){if(F(_)){try{await k.release(h)}catch(D){console.warn(`[awaitly] step.withResource("${c}"): release threw after earlyExit:`,D)}throw _}A=_,M=!0}try{await k.release(h)}catch(_){console.warn(`[awaitly] step.withResource("${c}"): release threw:`,_)}if(M){let _;try{_=f(A)}catch(v){throw te(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}}),r?.(_,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}}),r?.(N,a,E),S(N,{origin:"result",resultCause:L.cause})})()};let Y=await e({step:g});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
+ "use strict";var Te=Object.defineProperty;var ut=Object.getOwnPropertyDescriptor;var ct=Object.getOwnPropertyNames;var pt=Object.prototype.hasOwnProperty;var lt=(t,e)=>{for(var r in e)Te(t,r,{get:e[r],enumerable:!0})},mt=(t,e,r,l)=>{if(e&&typeof e=="object"||typeof e=="function")for(let w of ct(e))!pt.call(t,w)&&w!==r&&Te(t,w,{get:()=>e[w],enumerable:!(l=ut(e,w))||l.enumerable});return t};var Et=t=>mt(Te({},"__esModule",{value:!0}),t);var St={};lt(St,{CircuitOpenError:()=>ue,circuitBreakerPresets:()=>$e,conditionalPolicy:()=>rt,createCircuitBreaker:()=>We,createCombinedLimiter:()=>He,createConcurrencyLimiter:()=>Se,createCostBasedRateLimiter:()=>ze,createFixedWindowLimiter:()=>qe,createPolicyApplier:()=>Ge,createPolicyBundle:()=>Ze,createPolicyRegistry:()=>ot,createRateLimiter:()=>Ce,createSagaWorkflow:()=>Xe,envPolicy:()=>nt,isCircuitOpenError:()=>Ke,isQueueFullError:()=>xe,isRateLimitExceededError:()=>Ve,isSagaCompensationError:()=>Ye,mergePolicies:()=>W,rateLimiterPresets:()=>Qe,retryPolicies:()=>re,retryPolicy:()=>H,runSaga:()=>Je,servicePolicies:()=>et,stepOptions:()=>st,timeoutPolicies:()=>te,timeoutPolicy:()=>V,withPolicies:()=>tt,withPolicy:()=>he});module.exports=Et(St);var pe=class extends Error{_tag};function B(t,e){return class extends pe{_tag=t;constructor(r,l){let w=e?.message?e.message(r??{}):t;if(super(w),this.name=t,Object.setPrototypeOf(this,new.target.prototype),r&&typeof r=="object"){let{_tag:m,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=l?.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=l?.cause)}else l?.cause!==void 0&&(this.cause=l.cause)}}}Object.defineProperty(B,Symbol.hasInstance,{value:t=>t instanceof pe});(w=>{function t(m){return m instanceof Error}w.isError=t;function e(m){return m instanceof pe}w.isTaggedError=e;function r(m,T){let E=m._tag,R=T[E];return R(m)}w.match=r;function l(m,T,E){let R=m._tag,o=T[R];return o?o(m):E(m)}w.matchPartial=l})(B||={});var be=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`}){},Pe=class extends B("RetryExhaustedError",{message:e=>e.operation?`RetryExhaustedError: ${e.operation} failed after ${e.attempts} attempts`:`RetryExhaustedError: Operation failed after ${e.attempts} attempts`}){},Ae=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`:""}`}){},Oe=class extends B("CircuitBreakerOpenError",{message:e=>`CircuitBreakerOpenError: Circuit ${e.circuitName} is ${e.state??"OPEN"}${e.retryAfterMs?`, retry after ${Math.ceil(e.retryAfterMs/1e3)}s`:""}`}){},_e=class extends B("ValidationError",{message:e=>`ValidationError: Invalid ${e.field} - ${e.reason}`}){},ve=class extends B("NotFoundError",{message:e=>e.id?`NotFoundError: ${e.resource} with id ${e.id} not found`:`NotFoundError: ${e.resource} not found`}){},Me=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"}){},De=class extends B("NetworkError",{message:e=>e.url?`NetworkError: ${e.reason} (${e.url})`:`NetworkError: ${e.reason}`}){},Ie=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 dt(t){let e=t.trim().match(/^(\d+(?:\.\d+)?)\s*(ms|s|m|h|d)$/i);if(!e)return;let r=parseFloat(e[1]),l=e[2].toLowerCase();return{_tag:"Duration",millis:r*({ms:1,s:1e3,m:6e4,h:36e5,d:864e5}[l]??1)}}function yt(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 ft(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 wt(t,e){if(!(!e||!t))return e[t]}function gt(t){let{intent:e,domain:r,owner:l,tags:w,stateChanges:m,emits:T,calls:E}=t;if(!e&&!r&&!l&&!w?.length&&!m?.length&&!T?.length&&!E?.length)return;let R={};return e&&(R.intent=e),r&&(R.domain=r),l&&(R.owner=l),w?.length&&(R.tags=w),m?.length&&(R.stateChanges=m),T?.length&&(R.emits=T),E?.length&&(R.calls=E),R}function q(t,e,r,l,w){let m=ft(t),T=wt(m,e),E={tag:m,origin:r};return T!==void 0&&(E.classification=T),l!==void 0&&(E.attempt=l),w!==void 0&&(E.cumulativeDurationMs=w),E}var se=Symbol.for("step_timeout_marker");function Ne(t){return typeof t!="object"||t===null?!1:t.type==="STEP_TIMEOUT"?!0:se in t}function Tt(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(se in t)return t[se]}}var je=Symbol("early-exit");function ae(t,e){return{[je]:!0,error:t,meta:e}}function ie(t){return typeof t=="object"&&t!==null&&t[je]===!0}var Be=Symbol("mapper-exception");function ne(t){return{[Be]:!0,thrown:t}}function kt(t){return typeof t=="object"&&t!==null&&t[Be]===!0}function ke(t,e){let{backoff:r,initialDelay:l,maxDelay:w,jitter:m}=e,T;switch(r){case"fixed":T=l;break;case"linear":T=l*t;break;case"exponential":T=l*Math.pow(2,t-1);break}if(T=Math.min(T,w),m){let E=T*.25*Math.random();T=T+E}return Math.floor(T)}function Re(t){return new Promise(e=>setTimeout(e,t))}var Ue=Symbol("timeout"),Ee=Symbol("timeout-option");function Rt(t){return typeof t=="object"&&t!==null&&t[Ee]===!0}async function xt(t,e,r,l){let w=new AbortController,m=e.onTimeout??"error",T=()=>typeof m=="function"?m({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;l?.aborted&&w.abort(l.reason);let R;l&&!l.aborted&&(R=()=>w.abort(l.reason),l.addEventListener("abort",R,{once:!0}));let o=new Promise((c,u)=>{E=setTimeout(()=>{if(m!=="disconnect"&&w.abort(),m==="option"){u({[Ee]:!0,ms:e.ms});return}u({[Ue]:!0,error:T()})},e.ms)}),y;e.signal?y=Promise.resolve(t(w.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[Ue]===!0){m==="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};se in u?u[se]=d:Object.defineProperty(u,se,{value:d,enumerable:!1,writable:!0,configurable:!1})}throw u}throw c}finally{clearTimeout(E),R&&l&&l.removeEventListener("abort",R)}}var oe={backoff:"exponential",initialDelay:100,maxDelay:3e4,jitter:!0,retryOn:()=>!0,onRetry:()=>{}};async function Le(t,e){let{onError:r,onEvent:l,catchUnexpected:w,workflowId:m,workflowName:T,context:E,_workflowSignal:R}=e&&typeof e=="object"?e:{},o=m??crypto.randomUUID(),y=w??yt,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}}}l?.(X,E)},S=ae,F=k=>ie(k),j=(k,z)=>k,$=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 g=c.findIndex(C=>C.scopeId===i);g!==-1&&c.splice(g,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 g=await x();if(f(),!g.ok)throw r?.(g.error,p,E),S(g.error,{origin:"result",resultCause:g.cause});return g.value}catch(g){throw f(),g}})()},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(),g=!1;c.push({scopeId:n,type:"parallel"});let C=()=>{if(g)return;g=!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 ht=z,bt=X,Pt=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=gt(a),f=p,g=a.key??p,C=a.key??p,{description:h,retry:b,timeout:A}=a,D=d(g),L=l,O=L?performance.now():0,_=$(x)?()=>x:x,v={attempts:Math.max(1,b?.attempts??1),backoff:b?.backoff??oe.backoff,initialDelay:b?.initialDelay??oe.initialDelay,maxDelay:b?.maxDelay??oe.maxDelay,jitter:b?.jitter??oe.jitter,retryOn:b?.retryOn??oe.retryOn,onRetry:b?.onRetry??oe.onRetry};l&&s({type:"step_start",workflowId:o,stepId:D,stepKey:g,name:f,description:h,ts:Date.now(),...n&&{metadata:n}});let Z;for(let I=1;I<=v.attempts;I++){let at=L?performance.now():0;try{let P;if(A?P=await xt(_,A,{name:f,key:g,attempt:I},R):P=await _(),P.ok){let G=performance.now()-O;return s({type:"step_success",workflowId:o,stepId:D,stepKey:g,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=ke(I,v);s({type:"step_retry",workflowId:o,stepId:D,stepKey:g,name:f,ts:Date.now(),attempt:I+1,maxAttempts:v.attempts,delayMs:G,error:P.error,...n&&{metadata:n},diagnostics:q(P.error,a.errorMeta,"result",I,performance.now()-O)}),v.onRetry(P.error,I,G),await Re(G);continue}v.attempts>1&&s({type:"step_retries_exhausted",workflowId:o,stepId:D,stepKey:g,name:f,ts:Date.now(),durationMs:performance.now()-O,attempts:I,lastError:P.error,...n&&{metadata:n},diagnostics:q(P.error,a.errorMeta,"result",I,performance.now()-O)});break}catch(P){let G=performance.now()-at;if(Rt(P)){let Y=P.ms;s({type:"step_timeout",workflowId:o,stepId:D,stepKey:g,name:f,ts:Date.now(),timeoutMs:Y,attempt:I,...n&&{metadata:n},diagnostics:q(P,a.errorMeta,"timeout",I)}),s({type:"step_success",workflowId:o,stepId:D,stepKey:g,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:g,name:f,description:h,ts:Date.now(),durationMs:G,...n&&{metadata:n}}),P;if(Ne(P)){let Y=Tt(P),it=A?.ms??Y?.timeoutMs??0;if(s({type:"step_timeout",workflowId:o,stepId:D,stepKey:g,name:f,ts:Date.now(),timeoutMs:it,attempt:I,...n&&{metadata:n},diagnostics:q(P,a.errorMeta,"timeout",I)}),I<v.attempts&&v.retryOn(P,I)){let ge=ke(I,v);s({type:"step_retry",workflowId:o,stepId:D,stepKey:g,name:f,ts:Date.now(),attempt:I+1,maxAttempts:v.attempts,delayMs:ge,error:P,...n&&{metadata:n},diagnostics:q(P,a.errorMeta,"timeout",I,performance.now()-O)}),v.onRetry(P,I,ge),await Re(ge);continue}v.attempts>1&&s({type:"step_retries_exhausted",workflowId:o,stepId:D,stepKey:g,name:f,ts:Date.now(),durationMs:performance.now()-O,attempts:I,lastError:P,...n&&{metadata:n},diagnostics:q(P,a.errorMeta,"timeout",I,performance.now()-O)});let we=performance.now()-O;throw s({type:"step_error",workflowId:o,stepId:D,stepKey:g,name:f,description:h,ts:Date.now(),durationMs:we,error:P,...n&&{metadata:n},diagnostics:q(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=ke(I,v);s({type:"step_retry",workflowId:o,stepId:D,stepKey:g,name:f,ts:Date.now(),attempt:I+1,maxAttempts:v.attempts,delayMs:Y,error:P,...n&&{metadata:n},diagnostics:q(P,a.errorMeta,"throw",I,performance.now()-O)}),v.onRetry(P,I,Y),await Re(Y);continue}v.attempts>1&&!Ne(P)&&s({type:"step_retries_exhausted",workflowId:o,stepId:D,stepKey:g,name:f,ts:Date.now(),durationMs:performance.now()-O,attempts:I,lastError:P,...n&&{metadata:n},diagnostics:q(P,a.errorMeta,"throw",I,performance.now()-O)});let fe=performance.now()-O,ce;try{ce=y(P)}catch(Y){throw ne(Y)}throw s({type:"step_error",workflowId:o,stepId:D,stepKey:g,name:f,description:h,ts:Date.now(),durationMs:fe,error:ce,...n&&{metadata:n},diagnostics:q(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(ce,{cause:P}),meta:{origin:"throw",thrown:P},...n&&{metadata:n}}),r?.(ce,f,E),S(ce,{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:g,name:f,description:h,ts:Date.now(),durationMs:de,error:ye,...n&&{metadata:n},diagnostics:q(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,g="error"in i?()=>i.error:i.onError,C=l;return(async()=>{let h=C?performance.now():0;l&&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=g(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,g="error"in i?()=>i.error:i.onError,C=l;return(async()=>{let h=C?performance.now():0;l&&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=g(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"?dt(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 g=new Error("Sleep aborted");throw g.name="AbortError",g}return new Promise((g,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),g(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 g=()=>{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(g(),!C.ok)throw r?.(C.error,p,E),S(C.error,{origin:"result",resultCause:C.cause});return C.value}catch(C){throw g(),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 g=c.findIndex(C=>C.scopeId===i);g!==-1&&c.splice(g,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 g=await x();if(f(),!g.ok)throw r?.(g.error,p,E),S(g.error,{origin:"result",resultCause:g.cause});return g.value}catch(g){throw f(),g}})()},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,g="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;g?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?Fe(x.map((f,g)=>i(f,g))):(async()=>{let f=[];for(let g=0;g<x.length;g+=n){let C=x.slice(g,g+n),h=await Fe(C.map((b,A)=>i(b,g+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),g=l;return(async()=>{let C=g?performance.now():0;l&&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 ne(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 ne(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 ne(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=l;return(async()=>{let g=f?performance.now():0;l&&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()-g}),_;let M;try{M=y(_)}catch(Z){throw ne(Z)}let v=performance.now()-g;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()-g,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 ne(v)}let M=performance.now()-g;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()-g;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()-g,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(g){if(ct(g))throw g.thrown;if(F(g)){let z=g.meta.origin==="throw"?g.meta.thrown:g.meta.origin==="result"?g.meta.resultCause:void 0;return U(g.error,{cause:z})}let Q=f(g);return r?.(Q,"unexpected",E),U(Q,{cause:g})}}he.strict=(e,t)=>he(e,t);async function be(e){return e.length===0?K([]):new Promise(t=>{let r=!1,l=e.length,T=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(!r){if(!E.ok){r=!0,t(E);return}T[R]=E.value,l--,l===0&&t(K(T))}})}})}var ae=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 Oe(e){return typeof e=="object"&&e!==null&&e.type==="CIRCUIT_OPEN"}var mt={failureThreshold:5,resetTimeout:3e4,windowSize:6e4,halfOpenMax:3};function _e(e,t){let r={...mt,...t},l="CLOSED",T=[],w=null,R=null,E=0,C=0;function o(){let S=Date.now();T=T.filter(F=>S-F.timestamp<r.windowSize)}function f(S){if(l!==S){let F=l;l=S,S==="HALF_OPEN"&&(C=0),r.onStateChange?.(F,S,e)}}function p(){return l!=="OPEN"||w===null?!1:Date.now()-w>=r.resetTimeout?(f("HALF_OPEN"),!0):!1}function u(){R=Date.now(),E++,l==="HALF_OPEN"&&(C++,C>=r.halfOpenMax&&(f("CLOSED"),T=[]))}function m(S){let F=Date.now();w=F,o(),T.push({timestamp:F,error:S}),(l==="HALF_OPEN"||l==="CLOSED"&&T.length>=r.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,r.resetTimeout-F)}return 0}return{async execute(S,F){let j=s();if(j>0)throw new ae({circuitName:e,state:l,retryAfterMs:j});try{let W=await S();return u(),W}catch(W){throw m(W),W}},async executeResult(S,F){let j=s();if(j>0)return U(new ae({circuitName:e,state:l,retryAfterMs:j}));try{let W=await S();return W.ok?u():m(W.error),W}catch(W){throw m(W),W}},getState(){return l==="OPEN"&&p(),l},getStats(){return o(),{state:this.getState(),failureCount:T.length,successCount:E,lastFailureTime:w,lastSuccessTime:R,halfOpenSuccesses:C}},reset(){f("CLOSED"),T=[],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 De(e){return typeof e=="object"&&e!==null&&e.type==="RATE_LIMIT_EXCEEDED"}function ge(e){return typeof e=="object"&&e!==null&&e.type==="QUEUE_FULL"}function ke(e,t){let{maxPerSecond:r,strategy:l="wait"}=t,T=t.burstCapacity??r*2,w=T,R=Date.now(),E=r/1e3,C=[];function o(){let u=Date.now(),s=(u-R)*E;w=Math.min(T,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:T,tokensPerSecond:r,waitingCount:C.length}},reset(){w=T,R=Date.now(),C.length=0}}}function Re(e,t){let{maxConcurrent:r,strategy:l="queue",maxQueueSize:T=1/0}=t,w=0,R=[];async function E(){if(w<r){w++;return}if(l==="reject")throw{type:"QUEUE_FULL",limiterName:e,queueSize:R.length,maxQueueSize:T};if(R.length>=T)throw{type:"QUEUE_FULL",limiterName:e,queueSize:R.length,maxQueueSize:T};return new Promise((o,f)=>{R.push({resolve:o,reject:f})})}function C(){w--,R.length>0&&w<r&&(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(ge(f))return U(f);throw f}try{return await o()}finally{C()}},getStats(){return{activeCount:w,maxConcurrent:r,queueSize:R.length,maxQueueSize:T}},reset(){for(w=0;R.length>0;)R.shift()?.reject(new Error("Limiter reset"))}}}function Me(e,t){let r=t.rate?ke(`${e}-rate`,t.rate):void 0,l=t.concurrency?Re(`${e}-concurrency`,t.concurrency):void 0;return{rate:r,concurrency:l,async execute(T){let w=T;if(r){let R=w;w=()=>r.execute(R)}return l?l.execute(w):w()}}}function Ie(e,t){let{limit:r,windowMs:l=1e3,strategy:T="wait"}=t,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<=r?(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>r)throw{type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:l};let m=o(u);if(m>0){if(T==="reject")throw{type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:m};await f(u)}return p()},async executeResult(p,u=1){if(u>r)return U({type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:l});let m=o(u);if(m>0){if(T==="reject")return U({type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:m});await f(u)}return p()},getStats(){let p=C();return{requestCount:R,limit:r,windowMs:l,remainingMs:p,waitingCount:E.length}},reset(){w=Date.now(),R=0,E.length=0}}}function Ue(e,t){let{tokensPerSecond:r,strategy:l="wait"}=t,T=t.maxTokens??r*2,w=T,R=Date.now(),E=r/1e3,C=[];function o(){let u=Date.now(),s=(u-R)*E;w=Math.min(T,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>T)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>T)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:T,tokensPerSecond:r,waitingCount:C.length}},reset(){w=T,R=Date.now(),C.length=0}}}var Ne={api:{maxPerSecond:10,burstCapacity:20,strategy:"wait"},database:{maxConcurrent:10,strategy:"queue",maxQueueSize:100},external:{maxPerSecond:5,burstCapacity:10,strategy:"wait"}};function Le(e){return typeof e=="object"&&e!==null&&e.type==="SAGA_COMPENSATION_ERROR"}function Fe(e,t,r){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 T=crypto.randomUUID(),w=performance.now(),R=[],E=f=>{let p=f.workflowName===void 0?{...f,workflowName:e}:f;r?.onEvent?.(p)};E({type:"saga_start",sagaId:T,ts:Date.now()});async function C(f){let p=[];E({type:"saga_compensation_start",sagaId:T,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:T,stepName:s.name,ts:Date.now(),success:!0})}catch(S){p.push({stepName:s.name,error:S}),E({type:"saga_compensation_step",sagaId:T,stepName:s.name,ts:Date.now(),success:!1,error:S})}}return E({type:"saga_compensation_end",sagaId:T,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 oe(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 oe(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:t}),p=performance.now()-w;return E({type:"saga_success",sagaId:T,ts:Date.now(),durationMs:p}),K(f)}catch(f){let p=performance.now()-w,u;se(f)?u=f.error:u=f,E({type:"saga_error",sagaId:T,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(r?.onError?.(s),r?.throwOnCompensationFailure)throw s;return U(s)}return r?.onError?.(u),se(f)?U(u):U({type:"UNEXPECTED_ERROR",cause:{type:"UNCAUGHT_EXCEPTION",thrown:f}})}}}async function je(e,t){let r=crypto.randomUUID(),l=performance.now(),T=[],w=C=>{t?.onEvent?.(C)};w({type:"saga_start",sagaId:r,ts:Date.now()});async function R(C){let o=[];w({type:"saga_compensation_start",sagaId:r,ts:Date.now(),stepCount:T.length});let f=performance.now();for(let p=T.length-1;p>=0;p--){let u=T[p];try{await u.compensate(u.value),w({type:"saga_compensation_step",sagaId:r,stepName:u.name,ts:Date.now(),success:!0})}catch(m){o.push({stepName:u.name,error:m}),w({type:"saga_compensation_step",sagaId:r,stepName:u.name,ts:Date.now(),success:!1,error:m})}}return w({type:"saga_compensation_end",sagaId:r,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&&T.push({name:o,value:u.value,compensate:p.compensate}),u.value;throw oe(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&&T.push({name:o,value:m,compensate:p.compensate}),m}catch(m){let s=u(m);throw oe(s,{origin:"throw",thrown:m})}},getCompensations(){return T.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:r,ts:Date.now(),durationMs:o}),K(C)}catch(C){let o=performance.now()-l,f;se(C)?f=C.error:f=C,w({type:"saga_error",sagaId:r,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(t?.onError?.(u),t?.throwOnCompensationFailure)throw u;return U(u)}return t?.onError?.(f),se(C)?U(f):U({type:"UNEXPECTED_ERROR",cause:{type:"UNCAUGHT_EXCEPTION",thrown:C}})}}function B(...e){let t={};for(let r of e)r.key!==void 0&&(t.key=r.key),r.retry!==void 0&&(t.retry=t.retry?{...t.retry,...r.retry}:{...r.retry}),r.timeout!==void 0&&(t.timeout=t.timeout?{...t.timeout,...r.timeout}:{...r.timeout});return t}function Ke(...e){let t=B(...e);return r=>B(t,r??{})}function Be(e,...t){return{name:e,policy:B(...t)}}function q(e){return{retry:e}}var ee={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:(e,t)=>q({attempts:e,backoff:"fixed",initialDelay:t,jitter:!1}),linear:(e,t)=>q({attempts:e,backoff:"linear",initialDelay:t,jitter:!0}),custom:e=>q({backoff:"exponential",initialDelay:100,maxDelay:3e4,jitter:!0,...e})};function V(e){return{timeout:e}}var Z={none:{},fast:V({ms:1e3}),api:V({ms:5e3}),extended:V({ms:3e4}),long:V({ms:12e4}),ms:e=>V({ms:e}),seconds:e=>V({ms:e*1e3}),withError:(e,t)=>V({ms:e,error:t}),withSignal:e=>V({ms:e,signal:!0})},We={httpApi:B(Z.api,ee.standard),database:B(Z.extended,q({attempts:2,backoff:"exponential",initialDelay:100,maxDelay:2e3,jitter:!0})),cache:B(Z.fast,ee.none),messageQueue:B(Z.extended,ee.aggressive),fileSystem:B(Z.long,ee.standard),rateLimited:B(V({ms:1e4}),q({attempts:5,backoff:"linear",initialDelay:1e3,maxDelay:1e4,jitter:!0}))};function Ce(e,t){return B(e,t??{})}function Ve(e,t){let r=t??{};return B(...e,r)}function qe(e,t,r={}){return e?t:r}function Xe(e,t=process.env.NODE_ENV??"development",r={}){return e[t]??r}function Qe(){let e=new Map;return{register(t,r){e.set(t,r)},get(t){return e.get(t)},has(t){return e.has(t)},names(){return Array.from(e.keys())},apply(t,r){let l=e.get(t);if(!l)throw new Error(`Policy not found: ${t}`);return Ce(l,r)}}}function Ye(){let e=[],t={key(r){return e.push({key:r}),t},policy(r){return e.push(r),t},timeout(r){return e.push(V({ms:r})),t},retry(r){return e.push(q(r)),t},retries(r){return e.push(ee.custom({attempts:r})),t},build(){return B(...e)}};return t}0&&(module.exports={CircuitOpenError,circuitBreakerPresets,conditionalPolicy,createCircuitBreaker,createCombinedLimiter,createConcurrencyLimiter,createCostBasedRateLimiter,createFixedWindowLimiter,createPolicyApplier,createPolicyBundle,createPolicyRegistry,createRateLimiter,createSagaWorkflow,envPolicy,isCircuitOpenError,isQueueFullError,isRateLimitExceededError,isSagaCompensationError,mergePolicies,rateLimiterPresets,retryPolicies,retryPolicy,runSaga,servicePolicies,stepOptions,timeoutPolicies,timeoutPolicy,withPolicies,withPolicy});
6
+ See: https://jagreehal.github.io/awaitly/guides/troubleshooting/#returning-ok-from-workflow-executor-double-wrapping`)}return K(Q)}catch(k){if(kt(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})}}Le.strict=(t,e)=>Le(t,e);async function Fe(t){return t.length===0?K([]):new Promise(e=>{let r=!1,l=t.length,w=new Array(t.length);for(let m=0;m<t.length;m++){let T=m;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}w[T]=E.value,l--,l===0&&e(K(w))}})}})}var ue=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 Ke(t){return typeof t=="object"&&t!==null&&t.type==="CIRCUIT_OPEN"}var Ct={failureThreshold:5,resetTimeout:3e4,windowSize:6e4,halfOpenMax:3};function We(t,e){let r={...Ct,...e},l="CLOSED",w=[],m=null,T=null,E=0,R=0;function o(){let S=Date.now();w=w.filter(F=>S-F.timestamp<r.windowSize)}function y(S){if(l!==S){let F=l;l=S,S==="HALF_OPEN"&&(R=0),r.onStateChange?.(F,S,t)}}function c(){return l!=="OPEN"||m===null?!1:Date.now()-m>=r.resetTimeout?(y("HALF_OPEN"),!0):!1}function u(){T=Date.now(),E++,l==="HALF_OPEN"&&(R++,R>=r.halfOpenMax&&(y("CLOSED"),w=[]))}function d(S){let F=Date.now();m=F,o(),w.push({timestamp:F,error:S}),(l==="HALF_OPEN"||l==="CLOSED"&&w.length>=r.failureThreshold)&&y("OPEN")}function s(){if(l==="CLOSED")return 0;if(l==="OPEN"){if(c())return 0;let S=Date.now(),F=m?S-m:0;return Math.max(0,r.resetTimeout-F)}return 0}return{async execute(S,F){let j=s();if(j>0)throw new ue({circuitName:t,state:l,retryAfterMs:j});try{let $=await S();return u(),$}catch($){throw d($),$}},async executeResult(S,F){let j=s();if(j>0)return N(new ue({circuitName:t,state:l,retryAfterMs:j}));try{let $=await S();return $.ok?u():d($.error),$}catch($){throw d($),$}},getState(){return l==="OPEN"&&c(),l},getStats(){return o(),{state:this.getState(),failureCount:w.length,successCount:E,lastFailureTime:m,lastSuccessTime:T,halfOpenSuccesses:R}},reset(){y("CLOSED"),w=[],R=0},forceOpen(){m=Date.now(),y("OPEN")},recordSuccess(){u()},recordFailure(S){d(S??new Error("Manual failure"))}}}var $e={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 Ve(t){return typeof t=="object"&&t!==null&&t.type==="RATE_LIMIT_EXCEEDED"}function xe(t){return typeof t=="object"&&t!==null&&t.type==="QUEUE_FULL"}function Ce(t,e){let{maxPerSecond:r,strategy:l="wait"}=e,w=e.burstCapacity??r*2,m=w,T=Date.now(),E=r/1e3,R=[];function o(){let u=Date.now(),s=(u-T)*E;m=Math.min(w,m+s),T=u}function y(){if(o(),m>=1)return m-=1,0;let u=1-m;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(l==="reject")throw{type:"RATE_LIMIT_EXCEEDED",limiterName:t,retryAfterMs:d};await c()}return u()},async executeResult(u){let d=y();if(d>0){if(l==="reject")return N({type:"RATE_LIMIT_EXCEEDED",limiterName:t,retryAfterMs:d});await c()}return u()},getStats(){return o(),{availableTokens:Math.floor(m),maxTokens:w,tokensPerSecond:r,waitingCount:R.length}},reset(){m=w,T=Date.now(),R.length=0}}}function Se(t,e){let{maxConcurrent:r,strategy:l="queue",maxQueueSize:w=1/0}=e,m=0,T=[];async function E(){if(m<r){m++;return}if(l==="reject")throw{type:"QUEUE_FULL",limiterName:t,queueSize:T.length,maxQueueSize:w};if(T.length>=w)throw{type:"QUEUE_FULL",limiterName:t,queueSize:T.length,maxQueueSize:w};return new Promise((o,y)=>{T.push({resolve:o,reject:y})})}function R(){m--,T.length>0&&m<r&&(m++,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(xe(y))return N(y);throw y}try{return await o()}finally{R()}},getStats(){return{activeCount:m,maxConcurrent:r,queueSize:T.length,maxQueueSize:w}},reset(){for(m=0;T.length>0;)T.shift()?.reject(new Error("Limiter reset"))}}}function He(t,e){let r=e.rate?Ce(`${t}-rate`,e.rate):void 0,l=e.concurrency?Se(`${t}-concurrency`,e.concurrency):void 0;return{rate:r,concurrency:l,async execute(w){let m=w;if(r){let T=m;m=()=>r.execute(T)}return l?l.execute(m):m()}}}function qe(t,e){let{limit:r,windowMs:l=1e3,strategy:w="wait"}=e,m=Date.now(),T=0,E=[];function R(){let c=Date.now(),u=c-m;return u>=l?(m=c,T=0,0):l-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:l};let d=o(u);if(d>0){if(w==="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:l});let d=o(u);if(d>0){if(w==="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:l,remainingMs:c,waitingCount:E.length}},reset(){m=Date.now(),T=0,E.length=0}}}function ze(t,e){let{tokensPerSecond:r,strategy:l="wait"}=e,w=e.maxTokens??r*2,m=w,T=Date.now(),E=r/1e3,R=[];function o(){let u=Date.now(),s=(u-T)*E;m=Math.min(w,m+s),T=u}function y(u){if(o(),m>=u)return m-=u,0;let d=u-m;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>w)throw{type:"RATE_LIMIT_EXCEEDED",limiterName:t,retryAfterMs:Math.ceil(d/E)};let s=y(d);if(s>0){if(l==="reject")throw{type:"RATE_LIMIT_EXCEEDED",limiterName:t,retryAfterMs:s};await c(d)}return u()},async executeResult(u,d=1){if(d>w)return N({type:"RATE_LIMIT_EXCEEDED",limiterName:t,retryAfterMs:Math.ceil(d/E)});let s=y(d);if(s>0){if(l==="reject")return N({type:"RATE_LIMIT_EXCEEDED",limiterName:t,retryAfterMs:s});await c(d)}return u()},getStats(){return o(),{availableTokens:m,maxTokens:w,tokensPerSecond:r,waitingCount:R.length}},reset(){m=w,T=Date.now(),R.length=0}}}var Qe={api:{maxPerSecond:10,burstCapacity:20,strategy:"wait"},database:{maxConcurrent:10,strategy:"queue",maxQueueSize:100},external:{maxPerSecond:5,burstCapacity:10,strategy:"wait"}};function Ye(t){return typeof t=="object"&&t!==null&&t.type==="SAGA_COMPENSATION_ERROR"}function Xe(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 l=>{let w=crypto.randomUUID(),m=performance.now(),T=[],E=y=>{let c=y.workflowName===void 0?{...y,workflowName:t}:y;r?.onEvent?.(c)};E({type:"saga_start",sagaId:w,ts:Date.now()});async function R(y){let c=[];E({type:"saga_compensation_start",sagaId:w,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:w,stepName:s.name,ts:Date.now(),success:!0})}catch(S){c.push({stepName:s.name,error:S}),E({type:"saga_compensation_step",sagaId:w,stepName:s.name,ts:Date.now(),success:!1,error:S})}}return E({type:"saga_compensation_end",sagaId:w,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 ae(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 ae(F,{origin:"throw",thrown:S})}},getCompensations(){return T.map(y=>({name:y.name,hasValue:y.value!==void 0}))}};try{let y=await l({saga:o,deps:e}),c=performance.now()-m;return E({type:"saga_success",sagaId:w,ts:Date.now(),durationMs:c}),K(y)}catch(y){let c=performance.now()-m,u;ie(y)?u=y.error:u=y,E({type:"saga_error",sagaId:w,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),ie(y)?N(u):N(new ee({cause:y}))}}}async function Je(t,e){let r=crypto.randomUUID(),l=performance.now(),w=[],m=R=>{e?.onEvent?.(R)};m({type:"saga_start",sagaId:r,ts:Date.now()});async function T(R){let o=[];m({type:"saga_compensation_start",sagaId:r,ts:Date.now(),stepCount:w.length});let y=performance.now();for(let c=w.length-1;c>=0;c--){let u=w[c];try{await u.compensate(u.value),m({type:"saga_compensation_step",sagaId:r,stepName:u.name,ts:Date.now(),success:!0})}catch(d){o.push({stepName:u.name,error:d}),m({type:"saga_compensation_step",sagaId:r,stepName:u.name,ts:Date.now(),success:!1,error:d})}}return m({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&&w.push({name:o,value:u.value,compensate:c.compensate}),u.value;throw ae(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&&w.push({name:o,value:d,compensate:c.compensate}),d}catch(d){let s=u(d);throw ae(s,{origin:"throw",thrown:d})}},getCompensations(){return w.map(R=>({name:R.name,hasValue:R.value!==void 0}))}};try{let R=await t({saga:E}),o=performance.now()-l;return m({type:"saga_success",sagaId:r,ts:Date.now(),durationMs:o}),K(R)}catch(R){let o=performance.now()-l,y;ie(R)?y=R.error:y=R,m({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),ie(R)?N(y):N(new ee({cause:R}))}}function W(...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 Ge(...t){let e=W(...t);return r=>W(e,r??{})}function Ze(t,...e){return{name:t,policy:W(...e)}}function H(t){return{retry:t}}var re={none:H({attempts:1}),transient:H({attempts:3,backoff:"exponential",initialDelay:100,maxDelay:1e3,jitter:!0}),standard:H({attempts:3,backoff:"exponential",initialDelay:200,maxDelay:5e3,jitter:!0}),aggressive:H({attempts:5,backoff:"exponential",initialDelay:500,maxDelay:3e4,jitter:!0}),fixed:(t,e)=>H({attempts:t,backoff:"fixed",initialDelay:e,jitter:!1}),linear:(t,e)=>H({attempts:t,backoff:"linear",initialDelay:e,jitter:!0}),custom:t=>H({backoff:"exponential",initialDelay:100,maxDelay:3e4,jitter:!0,...t})};function V(t){return{timeout:t}}var te={none:{},fast:V({ms:1e3}),api:V({ms:5e3}),extended:V({ms:3e4}),long:V({ms:12e4}),ms:t=>V({ms:t}),seconds:t=>V({ms:t*1e3}),withError:(t,e)=>V({ms:t,error:e}),withSignal:t=>V({ms:t,signal:!0})},et={httpApi:W(te.api,re.standard),database:W(te.extended,H({attempts:2,backoff:"exponential",initialDelay:100,maxDelay:2e3,jitter:!0})),cache:W(te.fast,re.none),messageQueue:W(te.extended,re.aggressive),fileSystem:W(te.long,re.standard),rateLimited:W(V({ms:1e4}),H({attempts:5,backoff:"linear",initialDelay:1e3,maxDelay:1e4,jitter:!0}))};function he(t,e){return W(t,e??{})}function tt(t,e){let r=e??{};return W(...t,r)}function rt(t,e,r={}){return t?e:r}function nt(t,e=process.env.NODE_ENV??"development",r={}){return t[e]??r}function ot(){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 l=t.get(e);if(!l)throw new Error(`Policy not found: ${e}`);return he(l,r)}}}function st(){let t=[],e={key(r){return t.push({key:r}),e},policy(r){return t.push(r),e},timeout(r){return t.push(V({ms:r})),e},retry(r){return t.push(H(r)),e},retries(r){return t.push(re.custom({attempts:r})),e},build(){return W(...t)}};return e}0&&(module.exports={CircuitOpenError,circuitBreakerPresets,conditionalPolicy,createCircuitBreaker,createCombinedLimiter,createConcurrencyLimiter,createCostBasedRateLimiter,createFixedWindowLimiter,createPolicyApplier,createPolicyBundle,createPolicyRegistry,createRateLimiter,createSagaWorkflow,envPolicy,isCircuitOpenError,isQueueFullError,isRateLimitExceededError,isSagaCompensationError,mergePolicies,rateLimiterPresets,retryPolicies,retryPolicy,runSaga,servicePolicies,stepOptions,timeoutPolicies,timeoutPolicy,withPolicies,withPolicy});
7
7
  //# sourceMappingURL=reliability.cjs.map