Class: CMDx::Telemetry
- Inherits:
-
Object
- Object
- CMDx::Telemetry
- Defined in:
- lib/cmdx/telemetry.rb
Overview
Defined Under Namespace
Classes: Event
Constant Summary collapse
- EVENTS =
Lifecycle event names Runtime emits.
%i[ task_started task_deprecated task_retried task_rolled_back task_executed ].freeze
Instance Attribute Summary collapse
-
#registry ⇒ Object
readonly
Returns the value of attribute registry.
Instance Method Summary collapse
-
#count ⇒ Integer
Total subscribers across all events.
-
#emit(event, payload) ⇒ void
Dispatches
payloadto every subscriber ofevent. - #empty? ⇒ Boolean
-
#initialize ⇒ Telemetry
constructor
A new instance of Telemetry.
- #initialize_copy(source) ⇒ void
-
#size ⇒ Integer
Number of subscribed events.
-
#subscribe(event, callable = nil, &block) {|evt| ... } ⇒ Telemetry
Registers a subscriber for
event. -
#subscribed?(event) ⇒ Boolean
True when at least one subscriber exists for
event. -
#unsubscribe(event, callable) ⇒ Telemetry
Removes a previously registered subscriber.
Constructor Details
#initialize ⇒ Telemetry
Returns a new instance of Telemetry.
37 38 39 |
# File 'lib/cmdx/telemetry.rb', line 37 def initialize @registry = {} end |
Instance Attribute Details
#registry ⇒ Object (readonly)
Returns the value of attribute registry.
35 36 37 |
# File 'lib/cmdx/telemetry.rb', line 35 def registry @registry end |
Instance Method Details
#count ⇒ Integer
Returns total subscribers across all events.
105 106 107 |
# File 'lib/cmdx/telemetry.rb', line 105 def count registry.each_value.sum(&:size) end |
#emit(event, payload) ⇒ void
This method returns an undefined value.
Dispatches payload to every subscriber of event. No-op when there
are no subscribers.
115 116 117 118 119 |
# File 'lib/cmdx/telemetry.rb', line 115 def emit(event, payload) return unless (subscribers = registry[event]) subscribers.each { |s| s.call(payload) } end |
#empty? ⇒ Boolean
95 96 97 |
# File 'lib/cmdx/telemetry.rb', line 95 def empty? registry.empty? end |
#initialize_copy(source) ⇒ void
This method returns an undefined value.
43 44 45 |
# File 'lib/cmdx/telemetry.rb', line 43 def initialize_copy(source) @registry = source.registry.transform_values(&:dup) end |
#size ⇒ Integer
Returns number of subscribed events.
100 101 102 |
# File 'lib/cmdx/telemetry.rb', line 100 def size registry.size end |
#subscribe(event, callable = nil, &block) {|evt| ... } ⇒ Telemetry
Registers a subscriber for event.
56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
# File 'lib/cmdx/telemetry.rb', line 56 def subscribe(event, callable = nil, &block) subscriber = callable || block if callable && block raise ArgumentError, "provide either a callable or a block, not both" elsif !subscriber.respond_to?(:call) raise ArgumentError, "subscriber must respond to #call" elsif !EVENTS.include?(event) raise ArgumentError, "unknown event #{event.inspect}, must be one of #{EVENTS.join(', ')}" end (registry[event] ||= []) << subscriber self end |
#subscribed?(event) ⇒ Boolean
Returns true when at least one subscriber exists for event.
90 91 92 |
# File 'lib/cmdx/telemetry.rb', line 90 def subscribed?(event) registry.key?(event) end |
#unsubscribe(event, callable) ⇒ Telemetry
Removes a previously registered subscriber. Drops the event entry entirely when no subscribers remain.
78 79 80 81 82 83 84 85 86 |
# File 'lib/cmdx/telemetry.rb', line 78 def unsubscribe(event, callable) raise ArgumentError, "unknown event #{event.inspect}, must be one of #{EVENTS.join(', ')}" unless EVENTS.include?(event) return self unless subscribed?(event) registry[event].delete(callable) registry.delete(event) if registry[event].empty? self end |