Skip to content

Commit

Permalink
Use prepend to patch Action Cable classes
Browse files Browse the repository at this point in the history
To preserve the original functionality a better monkey-patching technique than copying the code should be used, e.g., Module#prepend

Fixes roidrage#304
  • Loading branch information
palkan committed May 6, 2020
1 parent 1729eab commit 143767a
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 48 deletions.
25 changes: 8 additions & 17 deletions lib/lograge/rails_ext/action_cable/channel/base.rb
Original file line number Diff line number Diff line change
@@ -1,30 +1,21 @@
module ActionCable
module Channel
class Base
module Lograge
module ActionCable
module ChannelInstrumentation
def subscribe_to_channel
ActiveSupport::Notifications.instrument('subscribe.action_cable', notification_payload('subscribe')) do
run_callbacks :subscribe do
subscribed
end

reject_subscription if subscription_rejected?
ensure_confirmation_sent
end
ActiveSupport::Notifications.instrument('subscribe.action_cable', notification_payload('subscribe')) { super }
end

def unsubscribe_from_channel
ActiveSupport::Notifications.instrument('unsubscribe.action_cable', notification_payload('unsubscribe')) do
run_callbacks :unsubscribe do
unsubscribed
end
end
ActiveSupport::Notifications.instrument('unsubscribe.action_cable', notification_payload('unsubscribe')) { super }
end

private

def notification_payload(method_name)
{ channel_class: self.class.name, action: method_name }
{channel_class: self.class.name, action: method_name}
end
end
end
end

ActionCable::Channel::Base.prepend(Lograge::ActionCable::ChannelInstrumentation)
39 changes: 8 additions & 31 deletions lib/lograge/rails_ext/action_cable/connection/base.rb
Original file line number Diff line number Diff line change
@@ -1,42 +1,19 @@
module ActionCable
module Connection
class Base
# rubocop:disable Metrics/MethodLength
module Lograge
module ActionCable
module ConnectionInstrumentation
def handle_open
ActiveSupport::Notifications.instrument('connect.action_cable', notification_payload('connect')) do
begin
@protocol = websocket.protocol
connect if respond_to?(:connect)
subscribe_to_internal_channel
send_welcome_message

message_buffer.process!
server.add_connection(self)
rescue ActionCable::Connection::Authorization::UnauthorizedError
respond_to_invalid_request
end
end
ActiveSupport::Notifications.instrument('connect.action_cable', notification_payload('connect')) { super }
end
# rubocop:enable Metrics/MethodLength

def handle_close
ActiveSupport::Notifications.instrument('disconnect.action_cable', notification_payload('disconnect')) do
logger.info finished_request_message if Lograge.lograge_config.keep_original_rails_log

server.remove_connection(self)

subscriptions.unsubscribe_from_all
unsubscribe_from_internal_channel

disconnect if respond_to?(:disconnect)
end
ActiveSupport::Notifications.instrument('disconnect.action_cable', notification_payload('disconnect')) { super }
end

private

def notification_payload(method_name)
{ connection_class: self.class.name, action: method_name, data: request.params }
{connection_class: self.class.name, action: method_name, data: request.params}
end
end
end
end

ActionCable::Connection::Base.prepend(Lograge::ActionCable::ConnectionInstrumentation)

0 comments on commit 143767a

Please sign in to comment.