lib/public_key_updater.ex

defmodule FirebaseJwt.PublicKeyUpdater do
  use Task, restart: :permanent
  require Logger
  alias FirebaseJwt.PublicKeyStore
  # @fetch_interval 300_000

  def start_link([]) do
    Task.start_link(__MODULE__, :run, [])
  end

  def init(init_arg) do
    {:ok, init_arg}
  end

  def run() do
    # Allow endless restart
    :timer.sleep(1000)
    Application.get_env(:firebase_jwt, :debug_log) && Logger.debug("[#{__MODULE__}] runs.")

    PublicKeyStore.fetch_firebase_keys()
    expire = PublicKeyStore.get(:expire) |> DateTime.to_unix(:millisecond)
    now = Timex.now() |> DateTime.to_unix(:millisecond)
    interval = ceil((expire - now) * 0.8)
    # :timer.sleep(@fetch_interval)
    :timer.sleep(interval)

    run()
  end
end