Class: ActiveMatrix::EventRouter
- Inherits:
-
Object
- Object
- ActiveMatrix::EventRouter
- Includes:
- Logging, Singleton
- Defined in:
- lib/active_matrix/event_router.rb
Overview
Routes Matrix events to appropriate agents
Instance Method Summary collapse
-
#broadcast_event(event) ⇒ Object
Broadcast an event to all agents.
-
#clear_agent_routes(agent_id) ⇒ Object
Clear all routes for an agent.
-
#initialize ⇒ EventRouter
constructor
A new instance of EventRouter.
-
#register_route(agent_id:, room_id: nil, event_type: nil, user_id: nil, priority: 50, &block) ⇒ Object
Register an event route.
-
#route_event(event) ⇒ Object
Route an event to appropriate agents.
-
#routes_summary ⇒ Object
Get routes for debugging.
-
#running? ⇒ Boolean
Check if router is running.
-
#start ⇒ Object
Start the event router.
-
#stop ⇒ Object
Stop the event router.
-
#unregister_route(route_id) ⇒ Object
Unregister a route.
Methods included from Logging
Constructor Details
#initialize ⇒ EventRouter
Returns a new instance of EventRouter.
12 13 14 15 16 17 |
# File 'lib/active_matrix/event_router.rb', line 12 def initialize @routes = Concurrent::Array.new @event_queue = Queue.new @processing = false @worker_thread = nil end |
Instance Method Details
#broadcast_event(event) ⇒ Object
Broadcast an event to all agents
89 90 91 92 93 94 95 |
# File 'lib/active_matrix/event_router.rb', line 89 def broadcast_event(event) AgentRegistry.instance.all_instances.each do |bot| bot._handle_event(event) if bot.respond_to?(:_handle_event) rescue StandardError => e logger.error "Error broadcasting to bot: #{e.}" end end |
#clear_agent_routes(agent_id) ⇒ Object
Clear all routes for an agent
44 45 46 |
# File 'lib/active_matrix/event_router.rb', line 44 def clear_agent_routes(agent_id) @routes.delete_if { |route| route[:agent_id] == agent_id } end |
#register_route(agent_id:, room_id: nil, event_type: nil, user_id: nil, priority: 50, &block) ⇒ Object
Register an event route
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
# File 'lib/active_matrix/event_router.rb', line 20 def register_route(agent_id:, room_id: nil, event_type: nil, user_id: nil, priority: 50, &block) route = { id: SecureRandom.uuid, agent_id: agent_id, room_id: room_id, event_type: event_type, user_id: user_id, priority: priority, handler: block } @routes << route @routes.sort_by! { |r| -r[:priority] } # Higher priority first logger.debug "Registered route: #{route.except(:handler).inspect}" route[:id] end |
#route_event(event) ⇒ Object
Route an event to appropriate agents
49 50 51 52 53 54 |
# File 'lib/active_matrix/event_router.rb', line 49 def route_event(event) return unless @processing # Queue the event for processing @event_queue << event end |
#routes_summary ⇒ Object
Get routes for debugging
84 85 86 |
# File 'lib/active_matrix/event_router.rb', line 84 def routes_summary @routes.map { |r| r.except(:handler) } end |
#running? ⇒ Boolean
Check if router is running
79 80 81 |
# File 'lib/active_matrix/event_router.rb', line 79 def running? @processing && @worker_thread&.alive? end |
#start ⇒ Object
Start the event router
57 58 59 60 61 62 63 64 65 66 67 |
# File 'lib/active_matrix/event_router.rb', line 57 def start return if @processing @processing = true @worker_thread = Thread.new do Thread.current.name = 'event-router' process_events end logger.info 'Event router started' end |
#stop ⇒ Object
Stop the event router
70 71 72 73 74 75 76 |
# File 'lib/active_matrix/event_router.rb', line 70 def stop @processing = false @worker_thread&.kill @event_queue.clear logger.info 'Event router stopped' end |
#unregister_route(route_id) ⇒ Object
Unregister a route
39 40 41 |
# File 'lib/active_matrix/event_router.rb', line 39 def unregister_route(route_id) @routes.delete_if { |route| route[:id] == route_id } end |