Current section
Files
Jump to
Current section
Files
lib/wechat/workers/access_token.ex
defmodule Wechat.Workers.AccessToken do
@moduledoc false
use GenServer
alias Wechat.API
@name __MODULE__
@default_refresh_interval :timer.minutes(30)
@default_fetcher {API, :access_token, []}
def start_link(args) do
GenServer.start_link(__MODULE__, args, name: @name)
end
def init(_) do
state = do_refresh()
{:ok, state}
end
def handle_call(:get, _from, state) do
{:reply, state["access_token"], state}
end
def handle_info(:refresh, _state) do
state = do_refresh()
{:noreply, state}
end
defp do_refresh do
Process.send_after(self(), :refresh, refresh_interval())
{mod, f, args} = env(:access_token_fetcher, @default_fetcher)
apply(mod, f, args)
end
def refresh_interval do
env(:access_token_refresh_interval, @default_refresh_interval)
end
defp env(key, default) do
:wechat
|> Application.get_env(Wechat)
|> Keyword.get(key, default)
end
def get do
GenServer.call(@name, :get)
end
end