class Firehose::Rack::Consumer

Handles a subscription request over HTTP or WebSockets depeding on its abilities and binds that to the Firehose::Server::Subscription class, which is bound to a channel that gets published to.

Constants

MULTIPLEX_CHANNEL

Public Class Methods

multiplex_subscriptions(request) click to toggle source
# File lib/firehose/rack/consumer.rb, line 19
def self.multiplex_subscriptions(request)
  if request.get?
    query_string_subscriptions(request.env)
  elsif request.post?
    post_subscriptions(request)
  end
end
multiplexing_request?(env) click to toggle source
# File lib/firehose/rack/consumer.rb, line 15
def self.multiplexing_request?(env)
  env["PATH_INFO"].include? MULTIPLEX_CHANNEL
end
new() { |self| ... } click to toggle source

Let the client configure the consumer on initialization.

# File lib/firehose/rack/consumer.rb, line 53
def initialize
  yield self if block_given?
end
post_subscriptions(request) click to toggle source
# File lib/firehose/rack/consumer.rb, line 41
def self.post_subscriptions(request)
  body = request.body.read
  subs = JSON.parse(body).map do |chan, last_sequence|
    last_sequence = 0 if last_sequence < 0
    {
      channel: chan,
      message_sequence: last_sequence
    }
  end
end
query_string_subscriptions(env) click to toggle source
# File lib/firehose/rack/consumer.rb, line 27
def self.query_string_subscriptions(env)
  query_params = ::Rack::Utils.parse_query(env["QUERY_STRING"])

  query_params["subscribe"].to_s.split(",").map do |sub|
    chan, last_sequence = sub.split("!")
    last_sequence = last_sequence.to_i
    last_sequence = 0 if last_sequence < 0
    {
      channel: chan,
      message_sequence: last_sequence
    }
  end
end

Public Instance Methods

call(env) click to toggle source
# File lib/firehose/rack/consumer.rb, line 57
def call(env)
  websocket_request?(env) ? websocket.call(env) : http_long_poll.call(env)
end
http_long_poll() click to toggle source

Memoized instance of http long poll handler that can be configured from the rack app.

# File lib/firehose/rack/consumer.rb, line 67
def http_long_poll
  @http_long_poll ||= HttpLongPoll.new
end
websocket() click to toggle source

Memoized instance of web socket that can be configured from the rack app.

# File lib/firehose/rack/consumer.rb, line 62
def websocket
  @web_socket ||= WebSocket.new
end

Private Instance Methods

websocket_request?(env) click to toggle source

Determine if the incoming request is a websocket request.

# File lib/firehose/rack/consumer.rb, line 73
def websocket_request?(env)
  Firehose::Rack::Consumer::WebSocket.request?(env)
end