def server.accept.loop
bend-kit-http@0.38.5.0 · http.bend:6432
import bend-kit-http@0.38.5.0/http.bend as Http
import Base
import bend-kit-http@0.38.5.0/admission.bend as Admission
import bend-kit-wire@0.4.8.0/wire.bend as Wire
6432def server.accept.loop(~C: Data, ~operation: C -> Limits -> Chan(Admission.Command) -> Socket -> IO(Unit),
6433 step: AcceptStep<C>) -> IO(Server<C> & Result<&1, &1, U32 & String, Chan(Unit)>):
6434 match step:
6435 case AcceptChecking{server}:
6436 Server{listener, context, config, +inbox, drained} = server
6437 do IO<Server<C> & Result<&1, &1, U32 & String, Chan(Unit)>>:
6438 running : Bool <- Admission.running(inbox)
6439 server.accept.loop(~C, ~operation, AcceptAllowed{running, Server{listener, context, config, inbox, drained}})
6440 case AcceptAllowed{running, server}:
6441 match running:
6442 case False{}:
6443 IO.pure(Server<C> & Result<&1, &1, U32 & String, Chan(Unit)>, (server, Fail{(0, "server stopped")}))
6444 case True{}:
6445 Server{listener, context, config, inbox, drained} = server
6446 do IO<Server<C> & Result<&1, &1, U32 & String, Chan(Unit)>>:
6447 result : Listener & Result<&1, &1, U32 & String, Socket> <- Wire.accept.deadline(listener, 50)
6448 accepted : Server<C> & Result<&1, &1, U32 & String, Chan(Unit)> <-
6449 server.accepted(~C, ~operation, context, config, inbox, drained, result)
6450 server.accept.loop(~C, ~operation, AcceptReceived{accepted})
6451 case AcceptReceived{accepted}:
6452 (server, result) = accepted
6453 match result:
6454 case Fail{(+code, message)}:
6455 server.accept.loop(~C, ~operation, AcceptFailed{err.late(code), server, (code, message)})
6456 case Done{finished}:
6457 IO.pure(Server<C> & Result<&1, &1, U32 & String, Chan(Unit)>, (server, Done{finished}))
6458 case AcceptFailed{retry, server, error}:
6459 match retry:
6460 case True{}: server.accept.loop(~C, ~operation, AcceptChecking{server})
6461 case False{}: IO.pure(Server<C> & Result<&1, &1, U32 & String, Chan(Unit)>, (server, Fail{error}))