awaitly 1.17.0 → 1.18.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.
@@ -1,7 +1,7 @@
1
- "use strict";var pe=Object.defineProperty;var qe=Object.getOwnPropertyDescriptor;var Qe=Object.getOwnPropertyNames;var He=Object.prototype.hasOwnProperty;var ze=(e,t)=>{for(var r in t)pe(e,r,{get:t[r],enumerable:!0})},$e=(e,t,r,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let T of Qe(t))!He.call(e,T)&&T!==r&&pe(e,T,{get:()=>t[T],enumerable:!(a=qe(t,T))||a.enumerable});return e};var Ye=e=>$e(pe({},"__esModule",{value:!0}),e);var st={};ze(st,{CircuitOpenError:()=>ne,circuitBreakerPresets:()=>Pe,conditionalPolicy:()=>je,createCircuitBreaker:()=>be,createCombinedLimiter:()=>Ae,createConcurrencyLimiter:()=>Te,createCostBasedRateLimiter:()=>_e,createFixedWindowLimiter:()=>Oe,createPolicyApplier:()=>Le,createPolicyBundle:()=>Ue,createPolicyRegistry:()=>Ke,createRateLimiter:()=>de,createSagaWorkflow:()=>De,envPolicy:()=>Be,isCircuitOpenError:()=>Se,isQueueFullError:()=>ye,isRateLimitExceededError:()=>he,isSagaCompensationError:()=>Ie,mergePolicies:()=>j,rateLimiterPresets:()=>ve,retryPolicies:()=>Y,retryPolicy:()=>W,runSaga:()=>Me,servicePolicies:()=>Ne,stepOptions:()=>We,timeoutPolicies:()=>$,timeoutPolicy:()=>K,withPolicies:()=>Fe,withPolicy:()=>fe});module.exports=Ye(st);function Ge(e){let t=e.trim().match(/^(\d+(?:\.\d+)?)\s*(ms|s|m|h|d)$/i);if(!t)return;let r=parseFloat(t[1]),a=t[2].toLowerCase();return{_tag:"Duration",millis:r*({ms:1,s:1e3,m:6e4,h:36e5,d:864e5}[a]??1)}}var Q=e=>({ok:!0,value:e}),_=(e,t)=>({ok:!1,error:e,...t?.cause!==void 0?{cause:t.cause}:{}});var Je=e=>typeof e=="object"&&e!==null&&e.type==="UNEXPECTED_ERROR";var Z=Symbol.for("step_timeout_marker");function le(e){return typeof e!="object"||e===null?!1:e.type==="STEP_TIMEOUT"?!0:Z in e}function Ze(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(Z in e)return e[Z]}}var ge=Symbol("early-exit");function ee(e,t){return{[ge]:!0,error:e,meta:t}}function te(e){return typeof e=="object"&&e!==null&&e[ge]===!0}var xe=Symbol("mapper-exception");function et(e){return{[xe]:!0,thrown:e}}function tt(e){return typeof e=="object"&&e!==null&&e[xe]===!0}function me(e,t){let{backoff:r,initialDelay:a,maxDelay:T,jitter:l}=t,m;switch(r){case"fixed":m=a;break;case"linear":m=a*e;break;case"exponential":m=a*Math.pow(2,e-1);break}if(m=Math.min(m,T),l){let h=m*.25*Math.random();m=m+h}return Math.floor(m)}function Ee(e){return new Promise(t=>setTimeout(t,e))}var ke=Symbol("timeout"),ie=Symbol("timeout-option");function nt(e){return typeof e=="object"&&e!==null&&e[ie]===!0}async function rt(e,t,r,a){let T=new AbortController,l=t.onTimeout??"error",m=()=>typeof l=="function"?l({name:r.name,key:r.key,ms:t.ms}):t.error??{type:"STEP_TIMEOUT",stepName:r.name,stepKey:r.key,timeoutMs:t.ms,attempt:r.attempt},h;a?.aborted&&T.abort(a.reason);let o;a&&!a.aborted&&(o=()=>T.abort(a.reason),a.addEventListener("abort",o,{once:!0}));let d=new Promise((p,s)=>{h=setTimeout(()=>{if(l!=="disconnect"&&T.abort(),l==="option"){s({[ie]:!0,ms:t.ms});return}s({[ke]:!0,error:m()})},t.ms)}),i;t.signal?i=Promise.resolve(e(T.signal)):i=Promise.resolve(e());try{return await Promise.race([i,d])}catch(p){if(typeof p=="object"&&p!==null&&p[ie]===!0)throw{[ie]:!0,ms:t.ms};if(typeof p=="object"&&p!==null&&p[ke]===!0){l==="disconnect"&&i.catch(()=>{});let s=p.error;if(typeof s=="object"&&s!==null&&s.type!=="STEP_TIMEOUT"){let n={timeoutMs:t.ms,stepName:r.name,stepKey:r.key,attempt:r.attempt};Z in s?s[Z]=n:Object.defineProperty(s,Z,{value:n,enumerable:!1,writable:!0,configurable:!1})}throw s}throw p}finally{clearTimeout(h),o&&a&&a.removeEventListener("abort",o)}}var J={backoff:"exponential",initialDelay:100,maxDelay:3e4,jitter:!0,retryOn:()=>!0,onRetry:()=>{}};async function Ce(e,t){let{onError:r,onEvent:a,catchUnexpected:T,workflowId:l,context:m,_workflowSignal:h}=t&&typeof t=="object"?t:{},o=l??crypto.randomUUID(),d=!r&&!T,i=[],p=0,s=c=>c??`step_${++p}`,n=c=>{let F=c.context!==void 0||m===void 0?c:{...c,context:m};if(F.type==="step_success"){let B=F.stepId;for(let V=i.length-1;V>=0;V--){let re=i[V];if(re.type==="race"&&!re.winnerId){re.winnerId=B;break}}}a?.(F,m)},f=ee,w=c=>te(c),A=(c,F)=>d?F?.origin==="result"?{type:"UNEXPECTED_ERROR",cause:{type:"STEP_FAILURE",origin:"result",error:c,...F.resultCause!==void 0?{cause:F.resultCause}:{}}}:F?.origin==="throw"?{type:"UNEXPECTED_ERROR",cause:{type:"STEP_FAILURE",origin:"throw",error:c,thrown:F.thrown}}:{type:"UNEXPECTED_ERROR",cause:{type:"STEP_FAILURE",origin:"result",error:c}}:c,D=c=>({type:"UNEXPECTED_ERROR",cause:c.meta.origin==="result"?{type:"STEP_FAILURE",origin:"result",error:c.error,...c.meta.resultCause!==void 0?{cause:c.meta.resultCause}:{}}:{type:"STEP_FAILURE",origin:"throw",error:c.error,thrown:c.meta.thrown}}),N=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 F=function(y){let x={};for(let[u,g]of Object.entries(y))if(typeof g=="function")x[u]=g;else if(g&&typeof g=="object"&&"fn"in g)x[u]=g.fn;else throw new TypeError(`step.parallel: operation "${u}" must be a function or { fn, errors? } object`);return x},B=function(y,x){let u=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let g=performance.now(),E=!1;i.push({scopeId:u,type:"parallel"});let k=()=>{if(E)return;E=!0;let R=i.findIndex(b=>b.scopeId===u);R!==-1&&i.splice(R,1),n({type:"scope_end",workflowId:o,scopeId:u,ts:Date.now(),durationMs:performance.now()-g})};n({type:"scope_start",workflowId:o,scopeId:u,scopeType:"parallel",name:y,ts:Date.now()});try{let R=await x();if(k(),!R.ok)throw r?.(R.error,y,m),f(R.error,{origin:"result",resultCause:R.cause});return R.value}catch(R){throw k(),R}})()},V=function(y,x){let u=Object.keys(y),g=x.name??`Parallel(${u.join(", ")})`,E=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let k=performance.now(),R=!1;i.push({scopeId:E,type:"parallel"});let b=()=>{if(R)return;R=!0;let O=i.findIndex(P=>P.scopeId===E);O!==-1&&i.splice(O,1),n({type:"scope_end",workflowId:o,scopeId:E,ts:Date.now(),durationMs:performance.now()-k})};n({type:"scope_start",workflowId:o,scopeId:E,scopeType:"parallel",name:g,ts:Date.now()});try{let O=await new Promise(C=>{if(u.length===0){C([]);return}let M=!1,L=u.length,ae=new Array(u.length);for(let H=0;H<u.length;H++){let oe=u[H],I=H;Promise.resolve(y[oe]()).catch(X=>_({type:"PROMISE_REJECTED",cause:X},{cause:{type:"PROMISE_REJECTION",reason:X}})).then(X=>{if(!M){if(!X.ok){M=!0,C([{key:oe,result:X}]);return}ae[I]={key:oe,result:X},L--,L===0&&C(ae)}})}});b();let P={};for(let{key:C,result:M}of O){if(!M.ok)throw r?.(M.error,C,m),f(M.error,{origin:"result",resultCause:M.cause});P[C]=M.value}return P}catch(O){throw b(),O}})()};var it=F,at=B,ut=V;let c=(y,x,u)=>(async()=>{if(typeof y!="string"||y.length===0)throw new Error('[awaitly] step() requires an explicit string ID as the first argument. Example: step("fetchUser", () => fetchUser(id))');let g=u??{},E=y,k=g.key??y,R=g.key??y,{description:b,retry:O,timeout:P}=g,C=s(k),M=a,L=M?performance.now():0,H=N(x)?()=>x:x,I={attempts:Math.max(1,O?.attempts??1),backoff:O?.backoff??J.backoff,initialDelay:O?.initialDelay??J.initialDelay,maxDelay:O?.maxDelay??J.maxDelay,jitter:O?.jitter??J.jitter,retryOn:O?.retryOn??J.retryOn,onRetry:O?.onRetry??J.onRetry};a&&n({type:"step_start",workflowId:o,stepId:C,stepKey:k,name:E,description:b,ts:Date.now()});let X;for(let v=1;v<=I.attempts;v++){let Ve=M?performance.now():0;try{let S;if(P?S=await rt(H,P,{name:E,key:k,attempt:v},h):S=await H(),S.ok){let q=performance.now()-L;return n({type:"step_success",workflowId:o,stepId:C,stepKey:k,name:E,description:b,ts:Date.now(),durationMs:q}),R&&n({type:"step_complete",workflowId:o,stepKey:R,name:E,description:b,ts:Date.now(),durationMs:q,result:S}),S.value}if(X=S,v<I.attempts&&I.retryOn(S.error,v)){let q=me(v,I);n({type:"step_retry",workflowId:o,stepId:C,stepKey:k,name:E,ts:Date.now(),attempt:v+1,maxAttempts:I.attempts,delayMs:q,error:S.error}),I.onRetry(S.error,v,q),await Ee(q);continue}I.attempts>1&&n({type:"step_retries_exhausted",workflowId:o,stepId:C,stepKey:k,name:E,ts:Date.now(),durationMs:performance.now()-L,attempts:v,lastError:S.error});break}catch(S){let q=performance.now()-Ve;if(nt(S)){let U=S.ms;n({type:"step_timeout",workflowId:o,stepId:C,stepKey:k,name:E,ts:Date.now(),timeoutMs:U,attempt:v}),n({type:"step_success",workflowId:o,stepId:C,stepKey:k,name:E,description:b,ts:Date.now(),durationMs:performance.now()-L}),R&&n({type:"step_complete",workflowId:o,stepKey:R,name:E,description:b,ts:Date.now(),durationMs:performance.now()-L,result:Q(void 0)});return}if(w(S))throw n({type:"step_aborted",workflowId:o,stepId:C,stepKey:k,name:E,description:b,ts:Date.now(),durationMs:q}),S;if(le(S)){let U=Ze(S),ue=P?.ms??U?.timeoutMs??0;if(n({type:"step_timeout",workflowId:o,stepId:C,stepKey:k,name:E,ts:Date.now(),timeoutMs:ue,attempt:v}),v<I.attempts&&I.retryOn(S,v)){let ce=me(v,I);n({type:"step_retry",workflowId:o,stepId:C,stepKey:k,name:E,ts:Date.now(),attempt:v+1,maxAttempts:I.attempts,delayMs:ce,error:S}),I.onRetry(S,v,ce),await Ee(ce);continue}I.attempts>1&&n({type:"step_retries_exhausted",workflowId:o,stepId:C,stepKey:k,name:E,ts:Date.now(),durationMs:performance.now()-L,attempts:v,lastError:S});let Re=performance.now()-L;throw n({type:"step_error",workflowId:o,stepId:C,stepKey:k,name:E,description:b,ts:Date.now(),durationMs:Re,error:S}),R&&n({type:"step_complete",workflowId:o,stepKey:R,name:E,description:b,ts:Date.now(),durationMs:Re,result:_(S,{cause:S}),meta:{origin:"throw",thrown:S}}),r?.(S,E,m),f(S,{origin:"throw",thrown:S})}if(v<I.attempts&&I.retryOn(S,v)){let U=me(v,I);n({type:"step_retry",workflowId:o,stepId:C,stepKey:k,name:E,ts:Date.now(),attempt:v+1,maxAttempts:I.attempts,delayMs:U,error:S}),I.onRetry(S,v,U),await Ee(U);continue}I.attempts>1&&!le(S)&&n({type:"step_retries_exhausted",workflowId:o,stepId:C,stepKey:k,name:E,ts:Date.now(),durationMs:performance.now()-L,attempts:v,lastError:S});let se=performance.now()-L;if(T){let U;try{U=T(S)}catch(ue){throw et(ue)}throw n({type:"step_error",workflowId:o,stepId:C,stepKey:k,name:E,description:b,ts:Date.now(),durationMs:se,error:U}),R&&n({type:"step_complete",workflowId:o,stepKey:R,name:E,description:b,ts:Date.now(),durationMs:se,result:_(U,{cause:S}),meta:{origin:"throw",thrown:S}}),r?.(U,E,m),f(U,{origin:"throw",thrown:S})}else{let U={type:"UNEXPECTED_ERROR",cause:{type:"UNCAUGHT_EXCEPTION",thrown:S}};throw n({type:"step_error",workflowId:o,stepId:C,stepKey:k,name:E,description:b,ts:Date.now(),durationMs:se,error:U}),R&&n({type:"step_complete",workflowId:o,stepKey:R,name:E,description:b,ts:Date.now(),durationMs:se,result:_(U,{cause:S}),meta:{origin:"throw",thrown:S}}),S}}}let z=X,we=performance.now()-L,Xe=A(z.error,{origin:"result",resultCause:z.cause});throw n({type:"step_error",workflowId:o,stepId:C,stepKey:k,name:E,description:b,ts:Date.now(),durationMs:we,error:Xe}),R&&n({type:"step_complete",workflowId:o,stepKey:R,name:E,description:b,ts:Date.now(),durationMs:we,result:z,meta:{origin:"result",resultCause:z.cause}}),r?.(z.error,E,m),f(z.error,{origin:"result",resultCause:z.cause})})();c.try=(y,x,u)=>{if(typeof y!="string"||y.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 g=u.key??y,E=y,k=y,R="error"in u?()=>u.error:u.onError,b=a;return(async()=>{let O=b?performance.now():0;a&&n({type:"step_start",workflowId:o,stepId:k,stepKey:g,name:E,ts:Date.now()});try{let P=await x(),C=performance.now()-O;return n({type:"step_success",workflowId:o,stepId:k,stepKey:g,name:E,ts:Date.now(),durationMs:C}),g&&n({type:"step_complete",workflowId:o,stepKey:g,name:E,ts:Date.now(),durationMs:C,result:Q(P)}),P}catch(P){let C=R(P),M=performance.now()-O,L=A(C,{origin:"throw",thrown:P});throw n({type:"step_error",workflowId:o,stepId:k,stepKey:g,name:E,ts:Date.now(),durationMs:M,error:L}),g&&n({type:"step_complete",workflowId:o,stepKey:g,name:E,ts:Date.now(),durationMs:M,result:_(C,{cause:P}),meta:{origin:"throw",thrown:P}}),r?.(C,E,m),f(C,{origin:"throw",thrown:P})}})()},c.fromResult=(y,x,u)=>{if(typeof y!="string"||y.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 g=u.key??y,E=y,k=y,R="error"in u?()=>u.error:u.onError,b=a;return(async()=>{let O=b?performance.now():0;a&&n({type:"step_start",workflowId:o,stepId:k,stepKey:g,name:E,ts:Date.now()});let P=await x();if(P.ok){let C=performance.now()-O;return n({type:"step_success",workflowId:o,stepId:k,stepKey:g,name:E,ts:Date.now(),durationMs:C}),g&&n({type:"step_complete",workflowId:o,stepKey:g,name:E,ts:Date.now(),durationMs:C,result:Q(P.value)}),P.value}else{let C=R(P.error),M=performance.now()-O,L=A(C,{origin:"result",resultCause:P.error});throw n({type:"step_error",workflowId:o,stepId:k,stepKey:g,name:E,ts:Date.now(),durationMs:M,error:L}),g&&n({type:"step_complete",workflowId:o,stepKey:g,name:E,ts:Date.now(),durationMs:M,result:_(C,{cause:P.error}),meta:{origin:"result",resultCause:P.error}}),r?.(C,E,m),f(C,{origin:"result",resultCause:P.error})}})()},c.retry=(y,x,u)=>{if(typeof y!="string"||y.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(y,x,{key:u.key??y,retry:{attempts:u.attempts,backoff:u.backoff,initialDelay:u.initialDelay,maxDelay:u.maxDelay,jitter:u.jitter,retryOn:u.retryOn,onRetry:u.onRetry},timeout:u.timeout})},c.withTimeout=(y,x,u)=>{if(typeof y!="string"||y.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(y,x,{key:u.key??y,timeout:u})},c.sleep=(y,x,u)=>{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 g=typeof x=="string"?Ge(x):x;if(!g)throw new Error(`step.sleep: invalid duration '${x}'`);let E=g.millis,k=u?.signal;return c(y,async()=>{if(h?.aborted||k?.aborted){let R=new Error("Sleep aborted");throw R.name="AbortError",R}return new Promise((R,b)=>{let O={timeoutId:void 0},P=()=>{O.timeoutId&&clearTimeout(O.timeoutId);let C=new Error("Sleep aborted");C.name="AbortError",b(C)};h?.addEventListener("abort",P,{once:!0}),k?.addEventListener("abort",P,{once:!0}),O.timeoutId=setTimeout(()=>{h?.removeEventListener("abort",P),k?.removeEventListener("abort",P),R(Q(void 0))},E)})},{key:u?.key??y,description:u?.description})},c.parallel=((...y)=>{if(typeof y[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 x=y[0],u=y[1];if(typeof u=="function")return B(x,u);if(u&&typeof u=="object"&&!Array.isArray(u)){let E=F(u);return V(E,{name:x})}throw new TypeError("step.parallel(name, ...): second argument must be a function (array form) or an object of operations (object form).")}),c.race=(y,x)=>{let u=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let g=performance.now(),E=!1,k={scopeId:u,type:"race",winnerId:void 0};i.push(k);let R=()=>{if(E)return;E=!0;let b=i.findIndex(O=>O.scopeId===u);b!==-1&&i.splice(b,1),n({type:"scope_end",workflowId:o,scopeId:u,ts:Date.now(),durationMs:performance.now()-g,winnerId:k.winnerId})};n({type:"scope_start",workflowId:o,scopeId:u,scopeType:"race",name:y,ts:Date.now()});try{let b=await x();if(R(),!b.ok)throw r?.(b.error,y,m),f(b.error,{origin:"result",resultCause:b.cause});return b.value}catch(b){throw R(),b}})()},c.allSettled=(y,x)=>{let u=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let g=performance.now(),E=!1;i.push({scopeId:u,type:"allSettled"});let k=()=>{if(E)return;E=!0;let R=i.findIndex(b=>b.scopeId===u);R!==-1&&i.splice(R,1),n({type:"scope_end",workflowId:o,scopeId:u,ts:Date.now(),durationMs:performance.now()-g})};n({type:"scope_start",workflowId:o,scopeId:u,scopeType:"allSettled",name:y,ts:Date.now()});try{let R=await x();if(k(),!R.ok)throw r?.(R.error,y,m),f(R.error,{origin:"result",resultCause:R.cause});return R.value}catch(R){throw k(),R}})()},c.if=(y,x,u)=>u(),c.label=c.if,c.branch=async(y,x)=>{let{condition:u,then:g,else:E}=x;if(u())return await g();if(E)return await E()},c.arm=(y,x)=>({fn:y,errors:x}),c.forEach=async(y,x,u)=>{let g=[],E=u.maxIterations,k=0,R="run"in u,b=Symbol.asyncIterator in x?x:(async function*(){yield*x})();for await(let O of b){if(E!==void 0&&k>=E)break;let P;R?P=await u.run(O,k):P=await u.item.handler(O,k,c),g.push(P),k++}return g},c.item=y=>({__forEachItemHandler:!0,handler:y}),c.dep=(y,x)=>x;let G=await e(c);if(process.env.NODE_ENV!=="production"&&G!==null&&typeof G=="object"&&"ok"in G&&typeof G.ok=="boolean"){let y=G;(y.ok===!0&&"value"in y||y.ok===!1&&"error"in y)&&console.warn(`awaitly: Workflow executor returned a Result-like object. Return raw values, not ok() or err().
1
+ "use strict";var pe=Object.defineProperty;var qe=Object.getOwnPropertyDescriptor;var Qe=Object.getOwnPropertyNames;var He=Object.prototype.hasOwnProperty;var Ye=(e,t)=>{for(var n in t)pe(e,n,{get:t[n],enumerable:!0})},ze=(e,t,n,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let f of Qe(t))!He.call(e,f)&&f!==n&&pe(e,f,{get:()=>t[f],enumerable:!(a=qe(t,f))||a.enumerable});return e};var $e=e=>ze(pe({},"__esModule",{value:!0}),e);var st={};Ye(st,{CircuitOpenError:()=>re,circuitBreakerPresets:()=>he,conditionalPolicy:()=>je,createCircuitBreaker:()=>be,createCombinedLimiter:()=>Ae,createConcurrencyLimiter:()=>fe,createCostBasedRateLimiter:()=>_e,createFixedWindowLimiter:()=>Oe,createPolicyApplier:()=>Le,createPolicyBundle:()=>Ue,createPolicyRegistry:()=>Be,createRateLimiter:()=>de,createSagaWorkflow:()=>De,envPolicy:()=>Ke,isCircuitOpenError:()=>Se,isQueueFullError:()=>ye,isRateLimitExceededError:()=>Pe,isSagaCompensationError:()=>Ie,mergePolicies:()=>N,rateLimiterPresets:()=>ve,retryPolicies:()=>$,retryPolicy:()=>B,runSaga:()=>Me,servicePolicies:()=>Ne,stepOptions:()=>We,timeoutPolicies:()=>z,timeoutPolicy:()=>K,withPolicies:()=>Fe,withPolicy:()=>Te});module.exports=$e(st);function Ge(e){let t=e.trim().match(/^(\d+(?:\.\d+)?)\s*(ms|s|m|h|d)$/i);if(!t)return;let n=parseFloat(t[1]),a=t[2].toLowerCase();return{_tag:"Duration",millis:n*({ms:1,s:1e3,m:6e4,h:36e5,d:864e5}[a]??1)}}var Q=e=>({ok:!0,value:e}),O=(e,t)=>({ok:!1,error:e,...t?.cause!==void 0?{cause:t.cause}:{}});var Je=e=>typeof e=="object"&&e!==null&&e.type==="UNEXPECTED_ERROR";var Z=Symbol.for("step_timeout_marker");function le(e){return typeof e!="object"||e===null?!1:e.type==="STEP_TIMEOUT"?!0:Z in e}function Ze(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(Z in e)return e[Z]}}var Ce=Symbol("early-exit");function ee(e,t){return{[Ce]:!0,error:e,meta:t}}function te(e){return typeof e=="object"&&e!==null&&e[Ce]===!0}var xe=Symbol("mapper-exception");function et(e){return{[xe]:!0,thrown:e}}function tt(e){return typeof e=="object"&&e!==null&&e[xe]===!0}function me(e,t){let{backoff:n,initialDelay:a,maxDelay:f,jitter:l}=t,m;switch(n){case"fixed":m=a;break;case"linear":m=a*e;break;case"exponential":m=a*Math.pow(2,e-1);break}if(m=Math.min(m,f),l){let h=m*.25*Math.random();m=m+h}return Math.floor(m)}function Ee(e){return new Promise(t=>setTimeout(t,e))}var Re=Symbol("timeout"),ie=Symbol("timeout-option");function rt(e){return typeof e=="object"&&e!==null&&e[ie]===!0}async function nt(e,t,n,a){let f=new AbortController,l=t.onTimeout??"error",m=()=>typeof l=="function"?l({name:n.name,key:n.key,ms:t.ms}):t.error??{type:"STEP_TIMEOUT",stepName:n.name,stepKey:n.key,timeoutMs:t.ms,attempt:n.attempt},h;a?.aborted&&f.abort(a.reason);let s;a&&!a.aborted&&(s=()=>f.abort(a.reason),a.addEventListener("abort",s,{once:!0}));let d=new Promise((c,o)=>{h=setTimeout(()=>{if(l!=="disconnect"&&f.abort(),l==="option"){o({[ie]:!0,ms:t.ms});return}o({[Re]:!0,error:m()})},t.ms)}),i;t.signal?i=Promise.resolve(e(f.signal)):i=Promise.resolve(e());try{return await Promise.race([i,d])}catch(c){if(typeof c=="object"&&c!==null&&c[ie]===!0)throw{[ie]:!0,ms:t.ms};if(typeof c=="object"&&c!==null&&c[Re]===!0){l==="disconnect"&&i.catch(()=>{});let o=c.error;if(typeof o=="object"&&o!==null&&o.type!=="STEP_TIMEOUT"){let r={timeoutMs:t.ms,stepName:n.name,stepKey:n.key,attempt:n.attempt};Z in o?o[Z]=r:Object.defineProperty(o,Z,{value:r,enumerable:!1,writable:!0,configurable:!1})}throw o}throw c}finally{clearTimeout(h),s&&a&&a.removeEventListener("abort",s)}}var J={backoff:"exponential",initialDelay:100,maxDelay:3e4,jitter:!0,retryOn:()=>!0,onRetry:()=>{}};async function ge(e,t){let{onError:n,onEvent:a,catchUnexpected:f,workflowId:l,context:m,_workflowSignal:h}=t&&typeof t=="object"?t:{},s=l??crypto.randomUUID(),d=!n&&!f,i=[],c=0,o=p=>p??`step_${++c}`,r=p=>{let U=p.context!==void 0||m===void 0?p:{...p,context:m};if(U.type==="step_success"){let j=U.stepId;for(let V=i.length-1;V>=0;V--){let ne=i[V];if(ne.type==="race"&&!ne.winnerId){ne.winnerId=j;break}}}a?.(U,m)},k=ee,P=p=>te(p),I=(p,U)=>d?U?.origin==="result"?{type:"UNEXPECTED_ERROR",cause:{type:"STEP_FAILURE",origin:"result",error:p,...U.resultCause!==void 0?{cause:U.resultCause}:{}}}:U?.origin==="throw"?{type:"UNEXPECTED_ERROR",cause:{type:"STEP_FAILURE",origin:"throw",error:p,thrown:U.thrown}}:{type:"UNEXPECTED_ERROR",cause:{type:"STEP_FAILURE",origin:"result",error:p}}:p,W=p=>({type:"UNEXPECTED_ERROR",cause:p.meta.origin==="result"?{type:"STEP_FAILURE",origin:"result",error:p.error,...p.meta.resultCause!==void 0?{cause:p.meta.resultCause}:{}}:{type:"STEP_FAILURE",origin:"throw",error:p.error,thrown:p.meta.thrown}}),F=p=>typeof p=="function"?!1:!!(p&&typeof p=="object"&&"ok"in p||p&&typeof p=="object"&&"then"in p&&typeof p.then=="function");try{let U=function(y){let C={};for(let[u,g]of Object.entries(y))if(typeof g=="function")C[u]=g;else if(g&&typeof g=="object"&&"fn"in g)C[u]=g.fn;else throw new TypeError(`step.parallel: operation "${u}" must be a function or { fn, errors? } object`);return C},j=function(y,C){let u=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let g=performance.now(),E=!1;i.push({scopeId:u,type:"parallel"});let w=()=>{if(E)return;E=!0;let T=i.findIndex(S=>S.scopeId===u);T!==-1&&i.splice(T,1),r({type:"scope_end",workflowId:s,scopeId:u,ts:Date.now(),durationMs:performance.now()-g})};r({type:"scope_start",workflowId:s,scopeId:u,scopeType:"parallel",name:y,ts:Date.now()});try{let T=await C();if(w(),!T.ok)throw n?.(T.error,y,m),k(T.error,{origin:"result",resultCause:T.cause});return T.value}catch(T){throw w(),T}})()},V=function(y,C){let u=Object.keys(y),g=C.name??`Parallel(${u.join(", ")})`,E=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let w=performance.now(),T=!1;i.push({scopeId:E,type:"parallel"});let S=()=>{if(T)return;T=!0;let A=i.findIndex(b=>b.scopeId===E);A!==-1&&i.splice(A,1),r({type:"scope_end",workflowId:s,scopeId:E,ts:Date.now(),durationMs:performance.now()-w})};r({type:"scope_start",workflowId:s,scopeId:E,scopeType:"parallel",name:g,ts:Date.now()});try{let A=await new Promise(R=>{if(u.length===0){R([]);return}let D=!1,M=u.length,ae=new Array(u.length);for(let H=0;H<u.length;H++){let oe=u[H],v=H;Promise.resolve(y[oe]()).catch(X=>O({type:"PROMISE_REJECTED",cause:X},{cause:{type:"PROMISE_REJECTION",reason:X}})).then(X=>{if(!D){if(!X.ok){D=!0,R([{key:oe,result:X}]);return}ae[v]={key:oe,result:X},M--,M===0&&R(ae)}})}});S();let b={};for(let{key:R,result:D}of A){if(!D.ok)throw n?.(D.error,R,m),k(D.error,{origin:"result",resultCause:D.cause});b[R]=D.value}return b}catch(A){throw S(),A}})()};var it=U,at=j,ut=V;let p=(y,C,u)=>(async()=>{if(typeof y!="string"||y.length===0)throw new Error('[awaitly] step() requires an explicit string ID as the first argument. Example: step("fetchUser", () => fetchUser(id))');let g=u??{},E=y,w=g.key??y,T=g.key??y,{description:S,retry:A,timeout:b}=g,R=o(w),D=a,M=D?performance.now():0,H=F(C)?()=>C:C,v={attempts:Math.max(1,A?.attempts??1),backoff:A?.backoff??J.backoff,initialDelay:A?.initialDelay??J.initialDelay,maxDelay:A?.maxDelay??J.maxDelay,jitter:A?.jitter??J.jitter,retryOn:A?.retryOn??J.retryOn,onRetry:A?.onRetry??J.onRetry};a&&r({type:"step_start",workflowId:s,stepId:R,stepKey:w,name:E,description:S,ts:Date.now()});let X;for(let _=1;_<=v.attempts;_++){let Ve=D?performance.now():0;try{let x;if(b?x=await nt(H,b,{name:E,key:w,attempt:_},h):x=await H(),x.ok){let q=performance.now()-M;return r({type:"step_success",workflowId:s,stepId:R,stepKey:w,name:E,description:S,ts:Date.now(),durationMs:q}),T&&r({type:"step_complete",workflowId:s,stepKey:T,name:E,description:S,ts:Date.now(),durationMs:q,result:x}),x.value}if(X=x,_<v.attempts&&v.retryOn(x.error,_)){let q=me(_,v);r({type:"step_retry",workflowId:s,stepId:R,stepKey:w,name:E,ts:Date.now(),attempt:_+1,maxAttempts:v.attempts,delayMs:q,error:x.error}),v.onRetry(x.error,_,q),await Ee(q);continue}v.attempts>1&&r({type:"step_retries_exhausted",workflowId:s,stepId:R,stepKey:w,name:E,ts:Date.now(),durationMs:performance.now()-M,attempts:_,lastError:x.error});break}catch(x){let q=performance.now()-Ve;if(rt(x)){let L=x.ms;r({type:"step_timeout",workflowId:s,stepId:R,stepKey:w,name:E,ts:Date.now(),timeoutMs:L,attempt:_}),r({type:"step_success",workflowId:s,stepId:R,stepKey:w,name:E,description:S,ts:Date.now(),durationMs:performance.now()-M}),T&&r({type:"step_complete",workflowId:s,stepKey:T,name:E,description:S,ts:Date.now(),durationMs:performance.now()-M,result:Q(void 0)});return}if(P(x))throw r({type:"step_aborted",workflowId:s,stepId:R,stepKey:w,name:E,description:S,ts:Date.now(),durationMs:q}),x;if(le(x)){let L=Ze(x),ue=b?.ms??L?.timeoutMs??0;if(r({type:"step_timeout",workflowId:s,stepId:R,stepKey:w,name:E,ts:Date.now(),timeoutMs:ue,attempt:_}),_<v.attempts&&v.retryOn(x,_)){let ce=me(_,v);r({type:"step_retry",workflowId:s,stepId:R,stepKey:w,name:E,ts:Date.now(),attempt:_+1,maxAttempts:v.attempts,delayMs:ce,error:x}),v.onRetry(x,_,ce),await Ee(ce);continue}v.attempts>1&&r({type:"step_retries_exhausted",workflowId:s,stepId:R,stepKey:w,name:E,ts:Date.now(),durationMs:performance.now()-M,attempts:_,lastError:x});let ke=performance.now()-M;throw r({type:"step_error",workflowId:s,stepId:R,stepKey:w,name:E,description:S,ts:Date.now(),durationMs:ke,error:x}),T&&r({type:"step_complete",workflowId:s,stepKey:T,name:E,description:S,ts:Date.now(),durationMs:ke,result:O(x,{cause:x}),meta:{origin:"throw",thrown:x}}),n?.(x,E,m),k(x,{origin:"throw",thrown:x})}if(_<v.attempts&&v.retryOn(x,_)){let L=me(_,v);r({type:"step_retry",workflowId:s,stepId:R,stepKey:w,name:E,ts:Date.now(),attempt:_+1,maxAttempts:v.attempts,delayMs:L,error:x}),v.onRetry(x,_,L),await Ee(L);continue}v.attempts>1&&!le(x)&&r({type:"step_retries_exhausted",workflowId:s,stepId:R,stepKey:w,name:E,ts:Date.now(),durationMs:performance.now()-M,attempts:_,lastError:x});let se=performance.now()-M;if(f){let L;try{L=f(x)}catch(ue){throw et(ue)}throw r({type:"step_error",workflowId:s,stepId:R,stepKey:w,name:E,description:S,ts:Date.now(),durationMs:se,error:L}),T&&r({type:"step_complete",workflowId:s,stepKey:T,name:E,description:S,ts:Date.now(),durationMs:se,result:O(L,{cause:x}),meta:{origin:"throw",thrown:x}}),n?.(L,E,m),k(L,{origin:"throw",thrown:x})}else{let L={type:"UNEXPECTED_ERROR",cause:{type:"UNCAUGHT_EXCEPTION",thrown:x}};throw r({type:"step_error",workflowId:s,stepId:R,stepKey:w,name:E,description:S,ts:Date.now(),durationMs:se,error:L}),T&&r({type:"step_complete",workflowId:s,stepKey:T,name:E,description:S,ts:Date.now(),durationMs:se,result:O(L,{cause:x}),meta:{origin:"throw",thrown:x}}),x}}}let Y=X,we=performance.now()-M,Xe=I(Y.error,{origin:"result",resultCause:Y.cause});throw r({type:"step_error",workflowId:s,stepId:R,stepKey:w,name:E,description:S,ts:Date.now(),durationMs:we,error:Xe}),T&&r({type:"step_complete",workflowId:s,stepKey:T,name:E,description:S,ts:Date.now(),durationMs:we,result:Y,meta:{origin:"result",resultCause:Y.cause}}),n?.(Y.error,E,m),k(Y.error,{origin:"result",resultCause:Y.cause})})();p.try=(y,C,u)=>{if(typeof y!="string"||y.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 g=u.key??y,E=y,w=y,T="error"in u?()=>u.error:u.onError,S=a;return(async()=>{let A=S?performance.now():0;a&&r({type:"step_start",workflowId:s,stepId:w,stepKey:g,name:E,ts:Date.now()});try{let b=await C(),R=performance.now()-A;return r({type:"step_success",workflowId:s,stepId:w,stepKey:g,name:E,ts:Date.now(),durationMs:R}),g&&r({type:"step_complete",workflowId:s,stepKey:g,name:E,ts:Date.now(),durationMs:R,result:Q(b)}),b}catch(b){let R=T(b),D=performance.now()-A,M=I(R,{origin:"throw",thrown:b});throw r({type:"step_error",workflowId:s,stepId:w,stepKey:g,name:E,ts:Date.now(),durationMs:D,error:M}),g&&r({type:"step_complete",workflowId:s,stepKey:g,name:E,ts:Date.now(),durationMs:D,result:O(R,{cause:b}),meta:{origin:"throw",thrown:b}}),n?.(R,E,m),k(R,{origin:"throw",thrown:b})}})()},p.fromResult=(y,C,u)=>{if(typeof y!="string"||y.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 g=u.key??y,E=y,w=y,T="error"in u?()=>u.error:u.onError,S=a;return(async()=>{let A=S?performance.now():0;a&&r({type:"step_start",workflowId:s,stepId:w,stepKey:g,name:E,ts:Date.now()});let b=await C();if(b.ok){let R=performance.now()-A;return r({type:"step_success",workflowId:s,stepId:w,stepKey:g,name:E,ts:Date.now(),durationMs:R}),g&&r({type:"step_complete",workflowId:s,stepKey:g,name:E,ts:Date.now(),durationMs:R,result:Q(b.value)}),b.value}else{let R=T(b.error),D=performance.now()-A,M=I(R,{origin:"result",resultCause:b.error});throw r({type:"step_error",workflowId:s,stepId:w,stepKey:g,name:E,ts:Date.now(),durationMs:D,error:M}),g&&r({type:"step_complete",workflowId:s,stepKey:g,name:E,ts:Date.now(),durationMs:D,result:O(R,{cause:b.error}),meta:{origin:"result",resultCause:b.error}}),n?.(R,E,m),k(R,{origin:"result",resultCause:b.error})}})()},p.retry=(y,C,u)=>{if(typeof y!="string"||y.length===0)throw new Error('[awaitly] step.retry() requires an explicit string ID as the first argument. Example: step.retry("fetchData", () => fetchData(), { attempts: 3 })');return p(y,C,{key:u.key??y,retry:{attempts:u.attempts,backoff:u.backoff,initialDelay:u.initialDelay,maxDelay:u.maxDelay,jitter:u.jitter,retryOn:u.retryOn,onRetry:u.onRetry},timeout:u.timeout})},p.withTimeout=(y,C,u)=>{if(typeof y!="string"||y.length===0)throw new Error('[awaitly] step.withTimeout() requires an explicit string ID as the first argument. Example: step.withTimeout("slowOp", () => slowOp(), { ms: 5000 })');return p(y,C,{key:u.key??y,timeout:u})},p.sleep=(y,C,u)=>{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 g=typeof C=="string"?Ge(C):C;if(!g)throw new Error(`step.sleep: invalid duration '${C}'`);let E=g.millis,w=u?.signal;return p(y,async()=>{if(h?.aborted||w?.aborted){let T=new Error("Sleep aborted");throw T.name="AbortError",T}return new Promise((T,S)=>{let A={timeoutId:void 0},b=()=>{A.timeoutId&&clearTimeout(A.timeoutId);let R=new Error("Sleep aborted");R.name="AbortError",S(R)};h?.addEventListener("abort",b,{once:!0}),w?.addEventListener("abort",b,{once:!0}),A.timeoutId=setTimeout(()=>{h?.removeEventListener("abort",b),w?.removeEventListener("abort",b),T(Q(void 0))},E)})},{key:u?.key??y,description:u?.description})},p.parallel=((...y)=>{if(typeof y[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=y[0],u=y[1];if(typeof u=="function")return j(C,u);if(u&&typeof u=="object"&&!Array.isArray(u)){let E=U(u);return V(E,{name:C})}throw new TypeError("step.parallel(name, ...): second argument must be a function (array form) or an object of operations (object form).")}),p.race=(y,C)=>{let u=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let g=performance.now(),E=!1,w={scopeId:u,type:"race",winnerId:void 0};i.push(w);let T=()=>{if(E)return;E=!0;let S=i.findIndex(A=>A.scopeId===u);S!==-1&&i.splice(S,1),r({type:"scope_end",workflowId:s,scopeId:u,ts:Date.now(),durationMs:performance.now()-g,winnerId:w.winnerId})};r({type:"scope_start",workflowId:s,scopeId:u,scopeType:"race",name:y,ts:Date.now()});try{let S=await C();if(T(),!S.ok)throw n?.(S.error,y,m),k(S.error,{origin:"result",resultCause:S.cause});return S.value}catch(S){throw T(),S}})()},p.allSettled=(y,C)=>{let u=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let g=performance.now(),E=!1;i.push({scopeId:u,type:"allSettled"});let w=()=>{if(E)return;E=!0;let T=i.findIndex(S=>S.scopeId===u);T!==-1&&i.splice(T,1),r({type:"scope_end",workflowId:s,scopeId:u,ts:Date.now(),durationMs:performance.now()-g})};r({type:"scope_start",workflowId:s,scopeId:u,scopeType:"allSettled",name:y,ts:Date.now()});try{let T=await C();if(w(),!T.ok)throw n?.(T.error,y,m),k(T.error,{origin:"result",resultCause:T.cause});return T.value}catch(T){throw w(),T}})()},p.if=(y,C,u)=>u(),p.label=p.if,p.branch=async(y,C)=>{let{condition:u,then:g,else:E}=C;if(u())return await g();if(E)return await E()},p.arm=(y,C)=>({fn:y,errors:C}),p.forEach=async(y,C,u)=>{let g=[],E=u.maxIterations,w=0,T="run"in u,S=Symbol.asyncIterator in C?C:(async function*(){yield*C})();for await(let A of S){if(E!==void 0&&w>=E)break;let b;T?b=await u.run(A,w):b=await u.item.handler(A,w,p),g.push(b),w++}return g},p.item=y=>({__forEachItemHandler:!0,handler:y}),p.dep=(y,C)=>C;let G=await e(p);if(process.env.NODE_ENV!=="production"&&G!==null&&typeof G=="object"&&"ok"in G&&typeof G.ok=="boolean"){let y=G;(y.ok===!0&&"value"in y||y.ok===!1&&"error"in y)&&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 Q(G)}catch(c){if(tt(c))throw c.thrown;if(w(c)){let B=c.meta.origin==="throw"?c.meta.thrown:c.meta.resultCause;if(T||r)return _(c.error,{cause:B});if(Je(c.error))return _(c.error,{cause:B});if(le(c.error))return _(c.error,{cause:B});let V=D(c);return _(V,{cause:B})}if(T){let B=T(c);return r?.(B,"unexpected",m),_(B,{cause:c})}let F={type:"UNEXPECTED_ERROR",cause:{type:"UNCAUGHT_EXCEPTION",thrown:c}};return r?.(F,"unexpected",m),_(F,{cause:c})}}Ce.strict=(e,t)=>Ce(e,t);var ne=class extends Error{type="CIRCUIT_OPEN";circuitName;state;retryAfterMs;constructor(t){super(t.message??`Circuit breaker "${t.circuitName}" is ${t.state}. Retry after ${Math.ceil(t.retryAfterMs/1e3)}s`),this.name="CircuitOpenError",this.circuitName=t.circuitName,this.state=t.state,this.retryAfterMs=t.retryAfterMs}};function Se(e){return typeof e=="object"&&e!==null&&e.type==="CIRCUIT_OPEN"}var ot={failureThreshold:5,resetTimeout:3e4,windowSize:6e4,halfOpenMax:3};function be(e,t){let r={...ot,...t},a="CLOSED",T=[],l=null,m=null,h=0,o=0;function d(){let w=Date.now();T=T.filter(A=>w-A.timestamp<r.windowSize)}function i(w){if(a!==w){let A=a;a=w,w==="HALF_OPEN"&&(o=0),r.onStateChange?.(A,w,e)}}function p(){return a!=="OPEN"||l===null?!1:Date.now()-l>=r.resetTimeout?(i("HALF_OPEN"),!0):!1}function s(){m=Date.now(),h++,a==="HALF_OPEN"&&(o++,o>=r.halfOpenMax&&(i("CLOSED"),T=[]))}function n(w){let A=Date.now();l=A,d(),T.push({timestamp:A,error:w}),(a==="HALF_OPEN"||a==="CLOSED"&&T.length>=r.failureThreshold)&&i("OPEN")}function f(){if(a==="CLOSED")return 0;if(a==="OPEN"){if(p())return 0;let w=Date.now(),A=l?w-l:0;return Math.max(0,r.resetTimeout-A)}return 0}return{async execute(w,A){let D=f();if(D>0)throw new ne({circuitName:e,state:a,retryAfterMs:D});try{let N=await w();return s(),N}catch(N){throw n(N),N}},async executeResult(w,A){let D=f();if(D>0)return _(new ne({circuitName:e,state:a,retryAfterMs:D}));try{let N=await w();return N.ok?s():n(N.error),N}catch(N){throw n(N),N}},getState(){return a==="OPEN"&&p(),a},getStats(){return d(),{state:this.getState(),failureCount:T.length,successCount:h,lastFailureTime:l,lastSuccessTime:m,halfOpenSuccesses:o}},reset(){i("CLOSED"),T=[],o=0},forceOpen(){l=Date.now(),i("OPEN")},recordSuccess(){s()},recordFailure(w){n(w??new Error("Manual failure"))}}}var Pe={critical:{failureThreshold:3,resetTimeout:6e4,windowSize:3e4,halfOpenMax:1},standard:{failureThreshold:5,resetTimeout:3e4,windowSize:6e4,halfOpenMax:3},lenient:{failureThreshold:10,resetTimeout:15e3,windowSize:12e4,halfOpenMax:5}};function he(e){return typeof e=="object"&&e!==null&&e.type==="RATE_LIMIT_EXCEEDED"}function ye(e){return typeof e=="object"&&e!==null&&e.type==="QUEUE_FULL"}function de(e,t){let{maxPerSecond:r,strategy:a="wait"}=t,T=t.burstCapacity??r*2,l=T,m=Date.now(),h=r/1e3,o=[];function d(){let s=Date.now(),f=(s-m)*h;l=Math.min(T,l+f),m=s}function i(){if(d(),l>=1)return l-=1,0;let s=1-l;return Math.ceil(s/h)}async function p(){return new Promise(s=>{let n=()=>{let f=i();f===0?s():(o.push(n),setTimeout(()=>{let w=o.indexOf(n);w!==-1&&(o.splice(w,1),n())},f))};n()})}return{async execute(s){let n=i();if(n>0){if(a==="reject")throw{type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:n};await p()}return s()},async executeResult(s){let n=i();if(n>0){if(a==="reject")return _({type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:n});await p()}return s()},getStats(){return d(),{availableTokens:Math.floor(l),maxTokens:T,tokensPerSecond:r,waitingCount:o.length}},reset(){l=T,m=Date.now(),o.length=0}}}function Te(e,t){let{maxConcurrent:r,strategy:a="queue",maxQueueSize:T=1/0}=t,l=0,m=[];async function h(){if(l<r){l++;return}if(a==="reject")throw{type:"QUEUE_FULL",limiterName:e,queueSize:m.length,maxQueueSize:T};if(m.length>=T)throw{type:"QUEUE_FULL",limiterName:e,queueSize:m.length,maxQueueSize:T};return new Promise((d,i)=>{m.push({resolve:d,reject:i})})}function o(){l--,m.length>0&&l<r&&(l++,m.shift()?.resolve())}return{async execute(d){await h();try{return await d()}finally{o()}},async executeAll(d){let i=new Array(d.length),p=[];for(let s=0;s<d.length;s++){let n=s,f=this.execute(d[n]).then(w=>{i[n]=w});p.push(f)}return await Promise.all(p),i},async executeResult(d){try{await h()}catch(i){if(ye(i))return _(i);throw i}try{return await d()}finally{o()}},getStats(){return{activeCount:l,maxConcurrent:r,queueSize:m.length,maxQueueSize:T}},reset(){for(l=0;m.length>0;)m.shift()?.reject(new Error("Limiter reset"))}}}function Ae(e,t){let r=t.rate?de(`${e}-rate`,t.rate):void 0,a=t.concurrency?Te(`${e}-concurrency`,t.concurrency):void 0;return{rate:r,concurrency:a,async execute(T){let l=T;if(r){let m=l;l=()=>r.execute(m)}return a?a.execute(l):l()}}}function Oe(e,t){let{limit:r,windowMs:a=1e3,strategy:T="wait"}=t,l=Date.now(),m=0,h=[];function o(){let p=Date.now(),s=p-l;return s>=a?(l=p,m=0,0):a-s}function d(p){let s=o();return m+p<=r?(m+=p,0):s}async function i(p){return new Promise(s=>{let n=()=>{let f=d(p);f===0?s():(h.push({resolve:n,cost:p}),setTimeout(()=>{let w=h.findIndex(A=>A.resolve===n);w!==-1&&(h.splice(w,1),n())},f))};n()})}return{async execute(p,s=1){if(s>r)throw{type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:a};let n=d(s);if(n>0){if(T==="reject")throw{type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:n};await i(s)}return p()},async executeResult(p,s=1){if(s>r)return _({type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:a});let n=d(s);if(n>0){if(T==="reject")return _({type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:n});await i(s)}return p()},getStats(){let p=o();return{requestCount:m,limit:r,windowMs:a,remainingMs:p,waitingCount:h.length}},reset(){l=Date.now(),m=0,h.length=0}}}function _e(e,t){let{tokensPerSecond:r,strategy:a="wait"}=t,T=t.maxTokens??r*2,l=T,m=Date.now(),h=r/1e3,o=[];function d(){let s=Date.now(),f=(s-m)*h;l=Math.min(T,l+f),m=s}function i(s){if(d(),l>=s)return l-=s,0;let n=s-l;return Math.ceil(n/h)}async function p(s){return new Promise(n=>{let f=()=>{let w=i(s);w===0?n():(o.push({check:f,cost:s}),setTimeout(()=>{let A=o.findIndex(D=>D.check===f);A!==-1&&(o.splice(A,1),f())},w))};f()})}return{async execute(s,n=1){if(n>T)throw{type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:Math.ceil(n/h)};let f=i(n);if(f>0){if(a==="reject")throw{type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:f};await p(n)}return s()},async executeResult(s,n=1){if(n>T)return _({type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:Math.ceil(n/h)});let f=i(n);if(f>0){if(a==="reject")return _({type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:f});await p(n)}return s()},getStats(){return d(),{availableTokens:l,maxTokens:T,tokensPerSecond:r,waitingCount:o.length}},reset(){l=T,m=Date.now(),o.length=0}}}var ve={api:{maxPerSecond:10,burstCapacity:20,strategy:"wait"},database:{maxConcurrent:10,strategy:"queue",maxQueueSize:100},external:{maxPerSecond:5,burstCapacity:10,strategy:"wait"}};function Ie(e){return typeof e=="object"&&e!==null&&e.type==="SAGA_COMPENSATION_ERROR"}function De(e,t){return async r=>{let a=crypto.randomUUID(),T=performance.now(),l=[],m=d=>{t?.onEvent?.(d)};m({type:"saga_start",sagaId:a,ts:Date.now()});async function h(d){let i=[];m({type:"saga_compensation_start",sagaId:a,ts:Date.now(),stepCount:l.length});let p=performance.now();for(let s=l.length-1;s>=0;s--){let n=l[s];try{await n.compensate(n.value),m({type:"saga_compensation_step",sagaId:a,stepName:n.name,ts:Date.now(),success:!0})}catch(f){i.push({stepName:n.name,error:f}),m({type:"saga_compensation_step",sagaId:a,stepName:n.name,ts:Date.now(),success:!1,error:f})}}return m({type:"saga_compensation_end",sagaId:a,ts:Date.now(),durationMs:performance.now()-p,success:i.length===0,failedCount:i.length}),i}let o={step:async function(i,p,s){let n,f,w;typeof i=="string"?(n=i,f=p,w=s):(f=i,w=p);let A=await f();if(A.ok)return w?.compensate&&l.push({name:n,value:A.value,compensate:w.compensate}),A.value;throw ee(A.error,{origin:"result",resultCause:A.cause})},tryStep:async function(i,p,s){let n,f,w;typeof i=="string"?(n=i,f=p,w=s):(f=i,w=p);let A="error"in w?()=>w.error:w.onError;try{let D=await f();return w.compensate&&l.push({name:n,value:D,compensate:w.compensate}),D}catch(D){let N=A(D);throw ee(N,{origin:"throw",thrown:D})}},getCompensations(){return l.map(d=>({name:d.name,hasValue:d.value!==void 0}))}};try{let d=await r(o,e),i=performance.now()-T;return m({type:"saga_success",sagaId:a,ts:Date.now(),durationMs:i}),Q(d)}catch(d){let i=performance.now()-T,p;te(d)?p=d.error:p=d,m({type:"saga_error",sagaId:a,ts:Date.now(),durationMs:i,error:p});let s=await h(p);if(s.length>0){let n={type:"SAGA_COMPENSATION_ERROR",originalError:p,compensationErrors:s};if(t?.onError?.(n),t?.throwOnCompensationFailure)throw n;return _(n)}return t?.onError?.(p),te(d)?_(p):_({type:"UNEXPECTED_ERROR",cause:{type:"UNCAUGHT_EXCEPTION",thrown:d}})}}}async function Me(e,t){let r=crypto.randomUUID(),a=performance.now(),T=[],l=o=>{t?.onEvent?.(o)};l({type:"saga_start",sagaId:r,ts:Date.now()});async function m(o){let d=[];l({type:"saga_compensation_start",sagaId:r,ts:Date.now(),stepCount:T.length});let i=performance.now();for(let p=T.length-1;p>=0;p--){let s=T[p];try{await s.compensate(s.value),l({type:"saga_compensation_step",sagaId:r,stepName:s.name,ts:Date.now(),success:!0})}catch(n){d.push({stepName:s.name,error:n}),l({type:"saga_compensation_step",sagaId:r,stepName:s.name,ts:Date.now(),success:!1,error:n})}}return l({type:"saga_compensation_end",sagaId:r,ts:Date.now(),durationMs:performance.now()-i,success:d.length===0,failedCount:d.length}),d}let h={step:async function(d,i,p){let s,n,f;typeof d=="string"?(s=d,n=i,f=p):(n=d,f=i);let w=await n();if(w.ok)return f?.compensate&&T.push({name:s,value:w.value,compensate:f.compensate}),w.value;throw ee(w.error,{origin:"result",resultCause:w.cause})},tryStep:async function(d,i,p){let s,n,f;typeof d=="string"?(s=d,n=i,f=p):(n=d,f=i);let w="error"in f?()=>f.error:f.onError;try{let A=await n();return f.compensate&&T.push({name:s,value:A,compensate:f.compensate}),A}catch(A){let D=w(A);throw ee(D,{origin:"throw",thrown:A})}},getCompensations(){return T.map(o=>({name:o.name,hasValue:o.value!==void 0}))}};try{let o=await e(h),d=performance.now()-a;return l({type:"saga_success",sagaId:r,ts:Date.now(),durationMs:d}),Q(o)}catch(o){let d=performance.now()-a,i;te(o)?i=o.error:i=o,l({type:"saga_error",sagaId:r,ts:Date.now(),durationMs:d,error:i});let p=await m(i);if(p.length>0){let s={type:"SAGA_COMPENSATION_ERROR",originalError:i,compensationErrors:p};if(t?.onError?.(s),t?.throwOnCompensationFailure)throw s;return _(s)}return t?.onError?.(i),te(o)?_(i):_({type:"UNEXPECTED_ERROR",cause:{type:"UNCAUGHT_EXCEPTION",thrown:o}})}}function j(...e){let t={};for(let r of e)r.key!==void 0&&(t.key=r.key),r.retry!==void 0&&(t.retry=t.retry?{...t.retry,...r.retry}:{...r.retry}),r.timeout!==void 0&&(t.timeout=t.timeout?{...t.timeout,...r.timeout}:{...r.timeout});return t}function Le(...e){let t=j(...e);return r=>j(t,r??{})}function Ue(e,...t){return{name:e,policy:j(...t)}}function W(e){return{retry:e}}var Y={none:W({attempts:1}),transient:W({attempts:3,backoff:"exponential",initialDelay:100,maxDelay:1e3,jitter:!0}),standard:W({attempts:3,backoff:"exponential",initialDelay:200,maxDelay:5e3,jitter:!0}),aggressive:W({attempts:5,backoff:"exponential",initialDelay:500,maxDelay:3e4,jitter:!0}),fixed:(e,t)=>W({attempts:e,backoff:"fixed",initialDelay:t,jitter:!1}),linear:(e,t)=>W({attempts:e,backoff:"linear",initialDelay:t,jitter:!0}),custom:e=>W({backoff:"exponential",initialDelay:100,maxDelay:3e4,jitter:!0,...e})};function K(e){return{timeout:e}}var $={none:{},fast:K({ms:1e3}),api:K({ms:5e3}),extended:K({ms:3e4}),long:K({ms:12e4}),ms:e=>K({ms:e}),seconds:e=>K({ms:e*1e3}),withError:(e,t)=>K({ms:e,error:t}),withSignal:e=>K({ms:e,signal:!0})},Ne={httpApi:j($.api,Y.standard),database:j($.extended,W({attempts:2,backoff:"exponential",initialDelay:100,maxDelay:2e3,jitter:!0})),cache:j($.fast,Y.none),messageQueue:j($.extended,Y.aggressive),fileSystem:j($.long,Y.standard),rateLimited:j(K({ms:1e4}),W({attempts:5,backoff:"linear",initialDelay:1e3,maxDelay:1e4,jitter:!0}))};function fe(e,t){return j(e,t??{})}function Fe(e,t){let r=t??{};return j(...e,r)}function je(e,t,r={}){return e?t:r}function Be(e,t=process.env.NODE_ENV??"development",r={}){return e[t]??r}function Ke(){let e=new Map;return{register(t,r){e.set(t,r)},get(t){return e.get(t)},has(t){return e.has(t)},names(){return Array.from(e.keys())},apply(t,r){let a=e.get(t);if(!a)throw new Error(`Policy not found: ${t}`);return fe(a,r)}}}function We(){let e=[],t={key(r){return e.push({key:r}),t},policy(r){return e.push(r),t},timeout(r){return e.push(K({ms:r})),t},retry(r){return e.push(W(r)),t},retries(r){return e.push(Y.custom({attempts:r})),t},build(){return j(...e)}};return t}0&&(module.exports={CircuitOpenError,circuitBreakerPresets,conditionalPolicy,createCircuitBreaker,createCombinedLimiter,createConcurrencyLimiter,createCostBasedRateLimiter,createFixedWindowLimiter,createPolicyApplier,createPolicyBundle,createPolicyRegistry,createRateLimiter,createSagaWorkflow,envPolicy,isCircuitOpenError,isQueueFullError,isRateLimitExceededError,isSagaCompensationError,mergePolicies,rateLimiterPresets,retryPolicies,retryPolicy,runSaga,servicePolicies,stepOptions,timeoutPolicies,timeoutPolicy,withPolicies,withPolicy});
6
+ See: https://jagreehal.github.io/awaitly/guides/troubleshooting/#returning-ok-from-workflow-executor-double-wrapping`)}return Q(G)}catch(p){if(tt(p))throw p.thrown;if(P(p)){let j=p.meta.origin==="throw"?p.meta.thrown:p.meta.resultCause;if(f||n)return O(p.error,{cause:j});if(Je(p.error))return O(p.error,{cause:j});if(le(p.error))return O(p.error,{cause:j});let V=W(p);return O(V,{cause:j})}if(f){let j=f(p);return n?.(j,"unexpected",m),O(j,{cause:p})}let U={type:"UNEXPECTED_ERROR",cause:{type:"UNCAUGHT_EXCEPTION",thrown:p}};return n?.(U,"unexpected",m),O(U,{cause:p})}}ge.strict=(e,t)=>ge(e,t);var re=class extends Error{type="CIRCUIT_OPEN";circuitName;state;retryAfterMs;constructor(t){super(t.message??`Circuit breaker "${t.circuitName}" is ${t.state}. Retry after ${Math.ceil(t.retryAfterMs/1e3)}s`),this.name="CircuitOpenError",this.circuitName=t.circuitName,this.state=t.state,this.retryAfterMs=t.retryAfterMs}};function Se(e){return typeof e=="object"&&e!==null&&e.type==="CIRCUIT_OPEN"}var ot={failureThreshold:5,resetTimeout:3e4,windowSize:6e4,halfOpenMax:3};function be(e,t){let n={...ot,...t},a="CLOSED",f=[],l=null,m=null,h=0,s=0;function d(){let P=Date.now();f=f.filter(I=>P-I.timestamp<n.windowSize)}function i(P){if(a!==P){let I=a;a=P,P==="HALF_OPEN"&&(s=0),n.onStateChange?.(I,P,e)}}function c(){return a!=="OPEN"||l===null?!1:Date.now()-l>=n.resetTimeout?(i("HALF_OPEN"),!0):!1}function o(){m=Date.now(),h++,a==="HALF_OPEN"&&(s++,s>=n.halfOpenMax&&(i("CLOSED"),f=[]))}function r(P){let I=Date.now();l=I,d(),f.push({timestamp:I,error:P}),(a==="HALF_OPEN"||a==="CLOSED"&&f.length>=n.failureThreshold)&&i("OPEN")}function k(){if(a==="CLOSED")return 0;if(a==="OPEN"){if(c())return 0;let P=Date.now(),I=l?P-l:0;return Math.max(0,n.resetTimeout-I)}return 0}return{async execute(P,I){let W=k();if(W>0)throw new re({circuitName:e,state:a,retryAfterMs:W});try{let F=await P();return o(),F}catch(F){throw r(F),F}},async executeResult(P,I){let W=k();if(W>0)return O(new re({circuitName:e,state:a,retryAfterMs:W}));try{let F=await P();return F.ok?o():r(F.error),F}catch(F){throw r(F),F}},getState(){return a==="OPEN"&&c(),a},getStats(){return d(),{state:this.getState(),failureCount:f.length,successCount:h,lastFailureTime:l,lastSuccessTime:m,halfOpenSuccesses:s}},reset(){i("CLOSED"),f=[],s=0},forceOpen(){l=Date.now(),i("OPEN")},recordSuccess(){o()},recordFailure(P){r(P??new Error("Manual failure"))}}}var he={critical:{failureThreshold:3,resetTimeout:6e4,windowSize:3e4,halfOpenMax:1},standard:{failureThreshold:5,resetTimeout:3e4,windowSize:6e4,halfOpenMax:3},lenient:{failureThreshold:10,resetTimeout:15e3,windowSize:12e4,halfOpenMax:5}};function Pe(e){return typeof e=="object"&&e!==null&&e.type==="RATE_LIMIT_EXCEEDED"}function ye(e){return typeof e=="object"&&e!==null&&e.type==="QUEUE_FULL"}function de(e,t){let{maxPerSecond:n,strategy:a="wait"}=t,f=t.burstCapacity??n*2,l=f,m=Date.now(),h=n/1e3,s=[];function d(){let o=Date.now(),k=(o-m)*h;l=Math.min(f,l+k),m=o}function i(){if(d(),l>=1)return l-=1,0;let o=1-l;return Math.ceil(o/h)}async function c(){return new Promise(o=>{let r=()=>{let k=i();k===0?o():(s.push(r),setTimeout(()=>{let P=s.indexOf(r);P!==-1&&(s.splice(P,1),r())},k))};r()})}return{async execute(o){let r=i();if(r>0){if(a==="reject")throw{type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:r};await c()}return o()},async executeResult(o){let r=i();if(r>0){if(a==="reject")return O({type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:r});await c()}return o()},getStats(){return d(),{availableTokens:Math.floor(l),maxTokens:f,tokensPerSecond:n,waitingCount:s.length}},reset(){l=f,m=Date.now(),s.length=0}}}function fe(e,t){let{maxConcurrent:n,strategy:a="queue",maxQueueSize:f=1/0}=t,l=0,m=[];async function h(){if(l<n){l++;return}if(a==="reject")throw{type:"QUEUE_FULL",limiterName:e,queueSize:m.length,maxQueueSize:f};if(m.length>=f)throw{type:"QUEUE_FULL",limiterName:e,queueSize:m.length,maxQueueSize:f};return new Promise((d,i)=>{m.push({resolve:d,reject:i})})}function s(){l--,m.length>0&&l<n&&(l++,m.shift()?.resolve())}return{async execute(d){await h();try{return await d()}finally{s()}},async executeAll(d){let i=new Array(d.length),c=[];for(let o=0;o<d.length;o++){let r=o,k=this.execute(d[r]).then(P=>{i[r]=P});c.push(k)}return await Promise.all(c),i},async executeResult(d){try{await h()}catch(i){if(ye(i))return O(i);throw i}try{return await d()}finally{s()}},getStats(){return{activeCount:l,maxConcurrent:n,queueSize:m.length,maxQueueSize:f}},reset(){for(l=0;m.length>0;)m.shift()?.reject(new Error("Limiter reset"))}}}function Ae(e,t){let n=t.rate?de(`${e}-rate`,t.rate):void 0,a=t.concurrency?fe(`${e}-concurrency`,t.concurrency):void 0;return{rate:n,concurrency:a,async execute(f){let l=f;if(n){let m=l;l=()=>n.execute(m)}return a?a.execute(l):l()}}}function Oe(e,t){let{limit:n,windowMs:a=1e3,strategy:f="wait"}=t,l=Date.now(),m=0,h=[];function s(){let c=Date.now(),o=c-l;return o>=a?(l=c,m=0,0):a-o}function d(c){let o=s();return m+c<=n?(m+=c,0):o}async function i(c){return new Promise(o=>{let r=()=>{let k=d(c);k===0?o():(h.push({resolve:r,cost:c}),setTimeout(()=>{let P=h.findIndex(I=>I.resolve===r);P!==-1&&(h.splice(P,1),r())},k))};r()})}return{async execute(c,o=1){if(o>n)throw{type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:a};let r=d(o);if(r>0){if(f==="reject")throw{type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:r};await i(o)}return c()},async executeResult(c,o=1){if(o>n)return O({type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:a});let r=d(o);if(r>0){if(f==="reject")return O({type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:r});await i(o)}return c()},getStats(){let c=s();return{requestCount:m,limit:n,windowMs:a,remainingMs:c,waitingCount:h.length}},reset(){l=Date.now(),m=0,h.length=0}}}function _e(e,t){let{tokensPerSecond:n,strategy:a="wait"}=t,f=t.maxTokens??n*2,l=f,m=Date.now(),h=n/1e3,s=[];function d(){let o=Date.now(),k=(o-m)*h;l=Math.min(f,l+k),m=o}function i(o){if(d(),l>=o)return l-=o,0;let r=o-l;return Math.ceil(r/h)}async function c(o){return new Promise(r=>{let k=()=>{let P=i(o);P===0?r():(s.push({check:k,cost:o}),setTimeout(()=>{let I=s.findIndex(W=>W.check===k);I!==-1&&(s.splice(I,1),k())},P))};k()})}return{async execute(o,r=1){if(r>f)throw{type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:Math.ceil(r/h)};let k=i(r);if(k>0){if(a==="reject")throw{type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:k};await c(r)}return o()},async executeResult(o,r=1){if(r>f)return O({type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:Math.ceil(r/h)});let k=i(r);if(k>0){if(a==="reject")return O({type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:k});await c(r)}return o()},getStats(){return d(),{availableTokens:l,maxTokens:f,tokensPerSecond:n,waitingCount:s.length}},reset(){l=f,m=Date.now(),s.length=0}}}var ve={api:{maxPerSecond:10,burstCapacity:20,strategy:"wait"},database:{maxConcurrent:10,strategy:"queue",maxQueueSize:100},external:{maxPerSecond:5,burstCapacity:10,strategy:"wait"}};function Ie(e){return typeof e=="object"&&e!==null&&e.type==="SAGA_COMPENSATION_ERROR"}function De(e,t){return async n=>{let a=crypto.randomUUID(),f=performance.now(),l=[],m=d=>{t?.onEvent?.(d)};m({type:"saga_start",sagaId:a,ts:Date.now()});async function h(d){let i=[];m({type:"saga_compensation_start",sagaId:a,ts:Date.now(),stepCount:l.length});let c=performance.now();for(let o=l.length-1;o>=0;o--){let r=l[o];try{await r.compensate(r.value),m({type:"saga_compensation_step",sagaId:a,stepName:r.name,ts:Date.now(),success:!0})}catch(k){i.push({stepName:r.name,error:k}),m({type:"saga_compensation_step",sagaId:a,stepName:r.name,ts:Date.now(),success:!1,error:k})}}return m({type:"saga_compensation_end",sagaId:a,ts:Date.now(),durationMs:performance.now()-c,success:i.length===0,failedCount:i.length}),i}let s={step:async function(i,c,o){if(typeof i!="string"||i.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 r=await c();if(r.ok)return o?.compensate&&l.push({name:i,value:r.value,compensate:o.compensate}),r.value;throw ee(r.error,{origin:"result",resultCause:r.cause})},tryStep:async function(i,c,o){if(typeof i!="string"||i.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 r="error"in o?()=>o.error:o.onError;try{let k=await c();return o.compensate&&l.push({name:i,value:k,compensate:o.compensate}),k}catch(k){let P=r(k);throw ee(P,{origin:"throw",thrown:k})}},getCompensations(){return l.map(d=>({name:d.name,hasValue:d.value!==void 0}))}};try{let d=await n(s,e),i=performance.now()-f;return m({type:"saga_success",sagaId:a,ts:Date.now(),durationMs:i}),Q(d)}catch(d){let i=performance.now()-f,c;te(d)?c=d.error:c=d,m({type:"saga_error",sagaId:a,ts:Date.now(),durationMs:i,error:c});let o=await h(c);if(o.length>0){let r={type:"SAGA_COMPENSATION_ERROR",originalError:c,compensationErrors:o};if(t?.onError?.(r),t?.throwOnCompensationFailure)throw r;return O(r)}return t?.onError?.(c),te(d)?O(c):O({type:"UNEXPECTED_ERROR",cause:{type:"UNCAUGHT_EXCEPTION",thrown:d}})}}}async function Me(e,t){let n=crypto.randomUUID(),a=performance.now(),f=[],l=s=>{t?.onEvent?.(s)};l({type:"saga_start",sagaId:n,ts:Date.now()});async function m(s){let d=[];l({type:"saga_compensation_start",sagaId:n,ts:Date.now(),stepCount:f.length});let i=performance.now();for(let c=f.length-1;c>=0;c--){let o=f[c];try{await o.compensate(o.value),l({type:"saga_compensation_step",sagaId:n,stepName:o.name,ts:Date.now(),success:!0})}catch(r){d.push({stepName:o.name,error:r}),l({type:"saga_compensation_step",sagaId:n,stepName:o.name,ts:Date.now(),success:!1,error:r})}}return l({type:"saga_compensation_end",sagaId:n,ts:Date.now(),durationMs:performance.now()-i,success:d.length===0,failedCount:d.length}),d}let h={step:async function(d,i,c){if(typeof d!="string"||d.length===0)throw new TypeError("saga.step(name, operation, options?): first argument must be a string (step name). Example: saga.step('createOrder', () => deps.createOrder(), { compensate: (o) => deps.cancelOrder(o) })");let o=await i();if(o.ok)return c?.compensate&&f.push({name:d,value:o.value,compensate:c.compensate}),o.value;throw ee(o.error,{origin:"result",resultCause:o.cause})},tryStep:async function(d,i,c){if(typeof d!="string"||d.length===0)throw new TypeError("saga.tryStep(name, operation, options): first argument must be a string (step name). Example: saga.tryStep('riskyOp', () => deps.riskyOp(), { error: 'RISKY_FAILED' })");let o="error"in c?()=>c.error:c.onError;try{let r=await i();return c.compensate&&f.push({name:d,value:r,compensate:c.compensate}),r}catch(r){let k=o(r);throw ee(k,{origin:"throw",thrown:r})}},getCompensations(){return f.map(s=>({name:s.name,hasValue:s.value!==void 0}))}};try{let s=await e(h),d=performance.now()-a;return l({type:"saga_success",sagaId:n,ts:Date.now(),durationMs:d}),Q(s)}catch(s){let d=performance.now()-a,i;te(s)?i=s.error:i=s,l({type:"saga_error",sagaId:n,ts:Date.now(),durationMs:d,error:i});let c=await m(i);if(c.length>0){let o={type:"SAGA_COMPENSATION_ERROR",originalError:i,compensationErrors:c};if(t?.onError?.(o),t?.throwOnCompensationFailure)throw o;return O(o)}return t?.onError?.(i),te(s)?O(i):O({type:"UNEXPECTED_ERROR",cause:{type:"UNCAUGHT_EXCEPTION",thrown:s}})}}function N(...e){let t={};for(let n of e)n.key!==void 0&&(t.key=n.key),n.retry!==void 0&&(t.retry=t.retry?{...t.retry,...n.retry}:{...n.retry}),n.timeout!==void 0&&(t.timeout=t.timeout?{...t.timeout,...n.timeout}:{...n.timeout});return t}function Le(...e){let t=N(...e);return n=>N(t,n??{})}function Ue(e,...t){return{name:e,policy:N(...t)}}function B(e){return{retry:e}}var $={none:B({attempts:1}),transient:B({attempts:3,backoff:"exponential",initialDelay:100,maxDelay:1e3,jitter:!0}),standard:B({attempts:3,backoff:"exponential",initialDelay:200,maxDelay:5e3,jitter:!0}),aggressive:B({attempts:5,backoff:"exponential",initialDelay:500,maxDelay:3e4,jitter:!0}),fixed:(e,t)=>B({attempts:e,backoff:"fixed",initialDelay:t,jitter:!1}),linear:(e,t)=>B({attempts:e,backoff:"linear",initialDelay:t,jitter:!0}),custom:e=>B({backoff:"exponential",initialDelay:100,maxDelay:3e4,jitter:!0,...e})};function K(e){return{timeout:e}}var z={none:{},fast:K({ms:1e3}),api:K({ms:5e3}),extended:K({ms:3e4}),long:K({ms:12e4}),ms:e=>K({ms:e}),seconds:e=>K({ms:e*1e3}),withError:(e,t)=>K({ms:e,error:t}),withSignal:e=>K({ms:e,signal:!0})},Ne={httpApi:N(z.api,$.standard),database:N(z.extended,B({attempts:2,backoff:"exponential",initialDelay:100,maxDelay:2e3,jitter:!0})),cache:N(z.fast,$.none),messageQueue:N(z.extended,$.aggressive),fileSystem:N(z.long,$.standard),rateLimited:N(K({ms:1e4}),B({attempts:5,backoff:"linear",initialDelay:1e3,maxDelay:1e4,jitter:!0}))};function Te(e,t){return N(e,t??{})}function Fe(e,t){let n=t??{};return N(...e,n)}function je(e,t,n={}){return e?t:n}function Ke(e,t=process.env.NODE_ENV??"development",n={}){return e[t]??n}function Be(){let e=new Map;return{register(t,n){e.set(t,n)},get(t){return e.get(t)},has(t){return e.has(t)},names(){return Array.from(e.keys())},apply(t,n){let a=e.get(t);if(!a)throw new Error(`Policy not found: ${t}`);return Te(a,n)}}}function We(){let e=[],t={key(n){return e.push({key:n}),t},policy(n){return e.push(n),t},timeout(n){return e.push(K({ms:n})),t},retry(n){return e.push(B(n)),t},retries(n){return e.push($.custom({attempts:n})),t},build(){return N(...e)}};return t}0&&(module.exports={CircuitOpenError,circuitBreakerPresets,conditionalPolicy,createCircuitBreaker,createCombinedLimiter,createConcurrencyLimiter,createCostBasedRateLimiter,createFixedWindowLimiter,createPolicyApplier,createPolicyBundle,createPolicyRegistry,createRateLimiter,createSagaWorkflow,envPolicy,isCircuitOpenError,isQueueFullError,isRateLimitExceededError,isSagaCompensationError,mergePolicies,rateLimiterPresets,retryPolicies,retryPolicy,runSaga,servicePolicies,stepOptions,timeoutPolicies,timeoutPolicy,withPolicies,withPolicy});
7
7
  //# sourceMappingURL=reliability.cjs.map