message-server/lib/message_server/server_registry.ex

50 lines
1.4 KiB
Elixir

defmodule MessageServer.ServerRegistry do
use Agent
@moduledoc """
Simple registry for server information using Agent for lightweight state management.
"""
@type server_info :: %{host: String.t(), port: integer()}
@type servers_map :: %{String.t() => server_info()}
@type state :: %{server_id: String.t(), servers: servers_map()}
def start_link({server_id, servers, agent_name}) do
Agent.start_link(
fn -> %{server_id: server_id, servers: servers} end,
name: agent_name
)
end
def start_link({server_id, servers}) do
start_link({server_id, servers, __MODULE__})
end
@spec get_server_id() :: String.t()
def get_server_id(agent \\ __MODULE__) do
Agent.get(agent, & &1.server_id)
end
@spec get_server_info(String.t()) :: {:ok, server_info()} | {:error, :not_found}
def get_server_info(server_id, agent \\ __MODULE__) do
Agent.get(agent, fn %{servers: servers} ->
case Map.get(servers, server_id) do
nil -> {:error, :not_found}
info -> {:ok, info}
end
end)
end
@spec list_servers() :: servers_map()
def list_servers(agent \\ __MODULE__) do
Agent.get(agent, & &1.servers)
end
@spec get_local_server_info() :: %{id: String.t(), servers: servers_map()}
def get_local_server_info(agent \\ __MODULE__) do
Agent.get(agent, fn state ->
%{id: state.server_id, servers: state.servers}
end)
end
end