ai-workflows 2.1.1 → 2.3.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 (211) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +17 -1
  3. package/README.md +305 -184
  4. package/dist/barrier.d.ts +159 -0
  5. package/dist/barrier.d.ts.map +1 -0
  6. package/dist/barrier.js +377 -0
  7. package/dist/barrier.js.map +1 -0
  8. package/dist/cascade-context.d.ts +149 -0
  9. package/dist/cascade-context.d.ts.map +1 -0
  10. package/dist/cascade-context.js +324 -0
  11. package/dist/cascade-context.js.map +1 -0
  12. package/dist/cascade-executor.d.ts +196 -0
  13. package/dist/cascade-executor.d.ts.map +1 -0
  14. package/dist/cascade-executor.js +384 -0
  15. package/dist/cascade-executor.js.map +1 -0
  16. package/dist/context.d.ts.map +1 -1
  17. package/dist/context.js +27 -8
  18. package/dist/context.js.map +1 -1
  19. package/dist/cron-parser.d.ts +65 -0
  20. package/dist/cron-parser.d.ts.map +1 -0
  21. package/dist/cron-parser.js +294 -0
  22. package/dist/cron-parser.js.map +1 -0
  23. package/dist/cron-scheduler.d.ts +117 -0
  24. package/dist/cron-scheduler.d.ts.map +1 -0
  25. package/dist/cron-scheduler.js +176 -0
  26. package/dist/cron-scheduler.js.map +1 -0
  27. package/dist/database-context.d.ts +184 -0
  28. package/dist/database-context.d.ts.map +1 -0
  29. package/dist/database-context.js +428 -0
  30. package/dist/database-context.js.map +1 -0
  31. package/dist/dependency-graph.d.ts +157 -0
  32. package/dist/dependency-graph.d.ts.map +1 -0
  33. package/dist/dependency-graph.js +382 -0
  34. package/dist/dependency-graph.js.map +1 -0
  35. package/dist/digital-objects-adapter.d.ts +159 -0
  36. package/dist/digital-objects-adapter.d.ts.map +1 -0
  37. package/dist/digital-objects-adapter.js +229 -0
  38. package/dist/digital-objects-adapter.js.map +1 -0
  39. package/dist/durable-execution-cloudflare.d.ts +427 -0
  40. package/dist/durable-execution-cloudflare.d.ts.map +1 -0
  41. package/dist/durable-execution-cloudflare.js +510 -0
  42. package/dist/durable-execution-cloudflare.js.map +1 -0
  43. package/dist/durable-execution.d.ts +482 -0
  44. package/dist/durable-execution.d.ts.map +1 -0
  45. package/dist/durable-execution.js +594 -0
  46. package/dist/durable-execution.js.map +1 -0
  47. package/dist/durable-workflow.d.ts +176 -0
  48. package/dist/durable-workflow.d.ts.map +1 -0
  49. package/dist/durable-workflow.js +552 -0
  50. package/dist/durable-workflow.js.map +1 -0
  51. package/dist/every.d.ts +31 -2
  52. package/dist/every.d.ts.map +1 -1
  53. package/dist/every.js +63 -32
  54. package/dist/every.js.map +1 -1
  55. package/dist/graph/index.d.ts +8 -0
  56. package/dist/graph/index.d.ts.map +1 -0
  57. package/dist/graph/index.js +8 -0
  58. package/dist/graph/index.js.map +1 -0
  59. package/dist/graph/topological-sort.d.ts +121 -0
  60. package/dist/graph/topological-sort.d.ts.map +1 -0
  61. package/dist/graph/topological-sort.js +292 -0
  62. package/dist/graph/topological-sort.js.map +1 -0
  63. package/dist/index.d.ts +10 -1
  64. package/dist/index.d.ts.map +1 -1
  65. package/dist/index.js +25 -0
  66. package/dist/index.js.map +1 -1
  67. package/dist/logger.d.ts +101 -0
  68. package/dist/logger.d.ts.map +1 -0
  69. package/dist/logger.js +115 -0
  70. package/dist/logger.js.map +1 -0
  71. package/dist/on.d.ts +35 -10
  72. package/dist/on.d.ts.map +1 -1
  73. package/dist/on.js +53 -19
  74. package/dist/on.js.map +1 -1
  75. package/dist/runtime.d.ts +169 -0
  76. package/dist/runtime.d.ts.map +1 -0
  77. package/dist/runtime.js +275 -0
  78. package/dist/runtime.js.map +1 -0
  79. package/dist/send.d.ts.map +1 -1
  80. package/dist/send.js +4 -3
  81. package/dist/send.js.map +1 -1
  82. package/dist/telemetry.d.ts +150 -0
  83. package/dist/telemetry.d.ts.map +1 -0
  84. package/dist/telemetry.js +388 -0
  85. package/dist/telemetry.js.map +1 -0
  86. package/dist/timer-registry.d.ts +77 -0
  87. package/dist/timer-registry.d.ts.map +1 -0
  88. package/dist/timer-registry.js +154 -0
  89. package/dist/timer-registry.js.map +1 -0
  90. package/dist/types.d.ts +105 -6
  91. package/dist/types.d.ts.map +1 -1
  92. package/dist/types.js +17 -1
  93. package/dist/types.js.map +1 -1
  94. package/dist/worker/durable-step.d.ts +481 -0
  95. package/dist/worker/durable-step.d.ts.map +1 -0
  96. package/dist/worker/durable-step.js +606 -0
  97. package/dist/worker/durable-step.js.map +1 -0
  98. package/dist/worker/index.d.ts +106 -0
  99. package/dist/worker/index.d.ts.map +1 -0
  100. package/dist/worker/index.js +124 -0
  101. package/dist/worker/index.js.map +1 -0
  102. package/dist/worker/state-adapter.d.ts +230 -0
  103. package/dist/worker/state-adapter.d.ts.map +1 -0
  104. package/dist/worker/state-adapter.js +409 -0
  105. package/dist/worker/state-adapter.js.map +1 -0
  106. package/dist/worker/topological-executor.d.ts +282 -0
  107. package/dist/worker/topological-executor.d.ts.map +1 -0
  108. package/dist/worker/topological-executor.js +396 -0
  109. package/dist/worker/topological-executor.js.map +1 -0
  110. package/dist/worker/workflow-builder.d.ts +286 -0
  111. package/dist/worker/workflow-builder.d.ts.map +1 -0
  112. package/dist/worker/workflow-builder.js +565 -0
  113. package/dist/worker/workflow-builder.js.map +1 -0
  114. package/dist/worker.d.ts +800 -0
  115. package/dist/worker.d.ts.map +1 -0
  116. package/dist/worker.js +2428 -0
  117. package/dist/worker.js.map +1 -0
  118. package/dist/workflow-builder.d.ts +287 -0
  119. package/dist/workflow-builder.d.ts.map +1 -0
  120. package/dist/workflow-builder.js +762 -0
  121. package/dist/workflow-builder.js.map +1 -0
  122. package/dist/workflow.d.ts +14 -30
  123. package/dist/workflow.d.ts.map +1 -1
  124. package/dist/workflow.js +136 -292
  125. package/dist/workflow.js.map +1 -1
  126. package/examples/01-ecommerce-order-pipeline.ts +358 -0
  127. package/examples/02-content-moderation-cascade.ts +454 -0
  128. package/examples/03-scheduled-reporting-dependencies.ts +479 -0
  129. package/examples/04-database-persistence.ts +518 -0
  130. package/examples/README.md +173 -0
  131. package/package.json +21 -4
  132. package/src/__tests__/digital-objects-adapter.test.ts +274 -0
  133. package/src/__tests__/durable-workflow.test.ts +297 -0
  134. package/src/barrier.ts +507 -0
  135. package/src/cascade-context.ts +495 -0
  136. package/src/cascade-executor.ts +588 -0
  137. package/src/context.ts +51 -17
  138. package/src/cron-parser.ts +347 -0
  139. package/src/cron-scheduler.ts +239 -0
  140. package/src/database-context.ts +658 -0
  141. package/src/dependency-graph.ts +518 -0
  142. package/src/digital-objects-adapter.ts +351 -0
  143. package/src/durable-execution-cloudflare.ts +855 -0
  144. package/src/durable-execution.ts +1042 -0
  145. package/src/durable-workflow.ts +717 -0
  146. package/src/every.ts +104 -35
  147. package/src/graph/index.ts +19 -0
  148. package/src/graph/topological-sort.ts +412 -0
  149. package/src/index.ts +147 -0
  150. package/src/logger.ts +148 -0
  151. package/src/on.ts +81 -26
  152. package/src/runtime.ts +436 -0
  153. package/src/send.ts +4 -5
  154. package/src/telemetry.ts +577 -0
  155. package/src/timer-registry.ts +179 -0
  156. package/src/types.ts +146 -10
  157. package/src/worker/durable-step.ts +976 -0
  158. package/src/worker/index.ts +216 -0
  159. package/src/worker/state-adapter.ts +589 -0
  160. package/src/worker/topological-executor.ts +625 -0
  161. package/src/worker/workflow-builder.ts +871 -0
  162. package/src/worker.ts +2906 -0
  163. package/src/workflow-builder.ts +1068 -0
  164. package/src/workflow.ts +199 -355
  165. package/test/barrier-join.test.ts +442 -0
  166. package/test/barrier-unhandled-rejections.test.ts +359 -0
  167. package/test/cascade-context.test.ts +390 -0
  168. package/test/cascade-executor.test.ts +852 -0
  169. package/test/cron-parser.test.ts +314 -0
  170. package/test/cron-scheduler.test.ts +291 -0
  171. package/test/database-context.test.ts +770 -0
  172. package/test/db-provider-adapter.test.ts +862 -0
  173. package/test/dependency-graph.test.ts +512 -0
  174. package/test/durable-execution-cloudflare.test.ts +606 -0
  175. package/test/durable-execution-in-process.test.ts +286 -0
  176. package/test/durable-execution.test.ts +247 -0
  177. package/test/e2e/workflow-scenarios.e2e.test.ts +1039 -0
  178. package/test/graph/topological-sort.test.ts +586 -0
  179. package/test/integration.test.ts +442 -0
  180. package/test/rpc-surface.test.ts +946 -0
  181. package/test/runtime.test.ts +262 -0
  182. package/test/schedule-timer-cleanup.test.ts +353 -0
  183. package/test/send-race-conditions.test.ts +400 -0
  184. package/test/type-safety-every.test.ts +303 -0
  185. package/test/worker/durable-cascade.test.ts +1117 -0
  186. package/test/worker/durable-step.test.ts +723 -0
  187. package/test/worker/topological-executor.test.ts +1240 -0
  188. package/test/worker/workflow-builder.test.ts +1067 -0
  189. package/test/worker.test.ts +608 -0
  190. package/test/workflow-builder.test.ts +1670 -0
  191. package/test/workflow-cron.test.ts +256 -0
  192. package/test/workflow-state-adapter.test.ts +923 -0
  193. package/test/workflow.test.ts +25 -22
  194. package/tsconfig.json +3 -1
  195. package/vitest.config.ts +38 -1
  196. package/vitest.workers.config.ts +44 -0
  197. package/wrangler.jsonc +22 -0
  198. package/.turbo/turbo-test.log +0 -7
  199. package/src/context.js +0 -83
  200. package/src/every.js +0 -267
  201. package/src/index.js +0 -71
  202. package/src/on.js +0 -79
  203. package/src/send.js +0 -111
  204. package/src/types.js +0 -4
  205. package/src/workflow.js +0 -455
  206. package/test/context.test.js +0 -116
  207. package/test/every.test.js +0 -282
  208. package/test/on.test.js +0 -80
  209. package/test/send.test.js +0 -89
  210. package/test/workflow.test.js +0 -224
  211. package/vitest.config.js +0 -7
@@ -0,0 +1,159 @@
1
+ /**
2
+ * Barrier/Join semantics for parallel step coordination
3
+ *
4
+ * Provides synchronization primitives for coordinating parallel workflow steps:
5
+ * - waitForAll() - wait for all steps to complete
6
+ * - waitForAny(n) - wait for N of M steps to complete
7
+ * - Barrier class - manual synchronization point
8
+ * - withConcurrencyLimit() - limit concurrent executions
9
+ */
10
+ /**
11
+ * Progress information for a barrier
12
+ */
13
+ export interface BarrierProgress<T = unknown> {
14
+ /** Number of participants that have arrived */
15
+ arrived: number;
16
+ /** Expected number of participants */
17
+ expected: number;
18
+ /** Percentage complete (0-100) */
19
+ percentage: number;
20
+ /** Most recently arrived value */
21
+ latest?: T;
22
+ }
23
+ /**
24
+ * Options for barrier creation
25
+ */
26
+ export interface BarrierOptions<T = unknown> {
27
+ /** Timeout in milliseconds */
28
+ timeout?: number;
29
+ /** AbortSignal for cancellation */
30
+ signal?: AbortSignal;
31
+ /** Progress callback */
32
+ onProgress?: (progress: BarrierProgress<T>) => void;
33
+ }
34
+ /**
35
+ * Options for waitForAll
36
+ */
37
+ export interface WaitForAllOptions {
38
+ /** Timeout in milliseconds */
39
+ timeout?: number;
40
+ /** AbortSignal for cancellation */
41
+ signal?: AbortSignal;
42
+ }
43
+ /**
44
+ * Options for waitForAny
45
+ */
46
+ export interface WaitForAnyOptions {
47
+ /** Timeout in milliseconds */
48
+ timeout?: number;
49
+ /** AbortSignal for cancellation */
50
+ signal?: AbortSignal;
51
+ /** Return partial results on timeout instead of throwing */
52
+ returnPartialOnTimeout?: boolean;
53
+ }
54
+ /**
55
+ * Result from waitForAny
56
+ */
57
+ export interface WaitForAnyResult<T> {
58
+ /** Completed values */
59
+ completed: T[];
60
+ /** Number of still pending promises */
61
+ pending: number[];
62
+ /** Whether the operation timed out */
63
+ timedOut?: boolean;
64
+ }
65
+ /**
66
+ * Options for concurrency limiting
67
+ */
68
+ export interface ConcurrencyOptions {
69
+ /** Collect errors instead of failing fast */
70
+ collectErrors?: boolean;
71
+ }
72
+ /**
73
+ * Result type for barrier operations
74
+ */
75
+ export interface BarrierResult<T> {
76
+ values: T[];
77
+ timedOut: boolean;
78
+ }
79
+ /**
80
+ * Error thrown when a barrier times out
81
+ */
82
+ export declare class BarrierTimeoutError extends Error {
83
+ readonly timeout: number;
84
+ readonly arrived: number;
85
+ readonly expected: number;
86
+ constructor(timeout: number, arrived: number, expected: number);
87
+ }
88
+ /**
89
+ * Barrier class for manual synchronization
90
+ */
91
+ export declare class Barrier<T = unknown> {
92
+ private readonly _expected;
93
+ private readonly _options;
94
+ private _arrived;
95
+ private _waitResolve;
96
+ private _waitReject;
97
+ private _timeoutId;
98
+ private _cancelled;
99
+ private _cancelError;
100
+ private _abortHandler;
101
+ constructor(expectedCount: number, options?: BarrierOptions<T>);
102
+ /**
103
+ * Number of expected participants
104
+ */
105
+ get expectedCount(): number;
106
+ /**
107
+ * Number of participants that have arrived
108
+ */
109
+ get arrivedCount(): number;
110
+ /**
111
+ * Whether all expected participants have arrived
112
+ */
113
+ get isComplete(): boolean;
114
+ /**
115
+ * Record a participant's arrival at the barrier
116
+ */
117
+ arrive(value: T): void;
118
+ /**
119
+ * Wait for all participants to arrive
120
+ */
121
+ wait(): Promise<T[]>;
122
+ /**
123
+ * Reset the barrier for reuse
124
+ */
125
+ reset(): void;
126
+ /**
127
+ * Cancel the barrier operation
128
+ */
129
+ cancel(error: Error): void;
130
+ /**
131
+ * Dispose of the barrier and cleanup all resources
132
+ */
133
+ dispose(): void;
134
+ /**
135
+ * Get current progress information
136
+ */
137
+ getProgress(): BarrierProgress<T>;
138
+ private _clearTimeout;
139
+ private _clearAbortHandler;
140
+ }
141
+ /**
142
+ * Create a new barrier
143
+ */
144
+ export declare function createBarrier<T = unknown>(expectedCount: number, options?: BarrierOptions<T>): Barrier<T>;
145
+ /**
146
+ * Wait for all promises to complete
147
+ *
148
+ * Similar to Promise.all but with timeout and cancellation support
149
+ */
150
+ export declare function waitForAll<T>(promises: Promise<T>[], options?: WaitForAllOptions): Promise<T[]>;
151
+ /**
152
+ * Wait for N of M promises to complete
153
+ */
154
+ export declare function waitForAny<T>(n: number, promises: Promise<T>[], options?: WaitForAnyOptions): Promise<WaitForAnyResult<T>>;
155
+ /**
156
+ * Execute tasks with a concurrency limit
157
+ */
158
+ export declare function withConcurrencyLimit<T>(tasks: (() => Promise<T>)[], limit: number, options?: ConcurrencyOptions): Promise<(T | Error)[]>;
159
+ //# sourceMappingURL=barrier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"barrier.d.ts","sourceRoot":"","sources":["../src/barrier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,377 @@
1
+ /**
2
+ * Barrier/Join semantics for parallel step coordination
3
+ *
4
+ * Provides synchronization primitives for coordinating parallel workflow steps:
5
+ * - waitForAll() - wait for all steps to complete
6
+ * - waitForAny(n) - wait for N of M steps to complete
7
+ * - Barrier class - manual synchronization point
8
+ * - withConcurrencyLimit() - limit concurrent executions
9
+ */
10
+ /**
11
+ * Error thrown when a barrier times out
12
+ */
13
+ export class BarrierTimeoutError extends Error {
14
+ timeout;
15
+ arrived;
16
+ expected;
17
+ constructor(timeout, arrived, expected) {
18
+ super(`Barrier timeout after ${timeout}ms: ${arrived}/${expected} participants arrived`);
19
+ this.name = 'BarrierTimeoutError';
20
+ this.timeout = timeout;
21
+ this.arrived = arrived;
22
+ this.expected = expected;
23
+ }
24
+ }
25
+ /**
26
+ * Barrier class for manual synchronization
27
+ */
28
+ export class Barrier {
29
+ _expected;
30
+ _options;
31
+ _arrived = [];
32
+ _waitResolve = null;
33
+ _waitReject = null;
34
+ _timeoutId = null;
35
+ _cancelled = false;
36
+ _cancelError = null;
37
+ _abortHandler = null;
38
+ constructor(expectedCount, options = {}) {
39
+ this._expected = expectedCount;
40
+ this._options = options;
41
+ // Set up abort signal listener with proper cleanup tracking
42
+ if (options.signal) {
43
+ this._abortHandler = () => {
44
+ this.cancel(new Error('Operation aborted'));
45
+ };
46
+ options.signal.addEventListener('abort', this._abortHandler, { once: true });
47
+ }
48
+ }
49
+ /**
50
+ * Number of expected participants
51
+ */
52
+ get expectedCount() {
53
+ return this._expected;
54
+ }
55
+ /**
56
+ * Number of participants that have arrived
57
+ */
58
+ get arrivedCount() {
59
+ return this._arrived.length;
60
+ }
61
+ /**
62
+ * Whether all expected participants have arrived
63
+ */
64
+ get isComplete() {
65
+ return this._arrived.length >= this._expected;
66
+ }
67
+ /**
68
+ * Record a participant's arrival at the barrier
69
+ */
70
+ arrive(value) {
71
+ if (this._cancelled) {
72
+ return;
73
+ }
74
+ this._arrived.push(value);
75
+ // Emit progress
76
+ if (this._options.onProgress) {
77
+ this._options.onProgress(this.getProgress());
78
+ }
79
+ // Check if barrier is complete
80
+ if (this.isComplete && this._waitResolve) {
81
+ this._clearTimeout();
82
+ this._waitResolve([...this._arrived]);
83
+ this._waitResolve = null;
84
+ this._waitReject = null;
85
+ }
86
+ }
87
+ /**
88
+ * Wait for all participants to arrive
89
+ */
90
+ wait() {
91
+ if (this._cancelled && this._cancelError) {
92
+ return Promise.reject(this._cancelError);
93
+ }
94
+ if (this.isComplete) {
95
+ return Promise.resolve([...this._arrived]);
96
+ }
97
+ return new Promise((resolve, reject) => {
98
+ this._waitResolve = resolve;
99
+ this._waitReject = reject;
100
+ // Set up timeout if specified
101
+ if (this._options.timeout) {
102
+ this._timeoutId = setTimeout(() => {
103
+ if (this._waitReject) {
104
+ const error = new BarrierTimeoutError(this._options.timeout, this._arrived.length, this._expected);
105
+ this._waitReject(error);
106
+ this._waitResolve = null;
107
+ this._waitReject = null;
108
+ }
109
+ }, this._options.timeout);
110
+ }
111
+ });
112
+ }
113
+ /**
114
+ * Reset the barrier for reuse
115
+ */
116
+ reset() {
117
+ this._clearTimeout();
118
+ this._clearAbortHandler();
119
+ this._arrived = [];
120
+ this._waitResolve = null;
121
+ this._waitReject = null;
122
+ this._cancelled = false;
123
+ this._cancelError = null;
124
+ }
125
+ /**
126
+ * Cancel the barrier operation
127
+ */
128
+ cancel(error) {
129
+ this._cancelled = true;
130
+ this._cancelError = error;
131
+ this._clearTimeout();
132
+ this._clearAbortHandler();
133
+ if (this._waitReject) {
134
+ this._waitReject(error);
135
+ this._waitResolve = null;
136
+ this._waitReject = null;
137
+ }
138
+ }
139
+ /**
140
+ * Dispose of the barrier and cleanup all resources
141
+ */
142
+ dispose() {
143
+ this._clearTimeout();
144
+ this._clearAbortHandler();
145
+ this._waitResolve = null;
146
+ this._waitReject = null;
147
+ }
148
+ /**
149
+ * Get current progress information
150
+ */
151
+ getProgress() {
152
+ const latestValue = this._arrived[this._arrived.length - 1];
153
+ return {
154
+ arrived: this._arrived.length,
155
+ expected: this._expected,
156
+ percentage: Math.round((this._arrived.length / this._expected) * 100),
157
+ ...(latestValue !== undefined && { latest: latestValue }),
158
+ };
159
+ }
160
+ _clearTimeout() {
161
+ if (this._timeoutId) {
162
+ clearTimeout(this._timeoutId);
163
+ this._timeoutId = null;
164
+ }
165
+ }
166
+ _clearAbortHandler() {
167
+ if (this._abortHandler && this._options.signal) {
168
+ this._options.signal.removeEventListener('abort', this._abortHandler);
169
+ this._abortHandler = null;
170
+ }
171
+ }
172
+ }
173
+ /**
174
+ * Create a new barrier
175
+ */
176
+ export function createBarrier(expectedCount, options = {}) {
177
+ return new Barrier(expectedCount, options);
178
+ }
179
+ /**
180
+ * Wait for all promises to complete
181
+ *
182
+ * Similar to Promise.all but with timeout and cancellation support
183
+ */
184
+ export async function waitForAll(promises, options = {}) {
185
+ if (promises.length === 0) {
186
+ return [];
187
+ }
188
+ const { timeout, signal } = options;
189
+ // Track cleanup handlers
190
+ let abortHandler = null;
191
+ let timeoutId = null;
192
+ const cleanup = () => {
193
+ if (abortHandler && signal) {
194
+ signal.removeEventListener('abort', abortHandler);
195
+ abortHandler = null;
196
+ }
197
+ if (timeoutId) {
198
+ clearTimeout(timeoutId);
199
+ timeoutId = null;
200
+ }
201
+ };
202
+ // Build array of promises to race against
203
+ const racers = [Promise.all(promises)];
204
+ // Add abort signal handling
205
+ if (signal) {
206
+ const abortPromise = new Promise((_, reject) => {
207
+ abortHandler = () => {
208
+ reject(new Error('Operation aborted'));
209
+ };
210
+ if (signal.aborted) {
211
+ abortHandler();
212
+ }
213
+ else {
214
+ signal.addEventListener('abort', abortHandler, { once: true });
215
+ }
216
+ });
217
+ racers.push(abortPromise);
218
+ }
219
+ // Add timeout if specified
220
+ if (timeout) {
221
+ const timeoutPromise = new Promise((_, reject) => {
222
+ timeoutId = setTimeout(() => {
223
+ reject(new BarrierTimeoutError(timeout, 0, promises.length));
224
+ }, timeout);
225
+ });
226
+ racers.push(timeoutPromise);
227
+ }
228
+ try {
229
+ return await Promise.race(racers);
230
+ }
231
+ finally {
232
+ cleanup();
233
+ }
234
+ }
235
+ /**
236
+ * Wait for N of M promises to complete
237
+ */
238
+ export async function waitForAny(n, promises, options = {}) {
239
+ const { timeout, returnPartialOnTimeout = false } = options;
240
+ if (n === 0) {
241
+ return {
242
+ completed: [],
243
+ pending: promises.map((_, i) => i),
244
+ };
245
+ }
246
+ if (n > promises.length) {
247
+ throw new Error(`Cannot wait for ${n} of ${promises.length} promises`);
248
+ }
249
+ const completed = [];
250
+ const errors = [];
251
+ const pendingIndices = new Set(promises.map((_, i) => i));
252
+ let resolved = false;
253
+ let timedOut = false;
254
+ return new Promise((resolve, reject) => {
255
+ let timeoutId = null;
256
+ const checkComplete = () => {
257
+ if (resolved)
258
+ return;
259
+ // Check if we have enough completions
260
+ if (completed.length >= n) {
261
+ resolved = true;
262
+ if (timeoutId)
263
+ clearTimeout(timeoutId);
264
+ resolve({
265
+ completed: [...completed],
266
+ pending: [...pendingIndices],
267
+ });
268
+ return;
269
+ }
270
+ // Check if it's impossible to complete (too many failures)
271
+ const remaining = pendingIndices.size;
272
+ const canComplete = completed.length + remaining;
273
+ if (canComplete < n) {
274
+ resolved = true;
275
+ if (timeoutId)
276
+ clearTimeout(timeoutId);
277
+ reject(new Error(`Cannot complete: need ${n} but only ${canComplete} can succeed`));
278
+ }
279
+ };
280
+ // Track each promise
281
+ promises.forEach((promise, index) => {
282
+ promise
283
+ .then((value) => {
284
+ if (resolved)
285
+ return;
286
+ completed.push(value);
287
+ pendingIndices.delete(index);
288
+ checkComplete();
289
+ })
290
+ .catch((error) => {
291
+ if (resolved)
292
+ return;
293
+ errors.push(error);
294
+ pendingIndices.delete(index);
295
+ checkComplete();
296
+ });
297
+ });
298
+ // Set up timeout
299
+ if (timeout) {
300
+ timeoutId = setTimeout(() => {
301
+ if (resolved)
302
+ return;
303
+ timedOut = true;
304
+ if (returnPartialOnTimeout) {
305
+ resolved = true;
306
+ resolve({
307
+ completed: [...completed],
308
+ pending: [...pendingIndices],
309
+ timedOut: true,
310
+ });
311
+ }
312
+ else {
313
+ resolved = true;
314
+ reject(new BarrierTimeoutError(timeout, completed.length, n));
315
+ }
316
+ }, timeout);
317
+ }
318
+ });
319
+ }
320
+ /**
321
+ * Execute tasks with a concurrency limit
322
+ */
323
+ export async function withConcurrencyLimit(tasks, limit, options = {}) {
324
+ const { collectErrors = false } = options;
325
+ if (tasks.length === 0) {
326
+ return [];
327
+ }
328
+ const results = new Array(tasks.length);
329
+ let currentIndex = 0;
330
+ let hasError = false;
331
+ let firstError = null;
332
+ const runTask = async () => {
333
+ while (currentIndex < tasks.length) {
334
+ const index = currentIndex++;
335
+ const task = tasks[index];
336
+ if (!task)
337
+ continue;
338
+ try {
339
+ results[index] = await task();
340
+ }
341
+ catch (error) {
342
+ const err = error instanceof Error ? error : new Error(String(error));
343
+ if (collectErrors) {
344
+ results[index] = err;
345
+ }
346
+ else {
347
+ hasError = true;
348
+ if (!firstError)
349
+ firstError = err;
350
+ throw err;
351
+ }
352
+ }
353
+ if (hasError && !collectErrors) {
354
+ break;
355
+ }
356
+ }
357
+ };
358
+ // Start workers up to the limit
359
+ const workers = Array(Math.min(limit, tasks.length))
360
+ .fill(null)
361
+ .map(() => runTask());
362
+ if (collectErrors) {
363
+ await Promise.allSettled(workers);
364
+ }
365
+ else {
366
+ try {
367
+ await Promise.all(workers);
368
+ }
369
+ catch {
370
+ // Re-throw the first error
371
+ if (firstError)
372
+ throw firstError;
373
+ }
374
+ }
375
+ return results;
376
+ }
377
+ //# sourceMappingURL=barrier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"barrier.js","sourceRoot":"","sources":["../src/barrier.ts"],"names":[],"mappings":"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"}