Skip to content

Commit ef90744

Browse files
authored
feat: waku_relay_get_peers_in_mesh to libwaku (#3352)
1 parent 7250d73 commit ef90744

File tree

4 files changed

+55
-8
lines changed

4 files changed

+55
-8
lines changed

library/libwaku.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,11 @@ int waku_relay_get_num_peers_in_mesh(void* ctx,
127127
WakuCallBack callback,
128128
void* userData);
129129

130+
int waku_relay_get_peers_in_mesh(void* ctx,
131+
const char* pubSubTopic,
132+
WakuCallBack callback,
133+
void* userData);
134+
130135
int waku_store_query(void* ctx,
131136
const char* jsonQuery,
132137
const char* peerAddr,

library/libwaku.nim

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -471,6 +471,27 @@ proc waku_relay_get_num_peers_in_mesh(
471471
initializeLibrary()
472472
checkLibwakuParams(ctx, callback, userData)
473473

474+
let pst = pubSubTopic.alloc()
475+
defer:
476+
deallocShared(pst)
477+
478+
handleRequest(
479+
ctx,
480+
RequestType.RELAY,
481+
RelayRequest.createShared(RelayMsgType.NUM_MESH_PEERS, pst),
482+
callback,
483+
userData,
484+
)
485+
486+
proc waku_relay_get_peers_in_mesh(
487+
ctx: ptr WakuContext,
488+
pubSubTopic: cstring,
489+
callback: WakuCallBack,
490+
userData: pointer,
491+
): cint {.dynlib, exportc.} =
492+
initializeLibrary()
493+
checkLibwakuParams(ctx, callback, userData)
494+
474495
let pst = pubSubTopic.alloc()
475496
defer:
476497
deallocShared(pst)

library/waku_thread/inter_thread_communication/requests/protocols/relay_request.nim

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ type RelayMsgType* = enum
1818
NUM_CONNECTED_PEERS
1919
LIST_CONNECTED_PEERS
2020
## to return the list of all connected peers to an specific pubsub topic
21+
NUM_MESH_PEERS
2122
LIST_MESH_PEERS
2223
## to return the list of only the peers that conform the mesh for a particular pubsub topic
2324
ADD_PROTECTED_SHARD ## Protects a shard with a public key
@@ -135,11 +136,17 @@ proc process*(
135136
return err($error)
136137
## returns a comma-separated string of peerIDs
137138
return ok(connPeers.mapIt($it).join(","))
138-
of LIST_MESH_PEERS:
139+
of NUM_MESH_PEERS:
139140
let numPeersInMesh = waku.node.wakuRelay.getNumPeersInMesh($self.pubsubTopic).valueOr:
140-
error "LIST_MESH_PEERS failed", error = error
141+
error "NUM_MESH_PEERS failed", error = error
141142
return err($error)
142143
return ok($numPeersInMesh)
144+
of LIST_MESH_PEERS:
145+
let meshPeers = waku.node.wakuRelay.getPeersInMesh($self.pubsubTopic).valueOr:
146+
error "LIST_MESH_PEERS failed", error = error
147+
return err($error)
148+
## returns a comma-separated string of peerIDs
149+
return ok(meshPeers.mapIt($it).join(","))
143150
of ADD_PROTECTED_SHARD:
144151
try:
145152
let relayShard =

waku/waku_relay/protocol.nim

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -323,21 +323,35 @@ proc addObserver*(w: WakuRelay, observer: PubSubObserver) {.gcsafe.} =
323323
proc getDHigh*(T: type WakuRelay): int =
324324
return GossipsubParameters.dHigh
325325

326-
proc getNumPeersInMesh*(w: WakuRelay, pubsubTopic: PubsubTopic): Result[int, string] =
327-
## Returns the number of peers in a mesh defined by the passed pubsub topic.
326+
proc getPeersInMesh*(
327+
w: WakuRelay, pubsubTopic: PubsubTopic
328+
): Result[seq[PeerId], string] =
329+
## Returns the list of peerIds in a mesh defined by the passed pubsub topic.
328330
## The 'mesh' atribute is defined in the GossipSub ref object.
329331

330332
if not w.mesh.hasKey(pubsubTopic):
331-
debug "getNumPeersInMesh - there is no mesh peer for the given pubsub topic",
333+
debug "getPeersInMesh - there is no mesh peer for the given pubsub topic",
332334
pubsubTopic = pubsubTopic
333-
return ok(0)
335+
return ok(newSeq[PeerId]())
334336

335337
let peersRes = catch:
336338
w.mesh[pubsubTopic]
337339

338340
let peers: HashSet[PubSubPeer] = peersRes.valueOr:
339-
return
340-
err("getNumPeersInMesh - exception accessing " & pubsubTopic & ": " & error.msg)
341+
return err("getPeersInMesh - exception accessing " & pubsubTopic & ": " & error.msg)
342+
343+
let peerIds = toSeq(peers).mapIt(it.peerId)
344+
345+
return ok(peerIds)
346+
347+
proc getNumPeersInMesh*(w: WakuRelay, pubsubTopic: PubsubTopic): Result[int, string] =
348+
## Returns the number of peers in a mesh defined by the passed pubsub topic.
349+
350+
let peers = w.getPeersInMesh(pubsubTopic).valueOr:
351+
return err(
352+
"getNumPeersInMesh - failed retrieving peers in mesh: " & pubsubTopic & ": " &
353+
error
354+
)
341355

342356
return ok(peers.len)
343357

0 commit comments

Comments
 (0)