class NotificationTracer::Subscriber
Attributes
callback[R]
cleaner[R]
pattern[R]
real_subscriber[R]
Public Class Methods
new(pattern:, callback:, cleaner: nil)
click to toggle source
# File lib/notification_tracer/subscriber.rb, line 5 def initialize(pattern:, callback:, cleaner: nil) @pattern = pattern.freeze @callback = callback @cleaner = setup_cleaner(cleaner) end
Public Instance Methods
subscribe(silent: false)
click to toggle source
# File lib/notification_tracer/subscriber.rb, line 15 def subscribe(silent: false) @real_subscriber = nil if real_subscriber && !listening? @real_subscriber ||= notifier.subscribe(pattern) do |*args| event = ActiveSupport::Notifications::Event.new(*args) trace(event: event, stack: caller) end subscription_error('subscribe') if !silent && !subscribed? self end
subscribed?()
click to toggle source
# File lib/notification_tracer/subscriber.rb, line 11 def subscribed? !!real_subscriber && listening? end
unsubscribe(silent: false)
click to toggle source
# File lib/notification_tracer/subscriber.rb, line 25 def unsubscribe(silent: false) if real_subscriber notifier.unsubscribe(real_subscriber) if listening? subscription_error('unsubscribe') if !silent else @real_subscriber = nil end end self end
Private Instance Methods
listening?()
click to toggle source
# File lib/notification_tracer/subscriber.rb, line 59 def listening? name = pattern.is_a?(Regexp) ? pattern.source : pattern notifier.notifier.listeners_for(name).include?(real_subscriber) end
notifier()
click to toggle source
# File lib/notification_tracer/subscriber.rb, line 41 def notifier ActiveSupport::Notifications end
setup_cleaner(input)
click to toggle source
# File lib/notification_tracer/subscriber.rb, line 49 def setup_cleaner(input) if input.nil? ActiveSupport::BacktraceCleaner.new elsif input.respond_to?(:clean) input else raise ArgumentError, "cleaner must respond to clean: #{input.inspect}" end end
subscription_error(type)
click to toggle source
# File lib/notification_tracer/subscriber.rb, line 45 def subscription_error(type) raise SubscriptionError, "#{type} failed for #{pattern}" end
trace(event:, stack:)
click to toggle source
# File lib/notification_tracer/subscriber.rb, line 64 def trace(event:, stack:) callback.call( stack: cleaner.clean(stack), payload: event.payload, duration: event.duration, event_id: event.transaction_id, event_name: event.name ) end