Packages

Elixir client for Apple MapKit JS (token generation for Apple Maps on the web).

Current section

Files

Jump to
mapkit_js lib mapkit_js token_cache.ex
Raw

lib/mapkit_js/token_cache.ex

defmodule MapkitJS.TokenCache do
@moduledoc """
Caches the MapKit JS JWT so callers don't need to sign a new token on every request.
"""
use GenServer
alias MapkitJS.Token
@refresh_buffer_seconds 60
def start_link(opts \\ []) do
GenServer.start_link(__MODULE__, :ok, Keyword.put_new(opts, :name, __MODULE__))
end
@spec fetch() :: {:ok, String.t()} | {:error, term()}
def fetch(server \\ __MODULE__) do
GenServer.call(server, :fetch)
end
def clear(server \\ __MODULE__) do
GenServer.call(server, :clear)
end
@impl true
def init(:ok), do: {:ok, %{token: nil, expires_at: 0}}
@impl true
def handle_call(:fetch, _from, state) do
now = System.system_time(:second)
if state.token && state.expires_at - now > @refresh_buffer_seconds do
{:reply, {:ok, state.token}, state}
else
case Token.access_token_with_expiry() do
{:ok, token, expires_at} ->
{:reply, {:ok, token}, %{token: token, expires_at: expires_at}}
{:error, _} = error ->
{:reply, error, state}
end
end
end
@impl true
def handle_call(:clear, _from, _state) do
{:reply, :ok, %{token: nil, expires_at: 0}}
end
end