Packages
event_bus
1.3.4
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 - Please prefer always latest minor
Current section
Files
Jump to
Current section
Files
lib/event_bus/managers/store.ex
defmodule EventBus.Manager.Store do
@moduledoc false
###########################################################################
# Event store is a storage handler for events. It allows to create and delete
# stores for a topic. And allows fetching, deleting and saving events for the
# topic.
###########################################################################
use GenServer
alias EventBus.Model.Event
alias EventBus.Service.Store, as: StoreService
@backend StoreService
@doc false
def start_link do
GenServer.start_link(__MODULE__, nil, name: __MODULE__)
end
@doc false
def init(args) do
{:ok, args}
end
@doc """
Check if the topic exists?
It's important to keep this in blocking manner to prevent double creations in
sub modules
"""
@spec exist?(String.t() | atom()) :: boolean()
def exist?(topic) do
GenServer.call(__MODULE__, {:exist?, topic})
end
@doc """
Register a topic to the store
"""
@spec register_topic(String.t() | atom()) :: :ok
def register_topic(topic) do
GenServer.call(__MODULE__, {:register_topic, topic})
end
@doc """
Unregister the topic from the store
"""
@spec unregister_topic(String.t() | atom()) :: :ok
def unregister_topic(topic) do
GenServer.call(__MODULE__, {:unregister_topic, topic})
end
@doc """
Save an event to the store
"""
@spec create(Event.t()) :: :ok
def create(%Event{} = event) do
GenServer.call(__MODULE__, {:create, event})
end
@doc """
Delete an event from the store
"""
@spec delete({atom(), String.t() | integer()}) :: no_return()
def delete({topic, id}) do
GenServer.cast(__MODULE__, {:delete, {topic, id}})
end
###########################################################################
# DELEGATIONS
###########################################################################
@doc """
Fetch an event from the store
"""
@spec fetch({atom(), String.t() | integer()}) :: any()
defdelegate fetch(event_shadow),
to: @backend,
as: :fetch
###########################################################################
# PRIVATE API
###########################################################################
@doc false
@spec handle_call({:register_topic, atom()}, any(), term())
:: {:reply, :ok, term()}
def handle_call({:register_topic, topic}, _from, state) do
@backend.register_topic(topic)
{:reply, :ok, state}
end
@spec handle_call({:unregister_topic, atom()}, any(), term())
:: {:reply, :ok, term()}
def handle_call({:unregister_topic, topic}, _from, state) do
@backend.unregister_topic(topic)
{:reply, :ok, state}
end
@doc false
@spec handle_call({:exist?, atom()}, any(), term())
:: {:reply, boolean(), nil}
def handle_call({:exist?, topic}, _from, state) do
{:reply, @backend.exist?(topic), state}
end
@doc false
@spec handle_call({:create, Event.t()}, any(), term()) :: no_return()
def handle_call({:create, event}, _from, state) do
@backend.create(event)
{:reply, :ok, state}
end
@spec handle_cast({:delete, {atom(), String.t() | integer()}}, term())
:: no_return()
def handle_cast({:delete, {topic, id}}, state) do
@backend.delete({topic, id})
{:noreply, state}
end
end