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