sark-h2 0.28.5

Fiber-free HTTP/2 protocol primitives and manifold server for sark
use std::pin;

use dope::{
    core::driver::route::Identity,
    manifold::{
        app::receive,
        network::listener::{conn::Id, handler::retire},
    },
    net::link::pool::recv::input::Execution,
};
use sark_core::{
    decode::request,
    life,
    manifold::{server::app as semantic, task::app::Runtime},
};

use crate::server::{
    Target,
    response::Handoff,
    runtime::output::flush,
    task::{App, Build, Retired, Transport, app::turn::schedule::Schedule, service, timers},
};

pub struct Retire;

impl<'d, ID: Identity + 'd, R, W, M, D, P, A> retire::Policy<'d, App<'d, ID, R, W, M, D, P, A>, ID>
    for Retire
where
    R: Runtime<'d, Target = Target<'d, ID>>,
    A: service::Select<R> + semantic::Timed<'d, service::Connection<'d, A>, Id<'d, ID>>,
    W: Execution + 'd,
    receive::Scoped: receive::Mode<W>,
    M: Transport<'d, ID>,
    M::Output: flush::Evidence<'d>,
    M::Retention: Handoff,
    D: timers::Policy<'d>,
    P: crate::server::runtime::app::Fault<'d, W, A::Failure, ID, Build<A::Build>>,
    <R::Head as request::Head>::Start: Schedule<'d, R>,
{
    fn select() -> Option<Self> {
        Some(Self)
    }

    fn retire(
        self,
        app: pin::Pin<&mut App<'d, ID, R, W, M, D, P, A>>,
        mut conn: Retired<'_, '_, 'd, ID, R, W, M, D, A>,
    ) {
        let this = app.project();
        let id = conn.id();
        let bytes = conn.response_len();
        let state = conn.state_mut();
        let count = state.task_index.len();
        let empty = state.task_index.is_empty();
        life::Mode::close(this.mode, id, || {
            state.turn().audit(count, empty).wire_bytes(bytes)
        });
    }
}