-module(ewe@internal@handler). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/ewe/internal/handler.gleam"). -export([init/1, loop/4]). -export_type([message/0, glisten_state/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() :: idle_timeout. -type glisten_state() :: {glisten_state, gleam@option:option(gleam@erlang@process:timer()), gleam@erlang@process:subject(message())}. -type state() :: {http1, ewe@internal@http1@handler:state(), gleam@erlang@process:subject(message())}. -file("src/ewe/internal/handler.gleam", 45). ?DOC(false). -spec init(any()) -> {state(), gleam@option:option(gleam@erlang@process:selector(message()))}. init(_) -> Subject = gleam@erlang@process:new_subject(), Selector = begin _pipe = gleam_erlang_ffi:new_selector(), gleam@erlang@process:select(_pipe, Subject) end, {{http1, ewe@internal@http1@handler:init(), Subject}, {some, Selector}}. -file("src/ewe/internal/handler.gleam", 55). ?DOC(false). -spec loop( fun((gleam@http@request:request(ewe@internal@http1:connection())) -> gleam@http@response:response(ewe@internal@http1:response_body())), gleam@http@response:response(ewe@internal@http1:response_body()), gleam@erlang@process:name(gleam@otp@factory_supervisor:message(fun(() -> {ok, gleam@otp@actor:started(nil)} | {error, gleam@otp@actor:start_error()}), nil)), integer() ) -> fun((state(), glisten:message(message()), glisten:connection(message())) -> glisten:next(state(), glisten:message(message()))). loop(Handler, On_crash, Factory_name, Idle_timeout) -> fun(State, Msg, Conn) -> Sender = erlang:element(4, Conn), Conn@1 = ewe@internal@http1:transform_connection(Conn, Factory_name), case {State, Msg} of {{http1, State@1, Self}, {packet, Msg@1}} -> Result = ewe@internal@http1@handler:handle_packet( State@1, Msg@1, Conn@1, Sender, Handler, On_crash, Idle_timeout ), case Result of {continue, New_state} -> glisten:continue({http1, New_state, Self}); {http2_cleartext_upgrade, _, _} -> logging:log( debug, <<"Received HTTP/2 cleartext upgrade request"/utf8>> ), glisten:stop(); {http2_upgrade, _} -> logging:log( debug, <<"Received HTTP/2 upgrade request"/utf8>> ), glisten:stop(); stop -> glisten:stop() end; {_, _} -> glisten:stop() end end.