-module(dove@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).