| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 | const logger = require('jitsi-meet-logger').getLogger(__filename);
/**
 * Manages a queue of functions where the current function in progress will
 * automatically execute the next queued function.
 */
export class TaskQueue {
    /**
     * Creates a new instance of {@link TaskQueue} and sets initial instance
     * variable values.
     */
    constructor() {
        this._queue = [];
        this._currentTask = null;
        this._onTaskComplete = this._onTaskComplete.bind(this);
    }
    /**
     * Adds a new function to the queue. It will be immediately invoked if no
     * other functions are queued.
     *
     * @param {Function} taskFunction - The function to be queued for execution.
     * @private
     * @returns {void}
     */
    enqueue(taskFunction) {
        this._queue.push(taskFunction);
        this._executeNext();
    }
    /**
     * If no queued task is currently executing, invokes the first task in the
     * queue if any.
     *
     * @private
     * @returns {void}
     */
    _executeNext() {
        if (this._currentTask) {
            logger.warn('Task queued while a task is in progress.');
            return;
        }
        this._currentTask = this._queue.shift() || null;
        if (this._currentTask) {
            logger.debug('Executing a task.');
            try {
                this._currentTask(this._onTaskComplete);
            } catch (error) {
                logger.error(`Task execution failed: ${error}`);
                this._onTaskComplete();
            }
        }
    }
    /**
     * Prepares to invoke the next function in the queue.
     *
     * @private
     * @returns {void}
     */
    _onTaskComplete() {
        this._currentTask = null;
        logger.debug('Task completed.');
        this._executeNext();
    }
}
 |