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
package/dist/saga.cjs CHANGED
@@ -1,7 +1,7 @@
1
- "use strict";var pe=Object.defineProperty;var Se=Object.getOwnPropertyDescriptor;var he=Object.getOwnPropertyNames;var be=Object.prototype.hasOwnProperty;var Ae=(a,c)=>{for(var i in c)pe(a,i,{get:c[i],enumerable:!0})},_e=(a,c,i,g)=>{if(c&&typeof c=="object"||typeof c=="function")for(let b of he(c))!be.call(a,b)&&b!==i&&pe(a,b,{get:()=>c[b],enumerable:!(g=Se(c,b))||g.enumerable});return a};var Pe=a=>_e(pe({},"__esModule",{value:!0}),a);var Le={};Ae(Le,{createSagaWorkflow:()=>ke,isSagaCompensationError:()=>Te,runSaga:()=>ge});module.exports=Pe(Le);function Oe(a){let c=a.trim().match(/^(\d+(?:\.\d+)?)\s*(ms|s|m|h|d)$/i);if(!c)return;let i=parseFloat(c[1]),g=c[2].toLowerCase();return{_tag:"Duration",millis:i*({ms:1,s:1e3,m:6e4,h:36e5,d:864e5}[g]??1)}}var ve="UNEXPECTED_ERROR";function De(a){return ve}function F(a){return{ok:!0,value:a}}function K(a,c){let i=c?.cause;return{ok:!1,error:a,...i!==void 0?{cause:i}:{}}}function Me(a){if(a==null)return"unknown";if(typeof a=="string")return a.trim()||"unknown";if(typeof a=="object"){let c=a;if(typeof c._tag=="string"){let i=c._tag.trim();if(i)return i}if(typeof c.tag=="string"){let i=c.tag.trim();if(i)return i}if(typeof c.code=="string"){let i=c.code.trim();if(i)return i}else if(typeof c.code=="number")return String(c.code);if(a instanceof Error&&a.name){let i=a.name.trim();if(i)return i}}return"unknown"}function Ie(a,c){if(!(!c||!a))return c[a]}function Ue(a){let{intent:c,domain:i,owner:g,tags:b,stateChanges:D,emits:O,calls:y}=a;if(!c&&!i&&!g&&!b?.length&&!D?.length&&!O?.length&&!y?.length)return;let _={};return c&&(_.intent=c),i&&(_.domain=i),g&&(_.owner=g),b?.length&&(_.tags=b),D?.length&&(_.stateChanges=D),O?.length&&(_.emits=O),y?.length&&(_.calls=y),_}function j(a,c,i,g,b){let D=Me(a),O=Ie(D,c),y={tag:D,origin:i};return O!==void 0&&(y.classification=O),g!==void 0&&(y.attempt=g),b!==void 0&&(y.cumulativeDurationMs=b),y}var z=Symbol.for("step_timeout_marker");function me(a){return typeof a!="object"||a===null?!1:a.type==="STEP_TIMEOUT"?!0:z in a}function Ne(a){if(!(typeof a!="object"||a===null)){if(a.type==="STEP_TIMEOUT"){let c=a;return{timeoutMs:c.timeoutMs,stepName:c.stepName,stepKey:c.stepKey,attempt:c.attempt}}if(z in a)return a[z]}}var de=Symbol("early-exit");function Q(a,c){return{[de]:!0,error:a,meta:c}}function Z(a){return typeof a=="object"&&a!==null&&a[de]===!0}var fe=Symbol("mapper-exception");function G(a){return{[fe]:!0,thrown:a}}function Ke(a){return typeof a=="object"&&a!==null&&a[fe]===!0}function ce(a,c){let{backoff:i,initialDelay:g,maxDelay:b,jitter:D}=c,O;switch(i){case"fixed":O=g;break;case"linear":O=g*a;break;case"exponential":O=g*Math.pow(2,a-1);break}if(O=Math.min(O,b),D){let y=O*.25*Math.random();O=O+y}return Math.floor(O)}function le(a){return new Promise(c=>setTimeout(c,a))}var Ee=Symbol("timeout"),re=Symbol("timeout-option");function Fe(a){return typeof a=="object"&&a!==null&&a[re]===!0}async function je(a,c,i,g){let b=new AbortController,D=c.onTimeout??"error",O=()=>typeof D=="function"?D({name:i.name,key:i.key,ms:c.ms}):c.error??{type:"STEP_TIMEOUT",stepName:i.name,stepKey:i.key,timeoutMs:c.ms,attempt:i.attempt},y;g?.aborted&&b.abort(g.reason);let _;g&&!g.aborted&&(_=()=>b.abort(g.reason),g.addEventListener("abort",_,{once:!0}));let r=new Promise((E,C)=>{y=setTimeout(()=>{if(D!=="disconnect"&&b.abort(),D==="option"){C({[re]:!0,ms:c.ms});return}C({[Ee]:!0,error:O()})},c.ms)}),R;c.signal?R=Promise.resolve(a(b.signal)):R=Promise.resolve(a());try{return await Promise.race([R,r])}catch(E){if(typeof E=="object"&&E!==null&&E[re]===!0)throw{[re]:!0,ms:c.ms};if(typeof E=="object"&&E!==null&&E[Ee]===!0){D==="disconnect"&&R.catch(()=>{});let C=E.error;if(typeof C=="object"&&C!==null&&C.type!=="STEP_TIMEOUT"){let M={timeoutMs:c.ms,stepName:i.name,stepKey:i.key,attempt:i.attempt};z in C?C[z]=M:Object.defineProperty(C,z,{value:M,enumerable:!1,writable:!0,configurable:!1})}throw C}throw E}finally{clearTimeout(y),_&&g&&g.removeEventListener("abort",_)}}var H={backoff:"exponential",initialDelay:100,maxDelay:3e4,jitter:!0,retryOn:()=>!0,onRetry:()=>{}};async function we(a,c){let{onError:i,onEvent:g,catchUnexpected:b,workflowId:D,workflowName:O,context:y,_workflowSignal:_}=c&&typeof c=="object"?c:{},r=D??crypto.randomUUID(),R=b??De,E=[],C=0,M=l=>l??`step_${++C}`,o=l=>{let L=l.context!==void 0||y===void 0?l:{...l,context:y},X=O!==void 0&&L.workflowName===void 0?{...L,workflowName:O}:L;if(X.type==="step_success"){let te=X.stepId;for(let ne=E.length-1;ne>=0;ne--){let W=E[ne];if(W.type==="race"&&!W.winnerId){W.winnerId=te;break}}}g?.(X,y)},I=Q,B=l=>Z(l),q=(l,L)=>l,Re=l=>typeof l=="function"?!1:!!(l&&typeof l=="object"&&"ok"in l||l&&typeof l=="object"&&"then"in l&&typeof l.then=="function");try{let L=function(s){let m={};for(let[n,t]of Object.entries(s))if(typeof t=="function")m[n]=t;else if(t&&typeof t=="object"&&"fn"in t)m[n]=t.fn;else throw new TypeError(`step.parallel: operation "${n}" must be a function or { fn, errors? } object`);return m},X=function(s,m){let n=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let t=performance.now(),e=!1;E.push({scopeId:n,type:"parallel"});let u=()=>{if(e)return;e=!0;let p=E.findIndex(w=>w.scopeId===n);p!==-1&&E.splice(p,1),o({type:"scope_end",workflowId:r,scopeId:n,ts:Date.now(),durationMs:performance.now()-t})};o({type:"scope_start",workflowId:r,scopeId:n,scopeType:"parallel",name:s,ts:Date.now()});try{let p=await m();if(u(),!p.ok)throw i?.(p.error,s,y),I(p.error,{origin:"result",resultCause:p.cause});return p.value}catch(p){throw u(),p}})()},te=function(s,m){let n=Object.keys(s),t=m.name??`Parallel(${n.join(", ")})`,e=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let u=performance.now(),p=!1;E.push({scopeId:e,type:"parallel"});let w=()=>{if(p)return;p=!0;let d=E.findIndex(f=>f.scopeId===e);d!==-1&&E.splice(d,1),o({type:"scope_end",workflowId:r,scopeId:e,ts:Date.now(),durationMs:performance.now()-u})};o({type:"scope_start",workflowId:r,scopeId:e,scopeType:"parallel",name:t,ts:Date.now()});try{let d=await new Promise(k=>{if(n.length===0){k([]);return}let P=!1,N=n.length,x=new Array(n.length);for(let U=0;U<n.length;U++){let S=n[U],A=U;Promise.resolve(s[S]()).catch(h=>K({type:"PROMISE_REJECTED",cause:h},{cause:{type:"PROMISE_REJECTION",reason:h}})).then(h=>{if(!P){if(!h.ok){P=!0,k([{key:S,result:h}]);return}x[A]={key:S,result:h},N--,N===0&&k(x)}})}});w();let f={};for(let{key:k,result:P}of d){if(!P.ok)throw i?.(P.error,k,y),I(P.error,{origin:"result",resultCause:P.cause});f[k]=P.value}return f}catch(d){throw w(),d}})()};var We=L,Be=X,Ve=te;let l=(s,m,n)=>(async()=>{if(typeof s!="string"||s.length===0)throw new Error('[awaitly] step() requires an explicit string ID as the first argument. Example: step("fetchUser", () => fetchUser(id))');let t=n??{},e=Ue(t),u=s,p=t.key??s,w=t.key??s,{description:d,retry:f,timeout:k}=t,P=M(p),N=g,x=N?performance.now():0,S=Re(m)?()=>m:m,h={attempts:Math.max(1,f?.attempts??1),backoff:f?.backoff??H.backoff,initialDelay:f?.initialDelay??H.initialDelay,maxDelay:f?.maxDelay??H.maxDelay,jitter:f?.jitter??H.jitter,retryOn:f?.retryOn??H.retryOn,onRetry:f?.onRetry??H.onRetry};g&&o({type:"step_start",workflowId:r,stepId:P,stepKey:p,name:u,description:d,ts:Date.now(),...e&&{metadata:e}});let J;for(let v=1;v<=h.attempts;v++){let Ce=N?performance.now():0;try{let T;if(k?T=await je(S,k,{name:u,key:p,attempt:v},_):T=await S(),T.ok){let $=performance.now()-x;return o({type:"step_success",workflowId:r,stepId:P,stepKey:p,name:u,description:d,ts:Date.now(),durationMs:$,...e&&{metadata:e}}),w&&o({type:"step_complete",workflowId:r,stepKey:w,name:u,description:d,ts:Date.now(),durationMs:$,result:T,...e&&{metadata:e}}),T.value}if(J=T,v<h.attempts&&h.retryOn(T.error,v)){let $=ce(v,h);o({type:"step_retry",workflowId:r,stepId:P,stepKey:p,name:u,ts:Date.now(),attempt:v+1,maxAttempts:h.attempts,delayMs:$,error:T.error,...e&&{metadata:e},diagnostics:j(T.error,t.errorMeta,"result",v,performance.now()-x)}),h.onRetry(T.error,v,$),await le($);continue}h.attempts>1&&o({type:"step_retries_exhausted",workflowId:r,stepId:P,stepKey:p,name:u,ts:Date.now(),durationMs:performance.now()-x,attempts:v,lastError:T.error,...e&&{metadata:e},diagnostics:j(T.error,t.errorMeta,"result",v,performance.now()-x)});break}catch(T){let $=performance.now()-Ce;if(Fe(T)){let V=T.ms;o({type:"step_timeout",workflowId:r,stepId:P,stepKey:p,name:u,ts:Date.now(),timeoutMs:V,attempt:v,...e&&{metadata:e},diagnostics:j(T,t.errorMeta,"timeout",v)}),o({type:"step_success",workflowId:r,stepId:P,stepKey:p,name:u,description:d,ts:Date.now(),durationMs:performance.now()-x,...e&&{metadata:e}}),w&&o({type:"step_complete",workflowId:r,stepKey:w,name:u,description:d,ts:Date.now(),durationMs:performance.now()-x,result:F(void 0),...e&&{metadata:e}});return}if(B(T))throw o({type:"step_aborted",workflowId:r,stepId:P,stepKey:p,name:u,description:d,ts:Date.now(),durationMs:$,...e&&{metadata:e}}),T;if(me(T)){let V=Ne(T),xe=k?.ms??V?.timeoutMs??0;if(o({type:"step_timeout",workflowId:r,stepId:P,stepKey:p,name:u,ts:Date.now(),timeoutMs:xe,attempt:v,...e&&{metadata:e},diagnostics:j(T,t.errorMeta,"timeout",v)}),v<h.attempts&&h.retryOn(T,v)){let ue=ce(v,h);o({type:"step_retry",workflowId:r,stepId:P,stepKey:p,name:u,ts:Date.now(),attempt:v+1,maxAttempts:h.attempts,delayMs:ue,error:T,...e&&{metadata:e},diagnostics:j(T,t.errorMeta,"timeout",v,performance.now()-x)}),h.onRetry(T,v,ue),await le(ue);continue}h.attempts>1&&o({type:"step_retries_exhausted",workflowId:r,stepId:P,stepKey:p,name:u,ts:Date.now(),durationMs:performance.now()-x,attempts:v,lastError:T,...e&&{metadata:e},diagnostics:j(T,t.errorMeta,"timeout",v,performance.now()-x)});let ie=performance.now()-x;throw o({type:"step_error",workflowId:r,stepId:P,stepKey:p,name:u,description:d,ts:Date.now(),durationMs:ie,error:T,...e&&{metadata:e},diagnostics:j(T,t.errorMeta,"timeout",v,ie)}),w&&o({type:"step_complete",workflowId:r,stepKey:w,name:u,description:d,ts:Date.now(),durationMs:ie,result:K(T,{cause:T}),meta:{origin:"throw",thrown:T},...e&&{metadata:e}}),i?.(T,u,y),I(T,{origin:"throw",thrown:T})}if(v<h.attempts&&h.retryOn(T,v)){let V=ce(v,h);o({type:"step_retry",workflowId:r,stepId:P,stepKey:p,name:u,ts:Date.now(),attempt:v+1,maxAttempts:h.attempts,delayMs:V,error:T,...e&&{metadata:e},diagnostics:j(T,t.errorMeta,"throw",v,performance.now()-x)}),h.onRetry(T,v,V),await le(V);continue}h.attempts>1&&!me(T)&&o({type:"step_retries_exhausted",workflowId:r,stepId:P,stepKey:p,name:u,ts:Date.now(),durationMs:performance.now()-x,attempts:v,lastError:T,...e&&{metadata:e},diagnostics:j(T,t.errorMeta,"throw",v,performance.now()-x)});let ae=performance.now()-x,ee;try{ee=R(T)}catch(V){throw G(V)}throw o({type:"step_error",workflowId:r,stepId:P,stepKey:p,name:u,description:d,ts:Date.now(),durationMs:ae,error:ee,...e&&{metadata:e},diagnostics:j(T,t.errorMeta,"throw",v,ae)}),w&&o({type:"step_complete",workflowId:r,stepKey:w,name:u,description:d,ts:Date.now(),durationMs:ae,result:K(ee,{cause:T}),meta:{origin:"throw",thrown:T},...e&&{metadata:e}}),i?.(ee,u,y),I(ee,{origin:"throw",thrown:T})}}let Y=J,oe=performance.now()-x,se=q(Y.error,{origin:"result",resultCause:Y.cause});throw o({type:"step_error",workflowId:r,stepId:P,stepKey:p,name:u,description:d,ts:Date.now(),durationMs:oe,error:se,...e&&{metadata:e},diagnostics:j(Y.error,t.errorMeta,"result",h.attempts,oe)}),w&&o({type:"step_complete",workflowId:r,stepKey:w,name:u,description:d,ts:Date.now(),durationMs:oe,result:Y,meta:{origin:"result",resultCause:Y.cause},...e&&{metadata:e}}),i?.(se,u,y),I(se,{origin:"result",resultCause:Y.cause})})();l.try=(s,m,n)=>{if(typeof s!="string"||s.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 t=n.key??s,e=s,u=s,p="error"in n?()=>n.error:n.onError,w=g;return(async()=>{let d=w?performance.now():0;g&&o({type:"step_start",workflowId:r,stepId:u,stepKey:t,name:e,ts:Date.now()});try{let f=await m(),k=performance.now()-d;return o({type:"step_success",workflowId:r,stepId:u,stepKey:t,name:e,ts:Date.now(),durationMs:k}),t&&o({type:"step_complete",workflowId:r,stepKey:t,name:e,ts:Date.now(),durationMs:k,result:F(f)}),f}catch(f){let k=p(f),P=performance.now()-d,N=q(k,{origin:"throw",thrown:f});throw o({type:"step_error",workflowId:r,stepId:u,stepKey:t,name:e,ts:Date.now(),durationMs:P,error:N}),t&&o({type:"step_complete",workflowId:r,stepKey:t,name:e,ts:Date.now(),durationMs:P,result:K(k,{cause:f}),meta:{origin:"throw",thrown:f}}),i?.(N,e,y),I(N,{origin:"throw",thrown:f})}})()},l.fromResult=(s,m,n)=>{if(typeof s!="string"||s.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 t=n.key??s,e=s,u=s,p="error"in n?()=>n.error:n.onError,w=g;return(async()=>{let d=w?performance.now():0;g&&o({type:"step_start",workflowId:r,stepId:u,stepKey:t,name:e,ts:Date.now()});let f=await m();if(f.ok){let k=performance.now()-d;return o({type:"step_success",workflowId:r,stepId:u,stepKey:t,name:e,ts:Date.now(),durationMs:k}),t&&o({type:"step_complete",workflowId:r,stepKey:t,name:e,ts:Date.now(),durationMs:k,result:F(f.value)}),f.value}else{let k=p(f.error),P=performance.now()-d,N=q(k,{origin:"result",resultCause:f.error});throw o({type:"step_error",workflowId:r,stepId:u,stepKey:t,name:e,ts:Date.now(),durationMs:P,error:N}),t&&o({type:"step_complete",workflowId:r,stepKey:t,name:e,ts:Date.now(),durationMs:P,result:K(k,{cause:f.error}),meta:{origin:"result",resultCause:f.error}}),i?.(N,e,y),I(N,{origin:"result",resultCause:f.error})}})()},l.fromNullable=(s,m,n,t)=>{if(typeof s!="string"||s.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 l(s,async()=>{let e=await m();return e!=null?F(e):K(n())},t)},l.retry=(s,m,n)=>{if(typeof s!="string"||s.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 l(s,m,{key:n.key??s,retry:{attempts:n.attempts,backoff:n.backoff,initialDelay:n.initialDelay,maxDelay:n.maxDelay,jitter:n.jitter,retryOn:n.retryOn,onRetry:n.onRetry},timeout:n.timeout})},l.withTimeout=(s,m,n)=>{if(typeof s!="string"||s.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 l(s,m,{key:n.key??s,timeout:n})},l.sleep=(s,m,n)=>{if(typeof s!="string"||s.length===0)throw new Error('[awaitly] step.sleep() requires an explicit string ID as the first argument. Example: step.sleep("delay", "5s")');let t=typeof m=="string"?Oe(m):m;if(!t)throw new Error(`step.sleep: invalid duration '${m}'`);let e=t.millis,u=n?.signal;return l(s,async()=>{if(_?.aborted||u?.aborted){let p=new Error("Sleep aborted");throw p.name="AbortError",p}return new Promise((p,w)=>{let d={timeoutId:void 0},f=()=>{d.timeoutId&&clearTimeout(d.timeoutId);let k=new Error("Sleep aborted");k.name="AbortError",w(k)};_?.addEventListener("abort",f,{once:!0}),u?.addEventListener("abort",f,{once:!0}),d.timeoutId=setTimeout(()=>{_?.removeEventListener("abort",f),u?.removeEventListener("abort",f),p(F(void 0))},e)})},{key:n?.key??s,description:n?.description})},l.parallel=((...s)=>{if(typeof s[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 m=s[0],n=s[1];if(typeof n=="function")return X(m,n);if(n&&typeof n=="object"&&!Array.isArray(n)){let e=L(n);return te(e,{name:m})}throw new TypeError("step.parallel(name, ...): second argument must be a function (array form) or an object of operations (object form).")}),l.race=(s,m)=>{let n=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let t=performance.now(),e=!1,u={scopeId:n,type:"race",winnerId:void 0};E.push(u);let p=()=>{if(e)return;e=!0;let w=E.findIndex(d=>d.scopeId===n);w!==-1&&E.splice(w,1),o({type:"scope_end",workflowId:r,scopeId:n,ts:Date.now(),durationMs:performance.now()-t,winnerId:u.winnerId})};o({type:"scope_start",workflowId:r,scopeId:n,scopeType:"race",name:s,ts:Date.now()});try{let w=await m();if(p(),!w.ok)throw i?.(w.error,s,y),I(w.error,{origin:"result",resultCause:w.cause});return w.value}catch(w){throw p(),w}})()},l.allSettled=(s,m)=>{let n=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let t=performance.now(),e=!1;E.push({scopeId:n,type:"allSettled"});let u=()=>{if(e)return;e=!0;let p=E.findIndex(w=>w.scopeId===n);p!==-1&&E.splice(p,1),o({type:"scope_end",workflowId:r,scopeId:n,ts:Date.now(),durationMs:performance.now()-t})};o({type:"scope_start",workflowId:r,scopeId:n,scopeType:"allSettled",name:s,ts:Date.now()});try{let p=await m();if(u(),!p.ok)throw i?.(p.error,s,y),I(p.error,{origin:"result",resultCause:p.cause});return p.value}catch(p){throw u(),p}})()},l.if=(s,m,n)=>n(),l.label=l.if,l.branch=async(s,m)=>{let{condition:n,then:t,else:e}=m;if(n())return await t();if(e)return await e()},l.arm=(s,m)=>({fn:s,errors:m}),l.forEach=async(s,m,n)=>{let t=[],e=n.maxIterations,u=0,p="run"in n,w=Symbol.asyncIterator in m?m:(async function*(){yield*m})();for await(let d of w){if(e!==void 0&&u>=e)break;let f;p?f=await n.run(d,u):f=await n.item.handler(d,u,l),t.push(f),u++}return t},l.item=s=>({__forEachItemHandler:!0,handler:s}),l.dep=(s,m)=>m,l.run=(s,m,n)=>l(s,()=>m,n),l.workflow=(s,m,n)=>l(s,m,n),l.andThen=(s,m,n,t)=>l(s,()=>n(m),t),l.match=async(s,m,n,t)=>l(s,async()=>{let e=await m;return e.ok?F(await n.ok(e.value)):F(await n.err(e.error,e.cause))},t),l.all=l.parallel,l.map=async(s,m,n,t)=>{let e=t?.concurrency??m.length;return l(s,()=>e>=m.length?ye(m.map((u,p)=>n(u,p))):(async()=>{let u=[];for(let p=0;p<m.length;p+=e){let w=m.slice(p,p+e),d=await ye(w.map((f,k)=>n(f,p+k)));if(!d.ok)return d;u.push(...d.value)}return F(u)})(),{key:t?.key})},l.withFallback=(s,m,n)=>{if(typeof s!="string"||s.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 t=n.key??s,e=s,u=M(t),p=g;return(async()=>{let w=p?performance.now():0;g&&o({type:"step_start",workflowId:r,stepId:u,stepKey:t,name:e,ts:Date.now()});let d;try{d=await m()}catch(x){if(B(x))throw o({type:"step_aborted",workflowId:r,stepId:u,stepKey:t,name:e,ts:Date.now(),durationMs:performance.now()-w}),x;let U;try{U=R(x)}catch(A){throw G(A)}if(n.on!==void 0&&n.on!==U){let A=performance.now()-w;throw o({type:"step_error",workflowId:r,stepId:u,stepKey:t,name:e,ts:Date.now(),durationMs:A,error:U}),t&&o({type:"step_complete",workflowId:r,stepKey:t,name:e,ts:Date.now(),durationMs:A,result:K(U,{cause:x}),meta:{origin:"throw",thrown:x}}),i?.(U,e,y),I(U,{origin:"throw",thrown:x})}let S;try{S=await n.fallback()}catch(A){if(B(A))throw o({type:"step_aborted",workflowId:r,stepId:u,stepKey:t,name:e,ts:Date.now(),durationMs:performance.now()-w}),A;let h;try{h=R(A)}catch(Y){throw G(Y)}let J=performance.now()-w;throw o({type:"step_error",workflowId:r,stepId:u,stepKey:t,name:e,ts:Date.now(),durationMs:J,error:h}),t&&o({type:"step_complete",workflowId:r,stepKey:t,name:e,ts:Date.now(),durationMs:J,result:K(h,{cause:A}),meta:{origin:"throw",thrown:A}}),i?.(h,e,y),I(h,{origin:"throw",thrown:A})}if(S.ok){let A=performance.now()-w;return o({type:"step_success",workflowId:r,stepId:u,stepKey:t,name:e,ts:Date.now(),durationMs:A}),t&&o({type:"step_complete",workflowId:r,stepKey:t,name:e,ts:Date.now(),durationMs:A,result:S,meta:{origin:"fallback",fallbackUsed:!0,fallbackReason:String(U)}}),S.value}else{let A=performance.now()-w,h=q(S.error,{origin:"result",resultCause:S.cause});throw o({type:"step_error",workflowId:r,stepId:u,stepKey:t,name:e,ts:Date.now(),durationMs:A,error:h}),t&&o({type:"step_complete",workflowId:r,stepKey:t,name:e,ts:Date.now(),durationMs:A,result:S,meta:{origin:"result",resultCause:S.cause}}),i?.(h,e,y),I(h,{origin:"result",resultCause:S.cause})}}if(d.ok){let x=performance.now()-w;return o({type:"step_success",workflowId:r,stepId:u,stepKey:t,name:e,ts:Date.now(),durationMs:x}),t&&o({type:"step_complete",workflowId:r,stepKey:t,name:e,ts:Date.now(),durationMs:x,result:d}),d.value}let f=d.error;if(n.on!==void 0&&n.on!==f){let x=performance.now()-w,U=q(f,{origin:"result",resultCause:d.cause});throw o({type:"step_error",workflowId:r,stepId:u,stepKey:t,name:e,ts:Date.now(),durationMs:x,error:U}),t&&o({type:"step_complete",workflowId:r,stepKey:t,name:e,ts:Date.now(),durationMs:x,result:d,meta:{origin:"result",resultCause:d.cause}}),i?.(U,e,y),I(U,{origin:"result",resultCause:d.cause})}let k;try{k=await n.fallback()}catch(x){if(B(x))throw o({type:"step_aborted",workflowId:r,stepId:u,stepKey:t,name:e,ts:Date.now(),durationMs:performance.now()-w}),x;let U;try{U=R(x)}catch(A){throw G(A)}let S=performance.now()-w;throw o({type:"step_error",workflowId:r,stepId:u,stepKey:t,name:e,ts:Date.now(),durationMs:S,error:U}),t&&o({type:"step_complete",workflowId:r,stepKey:t,name:e,ts:Date.now(),durationMs:S,result:K(U,{cause:x}),meta:{origin:"throw",thrown:x}}),i?.(U,e,y),I(U,{origin:"throw",thrown:x})}if(k.ok){let x=performance.now()-w;return o({type:"step_success",workflowId:r,stepId:u,stepKey:t,name:e,ts:Date.now(),durationMs:x}),t&&o({type:"step_complete",workflowId:r,stepKey:t,name:e,ts:Date.now(),durationMs:x,result:k,meta:{origin:"fallback",fallbackUsed:!0,fallbackReason:String(f)}}),k.value}let P=performance.now()-w,N=q(k.error,{origin:"result",resultCause:k.cause});throw o({type:"step_error",workflowId:r,stepId:u,stepKey:t,name:e,ts:Date.now(),durationMs:P,error:N}),t&&o({type:"step_complete",workflowId:r,stepKey:t,name:e,ts:Date.now(),durationMs:P,result:k,meta:{origin:"result",resultCause:k.cause}}),i?.(N,e,y),I(N,{origin:"result",resultCause:k.cause})})()},l.withResource=(s,m)=>{if(typeof s!="string"||s.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 n=s,t=s,e=M(n),u=g;return(async()=>{let p=u?performance.now():0;g&&o({type:"step_start",workflowId:r,stepId:e,stepKey:n,name:t,ts:Date.now()});let w;try{w=await m.acquire()}catch(S){if(B(S))throw o({type:"step_aborted",workflowId:r,stepId:e,stepKey:n,name:t,ts:Date.now(),durationMs:performance.now()-p}),S;let A;try{A=R(S)}catch(J){throw G(J)}let h=performance.now()-p;throw o({type:"step_error",workflowId:r,stepId:e,stepKey:n,name:t,ts:Date.now(),durationMs:h,error:A}),n&&o({type:"step_complete",workflowId:r,stepKey:n,name:t,ts:Date.now(),durationMs:h,result:K(A,{cause:S}),meta:{origin:"throw",thrown:S}}),i?.(A,t,y),I(A,{origin:"throw",thrown:S})}if(!w.ok){let S=performance.now()-p,A=q(w.error,{origin:"result",resultCause:w.cause});throw o({type:"step_error",workflowId:r,stepId:e,stepKey:n,name:t,ts:Date.now(),durationMs:S,error:A}),n&&o({type:"step_complete",workflowId:r,stepKey:n,name:t,ts:Date.now(),durationMs:S,result:w,meta:{origin:"result",resultCause:w.cause}}),i?.(A,t,y),I(A,{origin:"result",resultCause:w.cause})}let d=w.value,f,k,P=!1;try{f=await m.use(d)}catch(S){if(B(S)){try{await m.release(d)}catch(A){console.warn(`[awaitly] step.withResource("${s}"): release threw after earlyExit:`,A)}throw S}k=S,P=!0}try{await m.release(d)}catch(S){console.warn(`[awaitly] step.withResource("${s}"): release threw:`,S)}if(P){let S;try{S=R(k)}catch(h){throw G(h)}let A=performance.now()-p;throw o({type:"step_error",workflowId:r,stepId:e,stepKey:n,name:t,ts:Date.now(),durationMs:A,error:S}),n&&o({type:"step_complete",workflowId:r,stepKey:n,name:t,ts:Date.now(),durationMs:A,result:K(S,{cause:k}),meta:{origin:"throw",thrown:k}}),i?.(S,t,y),I(S,{origin:"throw",thrown:k})}let N=f;if(N.ok){let S=performance.now()-p;return o({type:"step_success",workflowId:r,stepId:e,stepKey:n,name:t,ts:Date.now(),durationMs:S}),n&&o({type:"step_complete",workflowId:r,stepKey:n,name:t,ts:Date.now(),durationMs:S,result:N}),N.value}let x=performance.now()-p,U=q(N.error,{origin:"result",resultCause:N.cause});throw o({type:"step_error",workflowId:r,stepId:e,stepKey:n,name:t,ts:Date.now(),durationMs:x,error:U}),n&&o({type:"step_complete",workflowId:r,stepKey:n,name:t,ts:Date.now(),durationMs:x,result:N,meta:{origin:"result",resultCause:N.cause}}),i?.(U,t,y),I(U,{origin:"result",resultCause:N.cause})})()};let W=await a({step:l});if(process.env.NODE_ENV!=="production"&&W!==null&&typeof W=="object"&&"ok"in W&&typeof W.ok=="boolean"){let s=W;(s.ok===!0&&"value"in s||s.ok===!1&&"error"in s)&&console.warn(`awaitly: Workflow executor returned a Result-like object. Return raw values, not ok() or err().
1
+ "use strict";var me=Object.defineProperty;var Ne=Object.getOwnPropertyDescriptor;var Ke=Object.getOwnPropertyNames;var Fe=Object.prototype.hasOwnProperty;var je=(o,t)=>{for(var u in t)me(o,u,{get:t[u],enumerable:!0})},Be=(o,t,u,f)=>{if(t&&typeof t=="object"||typeof t=="function")for(let S of Ke(t))!Fe.call(o,S)&&S!==u&&me(o,S,{get:()=>t[S],enumerable:!(f=Ne(t,S))||f.enumerable});return o};var Le=o=>Be(me({},"__esModule",{value:!0}),o);var Xe={};je(Xe,{createSagaWorkflow:()=>ve,isSagaCompensationError:()=>Oe,runSaga:()=>Me});module.exports=Le(Xe);var ne=class extends Error{_tag};function F(o,t){return class extends ne{_tag=o;constructor(u,f){let S=t?.message?t.message(u??{}):o;if(super(S),this.name=o,Object.setPrototypeOf(this,new.target.prototype),u&&typeof u=="object"){let{_tag:b,name:P,message:w,stack:_,...s}=u,g=Object.prototype.hasOwnProperty.call(s,"cause"),E=g?s.cause:void 0;g&&delete s.cause;let k=f?.cause!==void 0;if(g&&k)throw new TypeError("TaggedError: cannot provide 'cause' in props when also setting ErrorOptions.cause");Object.assign(this,s),g&&(this.cause=E),k&&(this.cause=f?.cause)}else f?.cause!==void 0&&(this.cause=f.cause)}}}Object.defineProperty(F,Symbol.hasInstance,{value:o=>o instanceof ne});(S=>{function o(b){return b instanceof Error}S.isError=o;function t(b){return b instanceof ne}S.isTaggedError=t;function u(b,P){let w=b._tag,_=P[w];return _(b)}S.match=u;function f(b,P,w){let _=b._tag,s=P[_];return s?s(b):w(b)}S.matchPartial=f})(F||={});var we=class extends F("TimeoutError",{message:t=>t.operation?`TimeoutError: ${t.operation} timed out after ${t.ms}ms`:`TimeoutError: Operation timed out after ${t.ms}ms`}){},ye=class extends F("RetryExhaustedError",{message:t=>t.operation?`RetryExhaustedError: ${t.operation} failed after ${t.attempts} attempts`:`RetryExhaustedError: Operation failed after ${t.attempts} attempts`}){},fe=class extends F("RateLimitError",{message:t=>t.limiterName?`RateLimitError: Rate limit exceeded for ${t.limiterName}${t.retryAfterMs?`, retry after ${t.retryAfterMs}ms`:""}`:`RateLimitError: Rate limit exceeded${t.retryAfterMs?`, retry after ${t.retryAfterMs}ms`:""}`}){},ge=class extends F("CircuitBreakerOpenError",{message:t=>`CircuitBreakerOpenError: Circuit ${t.circuitName} is ${t.state??"OPEN"}${t.retryAfterMs?`, retry after ${Math.ceil(t.retryAfterMs/1e3)}s`:""}`}){},Te=class extends F("ValidationError",{message:t=>`ValidationError: Invalid ${t.field} - ${t.reason}`}){},ke=class extends F("NotFoundError",{message:t=>t.id?`NotFoundError: ${t.resource} with id ${t.id} not found`:`NotFoundError: ${t.resource} not found`}){},Re=class extends F("UnauthorizedError",{message:t=>t.reason?`UnauthorizedError: ${t.reason}`:t.action&&t.resource?`UnauthorizedError: Not authorized to ${t.action} ${t.resource}`:"UnauthorizedError: Access denied"}){},xe=class extends F("NetworkError",{message:t=>t.url?`NetworkError: ${t.reason} (${t.url})`:`NetworkError: ${t.reason}`}){},Ce=class extends F("CompensationError",{message:t=>`CompensationError: Failed to compensate step ${t.step}`}){},G=class extends F("UnexpectedError",{message:t=>`UnexpectedError: ${t.cause instanceof Error?t.cause.message:String(t.cause??"unknown")}`}){};function Ve(o){let t=o.trim().match(/^(\d+(?:\.\d+)?)\s*(ms|s|m|h|d)$/i);if(!t)return;let u=parseFloat(t[1]),f=t[2].toLowerCase();return{_tag:"Duration",millis:u*({ms:1,s:1e3,m:6e4,h:36e5,d:864e5}[f]??1)}}function We(o){return new G({cause:o})}function j(o){return{ok:!0,value:o}}function K(o,t){let u=t?.cause;return{ok:!1,error:o,...u!==void 0?{cause:u}:{}}}function $e(o){if(o==null)return"unknown";if(typeof o=="string")return o.trim()||"unknown";if(typeof o=="object"){let t=o;if(typeof t._tag=="string"){let u=t._tag.trim();if(u)return u}if(typeof t.tag=="string"){let u=t.tag.trim();if(u)return u}if(typeof t.code=="string"){let u=t.code.trim();if(u)return u}else if(typeof t.code=="number")return String(t.code);if(o instanceof Error&&o.name){let u=o.name.trim();if(u)return u}}return"unknown"}function He(o,t){if(!(!t||!o))return t[o]}function qe(o){let{intent:t,domain:u,owner:f,tags:S,stateChanges:b,emits:P,calls:w}=o;if(!t&&!u&&!f&&!S?.length&&!b?.length&&!P?.length&&!w?.length)return;let _={};return t&&(_.intent=t),u&&(_.domain=u),f&&(_.owner=f),S?.length&&(_.tags=S),b?.length&&(_.stateChanges=b),P?.length&&(_.emits=P),w?.length&&(_.calls=w),_}function B(o,t,u,f,S){let b=$e(o),P=He(b,t),w={tag:b,origin:u};return P!==void 0&&(w.classification=P),f!==void 0&&(w.attempt=f),S!==void 0&&(w.cumulativeDurationMs=S),w}var Z=Symbol.for("step_timeout_marker");function he(o){return typeof o!="object"||o===null?!1:o.type==="STEP_TIMEOUT"?!0:Z in o}function Ye(o){if(!(typeof o!="object"||o===null)){if(o.type==="STEP_TIMEOUT"){let t=o;return{timeoutMs:t.timeoutMs,stepName:t.stepName,stepKey:t.stepKey,attempt:t.attempt}}if(Z in o)return o[Z]}}var _e=Symbol("early-exit");function ee(o,t){return{[_e]:!0,error:o,meta:t}}function te(o){return typeof o=="object"&&o!==null&&o[_e]===!0}var Pe=Symbol("mapper-exception");function X(o){return{[Pe]:!0,thrown:o}}function Je(o){return typeof o=="object"&&o!==null&&o[Pe]===!0}function Ee(o,t){let{backoff:u,initialDelay:f,maxDelay:S,jitter:b}=t,P;switch(u){case"fixed":P=f;break;case"linear":P=f*o;break;case"exponential":P=f*Math.pow(2,o-1);break}if(P=Math.min(P,S),b){let w=P*.25*Math.random();P=P+w}return Math.floor(P)}function de(o){return new Promise(t=>setTimeout(t,o))}var Se=Symbol("timeout"),ae=Symbol("timeout-option");function ze(o){return typeof o=="object"&&o!==null&&o[ae]===!0}async function Ge(o,t,u,f){let S=new AbortController,b=t.onTimeout??"error",P=()=>typeof b=="function"?b({name:u.name,key:u.key,ms:t.ms}):t.error??{type:"STEP_TIMEOUT",stepName:u.name,stepKey:u.key,timeoutMs:t.ms,attempt:u.attempt},w;f?.aborted&&S.abort(f.reason);let _;f&&!f.aborted&&(_=()=>S.abort(f.reason),f.addEventListener("abort",_,{once:!0}));let s=new Promise((E,k)=>{w=setTimeout(()=>{if(b!=="disconnect"&&S.abort(),b==="option"){k({[ae]:!0,ms:t.ms});return}k({[Se]:!0,error:P()})},t.ms)}),g;t.signal?g=Promise.resolve(o(S.signal)):g=Promise.resolve(o());try{return await Promise.race([g,s])}catch(E){if(typeof E=="object"&&E!==null&&E[ae]===!0)throw{[ae]:!0,ms:t.ms};if(typeof E=="object"&&E!==null&&E[Se]===!0){b==="disconnect"&&g.catch(()=>{});let k=E.error;if(typeof k=="object"&&k!==null&&k.type!=="STEP_TIMEOUT"){let D={timeoutMs:t.ms,stepName:u.name,stepKey:u.key,attempt:u.attempt};Z in k?k[Z]=D:Object.defineProperty(k,Z,{value:D,enumerable:!1,writable:!0,configurable:!1})}throw k}throw E}finally{clearTimeout(w),_&&f&&f.removeEventListener("abort",_)}}var Q={backoff:"exponential",initialDelay:100,maxDelay:3e4,jitter:!0,retryOn:()=>!0,onRetry:()=>{}};async function be(o,t){let{onError:u,onEvent:f,catchUnexpected:S,workflowId:b,workflowName:P,context:w,_workflowSignal:_}=t&&typeof t=="object"?t:{},s=b??crypto.randomUUID(),g=S??We,E=[],k=0,D=l=>l??`step_${++k}`,a=l=>{let L=l.context!==void 0||w===void 0?l:{...l,context:w},q=P!==void 0&&L.workflowName===void 0?{...L,workflowName:P}:L;if(q.type==="step_success"){let oe=q.stepId;for(let se=E.length-1;se>=0;se--){let V=E[se];if(V.type==="race"&&!V.winnerId){V.winnerId=oe;break}}}f?.(q,w)},I=ee,W=l=>te(l),H=(l,L)=>l,De=l=>typeof l=="function"?!1:!!(l&&typeof l=="object"&&"ok"in l||l&&typeof l=="object"&&"then"in l&&typeof l.then=="function");try{let L=function(i){let m={};for(let[n,r]of Object.entries(i))if(typeof r=="function")m[n]=r;else if(r&&typeof r=="object"&&"fn"in r)m[n]=r.fn;else throw new TypeError(`step.parallel: operation "${n}" must be a function or { fn, errors? } object`);return m},q=function(i,m){let n=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let r=performance.now(),e=!1;E.push({scopeId:n,type:"parallel"});let p=()=>{if(e)return;e=!0;let c=E.findIndex(d=>d.scopeId===n);c!==-1&&E.splice(c,1),a({type:"scope_end",workflowId:s,scopeId:n,ts:Date.now(),durationMs:performance.now()-r})};a({type:"scope_start",workflowId:s,scopeId:n,scopeType:"parallel",name:i,ts:Date.now()});try{let c=await m();if(p(),!c.ok)throw u?.(c.error,i,w),I(c.error,{origin:"result",resultCause:c.cause});return c.value}catch(c){throw p(),c}})()},oe=function(i,m){let n=Object.keys(i),r=m.name??`Parallel(${n.join(", ")})`,e=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let p=performance.now(),c=!1;E.push({scopeId:e,type:"parallel"});let d=()=>{if(c)return;c=!0;let y=E.findIndex(T=>T.scopeId===e);y!==-1&&E.splice(y,1),a({type:"scope_end",workflowId:s,scopeId:e,ts:Date.now(),durationMs:performance.now()-p})};a({type:"scope_start",workflowId:s,scopeId:e,scopeType:"parallel",name:r,ts:Date.now()});try{let y=await new Promise(x=>{if(n.length===0){x([]);return}let v=!1,N=n.length,C=new Array(n.length);for(let U=0;U<n.length;U++){let h=n[U],O=U;Promise.resolve(i[h]()).catch(A=>K({type:"PROMISE_REJECTED",cause:A},{cause:{type:"PROMISE_REJECTION",reason:A}})).then(A=>{if(!v){if(!A.ok){v=!0,x([{key:h,result:A}]);return}C[O]={key:h,result:A},N--,N===0&&x(C)}})}});d();let T={};for(let{key:x,result:v}of y){if(!v.ok)throw u?.(v.error,x,w),I(v.error,{origin:"result",resultCause:v.cause});T[x]=v.value}return T}catch(y){throw d(),y}})()};var Qe=L,Ze=q,et=oe;let l=(i,m,n)=>(async()=>{if(typeof i!="string"||i.length===0)throw new Error('[awaitly] step() requires an explicit string ID as the first argument. Example: step("fetchUser", () => fetchUser(id))');let r=n??{},e=qe(r),p=i,c=r.key??i,d=r.key??i,{description:y,retry:T,timeout:x}=r,v=D(c),N=f,C=N?performance.now():0,h=De(m)?()=>m:m,A={attempts:Math.max(1,T?.attempts??1),backoff:T?.backoff??Q.backoff,initialDelay:T?.initialDelay??Q.initialDelay,maxDelay:T?.maxDelay??Q.maxDelay,jitter:T?.jitter??Q.jitter,retryOn:T?.retryOn??Q.retryOn,onRetry:T?.onRetry??Q.onRetry};f&&a({type:"step_start",workflowId:s,stepId:v,stepKey:c,name:p,description:y,ts:Date.now(),...e&&{metadata:e}});let z;for(let M=1;M<=A.attempts;M++){let Ie=N?performance.now():0;try{let R;if(x?R=await Ge(h,x,{name:p,key:c,attempt:M},_):R=await h(),R.ok){let J=performance.now()-C;return a({type:"step_success",workflowId:s,stepId:v,stepKey:c,name:p,description:y,ts:Date.now(),durationMs:J,...e&&{metadata:e}}),d&&a({type:"step_complete",workflowId:s,stepKey:d,name:p,description:y,ts:Date.now(),durationMs:J,result:R,...e&&{metadata:e}}),R.value}if(z=R,M<A.attempts&&A.retryOn(R.error,M)){let J=Ee(M,A);a({type:"step_retry",workflowId:s,stepId:v,stepKey:c,name:p,ts:Date.now(),attempt:M+1,maxAttempts:A.attempts,delayMs:J,error:R.error,...e&&{metadata:e},diagnostics:B(R.error,r.errorMeta,"result",M,performance.now()-C)}),A.onRetry(R.error,M,J),await de(J);continue}A.attempts>1&&a({type:"step_retries_exhausted",workflowId:s,stepId:v,stepKey:c,name:p,ts:Date.now(),durationMs:performance.now()-C,attempts:M,lastError:R.error,...e&&{metadata:e},diagnostics:B(R.error,r.errorMeta,"result",M,performance.now()-C)});break}catch(R){let J=performance.now()-Ie;if(ze(R)){let $=R.ms;a({type:"step_timeout",workflowId:s,stepId:v,stepKey:c,name:p,ts:Date.now(),timeoutMs:$,attempt:M,...e&&{metadata:e},diagnostics:B(R,r.errorMeta,"timeout",M)}),a({type:"step_success",workflowId:s,stepId:v,stepKey:c,name:p,description:y,ts:Date.now(),durationMs:performance.now()-C,...e&&{metadata:e}}),d&&a({type:"step_complete",workflowId:s,stepKey:d,name:p,description:y,ts:Date.now(),durationMs:performance.now()-C,result:j(void 0),...e&&{metadata:e}});return}if(W(R))throw a({type:"step_aborted",workflowId:s,stepId:v,stepKey:c,name:p,description:y,ts:Date.now(),durationMs:J,...e&&{metadata:e}}),R;if(he(R)){let $=Ye(R),Ue=x?.ms??$?.timeoutMs??0;if(a({type:"step_timeout",workflowId:s,stepId:v,stepKey:c,name:p,ts:Date.now(),timeoutMs:Ue,attempt:M,...e&&{metadata:e},diagnostics:B(R,r.errorMeta,"timeout",M)}),M<A.attempts&&A.retryOn(R,M)){let le=Ee(M,A);a({type:"step_retry",workflowId:s,stepId:v,stepKey:c,name:p,ts:Date.now(),attempt:M+1,maxAttempts:A.attempts,delayMs:le,error:R,...e&&{metadata:e},diagnostics:B(R,r.errorMeta,"timeout",M,performance.now()-C)}),A.onRetry(R,M,le),await de(le);continue}A.attempts>1&&a({type:"step_retries_exhausted",workflowId:s,stepId:v,stepKey:c,name:p,ts:Date.now(),durationMs:performance.now()-C,attempts:M,lastError:R,...e&&{metadata:e},diagnostics:B(R,r.errorMeta,"timeout",M,performance.now()-C)});let ce=performance.now()-C;throw a({type:"step_error",workflowId:s,stepId:v,stepKey:c,name:p,description:y,ts:Date.now(),durationMs:ce,error:R,...e&&{metadata:e},diagnostics:B(R,r.errorMeta,"timeout",M,ce)}),d&&a({type:"step_complete",workflowId:s,stepKey:d,name:p,description:y,ts:Date.now(),durationMs:ce,result:K(R,{cause:R}),meta:{origin:"throw",thrown:R},...e&&{metadata:e}}),u?.(R,p,w),I(R,{origin:"throw",thrown:R})}if(M<A.attempts&&A.retryOn(R,M)){let $=Ee(M,A);a({type:"step_retry",workflowId:s,stepId:v,stepKey:c,name:p,ts:Date.now(),attempt:M+1,maxAttempts:A.attempts,delayMs:$,error:R,...e&&{metadata:e},diagnostics:B(R,r.errorMeta,"throw",M,performance.now()-C)}),A.onRetry(R,M,$),await de($);continue}A.attempts>1&&!he(R)&&a({type:"step_retries_exhausted",workflowId:s,stepId:v,stepKey:c,name:p,ts:Date.now(),durationMs:performance.now()-C,attempts:M,lastError:R,...e&&{metadata:e},diagnostics:B(R,r.errorMeta,"throw",M,performance.now()-C)});let pe=performance.now()-C,re;try{re=g(R)}catch($){throw X($)}throw a({type:"step_error",workflowId:s,stepId:v,stepKey:c,name:p,description:y,ts:Date.now(),durationMs:pe,error:re,...e&&{metadata:e},diagnostics:B(R,r.errorMeta,"throw",M,pe)}),d&&a({type:"step_complete",workflowId:s,stepKey:d,name:p,description:y,ts:Date.now(),durationMs:pe,result:K(re,{cause:R}),meta:{origin:"throw",thrown:R},...e&&{metadata:e}}),u?.(re,p,w),I(re,{origin:"throw",thrown:R})}}let Y=z,ie=performance.now()-C,ue=H(Y.error,{origin:"result",resultCause:Y.cause});throw a({type:"step_error",workflowId:s,stepId:v,stepKey:c,name:p,description:y,ts:Date.now(),durationMs:ie,error:ue,...e&&{metadata:e},diagnostics:B(Y.error,r.errorMeta,"result",A.attempts,ie)}),d&&a({type:"step_complete",workflowId:s,stepKey:d,name:p,description:y,ts:Date.now(),durationMs:ie,result:Y,meta:{origin:"result",resultCause:Y.cause},...e&&{metadata:e}}),u?.(ue,p,w),I(ue,{origin:"result",resultCause:Y.cause})})();l.try=(i,m,n)=>{if(typeof i!="string"||i.length===0)throw new Error('[awaitly] step.try() requires an explicit string ID as the first argument. Example: step.try("parse", () => JSON.parse(str), { error: "PARSE_ERROR" })');let r=n.key??i,e=i,p=i,c="error"in n?()=>n.error:n.onError,d=f;return(async()=>{let y=d?performance.now():0;f&&a({type:"step_start",workflowId:s,stepId:p,stepKey:r,name:e,ts:Date.now()});try{let T=await m(),x=performance.now()-y;return a({type:"step_success",workflowId:s,stepId:p,stepKey:r,name:e,ts:Date.now(),durationMs:x}),r&&a({type:"step_complete",workflowId:s,stepKey:r,name:e,ts:Date.now(),durationMs:x,result:j(T)}),T}catch(T){let x=c(T),v=performance.now()-y,N=H(x,{origin:"throw",thrown:T});throw a({type:"step_error",workflowId:s,stepId:p,stepKey:r,name:e,ts:Date.now(),durationMs:v,error:N}),r&&a({type:"step_complete",workflowId:s,stepKey:r,name:e,ts:Date.now(),durationMs:v,result:K(x,{cause:T}),meta:{origin:"throw",thrown:T}}),u?.(N,e,w),I(N,{origin:"throw",thrown:T})}})()},l.fromResult=(i,m,n)=>{if(typeof i!="string"||i.length===0)throw new Error('[awaitly] step.fromResult() requires an explicit string ID as the first argument. Example: step.fromResult("callProvider", () => callProvider(input), { onError: (e) => ({ type: "FAILED" }) })');let r=n.key??i,e=i,p=i,c="error"in n?()=>n.error:n.onError,d=f;return(async()=>{let y=d?performance.now():0;f&&a({type:"step_start",workflowId:s,stepId:p,stepKey:r,name:e,ts:Date.now()});let T=await m();if(T.ok){let x=performance.now()-y;return a({type:"step_success",workflowId:s,stepId:p,stepKey:r,name:e,ts:Date.now(),durationMs:x}),r&&a({type:"step_complete",workflowId:s,stepKey:r,name:e,ts:Date.now(),durationMs:x,result:j(T.value)}),T.value}else{let x=c(T.error),v=performance.now()-y,N=H(x,{origin:"result",resultCause:T.error});throw a({type:"step_error",workflowId:s,stepId:p,stepKey:r,name:e,ts:Date.now(),durationMs:v,error:N}),r&&a({type:"step_complete",workflowId:s,stepKey:r,name:e,ts:Date.now(),durationMs:v,result:K(x,{cause:T.error}),meta:{origin:"result",resultCause:T.error}}),u?.(N,e,w),I(N,{origin:"result",resultCause:T.error})}})()},l.fromNullable=(i,m,n,r)=>{if(typeof i!="string"||i.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 l(i,async()=>{let e=await m();return e!=null?j(e):K(n())},r)},l.retry=(i,m,n)=>{if(typeof i!="string"||i.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 l(i,m,{key:n.key??i,retry:{attempts:n.attempts,backoff:n.backoff,initialDelay:n.initialDelay,maxDelay:n.maxDelay,jitter:n.jitter,retryOn:n.retryOn,onRetry:n.onRetry},timeout:n.timeout})},l.withTimeout=(i,m,n)=>{if(typeof i!="string"||i.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 l(i,m,{key:n.key??i,timeout:n})},l.sleep=(i,m,n)=>{if(typeof i!="string"||i.length===0)throw new Error('[awaitly] step.sleep() requires an explicit string ID as the first argument. Example: step.sleep("delay", "5s")');let r=typeof m=="string"?Ve(m):m;if(!r)throw new Error(`step.sleep: invalid duration '${m}'`);let e=r.millis,p=n?.signal;return l(i,async()=>{if(_?.aborted||p?.aborted){let c=new Error("Sleep aborted");throw c.name="AbortError",c}return new Promise((c,d)=>{let y={timeoutId:void 0},T=()=>{y.timeoutId&&clearTimeout(y.timeoutId);let x=new Error("Sleep aborted");x.name="AbortError",d(x)};_?.addEventListener("abort",T,{once:!0}),p?.addEventListener("abort",T,{once:!0}),y.timeoutId=setTimeout(()=>{_?.removeEventListener("abort",T),p?.removeEventListener("abort",T),c(j(void 0))},e)})},{key:n?.key??i,description:n?.description})},l.parallel=((...i)=>{if(typeof i[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 m=i[0],n=i[1];if(typeof n=="function")return q(m,n);if(n&&typeof n=="object"&&!Array.isArray(n)){let e=L(n);return oe(e,{name:m})}throw new TypeError("step.parallel(name, ...): second argument must be a function (array form) or an object of operations (object form).")}),l.race=(i,m)=>{let n=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let r=performance.now(),e=!1,p={scopeId:n,type:"race",winnerId:void 0};E.push(p);let c=()=>{if(e)return;e=!0;let d=E.findIndex(y=>y.scopeId===n);d!==-1&&E.splice(d,1),a({type:"scope_end",workflowId:s,scopeId:n,ts:Date.now(),durationMs:performance.now()-r,winnerId:p.winnerId})};a({type:"scope_start",workflowId:s,scopeId:n,scopeType:"race",name:i,ts:Date.now()});try{let d=await m();if(c(),!d.ok)throw u?.(d.error,i,w),I(d.error,{origin:"result",resultCause:d.cause});return d.value}catch(d){throw c(),d}})()},l.allSettled=(i,m)=>{let n=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let r=performance.now(),e=!1;E.push({scopeId:n,type:"allSettled"});let p=()=>{if(e)return;e=!0;let c=E.findIndex(d=>d.scopeId===n);c!==-1&&E.splice(c,1),a({type:"scope_end",workflowId:s,scopeId:n,ts:Date.now(),durationMs:performance.now()-r})};a({type:"scope_start",workflowId:s,scopeId:n,scopeType:"allSettled",name:i,ts:Date.now()});try{let c=await m();if(p(),!c.ok)throw u?.(c.error,i,w),I(c.error,{origin:"result",resultCause:c.cause});return c.value}catch(c){throw p(),c}})()},l.if=(i,m,n)=>n(),l.label=l.if,l.branch=async(i,m)=>{let{condition:n,then:r,else:e}=m;if(n())return await r();if(e)return await e()},l.arm=(i,m)=>({fn:i,errors:m}),l.forEach=async(i,m,n)=>{let r=[],e=n.maxIterations,p=0,c="run"in n,d=Symbol.asyncIterator in m?m:(async function*(){yield*m})();for await(let y of d){if(e!==void 0&&p>=e)break;let T;c?T=await n.run(y,p):T=await n.item.handler(y,p,l),r.push(T),p++}return r},l.item=i=>({__forEachItemHandler:!0,handler:i}),l.dep=(i,m)=>m,l.run=(i,m,n)=>l(i,()=>m,n),l.workflow=(i,m,n)=>l(i,m,n),l.andThen=(i,m,n,r)=>l(i,()=>n(m),r),l.match=async(i,m,n,r)=>l(i,async()=>{let e=await m;return e.ok?j(await n.ok(e.value)):j(await n.err(e.error,e.cause))},r),l.all=l.parallel,l.map=async(i,m,n,r)=>{let e=r?.concurrency??m.length;return l(i,()=>e>=m.length?Ae(m.map((p,c)=>n(p,c))):(async()=>{let p=[];for(let c=0;c<m.length;c+=e){let d=m.slice(c,c+e),y=await Ae(d.map((T,x)=>n(T,c+x)));if(!y.ok)return y;p.push(...y.value)}return j(p)})(),{key:r?.key})},l.withFallback=(i,m,n)=>{if(typeof i!="string"||i.length===0)throw new Error('[awaitly] step.withFallback() requires an explicit string ID as the first argument. Example: step.withFallback("getUser", () => fetchUser(id), { fallback: () => fetchFromCache(id) })');let r=n.key??i,e=i,p=D(r),c=f;return(async()=>{let d=c?performance.now():0;f&&a({type:"step_start",workflowId:s,stepId:p,stepKey:r,name:e,ts:Date.now()});let y;try{y=await m()}catch(C){if(W(C))throw a({type:"step_aborted",workflowId:s,stepId:p,stepKey:r,name:e,ts:Date.now(),durationMs:performance.now()-d}),C;let U;try{U=g(C)}catch(O){throw X(O)}if(n.on!==void 0&&n.on!==U){let O=performance.now()-d;throw a({type:"step_error",workflowId:s,stepId:p,stepKey:r,name:e,ts:Date.now(),durationMs:O,error:U}),r&&a({type:"step_complete",workflowId:s,stepKey:r,name:e,ts:Date.now(),durationMs:O,result:K(U,{cause:C}),meta:{origin:"throw",thrown:C}}),u?.(U,e,w),I(U,{origin:"throw",thrown:C})}let h;try{h=await n.fallback()}catch(O){if(W(O))throw a({type:"step_aborted",workflowId:s,stepId:p,stepKey:r,name:e,ts:Date.now(),durationMs:performance.now()-d}),O;let A;try{A=g(O)}catch(Y){throw X(Y)}let z=performance.now()-d;throw a({type:"step_error",workflowId:s,stepId:p,stepKey:r,name:e,ts:Date.now(),durationMs:z,error:A}),r&&a({type:"step_complete",workflowId:s,stepKey:r,name:e,ts:Date.now(),durationMs:z,result:K(A,{cause:O}),meta:{origin:"throw",thrown:O}}),u?.(A,e,w),I(A,{origin:"throw",thrown:O})}if(h.ok){let O=performance.now()-d;return a({type:"step_success",workflowId:s,stepId:p,stepKey:r,name:e,ts:Date.now(),durationMs:O}),r&&a({type:"step_complete",workflowId:s,stepKey:r,name:e,ts:Date.now(),durationMs:O,result:h,meta:{origin:"fallback",fallbackUsed:!0,fallbackReason:String(U)}}),h.value}else{let O=performance.now()-d,A=H(h.error,{origin:"result",resultCause:h.cause});throw a({type:"step_error",workflowId:s,stepId:p,stepKey:r,name:e,ts:Date.now(),durationMs:O,error:A}),r&&a({type:"step_complete",workflowId:s,stepKey:r,name:e,ts:Date.now(),durationMs:O,result:h,meta:{origin:"result",resultCause:h.cause}}),u?.(A,e,w),I(A,{origin:"result",resultCause:h.cause})}}if(y.ok){let C=performance.now()-d;return a({type:"step_success",workflowId:s,stepId:p,stepKey:r,name:e,ts:Date.now(),durationMs:C}),r&&a({type:"step_complete",workflowId:s,stepKey:r,name:e,ts:Date.now(),durationMs:C,result:y}),y.value}let T=y.error;if(n.on!==void 0&&n.on!==T){let C=performance.now()-d,U=H(T,{origin:"result",resultCause:y.cause});throw a({type:"step_error",workflowId:s,stepId:p,stepKey:r,name:e,ts:Date.now(),durationMs:C,error:U}),r&&a({type:"step_complete",workflowId:s,stepKey:r,name:e,ts:Date.now(),durationMs:C,result:y,meta:{origin:"result",resultCause:y.cause}}),u?.(U,e,w),I(U,{origin:"result",resultCause:y.cause})}let x;try{x=await n.fallback()}catch(C){if(W(C))throw a({type:"step_aborted",workflowId:s,stepId:p,stepKey:r,name:e,ts:Date.now(),durationMs:performance.now()-d}),C;let U;try{U=g(C)}catch(O){throw X(O)}let h=performance.now()-d;throw a({type:"step_error",workflowId:s,stepId:p,stepKey:r,name:e,ts:Date.now(),durationMs:h,error:U}),r&&a({type:"step_complete",workflowId:s,stepKey:r,name:e,ts:Date.now(),durationMs:h,result:K(U,{cause:C}),meta:{origin:"throw",thrown:C}}),u?.(U,e,w),I(U,{origin:"throw",thrown:C})}if(x.ok){let C=performance.now()-d;return a({type:"step_success",workflowId:s,stepId:p,stepKey:r,name:e,ts:Date.now(),durationMs:C}),r&&a({type:"step_complete",workflowId:s,stepKey:r,name:e,ts:Date.now(),durationMs:C,result:x,meta:{origin:"fallback",fallbackUsed:!0,fallbackReason:String(T)}}),x.value}let v=performance.now()-d,N=H(x.error,{origin:"result",resultCause:x.cause});throw a({type:"step_error",workflowId:s,stepId:p,stepKey:r,name:e,ts:Date.now(),durationMs:v,error:N}),r&&a({type:"step_complete",workflowId:s,stepKey:r,name:e,ts:Date.now(),durationMs:v,result:x,meta:{origin:"result",resultCause:x.cause}}),u?.(N,e,w),I(N,{origin:"result",resultCause:x.cause})})()},l.withResource=(i,m)=>{if(typeof i!="string"||i.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 n=i,r=i,e=D(n),p=f;return(async()=>{let c=p?performance.now():0;f&&a({type:"step_start",workflowId:s,stepId:e,stepKey:n,name:r,ts:Date.now()});let d;try{d=await m.acquire()}catch(h){if(W(h))throw a({type:"step_aborted",workflowId:s,stepId:e,stepKey:n,name:r,ts:Date.now(),durationMs:performance.now()-c}),h;let O;try{O=g(h)}catch(z){throw X(z)}let A=performance.now()-c;throw a({type:"step_error",workflowId:s,stepId:e,stepKey:n,name:r,ts:Date.now(),durationMs:A,error:O}),n&&a({type:"step_complete",workflowId:s,stepKey:n,name:r,ts:Date.now(),durationMs:A,result:K(O,{cause:h}),meta:{origin:"throw",thrown:h}}),u?.(O,r,w),I(O,{origin:"throw",thrown:h})}if(!d.ok){let h=performance.now()-c,O=H(d.error,{origin:"result",resultCause:d.cause});throw a({type:"step_error",workflowId:s,stepId:e,stepKey:n,name:r,ts:Date.now(),durationMs:h,error:O}),n&&a({type:"step_complete",workflowId:s,stepKey:n,name:r,ts:Date.now(),durationMs:h,result:d,meta:{origin:"result",resultCause:d.cause}}),u?.(O,r,w),I(O,{origin:"result",resultCause:d.cause})}let y=d.value,T,x,v=!1;try{T=await m.use(y)}catch(h){if(W(h)){try{await m.release(y)}catch(O){console.warn(`[awaitly] step.withResource("${i}"): release threw after earlyExit:`,O)}throw h}x=h,v=!0}try{await m.release(y)}catch(h){console.warn(`[awaitly] step.withResource("${i}"): release threw:`,h)}if(v){let h;try{h=g(x)}catch(A){throw X(A)}let O=performance.now()-c;throw a({type:"step_error",workflowId:s,stepId:e,stepKey:n,name:r,ts:Date.now(),durationMs:O,error:h}),n&&a({type:"step_complete",workflowId:s,stepKey:n,name:r,ts:Date.now(),durationMs:O,result:K(h,{cause:x}),meta:{origin:"throw",thrown:x}}),u?.(h,r,w),I(h,{origin:"throw",thrown:x})}let N=T;if(N.ok){let h=performance.now()-c;return a({type:"step_success",workflowId:s,stepId:e,stepKey:n,name:r,ts:Date.now(),durationMs:h}),n&&a({type:"step_complete",workflowId:s,stepKey:n,name:r,ts:Date.now(),durationMs:h,result:N}),N.value}let C=performance.now()-c,U=H(N.error,{origin:"result",resultCause:N.cause});throw a({type:"step_error",workflowId:s,stepId:e,stepKey:n,name:r,ts:Date.now(),durationMs:C,error:U}),n&&a({type:"step_complete",workflowId:s,stepKey:n,name:r,ts:Date.now(),durationMs:C,result:N,meta:{origin:"result",resultCause:N.cause}}),u?.(U,r,w),I(U,{origin:"result",resultCause:N.cause})})()};let V=await o({step:l});if(process.env.NODE_ENV!=="production"&&V!==null&&typeof V=="object"&&"ok"in V&&typeof V.ok=="boolean"){let i=V;(i.ok===!0&&"value"in i||i.ok===!1&&"error"in i)&&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 F(W)}catch(l){if(Ke(l))throw l.thrown;if(B(l)){let X=l.meta.origin==="throw"?l.meta.thrown:l.meta.origin==="result"?l.meta.resultCause:void 0;return K(l.error,{cause:X})}let L=R(l);return i?.(L,"unexpected",y),K(L,{cause:l})}}we.strict=(a,c)=>we(a,c);async function ye(a){return a.length===0?F([]):new Promise(c=>{let i=!1,g=a.length,b=new Array(a.length);for(let D=0;D<a.length;D++){let O=D;Promise.resolve(a[O]).catch(y=>K({type:"PROMISE_REJECTED",cause:y},{cause:{type:"PROMISE_REJECTION",reason:y}})).then(y=>{if(!i){if(!y.ok){i=!0,c(y);return}b[O]=y.value,g--,g===0&&c(F(b))}})}})}function Te(a){return typeof a=="object"&&a!==null&&a.type==="SAGA_COMPENSATION_ERROR"}function ke(a,c,i){if(typeof a!="string"||a.length===0)throw new TypeError("createSagaWorkflow(workflowName, deps, options?): first argument must be a non-empty string. Example: createSagaWorkflow('checkout', { reserveInventory, chargeCard })");return async g=>{let b=crypto.randomUUID(),D=performance.now(),O=[],y=R=>{let E=R.workflowName===void 0?{...R,workflowName:a}:R;i?.onEvent?.(E)};y({type:"saga_start",sagaId:b,ts:Date.now()});async function _(R){let E=[];y({type:"saga_compensation_start",sagaId:b,ts:Date.now(),stepCount:O.length});let C=performance.now();for(let M=O.length-1;M>=0;M--){let o=O[M];try{await o.compensate(o.value),y({type:"saga_compensation_step",sagaId:b,stepName:o.name,ts:Date.now(),success:!0})}catch(I){E.push({stepName:o.name,error:I}),y({type:"saga_compensation_step",sagaId:b,stepName:o.name,ts:Date.now(),success:!1,error:I})}}return y({type:"saga_compensation_end",sagaId:b,ts:Date.now(),durationMs:performance.now()-C,success:E.length===0,failedCount:E.length}),E}let r={step:async function(E,C,M){if(typeof E!="string"||E.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 o=await C();if(o.ok)return M?.compensate&&O.push({name:E,value:o.value,compensate:M.compensate}),o.value;throw Q(o.error,{origin:"result",resultCause:o.cause})},tryStep:async function(E,C,M){if(typeof E!="string"||E.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 o="error"in M?()=>M.error:M.onError;try{let I=await C();return M.compensate&&O.push({name:E,value:I,compensate:M.compensate}),I}catch(I){let B=o(I);throw Q(B,{origin:"throw",thrown:I})}},getCompensations(){return O.map(R=>({name:R.name,hasValue:R.value!==void 0}))}};try{let R=await g({saga:r,deps:c}),E=performance.now()-D;return y({type:"saga_success",sagaId:b,ts:Date.now(),durationMs:E}),F(R)}catch(R){let E=performance.now()-D,C;Z(R)?C=R.error:C=R,y({type:"saga_error",sagaId:b,ts:Date.now(),durationMs:E,error:C});let M=await _(C);if(M.length>0){let o={type:"SAGA_COMPENSATION_ERROR",originalError:C,compensationErrors:M};if(i?.onError?.(o),i?.throwOnCompensationFailure)throw o;return K(o)}return i?.onError?.(C),Z(R)?K(C):K({type:"UNEXPECTED_ERROR",cause:{type:"UNCAUGHT_EXCEPTION",thrown:R}})}}}async function ge(a,c){let i=crypto.randomUUID(),g=performance.now(),b=[],D=_=>{c?.onEvent?.(_)};D({type:"saga_start",sagaId:i,ts:Date.now()});async function O(_){let r=[];D({type:"saga_compensation_start",sagaId:i,ts:Date.now(),stepCount:b.length});let R=performance.now();for(let E=b.length-1;E>=0;E--){let C=b[E];try{await C.compensate(C.value),D({type:"saga_compensation_step",sagaId:i,stepName:C.name,ts:Date.now(),success:!0})}catch(M){r.push({stepName:C.name,error:M}),D({type:"saga_compensation_step",sagaId:i,stepName:C.name,ts:Date.now(),success:!1,error:M})}}return D({type:"saga_compensation_end",sagaId:i,ts:Date.now(),durationMs:performance.now()-R,success:r.length===0,failedCount:r.length}),r}let y={step:async function(r,R,E){if(typeof r!="string"||r.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 C=await R();if(C.ok)return E?.compensate&&b.push({name:r,value:C.value,compensate:E.compensate}),C.value;throw Q(C.error,{origin:"result",resultCause:C.cause})},tryStep:async function(r,R,E){if(typeof r!="string"||r.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 C="error"in E?()=>E.error:E.onError;try{let M=await R();return E.compensate&&b.push({name:r,value:M,compensate:E.compensate}),M}catch(M){let o=C(M);throw Q(o,{origin:"throw",thrown:M})}},getCompensations(){return b.map(_=>({name:_.name,hasValue:_.value!==void 0}))}};try{let _=await a({saga:y}),r=performance.now()-g;return D({type:"saga_success",sagaId:i,ts:Date.now(),durationMs:r}),F(_)}catch(_){let r=performance.now()-g,R;Z(_)?R=_.error:R=_,D({type:"saga_error",sagaId:i,ts:Date.now(),durationMs:r,error:R});let E=await O(R);if(E.length>0){let C={type:"SAGA_COMPENSATION_ERROR",originalError:R,compensationErrors:E};if(c?.onError?.(C),c?.throwOnCompensationFailure)throw C;return K(C)}return c?.onError?.(R),Z(_)?K(R):K({type:"UNEXPECTED_ERROR",cause:{type:"UNCAUGHT_EXCEPTION",thrown:_}})}}0&&(module.exports={createSagaWorkflow,isSagaCompensationError,runSaga});
6
+ See: https://jagreehal.github.io/awaitly/guides/troubleshooting/#returning-ok-from-workflow-executor-double-wrapping`)}return j(V)}catch(l){if(Je(l))throw l.thrown;if(W(l)){let q=l.meta.origin==="throw"?l.meta.thrown:l.meta.origin==="result"?l.meta.resultCause:void 0;return K(l.error,{cause:q})}let L=g(l);return u?.(L,"unexpected",w),K(L,{cause:l})}}be.strict=(o,t)=>be(o,t);async function Ae(o){return o.length===0?j([]):new Promise(t=>{let u=!1,f=o.length,S=new Array(o.length);for(let b=0;b<o.length;b++){let P=b;Promise.resolve(o[P]).catch(w=>K({type:"PROMISE_REJECTED",cause:w},{cause:{type:"PROMISE_REJECTION",reason:w}})).then(w=>{if(!u){if(!w.ok){u=!0,t(w);return}S[P]=w.value,f--,f===0&&t(j(S))}})}})}function Oe(o){return typeof o=="object"&&o!==null&&o.type==="SAGA_COMPENSATION_ERROR"}function ve(o,t,u){if(typeof o!="string"||o.length===0)throw new TypeError("createSagaWorkflow(workflowName, deps, options?): first argument must be a non-empty string. Example: createSagaWorkflow('checkout', { reserveInventory, chargeCard })");return async f=>{let S=crypto.randomUUID(),b=performance.now(),P=[],w=g=>{let E=g.workflowName===void 0?{...g,workflowName:o}:g;u?.onEvent?.(E)};w({type:"saga_start",sagaId:S,ts:Date.now()});async function _(g){let E=[];w({type:"saga_compensation_start",sagaId:S,ts:Date.now(),stepCount:P.length});let k=performance.now();for(let D=P.length-1;D>=0;D--){let a=P[D];try{await a.compensate(a.value),w({type:"saga_compensation_step",sagaId:S,stepName:a.name,ts:Date.now(),success:!0})}catch(I){E.push({stepName:a.name,error:I}),w({type:"saga_compensation_step",sagaId:S,stepName:a.name,ts:Date.now(),success:!1,error:I})}}return w({type:"saga_compensation_end",sagaId:S,ts:Date.now(),durationMs:performance.now()-k,success:E.length===0,failedCount:E.length}),E}let s={step:async function(E,k,D){if(typeof E!="string"||E.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 a=await k();if(a.ok)return D?.compensate&&P.push({name:E,value:a.value,compensate:D.compensate}),a.value;throw ee(a.error,{origin:"result",resultCause:a.cause})},tryStep:async function(E,k,D){if(typeof E!="string"||E.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 a="error"in D?()=>D.error:D.onError;try{let I=await k();return D.compensate&&P.push({name:E,value:I,compensate:D.compensate}),I}catch(I){let W=a(I);throw ee(W,{origin:"throw",thrown:I})}},getCompensations(){return P.map(g=>({name:g.name,hasValue:g.value!==void 0}))}};try{let g=await f({saga:s,deps:t}),E=performance.now()-b;return w({type:"saga_success",sagaId:S,ts:Date.now(),durationMs:E}),j(g)}catch(g){let E=performance.now()-b,k;te(g)?k=g.error:k=g,w({type:"saga_error",sagaId:S,ts:Date.now(),durationMs:E,error:k});let D=await _(k);if(D.length>0){let a={type:"SAGA_COMPENSATION_ERROR",originalError:k,compensationErrors:D};if(u?.onError?.(a),u?.throwOnCompensationFailure)throw a;return K(a)}return u?.onError?.(k),te(g)?K(k):K(new G({cause:g}))}}}async function Me(o,t){let u=crypto.randomUUID(),f=performance.now(),S=[],b=_=>{t?.onEvent?.(_)};b({type:"saga_start",sagaId:u,ts:Date.now()});async function P(_){let s=[];b({type:"saga_compensation_start",sagaId:u,ts:Date.now(),stepCount:S.length});let g=performance.now();for(let E=S.length-1;E>=0;E--){let k=S[E];try{await k.compensate(k.value),b({type:"saga_compensation_step",sagaId:u,stepName:k.name,ts:Date.now(),success:!0})}catch(D){s.push({stepName:k.name,error:D}),b({type:"saga_compensation_step",sagaId:u,stepName:k.name,ts:Date.now(),success:!1,error:D})}}return b({type:"saga_compensation_end",sagaId:u,ts:Date.now(),durationMs:performance.now()-g,success:s.length===0,failedCount:s.length}),s}let w={step:async function(s,g,E){if(typeof s!="string"||s.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 k=await g();if(k.ok)return E?.compensate&&S.push({name:s,value:k.value,compensate:E.compensate}),k.value;throw ee(k.error,{origin:"result",resultCause:k.cause})},tryStep:async function(s,g,E){if(typeof s!="string"||s.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 k="error"in E?()=>E.error:E.onError;try{let D=await g();return E.compensate&&S.push({name:s,value:D,compensate:E.compensate}),D}catch(D){let a=k(D);throw ee(a,{origin:"throw",thrown:D})}},getCompensations(){return S.map(_=>({name:_.name,hasValue:_.value!==void 0}))}};try{let _=await o({saga:w}),s=performance.now()-f;return b({type:"saga_success",sagaId:u,ts:Date.now(),durationMs:s}),j(_)}catch(_){let s=performance.now()-f,g;te(_)?g=_.error:g=_,b({type:"saga_error",sagaId:u,ts:Date.now(),durationMs:s,error:g});let E=await P(g);if(E.length>0){let k={type:"SAGA_COMPENSATION_ERROR",originalError:g,compensationErrors:E};if(t?.onError?.(k),t?.throwOnCompensationFailure)throw k;return K(k)}return t?.onError?.(g),te(_)?K(g):K(new G({cause:_}))}}0&&(module.exports={createSagaWorkflow,isSagaCompensationError,runSaga});
7
7
  //# sourceMappingURL=saga.cjs.map