From 74f1c20f6ad878c3d11c5fc80dd8d12ee02d7bfb Mon Sep 17 00:00:00 2001 From: Damien Arrachequesne Date: Wed, 2 Jun 2021 08:46:11 +0200 Subject: [PATCH] fix(server): add support for dynamic namespaces This fix depends on the "new_namespace" event emitted by the server, which was added in `socket.io@4.1.0`. Related: https://github.com/socketio/socket.io-admin-ui/issues/6 --- lib/index.ts | 1 + package-lock.json | 22 +++++++++++----------- package.json | 2 +- test/index.ts | 25 +++++++++++++++++++++++++ 4 files changed, 38 insertions(+), 12 deletions(-) diff --git a/lib/index.ts b/lib/index.ts index ea0e5c8..57987b7 100644 --- a/lib/index.ts +++ b/lib/index.ts @@ -397,6 +397,7 @@ export function instrument(io: Server, opts: Partial) { }); io._nsps.forEach((nsp) => registerListeners(adminNamespace, nsp)); + io.on("new_namespace", (nsp) => registerListeners(adminNamespace, nsp)); } export { InMemoryStore, RedisStore } from "./stores"; diff --git a/package-lock.json b/package-lock.json index ab6fdc6..87f6bda 100644 --- a/package-lock.json +++ b/package-lock.json @@ -964,9 +964,9 @@ "dev": true }, "engine.io": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-5.0.0.tgz", - "integrity": "sha512-BATIdDV3H1SrE9/u2BAotvsmjJg0t1P4+vGedImSs1lkFAtQdvk4Ev1y4LDiPF7BPWgXWEG+NDY+nLvW3UrMWw==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-5.1.1.tgz", + "integrity": "sha512-aMWot7H5aC8L4/T8qMYbLdvKlZOdJTH54FxfdFunTGvhMx1BHkJOntWArsVfgAZVwAO9LC2sryPWRcEeUzCe5w==", "dev": true, "requires": { "accepts": "~1.3.4", @@ -2177,9 +2177,9 @@ "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" }, "socket.io": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.0.1.tgz", - "integrity": "sha512-g8eZB9lV0f4X4gndG0k7YZAywOg1VxYgCUspS4V+sDqsgI/duqd0AW84pKkbGj/wQwxrqrEq+VZrspRfTbHTAQ==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.1.2.tgz", + "integrity": "sha512-xK0SD1C7hFrh9+bYoYCdVt+ncixkSLKtNLCax5aEy1o3r5PaO5yQhVb97exIe67cE7lAK+EpyMytXWTWmyZY8w==", "dev": true, "requires": { "@types/cookie": "^0.4.0", @@ -2188,15 +2188,15 @@ "accepts": "~1.3.4", "base64id": "~2.0.0", "debug": "~4.3.1", - "engine.io": "~5.0.0", - "socket.io-adapter": "~2.2.0", + "engine.io": "~5.1.0", + "socket.io-adapter": "~2.3.0", "socket.io-parser": "~4.0.3" } }, "socket.io-adapter": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.2.0.tgz", - "integrity": "sha512-rG49L+FwaVEwuAdeBRq49M97YI3ElVabJPzvHT9S6a2CWhDKnjSFasvwAwSYPRhQzfn4NtDIbCaGYgOCOU/rlg==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.1.tgz", + "integrity": "sha512-8cVkRxI8Nt2wadkY6u60Y4rpW3ejA1rxgcK2JuyIhmF+RMNpTy1QRtkHIDUOf3B4HlQwakMsWbKftMv/71VMmw==", "dev": true }, "socket.io-client": { diff --git a/package.json b/package.json index 6920ce1..5347e67 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "nyc": "^15.1.0", "prettier": "^2.2.1", "redis": "^3.0.2", - "socket.io": "^4.0.1", + "socket.io": "^4.1.2", "socket.io-client": "^4.0.1", "socket.io-v3": "npm:socket.io@^3.1.2", "ts-node": "^9.1.1", diff --git a/test/index.ts b/test/index.ts index 76ed31e..8cff224 100644 --- a/test/index.ts +++ b/test/index.ts @@ -336,6 +336,31 @@ describe("Socket.IO Admin (server instrumentation)", () => { adminSocket.disconnect(); }); + + it("supports dynamic namespaces", async function () { + // requires `socket.io>=4.1.0` with the "new_namespace" event + if (version === "v3") { + return this.skip(); + } + instrument(io, { + auth: false, + }); + + io.of(/\/dynamic-\d+/); + + const adminSocket = ioc(`http://localhost:${port}/admin`); + await waitFor(adminSocket, "connect"); + + const clientSocket = ioc(`http://localhost:${port}/dynamic-101`, { + forceNew: true, + }); + + const socket = await waitFor(adminSocket, "socket_connected"); + + expect(socket.nsp).to.eql("/dynamic-101"); + clientSocket.disconnect(); + adminSocket.disconnect(); + }); }); });