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}))

Uses (21)

Used by (1)