97 lines
2.5 KiB
Erlang
97 lines
2.5 KiB
Erlang
% @doc static file cache
|
|
-module(fd_sfc).
|
|
|
|
-behavior(gen_server).
|
|
|
|
-export([
|
|
%% caller context
|
|
base_path/0,
|
|
renew/0, query/1,
|
|
start_link/0,
|
|
|
|
%% process context
|
|
init/1, handle_call/3, handle_cast/2, handle_info/2,
|
|
code_change/3, terminate/2
|
|
]).
|
|
|
|
-include("$zx_include/zx_logger.hrl").
|
|
|
|
|
|
-record(s, {base_path = base_path() :: file:filename(),
|
|
cache = fd_sfc_cache:new(base_path()) :: fd_sfc_cache:cache(),
|
|
auto_renew = 5_000 :: pos_integer()}).
|
|
%-type state() :: #s{}.
|
|
|
|
|
|
%%-----------------------------------------------------------------------------
|
|
%% caller context
|
|
%%-----------------------------------------------------------------------------
|
|
|
|
base_path() ->
|
|
filename:join([zx:get_home(), "priv", "static"]).
|
|
|
|
renew() ->
|
|
gen_server:cast(?MODULE, renew).
|
|
|
|
query(Path) ->
|
|
gen_server:call(?MODULE, {query, Path}).
|
|
|
|
start_link() ->
|
|
gen_server:start_link({local, ?MODULE}, ?MODULE, none, []).
|
|
|
|
|
|
%%-----------------------------------------------------------------------------
|
|
%% process context below this line
|
|
%%-----------------------------------------------------------------------------
|
|
|
|
%% gen_server callbacks
|
|
|
|
init(none) ->
|
|
log(info, "starting fd_cache"),
|
|
InitState = #s{},
|
|
erlang:send_after(InitState#s.auto_renew, self(), auto_renew),
|
|
{ok, InitState}.
|
|
|
|
|
|
handle_call({query, Path}, _, State = #s{cache = Cache}) ->
|
|
Reply = fd_sfc_cache:query(Path, Cache),
|
|
{reply, Reply, State};
|
|
handle_call(Unexpected, From, State) ->
|
|
tell("~tp: unexpected call from ~tp: ~tp", [?MODULE, Unexpected, From]),
|
|
{noreply, State}.
|
|
|
|
|
|
handle_cast(renew, State) ->
|
|
NewState = i_renew(State),
|
|
{noreply, NewState};
|
|
handle_cast(Unexpected, State) ->
|
|
tell("~tp: unexpected cast: ~tp", [?MODULE, Unexpected]),
|
|
{noreply, State}.
|
|
|
|
|
|
handle_info(auto_renew, State = #s{auto_renew = MS}) ->
|
|
log(info, "~tp: auto_renew", [?MODULE]),
|
|
erlang:send_after(MS, self(), auto_renew),
|
|
NewState = i_renew(State),
|
|
{noreply, NewState};
|
|
handle_info(Unexpected, State) ->
|
|
tell("~tp: unexpected info: ~tp", [?MODULE, Unexpected]),
|
|
{noreply, State}.
|
|
|
|
|
|
code_change(_, State, _) ->
|
|
{ok, State}.
|
|
|
|
terminate(_, _) ->
|
|
ok.
|
|
|
|
|
|
%%-----------------------------------------------------------------------------
|
|
%% internals
|
|
%%-----------------------------------------------------------------------------
|
|
|
|
i_renew(State = #s{base_path = BasePath}) ->
|
|
NewCache = fd_sfc_cache:new(BasePath),
|
|
NewState = State#s{cache = NewCache},
|
|
NewState.
|