Module: Legion::Events

Defined in:
lib/legion/events.rb

Class Method Summary collapse

Class Method Details

.clearObject



55
56
57
# File 'lib/legion/events.rb', line 55

def clear
  @listeners = nil
end

.emit(event_name, **payload) ⇒ Object



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/legion/events.rb', line 23

def emit(event_name, **payload)
  Legion::Logging.debug "[Events] emit: #{event_name}" if defined?(Legion::Logging)
  event = {
    event:     event_name.to_s,
    timestamp: Time.now,
    **payload
  }

  listeners[event_name.to_s].each do |listener|
    listener.call(event)
  rescue StandardError => e
    Legion::Logging.log_exception(e, payload_summary: "[Events] listener error on #{event_name}", component_type: :event)
  end

  # Also fire wildcard listeners
  listeners['*'].each do |listener|
    listener.call(event)
  rescue StandardError => e
    Legion::Logging.warn "[Events] wildcard listener error on #{event_name}: #{e.message}"
  end

  event
end

.listener_count(event_name = nil) ⇒ Object



59
60
61
62
63
64
65
# File 'lib/legion/events.rb', line 59

def listener_count(event_name = nil)
  if event_name
    listeners[event_name.to_s].size
  else
    listeners.values.sum(&:size)
  end
end

.listenersObject



6
7
8
# File 'lib/legion/events.rb', line 6

def listeners
  @listeners ||= Hash.new { |h, k| h[k] = [] }
end

.off(event_name, block = nil) ⇒ Object



15
16
17
18
19
20
21
# File 'lib/legion/events.rb', line 15

def off(event_name, block = nil)
  if block
    listeners[event_name.to_s].delete(block)
  else
    listeners.delete(event_name.to_s)
  end
end

.on(event_name, &block) ⇒ Object



10
11
12
13
# File 'lib/legion/events.rb', line 10

def on(event_name, &block)
  listeners[event_name.to_s] << block
  block
end

.once(event_name, &block) ⇒ Object



47
48
49
50
51
52
53
# File 'lib/legion/events.rb', line 47

def once(event_name, &block)
  wrapper = proc do |event|
    block.call(event)
    off(event_name, wrapper)
  end
  on(event_name, &wrapper)
end