feat: add waku_relay_get_connected_peers to libwaku (#3353)

This commit is contained in:
gabrielmer 2025-04-03 14:27:27 +03:00 committed by GitHub
parent 00808c9495
commit 8b443edd98
4 changed files with 60 additions and 11 deletions

View File

@ -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,

View File

@ -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)

View File

@ -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

View File

@ -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)