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
pull/5459/head
Dennis-SEG 2026-01-24 23:20:35 +01:00 committed by Dennis Bosmans
parent 1019d52f78
commit ee954ab208
1 changed files with 15 additions and 3 deletions

View File

@ -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 {