mirror of
https://github.com/logos-messaging/logos-delivery.git
synced 2026-03-07 01:23:14 +00:00
* Introduce api/send Added events and requests for support. Reworked delivery_monitor into a featured devlivery_service, that - supports relay publish and lightpush depending on configuration but with fallback options - if available and configured it utilizes store api to confirm message delivery - emits message delivery events accordingly prepare for use in api_example * Fix edge mode config and test added * Fix some import issues, start and stop waku shall not throw exception but return with result properly * Utlize sync RequestBroker, adapt to non-async broker usage and gcsafe where appropriate, removed leftover * add api_example app to examples2 * Adapt after merge from master * Adapt code for using broker context * Fix brokerCtx settings for all usedbrokers, cover locked node init * Various fixes upon test failures. Added initial of subscribe API and auto-subscribe for send api * More test added * Fix multi propagate event emit, fix fail send test case * Fix rebase * Fix PushMessageHandlers in tests * adapt libwaku to api changes * Fix relay test by adapting publish return error in case NoPeersToPublish * Addressing all remaining review findings. Removed leftovers. Fixed loggings and typos * Fix rln relay broker, missed brokerCtx * Fix rest relay test failed, due to publish will fail if no peer avail * ignore anvil test state file * Make terst_wakunode_rln_relay broker context aware to fix * Fix waku rln tests by having them broker context aware * fix typo in test_app.nim
91 lines
3.0 KiB
Nim
91 lines
3.0 KiB
Nim
{.push raises: [].}
|
|
|
|
import std/options, results, chronos, libp2p/peerid
|
|
import ../waku_core, ./rpc, ../waku_relay/protocol
|
|
|
|
from ../waku_core/codecs import WakuLightPushCodec
|
|
export WakuLightPushCodec
|
|
export LightPushStatusCode
|
|
|
|
const LightPushSuccessCode* = (SUCCESS: LightPushStatusCode(200))
|
|
|
|
const LightPushErrorCode* = (
|
|
BAD_REQUEST: LightPushStatusCode(400),
|
|
PAYLOAD_TOO_LARGE: LightPushStatusCode(413),
|
|
INVALID_MESSAGE: LightPushStatusCode(420),
|
|
UNSUPPORTED_PUBSUB_TOPIC: LightPushStatusCode(421),
|
|
TOO_MANY_REQUESTS: LightPushStatusCode(429),
|
|
INTERNAL_SERVER_ERROR: LightPushStatusCode(500),
|
|
SERVICE_NOT_AVAILABLE: LightPushStatusCode(503),
|
|
OUT_OF_RLN_PROOF: LightPushStatusCode(504),
|
|
NO_PEERS_TO_RELAY: LightPushStatusCode(505),
|
|
)
|
|
|
|
type ErrorStatus* = tuple[code: LightpushStatusCode, desc: Option[string]]
|
|
type WakuLightPushResult* = Result[uint32, ErrorStatus]
|
|
|
|
type PushMessageHandler* = proc(
|
|
pubsubTopic: PubsubTopic, message: WakuMessage
|
|
): Future[WakuLightPushResult] {.async.}
|
|
|
|
const TooManyRequestsMessage* = "Request rejected due to too many requests"
|
|
|
|
func isSuccess*(response: LightPushResponse): bool =
|
|
return response.statusCode == LightPushSuccessCode.SUCCESS
|
|
|
|
func toPushResult*(response: LightPushResponse): WakuLightPushResult =
|
|
if isSuccess(response):
|
|
let relayPeerCount = response.relayPeerCount.get(0)
|
|
return (
|
|
if (relayPeerCount == 0):
|
|
# Consider publishing to zero peers an error even if the service node
|
|
# sent us a "successful" response with zero peers
|
|
err((LightPushErrorCode.NO_PEERS_TO_RELAY, response.statusDesc))
|
|
else:
|
|
ok(relayPeerCount)
|
|
)
|
|
else:
|
|
return err((response.statusCode, response.statusDesc))
|
|
|
|
func lightpushSuccessResult*(relayPeerCount: uint32): WakuLightPushResult =
|
|
return ok(relayPeerCount)
|
|
|
|
func lightpushResultInternalError*(msg: string): WakuLightPushResult =
|
|
return err((LightPushErrorCode.INTERNAL_SERVER_ERROR, some(msg)))
|
|
|
|
func lightpushResultBadRequest*(msg: string): WakuLightPushResult =
|
|
return err((LightPushErrorCode.BAD_REQUEST, some(msg)))
|
|
|
|
func lightpushResultServiceUnavailable*(msg: string): WakuLightPushResult =
|
|
return err((LightPushErrorCode.SERVICE_NOT_AVAILABLE, some(msg)))
|
|
|
|
func lighpushErrorResult*(
|
|
statusCode: LightpushStatusCode, desc: string
|
|
): WakuLightPushResult =
|
|
return err((statusCode, some(desc)))
|
|
|
|
func mapPubishingErrorToPushResult*(
|
|
publishOutcome: PublishOutcome
|
|
): WakuLightPushResult =
|
|
case publishOutcome
|
|
of NoTopicSpecified:
|
|
return
|
|
err((LightPushErrorCode.INVALID_MESSAGE, some("Empty topic, skipping publish")))
|
|
of DuplicateMessage:
|
|
return
|
|
err((LightPushErrorCode.INVALID_MESSAGE, some("Dropping already-seen message")))
|
|
of NoPeersToPublish:
|
|
return err(
|
|
(
|
|
LightPushErrorCode.NO_PEERS_TO_RELAY,
|
|
some("No peers for topic, skipping publish"),
|
|
)
|
|
)
|
|
of CannotGenerateMessageId:
|
|
return err(
|
|
(
|
|
LightPushErrorCode.INTERNAL_SERVER_ERROR,
|
|
some("Error generating message id, skipping publish"),
|
|
)
|
|
)
|