Packages
event_bus
0.6.0
1.7.0
1.6.2
1.6.1
1.6.0
retired
1.5.2
retired
1.5.1
retired
1.5.0
retired
1.4.4
retired
1.4.3
retired
1.4.2
retired
1.4.1
retired
1.4.0
retired
1.3.8
retired
1.3.7
retired
1.3.6
retired
1.3.5
retired
1.3.4
retired
1.3.3
retired
1.3.2
retired
1.3.1
retired
1.3.0
retired
1.2.0
retired
1.1.3
retired
1.1.2
retired
1.1.1
retired
1.1.0
retired
1.0.0
retired
1.0.0-beta4
retired
1.0.0-beta3
retired
1.0.0-beta2
retired
1.0.0-beta1
retired
0.9.0
retired
0.8.0
retired
0.7.0
retired
0.6.1
retired
0.6.0
retired
0.5.0
retired
0.4.1
retired
0.4.0
retired
0.3.1
retired
0.3.0
retired
0.2.1
retired
0.2.0
retired
0.1.0
retired
Traceable, extendable and minimalist event bus implementation for Elixir with built-in event store and event watcher based on ETS
Retired package: Deprecated
Current section
Files
Jump to
Current section
Files
lib/event_bus/event_manager.ex
defmodule EventBus.EventManager do
@moduledoc """
Event Manager
"""
require Logger
use GenServer
alias EventBus.EventStore
alias EventBus.EventWatcher
alias EventBus.Model.Event
@logging_level :info
@doc false
def start_link do
GenServer.start_link(__MODULE__, nil, name: __MODULE__)
end
@spec notify(list(module()), Event.t) :: no_return()
@doc false
def notify(listeners, event) do
GenServer.cast(__MODULE__, {:notify, listeners, event})
end
@doc false
@spec handle_cast(tuple(), nil) :: no_return()
def handle_cast({:notify, listeners, %Event{id: id, topic: topic} = event},
state) do
:ok = EventStore.save(event)
:ok = EventWatcher.create({listeners, topic, id})
notify_listeners(listeners, {topic, id})
{:noreply, state}
end
@spec notify_listeners(list(module()), tuple()) :: no_return()
defp notify_listeners(listeners, event_shadow) do
Enum.each(listeners, fn listener ->
notify_listener(listener, event_shadow)
end)
end
@spec notify_listener(module(), tuple()) :: no_return()
defp notify_listener(listener, {topic, id}) do
listener.process({topic, id})
rescue
err ->
Logger.log(@logging_level,
fn -> "#{listener}.process/1 raised an error!\n#{inspect(err)}" end)
EventWatcher.mark_as_skipped({listener, topic, id})
end
end