123 lines
4.2 KiB
Nim

import std/[strutils, json]
import chronicles, chronos, results, ffi
import
logos_delivery,
logos_delivery/waku/waku_core/topics/pubsub_topic,
logos_delivery/waku/waku_core/message,
logos_delivery/waku/waku_relay/protocol,
library/events/json_message_event,
library/declare_lib
proc waku_relay_get_peers_in_mesh(
self: LogosDelivery, pubSubTopic: string
): Future[Result[string, string]] {.ffi.} =
## returns a comma-separated string of peerIDs
let peers = (await self.waku.relayPeersInMesh(PubsubTopic(pubSubTopic))).valueOr:
error "LIST_MESH_PEERS failed", error = error
return err(error)
return ok(peers.join(","))
proc waku_relay_get_num_peers_in_mesh(
self: LogosDelivery, pubSubTopic: string
): Future[Result[string, string]] {.ffi.} =
let n = (await self.waku.relayNumPeersInMesh(PubsubTopic(pubSubTopic))).valueOr:
error "NUM_MESH_PEERS failed", error = error
return err(error)
return ok($n)
proc waku_relay_get_connected_peers(
self: LogosDelivery, pubSubTopic: string
): Future[Result[string, string]] {.ffi.} =
## Returns the list of all connected peers to an specific pubsub topic
let peers = (await self.waku.relayConnectedPeers(PubsubTopic(pubSubTopic))).valueOr:
error "LIST_CONNECTED_PEERS failed", error = error
return err(error)
return ok(peers.join(","))
proc waku_relay_get_num_connected_peers(
self: LogosDelivery, pubSubTopic: string
): Future[Result[string, string]] {.ffi.} =
let n = (await self.waku.relayNumConnectedPeers(PubsubTopic(pubSubTopic))).valueOr:
error "NUM_CONNECTED_PEERS failed", error = error
return err(error)
return ok($n)
proc waku_relay_add_protected_shard(
self: LogosDelivery, clusterId: uint16, shardId: uint16, publicKey: string
): Future[Result[string, string]] {.ffi.} =
## Protects a shard with a public key
(await self.waku.relayAddProtectedShard(clusterId, shardId, publicKey)).isOkOr:
return err(error)
return ok("")
proc waku_relay_subscribe(
self: LogosDelivery, pubSubTopic: string
): Future[Result[string, string]] {.ffi.} =
proc onReceivedMessage(): WakuRelayHandler =
return proc(pubsubTopic: PubsubTopic, msg: WakuMessage) {.async.} =
emitEvent("onReceivedMessage"):
$JsonMessageEvent.new(pubsubTopic, msg)
(
await self.waku.relaySubscribe(
PubsubTopic(pubSubTopic), WakuRelayHandler(onReceivedMessage())
)
).isOkOr:
error "SUBSCRIBE failed", error = error
return err(error)
return ok("")
proc waku_relay_unsubscribe(
self: LogosDelivery, pubSubTopic: string
): Future[Result[string, string]] {.ffi.} =
(await self.waku.relayUnsubscribe(PubsubTopic(pubSubTopic))).isOkOr:
error "UNSUBSCRIBE failed", error = error
return err(error)
return ok("")
proc waku_relay_publish(
self: LogosDelivery, pubSubTopic: string, jsonWakuMessage: string, timeoutMs: uint32
): Future[Result[string, string]] {.ffi.} =
var jsonMessage: JsonMessage
try:
let jsonContent = parseJson(jsonWakuMessage)
jsonMessage = JsonMessage.fromJsonNode(jsonContent).valueOr:
raise newException(JsonParsingError, $error)
except JsonParsingError as e:
return err("Error parsing json message: " & e.msg)
let msg = json_message_event.toWakuMessage(jsonMessage).valueOr:
return err("Problem building the WakuMessage: " & $error)
let msgHash = (await self.waku.relayPublish(PubsubTopic(pubSubTopic), msg, timeoutMs)).valueOr:
error "PUBLISH failed", error = error
return err(error)
return ok(msgHash)
proc waku_default_pubsub_topic(
self: LogosDelivery
): Future[Result[string, string]] {.ffi.} =
let topic = (await self.waku.defaultPubsubTopic()).valueOr:
return err(error)
return ok(string(topic))
proc waku_content_topic(
self: LogosDelivery,
appName: string,
appVersion: uint32,
contentTopicName: string,
encoding: string,
): Future[Result[string, string]] {.ffi.} =
let topic = (
await self.waku.buildContentTopic(appName, appVersion, contentTopicName, encoding)
).valueOr:
return err(error)
return ok(string(topic))
proc waku_pubsub_topic(
self: LogosDelivery, topicName: string
): Future[Result[string, string]] {.ffi.} =
let topic = (await self.waku.buildPubsubTopic(topicName)).valueOr:
return err(error)
return ok(string(topic))