0.3.5-alpha.2.fix.1
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
# file: Cargo.toml
|
# file: Cargo.toml
|
||||||
# version: 96
|
# version: 97
|
||||||
|
|
||||||
[workspace]
|
[workspace]
|
||||||
resolver = "3"
|
resolver = "3"
|
||||||
@@ -25,7 +25,7 @@ members = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
[workspace.package]
|
[workspace.package]
|
||||||
version = "0.3.5-alpha.2"
|
version = "0.3.5-alpha.2.fix.1"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
license = "MIT"
|
license = "MIT"
|
||||||
repository = "https://git.sasedev.com/Sasedev/games"
|
repository = "https://git.sasedev.com/Sasedev/games"
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<!-- file: README.md -->
|
<!-- file: README.md -->
|
||||||
<!-- version: 64 -->
|
<!-- version: 65 -->
|
||||||
|
|
||||||
# games.sasedev
|
# games.sasedev
|
||||||
|
|
||||||
@@ -27,9 +27,9 @@ Workspace expérimental puis productif pour des jeux multiplateformes principale
|
|||||||
|
|
||||||
Version stable de référence : `0.3.4`.
|
Version stable de référence : `0.3.4`.
|
||||||
|
|
||||||
Version active : `0.3.5-alpha.2`. `0.3.2` reste différée.
|
Version active : `0.3.5-alpha.2.fix.1`. `0.3.2` reste différée.
|
||||||
|
|
||||||
La stable `0.3.4` livre la première baseline realtime : contrat binaire transport-neutral, backend WebSocket Tokio/tokio-tungstenite, limites et deadlines, tests loopback/robustesse, smoke runtime localhost public et frontières de dépendances empêchant moteurs et gameplay de dépendre d'un backend concret. `0.3.5-alpha.2` introduit le backend WebTransport natif minimal : Quinn/HTTP/3, identité TLS locale ECDSA P-256 courte ou injectée, pin SHA-256 et établissement client/server loopback. Streams applicatifs, framing fiable et adaptation `RealtimeConnection` restent réservés à la tranche suivante.
|
La stable `0.3.4` livre la première baseline realtime : contrat binaire transport-neutral, backend WebSocket Tokio/tokio-tungstenite, limites et deadlines, tests loopback/robustesse, smoke runtime localhost public et frontières de dépendances empêchant moteurs et gameplay de dépendre d'un backend concret. `0.3.5-alpha.2.fix.1` ferme le test d’établissement du backend WebTransport natif minimal : Quinn/HTTP/3, identité TLS locale ECDSA P-256 courte ou injectée, pin SHA-256 et établissement client/server loopback. Streams applicatifs, framing fiable et adaptation `RealtimeConnection` restent réservés à la tranche suivante.
|
||||||
|
|
||||||
Les deux premiers jeux sont des POC structurels : `game-reflex-poc` et `game-snake-poc`. Ils existent d'abord pour valider les frontières du workspace, le moteur, les assets et le packaging multiplateforme.
|
Les deux premiers jeux sont des POC structurels : `game-reflex-poc` et `game-snake-poc`. Ils existent d'abord pour valider les frontières du workspace, le moteur, les assets et le packaging multiplateforme.
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,20 @@
|
|||||||
// file: crates/common/game-realtime-webtransport-lib/tests/establishment.rs
|
// file: crates/common/game-realtime-webtransport-lib/tests/establishment.rs
|
||||||
// version: 1
|
// version: 2
|
||||||
|
|
||||||
//! Deterministic native loopback proof for WebTransport session establishment and SHA-256 pinning.
|
//! Deterministic native loopback proof for WebTransport session establishment and SHA-256 pinning.
|
||||||
|
|
||||||
const TEST_TIMEOUT: std::time::Duration = std::time::Duration::from_secs(5);
|
const TEST_TIMEOUT: std::time::Duration = std::time::Duration::from_secs(5);
|
||||||
|
|
||||||
|
fn normalized_socket_addr(value: std::net::SocketAddr) -> std::net::SocketAddr {
|
||||||
|
match value {
|
||||||
|
std::net::SocketAddr::V4(_) => return value,
|
||||||
|
std::net::SocketAddr::V6(ipv6) => match ipv6.ip().to_ipv4_mapped() {
|
||||||
|
Some(ipv4) => return std::net::SocketAddr::new(std::net::IpAddr::V4(ipv4), ipv6.port()),
|
||||||
|
None => return std::net::SocketAddr::V6(ipv6),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[tokio::test(flavor = "current_thread")]
|
#[tokio::test(flavor = "current_thread")]
|
||||||
async fn pinned_client_and_server_establish_a_loopback_session() {
|
async fn pinned_client_and_server_establish_a_loopback_session() {
|
||||||
let identity = match game_realtime_webtransport_lib::WebTransportServerIdentity::generate_loopback() {
|
let identity = match game_realtime_webtransport_lib::WebTransportServerIdentity::generate_loopback() {
|
||||||
@@ -34,7 +44,7 @@ async fn pinned_client_and_server_establish_a_loopback_session() {
|
|||||||
};
|
};
|
||||||
assert_eq!(client_session.request_url(), Some(endpoint.as_str()));
|
assert_eq!(client_session.request_url(), Some(endpoint.as_str()));
|
||||||
assert_eq!(server_session.request_url(), Some(endpoint.as_str()));
|
assert_eq!(server_session.request_url(), Some(endpoint.as_str()));
|
||||||
assert_eq!(client_session.remote_addr(), listener.local_addr());
|
assert_eq!(normalized_socket_addr(client_session.remote_addr()), normalized_socket_addr(listener.local_addr()));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[tokio::test(flavor = "current_thread")]
|
#[tokio::test(flavor = "current_thread")]
|
||||||
|
|||||||
91
deltas/0.3.5/alpha.2.fix.1.md
Normal file
91
deltas/0.3.5/alpha.2.fix.1.md
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
<!-- file: deltas/0.3.5/alpha.2.fix.1.md -->
|
||||||
|
<!-- version: 1 -->
|
||||||
|
|
||||||
|
# Delta 0.3.5-alpha.2.fix.1
|
||||||
|
|
||||||
|
## Base requise
|
||||||
|
|
||||||
|
`0.3.5-alpha.2`, candidate dont la gate utilisateur du 2026-09-21 a atteint les tests d’intégration WebTransport après fmt, audits, check workspace et Clippy propres.
|
||||||
|
|
||||||
|
## Cause
|
||||||
|
|
||||||
|
Le test positif d’établissement ouvre correctement la session WebTransport mais échoue sur l’assertion d’adresse distante :
|
||||||
|
|
||||||
|
```text
|
||||||
|
left: [::ffff:127.0.0.1]:54430
|
||||||
|
right: 127.0.0.1:54430
|
||||||
|
```
|
||||||
|
|
||||||
|
Quinn expose ici l’adresse IPv4 loopback sous forme IPv4-mapped IPv6. Les deux valeurs désignent la même IP et le même port ; l’assertion brute sur `SocketAddr` confond donc différence de représentation et défaut de transport.
|
||||||
|
|
||||||
|
La même gate confirme parallèlement que :
|
||||||
|
|
||||||
|
- les quatre tests unitaires WebTransport passent ;
|
||||||
|
- le test de mauvais pin passe ;
|
||||||
|
- la compilation workspace et Clippy sont propres ;
|
||||||
|
- les audits Rust/workspace, Markdown et distribution sont propres.
|
||||||
|
|
||||||
|
`alpha.2` n’est pas historisée comme validée : le test d’intégration positif reste rouge jusqu’à ce correctif.
|
||||||
|
|
||||||
|
## Correction
|
||||||
|
|
||||||
|
La version technique passe à :
|
||||||
|
|
||||||
|
```text
|
||||||
|
0.3.5-alpha.2.fix.1
|
||||||
|
```
|
||||||
|
|
||||||
|
`tests/establishment.rs` normalise uniquement les `SocketAddr` observées avant comparaison :
|
||||||
|
|
||||||
|
- une adresse IPv4 reste inchangée ;
|
||||||
|
- une IPv6 IPv4-mapped est ramenée à son IPv4 canonique avec le même port ;
|
||||||
|
- une IPv6 native reste inchangée.
|
||||||
|
|
||||||
|
L’assertion continue donc de détecter un port différent, une IPv4 différente ou une IPv6 réellement différente. Elle cesse seulement de considérer `127.0.0.1` et `::ffff:127.0.0.1` comme deux endpoints distincts.
|
||||||
|
|
||||||
|
Aucun code de production WebTransport, certificat, pinning, configuration Quinn, mapping d’erreur ou API publique n’est modifié.
|
||||||
|
|
||||||
|
## Fichiers modifiés
|
||||||
|
|
||||||
|
```text
|
||||||
|
Cargo.toml
|
||||||
|
README.md
|
||||||
|
crates/common/game-realtime-webtransport-lib/tests/establishment.rs
|
||||||
|
docs/plans/005-V0_3_5_WEBTRANSPORT_QUIC_POC_PLAN.md
|
||||||
|
```
|
||||||
|
|
||||||
|
Nouveau fichier :
|
||||||
|
|
||||||
|
```text
|
||||||
|
deltas/0.3.5/alpha.2.fix.1.md
|
||||||
|
```
|
||||||
|
|
||||||
|
Aucun fichier `history/0.3.5/alpha.2.md` n’est créé avant une gate entièrement verte.
|
||||||
|
|
||||||
|
## Plan
|
||||||
|
|
||||||
|
Le forecast fonctionnel ne change pas. Après validation de ce fix, `0.3.5-alpha.3` reste la tranche dédiée au stream bidirectionnel principal, au framing borné `u32 big-endian + payload` et à l’adaptation `RealtimeConnection`.
|
||||||
|
|
||||||
|
## Validation attendue
|
||||||
|
|
||||||
|
Le correctif touche un test Rust et la version Cargo ; la gate repart depuis le début :
|
||||||
|
|
||||||
|
```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-webtransport-lib --all-targets --all-features
|
||||||
|
```
|
||||||
|
|
||||||
|
Aucun `cargo tree` supplémentaire n’est requis : le graphe de dépendances n’a pas changé et la gate `alpha.2` l’a déjà produit.
|
||||||
|
|
||||||
|
## Après validation
|
||||||
|
|
||||||
|
Créer `history/0.3.5/alpha.2.fix.1.md` à partir des résultats réellement fournis, puis ouvrir directement `0.3.5-alpha.3`.
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
<!-- file: docs/plans/005-V0_3_5_WEBTRANSPORT_QUIC_POC_PLAN.md -->
|
<!-- file: docs/plans/005-V0_3_5_WEBTRANSPORT_QUIC_POC_PLAN.md -->
|
||||||
<!-- version: 2 -->
|
<!-- version: 3 -->
|
||||||
|
|
||||||
# Plan 0.3.5 — POC WebTransport/QUIC et fallback WebSocket
|
# Plan 0.3.5 — POC WebTransport/QUIC et fallback WebSocket
|
||||||
|
|
||||||
## Statut
|
## Statut
|
||||||
|
|
||||||
Plan actif créé pendant `0.3.5-alpha.1` à partir de l'archive taggée `v0.3.4`, puis réconcilié pour l'implémentation native de `0.3.5-alpha.2`.
|
Plan actif créé pendant `0.3.5-alpha.1` à partir de l'archive taggée `v0.3.4`, puis réconcilié pour l'implémentation native de `0.3.5-alpha.2` et son correctif de validation `0.3.5-alpha.2.fix.1`.
|
||||||
|
|
||||||
Le cadrage détaillé et la comparaison des stacks actuelles sont conservés dans `docs/studies/026-V0_3_5_WEBTRANSPORT_QUIC_STACK_AUDIT.md`. Le présent document porte les décisions opérationnelles, le scope, les gates et le forecast vivant de la version.
|
Le cadrage détaillé et la comparaison des stacks actuelles sont conservés dans `docs/studies/026-V0_3_5_WEBTRANSPORT_QUIC_STACK_AUDIT.md`. Le présent document porte les décisions opérationnelles, le scope, les gates et le forecast vivant de la version.
|
||||||
|
|
||||||
@@ -73,6 +73,8 @@ L'identité locale générée est ECDSA P-256/SHA-256, contient les SAN `localho
|
|||||||
|
|
||||||
`alpha.2` retourne une session WebTransport établie mais n'ouvre encore aucun stream applicatif et n'implémente pas `RealtimeConnection`. Cette séparation ferme la preuve QUIC/TLS avant le framing de `alpha.3`.
|
`alpha.2` retourne une session WebTransport établie mais n'ouvre encore aucun stream applicatif et n'implémente pas `RealtimeConnection`. Cette séparation ferme la preuve QUIC/TLS avant le framing de `alpha.3`.
|
||||||
|
|
||||||
|
La gate de `alpha.2` a confirmé compilation, Clippy, configuration TLS/pinning et rejet d’un mauvais pin, mais le test positif comparait strictement `127.0.0.1:port` à sa représentation IPv4-mapped IPv6 `[::ffff:127.0.0.1]:port` remontée par Quinn. `alpha.2.fix.1` normalise uniquement cette représentation dans le test d’intégration ; aucun contrat, comportement transport ou scope de `alpha.3` n’est modifié.
|
||||||
|
|
||||||
### Ownership physique
|
### Ownership physique
|
||||||
|
|
||||||
Nouveau backend durable candidat :
|
Nouveau backend durable candidat :
|
||||||
|
|||||||
Reference in New Issue
Block a user