diff options
Diffstat (limited to 'lib/action_cable')
-rw-r--r-- | lib/action_cable/channel/base.rb | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/lib/action_cable/channel/base.rb b/lib/action_cable/channel/base.rb index ec14e13dfa..1a69d50885 100644 --- a/lib/action_cable/channel/base.rb +++ b/lib/action_cable/channel/base.rb @@ -38,14 +38,13 @@ module ActionCable def perform_action(data) if authorized? - action = (data['action'].presence || :receive).to_sym - signature = "#{self.class.name}##{action}: #{data}" + action = extract_action(data) - if self.class.instance_methods(false).include?(action) - logger.info "Processing #{signature}" + if performable_action?(action) + logger.info "Processing #{compose_signature(action, data)}" public_send action, data else - logger.error "Failed to process #{signature}" + logger.error "Failed to process #{compose_signature(action, data)}" end else unauthorized @@ -85,6 +84,23 @@ module ActionCable end private + def extract_action(data) + (data['action'].presence || :receive).to_sym + end + + def performable_action?(action) + self.class.instance_methods(false).include?(action) + end + + def compose_signature(action, data) + "#{self.class.name}##{action}".tap do |signature| + if (arguments = data.except('action')).any? + signature << ": #{arguments.inspect}" + end + end + end + + def run_subscribe_callbacks self.class.on_subscribe_callbacks.each { |callback| send(callback) } end |