@startuml title PubSub — Gossip Global search (type "all") : Peer A searching, Peer B answering participant "App UI A" as UIA participant "App Peer A" as AppA participant "NATS A" as NATSA participant "Node A" as NodeA participant "StreamService A" as StreamA participant "PubSubService A" as PubSubA participant "GossipSub libp2p (mesh)" as GossipSub participant "Node B" as NodeB participant "PubSubService B" as PubSubB participant "DB Peer B (oc-lib)" as DBB participant "StreamService B" as StreamB UIA -> AppA: websocket subscription, sending {type:"all", search:"search"} in query AppA -> NATSA: Publish(PROPALGATION_EVENT, {PB_SEARCH, type:"all", search:"search"}) NATSA -> NodeA: ListenNATS → PB_SEARCH (type "all") NodeA -> PubSubA: SearchPublishEvent(ctx, dt, "all", user, "search") PubSubA -> PubSubA: publishEvent(PB_SEARCH, user, {search:"search"}) PubSubA -> PubSubA: priv_A.Sign(event body) → sig PubSubA -> PubSubA: Build Event{Type:"search", From:DID_A, Payload:{search:"search"}, Sig} PubSubA -> GossipSub: topic.Join("search") PubSubA -> GossipSub: topic.Publish(ctx, json(Event)) GossipSub --> NodeB: Propalgate message (gossip mesh) NodeB -> PubSubB: subscribeEvents listen to topic "search#" PubSubB -> PubSubB: read → Event{From: DID_A} PubSubB -> NodeB: GetPeerRecord(ctx, DID_A) note over NodeB: Resolve Peer A per DB B or ask to Indexer NodeB --> PubSubB: Peer A {PublicKey_A, Relation, ...} PubSubB -> PubSubB: event.Verify(Peer A) → valid sig_A PubSubB -> PubSubB: handleEventSearch(ctx, evt, PB_SEARCH) PubSubB -> StreamB: SendResponse(Peer A, evt) StreamB -> DBB: Search(COMPUTE + STORAGE + ..., filters{creator=self, access=PUBLIC OR partnerships[PeerID_A]}, search="search") DBB --> StreamB: [Resource1, Resource2, ...] loop For every matching resource, only match our own resource creator_id=self_did StreamB -> StreamB: write(PeerID_A, addr_A, dt, resource JSON, ProtocolSearchResource) StreamB -> StreamA: NewStream /opencloud/resource/search/1.0 StreamB -> StreamA: stream.Encode(Event{Type:search, From:DID_B, DataType, Payload:resource}) end StreamA -> StreamA: readLoop → handleEvent(ProtocolSearchResource, evt) StreamA -> StreamA: retrieveResponse(evt) StreamA -> NATSA: SetNATSPub(SEARCH_EVENT, {DataType, resource JSON}) NATSA -> AppA: Search results from Peer B AppA -> UIA: emit on websocket @enduml