class Faye::Reconnect::ClientExtension
Public Class Methods
finalize(redis)
click to toggle source
# File lib/faye/reconnect/client_extension.rb, line 7 def self.finalize(redis) proc { redis&.close_connection } end
new(redis: nil, name:, on_handshake: nil)
click to toggle source
# File lib/faye/reconnect/client_extension.rb, line 11 def initialize redis: nil, name:, on_handshake: nil @name = name @clientIdFetched = false @on_handshake = on_handshake redis ||= {} redis[:host] ||= 'localhost' redis[:port] ||= 6379 redis[:password] ||= '' @redis = EventMachine::Hiredis::Client.new(redis[:host], redis[:port], redis[:password], redis[:database]) EM.schedule do @redis.connect @redis.client('setname', "faye-reconnect/#{name}[#{Socket.gethostname}][#{Process.pid}]") ObjectSpace.define_finalizer(self, self.class.finalize(@redis)) @redis.errback do |reason| raise "Connection to redis failed : #{reason}" end end end
Public Instance Methods
clientIdKey()
click to toggle source
# File lib/faye/reconnect/client_extension.rb, line 31 def clientIdKey "#{@name}/client_id" end
close_redis_connection()
click to toggle source
# File lib/faye/reconnect/client_extension.rb, line 35 def close_redis_connection @redis&.close_connection end
del_client_id(&callback)
click to toggle source
# File lib/faye/reconnect/client_extension.rb, line 52 def del_client_id(&callback) @redis.del(clientIdKey, &callback).errback(&callback) end
fetch_client_id(&callback)
click to toggle source
# File lib/faye/reconnect/client_extension.rb, line 39 def fetch_client_id(&callback) if @clientIdFetched == false @clientIdFetched = true @redis.get(clientIdKey, &callback) else callback.call(nil) end end
incoming(message, callback)
click to toggle source
# File lib/faye/reconnect/client_extension.rb, line 71 def incoming(message, callback) if message['channel'] == '/meta/handshake' @on_handshake&.call(previous_client_id: @sent_client_id, new_client_id: message['clientId']) if message['error'] == 'Already connected' && message.key?('clientId') message.delete('error') message['successful'] = true callback.call(message) else fetch_client_id do |clientId| if clientId.nil? set_client_id(message['clientId']) { callback.call(message) } else callback.call(message) end end end else callback.call(message) end end
outgoing(message, callback)
click to toggle source
# File lib/faye/reconnect/client_extension.rb, line 56 def outgoing(message, callback) if message['channel'] == '/meta/disconnect' del_client_id { callback.call(message) } elsif message['channel'] == '/meta/handshake' fetch_client_id do |clientId| message['previousClientId'] = clientId if !clientId.nil? # Store the clientId sent with the /meta/handshake @sent_client_id = clientId callback.call(message) end else callback.call(message) end end
set_client_id(value, &callback)
click to toggle source
# File lib/faye/reconnect/client_extension.rb, line 48 def set_client_id(value, &callback) @redis.set(clientIdKey, value, &callback).errback(&callback) end