awaitly 1.34.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 +35 -5
- package/dist/result.d.ts +35 -5
- 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-D2MmJFj9.d.cts → types-B8NfNRGX.d.ts} +1152 -1499
- package/dist/{run-entry-Dduz-is2.d.ts → types-BZ2f4MRR.d.cts} +1152 -1499
- 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 +13 -178
- 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-COl5oFnR.d.cts +0 -15
- package/dist/di-CyDj_JyZ.d.ts +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-BodHXLzX.d.cts +0 -72
- package/dist/guards-CeWoQ8fn.d.ts +0 -72
- package/dist/hitl-BPE_1UiM.d.cts +0 -468
- package/dist/hitl-byp570uC.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-BYT3amEz.d.ts +0 -417
- package/dist/index-C_ak66jy.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-DOMx3woy.d.ts +0 -822
- package/dist/persistence-entry-ymCA4iDu.d.cts +0 -822
- 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-DQmzO9f4.d.ts +0 -323
- package/dist/types-qBUOYi-4.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-D2MmJFj9.cjs';
|
|
6
|
-
import './errors.cjs';
|
|
7
|
-
import './tagged-error.cjs';
|
|
8
|
-
import './slugs.cjs';
|
|
9
|
-
import './persistence-entry-ymCA4iDu.cjs';
|
|
10
|
-
import './types-qBUOYi-4.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-Dduz-is2.js';
|
|
6
|
-
import './errors.js';
|
|
7
|
-
import './tagged-error.js';
|
|
8
|
-
import './slugs.js';
|
|
9
|
-
import './persistence-entry-DOMx3woy.js';
|
|
10
|
-
import './types-DQmzO9f4.js';
|
|
11
|
-
import '@standard-schema/spec';
|
package/dist/reliability.js
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
var Dt={"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 ot(e){return`https://jagreehal.github.io/awaitly/rules/#${e}`}var Er=Object.keys(Dt);var je=class extends Error{_tag};function me(e,t){return class extends je{_tag=e;constructor(r,p){let d=t?.message?t.message(r??{}):e;if(super(d),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:ot(t.slug),enumerable:!0,writable:!1,configurable:!1})}if(Object.setPrototypeOf(this,new.target.prototype),r&&typeof r=="object"){let c;if(t?.slug!==void 0){let{_tag:n,name:O,message:f,stack:i,code:T,hint:a,docsUrl:_,...q}=r;c=q}else{let{_tag:n,name:O,message:f,stack:i,...T}=r;c=T}let x=Object.prototype.hasOwnProperty.call(c,"cause"),w=x?c.cause:void 0;x&&delete c.cause;let P=p?.cause!==void 0;if(x&&P)throw new TypeError("TaggedError: cannot provide 'cause' in props when also setting ErrorOptions.cause");Object.assign(this,c),x&&(this.cause=w),P&&(this.cause=p?.cause)}else p?.cause!==void 0&&(this.cause=p.cause)}}}Object.defineProperty(me,Symbol.hasInstance,{value:e=>e instanceof je});(d=>{function e(c){return c instanceof Error}d.isError=e;function t(c){return c instanceof je}d.isTaggedError=t;function r(c,x){let w=c._tag,P=x[w];return P(c)}d.match=r;function p(c,x,w){let P=c._tag,n=x[P];return n?n(c):w(c)}d.matchPartial=p})(me||={});var st=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`}){},at=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`}){},it=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`:""}`}){},ut=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`:""}`}){},ct=class extends me("ValidationError",{message:t=>`ValidationError: Invalid ${t.field} - ${t.reason}`}){},lt=class extends me("NotFoundError",{message:t=>t.id?`NotFoundError: ${t.resource} with id ${t.id} not found`:`NotFoundError: ${t.resource} not found`}){},pt=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"}){},mt=class extends me("NetworkError",{message:t=>t.url?`NetworkError: ${t.reason} (${t.url})`:`NetworkError: ${t.reason}`}){},dt=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}`}){},Pe=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 Ot(e){let t=e.trim().match(/^(\d+(?:\.\d+)?)\s*(ms|s|m|h|d)$/i);if(!t)return;let r=parseFloat(t[1]),p=t[2].toLowerCase();return{_tag:"Duration",millis:r*({ms:1,s:1e3,m:6e4,h:36e5,d:864e5}[p]??1)}}function He(e){return new Pe({cause:e})}function G(e){return{ok:!0,value:e}}function W(e,t){let r=t?.cause;return{ok:!1,error:e,...r!==void 0?{cause:r}:{}}}var wt=e=>e instanceof Pe||typeof e=="object"&&e!==null&&"_tag"in e&&e._tag==="UnexpectedError";function Mt(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 r=t._tag.trim();if(r)return r}if(typeof t.tag=="string"){let r=t.tag.trim();if(r)return r}if(typeof t.code=="string"){let r=t.code.trim();if(r)return r}else if(typeof t.code=="number")return String(t.code);if(e instanceof Error&&e.name){let r=e.name.trim();if(r)return r}}return"unknown"}function It(e,t){if(!(!t||!e))return t[e]}function Xe(e){let{intent:t,domain:r,owner:p,tags:d,stateChanges:c,emits:x,calls:w}=e;if(!t&&!r&&!p&&!d?.length&&!c?.length&&!x?.length&&!w?.length)return;let P={};return t&&(P.intent=t),r&&(P.domain=r),p&&(P.owner=p),d?.length&&(P.tags=d),c?.length&&(P.stateChanges=c),x?.length&&(P.emits=x),w?.length&&(P.calls=w),P}function Ee(e,t,r,p,d){let c=Mt(e),x=It(c,t),w={tag:c,origin:r};return x!==void 0&&(w.classification=x),p!==void 0&&(w.attempt=p),d!==void 0&&(w.cumulativeDurationMs=d),w}var Ie=Symbol.for("step_timeout_marker");function ft(e){return typeof e!="object"||e===null?!1:e.type==="STEP_TIMEOUT"?!0:Ie in e}function Ut(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 gt=Symbol("early-exit");function Se(e,t){return{[gt]:!0,error:e,meta:t}}function Te(e){return typeof e=="object"&&e!==null&&e[gt]===!0}var kt=Symbol("mapper-exception");function Oe(e){return{[kt]:!0,thrown:e}}function Nt(e){return typeof e=="object"&&e!==null&&e[kt]===!0}function Ye(e,t){let{backoff:r,initialDelay:p,maxDelay:d,jitter:c}=t,x;switch(r){case"fixed":x=p;break;case"linear":x=p*e;break;case"exponential":x=p*Math.pow(2,e-1);break}if(x=Math.min(x,d),c){let w=x*.25*Math.random();x=x+w}return Math.floor(x)}function Qe(e){return new Promise(t=>setTimeout(t,e))}var Et=Symbol("timeout"),Ve=Symbol("timeout-option");function Wt(e){return typeof e=="object"&&e!==null&&e[Ve]===!0}async function Lt(e,t,r,p){let d=new AbortController,c=t.onTimeout??"error",x=()=>typeof c=="function"?c({name:r.name,key:r.key,ms:t.ms}):t.error??{type:"STEP_TIMEOUT",stepName:r.name,stepKey:r.key,timeoutMs:t.ms,attempt:r.attempt},w;p?.aborted&&d.abort(p.reason);let P;p&&!p.aborted&&(P=()=>d.abort(p.reason),p.addEventListener("abort",P,{once:!0}));let n=new Promise((f,i)=>{w=setTimeout(()=>{if(c!=="disconnect"&&d.abort(),c==="option"){i({[Ve]:!0,ms:t.ms});return}i({[Et]:!0,error:x()})},t.ms)}),O;t.signal?O=Promise.resolve(e(d.signal)):O=Promise.resolve(e());try{return await Promise.race([O,n])}catch(f){if(typeof f=="object"&&f!==null&&f[Ve]===!0)throw{[Ve]:!0,ms:t.ms};if(typeof f=="object"&&f!==null&&f[Et]===!0){c==="disconnect"&&O.catch(()=>{});let i=f.error;if(typeof i=="object"&&i!==null&&i.type!=="STEP_TIMEOUT"){let T={timeoutMs:t.ms,stepName:r.name,stepKey:r.key,attempt:r.attempt};Ie in i?i[Ie]=T:Object.defineProperty(i,Ie,{value:T,enumerable:!1,writable:!0,configurable:!1})}throw i}throw f}finally{clearTimeout(w),P&&p&&p.removeEventListener("abort",P)}}var Me={backoff:"exponential",initialDelay:100,maxDelay:3e4,jitter:!0,shouldRetry:()=>!0,onRetry:()=>{}};async function $e(e,t){let{onError:r,onEvent:p,catchUnexpected:d,workflowId:c,workflowName:x,context:w,_workflowSignal:P}=t&&typeof t=="object"?t:{},n=c??crypto.randomUUID(),O=d??He,f=[],i=0,T=S=>S??`step_${++i}`,a=S=>{let le=S.context!==void 0||w===void 0?S:{...S,context:w},pe=x!==void 0&&le.workflowName===void 0?{...le,workflowName:x}:le;if(pe.type==="step_success"){let ge=pe.stepId;for(let ve=f.length-1;ve>=0;ve--){let de=f[ve];if(de.type==="race"&&!de.winnerId){de.winnerId=ge;break}}}p?.(pe,w)},_=Se,q=S=>Te(S),F=(S,le)=>S,ie=S=>typeof S=="function"?!1:!!(S&&typeof S=="object"&&"ok"in S||S&&typeof S=="object"&&"then"in S&&typeof S.then=="function");try{let le=function(E){let A={};for(let[o,l]of Object.entries(E))if(typeof l=="function")A[o]=l;else if(l&&typeof l=="object"&&"fn"in l)A[o]=l.fn;else throw new TypeError(`step.all: operation "${o}" must be a function or { fn, errors? } object`);return A},pe=function(E,A){let o=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let l=performance.now(),s=!1;f.push({scopeId:o,type:"parallel"});let k=()=>{if(s)return;s=!0;let C=f.findIndex(D=>D.scopeId===o);C!==-1&&f.splice(C,1),a({type:"scope_end",workflowId:n,scopeId:o,ts:Date.now(),durationMs:performance.now()-l})};a({type:"scope_start",workflowId:n,scopeId:o,scopeType:"parallel",name:E,ts:Date.now()});try{let C=await A();if(k(),!C.ok)throw r?.(C.error,E,w),_(C.error,{origin:"result",resultCause:C.cause});return C.value}catch(C){throw k(),C}})()},ge=function(E,A){let o=Object.keys(E),l=A.name??`Parallel(${o.join(", ")})`,s=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let k=performance.now(),C=!1;f.push({scopeId:s,type:"parallel"});let D=()=>{if(C)return;C=!0;let m=f.findIndex(I=>I.scopeId===s);m!==-1&&f.splice(m,1),a({type:"scope_end",workflowId:n,scopeId:s,ts:Date.now(),durationMs:performance.now()-k})};a({type:"scope_start",workflowId:n,scopeId:s,scopeType:"parallel",name:l,ts:Date.now()});try{let m=await new Promise(B=>{if(o.length===0){B([]);return}let J=!1,Z=o.length,j=new Array(o.length);for(let Q=0;Q<o.length;Q++){let V=o[Q],z=Q;Promise.resolve(E[V]()).catch(N=>W({type:"PROMISE_REJECTED",cause:N},{cause:{type:"PROMISE_REJECTION",reason:N}})).then(N=>{if(!J){if(!N.ok){J=!0,B([{key:V,result:N}]);return}j[z]={key:V,result:N},Z--,Z===0&&B(j)}})}});D();let I={};for(let{key:B,result:J}of m){if(!J.ok)throw r?.(J.error,B,w),_(J.error,{origin:"result",resultCause:J.cause});I[B]=J.value}return I}catch(m){throw D(),m}})()};var _e=le,De=pe,Re=ge;let S=(E,A,o)=>(async()=>{if(typeof E!="string"||E.length===0)throw new Error('[awaitly] step() requires an explicit string ID as the first argument. Example: step("fetchUser", () => fetchUser(id))');let l=o??{},s=Xe(l),k=E,C=l.key??E,D=l.key??E,{description:m,retry:I,timeout:B}=l,J=T(C),Z=p,j=Z?performance.now():0,V=ie(A)?()=>A:A,N={attempts:Math.max(1,I?.attempts??1),backoff:I?.backoff??Me.backoff,initialDelay:I?.initialDelay??Me.initialDelay,maxDelay:I?.maxDelay??Me.maxDelay,jitter:I?.jitter??Me.jitter,shouldRetry:I?.shouldRetry??Me.shouldRetry,onRetry:I?.onRetry??Me.onRetry};p&&a({type:"step_start",workflowId:n,stepId:J,stepKey:C,name:k,description:m,ts:Date.now(),...s&&{metadata:s}});let xe;for(let u=1;u<=N.attempts;u++){let g=Z?performance.now():0;try{let y;if(B?y=await Lt(V,B,{name:k,key:C,attempt:u},P):y=await V(),y.ok){let Y=performance.now()-j;return a({type:"step_success",workflowId:n,stepId:J,stepKey:C,name:k,description:m,ts:Date.now(),durationMs:Y,...s&&{metadata:s}}),D&&a({type:"step_complete",workflowId:n,stepKey:D,name:k,description:m,ts:Date.now(),durationMs:Y,result:y,...s&&{metadata:s}}),y.value}if(xe=y,u<N.attempts&&N.shouldRetry(y.error,u)){let Y=Ye(u,N);a({type:"step_retry",workflowId:n,stepId:J,stepKey:C,name:k,ts:Date.now(),attempt:u+1,maxAttempts:N.attempts,delayMs:Y,error:y.error,...s&&{metadata:s},diagnostics:Ee(y.error,l.errorMeta,"result",u,performance.now()-j)}),N.onRetry(y.error,u,Y),await Qe(Y);continue}N.attempts>1&&a({type:"step_retries_exhausted",workflowId:n,stepId:J,stepKey:C,name:k,ts:Date.now(),durationMs:performance.now()-j,attempts:u,lastError:y.error,...s&&{metadata:s},diagnostics:Ee(y.error,l.errorMeta,"result",u,performance.now()-j)});break}catch(y){let Y=performance.now()-g;if(Wt(y)){let b=y.ms;a({type:"step_timeout",workflowId:n,stepId:J,stepKey:C,name:k,ts:Date.now(),timeoutMs:b,attempt:u,...s&&{metadata:s},diagnostics:Ee(y,l.errorMeta,"timeout",u)}),a({type:"step_success",workflowId:n,stepId:J,stepKey:C,name:k,description:m,ts:Date.now(),durationMs:performance.now()-j,...s&&{metadata:s}}),D&&a({type:"step_complete",workflowId:n,stepKey:D,name:k,description:m,ts:Date.now(),durationMs:performance.now()-j,result:G(void 0),...s&&{metadata:s}});return}if(q(y))throw a({type:"step_aborted",workflowId:n,stepId:J,stepKey:C,name:k,description:m,ts:Date.now(),durationMs:Y,...s&&{metadata:s}}),y;if(ft(y)){let b=Ut(y),U=B?.ms??b?.timeoutMs??0;if(a({type:"step_timeout",workflowId:n,stepId:J,stepKey:C,name:k,ts:Date.now(),timeoutMs:U,attempt:u,...s&&{metadata:s},diagnostics:Ee(y,l.errorMeta,"timeout",u)}),u<N.attempts&&N.shouldRetry(y,u)){let K=Ye(u,N);a({type:"step_retry",workflowId:n,stepId:J,stepKey:C,name:k,ts:Date.now(),attempt:u+1,maxAttempts:N.attempts,delayMs:K,error:y,...s&&{metadata:s},diagnostics:Ee(y,l.errorMeta,"timeout",u,performance.now()-j)}),N.onRetry(y,u,K),await Qe(K);continue}N.attempts>1&&a({type:"step_retries_exhausted",workflowId:n,stepId:J,stepKey:C,name:k,ts:Date.now(),durationMs:performance.now()-j,attempts:u,lastError:y,...s&&{metadata:s},diagnostics:Ee(y,l.errorMeta,"timeout",u,performance.now()-j)});let M=performance.now()-j;throw a({type:"step_error",workflowId:n,stepId:J,stepKey:C,name:k,description:m,ts:Date.now(),durationMs:M,error:y,...s&&{metadata:s},diagnostics:Ee(y,l.errorMeta,"timeout",u,M)}),D&&a({type:"step_complete",workflowId:n,stepKey:D,name:k,description:m,ts:Date.now(),durationMs:M,result:W(y,{cause:y}),meta:{origin:"throw",thrown:y},...s&&{metadata:s}}),r?.(y,k,w),_(y,{origin:"throw",thrown:y})}if(u<N.attempts&&N.shouldRetry(y,u)){let b=Ye(u,N);a({type:"step_retry",workflowId:n,stepId:J,stepKey:C,name:k,ts:Date.now(),attempt:u+1,maxAttempts:N.attempts,delayMs:b,error:y,...s&&{metadata:s},diagnostics:Ee(y,l.errorMeta,"throw",u,performance.now()-j)}),N.onRetry(y,u,b),await Qe(b);continue}N.attempts>1&&!ft(y)&&a({type:"step_retries_exhausted",workflowId:n,stepId:J,stepKey:C,name:k,ts:Date.now(),durationMs:performance.now()-j,attempts:u,lastError:y,...s&&{metadata:s},diagnostics:Ee(y,l.errorMeta,"throw",u,performance.now()-j)});let R=performance.now()-j,v;try{v=O(y)}catch(b){throw Oe(b)}throw a({type:"step_error",workflowId:n,stepId:J,stepKey:C,name:k,description:m,ts:Date.now(),durationMs:R,error:v,...s&&{metadata:s},diagnostics:Ee(y,l.errorMeta,"throw",u,R)}),D&&a({type:"step_complete",workflowId:n,stepKey:D,name:k,description:m,ts:Date.now(),durationMs:R,result:W(v,{cause:y}),meta:{origin:"throw",thrown:y},...s&&{metadata:s}}),r?.(v,k,w),_(v,{origin:"throw",thrown:y})}}let ke=xe,oe=performance.now()-j,Ce=F(ke.error,{origin:"result",resultCause:ke.cause});throw a({type:"step_error",workflowId:n,stepId:J,stepKey:C,name:k,description:m,ts:Date.now(),durationMs:oe,error:Ce,...s&&{metadata:s},diagnostics:Ee(ke.error,l.errorMeta,"result",N.attempts,oe)}),D&&a({type:"step_complete",workflowId:n,stepKey:D,name:k,description:m,ts:Date.now(),durationMs:oe,result:ke,meta:{origin:"result",resultCause:ke.cause},...s&&{metadata:s}}),r?.(Ce,k,w),_(Ce,{origin:"result",resultCause:ke.cause})})();S.try=(E,A,o)=>{if(typeof E!="string"||E.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 l="error"in o?()=>o.error:o.onError;if(o.retry||o.timeout)return S.retry(E,async()=>{try{return G(await A())}catch(m){return W(l(m),{cause:m})}},{attempts:o.retry?.attempts??1,...o.retry??{},key:o.key,timeout:o.timeout});let s=o.key??E,k=E,C=E,D=p;return(async()=>{let m=D?performance.now():0;p&&a({type:"step_start",workflowId:n,stepId:C,stepKey:s,name:k,ts:Date.now()});try{let I=await A(),B=performance.now()-m;return a({type:"step_success",workflowId:n,stepId:C,stepKey:s,name:k,ts:Date.now(),durationMs:B}),s&&a({type:"step_complete",workflowId:n,stepKey:s,name:k,ts:Date.now(),durationMs:B,result:G(I)}),I}catch(I){let B=l(I),J=performance.now()-m,Z=F(B,{origin:"throw",thrown:I});throw a({type:"step_error",workflowId:n,stepId:C,stepKey:s,name:k,ts:Date.now(),durationMs:J,error:Z}),s&&a({type:"step_complete",workflowId:n,stepKey:s,name:k,ts:Date.now(),durationMs:J,result:W(B,{cause:I}),meta:{origin:"throw",thrown:I}}),r?.(Z,k,w),_(Z,{origin:"throw",thrown:I})}})()},S.fromResult=(E,A,o)=>{if(typeof E!="string"||E.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 l=o.key??E,s=E,k=E,C="error"in o?()=>o.error:o.onError,D=p;return(async()=>{let m=D?performance.now():0;p&&a({type:"step_start",workflowId:n,stepId:k,stepKey:l,name:s,ts:Date.now()});let I=await A();if(I.ok){let B=performance.now()-m;return a({type:"step_success",workflowId:n,stepId:k,stepKey:l,name:s,ts:Date.now(),durationMs:B}),l&&a({type:"step_complete",workflowId:n,stepKey:l,name:s,ts:Date.now(),durationMs:B,result:G(I.value)}),I.value}else{let B=C(I.error),J=performance.now()-m,Z=F(B,{origin:"result",resultCause:I.error});throw a({type:"step_error",workflowId:n,stepId:k,stepKey:l,name:s,ts:Date.now(),durationMs:J,error:Z}),l&&a({type:"step_complete",workflowId:n,stepKey:l,name:s,ts:Date.now(),durationMs:J,result:W(B,{cause:I.error}),meta:{origin:"result",resultCause:I.error}}),r?.(Z,s,w),_(Z,{origin:"result",resultCause:I.error})}})()},S.fromNullable=(E,A,o,l)=>{if(typeof E!="string"||E.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 S(E,async()=>{let s=await A();return s!=null?G(s):W(o())},l)},S.retry=(E,A,o)=>{if(typeof E!="string"||E.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 S(E,A,{key:o.key??E,retry:{attempts:o.attempts,backoff:o.backoff,initialDelay:o.initialDelay,maxDelay:o.maxDelay,jitter:o.jitter,shouldRetry:o.shouldRetry,onRetry:o.onRetry},timeout:o.timeout})},S.withTimeout=(E,A,o)=>{if(typeof E!="string"||E.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 S(E,A,{key:o.key??E,timeout:o})},S.sleep=(E,A,o)=>{if(typeof E!="string"||E.length===0)throw new Error('[awaitly] step.sleep() requires an explicit string ID as the first argument. Example: step.sleep("delay", "5s")');let l=typeof A=="string"?Ot(A):A;if(!l)throw new Error(`step.sleep: invalid duration '${A}'`);let s=l.millis,k=o?.signal;return S(E,async()=>{if(P?.aborted||k?.aborted){let C=new Error("Sleep aborted");throw C.name="AbortError",C}return new Promise((C,D)=>{let m={timeoutId:void 0},I=()=>{m.timeoutId&&clearTimeout(m.timeoutId);let B=new Error("Sleep aborted");B.name="AbortError",D(B)};P?.addEventListener("abort",I,{once:!0}),k?.addEventListener("abort",I,{once:!0}),m.timeoutId=setTimeout(()=>{P?.removeEventListener("abort",I),k?.removeEventListener("abort",I),C(G(void 0))},s)})},{key:o?.key??E,description:o?.description})},S.all=((...E)=>{if(typeof E[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 A=E[0],o=E[1];if(typeof o=="function")return pe(A,o);if(o&&typeof o=="object"&&!Array.isArray(o)){let s=le(o);return ge(s,{name:A})}throw new TypeError("step.all(name, ...): second argument must be a function (array form) or an object of operations (object form).")}),S.race=(E,A)=>{let o=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let l=performance.now(),s=!1,k={scopeId:o,type:"race",winnerId:void 0};f.push(k);let C=()=>{if(s)return;s=!0;let D=f.findIndex(m=>m.scopeId===o);D!==-1&&f.splice(D,1),a({type:"scope_end",workflowId:n,scopeId:o,ts:Date.now(),durationMs:performance.now()-l,winnerId:k.winnerId})};a({type:"scope_start",workflowId:n,scopeId:o,scopeType:"race",name:E,ts:Date.now()});try{let D=await A();if(C(),!D.ok)throw r?.(D.error,E,w),_(D.error,{origin:"result",resultCause:D.cause});return D.value}catch(D){throw C(),D}})()},S.if=(E,A,o)=>o(),S.label=S.if,S.branch=async(E,A)=>{let{condition:o,then:l,else:s}=A;if(o())return await l();if(s)return await s()},S.arm=(E,A)=>({fn:E,errors:A}),S.forEach=async(E,A,o)=>{let l=[],s=o.maxIterations,k=0,C="run"in o,D=Symbol.asyncIterator in A?A:(async function*(){yield*A})();for await(let m of D){if(s!==void 0&&k>=s)break;let I;C?I=await o.run(m,k):I=await o.item.handler(m,k,S),l.push(I),k++}return l},S.item=E=>({__forEachItemHandler:!0,handler:E}),S.dep=(E,A)=>A,S.workflow=(E,A,o)=>S(E,A,o),S.map=async(E,A,o,l)=>{let s=l?.concurrency??A.length;return S(E,()=>s>=A.length?yt(A.map((k,C)=>o(k,C))):(async()=>{let k=[];for(let C=0;C<A.length;C+=s){let D=A.slice(C,C+s),m=await yt(D.map((I,B)=>o(I,C+B)));if(!m.ok)return m;k.push(...m.value)}return G(k)})(),{key:l?.key})},S.withFallback=(E,A,o)=>{if(typeof E!="string"||E.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 l=o.key??E,s=E,k=T(l),C=p;return(async()=>{let D=C?performance.now():0;p&&a({type:"step_start",workflowId:n,stepId:k,stepKey:l,name:s,ts:Date.now()});let m;try{m=await A()}catch(j){if(q(j))throw a({type:"step_aborted",workflowId:n,stepId:k,stepKey:l,name:s,ts:Date.now(),durationMs:performance.now()-D}),j;let Q;try{Q=O(j)}catch(z){throw Oe(z)}if(o.on!==void 0&&o.on!==Q){let z=performance.now()-D;throw a({type:"step_error",workflowId:n,stepId:k,stepKey:l,name:s,ts:Date.now(),durationMs:z,error:Q}),l&&a({type:"step_complete",workflowId:n,stepKey:l,name:s,ts:Date.now(),durationMs:z,result:W(Q,{cause:j}),meta:{origin:"throw",thrown:j}}),r?.(Q,s,w),_(Q,{origin:"throw",thrown:j})}let V;try{V=await o.fallback()}catch(z){if(q(z))throw a({type:"step_aborted",workflowId:n,stepId:k,stepKey:l,name:s,ts:Date.now(),durationMs:performance.now()-D}),z;let N;try{N=O(z)}catch(ke){throw Oe(ke)}let xe=performance.now()-D;throw a({type:"step_error",workflowId:n,stepId:k,stepKey:l,name:s,ts:Date.now(),durationMs:xe,error:N}),l&&a({type:"step_complete",workflowId:n,stepKey:l,name:s,ts:Date.now(),durationMs:xe,result:W(N,{cause:z}),meta:{origin:"throw",thrown:z}}),r?.(N,s,w),_(N,{origin:"throw",thrown:z})}if(V.ok){let z=performance.now()-D;return a({type:"step_success",workflowId:n,stepId:k,stepKey:l,name:s,ts:Date.now(),durationMs:z}),l&&a({type:"step_complete",workflowId:n,stepKey:l,name:s,ts:Date.now(),durationMs:z,result:V,meta:{origin:"fallback",fallbackUsed:!0,fallbackReason:String(Q)}}),V.value}else{let z=performance.now()-D,N=F(V.error,{origin:"result",resultCause:V.cause});throw a({type:"step_error",workflowId:n,stepId:k,stepKey:l,name:s,ts:Date.now(),durationMs:z,error:N}),l&&a({type:"step_complete",workflowId:n,stepKey:l,name:s,ts:Date.now(),durationMs:z,result:V,meta:{origin:"result",resultCause:V.cause}}),r?.(N,s,w),_(N,{origin:"result",resultCause:V.cause})}}if(m.ok){let j=performance.now()-D;return a({type:"step_success",workflowId:n,stepId:k,stepKey:l,name:s,ts:Date.now(),durationMs:j}),l&&a({type:"step_complete",workflowId:n,stepKey:l,name:s,ts:Date.now(),durationMs:j,result:m}),m.value}let I=m.error;if(o.on!==void 0&&o.on!==I){let j=performance.now()-D,Q=F(I,{origin:"result",resultCause:m.cause});throw a({type:"step_error",workflowId:n,stepId:k,stepKey:l,name:s,ts:Date.now(),durationMs:j,error:Q}),l&&a({type:"step_complete",workflowId:n,stepKey:l,name:s,ts:Date.now(),durationMs:j,result:m,meta:{origin:"result",resultCause:m.cause}}),r?.(Q,s,w),_(Q,{origin:"result",resultCause:m.cause})}let B;try{B=await o.fallback()}catch(j){if(q(j))throw a({type:"step_aborted",workflowId:n,stepId:k,stepKey:l,name:s,ts:Date.now(),durationMs:performance.now()-D}),j;let Q;try{Q=O(j)}catch(z){throw Oe(z)}let V=performance.now()-D;throw a({type:"step_error",workflowId:n,stepId:k,stepKey:l,name:s,ts:Date.now(),durationMs:V,error:Q}),l&&a({type:"step_complete",workflowId:n,stepKey:l,name:s,ts:Date.now(),durationMs:V,result:W(Q,{cause:j}),meta:{origin:"throw",thrown:j}}),r?.(Q,s,w),_(Q,{origin:"throw",thrown:j})}if(B.ok){let j=performance.now()-D;return a({type:"step_success",workflowId:n,stepId:k,stepKey:l,name:s,ts:Date.now(),durationMs:j}),l&&a({type:"step_complete",workflowId:n,stepKey:l,name:s,ts:Date.now(),durationMs:j,result:B,meta:{origin:"fallback",fallbackUsed:!0,fallbackReason:String(I)}}),B.value}let J=performance.now()-D,Z=F(B.error,{origin:"result",resultCause:B.cause});throw a({type:"step_error",workflowId:n,stepId:k,stepKey:l,name:s,ts:Date.now(),durationMs:J,error:Z}),l&&a({type:"step_complete",workflowId:n,stepKey:l,name:s,ts:Date.now(),durationMs:J,result:B,meta:{origin:"result",resultCause:B.cause}}),r?.(Z,s,w),_(Z,{origin:"result",resultCause:B.cause})})()},S.withResource=(E,A)=>{if(typeof E!="string"||E.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 o=E,l=E,s=T(o),k=p;return(async()=>{let C=k?performance.now():0;p&&a({type:"step_start",workflowId:n,stepId:s,stepKey:o,name:l,ts:Date.now()});let D;try{D=await A.acquire()}catch(V){if(q(V))throw a({type:"step_aborted",workflowId:n,stepId:s,stepKey:o,name:l,ts:Date.now(),durationMs:performance.now()-C}),V;let z;try{z=O(V)}catch(xe){throw Oe(xe)}let N=performance.now()-C;throw a({type:"step_error",workflowId:n,stepId:s,stepKey:o,name:l,ts:Date.now(),durationMs:N,error:z}),o&&a({type:"step_complete",workflowId:n,stepKey:o,name:l,ts:Date.now(),durationMs:N,result:W(z,{cause:V}),meta:{origin:"throw",thrown:V}}),r?.(z,l,w),_(z,{origin:"throw",thrown:V})}if(!D.ok){let V=performance.now()-C,z=F(D.error,{origin:"result",resultCause:D.cause});throw a({type:"step_error",workflowId:n,stepId:s,stepKey:o,name:l,ts:Date.now(),durationMs:V,error:z}),o&&a({type:"step_complete",workflowId:n,stepKey:o,name:l,ts:Date.now(),durationMs:V,result:D,meta:{origin:"result",resultCause:D.cause}}),r?.(z,l,w),_(z,{origin:"result",resultCause:D.cause})}let m=D.value,I,B,J=!1;try{I=await A.use(m)}catch(V){if(q(V)){try{await A.release(m)}catch(z){console.warn(`[awaitly] step.withResource("${E}"): release threw after earlyExit:`,z)}throw V}B=V,J=!0}try{await A.release(m)}catch(V){console.warn(`[awaitly] step.withResource("${E}"): release threw:`,V)}if(J){let V;try{V=O(B)}catch(N){throw Oe(N)}let z=performance.now()-C;throw a({type:"step_error",workflowId:n,stepId:s,stepKey:o,name:l,ts:Date.now(),durationMs:z,error:V}),o&&a({type:"step_complete",workflowId:n,stepKey:o,name:l,ts:Date.now(),durationMs:z,result:W(V,{cause:B}),meta:{origin:"throw",thrown:B}}),r?.(V,l,w),_(V,{origin:"throw",thrown:B})}let Z=I;if(Z.ok){let V=performance.now()-C;return a({type:"step_success",workflowId:n,stepId:s,stepKey:o,name:l,ts:Date.now(),durationMs:V}),o&&a({type:"step_complete",workflowId:n,stepKey:o,name:l,ts:Date.now(),durationMs:V,result:Z}),Z.value}let j=performance.now()-C,Q=F(Z.error,{origin:"result",resultCause:Z.cause});throw a({type:"step_error",workflowId:n,stepId:s,stepKey:o,name:l,ts:Date.now(),durationMs:j,error:Q}),o&&a({type:"step_complete",workflowId:n,stepKey:o,name:l,ts:Date.now(),durationMs:j,result:Z,meta:{origin:"result",resultCause:Z.cause}}),r?.(Q,l,w),_(Q,{origin:"result",resultCause:Z.cause})})()};let de=await e({step:S});if(process.env.NODE_ENV!=="production"&&de!==null&&typeof de=="object"&&"ok"in de&&typeof de.ok=="boolean"){let E=de;(E.ok===!0&&"value"in E||E.ok===!1&&"error"in E)&&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 G(de)}catch(S){if(Nt(S))throw S.thrown;if(q(S)){let pe=S.meta.origin==="throw"?S.meta.thrown:S.meta.origin==="result"?S.meta.resultCause:void 0;return W(S.error,{cause:pe})}let le=O(S);return r?.(le,"unexpected",w),W(le,{cause:S})}}$e.strict=(e,t)=>$e(e,t);async function yt(e){return e.length===0?G([]):new Promise(t=>{let r=!1,p=e.length,d=new Array(e.length);for(let c=0;c<e.length;c++){let x=c;Promise.resolve(e[x]).catch(w=>W({type:"PROMISE_REJECTED",cause:w},{cause:{type:"PROMISE_REJECTION",reason:w}})).then(w=>{if(!r){if(!w.ok){r=!0,t(w);return}d[x]=w.value,p--,p===0&&t(G(d))}})}})}var Ke=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 Ft(e){return typeof e=="object"&&e!==null&&e.type==="CIRCUIT_OPEN"}var jt={failureThreshold:5,resetTimeout:3e4,windowSize:6e4,halfOpenMax:3};function Kt(e,t){let r={...jt,...t},p="CLOSED",d=[],c=null,x=null,w=0,P=0;function n(){let _=Date.now();d=d.filter(q=>_-q.timestamp<r.windowSize)}function O(_){if(p!==_){let q=p;p=_,_==="HALF_OPEN"&&(P=0),r.onStateChange?.(q,_,e)}}function f(){return p!=="OPEN"||c===null?!1:Date.now()-c>=r.resetTimeout?(O("HALF_OPEN"),!0):!1}function i(){x=Date.now(),w++,p==="HALF_OPEN"&&(P++,P>=r.halfOpenMax&&(O("CLOSED"),d=[]))}function T(_){let q=Date.now();c=q,n(),d.push({timestamp:q,error:_}),(p==="HALF_OPEN"||p==="CLOSED"&&d.length>=r.failureThreshold)&&O("OPEN")}function a(){if(p==="CLOSED")return 0;if(p==="OPEN"){if(f())return 0;let _=Date.now(),q=c?_-c:0;return Math.max(0,r.resetTimeout-q)}return 0}return{async execute(_,q){let F=a();if(F>0)throw new Ke({circuitName:e,state:p,retryAfterMs:F});try{let ie=await _();return i(),ie}catch(ie){throw T(ie),ie}},async executeResult(_,q){let F=a();if(F>0)return W(new Ke({circuitName:e,state:p,retryAfterMs:F}));try{let ie=await _();return ie.ok?i():T(ie.error),ie}catch(ie){throw T(ie),ie}},getState(){return p==="OPEN"&&f(),p},getStats(){return n(),{state:this.getState(),failureCount:d.length,successCount:w,lastFailureTime:c,lastSuccessTime:x,halfOpenSuccesses:P}},reset(){O("CLOSED"),d=[],P=0},forceOpen(){c=Date.now(),O("OPEN")},recordSuccess(){i()},recordFailure(_){T(_??new Error("Manual failure"))}}}var Bt={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 Vt(e){return typeof e=="object"&&e!==null&&e.type==="RATE_LIMIT_EXCEEDED"}function Tt(e){return typeof e=="object"&&e!==null&&e.type==="QUEUE_FULL"}function Rt(e,t){let{maxPerSecond:r,strategy:p="wait"}=t,d=t.burstCapacity??r*2,c=d,x=Date.now(),w=r/1e3,P=[];function n(){let i=Date.now(),a=(i-x)*w;c=Math.min(d,c+a),x=i}function O(){if(n(),c>=1)return c-=1,0;let i=1-c;return Math.ceil(i/w)}async function f(){return new Promise(i=>{let T=()=>{let a=O();a===0?i():(P.push(T),setTimeout(()=>{let _=P.indexOf(T);_!==-1&&(P.splice(_,1),T())},a))};T()})}return{async execute(i){let T=O();if(T>0){if(p==="reject")throw{type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:T};await f()}return i()},async executeResult(i){let T=O();if(T>0){if(p==="reject")return W({type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:T});await f()}return i()},getStats(){return n(),{availableTokens:Math.floor(c),maxTokens:d,tokensPerSecond:r,waitingCount:P.length}},reset(){c=d,x=Date.now(),P.length=0}}}function xt(e,t){let{maxConcurrent:r,strategy:p="queue",maxQueueSize:d=1/0}=t,c=0,x=[];async function w(){if(c<r){c++;return}if(p==="reject")throw{type:"QUEUE_FULL",limiterName:e,queueSize:x.length,maxQueueSize:d};if(x.length>=d)throw{type:"QUEUE_FULL",limiterName:e,queueSize:x.length,maxQueueSize:d};return new Promise((n,O)=>{x.push({resolve:n,reject:O})})}function P(){c--,x.length>0&&c<r&&(c++,x.shift()?.resolve())}return{async execute(n){await w();try{return await n()}finally{P()}},async executeAll(n){let O=new Array(n.length),f=[];for(let i=0;i<n.length;i++){let T=i,a=this.execute(n[T]).then(_=>{O[T]=_});f.push(a)}return await Promise.all(f),O},async executeResult(n){try{await w()}catch(O){if(Tt(O))return W(O);throw O}try{return await n()}finally{P()}},getStats(){return{activeCount:c,maxConcurrent:r,queueSize:x.length,maxQueueSize:d}},reset(){for(c=0;x.length>0;)x.shift()?.reject(new Error("Limiter reset"))}}}function $t(e,t){let r=t.rate?Rt(`${e}-rate`,t.rate):void 0,p=t.concurrency?xt(`${e}-concurrency`,t.concurrency):void 0;return{rate:r,concurrency:p,async execute(d){let c=d;if(r){let x=c;c=()=>r.execute(x)}return p?p.execute(c):c()}}}function Ht(e,t){let{limit:r,windowMs:p=1e3,strategy:d="wait"}=t,c=Date.now(),x=0,w=[];function P(){let f=Date.now(),i=f-c;return i>=p?(c=f,x=0,0):p-i}function n(f){let i=P();return x+f<=r?(x+=f,0):i}async function O(f){return new Promise(i=>{let T=()=>{let a=n(f);a===0?i():(w.push({resolve:T,cost:f}),setTimeout(()=>{let _=w.findIndex(q=>q.resolve===T);_!==-1&&(w.splice(_,1),T())},a))};T()})}return{async execute(f,i=1){if(i>r)throw{type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:p};let T=n(i);if(T>0){if(d==="reject")throw{type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:T};await O(i)}return f()},async executeResult(f,i=1){if(i>r)return W({type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:p});let T=n(i);if(T>0){if(d==="reject")return W({type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:T});await O(i)}return f()},getStats(){let f=P();return{requestCount:x,limit:r,windowMs:p,remainingMs:f,waitingCount:w.length}},reset(){c=Date.now(),x=0,w.length=0}}}function qt(e,t){let{tokensPerSecond:r,strategy:p="wait"}=t,d=t.maxTokens??r*2,c=d,x=Date.now(),w=r/1e3,P=[];function n(){let i=Date.now(),a=(i-x)*w;c=Math.min(d,c+a),x=i}function O(i){if(n(),c>=i)return c-=i,0;let T=i-c;return Math.ceil(T/w)}async function f(i){return new Promise(T=>{let a=()=>{let _=O(i);_===0?T():(P.push({check:a,cost:i}),setTimeout(()=>{let q=P.findIndex(F=>F.check===a);q!==-1&&(P.splice(q,1),a())},_))};a()})}return{async execute(i,T=1){if(T>d)throw{type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:Math.ceil(T/w)};let a=O(T);if(a>0){if(p==="reject")throw{type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:a};await f(T)}return i()},async executeResult(i,T=1){if(T>d)return W({type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:Math.ceil(T/w)});let a=O(T);if(a>0){if(p==="reject")return W({type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:a});await f(T)}return i()},getStats(){return n(),{availableTokens:c,maxTokens:d,tokensPerSecond:r,waitingCount:P.length}},reset(){c=d,x=Date.now(),P.length=0}}}var zt={api:{maxPerSecond:10,burstCapacity:20,strategy:"wait"},database:{maxConcurrent:10,strategy:"queue",maxQueueSize:100},external:{maxPerSecond:5,burstCapacity:10,strategy:"wait"}};var Jt="STREAM_WRITE_ERROR",Yt="STREAM_READ_ERROR",Qt="STREAM_CLOSE_ERROR";var Xt="STREAM_ENDED";function qe(e,t,r){return{type:Jt,reason:e,message:t,...r!==void 0?{cause:r}:{}}}function Ge(e,t,r){return{type:Yt,reason:e,message:t,...r!==void 0?{cause:r}:{}}}function Ze(e,t,r){return{type:Qt,reason:e,message:t,...r!==void 0?{cause:r}:{}}}function ze(e){return{type:Xt,finalPosition:e}}function ht(e={}){let t=e.highWaterMark??16,r=e.lowWaterMark??Math.floor(t/2),p=e.onStateChange,d="flowing",c=0,x=[];function w(n){if(d!==n&&(d=n,p?.(n),n==="flowing"&&x.length>0)){let O=x;x=[];for(let f of O)f()}}function P(){d==="flowing"&&c>=t?w("paused"):d==="paused"&&c<=r&&w("flowing")}return{get state(){return d},get bufferedCount(){return c},get highWaterMark(){return t},get lowWaterMark(){return r},increment(){c++,P()},decrement(){c>0&&(c--,P())},setCount(n){c=Math.max(0,n),P()},waitForDrain(){return d==="flowing"?Promise.resolve():new Promise(n=>{x.push(n)})},reset(){c=0,x=[],w("flowing")}}}function Gt(e){return{_tag:"Duration",millis:e}}function Zt(e){return{_tag:"Duration",millis:e*1e3}}function er(e){return{_tag:"Duration",millis:e*60*1e3}}function tr(e){return{_tag:"Duration",millis:e*60*60*1e3}}function rr(e){return{_tag:"Duration",millis:e*24*60*60*1e3}}function St(e){return e.millis}function Ct(e){let t=e.trim().match(/^(\d+(?:\.\d+)?)\s*(ms|s|m|h|d)$/i);if(!t)return;let r=parseFloat(t[1]);switch(t[2].toLowerCase()){case"ms":return Gt(r);case"s":return Zt(r);case"m":return er(r);case"h":return tr(r);case"d":return rr(r);default:return}}function bt(e){return e.type==="step_complete"}function et(e){return typeof e=="object"&&e!==null&&e.type==="WORKFLOW_CANCELLED"}function At(){let e=new Map;return{handleEvent:t=>{bt(t)&&e.set(t.stepKey,{result:t.result,meta:t.meta})},getResumeState:()=>({steps:new Map(e)}),clear:()=>e.clear()}}function nr(e){return typeof e=="object"&&e!==null&&e.__cachedMeta===!0}function Ae(e,t,r){return W(e,{cause:{__cachedMeta:!0,originalCause:r,meta:t}})}function Be(e){return nr(e)?e.meta:{origin:"result",resultCause:e}}async function vt(e,t){let r=e["~standard"].validate(t),p=r instanceof Promise?await r:r;return p.issues?W({type:"INPUT_VALIDATION_ERROR",issues:p.issues.map(d=>({message:d.message,path:d.path?.map(c=>typeof c=="object"?c.key:c)})),message:`Input validation failed: ${p.issues.map(d=>d.message).join(", ")}`}):G(p.value)}function tt(e,t){let r=p=>((...d)=>{let c=d.at(-1),x=d.length>0&&typeof c=="object"&&c!==null&&!Array.isArray(c)&&typeof c!="function",w=x?c:void 0,P=x?d.slice(0,-1):d,n={...t,...w?.deps??{}},O=w?{...w,deps:n}:{deps:n};return e[p](...P,O)});return{run:r("run"),runWithState:r("runWithState"),withDeps(p){return tt(e,{...t,...p})}}}var Je=class extends Error{constructor(r,p,d){super(r);this.stepId=p;this.originalError=d;this.name="SnapshotDecodeError"}};function rt(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=rt(e.cause)),t}return e.value!==void 0?e.value:e.stringRepresentation}function Pt(e,t,r){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 p=t??{},d=r;async function c(n,O,f){let i=n??crypto.randomUUID(),T=f?.deps?{...p,...f.deps}:p,a=[],_=f?.createContext??d?.createContext,q=_?await _():void 0,F=f?.signal??d?.signal,ie=f?.onEvent??d?.onEvent,_e=f?.onError??d?.onError,De=f?.shouldRun??d?.shouldRun,Re=f?.onBeforeStart??d?.onBeforeStart,S=f?.onAfterStep??d?.onAfterStep,le=f?.resumeState??d?.resumeState,pe=d?.catchUnexpected??He,ge={},ve=(f?.devWarnings??d?.devWarnings)===!0&&process.env.NODE_ENV!=="production",de=new Set,E=new Set,A={workflowId:i,onEvent:ie,context:q!==void 0?q:void 0,signal:F,input:{},ref:u=>ge[u],set:(u,g)=>{ve&&!de.has(u)&&(de.add(u),console.warn(`awaitly: ctx.set('${u}', ...) is deprecated for static analysis. Use step('id', fn, { out: '${u}' }) instead.`)),ge[u]=g},get:u=>(ve&&!E.has(u)&&(E.add(u),console.warn(`awaitly: ctx.get('${u}') is deprecated for static analysis. Use ctx.ref('${u}') instead for tracked dependencies.`)),ge[u])},o=u=>{let g=u.context!==void 0||q===void 0?u:{...u,context:q},y=g.workflowName===void 0?{...g,workflowName:e}:g;ie?.(y,q)},l=(u,g)=>{let y={type:"WORKFLOW_CANCELLED",reason:u,lastStepKey:g};return W(pe(y),{cause:y})};if(F?.aborted){let u=typeof F.reason=="string"?F.reason:F.reason instanceof Error?F.reason.message:void 0;return o({type:"workflow_cancelled",workflowId:i,ts:Date.now(),durationMs:0,reason:u}),l(u)}if(De){let u=performance.now();try{let g=await De(i,q),y=performance.now()-u;if(o({type:"hook_should_run",workflowId:i,ts:Date.now(),durationMs:y,result:g,skipped:!g}),!g){let Y=new Error("Workflow skipped by shouldRun hook");return W(pe(Y),{cause:Y})}}catch(g){let y=performance.now()-u;return o({type:"hook_should_run_error",workflowId:i,ts:Date.now(),durationMs:y,error:g}),W(pe(g),{cause:g})}}if(Re){let u=performance.now();try{let g=await Re(i,q),y=performance.now()-u;if(o({type:"hook_before_start",workflowId:i,ts:Date.now(),durationMs:y,result:g,skipped:!g}),!g){let Y=new Error("Workflow skipped by onBeforeStart hook");return W(pe(Y),{cause:Y})}}catch(g){let y=performance.now()-u;return o({type:"hook_before_start_error",workflowId:i,ts:Date.now(),durationMs:y,error:g}),W(pe(g),{cause:g})}}let s=d?.inputSchema,k=d?.input;if(s){let u=await vt(s,k);if(!u.ok)return W(u.error);A.input=u.value}else k!==void 0&&(A.input=k);let C=Date.now(),D=performance.now();o({type:"workflow_start",workflowId:i,ts:C});let m=f?.cache??d?.cache,I=f?.streamStore??d?.streamStore;if(le&&!m&&(m=new Map),le&&m){let u=typeof le=="function"?await le():le;u.steps instanceof Map||(console.warn(`awaitly: resumeState.steps is not a Map (got ${typeof u.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 u.steps=="object"&&u.steps!==null&&(u.steps=new Map(Object.entries(u.steps))));for(let[g,y]of u.steps){let{result:Y,meta:R}=y;if(Y.ok)m.set(g,Y);else{let v=R??{origin:"result",resultCause:Y.cause};m.set(g,Ae(Y.error,v,Y.cause))}}}let B=f?.snapshot??d?.snapshot,J=d?.serialization;if(B&&!le){m||(m=new Map);let u=B,g=J?.decode;for(let[y,Y]of Object.entries(u.steps))if(Object.prototype.hasOwnProperty.call(u.steps,y))try{if(Y.ok){let R=g?g(Y.value):Y.value;m.set(y,G(R))}else{let R=g?g(Y.error):Y.error,v=rt(Y.cause),b=Y.meta?.origin==="throw"?{origin:"throw",thrown:v}:{origin:"result",resultCause:v};m.set(y,Ae(R,b,v))}}catch(R){throw new Je(`Failed to decode step "${y}": ${R instanceof Error?R.message:String(R)}`,y,R instanceof Error?R:void 0)}}let Z=!1,j,Q,V=()=>{Z=!0,j=typeof F?.reason=="string"?F.reason:F?.reason instanceof Error?F.reason.message:void 0};F&&!F.aborted&&F.addEventListener("abort",V,{once:!0});let z=()=>{if(Z||F?.aborted)throw{type:"WORKFLOW_CANCELLED",reason:j??(typeof F?.reason=="string"?F.reason:F?.reason instanceof Error?F.reason.message:void 0),lastStepKey:Q}},N=async(u,g,y)=>{if(!S)return;let Y=performance.now();try{await S(u,g,i,q);let R=performance.now()-Y;o({type:"hook_after_step",workflowId:i,stepKey:u,ts:Date.now(),durationMs:R})}catch(R){let v=performance.now()-Y;throw o({type:"hook_after_step_error",workflowId:i,stepKey:u,ts:Date.now(),durationMs:v,error:R}),R}},xe=u=>{let g=async(R,v,b)=>{if(typeof R!="string")throw new Error('[awaitly] step() requires a string ID as the first argument. Example: step("fetchUser", () => fetchUser(id))');let U=R,M=b??{},K=U,h=Object.prototype.hasOwnProperty.call(M,"key")?M.key:U,{ttl:$,out:te}=M;z();let ee=Xe(M);if(h&&m&&m.has(h)){o({type:"step_cache_hit",workflowId:i,stepKey:h,name:K,ts:Date.now(),...ee&&{metadata:ee}});let L=m.get(h);if(L.ok)return Q=h,te&&(ge[te]=L.value),L.value;let H=Be(L.cause);throw Se(L.error,H)}h&&m&&o({type:"step_cache_miss",workflowId:i,stepKey:h,name:K,ts:Date.now(),...ee&&{metadata:ee}});try{let L=await u(U,v,M);return te&&(ge[te]=L),M.compensate&&a.push({stepName:K,value:L,compensate:M.compensate}),h&&(Q=h,m&&m.set(h,G(L),$?{ttl:$}:void 0),await N(h,G(L))),L}catch(L){if(h&&Te(L)){let H=L,se=H.meta.origin==="result"?H.meta.resultCause:H.meta.origin==="throw"?H.meta.thrown:void 0,X=Ae(H.error,H.meta,se);m&&m.set(h,X,$?{ttl:$}:void 0),await N(h,X,H.meta)}throw L}};g.try=async(R,v,b)=>{let{ttl:U}=b,M=b.key??R,K=R;if(m&&m.has(M)){o({type:"step_cache_hit",workflowId:i,stepKey:M,name:K,ts:Date.now()});let h=m.get(M);if(h.ok)return h.value;let $=Be(h.cause);throw Se(h.error,$)}m&&o({type:"step_cache_miss",workflowId:i,stepKey:M,name:K,ts:Date.now()});try{let h=await u.try(R,v,{...b,key:M});return b.compensate&&a.push({stepName:K,value:h,compensate:b.compensate}),m&&m.set(M,G(h),U?{ttl:U}:void 0),await N(M,G(h)),h}catch(h){if(Te(h)){let $=h,te=$.meta.origin==="result"?$.meta.resultCause:$.meta.origin==="throw"?$.meta.thrown:void 0,ee=Ae($.error,$.meta,te);m&&m.set(M,ee,U?{ttl:U}:void 0),await N(M,ee,$.meta)}throw h}},g.fromResult=async(R,v,b)=>{let{ttl:U}=b,M=b.key??R,K=R;if(m&&m.has(M)){o({type:"step_cache_hit",workflowId:i,stepKey:M,name:K,ts:Date.now()});let h=m.get(M);if(h.ok)return h.value;let $=Be(h.cause);throw Se(h.error,$)}m&&o({type:"step_cache_miss",workflowId:i,stepKey:M,name:K,ts:Date.now()});try{let h=await u.fromResult(R,v,{...b,key:M});return m&&m.set(M,G(h),U?{ttl:U}:void 0),await N(M,G(h)),h}catch(h){if(Te(h)){let $=h,te=$.meta.origin==="result"?$.meta.resultCause:$.meta.origin==="throw"?$.meta.thrown:void 0,ee=Ae($.error,$.meta,te);m&&m.set(M,ee,U?{ttl:U}:void 0),await N(M,ee,$.meta)}throw h}},g.race=u.race,g.withFallback=async(R,v,b)=>{let U=b.key??R,M=R;if(m&&m.has(U)){o({type:"step_cache_hit",workflowId:i,stepKey:U,name:M,ts:Date.now()});let K=m.get(U);if(K.ok)return K.value;let h=Be(K.cause);throw Se(K.error,h)}m&&o({type:"step_cache_miss",workflowId:i,stepKey:U,name:M,ts:Date.now()});try{let K=await u.withFallback(R,v,b);return m&&m.set(U,G(K)),await N(U,G(K)),K}catch(K){if(Te(K)){let h=K,$=h.meta.origin==="result"?h.meta.resultCause:h.meta.origin==="throw"?h.meta.thrown:void 0,te=Ae(h.error,h.meta,$);m&&m.set(U,te),await N(U,te,h.meta)}throw K}},g.withResource=async(R,v)=>{let b=R;try{let U=await u.withResource(R,v);return await N(b,G(U)),U}catch(U){if(Te(U)){let M=U,K=M.meta.origin==="result"?M.meta.resultCause:M.meta.origin==="throw"?M.meta.thrown:void 0,h=Ae(M.error,M.meta,K);await N(b,h,M.meta)}throw U}},g.retry=(R,v,b)=>{let U={key:b.key,retry:{attempts:b.attempts,backoff:b.backoff,initialDelay:b.initialDelay,maxDelay:b.maxDelay,jitter:b.jitter,shouldRetry:b.shouldRetry,onRetry:b.onRetry},timeout:b.timeout,ttl:b.ttl};return g(R,v,U)},g.withTimeout=(R,v,b)=>{let U={key:b.key,timeout:b,ttl:b.ttl};return g(R,v,U)},g.sleep=(R,v,b)=>{if(typeof R!="string"||R.length===0)throw new Error('[awaitly] step.sleep() requires an explicit string ID as the first argument. Example: step.sleep("delay", "5s")');let U=typeof v=="string"?Ct(v):v;if(!U)throw new Error(`step.sleep: invalid duration '${v}'`);let M=St(U),K=b?.signal;return g(R,async()=>{if(F?.aborted||K?.aborted){let $=new Error("Sleep aborted");throw $.name="AbortError",$}return new Promise(($,te)=>{let ee={timeoutId:void 0},L=()=>{ee.timeoutId&&clearTimeout(ee.timeoutId);let H=new Error("Sleep aborted");H.name="AbortError",te(H)};F?.addEventListener("abort",L,{once:!0}),K?.addEventListener("abort",L,{once:!0}),ee.timeoutId=setTimeout(()=>{F?.removeEventListener("abort",L),K?.removeEventListener("abort",L),$(G(void 0))},M)})},{key:b?.key,ttl:b?.ttl,description:b?.description})};let y=new Map,Y=new Map;return g.getWritable=R=>{let v=R?.namespace??"default",b=R?.highWaterMark??16;if(!I)throw new Error("streamStore is required to use getWritable(). Pass a streamStore to createWorkflow options.");let U=`${i}:${v}`,M=y.get(U);if(M&&!M.closed&&!M.aborted)return M.writer;let K=ht({highWaterMark:b,onStateChange:H=>{o({type:"stream_backpressure",workflowId:i,namespace:v,bufferedCount:K.bufferedCount,state:H,ts:Date.now()})}}),h=0,$=!0,te=!1,ee=!1;o({type:"stream_created",workflowId:i,namespace:v,ts:Date.now()});let L={async write(H){if(ee)return W(qe("closed","Stream is closed"));if(te)return W(qe("aborted","Stream was aborted"));K.state==="paused"&&await K.waitForDrain();let se={value:H,position:h,ts:Date.now()},X=await I.append(i,v,se);return X.ok?(o({type:"stream_write",workflowId:i,namespace:v,position:h,ts:Date.now()}),h++,K.increment(),G(void 0)):(o({type:"stream_error",workflowId:i,namespace:v,error:X.error,position:h,ts:Date.now()}),W(qe("store_error",X.error.message,X.error)))},async close(){if(ee)return W(Ze("already_closed","Stream is already closed"));let H=await I.closeStream(i,v);return H.ok?(ee=!0,$=!1,o({type:"stream_close",workflowId:i,namespace:v,finalPosition:h,ts:Date.now()}),y.delete(U),G(void 0)):W(Ze("store_error",H.error.message,H.error))},abort(H){te=!0,$=!1,ee=!0,o({type:"stream_error",workflowId:i,namespace:v,error:H,position:h,ts:Date.now()}),y.delete(U)},get writable(){return $},get position(){return h},get namespace(){return v}};return y.set(U,{writer:L,backpressure:K,aborted:te,closed:ee}),L},g.getReadable=R=>{let v=R?.namespace??"default",b=R?.startIndex??0,U=R?.pollInterval??10,M=R?.pollTimeout??3e4;if(!I)throw new Error("streamStore is required to use getReadable(). Pass a streamStore to createWorkflow options.");let K=`${i}:${v}:${b}`,h=Y.get(K);if(h&&!h.closed)return h.reader;let $=()=>{let he=`${i}:${v}`,ne=y.get(he);ne&&ne.backpressure.decrement()},te=b,ee=!0,L=!1,H=[],se=0,X={async read(){if(L)return W(Ge("closed","Reader is closed"));if(se<H.length){let ce=H[se++];return te=ce.position+1,$(),o({type:"stream_read",workflowId:i,namespace:v,position:ce.position,ts:Date.now()}),G(ce.value)}let he=`${i}:${v}`,ne=Date.now(),ue=y.has(he),re=await I.getMetadata(i,v),ae=re.ok&&re.value!==void 0;for(;Date.now()-ne<M;){let ce=await I.read(i,v,te,100);if(!ce.ok)return W(Ge("store_error",ce.error.message,ce.error));let We=ce.value;if(We.length>0){H=We,se=1;let Fe=We[0];return te=Fe.position+1,$(),o({type:"stream_read",workflowId:i,namespace:v,position:Fe.position,ts:Date.now()}),G(Fe.value)}let Le=y.has(he),be=await I.getMetadata(i,v),nt=be.ok&&be.value!==void 0;if(Le&&(ue=!0),nt&&(ae=!0),be.ok&&be.value?.closed)return ee=!1,W(ze(te));if(ue&&!Le&&!nt)return ee=!1,W(ze(te));ae&&!Le&&be.ok&&be.value?.closed,await new Promise(Fe=>setTimeout(Fe,U))}return ee=!1,W(ze(te))},close(){L=!0,ee=!1,H=[],Y.delete(K)},get readable(){return ee},get position(){return te},get namespace(){return v}};return Y.set(K,{reader:X,position:te,closed:L}),X},g.streamForEach=async(R,v,b)=>{let U=b?.checkpointInterval??1,M=b?.concurrency??1,K=[],h=0,$=-1,te=L=>typeof L=="object"&&L!==null&&"read"in L&&typeof L.read=="function",ee=async(L,H,se,X)=>{let ne=U>0&&H%U===0?`stream-foreach:${X}:pos-${se}`:void 0,ue=ne??`stream-item-${se}`,re=await g(ue,()=>v(L,H),{key:ne});return{index:H,position:se,result:re}};if(te(R))if(M<=1){let L=R.position,H=await R.read();for(;H.ok;){let se=H.value,{result:X}=await ee(se,h,L,R.namespace);K.push(X),$=L,h++,L=R.position,H=await R.read()}}else{let L=new Map,H=0,se=0,X=new Array(M).fill(null),he=async()=>{for(let ce=0;ce<X.length;ce++)if(X[ce]===null)return ce;let re=X.filter(ce=>ce!==null),ae=await Promise.race(re);return L.set(ae.index,{position:ae.position,result:ae.result}),X[ae.slotIndex]=null,ae.slotIndex},ne=R.position,ue=await R.read();for(;ue.ok;){let re=await he(),ae=H,ce=ne,We=ue.value,Le=re;X[re]=ee(We,ae,ce,R.namespace).then(be=>({slotIndex:Le,...be})),se++,H++,ne=R.position,ue=await R.read()}for(let re=0;re<X.length;re++)if(X[re]!==null){let ae=await X[re];L.set(ae.index,{position:ae.position,result:ae.result})}for(let re=0;re<se;re++){let ae=L.get(re);ae&&(K.push(ae.result),$=ae.position,h++)}}else if(M<=1){let L=0;for await(let H of R){let{result:se}=await ee(H,L,L,"async-iterable");K.push(se),$=L,h++,L++}}else{let L=new Map,H=0,se=0,X=new Array(M).fill(null),he=async()=>{for(let re=0;re<X.length;re++)if(X[re]===null)return re;let ne=X.filter(re=>re!==null),ue=await Promise.race(ne);return L.set(ue.index,ue.result),X[ue.slotIndex]=null,ue.slotIndex};for await(let ne of R){let ue=await he(),re=H,ae=ue;X[ue]=ee(ne,re,re,"async-iterable").then(ce=>({slotIndex:ae,...ce})),se++,H++}for(let ne=0;ne<X.length;ne++)if(X[ne]!==null){let ue=await X[ne];L.set(ue.index,ue.result)}for(let ne=0;ne<se;ne++)L.has(ne)&&(K.push(L.get(ne)),$=ne,h++)}return{results:K,processedCount:h,lastPosition:$}},g.if=u.if,g.label=u.label,g.branch=u.branch,g.arm=u.arm,g.forEach=u.forEach,g.item=u.item,g.dep=u.dep,g.workflow=(R,v,b)=>g(R,v,b),g.all=(R,v,b)=>{let U=b!==void 0&&Object.prototype.hasOwnProperty.call(b,"key")?b:{...b,key:void 0};return g(R,async()=>G(await u.all(R,v)),U)},g.map=(R,v,b,U)=>{let M=U!==void 0&&Object.prototype.hasOwnProperty.call(U,"key")?U:{...U,key:void 0};return g(R,async()=>G(await u.map(R,v,b,U)),M)},g},ke=({step:u})=>O({step:xe(u),deps:T,ctx:A}),oe;try{oe=await $e(ke,{onError:_e,onEvent:ie,catchUnexpected:pe,workflowId:i,workflowName:e,context:q,_workflowSignal:F})}finally{F&&F.removeEventListener("abort",V)}if(!oe.ok&&a.length>0){let u=[];for(let g=a.length-1;g>=0;g--){let y=a[g];try{await y.compensate(y.value)}catch(Y){u.push({stepName:y.stepName,error:Y})}}if(u.length>0){let g={type:"SAGA_COMPENSATION_ERROR",originalError:oe.error,compensationErrors:u};oe=W(g,{cause:oe.cause})}}let Ce=performance.now()-D;if(!oe.ok){let u;if(et(oe.cause)&&(u=oe.cause),!u&&Z&&wt(oe.error)){let g=oe.cause;g!=null&&typeof g=="object"&&"name"in g&&g.name==="AbortError"&&(u={type:"WORKFLOW_CANCELLED",reason:j??(typeof F?.reason=="string"?F.reason:F?.reason instanceof Error?F.reason.message:void 0),lastStepKey:Q})}if(u)return o({type:"workflow_cancelled",workflowId:i,ts:Date.now(),durationMs:Ce,reason:u.reason,lastStepKey:u.lastStepKey}),u&&!et(oe.cause)?W(oe.error,{cause:u}):oe}if(oe.ok&&Z){let u=j??(typeof F?.reason=="string"?F.reason:F?.reason instanceof Error?F.reason.message:void 0);o({type:"workflow_cancelled",workflowId:i,ts:Date.now(),durationMs:Ce,reason:u,lastStepKey:Q});let g={type:"WORKFLOW_CANCELLED",reason:u,lastStepKey:Q};return W(pe(g),{cause:g})}return oe.ok?o({type:"workflow_success",workflowId:i,ts:Date.now(),durationMs:Ce}):o({type:"workflow_error",workflowId:i,ts:Date.now(),durationMs:Ce,error:oe.error}),oe}function x(n,O,f){let i,T,a;return typeof n=="string"?(i=n,T=O,a=f):(T=n,a=O),c(i,T,a)}async function w(n,O,f){let i,T,a;typeof n=="string"?(i=n,T=O,a=f):(T=n,a=O);let _=At(),q=a?.onEvent,ie={...a,onEvent:(Re,S)=>{_.handleEvent(Re);try{q?.(Re,S)}catch{}}},_e,De;try{_e=await c(i,T,ie)}catch(Re){let S=d?.catchUnexpected??He;_e=W(S(Re),{cause:Re})}finally{De=_.getResumeState()}return{result:_e,resumeState:De}}let P={withDeps:n=>tt(P,n),run:x,runWithState:w};return P}function or(e){return typeof e=="object"&&e!==null&&e.type==="SAGA_COMPENSATION_ERROR"}function sr(e,t,r){return Pt(e,t,r)}async function ar(e,t){let r=crypto.randomUUID(),p=performance.now(),d=[],c=n=>t?.onEvent?.(n);c({type:"saga_start",sagaId:r,ts:Date.now()});let P=Object.assign(async(n,O,f)=>{if(typeof n!="string"||n.length===0)throw new TypeError("step(name, operation, options?): first argument must be a string.");let i=await O();if(i.ok)return f?.compensate&&d.push({name:n,value:i.value,compensate:f.compensate}),i.value;throw Se(i.error,{origin:"result",resultCause:i.cause})},{try:async(n,O,f)=>{if(typeof n!="string"||n.length===0)throw new TypeError("step.try(name, operation, options): first argument must be a string.");let i="error"in f?()=>f.error:f.onError;try{let T=await O();return f.compensate&&d.push({name:n,value:T,compensate:f.compensate}),T}catch(T){let a=i(T);throw Se(a,{origin:"throw",thrown:T})}}});try{let n=await e({step:P});return c({type:"saga_success",sagaId:r,ts:Date.now(),durationMs:performance.now()-p}),G(n)}catch(n){let O=performance.now()-p,f=Te(n)?n.error:n;c({type:"saga_error",sagaId:r,ts:Date.now(),durationMs:O,error:f}),c({type:"saga_compensation_start",sagaId:r,ts:Date.now(),stepCount:d.length});let i=performance.now(),T=[];for(let a=d.length-1;a>=0;a--){let _=d[a];try{await _.compensate(_.value),c({type:"saga_compensation_step",sagaId:r,stepName:_.name,ts:Date.now(),success:!0})}catch(q){T.push({stepName:_.name,error:q}),c({type:"saga_compensation_step",sagaId:r,stepName:_.name,ts:Date.now(),success:!1,error:q})}}if(c({type:"saga_compensation_end",sagaId:r,ts:Date.now(),durationMs:performance.now()-i,success:T.length===0,failedCount:T.length}),T.length>0){let a={type:"SAGA_COMPENSATION_ERROR",originalError:f,compensationErrors:T};if(t?.onError?.(a),t?.throwOnCompensationFailure)throw a;return W(a)}return t?.onError?.(f),Te(n)?W(f):W(new Pe({cause:n}))}}function fe(...e){let t={};for(let r of e)r.key!==void 0&&(t.key=r.key),r.retry!==void 0&&(t.retry=t.retry?{...t.retry,...r.retry}:{...r.retry}),r.timeout!==void 0&&(t.timeout=t.timeout?{...t.timeout,...r.timeout}:{...r.timeout});return t}function ir(...e){let t=fe(...e);return r=>fe(t,r??{})}function ur(e,...t){return{name:e,policy:fe(...t)}}function we(e){return{retry:e}}var Ne={none:we({attempts:1}),transient:we({attempts:3,backoff:"exponential",initialDelay:100,maxDelay:1e3,jitter:!0}),standard:we({attempts:3,backoff:"exponential",initialDelay:200,maxDelay:5e3,jitter:!0}),aggressive:we({attempts:5,backoff:"exponential",initialDelay:500,maxDelay:3e4,jitter:!0}),fixed:(e,t)=>we({attempts:e,backoff:"fixed",initialDelay:t,jitter:!1}),linear:(e,t)=>we({attempts:e,backoff:"linear",initialDelay:t,jitter:!0}),custom:e=>we({backoff:"exponential",initialDelay:100,maxDelay:3e4,jitter:!0,...e})};function ye(e){return{timeout:e}}var Ue={none:{},fast:ye({ms:1e3}),api:ye({ms:5e3}),extended:ye({ms:3e4}),long:ye({ms:12e4}),ms:e=>ye({ms:e}),seconds:e=>ye({ms:e*1e3}),withError:(e,t)=>ye({ms:e,error:t}),withSignal:e=>ye({ms:e,signal:!0})},cr={httpApi:fe(Ue.api,Ne.standard),database:fe(Ue.extended,we({attempts:2,backoff:"exponential",initialDelay:100,maxDelay:2e3,jitter:!0})),cache:fe(Ue.fast,Ne.none),messageQueue:fe(Ue.extended,Ne.aggressive),fileSystem:fe(Ue.long,Ne.standard),rateLimited:fe(ye({ms:1e4}),we({attempts:5,backoff:"linear",initialDelay:1e3,maxDelay:1e4,jitter:!0}))};function _t(e,t){return fe(e,t??{})}function lr(e,t){let r=t??{};return fe(...e,r)}function pr(e,t,r={}){return e?t:r}function mr(e,t=process.env.NODE_ENV??"development",r={}){return e[t]??r}function dr(){let e=new Map;return{register(t,r){e.set(t,r)},get(t){return e.get(t)},has(t){return e.has(t)},names(){return Array.from(e.keys())},apply(t,r){let p=e.get(t);if(!p)throw new Error(`Policy not found: ${t}`);return _t(p,r)}}}function fr(){let e=[],t={key(r){return e.push({key:r}),t},policy(r){return e.push(r),t},timeout(r){return e.push(ye({ms:r})),t},retry(r){return e.push(we(r)),t},retries(r){return e.push(Ne.custom({attempts:r})),t},build(){return fe(...e)}};return t}export{Ke as CircuitOpenError,Bt as circuitBreakerPresets,pr as conditionalPolicy,Kt as createCircuitBreaker,$t as createCombinedLimiter,xt as createConcurrencyLimiter,qt as createCostBasedRateLimiter,Ht as createFixedWindowLimiter,ir as createPolicyApplier,ur as createPolicyBundle,dr as createPolicyRegistry,Rt as createRateLimiter,sr as createSagaWorkflow,mr as envPolicy,Ft as isCircuitOpenError,Tt as isQueueFullError,Vt as isRateLimitExceededError,or as isSagaCompensationError,fe as mergePolicies,zt as rateLimiterPresets,Ne as retryPolicies,we as retryPolicy,ar as runSaga,cr as servicePolicies,fr as stepOptions,Ue as timeoutPolicies,ye as timeoutPolicy,lr as withPolicies,_t as withPolicy};
|
|
11
|
-
//# sourceMappingURL=reliability.js.map
|