Files
games/deltas/0.3.5/alpha.6.md
2026-09-22 06:34:31 +02:00

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 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 :

--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 :

  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 :

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.