From 87f407db3ebac3dfaf53e19590e8707bd0183496 Mon Sep 17 00:00:00 2001 From: Ilia Kasianenko Date: Wed, 12 Dec 2018 15:42:34 +0200 Subject: Add Missing ActiveSupport::Rescuable to ActionCable::Channel [timthez, Ilia Kasianenko] --- actioncable/lib/action_cable/channel/base.rb | 4 ++++ actioncable/test/channel/base_test.rb | 18 +++++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/actioncable/lib/action_cable/channel/base.rb b/actioncable/lib/action_cable/channel/base.rb index 70c93ec0f3..ad0d3685cd 100644 --- a/actioncable/lib/action_cable/channel/base.rb +++ b/actioncable/lib/action_cable/channel/base.rb @@ -1,6 +1,7 @@ # frozen_string_literal: true require "set" +require "active_support/rescuable" module ActionCable module Channel @@ -99,6 +100,7 @@ module ActionCable include Streams include Naming include Broadcasting + include ActiveSupport::Rescuable attr_reader :params, :connection, :identifier delegate :logger, to: :connection @@ -267,6 +269,8 @@ module ActionCable else public_send action end + rescue Exception => exception + rescue_with_handler(exception) || raise end def action_signature(action, data) diff --git a/actioncable/test/channel/base_test.rb b/actioncable/test/channel/base_test.rb index eb0e1673b0..c2968226c7 100644 --- a/actioncable/test/channel/base_test.rb +++ b/actioncable/test/channel/base_test.rb @@ -26,6 +26,9 @@ class ActionCable::Channel::BaseTest < ActionCable::TestCase after_subscribe :toggle_subscribed after_unsubscribe :toggle_subscribed + class SomeCustomError < StandardError; end + rescue_from SomeCustomError, with: :error_handler + def initialize(*) @subscribed = false super @@ -68,10 +71,18 @@ class ActionCable::Channel::BaseTest < ActionCable::TestCase @last_action = [ :receive ] end + def error_action + raise SomeCustomError + end + private def rm_rf @last_action = [ :rm_rf ] end + + def error_handler + @last_action = [ :error_action ] + end end setup do @@ -168,7 +179,7 @@ class ActionCable::Channel::BaseTest < ActionCable::TestCase end test "actions available on Channel" do - available_actions = %w(room last_action subscribed unsubscribed toggle_subscribed leave speak subscribed? get_latest receive chatters topic).to_set + available_actions = %w(room last_action subscribed unsubscribed toggle_subscribed leave speak subscribed? get_latest receive chatters topic error_action).to_set assert_equal available_actions, ChatChannel.action_methods end @@ -256,6 +267,11 @@ class ActionCable::Channel::BaseTest < ActionCable::TestCase end end + test "behaves like rescuable" do + @channel.perform_action "action" => :error_action + assert_equal [ :error_action ], @channel.last_action + end + private def assert_logged(message) old_logger = @connection.logger -- cgit v1.2.3