#![warn(missing_docs)]
pub mod accept;
pub mod bind;
mod client;
mod connect;
mod crypto;
mod error;
#[cfg(any(feature = "quinn", feature = "noq", feature = "quiche", feature = "tcp"))]
pub mod failover;
#[cfg(feature = "jemalloc")]
pub mod jemalloc;
mod log;
#[cfg(feature = "noq")]
pub mod noq;
pub mod quic;
#[cfg(feature = "quinn")]
pub mod quinn;
mod reconnect;
mod server;
#[cfg(feature = "tcp")]
pub mod tcp;
pub mod tls;
#[cfg(all(feature = "uds", unix))]
pub mod unix;
mod util;
#[cfg(feature = "watch")]
pub mod watch;
#[cfg(feature = "websocket")]
pub mod websocket;
pub use client::{Client, ClientConfig};
pub use connect::ConnectError;
pub use error::{Error, Result};
pub use log::Log;
pub use reconnect::{Backoff, ConnectionStatsReader, Reconnect, Status};
pub use server::{Request, Server, ServerConfig, Transport};
pub(crate) fn spawn_session((session, driver): (moq_net::Session, moq_net::Driver)) -> moq_net::Session {
tokio::spawn(driver);
session
}
pub use moq_net;
pub use rustls;
#[cfg(feature = "watch")]
pub use notify;
#[cfg(target_os = "android")]
pub use jni;
#[cfg(feature = "quiche")]
pub mod quiche;
#[cfg(feature = "iroh")]
pub mod iroh;
#[derive(Clone, Debug, clap::ValueEnum, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "lowercase")]
#[non_exhaustive]
pub enum QuicBackend {
#[cfg(feature = "quinn")]
Quinn,
#[cfg(feature = "quiche")]
Quiche,
#[cfg(feature = "noq")]
Noq,
}
impl std::str::FromStr for QuicBackend {
type Err = String;
fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
<Self as clap::ValueEnum>::from_str(s, true)
}
}
impl QuicBackend {
pub fn compiled() -> &'static [Self] {
&[
#[cfg(feature = "quinn")]
Self::Quinn,
#[cfg(feature = "quiche")]
Self::Quiche,
#[cfg(feature = "noq")]
Self::Noq,
]
}
pub fn as_str(&self) -> &'static str {
match *self {
#[cfg(feature = "quinn")]
Self::Quinn => "quinn",
#[cfg(feature = "quiche")]
Self::Quiche => "quiche",
#[cfg(feature = "noq")]
Self::Noq => "noq",
}
}
}
pub fn qlog_supported() -> bool {
cfg!(feature = "qlog")
}
fn default_quic_backend() -> QuicBackend {
#[cfg(feature = "quinn")]
{
QuicBackend::Quinn
}
#[cfg(all(feature = "noq", not(feature = "quinn")))]
{
QuicBackend::Noq
}
#[cfg(all(feature = "quiche", not(feature = "quinn"), not(feature = "noq")))]
{
QuicBackend::Quiche
}
#[cfg(all(not(feature = "quiche"), not(feature = "quinn"), not(feature = "noq")))]
panic!("no QUIC backend compiled; enable noq, quinn, or quiche feature");
}
#[cfg(test)]
mod tests {
#[cfg(feature = "quinn")]
#[test]
fn quinn_is_the_default_backend() {
assert!(matches!(super::default_quic_backend(), super::QuicBackend::Quinn));
}
}