chronoscope/lib/chronoscope/nts/client.ex
2024-03-27 14:23:08 -04:00

66 lines
1.5 KiB
Elixir

defmodule Chronoscope.NTS.Client do
use GenServer
alias Chronoscope.NTS.KeyEstablishmentClient
@interval_in_seconds 30
def start_link(host: host, port: port, name: name) do
GenServer.start_link(__MODULE__, %{host: host, port: port}, name: name)
end
@impl true
def init(%{host: host, port: port}) do
now = DateTime.utc_now()
{:ok,
%{
host: host,
port: port,
key_establishment_response: {:error, "initializing"},
last_key_establishment: DateTime.add(now, -@interval_in_seconds, :second)
}}
end
@impl true
def handle_call(:list, _from, state) do
{:reply, state, state}
end
@impl true
def handle_call(:key_establishment, _from, state) do
new_state = update_state(state)
{:reply, new_state.key_establishment_response, new_state}
end
defp update_state(state) do
now = DateTime.utc_now()
if interval_surpassed?(now, state.last_key_establishment) do
Map.merge(state, current_data(state, now))
else
state
end
end
defp current_data(state, now) do
%{
key_establishment_response: server_response(state),
last_key_establishment: now
}
end
defp server_response(state) do
server = Map.take(state, [:host, :port])
Chronoscope.TaskSupervisor
|> Task.Supervisor.async(fn -> KeyEstablishmentClient.key_establishment(server) end)
|> Task.await()
end
defp interval_surpassed?(now, last_key_establishment) do
DateTime.diff(now, last_key_establishment, :second) >= @interval_in_seconds
end
end