mirror of
https://github.com/logos-messaging/logos-messaging-js.git
synced 2026-01-23 10:23:13 +00:00
* chore: upgrade nwaku to v0.33.1 * chore: upgrade to nwaku 0.34.0 * feat: connect nwaku nodes amongst each other over relay * chore(lightpush): use multiple service nodes for lightpush (instead of just one) - nwaku now expects >=1 nodes at least connected * chore: all single-node lightpush requests should now be expected to fail * chore: update sharding tests * chore: update tests * chore: improve Docker network config reliability * chore: deduplicate ecies encrypted payloads * chore: update to precise expects * fix: return early if expect passes * chore: lightpush 5 times instead of 30 * fix: non duplicacy should happen in application-specific scenario * chore: update mocha config + fix epehermal tests * chore: reinstall deps after rebase * chore: attempt stability for test suite * fix: store tests to now use multiple nodes, delete uneeded test * fix: memory leak * chore: switch while loop with timeout-promise * chore: remove redundant nodes startup * chore: add delays for nwaku setup
120 lines
3.2 KiB
TypeScript
120 lines
3.2 KiB
TypeScript
import {
|
|
CreateNodeOptions,
|
|
DefaultNetworkConfig,
|
|
IWaku,
|
|
LightNode,
|
|
NetworkConfig,
|
|
Protocols
|
|
} from "@waku/interfaces";
|
|
import { createLightNode } from "@waku/sdk";
|
|
import { delay, derivePubsubTopicsFromNetworkConfig } from "@waku/utils";
|
|
import { Context } from "mocha";
|
|
import pRetry from "p-retry";
|
|
|
|
import { NOISE_KEY_1 } from "../constants.js";
|
|
import { ServiceNodesFleet } from "../lib/index.js";
|
|
import { verifyServiceNodesConnected } from "../lib/service_node.js";
|
|
import { Args } from "../types.js";
|
|
|
|
import { waitForConnections } from "./waitForConnections.js";
|
|
|
|
export async function runMultipleNodes(
|
|
context: Context,
|
|
networkConfig: NetworkConfig = DefaultNetworkConfig,
|
|
customArgs?: Args,
|
|
strictChecking: boolean = false,
|
|
numServiceNodes = 2,
|
|
withoutFilter = false
|
|
): Promise<[ServiceNodesFleet, LightNode]> {
|
|
// create numServiceNodes nodes
|
|
const serviceNodes = await ServiceNodesFleet.createAndRun(
|
|
context,
|
|
numServiceNodes,
|
|
strictChecking,
|
|
networkConfig,
|
|
customArgs,
|
|
withoutFilter
|
|
);
|
|
|
|
if (numServiceNodes > 1) {
|
|
const success = await verifyServiceNodesConnected(serviceNodes.nodes);
|
|
if (!success) {
|
|
throw new Error("Failed to verify that service nodes are connected");
|
|
}
|
|
}
|
|
|
|
const wakuOptions: CreateNodeOptions = {
|
|
staticNoiseKey: NOISE_KEY_1,
|
|
libp2p: {
|
|
addresses: { listen: ["/ip4/0.0.0.0/tcp/0/ws"] }
|
|
},
|
|
networkConfig
|
|
};
|
|
|
|
const waku = await createLightNode(wakuOptions);
|
|
await waku.start();
|
|
|
|
if (!waku) {
|
|
throw new Error("Failed to initialize waku");
|
|
}
|
|
|
|
//TODO: reinvestigate the need for these delays with nwaku:0.35.0: https://github.com/waku-org/js-waku/issues/2264
|
|
await delay(2000);
|
|
|
|
for (const node of serviceNodes.nodes) {
|
|
await waku.dial(await node.getMultiaddrWithId());
|
|
await waku.waitForPeers([Protocols.Filter, Protocols.LightPush]);
|
|
const success = await node.ensureSubscriptions(
|
|
derivePubsubTopicsFromNetworkConfig(networkConfig)
|
|
);
|
|
if (!success) {
|
|
throw new Error("Failed to ensure subscriptions");
|
|
}
|
|
|
|
//TODO: reinvestigate the need for these delays with nwaku:0.35.0: https://github.com/waku-org/js-waku/issues/2264
|
|
await delay(2000);
|
|
|
|
await node.waitForLog(waku.libp2p.peerId.toString(), 100);
|
|
}
|
|
|
|
await waitForConnections(numServiceNodes, waku);
|
|
|
|
const wakuConnections = waku.libp2p.getConnections();
|
|
if (wakuConnections.length < numServiceNodes) {
|
|
throw new Error(
|
|
`Expected at least ${numServiceNodes} connections for js-waku.`
|
|
);
|
|
}
|
|
|
|
return [serviceNodes, waku];
|
|
}
|
|
|
|
export async function teardownNodesWithRedundancy(
|
|
serviceNodes: ServiceNodesFleet,
|
|
wakuNodes: IWaku | IWaku[]
|
|
): 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]);
|
|
}
|