@jdsalasc/solvejs-async 1.5.2 → 1.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -7,23 +7,24 @@ Zero-dependency async/concurrency utilities for JavaScript and TypeScript.
7
7
 
8
8
  ## Utilities
9
9
 
10
- - `sleep`
11
- - `timeout`
12
- - `retry`
13
- - `pMap`
14
- - `debouncePromise`
15
- - `throttlePromise`
16
-
17
- ## When to use this package
18
-
19
- Use it when you need predictable retry logic, promise time limits, and controlled async concurrency without adding heavy helper libraries.
20
-
21
- ## Limitations and Constraints
22
-
23
- - `throttlePromise` drops calls made during the throttle window.
24
- - `debouncePromise` cancels previous pending calls with a rejection.
25
- - Queueing/rate-limit orchestration is intentionally out of scope for now.
10
+ - `sleep`
11
+ - `timeout`
12
+ - `retry`
13
+ - `pMap`
14
+ - `debouncePromise`
15
+ - `throttlePromise`
16
+ - `createTaskQueue`
17
+ - `createRateLimiter`
18
+ - `createTokenBucketLimiter`
19
+
20
+ ## When to use this package
21
+
22
+ Use it when you need predictable retry logic, promise time limits, queues, and rate-limited async execution without heavy helper libraries.
23
+
24
+ ## Limitations and Constraints
26
25
 
26
+ - `throttlePromise` drops calls made during the throttle window.
27
+ - `debouncePromise` cancels previous pending calls with a rejection.
27
28
  ## Install
28
29
 
29
30
  ```bash
@@ -33,12 +34,35 @@ npm i @jdsalasc/solvejs-async
33
34
  ## Quick example
34
35
 
35
36
  ```ts
36
- import { retry, timeout, pMap } from "@jdsalasc/solvejs-async";
37
+ import { createTaskQueue, createRateLimiter, createTokenBucketLimiter, retry, timeout, pMap } from "@jdsalasc/solvejs-async";
37
38
 
38
39
  const data = await retry(
39
40
  () => timeout(fetch("https://api.example.com/items").then((r) => r.json()), 3000),
40
41
  { retries: 2, delayMs: 200, backoffFactor: 2 }
41
42
  );
42
43
 
43
- const ids = await pMap(data.items, async (item) => item.id, { concurrency: 4 });
44
- ```
44
+ const ids = await pMap(data.items, async (item) => item.id, { concurrency: 4 });
45
+ const queue = createTaskQueue({ concurrency: 2 });
46
+ const limiter = createRateLimiter({ maxCalls: 5, windowMs: 1000 });
47
+ const burstLimiter = createTokenBucketLimiter({ capacity: 10, refillTokens: 2, refillIntervalMs: 1000 });
48
+ await queue.add(() => limiter(() => fetch("https://api.example.com/reindex")));
49
+ await burstLimiter(() => fetch("https://api.example.com/heavy-sync"), 3);
50
+ ```
51
+
52
+ ## Endpoint tier token costs (token-bucket)
53
+
54
+ ```ts
55
+ import { createTokenBucketLimiter } from "@jdsalasc/solvejs-async";
56
+
57
+ const limiter = createTokenBucketLimiter({ capacity: 20, refillTokens: 10, refillIntervalMs: 1000 });
58
+ const endpointCost = {
59
+ "/health": 1,
60
+ "/search": 2,
61
+ "/invoice/preview": 3,
62
+ "/invoice/finalize": 6,
63
+ "/batch/settlement": 10
64
+ } as const;
65
+
66
+ await limiter(() => fetch("https://api.example.com/health"), endpointCost["/health"]);
67
+ await limiter(() => fetch("https://api.example.com/batch/settlement"), endpointCost["/batch/settlement"]);
68
+ ```
@@ -6,6 +6,9 @@ exports.retry = retry;
6
6
  exports.pMap = pMap;
7
7
  exports.debouncePromise = debouncePromise;
8
8
  exports.throttlePromise = throttlePromise;
9
+ exports.createTaskQueue = createTaskQueue;
10
+ exports.createRateLimiter = createRateLimiter;
11
+ exports.createTokenBucketLimiter = createTokenBucketLimiter;
9
12
  function assertNonNegativeFinite(value, label) {
10
13
  if (!Number.isFinite(value) || value < 0) {
11
14
  throw new TypeError(`Expected ${label} to be a non-negative finite number.`);
@@ -188,4 +191,163 @@ function throttlePromise(fn, options) {
188
191
  }
189
192
  };
190
193
  }
194
+ /**
195
+ * Creates a lightweight async task queue with bounded concurrency.
196
+ *
197
+ * @param options - Queue options.
198
+ * @param options.concurrency - Maximum number of tasks running in parallel.
199
+ * @returns Queue controller with `add`, `pending`, and `running`.
200
+ */
201
+ function createTaskQueue(options = {}) {
202
+ const concurrency = options.concurrency ?? 1;
203
+ assertPositiveInteger(concurrency, "concurrency");
204
+ const queue = [];
205
+ let activeCount = 0;
206
+ const schedule = () => {
207
+ while (activeCount < concurrency && queue.length > 0) {
208
+ const run = queue.shift();
209
+ if (!run)
210
+ return;
211
+ activeCount += 1;
212
+ run();
213
+ }
214
+ };
215
+ const add = (task) => new Promise((resolve, reject) => {
216
+ queue.push(() => {
217
+ Promise.resolve()
218
+ .then(task)
219
+ .then(resolve, reject)
220
+ .finally(() => {
221
+ activeCount -= 1;
222
+ schedule();
223
+ });
224
+ });
225
+ schedule();
226
+ });
227
+ return {
228
+ add,
229
+ pending: () => queue.length,
230
+ running: () => activeCount
231
+ };
232
+ }
233
+ /**
234
+ * Creates a fixed-window async rate limiter wrapper.
235
+ *
236
+ * @param options - Rate limiter options.
237
+ * @param options.maxCalls - Maximum executions allowed within the window.
238
+ * @param options.windowMs - Window duration in milliseconds.
239
+ * @returns Function that schedules work respecting the configured rate.
240
+ */
241
+ function createRateLimiter(options) {
242
+ const { maxCalls, windowMs } = options;
243
+ assertPositiveInteger(maxCalls, "maxCalls");
244
+ assertNonNegativeFinite(windowMs, "windowMs");
245
+ let chain = Promise.resolve();
246
+ const executionTimestamps = [];
247
+ return async (task) => {
248
+ const run = async () => {
249
+ const now = Date.now();
250
+ while (executionTimestamps.length > 0 && now - executionTimestamps[0] >= windowMs) {
251
+ executionTimestamps.shift();
252
+ }
253
+ if (executionTimestamps.length >= maxCalls) {
254
+ const earliest = executionTimestamps[0];
255
+ const waitMs = Math.max(0, windowMs - (now - earliest));
256
+ if (waitMs > 0) {
257
+ await sleep(waitMs);
258
+ }
259
+ }
260
+ executionTimestamps.push(Date.now());
261
+ return task();
262
+ };
263
+ const resultPromise = chain.then(run, run);
264
+ chain = resultPromise.then(() => undefined, () => undefined);
265
+ return resultPromise;
266
+ };
267
+ }
268
+ /**
269
+ * Creates a token-bucket limiter for bursty traffic with smooth refill.
270
+ *
271
+ * @param options - Token bucket options.
272
+ * @param options.capacity - Maximum bucket size.
273
+ * @param options.refillTokens - Tokens added each refill interval.
274
+ * @param options.refillIntervalMs - Refill interval in milliseconds.
275
+ * @param options.initialTokens - Initial token count. Defaults to `capacity`.
276
+ * @returns Function that schedules work when enough tokens are available.
277
+ */
278
+ function createTokenBucketLimiter(options) {
279
+ const { capacity, refillTokens, refillIntervalMs } = options;
280
+ const initialTokens = options.initialTokens ?? capacity;
281
+ assertPositiveInteger(capacity, "capacity");
282
+ assertPositiveInteger(refillTokens, "refillTokens");
283
+ assertPositiveInteger(refillIntervalMs, "refillIntervalMs");
284
+ assertNonNegativeFinite(initialTokens, "initialTokens");
285
+ if (initialTokens > capacity) {
286
+ throw new TypeError("Expected initialTokens to be less than or equal to capacity.");
287
+ }
288
+ const queue = [];
289
+ let availableTokens = initialTokens;
290
+ let lastRefillAt = Date.now();
291
+ let drainTimer;
292
+ const refill = () => {
293
+ const now = Date.now();
294
+ const elapsed = now - lastRefillAt;
295
+ if (elapsed < refillIntervalMs) {
296
+ return;
297
+ }
298
+ const intervals = Math.floor(elapsed / refillIntervalMs);
299
+ availableTokens = Math.min(capacity, availableTokens + intervals * refillTokens);
300
+ lastRefillAt += intervals * refillIntervalMs;
301
+ };
302
+ const scheduleDrain = () => {
303
+ if (queue.length === 0 || drainTimer) {
304
+ return;
305
+ }
306
+ const next = queue[0];
307
+ const missingTokens = Math.max(0, next.tokenCost - availableTokens);
308
+ if (missingTokens === 0) {
309
+ return;
310
+ }
311
+ const intervalsNeeded = Math.ceil(missingTokens / refillTokens);
312
+ const nextReadyAt = lastRefillAt + intervalsNeeded * refillIntervalMs;
313
+ const waitMs = Math.max(1, nextReadyAt - Date.now());
314
+ drainTimer = setTimeout(() => {
315
+ drainTimer = undefined;
316
+ runQueue();
317
+ }, waitMs);
318
+ };
319
+ const runQueue = () => {
320
+ refill();
321
+ while (queue.length > 0) {
322
+ const next = queue[0];
323
+ if (next.tokenCost > availableTokens) {
324
+ break;
325
+ }
326
+ queue.shift();
327
+ availableTokens -= next.tokenCost;
328
+ Promise.resolve()
329
+ .then(next.task)
330
+ .then(next.resolve, next.reject)
331
+ .finally(() => {
332
+ runQueue();
333
+ });
334
+ }
335
+ scheduleDrain();
336
+ };
337
+ return (task, tokenCost = 1) => {
338
+ assertPositiveInteger(tokenCost, "tokenCost");
339
+ if (tokenCost > capacity) {
340
+ throw new TypeError("Expected tokenCost to be less than or equal to capacity.");
341
+ }
342
+ return new Promise((resolve, reject) => {
343
+ queue.push({
344
+ tokenCost,
345
+ task,
346
+ resolve: resolve,
347
+ reject
348
+ });
349
+ runQueue();
350
+ });
351
+ };
352
+ }
191
353
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -63,3 +63,49 @@ export type ThrottlePromiseOptions = {
63
63
  * @returns Throttled async function.
64
64
  */
65
65
  export declare function throttlePromise<TArgs extends unknown[], TResult>(fn: (...args: TArgs) => Promise<TResult> | TResult, options: ThrottlePromiseOptions): (...args: TArgs) => Promise<TResult | undefined>;
66
+ export type TaskQueueOptions = {
67
+ concurrency?: number;
68
+ };
69
+ export type TaskQueue = {
70
+ add: <T>(task: () => Promise<T> | T) => Promise<T>;
71
+ pending: () => number;
72
+ running: () => number;
73
+ };
74
+ /**
75
+ * Creates a lightweight async task queue with bounded concurrency.
76
+ *
77
+ * @param options - Queue options.
78
+ * @param options.concurrency - Maximum number of tasks running in parallel.
79
+ * @returns Queue controller with `add`, `pending`, and `running`.
80
+ */
81
+ export declare function createTaskQueue(options?: TaskQueueOptions): TaskQueue;
82
+ export type RateLimiterOptions = {
83
+ maxCalls: number;
84
+ windowMs: number;
85
+ };
86
+ /**
87
+ * Creates a fixed-window async rate limiter wrapper.
88
+ *
89
+ * @param options - Rate limiter options.
90
+ * @param options.maxCalls - Maximum executions allowed within the window.
91
+ * @param options.windowMs - Window duration in milliseconds.
92
+ * @returns Function that schedules work respecting the configured rate.
93
+ */
94
+ export declare function createRateLimiter(options: RateLimiterOptions): <T>(task: () => Promise<T> | T) => Promise<T>;
95
+ export type TokenBucketLimiterOptions = {
96
+ capacity: number;
97
+ refillTokens: number;
98
+ refillIntervalMs: number;
99
+ initialTokens?: number;
100
+ };
101
+ /**
102
+ * Creates a token-bucket limiter for bursty traffic with smooth refill.
103
+ *
104
+ * @param options - Token bucket options.
105
+ * @param options.capacity - Maximum bucket size.
106
+ * @param options.refillTokens - Tokens added each refill interval.
107
+ * @param options.refillIntervalMs - Refill interval in milliseconds.
108
+ * @param options.initialTokens - Initial token count. Defaults to `capacity`.
109
+ * @returns Function that schedules work when enough tokens are available.
110
+ */
111
+ export declare function createTokenBucketLimiter(options: TokenBucketLimiterOptions): <T>(task: () => Promise<T> | T, tokenCost?: number) => Promise<T>;
package/dist/esm/index.js CHANGED
@@ -180,4 +180,163 @@ export function throttlePromise(fn, options) {
180
180
  }
181
181
  };
182
182
  }
183
+ /**
184
+ * Creates a lightweight async task queue with bounded concurrency.
185
+ *
186
+ * @param options - Queue options.
187
+ * @param options.concurrency - Maximum number of tasks running in parallel.
188
+ * @returns Queue controller with `add`, `pending`, and `running`.
189
+ */
190
+ export function createTaskQueue(options = {}) {
191
+ const concurrency = options.concurrency ?? 1;
192
+ assertPositiveInteger(concurrency, "concurrency");
193
+ const queue = [];
194
+ let activeCount = 0;
195
+ const schedule = () => {
196
+ while (activeCount < concurrency && queue.length > 0) {
197
+ const run = queue.shift();
198
+ if (!run)
199
+ return;
200
+ activeCount += 1;
201
+ run();
202
+ }
203
+ };
204
+ const add = (task) => new Promise((resolve, reject) => {
205
+ queue.push(() => {
206
+ Promise.resolve()
207
+ .then(task)
208
+ .then(resolve, reject)
209
+ .finally(() => {
210
+ activeCount -= 1;
211
+ schedule();
212
+ });
213
+ });
214
+ schedule();
215
+ });
216
+ return {
217
+ add,
218
+ pending: () => queue.length,
219
+ running: () => activeCount
220
+ };
221
+ }
222
+ /**
223
+ * Creates a fixed-window async rate limiter wrapper.
224
+ *
225
+ * @param options - Rate limiter options.
226
+ * @param options.maxCalls - Maximum executions allowed within the window.
227
+ * @param options.windowMs - Window duration in milliseconds.
228
+ * @returns Function that schedules work respecting the configured rate.
229
+ */
230
+ export function createRateLimiter(options) {
231
+ const { maxCalls, windowMs } = options;
232
+ assertPositiveInteger(maxCalls, "maxCalls");
233
+ assertNonNegativeFinite(windowMs, "windowMs");
234
+ let chain = Promise.resolve();
235
+ const executionTimestamps = [];
236
+ return async (task) => {
237
+ const run = async () => {
238
+ const now = Date.now();
239
+ while (executionTimestamps.length > 0 && now - executionTimestamps[0] >= windowMs) {
240
+ executionTimestamps.shift();
241
+ }
242
+ if (executionTimestamps.length >= maxCalls) {
243
+ const earliest = executionTimestamps[0];
244
+ const waitMs = Math.max(0, windowMs - (now - earliest));
245
+ if (waitMs > 0) {
246
+ await sleep(waitMs);
247
+ }
248
+ }
249
+ executionTimestamps.push(Date.now());
250
+ return task();
251
+ };
252
+ const resultPromise = chain.then(run, run);
253
+ chain = resultPromise.then(() => undefined, () => undefined);
254
+ return resultPromise;
255
+ };
256
+ }
257
+ /**
258
+ * Creates a token-bucket limiter for bursty traffic with smooth refill.
259
+ *
260
+ * @param options - Token bucket options.
261
+ * @param options.capacity - Maximum bucket size.
262
+ * @param options.refillTokens - Tokens added each refill interval.
263
+ * @param options.refillIntervalMs - Refill interval in milliseconds.
264
+ * @param options.initialTokens - Initial token count. Defaults to `capacity`.
265
+ * @returns Function that schedules work when enough tokens are available.
266
+ */
267
+ export function createTokenBucketLimiter(options) {
268
+ const { capacity, refillTokens, refillIntervalMs } = options;
269
+ const initialTokens = options.initialTokens ?? capacity;
270
+ assertPositiveInteger(capacity, "capacity");
271
+ assertPositiveInteger(refillTokens, "refillTokens");
272
+ assertPositiveInteger(refillIntervalMs, "refillIntervalMs");
273
+ assertNonNegativeFinite(initialTokens, "initialTokens");
274
+ if (initialTokens > capacity) {
275
+ throw new TypeError("Expected initialTokens to be less than or equal to capacity.");
276
+ }
277
+ const queue = [];
278
+ let availableTokens = initialTokens;
279
+ let lastRefillAt = Date.now();
280
+ let drainTimer;
281
+ const refill = () => {
282
+ const now = Date.now();
283
+ const elapsed = now - lastRefillAt;
284
+ if (elapsed < refillIntervalMs) {
285
+ return;
286
+ }
287
+ const intervals = Math.floor(elapsed / refillIntervalMs);
288
+ availableTokens = Math.min(capacity, availableTokens + intervals * refillTokens);
289
+ lastRefillAt += intervals * refillIntervalMs;
290
+ };
291
+ const scheduleDrain = () => {
292
+ if (queue.length === 0 || drainTimer) {
293
+ return;
294
+ }
295
+ const next = queue[0];
296
+ const missingTokens = Math.max(0, next.tokenCost - availableTokens);
297
+ if (missingTokens === 0) {
298
+ return;
299
+ }
300
+ const intervalsNeeded = Math.ceil(missingTokens / refillTokens);
301
+ const nextReadyAt = lastRefillAt + intervalsNeeded * refillIntervalMs;
302
+ const waitMs = Math.max(1, nextReadyAt - Date.now());
303
+ drainTimer = setTimeout(() => {
304
+ drainTimer = undefined;
305
+ runQueue();
306
+ }, waitMs);
307
+ };
308
+ const runQueue = () => {
309
+ refill();
310
+ while (queue.length > 0) {
311
+ const next = queue[0];
312
+ if (next.tokenCost > availableTokens) {
313
+ break;
314
+ }
315
+ queue.shift();
316
+ availableTokens -= next.tokenCost;
317
+ Promise.resolve()
318
+ .then(next.task)
319
+ .then(next.resolve, next.reject)
320
+ .finally(() => {
321
+ runQueue();
322
+ });
323
+ }
324
+ scheduleDrain();
325
+ };
326
+ return (task, tokenCost = 1) => {
327
+ assertPositiveInteger(tokenCost, "tokenCost");
328
+ if (tokenCost > capacity) {
329
+ throw new TypeError("Expected tokenCost to be less than or equal to capacity.");
330
+ }
331
+ return new Promise((resolve, reject) => {
332
+ queue.push({
333
+ tokenCost,
334
+ task,
335
+ resolve: resolve,
336
+ reject
337
+ });
338
+ runQueue();
339
+ });
340
+ };
341
+ }
183
342
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,SAAS,uBAAuB,CAAC,KAAa,EAAE,KAAa;IAC3D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,SAAS,CAAC,YAAY,KAAK,sCAAsC,CAAC,CAAC;IAC/E,CAAC;AACH,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAa,EAAE,KAAa;IACzD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,SAAS,CAAC,YAAY,KAAK,4BAA4B,CAAC,CAAC;IACrE,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,KAAK,CAAC,EAAU;IAC9B,uBAAuB,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAClC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAI,SAAyB,EAAE,EAAU,EAAE,OAAgB;IACtF,uBAAuB,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAElC,IAAI,KAAgD,CAAC;IACrD,MAAM,YAAY,GAAG,IAAI,KAAK,CAAC,OAAO,IAAI,6BAA6B,EAAE,KAAK,CAAC,CAAC;IAEhF,MAAM,KAAK,GAAG,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;QAC7C,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IACjE,CAAC;YAAS,CAAC;QACT,IAAI,KAAK,EAAE,CAAC;YACV,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;AACH,CAAC;AASD;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,KAAK,CAAI,SAA+B,EAAE,UAAwB,EAAE;IACxF,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC;IACrC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC;IACrC,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,CAAC,CAAC;IACjD,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IAExD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,SAAS,CAAC,gDAAgD,CAAC,CAAC;IACxE,CAAC;IACD,uBAAuB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAC5C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;QACzD,MAAM,IAAI,SAAS,CAAC,0EAA0E,CAAC,CAAC;IAClG,CAAC;IAED,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,YAAY,GAAG,OAAO,CAAC;IAE3B,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC;YACH,OAAO,MAAM,SAAS,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,IAAI,CAAC,CAAC;YACb,MAAM,QAAQ,GAAG,OAAO,IAAI,OAAO,IAAI,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YACnE,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,KAAK,CAAC;YACd,CAAC;YACD,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;gBACrB,MAAM,KAAK,CAAC,YAAY,CAAC,CAAC;gBAC1B,YAAY,IAAI,aAAa,CAAC;YAChC,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAMD;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI,CACxB,MAAoB,EACpB,MAAmD,EACnD,UAAuB,EAAE;IAEzB,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,QAAQ,CAAC;IAEpD,IAAI,WAAW,KAAK,QAAQ,EAAE,CAAC;QAC7B,qBAAqB,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IACpD,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,KAAK,GAAG,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC9F,MAAM,OAAO,GAAG,IAAI,KAAK,CAAI,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5C,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,KAAK,UAAU,MAAM;QACnB,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,OAAO,GAAG,SAAS,CAAC;YAC1B,SAAS,IAAI,CAAC,CAAC;YAEf,IAAI,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAC7B,OAAO;YACT,CAAC;YAED,OAAO,CAAC,OAAO,CAAC,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACjE,OAAO,OAAO,CAAC;AACjB,CAAC;AAMD;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAC7B,EAAkD,EAClD,OAA+B;IAE/B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC9B,uBAAuB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAE1C,IAAI,KAAgD,CAAC;IACrD,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,cAAwD,CAAC;IAE7D,OAAO,CAAC,GAAG,IAAW,EAAE,EAAE,CACxB,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACvC,UAAU,IAAI,CAAC,CAAC;QAChB,MAAM,MAAM,GAAG,UAAU,CAAC;QAC1B,IAAI,cAAc,EAAE,CAAC;YACnB,cAAc,CAAC,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC,CAAC;QAC1D,CAAC;QACD,cAAc,GAAG,MAAM,CAAC;QAExB,IAAI,KAAK,EAAE,CAAC;YACV,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;QAED,KAAK,GAAG,UAAU,CAAC,KAAK,IAAI,EAAE;YAC5B,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;gBACjC,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;oBAC1B,cAAc,GAAG,SAAS,CAAC;oBAC3B,OAAO,CAAC,MAAM,CAAC,CAAC;gBAClB,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;oBAC1B,cAAc,GAAG,SAAS,CAAC;oBAC3B,MAAM,CAAC,KAAK,CAAC,CAAC;gBAChB,CAAC;YACH,CAAC;QACH,CAAC,EAAE,MAAM,CAAC,CAAC;IACb,CAAC,CAAC,CAAC;AACP,CAAC;AAMD;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAC7B,EAAkD,EAClD,OAA+B;IAE/B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC9B,uBAAuB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAE1C,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,QAAQ,GAA4B,IAAI,CAAC;IAE7C,OAAO,KAAK,EAAE,GAAG,IAAW,EAAE,EAAE;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,GAAG,GAAG,aAAa,GAAG,MAAM,EAAE,CAAC;YACjC,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,aAAa,GAAG,GAAG,CAAC;QACpB,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;QACxC,IAAI,CAAC;YACH,OAAO,MAAM,QAAQ,CAAC;QACxB,CAAC;gBAAS,CAAC;YACT,QAAQ,GAAG,IAAI,CAAC;QAClB,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jdsalasc/solvejs-async",
3
- "version": "1.5.2",
3
+ "version": "1.7.1",
4
4
  "description": "Zero-dependency JavaScript/TypeScript async utilities for production: sleep, promise timeout, retry with backoff, and concurrency-limited pMap.",
5
5
  "license": "MIT",
6
6
  "type": "module",