awaitly 1.35.0 → 2.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.
- package/dist/{duration.d.ts → di-BDlT7InM.d.cts} +15 -1
- package/dist/{duration.d.cts → di-BbFFfO8y.d.ts} +15 -1
- package/dist/errors-DtXvrCiO.d.cts +708 -0
- package/dist/errors-DtXvrCiO.d.ts +708 -0
- package/dist/index.cjs +4594 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1970 -141
- package/dist/index.d.ts +1970 -141
- package/dist/index.js +4398 -1
- package/dist/index.js.map +1 -1
- package/dist/result.cjs +641 -1
- package/dist/result.cjs.map +1 -1
- package/dist/result.d.cts +29 -4
- package/dist/result.d.ts +29 -4
- package/dist/result.js +561 -1
- package/dist/result.js.map +1 -1
- package/dist/testing.cjs +4202 -8
- package/dist/testing.cjs.map +1 -1
- package/dist/testing.d.cts +2 -6
- package/dist/testing.d.ts +2 -6
- package/dist/testing.js +4154 -8
- package/dist/testing.js.map +1 -1
- package/dist/{run-entry-DGs0tySr.d.cts → types-B8NfNRGX.d.ts} +1078 -1502
- package/dist/{run-entry-BOuNyVoO.d.ts → types-BZ2f4MRR.d.cts} +1078 -1502
- package/dist/workflow.cjs +7096 -6
- package/dist/workflow.cjs.map +1 -1
- package/dist/workflow.d.cts +3346 -22
- package/dist/workflow.d.ts +3346 -22
- package/dist/workflow.js +6929 -6
- package/dist/workflow.js.map +1 -1
- package/package.json +3 -168
- package/dist/adapters.cjs +0 -7
- package/dist/adapters.cjs.map +0 -1
- package/dist/adapters.d.cts +0 -179
- package/dist/adapters.d.ts +0 -179
- package/dist/adapters.js +0 -7
- package/dist/adapters.js.map +0 -1
- package/dist/batch.cjs +0 -7
- package/dist/batch.cjs.map +0 -1
- package/dist/batch.d.cts +0 -200
- package/dist/batch.d.ts +0 -200
- package/dist/batch.js +0 -7
- package/dist/batch.js.map +0 -1
- package/dist/bind-deps.cjs +0 -2
- package/dist/bind-deps.cjs.map +0 -1
- package/dist/bind-deps.d.cts +0 -28
- package/dist/bind-deps.d.ts +0 -28
- package/dist/bind-deps.js +0 -2
- package/dist/bind-deps.js.map +0 -1
- package/dist/cache.cjs +0 -2
- package/dist/cache.cjs.map +0 -1
- package/dist/cache.d.cts +0 -269
- package/dist/cache.d.ts +0 -269
- package/dist/cache.js +0 -2
- package/dist/cache.js.map +0 -1
- package/dist/circuit-breaker.cjs +0 -7
- package/dist/circuit-breaker.cjs.map +0 -1
- package/dist/circuit-breaker.d.cts +0 -211
- package/dist/circuit-breaker.d.ts +0 -211
- package/dist/circuit-breaker.js +0 -7
- package/dist/circuit-breaker.js.map +0 -1
- package/dist/conditional.cjs +0 -2
- package/dist/conditional.cjs.map +0 -1
- package/dist/conditional.d.cts +0 -252
- package/dist/conditional.d.ts +0 -252
- package/dist/conditional.js +0 -2
- package/dist/conditional.js.map +0 -1
- package/dist/core.cjs +0 -7
- package/dist/core.cjs.map +0 -1
- package/dist/core.d.cts +0 -5
- package/dist/core.d.ts +0 -5
- package/dist/core.js +0 -7
- package/dist/core.js.map +0 -1
- package/dist/di-By77n4Fa.d.ts +0 -15
- package/dist/di-OJfsohf-.d.cts +0 -15
- package/dist/diagnostics.cjs +0 -8
- package/dist/diagnostics.cjs.map +0 -1
- package/dist/diagnostics.d.cts +0 -68
- package/dist/diagnostics.d.ts +0 -68
- package/dist/diagnostics.js +0 -8
- package/dist/diagnostics.js.map +0 -1
- package/dist/durable.cjs +0 -11
- package/dist/durable.cjs.map +0 -1
- package/dist/durable.d.cts +0 -9
- package/dist/durable.d.ts +0 -9
- package/dist/durable.js +0 -11
- package/dist/durable.js.map +0 -1
- package/dist/duration.cjs +0 -2
- package/dist/duration.cjs.map +0 -1
- package/dist/duration.js +0 -2
- package/dist/duration.js.map +0 -1
- package/dist/engine.cjs +0 -11
- package/dist/engine.cjs.map +0 -1
- package/dist/engine.d.cts +0 -115
- package/dist/engine.d.ts +0 -115
- package/dist/engine.js +0 -11
- package/dist/engine.js.map +0 -1
- package/dist/errors.cjs +0 -2
- package/dist/errors.cjs.map +0 -1
- package/dist/errors.d.cts +0 -361
- package/dist/errors.d.ts +0 -361
- package/dist/errors.js +0 -2
- package/dist/errors.js.map +0 -1
- package/dist/fetch.cjs +0 -7
- package/dist/fetch.cjs.map +0 -1
- package/dist/fetch.d.cts +0 -86
- package/dist/fetch.d.ts +0 -86
- package/dist/fetch.js +0 -7
- package/dist/fetch.js.map +0 -1
- package/dist/flow.cjs +0 -7
- package/dist/flow.cjs.map +0 -1
- package/dist/flow.d.cts +0 -163
- package/dist/flow.d.ts +0 -163
- package/dist/flow.js +0 -7
- package/dist/flow.js.map +0 -1
- package/dist/functional.cjs +0 -2
- package/dist/functional.cjs.map +0 -1
- package/dist/functional.d.cts +0 -444
- package/dist/functional.d.ts +0 -444
- package/dist/functional.js +0 -2
- package/dist/functional.js.map +0 -1
- package/dist/guards-4sV7mTqj.d.cts +0 -72
- package/dist/guards-BIX05ALH.d.ts +0 -72
- package/dist/hitl-DFn4Xa_l.d.cts +0 -468
- package/dist/hitl-DU5VpKq7.d.ts +0 -468
- package/dist/hitl.cjs +0 -7
- package/dist/hitl.cjs.map +0 -1
- package/dist/hitl.d.cts +0 -442
- package/dist/hitl.d.ts +0 -442
- package/dist/hitl.js +0 -7
- package/dist/hitl.js.map +0 -1
- package/dist/index-CnvBryQB.d.ts +0 -417
- package/dist/index-DEZEf8Fs.d.cts +0 -417
- package/dist/match-entry-DjI2bLpD.d.cts +0 -209
- package/dist/match-entry-DjI2bLpD.d.ts +0 -209
- package/dist/match.cjs +0 -2
- package/dist/match.cjs.map +0 -1
- package/dist/match.d.cts +0 -1
- package/dist/match.d.ts +0 -1
- package/dist/match.js +0 -2
- package/dist/match.js.map +0 -1
- package/dist/otel.cjs +0 -2
- package/dist/otel.cjs.map +0 -1
- package/dist/otel.d.cts +0 -188
- package/dist/otel.d.ts +0 -188
- package/dist/otel.js +0 -2
- package/dist/otel.js.map +0 -1
- package/dist/persistence-entry-B-8PjnSR.d.cts +0 -831
- package/dist/persistence-entry-D8zRkLiT.d.ts +0 -831
- package/dist/persistence.cjs +0 -2
- package/dist/persistence.cjs.map +0 -1
- package/dist/persistence.d.cts +0 -7
- package/dist/persistence.d.ts +0 -7
- package/dist/persistence.js +0 -2
- package/dist/persistence.js.map +0 -1
- package/dist/policies.cjs +0 -2
- package/dist/policies.cjs.map +0 -1
- package/dist/policies.d.cts +0 -379
- package/dist/policies.d.ts +0 -379
- package/dist/policies.js +0 -2
- package/dist/policies.js.map +0 -1
- package/dist/ratelimit.cjs +0 -7
- package/dist/ratelimit.cjs.map +0 -1
- package/dist/ratelimit.d.cts +0 -458
- package/dist/ratelimit.d.ts +0 -458
- package/dist/ratelimit.js +0 -7
- package/dist/ratelimit.js.map +0 -1
- package/dist/reliability.cjs +0 -11
- package/dist/reliability.cjs.map +0 -1
- package/dist/reliability.d.cts +0 -11
- package/dist/reliability.d.ts +0 -11
- package/dist/reliability.js +0 -11
- package/dist/reliability.js.map +0 -1
- package/dist/resolver.cjs +0 -7
- package/dist/resolver.cjs.map +0 -1
- package/dist/resolver.d.cts +0 -68
- package/dist/resolver.d.ts +0 -68
- package/dist/resolver.js +0 -7
- package/dist/resolver.js.map +0 -1
- package/dist/resource.cjs +0 -7
- package/dist/resource.cjs.map +0 -1
- package/dist/resource.d.cts +0 -174
- package/dist/resource.d.ts +0 -174
- package/dist/resource.js +0 -7
- package/dist/resource.js.map +0 -1
- package/dist/result/retry.cjs +0 -2
- package/dist/result/retry.cjs.map +0 -1
- package/dist/result/retry.d.cts +0 -70
- package/dist/result/retry.d.ts +0 -70
- package/dist/result/retry.js +0 -2
- package/dist/result/retry.js.map +0 -1
- package/dist/retry.cjs +0 -2
- package/dist/retry.cjs.map +0 -1
- package/dist/retry.d.cts +0 -388
- package/dist/retry.d.ts +0 -388
- package/dist/retry.js +0 -2
- package/dist/retry.js.map +0 -1
- package/dist/run.cjs +0 -7
- package/dist/run.cjs.map +0 -1
- package/dist/run.d.cts +0 -4
- package/dist/run.d.ts +0 -4
- package/dist/run.js +0 -7
- package/dist/run.js.map +0 -1
- package/dist/saga.cjs +0 -11
- package/dist/saga.cjs.map +0 -1
- package/dist/saga.d.cts +0 -164
- package/dist/saga.d.ts +0 -164
- package/dist/saga.js +0 -11
- package/dist/saga.js.map +0 -1
- package/dist/singleflight.cjs +0 -2
- package/dist/singleflight.cjs.map +0 -1
- package/dist/singleflight.d.cts +0 -145
- package/dist/singleflight.d.ts +0 -145
- package/dist/singleflight.js +0 -2
- package/dist/singleflight.js.map +0 -1
- package/dist/slugs.cjs +0 -2
- package/dist/slugs.cjs.map +0 -1
- package/dist/slugs.d.cts +0 -67
- package/dist/slugs.d.ts +0 -67
- package/dist/slugs.js +0 -2
- package/dist/slugs.js.map +0 -1
- package/dist/streaming.cjs +0 -9
- package/dist/streaming.cjs.map +0 -1
- package/dist/streaming.d.cts +0 -596
- package/dist/streaming.d.ts +0 -596
- package/dist/streaming.js +0 -9
- package/dist/streaming.js.map +0 -1
- package/dist/tagged-error.cjs +0 -2
- package/dist/tagged-error.cjs.map +0 -1
- package/dist/tagged-error.d.cts +0 -275
- package/dist/tagged-error.d.ts +0 -275
- package/dist/tagged-error.js +0 -2
- package/dist/tagged-error.js.map +0 -1
- package/dist/types-BziYHFkD.d.ts +0 -323
- package/dist/types-C5jLEUqY.d.cts +0 -323
- package/dist/webhook.cjs +0 -7
- package/dist/webhook.cjs.map +0 -1
- package/dist/webhook.d.cts +0 -499
- package/dist/webhook.d.ts +0 -499
- package/dist/webhook.js +0 -7
- package/dist/webhook.js.map +0 -1
package/dist/reliability.d.cts
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
export { CircuitBreaker, CircuitBreakerConfig, CircuitBreakerStats, CircuitOpenError, CircuitState, circuitBreakerPresets, createCircuitBreaker, isCircuitOpenError } from './circuit-breaker.cjs';
|
|
2
|
-
export { CombinedLimiterConfig, ConcurrencyLimiter, ConcurrencyLimiterConfig, ConcurrencyLimiterStats, CostBasedRateLimiter, CostBasedRateLimiterConfig, CostBasedRateLimiterStats, FixedWindowLimiter, FixedWindowLimiterConfig, FixedWindowLimiterStats, QueueFullError, RateLimitExceededError, RateLimiter, RateLimiterConfig, RateLimiterStats, createCombinedLimiter, createConcurrencyLimiter, createCostBasedRateLimiter, createFixedWindowLimiter, createRateLimiter, isQueueFullError, isRateLimitExceededError, rateLimiterPresets } from './ratelimit.cjs';
|
|
3
|
-
export { CompensationAction, SagaCompensationError, SagaEvent, SagaResult, SagaStep, SagaStepOptions, SagaWorkflow, 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 './run-entry-DGs0tySr.cjs';
|
|
6
|
-
import './errors.cjs';
|
|
7
|
-
import './tagged-error.cjs';
|
|
8
|
-
import './slugs.cjs';
|
|
9
|
-
import './persistence-entry-B-8PjnSR.cjs';
|
|
10
|
-
import './types-C5jLEUqY.cjs';
|
|
11
|
-
import '@standard-schema/spec';
|
package/dist/reliability.d.ts
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
export { CircuitBreaker, CircuitBreakerConfig, CircuitBreakerStats, CircuitOpenError, CircuitState, circuitBreakerPresets, createCircuitBreaker, isCircuitOpenError } from './circuit-breaker.js';
|
|
2
|
-
export { CombinedLimiterConfig, ConcurrencyLimiter, ConcurrencyLimiterConfig, ConcurrencyLimiterStats, CostBasedRateLimiter, CostBasedRateLimiterConfig, CostBasedRateLimiterStats, FixedWindowLimiter, FixedWindowLimiterConfig, FixedWindowLimiterStats, QueueFullError, RateLimitExceededError, RateLimiter, RateLimiterConfig, RateLimiterStats, createCombinedLimiter, createConcurrencyLimiter, createCostBasedRateLimiter, createFixedWindowLimiter, createRateLimiter, isQueueFullError, isRateLimitExceededError, rateLimiterPresets } from './ratelimit.js';
|
|
3
|
-
export { CompensationAction, SagaCompensationError, SagaEvent, SagaResult, SagaStep, SagaStepOptions, SagaWorkflow, 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 './run-entry-BOuNyVoO.js';
|
|
6
|
-
import './errors.js';
|
|
7
|
-
import './tagged-error.js';
|
|
8
|
-
import './slugs.js';
|
|
9
|
-
import './persistence-entry-D8zRkLiT.js';
|
|
10
|
-
import './types-BziYHFkD.js';
|
|
11
|
-
import '@standard-schema/spec';
|
package/dist/reliability.js
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
var Mt={"step-require-id":"step-require-id","step-no-immediate-execution":"step-no-immediate-execution","step-require-thunk-for-key":"step-require-thunk-for-key","step-no-bare-await":"step-no-bare-await","step-no-try-catch-wrap":"step-no-try-catch-wrap","step-stable-cache-keys":"step-stable-cache-keys","workflow-no-floating":"workflow-no-floating","workflow-options-position":"workflow-options-position","workflow-callback-shape":"workflow-callback-shape","workflow-no-callable-form":"workflow-no-callable-form","workflow-no-dynamic-import":"workflow-no-dynamic-import","result-no-floating":"result-no-floating","result-require-handling":"result-require-handling","result-no-double-wrap":"result-no-double-wrap","result-no-manual-propagation":"result-no-manual-propagation","result-no-direct-ok-err":"result-no-direct-ok-err","error-check-unexpected-first":"error-check-unexpected-first","error-access-cause":"error-access-cause","error-normalize":"error-normalize","error-no-throw-in-deps":"error-no-throw-in-deps","concurrency-no-promise-all":"concurrency-no-promise-all","concurrency-no-promise-race":"concurrency-no-promise-race","concurrency-no-promise-allsettled":"concurrency-no-promise-allsettled","runtime-step-timeout":"runtime-step-timeout","runtime-step-aborted":"runtime-step-aborted","runtime-retry-exhausted":"runtime-retry-exhausted","runtime-rate-limit":"runtime-rate-limit","runtime-circuit-open":"runtime-circuit-open","runtime-unexpected":"runtime-unexpected","runtime-resolver-not-found":"runtime-resolver-not-found","runtime-saga-compensation":"runtime-saga-compensation"};function st(e){return`https://jagreehal.github.io/awaitly/rules/#${e}`}var kr=Object.keys(Mt);var je=class extends Error{_tag};function me(e,t){return class extends je{_tag=e;constructor(n,d){let l=t?.message?t.message(n??{}):e;if(super(l),this.name=e,t?.slug!==void 0){if(!t.hint)throw new TypeError(`TaggedError: 'hint' is required when 'slug' is set (slug: "${t.slug}")`);Object.defineProperty(this,"code",{value:t.slug,enumerable:!0,writable:!1,configurable:!1}),Object.defineProperty(this,"hint",{value:t.hint,enumerable:!0,writable:!1,configurable:!1}),Object.defineProperty(this,"docsUrl",{value:st(t.slug),enumerable:!0,writable:!1,configurable:!1})}if(Object.setPrototypeOf(this,new.target.prototype),n&&typeof n=="object"){let o;if(t?.slug!==void 0){let{_tag:k,name:R,message:g,stack:r,code:w,hint:A,docsUrl:$,...G}=n;o=G}else{let{_tag:k,name:R,message:g,stack:r,...w}=n;o=w}let E=Object.prototype.hasOwnProperty.call(o,"cause"),b=E?o.cause:void 0;E&&delete o.cause;let M=d?.cause!==void 0;if(E&&M)throw new TypeError("TaggedError: cannot provide 'cause' in props when also setting ErrorOptions.cause");Object.assign(this,o),E&&(this.cause=b),M&&(this.cause=d?.cause)}else d?.cause!==void 0&&(this.cause=d.cause)}}}Object.defineProperty(me,Symbol.hasInstance,{value:e=>e instanceof je});(l=>{function e(o){return o instanceof Error}l.isError=e;function t(o){return o instanceof je}l.isTaggedError=t;function n(o,E){let b=o._tag,M=E[b];return M(o)}l.match=n;function d(o,E,b){let M=o._tag,k=E[M];return k?k(o):b(o)}l.matchPartial=d})(me||={});var at=class extends me("TimeoutError",{slug:"runtime-step-timeout",hint:"Increase the step's timeout option, or check why the upstream operation is slow.",message:t=>t.operation?`TimeoutError: ${t.operation} timed out after ${t.ms}ms`:`TimeoutError: Operation timed out after ${t.ms}ms`}){},it=class extends me("RetryExhaustedError",{slug:"runtime-retry-exhausted",hint:"All retry attempts failed. Inspect lastError and decide whether to surface it or compensate.",message:t=>t.operation?`RetryExhaustedError: ${t.operation} failed after ${t.attempts} attempts`:`RetryExhaustedError: Operation failed after ${t.attempts} attempts`}){},ut=class extends me("RateLimitError",{slug:"runtime-rate-limit",hint:"Wait retryAfterMs before retrying, or apply step.cache to deduplicate calls.",message:t=>t.limiterName?`RateLimitError: Rate limit exceeded for ${t.limiterName}${t.retryAfterMs?`, retry after ${t.retryAfterMs}ms`:""}`:`RateLimitError: Rate limit exceeded${t.retryAfterMs?`, retry after ${t.retryAfterMs}ms`:""}`}){},ct=class extends me("CircuitBreakerOpenError",{slug:"runtime-circuit-open",hint:"The circuit is open. Wait for it to half-open or fall back to a degraded path.",message:t=>`CircuitBreakerOpenError: Circuit ${t.circuitName} is ${t.state??"OPEN"}${t.retryAfterMs?`, retry after ${Math.ceil(t.retryAfterMs/1e3)}s`:""}`}){},lt=class extends me("ValidationError",{message:t=>`ValidationError: Invalid ${t.field} - ${t.reason}`}){},pt=class extends me("NotFoundError",{message:t=>t.id?`NotFoundError: ${t.resource} with id ${t.id} not found`:`NotFoundError: ${t.resource} not found`}){},mt=class extends me("UnauthorizedError",{message:t=>t.reason?`UnauthorizedError: ${t.reason}`:t.action&&t.resource?`UnauthorizedError: Not authorized to ${t.action} ${t.resource}`:"UnauthorizedError: Access denied"}){},dt=class extends me("NetworkError",{message:t=>t.url?`NetworkError: ${t.reason} (${t.url})`:`NetworkError: ${t.reason}`}){},Et=class extends me("CompensationError",{slug:"runtime-saga-compensation",hint:"A saga compensation step failed. Inspect compensationError and ensure compensation is idempotent.",message:t=>`CompensationError: Failed to compensate step ${t.step}`}){},_e=class extends me("UnexpectedError",{slug:"runtime-unexpected",hint:"An unexpected exception escaped a step. Inspect cause; consider returning a typed Result instead of throwing.",message:t=>`UnexpectedError: ${t.cause instanceof Error?t.cause.message:String(t.cause??"unknown")}`}){};function ft(e){return{ok:!0,value:e}}var It=e=>typeof e=="object"&&e!==null&&"ok"in e&&typeof e.ok=="boolean"&&(e.ok?"value"in e:"error"in e),Ke=(e,t)=>{let n={},d=new Map;for(let l of Object.keys(e)){let o=e[l];typeof o=="function"&&(n[l]=(...E)=>{let b=(d.get(l)??0)+1;d.set(l,b);let M=b===1?l:`${l}#${b}`;return t(M,async()=>{let k=await o(...E);return It(k)?k:ft(k)})})}return n};function Ut(e){let t=e.trim().match(/^(\d+(?:\.\d+)?)\s*(ms|s|m|h|d)$/i);if(!t)return;let n=parseFloat(t[1]),d=t[2].toLowerCase();return{_tag:"Duration",millis:n*({ms:1,s:1e3,m:6e4,h:36e5,d:864e5}[d]??1)}}function qe(e){return new _e({cause:e})}function te(e){return{ok:!0,value:e}}function L(e,t){let n=t?.cause;return{ok:!1,error:e,...n!==void 0?{cause:n}:{}}}var gt=e=>e instanceof _e||typeof e=="object"&&e!==null&&"_tag"in e&&e._tag==="UnexpectedError";function Nt(e){if(e==null)return"unknown";if(typeof e=="string")return e.trim()||"unknown";if(typeof e=="object"){let t=e;if(typeof t._tag=="string"){let n=t._tag.trim();if(n)return n}if(typeof t.tag=="string"){let n=t.tag.trim();if(n)return n}if(typeof t.code=="string"){let n=t.code.trim();if(n)return n}else if(typeof t.code=="number")return String(t.code);if(e instanceof Error&&e.name){let n=e.name.trim();if(n)return n}}return"unknown"}function Wt(e,t){if(!(!t||!e))return t[e]}function Xe(e){let{intent:t,domain:n,owner:d,tags:l,stateChanges:o,emits:E,calls:b}=e;if(!t&&!n&&!d&&!l?.length&&!o?.length&&!E?.length&&!b?.length)return;let M={};return t&&(M.intent=t),n&&(M.domain=n),d&&(M.owner=d),l?.length&&(M.tags=l),o?.length&&(M.stateChanges=o),E?.length&&(M.emits=E),b?.length&&(M.calls=b),M}function we(e,t,n,d,l){let o=Nt(e),E=Wt(o,t),b={tag:o,origin:n};return E!==void 0&&(b.classification=E),d!==void 0&&(b.attempt=d),l!==void 0&&(b.cumulativeDurationMs=l),b}var Ie=Symbol.for("step_timeout_marker");function yt(e){return typeof e!="object"||e===null?!1:e.type==="STEP_TIMEOUT"?!0:Ie in e}function Lt(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(Ie in e)return e[Ie]}}var Tt=Symbol("early-exit");function he(e,t){return{[Tt]:!0,error:e,meta:t}}function xe(e){return typeof e=="object"&&e!==null&&e[Tt]===!0}var Rt=Symbol("mapper-exception");function De(e){return{[Rt]:!0,thrown:e}}function Ft(e){return typeof e=="object"&&e!==null&&e[Rt]===!0}function Qe(e,t){let{backoff:n,initialDelay:d,maxDelay:l,jitter:o}=t,E;switch(n){case"fixed":E=d;break;case"linear":E=d*e;break;case"exponential":E=d*Math.pow(2,e-1);break}if(E=Math.min(E,l),o){let b=E*.25*Math.random();E=E+b}return Math.floor(E)}function Ge(e){return new Promise(t=>setTimeout(t,e))}var wt=Symbol("timeout"),He=Symbol("timeout-option");function jt(e){return typeof e=="object"&&e!==null&&e[He]===!0}async function Kt(e,t,n,d){let l=new AbortController,o=t.onTimeout??"error",E=()=>typeof o=="function"?o({name:n.name,key:n.key,ms:t.ms}):t.error??{type:"STEP_TIMEOUT",stepName:n.name,stepKey:n.key,timeoutMs:t.ms,attempt:n.attempt},b;d?.aborted&&l.abort(d.reason);let M;d&&!d.aborted&&(M=()=>l.abort(d.reason),d.addEventListener("abort",M,{once:!0}));let k=new Promise((g,r)=>{b=setTimeout(()=>{if(o!=="disconnect"&&l.abort(),o==="option"){r({[He]:!0,ms:t.ms});return}r({[wt]:!0,error:E()})},t.ms)}),R;t.signal?R=Promise.resolve(e(l.signal)):R=Promise.resolve(e());try{return await Promise.race([R,k])}catch(g){if(typeof g=="object"&&g!==null&&g[He]===!0)throw{[He]:!0,ms:t.ms};if(typeof g=="object"&&g!==null&&g[wt]===!0){o==="disconnect"&&R.catch(()=>{});let r=g.error;if(typeof r=="object"&&r!==null&&r.type!=="STEP_TIMEOUT"){let w={timeoutMs:t.ms,stepName:n.name,stepKey:n.key,attempt:n.attempt};Ie in r?r[Ie]=w:Object.defineProperty(r,Ie,{value:w,enumerable:!1,writable:!0,configurable:!1})}throw r}throw g}finally{clearTimeout(b),M&&d&&d.removeEventListener("abort",M)}}var Me={backoff:"exponential",initialDelay:100,maxDelay:3e4,jitter:!0,shouldRetry:()=>!0,onRetry:()=>{}};async function Be(e,t,n){if(typeof e!="function"){let h=e,le=t;if(typeof le!="function")throw new TypeError("[awaitly] run(deps, fn) requires a callback as the second argument. Example: run({ getUser }, async (s) => s.getUser(id))");return Be(({step:Re})=>le(Ke(h,Re),{step:Re}),n)}let d=e,l=t,{onError:o,onEvent:E,catchUnexpected:b,workflowId:M,workflowName:k,context:R,_workflowSignal:g}=l&&typeof l=="object"?l:{},r=M??crypto.randomUUID(),w=b??qe,A=[],$=0,G=h=>h??`step_${++$}`,i=h=>{let le=h.context!==void 0||R===void 0?h:{...h,context:R},fe=k!==void 0&&le.workflowName===void 0?{...le,workflowName:k}:le;if(fe.type==="step_success"){let Re=fe.stepId;for(let be=A.length-1;be>=0;be--){let z=A[be];if(z.type==="race"&&!z.winnerId){z.winnerId=Re;break}}}E?.(fe,R)},X=he,de=h=>xe(h),pe=(h,le)=>h,Te=h=>typeof h=="function"?!1:!!(h&&typeof h=="object"&&"ok"in h||h&&typeof h=="object"&&"then"in h&&typeof h.then=="function");try{let le=function(y){let P={};for(let[u,c]of Object.entries(y))if(typeof c=="function")P[u]=c;else if(c&&typeof c=="object"&&"fn"in c)P[u]=c.fn;else throw new TypeError(`step.all: operation "${u}" must be a function or { fn, errors? } object`);return P},fe=function(y,P){let u=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let c=performance.now(),s=!1;A.push({scopeId:u,type:"parallel"});let a=()=>{if(s)return;s=!0;let C=A.findIndex(O=>O.scopeId===u);C!==-1&&A.splice(C,1),i({type:"scope_end",workflowId:r,scopeId:u,ts:Date.now(),durationMs:performance.now()-c})};i({type:"scope_start",workflowId:r,scopeId:u,scopeType:"parallel",name:y,ts:Date.now()});try{let C=await P();if(a(),!C.ok)throw o?.(C.error,y,R),X(C.error,{origin:"result",resultCause:C.cause});return C.value}catch(C){throw a(),C}})()},Re=function(y,P){let u=Object.keys(y),c=P.name??`Parallel(${u.join(", ")})`,s=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let a=performance.now(),C=!1;A.push({scopeId:s,type:"parallel"});let O=()=>{if(C)return;C=!0;let U=A.findIndex(W=>W.scopeId===s);U!==-1&&A.splice(U,1),i({type:"scope_end",workflowId:r,scopeId:s,ts:Date.now(),durationMs:performance.now()-a})};i({type:"scope_start",workflowId:r,scopeId:s,scopeType:"parallel",name:c,ts:Date.now()});try{let U=await new Promise(j=>{if(u.length===0){j([]);return}let H=!1,ne=u.length,B=new Array(u.length);for(let Y=0;Y<u.length;Y++){let V=u[Y],J=Y;Promise.resolve(y[V]()).catch(_=>L({type:"PROMISE_REJECTED",cause:_},{cause:{type:"PROMISE_REJECTION",reason:_}})).then(_=>{if(!H){if(!_.ok){H=!0,j([{key:V,result:_}]);return}B[J]={key:V,result:_},ne--,ne===0&&j(B)}})}});O();let W={};for(let{key:j,result:H}of U){if(!H.ok)throw o?.(H.error,j,R),X(H.error,{origin:"result",resultCause:H.cause});W[j]=H.value}return W}catch(U){throw O(),U}})()};var Pe=le,Oe=fe,Se=Re;let h=(y,P,u)=>(async()=>{if(typeof y!="string"||y.length===0)throw new Error('[awaitly] step() requires an explicit string ID as the first argument. Example: step("fetchUser", () => fetchUser(id))');let c=u??{},s=Xe(c),a=y,C=c.key??y,O=c.key??y,{description:U,retry:W,timeout:j}=c,H=G(C),ne=E,B=ne?performance.now():0,V=Te(P)?()=>P:P,_={attempts:Math.max(1,W?.attempts??1),backoff:W?.backoff??Me.backoff,initialDelay:W?.initialDelay??Me.initialDelay,maxDelay:W?.maxDelay??Me.maxDelay,jitter:W?.jitter??Me.jitter,shouldRetry:W?.shouldRetry??Me.shouldRetry,onRetry:W?.onRetry??Me.onRetry};E&&i({type:"step_start",workflowId:r,stepId:H,stepKey:C,name:a,description:U,ts:Date.now(),...s&&{metadata:s}});let ye;for(let v=1;v<=_.attempts;v++){let x=ne?performance.now():0;try{let p;if(j?p=await Kt(V,j,{name:a,key:C,attempt:v},g):p=await V(),p.ok){let S=performance.now()-B;return i({type:"step_success",workflowId:r,stepId:H,stepKey:C,name:a,description:U,ts:Date.now(),durationMs:S,...s&&{metadata:s}}),O&&i({type:"step_complete",workflowId:r,stepKey:O,name:a,description:U,ts:Date.now(),durationMs:S,result:p,...s&&{metadata:s}}),p.value}if(ye=p,v<_.attempts&&_.shouldRetry(p.error,v)){let S=Qe(v,_);i({type:"step_retry",workflowId:r,stepId:H,stepKey:C,name:a,ts:Date.now(),attempt:v+1,maxAttempts:_.attempts,delayMs:S,error:p.error,...s&&{metadata:s},diagnostics:we(p.error,c.errorMeta,"result",v,performance.now()-B)}),_.onRetry(p.error,v,S),await Ge(S);continue}_.attempts>1&&i({type:"step_retries_exhausted",workflowId:r,stepId:H,stepKey:C,name:a,ts:Date.now(),durationMs:performance.now()-B,attempts:v,lastError:p.error,...s&&{metadata:s},diagnostics:we(p.error,c.errorMeta,"result",v,performance.now()-B)});break}catch(p){let S=performance.now()-x;if(jt(p)){let N=p.ms;i({type:"step_timeout",workflowId:r,stepId:H,stepKey:C,name:a,ts:Date.now(),timeoutMs:N,attempt:v,...s&&{metadata:s},diagnostics:we(p,c.errorMeta,"timeout",v)}),i({type:"step_success",workflowId:r,stepId:H,stepKey:C,name:a,description:U,ts:Date.now(),durationMs:performance.now()-B,...s&&{metadata:s}}),O&&i({type:"step_complete",workflowId:r,stepKey:O,name:a,description:U,ts:Date.now(),durationMs:performance.now()-B,result:te(void 0),...s&&{metadata:s}});return}if(de(p))throw i({type:"step_aborted",workflowId:r,stepId:H,stepKey:C,name:a,description:U,ts:Date.now(),durationMs:S,...s&&{metadata:s}}),p;if(yt(p)){let N=Lt(p),T=j?.ms??N?.timeoutMs??0;if(i({type:"step_timeout",workflowId:r,stepId:H,stepKey:C,name:a,ts:Date.now(),timeoutMs:T,attempt:v,...s&&{metadata:s},diagnostics:we(p,c.errorMeta,"timeout",v)}),v<_.attempts&&_.shouldRetry(p,v)){let Z=Qe(v,_);i({type:"step_retry",workflowId:r,stepId:H,stepKey:C,name:a,ts:Date.now(),attempt:v+1,maxAttempts:_.attempts,delayMs:Z,error:p,...s&&{metadata:s},diagnostics:we(p,c.errorMeta,"timeout",v,performance.now()-B)}),_.onRetry(p,v,Z),await Ge(Z);continue}_.attempts>1&&i({type:"step_retries_exhausted",workflowId:r,stepId:H,stepKey:C,name:a,ts:Date.now(),durationMs:performance.now()-B,attempts:v,lastError:p,...s&&{metadata:s},diagnostics:we(p,c.errorMeta,"timeout",v,performance.now()-B)});let K=performance.now()-B;throw i({type:"step_error",workflowId:r,stepId:H,stepKey:C,name:a,description:U,ts:Date.now(),durationMs:K,error:p,...s&&{metadata:s},diagnostics:we(p,c.errorMeta,"timeout",v,K)}),O&&i({type:"step_complete",workflowId:r,stepKey:O,name:a,description:U,ts:Date.now(),durationMs:K,result:L(p,{cause:p}),meta:{origin:"throw",thrown:p},...s&&{metadata:s}}),o?.(p,a,R),X(p,{origin:"throw",thrown:p})}if(v<_.attempts&&_.shouldRetry(p,v)){let N=Qe(v,_);i({type:"step_retry",workflowId:r,stepId:H,stepKey:C,name:a,ts:Date.now(),attempt:v+1,maxAttempts:_.attempts,delayMs:N,error:p,...s&&{metadata:s},diagnostics:we(p,c.errorMeta,"throw",v,performance.now()-B)}),_.onRetry(p,v,N),await Ge(N);continue}_.attempts>1&&!yt(p)&&i({type:"step_retries_exhausted",workflowId:r,stepId:H,stepKey:C,name:a,ts:Date.now(),durationMs:performance.now()-B,attempts:v,lastError:p,...s&&{metadata:s},diagnostics:we(p,c.errorMeta,"throw",v,performance.now()-B)});let I=performance.now()-B,D;try{D=w(p)}catch(N){throw De(N)}throw i({type:"step_error",workflowId:r,stepId:H,stepKey:C,name:a,description:U,ts:Date.now(),durationMs:I,error:D,...s&&{metadata:s},diagnostics:we(p,c.errorMeta,"throw",v,I)}),O&&i({type:"step_complete",workflowId:r,stepKey:O,name:a,description:U,ts:Date.now(),durationMs:I,result:L(D,{cause:p}),meta:{origin:"throw",thrown:p},...s&&{metadata:s}}),o?.(D,a,R),X(D,{origin:"throw",thrown:p})}}let m=ye,f=performance.now()-B,Q=pe(m.error,{origin:"result",resultCause:m.cause});throw i({type:"step_error",workflowId:r,stepId:H,stepKey:C,name:a,description:U,ts:Date.now(),durationMs:f,error:Q,...s&&{metadata:s},diagnostics:we(m.error,c.errorMeta,"result",_.attempts,f)}),O&&i({type:"step_complete",workflowId:r,stepKey:O,name:a,description:U,ts:Date.now(),durationMs:f,result:m,meta:{origin:"result",resultCause:m.cause},...s&&{metadata:s}}),o?.(Q,a,R),X(Q,{origin:"result",resultCause:m.cause})})();h.try=(y,P,u)=>{if(typeof y!="string"||y.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 c="error"in u?()=>u.error:u.onError;if(u.retry||u.timeout)return h.retry(y,async()=>{try{return te(await P())}catch(U){return L(c(U),{cause:U})}},{attempts:u.retry?.attempts??1,...u.retry??{},key:u.key,timeout:u.timeout});let s=u.key??y,a=y,C=y,O=E;return(async()=>{let U=O?performance.now():0;E&&i({type:"step_start",workflowId:r,stepId:C,stepKey:s,name:a,ts:Date.now()});try{let W=await P(),j=performance.now()-U;return i({type:"step_success",workflowId:r,stepId:C,stepKey:s,name:a,ts:Date.now(),durationMs:j}),s&&i({type:"step_complete",workflowId:r,stepKey:s,name:a,ts:Date.now(),durationMs:j,result:te(W)}),W}catch(W){let j=c(W),H=performance.now()-U,ne=pe(j,{origin:"throw",thrown:W});throw i({type:"step_error",workflowId:r,stepId:C,stepKey:s,name:a,ts:Date.now(),durationMs:H,error:ne}),s&&i({type:"step_complete",workflowId:r,stepKey:s,name:a,ts:Date.now(),durationMs:H,result:L(j,{cause:W}),meta:{origin:"throw",thrown:W}}),o?.(ne,a,R),X(ne,{origin:"throw",thrown:W})}})()},h.fromResult=(y,P,u)=>{if(typeof y!="string"||y.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 c=u.key??y,s=y,a=y,C="error"in u?()=>u.error:u.onError,O=E;return(async()=>{let U=O?performance.now():0;E&&i({type:"step_start",workflowId:r,stepId:a,stepKey:c,name:s,ts:Date.now()});let W=await P();if(W.ok){let j=performance.now()-U;return i({type:"step_success",workflowId:r,stepId:a,stepKey:c,name:s,ts:Date.now(),durationMs:j}),c&&i({type:"step_complete",workflowId:r,stepKey:c,name:s,ts:Date.now(),durationMs:j,result:te(W.value)}),W.value}else{let j=C(W.error),H=performance.now()-U,ne=pe(j,{origin:"result",resultCause:W.error});throw i({type:"step_error",workflowId:r,stepId:a,stepKey:c,name:s,ts:Date.now(),durationMs:H,error:ne}),c&&i({type:"step_complete",workflowId:r,stepKey:c,name:s,ts:Date.now(),durationMs:H,result:L(j,{cause:W.error}),meta:{origin:"result",resultCause:W.error}}),o?.(ne,s,R),X(ne,{origin:"result",resultCause:W.error})}})()},h.fromNullable=(y,P,u,c)=>{if(typeof y!="string"||y.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 h(y,async()=>{let s=await P();return s!=null?te(s):L(u())},c)},h.retry=(y,P,u)=>{if(typeof y!="string"||y.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 h(y,P,{key:u.key??y,retry:{attempts:u.attempts,backoff:u.backoff,initialDelay:u.initialDelay,maxDelay:u.maxDelay,jitter:u.jitter,shouldRetry:u.shouldRetry,onRetry:u.onRetry},timeout:u.timeout})},h.withTimeout=(y,P,u)=>{if(typeof y!="string"||y.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 h(y,P,{key:u.key??y,timeout:u})},h.sleep=(y,P,u)=>{if(typeof y!="string"||y.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 P=="string"?Ut(P):P;if(!c)throw new Error(`step.sleep: invalid duration '${P}'`);let s=c.millis,a=u?.signal;return h(y,async()=>{if(g?.aborted||a?.aborted){let C=new Error("Sleep aborted");throw C.name="AbortError",C}return new Promise((C,O)=>{let U={timeoutId:void 0},W=()=>{U.timeoutId&&clearTimeout(U.timeoutId);let j=new Error("Sleep aborted");j.name="AbortError",O(j)};g?.addEventListener("abort",W,{once:!0}),a?.addEventListener("abort",W,{once:!0}),U.timeoutId=setTimeout(()=>{g?.removeEventListener("abort",W),a?.removeEventListener("abort",W),C(te(void 0))},s)})},{key:u?.key??y,description:u?.description})},h.all=((...y)=>{if(typeof y[0]!="string")throw new TypeError("step.all(name, ...): first argument must be a string (step name). Example: step.all('Fetch data', { user: () => fetchUser(), posts: () => fetchPosts() })");let P=y[0],u=y[1];if(typeof u=="function")return fe(P,u);if(u&&typeof u=="object"&&!Array.isArray(u)){let s=le(u);return Re(s,{name:P})}throw new TypeError("step.all(name, ...): second argument must be a function (array form) or an object of operations (object form).")}),h.race=(y,P)=>{let u=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let c=performance.now(),s=!1,a={scopeId:u,type:"race",winnerId:void 0};A.push(a);let C=()=>{if(s)return;s=!0;let O=A.findIndex(U=>U.scopeId===u);O!==-1&&A.splice(O,1),i({type:"scope_end",workflowId:r,scopeId:u,ts:Date.now(),durationMs:performance.now()-c,winnerId:a.winnerId})};i({type:"scope_start",workflowId:r,scopeId:u,scopeType:"race",name:y,ts:Date.now()});try{let O=await P();if(C(),!O.ok)throw o?.(O.error,y,R),X(O.error,{origin:"result",resultCause:O.cause});return O.value}catch(O){throw C(),O}})()},h.if=(y,P,u)=>u(),h.label=h.if,h.branch=async(y,P)=>{let{condition:u,then:c,else:s}=P;if(u())return await c();if(s)return await s()},h.arm=(y,P)=>({fn:y,errors:P}),h.forEach=async(y,P,u)=>{let c=[],s=u.maxIterations,a=0,C="run"in u,O=Symbol.asyncIterator in P?P:(async function*(){yield*P})();for await(let U of O){if(s!==void 0&&a>=s)break;let W;C?W=await u.run(U,a):W=await u.item.handler(U,a,h),c.push(W),a++}return c},h.item=y=>({__forEachItemHandler:!0,handler:y}),h.dep=(y,P)=>P,h.workflow=(y,P,u)=>h(y,P,u),h.map=async(y,P,u,c)=>{let s=c?.concurrency??P.length;return h(y,()=>s>=P.length?kt(P.map((a,C)=>u(a,C))):(async()=>{let a=[];for(let C=0;C<P.length;C+=s){let O=P.slice(C,C+s),U=await kt(O.map((W,j)=>u(W,C+j)));if(!U.ok)return U;a.push(...U.value)}return te(a)})(),{key:c?.key})},h.withFallback=(y,P,u)=>{if(typeof y!="string"||y.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 c=u.key??y,s=y,a=G(c),C=E;return(async()=>{let O=C?performance.now():0;E&&i({type:"step_start",workflowId:r,stepId:a,stepKey:c,name:s,ts:Date.now()});let U;try{U=await P()}catch(B){if(de(B))throw i({type:"step_aborted",workflowId:r,stepId:a,stepKey:c,name:s,ts:Date.now(),durationMs:performance.now()-O}),B;let Y;try{Y=w(B)}catch(J){throw De(J)}if(u.on!==void 0&&u.on!==Y){let J=performance.now()-O;throw i({type:"step_error",workflowId:r,stepId:a,stepKey:c,name:s,ts:Date.now(),durationMs:J,error:Y}),c&&i({type:"step_complete",workflowId:r,stepKey:c,name:s,ts:Date.now(),durationMs:J,result:L(Y,{cause:B}),meta:{origin:"throw",thrown:B}}),o?.(Y,s,R),X(Y,{origin:"throw",thrown:B})}let V;try{V=await u.fallback()}catch(J){if(de(J))throw i({type:"step_aborted",workflowId:r,stepId:a,stepKey:c,name:s,ts:Date.now(),durationMs:performance.now()-O}),J;let _;try{_=w(J)}catch(m){throw De(m)}let ye=performance.now()-O;throw i({type:"step_error",workflowId:r,stepId:a,stepKey:c,name:s,ts:Date.now(),durationMs:ye,error:_}),c&&i({type:"step_complete",workflowId:r,stepKey:c,name:s,ts:Date.now(),durationMs:ye,result:L(_,{cause:J}),meta:{origin:"throw",thrown:J}}),o?.(_,s,R),X(_,{origin:"throw",thrown:J})}if(V.ok){let J=performance.now()-O;return i({type:"step_success",workflowId:r,stepId:a,stepKey:c,name:s,ts:Date.now(),durationMs:J}),c&&i({type:"step_complete",workflowId:r,stepKey:c,name:s,ts:Date.now(),durationMs:J,result:V,meta:{origin:"fallback",fallbackUsed:!0,fallbackReason:String(Y)}}),V.value}else{let J=performance.now()-O,_=pe(V.error,{origin:"result",resultCause:V.cause});throw i({type:"step_error",workflowId:r,stepId:a,stepKey:c,name:s,ts:Date.now(),durationMs:J,error:_}),c&&i({type:"step_complete",workflowId:r,stepKey:c,name:s,ts:Date.now(),durationMs:J,result:V,meta:{origin:"result",resultCause:V.cause}}),o?.(_,s,R),X(_,{origin:"result",resultCause:V.cause})}}if(U.ok){let B=performance.now()-O;return i({type:"step_success",workflowId:r,stepId:a,stepKey:c,name:s,ts:Date.now(),durationMs:B}),c&&i({type:"step_complete",workflowId:r,stepKey:c,name:s,ts:Date.now(),durationMs:B,result:U}),U.value}let W=U.error;if(u.on!==void 0&&u.on!==W){let B=performance.now()-O,Y=pe(W,{origin:"result",resultCause:U.cause});throw i({type:"step_error",workflowId:r,stepId:a,stepKey:c,name:s,ts:Date.now(),durationMs:B,error:Y}),c&&i({type:"step_complete",workflowId:r,stepKey:c,name:s,ts:Date.now(),durationMs:B,result:U,meta:{origin:"result",resultCause:U.cause}}),o?.(Y,s,R),X(Y,{origin:"result",resultCause:U.cause})}let j;try{j=await u.fallback()}catch(B){if(de(B))throw i({type:"step_aborted",workflowId:r,stepId:a,stepKey:c,name:s,ts:Date.now(),durationMs:performance.now()-O}),B;let Y;try{Y=w(B)}catch(J){throw De(J)}let V=performance.now()-O;throw i({type:"step_error",workflowId:r,stepId:a,stepKey:c,name:s,ts:Date.now(),durationMs:V,error:Y}),c&&i({type:"step_complete",workflowId:r,stepKey:c,name:s,ts:Date.now(),durationMs:V,result:L(Y,{cause:B}),meta:{origin:"throw",thrown:B}}),o?.(Y,s,R),X(Y,{origin:"throw",thrown:B})}if(j.ok){let B=performance.now()-O;return i({type:"step_success",workflowId:r,stepId:a,stepKey:c,name:s,ts:Date.now(),durationMs:B}),c&&i({type:"step_complete",workflowId:r,stepKey:c,name:s,ts:Date.now(),durationMs:B,result:j,meta:{origin:"fallback",fallbackUsed:!0,fallbackReason:String(W)}}),j.value}let H=performance.now()-O,ne=pe(j.error,{origin:"result",resultCause:j.cause});throw i({type:"step_error",workflowId:r,stepId:a,stepKey:c,name:s,ts:Date.now(),durationMs:H,error:ne}),c&&i({type:"step_complete",workflowId:r,stepKey:c,name:s,ts:Date.now(),durationMs:H,result:j,meta:{origin:"result",resultCause:j.cause}}),o?.(ne,s,R),X(ne,{origin:"result",resultCause:j.cause})})()},h.withResource=(y,P)=>{if(typeof y!="string"||y.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 u=y,c=y,s=G(u),a=E;return(async()=>{let C=a?performance.now():0;E&&i({type:"step_start",workflowId:r,stepId:s,stepKey:u,name:c,ts:Date.now()});let O;try{O=await P.acquire()}catch(V){if(de(V))throw i({type:"step_aborted",workflowId:r,stepId:s,stepKey:u,name:c,ts:Date.now(),durationMs:performance.now()-C}),V;let J;try{J=w(V)}catch(ye){throw De(ye)}let _=performance.now()-C;throw i({type:"step_error",workflowId:r,stepId:s,stepKey:u,name:c,ts:Date.now(),durationMs:_,error:J}),u&&i({type:"step_complete",workflowId:r,stepKey:u,name:c,ts:Date.now(),durationMs:_,result:L(J,{cause:V}),meta:{origin:"throw",thrown:V}}),o?.(J,c,R),X(J,{origin:"throw",thrown:V})}if(!O.ok){let V=performance.now()-C,J=pe(O.error,{origin:"result",resultCause:O.cause});throw i({type:"step_error",workflowId:r,stepId:s,stepKey:u,name:c,ts:Date.now(),durationMs:V,error:J}),u&&i({type:"step_complete",workflowId:r,stepKey:u,name:c,ts:Date.now(),durationMs:V,result:O,meta:{origin:"result",resultCause:O.cause}}),o?.(J,c,R),X(J,{origin:"result",resultCause:O.cause})}let U=O.value,W,j,H=!1;try{W=await P.use(U)}catch(V){if(de(V)){try{await P.release(U)}catch(J){console.warn(`[awaitly] step.withResource("${y}"): release threw after earlyExit:`,J)}throw V}j=V,H=!0}try{await P.release(U)}catch(V){console.warn(`[awaitly] step.withResource("${y}"): release threw:`,V)}if(H){let V;try{V=w(j)}catch(_){throw De(_)}let J=performance.now()-C;throw i({type:"step_error",workflowId:r,stepId:s,stepKey:u,name:c,ts:Date.now(),durationMs:J,error:V}),u&&i({type:"step_complete",workflowId:r,stepKey:u,name:c,ts:Date.now(),durationMs:J,result:L(V,{cause:j}),meta:{origin:"throw",thrown:j}}),o?.(V,c,R),X(V,{origin:"throw",thrown:j})}let ne=W;if(ne.ok){let V=performance.now()-C;return i({type:"step_success",workflowId:r,stepId:s,stepKey:u,name:c,ts:Date.now(),durationMs:V}),u&&i({type:"step_complete",workflowId:r,stepKey:u,name:c,ts:Date.now(),durationMs:V,result:ne}),ne.value}let B=performance.now()-C,Y=pe(ne.error,{origin:"result",resultCause:ne.cause});throw i({type:"step_error",workflowId:r,stepId:s,stepKey:u,name:c,ts:Date.now(),durationMs:B,error:Y}),u&&i({type:"step_complete",workflowId:r,stepKey:u,name:c,ts:Date.now(),durationMs:B,result:ne,meta:{origin:"result",resultCause:ne.cause}}),o?.(Y,c,R),X(Y,{origin:"result",resultCause:ne.cause})})()};let z=await d({step:h});if(process.env.NODE_ENV!=="production"&&z!==null&&typeof z=="object"&&"ok"in z&&typeof z.ok=="boolean"){let y=z;(y.ok===!0&&"value"in y||y.ok===!1&&"error"in y)&&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 te(z)}catch(h){if(Ft(h))throw h.thrown;if(de(h)){let fe=h.meta.origin==="throw"?h.meta.thrown:h.meta.origin==="result"?h.meta.resultCause:void 0;return L(h.error,{cause:fe})}let le=w(h);return o?.(le,"unexpected",R),L(le,{cause:h})}}Be.strict=(e,t)=>Be(e,t);async function kt(e){return e.length===0?te([]):new Promise(t=>{let n=!1,d=e.length,l=new Array(e.length);for(let o=0;o<e.length;o++){let E=o;Promise.resolve(e[E]).catch(b=>L({type:"PROMISE_REJECTED",cause:b},{cause:{type:"PROMISE_REJECTION",reason:b}})).then(b=>{if(!n){if(!b.ok){n=!0,t(b);return}l[E]=b.value,d--,d===0&&t(te(l))}})}})}var Ve=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 Bt(e){return typeof e=="object"&&e!==null&&e.type==="CIRCUIT_OPEN"}var Vt={failureThreshold:5,resetTimeout:3e4,windowSize:6e4,halfOpenMax:3};function $t(e,t){let n={...Vt,...t},d="CLOSED",l=[],o=null,E=null,b=0,M=0;function k(){let $=Date.now();l=l.filter(G=>$-G.timestamp<n.windowSize)}function R($){if(d!==$){let G=d;d=$,$==="HALF_OPEN"&&(M=0),n.onStateChange?.(G,$,e)}}function g(){return d!=="OPEN"||o===null?!1:Date.now()-o>=n.resetTimeout?(R("HALF_OPEN"),!0):!1}function r(){E=Date.now(),b++,d==="HALF_OPEN"&&(M++,M>=n.halfOpenMax&&(R("CLOSED"),l=[]))}function w($){let G=Date.now();o=G,k(),l.push({timestamp:G,error:$}),(d==="HALF_OPEN"||d==="CLOSED"&&l.length>=n.failureThreshold)&&R("OPEN")}function A(){if(d==="CLOSED")return 0;if(d==="OPEN"){if(g())return 0;let $=Date.now(),G=o?$-o:0;return Math.max(0,n.resetTimeout-G)}return 0}return{async execute($,G){let i=A();if(i>0)throw new Ve({circuitName:e,state:d,retryAfterMs:i});try{let X=await $();return r(),X}catch(X){throw w(X),X}},async executeResult($,G){let i=A();if(i>0)return L(new Ve({circuitName:e,state:d,retryAfterMs:i}));try{let X=await $();return X.ok?r():w(X.error),X}catch(X){throw w(X),X}},getState(){return d==="OPEN"&&g(),d},getStats(){return k(),{state:this.getState(),failureCount:l.length,successCount:b,lastFailureTime:o,lastSuccessTime:E,halfOpenSuccesses:M}},reset(){R("CLOSED"),l=[],M=0},forceOpen(){o=Date.now(),R("OPEN")},recordSuccess(){r()},recordFailure($){w($??new Error("Manual failure"))}}}var Ht={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 qt(e){return typeof e=="object"&&e!==null&&e.type==="RATE_LIMIT_EXCEEDED"}function xt(e){return typeof e=="object"&&e!==null&&e.type==="QUEUE_FULL"}function Ct(e,t){let{maxPerSecond:n,strategy:d="wait"}=t,l=t.burstCapacity??n*2,o=l,E=Date.now(),b=n/1e3,M=[];function k(){let r=Date.now(),A=(r-E)*b;o=Math.min(l,o+A),E=r}function R(){if(k(),o>=1)return o-=1,0;let r=1-o;return Math.ceil(r/b)}async function g(){return new Promise(r=>{let w=()=>{let A=R();A===0?r():(M.push(w),setTimeout(()=>{let $=M.indexOf(w);$!==-1&&(M.splice($,1),w())},A))};w()})}return{async execute(r){let w=R();if(w>0){if(d==="reject")throw{type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:w};await g()}return r()},async executeResult(r){let w=R();if(w>0){if(d==="reject")return L({type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:w});await g()}return r()},getStats(){return k(),{availableTokens:Math.floor(o),maxTokens:l,tokensPerSecond:n,waitingCount:M.length}},reset(){o=l,E=Date.now(),M.length=0}}}function ht(e,t){let{maxConcurrent:n,strategy:d="queue",maxQueueSize:l=1/0}=t,o=0,E=[];async function b(){if(o<n){o++;return}if(d==="reject")throw{type:"QUEUE_FULL",limiterName:e,queueSize:E.length,maxQueueSize:l};if(E.length>=l)throw{type:"QUEUE_FULL",limiterName:e,queueSize:E.length,maxQueueSize:l};return new Promise((k,R)=>{E.push({resolve:k,reject:R})})}function M(){o--,E.length>0&&o<n&&(o++,E.shift()?.resolve())}return{async execute(k){await b();try{return await k()}finally{M()}},async executeAll(k){let R=new Array(k.length),g=[];for(let r=0;r<k.length;r++){let w=r,A=this.execute(k[w]).then($=>{R[w]=$});g.push(A)}return await Promise.all(g),R},async executeResult(k){try{await b()}catch(R){if(xt(R))return L(R);throw R}try{return await k()}finally{M()}},getStats(){return{activeCount:o,maxConcurrent:n,queueSize:E.length,maxQueueSize:l}},reset(){for(o=0;E.length>0;)E.shift()?.reject(new Error("Limiter reset"))}}}function zt(e,t){let n=t.rate?Ct(`${e}-rate`,t.rate):void 0,d=t.concurrency?ht(`${e}-concurrency`,t.concurrency):void 0;return{rate:n,concurrency:d,async execute(l){let o=l;if(n){let E=o;o=()=>n.execute(E)}return d?d.execute(o):o()}}}function Jt(e,t){let{limit:n,windowMs:d=1e3,strategy:l="wait"}=t,o=Date.now(),E=0,b=[];function M(){let g=Date.now(),r=g-o;return r>=d?(o=g,E=0,0):d-r}function k(g){let r=M();return E+g<=n?(E+=g,0):r}async function R(g){return new Promise(r=>{let w=()=>{let A=k(g);A===0?r():(b.push({resolve:w,cost:g}),setTimeout(()=>{let $=b.findIndex(G=>G.resolve===w);$!==-1&&(b.splice($,1),w())},A))};w()})}return{async execute(g,r=1){if(r>n)throw{type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:d};let w=k(r);if(w>0){if(l==="reject")throw{type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:w};await R(r)}return g()},async executeResult(g,r=1){if(r>n)return L({type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:d});let w=k(r);if(w>0){if(l==="reject")return L({type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:w});await R(r)}return g()},getStats(){let g=M();return{requestCount:E,limit:n,windowMs:d,remainingMs:g,waitingCount:b.length}},reset(){o=Date.now(),E=0,b.length=0}}}function Yt(e,t){let{tokensPerSecond:n,strategy:d="wait"}=t,l=t.maxTokens??n*2,o=l,E=Date.now(),b=n/1e3,M=[];function k(){let r=Date.now(),A=(r-E)*b;o=Math.min(l,o+A),E=r}function R(r){if(k(),o>=r)return o-=r,0;let w=r-o;return Math.ceil(w/b)}async function g(r){return new Promise(w=>{let A=()=>{let $=R(r);$===0?w():(M.push({check:A,cost:r}),setTimeout(()=>{let G=M.findIndex(i=>i.check===A);G!==-1&&(M.splice(G,1),A())},$))};A()})}return{async execute(r,w=1){if(w>l)throw{type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:Math.ceil(w/b)};let A=R(w);if(A>0){if(d==="reject")throw{type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:A};await g(w)}return r()},async executeResult(r,w=1){if(w>l)return L({type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:Math.ceil(w/b)});let A=R(w);if(A>0){if(d==="reject")return L({type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:A});await g(w)}return r()},getStats(){return k(),{availableTokens:o,maxTokens:l,tokensPerSecond:n,waitingCount:M.length}},reset(){o=l,E=Date.now(),M.length=0}}}var Qt={api:{maxPerSecond:10,burstCapacity:20,strategy:"wait"},database:{maxConcurrent:10,strategy:"queue",maxQueueSize:100},external:{maxPerSecond:5,burstCapacity:10,strategy:"wait"}};var Gt="STREAM_WRITE_ERROR",Xt="STREAM_READ_ERROR",Zt="STREAM_CLOSE_ERROR";var er="STREAM_ENDED";function ze(e,t,n){return{type:Gt,reason:e,message:t,...n!==void 0?{cause:n}:{}}}function Ze(e,t,n){return{type:Xt,reason:e,message:t,...n!==void 0?{cause:n}:{}}}function et(e,t,n){return{type:Zt,reason:e,message:t,...n!==void 0?{cause:n}:{}}}function Je(e){return{type:er,finalPosition:e}}function St(e={}){let t=e.highWaterMark??16,n=e.lowWaterMark??Math.floor(t/2),d=e.onStateChange,l="flowing",o=0,E=[];function b(k){if(l!==k&&(l=k,d?.(k),k==="flowing"&&E.length>0)){let R=E;E=[];for(let g of R)g()}}function M(){l==="flowing"&&o>=t?b("paused"):l==="paused"&&o<=n&&b("flowing")}return{get state(){return l},get bufferedCount(){return o},get highWaterMark(){return t},get lowWaterMark(){return n},increment(){o++,M()},decrement(){o>0&&(o--,M())},setCount(k){o=Math.max(0,k),M()},waitForDrain(){return l==="flowing"?Promise.resolve():new Promise(k=>{E.push(k)})},reset(){o=0,E=[],b("flowing")}}}function tr(e){return{_tag:"Duration",millis:e}}function rr(e){return{_tag:"Duration",millis:e*1e3}}function nr(e){return{_tag:"Duration",millis:e*60*1e3}}function or(e){return{_tag:"Duration",millis:e*60*60*1e3}}function sr(e){return{_tag:"Duration",millis:e*24*60*60*1e3}}function bt(e){return e.millis}function At(e){let t=e.trim().match(/^(\d+(?:\.\d+)?)\s*(ms|s|m|h|d)$/i);if(!t)return;let n=parseFloat(t[1]);switch(t[2].toLowerCase()){case"ms":return tr(n);case"s":return rr(n);case"m":return nr(n);case"h":return or(n);case"d":return sr(n);default:return}}function vt(e){return e.type==="step_complete"}function tt(e){return typeof e=="object"&&e!==null&&e.type==="WORKFLOW_CANCELLED"}function Pt(){let e=new Map;return{handleEvent:t=>{vt(t)&&e.set(t.stepKey,{result:t.result,meta:t.meta})},getResumeState:()=>({steps:new Map(e)}),clear:()=>e.clear()}}function ar(e){return typeof e=="object"&&e!==null&&e.__cachedMeta===!0}function ve(e,t,n){return L(e,{cause:{__cachedMeta:!0,originalCause:n,meta:t}})}function $e(e){return ar(e)?e.meta:{origin:"result",resultCause:e}}async function Ot(e,t){let n=e["~standard"].validate(t),d=n instanceof Promise?await n:n;return d.issues?L({type:"INPUT_VALIDATION_ERROR",issues:d.issues.map(l=>({message:l.message,path:l.path?.map(o=>typeof o=="object"?o.key:o)})),message:`Input validation failed: ${d.issues.map(l=>l.message).join(", ")}`}):te(d.value)}function rt(e,t){let n=d=>((...l)=>{let o=l.at(-1),E=l.length>0&&typeof o=="object"&&o!==null&&!Array.isArray(o)&&typeof o!="function",b=E?o:void 0,M=E?l.slice(0,-1):l,k={...t,...b?.deps??{}},R=b?{...b,deps:k}:{deps:k};return e[d](...M,R)});return{run:n("run"),runWithState:n("runWithState"),withDeps(d){return rt(e,{...t,...d})}}}var Ye=class extends Error{constructor(n,d,l){super(n);this.stepId=d;this.originalError=l;this.name="SnapshotDecodeError"}stepId;originalError};function nt(e){if(e.type==="error"){let t=new Error(e.message);return t.name=e.name,e.stack&&(t.stack=e.stack),e.cause&&(t.cause=nt(e.cause)),t}return e.value!==void 0?e.value:e.stringRepresentation}function _t(e,t,n){if(typeof e!="string"||e.length===0)throw new TypeError("createWorkflow(workflowName, deps, options?): first argument must be a non-empty string. Example: createWorkflow('checkout', { chargeCard, sendEmail })");let d=t??{},l=n;async function o(k,R,g){let r=k??crypto.randomUUID(),w=g?.deps?{...d,...g.deps}:d,A=[],$=g?.createContext??l?.createContext,G=$?await $():void 0,i=g?.signal??l?.signal,X=g?.onEvent??l?.onEvent,de=g?.onError??l?.onError,pe=g?.shouldRun??l?.shouldRun,Te=g?.onBeforeStart??l?.onBeforeStart,Pe=g?.onAfterStep??l?.onAfterStep,Oe=g?.resumeState??l?.resumeState,Se=l?.catchUnexpected??qe,h={},le=(g?.devWarnings??l?.devWarnings)===!0&&process.env.NODE_ENV!=="production",fe=new Set,Re=new Set,be={workflowId:r,onEvent:X,context:G!==void 0?G:void 0,signal:i,input:{},ref:m=>h[m],set:(m,f)=>{le&&!fe.has(m)&&(fe.add(m),console.warn(`awaitly: ctx.set('${m}', ...) is deprecated for static analysis. Use step('id', fn, { out: '${m}' }) instead.`)),h[m]=f},get:m=>(le&&!Re.has(m)&&(Re.add(m),console.warn(`awaitly: ctx.get('${m}') is deprecated for static analysis. Use ctx.ref('${m}') instead for tracked dependencies.`)),h[m])},z=m=>{let f=m.context!==void 0||G===void 0?m:{...m,context:G},Q=f.workflowName===void 0?{...f,workflowName:e}:f;X?.(Q,G)},y=(m,f)=>{let Q={type:"WORKFLOW_CANCELLED",reason:m,lastStepKey:f};return L(Se(Q),{cause:Q})};if(i?.aborted){let m=typeof i.reason=="string"?i.reason:i.reason instanceof Error?i.reason.message:void 0;return z({type:"workflow_cancelled",workflowId:r,ts:Date.now(),durationMs:0,reason:m}),y(m)}if(pe){let m=performance.now();try{let f=await pe(r,G),Q=performance.now()-m;if(z({type:"hook_should_run",workflowId:r,ts:Date.now(),durationMs:Q,result:f,skipped:!f}),!f){let v=new Error("Workflow skipped by shouldRun hook");return L(Se(v),{cause:v})}}catch(f){let Q=performance.now()-m;return z({type:"hook_should_run_error",workflowId:r,ts:Date.now(),durationMs:Q,error:f}),L(Se(f),{cause:f})}}if(Te){let m=performance.now();try{let f=await Te(r,G),Q=performance.now()-m;if(z({type:"hook_before_start",workflowId:r,ts:Date.now(),durationMs:Q,result:f,skipped:!f}),!f){let v=new Error("Workflow skipped by onBeforeStart hook");return L(Se(v),{cause:v})}}catch(f){let Q=performance.now()-m;return z({type:"hook_before_start_error",workflowId:r,ts:Date.now(),durationMs:Q,error:f}),L(Se(f),{cause:f})}}let P=l?.inputSchema,u=l?.input;if(P){let m=await Ot(P,u);if(!m.ok)return L(m.error);be.input=m.value}else u!==void 0&&(be.input=u);let c=Date.now(),s=performance.now();z({type:"workflow_start",workflowId:r,ts:c});let a=g?.cache??l?.cache,C=g?.streamStore??l?.streamStore;if(Oe&&!a&&(a=new Map),Oe&&a){let m=typeof Oe=="function"?await Oe():Oe;m.steps instanceof Map||(console.warn(`awaitly: resumeState.steps is not a Map (got ${typeof m.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 m.steps=="object"&&m.steps!==null&&(m.steps=new Map(Object.entries(m.steps))));for(let[f,Q]of m.steps){let{result:v,meta:x}=Q;if(v.ok)a.set(f,v);else{let p=x??{origin:"result",resultCause:v.cause};a.set(f,ve(v.error,p,v.cause))}}}let O=g?.snapshot??l?.snapshot,U=l?.serialization;if(O&&!Oe){a||(a=new Map);let m=O,f=U?.decode;for(let[Q,v]of Object.entries(m.steps))if(Object.prototype.hasOwnProperty.call(m.steps,Q))try{if(v.ok){let x=f?f(v.value):v.value;a.set(Q,te(x))}else{let x=f?f(v.error):v.error,p=nt(v.cause),S=v.meta?.origin==="throw"?{origin:"throw",thrown:p}:{origin:"result",resultCause:p};a.set(Q,ve(x,S,p))}}catch(x){throw new Ye(`Failed to decode step "${Q}": ${x instanceof Error?x.message:String(x)}`,Q,x instanceof Error?x:void 0)}}let W=!1,j,H,ne=()=>{W=!0,j=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 B=()=>{if(W||i?.aborted)throw{type:"WORKFLOW_CANCELLED",reason:j??(typeof i?.reason=="string"?i.reason:i?.reason instanceof Error?i.reason.message:void 0),lastStepKey:H}},Y=async(m,f,Q)=>{if(!Pe)return;let v=performance.now();try{await Pe(m,f,r,G);let x=performance.now()-v;z({type:"hook_after_step",workflowId:r,stepKey:m,ts:Date.now(),durationMs:x})}catch(x){let p=performance.now()-v;throw z({type:"hook_after_step_error",workflowId:r,stepKey:m,ts:Date.now(),durationMs:p,error:x}),x}},V=m=>{let f=async(x,p,S)=>{if(typeof x!="string")throw new Error('[awaitly] step() requires a string ID as the first argument. Example: step("fetchUser", () => fetchUser(id))');let I=x,D=S??{},N=I,T=Object.prototype.hasOwnProperty.call(D,"key")?D.key:I,{ttl:K,out:Z}=D;B();let re=Xe(D);if(T&&a&&a.has(T)){z({type:"step_cache_hit",workflowId:r,stepKey:T,name:N,ts:Date.now(),...re&&{metadata:re}});let F=a.get(T);if(F.ok)return H=T,Z&&(h[Z]=F.value),F.value;let q=$e(F.cause);throw he(F.error,q)}T&&a&&z({type:"step_cache_miss",workflowId:r,stepKey:T,name:N,ts:Date.now(),...re&&{metadata:re}});try{let F=await m(I,p,D);return Z&&(h[Z]=F),D.compensate&&A.push({stepName:N,value:F,compensate:D.compensate}),T&&(H=T,a&&a.set(T,te(F),K?{ttl:K}:void 0),await Y(T,te(F))),F}catch(F){if(T&&xe(F)){let q=F,ae=q.meta.origin==="result"?q.meta.resultCause:q.meta.origin==="throw"?q.meta.thrown:void 0,ee=ve(q.error,q.meta,ae);a&&a.set(T,ee,K?{ttl:K}:void 0),await Y(T,ee,q.meta)}throw F}};f.try=async(x,p,S)=>{let{ttl:I}=S,D=S.key??x,N=x;if(a&&a.has(D)){z({type:"step_cache_hit",workflowId:r,stepKey:D,name:N,ts:Date.now()});let T=a.get(D);if(T.ok)return T.value;let K=$e(T.cause);throw he(T.error,K)}a&&z({type:"step_cache_miss",workflowId:r,stepKey:D,name:N,ts:Date.now()});try{let T=await m.try(x,p,{...S,key:D});return S.compensate&&A.push({stepName:N,value:T,compensate:S.compensate}),a&&a.set(D,te(T),I?{ttl:I}:void 0),await Y(D,te(T)),T}catch(T){if(xe(T)){let K=T,Z=K.meta.origin==="result"?K.meta.resultCause:K.meta.origin==="throw"?K.meta.thrown:void 0,re=ve(K.error,K.meta,Z);a&&a.set(D,re,I?{ttl:I}:void 0),await Y(D,re,K.meta)}throw T}},f.fromResult=async(x,p,S)=>{let{ttl:I}=S,D=S.key??x,N=x;if(a&&a.has(D)){z({type:"step_cache_hit",workflowId:r,stepKey:D,name:N,ts:Date.now()});let T=a.get(D);if(T.ok)return T.value;let K=$e(T.cause);throw he(T.error,K)}a&&z({type:"step_cache_miss",workflowId:r,stepKey:D,name:N,ts:Date.now()});try{let T=await m.fromResult(x,p,{...S,key:D});return a&&a.set(D,te(T),I?{ttl:I}:void 0),await Y(D,te(T)),T}catch(T){if(xe(T)){let K=T,Z=K.meta.origin==="result"?K.meta.resultCause:K.meta.origin==="throw"?K.meta.thrown:void 0,re=ve(K.error,K.meta,Z);a&&a.set(D,re,I?{ttl:I}:void 0),await Y(D,re,K.meta)}throw T}},f.race=m.race,f.withFallback=async(x,p,S)=>{let I=S.key??x,D=x;if(a&&a.has(I)){z({type:"step_cache_hit",workflowId:r,stepKey:I,name:D,ts:Date.now()});let N=a.get(I);if(N.ok)return N.value;let T=$e(N.cause);throw he(N.error,T)}a&&z({type:"step_cache_miss",workflowId:r,stepKey:I,name:D,ts:Date.now()});try{let N=await m.withFallback(x,p,S);return a&&a.set(I,te(N)),await Y(I,te(N)),N}catch(N){if(xe(N)){let T=N,K=T.meta.origin==="result"?T.meta.resultCause:T.meta.origin==="throw"?T.meta.thrown:void 0,Z=ve(T.error,T.meta,K);a&&a.set(I,Z),await Y(I,Z,T.meta)}throw N}},f.withResource=async(x,p)=>{let S=x;try{let I=await m.withResource(x,p);return await Y(S,te(I)),I}catch(I){if(xe(I)){let D=I,N=D.meta.origin==="result"?D.meta.resultCause:D.meta.origin==="throw"?D.meta.thrown:void 0,T=ve(D.error,D.meta,N);await Y(S,T,D.meta)}throw I}},f.retry=(x,p,S)=>{let I={key:S.key,retry:{attempts:S.attempts,backoff:S.backoff,initialDelay:S.initialDelay,maxDelay:S.maxDelay,jitter:S.jitter,shouldRetry:S.shouldRetry,onRetry:S.onRetry},timeout:S.timeout,ttl:S.ttl};return f(x,p,I)},f.withTimeout=(x,p,S)=>{let I={key:S.key,timeout:S,ttl:S.ttl};return f(x,p,I)},f.sleep=(x,p,S)=>{if(typeof x!="string"||x.length===0)throw new Error('[awaitly] step.sleep() requires an explicit string ID as the first argument. Example: step.sleep("delay", "5s")');let I=typeof p=="string"?At(p):p;if(!I)throw new Error(`step.sleep: invalid duration '${p}'`);let D=bt(I),N=S?.signal;return f(x,async()=>{if(i?.aborted||N?.aborted){let K=new Error("Sleep aborted");throw K.name="AbortError",K}return new Promise((K,Z)=>{let re={timeoutId:void 0},F=()=>{re.timeoutId&&clearTimeout(re.timeoutId);let q=new Error("Sleep aborted");q.name="AbortError",Z(q)};i?.addEventListener("abort",F,{once:!0}),N?.addEventListener("abort",F,{once:!0}),re.timeoutId=setTimeout(()=>{i?.removeEventListener("abort",F),N?.removeEventListener("abort",F),K(te(void 0))},D)})},{key:S?.key,ttl:S?.ttl,description:S?.description})};let Q=new Map,v=new Map;return f.getWritable=x=>{let p=x?.namespace??"default",S=x?.highWaterMark??16;if(!C)throw new Error("streamStore is required to use getWritable(). Pass a streamStore to createWorkflow options.");let I=`${r}:${p}`,D=Q.get(I);if(D&&!D.closed&&!D.aborted)return D.writer;let N=St({highWaterMark:S,onStateChange:q=>{z({type:"stream_backpressure",workflowId:r,namespace:p,bufferedCount:N.bufferedCount,state:q,ts:Date.now()})}}),T=0,K=!0,Z=!1,re=!1;z({type:"stream_created",workflowId:r,namespace:p,ts:Date.now()});let F={async write(q){if(re)return L(ze("closed","Stream is closed"));if(Z)return L(ze("aborted","Stream was aborted"));N.state==="paused"&&await N.waitForDrain();let ae={value:q,position:T,ts:Date.now()},ee=await C.append(r,p,ae);return ee.ok?(z({type:"stream_write",workflowId:r,namespace:p,position:T,ts:Date.now()}),T++,N.increment(),te(void 0)):(z({type:"stream_error",workflowId:r,namespace:p,error:ee.error,position:T,ts:Date.now()}),L(ze("store_error",ee.error.message,ee.error)))},async close(){if(re)return L(et("already_closed","Stream is already closed"));let q=await C.closeStream(r,p);return q.ok?(re=!0,K=!1,z({type:"stream_close",workflowId:r,namespace:p,finalPosition:T,ts:Date.now()}),Q.delete(I),te(void 0)):L(et("store_error",q.error.message,q.error))},abort(q){Z=!0,K=!1,re=!0,z({type:"stream_error",workflowId:r,namespace:p,error:q,position:T,ts:Date.now()}),Q.delete(I)},get writable(){return K},get position(){return T},get namespace(){return p}};return Q.set(I,{writer:F,backpressure:N,aborted:Z,closed:re}),F},f.getReadable=x=>{let p=x?.namespace??"default",S=x?.startIndex??0,I=x?.pollInterval??10,D=x?.pollTimeout??3e4;if(!C)throw new Error("streamStore is required to use getReadable(). Pass a streamStore to createWorkflow options.");let N=`${r}:${p}:${S}`,T=v.get(N);if(T&&!T.closed)return T.reader;let K=()=>{let Ce=`${r}:${p}`,se=Q.get(Ce);se&&se.backpressure.decrement()},Z=S,re=!0,F=!1,q=[],ae=0,ee={async read(){if(F)return L(Ze("closed","Reader is closed"));if(ae<q.length){let ce=q[ae++];return Z=ce.position+1,K(),z({type:"stream_read",workflowId:r,namespace:p,position:ce.position,ts:Date.now()}),te(ce.value)}let Ce=`${r}:${p}`,se=Date.now(),ue=Q.has(Ce),oe=await C.getMetadata(r,p),ie=oe.ok&&oe.value!==void 0;for(;Date.now()-se<D;){let ce=await C.read(r,p,Z,100);if(!ce.ok)return L(Ze("store_error",ce.error.message,ce.error));let We=ce.value;if(We.length>0){q=We,ae=1;let Fe=We[0];return Z=Fe.position+1,K(),z({type:"stream_read",workflowId:r,namespace:p,position:Fe.position,ts:Date.now()}),te(Fe.value)}let Le=Q.has(Ce),Ae=await C.getMetadata(r,p),ot=Ae.ok&&Ae.value!==void 0;if(Le&&(ue=!0),ot&&(ie=!0),Ae.ok&&Ae.value?.closed)return re=!1,L(Je(Z));if(ue&&!Le&&!ot)return re=!1,L(Je(Z));ie&&!Le&&Ae.ok&&Ae.value?.closed,await new Promise(Fe=>setTimeout(Fe,I))}return re=!1,L(Je(Z))},close(){F=!0,re=!1,q=[],v.delete(N)},get readable(){return re},get position(){return Z},get namespace(){return p}};return v.set(N,{reader:ee,position:Z,closed:F}),ee},f.streamForEach=async(x,p,S)=>{let I=S?.checkpointInterval??1,D=S?.concurrency??1,N=[],T=0,K=-1,Z=F=>typeof F=="object"&&F!==null&&"read"in F&&typeof F.read=="function",re=async(F,q,ae,ee)=>{let se=I>0&&q%I===0?`stream-foreach:${ee}:pos-${ae}`:void 0,ue=se??`stream-item-${ae}`,oe=await f(ue,()=>p(F,q),{key:se});return{index:q,position:ae,result:oe}};if(Z(x))if(D<=1){let F=x.position,q=await x.read();for(;q.ok;){let ae=q.value,{result:ee}=await re(ae,T,F,x.namespace);N.push(ee),K=F,T++,F=x.position,q=await x.read()}}else{let F=new Map,q=0,ae=0,ee=new Array(D).fill(null),Ce=async()=>{for(let ce=0;ce<ee.length;ce++)if(ee[ce]===null)return ce;let oe=ee.filter(ce=>ce!==null),ie=await Promise.race(oe);return F.set(ie.index,{position:ie.position,result:ie.result}),ee[ie.slotIndex]=null,ie.slotIndex},se=x.position,ue=await x.read();for(;ue.ok;){let oe=await Ce(),ie=q,ce=se,We=ue.value,Le=oe;ee[oe]=re(We,ie,ce,x.namespace).then(Ae=>({slotIndex:Le,...Ae})),ae++,q++,se=x.position,ue=await x.read()}for(let oe=0;oe<ee.length;oe++)if(ee[oe]!==null){let ie=await ee[oe];F.set(ie.index,{position:ie.position,result:ie.result})}for(let oe=0;oe<ae;oe++){let ie=F.get(oe);ie&&(N.push(ie.result),K=ie.position,T++)}}else if(D<=1){let F=0;for await(let q of x){let{result:ae}=await re(q,F,F,"async-iterable");N.push(ae),K=F,T++,F++}}else{let F=new Map,q=0,ae=0,ee=new Array(D).fill(null),Ce=async()=>{for(let oe=0;oe<ee.length;oe++)if(ee[oe]===null)return oe;let se=ee.filter(oe=>oe!==null),ue=await Promise.race(se);return F.set(ue.index,ue.result),ee[ue.slotIndex]=null,ue.slotIndex};for await(let se of x){let ue=await Ce(),oe=q,ie=ue;ee[ue]=re(se,oe,oe,"async-iterable").then(ce=>({slotIndex:ie,...ce})),ae++,q++}for(let se=0;se<ee.length;se++)if(ee[se]!==null){let ue=await ee[se];F.set(ue.index,ue.result)}for(let se=0;se<ae;se++)F.has(se)&&(N.push(F.get(se)),K=se,T++)}return{results:N,processedCount:T,lastPosition:K}},f.if=m.if,f.label=m.label,f.branch=m.branch,f.arm=m.arm,f.forEach=m.forEach,f.item=m.item,f.dep=m.dep,f.workflow=(x,p,S)=>f(x,p,S),f.all=(x,p,S)=>{let I=S!==void 0&&Object.prototype.hasOwnProperty.call(S,"key")?S:{...S,key:void 0};return f(x,async()=>te(await m.all(x,p)),I)},f.map=(x,p,S,I)=>{let D=I!==void 0&&Object.prototype.hasOwnProperty.call(I,"key")?I:{...I,key:void 0};return f(x,async()=>te(await m.map(x,p,S,I)),D)},f},J=({step:m})=>{let f=V(m);return R({step:f,steps:Ke(w??{},f),deps:w,ctx:be})},_;try{_=await Be(J,{onError:de,onEvent:X,catchUnexpected:Se,workflowId:r,workflowName:e,context:G,_workflowSignal:i})}finally{i&&i.removeEventListener("abort",ne)}if(!_.ok&&A.length>0){let m=[];for(let f=A.length-1;f>=0;f--){let Q=A[f];try{await Q.compensate(Q.value)}catch(v){m.push({stepName:Q.stepName,error:v})}}if(m.length>0){let f={type:"SAGA_COMPENSATION_ERROR",originalError:_.error,compensationErrors:m};_=L(f,{cause:_.cause})}}let ye=performance.now()-s;if(!_.ok){let m;if(tt(_.cause)&&(m=_.cause),!m&&W&>(_.error)){let f=_.cause;f!=null&&typeof f=="object"&&"name"in f&&f.name==="AbortError"&&(m={type:"WORKFLOW_CANCELLED",reason:j??(typeof i?.reason=="string"?i.reason:i?.reason instanceof Error?i.reason.message:void 0),lastStepKey:H})}if(m)return z({type:"workflow_cancelled",workflowId:r,ts:Date.now(),durationMs:ye,reason:m.reason,lastStepKey:m.lastStepKey}),m&&!tt(_.cause)?L(_.error,{cause:m}):_}if(_.ok&&W){let m=j??(typeof i?.reason=="string"?i.reason:i?.reason instanceof Error?i.reason.message:void 0);z({type:"workflow_cancelled",workflowId:r,ts:Date.now(),durationMs:ye,reason:m,lastStepKey:H});let f={type:"WORKFLOW_CANCELLED",reason:m,lastStepKey:H};return L(Se(f),{cause:f})}return _.ok?z({type:"workflow_success",workflowId:r,ts:Date.now(),durationMs:ye}):z({type:"workflow_error",workflowId:r,ts:Date.now(),durationMs:ye,error:_.error}),_}function E(k,R,g){let r,w,A;return typeof k=="string"?(r=k,w=R,A=g):(w=k,A=R),o(r,w,A)}async function b(k,R,g){let r,w,A;typeof k=="string"?(r=k,w=R,A=g):(w=k,A=R);let $=Pt(),G=A?.onEvent,X={...A,onEvent:(Te,Pe)=>{$.handleEvent(Te);try{G?.(Te,Pe)}catch{}}},de,pe;try{de=await o(r,w,X)}catch(Te){let Pe=l?.catchUnexpected??qe;de=L(Pe(Te),{cause:Te})}finally{pe=$.getResumeState()}return{result:de,resumeState:pe}}let M={withDeps:k=>rt(M,k),run:E,runWithState:b};return M}function ir(e){return typeof e=="object"&&e!==null&&e.type==="SAGA_COMPENSATION_ERROR"}function ur(e,t,n){return _t(e,t,n)}async function cr(e,t){let n=crypto.randomUUID(),d=performance.now(),l=[],o=k=>t?.onEvent?.(k);o({type:"saga_start",sagaId:n,ts:Date.now()});let M=Object.assign(async(k,R,g)=>{if(typeof k!="string"||k.length===0)throw new TypeError("step(name, operation, options?): first argument must be a string.");let r=await R();if(r.ok)return g?.compensate&&l.push({name:k,value:r.value,compensate:g.compensate}),r.value;throw he(r.error,{origin:"result",resultCause:r.cause})},{try:async(k,R,g)=>{if(typeof k!="string"||k.length===0)throw new TypeError("step.try(name, operation, options): first argument must be a string.");let r="error"in g?()=>g.error:g.onError;try{let w=await R();return g.compensate&&l.push({name:k,value:w,compensate:g.compensate}),w}catch(w){let A=r(w);throw he(A,{origin:"throw",thrown:w})}}});try{let k=await e({step:M});return o({type:"saga_success",sagaId:n,ts:Date.now(),durationMs:performance.now()-d}),te(k)}catch(k){let R=performance.now()-d,g=xe(k)?k.error:k;o({type:"saga_error",sagaId:n,ts:Date.now(),durationMs:R,error:g}),o({type:"saga_compensation_start",sagaId:n,ts:Date.now(),stepCount:l.length});let r=performance.now(),w=[];for(let A=l.length-1;A>=0;A--){let $=l[A];try{await $.compensate($.value),o({type:"saga_compensation_step",sagaId:n,stepName:$.name,ts:Date.now(),success:!0})}catch(G){w.push({stepName:$.name,error:G}),o({type:"saga_compensation_step",sagaId:n,stepName:$.name,ts:Date.now(),success:!1,error:G})}}if(o({type:"saga_compensation_end",sagaId:n,ts:Date.now(),durationMs:performance.now()-r,success:w.length===0,failedCount:w.length}),w.length>0){let A={type:"SAGA_COMPENSATION_ERROR",originalError:g,compensationErrors:w};if(t?.onError?.(A),t?.throwOnCompensationFailure)throw A;return L(A)}return t?.onError?.(g),xe(k)?L(g):L(new _e({cause:k}))}}function Ee(...e){let t={};for(let n of e)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 lr(...e){let t=Ee(...e);return n=>Ee(t,n??{})}function pr(e,...t){return{name:e,policy:Ee(...t)}}function ge(e){return{retry:e}}var Ne={none:ge({attempts:1}),transient:ge({attempts:3,backoff:"exponential",initialDelay:100,maxDelay:1e3,jitter:!0}),standard:ge({attempts:3,backoff:"exponential",initialDelay:200,maxDelay:5e3,jitter:!0}),aggressive:ge({attempts:5,backoff:"exponential",initialDelay:500,maxDelay:3e4,jitter:!0}),fixed:(e,t)=>ge({attempts:e,backoff:"fixed",initialDelay:t,jitter:!1}),linear:(e,t)=>ge({attempts:e,backoff:"linear",initialDelay:t,jitter:!0}),custom:e=>ge({backoff:"exponential",initialDelay:100,maxDelay:3e4,jitter:!0,...e})};function ke(e){return{timeout:e}}var Ue={none:{},fast:ke({ms:1e3}),api:ke({ms:5e3}),extended:ke({ms:3e4}),long:ke({ms:12e4}),ms:e=>ke({ms:e}),seconds:e=>ke({ms:e*1e3}),withError:(e,t)=>ke({ms:e,error:t}),withSignal:e=>ke({ms:e,signal:!0})},mr={httpApi:Ee(Ue.api,Ne.standard),database:Ee(Ue.extended,ge({attempts:2,backoff:"exponential",initialDelay:100,maxDelay:2e3,jitter:!0})),cache:Ee(Ue.fast,Ne.none),messageQueue:Ee(Ue.extended,Ne.aggressive),fileSystem:Ee(Ue.long,Ne.standard),rateLimited:Ee(ke({ms:1e4}),ge({attempts:5,backoff:"linear",initialDelay:1e3,maxDelay:1e4,jitter:!0}))};function Dt(e,t){return Ee(e,t??{})}function dr(e,t){let n=t??{};return Ee(...e,n)}function Er(e,t,n={}){return e?t:n}function fr(e,t=process.env.NODE_ENV??"development",n={}){return e[t]??n}function yr(){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 d=e.get(t);if(!d)throw new Error(`Policy not found: ${t}`);return Dt(d,n)}}}function wr(){let e=[],t={key(n){return e.push({key:n}),t},policy(n){return e.push(n),t},timeout(n){return e.push(ke({ms:n})),t},retry(n){return e.push(ge(n)),t},retries(n){return e.push(Ne.custom({attempts:n})),t},build(){return Ee(...e)}};return t}export{Ve as CircuitOpenError,Ht as circuitBreakerPresets,Er as conditionalPolicy,$t as createCircuitBreaker,zt as createCombinedLimiter,ht as createConcurrencyLimiter,Yt as createCostBasedRateLimiter,Jt as createFixedWindowLimiter,lr as createPolicyApplier,pr as createPolicyBundle,yr as createPolicyRegistry,Ct as createRateLimiter,ur as createSagaWorkflow,fr as envPolicy,Bt as isCircuitOpenError,xt as isQueueFullError,qt as isRateLimitExceededError,ir as isSagaCompensationError,Ee as mergePolicies,Qt as rateLimiterPresets,Ne as retryPolicies,ge as retryPolicy,cr as runSaga,mr as servicePolicies,wr as stepOptions,Ue as timeoutPolicies,ke as timeoutPolicy,dr as withPolicies,Dt as withPolicy};
|
|
11
|
-
//# sourceMappingURL=reliability.js.map
|