alias Wampex.Client.Session, as: Sess
alias Wampex.Roles.{Callee, Subscriber}
- alias Wampex.Roles.Callee.{Register, Yield}
+ alias Wampex.Roles.Callee.{Register, Unregister, Yield}
alias Wampex.Roles.Caller
alias Wampex.Roles.Caller.Call
alias Wampex.Roles.Dealer.Result
end
end
+ @spec unregister(name :: module(), registration :: Unregister.t(), timeout :: integer()) ::
+ :ok
+ def unregister(name, %Unregister{registration_id: ri} = unreg, timeout \\ 5000) do
+ case sync(name, Callee.unregister(unreg), timeout) do
+ :ok ->
+ Registry.unregister(callee_registry_name(name), ri)
+ :ok
+
+ er ->
+ er
+ end
+ end
+
@spec add(name :: module(), pid :: module() | pid()) :: {:ok, pid()} | {:error, term()}
def add(name, pid) do
case session_exists(name) do
@moduledoc """
Macros and behaviours for client implementations
"""
- @callback do_init(any()) :: %{client_name: atom()}
+ @callback do_init(any()) :: %{client_name: atom(), registrations: map()}
require Logger
quote do
use GenServer
alias Wampex.Client
- alias Wampex.Roles.Callee.Yield
+ alias Wampex.Roles.Callee.{Unregister, Yield}
+ alias Wampex.Roles.Subscriber.Unsubscribe
alias Wampex.Roles.Peer.Error
require Logger
import unquote(__MODULE__)
end
@impl true
- def handle_continue({:registered, _}, state), do: {:noreply, state}
+ def handle_continue({:registered, registrations}, state),
+ do: {:noreply, %{state | registrations: registrations}}
+
+ @impl true
+ def terminate(_reason, %{
+ client_name: name,
+ registrations: %{subscriptions: subs, registrations: regs}
+ }) do
+ Enum.each(subs, fn id ->
+ Client.unsubscribe(name, %Unsubscribe{subscription_id: id})
+ end)
+
+ Enum.each(regs, fn id ->
+ Client.unregister(name, %Unregister{registration_id: id})
+ end)
+ end
def do_init(_opts), do: %{client_name: nil}
defp add_client(state, cn), do: Map.put(state, :client_name, cn)
- defoverridable start_link: 1, do_init: 1, handle_continue: 2
+ defoverridable start_link: 1, do_init: 1, handle_continue: 2, terminate: 2
end
end