From 97678577fbf54260ed81cd306aef9aaf189c9c17 Mon Sep 17 00:00:00 2001 From: Steve-Mcl Date: Thu, 14 Apr 2022 22:07:52 +0100 Subject: [PATCH 1/3] call done after ws disconnects fixes #3527 --- .../nodes/core/network/22-websocket.js | 28 ++++++++++++------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/network/22-websocket.js b/packages/node_modules/@node-red/nodes/core/network/22-websocket.js index ed4c93b09..9fa991254 100644 --- a/packages/node_modules/@node-red/nodes/core/network/22-websocket.js +++ b/packages/node_modules/@node-red/nodes/core/network/22-websocket.js @@ -210,7 +210,7 @@ module.exports = function(RED) { startconn(); // start outbound connection } - node.on("close", function() { + node.on("close", function(done) { if (node.heartbeatInterval) { clearInterval(node.heartbeatInterval); } @@ -218,19 +218,27 @@ module.exports = function(RED) { delete listenerNodes[node.fullPath]; node.server.close(); node._inputNodes = []; - activeListenerNodes--; - // if (activeListenerNodes === 0 && serverUpgradeAdded) { - // RED.server.removeListener('upgrade', handleServerUpgrade); - // serverUpgradeAdded = false; - // } } else { node.closing = true; node.server.close(); - if (node.tout) { - clearTimeout(node.tout); - node.tout = null; - } + //wait 20*50 (1000ms max) for ws to close. + //call done when readyState === ws.CLOSED (or 1000ms, whichever comes fist) + const closeMonitorInterval = 20; + let closeMonitorCount = 50; + let si = setInterval(() => { + if(node.server.readyState === ws.CLOSED || closeMonitorCount <= 0) { + if (node.tout) { + clearTimeout(node.tout); + node.tout = null; + } + clearInterval(si); + return done(); + } + closeMonitorCount--; + if(closeMonitorCount <= 0) { + } + }, closeMonitorInterval); } }); } From 6f89efa40b20f209545d8d210df4f27bdb44b778 Mon Sep 17 00:00:00 2001 From: Stephen McLaughlin <44235289+Steve-Mcl@users.noreply.github.com> Date: Tue, 19 Apr 2022 10:30:08 +0100 Subject: [PATCH 2/3] remove unused if block Co-authored-by: Nick O'Leary --- .../node_modules/@node-red/nodes/core/network/22-websocket.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/network/22-websocket.js b/packages/node_modules/@node-red/nodes/core/network/22-websocket.js index 9fa991254..08f9884c2 100644 --- a/packages/node_modules/@node-red/nodes/core/network/22-websocket.js +++ b/packages/node_modules/@node-red/nodes/core/network/22-websocket.js @@ -236,8 +236,6 @@ module.exports = function(RED) { return done(); } closeMonitorCount--; - if(closeMonitorCount <= 0) { - } }, closeMonitorInterval); } }); From 8df53e441d419ce26ca53d062a0ac5b599f91438 Mon Sep 17 00:00:00 2001 From: Steve-Mcl Date: Tue, 19 Apr 2022 10:42:00 +0100 Subject: [PATCH 3/3] remove unused vars --- .../node_modules/@node-red/nodes/core/network/22-websocket.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/network/22-websocket.js b/packages/node_modules/@node-red/nodes/core/network/22-websocket.js index 08f9884c2..5a46f04ff 100644 --- a/packages/node_modules/@node-red/nodes/core/network/22-websocket.js +++ b/packages/node_modules/@node-red/nodes/core/network/22-websocket.js @@ -35,8 +35,6 @@ module.exports = function(RED) { } } var listenerNodes = {}; - var activeListenerNodes = 0; - // A node red node that sets up a local websocket server function WebSocketListenerNode(n) { @@ -166,7 +164,6 @@ module.exports = function(RED) { } if (node.isServer) { - activeListenerNodes++; if (!serverUpgradeAdded) { RED.server.on('upgrade', handleServerUpgrade); serverUpgradeAdded = true