% @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.