sequenceDiagram title Node Initialization — Pair A (InitNode) participant MainA as main (Pair A) participant NodeA as Node A participant libp2pA as libp2p (Pair A) participant DBA as DB Pair A (oc-lib) participant NATSA as NATS A participant IndexerA as Indexer (partagé) participant StreamA as StreamService A participant PubSubA as PubSubService A MainA->>NodeA: InitNode(isNode, isIndexer, isNativeIndexer) NodeA->>NodeA: LoadKeyFromFilePrivate() → priv NodeA->>NodeA: LoadPSKFromFile() → psk NodeA->>libp2pA: New(PrivateNetwork(psk), Identity(priv), ListenAddr:4001) libp2pA-->>NodeA: host A (PeerID_A) Note over NodeA: isNode == true NodeA->>libp2pA: NewGossipSub(ctx, host) libp2pA-->>NodeA: ps (GossipSub) NodeA->>IndexerA: ConnectToIndexers → SendHeartbeat /opencloud/heartbeat/1.0 Note over IndexerA: Heartbeat long-lived établi
Score qualité calculé (bw + uptime + diversité) IndexerA-->>NodeA: OK NodeA->>NodeA: claimInfo(name, hostname) NodeA->>IndexerA: TempStream /opencloud/record/publish/1.0 NodeA->>IndexerA: json.Encode(PeerRecord A signé) IndexerA->>IndexerA: DHT.PutValue("/node/"+DID_A, record) NodeA->>DBA: NewRequestAdmin(PEER).Search(SELF) DBA-->>NodeA: peer A local (ou UUID généré) NodeA->>NodeA: StartGC(30s) — GC sur StreamRecords NodeA->>StreamA: InitStream(ctx, host, PeerID_A, 1000, nodeA) StreamA->>StreamA: SetStreamHandler(heartbeat/partner, search, planner, ...) StreamA->>DBA: Search(PEER, PARTNER) → liste partenaires DBA-->>StreamA: [] (aucun partenaire au démarrage) StreamA-->>NodeA: StreamService A NodeA->>PubSubA: InitPubSub(ctx, host, ps, nodeA, streamA) PubSubA->>PubSubA: subscribeEvents(PB_SEARCH, timeout=-1) PubSubA-->>NodeA: PubSubService A NodeA->>NodeA: SubscribeToSearch(ps, callback) Note over NodeA: callback: GetPeerRecord(evt.From)
→ StreamService.SendResponse NodeA->>NATSA: ListenNATS(nodeA) Note over NATSA: Enregistre handlers:
CREATE_RESOURCE, PROPALGATION_EVENT NodeA-->>MainA: *Node A prêt