Class: Faye::Reconnect::ClientExtension

Inherits:
Object
  • Object
show all
Defined in:
lib/faye/reconnect/client_extension.rb

Instance Method Summary collapse

Constructor Details

#initialize(redis: nil, name:) ⇒ ClientExtension

Returns a new instance of ClientExtension.



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# File 'lib/faye/reconnect/client_extension.rb', line 7

def initialize redis: nil, name:
  @name = name
  @clientIdFetched = false
  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.errback do |reason|
      raise "Connection to redis failed : #{reason}"
    end
  end
end

Instance Method Details

#clientIdKeyObject



24
25
26
# File 'lib/faye/reconnect/client_extension.rb', line 24

def clientIdKey
  "#{@name}/client_id"
end

#del_client_id(&callback) ⇒ Object



41
42
43
# File 'lib/faye/reconnect/client_extension.rb', line 41

def del_client_id(&callback)
  @redis.del(clientIdKey, &callback).errback(&callback)
end

#fetch_client_id(&callback) ⇒ Object



28
29
30
31
32
33
34
35
# File 'lib/faye/reconnect/client_extension.rb', line 28

def fetch_client_id(&callback)
  if @clientIdFetched == false
    @clientIdFetched = true
    @redis.get(clientIdKey, &callback)
  else
    callback.call(nil)
  end
end

#incoming(message, callback) ⇒ Object



58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/faye/reconnect/client_extension.rb', line 58

def incoming(message, callback)
  if message['channel'] == '/meta/handshake'
    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) ⇒ Object



45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/faye/reconnect/client_extension.rb', line 45

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?
      callback.call(message)
    end
  else
    callback.call(message)
  end
end

#set_client_id(value, &callback) ⇒ Object



37
38
39
# File 'lib/faye/reconnect/client_extension.rb', line 37

def set_client_id(value, &callback)
  @redis.set(clientIdKey, value, &callback).errback(&callback)
end