lib/wisper/temporary_listeners.rb
# Handles temporary global subscriptions
# @api private
module Wisper
class TemporaryListeners
def self.subscribe(*listeners, **options, &block)
new.subscribe(*listeners, **options, &block)
end
def self.registrations
new.registrations
end
def subscribe(*listeners, **options, &_block)
new_registrations = build_registrations(*listeners, **options)
begin
registrations.merge new_registrations
yield
ensure
registrations.subtract new_registrations
end
self
end
def registrations
Thread.current[key] ||= Set.new
end
private
def build_registrations(*listeners, **options)
listeners.map { |listener| ObjectRegistration.new(listener, **options) }
end
def key
'__wisper_temporary_listeners'
end
end
end