Packages

A Gleam library for interacting with the Discord API

Current section

Files

Jump to
shimmer src shimmer@internal@network@websocket.erl
Raw

src/shimmer@internal@network@websocket.erl

-module(shimmer@internal@network@websocket).
-compile(no_auto_import).
-export([connect/4, send/2, 'receive'/2, close/1]).
-export_type([connection/0, frame/0, connect_error/0]).
-opaque connection() :: {connection,
shimmer@internal@network@gun:stream_reference(),
shimmer@internal@network@gun:connection_pid()}.
-type frame() :: {close, integer(), binary()} |
{text, binary()} |
{binary, bitstring()}.
-type connect_error() :: {connection_refused,
integer(),
list({binary(), binary()})} |
{connection_failed, gleam@dynamic:dynamic()}.
-spec connect(binary(), binary(), integer(), list({binary(), binary()})) -> {ok,
connection()} |
{error, connect_error()}.
connect(Hostname, Path, Port, Headers) ->
case begin
_pipe = shimmer@internal@network@gun:open(Hostname, Port),
gleam@result:map_error(
_pipe,
fun(Field@0) -> {connection_failed, Field@0} end
)
end of
{error, _try} -> {error, _try};
{ok, Pid} ->
case begin
_pipe@1 = gun:await_up(Pid),
gleam@result:map_error(
_pipe@1,
fun(Field@0) -> {connection_failed, Field@0} end
)
end of
{error, _try@1} -> {error, _try@1};
{ok, _@1} ->
Ref = gun:ws_upgrade(Pid, Path, Headers),
Conn = {connection, Ref, Pid},
case begin
_pipe@2 = shimmer_net:ws_await_upgrade(Conn, 1000),
gleam@result:map_error(
_pipe@2,
fun(Field@0) -> {connection_failed, Field@0} end
)
end of
{error, _try@2} -> {error, _try@2};
{ok, _@2} ->
{ok, Conn}
end
end
end.
-spec send(connection(), bitstring()) -> nil.
send(Conn, Message) ->
shimmer@internal@network@gun:ws_send(
erlang:element(3, Conn),
{binary, Message}
).
-spec 'receive'(connection(), integer()) -> {ok, frame()} | {error, nil}.
'receive'(Field@0, Field@1) ->
shimmer_net:ws_receive(Field@0, Field@1).
-spec close(connection()) -> nil.
close(Conn) ->
shimmer@internal@network@gun:ws_send(erlang:element(3, Conn), close).