magent 0.5.1 → 0.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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