# OC-Discovery — Diagrammes d'architecture et de séquence Tous les fichiers sont au format [PlantUML](https://plantuml.com/). Rendu possible via VS Code (extension PlantUML), IntelliJ, ou [plantuml.com/plantuml](https://www.plantuml.com/plantuml/uml/). ## Diagrammes de séquence (flux internes) | Fichier | Description | |---------|-------------| | `01_node_init.puml` | Initialisation complète d'un Node (libp2p host, GossipSub, indexers, StreamService, PubSubService, NATS) | | `02_node_claim.puml` | Enregistrement du nœud auprès des indexeurs (`claimInfo` + `publishPeerRecord`) | | `03_indexer_heartbeat.puml` | Protocole heartbeat avec score 5 composants (U/B/D/L/F), UptimeTracker, dynamicMinScore | | `04_indexer_publish.puml` | Publication d'un `PeerRecord` vers l'indexeur → DHT | | `05_indexer_get.puml` | Résolution d'un pair via l'indexeur (`GetPeerRecord` + `handleNodeGet` + DHT) | | `06_native_registration.puml` | Enregistrement d'un indexeur auprès du Native (FillRate, signature, TTL 90s, unsubscribe) | | `07_native_get_consensus.puml` | `ConnectToNatives` : fetch pool + Phase 1 (clientSideConsensus) + Phase 2 (indexerLivenessVote) | | `08_nats_create_resource.puml` | Handler NATS `CREATE_RESOURCE` : connexion/déconnexion d'un partner | | `09_nats_propagation.puml` | Handler NATS `PROPALGATION_EVENT` : delete, considers, planner, search | | `10_pubsub_search.puml` | Recherche gossip globale (type `"all"`) via GossipSub | | `11_stream_search.puml` | Recherche directe par stream (type `"known"` ou `"partner"`) | | `12_partner_heartbeat.puml` | Heartbeat partner + propagation CRUD vers les partenaires | | `13_planner_flow.puml` | Session planner (ouverture, échange, fermeture) | | `14_native_offload_gc.puml` | Boucles background du Native Indexer (offload, DHT refresh, GC) | ## Diagrammes de topologie et flux de panne ### Configurations réseau | Fichier | Description | |---------|-------------| | `15_archi_config_nominale.puml` | C1 — Topologie nominale : 2 natifs · 2 indexeurs · 2 nœuds, tous flux | | `16_archi_config_seed.puml` | C2 — Mode seed sans natif : indexeurs à AdmittedAt=0, risque D20 actif | ### Flux de démarrage | Fichier | Description | |---------|-------------| | `17_startup_consensus_phase1_phase2.puml` | Démarrage nominal : Phase 1 (admission native) + Phase 2 (liveness vote) | | `18_startup_seed_discovers_native.puml` | Upgrade seed → nominal : goroutine async découvre un natif via l'indexeur | ### Flux de panne | Fichier | Code | Description | |---------|------|-------------| | `19_failure_indexer_crash.puml` | F1 | Panne 1 indexeur → replenish depuis natif → IC admis | | `20_failure_both_indexers_selfdelegate.puml` | F2 | Panne 2 indexeurs → natif `IsSelfFallback=true`, runOffloadLoop | | `21_failure_native_one_down.puml` | F3 | Panne 1 natif → quorum 1/1 suffisant, mode dégradé | | `22_failure_both_natives.puml` | F4 | Panne 2 natifs → fallback pool pré-validé, retryLostNative | | `23_failure_native_plus_indexer.puml` | F5 | Panne combinée : 1 natif + 1 indexeur → double replenish | | `24_failure_retry_lost_native.puml` | F6 | Panne réseau transitoire → retryLostNative (30s ticker) | | `25_failure_node_gc.puml` | F7 | Crash nœud → GC indexeur (120s), AfterDelete, fill rate recalculé | ## Protocoles libp2p utilisés (référence complète) | Protocole | Description | |-----------|-------------| | `/opencloud/heartbeat/1.0` | Heartbeat universel : node→indexeur, indexeur→native, native→native (long-lived) | | `/opencloud/probe/1.0` | Sonde de bande passante (echo, mesure latence + débit) | | `/opencloud/resource/heartbeat/partner/1.0` | Heartbeat node ↔ partner (long-lived) | | `/opencloud/record/publish/1.0` | Publication `PeerRecord` vers indexeur | | `/opencloud/record/get/1.0` | Requête `GetPeerRecord` vers indexeur | | `/opencloud/native/subscribe/1.0` | Enregistrement indexeur auprès du native (+ FillRate) | | `/opencloud/native/unsubscribe/1.0` | Désenregistrement explicite indexeur → native | | `/opencloud/native/indexers/1.0` | Requête de pool d'indexeurs au native (tri par w(F)=F×(1-F)) | | `/opencloud/native/consensus/1.0` | Phase 1 : validation de pool d'indexeurs (vote majoritaire natifs) | | `/opencloud/native/peers/1.0` | Demande de pairs natifs connus (replenish mesh natif) | | `/opencloud/indexer/natives/1.0` | Demande d'adresses de natifs connus par un indexeur | | `/opencloud/indexer/consensus/1.0` | Phase 2 : liveness vote (LastSeen ≤ 120s && LastScore ≥ 30) | | `/opencloud/resource/search/1.0` | Recherche de ressources entre peers | | `/opencloud/resource/create/1.0` | Propagation création ressource vers partner | | `/opencloud/resource/update/1.0` | Propagation mise à jour ressource vers partner | | `/opencloud/resource/delete/1.0` | Propagation suppression ressource vers partner | | `/opencloud/resource/planner/1.0` | Session planner (booking) | | `/opencloud/resource/verify/1.0` | Vérification signature ressource | | `/opencloud/resource/considers/1.0` | Transmission d'un "considers" d'exécution |