From 13dd4002d0397792f8e5975aa8b49fba5159a963 Mon Sep 17 00:00:00 2001 From: Mike Cifelli Date: Wed, 5 Jun 2024 17:01:57 -0400 Subject: [PATCH] Re-activate clients after a failure --- lib/chronoscope/nts/client.ex | 2 ++ lib/chronoscope_web/client_activator.ex | 29 ++++++++++++++++++++----- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/lib/chronoscope/nts/client.ex b/lib/chronoscope/nts/client.ex index b39fec9..0acb101 100644 --- a/lib/chronoscope/nts/client.ex +++ b/lib/chronoscope/nts/client.ex @@ -44,7 +44,9 @@ defmodule Chronoscope.NTS.Client do @impl true def handle_call(:auto_refresh, _from, state) do + :timer.send_after(1_000, :key_establishment) {:ok, timer} = :timer.send_interval(@refresh_interval_in_milliseconds, :key_establishment) + {:reply, :ok, Map.put(state, :timer, timer)} end diff --git a/lib/chronoscope_web/client_activator.ex b/lib/chronoscope_web/client_activator.ex index 8ea4ae8..381bee1 100644 --- a/lib/chronoscope_web/client_activator.ex +++ b/lib/chronoscope_web/client_activator.ex @@ -6,6 +6,8 @@ defmodule ChronoscopeWeb.ClientActivator do alias Chronoscope.NTS alias Chronoscope.NTS.Parse + @activate_interval_in_milliseconds 300_000 + @nts_file Application.compile_env(:chronoscope, :nts_file) def start_link(_) do @@ -14,13 +16,29 @@ defmodule ChronoscopeWeb.ClientActivator do @impl true def init(_) do - File.touch(Application.app_dir(:chronoscope, @nts_file)) - {:ok, %{nts_servers: activate_nts_clients()}} + nts_servers = + nts_servers() + |> tap(fn servers -> Enum.each(servers, &NTS.auto_refresh/1) end) + + :timer.send_interval(@activate_interval_in_milliseconds, :ensure_activated) + + {:ok, %{nts_servers: nts_servers}} + end + + @impl true + def handle_info(:ensure_activated, state) do + Enum.each(state.nts_servers, &NTS.auto_refresh/1) + + {:noreply, state} end @impl true def handle_info(:activate_clients, _state) do - {:noreply, %{nts_servers: activate_nts_clients()}} + nts_servers = + nts_servers() + |> tap(fn servers -> Enum.each(servers, &NTS.auto_refresh/1) end) + + {:noreply, %{nts_servers: nts_servers}} end @impl true @@ -28,13 +46,14 @@ defmodule ChronoscopeWeb.ClientActivator do {:reply, state.nts_servers, state} end - defp activate_nts_clients() do + defp nts_servers() do + File.touch(Application.app_dir(:chronoscope, @nts_file)) + Application.app_dir(:chronoscope, @nts_file) |> File.stream!() |> Stream.map(&String.trim/1) |> Stream.filter(&(&1 != "")) |> Stream.map(&Parse.parse_nts_server/1) |> Enum.to_list() - |> tap(fn server -> Enum.each(server, &NTS.auto_refresh/1) end) end end