"use strict"; /** * Pool of Queues. * * @class * @arg {number} count - Number of queues. * @throws {AssertionError} - If queues count is not above 0. */ var LOG = require("./logger"); var gid = 0; /** * Tasks queue. * * @class */ var Queue = function (id) { this.id = id || ++gid; this.weight = 0; this._p = Promise.resolve(); }; /** * Adds task to queue. * * @method * @arg {number} weight - Task weight. * @arg {function} task - Task. */ Queue.prototype.add = function (weight, task) { this.weight += weight; this._p = this._p .then(() => { LOG.silly(`Queue #${this.id}: task is started.`); return task(); }).catch(e => LOG.error(e)) .then(() => { this.weight -= weight; LOG.silly(`Queue #${this.id}: task is finished.`); }); }; var Pool = function (count) { count = count || 1; this._qq = []; for (var i = 0; i < count; i++) { this._qq.push(new Queue(i+1)); }; }; /** * Addes task to the least loaded queue. * * @method * @arg {number} weight - Task weight. * @arg {function} task - Task. */ Pool.prototype.add = function (weight, task) { if (typeof(weight) === "function") { task = weight; weight = 1; } var queue = this._qq[0]; for (var q of this._qq) { if (queue.weight === 0) break; if (q.weight < queue.weight) queue = q; }; queue.add(weight, task); }; module.exports = Pool;