50 lines
1.4 KiB
Elixir
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
|