From 370b0441cfdc2343a4226daf8287fcf11ead3032 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9E=AC=EC=9A=B1?= Date: Thu, 19 Mar 2026 22:58:15 +0900 Subject: [PATCH] feat(adapter): emit a "session-expiry" event when a session has expired --- .../lib/in-memory-adapter.ts | 2 ++ packages/socket.io-adapter/test/index.ts | 34 +++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/packages/socket.io-adapter/lib/in-memory-adapter.ts b/packages/socket.io-adapter/lib/in-memory-adapter.ts index cf178170e0..d57bf7ea18 100644 --- a/packages/socket.io-adapter/lib/in-memory-adapter.ts +++ b/packages/socket.io-adapter/lib/in-memory-adapter.ts @@ -423,6 +423,7 @@ export class SessionAwareAdapter extends Adapter { const hasExpired = session.disconnectedAt < threshold; if (hasExpired) { this.sessions.delete(sessionId); + this.emit("session-expiry", session.sid); } }); for (let i = this.packets.length - 1; i >= 0; i--) { @@ -456,6 +457,7 @@ export class SessionAwareAdapter extends Adapter { if (hasExpired) { // the session has expired this.sessions.delete(pid); + this.emit("session-expiry", session.sid); return null; } const index = this.packets.findIndex((packet) => packet.id === offset); diff --git a/packages/socket.io-adapter/test/index.ts b/packages/socket.io-adapter/test/index.ts index 285ae66f02..29bfbacabc 100644 --- a/packages/socket.io-adapter/test/index.ts +++ b/packages/socket.io-adapter/test/index.ts @@ -551,5 +551,39 @@ describe("socket.io-adapter", () => { expect(session).to.be(null); }); + + it("should emit a 'session-expiry' event when a session has expired", async () => { + const adapter = new SessionAwareAdapter({ + server: { + encoder: { + encode(packet) { + return packet; + }, + }, + opts: { + connectionStateRecovery: { + maxDisconnectionDuration: -1, + }, + }, + }, + }); + + adapter.persistSession({ + sid: "abc", + pid: "def", + data: "ghi", + rooms: ["r1", "r2"], + }); + + let expiredSid: string | undefined; + adapter.on("session-expiry", (sid) => { + expiredSid = sid; + }); + + const session = await adapter.restoreSession("def", "some-offset"); + + expect(session).to.be(null); + expect(expiredSid).to.eql("abc"); + }); }); });