UNPKG

xmtoolbox

Version:

A Node JS package for interacting with xMatters. Contains functions to interact with xMatters APIs or perform a synchronization, create events, libraries to convert data, and much much more!

60 lines (52 loc) 1.41 kB
/** * A custom concurrent connection limiter for xmtoolbox */ function Limiter(options = {}) { this.taskQueue = []; const maxConcurrent = options.maxConcurrent; this.taskCount = 0; this.queueProcessor = function () { //if something in queue and processing available. if (this.taskQueue[0] && this.taskCount < maxConcurrent) { //up counter this.taskCount += 1; //get task and remove it from TaskQueue const task = this.taskQueue.shift(); this.taskProcessor(task); } if (this.taskQueue.length > 0) { setImmediate(this.queueProcessor.bind(this)); } }; /** * Schedule a promise based task to be completed according the limiter configuration. * @param {*} fn * @param {...any} args */ this.schedule = async function (fn, ...args) { let scheduledTask; const task = new Promise( (resolve, reject) => (scheduledTask = { resolve, reject, fn, args, }) ); this.taskQueue.push(scheduledTask); setImmediate(this.queueProcessor.bind(this)); return task; }; this.taskProcessor = async function taskProcessor(task) { try { const result = await task.fn.apply(null, task.args); task.resolve(result); } catch (error) { task.reject(error); } //down counter this.taskCount -= 1; }; } module.exports = Limiter;