1#![warn(missing_docs)]
14
15pub mod accept;
16pub mod bind;
17mod client;
18mod connect;
19mod crypto;
20mod error;
21#[cfg(any(feature = "quinn", feature = "noq", feature = "quiche", feature = "tcp"))]
22pub mod failover;
23#[cfg(feature = "jemalloc")]
24pub mod jemalloc;
25mod log;
26#[cfg(feature = "noq")]
27pub mod noq;
28pub mod quic;
29#[cfg(feature = "quinn")]
30pub mod quinn;
31mod reconnect;
32#[cfg(any(feature = "quinn", feature = "noq", feature = "quiche", feature = "tcp"))]
33mod resolve;
34mod server;
35#[cfg(feature = "tcp")]
36pub mod tcp;
37pub mod tls;
38#[cfg(all(feature = "uds", unix))]
39pub mod unix;
40#[cfg(any(feature = "noq", feature = "quinn", feature = "quiche"))]
43mod util;
44#[cfg(feature = "watch")]
45pub mod watch;
46#[cfg(feature = "websocket")]
47pub mod websocket;
48
49pub use client::{Client, ClientConfig};
52pub use connect::ConnectError;
53pub use error::{Error, Result};
54pub use log::Log;
55pub use reconnect::{Backoff, ConnectionStatsReader, Reconnect, Status};
56pub use server::{Request, Server, ServerConfig, Transport};
57
58pub(crate) fn spawn_session((session, driver): (moq_net::Session, moq_net::Driver)) -> moq_net::Session {
70 use tracing::Instrument;
71 tokio::spawn(driver.instrument(tracing::Span::current()));
72 session
73}
74
75pub use moq_net;
77pub use rustls;
78
79fn version_parser() -> impl clap::builder::TypedValueParser<Value = moq_net::Version> {
80 use clap::builder::TypedValueParser;
81
82 clap::builder::PossibleValuesParser::new(moq_net::Version::names())
83 .map(|name| name.parse().expect("possible version names must parse"))
84}
85
86#[cfg(feature = "watch")]
89pub use notify;
90
91#[cfg(target_os = "android")]
94pub use jni;
95
96#[cfg(feature = "quiche")]
97pub mod quiche;
98
99#[cfg(feature = "iroh")]
100pub mod iroh;
101
102#[derive(Clone, Debug, clap::ValueEnum, serde::Serialize, serde::Deserialize)]
104#[serde(rename_all = "lowercase")]
105#[non_exhaustive]
106pub enum QuicBackend {
107 #[cfg(feature = "quinn")]
109 Quinn,
110
111 #[cfg(feature = "quiche")]
113 Quiche,
114
115 #[cfg(feature = "noq")]
117 Noq,
118}
119
120impl std::str::FromStr for QuicBackend {
124 type Err = String;
125
126 fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
127 <Self as clap::ValueEnum>::from_str(s, true)
128 }
129}
130
131impl QuicBackend {
132 pub fn compiled() -> &'static [Self] {
140 &[
141 #[cfg(feature = "quinn")]
142 Self::Quinn,
143 #[cfg(feature = "quiche")]
144 Self::Quiche,
145 #[cfg(feature = "noq")]
146 Self::Noq,
147 ]
148 }
149
150 pub fn as_str(&self) -> &'static str {
154 match *self {
155 #[cfg(feature = "quinn")]
156 Self::Quinn => "quinn",
157 #[cfg(feature = "quiche")]
158 Self::Quiche => "quiche",
159 #[cfg(feature = "noq")]
160 Self::Noq => "noq",
161 }
162 }
163}
164
165pub fn qlog_supported() -> bool {
170 cfg!(feature = "qlog")
171}
172
173#[cfg(any(feature = "noq", feature = "quinn", feature = "quiche"))]
178fn default_quic_backend() -> QuicBackend {
179 #[cfg(feature = "quinn")]
180 {
181 QuicBackend::Quinn
182 }
183 #[cfg(all(feature = "noq", not(feature = "quinn")))]
184 {
185 QuicBackend::Noq
186 }
187 #[cfg(all(feature = "quiche", not(feature = "quinn"), not(feature = "noq")))]
188 {
189 QuicBackend::Quiche
190 }
191}
192
193#[cfg(test)]
194mod tests {
195 #[cfg(feature = "quinn")]
196 #[test]
197 fn quinn_is_the_default_backend() {
198 assert!(matches!(super::default_quic_backend(), super::QuicBackend::Quinn));
199 }
200}