aboutsummaryrefslogblamecommitdiffstats
path: root/lib/action_cable/channel/redis.rb
blob: 6fc6ac179feba61488d2fc922002d92fb7dea484 (plain) (tree)
1
2
3
4
5
6
7
8
9







                                                       
                                         


                                                     
                                                                 
                               

                                                       
                                                                        
                                                  




                                           
                                                        
                                                                            

                                                        

             


                                                  
                                                                               



                                                         



       
module ActionCable
  module Channel

    module Redis
      extend ActiveSupport::Concern

      included do
        on_unsubscribe :unsubscribe_from_redis_channels
        delegate :pubsub, to: :connection
      end

      def subscribe_to(redis_channel, callback = nil)
        callback ||= default_subscription_callback(redis_channel)
        @_redis_channels ||= []
        @_redis_channels << [ redis_channel, callback ]

        logger.info "Subscribing to the redis channel: #{redis_channel}"
        pubsub.subscribe(redis_channel, &callback)
      end

      protected
        def unsubscribe_from_redis_channels
          if @_redis_channels
            @_redis_channels.each do |channel, callback|
              logger.info "Unsubscribing from the redis channel: #{channel}"
              pubsub.unsubscribe_proc(channel, callback)
            end
          end
        end

        def default_subscription_callback(channel)
          -> (message) do
            logger.info "Received a message over the redis channel: #{channel}"
            broadcast ActiveSupport::JSON.decode(message)
          end
        end

    end

  end
end