awaitly 1.26.0 → 1.28.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/durable.cjs +3 -12
- package/dist/durable.cjs.map +1 -1
- package/dist/durable.d.cts +2 -2
- package/dist/durable.d.ts +2 -2
- package/dist/durable.js +3 -12
- package/dist/durable.js.map +1 -1
- package/dist/{guards-d0e2njEc.d.ts → guards-BfPjioTg.d.ts} +6 -2
- package/dist/{guards-C80WxKmr.d.cts → guards-wMh5ru27.d.cts} +6 -2
- package/dist/{hitl-DDkO2PjR.d.cts → hitl-D_Qjm6rw.d.cts} +1 -1
- package/dist/{hitl-By3ojQ6l.d.ts → hitl-RfJmvwUD.d.ts} +1 -1
- package/dist/hitl.cjs +2 -2
- package/dist/hitl.cjs.map +1 -1
- package/dist/hitl.d.cts +4 -4
- package/dist/hitl.d.ts +4 -4
- package/dist/hitl.js +2 -2
- package/dist/hitl.js.map +1 -1
- package/dist/{persistence-entry-Bq1dv7DQ.d.ts → persistence-entry-C-K057ok.d.ts} +65 -82
- package/dist/{persistence-entry-UhxTwE4Y.d.cts → persistence-entry-C0_kiSlE.d.cts} +65 -82
- package/dist/persistence.cjs +1 -1
- package/dist/persistence.cjs.map +1 -1
- package/dist/persistence.d.cts +1 -1
- package/dist/persistence.d.ts +1 -1
- package/dist/persistence.js +1 -1
- package/dist/persistence.js.map +1 -1
- package/dist/testing.d.cts +1 -1
- package/dist/testing.d.ts +1 -1
- package/dist/webhook.cjs +2 -2
- package/dist/webhook.cjs.map +1 -1
- package/dist/webhook.d.cts +1 -1
- package/dist/webhook.d.ts +1 -1
- package/dist/webhook.js +2 -2
- package/dist/webhook.js.map +1 -1
- package/dist/workflow.cjs +3 -12
- package/dist/workflow.cjs.map +1 -1
- package/dist/workflow.d.cts +68 -5
- package/dist/workflow.d.ts +68 -5
- package/dist/workflow.js +3 -12
- package/dist/workflow.js.map +1 -1
- package/package.json +2 -2
package/dist/durable.cjs
CHANGED
|
@@ -1,20 +1,11 @@
|
|
|
1
|
-
"use strict";var et=Object.defineProperty;var It=Object.getOwnPropertyDescriptor;var Mt=Object.getOwnPropertyNames;var Wt=Object.prototype.hasOwnProperty;var Ut=(e,r)=>{for(var i in r)et(e,i,{get:r[i],enumerable:!0})},Nt=(e,r,i,c)=>{if(r&&typeof r=="object"||typeof r=="function")for(let E of Mt(r))!Wt.call(e,E)&&E!==i&&et(e,E,{get:()=>r[E],enumerable:!(c=It(r,E))||c.enumerable});return e};var jt=e=>Nt(et({},"__esModule",{value:!0}),e);var rn={};Ut(rn,{durable:()=>Pt,isConcurrentExecution:()=>At,isPersistenceError:()=>vt,isVersionMismatch:()=>Ot,isWorkflowCancelled:()=>be});module.exports=jt(rn);function Ft(e){let r=e.trim().match(/^(\d+(?:\.\d+)?)\s*(ms|s|m|h|d)$/i);if(!r)return;let i=parseFloat(r[1]),c=r[2].toLowerCase();return{_tag:"Duration",millis:i*({ms:1,s:1e3,m:6e4,h:36e5,d:864e5}[c]??1)}}var Et="UNEXPECTED_ERROR";function rt(e){return Et}var J=e=>({ok:!0,value:e}),U=(e,r)=>({ok:!1,error:e,...r?.cause!==void 0?{cause:r.cause}:{}});var yt=e=>e===Et||typeof e=="object"&&e!==null&&e.type==="UNEXPECTED_ERROR";var Me=Symbol.for("step_timeout_marker");function ft(e){return typeof e!="object"||e===null?!1:e.type==="STEP_TIMEOUT"?!0:Me in e}function Kt(e){if(!(typeof e!="object"||e===null)){if(e.type==="STEP_TIMEOUT"){let r=e;return{timeoutMs:r.timeoutMs,stepName:r.stepName,stepKey:r.stepKey,attempt:r.attempt}}if(Me in e)return e[Me]}}var kt=Symbol("early-exit");function Ke(e,r){return{[kt]:!0,error:e,meta:r}}function Ve(e){return typeof e=="object"&&e!==null&&e[kt]===!0}var gt=Symbol("mapper-exception");function Vt(e){return{[gt]:!0,thrown:e}}function Lt(e){return typeof e=="object"&&e!==null&&e[gt]===!0}function tt(e,r){let{backoff:i,initialDelay:c,maxDelay:E,jitter:h}=r,x;switch(i){case"fixed":x=c;break;case"linear":x=c*e;break;case"exponential":x=c*Math.pow(2,e-1);break}if(x=Math.min(x,E),h){let _=x*.25*Math.random();x=x+_}return Math.floor(x)}function nt(e){return new Promise(r=>setTimeout(r,e))}var mt=Symbol("timeout"),Be=Symbol("timeout-option");function $t(e){return typeof e=="object"&&e!==null&&e[Be]===!0}async function Bt(e,r,i,c){let E=new AbortController,h=r.onTimeout??"error",x=()=>typeof h=="function"?h({name:i.name,key:i.key,ms:r.ms}):r.error??{type:"STEP_TIMEOUT",stepName:i.name,stepKey:i.key,timeoutMs:r.ms,attempt:i.attempt},_;c?.aborted&&E.abort(c.reason);let X;c&&!c.aborted&&(X=()=>E.abort(c.reason),c.addEventListener("abort",X,{once:!0}));let y=new Promise((W,ie)=>{_=setTimeout(()=>{if(h!=="disconnect"&&E.abort(),h==="option"){ie({[Be]:!0,ms:r.ms});return}ie({[mt]:!0,error:x()})},r.ms)}),te;r.signal?te=Promise.resolve(e(E.signal)):te=Promise.resolve(e());try{return await Promise.race([te,y])}catch(W){if(typeof W=="object"&&W!==null&&W[Be]===!0)throw{[Be]:!0,ms:r.ms};if(typeof W=="object"&&W!==null&&W[mt]===!0){h==="disconnect"&&te.catch(()=>{});let ie=W.error;if(typeof ie=="object"&&ie!==null&&ie.type!=="STEP_TIMEOUT"){let we={timeoutMs:r.ms,stepName:i.name,stepKey:i.key,attempt:i.attempt};Me in ie?ie[Me]=we:Object.defineProperty(ie,Me,{value:we,enumerable:!1,writable:!0,configurable:!1})}throw ie}throw W}finally{clearTimeout(_),X&&c&&c.removeEventListener("abort",X)}}var Ie={backoff:"exponential",initialDelay:100,maxDelay:3e4,jitter:!0,retryOn:()=>!0,onRetry:()=>{}};async function He(e,r){let{onError:i,onEvent:c,catchUnexpected:E,workflowId:h,workflowName:x,context:_,_workflowSignal:X}=r&&typeof r=="object"?r:{},y=h??crypto.randomUUID(),te=E??rt,W=[],ie=0,we=m=>m??`step_${++ie}`,C=m=>{let ne=m.context!==void 0||_===void 0?m:{...m,context:_},le=x!==void 0&&ne.workflowName===void 0?{...ne,workflowName:x}:ne;if(le.type==="step_success"){let ce=le.stepId;for(let Te=W.length-1;Te>=0;Te--){let oe=W[Te];if(oe.type==="race"&&!oe.winnerId){oe.winnerId=ce;break}}}c?.(le,_)},Z=Ke,ee=m=>Ve(m),ue=(m,ne)=>m,ke=m=>typeof m=="function"?!1:!!(m&&typeof m=="object"&&"ok"in m||m&&typeof m=="object"&&"then"in m&&typeof m.then=="function");try{let ne=function(t){let o={};for(let[n,p]of Object.entries(t))if(typeof p=="function")o[n]=p;else if(p&&typeof p=="object"&&"fn"in p)o[n]=p.fn;else throw new TypeError(`step.parallel: operation "${n}" must be a function or { fn, errors? } object`);return o},le=function(t,o){let n=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let p=performance.now(),a=!1;W.push({scopeId:n,type:"parallel"});let s=()=>{if(a)return;a=!0;let l=W.findIndex(k=>k.scopeId===n);l!==-1&&W.splice(l,1),C({type:"scope_end",workflowId:y,scopeId:n,ts:Date.now(),durationMs:performance.now()-p})};C({type:"scope_start",workflowId:y,scopeId:n,scopeType:"parallel",name:t,ts:Date.now()});try{let l=await o();if(s(),!l.ok)throw i?.(l.error,t,_),Z(l.error,{origin:"result",resultCause:l.cause});return l.value}catch(l){throw s(),l}})()},ce=function(t,o){let n=Object.keys(t),p=o.name??`Parallel(${n.join(", ")})`,a=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let s=performance.now(),l=!1;W.push({scopeId:a,type:"parallel"});let k=()=>{if(l)return;l=!0;let u=W.findIndex(T=>T.scopeId===a);u!==-1&&W.splice(u,1),C({type:"scope_end",workflowId:y,scopeId:a,ts:Date.now(),durationMs:performance.now()-s})};C({type:"scope_start",workflowId:y,scopeId:a,scopeType:"parallel",name:p,ts:Date.now()});try{let u=await new Promise(g=>{if(n.length===0){g([]);return}let L=!1,K=n.length,Ae=new Array(n.length);for(let pe=0;pe<n.length;pe++){let Ee=n[pe],q=pe;Promise.resolve(t[Ee]()).catch(ye=>U({type:"PROMISE_REJECTED",cause:ye},{cause:{type:"PROMISE_REJECTION",reason:ye}})).then(ye=>{if(!L){if(!ye.ok){L=!0,g([{key:Ee,result:ye}]);return}Ae[q]={key:Ee,result:ye},K--,K===0&&g(Ae)}})}});k();let T={};for(let{key:g,result:L}of u){if(!L.ok)throw i?.(L.error,g,_),Z(L.error,{origin:"result",resultCause:L.cause});T[g]=L.value}return T}catch(u){throw k(),u}})()};var Le=ne,Oe=le,V=ce;let m=(t,o,n)=>(async()=>{if(typeof t!="string"||t.length===0)throw new Error('[awaitly] step() requires an explicit string ID as the first argument. Example: step("fetchUser", () => fetchUser(id))');let p=n??{},a=t,s=p.key??t,l=p.key??t,{description:k,retry:u,timeout:T}=p,g=we(s),L=c,K=L?performance.now():0,pe=ke(o)?()=>o:o,q={attempts:Math.max(1,u?.attempts??1),backoff:u?.backoff??Ie.backoff,initialDelay:u?.initialDelay??Ie.initialDelay,maxDelay:u?.maxDelay??Ie.maxDelay,jitter:u?.jitter??Ie.jitter,retryOn:u?.retryOn??Ie.retryOn,onRetry:u?.onRetry??Ie.onRetry};c&&C({type:"step_start",workflowId:y,stepId:g,stepKey:s,name:a,description:k,ts:Date.now()});let ye;for(let O=1;O<=q.attempts;O++){let Qe=L?performance.now():0;try{let M;if(T?M=await Bt(pe,T,{name:a,key:s,attempt:O},X):M=await pe(),M.ok){let ge=performance.now()-K;return C({type:"step_success",workflowId:y,stepId:g,stepKey:s,name:a,description:k,ts:Date.now(),durationMs:ge}),l&&C({type:"step_complete",workflowId:y,stepKey:l,name:a,description:k,ts:Date.now(),durationMs:ge,result:M}),M.value}if(ye=M,O<q.attempts&&q.retryOn(M.error,O)){let ge=tt(O,q);C({type:"step_retry",workflowId:y,stepId:g,stepKey:s,name:a,ts:Date.now(),attempt:O+1,maxAttempts:q.attempts,delayMs:ge,error:M.error}),q.onRetry(M.error,O,ge),await nt(ge);continue}q.attempts>1&&C({type:"step_retries_exhausted",workflowId:y,stepId:g,stepKey:s,name:a,ts:Date.now(),durationMs:performance.now()-K,attempts:O,lastError:M.error});break}catch(M){let ge=performance.now()-Qe;if($t(M)){let de=M.ms;C({type:"step_timeout",workflowId:y,stepId:g,stepKey:s,name:a,ts:Date.now(),timeoutMs:de,attempt:O}),C({type:"step_success",workflowId:y,stepId:g,stepKey:s,name:a,description:k,ts:Date.now(),durationMs:performance.now()-K}),l&&C({type:"step_complete",workflowId:y,stepKey:l,name:a,description:k,ts:Date.now(),durationMs:performance.now()-K,result:J(void 0)});return}if(ee(M))throw C({type:"step_aborted",workflowId:y,stepId:g,stepKey:s,name:a,description:k,ts:Date.now(),durationMs:ge}),M;if(ft(M)){let de=Kt(M),Pe=T?.ms??de?.timeoutMs??0;if(C({type:"step_timeout",workflowId:y,stepId:g,stepKey:s,name:a,ts:Date.now(),timeoutMs:Pe,attempt:O}),O<q.attempts&&q.retryOn(M,O)){let _e=tt(O,q);C({type:"step_retry",workflowId:y,stepId:g,stepKey:s,name:a,ts:Date.now(),attempt:O+1,maxAttempts:q.attempts,delayMs:_e,error:M}),q.onRetry(M,O,_e),await nt(_e);continue}q.attempts>1&&C({type:"step_retries_exhausted",workflowId:y,stepId:g,stepKey:s,name:a,ts:Date.now(),durationMs:performance.now()-K,attempts:O,lastError:M});let Re=performance.now()-K;throw C({type:"step_error",workflowId:y,stepId:g,stepKey:s,name:a,description:k,ts:Date.now(),durationMs:Re,error:M}),l&&C({type:"step_complete",workflowId:y,stepKey:l,name:a,description:k,ts:Date.now(),durationMs:Re,result:U(M,{cause:M}),meta:{origin:"throw",thrown:M}}),i?.(M,a,_),Z(M,{origin:"throw",thrown:M})}if(O<q.attempts&&q.retryOn(M,O)){let de=tt(O,q);C({type:"step_retry",workflowId:y,stepId:g,stepKey:s,name:a,ts:Date.now(),attempt:O+1,maxAttempts:q.attempts,delayMs:de,error:M}),q.onRetry(M,O,de),await nt(de);continue}q.attempts>1&&!ft(M)&&C({type:"step_retries_exhausted",workflowId:y,stepId:g,stepKey:s,name:a,ts:Date.now(),durationMs:performance.now()-K,attempts:O,lastError:M});let N=performance.now()-K,fe;try{fe=te(M)}catch(de){throw Vt(de)}throw C({type:"step_error",workflowId:y,stepId:g,stepKey:s,name:a,description:k,ts:Date.now(),durationMs:N,error:fe}),l&&C({type:"step_complete",workflowId:y,stepKey:l,name:a,description:k,ts:Date.now(),durationMs:N,result:U(fe,{cause:M}),meta:{origin:"throw",thrown:M}}),i?.(fe,a,_),Z(fe,{origin:"throw",thrown:M})}}let he=ye,Ue=performance.now()-K,ve=ue(he.error,{origin:"result",resultCause:he.cause});throw C({type:"step_error",workflowId:y,stepId:g,stepKey:s,name:a,description:k,ts:Date.now(),durationMs:Ue,error:ve}),l&&C({type:"step_complete",workflowId:y,stepKey:l,name:a,description:k,ts:Date.now(),durationMs:Ue,result:he,meta:{origin:"result",resultCause:he.cause}}),i?.(ve,a,_),Z(ve,{origin:"result",resultCause:he.cause})})();m.try=(t,o,n)=>{if(typeof t!="string"||t.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 p=n.key??t,a=t,s=t,l="error"in n?()=>n.error:n.onError,k=c;return(async()=>{let u=k?performance.now():0;c&&C({type:"step_start",workflowId:y,stepId:s,stepKey:p,name:a,ts:Date.now()});try{let T=await o(),g=performance.now()-u;return C({type:"step_success",workflowId:y,stepId:s,stepKey:p,name:a,ts:Date.now(),durationMs:g}),p&&C({type:"step_complete",workflowId:y,stepKey:p,name:a,ts:Date.now(),durationMs:g,result:J(T)}),T}catch(T){let g=l(T),L=performance.now()-u,K=ue(g,{origin:"throw",thrown:T});throw C({type:"step_error",workflowId:y,stepId:s,stepKey:p,name:a,ts:Date.now(),durationMs:L,error:K}),p&&C({type:"step_complete",workflowId:y,stepKey:p,name:a,ts:Date.now(),durationMs:L,result:U(g,{cause:T}),meta:{origin:"throw",thrown:T}}),i?.(K,a,_),Z(K,{origin:"throw",thrown:T})}})()},m.fromResult=(t,o,n)=>{if(typeof t!="string"||t.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 p=n.key??t,a=t,s=t,l="error"in n?()=>n.error:n.onError,k=c;return(async()=>{let u=k?performance.now():0;c&&C({type:"step_start",workflowId:y,stepId:s,stepKey:p,name:a,ts:Date.now()});let T=await o();if(T.ok){let g=performance.now()-u;return C({type:"step_success",workflowId:y,stepId:s,stepKey:p,name:a,ts:Date.now(),durationMs:g}),p&&C({type:"step_complete",workflowId:y,stepKey:p,name:a,ts:Date.now(),durationMs:g,result:J(T.value)}),T.value}else{let g=l(T.error),L=performance.now()-u,K=ue(g,{origin:"result",resultCause:T.error});throw C({type:"step_error",workflowId:y,stepId:s,stepKey:p,name:a,ts:Date.now(),durationMs:L,error:K}),p&&C({type:"step_complete",workflowId:y,stepKey:p,name:a,ts:Date.now(),durationMs:L,result:U(g,{cause:T.error}),meta:{origin:"result",resultCause:T.error}}),i?.(K,a,_),Z(K,{origin:"result",resultCause:T.error})}})()},m.retry=(t,o,n)=>{if(typeof t!="string"||t.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 m(t,o,{key:n.key??t,retry:{attempts:n.attempts,backoff:n.backoff,initialDelay:n.initialDelay,maxDelay:n.maxDelay,jitter:n.jitter,retryOn:n.retryOn,onRetry:n.onRetry},timeout:n.timeout})},m.withTimeout=(t,o,n)=>{if(typeof t!="string"||t.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 m(t,o,{key:n.key??t,timeout:n})},m.sleep=(t,o,n)=>{if(typeof t!="string"||t.length===0)throw new Error('[awaitly] step.sleep() requires an explicit string ID as the first argument. Example: step.sleep("delay", "5s")');let p=typeof o=="string"?Ft(o):o;if(!p)throw new Error(`step.sleep: invalid duration '${o}'`);let a=p.millis,s=n?.signal;return m(t,async()=>{if(X?.aborted||s?.aborted){let l=new Error("Sleep aborted");throw l.name="AbortError",l}return new Promise((l,k)=>{let u={timeoutId:void 0},T=()=>{u.timeoutId&&clearTimeout(u.timeoutId);let g=new Error("Sleep aborted");g.name="AbortError",k(g)};X?.addEventListener("abort",T,{once:!0}),s?.addEventListener("abort",T,{once:!0}),u.timeoutId=setTimeout(()=>{X?.removeEventListener("abort",T),s?.removeEventListener("abort",T),l(J(void 0))},a)})},{key:n?.key??t,description:n?.description})},m.parallel=((...t)=>{if(typeof t[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 o=t[0],n=t[1];if(typeof n=="function")return le(o,n);if(n&&typeof n=="object"&&!Array.isArray(n)){let a=ne(n);return ce(a,{name:o})}throw new TypeError("step.parallel(name, ...): second argument must be a function (array form) or an object of operations (object form).")}),m.race=(t,o)=>{let n=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let p=performance.now(),a=!1,s={scopeId:n,type:"race",winnerId:void 0};W.push(s);let l=()=>{if(a)return;a=!0;let k=W.findIndex(u=>u.scopeId===n);k!==-1&&W.splice(k,1),C({type:"scope_end",workflowId:y,scopeId:n,ts:Date.now(),durationMs:performance.now()-p,winnerId:s.winnerId})};C({type:"scope_start",workflowId:y,scopeId:n,scopeType:"race",name:t,ts:Date.now()});try{let k=await o();if(l(),!k.ok)throw i?.(k.error,t,_),Z(k.error,{origin:"result",resultCause:k.cause});return k.value}catch(k){throw l(),k}})()},m.allSettled=(t,o)=>{let n=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let p=performance.now(),a=!1;W.push({scopeId:n,type:"allSettled"});let s=()=>{if(a)return;a=!0;let l=W.findIndex(k=>k.scopeId===n);l!==-1&&W.splice(l,1),C({type:"scope_end",workflowId:y,scopeId:n,ts:Date.now(),durationMs:performance.now()-p})};C({type:"scope_start",workflowId:y,scopeId:n,scopeType:"allSettled",name:t,ts:Date.now()});try{let l=await o();if(s(),!l.ok)throw i?.(l.error,t,_),Z(l.error,{origin:"result",resultCause:l.cause});return l.value}catch(l){throw s(),l}})()},m.if=(t,o,n)=>n(),m.label=m.if,m.branch=async(t,o)=>{let{condition:n,then:p,else:a}=o;if(n())return await p();if(a)return await a()},m.arm=(t,o)=>({fn:t,errors:o}),m.forEach=async(t,o,n)=>{let p=[],a=n.maxIterations,s=0,l="run"in n,k=Symbol.asyncIterator in o?o:(async function*(){yield*o})();for await(let u of k){if(a!==void 0&&s>=a)break;let T;l?T=await n.run(u,s):T=await n.item.handler(u,s,m),p.push(T),s++}return p},m.item=t=>({__forEachItemHandler:!0,handler:t}),m.dep=(t,o)=>o,m.run=(t,o,n)=>m(t,()=>o,n),m.andThen=(t,o,n,p)=>m(t,()=>n(o),p),m.match=async(t,o,n,p)=>m(t,async()=>{let a=await o;return a.ok?J(await n.ok(a.value)):J(await n.err(a.error,a.cause))},p),m.all=m.parallel,m.map=async(t,o,n,p)=>{let a=p?.concurrency??o.length;return m(t,()=>a>=o.length?wt(o.map((s,l)=>n(s,l))):(async()=>{let s=[];for(let l=0;l<o.length;l+=a){let k=o.slice(l,l+a),u=await wt(k.map((T,g)=>n(T,l+g)));if(!u.ok)return u;s.push(...u.value)}return J(s)})(),{key:p?.key})};let oe=await e({step:m});if(process.env.NODE_ENV!=="production"&&oe!==null&&typeof oe=="object"&&"ok"in oe&&typeof oe.ok=="boolean"){let t=oe;(t.ok===!0&&"value"in t||t.ok===!1&&"error"in t)&&console.warn(`awaitly: Workflow executor returned a Result-like object. Return raw values, not ok() or err().
|
|
1
|
+
"use strict";var je=Object.defineProperty;var Et=Object.getOwnPropertyDescriptor;var wt=Object.getOwnPropertyNames;var yt=Object.prototype.hasOwnProperty;var kt=(e,t)=>{for(var o in t)je(e,o,{get:t[o],enumerable:!0})},Rt=(e,t,o,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let w of wt(t))!yt.call(e,w)&&w!==o&&je(e,w,{get:()=>t[w],enumerable:!(a=Et(t,w))||a.enumerable});return e};var Tt=e=>Rt(je({},"__esModule",{value:!0}),e);var Lt={};kt(Lt,{durable:()=>ft,isConcurrentExecution:()=>mt,isPersistenceError:()=>dt,isVersionMismatch:()=>pt,isWorkflowCancelled:()=>ke});module.exports=Tt(Lt);function gt(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)}}var et="UNEXPECTED_ERROR";function Me(e){return et}var $=e=>({ok:!0,value:e}),W=(e,t)=>({ok:!1,error:e,...t?.cause!==void 0?{cause:t.cause}:{}});var tt=e=>e===et||typeof e=="object"&&e!==null&&e.type==="UNEXPECTED_ERROR";var Se=Symbol.for("step_timeout_marker");function Ge(e){return typeof e!="object"||e===null?!1:e.type==="STEP_TIMEOUT"?!0:Se in e}function St(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(Se in e)return e[Se]}}var rt=Symbol("early-exit");function Oe(e,t){return{[rt]:!0,error:e,meta:t}}function Pe(e){return typeof e=="object"&&e!==null&&e[rt]===!0}var nt=Symbol("mapper-exception");function ht(e){return{[nt]:!0,thrown:e}}function xt(e){return typeof e=="object"&&e!==null&&e[nt]===!0}function Ke(e,t){let{backoff:o,initialDelay:a,maxDelay:w,jitter:x}=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,w),x){let U=b*.25*Math.random();b=b+U}return Math.floor(b)}function Fe(e){return new Promise(t=>setTimeout(t,e))}var Ze=Symbol("timeout"),_e=Symbol("timeout-option");function Ct(e){return typeof e=="object"&&e!==null&&e[_e]===!0}async function bt(e,t,o,a){let w=new AbortController,x=t.onTimeout??"error",b=()=>typeof x=="function"?x({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},U;a?.aborted&&w.abort(a.reason);let re;a&&!a.aborted&&(re=()=>w.abort(a.reason),a.addEventListener("abort",re,{once:!0}));let d=new Promise((v,k)=>{U=setTimeout(()=>{if(x!=="disconnect"&&w.abort(),x==="option"){k({[_e]:!0,ms:t.ms});return}k({[Ze]:!0,error:b()})},t.ms)}),X;t.signal?X=Promise.resolve(e(w.signal)):X=Promise.resolve(e());try{return await Promise.race([X,d])}catch(v){if(typeof v=="object"&&v!==null&&v[_e]===!0)throw{[_e]:!0,ms:t.ms};if(typeof v=="object"&&v!==null&&v[Ze]===!0){x==="disconnect"&&X.catch(()=>{});let k=v.error;if(typeof k=="object"&&k!==null&&k.type!=="STEP_TIMEOUT"){let ae={timeoutMs:t.ms,stepName:o.name,stepKey:o.key,attempt:o.attempt};Se in k?k[Se]=ae:Object.defineProperty(k,Se,{value:ae,enumerable:!1,writable:!0,configurable:!1})}throw k}throw v}finally{clearTimeout(U),re&&a&&a.removeEventListener("abort",re)}}var ge={backoff:"exponential",initialDelay:100,maxDelay:3e4,jitter:!0,retryOn:()=>!0,onRetry:()=>{}};async function Ie(e,t){let{onError:o,onEvent:a,catchUnexpected:w,workflowId:x,workflowName:b,context:U,_workflowSignal:re}=t&&typeof t=="object"?t:{},d=x??crypto.randomUUID(),X=w??Me,v=[],k=0,ae=r=>r??`step_${++k}`,T=r=>{let N=r.context!==void 0||U===void 0?r:{...r,context:U},ee=b!==void 0&&N.workflowName===void 0?{...N,workflowName:b}:N;if(ee.type==="step_success"){let ce=ee.stepId;for(let pe=v.length-1;pe>=0;pe--){let ie=v[pe];if(ie.type==="race"&&!ie.winnerId){ie.winnerId=ce;break}}}a?.(ee,U)},H=Oe,g=r=>Pe(r),ne=(r,N)=>r,me=r=>typeof r=="function"?!1:!!(r&&typeof r=="object"&&"ok"in r||r&&typeof r=="object"&&"then"in r&&typeof r.then=="function");try{let N=function(p){let s={};for(let[i,R]of Object.entries(p))if(typeof R=="function")s[i]=R;else if(R&&typeof R=="object"&&"fn"in R)s[i]=R.fn;else throw new TypeError(`step.parallel: operation "${i}" must be a function or { fn, errors? } object`);return s},ee=function(p,s){let i=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let R=performance.now(),c=!1;v.push({scopeId:i,type:"parallel"});let u=()=>{if(c)return;c=!0;let f=v.findIndex(_=>_.scopeId===i);f!==-1&&v.splice(f,1),T({type:"scope_end",workflowId:d,scopeId:i,ts:Date.now(),durationMs:performance.now()-R})};T({type:"scope_start",workflowId:d,scopeId:i,scopeType:"parallel",name:p,ts:Date.now()});try{let f=await s();if(u(),!f.ok)throw o?.(f.error,p,U),H(f.error,{origin:"result",resultCause:f.cause});return f.value}catch(f){throw u(),f}})()},ce=function(p,s){let i=Object.keys(p),R=s.name??`Parallel(${i.join(", ")})`,c=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let u=performance.now(),f=!1;v.push({scopeId:c,type:"parallel"});let _=()=>{if(f)return;f=!0;let j=v.findIndex(I=>I.scopeId===c);j!==-1&&v.splice(j,1),T({type:"scope_end",workflowId:d,scopeId:c,ts:Date.now(),durationMs:performance.now()-u})};T({type:"scope_start",workflowId:d,scopeId:c,scopeType:"parallel",name:R,ts:Date.now()});try{let j=await new Promise(O=>{if(i.length===0){O([]);return}let z=!1,Y=i.length,Ce=new Array(i.length);for(let ue=0;ue<i.length;ue++){let Te=i[ue],G=ue;Promise.resolve(p[Te]()).catch(Z=>W({type:"PROMISE_REJECTED",cause:Z},{cause:{type:"PROMISE_REJECTION",reason:Z}})).then(Z=>{if(!z){if(!Z.ok){z=!0,O([{key:Te,result:Z}]);return}Ce[G]={key:Te,result:Z},Y--,Y===0&&O(Ce)}})}});_();let I={};for(let{key:O,result:z}of j){if(!z.ok)throw o?.(z.error,O,U),H(z.error,{origin:"result",resultCause:z.cause});I[O]=z.value}return I}catch(j){throw _(),j}})()};var fe=N,Ee=ee,le=ce;let r=(p,s,i)=>(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 R=i??{},c=p,u=R.key??p,f=R.key??p,{description:_,retry:j,timeout:I}=R,O=ae(u),z=a,Y=z?performance.now():0,ue=me(s)?()=>s:s,G={attempts:Math.max(1,j?.attempts??1),backoff:j?.backoff??ge.backoff,initialDelay:j?.initialDelay??ge.initialDelay,maxDelay:j?.maxDelay??ge.maxDelay,jitter:j?.jitter??ge.jitter,retryOn:j?.retryOn??ge.retryOn,onRetry:j?.onRetry??ge.onRetry};a&&T({type:"step_start",workflowId:d,stepId:O,stepKey:u,name:c,description:_,ts:Date.now()});let Z;for(let C=1;C<=G.attempts;C++){let V=z?performance.now():0;try{let n;if(I?n=await bt(ue,I,{name:c,key:u,attempt:C},re):n=await ue(),n.ok){let E=performance.now()-Y;return T({type:"step_success",workflowId:d,stepId:O,stepKey:u,name:c,description:_,ts:Date.now(),durationMs:E}),f&&T({type:"step_complete",workflowId:d,stepKey:f,name:c,description:_,ts:Date.now(),durationMs:E,result:n}),n.value}if(Z=n,C<G.attempts&&G.retryOn(n.error,C)){let E=Ke(C,G);T({type:"step_retry",workflowId:d,stepId:O,stepKey:u,name:c,ts:Date.now(),attempt:C+1,maxAttempts:G.attempts,delayMs:E,error:n.error}),G.onRetry(n.error,C,E),await Fe(E);continue}G.attempts>1&&T({type:"step_retries_exhausted",workflowId:d,stepId:O,stepKey:u,name:c,ts:Date.now(),durationMs:performance.now()-Y,attempts:C,lastError:n.error});break}catch(n){let E=performance.now()-V;if(Ct(n)){let h=n.ms;T({type:"step_timeout",workflowId:d,stepId:O,stepKey:u,name:c,ts:Date.now(),timeoutMs:h,attempt:C}),T({type:"step_success",workflowId:d,stepId:O,stepKey:u,name:c,description:_,ts:Date.now(),durationMs:performance.now()-Y}),f&&T({type:"step_complete",workflowId:d,stepKey:f,name:c,description:_,ts:Date.now(),durationMs:performance.now()-Y,result:$(void 0)});return}if(g(n))throw T({type:"step_aborted",workflowId:d,stepId:O,stepKey:u,name:c,description:_,ts:Date.now(),durationMs:E}),n;if(Ge(n)){let h=St(n),F=I?.ms??h?.timeoutMs??0;if(T({type:"step_timeout",workflowId:d,stepId:O,stepKey:u,name:c,ts:Date.now(),timeoutMs:F,attempt:C}),C<G.attempts&&G.retryOn(n,C)){let D=Ke(C,G);T({type:"step_retry",workflowId:d,stepId:O,stepKey:u,name:c,ts:Date.now(),attempt:C+1,maxAttempts:G.attempts,delayMs:D,error:n}),G.onRetry(n,C,D),await Fe(D);continue}G.attempts>1&&T({type:"step_retries_exhausted",workflowId:d,stepId:O,stepKey:u,name:c,ts:Date.now(),durationMs:performance.now()-Y,attempts:C,lastError:n});let y=performance.now()-Y;throw T({type:"step_error",workflowId:d,stepId:O,stepKey:u,name:c,description:_,ts:Date.now(),durationMs:y,error:n}),f&&T({type:"step_complete",workflowId:d,stepKey:f,name:c,description:_,ts:Date.now(),durationMs:y,result:W(n,{cause:n}),meta:{origin:"throw",thrown:n}}),o?.(n,c,U),H(n,{origin:"throw",thrown:n})}if(C<G.attempts&&G.retryOn(n,C)){let h=Ke(C,G);T({type:"step_retry",workflowId:d,stepId:O,stepKey:u,name:c,ts:Date.now(),attempt:C+1,maxAttempts:G.attempts,delayMs:h,error:n}),G.onRetry(n,C,h),await Fe(h);continue}G.attempts>1&&!Ge(n)&&T({type:"step_retries_exhausted",workflowId:d,stepId:O,stepKey:u,name:c,ts:Date.now(),durationMs:performance.now()-Y,attempts:C,lastError:n});let S=performance.now()-Y,A;try{A=X(n)}catch(h){throw ht(h)}throw T({type:"step_error",workflowId:d,stepId:O,stepKey:u,name:c,description:_,ts:Date.now(),durationMs:S,error:A}),f&&T({type:"step_complete",workflowId:d,stepKey:f,name:c,description:_,ts:Date.now(),durationMs:S,result:W(A,{cause:n}),meta:{origin:"throw",thrown:n}}),o?.(A,c,U),H(A,{origin:"throw",thrown:n})}}let de=Z,m=performance.now()-Y,l=ne(de.error,{origin:"result",resultCause:de.cause});throw T({type:"step_error",workflowId:d,stepId:O,stepKey:u,name:c,description:_,ts:Date.now(),durationMs:m,error:l}),f&&T({type:"step_complete",workflowId:d,stepKey:f,name:c,description:_,ts:Date.now(),durationMs:m,result:de,meta:{origin:"result",resultCause:de.cause}}),o?.(l,c,U),H(l,{origin:"result",resultCause:de.cause})})();r.try=(p,s,i)=>{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 R=i.key??p,c=p,u=p,f="error"in i?()=>i.error:i.onError,_=a;return(async()=>{let j=_?performance.now():0;a&&T({type:"step_start",workflowId:d,stepId:u,stepKey:R,name:c,ts:Date.now()});try{let I=await s(),O=performance.now()-j;return T({type:"step_success",workflowId:d,stepId:u,stepKey:R,name:c,ts:Date.now(),durationMs:O}),R&&T({type:"step_complete",workflowId:d,stepKey:R,name:c,ts:Date.now(),durationMs:O,result:$(I)}),I}catch(I){let O=f(I),z=performance.now()-j,Y=ne(O,{origin:"throw",thrown:I});throw T({type:"step_error",workflowId:d,stepId:u,stepKey:R,name:c,ts:Date.now(),durationMs:z,error:Y}),R&&T({type:"step_complete",workflowId:d,stepKey:R,name:c,ts:Date.now(),durationMs:z,result:W(O,{cause:I}),meta:{origin:"throw",thrown:I}}),o?.(Y,c,U),H(Y,{origin:"throw",thrown:I})}})()},r.fromResult=(p,s,i)=>{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 R=i.key??p,c=p,u=p,f="error"in i?()=>i.error:i.onError,_=a;return(async()=>{let j=_?performance.now():0;a&&T({type:"step_start",workflowId:d,stepId:u,stepKey:R,name:c,ts:Date.now()});let I=await s();if(I.ok){let O=performance.now()-j;return T({type:"step_success",workflowId:d,stepId:u,stepKey:R,name:c,ts:Date.now(),durationMs:O}),R&&T({type:"step_complete",workflowId:d,stepKey:R,name:c,ts:Date.now(),durationMs:O,result:$(I.value)}),I.value}else{let O=f(I.error),z=performance.now()-j,Y=ne(O,{origin:"result",resultCause:I.error});throw T({type:"step_error",workflowId:d,stepId:u,stepKey:R,name:c,ts:Date.now(),durationMs:z,error:Y}),R&&T({type:"step_complete",workflowId:d,stepKey:R,name:c,ts:Date.now(),durationMs:z,result:W(O,{cause:I.error}),meta:{origin:"result",resultCause:I.error}}),o?.(Y,c,U),H(Y,{origin:"result",resultCause:I.error})}})()},r.retry=(p,s,i)=>{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 r(p,s,{key:i.key??p,retry:{attempts:i.attempts,backoff:i.backoff,initialDelay:i.initialDelay,maxDelay:i.maxDelay,jitter:i.jitter,retryOn:i.retryOn,onRetry:i.onRetry},timeout:i.timeout})},r.withTimeout=(p,s,i)=>{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 r(p,s,{key:i.key??p,timeout:i})},r.sleep=(p,s,i)=>{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 R=typeof s=="string"?gt(s):s;if(!R)throw new Error(`step.sleep: invalid duration '${s}'`);let c=R.millis,u=i?.signal;return r(p,async()=>{if(re?.aborted||u?.aborted){let f=new Error("Sleep aborted");throw f.name="AbortError",f}return new Promise((f,_)=>{let j={timeoutId:void 0},I=()=>{j.timeoutId&&clearTimeout(j.timeoutId);let O=new Error("Sleep aborted");O.name="AbortError",_(O)};re?.addEventListener("abort",I,{once:!0}),u?.addEventListener("abort",I,{once:!0}),j.timeoutId=setTimeout(()=>{re?.removeEventListener("abort",I),u?.removeEventListener("abort",I),f($(void 0))},c)})},{key:i?.key??p,description:i?.description})},r.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 s=p[0],i=p[1];if(typeof i=="function")return ee(s,i);if(i&&typeof i=="object"&&!Array.isArray(i)){let c=N(i);return ce(c,{name:s})}throw new TypeError("step.parallel(name, ...): second argument must be a function (array form) or an object of operations (object form).")}),r.race=(p,s)=>{let i=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let R=performance.now(),c=!1,u={scopeId:i,type:"race",winnerId:void 0};v.push(u);let f=()=>{if(c)return;c=!0;let _=v.findIndex(j=>j.scopeId===i);_!==-1&&v.splice(_,1),T({type:"scope_end",workflowId:d,scopeId:i,ts:Date.now(),durationMs:performance.now()-R,winnerId:u.winnerId})};T({type:"scope_start",workflowId:d,scopeId:i,scopeType:"race",name:p,ts:Date.now()});try{let _=await s();if(f(),!_.ok)throw o?.(_.error,p,U),H(_.error,{origin:"result",resultCause:_.cause});return _.value}catch(_){throw f(),_}})()},r.allSettled=(p,s)=>{let i=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let R=performance.now(),c=!1;v.push({scopeId:i,type:"allSettled"});let u=()=>{if(c)return;c=!0;let f=v.findIndex(_=>_.scopeId===i);f!==-1&&v.splice(f,1),T({type:"scope_end",workflowId:d,scopeId:i,ts:Date.now(),durationMs:performance.now()-R})};T({type:"scope_start",workflowId:d,scopeId:i,scopeType:"allSettled",name:p,ts:Date.now()});try{let f=await s();if(u(),!f.ok)throw o?.(f.error,p,U),H(f.error,{origin:"result",resultCause:f.cause});return f.value}catch(f){throw u(),f}})()},r.if=(p,s,i)=>i(),r.label=r.if,r.branch=async(p,s)=>{let{condition:i,then:R,else:c}=s;if(i())return await R();if(c)return await c()},r.arm=(p,s)=>({fn:p,errors:s}),r.forEach=async(p,s,i)=>{let R=[],c=i.maxIterations,u=0,f="run"in i,_=Symbol.asyncIterator in s?s:(async function*(){yield*s})();for await(let j of _){if(c!==void 0&&u>=c)break;let I;f?I=await i.run(j,u):I=await i.item.handler(j,u,r),R.push(I),u++}return R},r.item=p=>({__forEachItemHandler:!0,handler:p}),r.dep=(p,s)=>s,r.run=(p,s,i)=>r(p,()=>s,i),r.andThen=(p,s,i,R)=>r(p,()=>i(s),R),r.match=async(p,s,i,R)=>r(p,async()=>{let c=await s;return c.ok?$(await i.ok(c.value)):$(await i.err(c.error,c.cause))},R),r.all=r.parallel,r.map=async(p,s,i,R)=>{let c=R?.concurrency??s.length;return r(p,()=>c>=s.length?Qe(s.map((u,f)=>i(u,f))):(async()=>{let u=[];for(let f=0;f<s.length;f+=c){let _=s.slice(f,f+c),j=await Qe(_.map((I,O)=>i(I,f+O)));if(!j.ok)return j;u.push(...j.value)}return $(u)})(),{key:R?.key})};let ie=await e({step:r});if(process.env.NODE_ENV!=="production"&&ie!==null&&typeof ie=="object"&&"ok"in ie&&typeof ie.ok=="boolean"){let p=ie;(p.ok===!0&&"value"in p||p.ok===!1&&"error"in p)&&console.warn(`awaitly: Workflow executor returned a Result-like object. Return raw values, not ok() or err().
|
|
2
2
|
|
|
3
3
|
Incorrect: return ok({ data });
|
|
4
4
|
Correct: return { data };
|
|
5
5
|
|
|
6
|
-
See: https://jagreehal.github.io/awaitly/guides/troubleshooting/#returning-ok-from-workflow-executor-double-wrapping`)}return J(oe)}catch(m){if(Lt(m))throw m.thrown;if(ee(m)){let le=m.meta.origin==="throw"?m.meta.thrown:m.meta.resultCause;return U(m.error,{cause:le})}let ne=te(m);return i?.(ne,"unexpected",_),U(ne,{cause:m})}}He.strict=(e,r)=>He(e,r);async function wt(e){return e.length===0?J([]):new Promise(r=>{let i=!1,c=e.length,E=new Array(e.length);for(let h=0;h<e.length;h++){let x=h;Promise.resolve(e[x]).catch(_=>U({type:"PROMISE_REJECTED",cause:_},{cause:{type:"PROMISE_REJECTION",reason:_}})).then(_=>{if(!i){if(!_.ok){i=!0,r(_);return}E[x]=_.value,c--,c===0&&r(J(E))}})}})}function be(e){return typeof e=="object"&&e!==null&&e.type==="WORKFLOW_CANCELLED"}var Ce=class extends Error{constructor(i,c=[]){super(i);this.errors=c;this.name="SnapshotFormatError"}},ze=class extends Error{constructor(i,c,E){super(i);this.mismatchType=c;this.details=E;this.name="SnapshotMismatchError"}},qe=class extends Error{constructor(i,c,E){super(i);this.stepId=c;this.originalError=E;this.name="SnapshotDecodeError"}};function Ht(e){let r=[];if(typeof e!="object"||e===null)return{valid:!1,errors:["Snapshot must be an object"]};let i=e;if("formatVersion"in i?i.formatVersion!==1&&r.push(`Invalid formatVersion: expected 1, got ${i.formatVersion}`):r.push("Missing required field: formatVersion"),!("steps"in i))r.push("Missing required field: steps");else if(typeof i.steps!="object"||i.steps===null)r.push("steps must be an object");else{let c=i.steps;for(let[E,h]of Object.entries(c)){if(typeof h!="object"||h===null){r.push(`steps["${E}"] must be an object`);continue}let x=h;"ok"in x?typeof x.ok!="boolean"?r.push(`steps["${E}"].ok must be a boolean`):x.ok===!1&&("error"in x||r.push(`steps["${E}"] is error result but missing error field`),"cause"in x||r.push(`steps["${E}"] is error result but missing cause field`)):r.push(`steps["${E}"] missing required field: ok`)}}if(!("execution"in i))r.push("Missing required field: execution");else if(typeof i.execution!="object"||i.execution===null)r.push("execution must be an object");else{let c=i.execution;"status"in c?["running","completed","failed"].includes(c.status)||r.push("execution.status must be one of: running, completed, failed"):r.push("execution missing required field: status"),"lastUpdated"in c?typeof c.lastUpdated!="string"&&r.push("execution.lastUpdated must be a string (ISO timestamp)"):r.push("execution missing required field: lastUpdated")}return r.length>0?{valid:!1,errors:r}:{valid:!0,snapshot:e}}function Rt(e){let r=Ht(e);if(!r.valid)throw new Ce(`Invalid snapshot format: ${r.errors[0]}`,r.errors);return r.snapshot}function St(e,r){let i=Object.create(null);for(let[x,_]of Object.entries(e.steps))Object.prototype.hasOwnProperty.call(e.steps,x)&&(i[x]=_);for(let[x,_]of Object.entries(r.steps))Object.prototype.hasOwnProperty.call(r.steps,x)&&(i[x]=_);let c=e.metadata||r.metadata?{...e.metadata,...r.metadata}:void 0,h=[...(e.warnings||[]).filter(x=>!Object.prototype.hasOwnProperty.call(r.steps,x.stepId)),...r.warnings||[]];return{formatVersion:1,steps:i,execution:{...r.execution},metadata:c,warnings:h.length>0?h:void 0}}var Tt=1e3;function Je(e){let r={type:"error",name:e.name,message:e.message};e.stack&&(r.stack=e.stack);let i=e;return i.cause!==void 0&&(i.cause instanceof Error?r.cause=Je(i.cause):r.cause=Xe(i.cause)),r}function Xe(e){let r,i=!1;try{r=String(e),r.length>Tt&&(r=r.slice(0,Tt),i=!0)}catch{r="[unable to convert to string]"}let c=e===null?"null":typeof e=="object"?e.constructor?.name??"Object":typeof e,E;try{let x=JSON.stringify(e);x!==void 0&&(E=JSON.parse(x))}catch{}let h={type:"thrown",originalType:c,stringRepresentation:r};return E!==void 0&&(h.value=E),i&&(h.truncated=!0),h}function ot(e){if(e.type==="error"){let r=new Error(e.message);return r.name=e.name,e.stack&&(r.stack=e.stack),e.cause&&(r.cause=ot(e.cause)),r}return e.value!==void 0?e.value:e.stringRepresentation}var zt="STREAM_WRITE_ERROR",qt="STREAM_READ_ERROR",Jt="STREAM_CLOSE_ERROR";var Xt="STREAM_ENDED";function Ye(e,r,i){return{type:zt,reason:e,message:r,...i!==void 0?{cause:i}:{}}}function st(e,r,i){return{type:qt,reason:e,message:r,...i!==void 0?{cause:i}:{}}}function at(e,r,i){return{type:Jt,reason:e,message:r,...i!==void 0?{cause:i}:{}}}function Ge(e){return{type:Xt,finalPosition:e}}function ht(e={}){let r=e.highWaterMark??16,i=e.lowWaterMark??Math.floor(r/2),c=e.onStateChange,E="flowing",h=0,x=[];function _(y){if(E!==y&&(E=y,c?.(y),y==="flowing"&&x.length>0)){let te=x;x=[];for(let W of te)W()}}function X(){E==="flowing"&&h>=r?_("paused"):E==="paused"&&h<=i&&_("flowing")}return{get state(){return E},get bufferedCount(){return h},get highWaterMark(){return r},get lowWaterMark(){return i},increment(){h++,X()},decrement(){h>0&&(h--,X())},setCount(y){h=Math.max(0,y),X()},waitForDrain(){return E==="flowing"?Promise.resolve():new Promise(y=>{x.push(y)})},reset(){h=0,x=[],_("flowing")}}}function Yt(e){return{_tag:"Duration",millis:e}}function Gt(e){return{_tag:"Duration",millis:e*1e3}}function Zt(e){return{_tag:"Duration",millis:e*60*1e3}}function Qt(e){return{_tag:"Duration",millis:e*60*60*1e3}}function en(e){return{_tag:"Duration",millis:e*24*60*60*1e3}}function xt(e){return e.millis}function Ct(e){let r=e.trim().match(/^(\d+(?:\.\d+)?)\s*(ms|s|m|h|d)$/i);if(!r)return;let i=parseFloat(r[1]);switch(r[2].toLowerCase()){case"ms":return Yt(i);case"s":return Gt(i);case"m":return Zt(i);case"h":return Qt(i);case"d":return en(i);default:return}}function it(e){return typeof e=="object"&&e!==null&&e.__cachedMeta===!0}function We(e,r,i){return U(e,{cause:{__cachedMeta:!0,originalCause:i,meta:r}})}function Ze(e){return it(e)?e.meta:{origin:"result",resultCause:e}}function ut(e,r,i){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 c=r??{},E=i;function h(t,o){if(typeof t!="function"&&typeof o!="function")throw new TypeError("workflow(args?, fn, ...): fn must be a function");return typeof o=="function"?{args:t,fn:o}:{args:void 0,fn:t}}function x(t,o,n){return typeof o=="function"?n:o}let _=Object.create(null),X=[],y=[],te="running",W=new Date().toISOString(),ie,we,C=[],Z=E;if(Z?.snapshot){let t=Z.snapshot;try{Rt(t)}catch(n){throw n instanceof Ce?n:new Ce(`Failed to validate snapshot: ${n}`)}let o=Z.onDefinitionChange??"warn";if(o!=="ignore"&&t.metadata?.definitionHash!==void 0&&E.definitionHash!==void 0&&t.metadata.definitionHash!==E.definitionHash){let n=`Snapshot definition hash "${t.metadata.definitionHash}" does not match workflow definition hash "${E.definitionHash}"`;if(o==="error")throw new ze(n,"definition_hash",{snapshotHash:t.metadata.definitionHash,expectedHash:E.definitionHash});console.warn(`awaitly: ${n}`)}for(let[n,p]of Object.entries(t.steps))Object.prototype.hasOwnProperty.call(t.steps,n)&&(_[n]=p,X.push(n));te=t.execution.status,W=t.execution.lastUpdated,ie=t.execution.completedAt,we=t.execution.currentStepId}function ee(t,o,n){let p=Z?.serialization?.encode,a=Z?.snapshotSerialization?.strict??!1;if(n){let l=y.length;for(;l--;)y[l].stepId===n&&y.splice(l,1)}let s=l=>{let k=!1,T=JSON.stringify(l,(L,K)=>((typeof K=="function"||typeof K=="symbol"||K===void 0)&&(k=!0),(K instanceof Error||K instanceof Map||K instanceof Set||K instanceof RegExp)&&(k=!0),K));return{json:T!==void 0?JSON.parse(T):null,isLossy:k}};if(t.ok){let l,k=!1;try{if(p)l=p(t.value);else{let u=s(t.value);l=u.json,k=u.isLossy}}catch(u){if(a)throw new Error(`Cannot serialize step "${n}" value: ${u}`,{cause:u});if(l=null,k=!0,n){let T=p?"encode-failed":u instanceof TypeError&&String(u).includes("circular")?"circular":"non-json";y.push({type:"lossy_value",stepId:n,path:"value",reason:T})}}return k&&n&&!y.some(u=>u.stepId===n&&u.path==="value")&&y.push({type:"lossy_value",stepId:n,path:"value",reason:"non-json"}),{ok:!0,value:l}}else{let l,k=!1;try{if(p)l=p(t.error);else{let g=s(t.error);l=g.json,k=g.isLossy}}catch(g){if(a)throw new Error(`Cannot serialize step "${n}" error: ${g}`,{cause:g});if(l=null,k=!0,n){let L=p?"encode-failed":g instanceof TypeError&&String(g).includes("circular")?"circular":"non-json";y.push({type:"lossy_value",stepId:n,path:"error",reason:L})}}k&&n&&!y.some(g=>g.stepId===n&&g.path==="error")&&y.push({type:"lossy_value",stepId:n,path:"error",reason:"non-json"});let u,T=it(t.cause)?t.cause.originalCause:t.cause;return T instanceof Error?u=Je(T):T!==void 0?u=Xe(T):t.error instanceof Error?u=Je(t.error):u=Xe(t.error),{ok:!1,error:l,cause:u,meta:o?{origin:o.origin}:void 0}}}function ue(t){let o=t?.include??"all",n=t?.limit,p=t?.sinceStepId,a=Object.create(null),s=0,l=0;if(p){let T=X.indexOf(p);T!==-1&&(s=T+1)}for(let T=s;T<X.length&&!(n!==void 0&&l>=n);T++){let g=X[T],L=_[g];L&&(o==="completed"&&!L.ok||o==="failed"&&L.ok||(a[g]=L,l++))}let k=y.filter(T=>a[T.stepId]!==void 0),u={formatVersion:1,workflowName:e,steps:a,execution:{status:te,lastUpdated:W,completedAt:ie,currentStepId:we},metadata:t?.metadata?{...t.metadata}:void 0,warnings:k.length>0?k:void 0};return structuredClone(u)}function ke(t){for(let o of C){let n=o.options.mode??"sync",p=o.options.coalesce??"none";if(n==="sync")try{o.listener(t)}catch(a){console.error("awaitly: subscribe listener threw an error:",a)}else p==="none"?(o.queue||(o.queue=[]),o.queue.push(t)):t.type==="workflow_complete"||t.type==="workflow_error"?o.terminalEvent=t:o.latestNonTerminal=t,o.scheduled||(o.scheduled=!0,queueMicrotask(()=>{if(o.scheduled=!1,p==="none"&&o.queue){let a=o.queue;o.queue=[];for(let s of a)try{o.listener(s)}catch(l){console.error("awaitly: subscribe listener threw an error:",l)}}else{if(o.latestNonTerminal){try{o.listener(o.latestNonTerminal)}catch(a){console.error("awaitly: subscribe listener threw an error:",a)}o.latestNonTerminal=void 0}if(o.terminalEvent){try{o.listener(o.terminalEvent)}catch(a){console.error("awaitly: subscribe listener threw an error:",a)}o.terminalEvent=void 0}}}))}}function Le(t,o,n){let p=ee(o,n,t);if(_[t]=p,X.includes(t)||X.push(t),W=new Date().toISOString(),we=t,C.length>0){let a=ue();ke({type:"step_complete",stepId:t,snapshot:a})}}function Oe(t){if(te=t?"completed":"failed",W=new Date().toISOString(),ie=W,we=void 0,C.length>0){let o=ue();ke({type:t?"workflow_complete":"workflow_error",snapshot:o})}}async function V(t,o){let{args:n,fn:p}=t,a=n!==void 0;if(a&&typeof n=="object"&&n!==null){let d=new Set(["cache","onEvent","resumeState","onError","onBeforeStart","onAfterStep","shouldRun","createContext","signal","strict","catchUnexpected","description","markdown","streamStore"]),f=Object.keys(n),j=f.filter(w=>d.has(w)),$=f.filter(w=>!d.has(w));j.length>0&&$.length===0&&console.warn(`awaitly: Detected workflow options (${j.join(", ")}) passed to workflow executor. Options are ignored here.
|
|
7
|
-
Pass options to createWorkflow() instead:
|
|
8
|
-
const workflow = createWorkflow('${e}', deps, { ${j.join(", ")} });
|
|
9
|
-
await workflow(async ({ step }) => { ... });`)}let s=crypto.randomUUID(),l=o?.createContext??E?.createContext,k=l?await l():void 0,u=o?.signal??E?.signal,T=o?.onEvent??E?.onEvent,g=o?.onError??E?.onError,L=o?.shouldRun??E?.shouldRun,K=o?.onBeforeStart??E?.onBeforeStart,Ae=o?.onAfterStep??E?.onAfterStep,pe=o?.resumeState??E?.resumeState,Ee=E?.catchUnexpected??rt,q={},ye=(o?.devWarnings??E?.devWarnings)===!0&&process.env.NODE_ENV!=="production",he=new Set,Ue=new Set,ve={workflowId:s,onEvent:T,context:k!==void 0?k:void 0,signal:u,input:n??{},ref:d=>q[d],set:(d,f)=>{ye&&!he.has(d)&&(he.add(d),console.warn(`awaitly: ctx.set('${d}', ...) is deprecated for static analysis. Use step('id', fn, { out: '${d}' }) instead.`)),q[d]=f},get:d=>(ye&&!Ue.has(d)&&(Ue.add(d),console.warn(`awaitly: ctx.get('${d}') is deprecated for static analysis. Use ctx.ref('${d}') instead for tracked dependencies.`)),q[d])},O=d=>{let f=d.context!==void 0||k===void 0?d:{...d,context:k},j=f.workflowName===void 0?{...f,workflowName:e}:f;T?.(j,k)},Qe=(d,f)=>{let j={type:"WORKFLOW_CANCELLED",reason:d,lastStepKey:f};return U(Ee(j),{cause:j})};if(u?.aborted){let d=typeof u.reason=="string"?u.reason:u.reason instanceof Error?u.reason.message:void 0;return O({type:"workflow_cancelled",workflowId:s,ts:Date.now(),durationMs:0,reason:d}),Qe(d)}if(L){let d=performance.now();try{let f=await L(s,k),j=performance.now()-d;if(O({type:"hook_should_run",workflowId:s,ts:Date.now(),durationMs:j,result:f,skipped:!f}),!f){let $=new Error("Workflow skipped by shouldRun hook");return U(Ee($),{cause:$})}}catch(f){let j=performance.now()-d;return O({type:"hook_should_run_error",workflowId:s,ts:Date.now(),durationMs:j,error:f}),U(Ee(f),{cause:f})}}if(K){let d=performance.now();try{let f=await K(s,k),j=performance.now()-d;if(O({type:"hook_before_start",workflowId:s,ts:Date.now(),durationMs:j,result:f,skipped:!f}),!f){let $=new Error("Workflow skipped by onBeforeStart hook");return U(Ee($),{cause:$})}}catch(f){let j=performance.now()-d;return O({type:"hook_before_start_error",workflowId:s,ts:Date.now(),durationMs:j,error:f}),U(Ee(f),{cause:f})}}let M=Date.now(),ge=performance.now();O({type:"workflow_start",workflowId:s,ts:M});let N=E?.cache,fe=E?.streamStore;if(pe&&!N&&(N=new Map),pe&&N){let d=typeof pe=="function"?await pe():pe;d.steps instanceof Map||(console.warn(`awaitly: resumeState.steps is not a Map (got ${typeof d.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 $(ie)}catch(r){if(xt(r))throw r.thrown;if(g(r)){let ee=r.meta.origin==="throw"?r.meta.thrown:r.meta.resultCause;return W(r.error,{cause:ee})}let N=X(r);return o?.(N,"unexpected",U),W(N,{cause:r})}}Ie.strict=(e,t)=>Ie(e,t);async function Qe(e){return e.length===0?$([]):new Promise(t=>{let o=!1,a=e.length,w=new Array(e.length);for(let x=0;x<e.length;x++){let b=x;Promise.resolve(e[b]).catch(U=>W({type:"PROMISE_REJECTED",cause:U},{cause:{type:"PROMISE_REJECTION",reason:U}})).then(U=>{if(!o){if(!U.ok){o=!0,t(U);return}w[b]=U.value,a--,a===0&&t($(w))}})}})}function Ve(e){return e.type==="step_complete"}function ke(e){return typeof e=="object"&&e!==null&&e.type==="WORKFLOW_CANCELLED"}var Re=class extends Error{constructor(o,a=[]){super(o);this.errors=a;this.name="SnapshotFormatError"}};var he=class extends Error{constructor(o,a,w){super(o);this.stepId=a;this.originalError=w;this.name="SnapshotDecodeError"}};function vt(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[w,x]of Object.entries(a)){if(typeof x!="object"||x===null){t.push(`steps["${w}"] must be an object`);continue}let b=x;"ok"in b?typeof b.ok!="boolean"?t.push(`steps["${w}"].ok must be a boolean`):b.ok===!1&&("error"in b||t.push(`steps["${w}"] is error result but missing error field`),"cause"in b||t.push(`steps["${w}"] is error result but missing cause field`)):t.push(`steps["${w}"] 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=vt(e);if(!t.valid)throw new Re(`Invalid snapshot format: ${t.errors[0]}`,t.errors);return t.snapshot}function at(e,t){let o=Object.create(null);for(let[b,U]of Object.entries(e.steps))Object.prototype.hasOwnProperty.call(e.steps,b)&&(o[b]=U);for(let[b,U]of Object.entries(t.steps))Object.prototype.hasOwnProperty.call(t.steps,b)&&(o[b]=U);let a=e.metadata||t.metadata?{...e.metadata,...t.metadata}:void 0,x=[...(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:x.length>0?x:void 0}}var ot=1e3;function Le(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=Le(o.cause):t.cause=Be(o.cause)),t}function Be(e){let t,o=!1;try{t=String(e),t.length>ot&&(t=t.slice(0,ot),o=!0)}catch{t="[unable to convert to string]"}let a=e===null?"null":typeof e=="object"?e.constructor?.name??"Object":typeof e,w;try{let b=JSON.stringify(e);b!==void 0&&(w=JSON.parse(b))}catch{}let x={type:"thrown",originalType:a,stringRepresentation:t};return w!==void 0&&(x.value=w),o&&(x.truncated=!0),x}function $e(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=$e(e.cause)),t}return e.value!==void 0?e.value:e.stringRepresentation}function At(e){return typeof e=="object"&&e!==null&&e.__cachedMeta===!0}function xe(e,t,o){return W(e,{cause:{__cachedMeta:!0,originalCause:o,meta:t}})}function We(e){return At(e)?e.meta:{origin:"result",resultCause:e}}function De(){let e=new Map;return{handleEvent:t=>{Ve(t)&&e.set(t.stepKey,{result:t.result,meta:t.meta})},getResumeState:()=>({steps:new Map(e)}),clear:()=>e.clear()}}var Dt="STREAM_WRITE_ERROR",_t="STREAM_READ_ERROR",It="STREAM_CLOSE_ERROR";var Mt="STREAM_ENDED";function Ue(e,t,o){return{type:Dt,reason:e,message:t,...o!==void 0?{cause:o}:{}}}function He(e,t,o){return{type:_t,reason:e,message:t,...o!==void 0?{cause:o}:{}}}function Je(e,t,o){return{type:It,reason:e,message:t,...o!==void 0?{cause:o}:{}}}function Ne(e){return{type:Mt,finalPosition:e}}function it(e={}){let t=e.highWaterMark??16,o=e.lowWaterMark??Math.floor(t/2),a=e.onStateChange,w="flowing",x=0,b=[];function U(d){if(w!==d&&(w=d,a?.(d),d==="flowing"&&b.length>0)){let X=b;b=[];for(let v of X)v()}}function re(){w==="flowing"&&x>=t?U("paused"):w==="paused"&&x<=o&&U("flowing")}return{get state(){return w},get bufferedCount(){return x},get highWaterMark(){return t},get lowWaterMark(){return o},increment(){x++,re()},decrement(){x>0&&(x--,re())},setCount(d){x=Math.max(0,d),re()},waitForDrain(){return w==="flowing"?Promise.resolve():new Promise(d=>{b.push(d)})},reset(){x=0,b=[],U("flowing")}}}function Wt(e){return{_tag:"Duration",millis:e}}function Ut(e){return{_tag:"Duration",millis:e*1e3}}function Nt(e){return{_tag:"Duration",millis:e*60*1e3}}function jt(e){return{_tag:"Duration",millis:e*60*60*1e3}}function Kt(e){return{_tag:"Duration",millis:e*24*60*60*1e3}}function ut(e){return e.millis}function lt(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 Wt(o);case"s":return Ut(o);case"m":return Nt(o);case"h":return jt(o);case"d":return Kt(o);default:return}}function qe(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??{},w=o;async function x(d,X,v){let k=d??crypto.randomUUID(),ae=v?.deps?{...a,...v.deps}:a,T=v?.createContext??w?.createContext,H=T?await T():void 0,g=v?.signal??w?.signal,ne=v?.onEvent??w?.onEvent,me=v?.onError??w?.onError,fe=v?.shouldRun??w?.shouldRun,Ee=v?.onBeforeStart??w?.onBeforeStart,le=v?.onAfterStep??w?.onAfterStep,r=v?.resumeState??w?.resumeState,N=w?.catchUnexpected??Me,ee={},ce=(v?.devWarnings??w?.devWarnings)===!0&&process.env.NODE_ENV!=="production",pe=new Set,ie=new Set,p={workflowId:k,onEvent:ne,context:H!==void 0?H:void 0,signal:g,input:{},ref:m=>ee[m],set:(m,l)=>{ce&&!pe.has(m)&&(pe.add(m),console.warn(`awaitly: ctx.set('${m}', ...) is deprecated for static analysis. Use step('id', fn, { out: '${m}' }) instead.`)),ee[m]=l},get:m=>(ce&&!ie.has(m)&&(ie.add(m),console.warn(`awaitly: ctx.get('${m}') is deprecated for static analysis. Use ctx.ref('${m}') instead for tracked dependencies.`)),ee[m])},s=m=>{let l=m.context!==void 0||H===void 0?m:{...m,context:H},C=l.workflowName===void 0?{...l,workflowName:e}:l;ne?.(C,H)},i=(m,l)=>{let C={type:"WORKFLOW_CANCELLED",reason:m,lastStepKey:l};return W(N(C),{cause:C})};if(g?.aborted){let m=typeof g.reason=="string"?g.reason:g.reason instanceof Error?g.reason.message:void 0;return s({type:"workflow_cancelled",workflowId:k,ts:Date.now(),durationMs:0,reason:m}),i(m)}if(fe){let m=performance.now();try{let l=await fe(k,H),C=performance.now()-m;if(s({type:"hook_should_run",workflowId:k,ts:Date.now(),durationMs:C,result:l,skipped:!l}),!l){let V=new Error("Workflow skipped by shouldRun hook");return W(N(V),{cause:V})}}catch(l){let C=performance.now()-m;return s({type:"hook_should_run_error",workflowId:k,ts:Date.now(),durationMs:C,error:l}),W(N(l),{cause:l})}}if(Ee){let m=performance.now();try{let l=await Ee(k,H),C=performance.now()-m;if(s({type:"hook_before_start",workflowId:k,ts:Date.now(),durationMs:C,result:l,skipped:!l}),!l){let V=new Error("Workflow skipped by onBeforeStart hook");return W(N(V),{cause:V})}}catch(l){let C=performance.now()-m;return s({type:"hook_before_start_error",workflowId:k,ts:Date.now(),durationMs:C,error:l}),W(N(l),{cause:l})}}let R=Date.now(),c=performance.now();s({type:"workflow_start",workflowId:k,ts:R});let u=v?.cache??w?.cache,f=v?.streamStore??w?.streamStore;if(r&&!u&&(u=new Map),r&&u){let m=typeof r=="function"?await r():r;m.steps instanceof Map||(console.warn(`awaitly: resumeState.steps is not a Map (got ${typeof m.steps}). This usually happens when state is serialized with JSON.stringify() directly.
|
|
10
7
|
Use stringifyState() and parseState() from 'awaitly/persistence' instead:
|
|
11
8
|
import { stringifyState, parseState } from 'awaitly/persistence';
|
|
12
9
|
const json = stringifyState(state); // Save this
|
|
13
|
-
const restored = parseState(json); // Load this`),typeof d.steps=="object"&&d.steps!==null&&(d.steps=new Map(Object.entries(d.steps))));for(let[f,j]of d.steps){let{result:$,meta:w}=j;if($.ok)N.set(f,$);else{let S=w??{origin:"result",resultCause:$.cause};N.set(f,We($.error,S,$.cause))}}}if(Z?.snapshot&&!pe){N||(N=new Map);let d=Z.snapshot,f=Z.serialization?.decode;for(let[j,$]of Object.entries(d.steps))if(Object.prototype.hasOwnProperty.call(d.steps,j))try{if($.ok){let w=f?f($.value):$.value;N.set(j,J(w))}else{let w=f?f($.error):$.error,S=ot($.cause),b=$.meta?.origin==="throw"?{origin:"throw",thrown:S}:{origin:"result",resultCause:S};N.set(j,We(w,b,S))}}catch(w){throw new qe(`Failed to decode step "${j}": ${w instanceof Error?w.message:String(w)}`,j,w instanceof Error?w:void 0)}}let de=!1,Pe,Re,_e=()=>{de=!0,Pe=typeof u?.reason=="string"?u.reason:u?.reason instanceof Error?u.reason.message:void 0};u&&!u.aborted&&u.addEventListener("abort",_e,{once:!0});let _t=()=>{if(de||u?.aborted)throw{type:"WORKFLOW_CANCELLED",reason:Pe??(typeof u?.reason=="string"?u.reason:u?.reason instanceof Error?u.reason.message:void 0),lastStepKey:Re}},De=async(d,f,j)=>{if(Le(d,f,j),!Ae)return;let $=performance.now();try{await Ae(d,f,s,k);let w=performance.now()-$;O({type:"hook_after_step",workflowId:s,stepKey:d,ts:Date.now(),durationMs:w})}catch(w){let S=performance.now()-$;throw O({type:"hook_after_step_error",workflowId:s,stepKey:d,ts:Date.now(),durationMs:S,error:w}),w}},pt=d=>{let f=async(w,S,b)=>{if(typeof w!="string")throw new Error('[awaitly] step() requires a string ID as the first argument. Example: step("fetchUser", () => fetchUser(id))');let P=w,A=b??{},H=P,R=Object.prototype.hasOwnProperty.call(A,"key")?A.key:P,{ttl:I,out:Y}=A;if(_t(),R&&N&&N.has(R)){O({type:"step_cache_hit",workflowId:s,stepKey:R,name:H,ts:Date.now()});let D=N.get(R);if(D.ok)return Re=R,Y&&(q[Y]=D.value),D.value;let v=Ze(D.cause);throw Ke(D.error,v)}R&&N&&O({type:"step_cache_miss",workflowId:s,stepKey:R,name:H,ts:Date.now()});try{let D=await d(P,S,A);return Y&&(q[Y]=D),R&&(Re=R,N&&N.set(R,J(D),I?{ttl:I}:void 0),await De(R,J(D))),D}catch(D){if(R&&Ve(D)){let v=D,F=v.meta.origin==="result"?v.meta.resultCause:v.meta.thrown,Q=We(v.error,v.meta,F);N&&N.set(R,Q,I?{ttl:I}:void 0),await De(R,Q,v.meta)}throw D}};f.try=async(w,S,b)=>{let{ttl:P}=b,A=b.key??w,H=w;if(N&&N.has(A)){O({type:"step_cache_hit",workflowId:s,stepKey:A,name:H,ts:Date.now()});let R=N.get(A);if(R.ok)return R.value;let I=Ze(R.cause);throw Ke(R.error,I)}N&&O({type:"step_cache_miss",workflowId:s,stepKey:A,name:H,ts:Date.now()});try{let R=await d.try(w,S,{...b,key:A});return N&&N.set(A,J(R),P?{ttl:P}:void 0),await De(A,J(R)),R}catch(R){if(Ve(R)){let I=R,Y=I.meta.origin==="result"?I.meta.resultCause:I.meta.thrown,D=We(I.error,I.meta,Y);N&&N.set(A,D,P?{ttl:P}:void 0),await De(A,D,I.meta)}throw R}},f.fromResult=async(w,S,b)=>{let{ttl:P}=b,A=b.key??w,H=w;if(N&&N.has(A)){O({type:"step_cache_hit",workflowId:s,stepKey:A,name:H,ts:Date.now()});let R=N.get(A);if(R.ok)return R.value;let I=Ze(R.cause);throw Ke(R.error,I)}N&&O({type:"step_cache_miss",workflowId:s,stepKey:A,name:H,ts:Date.now()});try{let R=await d.fromResult(w,S,{...b,key:A});return N&&N.set(A,J(R),P?{ttl:P}:void 0),await De(A,J(R)),R}catch(R){if(Ve(R)){let I=R,Y=I.meta.origin==="result"?I.meta.resultCause:I.meta.thrown,D=We(I.error,I.meta,Y);N&&N.set(A,D,P?{ttl:P}:void 0),await De(A,D,I.meta)}throw R}},f.parallel=d.parallel,f.race=d.race,f.allSettled=d.allSettled,f.retry=(w,S,b)=>{let P={key:b.key,retry:{attempts:b.attempts,backoff:b.backoff,initialDelay:b.initialDelay,maxDelay:b.maxDelay,jitter:b.jitter,retryOn:b.retryOn,onRetry:b.onRetry},timeout:b.timeout,ttl:b.ttl};return f(w,S,P)},f.withTimeout=(w,S,b)=>{let P={key:b.key,timeout:b,ttl:b.ttl};return f(w,S,P)},f.sleep=(w,S,b)=>{if(typeof w!="string"||w.length===0)throw new Error('[awaitly] step.sleep() requires an explicit string ID as the first argument. Example: step.sleep("delay", "5s")');let P=typeof S=="string"?Ct(S):S;if(!P)throw new Error(`step.sleep: invalid duration '${S}'`);let A=xt(P),H=b?.signal;return f(w,async()=>{if(u?.aborted||H?.aborted){let I=new Error("Sleep aborted");throw I.name="AbortError",I}return new Promise((I,Y)=>{let D={timeoutId:void 0},v=()=>{D.timeoutId&&clearTimeout(D.timeoutId);let F=new Error("Sleep aborted");F.name="AbortError",Y(F)};u?.addEventListener("abort",v,{once:!0}),H?.addEventListener("abort",v,{once:!0}),D.timeoutId=setTimeout(()=>{u?.removeEventListener("abort",v),H?.removeEventListener("abort",v),I(J(void 0))},A)})},{key:b?.key,ttl:b?.ttl,description:b?.description})};let j=new Map,$=new Map;return f.getWritable=w=>{let S=w?.namespace??"default",b=w?.highWaterMark??16;if(!fe)throw new Error("streamStore is required to use getWritable(). Pass a streamStore to createWorkflow options.");let P=`${s}:${S}`,A=j.get(P);if(A&&!A.closed&&!A.aborted)return A.writer;let H=ht({highWaterMark:b,onStateChange:F=>{O({type:"stream_backpressure",workflowId:s,namespace:S,bufferedCount:H.bufferedCount,state:F,ts:Date.now()})}}),R=0,I=!0,Y=!1,D=!1;O({type:"stream_created",workflowId:s,namespace:S,ts:Date.now()});let v={async write(F){if(D)return U(Ye("closed","Stream is closed"));if(Y)return U(Ye("aborted","Stream was aborted"));H.state==="paused"&&await H.waitForDrain();let Q={value:F,position:R,ts:Date.now()},B=await fe.append(s,S,Q);return B.ok?(O({type:"stream_write",workflowId:s,namespace:S,position:R,ts:Date.now()}),R++,H.increment(),J(void 0)):(O({type:"stream_error",workflowId:s,namespace:S,error:B.error,position:R,ts:Date.now()}),U(Ye("store_error",B.error.message,B.error)))},async close(){if(D)return U(at("already_closed","Stream is already closed"));let F=await fe.closeStream(s,S);return F.ok?(D=!0,I=!1,O({type:"stream_close",workflowId:s,namespace:S,finalPosition:R,ts:Date.now()}),j.delete(P),J(void 0)):U(at("store_error",F.error.message,F.error))},abort(F){Y=!0,I=!1,D=!0,O({type:"stream_error",workflowId:s,namespace:S,error:F,position:R,ts:Date.now()}),j.delete(P)},get writable(){return I},get position(){return R},get namespace(){return S}};return j.set(P,{writer:v,backpressure:H,aborted:Y,closed:D}),v},f.getReadable=w=>{let S=w?.namespace??"default",b=w?.startIndex??0,P=w?.pollInterval??10,A=w?.pollTimeout??3e4;if(!fe)throw new Error("streamStore is required to use getReadable(). Pass a streamStore to createWorkflow options.");let H=`${s}:${S}:${b}`,R=$.get(H);if(R&&!R.closed)return R.reader;let I=()=>{let Se=`${s}:${S}`,G=j.get(Se);G&&G.backpressure.decrement()},Y=b,D=!0,v=!1,F=[],Q=0,B={async read(){if(v)return U(st("closed","Reader is closed"));if(Q<F.length){let ae=F[Q++];return Y=ae.position+1,I(),O({type:"stream_read",workflowId:s,namespace:S,position:ae.position,ts:Date.now()}),J(ae.value)}let Se=`${s}:${S}`,G=Date.now(),se=j.has(Se),z=await fe.getMetadata(s,S),re=z.ok&&z.value!==void 0;for(;Date.now()-G<A;){let ae=await fe.read(s,S,Y,100);if(!ae.ok)return U(st("store_error",ae.error.message,ae.error));let Ne=ae.value;if(Ne.length>0){F=Ne,Q=1;let Fe=Ne[0];return Y=Fe.position+1,I(),O({type:"stream_read",workflowId:s,namespace:S,position:Fe.position,ts:Date.now()}),J(Fe.value)}let je=j.has(Se),xe=await fe.getMetadata(s,S),dt=xe.ok&&xe.value!==void 0;if(je&&(se=!0),dt&&(re=!0),xe.ok&&xe.value?.closed)return D=!1,U(Ge(Y));if(se&&!je&&!dt)return D=!1,U(Ge(Y));re&&!je&&xe.ok&&xe.value?.closed,await new Promise(Fe=>setTimeout(Fe,P))}return D=!1,U(Ge(Y))},close(){v=!0,D=!1,F=[],$.delete(H)},get readable(){return D},get position(){return Y},get namespace(){return S}};return $.set(H,{reader:B,position:Y,closed:v}),B},f.streamForEach=async(w,S,b)=>{let P=b?.checkpointInterval??1,A=b?.concurrency??1,H=[],R=0,I=-1,Y=v=>typeof v=="object"&&v!==null&&"read"in v&&typeof v.read=="function",D=async(v,F,Q,B)=>{let G=P>0&&F%P===0?`stream-foreach:${B}:pos-${Q}`:void 0,se=G??`stream-item-${Q}`,z=await f(se,()=>S(v,F),{key:G});return{index:F,position:Q,result:z}};if(Y(w))if(A<=1){let v=w.position,F=await w.read();for(;F.ok;){let Q=F.value,{result:B}=await D(Q,R,v,w.namespace);H.push(B),I=v,R++,v=w.position,F=await w.read()}}else{let v=new Map,F=0,Q=0,B=new Array(A).fill(null),Se=async()=>{for(let ae=0;ae<B.length;ae++)if(B[ae]===null)return ae;let z=B.filter(ae=>ae!==null),re=await Promise.race(z);return v.set(re.index,{position:re.position,result:re.result}),B[re.slotIndex]=null,re.slotIndex},G=w.position,se=await w.read();for(;se.ok;){let z=await Se(),re=F,ae=G,Ne=se.value,je=z;B[z]=D(Ne,re,ae,w.namespace).then(xe=>({slotIndex:je,...xe})),Q++,F++,G=w.position,se=await w.read()}for(let z=0;z<B.length;z++)if(B[z]!==null){let re=await B[z];v.set(re.index,{position:re.position,result:re.result})}for(let z=0;z<Q;z++){let re=v.get(z);re&&(H.push(re.result),I=re.position,R++)}}else if(A<=1){let v=0;for await(let F of w){let{result:Q}=await D(F,v,v,"async-iterable");H.push(Q),I=v,R++,v++}}else{let v=new Map,F=0,Q=0,B=new Array(A).fill(null),Se=async()=>{for(let z=0;z<B.length;z++)if(B[z]===null)return z;let G=B.filter(z=>z!==null),se=await Promise.race(G);return v.set(se.index,se.result),B[se.slotIndex]=null,se.slotIndex};for await(let G of w){let se=await Se(),z=F,re=se;B[se]=D(G,z,z,"async-iterable").then(ae=>({slotIndex:re,...ae})),Q++,F++}for(let G=0;G<B.length;G++)if(B[G]!==null){let se=await B[G];v.set(se.index,se.result)}for(let G=0;G<Q;G++)v.has(G)&&(H.push(v.get(G)),I=G,R++)}return{results:H,processedCount:R,lastPosition:I}},f.if=d.if,f.label=d.label,f.branch=d.branch,f.arm=d.arm,f.forEach=d.forEach,f.item=d.item,f.dep=d.dep,f.run=(w,S,b)=>f(w,typeof S=="function"?S:()=>S,b),f.andThen=(w,S,b,P)=>f(w,()=>b(S),P),f.match=(w,S,b,P)=>f(w,async()=>{let A=await S;return A.ok?J(await b.ok(A.value)):J(await b.err(A.error,A.cause))},P),f.all=(w,S,b)=>{let P=b!==void 0&&Object.prototype.hasOwnProperty.call(b,"key")?b:{...b,key:void 0};return f(w,async()=>J(await d.all(w,S)),P)},f.map=(w,S,b,P)=>{let A=P!==void 0&&Object.prototype.hasOwnProperty.call(P,"key")?P:{...P,key:void 0};return f(w,async()=>J(await d.map(w,S,b,P)),A)},f},Dt=a?({step:d})=>p({step:pt(d),deps:c,args:n,ctx:ve}):({step:d})=>p({step:pt(d),deps:c,ctx:ve}),me;try{me=await He(Dt,{onError:g,onEvent:T,catchUnexpected:Ee,workflowId:s,workflowName:e,context:k,_workflowSignal:u})}finally{u&&u.removeEventListener("abort",_e)}let $e=performance.now()-ge;if(!me.ok){let d;if(be(me.cause)&&(d=me.cause),!d&&de&&yt(me.error)){let f=me.cause;f!=null&&typeof f=="object"&&"name"in f&&f.name==="AbortError"&&(d={type:"WORKFLOW_CANCELLED",reason:Pe??(typeof u?.reason=="string"?u.reason:u?.reason instanceof Error?u.reason.message:void 0),lastStepKey:Re})}if(d)return O({type:"workflow_cancelled",workflowId:s,ts:Date.now(),durationMs:$e,reason:d.reason,lastStepKey:d.lastStepKey}),d&&!be(me.cause)?U(me.error,{cause:d}):me}if(me.ok&&de){let d=Pe??(typeof u?.reason=="string"?u.reason:u?.reason instanceof Error?u.reason.message:void 0);O({type:"workflow_cancelled",workflowId:s,ts:Date.now(),durationMs:$e,reason:d,lastStepKey:Re});let f={type:"WORKFLOW_CANCELLED",reason:d,lastStepKey:Re};return U(Ee(f),{cause:f})}return me.ok?(O({type:"workflow_success",workflowId:s,ts:Date.now(),durationMs:$e}),Oe(!0)):(O({type:"workflow_error",workflowId:s,ts:Date.now(),durationMs:$e,error:me.error}),Oe(!1)),me}function m(t,o,...n){let p=2+n.length,a=o,s=n[0],l=new Set(["cache","onEvent","resumeState","onError","onBeforeStart","onAfterStep","shouldRun","createContext","signal","description","markdown","streamStore"]),k=g=>{if(g==null||typeof g!="object")return!1;let L=Object.keys(g);return L.length===0?!1:L.every(K=>l.has(K))},u=g=>{if(typeof process<"u"&&process.env?.NODE_ENV==="development")throw new Error(g);console.warn(g)};p>=2&&typeof t=="function"&&typeof a!="function"&&k(a)&&u(`awaitly: Detected workflow options (${Object.keys(a).join(", ")}) passed to the workflow executor.
|
|
14
|
-
This call signature ignores options. Use one of:
|
|
15
|
-
- Per-run: await workflow.run(fn, { ${Object.keys(a).join(", ")} })
|
|
16
|
-
- Creation: const workflow = createWorkflow('${e}', deps, { ${Object.keys(a).join(", ")} })`),p>=3&&typeof a=="function"&&k(s)&&u(`awaitly: Detected workflow options (${Object.keys(s).join(", ")}) passed to the workflow executor.
|
|
17
|
-
This call signature ignores options. Use:
|
|
18
|
-
- Per-run: await workflow.run(args, fn, { ${Object.keys(s).join(", ")} })
|
|
19
|
-
- Creation: const workflow = createWorkflow('${e}', deps, { ${Object.keys(s).join(", ")} })`);let T=h(t,o);return V(T)}function ne(t,o,n){let p=h(t,typeof o=="function"?o:void 0),a=x(t,o,n);return V(p,a)}function le(t){let o=ne,n=(p,a)=>{let s=h(p,a);return s.args===void 0?o(s.fn,t):o(s.args,s.fn,t)};return n.run=(p,a,s)=>{let l=h(p,typeof a=="function"?a:void 0),k=x(p,a,s),u={...t,...k??{}};return l.args===void 0?o(l.fn,u):o(l.args,l.fn,u)},n.with=p=>le({...t,...p}),n.getSnapshot=ce,n.subscribe=Te,Object.defineProperty(n,"name",{value:e,enumerable:!0,configurable:!0}),n.deps=Object.freeze({...c}),n.options=E?Object.freeze({...E}):void 0,Object.defineProperty(n,"snapshot",{get:()=>ce(),enumerable:!0,configurable:!0}),n}function ce(t){return ue(t)}function Te(t,o){let n={listener:t,options:o??{}};return C.push(n),()=>{let p=C.indexOf(n);p!==-1&&C.splice(p,1)}}let oe=m;return oe.run=ne,oe.with=le,oe.getSnapshot=ce,oe.subscribe=Te,Object.defineProperty(oe,"name",{value:e,enumerable:!0,configurable:!0}),oe.deps=Object.freeze({...c}),oe.options=E?Object.freeze({...E}):void 0,Object.defineProperty(oe,"snapshot",{get:()=>ce(),enumerable:!0,configurable:!0}),m}var lt;function tn(){let e=new Map;return{async save(r,i){e.set(r,{snapshot:i,updatedAt:new Date})},async load(r){return e.get(r)?.snapshot??null},async delete(r){e.delete(r)},async list(r){let i=r?.prefix??"",c=r?.limit??100,E=[];for(let[h,x]of e.entries())if(!(i&&!h.startsWith(i))&&(E.push({id:h,updatedAt:x.updatedAt.toISOString()}),E.length>=c))break;return E.sort((h,x)=>x.updatedAt.localeCompare(h.updatedAt)),E},async close(){}}}function nn(){return lt===void 0&&(lt=tn()),lt}function Ot(e){return typeof e=="object"&&e!==null&&e.type==="VERSION_MISMATCH"}function At(e){return typeof e=="object"&&e!==null&&e.type==="CONCURRENT_EXECUTION"}function vt(e){return typeof e=="object"&&e!==null&&e.type==="PERSISTENCE_ERROR"}function bt(e){return typeof e.tryAcquire=="function"&&typeof e.release=="function"}var ct=new Set,Pt={async run(e,r,i){let{id:c,store:E,version:h=1,allowConcurrent:x=!1,lockTtlMs:_=6e4,metadata:X,signal:y,createContext:te,onEvent:W,onError:ie,onVersionMismatch:we}=i,C=E??nn();if(!x&&ct.has(c)){let ee={type:"CONCURRENT_EXECUTION",workflowId:c,message:`Workflow '${c}' is already running. Set allowConcurrent: true to allow parallel executions.`,reason:"in-process"};return U(ee)}let Z=null;if(!x&&bt(C)){let ee;try{ee=await C.tryAcquire(c,{ttlMs:_})}catch(ue){let ke={type:"PERSISTENCE_ERROR",operation:"load",workflowId:c,cause:ue,message:`Failed to acquire lock for workflow '${c}': ${ue instanceof Error?ue.message:String(ue)}`};return U(ke)}if(ee===null){let ue={type:"CONCURRENT_EXECUTION",workflowId:c,message:`Workflow '${c}' is already running (lease held by another process). Set allowConcurrent: true to allow parallel executions.`,reason:"cross-process"};return U(ue)}Z=ee.ownerToken}ct.add(c);try{let ee=null;try{ee=await C.load(c)}catch(V){let m={type:"PERSISTENCE_ERROR",operation:"load",workflowId:c,cause:V,message:`Failed to load state for workflow '${c}': ${V instanceof Error?V.message:String(V)}`};return U(m)}if(ee){let V=typeof ee.metadata?.version=="number"?ee.metadata.version:1;if(V!==h){let m={type:"VERSION_MISMATCH",workflowId:c,storedVersion:V,requestedVersion:h,currentVersion:h,message:`Workflow '${c}' has stored state at version ${V} but this run requested version ${h}. Migrate the stored state to the new version, or clear state for this id (e.g. durable.deleteState(store, '${c}')) and re-run.`};if(!we)return U(m);let ne=await Promise.resolve(we({id:c,storedVersion:V,requestedVersion:h}));if(ne==="throw")return U(m);if(ne==="clear"){try{await C.delete(c)}catch{}ee=null}else ee=ne.migratedSnapshot}}let ue=(V,m)=>{W&&W(V,m)},ke=null,Le={snapshot:ee,onAfterStep:async(V,m,ne,le)=>{try{if(!ke)throw new Error("Workflow instance not available");let ce=ke.getSnapshot({metadata:{...ee?.metadata??{},...X,version:h,lastStepKey:V}}),Te=ee?St(ee,ce):ce;await C.save(c,Te),ue({type:"persist_success",workflowId:ne,stepKey:V,ts:Date.now(),context:le},le)}catch(ce){ue({type:"persist_error",workflowId:ne,stepKey:V,error:ce,ts:Date.now(),context:le},le)}},onEvent:(V,m)=>{ue(V,m)},onError:ie,signal:y,createContext:te};try{ke=ut(c,e,Le)}catch(V){if(V instanceof Ce){let m={type:"PERSISTENCE_ERROR",operation:"load",workflowId:c,cause:V,message:`Invalid snapshot format for workflow '${c}': ${V.message}`};return U(m)}throw V}let Oe=await ke(r);if(Oe.ok)try{await C.delete(c)}catch(V){let m={type:"PERSISTENCE_ERROR",operation:"delete",workflowId:c,cause:V,message:`Failed to delete state for workflow '${c}': ${V instanceof Error?V.message:String(V)}`};return U(m)}return Oe}finally{if(ct.delete(c),Z!==null&&bt(C))try{await C.release(c,Z)}catch{}}},async clearState(e){let r=e;if(typeof r.clear=="function"){await r.clear();return}let i=100;for(;;){let c=await e.list({limit:i});if(c.length===0)break;let E=c.map(h=>h.id);if(await this.deleteStates(e,E,{continueOnError:!0}),c.length<i)break}},async hasState(e,r){try{return await e.load(r)!==null}catch{return!1}},async deleteState(e,r){try{return await e.delete(r),!0}catch{return!1}},async deleteStates(e,r,i={}){let{concurrency:c=10,continueOnError:E=!0}=i;if(r.length===0)return{deleted:0};let h=[],x=0,_=async y=>{try{await e.delete(y),x++}catch(te){if(E)h.push({id:y,error:te});else throw te}},X=Math.max(1,c);for(let y=0;y<r.length;y+=X){let te=r.slice(y,y+X);await Promise.all(te.map(W=>_(W)))}return h.length>0?{deleted:x,errors:h}:{deleted:x}},async listPending(e,r){try{return await e.list(r)}catch{return[]}}};0&&(module.exports={durable,isConcurrentExecution,isPersistenceError,isVersionMismatch,isWorkflowCancelled});
|
|
10
|
+
const restored = parseState(json); // Load this`),typeof m.steps=="object"&&m.steps!==null&&(m.steps=new Map(Object.entries(m.steps))));for(let[l,C]of m.steps){let{result:V,meta:n}=C;if(V.ok)u.set(l,V);else{let E=n??{origin:"result",resultCause:V.cause};u.set(l,xe(V.error,E,V.cause))}}}let _=v?.snapshot??w?.snapshot,j=w?.serialization;if(_&&!r){u||(u=new Map);let m=_,l=j?.decode;for(let[C,V]of Object.entries(m.steps))if(Object.prototype.hasOwnProperty.call(m.steps,C))try{if(V.ok){let n=l?l(V.value):V.value;u.set(C,$(n))}else{let n=l?l(V.error):V.error,E=$e(V.cause),S=V.meta?.origin==="throw"?{origin:"throw",thrown:E}:{origin:"result",resultCause:E};u.set(C,xe(n,S,E))}}catch(n){throw new he(`Failed to decode step "${C}": ${n instanceof Error?n.message:String(n)}`,C,n instanceof Error?n:void 0)}}let I=!1,O,z,Y=()=>{I=!0,O=typeof g?.reason=="string"?g.reason:g?.reason instanceof Error?g.reason.message:void 0};g&&!g.aborted&&g.addEventListener("abort",Y,{once:!0});let Ce=()=>{if(I||g?.aborted)throw{type:"WORKFLOW_CANCELLED",reason:O??(typeof g?.reason=="string"?g.reason:g?.reason instanceof Error?g.reason.message:void 0),lastStepKey:z}},ue=async(m,l,C)=>{if(!le)return;let V=performance.now();try{await le(m,l,k,H);let n=performance.now()-V;s({type:"hook_after_step",workflowId:k,stepKey:m,ts:Date.now(),durationMs:n})}catch(n){let E=performance.now()-V;throw s({type:"hook_after_step_error",workflowId:k,stepKey:m,ts:Date.now(),durationMs:E,error:n}),n}},Te=m=>{let l=async(n,E,S)=>{if(typeof n!="string")throw new Error('[awaitly] step() requires a string ID as the first argument. Example: step("fetchUser", () => fetchUser(id))');let A=n,h=S??{},F=A,y=Object.prototype.hasOwnProperty.call(h,"key")?h.key:A,{ttl:D,out:J}=h;if(Ce(),y&&u&&u.has(y)){s({type:"step_cache_hit",workflowId:k,stepKey:y,name:F,ts:Date.now()});let M=u.get(y);if(M.ok)return z=y,J&&(ee[J]=M.value),M.value;let P=We(M.cause);throw Oe(M.error,P)}y&&u&&s({type:"step_cache_miss",workflowId:k,stepKey:y,name:F,ts:Date.now()});try{let M=await m(A,E,h);return J&&(ee[J]=M),y&&(z=y,u&&u.set(y,$(M),D?{ttl:D}:void 0),await ue(y,$(M))),M}catch(M){if(y&&Pe(M)){let P=M,K=P.meta.origin==="result"?P.meta.resultCause:P.meta.thrown,Q=xe(P.error,P.meta,K);u&&u.set(y,Q,D?{ttl:D}:void 0),await ue(y,Q,P.meta)}throw M}};l.try=async(n,E,S)=>{let{ttl:A}=S,h=S.key??n,F=n;if(u&&u.has(h)){s({type:"step_cache_hit",workflowId:k,stepKey:h,name:F,ts:Date.now()});let y=u.get(h);if(y.ok)return y.value;let D=We(y.cause);throw Oe(y.error,D)}u&&s({type:"step_cache_miss",workflowId:k,stepKey:h,name:F,ts:Date.now()});try{let y=await m.try(n,E,{...S,key:h});return u&&u.set(h,$(y),A?{ttl:A}:void 0),await ue(h,$(y)),y}catch(y){if(Pe(y)){let D=y,J=D.meta.origin==="result"?D.meta.resultCause:D.meta.thrown,M=xe(D.error,D.meta,J);u&&u.set(h,M,A?{ttl:A}:void 0),await ue(h,M,D.meta)}throw y}},l.fromResult=async(n,E,S)=>{let{ttl:A}=S,h=S.key??n,F=n;if(u&&u.has(h)){s({type:"step_cache_hit",workflowId:k,stepKey:h,name:F,ts:Date.now()});let y=u.get(h);if(y.ok)return y.value;let D=We(y.cause);throw Oe(y.error,D)}u&&s({type:"step_cache_miss",workflowId:k,stepKey:h,name:F,ts:Date.now()});try{let y=await m.fromResult(n,E,{...S,key:h});return u&&u.set(h,$(y),A?{ttl:A}:void 0),await ue(h,$(y)),y}catch(y){if(Pe(y)){let D=y,J=D.meta.origin==="result"?D.meta.resultCause:D.meta.thrown,M=xe(D.error,D.meta,J);u&&u.set(h,M,A?{ttl:A}:void 0),await ue(h,M,D.meta)}throw y}},l.parallel=m.parallel,l.race=m.race,l.allSettled=m.allSettled,l.retry=(n,E,S)=>{let A={key:S.key,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,ttl:S.ttl};return l(n,E,A)},l.withTimeout=(n,E,S)=>{let A={key:S.key,timeout:S,ttl:S.ttl};return l(n,E,A)},l.sleep=(n,E,S)=>{if(typeof n!="string"||n.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 E=="string"?lt(E):E;if(!A)throw new Error(`step.sleep: invalid duration '${E}'`);let h=ut(A),F=S?.signal;return l(n,async()=>{if(g?.aborted||F?.aborted){let D=new Error("Sleep aborted");throw D.name="AbortError",D}return new Promise((D,J)=>{let M={timeoutId:void 0},P=()=>{M.timeoutId&&clearTimeout(M.timeoutId);let K=new Error("Sleep aborted");K.name="AbortError",J(K)};g?.addEventListener("abort",P,{once:!0}),F?.addEventListener("abort",P,{once:!0}),M.timeoutId=setTimeout(()=>{g?.removeEventListener("abort",P),F?.removeEventListener("abort",P),D($(void 0))},h)})},{key:S?.key,ttl:S?.ttl,description:S?.description})};let C=new Map,V=new Map;return l.getWritable=n=>{let E=n?.namespace??"default",S=n?.highWaterMark??16;if(!f)throw new Error("streamStore is required to use getWritable(). Pass a streamStore to createWorkflow options.");let A=`${k}:${E}`,h=C.get(A);if(h&&!h.closed&&!h.aborted)return h.writer;let F=it({highWaterMark:S,onStateChange:K=>{s({type:"stream_backpressure",workflowId:k,namespace:E,bufferedCount:F.bufferedCount,state:K,ts:Date.now()})}}),y=0,D=!0,J=!1,M=!1;s({type:"stream_created",workflowId:k,namespace:E,ts:Date.now()});let P={async write(K){if(M)return W(Ue("closed","Stream is closed"));if(J)return W(Ue("aborted","Stream was aborted"));F.state==="paused"&&await F.waitForDrain();let Q={value:K,position:y,ts:Date.now()},L=await f.append(k,E,Q);return L.ok?(s({type:"stream_write",workflowId:k,namespace:E,position:y,ts:Date.now()}),y++,F.increment(),$(void 0)):(s({type:"stream_error",workflowId:k,namespace:E,error:L.error,position:y,ts:Date.now()}),W(Ue("store_error",L.error.message,L.error)))},async close(){if(M)return W(Je("already_closed","Stream is already closed"));let K=await f.closeStream(k,E);return K.ok?(M=!0,D=!1,s({type:"stream_close",workflowId:k,namespace:E,finalPosition:y,ts:Date.now()}),C.delete(A),$(void 0)):W(Je("store_error",K.error.message,K.error))},abort(K){J=!0,D=!1,M=!0,s({type:"stream_error",workflowId:k,namespace:E,error:K,position:y,ts:Date.now()}),C.delete(A)},get writable(){return D},get position(){return y},get namespace(){return E}};return C.set(A,{writer:P,backpressure:F,aborted:J,closed:M}),P},l.getReadable=n=>{let E=n?.namespace??"default",S=n?.startIndex??0,A=n?.pollInterval??10,h=n?.pollTimeout??3e4;if(!f)throw new Error("streamStore is required to use getReadable(). Pass a streamStore to createWorkflow options.");let F=`${k}:${E}:${S}`,y=V.get(F);if(y&&!y.closed)return y.reader;let D=()=>{let we=`${k}:${E}`,q=C.get(we);q&&q.backpressure.decrement()},J=S,M=!0,P=!1,K=[],Q=0,L={async read(){if(P)return W(He("closed","Reader is closed"));if(Q<K.length){let se=K[Q++];return J=se.position+1,D(),s({type:"stream_read",workflowId:k,namespace:E,position:se.position,ts:Date.now()}),$(se.value)}let we=`${k}:${E}`,q=Date.now(),oe=C.has(we),B=await f.getMetadata(k,E),te=B.ok&&B.value!==void 0;for(;Date.now()-q<h;){let se=await f.read(k,E,J,100);if(!se.ok)return W(He("store_error",se.error.message,se.error));let be=se.value;if(be.length>0){K=be,Q=1;let Ae=be[0];return J=Ae.position+1,D(),s({type:"stream_read",workflowId:k,namespace:E,position:Ae.position,ts:Date.now()}),$(Ae.value)}let ve=C.has(we),ye=await f.getMetadata(k,E),Ye=ye.ok&&ye.value!==void 0;if(ve&&(oe=!0),Ye&&(te=!0),ye.ok&&ye.value?.closed)return M=!1,W(Ne(J));if(oe&&!ve&&!Ye)return M=!1,W(Ne(J));te&&!ve&&ye.ok&&ye.value?.closed,await new Promise(Ae=>setTimeout(Ae,A))}return M=!1,W(Ne(J))},close(){P=!0,M=!1,K=[],V.delete(F)},get readable(){return M},get position(){return J},get namespace(){return E}};return V.set(F,{reader:L,position:J,closed:P}),L},l.streamForEach=async(n,E,S)=>{let A=S?.checkpointInterval??1,h=S?.concurrency??1,F=[],y=0,D=-1,J=P=>typeof P=="object"&&P!==null&&"read"in P&&typeof P.read=="function",M=async(P,K,Q,L)=>{let q=A>0&&K%A===0?`stream-foreach:${L}:pos-${Q}`:void 0,oe=q??`stream-item-${Q}`,B=await l(oe,()=>E(P,K),{key:q});return{index:K,position:Q,result:B}};if(J(n))if(h<=1){let P=n.position,K=await n.read();for(;K.ok;){let Q=K.value,{result:L}=await M(Q,y,P,n.namespace);F.push(L),D=P,y++,P=n.position,K=await n.read()}}else{let P=new Map,K=0,Q=0,L=new Array(h).fill(null),we=async()=>{for(let se=0;se<L.length;se++)if(L[se]===null)return se;let B=L.filter(se=>se!==null),te=await Promise.race(B);return P.set(te.index,{position:te.position,result:te.result}),L[te.slotIndex]=null,te.slotIndex},q=n.position,oe=await n.read();for(;oe.ok;){let B=await we(),te=K,se=q,be=oe.value,ve=B;L[B]=M(be,te,se,n.namespace).then(ye=>({slotIndex:ve,...ye})),Q++,K++,q=n.position,oe=await n.read()}for(let B=0;B<L.length;B++)if(L[B]!==null){let te=await L[B];P.set(te.index,{position:te.position,result:te.result})}for(let B=0;B<Q;B++){let te=P.get(B);te&&(F.push(te.result),D=te.position,y++)}}else if(h<=1){let P=0;for await(let K of n){let{result:Q}=await M(K,P,P,"async-iterable");F.push(Q),D=P,y++,P++}}else{let P=new Map,K=0,Q=0,L=new Array(h).fill(null),we=async()=>{for(let B=0;B<L.length;B++)if(L[B]===null)return B;let q=L.filter(B=>B!==null),oe=await Promise.race(q);return P.set(oe.index,oe.result),L[oe.slotIndex]=null,oe.slotIndex};for await(let q of n){let oe=await we(),B=K,te=oe;L[oe]=M(q,B,B,"async-iterable").then(se=>({slotIndex:te,...se})),Q++,K++}for(let q=0;q<L.length;q++)if(L[q]!==null){let oe=await L[q];P.set(oe.index,oe.result)}for(let q=0;q<Q;q++)P.has(q)&&(F.push(P.get(q)),D=q,y++)}return{results:F,processedCount:y,lastPosition:D}},l.if=m.if,l.label=m.label,l.branch=m.branch,l.arm=m.arm,l.forEach=m.forEach,l.item=m.item,l.dep=m.dep,l.run=(n,E,S)=>l(n,typeof E=="function"?E:()=>E,S),l.andThen=(n,E,S,A)=>l(n,()=>S(E),A),l.match=(n,E,S,A)=>l(n,async()=>{let h=await E;return h.ok?$(await S.ok(h.value)):$(await S.err(h.error,h.cause))},A),l.all=(n,E,S)=>{let A=S!==void 0&&Object.prototype.hasOwnProperty.call(S,"key")?S:{...S,key:void 0};return l(n,async()=>$(await m.all(n,E)),A)},l.map=(n,E,S,A)=>{let h=A!==void 0&&Object.prototype.hasOwnProperty.call(A,"key")?A:{...A,key:void 0};return l(n,async()=>$(await m.map(n,E,S,A)),h)},l},G=({step:m})=>X({step:Te(m),deps:ae,ctx:p}),Z;try{Z=await Ie(G,{onError:me,onEvent:ne,catchUnexpected:N,workflowId:k,workflowName:e,context:H,_workflowSignal:g})}finally{g&&g.removeEventListener("abort",Y)}let de=performance.now()-c;if(!Z.ok){let m;if(ke(Z.cause)&&(m=Z.cause),!m&&I&&tt(Z.error)){let l=Z.cause;l!=null&&typeof l=="object"&&"name"in l&&l.name==="AbortError"&&(m={type:"WORKFLOW_CANCELLED",reason:O??(typeof g?.reason=="string"?g.reason:g?.reason instanceof Error?g.reason.message:void 0),lastStepKey:z})}if(m)return s({type:"workflow_cancelled",workflowId:k,ts:Date.now(),durationMs:de,reason:m.reason,lastStepKey:m.lastStepKey}),m&&!ke(Z.cause)?W(Z.error,{cause:m}):Z}if(Z.ok&&I){let m=O??(typeof g?.reason=="string"?g.reason:g?.reason instanceof Error?g.reason.message:void 0);s({type:"workflow_cancelled",workflowId:k,ts:Date.now(),durationMs:de,reason:m,lastStepKey:z});let l={type:"WORKFLOW_CANCELLED",reason:m,lastStepKey:z};return W(N(l),{cause:l})}return Z.ok?s({type:"workflow_success",workflowId:k,ts:Date.now(),durationMs:de}):s({type:"workflow_error",workflowId:k,ts:Date.now(),durationMs:de,error:Z.error}),Z}function b(d,X,v){let k,ae,T;return typeof d=="string"?(k=d,ae=X,T=v):(ae=d,T=X),x(k,ae,T)}async function U(d,X,v){let k,ae,T;typeof d=="string"?(k=d,ae=X,T=v):(ae=d,T=X);let H=De(),g=T?.onEvent,me={...T,onEvent:(le,r)=>{H.handleEvent(le);try{g?.(le,r)}catch{}}},fe,Ee;try{fe=await x(k,ae,me)}catch(le){let r=w?.catchUnexpected??Me;fe=W(r(le),{cause:le})}finally{Ee=H.getResumeState()}return{result:fe,resumeState:Ee}}return{run:b,runWithState:U}}var Xe;function Ft(){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,w=[];for(let[x,b]of e.entries())if(!(o&&!x.startsWith(o))&&(w.push({id:x,updatedAt:b.updatedAt.toISOString()}),w.length>=a))break;return w.sort((x,b)=>b.updatedAt.localeCompare(x.updatedAt)),w},async close(){}}}function Vt(){return Xe===void 0&&(Xe=Ft()),Xe}function pt(e){return typeof e=="object"&&e!==null&&e.type==="VERSION_MISMATCH"}function mt(e){return typeof e=="object"&&e!==null&&e.type==="CONCURRENT_EXECUTION"}function dt(e){return typeof e=="object"&&e!==null&&e.type==="PERSISTENCE_ERROR"}function ct(e){return typeof e.tryAcquire=="function"&&typeof e.release=="function"}var ze=new Set,ft={async run(e,t,o){let{id:a,store:w,version:x=1,allowConcurrent:b=!1,lockTtlMs:U=6e4,metadata:re,signal:d,createContext:X,onEvent:v,onError:k,onVersionMismatch:ae}=o,T=w??Vt();if(!b&&ze.has(a)){let g={type:"CONCURRENT_EXECUTION",workflowId:a,message:`Workflow '${a}' is already running. Set allowConcurrent: true to allow parallel executions.`,reason:"in-process"};return W(g)}let H=null;if(!b&&ct(T)){let g;try{g=await T.tryAcquire(a,{ttlMs:U})}catch(ne){let me={type:"PERSISTENCE_ERROR",operation:"load",workflowId:a,cause:ne,message:`Failed to acquire lock for workflow '${a}': ${ne instanceof Error?ne.message:String(ne)}`};return W(me)}if(g===null){let ne={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 W(ne)}H=g.ownerToken}ze.add(a);try{let g=null;try{g=await T.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 W(N)}if(g)try{st(g)}catch(r){if(r instanceof Re){let N={type:"PERSISTENCE_ERROR",operation:"load",workflowId:a,cause:r,message:`Invalid snapshot format for workflow '${a}': ${r.message}`};return W(N)}throw r}if(g){let r=typeof g.metadata?.version=="number"?g.metadata.version:1;if(r!==x){let N={type:"VERSION_MISMATCH",workflowId:a,storedVersion:r,requestedVersion:x,currentVersion:x,message:`Workflow '${a}' has stored state at version ${r} but this run requested version ${x}. Migrate the stored state to the new version, or clear state for this id (e.g. durable.deleteState(store, '${a}')) and re-run.`};if(!ae)return W(N);let ee=await Promise.resolve(ae({id:a,storedVersion:r,requestedVersion:x}));if(ee==="throw")return W(N);if(ee==="clear"){try{await T.delete(a)}catch{}g=null}else g=ee.migratedSnapshot}}let ne=(r,N)=>{v&&v(r,N)},me=De(),fe={snapshot:g,onAfterStep:async(r,N,ee,ce)=>{try{let pe=me.getResumeState(),ie={};for(let[i,R]of pe.steps)if(R.result.ok)ie[i]={ok:!0,value:R.result.value};else{let c=R.result.cause,u=c instanceof Error?Le(c):Be(c),f=R.meta?.origin==="throw"?"throw":"result";ie[i]={ok:!1,error:R.result.error,cause:u,meta:{origin:f}}}let p={formatVersion:1,workflowName:a,steps:ie,execution:{status:"running",lastUpdated:new Date().toISOString(),currentStepId:r},metadata:{...g?.metadata??{},...re,version:x,lastStepKey:r}},s=g?at(g,p):p;if(s.warnings&&s.warnings.length>0){let i=new Set(Object.keys(p.steps)),R=s.warnings.filter(c=>!i.has(c.stepId));s={...s,warnings:R.length>0?R:void 0}}await T.save(a,s),ne({type:"persist_success",workflowId:ee,stepKey:r,ts:Date.now(),context:ce},ce)}catch(pe){ne({type:"persist_error",workflowId:ee,stepKey:r,error:pe,ts:Date.now(),context:ce},ce)}},onEvent:(r,N)=>{me.handleEvent(r),ne(r,N)},onError:k,signal:d,createContext:X},Ee;try{Ee=qe(a,e,fe)}catch(r){if(r instanceof Re){let N={type:"PERSISTENCE_ERROR",operation:"load",workflowId:a,cause:r,message:`Invalid snapshot format for workflow '${a}': ${r.message}`};return W(N)}throw r}let le;try{le=await Ee.run(t)}catch(r){if(r instanceof Re||r instanceof he){let N={type:"PERSISTENCE_ERROR",operation:"load",workflowId:a,cause:r,message:`Invalid snapshot format for workflow '${a}': ${r.message}`};return W(N)}throw r}if(le.ok)try{await T.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 W(N)}return le}finally{if(ze.delete(a),H!==null&&ct(T))try{await T.release(a,H)}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 w=a.map(x=>x.id);if(await this.deleteStates(e,w,{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:w=!0}=o;if(t.length===0)return{deleted:0};let x=[],b=0,U=async d=>{try{await e.delete(d),b++}catch(X){if(w)x.push({id:d,error:X});else throw X}},re=Math.max(1,a);for(let d=0;d<t.length;d+=re){let X=t.slice(d,d+re);await Promise.all(X.map(v=>U(v)))}return x.length>0?{deleted:b,errors:x}:{deleted:b}},async listPending(e,t){try{return await e.list(t)}catch{return[]}}};0&&(module.exports={durable,isConcurrentExecution,isPersistenceError,isVersionMismatch,isWorkflowCancelled});
|
|
20
11
|
//# sourceMappingURL=durable.cjs.map
|