@jagreehal/workflow 1.4.0 → 1.6.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/workflow.js CHANGED
@@ -1,2 +1,2 @@
1
- var O=e=>({ok:!0,value:e}),P=(e,n)=>({ok:!1,error:e,...n?.cause!==void 0?{cause:n.cause}:{}});var ie=e=>typeof e=="object"&&e!==null&&e.type==="UNEXPECTED_ERROR",j=Symbol.for("step_timeout_marker");function ne(e){return typeof e!="object"||e===null?!1:e.type==="STEP_TIMEOUT"?!0:j in e}function ce(e){if(!(typeof e!="object"||e===null)){if(e.type==="STEP_TIMEOUT"){let n=e;return{timeoutMs:n.timeoutMs,stepName:n.stepName,stepKey:n.stepKey,attempt:n.attempt}}if(j in e)return e[j]}}var se=Symbol("early-exit");function V(e,n){return{[se]:!0,error:e,meta:n}}function L(e){return typeof e=="object"&&e!==null&&e[se]===!0}var oe=Symbol("mapper-exception");function le(e){return{[oe]:!0,thrown:e}}function Ee(e){return typeof e=="object"&&e!==null&&e[oe]===!0}function ye(e){return typeof e=="string"?{name:e}:e??{}}function z(e,n){let{backoff:E,initialDelay:d,maxDelay:_,jitter:b}=n,g;switch(E){case"fixed":g=d;break;case"linear":g=d*e;break;case"exponential":g=d*Math.pow(2,e-1);break}if(g=Math.min(g,_),b){let c=g*.25*Math.random();g=g+c}return Math.floor(g)}function Q(e){return new Promise(n=>setTimeout(n,e))}var re=Symbol("timeout");async function me(e,n,E){let d=new AbortController,_=n.error??{type:"STEP_TIMEOUT",stepName:E.name,stepKey:E.key,timeoutMs:n.ms,attempt:E.attempt},b,g=new Promise((S,T)=>{b=setTimeout(()=>{d.abort(),T({[re]:!0,error:_})},n.ms)}),c;n.signal?c=Promise.resolve(e(d.signal)):c=Promise.resolve(e());try{return await Promise.race([c,g])}catch(S){if(typeof S=="object"&&S!==null&&S[re]===!0){let T=S.error;if(typeof T=="object"&&T!==null&&T.type!=="STEP_TIMEOUT"){let A={timeoutMs:n.ms,stepName:E.name,stepKey:E.key,attempt:E.attempt};j in T?T[j]=A:Object.defineProperty(T,j,{value:A,enumerable:!1,writable:!0,configurable:!1})}throw T}throw S}finally{clearTimeout(b)}}var K={backoff:"exponential",initialDelay:100,maxDelay:3e4,jitter:!0,retryOn:()=>!0,onRetry:()=>{}};async function W(e,n){let{onError:E,onEvent:d,catchUnexpected:_,workflowId:b,context:g}=n&&typeof n=="object"?n:{},c=b??crypto.randomUUID(),S=!E&&!_,T=[],A=0,F=u=>u??`step_${++A}`,m=u=>{if(u.type==="step_success"){let v=u.stepId;for(let y=T.length-1;y>=0;y--){let l=T[y];if(l.type==="race"&&!l.winnerId){l.winnerId=v;break}}}d?.(u,g)},D=V,C=u=>L(u),N=(u,v)=>S?v?.origin==="result"?{type:"UNEXPECTED_ERROR",cause:{type:"STEP_FAILURE",origin:"result",error:u,...v.resultCause!==void 0?{cause:v.resultCause}:{}}}:v?.origin==="throw"?{type:"UNEXPECTED_ERROR",cause:{type:"STEP_FAILURE",origin:"throw",error:u,thrown:v.thrown}}:{type:"UNEXPECTED_ERROR",cause:{type:"STEP_FAILURE",origin:"result",error:u}}:u,X=u=>u.origin==="result"?u.resultCause:u.thrown,G=u=>({type:"UNEXPECTED_ERROR",cause:u.meta.origin==="result"?{type:"STEP_FAILURE",origin:"result",error:u.error,...u.meta.resultCause!==void 0?{cause:u.meta.resultCause}:{}}:{type:"STEP_FAILURE",origin:"throw",error:u.error,thrown:u.meta.thrown}});try{let u=(l,a)=>(async()=>{let s=ye(a),{name:o,key:t,retry:p,timeout:r}=s,i=F(t),f=d,k=f?performance.now():0;if(!(typeof l=="function")){if(p&&p.attempts>1)throw new Error("step: retry options require a function operation. Direct Promise/Result values cannot be re-executed on retry. Wrap your operation in a function: step(() => yourOperation, { retry: {...} })");if(r)throw new Error("step: timeout options require a function operation. Direct Promise/Result values cannot be wrapped with timeout after they've started. Wrap your operation in a function: step(() => yourOperation, { timeout: {...} })")}let x={attempts:Math.max(1,p?.attempts??1),backoff:p?.backoff??K.backoff,initialDelay:p?.initialDelay??K.initialDelay,maxDelay:p?.maxDelay??K.maxDelay,jitter:p?.jitter??K.jitter,retryOn:p?.retryOn??K.retryOn,onRetry:p?.onRetry??K.onRetry};d&&m({type:"step_start",workflowId:c,stepId:i,stepKey:t,name:o,ts:Date.now()});let ee;for(let R=1;R<=x.attempts;R++){let pe=f?performance.now():0;try{let w;if(typeof l=="function"?r?w=await me(l,r,{name:o,key:t,attempt:R}):w=await l():w=await l,w.ok){let M=performance.now()-k;return m({type:"step_success",workflowId:c,stepId:i,stepKey:t,name:o,ts:Date.now(),durationMs:M}),t&&m({type:"step_complete",workflowId:c,stepKey:t,name:o,ts:Date.now(),durationMs:M,result:w}),w.value}if(ee=w,R<x.attempts&&x.retryOn(w.error,R)){let M=z(R,x);m({type:"step_retry",workflowId:c,stepId:i,stepKey:t,name:o,ts:Date.now(),attempt:R+1,maxAttempts:x.attempts,delayMs:M,error:w.error}),x.onRetry(w.error,R,M),await Q(M);continue}x.attempts>1&&m({type:"step_retries_exhausted",workflowId:c,stepId:i,stepKey:t,name:o,ts:Date.now(),durationMs:performance.now()-k,attempts:R,lastError:w.error});break}catch(w){let M=performance.now()-pe;if(C(w))throw m({type:"step_aborted",workflowId:c,stepId:i,stepKey:t,name:o,ts:Date.now(),durationMs:M}),w;if(ne(w)){let h=ce(w),$=r?.ms??h?.timeoutMs??0;if(m({type:"step_timeout",workflowId:c,stepId:i,stepKey:t,name:o,ts:Date.now(),timeoutMs:$,attempt:R}),R<x.attempts&&x.retryOn(w,R)){let H=z(R,x);m({type:"step_retry",workflowId:c,stepId:i,stepKey:t,name:o,ts:Date.now(),attempt:R+1,maxAttempts:x.attempts,delayMs:H,error:w}),x.onRetry(w,R,H),await Q(H);continue}x.attempts>1&&m({type:"step_retries_exhausted",workflowId:c,stepId:i,stepKey:t,name:o,ts:Date.now(),durationMs:performance.now()-k,attempts:R,lastError:w})}if(R<x.attempts&&x.retryOn(w,R)){let h=z(R,x);m({type:"step_retry",workflowId:c,stepId:i,stepKey:t,name:o,ts:Date.now(),attempt:R+1,maxAttempts:x.attempts,delayMs:h,error:w}),x.onRetry(w,R,h),await Q(h);continue}x.attempts>1&&!ne(w)&&m({type:"step_retries_exhausted",workflowId:c,stepId:i,stepKey:t,name:o,ts:Date.now(),durationMs:performance.now()-k,attempts:R,lastError:w});let Y=performance.now()-k;if(_){let h;try{h=_(w)}catch($){throw le($)}throw m({type:"step_error",workflowId:c,stepId:i,stepKey:t,name:o,ts:Date.now(),durationMs:Y,error:h}),t&&m({type:"step_complete",workflowId:c,stepKey:t,name:o,ts:Date.now(),durationMs:Y,result:P(h,{cause:w}),meta:{origin:"throw",thrown:w}}),E?.(h,o),D(h,{origin:"throw",thrown:w})}else{let h={type:"UNEXPECTED_ERROR",cause:{type:"UNCAUGHT_EXCEPTION",thrown:w}};throw m({type:"step_error",workflowId:c,stepId:i,stepKey:t,name:o,ts:Date.now(),durationMs:Y,error:h}),t&&m({type:"step_complete",workflowId:c,stepKey:t,name:o,ts:Date.now(),durationMs:Y,result:P(h,{cause:w}),meta:{origin:"throw",thrown:w}}),w}}}let U=ee,te=performance.now()-k,ae=N(U.error,{origin:"result",resultCause:U.cause});throw m({type:"step_error",workflowId:c,stepId:i,stepKey:t,name:o,ts:Date.now(),durationMs:te,error:ae}),t&&m({type:"step_complete",workflowId:c,stepKey:t,name:o,ts:Date.now(),durationMs:te,result:U,meta:{origin:"result",resultCause:U.cause}}),E?.(U.error,o),D(U.error,{origin:"result",resultCause:U.cause})})();u.try=(l,a)=>{let s=a.name,o=a.key,t=F(o),p="error"in a?()=>a.error:a.onError,r=d;return(async()=>{let i=r?performance.now():0;d&&m({type:"step_start",workflowId:c,stepId:t,stepKey:o,name:s,ts:Date.now()});try{let f=await l(),k=performance.now()-i;return m({type:"step_success",workflowId:c,stepId:t,stepKey:o,name:s,ts:Date.now(),durationMs:k}),o&&m({type:"step_complete",workflowId:c,stepKey:o,name:s,ts:Date.now(),durationMs:k,result:O(f)}),f}catch(f){let k=p(f),I=performance.now()-i,J=N(k,{origin:"throw",thrown:f});throw m({type:"step_error",workflowId:c,stepId:t,stepKey:o,name:s,ts:Date.now(),durationMs:I,error:J}),o&&m({type:"step_complete",workflowId:c,stepKey:o,name:s,ts:Date.now(),durationMs:I,result:P(k,{cause:f}),meta:{origin:"throw",thrown:f}}),E?.(k,s),D(k,{origin:"throw",thrown:f})}})()},u.fromResult=(l,a)=>{let s=a.name,o=a.key,t=F(o),p="error"in a?()=>a.error:a.onError,r=d;return(async()=>{let i=r?performance.now():0;d&&m({type:"step_start",workflowId:c,stepId:t,stepKey:o,name:s,ts:Date.now()});let f=await l();if(f.ok){let k=performance.now()-i;return m({type:"step_success",workflowId:c,stepId:t,stepKey:o,name:s,ts:Date.now(),durationMs:k}),o&&m({type:"step_complete",workflowId:c,stepKey:o,name:s,ts:Date.now(),durationMs:k,result:O(f.value)}),f.value}else{let k=p(f.error),I=performance.now()-i,J=N(k,{origin:"result",resultCause:f.error});throw m({type:"step_error",workflowId:c,stepId:t,stepKey:o,name:s,ts:Date.now(),durationMs:I,error:J}),o&&m({type:"step_complete",workflowId:c,stepKey:o,name:s,ts:Date.now(),durationMs:I,result:P(k,{cause:f.error}),meta:{origin:"result",resultCause:f.error}}),E?.(k,s),D(k,{origin:"result",resultCause:f.error})}})()},u.retry=(l,a)=>u(l,{name:a.name,key:a.key,retry:{attempts:a.attempts,backoff:a.backoff,initialDelay:a.initialDelay,maxDelay:a.maxDelay,jitter:a.jitter,retryOn:a.retryOn,onRetry:a.onRetry},timeout:a.timeout}),u.withTimeout=(l,a)=>u(l,{name:a.name,key:a.key,timeout:a}),u.parallel=(l,a)=>{let s=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let o=performance.now(),t=!1;T.push({scopeId:s,type:"parallel"});let p=()=>{if(t)return;t=!0;let r=T.findIndex(i=>i.scopeId===s);r!==-1&&T.splice(r,1),m({type:"scope_end",workflowId:c,scopeId:s,ts:Date.now(),durationMs:performance.now()-o})};m({type:"scope_start",workflowId:c,scopeId:s,scopeType:"parallel",name:l,ts:Date.now()});try{let r=await a();if(p(),!r.ok)throw E?.(r.error,l),D(r.error,{origin:"result",resultCause:r.cause});return r.value}catch(r){throw p(),r}})()},u.race=(l,a)=>{let s=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let o=performance.now(),t=!1,p={scopeId:s,type:"race",winnerId:void 0};T.push(p);let r=()=>{if(t)return;t=!0;let i=T.findIndex(f=>f.scopeId===s);i!==-1&&T.splice(i,1),m({type:"scope_end",workflowId:c,scopeId:s,ts:Date.now(),durationMs:performance.now()-o,winnerId:p.winnerId})};m({type:"scope_start",workflowId:c,scopeId:s,scopeType:"race",name:l,ts:Date.now()});try{let i=await a();if(r(),!i.ok)throw E?.(i.error,l),D(i.error,{origin:"result",resultCause:i.cause});return i.value}catch(i){throw r(),i}})()},u.allSettled=(l,a)=>{let s=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let o=performance.now(),t=!1;T.push({scopeId:s,type:"allSettled"});let p=()=>{if(t)return;t=!0;let r=T.findIndex(i=>i.scopeId===s);r!==-1&&T.splice(r,1),m({type:"scope_end",workflowId:c,scopeId:s,ts:Date.now(),durationMs:performance.now()-o})};m({type:"scope_start",workflowId:c,scopeId:s,scopeType:"allSettled",name:l,ts:Date.now()});try{let r=await a();if(p(),!r.ok)throw E?.(r.error,l),D(r.error,{origin:"result",resultCause:r.cause});return r.value}catch(r){throw p(),r}})()};let y=await e(u);return O(y)}catch(u){if(Ee(u))throw u.thrown;if(C(u)){let y=X(u.meta);if(_||E)return P(u.error,{cause:y});if(ie(u.error))return P(u.error,{cause:y});let l=G(u);return P(l,{cause:y})}if(_){let y=_(u);return E?.(y,"unexpected"),P(y,{cause:u})}let v={type:"UNEXPECTED_ERROR",cause:{type:"UNCAUGHT_EXCEPTION",thrown:u}};return E?.(v,"unexpected"),P(v,{cause:u})}}W.strict=(e,n)=>W(e,n);function fe(){let e=new Map;return{handleEvent:n=>{ue(n)&&e.set(n.stepKey,{result:n.result,meta:n.meta})},getState:()=>({steps:new Map(e)}),clear:()=>e.clear()}}function we(e){return typeof e=="object"&&e!==null&&e.__cachedMeta===!0}function B(e,n,E){return P(e,{cause:{__cachedMeta:!0,originalCause:E,meta:n}})}function Z(e){return we(e)?e.meta:{origin:"result",resultCause:e}}function ke(e,n){async function E(d,_){let b=typeof _=="function",g=b?d:void 0,c=b?_:d,S=crypto.randomUUID(),T=n?.createContext?.(),A=y=>{n?.onEvent?.(y,T)},F=Date.now(),m=performance.now();A({type:"workflow_start",workflowId:S,ts:F});let D=n?.resumeState,C=n?.cache;if(D&&!C&&(C=new Map),D&&C){let y=typeof D=="function"?await D():D;for(let[l,a]of y.steps){let{result:s,meta:o}=a;if(s.ok)C.set(l,s);else{let t=o??{origin:"result",resultCause:s.cause};C.set(l,B(s.error,t,s.cause))}}}let N=y=>typeof y=="string"?{name:y}:y??{},X=y=>{if(!C)return y;let l=async(a,s)=>{let{name:o,key:t}=N(s);if(t&&C.has(t)){A({type:"step_cache_hit",workflowId:S,stepKey:t,name:o,ts:Date.now()});let r=C.get(t);if(r.ok)return r.value;let i=Z(r.cause);throw V(r.error,i)}t&&A({type:"step_cache_miss",workflowId:S,stepKey:t,name:o,ts:Date.now()});let p=typeof a=="function"?a:()=>a;try{let r=await y(p,s);return t&&C.set(t,O(r)),r}catch(r){if(t&&L(r)){let i=r,f=i.meta.origin==="result"?i.meta.resultCause:i.meta.thrown;C.set(t,B(i.error,i.meta,f))}throw r}};return l.try=async(a,s)=>{let{name:o,key:t}=s;if(t&&C.has(t)){A({type:"step_cache_hit",workflowId:S,stepKey:t,name:o,ts:Date.now()});let p=C.get(t);if(p.ok)return p.value;let r=Z(p.cause);throw V(p.error,r)}t&&A({type:"step_cache_miss",workflowId:S,stepKey:t,name:o,ts:Date.now()});try{let p=await y.try(a,s);return t&&C.set(t,O(p)),p}catch(p){if(t&&L(p)){let r=p,i=r.meta.origin==="result"?r.meta.resultCause:r.meta.thrown;C.set(t,B(r.error,r.meta,i))}throw p}},l.fromResult=async(a,s)=>{let{name:o,key:t}=s;if(t&&C.has(t)){A({type:"step_cache_hit",workflowId:S,stepKey:t,name:o,ts:Date.now()});let p=C.get(t);if(p.ok)return p.value;let r=Z(p.cause);throw V(p.error,r)}t&&A({type:"step_cache_miss",workflowId:S,stepKey:t,name:o,ts:Date.now()});try{let p=await y.fromResult(a,s);return t&&C.set(t,O(p)),p}catch(p){if(t&&L(p)){let r=p,i=r.meta.origin==="result"?r.meta.resultCause:r.meta.thrown;C.set(t,B(r.error,r.meta,i))}throw p}},l.parallel=y.parallel,l.race=y.race,l.allSettled=y.allSettled,l.retry=(a,s)=>l(a,{name:s.name,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}),l.withTimeout=(a,s)=>l(a,{name:s.name,key:s.key,timeout:s}),l},G=b?y=>c(X(y),e,g):y=>c(X(y),e),u;if(n?.strict===!0){let y=n;u=await W.strict(G,{onError:y.onError,onEvent:y.onEvent,catchUnexpected:y.catchUnexpected,workflowId:S,context:T})}else{let y=n;u=await W(G,{onError:y?.onError??(()=>{}),onEvent:y?.onEvent,workflowId:S,context:T})}let v=performance.now()-m;return u.ok?A({type:"workflow_success",workflowId:S,ts:Date.now(),durationMs:v}):A({type:"workflow_error",workflowId:S,ts:Date.now(),durationMs:v,error:u.error}),u}return E}function ue(e){return e.type==="step_complete"}function q(e){return typeof e=="object"&&e!==null&&e.type==="PENDING_APPROVAL"}function Re(e){return typeof e=="object"&&e!==null&&e.type==="APPROVAL_REJECTED"}function Se(e,n){return P({type:"PENDING_APPROVAL",stepKey:e,reason:n?.reason,metadata:n?.metadata})}function Ce(e){return async()=>{let n=await e.checkApproval();switch(n.status){case"pending":return P({type:"PENDING_APPROVAL",stepKey:e.key,reason:e.pendingReason,metadata:e.metadata});case"rejected":return P({type:"APPROVAL_REJECTED",stepKey:e.key,reason:n.reason});case"approved":return O(n.value)}}}function xe(e,n){let E=new Map(e.steps);return E.set(n.stepKey,{result:O(n.value)}),{steps:E}}function ge(e,n){let E=new Map(e.steps);return E.delete(n),{steps:E}}function Ae(e,n){let E=e.steps.get(n);return!E||E.result.ok?!1:q(E.result.error)}function ve(e){let n=[];for(let[E,d]of e.steps)!d.result.ok&&q(d.result.error)&&n.push(E);return n}function he(){let e=new Map;return{handleEvent:n=>{ue(n)&&e.set(n.stepKey,{result:n.result,meta:n.meta})},getState:()=>({steps:new Map(e)}),clear:()=>e.clear(),hasPendingApprovals:()=>{for(let n of e.values())if(!n.result.ok&&q(n.result.error))return!0;return!1},getPendingApprovals:()=>{let n=[];for(let[E,d]of e)!d.result.ok&&q(d.result.error)&&n.push({stepKey:E,error:d.result.error});return n},injectApproval:(n,E)=>(e.set(n,{result:O(E)}),{steps:new Map(e)})}}export{ge as clearStep,Ce as createApprovalStep,he as createHITLCollector,fe as createStepCollector,ke as createWorkflow,ve as getPendingApprovals,Ae as hasPendingApproval,xe as injectApproval,Re as isApprovalRejected,q as isPendingApproval,ue as isStepComplete,Se as pendingApproval};
1
+ var O=e=>({ok:!0,value:e}),h=(e,n)=>({ok:!1,error:e,...n?.cause!==void 0?{cause:n.cause}:{}});var ie=e=>typeof e=="object"&&e!==null&&e.type==="UNEXPECTED_ERROR",j=Symbol.for("step_timeout_marker");function ne(e){return typeof e!="object"||e===null?!1:e.type==="STEP_TIMEOUT"?!0:j in e}function ce(e){if(!(typeof e!="object"||e===null)){if(e.type==="STEP_TIMEOUT"){let n=e;return{timeoutMs:n.timeoutMs,stepName:n.stepName,stepKey:n.stepKey,attempt:n.attempt}}if(j in e)return e[j]}}var se=Symbol("early-exit");function V(e,n){return{[se]:!0,error:e,meta:n}}function L(e){return typeof e=="object"&&e!==null&&e[se]===!0}var oe=Symbol("mapper-exception");function le(e){return{[oe]:!0,thrown:e}}function Ee(e){return typeof e=="object"&&e!==null&&e[oe]===!0}function ye(e){return typeof e=="string"?{name:e}:e??{}}function z(e,n){let{backoff:E,initialDelay:d,maxDelay:_,jitter:b}=n,g;switch(E){case"fixed":g=d;break;case"linear":g=d*e;break;case"exponential":g=d*Math.pow(2,e-1);break}if(g=Math.min(g,_),b){let c=g*.25*Math.random();g=g+c}return Math.floor(g)}function Q(e){return new Promise(n=>setTimeout(n,e))}var re=Symbol("timeout");async function me(e,n,E){let d=new AbortController,_=n.error??{type:"STEP_TIMEOUT",stepName:E.name,stepKey:E.key,timeoutMs:n.ms,attempt:E.attempt},b,g=new Promise((S,T)=>{b=setTimeout(()=>{d.abort(),T({[re]:!0,error:_})},n.ms)}),c;n.signal?c=Promise.resolve(e(d.signal)):c=Promise.resolve(e());try{return await Promise.race([c,g])}catch(S){if(typeof S=="object"&&S!==null&&S[re]===!0){let T=S.error;if(typeof T=="object"&&T!==null&&T.type!=="STEP_TIMEOUT"){let A={timeoutMs:n.ms,stepName:E.name,stepKey:E.key,attempt:E.attempt};j in T?T[j]=A:Object.defineProperty(T,j,{value:A,enumerable:!1,writable:!0,configurable:!1})}throw T}throw S}finally{clearTimeout(b)}}var K={backoff:"exponential",initialDelay:100,maxDelay:3e4,jitter:!0,retryOn:()=>!0,onRetry:()=>{}};async function W(e,n){let{onError:E,onEvent:d,catchUnexpected:_,workflowId:b,context:g}=n&&typeof n=="object"?n:{},c=b??crypto.randomUUID(),S=!E&&!_,T=[],A=0,F=u=>u??`step_${++A}`,m=u=>{if(u.type==="step_success"){let v=u.stepId;for(let y=T.length-1;y>=0;y--){let l=T[y];if(l.type==="race"&&!l.winnerId){l.winnerId=v;break}}}d?.(u,g)},D=V,C=u=>L(u),N=(u,v)=>S?v?.origin==="result"?{type:"UNEXPECTED_ERROR",cause:{type:"STEP_FAILURE",origin:"result",error:u,...v.resultCause!==void 0?{cause:v.resultCause}:{}}}:v?.origin==="throw"?{type:"UNEXPECTED_ERROR",cause:{type:"STEP_FAILURE",origin:"throw",error:u,thrown:v.thrown}}:{type:"UNEXPECTED_ERROR",cause:{type:"STEP_FAILURE",origin:"result",error:u}}:u,X=u=>u.origin==="result"?u.resultCause:u.thrown,G=u=>({type:"UNEXPECTED_ERROR",cause:u.meta.origin==="result"?{type:"STEP_FAILURE",origin:"result",error:u.error,...u.meta.resultCause!==void 0?{cause:u.meta.resultCause}:{}}:{type:"STEP_FAILURE",origin:"throw",error:u.error,thrown:u.meta.thrown}});try{let u=(l,a)=>(async()=>{let s=ye(a),{name:o,key:t,retry:p,timeout:r}=s,i=F(t),f=d,k=f?performance.now():0;if(!(typeof l=="function")){if(p&&p.attempts>1)throw new Error("step: retry options require a function operation. Direct Promise/Result values cannot be re-executed on retry. Wrap your operation in a function: step(() => yourOperation, { retry: {...} })");if(r)throw new Error("step: timeout options require a function operation. Direct Promise/Result values cannot be wrapped with timeout after they've started. Wrap your operation in a function: step(() => yourOperation, { timeout: {...} })")}let x={attempts:Math.max(1,p?.attempts??1),backoff:p?.backoff??K.backoff,initialDelay:p?.initialDelay??K.initialDelay,maxDelay:p?.maxDelay??K.maxDelay,jitter:p?.jitter??K.jitter,retryOn:p?.retryOn??K.retryOn,onRetry:p?.onRetry??K.onRetry};d&&m({type:"step_start",workflowId:c,stepId:i,stepKey:t,name:o,ts:Date.now()});let ee;for(let R=1;R<=x.attempts;R++){let pe=f?performance.now():0;try{let w;if(typeof l=="function"?r?w=await me(l,r,{name:o,key:t,attempt:R}):w=await l():w=await l,w.ok){let M=performance.now()-k;return m({type:"step_success",workflowId:c,stepId:i,stepKey:t,name:o,ts:Date.now(),durationMs:M}),t&&m({type:"step_complete",workflowId:c,stepKey:t,name:o,ts:Date.now(),durationMs:M,result:w}),w.value}if(ee=w,R<x.attempts&&x.retryOn(w.error,R)){let M=z(R,x);m({type:"step_retry",workflowId:c,stepId:i,stepKey:t,name:o,ts:Date.now(),attempt:R+1,maxAttempts:x.attempts,delayMs:M,error:w.error}),x.onRetry(w.error,R,M),await Q(M);continue}x.attempts>1&&m({type:"step_retries_exhausted",workflowId:c,stepId:i,stepKey:t,name:o,ts:Date.now(),durationMs:performance.now()-k,attempts:R,lastError:w.error});break}catch(w){let M=performance.now()-pe;if(C(w))throw m({type:"step_aborted",workflowId:c,stepId:i,stepKey:t,name:o,ts:Date.now(),durationMs:M}),w;if(ne(w)){let P=ce(w),$=r?.ms??P?.timeoutMs??0;if(m({type:"step_timeout",workflowId:c,stepId:i,stepKey:t,name:o,ts:Date.now(),timeoutMs:$,attempt:R}),R<x.attempts&&x.retryOn(w,R)){let H=z(R,x);m({type:"step_retry",workflowId:c,stepId:i,stepKey:t,name:o,ts:Date.now(),attempt:R+1,maxAttempts:x.attempts,delayMs:H,error:w}),x.onRetry(w,R,H),await Q(H);continue}x.attempts>1&&m({type:"step_retries_exhausted",workflowId:c,stepId:i,stepKey:t,name:o,ts:Date.now(),durationMs:performance.now()-k,attempts:R,lastError:w})}if(R<x.attempts&&x.retryOn(w,R)){let P=z(R,x);m({type:"step_retry",workflowId:c,stepId:i,stepKey:t,name:o,ts:Date.now(),attempt:R+1,maxAttempts:x.attempts,delayMs:P,error:w}),x.onRetry(w,R,P),await Q(P);continue}x.attempts>1&&!ne(w)&&m({type:"step_retries_exhausted",workflowId:c,stepId:i,stepKey:t,name:o,ts:Date.now(),durationMs:performance.now()-k,attempts:R,lastError:w});let Y=performance.now()-k;if(_){let P;try{P=_(w)}catch($){throw le($)}throw m({type:"step_error",workflowId:c,stepId:i,stepKey:t,name:o,ts:Date.now(),durationMs:Y,error:P}),t&&m({type:"step_complete",workflowId:c,stepKey:t,name:o,ts:Date.now(),durationMs:Y,result:h(P,{cause:w}),meta:{origin:"throw",thrown:w}}),E?.(P,o),D(P,{origin:"throw",thrown:w})}else{let P={type:"UNEXPECTED_ERROR",cause:{type:"UNCAUGHT_EXCEPTION",thrown:w}};throw m({type:"step_error",workflowId:c,stepId:i,stepKey:t,name:o,ts:Date.now(),durationMs:Y,error:P}),t&&m({type:"step_complete",workflowId:c,stepKey:t,name:o,ts:Date.now(),durationMs:Y,result:h(P,{cause:w}),meta:{origin:"throw",thrown:w}}),w}}}let U=ee,te=performance.now()-k,ae=N(U.error,{origin:"result",resultCause:U.cause});throw m({type:"step_error",workflowId:c,stepId:i,stepKey:t,name:o,ts:Date.now(),durationMs:te,error:ae}),t&&m({type:"step_complete",workflowId:c,stepKey:t,name:o,ts:Date.now(),durationMs:te,result:U,meta:{origin:"result",resultCause:U.cause}}),E?.(U.error,o),D(U.error,{origin:"result",resultCause:U.cause})})();u.try=(l,a)=>{let s=a.name,o=a.key,t=F(o),p="error"in a?()=>a.error:a.onError,r=d;return(async()=>{let i=r?performance.now():0;d&&m({type:"step_start",workflowId:c,stepId:t,stepKey:o,name:s,ts:Date.now()});try{let f=await l(),k=performance.now()-i;return m({type:"step_success",workflowId:c,stepId:t,stepKey:o,name:s,ts:Date.now(),durationMs:k}),o&&m({type:"step_complete",workflowId:c,stepKey:o,name:s,ts:Date.now(),durationMs:k,result:O(f)}),f}catch(f){let k=p(f),I=performance.now()-i,J=N(k,{origin:"throw",thrown:f});throw m({type:"step_error",workflowId:c,stepId:t,stepKey:o,name:s,ts:Date.now(),durationMs:I,error:J}),o&&m({type:"step_complete",workflowId:c,stepKey:o,name:s,ts:Date.now(),durationMs:I,result:h(k,{cause:f}),meta:{origin:"throw",thrown:f}}),E?.(k,s),D(k,{origin:"throw",thrown:f})}})()},u.fromResult=(l,a)=>{let s=a.name,o=a.key,t=F(o),p="error"in a?()=>a.error:a.onError,r=d;return(async()=>{let i=r?performance.now():0;d&&m({type:"step_start",workflowId:c,stepId:t,stepKey:o,name:s,ts:Date.now()});let f=await l();if(f.ok){let k=performance.now()-i;return m({type:"step_success",workflowId:c,stepId:t,stepKey:o,name:s,ts:Date.now(),durationMs:k}),o&&m({type:"step_complete",workflowId:c,stepKey:o,name:s,ts:Date.now(),durationMs:k,result:O(f.value)}),f.value}else{let k=p(f.error),I=performance.now()-i,J=N(k,{origin:"result",resultCause:f.error});throw m({type:"step_error",workflowId:c,stepId:t,stepKey:o,name:s,ts:Date.now(),durationMs:I,error:J}),o&&m({type:"step_complete",workflowId:c,stepKey:o,name:s,ts:Date.now(),durationMs:I,result:h(k,{cause:f.error}),meta:{origin:"result",resultCause:f.error}}),E?.(k,s),D(k,{origin:"result",resultCause:f.error})}})()},u.retry=(l,a)=>u(l,{name:a.name,key:a.key,retry:{attempts:a.attempts,backoff:a.backoff,initialDelay:a.initialDelay,maxDelay:a.maxDelay,jitter:a.jitter,retryOn:a.retryOn,onRetry:a.onRetry},timeout:a.timeout}),u.withTimeout=(l,a)=>u(l,{name:a.name,key:a.key,timeout:a}),u.parallel=(l,a)=>{let s=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let o=performance.now(),t=!1;T.push({scopeId:s,type:"parallel"});let p=()=>{if(t)return;t=!0;let r=T.findIndex(i=>i.scopeId===s);r!==-1&&T.splice(r,1),m({type:"scope_end",workflowId:c,scopeId:s,ts:Date.now(),durationMs:performance.now()-o})};m({type:"scope_start",workflowId:c,scopeId:s,scopeType:"parallel",name:l,ts:Date.now()});try{let r=await a();if(p(),!r.ok)throw E?.(r.error,l),D(r.error,{origin:"result",resultCause:r.cause});return r.value}catch(r){throw p(),r}})()},u.race=(l,a)=>{let s=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let o=performance.now(),t=!1,p={scopeId:s,type:"race",winnerId:void 0};T.push(p);let r=()=>{if(t)return;t=!0;let i=T.findIndex(f=>f.scopeId===s);i!==-1&&T.splice(i,1),m({type:"scope_end",workflowId:c,scopeId:s,ts:Date.now(),durationMs:performance.now()-o,winnerId:p.winnerId})};m({type:"scope_start",workflowId:c,scopeId:s,scopeType:"race",name:l,ts:Date.now()});try{let i=await a();if(r(),!i.ok)throw E?.(i.error,l),D(i.error,{origin:"result",resultCause:i.cause});return i.value}catch(i){throw r(),i}})()},u.allSettled=(l,a)=>{let s=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let o=performance.now(),t=!1;T.push({scopeId:s,type:"allSettled"});let p=()=>{if(t)return;t=!0;let r=T.findIndex(i=>i.scopeId===s);r!==-1&&T.splice(r,1),m({type:"scope_end",workflowId:c,scopeId:s,ts:Date.now(),durationMs:performance.now()-o})};m({type:"scope_start",workflowId:c,scopeId:s,scopeType:"allSettled",name:l,ts:Date.now()});try{let r=await a();if(p(),!r.ok)throw E?.(r.error,l),D(r.error,{origin:"result",resultCause:r.cause});return r.value}catch(r){throw p(),r}})()};let y=await e(u);return O(y)}catch(u){if(Ee(u))throw u.thrown;if(C(u)){let y=X(u.meta);if(_||E)return h(u.error,{cause:y});if(ie(u.error))return h(u.error,{cause:y});let l=G(u);return h(l,{cause:y})}if(_){let y=_(u);return E?.(y,"unexpected"),h(y,{cause:u})}let v={type:"UNEXPECTED_ERROR",cause:{type:"UNCAUGHT_EXCEPTION",thrown:u}};return E?.(v,"unexpected"),h(v,{cause:u})}}W.strict=(e,n)=>W(e,n);function fe(){let e=new Map;return{handleEvent:n=>{ue(n)&&e.set(n.stepKey,{result:n.result,meta:n.meta})},getState:()=>({steps:new Map(e)}),clear:()=>e.clear()}}function we(e){return typeof e=="object"&&e!==null&&e.__cachedMeta===!0}function B(e,n,E){return h(e,{cause:{__cachedMeta:!0,originalCause:E,meta:n}})}function Z(e){return we(e)?e.meta:{origin:"result",resultCause:e}}function ke(e,n){async function E(d,_){let b=typeof _=="function",g=b?d:void 0,c=b?_:d,S=crypto.randomUUID(),T=n?.createContext?.(),A=y=>{n?.onEvent?.(y,T)},F=Date.now(),m=performance.now();A({type:"workflow_start",workflowId:S,ts:F});let D=n?.resumeState,C=n?.cache;if(D&&!C&&(C=new Map),D&&C){let y=typeof D=="function"?await D():D;for(let[l,a]of y.steps){let{result:s,meta:o}=a;if(s.ok)C.set(l,s);else{let t=o??{origin:"result",resultCause:s.cause};C.set(l,B(s.error,t,s.cause))}}}let N=y=>typeof y=="string"?{name:y}:y??{},X=y=>{if(!C)return y;let l=async(a,s)=>{let{name:o,key:t}=N(s);if(t&&C.has(t)){A({type:"step_cache_hit",workflowId:S,stepKey:t,name:o,ts:Date.now()});let r=C.get(t);if(r.ok)return r.value;let i=Z(r.cause);throw V(r.error,i)}t&&A({type:"step_cache_miss",workflowId:S,stepKey:t,name:o,ts:Date.now()});let p=typeof a=="function"?a:()=>a;try{let r=await y(p,s);return t&&C.set(t,O(r)),r}catch(r){if(t&&L(r)){let i=r,f=i.meta.origin==="result"?i.meta.resultCause:i.meta.thrown;C.set(t,B(i.error,i.meta,f))}throw r}};return l.try=async(a,s)=>{let{name:o,key:t}=s;if(t&&C.has(t)){A({type:"step_cache_hit",workflowId:S,stepKey:t,name:o,ts:Date.now()});let p=C.get(t);if(p.ok)return p.value;let r=Z(p.cause);throw V(p.error,r)}t&&A({type:"step_cache_miss",workflowId:S,stepKey:t,name:o,ts:Date.now()});try{let p=await y.try(a,s);return t&&C.set(t,O(p)),p}catch(p){if(t&&L(p)){let r=p,i=r.meta.origin==="result"?r.meta.resultCause:r.meta.thrown;C.set(t,B(r.error,r.meta,i))}throw p}},l.fromResult=async(a,s)=>{let{name:o,key:t}=s;if(t&&C.has(t)){A({type:"step_cache_hit",workflowId:S,stepKey:t,name:o,ts:Date.now()});let p=C.get(t);if(p.ok)return p.value;let r=Z(p.cause);throw V(p.error,r)}t&&A({type:"step_cache_miss",workflowId:S,stepKey:t,name:o,ts:Date.now()});try{let p=await y.fromResult(a,s);return t&&C.set(t,O(p)),p}catch(p){if(t&&L(p)){let r=p,i=r.meta.origin==="result"?r.meta.resultCause:r.meta.thrown;C.set(t,B(r.error,r.meta,i))}throw p}},l.parallel=y.parallel,l.race=y.race,l.allSettled=y.allSettled,l.retry=(a,s)=>l(a,{name:s.name,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}),l.withTimeout=(a,s)=>l(a,{name:s.name,key:s.key,timeout:s}),l},G=b?y=>c(X(y),e,g):y=>c(X(y),e),u;if(n?.strict===!0){let y=n;u=await W.strict(G,{onError:y.onError,onEvent:y.onEvent,catchUnexpected:y.catchUnexpected,workflowId:S,context:T})}else{let y=n;u=await W(G,{onError:y?.onError??(()=>{}),onEvent:y?.onEvent,workflowId:S,context:T})}let v=performance.now()-m;return u.ok?A({type:"workflow_success",workflowId:S,ts:Date.now(),durationMs:v}):A({type:"workflow_error",workflowId:S,ts:Date.now(),durationMs:v,error:u.error}),u}return E}function ue(e){return e.type==="step_complete"}function q(e){return typeof e=="object"&&e!==null&&e.type==="PENDING_APPROVAL"}function Re(e){return typeof e=="object"&&e!==null&&e.type==="APPROVAL_REJECTED"}function Se(e,n){return h({type:"PENDING_APPROVAL",stepKey:e,reason:n?.reason,metadata:n?.metadata})}function Ce(e){return async()=>{let n=await e.checkApproval();switch(n.status){case"pending":return h({type:"PENDING_APPROVAL",stepKey:e.key,reason:e.pendingReason,metadata:e.metadata});case"rejected":return h({type:"APPROVAL_REJECTED",stepKey:e.key,reason:n.reason});case"approved":return O(n.value)}}}function xe(e,n){let E=new Map(e.steps);return E.set(n.stepKey,{result:O(n.value)}),{steps:E}}function ge(e,n){let E=new Map(e.steps);return E.delete(n),{steps:E}}function Ae(e,n){let E=e.steps.get(n);return!E||E.result.ok?!1:q(E.result.error)}function ve(e){let n=[];for(let[E,d]of e.steps)!d.result.ok&&q(d.result.error)&&n.push(E);return n}function Pe(){let e=new Map;return{handleEvent:n=>{ue(n)&&e.set(n.stepKey,{result:n.result,meta:n.meta})},getState:()=>({steps:new Map(e)}),clear:()=>e.clear(),hasPendingApprovals:()=>{for(let n of e.values())if(!n.result.ok&&q(n.result.error))return!0;return!1},getPendingApprovals:()=>{let n=[];for(let[E,d]of e)!d.result.ok&&q(d.result.error)&&n.push({stepKey:E,error:d.result.error});return n},injectApproval:(n,E)=>(e.set(n,{result:O(E)}),{steps:new Map(e)})}}export{ge as clearStep,Ce as createApprovalStep,Pe as createHITLCollector,fe as createStepCollector,ke as createWorkflow,ve as getPendingApprovals,Ae as hasPendingApproval,xe as injectApproval,Re as isApprovalRejected,q as isPendingApproval,ue as isStepComplete,Se as pendingApproval};
2
2
  //# sourceMappingURL=workflow.js.map