Class: Faye::Redis::ClientRegistry

Inherits:
Object
  • Object
show all
Defined in:
lib/faye/redis/client_registry.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(connection, options = {}) ⇒ ClientRegistry

Returns a new instance of ClientRegistry.



8
9
10
11
# File 'lib/faye/redis/client_registry.rb', line 8

def initialize(connection, options = {})
  @connection = connection
  @options = options
end

Instance Attribute Details

#connectionObject (readonly)

Returns the value of attribute connection.



6
7
8
# File 'lib/faye/redis/client_registry.rb', line 6

def connection
  @connection
end

#optionsObject (readonly)

Returns the value of attribute options.



6
7
8
# File 'lib/faye/redis/client_registry.rb', line 6

def options
  @options
end

Instance Method Details

#all(&callback) ⇒ Object

Get all active clients



99
100
101
102
103
104
105
106
107
108
109
110
# File 'lib/faye/redis/client_registry.rb', line 99

def all(&callback)
  client_ids = @connection.with_redis do |redis|
    redis.smembers(clients_index_key)
  end

  EventMachine.next_tick { callback.call(client_ids) } if callback
  client_ids
rescue => e
  log_error("Failed to get all clients: #{e.message}")
  EventMachine.next_tick { callback.call([]) } if callback
  []
end

#cleanup_expiredObject

Clean up expired clients



113
114
115
116
117
118
119
120
121
# File 'lib/faye/redis/client_registry.rb', line 113

def cleanup_expired
  all do |client_ids|
    client_ids.each do |client_id|
      exists?(client_id) do |exists|
        destroy(client_id) unless exists
      end
    end
  end
end

#create(client_id, &callback) ⇒ Object

Create a new client



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/faye/redis/client_registry.rb', line 14

def create(client_id, &callback)
  timestamp = Time.now.to_i
  client_data = {
    client_id: client_id,
    created_at: timestamp,
    last_ping: timestamp,
    server_id: server_id
  }

  @connection.with_redis do |redis|
    redis.multi do |multi|
      multi.hset(client_key(client_id), client_data.transform_keys(&:to_s))
      multi.sadd(clients_index_key, client_id)
      multi.expire(client_key(client_id), client_timeout)
    end
  end

  EventMachine.next_tick { callback.call(true) } if callback
rescue => e
  log_error("Failed to create client #{client_id}: #{e.message}")
  EventMachine.next_tick { callback.call(false) } if callback
end

#destroy(client_id, &callback) ⇒ Object

Destroy a client



38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/faye/redis/client_registry.rb', line 38

def destroy(client_id, &callback)
  @connection.with_redis do |redis|
    redis.multi do |multi|
      multi.del(client_key(client_id))
      multi.srem(clients_index_key, client_id)
    end
  end

  EventMachine.next_tick { callback.call(true) } if callback
rescue => e
  log_error("Failed to destroy client #{client_id}: #{e.message}")
  EventMachine.next_tick { callback.call(false) } if callback
end

#exists?(client_id, &callback) ⇒ Boolean

Check if a client exists

Returns:

  • (Boolean)


53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/faye/redis/client_registry.rb', line 53

def exists?(client_id, &callback)
  result = @connection.with_redis do |redis|
    redis.exists?(client_key(client_id))
  end

  # Redis 5.x returns boolean, older versions return integer
  exists = result.is_a?(Integer) ? result > 0 : result

  EventMachine.next_tick { callback.call(exists) } if callback
  exists
rescue => e
  log_error("Failed to check client existence #{client_id}: #{e.message}")
  EventMachine.next_tick { callback.call(false) } if callback
  false
end

#get(client_id, &callback) ⇒ Object

Get client data



84
85
86
87
88
89
90
91
92
93
94
95
96
# File 'lib/faye/redis/client_registry.rb', line 84

def get(client_id, &callback)
  data = @connection.with_redis do |redis|
    redis.hgetall(client_key(client_id))
  end

  client_data = data.empty? ? nil : symbolize_keys(data)
  EventMachine.next_tick { callback.call(client_data) } if callback
  client_data
rescue => e
  log_error("Failed to get client #{client_id}: #{e.message}")
  EventMachine.next_tick { callback.call(nil) } if callback
  nil
end

#ping(client_id) ⇒ Object

Ping a client to keep it alive



70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/faye/redis/client_registry.rb', line 70

def ping(client_id)
  timestamp = Time.now.to_i

  @connection.with_redis do |redis|
    redis.multi do |multi|
      multi.hset(client_key(client_id), 'last_ping', timestamp)
      multi.expire(client_key(client_id), client_timeout)
    end
  end
rescue => e
  log_error("Failed to ping client #{client_id}: #{e.message}")
end