Packages
event_bus
1.1.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 - Please prefer always latest minor
Current section
Files
Jump to
Current section
Files
lib/event_bus/subscription.ex
defmodule EventBus.Subscription do
@moduledoc false
###########################################################################
# Subscription manager
###########################################################################
use GenServer
@backend Application.get_env(
:event_bus,
:subscription_backend,
EventBus.Service.Subscription
)
@doc false
def start_link,
do: GenServer.start_link(__MODULE__, nil, name: __MODULE__)
@doc false
def init(args),
do: {:ok, args}
@doc """
Subscribe the listener to topics
"""
@spec subscribe({tuple() | module(), list()}) :: no_return()
def subscribe({listener, topics}),
do: GenServer.cast(__MODULE__, {:subscribe, {listener, topics}})
@doc """
Unsubscribe the listener
"""
@spec unsubscribe({tuple() | module()}) :: no_return()
def unsubscribe(listener),
do: GenServer.cast(__MODULE__, {:unsubscribe, listener})
@doc """
Set listeners to the topic
"""
@spec register_topic(atom()) :: no_return()
def register_topic(topic),
do: GenServer.cast(__MODULE__, {:register_topic, topic})
@doc """
Unset listeners from the topic
"""
@spec unregister_topic(atom()) :: no_return()
def unregister_topic(topic),
do: GenServer.cast(__MODULE__, {:unregister_topic, topic})
###########################################################################
# DELEGATIONS
###########################################################################
@doc """
Fetch listeners
"""
@spec subscribers() :: list(any())
defdelegate subscribers,
to: @backend,
as: :subscribers
@doc """
Fetch listeners of the topic
"""
@spec subscribers(String.t() | atom()) :: list(any())
defdelegate subscribers(topic),
to: @backend,
as: :subscribers
###########################################################################
# PRIVATE API
###########################################################################
@doc false
@spec handle_cast({:subscribe, tuple()}, nil) :: no_return()
def handle_cast({:subscribe, {listener, topics}}, state) do
@backend.subscribe({listener, topics})
{:noreply, state}
end
@doc false
@spec handle_cast({:unsubscribe, tuple() | module()}, nil) :: no_return()
def handle_cast({:unsubscribe, listener}, state) do
@backend.unsubscribe(listener)
{:noreply, state}
end
@doc false
@spec handle_cast({:register_topic, atom()}, nil) :: no_return()
def handle_cast({:register_topic, topic}, state) do
@backend.register_topic(topic)
{:noreply, state}
end
@doc false
@spec handle_cast({:unregister_topic, atom()}, nil) :: no_return()
def handle_cast({:unregister_topic, topic}, state) do
@backend.unregister_topic(topic)
{:noreply, state}
end
end