class Firehose::Rack::App

Acts as the glue between the HTTP/WebSocket world and the Firehose::Server class, which talks directly to the Redis server. Also dispatches between HTTP and WebSocket transport handlers depending on the clients’ request.

Public Class Methods

new() { |self| ... } click to toggle source
# File lib/firehose/rack/app.rb, line 7
def initialize
  yield self if block_given?
end

Public Instance Methods

call(env) click to toggle source
# File lib/firehose/rack/app.rb, line 11
def call(env)
  # Cache the parsed request so we don't need to re-parse it when we pass
  # control onto another app.
  req     = env['parsed_request'] ||= ::Rack::Request.new(env)
  method  = req.request_method

  case method
  when 'PUT'
    # Firehose::Client::Publisher PUT's payloads to the server.
    publisher.call(env)
  when 'HEAD' 
    # HEAD requests are used to prevent sockets from timing out
    # from inactivity
    ping.call(env)
  else
    # TODO - 'harden' this up with a GET request and throw a "Bad Request"
    # HTTP error code. I'd do it now but I'm in a plane and can't think of it.
    consumer.call(env)
  end
end
consumer() click to toggle source

The consumer pulls messages off of the backend and passes messages to the connected HTTP or WebSocket client. This can be configured from the initialization method of the rack app.

# File lib/firehose/rack/app.rb, line 35
def consumer
  @consumer ||= Consumer.new
end

Private Instance Methods

ping() click to toggle source
# File lib/firehose/rack/app.rb, line 44
def ping
  @ping ||= Ping.new
end
publisher() click to toggle source
# File lib/firehose/rack/app.rb, line 40
def publisher
  @publisher ||= Publisher.new
end