sinatra-rocketio 0.2.6 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/History.txt +4 -0
- data/README.md +11 -19
- data/Rakefile +8 -8
- data/lib/sinatra-rocketio/client_info.rb +1 -1
- data/lib/sinatra-rocketio/rocketio.rb +4 -4
- data/lib/sinatra-rocketio/version.rb +1 -1
- data/rocketio.js +6 -5
- data/rocketio.min.js +3 -3
- data/sample/classic_style/config.ru +2 -4
- data/sample/modular_style/config.ru +2 -4
- data/sinatra-rocketio.gemspec +2 -2
- metadata +7 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4b79c54a4625daf478248080e3030bd3c616b6fa
|
4
|
+
data.tar.gz: fc17414c382d82e9d489c440ffa4b38aeafd5763
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 819632a1f9940f5d01249518dbde89b6e660ad6f9fb1973a1f5a2d0a3d728ea31f7a3fad1926de32c41a4f11588e84729e16ab7b578e4535ee460b7537dd2d3e
|
7
|
+
data.tar.gz: 729e355f593282179ff61436757cddd0449a66e371c3def725d416dd403c275d3bd07694c2350b52fc37fdda0730f06757c2ff2f90236bb0cb060837c0c6aab2
|
data/History.txt
CHANGED
data/README.md
CHANGED
@@ -4,7 +4,7 @@ sinatra-rocketio
|
|
4
4
|
* Node.js like I/O plugin for Sinatra.
|
5
5
|
* Automatically selects from Comet and WebSocket.
|
6
6
|
* https://github.com/shokai/sinatra-rocketio
|
7
|
-
* https://github.com/shokai/sinatra-rocketio/wiki
|
7
|
+
* [Wiki](https://github.com/shokai/sinatra-rocketio/wiki)
|
8
8
|
* [Handle 10K+ clients on 1 process](https://github.com/shokai/sinatra-websocketio/wiki/C10K)
|
9
9
|
|
10
10
|
|
@@ -40,8 +40,11 @@ run Sinatra::Application
|
|
40
40
|
```ruby
|
41
41
|
io = Sinatra::RocketIO
|
42
42
|
|
43
|
-
io.
|
44
|
-
|
43
|
+
io.on :connect do |client|
|
44
|
+
puts "new client available - <#{client.session}> type:#{client.type} from:#{client.address}"
|
45
|
+
io.push :temperature, 35 # to all clients
|
46
|
+
io.push :light, {:value => 150}, {:to => client.session} # to specific client
|
47
|
+
end
|
45
48
|
```
|
46
49
|
|
47
50
|
Client Side
|
@@ -76,7 +79,7 @@ Server Side
|
|
76
79
|
|
77
80
|
```ruby
|
78
81
|
io.on :chat do |data, client|
|
79
|
-
puts "#{data['name']} : #{data['message']} <#{client.session}> type:#{client.type}"
|
82
|
+
puts "#{data['name']} : #{data['message']} <#{client.session}> type:#{client.type} address:#{client.address}"
|
80
83
|
end
|
81
84
|
## => "shokai : hello <12abcde345f6g7h8ijk> type:websocket"
|
82
85
|
```
|
@@ -95,7 +98,7 @@ Server Side
|
|
95
98
|
|
96
99
|
```ruby
|
97
100
|
io.on :connect do |client|
|
98
|
-
puts "new client <#{client.session}> type:#{client.type}"
|
101
|
+
puts "new client <#{client.session}> type:#{client.type} address:#{client.address}"
|
99
102
|
io.push :hello, "hello new client!!"
|
100
103
|
end
|
101
104
|
|
@@ -194,20 +197,9 @@ configure with ENV variables.
|
|
194
197
|
disable comet and enable websocket on port 9000.
|
195
198
|
|
196
199
|
|
197
|
-
Sample
|
198
|
-
|
199
|
-
|
200
|
-
### hello world
|
201
|
-
- https://github.com/shokai/rocketio-hello-world
|
202
|
-
|
203
|
-
|
204
|
-
### chat app
|
205
|
-
- https://github.com/shokai/sinatra-rocketio/tree/master/sample
|
206
|
-
- https://github.com/shokai/rocketio-chat-sample
|
207
|
-
|
208
|
-
|
209
|
-
### arduino integration
|
210
|
-
- https://github.com/shokai/rocketio-arduino-sample
|
200
|
+
Sample Apps
|
201
|
+
-----------
|
202
|
+
- https://github.com/shokai/sinatra-rocketio/wiki/Sample-Apps
|
211
203
|
|
212
204
|
|
213
205
|
JavaScript Lib for browser
|
data/Rakefile
CHANGED
@@ -5,6 +5,14 @@ Rake::TestTask.new do |t|
|
|
5
5
|
t.pattern = "test/test_*.rb"
|
6
6
|
end
|
7
7
|
|
8
|
+
desc "Start test server"
|
9
|
+
task :test_server do
|
10
|
+
require File.expand_path 'test/app', File.dirname(__FILE__)
|
11
|
+
App.start
|
12
|
+
end
|
13
|
+
|
14
|
+
task :default => :test
|
15
|
+
|
8
16
|
desc "generate JavaScript lib for browser"
|
9
17
|
task :jslib do
|
10
18
|
dest = "rocketio.js"
|
@@ -32,11 +40,3 @@ task :jslib do
|
|
32
40
|
system "uglifyjs #{dest} >> #{dest_min}"
|
33
41
|
puts " => #{dest_min}"
|
34
42
|
end
|
35
|
-
|
36
|
-
desc "Start test server"
|
37
|
-
task :test_server do
|
38
|
-
require File.expand_path 'test/app', File.dirname(__FILE__)
|
39
|
-
App.start
|
40
|
-
end
|
41
|
-
|
42
|
-
task :default => :test
|
@@ -39,9 +39,9 @@ Sinatra::RocketIO.once :start do
|
|
39
39
|
Sinatra::CometIO.on :* do |event_name, *args|
|
40
40
|
event_name = :__connect if event_name == :connect
|
41
41
|
if args.size > 1
|
42
|
-
Sinatra::RocketIO.emit event_name, args[0], Sinatra::RocketIO::ClientInfo.new(:session => args[1], :channel => Sinatra::RocketIO.channels[args[1]], :type => :comet)
|
42
|
+
Sinatra::RocketIO.emit event_name, args[0], Sinatra::RocketIO::ClientInfo.new(:session => args[1], :address => sessions[args[1]][:remote_addr], :channel => Sinatra::RocketIO.channels[args[1]], :type => :comet)
|
43
43
|
else
|
44
|
-
Sinatra::RocketIO.emit event_name, Sinatra::RocketIO::ClientInfo.new(:session => args[0], :channel => Sinatra::RocketIO.channels[args[0]], :type => :comet)
|
44
|
+
Sinatra::RocketIO.emit event_name, Sinatra::RocketIO::ClientInfo.new(:session => args[0], :address => sessions[args[0]][:remote_addr], :channel => Sinatra::RocketIO.channels[args[0]], :type => :comet)
|
45
45
|
end
|
46
46
|
end
|
47
47
|
end
|
@@ -49,9 +49,9 @@ Sinatra::RocketIO.once :start do
|
|
49
49
|
Sinatra::WebSocketIO.on :* do |event_name, *args|
|
50
50
|
event_name = :__connect if event_name == :connect
|
51
51
|
if args.size > 1
|
52
|
-
Sinatra::RocketIO.emit event_name, args[0], Sinatra::RocketIO::ClientInfo.new(:session => args[1], :channel => Sinatra::RocketIO.channels[args[1]], :type => :websocket)
|
52
|
+
Sinatra::RocketIO.emit event_name, args[0], Sinatra::RocketIO::ClientInfo.new(:session => args[1], :address => sessions[args[1]][:remote_addr], :channel => Sinatra::RocketIO.channels[args[1]], :type => :websocket)
|
53
53
|
else
|
54
|
-
Sinatra::RocketIO.emit event_name, Sinatra::RocketIO::ClientInfo.new(:session => args[0], :channel => Sinatra::RocketIO.channels[args[0]], :type => :websocket)
|
54
|
+
Sinatra::RocketIO.emit event_name, Sinatra::RocketIO::ClientInfo.new(:session => args[0], :address => sessions[args[0]][:remote_addr], :channel => Sinatra::RocketIO.channels[args[0]], :type => :websocket)
|
55
55
|
end
|
56
56
|
end
|
57
57
|
end
|
data/rocketio.js
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
// RocketIO.js v0.2.
|
1
|
+
// RocketIO.js v0.2.6 (websocketio:v0.3.3, cometio:v0.5.8)
|
2
2
|
// https://github.com/shokai/sinatra-rocketio
|
3
|
-
// (c)
|
3
|
+
// (c) 2013 Sho Hashimoto <hashimoto@shokai.org>
|
4
4
|
// The MIT License
|
5
5
|
var RocketIO = function(opts){
|
6
6
|
new EventEmitter().apply(this);
|
@@ -148,7 +148,7 @@ var CometIO = function(url, opts){
|
|
148
148
|
if(!running) return;
|
149
149
|
$.ajax(
|
150
150
|
{
|
151
|
-
url : self.url,
|
151
|
+
url : self.url+"?"+(new Date()-0),
|
152
152
|
data : {session : self.session},
|
153
153
|
success : function(data_arr){
|
154
154
|
if(data_arr !== null && typeof data_arr == "object" && !!data_arr.length){
|
@@ -198,13 +198,14 @@ var WebSocketIO = function(url, opts){
|
|
198
198
|
var url = self.session ? self.url+"/session="+self.session : self.url;
|
199
199
|
self.websocket = new WebSocket(url);
|
200
200
|
self.websocket.onmessage = function(e){
|
201
|
+
var data_ = null;
|
201
202
|
try{
|
202
|
-
|
203
|
-
self.emit(data_.type, data_.data);
|
203
|
+
data_ = JSON.parse(e.data);
|
204
204
|
}
|
205
205
|
catch(e){
|
206
206
|
self.emit("error", "WebSocketIO data parse error");
|
207
207
|
}
|
208
|
+
if(!!data_) self.emit(data_.type, data_.data);
|
208
209
|
};
|
209
210
|
self.websocket.onclose = function(){
|
210
211
|
if(self.connecting){
|
data/rocketio.min.js
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
// RocketIO.js v0.2.
|
1
|
+
// RocketIO.js v0.2.6 (websocketio:v0.3.3, cometio:v0.5.8)
|
2
2
|
// https://github.com/shokai/sinatra-rocketio
|
3
|
-
// (c)
|
3
|
+
// (c) 2013 Sho Hashimoto <hashimoto@shokai.org>
|
4
4
|
// The MIT License
|
5
|
-
var RocketIO=function(opts){(new EventEmitter).apply(this);if(typeof opts==="undefined"||opts===null)opts={};this.type=opts.type||null;this.session=opts.session||null;this.channel=null;if(typeof opts.channel!=="undefined"&&opts.channel!==null){this.channel=""+opts.channel}var setting={};this.io=null;var self=this;var ws_close_timer=null;self.on("__connect",function(session_id){self.session=session_id;self.io.push("__channel_id",self.channel);self.emit("connect")});this.connect=function(url){if(typeof url==="string"){$.getJSON(url+"/rocketio/settings",function(res){setting=res;connect_io()});return self}else{return connect_io()}};var connect_io=function(){self.io=function(){if(self.type==="comet")return;if(typeof WebSocketIO!=="function")return;var io=new WebSocketIO;if(typeof setting.websocket==="string")io.url=setting.websocket;io.session=self.session;return io.connect()}()||function(){if(typeof CometIO!=="function")return;var io=new CometIO;if(typeof setting.comet==="string")io.url=setting.comet;io.session=self.session;return io.connect()}();if(typeof self.io==="undefined"){setTimeout(function(){self.emit("error","WebSocketIO and CometIO are not available")},100);return self}if(self.io.url.match(/^ws:\/\/.+/))self.type="websocket";else if(self.io.url.match(/cometio/))self.type="comet";else self.type="unknown";self.io.on("*",function(event_name,args){if(event_name==="connect")event_name="__connect";self.emit(event_name,args)});ws_close_timer=setTimeout(function(){self.close();self.type="comet";connect_io()},3e3);self.once("connect",function(){if(ws_close_timer)clearTimeout(ws_close_timer);ws_close_timer=null});return self};this.close=function(){self.io.close()};this.push=function(type,data){self.io.push(type,data)}};var CometIO=function(url,opts){(new EventEmitter).apply(this);if(typeof opts==="undefined"||opts===null)opts={};this.url=url||"";this.session=opts.session||null;var running=false;var self=this;var post_queue=[];var flush=function(){if(!running||post_queue.length<1)return;var post_data={json:JSON.stringify({session:self.session,events:post_queue})};$.ajax({url:self.url,data:post_data,success:function(data){},error:function(req,stat,e){self.emit("error","CometIO push error")},complete:function(e){},type:"POST",dataType:"json",timeout:1e4});post_queue=[]};setInterval(flush,1e3);this.push=function(type,data){if(!running||!self.session){self.emit("error","CometIO not connected");return}post_queue.push({type:type,data:data})};this.connect=function(){if(running)return self;self.on("__session_id",function(session){self.session=session;self.emit("connect",self.session)});running=true;get();return self};this.close=function(){running=false;self.removeListener("__session_id")};var get=function(){if(!running)return;$.ajax({url:self.url,data:{session:self.session},success:function(data_arr){if(data_arr!==null&&typeof data_arr=="object"&&!!data_arr.length){for(var i=0;i<data_arr.length;i++){var data=data_arr[i];if(data)self.emit(data.type,data.data)}}get()},error:function(req,stat,e){self.emit("error","CometIO get error");setTimeout(get,1e4)},complete:function(e){},type:"GET",dataType:"json",timeout:13e4})}};var WebSocketIO=function(url,opts){(new EventEmitter).apply(this);if(typeof opts==="undefined"||opts===null)opts={};this.url=url||"";this.session=opts.session||null;this.websocket=null;this.connecting=false;var reconnect_timer_id=null;var running=false;var self=this;self.on("__session_id",function(session_id){self.session=session_id;self.emit("connect",self.session)});this.connect=function(){if(typeof WebSocket==="undefined"){self.emit("error","websocket not exists in this browser");return null}self.running=true;var url=self.session?self.url+"/session="+self.session:self.url;self.websocket=new WebSocket(url);self.websocket.onmessage=function(e){
|
5
|
+
var RocketIO=function(opts){(new EventEmitter).apply(this);if(typeof opts==="undefined"||opts===null)opts={};this.type=opts.type||null;this.session=opts.session||null;this.channel=null;if(typeof opts.channel!=="undefined"&&opts.channel!==null){this.channel=""+opts.channel}var setting={};this.io=null;var self=this;var ws_close_timer=null;self.on("__connect",function(session_id){self.session=session_id;self.io.push("__channel_id",self.channel);self.emit("connect")});this.connect=function(url){if(typeof url==="string"){$.getJSON(url+"/rocketio/settings",function(res){setting=res;connect_io()});return self}else{return connect_io()}};var connect_io=function(){self.io=function(){if(self.type==="comet")return;if(typeof WebSocketIO!=="function")return;var io=new WebSocketIO;if(typeof setting.websocket==="string")io.url=setting.websocket;io.session=self.session;return io.connect()}()||function(){if(typeof CometIO!=="function")return;var io=new CometIO;if(typeof setting.comet==="string")io.url=setting.comet;io.session=self.session;return io.connect()}();if(typeof self.io==="undefined"){setTimeout(function(){self.emit("error","WebSocketIO and CometIO are not available")},100);return self}if(self.io.url.match(/^ws:\/\/.+/))self.type="websocket";else if(self.io.url.match(/cometio/))self.type="comet";else self.type="unknown";self.io.on("*",function(event_name,args){if(event_name==="connect")event_name="__connect";self.emit(event_name,args)});ws_close_timer=setTimeout(function(){self.close();self.type="comet";connect_io()},3e3);self.once("connect",function(){if(ws_close_timer)clearTimeout(ws_close_timer);ws_close_timer=null});return self};this.close=function(){self.io.close()};this.push=function(type,data){self.io.push(type,data)}};var CometIO=function(url,opts){(new EventEmitter).apply(this);if(typeof opts==="undefined"||opts===null)opts={};this.url=url||"";this.session=opts.session||null;var running=false;var self=this;var post_queue=[];var flush=function(){if(!running||post_queue.length<1)return;var post_data={json:JSON.stringify({session:self.session,events:post_queue})};$.ajax({url:self.url,data:post_data,success:function(data){},error:function(req,stat,e){self.emit("error","CometIO push error")},complete:function(e){},type:"POST",dataType:"json",timeout:1e4});post_queue=[]};setInterval(flush,1e3);this.push=function(type,data){if(!running||!self.session){self.emit("error","CometIO not connected");return}post_queue.push({type:type,data:data})};this.connect=function(){if(running)return self;self.on("__session_id",function(session){self.session=session;self.emit("connect",self.session)});running=true;get();return self};this.close=function(){running=false;self.removeListener("__session_id")};var get=function(){if(!running)return;$.ajax({url:self.url+"?"+(new Date-0),data:{session:self.session},success:function(data_arr){if(data_arr!==null&&typeof data_arr=="object"&&!!data_arr.length){for(var i=0;i<data_arr.length;i++){var data=data_arr[i];if(data)self.emit(data.type,data.data)}}get()},error:function(req,stat,e){self.emit("error","CometIO get error");setTimeout(get,1e4)},complete:function(e){},type:"GET",dataType:"json",timeout:13e4})}};var WebSocketIO=function(url,opts){(new EventEmitter).apply(this);if(typeof opts==="undefined"||opts===null)opts={};this.url=url||"";this.session=opts.session||null;this.websocket=null;this.connecting=false;var reconnect_timer_id=null;var running=false;var self=this;self.on("__session_id",function(session_id){self.session=session_id;self.emit("connect",self.session)});this.connect=function(){if(typeof WebSocket==="undefined"){self.emit("error","websocket not exists in this browser");return null}self.running=true;var url=self.session?self.url+"/session="+self.session:self.url;self.websocket=new WebSocket(url);self.websocket.onmessage=function(e){var data_=null;try{data_=JSON.parse(e.data)}catch(e){self.emit("error","WebSocketIO data parse error")}if(!!data_)self.emit(data_.type,data_.data)};self.websocket.onclose=function(){if(self.connecting){self.connecting=false;self.emit("disconnect")}if(self.running){reconnect_timer_id=setTimeout(self.connect,1e4)}};self.websocket.onopen=function(){self.connecting=true};return self};this.close=function(){clearTimeout(reconnect_timer_id);self.running=false;self.websocket.close()};this.push=function(type,data){if(!self.connecting){self.emit("error","websocket not connected");return}self.websocket.send(JSON.stringify({type:type,data:data,session:self.session}))}};var EventEmitter=function(){var self=this;this.apply=function(target,prefix){if(!prefix)prefix="";for(var func in self){if(self.hasOwnProperty(func)&&func!=="apply"){target[prefix+func]=this[func]}}};this.__events=new Array;this.on=function(type,listener,opts){if(typeof listener!=="function")return;var event_id=self.__events.length>0?1+self.__events[self.__events.length-1].id:0;var params={id:event_id,type:type,listener:listener};for(i in opts){if(!params[i])params[i]=opts[i]}self.__events.push(params);return event_id};this.once=function(type,listener){self.on(type,listener,{once:true})};this.emit=function(type,data){for(var i=0;i<self.__events.length;i++){var e=self.__events[i];switch(e.type){case type:e.listener(data);if(e.once)e.type=null;break;case"*":e.listener(type,data);if(e.once)e.type=null;break}}self.removeListener()};this.removeListener=function(id_or_type){for(var i=self.__events.length-1;i>=0;i--){var e=self.__events[i];switch(typeof id_or_type){case"number":if(e.id===id_or_type)self.__events.splice(i,1);break;case"string":case"object":if(e.type===id_or_type)self.__events.splice(i,1);break}}}};if(typeof module!=="undefined"&&typeof module.exports!=="undefined"){module.exports=EventEmitter}
|
@@ -1,11 +1,9 @@
|
|
1
1
|
require 'rubygems'
|
2
|
-
|
3
|
-
Bundler.require
|
2
|
+
$:.unshift File.expand_path '../../lib', File.dirname(__FILE__)
|
4
3
|
require 'sinatra'
|
5
4
|
if development?
|
6
5
|
$stdout.sync = true
|
7
6
|
require 'sinatra/reloader'
|
8
|
-
$:.unshift File.expand_path '../../lib', File.dirname(__FILE__)
|
9
7
|
end
|
10
8
|
require 'sinatra/rocketio'
|
11
9
|
require 'haml'
|
@@ -14,7 +12,7 @@ require File.dirname(__FILE__)+'/main'
|
|
14
12
|
|
15
13
|
set :haml, :escape_html => true
|
16
14
|
set :cometio, :timeout => 120, :post_interval => 2, :allow_crossdomain => true
|
17
|
-
set :websocketio, :port => (ENV['WS_PORT'] ||
|
15
|
+
set :websocketio, :port => (ENV['WS_PORT'] || 9000).to_i
|
18
16
|
set :rocketio, :comet => true, :websocket => true
|
19
17
|
|
20
18
|
case RUBY_PLATFORM
|
@@ -1,12 +1,10 @@
|
|
1
1
|
require 'rubygems'
|
2
|
-
|
3
|
-
Bundler.require
|
2
|
+
$:.unshift File.expand_path '../../lib', File.dirname(__FILE__)
|
4
3
|
require 'sinatra'
|
5
4
|
require 'sinatra/base'
|
6
5
|
if development?
|
7
6
|
$stdout.sync = true
|
8
7
|
require 'sinatra/reloader'
|
9
|
-
$:.unshift File.expand_path '../../lib', File.dirname(__FILE__)
|
10
8
|
end
|
11
9
|
require 'sinatra/rocketio'
|
12
10
|
require 'haml'
|
@@ -15,7 +13,7 @@ require File.dirname(__FILE__)+'/main'
|
|
15
13
|
|
16
14
|
set :haml, :escape_html => true
|
17
15
|
set :cometio, :timeout => 120, :post_interval => 2, :allow_crossdomain => true
|
18
|
-
set :websocketio, :port => (ENV['WS_PORT'] ||
|
16
|
+
set :websocketio, :port => (ENV['WS_PORT'] || 9000).to_i
|
19
17
|
set :rocketio, :comet => true, :websocket => true
|
20
18
|
|
21
19
|
case RUBY_PLATFORM
|
data/sinatra-rocketio.gemspec
CHANGED
@@ -25,8 +25,8 @@ 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.5.
|
29
|
-
gem.add_dependency "sinatra-websocketio", ">= 0.3.
|
28
|
+
gem.add_dependency "sinatra-cometio", ">= 0.5.9"
|
29
|
+
gem.add_dependency "sinatra-websocketio", ">= 0.3.7"
|
30
30
|
gem.add_dependency "sinatra"
|
31
31
|
gem.add_dependency "eventmachine", ">= 1.0.0"
|
32
32
|
gem.add_dependency "event_emitter", ">= 0.2.5"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sinatra-rocketio
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sho Hashimoto
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-10-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -128,28 +128,28 @@ dependencies:
|
|
128
128
|
requirements:
|
129
129
|
- - '>='
|
130
130
|
- !ruby/object:Gem::Version
|
131
|
-
version: 0.5.
|
131
|
+
version: 0.5.9
|
132
132
|
type: :runtime
|
133
133
|
prerelease: false
|
134
134
|
version_requirements: !ruby/object:Gem::Requirement
|
135
135
|
requirements:
|
136
136
|
- - '>='
|
137
137
|
- !ruby/object:Gem::Version
|
138
|
-
version: 0.5.
|
138
|
+
version: 0.5.9
|
139
139
|
- !ruby/object:Gem::Dependency
|
140
140
|
name: sinatra-websocketio
|
141
141
|
requirement: !ruby/object:Gem::Requirement
|
142
142
|
requirements:
|
143
143
|
- - '>='
|
144
144
|
- !ruby/object:Gem::Version
|
145
|
-
version: 0.3.
|
145
|
+
version: 0.3.7
|
146
146
|
type: :runtime
|
147
147
|
prerelease: false
|
148
148
|
version_requirements: !ruby/object:Gem::Requirement
|
149
149
|
requirements:
|
150
150
|
- - '>='
|
151
151
|
- !ruby/object:Gem::Version
|
152
|
-
version: 0.3.
|
152
|
+
version: 0.3.7
|
153
153
|
- !ruby/object:Gem::Dependency
|
154
154
|
name: sinatra
|
155
155
|
requirement: !ruby/object:Gem::Requirement
|
@@ -277,7 +277,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
277
277
|
version: '0'
|
278
278
|
requirements: []
|
279
279
|
rubyforge_project:
|
280
|
-
rubygems_version: 2.0.
|
280
|
+
rubygems_version: 2.0.5
|
281
281
|
signing_key:
|
282
282
|
specification_version: 4
|
283
283
|
summary: WebSocket/Comet IO plugin for Sinatra
|
@@ -290,4 +290,3 @@ test_files:
|
|
290
290
|
- test/test_push_multi_client.rb
|
291
291
|
- test/test_rocketio.rb
|
292
292
|
- test/test_settings.rb
|
293
|
-
has_rdoc:
|