From 11845b0194b658e4af7fc7130cbad34619ec6379 Mon Sep 17 00:00:00 2001 From: Not-Sarthak Date: Sat, 21 Feb 2026 22:16:24 +0530 Subject: [PATCH] fix(adapter): do not skip local broadcast when publishAndReturnOffset throws Remove the `return` in the catch block of ClusterAdapter.broadcast() so that super.broadcast() is still called when remote publishing fails. This ensures local sockets receive the event even if the cluster publish errors out (e.g. due to a serialization error in the adapter layer). Fixes #5456 --- .../socket.io-adapter/lib/cluster-adapter.ts | 6 +----- .../socket.io-adapter/test/cluster-adapter.ts | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/packages/socket.io-adapter/lib/cluster-adapter.ts b/packages/socket.io-adapter/lib/cluster-adapter.ts index c53a48b4be..170bf51b05 100644 --- a/packages/socket.io-adapter/lib/cluster-adapter.ts +++ b/packages/socket.io-adapter/lib/cluster-adapter.ts @@ -438,11 +438,7 @@ export abstract class ClusterAdapter extends Adapter { }); this.addOffsetIfNecessary(packet, opts, offset); } catch (e) { - return debug( - "[%s] error while broadcasting message: %s", - this.uid, - e.message, - ); + debug("[%s] error while broadcasting message: %s", this.uid, e.message); } } diff --git a/packages/socket.io-adapter/test/cluster-adapter.ts b/packages/socket.io-adapter/test/cluster-adapter.ts index 18af8d478e..bfd043c48d 100644 --- a/packages/socket.io-adapter/test/cluster-adapter.ts +++ b/packages/socket.io-adapter/test/cluster-adapter.ts @@ -15,6 +15,7 @@ const NODES_COUNT = 3; class EventEmitterAdapter extends ClusterAdapterWithHeartbeat { private offset = 1; + public shouldFailPublish = false; constructor( nsp, @@ -27,6 +28,9 @@ class EventEmitterAdapter extends ClusterAdapterWithHeartbeat { } protected doPublish(message: ClusterMessage): Promise { + if (this.shouldFailPublish) { + return Promise.reject(new Error("publish failed")); + } this.eventBus.emit("message", message); return Promise.resolve(String(++this.offset)); } @@ -152,6 +156,19 @@ describe("cluster adapter", () => { servers[0].local.emit("test"); }); + it("broadcasts to local clients even when publishAndReturnOffset throws", (done) => { + const adapter = servers[0].of("/").adapter as EventEmitterAdapter; + adapter.shouldFailPublish = true; + + clientSockets[0].on("test", (arg1) => { + expect(arg1).to.eql(1); + adapter.shouldFailPublish = false; + done(); + }); + + servers[0].emit("test", 1); + }); + it("broadcasts with multiple acknowledgements", (done) => { clientSockets[0].on("test", (cb) => cb(1)); clientSockets[1].on("test", (cb) => cb(2));