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/durable.cjs CHANGED
@@ -1,11 +1,11 @@
1
- "use strict";var Ke=Object.defineProperty;var kt=Object.getOwnPropertyDescriptor;var gt=Object.getOwnPropertyNames;var Rt=Object.prototype.hasOwnProperty;var Tt=(e,t)=>{for(var n in t)Ke(e,n,{get:t[n],enumerable:!0})},St=(e,t,n,p)=>{if(t&&typeof t=="object"||typeof t=="function")for(let g of gt(t))!Rt.call(e,g)&&g!==n&&Ke(e,g,{get:()=>t[g],enumerable:!(p=kt(t,g))||p.enumerable});return e};var ht=e=>St(Ke({},"__esModule",{value:!0}),e);var Ht={};Tt(Ht,{durable:()=>yt,isConcurrentExecution:()=>Et,isPersistenceError:()=>wt,isVersionMismatch:()=>ft,isWorkflowCancelled:()=>he});module.exports=ht(Ht);function xt(e){let t=e.trim().match(/^(\d+(?:\.\d+)?)\s*(ms|s|m|h|d)$/i);if(!t)return;let n=parseFloat(t[1]),p=t[2].toLowerCase();return{_tag:"Duration",millis:n*({ms:1,s:1e3,m:6e4,h:36e5,d:864e5}[p]??1)}}var nt="UNEXPECTED_ERROR";function Ne(e){return nt}function G(e){return{ok:!0,value:e}}function K(e,t){let n=t?.cause;return{ok:!1,error:e,...n!==void 0?{cause:n}:{}}}var ot=e=>e===nt||typeof e=="object"&&e!==null&&e.type==="UNEXPECTED_ERROR";function Ct(e){if(e==null)return"unknown";if(typeof e=="string")return e.trim()||"unknown";if(typeof e=="object"){let t=e;if(typeof t._tag=="string"){let n=t._tag.trim();if(n)return n}if(typeof t.tag=="string"){let n=t.tag.trim();if(n)return n}if(typeof t.code=="string"){let n=t.code.trim();if(n)return n}else if(typeof t.code=="number")return String(t.code);if(e instanceof Error&&e.name){let n=e.name.trim();if(n)return n}}return"unknown"}function bt(e,t){if(!(!t||!e))return t[e]}function Be(e){let{intent:t,domain:n,owner:p,tags:g,stateChanges:C,emits:A,calls:D}=e;if(!t&&!n&&!p&&!g?.length&&!C?.length&&!A?.length&&!D?.length)return;let ee={};return t&&(ee.intent=t),n&&(ee.domain=n),p&&(ee.owner=p),g?.length&&(ee.tags=g),C?.length&&(ee.stateChanges=C),A?.length&&(ee.emits=A),D?.length&&(ee.calls=D),ee}function Ee(e,t,n,p,g){let C=Ct(e),A=bt(C,t),D={tag:C,origin:n};return A!==void 0&&(D.classification=A),p!==void 0&&(D.attempt=p),g!==void 0&&(D.cumulativeDurationMs=g),D}var ve=Symbol.for("step_timeout_marker");function et(e){return typeof e!="object"||e===null?!1:e.type==="STEP_TIMEOUT"?!0:ve in e}function vt(e){if(!(typeof e!="object"||e===null)){if(e.type==="STEP_TIMEOUT"){let t=e;return{timeoutMs:t.timeoutMs,stepName:t.stepName,stepKey:t.stepKey,attempt:t.attempt}}if(ve in e)return e[ve]}}var st=Symbol("early-exit");function Ae(e,t){return{[st]:!0,error:e,meta:t}}function Se(e){return typeof e=="object"&&e!==null&&e[st]===!0}var at=Symbol("mapper-exception");function Ce(e){return{[at]:!0,thrown:e}}function At(e){return typeof e=="object"&&e!==null&&e[at]===!0}function Ve(e,t){let{backoff:n,initialDelay:p,maxDelay:g,jitter:C}=t,A;switch(n){case"fixed":A=p;break;case"linear":A=p*e;break;case"exponential":A=p*Math.pow(2,e-1);break}if(A=Math.min(A,g),C){let D=A*.25*Math.random();A=A+D}return Math.floor(A)}function Le(e){return new Promise(t=>setTimeout(t,e))}var tt=Symbol("timeout"),Ue=Symbol("timeout-option");function Dt(e){return typeof e=="object"&&e!==null&&e[Ue]===!0}async function Pt(e,t,n,p){let g=new AbortController,C=t.onTimeout??"error",A=()=>typeof C=="function"?C({name:n.name,key:n.key,ms:t.ms}):t.error??{type:"STEP_TIMEOUT",stepName:n.name,stepKey:n.key,timeoutMs:t.ms,attempt:n.attempt},D;p?.aborted&&g.abort(p.reason);let ee;p&&!p.aborted&&(ee=()=>g.abort(p.reason),p.addEventListener("abort",ee,{once:!0}));let l=new Promise((I,T)=>{D=setTimeout(()=>{if(C!=="disconnect"&&g.abort(),C==="option"){T({[Ue]:!0,ms:t.ms});return}T({[tt]:!0,error:A()})},t.ms)}),Z;t.signal?Z=Promise.resolve(e(g.signal)):Z=Promise.resolve(e());try{return await Promise.race([Z,l])}catch(I){if(typeof I=="object"&&I!==null&&I[Ue]===!0)throw{[Ue]:!0,ms:t.ms};if(typeof I=="object"&&I!==null&&I[tt]===!0){C==="disconnect"&&Z.catch(()=>{});let T=I.error;if(typeof T=="object"&&T!==null&&T.type!=="STEP_TIMEOUT"){let ie={timeoutMs:t.ms,stepName:n.name,stepKey:n.key,attempt:n.attempt};ve in T?T[ve]=ie:Object.defineProperty(T,ve,{value:ie,enumerable:!1,writable:!0,configurable:!1})}throw T}throw I}finally{clearTimeout(D),ee&&p&&p.removeEventListener("abort",ee)}}var be={backoff:"exponential",initialDelay:100,maxDelay:3e4,jitter:!0,retryOn:()=>!0,onRetry:()=>{}};async function We(e,t){let{onError:n,onEvent:p,catchUnexpected:g,workflowId:C,workflowName:A,context:D,_workflowSignal:ee}=t&&typeof t=="object"?t:{},l=C??crypto.randomUUID(),Z=g??Ne,I=[],T=0,ie=s=>s??`step_${++T}`,d=s=>{let H=s.context!==void 0||D===void 0?s:{...s,context:D},oe=A!==void 0&&H.workflowName===void 0?{...H,workflowName:A}:H;if(oe.type==="step_success"){let me=oe.stepId;for(let fe=I.length-1;fe>=0;fe--){let ce=I[fe];if(ce.type==="race"&&!ce.winnerId){ce.winnerId=me;break}}}p?.(oe,D)},q=Ae,b=s=>Se(s),ne=(s,H)=>s,we=s=>typeof s=="function"?!1:!!(s&&typeof s=="object"&&"ok"in s||s&&typeof s=="object"&&"then"in s&&typeof s.then=="function");try{let H=function(m){let c={};for(let[a,o]of Object.entries(m))if(typeof o=="function")c[a]=o;else if(o&&typeof o=="object"&&"fn"in o)c[a]=o.fn;else throw new TypeError(`step.parallel: operation "${a}" must be a function or { fn, errors? } object`);return c},oe=function(m,c){let a=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let o=performance.now(),r=!1;I.push({scopeId:a,type:"parallel"});let i=()=>{if(r)return;r=!0;let w=I.findIndex(S=>S.scopeId===a);w!==-1&&I.splice(w,1),d({type:"scope_end",workflowId:l,scopeId:a,ts:Date.now(),durationMs:performance.now()-o})};d({type:"scope_start",workflowId:l,scopeId:a,scopeType:"parallel",name:m,ts:Date.now()});try{let w=await c();if(i(),!w.ok)throw n?.(w.error,m,D),q(w.error,{origin:"result",resultCause:w.cause});return w.value}catch(w){throw i(),w}})()},me=function(m,c){let a=Object.keys(m),o=c.name??`Parallel(${a.join(", ")})`,r=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let i=performance.now(),w=!1;I.push({scopeId:r,type:"parallel"});let S=()=>{if(w)return;w=!0;let _=I.findIndex(O=>O.scopeId===r);_!==-1&&I.splice(_,1),d({type:"scope_end",workflowId:l,scopeId:r,ts:Date.now(),durationMs:performance.now()-i})};d({type:"scope_start",workflowId:l,scopeId:r,scopeType:"parallel",name:o,ts:Date.now()});try{let _=await new Promise(W=>{if(a.length===0){W([]);return}let V=!1,Q=a.length,j=new Array(a.length);for(let $=0;$<a.length;$++){let F=a[$],B=$;Promise.resolve(m[F]()).catch(P=>K({type:"PROMISE_REJECTED",cause:P},{cause:{type:"PROMISE_REJECTION",reason:P}})).then(P=>{if(!V){if(!P.ok){V=!0,W([{key:F,result:P}]);return}j[B]={key:F,result:P},Q--,Q===0&&W(j)}})}});S();let O={};for(let{key:W,result:V}of _){if(!V.ok)throw n?.(V.error,W,D),q(V.error,{origin:"result",resultCause:V.cause});O[W]=V.value}return O}catch(_){throw S(),_}})()};var ye=H,ke=oe,pe=me;let s=(m,c,a)=>(async()=>{if(typeof m!="string"||m.length===0)throw new Error('[awaitly] step() requires an explicit string ID as the first argument. Example: step("fetchUser", () => fetchUser(id))');let o=a??{},r=Be(o),i=m,w=o.key??m,S=o.key??m,{description:_,retry:O,timeout:W}=o,V=ie(w),Q=p,j=Q?performance.now():0,F=we(c)?()=>c:c,P={attempts:Math.max(1,O?.attempts??1),backoff:O?.backoff??be.backoff,initialDelay:O?.initialDelay??be.initialDelay,maxDelay:O?.maxDelay??be.maxDelay,jitter:O?.jitter??be.jitter,retryOn:O?.retryOn??be.retryOn,onRetry:O?.onRetry??be.onRetry};p&&d({type:"step_start",workflowId:l,stepId:V,stepKey:w,name:i,description:_,ts:Date.now(),...r&&{metadata:r}});let de;for(let v=1;v<=P.attempts;v++){let y=Q?performance.now():0;try{let u;if(W?u=await Pt(F,W,{name:i,key:w,attempt:v},ee):u=await F(),u.ok){let R=performance.now()-j;return d({type:"step_success",workflowId:l,stepId:V,stepKey:w,name:i,description:_,ts:Date.now(),durationMs:R,...r&&{metadata:r}}),S&&d({type:"step_complete",workflowId:l,stepKey:S,name:i,description:_,ts:Date.now(),durationMs:R,result:u,...r&&{metadata:r}}),u.value}if(de=u,v<P.attempts&&P.retryOn(u.error,v)){let R=Ve(v,P);d({type:"step_retry",workflowId:l,stepId:V,stepKey:w,name:i,ts:Date.now(),attempt:v+1,maxAttempts:P.attempts,delayMs:R,error:u.error,...r&&{metadata:r},diagnostics:Ee(u.error,o.errorMeta,"result",v,performance.now()-j)}),P.onRetry(u.error,v,R),await Le(R);continue}P.attempts>1&&d({type:"step_retries_exhausted",workflowId:l,stepId:V,stepKey:w,name:i,ts:Date.now(),durationMs:performance.now()-j,attempts:v,lastError:u.error,...r&&{metadata:r},diagnostics:Ee(u.error,o.errorMeta,"result",v,performance.now()-j)});break}catch(u){let R=performance.now()-y;if(Dt(u)){let M=u.ms;d({type:"step_timeout",workflowId:l,stepId:V,stepKey:w,name:i,ts:Date.now(),timeoutMs:M,attempt:v,...r&&{metadata:r},diagnostics:Ee(u,o.errorMeta,"timeout",v)}),d({type:"step_success",workflowId:l,stepId:V,stepKey:w,name:i,description:_,ts:Date.now(),durationMs:performance.now()-j,...r&&{metadata:r}}),S&&d({type:"step_complete",workflowId:l,stepKey:S,name:i,description:_,ts:Date.now(),durationMs:performance.now()-j,result:G(void 0),...r&&{metadata:r}});return}if(b(u))throw d({type:"step_aborted",workflowId:l,stepId:V,stepKey:w,name:i,description:_,ts:Date.now(),durationMs:R,...r&&{metadata:r}}),u;if(et(u)){let M=vt(u),k=W?.ms??M?.timeoutMs??0;if(d({type:"step_timeout",workflowId:l,stepId:V,stepKey:w,name:i,ts:Date.now(),timeoutMs:k,attempt:v,...r&&{metadata:r},diagnostics:Ee(u,o.errorMeta,"timeout",v)}),v<P.attempts&&P.retryOn(u,v)){let X=Ve(v,P);d({type:"step_retry",workflowId:l,stepId:V,stepKey:w,name:i,ts:Date.now(),attempt:v+1,maxAttempts:P.attempts,delayMs:X,error:u,...r&&{metadata:r},diagnostics:Ee(u,o.errorMeta,"timeout",v,performance.now()-j)}),P.onRetry(u,v,X),await Le(X);continue}P.attempts>1&&d({type:"step_retries_exhausted",workflowId:l,stepId:V,stepKey:w,name:i,ts:Date.now(),durationMs:performance.now()-j,attempts:v,lastError:u,...r&&{metadata:r},diagnostics:Ee(u,o.errorMeta,"timeout",v,performance.now()-j)});let N=performance.now()-j;throw d({type:"step_error",workflowId:l,stepId:V,stepKey:w,name:i,description:_,ts:Date.now(),durationMs:N,error:u,...r&&{metadata:r},diagnostics:Ee(u,o.errorMeta,"timeout",v,N)}),S&&d({type:"step_complete",workflowId:l,stepKey:S,name:i,description:_,ts:Date.now(),durationMs:N,result:K(u,{cause:u}),meta:{origin:"throw",thrown:u},...r&&{metadata:r}}),n?.(u,i,D),q(u,{origin:"throw",thrown:u})}if(v<P.attempts&&P.retryOn(u,v)){let M=Ve(v,P);d({type:"step_retry",workflowId:l,stepId:V,stepKey:w,name:i,ts:Date.now(),attempt:v+1,maxAttempts:P.attempts,delayMs:M,error:u,...r&&{metadata:r},diagnostics:Ee(u,o.errorMeta,"throw",v,performance.now()-j)}),P.onRetry(u,v,M),await Le(M);continue}P.attempts>1&&!et(u)&&d({type:"step_retries_exhausted",workflowId:l,stepId:V,stepKey:w,name:i,ts:Date.now(),durationMs:performance.now()-j,attempts:v,lastError:u,...r&&{metadata:r},diagnostics:Ee(u,o.errorMeta,"throw",v,performance.now()-j)});let h=performance.now()-j,x;try{x=Z(u)}catch(M){throw Ce(M)}throw d({type:"step_error",workflowId:l,stepId:V,stepKey:w,name:i,description:_,ts:Date.now(),durationMs:h,error:x,...r&&{metadata:r},diagnostics:Ee(u,o.errorMeta,"throw",v,h)}),S&&d({type:"step_complete",workflowId:l,stepKey:S,name:i,description:_,ts:Date.now(),durationMs:h,result:K(x,{cause:u}),meta:{origin:"throw",thrown:u},...r&&{metadata:r}}),n?.(x,i,D),q(x,{origin:"throw",thrown:u})}}let f=de,E=performance.now()-j,J=ne(f.error,{origin:"result",resultCause:f.cause});throw d({type:"step_error",workflowId:l,stepId:V,stepKey:w,name:i,description:_,ts:Date.now(),durationMs:E,error:J,...r&&{metadata:r},diagnostics:Ee(f.error,o.errorMeta,"result",P.attempts,E)}),S&&d({type:"step_complete",workflowId:l,stepKey:S,name:i,description:_,ts:Date.now(),durationMs:E,result:f,meta:{origin:"result",resultCause:f.cause},...r&&{metadata:r}}),n?.(J,i,D),q(J,{origin:"result",resultCause:f.cause})})();s.try=(m,c,a)=>{if(typeof m!="string"||m.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 o=a.key??m,r=m,i=m,w="error"in a?()=>a.error:a.onError,S=p;return(async()=>{let _=S?performance.now():0;p&&d({type:"step_start",workflowId:l,stepId:i,stepKey:o,name:r,ts:Date.now()});try{let O=await c(),W=performance.now()-_;return d({type:"step_success",workflowId:l,stepId:i,stepKey:o,name:r,ts:Date.now(),durationMs:W}),o&&d({type:"step_complete",workflowId:l,stepKey:o,name:r,ts:Date.now(),durationMs:W,result:G(O)}),O}catch(O){let W=w(O),V=performance.now()-_,Q=ne(W,{origin:"throw",thrown:O});throw d({type:"step_error",workflowId:l,stepId:i,stepKey:o,name:r,ts:Date.now(),durationMs:V,error:Q}),o&&d({type:"step_complete",workflowId:l,stepKey:o,name:r,ts:Date.now(),durationMs:V,result:K(W,{cause:O}),meta:{origin:"throw",thrown:O}}),n?.(Q,r,D),q(Q,{origin:"throw",thrown:O})}})()},s.fromResult=(m,c,a)=>{if(typeof m!="string"||m.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 o=a.key??m,r=m,i=m,w="error"in a?()=>a.error:a.onError,S=p;return(async()=>{let _=S?performance.now():0;p&&d({type:"step_start",workflowId:l,stepId:i,stepKey:o,name:r,ts:Date.now()});let O=await c();if(O.ok){let W=performance.now()-_;return d({type:"step_success",workflowId:l,stepId:i,stepKey:o,name:r,ts:Date.now(),durationMs:W}),o&&d({type:"step_complete",workflowId:l,stepKey:o,name:r,ts:Date.now(),durationMs:W,result:G(O.value)}),O.value}else{let W=w(O.error),V=performance.now()-_,Q=ne(W,{origin:"result",resultCause:O.error});throw d({type:"step_error",workflowId:l,stepId:i,stepKey:o,name:r,ts:Date.now(),durationMs:V,error:Q}),o&&d({type:"step_complete",workflowId:l,stepKey:o,name:r,ts:Date.now(),durationMs:V,result:K(W,{cause:O.error}),meta:{origin:"result",resultCause:O.error}}),n?.(Q,r,D),q(Q,{origin:"result",resultCause:O.error})}})()},s.fromNullable=(m,c,a,o)=>{if(typeof m!="string"||m.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 s(m,async()=>{let r=await c();return r!=null?G(r):K(a())},o)},s.retry=(m,c,a)=>{if(typeof m!="string"||m.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 s(m,c,{key:a.key??m,retry:{attempts:a.attempts,backoff:a.backoff,initialDelay:a.initialDelay,maxDelay:a.maxDelay,jitter:a.jitter,retryOn:a.retryOn,onRetry:a.onRetry},timeout:a.timeout})},s.withTimeout=(m,c,a)=>{if(typeof m!="string"||m.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 s(m,c,{key:a.key??m,timeout:a})},s.sleep=(m,c,a)=>{if(typeof m!="string"||m.length===0)throw new Error('[awaitly] step.sleep() requires an explicit string ID as the first argument. Example: step.sleep("delay", "5s")');let o=typeof c=="string"?xt(c):c;if(!o)throw new Error(`step.sleep: invalid duration '${c}'`);let r=o.millis,i=a?.signal;return s(m,async()=>{if(ee?.aborted||i?.aborted){let w=new Error("Sleep aborted");throw w.name="AbortError",w}return new Promise((w,S)=>{let _={timeoutId:void 0},O=()=>{_.timeoutId&&clearTimeout(_.timeoutId);let W=new Error("Sleep aborted");W.name="AbortError",S(W)};ee?.addEventListener("abort",O,{once:!0}),i?.addEventListener("abort",O,{once:!0}),_.timeoutId=setTimeout(()=>{ee?.removeEventListener("abort",O),i?.removeEventListener("abort",O),w(G(void 0))},r)})},{key:a?.key??m,description:a?.description})},s.parallel=((...m)=>{if(typeof m[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 c=m[0],a=m[1];if(typeof a=="function")return oe(c,a);if(a&&typeof a=="object"&&!Array.isArray(a)){let r=H(a);return me(r,{name:c})}throw new TypeError("step.parallel(name, ...): second argument must be a function (array form) or an object of operations (object form).")}),s.race=(m,c)=>{let a=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let o=performance.now(),r=!1,i={scopeId:a,type:"race",winnerId:void 0};I.push(i);let w=()=>{if(r)return;r=!0;let S=I.findIndex(_=>_.scopeId===a);S!==-1&&I.splice(S,1),d({type:"scope_end",workflowId:l,scopeId:a,ts:Date.now(),durationMs:performance.now()-o,winnerId:i.winnerId})};d({type:"scope_start",workflowId:l,scopeId:a,scopeType:"race",name:m,ts:Date.now()});try{let S=await c();if(w(),!S.ok)throw n?.(S.error,m,D),q(S.error,{origin:"result",resultCause:S.cause});return S.value}catch(S){throw w(),S}})()},s.allSettled=(m,c)=>{let a=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let o=performance.now(),r=!1;I.push({scopeId:a,type:"allSettled"});let i=()=>{if(r)return;r=!0;let w=I.findIndex(S=>S.scopeId===a);w!==-1&&I.splice(w,1),d({type:"scope_end",workflowId:l,scopeId:a,ts:Date.now(),durationMs:performance.now()-o})};d({type:"scope_start",workflowId:l,scopeId:a,scopeType:"allSettled",name:m,ts:Date.now()});try{let w=await c();if(i(),!w.ok)throw n?.(w.error,m,D),q(w.error,{origin:"result",resultCause:w.cause});return w.value}catch(w){throw i(),w}})()},s.if=(m,c,a)=>a(),s.label=s.if,s.branch=async(m,c)=>{let{condition:a,then:o,else:r}=c;if(a())return await o();if(r)return await r()},s.arm=(m,c)=>({fn:m,errors:c}),s.forEach=async(m,c,a)=>{let o=[],r=a.maxIterations,i=0,w="run"in a,S=Symbol.asyncIterator in c?c:(async function*(){yield*c})();for await(let _ of S){if(r!==void 0&&i>=r)break;let O;w?O=await a.run(_,i):O=await a.item.handler(_,i,s),o.push(O),i++}return o},s.item=m=>({__forEachItemHandler:!0,handler:m}),s.dep=(m,c)=>c,s.run=(m,c,a)=>s(m,()=>c,a),s.workflow=(m,c,a)=>s(m,c,a),s.andThen=(m,c,a,o)=>s(m,()=>a(c),o),s.match=async(m,c,a,o)=>s(m,async()=>{let r=await c;return r.ok?G(await a.ok(r.value)):G(await a.err(r.error,r.cause))},o),s.all=s.parallel,s.map=async(m,c,a,o)=>{let r=o?.concurrency??c.length;return s(m,()=>r>=c.length?rt(c.map((i,w)=>a(i,w))):(async()=>{let i=[];for(let w=0;w<c.length;w+=r){let S=c.slice(w,w+r),_=await rt(S.map((O,W)=>a(O,w+W)));if(!_.ok)return _;i.push(..._.value)}return G(i)})(),{key:o?.key})},s.withFallback=(m,c,a)=>{if(typeof m!="string"||m.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 o=a.key??m,r=m,i=ie(o),w=p;return(async()=>{let S=w?performance.now():0;p&&d({type:"step_start",workflowId:l,stepId:i,stepKey:o,name:r,ts:Date.now()});let _;try{_=await c()}catch(j){if(b(j))throw d({type:"step_aborted",workflowId:l,stepId:i,stepKey:o,name:r,ts:Date.now(),durationMs:performance.now()-S}),j;let $;try{$=Z(j)}catch(B){throw Ce(B)}if(a.on!==void 0&&a.on!==$){let B=performance.now()-S;throw d({type:"step_error",workflowId:l,stepId:i,stepKey:o,name:r,ts:Date.now(),durationMs:B,error:$}),o&&d({type:"step_complete",workflowId:l,stepKey:o,name:r,ts:Date.now(),durationMs:B,result:K($,{cause:j}),meta:{origin:"throw",thrown:j}}),n?.($,r,D),q($,{origin:"throw",thrown:j})}let F;try{F=await a.fallback()}catch(B){if(b(B))throw d({type:"step_aborted",workflowId:l,stepId:i,stepKey:o,name:r,ts:Date.now(),durationMs:performance.now()-S}),B;let P;try{P=Z(B)}catch(f){throw Ce(f)}let de=performance.now()-S;throw d({type:"step_error",workflowId:l,stepId:i,stepKey:o,name:r,ts:Date.now(),durationMs:de,error:P}),o&&d({type:"step_complete",workflowId:l,stepKey:o,name:r,ts:Date.now(),durationMs:de,result:K(P,{cause:B}),meta:{origin:"throw",thrown:B}}),n?.(P,r,D),q(P,{origin:"throw",thrown:B})}if(F.ok){let B=performance.now()-S;return d({type:"step_success",workflowId:l,stepId:i,stepKey:o,name:r,ts:Date.now(),durationMs:B}),o&&d({type:"step_complete",workflowId:l,stepKey:o,name:r,ts:Date.now(),durationMs:B,result:F,meta:{origin:"fallback",fallbackUsed:!0,fallbackReason:String($)}}),F.value}else{let B=performance.now()-S,P=ne(F.error,{origin:"result",resultCause:F.cause});throw d({type:"step_error",workflowId:l,stepId:i,stepKey:o,name:r,ts:Date.now(),durationMs:B,error:P}),o&&d({type:"step_complete",workflowId:l,stepKey:o,name:r,ts:Date.now(),durationMs:B,result:F,meta:{origin:"result",resultCause:F.cause}}),n?.(P,r,D),q(P,{origin:"result",resultCause:F.cause})}}if(_.ok){let j=performance.now()-S;return d({type:"step_success",workflowId:l,stepId:i,stepKey:o,name:r,ts:Date.now(),durationMs:j}),o&&d({type:"step_complete",workflowId:l,stepKey:o,name:r,ts:Date.now(),durationMs:j,result:_}),_.value}let O=_.error;if(a.on!==void 0&&a.on!==O){let j=performance.now()-S,$=ne(O,{origin:"result",resultCause:_.cause});throw d({type:"step_error",workflowId:l,stepId:i,stepKey:o,name:r,ts:Date.now(),durationMs:j,error:$}),o&&d({type:"step_complete",workflowId:l,stepKey:o,name:r,ts:Date.now(),durationMs:j,result:_,meta:{origin:"result",resultCause:_.cause}}),n?.($,r,D),q($,{origin:"result",resultCause:_.cause})}let W;try{W=await a.fallback()}catch(j){if(b(j))throw d({type:"step_aborted",workflowId:l,stepId:i,stepKey:o,name:r,ts:Date.now(),durationMs:performance.now()-S}),j;let $;try{$=Z(j)}catch(B){throw Ce(B)}let F=performance.now()-S;throw d({type:"step_error",workflowId:l,stepId:i,stepKey:o,name:r,ts:Date.now(),durationMs:F,error:$}),o&&d({type:"step_complete",workflowId:l,stepKey:o,name:r,ts:Date.now(),durationMs:F,result:K($,{cause:j}),meta:{origin:"throw",thrown:j}}),n?.($,r,D),q($,{origin:"throw",thrown:j})}if(W.ok){let j=performance.now()-S;return d({type:"step_success",workflowId:l,stepId:i,stepKey:o,name:r,ts:Date.now(),durationMs:j}),o&&d({type:"step_complete",workflowId:l,stepKey:o,name:r,ts:Date.now(),durationMs:j,result:W,meta:{origin:"fallback",fallbackUsed:!0,fallbackReason:String(O)}}),W.value}let V=performance.now()-S,Q=ne(W.error,{origin:"result",resultCause:W.cause});throw d({type:"step_error",workflowId:l,stepId:i,stepKey:o,name:r,ts:Date.now(),durationMs:V,error:Q}),o&&d({type:"step_complete",workflowId:l,stepKey:o,name:r,ts:Date.now(),durationMs:V,result:W,meta:{origin:"result",resultCause:W.cause}}),n?.(Q,r,D),q(Q,{origin:"result",resultCause:W.cause})})()},s.withResource=(m,c)=>{if(typeof m!="string"||m.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 a=m,o=m,r=ie(a),i=p;return(async()=>{let w=i?performance.now():0;p&&d({type:"step_start",workflowId:l,stepId:r,stepKey:a,name:o,ts:Date.now()});let S;try{S=await c.acquire()}catch(F){if(b(F))throw d({type:"step_aborted",workflowId:l,stepId:r,stepKey:a,name:o,ts:Date.now(),durationMs:performance.now()-w}),F;let B;try{B=Z(F)}catch(de){throw Ce(de)}let P=performance.now()-w;throw d({type:"step_error",workflowId:l,stepId:r,stepKey:a,name:o,ts:Date.now(),durationMs:P,error:B}),a&&d({type:"step_complete",workflowId:l,stepKey:a,name:o,ts:Date.now(),durationMs:P,result:K(B,{cause:F}),meta:{origin:"throw",thrown:F}}),n?.(B,o,D),q(B,{origin:"throw",thrown:F})}if(!S.ok){let F=performance.now()-w,B=ne(S.error,{origin:"result",resultCause:S.cause});throw d({type:"step_error",workflowId:l,stepId:r,stepKey:a,name:o,ts:Date.now(),durationMs:F,error:B}),a&&d({type:"step_complete",workflowId:l,stepKey:a,name:o,ts:Date.now(),durationMs:F,result:S,meta:{origin:"result",resultCause:S.cause}}),n?.(B,o,D),q(B,{origin:"result",resultCause:S.cause})}let _=S.value,O,W,V=!1;try{O=await c.use(_)}catch(F){if(b(F)){try{await c.release(_)}catch(B){console.warn(`[awaitly] step.withResource("${m}"): release threw after earlyExit:`,B)}throw F}W=F,V=!0}try{await c.release(_)}catch(F){console.warn(`[awaitly] step.withResource("${m}"): release threw:`,F)}if(V){let F;try{F=Z(W)}catch(P){throw Ce(P)}let B=performance.now()-w;throw d({type:"step_error",workflowId:l,stepId:r,stepKey:a,name:o,ts:Date.now(),durationMs:B,error:F}),a&&d({type:"step_complete",workflowId:l,stepKey:a,name:o,ts:Date.now(),durationMs:B,result:K(F,{cause:W}),meta:{origin:"throw",thrown:W}}),n?.(F,o,D),q(F,{origin:"throw",thrown:W})}let Q=O;if(Q.ok){let F=performance.now()-w;return d({type:"step_success",workflowId:l,stepId:r,stepKey:a,name:o,ts:Date.now(),durationMs:F}),a&&d({type:"step_complete",workflowId:l,stepKey:a,name:o,ts:Date.now(),durationMs:F,result:Q}),Q.value}let j=performance.now()-w,$=ne(Q.error,{origin:"result",resultCause:Q.cause});throw d({type:"step_error",workflowId:l,stepId:r,stepKey:a,name:o,ts:Date.now(),durationMs:j,error:$}),a&&d({type:"step_complete",workflowId:l,stepKey:a,name:o,ts:Date.now(),durationMs:j,result:Q,meta:{origin:"result",resultCause:Q.cause}}),n?.($,o,D),q($,{origin:"result",resultCause:Q.cause})})()};let ce=await e({step:s});if(process.env.NODE_ENV!=="production"&&ce!==null&&typeof ce=="object"&&"ok"in ce&&typeof ce.ok=="boolean"){let m=ce;(m.ok===!0&&"value"in m||m.ok===!1&&"error"in m)&&console.warn(`awaitly: Workflow executor returned a Result-like object. Return raw values, not ok() or err().
1
+ "use strict";var He=Object.defineProperty;var Mt=Object.getOwnPropertyDescriptor;var Ut=Object.getOwnPropertyNames;var Wt=Object.prototype.hasOwnProperty;var Nt=(e,t)=>{for(var o in t)He(e,o,{get:t[o],enumerable:!0})},jt=(e,t,o,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let E of Ut(t))!Wt.call(e,E)&&E!==o&&He(e,E,{get:()=>t[E],enumerable:!(i=Mt(t,E))||i.enumerable});return e};var Kt=e=>jt(He({},"__esModule",{value:!0}),e);var ur={};Nt(ur,{durable:()=>It,isConcurrentExecution:()=>_t,isIdempotencyConflict:()=>Dt,isLeaseExpired:()=>Pt,isPersistenceError:()=>Ot,isVersionMismatch:()=>At,isWorkflowCancelled:()=>be});module.exports=Kt(ur);var We=class extends Error{_tag};function Ee(e,t){return class extends We{_tag=e;constructor(o,i){let E=t?.message?t.message(o??{}):e;if(super(E),this.name=e,Object.setPrototypeOf(this,new.target.prototype),o&&typeof o=="object"){let{_tag:g,name:v,message:A,stack:z,...l}=o,q=Object.prototype.hasOwnProperty.call(l,"cause"),D=q?l.cause:void 0;q&&delete l.cause;let b=i?.cause!==void 0;if(q&&b)throw new TypeError("TaggedError: cannot provide 'cause' in props when also setting ErrorOptions.cause");Object.assign(this,l),q&&(this.cause=D),b&&(this.cause=i?.cause)}else i?.cause!==void 0&&(this.cause=i.cause)}}}Object.defineProperty(Ee,Symbol.hasInstance,{value:e=>e instanceof We});(E=>{function e(g){return g instanceof Error}E.isError=e;function t(g){return g instanceof We}E.isTaggedError=t;function o(g,v){let A=g._tag,z=v[A];return z(g)}E.match=o;function i(g,v,A){let z=g._tag,l=v[z];return l?l(g):A(g)}E.matchPartial=i})(Ee||={});var st=class extends Ee("TimeoutError",{message:t=>t.operation?`TimeoutError: ${t.operation} timed out after ${t.ms}ms`:`TimeoutError: Operation timed out after ${t.ms}ms`}){},at=class extends Ee("RetryExhaustedError",{message:t=>t.operation?`RetryExhaustedError: ${t.operation} failed after ${t.attempts} attempts`:`RetryExhaustedError: Operation failed after ${t.attempts} attempts`}){},it=class extends Ee("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`:""}`}){},ut=class extends Ee("CircuitBreakerOpenError",{message:t=>`CircuitBreakerOpenError: Circuit ${t.circuitName} is ${t.state??"OPEN"}${t.retryAfterMs?`, retry after ${Math.ceil(t.retryAfterMs/1e3)}s`:""}`}){},lt=class extends Ee("ValidationError",{message:t=>`ValidationError: Invalid ${t.field} - ${t.reason}`}){},ct=class extends Ee("NotFoundError",{message:t=>t.id?`NotFoundError: ${t.resource} with id ${t.id} not found`:`NotFoundError: ${t.resource} not found`}){},pt=class extends Ee("UnauthorizedError",{message:t=>t.reason?`UnauthorizedError: ${t.reason}`:t.action&&t.resource?`UnauthorizedError: Not authorized to ${t.action} ${t.resource}`:"UnauthorizedError: Access denied"}){},dt=class extends Ee("NetworkError",{message:t=>t.url?`NetworkError: ${t.reason} (${t.url})`:`NetworkError: ${t.reason}`}){},mt=class extends Ee("CompensationError",{message:t=>`CompensationError: Failed to compensate step ${t.step}`}){},Ne=class extends Ee("UnexpectedError",{message:t=>`UnexpectedError: ${t.cause instanceof Error?t.cause.message:String(t.cause??"unknown")}`}){};function Ft(e){let t=e.trim().match(/^(\d+(?:\.\d+)?)\s*(ms|s|m|h|d)$/i);if(!t)return;let o=parseFloat(t[1]),i=t[2].toLowerCase();return{_tag:"Duration",millis:o*({ms:1,s:1e3,m:6e4,h:36e5,d:864e5}[i]??1)}}function Le(e){return new Ne({cause:e})}function X(e){return{ok:!0,value:e}}function M(e,t){let o=t?.cause;return{ok:!1,error:e,...o!==void 0?{cause:o}:{}}}var yt=e=>e instanceof Ne||typeof e=="object"&&e!==null&&"_tag"in e&&e._tag==="UnexpectedError";function Vt(e){if(e==null)return"unknown";if(typeof e=="string")return e.trim()||"unknown";if(typeof e=="object"){let t=e;if(typeof t._tag=="string"){let o=t._tag.trim();if(o)return o}if(typeof t.tag=="string"){let o=t.tag.trim();if(o)return o}if(typeof t.code=="string"){let o=t.code.trim();if(o)return o}else if(typeof t.code=="number")return String(t.code);if(e instanceof Error&&e.name){let o=e.name.trim();if(o)return o}}return"unknown"}function Lt(e,t){if(!(!t||!e))return t[e]}function ze(e){let{intent:t,domain:o,owner:i,tags:E,stateChanges:g,emits:v,calls:A}=e;if(!t&&!o&&!i&&!E?.length&&!g?.length&&!v?.length&&!A?.length)return;let z={};return t&&(z.intent=t),o&&(z.domain=o),i&&(z.owner=i),E?.length&&(z.tags=E),g?.length&&(z.stateChanges=g),v?.length&&(z.emits=v),A?.length&&(z.calls=A),z}function ke(e,t,o,i,E){let g=Vt(e),v=Lt(g,t),A={tag:g,origin:o};return v!==void 0&&(A.classification=v),i!==void 0&&(A.attempt=i),E!==void 0&&(A.cumulativeDurationMs=E),A}var Oe=Symbol.for("step_timeout_marker");function ft(e){return typeof e!="object"||e===null?!1:e.type==="STEP_TIMEOUT"?!0:Oe in e}function $t(e){if(!(typeof e!="object"||e===null)){if(e.type==="STEP_TIMEOUT"){let t=e;return{timeoutMs:t.timeoutMs,stepName:t.stepName,stepKey:t.stepKey,attempt:t.attempt}}if(Oe in e)return e[Oe]}}var kt=Symbol("early-exit");function Pe(e,t){return{[kt]:!0,error:e,meta:t}}function Ce(e){return typeof e=="object"&&e!==null&&e[kt]===!0}var gt=Symbol("mapper-exception");function Ae(e){return{[gt]:!0,thrown:e}}function Bt(e){return typeof e=="object"&&e!==null&&e[gt]===!0}function qe(e,t){let{backoff:o,initialDelay:i,maxDelay:E,jitter:g}=t,v;switch(o){case"fixed":v=i;break;case"linear":v=i*e;break;case"exponential":v=i*Math.pow(2,e-1);break}if(v=Math.min(v,E),g){let A=v*.25*Math.random();v=v+A}return Math.floor(v)}function Je(e){return new Promise(t=>setTimeout(t,e))}var Et=Symbol("timeout"),Fe=Symbol("timeout-option");function Ht(e){return typeof e=="object"&&e!==null&&e[Fe]===!0}async function qt(e,t,o,i){let E=new AbortController,g=t.onTimeout??"error",v=()=>typeof g=="function"?g({name:o.name,key:o.key,ms:t.ms}):t.error??{type:"STEP_TIMEOUT",stepName:o.name,stepKey:o.key,timeoutMs:t.ms,attempt:o.attempt},A;i?.aborted&&E.abort(i.reason);let z;i&&!i.aborted&&(z=()=>E.abort(i.reason),i.addEventListener("abort",z,{once:!0}));let l=new Promise((D,b)=>{A=setTimeout(()=>{if(g!=="disconnect"&&E.abort(),g==="option"){b({[Fe]:!0,ms:t.ms});return}b({[Et]:!0,error:v()})},t.ms)}),q;t.signal?q=Promise.resolve(e(E.signal)):q=Promise.resolve(e());try{return await Promise.race([q,l])}catch(D){if(typeof D=="object"&&D!==null&&D[Fe]===!0)throw{[Fe]:!0,ms:t.ms};if(typeof D=="object"&&D!==null&&D[Et]===!0){g==="disconnect"&&q.catch(()=>{});let b=D.error;if(typeof b=="object"&&b!==null&&b.type!=="STEP_TIMEOUT"){let ie={timeoutMs:t.ms,stepName:o.name,stepKey:o.key,attempt:o.attempt};Oe in b?b[Oe]=ie:Object.defineProperty(b,Oe,{value:ie,enumerable:!1,writable:!0,configurable:!1})}throw b}throw D}finally{clearTimeout(A),z&&i&&i.removeEventListener("abort",z)}}var _e={backoff:"exponential",initialDelay:100,maxDelay:3e4,jitter:!0,retryOn:()=>!0,onRetry:()=>{}};async function Ve(e,t){let{onError:o,onEvent:i,catchUnexpected:E,workflowId:g,workflowName:v,context:A,_workflowSignal:z}=t&&typeof t=="object"?t:{},l=g??crypto.randomUUID(),q=E??Le,D=[],b=0,ie=w=>w??`step_${++b}`,m=w=>{let B=w.context!==void 0||A===void 0?w:{...w,context:A},J=v!==void 0&&B.workflowName===void 0?{...B,workflowName:v}:B;if(J.type==="step_success"){let fe=J.stepId;for(let ye=D.length-1;ye>=0;ye--){let me=D[ye];if(me.type==="race"&&!me.winnerId){me.winnerId=fe;break}}}i?.(J,A)},H=Pe,U=w=>Ce(w),ce=(w,B)=>w,pe=w=>typeof w=="function"?!1:!!(w&&typeof w=="object"&&"ok"in w||w&&typeof w=="object"&&"then"in w&&typeof w.then=="function");try{let B=function(p){let r={};for(let[s,a]of Object.entries(p))if(typeof a=="function")r[s]=a;else if(a&&typeof a=="object"&&"fn"in a)r[s]=a.fn;else throw new TypeError(`step.parallel: operation "${s}" must be a function or { fn, errors? } object`);return r},J=function(p,r){let s=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let a=performance.now(),n=!1;D.push({scopeId:s,type:"parallel"});let y=()=>{if(n)return;n=!0;let k=D.findIndex(c=>c.scopeId===s);k!==-1&&D.splice(k,1),m({type:"scope_end",workflowId:l,scopeId:s,ts:Date.now(),durationMs:performance.now()-a})};m({type:"scope_start",workflowId:l,scopeId:s,scopeType:"parallel",name:p,ts:Date.now()});try{let k=await r();if(y(),!k.ok)throw o?.(k.error,p,A),H(k.error,{origin:"result",resultCause:k.cause});return k.value}catch(k){throw y(),k}})()},fe=function(p,r){let s=Object.keys(p),a=r.name??`Parallel(${s.join(", ")})`,n=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let y=performance.now(),k=!1;D.push({scopeId:n,type:"parallel"});let c=()=>{if(k)return;k=!0;let x=D.findIndex(O=>O.scopeId===n);x!==-1&&D.splice(x,1),m({type:"scope_end",workflowId:l,scopeId:n,ts:Date.now(),durationMs:performance.now()-y})};m({type:"scope_start",workflowId:l,scopeId:n,scopeType:"parallel",name:a,ts:Date.now()});try{let x=await new Promise(P=>{if(s.length===0){P([]);return}let j=!1,Y=s.length,I=new Array(s.length);for(let ee=0;ee<s.length;ee++){let F=s[ee],N=ee;Promise.resolve(p[F]()).catch(V=>M({type:"PROMISE_REJECTED",cause:V},{cause:{type:"PROMISE_REJECTION",reason:V}})).then(V=>{if(!j){if(!V.ok){j=!0,P([{key:F,result:V}]);return}I[N]={key:F,result:V},Y--,Y===0&&P(I)}})}});c();let O={};for(let{key:P,result:j}of x){if(!j.ok)throw o?.(j.error,P,A),H(j.error,{origin:"result",resultCause:j.cause});O[P]=j.value}return O}catch(x){throw c(),x}})()};var we=B,ge=J,de=fe;let w=(p,r,s)=>(async()=>{if(typeof p!="string"||p.length===0)throw new Error('[awaitly] step() requires an explicit string ID as the first argument. Example: step("fetchUser", () => fetchUser(id))');let a=s??{},n=ze(a),y=p,k=a.key??p,c=a.key??p,{description:x,retry:O,timeout:P}=a,j=ie(k),Y=i,I=Y?performance.now():0,F=pe(r)?()=>r:r,V={attempts:Math.max(1,O?.attempts??1),backoff:O?.backoff??_e.backoff,initialDelay:O?.initialDelay??_e.initialDelay,maxDelay:O?.maxDelay??_e.maxDelay,jitter:O?.jitter??_e.jitter,retryOn:O?.retryOn??_e.retryOn,onRetry:O?.onRetry??_e.onRetry};i&&m({type:"step_start",workflowId:l,stepId:j,stepKey:k,name:y,description:x,ts:Date.now(),...n&&{metadata:n}});let Te;for(let u=1;u<=V.attempts;u++){let G=Y?performance.now():0;try{let R;if(P?R=await qt(F,P,{name:y,key:k,attempt:u},z):R=await F(),R.ok){let d=performance.now()-I;return m({type:"step_success",workflowId:l,stepId:j,stepKey:k,name:y,description:x,ts:Date.now(),durationMs:d,...n&&{metadata:n}}),c&&m({type:"step_complete",workflowId:l,stepKey:c,name:y,description:x,ts:Date.now(),durationMs:d,result:R,...n&&{metadata:n}}),R.value}if(Te=R,u<V.attempts&&V.retryOn(R.error,u)){let d=qe(u,V);m({type:"step_retry",workflowId:l,stepId:j,stepKey:k,name:y,ts:Date.now(),attempt:u+1,maxAttempts:V.attempts,delayMs:d,error:R.error,...n&&{metadata:n},diagnostics:ke(R.error,a.errorMeta,"result",u,performance.now()-I)}),V.onRetry(R.error,u,d),await Je(d);continue}V.attempts>1&&m({type:"step_retries_exhausted",workflowId:l,stepId:j,stepKey:k,name:y,ts:Date.now(),durationMs:performance.now()-I,attempts:u,lastError:R.error,...n&&{metadata:n},diagnostics:ke(R.error,a.errorMeta,"result",u,performance.now()-I)});break}catch(R){let d=performance.now()-G;if(Ht(R)){let S=R.ms;m({type:"step_timeout",workflowId:l,stepId:j,stepKey:k,name:y,ts:Date.now(),timeoutMs:S,attempt:u,...n&&{metadata:n},diagnostics:ke(R,a.errorMeta,"timeout",u)}),m({type:"step_success",workflowId:l,stepId:j,stepKey:k,name:y,description:x,ts:Date.now(),durationMs:performance.now()-I,...n&&{metadata:n}}),c&&m({type:"step_complete",workflowId:l,stepKey:c,name:y,description:x,ts:Date.now(),durationMs:performance.now()-I,result:X(void 0),...n&&{metadata:n}});return}if(U(R))throw m({type:"step_aborted",workflowId:l,stepId:j,stepKey:k,name:y,description:x,ts:Date.now(),durationMs:d,...n&&{metadata:n}}),R;if(ft(R)){let S=$t(R),_=P?.ms??S?.timeoutMs??0;if(m({type:"step_timeout",workflowId:l,stepId:j,stepKey:k,name:y,ts:Date.now(),timeoutMs:_,attempt:u,...n&&{metadata:n},diagnostics:ke(R,a.errorMeta,"timeout",u)}),u<V.attempts&&V.retryOn(R,u)){let T=qe(u,V);m({type:"step_retry",workflowId:l,stepId:j,stepKey:k,name:y,ts:Date.now(),attempt:u+1,maxAttempts:V.attempts,delayMs:T,error:R,...n&&{metadata:n},diagnostics:ke(R,a.errorMeta,"timeout",u,performance.now()-I)}),V.onRetry(R,u,T),await Je(T);continue}V.attempts>1&&m({type:"step_retries_exhausted",workflowId:l,stepId:j,stepKey:k,name:y,ts:Date.now(),durationMs:performance.now()-I,attempts:u,lastError:R,...n&&{metadata:n},diagnostics:ke(R,a.errorMeta,"timeout",u,performance.now()-I)});let K=performance.now()-I;throw m({type:"step_error",workflowId:l,stepId:j,stepKey:k,name:y,description:x,ts:Date.now(),durationMs:K,error:R,...n&&{metadata:n},diagnostics:ke(R,a.errorMeta,"timeout",u,K)}),c&&m({type:"step_complete",workflowId:l,stepKey:c,name:y,description:x,ts:Date.now(),durationMs:K,result:M(R,{cause:R}),meta:{origin:"throw",thrown:R},...n&&{metadata:n}}),o?.(R,y,A),H(R,{origin:"throw",thrown:R})}if(u<V.attempts&&V.retryOn(R,u)){let S=qe(u,V);m({type:"step_retry",workflowId:l,stepId:j,stepKey:k,name:y,ts:Date.now(),attempt:u+1,maxAttempts:V.attempts,delayMs:S,error:R,...n&&{metadata:n},diagnostics:ke(R,a.errorMeta,"throw",u,performance.now()-I)}),V.onRetry(R,u,S),await Je(S);continue}V.attempts>1&&!ft(R)&&m({type:"step_retries_exhausted",workflowId:l,stepId:j,stepKey:k,name:y,ts:Date.now(),durationMs:performance.now()-I,attempts:u,lastError:R,...n&&{metadata:n},diagnostics:ke(R,a.errorMeta,"throw",u,performance.now()-I)});let h=performance.now()-I,C;try{C=q(R)}catch(S){throw Ae(S)}throw m({type:"step_error",workflowId:l,stepId:j,stepKey:k,name:y,description:x,ts:Date.now(),durationMs:h,error:C,...n&&{metadata:n},diagnostics:ke(R,a.errorMeta,"throw",u,h)}),c&&m({type:"step_complete",workflowId:l,stepKey:c,name:y,description:x,ts:Date.now(),durationMs:h,result:M(C,{cause:R}),meta:{origin:"throw",thrown:R},...n&&{metadata:n}}),o?.(C,y,A),H(C,{origin:"throw",thrown:R})}}let oe=Te,Se=performance.now()-I,f=ce(oe.error,{origin:"result",resultCause:oe.cause});throw m({type:"step_error",workflowId:l,stepId:j,stepKey:k,name:y,description:x,ts:Date.now(),durationMs:Se,error:f,...n&&{metadata:n},diagnostics:ke(oe.error,a.errorMeta,"result",V.attempts,Se)}),c&&m({type:"step_complete",workflowId:l,stepKey:c,name:y,description:x,ts:Date.now(),durationMs:Se,result:oe,meta:{origin:"result",resultCause:oe.cause},...n&&{metadata:n}}),o?.(f,y,A),H(f,{origin:"result",resultCause:oe.cause})})();w.try=(p,r,s)=>{if(typeof p!="string"||p.length===0)throw new Error('[awaitly] step.try() requires an explicit string ID as the first argument. Example: step.try("parse", () => JSON.parse(str), { error: "PARSE_ERROR" })');let a=s.key??p,n=p,y=p,k="error"in s?()=>s.error:s.onError,c=i;return(async()=>{let x=c?performance.now():0;i&&m({type:"step_start",workflowId:l,stepId:y,stepKey:a,name:n,ts:Date.now()});try{let O=await r(),P=performance.now()-x;return m({type:"step_success",workflowId:l,stepId:y,stepKey:a,name:n,ts:Date.now(),durationMs:P}),a&&m({type:"step_complete",workflowId:l,stepKey:a,name:n,ts:Date.now(),durationMs:P,result:X(O)}),O}catch(O){let P=k(O),j=performance.now()-x,Y=ce(P,{origin:"throw",thrown:O});throw m({type:"step_error",workflowId:l,stepId:y,stepKey:a,name:n,ts:Date.now(),durationMs:j,error:Y}),a&&m({type:"step_complete",workflowId:l,stepKey:a,name:n,ts:Date.now(),durationMs:j,result:M(P,{cause:O}),meta:{origin:"throw",thrown:O}}),o?.(Y,n,A),H(Y,{origin:"throw",thrown:O})}})()},w.fromResult=(p,r,s)=>{if(typeof p!="string"||p.length===0)throw new Error('[awaitly] step.fromResult() requires an explicit string ID as the first argument. Example: step.fromResult("callProvider", () => callProvider(input), { onError: (e) => ({ type: "FAILED" }) })');let a=s.key??p,n=p,y=p,k="error"in s?()=>s.error:s.onError,c=i;return(async()=>{let x=c?performance.now():0;i&&m({type:"step_start",workflowId:l,stepId:y,stepKey:a,name:n,ts:Date.now()});let O=await r();if(O.ok){let P=performance.now()-x;return m({type:"step_success",workflowId:l,stepId:y,stepKey:a,name:n,ts:Date.now(),durationMs:P}),a&&m({type:"step_complete",workflowId:l,stepKey:a,name:n,ts:Date.now(),durationMs:P,result:X(O.value)}),O.value}else{let P=k(O.error),j=performance.now()-x,Y=ce(P,{origin:"result",resultCause:O.error});throw m({type:"step_error",workflowId:l,stepId:y,stepKey:a,name:n,ts:Date.now(),durationMs:j,error:Y}),a&&m({type:"step_complete",workflowId:l,stepKey:a,name:n,ts:Date.now(),durationMs:j,result:M(P,{cause:O.error}),meta:{origin:"result",resultCause:O.error}}),o?.(Y,n,A),H(Y,{origin:"result",resultCause:O.error})}})()},w.fromNullable=(p,r,s,a)=>{if(typeof p!="string"||p.length===0)throw new Error('[awaitly] step.fromNullable() requires an explicit string ID as the first argument. Example: step.fromNullable("getUser", () => db.find(id), () => ({ type: "NOT_FOUND" }))');return w(p,async()=>{let n=await r();return n!=null?X(n):M(s())},a)},w.retry=(p,r,s)=>{if(typeof p!="string"||p.length===0)throw new Error('[awaitly] step.retry() requires an explicit string ID as the first argument. Example: step.retry("fetchData", () => fetchData(), { attempts: 3 })');return w(p,r,{key:s.key??p,retry:{attempts:s.attempts,backoff:s.backoff,initialDelay:s.initialDelay,maxDelay:s.maxDelay,jitter:s.jitter,retryOn:s.retryOn,onRetry:s.onRetry},timeout:s.timeout})},w.withTimeout=(p,r,s)=>{if(typeof p!="string"||p.length===0)throw new Error('[awaitly] step.withTimeout() requires an explicit string ID as the first argument. Example: step.withTimeout("slowOp", () => slowOp(), { ms: 5000 })');return w(p,r,{key:s.key??p,timeout:s})},w.sleep=(p,r,s)=>{if(typeof p!="string"||p.length===0)throw new Error('[awaitly] step.sleep() requires an explicit string ID as the first argument. Example: step.sleep("delay", "5s")');let a=typeof r=="string"?Ft(r):r;if(!a)throw new Error(`step.sleep: invalid duration '${r}'`);let n=a.millis,y=s?.signal;return w(p,async()=>{if(z?.aborted||y?.aborted){let k=new Error("Sleep aborted");throw k.name="AbortError",k}return new Promise((k,c)=>{let x={timeoutId:void 0},O=()=>{x.timeoutId&&clearTimeout(x.timeoutId);let P=new Error("Sleep aborted");P.name="AbortError",c(P)};z?.addEventListener("abort",O,{once:!0}),y?.addEventListener("abort",O,{once:!0}),x.timeoutId=setTimeout(()=>{z?.removeEventListener("abort",O),y?.removeEventListener("abort",O),k(X(void 0))},n)})},{key:s?.key??p,description:s?.description})},w.parallel=((...p)=>{if(typeof p[0]!="string")throw new TypeError("step.parallel(name, ...): first argument must be a string (step name). Example: step.parallel('Fetch data', { user: () => fetchUser(), posts: () => fetchPosts() })");let r=p[0],s=p[1];if(typeof s=="function")return J(r,s);if(s&&typeof s=="object"&&!Array.isArray(s)){let n=B(s);return fe(n,{name:r})}throw new TypeError("step.parallel(name, ...): second argument must be a function (array form) or an object of operations (object form).")}),w.race=(p,r)=>{let s=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let a=performance.now(),n=!1,y={scopeId:s,type:"race",winnerId:void 0};D.push(y);let k=()=>{if(n)return;n=!0;let c=D.findIndex(x=>x.scopeId===s);c!==-1&&D.splice(c,1),m({type:"scope_end",workflowId:l,scopeId:s,ts:Date.now(),durationMs:performance.now()-a,winnerId:y.winnerId})};m({type:"scope_start",workflowId:l,scopeId:s,scopeType:"race",name:p,ts:Date.now()});try{let c=await r();if(k(),!c.ok)throw o?.(c.error,p,A),H(c.error,{origin:"result",resultCause:c.cause});return c.value}catch(c){throw k(),c}})()},w.allSettled=(p,r)=>{let s=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let a=performance.now(),n=!1;D.push({scopeId:s,type:"allSettled"});let y=()=>{if(n)return;n=!0;let k=D.findIndex(c=>c.scopeId===s);k!==-1&&D.splice(k,1),m({type:"scope_end",workflowId:l,scopeId:s,ts:Date.now(),durationMs:performance.now()-a})};m({type:"scope_start",workflowId:l,scopeId:s,scopeType:"allSettled",name:p,ts:Date.now()});try{let k=await r();if(y(),!k.ok)throw o?.(k.error,p,A),H(k.error,{origin:"result",resultCause:k.cause});return k.value}catch(k){throw y(),k}})()},w.if=(p,r,s)=>s(),w.label=w.if,w.branch=async(p,r)=>{let{condition:s,then:a,else:n}=r;if(s())return await a();if(n)return await n()},w.arm=(p,r)=>({fn:p,errors:r}),w.forEach=async(p,r,s)=>{let a=[],n=s.maxIterations,y=0,k="run"in s,c=Symbol.asyncIterator in r?r:(async function*(){yield*r})();for await(let x of c){if(n!==void 0&&y>=n)break;let O;k?O=await s.run(x,y):O=await s.item.handler(x,y,w),a.push(O),y++}return a},w.item=p=>({__forEachItemHandler:!0,handler:p}),w.dep=(p,r)=>r,w.run=(p,r,s)=>w(p,()=>r,s),w.workflow=(p,r,s)=>w(p,r,s),w.andThen=(p,r,s,a)=>w(p,()=>s(r),a),w.match=async(p,r,s,a)=>w(p,async()=>{let n=await r;return n.ok?X(await s.ok(n.value)):X(await s.err(n.error,n.cause))},a),w.all=w.parallel,w.map=async(p,r,s,a)=>{let n=a?.concurrency??r.length;return w(p,()=>n>=r.length?wt(r.map((y,k)=>s(y,k))):(async()=>{let y=[];for(let k=0;k<r.length;k+=n){let c=r.slice(k,k+n),x=await wt(c.map((O,P)=>s(O,k+P)));if(!x.ok)return x;y.push(...x.value)}return X(y)})(),{key:a?.key})},w.withFallback=(p,r,s)=>{if(typeof p!="string"||p.length===0)throw new Error('[awaitly] step.withFallback() requires an explicit string ID as the first argument. Example: step.withFallback("getUser", () => fetchUser(id), { fallback: () => fetchFromCache(id) })');let a=s.key??p,n=p,y=ie(a),k=i;return(async()=>{let c=k?performance.now():0;i&&m({type:"step_start",workflowId:l,stepId:y,stepKey:a,name:n,ts:Date.now()});let x;try{x=await r()}catch(I){if(U(I))throw m({type:"step_aborted",workflowId:l,stepId:y,stepKey:a,name:n,ts:Date.now(),durationMs:performance.now()-c}),I;let ee;try{ee=q(I)}catch(N){throw Ae(N)}if(s.on!==void 0&&s.on!==ee){let N=performance.now()-c;throw m({type:"step_error",workflowId:l,stepId:y,stepKey:a,name:n,ts:Date.now(),durationMs:N,error:ee}),a&&m({type:"step_complete",workflowId:l,stepKey:a,name:n,ts:Date.now(),durationMs:N,result:M(ee,{cause:I}),meta:{origin:"throw",thrown:I}}),o?.(ee,n,A),H(ee,{origin:"throw",thrown:I})}let F;try{F=await s.fallback()}catch(N){if(U(N))throw m({type:"step_aborted",workflowId:l,stepId:y,stepKey:a,name:n,ts:Date.now(),durationMs:performance.now()-c}),N;let V;try{V=q(N)}catch(oe){throw Ae(oe)}let Te=performance.now()-c;throw m({type:"step_error",workflowId:l,stepId:y,stepKey:a,name:n,ts:Date.now(),durationMs:Te,error:V}),a&&m({type:"step_complete",workflowId:l,stepKey:a,name:n,ts:Date.now(),durationMs:Te,result:M(V,{cause:N}),meta:{origin:"throw",thrown:N}}),o?.(V,n,A),H(V,{origin:"throw",thrown:N})}if(F.ok){let N=performance.now()-c;return m({type:"step_success",workflowId:l,stepId:y,stepKey:a,name:n,ts:Date.now(),durationMs:N}),a&&m({type:"step_complete",workflowId:l,stepKey:a,name:n,ts:Date.now(),durationMs:N,result:F,meta:{origin:"fallback",fallbackUsed:!0,fallbackReason:String(ee)}}),F.value}else{let N=performance.now()-c,V=ce(F.error,{origin:"result",resultCause:F.cause});throw m({type:"step_error",workflowId:l,stepId:y,stepKey:a,name:n,ts:Date.now(),durationMs:N,error:V}),a&&m({type:"step_complete",workflowId:l,stepKey:a,name:n,ts:Date.now(),durationMs:N,result:F,meta:{origin:"result",resultCause:F.cause}}),o?.(V,n,A),H(V,{origin:"result",resultCause:F.cause})}}if(x.ok){let I=performance.now()-c;return m({type:"step_success",workflowId:l,stepId:y,stepKey:a,name:n,ts:Date.now(),durationMs:I}),a&&m({type:"step_complete",workflowId:l,stepKey:a,name:n,ts:Date.now(),durationMs:I,result:x}),x.value}let O=x.error;if(s.on!==void 0&&s.on!==O){let I=performance.now()-c,ee=ce(O,{origin:"result",resultCause:x.cause});throw m({type:"step_error",workflowId:l,stepId:y,stepKey:a,name:n,ts:Date.now(),durationMs:I,error:ee}),a&&m({type:"step_complete",workflowId:l,stepKey:a,name:n,ts:Date.now(),durationMs:I,result:x,meta:{origin:"result",resultCause:x.cause}}),o?.(ee,n,A),H(ee,{origin:"result",resultCause:x.cause})}let P;try{P=await s.fallback()}catch(I){if(U(I))throw m({type:"step_aborted",workflowId:l,stepId:y,stepKey:a,name:n,ts:Date.now(),durationMs:performance.now()-c}),I;let ee;try{ee=q(I)}catch(N){throw Ae(N)}let F=performance.now()-c;throw m({type:"step_error",workflowId:l,stepId:y,stepKey:a,name:n,ts:Date.now(),durationMs:F,error:ee}),a&&m({type:"step_complete",workflowId:l,stepKey:a,name:n,ts:Date.now(),durationMs:F,result:M(ee,{cause:I}),meta:{origin:"throw",thrown:I}}),o?.(ee,n,A),H(ee,{origin:"throw",thrown:I})}if(P.ok){let I=performance.now()-c;return m({type:"step_success",workflowId:l,stepId:y,stepKey:a,name:n,ts:Date.now(),durationMs:I}),a&&m({type:"step_complete",workflowId:l,stepKey:a,name:n,ts:Date.now(),durationMs:I,result:P,meta:{origin:"fallback",fallbackUsed:!0,fallbackReason:String(O)}}),P.value}let j=performance.now()-c,Y=ce(P.error,{origin:"result",resultCause:P.cause});throw m({type:"step_error",workflowId:l,stepId:y,stepKey:a,name:n,ts:Date.now(),durationMs:j,error:Y}),a&&m({type:"step_complete",workflowId:l,stepKey:a,name:n,ts:Date.now(),durationMs:j,result:P,meta:{origin:"result",resultCause:P.cause}}),o?.(Y,n,A),H(Y,{origin:"result",resultCause:P.cause})})()},w.withResource=(p,r)=>{if(typeof p!="string"||p.length===0)throw new Error('[awaitly] step.withResource() requires an explicit string ID as the first argument. Example: step.withResource("useDb", { acquire: () => connect(), use: (db) => query(db), release: (db) => db.close() })');let s=p,a=p,n=ie(s),y=i;return(async()=>{let k=y?performance.now():0;i&&m({type:"step_start",workflowId:l,stepId:n,stepKey:s,name:a,ts:Date.now()});let c;try{c=await r.acquire()}catch(F){if(U(F))throw m({type:"step_aborted",workflowId:l,stepId:n,stepKey:s,name:a,ts:Date.now(),durationMs:performance.now()-k}),F;let N;try{N=q(F)}catch(Te){throw Ae(Te)}let V=performance.now()-k;throw m({type:"step_error",workflowId:l,stepId:n,stepKey:s,name:a,ts:Date.now(),durationMs:V,error:N}),s&&m({type:"step_complete",workflowId:l,stepKey:s,name:a,ts:Date.now(),durationMs:V,result:M(N,{cause:F}),meta:{origin:"throw",thrown:F}}),o?.(N,a,A),H(N,{origin:"throw",thrown:F})}if(!c.ok){let F=performance.now()-k,N=ce(c.error,{origin:"result",resultCause:c.cause});throw m({type:"step_error",workflowId:l,stepId:n,stepKey:s,name:a,ts:Date.now(),durationMs:F,error:N}),s&&m({type:"step_complete",workflowId:l,stepKey:s,name:a,ts:Date.now(),durationMs:F,result:c,meta:{origin:"result",resultCause:c.cause}}),o?.(N,a,A),H(N,{origin:"result",resultCause:c.cause})}let x=c.value,O,P,j=!1;try{O=await r.use(x)}catch(F){if(U(F)){try{await r.release(x)}catch(N){console.warn(`[awaitly] step.withResource("${p}"): release threw after earlyExit:`,N)}throw F}P=F,j=!0}try{await r.release(x)}catch(F){console.warn(`[awaitly] step.withResource("${p}"): release threw:`,F)}if(j){let F;try{F=q(P)}catch(V){throw Ae(V)}let N=performance.now()-k;throw m({type:"step_error",workflowId:l,stepId:n,stepKey:s,name:a,ts:Date.now(),durationMs:N,error:F}),s&&m({type:"step_complete",workflowId:l,stepKey:s,name:a,ts:Date.now(),durationMs:N,result:M(F,{cause:P}),meta:{origin:"throw",thrown:P}}),o?.(F,a,A),H(F,{origin:"throw",thrown:P})}let Y=O;if(Y.ok){let F=performance.now()-k;return m({type:"step_success",workflowId:l,stepId:n,stepKey:s,name:a,ts:Date.now(),durationMs:F}),s&&m({type:"step_complete",workflowId:l,stepKey:s,name:a,ts:Date.now(),durationMs:F,result:Y}),Y.value}let I=performance.now()-k,ee=ce(Y.error,{origin:"result",resultCause:Y.cause});throw m({type:"step_error",workflowId:l,stepId:n,stepKey:s,name:a,ts:Date.now(),durationMs:I,error:ee}),s&&m({type:"step_complete",workflowId:l,stepKey:s,name:a,ts:Date.now(),durationMs:I,result:Y,meta:{origin:"result",resultCause:Y.cause}}),o?.(ee,a,A),H(ee,{origin:"result",resultCause:Y.cause})})()};let me=await e({step:w});if(process.env.NODE_ENV!=="production"&&me!==null&&typeof me=="object"&&"ok"in me&&typeof me.ok=="boolean"){let p=me;(p.ok===!0&&"value"in p||p.ok===!1&&"error"in p)&&console.warn(`awaitly: Workflow executor returned a Result-like object. Return raw values, not ok() or err().
2
2
 
3
3
  Incorrect: return ok({ data });
4
4
  Correct: return { data };
5
5
 
6
- See: https://jagreehal.github.io/awaitly/guides/troubleshooting/#returning-ok-from-workflow-executor-double-wrapping`)}return G(ce)}catch(s){if(At(s))throw s.thrown;if(b(s)){let oe=s.meta.origin==="throw"?s.meta.thrown:s.meta.origin==="result"?s.meta.resultCause:void 0;return K(s.error,{cause:oe})}let H=Z(s);return n?.(H,"unexpected",D),K(H,{cause:s})}}We.strict=(e,t)=>We(e,t);async function rt(e){return e.length===0?G([]):new Promise(t=>{let n=!1,p=e.length,g=new Array(e.length);for(let C=0;C<e.length;C++){let A=C;Promise.resolve(e[A]).catch(D=>K({type:"PROMISE_REJECTED",cause:D},{cause:{type:"PROMISE_REJECTION",reason:D}})).then(D=>{if(!n){if(!D.ok){n=!0,t(D);return}g[A]=D.value,p--,p===0&&t(G(g))}})}})}function $e(e){return e.type==="step_complete"}function he(e){return typeof e=="object"&&e!==null&&e.type==="WORKFLOW_CANCELLED"}var xe=class extends Error{constructor(n,p=[]){super(n);this.errors=p;this.name="SnapshotFormatError"}};var De=class extends Error{constructor(n,p,g){super(n);this.stepId=p;this.originalError=g;this.name="SnapshotDecodeError"}};function _t(e){let t=[];if(typeof e!="object"||e===null)return{valid:!1,errors:["Snapshot must be an object"]};let n=e;if("formatVersion"in n?n.formatVersion!==1&&t.push(`Invalid formatVersion: expected 1, got ${n.formatVersion}`):t.push("Missing required field: formatVersion"),!("steps"in n))t.push("Missing required field: steps");else if(typeof n.steps!="object"||n.steps===null)t.push("steps must be an object");else{let p=n.steps;for(let[g,C]of Object.entries(p)){if(typeof C!="object"||C===null){t.push(`steps["${g}"] must be an object`);continue}let A=C;"ok"in A?typeof A.ok!="boolean"?t.push(`steps["${g}"].ok must be a boolean`):A.ok===!1&&("error"in A||t.push(`steps["${g}"] is error result but missing error field`),"cause"in A||t.push(`steps["${g}"] is error result but missing cause field`)):t.push(`steps["${g}"] missing required field: ok`)}}if(!("execution"in n))t.push("Missing required field: execution");else if(typeof n.execution!="object"||n.execution===null)t.push("execution must be an object");else{let p=n.execution;"status"in p?["running","completed","failed"].includes(p.status)||t.push("execution.status must be one of: running, completed, failed"):t.push("execution missing required field: status"),"lastUpdated"in p?typeof p.lastUpdated!="string"&&t.push("execution.lastUpdated must be a string (ISO timestamp)"):t.push("execution missing required field: lastUpdated")}return t.length>0?{valid:!1,errors:t}:{valid:!0,snapshot:e}}function ut(e){let t=_t(e);if(!t.valid)throw new xe(`Invalid snapshot format: ${t.errors[0]}`,t.errors);return t.snapshot}function lt(e,t){let n=Object.create(null);for(let[A,D]of Object.entries(e.steps))Object.prototype.hasOwnProperty.call(e.steps,A)&&(n[A]=D);for(let[A,D]of Object.entries(t.steps))Object.prototype.hasOwnProperty.call(t.steps,A)&&(n[A]=D);let p=e.metadata||t.metadata?{...e.metadata,...t.metadata}:void 0,C=[...(e.warnings||[]).filter(A=>!Object.prototype.hasOwnProperty.call(t.steps,A.stepId)),...t.warnings||[]];return{formatVersion:1,steps:n,execution:{...t.execution},metadata:p,warnings:C.length>0?C:void 0}}var it=1e3;function qe(e){let t={type:"error",name:e.name,message:e.message};e.stack&&(t.stack=e.stack);let n=e;return n.cause!==void 0&&(n.cause instanceof Error?t.cause=qe(n.cause):t.cause=He(n.cause)),t}function He(e){let t,n=!1;try{t=String(e),t.length>it&&(t=t.slice(0,it),n=!0)}catch{t="[unable to convert to string]"}let p=e===null?"null":typeof e=="object"?e.constructor?.name??"Object":typeof e,g;try{let A=JSON.stringify(e);A!==void 0&&(g=JSON.parse(A))}catch{}let C={type:"thrown",originalType:p,stringRepresentation:t};return g!==void 0&&(C.value=g),n&&(C.truncated=!0),C}function Je(e){if(e.type==="error"){let t=new Error(e.message);return t.name=e.name,e.stack&&(t.stack=e.stack),e.cause&&(t.cause=Je(e.cause)),t}return e.value!==void 0?e.value:e.stringRepresentation}function Ot(e){return typeof e=="object"&&e!==null&&e.__cachedMeta===!0}function Te(e,t,n){return K(e,{cause:{__cachedMeta:!0,originalCause:n,meta:t}})}function Me(e){return Ot(e)?e.meta:{origin:"result",resultCause:e}}function Ie(){let e=new Map;return{handleEvent:t=>{$e(t)&&e.set(t.stepKey,{result:t.result,meta:t.meta})},getResumeState:()=>({steps:new Map(e)}),clear:()=>e.clear()}}var Ut="STREAM_WRITE_ERROR",Wt="STREAM_READ_ERROR",Nt="STREAM_CLOSE_ERROR";var jt="STREAM_ENDED";function je(e,t,n){return{type:Ut,reason:e,message:t,...n!==void 0?{cause:n}:{}}}function Xe(e,t,n){return{type:Wt,reason:e,message:t,...n!==void 0?{cause:n}:{}}}function ze(e,t,n){return{type:Nt,reason:e,message:t,...n!==void 0?{cause:n}:{}}}function Fe(e){return{type:jt,finalPosition:e}}function ct(e={}){let t=e.highWaterMark??16,n=e.lowWaterMark??Math.floor(t/2),p=e.onStateChange,g="flowing",C=0,A=[];function D(l){if(g!==l&&(g=l,p?.(l),l==="flowing"&&A.length>0)){let Z=A;A=[];for(let I of Z)I()}}function ee(){g==="flowing"&&C>=t?D("paused"):g==="paused"&&C<=n&&D("flowing")}return{get state(){return g},get bufferedCount(){return C},get highWaterMark(){return t},get lowWaterMark(){return n},increment(){C++,ee()},decrement(){C>0&&(C--,ee())},setCount(l){C=Math.max(0,l),ee()},waitForDrain(){return g==="flowing"?Promise.resolve():new Promise(l=>{A.push(l)})},reset(){C=0,A=[],D("flowing")}}}function Ft(e){return{_tag:"Duration",millis:e}}function Kt(e){return{_tag:"Duration",millis:e*1e3}}function Vt(e){return{_tag:"Duration",millis:e*60*1e3}}function Lt(e){return{_tag:"Duration",millis:e*60*60*1e3}}function Bt(e){return{_tag:"Duration",millis:e*24*60*60*1e3}}function pt(e){return e.millis}function mt(e){let t=e.trim().match(/^(\d+(?:\.\d+)?)\s*(ms|s|m|h|d)$/i);if(!t)return;let n=parseFloat(t[1]);switch(t[2].toLowerCase()){case"ms":return Ft(n);case"s":return Kt(n);case"m":return Vt(n);case"h":return Lt(n);case"d":return Bt(n);default:return}}function Ye(e,t,n){if(typeof e!="string"||e.length===0)throw new TypeError("createWorkflow(workflowName, deps, options?): first argument must be a non-empty string. Example: createWorkflow('checkout', { chargeCard, sendEmail })");let p=t??{},g=n;async function C(l,Z,I){let T=l??crypto.randomUUID(),ie=I?.deps?{...p,...I.deps}:p,d=I?.createContext??g?.createContext,q=d?await d():void 0,b=I?.signal??g?.signal,ne=I?.onEvent??g?.onEvent,we=I?.onError??g?.onError,ye=I?.shouldRun??g?.shouldRun,ke=I?.onBeforeStart??g?.onBeforeStart,pe=I?.onAfterStep??g?.onAfterStep,s=I?.resumeState??g?.resumeState,H=g?.catchUnexpected??Ne,oe={},me=(I?.devWarnings??g?.devWarnings)===!0&&process.env.NODE_ENV!=="production",fe=new Set,ce=new Set,m={workflowId:T,onEvent:ne,context:q!==void 0?q:void 0,signal:b,input:{},ref:f=>oe[f],set:(f,E)=>{me&&!fe.has(f)&&(fe.add(f),console.warn(`awaitly: ctx.set('${f}', ...) is deprecated for static analysis. Use step('id', fn, { out: '${f}' }) instead.`)),oe[f]=E},get:f=>(me&&!ce.has(f)&&(ce.add(f),console.warn(`awaitly: ctx.get('${f}') is deprecated for static analysis. Use ctx.ref('${f}') instead for tracked dependencies.`)),oe[f])},c=f=>{let E=f.context!==void 0||q===void 0?f:{...f,context:q},J=E.workflowName===void 0?{...E,workflowName:e}:E;ne?.(J,q)},a=(f,E)=>{let J={type:"WORKFLOW_CANCELLED",reason:f,lastStepKey:E};return K(H(J),{cause:J})};if(b?.aborted){let f=typeof b.reason=="string"?b.reason:b.reason instanceof Error?b.reason.message:void 0;return c({type:"workflow_cancelled",workflowId:T,ts:Date.now(),durationMs:0,reason:f}),a(f)}if(ye){let f=performance.now();try{let E=await ye(T,q),J=performance.now()-f;if(c({type:"hook_should_run",workflowId:T,ts:Date.now(),durationMs:J,result:E,skipped:!E}),!E){let v=new Error("Workflow skipped by shouldRun hook");return K(H(v),{cause:v})}}catch(E){let J=performance.now()-f;return c({type:"hook_should_run_error",workflowId:T,ts:Date.now(),durationMs:J,error:E}),K(H(E),{cause:E})}}if(ke){let f=performance.now();try{let E=await ke(T,q),J=performance.now()-f;if(c({type:"hook_before_start",workflowId:T,ts:Date.now(),durationMs:J,result:E,skipped:!E}),!E){let v=new Error("Workflow skipped by onBeforeStart hook");return K(H(v),{cause:v})}}catch(E){let J=performance.now()-f;return c({type:"hook_before_start_error",workflowId:T,ts:Date.now(),durationMs:J,error:E}),K(H(E),{cause:E})}}let o=Date.now(),r=performance.now();c({type:"workflow_start",workflowId:T,ts:o});let i=I?.cache??g?.cache,w=I?.streamStore??g?.streamStore;if(s&&!i&&(i=new Map),s&&i){let f=typeof s=="function"?await s():s;f.steps instanceof Map||(console.warn(`awaitly: resumeState.steps is not a Map (got ${typeof f.steps}). This usually happens when state is serialized with JSON.stringify() directly.
6
+ See: https://jagreehal.github.io/awaitly/guides/troubleshooting/#returning-ok-from-workflow-executor-double-wrapping`)}return X(me)}catch(w){if(Bt(w))throw w.thrown;if(U(w)){let J=w.meta.origin==="throw"?w.meta.thrown:w.meta.origin==="result"?w.meta.resultCause:void 0;return M(w.error,{cause:J})}let B=q(w);return o?.(B,"unexpected",A),M(B,{cause:w})}}Ve.strict=(e,t)=>Ve(e,t);async function wt(e){return e.length===0?X([]):new Promise(t=>{let o=!1,i=e.length,E=new Array(e.length);for(let g=0;g<e.length;g++){let v=g;Promise.resolve(e[v]).catch(A=>M({type:"PROMISE_REJECTED",cause:A},{cause:{type:"PROMISE_REJECTION",reason:A}})).then(A=>{if(!o){if(!A.ok){o=!0,t(A);return}E[v]=A.value,i--,i===0&&t(X(E))}})}})}function Ye(e){return e.type==="step_complete"}function be(e){return typeof e=="object"&&e!==null&&e.type==="WORKFLOW_CANCELLED"}var ve=class extends Error{constructor(o,i=[]){super(o);this.errors=i;this.name="SnapshotFormatError"}};var De=class extends Error{constructor(o,i,E){super(o);this.stepId=i;this.originalError=E;this.name="SnapshotDecodeError"}};function Jt(e){let t=[];if(typeof e!="object"||e===null)return{valid:!1,errors:["Snapshot must be an object"]};let o=e;if("formatVersion"in o?o.formatVersion!==1&&t.push(`Invalid formatVersion: expected 1, got ${o.formatVersion}`):t.push("Missing required field: formatVersion"),!("steps"in o))t.push("Missing required field: steps");else if(typeof o.steps!="object"||o.steps===null)t.push("steps must be an object");else{let i=o.steps;for(let[E,g]of Object.entries(i)){if(typeof g!="object"||g===null){t.push(`steps["${E}"] must be an object`);continue}let v=g;"ok"in v?typeof v.ok!="boolean"?t.push(`steps["${E}"].ok must be a boolean`):v.ok===!1&&("error"in v||t.push(`steps["${E}"] is error result but missing error field`),"cause"in v||t.push(`steps["${E}"] is error result but missing cause field`)):t.push(`steps["${E}"] missing required field: ok`)}}if(!("execution"in o))t.push("Missing required field: execution");else if(typeof o.execution!="object"||o.execution===null)t.push("execution must be an object");else{let i=o.execution;"status"in i?["running","completed","failed"].includes(i.status)||t.push("execution.status must be one of: running, completed, failed"):t.push("execution missing required field: status"),"lastUpdated"in i?typeof i.lastUpdated!="string"&&t.push("execution.lastUpdated must be a string (ISO timestamp)"):t.push("execution missing required field: lastUpdated")}return t.length>0?{valid:!1,errors:t}:{valid:!0,snapshot:e}}function Rt(e){let t=Jt(e);if(!t.valid)throw new ve(`Invalid snapshot format: ${t.errors[0]}`,t.errors);return t.snapshot}function St(e,t){let o=Object.create(null);for(let[v,A]of Object.entries(e.steps))Object.prototype.hasOwnProperty.call(e.steps,v)&&(o[v]=A);for(let[v,A]of Object.entries(t.steps))Object.prototype.hasOwnProperty.call(t.steps,v)&&(o[v]=A);let i=e.metadata||t.metadata?{...e.metadata,...t.metadata}:void 0,g=[...(e.warnings||[]).filter(v=>!Object.prototype.hasOwnProperty.call(t.steps,v.stepId)),...t.warnings||[]];return{formatVersion:1,steps:o,execution:{...t.execution},metadata:i,warnings:g.length>0?g:void 0}}var Tt=1e3;function Xe(e){let t={type:"error",name:e.name,message:e.message};e.stack&&(t.stack=e.stack);let o=e;return o.cause!==void 0&&(o.cause instanceof Error?t.cause=Xe(o.cause):t.cause=Ge(o.cause)),t}function Ge(e){let t,o=!1;try{t=String(e),t.length>Tt&&(t=t.slice(0,Tt),o=!0)}catch{t="[unable to convert to string]"}let i=e===null?"null":typeof e=="object"?e.constructor?.name??"Object":typeof e,E;try{let v=JSON.stringify(e);v!==void 0&&(E=JSON.parse(v))}catch{}let g={type:"thrown",originalType:i,stringRepresentation:t};return E!==void 0&&(g.value=E),o&&(g.truncated=!0),g}function Ze(e){if(e.type==="error"){let t=new Error(e.message);return t.name=e.name,e.stack&&(t.stack=e.stack),e.cause&&(t.cause=Ze(e.cause)),t}return e.value!==void 0?e.value:e.stringRepresentation}function zt(e){return typeof e=="object"&&e!==null&&e.__cachedMeta===!0}function he(e,t,o){return M(e,{cause:{__cachedMeta:!0,originalCause:o,meta:t}})}function je(e){return zt(e)?e.meta:{origin:"result",resultCause:e}}function Ke(){let e=new Map;return{handleEvent:t=>{Ye(t)&&e.set(t.stepKey,{result:t.result,meta:t.meta})},getResumeState:()=>({steps:new Map(e)}),clear:()=>e.clear()}}var Gt="STREAM_WRITE_ERROR",Zt="STREAM_READ_ERROR",Qt="STREAM_CLOSE_ERROR";var er="STREAM_ENDED";function $e(e,t,o){return{type:Gt,reason:e,message:t,...o!==void 0?{cause:o}:{}}}function Qe(e,t,o){return{type:Zt,reason:e,message:t,...o!==void 0?{cause:o}:{}}}function et(e,t,o){return{type:Qt,reason:e,message:t,...o!==void 0?{cause:o}:{}}}function Be(e){return{type:er,finalPosition:e}}function xt(e={}){let t=e.highWaterMark??16,o=e.lowWaterMark??Math.floor(t/2),i=e.onStateChange,E="flowing",g=0,v=[];function A(l){if(E!==l&&(E=l,i?.(l),l==="flowing"&&v.length>0)){let q=v;v=[];for(let D of q)D()}}function z(){E==="flowing"&&g>=t?A("paused"):E==="paused"&&g<=o&&A("flowing")}return{get state(){return E},get bufferedCount(){return g},get highWaterMark(){return t},get lowWaterMark(){return o},increment(){g++,z()},decrement(){g>0&&(g--,z())},setCount(l){g=Math.max(0,l),z()},waitForDrain(){return E==="flowing"?Promise.resolve():new Promise(l=>{v.push(l)})},reset(){g=0,v=[],A("flowing")}}}function tr(e){return{_tag:"Duration",millis:e}}function rr(e){return{_tag:"Duration",millis:e*1e3}}function nr(e){return{_tag:"Duration",millis:e*60*1e3}}function or(e){return{_tag:"Duration",millis:e*60*60*1e3}}function sr(e){return{_tag:"Duration",millis:e*24*60*60*1e3}}function ht(e){return e.millis}function Ct(e){let t=e.trim().match(/^(\d+(?:\.\d+)?)\s*(ms|s|m|h|d)$/i);if(!t)return;let o=parseFloat(t[1]);switch(t[2].toLowerCase()){case"ms":return tr(o);case"s":return rr(o);case"m":return nr(o);case"h":return or(o);case"d":return sr(o);default:return}}async function bt(e,t){let o=e["~standard"].validate(t),i=o instanceof Promise?await o:o;return i.issues?M({type:"INPUT_VALIDATION_ERROR",issues:i.issues.map(E=>({message:E.message,path:E.path?.map(g=>typeof g=="object"?g.key:g)})),message:`Input validation failed: ${i.issues.map(E=>E.message).join(", ")}`}):X(i.value)}function tt(e,t,o){if(typeof e!="string"||e.length===0)throw new TypeError("createWorkflow(workflowName, deps, options?): first argument must be a non-empty string. Example: createWorkflow('checkout', { chargeCard, sendEmail })");let i=t??{},E=o;async function g(l,q,D){let b=l??crypto.randomUUID(),ie=D?.deps?{...i,...D.deps}:i,m=D?.createContext??E?.createContext,H=m?await m():void 0,U=D?.signal??E?.signal,ce=D?.onEvent??E?.onEvent,pe=D?.onError??E?.onError,we=D?.shouldRun??E?.shouldRun,ge=D?.onBeforeStart??E?.onBeforeStart,de=D?.onAfterStep??E?.onAfterStep,w=D?.resumeState??E?.resumeState,B=E?.catchUnexpected??Le,J={},fe=(D?.devWarnings??E?.devWarnings)===!0&&process.env.NODE_ENV!=="production",ye=new Set,me=new Set,p={workflowId:b,onEvent:ce,context:H!==void 0?H:void 0,signal:U,input:{},ref:f=>J[f],set:(f,u)=>{fe&&!ye.has(f)&&(ye.add(f),console.warn(`awaitly: ctx.set('${f}', ...) is deprecated for static analysis. Use step('id', fn, { out: '${f}' }) instead.`)),J[f]=u},get:f=>(fe&&!me.has(f)&&(me.add(f),console.warn(`awaitly: ctx.get('${f}') is deprecated for static analysis. Use ctx.ref('${f}') instead for tracked dependencies.`)),J[f])},r=f=>{let u=f.context!==void 0||H===void 0?f:{...f,context:H},G=u.workflowName===void 0?{...u,workflowName:e}:u;ce?.(G,H)},s=(f,u)=>{let G={type:"WORKFLOW_CANCELLED",reason:f,lastStepKey:u};return M(B(G),{cause:G})};if(U?.aborted){let f=typeof U.reason=="string"?U.reason:U.reason instanceof Error?U.reason.message:void 0;return r({type:"workflow_cancelled",workflowId:b,ts:Date.now(),durationMs:0,reason:f}),s(f)}if(we){let f=performance.now();try{let u=await we(b,H),G=performance.now()-f;if(r({type:"hook_should_run",workflowId:b,ts:Date.now(),durationMs:G,result:u,skipped:!u}),!u){let R=new Error("Workflow skipped by shouldRun hook");return M(B(R),{cause:R})}}catch(u){let G=performance.now()-f;return r({type:"hook_should_run_error",workflowId:b,ts:Date.now(),durationMs:G,error:u}),M(B(u),{cause:u})}}if(ge){let f=performance.now();try{let u=await ge(b,H),G=performance.now()-f;if(r({type:"hook_before_start",workflowId:b,ts:Date.now(),durationMs:G,result:u,skipped:!u}),!u){let R=new Error("Workflow skipped by onBeforeStart hook");return M(B(R),{cause:R})}}catch(u){let G=performance.now()-f;return r({type:"hook_before_start_error",workflowId:b,ts:Date.now(),durationMs:G,error:u}),M(B(u),{cause:u})}}let a=E?.inputSchema,n=E?.input;if(a&&n!==void 0){let f=await bt(a,n);if(!f.ok)return M(f.error);p.input=f.value}else n!==void 0&&(p.input=n);let y=Date.now(),k=performance.now();r({type:"workflow_start",workflowId:b,ts:y});let c=D?.cache??E?.cache,x=D?.streamStore??E?.streamStore;if(w&&!c&&(c=new Map),w&&c){let f=typeof w=="function"?await w():w;f.steps instanceof Map||(console.warn(`awaitly: resumeState.steps is not a Map (got ${typeof f.steps}). This usually happens when state is serialized with JSON.stringify() directly.
7
7
  Use stringifyState() and parseState() from 'awaitly/persistence' instead:
8
8
  import { stringifyState, parseState } from 'awaitly/persistence';
9
9
  const json = stringifyState(state); // Save this
10
- const restored = parseState(json); // Load this`),typeof f.steps=="object"&&f.steps!==null&&(f.steps=new Map(Object.entries(f.steps))));for(let[E,J]of f.steps){let{result:v,meta:y}=J;if(v.ok)i.set(E,v);else{let u=y??{origin:"result",resultCause:v.cause};i.set(E,Te(v.error,u,v.cause))}}}let S=I?.snapshot??g?.snapshot,_=g?.serialization;if(S&&!s){i||(i=new Map);let f=S,E=_?.decode;for(let[J,v]of Object.entries(f.steps))if(Object.prototype.hasOwnProperty.call(f.steps,J))try{if(v.ok){let y=E?E(v.value):v.value;i.set(J,G(y))}else{let y=E?E(v.error):v.error,u=Je(v.cause),R=v.meta?.origin==="throw"?{origin:"throw",thrown:u}:{origin:"result",resultCause:u};i.set(J,Te(y,R,u))}}catch(y){throw new De(`Failed to decode step "${J}": ${y instanceof Error?y.message:String(y)}`,J,y instanceof Error?y:void 0)}}let O=!1,W,V,Q=()=>{O=!0,W=typeof b?.reason=="string"?b.reason:b?.reason instanceof Error?b.reason.message:void 0};b&&!b.aborted&&b.addEventListener("abort",Q,{once:!0});let j=()=>{if(O||b?.aborted)throw{type:"WORKFLOW_CANCELLED",reason:W??(typeof b?.reason=="string"?b.reason:b?.reason instanceof Error?b.reason.message:void 0),lastStepKey:V}},$=async(f,E,J)=>{if(!pe)return;let v=performance.now();try{await pe(f,E,T,q);let y=performance.now()-v;c({type:"hook_after_step",workflowId:T,stepKey:f,ts:Date.now(),durationMs:y})}catch(y){let u=performance.now()-v;throw c({type:"hook_after_step_error",workflowId:T,stepKey:f,ts:Date.now(),durationMs:u,error:y}),y}},F=f=>{let E=async(y,u,R)=>{if(typeof y!="string")throw new Error('[awaitly] step() requires a string ID as the first argument. Example: step("fetchUser", () => fetchUser(id))');let h=y,x=R??{},M=h,k=Object.prototype.hasOwnProperty.call(x,"key")?x.key:h,{ttl:N,out:X}=x;j();let Y=Be(x);if(k&&i&&i.has(k)){c({type:"step_cache_hit",workflowId:T,stepKey:k,name:M,ts:Date.now(),...Y&&{metadata:Y}});let U=i.get(k);if(U.ok)return V=k,X&&(oe[X]=U.value),U.value;let L=Me(U.cause);throw Ae(U.error,L)}k&&i&&c({type:"step_cache_miss",workflowId:T,stepKey:k,name:M,ts:Date.now(),...Y&&{metadata:Y}});try{let U=await f(h,u,x);return X&&(oe[X]=U),k&&(V=k,i&&i.set(k,G(U),N?{ttl:N}:void 0),await $(k,G(U))),U}catch(U){if(k&&Se(U)){let L=U,se=L.meta.origin==="result"?L.meta.resultCause:L.meta.origin==="throw"?L.meta.thrown:void 0,z=Te(L.error,L.meta,se);i&&i.set(k,z,N?{ttl:N}:void 0),await $(k,z,L.meta)}throw U}};E.try=async(y,u,R)=>{let{ttl:h}=R,x=R.key??y,M=y;if(i&&i.has(x)){c({type:"step_cache_hit",workflowId:T,stepKey:x,name:M,ts:Date.now()});let k=i.get(x);if(k.ok)return k.value;let N=Me(k.cause);throw Ae(k.error,N)}i&&c({type:"step_cache_miss",workflowId:T,stepKey:x,name:M,ts:Date.now()});try{let k=await f.try(y,u,{...R,key:x});return i&&i.set(x,G(k),h?{ttl:h}:void 0),await $(x,G(k)),k}catch(k){if(Se(k)){let N=k,X=N.meta.origin==="result"?N.meta.resultCause:N.meta.origin==="throw"?N.meta.thrown:void 0,Y=Te(N.error,N.meta,X);i&&i.set(x,Y,h?{ttl:h}:void 0),await $(x,Y,N.meta)}throw k}},E.fromResult=async(y,u,R)=>{let{ttl:h}=R,x=R.key??y,M=y;if(i&&i.has(x)){c({type:"step_cache_hit",workflowId:T,stepKey:x,name:M,ts:Date.now()});let k=i.get(x);if(k.ok)return k.value;let N=Me(k.cause);throw Ae(k.error,N)}i&&c({type:"step_cache_miss",workflowId:T,stepKey:x,name:M,ts:Date.now()});try{let k=await f.fromResult(y,u,{...R,key:x});return i&&i.set(x,G(k),h?{ttl:h}:void 0),await $(x,G(k)),k}catch(k){if(Se(k)){let N=k,X=N.meta.origin==="result"?N.meta.resultCause:N.meta.origin==="throw"?N.meta.thrown:void 0,Y=Te(N.error,N.meta,X);i&&i.set(x,Y,h?{ttl:h}:void 0),await $(x,Y,N.meta)}throw k}},E.parallel=f.parallel,E.race=f.race,E.allSettled=f.allSettled,E.withFallback=async(y,u,R)=>{let h=R.key??y,x=y;if(i&&i.has(h)){c({type:"step_cache_hit",workflowId:T,stepKey:h,name:x,ts:Date.now()});let M=i.get(h);if(M.ok)return M.value;let k=Me(M.cause);throw Ae(M.error,k)}i&&c({type:"step_cache_miss",workflowId:T,stepKey:h,name:x,ts:Date.now()});try{let M=await f.withFallback(y,u,R);return i&&i.set(h,G(M)),await $(h,G(M)),M}catch(M){if(Se(M)){let k=M,N=k.meta.origin==="result"?k.meta.resultCause:k.meta.origin==="throw"?k.meta.thrown:void 0,X=Te(k.error,k.meta,N);i&&i.set(h,X),await $(h,X,k.meta)}throw M}},E.withResource=async(y,u)=>{let R=y;try{let h=await f.withResource(y,u);return await $(R,G(h)),h}catch(h){if(Se(h)){let x=h,M=x.meta.origin==="result"?x.meta.resultCause:x.meta.origin==="throw"?x.meta.thrown:void 0,k=Te(x.error,x.meta,M);await $(R,k,x.meta)}throw h}},E.retry=(y,u,R)=>{let h={key:R.key,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,ttl:R.ttl};return E(y,u,h)},E.withTimeout=(y,u,R)=>{let h={key:R.key,timeout:R,ttl:R.ttl};return E(y,u,h)},E.sleep=(y,u,R)=>{if(typeof y!="string"||y.length===0)throw new Error('[awaitly] step.sleep() requires an explicit string ID as the first argument. Example: step.sleep("delay", "5s")');let h=typeof u=="string"?mt(u):u;if(!h)throw new Error(`step.sleep: invalid duration '${u}'`);let x=pt(h),M=R?.signal;return E(y,async()=>{if(b?.aborted||M?.aborted){let N=new Error("Sleep aborted");throw N.name="AbortError",N}return new Promise((N,X)=>{let Y={timeoutId:void 0},U=()=>{Y.timeoutId&&clearTimeout(Y.timeoutId);let L=new Error("Sleep aborted");L.name="AbortError",X(L)};b?.addEventListener("abort",U,{once:!0}),M?.addEventListener("abort",U,{once:!0}),Y.timeoutId=setTimeout(()=>{b?.removeEventListener("abort",U),M?.removeEventListener("abort",U),N(G(void 0))},x)})},{key:R?.key,ttl:R?.ttl,description:R?.description})};let J=new Map,v=new Map;return E.getWritable=y=>{let u=y?.namespace??"default",R=y?.highWaterMark??16;if(!w)throw new Error("streamStore is required to use getWritable(). Pass a streamStore to createWorkflow options.");let h=`${T}:${u}`,x=J.get(h);if(x&&!x.closed&&!x.aborted)return x.writer;let M=ct({highWaterMark:R,onStateChange:L=>{c({type:"stream_backpressure",workflowId:T,namespace:u,bufferedCount:M.bufferedCount,state:L,ts:Date.now()})}}),k=0,N=!0,X=!1,Y=!1;c({type:"stream_created",workflowId:T,namespace:u,ts:Date.now()});let U={async write(L){if(Y)return K(je("closed","Stream is closed"));if(X)return K(je("aborted","Stream was aborted"));M.state==="paused"&&await M.waitForDrain();let se={value:L,position:k,ts:Date.now()},z=await w.append(T,u,se);return z.ok?(c({type:"stream_write",workflowId:T,namespace:u,position:k,ts:Date.now()}),k++,M.increment(),G(void 0)):(c({type:"stream_error",workflowId:T,namespace:u,error:z.error,position:k,ts:Date.now()}),K(je("store_error",z.error.message,z.error)))},async close(){if(Y)return K(ze("already_closed","Stream is already closed"));let L=await w.closeStream(T,u);return L.ok?(Y=!0,N=!1,c({type:"stream_close",workflowId:T,namespace:u,finalPosition:k,ts:Date.now()}),J.delete(h),G(void 0)):K(ze("store_error",L.error.message,L.error))},abort(L){X=!0,N=!1,Y=!0,c({type:"stream_error",workflowId:T,namespace:u,error:L,position:k,ts:Date.now()}),J.delete(h)},get writable(){return N},get position(){return k},get namespace(){return u}};return J.set(h,{writer:U,backpressure:M,aborted:X,closed:Y}),U},E.getReadable=y=>{let u=y?.namespace??"default",R=y?.startIndex??0,h=y?.pollInterval??10,x=y?.pollTimeout??3e4;if(!w)throw new Error("streamStore is required to use getReadable(). Pass a streamStore to createWorkflow options.");let M=`${T}:${u}:${R}`,k=v.get(M);if(k&&!k.closed)return k.reader;let N=()=>{let ge=`${T}:${u}`,re=J.get(ge);re&&re.backpressure.decrement()},X=R,Y=!0,U=!1,L=[],se=0,z={async read(){if(U)return K(Xe("closed","Reader is closed"));if(se<L.length){let le=L[se++];return X=le.position+1,N(),c({type:"stream_read",workflowId:T,namespace:u,position:le.position,ts:Date.now()}),G(le.value)}let ge=`${T}:${u}`,re=Date.now(),ue=J.has(ge),te=await w.getMetadata(T,u),ae=te.ok&&te.value!==void 0;for(;Date.now()-re<x;){let le=await w.read(T,u,X,100);if(!le.ok)return K(Xe("store_error",le.error.message,le.error));let Pe=le.value;if(Pe.length>0){L=Pe,se=1;let Oe=Pe[0];return X=Oe.position+1,N(),c({type:"stream_read",workflowId:T,namespace:u,position:Oe.position,ts:Date.now()}),G(Oe.value)}let _e=J.has(ge),Re=await w.getMetadata(T,u),Qe=Re.ok&&Re.value!==void 0;if(_e&&(ue=!0),Qe&&(ae=!0),Re.ok&&Re.value?.closed)return Y=!1,K(Fe(X));if(ue&&!_e&&!Qe)return Y=!1,K(Fe(X));ae&&!_e&&Re.ok&&Re.value?.closed,await new Promise(Oe=>setTimeout(Oe,h))}return Y=!1,K(Fe(X))},close(){U=!0,Y=!1,L=[],v.delete(M)},get readable(){return Y},get position(){return X},get namespace(){return u}};return v.set(M,{reader:z,position:X,closed:U}),z},E.streamForEach=async(y,u,R)=>{let h=R?.checkpointInterval??1,x=R?.concurrency??1,M=[],k=0,N=-1,X=U=>typeof U=="object"&&U!==null&&"read"in U&&typeof U.read=="function",Y=async(U,L,se,z)=>{let re=h>0&&L%h===0?`stream-foreach:${z}:pos-${se}`:void 0,ue=re??`stream-item-${se}`,te=await E(ue,()=>u(U,L),{key:re});return{index:L,position:se,result:te}};if(X(y))if(x<=1){let U=y.position,L=await y.read();for(;L.ok;){let se=L.value,{result:z}=await Y(se,k,U,y.namespace);M.push(z),N=U,k++,U=y.position,L=await y.read()}}else{let U=new Map,L=0,se=0,z=new Array(x).fill(null),ge=async()=>{for(let le=0;le<z.length;le++)if(z[le]===null)return le;let te=z.filter(le=>le!==null),ae=await Promise.race(te);return U.set(ae.index,{position:ae.position,result:ae.result}),z[ae.slotIndex]=null,ae.slotIndex},re=y.position,ue=await y.read();for(;ue.ok;){let te=await ge(),ae=L,le=re,Pe=ue.value,_e=te;z[te]=Y(Pe,ae,le,y.namespace).then(Re=>({slotIndex:_e,...Re})),se++,L++,re=y.position,ue=await y.read()}for(let te=0;te<z.length;te++)if(z[te]!==null){let ae=await z[te];U.set(ae.index,{position:ae.position,result:ae.result})}for(let te=0;te<se;te++){let ae=U.get(te);ae&&(M.push(ae.result),N=ae.position,k++)}}else if(x<=1){let U=0;for await(let L of y){let{result:se}=await Y(L,U,U,"async-iterable");M.push(se),N=U,k++,U++}}else{let U=new Map,L=0,se=0,z=new Array(x).fill(null),ge=async()=>{for(let te=0;te<z.length;te++)if(z[te]===null)return te;let re=z.filter(te=>te!==null),ue=await Promise.race(re);return U.set(ue.index,ue.result),z[ue.slotIndex]=null,ue.slotIndex};for await(let re of y){let ue=await ge(),te=L,ae=ue;z[ue]=Y(re,te,te,"async-iterable").then(le=>({slotIndex:ae,...le})),se++,L++}for(let re=0;re<z.length;re++)if(z[re]!==null){let ue=await z[re];U.set(ue.index,ue.result)}for(let re=0;re<se;re++)U.has(re)&&(M.push(U.get(re)),N=re,k++)}return{results:M,processedCount:k,lastPosition:N}},E.if=f.if,E.label=f.label,E.branch=f.branch,E.arm=f.arm,E.forEach=f.forEach,E.item=f.item,E.dep=f.dep,E.run=(y,u,R)=>E(y,typeof u=="function"?u:()=>u,R),E.workflow=(y,u,R)=>E(y,u,R),E.andThen=(y,u,R,h)=>E(y,()=>R(u),h),E.match=(y,u,R,h)=>E(y,async()=>{let x=await u;return x.ok?G(await R.ok(x.value)):G(await R.err(x.error,x.cause))},h),E.all=(y,u,R)=>{let h=R!==void 0&&Object.prototype.hasOwnProperty.call(R,"key")?R:{...R,key:void 0};return E(y,async()=>G(await f.all(y,u)),h)},E.map=(y,u,R,h)=>{let x=h!==void 0&&Object.prototype.hasOwnProperty.call(h,"key")?h:{...h,key:void 0};return E(y,async()=>G(await f.map(y,u,R,h)),x)},E},B=({step:f})=>Z({step:F(f),deps:ie,ctx:m}),P;try{P=await We(B,{onError:we,onEvent:ne,catchUnexpected:H,workflowId:T,workflowName:e,context:q,_workflowSignal:b})}finally{b&&b.removeEventListener("abort",Q)}let de=performance.now()-r;if(!P.ok){let f;if(he(P.cause)&&(f=P.cause),!f&&O&&ot(P.error)){let E=P.cause;E!=null&&typeof E=="object"&&"name"in E&&E.name==="AbortError"&&(f={type:"WORKFLOW_CANCELLED",reason:W??(typeof b?.reason=="string"?b.reason:b?.reason instanceof Error?b.reason.message:void 0),lastStepKey:V})}if(f)return c({type:"workflow_cancelled",workflowId:T,ts:Date.now(),durationMs:de,reason:f.reason,lastStepKey:f.lastStepKey}),f&&!he(P.cause)?K(P.error,{cause:f}):P}if(P.ok&&O){let f=W??(typeof b?.reason=="string"?b.reason:b?.reason instanceof Error?b.reason.message:void 0);c({type:"workflow_cancelled",workflowId:T,ts:Date.now(),durationMs:de,reason:f,lastStepKey:V});let E={type:"WORKFLOW_CANCELLED",reason:f,lastStepKey:V};return K(H(E),{cause:E})}return P.ok?c({type:"workflow_success",workflowId:T,ts:Date.now(),durationMs:de}):c({type:"workflow_error",workflowId:T,ts:Date.now(),durationMs:de,error:P.error}),P}function A(l,Z,I){let T,ie,d;return typeof l=="string"?(T=l,ie=Z,d=I):(ie=l,d=Z),C(T,ie,d)}async function D(l,Z,I){let T,ie,d;typeof l=="string"?(T=l,ie=Z,d=I):(ie=l,d=Z);let q=Ie(),b=d?.onEvent,we={...d,onEvent:(pe,s)=>{q.handleEvent(pe);try{b?.(pe,s)}catch{}}},ye,ke;try{ye=await C(T,ie,we)}catch(pe){let s=g?.catchUnexpected??Ne;ye=K(s(pe),{cause:pe})}finally{ke=q.getResumeState()}return{result:ye,resumeState:ke}}return{run:A,runWithState:D}}var Ge;function $t(){let e=new Map;return{async save(t,n){e.set(t,{snapshot:n,updatedAt:new Date})},async load(t){return e.get(t)?.snapshot??null},async delete(t){e.delete(t)},async list(t){let n=t?.prefix??"",p=t?.limit??100,g=[];for(let[C,A]of e.entries())if(!(n&&!C.startsWith(n))&&(g.push({id:C,updatedAt:A.updatedAt.toISOString()}),g.length>=p))break;return g.sort((C,A)=>A.updatedAt.localeCompare(C.updatedAt)),g},async close(){}}}function qt(){return Ge===void 0&&(Ge=$t()),Ge}function ft(e){return typeof e=="object"&&e!==null&&e.type==="VERSION_MISMATCH"}function Et(e){return typeof e=="object"&&e!==null&&e.type==="CONCURRENT_EXECUTION"}function wt(e){return typeof e=="object"&&e!==null&&e.type==="PERSISTENCE_ERROR"}function dt(e){return typeof e.tryAcquire=="function"&&typeof e.release=="function"}var Ze=new Set,yt={async run(e,t,n){let{id:p,store:g,version:C=1,allowConcurrent:A=!1,lockTtlMs:D=6e4,metadata:ee,signal:l,createContext:Z,onEvent:I,onError:T,onVersionMismatch:ie}=n,d=g??qt();if(!A&&Ze.has(p)){let b={type:"CONCURRENT_EXECUTION",workflowId:p,message:`Workflow '${p}' is already running. Set allowConcurrent: true to allow parallel executions.`,reason:"in-process"};return K(b)}let q=null;if(!A&&dt(d)){let b;try{b=await d.tryAcquire(p,{ttlMs:D})}catch(ne){let we={type:"PERSISTENCE_ERROR",operation:"load",workflowId:p,cause:ne,message:`Failed to acquire lock for workflow '${p}': ${ne instanceof Error?ne.message:String(ne)}`};return K(we)}if(b===null){let ne={type:"CONCURRENT_EXECUTION",workflowId:p,message:`Workflow '${p}' is already running (lease held by another process). Set allowConcurrent: true to allow parallel executions.`,reason:"cross-process"};return K(ne)}q=b.ownerToken}Ze.add(p);try{let b=null;try{b=await d.load(p)}catch(s){let H={type:"PERSISTENCE_ERROR",operation:"load",workflowId:p,cause:s,message:`Failed to load state for workflow '${p}': ${s instanceof Error?s.message:String(s)}`};return K(H)}if(b)try{ut(b)}catch(s){if(s instanceof xe){let H={type:"PERSISTENCE_ERROR",operation:"load",workflowId:p,cause:s,message:`Invalid snapshot format for workflow '${p}': ${s.message}`};return K(H)}throw s}if(b){let s=typeof b.metadata?.version=="number"?b.metadata.version:1;if(s!==C){let H={type:"VERSION_MISMATCH",workflowId:p,storedVersion:s,requestedVersion:C,currentVersion:C,message:`Workflow '${p}' has stored state at version ${s} but this run requested version ${C}. Migrate the stored state to the new version, or clear state for this id (e.g. durable.deleteState(store, '${p}')) and re-run.`};if(!ie)return K(H);let oe=await Promise.resolve(ie({id:p,storedVersion:s,requestedVersion:C}));if(oe==="throw")return K(H);if(oe==="clear"){try{await d.delete(p)}catch{}b=null}else b=oe.migratedSnapshot}}let ne=(s,H)=>{I&&I(s,H)},we=Ie(),ye={snapshot:b,onAfterStep:async(s,H,oe,me)=>{try{let fe=we.getResumeState(),ce={};for(let[a,o]of fe.steps)if(o.result.ok)ce[a]={ok:!0,value:o.result.value};else{let r=o.result.cause,i=r instanceof Error?qe(r):He(r),w=o.meta?.origin==="throw"?"throw":"result";ce[a]={ok:!1,error:o.result.error,cause:i,meta:{origin:w}}}let m={formatVersion:1,workflowName:p,steps:ce,execution:{status:"running",lastUpdated:new Date().toISOString(),currentStepId:s},metadata:{...b?.metadata??{},...ee,version:C,lastStepKey:s}},c=b?lt(b,m):m;if(c.warnings&&c.warnings.length>0){let a=new Set(Object.keys(m.steps)),o=c.warnings.filter(r=>!a.has(r.stepId));c={...c,warnings:o.length>0?o:void 0}}await d.save(p,c),ne({type:"persist_success",workflowId:oe,stepKey:s,ts:Date.now(),context:me},me)}catch(fe){ne({type:"persist_error",workflowId:oe,stepKey:s,error:fe,ts:Date.now(),context:me},me)}},onEvent:(s,H)=>{we.handleEvent(s),ne(s,H)},onError:T,signal:l,createContext:Z},ke;try{ke=Ye(p,e,ye)}catch(s){if(s instanceof xe){let H={type:"PERSISTENCE_ERROR",operation:"load",workflowId:p,cause:s,message:`Invalid snapshot format for workflow '${p}': ${s.message}`};return K(H)}throw s}let pe;try{pe=await ke.run(t)}catch(s){if(s instanceof xe||s instanceof De){let H={type:"PERSISTENCE_ERROR",operation:"load",workflowId:p,cause:s,message:`Invalid snapshot format for workflow '${p}': ${s.message}`};return K(H)}throw s}if(pe.ok)try{await d.delete(p)}catch(s){let H={type:"PERSISTENCE_ERROR",operation:"delete",workflowId:p,cause:s,message:`Failed to delete state for workflow '${p}': ${s instanceof Error?s.message:String(s)}`};return K(H)}return pe}finally{if(Ze.delete(p),q!==null&&dt(d))try{await d.release(p,q)}catch{}}},async clearState(e){let t=e;if(typeof t.clear=="function"){await t.clear();return}let n=100;for(;;){let p=await e.list({limit:n});if(p.length===0)break;let g=p.map(C=>C.id);if(await this.deleteStates(e,g,{continueOnError:!0}),p.length<n)break}},async hasState(e,t){try{return await e.load(t)!==null}catch{return!1}},async deleteState(e,t){try{return await e.delete(t),!0}catch{return!1}},async deleteStates(e,t,n={}){let{concurrency:p=10,continueOnError:g=!0}=n;if(t.length===0)return{deleted:0};let C=[],A=0,D=async l=>{try{await e.delete(l),A++}catch(Z){if(g)C.push({id:l,error:Z});else throw Z}},ee=Math.max(1,p);for(let l=0;l<t.length;l+=ee){let Z=t.slice(l,l+ee);await Promise.all(Z.map(I=>D(I)))}return C.length>0?{deleted:A,errors:C}:{deleted:A}},async listPending(e,t){try{return await e.list(t)}catch{return[]}}};0&&(module.exports={durable,isConcurrentExecution,isPersistenceError,isVersionMismatch,isWorkflowCancelled});
10
+ const restored = parseState(json); // Load this`),typeof f.steps=="object"&&f.steps!==null&&(f.steps=new Map(Object.entries(f.steps))));for(let[u,G]of f.steps){let{result:R,meta:d}=G;if(R.ok)c.set(u,R);else{let h=d??{origin:"result",resultCause:R.cause};c.set(u,he(R.error,h,R.cause))}}}let O=D?.snapshot??E?.snapshot,P=E?.serialization;if(O&&!w){c||(c=new Map);let f=O,u=P?.decode;for(let[G,R]of Object.entries(f.steps))if(Object.prototype.hasOwnProperty.call(f.steps,G))try{if(R.ok){let d=u?u(R.value):R.value;c.set(G,X(d))}else{let d=u?u(R.error):R.error,h=Ze(R.cause),C=R.meta?.origin==="throw"?{origin:"throw",thrown:h}:{origin:"result",resultCause:h};c.set(G,he(d,C,h))}}catch(d){throw new De(`Failed to decode step "${G}": ${d instanceof Error?d.message:String(d)}`,G,d instanceof Error?d:void 0)}}let j=!1,Y,I,ee=()=>{j=!0,Y=typeof U?.reason=="string"?U.reason:U?.reason instanceof Error?U.reason.message:void 0};U&&!U.aborted&&U.addEventListener("abort",ee,{once:!0});let F=()=>{if(j||U?.aborted)throw{type:"WORKFLOW_CANCELLED",reason:Y??(typeof U?.reason=="string"?U.reason:U?.reason instanceof Error?U.reason.message:void 0),lastStepKey:I}},N=async(f,u,G)=>{if(!de)return;let R=performance.now();try{await de(f,u,b,H);let d=performance.now()-R;r({type:"hook_after_step",workflowId:b,stepKey:f,ts:Date.now(),durationMs:d})}catch(d){let h=performance.now()-R;throw r({type:"hook_after_step_error",workflowId:b,stepKey:f,ts:Date.now(),durationMs:h,error:d}),d}},V=f=>{let u=async(d,h,C)=>{if(typeof d!="string")throw new Error('[awaitly] step() requires a string ID as the first argument. Example: step("fetchUser", () => fetchUser(id))');let S=d,_=C??{},K=S,T=Object.prototype.hasOwnProperty.call(_,"key")?_.key:S,{ttl:L,out:te}=_;F();let Q=ze(_);if(T&&c&&c.has(T)){r({type:"step_cache_hit",workflowId:b,stepKey:T,name:K,ts:Date.now(),...Q&&{metadata:Q}});let W=c.get(T);if(W.ok)return I=T,te&&(J[te]=W.value),W.value;let $=je(W.cause);throw Pe(W.error,$)}T&&c&&r({type:"step_cache_miss",workflowId:b,stepKey:T,name:K,ts:Date.now(),...Q&&{metadata:Q}});try{let W=await f(S,h,_);return te&&(J[te]=W),T&&(I=T,c&&c.set(T,X(W),L?{ttl:L}:void 0),await N(T,X(W))),W}catch(W){if(T&&Ce(W)){let $=W,se=$.meta.origin==="result"?$.meta.resultCause:$.meta.origin==="throw"?$.meta.thrown:void 0,Z=he($.error,$.meta,se);c&&c.set(T,Z,L?{ttl:L}:void 0),await N(T,Z,$.meta)}throw W}};u.try=async(d,h,C)=>{let{ttl:S}=C,_=C.key??d,K=d;if(c&&c.has(_)){r({type:"step_cache_hit",workflowId:b,stepKey:_,name:K,ts:Date.now()});let T=c.get(_);if(T.ok)return T.value;let L=je(T.cause);throw Pe(T.error,L)}c&&r({type:"step_cache_miss",workflowId:b,stepKey:_,name:K,ts:Date.now()});try{let T=await f.try(d,h,{...C,key:_});return c&&c.set(_,X(T),S?{ttl:S}:void 0),await N(_,X(T)),T}catch(T){if(Ce(T)){let L=T,te=L.meta.origin==="result"?L.meta.resultCause:L.meta.origin==="throw"?L.meta.thrown:void 0,Q=he(L.error,L.meta,te);c&&c.set(_,Q,S?{ttl:S}:void 0),await N(_,Q,L.meta)}throw T}},u.fromResult=async(d,h,C)=>{let{ttl:S}=C,_=C.key??d,K=d;if(c&&c.has(_)){r({type:"step_cache_hit",workflowId:b,stepKey:_,name:K,ts:Date.now()});let T=c.get(_);if(T.ok)return T.value;let L=je(T.cause);throw Pe(T.error,L)}c&&r({type:"step_cache_miss",workflowId:b,stepKey:_,name:K,ts:Date.now()});try{let T=await f.fromResult(d,h,{...C,key:_});return c&&c.set(_,X(T),S?{ttl:S}:void 0),await N(_,X(T)),T}catch(T){if(Ce(T)){let L=T,te=L.meta.origin==="result"?L.meta.resultCause:L.meta.origin==="throw"?L.meta.thrown:void 0,Q=he(L.error,L.meta,te);c&&c.set(_,Q,S?{ttl:S}:void 0),await N(_,Q,L.meta)}throw T}},u.parallel=f.parallel,u.race=f.race,u.allSettled=f.allSettled,u.withFallback=async(d,h,C)=>{let S=C.key??d,_=d;if(c&&c.has(S)){r({type:"step_cache_hit",workflowId:b,stepKey:S,name:_,ts:Date.now()});let K=c.get(S);if(K.ok)return K.value;let T=je(K.cause);throw Pe(K.error,T)}c&&r({type:"step_cache_miss",workflowId:b,stepKey:S,name:_,ts:Date.now()});try{let K=await f.withFallback(d,h,C);return c&&c.set(S,X(K)),await N(S,X(K)),K}catch(K){if(Ce(K)){let T=K,L=T.meta.origin==="result"?T.meta.resultCause:T.meta.origin==="throw"?T.meta.thrown:void 0,te=he(T.error,T.meta,L);c&&c.set(S,te),await N(S,te,T.meta)}throw K}},u.withResource=async(d,h)=>{let C=d;try{let S=await f.withResource(d,h);return await N(C,X(S)),S}catch(S){if(Ce(S)){let _=S,K=_.meta.origin==="result"?_.meta.resultCause:_.meta.origin==="throw"?_.meta.thrown:void 0,T=he(_.error,_.meta,K);await N(C,T,_.meta)}throw S}},u.retry=(d,h,C)=>{let S={key:C.key,retry:{attempts:C.attempts,backoff:C.backoff,initialDelay:C.initialDelay,maxDelay:C.maxDelay,jitter:C.jitter,retryOn:C.retryOn,onRetry:C.onRetry},timeout:C.timeout,ttl:C.ttl};return u(d,h,S)},u.withTimeout=(d,h,C)=>{let S={key:C.key,timeout:C,ttl:C.ttl};return u(d,h,S)},u.sleep=(d,h,C)=>{if(typeof d!="string"||d.length===0)throw new Error('[awaitly] step.sleep() requires an explicit string ID as the first argument. Example: step.sleep("delay", "5s")');let S=typeof h=="string"?Ct(h):h;if(!S)throw new Error(`step.sleep: invalid duration '${h}'`);let _=ht(S),K=C?.signal;return u(d,async()=>{if(U?.aborted||K?.aborted){let L=new Error("Sleep aborted");throw L.name="AbortError",L}return new Promise((L,te)=>{let Q={timeoutId:void 0},W=()=>{Q.timeoutId&&clearTimeout(Q.timeoutId);let $=new Error("Sleep aborted");$.name="AbortError",te($)};U?.addEventListener("abort",W,{once:!0}),K?.addEventListener("abort",W,{once:!0}),Q.timeoutId=setTimeout(()=>{U?.removeEventListener("abort",W),K?.removeEventListener("abort",W),L(X(void 0))},_)})},{key:C?.key,ttl:C?.ttl,description:C?.description})};let G=new Map,R=new Map;return u.getWritable=d=>{let h=d?.namespace??"default",C=d?.highWaterMark??16;if(!x)throw new Error("streamStore is required to use getWritable(). Pass a streamStore to createWorkflow options.");let S=`${b}:${h}`,_=G.get(S);if(_&&!_.closed&&!_.aborted)return _.writer;let K=xt({highWaterMark:C,onStateChange:$=>{r({type:"stream_backpressure",workflowId:b,namespace:h,bufferedCount:K.bufferedCount,state:$,ts:Date.now()})}}),T=0,L=!0,te=!1,Q=!1;r({type:"stream_created",workflowId:b,namespace:h,ts:Date.now()});let W={async write($){if(Q)return M($e("closed","Stream is closed"));if(te)return M($e("aborted","Stream was aborted"));K.state==="paused"&&await K.waitForDrain();let se={value:$,position:T,ts:Date.now()},Z=await x.append(b,h,se);return Z.ok?(r({type:"stream_write",workflowId:b,namespace:h,position:T,ts:Date.now()}),T++,K.increment(),X(void 0)):(r({type:"stream_error",workflowId:b,namespace:h,error:Z.error,position:T,ts:Date.now()}),M($e("store_error",Z.error.message,Z.error)))},async close(){if(Q)return M(et("already_closed","Stream is already closed"));let $=await x.closeStream(b,h);return $.ok?(Q=!0,L=!1,r({type:"stream_close",workflowId:b,namespace:h,finalPosition:T,ts:Date.now()}),G.delete(S),X(void 0)):M(et("store_error",$.error.message,$.error))},abort($){te=!0,L=!1,Q=!0,r({type:"stream_error",workflowId:b,namespace:h,error:$,position:T,ts:Date.now()}),G.delete(S)},get writable(){return L},get position(){return T},get namespace(){return h}};return G.set(S,{writer:W,backpressure:K,aborted:te,closed:Q}),W},u.getReadable=d=>{let h=d?.namespace??"default",C=d?.startIndex??0,S=d?.pollInterval??10,_=d?.pollTimeout??3e4;if(!x)throw new Error("streamStore is required to use getReadable(). Pass a streamStore to createWorkflow options.");let K=`${b}:${h}:${C}`,T=R.get(K);if(T&&!T.closed)return T.reader;let L=()=>{let Re=`${b}:${h}`,ne=G.get(Re);ne&&ne.backpressure.decrement()},te=C,Q=!0,W=!1,$=[],se=0,Z={async read(){if(W)return M(Qe("closed","Reader is closed"));if(se<$.length){let le=$[se++];return te=le.position+1,L(),r({type:"stream_read",workflowId:b,namespace:h,position:le.position,ts:Date.now()}),X(le.value)}let Re=`${b}:${h}`,ne=Date.now(),ue=G.has(Re),re=await x.getMetadata(b,h),ae=re.ok&&re.value!==void 0;for(;Date.now()-ne<_;){let le=await x.read(b,h,te,100);if(!le.ok)return M(Qe("store_error",le.error.message,le.error));let Ie=le.value;if(Ie.length>0){$=Ie,se=1;let Ue=Ie[0];return te=Ue.position+1,L(),r({type:"stream_read",workflowId:b,namespace:h,position:Ue.position,ts:Date.now()}),X(Ue.value)}let Me=G.has(Re),xe=await x.getMetadata(b,h),ot=xe.ok&&xe.value!==void 0;if(Me&&(ue=!0),ot&&(ae=!0),xe.ok&&xe.value?.closed)return Q=!1,M(Be(te));if(ue&&!Me&&!ot)return Q=!1,M(Be(te));ae&&!Me&&xe.ok&&xe.value?.closed,await new Promise(Ue=>setTimeout(Ue,S))}return Q=!1,M(Be(te))},close(){W=!0,Q=!1,$=[],R.delete(K)},get readable(){return Q},get position(){return te},get namespace(){return h}};return R.set(K,{reader:Z,position:te,closed:W}),Z},u.streamForEach=async(d,h,C)=>{let S=C?.checkpointInterval??1,_=C?.concurrency??1,K=[],T=0,L=-1,te=W=>typeof W=="object"&&W!==null&&"read"in W&&typeof W.read=="function",Q=async(W,$,se,Z)=>{let ne=S>0&&$%S===0?`stream-foreach:${Z}:pos-${se}`:void 0,ue=ne??`stream-item-${se}`,re=await u(ue,()=>h(W,$),{key:ne});return{index:$,position:se,result:re}};if(te(d))if(_<=1){let W=d.position,$=await d.read();for(;$.ok;){let se=$.value,{result:Z}=await Q(se,T,W,d.namespace);K.push(Z),L=W,T++,W=d.position,$=await d.read()}}else{let W=new Map,$=0,se=0,Z=new Array(_).fill(null),Re=async()=>{for(let le=0;le<Z.length;le++)if(Z[le]===null)return le;let re=Z.filter(le=>le!==null),ae=await Promise.race(re);return W.set(ae.index,{position:ae.position,result:ae.result}),Z[ae.slotIndex]=null,ae.slotIndex},ne=d.position,ue=await d.read();for(;ue.ok;){let re=await Re(),ae=$,le=ne,Ie=ue.value,Me=re;Z[re]=Q(Ie,ae,le,d.namespace).then(xe=>({slotIndex:Me,...xe})),se++,$++,ne=d.position,ue=await d.read()}for(let re=0;re<Z.length;re++)if(Z[re]!==null){let ae=await Z[re];W.set(ae.index,{position:ae.position,result:ae.result})}for(let re=0;re<se;re++){let ae=W.get(re);ae&&(K.push(ae.result),L=ae.position,T++)}}else if(_<=1){let W=0;for await(let $ of d){let{result:se}=await Q($,W,W,"async-iterable");K.push(se),L=W,T++,W++}}else{let W=new Map,$=0,se=0,Z=new Array(_).fill(null),Re=async()=>{for(let re=0;re<Z.length;re++)if(Z[re]===null)return re;let ne=Z.filter(re=>re!==null),ue=await Promise.race(ne);return W.set(ue.index,ue.result),Z[ue.slotIndex]=null,ue.slotIndex};for await(let ne of d){let ue=await Re(),re=$,ae=ue;Z[ue]=Q(ne,re,re,"async-iterable").then(le=>({slotIndex:ae,...le})),se++,$++}for(let ne=0;ne<Z.length;ne++)if(Z[ne]!==null){let ue=await Z[ne];W.set(ue.index,ue.result)}for(let ne=0;ne<se;ne++)W.has(ne)&&(K.push(W.get(ne)),L=ne,T++)}return{results:K,processedCount:T,lastPosition:L}},u.if=f.if,u.label=f.label,u.branch=f.branch,u.arm=f.arm,u.forEach=f.forEach,u.item=f.item,u.dep=f.dep,u.run=(d,h,C)=>u(d,typeof h=="function"?h:()=>h,C),u.workflow=(d,h,C)=>u(d,h,C),u.andThen=(d,h,C,S)=>u(d,()=>C(h),S),u.match=(d,h,C,S)=>u(d,async()=>{let _=await h;return _.ok?X(await C.ok(_.value)):X(await C.err(_.error,_.cause))},S),u.all=(d,h,C)=>{let S=C!==void 0&&Object.prototype.hasOwnProperty.call(C,"key")?C:{...C,key:void 0};return u(d,async()=>X(await f.all(d,h)),S)},u.map=(d,h,C,S)=>{let _=S!==void 0&&Object.prototype.hasOwnProperty.call(S,"key")?S:{...S,key:void 0};return u(d,async()=>X(await f.map(d,h,C,S)),_)},u},Te=({step:f})=>q({step:V(f),deps:ie,ctx:p}),oe;try{oe=await Ve(Te,{onError:pe,onEvent:ce,catchUnexpected:B,workflowId:b,workflowName:e,context:H,_workflowSignal:U})}finally{U&&U.removeEventListener("abort",ee)}let Se=performance.now()-k;if(!oe.ok){let f;if(be(oe.cause)&&(f=oe.cause),!f&&j&&yt(oe.error)){let u=oe.cause;u!=null&&typeof u=="object"&&"name"in u&&u.name==="AbortError"&&(f={type:"WORKFLOW_CANCELLED",reason:Y??(typeof U?.reason=="string"?U.reason:U?.reason instanceof Error?U.reason.message:void 0),lastStepKey:I})}if(f)return r({type:"workflow_cancelled",workflowId:b,ts:Date.now(),durationMs:Se,reason:f.reason,lastStepKey:f.lastStepKey}),f&&!be(oe.cause)?M(oe.error,{cause:f}):oe}if(oe.ok&&j){let f=Y??(typeof U?.reason=="string"?U.reason:U?.reason instanceof Error?U.reason.message:void 0);r({type:"workflow_cancelled",workflowId:b,ts:Date.now(),durationMs:Se,reason:f,lastStepKey:I});let u={type:"WORKFLOW_CANCELLED",reason:f,lastStepKey:I};return M(B(u),{cause:u})}return oe.ok?r({type:"workflow_success",workflowId:b,ts:Date.now(),durationMs:Se}):r({type:"workflow_error",workflowId:b,ts:Date.now(),durationMs:Se,error:oe.error}),oe}function v(l,q,D){let b,ie,m;return typeof l=="string"?(b=l,ie=q,m=D):(ie=l,m=q),g(b,ie,m)}async function A(l,q,D){let b,ie,m;typeof l=="string"?(b=l,ie=q,m=D):(ie=l,m=q);let H=Ke(),U=m?.onEvent,pe={...m,onEvent:(de,w)=>{H.handleEvent(de);try{U?.(de,w)}catch{}}},we,ge;try{we=await g(b,ie,pe)}catch(de){let w=E?.catchUnexpected??Le;we=M(w(de),{cause:de})}finally{ge=H.getResumeState()}return{result:we,resumeState:ge}}return{run:v,runWithState:A}}var rt;function ar(){let e=new Map;return{async save(t,o){e.set(t,{snapshot:o,updatedAt:new Date})},async load(t){return e.get(t)?.snapshot??null},async delete(t){e.delete(t)},async list(t){let o=t?.prefix??"",i=t?.limit??100,E=[];for(let[g,v]of e.entries())if(!(o&&!g.startsWith(o))&&(E.push({id:g,updatedAt:v.updatedAt.toISOString()}),E.length>=i))break;return E.sort((g,v)=>v.updatedAt.localeCompare(g.updatedAt)),E},async close(){}}}function ir(){return rt===void 0&&(rt=ar()),rt}function At(e){return typeof e=="object"&&e!==null&&e.type==="VERSION_MISMATCH"}function _t(e){return typeof e=="object"&&e!==null&&e.type==="CONCURRENT_EXECUTION"}function Ot(e){return typeof e=="object"&&e!==null&&e.type==="PERSISTENCE_ERROR"}function Pt(e){return typeof e=="object"&&e!==null&&e.type==="LEASE_EXPIRED"}function Dt(e){return typeof e=="object"&&e!==null&&e.type==="IDEMPOTENCY_CONFLICT"}function vt(e){return typeof e.tryAcquire=="function"&&typeof e.release=="function"}var nt=new Set,It={async run(e,t,o){let{id:i,store:E,version:g=1,allowConcurrent:v=!1,lockTtlMs:A=6e4,heartbeatIntervalMs:z,abortOnLeaseLoss:l,metadata:q,signal:D,createContext:b,onEvent:ie,onError:m,onVersionMismatch:H,idempotencyKey:U,input:ce}=o,pe=E??ir();if(U){let B=`idem:${U}`;try{let J=await pe.load(B);if(J){if(ce!==void 0&&J.metadata?.input!==void 0){let fe=JSON.stringify(J.metadata.input),ye=JSON.stringify(ce);if(fe!==ye)return M({type:"IDEMPOTENCY_CONFLICT",idempotencyKey:U,workflowId:i,message:`Idempotency key '${U}' already used with different input for workflow '${i}'.`})}if(J.execution.status==="completed"&&J.metadata?.finalResult!==void 0)return J.metadata.finalResult;if(J.execution.status==="running")return M({type:"CONCURRENT_EXECUTION",workflowId:i,message:`Workflow '${i}' with idempotency key '${U}' is already running.`,reason:"cross-process"})}}catch{}}if(!v&&nt.has(i)){let B={type:"CONCURRENT_EXECUTION",workflowId:i,message:`Workflow '${i}' is already running. Set allowConcurrent: true to allow parallel executions.`,reason:"in-process"};return M(B)}let we=null;if(!v&&vt(pe)){let B;try{B=await pe.tryAcquire(i,{ttlMs:A})}catch(J){let fe={type:"PERSISTENCE_ERROR",operation:"load",workflowId:i,cause:J,message:`Failed to acquire lock for workflow '${i}': ${J instanceof Error?J.message:String(J)}`};return M(fe)}if(B===null){let J={type:"CONCURRENT_EXECUTION",workflowId:i,message:`Workflow '${i}' is already running (lease held by another process). Set allowConcurrent: true to allow parallel executions.`,reason:"cross-process"};return M(J)}we=B.ownerToken}let ge,de,w=pe;if(we&&typeof w.renew=="function"){let B=z??Math.floor(A/3);de=new AbortController,ge=setInterval(async()=>{try{await w.renew(i,we,{ttlMs:A})||de.abort(new Error("Lease expired"))}catch{de.abort(new Error("Lease renewal failed"))}},B)}nt.add(i);try{let B=null;try{B=await pe.load(i)}catch(r){let s={type:"PERSISTENCE_ERROR",operation:"load",workflowId:i,cause:r,message:`Failed to load state for workflow '${i}': ${r instanceof Error?r.message:String(r)}`};return M(s)}if(B)try{Rt(B)}catch(r){if(r instanceof ve){let s={type:"PERSISTENCE_ERROR",operation:"load",workflowId:i,cause:r,message:`Invalid snapshot format for workflow '${i}': ${r.message}`};return M(s)}throw r}if(B){let r=typeof B.metadata?.version=="number"?B.metadata.version:1;if(r!==g){let s={type:"VERSION_MISMATCH",workflowId:i,storedVersion:r,requestedVersion:g,currentVersion:g,message:`Workflow '${i}' has stored state at version ${r} but this run requested version ${g}. Migrate the stored state to the new version, or clear state for this id (e.g. durable.deleteState(store, '${i}')) and re-run.`};if(!H)return M(s);let a=await Promise.resolve(H({id:i,storedVersion:r,requestedVersion:g}));if(a==="throw")return M(s);if(a==="clear"){try{await pe.delete(i)}catch{}B=null}else B=a.migratedSnapshot}}let J=(r,s)=>{ie&&ie(r,s)},fe=Ke(),ye={snapshot:B,onAfterStep:async(r,s,a,n)=>{try{let y=fe.getResumeState(),k={};for(let[O,P]of y.steps)if(P.result.ok)k[O]={ok:!0,value:P.result.value};else{let j=P.result.cause,Y=j instanceof Error?Xe(j):Ge(j),I=P.meta?.origin==="throw"?"throw":"result";k[O]={ok:!1,error:P.result.error,cause:Y,meta:{origin:I}}}let c={formatVersion:1,workflowName:i,steps:k,execution:{status:"running",lastUpdated:new Date().toISOString(),currentStepId:r},metadata:{...B?.metadata??{},...q,version:g,lastStepKey:r}},x=B?St(B,c):c;if(x.warnings&&x.warnings.length>0){let O=new Set(Object.keys(c.steps)),P=x.warnings.filter(j=>!O.has(j.stepId));x={...x,warnings:P.length>0?P:void 0}}await pe.save(i,x),J({type:"persist_success",workflowId:a,stepKey:r,ts:Date.now(),context:n},n)}catch(y){J({type:"persist_error",workflowId:a,stepKey:r,error:y,ts:Date.now(),context:n},n)}},onEvent:(r,s)=>{fe.handleEvent(r),J(r,s)},onError:m,signal:de&&D?AbortSignal.any([D,de.signal]):de?.signal??D,createContext:b},me;try{me=tt(i,e,ye)}catch(r){if(r instanceof ve){let s={type:"PERSISTENCE_ERROR",operation:"load",workflowId:i,cause:r,message:`Invalid snapshot format for workflow '${i}': ${r.message}`};return M(s)}throw r}let p;try{p=await me.run(t)}catch(r){if(r instanceof ve||r instanceof De){let s={type:"PERSISTENCE_ERROR",operation:"load",workflowId:i,cause:r,message:`Invalid snapshot format for workflow '${i}': ${r.message}`};return M(s)}throw r}if(l!==!1&&de?.signal.aborted)return M({type:"LEASE_EXPIRED",workflowId:i,message:`Lease expired for workflow '${i}' during execution. The workflow may have been reclaimed by another process.`});if(p.ok){try{await pe.delete(i)}catch(r){let s={type:"PERSISTENCE_ERROR",operation:"delete",workflowId:i,cause:r,message:`Failed to delete state for workflow '${i}': ${r instanceof Error?r.message:String(r)}`};return M(s)}if(U){let r=`idem:${U}`;try{await pe.save(r,{formatVersion:1,steps:{},execution:{status:"completed",lastUpdated:new Date().toISOString(),completedAt:new Date().toISOString()},metadata:{workflowId:i,idempotencyKey:U,input:ce,finalResult:p}})}catch{}}}return p}finally{if(nt.delete(i),ge&&clearInterval(ge),we!==null&&vt(pe))try{await pe.release(i,we)}catch{}}},async clearState(e){let t=e;if(typeof t.clear=="function"){await t.clear();return}let o=100;for(;;){let i=await e.list({limit:o});if(i.length===0)break;let E=i.map(g=>g.id);if(await this.deleteStates(e,E,{continueOnError:!0}),i.length<o)break}},async hasState(e,t){try{return await e.load(t)!==null}catch{return!1}},async deleteState(e,t){try{return await e.delete(t),!0}catch{return!1}},async deleteStates(e,t,o={}){let{concurrency:i=10,continueOnError:E=!0}=o;if(t.length===0)return{deleted:0};let g=[],v=0,A=async l=>{try{await e.delete(l),v++}catch(q){if(E)g.push({id:l,error:q});else throw q}},z=Math.max(1,i);for(let l=0;l<t.length;l+=z){let q=t.slice(l,l+z);await Promise.all(q.map(D=>A(D)))}return g.length>0?{deleted:v,errors:g}:{deleted:v}},async listPending(e,t){try{return await e.list(t)}catch{return[]}}};0&&(module.exports={durable,isConcurrentExecution,isIdempotencyConflict,isLeaseExpired,isPersistenceError,isVersionMismatch,isWorkflowCancelled});
11
11
  //# sourceMappingURL=durable.cjs.map