From ee954ab208c700d5852f4e28da443ab2218b5ef0 Mon Sep 17 00:00:00 2001 From: Dennis-SEG Date: Sat, 24 Jan 2026 23:20:35 +0100 Subject: [PATCH] fix: prevent double done() call in TCP request node close handler Use a guard flag to prevent done() from being called multiple times. This handles the case where: - If connected: destroy() triggers close event -> callDone() - If not connected: callDone() is called directly as safety net - Guard prevents double-call if close event fires after direct call Addresses review feedback from @knolleary. Fixes #5452 --- .../@node-red/nodes/core/network/31-tcpin.js | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/network/31-tcpin.js b/packages/node_modules/@node-red/nodes/core/network/31-tcpin.js index 500bbe2c2..c8b94eb9a 100644 --- a/packages/node_modules/@node-red/nodes/core/network/31-tcpin.js +++ b/packages/node_modules/@node-red/nodes/core/network/31-tcpin.js @@ -190,11 +190,23 @@ module.exports = function(RED) { setupTcpClient(); this.on('close', function(done) { - node.doneClose = done; + var doneCalled = false; + var callDone = function() { + if (!doneCalled) { + doneCalled = true; + done(); + } + }; + node.doneClose = callDone; this.closing = true; - if (client) { client.destroy(); } clearTimeout(reconnectTimeout); - if (!node.connected) { done(); } + if (client) { + client.destroy(); + // If not connected, close event may not fire, so call done as safety net + if (!node.connected) { callDone(); } + } else { + callDone(); + } }); } else {