mirror of
https://github.com/logos-messaging/logos-delivery-js.git
synced 2026-03-18 07:33:10 +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
108 lines
2.6 KiB
TypeScript
108 lines
2.6 KiB
TypeScript
import {
|
|
DefaultNetworkConfig,
|
|
LightNode,
|
|
NetworkConfig,
|
|
ProtocolCreateOptions,
|
|
Protocols,
|
|
Waku
|
|
} from "@waku/interfaces";
|
|
import { createLightNode, waitForRemotePeer } from "@waku/sdk";
|
|
import { derivePubsubTopicsFromNetworkConfig, isDefined } 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,
|
|
[
|
|
!customArgs?.filter ? undefined : Protocols.Filter,
|
|
!customArgs?.lightpush ? undefined : Protocols.LightPush
|
|
].filter(isDefined)
|
|
);
|
|
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]);
|
|
}
|