mirror of
https://github.com/logos-messaging/logos-messaging-nim.git
synced 2026-01-11 02:13:11 +00:00
More parameters, more macros
This commit is contained in:
parent
23abf3466b
commit
298e0a0fe3
@ -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 =
|
||||
|
||||
@ -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 =
|
||||
|
||||
@ -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)
|
||||
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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",
|
||||
|
||||
@ -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,
|
||||
)
|
||||
)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user