agenda/job-processing-queue.js

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.JobProcessingQueue = void 0;
/**
 * @class
 * @param {Object} args - Job Options
 * @property {Object} agenda - The Agenda instance
 * @property {Object} attrs
 */
var JobProcessingQueue = /** @class */ (function () {
    function JobProcessingQueue() {
        this._queue = [];
    }
    Object.defineProperty(JobProcessingQueue.prototype, "length", {
        get: function () {
            return this._queue.length;
        },
        enumerable: false,
        configurable: true
    });
    return JobProcessingQueue;
}());
exports.JobProcessingQueue = JobProcessingQueue;
/**
 * Pops and returns last queue element (next job to be processed) without checking concurrency.
 * @returns Next Job to be processed
 */
JobProcessingQueue.prototype.pop = function () {
    return this._queue.pop();
};
/**
 * Inserts job in first queue position
 * @param job job to add to queue
 */
JobProcessingQueue.prototype.push = function (job) {
    this._queue.push(job);
};
/**
 * Inserts job in queue where it will be order from left to right in decreasing
 * order of nextRunAt and priority (in case of same nextRunAt), if all values
 * are even the first jobs to be introduced will have priority
 * @param job job to add to queue
 */
JobProcessingQueue.prototype.insert = function (job) {
    var matchIndex = this._queue.findIndex(function (element) {
        if (element.attrs.nextRunAt.getTime() <= job.attrs.nextRunAt.getTime()) {
            if (element.attrs.nextRunAt.getTime() === job.attrs.nextRunAt.getTime()) {
                if (element.attrs.priority >= job.attrs.priority) {
                    return true;
                }
            }
            else {
                return true;
            }
        }
        return false;
    });
    if (matchIndex === -1) {
        this._queue.push(job);
    }
    else {
        this._queue.splice(matchIndex, 0, job);
    }
};
/**
 * Returns (does not pop, element remains in queue) first element (always from the right)
 * that can be processed (not blocked by concurrency execution)
 * @param agendaDefinitions job to add to queue
 * @returns Next Job to be processed
 */
JobProcessingQueue.prototype.returnNextConcurrencyFreeJob = function (agendaDefinitions) {
    var next;
    for (next = this._queue.length - 1; next > 0; next -= 1) {
        var def = agendaDefinitions[this._queue[next].attrs.name];
        if (def.concurrency > def.running) {
            break;
        }
    }
    return this._queue[next];
};