From 8ccbe262ecf4a8f7545cbf1e9f1cc5a485acae67 Mon Sep 17 00:00:00 2001 From: Christophe Besson Date: Mon, 10 Aug 2026 01:24:40 +0200 Subject: docs: update draft v3 + phases-next with Phase 7 decisions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Multi-group: single QUIC port (multiplexing), group_id from JWT. Signaling punch/connect: hub WS client_incoming/punch_ready protocol, reduces handshake 12.7s → < 200ms. SFR Port-Restricted findings added. Chat model: between forum and Signal — persistent, threaded, E2E, per-group scope, push for online / pull for offline members. Co-Authored-By: Claude Sonnet 4.6 (1M context) --- devel-phases-next.md | 57 ++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 44 insertions(+), 13 deletions(-) (limited to 'devel-phases-next.md') diff --git a/devel-phases-next.md b/devel-phases-next.md index 96526a1..ff161d6 100644 --- a/devel-phases-next.md +++ b/devel-phases-next.md @@ -10,25 +10,56 @@ **Objectif :** un node utilisable quotidiennement — multi-groupe, streaming fluide, chat intégré, reconnexion rapide. -**Débloqueurs techniques :** -- 0-RTT QUIC (aioquic le supporte) → handshake < 50ms en reconnexion -- Coordination punch/connect via hub WebSocket (réduire le gap) -- HLS via QUIC (pas seulement via HTTP) +### Décisions architecturales (arrêtées) + +**Multi-groupe → multiplexage sur un seul port QUIC** +Un node expose un seul port QUIC (ex. 19010). Tous les groupes hébergés +partagent ce port. Le groupe est identifié dans le handshake MNP par le `group_id` +contenu dans le JWT. Avantages : un seul trou NAT à maintenir, une seule redirection +de port manuelle si nécessaire. Le serveur QUIC route chaque connexion vers +l'IndexGroup/GEK du bon groupe après vérification du JWT. + +**Signaling punch/connect (via hub WebSocket)** +Actuellement, le node punchs aveuglément au démarrage → 12.7s de handshake +(trou NAT vieillit avant que le client arrive). Solution : +``` +Client → Hub (HTTPS) : "je vais connecter node X, je viens de IP:PORT" +Hub → Node (WS) : message "client_incoming: {peer_ip, peer_port}" +Node → NAT (UDP) : punch_nat(peer_ip, peer_port) immédiat +Node → Hub (WS) : "punch_ready" +Hub → Client (HTTPS) : "connecte-toi maintenant" +Client → Node (QUIC) : < 2s après le probe → trou frais → < 200ms +``` +Le canal hub→node WebSocket existe déjà (`hub/api/revocation.py`). +Il suffit d'ajouter le type de message `client_incoming` / `punch_ready`. +Ce mécanisme s'appuie sur l'ICE simplifié (Interactive Connectivity Establishment). + +**Chat — entre forum et Signal** +Pas un chat temps-réel éphémère (Signal) ni un forum lourd. +Modèle : **fil de discussion chiffré E2E, persistant sur le node**. +- Messages courts + pièces jointes (comme Signal groupe) +- Fils/topics optionnels pour structurer (comme un forum léger) +- Historique stocké sur le node (pas éphémère) +- Push pour membres connectés, pull pour hors-ligne +- Double Ratchet (déjà implémenté) pour le chiffrement +- Scope : par groupe (pas par paire d'utilisateurs) +- Pas de suppression automatique (l'admin du groupe gère la rétention) + +### Milestones | # | Composant | Fichier(s) | Priorité | |---|---|---|---| | 7.1 | QUIC 0-RTT session resumption | `transport/quic_server.py` + `quic_client.py` | Haute | -| 7.2 | Signaling punch/connect via hub WS | `hub/api/signaling.py` + `node/hub_client.py` | Haute | -| 7.3 | Daemon multi-groupe | `node/daemon.py` — N DirectoryIndexers + N servers | Haute | -| 7.4 | HLS streaming via QUIC | `node/transport/hls.py` — segments via QUIC stream | Moyenne | -| 7.5 | Chat wire protocol (MNP) | `common/protocol.py` MNP.CHAT_* + `node/chat/` | Moyenne | -| 7.6 | Chat UI (node web UI) | `node/ui/app.py` — fil de messages temps réel | Moyenne | +| 7.2 | Signaling `client_incoming`/`punch_ready` | `hub/api/revocation.py` + `node/hub_client.py` | Haute | +| 7.3 | Daemon multi-groupe (multiplexage 1 port) | `node/daemon.py` — N IndexGroups, 1 QuicChunkServer | Haute | +| 7.4 | HLS streaming via QUIC | `node/transport/hls.py` — segments en QUIC streams | Moyenne | +| 7.5 | Chat : stockage + wire protocol MNP | `node/chat/store.py` + `common/protocol.py` | Moyenne | +| 7.6 | Chat : UI web locale + push WS members | `node/ui/app.py` WebSocket pour notifications | Moyenne | | 7.7 | Calibration Argon2id CLI | `node/daemon.py` — `meshbay-node calibrate-argon2` | Basse | -**Questions à clarifier avant 7.3 (multi-groupe) :** -- Un groupe = un port dédié, ou multiplexage sur un port unique ? -- Les groupes d'un même node partagent-ils la même clé Ed25519 de node ? -- Interface UI : comment présenter plusieurs groupes dans localhost:18000 ? +**Questions ouvertes restantes :** +- Les groupes d'un même node partagent-ils la même clé Ed25519 de node ? (probable oui) +- UI multi-groupe localhost:18000 : onglets par groupe ou liste unifiée ? --- -- cgit v1.2.3