Current section

Files

Jump to
glisten src glisten@internal@listener.erl
Raw

src/glisten@internal@listener.erl

-module(glisten@internal@listener).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/glisten/internal/listener.gleam").
-export([start/4]).
-export_type([message/0, state/0]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
?MODULEDOC(false).
-type message() :: {info, gleam@erlang@process:subject(state())}.
-type state() :: {state,
glisten@socket:listen_socket(),
integer(),
glisten@socket@options:ip_address()}.
-file("src/glisten/internal/listener.gleam", 17).
?DOC(false).
-spec start(
integer(),
glisten@transport:transport(),
list(glisten@socket@options:tcp_option()),
gleam@erlang@process:name(message())
) -> {ok, gleam@otp@actor:started(gleam@erlang@process:subject(message()))} |
{error, gleam@otp@actor:start_error()}.
start(Port, Transport, Options, Name) ->
_pipe@8 = gleam@otp@actor:new_with_initialiser(
5000,
fun(Subject) ->
_pipe = glisten@transport:listen(Transport, Port, Options),
_pipe@2 = gleam@result:'try'(
_pipe,
fun(Socket) ->
_pipe@1 = glisten@transport:sockname(Transport, Socket),
gleam@result:map(
_pipe@1,
fun(Info) ->
{state,
Socket,
erlang:element(2, Info),
erlang:element(1, Info)}
end
)
end
),
_pipe@7 = gleam@result:map(_pipe@2, fun(State) -> _pipe@3 = State,
_pipe@4 = gleam@otp@actor:initialised(_pipe@3),
_pipe@6 = gleam@otp@actor:selecting(
_pipe@4,
begin
_pipe@5 = gleam_erlang_ffi:new_selector(),
gleam@erlang@process:select(_pipe@5, Subject)
end
),
gleam@otp@actor:returning(_pipe@6, Subject) end),
gleam@result:map_error(
_pipe@7,
fun(Err) ->
Error_string = <<"Failed to start socket listener: "/utf8,
(glisten@socket:reason_to_string(Err))/binary>>,
logging:log(error, Error_string),
Error_string
end
)
end
),
_pipe@9 = gleam@otp@actor:on_message(
_pipe@8,
fun(State@1, Msg) -> case Msg of
{info, Caller} ->
gleam@erlang@process:send(Caller, State@1),
gleam@otp@actor:continue(State@1)
end end
),
_pipe@10 = gleam@otp@actor:named(_pipe@9, Name),
gleam@otp@actor:start(_pipe@10).