Packages
nova
0.5.1
0.15.1
0.14.3
0.14.1
0.13.7
0.13.1
0.13.0
0.12.1
0.12.0
0.11.0
0.10.4
0.10.3
0.10.2
0.10.1
0.10.0
0.9.24
0.9.23
0.9.22
0.9.21
0.9.20
0.9.19
0.9.18
0.9.17
0.9.16
0.9.15
0.9.11
0.9.5
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.6
0.8.5
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.2
0.7.1
0.7.0
0.6.2
0.6.1
0.6.0
0.5.2
0.5.1
0.4.4
0.4.3
0.4.2
0.4.1
0.2.2
0.1.0
0.0.1
0.0.0
Nova is a web application framework
Current section
Files
Jump to
Current section
Files
src/nova_ws_handler.erl
%%% @author Niclas Axelsson <niclas@burbas.se>
%%% @doc
%%% Callback controller for handling websockets
%%% @end
-module(nova_ws_handler).
-export([
init/2,
terminate/3,
websocket_init/1,
websocket_handle/2,
websocket_info/2
]).
-include_lib("nova/include/nova.hrl").
-ifdef(TEST).
-include_lib("eunit/include/eunit.hrl").
-endif.
%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Public functions %
%%%%%%%%%%%%%%%%%%%%%%%%%%%
init(Req, State = #{mod := Mod}) ->
case Mod:init(Req) of
{ok, Substate} ->
{cowboy_websocket, Req, State#{substate => Substate}};
Error ->
?ERROR("Websocket handler ~p returned unkown result ~p", [Mod, Error]),
Req1 = cowboy_req:reply(500, Req),
{ok, Req1, State}
end.
websocket_init(State = #{mod := Mod}) ->
handle_ws(Mod, websocket_init, [], State).
websocket_handle(Frame, State = #{mod := Mod}) ->
handle_ws(Mod, websocket_handle, [Frame], State).
websocket_info(Msg, State = #{mod := Mod}) ->
handle_ws(Mod, websocket_info, [Msg], State).
terminate(Reason, PartialReq, State = #{mod := Mod}) ->
handle_ws(Mod, terminate, [Reason, PartialReq], State),
ok.
handle_ws(Mod, Func, Args, State = #{substate := Substate}) ->
try
case erlang:apply(Mod, Func, Args ++ [Substate]) of
{reply, Frame, NewSubstate} ->
{reply, Frame, State#{substate => NewSubstate}};
{reply, Frame, NewSubstate, hibernate} ->
{reply, Frame, State#{substate => NewSubstate}, hibernate};
{ok, NewSubstate} ->
{ok, State#{substate => NewSubstate}};
{ok, NewSubstate, hibernate} ->
{ok, State#{substate => NewSubstate}, hibernate};
{stop, NewSubstate} ->
{stop, State#{substate => NewSubstate}};
ok ->
{ok, State}
end
catch
Type:Reason:Stacktrace ->
?ERROR("Websocket failed with ~p:~p.~nStacktrace:~n~p", [Type, Reason, Stacktrace]),
Substate
end;
handle_ws(Mod, Func, Args, State) ->
handle_ws(Mod, Func, Args, State#{substate => #{}}).
-ifdef(TEST).
-endif.