Class: Textus::Hooks::EventBus

Inherits:
Object
  • Object
show all
Defined in:
lib/textus/hooks/event_bus.rb

Defined Under Namespace

Classes: HookTimeout

Constant Summary collapse

HOOK_TIMEOUT_SECONDS =
2

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(error_log: ErrorLog.new) ⇒ EventBus

Returns a new instance of EventBus.



10
11
12
13
14
# File 'lib/textus/hooks/event_bus.rb', line 10

def initialize(error_log: ErrorLog.new)
  @pubsub = Hash.new { |h, k| h[k] = [] }
  @error_handlers = []
  @error_log = error_log
end

Instance Attribute Details

#error_logObject (readonly)

Returns the value of attribute error_log.



16
17
18
# File 'lib/textus/hooks/event_bus.rb', line 16

def error_log
  @error_log
end

Instance Method Details

#listeners(event, key:) ⇒ Object



39
# File 'lib/textus/hooks/event_bus.rb', line 39

def listeners(event, key:) = @pubsub[event.to_sym].select { |h| match?(h[:keys], key) }

#on(event, name, keys: nil) ⇒ Object



18
# File 'lib/textus/hooks/event_bus.rb', line 18

def on(event, name, keys: nil, &) = register(event, name, keys: keys, &)

#on_error(&block) ⇒ Object



37
# File 'lib/textus/hooks/event_bus.rb', line 37

def on_error(&block) = @error_handlers << block

#publish(event, strict: false, **kwargs) ⇒ Object



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/textus/hooks/event_bus.rb', line 43

def publish(event, strict: false, **kwargs)
  key = kwargs[:key] || "-"
  fired = []
  errored = []
  timed_out = []
  raised = nil

  @pubsub[event.to_sym].each do |sub|
    next unless match?(sub[:keys], key)

    outcome, err = invoke(event, sub, key, kwargs)
    case outcome
    when :ok        then fired << sub[:name]
    when :errored   then errored << sub[:name]
    when :timed_out then timed_out << sub[:name]
    end
    raised ||= err if strict && err
  end

  raise raised if strict && raised

  FireReport.new(fired: fired, errored: errored, timed_out: timed_out)
end

#pubsub_handlers(event) ⇒ Object



41
# File 'lib/textus/hooks/event_bus.rb', line 41

def pubsub_handlers(event) = @pubsub[event.to_sym]

#register(event, name, keys: nil, &blk) ⇒ Object

Raises:



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/textus/hooks/event_bus.rb', line 20

def register(event, name, keys: nil, &blk)
  event_sym = event.to_sym
  raise UsageError.new("#{event_sym} is an RPC event; register on RpcRegistry") if Catalog::RPC.key?(event_sym)

  required = Catalog::PUBSUB[event_sym] or raise UsageError.new("unknown event: #{event}")
  sig = Signature.new(blk)
  missing = sig.missing(required)
  if missing.any?
    raise UsageError.new("#{event_sym} hooks must accept kwargs: #{required.join(", ")} (missing: #{missing.join(", ")})")
  end

  name = name.to_sym
  raise UsageError.new("#{event_sym} hook '#{name}' already registered") if @pubsub[event_sym].any? { |h| h[:name] == name }

  @pubsub[event_sym] << { name: name, callable: blk, keys: keys }
end