From dfd9364061d29e9a4bf2e20e9abecb8b7a4fc237 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Wed, 29 Sep 2021 14:28:12 +0100 Subject: [PATCH] Add timeout option to link-call node --- .../@node-red/nodes/core/common/60-link.html | 7 +++++- .../@node-red/nodes/core/common/60-link.js | 23 ++++++++++++++++++- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/common/60-link.html b/packages/node_modules/@node-red/nodes/core/common/60-link.html index 8f65ad935..05fa8b429 100644 --- a/packages/node_modules/@node-red/nodes/core/common/60-link.html +++ b/packages/node_modules/@node-red/nodes/core/common/60-link.html @@ -28,6 +28,10 @@ +
+ + +
@@ -240,7 +244,8 @@ color:"#ddd",//"#87D8CF", defaults: { name: {value:""}, - links: { value: [], type:"link in[]"} + links: { value: [], type:"link in[]"}, + timeout: { value: "30", validate:RED.validators.number(true) } }, inputs: 1, outputs: 1, diff --git a/packages/node_modules/@node-red/nodes/core/common/60-link.js b/packages/node_modules/@node-red/nodes/core/common/60-link.js index d5eda733f..53404e446 100644 --- a/packages/node_modules/@node-red/nodes/core/common/60-link.js +++ b/packages/node_modules/@node-red/nodes/core/common/60-link.js @@ -76,6 +76,10 @@ module.exports = function(RED) { const node = this; const target = n.links[0]; const messageEvents = {}; + let timeout = parseFloat(n.timeout || "30")*1000; + if (isNaN(timeout)) { + timeout = 30000; + } this.on("input", function(msg, send, done) { msg._linkSource = msg._linkSource || []; @@ -83,7 +87,14 @@ module.exports = function(RED) { id: crypto.randomBytes(14).toString('hex'), node: node.id, } - messageEvents[messageEvent.id] = { send, done }; + messageEvents[messageEvent.id] = { + msg: RED.util.cloneMessage(msg), + send, + done, + ts: setTimeout(function() { + timeoutMessage(messageEvent.id) + }, timeout ) + }; msg._linkSource.push(messageEvent); var targetNode = RED.nodes.getNode(target); if (targetNode) { @@ -97,6 +108,7 @@ module.exports = function(RED) { } const messageEvent = messageEvents[eventId]; if (messageEvent) { + clearTimeout(messageEvent.ts); delete messageEvents[eventId]; messageEvent.send(msg); messageEvent.done(); @@ -104,6 +116,15 @@ module.exports = function(RED) { node.send(msg); } } + + function timeoutMessage(eventId) { + const messageEvent = messageEvents[eventId]; + if (messageEvent) { + delete messageEvents[eventId]; + node.error("timeout",messageEvent.msg); + } + } + } RED.nodes.registerType("link call",LinkCallNode);