2929 peerid, # Implement how peers interact
3030 protobuf/ minprotobuf, # message serialisation/deserialisation from and to protobufs
3131 nameresolving/ dnsresolver,
32+ protocols/ mix/ curve25519,
3233 ] # define DNS resolution
33- import mix/ curve25519
3434import
3535 waku/ [
3636 waku_core,
@@ -175,18 +175,16 @@ proc startMetricsServer(
175175): Result [MetricsHttpServerRef , string ] =
176176 info " Starting metrics HTTP server" , serverIp = $ serverIp, serverPort = $ serverPort
177177
178- let metricsServerRes = MetricsHttpServerRef .new ($ serverIp, serverPort)
179- if metricsServerRes.isErr ():
180- return err (" metrics HTTP server start failed: " & $ metricsServerRes.error)
178+ let server = MetricsHttpServerRef .new ($ serverIp, serverPort).valueOr:
179+ return err (" metrics HTTP server start failed: " & $ error)
181180
182- let server = metricsServerRes.value
183181 try :
184182 waitFor server.start ()
185183 except CatchableError :
186184 return err (" metrics HTTP server start failed: " & getCurrentExceptionMsg ())
187185
188186 info " Metrics HTTP server started" , serverIp = $ serverIp, serverPort = $ serverPort
189- ok (metricsServerRes.value )
187+ ok (server )
190188
191189proc publish (c: Chat , line: string ) {.async .} =
192190 # First create a Chat2Message protobuf with this line of text
@@ -333,57 +331,56 @@ proc maintainSubscription(
333331 const maxFailedServiceNodeSwitches = 10
334332 var noFailedSubscribes = 0
335333 var noFailedServiceNodeSwitches = 0
334+ const RetryWaitMs = 2 .seconds # Quick retry interval
335+ const SubscriptionMaintenanceMs = 30 .seconds # Subscription maintenance interval
336336 while true :
337337 info " maintaining subscription at" , peer = constructMultiaddrStr (actualFilterPeer)
338338 # First use filter-ping to check if we have an active subscription
339- let pingRes = await wakuNode.wakuFilterClient.ping (actualFilterPeer)
340- if pingRes.isErr ():
341- # No subscription found. Let's subscribe.
342- error " ping failed." , err = pingRes.error
343- trace " no subscription found. Sending subscribe request"
339+ let pingErr = (await wakuNode.wakuFilterClient.ping (actualFilterPeer)).errorOr:
340+ await sleepAsync (SubscriptionMaintenanceMs )
341+ info " subscription is live."
342+ continue
344343
345- let subscribeRes = await wakuNode.filterSubscribe (
344+ # No subscription found. Let's subscribe.
345+ error " ping failed." , error = pingErr
346+ trace " no subscription found. Sending subscribe request"
347+
348+ let subscribeErr = (
349+ await wakuNode.filterSubscribe (
346350 some (filterPubsubTopic), filterContentTopic, actualFilterPeer
347351 )
352+ ).errorOr:
353+ await sleepAsync (SubscriptionMaintenanceMs )
354+ if noFailedSubscribes > 0 :
355+ noFailedSubscribes -= 1
356+ notice " subscribe request successful."
357+ continue
348358
349- if subscribeRes.isErr ():
350- noFailedSubscribes += 1
351- error " Subscribe request failed." ,
352- err = subscribeRes.error,
353- peer = actualFilterPeer,
354- failCount = noFailedSubscribes
355-
356- # TODO : disconnet from failed actualFilterPeer
357- # asyncSpawn(wakuNode.peerManager.switch.disconnect(p))
358- # wakunode.peerManager.peerStore.delete(actualFilterPeer)
359-
360- if noFailedSubscribes < maxFailedSubscribes:
361- await sleepAsync (2000 ) # Wait a bit before retrying
362- continue
363- elif not preventPeerSwitch:
364- let peerOpt = selectRandomServicePeer (
365- wakuNode.peerManager, some (actualFilterPeer), WakuFilterSubscribeCodec
366- )
367- peerOpt.isOkOr:
368- error " Failed to find new service peer. Exiting."
369- noFailedServiceNodeSwitches += 1
370- break
371-
372- actualFilterPeer = peerOpt.get ()
373- info " Found new peer for codec" ,
374- codec = filterPubsubTopic, peer = constructMultiaddrStr (actualFilterPeer)
375-
376- noFailedSubscribes = 0
377- continue # try again with new peer without delay
378- else :
379- if noFailedSubscribes > 0 :
380- noFailedSubscribes -= 1
381-
382- notice " subscribe request successful."
359+ noFailedSubscribes += 1
360+ error " Subscribe request failed." ,
361+ error = subscribeErr, peer = actualFilterPeer, failCount = noFailedSubscribes
362+
363+ # TODO : disconnet from failed actualFilterPeer
364+ # asyncSpawn(wakuNode.peerManager.switch.disconnect(p))
365+ # wakunode.peerManager.peerStore.delete(actualFilterPeer)
366+
367+ if noFailedSubscribes < maxFailedSubscribes:
368+ await sleepAsync (RetryWaitMs ) # Wait a bit before retrying
369+ elif not preventPeerSwitch:
370+ # try again with new peer without delay
371+ let actualFilterPeer = selectRandomServicePeer (
372+ wakuNode.peerManager, some (actualFilterPeer), WakuFilterSubscribeCodec
373+ ).valueOr:
374+ error " Failed to find new service peer. Exiting."
375+ noFailedServiceNodeSwitches += 1
376+ break
377+
378+ info " Found new peer for codec" ,
379+ codec = filterPubsubTopic, peer = constructMultiaddrStr (actualFilterPeer)
380+
381+ noFailedSubscribes = 0
383382 else :
384- info " subscription is live."
385-
386- await sleepAsync (30000 ) # Subscription maintenance interval
383+ await sleepAsync (SubscriptionMaintenanceMs )
387384
388385{.pop .}
389386 # @TODO confutils.nim(775, 17) Error: can raise an unlisted exception: ref IOError
@@ -401,17 +398,13 @@ proc processInput(rfd: AsyncFD, rng: ref HmacDrbgContext) {.async.} =
401398 if conf.logLevel != LogLevel .NONE :
402399 setLogLevel (conf.logLevel)
403400
404- let natRes = setupNat (
401+ let (extIp, extTcpPort, extUdpPort) = setupNat (
405402 conf.nat,
406403 clientId,
407404 Port (uint16 (conf.tcpPort) + conf.portsShift),
408405 Port (uint16 (conf.udpPort) + conf.portsShift),
409- )
410-
411- if natRes.isErr ():
412- raise newException (ValueError , " setupNat error " & natRes.error)
413-
414- let (extIp, extTcpPort, extUdpPort) = natRes.get ()
406+ ).valueOr:
407+ raise newException (ValueError , " setupNat error " & error)
415408
416409 var enrBuilder = EnrBuilder .init (nodeKey)
417410
@@ -421,13 +414,9 @@ proc processInput(rfd: AsyncFD, rng: ref HmacDrbgContext) {.async.} =
421414 error " failed to add sharded topics to ENR" , error = error
422415 quit (QuitFailure )
423416
424- let recordRes = enrBuilder.build ()
425- let record =
426- if recordRes.isErr ():
427- error " failed to create enr record" , error = recordRes.error
428- quit (QuitFailure )
429- else :
430- recordRes.get ()
417+ let record = enrBuilder.build ().valueOr:
418+ error " failed to create enr record" , error = error
419+ quit (QuitFailure )
431420
432421 let node = block :
433422 var builder = WakuNodeBuilder .init ()
0 commit comments