Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor(c-bindings): node initialization #2547

Merged
merged 1 commit into from
Mar 26, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
115 changes: 33 additions & 82 deletions library/waku_thread/config.nim
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,16 @@ import
stew/shims/net,
../../waku/waku_enr/capabilities,
../../waku/common/utils/nat,
../../waku/factory/external_config,
../../waku/node/waku_node,
../../waku/node/config,
../events/json_base_event

proc parsePrivateKey(
jsonNode: JsonNode, privateKey: var PrivateKey, errorResp: var string
jsonNode: JsonNode, conf: var WakuNodeConf, errorResp: var string
): bool =
if not jsonNode.contains("key") or jsonNode["key"].kind == JsonNodeKind.JNull:
privateKey = PrivateKey.random(Secp256k1, newRng()[]).tryGet()
conf.nodekey = some(PrivateKey.random(Secp256k1, newRng()[]).tryGet())
return true

if jsonNode["key"].kind != JsonNodeKind.JString:
Expand All @@ -24,7 +25,7 @@ proc parsePrivateKey(

try:
let skPrivKey = SkPrivateKey.init(crypto.fromHex(key)).tryGet()
privateKey = crypto.PrivateKey(scheme: Secp256k1, skkey: skPrivKey)
conf.nodekey = some(crypto.PrivateKey(scheme: Secp256k1, skkey: skPrivKey))
except CatchableError:
let msg = "Invalid node key: " & getCurrentExceptionMsg()
errorResp = msg
Expand All @@ -33,11 +34,12 @@ proc parsePrivateKey(
return true

proc parseListenAddr(
jsonNode: JsonNode, listenAddr: var IpAddress, errorResp: var string
jsonNode: JsonNode, conf: var WakuNodeConf, errorResp: var string
): bool =
var listenAddr: IpAddress
if not jsonNode.contains("host"):
errorResp = "host attribute is required"
return false
conf.listenAddress = defaultListenAddress()
return true

if jsonNode["host"].kind != JsonNodeKind.JString:
errorResp = "The node host should be a string."
Expand All @@ -54,20 +56,20 @@ proc parseListenAddr(

return true

proc parsePort(jsonNode: JsonNode, port: var int, errorResp: var string): bool =
proc parsePort(jsonNode: JsonNode, conf: var WakuNodeConf, errorResp: var string): bool =
if not jsonNode.contains("port"):
errorResp = "port attribute is required"
return false
conf.tcpPort = Port(60000)
return true

if jsonNode["port"].kind != JsonNodeKind.JInt:
errorResp = "The node port should be an integer."
return false

port = jsonNode["port"].getInt()
conf.tcpPort = Port(jsonNode["port"].getInt())

return true

proc parseRelay(jsonNode: JsonNode, relay: var bool, errorResp: var string): bool =
proc parseRelay(jsonNode: JsonNode, conf: var WakuNodeConf, errorResp: var string): bool =
if not jsonNode.contains("relay"):
errorResp = "relay attribute is required"
return false
Expand All @@ -76,96 +78,80 @@ proc parseRelay(jsonNode: JsonNode, relay: var bool, errorResp: var string): boo
errorResp = "The relay config param should be a boolean"
return false

relay = jsonNode["relay"].getBool()
conf.relay = jsonNode["relay"].getBool()

return true

proc parseStore(
jsonNode: JsonNode,
store: var bool,
storeNode: var string,
storeRetentionPolicy: var string,
storeDbUrl: var string,
storeVacuum: var bool,
storeDbMigration: var bool,
storeMaxNumDbConnections: var int,
conf: var WakuNodeConf,
errorResp: var string,
): bool =
if not jsonNode.contains("store"):
## the store parameter is not required. By default is is disabled
store = false
conf.store = false
return true

if jsonNode["store"].kind != JsonNodeKind.JBool:
errorResp = "The store config param should be a boolean"
return false

store = jsonNode["store"].getBool()
conf.store = jsonNode["store"].getBool()

if jsonNode.contains("storeNode"):
if jsonNode["storeNode"].kind != JsonNodeKind.JString:
errorResp = "The storeNode config param should be a string"
return false

storeNode = jsonNode["storeNode"].getStr()
conf.storeNode = jsonNode["storeNode"].getStr()

if jsonNode.contains("storeRetentionPolicy"):
if jsonNode["storeRetentionPolicy"].kind != JsonNodeKind.JString:
errorResp = "The storeRetentionPolicy config param should be a string"
return false

storeRetentionPolicy = jsonNode["storeRetentionPolicy"].getStr()
conf.storeMessageRetentionPolicy = jsonNode["storeRetentionPolicy"].getStr()

if jsonNode.contains("storeDbUrl"):
if jsonNode["storeDbUrl"].kind != JsonNodeKind.JString:
errorResp = "The storeDbUrl config param should be a string"
return false

storeDbUrl = jsonNode["storeDbUrl"].getStr()
conf.storeMessageDbUrl = jsonNode["storeDbUrl"].getStr()

if jsonNode.contains("storeVacuum"):
if jsonNode["storeVacuum"].kind != JsonNodeKind.JBool:
errorResp = "The storeVacuum config param should be a bool"
return false

storeVacuum = jsonNode["storeVacuum"].getBool()
conf.storeMessageDbVacuum = jsonNode["storeVacuum"].getBool()

if jsonNode.contains("storeDbMigration"):
if jsonNode["storeDbMigration"].kind != JsonNodeKind.JBool:
errorResp = "The storeDbMigration config param should be a bool"
return false

storeDbMigration = jsonNode["storeDbMigration"].getBool()
conf.storeMessageDbMigration = jsonNode["storeDbMigration"].getBool()

if jsonNode.contains("storeMaxNumDbConnections"):
if jsonNode["storeMaxNumDbConnections"].kind != JsonNodeKind.JInt:
errorResp = "The storeMaxNumDbConnections config param should be an int"
return false

storeMaxNumDbConnections = jsonNode["storeMaxNumDbConnections"].getInt()
conf.storeMaxNumDbConnections = jsonNode["storeMaxNumDbConnections"].getInt()

return true

proc parseTopics(jsonNode: JsonNode, topics: var seq[string]) =
proc parseTopics(jsonNode: JsonNode, conf: var WakuNodeConf) =
if jsonNode.contains("topics"):
for topic in jsonNode["topics"].items:
topics.add(topic.getStr())
conf.topics.add(topic.getStr())
else:
topics = @["/waku/2/default-waku/proto"]
conf.topics = @["/waku/2/default-waku/proto"]

proc parseConfig*(
configNodeJson: string,
privateKey: var PrivateKey,
netConfig: var NetConfig,
relay: var bool,
topics: var seq[string],
store: var bool,
storeNode: var string,
storeRetentionPolicy: var string,
storeDbUrl: var string,
storeVacuum: var bool,
storeDbMigration: var bool,
storeMaxNumDbConnections: var int,
conf: var WakuNodeConf,
errorResp: var string,
): bool {.raises: [].} =
if configNodeJson.len == 0:
Expand All @@ -181,7 +167,7 @@ proc parseConfig*(

# key
try:
if not parsePrivateKey(jsonNode, privateKey, errorResp):
if not parsePrivateKey(jsonNode, conf, errorResp):
return false
except Exception, KeyError:
errorResp = "Exception calling parsePrivateKey: " & getCurrentExceptionMsg()
Expand All @@ -191,76 +177,41 @@ proc parseConfig*(
var listenAddr: IpAddress
try:
listenAddr = parseIpAddress("127.0.0.1")
if not parseListenAddr(jsonNode, listenAddr, errorResp):
if not parseListenAddr(jsonNode, conf, errorResp):
return false
except Exception, ValueError:
errorResp = "Exception calling parseIpAddress: " & getCurrentExceptionMsg()
return false

# port
var port = 0
try:
if not parsePort(jsonNode, port, errorResp):
if not parsePort(jsonNode, conf, errorResp):
return false
except Exception, ValueError:
errorResp = "Exception calling parsePort: " & getCurrentExceptionMsg()
return false

let natRes = setupNat("any", clientId, Port(uint16(port)), Port(uint16(port)))
if natRes.isErr():
errorResp = "failed to setup NAT: " & $natRes.error
return false

let (extIp, extTcpPort, _) = natRes.get()

let extPort =
if extIp.isSome() and extTcpPort.isNone():
some(Port(uint16(port)))
else:
extTcpPort

richard-ramos marked this conversation as resolved.
Show resolved Hide resolved
# relay
try:
if not parseRelay(jsonNode, relay, errorResp):
if not parseRelay(jsonNode, conf, errorResp):
return false
except Exception, KeyError:
errorResp = "Exception calling parseRelay: " & getCurrentExceptionMsg()
return false

# topics
try:
parseTopics(jsonNode, topics)
parseTopics(jsonNode, conf)
except Exception, KeyError:
errorResp = "Exception calling parseTopics: " & getCurrentExceptionMsg()
return false

# store
try:
if not parseStore(
jsonNode, store, storeNode, storeRetentionPolicy, storeDbUrl, storeVacuum,
storeDbMigration, storeMaxNumDbConnections, errorResp,
):
if not parseStore(jsonNode, conf, errorResp):
return false
except Exception, KeyError:
errorResp = "Exception calling parseStore: " & getCurrentExceptionMsg()
return false

let wakuFlags = CapabilitiesBitfield.init(
lightpush = false, filter = false, store = false, relay = relay
)

let netConfigRes = NetConfig.init(
bindIp = listenAddr,
bindPort = Port(uint16(port)),
extIp = extIp,
extPort = extPort,
wakuFlags = some(wakuFlags),
)

if netConfigRes.isErr():
errorResp = "Error creating NetConfig: " & $netConfigRes.error
return false

netConfig = netConfigRes.value

return true
Loading
Loading