logos-messaging-js/src/lib/waku_message/index.node.spec.ts

185 lines
5.6 KiB
TypeScript
Raw Normal View History

2022-02-04 14:12:00 +11:00
import { expect } from "chai";
import debug from "debug";
import {
makeLogFileName,
NimWaku,
NOISE_KEY_1,
WakuRelayMessage,
2022-02-04 14:12:00 +11:00
} from "../../test_utils";
2022-02-11 17:27:15 +11:00
import { delay } from "../../test_utils/delay";
2022-02-16 14:08:48 +11:00
import { bytesToUtf8, utf8ToBytes } from "../utf8";
import { bytesToHex, hexToBytes } from "../utils";
2022-02-04 14:12:00 +11:00
import { Protocols, Waku } from "../waku";
2021-03-12 14:23:21 +11:00
import {
generatePrivateKey,
generateSymmetricKey,
getPublicKey,
2022-02-04 14:12:00 +11:00
} from "./version_1";
2021-07-07 11:23:56 +10:00
2022-02-04 14:12:00 +11:00
import { WakuMessage } from "./index";
2022-02-04 14:12:00 +11:00
const dbg = debug("waku:test:message");
2021-03-10 16:22:49 +11:00
2022-02-04 14:12:00 +11:00
const TestContentTopic = "/test/1/waku-message/utf8";
2022-02-04 14:12:00 +11:00
describe("Waku Message [node only]", function () {
describe("Interop: Nim", function () {
2021-07-14 21:25:13 +10:00
let waku: Waku;
let nimWaku: NimWaku;
beforeEach(async function () {
this.timeout(30_000);
waku = await Waku.create({
staticNoiseKey: NOISE_KEY_1,
});
nimWaku = new NimWaku(makeLogFileName(this));
2022-02-04 14:12:00 +11:00
dbg("Starting nim-waku node");
2022-02-01 12:54:54 +11:00
await nimWaku.start({ rpcPrivate: true });
2022-02-04 14:12:00 +11:00
dbg("Dialing to nim-waku node");
await waku.dial(await nimWaku.getMultiaddrWithId());
2022-02-04 14:12:00 +11:00
dbg("Wait for remote peer");
2022-02-01 12:54:54 +11:00
await waku.waitForRemotePeer([Protocols.Relay]);
2022-02-04 14:12:00 +11:00
dbg("Remote peer ready");
2022-02-01 12:54:54 +11:00
// As this test uses the nim-waku RPC API, we somehow often face
// Race conditions where the nim-waku node does not have the js-waku
// Node in its relay mesh just yet.
await delay(500);
2021-07-14 21:25:13 +10:00
});
2021-07-07 11:23:56 +10:00
2021-07-14 21:25:13 +10:00
afterEach(async function () {
!!nimWaku && nimWaku.stop();
2022-02-04 14:12:00 +11:00
!!waku && waku.stop().catch((e) => console.log("Waku failed to stop", e));
2021-07-14 21:25:13 +10:00
});
2021-07-07 11:23:56 +10:00
2022-02-04 14:12:00 +11:00
it("JS decrypts nim message [asymmetric, no signature]", async function () {
this.timeout(5000);
2022-02-04 14:12:00 +11:00
const messageText = "Here is an encrypted message.";
2021-07-14 21:25:13 +10:00
const message: WakuRelayMessage = {
contentTopic: TestContentTopic,
2022-02-16 14:08:48 +11:00
payload: bytesToHex(utf8ToBytes(messageText)),
2021-07-14 21:25:13 +10:00
};
2021-07-14 21:25:13 +10:00
const privateKey = generatePrivateKey();
waku.relay.addDecryptionKey(privateKey);
2021-07-14 21:25:13 +10:00
const receivedMsgPromise: Promise<WakuMessage> = new Promise(
(resolve) => {
waku.relay.addObserver(resolve);
}
2021-07-14 21:25:13 +10:00
);
2021-07-14 21:25:13 +10:00
const publicKey = getPublicKey(privateKey);
2022-02-04 14:12:00 +11:00
dbg("Post message");
const res = await nimWaku.postAsymmetricMessage(message, publicKey);
expect(res).to.be.true;
2021-07-14 21:25:13 +10:00
const receivedMsg = await receivedMsgPromise;
2021-07-14 21:25:13 +10:00
expect(receivedMsg.contentTopic).to.eq(message.contentTopic);
expect(receivedMsg.version).to.eq(1);
expect(receivedMsg.payloadAsUtf8).to.eq(messageText);
});
2022-02-04 14:12:00 +11:00
it("Js encrypts message for nim [asymmetric, no signature]", async function () {
2021-07-14 21:25:13 +10:00
this.timeout(5000);
2022-02-04 14:12:00 +11:00
dbg("Ask nim-waku to generate asymmetric key pair");
2021-07-14 21:25:13 +10:00
const keyPair = await nimWaku.getAsymmetricKeyPair();
2022-02-14 10:50:02 +11:00
const privateKey = hexToBytes(keyPair.privateKey);
const publicKey = hexToBytes(keyPair.publicKey);
2022-02-04 14:12:00 +11:00
const messageText = "This is a message I am going to encrypt";
dbg("Encrypt message");
const message = await WakuMessage.fromUtf8String(
messageText,
TestContentTopic,
{
encPublicKey: publicKey,
}
);
2022-02-04 14:12:00 +11:00
dbg("Send message over relay");
2021-07-14 21:25:13 +10:00
await waku.relay.send(message);
2021-07-14 21:25:13 +10:00
let msgs: WakuRelayMessage[] = [];
2021-07-14 21:25:13 +10:00
while (msgs.length === 0) {
2022-02-04 14:12:00 +11:00
dbg("Wait for message to be seen by nim-waku");
2021-07-14 21:25:13 +10:00
await delay(200);
msgs = await nimWaku.getAsymmetricMessages(privateKey);
}
2022-02-04 14:12:00 +11:00
dbg("Check message content");
2021-07-14 21:25:13 +10:00
expect(msgs[0].contentTopic).to.equal(message.contentTopic);
2022-02-14 10:50:02 +11:00
expect(bytesToUtf8(hexToBytes(msgs[0].payload))).to.equal(messageText);
});
2022-02-04 14:12:00 +11:00
it("JS decrypts nim message [symmetric, no signature]", async function () {
this.timeout(5000);
2022-02-04 14:12:00 +11:00
const messageText = "Here is a message encrypted in a symmetric manner.";
const message: WakuRelayMessage = {
contentTopic: TestContentTopic,
2022-02-16 14:08:48 +11:00
payload: bytesToHex(utf8ToBytes(messageText)),
};
2022-02-04 14:12:00 +11:00
dbg("Generate symmetric key");
const symKey = generateSymmetricKey();
waku.relay.addDecryptionKey(symKey);
const receivedMsgPromise: Promise<WakuMessage> = new Promise(
(resolve) => {
waku.relay.addObserver(resolve);
}
);
2022-02-04 14:12:00 +11:00
dbg("Post message using nim-waku");
await nimWaku.postSymmetricMessage(message, symKey);
2022-02-04 14:12:00 +11:00
dbg("Wait for message to be received by js-waku");
const receivedMsg = await receivedMsgPromise;
2022-02-04 14:12:00 +11:00
dbg("Message received by js-waku");
expect(receivedMsg.contentTopic).to.eq(message.contentTopic);
expect(receivedMsg.version).to.eq(1);
expect(receivedMsg.payloadAsUtf8).to.eq(messageText);
});
2022-02-04 14:12:00 +11:00
it("Js encrypts message for nim [symmetric, no signature]", async function () {
this.timeout(5000);
2022-02-04 14:12:00 +11:00
dbg("Getting symmetric key from nim-waku");
const symKey = await nimWaku.getSymmetricKey();
2022-02-04 14:12:00 +11:00
dbg("Encrypting message with js-waku");
const messageText =
2022-02-04 14:12:00 +11:00
"This is a message I am going to encrypt with a symmetric key";
const message = await WakuMessage.fromUtf8String(
messageText,
TestContentTopic,
{
symKey: symKey,
}
);
2022-02-04 14:12:00 +11:00
dbg("Sending message over relay");
await waku.relay.send(message);
let msgs: WakuRelayMessage[] = [];
while (msgs.length === 0) {
await delay(200);
2022-02-04 14:12:00 +11:00
dbg("Getting messages from nim-waku");
msgs = await nimWaku.getSymmetricMessages(symKey);
}
expect(msgs[0].contentTopic).to.equal(message.contentTopic);
2022-02-14 10:50:02 +11:00
expect(bytesToUtf8(hexToBytes(msgs[0].payload))).to.equal(messageText);
});
});
});