class PusherClient::Socket
Constants
- CLIENT_ID
Mimick the JavaScript client
- VERSION
Attributes
connected[R]
encrypted[RW]
global_channel[R]
path[R]
secure[RW]
socket_id[R]
subscriptions[R]
Public Class Methods
new(application_key, options={})
click to toggle source
# File lib/pusher-client/socket.rb, line 15 def initialize(application_key, options={}) raise ArgumentError if (!application_key.is_a?(String) || application_key.size < 1) @path = "/app/#{application_key}?client=#{CLIENT_ID}&version=#{VERSION}" @key = application_key @secret = options[:secret] @socket_id = nil @subscriptions = Subscriptions.new @global_channel = Channel.new('pusher_global_channel') @global_channel.global = true @secure = false @connected = false @encrypted = options[:encrypted] || false bind('pusher:connection_established') do |data| socket = JSON.parse(data) @connected = true @socket_id = socket['socket_id'] subscribe_all end bind('pusher:connection_disconnected') do |data| @subscriptions.subscriptions.each { |s| s.disconnect } end bind('pusher:error') do |data| PusherClient.logger.fatal("Pusher : error : #{data.inspect}") end end
Public Instance Methods
[](channel_name)
click to toggle source
# File lib/pusher-client/socket.rb, line 123 def [](channel_name) if @subscriptions[channel_name] @subscriptions[channel_name] else @subscriptions << channel_name end end
bind(event_name, &callback)
click to toggle source
# File lib/pusher-client/socket.rb, line 118 def bind(event_name, &callback) @global_channel.bind(event_name, &callback) return self end
connect(async = false)
click to toggle source
# File lib/pusher-client/socket.rb, line 45 def connect(async = false) if @encrypted || @secure url = "wss://#{HOST}:#{WSS_PORT}#{@path}" else url = "ws://#{HOST}:#{WS_PORT}#{@path}" end PusherClient.logger.debug("Pusher : connecting : #{url}") @connection_thread = Thread.new { @connection = WebSocket.new(url) PusherClient.logger.debug "Websocket connected" loop do msg = @connection.receive[0] params = parser(msg) next if (params['socket_id'] && params['socket_id'] == self.socket_id) event_name = params['event'] event_data = params['data'] channel_name = params['channel'] send_local_event(event_name, event_data, channel_name) end } @connection_thread.run @connection_thread.join unless async return self end
disconnect()
click to toggle source
# File lib/pusher-client/socket.rb, line 72 def disconnect if @connected PusherClient.logger.debug "Pusher : disconnecting" @connection.close @connection_thread.kill if @connection_thread @connected = false else PusherClient.logger.warn "Disconnect attempted... not connected" end end
get_presence_auth(subscription)
click to toggle source
# File lib/pusher-client/socket.rb, line 163 def get_presence_auth(subscription) string_to_sign = @socket_id + ':' + subscription.channel + ':' + subscription.user_data signature = HMAC::SHA256.hexdigest(@secret, string_to_sign) return "#{@key}:#{signature}" end
get_private_auth(subscription)
click to toggle source
# File lib/pusher-client/socket.rb, line 157 def get_private_auth(subscription) string_to_sign = @socket_id + ':' + subscription.channel + ':' + subscription.user_data signature = HMAC::SHA256.hexdigest(@secret, string_to_sign) return "#{@key}:#{signature}" end
is_presence_channel(subscription)
click to toggle source
# File lib/pusher-client/socket.rb, line 153 def is_presence_channel(subscription) subscription.channel.match(/^presence-/) end
is_private_channel(subscription)
click to toggle source
# File lib/pusher-client/socket.rb, line 149 def is_private_channel(subscription) subscription.channel.match(/^private-/) end
send_event(event_name, data)
click to toggle source
# File lib/pusher-client/socket.rb, line 172 def send_event(event_name, data) payload = {'event' => event_name, 'data' => data}.to_json @connection.send(payload) PusherClient.logger.debug("Pusher : sending event : #{payload}") end
subscribe(channel_name, user_id = nil, options={})
click to toggle source
# File lib/pusher-client/socket.rb, line 83 def subscribe(channel_name, user_id = nil, options={}) if user_id user_data = {:user_id => user_id, :user_info => options}.to_json else user_data = {:user_id => '', :user_info => ''}.to_json end subscription = @subscriptions.add(channel_name, user_data) if @connected authorize(subscription, method(:authorize_callback)) end return subscription end
subscribe_all()
click to toggle source
# File lib/pusher-client/socket.rb, line 104 def subscribe_all @subscriptions.subscriptions.each{ |s| subscribe_existing(s) } end
Also aliased as: subscribeAll
subscribe_existing(subscription)
click to toggle source
# File lib/pusher-client/socket.rb, line 97 def subscribe_existing(subscription) if @connected authorize(subscription, method(:authorize_callback)) end return subscription end
unsubscribe(channel_name, user_data)
click to toggle source
# File lib/pusher-client/socket.rb, line 108 def unsubscribe(channel_name, user_data) subscription = @subscriptions.remove(channel_name, user_data) if @connected send_event('pusher:unsubscribe', { 'channel' => channel_name }) end return subscription end
Protected Instance Methods
parser(data)
click to toggle source
# File lib/pusher-client/socket.rb, line 192 def parser(data) begin return JSON.parse(data) rescue => err PusherClient.logger.warn(err) PusherClient.logger.warn("Pusher : data attribute not valid JSON - you may wish to implement your own Pusher::Client.parser") return data end end
send_local_event(event_name, event_data, channel_name)
click to toggle source
# File lib/pusher-client/socket.rb, line 180 def send_local_event(event_name, event_data, channel_name) if (channel_name) subs = @subscriptions.find_all(channel_name) if (subs) subs.each {|s| s.dispatch_with_all(event_name, event_data)} end end @global_channel.dispatch_with_all(event_name, event_data) PusherClient.logger.debug("Pusher : event received : channel: #{channel_name}; event: #{event_name}") end