sark-h2 0.23.0

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

use dope::{
    core::driver::{route::Identity, schedule::ready::task::owner},
    manifold::{app::receive, network::listener::conn},
};
use sark_core::{life, manifold::task::app::Runtime};

use crate::server::{
    runtime::output::flush,
    task::{Target, Transport},
};

pub(in crate::server::task::app) fn apply<'d, ID: Identity + 'd, R, M>(
    router: pin::Pin<&mut R>,
    mode: &mut M,
    conn: conn::Id<'d, ID>,
) -> receive::Outcome
where
    R: Runtime<'d, Target = Target<'d, ID>>,
    M: Transport<'d, ID>,
    M::Output: flush::Evidence<'d>,
{
    let owner = owner::Owner::from(conn);
    if let Err(cause) = Runtime::register(router.as_ref(), owner) {
        life::Mode::diagnostic(mode, &cause);
        return receive::Outcome::Failed(receive::Failure::Contract);
    }
    mode.observe(life::Event::SessionOpened(conn));
    receive::Outcome::Continue
}