mirror of
https://github.com/logos-messaging/js-waku.git
synced 2026-02-17 12:23:09 +00:00
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
142 lines
3.8 KiB
TypeScript
142 lines
3.8 KiB
TypeScript
import type { PeerId } from "@libp2p/interface";
|
|
import { IDecodedMessage, Protocols, RelayNode } from "@waku/interfaces";
|
|
import { createRelayNode } from "@waku/relay";
|
|
import { bytesToUtf8, utf8ToBytes } from "@waku/utils/bytes";
|
|
import { expect } from "chai";
|
|
|
|
import {
|
|
afterEachCustom,
|
|
base64ToUtf8,
|
|
beforeEachCustom,
|
|
delay,
|
|
NOISE_KEY_2,
|
|
ServiceNode,
|
|
tearDownNodes
|
|
} from "../../src/index.js";
|
|
import { MessageRpcResponse } from "../../src/types.js";
|
|
|
|
import {
|
|
TestContentTopic,
|
|
TestDecoder,
|
|
TestEncoder,
|
|
TestNetworkConfig,
|
|
TestRoutingInfo
|
|
} from "./utils.js";
|
|
import { runRelayNodes } from "./utils.js";
|
|
|
|
describe("Waku Relay, Interop", function () {
|
|
this.timeout(15000);
|
|
let waku: RelayNode;
|
|
let nwaku: ServiceNode;
|
|
|
|
beforeEachCustom(this, async () => {
|
|
[nwaku, waku] = await runRelayNodes(
|
|
this.ctx,
|
|
TestNetworkConfig,
|
|
undefined,
|
|
[TestContentTopic]
|
|
);
|
|
});
|
|
|
|
afterEachCustom(this, async () => {
|
|
await tearDownNodes(nwaku, waku);
|
|
});
|
|
|
|
it("nwaku subscribes", async function () {
|
|
let subscribers: PeerId[] = [];
|
|
|
|
while (subscribers.length === 0) {
|
|
await delay(200);
|
|
subscribers = waku.libp2p.services.pubsub!.getSubscribers(
|
|
TestRoutingInfo.pubsubTopic
|
|
);
|
|
}
|
|
|
|
const nimPeerId = await nwaku.getPeerId();
|
|
expect(subscribers.map((p) => p.toString())).to.contain(
|
|
nimPeerId.toString()
|
|
);
|
|
});
|
|
|
|
it("Publishes to nwaku", async function () {
|
|
const messageText = "This is a message";
|
|
await waku.relay.send(TestEncoder, { payload: utf8ToBytes(messageText) });
|
|
|
|
let msgs: MessageRpcResponse[] = [];
|
|
|
|
while (msgs.length === 0) {
|
|
await delay(200);
|
|
msgs = await nwaku.messages();
|
|
}
|
|
|
|
expect(msgs[0].contentTopic).to.equal(TestContentTopic);
|
|
expect(msgs[0].version).to.equal(0);
|
|
expect(base64ToUtf8(msgs[0].payload)).to.equal(messageText);
|
|
});
|
|
|
|
it("Nwaku publishes", async function () {
|
|
await delay(200);
|
|
|
|
const messageText = "Here is another message.";
|
|
|
|
const receivedMsgPromise: Promise<IDecodedMessage> = new Promise(
|
|
(resolve) => {
|
|
void waku.relay.subscribeWithUnsubscribe<IDecodedMessage>(
|
|
TestDecoder,
|
|
(msg) => resolve(msg)
|
|
);
|
|
}
|
|
);
|
|
|
|
await nwaku.sendMessage(
|
|
ServiceNode.toMessageRpcQuery({
|
|
contentTopic: TestContentTopic,
|
|
payload: utf8ToBytes(messageText)
|
|
}),
|
|
TestRoutingInfo
|
|
);
|
|
|
|
const receivedMsg = await receivedMsgPromise;
|
|
|
|
expect(receivedMsg.contentTopic).to.eq(TestContentTopic);
|
|
expect(receivedMsg.version!).to.eq(0);
|
|
expect(bytesToUtf8(receivedMsg.payload!)).to.eq(messageText);
|
|
});
|
|
|
|
it("Js publishes, other Js receives", async function () {
|
|
const waku2 = await createRelayNode({
|
|
routingInfos: [TestRoutingInfo],
|
|
staticNoiseKey: NOISE_KEY_2,
|
|
emitSelf: true,
|
|
networkConfig: TestNetworkConfig
|
|
});
|
|
await waku2.start();
|
|
|
|
const nwakuMultiaddr = await nwaku.getMultiaddrWithId();
|
|
await waku2.dial(nwakuMultiaddr);
|
|
|
|
await waku2.waitForPeers([Protocols.Relay]);
|
|
|
|
await delay(2000);
|
|
// Check that the two JS peers are NOT directly connected
|
|
expect(await waku.libp2p.peerStore.has(waku2.libp2p.peerId)).to.eq(false);
|
|
expect(await waku2.libp2p.peerStore.has(waku.libp2p.peerId)).to.eq(false);
|
|
|
|
const msgStr = "Hello there!";
|
|
const message = { payload: utf8ToBytes(msgStr) };
|
|
|
|
const waku2ReceivedMsgPromise: Promise<IDecodedMessage> = new Promise(
|
|
(resolve) => {
|
|
void waku2.relay.subscribeWithUnsubscribe(TestDecoder, resolve);
|
|
}
|
|
);
|
|
|
|
await waku.relay.send(TestEncoder, message);
|
|
const waku2ReceivedMsg = await waku2ReceivedMsgPromise;
|
|
|
|
expect(bytesToUtf8(waku2ReceivedMsg.payload)).to.eq(msgStr);
|
|
|
|
await tearDownNodes([], waku);
|
|
});
|
|
});
|