mirror of
https://github.com/logos-messaging/logos-delivery.git
synced 2026-06-04 13:09:32 +00:00
77 lines
2.4 KiB
Nim
77 lines
2.4 KiB
Nim
{.push raises: [].}
|
|
|
|
## Relay broker provider wiring. Binds the kernel relay publish broker to the
|
|
## live relay protocol (RLN proof + validation + publish).
|
|
|
|
import std/options
|
|
import chronos, results
|
|
import ../waku_node
|
|
import ../../waku_core
|
|
import ../../waku_relay
|
|
import ../../waku_rln_relay
|
|
import ../../waku_lightpush/callbacks
|
|
import ../../api/requests/relay as relay_api
|
|
|
|
proc registerRelayProviders*(node: WakuNode): Result[void, string] =
|
|
## Bind the relay publish broker provider to the live relay protocol.
|
|
relay_api.RequestRelayPublish.setProvider(
|
|
node.brokerCtx,
|
|
proc(
|
|
pubsubTopic: PubsubTopic, wakuMessage: WakuMessage
|
|
): Future[Result[relay_api.RequestRelayPublish, string]] {.async.} =
|
|
# Publish-path exceptions propagate; the broker turns them into a request
|
|
# error, which the caller maps to a permanent failure.
|
|
let rlnPeer =
|
|
if node.wakuRlnRelay.isNil():
|
|
none(WakuRLNRelay)
|
|
else:
|
|
some(node.wakuRlnRelay)
|
|
let msgWithProof = checkAndGenerateRLNProof(rlnPeer, wakuMessage).valueOr:
|
|
return ok(
|
|
relay_api.RequestRelayPublish(
|
|
relayedPeerCount: 0'u32,
|
|
publishError: none(PublishOutcome),
|
|
rlnProofFailed: true,
|
|
validationFailed: false,
|
|
errorDesc: error,
|
|
)
|
|
)
|
|
|
|
(await node.wakuRelay.validateMessage(pubsubTopic, msgWithProof)).isOkOr:
|
|
return ok(
|
|
relay_api.RequestRelayPublish(
|
|
relayedPeerCount: 0'u32,
|
|
publishError: none(PublishOutcome),
|
|
rlnProofFailed: false,
|
|
validationFailed: true,
|
|
errorDesc: error,
|
|
)
|
|
)
|
|
|
|
let res = await node.wakuRelay.publish(pubsubTopic, msgWithProof)
|
|
if res.isOk():
|
|
return ok(
|
|
relay_api.RequestRelayPublish(
|
|
relayedPeerCount: res.value.uint32,
|
|
publishError: none(PublishOutcome),
|
|
rlnProofFailed: false,
|
|
validationFailed: false,
|
|
errorDesc: "",
|
|
)
|
|
)
|
|
return ok(
|
|
relay_api.RequestRelayPublish(
|
|
relayedPeerCount: 0'u32,
|
|
publishError: some(res.error),
|
|
rlnProofFailed: false,
|
|
validationFailed: false,
|
|
errorDesc: $res.error,
|
|
)
|
|
),
|
|
).isOkOr:
|
|
return err("registerRelayProviders: RequestRelayPublish: " & error)
|
|
|
|
ok()
|
|
|
|
{.pop.}
|