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 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)