diff --git a/apps/wakunode2/wakunode2.nim b/apps/wakunode2/wakunode2.nim index 5e6cbb700..f357638ae 100644 --- a/apps/wakunode2/wakunode2.nim +++ b/apps/wakunode2/wakunode2.nim @@ -56,7 +56,7 @@ when isMainModule: error "Waku configuration failed", error = error quit(QuitFailure) - var waku = Waku.new(conf).valueOr: + var waku = (waitfor Waku.new(conf)).valueOr: error "Waku initialization failed", error = error quit(QuitFailure) diff --git a/examples/filter_subscriber.nim b/examples/filter_subscriber.nim index 5554966d4..af40d21c3 100644 --- a/examples/filter_subscriber.nim +++ b/examples/filter_subscriber.nim @@ -77,7 +77,7 @@ proc setupAndSubscribe(rng: ref HmacDrbgContext) {.async.} = let node = builder.build().tryGet() node.mountMetadata(clusterId).expect("failed to mount waku metadata protocol") - waitFor node.mountFilterClient() + await node.mountFilterClient() await node.start() diff --git a/examples/wakustealthcommitments/node_spec.nim b/examples/wakustealthcommitments/node_spec.nim index c3468ccde..b96ecbbeb 100644 --- a/examples/wakustealthcommitments/node_spec.nim +++ b/examples/wakustealthcommitments/node_spec.nim @@ -46,7 +46,7 @@ proc setup*(): Waku = conf.rlnRelay = twnNetworkConf.rlnRelay debug "Starting node" - var waku = Waku.new(conf).valueOr: + var waku = (waitfor Waku.new(conf)).valueOr: error "Waku initialization failed", error = error quit(QuitFailure) diff --git a/library/waku_thread_requests/requests/node_lifecycle_request.nim b/library/waku_thread_requests/requests/node_lifecycle_request.nim index 21765838e..234736ab8 100644 --- a/library/waku_thread_requests/requests/node_lifecycle_request.nim +++ b/library/waku_thread_requests/requests/node_lifecycle_request.nim @@ -79,7 +79,7 @@ proc createWaku( wakuConf.restServerConf = none(RestServerConf) ## don't want REST in libwaku - let wakuRes = Waku.new(wakuConf, appCallbacks).valueOr: + let wakuRes = (await Waku.new(wakuConf, appCallbacks)).valueOr: error "waku initialization failed", error = error return err("Failed setting up Waku: " & $error) @@ -91,11 +91,16 @@ proc process*( defer: destroyShared(self) + # return execution to the async loop before proceeding + await sleepAsync(0.milliseconds) + case self.operation of CREATE_NODE: + echo "------------ calling createWaku" waku[] = (await createWaku(self.configJson, self.appCallbacks)).valueOr: error "CREATE_NODE failed", error = error return err($error) + echo "------------ after createWaku" of START_NODE: (await waku.startWaku()).isOkOr: error "START_NODE failed", error = error diff --git a/waku/factory/internal_config.nim b/waku/factory/internal_config.nim index 9fc3602a0..60b319e0d 100644 --- a/waku/factory/internal_config.nim +++ b/waku/factory/internal_config.nim @@ -65,7 +65,7 @@ proc networkConfiguration*( dnsAddrsNameServers: seq[IpAddress], portsShift: uint16, clientId: string, -): NetConfigResult = +): Future[NetConfigResult] {.async.} = ## `udpPort` is only supplied to satisfy underlying APIs but is not ## actually a supported transport for libp2p traffic. let natRes = setupNat( @@ -99,7 +99,7 @@ proc networkConfiguration*( # Resolve and use DNS domain IP if conf.dns4DomainName.isSome() and extIp.isNone(): try: - let dnsRes = waitFor dnsResolve(conf.dns4DomainName.get(), dnsAddrsNameServers) + let dnsRes = await dnsResolve(conf.dns4DomainName.get(), dnsAddrsNameServers) if dnsRes.isErr(): return err($dnsRes.error) # Pass error down the stack diff --git a/waku/factory/node_factory.nim b/waku/factory/node_factory.nim index 5e038ee0d..d62cae428 100644 --- a/waku/factory/node_factory.nim +++ b/waku/factory/node_factory.nim @@ -166,7 +166,7 @@ proc setupProtocols( if conf.storeServiceConf.isSome(): let storeServiceConf = conf.storeServiceConf.get() if storeServiceConf.supportV2: - let archiveDriverRes = waitFor legacy_driver.ArchiveDriver.new( + let archiveDriverRes = await legacy_driver.ArchiveDriver.new( storeServiceConf.dbUrl, storeServiceConf.dbVacuum, storeServiceConf.dbMigration, storeServiceConf.maxNumDbConnections, onFatalErrorAction, ) @@ -200,7 +200,7 @@ proc setupProtocols( else: storeServiceConf.dbMigration - let archiveDriverRes = waitFor driver.ArchiveDriver.new( + let archiveDriverRes = await driver.ArchiveDriver.new( storeServiceConf.dbUrl, storeServiceConf.dbVacuum, migrate, storeServiceConf.maxNumDbConnections, onFatalErrorAction, ) @@ -354,7 +354,7 @@ proc setupProtocols( ) try: - waitFor node.mountRlnRelay(rlnConf) + await node.mountRlnRelay(rlnConf) except CatchableError: return err("failed to mount waku RLN relay protocol: " & getCurrentExceptionMsg()) @@ -476,11 +476,13 @@ proc startNode*( proc setupNode*( wakuConf: WakuConf, rng: ref HmacDrbgContext = crypto.newRng(), relay: Relay -): Result[WakuNode, string] = - let netConfig = networkConfiguration( - wakuConf.clusterId, wakuConf.endpointConf, wakuConf.discv5Conf, - wakuConf.webSocketConf, wakuConf.wakuFlags, wakuConf.dnsAddrsNameServers, - wakuConf.portsShift, clientId, +): Future[Result[WakuNode, string]] {.async.} = + let netConfig = ( + await networkConfiguration( + wakuConf.clusterId, wakuConf.endpointConf, wakuConf.discv5Conf, + wakuConf.webSocketConf, wakuConf.wakuFlags, wakuConf.dnsAddrsNameServers, + wakuConf.portsShift, clientId, + ) ).valueOr: error "failed to create internal config", error = error return err("failed to create internal config: " & error) @@ -511,7 +513,7 @@ proc setupNode*( debug "Mounting protocols" try: - (waitFor node.setupProtocols(wakuConf)).isOkOr: + (await node.setupProtocols(wakuConf)).isOkOr: error "Mounting protocols failed", error = error return err("Mounting protocols failed: " & error) except CatchableError: diff --git a/waku/factory/waku.nim b/waku/factory/waku.nim index 137e3531c..27c9437ff 100644 --- a/waku/factory/waku.nim +++ b/waku/factory/waku.nim @@ -162,7 +162,7 @@ proc setupAppCallbacks( proc new*( T: type Waku, wakuConf: WakuConf, appCallbacks: AppCallbacks = nil -): Result[Waku, string] = +): Future[Result[Waku, string]] {.async.} = let rng = crypto.newRng() logging.setupLog(wakuConf.logLevel, wakuConf.logFormat) @@ -186,7 +186,7 @@ proc new*( var relay = newCircuitRelay(wakuConf.circuitRelayClient) - let node = setupNode(wakuConf, rng, relay).valueOr: + let node = (await setupNode(wakuConf, rng, relay)).valueOr: error "Failed setting up node", error = $error return err("Failed setting up node: " & $error) @@ -248,7 +248,7 @@ proc getPorts( return ok((tcpPort: tcpPort, websocketPort: websocketPort)) -proc getRunningNetConfig(waku: ptr Waku): Result[NetConfig, string] = +proc getRunningNetConfig(waku: ptr Waku): Future[Result[NetConfig, string]] {.async.} = var conf = waku[].conf let (tcpPort, websocketPort) = getPorts(waku[].node.switch.peerInfo.listenAddrs).valueOr: return err("Could not retrieve ports: " & error) @@ -260,16 +260,18 @@ proc getRunningNetConfig(waku: ptr Waku): Result[NetConfig, string] = conf.webSocketConf.get().port = websocketPort.get() # Rebuild NetConfig with bound port values - let netConf = networkConfiguration( - conf.clusterId, conf.endpointConf, conf.discv5Conf, conf.webSocketConf, - conf.wakuFlags, conf.dnsAddrsNameServers, conf.portsShift, clientId, + let netConf = ( + await networkConfiguration( + conf.clusterId, conf.endpointConf, conf.discv5Conf, conf.webSocketConf, + conf.wakuFlags, conf.dnsAddrsNameServers, conf.portsShift, clientId, + ) ).valueOr: return err("Could not update NetConfig: " & error) return ok(netConf) -proc updateEnr(waku: ptr Waku): Result[void, string] = - let netConf: NetConfig = getRunningNetConfig(waku).valueOr: +proc updateEnr(waku: ptr Waku): Future[Result[void, string]] {.async.} = + let netConf: NetConfig = (await getRunningNetConfig(waku)).valueOr: return err("error calling updateNetConfig: " & $error) let record = enrConfiguration(waku[].conf, netConf).valueOr: return err("ENR setup failed: " & error) @@ -309,11 +311,11 @@ proc updateAddressInENR(waku: ptr Waku): Result[void, string] = return ok() -proc updateWaku(waku: ptr Waku): Result[void, string] = +proc updateWaku(waku: ptr Waku): Future[Result[void, string]] {.async.} = let conf = waku[].conf if conf.endpointConf.p2pTcpPort == Port(0) or (conf.websocketConf.isSome() and conf.websocketConf.get.port == Port(0)): - updateEnr(waku).isOkOr: + (await updateEnr(waku)).isOkOr: return err("error calling updateEnr: " & $error) ?updateAnnouncedAddrWithPrimaryIpAddr(waku[].node) @@ -381,7 +383,7 @@ proc startWaku*(waku: ptr Waku): Future[Result[void, string]] {.async.} = return err("error while calling startNode: " & $error) ## Update waku data that is set dynamically on node start - updateWaku(waku).isOkOr: + (await updateWaku(waku)).isOkOr: return err("Error in updateApp: " & $error) ## Discv5 @@ -424,8 +426,12 @@ proc startWaku*(waku: ptr Waku): Future[Result[void, string]] {.async.} = return err ("Starting protocols support REST server failed: " & $error) if conf.metricsServerConf.isSome(): - waku[].metricsServer = waku_metrics.startMetricsServerAndLogging( - conf.metricsServerConf.get(), conf.portsShift + waku[].metricsServer = ( + await ( + waku_metrics.startMetricsServerAndLogging( + conf.metricsServerConf.get(), conf.portsShift + ) + ) ).valueOr: return err("Starting monitoring and external interfaces failed: " & error) diff --git a/waku/node/waku_metrics.nim b/waku/node/waku_metrics.nim index ba61f6ef8..8d38624c1 100644 --- a/waku/node/waku_metrics.nim +++ b/waku/node/waku_metrics.nim @@ -59,14 +59,14 @@ proc startMetricsLog*() = proc startMetricsServer( serverIp: IpAddress, serverPort: Port -): Result[MetricsHttpServerRef, string] = +): Future[Result[MetricsHttpServerRef, string]] {.async.} = info "Starting metrics HTTP server", serverIp = $serverIp, serverPort = $serverPort let server = MetricsHttpServerRef.new($serverIp, serverPort).valueOr: return err("metrics HTTP server start failed: " & $error) try: - waitFor server.start() + await server.start() except CatchableError: return err("metrics HTTP server start failed: " & getCurrentExceptionMsg()) @@ -75,10 +75,12 @@ proc startMetricsServer( proc startMetricsServerAndLogging*( conf: MetricsServerConf, portsShift: uint16 -): Result[MetricsHttpServerRef, string] = +): Future[Result[MetricsHttpServerRef, string]] {.async.} = var metricsServer: MetricsHttpServerRef - metricsServer = startMetricsServer( - conf.httpAddress, Port(conf.httpPort.uint16 + portsShift) + metricsServer = ( + await ( + startMetricsServer(conf.httpAddress, Port(conf.httpPort.uint16 + portsShift)) + ) ).valueOr: return err("Starting metrics server failed. Continuing in current state:" & $error) diff --git a/waku/node/waku_node.nim b/waku/node/waku_node.nim index ccd62664f..70e95bab1 100644 --- a/waku/node/waku_node.nim +++ b/waku/node/waku_node.nim @@ -1235,7 +1235,7 @@ proc mountRlnRelay*( CatchableError, "WakuRelay protocol is not mounted, cannot mount WakuRlnRelay" ) - let rlnRelayRes = waitFor WakuRlnRelay.new(rlnConf, registrationHandler) + let rlnRelayRes = await WakuRlnRelay.new(rlnConf, registrationHandler) if rlnRelayRes.isErr(): raise newException(CatchableError, "failed to mount WakuRlnRelay: " & rlnRelayRes.error)