-module(lake_heartbeat).
-behaviour(gen_server).
-export([start_link/2]).
-export([init/1,
handle_call/3,
handle_cast/2,
handle_info/2]).
start_link(Heartbeat, Connection) ->
gen_server:start_link(?MODULE, [Heartbeat, Connection], []).
init([Heartbeat, Connection]) ->
{ok, _} = timer:send_interval(Heartbeat * 1000, check_heartbeat),
ok = gen_server:cast(Connection, heartbeat),
{ok,
#{heartbeat => Heartbeat,
connection => Connection,
last_heartbeat => undefined}}.
handle_call(_, _From, State) ->
{reply, unknown, State}.
handle_cast({heartbeat}, State) ->
{noreply, State#{last_heartbeat => erlang:monotonic_time(second)}}.
handle_info(check_heartbeat,
State =
#{heartbeat := Heartbeat,
last_heartbeat := LastHeartbeat,
connection := Connection}) ->
Now = erlang:monotonic_time(second),
if Now - 2 * Heartbeat > LastHeartbeat ->
{stop, heartbeat_timeout, State};
true ->
ok = gen_server:cast(Connection, heartbeat),
{noreply, State}
end.