diff --git a/CHANGELOG.md b/CHANGELOG.md index 709c47d3..870e3b9a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ - For now, all crates will share the same major and minor version number, but we are now free to bump the patch for individual subcrates - `aeronet_replicon` properly reports backend statistics to Replicon i.e. RTT, packet loss - Updated `bevy_replicon` to `0.30.0` +- Update `wtransport` to `0.5.0`, `xwt-wtransport` and `xwt-web` # 0.11.0 diff --git a/Cargo.lock b/Cargo.lock index d9368ddc..ad2ac4fa 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -246,7 +246,7 @@ dependencies = [ "wtransport", "x509-cert", "xwt-core", - "xwt-web-sys", + "xwt-web", "xwt-wtransport", ] @@ -6235,6 +6235,19 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "web-wt-sys" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9be7bc7d2d53ad808ff3b3e967391ec3734932d8119320dfd96b13d89327dfc9" +dependencies = [ + "js-sys", + "paste", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + [[package]] name = "webbrowser" version = "1.0.3" @@ -6961,9 +6974,9 @@ checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" [[package]] name = "wtransport" -version = "0.3.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfe1ad803279d5a9c216e2e77f20e46b3c1275a9aba30c5e533f7537a85f5f2a" +checksum = "93a724f65db90b6a1ffa92ea4966cf03cb7e2bcd3ef7135b84dfe4339640d1b9" dependencies = [ "bytes", "pem", @@ -6986,9 +6999,9 @@ dependencies = [ [[package]] name = "wtransport-proto" -version = "0.3.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2e4eb0239a9157bc05e8a40deccc9358796db67e42d096f7673630f17955edb" +checksum = "14e4882c24a62f15024609b3688e6e29a4c2129634d27debc849ccd3f9b9690b" dependencies = [ "httlib-huffman", "octets", @@ -7099,32 +7112,35 @@ checksum = "c5b940ebc25896e71dd073bad2dbaa2abfe97b0a391415e22ad1326d9c54e3c4" [[package]] name = "xwt-core" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e003285401374e0eb07a563d78bc4d79402482df5228c304829c36888a54aaed" +checksum = "647e17b66bd49bfebe8fe73d327358432f298bb41227600f47fb07fa4f7c1eef" [[package]] -name = "xwt-web-sys" -version = "0.12.0" +name = "xwt-web" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2dcac32667f471216ce3003742f67e2e0f33bff76c8fec09ecd34e98690ad16" +checksum = "f80997b90d89451537f2866130f52b1e4be4d29cfadf9183081b24542f1abdf0" dependencies = [ "js-sys", + "thiserror 2.0.11", "tokio", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", "web-sys-async-io", "web-sys-stream-utils", + "web-wt-sys", "xwt-core", ] [[package]] name = "xwt-wtransport" -version = "0.10.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4681f9defee857e88528f65cbf77bf98921a8cf2bd22ba27f05fe60fe0df49b" +checksum = "e08a2dd44b6b4c44e55934b1bca0b92b5356ef36e7a3a59226262b60a684affa" dependencies = [ + "thiserror 2.0.11", "wtransport", "xwt-core", ] diff --git a/Cargo.toml b/Cargo.toml index d92170ef..dfe6399b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -128,16 +128,16 @@ tokio-tungstenite = "0.24.0" # aeronet_webtransport # core -xwt-core = "0.5.0" +xwt-core = "0.6.0" # native spki = "0.7.3" -wtransport = "0.3.1" +wtransport = "0.5.0" x509-cert = "0.2.5" -xwt-wtransport = "0.10.0" +xwt-wtransport = "0.13.0" # wasm -xwt-web-sys = "0.12.0" +xwt-web = "0.15.0" # aeronet_replicon diff --git a/crates/aeronet_websocket/examples/websocket_client.rs b/crates/aeronet_websocket/examples/websocket_client.rs index 82de5e2b..dd4f9532 100644 --- a/crates/aeronet_websocket/examples/websocket_client.rs +++ b/crates/aeronet_websocket/examples/websocket_client.rs @@ -121,6 +121,10 @@ fn global_ui(mut egui: EguiContexts, mut commands: Commands, mut ui_state: ResMu #[cfg(target_family = "wasm")] fn client_config() -> ClientConfig { + #[expect( + clippy::default_constructed_unit_structs, + reason = "keep parity with non-WASM" + )] ClientConfig::default() } diff --git a/crates/aeronet_websocket/examples/websocket_echo_server.rs b/crates/aeronet_websocket/examples/websocket_echo_server.rs index 6329d4e3..f30dad95 100644 --- a/crates/aeronet_websocket/examples/websocket_echo_server.rs +++ b/crates/aeronet_websocket/examples/websocket_echo_server.rs @@ -1,8 +1,6 @@ //! Example server using WebSocket which listens for clients sending strings //! and sends back a string reply. -use aeronet_io::server::Server; - cfg_if::cfg_if! { if #[cfg(target_family = "wasm")] { fn main() { @@ -13,6 +11,7 @@ cfg_if::cfg_if! { use { aeronet_io::{ connection::{DisconnectReason, Disconnected, LocalAddr}, + server::Server, SessionEndpoint, Session, }, aeronet_websocket::server::{Identity, ServerConfig, WebSocketServer, WebSocketServerPlugin}, diff --git a/crates/aeronet_websocket/tests/connection.rs b/crates/aeronet_websocket/tests/connection.rs index 62f3bb9c..6b8542f6 100644 --- a/crates/aeronet_websocket/tests/connection.rs +++ b/crates/aeronet_websocket/tests/connection.rs @@ -1,4 +1,9 @@ -#![expect(missing_docs, clippy::too_many_lines, reason = "testing")] +#![expect(missing_docs, reason = "testing")] +#![cfg(not(target_family = "wasm"))] +#![cfg_attr( + not(target_family = "wasm"), + expect(clippy::too_many_lines, reason = "testing") +)] use { aeronet_io::{ diff --git a/crates/aeronet_webtransport/Cargo.toml b/crates/aeronet_webtransport/Cargo.toml index 0d64ddca..88f16193 100644 --- a/crates/aeronet_webtransport/Cargo.toml +++ b/crates/aeronet_webtransport/Cargo.toml @@ -71,7 +71,7 @@ gloo-timers = { workspace = true, features = ["futures"] } js-sys = { workspace = true } wasm-bindgen = { workspace = true } wasm-bindgen-futures = { workspace = true } -xwt-web-sys = { workspace = true } +xwt-web = { workspace = true } [target.'cfg(not(target_family = "wasm"))'.dependencies] spki = { workspace = true, features = ["fingerprint"] } diff --git a/crates/aeronet_webtransport/examples/webtransport_client.rs b/crates/aeronet_webtransport/examples/webtransport_client.rs index 7cf2e2e0..407711af 100644 --- a/crates/aeronet_webtransport/examples/webtransport_client.rs +++ b/crates/aeronet_webtransport/examples/webtransport_client.rs @@ -143,16 +143,22 @@ fn global_ui(mut egui: EguiContexts, mut commands: Commands, mut ui_state: ResMu #[cfg(target_family = "wasm")] fn client_config(cert_hash: String) -> Result { - use aeronet_webtransport::xwt_web_sys::{CertificateHash, HashAlgorithm}; - - let server_certificate_hashes = match cert::hash_from_b64(&cert_hash) { - Ok(hash) => vec![CertificateHash { - algorithm: HashAlgorithm::Sha256, - value: Vec::from(hash), - }], - Err(err) => { - warn!("Failed to read certificate hash from string: {err:?}",); - Vec::new() + use { + aeronet_webtransport::xwt_web::{CertificateHash, HashAlgorithm}, + anyhow::bail, + }; + + let server_certificate_hashes = if cert_hash.is_empty() { + Vec::new() + } else { + match cert::hash_from_b64(&cert_hash) { + Ok(hash) => vec![CertificateHash { + algorithm: HashAlgorithm::Sha256, + value: Vec::from(hash), + }], + Err(err) => { + bail!("Failed to read certificate hash from string: {err:?}"); + } } }; diff --git a/crates/aeronet_webtransport/examples/webtransport_echo_server.rs b/crates/aeronet_webtransport/examples/webtransport_echo_server.rs index a7923454..2664615a 100644 --- a/crates/aeronet_webtransport/examples/webtransport_echo_server.rs +++ b/crates/aeronet_webtransport/examples/webtransport_echo_server.rs @@ -1,8 +1,6 @@ //! Example server using WebTransport which listens for clients sending strings //! and sends back a string reply. -use aeronet_io::{Session, server::Server}; - cfg_if::cfg_if! { if #[cfg(target_family = "wasm")] { fn main() { @@ -13,6 +11,8 @@ cfg_if::cfg_if! { use { aeronet_io::{ connection::{DisconnectReason, Disconnected, LocalAddr}, + server::Server, + Session, }, aeronet_webtransport::{ cert, @@ -53,11 +53,11 @@ fn open_server(mut commands: Commands) { info!(" {cert_hash}"); info!("************************"); - let config = server_config(&identity); + let config = server_config(identity); commands.spawn_empty().queue(WebTransportServer::open(config)); } -fn server_config(identity: &wtransport::Identity) -> ServerConfig { +fn server_config(identity: wtransport::Identity) -> ServerConfig { wtransport::ServerConfig::builder() .with_bind_default(25565) .with_identity(identity) diff --git a/crates/aeronet_webtransport/src/client/backend.rs b/crates/aeronet_webtransport/src/client/backend.rs index dc707123..4b9e4a88 100644 --- a/crates/aeronet_webtransport/src/client/backend.rs +++ b/crates/aeronet_webtransport/src/client/backend.rs @@ -16,21 +16,18 @@ pub async fn start( target: ConnectTarget, send_next: oneshot::Sender, ) -> Result> { - // TODO: On native, debug log the target after this is merged: - // https://github.com/BiagioFesta/wtransport/pull/226 - #[cfg(target_family = "wasm")] - debug!("Spawning backend task to connect to {target:?}"); - let endpoint = { #[cfg(target_family = "wasm")] { - xwt_web_sys::Endpoint { + debug!("Spawning backend task to connect to {target:?}"); + xwt_web::Endpoint { options: config.to_js(), } } #[cfg(not(target_family = "wasm"))] { + debug!("Spawning backend task to connect to {:?}", target.url()); wtransport::Endpoint::client(config) .map(xwt_wtransport::Endpoint) .map_err(SessionError::CreateEndpoint) diff --git a/crates/aeronet_webtransport/src/client/mod.rs b/crates/aeronet_webtransport/src/client/mod.rs index 029d132c..00a1af72 100644 --- a/crates/aeronet_webtransport/src/client/mod.rs +++ b/crates/aeronet_webtransport/src/client/mod.rs @@ -26,7 +26,7 @@ use { cfg_if::cfg_if! { if #[cfg(target_family = "wasm")] { /// Configuration for the [`WebTransportClient`] on WASM platforms. - pub type ClientConfig = xwt_web_sys::WebTransportOptions; + pub type ClientConfig = xwt_web::WebTransportOptions; type ConnectTarget = String; diff --git a/crates/aeronet_webtransport/src/js_error.rs b/crates/aeronet_webtransport/src/js_error.rs index b7919e6d..2507defd 100644 --- a/crates/aeronet_webtransport/src/js_error.rs +++ b/crates/aeronet_webtransport/src/js_error.rs @@ -7,7 +7,7 @@ use { /// /// You can get one [from][`From`] a: /// - [`JsValue`] -/// - [`xwt_web_sys::Error`] +/// - [`xwt_web::Error`] #[derive(Debug, Clone)] pub struct JsError(pub String); @@ -32,8 +32,8 @@ impl From for JsError { } } -impl From for JsError { - fn from(value: xwt_web_sys::Error) -> Self { +impl From for JsError { + fn from(value: xwt_web::Error) -> Self { Self::from(value.0) } } diff --git a/crates/aeronet_webtransport/src/lib.rs b/crates/aeronet_webtransport/src/lib.rs index 64659a85..be0cd5f7 100644 --- a/crates/aeronet_webtransport/src/lib.rs +++ b/crates/aeronet_webtransport/src/lib.rs @@ -27,7 +27,7 @@ cfg_if::cfg_if! { mod js_error; pub use js_error::JsError; - pub use xwt_web_sys; + pub use xwt_web; } else { #[cfg(feature = "server")] pub mod server; diff --git a/crates/aeronet_webtransport/src/server/mod.rs b/crates/aeronet_webtransport/src/server/mod.rs index a0a4e773..723e4058 100644 --- a/crates/aeronet_webtransport/src/server/mod.rs +++ b/crates/aeronet_webtransport/src/server/mod.rs @@ -78,7 +78,7 @@ impl WebTransportServer { /// /// let config = ServerConfig::builder() /// .with_bind_default(12345) // server port - /// .with_identity(&identity) + /// .with_identity(identity) /// .build(); /// /// // using `Commands` diff --git a/crates/aeronet_webtransport/src/session.rs b/crates/aeronet_webtransport/src/session.rs index 5c7f3786..6a83a493 100644 --- a/crates/aeronet_webtransport/src/session.rs +++ b/crates/aeronet_webtransport/src/session.rs @@ -28,7 +28,7 @@ use { cfg_if::cfg_if! { if #[cfg(target_family = "wasm")] { - type Connection = xwt_web_sys::Session; + type Connection = xwt_web::Session; type ConnectionError = crate::JsError; } else { type Connection = xwt_wtransport::Connection; @@ -463,11 +463,11 @@ async fn disconnect(conn: Arc, reason: &str) { #[cfg(target_family = "wasm")] { - use {wasm_bindgen_futures::JsFuture, xwt_web_sys::sys::WebTransportCloseInfo}; + use {js_sys::JsString, xwt_web::web_wt_sys::WebTransportCloseInfo}; - let mut close_info = WebTransportCloseInfo::new(); - close_info.close_code(DISCONNECT_ERROR_CODE); - close_info.reason(reason); + let close_info = WebTransportCloseInfo::new(); + close_info.set_close_code(DISCONNECT_ERROR_CODE); + close_info.set_reason(JsString::from(reason)); // TODO: This seems to not close the connection properly // Could it be because of this? @@ -475,8 +475,8 @@ async fn disconnect(conn: Arc, reason: &str) { // // Tested: the server times us out instead of actually // reading the disconnect - conn.transport.close_with_close_info(&close_info); - _ = JsFuture::from(conn.transport.closed()).await; + conn.transport.close_with_info(&close_info); + _ = conn.transport.closed().await; } #[cfg(not(target_family = "wasm"))] diff --git a/crates/aeronet_webtransport/tests/connection.rs b/crates/aeronet_webtransport/tests/connection.rs index 08c9bd2f..24a9bd34 100644 --- a/crates/aeronet_webtransport/tests/connection.rs +++ b/crates/aeronet_webtransport/tests/connection.rs @@ -1,4 +1,9 @@ -#![expect(missing_docs, clippy::too_many_lines, reason = "testing")] +#![expect(missing_docs, reason = "testing")] +#![cfg(not(target_family = "wasm"))] +#![cfg_attr( + not(target_family = "wasm"), + expect(clippy::too_many_lines, reason = "testing") +)] use { aeronet_io::{ @@ -28,14 +33,15 @@ fn connect() { _ = wtransport::tls::rustls::crypto::ring::default_provider().install_default(); let identity = Identity::self_signed(["127.0.0.1", "::1", "localhost"]).unwrap(); + let cert_hash = identity.certificate_chain().as_slice()[0].hash(); ping_pong( ServerConfig::builder() .with_bind_default(PORT) - .with_identity(&identity) + .with_identity(identity) .build(), ClientConfig::builder() .with_bind_default() - .with_server_certificate_hashes([identity.certificate_chain().as_slice()[0].hash()]) + .with_server_certificate_hashes([cert_hash]) .build(), format!("https://[::1]:{PORT}"), ); diff --git a/examples/move_box_client/src/main.rs b/examples/move_box_client/src/main.rs index d36dee00..b68f372f 100644 --- a/examples/move_box_client/src/main.rs +++ b/examples/move_box_client/src/main.rs @@ -254,7 +254,7 @@ type WebTransportClientConfig = aeronet_webtransport::client::ClientConfig; #[cfg(target_family = "wasm")] fn web_transport_config(cert_hash: String) -> WebTransportClientConfig { - use aeronet_webtransport::xwt_web_sys::{CertificateHash, HashAlgorithm}; + use aeronet_webtransport::xwt_web::{CertificateHash, HashAlgorithm}; let server_certificate_hashes = match cert::hash_from_b64(&cert_hash) { Ok(hash) => vec![CertificateHash { diff --git a/examples/move_box_server/src/server.rs b/examples/move_box_server/src/server.rs index 1b006aad..cef850da 100644 --- a/examples/move_box_server/src/server.rs +++ b/examples/move_box_server/src/server.rs @@ -86,7 +86,7 @@ fn open_web_transport_server(mut commands: Commands, args: Res) { info!(" {cert_hash}"); info!("************************"); - let config = web_transport_config(&identity, &args); + let config = web_transport_config(identity, &args); let server = commands .spawn((Name::new("WebTransport Server"), AeronetRepliconServer)) .queue(WebTransportServer::open(config)) @@ -96,7 +96,7 @@ fn open_web_transport_server(mut commands: Commands, args: Res) { type WebTransportServerConfig = aeronet_webtransport::server::ServerConfig; -fn web_transport_config(identity: &wtransport::Identity, args: &Args) -> WebTransportServerConfig { +fn web_transport_config(identity: wtransport::Identity, args: &Args) -> WebTransportServerConfig { WebTransportServerConfig::builder() .with_bind_default(args.wt_port) .with_identity(identity)