class Sinatra::PubSub::Stream
Attributes
id[R]
out[R]
Public Class Methods
disable!()
click to toggle source
# File lib/sinatra/pubsub/stream.rb, line 15 def self.disable! @enabled = false streams.values.flatten.each(&:close!) end
enabled?()
click to toggle source
# File lib/sinatra/pubsub/stream.rb, line 8 def self.enabled? unless defined? @enabled @enabled = true end @enabled end
new(out)
click to toggle source
# File lib/sinatra/pubsub/stream.rb, line 36 def initialize(out) @id = SecureRandom.uuid @out = out subscribe :all @timer = EventMachine::PeriodicTimer.new( 20, method(:keepalive) ) setup end
publish(channel, message, options = {})
click to toggle source
# File lib/sinatra/pubsub/stream.rb, line 20 def self.publish(channel, message, options = {}) streams = self.streams[channel.to_s] if except_id = options[:except] streams = streams.reject {|s| s.id == except_id } end streams.each {|c| c.publish(:message, message) } end
publish_all(message, options = {})
click to toggle source
# File lib/sinatra/pubsub/stream.rb, line 30 def self.publish_all(message, options = {}) publish(:all, message, options) end
streams()
click to toggle source
# File lib/sinatra/pubsub/stream.rb, line 4 def self.streams @streams ||= Hash.new { |hash, key| hash[key] = [] } end
Public Instance Methods
close!()
click to toggle source
# File lib/sinatra/pubsub/stream.rb, line 53 def close! @timer.cancel self.class.streams.each do |channel, streams| streams.delete(self) end end
publish(event, message)
click to toggle source
# File lib/sinatra/pubsub/stream.rb, line 61 def publish(event, message) self << "event: #{event}\n" self << "data: #{message}\n\n" end
subscribe(channel)
click to toggle source
# File lib/sinatra/pubsub/stream.rb, line 49 def subscribe(channel) self.class.streams[channel.to_s] << self end
Protected Instance Methods
<<(data)
click to toggle source
# File lib/sinatra/pubsub/stream.rb, line 68 def <<(data) return close! if out.closed? out << data end
keepalive()
click to toggle source
# File lib/sinatra/pubsub/stream.rb, line 80 def keepalive return close! if keepalive_timeout? publish(:keepalive, '') end
keepalive_timeout?()
click to toggle source
Only keep streams alive for so long
# File lib/sinatra/pubsub/stream.rb, line 74 def keepalive_timeout? @keepalive_count ||= 0 @keepalive_count += 1 @keepalive_count > 10 end
setup()
click to toggle source
# File lib/sinatra/pubsub/stream.rb, line 85 def setup publish(:setup, id) self << "retry: 5000\n" end