sinatra-rocketio 0.1.2 → 0.2.0
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.
- checksums.yaml +7 -0
- data/.gitignore +1 -0
- data/History.txt +7 -0
- data/README.md +63 -14
- data/Rakefile +6 -0
- data/lib/js/rocketio.js +9 -2
- data/lib/sinatra-rocketio/channel.rb +18 -0
- data/lib/sinatra-rocketio/client_info.rb +11 -0
- data/lib/sinatra-rocketio/rocketio.rb +21 -11
- data/lib/sinatra-rocketio/version.rb +1 -1
- data/lib/sinatra/rocketio.rb +3 -0
- data/lib/sinatra/rocketio/client.rb +8 -2
- data/sample/bin/cui_chat_client.rb +3 -3
- data/sample/main.rb +16 -11
- data/sample/public/js/{index.js → chat.js} +4 -4
- data/sample/views/{index.haml → chat.haml} +4 -2
- data/sinatra-rocketio.gemspec +3 -2
- data/test/app.rb +3 -38
- data/test/app/main.rb +13 -18
- data/test/test_channel.rb +49 -0
- data/test/test_helper.rb +0 -7
- data/test/test_push_multi_client.rb +49 -0
- data/test/test_rocketio.rb +8 -16
- data/test/test_settings.rb +0 -8
- metadata +57 -71
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 33e9321349e2c8ad2b3f8dc6bae895fc702a803d
|
4
|
+
data.tar.gz: 416b39ec174fe75633467e72a4066c9dccc1f09c
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: d9cabcb7973308e6325af32e8c7289220c92fa417004a5428c15e5cb825f65115b87c7f4193ed22ee815bebd88e9a68db57311eef8893925529bbacf882d4c2c
|
7
|
+
data.tar.gz: d295ace4d4bcfa0431285529a8664b78df9f0380413a50a83b657e2c7d09d121c6ba85156d8a755d453ece7d917687e4dd9234714a88d17195347762d3430fdf
|
data/History.txt
CHANGED
data/README.md
CHANGED
@@ -11,15 +11,15 @@ sinatra-rocketio
|
|
11
11
|
Installation
|
12
12
|
------------
|
13
13
|
|
14
|
-
gem install sinatra-rocketio
|
14
|
+
% gem install sinatra-rocketio
|
15
15
|
|
16
16
|
|
17
17
|
Requirements
|
18
18
|
------------
|
19
19
|
* Ruby 1.8.7 or 1.9.2 or 1.9.3 or 2.0.0
|
20
20
|
* Sinatra 1.3.0+
|
21
|
-
* EventMachine
|
22
|
-
* jQuery
|
21
|
+
* [EventMachine](http://rubyeventmachine.com)
|
22
|
+
* [jQuery](http://jquery.com)
|
23
23
|
|
24
24
|
|
25
25
|
Usage
|
@@ -67,7 +67,7 @@ io.on("light", function(data){
|
|
67
67
|
Client Side
|
68
68
|
|
69
69
|
```javascript
|
70
|
-
io.on("connect", function(
|
70
|
+
io.on("connect", function(){
|
71
71
|
io.push("chat", {name: "shokai", message: "hello"}); // client -> server
|
72
72
|
});
|
73
73
|
```
|
@@ -75,8 +75,8 @@ io.on("connect", function(session){
|
|
75
75
|
Server Side
|
76
76
|
|
77
77
|
```ruby
|
78
|
-
io.on :chat do |data,
|
79
|
-
puts "#{data['name']} : #{data['message']} <#{session}> type:#{type}"
|
78
|
+
io.on :chat do |data, client|
|
79
|
+
puts "#{data['name']} : #{data['message']} <#{client.session}> type:#{client.type}"
|
80
80
|
end
|
81
81
|
## => "shokai : hello <12abcde345f6g7h8ijk> type:websocket"
|
82
82
|
```
|
@@ -86,21 +86,21 @@ end
|
|
86
86
|
Client Side
|
87
87
|
|
88
88
|
```javascript
|
89
|
-
io.on("connect", function(
|
90
|
-
alert("connect!!");
|
89
|
+
io.on("connect", function(){
|
90
|
+
alert("connect!! "+io.session);
|
91
91
|
});
|
92
92
|
```
|
93
93
|
|
94
94
|
Server Side
|
95
95
|
|
96
96
|
```ruby
|
97
|
-
io.on :connect do |
|
98
|
-
puts "new client <#{session}> type:#{type}"
|
97
|
+
io.on :connect do |client|
|
98
|
+
puts "new client <#{client.session}> type:#{client.type}"
|
99
99
|
io.push :hello, "hello new client!!"
|
100
100
|
end
|
101
101
|
|
102
|
-
io.on :disconnect do |
|
103
|
-
puts "client disconnected <#{session}> type:#{type}"
|
102
|
+
io.on :disconnect do |client|
|
103
|
+
puts "client disconnected <#{client.session}> type:#{client.type}"
|
104
104
|
end
|
105
105
|
```
|
106
106
|
|
@@ -119,8 +119,8 @@ io.on("error", function(err){
|
|
119
119
|
Server Side
|
120
120
|
|
121
121
|
```ruby
|
122
|
-
event_id = io.on :chat do |data,
|
123
|
-
puts "#{data} - from:#{
|
122
|
+
event_id = io.on :chat do |data, client|
|
123
|
+
puts "chat #{data} - from:#{client.session} type:#{client.type}"
|
124
124
|
end
|
125
125
|
io.removeListener event_id
|
126
126
|
```
|
@@ -148,6 +148,40 @@ io.removeListener("error"); // remove all "error" listener
|
|
148
148
|
```
|
149
149
|
|
150
150
|
|
151
|
+
### Chanel
|
152
|
+
|
153
|
+
make client groups.
|
154
|
+
|
155
|
+
Client Side
|
156
|
+
```javascript
|
157
|
+
var io = new RocketIO({channel: "ch1"}).connect(); // set channel "ch1"
|
158
|
+
|
159
|
+
io.on("connect", function(){
|
160
|
+
io.push("hi", "haaaaaaaai!!");
|
161
|
+
});
|
162
|
+
|
163
|
+
io.on("announce", function(msg){
|
164
|
+
alert(msg);
|
165
|
+
// => alert "new client a1b2cde345fg in ch1"
|
166
|
+
});
|
167
|
+
```
|
168
|
+
|
169
|
+
Server Side
|
170
|
+
```ruby
|
171
|
+
io = Sinatra::RocketIO
|
172
|
+
|
173
|
+
io.on :connect do |client|
|
174
|
+
msg = "new client #{client.session} in #{client.channel}"
|
175
|
+
io.push :announce, msg, :channel => client.channel # to all clients in Channel "ch1"
|
176
|
+
end
|
177
|
+
|
178
|
+
io.on :hi do |msg, client|
|
179
|
+
puts "client says #{msg} (channel:#{client.channel})"
|
180
|
+
# => "client says haaaaaaaai!! (channel:ch1)"
|
181
|
+
end
|
182
|
+
```
|
183
|
+
|
184
|
+
|
151
185
|
Sample App
|
152
186
|
----------
|
153
187
|
chat app
|
@@ -157,6 +191,21 @@ chat app
|
|
157
191
|
- https://github.com/shokai/rocketio-arduino-sample
|
158
192
|
|
159
193
|
|
194
|
+
Test
|
195
|
+
----
|
196
|
+
|
197
|
+
% gem install bundler
|
198
|
+
% bundle install
|
199
|
+
|
200
|
+
start server
|
201
|
+
|
202
|
+
% rake test_server
|
203
|
+
|
204
|
+
run test
|
205
|
+
|
206
|
+
% rake test
|
207
|
+
|
208
|
+
|
160
209
|
Contributing
|
161
210
|
------------
|
162
211
|
|
data/Rakefile
CHANGED
data/lib/js/rocketio.js
CHANGED
@@ -1,10 +1,14 @@
|
|
1
|
-
var RocketIO = function(){
|
1
|
+
var RocketIO = function(opts){
|
2
2
|
new EventEmitter().apply(this);
|
3
3
|
this.type = null; // "comet", "websocket"
|
4
4
|
this.session = null;
|
5
|
+
this.channel = null;
|
5
6
|
this.io = null;
|
6
7
|
var self = this;
|
7
8
|
var ws_close_timer = null;
|
9
|
+
if(typeof opts === "object"){
|
10
|
+
this.channel = ""+opts.channel;
|
11
|
+
}
|
8
12
|
|
9
13
|
this.connect = function(){
|
10
14
|
self.io = function(){
|
@@ -29,10 +33,13 @@ var RocketIO = function(){
|
|
29
33
|
else if(self.io.url.match(/cometio/)) self.type = "comet";
|
30
34
|
else self.type = "unknown";
|
31
35
|
self.io.on("*", function(event_name, args){
|
36
|
+
if(event_name === "connect") event_name = "__connect";
|
32
37
|
self.emit(event_name, args);
|
33
38
|
});
|
34
|
-
self.
|
39
|
+
self.on("__connect", function(session_id){
|
35
40
|
self.session = session_id;
|
41
|
+
io.push("__channel_id", self.channel);
|
42
|
+
self.emit("connect");
|
36
43
|
});
|
37
44
|
ws_close_timer = setTimeout(function(){
|
38
45
|
self.close();
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Sinatra
|
2
|
+
module RocketIO
|
3
|
+
|
4
|
+
def self.channels
|
5
|
+
@@channels ||= {}
|
6
|
+
end
|
7
|
+
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
Sinatra::RocketIO.on :__channel_id do |channel, client|
|
12
|
+
channels[client[:session]] = channel
|
13
|
+
client.channel = channel
|
14
|
+
emit :connect, client
|
15
|
+
end
|
16
|
+
Sinatra::RocketIO.on :disconnect do |client, type|
|
17
|
+
channels.delete client[:session]
|
18
|
+
end
|
@@ -4,13 +4,21 @@ module Sinatra
|
|
4
4
|
module RocketIO
|
5
5
|
|
6
6
|
def self.push(type, data, opt={})
|
7
|
-
if
|
8
|
-
|
7
|
+
if opt.include? :to and opt[:to].kind_of? Array
|
8
|
+
opt[:to].each do |to|
|
9
|
+
push type, data, :to => to
|
10
|
+
end
|
11
|
+
elsif opt.include? :channel
|
12
|
+
channels.select{|session, channel|
|
13
|
+
channel == opt[:channel].to_s
|
14
|
+
}.each do |session|
|
15
|
+
push type, data, :to => session
|
16
|
+
end
|
17
|
+
else
|
18
|
+
if options[:websocket]
|
9
19
|
Sinatra::WebSocketIO.push type, data, opt
|
10
20
|
end
|
11
|
-
|
12
|
-
if options[:comet]
|
13
|
-
if !opt[:to] or Sinatra::CometIO.sessions.include? opt[:to]
|
21
|
+
if options[:comet]
|
14
22
|
Sinatra::CometIO.push type, data, opt
|
15
23
|
end
|
16
24
|
end
|
@@ -18,8 +26,8 @@ module Sinatra
|
|
18
26
|
|
19
27
|
def self.sessions
|
20
28
|
{
|
21
|
-
:websocket => Sinatra::WebSocketIO.sessions,
|
22
|
-
:comet => Sinatra::CometIO.sessions
|
29
|
+
:websocket => Sinatra::WebSocketIO.sessions.keys,
|
30
|
+
:comet => Sinatra::CometIO.sessions.keys
|
23
31
|
}
|
24
32
|
end
|
25
33
|
|
@@ -29,19 +37,21 @@ end
|
|
29
37
|
Sinatra::RocketIO.once :start do
|
30
38
|
if options[:comet]
|
31
39
|
Sinatra::CometIO.on :* do |event_name, *args|
|
40
|
+
event_name = :__connect if event_name == :connect
|
32
41
|
if args.size > 1
|
33
|
-
Sinatra::RocketIO.emit event_name, args[0], args[1], :comet
|
42
|
+
Sinatra::RocketIO.emit event_name, args[0], Sinatra::RocketIO::ClientInfo.new(:session => args[1], :channel => Sinatra::RocketIO.channels[args[1]], :type => :comet)
|
34
43
|
else
|
35
|
-
Sinatra::RocketIO.emit event_name, args[0], :comet
|
44
|
+
Sinatra::RocketIO.emit event_name, Sinatra::RocketIO::ClientInfo.new(:session => args[0], :channel => Sinatra::RocketIO.channels[args[0]], :type => :comet)
|
36
45
|
end
|
37
46
|
end
|
38
47
|
end
|
39
48
|
if options[:websocket]
|
40
49
|
Sinatra::WebSocketIO.on :* do |event_name, *args|
|
50
|
+
event_name = :__connect if event_name == :connect
|
41
51
|
if args.size > 1
|
42
|
-
Sinatra::RocketIO.emit event_name, args[0], args[1], :websocket
|
52
|
+
Sinatra::RocketIO.emit event_name, args[0], Sinatra::RocketIO::ClientInfo.new(:session => args[1], :channel => Sinatra::RocketIO.channels[args[1]], :type => :websocket)
|
43
53
|
else
|
44
|
-
Sinatra::RocketIO.emit event_name, args[0], :websocket
|
54
|
+
Sinatra::RocketIO.emit event_name, Sinatra::RocketIO::ClientInfo.new(:session => args[0], :channel => Sinatra::RocketIO.channels[args[0]], :type => :websocket)
|
45
55
|
end
|
46
56
|
end
|
47
57
|
end
|
data/lib/sinatra/rocketio.rb
CHANGED
@@ -1,13 +1,16 @@
|
|
1
1
|
require 'eventmachine'
|
2
2
|
require 'event_emitter'
|
3
|
+
require 'hashie'
|
3
4
|
require 'sinatra/cometio'
|
4
5
|
require 'sinatra/websocketio_nostart'
|
5
6
|
require File.expand_path '../sinatra-rocketio/version', File.dirname(__FILE__)
|
7
|
+
require File.expand_path '../sinatra-rocketio/client_info', File.dirname(__FILE__)
|
6
8
|
require File.expand_path '../sinatra-rocketio/helpers', File.dirname(__FILE__)
|
7
9
|
require File.expand_path '../sinatra-rocketio/options', File.dirname(__FILE__)
|
8
10
|
require File.expand_path '../sinatra-rocketio/rocketio', File.dirname(__FILE__)
|
9
11
|
require File.expand_path '../sinatra-rocketio/javascript', File.dirname(__FILE__)
|
10
12
|
require File.expand_path '../sinatra-rocketio/application', File.dirname(__FILE__)
|
13
|
+
require File.expand_path '../sinatra-rocketio/channel', File.dirname(__FILE__)
|
11
14
|
|
12
15
|
module Sinatra
|
13
16
|
module RocketIO
|
@@ -12,12 +12,13 @@ module Sinatra
|
|
12
12
|
end
|
13
13
|
|
14
14
|
include EventEmitter
|
15
|
-
attr_reader :settings, :type, :io
|
15
|
+
attr_reader :settings, :type, :io, :channel
|
16
16
|
|
17
17
|
public
|
18
|
-
def initialize(url, opt={:type => :websocket})
|
18
|
+
def initialize(url, opt={:type => :websocket, :channel => nil})
|
19
19
|
@url = url
|
20
20
|
@type = opt[:type].to_sym
|
21
|
+
@channel = opt[:channel] ? opt[:channel].to_s : nil
|
21
22
|
@io = nil
|
22
23
|
@settings = nil
|
23
24
|
@ws_close_thread = nil
|
@@ -56,8 +57,13 @@ module Sinatra
|
|
56
57
|
raise Error, "cannot find #{type} IO #{url}"
|
57
58
|
end
|
58
59
|
@io.on :* do |event_name, *args|
|
60
|
+
event_name = :__connect if event_name == :connect
|
59
61
|
this.emit event_name, *args
|
60
62
|
end
|
63
|
+
this.on :__connect do
|
64
|
+
this.io.push :__channel_id, this.channel
|
65
|
+
this.emit :connect
|
66
|
+
end
|
61
67
|
if @type == :websocket
|
62
68
|
@ws_close_thread = Thread.new do
|
63
69
|
sleep 3
|
@@ -8,11 +8,11 @@ name = `whoami`.strip || 'shokai'
|
|
8
8
|
url = ARGV.shift || 'http://localhost:5000'
|
9
9
|
type = ARGV.shift || :websocket
|
10
10
|
|
11
|
-
io = Sinatra::RocketIO::Client.new(url, :type => type).connect
|
11
|
+
io = Sinatra::RocketIO::Client.new(url, :type => type, :channel => "1").connect
|
12
12
|
#io = Sinatra::RocketIO::Client.new('http://localhost:5000', :type => :comet).connect
|
13
13
|
|
14
|
-
io.on :connect do
|
15
|
-
puts "#{io.type} connect!! (session_id:#{session})"
|
14
|
+
io.on :connect do
|
15
|
+
puts "#{io.type} connect!! (session_id:#{io.session})"
|
16
16
|
end
|
17
17
|
|
18
18
|
io.on :chat do |data|
|
data/sample/main.rb
CHANGED
@@ -6,20 +6,20 @@ class ChatApp < Sinatra::Base
|
|
6
6
|
puts "RocketIO start!!!"
|
7
7
|
end
|
8
8
|
|
9
|
-
io.on :connect do |
|
10
|
-
puts "new client
|
11
|
-
push :chat, {:name => "system", :message => "new #{type} client <#{session}>"}
|
12
|
-
push :chat, {:name => "system", :message => "welcome <#{session}>"},
|
9
|
+
io.on :connect do |client|
|
10
|
+
puts "new client - #{client}"
|
11
|
+
push :chat, {:name => "system", :message => "new #{client.type} client <#{client.session}>"}, :channel => client.channel
|
12
|
+
push :chat, {:name => "system", :message => "welcome <#{client.session}>"}, :to => client.session
|
13
13
|
end
|
14
14
|
|
15
|
-
io.on :disconnect do |
|
16
|
-
puts "disconnect client
|
17
|
-
push :chat, {:name => "system", :message => "bye <#{session}>"}
|
15
|
+
io.on :disconnect do |client|
|
16
|
+
puts "disconnect client - #{client}"
|
17
|
+
push :chat, {:name => "system", :message => "bye <#{client.session}>"}, :channel => client.channel
|
18
18
|
end
|
19
19
|
|
20
|
-
io.on :chat do |data,
|
21
|
-
puts "#{data['name']} : #{data['message']}
|
22
|
-
push :chat, data
|
20
|
+
io.on :chat do |data, client|
|
21
|
+
puts "#{data['name']} : #{data['message']} - #{client}"
|
22
|
+
push :chat, data, :channel => client.channel
|
23
23
|
end
|
24
24
|
|
25
25
|
io.on :error do |err|
|
@@ -27,7 +27,12 @@ class ChatApp < Sinatra::Base
|
|
27
27
|
end
|
28
28
|
|
29
29
|
get '/' do
|
30
|
-
|
30
|
+
redirect '/chat/1'
|
31
|
+
end
|
32
|
+
|
33
|
+
get '/chat/:channel' do
|
34
|
+
@channel = params[:channel]
|
35
|
+
haml :chat
|
31
36
|
end
|
32
37
|
|
33
38
|
get '/:source.css' do
|
@@ -1,4 +1,4 @@
|
|
1
|
-
var io = new RocketIO().connect();
|
1
|
+
var io = new RocketIO({channel: channel}).connect();
|
2
2
|
|
3
3
|
$(function(){
|
4
4
|
$("#chat #btn_send").click(post);
|
@@ -12,12 +12,12 @@ io.on("chat", function(data){
|
|
12
12
|
$("#chat #timeline").prepend(m);
|
13
13
|
});
|
14
14
|
|
15
|
-
io.on("connect", function(
|
16
|
-
console.log("connect!! "+session);
|
15
|
+
io.on("connect", function(){
|
16
|
+
console.log("connect!! "+io.session);
|
17
17
|
$("#type").text("type : "+io.type);
|
18
18
|
});
|
19
19
|
|
20
|
-
io.on("disconnect", function(
|
20
|
+
io.on("disconnect", function(){
|
21
21
|
console.log("disconnect!!");
|
22
22
|
});
|
23
23
|
|
@@ -4,14 +4,16 @@
|
|
4
4
|
%meta{'http-equiv' => 'Content-Type', :content => 'text/html', :charset => 'UTF-8'}
|
5
5
|
%title sinatra-rocketio chat
|
6
6
|
%link{:rel => 'stylesheet', :href => "/main.css", :type => 'text/css'}
|
7
|
+
:javascript
|
8
|
+
var channel = "#{@channel}";
|
7
9
|
%script{:type => 'text/javascript', :src => "//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"}
|
8
10
|
%script{:type => 'text/javascript', :src => rocketio_js}
|
9
|
-
%script{:type => 'text/javascript', :src => "/js/
|
11
|
+
%script{:type => 'text/javascript', :src => "/js/chat.js"}
|
10
12
|
|
11
13
|
%body
|
12
14
|
%div#content
|
13
15
|
%div#header
|
14
|
-
%h1 rocketio chat
|
16
|
+
%h1 rocketio chat [ch:#{@channel}]
|
15
17
|
%span#type
|
16
18
|
%div#main
|
17
19
|
%div#chat
|
data/sinatra-rocketio.gemspec
CHANGED
@@ -25,9 +25,10 @@ Gem::Specification.new do |gem|
|
|
25
25
|
gem.add_development_dependency "httparty"
|
26
26
|
gem.add_development_dependency "json"
|
27
27
|
|
28
|
-
gem.add_dependency "sinatra-cometio", ">= 0.4.
|
29
|
-
gem.add_dependency "sinatra-websocketio", ">= 0.2.
|
28
|
+
gem.add_dependency "sinatra-cometio", ">= 0.4.3"
|
29
|
+
gem.add_dependency "sinatra-websocketio", ">= 0.2.2"
|
30
30
|
gem.add_dependency "sinatra"
|
31
31
|
gem.add_dependency "eventmachine", ">= 1.0.0"
|
32
32
|
gem.add_dependency "event_emitter", ">= 0.2.4"
|
33
|
+
gem.add_dependency "hashie"
|
33
34
|
end
|
data/test/app.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'httparty'
|
2
|
-
|
3
1
|
class App
|
4
2
|
|
5
3
|
def self.running
|
@@ -26,48 +24,15 @@ class App
|
|
26
24
|
"http://localhost:#{port}/cometio/io"
|
27
25
|
end
|
28
26
|
|
29
|
-
def self.pid_file
|
30
|
-
ENV['PID_FILE'] || "/tmp/sinatra-rocketio-testapp.pid"
|
31
|
-
end
|
32
|
-
|
33
27
|
def self.app_dir
|
34
28
|
File.expand_path 'app', File.dirname(__FILE__)
|
35
29
|
end
|
36
30
|
|
37
|
-
def self.pid
|
38
|
-
return unless @running
|
39
|
-
File.open(pid_file) do |f|
|
40
|
-
pid = f.gets.strip.to_i
|
41
|
-
return pid if pid > 0
|
42
|
-
end
|
43
|
-
return
|
44
|
-
end
|
45
|
-
|
46
31
|
def self.start
|
47
|
-
return if
|
48
|
-
File.delete pid_file if File.exists? pid_file
|
49
|
-
Thread.new do
|
50
|
-
IO::popen "cd #{app_dir} && PID_FILE=#{pid_file} WS_PORT=#{ws_port} rackup config.ru -p #{port} > /dev/null 2>&1"
|
51
|
-
end
|
32
|
+
return if running
|
52
33
|
@running = true
|
53
|
-
|
54
|
-
|
55
|
-
sleep 2
|
56
|
-
return true
|
57
|
-
end
|
58
|
-
sleep 0.1
|
59
|
-
end
|
60
|
-
@running = false
|
61
|
-
return false
|
62
|
-
end
|
63
|
-
|
64
|
-
def self.stop
|
65
|
-
return unless @running
|
66
|
-
if File.exists? pid_file
|
67
|
-
system "kill -9 #{pid}"
|
68
|
-
File.delete pid_file
|
69
|
-
end
|
70
|
-
@running = false
|
34
|
+
cmd = "cd #{app_dir} && WS_PORT=#{ws_port} rackup config.ru -p #{port}"
|
35
|
+
system cmd
|
71
36
|
end
|
72
37
|
|
73
38
|
end
|
data/test/app/main.rb
CHANGED
@@ -1,13 +1,3 @@
|
|
1
|
-
pid_file = ENV['PID_FILE'] || "/tmp/sinatra-rocketio-test-pid"
|
2
|
-
EM::defer do
|
3
|
-
while !EM::reactor_running? do
|
4
|
-
sleep 0.1
|
5
|
-
end
|
6
|
-
File.open(pid_file, "w+") do |f|
|
7
|
-
f.write Process.pid.to_s
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
1
|
class TestApp < Sinatra::Base
|
12
2
|
register Sinatra::RocketIO
|
13
3
|
io = Sinatra::RocketIO
|
@@ -16,23 +6,28 @@ class TestApp < Sinatra::Base
|
|
16
6
|
"sinatra-rocketio v#{Sinatra::RocketIO::VERSION}"
|
17
7
|
end
|
18
8
|
|
19
|
-
io.on :connect do |
|
20
|
-
puts "new client <session:#{session}> <type:#{type}>"
|
9
|
+
io.on :connect do |client|
|
10
|
+
puts "new client <session:#{client.session}> <type:#{client.type}>"
|
21
11
|
end
|
22
12
|
|
23
|
-
io.on :disconnect do |
|
24
|
-
puts "disconnect client <session:#{session}> <type:#{type}>"
|
13
|
+
io.on :disconnect do |client|
|
14
|
+
puts "disconnect client <session:#{client.session}> <type:#{client.type}>"
|
25
15
|
end
|
26
16
|
|
27
|
-
io.on :broadcast do |data,
|
17
|
+
io.on :broadcast do |data, client|
|
28
18
|
puts from
|
29
|
-
puts "broadcast <session:#{
|
19
|
+
puts "broadcast <session:#{client.session}> <type:#{client.type}> - #{data.to_json}"
|
30
20
|
push :broadcast, data
|
31
21
|
end
|
32
22
|
|
33
|
-
io.on :message do |data,
|
34
|
-
puts "message <session:#{
|
23
|
+
io.on :message do |data, client|
|
24
|
+
puts "message <session:#{client.session}> <type:#{client.type}> - #{data.to_json}"
|
35
25
|
push :message, data, :to => data['to']
|
36
26
|
end
|
37
27
|
|
28
|
+
io.on :to_channel do |data, client|
|
29
|
+
puts "message to channel:#{client.channel} <type:#{client.type}> - #{data.to_json}"
|
30
|
+
push :to_channel, data, :channel => client.channel
|
31
|
+
end
|
32
|
+
|
38
33
|
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require File.expand_path 'test_helper', File.dirname(__FILE__)
|
2
|
+
|
3
|
+
class TestChannel < MiniTest::Unit::TestCase
|
4
|
+
|
5
|
+
def test_channel
|
6
|
+
## client1(comet, channel "aaa") --> server --> client3(websocket, channel "aaa")
|
7
|
+
## client2(websocket, channel "bbb") not receive data from channel "aaa"
|
8
|
+
post_data = {:time => Time.now.to_s, :msg => 'hello!!'}
|
9
|
+
res = nil
|
10
|
+
res2 = nil
|
11
|
+
res3 = nil
|
12
|
+
client = Sinatra::RocketIO::Client.new(App.url, :type => :comet, :channel => "aaa").connect
|
13
|
+
client.on :to_channel do |data|
|
14
|
+
res = data
|
15
|
+
end
|
16
|
+
|
17
|
+
client.on :connect do
|
18
|
+
client2 = Sinatra::RocketIO::Client.new(App.url, :type => :websocket, :channel => "bbb").connect
|
19
|
+
client2.on :connect do
|
20
|
+
client3 = Sinatra::RocketIO::Client.new(App.url, :type => :websocket, :channel => "aaa").connect
|
21
|
+
client3.on :connect do
|
22
|
+
client.push :to_channel, post_data
|
23
|
+
end
|
24
|
+
client3.on :to_channel do |data|
|
25
|
+
res3 = data
|
26
|
+
client3.close
|
27
|
+
end
|
28
|
+
end
|
29
|
+
client2.on :to_channel do |data|
|
30
|
+
res2 = data
|
31
|
+
client2.close
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
50.times do
|
36
|
+
break if res != nil and res3 != nil
|
37
|
+
sleep 0.1
|
38
|
+
end
|
39
|
+
client.close
|
40
|
+
assert res != nil, 'comet server not respond'
|
41
|
+
assert res["time"] == post_data[:time]
|
42
|
+
assert res["msg"] == post_data[:msg]
|
43
|
+
assert res3 != nil, 'websocket server not respond'
|
44
|
+
assert res3["time"] == post_data[:time]
|
45
|
+
assert res3["msg"] == post_data[:msg]
|
46
|
+
assert res2 == nil, 'channel error'
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
data/test/test_helper.rb
CHANGED
@@ -0,0 +1,49 @@
|
|
1
|
+
require File.expand_path 'test_helper', File.dirname(__FILE__)
|
2
|
+
|
3
|
+
class TestPushMultiClient < MiniTest::Unit::TestCase
|
4
|
+
|
5
|
+
def test_push_multi
|
6
|
+
## client1(comet) --> server --> client2(comet) & client3(websocket)
|
7
|
+
post_data = {:time => Time.now.to_s, :msg => 'hello!!', :to => nil}
|
8
|
+
res = nil
|
9
|
+
res2 = nil
|
10
|
+
res3 = nil
|
11
|
+
client = Sinatra::RocketIO::Client.new(App.url, :type => :comet).connect
|
12
|
+
client.on :message do |data|
|
13
|
+
res = data
|
14
|
+
end
|
15
|
+
|
16
|
+
client.on :connect do
|
17
|
+
client2 = Sinatra::RocketIO::Client.new(App.url, :type => :comet).connect
|
18
|
+
client2.on :connect do
|
19
|
+
client3 = Sinatra::RocketIO::Client.new(App.url, :type => :websocket).connect
|
20
|
+
client3.on :connect do
|
21
|
+
post_data[:to] = [client2.session, client3.session]
|
22
|
+
client.push :message, post_data
|
23
|
+
end
|
24
|
+
client3.on :message do |data|
|
25
|
+
res3 = data
|
26
|
+
client3.close
|
27
|
+
end
|
28
|
+
end
|
29
|
+
client2.on :message do |data|
|
30
|
+
res2 = data
|
31
|
+
client2.close
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
50.times do
|
36
|
+
break if res2 != nil and res3 != nil
|
37
|
+
sleep 0.1
|
38
|
+
end
|
39
|
+
client.close
|
40
|
+
assert res2 != nil, 'server not respond'
|
41
|
+
assert res2["time"] == post_data[:time]
|
42
|
+
assert res2["msg"] == post_data[:msg]
|
43
|
+
assert res3 != nil, 'server not respond'
|
44
|
+
assert res3["time"] == post_data[:time]
|
45
|
+
assert res3["msg"] == post_data[:msg]
|
46
|
+
assert res == nil
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
data/test/test_rocketio.rb
CHANGED
@@ -2,14 +2,6 @@ require File.expand_path 'test_helper', File.dirname(__FILE__)
|
|
2
2
|
|
3
3
|
class TestRocketIO < MiniTest::Unit::TestCase
|
4
4
|
|
5
|
-
def setup
|
6
|
-
App.start
|
7
|
-
end
|
8
|
-
|
9
|
-
def teardown
|
10
|
-
App.stop
|
11
|
-
end
|
12
|
-
|
13
5
|
def test_websocket_to_comet
|
14
6
|
## websocket --> server --> comet
|
15
7
|
post_data = {:time => Time.now.to_s, :msg => 'hello!!', :to => nil}
|
@@ -20,10 +12,10 @@ class TestRocketIO < MiniTest::Unit::TestCase
|
|
20
12
|
res = data
|
21
13
|
end
|
22
14
|
|
23
|
-
client.on :connect do
|
15
|
+
client.on :connect do
|
24
16
|
client2 = Sinatra::RocketIO::Client.new(App.url, :type => :comet).connect
|
25
|
-
client2.on :connect do
|
26
|
-
post_data['to'] =
|
17
|
+
client2.on :connect do
|
18
|
+
post_data['to'] = client2.session
|
27
19
|
client.push :message, post_data
|
28
20
|
end
|
29
21
|
client2.on :message do |data|
|
@@ -34,7 +26,7 @@ class TestRocketIO < MiniTest::Unit::TestCase
|
|
34
26
|
end
|
35
27
|
|
36
28
|
50.times do
|
37
|
-
break if
|
29
|
+
break if res2 != nil
|
38
30
|
sleep 0.1
|
39
31
|
end
|
40
32
|
client.close
|
@@ -54,10 +46,10 @@ class TestRocketIO < MiniTest::Unit::TestCase
|
|
54
46
|
res = data
|
55
47
|
end
|
56
48
|
|
57
|
-
client.on :connect do
|
49
|
+
client.on :connect do
|
58
50
|
client2 = Sinatra::RocketIO::Client.new(App.url, :type => :websocket).connect
|
59
|
-
client2.on :connect do
|
60
|
-
post_data['to'] =
|
51
|
+
client2.on :connect do
|
52
|
+
post_data['to'] = client2.session
|
61
53
|
client.push :message, post_data
|
62
54
|
end
|
63
55
|
client2.on :message do |data|
|
@@ -68,7 +60,7 @@ class TestRocketIO < MiniTest::Unit::TestCase
|
|
68
60
|
end
|
69
61
|
|
70
62
|
50.times do
|
71
|
-
break if
|
63
|
+
break if res2 != nil
|
72
64
|
sleep 0.1
|
73
65
|
end
|
74
66
|
client.close
|
data/test/test_settings.rb
CHANGED
@@ -2,14 +2,6 @@ require File.expand_path 'test_helper', File.dirname(__FILE__)
|
|
2
2
|
|
3
3
|
class TestSettingsIO < MiniTest::Unit::TestCase
|
4
4
|
|
5
|
-
def setup
|
6
|
-
App.start
|
7
|
-
end
|
8
|
-
|
9
|
-
def teardown
|
10
|
-
App.stop
|
11
|
-
end
|
12
|
-
|
13
5
|
def test_settings
|
14
6
|
res = JSON.parse HTTParty.get("#{App.url}/rocketio/settings").body
|
15
7
|
assert App.websocketio_url == res['websocket']
|
metadata
CHANGED
@@ -1,20 +1,18 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sinatra-rocketio
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.2.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Sho Hashimoto
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2013-03-
|
11
|
+
date: 2013-03-31 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: bundler
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
17
|
- - ~>
|
20
18
|
- !ruby/object:Gem::Version
|
@@ -22,7 +20,6 @@ dependencies:
|
|
22
20
|
type: :development
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
24
|
- - ~>
|
28
25
|
- !ruby/object:Gem::Version
|
@@ -30,195 +27,185 @@ dependencies:
|
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: rake
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
|
-
- -
|
31
|
+
- - '>='
|
36
32
|
- !ruby/object:Gem::Version
|
37
33
|
version: '0'
|
38
34
|
type: :development
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
|
-
- -
|
38
|
+
- - '>='
|
44
39
|
- !ruby/object:Gem::Version
|
45
40
|
version: '0'
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: minitest
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
|
-
- -
|
45
|
+
- - '>='
|
52
46
|
- !ruby/object:Gem::Version
|
53
47
|
version: '0'
|
54
48
|
type: :development
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
|
-
- -
|
52
|
+
- - '>='
|
60
53
|
- !ruby/object:Gem::Version
|
61
54
|
version: '0'
|
62
55
|
- !ruby/object:Gem::Dependency
|
63
56
|
name: thin
|
64
57
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
58
|
requirements:
|
67
|
-
- -
|
59
|
+
- - '>='
|
68
60
|
- !ruby/object:Gem::Version
|
69
61
|
version: '0'
|
70
62
|
type: :development
|
71
63
|
prerelease: false
|
72
64
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
65
|
requirements:
|
75
|
-
- -
|
66
|
+
- - '>='
|
76
67
|
- !ruby/object:Gem::Version
|
77
68
|
version: '0'
|
78
69
|
- !ruby/object:Gem::Dependency
|
79
70
|
name: haml
|
80
71
|
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
72
|
requirements:
|
83
|
-
- -
|
73
|
+
- - '>='
|
84
74
|
- !ruby/object:Gem::Version
|
85
75
|
version: '0'
|
86
76
|
type: :development
|
87
77
|
prerelease: false
|
88
78
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
79
|
requirements:
|
91
|
-
- -
|
80
|
+
- - '>='
|
92
81
|
- !ruby/object:Gem::Version
|
93
82
|
version: '0'
|
94
83
|
- !ruby/object:Gem::Dependency
|
95
84
|
name: sass
|
96
85
|
requirement: !ruby/object:Gem::Requirement
|
97
|
-
none: false
|
98
86
|
requirements:
|
99
|
-
- -
|
87
|
+
- - '>='
|
100
88
|
- !ruby/object:Gem::Version
|
101
89
|
version: '0'
|
102
90
|
type: :development
|
103
91
|
prerelease: false
|
104
92
|
version_requirements: !ruby/object:Gem::Requirement
|
105
|
-
none: false
|
106
93
|
requirements:
|
107
|
-
- -
|
94
|
+
- - '>='
|
108
95
|
- !ruby/object:Gem::Version
|
109
96
|
version: '0'
|
110
97
|
- !ruby/object:Gem::Dependency
|
111
98
|
name: httparty
|
112
99
|
requirement: !ruby/object:Gem::Requirement
|
113
|
-
none: false
|
114
100
|
requirements:
|
115
|
-
- -
|
101
|
+
- - '>='
|
116
102
|
- !ruby/object:Gem::Version
|
117
103
|
version: '0'
|
118
104
|
type: :development
|
119
105
|
prerelease: false
|
120
106
|
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
none: false
|
122
107
|
requirements:
|
123
|
-
- -
|
108
|
+
- - '>='
|
124
109
|
- !ruby/object:Gem::Version
|
125
110
|
version: '0'
|
126
111
|
- !ruby/object:Gem::Dependency
|
127
112
|
name: json
|
128
113
|
requirement: !ruby/object:Gem::Requirement
|
129
|
-
none: false
|
130
114
|
requirements:
|
131
|
-
- -
|
115
|
+
- - '>='
|
132
116
|
- !ruby/object:Gem::Version
|
133
117
|
version: '0'
|
134
118
|
type: :development
|
135
119
|
prerelease: false
|
136
120
|
version_requirements: !ruby/object:Gem::Requirement
|
137
|
-
none: false
|
138
121
|
requirements:
|
139
|
-
- -
|
122
|
+
- - '>='
|
140
123
|
- !ruby/object:Gem::Version
|
141
124
|
version: '0'
|
142
125
|
- !ruby/object:Gem::Dependency
|
143
126
|
name: sinatra-cometio
|
144
127
|
requirement: !ruby/object:Gem::Requirement
|
145
|
-
none: false
|
146
128
|
requirements:
|
147
|
-
- -
|
129
|
+
- - '>='
|
148
130
|
- !ruby/object:Gem::Version
|
149
|
-
version: 0.4.
|
131
|
+
version: 0.4.3
|
150
132
|
type: :runtime
|
151
133
|
prerelease: false
|
152
134
|
version_requirements: !ruby/object:Gem::Requirement
|
153
|
-
none: false
|
154
135
|
requirements:
|
155
|
-
- -
|
136
|
+
- - '>='
|
156
137
|
- !ruby/object:Gem::Version
|
157
|
-
version: 0.4.
|
138
|
+
version: 0.4.3
|
158
139
|
- !ruby/object:Gem::Dependency
|
159
140
|
name: sinatra-websocketio
|
160
141
|
requirement: !ruby/object:Gem::Requirement
|
161
|
-
none: false
|
162
142
|
requirements:
|
163
|
-
- -
|
143
|
+
- - '>='
|
164
144
|
- !ruby/object:Gem::Version
|
165
|
-
version: 0.2.
|
145
|
+
version: 0.2.2
|
166
146
|
type: :runtime
|
167
147
|
prerelease: false
|
168
148
|
version_requirements: !ruby/object:Gem::Requirement
|
169
|
-
none: false
|
170
149
|
requirements:
|
171
|
-
- -
|
150
|
+
- - '>='
|
172
151
|
- !ruby/object:Gem::Version
|
173
|
-
version: 0.2.
|
152
|
+
version: 0.2.2
|
174
153
|
- !ruby/object:Gem::Dependency
|
175
154
|
name: sinatra
|
176
155
|
requirement: !ruby/object:Gem::Requirement
|
177
|
-
none: false
|
178
156
|
requirements:
|
179
|
-
- -
|
157
|
+
- - '>='
|
180
158
|
- !ruby/object:Gem::Version
|
181
159
|
version: '0'
|
182
160
|
type: :runtime
|
183
161
|
prerelease: false
|
184
162
|
version_requirements: !ruby/object:Gem::Requirement
|
185
|
-
none: false
|
186
163
|
requirements:
|
187
|
-
- -
|
164
|
+
- - '>='
|
188
165
|
- !ruby/object:Gem::Version
|
189
166
|
version: '0'
|
190
167
|
- !ruby/object:Gem::Dependency
|
191
168
|
name: eventmachine
|
192
169
|
requirement: !ruby/object:Gem::Requirement
|
193
|
-
none: false
|
194
170
|
requirements:
|
195
|
-
- -
|
171
|
+
- - '>='
|
196
172
|
- !ruby/object:Gem::Version
|
197
173
|
version: 1.0.0
|
198
174
|
type: :runtime
|
199
175
|
prerelease: false
|
200
176
|
version_requirements: !ruby/object:Gem::Requirement
|
201
|
-
none: false
|
202
177
|
requirements:
|
203
|
-
- -
|
178
|
+
- - '>='
|
204
179
|
- !ruby/object:Gem::Version
|
205
180
|
version: 1.0.0
|
206
181
|
- !ruby/object:Gem::Dependency
|
207
182
|
name: event_emitter
|
208
183
|
requirement: !ruby/object:Gem::Requirement
|
209
|
-
none: false
|
210
184
|
requirements:
|
211
|
-
- -
|
185
|
+
- - '>='
|
212
186
|
- !ruby/object:Gem::Version
|
213
187
|
version: 0.2.4
|
214
188
|
type: :runtime
|
215
189
|
prerelease: false
|
216
190
|
version_requirements: !ruby/object:Gem::Requirement
|
217
|
-
none: false
|
218
191
|
requirements:
|
219
|
-
- -
|
192
|
+
- - '>='
|
220
193
|
- !ruby/object:Gem::Version
|
221
194
|
version: 0.2.4
|
195
|
+
- !ruby/object:Gem::Dependency
|
196
|
+
name: hashie
|
197
|
+
requirement: !ruby/object:Gem::Requirement
|
198
|
+
requirements:
|
199
|
+
- - '>='
|
200
|
+
- !ruby/object:Gem::Version
|
201
|
+
version: '0'
|
202
|
+
type: :runtime
|
203
|
+
prerelease: false
|
204
|
+
version_requirements: !ruby/object:Gem::Requirement
|
205
|
+
requirements:
|
206
|
+
- - '>='
|
207
|
+
- !ruby/object:Gem::Version
|
208
|
+
version: '0'
|
222
209
|
description: WebSocket/Comet IO plugin for Sinatra
|
223
210
|
email:
|
224
211
|
- hashimoto@shokai.org
|
@@ -236,6 +223,8 @@ files:
|
|
236
223
|
- lib/js/rocketio.js
|
237
224
|
- lib/sinatra-rocketio.rb
|
238
225
|
- lib/sinatra-rocketio/application.rb
|
226
|
+
- lib/sinatra-rocketio/channel.rb
|
227
|
+
- lib/sinatra-rocketio/client_info.rb
|
239
228
|
- lib/sinatra-rocketio/helpers.rb
|
240
229
|
- lib/sinatra-rocketio/javascript.rb
|
241
230
|
- lib/sinatra-rocketio/options.rb
|
@@ -247,50 +236,47 @@ files:
|
|
247
236
|
- sample/bin/cui_chat_client.rb
|
248
237
|
- sample/config.ru
|
249
238
|
- sample/main.rb
|
250
|
-
- sample/public/js/
|
251
|
-
- sample/views/
|
239
|
+
- sample/public/js/chat.js
|
240
|
+
- sample/views/chat.haml
|
252
241
|
- sample/views/main.scss
|
253
242
|
- sinatra-rocketio.gemspec
|
254
243
|
- test/app.rb
|
255
244
|
- test/app/config.ru
|
256
245
|
- test/app/main.rb
|
246
|
+
- test/test_channel.rb
|
257
247
|
- test/test_helper.rb
|
248
|
+
- test/test_push_multi_client.rb
|
258
249
|
- test/test_rocketio.rb
|
259
250
|
- test/test_settings.rb
|
260
251
|
homepage: https://github.com/shokai/sinatra-rocketio
|
261
252
|
licenses: []
|
253
|
+
metadata: {}
|
262
254
|
post_install_message:
|
263
255
|
rdoc_options: []
|
264
256
|
require_paths:
|
265
257
|
- lib
|
266
258
|
required_ruby_version: !ruby/object:Gem::Requirement
|
267
|
-
none: false
|
268
259
|
requirements:
|
269
|
-
- -
|
260
|
+
- - '>='
|
270
261
|
- !ruby/object:Gem::Version
|
271
262
|
version: '0'
|
272
|
-
segments:
|
273
|
-
- 0
|
274
|
-
hash: 1593017263457838199
|
275
263
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
276
|
-
none: false
|
277
264
|
requirements:
|
278
|
-
- -
|
265
|
+
- - '>='
|
279
266
|
- !ruby/object:Gem::Version
|
280
267
|
version: '0'
|
281
|
-
segments:
|
282
|
-
- 0
|
283
|
-
hash: 1593017263457838199
|
284
268
|
requirements: []
|
285
269
|
rubyforge_project:
|
286
|
-
rubygems_version:
|
270
|
+
rubygems_version: 2.0.3
|
287
271
|
signing_key:
|
288
|
-
specification_version:
|
272
|
+
specification_version: 4
|
289
273
|
summary: WebSocket/Comet IO plugin for Sinatra
|
290
274
|
test_files:
|
291
275
|
- test/app.rb
|
292
276
|
- test/app/config.ru
|
293
277
|
- test/app/main.rb
|
278
|
+
- test/test_channel.rb
|
294
279
|
- test/test_helper.rb
|
280
|
+
- test/test_push_multi_client.rb
|
295
281
|
- test/test_rocketio.rb
|
296
282
|
- test/test_settings.rb
|