class Garufa::Connection

Attributes

socket_id[R]

Public Class Methods

new(socket, logger) click to toggle source
# File lib/garufa/connection.rb, line 12
def initialize(socket, logger)
  @socket = socket
  @logger = logger
  @socket_id = build_socket_id
  @subscriptions = {}
end

Public Instance Methods

cleanup() click to toggle source
# File lib/garufa/connection.rb, line 56
def cleanup
  @subscriptions.each { |_, subscription| unsubscribe(subscription) }
  @subscriptions.clear
end
close() click to toggle source
# File lib/garufa/connection.rb, line 52
def close
  @socket.close
end
error(code, message) click to toggle source
# File lib/garufa/connection.rb, line 42
def error(code, message)
  send_message Message.error(code, message)
end
establish() click to toggle source
# File lib/garufa/connection.rb, line 19
def establish
  if valid_app_key?
    send_message Message.connection_established(@socket_id)
  else
    error(4001, "Could not find app by key #{app_key}")
    close
  end
end
handle_incomming_data(data) click to toggle source
# File lib/garufa/connection.rb, line 28
def handle_incomming_data(data)
  @logger.debug "Incomming message. #{@socket_id}: #{data}"

  message = Message.new(JSON.parse(data))
  event, data = message.event, message.data

  case event
  when /^pusher:/
    handle_pusher_event(event, data)
  when /^client-/
    handle_client_event(event, data, message.channel)
  end
end
send_message(message) click to toggle source
# File lib/garufa/connection.rb, line 46
def send_message(message)
  @logger.debug "Outgoing message. #{@socket_id}: #{message.to_json}"

  @socket.send message.to_json
end

Private Instance Methods

app_key() click to toggle source
# File lib/garufa/connection.rb, line 121
def app_key
  @app_key ||= URI.parse(@socket.url).path.split('/').last
end
build_socket_id() click to toggle source
# File lib/garufa/connection.rb, line 153
def build_socket_id
  # Follow the pusher socket id format, i.e: ^\d+\.\d+$
  [SecureRandom.random_number(10 ** 6), SecureRandom.random_number(10 ** 6)].join('.')
end
handle_client_event(event, data, channel) click to toggle source
# File lib/garufa/connection.rb, line 72
def handle_client_event(event, data, channel)
  return unless Config[:client_events_enabled]

  subscription = @subscriptions[channel]

  if subscription && (subscription.private_channel? || subscription.presence_channel?)
    notify_clients(subscription, event, data)
  end
end
handle_pusher_event(event, data) click to toggle source
# File lib/garufa/connection.rb, line 63
def handle_pusher_event(event, data)
  accepted_events = %w{ping pong subscribe unsubscribe}
  event_name = event.partition(':').last

  if accepted_events.include?(event_name)
    method("pusher_#{event_name}").call data
  end
end
notify_clients(subscription, event, data) click to toggle source
# File lib/garufa/connection.rb, line 137
def notify_clients(subscription, event, data)
  options = {
    data: data,
    socket_id: subscription.socket_id
  }
  Subscriptions.notify [subscription.channel], event, options
end
notify_member(event, subscription) click to toggle source
# File lib/garufa/connection.rb, line 145
def notify_member(event, subscription)
  options = {
    data: subscription.channel_data,
    socket_id: subscription.socket_id
  }
  Subscriptions.notify [subscription.channel], "pusher_internal:#{event}", options
end
pusher_ping(data) click to toggle source
# File lib/garufa/connection.rb, line 82
def pusher_ping(data)
  send_message Message.pong
end
pusher_pong(data) click to toggle source
# File lib/garufa/connection.rb, line 86
def pusher_pong(data)
  # There is nothing to do with a pong message
end
pusher_subscribe(data) click to toggle source
# File lib/garufa/connection.rb, line 90
def pusher_subscribe(data)
  subscription = Subscription.new(data, self)
  subscribe(subscription)
end
pusher_unsubscribe(data) click to toggle source
# File lib/garufa/connection.rb, line 107
def pusher_unsubscribe(data)
  subscription = @subscriptions.delete data["channel"]
  unsubscribe(subscription) if subscription
end
send_subscription_succeeded(subscription) click to toggle source
# File lib/garufa/connection.rb, line 125
def send_subscription_succeeded(subscription)
  channel = subscription.channel
  data = {}

  if subscription.presence_channel?
    stats = Subscriptions.channel_stats(channel)
    data[:presence] = stats[:presence]
  end

  send_message Message.subscription_succeeded(channel, data)
end
subscribe(subscription) click to toggle source
# File lib/garufa/connection.rb, line 95
def subscribe(subscription)
  subscription.subscribe

  if subscription.success?
    @subscriptions[subscription.channel] = subscription
    send_subscription_succeeded(subscription)
    notify_member(:member_added, subscription) if subscription.presence_channel?
  else
    error(subscription.error.code, subscription.error.message)
  end
end
unsubscribe(subscription) click to toggle source
# File lib/garufa/connection.rb, line 112
def unsubscribe(subscription)
  notify_member(:member_removed, subscription) if subscription.presence_channel?
  subscription.unsubscribe
end
valid_app_key?() click to toggle source
# File lib/garufa/connection.rb, line 117
def valid_app_key?
  app_key && (app_key == Config[:app_key])
end