Skip to content

Commit a756274

Browse files
committedOct 27, 2013
Adds a dependency on Redis-Objects. Fix Channel manager's channel token synchronization
1 parent 47ce5eb commit a756274

File tree

5 files changed

+39
-17
lines changed

5 files changed

+39
-17
lines changed
 

‎Gemfile.lock

+8-5
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ PATH
88
rack
99
rails
1010
redis
11+
redis-objects
1112
thin
1213

1314
GEM
@@ -41,7 +42,7 @@ GEM
4142
multi_json (~> 1.3)
4243
thread_safe (~> 0.1)
4344
tzinfo (~> 0.3.37)
44-
arel (4.0.0)
45+
arel (4.0.1)
4546
atomic (1.1.10)
4647
atomic (1.1.10-java)
4748
builder (3.1.4)
@@ -100,7 +101,7 @@ GEM
100101
mime-types (~> 1.16)
101102
treetop (~> 1.4.8)
102103
method_source (0.8.1)
103-
mime-types (1.23)
104+
mime-types (1.25)
104105
minitest (4.7.5)
105106
multi_json (1.7.7)
106107
polyglot (0.3.3)
@@ -135,7 +136,9 @@ GEM
135136
ffi (>= 0.5.0)
136137
rb-kqueue (0.2.0)
137138
ffi (>= 0.5.0)
138-
redis (3.0.4)
139+
redis (3.0.5)
140+
redis-objects (0.7.0)
141+
redis (>= 3.0.2)
139142
ref (1.0.5)
140143
rspec (2.13.0)
141144
rspec-core (~> 2.13.0)
@@ -172,7 +175,7 @@ GEM
172175
multi_json (~> 1.0)
173176
rack (~> 1.0)
174177
tilt (~> 1.1, != 1.3.0)
175-
sprockets-rails (2.0.0)
178+
sprockets-rails (2.0.1)
176179
actionpack (>= 3.0)
177180
activesupport (>= 3.0)
178181
sprockets (~> 2.8)
@@ -191,7 +194,7 @@ GEM
191194
thread_safe (0.1.0)
192195
atomic
193196
tilt (1.4.1)
194-
treetop (1.4.14)
197+
treetop (1.4.15)
195198
polyglot
196199
polyglot (>= 0.3.1)
197200
tzinfo (0.3.37)

‎lib/websocket_rails/channel.rb

+6-3
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,12 @@ class Channel
55

66
delegate :config, :channel_tokens, :channel_manager, :to => WebsocketRails
77

8-
attr_reader :name, :subscribers, :token
8+
attr_reader :name, :subscribers
99

1010
def initialize(channel_name)
1111
@subscribers = []
1212
@name = channel_name
1313
@private = false
14-
@token = generate_unique_token
1514
end
1615

1716
def subscribe(connection)
@@ -55,12 +54,16 @@ def is_private?
5554
@private
5655
end
5756

57+
def token
58+
@token ||= channel_tokens[@name] ||= generate_unique_token
59+
end
60+
5861
private
5962

6063
def generate_unique_token
6164
begin
6265
token = SecureRandom.urlsafe_base64
63-
end while channel_tokens.include?(token)
66+
end while channel_tokens.values.include?(token)
6467

6568
token
6669
end

‎lib/websocket_rails/channel_manager.rb

+13-2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
require 'redis-objects'
2+
13
module WebsocketRails
24

35
class << self
@@ -18,11 +20,20 @@ def channel_tokens
1820

1921
class ChannelManager
2022

21-
attr_reader :channels, :channel_tokens
23+
attr_reader :channels
2224

2325
def initialize
2426
@channels = {}.with_indifferent_access
25-
@channel_tokens = []
27+
end
28+
29+
def channel_tokens
30+
@channel_tokens ||= begin
31+
if WebsocketRails.synchronize?
32+
::Redis::HashKey.new('websocket_rails.channel_tokens', Synchronization.redis)
33+
else
34+
{}
35+
end
36+
end
2637
end
2738

2839
def [](channel)

‎lib/websocket_rails/synchronization.rb

+11-7
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,21 @@ def self.shutdown!
3333
singleton.shutdown!
3434
end
3535

36+
def self.redis
37+
singleton.redis
38+
end
39+
3640
def self.singleton
3741
@singleton ||= new
3842
end
3943

4044
include Logging
4145

4246
def redis
43-
@redis ||= Redis.new(WebsocketRails.config.redis_options)
47+
@redis ||= begin
48+
redis_options = WebsocketRails.config.redis_options
49+
EM.reactor_running? ? Redis.new(redis_options) : ruby_redis
50+
end
4451
end
4552

4653
def ruby_redis
@@ -52,9 +59,8 @@ def ruby_redis
5259

5360
def publish(event)
5461
Fiber.new do
55-
redis_client = EM.reactor_running? ? redis : ruby_redis
5662
event.server_token = server_token
57-
redis_client.publish "websocket_rails.events", event.serialize
63+
redis.publish "websocket_rails.events", event.serialize
5864
end.resume
5965
end
6066

@@ -157,16 +163,14 @@ def destroy_user(identifier)
157163

158164
def find_user(identifier)
159165
Fiber.new do
160-
redis_client = EM.reactor_running? ? redis : ruby_redis
161-
raw_user = redis_client.hget('websocket_rails.users', identifier)
166+
raw_user = redis.hget('websocket_rails.users', identifier)
162167
raw_user ? JSON.parse(raw_user) : nil
163168
end.resume
164169
end
165170

166171
def all_users
167172
Fiber.new do
168-
redis_client = EM.reactor_running? ? redis : ruby_redis
169-
redis_client.hgetall('websocket_rails.users')
173+
redis.hgetall('websocket_rails.users')
170174
end.resume
171175
end
172176

‎websocket-rails.gemspec

+1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ Gem::Specification.new do |s|
2525
s.add_dependency "redis"
2626
s.add_dependency "hiredis"
2727
s.add_dependency "em-synchrony"
28+
s.add_dependency "redis-objects"
2829
s.add_development_dependency "rake"
2930
s.add_development_dependency "rspec-rails"
3031
s.add_development_dependency 'rspec-matchers-matchers'

0 commit comments

Comments
 (0)
Please sign in to comment.