Skip to content

Commit

Permalink
Merge branch 'actioncable-notifications'
Browse files Browse the repository at this point in the history
  • Loading branch information
rafaelfranca committed Mar 30, 2016
2 parents 5870bc8 + edbfd10 commit 6b858fd
Show file tree
Hide file tree
Showing 3 changed files with 97 additions and 5 deletions.
4 changes: 4 additions & 0 deletions actioncable/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
* Add ActiveSupport::Notifications and ActiveSupport::LogSubscriber to ActionCable::Channel

*Matthew Wear*

* Allow channel identifiers with no backslahes/escaping to be accepted
by the subscription storer.

Expand Down
23 changes: 18 additions & 5 deletions actioncable/lib/action_cable/channel/base.rb
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,10 @@ def perform_action(data)
action = extract_action(data)

if processable_action?(action)
dispatch_action(action, data)
payload = { channel_class: self.class.name, action: action, data: data }
ActiveSupport::Notifications.instrument("perform_action.action_cable", payload) do
dispatch_action(action, data)
end
else
logger.error "Unable to process #{action_signature(action, data)}"
end
Expand Down Expand Up @@ -192,7 +195,11 @@ def unsubscribed
# the proper channel identifier marked as the recipient.
def transmit(data, via: nil)
logger.info "#{self.class.name} transmitting #{data.inspect.truncate(300)}".tap { |m| m << " (via #{via})" if via }
connection.transmit ActiveSupport::JSON.encode(identifier: @identifier, message: data)

payload = { channel_class: self.class.name, data: data, via: via }
ActiveSupport::Notifications.instrument("transmit.action_cable", payload) do
connection.transmit ActiveSupport::JSON.encode(identifier: @identifier, message: data)
end
end

def defer_subscription_confirmation!
Expand Down Expand Up @@ -265,8 +272,11 @@ def action_signature(action, data)
def transmit_subscription_confirmation
unless subscription_confirmation_sent?
logger.info "#{self.class.name} is transmitting the subscription confirmation"
connection.transmit ActiveSupport::JSON.encode(identifier: @identifier, type: ActionCable::INTERNAL[:message_types][:confirmation])
@subscription_confirmation_sent = true

ActiveSupport::Notifications.instrument("transmit_subscription_confirmation.action_cable", channel_class: self.class.name) do
connection.transmit ActiveSupport::JSON.encode(identifier: @identifier, type: ActionCable::INTERNAL[:message_types][:confirmation])
@subscription_confirmation_sent = true
end
end
end

Expand All @@ -277,7 +287,10 @@ def reject_subscription

def transmit_subscription_rejection
logger.info "#{self.class.name} is transmitting the subscription rejection"
connection.transmit ActiveSupport::JSON.encode(identifier: @identifier, type: ActionCable::INTERNAL[:message_types][:rejection])

ActiveSupport::Notifications.instrument("transmit_subscription_rejection.action_cable", channel_class: self.class.name) do
connection.transmit ActiveSupport::JSON.encode(identifier: @identifier, type: ActionCable::INTERNAL[:message_types][:rejection])
end
end
end
end
Expand Down
75 changes: 75 additions & 0 deletions actioncable/test/channel/base_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,81 @@ def rm_rf
end
end

test "notification for perform_action" do
begin
events = []
ActiveSupport::Notifications.subscribe "perform_action.action_cable" do |*args|
events << ActiveSupport::Notifications::Event.new(*args)
end

data = {'action' => :speak, 'content' => 'hello'}
@channel.perform_action data

assert_equal 1, events.length
assert_equal 'perform_action.action_cable', events[0].name
assert_equal 'ActionCable::Channel::BaseTest::ChatChannel', events[0].payload[:channel_class]
assert_equal :speak, events[0].payload[:action]
assert_equal data, events[0].payload[:data]
ensure
ActiveSupport::Notifications.unsubscribe "perform_action.action_cable"
end
end

test "notification for transmit" do
begin
events = []
ActiveSupport::Notifications.subscribe 'transmit.action_cable' do |*args|
events << ActiveSupport::Notifications::Event.new(*args)
end

@channel.perform_action 'action' => :get_latest
expected_data = {data: 'latest'}

assert_equal 1, events.length
assert_equal 'transmit.action_cable', events[0].name
assert_equal 'ActionCable::Channel::BaseTest::ChatChannel', events[0].payload[:channel_class]
assert_equal expected_data, events[0].payload[:data]
assert_nil events[0].payload[:via]
ensure
ActiveSupport::Notifications.unsubscribe 'transmit.action_cable'
end
end

test "notification for transmit_subscription_confirmation" do
begin
events = []
ActiveSupport::Notifications.subscribe 'transmit_subscription_confirmation.action_cable' do |*args|
events << ActiveSupport::Notifications::Event.new(*args)
end

@channel.stubs(:subscription_confirmation_sent?).returns(false)
@channel.send(:transmit_subscription_confirmation)

assert_equal 1, events.length
assert_equal 'transmit_subscription_confirmation.action_cable', events[0].name
assert_equal 'ActionCable::Channel::BaseTest::ChatChannel', events[0].payload[:channel_class]
ensure
ActiveSupport::Notifications.unsubscribe 'transmit_subscription_confirmation.action_cable'
end
end

test "notification for transmit_subscription_rejection" do
begin
events = []
ActiveSupport::Notifications.subscribe 'transmit_subscription_rejection.action_cable' do |*args|
events << ActiveSupport::Notifications::Event.new(*args)
end

@channel.send(:transmit_subscription_rejection)

assert_equal 1, events.length
assert_equal 'transmit_subscription_rejection.action_cable', events[0].name
assert_equal 'ActionCable::Channel::BaseTest::ChatChannel', events[0].payload[:channel_class]
ensure
ActiveSupport::Notifications.unsubscribe 'transmit_subscription_rejection.action_cable'
end
end

private
def assert_logged(message)
old_logger = @connection.logger
Expand Down

0 comments on commit 6b858fd

Please sign in to comment.