magent 0.5.1 → 0.5.2
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/lib/magent/web_socket_server.rb +50 -39
- data/magent.gemspec +1 -1
- metadata +2 -2
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.5.
|
1
|
+
0.5.2
|
@@ -7,60 +7,60 @@ module Magent
|
|
7
7
|
$stdout.puts ">> Server running and up! #{options}}" if options[:debug]
|
8
8
|
|
9
9
|
EventMachine.run do
|
10
|
-
|
11
|
-
@channels = {}
|
12
|
-
@channel_ids = {}
|
13
|
-
@sids = {}
|
10
|
+
setup
|
14
11
|
|
15
12
|
EM.run do
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
13
|
+
EventMachine.add_periodic_timer(options.delete(:interval)||10) do
|
14
|
+
while message = Magent::WebSocketChannel.dequeue
|
15
|
+
if (channel = @channels[message["channel_id"]])
|
16
|
+
channel.push(message.to_json)
|
17
|
+
end
|
20
18
|
end
|
21
19
|
end
|
22
20
|
end
|
23
|
-
end
|
24
21
|
|
25
22
|
EventMachine::WebSocket.start(options) do |ws|
|
26
23
|
ws.onopen do
|
27
24
|
ws.onmessage do |msg|
|
28
25
|
data = JSON.parse(msg) rescue {}
|
29
26
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
27
|
+
if !handle_message(ws, data)
|
28
|
+
case data["id"]
|
29
|
+
when 'start'
|
30
|
+
if data["channel_id"].present? && (channel_id = validate_channel_id(data["channel_id"]))
|
31
|
+
key = generate_unique_key(data["key"])
|
32
|
+
@channels[channel_id] ||= EM::Channel.new
|
33
|
+
@channel_ids[key] = channel_id
|
34
|
+
|
35
|
+
sid = @channels[channel_id].subscribe { |msg| ws.send(msg) }
|
36
|
+
|
37
|
+
@sids[key] = sid
|
38
|
+
ws.onclose do
|
39
|
+
@channel_ids.delete(key)
|
40
|
+
@channels[channel_id].unsubscribe(sid)
|
41
|
+
@sids.delete(key)
|
42
|
+
end
|
43
|
+
|
44
|
+
ws.send({:id => "ack", :key => key}.to_json)
|
45
|
+
send(:on_ack, ws, channel_id) if respond_to?(:on_ack)
|
46
|
+
else
|
47
|
+
ws.close_connection
|
44
48
|
end
|
49
|
+
when 'chatmessage'
|
50
|
+
key = data["key"]
|
51
|
+
return invalid_key(ws) if key.blank? || @sids[key].blank?
|
45
52
|
|
46
|
-
|
47
|
-
else
|
48
|
-
ws.close_connection
|
49
|
-
end
|
50
|
-
when 'chatmessage'
|
51
|
-
key = data["key"]
|
52
|
-
return invalid_key if key.blank? || @sids[key].blank?
|
53
|
+
channel_id = @channel_ids[key]
|
53
54
|
|
54
|
-
|
55
|
+
if channel_id
|
56
|
+
chat_message = {:id => 'chatmessage', :from => user_name(key, @sids[key]), :message => data["message"]}
|
55
57
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
58
|
+
@channels[channel_id].push(validate_chat_message(channel_id, chat_message).to_json)
|
59
|
+
else
|
60
|
+
ws.send({:id => 'announcement', :type => "error", :message => "cannot find the channel"}.to_json)
|
61
|
+
end
|
60
62
|
end
|
61
|
-
|
62
|
-
handle_message(ws, data)
|
63
|
-
end
|
63
|
+
end # if
|
64
64
|
end
|
65
65
|
end
|
66
66
|
end # EM::WebSocket
|
@@ -71,13 +71,24 @@ module Magent
|
|
71
71
|
self.new(options)
|
72
72
|
end
|
73
73
|
|
74
|
+
def setup
|
75
|
+
@channel = EM::Channel.new
|
76
|
+
@channels = {}
|
77
|
+
@channel_ids = {}
|
78
|
+
@sids = {}
|
79
|
+
end
|
80
|
+
|
74
81
|
protected
|
75
82
|
def invalid_key(ws)
|
76
83
|
ws.send({:id => 'announcement', :type => "error", :message => "you must provide your unique key"}.to_json)
|
77
84
|
end
|
78
85
|
|
79
86
|
def handle_message(ws, data)
|
80
|
-
|
87
|
+
false
|
88
|
+
end
|
89
|
+
|
90
|
+
def validate_chat_message(channel_id, chat_message)
|
91
|
+
chat_message
|
81
92
|
end
|
82
93
|
|
83
94
|
protected
|
data/magent.gemspec
CHANGED