45 lines
1.2 KiB
Elixir
45 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}},
|
|
{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
|