From 4c5d5b75abe85d59e5cc9de9904fdef3b23ec25b Mon Sep 17 00:00:00 2001 From: Jon Moss Date: Fri, 15 Jan 2016 19:07:18 -0500 Subject: ActionCable::StorageAdapter ==> ActionCable::SubscriptionAdapter --- .../lib/action_cable/subscription_adapter/redis.rb | 45 ++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 actioncable/lib/action_cable/subscription_adapter/redis.rb (limited to 'actioncable/lib/action_cable/subscription_adapter/redis.rb') diff --git a/actioncable/lib/action_cable/subscription_adapter/redis.rb b/actioncable/lib/action_cable/subscription_adapter/redis.rb new file mode 100644 index 0000000000..c6d8371f16 --- /dev/null +++ b/actioncable/lib/action_cable/subscription_adapter/redis.rb @@ -0,0 +1,45 @@ +begin + require 'em-hiredis' + require 'redis' +rescue Gem::LoadError => e + raise Gem::LoadError, "You are trying to use the Redis ActionCable adapter, but do not have the proper gems installed. Add `gem 'em-hiredis'` and `gem 'redis'` to your Gemfile (and ensure its version is at the minimum required by ActionCable)." +end + +module ActionCable + module SubscriptionAdapter + class Redis < Base + def broadcast(channel, payload) + redis_conn.publish(channel, payload) + end + + def subscribe(channel, message_callback, success_callback = nil) + hi_redis_conn.pubsub.subscribe(channel, &message_callback).tap do |result| + result.callback(&success_callback) if success_callback + end + end + + def unsubscribe(channel, message_callback) + hi_redis_conn.pubsub.unsubscribe_proc(channel, message_callback) + end + + private + + # The redis instance used for broadcasting. Not intended for direct user use. + def redis_conn + @broadcast ||= ::Redis.new(@server.config.config_opts) + end + + # The EventMachine Redis instance used by the pubsub adapter. + def hi_redis_conn + @hi_redis_conn ||= EM::Hiredis.connect(@server.config.cable[:url]).tap do |redis| + redis.on(:reconnect_failed) do + @logger.info "[ActionCable] Redis reconnect failed." + end + end + end + def redis_conn + @redis_conn ||= ::Redis.new(@server.config.cable) + end + end + end +end -- cgit v1.2.3