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