Packages

Gleam bindings to gun, the HTTP/1.1, HTTP/2 and Websocket client

Current section

Files

Jump to
nerf src nerf_ffi.erl
Raw

src/nerf_ffi.erl

-module(nerf_ffi).
-export([ws_receive/2, ws_await_upgrade/2]).
ws_receive({connection, Ref, Pid}, Timeout)
when is_reference(Ref) andalso is_pid(Pid) ->
receive
{gun_ws, Pid, Ref, close} -> {ok, close};
{gun_ws, Pid, Ref, {close, _}} -> {ok, close};
{gun_ws, Pid, Ref, {close, _, _}} -> {ok, close};
{gun_ws, Pid, Ref, {text, _} = Frame} -> {ok, Frame};
{gun_ws, Pid, Ref, {binary, _} = Frame} -> {ok, Frame}
after Timeout ->
{error, nil}
end.
ws_await_upgrade({connection, Ref, Pid}, Timeout)
when is_reference(Ref) andalso is_pid(Pid) ->
receive
{gun_upgrade, Pid, Ref, [<<"websocket">>], _} ->
{ok, nil};
{gun_response, Pid, _, _, Status, Headers} ->
% TODO: return an error
exit({ws_upgrade_failed, Status, Headers});
{gun_error, Pid, Ref, Reason} ->
% TODO: return an error
exit({ws_upgrade_failed, Reason})
% TODO: Are other cases required?
after Timeout ->
% TODO: return an error
exit(timeout)
end.