From f6301588ca65de270ecfe22da9023d7ec79ba23a Mon Sep 17 00:00:00 2001 From: Sarthak Shah <92942966+Not-Sarthak@users.noreply.github.com> Date: Thu, 12 Mar 2026 16:08:29 +0530 Subject: [PATCH] fix(adapter): do not skip local broadcast when publishAndReturnOffset throws (#5457) 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). Related: https://github.com/socketio/socket.io/issues/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 c53a48b4..170bf51b 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 18af8d47..bfd043c4 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));