@startuml title Stream — Recherche directe (type "known"/"partner") : Pair A → Pair B participant "App Pair A" as AppA participant "NATS A" as NATSA participant "Node A" as NodeA participant "PubSubService A" as PubSubA participant "StreamService A" as StreamA participant "DB Pair A (oc-lib)" as DBA participant "Node B" as NodeB participant "StreamService B" as StreamB participant "DB Pair B (oc-lib)" as DBB AppA -> NATSA: Publish(PROPALGATION_EVENT, {PB_SEARCH, type:"partner", search:"gpu"}) NATSA -> NodeA: ListenNATS → PB_SEARCH (type "partner") NodeA -> PubSubA: SearchPublishEvent(ctx, dt, "partner", user, "gpu") PubSubA -> StreamA: SearchPartnersPublishEvent(dt, user, "gpu") StreamA -> DBA: Search(PEER, PARTNER) + PeerIDS config DBA --> StreamA: [Peer B, ...] loop Pour chaque pair partenaire (Pair B) StreamA -> StreamA: json.Marshal({search:"gpu"}) → payload StreamA -> StreamA: write(PeerID_B, addr_B, dt, user, payload, ProtocolSearchResource) StreamA -> NodeB: TempStream /opencloud/resource/search/1.0 StreamA -> NodeB: json.Encode(Event{Type:search, From:DID_A, DataType, Payload:{search:"gpu"}}) NodeB -> StreamB: HandleResponse(stream) → readLoop StreamB -> StreamB: handleEvent(ProtocolSearchResource, evt) StreamB -> StreamB: handleEventFromPartner(evt, ProtocolSearchResource) alt evt.DataType == -1 (toutes ressources) StreamB -> DBA: Search(PEER, evt.From=DID_A) note over StreamB: Résolution locale ou via GetPeerRecord StreamB -> StreamB: SendResponse(Peer A, evt) StreamB -> DBB: Search(ALL_RESOURCES, filter{creator=B + public OR partner A + search:"gpu"}) DBB --> StreamB: [Resource1, Resource2, ...] else evt.DataType spécifié StreamB -> DBB: Search(DataType, filter{creator=B + access + search:"gpu"}) DBB --> StreamB: [Resource1, ...] end loop Pour chaque ressource StreamB -> StreamA: write(PeerID_A, addr_A, dt, resource JSON, ProtocolSearchResource) StreamA -> StreamA: readLoop → handleEvent(ProtocolSearchResource, evt) StreamA -> StreamA: retrieveResponse(evt) StreamA -> NATSA: SetNATSPub(SEARCH_EVENT, {DataType, resource JSON}) NATSA -> AppA: Résultat de Pair B end end note over NATSA,DBA: Optionnel: App A persiste\nles ressources découvertes dans DB A @enduml