Sha256: ed85552eb2727308bb082a3c8df18d81b14a1c76d3fd3c87da2279f6f3c84cdc

Contents?: true

Size: 1.79 KB

Versions: 1

Compression:

Stored size: 1.79 KB

Contents

class Redis
  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)
      @callbacks["subscribe"] = block
    end

    def unsubscribe(&block)
      @callbacks["unsubscribe"] = block
    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

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
redis-2.0.0.rc1 lib/redis/subscribe.rb