mirror of
https://github.com/logos-messaging/logos-messaging-nim.git
synced 2026-02-14 02:43:12 +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
65 lines
2.3 KiB
Nim
65 lines
2.3 KiB
Nim
import chronos, chronicles
|
|
import
|
|
waku/[
|
|
waku_core,
|
|
waku_core/topics,
|
|
events/message_events,
|
|
waku_node,
|
|
common/broker/broker_context,
|
|
]
|
|
|
|
type SubscriptionService* = ref object of RootObj
|
|
brokerCtx: BrokerContext
|
|
node: WakuNode
|
|
|
|
proc new*(T: typedesc[SubscriptionService], node: WakuNode): T =
|
|
## The storeClient will help to acquire any possible missed messages
|
|
|
|
return SubscriptionService(brokerCtx: node.brokerCtx, node: node)
|
|
|
|
proc isSubscribed*(
|
|
self: SubscriptionService, topic: ContentTopic
|
|
): Result[bool, string] =
|
|
var isSubscribed = false
|
|
if self.node.wakuRelay.isNil() == false:
|
|
return self.node.isSubscribed((kind: ContentSub, topic: topic))
|
|
|
|
# TODO: Add support for edge mode with Filter subscription management
|
|
return ok(isSubscribed)
|
|
|
|
#TODO: later PR may consider to refactor or place this function elsewhere
|
|
# The only important part is that it emits MessageReceivedEvent
|
|
proc getReceiveHandler(self: SubscriptionService): WakuRelayHandler =
|
|
return proc(topic: PubsubTopic, msg: WakuMessage): Future[void] {.async, gcsafe.} =
|
|
let msgHash = computeMessageHash(topic, msg).to0xHex()
|
|
info "API received message",
|
|
pubsubTopic = topic, contentTopic = msg.contentTopic, msgHash = msgHash
|
|
|
|
MessageReceivedEvent.emit(self.brokerCtx, msgHash, msg)
|
|
|
|
proc subscribe*(self: SubscriptionService, topic: ContentTopic): Result[void, string] =
|
|
let isSubscribed = self.isSubscribed(topic).valueOr:
|
|
error "Failed to check subscription status: ", error = error
|
|
return err("Failed to check subscription status: " & error)
|
|
|
|
if isSubscribed == false:
|
|
if self.node.wakuRelay.isNil() == false:
|
|
self.node.subscribe((kind: ContentSub, topic: topic), self.getReceiveHandler()).isOkOr:
|
|
error "Failed to subscribe: ", error = error
|
|
return err("Failed to subscribe: " & error)
|
|
|
|
# TODO: Add support for edge mode with Filter subscription management
|
|
|
|
return ok()
|
|
|
|
proc unsubscribe*(
|
|
self: SubscriptionService, topic: ContentTopic
|
|
): Result[void, string] =
|
|
if self.node.wakuRelay.isNil() == false:
|
|
self.node.unsubscribe((kind: ContentSub, topic: topic)).isOkOr:
|
|
error "Failed to unsubscribe: ", error = error
|
|
return err("Failed to unsubscribe: " & error)
|
|
|
|
# TODO: Add support for edge mode with Filter subscription management
|
|
return ok()
|