2024-06-28 16:04:57 +05:30
|
|
|
{.push raises: [].}
|
2024-01-30 07:28:21 -05:00
|
|
|
|
2025-03-05 12:07:56 +01:00
|
|
|
import std/options, results, chronos, libp2p/peerid
|
|
|
|
|
import ../waku_core, ./rpc, ../waku_relay/protocol
|
2024-01-30 07:28:21 -05:00
|
|
|
|
2024-10-24 15:31:04 +03:00
|
|
|
from ../waku_core/codecs import WakuLightPushCodec
|
|
|
|
|
export WakuLightPushCodec
|
2024-01-30 07:28:21 -05:00
|
|
|
|
2025-03-05 12:07:56 +01:00
|
|
|
type LightpushStatusCode* = enum
|
|
|
|
|
SUCCESS = uint32(200)
|
|
|
|
|
BAD_REQUEST = uint32(400)
|
|
|
|
|
PAYLOAD_TOO_LARGE = uint32(413)
|
|
|
|
|
INVALID_MESSAGE_ERROR = uint32(420)
|
|
|
|
|
UNSUPPORTED_PUBSUB_TOPIC = uint32(421)
|
|
|
|
|
TOO_MANY_REQUESTS = uint32(429)
|
|
|
|
|
INTERNAL_SERVER_ERROR = uint32(500)
|
|
|
|
|
NO_PEERS_TO_RELAY = uint32(503)
|
|
|
|
|
OUT_OF_RLN_PROOF = uint32(504)
|
|
|
|
|
SERVICE_NOT_AVAILABLE = uint32(505)
|
|
|
|
|
|
|
|
|
|
type ErrorStatus* = tuple[code: LightpushStatusCode, desc: Option[string]]
|
|
|
|
|
type WakuLightPushResult* = Result[uint32, ErrorStatus]
|
2024-01-30 07:28:21 -05:00
|
|
|
|
|
|
|
|
type PushMessageHandler* = proc(
|
2024-03-16 00:08:47 +01:00
|
|
|
peer: PeerId, pubsubTopic: PubsubTopic, message: WakuMessage
|
2025-03-05 12:07:56 +01:00
|
|
|
): Future[WakuLightPushResult] {.async.}
|
|
|
|
|
|
|
|
|
|
const TooManyRequestsMessage* = "Request rejected due to too many requests"
|
|
|
|
|
|
|
|
|
|
func isSuccess*(response: LightPushResponse): bool =
|
|
|
|
|
return response.statusCode == LightpushStatusCode.SUCCESS.uint32
|
|
|
|
|
|
|
|
|
|
func toPushResult*(response: LightPushResponse): WakuLightPushResult =
|
|
|
|
|
if isSuccess(response):
|
|
|
|
|
return ok(response.relayPeerCount.get(0))
|
|
|
|
|
else:
|
|
|
|
|
return err((response.statusCode.LightpushStatusCode, response.statusDesc))
|
|
|
|
|
|
|
|
|
|
func lightpushSuccessResult*(relayPeerCount: uint32): WakuLightPushResult =
|
|
|
|
|
return ok(relayPeerCount)
|
|
|
|
|
|
|
|
|
|
func lightpushResultInternalError*(msg: string): WakuLightPushResult =
|
|
|
|
|
return err((LightpushStatusCode.INTERNAL_SERVER_ERROR, some(msg)))
|
|
|
|
|
|
|
|
|
|
func lighpushErrorResult*(
|
|
|
|
|
statusCode: LightpushStatusCode, desc: Option[string]
|
|
|
|
|
): WakuLightPushResult =
|
|
|
|
|
return err((statusCode, desc))
|
|
|
|
|
|
|
|
|
|
func lighpushErrorResult*(
|
|
|
|
|
statusCode: LightpushStatusCode, desc: string
|
|
|
|
|
): WakuLightPushResult =
|
|
|
|
|
return err((statusCode, some(desc)))
|
2024-04-15 15:28:35 +02:00
|
|
|
|
2025-03-05 12:07:56 +01:00
|
|
|
func mapPubishingErrorToPushResult*(
|
|
|
|
|
publishOutcome: PublishOutcome
|
|
|
|
|
): WakuLightPushResult =
|
|
|
|
|
case publishOutcome
|
|
|
|
|
of NoTopicSpecified:
|
|
|
|
|
return err(
|
|
|
|
|
(LightpushStatusCode.INVALID_MESSAGE_ERROR, some("Empty topic, skipping publish"))
|
|
|
|
|
)
|
|
|
|
|
of DuplicateMessage:
|
|
|
|
|
return err(
|
|
|
|
|
(LightpushStatusCode.INVALID_MESSAGE_ERROR, some("Dropping already-seen message"))
|
|
|
|
|
)
|
|
|
|
|
of NoPeersToPublish:
|
|
|
|
|
return err(
|
|
|
|
|
(
|
|
|
|
|
LightpushStatusCode.NO_PEERS_TO_RELAY,
|
|
|
|
|
some("No peers for topic, skipping publish"),
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
of CannotGenerateMessageId:
|
|
|
|
|
return err(
|
|
|
|
|
(
|
|
|
|
|
LightpushStatusCode.INTERNAL_SERVER_ERROR,
|
|
|
|
|
some("Error generating message id, skipping publish"),
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
else:
|
|
|
|
|
return err((LightpushStatusCode.INTERNAL_SERVER_ERROR, none[string]()))
|