0.3.5-alpha.9

This commit is contained in:
2026-09-22 08:32:36 +02:00
parent 17d9e18dcd
commit 9f1a1c3d06
13 changed files with 638 additions and 21 deletions

View File

@@ -1,5 +1,5 @@
// file: crates/common/game-realtime-webtransport-lib/src/webtransport_wasm.rs
// version: 2
// version: 3
const CERTIFICATE_HASH_SIZE: usize = 32;
const FRAME_PROTOCOL_ERROR_CODE: u32 = 0x10;
@@ -123,6 +123,36 @@ impl WebTransportSession {
pub fn endpoint(&self) -> &str {
return self.inner.url().as_str();
}
/// Returns the maximum payload size accepted by the browser WebTransport datagram path.
#[must_use]
pub fn max_datagram_size(&self) -> usize {
return self.inner.max_datagram_size();
}
/// Sends one browser WebTransport datagram without reliability or ordering guarantees.
///
/// This capability is intentionally not part of `RealtimeConnection`.
pub async fn send_datagram(&self, payload: &[u8]) -> Result<(), game_realtime_transport_lib::TransportError> {
let max_datagram_size = self.max_datagram_size();
if payload.len() > max_datagram_size {
return Err(datagram_too_large(payload.len(), max_datagram_size));
}
return match self.inner.send_datagram(payload.to_vec().into()).await {
Ok(()) => Ok(()),
Err(error) => Err(map_write_error(error)),
};
}
/// Receives one browser WebTransport datagram without reliability or ordering guarantees.
///
/// The caller is responsible for applying any operation deadline required by its use case.
pub async fn receive_datagram(&self) -> Result<Vec<u8>, game_realtime_transport_lib::TransportError> {
return match self.inner.recv_datagram().await {
Ok(payload) => Ok(payload.to_vec()),
Err(error) => Err(map_read_error(error)),
};
}
}
/// Established browser WebTransport connection carrying the single reliable primary stream.
@@ -588,6 +618,13 @@ fn map_write_error(error: web_transport_wasm::Error) -> game_realtime_transport_
return transport_error(kind, error.to_string());
}
fn datagram_too_large(payload_len: usize, max_datagram_size: usize) -> game_realtime_transport_lib::TransportError {
return transport_error(
game_realtime_transport_lib::TransportErrorKind::MessageTooLarge,
format!("WebTransport datagram payload size {payload_len} exceeds current session maximum {max_datagram_size} bytes"),
);
}
fn message_too_large(payload_len: usize, max_message_size: usize) -> game_realtime_transport_lib::TransportError {
return transport_error(
game_realtime_transport_lib::TransportErrorKind::MessageTooLarge,