@jagreehal/workflow 1.5.0 → 1.7.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 +896 -346
- package/dist/core.cjs +1 -1
- package/dist/core.cjs.map +1 -1
- package/dist/core.d.cts +239 -8
- package/dist/core.d.ts +239 -8
- package/dist/core.js +1 -1
- package/dist/core.js.map +1 -1
- package/dist/index.cjs +5 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +5 -5
- package/dist/index.js.map +1 -1
- package/dist/visualize.cjs +1188 -6
- package/dist/visualize.cjs.map +1 -1
- package/dist/visualize.d.cts +467 -1
- package/dist/visualize.d.ts +467 -1
- package/dist/visualize.js +1188 -6
- package/dist/visualize.js.map +1 -1
- package/dist/workflow.cjs +1 -1
- package/dist/workflow.cjs.map +1 -1
- package/dist/workflow.d.cts +50 -0
- package/dist/workflow.d.ts +50 -0
- package/dist/workflow.js +1 -1
- package/dist/workflow.js.map +1 -1
- package/docs/advanced.md +368 -3
- package/docs/coming-from-neverthrow.md +920 -0
- package/docs/visualize-examples.md +330 -0
- package/package.json +2 -1
package/dist/workflow.d.cts
CHANGED
|
@@ -192,6 +192,31 @@ type WorkflowOptions<E, C = void> = {
|
|
|
192
192
|
cache?: StepCache;
|
|
193
193
|
/** Pre-populate cache from saved state for workflow resume */
|
|
194
194
|
resumeState?: ResumeState | (() => ResumeState | Promise<ResumeState>);
|
|
195
|
+
/**
|
|
196
|
+
* Hook called before workflow execution starts.
|
|
197
|
+
* Return `false` to skip workflow execution (useful for distributed locking, queue checking).
|
|
198
|
+
* @param workflowId - Unique ID for this workflow run
|
|
199
|
+
* @param context - Context object from createContext (or void if not provided)
|
|
200
|
+
* @returns `true` to proceed, `false` to skip workflow execution
|
|
201
|
+
*/
|
|
202
|
+
onBeforeStart?: (workflowId: string, context: C) => boolean | Promise<boolean>;
|
|
203
|
+
/**
|
|
204
|
+
* Hook called after each step completes (only for steps with a `key`).
|
|
205
|
+
* Useful for checkpointing to external systems (queues, streams, databases).
|
|
206
|
+
* @param stepKey - The key of the completed step
|
|
207
|
+
* @param result - The step's result (success or error)
|
|
208
|
+
* @param workflowId - Unique ID for this workflow run
|
|
209
|
+
* @param context - Context object from createContext (or void if not provided)
|
|
210
|
+
*/
|
|
211
|
+
onAfterStep?: (stepKey: string, result: Result<unknown, unknown, unknown>, workflowId: string, context: C) => void | Promise<void>;
|
|
212
|
+
/**
|
|
213
|
+
* Hook to check if workflow should run (concurrency control).
|
|
214
|
+
* Called before onBeforeStart. Return `false` to skip workflow execution.
|
|
215
|
+
* @param workflowId - Unique ID for this workflow run
|
|
216
|
+
* @param context - Context object from createContext (or void if not provided)
|
|
217
|
+
* @returns `true` to proceed, `false` to skip workflow execution
|
|
218
|
+
*/
|
|
219
|
+
shouldRun?: (workflowId: string, context: C) => boolean | Promise<boolean>;
|
|
195
220
|
catchUnexpected?: never;
|
|
196
221
|
strict?: false;
|
|
197
222
|
};
|
|
@@ -211,6 +236,31 @@ type WorkflowOptionsStrict<E, U, C = void> = {
|
|
|
211
236
|
cache?: StepCache;
|
|
212
237
|
/** Pre-populate cache from saved state for workflow resume */
|
|
213
238
|
resumeState?: ResumeState | (() => ResumeState | Promise<ResumeState>);
|
|
239
|
+
/**
|
|
240
|
+
* Hook called before workflow execution starts.
|
|
241
|
+
* Return `false` to skip workflow execution (useful for distributed locking, queue checking).
|
|
242
|
+
* @param workflowId - Unique ID for this workflow run
|
|
243
|
+
* @param context - Context object from createContext (or void if not provided)
|
|
244
|
+
* @returns `true` to proceed, `false` to skip workflow execution
|
|
245
|
+
*/
|
|
246
|
+
onBeforeStart?: (workflowId: string, context: C) => boolean | Promise<boolean>;
|
|
247
|
+
/**
|
|
248
|
+
* Hook called after each step completes (only for steps with a `key`).
|
|
249
|
+
* Useful for checkpointing to external systems (queues, streams, databases).
|
|
250
|
+
* @param stepKey - The key of the completed step
|
|
251
|
+
* @param result - The step's result (success or error)
|
|
252
|
+
* @param workflowId - Unique ID for this workflow run
|
|
253
|
+
* @param context - Context object from createContext (or void if not provided)
|
|
254
|
+
*/
|
|
255
|
+
onAfterStep?: (stepKey: string, result: Result<unknown, unknown, unknown>, workflowId: string, context: C) => void | Promise<void>;
|
|
256
|
+
/**
|
|
257
|
+
* Hook to check if workflow should run (concurrency control).
|
|
258
|
+
* Called before onBeforeStart. Return `false` to skip workflow execution.
|
|
259
|
+
* @param workflowId - Unique ID for this workflow run
|
|
260
|
+
* @param context - Context object from createContext (or void if not provided)
|
|
261
|
+
* @returns `true` to proceed, `false` to skip workflow execution
|
|
262
|
+
*/
|
|
263
|
+
shouldRun?: (workflowId: string, context: C) => boolean | Promise<boolean>;
|
|
214
264
|
};
|
|
215
265
|
/**
|
|
216
266
|
* Workflow return type (non-strict)
|
package/dist/workflow.d.ts
CHANGED
|
@@ -192,6 +192,31 @@ type WorkflowOptions<E, C = void> = {
|
|
|
192
192
|
cache?: StepCache;
|
|
193
193
|
/** Pre-populate cache from saved state for workflow resume */
|
|
194
194
|
resumeState?: ResumeState | (() => ResumeState | Promise<ResumeState>);
|
|
195
|
+
/**
|
|
196
|
+
* Hook called before workflow execution starts.
|
|
197
|
+
* Return `false` to skip workflow execution (useful for distributed locking, queue checking).
|
|
198
|
+
* @param workflowId - Unique ID for this workflow run
|
|
199
|
+
* @param context - Context object from createContext (or void if not provided)
|
|
200
|
+
* @returns `true` to proceed, `false` to skip workflow execution
|
|
201
|
+
*/
|
|
202
|
+
onBeforeStart?: (workflowId: string, context: C) => boolean | Promise<boolean>;
|
|
203
|
+
/**
|
|
204
|
+
* Hook called after each step completes (only for steps with a `key`).
|
|
205
|
+
* Useful for checkpointing to external systems (queues, streams, databases).
|
|
206
|
+
* @param stepKey - The key of the completed step
|
|
207
|
+
* @param result - The step's result (success or error)
|
|
208
|
+
* @param workflowId - Unique ID for this workflow run
|
|
209
|
+
* @param context - Context object from createContext (or void if not provided)
|
|
210
|
+
*/
|
|
211
|
+
onAfterStep?: (stepKey: string, result: Result<unknown, unknown, unknown>, workflowId: string, context: C) => void | Promise<void>;
|
|
212
|
+
/**
|
|
213
|
+
* Hook to check if workflow should run (concurrency control).
|
|
214
|
+
* Called before onBeforeStart. Return `false` to skip workflow execution.
|
|
215
|
+
* @param workflowId - Unique ID for this workflow run
|
|
216
|
+
* @param context - Context object from createContext (or void if not provided)
|
|
217
|
+
* @returns `true` to proceed, `false` to skip workflow execution
|
|
218
|
+
*/
|
|
219
|
+
shouldRun?: (workflowId: string, context: C) => boolean | Promise<boolean>;
|
|
195
220
|
catchUnexpected?: never;
|
|
196
221
|
strict?: false;
|
|
197
222
|
};
|
|
@@ -211,6 +236,31 @@ type WorkflowOptionsStrict<E, U, C = void> = {
|
|
|
211
236
|
cache?: StepCache;
|
|
212
237
|
/** Pre-populate cache from saved state for workflow resume */
|
|
213
238
|
resumeState?: ResumeState | (() => ResumeState | Promise<ResumeState>);
|
|
239
|
+
/**
|
|
240
|
+
* Hook called before workflow execution starts.
|
|
241
|
+
* Return `false` to skip workflow execution (useful for distributed locking, queue checking).
|
|
242
|
+
* @param workflowId - Unique ID for this workflow run
|
|
243
|
+
* @param context - Context object from createContext (or void if not provided)
|
|
244
|
+
* @returns `true` to proceed, `false` to skip workflow execution
|
|
245
|
+
*/
|
|
246
|
+
onBeforeStart?: (workflowId: string, context: C) => boolean | Promise<boolean>;
|
|
247
|
+
/**
|
|
248
|
+
* Hook called after each step completes (only for steps with a `key`).
|
|
249
|
+
* Useful for checkpointing to external systems (queues, streams, databases).
|
|
250
|
+
* @param stepKey - The key of the completed step
|
|
251
|
+
* @param result - The step's result (success or error)
|
|
252
|
+
* @param workflowId - Unique ID for this workflow run
|
|
253
|
+
* @param context - Context object from createContext (or void if not provided)
|
|
254
|
+
*/
|
|
255
|
+
onAfterStep?: (stepKey: string, result: Result<unknown, unknown, unknown>, workflowId: string, context: C) => void | Promise<void>;
|
|
256
|
+
/**
|
|
257
|
+
* Hook to check if workflow should run (concurrency control).
|
|
258
|
+
* Called before onBeforeStart. Return `false` to skip workflow execution.
|
|
259
|
+
* @param workflowId - Unique ID for this workflow run
|
|
260
|
+
* @param context - Context object from createContext (or void if not provided)
|
|
261
|
+
* @returns `true` to proceed, `false` to skip workflow execution
|
|
262
|
+
*/
|
|
263
|
+
shouldRun?: (workflowId: string, context: C) => boolean | Promise<boolean>;
|
|
214
264
|
};
|
|
215
265
|
/**
|
|
216
266
|
* Workflow return type (non-strict)
|
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 U=e=>({ok:!0,value:e}),S=(e,n)=>({ok:!1,error:e,...n?.cause!==void 0?{cause:n.cause}:{}});var ye=e=>typeof e=="object"&&e!==null&&e.type==="UNEXPECTED_ERROR",L=Symbol.for("step_timeout_marker");function ae(e){return typeof e!="object"||e===null?!1:e.type==="STEP_TIMEOUT"?!0:L in e}function we(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(L in e)return e[L]}}var pe=Symbol("early-exit");function J(e,n){return{[pe]:!0,error:e,meta:n}}function H(e){return typeof e=="object"&&e!==null&&e[pe]===!0}var ce=Symbol("mapper-exception");function me(e){return{[ce]:!0,thrown:e}}function de(e){return typeof e=="object"&&e!==null&&e[ce]===!0}function ke(e){return typeof e=="string"?{name:e}:e??{}}function re(e,n){let{backoff:y,initialDelay:C,maxDelay:b,jitter:K}=n,P;switch(y){case"fixed":P=C;break;case"linear":P=C*e;break;case"exponential":P=C*Math.pow(2,e-1);break}if(P=Math.min(P,b),K){let l=P*.25*Math.random();P=P+l}return Math.floor(P)}function oe(e){return new Promise(n=>setTimeout(n,e))}var ie=Symbol("timeout");async function fe(e,n,y){let C=new AbortController,b=n.error??{type:"STEP_TIMEOUT",stepName:y.name,stepKey:y.key,timeoutMs:n.ms,attempt:y.attempt},K,P=new Promise((T,f)=>{K=setTimeout(()=>{C.abort(),f({[ie]:!0,error:b})},n.ms)}),l;n.signal?l=Promise.resolve(e(C.signal)):l=Promise.resolve(e());try{return await Promise.race([l,P])}catch(T){if(typeof T=="object"&&T!==null&&T[ie]===!0){let f=T.error;if(typeof f=="object"&&f!==null&&f.type!=="STEP_TIMEOUT"){let g={timeoutMs:n.ms,stepName:y.name,stepKey:y.key,attempt:y.attempt};L in f?f[L]=g:Object.defineProperty(f,L,{value:g,enumerable:!1,writable:!0,configurable:!1})}throw f}throw T}finally{clearTimeout(K)}}var V={backoff:"exponential",initialDelay:100,maxDelay:3e4,jitter:!0,retryOn:()=>!0,onRetry:()=>{}};async function B(e,n){let{onError:y,onEvent:C,catchUnexpected:b,workflowId:K,context:P}=n&&typeof n=="object"?n:{},l=K??crypto.randomUUID(),T=!y&&!b,f=[],g=0,F=c=>c??`step_${++g}`,E=c=>{if(c.type==="step_success"){let A=c.stepId;for(let h=f.length-1;h>=0;h--){let M=f[h];if(M.type==="race"&&!M.winnerId){M.winnerId=A;break}}}C?.(c,P)},I=J,Y=c=>H(c),X=(c,A)=>T?A?.origin==="result"?{type:"UNEXPECTED_ERROR",cause:{type:"STEP_FAILURE",origin:"result",error:c,...A.resultCause!==void 0?{cause:A.resultCause}:{}}}:A?.origin==="throw"?{type:"UNEXPECTED_ERROR",cause:{type:"STEP_FAILURE",origin:"throw",error:c,thrown:A.thrown}}:{type:"UNEXPECTED_ERROR",cause:{type:"STEP_FAILURE",origin:"result",error:c}}:c,j=c=>c.origin==="result"?c.resultCause:c.thrown,k=c=>({type:"UNEXPECTED_ERROR",cause:c.meta.origin==="result"?{type:"STEP_FAILURE",origin:"result",error:c.error,...c.meta.resultCause!==void 0?{cause:c.meta.resultCause}:{}}:{type:"STEP_FAILURE",origin:"throw",error:c.error,thrown:c.meta.thrown}});try{let A=function(s,r){let u=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let t=performance.now(),i=!1;f.push({scopeId:u,type:"parallel"});let o=()=>{if(i)return;i=!0;let p=f.findIndex(a=>a.scopeId===u);p!==-1&&f.splice(p,1),E({type:"scope_end",workflowId:l,scopeId:u,ts:Date.now(),durationMs:performance.now()-t})};E({type:"scope_start",workflowId:l,scopeId:u,scopeType:"parallel",name:s,ts:Date.now()});try{let p=await r();if(o(),!p.ok)throw y?.(p.error,s),I(p.error,{origin:"result",resultCause:p.cause});return p.value}catch(p){throw o(),p}})()},h=function(s,r){let u=Object.keys(s),t=r.name??`Parallel(${u.join(", ")})`,i=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let o=performance.now(),p=!1;f.push({scopeId:i,type:"parallel"});let a=()=>{if(p)return;p=!0;let w=f.findIndex(m=>m.scopeId===i);w!==-1&&f.splice(w,1),E({type:"scope_end",workflowId:l,scopeId:i,ts:Date.now(),durationMs:performance.now()-o})};E({type:"scope_start",workflowId:l,scopeId:i,scopeType:"parallel",name:t,ts:Date.now()});try{let w=await new Promise(v=>{if(u.length===0){v([]);return}let D=!1,x=u.length,G=new Array(u.length);for(let O=0;O<u.length;O++){let W=u[O],ee=O;Promise.resolve(s[W]()).catch(R=>S({type:"PROMISE_REJECTED",cause:R},{cause:{type:"PROMISE_REJECTION",reason:R}})).then(R=>{if(!D){if(!R.ok){D=!0,v([{key:W,result:R}]);return}G[ee]={key:W,result:R},x--,x===0&&v(G)}})}});a();let m={};for(let{key:v,result:D}of w){if(!D.ok)throw y?.(D.error,v),I(D.error,{origin:"result",resultCause:D.cause});m[v]=D.value}return m}catch(w){throw a(),w}})()};var ue=A,$=h;let c=(s,r)=>(async()=>{let u=ke(r),{name:t,key:i,retry:o,timeout:p}=u,a=F(i),w=C,m=w?performance.now():0;if(!(typeof s=="function")){if(o&&o.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(p)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,o?.attempts??1),backoff:o?.backoff??V.backoff,initialDelay:o?.initialDelay??V.initialDelay,maxDelay:o?.maxDelay??V.maxDelay,jitter:o?.jitter??V.jitter,retryOn:o?.retryOn??V.retryOn,onRetry:o?.onRetry??V.onRetry};C&&E({type:"step_start",workflowId:l,stepId:a,stepKey:i,name:t,ts:Date.now()});let G;for(let R=1;R<=x.attempts;R++){let Ee=w?performance.now():0;try{let d;if(typeof s=="function"?p?d=await fe(s,p,{name:t,key:i,attempt:R}):d=await s():d=await s,d.ok){let N=performance.now()-m;return E({type:"step_success",workflowId:l,stepId:a,stepKey:i,name:t,ts:Date.now(),durationMs:N}),i&&E({type:"step_complete",workflowId:l,stepKey:i,name:t,ts:Date.now(),durationMs:N,result:d}),d.value}if(G=d,R<x.attempts&&x.retryOn(d.error,R)){let N=re(R,x);E({type:"step_retry",workflowId:l,stepId:a,stepKey:i,name:t,ts:Date.now(),attempt:R+1,maxAttempts:x.attempts,delayMs:N,error:d.error}),x.onRetry(d.error,R,N),await oe(N);continue}x.attempts>1&&E({type:"step_retries_exhausted",workflowId:l,stepId:a,stepKey:i,name:t,ts:Date.now(),durationMs:performance.now()-m,attempts:R,lastError:d.error});break}catch(d){let N=performance.now()-Ee;if(Y(d))throw E({type:"step_aborted",workflowId:l,stepId:a,stepKey:i,name:t,ts:Date.now(),durationMs:N}),d;if(ae(d)){let _=we(d),te=p?.ms??_?.timeoutMs??0;if(E({type:"step_timeout",workflowId:l,stepId:a,stepKey:i,name:t,ts:Date.now(),timeoutMs:te,attempt:R}),R<x.attempts&&x.retryOn(d,R)){let ne=re(R,x);E({type:"step_retry",workflowId:l,stepId:a,stepKey:i,name:t,ts:Date.now(),attempt:R+1,maxAttempts:x.attempts,delayMs:ne,error:d}),x.onRetry(d,R,ne),await oe(ne);continue}x.attempts>1&&E({type:"step_retries_exhausted",workflowId:l,stepId:a,stepKey:i,name:t,ts:Date.now(),durationMs:performance.now()-m,attempts:R,lastError:d})}if(R<x.attempts&&x.retryOn(d,R)){let _=re(R,x);E({type:"step_retry",workflowId:l,stepId:a,stepKey:i,name:t,ts:Date.now(),attempt:R+1,maxAttempts:x.attempts,delayMs:_,error:d}),x.onRetry(d,R,_),await oe(_);continue}x.attempts>1&&!ae(d)&&E({type:"step_retries_exhausted",workflowId:l,stepId:a,stepKey:i,name:t,ts:Date.now(),durationMs:performance.now()-m,attempts:R,lastError:d});let z=performance.now()-m;if(b){let _;try{_=b(d)}catch(te){throw me(te)}throw E({type:"step_error",workflowId:l,stepId:a,stepKey:i,name:t,ts:Date.now(),durationMs:z,error:_}),i&&E({type:"step_complete",workflowId:l,stepKey:i,name:t,ts:Date.now(),durationMs:z,result:S(_,{cause:d}),meta:{origin:"throw",thrown:d}}),y?.(_,t),I(_,{origin:"throw",thrown:d})}else{let _={type:"UNEXPECTED_ERROR",cause:{type:"UNCAUGHT_EXCEPTION",thrown:d}};throw E({type:"step_error",workflowId:l,stepId:a,stepKey:i,name:t,ts:Date.now(),durationMs:z,error:_}),i&&E({type:"step_complete",workflowId:l,stepKey:i,name:t,ts:Date.now(),durationMs:z,result:S(_,{cause:d}),meta:{origin:"throw",thrown:d}}),d}}}let O=G,W=performance.now()-m,ee=X(O.error,{origin:"result",resultCause:O.cause});throw E({type:"step_error",workflowId:l,stepId:a,stepKey:i,name:t,ts:Date.now(),durationMs:W,error:ee}),i&&E({type:"step_complete",workflowId:l,stepKey:i,name:t,ts:Date.now(),durationMs:W,result:O,meta:{origin:"result",resultCause:O.cause}}),y?.(O.error,t),I(O.error,{origin:"result",resultCause:O.cause})})();c.try=(s,r)=>{let u=r.name,t=r.key,i=F(t),o="error"in r?()=>r.error:r.onError,p=C;return(async()=>{let a=p?performance.now():0;C&&E({type:"step_start",workflowId:l,stepId:i,stepKey:t,name:u,ts:Date.now()});try{let w=await s(),m=performance.now()-a;return E({type:"step_success",workflowId:l,stepId:i,stepKey:t,name:u,ts:Date.now(),durationMs:m}),t&&E({type:"step_complete",workflowId:l,stepKey:t,name:u,ts:Date.now(),durationMs:m,result:U(w)}),w}catch(w){let m=o(w),v=performance.now()-a,D=X(m,{origin:"throw",thrown:w});throw E({type:"step_error",workflowId:l,stepId:i,stepKey:t,name:u,ts:Date.now(),durationMs:v,error:D}),t&&E({type:"step_complete",workflowId:l,stepKey:t,name:u,ts:Date.now(),durationMs:v,result:S(m,{cause:w}),meta:{origin:"throw",thrown:w}}),y?.(m,u),I(m,{origin:"throw",thrown:w})}})()},c.fromResult=(s,r)=>{let u=r.name,t=r.key,i=F(t),o="error"in r?()=>r.error:r.onError,p=C;return(async()=>{let a=p?performance.now():0;C&&E({type:"step_start",workflowId:l,stepId:i,stepKey:t,name:u,ts:Date.now()});let w=await s();if(w.ok){let m=performance.now()-a;return E({type:"step_success",workflowId:l,stepId:i,stepKey:t,name:u,ts:Date.now(),durationMs:m}),t&&E({type:"step_complete",workflowId:l,stepKey:t,name:u,ts:Date.now(),durationMs:m,result:U(w.value)}),w.value}else{let m=o(w.error),v=performance.now()-a,D=X(m,{origin:"result",resultCause:w.error});throw E({type:"step_error",workflowId:l,stepId:i,stepKey:t,name:u,ts:Date.now(),durationMs:v,error:D}),t&&E({type:"step_complete",workflowId:l,stepKey:t,name:u,ts:Date.now(),durationMs:v,result:S(m,{cause:w.error}),meta:{origin:"result",resultCause:w.error}}),y?.(m,u),I(m,{origin:"result",resultCause:w.error})}})()},c.retry=(s,r)=>c(s,{name:r.name,key:r.key,retry:{attempts:r.attempts,backoff:r.backoff,initialDelay:r.initialDelay,maxDelay:r.maxDelay,jitter:r.jitter,retryOn:r.retryOn,onRetry:r.onRetry},timeout:r.timeout}),c.withTimeout=(s,r)=>c(s,{name:r.name,key:r.key,timeout:r}),c.parallel=((...s)=>{if(typeof s[0]=="string"){let r=s[0],u=s[1];return A(r,u)}else{let r=s[0],u=s[1]??{};return h(r,u)}}),c.race=(s,r)=>{let u=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let t=performance.now(),i=!1,o={scopeId:u,type:"race",winnerId:void 0};f.push(o);let p=()=>{if(i)return;i=!0;let a=f.findIndex(w=>w.scopeId===u);a!==-1&&f.splice(a,1),E({type:"scope_end",workflowId:l,scopeId:u,ts:Date.now(),durationMs:performance.now()-t,winnerId:o.winnerId})};E({type:"scope_start",workflowId:l,scopeId:u,scopeType:"race",name:s,ts:Date.now()});try{let a=await r();if(p(),!a.ok)throw y?.(a.error,s),I(a.error,{origin:"result",resultCause:a.cause});return a.value}catch(a){throw p(),a}})()},c.allSettled=(s,r)=>{let u=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let t=performance.now(),i=!1;f.push({scopeId:u,type:"allSettled"});let o=()=>{if(i)return;i=!0;let p=f.findIndex(a=>a.scopeId===u);p!==-1&&f.splice(p,1),E({type:"scope_end",workflowId:l,scopeId:u,ts:Date.now(),durationMs:performance.now()-t})};E({type:"scope_start",workflowId:l,scopeId:u,scopeType:"allSettled",name:s,ts:Date.now()});try{let p=await r();if(o(),!p.ok)throw y?.(p.error,s),I(p.error,{origin:"result",resultCause:p.cause});return p.value}catch(p){throw o(),p}})()};let q=await e(c);return U(q)}catch(c){if(de(c))throw c.thrown;if(Y(c)){let h=j(c.meta);if(b||y)return S(c.error,{cause:h});if(ye(c.error))return S(c.error,{cause:h});let M=k(c);return S(M,{cause:h})}if(b){let h=b(c);return y?.(h,"unexpected"),S(h,{cause:c})}let A={type:"UNEXPECTED_ERROR",cause:{type:"UNCAUGHT_EXCEPTION",thrown:c}};return y?.(A,"unexpected"),S(A,{cause:c})}}B.strict=(e,n)=>B(e,n);function Se(){let e=new Map;return{handleEvent:n=>{le(n)&&e.set(n.stepKey,{result:n.result,meta:n.meta})},getState:()=>({steps:new Map(e)}),clear:()=>e.clear()}}function Te(e){return typeof e=="object"&&e!==null&&e.__cachedMeta===!0}function Q(e,n,y){return S(e,{cause:{__cachedMeta:!0,originalCause:y,meta:n}})}function se(e){return Te(e)?e.meta:{origin:"result",resultCause:e}}function xe(e,n){async function y(C,b){let K=typeof b=="function",P=K?C:void 0,l=K?b:C,T=crypto.randomUUID(),f=n?.createContext?.(),g=s=>{n?.onEvent?.(s,f)},F=n?.shouldRun,E=n?.catchUnexpected;if(F){let s=performance.now();try{let r=await F(T,f),u=performance.now()-s;if(g({type:"hook_should_run",workflowId:T,ts:Date.now(),durationMs:u,result:r,skipped:!r}),!r){let t=new Error("Workflow skipped by shouldRun hook");if(E){let o=E(t);return S(o)}return S({type:"UNEXPECTED_ERROR",cause:{type:"UNCAUGHT_EXCEPTION",thrown:t}})}}catch(r){let u=performance.now()-s;if(g({type:"hook_should_run_error",workflowId:T,ts:Date.now(),durationMs:u,error:r}),E){let i=E(r);return S(i)}return S({type:"UNEXPECTED_ERROR",cause:{type:"UNCAUGHT_EXCEPTION",thrown:r}})}}let I=n?.onBeforeStart;if(I){let s=performance.now();try{let r=await I(T,f),u=performance.now()-s;if(g({type:"hook_before_start",workflowId:T,ts:Date.now(),durationMs:u,result:r,skipped:!r}),!r){let t=new Error("Workflow skipped by onBeforeStart hook");if(E){let o=E(t);return S(o)}return S({type:"UNEXPECTED_ERROR",cause:{type:"UNCAUGHT_EXCEPTION",thrown:t}})}}catch(r){let u=performance.now()-s;if(g({type:"hook_before_start_error",workflowId:T,ts:Date.now(),durationMs:u,error:r}),E){let i=E(r);return S(i)}return S({type:"UNEXPECTED_ERROR",cause:{type:"UNCAUGHT_EXCEPTION",thrown:r}})}}let Y=Date.now(),X=performance.now();g({type:"workflow_start",workflowId:T,ts:Y});let j=n?.resumeState,k=n?.cache;if(j&&!k&&(k=new Map),j&&k){let s=typeof j=="function"?await j():j;for(let[r,u]of s.steps){let{result:t,meta:i}=u;if(t.ok)k.set(r,t);else{let o=i??{origin:"result",resultCause:t.cause};k.set(r,Q(t.error,o,t.cause))}}}let ue=s=>typeof s=="string"?{name:s}:s??{},$=n?.onAfterStep,c=async(s,r)=>{if(!$)return;let u=performance.now();try{await $(s,r,T,f);let t=performance.now()-u;g({type:"hook_after_step",workflowId:T,stepKey:s,ts:Date.now(),durationMs:t})}catch(t){let i=performance.now()-u;throw g({type:"hook_after_step_error",workflowId:T,stepKey:s,ts:Date.now(),durationMs:i,error:t}),t}},A=s=>{if(!k&&!$)return s;let r=async(u,t)=>{let{name:i,key:o}=ue(t);if(o&&k&&k.has(o)){g({type:"step_cache_hit",workflowId:T,stepKey:o,name:i,ts:Date.now()});let a=k.get(o);if(a.ok)return a.value;let w=se(a.cause);throw J(a.error,w)}o&&k&&g({type:"step_cache_miss",workflowId:T,stepKey:o,name:i,ts:Date.now()});let p=typeof u=="function"?u:()=>u;try{let a=await s(p,t);return o&&(k&&k.set(o,U(a)),await c(o,U(a))),a}catch(a){if(o&&H(a)){let w=a,m=w.meta.origin==="result"?w.meta.resultCause:w.meta.thrown,v=Q(w.error,w.meta,m);k&&k.set(o,v),await c(o,v)}throw a}};return r.try=async(u,t)=>{let{name:i,key:o}=t;if(o&&k&&k.has(o)){g({type:"step_cache_hit",workflowId:T,stepKey:o,name:i,ts:Date.now()});let p=k.get(o);if(p.ok)return p.value;let a=se(p.cause);throw J(p.error,a)}o&&k&&g({type:"step_cache_miss",workflowId:T,stepKey:o,name:i,ts:Date.now()});try{let p=await s.try(u,t);return o&&(k&&k.set(o,U(p)),await c(o,U(p))),p}catch(p){if(o&&H(p)){let a=p,w=a.meta.origin==="result"?a.meta.resultCause:a.meta.thrown,m=Q(a.error,a.meta,w);k&&k.set(o,m),await c(o,m)}throw p}},r.fromResult=async(u,t)=>{let{name:i,key:o}=t;if(o&&k&&k.has(o)){g({type:"step_cache_hit",workflowId:T,stepKey:o,name:i,ts:Date.now()});let p=k.get(o);if(p.ok)return p.value;let a=se(p.cause);throw J(p.error,a)}o&&k&&g({type:"step_cache_miss",workflowId:T,stepKey:o,name:i,ts:Date.now()});try{let p=await s.fromResult(u,t);return o&&(k&&k.set(o,U(p)),await c(o,U(p))),p}catch(p){if(o&&H(p)){let a=p,w=a.meta.origin==="result"?a.meta.resultCause:a.meta.thrown,m=Q(a.error,a.meta,w);k&&k.set(o,m),await c(o,m)}throw p}},r.parallel=s.parallel,r.race=s.race,r.allSettled=s.allSettled,r.retry=(u,t)=>r(u,{name:t.name,key:t.key,retry:{attempts:t.attempts,backoff:t.backoff,initialDelay:t.initialDelay,maxDelay:t.maxDelay,jitter:t.jitter,retryOn:t.retryOn,onRetry:t.onRetry},timeout:t.timeout}),r.withTimeout=(u,t)=>r(u,{name:t.name,key:t.key,timeout:t}),r},h=K?s=>l(A(s),e,P):s=>l(A(s),e),M;if(n?.strict===!0){let s=n;M=await B.strict(h,{onError:s.onError,onEvent:s.onEvent,catchUnexpected:s.catchUnexpected,workflowId:T,context:f})}else{let s=n;M=await B(h,{onError:s?.onError??(()=>{}),onEvent:s?.onEvent,workflowId:T,context:f})}let q=performance.now()-X;return M.ok?g({type:"workflow_success",workflowId:T,ts:Date.now(),durationMs:q}):g({type:"workflow_error",workflowId:T,ts:Date.now(),durationMs:q,error:M.error}),M}return y}function le(e){return e.type==="step_complete"}function Z(e){return typeof e=="object"&&e!==null&&e.type==="PENDING_APPROVAL"}function ge(e){return typeof e=="object"&&e!==null&&e.type==="APPROVAL_REJECTED"}function Ae(e,n){return S({type:"PENDING_APPROVAL",stepKey:e,reason:n?.reason,metadata:n?.metadata})}function he(e){return async()=>{let n=await e.checkApproval();switch(n.status){case"pending":return S({type:"PENDING_APPROVAL",stepKey:e.key,reason:e.pendingReason,metadata:e.metadata});case"rejected":return S({type:"APPROVAL_REJECTED",stepKey:e.key,reason:n.reason});case"approved":return U(n.value)}}}function ve(e,n){let y=new Map(e.steps);return y.set(n.stepKey,{result:U(n.value)}),{steps:y}}function Pe(e,n){let y=new Map(e.steps);return y.delete(n),{steps:y}}function _e(e,n){let y=e.steps.get(n);return!y||y.result.ok?!1:Z(y.result.error)}function be(e){let n=[];for(let[y,C]of e.steps)!C.result.ok&&Z(C.result.error)&&n.push(y);return n}function De(){let e=new Map;return{handleEvent:n=>{le(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&&Z(n.result.error))return!0;return!1},getPendingApprovals:()=>{let n=[];for(let[y,C]of e)!C.result.ok&&Z(C.result.error)&&n.push({stepKey:y,error:C.result.error});return n},injectApproval:(n,y)=>(e.set(n,{result:U(y)}),{steps:new Map(e)})}}export{Pe as clearStep,he as createApprovalStep,De as createHITLCollector,Se as createStepCollector,xe as createWorkflow,be as getPendingApprovals,_e as hasPendingApproval,ve as injectApproval,ge as isApprovalRejected,Z as isPendingApproval,le as isStepComplete,Ae as pendingApproval};
|
|
2
2
|
//# sourceMappingURL=workflow.js.map
|