From 54645ece2cd132f3e305b80904e1fc38bd41c4f9 Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Wed, 10 Jul 2024 11:38:53 +0200 Subject: [PATCH] fix: discard acknowledgements upon disconnection Previously, getting disconnected while waiting for an acknowledgement would create a memory leak, as the acknowledgement was never received and the handler would stay in memory forever. See also: https://github.com/socketio/socket.io-client/commit/34cbfbb532ae333f4dd034138e8f87cb80a8e382 Related: https://github.com/socketio/socket.io-client-java/issues/446 --- src/main/java/io/socket/client/Socket.java | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src/main/java/io/socket/client/Socket.java b/src/main/java/io/socket/client/Socket.java index 7e131d0..334d25f 100644 --- a/src/main/java/io/socket/client/Socket.java +++ b/src/main/java/io/socket/client/Socket.java @@ -283,6 +283,21 @@ public class Socket extends Emitter { this.connected = false; this.id = null; super.emit(EVENT_DISCONNECT, reason); + this.clearAcks(); + } + + /** + * Clears the acknowledgement handlers upon disconnection, since the client will never receive an acknowledgement from + * the server. + */ + private void clearAcks() { + for (Ack ack : this.acks.values()) { + if (ack instanceof AckWithTimeout) { + ((AckWithTimeout) ack).onTimeout(); + } + // note: basic Ack objects have no way to report an error, so they are simply ignored here + } + this.acks.clear(); } private void onpacket(Packet packet) { @@ -448,12 +463,6 @@ public class Socket extends Emitter { this.subs = null; } - for (Ack ack : acks.values()) { - if (ack instanceof AckWithTimeout) { - ((AckWithTimeout) ack).cancelTimer(); - } - } - this.io.destroy(); }