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