lib/redis/subscribe.rb in redis-1.0.7 vs lib/redis/subscribe.rb in redis-2.0.0.rc1
- old
+ new
@@ -1,16 +1,89 @@
class Redis
- class Subscription
+ class SubscribedClient
+ def initialize(client)
+ @client = client
+ end
+
+ def call(command, *args)
+ @client.call_async(command, *args)
+ end
+
+ def subscribe(*channels, &block)
+ @client.call_async(:subscribe, *channels)
+
+ sub = Subscription.new(&block)
+
+ begin
+ loop do
+ type, channel, message = @client.read
+ sub.callbacks[type].call(channel, message)
+ break if type == "unsubscribe" && message == 0
+ end
+ ensure
+ @client.call_async(:unsubscribe)
+ end
+ end
+
+ def unsubscribe(*channels)
+ @client.call_async(:unsubscribe, *channels)
+ @client
+ end
+
+ def psubscribe(*channels, &block)
+ @client.call_async(:psubscribe, *channels)
+
+ sub = Subscription.new(&block)
+
+ begin
+ loop do
+ type, pattern, channel, message = @client.read
+ sub.callbacks[type].call(pattern, channel, message)
+ break if type == "punsubscribe" && channel == 0
+ end
+ ensure
+ @client.call_async(:punsubscribe)
+ end
+ end
+
+ def punsubscribe(*channels)
+ @client.call_async(:punsubscribe, *channels)
+ @client
+ end
+ end
+
+ class Subscription
+ attr :callbacks
+
+ def initialize
+ @callbacks = Hash.new do |hash, key|
+ hash[key] = lambda { |*_| }
+ end
+
+ yield(self)
+ end
+
def subscribe(&block)
- if block_given? then @subscribe = block else @subscribe end
+ @callbacks["subscribe"] = block
end
-
- def unsubscribe(&block)
- if block_given? then @unsubscribe = block else @unsubscribe end
+
+ def unsubscribe(&block)
+ @callbacks["unsubscribe"] = block
end
-
- def message(&block)
- if block_given? then @message = block else @message end
+
+ def message(&block)
+ @callbacks["message"] = block
end
-
+
+ def psubscribe(&block)
+ @callbacks["psubscribe"] = block
+ end
+
+ def punsubscribe(&block)
+ @callbacks["punsubscribe"] = block
+ end
+
+ def pmessage(&block)
+ @callbacks["pmessage"] = block
+ end
end
-end
\ No newline at end of file
+end