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.
- package/dist/adapters.cjs +2 -2
- package/dist/adapters.cjs.map +1 -1
- package/dist/adapters.d.cts +3 -1
- package/dist/adapters.d.ts +3 -1
- package/dist/adapters.js +2 -2
- package/dist/adapters.js.map +1 -1
- package/dist/batch.cjs +2 -2
- package/dist/batch.cjs.map +1 -1
- package/dist/batch.d.cts +3 -1
- package/dist/batch.d.ts +3 -1
- package/dist/batch.js +2 -2
- package/dist/batch.js.map +1 -1
- package/dist/circuit-breaker.cjs +2 -2
- package/dist/circuit-breaker.cjs.map +1 -1
- package/dist/circuit-breaker.d.cts +3 -1
- package/dist/circuit-breaker.d.ts +3 -1
- package/dist/circuit-breaker.js +2 -2
- package/dist/circuit-breaker.js.map +1 -1
- package/dist/conditional.d.cts +3 -1
- package/dist/conditional.d.ts +3 -1
- package/dist/core.cjs +2 -2
- package/dist/core.cjs.map +1 -1
- package/dist/core.d.cts +2 -1
- package/dist/core.d.ts +2 -1
- package/dist/core.js +2 -2
- package/dist/core.js.map +1 -1
- package/dist/diagnostics.cjs +3 -3
- package/dist/diagnostics.cjs.map +1 -1
- package/dist/diagnostics.d.cts +3 -1
- package/dist/diagnostics.d.ts +3 -1
- package/dist/diagnostics.js +3 -3
- package/dist/diagnostics.js.map +1 -1
- package/dist/durable.cjs +3 -3
- package/dist/durable.cjs.map +1 -1
- package/dist/durable.d.cts +8 -361
- package/dist/durable.d.ts +8 -361
- package/dist/durable.js +3 -3
- package/dist/durable.js.map +1 -1
- package/dist/engine.cjs +11 -0
- package/dist/engine.cjs.map +1 -0
- package/dist/engine.d.cts +114 -0
- package/dist/engine.d.ts +114 -0
- package/dist/engine.js +11 -0
- package/dist/engine.js.map +1 -0
- package/dist/errors-entry-CMH73Eym.d.cts +339 -0
- package/dist/errors-entry-DOt5UUl4.d.ts +339 -0
- package/dist/errors.cjs +1 -1
- package/dist/errors.cjs.map +1 -1
- package/dist/errors.d.cts +2 -318
- package/dist/errors.d.ts +2 -318
- package/dist/errors.js +1 -1
- package/dist/errors.js.map +1 -1
- package/dist/fetch.cjs +2 -2
- package/dist/fetch.cjs.map +1 -1
- package/dist/fetch.d.cts +3 -1
- package/dist/fetch.d.ts +3 -1
- package/dist/fetch.js +2 -2
- package/dist/fetch.js.map +1 -1
- package/dist/functional.cjs +1 -1
- package/dist/functional.cjs.map +1 -1
- package/dist/functional.d.cts +2 -0
- package/dist/functional.d.ts +2 -0
- package/dist/functional.js +1 -1
- package/dist/functional.js.map +1 -1
- package/dist/{guards-PU64_GKv.d.cts → guards-B79mP5Q8.d.cts} +3 -3
- package/dist/{guards-B5lgMJq0.d.ts → guards-BUq6NJCM.d.ts} +3 -3
- package/dist/{hitl-Dyiy0R1v.d.cts → hitl-BCqkMAHw.d.cts} +2 -2
- package/dist/{hitl-BjeSm1sJ.d.ts → hitl-BZtPx0aU.d.ts} +2 -2
- package/dist/hitl.cjs +2 -2
- package/dist/hitl.cjs.map +1 -1
- package/dist/hitl.d.cts +9 -6
- package/dist/hitl.d.ts +9 -6
- package/dist/hitl.js +2 -2
- package/dist/hitl.js.map +1 -1
- package/dist/index-BVUAOWGG.d.ts +417 -0
- package/dist/index-CQnpmUcC.d.cts +417 -0
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -3
- package/dist/index.d.ts +4 -3
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/otel.d.cts +3 -1
- package/dist/otel.d.ts +3 -1
- package/dist/{persistence-entry-B3ukwbb5.d.ts → persistence-entry-ClFhxd2Q.d.ts} +11 -5
- package/dist/{persistence-entry-CgVzswbg.d.cts → persistence-entry-jflY61az.d.cts} +11 -5
- package/dist/persistence.d.cts +6 -3
- package/dist/persistence.d.ts +6 -3
- package/dist/policies.d.cts +3 -1
- package/dist/policies.d.ts +3 -1
- package/dist/ratelimit.cjs +2 -2
- package/dist/ratelimit.cjs.map +1 -1
- package/dist/ratelimit.d.cts +3 -1
- package/dist/ratelimit.d.ts +3 -1
- package/dist/ratelimit.js +2 -2
- package/dist/ratelimit.js.map +1 -1
- package/dist/reliability.cjs +2 -2
- package/dist/reliability.cjs.map +1 -1
- package/dist/reliability.d.cts +3 -1
- package/dist/reliability.d.ts +3 -1
- package/dist/reliability.js +2 -2
- package/dist/reliability.js.map +1 -1
- package/dist/resolver.cjs +2 -2
- package/dist/resolver.cjs.map +1 -1
- package/dist/resolver.d.cts +5 -3
- package/dist/resolver.d.ts +5 -3
- package/dist/resolver.js +2 -2
- package/dist/resolver.js.map +1 -1
- package/dist/resource.cjs +2 -2
- package/dist/resource.cjs.map +1 -1
- package/dist/resource.d.cts +3 -1
- package/dist/resource.d.ts +3 -1
- package/dist/resource.js +2 -2
- package/dist/resource.js.map +1 -1
- package/dist/result/retry.cjs +1 -1
- package/dist/result/retry.cjs.map +1 -1
- package/dist/result/retry.d.cts +2 -0
- package/dist/result/retry.d.ts +2 -0
- package/dist/result/retry.js +1 -1
- package/dist/result/retry.js.map +1 -1
- package/dist/result.cjs +1 -1
- package/dist/result.cjs.map +1 -1
- package/dist/result.d.cts +8 -23
- package/dist/result.d.ts +8 -23
- package/dist/result.js +1 -1
- package/dist/result.js.map +1 -1
- package/dist/{run-entry-C1uFytM6.d.cts → run-entry-rw7zll_G.d.ts} +16 -45
- package/dist/{run-entry-C1uFytM6.d.ts → run-entry-yQu63Yj9.d.cts} +16 -45
- package/dist/run.cjs +2 -2
- package/dist/run.cjs.map +1 -1
- package/dist/run.d.cts +3 -1
- package/dist/run.d.ts +3 -1
- package/dist/run.js +2 -2
- package/dist/run.js.map +1 -1
- package/dist/saga.cjs +2 -2
- package/dist/saga.cjs.map +1 -1
- package/dist/saga.d.cts +3 -1
- package/dist/saga.d.ts +3 -1
- package/dist/saga.js +2 -2
- package/dist/saga.js.map +1 -1
- package/dist/singleflight.d.cts +3 -1
- package/dist/singleflight.d.ts +3 -1
- package/dist/streaming.cjs +4 -4
- package/dist/streaming.cjs.map +1 -1
- package/dist/streaming.d.cts +5 -3
- package/dist/streaming.d.ts +5 -3
- package/dist/streaming.js +4 -4
- package/dist/streaming.js.map +1 -1
- package/dist/testing.cjs +8 -4
- package/dist/testing.cjs.map +1 -1
- package/dist/testing.d.cts +87 -4
- package/dist/testing.d.ts +87 -4
- package/dist/testing.js +8 -4
- package/dist/testing.js.map +1 -1
- package/dist/{types-wa_wTOn3.d.ts → types-CuWK5AlK.d.ts} +1 -1
- package/dist/{types-DUWrNIJu.d.cts → types-uR3JpwvF.d.cts} +1 -1
- package/dist/webhook.cjs +2 -2
- package/dist/webhook.cjs.map +1 -1
- package/dist/webhook.d.cts +7 -4
- package/dist/webhook.d.ts +7 -4
- package/dist/webhook.js +2 -2
- package/dist/webhook.js.map +1 -1
- package/dist/workflow.cjs +3 -3
- package/dist/workflow.cjs.map +1 -1
- package/dist/workflow.d.cts +47 -11
- package/dist/workflow.d.ts +47 -11
- package/dist/workflow.js +3 -3
- package/dist/workflow.js.map +1 -1
- package/package.json +15 -1
package/dist/durable.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
function dt(e){let t=e.trim().match(/^(\d+(?:\.\d+)?)\s*(ms|s|m|h|d)$/i);if(!t)return;let o=parseFloat(t[1]),p=t[2].toLowerCase();return{_tag:"Duration",millis:o*({ms:1,s:1e3,m:6e4,h:36e5,d:864e5}[p]??1)}}var rt="UNEXPECTED_ERROR";function Ne(e){return rt}function G(e){return{ok:!0,value:e}}function K(e,t){let o=t?.cause;return{ok:!1,error:e,...o!==void 0?{cause:o}:{}}}var nt=e=>e===rt||typeof e=="object"&&e!==null&&e.type==="UNEXPECTED_ERROR";function ft(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 Et(e,t){if(!(!t||!e))return t[e]}function Le(e){let{intent:t,domain:o,owner:p,tags:R,stateChanges:C,emits:A,calls:D}=e;if(!t&&!o&&!p&&!R?.length&&!C?.length&&!A?.length&&!D?.length)return;let ee={};return t&&(ee.intent=t),o&&(ee.domain=o),p&&(ee.owner=p),R?.length&&(ee.tags=R),C?.length&&(ee.stateChanges=C),A?.length&&(ee.emits=A),D?.length&&(ee.calls=D),ee}function Ee(e,t,o,p,R){let C=ft(e),A=Et(C,t),D={tag:C,origin:o};return A!==void 0&&(D.classification=A),p!==void 0&&(D.attempt=p),R!==void 0&&(D.cumulativeDurationMs=R),D}var be=Symbol.for("step_timeout_marker");function Qe(e){return typeof e!="object"||e===null?!1:e.type==="STEP_TIMEOUT"?!0:be in e}function wt(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(be in e)return e[be]}}var ot=Symbol("early-exit");function ve(e,t){return{[ot]:!0,error:e,meta:t}}function Se(e){return typeof e=="object"&&e!==null&&e[ot]===!0}var st=Symbol("mapper-exception");function xe(e){return{[st]:!0,thrown:e}}function yt(e){return typeof e=="object"&&e!==null&&e[st]===!0}function Ke(e,t){let{backoff:o,initialDelay:p,maxDelay:R,jitter:C}=t,A;switch(o){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,R),C){let D=A*.25*Math.random();A=A+D}return Math.floor(A)}function Ve(e){return new Promise(t=>setTimeout(t,e))}var et=Symbol("timeout"),Ue=Symbol("timeout-option");function kt(e){return typeof e=="object"&&e!==null&&e[Ue]===!0}async function gt(e,t,o,p){let R=new AbortController,C=t.onTimeout??"error",A=()=>typeof C=="function"?C({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},D;p?.aborted&&R.abort(p.reason);let ee;p&&!p.aborted&&(ee=()=>R.abort(p.reason),p.addEventListener("abort",ee,{once:!0}));let l=new Promise((I,T)=>{D=setTimeout(()=>{if(C!=="disconnect"&&R.abort(),C==="option"){T({[Ue]:!0,ms:t.ms});return}T({[et]:!0,error:A()})},t.ms)}),Z;t.signal?Z=Promise.resolve(e(R.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[et]===!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:o.name,stepKey:o.key,attempt:o.attempt};be in T?T[be]=ie:Object.defineProperty(T,be,{value:ie,enumerable:!1,writable:!0,configurable:!1})}throw T}throw I}finally{clearTimeout(D),ee&&p&&p.removeEventListener("abort",ee)}}var Ce={backoff:"exponential",initialDelay:100,maxDelay:3e4,jitter:!0,retryOn:()=>!0,onRetry:()=>{}};async function We(e,t){let{onError:o,onEvent:p,catchUnexpected:R,workflowId:C,workflowName:A,context:D,_workflowSignal:ee}=t&&typeof t=="object"?t:{},l=C??crypto.randomUUID(),Z=R??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=ve,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,n]of Object.entries(m))if(typeof n=="function")c[a]=n;else if(n&&typeof n=="object"&&"fn"in n)c[a]=n.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 n=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()-n})};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 o?.(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),n=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:n,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 o?.(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 n=a??{},r=Le(n),i=m,w=n.key??m,S=n.key??m,{description:_,retry:O,timeout:W}=n,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??Ce.backoff,initialDelay:O?.initialDelay??Ce.initialDelay,maxDelay:O?.maxDelay??Ce.maxDelay,jitter:O?.jitter??Ce.jitter,retryOn:O?.retryOn??Ce.retryOn,onRetry:O?.onRetry??Ce.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 gt(F,W,{name:i,key:w,attempt:v},ee):u=await F(),u.ok){let g=performance.now()-j;return d({type:"step_success",workflowId:l,stepId:V,stepKey:w,name:i,description:_,ts:Date.now(),durationMs:g,...r&&{metadata:r}}),S&&d({type:"step_complete",workflowId:l,stepKey:S,name:i,description:_,ts:Date.now(),durationMs:g,result:u,...r&&{metadata:r}}),u.value}if(de=u,v<P.attempts&&P.retryOn(u.error,v)){let g=Ke(v,P);d({type:"step_retry",workflowId:l,stepId:V,stepKey:w,name:i,ts:Date.now(),attempt:v+1,maxAttempts:P.attempts,delayMs:g,error:u.error,...r&&{metadata:r},diagnostics:Ee(u.error,n.errorMeta,"result",v,performance.now()-j)}),P.onRetry(u.error,v,g),await Ve(g);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,n.errorMeta,"result",v,performance.now()-j)});break}catch(u){let g=performance.now()-y;if(kt(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,n.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:g,...r&&{metadata:r}}),u;if(Qe(u)){let M=wt(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,n.errorMeta,"timeout",v)}),v<P.attempts&&P.retryOn(u,v)){let X=Ke(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,n.errorMeta,"timeout",v,performance.now()-j)}),P.onRetry(u,v,X),await Ve(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,n.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,n.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}}),o?.(u,i,D),q(u,{origin:"throw",thrown:u})}if(v<P.attempts&&P.retryOn(u,v)){let M=Ke(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,n.errorMeta,"throw",v,performance.now()-j)}),P.onRetry(u,v,M),await Ve(M);continue}P.attempts>1&&!Qe(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,n.errorMeta,"throw",v,performance.now()-j)});let h=performance.now()-j,x;try{x=Z(u)}catch(M){throw xe(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,n.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}}),o?.(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,n.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}}),o?.(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 n=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:n,name:r,ts:Date.now()});try{let O=await c(),W=performance.now()-_;return d({type:"step_success",workflowId:l,stepId:i,stepKey:n,name:r,ts:Date.now(),durationMs:W}),n&&d({type:"step_complete",workflowId:l,stepKey:n,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:n,name:r,ts:Date.now(),durationMs:V,error:Q}),n&&d({type:"step_complete",workflowId:l,stepKey:n,name:r,ts:Date.now(),durationMs:V,result:K(W,{cause:O}),meta:{origin:"throw",thrown:O}}),o?.(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 n=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:n,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:n,name:r,ts:Date.now(),durationMs:W}),n&&d({type:"step_complete",workflowId:l,stepKey:n,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:n,name:r,ts:Date.now(),durationMs:V,error:Q}),n&&d({type:"step_complete",workflowId:l,stepKey:n,name:r,ts:Date.now(),durationMs:V,result:K(W,{cause:O.error}),meta:{origin:"result",resultCause:O.error}}),o?.(Q,r,D),q(Q,{origin:"result",resultCause:O.error})}})()},s.fromNullable=(m,c,a,n)=>{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())},n)},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 n=typeof c=="string"?dt(c):c;if(!n)throw new Error(`step.sleep: invalid duration '${c}'`);let r=n.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 n=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()-n,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 o?.(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 n=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()-n})};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 o?.(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:n,else:r}=c;if(a())return await n();if(r)return await r()},s.arm=(m,c)=>({fn:m,errors:c}),s.forEach=async(m,c,a)=>{let n=[],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),n.push(O),i++}return n},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,n)=>s(m,()=>a(c),n),s.match=async(m,c,a,n)=>s(m,async()=>{let r=await c;return r.ok?G(await a.ok(r.value)):G(await a.err(r.error,r.cause))},n),s.all=s.parallel,s.map=async(m,c,a,n)=>{let r=n?.concurrency??c.length;return s(m,()=>r>=c.length?tt(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 tt(S.map((O,W)=>a(O,w+W)));if(!_.ok)return _;i.push(..._.value)}return G(i)})(),{key:n?.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 n=a.key??m,r=m,i=ie(n),w=p;return(async()=>{let S=w?performance.now():0;p&&d({type:"step_start",workflowId:l,stepId:i,stepKey:n,name:r,ts:Date.now()});let _;try{_=await c()}catch(j){if(b(j))throw d({type:"step_aborted",workflowId:l,stepId:i,stepKey:n,name:r,ts:Date.now(),durationMs:performance.now()-S}),j;let $;try{$=Z(j)}catch(B){throw xe(B)}if(a.on!==void 0&&a.on!==$){let B=performance.now()-S;throw d({type:"step_error",workflowId:l,stepId:i,stepKey:n,name:r,ts:Date.now(),durationMs:B,error:$}),n&&d({type:"step_complete",workflowId:l,stepKey:n,name:r,ts:Date.now(),durationMs:B,result:K($,{cause:j}),meta:{origin:"throw",thrown:j}}),o?.($,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:n,name:r,ts:Date.now(),durationMs:performance.now()-S}),B;let P;try{P=Z(B)}catch(f){throw xe(f)}let de=performance.now()-S;throw d({type:"step_error",workflowId:l,stepId:i,stepKey:n,name:r,ts:Date.now(),durationMs:de,error:P}),n&&d({type:"step_complete",workflowId:l,stepKey:n,name:r,ts:Date.now(),durationMs:de,result:K(P,{cause:B}),meta:{origin:"throw",thrown:B}}),o?.(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:n,name:r,ts:Date.now(),durationMs:B}),n&&d({type:"step_complete",workflowId:l,stepKey:n,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:n,name:r,ts:Date.now(),durationMs:B,error:P}),n&&d({type:"step_complete",workflowId:l,stepKey:n,name:r,ts:Date.now(),durationMs:B,result:F,meta:{origin:"result",resultCause:F.cause}}),o?.(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:n,name:r,ts:Date.now(),durationMs:j}),n&&d({type:"step_complete",workflowId:l,stepKey:n,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:n,name:r,ts:Date.now(),durationMs:j,error:$}),n&&d({type:"step_complete",workflowId:l,stepKey:n,name:r,ts:Date.now(),durationMs:j,result:_,meta:{origin:"result",resultCause:_.cause}}),o?.($,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:n,name:r,ts:Date.now(),durationMs:performance.now()-S}),j;let $;try{$=Z(j)}catch(B){throw xe(B)}let F=performance.now()-S;throw d({type:"step_error",workflowId:l,stepId:i,stepKey:n,name:r,ts:Date.now(),durationMs:F,error:$}),n&&d({type:"step_complete",workflowId:l,stepKey:n,name:r,ts:Date.now(),durationMs:F,result:K($,{cause:j}),meta:{origin:"throw",thrown:j}}),o?.($,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:n,name:r,ts:Date.now(),durationMs:j}),n&&d({type:"step_complete",workflowId:l,stepKey:n,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:n,name:r,ts:Date.now(),durationMs:V,error:Q}),n&&d({type:"step_complete",workflowId:l,stepKey:n,name:r,ts:Date.now(),durationMs:V,result:W,meta:{origin:"result",resultCause:W.cause}}),o?.(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,n=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:n,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:n,ts:Date.now(),durationMs:performance.now()-w}),F;let B;try{B=Z(F)}catch(de){throw xe(de)}let P=performance.now()-w;throw d({type:"step_error",workflowId:l,stepId:r,stepKey:a,name:n,ts:Date.now(),durationMs:P,error:B}),a&&d({type:"step_complete",workflowId:l,stepKey:a,name:n,ts:Date.now(),durationMs:P,result:K(B,{cause:F}),meta:{origin:"throw",thrown:F}}),o?.(B,n,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:n,ts:Date.now(),durationMs:F,error:B}),a&&d({type:"step_complete",workflowId:l,stepKey:a,name:n,ts:Date.now(),durationMs:F,result:S,meta:{origin:"result",resultCause:S.cause}}),o?.(B,n,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 xe(P)}let B=performance.now()-w;throw d({type:"step_error",workflowId:l,stepId:r,stepKey:a,name:n,ts:Date.now(),durationMs:B,error:F}),a&&d({type:"step_complete",workflowId:l,stepKey:a,name:n,ts:Date.now(),durationMs:B,result:K(F,{cause:W}),meta:{origin:"throw",thrown:W}}),o?.(F,n,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:n,ts:Date.now(),durationMs:F}),a&&d({type:"step_complete",workflowId:l,stepKey:a,name:n,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:n,ts:Date.now(),durationMs:j,error:$}),a&&d({type:"step_complete",workflowId:l,stepKey:a,name:n,ts:Date.now(),durationMs:j,result:Q,meta:{origin:"result",resultCause:Q.cause}}),o?.($,n,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
|
+
var We=class extends Error{_tag};function Ee(e,t){return class extends We{_tag=e;constructor(o,i){let T=t?.message?t.message(o??{}):e;if(super(T),this.name=e,Object.setPrototypeOf(this,new.target.prototype),o&&typeof o=="object"){let{_tag:k,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});(T=>{function e(k){return k instanceof Error}T.isError=e;function t(k){return k instanceof We}T.isTaggedError=t;function o(k,v){let A=k._tag,z=v[A];return z(k)}T.match=o;function i(k,v,A){let z=k._tag,l=v[z];return l?l(k):A(k)}T.matchPartial=i})(Ee||={});var ot=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`}){},st=class extends Ee("RetryExhaustedError",{message:t=>t.operation?`RetryExhaustedError: ${t.operation} failed after ${t.attempts} attempts`:`RetryExhaustedError: Operation failed after ${t.attempts} attempts`}){},at=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`:""}`}){},it=class extends Ee("CircuitBreakerOpenError",{message:t=>`CircuitBreakerOpenError: Circuit ${t.circuitName} is ${t.state??"OPEN"}${t.retryAfterMs?`, retry after ${Math.ceil(t.retryAfterMs/1e3)}s`:""}`}){},ut=class extends Ee("ValidationError",{message:t=>`ValidationError: Invalid ${t.field} - ${t.reason}`}){},lt=class extends Ee("NotFoundError",{message:t=>t.id?`NotFoundError: ${t.resource} with id ${t.id} not found`:`NotFoundError: ${t.resource} not found`}){},ct=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"}){},pt=class extends Ee("NetworkError",{message:t=>t.url?`NetworkError: ${t.reason} (${t.url})`:`NetworkError: ${t.reason}`}){},dt=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 vt(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 wt=e=>e instanceof Ne||typeof e=="object"&&e!==null&&"_tag"in e&&e._tag==="UnexpectedError";function At(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 _t(e,t){if(!(!t||!e))return t[e]}function Je(e){let{intent:t,domain:o,owner:i,tags:T,stateChanges:k,emits:v,calls:A}=e;if(!t&&!o&&!i&&!T?.length&&!k?.length&&!v?.length&&!A?.length)return;let z={};return t&&(z.intent=t),o&&(z.domain=o),i&&(z.owner=i),T?.length&&(z.tags=T),k?.length&&(z.stateChanges=k),v?.length&&(z.emits=v),A?.length&&(z.calls=A),z}function ke(e,t,o,i,T){let k=At(e),v=_t(k,t),A={tag:k,origin:o};return v!==void 0&&(A.classification=v),i!==void 0&&(A.attempt=i),T!==void 0&&(A.cumulativeDurationMs=T),A}var _e=Symbol.for("step_timeout_marker");function mt(e){return typeof e!="object"||e===null?!1:e.type==="STEP_TIMEOUT"?!0:_e in e}function Ot(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(_e in e)return e[_e]}}var yt=Symbol("early-exit");function Oe(e,t){return{[yt]:!0,error:e,meta:t}}function Ce(e){return typeof e=="object"&&e!==null&&e[yt]===!0}var kt=Symbol("mapper-exception");function ve(e){return{[kt]:!0,thrown:e}}function Pt(e){return typeof e=="object"&&e!==null&&e[kt]===!0}function He(e,t){let{backoff:o,initialDelay:i,maxDelay:T,jitter:k}=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,T),k){let A=v*.25*Math.random();v=v+A}return Math.floor(v)}function qe(e){return new Promise(t=>setTimeout(t,e))}var ft=Symbol("timeout"),Fe=Symbol("timeout-option");function Dt(e){return typeof e=="object"&&e!==null&&e[Fe]===!0}async function It(e,t,o,i){let T=new AbortController,k=t.onTimeout??"error",v=()=>typeof k=="function"?k({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&&T.abort(i.reason);let z;i&&!i.aborted&&(z=()=>T.abort(i.reason),i.addEventListener("abort",z,{once:!0}));let l=new Promise((D,b)=>{A=setTimeout(()=>{if(k!=="disconnect"&&T.abort(),k==="option"){b({[Fe]:!0,ms:t.ms});return}b({[ft]:!0,error:v()})},t.ms)}),q;t.signal?q=Promise.resolve(e(T.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[ft]===!0){k==="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};_e in b?b[_e]=ie:Object.defineProperty(b,_e,{value:ie,enumerable:!1,writable:!0,configurable:!1})}throw b}throw D}finally{clearTimeout(A),z&&i&&i.removeEventListener("abort",z)}}var Ae={backoff:"exponential",initialDelay:100,maxDelay:3e4,jitter:!0,retryOn:()=>!0,onRetry:()=>{}};async function Ve(e,t){let{onError:o,onEvent:i,catchUnexpected:T,workflowId:k,workflowName:v,context:A,_workflowSignal:z}=t&&typeof t=="object"?t:{},l=k??crypto.randomUUID(),q=T??Le,D=[],b=0,ie=E=>E??`step_${++b}`,m=E=>{let B=E.context!==void 0||A===void 0?E:{...E,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=Oe,U=E=>Ce(E),ce=(E,B)=>E,pe=E=>typeof E=="function"?!1:!!(E&&typeof E=="object"&&"ok"in E||E&&typeof E=="object"&&"then"in E&&typeof E.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 w=()=>{if(n)return;n=!0;let y=D.findIndex(c=>c.scopeId===s);y!==-1&&D.splice(y,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 y=await r();if(w(),!y.ok)throw o?.(y.error,p,A),H(y.error,{origin:"result",resultCause:y.cause});return y.value}catch(y){throw w(),y}})()},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 w=performance.now(),y=!1;D.push({scopeId:n,type:"parallel"});let c=()=>{if(y)return;y=!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()-w})};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 E=(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=Je(a),w=p,y=a.key??p,c=a.key??p,{description:x,retry:O,timeout:P}=a,j=ie(y),Y=i,I=Y?performance.now():0,F=pe(r)?()=>r:r,V={attempts:Math.max(1,O?.attempts??1),backoff:O?.backoff??Ae.backoff,initialDelay:O?.initialDelay??Ae.initialDelay,maxDelay:O?.maxDelay??Ae.maxDelay,jitter:O?.jitter??Ae.jitter,retryOn:O?.retryOn??Ae.retryOn,onRetry:O?.onRetry??Ae.onRetry};i&&m({type:"step_start",workflowId:l,stepId:j,stepKey:y,name:w,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 It(F,P,{name:w,key:y,attempt:u},z):R=await F(),R.ok){let d=performance.now()-I;return m({type:"step_success",workflowId:l,stepId:j,stepKey:y,name:w,description:x,ts:Date.now(),durationMs:d,...n&&{metadata:n}}),c&&m({type:"step_complete",workflowId:l,stepKey:c,name:w,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=He(u,V);m({type:"step_retry",workflowId:l,stepId:j,stepKey:y,name:w,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 qe(d);continue}V.attempts>1&&m({type:"step_retries_exhausted",workflowId:l,stepId:j,stepKey:y,name:w,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(Dt(R)){let S=R.ms;m({type:"step_timeout",workflowId:l,stepId:j,stepKey:y,name:w,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:y,name:w,description:x,ts:Date.now(),durationMs:performance.now()-I,...n&&{metadata:n}}),c&&m({type:"step_complete",workflowId:l,stepKey:c,name:w,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:y,name:w,description:x,ts:Date.now(),durationMs:d,...n&&{metadata:n}}),R;if(mt(R)){let S=Ot(R),_=P?.ms??S?.timeoutMs??0;if(m({type:"step_timeout",workflowId:l,stepId:j,stepKey:y,name:w,ts:Date.now(),timeoutMs:_,attempt:u,...n&&{metadata:n},diagnostics:ke(R,a.errorMeta,"timeout",u)}),u<V.attempts&&V.retryOn(R,u)){let g=He(u,V);m({type:"step_retry",workflowId:l,stepId:j,stepKey:y,name:w,ts:Date.now(),attempt:u+1,maxAttempts:V.attempts,delayMs:g,error:R,...n&&{metadata:n},diagnostics:ke(R,a.errorMeta,"timeout",u,performance.now()-I)}),V.onRetry(R,u,g),await qe(g);continue}V.attempts>1&&m({type:"step_retries_exhausted",workflowId:l,stepId:j,stepKey:y,name:w,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:y,name:w,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:w,description:x,ts:Date.now(),durationMs:K,result:M(R,{cause:R}),meta:{origin:"throw",thrown:R},...n&&{metadata:n}}),o?.(R,w,A),H(R,{origin:"throw",thrown:R})}if(u<V.attempts&&V.retryOn(R,u)){let S=He(u,V);m({type:"step_retry",workflowId:l,stepId:j,stepKey:y,name:w,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 qe(S);continue}V.attempts>1&&!mt(R)&&m({type:"step_retries_exhausted",workflowId:l,stepId:j,stepKey:y,name:w,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 ve(S)}throw m({type:"step_error",workflowId:l,stepId:j,stepKey:y,name:w,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:w,description:x,ts:Date.now(),durationMs:h,result:M(C,{cause:R}),meta:{origin:"throw",thrown:R},...n&&{metadata:n}}),o?.(C,w,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:y,name:w,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:w,description:x,ts:Date.now(),durationMs:Se,result:oe,meta:{origin:"result",resultCause:oe.cause},...n&&{metadata:n}}),o?.(f,w,A),H(f,{origin:"result",resultCause:oe.cause})})();E.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,w=p,y="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:w,stepKey:a,name:n,ts:Date.now()});try{let O=await r(),P=performance.now()-x;return m({type:"step_success",workflowId:l,stepId:w,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=y(O),j=performance.now()-x,Y=ce(P,{origin:"throw",thrown:O});throw m({type:"step_error",workflowId:l,stepId:w,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})}})()},E.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,w=p,y="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:w,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:w,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=y(O.error),j=performance.now()-x,Y=ce(P,{origin:"result",resultCause:O.error});throw m({type:"step_error",workflowId:l,stepId:w,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})}})()},E.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 E(p,async()=>{let n=await r();return n!=null?X(n):M(s())},a)},E.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 E(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})},E.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 E(p,r,{key:s.key??p,timeout:s})},E.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"?vt(r):r;if(!a)throw new Error(`step.sleep: invalid duration '${r}'`);let n=a.millis,w=s?.signal;return E(p,async()=>{if(z?.aborted||w?.aborted){let y=new Error("Sleep aborted");throw y.name="AbortError",y}return new Promise((y,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}),w?.addEventListener("abort",O,{once:!0}),x.timeoutId=setTimeout(()=>{z?.removeEventListener("abort",O),w?.removeEventListener("abort",O),y(X(void 0))},n)})},{key:s?.key??p,description:s?.description})},E.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).")}),E.race=(p,r)=>{let s=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let a=performance.now(),n=!1,w={scopeId:s,type:"race",winnerId:void 0};D.push(w);let y=()=>{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:w.winnerId})};m({type:"scope_start",workflowId:l,scopeId:s,scopeType:"race",name:p,ts:Date.now()});try{let c=await r();if(y(),!c.ok)throw o?.(c.error,p,A),H(c.error,{origin:"result",resultCause:c.cause});return c.value}catch(c){throw y(),c}})()},E.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 w=()=>{if(n)return;n=!0;let y=D.findIndex(c=>c.scopeId===s);y!==-1&&D.splice(y,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 y=await r();if(w(),!y.ok)throw o?.(y.error,p,A),H(y.error,{origin:"result",resultCause:y.cause});return y.value}catch(y){throw w(),y}})()},E.if=(p,r,s)=>s(),E.label=E.if,E.branch=async(p,r)=>{let{condition:s,then:a,else:n}=r;if(s())return await a();if(n)return await n()},E.arm=(p,r)=>({fn:p,errors:r}),E.forEach=async(p,r,s)=>{let a=[],n=s.maxIterations,w=0,y="run"in s,c=Symbol.asyncIterator in r?r:(async function*(){yield*r})();for await(let x of c){if(n!==void 0&&w>=n)break;let O;y?O=await s.run(x,w):O=await s.item.handler(x,w,E),a.push(O),w++}return a},E.item=p=>({__forEachItemHandler:!0,handler:p}),E.dep=(p,r)=>r,E.run=(p,r,s)=>E(p,()=>r,s),E.workflow=(p,r,s)=>E(p,r,s),E.andThen=(p,r,s,a)=>E(p,()=>s(r),a),E.match=async(p,r,s,a)=>E(p,async()=>{let n=await r;return n.ok?X(await s.ok(n.value)):X(await s.err(n.error,n.cause))},a),E.all=E.parallel,E.map=async(p,r,s,a)=>{let n=a?.concurrency??r.length;return E(p,()=>n>=r.length?Et(r.map((w,y)=>s(w,y))):(async()=>{let w=[];for(let y=0;y<r.length;y+=n){let c=r.slice(y,y+n),x=await Et(c.map((O,P)=>s(O,y+P)));if(!x.ok)return x;w.push(...x.value)}return X(w)})(),{key:a?.key})},E.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,w=ie(a),y=i;return(async()=>{let c=y?performance.now():0;i&&m({type:"step_start",workflowId:l,stepId:w,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:w,stepKey:a,name:n,ts:Date.now(),durationMs:performance.now()-c}),I;let ee;try{ee=q(I)}catch(N){throw ve(N)}if(s.on!==void 0&&s.on!==ee){let N=performance.now()-c;throw m({type:"step_error",workflowId:l,stepId:w,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:w,stepKey:a,name:n,ts:Date.now(),durationMs:performance.now()-c}),N;let V;try{V=q(N)}catch(oe){throw ve(oe)}let Te=performance.now()-c;throw m({type:"step_error",workflowId:l,stepId:w,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:w,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:w,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:w,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:w,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:w,stepKey:a,name:n,ts:Date.now(),durationMs:performance.now()-c}),I;let ee;try{ee=q(I)}catch(N){throw ve(N)}let F=performance.now()-c;throw m({type:"step_error",workflowId:l,stepId:w,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:w,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:w,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})})()},E.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),w=i;return(async()=>{let y=w?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()-y}),F;let N;try{N=q(F)}catch(Te){throw ve(Te)}let V=performance.now()-y;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()-y,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 ve(V)}let N=performance.now()-y;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()-y;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()-y,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:E});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
|
|
6
|
+
See: https://jagreehal.github.io/awaitly/guides/troubleshooting/#returning-ok-from-workflow-executor-double-wrapping`)}return X(me)}catch(E){if(Pt(E))throw E.thrown;if(U(E)){let J=E.meta.origin==="throw"?E.meta.thrown:E.meta.origin==="result"?E.meta.resultCause:void 0;return M(E.error,{cause:J})}let B=q(E);return o?.(B,"unexpected",A),M(B,{cause:E})}}Ve.strict=(e,t)=>Ve(e,t);async function Et(e){return e.length===0?X([]):new Promise(t=>{let o=!1,i=e.length,T=new Array(e.length);for(let k=0;k<e.length;k++){let v=k;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}T[v]=A.value,i--,i===0&&t(X(T))}})}})}function ze(e){return e.type==="step_complete"}function Pe(e){return typeof e=="object"&&e!==null&&e.type==="WORKFLOW_CANCELLED"}var be=class extends Error{constructor(o,i=[]){super(o);this.errors=i;this.name="SnapshotFormatError"}};var De=class extends Error{constructor(o,i,T){super(o);this.stepId=i;this.originalError=T;this.name="SnapshotDecodeError"}};function Mt(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[T,k]of Object.entries(i)){if(typeof k!="object"||k===null){t.push(`steps["${T}"] must be an object`);continue}let v=k;"ok"in v?typeof v.ok!="boolean"?t.push(`steps["${T}"].ok must be a boolean`):v.ok===!1&&("error"in v||t.push(`steps["${T}"] is error result but missing error field`),"cause"in v||t.push(`steps["${T}"] is error result but missing cause field`)):t.push(`steps["${T}"] 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 Tt(e){let t=Mt(e);if(!t.valid)throw new be(`Invalid snapshot format: ${t.errors[0]}`,t.errors);return t.snapshot}function Rt(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,k=[...(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:k.length>0?k:void 0}}var gt=1e3;function Ye(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=Ye(o.cause):t.cause=Xe(o.cause)),t}function Xe(e){let t,o=!1;try{t=String(e),t.length>gt&&(t=t.slice(0,gt),o=!0)}catch{t="[unable to convert to string]"}let i=e===null?"null":typeof e=="object"?e.constructor?.name??"Object":typeof e,T;try{let v=JSON.stringify(e);v!==void 0&&(T=JSON.parse(v))}catch{}let k={type:"thrown",originalType:i,stringRepresentation:t};return T!==void 0&&(k.value=T),o&&(k.truncated=!0),k}function Ge(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=Ge(e.cause)),t}return e.value!==void 0?e.value:e.stringRepresentation}function Ut(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 Ut(e)?e.meta:{origin:"result",resultCause:e}}function Ke(){let e=new Map;return{handleEvent:t=>{ze(t)&&e.set(t.stepKey,{result:t.result,meta:t.meta})},getResumeState:()=>({steps:new Map(e)}),clear:()=>e.clear()}}var jt="STREAM_WRITE_ERROR",Kt="STREAM_READ_ERROR",Ft="STREAM_CLOSE_ERROR";var Vt="STREAM_ENDED";function $e(e,t,o){return{type:jt,reason:e,message:t,...o!==void 0?{cause:o}:{}}}function Ze(e,t,o){return{type:Kt,reason:e,message:t,...o!==void 0?{cause:o}:{}}}function Qe(e,t,o){return{type:Ft,reason:e,message:t,...o!==void 0?{cause:o}:{}}}function Be(e){return{type:Vt,finalPosition:e}}function St(e={}){let t=e.highWaterMark??16,o=e.lowWaterMark??Math.floor(t/2),i=e.onStateChange,T="flowing",k=0,v=[];function A(l){if(T!==l&&(T=l,i?.(l),l==="flowing"&&v.length>0)){let q=v;v=[];for(let D of q)D()}}function z(){T==="flowing"&&k>=t?A("paused"):T==="paused"&&k<=o&&A("flowing")}return{get state(){return T},get bufferedCount(){return k},get highWaterMark(){return t},get lowWaterMark(){return o},increment(){k++,z()},decrement(){k>0&&(k--,z())},setCount(l){k=Math.max(0,l),z()},waitForDrain(){return T==="flowing"?Promise.resolve():new Promise(l=>{v.push(l)})},reset(){k=0,v=[],A("flowing")}}}function Lt(e){return{_tag:"Duration",millis:e}}function $t(e){return{_tag:"Duration",millis:e*1e3}}function Bt(e){return{_tag:"Duration",millis:e*60*1e3}}function Ht(e){return{_tag:"Duration",millis:e*60*60*1e3}}function qt(e){return{_tag:"Duration",millis:e*24*60*60*1e3}}function xt(e){return e.millis}function ht(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 Lt(o);case"s":return $t(o);case"m":return Bt(o);case"h":return Ht(o);case"d":return qt(o);default:return}}async function Ct(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(T=>({message:T.message,path:T.path?.map(k=>typeof k=="object"?k.key:k)})),message:`Input validation failed: ${i.issues.map(T=>T.message).join(", ")}`}):X(i.value)}function et(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??{},T=o;async function k(l,q,D){let b=l??crypto.randomUUID(),ie=D?.deps?{...i,...D.deps}:i,m=D?.createContext??T?.createContext,H=m?await m():void 0,U=D?.signal??T?.signal,ce=D?.onEvent??T?.onEvent,pe=D?.onError??T?.onError,we=D?.shouldRun??T?.shouldRun,ge=D?.onBeforeStart??T?.onBeforeStart,de=D?.onAfterStep??T?.onAfterStep,E=D?.resumeState??T?.resumeState,B=T?.catchUnexpected??Le,J={},fe=(D?.devWarnings??T?.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=T?.inputSchema,n=T?.input;if(a&&n!==void 0){let f=await Ct(a,n);if(!f.ok)return M(f.error);p.input=f.value}else n!==void 0&&(p.input=n);let w=Date.now(),y=performance.now();r({type:"workflow_start",workflowId:b,ts:w});let c=D?.cache??T?.cache,x=D?.streamStore??T?.streamStore;if(E&&!c&&(c=new Map),E&&c){let f=typeof E=="function"?await E():E;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??R?.snapshot,_=R?.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=He(v.cause),g=v.meta?.origin==="throw"?{origin:"throw",thrown:u}:{origin:"result",resultCause:u};i.set(J,Te(y,g,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,g)=>{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=g??{},M=h,k=Object.prototype.hasOwnProperty.call(x,"key")?x.key:h,{ttl:N,out:X}=x;j();let Y=Le(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 ve(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,g)=>{let{ttl:h}=g,x=g.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 ve(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,{...g,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,g)=>{let{ttl:h}=g,x=g.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 ve(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,{...g,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,g)=>{let h=g.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 ve(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,g);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 g=y;try{let h=await f.withResource(y,u);return await $(g,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 $(g,k,x.meta)}throw h}},E.retry=(y,u,g)=>{let h={key:g.key,retry:{attempts:g.attempts,backoff:g.backoff,initialDelay:g.initialDelay,maxDelay:g.maxDelay,jitter:g.jitter,retryOn:g.retryOn,onRetry:g.onRetry},timeout:g.timeout,ttl:g.ttl};return E(y,u,h)},E.withTimeout=(y,u,g)=>{let h={key:g.key,timeout:g,ttl:g.ttl};return E(y,u,h)},E.sleep=(y,u,g)=>{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"?pt(u):u;if(!h)throw new Error(`step.sleep: invalid duration '${u}'`);let x=ct(h),M=g?.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:g?.key,ttl:g?.ttl,description:g?.description})};let J=new Map,v=new Map;return E.getWritable=y=>{let u=y?.namespace??"default",g=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=lt({highWaterMark:g,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(Xe("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(Xe("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",g=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}:${g}`,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=g,Y=!0,U=!1,L=[],se=0,z={async read(){if(U)return K(Je("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(Je("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),Ze=Re.ok&&Re.value!==void 0;if(_e&&(ue=!0),Ze&&(ae=!0),Re.ok&&Re.value?.closed)return Y=!1,K(Fe(X));if(ue&&!_e&&!Ze)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,g)=>{let h=g?.checkpointInterval??1,x=g?.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,g)=>E(y,typeof u=="function"?u:()=>u,g),E.workflow=(y,u,g)=>E(y,u,g),E.andThen=(y,u,g,h)=>E(y,()=>g(u),h),E.match=(y,u,g,h)=>E(y,async()=>{let x=await u;return x.ok?G(await g.ok(x.value)):G(await g.err(x.error,x.cause))},h),E.all=(y,u,g)=>{let h=g!==void 0&&Object.prototype.hasOwnProperty.call(g,"key")?g:{...g,key:void 0};return E(y,async()=>G(await f.all(y,u)),h)},E.map=(y,u,g,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,g,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(Ae(P.cause)&&(f=P.cause),!f&&O&&nt(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&&!Ae(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=R?.catchUnexpected??Ne;ye=K(s(pe),{cause:pe})}finally{ke=q.getResumeState()}return{result:ye,resumeState:ke}}return{run:A,runWithState:D}}var Ye;function Mt(){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??"",p=t?.limit??100,R=[];for(let[C,A]of e.entries())if(!(o&&!C.startsWith(o))&&(R.push({id:C,updatedAt:A.updatedAt.toISOString()}),R.length>=p))break;return R.sort((C,A)=>A.updatedAt.localeCompare(C.updatedAt)),R},async close(){}}}function It(){return Ye===void 0&&(Ye=Mt()),Ye}function Ut(e){return typeof e=="object"&&e!==null&&e.type==="VERSION_MISMATCH"}function Wt(e){return typeof e=="object"&&e!==null&&e.type==="CONCURRENT_EXECUTION"}function Nt(e){return typeof e=="object"&&e!==null&&e.type==="PERSISTENCE_ERROR"}function mt(e){return typeof e.tryAcquire=="function"&&typeof e.release=="function"}var Ge=new Set,jt={async run(e,t,o){let{id:p,store:R,version:C=1,allowConcurrent:A=!1,lockTtlMs:D=6e4,metadata:ee,signal:l,createContext:Z,onEvent:I,onError:T,onVersionMismatch:ie}=o,d=R??It();if(!A&&Ge.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&&mt(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}Ge.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{it(b)}catch(s){if(s instanceof he){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,n]of fe.steps)if(n.result.ok)ce[a]={ok:!0,value:n.result.value};else{let r=n.result.cause,i=r instanceof Error?$e(r):qe(r),w=n.meta?.origin==="throw"?"throw":"result";ce[a]={ok:!1,error:n.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?ut(b,m):m;if(c.warnings&&c.warnings.length>0){let a=new Set(Object.keys(m.steps)),n=c.warnings.filter(r=>!a.has(r.stepId));c={...c,warnings:n.length>0?n: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=ze(p,e,ye)}catch(s){if(s instanceof he){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 he||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(Ge.delete(p),q!==null&&mt(d))try{await d.release(p,q)}catch{}}},async clearState(e){let t=e;if(typeof t.clear=="function"){await t.clear();return}let o=100;for(;;){let p=await e.list({limit:o});if(p.length===0)break;let R=p.map(C=>C.id);if(await this.deleteStates(e,R,{continueOnError:!0}),p.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:p=10,continueOnError:R=!0}=o;if(t.length===0)return{deleted:0};let C=[],A=0,D=async l=>{try{await e.delete(l),A++}catch(Z){if(R)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[]}}};export{jt as durable,Wt as isConcurrentExecution,Nt as isPersistenceError,Ut as isVersionMismatch,Ae as 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??T?.snapshot,P=T?.serialization;if(O&&!E){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=Ge(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,g=Object.prototype.hasOwnProperty.call(_,"key")?_.key:S,{ttl:L,out:te}=_;F();let Q=Je(_);if(g&&c&&c.has(g)){r({type:"step_cache_hit",workflowId:b,stepKey:g,name:K,ts:Date.now(),...Q&&{metadata:Q}});let W=c.get(g);if(W.ok)return I=g,te&&(J[te]=W.value),W.value;let $=je(W.cause);throw Oe(W.error,$)}g&&c&&r({type:"step_cache_miss",workflowId:b,stepKey:g,name:K,ts:Date.now(),...Q&&{metadata:Q}});try{let W=await f(S,h,_);return te&&(J[te]=W),g&&(I=g,c&&c.set(g,X(W),L?{ttl:L}:void 0),await N(g,X(W))),W}catch(W){if(g&&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(g,Z,L?{ttl:L}:void 0),await N(g,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 g=c.get(_);if(g.ok)return g.value;let L=je(g.cause);throw Oe(g.error,L)}c&&r({type:"step_cache_miss",workflowId:b,stepKey:_,name:K,ts:Date.now()});try{let g=await f.try(d,h,{...C,key:_});return c&&c.set(_,X(g),S?{ttl:S}:void 0),await N(_,X(g)),g}catch(g){if(Ce(g)){let L=g,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 g}},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 g=c.get(_);if(g.ok)return g.value;let L=je(g.cause);throw Oe(g.error,L)}c&&r({type:"step_cache_miss",workflowId:b,stepKey:_,name:K,ts:Date.now()});try{let g=await f.fromResult(d,h,{...C,key:_});return c&&c.set(_,X(g),S?{ttl:S}:void 0),await N(_,X(g)),g}catch(g){if(Ce(g)){let L=g,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 g}},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 g=je(K.cause);throw Oe(K.error,g)}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 g=K,L=g.meta.origin==="result"?g.meta.resultCause:g.meta.origin==="throw"?g.meta.thrown:void 0,te=he(g.error,g.meta,L);c&&c.set(S,te),await N(S,te,g.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,g=he(_.error,_.meta,K);await N(C,g,_.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"?ht(h):h;if(!S)throw new Error(`step.sleep: invalid duration '${h}'`);let _=xt(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=St({highWaterMark:C,onStateChange:$=>{r({type:"stream_backpressure",workflowId:b,namespace:h,bufferedCount:K.bufferedCount,state:$,ts:Date.now()})}}),g=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:g,ts:Date.now()},Z=await x.append(b,h,se);return Z.ok?(r({type:"stream_write",workflowId:b,namespace:h,position:g,ts:Date.now()}),g++,K.increment(),X(void 0)):(r({type:"stream_error",workflowId:b,namespace:h,error:Z.error,position:g,ts:Date.now()}),M($e("store_error",Z.error.message,Z.error)))},async close(){if(Q)return M(Qe("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:g,ts:Date.now()}),G.delete(S),X(void 0)):M(Qe("store_error",$.error.message,$.error))},abort($){te=!0,L=!1,Q=!0,r({type:"stream_error",workflowId:b,namespace:h,error:$,position:g,ts:Date.now()}),G.delete(S)},get writable(){return L},get position(){return g},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}`,g=R.get(K);if(g&&!g.closed)return g.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(Ze("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(Ze("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),nt=xe.ok&&xe.value!==void 0;if(Me&&(ue=!0),nt&&(ae=!0),xe.ok&&xe.value?.closed)return Q=!1,M(Be(te));if(ue&&!Me&&!nt)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=[],g=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,g,W,d.namespace);K.push(Z),L=W,g++,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,g++)}}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,g++,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,g++)}return{results:K,processedCount:g,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()-y;if(!oe.ok){let f;if(Pe(oe.cause)&&(f=oe.cause),!f&&j&&wt(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&&!Pe(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),k(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,E)=>{H.handleEvent(de);try{U?.(de,E)}catch{}}},we,ge;try{we=await k(b,ie,pe)}catch(de){let E=T?.catchUnexpected??Le;we=M(E(de),{cause:de})}finally{ge=H.getResumeState()}return{result:we,resumeState:ge}}return{run:v,runWithState:A}}var tt;function Jt(){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,T=[];for(let[k,v]of e.entries())if(!(o&&!k.startsWith(o))&&(T.push({id:k,updatedAt:v.updatedAt.toISOString()}),T.length>=i))break;return T.sort((k,v)=>v.updatedAt.localeCompare(k.updatedAt)),T},async close(){}}}function zt(){return tt===void 0&&(tt=Jt()),tt}function Yt(e){return typeof e=="object"&&e!==null&&e.type==="VERSION_MISMATCH"}function Xt(e){return typeof e=="object"&&e!==null&&e.type==="CONCURRENT_EXECUTION"}function Gt(e){return typeof e=="object"&&e!==null&&e.type==="PERSISTENCE_ERROR"}function Zt(e){return typeof e=="object"&&e!==null&&e.type==="LEASE_EXPIRED"}function Qt(e){return typeof e=="object"&&e!==null&&e.type==="IDEMPOTENCY_CONFLICT"}function bt(e){return typeof e.tryAcquire=="function"&&typeof e.release=="function"}var rt=new Set,er={async run(e,t,o){let{id:i,store:T,version:k=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=T??zt();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&&rt.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&&bt(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,E=pe;if(we&&typeof E.renew=="function"){let B=z??Math.floor(A/3);de=new AbortController,ge=setInterval(async()=>{try{await E.renew(i,we,{ttlMs:A})||de.abort(new Error("Lease expired"))}catch{de.abort(new Error("Lease renewal failed"))}},B)}rt.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{Tt(B)}catch(r){if(r instanceof be){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!==k){let s={type:"VERSION_MISMATCH",workflowId:i,storedVersion:r,requestedVersion:k,currentVersion:k,message:`Workflow '${i}' has stored state at version ${r} but this run requested version ${k}. 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:k}));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 w=fe.getResumeState(),y={};for(let[O,P]of w.steps)if(P.result.ok)y[O]={ok:!0,value:P.result.value};else{let j=P.result.cause,Y=j instanceof Error?Ye(j):Xe(j),I=P.meta?.origin==="throw"?"throw":"result";y[O]={ok:!1,error:P.result.error,cause:Y,meta:{origin:I}}}let c={formatVersion:1,workflowName:i,steps:y,execution:{status:"running",lastUpdated:new Date().toISOString(),currentStepId:r},metadata:{...B?.metadata??{},...q,version:k,lastStepKey:r}},x=B?Rt(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(w){J({type:"persist_error",workflowId:a,stepKey:r,error:w,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=et(i,e,ye)}catch(r){if(r instanceof be){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 be||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(rt.delete(i),ge&&clearInterval(ge),we!==null&&bt(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 T=i.map(k=>k.id);if(await this.deleteStates(e,T,{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:T=!0}=o;if(t.length===0)return{deleted:0};let k=[],v=0,A=async l=>{try{await e.delete(l),v++}catch(q){if(T)k.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 k.length>0?{deleted:v,errors:k}:{deleted:v}},async listPending(e,t){try{return await e.list(t)}catch{return[]}}};export{er as durable,Xt as isConcurrentExecution,Qt as isIdempotencyConflict,Zt as isLeaseExpired,Gt as isPersistenceError,Yt as isVersionMismatch,Pe as isWorkflowCancelled};
|
|
11
11
|
//# sourceMappingURL=durable.js.map
|