class Realm::EventRouter

Public Class Methods

new(gateways_spec, prefix: nil) click to toggle source
# File lib/realm/event_router.rb, line 9
def initialize(gateways_spec, prefix: nil)
  @prefix = prefix
  @auto_registered = false
  @default_namespace = nil
  init_gateways(gateways_spec)
end

Public Instance Methods

active_queues() click to toggle source
# File lib/realm/event_router.rb, line 36
def active_queues
  auto_register_handlers
  @gateways.values.reduce([]) do |queues, gateway|
    queues + gateway.queues
  end
end
add_listener(event_type, listener, namespace: nil) click to toggle source
# File lib/realm/event_router.rb, line 20
def add_listener(event_type, listener, namespace: nil)
  gateway_for(namespace).add_listener(event_type, listener)
end
register(handler_class) click to toggle source
# File lib/realm/event_router.rb, line 16
def register(handler_class)
  gateway_for(handler_class.try(:event_namespace)).register(handler_class)
end
trigger(identifier, attributes = {}) click to toggle source
# File lib/realm/event_router.rb, line 24
def trigger(identifier, attributes = {})
  namespace, event_type = identifier.to_s.include?('/') ? identifier.split('/') : [nil, identifier]
  gateway_for(namespace).trigger(event_type, attributes)
end
workers(*namespaces, **options) click to toggle source
# File lib/realm/event_router.rb, line 29
def workers(*namespaces, **options)
  auto_register_handlers
  @gateways.filter_map do |(namespace, gateway)|
    gateway.worker(**options) if namespaces.empty? || namespaces.include?(namespace)
  end
end

Private Instance Methods

auto_register_handlers() click to toggle source
# File lib/realm/event_router.rb, line 72
def auto_register_handlers
  return if @auto_registered || !domain_resolver

  @auto_registered = true
  domain_resolver.all_event_handlers.each { |klass| register(klass) }
end
default_namespace() click to toggle source
# File lib/realm/event_router.rb, line 85
def default_namespace
  return @default_namespace if @default_namespace

  @gateways.keys[0] if @gateways.keys.size == 1
end
gateway_class(type) click to toggle source
# File lib/realm/event_router.rb, line 56
def gateway_class(type)
  return InternalLoopGateway if type.to_s == 'internal_loop'

  runtime.container.resolve("event_router.gateway_classes.#{type}")
end
gateway_for(namespace) click to toggle source
# File lib/realm/event_router.rb, line 79
def gateway_for(namespace)
  @gateways.fetch(namespace.try(:to_sym) || default_namespace) do
    raise "No event gateway for #{namespace || 'default'} namespace" # TODO: extract error class
  end
end
init_gateways(gateways_spec) click to toggle source
# File lib/realm/event_router.rb, line 45
def init_gateways(gateways_spec)
  auto_register_on_init = false
  @gateways = gateways_spec.each_with_object({}) do |(namespace, config), gateways|
    gateway_class = gateway_class(config.fetch(:type))
    auto_register_on_init ||= gateway_class.auto_register_on_init
    gateways[namespace] = instantiate_gateway(namespace, gateway_class, config)
    @default_namespace = namespace if config[:default]
  end
  auto_register_handlers if auto_register_on_init
end
instantiate_gateway(namespace, klass, config) click to toggle source
# File lib/realm/event_router.rb, line 62
def instantiate_gateway(namespace, klass, config)
  klass.new(
    namespace: namespace,
    queue_prefix: @prefix,
    event_factory: EventFactory.new(config.fetch(:events_module)),
    runtime: runtime,
    **config.except(:type, :default, :events_module),
  )
end