d3730a3fa9
When a Buzz relay sends a CLOSED frame for a single subscription with a 'restricted: not a channel member' error, the adapter was raising ConnectionError, tearing down the entire WebSocket connection, and immediately reconnecting — causing a ~1.6 s flood in gateway.log. Root cause: the CLOSED handler unconditionally raised ConnectionError regardless of whether the error was permanent (restricted) or transient (e.g. server shutdown). Fix: - On a 'restricted' CLOSED, drop only the offending subscription and record the channel in a new _restricted_channels set instead of tearing down the whole connection. - Skip restricted channels during connect() seeding and _subscribe_websocket() so reconnects don't re-trigger the same error. - Non-restricted CLOSED frames still raise ConnectionError and reconnect as before. Adds three regression tests: - test_websocket_loop_drops_restricted_channel_without_reconnect - test_websocket_loop_reconnects_on_non_restricted_closed - test_restricted_channels_skipped_during_subscribe Tested on macOS against buzz.xozai.com: gateway.log shows zero 'restricted' errors and stable 'watching N channel(s) via websocket' after the fix.