Skip to content

Commit

Permalink
refactor webtransport server to use wtransport crate
Browse files Browse the repository at this point in the history
  • Loading branch information
UkoeHB committed Dec 22, 2024
1 parent fc6e327 commit 3c0ebc4
Show file tree
Hide file tree
Showing 9 changed files with 153 additions and 204 deletions.
2 changes: 1 addition & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,13 @@
- `rustls`: 0.21 -> 0.23.5
- `quinn`: 0.10 -> 0.11.6
- `rcgen`: 0.12 -> 0.13
- `h3-quinn`/`h3-webtransport`/`h3`: h3-v0.0.4 -> h3-v0.0.6
- Split `TransportSocket` into separate `ServerSocket`/`ClientSocket` traits.
- Add `webtransport_is_available()`/`webtransport_is_available_with_cert_hashes()` helpers for WASM clients.
- Add support for reliable transport sockets.
- Add `TransportSocket::is_reliable`. It's true for in-memory sockets and WebSockets, and false for UDP and WebTransport.
- Add `has_reliable_socket` argument to `RenetClient::new`
- Add WebSocket server and client. The client is WASM-only.
- Replace `h3` dependency with `wtransport` for WebTransport backend.

## 0.0.7 - 12/02/24

Expand Down
12 changes: 4 additions & 8 deletions examples/echo_server_cross/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ use std::{
};
use warp::Filter;

use log::{debug, info};
use log::{debug, info, trace};
use renet2::{
transport::{
BoxedSocket, NativeSocket, NetcodeServerTransport, ServerCertHash, ServerSetupConfig, ServerSocket, WebServerDestination,
Expand All @@ -22,11 +22,7 @@ struct ClientConnectionInfo {
}

fn main() {
env_logger::builder()
.filter_level(log::LevelFilter::Info)
.filter_module("h3::server", log::LevelFilter::Warn)
.filter_module("h3::server::connection", log::LevelFilter::Warn)
.init();
env_logger::builder().filter_level(log::LevelFilter::Info).init();

let runtime = tokio::runtime::Runtime::new().unwrap();

Expand Down Expand Up @@ -113,13 +109,13 @@ fn run_renet_server(mut transport: NetcodeServerTransport) {
let mut last_updated = Instant::now();

loop {
debug!("server tick");
trace!("server tick");
let now = Instant::now();
let duration = now - last_updated;
last_updated = now;

transport.update(duration, &mut server).unwrap();
debug!("server update");
trace!("server update");

while let Some(event) = server.get_event() {
match event {
Expand Down
31 changes: 14 additions & 17 deletions renet2/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -41,22 +41,21 @@ wt_server_transport = [
"transport",
"dep:crossbeam",
"dep:anyhow",
"dep:wtransport",

"dep:rustls",
"dep:rustls-pki-types",
"dep:rcgen",
"dep:quinn",
"dep:h3-quinn",
"dep:h3-webtransport",
"dep:tokio",
"dep:http",

"dep:tokio",
"dep:futures",
"dep:h3",
"dep:time",
#"dep:x509-cert",
#"dep:spki",
#"dep:base64",
"dep:serde_json",
"dep:form_urlencoded",
"dep:urlencoding",
]

# Enable the WebTransport client transport (WASM only)
Expand All @@ -71,14 +70,16 @@ wt_client_transport = [
"dep:send_wrapper",
"dep:getrandom",
"dep:web-sys",
"dep:serde_json"
"dep:urlencoding",
]

# Enable the WebSocket server transport
ws_server_transport = [
"transport",
"dep:tungstenite",
"dep:tokio-tungstenite"
"dep:tokio-tungstenite",
"dep:http",
"dep:urlencoding",
]

# Enable rustls acceptors for WebSocket server transports.
Expand All @@ -99,7 +100,8 @@ ws_client_transport = [
"dep:web-sys",
"dep:serde_json",
"dep:futures-util",
"dep:futures-channel"
"dep:futures-channel",
"dep:urlencoding",
]

[dependencies]
Expand All @@ -119,28 +121,23 @@ crossbeam = { version = "0.8", optional = true }
# WebTransport shared
futures = { version = "0.3", optional = true }
serde_json = { version = "1.0", optional = true }
urlencoding = { version = "2.1", optional = true }

# WebTransport server
anyhow = { version = "1.0", optional = true }
wtransport = { version = "0.5", optional = true, default-features = false, features = ["quinn", "self-signed"] }
rustls = { version = "0.23.5", optional = true } #locked to 0.23.5 until quinn updates
rustls-pki-types = { version = "1.7", optional = true } #locked to 1.7 until quinn updates
rcgen = { version = "0.13", optional = true }
quinn = { version = "0.11.6", optional = true, default-features = false, features = [
"runtime-tokio",
"rustls-ring",
] }
h3-quinn = { tag = "h3-v0.0.6", optional = true, git = "https://github.com/hyperium/h3" }
h3-webtransport = { version = "0.1", tag = "h3-v0.0.6", optional = true, git = "https://github.com/hyperium/h3" }
tokio = { version = "1.32", optional = true, features = ["full"] }
http = { version = "1.0", optional = true }
h3 = { tag = "h3-v0.0.6", optional = true, git = "https://github.com/hyperium/h3", features = [
"i-implement-a-third-party-backend-and-opt-into-breaking-changes"
] }
tokio = { version = "1.32", optional = true, features = ["full"] }
time = { version = "0.3", optional = true }
#x509-cert = { version = "0.2", optional = true }
#spki = { version = "0.7", optional = true, features = ["fingerprint"] }
#base64 = { version = "0.22", optional = true }
form_urlencoded = { version = "1.2", optional = true }

# WebTransport client
async-channel = { version = "2.2", optional = true }
Expand Down
4 changes: 2 additions & 2 deletions renet2/src/transport/websocket_socket/client/socket.rs
Original file line number Diff line number Diff line change
Expand Up @@ -93,8 +93,8 @@ impl WebSocketClient {
};

// Build URL with connection request.
let connect_msg_ser = serde_json::to_string(&connection_req).expect("could not serialize connect msg");
server_url.query_pairs_mut().append_pair(HTTP_CONNECT_REQ, connect_msg_ser.as_str());
let connect_msg_ser = urlencoding::encode_binary(&connection_req);
server_url.set_query(Some(format!("{}={}", HTTP_CONNECT_REQ, &connect_msg_ser).as_str()));

let Ok(ws) = WebSocket::new(server_url.as_str()) else {
warn!(
Expand Down
14 changes: 3 additions & 11 deletions renet2/src/transport/websocket_socket/server/socket.rs
Original file line number Diff line number Diff line change
Expand Up @@ -681,21 +681,13 @@ fn extract_client_connection_req(uri: &Uri) -> Result<Vec<u8>, Error> {
log::trace!("invalid uri query, dropping connection request...");
return Err(Error::msg("invalid uri query, dropping connection request..."));
};
let mut query_elements_iterator = form_urlencoded::parse(query.as_bytes());
let Some((key, connection_req)) = query_elements_iterator.next() else {
let Some(encoded) = query.split_once(HTTP_CONNECT_REQ).and_then(|(_, r)| r.strip_prefix("=")) else {
log::trace!("invalid uri query (missing req), dropping connection request...");
return Err(Error::msg("invalid uri query (missing req), dropping connection request..."));
};
if key != HTTP_CONNECT_REQ {
log::trace!("invalid uri query (bad key), dropping connection request...");
return Err(Error::msg("invalid uri query (bad key), dropping connection request..."));
}
let Ok(connection_req) = serde_json::de::from_str::<Vec<u8>>(&connection_req) else {
log::trace!("invalid uri query (bad req), dropping connection request...");
return Err(Error::msg("invalid uri query (bad req), dropping connection request..."));
};
let connection_req = urlencoding::decode_binary(encoded.as_bytes());

Ok(connection_req)
Ok(connection_req.into())
}

/// Makes a websocket url: `{ws, wss}://[ip:port]/ws`.
Expand Down
4 changes: 2 additions & 2 deletions renet2/src/transport/webtransport_socket/client/socket.rs
Original file line number Diff line number Diff line change
Expand Up @@ -171,8 +171,8 @@ impl WebTransportClient {
.clone()
.try_into()
.expect("could not convert server destination to url");
let connect_msg_ser = serde_json::to_string(&connection_req).expect("could not serialize connect msg");
url.query_pairs_mut().append_pair(HTTP_CONNECT_REQ, connect_msg_ser.as_str());
let connect_msg_ser = urlencoding::encode_binary(&connection_req);
url.set_query(Some(format!("{}={}", HTTP_CONNECT_REQ, &connect_msg_ser).as_str()));

// Set up WebTransport.
let web_transport = match Self::init_web_transport(url.as_str(), options).await {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ pub fn generate_self_signed_certificate_opinionated<T: Into<WebServerDestination
subject_alt_names: impl IntoIterator<Item = T>,
) -> Result<(CertificateDer<'static>, PrivateKeyDer<'static>), rcgen::Error> {
let not_before = OffsetDateTime::now_utc().saturating_sub(1.hours()); //adjust for client system time variance
let not_after = not_before.saturating_add(2.weeks().saturating_sub(1.minutes())); //less than 2 weeks
let not_after = not_before.saturating_add(2.weeks());
let mut distinguished_name = DistinguishedName::new();
distinguished_name.push(DnType::CommonName, "renet2 self signed cert");

Expand Down
Loading

0 comments on commit 3c0ebc4

Please sign in to comment.