Module: Sinatra::CometIO
- Defined in:
- lib/sinatra/cometio.rb,
lib/sinatra/cometio/client.rb,
lib/sinatra-cometio/cometio.rb,
lib/sinatra-cometio/helpers.rb,
lib/sinatra-cometio/options.rb,
lib/sinatra-cometio/version.rb,
lib/sinatra-cometio/javascript.rb,
lib/sinatra-cometio/application.rb
Defined Under Namespace
Modules: Helpers
Classes: Client
Constant Summary
collapse
- VERSION =
'0.6.0'
Class Method Summary
collapse
Instance Method Summary
collapse
Class Method Details
.create_session(ip_addr) ⇒ Object
53
54
55
|
# File 'lib/sinatra-cometio/cometio.rb', line 53
def self.create_session(ip_addr)
Digest::MD5.hexdigest "#{Time.now.to_i}_#{Time.now.usec}_#{ip_addr}"
end
|
.default_options ⇒ Object
12
13
14
15
16
17
18
|
# File 'lib/sinatra-cometio/options.rb', line 12
def self.default_options
{
:timeout => [120, lambda{|v| v.kind_of? Fixnum and v >= 20 }],
:post_interval => [1, lambda{|v| [Fixnum, Float].include? v.class and v >= 1 }],
:allow_crossdomain => [false, lambda{|v| [true, false].include? v }]
}
end
|
.gc ⇒ Object
14
15
16
17
18
19
20
|
# File 'lib/sinatra-cometio/cometio.rb', line 14
def self.gc
self.sessions.each do |id, s|
next unless s[:last] and s[:last] < Time.now-CometIO.options[:timeout]*2-10
self.sessions.delete id rescue next
self.emit :disconnect, id
end
end
|
.javascript(*js_file_names) ⇒ Object
4
5
6
7
8
9
10
11
12
13
|
# File 'lib/sinatra-cometio/javascript.rb', line 4
def self.javascript(*js_file_names)
js_file_names = ['cometio.js', 'event_emitter.js'] if js_file_names.empty?
js = ''
js_file_names.each do |i|
File.open(File.expand_path "../js/#{i}", File.dirname(__FILE__)) do |f|
js += f.read
end
end
js
end
|
.options ⇒ Object
20
21
22
23
24
25
26
27
28
|
# File 'lib/sinatra-cometio/options.rb', line 20
def self.options
@@options ||= (
opts = {}
default_options.each do |k,v|
opts[k] = v[0]
end
opts
)
end
|
.options=(opts) ⇒ Object
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
# File 'lib/sinatra-cometio/options.rb', line 30
def self.options=(opts)
@@options = {}
opts.each do |k,v|
k = k.to_sym
unless default_options.include? k
STDERR.puts "!! Sinatra::CometIO setting - \"#{k}\" is not valid key"
else
unless default_options[k][1].call(v)
default = default_options[k][0]
STDERR.puts "!! Sinatra::CometIO setting - \"#{k} => #{v}\" is not valid. set default \"#{k} => #{default}\""
@@options[k] = default
else
@@options[k] = v
end
end
end
default_options.each do |k, v|
@@options[k] = v[0] unless @@options.include? k
end
@@options
end
|
.push(type, data, opt = {}) ⇒ Object
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
# File 'lib/sinatra-cometio/cometio.rb', line 29
def self.push(type, data, opt={})
if opt.include? :to
return unless self.sessions.include? opt[:to]
s = self.sessions[opt[:to]]
if s[:queue].empty? and s[:stream] != nil
begin
s[:stream].write([{:type => type, :data => data}].to_json)
s[:stream].flush
s[:stream].close
rescue
s[:stream].close
s[:queue].push :type => type, :data => data
end
s[:stream] = nil
else
s[:queue].push :type => type, :data => data
end
return
end
self.sessions.keys.each do |id|
push type, data, :to => id
end
end
|
.registered(app) ⇒ Object
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
# File 'lib/sinatra-cometio/application.rb', line 4
def self.registered(app)
app.helpers Sinatra::Streaming
app.helpers Sinatra::CometIO::Helpers
app.get '/cometio/cometio.js' do
content_type 'application/javascript'
@js ||= ERB.new(Sinatra::CometIO.javascript).result(binding)
end
app.get '/cometio/io' do
response["Access-Control-Allow-Origin"] = "*" if CometIO.options[:allow_crossdomain]
stream :keep_open do |s|
session = params[:session].to_s.empty? ? CometIO.create_session(request.ip) : params[:session]
CometIO.sessions[session][:remote_addr] = request.env['REMOTE_ADDR']
CometIO.sessions[session][:stream] = s
CometIO.sessions[session][:last] = Time.now
CometIO.emit :connect, session if params[:session].to_s.empty?
unless CometIO.sessions[session][:queue].empty?
begin
s.write CometIO.sessions[session][:queue].to_json
s.flush
s.close
rescue
s.close
end
CometIO.sessions[session][:queue] = []
end
EM::add_timer CometIO.options[:timeout] do
begin
s.write([{:type => :__heartbeat, :data => {:time => Time.now.to_i}}].to_json)
s.flush
s.close
rescue
s.close
end
end
end
end
app.post '/cometio/io' do
response["Access-Control-Allow-Origin"] = "*" if CometIO.options[:allow_crossdomain]
data = ::JSON.parse params[:json] rescue halt 500, 'JSON parse error'
from = data['session']
halt 400, 'no session' if !from or from.empty?
events = data['events']
halt 400, 'no data' unless [Hash, Array].include? events.class
events = events.keys.sort.map{|i| events[i] } if events.kind_of? Hash
EM::defer do
events.each do |e|
next if !e['type'] or e['type'].empty?
CometIO.emit e['type'], e['data'], from
end
end
stream :keep_open do |s|
begin
s.write({:session => from, :success => true}.to_json)
s.flush
s.close
rescue
s.close
end
end
end
end
|
.sessions ⇒ Object
4
5
6
7
8
9
10
11
12
|
# File 'lib/sinatra-cometio/cometio.rb', line 4
def self.sessions
@@sessions ||= Hash.new{|h,session_id|
h[session_id] = {
:queue => [{:type => :__session_id, :data => session_id}],
:stream => nil,
:last => nil
}
}
end
|
Instance Method Details
#cometio ⇒ Object
8
9
10
|
# File 'lib/sinatra-cometio/options.rb', line 8
def cometio
CometIO.options
end
|
#cometio=(options) ⇒ Object
4
5
6
|
# File 'lib/sinatra-cometio/options.rb', line 4
def cometio=(options)
CometIO.options = options
end
|