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/policies.d.ts
DELETED
|
@@ -1,379 +0,0 @@
|
|
|
1
|
-
import { aj as StepOptions, ag as RetryOptions, ar as TimeoutOptions } from './run-entry-BOuNyVoO.js';
|
|
2
|
-
import './errors.js';
|
|
3
|
-
import './tagged-error.js';
|
|
4
|
-
import './slugs.js';
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* awaitly/policies
|
|
8
|
-
*
|
|
9
|
-
* Policy-Driven Step Middleware - Reusable bundles of StepOptions
|
|
10
|
-
* that can be composed and applied per-workflow or per-step.
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* A policy is a partial StepOptions that can be merged with other policies.
|
|
15
|
-
*/
|
|
16
|
-
type Policy = Partial<StepOptions>;
|
|
17
|
-
/**
|
|
18
|
-
* A policy factory that creates policies based on context.
|
|
19
|
-
*/
|
|
20
|
-
type PolicyFactory<T = void> = T extends void ? () => Policy : (context: T) => Policy;
|
|
21
|
-
/**
|
|
22
|
-
* Named policy with metadata.
|
|
23
|
-
*/
|
|
24
|
-
interface NamedPolicy {
|
|
25
|
-
name: string;
|
|
26
|
-
policy: Policy;
|
|
27
|
-
description?: string;
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Merge multiple policies into a single StepOptions object.
|
|
31
|
-
* Later policies override earlier ones for conflicting properties.
|
|
32
|
-
* Retry and timeout options are deep-merged.
|
|
33
|
-
*
|
|
34
|
-
* @param policies - Policies to merge (in order of precedence)
|
|
35
|
-
* @returns Merged StepOptions
|
|
36
|
-
*
|
|
37
|
-
* @example
|
|
38
|
-
* ```typescript
|
|
39
|
-
* const merged = mergePolicies(
|
|
40
|
-
* timeoutPolicies.api, // timeout: 5000ms
|
|
41
|
-
* retryPolicies.transient, // retry: 3 attempts
|
|
42
|
-
* { name: 'fetch-user' } // name override
|
|
43
|
-
* );
|
|
44
|
-
* ```
|
|
45
|
-
*/
|
|
46
|
-
declare function mergePolicies(...policies: Policy[]): StepOptions;
|
|
47
|
-
/**
|
|
48
|
-
* Create a policy applier that merges base policies with step-specific options.
|
|
49
|
-
*
|
|
50
|
-
* @param basePolicies - Base policies to apply to all steps
|
|
51
|
-
* @returns A function that applies policies to step options
|
|
52
|
-
*
|
|
53
|
-
* @example
|
|
54
|
-
* ```typescript
|
|
55
|
-
* const applyPolicy = createPolicyApplier(
|
|
56
|
-
* timeoutPolicies.api,
|
|
57
|
-
* retryPolicies.transient
|
|
58
|
-
* );
|
|
59
|
-
*
|
|
60
|
-
* // In workflow
|
|
61
|
-
* const user = await step(
|
|
62
|
-
* 'fetch-user',
|
|
63
|
-
* () => fetchUser(id),
|
|
64
|
-
* applyPolicy({ key: 'user:' + id })
|
|
65
|
-
* );
|
|
66
|
-
* ```
|
|
67
|
-
*/
|
|
68
|
-
declare function createPolicyApplier(...basePolicies: Policy[]): (stepOptions?: StepOptions) => StepOptions;
|
|
69
|
-
/**
|
|
70
|
-
* Create a named policy bundle for reuse across workflows.
|
|
71
|
-
*
|
|
72
|
-
* @param name - Policy bundle name
|
|
73
|
-
* @param policies - Policies to include in the bundle
|
|
74
|
-
* @returns Named policy object
|
|
75
|
-
*/
|
|
76
|
-
declare function createPolicyBundle(name: string, ...policies: Policy[]): NamedPolicy;
|
|
77
|
-
/**
|
|
78
|
-
* Create a retry policy with the given options.
|
|
79
|
-
*/
|
|
80
|
-
declare function retryPolicy(options: RetryOptions): Policy;
|
|
81
|
-
/**
|
|
82
|
-
* Pre-built retry policies for common scenarios.
|
|
83
|
-
*/
|
|
84
|
-
declare const retryPolicies: {
|
|
85
|
-
/**
|
|
86
|
-
* No retry - fail immediately on error.
|
|
87
|
-
*/
|
|
88
|
-
readonly none: Partial<StepOptions>;
|
|
89
|
-
/**
|
|
90
|
-
* Quick retry for transient errors (3 attempts, fast backoff).
|
|
91
|
-
*/
|
|
92
|
-
readonly transient: Partial<StepOptions>;
|
|
93
|
-
/**
|
|
94
|
-
* Standard retry for API calls (3 attempts, moderate backoff).
|
|
95
|
-
*/
|
|
96
|
-
readonly standard: Partial<StepOptions>;
|
|
97
|
-
/**
|
|
98
|
-
* Aggressive retry for critical operations (5 attempts, longer backoff).
|
|
99
|
-
*/
|
|
100
|
-
readonly aggressive: Partial<StepOptions>;
|
|
101
|
-
/**
|
|
102
|
-
* Fixed interval retry (useful for polling).
|
|
103
|
-
*/
|
|
104
|
-
readonly fixed: (attempts: number, delayMs: number) => Policy;
|
|
105
|
-
/**
|
|
106
|
-
* Linear backoff retry.
|
|
107
|
-
*/
|
|
108
|
-
readonly linear: (attempts: number, initialDelay: number) => Policy;
|
|
109
|
-
/**
|
|
110
|
-
* Custom retry policy builder.
|
|
111
|
-
*/
|
|
112
|
-
readonly custom: (options: Partial<RetryOptions> & {
|
|
113
|
-
attempts: number;
|
|
114
|
-
}) => Policy;
|
|
115
|
-
};
|
|
116
|
-
/**
|
|
117
|
-
* Create a timeout policy with the given options.
|
|
118
|
-
*/
|
|
119
|
-
declare function timeoutPolicy(options: TimeoutOptions): Policy;
|
|
120
|
-
/**
|
|
121
|
-
* Pre-built timeout policies for common scenarios.
|
|
122
|
-
*/
|
|
123
|
-
declare const timeoutPolicies: {
|
|
124
|
-
/**
|
|
125
|
-
* No timeout.
|
|
126
|
-
*/
|
|
127
|
-
readonly none: Policy;
|
|
128
|
-
/**
|
|
129
|
-
* Fast timeout for quick operations (1 second).
|
|
130
|
-
*/
|
|
131
|
-
readonly fast: Partial<StepOptions>;
|
|
132
|
-
/**
|
|
133
|
-
* Standard API timeout (5 seconds).
|
|
134
|
-
*/
|
|
135
|
-
readonly api: Partial<StepOptions>;
|
|
136
|
-
/**
|
|
137
|
-
* Extended timeout for slower operations (30 seconds).
|
|
138
|
-
*/
|
|
139
|
-
readonly extended: Partial<StepOptions>;
|
|
140
|
-
/**
|
|
141
|
-
* Long timeout for batch operations (2 minutes).
|
|
142
|
-
*/
|
|
143
|
-
readonly long: Partial<StepOptions>;
|
|
144
|
-
/**
|
|
145
|
-
* Custom timeout in milliseconds.
|
|
146
|
-
*/
|
|
147
|
-
readonly ms: (ms: number) => Policy;
|
|
148
|
-
/**
|
|
149
|
-
* Custom timeout in seconds.
|
|
150
|
-
*/
|
|
151
|
-
readonly seconds: (seconds: number) => Policy;
|
|
152
|
-
/**
|
|
153
|
-
* Timeout with custom error.
|
|
154
|
-
*/
|
|
155
|
-
readonly withError: <E>(ms: number, error: E) => Policy;
|
|
156
|
-
/**
|
|
157
|
-
* Timeout with AbortSignal support.
|
|
158
|
-
*/
|
|
159
|
-
readonly withSignal: (ms: number) => Policy;
|
|
160
|
-
};
|
|
161
|
-
/**
|
|
162
|
-
* Pre-built combined policies for common service patterns.
|
|
163
|
-
*/
|
|
164
|
-
declare const servicePolicies: {
|
|
165
|
-
/**
|
|
166
|
-
* Policy for external HTTP APIs.
|
|
167
|
-
* - 5 second timeout
|
|
168
|
-
* - 3 retries with exponential backoff
|
|
169
|
-
*/
|
|
170
|
-
readonly httpApi: StepOptions;
|
|
171
|
-
/**
|
|
172
|
-
* Policy for database operations.
|
|
173
|
-
* - 30 second timeout
|
|
174
|
-
* - 2 retries for transient errors
|
|
175
|
-
*/
|
|
176
|
-
readonly database: StepOptions;
|
|
177
|
-
/**
|
|
178
|
-
* Policy for cache operations.
|
|
179
|
-
* - 1 second timeout
|
|
180
|
-
* - No retry (cache misses are not errors)
|
|
181
|
-
*/
|
|
182
|
-
readonly cache: StepOptions;
|
|
183
|
-
/**
|
|
184
|
-
* Policy for message queue operations.
|
|
185
|
-
* - 30 second timeout
|
|
186
|
-
* - 5 retries with longer backoff
|
|
187
|
-
*/
|
|
188
|
-
readonly messageQueue: StepOptions;
|
|
189
|
-
/**
|
|
190
|
-
* Policy for file operations.
|
|
191
|
-
* - 2 minute timeout
|
|
192
|
-
* - 3 retries
|
|
193
|
-
*/
|
|
194
|
-
readonly fileSystem: StepOptions;
|
|
195
|
-
/**
|
|
196
|
-
* Policy for third-party services with rate limits.
|
|
197
|
-
* - 10 second timeout
|
|
198
|
-
* - 5 retries with linear backoff
|
|
199
|
-
*/
|
|
200
|
-
readonly rateLimited: StepOptions;
|
|
201
|
-
};
|
|
202
|
-
/**
|
|
203
|
-
* Options for withPolicies workflow wrapper.
|
|
204
|
-
*/
|
|
205
|
-
interface WithPoliciesOptions {
|
|
206
|
-
/**
|
|
207
|
-
* Base policies applied to all steps.
|
|
208
|
-
*/
|
|
209
|
-
policies: Policy[];
|
|
210
|
-
/**
|
|
211
|
-
* Step-specific policy overrides by name or key pattern.
|
|
212
|
-
*/
|
|
213
|
-
overrides?: Record<string, Policy>;
|
|
214
|
-
}
|
|
215
|
-
/**
|
|
216
|
-
* Create step options with policies applied.
|
|
217
|
-
* This is a helper for applying policies inline.
|
|
218
|
-
*
|
|
219
|
-
* @param policies - Policies to apply
|
|
220
|
-
* @param stepOptions - Step-specific options
|
|
221
|
-
* @returns Merged StepOptions
|
|
222
|
-
*
|
|
223
|
-
* @example
|
|
224
|
-
* ```typescript
|
|
225
|
-
* const user = await step(
|
|
226
|
-
* () => fetchUser(id),
|
|
227
|
-
* withPolicy(servicePolicies.httpApi, { name: 'fetch-user' })
|
|
228
|
-
* );
|
|
229
|
-
* ```
|
|
230
|
-
*/
|
|
231
|
-
declare function withPolicy(policy: Policy, stepOptions?: StepOptions): StepOptions;
|
|
232
|
-
/**
|
|
233
|
-
* Create step options with multiple policies applied.
|
|
234
|
-
*
|
|
235
|
-
* @param policies - Policies to apply (in order)
|
|
236
|
-
* @param stepOptions - Step-specific options
|
|
237
|
-
* @returns Merged StepOptions
|
|
238
|
-
*
|
|
239
|
-
* @example
|
|
240
|
-
* ```typescript
|
|
241
|
-
* const user = await step(
|
|
242
|
-
* 'fetch-user',
|
|
243
|
-
* () => fetchUser(id),
|
|
244
|
-
* withPolicies([timeoutPolicies.api, retryPolicies.standard])
|
|
245
|
-
* );
|
|
246
|
-
* ```
|
|
247
|
-
*/
|
|
248
|
-
declare function withPolicies(policies: Policy[], stepOptions?: StepOptions): StepOptions;
|
|
249
|
-
/**
|
|
250
|
-
* Create a policy that applies conditionally.
|
|
251
|
-
*
|
|
252
|
-
* @param condition - Condition to check
|
|
253
|
-
* @param policy - Policy to apply if condition is true
|
|
254
|
-
* @param elsePolicy - Policy to apply if condition is false (optional)
|
|
255
|
-
* @returns The selected policy
|
|
256
|
-
*
|
|
257
|
-
* @example
|
|
258
|
-
* ```typescript
|
|
259
|
-
* const policy = conditionalPolicy(
|
|
260
|
-
* isProduction,
|
|
261
|
-
* servicePolicies.httpApi, // Use in production
|
|
262
|
-
* retryPolicies.none // Skip in development
|
|
263
|
-
* );
|
|
264
|
-
* ```
|
|
265
|
-
*/
|
|
266
|
-
declare function conditionalPolicy(condition: boolean, policy: Policy, elsePolicy?: Policy): Policy;
|
|
267
|
-
/**
|
|
268
|
-
* Create a policy based on environment.
|
|
269
|
-
*
|
|
270
|
-
* @param envPolicies - Map of environment names to policies
|
|
271
|
-
* @param currentEnv - Current environment (defaults to NODE_ENV)
|
|
272
|
-
* @param defaultPolicy - Default policy if environment not found
|
|
273
|
-
* @returns The selected policy
|
|
274
|
-
*
|
|
275
|
-
* @example
|
|
276
|
-
* ```typescript
|
|
277
|
-
* const policy = envPolicy({
|
|
278
|
-
* production: servicePolicies.httpApi,
|
|
279
|
-
* development: retryPolicies.none,
|
|
280
|
-
* test: retryPolicies.none,
|
|
281
|
-
* });
|
|
282
|
-
* ```
|
|
283
|
-
*/
|
|
284
|
-
declare function envPolicy(envPolicies: Record<string, Policy>, currentEnv?: string, defaultPolicy?: Policy): Policy;
|
|
285
|
-
/**
|
|
286
|
-
* A registry for managing named policies.
|
|
287
|
-
*/
|
|
288
|
-
interface PolicyRegistry {
|
|
289
|
-
/**
|
|
290
|
-
* Register a named policy.
|
|
291
|
-
*/
|
|
292
|
-
register(name: string, policy: Policy): void;
|
|
293
|
-
/**
|
|
294
|
-
* Get a policy by name.
|
|
295
|
-
*/
|
|
296
|
-
get(name: string): Policy | undefined;
|
|
297
|
-
/**
|
|
298
|
-
* Check if a policy exists.
|
|
299
|
-
*/
|
|
300
|
-
has(name: string): boolean;
|
|
301
|
-
/**
|
|
302
|
-
* Get all registered policy names.
|
|
303
|
-
*/
|
|
304
|
-
names(): string[];
|
|
305
|
-
/**
|
|
306
|
-
* Create step options using a registered policy.
|
|
307
|
-
*/
|
|
308
|
-
apply(policyName: string, stepOptions?: StepOptions): StepOptions;
|
|
309
|
-
}
|
|
310
|
-
/**
|
|
311
|
-
* Create a policy registry for managing named policies.
|
|
312
|
-
*
|
|
313
|
-
* @returns PolicyRegistry instance
|
|
314
|
-
*
|
|
315
|
-
* @example
|
|
316
|
-
* ```typescript
|
|
317
|
-
* const registry = createPolicyRegistry();
|
|
318
|
-
*
|
|
319
|
-
* // Register policies
|
|
320
|
-
* registry.register('api', servicePolicies.httpApi);
|
|
321
|
-
* registry.register('db', servicePolicies.database);
|
|
322
|
-
*
|
|
323
|
-
* // Use in workflow
|
|
324
|
-
* const user = await step(
|
|
325
|
-
* 'fetch-user',
|
|
326
|
-
* () => fetchUser(id),
|
|
327
|
-
* registry.apply('api')
|
|
328
|
-
* );
|
|
329
|
-
* ```
|
|
330
|
-
*/
|
|
331
|
-
declare function createPolicyRegistry(): PolicyRegistry;
|
|
332
|
-
/**
|
|
333
|
-
* Fluent builder for constructing step options.
|
|
334
|
-
*/
|
|
335
|
-
interface StepOptionsBuilder {
|
|
336
|
-
/**
|
|
337
|
-
* Set step key for caching.
|
|
338
|
-
*/
|
|
339
|
-
key(key: string): StepOptionsBuilder;
|
|
340
|
-
/**
|
|
341
|
-
* Apply a policy.
|
|
342
|
-
*/
|
|
343
|
-
policy(policy: Policy): StepOptionsBuilder;
|
|
344
|
-
/**
|
|
345
|
-
* Set timeout in milliseconds.
|
|
346
|
-
*/
|
|
347
|
-
timeout(ms: number): StepOptionsBuilder;
|
|
348
|
-
/**
|
|
349
|
-
* Set retry options.
|
|
350
|
-
*/
|
|
351
|
-
retry(options: RetryOptions): StepOptionsBuilder;
|
|
352
|
-
/**
|
|
353
|
-
* Set retry attempts (with default exponential backoff).
|
|
354
|
-
*/
|
|
355
|
-
retries(attempts: number): StepOptionsBuilder;
|
|
356
|
-
/**
|
|
357
|
-
* Build the final StepOptions.
|
|
358
|
-
*/
|
|
359
|
-
build(): StepOptions;
|
|
360
|
-
}
|
|
361
|
-
/**
|
|
362
|
-
* Create a fluent builder for step options.
|
|
363
|
-
*
|
|
364
|
-
* @returns StepOptionsBuilder instance
|
|
365
|
-
*
|
|
366
|
-
* @example
|
|
367
|
-
* ```typescript
|
|
368
|
-
* const options = stepOptions()
|
|
369
|
-
* .key('user:123')
|
|
370
|
-
* .timeout(5000)
|
|
371
|
-
* .retries(3)
|
|
372
|
-
* .build();
|
|
373
|
-
*
|
|
374
|
-
* const user = await step('fetch-user', () => fetchUser(id), options);
|
|
375
|
-
* ```
|
|
376
|
-
*/
|
|
377
|
-
declare function stepOptions(): StepOptionsBuilder;
|
|
378
|
-
|
|
379
|
-
export { type NamedPolicy, type Policy, type PolicyFactory, type PolicyRegistry, type StepOptionsBuilder, type WithPoliciesOptions, conditionalPolicy, createPolicyApplier, createPolicyBundle, createPolicyRegistry, envPolicy, mergePolicies, retryPolicies, retryPolicy, servicePolicies, stepOptions, timeoutPolicies, timeoutPolicy, withPolicies, withPolicy };
|
package/dist/policies.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
function o(...t){let e={};for(let i of t)i.key!==void 0&&(e.key=i.key),i.retry!==void 0&&(e.retry=e.retry?{...e.retry,...i.retry}:{...i.retry}),i.timeout!==void 0&&(e.timeout=e.timeout?{...e.timeout,...i.timeout}:{...i.timeout});return e}function y(...t){let e=o(...t);return i=>o(e,i??{})}function a(t,...e){return{name:t,policy:o(...e)}}function n(t){return{retry:t}}var p={none:n({attempts:1}),transient:n({attempts:3,backoff:"exponential",initialDelay:100,maxDelay:1e3,jitter:!0}),standard:n({attempts:3,backoff:"exponential",initialDelay:200,maxDelay:5e3,jitter:!0}),aggressive:n({attempts:5,backoff:"exponential",initialDelay:500,maxDelay:3e4,jitter:!0}),fixed:(t,e)=>n({attempts:t,backoff:"fixed",initialDelay:e,jitter:!1}),linear:(t,e)=>n({attempts:t,backoff:"linear",initialDelay:e,jitter:!0}),custom:t=>n({backoff:"exponential",initialDelay:100,maxDelay:3e4,jitter:!0,...t})};function r(t){return{timeout:t}}var s={none:{},fast:r({ms:1e3}),api:r({ms:5e3}),extended:r({ms:3e4}),long:r({ms:12e4}),ms:t=>r({ms:t}),seconds:t=>r({ms:t*1e3}),withError:(t,e)=>r({ms:t,error:e}),withSignal:t=>r({ms:t,signal:!0})},u={httpApi:o(s.api,p.standard),database:o(s.extended,n({attempts:2,backoff:"exponential",initialDelay:100,maxDelay:2e3,jitter:!0})),cache:o(s.fast,p.none),messageQueue:o(s.extended,p.aggressive),fileSystem:o(s.long,p.standard),rateLimited:o(r({ms:1e4}),n({attempts:5,backoff:"linear",initialDelay:1e3,maxDelay:1e4,jitter:!0}))};function l(t,e){return o(t,e??{})}function P(t,e){let i=e??{};return o(...t,i)}function m(t,e,i={}){return t?e:i}function d(t,e=process.env.NODE_ENV??"development",i={}){return t[e]??i}function f(){let t=new Map;return{register(e,i){t.set(e,i)},get(e){return t.get(e)},has(e){return t.has(e)},names(){return Array.from(t.keys())},apply(e,i){let c=t.get(e);if(!c)throw new Error(`Policy not found: ${e}`);return l(c,i)}}}function g(){let t=[],e={key(i){return t.push({key:i}),e},policy(i){return t.push(i),e},timeout(i){return t.push(r({ms:i})),e},retry(i){return t.push(n(i)),e},retries(i){return t.push(p.custom({attempts:i})),e},build(){return o(...t)}};return e}export{m as conditionalPolicy,y as createPolicyApplier,a as createPolicyBundle,f as createPolicyRegistry,d as envPolicy,o as mergePolicies,p as retryPolicies,n as retryPolicy,u as servicePolicies,g as stepOptions,s as timeoutPolicies,r as timeoutPolicy,P as withPolicies,l as withPolicy};
|
|
2
|
-
//# sourceMappingURL=policies.js.map
|
package/dist/policies.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/policies.ts"],"sourcesContent":["/**\n * awaitly/policies\n *\n * Policy-Driven Step Middleware - Reusable bundles of StepOptions\n * that can be composed and applied per-workflow or per-step.\n */\n\nimport type { StepOptions, RetryOptions, TimeoutOptions } from \"./core\";\n\n// =============================================================================\n// Policy Types\n// =============================================================================\n\n/**\n * A policy is a partial StepOptions that can be merged with other policies.\n */\nexport type Policy = Partial<StepOptions>;\n\n/**\n * A policy factory that creates policies based on context.\n */\nexport type PolicyFactory<T = void> = T extends void\n ? () => Policy\n : (context: T) => Policy;\n\n/**\n * Named policy with metadata.\n */\nexport interface NamedPolicy {\n name: string;\n policy: Policy;\n description?: string;\n}\n\n// =============================================================================\n// Policy Composition\n// =============================================================================\n\n/**\n * Merge multiple policies into a single StepOptions object.\n * Later policies override earlier ones for conflicting properties.\n * Retry and timeout options are deep-merged.\n *\n * @param policies - Policies to merge (in order of precedence)\n * @returns Merged StepOptions\n *\n * @example\n * ```typescript\n * const merged = mergePolicies(\n * timeoutPolicies.api, // timeout: 5000ms\n * retryPolicies.transient, // retry: 3 attempts\n * { name: 'fetch-user' } // name override\n * );\n * ```\n */\nexport function mergePolicies(...policies: Policy[]): StepOptions {\n const result: StepOptions = {};\n\n for (const policy of policies) {\n if (policy.key !== undefined) result.key = policy.key;\n\n // Deep merge retry options\n if (policy.retry !== undefined) {\n result.retry = result.retry\n ? { ...result.retry, ...policy.retry }\n : { ...policy.retry };\n }\n\n // Deep merge timeout options\n if (policy.timeout !== undefined) {\n result.timeout = result.timeout\n ? { ...result.timeout, ...policy.timeout }\n : { ...policy.timeout };\n }\n }\n\n return result;\n}\n\n/**\n * Create a policy applier that merges base policies with step-specific options.\n *\n * @param basePolicies - Base policies to apply to all steps\n * @returns A function that applies policies to step options\n *\n * @example\n * ```typescript\n * const applyPolicy = createPolicyApplier(\n * timeoutPolicies.api,\n * retryPolicies.transient\n * );\n *\n * // In workflow\n * const user = await step(\n * 'fetch-user',\n * () => fetchUser(id),\n * applyPolicy({ key: 'user:' + id })\n * );\n * ```\n */\nexport function createPolicyApplier(\n ...basePolicies: Policy[]\n): (stepOptions?: StepOptions) => StepOptions {\n const basePolicy = mergePolicies(...basePolicies);\n\n return (stepOptions?: StepOptions): StepOptions => {\n const opts = stepOptions ?? {};\n return mergePolicies(basePolicy, opts);\n };\n}\n\n/**\n * Create a named policy bundle for reuse across workflows.\n *\n * @param name - Policy bundle name\n * @param policies - Policies to include in the bundle\n * @returns Named policy object\n */\nexport function createPolicyBundle(\n name: string,\n ...policies: Policy[]\n): NamedPolicy {\n return {\n name,\n policy: mergePolicies(...policies),\n };\n}\n\n// =============================================================================\n// Retry Policies\n// =============================================================================\n\n/**\n * Create a retry policy with the given options.\n */\nexport function retryPolicy(options: RetryOptions): Policy {\n return { retry: options };\n}\n\n/**\n * Pre-built retry policies for common scenarios.\n */\nexport const retryPolicies = {\n /**\n * No retry - fail immediately on error.\n */\n none: retryPolicy({ attempts: 1 }),\n\n /**\n * Quick retry for transient errors (3 attempts, fast backoff).\n */\n transient: retryPolicy({\n attempts: 3,\n backoff: \"exponential\",\n initialDelay: 100,\n maxDelay: 1000,\n jitter: true,\n }),\n\n /**\n * Standard retry for API calls (3 attempts, moderate backoff).\n */\n standard: retryPolicy({\n attempts: 3,\n backoff: \"exponential\",\n initialDelay: 200,\n maxDelay: 5000,\n jitter: true,\n }),\n\n /**\n * Aggressive retry for critical operations (5 attempts, longer backoff).\n */\n aggressive: retryPolicy({\n attempts: 5,\n backoff: \"exponential\",\n initialDelay: 500,\n maxDelay: 30000,\n jitter: true,\n }),\n\n /**\n * Fixed interval retry (useful for polling).\n */\n fixed: (attempts: number, delayMs: number): Policy =>\n retryPolicy({\n attempts,\n backoff: \"fixed\",\n initialDelay: delayMs,\n jitter: false,\n }),\n\n /**\n * Linear backoff retry.\n */\n linear: (attempts: number, initialDelay: number): Policy =>\n retryPolicy({\n attempts,\n backoff: \"linear\",\n initialDelay,\n jitter: true,\n }),\n\n /**\n * Custom retry policy builder.\n */\n custom: (options: Partial<RetryOptions> & { attempts: number }): Policy =>\n retryPolicy({\n backoff: \"exponential\",\n initialDelay: 100,\n maxDelay: 30000,\n jitter: true,\n ...options,\n }),\n} as const;\n\n// =============================================================================\n// Timeout Policies\n// =============================================================================\n\n/**\n * Create a timeout policy with the given options.\n */\nexport function timeoutPolicy(options: TimeoutOptions): Policy {\n return { timeout: options };\n}\n\n/**\n * Pre-built timeout policies for common scenarios.\n */\nexport const timeoutPolicies = {\n /**\n * No timeout.\n */\n none: {} as Policy,\n\n /**\n * Fast timeout for quick operations (1 second).\n */\n fast: timeoutPolicy({ ms: 1000 }),\n\n /**\n * Standard API timeout (5 seconds).\n */\n api: timeoutPolicy({ ms: 5000 }),\n\n /**\n * Extended timeout for slower operations (30 seconds).\n */\n extended: timeoutPolicy({ ms: 30000 }),\n\n /**\n * Long timeout for batch operations (2 minutes).\n */\n long: timeoutPolicy({ ms: 120000 }),\n\n /**\n * Custom timeout in milliseconds.\n */\n ms: (ms: number): Policy => timeoutPolicy({ ms }),\n\n /**\n * Custom timeout in seconds.\n */\n seconds: (seconds: number): Policy => timeoutPolicy({ ms: seconds * 1000 }),\n\n /**\n * Timeout with custom error.\n */\n withError: <E>(ms: number, error: E): Policy =>\n timeoutPolicy({ ms, error }),\n\n /**\n * Timeout with AbortSignal support.\n */\n withSignal: (ms: number): Policy =>\n timeoutPolicy({ ms, signal: true }),\n} as const;\n\n// =============================================================================\n// Combined Policies\n// =============================================================================\n\n/**\n * Pre-built combined policies for common service patterns.\n */\nexport const servicePolicies = {\n /**\n * Policy for external HTTP APIs.\n * - 5 second timeout\n * - 3 retries with exponential backoff\n */\n httpApi: mergePolicies(\n timeoutPolicies.api,\n retryPolicies.standard\n ),\n\n /**\n * Policy for database operations.\n * - 30 second timeout\n * - 2 retries for transient errors\n */\n database: mergePolicies(\n timeoutPolicies.extended,\n retryPolicy({\n attempts: 2,\n backoff: \"exponential\",\n initialDelay: 100,\n maxDelay: 2000,\n jitter: true,\n })\n ),\n\n /**\n * Policy for cache operations.\n * - 1 second timeout\n * - No retry (cache misses are not errors)\n */\n cache: mergePolicies(\n timeoutPolicies.fast,\n retryPolicies.none\n ),\n\n /**\n * Policy for message queue operations.\n * - 30 second timeout\n * - 5 retries with longer backoff\n */\n messageQueue: mergePolicies(\n timeoutPolicies.extended,\n retryPolicies.aggressive\n ),\n\n /**\n * Policy for file operations.\n * - 2 minute timeout\n * - 3 retries\n */\n fileSystem: mergePolicies(\n timeoutPolicies.long,\n retryPolicies.standard\n ),\n\n /**\n * Policy for third-party services with rate limits.\n * - 10 second timeout\n * - 5 retries with linear backoff\n */\n rateLimited: mergePolicies(\n timeoutPolicy({ ms: 10000 }),\n retryPolicy({\n attempts: 5,\n backoff: \"linear\",\n initialDelay: 1000,\n maxDelay: 10000,\n jitter: true,\n })\n ),\n} as const;\n\n// =============================================================================\n// Policy Decorators\n// =============================================================================\n\n/**\n * Options for withPolicies workflow wrapper.\n */\nexport interface WithPoliciesOptions {\n /**\n * Base policies applied to all steps.\n */\n policies: Policy[];\n\n /**\n * Step-specific policy overrides by name or key pattern.\n */\n overrides?: Record<string, Policy>;\n}\n\n/**\n * Create step options with policies applied.\n * This is a helper for applying policies inline.\n *\n * @param policies - Policies to apply\n * @param stepOptions - Step-specific options\n * @returns Merged StepOptions\n *\n * @example\n * ```typescript\n * const user = await step(\n * () => fetchUser(id),\n * withPolicy(servicePolicies.httpApi, { name: 'fetch-user' })\n * );\n * ```\n */\nexport function withPolicy(\n policy: Policy,\n stepOptions?: StepOptions\n): StepOptions {\n const opts = stepOptions ?? {};\n return mergePolicies(policy, opts);\n}\n\n/**\n * Create step options with multiple policies applied.\n *\n * @param policies - Policies to apply (in order)\n * @param stepOptions - Step-specific options\n * @returns Merged StepOptions\n *\n * @example\n * ```typescript\n * const user = await step(\n * 'fetch-user',\n * () => fetchUser(id),\n * withPolicies([timeoutPolicies.api, retryPolicies.standard])\n * );\n * ```\n */\nexport function withPolicies(\n policies: Policy[],\n stepOptions?: StepOptions\n): StepOptions {\n const opts = stepOptions ?? {};\n return mergePolicies(...policies, opts);\n}\n\n// =============================================================================\n// Conditional Policies\n// =============================================================================\n\n/**\n * Create a policy that applies conditionally.\n *\n * @param condition - Condition to check\n * @param policy - Policy to apply if condition is true\n * @param elsePolicy - Policy to apply if condition is false (optional)\n * @returns The selected policy\n *\n * @example\n * ```typescript\n * const policy = conditionalPolicy(\n * isProduction,\n * servicePolicies.httpApi, // Use in production\n * retryPolicies.none // Skip in development\n * );\n * ```\n */\nexport function conditionalPolicy(\n condition: boolean,\n policy: Policy,\n elsePolicy: Policy = {}\n): Policy {\n return condition ? policy : elsePolicy;\n}\n\n/**\n * Create a policy based on environment.\n *\n * @param envPolicies - Map of environment names to policies\n * @param currentEnv - Current environment (defaults to NODE_ENV)\n * @param defaultPolicy - Default policy if environment not found\n * @returns The selected policy\n *\n * @example\n * ```typescript\n * const policy = envPolicy({\n * production: servicePolicies.httpApi,\n * development: retryPolicies.none,\n * test: retryPolicies.none,\n * });\n * ```\n */\nexport function envPolicy(\n envPolicies: Record<string, Policy>,\n currentEnv: string = process.env.NODE_ENV ?? \"development\",\n defaultPolicy: Policy = {}\n): Policy {\n return envPolicies[currentEnv] ?? defaultPolicy;\n}\n\n// =============================================================================\n// Policy Registry\n// =============================================================================\n\n/**\n * A registry for managing named policies.\n */\nexport interface PolicyRegistry {\n /**\n * Register a named policy.\n */\n register(name: string, policy: Policy): void;\n\n /**\n * Get a policy by name.\n */\n get(name: string): Policy | undefined;\n\n /**\n * Check if a policy exists.\n */\n has(name: string): boolean;\n\n /**\n * Get all registered policy names.\n */\n names(): string[];\n\n /**\n * Create step options using a registered policy.\n */\n apply(policyName: string, stepOptions?: StepOptions): StepOptions;\n}\n\n/**\n * Create a policy registry for managing named policies.\n *\n * @returns PolicyRegistry instance\n *\n * @example\n * ```typescript\n * const registry = createPolicyRegistry();\n *\n * // Register policies\n * registry.register('api', servicePolicies.httpApi);\n * registry.register('db', servicePolicies.database);\n *\n * // Use in workflow\n * const user = await step(\n * 'fetch-user',\n * () => fetchUser(id),\n * registry.apply('api')\n * );\n * ```\n */\nexport function createPolicyRegistry(): PolicyRegistry {\n const policies = new Map<string, Policy>();\n\n return {\n register(name: string, policy: Policy): void {\n policies.set(name, policy);\n },\n\n get(name: string): Policy | undefined {\n return policies.get(name);\n },\n\n has(name: string): boolean {\n return policies.has(name);\n },\n\n names(): string[] {\n return Array.from(policies.keys());\n },\n\n apply(policyName: string, stepOptions?: StepOptions): StepOptions {\n const policy = policies.get(policyName);\n if (!policy) {\n throw new Error(`Policy not found: ${policyName}`);\n }\n return withPolicy(policy, stepOptions);\n },\n };\n}\n\n// =============================================================================\n// Step Options Builder (Fluent API)\n// =============================================================================\n\n/**\n * Fluent builder for constructing step options.\n */\nexport interface StepOptionsBuilder {\n /**\n * Set step key for caching.\n */\n key(key: string): StepOptionsBuilder;\n\n /**\n * Apply a policy.\n */\n policy(policy: Policy): StepOptionsBuilder;\n\n /**\n * Set timeout in milliseconds.\n */\n timeout(ms: number): StepOptionsBuilder;\n\n /**\n * Set retry options.\n */\n retry(options: RetryOptions): StepOptionsBuilder;\n\n /**\n * Set retry attempts (with default exponential backoff).\n */\n retries(attempts: number): StepOptionsBuilder;\n\n /**\n * Build the final StepOptions.\n */\n build(): StepOptions;\n}\n\n/**\n * Create a fluent builder for step options.\n *\n * @returns StepOptionsBuilder instance\n *\n * @example\n * ```typescript\n * const options = stepOptions()\n * .key('user:123')\n * .timeout(5000)\n * .retries(3)\n * .build();\n *\n * const user = await step('fetch-user', () => fetchUser(id), options);\n * ```\n */\nexport function stepOptions(): StepOptionsBuilder {\n const policies: Policy[] = [];\n\n const builder: StepOptionsBuilder = {\n key(key: string) {\n policies.push({ key });\n return builder;\n },\n\n policy(policy: Policy) {\n policies.push(policy);\n return builder;\n },\n\n timeout(ms: number) {\n policies.push(timeoutPolicy({ ms }));\n return builder;\n },\n\n retry(options: RetryOptions) {\n policies.push(retryPolicy(options));\n return builder;\n },\n\n retries(attempts: number) {\n policies.push(retryPolicies.custom({ attempts }));\n return builder;\n },\n\n build(): StepOptions {\n return mergePolicies(...policies);\n },\n };\n\n return builder;\n}\n"],"mappings":"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","names":["mergePolicies","policies","result","policy","createPolicyApplier","basePolicies","basePolicy","stepOptions","createPolicyBundle","name","retryPolicy","options","retryPolicies","attempts","delayMs","initialDelay","timeoutPolicy","timeoutPolicies","ms","seconds","error","servicePolicies","withPolicy","withPolicies","opts","conditionalPolicy","condition","elsePolicy","envPolicy","envPolicies","currentEnv","defaultPolicy","createPolicyRegistry","policyName","builder","key"]}
|
package/dist/ratelimit.cjs
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
"use strict";var me=Object.defineProperty;var $e=Object.getOwnPropertyDescriptor;var He=Object.getOwnPropertyNames;var ze=Object.prototype.hasOwnProperty;var Ye=(e,r)=>{for(var u in r)me(e,u,{get:r[u],enumerable:!0})},Je=(e,r,u,f)=>{if(r&&typeof r=="object"||typeof r=="function")for(let d of He(r))!ze.call(e,d)&&d!==u&&me(e,d,{get:()=>r[d],enumerable:!(f=$e(r,d))||f.enumerable});return e};var Qe=e=>Je(me({},"__esModule",{value:!0}),e);var lr={};Ye(lr,{createCombinedLimiter:()=>Ne,createConcurrencyLimiter:()=>ke,createCostBasedRateLimiter:()=>Ke,createFixedWindowLimiter:()=>je,createRateLimiter:()=>Te,isQueueFullError:()=>fe,isRateLimitExceededError:()=>Fe,rateLimiterPresets:()=>Be});module.exports=Qe(lr);var Xe={"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 Re(e){return`https://jagreehal.github.io/awaitly/rules/#${e}`}var yr=Object.keys(Xe);var oe=class extends Error{_tag};function j(e,r){return class extends oe{_tag=e;constructor(u,f){let d=r?.message?r.message(u??{}):e;if(super(d),this.name=e,r?.slug!==void 0){if(!r.hint)throw new TypeError(`TaggedError: 'hint' is required when 'slug' is set (slug: "${r.slug}")`);Object.defineProperty(this,"code",{value:r.slug,enumerable:!0,writable:!1,configurable:!1}),Object.defineProperty(this,"hint",{value:r.hint,enumerable:!0,writable:!1,configurable:!1}),Object.defineProperty(this,"docsUrl",{value:Re(r.slug),enumerable:!0,writable:!1,configurable:!1})}if(Object.setPrototypeOf(this,new.target.prototype),u&&typeof u=="object"){let a;if(r?.slug!==void 0){let{_tag:M,name:g,message:v,stack:t,code:k,hint:I,docsUrl:K,...W}=u;a=W}else{let{_tag:M,name:g,message:v,stack:t,...k}=u;a=k}let p=Object.prototype.hasOwnProperty.call(a,"cause"),R=p?a.cause:void 0;p&&delete a.cause;let S=f?.cause!==void 0;if(p&&S)throw new TypeError("TaggedError: cannot provide 'cause' in props when also setting ErrorOptions.cause");Object.assign(this,a),p&&(this.cause=R),S&&(this.cause=f?.cause)}else f?.cause!==void 0&&(this.cause=f.cause)}}}Object.defineProperty(j,Symbol.hasInstance,{value:e=>e instanceof oe});(d=>{function e(a){return a instanceof Error}d.isError=e;function r(a){return a instanceof oe}d.isTaggedError=r;function u(a,p){let R=a._tag,S=p[R];return S(a)}d.match=u;function f(a,p,R){let S=a._tag,M=p[S];return M?M(a):R(a)}d.matchPartial=f})(j||={});var ge=class extends j("TimeoutError",{slug:"runtime-step-timeout",hint:"Increase the step's timeout option, or check why the upstream operation is slow.",message:r=>r.operation?`TimeoutError: ${r.operation} timed out after ${r.ms}ms`:`TimeoutError: Operation timed out after ${r.ms}ms`}){},xe=class extends j("RetryExhaustedError",{slug:"runtime-retry-exhausted",hint:"All retry attempts failed. Inspect lastError and decide whether to surface it or compensate.",message:r=>r.operation?`RetryExhaustedError: ${r.operation} failed after ${r.attempts} attempts`:`RetryExhaustedError: Operation failed after ${r.attempts} attempts`}){},Ce=class extends j("RateLimitError",{slug:"runtime-rate-limit",hint:"Wait retryAfterMs before retrying, or apply step.cache to deduplicate calls.",message:r=>r.limiterName?`RateLimitError: Rate limit exceeded for ${r.limiterName}${r.retryAfterMs?`, retry after ${r.retryAfterMs}ms`:""}`:`RateLimitError: Rate limit exceeded${r.retryAfterMs?`, retry after ${r.retryAfterMs}ms`:""}`}){},he=class extends j("CircuitBreakerOpenError",{slug:"runtime-circuit-open",hint:"The circuit is open. Wait for it to half-open or fall back to a degraded path.",message:r=>`CircuitBreakerOpenError: Circuit ${r.circuitName} is ${r.state??"OPEN"}${r.retryAfterMs?`, retry after ${Math.ceil(r.retryAfterMs/1e3)}s`:""}`}){},be=class extends j("ValidationError",{message:r=>`ValidationError: Invalid ${r.field} - ${r.reason}`}){},Ae=class extends j("NotFoundError",{message:r=>r.id?`NotFoundError: ${r.resource} with id ${r.id} not found`:`NotFoundError: ${r.resource} not found`}){},Se=class extends j("UnauthorizedError",{message:r=>r.reason?`UnauthorizedError: ${r.reason}`:r.action&&r.resource?`UnauthorizedError: Not authorized to ${r.action} ${r.resource}`:"UnauthorizedError: Access denied"}){},Pe=class extends j("NetworkError",{message:r=>r.url?`NetworkError: ${r.reason} (${r.url})`:`NetworkError: ${r.reason}`}){},ve=class extends j("CompensationError",{slug:"runtime-saga-compensation",hint:"A saga compensation step failed. Inspect compensationError and ensure compensation is idempotent.",message:r=>`CompensationError: Failed to compensate step ${r.step}`}){},ae=class extends j("UnexpectedError",{slug:"runtime-unexpected",hint:"An unexpected exception escaped a step. Inspect cause; consider returning a typed Result instead of throwing.",message:r=>`UnexpectedError: ${r.cause instanceof Error?r.cause.message:String(r.cause??"unknown")}`}){};function _e(e){return{ok:!0,value:e}}var Ge=e=>typeof e=="object"&&e!==null&&"ok"in e&&typeof e.ok=="boolean"&&(e.ok?"value"in e:"error"in e),Oe=(e,r)=>{let u={},f=new Map;for(let d of Object.keys(e)){let a=e[d];typeof a=="function"&&(u[d]=(...p)=>{let R=(f.get(d)??0)+1;f.set(d,R);let S=R===1?d:`${d}#${R}`;return r(S,async()=>{let M=await a(...p);return Ge(M)?M:_e(M)})})}return u};function Ze(e){let r=e.trim().match(/^(\d+(?:\.\d+)?)\s*(ms|s|m|h|d)$/i);if(!r)return;let u=parseFloat(r[1]),f=r[2].toLowerCase();return{_tag:"Duration",millis:u*({ms:1,s:1e3,m:6e4,h:36e5,d:864e5}[f]??1)}}function er(e){return new ae({cause:e})}function $(e){return{ok:!0,value:e}}function F(e,r){let u=r?.cause;return{ok:!1,error:e,...u!==void 0?{cause:u}:{}}}function rr(e){if(e==null)return"unknown";if(typeof e=="string")return e.trim()||"unknown";if(typeof e=="object"){let r=e;if(typeof r._tag=="string"){let u=r._tag.trim();if(u)return u}if(typeof r.tag=="string"){let u=r.tag.trim();if(u)return u}if(typeof r.code=="string"){let u=r.code.trim();if(u)return u}else if(typeof r.code=="number")return String(r.code);if(e instanceof Error&&e.name){let u=e.name.trim();if(u)return u}}return"unknown"}function tr(e,r){if(!(!r||!e))return r[e]}function nr(e){let{intent:r,domain:u,owner:f,tags:d,stateChanges:a,emits:p,calls:R}=e;if(!r&&!u&&!f&&!d?.length&&!a?.length&&!p?.length&&!R?.length)return;let S={};return r&&(S.intent=r),u&&(S.domain=u),f&&(S.owner=f),d?.length&&(S.tags=d),a?.length&&(S.stateChanges=a),p?.length&&(S.emits=p),R?.length&&(S.calls=R),S}function V(e,r,u,f,d){let a=rr(e),p=tr(a,r),R={tag:a,origin:u};return p!==void 0&&(R.classification=p),f!==void 0&&(R.attempt=f),d!==void 0&&(R.cumulativeDurationMs=d),R}var te=Symbol.for("step_timeout_marker");function Me(e){return typeof e!="object"||e===null?!1:e.type==="STEP_TIMEOUT"?!0:te in e}function or(e){if(!(typeof e!="object"||e===null)){if(e.type==="STEP_TIMEOUT"){let r=e;return{timeoutMs:r.timeoutMs,stepName:r.stepName,stepKey:r.stepKey,attempt:r.attempt}}if(te in e)return e[te]}}var Ue=Symbol("early-exit");function sr(e,r){return{[Ue]:!0,error:e,meta:r}}function ar(e){return typeof e=="object"&&e!==null&&e[Ue]===!0}var Le=Symbol("mapper-exception");function ee(e){return{[Le]:!0,thrown:e}}function ir(e){return typeof e=="object"&&e!==null&&e[Le]===!0}function de(e,r){let{backoff:u,initialDelay:f,maxDelay:d,jitter:a}=r,p;switch(u){case"fixed":p=f;break;case"linear":p=f*e;break;case"exponential":p=f*Math.pow(2,e-1);break}if(p=Math.min(p,d),a){let R=p*.25*Math.random();p=p+R}return Math.floor(p)}function ye(e){return new Promise(r=>setTimeout(r,e))}var Ie=Symbol("timeout"),ie=Symbol("timeout-option");function ur(e){return typeof e=="object"&&e!==null&&e[ie]===!0}async function cr(e,r,u,f){let d=new AbortController,a=r.onTimeout??"error",p=()=>typeof a=="function"?a({name:u.name,key:u.key,ms:r.ms}):r.error??{type:"STEP_TIMEOUT",stepName:u.name,stepKey:u.key,timeoutMs:r.ms,attempt:u.attempt},R;f?.aborted&&d.abort(f.reason);let S;f&&!f.aborted&&(S=()=>d.abort(f.reason),f.addEventListener("abort",S,{once:!0}));let M=new Promise((v,t)=>{R=setTimeout(()=>{if(a!=="disconnect"&&d.abort(),a==="option"){t({[ie]:!0,ms:r.ms});return}t({[Ie]:!0,error:p()})},r.ms)}),g;r.signal?g=Promise.resolve(e(d.signal)):g=Promise.resolve(e());try{return await Promise.race([g,M])}catch(v){if(typeof v=="object"&&v!==null&&v[ie]===!0)throw{[ie]:!0,ms:r.ms};if(typeof v=="object"&&v!==null&&v[Ie]===!0){a==="disconnect"&&g.catch(()=>{});let t=v.error;if(typeof t=="object"&&t!==null&&t.type!=="STEP_TIMEOUT"){let k={timeoutMs:r.ms,stepName:u.name,stepKey:u.key,attempt:u.attempt};te in t?t[te]=k:Object.defineProperty(t,te,{value:k,enumerable:!1,writable:!0,configurable:!1})}throw t}throw v}finally{clearTimeout(R),S&&f&&f.removeEventListener("abort",S)}}var re={backoff:"exponential",initialDelay:100,maxDelay:3e4,jitter:!0,shouldRetry:()=>!0,onRetry:()=>{}};async function we(e,r,u){if(typeof e!="function"){let m=e,B=r;if(typeof B!="function")throw new TypeError("[awaitly] run(deps, fn) requires a callback as the second argument. Example: run({ getUser }, async (s) => s.getUser(id))");return we(({step:G})=>B(Oe(m,G),{step:G}),u)}let f=e,d=r,{onError:a,onEvent:p,catchUnexpected:R,workflowId:S,workflowName:M,context:g,_workflowSignal:v}=d&&typeof d=="object"?d:{},t=S??crypto.randomUUID(),k=R??er,I=[],K=0,W=m=>m??`step_${++K}`,l=m=>{let B=m.context!==void 0||g===void 0?m:{...m,context:g},H=M!==void 0&&B.workflowName===void 0?{...B,workflowName:M}:B;if(H.type==="step_success"){let G=H.stepId;for(let se=I.length-1;se>=0;se--){let q=I[se];if(q.type==="race"&&!q.winnerId){q.winnerId=G;break}}}p?.(H,g)},N=sr,X=m=>ar(m),Y=(m,B)=>m,Ve=m=>typeof m=="function"?!1:!!(m&&typeof m=="object"&&"ok"in m||m&&typeof m=="object"&&"then"in m&&typeof m.then=="function");try{let B=function(i){let y={};for(let[o,s]of Object.entries(i))if(typeof s=="function")y[o]=s;else if(s&&typeof s=="object"&&"fn"in s)y[o]=s.fn;else throw new TypeError(`step.all: operation "${o}" must be a function or { fn, errors? } object`);return y},H=function(i,y){let o=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let s=performance.now(),n=!1;I.push({scopeId:o,type:"parallel"});let c=()=>{if(n)return;n=!0;let E=I.findIndex(w=>w.scopeId===o);E!==-1&&I.splice(E,1),l({type:"scope_end",workflowId:t,scopeId:o,ts:Date.now(),durationMs:performance.now()-s})};l({type:"scope_start",workflowId:t,scopeId:o,scopeType:"parallel",name:i,ts:Date.now()});try{let E=await y();if(c(),!E.ok)throw a?.(E.error,i,g),N(E.error,{origin:"result",resultCause:E.cause});return E.value}catch(E){throw c(),E}})()},G=function(i,y){let o=Object.keys(i),s=y.name??`Parallel(${o.join(", ")})`,n=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let c=performance.now(),E=!1;I.push({scopeId:n,type:"parallel"});let w=()=>{if(E)return;E=!0;let T=I.findIndex(x=>x.scopeId===n);T!==-1&&I.splice(T,1),l({type:"scope_end",workflowId:t,scopeId:n,ts:Date.now(),durationMs:performance.now()-c})};l({type:"scope_start",workflowId:t,scopeId:n,scopeType:"parallel",name:s,ts:Date.now()});try{let T=await new Promise(h=>{if(o.length===0){h([]);return}let O=!1,L=o.length,b=new Array(o.length);for(let U=0;U<o.length;U++){let A=o[U],_=U;Promise.resolve(i[A]()).catch(P=>F({type:"PROMISE_REJECTED",cause:P},{cause:{type:"PROMISE_REJECTION",reason:P}})).then(P=>{if(!O){if(!P.ok){O=!0,h([{key:A,result:P}]);return}b[_]={key:A,result:P},L--,L===0&&h(b)}})}});w();let x={};for(let{key:h,result:O}of T){if(!O.ok)throw a?.(O.error,h,g),N(O.error,{origin:"result",resultCause:O.cause});x[h]=O.value}return x}catch(T){throw w(),T}})()};var pr=B,Er=H,mr=G;let m=(i,y,o)=>(async()=>{if(typeof i!="string"||i.length===0)throw new Error('[awaitly] step() requires an explicit string ID as the first argument. Example: step("fetchUser", () => fetchUser(id))');let s=o??{},n=nr(s),c=i,E=s.key??i,w=s.key??i,{description:T,retry:x,timeout:h}=s,O=W(E),L=p,b=L?performance.now():0,A=Ve(y)?()=>y:y,P={attempts:Math.max(1,x?.attempts??1),backoff:x?.backoff??re.backoff,initialDelay:x?.initialDelay??re.initialDelay,maxDelay:x?.maxDelay??re.maxDelay,jitter:x?.jitter??re.jitter,shouldRetry:x?.shouldRetry??re.shouldRetry,onRetry:x?.onRetry??re.onRetry};p&&l({type:"step_start",workflowId:t,stepId:O,stepKey:E,name:c,description:T,ts:Date.now(),...n&&{metadata:n}});let Z;for(let D=1;D<=P.attempts;D++){let We=L?performance.now():0;try{let C;if(h?C=await cr(A,h,{name:c,key:E,attempt:D},v):C=await A(),C.ok){let Q=performance.now()-b;return l({type:"step_success",workflowId:t,stepId:O,stepKey:E,name:c,description:T,ts:Date.now(),durationMs:Q,...n&&{metadata:n}}),w&&l({type:"step_complete",workflowId:t,stepKey:w,name:c,description:T,ts:Date.now(),durationMs:Q,result:C,...n&&{metadata:n}}),C.value}if(Z=C,D<P.attempts&&P.shouldRetry(C.error,D)){let Q=de(D,P);l({type:"step_retry",workflowId:t,stepId:O,stepKey:E,name:c,ts:Date.now(),attempt:D+1,maxAttempts:P.attempts,delayMs:Q,error:C.error,...n&&{metadata:n},diagnostics:V(C.error,s.errorMeta,"result",D,performance.now()-b)}),P.onRetry(C.error,D,Q),await ye(Q);continue}P.attempts>1&&l({type:"step_retries_exhausted",workflowId:t,stepId:O,stepKey:E,name:c,ts:Date.now(),durationMs:performance.now()-b,attempts:D,lastError:C.error,...n&&{metadata:n},diagnostics:V(C.error,s.errorMeta,"result",D,performance.now()-b)});break}catch(C){let Q=performance.now()-We;if(ur(C)){let z=C.ms;l({type:"step_timeout",workflowId:t,stepId:O,stepKey:E,name:c,ts:Date.now(),timeoutMs:z,attempt:D,...n&&{metadata:n},diagnostics:V(C,s.errorMeta,"timeout",D)}),l({type:"step_success",workflowId:t,stepId:O,stepKey:E,name:c,description:T,ts:Date.now(),durationMs:performance.now()-b,...n&&{metadata:n}}),w&&l({type:"step_complete",workflowId:t,stepKey:w,name:c,description:T,ts:Date.now(),durationMs:performance.now()-b,result:$(void 0),...n&&{metadata:n}});return}if(X(C))throw l({type:"step_aborted",workflowId:t,stepId:O,stepKey:E,name:c,description:T,ts:Date.now(),durationMs:Q,...n&&{metadata:n}}),C;if(Me(C)){let z=or(C),qe=h?.ms??z?.timeoutMs??0;if(l({type:"step_timeout",workflowId:t,stepId:O,stepKey:E,name:c,ts:Date.now(),timeoutMs:qe,attempt:D,...n&&{metadata:n},diagnostics:V(C,s.errorMeta,"timeout",D)}),D<P.attempts&&P.shouldRetry(C,D)){let Ee=de(D,P);l({type:"step_retry",workflowId:t,stepId:O,stepKey:E,name:c,ts:Date.now(),attempt:D+1,maxAttempts:P.attempts,delayMs:Ee,error:C,...n&&{metadata:n},diagnostics:V(C,s.errorMeta,"timeout",D,performance.now()-b)}),P.onRetry(C,D,Ee),await ye(Ee);continue}P.attempts>1&&l({type:"step_retries_exhausted",workflowId:t,stepId:O,stepKey:E,name:c,ts:Date.now(),durationMs:performance.now()-b,attempts:D,lastError:C,...n&&{metadata:n},diagnostics:V(C,s.errorMeta,"timeout",D,performance.now()-b)});let pe=performance.now()-b;throw l({type:"step_error",workflowId:t,stepId:O,stepKey:E,name:c,description:T,ts:Date.now(),durationMs:pe,error:C,...n&&{metadata:n},diagnostics:V(C,s.errorMeta,"timeout",D,pe)}),w&&l({type:"step_complete",workflowId:t,stepKey:w,name:c,description:T,ts:Date.now(),durationMs:pe,result:F(C,{cause:C}),meta:{origin:"throw",thrown:C},...n&&{metadata:n}}),a?.(C,c,g),N(C,{origin:"throw",thrown:C})}if(D<P.attempts&&P.shouldRetry(C,D)){let z=de(D,P);l({type:"step_retry",workflowId:t,stepId:O,stepKey:E,name:c,ts:Date.now(),attempt:D+1,maxAttempts:P.attempts,delayMs:z,error:C,...n&&{metadata:n},diagnostics:V(C,s.errorMeta,"throw",D,performance.now()-b)}),P.onRetry(C,D,z),await ye(z);continue}P.attempts>1&&!Me(C)&&l({type:"step_retries_exhausted",workflowId:t,stepId:O,stepKey:E,name:c,ts:Date.now(),durationMs:performance.now()-b,attempts:D,lastError:C,...n&&{metadata:n},diagnostics:V(C,s.errorMeta,"throw",D,performance.now()-b)});let le=performance.now()-b,ne;try{ne=k(C)}catch(z){throw ee(z)}throw l({type:"step_error",workflowId:t,stepId:O,stepKey:E,name:c,description:T,ts:Date.now(),durationMs:le,error:ne,...n&&{metadata:n},diagnostics:V(C,s.errorMeta,"throw",D,le)}),w&&l({type:"step_complete",workflowId:t,stepKey:w,name:c,description:T,ts:Date.now(),durationMs:le,result:F(ne,{cause:C}),meta:{origin:"throw",thrown:C},...n&&{metadata:n}}),a?.(ne,c,g),N(ne,{origin:"throw",thrown:C})}}let J=Z,ue=performance.now()-b,ce=Y(J.error,{origin:"result",resultCause:J.cause});throw l({type:"step_error",workflowId:t,stepId:O,stepKey:E,name:c,description:T,ts:Date.now(),durationMs:ue,error:ce,...n&&{metadata:n},diagnostics:V(J.error,s.errorMeta,"result",P.attempts,ue)}),w&&l({type:"step_complete",workflowId:t,stepKey:w,name:c,description:T,ts:Date.now(),durationMs:ue,result:J,meta:{origin:"result",resultCause:J.cause},...n&&{metadata:n}}),a?.(ce,c,g),N(ce,{origin:"result",resultCause:J.cause})})();m.try=(i,y,o)=>{if(typeof i!="string"||i.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 s="error"in o?()=>o.error:o.onError;if(o.retry||o.timeout)return m.retry(i,async()=>{try{return $(await y())}catch(T){return F(s(T),{cause:T})}},{attempts:o.retry?.attempts??1,...o.retry??{},key:o.key,timeout:o.timeout});let n=o.key??i,c=i,E=i,w=p;return(async()=>{let T=w?performance.now():0;p&&l({type:"step_start",workflowId:t,stepId:E,stepKey:n,name:c,ts:Date.now()});try{let x=await y(),h=performance.now()-T;return l({type:"step_success",workflowId:t,stepId:E,stepKey:n,name:c,ts:Date.now(),durationMs:h}),n&&l({type:"step_complete",workflowId:t,stepKey:n,name:c,ts:Date.now(),durationMs:h,result:$(x)}),x}catch(x){let h=s(x),O=performance.now()-T,L=Y(h,{origin:"throw",thrown:x});throw l({type:"step_error",workflowId:t,stepId:E,stepKey:n,name:c,ts:Date.now(),durationMs:O,error:L}),n&&l({type:"step_complete",workflowId:t,stepKey:n,name:c,ts:Date.now(),durationMs:O,result:F(h,{cause:x}),meta:{origin:"throw",thrown:x}}),a?.(L,c,g),N(L,{origin:"throw",thrown:x})}})()},m.fromResult=(i,y,o)=>{if(typeof i!="string"||i.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 s=o.key??i,n=i,c=i,E="error"in o?()=>o.error:o.onError,w=p;return(async()=>{let T=w?performance.now():0;p&&l({type:"step_start",workflowId:t,stepId:c,stepKey:s,name:n,ts:Date.now()});let x=await y();if(x.ok){let h=performance.now()-T;return l({type:"step_success",workflowId:t,stepId:c,stepKey:s,name:n,ts:Date.now(),durationMs:h}),s&&l({type:"step_complete",workflowId:t,stepKey:s,name:n,ts:Date.now(),durationMs:h,result:$(x.value)}),x.value}else{let h=E(x.error),O=performance.now()-T,L=Y(h,{origin:"result",resultCause:x.error});throw l({type:"step_error",workflowId:t,stepId:c,stepKey:s,name:n,ts:Date.now(),durationMs:O,error:L}),s&&l({type:"step_complete",workflowId:t,stepKey:s,name:n,ts:Date.now(),durationMs:O,result:F(h,{cause:x.error}),meta:{origin:"result",resultCause:x.error}}),a?.(L,n,g),N(L,{origin:"result",resultCause:x.error})}})()},m.fromNullable=(i,y,o,s)=>{if(typeof i!="string"||i.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 m(i,async()=>{let n=await y();return n!=null?$(n):F(o())},s)},m.retry=(i,y,o)=>{if(typeof i!="string"||i.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 m(i,y,{key:o.key??i,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})},m.withTimeout=(i,y,o)=>{if(typeof i!="string"||i.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 m(i,y,{key:o.key??i,timeout:o})},m.sleep=(i,y,o)=>{if(typeof i!="string"||i.length===0)throw new Error('[awaitly] step.sleep() requires an explicit string ID as the first argument. Example: step.sleep("delay", "5s")');let s=typeof y=="string"?Ze(y):y;if(!s)throw new Error(`step.sleep: invalid duration '${y}'`);let n=s.millis,c=o?.signal;return m(i,async()=>{if(v?.aborted||c?.aborted){let E=new Error("Sleep aborted");throw E.name="AbortError",E}return new Promise((E,w)=>{let T={timeoutId:void 0},x=()=>{T.timeoutId&&clearTimeout(T.timeoutId);let h=new Error("Sleep aborted");h.name="AbortError",w(h)};v?.addEventListener("abort",x,{once:!0}),c?.addEventListener("abort",x,{once:!0}),T.timeoutId=setTimeout(()=>{v?.removeEventListener("abort",x),c?.removeEventListener("abort",x),E($(void 0))},n)})},{key:o?.key??i,description:o?.description})},m.all=((...i)=>{if(typeof i[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 y=i[0],o=i[1];if(typeof o=="function")return H(y,o);if(o&&typeof o=="object"&&!Array.isArray(o)){let n=B(o);return G(n,{name:y})}throw new TypeError("step.all(name, ...): second argument must be a function (array form) or an object of operations (object form).")}),m.race=(i,y)=>{let o=`scope_${Date.now()}_${Math.random().toString(36).slice(2,8)}`;return(async()=>{let s=performance.now(),n=!1,c={scopeId:o,type:"race",winnerId:void 0};I.push(c);let E=()=>{if(n)return;n=!0;let w=I.findIndex(T=>T.scopeId===o);w!==-1&&I.splice(w,1),l({type:"scope_end",workflowId:t,scopeId:o,ts:Date.now(),durationMs:performance.now()-s,winnerId:c.winnerId})};l({type:"scope_start",workflowId:t,scopeId:o,scopeType:"race",name:i,ts:Date.now()});try{let w=await y();if(E(),!w.ok)throw a?.(w.error,i,g),N(w.error,{origin:"result",resultCause:w.cause});return w.value}catch(w){throw E(),w}})()},m.if=(i,y,o)=>o(),m.label=m.if,m.branch=async(i,y)=>{let{condition:o,then:s,else:n}=y;if(o())return await s();if(n)return await n()},m.arm=(i,y)=>({fn:i,errors:y}),m.forEach=async(i,y,o)=>{let s=[],n=o.maxIterations,c=0,E="run"in o,w=Symbol.asyncIterator in y?y:(async function*(){yield*y})();for await(let T of w){if(n!==void 0&&c>=n)break;let x;E?x=await o.run(T,c):x=await o.item.handler(T,c,m),s.push(x),c++}return s},m.item=i=>({__forEachItemHandler:!0,handler:i}),m.dep=(i,y)=>y,m.workflow=(i,y,o)=>m(i,y,o),m.map=async(i,y,o,s)=>{let n=s?.concurrency??y.length;return m(i,()=>n>=y.length?De(y.map((c,E)=>o(c,E))):(async()=>{let c=[];for(let E=0;E<y.length;E+=n){let w=y.slice(E,E+n),T=await De(w.map((x,h)=>o(x,E+h)));if(!T.ok)return T;c.push(...T.value)}return $(c)})(),{key:s?.key})},m.withFallback=(i,y,o)=>{if(typeof i!="string"||i.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 s=o.key??i,n=i,c=W(s),E=p;return(async()=>{let w=E?performance.now():0;p&&l({type:"step_start",workflowId:t,stepId:c,stepKey:s,name:n,ts:Date.now()});let T;try{T=await y()}catch(b){if(X(b))throw l({type:"step_aborted",workflowId:t,stepId:c,stepKey:s,name:n,ts:Date.now(),durationMs:performance.now()-w}),b;let U;try{U=k(b)}catch(_){throw ee(_)}if(o.on!==void 0&&o.on!==U){let _=performance.now()-w;throw l({type:"step_error",workflowId:t,stepId:c,stepKey:s,name:n,ts:Date.now(),durationMs:_,error:U}),s&&l({type:"step_complete",workflowId:t,stepKey:s,name:n,ts:Date.now(),durationMs:_,result:F(U,{cause:b}),meta:{origin:"throw",thrown:b}}),a?.(U,n,g),N(U,{origin:"throw",thrown:b})}let A;try{A=await o.fallback()}catch(_){if(X(_))throw l({type:"step_aborted",workflowId:t,stepId:c,stepKey:s,name:n,ts:Date.now(),durationMs:performance.now()-w}),_;let P;try{P=k(_)}catch(J){throw ee(J)}let Z=performance.now()-w;throw l({type:"step_error",workflowId:t,stepId:c,stepKey:s,name:n,ts:Date.now(),durationMs:Z,error:P}),s&&l({type:"step_complete",workflowId:t,stepKey:s,name:n,ts:Date.now(),durationMs:Z,result:F(P,{cause:_}),meta:{origin:"throw",thrown:_}}),a?.(P,n,g),N(P,{origin:"throw",thrown:_})}if(A.ok){let _=performance.now()-w;return l({type:"step_success",workflowId:t,stepId:c,stepKey:s,name:n,ts:Date.now(),durationMs:_}),s&&l({type:"step_complete",workflowId:t,stepKey:s,name:n,ts:Date.now(),durationMs:_,result:A,meta:{origin:"fallback",fallbackUsed:!0,fallbackReason:String(U)}}),A.value}else{let _=performance.now()-w,P=Y(A.error,{origin:"result",resultCause:A.cause});throw l({type:"step_error",workflowId:t,stepId:c,stepKey:s,name:n,ts:Date.now(),durationMs:_,error:P}),s&&l({type:"step_complete",workflowId:t,stepKey:s,name:n,ts:Date.now(),durationMs:_,result:A,meta:{origin:"result",resultCause:A.cause}}),a?.(P,n,g),N(P,{origin:"result",resultCause:A.cause})}}if(T.ok){let b=performance.now()-w;return l({type:"step_success",workflowId:t,stepId:c,stepKey:s,name:n,ts:Date.now(),durationMs:b}),s&&l({type:"step_complete",workflowId:t,stepKey:s,name:n,ts:Date.now(),durationMs:b,result:T}),T.value}let x=T.error;if(o.on!==void 0&&o.on!==x){let b=performance.now()-w,U=Y(x,{origin:"result",resultCause:T.cause});throw l({type:"step_error",workflowId:t,stepId:c,stepKey:s,name:n,ts:Date.now(),durationMs:b,error:U}),s&&l({type:"step_complete",workflowId:t,stepKey:s,name:n,ts:Date.now(),durationMs:b,result:T,meta:{origin:"result",resultCause:T.cause}}),a?.(U,n,g),N(U,{origin:"result",resultCause:T.cause})}let h;try{h=await o.fallback()}catch(b){if(X(b))throw l({type:"step_aborted",workflowId:t,stepId:c,stepKey:s,name:n,ts:Date.now(),durationMs:performance.now()-w}),b;let U;try{U=k(b)}catch(_){throw ee(_)}let A=performance.now()-w;throw l({type:"step_error",workflowId:t,stepId:c,stepKey:s,name:n,ts:Date.now(),durationMs:A,error:U}),s&&l({type:"step_complete",workflowId:t,stepKey:s,name:n,ts:Date.now(),durationMs:A,result:F(U,{cause:b}),meta:{origin:"throw",thrown:b}}),a?.(U,n,g),N(U,{origin:"throw",thrown:b})}if(h.ok){let b=performance.now()-w;return l({type:"step_success",workflowId:t,stepId:c,stepKey:s,name:n,ts:Date.now(),durationMs:b}),s&&l({type:"step_complete",workflowId:t,stepKey:s,name:n,ts:Date.now(),durationMs:b,result:h,meta:{origin:"fallback",fallbackUsed:!0,fallbackReason:String(x)}}),h.value}let O=performance.now()-w,L=Y(h.error,{origin:"result",resultCause:h.cause});throw l({type:"step_error",workflowId:t,stepId:c,stepKey:s,name:n,ts:Date.now(),durationMs:O,error:L}),s&&l({type:"step_complete",workflowId:t,stepKey:s,name:n,ts:Date.now(),durationMs:O,result:h,meta:{origin:"result",resultCause:h.cause}}),a?.(L,n,g),N(L,{origin:"result",resultCause:h.cause})})()},m.withResource=(i,y)=>{if(typeof i!="string"||i.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=i,s=i,n=W(o),c=p;return(async()=>{let E=c?performance.now():0;p&&l({type:"step_start",workflowId:t,stepId:n,stepKey:o,name:s,ts:Date.now()});let w;try{w=await y.acquire()}catch(A){if(X(A))throw l({type:"step_aborted",workflowId:t,stepId:n,stepKey:o,name:s,ts:Date.now(),durationMs:performance.now()-E}),A;let _;try{_=k(A)}catch(Z){throw ee(Z)}let P=performance.now()-E;throw l({type:"step_error",workflowId:t,stepId:n,stepKey:o,name:s,ts:Date.now(),durationMs:P,error:_}),o&&l({type:"step_complete",workflowId:t,stepKey:o,name:s,ts:Date.now(),durationMs:P,result:F(_,{cause:A}),meta:{origin:"throw",thrown:A}}),a?.(_,s,g),N(_,{origin:"throw",thrown:A})}if(!w.ok){let A=performance.now()-E,_=Y(w.error,{origin:"result",resultCause:w.cause});throw l({type:"step_error",workflowId:t,stepId:n,stepKey:o,name:s,ts:Date.now(),durationMs:A,error:_}),o&&l({type:"step_complete",workflowId:t,stepKey:o,name:s,ts:Date.now(),durationMs:A,result:w,meta:{origin:"result",resultCause:w.cause}}),a?.(_,s,g),N(_,{origin:"result",resultCause:w.cause})}let T=w.value,x,h,O=!1;try{x=await y.use(T)}catch(A){if(X(A)){try{await y.release(T)}catch(_){console.warn(`[awaitly] step.withResource("${i}"): release threw after earlyExit:`,_)}throw A}h=A,O=!0}try{await y.release(T)}catch(A){console.warn(`[awaitly] step.withResource("${i}"): release threw:`,A)}if(O){let A;try{A=k(h)}catch(P){throw ee(P)}let _=performance.now()-E;throw l({type:"step_error",workflowId:t,stepId:n,stepKey:o,name:s,ts:Date.now(),durationMs:_,error:A}),o&&l({type:"step_complete",workflowId:t,stepKey:o,name:s,ts:Date.now(),durationMs:_,result:F(A,{cause:h}),meta:{origin:"throw",thrown:h}}),a?.(A,s,g),N(A,{origin:"throw",thrown:h})}let L=x;if(L.ok){let A=performance.now()-E;return l({type:"step_success",workflowId:t,stepId:n,stepKey:o,name:s,ts:Date.now(),durationMs:A}),o&&l({type:"step_complete",workflowId:t,stepKey:o,name:s,ts:Date.now(),durationMs:A,result:L}),L.value}let b=performance.now()-E,U=Y(L.error,{origin:"result",resultCause:L.cause});throw l({type:"step_error",workflowId:t,stepId:n,stepKey:o,name:s,ts:Date.now(),durationMs:b,error:U}),o&&l({type:"step_complete",workflowId:t,stepKey:o,name:s,ts:Date.now(),durationMs:b,result:L,meta:{origin:"result",resultCause:L.cause}}),a?.(U,s,g),N(U,{origin:"result",resultCause:L.cause})})()};let q=await f({step:m});if(process.env.NODE_ENV!=="production"&&q!==null&&typeof q=="object"&&"ok"in q&&typeof q.ok=="boolean"){let i=q;(i.ok===!0&&"value"in i||i.ok===!1&&"error"in i)&&console.warn(`awaitly: Workflow executor returned a Result-like object. Return raw values, not ok() or err().
|
|
2
|
-
|
|
3
|
-
Incorrect: return ok({ data });
|
|
4
|
-
Correct: return { data };
|
|
5
|
-
|
|
6
|
-
See: https://jagreehal.github.io/awaitly/guides/troubleshooting/#returning-ok-from-workflow-executor-double-wrapping`)}return $(q)}catch(m){if(ir(m))throw m.thrown;if(X(m)){let H=m.meta.origin==="throw"?m.meta.thrown:m.meta.origin==="result"?m.meta.resultCause:void 0;return F(m.error,{cause:H})}let B=k(m);return a?.(B,"unexpected",g),F(B,{cause:m})}}we.strict=(e,r)=>we(e,r);async function De(e){return e.length===0?$([]):new Promise(r=>{let u=!1,f=e.length,d=new Array(e.length);for(let a=0;a<e.length;a++){let p=a;Promise.resolve(e[p]).catch(R=>F({type:"PROMISE_REJECTED",cause:R},{cause:{type:"PROMISE_REJECTION",reason:R}})).then(R=>{if(!u){if(!R.ok){u=!0,r(R);return}d[p]=R.value,f--,f===0&&r($(d))}})}})}function Fe(e){return typeof e=="object"&&e!==null&&e.type==="RATE_LIMIT_EXCEEDED"}function fe(e){return typeof e=="object"&&e!==null&&e.type==="QUEUE_FULL"}function Te(e,r){let{maxPerSecond:u,strategy:f="wait"}=r,d=r.burstCapacity??u*2,a=d,p=Date.now(),R=u/1e3,S=[];function M(){let t=Date.now(),I=(t-p)*R;a=Math.min(d,a+I),p=t}function g(){if(M(),a>=1)return a-=1,0;let t=1-a;return Math.ceil(t/R)}async function v(){return new Promise(t=>{let k=()=>{let I=g();I===0?t():(S.push(k),setTimeout(()=>{let K=S.indexOf(k);K!==-1&&(S.splice(K,1),k())},I))};k()})}return{async execute(t){let k=g();if(k>0){if(f==="reject")throw{type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:k};await v()}return t()},async executeResult(t){let k=g();if(k>0){if(f==="reject")return F({type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:k});await v()}return t()},getStats(){return M(),{availableTokens:Math.floor(a),maxTokens:d,tokensPerSecond:u,waitingCount:S.length}},reset(){a=d,p=Date.now(),S.length=0}}}function ke(e,r){let{maxConcurrent:u,strategy:f="queue",maxQueueSize:d=1/0}=r,a=0,p=[];async function R(){if(a<u){a++;return}if(f==="reject")throw{type:"QUEUE_FULL",limiterName:e,queueSize:p.length,maxQueueSize:d};if(p.length>=d)throw{type:"QUEUE_FULL",limiterName:e,queueSize:p.length,maxQueueSize:d};return new Promise((M,g)=>{p.push({resolve:M,reject:g})})}function S(){a--,p.length>0&&a<u&&(a++,p.shift()?.resolve())}return{async execute(M){await R();try{return await M()}finally{S()}},async executeAll(M){let g=new Array(M.length),v=[];for(let t=0;t<M.length;t++){let k=t,I=this.execute(M[k]).then(K=>{g[k]=K});v.push(I)}return await Promise.all(v),g},async executeResult(M){try{await R()}catch(g){if(fe(g))return F(g);throw g}try{return await M()}finally{S()}},getStats(){return{activeCount:a,maxConcurrent:u,queueSize:p.length,maxQueueSize:d}},reset(){for(a=0;p.length>0;)p.shift()?.reject(new Error("Limiter reset"))}}}function Ne(e,r){let u=r.rate?Te(`${e}-rate`,r.rate):void 0,f=r.concurrency?ke(`${e}-concurrency`,r.concurrency):void 0;return{rate:u,concurrency:f,async execute(d){let a=d;if(u){let p=a;a=()=>u.execute(p)}return f?f.execute(a):a()}}}function je(e,r){let{limit:u,windowMs:f=1e3,strategy:d="wait"}=r,a=Date.now(),p=0,R=[];function S(){let v=Date.now(),t=v-a;return t>=f?(a=v,p=0,0):f-t}function M(v){let t=S();return p+v<=u?(p+=v,0):t}async function g(v){return new Promise(t=>{let k=()=>{let I=M(v);I===0?t():(R.push({resolve:k,cost:v}),setTimeout(()=>{let K=R.findIndex(W=>W.resolve===k);K!==-1&&(R.splice(K,1),k())},I))};k()})}return{async execute(v,t=1){if(t>u)throw{type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:f};let k=M(t);if(k>0){if(d==="reject")throw{type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:k};await g(t)}return v()},async executeResult(v,t=1){if(t>u)return F({type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:f});let k=M(t);if(k>0){if(d==="reject")return F({type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:k});await g(t)}return v()},getStats(){let v=S();return{requestCount:p,limit:u,windowMs:f,remainingMs:v,waitingCount:R.length}},reset(){a=Date.now(),p=0,R.length=0}}}function Ke(e,r){let{tokensPerSecond:u,strategy:f="wait"}=r,d=r.maxTokens??u*2,a=d,p=Date.now(),R=u/1e3,S=[];function M(){let t=Date.now(),I=(t-p)*R;a=Math.min(d,a+I),p=t}function g(t){if(M(),a>=t)return a-=t,0;let k=t-a;return Math.ceil(k/R)}async function v(t){return new Promise(k=>{let I=()=>{let K=g(t);K===0?k():(S.push({check:I,cost:t}),setTimeout(()=>{let W=S.findIndex(l=>l.check===I);W!==-1&&(S.splice(W,1),I())},K))};I()})}return{async execute(t,k=1){if(k>d)throw{type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:Math.ceil(k/R)};let I=g(k);if(I>0){if(f==="reject")throw{type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:I};await v(k)}return t()},async executeResult(t,k=1){if(k>d)return F({type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:Math.ceil(k/R)});let I=g(k);if(I>0){if(f==="reject")return F({type:"RATE_LIMIT_EXCEEDED",limiterName:e,retryAfterMs:I});await v(k)}return t()},getStats(){return M(),{availableTokens:a,maxTokens:d,tokensPerSecond:u,waitingCount:S.length}},reset(){a=d,p=Date.now(),S.length=0}}}var Be={api:{maxPerSecond:10,burstCapacity:20,strategy:"wait"},database:{maxConcurrent:10,strategy:"queue",maxQueueSize:100},external:{maxPerSecond:5,burstCapacity:10,strategy:"wait"}};0&&(module.exports={createCombinedLimiter,createConcurrencyLimiter,createCostBasedRateLimiter,createFixedWindowLimiter,createRateLimiter,isQueueFullError,isRateLimitExceededError,rateLimiterPresets});
|
|
7
|
-
//# sourceMappingURL=ratelimit.cjs.map
|