Current section

Files

Jump to
dove src dove@internal@tcp.erl
Raw

src/dove@internal@tcp.erl

-module(dove@internal@tcp).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function]).
-export([connect/3, send/2, 'receive'/3, new_selector/0]).
-spec connect(binary(), integer(), integer()) -> {ok, mug:socket()} |
{error, mug:error()}.
connect(Host, Port, Timeout) ->
mug:connect({connection_options, Host, Port, Timeout}).
-spec send(mug:socket(), bitstring()) -> {ok, nil} | {error, mug:error()}.
send(Socket, Packet) ->
mug:send(Socket, Packet).
-spec 'receive'(
mug:socket(),
gleam@erlang@process:selector({ok, bitstring()} | {error, mug:error()}),
integer()
) -> {ok, bitstring()} | {error, mug:error()}.
'receive'(Socket, Selector, Timeout) ->
mug:receive_next_packet_as_message(Socket),
_pipe = Selector,
_pipe@1 = gleam_erlang_ffi:select(_pipe, Timeout),
_pipe@2 = gleam@result:replace_error(_pipe@1, timeout),
gleam@result:flatten(_pipe@2).
-spec mapper(mug:tcp_message()) -> {ok, bitstring()} | {error, mug:error()}.
mapper(Message) ->
case Message of
{packet, _, Packet} ->
{ok, Packet};
{socket_closed, _} ->
{error, closed};
{tcp_error, _, Error} ->
{error, Error}
end.
-spec new_selector() -> gleam@erlang@process:selector({ok, bitstring()} |
{error, mug:error()}).
new_selector() ->
_pipe = gleam_erlang_ffi:new_selector(),
mug:selecting_tcp_messages(_pipe, fun mapper/1).