0.3.5-alpha.6

This commit is contained in:
2026-09-22 06:34:31 +02:00
parent bbffb7fa60
commit 0ef5e1a233
12 changed files with 897 additions and 41 deletions

155
deltas/0.3.5/alpha.6.md Normal file
View File

@@ -0,0 +1,155 @@
<!-- file: deltas/0.3.5/alpha.6.md -->
<!-- version: 1 -->
# 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.