# 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 à : ```text 0.3.5-alpha.6 ``` ## Dépendances et cfg La contrainte workspace suivante est ajoutée : ```text web-transport-wasm = 0.6.0 ``` Dans `game-realtime-webtransport-lib` : - `rcgen`, Tokio et `web-transport-quinn` deviennent des dépendances uniquement non-WASM ; - `web-transport-wasm` est tirée uniquement pour `target_arch = "wasm32"` ; - les dev-dependencies Tokio de la suite native restent elles aussi non-WASM. `.cargo/config.toml` fournit uniquement à `wasm32-unknown-unknown` : ```text --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 : ```text WebTransportCertificateHash WebTransportClientConfig connect WebTransportSession WebTransportConnection WebTransportSender WebTransportReceiver ``` Les types serveur natifs restent absents du target WASM. Le client navigateur : 1. valide un endpoint `https://` ; 2. transmet le hash SHA-256 exact via `serverCertificateHashes` ; 3. exige le chemin WebTransport/QUIC sans fallback TCP implicite du wrapper ; 4. établit une session navigateur ; 5. ouvre le stream bidirectionnel primaire ; 6. adapte le stream au contrat `game-realtime-transport-lib`. Le framing reste : ```text 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 ```text .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 : ```text 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 : ```bash 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 : ```bash 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 : ```text 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.