Current section

Files

Jump to
wallet_passes lib wallet_passes token_cache.ex
Raw

lib/wallet_passes/token_cache.ex

defmodule WalletPasses.TokenCache do
@moduledoc false
@table :wallet_passes_token_cache
@ttl_ms :timer.minutes(55)
def get(key) do
_table = ensure_table()
now = System.monotonic_time(:millisecond)
case :ets.lookup(@table, key) do
[{^key, value, expires_at}] when expires_at > now ->
{:ok, value}
_ ->
:miss
end
end
def put(key, value) do
_table = ensure_table()
expires_at = System.monotonic_time(:millisecond) + @ttl_ms
:ets.insert(@table, {key, value, expires_at})
:ok
end
def delete(key) do
_table = ensure_table()
:ets.delete(@table, key)
:ok
end
def fetch(key, fun) do
case get(key) do
{:ok, value} ->
{:ok, value}
:miss ->
case fun.() do
{:ok, value} ->
put(key, value)
{:ok, value}
error ->
error
end
end
end
defp ensure_table do
case :ets.whereis(@table) do
:undefined -> :ets.new(@table, [:set, :public, :named_table])
_ -> @table
end
end
end