when (NimMajor, NimMinor) < (1, 4): {.push raises: [Defect].} else: {.push raises: [].} import chronos, chronicles, std/[options, sequtils], stew/results import ../waku_discv5, ../waku_relay, ../waku_core, ./message_cache ### Discovery type DiscoveryHandler* = proc(): Future[Result[Option[RemotePeerInfo], string]] {.async, closure.} proc defaultDiscoveryHandler*(discv5: WakuDiscoveryV5, cap: Capabilities): DiscoveryHandler = proc(): Future[Result[Option[RemotePeerInfo], string]] {.async, closure.} = #Discv5 is already filtering peers by shards no need to pass a predicate. let findPeers = discv5.findRandomPeers() if not await findPeers.withTimeout(60.seconds): return err("discovery process timed out!") var peers = findPeers.read() peers.keepItIf(it.supportsCapability(cap)) if peers.len == 0: return ok(none(RemotePeerInfo)) let remotePeerInfo = peers[0].toRemotePeerInfo().valueOr: return err($error) return ok(some(remotePeerInfo)) ### Message Cache proc messageCacheHandler*(cache: MessageCache[string]): WakuRelayHandler = return proc(pubsubTopic: string, msg: WakuMessage): Future[void] {.async, closure.} = cache.addMessage(PubSubTopic(pubsubTopic), msg) proc autoMessageCacheHandler*(cache: MessageCache[string]): WakuRelayHandler = return proc(pubsubTopic: string, msg: WakuMessage): Future[void] {.async, closure.} = if cache.isSubscribed(msg.contentTopic): cache.addMessage(msg.contentTopic, msg)