]> Entropealabs - wampex_client.git/commitdiff
automatically unsubscribe and unregister on terminattion for handler processes
authorChristopher Coté <chris@entropealabs.com>
Tue, 23 Nov 2021 17:44:54 +0000 (12:44 -0500)
committerChristopher Coté <chris@entropealabs.com>
Tue, 23 Nov 2021 17:44:54 +0000 (12:44 -0500)
lib/client.ex
lib/client/handler.ex
mix.exs

index de1266b54edb0d42d591a9a5f2ff41c4584e7e57..0b6ca6ad6aa25a7c32c11833b6cae567a70f9ab1 100644 (file)
@@ -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
index e4defe7bec9b310cf10c87afeb6c83eba32921a1..e4def16c1d952643e40cf2f3303cfed8360c157c 100644 (file)
@@ -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 af451a76cdd4bc8915395e161ddde58647b45b30..a7b4cf0de65573b0ec80105e00d2949caf0a3d75 100644 (file)
--- 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()),