sequenceDiagram title Indexer — Pair A résout Pair B (GetPeerRecord + handleNodeGet) participant NATSA as NATS A participant DBA as DB Pair A (oc-lib) participant NodeA as Node A participant Indexer as IndexerService (partagé) participant DHT as DHT Kademlia participant NATSA2 as NATS A (retour) Note over NodeA: Déclenché par : NATS PB_SEARCH PEER
ou callback SubscribeToSearch NodeA->>DBA: NewRequestAdmin(PEER).Search(DID_B ou PeerID_B) DBA-->>NodeA: Peer B local (si connu) → résout DID_B + PeerID_B
sinon utilise la valeur brute loop Pour chaque StaticIndexer NodeA->>Indexer: TempStream /opencloud/record/get/1.0 NodeA->>Indexer: json.Encode(GetValue{Key: DID_B, PeerID: PeerID_B}) Indexer->>Indexer: key = "/node/" + DID_B Indexer->>DHT: SearchValue(ctx 10s, "/node/"+DID_B) DHT-->>Indexer: channel de bytes (PeerRecord B) loop Pour chaque résultat DHT Indexer->>Indexer: Unmarshal → PeerRecord B alt PeerRecord.PeerID == PeerID_B Indexer->>Indexer: resp.Found=true, resp.Records[PeerID_B]=PeerRecord B Indexer->>Indexer: StreamRecord B.LastSeen = now (si heartbeat actif) end end Indexer->>NodeA: json.Encode(GetResponse{Found:true, Records:{PeerID_B: PeerRecord B}}) end loop Pour chaque PeerRecord retourné NodeA->>NodeA: rec.Verify() → valide signature de B NodeA->>NodeA: rec.ExtractPeer(ourDID_A, DID_B, pubKey_B) alt ourDID_A == DID_B (c'est notre propre entrée) Note over NodeA: Republier pour rafraîchir le TTL NodeA->>Indexer: publishPeerRecord(rec) [refresh 2 min] end NodeA->>NATSA2: SetNATSPub(CREATE_RESOURCE, {PEER, Peer B JSON,
SearchAttr:"peer_id"}) NATSA2->>DBA: Upsert Peer B dans DB A DBA-->>NATSA2: ok end NodeA-->>NodeA: []*peer.Peer → [Peer B]