From 4d68e2abd530dd1691d8e37ab812fc9ef913a065 Mon Sep 17 00:00:00 2001 From: Fabiana Cecin Date: Wed, 8 Oct 2025 19:14:54 -0300 Subject: [PATCH] chore(refactoring): results lib refactors (mostly replace `isOk`) (#3610) * Changes isOk usage into better patterns with e.g. valueOr / isOkOr * Some other refactoring included * This PR partially addresses #1969 --- apps/benchmarks/benchmarks.nim | 7 +- apps/chat2/chat2.nim | 81 +++++++------------ apps/chat2bridge/chat2bridge.nim | 8 +- apps/chat2bridge/config_chat2bridge.nim | 8 +- apps/chat2mix/chat2mix.nim | 52 +++++------- apps/liteprotocoltester/publisher.nim | 25 +++--- apps/liteprotocoltester/receiver.nim | 23 +++--- apps/networkmonitor/networkmonitor.nim | 32 +++----- examples/lightpush_publisher.nim | 4 +- waku/discovery/waku_discv5.nim | 10 +-- waku/discovery/waku_dnsdisc.nim | 24 ++---- waku/factory/node_factory.nim | 56 +++++-------- waku/factory/validator_signed.nim | 5 +- waku/utils/noise.nim | 14 ++-- waku/waku_api/rest/legacy_store/handlers.nim | 35 ++++---- waku/waku_api/rest/legacy_store/types.nim | 13 ++- waku/waku_api/rest/server.nim | 11 +-- .../postgres_driver/postgres_driver.nim | 52 ++++++------ .../postgres_driver/postgres_healthcheck.nim | 3 +- .../postgres_driver/postgres_healthcheck.nim | 3 +- 20 files changed, 182 insertions(+), 284 deletions(-) diff --git a/apps/benchmarks/benchmarks.nim b/apps/benchmarks/benchmarks.nim index 75686c8b9..7082f7a35 100644 --- a/apps/benchmarks/benchmarks.nim +++ b/apps/benchmarks/benchmarks.nim @@ -28,10 +28,9 @@ proc benchmark( iter = i, elapsed_ms = (getTime() - start_time).inMilliseconds discard await manager.updateRoots() - let proofResult = await manager.fetchMerkleProofElements() - if proofResult.isErr(): - error "Failed to fetch Merkle proof", error = proofResult.error - manager.merkleProofCache = proofResult.get() + manager.merkleProofCache = (await manager.fetchMerkleProofElements()).valueOr: + error "Failed to fetch Merkle proof", error = error + quit(QuitFailure) let epoch = default(Epoch) debug "epoch in bytes", epochHex = epoch.inHex() diff --git a/apps/chat2/chat2.nim b/apps/chat2/chat2.nim index 1531a4652..8a28b3b72 100644 --- a/apps/chat2/chat2.nim +++ b/apps/chat2/chat2.nim @@ -132,25 +132,14 @@ proc showChatPrompt(c: Chat) = except IOError: discard -proc getChatLine(c: Chat, msg: WakuMessage): Result[string, string] = +proc getChatLine(payload: seq[byte]): string = # No payload encoding/encryption from Waku - let - pb = Chat2Message.init(msg.payload) - chatLine = - if pb.isOk: - pb[].toString() - else: - string.fromBytes(msg.payload) - return ok(chatline) + let pb = Chat2Message.init(payload).valueOr: + return string.fromBytes(payload) + return $pb proc printReceivedMessage(c: Chat, msg: WakuMessage) = - let - pb = Chat2Message.init(msg.payload) - chatLine = - if pb.isOk: - pb[].toString() - else: - string.fromBytes(msg.payload) + let chatLine = getChatLine(msg.payload) try: echo &"{chatLine}" except ValueError: @@ -173,18 +162,16 @@ proc startMetricsServer( ): Result[MetricsHttpServerRef, string] = info "Starting metrics HTTP server", serverIp = $serverIp, serverPort = $serverPort - let metricsServerRes = MetricsHttpServerRef.new($serverIp, serverPort) - if metricsServerRes.isErr(): - return err("metrics HTTP server start failed: " & $metricsServerRes.error) + let server = MetricsHttpServerRef.new($serverIp, serverPort).valueOr: + return err("metrics HTTP server start failed: " & $error) - let server = metricsServerRes.value try: waitFor server.start() except CatchableError: return err("metrics HTTP server start failed: " & getCurrentExceptionMsg()) info "Metrics HTTP server started", serverIp = $serverIp, serverPort = $serverPort - ok(metricsServerRes.value) + ok(server) proc publish(c: Chat, line: string) = # First create a Chat2Message protobuf with this line of text @@ -202,19 +189,17 @@ proc publish(c: Chat, line: string) = version: 0, timestamp: getNanosecondTime(time), ) + if not isNil(c.node.wakuRlnRelay): # for future version when we support more than one rln protected content topic, # we should check the message content topic as well - let appendRes = c.node.wakuRlnRelay.appendRLNProof(message, float64(time)) - if appendRes.isErr(): + if c.node.wakuRlnRelay.appendRLNProof(message, float64(time)).isErr(): debug "could not append rate limit proof to the message" else: debug "rate limit proof is appended to the message" - let decodeRes = RateLimitProof.init(message.proof) - if decodeRes.isErr(): + let proof = RateLimitProof.init(message.proof).valueOr: error "could not decode the RLN proof" - - let proof = decodeRes.get() + return # TODO move it to log after dogfooding let msgEpoch = fromEpoch(proof.epoch) if fromEpoch(c.node.wakuRlnRelay.lastEpoch) == msgEpoch: @@ -438,7 +423,7 @@ proc processInput(rfd: AsyncFD, rng: ref HmacDrbgContext) {.async.} = let resolved = await dnsResolver.resolveTxt(domain) return resolved[0] # Use only first answer - var wakuDnsDiscovery = WakuDnsDiscovery.init(dnsDiscoveryUrl.get(), resolver) + let wakuDnsDiscovery = WakuDnsDiscovery.init(dnsDiscoveryUrl.get(), resolver) if wakuDnsDiscovery.isOk: let discoveredPeers = await wakuDnsDiscovery.get().findPeers() if discoveredPeers.isOk: @@ -446,8 +431,10 @@ proc processInput(rfd: AsyncFD, rng: ref HmacDrbgContext) {.async.} = discoveredNodes = discoveredPeers.get() echo "Discovered and connecting to " & $discoveredNodes waitFor chat.node.connectToNodes(discoveredNodes) + else: + warn "Failed to find peers via DNS discovery", error = discoveredPeers.error else: - warn "Failed to init Waku DNS discovery" + warn "Failed to init Waku DNS discovery", error = wakuDnsDiscovery.error let peerInfo = node.switch.peerInfo let listenStr = $peerInfo.addrs[0] & "/p2p/" & $peerInfo.peerId @@ -483,21 +470,19 @@ proc processInput(rfd: AsyncFD, rng: ref HmacDrbgContext) {.async.} = else: newSeq[byte](0) - let - pb = Chat2Message.init(payload) - chatLine = - if pb.isOk: - pb[].toString() - else: - string.fromBytes(payload) + let chatLine = getChatLine(payload) echo &"{chatLine}" info "Hit store handler" - let queryRes = await node.query( - StoreQueryRequest(contentTopics: @[chat.contentTopic]), storenode.get() - ) - if queryRes.isOk(): - storeHandler(queryRes.value) + block storeQueryBlock: + let queryRes = ( + await node.query( + StoreQueryRequest(contentTopics: @[chat.contentTopic]), storenode.get() + ) + ).valueOr: + error "Store query failed", error = error + break storeQueryBlock + storeHandler(queryRes) # NOTE Must be mounted after relay if conf.lightpushnode != "": @@ -511,8 +496,9 @@ proc processInput(rfd: AsyncFD, rng: ref HmacDrbgContext) {.async.} = error = peerInfo.error if conf.filternode != "": - let peerInfo = parsePeerInfo(conf.filternode) - if peerInfo.isOk(): + if (let peerInfo = parsePeerInfo(conf.filternode); peerInfo.isErr()): + error "Filter not mounted. Couldn't parse conf.filternode", error = peerInfo.error + else: await node.mountFilter() await node.mountFilterClient() @@ -523,8 +509,6 @@ proc processInput(rfd: AsyncFD, rng: ref HmacDrbgContext) {.async.} = chat.printReceivedMessage(msg) # TODO: Here to support FilterV2 relevant subscription. - else: - error "Filter not mounted. Couldn't parse conf.filternode", error = peerInfo.error # Subscribe to a topic, if relay is mounted if conf.relay: @@ -545,11 +529,8 @@ proc processInput(rfd: AsyncFD, rng: ref HmacDrbgContext) {.async.} = proc spamHandler(wakuMessage: WakuMessage) {.gcsafe, closure.} = debug "spam handler is called" - let chatLineResult = chat.getChatLine(wakuMessage) - if chatLineResult.isOk(): - echo "A spam message is found and discarded : ", chatLineResult.value - else: - echo "A spam message is found and discarded" + let chatLineResult = getChatLine(wakuMessage.payload) + echo "spam message is found and discarded : " & chatLineResult chat.prompt = false showChatPrompt(chat) diff --git a/apps/chat2bridge/chat2bridge.nim b/apps/chat2bridge/chat2bridge.nim index c2bf9c032..279a5fefa 100644 --- a/apps/chat2bridge/chat2bridge.nim +++ b/apps/chat2bridge/chat2bridge.nim @@ -136,9 +136,7 @@ proc toMatterbridge( proc pollMatterbridge(cmb: Chat2MatterBridge, handler: MbMessageHandler) {.async.} = while cmb.running: - let getRes = cmb.mbClient.getMessages() - - if getRes.isOk(): + if (let getRes = cmb.mbClient.getMessages(); getRes.isOk()): for jsonNode in getRes[]: await handler(jsonNode) else: @@ -169,9 +167,7 @@ proc new*( let mbClient = MatterbridgeClient.new(mbHostUri, mbGateway) # Let's verify the Matterbridge configuration before continuing - let clientHealth = mbClient.isHealthy() - - if clientHealth.isOk() and clientHealth[]: + if mbClient.isHealthy().valueOr(false): info "Reached Matterbridge host", host = mbClient.host else: raise newException(ValueError, "Matterbridge client not reachable/healthy") diff --git a/apps/chat2bridge/config_chat2bridge.nim b/apps/chat2bridge/config_chat2bridge.nim index c7d8bb56a..abb5e329f 100644 --- a/apps/chat2bridge/config_chat2bridge.nim +++ b/apps/chat2bridge/config_chat2bridge.nim @@ -91,7 +91,7 @@ type Chat2MatterbridgeConf* = object name: "filternode" .}: string - # Matterbridge options + # Matterbridge options mbHostAddress* {. desc: "Listening address of the Matterbridge host", defaultValue: parseIpAddress("127.0.0.1"), @@ -126,11 +126,9 @@ proc completeCmdArg*(T: type keys.KeyPair, val: string): seq[string] = return @[] proc parseCmdArg*(T: type crypto.PrivateKey, p: string): T = - let key = SkPrivateKey.init(p) - if key.isOk(): - crypto.PrivateKey(scheme: Secp256k1, skkey: key.get()) - else: + let key = SkPrivateKey.init(p).valueOr: raise newException(ValueError, "Invalid private key") + return crypto.PrivateKey(scheme: Secp256k1, skkey: key) proc completeCmdArg*(T: type crypto.PrivateKey, val: string): seq[string] = return @[] diff --git a/apps/chat2mix/chat2mix.nim b/apps/chat2mix/chat2mix.nim index b4af7fbd6..21cdcd0d2 100644 --- a/apps/chat2mix/chat2mix.nim +++ b/apps/chat2mix/chat2mix.nim @@ -146,25 +146,14 @@ proc showChatPrompt(c: Chat) = except IOError: discard -proc getChatLine(c: Chat, msg: WakuMessage): Result[string, string] = +proc getChatLine(payload: seq[byte]): string = # No payload encoding/encryption from Waku - let - pb = Chat2Message.init(msg.payload) - chatLine = - if pb.isOk: - pb[].toString() - else: - string.fromBytes(msg.payload) - return ok(chatline) + let pb = Chat2Message.init(payload).valueOr: + return string.fromBytes(payload) + return $pb proc printReceivedMessage(c: Chat, msg: WakuMessage) = - let - pb = Chat2Message.init(msg.payload) - chatLine = - if pb.isOk: - pb[].toString() - else: - string.fromBytes(msg.payload) + let chatLine = getChatLine(msg.payload) try: echo &"{chatLine}" except ValueError: @@ -375,18 +364,17 @@ proc maintainSubscription( let peerOpt = selectRandomServicePeer( wakuNode.peerManager, some(actualFilterPeer), WakuFilterSubscribeCodec ) - if peerOpt.isOk(): - actualFilterPeer = peerOpt.get() - - info "Found new peer for codec", - codec = filterPubsubTopic, peer = constructMultiaddrStr(actualFilterPeer) - - noFailedSubscribes = 0 - continue # try again with new peer without delay - else: + peerOpt.isOkOr: error "Failed to find new service peer. Exiting." noFailedServiceNodeSwitches += 1 break + + actualFilterPeer = peerOpt.get() + info "Found new peer for codec", + codec = filterPubsubTopic, peer = constructMultiaddrStr(actualFilterPeer) + + noFailedSubscribes = 0 + continue # try again with new peer without delay else: if noFailedSubscribes > 0: noFailedSubscribes -= 1 @@ -530,7 +518,7 @@ proc processInput(rfd: AsyncFD, rng: ref HmacDrbgContext) {.async.} = let resolved = await dnsResolver.resolveTxt(domain) return resolved[0] # Use only first answer - var wakuDnsDiscovery = WakuDnsDiscovery.init(dnsDiscoveryUrl.get(), resolver) + let wakuDnsDiscovery = WakuDnsDiscovery.init(dnsDiscoveryUrl.get(), resolver) if wakuDnsDiscovery.isOk: let discoveredPeers = await wakuDnsDiscovery.get().findPeers() if discoveredPeers.isOk: @@ -538,8 +526,10 @@ proc processInput(rfd: AsyncFD, rng: ref HmacDrbgContext) {.async.} = discoveredNodes = discoveredPeers.get() echo "Discovered and connecting to " & $discoveredNodes waitFor chat.node.connectToNodes(discoveredNodes) + else: + warn "Failed to find peers via DNS discovery", error = discoveredPeers.error else: - warn "Failed to init Waku DNS discovery" + warn "Failed to init Waku DNS discovery", error = wakuDnsDiscovery.error let peerInfo = node.switch.peerInfo let listenStr = $peerInfo.addrs[0] & "/p2p/" & $peerInfo.peerId @@ -575,13 +565,7 @@ proc processInput(rfd: AsyncFD, rng: ref HmacDrbgContext) {.async.} = else: newSeq[byte](0) - let - pb = Chat2Message.init(payload) - chatLine = - if pb.isOk: - pb[].toString() - else: - string.fromBytes(payload) + let chatLine = getChatLine(payload) echo &"{chatLine}" info "Hit store handler" diff --git a/apps/liteprotocoltester/publisher.nim b/apps/liteprotocoltester/publisher.nim index d8031473d..1debfdf56 100644 --- a/apps/liteprotocoltester/publisher.nim +++ b/apps/liteprotocoltester/publisher.nim @@ -190,25 +190,22 @@ proc publishMessages( ) if not preventPeerSwitch and noFailedPush > maxFailedPush: info "Max push failure limit reached, Try switching peer." - let peerOpt = selectRandomServicePeer( + actualServicePeer = selectRandomServicePeer( wakuNode.peerManager, some(actualServicePeer), WakuLightPushCodec - ) - if peerOpt.isOk(): - actualServicePeer = peerOpt.get() - - info "New service peer in use", - codec = lightpushPubsubTopic, - peer = constructMultiaddrStr(actualServicePeer) - - noFailedPush = 0 - noOfServicePeerSwitches += 1 - lpt_change_service_peer_count.inc(labelValues = ["publisher"]) - continue # try again with new peer without delay - else: + ).valueOr: error "Failed to find new service peer. Exiting." noFailedServiceNodeSwitches += 1 break + info "New service peer in use", + codec = lightpushPubsubTopic, + peer = constructMultiaddrStr(actualServicePeer) + + noFailedPush = 0 + noOfServicePeerSwitches += 1 + lpt_change_service_peer_count.inc(labelValues = ["publisher"]) + continue # try again with new peer without delay + await sleepAsync(messageInterval) proc setupAndPublish*( diff --git a/apps/liteprotocoltester/receiver.nim b/apps/liteprotocoltester/receiver.nim index f0f41b1c5..0e6638c61 100644 --- a/apps/liteprotocoltester/receiver.nim +++ b/apps/liteprotocoltester/receiver.nim @@ -89,23 +89,20 @@ proc maintainSubscription( await sleepAsync(2.seconds) # Wait a bit before retrying continue elif not preventPeerSwitch: - let peerOpt = selectRandomServicePeer( + actualFilterPeer = selectRandomServicePeer( wakuNode.peerManager, some(actualFilterPeer), WakuFilterSubscribeCodec - ) - if peerOpt.isOk(): - actualFilterPeer = peerOpt.get() - - info "Found new peer for codec", - codec = filterPubsubTopic, peer = constructMultiaddrStr(actualFilterPeer) - - noFailedSubscribes = 0 - lpt_change_service_peer_count.inc(labelValues = ["receiver"]) - isFirstPingOnNewPeer = true - continue # try again with new peer without delay - else: + ).valueOr: error "Failed to find new service peer. Exiting." noFailedServiceNodeSwitches += 1 break + + info "Found new peer for codec", + codec = filterPubsubTopic, peer = constructMultiaddrStr(actualFilterPeer) + + noFailedSubscribes = 0 + lpt_change_service_peer_count.inc(labelValues = ["receiver"]) + isFirstPingOnNewPeer = true + continue # try again with new peer without delay else: if noFailedSubscribes > 0: noFailedSubscribes -= 1 diff --git a/apps/networkmonitor/networkmonitor.nim b/apps/networkmonitor/networkmonitor.nim index a9144ae22..b78a0cec1 100644 --- a/apps/networkmonitor/networkmonitor.nim +++ b/apps/networkmonitor/networkmonitor.nim @@ -1,7 +1,7 @@ {.push raises: [].} import - std/[net, tables, strutils, times, sequtils, random], + std/[net, tables, strutils, times, sequtils, random, sugar], results, chronicles, chronicles/topics_registry, @@ -183,16 +183,14 @@ proc setConnectedPeersMetrics( for maddr in peerInfo.addrs: if $maddr notin customPeerInfo.maddrs: customPeerInfo.maddrs.add $maddr - let typedRecord = discNode.toTypedRecord() - if not typedRecord.isOk(): + let typedRecord = discNode.toTypedRecord().valueOr: warn "could not convert record to typed record", record = discNode continue - if not typedRecord.get().ip.isSome(): - warn "ip field is not set", record = typedRecord.get() + let ipAddr = typedRecord.ip.valueOr: + warn "ip field is not set", record = typedRecord continue - let ip = $typedRecord.get().ip.get().join(".") - customPeerInfo.ip = ip + customPeerInfo.ip = $ipAddr.join(".") # try to ping the peer if shouldReconnect(customPeerInfo): @@ -374,14 +372,9 @@ proc retrieveDynamicBootstrapNodes( if resolved.len > 0: return resolved[0] # Use only first answer - var wakuDnsDiscovery = WakuDnsDiscovery.init(dnsDiscoveryUrl, resolver) - if wakuDnsDiscovery.isOk(): - return (await wakuDnsDiscovery.get().findPeers()).mapErr( - proc(e: cstring): string = - $e - ) - else: - warn "Failed to init Waku DNS discovery" + var wakuDnsDiscovery = WakuDnsDiscovery.init(dnsDiscoveryUrl, resolver).errorOr: + return (await value.findPeers()).mapErr(e => $e) + warn "Failed to init Waku DNS discovery" debug "No method for retrieving dynamic bootstrap nodes specified." ok(newSeq[RemotePeerInfo]()) # Return an empty seq by default @@ -391,11 +384,10 @@ proc getBootstrapFromDiscDns( ): Future[Result[seq[enr.Record], string]] {.async.} = try: let dnsNameServers = @[parseIpAddress("1.1.1.1"), parseIpAddress("1.0.0.1")] - let dynamicBootstrapNodesRes = + let dynamicBootstrapNodes = ( await retrieveDynamicBootstrapNodes(conf.dnsDiscoveryUrl, dnsNameServers) - if not dynamicBootstrapNodesRes.isOk(): - error("failed discovering peers from DNS") - let dynamicBootstrapNodes = dynamicBootstrapNodesRes.get() + ).valueOr: + return err("Failed retrieving dynamic bootstrap nodes: " & $error) # select dynamic bootstrap nodes that have an ENR containing a udp port. # Discv5 only supports UDP https://github.com/ethereum/devp2p/blob/master/discv5/discv5-theory.md) @@ -411,7 +403,7 @@ proc getBootstrapFromDiscDns( discv5BootstrapEnrs.add(enr) return ok(discv5BootstrapEnrs) except CatchableError: - error("failed discovering peers from DNS") + error("failed discovering peers from DNS: " & getCurrentExceptionMsg()) proc initAndStartApp( conf: NetworkMonitorConf diff --git a/examples/lightpush_publisher.nim b/examples/lightpush_publisher.nim index e9fa2174d..70ebd9c53 100644 --- a/examples/lightpush_publisher.nim +++ b/examples/lightpush_publisher.nim @@ -86,7 +86,9 @@ proc setupAndPublish(rng: ref HmacDrbgContext) {.async.} = timestamp: now(), ) # current timestamp - let lightpushPeer = parsePeerInfo(LightpushPeer).get() + let lightpushPeer = parsePeerInfo(LightpushPeer).valueOr: + error "failed to parse LightpushPeer", error = error + quit(QuitFailure) let res = await node.legacyLightpushPublish( some(LightpushPubsubTopic), message, lightpushPeer diff --git a/waku/discovery/waku_discv5.nim b/waku/discovery/waku_discv5.nim index 5ad07385c..29249df6c 100644 --- a/waku/discovery/waku_discv5.nim +++ b/waku/discovery/waku_discv5.nim @@ -421,13 +421,11 @@ proc setupDiscoveryV5*( addBootstrapNode(enrUri, discv5BootstrapEnrs) for enr in discv5BootstrapEnrs: - let peerInfoRes = enr.toRemotePeerInfo() - if peerInfoRes.isOk(): - nodePeerManager.addPeer(peerInfoRes.get(), PeerOrigin.Discv5) - else: + let peerInfo = enr.toRemotePeerInfo().valueOr: debug "could not convert discv5 bootstrap node to peerInfo, not adding peer to Peer Store", - enr = enr.toUri(), error = peerInfoRes.error - + enr = enr.toUri(), error = error + continue + nodePeerManager.addPeer(peerInfo, PeerOrigin.Discv5) discv5BootstrapEnrs.add(dynamicBootstrapEnrs) let discv5Config = diff --git a/waku/discovery/waku_dnsdisc.nim b/waku/discovery/waku_dnsdisc.nim index 995732a02..3204ad6bd 100644 --- a/waku/discovery/waku_dnsdisc.nim +++ b/waku/discovery/waku_dnsdisc.nim @@ -6,7 +6,7 @@ ## EIP-1459 is defined in https://eips.ethereum.org/EIPS/eip-1459 import - std/[options, net, sequtils], + std/[options, net, sequtils, sugar], chronicles, chronos, metrics, @@ -67,14 +67,11 @@ proc findPeers*( for enr in discoveredEnr: # Convert discovered ENR to RemotePeerInfo and add to discovered nodes - let res = enr.toRemotePeerInfo() - - if res.isOk(): - discoveredNodes.add(res.get()) - else: - error "Failed to convert ENR to peer info", enr = $enr, err = res.error() + let peerInfo = enr.toRemotePeerInfo().valueOr: + error "Failed to convert ENR to peer info", enr = $enr, error = error waku_dnsdisc_errors.inc(labelValues = ["peer_info_failure"]) - + continue + discoveredNodes.add(peerInfo) if discoveredNodes.len > 0: info "Successfully discovered nodes", count = discoveredNodes.len waku_dnsdisc_discovered.inc(discoveredNodes.len.int64) @@ -117,14 +114,9 @@ proc retrieveDynamicBootstrapNodes*( if resolved.len > 0: return resolved[0] # Use only first answer - var wakuDnsDiscovery = WakuDnsDiscovery.init(dnsDiscoveryUrl, resolver) - if wakuDnsDiscovery.isOk(): - return (await wakuDnsDiscovery.get().findPeers()).mapErr( - proc(e: cstring): string = - $e - ) - else: - warn "Failed to init Waku DNS discovery" + var wakuDnsDiscovery = WakuDnsDiscovery.init(dnsDiscoveryUrl, resolver).errorOr: + return (await value.findPeers()).mapErr(e => $e) + warn "Failed to init Waku DNS discovery" debug "No method for retrieving dynamic bootstrap nodes specified." ok(newSeq[RemotePeerInfo]()) # Return an empty seq by default diff --git a/waku/factory/node_factory.nim b/waku/factory/node_factory.nim index 016132306..c4cff6c68 100644 --- a/waku/factory/node_factory.nim +++ b/waku/factory/node_factory.nim @@ -251,21 +251,15 @@ proc setupProtocols( mountStoreClient(node) if conf.remoteStoreNode.isSome(): - let storeNode = parsePeerInfo(conf.remoteStoreNode.get()) - if storeNode.isOk(): - node.peerManager.addServicePeer(storeNode.value, store_common.WakuStoreCodec) - else: - return err("failed to set node waku store peer: " & storeNode.error) + let storeNode = parsePeerInfo(conf.remoteStoreNode.get()).valueOr: + return err("failed to set node waku store peer: " & error) + node.peerManager.addServicePeer(storeNode, WakuStoreCodec) mountLegacyStoreClient(node) if conf.remoteStoreNode.isSome(): - let storeNode = parsePeerInfo(conf.remoteStoreNode.get()) - if storeNode.isOk(): - node.peerManager.addServicePeer( - storeNode.value, legacy_common.WakuLegacyStoreCodec - ) - else: - return err("failed to set node waku legacy store peer: " & storeNode.error) + let storeNode = parsePeerInfo(conf.remoteStoreNode.get()).valueOr: + return err("failed to set node waku legacy store peer: " & error) + node.peerManager.addServicePeer(storeNode, WakuLegacyStoreCodec) if conf.storeServiceConf.isSome and conf.storeServiceConf.get().resume: node.setupStoreResume() @@ -377,12 +371,10 @@ proc setupProtocols( mountLightPushClient(node) mountLegacyLightPushClient(node) if conf.remoteLightPushNode.isSome(): - let lightPushNode = parsePeerInfo(conf.remoteLightPushNode.get()) - if lightPushNode.isOk(): - node.peerManager.addServicePeer(lightPushNode.value, WakuLightPushCodec) - node.peerManager.addServicePeer(lightPushNode.value, WakuLegacyLightPushCodec) - else: - return err("failed to set node waku lightpush peer: " & lightPushNode.error) + let lightPushNode = parsePeerInfo(conf.remoteLightPushNode.get()).valueOr: + return err("failed to set node waku lightpush peer: " & error) + node.peerManager.addServicePeer(lightPushNode, WakuLightPushCodec) + node.peerManager.addServicePeer(lightPushNode, WakuLegacyLightPushCodec) # Filter setup. NOTE Must be mounted after relay if conf.filterServiceConf.isSome(): @@ -400,16 +392,13 @@ proc setupProtocols( await node.mountFilterClient() if conf.remoteFilterNode.isSome(): - let filterNode = parsePeerInfo(conf.remoteFilterNode.get()) - if filterNode.isOk(): - try: - node.peerManager.addServicePeer(filterNode.value, WakuFilterSubscribeCodec) - except CatchableError: - return err( - "failed to mount waku filter client protocol: " & getCurrentExceptionMsg() - ) - else: - return err("failed to set node waku filter peer: " & filterNode.error) + let filterNode = parsePeerInfo(conf.remoteFilterNode.get()).valueOr: + return err("failed to set node waku filter peer: " & error) + try: + node.peerManager.addServicePeer(filterNode, WakuFilterSubscribeCodec) + except CatchableError: + return + err("failed to mount waku filter client protocol: " & getCurrentExceptionMsg()) # waku peer exchange setup if conf.peerExchangeService: @@ -422,12 +411,9 @@ proc setupProtocols( err("failed to mount waku peer-exchange protocol: " & getCurrentExceptionMsg()) if conf.remotePeerExchangeNode.isSome(): - let peerExchangeNode = parsePeerInfo(conf.remotePeerExchangeNode.get()) - if peerExchangeNode.isOk(): - node.peerManager.addServicePeer(peerExchangeNode.value, WakuPeerExchangeCodec) - else: - return - err("failed to set node waku peer-exchange peer: " & peerExchangeNode.error) + let peerExchangeNode = parsePeerInfo(conf.remotePeerExchangeNode.get()).valueOr: + return err("failed to set node waku peer-exchange peer: " & error) + node.peerManager.addServicePeer(peerExchangeNode, WakuPeerExchangeCodec) if conf.peerExchangeDiscovery: await node.mountPeerExchangeClient() @@ -481,7 +467,7 @@ proc startNode*( error "error while fetching peers from peer exchange", error = error # TODO: behavior described by comment is undesired. PX as client should be used in tandem with discv5. - # + # # Use px to periodically get peers if discv5 is disabled, as discv5 nodes have their own # periodic loop to find peers and px returned peers actually come from discv5 if conf.peerExchangeDiscovery and not conf.discv5Conf.isSome(): diff --git a/waku/factory/validator_signed.nim b/waku/factory/validator_signed.nim index 0da380ab5..bd6ad9ba6 100644 --- a/waku/factory/validator_signed.nim +++ b/waku/factory/validator_signed.nim @@ -67,9 +67,8 @@ proc addSignedShardsValidator*( if msg.timestamp != 0: if msg.withinTimeWindow(): let msgHash = SkMessage(topic.msgHash(msg)) - let recoveredSignature = SkSignature.fromRaw(msg.meta) - if recoveredSignature.isOk(): - if recoveredSignature.get.verify(msgHash, protectedShard.key): + SkSignature.fromRaw(msg.meta).isErrOr: + if value.verify(msgHash, protectedShard.key): outcome = errors.ValidationResult.Accept if outcome != errors.ValidationResult.Accept: diff --git a/waku/utils/noise.nim b/waku/utils/noise.nim index 2e0159203..c225ad9bf 100644 --- a/waku/utils/noise.nim +++ b/waku/utils/noise.nim @@ -12,11 +12,9 @@ proc decodePayloadV2*( case message.version of 2: # We attempt to decode the WakuMessage payload - let deserializedPayload2 = deserializePayloadV2(message.payload) - if deserializedPayload2.isOk(): - return ok(deserializedPayload2.get()) - else: + let deserializedPayload2 = deserializePayloadV2(message.payload).valueOr: return err("Failed to decode WakuMessage") + return ok(deserializedPayload2) else: return err("Wrong message version while decoding payload") @@ -28,13 +26,11 @@ proc encodePayloadV2*( raises: [NoiseMalformedHandshake, NoisePublicKeyError] .} = # We attempt to encode the PayloadV2 - let serializedPayload2 = serializePayloadV2(payload2) - if not serializedPayload2.isOk(): + let serializedPayload2 = serializePayloadV2(payload2).valueOr: return err("Failed to encode PayloadV2") # If successful, we create and return a WakuMessage - let msg = WakuMessage( - payload: serializedPayload2.get(), version: 2, contentTopic: contentTopic - ) + let msg = + WakuMessage(payload: serializedPayload2, version: 2, contentTopic: contentTopic) return ok(msg) diff --git a/waku/waku_api/rest/legacy_store/handlers.nim b/waku/waku_api/rest/legacy_store/handlers.nim index d960f24ea..0113111bd 100644 --- a/waku/waku_api/rest/legacy_store/handlers.nim +++ b/waku/waku_api/rest/legacy_store/handlers.nim @@ -70,30 +70,27 @@ proc parseCursor( digest: Option[string], ): Result[Option[HistoryCursor], string] = # Parse sender time - let parsedSenderTime = parseTime(senderTime) - if not parsedSenderTime.isOk(): - return err(parsedSenderTime.error) + let parsedSenderTime = parseTime(senderTime).valueOr: + return err(error) # Parse store time - let parsedStoreTime = parseTime(storeTime) - if not parsedStoreTime.isOk(): - return err(parsedStoreTime.error) + let parsedStoreTime = parseTime(storeTime).valueOr: + return err(error) # Parse message digest - let parsedMsgDigest = parseMsgDigest(digest) - if not parsedMsgDigest.isOk(): - return err(parsedMsgDigest.error) + let parsedMsgDigest = parseMsgDigest(digest).valueOr: + return err(error) # Parse cursor information - if parsedPubsubTopic.isSome() and parsedSenderTime.value.isSome() and - parsedStoreTime.value.isSome() and parsedMsgDigest.value.isSome(): + if parsedPubsubTopic.isSome() and parsedSenderTime.isSome() and + parsedStoreTime.isSome() and parsedMsgDigest.isSome(): return ok( some( HistoryCursor( pubsubTopic: parsedPubsubTopic.get(), - senderTime: parsedSenderTime.value.get(), - storeTime: parsedStoreTime.value.get(), - digest: parsedMsgDigest.value.get(), + senderTime: parsedSenderTime.get(), + storeTime: parsedStoreTime.get(), + digest: parsedMsgDigest.get(), ) ) ) @@ -225,16 +222,14 @@ proc installStoreApiHandlers*( endTime.toOpt(), pageSize.toOpt(), ascending.toOpt(), - ) - - if not histQuery.isOk(): - return RestApiResponse.badRequest(histQuery.error) + ).valueOr: + return RestApiResponse.badRequest(error) if peerAddr.isNone() and not node.wakuLegacyStore.isNil(): ## The user didn't specify a peer address and self-node is configured as a store node. ## In this case we assume that the user is willing to retrieve the messages stored by ## the local/self store node. - return await node.retrieveMsgsFromSelfNode(histQuery.get()) + return await node.retrieveMsgsFromSelfNode(histQuery) # Parse the peer address parameter let parsedPeerAddr = parseUrlPeerAddr(peerAddr.toOpt()).valueOr: @@ -253,4 +248,4 @@ proc installStoreApiHandlers*( "No suitable service peer & none discovered" ) - return await node.performHistoryQuery(histQuery.value, peerAddr) + return await node.performHistoryQuery(histQuery, peerAddr) diff --git a/waku/waku_api/rest/legacy_store/types.nim b/waku/waku_api/rest/legacy_store/types.nim index eee3ac2d8..53a96bd69 100644 --- a/waku/waku_api/rest/legacy_store/types.nim +++ b/waku/waku_api/rest/legacy_store/types.nim @@ -60,13 +60,11 @@ proc parseMsgDigest*( return ok(none(waku_store_common.MessageDigest)) let decodedUrl = decodeUrl(input.get()) - let base64Decoded = base64.decode(Base64String(decodedUrl)) + let base64DecodedArr = base64.decode(Base64String(decodedUrl)).valueOr: + return err(error) + var messageDigest = waku_store_common.MessageDigest() - if not base64Decoded.isOk(): - return err(base64Decoded.error) - - let base64DecodedArr = base64Decoded.get() # Next snippet inspired by "nwaku/waku/waku_archive/archive.nim" # TODO: Improve coherence of MessageDigest type messageDigest = block: @@ -220,10 +218,9 @@ proc readValue*( of "data": if data.isSome(): reader.raiseUnexpectedField("Multiple `data` fields found", "MessageDigest") - let decoded = base64.decode(reader.readValue(Base64String)) - if not decoded.isOk(): + let decoded = base64.decode(reader.readValue(Base64String)).valueOr: reader.raiseUnexpectedField("Failed decoding data", "MessageDigest") - data = some(decoded.get()) + data = some(decoded) else: reader.raiseUnexpectedField("Unrecognided field", cstring(fieldName)) diff --git a/waku/waku_api/rest/server.nim b/waku/waku_api/rest/server.nim index f16dfe83f..e5db5ee5e 100644 --- a/waku/waku_api/rest/server.nim +++ b/waku/waku_api/rest/server.nim @@ -91,7 +91,7 @@ proc new*( ): Future[HttpResponseRef] {.async: (raises: [CancelledError]).} = discard - let sres = HttpServerRef.new( + server.httpServer = HttpServerRef.new( address, defaultProcessCallback, serverFlags, @@ -106,12 +106,9 @@ proc new*( maxRequestBodySize, dualstack = dualstack, middlewares = middlewares, - ) - if sres.isOk(): - server.httpServer = sres.get() - ok(server) - else: - err(sres.error) + ).valueOr: + return err(error) + return ok(server) proc getRouter(): RestRouter = # TODO: Review this `validate` method. Check in nim-presto what is this used for. diff --git a/waku/waku_archive/driver/postgres_driver/postgres_driver.nim b/waku/waku_archive/driver/postgres_driver/postgres_driver.nim index 1518f7a3b..3d5260641 100644 --- a/waku/waku_archive/driver/postgres_driver/postgres_driver.nim +++ b/waku/waku_archive/driver/postgres_driver/postgres_driver.nim @@ -51,7 +51,7 @@ const SelectNoCursorAscStmtDef = const SelectNoCursorNoDataAscStmtName = "SelectWithoutCursorAndDataAsc" const SelectNoCursorNoDataAscStmtDef = - """SELECT messageHash FROM messages + """SELECT messageHash FROM messages WHERE contentTopic IN ($1) AND messageHash IN ($2) AND pubsubTopic = $3 AND @@ -196,7 +196,7 @@ proc hashCallbackImpl( pqResult: ptr PGresult, rows: var seq[(WakuMessageHash, PubsubTopic, WakuMessage)] ) = ## Callback to get a hash out of the DB. - ## Used when queries only ask for hashes + ## Used when queries only ask for hashes let numFields = pqResult.pqnfields() if numFields != 1: @@ -1233,33 +1233,30 @@ proc refreshPartitionsInfo( debug "refreshPartitionsInfo" self.partitionMngr.clearPartitionInfo() - let partitionNamesRes = await self.getPartitionsList() - if not partitionNamesRes.isOk(): - return err("Could not retrieve partitions list: " & $partitionNamesRes.error) - else: - let partitionNames = partitionNamesRes.get() - for partitionName in partitionNames: - ## partitionName contains something like 'messages_1708449815_1708449875' - let bothTimes = partitionName.replace("messages_", "") - let times = bothTimes.split("_") - if times.len != 2: - return err(fmt"loopPartitionFactory wrong partition name {partitionName}") + let partitionNames = (await self.getPartitionsList()).valueOr: + return err("could not get partitions list: " & $error) + for partitionName in partitionNames: + ## partitionName contains something like 'messages_1708449815_1708449875' + let bothTimes = partitionName.replace("messages_", "") + let times = bothTimes.split("_") + if times.len != 2: + return err(fmt"loopPartitionFactory wrong partition name {partitionName}") - var beginning: int64 - try: - beginning = parseInt(times[0]) - except ValueError: - return err("Could not parse beginning time: " & getCurrentExceptionMsg()) + var beginning: int64 + try: + beginning = parseInt(times[0]) + except ValueError: + return err("Could not parse beginning time: " & getCurrentExceptionMsg()) - var `end`: int64 - try: - `end` = parseInt(times[1]) - except ValueError: - return err("Could not parse end time: " & getCurrentExceptionMsg()) + var `end`: int64 + try: + `end` = parseInt(times[1]) + except ValueError: + return err("Could not parse end time: " & getCurrentExceptionMsg()) - self.partitionMngr.addPartitionInfo(partitionName, beginning, `end`) + self.partitionMngr.addPartitionInfo(partitionName, beginning, `end`) - return ok() + return ok() const DefaultDatabasePartitionCheckTimeInterval = timer.minutes(10) @@ -1338,10 +1335,7 @@ proc removePartition( let partitionName = partition.getName() debug "beginning of removePartition", partitionName - var partSize = "" - let partSizeRes = await self.getTableSize(partitionName) - if partSizeRes.isOk(): - partSize = partSizeRes.get() + let partSize = (await self.getTableSize(partitionName)).valueOr("") ## Detach and remove the partition concurrently to not block the parent table (messages) let detachPartitionQuery = diff --git a/waku/waku_archive/driver/postgres_driver/postgres_healthcheck.nim b/waku/waku_archive/driver/postgres_driver/postgres_healthcheck.nim index 43d205cf6..2138a54f7 100644 --- a/waku/waku_archive/driver/postgres_driver/postgres_healthcheck.nim +++ b/waku/waku_archive/driver/postgres_driver/postgres_healthcheck.nim @@ -24,8 +24,7 @@ proc checkConnectivity*( var numTrial = 0 while numTrial < MaxNumTrials: - let res = await connPool.pgQuery(HealthCheckQuery) - if res.isOk(): + (await connPool.pgQuery(HealthCheckQuery)).isErrOr: ## Connection resumed. Let's go back to the normal healthcheck. break errorBlock diff --git a/waku/waku_archive_legacy/driver/postgres_driver/postgres_healthcheck.nim b/waku/waku_archive_legacy/driver/postgres_driver/postgres_healthcheck.nim index 4c9f170c9..23678538e 100644 --- a/waku/waku_archive_legacy/driver/postgres_driver/postgres_healthcheck.nim +++ b/waku/waku_archive_legacy/driver/postgres_driver/postgres_healthcheck.nim @@ -24,8 +24,7 @@ proc checkConnectivity*( var numTrial = 0 while numTrial < MaxNumTrials: - let res = await connPool.pgQuery(HealthCheckQuery) - if res.isOk(): + (await connPool.pgQuery(HealthCheckQuery)).isErrOr: ## Connection resumed. Let's go back to the normal healthcheck. break errorBlock