aboutsummaryrefslogtreecommitdiffstats
path: root/actioncable
diff options
context:
space:
mode:
authorVladimir Dementyev <dementiev.vm@gmail.com>2018-12-14 16:46:39 -0500
committerVladimir Dementyev <dementiev.vm@gmail.com>2019-02-12 17:17:46 -0500
commit3cd69fa2c025da1cc45b1b9b43b227cceb025837 (patch)
treeacd23f3be831673cb04a49ef847aff6876c47c57 /actioncable
parent7432e251873690234d0d288e8eb009fbee80b635 (diff)
downloadrails-3cd69fa2c025da1cc45b1b9b43b227cceb025837.tar.gz
rails-3cd69fa2c025da1cc45b1b9b43b227cceb025837.tar.bz2
rails-3cd69fa2c025da1cc45b1b9b43b227cceb025837.zip
Allow passing custom config to ActionCable::Server::Base
That allows us to create a separate, isolated Action Cable server instance within the same app.
Diffstat (limited to 'actioncable')
-rw-r--r--actioncable/CHANGELOG.md23
-rw-r--r--actioncable/lib/action_cable/server/base.rb7
-rw-r--r--actioncable/test/subscription_adapter/channel_prefix.rb10
3 files changed, 29 insertions, 11 deletions
diff --git a/actioncable/CHANGELOG.md b/actioncable/CHANGELOG.md
index 42edbd6954..3ce35edbb8 100644
--- a/actioncable/CHANGELOG.md
+++ b/actioncable/CHANGELOG.md
@@ -1,3 +1,26 @@
+* Allow passing custom configuration to `ActionCable::Server::Base`.
+
+ You can now create a standalone Action Cable server with a custom configuration
+ (e.g. to run it in isolation from the default one):
+
+ ```ruby
+ config = ActionCable::Server::Configuration.new
+ config.cable = { adapter: "redis", channel_prefix: "custom_" }
+
+ CUSTOM_CABLE = ActionCable::Server::Base.new(config: config)
+ ```
+
+ Then you can mount it in the `routes.rb` file:
+
+ ```ruby
+ Rails.application.routes.draw do
+ mount CUSTOM_CABLE => "/custom_cable"
+ # ...
+ end
+ ```
+
+ *Vladimir Dementyev*
+
* Add `:action_cable_connection` and `:action_cable_channel` load hooks.
You can use them to extend `ActionCable::Connection::Base` and `ActionCable::Channel::Base`
diff --git a/actioncable/lib/action_cable/server/base.rb b/actioncable/lib/action_cable/server/base.rb
index 2b9e1cba3b..98b3743175 100644
--- a/actioncable/lib/action_cable/server/base.rb
+++ b/actioncable/lib/action_cable/server/base.rb
@@ -12,14 +12,17 @@ module ActionCable
include ActionCable::Server::Broadcasting
include ActionCable::Server::Connections
- cattr_accessor :config, instance_accessor: true, default: ActionCable::Server::Configuration.new
+ cattr_accessor :config, instance_accessor: false, default: ActionCable::Server::Configuration.new
+
+ attr_reader :config
def self.logger; config.logger; end
delegate :logger, to: :config
attr_reader :mutex
- def initialize
+ def initialize(config: self.class.config)
+ @config = config
@mutex = Monitor.new
@remote_connections = @event_loop = @worker_pool = @pubsub = nil
end
diff --git a/actioncable/test/subscription_adapter/channel_prefix.rb b/actioncable/test/subscription_adapter/channel_prefix.rb
index 3071facd9d..475e6cfd3a 100644
--- a/actioncable/test/subscription_adapter/channel_prefix.rb
+++ b/actioncable/test/subscription_adapter/channel_prefix.rb
@@ -2,17 +2,9 @@
require "test_helper"
-class ActionCable::Server::WithIndependentConfig < ActionCable::Server::Base
- # ActionCable::Server::Base defines config as a class variable.
- # Need config to be an instance variable here as we're testing 2 separate configs
- def config
- @config ||= ActionCable::Server::Configuration.new
- end
-end
-
module ChannelPrefixTest
def test_channel_prefix
- server2 = ActionCable::Server::WithIndependentConfig.new
+ server2 = ActionCable::Server::Base.new(config: ActionCable::Server::Configuration.new)
server2.config.cable = alt_cable_config
server2.config.logger = Logger.new(StringIO.new).tap { |l| l.level = Logger::UNKNOWN }