From 43dba448ada48a4927b2f31d3a360d68189c02af Mon Sep 17 00:00:00 2001 From: Huixin615 Date: Wed, 17 Jun 2026 00:12:10 +0800 Subject: [PATCH] fix(channel): unsubscribe channel listeners by equality (#3608) --- backend/app/channels/message_bus.py | 2 +- backend/tests/test_channels.py | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/backend/app/channels/message_bus.py b/backend/app/channels/message_bus.py index 64a3c2271..e04f51006 100644 --- a/backend/app/channels/message_bus.py +++ b/backend/app/channels/message_bus.py @@ -172,7 +172,7 @@ class MessageBus: def unsubscribe_outbound(self, callback: OutboundCallback) -> None: """Remove a previously registered outbound callback.""" - self._outbound_listeners = [cb for cb in self._outbound_listeners if cb is not callback] + self._outbound_listeners = [cb for cb in self._outbound_listeners if cb != callback] async def publish_outbound(self, msg: OutboundMessage) -> None: """Dispatch an outbound message to all registered listeners.""" diff --git a/backend/tests/test_channels.py b/backend/tests/test_channels.py index 59f1539c1..9dba24af8 100644 --- a/backend/tests/test_channels.py +++ b/backend/tests/test_channels.py @@ -148,6 +148,27 @@ class TestMessageBus: _run(go()) + def test_unsubscribe_outbound_removes_fresh_bound_method_reference(self): + bus = MessageBus() + received = [] + + class Handler: + async def callback(self, msg): + received.append((self, msg)) + + handler = Handler() + other_handler = Handler() + + async def go(): + bus.subscribe_outbound(handler.callback) + bus.subscribe_outbound(other_handler.callback) + bus.unsubscribe_outbound(handler.callback) + out = OutboundMessage(channel_name="test", chat_id="c1", thread_id="t1", text="reply") + await bus.publish_outbound(out) + assert received == [(other_handler, out)] + + _run(go()) + def test_outbound_error_does_not_crash(self): bus = MessageBus()