lib/sinatra-websocketio/websocketio.rb in sinatra-websocketio-0.0.3 vs lib/sinatra-websocketio/websocketio.rb in sinatra-websocketio-0.0.4

- old
+ new

@@ -8,25 +8,33 @@ puts "WebSocketIO.start port:#{options[:port]}" EM::WebSocket.run :host => "0.0.0.0", :port => options[:port] do |ws| ws.onopen do |handshake| params = parse_handshake_params handshake.path session_id = params[:session] || (create_session Socket.unpack_sockaddr_in ws.get_peername) - self.sessions[session_id] = { - :websocket => ws - } - ws.onclose do - self.emit :disconnect, session_id - end - ws.onmessage do |msg| - begin - data = JSON.parse msg - rescue => e - self.emit :error, e + + if self.sessions.include? session_id + ws.send({:type => :error, :data => "invalid session_id (#{session_id})"}.to_json) + ws.close + else + self.sessions[session_id] = { + :websocket => ws + } + ws.onclose do + self.sessions.delete session_id + self.emit :disconnect, session_id end - self.emit data['type'], data['data'], session_id if data + ws.onmessage do |msg| + begin + data = JSON.parse msg + rescue => e + self.emit :error, e + end + self.emit data['type'], data['data'], session_id if data + end + ws.send({:type => :__session_id, :data => session_id}.to_json) + self.emit :connect, session_id end - ws.send({:type => :__session_id, :data => session_id}.to_json) - self.emit :connect, session_id + end end end end