mirror of
https://github.com/cyberarm/cyberarm_engine.git
synced 2026-05-06 07:58:15 +00:00
Added EventBus, a simple global pub-sub event system.
This commit is contained in:
@@ -10,6 +10,7 @@ require "json"
|
|||||||
require_relative "cyberarm_engine/version"
|
require_relative "cyberarm_engine/version"
|
||||||
require_relative "cyberarm_engine/stats"
|
require_relative "cyberarm_engine/stats"
|
||||||
require_relative "cyberarm_engine/result"
|
require_relative "cyberarm_engine/result"
|
||||||
|
require_relative "cyberarm_engine/event_bus"
|
||||||
|
|
||||||
require_relative "cyberarm_engine/common"
|
require_relative "cyberarm_engine/common"
|
||||||
|
|
||||||
|
|||||||
39
lib/cyberarm_engine/event_bus.rb
Normal file
39
lib/cyberarm_engine/event_bus.rb
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
module CyberarmEngine
|
||||||
|
class EventBus
|
||||||
|
Subscriber = Data.define(:event, :listener, :method, :callback)
|
||||||
|
@subscribers = []
|
||||||
|
|
||||||
|
def self.subscribe(event, listener = nil, method = nil, &block)
|
||||||
|
raise "Subscriber cannot have both a method AND a callback block" if method && block_given?
|
||||||
|
|
||||||
|
subscriber = Subscriber.new(event, listener, method, block)
|
||||||
|
@subscribers << subscriber
|
||||||
|
|
||||||
|
subscriber
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.unsubscribe(event, listener_or_subscriber)
|
||||||
|
@subscribers.delete_if { |s| s.event == event && (s == listener_or_subscriber || s.listener == listener_or_subscriber) }
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.unsubscribe!(event)
|
||||||
|
@subscribers.delete_if { |s| s.event == event }
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.announce(event, *payload)
|
||||||
|
subscribers = @subscribers.select { |s| s.event == event }
|
||||||
|
|
||||||
|
subscribers.each do |subscriber|
|
||||||
|
subscriber&.listener&.send(subscriber.method, *payload) if subscriber&.method
|
||||||
|
subscriber.callback&.call(*payload)
|
||||||
|
rescue StandardError => e
|
||||||
|
# TODO
|
||||||
|
warn "Failed to deliver event (#{event}) to listener (#{subscriber.inspect}): #{e}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.publish(*args)
|
||||||
|
announce(*args)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
Reference in New Issue
Block a user