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 ‘payload` to every subscriber of `event`.
- #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.
23 24 25 |
# File 'lib/cmdx/telemetry.rb', line 23 def initialize @registry = {} end |
Instance Attribute Details
#registry ⇒ Object (readonly)
Returns the value of attribute registry.
21 22 23 |
# File 'lib/cmdx/telemetry.rb', line 21 def registry @registry end |
Instance Method Details
#count ⇒ Integer
Returns total subscribers across all events.
91 92 93 |
# File 'lib/cmdx/telemetry.rb', line 91 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.
101 102 103 104 105 |
# File 'lib/cmdx/telemetry.rb', line 101 def emit(event, payload) return unless (subscribers = registry[event]) subscribers.each { |s| s.call(payload) } end |
#empty? ⇒ Boolean
81 82 83 |
# File 'lib/cmdx/telemetry.rb', line 81 def empty? registry.empty? end |
#initialize_copy(source) ⇒ void
This method returns an undefined value.
29 30 31 |
# File 'lib/cmdx/telemetry.rb', line 29 def initialize_copy(source) @registry = source.registry.transform_values(&:dup) end |
#size ⇒ Integer
Returns number of subscribed events.
86 87 88 |
# File 'lib/cmdx/telemetry.rb', line 86 def size registry.size end |
#subscribe(event, callable = nil, &block) {|evt| ... } ⇒ Telemetry
Registers a subscriber for ‘event`.
42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
# File 'lib/cmdx/telemetry.rb', line 42 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`.
76 77 78 |
# File 'lib/cmdx/telemetry.rb', line 76 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.
64 65 66 67 68 69 70 71 72 |
# File 'lib/cmdx/telemetry.rb', line 64 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 |