Introduction
dry-events is a library providing pub/sub API allowing you to create event publishers and a convenient way of subscribing to the events. This library is used as the pub/sub backend in dry-monitor, which also powers monitoring plugin in dry-system.
Quick start
Publishers are created using Dry::Events::Publisher
extension, which is created by providing a unique identifier. An extended class can be used to define the type of events it can publish:
require 'dry/events/publisher'
class Application
include Dry::Events::Publisher[:my_publisher]
register_event('users.created')
end
You can publish events via Publisher#publish
method:
app = Application.new
app.publish('users.created', user: 'Jane')
Subscribing to events
There are two ways that you can use to subscribe to events:
- Block-based subscription
- Event listener objects, where a naming convention is used in order to determine which methods should respond to events
Block-based subscribers
To subscribe to an event using a block, simply pass it to Publisher#subscribe
method:
app.subscribe('users.created') do |event|
puts "EVENT #{event.id}"
puts "USER #{event[:user]}"
end
app.publish('users.created', user: 'Jane')
# output:
# EVENT users.created
# USER Jane
Event listeners
An event listener object must implement methods that correspond to the following naming convention:
"users.created"
event is handled by#on_users_created
method
Here's a simple example:
class EventListener
def on_users_created(event)
puts "EVENT #{event.id}"
puts "USER #{event[:user]}"
end
end
event_listener = EventListener.new
app.subscribe(event_listener)
app.publish('users.created', user: 'Jane')
# output:
# EVENT users.created
# USER Jane
You can also unsubscribe an event listener via Publisher#unsubscribe
method:
app.unsubscribe(event_listener)
# this will no longer invoke event_listener
app.publish('users.created', user: 'Jane')