ts-async-queue
Version: 
A simple async-await task queue written in TypeScript
150 lines (149 loc) • 4.49 kB
TypeScript
/**
 * A function that returns promise and has no arguments
 */
export declare type Task<E = any> = () => Promise<E>;
/**
 * Manages a queue of async tasks
 *
 * @class TaskQueue
 */
export declare class TaskQueue {
    /**
     * Tasklist
     */
    protected tasks: Task[];
    /**
     * Creates an instance of TaskQueue.
     */
    constructor();
    /**
     * Creates an instance of TaskQueue.
     * @param {Task[]} [tasks=[]] Tasklist
     */
    constructor(tasks: Task[]);
    /**
     * The most recent running queue
     */
    protected lastQueue?: Promise<any[]>;
    /**
     * Results of a last queue execution
     */
    protected _lastResults: any[];
    /**
     * Results of a last queue execution.
     *
     * Empty, if execution hasn't started yet.
     */
    readonly lastResults: any[];
    /**
     * `true` if the queue is running
     *
     * SHOULD NOT BE MODIFIED outside the class
     */
    protected running: boolean;
    /**
     * `true` if the queue is running
     */
    readonly isRunning: boolean;
    /**
     * An index at which the queue is currenlty running
     */
    protected index: number;
    /**
     * A task index at which the queue is currently running
     *
     * `-1` if the queue is not currently running
     */
    readonly currentTaskIndex: number;
    /**
     * A task which is currently running in the queue
     *
     * `undefined` if the queue is not currently running
     */
    readonly currentRunningTask: Task | undefined;
    /**
     * Remove a task from queue by its index
     *
     * @returns a removed task if found
     */
    protected dequeueByIndex(index: number): Task<any> | undefined;
    /**
     * Remove a task from queue by its reference. If no task was given, removes the last task.
     * @param {T} [task] a reference to the task function to remove by
     * @returns a removed task if found
     */
    protected dequeueByTask<T extends Task>(task?: T): Task<any> | undefined;
    /**
     * Start executing the queue from a certain point.
     * Halts if `running` flag is off (pause has occured).
     *
     * If any error in any task is raised - pauses queue execution and throws the error upstack.
     *
     * @param {number} from
     *    A point to execute a queue from.
     * @param {Array<any>} lastResults
     *    Saved results to add to.
     * @param {boolean} running
     *    Internal indication if the method should continue running.
     *    Passing `false` will result in the method not running.
     * @returns a promise that resolves to task results array when the queue is finished
     */
    protected launchFrom(from: number, lastResults?: any[], running?: boolean): Promise<any[]>;
    /**
     * Adds one or more tasks to queue.
     */
    enqueue(...tasks: Task[]): void;
    /**
     * Removes task from the queue.
     * @returns a removed task if found
     */
    dequeue(task?: Task): Task | undefined;
    dequeue(index: number): Task | undefined;
    /**
     * Removes the last task from the queue.
     * @returns a removed task if found
     */
    pop(): Task<any> | undefined;
    /**
     * Get last added task without mutating the queue
     */
    peek(): Task | undefined;
    /**
     * Last added task
     */
    readonly last: Task<any> | undefined;
    /**
     * Queue length
     */
    readonly length: number;
    /**
     * Completely clears the queue and stops executions.
     */
    clear(): void;
    /**
     * Pauses the queue's execution flow after a nearest task is completed.
     *
     * @returns a promise that resolves as soon as the queue is paused
     */
    pause(): Promise<any[]>;
    /**
     * Resumes a previously paused queue.
     *
     * @returns a promise that resolves as soon as the queue is completed
     */
    resume(): Promise<any[]>;
    /**
     * Stops queue execution and clears results.
     *
     * @returns a promise that resolves to queue results (or `undefined` if the queue has already been stopeed) as soon as the queue completely stops executing
     */
    stop(): Promise<any[]>;
    /**
     * Starts task queue execution.
     *
     * Returns currenlty executed queue if execution already started
     *
     * @returns promise with task results as an array sorted by task execution order
     */
    start(): Promise<any[]>;
}