60 lines
1.3 KiB
Elixir
60 lines
1.3 KiB
Elixir
defmodule Chronoscope.NTS.Behaviour do
|
|
@callback(key_establishment(host :: String.t(), port :: integer()) :: {:ok, Map.t()}, {:error, any()})
|
|
end
|
|
|
|
defmodule Chronoscope.NTS do
|
|
@behaviour Chronoscope.NTS.Behaviour
|
|
|
|
require Logger
|
|
|
|
alias Chronoscope.NTS
|
|
|
|
def healthy?() do
|
|
true
|
|
end
|
|
|
|
def list() do
|
|
NTS.DynamicSupervisor
|
|
|> DynamicSupervisor.which_children()
|
|
|> Enum.map(fn {_, pid, _, _} -> GenServer.call(pid, :list) end)
|
|
end
|
|
|
|
def remove(host, port) do
|
|
name = client_name(%{host: host, port: port})
|
|
|
|
case Registry.lookup(NTS.Registry, name) do
|
|
[{pid, _}] ->
|
|
GenServer.call(pid, :terminate)
|
|
|
|
[] ->
|
|
{:error, :notfound}
|
|
end
|
|
end
|
|
|
|
@impl true
|
|
def key_establishment(host, port) do
|
|
%{host: host, port: port}
|
|
|> client_pid()
|
|
|> GenServer.call(:key_establishment)
|
|
end
|
|
|
|
defp client_pid(server) do
|
|
name = client_name(server)
|
|
|
|
case Registry.lookup(NTS.Registry, name) do
|
|
[{pid, _}] -> pid
|
|
[] -> start_client(server, name)
|
|
end
|
|
end
|
|
|
|
defp client_name(%{host: host, port: port}) do
|
|
"#{host}:#{port}"
|
|
end
|
|
|
|
defp start_client(%{host: host, port: port}, name) do
|
|
NTS.DynamicSupervisor
|
|
|> DynamicSupervisor.start_child({NTS.Client, host: host, port: port, name: {:via, Registry, {NTS.Registry, name}}})
|
|
|> then(fn {:ok, pid} -> pid end)
|
|
end
|
|
end
|