class Slanger::Handler

Attributes

connection[RW]

Public Class Methods

new(socket, handshake) click to toggle source
# File lib/slanger/handler.rb, line 16
def initialize(socket, handshake)
  @socket = socket
  @handshake = handshake
  @connection = Connection.new(@socket)
  @subscriptions = {}
  authenticate
end

Public Instance Methods

authenticate() click to toggle source
# File lib/slanger/handler.rb, line 54
def authenticate
  if !valid_app_key? app_key
    error({ code: 4001, message: "Could not find app by key #{app_key}" })
    @socket.close_websocket
  elsif !valid_protocol_version?
    error({ code: 4007, message: "Unsupported protocol version" })
    @socket.close_websocket
  else
    connection.establish
  end
end
onclose() click to toggle source
# File lib/slanger/handler.rb, line 45
def onclose
  subscriptions = @subscriptions.select { |k, v| k && v }

  subscriptions.each_key do |channel_id|
    subscription_id = subscriptions[channel_id]
    Channel.unsubscribe channel_id, subscription_id
  end
end
onmessage(msg) click to toggle source

Dispatches message handling to method with same name as the event name

# File lib/slanger/handler.rb, line 26
def onmessage(msg)
  msg = Oj.strict_load(msg)

  msg["data"] = Oj.strict_load(msg["data"]) if msg["data"].is_a? String

  event = msg["event"].gsub(/\Apusher:/, "pusher_")

  if event =~ /\Aclient-/
    msg["socket_id"] = connection.socket_id
    Channel.send_client_message msg
  elsif respond_to? event, true
    send event, msg
  end
rescue JSON::ParserError
  error({ code: 5001, message: "Invalid JSON" })
rescue Exception => e
  error({ code: 500, message: "#{e.message}\n #{e.backtrace.join "\n"}" })
end
pusher_ping(msg) click to toggle source
# File lib/slanger/handler.rb, line 70
def pusher_ping(msg)
  send_payload nil, "pusher:pong"
end
pusher_pong(msg) click to toggle source
# File lib/slanger/handler.rb, line 74
def pusher_pong(msg); end
pusher_subscribe(msg) click to toggle source
# File lib/slanger/handler.rb, line 76
def pusher_subscribe(msg)
  channel_id = msg["data"]["channel"]
  klass = subscription_klass channel_id

  if @subscriptions[channel_id]
    error({ code: nil, message: "Existing subscription to #{channel_id}" })
  else
    @subscriptions[channel_id] = klass.new(connection.socket, connection.socket_id, msg).subscribe
  end
end
pusher_unsubscribe(msg) click to toggle source
# File lib/slanger/handler.rb, line 87
def pusher_unsubscribe(msg)
  channel_id = msg["data"]["channel"]
  subscription_id = @subscriptions.delete(channel_id)

  Channel.unsubscribe channel_id, subscription_id
end
valid_protocol_version?() click to toggle source
# File lib/slanger/handler.rb, line 66
def valid_protocol_version?
  protocol_version.between?(3, 7)
end

Private Instance Methods

app_key() click to toggle source
# File lib/slanger/handler.rb, line 96
def app_key
  @handshake.path.split(/\W/)[2]
end
protocol_version() click to toggle source
# File lib/slanger/handler.rb, line 100
def protocol_version
  @query_string ||= Rack::Utils.parse_nested_query(@handshake.query_string)
  @query_string["protocol"].to_i || -1
end
subscription_klass(channel_id) click to toggle source
# File lib/slanger/handler.rb, line 109
def subscription_klass(channel_id)
  klass = channel_id.match(/\A(private|presence)-/) do |match|
    Slanger.const_get "#{match[1]}_subscription".classify
  end

  klass || Slanger::Subscription
end
valid_app_key?(app_key) click to toggle source
# File lib/slanger/handler.rb, line 105
def valid_app_key?(app_key)
  Slanger::Config.app_key == app_key
end