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 CHANGED
@@ -1,3 +1,7 @@
1
+ === 0.0.2 2012-11-15
2
+
3
+ * support session
4
+
1
5
  === 0.0.1 2012-11-10
2
6
 
3
7
  * release
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/controllers/css.rb
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.7']]
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
- $.post(self.url, {type : type, data : data});
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);
@@ -1,3 +1,3 @@
1
1
  module SinatraCometio
2
- VERSION = '0.0.1'
2
+ VERSION = '0.0.2'
3
3
  end
@@ -22,27 +22,29 @@ module Sinatra
22
22
 
23
23
  get '/cometio/io' do
24
24
  stream :keep_open do |s|
25
- sid = CometIO.channel.subscribe do |msg|
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 msg.to_json
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 => :cometio_heartbeat, :data => {:time => Time.now.to_s}}.to_json)
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
- CometIO.emit type, data if type.size > 0
54
- {:type => type, :data => data}.to_json
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
@@ -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.channel
9
- @@channel ||= EM::Channel.new
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.push(type, data)
13
- self.channel.push :type => type, :data => data
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
@@ -3,7 +3,7 @@ GEM
3
3
  specs:
4
4
  backports (2.6.5)
5
5
  daemons (1.1.9)
6
- event_emitter (0.0.7)
6
+ event_emitter (0.1.0)
7
7
  eventmachine (1.0.0)
8
8
  foreman (0.60.2)
9
9
  thor (>= 0.13.6)
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
@@ -5,7 +5,8 @@ io.on("chat", function(data){
5
5
  $("#chat #timeline").prepend(m);
6
6
  });
7
7
 
8
- $(function(){
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.1
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-10 00:00:00.000000000 Z
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.7
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.7
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/controllers/css.rb
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: -865335438881697336
197
+ hash: -3646192139090074998
185
198
  required_rubygems_version: !ruby/object:Gem::Requirement
186
199
  none: false
187
200
  requirements:
data/sample/bootstrap.rb DELETED
@@ -1,14 +0,0 @@
1
- class Bootstrap
2
- def self.default
3
- []
4
- end
5
-
6
- def self.init(*inits)
7
- [default, inits].flatten.uniq.each do |cat|
8
- Dir.glob("#{File.dirname(__FILE__)}/#{cat}/*.rb").each do |rb|
9
- puts "load #{rb}"
10
- require rb
11
- end
12
- end
13
- end
14
- end
@@ -1,3 +0,0 @@
1
- get '/:source.css' do
2
- scss params[:source].to_sym
3
- end
@@ -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
@@ -1,4 +0,0 @@
1
-
2
- def app_root
3
- "#{env['rack.url_scheme']}://#{env['HTTP_HOST']}#{env['SCRIPT_NAME']}"
4
- end