def serve.write.talk

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

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

7006def serve.write.talk(
7007  ~S: Type, ~start: Req -> IO(WriteHead<S>), ~write: S -> Writer -> Completion.Receipt -> IO(Writer & Completion.Receipt), ~dispose: S -> IO(Unit), ~observe: U32 -> Completion.Outcome -> IO(Unit),
7008  +settings: Limits, +inbox: Chan(Admission.Command), st: Maybe<&1, Serving>
7009) -> IO(Unit):
7010  Limits{max, cap, hm, bm, im, wm} = settings
7011  match st:
7012    case None{}:
7013      IO.pure(Unit, Unit{})
7014    case Some{Serving{(s, t), phase}}:
7015      match t:
7016        case TurnMore{sv, cont}:
7017          do IO<Unit>:
7018            received : (Socket & Turn) & Phase <- talk.recv(inbox, False{}, settings, s, sv, cont, phase)
7019            serve.write.talk(~S, ~start, ~write, ~dispose, ~observe, settings, inbox, Some{talk.state(received)})
7020        case TurnReq{req, rest, v11}:
7021          do IO<Unit>:
7022            admitted : Bool <- Admission.take(inbox, 1)
7023            after : Maybe<&1, Socket & Turn> <- admission.write(~S, ~start, ~write, ~dispose, ~observe, admitted, inbox, settings, s, req, rest, v11)
7024            serve.write.talk(~S, ~start, ~write, ~dispose, ~observe, settings, inbox, serve.write.state(after))
7025        case TurnFail{status}:
7026          reply_fail(Completion.Observed{status => outcome => observe(status, outcome)}, s, status, wm)
7027        case TurnClose{}:
7028          Socket.close(s)
7029        case TurnInputFailed{operation, code, message}:
7030          Socket.close(s)

Uses (28)

Used by (1)