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.
Files changed (241) hide show
  1. package/dist/{duration.d.ts → di-BDlT7InM.d.cts} +15 -1
  2. package/dist/{duration.d.cts → di-BbFFfO8y.d.ts} +15 -1
  3. package/dist/errors-DtXvrCiO.d.cts +708 -0
  4. package/dist/errors-DtXvrCiO.d.ts +708 -0
  5. package/dist/index.cjs +4594 -1
  6. package/dist/index.cjs.map +1 -1
  7. package/dist/index.d.cts +1970 -141
  8. package/dist/index.d.ts +1970 -141
  9. package/dist/index.js +4398 -1
  10. package/dist/index.js.map +1 -1
  11. package/dist/result.cjs +641 -1
  12. package/dist/result.cjs.map +1 -1
  13. package/dist/result.d.cts +29 -4
  14. package/dist/result.d.ts +29 -4
  15. package/dist/result.js +561 -1
  16. package/dist/result.js.map +1 -1
  17. package/dist/testing.cjs +4202 -8
  18. package/dist/testing.cjs.map +1 -1
  19. package/dist/testing.d.cts +2 -6
  20. package/dist/testing.d.ts +2 -6
  21. package/dist/testing.js +4154 -8
  22. package/dist/testing.js.map +1 -1
  23. package/dist/{run-entry-DGs0tySr.d.cts → types-B8NfNRGX.d.ts} +1078 -1502
  24. package/dist/{run-entry-BOuNyVoO.d.ts → types-BZ2f4MRR.d.cts} +1078 -1502
  25. package/dist/workflow.cjs +7096 -6
  26. package/dist/workflow.cjs.map +1 -1
  27. package/dist/workflow.d.cts +3346 -22
  28. package/dist/workflow.d.ts +3346 -22
  29. package/dist/workflow.js +6929 -6
  30. package/dist/workflow.js.map +1 -1
  31. package/package.json +3 -168
  32. package/dist/adapters.cjs +0 -7
  33. package/dist/adapters.cjs.map +0 -1
  34. package/dist/adapters.d.cts +0 -179
  35. package/dist/adapters.d.ts +0 -179
  36. package/dist/adapters.js +0 -7
  37. package/dist/adapters.js.map +0 -1
  38. package/dist/batch.cjs +0 -7
  39. package/dist/batch.cjs.map +0 -1
  40. package/dist/batch.d.cts +0 -200
  41. package/dist/batch.d.ts +0 -200
  42. package/dist/batch.js +0 -7
  43. package/dist/batch.js.map +0 -1
  44. package/dist/bind-deps.cjs +0 -2
  45. package/dist/bind-deps.cjs.map +0 -1
  46. package/dist/bind-deps.d.cts +0 -28
  47. package/dist/bind-deps.d.ts +0 -28
  48. package/dist/bind-deps.js +0 -2
  49. package/dist/bind-deps.js.map +0 -1
  50. package/dist/cache.cjs +0 -2
  51. package/dist/cache.cjs.map +0 -1
  52. package/dist/cache.d.cts +0 -269
  53. package/dist/cache.d.ts +0 -269
  54. package/dist/cache.js +0 -2
  55. package/dist/cache.js.map +0 -1
  56. package/dist/circuit-breaker.cjs +0 -7
  57. package/dist/circuit-breaker.cjs.map +0 -1
  58. package/dist/circuit-breaker.d.cts +0 -211
  59. package/dist/circuit-breaker.d.ts +0 -211
  60. package/dist/circuit-breaker.js +0 -7
  61. package/dist/circuit-breaker.js.map +0 -1
  62. package/dist/conditional.cjs +0 -2
  63. package/dist/conditional.cjs.map +0 -1
  64. package/dist/conditional.d.cts +0 -252
  65. package/dist/conditional.d.ts +0 -252
  66. package/dist/conditional.js +0 -2
  67. package/dist/conditional.js.map +0 -1
  68. package/dist/core.cjs +0 -7
  69. package/dist/core.cjs.map +0 -1
  70. package/dist/core.d.cts +0 -5
  71. package/dist/core.d.ts +0 -5
  72. package/dist/core.js +0 -7
  73. package/dist/core.js.map +0 -1
  74. package/dist/di-By77n4Fa.d.ts +0 -15
  75. package/dist/di-OJfsohf-.d.cts +0 -15
  76. package/dist/diagnostics.cjs +0 -8
  77. package/dist/diagnostics.cjs.map +0 -1
  78. package/dist/diagnostics.d.cts +0 -68
  79. package/dist/diagnostics.d.ts +0 -68
  80. package/dist/diagnostics.js +0 -8
  81. package/dist/diagnostics.js.map +0 -1
  82. package/dist/durable.cjs +0 -11
  83. package/dist/durable.cjs.map +0 -1
  84. package/dist/durable.d.cts +0 -9
  85. package/dist/durable.d.ts +0 -9
  86. package/dist/durable.js +0 -11
  87. package/dist/durable.js.map +0 -1
  88. package/dist/duration.cjs +0 -2
  89. package/dist/duration.cjs.map +0 -1
  90. package/dist/duration.js +0 -2
  91. package/dist/duration.js.map +0 -1
  92. package/dist/engine.cjs +0 -11
  93. package/dist/engine.cjs.map +0 -1
  94. package/dist/engine.d.cts +0 -115
  95. package/dist/engine.d.ts +0 -115
  96. package/dist/engine.js +0 -11
  97. package/dist/engine.js.map +0 -1
  98. package/dist/errors.cjs +0 -2
  99. package/dist/errors.cjs.map +0 -1
  100. package/dist/errors.d.cts +0 -361
  101. package/dist/errors.d.ts +0 -361
  102. package/dist/errors.js +0 -2
  103. package/dist/errors.js.map +0 -1
  104. package/dist/fetch.cjs +0 -7
  105. package/dist/fetch.cjs.map +0 -1
  106. package/dist/fetch.d.cts +0 -86
  107. package/dist/fetch.d.ts +0 -86
  108. package/dist/fetch.js +0 -7
  109. package/dist/fetch.js.map +0 -1
  110. package/dist/flow.cjs +0 -7
  111. package/dist/flow.cjs.map +0 -1
  112. package/dist/flow.d.cts +0 -163
  113. package/dist/flow.d.ts +0 -163
  114. package/dist/flow.js +0 -7
  115. package/dist/flow.js.map +0 -1
  116. package/dist/functional.cjs +0 -2
  117. package/dist/functional.cjs.map +0 -1
  118. package/dist/functional.d.cts +0 -444
  119. package/dist/functional.d.ts +0 -444
  120. package/dist/functional.js +0 -2
  121. package/dist/functional.js.map +0 -1
  122. package/dist/guards-4sV7mTqj.d.cts +0 -72
  123. package/dist/guards-BIX05ALH.d.ts +0 -72
  124. package/dist/hitl-DFn4Xa_l.d.cts +0 -468
  125. package/dist/hitl-DU5VpKq7.d.ts +0 -468
  126. package/dist/hitl.cjs +0 -7
  127. package/dist/hitl.cjs.map +0 -1
  128. package/dist/hitl.d.cts +0 -442
  129. package/dist/hitl.d.ts +0 -442
  130. package/dist/hitl.js +0 -7
  131. package/dist/hitl.js.map +0 -1
  132. package/dist/index-CnvBryQB.d.ts +0 -417
  133. package/dist/index-DEZEf8Fs.d.cts +0 -417
  134. package/dist/match-entry-DjI2bLpD.d.cts +0 -209
  135. package/dist/match-entry-DjI2bLpD.d.ts +0 -209
  136. package/dist/match.cjs +0 -2
  137. package/dist/match.cjs.map +0 -1
  138. package/dist/match.d.cts +0 -1
  139. package/dist/match.d.ts +0 -1
  140. package/dist/match.js +0 -2
  141. package/dist/match.js.map +0 -1
  142. package/dist/otel.cjs +0 -2
  143. package/dist/otel.cjs.map +0 -1
  144. package/dist/otel.d.cts +0 -188
  145. package/dist/otel.d.ts +0 -188
  146. package/dist/otel.js +0 -2
  147. package/dist/otel.js.map +0 -1
  148. package/dist/persistence-entry-B-8PjnSR.d.cts +0 -831
  149. package/dist/persistence-entry-D8zRkLiT.d.ts +0 -831
  150. package/dist/persistence.cjs +0 -2
  151. package/dist/persistence.cjs.map +0 -1
  152. package/dist/persistence.d.cts +0 -7
  153. package/dist/persistence.d.ts +0 -7
  154. package/dist/persistence.js +0 -2
  155. package/dist/persistence.js.map +0 -1
  156. package/dist/policies.cjs +0 -2
  157. package/dist/policies.cjs.map +0 -1
  158. package/dist/policies.d.cts +0 -379
  159. package/dist/policies.d.ts +0 -379
  160. package/dist/policies.js +0 -2
  161. package/dist/policies.js.map +0 -1
  162. package/dist/ratelimit.cjs +0 -7
  163. package/dist/ratelimit.cjs.map +0 -1
  164. package/dist/ratelimit.d.cts +0 -458
  165. package/dist/ratelimit.d.ts +0 -458
  166. package/dist/ratelimit.js +0 -7
  167. package/dist/ratelimit.js.map +0 -1
  168. package/dist/reliability.cjs +0 -11
  169. package/dist/reliability.cjs.map +0 -1
  170. package/dist/reliability.d.cts +0 -11
  171. package/dist/reliability.d.ts +0 -11
  172. package/dist/reliability.js +0 -11
  173. package/dist/reliability.js.map +0 -1
  174. package/dist/resolver.cjs +0 -7
  175. package/dist/resolver.cjs.map +0 -1
  176. package/dist/resolver.d.cts +0 -68
  177. package/dist/resolver.d.ts +0 -68
  178. package/dist/resolver.js +0 -7
  179. package/dist/resolver.js.map +0 -1
  180. package/dist/resource.cjs +0 -7
  181. package/dist/resource.cjs.map +0 -1
  182. package/dist/resource.d.cts +0 -174
  183. package/dist/resource.d.ts +0 -174
  184. package/dist/resource.js +0 -7
  185. package/dist/resource.js.map +0 -1
  186. package/dist/result/retry.cjs +0 -2
  187. package/dist/result/retry.cjs.map +0 -1
  188. package/dist/result/retry.d.cts +0 -70
  189. package/dist/result/retry.d.ts +0 -70
  190. package/dist/result/retry.js +0 -2
  191. package/dist/result/retry.js.map +0 -1
  192. package/dist/retry.cjs +0 -2
  193. package/dist/retry.cjs.map +0 -1
  194. package/dist/retry.d.cts +0 -388
  195. package/dist/retry.d.ts +0 -388
  196. package/dist/retry.js +0 -2
  197. package/dist/retry.js.map +0 -1
  198. package/dist/run.cjs +0 -7
  199. package/dist/run.cjs.map +0 -1
  200. package/dist/run.d.cts +0 -4
  201. package/dist/run.d.ts +0 -4
  202. package/dist/run.js +0 -7
  203. package/dist/run.js.map +0 -1
  204. package/dist/saga.cjs +0 -11
  205. package/dist/saga.cjs.map +0 -1
  206. package/dist/saga.d.cts +0 -164
  207. package/dist/saga.d.ts +0 -164
  208. package/dist/saga.js +0 -11
  209. package/dist/saga.js.map +0 -1
  210. package/dist/singleflight.cjs +0 -2
  211. package/dist/singleflight.cjs.map +0 -1
  212. package/dist/singleflight.d.cts +0 -145
  213. package/dist/singleflight.d.ts +0 -145
  214. package/dist/singleflight.js +0 -2
  215. package/dist/singleflight.js.map +0 -1
  216. package/dist/slugs.cjs +0 -2
  217. package/dist/slugs.cjs.map +0 -1
  218. package/dist/slugs.d.cts +0 -67
  219. package/dist/slugs.d.ts +0 -67
  220. package/dist/slugs.js +0 -2
  221. package/dist/slugs.js.map +0 -1
  222. package/dist/streaming.cjs +0 -9
  223. package/dist/streaming.cjs.map +0 -1
  224. package/dist/streaming.d.cts +0 -596
  225. package/dist/streaming.d.ts +0 -596
  226. package/dist/streaming.js +0 -9
  227. package/dist/streaming.js.map +0 -1
  228. package/dist/tagged-error.cjs +0 -2
  229. package/dist/tagged-error.cjs.map +0 -1
  230. package/dist/tagged-error.d.cts +0 -275
  231. package/dist/tagged-error.d.ts +0 -275
  232. package/dist/tagged-error.js +0 -2
  233. package/dist/tagged-error.js.map +0 -1
  234. package/dist/types-BziYHFkD.d.ts +0 -323
  235. package/dist/types-C5jLEUqY.d.cts +0 -323
  236. package/dist/webhook.cjs +0 -7
  237. package/dist/webhook.cjs.map +0 -1
  238. package/dist/webhook.d.cts +0 -499
  239. package/dist/webhook.d.ts +0 -499
  240. package/dist/webhook.js +0 -7
  241. package/dist/webhook.js.map +0 -1
@@ -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
@@ -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"]}
@@ -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