comnoq 0.3.5

QUIC for compio with noq backend
//! QUIC implementation based on [`quinn-proto`].
//!
//! [`quinn-proto`]: https://docs.rs/quinn-proto

#![cfg_attr(docsrs, feature(doc_cfg))]
#![allow(unused_features)]
#![warn(missing_docs)]
#![deny(rustdoc::broken_intra_doc_links)]

use std::time::Duration;

#[cfg(feature = "qlog")]
pub use noq_proto::QlogConfig;
pub use noq_proto::{
    AckFrequencyConfig, ApplicationClose, Chunk, ClientConfig, ClosePathError, ClosedPath,
    ClosedStream, ConfigError, ConnectError, ConnectionClose, ConnectionId, ConnectionIdGenerator,
    ConnectionStats, DecryptedInitial, Dir, EcnCodepoint, EndpointConfig, FourTuple, FrameStats,
    FrameType, IdleTimeout, MtuDiscoveryConfig, MultipathNotNegotiated, NetworkChangeHint,
    NoneTokenLog, NoneTokenStore, PathAbandonReason, PathError, PathEvent, PathId, PathStats,
    PathStatus, ServerConfig, SetPathStatusError, Side, StdSystemTime, StreamId, TimeSource,
    TokenLog, TokenMemoryCache, TokenReuseError, TokenStore, Transmit, TransportConfig,
    TransportErrorCode, UdpStats, ValidationTokenConfig, VarInt, VarIntBoundsExceeded, congestion,
    crypto, n0_nat_traversal,
};

#[cfg(rustls)]
mod builder;
mod connection;
#[cfg(feature = "graviola")]
pub(crate) mod crypto_graviola;
mod endpoint;
mod event_stream;
mod incoming;
mod path;
mod recv_stream;
mod send_stream;
mod socket;
mod work_limiter;

#[cfg(rustls)]
pub use builder::{ClientBuilder, ServerBuilder};
pub use connection::{
    Closed, Connecting, Connection, ConnectionError, OnClosed, OpenStreamError, SendDatagramError,
    WeakConnectionHandle, ZeroRttAccepted,
};
pub use endpoint::{Accept, Endpoint, EndpointStats};
#[cfg(feature = "graviola")]
pub use endpoint::{EndpointConfigGraviolaExt, ServerConfigGraviolaExt};
pub use event_stream::{Lagged, NatTraversalUpdates, ObservedExternalAddr, PathEvents};
pub use incoming::{Incoming, IncomingFuture};
pub use path::{AddressDiscovery, OpenPath, Path, WeakPathHandle};
pub use recv_stream::{ReadError, ReadExactError, RecvStream, ResetError, UnorderedRecvStream};
pub use send_stream::{SendStream, StoppedError, WriteError};
#[cfg(feature = "sync")]
pub(crate) use synchrony::sync;
#[cfg(not(feature = "sync"))]
pub(crate) use synchrony::unsync as sync;

pub(crate) use crate::{
    connection::{ConnectionEvent, ConnectionInner},
    endpoint::EndpointRef,
    socket::*,
};

/// Maximum number of datagrams/events processed before yielding to other work.
const IO_LOOP_BOUND: usize = 160;

/// Maximum time spent receiving UDP datagrams in a single endpoint cycle.
const RECV_TIME_BOUND: Duration = Duration::from_micros(50);

/// HTTP/3 support via [`h3`].
#[cfg(feature = "h3")]
pub mod h3 {
    #[doc(no_inline)]
    pub use h3::*;

    pub use crate::{
        connection::h3_impl::{BidiStream, OpenStreams},
        send_stream::h3_impl::SendStream,
    };
}