46 lines
1.2 KiB
Elixir

defmodule MessageServer.Application do
use Application
require Logger
@impl true
def start(_type, _args) do
server_id = get_server_id()
port = get_port()
servers = parse_servers()
Logger.info("Starting MessageServer #{server_id} on port #{port}")
Logger.info("Known servers: #{inspect(servers)}")
children = [
{MessageServer.ServerRegistry, {server_id, servers}},
{MessageServer.Storage, {server_id}},
{MessageServer.MessageQueue, [retry_interval: 30_000]},
{Bandit, plug: MessageServer.Router, port: port}
]
opts = [strategy: :one_for_one, name: MessageServer.Supervisor]
Supervisor.start_link(children, opts)
end
@spec get_server_id() :: String.t()
def get_server_id() do
System.get_env("SERVER_ID", "1")
end
@spec get_port() :: integer()
def get_port() do
System.get_env("PORT", "4000") |> String.to_integer()
end
@spec parse_servers() :: map()
defp parse_servers() do
System.get_env("SERVERS", "")
|> String.split(",")
|> Enum.reject(&(&1 == ""))
|> Enum.into(%{}, fn server_string ->
[id, host, port] = String.split(server_string, ":")
{id, %{host: host, port: String.to_integer(port)}}
end)
end
end