Class: ActiveMatrix::EventRouter

Inherits:
Object
  • Object
show all
Includes:
Logging, Singleton
Defined in:
lib/active_matrix/event_router.rb

Overview

Routes Matrix events to appropriate agents

Instance Method Summary collapse

Methods included from Logging

included, #logger, #logger=

Constructor Details

#initializeEventRouter

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.message}"
  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_summaryObject

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

Returns:

  • (Boolean)


79
80
81
# File 'lib/active_matrix/event_router.rb', line 79

def running?
  @processing && @worker_thread&.alive?
end

#startObject

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

#stopObject

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