chore: split the mode enum

* add MessagingMode (Edge, Core) in messaging_conf
* move LogosDeliveryMode (Edge, Core, Fleet) to logos_delivery_conf
* applyMode and toWakuNodeConf take MessagingMode
* applyMode can no longer fail; drop its Result
This commit is contained in:
Fabiana Cecin 2026-07-09 19:08:01 -03:00
parent a26da34557
commit c85f20d5a1
No known key found for this signature in database
GPG Key ID: BCAB8A55CB51B6C7
10 changed files with 63 additions and 53 deletions

View File

@ -8,6 +8,22 @@ import logos_delivery/api/conf/channels_conf
export options, messaging_conf, channels_conf
type LogosDeliveryMode* {.pure.} = enum
Edge # client-only node
Core # full service node
Fleet # kernel-only node from a raw kernel config
proc toMessagingMode*(mode: LogosDeliveryMode): ConfResult[MessagingMode] =
## Fleet mounts no messaging layer, so it has no messaging mode.
case mode
of LogosDeliveryMode.Edge:
return ok(MessagingMode.Edge)
of LogosDeliveryMode.Core:
return ok(MessagingMode.Core)
of LogosDeliveryMode.Fleet:
return
err("fleet mode takes a raw kernel config; use LogosDelivery.new(kernelConf)")
type LogosDeliveryConf* = object
## Aggregates the per-layer config objects. A layer is mounted iff its config
## is present.
@ -26,7 +42,7 @@ proc init*(
channelsOverrides: ReliableChannelManagerConf,
): ConfResult[LogosDeliveryConf] =
let merged = merge(?resolvePreset(preset), messagingOverrides)
var kernelConf = ?toWakuNodeConf(merged, mode)
var kernelConf = ?toWakuNodeConf(merged, ?toMessagingMode(mode))
kernelConf.preset = preset
return ok(
LogosDeliveryConf(

View File

@ -44,7 +44,7 @@ proc parseOverrides[T](defaults: T, node: JsonNode, label: string): Result[T, st
return ok(conf)
proc parseFlatConf(
mode: LogosDeliveryMode, topJsonNode: var Table[string, (string, JsonNode)]
mode: MessagingMode, topJsonNode: var Table[string, (string, JsonNode)]
): ConfResult[LogosDeliveryConf] =
## [Legacy flat JSON config] Flat shape: a blob of `WakuNodeConf` fields. `mode`
## expands to protocol flags over raw kernel defaults, `reliabilityEnabled` routes
@ -67,7 +67,7 @@ proc parseFlatConf(
# the mode's protocol flags (the kernel no longer owns `mode`, so we expand it here,
# like the old kernel builder did), then let explicit fields override.
var kernel = ?defaultWakuNodeConf()
?applyMode(kernel, mode)
applyMode(kernel, mode)
?applyJsonFieldsToConf(
kernel, topJsonNode, "Failed to parse config field",
"Unrecognized configuration option(s) found",
@ -131,7 +131,7 @@ proc parseLogosDeliveryConf*(jsonStr: string): ConfResult[LogosDeliveryConf] =
bareField = true
break
if bareField:
return parseFlatConf(mode, top)
return parseFlatConf(?toMessagingMode(mode), top)
var preset = ""
var messagingOverrides = MessagingClientConf()

View File

@ -9,10 +9,9 @@ import logos_delivery/waku/factory/networks_config
export kernel_conf
type LogosDeliveryMode* {.pure.} = enum
type MessagingMode* {.pure.} = enum
Edge # client-only node
Core # full service node
Fleet # kernel-only node from a raw kernel config
type MessagingClientConf* = object
clusterId* {.name: "cluster-id".}: Option[uint16] ## Network cluster id.
@ -55,33 +54,29 @@ type MessagingClientConf* = object
nodeKey* {.name: "nodekey".}: Option[crypto.PrivateKey]
## P2P node private key (64-char hex): stable identity / peerId across restarts.
proc applyMode*(conf: var WakuNodeConf, mode: LogosDeliveryMode): ConfResult[void] =
proc applyMode*(conf: var WakuNodeConf, mode: MessagingMode) =
## Sets the protocol flags implied by the mode.
case mode
of LogosDeliveryMode.Core:
of MessagingMode.Core:
conf.relay = true
conf.filter = true
conf.lightpush = true
conf.discv5Discovery = some(true)
conf.peerExchange = true
conf.rendezvous = true
of LogosDeliveryMode.Edge:
of MessagingMode.Edge:
conf.peerExchange = true
conf.relay = false
conf.filter = false
conf.lightpush = false
conf.store = false
of LogosDeliveryMode.Fleet:
return
err("fleet mode takes a raw kernel config; use LogosDelivery.new(kernelConf)")
return ok()
proc toWakuNodeConf*(
self: MessagingClientConf, mode: LogosDeliveryMode
self: MessagingClientConf, mode: MessagingMode
): ConfResult[WakuNodeConf] =
## Mode sets the protocol flags; set fields map to their kernel counterpart.
var conf = ?defaultWakuNodeConf()
?applyMode(conf, mode)
applyMode(conf, mode)
if self.store.isSome():
conf.store = self.store.get()

View File

@ -91,7 +91,7 @@ suite "LM API health checking":
serviceNode.wakuRelay.subscribe(DefaultShard, dummyHandler)
lockNewGlobalBrokerContext:
var conf = MessagingClientConf().toWakuNodeConf(Core).valueOr:
var conf = MessagingClientConf().toWakuNodeConf(MessagingMode.Core).valueOr:
raiseAssert error
conf.listenAddress = parseIpAddress("0.0.0.0")
conf.tcpPort = Port(0)
@ -271,7 +271,7 @@ suite "LM API health checking":
var edgeWaku: LogosDelivery
lockNewGlobalBrokerContext:
var edgeConf = MessagingClientConf().toWakuNodeConf(Edge).valueOr:
var edgeConf = MessagingClientConf().toWakuNodeConf(MessagingMode.Edge).valueOr:
raiseAssert error
edgeConf.listenAddress = parseIpAddress("0.0.0.0")
edgeConf.tcpPort = Port(0)

View File

@ -84,7 +84,7 @@ proc waitForConnectionStatus(
proc createApiNodeConf(numShards: uint16 = 1): WakuNodeConf =
var conf = MessagingClientConf()
.toWakuNodeConf(messaging_conf.LogosDeliveryMode.Core).valueOr:
.toWakuNodeConf(messaging_conf.MessagingMode.Core).valueOr:
raiseAssert error
conf.listenAddress = parseIpAddress("0.0.0.0")
conf.tcpPort = Port(0)

View File

@ -121,7 +121,7 @@ proc validate(
check requestId == expectedRequestId
proc createApiNodeConf(
mode: messaging_conf.LogosDeliveryMode = messaging_conf.LogosDeliveryMode.Core
mode: messaging_conf.MessagingMode = messaging_conf.MessagingMode.Core
): WakuNodeConf =
var conf = MessagingClientConf().toWakuNodeConf(mode).valueOr:
raiseAssert error
@ -355,9 +355,7 @@ suite "Waku API - Send":
var node: LogosDelivery
lockNewGlobalBrokerContext:
node = (
await LogosDelivery.new(
createApiNodeConf(messaging_conf.LogosDeliveryMode.Edge)
)
await LogosDelivery.new(createApiNodeConf(messaging_conf.MessagingMode.Edge))
).valueOr:
raiseAssert error
(await node.start()).isOkOr:
@ -394,9 +392,7 @@ suite "Waku API - Send":
var node: LogosDelivery
lockNewGlobalBrokerContext:
node = (
await LogosDelivery.new(
createApiNodeConf(messaging_conf.LogosDeliveryMode.Edge)
)
await LogosDelivery.new(createApiNodeConf(messaging_conf.MessagingMode.Edge))
).valueOr:
raiseAssert error
(await node.start()).isOkOr:
@ -489,9 +485,7 @@ suite "Waku API - Send":
var node: LogosDelivery
lockNewGlobalBrokerContext:
node = (
await LogosDelivery.new(
createApiNodeConf(messaging_conf.LogosDeliveryMode.Edge)
)
await LogosDelivery.new(createApiNodeConf(messaging_conf.MessagingMode.Edge))
).valueOr:
raiseAssert error
(await node.start()).isOkOr:

View File

@ -69,7 +69,7 @@ type TestNetwork = ref object
publisherPeerInfo: RemotePeerInfo
proc createApiNodeConf(
mode: messaging_conf.LogosDeliveryMode = messaging_conf.LogosDeliveryMode.Core,
mode: messaging_conf.MessagingMode = messaging_conf.MessagingMode.Core,
numShards: uint16 = 1,
): WakuNodeConf =
var conf = MessagingClientConf().toWakuNodeConf(mode).valueOr:
@ -91,7 +91,7 @@ proc setupSubscriberNode(conf: WakuNodeConf): Future[LogosDelivery] {.async.} =
proc setupNetwork(
numShards: uint16 = 1,
mode: messaging_conf.LogosDeliveryMode = messaging_conf.LogosDeliveryMode.Core,
mode: messaging_conf.MessagingMode = messaging_conf.MessagingMode.Core,
): Future[TestNetwork] {.async.} =
var net = TestNetwork()
@ -101,7 +101,7 @@ proc setupNetwork(
"Failed to mount metadata"
)
(await net.publisher.mountRelay()).expect("Failed to mount relay")
if mode == messaging_conf.LogosDeliveryMode.Edge:
if mode == messaging_conf.MessagingMode.Edge:
await net.publisher.mountFilter()
await net.publisher.mountLibp2pPing()
await net.publisher.start()
@ -120,7 +120,7 @@ proc setupNetwork(
"Failed to sub publisher"
)
if mode == messaging_conf.LogosDeliveryMode.Edge:
if mode == messaging_conf.MessagingMode.Edge:
lockNewGlobalBrokerContext:
net.meshBuddy = newTestWakuNode(generateSecp256k1Key())
net.meshBuddy.mountMetadata(3, toSeq(0'u16 ..< numShards)).expect(
@ -475,7 +475,7 @@ suite "Messaging API, SubscriptionManager":
await verifyNetworkState(activeSubs)
asyncTest "Subscription API, edge node subscribe and receive message":
let net = await setupNetwork(1, messaging_conf.LogosDeliveryMode.Edge)
let net = await setupNetwork(1, messaging_conf.MessagingMode.Edge)
defer:
await net.teardown()
@ -497,7 +497,7 @@ suite "Messaging API, SubscriptionManager":
check eventManager.receivedMessages[0].contentTopic == testTopic
asyncTest "Subscription API, edge node ignores unsubscribed content topics":
let net = await setupNetwork(1, messaging_conf.LogosDeliveryMode.Edge)
let net = await setupNetwork(1, messaging_conf.MessagingMode.Edge)
defer:
await net.teardown()
@ -519,7 +519,7 @@ suite "Messaging API, SubscriptionManager":
check eventManager.receivedMessages.len == 0
asyncTest "Subscription API, edge node unsubscribe stops message receipt":
let net = await setupNetwork(1, messaging_conf.LogosDeliveryMode.Edge)
let net = await setupNetwork(1, messaging_conf.MessagingMode.Edge)
defer:
await net.teardown()
@ -544,7 +544,7 @@ suite "Messaging API, SubscriptionManager":
check eventManager.receivedMessages.len == 0
asyncTest "Subscription API, edge node overlapping topics isolation":
let net = await setupNetwork(1, messaging_conf.LogosDeliveryMode.Edge)
let net = await setupNetwork(1, messaging_conf.MessagingMode.Edge)
defer:
await net.teardown()
@ -573,7 +573,7 @@ suite "Messaging API, SubscriptionManager":
check eventManager.receivedMessages[0].contentTopic == topicB
asyncTest "Subscription API, edge node resubscribe after unsubscribe":
let net = await setupNetwork(1, messaging_conf.LogosDeliveryMode.Edge)
let net = await setupNetwork(1, messaging_conf.MessagingMode.Edge)
defer:
await net.teardown()
@ -658,7 +658,7 @@ suite "Messaging API, SubscriptionManager":
await meshBuddy.connectToNodes(@[publisherPeerInfo])
let conf = createApiNodeConf(messaging_conf.LogosDeliveryMode.Edge, numShards)
let conf = createApiNodeConf(messaging_conf.MessagingMode.Edge, numShards)
var subscriber: LogosDelivery
lockNewGlobalBrokerContext:
subscriber =
@ -786,7 +786,7 @@ suite "Messaging API, SubscriptionManager":
await meshBuddy.connectToNodes(@[publisherPeerInfo])
await sparePeer.connectToNodes(@[publisherPeerInfo])
let conf = createApiNodeConf(messaging_conf.LogosDeliveryMode.Edge, numShards)
let conf = createApiNodeConf(messaging_conf.MessagingMode.Edge, numShards)
var subscriber: LogosDelivery
lockNewGlobalBrokerContext:
subscriber =

View File

@ -9,7 +9,7 @@ import logos_delivery/waku/common/logging
suite "MessagingClientConf - mode expansion (toWakuNodeConf)":
test "Core mode enables relay + service protocols":
let kc = MessagingClientConf().toWakuNodeConf(LogosDeliveryMode.Core).valueOr:
let kc = MessagingClientConf().toWakuNodeConf(MessagingMode.Core).valueOr:
raiseAssert error
check:
kc.relay == true
@ -20,7 +20,7 @@ suite "MessagingClientConf - mode expansion (toWakuNodeConf)":
kc.rendezvous == true
test "Edge mode is client-only (no relay/filter/lightpush/store)":
let kc = MessagingClientConf().toWakuNodeConf(LogosDeliveryMode.Edge).valueOr:
let kc = MessagingClientConf().toWakuNodeConf(MessagingMode.Edge).valueOr:
raiseAssert error
check:
kc.relay == false
@ -37,7 +37,7 @@ suite "MessagingClientConf - field mapping + transport policy":
numShardsInCluster: some(4'u16),
maxMessageSize: some("150KiB"),
)
let kc = mc.toWakuNodeConf(LogosDeliveryMode.Core).valueOr:
let kc = mc.toWakuNodeConf(MessagingMode.Core).valueOr:
raiseAssert error
check:
kc.clusterId == some(3'u16)
@ -45,7 +45,7 @@ suite "MessagingClientConf - field mapping + transport policy":
kc.maxMessageSize == "150KiB"
test "messaging transport defaults: ephemeral ports, websocket off, quic on":
let kc = MessagingClientConf().toWakuNodeConf(LogosDeliveryMode.Core).valueOr:
let kc = MessagingClientConf().toWakuNodeConf(MessagingMode.Core).valueOr:
raiseAssert error
check:
kc.tcpPort == Port(0)
@ -59,7 +59,7 @@ suite "MessagingClientConf - field mapping + transport policy":
websocketSupport: some(true),
quicSupport: some(false),
)
let kc = mc.toWakuNodeConf(LogosDeliveryMode.Core).valueOr:
let kc = mc.toWakuNodeConf(MessagingMode.Core).valueOr:
raiseAssert error
check:
kc.tcpPort == Port(1234)
@ -91,7 +91,7 @@ suite "MessagingClientConf - preset resolution":
let presetConf = resolvePreset("logos.dev").valueOr:
raiseAssert error
let merged = merge(presetConf, MessagingClientConf(numShardsInCluster: some(1'u16)))
var kernelConf = toWakuNodeConf(merged, LogosDeliveryMode.Core).valueOr:
var kernelConf = toWakuNodeConf(merged, MessagingMode.Core).valueOr:
raiseAssert error
kernelConf.preset = "logos.dev"
let wakuConf = kernelConf.toWakuConf().valueOr:
@ -313,11 +313,16 @@ suite "LogosDelivery.new - construction (the app-dev entry)":
check not node.waku.isNil()
(await node.stop()).expect("stop")
test "fleet mode is rejected by the full-stack entry":
check LogosDeliveryConf
.init(
LogosDeliveryMode.Fleet, "", MessagingClientConf(), ReliableChannelManagerConf()
)
.isErr()
suite "MessagingClientConf - store override":
test "store opt-in overrides the mode default; protocol flags follow the mode":
let kc = MessagingClientConf(store: some(true)).toWakuNodeConf(
LogosDeliveryMode.Edge
).valueOr:
let kc = MessagingClientConf(store: some(true)).toWakuNodeConf(MessagingMode.Edge).valueOr:
raiseAssert error
check:
kc.store == true # Edge defaults store off; the explicit opt-in wins
@ -326,7 +331,7 @@ suite "MessagingClientConf - store override":
suite "LogosDelivery.new - raw kernel construction":
asyncTest "a fleet node mounts the kernel only; start/stop tolerate the nil layers":
let kernel = MessagingClientConf(listenIpv4: some(parseIpAddress("0.0.0.0"))).toWakuNodeConf(
LogosDeliveryMode.Core
MessagingMode.Core
).valueOr:
raiseAssert error
var node: LogosDelivery

View File

@ -29,7 +29,7 @@ const TestTimeout = chronos.seconds(15)
proc createApiNodeConf(): WakuNodeConf =
var conf = MessagingClientConf()
.toWakuNodeConf(messaging_conf.LogosDeliveryMode.Core).valueOr:
.toWakuNodeConf(messaging_conf.MessagingMode.Core).valueOr:
raiseAssert error
conf.listenAddress = parseIpAddress("0.0.0.0")
conf.tcpPort = Port(0)

View File

@ -12,7 +12,7 @@ import logos_delivery/waku/factory/conf_builder/conf_builder
suite "LogosDelivery API - Create node":
asyncTest "Create node with minimal configuration":
## Given
var nodeConf = MessagingClientConf().toWakuNodeConf(Core).valueOr:
var nodeConf = MessagingClientConf().toWakuNodeConf(MessagingMode.Core).valueOr:
raiseAssert "toWakuNodeConf failed: " & error
nodeConf.clusterId = some(3'u16)
nodeConf.rest = false
@ -31,7 +31,7 @@ suite "LogosDelivery API - Create node":
asyncTest "Create node with full configuration":
## Given
var nodeConf = MessagingClientConf().toWakuNodeConf(Core).valueOr:
var nodeConf = MessagingClientConf().toWakuNodeConf(MessagingMode.Core).valueOr:
raiseAssert "toWakuNodeConf failed: " & error
nodeConf.clusterId = some(99'u16)
nodeConf.rest = false
@ -62,7 +62,7 @@ suite "LogosDelivery API - Create node":
asyncTest "Create node with mixed entry nodes (enrtree, multiaddr)":
## Given
var nodeConf = MessagingClientConf().toWakuNodeConf(Core).valueOr:
var nodeConf = MessagingClientConf().toWakuNodeConf(MessagingMode.Core).valueOr:
raiseAssert "toWakuNodeConf failed: " & error
nodeConf.clusterId = some(42'u16)
nodeConf.rest = false