UNPKG

26.8 kBTypeScriptView Raw
1export as namespace async;
2
3export interface Dictionary<T> {
4 [key: string]: T;
5}
6export type IterableCollection<T> = T[] | IterableIterator<T> | AsyncIterable<T> | Dictionary<T>;
7
8export interface ErrorCallback<E = Error> {
9 (err?: E | null): void;
10}
11export interface AsyncBooleanResultCallback<E = Error> {
12 (err?: E | null, truthValue?: boolean): void;
13}
14export interface AsyncResultCallback<T, E = Error> {
15 (err?: E | null, result?: T): void;
16}
17export interface AsyncResultArrayCallback<T, E = Error> {
18 (err?: E | null, results?: Array<T | undefined>): void;
19}
20export interface AsyncResultObjectCallback<T, E = Error> {
21 (err: E | undefined, results: Dictionary<T | undefined>): void;
22}
23export interface AsyncResultRestCallback<T, E = Error> {
24 (err?: E | null, ...results: T[]): void;
25}
26
27export interface AsyncFunction<T, E = Error> {
28 (callback: (err?: E | null, result?: T) => void): void;
29}
30export interface AsyncFunctionEx<T, E = Error> {
31 (callback: (err?: E | null, ...results: T[]) => void): void;
32}
33export interface AsyncIterator<T, E = Error> {
34 (item: T, callback: ErrorCallback<E>): void;
35}
36export interface AsyncForEachOfIterator<T, E = Error> {
37 (item: T, key: number | string, callback: ErrorCallback<E>): void;
38}
39export interface AsyncResultIterator<T, R, E = Error> {
40 (item: T, callback: AsyncResultCallback<R, E>): void;
41}
42export interface AsyncResultIteratorPromise<T, R> {
43 (item: T): Promise<R>;
44}
45export interface AsyncMemoIterator<T, R, E = Error> {
46 (memo: R | undefined, item: T, callback: AsyncResultCallback<R, E>): void;
47}
48export interface AsyncBooleanIterator<T, E = Error> {
49 (item: T, callback: AsyncBooleanResultCallback<E>): void;
50}
51
52export interface AsyncWorker<T, E = Error> {
53 (task: T, callback: ErrorCallback<E>): void;
54}
55export interface AsyncVoidFunction<E = Error> {
56 (callback: ErrorCallback<E>): void;
57}
58
59export type AsyncAutoTasks<R extends Dictionary<any>, E> = { [K in keyof R]: AsyncAutoTask<R[K], R, E> };
60export type AsyncAutoTask<R1, R extends Dictionary<any>, E> =
61 | AsyncAutoTaskFunctionWithoutDependencies<R1, E>
62 | Array<keyof R | AsyncAutoTaskFunction<R1, R, E>>;
63export interface AsyncAutoTaskFunctionWithoutDependencies<R1, E = Error> {
64 (cb: AsyncResultCallback<R1, E> | ErrorCallback<E>): void;
65}
66export interface AsyncAutoTaskFunction<R1, R extends Dictionary<any>, E = Error> {
67 (results: R, cb: AsyncResultCallback<R1, E> | ErrorCallback<E>): void;
68}
69
70export interface DataContainer<T> {
71 data: T;
72 priority: number;
73}
74
75export interface CallbackContainer {
76 callback: Function;
77}
78
79export interface PriorityContainer {
80 priority: number;
81}
82
83export interface QueueObject<T> {
84 /**
85 * Returns the number of items waiting to be processed.
86 */
87 length(): number;
88
89 /**
90 * Indicates whether or not any items have been pushed and processed by the queue.
91 */
92 started: boolean;
93
94 /**
95 * Returns the number of items currently being processed.
96 */
97 running(): number;
98
99 /**
100 * Returns an array of items currently being processed.
101 */
102 workersList<TWorker extends DataContainer<T>, CallbackContainer>(): TWorker[];
103
104 /**
105 * Returns false if there are items waiting or being processed, or true if not.
106 */
107 idle(): boolean;
108
109 /**
110 * An integer for determining how many worker functions should be run in parallel.
111 * This property can be changed after a queue is created to alter the concurrency on-the-fly.
112 */
113 concurrency: number;
114
115 /**
116 * An integer that specifies how many items are passed to the worker function at a time.
117 * Only applies if this is a cargo object
118 */
119 payload: number;
120
121 /**
122 * Add a new task to the queue. Calls `callback` once the worker has finished
123 * processing the task.
124 *
125 * Instead of a single task, a tasks array can be submitted.
126 * The respective callback is used for every task in the list.
127 */
128 push<R>(task: T | T[]): Promise<R>;
129 push<R, E = Error>(task: T | T[], callback: AsyncResultCallback<R, E>): void;
130
131 /**
132 * Add a new task to the front of the queue
133 */
134 unshift<R>(task: T | T[]): Promise<R>;
135 unshift<R, E = Error>(task: T | T[], callback: AsyncResultCallback<R, E>): void;
136
137 /**
138 * The same as `q.push`, except this returns a promise that rejects if an error occurs.
139 * The `callback` arg is ignored
140 */
141 pushAsync<R>(task: T | T[]): Promise<R>;
142
143 /**
144 * The same as `q.unshift`, except this returns a promise that rejects if an error occurs.
145 * The `callback` arg is ignored
146 */
147 unshiftAsync<R>(task: T | T[]): Promise<R>;
148
149 /**
150 * Remove items from the queue that match a test function.
151 * The test function will be passed an object with a `data` property,
152 * and a `priority` property, if this is a `priorityQueue` object.
153 */
154 remove(filter: (node: DataContainer<T>) => boolean): void;
155
156 /**
157 * A function that sets a callback that is called when the number of
158 * running workers hits the `concurrency` limit, and further tasks will be
159 * queued.
160 *
161 * If the callback is omitted, `q.saturated()` returns a promise
162 * for the next occurrence.
163 */
164 saturated(): Promise<void>;
165 saturated(handler: () => void): void;
166
167 /**
168 * A function that sets a callback that is called when the number
169 * of running workers is less than the `concurrency` & `buffer` limits,
170 * and further tasks will not be queued
171 *
172 * If the callback is omitted, `q.unsaturated()` returns a promise
173 * for the next occurrence.
174 */
175 unsaturated(): Promise<void>;
176 unsaturated(handler: () => void): void;
177
178 /**
179 * A minimum threshold buffer in order to say that the `queue` is `unsaturated`.
180 */
181 buffer: number;
182
183 /**
184 * A function that sets a callback that is called when the last item from the `queue`
185 * is given to a `worker`.
186 *
187 * If the callback is omitted, `q.empty()` returns a promise for the next occurrence.
188 */
189 empty(): Promise<void>;
190 empty(handler: () => void): void;
191
192 /**
193 * A function that sets a callback that is called when the last item from
194 * the `queue` has returned from the `worker`.
195 *
196 * If the callback is omitted, `q.drain()` returns a promise for the next occurrence.
197 */
198 drain(): Promise<void>;
199 drain(handler: () => void): void;
200
201 /**
202 * A function that sets a callback that is called when a task errors.
203 *
204 * If the callback is omitted, `q.error()` returns a promise that rejects on the next error.
205 */
206 error(): Promise<never>;
207 error(handler: (error: Error, task: T) => void): void;
208
209 /**
210 * A boolean for determining whether the queue is in a paused state.
211 */
212 paused: boolean;
213
214 /**
215 * A function that pauses the processing of tasks until `q.resume()` is called.
216 */
217 pause(): void;
218
219 /**
220 * A function that resumes the processing of queued tasks when the queue
221 * is paused.
222 */
223 resume(): void;
224
225 /**
226 * A function that removes the drain callback and empties remaining tasks
227 * from the queue forcing it to go idle. No more tasks should be pushed to
228 * the queue after calling this function.
229 */
230 kill(): void;
231}
232
233/**
234 * A priorityQueue object to manage the tasks.
235 *
236 * There are two differences between queue and priorityQueue objects:
237 * - `push(task, priority, [callback])` — priority should be a number. If an array of tasks is given, all tasks will be assigned the same priority.
238 * - The `unshift` method was removed.
239 */
240// FIXME: can not use Omit due to ts version restriction. Replace Pick with Omit, when ts 3.5+ will be allowed
241export interface AsyncPriorityQueue<T> extends Pick<QueueObject<T>, Exclude<keyof QueueObject<T>, "push" | "unshift">> {
242 push<R>(task: T | T[], priority?: number): Promise<R>;
243 push<R, E = Error>(task: T | T[], priority: number, callback: AsyncResultCallback<R, E>): void;
244}
245
246/**
247 * @deprecated this is a type that left here for backward compatibility.
248 * Please use QueueObject instead
249 */
250export type AsyncQueue<T> = QueueObject<T>;
251
252/**
253 * @deprecated this is a type that left here for backward compatibility.
254 * Please use QueueObject instead
255 */
256export type AsyncCargoQueue<T = any> = QueueObject<T>;
257
258// Collections
259export function each<T, E = Error>(
260 arr: IterableCollection<T>,
261 iterator: AsyncIterator<T, E>,
262 callback: ErrorCallback<E>,
263): void;
264export function each<T, E = Error>(arr: IterableCollection<T>, iterator: AsyncIterator<T, E>): Promise<void>;
265export const eachSeries: typeof each;
266export function eachLimit<T, E = Error>(
267 arr: IterableCollection<T>,
268 limit: number,
269 iterator: AsyncIterator<T, E>,
270 callback: ErrorCallback<E>,
271): void;
272export function eachLimit<T, E = Error>(
273 arr: IterableCollection<T>,
274 limit: number,
275 iterator: AsyncIterator<T, E>,
276): Promise<void>;
277export const forEach: typeof each;
278export const forEachSeries: typeof each;
279export const forEachLimit: typeof eachLimit;
280export function forEachOf<T, E = Error>(
281 obj: IterableCollection<T>,
282 iterator: AsyncForEachOfIterator<T, E>,
283 callback: ErrorCallback<E>,
284): void;
285export function forEachOf<T, E = Error>(
286 obj: IterableCollection<T>,
287 iterator: AsyncForEachOfIterator<T, E>,
288): Promise<void>;
289export const forEachOfSeries: typeof forEachOf;
290export function forEachOfLimit<T, E = Error>(
291 obj: IterableCollection<T>,
292 limit: number,
293 iterator: AsyncForEachOfIterator<T, E>,
294 callback: ErrorCallback<E>,
295): void;
296export function forEachOfLimit<T, E = Error>(
297 obj: IterableCollection<T>,
298 limit: number,
299 iterator: AsyncForEachOfIterator<T, E>,
300): Promise<void>;
301export const eachOf: typeof forEachOf;
302export const eachOfSeries: typeof forEachOf;
303export const eachOfLimit: typeof forEachOfLimit;
304export function map<T, R, E = Error>(
305 arr: IterableCollection<T>,
306 iterator: AsyncResultIterator<T, R, E> | AsyncResultIteratorPromise<T, R>,
307 callback: AsyncResultArrayCallback<R, E>,
308): void;
309export function map<T, R, E = Error>(
310 arr: IterableCollection<T>,
311 iterator: AsyncResultIterator<T, R, E> | AsyncResultIteratorPromise<T, R>,
312): Promise<R[]>;
313
314export const mapSeries: typeof map;
315export function mapLimit<T, R, E = Error>(
316 arr: IterableCollection<T>,
317 limit: number,
318 iterator: AsyncResultIterator<T, R, E> | AsyncResultIteratorPromise<T, R>,
319 callback: AsyncResultArrayCallback<R, E>,
320): void;
321export function mapLimit<T, R, E = Error>(
322 arr: IterableCollection<T>,
323 limit: number,
324 iterator: AsyncResultIterator<T, R, E> | AsyncResultIteratorPromise<T, R>,
325): Promise<R[]>;
326
327export function mapValuesLimit<T, R, E = Error>(
328 obj: Dictionary<T>,
329 limit: number,
330 iteratee: (value: T, key: string, callback: AsyncResultCallback<R, E>) => void,
331 callback: AsyncResultObjectCallback<R, E>,
332): void;
333export function mapValuesLimit<T, R, E = Error>(
334 obj: Dictionary<T>,
335 limit: number,
336 iteratee: (value: T, key: string, callback: AsyncResultCallback<R, E>) => void,
337): Promise<R>;
338
339export function mapValues<T, R, E = Error>(
340 obj: Dictionary<T>,
341 iteratee: (value: T, key: string, callback: AsyncResultCallback<R, E>) => void,
342 callback: AsyncResultObjectCallback<R, E>,
343): void;
344export function mapValues<T, R, E = Error, C = unknown>(
345 obj: Dictionary<T>,
346 iteratee: (
347 value: T,
348 key: string,
349 callback: C extends undefined ? never : AsyncResultCallback<R, E>,
350 // eslint-disable-next-line @typescript-eslint/no-invalid-void-type
351 ) => C extends undefined ? Promise<R> : void,
352): Promise<Dictionary<R>>;
353export const mapValuesSeries: typeof mapValues;
354export function filter<T, E = Error>(
355 arr: IterableCollection<T>,
356 iterator: AsyncBooleanIterator<T, E>,
357 callback: AsyncResultArrayCallback<T, E>,
358): void;
359export function filter<T, E = Error>(arr: IterableCollection<T>, iterator: AsyncBooleanIterator<T, E>): Promise<T[]>;
360export const filterSeries: typeof filter;
361export function filterLimit<T, E = Error>(
362 arr: IterableCollection<T>,
363 limit: number,
364 iterator: AsyncBooleanIterator<T, E>,
365 callback: AsyncResultArrayCallback<T, E>,
366): void;
367export function filterLimit<T, E = Error>(
368 arr: IterableCollection<T>,
369 limit: number,
370 iterator: AsyncBooleanIterator<T, E>,
371): Promise<T[]>;
372export const select: typeof filter;
373export const selectSeries: typeof filter;
374export const selectLimit: typeof filterLimit;
375export const reject: typeof filter;
376export const rejectSeries: typeof filter;
377export const rejectLimit: typeof filterLimit;
378export function reduce<T, R, E = Error>(
379 arr: T[] | IterableIterator<T>,
380 memo: R,
381 iterator: AsyncMemoIterator<T, R, E>,
382 callback: AsyncResultCallback<R, E>,
383): void;
384export function reduce<T, R, E = Error>(
385 arr: T[] | IterableIterator<T>,
386 memo: R,
387 iterator: AsyncMemoIterator<T, R, E>,
388): Promise<R>;
389export const inject: typeof reduce;
390export const foldl: typeof reduce;
391export const reduceRight: typeof reduce;
392export const foldr: typeof reduce;
393export function detect<T, E = Error>(
394 arr: IterableCollection<T>,
395 iterator: AsyncBooleanIterator<T, E>,
396 callback: AsyncResultCallback<T, E>,
397): void;
398export function detect<T, E = Error>(arr: IterableCollection<T>, iterator: AsyncBooleanIterator<T, E>): Promise<T>;
399export const detectSeries: typeof detect;
400export function detectLimit<T, E = Error>(
401 arr: IterableCollection<T>,
402 limit: number,
403 iterator: AsyncBooleanIterator<T, E>,
404 callback: AsyncResultCallback<T, E>,
405): void;
406export function detectLimit<T, E = Error>(
407 arr: IterableCollection<T>,
408 limit: number,
409 iterator: AsyncBooleanIterator<T, E>,
410): Promise<T>;
411export const find: typeof detect;
412export const findSeries: typeof detect;
413export const findLimit: typeof detectLimit;
414export function sortBy<T, V, E = Error>(
415 arr: T[] | IterableIterator<T>,
416 iterator: AsyncResultIterator<T, V, E>,
417 callback: AsyncResultArrayCallback<T, E>,
418): void;
419export function sortBy<T, V, E = Error>(
420 arr: T[] | IterableIterator<T>,
421 iterator: AsyncResultIterator<T, V, E>,
422): Promise<T[]>;
423export function some<T, E = Error>(
424 arr: IterableCollection<T>,
425 iterator: AsyncBooleanIterator<T, E>,
426 callback: AsyncBooleanResultCallback<E>,
427): void;
428export function some<T, E = Error>(arr: IterableCollection<T>, iterator: AsyncBooleanIterator<T, E>): Promise<boolean>;
429export const someSeries: typeof some;
430export function someLimit<T, E = Error>(
431 arr: IterableCollection<T>,
432 limit: number,
433 iterator: AsyncBooleanIterator<T, E>,
434 callback?: AsyncBooleanResultCallback<E>,
435): void;
436export const any: typeof some;
437export const anySeries: typeof someSeries;
438export const anyLimit: typeof someLimit;
439export function every<T, E = Error>(
440 arr: IterableCollection<T>,
441 iterator: AsyncBooleanIterator<T, E>,
442 callback: AsyncBooleanResultCallback<E>,
443): void;
444export function every<T, E = Error>(arr: IterableCollection<T>, iterator: AsyncBooleanIterator<T, E>): Promise<boolean>;
445export const everySeries: typeof every;
446export function everyLimit<T, E = Error>(
447 arr: IterableCollection<T>,
448 limit: number,
449 iterator: AsyncBooleanIterator<T, E>,
450 callback: AsyncBooleanResultCallback<E>,
451): void;
452export function everyLimit<T, E = Error>(
453 arr: IterableCollection<T>,
454 limit: number,
455 iterator: AsyncBooleanIterator<T, E>,
456): Promise<boolean>;
457export const all: typeof every;
458export const allSeries: typeof every;
459export const allLimit: typeof everyLimit;
460
461export function concat<T, R, E = Error>(
462 arr: IterableCollection<T>,
463 iterator: AsyncResultIterator<T, R[], E>,
464 callback: AsyncResultArrayCallback<R, E>,
465): void;
466export function concat<T, R, E = Error>(
467 arr: IterableCollection<T>,
468 iterator: AsyncResultIterator<T, R[], E>,
469): Promise<R[]>;
470export function concatLimit<T, R, E = Error>(
471 arr: IterableCollection<T>,
472 limit: number,
473 iterator: AsyncResultIterator<T, R[], E>,
474 callback: AsyncResultArrayCallback<R, E>,
475): void;
476export function concatLimit<T, R, E = Error>(
477 arr: IterableCollection<T>,
478 limit: number,
479 iterator: AsyncResultIterator<T, R[], E>,
480): Promise<R[]>;
481export const concatSeries: typeof concat;
482export const flatMap: typeof concat;
483export const flatMapLimit: typeof concatLimit;
484export const flatMapSeries: typeof concatSeries;
485
486export function groupBy<T, K, E = Error>(
487 iterable: IterableCollection<T>,
488 iterator: AsyncResultIterator<T, K, E>,
489 callback: AsyncResultCallback<Record<string, T[]>, E>,
490): void;
491export function groupBy<T, K, E = Error>(
492 iterable: IterableCollection<T>,
493 iterator: AsyncResultIterator<T, K, E>,
494): Promise<Record<string, T[]>>;
495export function groupByLimit<T, K, E = Error>(
496 iterable: IterableCollection<T>,
497 limit: number,
498 iterator: AsyncResultIterator<T, K, E>,
499 callback: AsyncResultCallback<Record<string, T[]>, E>,
500): void;
501export function groupByLimit<T, K, E = Error>(
502 iterable: IterableCollection<T>,
503 limit: number,
504 iterator: AsyncResultIterator<T, K, E>,
505): Promise<Record<string, T[]>>;
506export const groupBySeries: typeof groupBy;
507
508// Control Flow
509export function series<T, E = Error>(tasks: Array<AsyncFunction<T, E>>, callback: AsyncResultArrayCallback<T, E>): void;
510export function series<T, E = Error>(
511 tasks: Dictionary<AsyncFunction<T, E>>,
512 callback: AsyncResultObjectCallback<T, E>,
513): void;
514export function series<T, E = Error>(tasks: Array<AsyncFunction<T, E>>): Promise<T[]>;
515export function series<T, E = Error>(tasks: Dictionary<AsyncFunction<T, E>>): Promise<Dictionary<T>>;
516export function parallel<T, E = Error>(
517 tasks: Array<AsyncFunction<T, E>>,
518 callback: AsyncResultArrayCallback<T, E>,
519): void;
520export function parallel<T, E = Error>(
521 tasks: Dictionary<AsyncFunction<T, E>>,
522 callback: AsyncResultObjectCallback<T, E>,
523): void;
524export function parallel<T, R, E = Error>(
525 tasks: Array<AsyncFunction<T, E>> | Dictionary<AsyncFunction<T, E>>,
526): Promise<R>;
527export function parallelLimit<T, E = Error>(
528 tasks: Array<AsyncFunction<T, E>>,
529 limit: number,
530 callback: AsyncResultArrayCallback<T, E>,
531): void;
532export function parallelLimit<T, E = Error>(
533 tasks: Dictionary<AsyncFunction<T, E>>,
534 limit: number,
535 callback: AsyncResultObjectCallback<T, E>,
536): void;
537export function parallelLimit<T, R, E = Error>(
538 tasks: Array<AsyncFunction<T, E>> | Dictionary<AsyncFunction<T, E>>,
539 limit: number,
540): Promise<R>;
541
542export function whilst<T, E = Error>(
543 test: (cb: AsyncBooleanResultCallback) => void,
544 fn: AsyncFunctionEx<T, E>,
545 callback: AsyncResultRestCallback<T, E>,
546): void;
547export function whilst<T, R, E = Error>(
548 test: (cb: AsyncBooleanResultCallback) => void,
549 fn: AsyncFunctionEx<T, E>,
550): Promise<R>;
551export function doWhilst<T, E = Error>(
552 fn: AsyncFunctionEx<T, E>,
553 test: (/* ...results: T[], */ cb: AsyncBooleanResultCallback) => void,
554 callback: AsyncResultRestCallback<T, E>,
555): void;
556export function doWhilst<T, R, E = Error>(
557 fn: AsyncFunctionEx<T, E>,
558 test: (/* ...results: T[], */ cb: AsyncBooleanResultCallback) => void,
559): Promise<R>;
560export function until<T, E = Error>(
561 test: (cb: AsyncBooleanResultCallback) => void,
562 fn: AsyncFunctionEx<T, E>,
563 callback: AsyncResultRestCallback<T, E>,
564): void;
565export function until<T, R, E = Error>(
566 test: (cb: AsyncBooleanResultCallback) => void,
567 fn: AsyncFunctionEx<T, E>,
568): Promise<R>;
569export function doUntil<T, E = Error>(
570 fn: AsyncFunctionEx<T, E>,
571 test: (/* ...results: T[], */ cb: AsyncBooleanResultCallback) => void,
572 callback: AsyncResultRestCallback<T, E>,
573): void;
574export function doUntil<T, R, E = Error>(
575 fn: AsyncFunctionEx<T, E>,
576 test: (/* ...results: T[], */ cb: AsyncBooleanResultCallback) => void,
577): Promise<R>;
578
579export function during<E = Error>(
580 test: (testCallback: AsyncBooleanResultCallback<E>) => void,
581 fn: AsyncVoidFunction<E>,
582 callback: ErrorCallback<E>,
583): void;
584export function doDuring<E = Error>(
585 fn: AsyncVoidFunction<E>,
586 test: (testCallback: AsyncBooleanResultCallback<E>) => void,
587 callback: ErrorCallback<E>,
588): void;
589export function forever<E = Error>(next: (next: ErrorCallback<E>) => void, errBack: ErrorCallback<E>): void;
590export function waterfall<T>(tasks: Function[]): Promise<T>;
591export function waterfall<T, E = Error>(tasks: Function[], callback: AsyncResultCallback<T, E>): void;
592export function compose(...fns: Function[]): Function;
593export function seq(...fns: Function[]): Function;
594export function applyEach(fns: Function[], ...argsAndCallback: any[]): void; // applyEach(fns, args..., callback). TS does not support ... for a middle argument. Callback is optional.
595export function applyEachSeries(fns: Function[], ...argsAndCallback: any[]): void; // applyEachSeries(fns, args..., callback). TS does not support ... for a middle argument. Callback is optional.
596export function queue<T, E = Error>(worker: AsyncWorker<T, E>, concurrency?: number): QueueObject<T>;
597export function queue<T, R, E = Error>(worker: AsyncResultIterator<T, R, E>, concurrency?: number): QueueObject<T>;
598export function priorityQueue<T, E = Error>(worker: AsyncWorker<T, E>, concurrency?: number): AsyncPriorityQueue<T>;
599export function cargo<T, E = Error>(worker: AsyncWorker<T[], E>, payload?: number): QueueObject<T>;
600export function cargoQueue<T, E = Error>(
601 worker: AsyncWorker<T[], E>,
602 concurrency?: number,
603 payload?: number,
604): QueueObject<T>;
605export function auto<R extends Dictionary<any>, E = Error>(
606 tasks: AsyncAutoTasks<R, E>,
607 concurrency?: number,
608): Promise<R>;
609export function auto<R extends Dictionary<any>, E = Error>(
610 tasks: AsyncAutoTasks<R, E>,
611 concurrency: number,
612 callback: AsyncResultCallback<R, E>,
613): void;
614export function auto<R extends Dictionary<any>, E = Error>(
615 tasks: AsyncAutoTasks<R, E>,
616 callback: AsyncResultCallback<R, E>,
617): void;
618export function autoInject<E = Error>(tasks: any, callback?: AsyncResultCallback<any, E>): void;
619
620export interface RetryOptions<E> {
621 times?: number | undefined;
622 interval?: number | ((retryCount: number) => number) | undefined;
623 errorFilter?: ((error: E) => boolean) | undefined;
624}
625export function retry<T, E = Error>(
626 task: (() => Promise<T>) | ((callback: AsyncResultCallback<T, E>) => void),
627): Promise<T>;
628export function retry<T, E = Error>(
629 opts: number | RetryOptions<E>,
630 task: (() => Promise<T>) | ((callback: AsyncResultCallback<T, E>) => void),
631): Promise<T>;
632export function retry<T, E = Error>(
633 task: (() => Promise<T>) | ((callback: AsyncResultCallback<T, E>) => void),
634 callback: AsyncResultCallback<T, E>,
635): void;
636export function retry<T, E = Error>(
637 opts: number | RetryOptions<E>,
638 task: (() => Promise<T>) | ((callback: AsyncResultCallback<T, E>) => void),
639 callback: AsyncResultCallback<T, E>,
640): void;
641
642export function retryable<T, E = Error>(task: AsyncFunction<T, E>): AsyncFunction<T, E>;
643export function retryable<T, E = Error>(
644 opts: number | (RetryOptions<E> & { arity?: number | undefined }),
645 task: AsyncFunction<T, E>,
646): AsyncFunction<T, E>;
647export function apply<E = Error>(fn: Function, ...args: any[]): AsyncFunction<any, E>;
648export function nextTick(callback: Function, ...args: any[]): void;
649export const setImmediate: typeof nextTick;
650
651export function reflect<T, E = Error>(
652 fn: AsyncFunction<T, E>,
653): (callback: (err: null, result: { error?: E | undefined; value?: T | undefined }) => void) => void;
654export function reflectAll<T, E = Error>(
655 tasks: Array<AsyncFunction<T, E>>,
656): Array<(callback: (err: null, result: { error?: E | undefined; value?: T | undefined }) => void) => void>;
657
658export function timeout<T, E = Error>(fn: AsyncFunction<T, E>, milliseconds: number, info?: any): AsyncFunction<T, E>;
659export function timeout<T, R, E = Error>(
660 fn: AsyncResultIterator<T, R, E>,
661 milliseconds: number,
662 info?: any,
663): AsyncResultIterator<T, R, E>;
664
665export function times<T, E = Error>(
666 n: number,
667 iterator: AsyncResultIterator<number, T, E> | AsyncResultIteratorPromise<number, T>,
668 callback: AsyncResultArrayCallback<T, E>,
669): void;
670export function times<T, E = Error>(
671 n: number,
672 iterator: AsyncResultIterator<number, T, E> | AsyncResultIteratorPromise<number, T>,
673): Promise<T>;
674
675export const timesSeries: typeof times;
676export function timesLimit<T, E = Error>(
677 n: number,
678 limit: number,
679 iterator: AsyncResultIterator<number, T, E> | AsyncResultIteratorPromise<number, T>,
680 callback: AsyncResultArrayCallback<T, E>,
681): void;
682export function timesLimit<T, E = Error>(
683 n: number,
684 limit: number,
685 iterator: AsyncResultIterator<number, T, E> | AsyncResultIteratorPromise<number, T>,
686): Promise<T>;
687
688export function transform<T, R, E = Error>(
689 arr: T[],
690 iteratee: (acc: R[], item: T, key: number, callback: (error?: E) => void) => void,
691 callback?: AsyncResultArrayCallback<T, E>,
692): void;
693export function transform<T, R, E = Error>(
694 arr: T[],
695 acc: R[],
696 iteratee: (acc: R[], item: T, key: number, callback: (error?: E) => void) => void,
697 callback?: AsyncResultArrayCallback<T, E>,
698): void;
699
700export function transform<T, R, E = Error>(
701 arr: { [key: string]: T },
702 iteratee: (acc: { [key: string]: R }, item: T, key: string, callback: (error?: E) => void) => void,
703 callback?: AsyncResultObjectCallback<T, E>,
704): void;
705
706export function transform<T, R, E = Error>(
707 arr: { [key: string]: T },
708 acc: { [key: string]: R },
709 iteratee: (acc: { [key: string]: R }, item: T, key: string, callback: (error?: E) => void) => void,
710 callback?: AsyncResultObjectCallback<T, E>,
711): void;
712
713export function race<T, E = Error>(tasks: Array<AsyncFunction<T, E>>, callback: AsyncResultCallback<T, E>): void;
714
715export function tryEach<T, E = Error>(
716 tasks: IterableCollection<AsyncFunction<T>>,
717 callback: AsyncResultCallback<T, E>,
718): void;
719export function tryEach<T>(tasks: IterableCollection<AsyncFunction<T>>): Promise<T>;
720
721// Utils
722export function memoize(fn: Function, hasher?: Function): Function;
723export function unmemoize(fn: Function): Function;
724export function ensureAsync(fn: (...argsAndCallback: any[]) => void): Function;
725export function constant(...values: any[]): AsyncFunction<any>;
726export function asyncify(fn: Function): (...args: any[]) => any;
727export function wrapSync(fn: Function): Function;
728export function log(fn: Function, ...args: any[]): void;
729export function dir(fn: Function, ...args: any[]): void;