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