awaitly 1.0.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.
Files changed (156) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1278 -0
  3. package/dist/batch.cjs +2 -0
  4. package/dist/batch.cjs.map +1 -0
  5. package/dist/batch.d.cts +197 -0
  6. package/dist/batch.d.ts +197 -0
  7. package/dist/batch.js +2 -0
  8. package/dist/batch.js.map +1 -0
  9. package/dist/circuit-breaker.cjs +2 -0
  10. package/dist/circuit-breaker.cjs.map +1 -0
  11. package/dist/circuit-breaker.d.cts +208 -0
  12. package/dist/circuit-breaker.d.ts +208 -0
  13. package/dist/circuit-breaker.js +2 -0
  14. package/dist/circuit-breaker.js.map +1 -0
  15. package/dist/conditional.cjs +2 -0
  16. package/dist/conditional.cjs.map +1 -0
  17. package/dist/conditional.d.cts +249 -0
  18. package/dist/conditional.d.ts +249 -0
  19. package/dist/conditional.js +2 -0
  20. package/dist/conditional.js.map +1 -0
  21. package/dist/core-BuTBsR0x.d.cts +2325 -0
  22. package/dist/core-BuTBsR0x.d.ts +2325 -0
  23. package/dist/core.cjs +2 -0
  24. package/dist/core.cjs.map +1 -0
  25. package/dist/core.d.cts +3 -0
  26. package/dist/core.d.ts +3 -0
  27. package/dist/core.js +2 -0
  28. package/dist/core.js.map +1 -0
  29. package/dist/devtools.cjs +11 -0
  30. package/dist/devtools.cjs.map +1 -0
  31. package/dist/devtools.d.cts +176 -0
  32. package/dist/devtools.d.ts +176 -0
  33. package/dist/devtools.js +11 -0
  34. package/dist/devtools.js.map +1 -0
  35. package/dist/duration.cjs +2 -0
  36. package/dist/duration.cjs.map +1 -0
  37. package/dist/duration.d.cts +246 -0
  38. package/dist/duration.d.ts +246 -0
  39. package/dist/duration.js +2 -0
  40. package/dist/duration.js.map +1 -0
  41. package/dist/hitl.cjs +2 -0
  42. package/dist/hitl.cjs.map +1 -0
  43. package/dist/hitl.d.cts +337 -0
  44. package/dist/hitl.d.ts +337 -0
  45. package/dist/hitl.js +2 -0
  46. package/dist/hitl.js.map +1 -0
  47. package/dist/index.cjs +2 -0
  48. package/dist/index.cjs.map +1 -0
  49. package/dist/index.d.cts +4 -0
  50. package/dist/index.d.ts +4 -0
  51. package/dist/index.js +2 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/match.cjs +2 -0
  54. package/dist/match.cjs.map +1 -0
  55. package/dist/match.d.cts +209 -0
  56. package/dist/match.d.ts +209 -0
  57. package/dist/match.js +2 -0
  58. package/dist/match.js.map +1 -0
  59. package/dist/otel.cjs +2 -0
  60. package/dist/otel.cjs.map +1 -0
  61. package/dist/otel.d.cts +185 -0
  62. package/dist/otel.d.ts +185 -0
  63. package/dist/otel.js +2 -0
  64. package/dist/otel.js.map +1 -0
  65. package/dist/persistence.cjs +2 -0
  66. package/dist/persistence.cjs.map +1 -0
  67. package/dist/persistence.d.cts +572 -0
  68. package/dist/persistence.d.ts +572 -0
  69. package/dist/persistence.js +2 -0
  70. package/dist/persistence.js.map +1 -0
  71. package/dist/policies.cjs +2 -0
  72. package/dist/policies.cjs.map +1 -0
  73. package/dist/policies.d.cts +378 -0
  74. package/dist/policies.d.ts +378 -0
  75. package/dist/policies.js +2 -0
  76. package/dist/policies.js.map +1 -0
  77. package/dist/ratelimit.cjs +2 -0
  78. package/dist/ratelimit.cjs.map +1 -0
  79. package/dist/ratelimit.d.cts +279 -0
  80. package/dist/ratelimit.d.ts +279 -0
  81. package/dist/ratelimit.js +2 -0
  82. package/dist/ratelimit.js.map +1 -0
  83. package/dist/reliability.cjs +2 -0
  84. package/dist/reliability.cjs.map +1 -0
  85. package/dist/reliability.d.cts +5 -0
  86. package/dist/reliability.d.ts +5 -0
  87. package/dist/reliability.js +2 -0
  88. package/dist/reliability.js.map +1 -0
  89. package/dist/resource.cjs +2 -0
  90. package/dist/resource.cjs.map +1 -0
  91. package/dist/resource.d.cts +171 -0
  92. package/dist/resource.d.ts +171 -0
  93. package/dist/resource.js +2 -0
  94. package/dist/resource.js.map +1 -0
  95. package/dist/retry.cjs +2 -0
  96. package/dist/retry.cjs.map +1 -0
  97. package/dist/retry.d.cts +2 -0
  98. package/dist/retry.d.ts +2 -0
  99. package/dist/retry.js +2 -0
  100. package/dist/retry.js.map +1 -0
  101. package/dist/saga.cjs +2 -0
  102. package/dist/saga.cjs.map +1 -0
  103. package/dist/saga.d.cts +231 -0
  104. package/dist/saga.d.ts +231 -0
  105. package/dist/saga.js +2 -0
  106. package/dist/saga.js.map +1 -0
  107. package/dist/schedule.cjs +2 -0
  108. package/dist/schedule.cjs.map +1 -0
  109. package/dist/schedule.d.cts +387 -0
  110. package/dist/schedule.d.ts +387 -0
  111. package/dist/schedule.js +2 -0
  112. package/dist/schedule.js.map +1 -0
  113. package/dist/tagged-error.cjs +2 -0
  114. package/dist/tagged-error.cjs.map +1 -0
  115. package/dist/tagged-error.d.cts +252 -0
  116. package/dist/tagged-error.d.ts +252 -0
  117. package/dist/tagged-error.js +2 -0
  118. package/dist/tagged-error.js.map +1 -0
  119. package/dist/testing.cjs +2 -0
  120. package/dist/testing.cjs.map +1 -0
  121. package/dist/testing.d.cts +228 -0
  122. package/dist/testing.d.ts +228 -0
  123. package/dist/testing.js +2 -0
  124. package/dist/testing.js.map +1 -0
  125. package/dist/visualize.cjs +1573 -0
  126. package/dist/visualize.cjs.map +1 -0
  127. package/dist/visualize.d.cts +1415 -0
  128. package/dist/visualize.d.ts +1415 -0
  129. package/dist/visualize.js +1573 -0
  130. package/dist/visualize.js.map +1 -0
  131. package/dist/webhook.cjs +2 -0
  132. package/dist/webhook.cjs.map +1 -0
  133. package/dist/webhook.d.cts +469 -0
  134. package/dist/webhook.d.ts +469 -0
  135. package/dist/webhook.js +2 -0
  136. package/dist/webhook.js.map +1 -0
  137. package/dist/workflow-entry-C6nH8ByN.d.ts +858 -0
  138. package/dist/workflow-entry-RRTlSg_4.d.cts +858 -0
  139. package/dist/workflow.cjs +2 -0
  140. package/dist/workflow.cjs.map +1 -0
  141. package/dist/workflow.d.cts +2 -0
  142. package/dist/workflow.d.ts +2 -0
  143. package/dist/workflow.js +2 -0
  144. package/dist/workflow.js.map +1 -0
  145. package/docs/advanced.md +1548 -0
  146. package/docs/api.md +513 -0
  147. package/docs/coming-from-neverthrow.md +1013 -0
  148. package/docs/match.md +417 -0
  149. package/docs/pino-logging-example.md +396 -0
  150. package/docs/policies.md +508 -0
  151. package/docs/resource-management.md +509 -0
  152. package/docs/schedule.md +467 -0
  153. package/docs/tagged-error.md +785 -0
  154. package/docs/visualization.md +430 -0
  155. package/docs/visualize-examples.md +330 -0
  156. package/package.json +227 -0
@@ -0,0 +1,5 @@
1
+ export { CircuitBreaker, CircuitBreakerConfig, CircuitBreakerStats, CircuitOpenError, CircuitState, circuitBreakerPresets, createCircuitBreaker, isCircuitOpenError } from './circuit-breaker.cjs';
2
+ export { CombinedLimiterConfig, ConcurrencyLimiter, ConcurrencyLimiterConfig, ConcurrencyLimiterStats, QueueFullError, RateLimitExceededError, RateLimiter, RateLimiterConfig, RateLimiterStats, createCombinedLimiter, createConcurrencyLimiter, createRateLimiter, isQueueFullError, isRateLimitExceededError, rateLimiterPresets } from './ratelimit.cjs';
3
+ export { CompensationAction, SagaCompensationError, SagaContext, SagaEvent, SagaResult, SagaStepOptions, SagaWorkflowOptions, createSagaWorkflow, isSagaCompensationError, runSaga } from './saga.cjs';
4
+ export { NamedPolicy, Policy, PolicyFactory, PolicyRegistry, StepOptionsBuilder, WithPoliciesOptions, conditionalPolicy, createPolicyApplier, createPolicyBundle, createPolicyRegistry, envPolicy, mergePolicies, retryPolicies, retryPolicy, servicePolicies, stepOptions, timeoutPolicies, timeoutPolicy, withPolicies, withPolicy } from './policies.cjs';
5
+ import './core-BuTBsR0x.cjs';
@@ -0,0 +1,5 @@
1
+ export { CircuitBreaker, CircuitBreakerConfig, CircuitBreakerStats, CircuitOpenError, CircuitState, circuitBreakerPresets, createCircuitBreaker, isCircuitOpenError } from './circuit-breaker.js';
2
+ export { CombinedLimiterConfig, ConcurrencyLimiter, ConcurrencyLimiterConfig, ConcurrencyLimiterStats, QueueFullError, RateLimitExceededError, RateLimiter, RateLimiterConfig, RateLimiterStats, createCombinedLimiter, createConcurrencyLimiter, createRateLimiter, isQueueFullError, isRateLimitExceededError, rateLimiterPresets } from './ratelimit.js';
3
+ export { CompensationAction, SagaCompensationError, SagaContext, SagaEvent, SagaResult, SagaStepOptions, SagaWorkflowOptions, createSagaWorkflow, isSagaCompensationError, runSaga } from './saga.js';
4
+ export { NamedPolicy, Policy, PolicyFactory, PolicyRegistry, StepOptionsBuilder, WithPoliciesOptions, conditionalPolicy, createPolicyApplier, createPolicyBundle, createPolicyRegistry, envPolicy, mergePolicies, retryPolicies, retryPolicy, servicePolicies, stepOptions, timeoutPolicies, timeoutPolicy, withPolicies, withPolicy } from './policies.js';
5
+ import './core-BuTBsR0x.js';
@@ -0,0 +1,2 @@
1
+ var z=e=>({ok:!0,value:e}),O=(e,t)=>({ok:!1,error:e,...t?.cause!==void 0?{cause:t.cause}:{}});var de=e=>typeof e=="object"&&e!==null&&e.type==="UNEXPECTED_ERROR",$=Symbol.for("step_timeout_marker");function ue(e){return typeof e!="object"||e===null?!1:e.type==="STEP_TIMEOUT"?!0:$ in e}function ke(e){if(!(typeof e!="object"||e===null)){if(e.type==="STEP_TIMEOUT"){let t=e;return{timeoutMs:t.timeoutMs,stepName:t.stepName,stepKey:t.stepKey,attempt:t.attempt}}if($ in e)return e[$]}}var le=Symbol("early-exit");function G(e,t){return{[le]:!0,error:e,meta:t}}function H(e){return typeof e=="object"&&e!==null&&e[le]===!0}var me=Symbol("mapper-exception");function Ce(e){return{[me]:!0,thrown:e}}function Re(e){return typeof e=="object"&&e!==null&&e[me]===!0}function xe(e){return typeof e=="string"?{name:e}:e??{}}function ae(e,t){let{backoff:n,initialDelay:u,maxDelay:T,jitter:c}=t,a;switch(n){case"fixed":a=u;break;case"linear":a=u*e;break;case"exponential":a=u*Math.pow(2,e-1);break}if(a=Math.min(a,T),c){let i=a*.25*Math.random();a=a+i}return Math.floor(a)}function ie(e){return new Promise(t=>setTimeout(t,e))}var ce=Symbol("timeout");async function ge(e,t,n){let u=new AbortController,T=t.error??{type:"STEP_TIMEOUT",stepName:n.name,stepKey:n.key,timeoutMs:t.ms,attempt:n.attempt},c,a=new Promise((y,r)=>{c=setTimeout(()=>{u.abort(),r({[ce]:!0,error:T})},t.ms)}),i;t.signal?i=Promise.resolve(e(u.signal)):i=Promise.resolve(e());try{return await Promise.race([i,a])}catch(y){if(typeof y=="object"&&y!==null&&y[ce]===!0){let r=y.error;if(typeof r=="object"&&r!==null&&r.type!=="STEP_TIMEOUT"){let s={timeoutMs:t.ms,stepName:n.name,stepKey:n.key,attempt:n.attempt};$ in r?r[$]=s:Object.defineProperty(r,$,{value:s,enumerable:!1,writable:!0,configurable:!1})}throw r}throw y}finally{clearTimeout(c)}}var q={backoff:"exponential",initialDelay:100,maxDelay:3e4,jitter:!0,retryOn:()=>!0,onRetry:()=>{}};async function pe(e,t){let{onError:n,onEvent:u,catchUnexpected:T,workflowId:c,context:a}=t&&typeof t=="object"?t:{},i=c??crypto.randomUUID(),y=!n&&!T,r=[],s=0,E=l=>l??`step_${++s}`,o=l=>{let _=l.context!==void 0||a===void 0?l:{...l,context:a};if(_.type==="step_success"){let K=_.stepId;for(let X=r.length-1;X>=0;X--){let Z=r[X];if(Z.type==="race"&&!Z.winnerId){Z.winnerId=K;break}}}u?.(_,a)},w=G,v=l=>H(l),h=(l,_)=>y?_?.origin==="result"?{type:"UNEXPECTED_ERROR",cause:{type:"STEP_FAILURE",origin:"result",error:l,..._.resultCause!==void 0?{cause:_.resultCause}:{}}}:_?.origin==="throw"?{type:"UNEXPECTED_ERROR",cause:{type:"STEP_FAILURE",origin:"throw",error:l,thrown:_.thrown}}:{type:"UNEXPECTED_ERROR",cause:{type:"STEP_FAILURE",origin:"result",error:l}}:l,N=l=>({type:"UNEXPECTED_ERROR",cause:l.meta.origin==="result"?{type:"STEP_FAILURE",origin:"result",error:l.error,...l.meta.resultCause!==void 0?{cause:l.meta.resultCause}:{}}:{type:"STEP_FAILURE",origin:"throw",error:l.error,thrown:l.meta.thrown}});try{let _=function(x,d){let f=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let p=performance.now(),m=!1;r.push({scopeId:f,type:"parallel"});let A=()=>{if(m)return;m=!0;let C=r.findIndex(k=>k.scopeId===f);C!==-1&&r.splice(C,1),o({type:"scope_end",workflowId:i,scopeId:f,ts:Date.now(),durationMs:performance.now()-p})};o({type:"scope_start",workflowId:i,scopeId:f,scopeType:"parallel",name:x,ts:Date.now()});try{let C=await d();if(A(),!C.ok)throw n?.(C.error,x,a),w(C.error,{origin:"result",resultCause:C.cause});return C.value}catch(C){throw A(),C}})()},K=function(x,d){let f=Object.keys(x),p=d.name??`Parallel(${f.join(", ")})`,m=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let A=performance.now(),C=!1;r.push({scopeId:m,type:"parallel"});let k=()=>{if(C)return;C=!0;let g=r.findIndex(P=>P.scopeId===m);g!==-1&&r.splice(g,1),o({type:"scope_end",workflowId:i,scopeId:m,ts:Date.now(),durationMs:performance.now()-A})};o({type:"scope_start",workflowId:i,scopeId:m,scopeType:"parallel",name:p,ts:Date.now()});try{let g=await new Promise(D=>{if(f.length===0){D([]);return}let I=!1,b=f.length,ee=new Array(f.length);for(let F=0;F<f.length;F++){let Q=f[F],re=F;Promise.resolve(x[Q]()).catch(S=>O({type:"PROMISE_REJECTED",cause:S},{cause:{type:"PROMISE_REJECTION",reason:S}})).then(S=>{if(!I){if(!S.ok){I=!0,D([{key:Q,result:S}]);return}ee[re]={key:Q,result:S},b--,b===0&&D(ee)}})}});k();let P={};for(let{key:D,result:I}of g){if(!I.ok)throw n?.(I.error,D,a),w(I.error,{origin:"result",resultCause:I.cause});P[D]=I.value}return P}catch(g){throw k(),g}})()};var W=_,L=K;let l=(x,d)=>(async()=>{let f=xe(d),{name:p,key:m,retry:A,timeout:C}=f,k=E(m),g=u,P=g?performance.now():0;if(!(typeof x=="function")){if(A&&A.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(C)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 b={attempts:Math.max(1,A?.attempts??1),backoff:A?.backoff??q.backoff,initialDelay:A?.initialDelay??q.initialDelay,maxDelay:A?.maxDelay??q.maxDelay,jitter:A?.jitter??q.jitter,retryOn:A?.retryOn??q.retryOn,onRetry:A?.onRetry??q.onRetry};u&&o({type:"step_start",workflowId:i,stepId:k,stepKey:m,name:p,ts:Date.now()});let ee;for(let S=1;S<=b.attempts;S++){let Te=g?performance.now():0;try{let R;if(typeof x=="function"?C?R=await ge(x,C,{name:p,key:m,attempt:S}):R=await x():R=await x,R.ok){let V=performance.now()-P;return o({type:"step_success",workflowId:i,stepId:k,stepKey:m,name:p,ts:Date.now(),durationMs:V}),m&&o({type:"step_complete",workflowId:i,stepKey:m,name:p,ts:Date.now(),durationMs:V,result:R}),R.value}if(ee=R,S<b.attempts&&b.retryOn(R.error,S)){let V=ae(S,b);o({type:"step_retry",workflowId:i,stepId:k,stepKey:m,name:p,ts:Date.now(),attempt:S+1,maxAttempts:b.attempts,delayMs:V,error:R.error}),b.onRetry(R.error,S,V),await ie(V);continue}b.attempts>1&&o({type:"step_retries_exhausted",workflowId:i,stepId:k,stepKey:m,name:p,ts:Date.now(),durationMs:performance.now()-P,attempts:S,lastError:R.error});break}catch(R){let V=performance.now()-Te;if(v(R))throw o({type:"step_aborted",workflowId:i,stepId:k,stepKey:m,name:p,ts:Date.now(),durationMs:V}),R;if(ue(R)){let M=ke(R),oe=C?.ms??M?.timeoutMs??0;if(o({type:"step_timeout",workflowId:i,stepId:k,stepKey:m,name:p,ts:Date.now(),timeoutMs:oe,attempt:S}),S<b.attempts&&b.retryOn(R,S)){let se=ae(S,b);o({type:"step_retry",workflowId:i,stepId:k,stepKey:m,name:p,ts:Date.now(),attempt:S+1,maxAttempts:b.attempts,delayMs:se,error:R}),b.onRetry(R,S,se),await ie(se);continue}b.attempts>1&&o({type:"step_retries_exhausted",workflowId:i,stepId:k,stepKey:m,name:p,ts:Date.now(),durationMs:performance.now()-P,attempts:S,lastError:R})}if(S<b.attempts&&b.retryOn(R,S)){let M=ae(S,b);o({type:"step_retry",workflowId:i,stepId:k,stepKey:m,name:p,ts:Date.now(),attempt:S+1,maxAttempts:b.attempts,delayMs:M,error:R}),b.onRetry(R,S,M),await ie(M);continue}b.attempts>1&&!ue(R)&&o({type:"step_retries_exhausted",workflowId:i,stepId:k,stepKey:m,name:p,ts:Date.now(),durationMs:performance.now()-P,attempts:S,lastError:R});let ne=performance.now()-P;if(T){let M;try{M=T(R)}catch(oe){throw Ce(oe)}throw o({type:"step_error",workflowId:i,stepId:k,stepKey:m,name:p,ts:Date.now(),durationMs:ne,error:M}),m&&o({type:"step_complete",workflowId:i,stepKey:m,name:p,ts:Date.now(),durationMs:ne,result:O(M,{cause:R}),meta:{origin:"throw",thrown:R}}),n?.(M,p,a),w(M,{origin:"throw",thrown:R})}else{let M={type:"UNEXPECTED_ERROR",cause:{type:"UNCAUGHT_EXCEPTION",thrown:R}};throw o({type:"step_error",workflowId:i,stepId:k,stepKey:m,name:p,ts:Date.now(),durationMs:ne,error:M}),m&&o({type:"step_complete",workflowId:i,stepKey:m,name:p,ts:Date.now(),durationMs:ne,result:O(M,{cause:R}),meta:{origin:"throw",thrown:R}}),R}}}let F=ee,Q=performance.now()-P,re=h(F.error,{origin:"result",resultCause:F.cause});throw o({type:"step_error",workflowId:i,stepId:k,stepKey:m,name:p,ts:Date.now(),durationMs:Q,error:re}),m&&o({type:"step_complete",workflowId:i,stepKey:m,name:p,ts:Date.now(),durationMs:Q,result:F,meta:{origin:"result",resultCause:F.cause}}),n?.(F.error,p,a),w(F.error,{origin:"result",resultCause:F.cause})})();l.try=(x,d)=>{let f=d.name,p=d.key,m=E(p),A="error"in d?()=>d.error:d.onError,C=u;return(async()=>{let k=C?performance.now():0;u&&o({type:"step_start",workflowId:i,stepId:m,stepKey:p,name:f,ts:Date.now()});try{let g=await x(),P=performance.now()-k;return o({type:"step_success",workflowId:i,stepId:m,stepKey:p,name:f,ts:Date.now(),durationMs:P}),p&&o({type:"step_complete",workflowId:i,stepKey:p,name:f,ts:Date.now(),durationMs:P,result:z(g)}),g}catch(g){let P=A(g),D=performance.now()-k,I=h(P,{origin:"throw",thrown:g});throw o({type:"step_error",workflowId:i,stepId:m,stepKey:p,name:f,ts:Date.now(),durationMs:D,error:I}),p&&o({type:"step_complete",workflowId:i,stepKey:p,name:f,ts:Date.now(),durationMs:D,result:O(P,{cause:g}),meta:{origin:"throw",thrown:g}}),n?.(P,f,a),w(P,{origin:"throw",thrown:g})}})()},l.fromResult=(x,d)=>{let f=d.name,p=d.key,m=E(p),A="error"in d?()=>d.error:d.onError,C=u;return(async()=>{let k=C?performance.now():0;u&&o({type:"step_start",workflowId:i,stepId:m,stepKey:p,name:f,ts:Date.now()});let g=await x();if(g.ok){let P=performance.now()-k;return o({type:"step_success",workflowId:i,stepId:m,stepKey:p,name:f,ts:Date.now(),durationMs:P}),p&&o({type:"step_complete",workflowId:i,stepKey:p,name:f,ts:Date.now(),durationMs:P,result:z(g.value)}),g.value}else{let P=A(g.error),D=performance.now()-k,I=h(P,{origin:"result",resultCause:g.error});throw o({type:"step_error",workflowId:i,stepId:m,stepKey:p,name:f,ts:Date.now(),durationMs:D,error:I}),p&&o({type:"step_complete",workflowId:i,stepKey:p,name:f,ts:Date.now(),durationMs:D,result:O(P,{cause:g.error}),meta:{origin:"result",resultCause:g.error}}),n?.(P,f,a),w(P,{origin:"result",resultCause:g.error})}})()},l.retry=(x,d)=>l(x,{name:d.name,key:d.key,retry:{attempts:d.attempts,backoff:d.backoff,initialDelay:d.initialDelay,maxDelay:d.maxDelay,jitter:d.jitter,retryOn:d.retryOn,onRetry:d.onRetry},timeout:d.timeout}),l.withTimeout=(x,d)=>l(x,{name:d.name,key:d.key,timeout:d}),l.parallel=((...x)=>{if(typeof x[0]=="string"){let d=x[0],f=x[1];return _(d,f)}else{let d=x[0],f=x[1]??{};return K(d,f)}}),l.race=(x,d)=>{let f=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let p=performance.now(),m=!1,A={scopeId:f,type:"race",winnerId:void 0};r.push(A);let C=()=>{if(m)return;m=!0;let k=r.findIndex(g=>g.scopeId===f);k!==-1&&r.splice(k,1),o({type:"scope_end",workflowId:i,scopeId:f,ts:Date.now(),durationMs:performance.now()-p,winnerId:A.winnerId})};o({type:"scope_start",workflowId:i,scopeId:f,scopeType:"race",name:x,ts:Date.now()});try{let k=await d();if(C(),!k.ok)throw n?.(k.error,x,a),w(k.error,{origin:"result",resultCause:k.cause});return k.value}catch(k){throw C(),k}})()},l.allSettled=(x,d)=>{let f=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let p=performance.now(),m=!1;r.push({scopeId:f,type:"allSettled"});let A=()=>{if(m)return;m=!0;let C=r.findIndex(k=>k.scopeId===f);C!==-1&&r.splice(C,1),o({type:"scope_end",workflowId:i,scopeId:f,ts:Date.now(),durationMs:performance.now()-p})};o({type:"scope_start",workflowId:i,scopeId:f,scopeType:"allSettled",name:x,ts:Date.now()});try{let C=await d();if(A(),!C.ok)throw n?.(C.error,x,a),w(C.error,{origin:"result",resultCause:C.cause});return C.value}catch(C){throw A(),C}})()};let Z=await e(l);return z(Z)}catch(l){if(Re(l))throw l.thrown;if(v(l)){let K=l.meta.origin==="throw"?l.meta.thrown:l.meta.resultCause;if(T||n)return O(l.error,{cause:K});if(de(l.error))return O(l.error,{cause:K});let X=N(l);return O(X,{cause:K})}if(T){let K=T(l);return n?.(K,"unexpected",a),O(K,{cause:l})}let _={type:"UNEXPECTED_ERROR",cause:{type:"UNCAUGHT_EXCEPTION",thrown:l}};return n?.(_,"unexpected",a),O(_,{cause:l})}}pe.strict=(e,t)=>pe(e,t);var te=class extends Error{type="CIRCUIT_OPEN";circuitName;state;retryAfterMs;constructor(t){super(t.message??`Circuit breaker "${t.circuitName}" is ${t.state}. Retry after ${Math.ceil(t.retryAfterMs/1e3)}s`),this.name="CircuitOpenError",this.circuitName=t.circuitName,this.state=t.state,this.retryAfterMs=t.retryAfterMs}};function Se(e){return typeof e=="object"&&e!==null&&e.type==="CIRCUIT_OPEN"}var Pe={failureThreshold:5,resetTimeout:3e4,windowSize:6e4,halfOpenMax:3};function he(e,t){let n={...Pe,...t},u="CLOSED",T=[],c=null,a=null,i=0,y=0;function r(){let h=Date.now();T=T.filter(N=>h-N.timestamp<n.windowSize)}function s(h){if(u!==h){let N=u;u=h,h==="HALF_OPEN"&&(y=0),n.onStateChange?.(N,h,e)}}function E(){return u!=="OPEN"||c===null?!1:Date.now()-c>=n.resetTimeout?(s("HALF_OPEN"),!0):!1}function o(){a=Date.now(),i++,u==="HALF_OPEN"&&(y++,y>=n.halfOpenMax&&(s("CLOSED"),T=[]))}function w(h){let N=Date.now();c=N,r(),T.push({timestamp:N,error:h}),(u==="HALF_OPEN"||u==="CLOSED"&&T.length>=n.failureThreshold)&&s("OPEN")}function v(){if(u==="CLOSED")return 0;if(u==="OPEN"){if(E())return 0;let h=Date.now(),N=c?h-c:0;return Math.max(0,n.resetTimeout-N)}return 0}return{async execute(h,N){let W=v();if(W>0)throw new te({circuitName:e,state:u,retryAfterMs:W});try{let L=await h();return o(),L}catch(L){throw w(L),L}},async executeResult(h,N){let W=v();if(W>0)return O(new te({circuitName:e,state:u,retryAfterMs:W}));try{let L=await h();return L.ok?o():w(L.error),L}catch(L){throw w(L),L}},getState(){return u==="OPEN"&&E(),u},getStats(){return r(),{state:this.getState(),failureCount:T.length,successCount:i,lastFailureTime:c,lastSuccessTime:a,halfOpenSuccesses:y}},reset(){s("CLOSED"),T=[],y=0},forceOpen(){c=Date.now(),s("OPEN")},recordSuccess(){o()},recordFailure(h){w(h??new Error("Manual failure"))}}}var Ae={critical:{failureThreshold:3,resetTimeout:6e4,windowSize:3e4,halfOpenMax:1},standard:{failureThreshold:5,resetTimeout:3e4,windowSize:6e4,halfOpenMax:3},lenient:{failureThreshold:10,resetTimeout:15e3,windowSize:12e4,halfOpenMax:5}};function be(e){return typeof e=="object"&&e!==null&&e.type==="RATE_LIMIT_EXCEEDED"}function ye(e){return typeof e=="object"&&e!==null&&e.type==="QUEUE_FULL"}function Ee(e,t){let{maxPerSecond:n,strategy:u="wait"}=t,T=t.burstCapacity??n*2,c=T,a=Date.now(),i=n/1e3,y=[];function r(){let o=Date.now(),v=(o-a)*i;c=Math.min(T,c+v),a=o}function s(){if(r(),c>=1)return c-=1,0;let o=1-c;return Math.ceil(o/i)}async function E(){return new Promise(o=>{let w=()=>{let v=s();v===0?o():(y.push(w),setTimeout(()=>{let h=y.indexOf(w);h!==-1&&(y.splice(h,1),w())},v))};w()})}return{async execute(o){let w=s();if(w>0){if(u==="reject")throw{type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:w};await E()}return o()},async executeResult(o){let w=s();if(w>0){if(u==="reject")return O({type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:w});await E()}return o()},getStats(){return r(),{availableTokens:Math.floor(c),maxTokens:T,tokensPerSecond:n,waitingCount:y.length}},reset(){c=T,a=Date.now(),y.length=0}}}function we(e,t){let{maxConcurrent:n,strategy:u="queue",maxQueueSize:T=1/0}=t,c=0,a=[];async function i(){if(c<n){c++;return}if(u==="reject")throw{type:"QUEUE_FULL",limiterName:e,queueSize:a.length,maxQueueSize:T};if(a.length>=T)throw{type:"QUEUE_FULL",limiterName:e,queueSize:a.length,maxQueueSize:T};return new Promise((r,s)=>{a.push({resolve:r,reject:s})})}function y(){c--,a.length>0&&c<n&&(c++,a.shift()?.resolve())}return{async execute(r){await i();try{return await r()}finally{y()}},async executeAll(r){let s=new Array(r.length),E=[];for(let o=0;o<r.length;o++){let w=o,v=this.execute(r[w]).then(h=>{s[w]=h});E.push(v)}return await Promise.all(E),s},async executeResult(r){try{await i()}catch(s){if(ye(s))return O(s);throw s}try{return await r()}finally{y()}},getStats(){return{activeCount:c,maxConcurrent:n,queueSize:a.length,maxQueueSize:T}},reset(){for(c=0;a.length>0;)a.shift()?.reject(new Error("Limiter reset"))}}}function Oe(e,t){let n=t.rate?Ee(`${e}-rate`,t.rate):void 0,u=t.concurrency?we(`${e}-concurrency`,t.concurrency):void 0;return{rate:n,concurrency:u,async execute(T){let c=T;if(n){let a=c;c=()=>n.execute(a)}return u?u.execute(c):c()}}}var ve={api:{maxPerSecond:10,burstCapacity:20,strategy:"wait"},database:{maxConcurrent:10,strategy:"queue",maxQueueSize:100},external:{maxPerSecond:5,burstCapacity:10,strategy:"wait"}};function _e(e){return typeof e=="object"&&e!==null&&e.type==="SAGA_COMPENSATION_ERROR"}function Me(e,t){return async n=>{let u=crypto.randomUUID(),T=performance.now(),c=[],a=r=>{t?.onEvent?.(r)};a({type:"saga_start",sagaId:u,ts:Date.now()});async function i(r){let s=[];a({type:"saga_compensation_start",sagaId:u,ts:Date.now(),stepCount:c.length});let E=performance.now();for(let o=c.length-1;o>=0;o--){let w=c[o];try{await w.compensate(w.value),a({type:"saga_compensation_step",sagaId:u,stepName:w.name,ts:Date.now(),success:!0})}catch(v){s.push({stepName:w.name,error:v}),a({type:"saga_compensation_step",sagaId:u,stepName:w.name,ts:Date.now(),success:!1,error:v})}}return a({type:"saga_compensation_end",sagaId:u,ts:Date.now(),durationMs:performance.now()-E,success:s.length===0,failedCount:s.length}),s}let y={async step(r,s){let E=await r();if(E.ok)return s?.compensate&&c.push({name:s.name,value:E.value,compensate:s.compensate}),E.value;throw G(E.error,{origin:"result",resultCause:E.cause})},async tryStep(r,s){let E="error"in s?()=>s.error:s.onError;try{let o=await r();return s.compensate&&c.push({name:s.name,value:o,compensate:s.compensate}),o}catch(o){let w=E(o);throw G(w,{origin:"throw",thrown:o})}},getCompensations(){return c.map(r=>({name:r.name,hasValue:r.value!==void 0}))}};try{let r=await n(y,e),s=performance.now()-T;return a({type:"saga_success",sagaId:u,ts:Date.now(),durationMs:s}),z(r)}catch(r){let s=performance.now()-T,E;H(r)?E=r.error:E=r,a({type:"saga_error",sagaId:u,ts:Date.now(),durationMs:s,error:E});let o=await i(E);if(o.length>0){let w={type:"SAGA_COMPENSATION_ERROR",originalError:E,compensationErrors:o};if(t?.onError?.(w),t?.throwOnCompensationFailure)throw w;return O(w)}return t?.onError?.(E),H(r)?O(E):O({type:"UNEXPECTED_ERROR",cause:{type:"UNCAUGHT_EXCEPTION",thrown:r}})}}}async function De(e,t){let n=crypto.randomUUID(),u=performance.now(),T=[],c=y=>{t?.onEvent?.(y)};c({type:"saga_start",sagaId:n,ts:Date.now()});async function a(y){let r=[];c({type:"saga_compensation_start",sagaId:n,ts:Date.now(),stepCount:T.length});let s=performance.now();for(let E=T.length-1;E>=0;E--){let o=T[E];try{await o.compensate(o.value),c({type:"saga_compensation_step",sagaId:n,stepName:o.name,ts:Date.now(),success:!0})}catch(w){r.push({stepName:o.name,error:w}),c({type:"saga_compensation_step",sagaId:n,stepName:o.name,ts:Date.now(),success:!1,error:w})}}return c({type:"saga_compensation_end",sagaId:n,ts:Date.now(),durationMs:performance.now()-s,success:r.length===0,failedCount:r.length}),r}let i={async step(y,r){let s=await y();if(s.ok)return r?.compensate&&T.push({name:r.name,value:s.value,compensate:r.compensate}),s.value;throw G(s.error,{origin:"result",resultCause:s.cause})},async tryStep(y,r){let s="error"in r?()=>r.error:r.onError;try{let E=await y();return r.compensate&&T.push({name:r.name,value:E,compensate:r.compensate}),E}catch(E){let o=s(E);throw G(o,{origin:"throw",thrown:E})}},getCompensations(){return T.map(y=>({name:y.name,hasValue:y.value!==void 0}))}};try{let y=await e(i),r=performance.now()-u;return c({type:"saga_success",sagaId:n,ts:Date.now(),durationMs:r}),z(y)}catch(y){let r=performance.now()-u,s;H(y)?s=y.error:s=y,c({type:"saga_error",sagaId:n,ts:Date.now(),durationMs:r,error:s});let E=await a(s);if(E.length>0){let o={type:"SAGA_COMPENSATION_ERROR",originalError:s,compensationErrors:E};if(t?.onError?.(o),t?.throwOnCompensationFailure)throw o;return O(o)}return t?.onError?.(s),H(y)?O(s):O({type:"UNEXPECTED_ERROR",cause:{type:"UNCAUGHT_EXCEPTION",thrown:y}})}}function U(...e){let t={};for(let n of e)n.name!==void 0&&(t.name=n.name),n.key!==void 0&&(t.key=n.key),n.retry!==void 0&&(t.retry=t.retry?{...t.retry,...n.retry}:{...n.retry}),n.timeout!==void 0&&(t.timeout=t.timeout?{...t.timeout,...n.timeout}:{...n.timeout});return t}function Ie(...e){let t=U(...e);return n=>U(t,typeof n=="string"?{name:n}:n??{})}function Ue(e,...t){return{name:e,policy:U(...t)}}function B(e){return{retry:e}}var J={none:B({attempts:1}),transient:B({attempts:3,backoff:"exponential",initialDelay:100,maxDelay:1e3,jitter:!0}),standard:B({attempts:3,backoff:"exponential",initialDelay:200,maxDelay:5e3,jitter:!0}),aggressive:B({attempts:5,backoff:"exponential",initialDelay:500,maxDelay:3e4,jitter:!0}),fixed:(e,t)=>B({attempts:e,backoff:"fixed",initialDelay:t,jitter:!1}),linear:(e,t)=>B({attempts:e,backoff:"linear",initialDelay:t,jitter:!0}),custom:e=>B({backoff:"exponential",initialDelay:100,maxDelay:3e4,jitter:!0,...e})};function j(e){return{timeout:e}}var Y={none:{},fast:j({ms:1e3}),api:j({ms:5e3}),extended:j({ms:3e4}),long:j({ms:12e4}),ms:e=>j({ms:e}),seconds:e=>j({ms:e*1e3}),withError:(e,t)=>j({ms:e,error:t}),withSignal:e=>j({ms:e,signal:!0})},Ne={httpApi:U(Y.api,J.standard),database:U(Y.extended,B({attempts:2,backoff:"exponential",initialDelay:100,maxDelay:2e3,jitter:!0})),cache:U(Y.fast,J.none),messageQueue:U(Y.extended,J.aggressive),fileSystem:U(Y.long,J.standard),rateLimited:U(j({ms:1e4}),B({attempts:5,backoff:"linear",initialDelay:1e3,maxDelay:1e4,jitter:!0}))};function fe(e,t){return U(e,typeof t=="string"?{name:t}:t??{})}function Le(e,t){let n=typeof t=="string"?{name:t}:t??{};return U(...e,n)}function Fe(e,t,n={}){return e?t:n}function Ke(e,t=process.env.NODE_ENV??"development",n={}){return e[t]??n}function je(){let e=new Map;return{register(t,n){e.set(t,n)},get(t){return e.get(t)},has(t){return e.has(t)},names(){return Array.from(e.keys())},apply(t,n){let u=e.get(t);if(!u)throw new Error(`Policy not found: ${t}`);return fe(u,n)}}}function Be(){let e=[],t={name(n){return e.push({name:n}),t},key(n){return e.push({key:n}),t},policy(n){return e.push(n),t},timeout(n){return e.push(j({ms:n})),t},retry(n){return e.push(B(n)),t},retries(n){return e.push(J.custom({attempts:n})),t},build(){return U(...e)}};return t}export{te as CircuitOpenError,Ae as circuitBreakerPresets,Fe as conditionalPolicy,he as createCircuitBreaker,Oe as createCombinedLimiter,we as createConcurrencyLimiter,Ie as createPolicyApplier,Ue as createPolicyBundle,je as createPolicyRegistry,Ee as createRateLimiter,Me as createSagaWorkflow,Ke as envPolicy,Se as isCircuitOpenError,ye as isQueueFullError,be as isRateLimitExceededError,_e as isSagaCompensationError,U as mergePolicies,ve as rateLimiterPresets,J as retryPolicies,B as retryPolicy,De as runSaga,Ne as servicePolicies,Be as stepOptions,Y as timeoutPolicies,j as timeoutPolicy,Le as withPolicies,fe as withPolicy};
2
+ //# sourceMappingURL=reliability.js.map