156 lines
5.3 KiB
Markdown
156 lines
5.3 KiB
Markdown
<!-- 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.
|