2026-06-25 00:40:02 +02:00
|
|
|
import std/[strutils, json]
|
|
|
|
|
import chronicles, chronos, results, ffi
|
2025-12-19 17:00:43 +01:00
|
|
|
import
|
2026-06-25 00:40:02 +02:00
|
|
|
logos_delivery,
|
2026-06-08 13:37:53 +02:00
|
|
|
logos_delivery/waku/waku_core/topics/pubsub_topic,
|
2026-06-25 00:40:02 +02:00
|
|
|
logos_delivery/waku/waku_core/message,
|
2026-06-08 13:37:53 +02:00
|
|
|
logos_delivery/waku/waku_relay/protocol,
|
2025-12-19 17:00:43 +01:00
|
|
|
library/events/json_message_event,
|
|
|
|
|
library/declare_lib
|
|
|
|
|
|
|
|
|
|
proc waku_relay_get_peers_in_mesh(
|
2026-06-23 01:20:09 +02:00
|
|
|
ctx: ptr FFIContext[LogosDelivery],
|
2025-12-19 17:00:43 +01:00
|
|
|
callback: FFICallBack,
|
|
|
|
|
userData: pointer,
|
|
|
|
|
pubSubTopic: cstring,
|
|
|
|
|
) {.ffi.} =
|
2026-06-25 00:40:02 +02:00
|
|
|
let peers = (await ctx.myLib[].waku.relayPeersInMesh(PubsubTopic($pubSubTopic))).valueOr:
|
2025-12-19 17:00:43 +01:00
|
|
|
error "LIST_MESH_PEERS failed", error = error
|
2026-06-25 00:40:02 +02:00
|
|
|
return err(error)
|
2025-12-19 17:00:43 +01:00
|
|
|
## returns a comma-separated string of peerIDs
|
2026-06-25 00:40:02 +02:00
|
|
|
return ok(peers.join(","))
|
2025-12-19 17:00:43 +01:00
|
|
|
|
|
|
|
|
proc waku_relay_get_num_peers_in_mesh(
|
2026-06-23 01:20:09 +02:00
|
|
|
ctx: ptr FFIContext[LogosDelivery],
|
2025-12-19 17:00:43 +01:00
|
|
|
callback: FFICallBack,
|
|
|
|
|
userData: pointer,
|
|
|
|
|
pubSubTopic: cstring,
|
|
|
|
|
) {.ffi.} =
|
2026-06-25 00:40:02 +02:00
|
|
|
let n = (await ctx.myLib[].waku.relayNumPeersInMesh(PubsubTopic($pubSubTopic))).valueOr:
|
2025-12-19 17:00:43 +01:00
|
|
|
error "NUM_MESH_PEERS failed", error = error
|
2026-06-25 00:40:02 +02:00
|
|
|
return err(error)
|
|
|
|
|
return ok($n)
|
2025-12-19 17:00:43 +01:00
|
|
|
|
|
|
|
|
proc waku_relay_get_connected_peers(
|
2026-06-23 01:20:09 +02:00
|
|
|
ctx: ptr FFIContext[LogosDelivery],
|
2025-12-19 17:00:43 +01:00
|
|
|
callback: FFICallBack,
|
|
|
|
|
userData: pointer,
|
|
|
|
|
pubSubTopic: cstring,
|
|
|
|
|
) {.ffi.} =
|
|
|
|
|
## Returns the list of all connected peers to an specific pubsub topic
|
2026-06-25 00:40:02 +02:00
|
|
|
let peers = (await ctx.myLib[].waku.relayConnectedPeers(PubsubTopic($pubSubTopic))).valueOr:
|
2025-12-19 17:00:43 +01:00
|
|
|
error "LIST_CONNECTED_PEERS failed", error = error
|
2026-06-25 00:40:02 +02:00
|
|
|
return err(error)
|
|
|
|
|
return ok(peers.join(","))
|
2025-12-19 17:00:43 +01:00
|
|
|
|
|
|
|
|
proc waku_relay_get_num_connected_peers(
|
2026-06-23 01:20:09 +02:00
|
|
|
ctx: ptr FFIContext[LogosDelivery],
|
2025-12-19 17:00:43 +01:00
|
|
|
callback: FFICallBack,
|
|
|
|
|
userData: pointer,
|
|
|
|
|
pubSubTopic: cstring,
|
|
|
|
|
) {.ffi.} =
|
2026-06-25 00:40:02 +02:00
|
|
|
let n = (await ctx.myLib[].waku.relayNumConnectedPeers(PubsubTopic($pubSubTopic))).valueOr:
|
2025-12-19 17:00:43 +01:00
|
|
|
error "NUM_CONNECTED_PEERS failed", error = error
|
2026-06-25 00:40:02 +02:00
|
|
|
return err(error)
|
|
|
|
|
return ok($n)
|
2025-12-19 17:00:43 +01:00
|
|
|
|
|
|
|
|
proc waku_relay_add_protected_shard(
|
2026-06-23 01:20:09 +02:00
|
|
|
ctx: ptr FFIContext[LogosDelivery],
|
2025-12-19 17:00:43 +01:00
|
|
|
callback: FFICallBack,
|
|
|
|
|
userData: pointer,
|
|
|
|
|
clusterId: cint,
|
|
|
|
|
shardId: cint,
|
|
|
|
|
publicKey: cstring,
|
|
|
|
|
) {.ffi.} =
|
|
|
|
|
## Protects a shard with a public key
|
2026-06-25 00:40:02 +02:00
|
|
|
(
|
|
|
|
|
await ctx.myLib[].waku.relayAddProtectedShard(
|
|
|
|
|
uint16(clusterId), uint16(shardId), $publicKey
|
2025-12-19 17:00:43 +01:00
|
|
|
)
|
2026-06-25 00:40:02 +02:00
|
|
|
).isOkOr:
|
|
|
|
|
return err(error)
|
2025-12-19 17:00:43 +01:00
|
|
|
return ok("")
|
|
|
|
|
|
|
|
|
|
proc waku_relay_subscribe(
|
2026-06-23 01:20:09 +02:00
|
|
|
ctx: ptr FFIContext[LogosDelivery],
|
2025-12-19 17:00:43 +01:00
|
|
|
callback: FFICallBack,
|
|
|
|
|
userData: pointer,
|
|
|
|
|
pubSubTopic: cstring,
|
|
|
|
|
) {.ffi.} =
|
2026-06-23 01:20:09 +02:00
|
|
|
proc onReceivedMessage(ctx: ptr FFIContext[LogosDelivery]): WakuRelayHandler =
|
2025-12-19 17:00:43 +01:00
|
|
|
return proc(pubsubTopic: PubsubTopic, msg: WakuMessage) {.async.} =
|
|
|
|
|
callEventCallback(ctx, "onReceivedMessage"):
|
|
|
|
|
$JsonMessageEvent.new(pubsubTopic, msg)
|
|
|
|
|
|
2026-06-25 00:40:02 +02:00
|
|
|
(
|
|
|
|
|
await ctx.myLib[].waku.relaySubscribe(
|
|
|
|
|
PubsubTopic($pubSubTopic), WakuRelayHandler(onReceivedMessage(ctx))
|
|
|
|
|
)
|
2025-12-19 17:00:43 +01:00
|
|
|
).isOkOr:
|
|
|
|
|
error "SUBSCRIBE failed", error = error
|
2026-06-25 00:40:02 +02:00
|
|
|
return err(error)
|
2025-12-19 17:00:43 +01:00
|
|
|
return ok("")
|
|
|
|
|
|
|
|
|
|
proc waku_relay_unsubscribe(
|
2026-06-23 01:20:09 +02:00
|
|
|
ctx: ptr FFIContext[LogosDelivery],
|
2025-12-19 17:00:43 +01:00
|
|
|
callback: FFICallBack,
|
|
|
|
|
userData: pointer,
|
|
|
|
|
pubSubTopic: cstring,
|
|
|
|
|
) {.ffi.} =
|
2026-06-25 00:40:02 +02:00
|
|
|
(await ctx.myLib[].waku.relayUnsubscribe(PubsubTopic($pubSubTopic))).isOkOr:
|
2025-12-19 17:00:43 +01:00
|
|
|
error "UNSUBSCRIBE failed", error = error
|
2026-06-25 00:40:02 +02:00
|
|
|
return err(error)
|
2025-12-19 17:00:43 +01:00
|
|
|
return ok("")
|
|
|
|
|
|
|
|
|
|
proc waku_relay_publish(
|
2026-06-23 01:20:09 +02:00
|
|
|
ctx: ptr FFIContext[LogosDelivery],
|
2025-12-19 17:00:43 +01:00
|
|
|
callback: FFICallBack,
|
|
|
|
|
userData: pointer,
|
|
|
|
|
pubSubTopic: cstring,
|
|
|
|
|
jsonWakuMessage: cstring,
|
|
|
|
|
timeoutMs: cuint,
|
|
|
|
|
) {.ffi.} =
|
2026-06-25 00:40:02 +02:00
|
|
|
var jsonMessage: JsonMessage
|
2025-12-19 17:00:43 +01:00
|
|
|
try:
|
|
|
|
|
let jsonContent = parseJson($jsonWakuMessage)
|
|
|
|
|
jsonMessage = JsonMessage.fromJsonNode(jsonContent).valueOr:
|
|
|
|
|
raise newException(JsonParsingError, $error)
|
|
|
|
|
except JsonParsingError as exc:
|
2026-06-25 00:40:02 +02:00
|
|
|
return err("Error parsing json message: " & exc.msg)
|
2025-12-19 17:00:43 +01:00
|
|
|
|
|
|
|
|
let msg = json_message_event.toWakuMessage(jsonMessage).valueOr:
|
|
|
|
|
return err("Problem building the WakuMessage: " & $error)
|
|
|
|
|
|
2026-06-25 00:40:02 +02:00
|
|
|
let msgHash = (
|
|
|
|
|
await ctx.myLib[].waku.relayPublish(PubsubTopic($pubSubTopic), msg, uint32(timeoutMs))
|
|
|
|
|
).valueOr:
|
2025-12-19 17:00:43 +01:00
|
|
|
error "PUBLISH failed", error = error
|
2026-06-25 00:40:02 +02:00
|
|
|
return err(error)
|
2025-12-19 17:00:43 +01:00
|
|
|
return ok(msgHash)
|
|
|
|
|
|
|
|
|
|
proc waku_default_pubsub_topic(
|
2026-06-23 01:20:09 +02:00
|
|
|
ctx: ptr FFIContext[LogosDelivery], callback: FFICallBack, userData: pointer
|
2025-12-19 17:00:43 +01:00
|
|
|
) {.ffi.} =
|
2026-06-25 00:40:02 +02:00
|
|
|
let topic = (await ctx.myLib[].waku.defaultPubsubTopic()).valueOr:
|
|
|
|
|
return err(error)
|
|
|
|
|
return ok(string(topic))
|
2025-12-19 17:00:43 +01:00
|
|
|
|
|
|
|
|
proc waku_content_topic(
|
2026-06-23 01:20:09 +02:00
|
|
|
ctx: ptr FFIContext[LogosDelivery],
|
2025-12-19 17:00:43 +01:00
|
|
|
callback: FFICallBack,
|
|
|
|
|
userData: pointer,
|
|
|
|
|
appName: cstring,
|
|
|
|
|
appVersion: cuint,
|
|
|
|
|
contentTopicName: cstring,
|
|
|
|
|
encoding: cstring,
|
|
|
|
|
) {.ffi.} =
|
2026-06-25 00:40:02 +02:00
|
|
|
let topic = (
|
|
|
|
|
await ctx.myLib[].waku.buildContentTopic(
|
|
|
|
|
$appName, uint32(appVersion), $contentTopicName, $encoding
|
|
|
|
|
)
|
|
|
|
|
).valueOr:
|
|
|
|
|
return err(error)
|
|
|
|
|
return ok(string(topic))
|
2025-12-19 17:00:43 +01:00
|
|
|
|
|
|
|
|
proc waku_pubsub_topic(
|
2026-06-23 01:20:09 +02:00
|
|
|
ctx: ptr FFIContext[LogosDelivery],
|
2025-12-19 17:00:43 +01:00
|
|
|
callback: FFICallBack,
|
|
|
|
|
userData: pointer,
|
|
|
|
|
topicName: cstring,
|
|
|
|
|
) {.ffi.} =
|
2026-06-25 00:40:02 +02:00
|
|
|
let topic = (await ctx.myLib[].waku.buildPubsubTopic($topicName)).valueOr:
|
|
|
|
|
return err(error)
|
|
|
|
|
return ok(string(topic))
|