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