Current section

Files

Jump to
extreme lib extreme subscription.ex
Raw

lib/extreme/subscription.ex

defmodule Extreme.Subscription do
use GenServer
require Logger
alias Extreme.SharedSubscription, as: Shared
defmodule State do
defstruct ~w(base_name correlation_id subscriber stream read_params status)a
end
def start_link(
base_name,
correlation_id,
subscriber,
stream,
resolve_link_tos,
ack_timeout \\ 5_000
) do
GenServer.start_link(
__MODULE__,
{base_name, correlation_id, subscriber, stream, resolve_link_tos, ack_timeout}
)
end
@doc """
Calls `server` with :unsubscribe message. `server` can be either `Subscription` or `ReadingSubscription`.
"""
def unsubscribe(server),
do: GenServer.call(server, :unsubscribe)
@impl true
def init({base_name, correlation_id, subscriber, stream, resolve_link_tos, ack_timeout}) do
read_params = %{stream: stream, resolve_link_tos: resolve_link_tos, ack_timeout: ack_timeout}
state = %State{
base_name: base_name,
correlation_id: correlation_id,
subscriber: subscriber,
read_params: read_params,
status: :initialized
}
{:ok, _} = Shared.subscribe(state)
{:ok, state}
end
@impl true
def handle_call(:unsubscribe, from, state) do
:ok = Shared.unsubscribe(from, state)
{:noreply, state}
end
@impl true
def handle_cast({:process_push, fun}, state),
do: Shared.process_push(fun, state)
end