diff --git a/tests/factory/test_waku_conf.nim b/tests/factory/test_waku_conf.nim index dee8417e3..d8c06cc77 100644 --- a/tests/factory/test_waku_conf.nim +++ b/tests/factory/test_waku_conf.nim @@ -18,7 +18,8 @@ suite "Waku Conf - build with cluster conf": ## Setup let clusterConf = ClusterConf.TheWakuNetworkConf() var builder = WakuConfBuilder.init() - builder.withTcpPort(60000) + builder.withP2pTcpPort(60000) + builder.withMaxConnections(10) builder.discv5Conf.withUdpPort(9000) # Mount all shards in network let expectedShards = toSeq[0.uint16 .. 7.uint16] @@ -62,7 +63,8 @@ suite "Waku Conf - build with cluster conf": ## Setup let clusterConf = ClusterConf.TheWakuNetworkConf() var builder = WakuConfBuilder.init() - builder.withTcpPort(60000) + builder.withP2pTcpPort(60000) + builder.withMaxConnections(10) builder.discv5Conf.withUdpPort(9000) # Mount all shards in network let expectedShards = toSeq[0.uint16 .. 7.uint16] @@ -95,7 +97,8 @@ suite "Waku Conf - build with cluster conf": ## Setup let clusterConf = ClusterConf.TheWakuNetworkConf() var builder = WakuConfBuilder.init() - builder.withTcpPort(60000) + builder.withP2pTcpPort(60000) + builder.withMaxConnections(10) builder.discv5Conf.withUdpPort(9000) let # Mount all shards in network @@ -129,8 +132,9 @@ suite "Waku Conf - build with cluster conf": ## Setup let clusterConf = ClusterConf.TheWakuNetworkConf() var builder = WakuConfBuilder.init() - builder.withTcpPort(60000) + builder.withP2pTcpPort(60000) builder.discv5Conf.withUdpPort(9000) + builder.withMaxConnections(10) let shards = @[2.uint16, 3.uint16] ## Given @@ -159,8 +163,9 @@ suite "Waku Conf - build with cluster conf": ## Setup let clusterConf = ClusterConf.TheWakuNetworkConf() var builder = WakuConfBuilder.init() - builder.withTcpPort(60000) + builder.withP2pTcpPort(60000) builder.discv5Conf.withUdpPort(9000) + builder.withMaxConnections(10) let shards = @[2.uint16, 10.uint16] ## Given @@ -180,8 +185,9 @@ suite "Waku Conf - build with cluster conf": ## Setup let clusterConf = ClusterConf.TheWakuNetworkConf() var builder = WakuConfBuilder.init() - builder.withTcpPort(60000) + builder.withP2pTcpPort(60000) builder.discv5Conf.withUdpPort(9000) + builder.withMaxConnections(10) builder.rlnRelayConf.withEthClientAddress("https://my_eth_rpc_url/") # Mount all shards in network @@ -228,8 +234,9 @@ suite "Waku Conf - node key": var builder = WakuConfBuilder.init() builder.withClusterId(1) builder.withMaxMessageSizeBytes(1) - builder.withTcpPort(60000) + builder.withP2pTcpPort(60000) builder.discv5Conf.withUdpPort(9000) + builder.withMaxConnections(10) ## Given @@ -253,7 +260,8 @@ suite "Waku Conf - node key": var builder = WakuConfBuilder.init() builder.withClusterId(1) builder.withMaxMessageSizeBytes(1) - builder.withTcpPort(60000) + builder.withP2pTcpPort(60000) + builder.withMaxConnections(10) builder.discv5Conf.withUdpPort(9000) ## Given @@ -276,8 +284,9 @@ suite "Waku Conf - extMultiaddrs": var builder = WakuConfBuilder.init() builder.withClusterId(1) builder.withMaxMessageSizeBytes(1) - builder.withTcpPort(60000) + builder.withP2pTcpPort(60000) builder.discv5Conf.withUdpPort(9000) + builder.withMaxConnections(10) ## Given let multiaddrs = diff --git a/waku/factory/internal_config.nim b/waku/factory/internal_config.nim index ab27384d6..4372ab2b2 100644 --- a/waku/factory/internal_config.nim +++ b/waku/factory/internal_config.nim @@ -17,9 +17,9 @@ import ./waku_conf proc enrConfiguration*( - conf: WakuNodeConf, netConfig: NetConfig, key: crypto.PrivateKey + conf: WakuConf, netConfig: NetConfig ): Result[enr.Record, string] = - var enrBuilder = EnrBuilder.init(key) + var enrBuilder = EnrBuilder.init(conf.nodeKey) enrBuilder.withIpAddressAndPorts( netConfig.enrIp, netConfig.enrPort, netConfig.discv5UdpPort @@ -46,7 +46,7 @@ proc enrConfiguration*( return ok(record) proc dnsResolve*( - domain: string, conf: WakuNodeConf + domain: DomainName, conf: WakuConf ): Future[Result[string, string]] {.async.} = # Use conf's DNS servers var nameServers: seq[TransportAddress] @@ -56,7 +56,7 @@ proc dnsResolve*( let dnsResolver = DnsResolver.new(nameServers) # Resolve domain IP - let resolved = await dnsResolver.resolveIp(domain, 0.Port, Domain.AF_UNSPEC) + let resolved = await dnsResolver.resolveIp(domain.string, 0.Port, Domain.AF_UNSPEC) if resolved.len > 0: return ok(resolved[0].host) # Use only first answer @@ -69,8 +69,8 @@ proc networkConfiguration*(conf: WakuConf, clientId: string): NetConfigResult = let natRes = setupNat( conf.natStrategy.string, clientId, - Port(uint16(conf.tcpPort) + conf.portsShift), - Port(uint16(conf.tcpPort) + conf.portsShift), + Port(uint16(conf.p2pTcpPort) + conf.portsShift), + Port(uint16(conf.p2pTcpPort) + conf.portsShift), ) if natRes.isErr(): return err("failed to setup NAT: " & $natRes.error) @@ -90,7 +90,7 @@ proc networkConfiguration*(conf: WakuConf, clientId: string): NetConfigResult = ## manual config, the external port is the same as the bind port. extPort = if (extIp.isSome() or conf.dns4DomainName.isSome()) and extTcpPort.isNone(): - some(Port(uint16(conf.tcpPort) + conf.portsShift)) + some(Port(uint16(conf.p2pTcpPort) + conf.portsShift)) else: extTcpPort @@ -120,40 +120,44 @@ proc networkConfiguration*(conf: WakuConf, clientId: string): NetConfigResult = # than IpAddress, which doesn't allow default construction let netConfigRes = NetConfig.init( clusterId = conf.clusterId, - bindIp = conf.listenAddress, - bindPort = Port(uint16(conf.tcpPort) + conf.portsShift), + bindIp = conf.p2pListenAddress, + bindPort = Port(uint16(conf.p2pTcpPort) + conf.portsShift), extIp = extIp, extPort = extPort, extMultiAddrs = conf.extMultiAddrs, extMultiAddrsOnly = conf.extMultiAddrsOnly, - wsBindPort = Port(uint16(conf.websocketPort) + conf.portsShift), - wsEnabled = conf.websocketSupport, - wssEnabled = conf.websocketSecureSupport, - dns4DomainName = conf.dns4DomainName, + wsBindPort = Port(uint16(conf.webSocketConf.webSocketPort) + conf.portsShift), + wsEnabled = conf.webSocketConf.webSocketSupport, + wssEnabled = conf.webSocketConf.webSocketSecureSupport, + dns4DomainName = conf.dns4DomainName.map( + proc(dn: DomainName): string = + dn.string + ), discv5UdpPort = discv5UdpPort, wakuFlags = some(wakuFlags), ) return netConfigRes -proc applyPresetConfiguration*( - srcConf: WakuNodeConf, wakuConfBuilder: var WakuConfBuilder -): void = - var preset = srcConf.preset +# TODO: redefine in the right place +# proc applyPresetConfiguration*( +# srcConf: WakuNodeConf, wakuConfBuilder: var WakuConfBuilder +# ): void = +# var preset = srcConf.preset - if srcConf.clusterId == 1: - warn( - "TWN - The Waku Network configuration will not be applied when `--cluster-id=1` is passed in future releases. Use `--preset=twn` instead." - ) - preset = "twn" +# if srcConf.clusterId == 1: +# warn( +# "TWN - The Waku Network configuration will not be applied when `--cluster-id=1` is passed in future releases. Use `--preset=twn` instead." +# ) +# preset = "twn" - case toLowerAscii(preset) - of "twn": - let twnClusterConf = ClusterConf.TheWakuNetworkConf() +# case toLowerAscii(preset) +# of "twn": +# let twnClusterConf = ClusterConf.TheWakuNetworkConf() - wakuConfBuilder.withClusterConf(twnClusterConf) - else: - discard +# wakuConfBuilder.withClusterConf(twnClusterConf) +# else: +# discard # TODO: numShardsInNetwork should be mandatory with autosharding, and unneeded otherwise proc getNumShardsInNetwork*(conf: WakuNodeConf): uint32 = diff --git a/waku/factory/node_factory.nim b/waku/factory/node_factory.nim index 856cd4aff..ca9dba74d 100644 --- a/waku/factory/node_factory.nim +++ b/waku/factory/node_factory.nim @@ -10,6 +10,7 @@ import import ./internal_config, + ./waku_conf, ./external_config, ./builder, ./validator_signed, @@ -56,7 +57,7 @@ proc setupPeerStorage(): Result[Option[WakuPeerStorage], string] = ## Init waku node instance proc initNode( - conf: WakuNodeConf, + conf: WakuConf, netConfig: NetConfig, rng: ref HmacDrbgContext, nodeKey: crypto.PrivateKey, @@ -89,14 +90,14 @@ proc initNode( # Build waku node instance var builder = WakuNodeBuilder.init() builder.withRng(rng) - builder.withNodeKey(nodekey) + builder.withNodeKey(nodeKey) builder.withRecord(record) builder.withNetworkConfiguration(netConfig) builder.withPeerStorage(pStorage, capacity = conf.peerStoreCapacity) builder.withSwitchConfiguration( maxConnections = some(conf.maxConnections.int), - secureKey = some(conf.websocketSecureKeyPath), - secureCert = some(conf.websocketSecureCertPath), + secureKey = some(conf.webSocketSecureKeyPath), + secureCert = some(conf.webSocketSecureCertPath), nameResolver = dnsResolver, sendSignedPeerRecord = conf.relayPeerExchange, # We send our own signed peer record when peer exchange enabled @@ -480,7 +481,7 @@ proc setupNode*(wakuConf: WakuConf, relay: Relay): Result[WakuNode, string] = error "failed to create internal config", error = error return err("failed to create internal config: " & error) - let record = enrConfiguration(wakuConf, netConfig, key).valueOr: + let record = enrConfiguration(wakuConf, netConfig).valueOr: error "failed to create record", error = error return err("failed to create record: " & error) @@ -492,14 +493,14 @@ proc setupNode*(wakuConf: WakuConf, relay: Relay): Result[WakuNode, string] = ## Peer persistence var peerStore: Option[WakuPeerStorage] - if conf.peerPersistence: + if wakuConf.peerPersistence: peerStore = setupPeerStorage().valueOr: error "Setting up storage failed", error = "failed to setup peer store " & error return err("Setting up storage failed: " & error) debug "Initializing node" - let node = initNode(conf, netConfig, rng, key, record, peerStore, relay).valueOr: + let node = initNode(wakuConf, netConfig, rng, record, peerStore, relay).valueOr: error "Initializing node failed", error = error return err("Initializing node failed: " & error) diff --git a/waku/factory/waku.nim b/waku/factory/waku.nim index 8c4dcae9f..2e9de37af 100644 --- a/waku/factory/waku.nim +++ b/waku/factory/waku.nim @@ -155,9 +155,9 @@ proc new*( info "Running nwaku node", version = git_version - var relay = newCircuitRelay(confCopy.isRelayClient) + var relay = newCircuitRelay(wakuConf.isRelayClient) - let nodeRes = setupNode(confCopy, rng, relay) + let nodeRes = setupNode(wakuConf, rng, relay) if nodeRes.isErr(): error "Failed setting up node", error = nodeRes.error return err("Failed setting up node: " & nodeRes.error) diff --git a/waku/factory/waku_conf.nim b/waku/factory/waku_conf.nim index 61e6f47b9..4528ea55a 100644 --- a/waku/factory/waku_conf.nim +++ b/waku/factory/waku_conf.nim @@ -32,6 +32,14 @@ type RlnRelayConf* = ref object userMessageLimit*: uint64 ethClientAddress*: EthRpcUrl +type WebSocketSecureConf* = ref object + webSocketSecureKeyPath*: string + webSocketSecureCertPath*: string + +type WebSocketConf* = ref object + webSocketPort*: Port + webSocketSecureConf*: Option[WebSocketSecureConf] + ## `WakuConf` is a valid configuration for a Waku node ## All information needed by a waku node should be contained ## In this object. A convenient `validate` method enables doing @@ -61,10 +69,21 @@ type WakuConf* = ref object natStrategy*: NatStrategy - tcpPort*: Port + p2pTcpPort*: Port + p2pListenAddress*: IpAddress portsShift*: uint16 dns4DomainName*: Option[DomainName] extMultiAddrs*: seq[MultiAddress] + extMultiAddrsOnly*: bool + webSocketConf*: Option[WebSocketConf] + + dnsAddrs*: bool + dnsAddrsNameServers*: seq[IpAddress] + peerPersistence*: bool + # TODO: should clearly be a uint + peerStoreCapacity*: Option[int] + # TODO: should clearly be a uint + maxConnections*: int proc log*(conf: WakuConf) = info "Configuration: Enabled protocols", diff --git a/waku/factory/waku_conf_builder.nim b/waku/factory/waku_conf_builder.nim index 7d575d276..0c8168f10 100644 --- a/waku/factory/waku_conf_builder.nim +++ b/waku/factory/waku_conf_builder.nim @@ -11,6 +11,35 @@ import logScope: topics = "waku conf builder" +proc generateWithProc(builderType, argName, argType, targetType: NimNode): NimNode = + builderType.expectKind nnkIdent + argName.expectKind nnkIdent + + result = newStmtList() + + let procName = ident("with" & capitalizeAscii($argName)) + let builderIdent = ident("builder") + let builderVar = newDotExpr(builderIdent, ident($argName)) + let resVar = ident($argName) + + if argType == targetType: + result.add quote do: + proc `procName`*(`builderIdent`: var `builderType`, `resVar`: `argType`) = + `builderVar` = some(`argName`) + + else: + result.add quote do: + proc `procName`*(`builderIdent`: var `builderType`, `resVar`: `argType`) = + `builderVar` = some(`argName`.`targetType`) + +macro with( + builderType: untyped, argName: untyped, argType: untyped, targetType: untyped +) = + result = generateWithProc(builderType, argName, argType, targetType) + +macro with(builderType: untyped, argName: untyped, argType: untyped) = + result = generateWithProc(builderType, argName, argType, argType) + ############################## ## RLN Relay Config Builder ## ############################## @@ -27,33 +56,14 @@ type RlnRelayConfBuilder = ref object proc init*(T: type RlnRelayConfBuilder): RlnRelayConfBuilder = RlnRelayConfBuilder() -proc withRlnRelay*(builder: var RlnRelayConfBuilder, rlnRelay: bool) = - builder.rlnRelay = some(rlnRelay) - -proc withEthContractAddress*( - builder: var RlnRelayConfBuilder, ethContractAddress: string -) = - builder.ethContractAddress = some(ethContractAddress.ContractAddress) - -proc withChainId*(builder: var RlnRelayConfBuilder, chainId: uint) = - builder.chainId = some(chainId) - -proc withDynamic*(builder: var RlnRelayConfBuilder, dynamic: bool) = - builder.dynamic = some(dynamic) - -proc withBandwidthThreshold*( - builder: var RlnRelayConfBuilder, bandwidthThreshold: int -) = - builder.bandwidthThreshold = some(bandwidthThreshold) - -proc withEpochSizeSec*(builder: var RlnRelayConfBuilder, epochSizeSec: uint64) = - builder.epochSizeSec = some(epochSizeSec) - -proc withUserMessageLimit*(builder: var RlnRelayConfBuilder, userMessageLimit: uint64) = - builder.userMessageLimit = some(userMessageLimit) - -proc withEthClientAddress*(builder: var RlnRelayConfBuilder, ethClientAddress: string) = - builder.ethClientAddress = some(ethClientAddress.EthRpcUrl) +with(RlnRelayConfbuilder, rlnRelay, bool) +with(RlnRelayConfBuilder, chainId, uint) +with(RlnRelayConfBuilder, dynamic, bool) +with(RlnRelayConfBuilder, bandwidthThreshold, int) +with(RlnRelayConfBuilder, epochSizeSec, uint64) +with(RlnRelayConfBuilder, userMessageLimit, uint64) +with(RlnRelayConfBuilder, ethContractAddress, string, ContractAddress) +with(RlnRelayConfBuilder, ethClientAddress, string, EthRpcUrl) proc build*(builder: RlnRelayConfBuilder): Result[Option[RlnRelayConf], string] = if builder.rlnRelay.isNone or not builder.rlnRelay.get(): @@ -126,8 +136,8 @@ type Discv5ConfBuilder = ref object proc init(T: type Discv5ConfBuilder): Discv5ConfBuilder = Discv5ConfBuilder() -proc withDiscv5(builder: var Discv5ConfBuilder, discv5: bool) = - builder.discv5 = some(discv5) +with(Discv5ConfBuilder, discv5, bool) +with(Discv5ConfBuilder, udpPort, uint16, Port) proc withBootstrapNodes(builder: var Discv5ConfBuilder, bootstrapNodes: seq[string]) = # TODO: validate ENRs? @@ -138,9 +148,6 @@ proc withBootstrapNodes(builder: var Discv5ConfBuilder, bootstrapNodes: seq[stri ) ) -proc withUdpPort*(builder: var Discv5ConfBuilder, udpPort: uint16) = - builder.udpPort = some (udpPort.Port) - proc build(builder: Discv5ConfBuilder): Result[Option[Discv5Conf], string] = if builder.discv5.isNone or not builder.discv5.get(): return ok(none(Discv5Conf)) @@ -158,12 +165,73 @@ proc build(builder: Discv5ConfBuilder): Result[Option[Discv5Conf], string] = return ok(some(Discv5Conf(bootstrapNodes: bootstrapNodes, udpPort: udpPort))) +############################## +## WebSocket Config Builder ## +############################## +type WebSocketConfBuilder* = ref object + webSocketSupport: Option[bool] + webSocketPort: Option[Port] + webSocketSecureSupport: Option[bool] + webSocketSecureKeyPath: Option[string] + webSocketSecureCertPath: Option[string] + +proc init*(T: type WebSocketConfBuilder): WebSocketConfBuilder = + WebSocketConfBuilder() + +with(WebSocketConfBuilder, webSocketSupport, bool) +with(WebSocketConfBuilder, webSocketSecureSupport, bool) +with(WebSocketConfBuilder, webSocketPort, Port) +with(WebSocketConfBuilder, webSocketSecureKeyPath, string) +with(WebSocketConfBuilder, webSocketSecureCertPath, string) + +proc build(builder: WebSocketConfBuilder): Result[Option[WebSocketConf], string] = + if not builder.webSocketSupport.get(false): + return ok(none(WebSocketConf)) + + let webSocketPort = + if builder.webSocketPort.isSome: + builder.webSocketPort.get() + else: + warn "WebSocket Port is not specified, defaulting to 8000" + 8000.Port + + if not builder.webSocketSecureSupport.get(false): + return ok( + some( + WebSocketConf( + webSocketPort: websocketPort, webSocketSecureConf: none(WebSocketSecureConf) + ) + ) + ) + + let webSocketSecureKeyPath = builder.webSocketSecureKeyPath.get("") + if webSocketSecureKeyPath == "": + return err("WebSocketSecure enabled but key path is not specified") + + let webSocketSecureCertPath = builder.webSocketSecureCertPath.get("") + if webSocketSecureCertPath == "": + return err("WebSocketSecure enabled but cert path is not specified") + + return ok( + some( + WebSocketConf( + webSocketPort: webSocketPort, + webSocketSecureConf: some( + WebSocketSecureConf( + webSocketSecureKeyPath: webSocketSecureKeyPath, + webSocketSecureCertPath: webSocketSecureCertPath, + ) + ), + ) + ) + ) + ## `WakuConfBuilder` is a convenient tool to accumulate ## Config parameters to build a `WakuConfig`. ## It provides some type conversion, as well as applying ## defaults in an agnostic manner (for any usage of Waku node) type WakuConfBuilder* = ref object - nodeKey*: Option[PrivateKey] + nodeKey: Option[PrivateKey] clusterId: Option[uint16] numShardsInNetwork: Option[uint32] @@ -189,48 +257,42 @@ type WakuConfBuilder* = ref object natStrategy: Option[NatStrategy] - tcpPort: Option[Port] + p2pTcpPort: Option[Port] + p2pListenAddress: Option[IpAddress] portsShift: Option[uint16] dns4DomainName: Option[DomainName] extMultiAddrs: seq[string] + extMultiAddrsOnly: Option[bool] + + webSocketConf*: WebSocketConfBuilder + + dnsAddrs*: Option[bool] + dnsAddrsNameServers: Option[seq[IpAddress]] + peerPersistence: Option[bool] + peerStoreCapacity: Option[int] + maxConnections: Option[int] proc init*(T: type WakuConfBuilder): WakuConfBuilder = WakuConfBuilder( - rlnRelayConf: RlnRelayConfBuilder.init(), discv5Conf: Discv5ConfBuilder.init() + rlnRelayConf: RlnRelayConfBuilder.init(), + discv5Conf: Discv5ConfBuilder.init(), + webSocketConf: WebSocketConfBuilder.init(), ) -macro confWith(argName: untyped, argType: untyped) = - argName.expectKind nnkIdent - argType.expectKind nnkIdent - - result = newStmtList() - - let procName = ident("with" & capitalizeAscii($argName)) - let builderIdent = ident("builder") - let builderVar = newDotExpr(builderIdent, ident($argName)) - let resVar = ident($argName) - - result.add quote do: - proc `procName`*(`builderIdent`: var WakuConfBuilder, `resVar`: `argType`) = - `builderVar` = some(`argName`) - -confWith(clusterConf, ClusterConf) -confWith(nodeKey, PrivateKey) -confWith(clusterId, uint16) -confWith(shards, seq[uint16]) -confWith(relay, bool) -confWith(filter, bool) -confWith(storeSync, bool) -confWith(maxMessageSizeBytes, int) - -proc withDiscv5*(builder: var WakuConfBuilder, discv5: bool) = - builder.discv5Conf.withDiscv5(discv5) - -proc withTcpPort*(builder: var WakuConfBuilder, tcpPort: uint16) = - builder.tcpPort = some(tcpPort.Port) - -proc withDns4DomainName*(builder: var WakuConfBuilder, dns4DomainName: string) = - builder.dns4DomainName = some(dns4DomainName.DomainName) +with(WakuConfBuilder, clusterConf, ClusterConf) +with(WakuConfBuilder, nodeKey, PrivateKey) +with(WakuConfBuilder, clusterId, uint16) +with(WakuConfBuilder, relay, bool) +with(WakuConfBuilder, filter, bool) +with(WakuConfBuilder, storeSync, bool) +with(WakuConfBuilder, maxMessageSizeBytes, int) +with(WakuConfBuilder, dnsAddrs, bool) +with(WakuConfbuilder, peerPersistence, bool) +with(WakuConfbuilder, maxConnections, int) +with(WakuConfbuilder, shards, seq[uint16]) +with(WakuConfbuilder, dnsAddrsNameServers, seq[IpAddress]) +with(WakuConfbuilder, p2pTcpPort, uint16, Port) +with(WakuConfbuilder, dns4DomainName, string, DomainName) proc withExtMultiAddr*(builder: var WakuConfBuilder, extMultiAddr: string) = builder.extMultiAddrs.add(extMultiAddr) @@ -386,7 +448,7 @@ proc build*( if builder.clusterId.isSome: builder.clusterId.get() else: - return err("Cluster Id is missing") + return err("Cluster Id was not specified") let numShardsInNetwork = if builder.numShardsInNetwork.isSome: @@ -410,11 +472,14 @@ proc build*( let rlnRelayConf = builder.rlnRelayConf.build().valueOr: return err("RLN Relay Conf building failed: " & $error) + let webSocketConf = builder.webSocketConf.build().valueOr: + return err("WebSocket Conf building failed: " & $error) + let maxMessageSizeBytes = if builder.maxMessageSizeBytes.isSome: builder.maxMessageSizeBytes.get() else: - return err("Max Message Size is missing") + return err("Max Message Size was not specified") let logLevel = if builder.logLevel.isSome: @@ -437,11 +502,19 @@ proc build*( warn "Nat Strategy is not specified, defaulting to none" "none".NatStrategy - let tcpPort = - if builder.tcpPort.isSome: - builder.tcpPort.get() + let p2pTcpPort = + if builder.p2pTcpPort.isSome: + builder.p2pTcpPort.get() else: - return err("TCP Port is missing") + warn "P2P Listening TCP Port is not specified, listening on 60000" + 6000.Port + + let p2pListenAddress = + if builder.p2pListenAddress.isSome: + builder.p2pListenAddress.get() + else: + warn "P2P listening address not specified, listening on 0.0.0.0" + (static parseIpAddress("0.0.0.0")) let portsShift = if builder.portsShift.isSome: @@ -466,6 +539,40 @@ proc build*( return err("Invalid multiaddress provided: " & s) extMultiAddrs.add(m) + let extMultiAddrsOnly = + if builder.extMultiAddrsOnly.isSome: + builder.extMultiAddrsOnly.get() + else: + warn "Whether to only announce external multiaddresses is not specified, defaulting to false" + false + + let dnsAddrs = + if builder.dnsAddrs.isSome: + builder.dnsAddrs.get() + else: + warn "Whether to resolve DNS multiaddresses was not specified, defaulting to false." + false + + let dnsAddrsNameServers = + if builder.dnsAddrsNameServers.isSome: + builder.dnsAddrsNameServers.get() + else: + warn "DNS name servers IPs not provided, defaulting to Cloudflare's." + @[parseIpAddress("1.1.1.1"), parseIpAddress("1.0.0.1")] + + let peerPersistence = + if builder.peerPersistence.isSome: + builder.peerPersistence.get() + else: + warn "Peer persistence not specified, defaulting to false" + false + + let maxConnections = + if builder.maxConnections.isSome: + builder.maxConnections.get() + else: + return err "Max Connections was not specified" + return ok( WakuConf( nodeKey: nodeKey, @@ -483,9 +590,17 @@ proc build*( logLevel: logLevel, logFormat: logFormat, natStrategy: natStrategy, - tcpPort: tcpPort, + p2pTcpPort: p2pTcpPort, + p2pListenAddress: p2pListenAddress, portsShift: portsShift, dns4DomainName: dns4DomainName, extMultiAddrs: extMultiAddrs, + extMultiAddrsOnly: extMultiAddrsOnly, + webSocketConf: webSocketConf, + dnsAddrs: dnsAddrs, + dnsAddrsNameServers: dnsAddrsNameServers, + peerPersistence: peerPersistence, + peerStoreCapacity: builder.peerStoreCapacity, + maxConnections: maxConnections, ) )