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