/// import {EventEmitter} from 'events'; export interface QueueAddOptions { [key: string]: unknown; } export interface QueueClass { size: number; enqueue(run: () => void, options?: EnqueueOptionsType): void; dequeue(): (() => void) | undefined; } export interface QueueClassConstructor { new(): QueueClass; } export interface Options { /** * Concurrency limit. Minimum: `1`. * * @default Infinity */ concurrency?: number; /** * Whether queue tasks within concurrency limit, are auto-executed as soon as they're added. * * @default true */ autoStart?: boolean; /** * Class with a `enqueue` and `dequeue` method, and a `size` getter. See the [Custom QueueClass](https://github.com/sindresorhus/p-queue#custom-queueclass) section. */ queueClass?: QueueClassConstructor; /** * The max number of runs in the given interval of time. Minimum: `1`. * * @default Infinity */ intervalCap?: number; /** * The length of time in milliseconds before the interval count resets. Must be finite. Minimum: `0`. * * @default 0 */ interval?: number; /** * Whether the task must finish in the given interval or will be carried over into the next interval count. * * @default false */ carryoverConcurrencyCount?: boolean; } export interface DefaultAddOptions { /** * Priority of operation. Operations with greater priority will be scheduled first. * * @default 0 */ priority?: number; } export type Task = | (() => PromiseLike) | (() => TaskResultType); /** * Promise queue with concurrency control. */ export default class PQueue< EnqueueOptionsType extends QueueAddOptions = DefaultAddOptions > extends EventEmitter { /** * Size of the queue. */ readonly size: number; /** * Number of pending promises. */ readonly pending: number; /** * Whether the queue is currently paused. */ readonly isPaused: boolean; constructor(options?: Options); /** * Adds a sync or async task to the queue. Always returns a promise. * * @param fn - Promise-returning/async function. */ add( fn: Task, options?: EnqueueOptionsType ): Promise; /** * Same as `.add()`, but accepts an array of sync or async functions. * * @param fn - Array of Promise-returning/async functions. * @returns A promise that resolves when all functions are resolved. */ addAll( fns: Task[], options?: EnqueueOptionsType ): Promise; /** * Can be called multiple times. Useful if you for example add additional items at a later time. * * @returns A promise that settles when the queue becomes empty. */ onEmpty(): Promise; /** * The difference with `.onEmpty` is that `.onIdle` guarantees that all work from the queue has finished. `.onEmpty` merely signals that the queue is empty, but it could mean that some promises haven't completed yet. * * @returns A promise that settles when the queue becomes empty, and all promises have completed; `queue.size === 0 && queue.pending === 0`. */ onIdle(): Promise; /** * Start (or resume) executing enqueued tasks within concurrency limit. No need to call this if queue is not paused (via `options.autoStart = false` or by `.pause()` method.) */ start(): void; /** * Clear the queue. */ clear(): void; /** * Put queue execution on hold. */ pause(): void; addListener(event: 'active', listener: () => void): this; on(event: 'active', listener: () => void): this; once(event: 'active', listener: () => void): this; prependListener(event: 'active', listener: () => void): this; prependOnceListener(event: 'active', listener: () => void): this; removeListener(event: 'active', listener: () => void): this; off(event: 'active', listener: () => void): this; removeAllListeners(event?: 'active'): this; listeners(event: 'active'): (() => void)[]; rawListeners(event: 'active'): (() => void)[]; emit(event: 'active'): boolean; eventNames(): 'active'[]; listenerCount(type: 'active'): number; }