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