From 5b7939cbd864e09e92699b3b1f366ad4ed7fb744 Mon Sep 17 00:00:00 2001 From: SinuS Von SifriduS Date: Mon, 21 Sep 2026 22:40:28 +0200 Subject: [PATCH] 0.3.5-alpha.2.fix.1 --- Cargo.toml | 4 +- README.md | 6 +- .../tests/establishment.rs | 14 ++- deltas/0.3.5/alpha.2.fix.1.md | 91 +++++++++++++++++++ .../005-V0_3_5_WEBTRANSPORT_QUIC_POC_PLAN.md | 6 +- 5 files changed, 112 insertions(+), 9 deletions(-) create mode 100644 deltas/0.3.5/alpha.2.fix.1.md diff --git a/Cargo.toml b/Cargo.toml index 9607b3d..660cee8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ # file: Cargo.toml -# version: 96 +# version: 97 [workspace] resolver = "3" @@ -25,7 +25,7 @@ members = [ ] [workspace.package] -version = "0.3.5-alpha.2" +version = "0.3.5-alpha.2.fix.1" edition = "2024" license = "MIT" repository = "https://git.sasedev.com/Sasedev/games" diff --git a/README.md b/README.md index ac3d6cf..d008f65 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ - + # 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 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. diff --git a/crates/common/game-realtime-webtransport-lib/tests/establishment.rs b/crates/common/game-realtime-webtransport-lib/tests/establishment.rs index 540a065..6db8de8 100644 --- a/crates/common/game-realtime-webtransport-lib/tests/establishment.rs +++ b/crates/common/game-realtime-webtransport-lib/tests/establishment.rs @@ -1,10 +1,20 @@ // 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. 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")] async fn pinned_client_and_server_establish_a_loopback_session() { 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!(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")] diff --git a/deltas/0.3.5/alpha.2.fix.1.md b/deltas/0.3.5/alpha.2.fix.1.md new file mode 100644 index 0000000..db6af9f --- /dev/null +++ b/deltas/0.3.5/alpha.2.fix.1.md @@ -0,0 +1,91 @@ + + + +# 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`. diff --git a/docs/plans/005-V0_3_5_WEBTRANSPORT_QUIC_POC_PLAN.md b/docs/plans/005-V0_3_5_WEBTRANSPORT_QUIC_POC_PLAN.md index d0e586f..7c51e3d 100644 --- a/docs/plans/005-V0_3_5_WEBTRANSPORT_QUIC_POC_PLAN.md +++ b/docs/plans/005-V0_3_5_WEBTRANSPORT_QUIC_POC_PLAN.md @@ -1,11 +1,11 @@ - + # Plan 0.3.5 — POC WebTransport/QUIC et fallback WebSocket ## 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. @@ -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`. +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 Nouveau backend durable candidat :