Skip to content

Commit daa91de

Browse files
fix: cleanup pending acks on timeout to prevent memory leak
Related: #4984
1 parent 0dfe5f0 commit daa91de

File tree

2 files changed

+26
-0
lines changed

2 files changed

+26
-0
lines changed

packages/socket.io/lib/broadcast-operator.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ import type {
1313
FirstNonErrorArg,
1414
EventNamesWithError,
1515
} from "./typed-events";
16+
import debugModule from "debug";
17+
18+
const debug = debugModule("socket.io:broadcast-operator");
1619

1720
export class BroadcastOperator<EmitEvents extends EventsMap, SocketData>
1821
implements TypedEventBroadcaster<EmitEvents>
@@ -235,6 +238,17 @@ export class BroadcastOperator<EmitEvents extends EventsMap, SocketData>
235238

236239
const timer = setTimeout(() => {
237240
timedOut = true;
241+
242+
debug("operation has timed out");
243+
// @ts-expect-error
244+
const packetId = packet.id;
245+
246+
if (packetId !== undefined) {
247+
this.adapter.nsp.sockets.forEach((socket) => {
248+
socket.acks.delete(packetId);
249+
});
250+
}
251+
238252
ack.apply(this, [
239253
new Error("operation has timed out"),
240254
this.flags.expectSingleResponse ? null : responses,
@@ -246,6 +260,13 @@ export class BroadcastOperator<EmitEvents extends EventsMap, SocketData>
246260
let expectedClientCount = 0;
247261

248262
const checkCompleteness = () => {
263+
debug(
264+
"responses: servers: %d / %d ; clients: %d / %d",
265+
actualServerCount,
266+
expectedServerCount,
267+
responses.length,
268+
expectedClientCount,
269+
);
249270
if (
250271
!timedOut &&
251272
expectedServerCount === actualServerCount &&

packages/socket.io/test/messaging-many.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -534,6 +534,11 @@ describe("messaging many", () => {
534534
// @ts-ignore
535535
expect(err.responses).to.contain(1, 2);
536536

537+
for (const [, serverSocket] of io.of("/").sockets) {
538+
// @ts-ignore accessing private acks map to verify cleanup
539+
expect(serverSocket.acks.size).to.be(0);
540+
}
541+
537542
success(done, io, socket1, socket2, socket3);
538543
}
539544
});

0 commit comments

Comments
 (0)