sinatra-cometio 0.0.1 → 0.0.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/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