def talk

bend-kit-http@0.38.2.0 · http.bend:6238

import bend-kit-http@0.38.2.0/http.bend as Http
import Base
import bend-kit-http@0.38.2.0/admission.bend as Admission
import bend-kit-http@0.38.2.0/completion.bend as Completion

6238def talk(~C: Data, ~h: C -> Req -> IO(Reply), ~observe: C -> U32 -> Completion.Outcome -> IO(Unit), +context: C, +settings: Limits, +inbox: Chan(Admission.Command), st: Maybe<&1, Serving>) -> IO(Unit):
6239  Limits{max, cap, hm, bm, im, wm} = settings
6240  match st:
6241    case None{}:
6242      IO.pure(Unit, Unit{})
6243    case Some{Serving{(s, t), phase}}:
6244      match t:
6245        case TurnMore{sv, cont}:
6246          do IO<Unit>:
6247            received : (Socket & Turn) & Phase <- talk.recv(inbox, False{}, settings, s, sv, cont, phase)
6248            talk(~C, ~h, ~observe, context, settings, inbox, Some{talk.state(received)})
6249        case TurnReq{req, rest, v11}:
6250          do IO<Unit>:
6251            admitted : Bool <- Admission.take(inbox, 1)
6252            next : Maybe<&1, Socket & Turn> <- admission.request(~C, ~h, ~observe, admitted, inbox, context, settings, s, req, rest, v11)
6253            talk(~C, ~h, ~observe, context, settings, inbox, serve.write.state(next))
6254        case TurnFail{status}:
6255          reply_fail(Completion.Observed{status => outcome => observe(context, status, outcome)}, s, status, wm)
6256        case TurnClose{}:
6257          Socket.close(s)
6258        case TurnInputFailed{operation, code, message}:
6259          Socket.close(s)

Uses (27)

Used by (3)