From 74765bf063fd2720a03ca989b2a3c4b773974ee5 Mon Sep 17 00:00:00 2001 From: Oskar Eichler Date: Fri, 28 Aug 2026 03:14:35 +0300 Subject: [PATCH 1/2] Close every owned client session when the connection ends --- lib/websocket/extensions.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/websocket/extensions.rb b/lib/websocket/extensions.rb index 14ca7ab..3bcc5ae 100644 --- a/lib/websocket/extensions.rb +++ b/lib/websocket/extensions.rb @@ -67,6 +67,7 @@ def generate_offer end @sessions = sessions + @client_sessions = sessions @index = index offer.size > 0 ? offer.join(', ') : nil @@ -157,7 +158,10 @@ def process_outgoing_message(message) def close return unless @sessions - @sessions.each do |ext, session| + sessions = @client_sessions || @sessions + @client_sessions, @sessions = nil, [] + + sessions.each do |ext, session| session.close rescue nil end end From 1ebc3f9f90c49b48ae2c87a8b3fe8e90e416c1a0 Mon Sep 17 00:00:00 2001 From: Oskar Eichler <62393985+OskarEichler@users.noreply.github.com> Date: Fri, 28 Aug 2026 14:43:33 +0300 Subject: [PATCH 2/2] Add extension lifecycle regression coverage --- spec/websocket/extensions_spec.rb | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/spec/websocket/extensions_spec.rb b/spec/websocket/extensions_spec.rb index ccb305d..39f00b7 100644 --- a/spec/websocket/extensions_spec.rb +++ b/spec/websocket/extensions_spec.rb @@ -161,6 +161,22 @@ end end + describe :close do + before do + @extensions.add(@nonconflict) + @extensions.generate_offer + @extensions.activate("deflate") + end + + it "closes selected and unselected sessions only once" do + expect(@session).to receive(:close).exactly(1) + expect(@nonconflict_session).to receive(:close).exactly(1) + + @extensions.close + @extensions.close + end + end + describe :process_incoming_message do before do @extensions.add(@conflict)