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