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