diff --git a/library/libwaku.h b/library/libwaku.h index bd9b6bfed..bb6fa20cf 100644 --- a/library/libwaku.h +++ b/library/libwaku.h @@ -117,6 +117,11 @@ int waku_relay_get_num_connected_peers(void* ctx, WakuCallBack callback, void* userData); +int waku_relay_get_connected_peers(void* ctx, + const char* pubSubTopic, + WakuCallBack callback, + void* userData); + int waku_relay_get_num_peers_in_mesh(void* ctx, const char* pubSubTopic, WakuCallBack callback, diff --git a/library/libwaku.nim b/library/libwaku.nim index 258ac27b2..d1ea0d082 100644 --- a/library/libwaku.nim +++ b/library/libwaku.nim @@ -429,6 +429,27 @@ proc waku_relay_get_num_connected_peers( initializeLibrary() checkLibwakuParams(ctx, callback, userData) + let pst = pubSubTopic.alloc() + defer: + deallocShared(pst) + + handleRequest( + ctx, + RequestType.RELAY, + RelayRequest.createShared(RelayMsgType.NUM_CONNECTED_PEERS, pst), + callback, + userData, + ) + +proc waku_relay_get_connected_peers( + ctx: ptr WakuContext, + pubSubTopic: cstring, + callback: WakuCallBack, + userData: pointer, +): cint {.dynlib, exportc.} = + initializeLibrary() + checkLibwakuParams(ctx, callback, userData) + let pst = pubSubTopic.alloc() defer: deallocShared(pst) diff --git a/library/waku_thread/inter_thread_communication/requests/protocols/relay_request.nim b/library/waku_thread/inter_thread_communication/requests/protocols/relay_request.nim index 232630591..3b5059972 100644 --- a/library/waku_thread/inter_thread_communication/requests/protocols/relay_request.nim +++ b/library/waku_thread/inter_thread_communication/requests/protocols/relay_request.nim @@ -1,4 +1,4 @@ -import std/net +import std/[net, sequtils, strutils] import chronicles, chronos, stew/byteutils, results import ../../../../../waku/waku_core/message/message, @@ -8,12 +8,14 @@ import ../../../../../waku/waku_core/time, # Timestamp ../../../../../waku/waku_core/topics/pubsub_topic, ../../../../../waku/waku_relay/protocol, + ../../../../../waku/node/peer_manager, ../../../../alloc type RelayMsgType* = enum SUBSCRIBE UNSUBSCRIBE PUBLISH + NUM_CONNECTED_PEERS LIST_CONNECTED_PEERS ## to return the list of all connected peers to an specific pubsub topic LIST_MESH_PEERS @@ -122,11 +124,17 @@ proc process*( let msgHash = computeMessageHash(pubSubTopic, msg).to0xHex return ok(msgHash) - of LIST_CONNECTED_PEERS: + of NUM_CONNECTED_PEERS: let numConnPeers = waku.node.wakuRelay.getNumConnectedPeers($self.pubsubTopic).valueOr: - error "LIST_CONNECTED_PEERS failed", error = error + error "NUM_CONNECTED_PEERS failed", error = error return err($error) return ok($numConnPeers) + of LIST_CONNECTED_PEERS: + let connPeers = waku.node.wakuRelay.getConnectedPeers($self.pubsubTopic).valueOr: + error "LIST_CONNECTED_PEERS failed", error = error + return err($error) + ## returns a comma-separated string of peerIDs + return ok(connPeers.mapIt($it).join(",")) of LIST_MESH_PEERS: let numPeersInMesh = waku.node.wakuRelay.getNumPeersInMesh($self.pubsubTopic).valueOr: error "LIST_MESH_PEERS failed", error = error diff --git a/waku/waku_relay/protocol.nim b/waku/waku_relay/protocol.nim index 0222db0d1..1af5f0d4f 100644 --- a/waku/waku_relay/protocol.nim +++ b/waku/waku_relay/protocol.nim @@ -539,22 +539,23 @@ proc publish*( return ok(relayedPeerCount) -proc getNumConnectedPeers*( +proc getConnectedPeers*( w: WakuRelay, pubsubTopic: PubsubTopic -): Result[int, string] = - ## Returns the number of connected peers and subscribed to the passed pubsub topic. +): Result[seq[PeerId], string] = + ## Returns the list of peerIds of connected peers and subscribed to the passed pubsub topic. ## The 'gossipsub' atribute is defined in the GossipSub ref object. if pubsubTopic == "": ## Return all the connected peers - var numConnPeers = 0 + var peerIds = newSeq[PeerId]() for k, v in w.gossipsub: - numConnPeers.inc(v.len) - return ok(numConnPeers) + peerIds.add(toSeq(v).mapIt(it.peerId)) + # alternatively: peerIds &= toSeq(v).mapIt(it.peerId) + return ok(peerIds) if not w.gossipsub.hasKey(pubsubTopic): return err( - "getNumConnectedPeers - there is no gossipsub peer for the given pubsub topic: " & + "getConnectedPeers - there is no gossipsub peer for the given pubsub topic: " & pubsubTopic ) @@ -562,8 +563,22 @@ proc getNumConnectedPeers*( w.gossipsub[pubsubTopic] let peers: HashSet[PubSubPeer] = peersRes.valueOr: + return + err("getConnectedPeers - exception accessing " & pubsubTopic & ": " & error.msg) + + let peerIds = toSeq(peers).mapIt(it.peerId) + return ok(peerIds) + +proc getNumConnectedPeers*( + w: WakuRelay, pubsubTopic: PubsubTopic +): Result[int, string] = + ## Returns the number of connected peers and subscribed to the passed pubsub topic. + + ## Return all the connected peers + let peers = w.getConnectedPeers(pubsubTopic).valueOr: return err( - "getNumConnectedPeers - exception accessing " & pubsubTopic & ": " & error.msg + "getNumConnectedPeers - failed retrieving peers in mesh: " & pubsubTopic & ": " & + error ) return ok(peers.len)