From d820f55358b29f408dc062da377baaf2bd63a9ee Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Thu, 15 Jul 2021 22:15:46 +0100 Subject: [PATCH] Add push to front of rate limit queue. (moved random delay to top to group with other delay types. Tests and docs to follow --- .../@node-red/nodes/core/function/89-delay.js | 49 +++++++++++-------- 1 file changed, 28 insertions(+), 21 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/function/89-delay.js b/packages/node_modules/@node-red/nodes/core/function/89-delay.js index 10f30796b..850497e22 100644 --- a/packages/node_modules/@node-red/nodes/core/function/89-delay.js +++ b/packages/node_modules/@node-red/nodes/core/function/89-delay.js @@ -154,6 +154,7 @@ module.exports = function(RED) { }, 15 * 1000); node.on("close", function() { clearInterval(loggerId); }); + // The delay type modes if (node.pauseType === "delay") { node.on("input", function(msg, send, done) { var id = ourTimeout(function() { @@ -199,6 +200,29 @@ module.exports = function(RED) { }); node.on("close", function() { clearDelayList(); }); } + else if (node.pauseType === "random") { + node.on("input", function(msg, send, done) { + var wait = node.randomFirst + (node.diff * Math.random()); + var id = ourTimeout(function() { + node.idList.splice(node.idList.indexOf(id),1); + send(msg); + if (node.timeout >= 1000) { + node.status({fill:"blue",shape:"dot",text:node.idList.length}); + } + done(); + }, wait, () => done()); + if (Object.keys(msg).length === 2 && msg.hasOwnProperty("flush")) { id.clear(); } + else { node.idList.push(id); } + if (msg.hasOwnProperty("reset")) { clearDelayList(true); } + if (msg.hasOwnProperty("flush")) { flushDelayList(msg.flush); done(); } + if (node.timeout >= 1000) { + node.status({fill:"blue",shape:"dot",text:node.idList.length}); + } + }); + node.on("close", function() { clearDelayList(); }); + } + + // The rate limit/queue type modes else if (node.pauseType === "rate") { node.on("input", function(msg, send, done) { if (msg.hasOwnProperty("reset")) { @@ -217,6 +241,7 @@ module.exports = function(RED) { if (!node.drop) { var m = RED.util.cloneMessage(msg); delete m.flush; + delete m.lifo; if (Object.keys(m).length > 1) { if (node.intervalID !== -1) { if (node.allowrate && msg.hasOwnProperty("rate") && !isNaN(parseFloat(msg.rate)) && node.rate !== msg.rate) { @@ -228,6 +253,9 @@ module.exports = function(RED) { if ((max_msgs > 0) && (node.buffer.length >= max_msgs)) { node.buffer = []; node.error(RED._("delay.errors.too-many"), msg); + } else if (msg.lifo) { + node.buffer.unshift({msg: m, send: send, done: done}); + node.reportDepth(); } else { node.buffer.push({msg: m, send: send, done: done}); node.reportDepth(); @@ -385,27 +413,6 @@ module.exports = function(RED) { node.status({}); }); } - else if (node.pauseType === "random") { - node.on("input", function(msg, send, done) { - var wait = node.randomFirst + (node.diff * Math.random()); - var id = ourTimeout(function() { - node.idList.splice(node.idList.indexOf(id),1); - send(msg); - if (node.timeout >= 1000) { - node.status({fill:"blue",shape:"dot",text:node.idList.length}); - } - done(); - }, wait, () => done()); - if (Object.keys(msg).length === 2 && msg.hasOwnProperty("flush")) { id.clear(); } - else { node.idList.push(id); } - if (msg.hasOwnProperty("reset")) { clearDelayList(true); } - if (msg.hasOwnProperty("flush")) { flushDelayList(msg.flush); done(); } - if (node.timeout >= 1000) { - node.status({fill:"blue",shape:"dot",text:node.idList.length}); - } - }); - node.on("close", function() { clearDelayList(); }); - } } RED.nodes.registerType("delay",DelayNode); }