def server.loop.go

emerging-ezhttp@0.21.0.0 · src/server.bend:401

import emerging-ezhttp@0.21.0.0/src/server.bend as Server
import Base
import emerging-ezhttp@0.21.0.0/src/step.bend as Step

401# the limited accept loop: `fuel` connections left, `idles` idle accepts in
402# a row left, `forks` forked so far
403def server.loop.go(~C: Data, ~handle: C -> Req -> IO(Answer), +ctx: C,
404  fuel: Nat, idles: Nat, +forks: Nat, +slots: Chan(Unit), +limited: Bool,
405  +done: Chan(Unit), listener: Listener) -> IO(Unit):
406  match fuel idles:
407    case 0n _:
408      IO.bind(Unit, Unit, Listener.close(listener), _u => server.join(forks, done))
409    case 1n+_f 0n:
410      IO.bind(Unit, Unit, Listener.close(listener), _u => server.join(forks, done))
411    case 1n+f0 1n+i:
412      +f = f0
413      IO.bind(Listener & Step.Accept<Socket>, Unit, server.accept(listener),
414        r => server.loop.got(~C, handle, ctx, slots, limited, done, True{}, r,
415          l => server.loop.go(~C, handle, ctx, f, server.idles(), 1n+forks, slots,
416            limited, done, l),
417          l => server.loop.go(~C, handle, ctx, 1n+f, i, forks, slots, limited,
418            done, l),
419          l => server.loop.go(~C, handle, ctx, f, server.idles(), forks, slots,
420            limited, done, l)))

Uses (17)

Used by (1)