From 3a39129d6467a5d164de303bfb1043c0fe95a525 Mon Sep 17 00:00:00 2001 From: Hubert Kasprzycki Date: Fri, 25 Apr 2025 11:05:10 +0200 Subject: [PATCH] Refactor LiveDebugger.Utils.PubSub --- .../services/system/module_service.ex | 2 +- lib/live_debugger/utils/pubsub.ex | 73 +++++++++++++++---- 2 files changed, 60 insertions(+), 15 deletions(-) diff --git a/lib/live_debugger/services/system/module_service.ex b/lib/live_debugger/services/system/module_service.ex index 4d2f7e080..96b6cf90d 100644 --- a/lib/live_debugger/services/system/module_service.ex +++ b/lib/live_debugger/services/system/module_service.ex @@ -10,7 +10,7 @@ defmodule LiveDebugger.Services.System.ModuleService do @doc """ Wrapper for `:code.all_loaded/0` that returns a list of loaded modules. """ - @spec all() :: [{module(), charlist()}] + @spec all() :: [{charlist(), charlist(), boolean()}] def all(), do: impl().all() @doc """ diff --git a/lib/live_debugger/utils/pubsub.ex b/lib/live_debugger/utils/pubsub.ex index 63de6cc7f..4cfc276bc 100644 --- a/lib/live_debugger/utils/pubsub.ex +++ b/lib/live_debugger/utils/pubsub.ex @@ -6,38 +6,35 @@ defmodule LiveDebugger.Utils.PubSub do alias LiveDebugger.Structs.Trace alias LiveDebugger.Structs.TreeNode + @callback broadcast(topic :: String.t(), payload :: term()) :: :ok + @callback subscribe!(topics :: [String.t()]) :: :ok + @callback subscribe!(topic :: String.t()) :: :ok + @callback unsubscribe(topics :: [String.t()]) :: :ok + @callback unsubscribe(topic :: String.t()) :: :ok + @spec broadcast(topic :: String.t(), payload :: term()) :: :ok def broadcast(topic, payload) do - Phoenix.PubSub.broadcast(LiveDebugger.PubSub, topic, payload) + impl().broadcast(topic, payload) end @spec subscribe!(topics :: [String.t()]) :: :ok def subscribe!(topics) when is_list(topics) do - topics - |> Enum.each(&subscribe!(&1)) - - :ok + impl().subscribe!(topics) end @spec subscribe!(topic :: String.t()) :: :ok def subscribe!(topic) do - case Phoenix.PubSub.subscribe(LiveDebugger.PubSub, topic) do - :ok -> :ok - {:error, reason} -> raise reason - end + impl().subscribe!(topic) end @spec unsubscribe(topics :: [String.t()]) :: :ok def unsubscribe(topics) when is_list(topics) do - topics - |> Enum.each(&unsubscribe(&1)) - - :ok + impl().unsubscribe(topics) end @spec unsubscribe(topic :: String.t()) :: :ok def unsubscribe(topic) do - Phoenix.PubSub.unsubscribe(LiveDebugger.PubSub, topic) + impl().unsubscribe(topic) end @spec component_deleted_topic(trace :: Trace.t()) :: String.t() @@ -93,4 +90,52 @@ defmodule LiveDebugger.Utils.PubSub do def ts_f_topic(socket_id, transport_pid, fun) do "#{inspect(transport_pid)}/#{socket_id}/*/#{inspect(fun)}" end + + @spec impl() :: module() + defp impl() do + Application.get_env( + :live_debugger, + :pubsub_utils, + __MODULE__.Impl + ) + end + + defmodule Impl do + @moduledoc false + @behaviour LiveDebugger.Utils.PubSub + + @impl true + def broadcast(topic, payload) do + Phoenix.PubSub.broadcast(LiveDebugger.PubSub, topic, payload) + end + + @impl true + def subscribe!(topics) when is_list(topics) do + topics + |> Enum.each(&subscribe!(&1)) + + :ok + end + + @impl true + def subscribe!(topic) do + case Phoenix.PubSub.subscribe(LiveDebugger.PubSub, topic) do + :ok -> :ok + {:error, reason} -> raise reason + end + end + + @impl true + def unsubscribe(topics) when is_list(topics) do + topics + |> Enum.each(&unsubscribe(&1)) + + :ok + end + + @impl true + def unsubscribe(topic) do + Phoenix.PubSub.unsubscribe(LiveDebugger.PubSub, topic) + end + end end