mirror of
https://github.com/logos-messaging/logos-messaging-nim.git
synced 2026-01-02 14:03:06 +00:00
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
This commit is contained in:
parent
4b0bb29aa9
commit
4d68e2abd5
@ -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()
|
||||
|
||||
@ -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:
|
||||
@ -447,7 +432,9 @@ proc processInput(rfd: AsyncFD, rng: ref HmacDrbgContext) {.async.} =
|
||||
echo "Discovered and connecting to " & $discoveredNodes
|
||||
waitFor chat.node.connectToNodes(discoveredNodes)
|
||||
else:
|
||||
warn "Failed to init Waku DNS discovery"
|
||||
warn "Failed to find peers via DNS discovery", error = discoveredPeers.error
|
||||
else:
|
||||
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(
|
||||
block storeQueryBlock:
|
||||
let queryRes = (
|
||||
await node.query(
|
||||
StoreQueryRequest(contentTopics: @[chat.contentTopic]), storenode.get()
|
||||
)
|
||||
if queryRes.isOk():
|
||||
storeHandler(queryRes.value)
|
||||
).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)
|
||||
|
||||
|
||||
@ -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")
|
||||
|
||||
@ -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 @[]
|
||||
|
||||
@ -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()
|
||||
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:
|
||||
error "Failed to find new service peer. Exiting."
|
||||
noFailedServiceNodeSwitches += 1
|
||||
break
|
||||
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:
|
||||
@ -539,7 +527,9 @@ proc processInput(rfd: AsyncFD, rng: ref HmacDrbgContext) {.async.} =
|
||||
echo "Discovered and connecting to " & $discoveredNodes
|
||||
waitFor chat.node.connectToNodes(discoveredNodes)
|
||||
else:
|
||||
warn "Failed to init Waku DNS discovery"
|
||||
warn "Failed to find peers via DNS discovery", error = discoveredPeers.error
|
||||
else:
|
||||
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"
|
||||
|
||||
|
||||
@ -190,11 +190,12 @@ 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()
|
||||
).valueOr:
|
||||
error "Failed to find new service peer. Exiting."
|
||||
noFailedServiceNodeSwitches += 1
|
||||
break
|
||||
|
||||
info "New service peer in use",
|
||||
codec = lightpushPubsubTopic,
|
||||
@ -204,10 +205,6 @@ proc publishMessages(
|
||||
noOfServicePeerSwitches += 1
|
||||
lpt_change_service_peer_count.inc(labelValues = ["publisher"])
|
||||
continue # try again with new peer without delay
|
||||
else:
|
||||
error "Failed to find new service peer. Exiting."
|
||||
noFailedServiceNodeSwitches += 1
|
||||
break
|
||||
|
||||
await sleepAsync(messageInterval)
|
||||
|
||||
|
||||
@ -89,11 +89,12 @@ 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()
|
||||
).valueOr:
|
||||
error "Failed to find new service peer. Exiting."
|
||||
noFailedServiceNodeSwitches += 1
|
||||
break
|
||||
|
||||
info "Found new peer for codec",
|
||||
codec = filterPubsubTopic, peer = constructMultiaddrStr(actualFilterPeer)
|
||||
@ -102,10 +103,6 @@ proc maintainSubscription(
|
||||
lpt_change_service_peer_count.inc(labelValues = ["receiver"])
|
||||
isFirstPingOnNewPeer = true
|
||||
continue # try again with new peer without delay
|
||||
else:
|
||||
error "Failed to find new service peer. Exiting."
|
||||
noFailedServiceNodeSwitches += 1
|
||||
break
|
||||
else:
|
||||
if noFailedSubscribes > 0:
|
||||
noFailedSubscribes -= 1
|
||||
|
||||
@ -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,13 +372,8 @@ 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:
|
||||
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."
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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 =
|
||||
|
||||
@ -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,13 +114,8 @@ 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:
|
||||
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."
|
||||
|
||||
@ -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():
|
||||
let filterNode = parsePeerInfo(conf.remoteFilterNode.get()).valueOr:
|
||||
return err("failed to set node waku filter peer: " & error)
|
||||
try:
|
||||
node.peerManager.addServicePeer(filterNode.value, WakuFilterSubscribeCodec)
|
||||
node.peerManager.addServicePeer(filterNode, 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)
|
||||
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()
|
||||
|
||||
@ -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:
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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))
|
||||
|
||||
|
||||
@ -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.
|
||||
|
||||
@ -1233,11 +1233,8 @@ 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()
|
||||
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_", "")
|
||||
@ -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 =
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user