5.3 KiB
Delta 0.3.5-alpha.6
Base requise
0.3.5-alpha.5, validée par l'utilisateur le 2026-09-21 avec fmt, audits, cargo check, Clippy strict, les sept tests du contrat realtime commun, les vingt tests WebTransport, le smoke natif hors harness avec verdict PASS et les graphes de dépendances attendus.
La preuve est enregistrée dans history/0.3.5/alpha.5.md.
Objectif
Fermer la preuve de compilation du client WebTransport Rust en wasm32-unknown-unknown sans encore créer de host navigateur ni attribuer un smoke runtime.
Cette tranche doit conserver le backend natif intact tout en donnant au navigateur le même contrat fiable : pin SHA-256 explicite, session WebTransport, stream bidirectionnel primaire, framing u32 big-endian + payload et RealtimeConnection.
Version
La version workspace passe à :
0.3.5-alpha.6
Dépendances et cfg
La contrainte workspace suivante est ajoutée :
web-transport-wasm = 0.6.0
Dans game-realtime-webtransport-lib :
rcgen, Tokio etweb-transport-quinndeviennent des dépendances uniquement non-WASM ;web-transport-wasmest tirée uniquement pourtarget_arch = "wasm32";- les dev-dependencies Tokio de la suite native restent elles aussi non-WASM.
.cargo/config.toml fournit uniquement à wasm32-unknown-unknown :
--cfg=web_sys_unstable_apis
Le flag est déclaré pour rustc et rustdoc ; aucun build natif ne le reçoit.
Client WASM
Le module WASM expose sous le même nom que le client natif :
WebTransportCertificateHash
WebTransportClientConfig
connect
WebTransportSession
WebTransportConnection
WebTransportSender
WebTransportReceiver
Les types serveur natifs restent absents du target WASM.
Le client navigateur :
- valide un endpoint
https://; - transmet le hash SHA-256 exact via
serverCertificateHashes; - exige le chemin WebTransport/QUIC sans fallback TCP implicite du wrapper ;
- établit une session navigateur ;
- ouvre le stream bidirectionnel primaire ;
- adapte le stream au contrat
game-realtime-transport-lib.
Le framing reste :
u32 big-endian payload length
payload bytes
La limite configurée est contrôlée avant écriture et avant allocation. Le sender applique FIN et reset ; le receiver applique STOP_SENDING et conserve un parseur incrémental compatible avec l'abandon/reprise d'une future de réception.
Les types navigateur sont !Send, mais le contrat RealtimeConnection n'impose volontairement aucun bound Send; aucune modification du contrat commun n'est donc nécessaire.
Différence runtime explicitement différée
WebTransportConfig continue de valider connect_timeout, primary_stream_timeout et send_timeout afin de ne pas accepter une configuration incohérente. Dans alpha.6, ces deadlines ne sont cependant pas encore matérialisées par un timer côté navigateur.
Le wrapper web-transport-wasm conserve ses opérations Web API abandonnées dans son état de polling ; la tranche alpha.7 doit fixer puis prouver la politique de timeout/runtime avec un vrai navigateur avant de déclarer la parité comportementale avec le chemin natif.
Cette différence est documentée et n'est pas masquée comme une validation runtime.
Fichiers modifiés
.cargo/config.toml
Cargo.toml
README.md
crates/common/game-realtime-webtransport-lib/Cargo.toml
crates/common/game-realtime-webtransport-lib/README.md
crates/common/game-realtime-webtransport-lib/USAGE.md
crates/common/game-realtime-webtransport-lib/src/config.rs
crates/common/game-realtime-webtransport-lib/src/lib.rs
docs/plans/005-V0_3_5_WEBTRANSPORT_QUIC_POC_PLAN.md
Nouveaux fichiers :
crates/common/game-realtime-webtransport-lib/src/webtransport_wasm.rs
deltas/0.3.5/alpha.6.md
history/0.3.5/alpha.5.md
Validation attendue
Gate native de non-régression :
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-transport-lib --all-targets --all-features
cargo test -p game-realtime-webtransport-lib --all-targets --all-features
cargo run -p game-realtime-webtransport-smoke
Gate WASM ciblée :
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-lib --target wasm32-unknown-unknown --edges normal
cargo tree -i web-transport-wasm --workspace --target wasm32-unknown-unknown --edges normal
Le build WASM ne doit tirer ni web-transport-quinn, ni rcgen, ni le runtime Tokio du backend natif.
Le smoke natif doit toujours se terminer par :
game-realtime-webtransport-smoke: PASS
Après validation
Créer history/0.3.5/alpha.6.md à partir des sorties réellement fournies, puis ouvrir 0.3.5-alpha.7 pour le smoke navigateur/TLS local réel et la fermeture de la politique de deadlines navigateur.