EventBus

Build Status

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.3.1"}]
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’ with listener and list of given topics, EventManager will match with Regex

# to catch every event topic
EventBus.subscribe({MyEventListener, [".*"]})

# to catch specific topics
EventBus.subscribe({MyEventListener, ["purchase_", "booking_confirmed$", "flight_passed$"]})

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"])

Fetch event data

EventBus.fetch_event_data({:bye_received, event_key})

Mark as completed on Event Watcher

EventBus.mark_as_completed({MyEventListener, :bye_received, event_key})

Mark as skipped on Event Watcher

EventBus.mark_as_skipped({MyEventListener, :bye_received, event_key})

Sample Listener Implementation

defmodule MyEventListener do
  ...

  def process({topic, key} = event_shadow) do
    GenServer.cast(__MODULE__, event_shadow)
    :ok
  end

  ...


  def handle_cast({:bye_received, event_key}, state) do
    event_data = EventBus.fetch_event_data({:bye_received, event_key})
    # do sth with event_data

    # update the watcher!
    EventBus.mark_as_completed({__MODULE__, :bye_received, event_key})
    ...
    {:noreply, state}
  end
  def handle_cast({:hello_received, event_key}, state) do
    event_data = EventBus.fetch_event_data({:hello_received, event_key})
    # do sth with event_data

    # update the watcher!
    EventBus.mark_as_completed({__MODULE__, :hello_received, event_key})
    ...
    {:noreply, state}
  end
  def handle_cast({topic, key}, state) do
    EventBus.mark_as_skipped({__MODULE__, topic, key})
    {:noreply, state}
  end

  ...
end

Module Documentation

Module docs can be found at https://hexdocs.pm/event_bus.

Contributing

Issues, Bugs, Documentation, Enhancements

  1. Fork the project

  2. Make your improvements and write your tests(make sure you covered all the cases).

  3. Make a pull request.

License

MIT