EventBus
Simple event bus implementation using ETS as an event store.
Installation
The package can be installed by adding event_bus
to your list of dependencies in mix.exs
:
def deps do
[{:event_bus, "~> 0.2.0"}]
end
Usage
Register events in config.exs
(recommended way)
In your config.exs you can register events
config :event_bus, events: [:message_received, :another_event_occured]
Register events on demand
EventBus.register_event(:my_test_event_occured)
Subscribe to the ‘event bus’
EventBus.subscribe(MyEventListener)
Unsubscribe from the ‘event bus’
EventBus.unsubscribe(MyEventListener)
List subscribers
EventBus.subscribers()
Notify all subscribers with any type of data
EventBus.notify(:hello_received, %{message: "Hello"})
EventBus.notify(:bye_received, [user_id: 1, goal: "exit"])
Sample Listener Implementation
defmodule MyEventListener do
...
alias EventBus.EventWatcher
alias EventBus.EventStore
def process({:hello_received, event_key} = event_shadow) do
GenServer.cast(__MODULE__, event_shadow)
end
def process({:bye_received, event_key}) do
event_data = EventStore.fetch({:bye_received, event_key})
# do sth with event_data
# update the watcher!
EventWatcher.complete({__MODULE__, :bye_received, event_key})
:ok
end
def process({event_type, event_key}) do
EventWatcher.skip({__MODULE__, event_type, event_key})
:ok
end
def handle_cast({:hello_received, event_key}, state) do
event_data = EventStore.fetch({:hello_received, event_key})
# do sth with event_data
# update the watcher!
EventWatcher.complete({__MODULE__, :hello_received, event_key})
...
{:noreply, state}
end
...
end
Module Documentation
Module docs can be found at https://hexdocs.pm/event_bus.
Contributing
Issues, Bugs, Documentation, Enhancements
Fork the project
Make your improvements and write your tests(make sure you covered all the cases).
Make a pull request.
License
MIT