mirror of
https://github.com/logos-messaging/logos-delivery.git
synced 2026-06-04 13:09:32 +00:00
53 lines
1.8 KiB
Nim
53 lines
1.8 KiB
Nim
{.push raises: [].}
|
|
|
|
import chronos, chronicles, results
|
|
import std/options
|
|
import stew/byteutils
|
|
import waku/waku_core
|
|
import waku/api/requests/subscription as kernel_subscription_api
|
|
import messaging/messaging_client_type
|
|
import messaging/delivery_service/delivery_service
|
|
import messaging/delivery_service/send_service
|
|
import messaging/delivery_service/send_service/delivery_task
|
|
import ./api_subscribe
|
|
import ./types
|
|
|
|
logScope:
|
|
topics = "messaging-api send"
|
|
|
|
proc send*(
|
|
client: MessagingClient, envelope: MessageEnvelope
|
|
): Future[Result[RequestId, string]] {.async: (raises: []).} =
|
|
## Send a message envelope. Auto-subscribes to the content topic if needed.
|
|
## Returns a RequestId for tracking via the message-lifecycle events.
|
|
if client.isNil() or client.deliveryService.isNil():
|
|
return err("MessagingClient.send: client/deliveryService is nil")
|
|
|
|
let subR = kernel_subscription_api.RequestIsSubscribed.request(
|
|
client.brokerCtx, envelope.contentTopic, none[PubsubTopic]()
|
|
)
|
|
let isSubbed = subR.isOk() and subR.get().subscribed
|
|
if not isSubbed:
|
|
info "Auto-subscribing to topic on send", contentTopic = envelope.contentTopic
|
|
(await subscribe(client, envelope.contentTopic)).isOkOr:
|
|
warn "Failed to auto-subscribe", error = error
|
|
return err("Failed to auto-subscribe before sending: " & error)
|
|
|
|
let requestId = RequestId.new(client.rng)
|
|
let deliveryTask = DeliveryTask.new(
|
|
requestId, envelope, client.brokerCtx
|
|
).valueOr:
|
|
return err("MessagingClient.send: failed to create delivery task: " & error)
|
|
|
|
info "MessagingClient.send: scheduling delivery task",
|
|
requestId = $requestId,
|
|
pubsubTopic = deliveryTask.pubsubTopic,
|
|
contentTopic = deliveryTask.msg.contentTopic,
|
|
msgHash = deliveryTask.msgHash.to0xHex()
|
|
|
|
asyncSpawn client.deliveryService.sendService.send(deliveryTask)
|
|
|
|
return ok(requestId)
|
|
|
|
{.pop.}
|