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/batch.d.cts CHANGED
@@ -1,4 +1,6 @@
1
- import { c as AsyncResult } from './run-entry-C1uFytM6.cjs';
1
+ import { c as AsyncResult } from './run-entry-yQu63Yj9.cjs';
2
+ import './errors-entry-CMH73Eym.cjs';
3
+ import './tagged-error.cjs';
2
4
 
3
5
  /**
4
6
  * awaitly/batch
package/dist/batch.d.ts CHANGED
@@ -1,4 +1,6 @@
1
- import { c as AsyncResult } from './run-entry-C1uFytM6.js';
1
+ import { c as AsyncResult } from './run-entry-rw7zll_G.js';
2
+ import './errors-entry-DOt5UUl4.js';
3
+ import './tagged-error.js';
2
4
 
3
5
  /**
4
6
  * awaitly/batch
package/dist/batch.js CHANGED
@@ -1,7 +1,7 @@
1
- function xe(n){let E=n.trim().match(/^(\d+(?:\.\d+)?)\s*(ms|s|m|h|d)$/i);if(!E)return;let p=parseFloat(E[1]),x=E[2].toLowerCase();return{_tag:"Duration",millis:p*({ms:1,s:1e3,m:6e4,h:36e5,d:864e5}[x]??1)}}var Ce="UNEXPECTED_ERROR";function he(n){return Ce}function L(n){return{ok:!0,value:n}}function N(n,E){let p=E?.cause;return{ok:!1,error:n,...p!==void 0?{cause:p}:{}}}function be(n){if(n==null)return"unknown";if(typeof n=="string")return n.trim()||"unknown";if(typeof n=="object"){let E=n;if(typeof E._tag=="string"){let p=E._tag.trim();if(p)return p}if(typeof E.tag=="string"){let p=E.tag.trim();if(p)return p}if(typeof E.code=="string"){let p=E.code.trim();if(p)return p}else if(typeof E.code=="number")return String(E.code);if(n instanceof Error&&n.name){let p=n.name.trim();if(p)return p}}return"unknown"}function Se(n,E){if(!(!E||!n))return E[n]}function Ae(n){let{intent:E,domain:p,owner:x,tags:P,stateChanges:S,emits:C,calls:d}=n;if(!E&&!p&&!x&&!P?.length&&!S?.length&&!C?.length&&!d?.length)return;let O={};return E&&(O.intent=E),p&&(O.domain=p),x&&(O.owner=x),P?.length&&(O.tags=P),S?.length&&(O.stateChanges=S),C?.length&&(O.emits=C),d?.length&&(O.calls=d),O}function K(n,E,p,x,P){let S=be(n),C=Se(S,E),d={tag:S,origin:p};return C!==void 0&&(d.classification=C),x!==void 0&&(d.attempt=x),P!==void 0&&(d.cumulativeDurationMs=P),d}var J=Symbol.for("step_timeout_marker");function Ee(n){return typeof n!="object"||n===null?!1:n.type==="STEP_TIMEOUT"?!0:J in n}function Pe(n){if(!(typeof n!="object"||n===null)){if(n.type==="STEP_TIMEOUT"){let E=n;return{timeoutMs:E.timeoutMs,stepName:E.stepName,stepKey:E.stepKey,attempt:E.attempt}}if(J in n)return n[J]}}var fe=Symbol("early-exit");function _e(n,E){return{[fe]:!0,error:n,meta:E}}function Me(n){return typeof n=="object"&&n!==null&&n[fe]===!0}var Te=Symbol("mapper-exception");function $(n){return{[Te]:!0,thrown:n}}function ve(n){return typeof n=="object"&&n!==null&&n[Te]===!0}function le(n,E){let{backoff:p,initialDelay:x,maxDelay:P,jitter:S}=E,C;switch(p){case"fixed":C=x;break;case"linear":C=x*n;break;case"exponential":C=x*Math.pow(2,n-1);break}if(C=Math.min(C,P),S){let d=C*.25*Math.random();C=C+d}return Math.floor(C)}function pe(n){return new Promise(E=>setTimeout(E,n))}var ye=Symbol("timeout"),ne=Symbol("timeout-option");function Ie(n){return typeof n=="object"&&n!==null&&n[ne]===!0}async function Oe(n,E,p,x){let P=new AbortController,S=E.onTimeout??"error",C=()=>typeof S=="function"?S({name:p.name,key:p.key,ms:E.ms}):E.error??{type:"STEP_TIMEOUT",stepName:p.name,stepKey:p.key,timeoutMs:E.ms,attempt:p.attempt},d;x?.aborted&&P.abort(x.reason);let O;x&&!x.aborted&&(O=()=>P.abort(x.reason),x.addEventListener("abort",O,{once:!0}));let o=new Promise((_,U)=>{d=setTimeout(()=>{if(S!=="disconnect"&&P.abort(),S==="option"){U({[ne]:!0,ms:E.ms});return}U({[ye]:!0,error:C()})},E.ms)}),I;E.signal?I=Promise.resolve(n(P.signal)):I=Promise.resolve(n());try{return await Promise.race([I,o])}catch(_){if(typeof _=="object"&&_!==null&&_[ne]===!0)throw{[ne]:!0,ms:E.ms};if(typeof _=="object"&&_!==null&&_[ye]===!0){S==="disconnect"&&I.catch(()=>{});let U=_.error;if(typeof U=="object"&&U!==null&&U.type!=="STEP_TIMEOUT"){let F={timeoutMs:E.ms,stepName:p.name,stepKey:p.key,attempt:p.attempt};J in U?U[J]=F:Object.defineProperty(U,J,{value:F,enumerable:!1,writable:!0,configurable:!1})}throw U}throw _}finally{clearTimeout(d),O&&x&&x.removeEventListener("abort",O)}}var G={backoff:"exponential",initialDelay:100,maxDelay:3e4,jitter:!0,retryOn:()=>!0,onRetry:()=>{}};async function de(n,E){let{onError:p,onEvent:x,catchUnexpected:P,workflowId:S,workflowName:C,context:d,_workflowSignal:O}=E&&typeof E=="object"?E:{},o=S??crypto.randomUUID(),I=P??he,_=[],U=0,F=c=>c??`step_${++U}`,a=c=>{let V=c.context!==void 0||d===void 0?c:{...c,context:d},z=C!==void 0&&V.workflowName===void 0?{...V,workflowName:C}:V;if(z.type==="step_success"){let te=z.stepId;for(let re=_.length-1;re>=0;re--){let q=_[re];if(q.type==="race"&&!q.winnerId){q.winnerId=te;break}}}x?.(z,d)},D=_e,B=c=>Me(c),W=(c,V)=>c,j=c=>typeof c=="function"?!1:!!(c&&typeof c=="object"&&"ok"in c||c&&typeof c=="object"&&"then"in c&&typeof c.then=="function");try{let V=function(s){let l={};for(let[r,t]of Object.entries(s))if(typeof t=="function")l[r]=t;else if(t&&typeof t=="object"&&"fn"in t)l[r]=t.fn;else throw new TypeError(`step.parallel: operation "${r}" must be a function or { fn, errors? } object`);return l},z=function(s,l){let r=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let t=performance.now(),e=!1;_.push({scopeId:r,type:"parallel"});let i=()=>{if(e)return;e=!0;let u=_.findIndex(m=>m.scopeId===r);u!==-1&&_.splice(u,1),a({type:"scope_end",workflowId:o,scopeId:r,ts:Date.now(),durationMs:performance.now()-t})};a({type:"scope_start",workflowId:o,scopeId:r,scopeType:"parallel",name:s,ts:Date.now()});try{let u=await l();if(i(),!u.ok)throw p?.(u.error,s,d),D(u.error,{origin:"result",resultCause:u.cause});return u.value}catch(u){throw i(),u}})()},te=function(s,l){let r=Object.keys(s),t=l.name??`Parallel(${r.join(", ")})`,e=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let i=performance.now(),u=!1;_.push({scopeId:e,type:"parallel"});let m=()=>{if(u)return;u=!0;let y=_.findIndex(w=>w.scopeId===e);y!==-1&&_.splice(y,1),a({type:"scope_end",workflowId:o,scopeId:e,ts:Date.now(),durationMs:performance.now()-i})};a({type:"scope_start",workflowId:o,scopeId:e,scopeType:"parallel",name:t,ts:Date.now()});try{let y=await new Promise(T=>{if(r.length===0){T([]);return}let b=!1,v=r.length,k=new Array(r.length);for(let M=0;M<r.length;M++){let R=r[M],h=M;Promise.resolve(s[R]()).catch(g=>N({type:"PROMISE_REJECTED",cause:g},{cause:{type:"PROMISE_REJECTION",reason:g}})).then(g=>{if(!b){if(!g.ok){b=!0,T([{key:R,result:g}]);return}k[h]={key:R,result:g},v--,v===0&&T(k)}})}});m();let w={};for(let{key:T,result:b}of y){if(!b.ok)throw p?.(b.error,T,d),D(b.error,{origin:"result",resultCause:b.cause});w[T]=b.value}return w}catch(y){throw m(),y}})()};var me=V,oe=z,ee=te;let c=(s,l,r)=>(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=r??{},e=Ae(t),i=s,u=t.key??s,m=t.key??s,{description:y,retry:w,timeout:T}=t,b=F(u),v=x,k=v?performance.now():0,R=j(l)?()=>l:l,g={attempts:Math.max(1,w?.attempts??1),backoff:w?.backoff??G.backoff,initialDelay:w?.initialDelay??G.initialDelay,maxDelay:w?.maxDelay??G.maxDelay,jitter:w?.jitter??G.jitter,retryOn:w?.retryOn??G.retryOn,onRetry:w?.onRetry??G.onRetry};x&&a({type:"step_start",workflowId:o,stepId:b,stepKey:u,name:i,description:y,ts:Date.now(),...e&&{metadata:e}});let H;for(let A=1;A<=g.attempts;A++){let Re=v?performance.now():0;try{let f;if(T?f=await Oe(R,T,{name:i,key:u,attempt:A},O):f=await R(),f.ok){let Q=performance.now()-k;return a({type:"step_success",workflowId:o,stepId:b,stepKey:u,name:i,description:y,ts:Date.now(),durationMs:Q,...e&&{metadata:e}}),m&&a({type:"step_complete",workflowId:o,stepKey:m,name:i,description:y,ts:Date.now(),durationMs:Q,result:f,...e&&{metadata:e}}),f.value}if(H=f,A<g.attempts&&g.retryOn(f.error,A)){let Q=le(A,g);a({type:"step_retry",workflowId:o,stepId:b,stepKey:u,name:i,ts:Date.now(),attempt:A+1,maxAttempts:g.attempts,delayMs:Q,error:f.error,...e&&{metadata:e},diagnostics:K(f.error,t.errorMeta,"result",A,performance.now()-k)}),g.onRetry(f.error,A,Q),await pe(Q);continue}g.attempts>1&&a({type:"step_retries_exhausted",workflowId:o,stepId:b,stepKey:u,name:i,ts:Date.now(),durationMs:performance.now()-k,attempts:A,lastError:f.error,...e&&{metadata:e},diagnostics:K(f.error,t.errorMeta,"result",A,performance.now()-k)});break}catch(f){let Q=performance.now()-Re;if(Ie(f)){let X=f.ms;a({type:"step_timeout",workflowId:o,stepId:b,stepKey:u,name:i,ts:Date.now(),timeoutMs:X,attempt:A,...e&&{metadata:e},diagnostics:K(f,t.errorMeta,"timeout",A)}),a({type:"step_success",workflowId:o,stepId:b,stepKey:u,name:i,description:y,ts:Date.now(),durationMs:performance.now()-k,...e&&{metadata:e}}),m&&a({type:"step_complete",workflowId:o,stepKey:m,name:i,description:y,ts:Date.now(),durationMs:performance.now()-k,result:L(void 0),...e&&{metadata:e}});return}if(B(f))throw a({type:"step_aborted",workflowId:o,stepId:b,stepKey:u,name:i,description:y,ts:Date.now(),durationMs:Q,...e&&{metadata:e}}),f;if(Ee(f)){let X=Pe(f),ge=T?.ms??X?.timeoutMs??0;if(a({type:"step_timeout",workflowId:o,stepId:b,stepKey:u,name:i,ts:Date.now(),timeoutMs:ge,attempt:A,...e&&{metadata:e},diagnostics:K(f,t.errorMeta,"timeout",A)}),A<g.attempts&&g.retryOn(f,A)){let ce=le(A,g);a({type:"step_retry",workflowId:o,stepId:b,stepKey:u,name:i,ts:Date.now(),attempt:A+1,maxAttempts:g.attempts,delayMs:ce,error:f,...e&&{metadata:e},diagnostics:K(f,t.errorMeta,"timeout",A,performance.now()-k)}),g.onRetry(f,A,ce),await pe(ce);continue}g.attempts>1&&a({type:"step_retries_exhausted",workflowId:o,stepId:b,stepKey:u,name:i,ts:Date.now(),durationMs:performance.now()-k,attempts:A,lastError:f,...e&&{metadata:e},diagnostics:K(f,t.errorMeta,"timeout",A,performance.now()-k)});let ue=performance.now()-k;throw a({type:"step_error",workflowId:o,stepId:b,stepKey:u,name:i,description:y,ts:Date.now(),durationMs:ue,error:f,...e&&{metadata:e},diagnostics:K(f,t.errorMeta,"timeout",A,ue)}),m&&a({type:"step_complete",workflowId:o,stepKey:m,name:i,description:y,ts:Date.now(),durationMs:ue,result:N(f,{cause:f}),meta:{origin:"throw",thrown:f},...e&&{metadata:e}}),p?.(f,i,d),D(f,{origin:"throw",thrown:f})}if(A<g.attempts&&g.retryOn(f,A)){let X=le(A,g);a({type:"step_retry",workflowId:o,stepId:b,stepKey:u,name:i,ts:Date.now(),attempt:A+1,maxAttempts:g.attempts,delayMs:X,error:f,...e&&{metadata:e},diagnostics:K(f,t.errorMeta,"throw",A,performance.now()-k)}),g.onRetry(f,A,X),await pe(X);continue}g.attempts>1&&!Ee(f)&&a({type:"step_retries_exhausted",workflowId:o,stepId:b,stepKey:u,name:i,ts:Date.now(),durationMs:performance.now()-k,attempts:A,lastError:f,...e&&{metadata:e},diagnostics:K(f,t.errorMeta,"throw",A,performance.now()-k)});let ie=performance.now()-k,Z;try{Z=I(f)}catch(X){throw $(X)}throw a({type:"step_error",workflowId:o,stepId:b,stepKey:u,name:i,description:y,ts:Date.now(),durationMs:ie,error:Z,...e&&{metadata:e},diagnostics:K(f,t.errorMeta,"throw",A,ie)}),m&&a({type:"step_complete",workflowId:o,stepKey:m,name:i,description:y,ts:Date.now(),durationMs:ie,result:N(Z,{cause:f}),meta:{origin:"throw",thrown:f},...e&&{metadata:e}}),p?.(Z,i,d),D(Z,{origin:"throw",thrown:f})}}let Y=H,se=performance.now()-k,ae=W(Y.error,{origin:"result",resultCause:Y.cause});throw a({type:"step_error",workflowId:o,stepId:b,stepKey:u,name:i,description:y,ts:Date.now(),durationMs:se,error:ae,...e&&{metadata:e},diagnostics:K(Y.error,t.errorMeta,"result",g.attempts,se)}),m&&a({type:"step_complete",workflowId:o,stepKey:m,name:i,description:y,ts:Date.now(),durationMs:se,result:Y,meta:{origin:"result",resultCause:Y.cause},...e&&{metadata:e}}),p?.(ae,i,d),D(ae,{origin:"result",resultCause:Y.cause})})();c.try=(s,l,r)=>{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=r.key??s,e=s,i=s,u="error"in r?()=>r.error:r.onError,m=x;return(async()=>{let y=m?performance.now():0;x&&a({type:"step_start",workflowId:o,stepId:i,stepKey:t,name:e,ts:Date.now()});try{let w=await l(),T=performance.now()-y;return a({type:"step_success",workflowId:o,stepId:i,stepKey:t,name:e,ts:Date.now(),durationMs:T}),t&&a({type:"step_complete",workflowId:o,stepKey:t,name:e,ts:Date.now(),durationMs:T,result:L(w)}),w}catch(w){let T=u(w),b=performance.now()-y,v=W(T,{origin:"throw",thrown:w});throw a({type:"step_error",workflowId:o,stepId:i,stepKey:t,name:e,ts:Date.now(),durationMs:b,error:v}),t&&a({type:"step_complete",workflowId:o,stepKey:t,name:e,ts:Date.now(),durationMs:b,result:N(T,{cause:w}),meta:{origin:"throw",thrown:w}}),p?.(v,e,d),D(v,{origin:"throw",thrown:w})}})()},c.fromResult=(s,l,r)=>{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=r.key??s,e=s,i=s,u="error"in r?()=>r.error:r.onError,m=x;return(async()=>{let y=m?performance.now():0;x&&a({type:"step_start",workflowId:o,stepId:i,stepKey:t,name:e,ts:Date.now()});let w=await l();if(w.ok){let T=performance.now()-y;return a({type:"step_success",workflowId:o,stepId:i,stepKey:t,name:e,ts:Date.now(),durationMs:T}),t&&a({type:"step_complete",workflowId:o,stepKey:t,name:e,ts:Date.now(),durationMs:T,result:L(w.value)}),w.value}else{let T=u(w.error),b=performance.now()-y,v=W(T,{origin:"result",resultCause:w.error});throw a({type:"step_error",workflowId:o,stepId:i,stepKey:t,name:e,ts:Date.now(),durationMs:b,error:v}),t&&a({type:"step_complete",workflowId:o,stepKey:t,name:e,ts:Date.now(),durationMs:b,result:N(T,{cause:w.error}),meta:{origin:"result",resultCause:w.error}}),p?.(v,e,d),D(v,{origin:"result",resultCause:w.error})}})()},c.fromNullable=(s,l,r,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 c(s,async()=>{let e=await l();return e!=null?L(e):N(r())},t)},c.retry=(s,l,r)=>{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 c(s,l,{key:r.key??s,retry:{attempts:r.attempts,backoff:r.backoff,initialDelay:r.initialDelay,maxDelay:r.maxDelay,jitter:r.jitter,retryOn:r.retryOn,onRetry:r.onRetry},timeout:r.timeout})},c.withTimeout=(s,l,r)=>{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 c(s,l,{key:r.key??s,timeout:r})},c.sleep=(s,l,r)=>{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 l=="string"?xe(l):l;if(!t)throw new Error(`step.sleep: invalid duration '${l}'`);let e=t.millis,i=r?.signal;return c(s,async()=>{if(O?.aborted||i?.aborted){let u=new Error("Sleep aborted");throw u.name="AbortError",u}return new Promise((u,m)=>{let y={timeoutId:void 0},w=()=>{y.timeoutId&&clearTimeout(y.timeoutId);let T=new Error("Sleep aborted");T.name="AbortError",m(T)};O?.addEventListener("abort",w,{once:!0}),i?.addEventListener("abort",w,{once:!0}),y.timeoutId=setTimeout(()=>{O?.removeEventListener("abort",w),i?.removeEventListener("abort",w),u(L(void 0))},e)})},{key:r?.key??s,description:r?.description})},c.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 l=s[0],r=s[1];if(typeof r=="function")return z(l,r);if(r&&typeof r=="object"&&!Array.isArray(r)){let e=V(r);return te(e,{name:l})}throw new TypeError("step.parallel(name, ...): second argument must be a function (array form) or an object of operations (object form).")}),c.race=(s,l)=>{let r=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let t=performance.now(),e=!1,i={scopeId:r,type:"race",winnerId:void 0};_.push(i);let u=()=>{if(e)return;e=!0;let m=_.findIndex(y=>y.scopeId===r);m!==-1&&_.splice(m,1),a({type:"scope_end",workflowId:o,scopeId:r,ts:Date.now(),durationMs:performance.now()-t,winnerId:i.winnerId})};a({type:"scope_start",workflowId:o,scopeId:r,scopeType:"race",name:s,ts:Date.now()});try{let m=await l();if(u(),!m.ok)throw p?.(m.error,s,d),D(m.error,{origin:"result",resultCause:m.cause});return m.value}catch(m){throw u(),m}})()},c.allSettled=(s,l)=>{let r=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let t=performance.now(),e=!1;_.push({scopeId:r,type:"allSettled"});let i=()=>{if(e)return;e=!0;let u=_.findIndex(m=>m.scopeId===r);u!==-1&&_.splice(u,1),a({type:"scope_end",workflowId:o,scopeId:r,ts:Date.now(),durationMs:performance.now()-t})};a({type:"scope_start",workflowId:o,scopeId:r,scopeType:"allSettled",name:s,ts:Date.now()});try{let u=await l();if(i(),!u.ok)throw p?.(u.error,s,d),D(u.error,{origin:"result",resultCause:u.cause});return u.value}catch(u){throw i(),u}})()},c.if=(s,l,r)=>r(),c.label=c.if,c.branch=async(s,l)=>{let{condition:r,then:t,else:e}=l;if(r())return await t();if(e)return await e()},c.arm=(s,l)=>({fn:s,errors:l}),c.forEach=async(s,l,r)=>{let t=[],e=r.maxIterations,i=0,u="run"in r,m=Symbol.asyncIterator in l?l:(async function*(){yield*l})();for await(let y of m){if(e!==void 0&&i>=e)break;let w;u?w=await r.run(y,i):w=await r.item.handler(y,i,c),t.push(w),i++}return t},c.item=s=>({__forEachItemHandler:!0,handler:s}),c.dep=(s,l)=>l,c.run=(s,l,r)=>c(s,()=>l,r),c.workflow=(s,l,r)=>c(s,l,r),c.andThen=(s,l,r,t)=>c(s,()=>r(l),t),c.match=async(s,l,r,t)=>c(s,async()=>{let e=await l;return e.ok?L(await r.ok(e.value)):L(await r.err(e.error,e.cause))},t),c.all=c.parallel,c.map=async(s,l,r,t)=>{let e=t?.concurrency??l.length;return c(s,()=>e>=l.length?we(l.map((i,u)=>r(i,u))):(async()=>{let i=[];for(let u=0;u<l.length;u+=e){let m=l.slice(u,u+e),y=await we(m.map((w,T)=>r(w,u+T)));if(!y.ok)return y;i.push(...y.value)}return L(i)})(),{key:t?.key})},c.withFallback=(s,l,r)=>{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=r.key??s,e=s,i=F(t),u=x;return(async()=>{let m=u?performance.now():0;x&&a({type:"step_start",workflowId:o,stepId:i,stepKey:t,name:e,ts:Date.now()});let y;try{y=await l()}catch(k){if(B(k))throw a({type:"step_aborted",workflowId:o,stepId:i,stepKey:t,name:e,ts:Date.now(),durationMs:performance.now()-m}),k;let M;try{M=I(k)}catch(h){throw $(h)}if(r.on!==void 0&&r.on!==M){let h=performance.now()-m;throw a({type:"step_error",workflowId:o,stepId:i,stepKey:t,name:e,ts:Date.now(),durationMs:h,error:M}),t&&a({type:"step_complete",workflowId:o,stepKey:t,name:e,ts:Date.now(),durationMs:h,result:N(M,{cause:k}),meta:{origin:"throw",thrown:k}}),p?.(M,e,d),D(M,{origin:"throw",thrown:k})}let R;try{R=await r.fallback()}catch(h){if(B(h))throw a({type:"step_aborted",workflowId:o,stepId:i,stepKey:t,name:e,ts:Date.now(),durationMs:performance.now()-m}),h;let g;try{g=I(h)}catch(Y){throw $(Y)}let H=performance.now()-m;throw a({type:"step_error",workflowId:o,stepId:i,stepKey:t,name:e,ts:Date.now(),durationMs:H,error:g}),t&&a({type:"step_complete",workflowId:o,stepKey:t,name:e,ts:Date.now(),durationMs:H,result:N(g,{cause:h}),meta:{origin:"throw",thrown:h}}),p?.(g,e,d),D(g,{origin:"throw",thrown:h})}if(R.ok){let h=performance.now()-m;return a({type:"step_success",workflowId:o,stepId:i,stepKey:t,name:e,ts:Date.now(),durationMs:h}),t&&a({type:"step_complete",workflowId:o,stepKey:t,name:e,ts:Date.now(),durationMs:h,result:R,meta:{origin:"fallback",fallbackUsed:!0,fallbackReason:String(M)}}),R.value}else{let h=performance.now()-m,g=W(R.error,{origin:"result",resultCause:R.cause});throw a({type:"step_error",workflowId:o,stepId:i,stepKey:t,name:e,ts:Date.now(),durationMs:h,error:g}),t&&a({type:"step_complete",workflowId:o,stepKey:t,name:e,ts:Date.now(),durationMs:h,result:R,meta:{origin:"result",resultCause:R.cause}}),p?.(g,e,d),D(g,{origin:"result",resultCause:R.cause})}}if(y.ok){let k=performance.now()-m;return a({type:"step_success",workflowId:o,stepId:i,stepKey:t,name:e,ts:Date.now(),durationMs:k}),t&&a({type:"step_complete",workflowId:o,stepKey:t,name:e,ts:Date.now(),durationMs:k,result:y}),y.value}let w=y.error;if(r.on!==void 0&&r.on!==w){let k=performance.now()-m,M=W(w,{origin:"result",resultCause:y.cause});throw a({type:"step_error",workflowId:o,stepId:i,stepKey:t,name:e,ts:Date.now(),durationMs:k,error:M}),t&&a({type:"step_complete",workflowId:o,stepKey:t,name:e,ts:Date.now(),durationMs:k,result:y,meta:{origin:"result",resultCause:y.cause}}),p?.(M,e,d),D(M,{origin:"result",resultCause:y.cause})}let T;try{T=await r.fallback()}catch(k){if(B(k))throw a({type:"step_aborted",workflowId:o,stepId:i,stepKey:t,name:e,ts:Date.now(),durationMs:performance.now()-m}),k;let M;try{M=I(k)}catch(h){throw $(h)}let R=performance.now()-m;throw a({type:"step_error",workflowId:o,stepId:i,stepKey:t,name:e,ts:Date.now(),durationMs:R,error:M}),t&&a({type:"step_complete",workflowId:o,stepKey:t,name:e,ts:Date.now(),durationMs:R,result:N(M,{cause:k}),meta:{origin:"throw",thrown:k}}),p?.(M,e,d),D(M,{origin:"throw",thrown:k})}if(T.ok){let k=performance.now()-m;return a({type:"step_success",workflowId:o,stepId:i,stepKey:t,name:e,ts:Date.now(),durationMs:k}),t&&a({type:"step_complete",workflowId:o,stepKey:t,name:e,ts:Date.now(),durationMs:k,result:T,meta:{origin:"fallback",fallbackUsed:!0,fallbackReason:String(w)}}),T.value}let b=performance.now()-m,v=W(T.error,{origin:"result",resultCause:T.cause});throw a({type:"step_error",workflowId:o,stepId:i,stepKey:t,name:e,ts:Date.now(),durationMs:b,error:v}),t&&a({type:"step_complete",workflowId:o,stepKey:t,name:e,ts:Date.now(),durationMs:b,result:T,meta:{origin:"result",resultCause:T.cause}}),p?.(v,e,d),D(v,{origin:"result",resultCause:T.cause})})()},c.withResource=(s,l)=>{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 r=s,t=s,e=F(r),i=x;return(async()=>{let u=i?performance.now():0;x&&a({type:"step_start",workflowId:o,stepId:e,stepKey:r,name:t,ts:Date.now()});let m;try{m=await l.acquire()}catch(R){if(B(R))throw a({type:"step_aborted",workflowId:o,stepId:e,stepKey:r,name:t,ts:Date.now(),durationMs:performance.now()-u}),R;let h;try{h=I(R)}catch(H){throw $(H)}let g=performance.now()-u;throw a({type:"step_error",workflowId:o,stepId:e,stepKey:r,name:t,ts:Date.now(),durationMs:g,error:h}),r&&a({type:"step_complete",workflowId:o,stepKey:r,name:t,ts:Date.now(),durationMs:g,result:N(h,{cause:R}),meta:{origin:"throw",thrown:R}}),p?.(h,t,d),D(h,{origin:"throw",thrown:R})}if(!m.ok){let R=performance.now()-u,h=W(m.error,{origin:"result",resultCause:m.cause});throw a({type:"step_error",workflowId:o,stepId:e,stepKey:r,name:t,ts:Date.now(),durationMs:R,error:h}),r&&a({type:"step_complete",workflowId:o,stepKey:r,name:t,ts:Date.now(),durationMs:R,result:m,meta:{origin:"result",resultCause:m.cause}}),p?.(h,t,d),D(h,{origin:"result",resultCause:m.cause})}let y=m.value,w,T,b=!1;try{w=await l.use(y)}catch(R){if(B(R)){try{await l.release(y)}catch(h){console.warn(`[awaitly] step.withResource("${s}"): release threw after earlyExit:`,h)}throw R}T=R,b=!0}try{await l.release(y)}catch(R){console.warn(`[awaitly] step.withResource("${s}"): release threw:`,R)}if(b){let R;try{R=I(T)}catch(g){throw $(g)}let h=performance.now()-u;throw a({type:"step_error",workflowId:o,stepId:e,stepKey:r,name:t,ts:Date.now(),durationMs:h,error:R}),r&&a({type:"step_complete",workflowId:o,stepKey:r,name:t,ts:Date.now(),durationMs:h,result:N(R,{cause:T}),meta:{origin:"throw",thrown:T}}),p?.(R,t,d),D(R,{origin:"throw",thrown:T})}let v=w;if(v.ok){let R=performance.now()-u;return a({type:"step_success",workflowId:o,stepId:e,stepKey:r,name:t,ts:Date.now(),durationMs:R}),r&&a({type:"step_complete",workflowId:o,stepKey:r,name:t,ts:Date.now(),durationMs:R,result:v}),v.value}let k=performance.now()-u,M=W(v.error,{origin:"result",resultCause:v.cause});throw a({type:"step_error",workflowId:o,stepId:e,stepKey:r,name:t,ts:Date.now(),durationMs:k,error:M}),r&&a({type:"step_complete",workflowId:o,stepKey:r,name:t,ts:Date.now(),durationMs:k,result:v,meta:{origin:"result",resultCause:v.cause}}),p?.(M,t,d),D(M,{origin:"result",resultCause:v.cause})})()};let q=await n({step:c});if(process.env.NODE_ENV!=="production"&&q!==null&&typeof q=="object"&&"ok"in q&&typeof q.ok=="boolean"){let s=q;(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
+ var te=class extends Error{_tag};function L(r,n){return class extends te{_tag=r;constructor(l,T){let A=n?.message?n.message(l??{}):r;if(super(A),this.name=r,Object.setPrototypeOf(this,new.target.prototype),l&&typeof l=="object"){let{_tag:g,name:C,message:d,stack:M,...s}=l,v=Object.prototype.hasOwnProperty.call(s,"cause"),_=v?s.cause:void 0;v&&delete s.cause;let D=T?.cause!==void 0;if(v&&D)throw new TypeError("TaggedError: cannot provide 'cause' in props when also setting ErrorOptions.cause");Object.assign(this,s),v&&(this.cause=_),D&&(this.cause=T?.cause)}else T?.cause!==void 0&&(this.cause=T.cause)}}}Object.defineProperty(L,Symbol.hasInstance,{value:r=>r instanceof te});(A=>{function r(g){return g instanceof Error}A.isError=r;function n(g){return g instanceof te}A.isTaggedError=n;function l(g,C){let d=g._tag,M=C[d];return M(g)}A.match=l;function T(g,C,d){let M=g._tag,s=C[M];return s?s(g):d(g)}A.matchPartial=T})(L||={});var we=class extends L("TimeoutError",{message:n=>n.operation?`TimeoutError: ${n.operation} timed out after ${n.ms}ms`:`TimeoutError: Operation timed out after ${n.ms}ms`}){},fe=class extends L("RetryExhaustedError",{message:n=>n.operation?`RetryExhaustedError: ${n.operation} failed after ${n.attempts} attempts`:`RetryExhaustedError: Operation failed after ${n.attempts} attempts`}){},Te=class extends L("RateLimitError",{message:n=>n.limiterName?`RateLimitError: Rate limit exceeded for ${n.limiterName}${n.retryAfterMs?`, retry after ${n.retryAfterMs}ms`:""}`:`RateLimitError: Rate limit exceeded${n.retryAfterMs?`, retry after ${n.retryAfterMs}ms`:""}`}){},ge=class extends L("CircuitBreakerOpenError",{message:n=>`CircuitBreakerOpenError: Circuit ${n.circuitName} is ${n.state??"OPEN"}${n.retryAfterMs?`, retry after ${Math.ceil(n.retryAfterMs/1e3)}s`:""}`}){},ke=class extends L("ValidationError",{message:n=>`ValidationError: Invalid ${n.field} - ${n.reason}`}){},Re=class extends L("NotFoundError",{message:n=>n.id?`NotFoundError: ${n.resource} with id ${n.id} not found`:`NotFoundError: ${n.resource} not found`}){},xe=class extends L("UnauthorizedError",{message:n=>n.reason?`UnauthorizedError: ${n.reason}`:n.action&&n.resource?`UnauthorizedError: Not authorized to ${n.action} ${n.resource}`:"UnauthorizedError: Access denied"}){},Ce=class extends L("NetworkError",{message:n=>n.url?`NetworkError: ${n.reason} (${n.url})`:`NetworkError: ${n.reason}`}){},he=class extends L("CompensationError",{message:n=>`CompensationError: Failed to compensate step ${n.step}`}){},se=class extends L("UnexpectedError",{message:n=>`UnexpectedError: ${n.cause instanceof Error?n.cause.message:String(n.cause??"unknown")}`}){};function De(r){let n=r.trim().match(/^(\d+(?:\.\d+)?)\s*(ms|s|m|h|d)$/i);if(!n)return;let l=parseFloat(n[1]),T=n[2].toLowerCase();return{_tag:"Duration",millis:l*({ms:1,s:1e3,m:6e4,h:36e5,d:864e5}[T]??1)}}function Ue(r){return new se({cause:r})}function F(r){return{ok:!0,value:r}}function N(r,n){let l=n?.cause;return{ok:!1,error:r,...l!==void 0?{cause:l}:{}}}function Ne(r){if(r==null)return"unknown";if(typeof r=="string")return r.trim()||"unknown";if(typeof r=="object"){let n=r;if(typeof n._tag=="string"){let l=n._tag.trim();if(l)return l}if(typeof n.tag=="string"){let l=n.tag.trim();if(l)return l}if(typeof n.code=="string"){let l=n.code.trim();if(l)return l}else if(typeof n.code=="number")return String(n.code);if(r instanceof Error&&r.name){let l=r.name.trim();if(l)return l}}return"unknown"}function Le(r,n){if(!(!n||!r))return n[r]}function Fe(r){let{intent:n,domain:l,owner:T,tags:A,stateChanges:g,emits:C,calls:d}=r;if(!n&&!l&&!T&&!A?.length&&!g?.length&&!C?.length&&!d?.length)return;let M={};return n&&(M.intent=n),l&&(M.domain=l),T&&(M.owner=T),A?.length&&(M.tags=A),g?.length&&(M.stateChanges=g),C?.length&&(M.emits=C),d?.length&&(M.calls=d),M}function V(r,n,l,T,A){let g=Ne(r),C=Le(g,n),d={tag:g,origin:l};return C!==void 0&&(d.classification=C),T!==void 0&&(d.attempt=T),A!==void 0&&(d.cumulativeDurationMs=A),d}var Z=Symbol.for("step_timeout_marker");function be(r){return typeof r!="object"||r===null?!1:r.type==="STEP_TIMEOUT"?!0:Z in r}function je(r){if(!(typeof r!="object"||r===null)){if(r.type==="STEP_TIMEOUT"){let n=r;return{timeoutMs:n.timeoutMs,stepName:n.stepName,stepKey:n.stepKey,attempt:n.attempt}}if(Z in r)return r[Z]}}var _e=Symbol("early-exit");function Be(r,n){return{[_e]:!0,error:r,meta:n}}function Ke(r){return typeof r=="object"&&r!==null&&r[_e]===!0}var ve=Symbol("mapper-exception");function J(r){return{[ve]:!0,thrown:r}}function Ve(r){return typeof r=="object"&&r!==null&&r[ve]===!0}function Ee(r,n){let{backoff:l,initialDelay:T,maxDelay:A,jitter:g}=n,C;switch(l){case"fixed":C=T;break;case"linear":C=T*r;break;case"exponential":C=T*Math.pow(2,r-1);break}if(C=Math.min(C,A),g){let d=C*.25*Math.random();C=C+d}return Math.floor(C)}function de(r){return new Promise(n=>setTimeout(n,r))}var Se=Symbol("timeout"),ae=Symbol("timeout-option");function $e(r){return typeof r=="object"&&r!==null&&r[ae]===!0}async function He(r,n,l,T){let A=new AbortController,g=n.onTimeout??"error",C=()=>typeof g=="function"?g({name:l.name,key:l.key,ms:n.ms}):n.error??{type:"STEP_TIMEOUT",stepName:l.name,stepKey:l.key,timeoutMs:n.ms,attempt:l.attempt},d;T?.aborted&&A.abort(T.reason);let M;T&&!T.aborted&&(M=()=>A.abort(T.reason),T.addEventListener("abort",M,{once:!0}));let s=new Promise((_,D)=>{d=setTimeout(()=>{if(g!=="disconnect"&&A.abort(),g==="option"){D({[ae]:!0,ms:n.ms});return}D({[Se]:!0,error:C()})},n.ms)}),v;n.signal?v=Promise.resolve(r(A.signal)):v=Promise.resolve(r());try{return await Promise.race([v,s])}catch(_){if(typeof _=="object"&&_!==null&&_[ae]===!0)throw{[ae]:!0,ms:n.ms};if(typeof _=="object"&&_!==null&&_[Se]===!0){g==="disconnect"&&v.catch(()=>{});let D=_.error;if(typeof D=="object"&&D!==null&&D.type!=="STEP_TIMEOUT"){let j={timeoutMs:n.ms,stepName:l.name,stepKey:l.key,attempt:l.attempt};Z in D?D[Z]=j:Object.defineProperty(D,Z,{value:j,enumerable:!1,writable:!0,configurable:!1})}throw D}throw _}finally{clearTimeout(d),M&&T&&T.removeEventListener("abort",M)}}var G={backoff:"exponential",initialDelay:100,maxDelay:3e4,jitter:!0,retryOn:()=>!0,onRetry:()=>{}};async function Ae(r,n){let{onError:l,onEvent:T,catchUnexpected:A,workflowId:g,workflowName:C,context:d,_workflowSignal:M}=n&&typeof n=="object"?n:{},s=g??crypto.randomUUID(),v=A??Ue,_=[],D=0,j=p=>p??`step_${++D}`,i=p=>{let H=p.context!==void 0||d===void 0?p:{...p,context:d},z=C!==void 0&&H.workflowName===void 0?{...H,workflowName:C}:H;if(z.type==="step_success"){let ne=z.stepId;for(let oe=_.length-1;oe>=0;oe--){let W=_[oe];if(W.type==="race"&&!W.winnerId){W.winnerId=ne;break}}}T?.(z,d)},U=Be,K=p=>Ke(p),$=(p,H)=>p,B=p=>typeof p=="function"?!1:!!(p&&typeof p=="object"&&"ok"in p||p&&typeof p=="object"&&"then"in p&&typeof p.then=="function");try{let H=function(a){let m={};for(let[o,t]of Object.entries(a))if(typeof t=="function")m[o]=t;else if(t&&typeof t=="object"&&"fn"in t)m[o]=t.fn;else throw new TypeError(`step.parallel: operation "${o}" must be a function or { fn, errors? } object`);return m},z=function(a,m){let o=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let t=performance.now(),e=!1;_.push({scopeId:o,type:"parallel"});let u=()=>{if(e)return;e=!0;let c=_.findIndex(E=>E.scopeId===o);c!==-1&&_.splice(c,1),i({type:"scope_end",workflowId:s,scopeId:o,ts:Date.now(),durationMs:performance.now()-t})};i({type:"scope_start",workflowId:s,scopeId:o,scopeType:"parallel",name:a,ts:Date.now()});try{let c=await m();if(u(),!c.ok)throw l?.(c.error,a,d),U(c.error,{origin:"result",resultCause:c.cause});return c.value}catch(c){throw u(),c}})()},ne=function(a,m){let o=Object.keys(a),t=m.name??`Parallel(${o.join(", ")})`,e=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let u=performance.now(),c=!1;_.push({scopeId:e,type:"parallel"});let E=()=>{if(c)return;c=!0;let y=_.findIndex(w=>w.scopeId===e);y!==-1&&_.splice(y,1),i({type:"scope_end",workflowId:s,scopeId:e,ts:Date.now(),durationMs:performance.now()-u})};i({type:"scope_start",workflowId:s,scopeId:e,scopeType:"parallel",name:t,ts:Date.now()});try{let y=await new Promise(k=>{if(o.length===0){k([]);return}let S=!1,I=o.length,R=new Array(o.length);for(let O=0;O<o.length;O++){let x=o[O],b=O;Promise.resolve(a[x]()).catch(h=>N({type:"PROMISE_REJECTED",cause:h},{cause:{type:"PROMISE_REJECTION",reason:h}})).then(h=>{if(!S){if(!h.ok){S=!0,k([{key:x,result:h}]);return}R[b]={key:x,result:h},I--,I===0&&k(R)}})}});E();let w={};for(let{key:k,result:S}of y){if(!S.ok)throw l?.(S.error,k,d),U(S.error,{origin:"result",resultCause:S.cause});w[k]=S.value}return w}catch(y){throw E(),y}})()};var ye=H,ie=z,re=ne;let p=(a,m,o)=>(async()=>{if(typeof a!="string"||a.length===0)throw new Error('[awaitly] step() requires an explicit string ID as the first argument. Example: step("fetchUser", () => fetchUser(id))');let t=o??{},e=Fe(t),u=a,c=t.key??a,E=t.key??a,{description:y,retry:w,timeout:k}=t,S=j(c),I=T,R=I?performance.now():0,x=B(m)?()=>m:m,h={attempts:Math.max(1,w?.attempts??1),backoff:w?.backoff??G.backoff,initialDelay:w?.initialDelay??G.initialDelay,maxDelay:w?.maxDelay??G.maxDelay,jitter:w?.jitter??G.jitter,retryOn:w?.retryOn??G.retryOn,onRetry:w?.onRetry??G.onRetry};T&&i({type:"step_start",workflowId:s,stepId:S,stepKey:c,name:u,description:y,ts:Date.now(),...e&&{metadata:e}});let X;for(let P=1;P<=h.attempts;P++){let Oe=I?performance.now():0;try{let f;if(k?f=await He(x,k,{name:u,key:c,attempt:P},M):f=await x(),f.ok){let Q=performance.now()-R;return i({type:"step_success",workflowId:s,stepId:S,stepKey:c,name:u,description:y,ts:Date.now(),durationMs:Q,...e&&{metadata:e}}),E&&i({type:"step_complete",workflowId:s,stepKey:E,name:u,description:y,ts:Date.now(),durationMs:Q,result:f,...e&&{metadata:e}}),f.value}if(X=f,P<h.attempts&&h.retryOn(f.error,P)){let Q=Ee(P,h);i({type:"step_retry",workflowId:s,stepId:S,stepKey:c,name:u,ts:Date.now(),attempt:P+1,maxAttempts:h.attempts,delayMs:Q,error:f.error,...e&&{metadata:e},diagnostics:V(f.error,t.errorMeta,"result",P,performance.now()-R)}),h.onRetry(f.error,P,Q),await de(Q);continue}h.attempts>1&&i({type:"step_retries_exhausted",workflowId:s,stepId:S,stepKey:c,name:u,ts:Date.now(),durationMs:performance.now()-R,attempts:P,lastError:f.error,...e&&{metadata:e},diagnostics:V(f.error,t.errorMeta,"result",P,performance.now()-R)});break}catch(f){let Q=performance.now()-Oe;if($e(f)){let q=f.ms;i({type:"step_timeout",workflowId:s,stepId:S,stepKey:c,name:u,ts:Date.now(),timeoutMs:q,attempt:P,...e&&{metadata:e},diagnostics:V(f,t.errorMeta,"timeout",P)}),i({type:"step_success",workflowId:s,stepId:S,stepKey:c,name:u,description:y,ts:Date.now(),durationMs:performance.now()-R,...e&&{metadata:e}}),E&&i({type:"step_complete",workflowId:s,stepKey:E,name:u,description:y,ts:Date.now(),durationMs:performance.now()-R,result:F(void 0),...e&&{metadata:e}});return}if(K(f))throw i({type:"step_aborted",workflowId:s,stepId:S,stepKey:c,name:u,description:y,ts:Date.now(),durationMs:Q,...e&&{metadata:e}}),f;if(be(f)){let q=je(f),Ie=k?.ms??q?.timeoutMs??0;if(i({type:"step_timeout",workflowId:s,stepId:S,stepKey:c,name:u,ts:Date.now(),timeoutMs:Ie,attempt:P,...e&&{metadata:e},diagnostics:V(f,t.errorMeta,"timeout",P)}),P<h.attempts&&h.retryOn(f,P)){let me=Ee(P,h);i({type:"step_retry",workflowId:s,stepId:S,stepKey:c,name:u,ts:Date.now(),attempt:P+1,maxAttempts:h.attempts,delayMs:me,error:f,...e&&{metadata:e},diagnostics:V(f,t.errorMeta,"timeout",P,performance.now()-R)}),h.onRetry(f,P,me),await de(me);continue}h.attempts>1&&i({type:"step_retries_exhausted",workflowId:s,stepId:S,stepKey:c,name:u,ts:Date.now(),durationMs:performance.now()-R,attempts:P,lastError:f,...e&&{metadata:e},diagnostics:V(f,t.errorMeta,"timeout",P,performance.now()-R)});let pe=performance.now()-R;throw i({type:"step_error",workflowId:s,stepId:S,stepKey:c,name:u,description:y,ts:Date.now(),durationMs:pe,error:f,...e&&{metadata:e},diagnostics:V(f,t.errorMeta,"timeout",P,pe)}),E&&i({type:"step_complete",workflowId:s,stepKey:E,name:u,description:y,ts:Date.now(),durationMs:pe,result:N(f,{cause:f}),meta:{origin:"throw",thrown:f},...e&&{metadata:e}}),l?.(f,u,d),U(f,{origin:"throw",thrown:f})}if(P<h.attempts&&h.retryOn(f,P)){let q=Ee(P,h);i({type:"step_retry",workflowId:s,stepId:S,stepKey:c,name:u,ts:Date.now(),attempt:P+1,maxAttempts:h.attempts,delayMs:q,error:f,...e&&{metadata:e},diagnostics:V(f,t.errorMeta,"throw",P,performance.now()-R)}),h.onRetry(f,P,q),await de(q);continue}h.attempts>1&&!be(f)&&i({type:"step_retries_exhausted",workflowId:s,stepId:S,stepKey:c,name:u,ts:Date.now(),durationMs:performance.now()-R,attempts:P,lastError:f,...e&&{metadata:e},diagnostics:V(f,t.errorMeta,"throw",P,performance.now()-R)});let le=performance.now()-R,ee;try{ee=v(f)}catch(q){throw J(q)}throw i({type:"step_error",workflowId:s,stepId:S,stepKey:c,name:u,description:y,ts:Date.now(),durationMs:le,error:ee,...e&&{metadata:e},diagnostics:V(f,t.errorMeta,"throw",P,le)}),E&&i({type:"step_complete",workflowId:s,stepKey:E,name:u,description:y,ts:Date.now(),durationMs:le,result:N(ee,{cause:f}),meta:{origin:"throw",thrown:f},...e&&{metadata:e}}),l?.(ee,u,d),U(ee,{origin:"throw",thrown:f})}}let Y=X,ue=performance.now()-R,ce=$(Y.error,{origin:"result",resultCause:Y.cause});throw i({type:"step_error",workflowId:s,stepId:S,stepKey:c,name:u,description:y,ts:Date.now(),durationMs:ue,error:ce,...e&&{metadata:e},diagnostics:V(Y.error,t.errorMeta,"result",h.attempts,ue)}),E&&i({type:"step_complete",workflowId:s,stepKey:E,name:u,description:y,ts:Date.now(),durationMs:ue,result:Y,meta:{origin:"result",resultCause:Y.cause},...e&&{metadata:e}}),l?.(ce,u,d),U(ce,{origin:"result",resultCause:Y.cause})})();p.try=(a,m,o)=>{if(typeof a!="string"||a.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=o.key??a,e=a,u=a,c="error"in o?()=>o.error:o.onError,E=T;return(async()=>{let y=E?performance.now():0;T&&i({type:"step_start",workflowId:s,stepId:u,stepKey:t,name:e,ts:Date.now()});try{let w=await m(),k=performance.now()-y;return i({type:"step_success",workflowId:s,stepId:u,stepKey:t,name:e,ts:Date.now(),durationMs:k}),t&&i({type:"step_complete",workflowId:s,stepKey:t,name:e,ts:Date.now(),durationMs:k,result:F(w)}),w}catch(w){let k=c(w),S=performance.now()-y,I=$(k,{origin:"throw",thrown:w});throw i({type:"step_error",workflowId:s,stepId:u,stepKey:t,name:e,ts:Date.now(),durationMs:S,error:I}),t&&i({type:"step_complete",workflowId:s,stepKey:t,name:e,ts:Date.now(),durationMs:S,result:N(k,{cause:w}),meta:{origin:"throw",thrown:w}}),l?.(I,e,d),U(I,{origin:"throw",thrown:w})}})()},p.fromResult=(a,m,o)=>{if(typeof a!="string"||a.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=o.key??a,e=a,u=a,c="error"in o?()=>o.error:o.onError,E=T;return(async()=>{let y=E?performance.now():0;T&&i({type:"step_start",workflowId:s,stepId:u,stepKey:t,name:e,ts:Date.now()});let w=await m();if(w.ok){let k=performance.now()-y;return i({type:"step_success",workflowId:s,stepId:u,stepKey:t,name:e,ts:Date.now(),durationMs:k}),t&&i({type:"step_complete",workflowId:s,stepKey:t,name:e,ts:Date.now(),durationMs:k,result:F(w.value)}),w.value}else{let k=c(w.error),S=performance.now()-y,I=$(k,{origin:"result",resultCause:w.error});throw i({type:"step_error",workflowId:s,stepId:u,stepKey:t,name:e,ts:Date.now(),durationMs:S,error:I}),t&&i({type:"step_complete",workflowId:s,stepKey:t,name:e,ts:Date.now(),durationMs:S,result:N(k,{cause:w.error}),meta:{origin:"result",resultCause:w.error}}),l?.(I,e,d),U(I,{origin:"result",resultCause:w.error})}})()},p.fromNullable=(a,m,o,t)=>{if(typeof a!="string"||a.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 p(a,async()=>{let e=await m();return e!=null?F(e):N(o())},t)},p.retry=(a,m,o)=>{if(typeof a!="string"||a.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 p(a,m,{key:o.key??a,retry:{attempts:o.attempts,backoff:o.backoff,initialDelay:o.initialDelay,maxDelay:o.maxDelay,jitter:o.jitter,retryOn:o.retryOn,onRetry:o.onRetry},timeout:o.timeout})},p.withTimeout=(a,m,o)=>{if(typeof a!="string"||a.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 p(a,m,{key:o.key??a,timeout:o})},p.sleep=(a,m,o)=>{if(typeof a!="string"||a.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"?De(m):m;if(!t)throw new Error(`step.sleep: invalid duration '${m}'`);let e=t.millis,u=o?.signal;return p(a,async()=>{if(M?.aborted||u?.aborted){let c=new Error("Sleep aborted");throw c.name="AbortError",c}return new Promise((c,E)=>{let y={timeoutId:void 0},w=()=>{y.timeoutId&&clearTimeout(y.timeoutId);let k=new Error("Sleep aborted");k.name="AbortError",E(k)};M?.addEventListener("abort",w,{once:!0}),u?.addEventListener("abort",w,{once:!0}),y.timeoutId=setTimeout(()=>{M?.removeEventListener("abort",w),u?.removeEventListener("abort",w),c(F(void 0))},e)})},{key:o?.key??a,description:o?.description})},p.parallel=((...a)=>{if(typeof a[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=a[0],o=a[1];if(typeof o=="function")return z(m,o);if(o&&typeof o=="object"&&!Array.isArray(o)){let e=H(o);return ne(e,{name:m})}throw new TypeError("step.parallel(name, ...): second argument must be a function (array form) or an object of operations (object form).")}),p.race=(a,m)=>{let o=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let t=performance.now(),e=!1,u={scopeId:o,type:"race",winnerId:void 0};_.push(u);let c=()=>{if(e)return;e=!0;let E=_.findIndex(y=>y.scopeId===o);E!==-1&&_.splice(E,1),i({type:"scope_end",workflowId:s,scopeId:o,ts:Date.now(),durationMs:performance.now()-t,winnerId:u.winnerId})};i({type:"scope_start",workflowId:s,scopeId:o,scopeType:"race",name:a,ts:Date.now()});try{let E=await m();if(c(),!E.ok)throw l?.(E.error,a,d),U(E.error,{origin:"result",resultCause:E.cause});return E.value}catch(E){throw c(),E}})()},p.allSettled=(a,m)=>{let o=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let t=performance.now(),e=!1;_.push({scopeId:o,type:"allSettled"});let u=()=>{if(e)return;e=!0;let c=_.findIndex(E=>E.scopeId===o);c!==-1&&_.splice(c,1),i({type:"scope_end",workflowId:s,scopeId:o,ts:Date.now(),durationMs:performance.now()-t})};i({type:"scope_start",workflowId:s,scopeId:o,scopeType:"allSettled",name:a,ts:Date.now()});try{let c=await m();if(u(),!c.ok)throw l?.(c.error,a,d),U(c.error,{origin:"result",resultCause:c.cause});return c.value}catch(c){throw u(),c}})()},p.if=(a,m,o)=>o(),p.label=p.if,p.branch=async(a,m)=>{let{condition:o,then:t,else:e}=m;if(o())return await t();if(e)return await e()},p.arm=(a,m)=>({fn:a,errors:m}),p.forEach=async(a,m,o)=>{let t=[],e=o.maxIterations,u=0,c="run"in o,E=Symbol.asyncIterator in m?m:(async function*(){yield*m})();for await(let y of E){if(e!==void 0&&u>=e)break;let w;c?w=await o.run(y,u):w=await o.item.handler(y,u,p),t.push(w),u++}return t},p.item=a=>({__forEachItemHandler:!0,handler:a}),p.dep=(a,m)=>m,p.run=(a,m,o)=>p(a,()=>m,o),p.workflow=(a,m,o)=>p(a,m,o),p.andThen=(a,m,o,t)=>p(a,()=>o(m),t),p.match=async(a,m,o,t)=>p(a,async()=>{let e=await m;return e.ok?F(await o.ok(e.value)):F(await o.err(e.error,e.cause))},t),p.all=p.parallel,p.map=async(a,m,o,t)=>{let e=t?.concurrency??m.length;return p(a,()=>e>=m.length?Pe(m.map((u,c)=>o(u,c))):(async()=>{let u=[];for(let c=0;c<m.length;c+=e){let E=m.slice(c,c+e),y=await Pe(E.map((w,k)=>o(w,c+k)));if(!y.ok)return y;u.push(...y.value)}return F(u)})(),{key:t?.key})},p.withFallback=(a,m,o)=>{if(typeof a!="string"||a.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=o.key??a,e=a,u=j(t),c=T;return(async()=>{let E=c?performance.now():0;T&&i({type:"step_start",workflowId:s,stepId:u,stepKey:t,name:e,ts:Date.now()});let y;try{y=await m()}catch(R){if(K(R))throw i({type:"step_aborted",workflowId:s,stepId:u,stepKey:t,name:e,ts:Date.now(),durationMs:performance.now()-E}),R;let O;try{O=v(R)}catch(b){throw J(b)}if(o.on!==void 0&&o.on!==O){let b=performance.now()-E;throw i({type:"step_error",workflowId:s,stepId:u,stepKey:t,name:e,ts:Date.now(),durationMs:b,error:O}),t&&i({type:"step_complete",workflowId:s,stepKey:t,name:e,ts:Date.now(),durationMs:b,result:N(O,{cause:R}),meta:{origin:"throw",thrown:R}}),l?.(O,e,d),U(O,{origin:"throw",thrown:R})}let x;try{x=await o.fallback()}catch(b){if(K(b))throw i({type:"step_aborted",workflowId:s,stepId:u,stepKey:t,name:e,ts:Date.now(),durationMs:performance.now()-E}),b;let h;try{h=v(b)}catch(Y){throw J(Y)}let X=performance.now()-E;throw i({type:"step_error",workflowId:s,stepId:u,stepKey:t,name:e,ts:Date.now(),durationMs:X,error:h}),t&&i({type:"step_complete",workflowId:s,stepKey:t,name:e,ts:Date.now(),durationMs:X,result:N(h,{cause:b}),meta:{origin:"throw",thrown:b}}),l?.(h,e,d),U(h,{origin:"throw",thrown:b})}if(x.ok){let b=performance.now()-E;return i({type:"step_success",workflowId:s,stepId:u,stepKey:t,name:e,ts:Date.now(),durationMs:b}),t&&i({type:"step_complete",workflowId:s,stepKey:t,name:e,ts:Date.now(),durationMs:b,result:x,meta:{origin:"fallback",fallbackUsed:!0,fallbackReason:String(O)}}),x.value}else{let b=performance.now()-E,h=$(x.error,{origin:"result",resultCause:x.cause});throw i({type:"step_error",workflowId:s,stepId:u,stepKey:t,name:e,ts:Date.now(),durationMs:b,error:h}),t&&i({type:"step_complete",workflowId:s,stepKey:t,name:e,ts:Date.now(),durationMs:b,result:x,meta:{origin:"result",resultCause:x.cause}}),l?.(h,e,d),U(h,{origin:"result",resultCause:x.cause})}}if(y.ok){let R=performance.now()-E;return i({type:"step_success",workflowId:s,stepId:u,stepKey:t,name:e,ts:Date.now(),durationMs:R}),t&&i({type:"step_complete",workflowId:s,stepKey:t,name:e,ts:Date.now(),durationMs:R,result:y}),y.value}let w=y.error;if(o.on!==void 0&&o.on!==w){let R=performance.now()-E,O=$(w,{origin:"result",resultCause:y.cause});throw i({type:"step_error",workflowId:s,stepId:u,stepKey:t,name:e,ts:Date.now(),durationMs:R,error:O}),t&&i({type:"step_complete",workflowId:s,stepKey:t,name:e,ts:Date.now(),durationMs:R,result:y,meta:{origin:"result",resultCause:y.cause}}),l?.(O,e,d),U(O,{origin:"result",resultCause:y.cause})}let k;try{k=await o.fallback()}catch(R){if(K(R))throw i({type:"step_aborted",workflowId:s,stepId:u,stepKey:t,name:e,ts:Date.now(),durationMs:performance.now()-E}),R;let O;try{O=v(R)}catch(b){throw J(b)}let x=performance.now()-E;throw i({type:"step_error",workflowId:s,stepId:u,stepKey:t,name:e,ts:Date.now(),durationMs:x,error:O}),t&&i({type:"step_complete",workflowId:s,stepKey:t,name:e,ts:Date.now(),durationMs:x,result:N(O,{cause:R}),meta:{origin:"throw",thrown:R}}),l?.(O,e,d),U(O,{origin:"throw",thrown:R})}if(k.ok){let R=performance.now()-E;return i({type:"step_success",workflowId:s,stepId:u,stepKey:t,name:e,ts:Date.now(),durationMs:R}),t&&i({type:"step_complete",workflowId:s,stepKey:t,name:e,ts:Date.now(),durationMs:R,result:k,meta:{origin:"fallback",fallbackUsed:!0,fallbackReason:String(w)}}),k.value}let S=performance.now()-E,I=$(k.error,{origin:"result",resultCause:k.cause});throw i({type:"step_error",workflowId:s,stepId:u,stepKey:t,name:e,ts:Date.now(),durationMs:S,error:I}),t&&i({type:"step_complete",workflowId:s,stepKey:t,name:e,ts:Date.now(),durationMs:S,result:k,meta:{origin:"result",resultCause:k.cause}}),l?.(I,e,d),U(I,{origin:"result",resultCause:k.cause})})()},p.withResource=(a,m)=>{if(typeof a!="string"||a.length===0)throw new Error('[awaitly] step.withResource() requires an explicit string ID as the first argument. Example: step.withResource("useDb", { acquire: () => connect(), use: (db) => query(db), release: (db) => db.close() })');let o=a,t=a,e=j(o),u=T;return(async()=>{let c=u?performance.now():0;T&&i({type:"step_start",workflowId:s,stepId:e,stepKey:o,name:t,ts:Date.now()});let E;try{E=await m.acquire()}catch(x){if(K(x))throw i({type:"step_aborted",workflowId:s,stepId:e,stepKey:o,name:t,ts:Date.now(),durationMs:performance.now()-c}),x;let b;try{b=v(x)}catch(X){throw J(X)}let h=performance.now()-c;throw i({type:"step_error",workflowId:s,stepId:e,stepKey:o,name:t,ts:Date.now(),durationMs:h,error:b}),o&&i({type:"step_complete",workflowId:s,stepKey:o,name:t,ts:Date.now(),durationMs:h,result:N(b,{cause:x}),meta:{origin:"throw",thrown:x}}),l?.(b,t,d),U(b,{origin:"throw",thrown:x})}if(!E.ok){let x=performance.now()-c,b=$(E.error,{origin:"result",resultCause:E.cause});throw i({type:"step_error",workflowId:s,stepId:e,stepKey:o,name:t,ts:Date.now(),durationMs:x,error:b}),o&&i({type:"step_complete",workflowId:s,stepKey:o,name:t,ts:Date.now(),durationMs:x,result:E,meta:{origin:"result",resultCause:E.cause}}),l?.(b,t,d),U(b,{origin:"result",resultCause:E.cause})}let y=E.value,w,k,S=!1;try{w=await m.use(y)}catch(x){if(K(x)){try{await m.release(y)}catch(b){console.warn(`[awaitly] step.withResource("${a}"): release threw after earlyExit:`,b)}throw x}k=x,S=!0}try{await m.release(y)}catch(x){console.warn(`[awaitly] step.withResource("${a}"): release threw:`,x)}if(S){let x;try{x=v(k)}catch(h){throw J(h)}let b=performance.now()-c;throw i({type:"step_error",workflowId:s,stepId:e,stepKey:o,name:t,ts:Date.now(),durationMs:b,error:x}),o&&i({type:"step_complete",workflowId:s,stepKey:o,name:t,ts:Date.now(),durationMs:b,result:N(x,{cause:k}),meta:{origin:"throw",thrown:k}}),l?.(x,t,d),U(x,{origin:"throw",thrown:k})}let I=w;if(I.ok){let x=performance.now()-c;return i({type:"step_success",workflowId:s,stepId:e,stepKey:o,name:t,ts:Date.now(),durationMs:x}),o&&i({type:"step_complete",workflowId:s,stepKey:o,name:t,ts:Date.now(),durationMs:x,result:I}),I.value}let R=performance.now()-c,O=$(I.error,{origin:"result",resultCause:I.cause});throw i({type:"step_error",workflowId:s,stepId:e,stepKey:o,name:t,ts:Date.now(),durationMs:R,error:O}),o&&i({type:"step_complete",workflowId:s,stepKey:o,name:t,ts:Date.now(),durationMs:R,result:I,meta:{origin:"result",resultCause:I.cause}}),l?.(O,t,d),U(O,{origin:"result",resultCause:I.cause})})()};let W=await r({step:p});if(process.env.NODE_ENV!=="production"&&W!==null&&typeof W=="object"&&"ok"in W&&typeof W.ok=="boolean"){let a=W;(a.ok===!0&&"value"in a||a.ok===!1&&"error"in a)&&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 L(q)}catch(c){if(ve(c))throw c.thrown;if(B(c)){let z=c.meta.origin==="throw"?c.meta.thrown:c.meta.origin==="result"?c.meta.resultCause:void 0;return N(c.error,{cause:z})}let V=I(c);return p?.(V,"unexpected",d),N(V,{cause:c})}}de.strict=(n,E)=>de(n,E);async function we(n){return n.length===0?L([]):new Promise(E=>{let p=!1,x=n.length,P=new Array(n.length);for(let S=0;S<n.length;S++){let C=S;Promise.resolve(n[C]).catch(d=>N({type:"PROMISE_REJECTED",cause:d},{cause:{type:"PROMISE_REJECTION",reason:d}})).then(d=>{if(!p){if(!d.ok){p=!0,E(d);return}P[C]=d.value,x--,x===0&&E(L(P))}})}})}function De(n){return typeof n=="object"&&n!==null&&n.type==="QUEUE_FULL"}function ke(n,E){let{maxConcurrent:p,strategy:x="queue",maxQueueSize:P=1/0}=E,S=0,C=[];async function d(){if(S<p){S++;return}if(x==="reject")throw{type:"QUEUE_FULL",limiterName:n,queueSize:C.length,maxQueueSize:P};if(C.length>=P)throw{type:"QUEUE_FULL",limiterName:n,queueSize:C.length,maxQueueSize:P};return new Promise((o,I)=>{C.push({resolve:o,reject:I})})}function O(){S--,C.length>0&&S<p&&(S++,C.shift()?.resolve())}return{async execute(o){await d();try{return await o()}finally{O()}},async executeAll(o){let I=new Array(o.length),_=[];for(let U=0;U<o.length;U++){let F=U,a=this.execute(o[F]).then(D=>{I[F]=D});_.push(a)}return await Promise.all(_),I},async executeResult(o){try{await d()}catch(I){if(De(I))return N(I);throw I}try{return await o()}finally{O()}},getStats(){return{activeCount:S,maxConcurrent:p,queueSize:C.length,maxQueueSize:P}},reset(){for(S=0;C.length>0;)C.shift()?.reject(new Error("Limiter reset"))}}}function Ue(n){return typeof n=="object"&&n!==null&&n.type==="BATCH_PROCESSING_ERROR"}function We(n){return typeof n=="object"&&n!==null&&n.type==="INVALID_BATCH_CONFIG"}var Ne=n=>new Promise(E=>setTimeout(E,n));async function Ve(n,E,p,x){let{batchSize:P,concurrency:S,batchDelayMs:C=0}=p,{afterBatch:d,onProgress:O}=x??{};if(!Number.isInteger(P)||P<1)return N({type:"INVALID_BATCH_CONFIG",reason:"batchSize must be a positive integer",field:"batchSize",value:P});if(!Number.isInteger(S)||S<1)return N({type:"INVALID_BATCH_CONFIG",reason:"concurrency must be a positive integer",field:"concurrency",value:S});if(n.length===0)return L([]);let o=[],I=Math.ceil(n.length/P),_=ke("batch-processor",{maxConcurrent:S});for(let U=0;U<I;U++){let F=U*P,a=Math.min(F+P,n.length),D=n.slice(F,a),B=U+1,W=D.map((j,me)=>async()=>{let oe=F+me,ee=await E(j,oe);if(!ee.ok)throw{type:"BATCH_PROCESSING_ERROR",error:ee.error,itemIndex:oe,batchNumber:B};return ee.value});try{let j=await _.executeAll(W);o.push(...j)}catch(j){if(Ue(j))return N(j);throw j}if(O?.({batch:B,totalBatches:I,processed:o.length,total:n.length,percent:Math.round(o.length/n.length*100)}),d){let j=await d();if(!j.ok)return N({type:"BATCH_PROCESSING_ERROR",error:j.error,batchNumber:B})}C>0&&U<I-1&&await Ne(C)}return L(o)}var qe={conservative:{batchSize:20,concurrency:3,batchDelayMs:50},balanced:{batchSize:50,concurrency:5,batchDelayMs:10},aggressive:{batchSize:100,concurrency:10,batchDelayMs:0}};export{qe as batchPresets,Ue as isBatchProcessingError,We as isInvalidBatchConfigError,Ve as processInBatches};
6
+ See: https://jagreehal.github.io/awaitly/guides/troubleshooting/#returning-ok-from-workflow-executor-double-wrapping`)}return F(W)}catch(p){if(Ve(p))throw p.thrown;if(K(p)){let z=p.meta.origin==="throw"?p.meta.thrown:p.meta.origin==="result"?p.meta.resultCause:void 0;return N(p.error,{cause:z})}let H=v(p);return l?.(H,"unexpected",d),N(H,{cause:p})}}Ae.strict=(r,n)=>Ae(r,n);async function Pe(r){return r.length===0?F([]):new Promise(n=>{let l=!1,T=r.length,A=new Array(r.length);for(let g=0;g<r.length;g++){let C=g;Promise.resolve(r[C]).catch(d=>N({type:"PROMISE_REJECTED",cause:d},{cause:{type:"PROMISE_REJECTION",reason:d}})).then(d=>{if(!l){if(!d.ok){l=!0,n(d);return}A[C]=d.value,T--,T===0&&n(F(A))}})}})}function We(r){return typeof r=="object"&&r!==null&&r.type==="QUEUE_FULL"}function Me(r,n){let{maxConcurrent:l,strategy:T="queue",maxQueueSize:A=1/0}=n,g=0,C=[];async function d(){if(g<l){g++;return}if(T==="reject")throw{type:"QUEUE_FULL",limiterName:r,queueSize:C.length,maxQueueSize:A};if(C.length>=A)throw{type:"QUEUE_FULL",limiterName:r,queueSize:C.length,maxQueueSize:A};return new Promise((s,v)=>{C.push({resolve:s,reject:v})})}function M(){g--,C.length>0&&g<l&&(g++,C.shift()?.resolve())}return{async execute(s){await d();try{return await s()}finally{M()}},async executeAll(s){let v=new Array(s.length),_=[];for(let D=0;D<s.length;D++){let j=D,i=this.execute(s[j]).then(U=>{v[j]=U});_.push(i)}return await Promise.all(_),v},async executeResult(s){try{await d()}catch(v){if(We(v))return N(v);throw v}try{return await s()}finally{M()}},getStats(){return{activeCount:g,maxConcurrent:l,queueSize:C.length,maxQueueSize:A}},reset(){for(g=0;C.length>0;)C.shift()?.reject(new Error("Limiter reset"))}}}function qe(r){return typeof r=="object"&&r!==null&&r.type==="BATCH_PROCESSING_ERROR"}function ot(r){return typeof r=="object"&&r!==null&&r.type==="INVALID_BATCH_CONFIG"}var ze=r=>new Promise(n=>setTimeout(n,r));async function st(r,n,l,T){let{batchSize:A,concurrency:g,batchDelayMs:C=0}=l,{afterBatch:d,onProgress:M}=T??{};if(!Number.isInteger(A)||A<1)return N({type:"INVALID_BATCH_CONFIG",reason:"batchSize must be a positive integer",field:"batchSize",value:A});if(!Number.isInteger(g)||g<1)return N({type:"INVALID_BATCH_CONFIG",reason:"concurrency must be a positive integer",field:"concurrency",value:g});if(r.length===0)return F([]);let s=[],v=Math.ceil(r.length/A),_=Me("batch-processor",{maxConcurrent:g});for(let D=0;D<v;D++){let j=D*A,i=Math.min(j+A,r.length),U=r.slice(j,i),K=D+1,$=U.map((B,ye)=>async()=>{let ie=j+ye,re=await n(B,ie);if(!re.ok)throw{type:"BATCH_PROCESSING_ERROR",error:re.error,itemIndex:ie,batchNumber:K};return re.value});try{let B=await _.executeAll($);s.push(...B)}catch(B){if(qe(B))return N(B);throw B}if(M?.({batch:K,totalBatches:v,processed:s.length,total:r.length,percent:Math.round(s.length/r.length*100)}),d){let B=await d();if(!B.ok)return N({type:"BATCH_PROCESSING_ERROR",error:B.error,batchNumber:K})}C>0&&D<v-1&&await ze(C)}return F(s)}var at={conservative:{batchSize:20,concurrency:3,batchDelayMs:50},balanced:{batchSize:50,concurrency:5,batchDelayMs:10},aggressive:{batchSize:100,concurrency:10,batchDelayMs:0}};export{at as batchPresets,qe as isBatchProcessingError,ot as isInvalidBatchConfigError,st as processInBatches};
7
7
  //# sourceMappingURL=batch.js.map