// A generalized queue object for rapid responses (doesn't do prioritization or algorithmic timesharing) // .enable must be used to start it, and .enqueue can be used at any time module.exports = function(delayms, maxExport, call){ let queue = []; let id = 0; let open = true; // Has call() run in the past delayms ms? let getObjs = (maxExport == 1) ? // Should call be given one object or an array? () => queue.shift() : () => queue.splice(0, maxExport); this.enqueue = function(arr){ id += arr.length; for (item of arr) queue.push(item); if (open) dequeue(); return id; } disabled = true; // Used to disable pushes when non-sensical like if a socket is down this.disable = function(){ disabled = true; } this.enable = function(){ disabled = false; if (open) dequeue(); } function dequeue(){ if (disabled){ open = true; return; } if (queue.length == 0) open = true; else { open = false; call(getObjs(), id-queue.length); setTimeout(dequeue, delayms); } } }