5.8 KiB
Delta 0.3.5-alpha.9
Base requise
0.3.5-alpha.8.fix.1, validée par l'utilisateur le 2026-09-22.
La gate finale confirme fmt, audits, cargo check --workspace, Clippy strict, les deux tests du launcher fallback et le smoke réel terminé par :
game-realtime-transport-fallback-smoke: PASS
La preuve est enregistrée dans history/0.3.5/alpha.8.fix.1.md.
Objectif
Challenger les datagrams WebTransport comme capacité backend-spécifique sans modifier le contrat fiable transport-neutral :
- émission/réception native réelle ;
- surface équivalente compilable côté navigateur/WASM ;
- taille maximale de datagram obtenue depuis la session ;
- rejet local des payloads trop grands ;
- preuve runtime locale bornée ;
- aucune garantie de livraison ou d'ordre ajoutée ;
- aucune API datagram dans
game-realtime-transport-lib.
Version
La version workspace passe à :
0.3.5-alpha.9
Capacité backend-spécifique
WebTransportSession expose désormais sur les chemins natif et navigateur :
max_datagram_size()
send_datagram(...)
receive_datagram()
Cette surface reste propre à game-realtime-webtransport-lib.
Les datagrams WebTransport sont non fiables et non ordonnés. Ils ne satisfont donc pas les invariants de RealtimeConnection, qui reste le chemin fiable ordonné commun à WebSocket et WebTransport.
Le backend vérifie la taille avant émission et retourne TransportErrorKind::MessageTooLarge lorsque le payload dépasse max_datagram_size() pour la session courante.
receive_datagram() n'introduit aucune deadline implicite. Une attente bornée relève du consommateur/POC, car la perte d'un datagram est un résultat valide et ne doit pas être transformée en erreur de protocole commune.
Natif
Le chemin natif utilise directement les primitives de web-transport-quinn 0.12.1 :
Session::max_datagram_size
Session::send_datagram
Session::read_datagram
Un test d'intégration couvre :
- session loopback avec pin SHA-256 exact ;
- datagram client -> serveur ;
- datagram serveur -> client ;
- attente bornée côté test ;
- rejet local d'un payload supérieur à la taille négociée.
WASM
Le chemin wasm32-unknown-unknown expose la même capacité via web-transport-wasm 0.6.0 :
Session::max_datagram_size
Session::send_datagram
Session::recv_datagram
send_datagram(...) est asynchrone côté navigateur conformément à la surface du wrapper.
La tranche ne réouvre pas le smoke navigateur interactif : alpha.7.fix.2 reste la preuve navigateur du chemin fiable. La gate WASM de alpha.9 vérifie que la nouvelle capacité compile sur la cible navigateur.
Smoke datagram natif
Nouveau launcher technique :
crates/apps/game-realtime-webtransport-datagram-smoke
Le smoke :
- génère une identité P-256 loopback en mémoire ;
- bind un serveur WebTransport sur port éphémère ;
- établit client et serveur avec pin SHA-256 exact ;
- lit les tailles maximales datagram des deux sessions ;
- envoie un datagram client -> serveur ;
- attend sa réception sous une deadline locale de 2 s ;
- envoie un datagram serveur -> client ;
- attend sa réception sous la même deadline ;
- termine par un verdict déterministe.
Résultat attendu :
game-realtime-webtransport-datagram-smoke: PASS
Le smoke ne teste pas l'ordre et ne prétend pas garantir la livraison. Un timeout de réception est reporté comme échec du smoke local, avec un message rappelant explicitement que la livraison datagram n'est pas garantie.
Frontières
Le delta ne modifie pas :
game-realtime-transport-lib;RealtimeConnection/RealtimeSender/RealtimeReceiver;game-realtime-websocket-lib;- le fallback
alpha.8; - les engines ;
- les crates gameplay.
La décision de alpha.9 est donc : capacité WebTransport backend-spécifique utile à conserver pour expérimentation/mesure, sans promotion au contrat commun.
Fichiers principaux
Nouveaux :
crates/apps/game-realtime-webtransport-datagram-smoke/Cargo.toml
crates/apps/game-realtime-webtransport-datagram-smoke/src/main.rs
crates/common/game-realtime-webtransport-lib/tests/datagrams.rs
deltas/0.3.5/alpha.9.md
history/0.3.5/alpha.8.fix.1.md
Modifiés :
Cargo.toml
README.md
crates/common/game-realtime-webtransport-lib/README.md
crates/common/game-realtime-webtransport-lib/USAGE.md
crates/common/game-realtime-webtransport-lib/src/webtransport.rs
crates/common/game-realtime-webtransport-lib/src/webtransport_wasm.rs
docs/plans/005-V0_3_5_WEBTRANSPORT_QUIC_POC_PLAN.md
scripts/audit_distribution_layout.py
Validation attendue
cargo fmt --all
cargo fmt --all -- --check
python3 scripts/audit_rust_workspace_rules.py
python3 scripts/audit_markdown_tables.py README.md RULES.md ROADMAP.md CHANGELOG.md docs prompts crates Android Web deltas history
python3 scripts/audit_distribution_layout.py
cargo check --workspace
cargo clippy --workspace --all-targets --all-features -- -D warnings
cargo test -p game-realtime-webtransport-lib --all-targets --all-features
cargo run -p game-realtime-webtransport-datagram-smoke
cargo check -p game-realtime-webtransport-lib --target wasm32-unknown-unknown
cargo clippy -p game-realtime-webtransport-lib --target wasm32-unknown-unknown --lib -- -D warnings
cargo build -p game-realtime-webtransport-lib --target wasm32-unknown-unknown
cargo tree -p game-realtime-webtransport-datagram-smoke --edges normal
cargo tree -i game-realtime-webtransport-lib --workspace --edges normal
Après validation
Créer history/0.3.5/alpha.9.md à partir des sorties réellement fournies puis ouvrir 0.3.5-alpha.10 pour les mesures comparatives bornées WebSocket / WebTransport fiable, avec datagram uniquement comme capacité WebTransport séparée.