2024-07-27 18:27:54 +05:30
|
|
|
import {
|
2025-01-31 00:16:00 +01:00
|
|
|
CreateNodeOptions,
|
2024-10-09 00:43:34 +02:00
|
|
|
IWaku,
|
2024-07-27 18:27:54 +05:30
|
|
|
LightNode,
|
2024-10-09 00:43:34 +02:00
|
|
|
Protocols
|
2024-07-27 18:27:54 +05:30
|
|
|
} from "@waku/interfaces";
|
2024-10-09 00:43:34 +02:00
|
|
|
import { createLightNode } from "@waku/sdk";
|
2025-07-19 14:24:30 +10:00
|
|
|
import {
|
|
|
|
|
contentTopicToPubsubTopic,
|
|
|
|
|
formatPubsubTopic,
|
|
|
|
|
isAutoShardingRoutingInfo,
|
|
|
|
|
RoutingInfo
|
|
|
|
|
} from "@waku/utils";
|
2024-07-27 18:27:54 +05:30
|
|
|
import { Context } from "mocha";
|
|
|
|
|
import pRetry from "p-retry";
|
|
|
|
|
|
2024-09-13 14:18:29 +05:30
|
|
|
import { NOISE_KEY_1 } from "../constants.js";
|
|
|
|
|
import { ServiceNodesFleet } from "../lib/index.js";
|
2025-05-30 16:27:00 +05:30
|
|
|
import { DEFAULT_DISCOVERIES_ENABLED } from "../lib/runNodes.js";
|
2024-09-13 14:18:29 +05:30
|
|
|
import { Args } from "../types.js";
|
2024-07-27 18:27:54 +05:30
|
|
|
|
2024-09-13 14:18:29 +05:30
|
|
|
import { waitForConnections } from "./waitForConnections.js";
|
2024-07-27 18:27:54 +05:30
|
|
|
|
feat!: Introduce routing info concept
Concepts are being mixed up between the global network config (static vs auto sharding), that needs to be the same of all nodes in the network, individual node configuration (eg relay node subscribing to a given shard), and the routing characteristic of a specific message (eg pubsub topic, shard).
This stops proper configuration of nwaku post 0.36.0 because we know need to be deliberate on whether nwaku nodes are running with auto or static sharding.
It also included various back and forth conversions between shards, pubsub topics, etc.
With this change, we tidy up the network configuration, and make it explicit whether it is static or auto sharded.
We also introduce the concept of routing info, which is specific to a message, and tied to the overall network configuration.
Routing info abstract pubsub topic, shard, and autosharding needs. Which should lead to easier tidy up of the pubsub concept at a later stage.
# Conflicts:
# packages/core/src/lib/connection_manager/connection_manager.ts
# packages/core/src/lib/metadata/metadata.ts
# packages/interfaces/src/metadata.ts
# packages/interfaces/src/sharding.ts
# packages/relay/src/create.ts
# packages/sdk/src/filter/filter.ts
# packages/sdk/src/filter/types.ts
# packages/sdk/src/light_push/light_push.spec.ts
# packages/tests/tests/sharding/auto_sharding.spec.ts
# packages/tests/tests/sharding/static_sharding.spec.ts
# Conflicts:
# packages/sdk/src/store/store.ts
2025-07-11 13:33:45 +10:00
|
|
|
/**
|
|
|
|
|
* Runs both js-waku and nwaku nodes.
|
|
|
|
|
*
|
|
|
|
|
* @param context
|
|
|
|
|
* @param routingInfo
|
|
|
|
|
* @param customArgs passed to nwaku service nodes
|
|
|
|
|
* @param strictChecking
|
|
|
|
|
* @param numServiceNodes
|
|
|
|
|
* @param withoutFilter
|
|
|
|
|
* @param jsWakuParams
|
|
|
|
|
*/
|
2024-07-27 18:27:54 +05:30
|
|
|
export async function runMultipleNodes(
|
|
|
|
|
context: Context,
|
feat!: Introduce routing info concept
Concepts are being mixed up between the global network config (static vs auto sharding), that needs to be the same of all nodes in the network, individual node configuration (eg relay node subscribing to a given shard), and the routing characteristic of a specific message (eg pubsub topic, shard).
This stops proper configuration of nwaku post 0.36.0 because we know need to be deliberate on whether nwaku nodes are running with auto or static sharding.
It also included various back and forth conversions between shards, pubsub topics, etc.
With this change, we tidy up the network configuration, and make it explicit whether it is static or auto sharded.
We also introduce the concept of routing info, which is specific to a message, and tied to the overall network configuration.
Routing info abstract pubsub topic, shard, and autosharding needs. Which should lead to easier tidy up of the pubsub concept at a later stage.
# Conflicts:
# packages/core/src/lib/connection_manager/connection_manager.ts
# packages/core/src/lib/metadata/metadata.ts
# packages/interfaces/src/metadata.ts
# packages/interfaces/src/sharding.ts
# packages/relay/src/create.ts
# packages/sdk/src/filter/filter.ts
# packages/sdk/src/filter/types.ts
# packages/sdk/src/light_push/light_push.spec.ts
# packages/tests/tests/sharding/auto_sharding.spec.ts
# packages/tests/tests/sharding/static_sharding.spec.ts
# Conflicts:
# packages/sdk/src/store/store.ts
2025-07-11 13:33:45 +10:00
|
|
|
routingInfo: RoutingInfo,
|
2024-07-27 18:27:54 +05:30
|
|
|
customArgs?: Args,
|
|
|
|
|
strictChecking: boolean = false,
|
2024-08-27 21:53:16 +02:00
|
|
|
numServiceNodes = 2,
|
feat!: re-architect connection manager (#2445)
* remove public pubsub field and redundant util
* add hangUp and improve dial operations, improve keepAliveManager and remove unused method, move utils and add tests
* improve public dial method to start keep alive checks
* move dial method
* implement discovery dialer
* implement discovery dialer with queue with tests
* add discovery dialer e2e tests, change local discovery log tag, update other tests
* remove comment
* add issue link, remove only
* implement shard reader component
* create evetns module, remove unused connection manager events and related tests
* implement network indicator
* implement connection limiter, change public API of connection manager, implement recovery strategy
* decouple keep alive maanger
* add connection manager js-doc
* refactor keep alive manager, cover with tests
* add tests for connection manager main facade
* add tests for connection limiter
* add e2e tests for connection manager modules
pass js-waku config during test node init
remove dns discovery for js-waku
* restructure dialing tests
* address last e2e tests
* address review
* add logging for main methods
* decouple pure dialer class, update network monitor with specific metrics
* remove console.log
* remove usage of protocols
* update sdk package tests
* add connect await promise
* add debug for e2e tests
* enable only packages tests
* use only one file
* revert debugging
* up interface for netwrok manager
* add logs
* add more logs
* add more logs
* add another logs
* remove .only
* remove log statements
* skip the test with follow up
2025-07-09 21:23:14 +02:00
|
|
|
withoutFilter = false,
|
|
|
|
|
jsWakuParams: CreateNodeOptions = {}
|
2024-07-27 18:27:54 +05:30
|
|
|
): Promise<[ServiceNodesFleet, LightNode]> {
|
|
|
|
|
// create numServiceNodes nodes
|
|
|
|
|
const serviceNodes = await ServiceNodesFleet.createAndRun(
|
|
|
|
|
context,
|
|
|
|
|
numServiceNodes,
|
|
|
|
|
strictChecking,
|
feat!: Introduce routing info concept
Concepts are being mixed up between the global network config (static vs auto sharding), that needs to be the same of all nodes in the network, individual node configuration (eg relay node subscribing to a given shard), and the routing characteristic of a specific message (eg pubsub topic, shard).
This stops proper configuration of nwaku post 0.36.0 because we know need to be deliberate on whether nwaku nodes are running with auto or static sharding.
It also included various back and forth conversions between shards, pubsub topics, etc.
With this change, we tidy up the network configuration, and make it explicit whether it is static or auto sharded.
We also introduce the concept of routing info, which is specific to a message, and tied to the overall network configuration.
Routing info abstract pubsub topic, shard, and autosharding needs. Which should lead to easier tidy up of the pubsub concept at a later stage.
# Conflicts:
# packages/core/src/lib/connection_manager/connection_manager.ts
# packages/core/src/lib/metadata/metadata.ts
# packages/interfaces/src/metadata.ts
# packages/interfaces/src/sharding.ts
# packages/relay/src/create.ts
# packages/sdk/src/filter/filter.ts
# packages/sdk/src/filter/types.ts
# packages/sdk/src/light_push/light_push.spec.ts
# packages/tests/tests/sharding/auto_sharding.spec.ts
# packages/tests/tests/sharding/static_sharding.spec.ts
# Conflicts:
# packages/sdk/src/store/store.ts
2025-07-11 13:33:45 +10:00
|
|
|
routingInfo,
|
2024-07-27 18:27:54 +05:30
|
|
|
customArgs,
|
|
|
|
|
withoutFilter
|
|
|
|
|
);
|
|
|
|
|
|
2025-01-31 00:16:00 +01:00
|
|
|
const wakuOptions: CreateNodeOptions = {
|
2024-07-27 18:27:54 +05:30
|
|
|
staticNoiseKey: NOISE_KEY_1,
|
|
|
|
|
libp2p: {
|
|
|
|
|
addresses: { listen: ["/ip4/0.0.0.0/tcp/0/ws"] }
|
2024-08-13 05:23:20 +05:30
|
|
|
},
|
feat!: Introduce routing info concept
Concepts are being mixed up between the global network config (static vs auto sharding), that needs to be the same of all nodes in the network, individual node configuration (eg relay node subscribing to a given shard), and the routing characteristic of a specific message (eg pubsub topic, shard).
This stops proper configuration of nwaku post 0.36.0 because we know need to be deliberate on whether nwaku nodes are running with auto or static sharding.
It also included various back and forth conversions between shards, pubsub topics, etc.
With this change, we tidy up the network configuration, and make it explicit whether it is static or auto sharded.
We also introduce the concept of routing info, which is specific to a message, and tied to the overall network configuration.
Routing info abstract pubsub topic, shard, and autosharding needs. Which should lead to easier tidy up of the pubsub concept at a later stage.
# Conflicts:
# packages/core/src/lib/connection_manager/connection_manager.ts
# packages/core/src/lib/metadata/metadata.ts
# packages/interfaces/src/metadata.ts
# packages/interfaces/src/sharding.ts
# packages/relay/src/create.ts
# packages/sdk/src/filter/filter.ts
# packages/sdk/src/filter/types.ts
# packages/sdk/src/light_push/light_push.spec.ts
# packages/tests/tests/sharding/auto_sharding.spec.ts
# packages/tests/tests/sharding/static_sharding.spec.ts
# Conflicts:
# packages/sdk/src/store/store.ts
2025-07-11 13:33:45 +10:00
|
|
|
networkConfig: routingInfo.networkConfig,
|
2025-05-30 16:27:00 +05:30
|
|
|
lightPush: { numPeersToUse: numServiceNodes },
|
feat!: re-architect connection manager (#2445)
* remove public pubsub field and redundant util
* add hangUp and improve dial operations, improve keepAliveManager and remove unused method, move utils and add tests
* improve public dial method to start keep alive checks
* move dial method
* implement discovery dialer
* implement discovery dialer with queue with tests
* add discovery dialer e2e tests, change local discovery log tag, update other tests
* remove comment
* add issue link, remove only
* implement shard reader component
* create evetns module, remove unused connection manager events and related tests
* implement network indicator
* implement connection limiter, change public API of connection manager, implement recovery strategy
* decouple keep alive maanger
* add connection manager js-doc
* refactor keep alive manager, cover with tests
* add tests for connection manager main facade
* add tests for connection limiter
* add e2e tests for connection manager modules
pass js-waku config during test node init
remove dns discovery for js-waku
* restructure dialing tests
* address last e2e tests
* address review
* add logging for main methods
* decouple pure dialer class, update network monitor with specific metrics
* remove console.log
* remove usage of protocols
* update sdk package tests
* add connect await promise
* add debug for e2e tests
* enable only packages tests
* use only one file
* revert debugging
* up interface for netwrok manager
* add logs
* add more logs
* add more logs
* add another logs
* remove .only
* remove log statements
* skip the test with follow up
2025-07-09 21:23:14 +02:00
|
|
|
discovery: DEFAULT_DISCOVERIES_ENABLED,
|
|
|
|
|
...jsWakuParams
|
2024-07-27 18:27:54 +05:30
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const waku = await createLightNode(wakuOptions);
|
|
|
|
|
|
|
|
|
|
if (!waku) {
|
|
|
|
|
throw new Error("Failed to initialize waku");
|
|
|
|
|
}
|
|
|
|
|
|
2025-07-19 14:24:30 +10:00
|
|
|
const pubsubTopics = [];
|
|
|
|
|
|
|
|
|
|
pubsubTopics.push(routingInfo.pubsubTopic);
|
|
|
|
|
|
|
|
|
|
if (customArgs?.shard) {
|
|
|
|
|
const shards = customArgs?.shard ?? [];
|
|
|
|
|
for (const s of shards) {
|
2025-07-19 14:45:06 +10:00
|
|
|
pubsubTopics.push(formatPubsubTopic(routingInfo.clusterId, s));
|
2025-07-19 14:24:30 +10:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (customArgs?.contentTopic && isAutoShardingRoutingInfo(routingInfo)) {
|
|
|
|
|
const contentTopics = customArgs?.contentTopic ?? [];
|
|
|
|
|
for (const ct of contentTopics) {
|
|
|
|
|
pubsubTopics.push(
|
|
|
|
|
contentTopicToPubsubTopic(
|
|
|
|
|
ct,
|
2025-07-19 14:45:06 +10:00
|
|
|
routingInfo.clusterId,
|
2025-07-19 14:24:30 +10:00
|
|
|
routingInfo.networkConfig.numShardsInCluster
|
|
|
|
|
)
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-07-27 18:27:54 +05:30
|
|
|
for (const node of serviceNodes.nodes) {
|
|
|
|
|
await waku.dial(await node.getMultiaddrWithId());
|
2024-10-09 00:43:34 +02:00
|
|
|
await waku.waitForPeers([Protocols.Filter, Protocols.LightPush]);
|
2025-07-19 14:24:30 +10:00
|
|
|
|
|
|
|
|
if (pubsubTopics.length > 0) {
|
|
|
|
|
await node.ensureSubscriptions(pubsubTopics);
|
|
|
|
|
}
|
2024-08-31 15:18:51 +02:00
|
|
|
|
2025-02-22 03:36:45 +05:30
|
|
|
const wakuConnections = waku.libp2p.getConnections();
|
|
|
|
|
|
|
|
|
|
if (wakuConnections.length < 1) {
|
|
|
|
|
throw new Error(`Expected at least 1 connection for js-waku.`);
|
|
|
|
|
}
|
2025-02-17 19:21:33 +05:30
|
|
|
|
2024-08-31 15:18:51 +02:00
|
|
|
await node.waitForLog(waku.libp2p.peerId.toString(), 100);
|
2024-07-27 18:27:54 +05:30
|
|
|
}
|
|
|
|
|
|
|
|
|
|
await waitForConnections(numServiceNodes, waku);
|
|
|
|
|
|
2025-04-11 18:30:28 +02:00
|
|
|
for (let i = 0; i < serviceNodes.nodes.length; i++) {
|
|
|
|
|
const node = serviceNodes.nodes[i];
|
|
|
|
|
const peers = await node.peers();
|
|
|
|
|
|
|
|
|
|
if (peers.length < 1) {
|
|
|
|
|
throw new Error(`Expected at least 1 connection for nwaku.`);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-07-27 18:27:54 +05:30
|
|
|
return [serviceNodes, waku];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export async function teardownNodesWithRedundancy(
|
|
|
|
|
serviceNodes: ServiceNodesFleet,
|
2024-10-09 00:43:34 +02:00
|
|
|
wakuNodes: IWaku | IWaku[]
|
2024-07-27 18:27:54 +05:30
|
|
|
): Promise<void> {
|
|
|
|
|
const wNodes = Array.isArray(wakuNodes) ? wakuNodes : [wakuNodes];
|
|
|
|
|
|
|
|
|
|
const stopNwakuNodes = serviceNodes.nodes.map(async (node) => {
|
|
|
|
|
await pRetry(
|
|
|
|
|
async () => {
|
|
|
|
|
await node.stop();
|
|
|
|
|
},
|
|
|
|
|
{ retries: 3 }
|
|
|
|
|
);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const stopWakuNodes = wNodes.map(async (waku) => {
|
|
|
|
|
if (waku) {
|
|
|
|
|
await pRetry(
|
|
|
|
|
async () => {
|
|
|
|
|
await waku.stop();
|
|
|
|
|
},
|
|
|
|
|
{ retries: 3 }
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
await Promise.all([...stopNwakuNodes, ...stopWakuNodes]);
|
|
|
|
|
}
|