awaitly 1.32.0 → 1.32.1

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