aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/action_cable/connection/base.rb10
-rw-r--r--lib/action_cable/connection/identification.rb4
-rw-r--r--lib/action_cable/connection/tagged_logger_proxy.rb12
-rw-r--r--lib/action_cable/engine.rb5
-rw-r--r--lib/action_cable/helpers/action_cable_helper.rb29
-rw-r--r--lib/action_cable/process/logging.rb2
-rw-r--r--lib/action_cable/server/configuration.rb9
-rw-r--r--lib/action_cable/server/worker/active_record_connection_management.rb2
-rw-r--r--lib/assets/javascripts/cable.coffee.erb6
9 files changed, 67 insertions, 12 deletions
diff --git a/lib/action_cable/connection/base.rb b/lib/action_cable/connection/base.rb
index 6df168e4c3..7e9eec7508 100644
--- a/lib/action_cable/connection/base.rb
+++ b/lib/action_cable/connection/base.rb
@@ -56,7 +56,7 @@ module ActionCable
def initialize(server, env)
@server, @env = server, env
- @logger = new_tagged_logger || server.logger
+ @logger = new_tagged_logger
@websocket = ActionCable::Connection::WebSocket.new(env)
@subscriptions = ActionCable::Connection::Subscriptions.new(self)
@@ -172,7 +172,7 @@ module ActionCable
def allow_request_origin?
return true if server.config.disable_request_forgery_protection
- if Array(server.config.allowed_request_origins).include? env['HTTP_ORIGIN']
+ if Array(server.config.allowed_request_origins).any? { |allowed_origin| allowed_origin === env['HTTP_ORIGIN'] }
true
else
logger.error("Request origin not allowed: #{env['HTTP_ORIGIN']}")
@@ -194,10 +194,8 @@ module ActionCable
# Tags are declared in the server but computed in the connection. This allows us per-connection tailored tags.
def new_tagged_logger
- if server.logger.respond_to?(:tagged)
- TaggedLoggerProxy.new server.logger,
- tags: server.config.log_tags.map { |tag| tag.respond_to?(:call) ? tag.call(request) : tag.to_s.camelize }
- end
+ TaggedLoggerProxy.new server.logger,
+ tags: server.config.log_tags.map { |tag| tag.respond_to?(:call) ? tag.call(request) : tag.to_s.camelize }
end
def started_request_message
diff --git a/lib/action_cable/connection/identification.rb b/lib/action_cable/connection/identification.rb
index 431493aa70..2d75ff8d6d 100644
--- a/lib/action_cable/connection/identification.rb
+++ b/lib/action_cable/connection/identification.rb
@@ -34,8 +34,8 @@ module ActionCable
private
def connection_gid(ids)
ids.map do |o|
- if o.respond_to? :to_global_id
- o.to_global_id
+ if o.respond_to? :to_gid_param
+ o.to_gid_param
else
o.to_s
end
diff --git a/lib/action_cable/connection/tagged_logger_proxy.rb b/lib/action_cable/connection/tagged_logger_proxy.rb
index 34063c1d42..e5319087fb 100644
--- a/lib/action_cable/connection/tagged_logger_proxy.rb
+++ b/lib/action_cable/connection/tagged_logger_proxy.rb
@@ -16,6 +16,15 @@ module ActionCable
@tags = @tags.uniq
end
+ def tag(logger)
+ if logger.respond_to?(:tagged)
+ current_tags = tags - logger.formatter.current_tags
+ logger.tagged(*current_tags) { yield }
+ else
+ yield
+ end
+ end
+
%i( debug info warn error fatal unknown ).each do |severity|
define_method(severity) do |message|
log severity, message
@@ -24,8 +33,7 @@ module ActionCable
protected
def log(type, message)
- current_tags = tags - @logger.formatter.current_tags
- @logger.tagged(*current_tags) { @logger.send type, message }
+ tag(@logger) { @logger.send type, message }
end
end
end
diff --git a/lib/action_cable/engine.rb b/lib/action_cable/engine.rb
index 613a9b99f2..4777c3886b 100644
--- a/lib/action_cable/engine.rb
+++ b/lib/action_cable/engine.rb
@@ -1,10 +1,15 @@
require 'rails/engine'
require 'active_support/ordered_options'
+require 'action_cable/helpers/action_cable_helper'
module ActionCable
class Engine < ::Rails::Engine
config.action_cable = ActiveSupport::OrderedOptions.new
+ config.to_prepare do
+ ApplicationController.helper ActionCable::Helpers::ActionCableHelper
+ end
+
initializer "action_cable.logger" do
ActiveSupport.on_load(:action_cable) { self.logger ||= ::Rails.logger }
end
diff --git a/lib/action_cable/helpers/action_cable_helper.rb b/lib/action_cable/helpers/action_cable_helper.rb
new file mode 100644
index 0000000000..b82751468a
--- /dev/null
+++ b/lib/action_cable/helpers/action_cable_helper.rb
@@ -0,0 +1,29 @@
+module ActionCable
+ module Helpers
+ module ActionCableHelper
+ # Returns an "action-cable-url" meta tag with the value of the url specified in your
+ # configuration. Ensure this is above your javascript tag:
+ #
+ # <head>
+ # <%= action_cable_meta_tag %>
+ # <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
+ # </head>
+ #
+ # This is then used by ActionCable to determine the url of your websocket server.
+ # Your CoffeeScript can then connect to the server without needing to specify the
+ # url directly:
+ #
+ # #= require cable
+ # @App = {}
+ # App.cable = Cable.createConsumer()
+ #
+ # Make sure to specify the correct server location in each of your environments
+ # config file:
+ #
+ # config.action_cable.url = "ws://example.com:28080"
+ def action_cable_meta_tag
+ tag "meta", name: "action-cable-url", content: Rails.application.config.action_cable.url
+ end
+ end
+ end
+end
diff --git a/lib/action_cable/process/logging.rb b/lib/action_cable/process/logging.rb
index 72b1a080d1..618ba7357a 100644
--- a/lib/action_cable/process/logging.rb
+++ b/lib/action_cable/process/logging.rb
@@ -8,3 +8,5 @@ EM.error_handler do |e|
end
Celluloid.logger = ActionCable.server.logger
+
+ActionCable.server.config.log_to_stdout if Rails.env.development? \ No newline at end of file
diff --git a/lib/action_cable/server/configuration.rb b/lib/action_cable/server/configuration.rb
index b22de273b8..f7fcee019b 100644
--- a/lib/action_cable/server/configuration.rb
+++ b/lib/action_cable/server/configuration.rb
@@ -9,6 +9,7 @@ module ActionCable
attr_accessor :connection_class, :worker_pool_size
attr_accessor :redis_path, :channels_path
attr_accessor :disable_request_forgery_protection, :allowed_request_origins
+ attr_accessor :url
def initialize
@logger = Rails.logger
@@ -23,6 +24,14 @@ module ActionCable
@disable_request_forgery_protection = false
end
+ def log_to_stdout
+ console = ActiveSupport::Logger.new($stdout)
+ console.formatter = @logger.formatter
+ console.level = @logger.level
+
+ @logger.extend(ActiveSupport::Logger.broadcast(console))
+ end
+
def channel_paths
@channels ||= Dir["#{channels_path}/**/*_channel.rb"]
end
diff --git a/lib/action_cable/server/worker/active_record_connection_management.rb b/lib/action_cable/server/worker/active_record_connection_management.rb
index 1ede0095f8..ecece4e270 100644
--- a/lib/action_cable/server/worker/active_record_connection_management.rb
+++ b/lib/action_cable/server/worker/active_record_connection_management.rb
@@ -12,7 +12,7 @@ module ActionCable
end
def with_database_connections
- ActiveRecord::Base.logger.tagged(*connection.logger.tags) { yield }
+ connection.logger.tag(ActiveRecord::Base.logger) { yield }
ensure
ActiveRecord::Base.clear_active_connections!
end
diff --git a/lib/assets/javascripts/cable.coffee.erb b/lib/assets/javascripts/cable.coffee.erb
index 8498233c11..25a9fc79c2 100644
--- a/lib/assets/javascripts/cable.coffee.erb
+++ b/lib/assets/javascripts/cable.coffee.erb
@@ -4,5 +4,9 @@
@Cable =
INTERNAL: <%= ActionCable::INTERNAL.to_json %>
- createConsumer: (url) ->
+ createConsumer: (url = @getConfig("url")) ->
new Cable.Consumer url
+
+ getConfig: (name) ->
+ element = document.head.querySelector("meta[name='action-cable-#{name}']")
+ element?.getAttribute("content")