Class: Textus::Hooks::RpcRegistry

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

Instance Method Summary collapse

Constructor Details

#initializeRpcRegistry

Returns a new instance of RpcRegistry.



6
7
8
# File 'lib/textus/hooks/rpc_registry.rb', line 6

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

Instance Method Details

#callable(event, name) ⇒ Object



27
28
29
# File 'lib/textus/hooks/rpc_registry.rb', line 27

def callable(event, name)
  @table[event.to_sym][name.to_sym] or raise UsageError.new("unknown #{event}: #{name}")
end

#invoke(event, name, caps:, **other) ⇒ Object

Invoke a registered callable, injecting ‘caps:` only if the callable declares it (or accepts keyrest). Mis-named kwargs (e.g. the legacy `store:`) are rejected at registration time, not here.



34
35
36
37
38
39
40
# File 'lib/textus/hooks/rpc_registry.rb', line 34

def invoke(event, name, caps:, **other)
  blk = callable(event, name)
  sig = Signature.new(blk)
  kwargs = other.dup
  kwargs[:caps] = caps if sig.accepts_keyrest? || sig.declared_keys.include?(:caps)
  blk.call(**kwargs)
end

#names(event) ⇒ Object



25
# File 'lib/textus/hooks/rpc_registry.rb', line 25

def names(event) = @table[event.to_sym].keys

#register(event, name, &blk) ⇒ Object

Raises:



10
11
12
13
14
15
16
17
18
19
20
21
22
23
# File 'lib/textus/hooks/rpc_registry.rb', line 10

def register(event, name, &blk)
  event_sym = event.to_sym
  raise UsageError.new("#{event_sym} is a pubsub event; register on EventBus") if Catalog::PUBSUB.key?(event_sym)

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

  name = name.to_sym
  raise UsageError.new("#{event_sym} '#{name}' already registered") if @table[event_sym].key?(name)

  @table[event_sym][name] = blk
end