sinatra-cometio 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +4 -0
- data/Manifest.txt +1 -4
- data/README.rdoc +5 -1
- data/Rakefile +2 -1
- data/lib/js/cometio.js +21 -1
- data/lib/sinatra-cometio.rb +1 -1
- data/lib/sinatra/application.rb +11 -8
- data/lib/sinatra/cometio.rb +47 -5
- data/sample/Gemfile.lock +1 -1
- data/sample/config.ru +1 -3
- data/sample/main.rb +25 -0
- data/sample/public/js/index.js +2 -1
- metadata +22 -9
- data/sample/bootstrap.rb +0 -14
- data/sample/controllers/css.rb +0 -3
- data/sample/controllers/main.rb +0 -18
- data/sample/helpers/helper.rb +0 -4
data/History.txt
CHANGED
data/Manifest.txt
CHANGED
@@ -15,11 +15,8 @@ sample/Gemfile
|
|
15
15
|
sample/Gemfile.lock
|
16
16
|
sample/Procfile
|
17
17
|
sample/README.md
|
18
|
-
sample/bootstrap.rb
|
19
18
|
sample/config.ru
|
20
|
-
sample/
|
21
|
-
sample/controllers/main.rb
|
22
|
-
sample/helpers/helper.rb
|
19
|
+
sample/main.rb
|
23
20
|
sample/public/js/index.js
|
24
21
|
sample/views/index.haml
|
25
22
|
sample/views/main.scss
|
data/README.rdoc
CHANGED
@@ -18,7 +18,8 @@ server
|
|
18
18
|
require 'sinatra/cometio'
|
19
19
|
|
20
20
|
## echo
|
21
|
-
CometIO.on :chat do |data|
|
21
|
+
CometIO.on :chat do |data, session|
|
22
|
+
puts "#{data['name']} : #{data['message']} <#{session}>"
|
22
23
|
self.push :chat, data
|
23
24
|
end
|
24
25
|
|
@@ -41,6 +42,9 @@ client JavaScript
|
|
41
42
|
// client --> server
|
42
43
|
io.push("chat", {name: "shokai", message: "hello"});
|
43
44
|
|
45
|
+
|
46
|
+
see sample app => http://cometio-chat.herokuapp.com
|
47
|
+
|
44
48
|
== REQUIREMENTS:
|
45
49
|
|
46
50
|
* Ruby 1.8.7+ or 1.9.2+
|
data/Rakefile
CHANGED
@@ -15,8 +15,9 @@ $hoe = Hoe.spec 'sinatra-cometio' do
|
|
15
15
|
self.rubyforge_name = self.name # TODO this is default value
|
16
16
|
self.extra_deps = [['sinatra','>= 1.3.3'],
|
17
17
|
['eventmachine', '>= 1.0.0'],
|
18
|
+
['json'],
|
18
19
|
['sinatra-contrib', '>= 1.3.2'],
|
19
|
-
['event_emitter', '>= 0.0
|
20
|
+
['event_emitter', '>= 0.1.0']]
|
20
21
|
|
21
22
|
end
|
22
23
|
|
data/lib/js/cometio.js
CHANGED
@@ -1,12 +1,31 @@
|
|
1
1
|
var CometIO = function(){
|
2
2
|
this.url = "<%= cometio_url %>";
|
3
|
+
this.session = null;
|
3
4
|
var self = this;
|
4
5
|
|
5
6
|
this.push = function(type, data){
|
6
|
-
$.
|
7
|
+
$.ajax(
|
8
|
+
{
|
9
|
+
url : self.url,
|
10
|
+
data : {type : type, data : data, session : self.session},
|
11
|
+
success : function(data){
|
12
|
+
},
|
13
|
+
error : function(req, stat, e){
|
14
|
+
},
|
15
|
+
complete : function(e){
|
16
|
+
},
|
17
|
+
type : "POST",
|
18
|
+
dataType : "json",
|
19
|
+
timeout : 10000
|
20
|
+
}
|
21
|
+
);
|
7
22
|
};
|
8
23
|
|
9
24
|
this.connect = function(){
|
25
|
+
self.on("set_session_id", function(session){
|
26
|
+
self.session = session;
|
27
|
+
self.emit("connect", self.session);
|
28
|
+
});
|
10
29
|
self.get();
|
11
30
|
return self;
|
12
31
|
};
|
@@ -15,6 +34,7 @@ var CometIO = function(){
|
|
15
34
|
$.ajax(
|
16
35
|
{
|
17
36
|
url : self.url,
|
37
|
+
data : {session : self.session},
|
18
38
|
success : function(data){
|
19
39
|
if(data){
|
20
40
|
self.emit(data.type, data.data);
|
data/lib/sinatra-cometio.rb
CHANGED
data/lib/sinatra/application.rb
CHANGED
@@ -22,27 +22,29 @@ module Sinatra
|
|
22
22
|
|
23
23
|
get '/cometio/io' do
|
24
24
|
stream :keep_open do |s|
|
25
|
-
|
25
|
+
session = params[:session].to_s.empty? ? CometIO.create_session : params[:session]
|
26
|
+
CometIO.sessions[session][:stream] = s
|
27
|
+
CometIO.sessions[session][:last] = Time.now
|
28
|
+
CometIO.emit :connect, session if params[:session].to_s.empty?
|
29
|
+
|
30
|
+
unless CometIO.sessions[session][:queue].empty?
|
26
31
|
begin
|
27
|
-
s.write
|
32
|
+
s.write CometIO.sessions[session][:queue].shift.to_json
|
28
33
|
s.flush
|
29
34
|
s.close
|
30
35
|
rescue
|
31
36
|
s.close
|
32
37
|
end
|
33
|
-
CometIO.channel.unsubscribe sid
|
34
38
|
end
|
35
|
-
CometIO.emit :connect, sid
|
36
39
|
|
37
40
|
EM::add_timer 10 do
|
38
41
|
begin
|
39
|
-
s.write({:type => :
|
42
|
+
s.write({:type => :__heartbeat, :data => {:time => Time.now.to_i}}.to_json)
|
40
43
|
s.flush
|
41
44
|
s.close
|
42
45
|
rescue
|
43
46
|
s.close
|
44
47
|
end
|
45
|
-
CometIO.channel.unsubscribe sid
|
46
48
|
end
|
47
49
|
end
|
48
50
|
end
|
@@ -50,8 +52,9 @@ module Sinatra
|
|
50
52
|
post '/cometio/io' do
|
51
53
|
type = params[:type]
|
52
54
|
data = params[:data]
|
53
|
-
|
54
|
-
|
55
|
+
from = params[:session]
|
56
|
+
CometIO.emit type, data, from if type.size > 0
|
57
|
+
{:session => session, :type => type, :data => data}.to_json
|
55
58
|
end
|
56
59
|
|
57
60
|
end
|
data/lib/sinatra/cometio.rb
CHANGED
@@ -1,16 +1,58 @@
|
|
1
1
|
require 'json'
|
2
|
+
require 'digest/md5'
|
2
3
|
require 'event_emitter'
|
3
4
|
require 'sinatra/streaming'
|
4
5
|
require File.expand_path 'application', File.dirname(__FILE__)
|
5
6
|
require File.expand_path '../sinatra-cometio', File.dirname(__FILE__)
|
6
7
|
|
7
8
|
class CometIO
|
8
|
-
def self.
|
9
|
-
@@
|
9
|
+
def self.sessions
|
10
|
+
@@sessions ||= Hash.new{|h,session_id|
|
11
|
+
h[session_id] = {
|
12
|
+
:queue => [{:type => :set_session_id, :data => session_id}],
|
13
|
+
:stream => nil,
|
14
|
+
:last => nil
|
15
|
+
}
|
16
|
+
}
|
10
17
|
end
|
11
|
-
|
12
|
-
def self.
|
13
|
-
self.
|
18
|
+
|
19
|
+
def self.gc
|
20
|
+
self.sessions.each do |id, s|
|
21
|
+
next unless s[:last] and s[:last] < Time.now-60
|
22
|
+
self.sessions.delete id rescue next
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
EM::defer do
|
27
|
+
loop do
|
28
|
+
self.gc
|
29
|
+
sleep 60
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.push(type, data, opt={})
|
34
|
+
if opt[:to]
|
35
|
+
self.sessions[opt[:to].to_s][:queue].push :type => type, :data => data
|
36
|
+
else
|
37
|
+
self.sessions.each do |id,s|
|
38
|
+
if s[:queue].empty? and s[:stream] != nil
|
39
|
+
begin
|
40
|
+
s[:stream].write({:type => type, :data => data}.to_json)
|
41
|
+
s[:stream].flush
|
42
|
+
s[:stream].close
|
43
|
+
rescue
|
44
|
+
s[:stream].class
|
45
|
+
s[:queue].push :type => type, :data => data
|
46
|
+
end
|
47
|
+
else
|
48
|
+
s[:queue].push :type => type, :data => data
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def self.create_session
|
55
|
+
Digest::MD5.hexdigest "#{Time.now.to_i}_#{Time.now.usec}"
|
14
56
|
end
|
15
57
|
end
|
16
58
|
EventEmitter.apply CometIO
|
data/sample/Gemfile.lock
CHANGED
data/sample/config.ru
CHANGED
@@ -7,9 +7,7 @@ if development?
|
|
7
7
|
$:.unshift File.expand_path '../lib', File.dirname(__FILE__)
|
8
8
|
end
|
9
9
|
require 'sinatra/cometio'
|
10
|
-
|
11
|
-
require File.dirname(__FILE__)+'/bootstrap'
|
12
|
-
Bootstrap.init :helpers, :controllers
|
10
|
+
require File.dirname(__FILE__)+'/main'
|
13
11
|
|
14
12
|
set :haml, :escape_html => true
|
15
13
|
|
data/sample/main.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
CometIO.on :chat do |data, from|
|
2
|
+
puts "#{data['name']} : #{data['message']} (from:#{from})"
|
3
|
+
self.push :chat, data
|
4
|
+
end
|
5
|
+
|
6
|
+
CometIO.on :connect do |session|
|
7
|
+
puts "new client <#{session}>"
|
8
|
+
CometIO.push :chat, {:name => "system", :message => "new client <#{session}>"}
|
9
|
+
CometIO.push :chat, {:name => "system", :message => "welcome <#{session}>"}, {:to => session}
|
10
|
+
end
|
11
|
+
|
12
|
+
EM::defer do
|
13
|
+
loop do
|
14
|
+
CometIO.push :chat, :name => 'clock', :message => Time.now.to_s
|
15
|
+
sleep 60
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
get '/' do
|
20
|
+
haml :index
|
21
|
+
end
|
22
|
+
|
23
|
+
get '/:source.css' do
|
24
|
+
scss params[:source].to_sym
|
25
|
+
end
|
data/sample/public/js/index.js
CHANGED
@@ -5,7 +5,8 @@ io.on("chat", function(data){
|
|
5
5
|
$("#chat #timeline").prepend(m);
|
6
6
|
});
|
7
7
|
|
8
|
-
|
8
|
+
io.on("connect", function(session){
|
9
|
+
alert("connect!! "+session);
|
9
10
|
$("#chat #btn_send").click(post);
|
10
11
|
$("#chat #message").keydown(function(e){
|
11
12
|
if(e.keyCode == 13) post();
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sinatra-cometio
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-11-
|
12
|
+
date: 2012-11-15 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: sinatra
|
@@ -43,6 +43,22 @@ dependencies:
|
|
43
43
|
- - ! '>='
|
44
44
|
- !ruby/object:Gem::Version
|
45
45
|
version: 1.0.0
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: json
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :runtime
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
46
62
|
- !ruby/object:Gem::Dependency
|
47
63
|
name: sinatra-contrib
|
48
64
|
requirement: !ruby/object:Gem::Requirement
|
@@ -66,7 +82,7 @@ dependencies:
|
|
66
82
|
requirements:
|
67
83
|
- - ! '>='
|
68
84
|
- !ruby/object:Gem::Version
|
69
|
-
version: 0.0
|
85
|
+
version: 0.1.0
|
70
86
|
type: :runtime
|
71
87
|
prerelease: false
|
72
88
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -74,7 +90,7 @@ dependencies:
|
|
74
90
|
requirements:
|
75
91
|
- - ! '>='
|
76
92
|
- !ruby/object:Gem::Version
|
77
|
-
version: 0.0
|
93
|
+
version: 0.1.0
|
78
94
|
- !ruby/object:Gem::Dependency
|
79
95
|
name: rdoc
|
80
96
|
requirement: !ruby/object:Gem::Requirement
|
@@ -151,11 +167,8 @@ files:
|
|
151
167
|
- sample/Gemfile.lock
|
152
168
|
- sample/Procfile
|
153
169
|
- sample/README.md
|
154
|
-
- sample/bootstrap.rb
|
155
170
|
- sample/config.ru
|
156
|
-
- sample/
|
157
|
-
- sample/controllers/main.rb
|
158
|
-
- sample/helpers/helper.rb
|
171
|
+
- sample/main.rb
|
159
172
|
- sample/public/js/index.js
|
160
173
|
- sample/views/index.haml
|
161
174
|
- sample/views/main.scss
|
@@ -181,7 +194,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
181
194
|
version: '0'
|
182
195
|
segments:
|
183
196
|
- 0
|
184
|
-
hash: -
|
197
|
+
hash: -3646192139090074998
|
185
198
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
186
199
|
none: false
|
187
200
|
requirements:
|
data/sample/bootstrap.rb
DELETED
data/sample/controllers/css.rb
DELETED
data/sample/controllers/main.rb
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
CometIO.on :chat do |data|
|
2
|
-
self.push :chat, data
|
3
|
-
end
|
4
|
-
|
5
|
-
CometIO.on :connect do |id|
|
6
|
-
puts "comet <#{id}> connect."
|
7
|
-
end
|
8
|
-
|
9
|
-
EM::defer do
|
10
|
-
loop do
|
11
|
-
CometIO.push :chat, :name => 'clock', :message => Time.now.to_s
|
12
|
-
sleep 60
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
get '/' do
|
17
|
-
haml :index
|
18
|
-
end
|
data/sample/helpers/helper.rb
DELETED