mirror of
https://github.com/logos-messaging/logos-messaging-js.git
synced 2026-01-13 13:33:09 +00:00
* fix comment of default number of peers * export default number of peers from base protocol sdk * rename to light_push, move class to separate file * move waitForRemotePeer to sdk package * add todo to move waitForGossipSubPeerInMesh into @waku/relay * clean up waitForRemotePeer, split metadata await from event and optimise, decouple from protocol implementations * simplify and rename ILightPush interface * use only connected peers in light push based on connections instead of peer renewal mechanism * improve readability of result processing in light push * fix check & update tests * address tests, add new test cases, fix racing condition in StreamManager * use libp2p.getPeers * feat: confirm metadata and protocols needed in waitForRemotePeer * rely on passed protocols and fallback to mounted * imrpove iteration for existing connections * address protocol adverisement in CI * add protocols needed * add missing protocols * make lightpush and filter default for tests * up
102 lines
2.5 KiB
TypeScript
102 lines
2.5 KiB
TypeScript
import {
|
|
DefaultNetworkConfig,
|
|
LightNode,
|
|
NetworkConfig,
|
|
ProtocolCreateOptions,
|
|
Protocols,
|
|
Waku
|
|
} from "@waku/interfaces";
|
|
import { createLightNode, waitForRemotePeer } from "@waku/sdk";
|
|
import { 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 { 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
|
|
);
|
|
|
|
const wakuOptions: ProtocolCreateOptions = {
|
|
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");
|
|
}
|
|
|
|
for (const node of serviceNodes.nodes) {
|
|
await waku.dial(await node.getMultiaddrWithId());
|
|
await waitForRemotePeer(waku, [Protocols.Filter, Protocols.LightPush]);
|
|
await node.ensureSubscriptions(
|
|
derivePubsubTopicsFromNetworkConfig(networkConfig)
|
|
);
|
|
|
|
const wakuConnections = waku.libp2p.getConnections();
|
|
|
|
if (wakuConnections.length < 1) {
|
|
throw new Error(`Expected at least 1 connection for js-waku.`);
|
|
}
|
|
|
|
await node.waitForLog(waku.libp2p.peerId.toString(), 100);
|
|
}
|
|
|
|
await waitForConnections(numServiceNodes, waku);
|
|
|
|
return [serviceNodes, waku];
|
|
}
|
|
|
|
export async function teardownNodesWithRedundancy(
|
|
serviceNodes: ServiceNodesFleet,
|
|
wakuNodes: Waku | Waku[]
|
|
): 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]);
|
|
}
|