From c85f20d5a1ce367817992529fb573cf6059d59a7 Mon Sep 17 00:00:00 2001 From: Fabiana Cecin Date: Thu, 9 Jul 2026 19:08:01 -0300 Subject: [PATCH] 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 --- .../api/conf/logos_delivery_conf.nim | 18 ++++++++++++- .../api/conf/logos_delivery_conf_json.nim | 6 ++--- logos_delivery/api/conf/messaging_conf.nim | 17 +++++-------- tests/api/test_api_health.nim | 4 +-- tests/api/test_api_receive.nim | 2 +- tests/api/test_api_send.nim | 14 +++-------- tests/api/test_api_subscription.nim | 22 ++++++++-------- tests/api/test_conf.nim | 25 +++++++++++-------- .../test_reliable_channel_send_receive.nim | 2 +- tests/test_waku.nim | 6 ++--- 10 files changed, 63 insertions(+), 53 deletions(-) diff --git a/logos_delivery/api/conf/logos_delivery_conf.nim b/logos_delivery/api/conf/logos_delivery_conf.nim index e5ac7432a..3560b7e7f 100644 --- a/logos_delivery/api/conf/logos_delivery_conf.nim +++ b/logos_delivery/api/conf/logos_delivery_conf.nim @@ -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( diff --git a/logos_delivery/api/conf/logos_delivery_conf_json.nim b/logos_delivery/api/conf/logos_delivery_conf_json.nim index e5df174e4..227d1924d 100644 --- a/logos_delivery/api/conf/logos_delivery_conf_json.nim +++ b/logos_delivery/api/conf/logos_delivery_conf_json.nim @@ -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() diff --git a/logos_delivery/api/conf/messaging_conf.nim b/logos_delivery/api/conf/messaging_conf.nim index 86a73575b..490d347ee 100644 --- a/logos_delivery/api/conf/messaging_conf.nim +++ b/logos_delivery/api/conf/messaging_conf.nim @@ -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() diff --git a/tests/api/test_api_health.nim b/tests/api/test_api_health.nim index 7b493964a..a07f30edd 100644 --- a/tests/api/test_api_health.nim +++ b/tests/api/test_api_health.nim @@ -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) diff --git a/tests/api/test_api_receive.nim b/tests/api/test_api_receive.nim index 870f85860..7435d595a 100644 --- a/tests/api/test_api_receive.nim +++ b/tests/api/test_api_receive.nim @@ -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) diff --git a/tests/api/test_api_send.nim b/tests/api/test_api_send.nim index 8df564b0d..f103fe1ed 100644 --- a/tests/api/test_api_send.nim +++ b/tests/api/test_api_send.nim @@ -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: diff --git a/tests/api/test_api_subscription.nim b/tests/api/test_api_subscription.nim index 90d160bc3..d5ca7daaf 100644 --- a/tests/api/test_api_subscription.nim +++ b/tests/api/test_api_subscription.nim @@ -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 = diff --git a/tests/api/test_conf.nim b/tests/api/test_conf.nim index 705c00825..0bad6f9d7 100644 --- a/tests/api/test_conf.nim +++ b/tests/api/test_conf.nim @@ -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 diff --git a/tests/channels/test_reliable_channel_send_receive.nim b/tests/channels/test_reliable_channel_send_receive.nim index b76851006..27cbaf9c9 100644 --- a/tests/channels/test_reliable_channel_send_receive.nim +++ b/tests/channels/test_reliable_channel_send_receive.nim @@ -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) diff --git a/tests/test_waku.nim b/tests/test_waku.nim index 7ddde8ad9..832185073 100644 --- a/tests/test_waku.nim +++ b/tests/test_waku.nim @@ -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