// A generalized queue object for rapid responses (doesn't do prioritization or algorithmic timesharing) module.exports = function(delayms, maxExport, call){ let queue = []; let open = true; // The meaning of this variable is complicated, so watch closely let getObjs = (maxExport == 1) ? () => queue.shift() : () => queue.splice(0, maxExport) ; this.enqueue = function(){ for (let i = 0; i < arguments.length; i++) queue.push(arguments[i]); if (open) dequeue(); } 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()); setTimeout(dequeue, delayms); } } }