From: Christopher Coté Date: Tue, 23 Nov 2021 17:44:54 +0000 (-0500) Subject: automatically unsubscribe and unregister on terminattion for handler processes X-Git-Url: http://git.entropealabs.com/?a=commitdiff_plain;h=488fb5c7fedff488f42623dddc323d17085ba4f1;p=wampex_client.git automatically unsubscribe and unregister on terminattion for handler processes --- diff --git a/lib/client.ex b/lib/client.ex index de1266b..0b6ca6a 100644 --- a/lib/client.ex +++ b/lib/client.ex @@ -6,7 +6,7 @@ defmodule Wampex.Client do 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 @@ -100,6 +100,19 @@ defmodule Wampex.Client do 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 diff --git a/lib/client/handler.ex b/lib/client/handler.ex index e4defe7..e4def16 100644 --- a/lib/client/handler.ex +++ b/lib/client/handler.ex @@ -2,7 +2,7 @@ defmodule Wampex.Client.Handler 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 @@ -10,7 +10,8 @@ defmodule Wampex.Client.Handler do 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__) @@ -32,7 +33,22 @@ defmodule Wampex.Client.Handler do 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} @@ -58,7 +74,7 @@ defmodule Wampex.Client.Handler do 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 diff --git a/mix.exs b/mix.exs index af451a7..a7b4cf0 100644 --- a/mix.exs +++ b/mix.exs @@ -4,7 +4,7 @@ defmodule Wampex.Client.MixProject do def project do [ app: :wampex_client, - version: "0.1.5", + version: "0.1.6", elixir: "~> 1.9", start_permanent: Mix.env() == :prod, elixirc_paths: elixirc_paths(Mix.env()),