diff --git a/lib/socket.ts b/lib/socket.ts index f2ac9287..a25d4a19 100644 --- a/lib/socket.ts +++ b/lib/socket.ts @@ -687,10 +687,12 @@ export class Socket< ); if (!isBuffered) { // note: handlers that do not accept an error as first argument are ignored here - if (this.acks[id].withError) { - this.acks[id].call(this, new Error("socket has been disconnected")); - } + const ack = this.acks[id]; delete this.acks[id]; + + if (ack.withError) { + ack.call(this, new Error("socket has been disconnected")); + } } }); } diff --git a/test/socket.ts b/test/socket.ts index dc8dbbd4..36366013 100644 --- a/test/socket.ts +++ b/test/socket.ts @@ -678,6 +678,9 @@ describe("socket", () => { socket.disconnect(); + // @ts-ignore property 'acks' is private + expect(Object.keys(socket.acks).length).to.eql(0); + setTimeout(() => success(done, socket), 100); }); }); @@ -693,6 +696,9 @@ describe("socket", () => { socket.timeout(10_000).emit("echo", "a", (err) => { expect(err).to.be.an(Error); + // @ts-ignore property 'acks' is private + expect(Object.keys(socket.acks).length).to.eql(0); + success(done, socket); }); @@ -768,6 +774,7 @@ describe("socket", () => { socket.once("connect", () => { socket.disconnect(); + // the packet will be buffered and sent upon reconnection socket.emit("echo", "a", (value) => { expect(value).to.eql("a");