Merge pull request #244 from status-im/remove-default-content-topic

This commit is contained in:
Franck Royer 2021-07-28 12:34:06 +10:00 committed by GitHub
commit aede51f752
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 175 additions and 157 deletions

View File

@ -7,6 +7,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased] ## [Unreleased]
### Changed
- **Breaking**: The `WakuMessage` APIs have been changed to move `contentTopic` out of the optional parameters.
### Removed
- Examples (web-chat): Remove broken `/fleet` command.
- **Breaking**: Removed `DefaultContentTopic` as developers must choose a content topic for their app;
recommendations for content topic can be found at https://rfc.vac.dev/spec/23/.
## [0.9.0] - 2021-07-26 ## [0.9.0] - 2021-07-26
### Changed ### Changed

View File

@ -73,7 +73,7 @@ However, it does not give you any delivery information.
```ts ```ts
import { WakuMessage } from 'js-waku'; import { WakuMessage } from 'js-waku';
const msg = await WakuMessage.fromUtf8String("Here is a message!", { contentTopic: "/my-cool-app/1/my-use-case/proto" }) const msg = await WakuMessage.fromUtf8String("Here is a message!", "/my-cool-app/1/my-use-case/proto")
await waku.relay.send(msg); await waku.relay.send(msg);
``` ```
@ -157,19 +157,18 @@ const symKey = generatePrivateKey();
To encrypt your waku messages, simply pass the encryption key when creating it: To encrypt your waku messages, simply pass the encryption key when creating it:
```ts ```ts
import { WakuMessage } from 'js-waku'; import { WakuMessage } from "js-waku";
// Asymmetric // Asymmetric
const message = await WakuMessage.fromBytes(payload, { const message1 = await WakuMessage.fromBytes(payload, myAppContentTopic, {
contentTopic: myAppContentTopic, encPublicKey: publicKey,
encPublicKey: publicKey, });
});
// Symmetric // Symmetric
const message = await WakuMessage.fromBytes(payload, { const message2 = await WakuMessage.fromBytes(payload, myAppContentTopic, {
contentTopic: myAppContentTopic, symKey: symKey,
symKey: symKey, });
});
``` ```
#### Decrypt Waku Messages #### Decrypt Waku Messages
@ -212,23 +211,22 @@ In the case where your app does not need encryption then you could use symmetric
Signature keys can be generated the same way asymmetric keys for encryption are: Signature keys can be generated the same way asymmetric keys for encryption are:
```ts ```ts
import { generatePrivateKey, getPublicKey, WakuMessage } from 'js-waku'; import { generatePrivateKey, getPublicKey, WakuMessage } from "js-waku";
const signPrivateKey = generatePrivateKey(); const signPrivateKey = generatePrivateKey();
// Asymmetric Encryption // Asymmetric Encryption
const message = await WakuMessage.fromBytes(payload, { const message1 = await WakuMessage.fromBytes(payload, myAppContentTopic, {
contentTopic: myAppContentTopic, encPublicKey: recipientPublicKey,
encPublicKey: recipientPublicKey, sigPrivKey: signPrivateKey,
sigPrivKey: signPrivateKey });
});
// Symmetric Encryption // Symmetric Encryption
const message = await WakuMessage.fromBytes(payload, { const message2 = await WakuMessage.fromBytes(payload, myAppContentTopic, {
contentTopic: myAppContentTopic, encPublicKey: symKey,
encPublicKey: symKey, sigPrivKey: signPrivateKey,
sigPrivKey: signPrivateKey });
});
``` ```
#### Verify Waku Message signatures #### Verify Waku Message signatures

View File

@ -104,10 +104,13 @@ export default async function startChat(): Promise<void> {
rl.prompt(); rl.prompt();
const chatMessage = ChatMessage.fromUtf8String(new Date(), nick, line); const chatMessage = ChatMessage.fromUtf8String(new Date(), nick, line);
const msg = await WakuMessage.fromBytes(chatMessage.encode(), { const msg = await WakuMessage.fromBytes(
contentTopic: ChatContentTopic, chatMessage.encode(),
timestamp: new Date(), ChatContentTopic,
}); {
timestamp: new Date(),
}
);
if (opts.lightPush) { if (opts.lightPush) {
await waku.lightPush.push(msg); await waku.lightPush.push(msg);
} else { } else {

View File

@ -31,7 +31,7 @@ export default function BroadcastPublicKey({
console.error('Failed to send Public Key Message', e); console.error('Failed to send Public Key Message', e);
}); });
}) })
.catch((e) => { .catch(() => {
console.log('Failed to encode Public Key Message in Waku Message'); console.log('Failed to encode Public Key Message in Waku Message');
}); });
} else { } else {
@ -47,7 +47,7 @@ export default function BroadcastPublicKey({
console.error('Failed to send Public Key Message', e); console.error('Failed to send Public Key Message', e);
}); });
}) })
.catch((e) => { .catch(() => {
console.log( console.log(
'Failed to encode Public Key Message in Waku Message' 'Failed to encode Public Key Message in Waku Message'
); );
@ -75,7 +75,5 @@ async function encodePublicKeyWakuMessage(
publicKeyMessage: PublicKeyMessage publicKeyMessage: PublicKeyMessage
): Promise<WakuMessage> { ): Promise<WakuMessage> {
const payload = publicKeyMessage.encode(); const payload = publicKeyMessage.encode();
return await WakuMessage.fromBytes(payload, { return await WakuMessage.fromBytes(payload, PublicKeyContentTopic);
contentTopic: PublicKeyContentTopic,
});
} }

View File

@ -115,8 +115,7 @@ async function encodeEncryptedWakuMessage(
}); });
const payload = directMsg.encode(); const payload = directMsg.encode();
return WakuMessage.fromBytes(payload, { return WakuMessage.fromBytes(payload, DirectMessageContentTopic, {
contentTopic: DirectMessageContentTopic,
encPublicKey: publicKey, encPublicKey: publicKey,
}); });
} }

View File

@ -2,8 +2,8 @@ import PeerId from 'peer-id';
import { useEffect, useState } from 'react'; import { useEffect, useState } from 'react';
import './App.css'; import './App.css';
import { import {
getStatusFleetNodes,
Environment, Environment,
getStatusFleetNodes,
StoreCodec, StoreCodec,
Waku, Waku,
WakuMessage, WakuMessage,
@ -81,17 +81,16 @@ export default function App() {
const persistedNick = window.localStorage.getItem('nick'); const persistedNick = window.localStorage.getItem('nick');
return persistedNick !== null ? persistedNick : generate(); return persistedNick !== null ? persistedNick : generate();
}); });
const [fleetEnv, setFleetEnv] = useState<Environment>(defaultFleetEnv);
useEffect(() => { useEffect(() => {
localStorage.setItem('nick', nick); localStorage.setItem('nick', nick);
}, [nick]); }, [nick]);
useEffect(() => { useEffect(() => {
initWaku(fleetEnv, setWaku) initWaku(setWaku)
.then(() => console.log('Waku init done')) .then(() => console.log('Waku init done'))
.catch((e) => console.log('Waku init failed ', e)); .catch((e) => console.log('Waku init failed ', e));
}, [fleetEnv]); }, []);
useEffect(() => { useEffect(() => {
if (!waku) return; if (!waku) return;
@ -160,15 +159,8 @@ export default function App() {
nick={nick} nick={nick}
newMessages={newMessages} newMessages={newMessages}
archivedMessages={archivedMessages} archivedMessages={archivedMessages}
fleetEnv={fleetEnv}
commandHandler={(input: string) => { commandHandler={(input: string) => {
const { command, response } = handleCommand( const { command, response } = handleCommand(input, waku, setNick);
input,
waku,
setNick,
fleetEnv,
setFleetEnv
);
const commandMessages = response.map((msg) => { const commandMessages = response.map((msg) => {
return Message.fromUtf8String(command, msg); return Message.fromUtf8String(command, msg);
}); });
@ -181,7 +173,7 @@ export default function App() {
); );
} }
async function initWaku(fleetEnv: Environment, setter: (waku: Waku) => void) { async function initWaku(setter: (waku: Waku) => void) {
try { try {
const waku = await Waku.create({ const waku = await Waku.create({
libp2p: { libp2p: {
@ -196,7 +188,7 @@ async function initWaku(fleetEnv: Environment, setter: (waku: Waku) => void) {
setter(waku); setter(waku);
const nodes = await getStatusFleetNodes(fleetEnv); const nodes = await getStatusFleetNodes(selectFleetEnv());
await Promise.all( await Promise.all(
nodes.map((addr) => { nodes.map((addr) => {
return waku.dial(addr); return waku.dial(addr);
@ -207,7 +199,7 @@ async function initWaku(fleetEnv: Environment, setter: (waku: Waku) => void) {
} }
} }
function defaultFleetEnv() { function selectFleetEnv() {
// Works with react-scripts // Works with react-scripts
if (process?.env?.NODE_ENV === 'development') { if (process?.env?.NODE_ENV === 'development') {
return Environment.Test; return Environment.Test;

View File

@ -1,4 +1,4 @@
import { ChatMessage, Environment, WakuMessage } from 'js-waku'; import { ChatMessage, WakuMessage } from 'js-waku';
import { ChatContentTopic } from './App'; import { ChatContentTopic } from './App';
import ChatList from './ChatList'; import ChatList from './ChatList';
import MessageInput from './MessageInput'; import MessageInput from './MessageInput';
@ -11,7 +11,6 @@ interface Props {
archivedMessages: Message[]; archivedMessages: Message[];
commandHandler: (cmd: string) => void; commandHandler: (cmd: string) => void;
nick: string; nick: string;
fleetEnv: Environment;
} }
export default function Room(props: Props) { export default function Room(props: Props) {
@ -30,7 +29,7 @@ export default function Room(props: Props) {
style={{ height: '98vh', display: 'flex', flexDirection: 'column' }} style={{ height: '98vh', display: 'flex', flexDirection: 'column' }}
> >
<TitleBar <TitleBar
leftIcons={`Peers: ${relayPeers} relay, ${storePeers} store. Fleet: ${props.fleetEnv}`} leftIcons={`Peers: ${relayPeers} relay, ${storePeers} store.`}
title="Waku v2 chat app" title="Waku v2 chat app"
/> />
<ChatList <ChatList
@ -66,10 +65,11 @@ async function handleMessage(
} else { } else {
const timestamp = new Date(); const timestamp = new Date();
const chatMessage = ChatMessage.fromUtf8String(timestamp, nick, message); const chatMessage = ChatMessage.fromUtf8String(timestamp, nick, message);
const wakuMsg = await WakuMessage.fromBytes(chatMessage.encode(), { const wakuMsg = await WakuMessage.fromBytes(
contentTopic: ChatContentTopic, chatMessage.encode(),
timestamp, ChatContentTopic,
}); { timestamp }
);
return messageSender(wakuMsg); return messageSender(wakuMsg);
} }
} }

View File

@ -1,13 +1,12 @@
import { multiaddr } from 'multiaddr'; import { multiaddr } from 'multiaddr';
import PeerId from 'peer-id'; import PeerId from 'peer-id';
import { Environment, Waku } from 'js-waku'; import { Waku } from 'js-waku';
function help(): string[] { function help(): string[] {
return [ return [
'/nick <nickname>: set a new nickname', '/nick <nickname>: set a new nickname',
'/info: some information about the node', '/info: some information about the node',
'/connect <Multiaddr>: connect to the given peer', '/connect <Multiaddr>: connect to the given peer',
'/fleet <prod|test>: connect to this fleet; beware it restarts waku node.',
'/help: Display this help', '/help: Display this help',
]; ];
} }
@ -23,14 +22,11 @@ function nick(
return [`New nick: ${nick}`]; return [`New nick: ${nick}`];
} }
function info(waku: Waku | undefined, fleetEnv: Environment): string[] { function info(waku: Waku | undefined): string[] {
if (!waku) { if (!waku) {
return ['Waku node is starting']; return ['Waku node is starting'];
} }
return [ return [`PeerId: ${waku.libp2p.peerId.toB58String()}`];
`PeerId: ${waku.libp2p.peerId.toB58String()}`,
`Fleet environment: ${fleetEnv}`,
];
} }
function connect(peer: string | undefined, waku: Waku | undefined): string[] { function connect(peer: string | undefined, waku: Waku | undefined): string[] {
@ -82,28 +78,6 @@ function peers(waku: Waku | undefined): string[] {
return response; return response;
} }
function fleet(
newFleetEnv: string | undefined,
currFleetEnv: Environment,
setFleetEnv: (fleetEnv: Environment) => void
): string[] {
switch (newFleetEnv) {
case Environment.Test:
setFleetEnv(newFleetEnv);
break;
case Environment.Prod:
setFleetEnv(newFleetEnv);
break;
default:
return [
`Incorrect values, acceptable values are ${Environment.Test}, ${Environment.Prod}`,
`Current fleet environment is ${currFleetEnv}`,
];
}
return [`New fleet Environment: ${newFleetEnv}`];
}
function connections(waku: Waku | undefined): string[] { function connections(waku: Waku | undefined): string[] {
if (!waku) { if (!waku) {
return ['Waku node is starting']; return ['Waku node is starting'];
@ -133,9 +107,7 @@ function connections(waku: Waku | undefined): string[] {
export default function handleCommand( export default function handleCommand(
input: string, input: string,
waku: Waku | undefined, waku: Waku | undefined,
setNick: (nick: string) => void, setNick: (nick: string) => void
currFleetEnv: Environment,
setFleetEnv: (fleetEnv: Environment) => void
): { command: string; response: string[] } { ): { command: string; response: string[] } {
let response: string[] = []; let response: string[] = [];
const args = parseInput(input); const args = parseInput(input);
@ -148,7 +120,7 @@ export default function handleCommand(
nick(args.shift(), setNick).map((str) => response.push(str)); nick(args.shift(), setNick).map((str) => response.push(str));
break; break;
case '/info': case '/info':
info(waku, currFleetEnv).map((str) => response.push(str)); info(waku).map((str) => response.push(str));
break; break;
case '/connect': case '/connect':
connect(args.shift(), waku).map((str) => response.push(str)); connect(args.shift(), waku).map((str) => response.push(str));
@ -159,11 +131,6 @@ export default function handleCommand(
case '/connections': case '/connections':
connections(waku).map((str) => response.push(str)); connections(waku).map((str) => response.push(str));
break; break;
case '/fleet':
fleet(args.shift(), currFleetEnv, setFleetEnv).map((str) =>
response.push(str)
);
break;
default: default:
response.push(`Unknown Command '${command}'`); response.push(`Unknown Command '${command}'`);
} }

View File

@ -246,9 +246,9 @@ export class Waku {
if (relayPeriodSecs !== 0) { if (relayPeriodSecs !== 0) {
this.relayKeepAliveTimers[peerIdStr] = setInterval(() => { this.relayKeepAliveTimers[peerIdStr] = setInterval(() => {
WakuMessage.fromBytes(new Uint8Array(), { WakuMessage.fromBytes(new Uint8Array(), RelayPingContentTopic).then(
contentTopic: RelayPingContentTopic, (wakuMsg) => this.relay.send(wakuMsg)
}).then((wakuMsg) => this.relay.send(wakuMsg)); );
}, relayPeriodSecs * 1000); }, relayPeriodSecs * 1000);
} }
} }

View File

@ -8,6 +8,8 @@ import { delay } from '../delay';
import { Waku } from '../waku'; import { Waku } from '../waku';
import { WakuMessage } from '../waku_message'; import { WakuMessage } from '../waku_message';
const TestContentTopic = '/test/1/waku-light-push/utf8';
describe('Waku Light Push', () => { describe('Waku Light Push', () => {
let waku: Waku; let waku: Waku;
let nimWaku: NimWaku; let nimWaku: NimWaku;
@ -35,7 +37,10 @@ describe('Waku Light Push', () => {
}); });
const messageText = 'Light Push works!'; const messageText = 'Light Push works!';
const message = await WakuMessage.fromUtf8String(messageText); const message = await WakuMessage.fromUtf8String(
messageText,
TestContentTopic
);
const pushResponse = await waku.lightPush.push(message); const pushResponse = await waku.lightPush.push(message);
expect(pushResponse?.isSuccess).to.be.true; expect(pushResponse?.isSuccess).to.be.true;
@ -75,7 +80,10 @@ describe('Waku Light Push', () => {
const nimPeerId = await nimWaku.getPeerId(); const nimPeerId = await nimWaku.getPeerId();
const messageText = 'Light Push works!'; const messageText = 'Light Push works!';
const message = await WakuMessage.fromUtf8String(messageText); const message = await WakuMessage.fromUtf8String(
messageText,
TestContentTopic
);
const pushResponse = await waku.lightPush.push(message, { const pushResponse = await waku.lightPush.push(message, {
peerId: nimPeerId, peerId: nimPeerId,

View File

@ -1,14 +1,17 @@
import { expect } from 'chai'; import { expect } from 'chai';
import fc from 'fast-check'; import fc from 'fast-check';
import { WakuMessage } from '../../lib/waku_message'; import { getPublicKey } from './version_1';
import { getPublicKey } from '../../lib/waku_message/version_1';
import { WakuMessage } from './index';
const TestContentTopic = '/test/1/waku-message/utf8';
describe('Waku Message: Browser & Node', function () { describe('Waku Message: Browser & Node', function () {
it('Waku message round trip binary serialization [clear]', async function () { it('Waku message round trip binary serialization [clear]', async function () {
await fc.assert( await fc.assert(
fc.asyncProperty(fc.string(), async (s) => { fc.asyncProperty(fc.string(), async (s) => {
const msg = await WakuMessage.fromUtf8String(s); const msg = await WakuMessage.fromUtf8String(s, TestContentTopic);
const binary = msg.encode(); const binary = msg.encode();
const actual = await WakuMessage.decode(binary); const actual = await WakuMessage.decode(binary);
@ -20,7 +23,7 @@ describe('Waku Message: Browser & Node', function () {
it('Payload to utf-8', async function () { it('Payload to utf-8', async function () {
await fc.assert( await fc.assert(
fc.asyncProperty(fc.string(), async (s) => { fc.asyncProperty(fc.string(), async (s) => {
const msg = await WakuMessage.fromUtf8String(s); const msg = await WakuMessage.fromUtf8String(s, TestContentTopic);
const utf8 = msg.payloadAsUtf8; const utf8 = msg.payloadAsUtf8;
return utf8 === s; return utf8 === s;
@ -36,7 +39,7 @@ describe('Waku Message: Browser & Node', function () {
async (payload, privKey) => { async (payload, privKey) => {
const publicKey = getPublicKey(privKey); const publicKey = getPublicKey(privKey);
const msg = await WakuMessage.fromBytes(payload, { const msg = await WakuMessage.fromBytes(payload, TestContentTopic, {
encPublicKey: publicKey, encPublicKey: publicKey,
}); });
@ -59,7 +62,7 @@ describe('Waku Message: Browser & Node', function () {
const sigPubKey = getPublicKey(sigPrivKey); const sigPubKey = getPublicKey(sigPrivKey);
const encPubKey = getPublicKey(encPrivKey); const encPubKey = getPublicKey(encPrivKey);
const msg = await WakuMessage.fromBytes(payload, { const msg = await WakuMessage.fromBytes(payload, TestContentTopic, {
encPublicKey: encPubKey, encPublicKey: encPubKey,
sigPrivKey: sigPrivKey, sigPrivKey: sigPrivKey,
}); });
@ -80,7 +83,7 @@ describe('Waku Message: Browser & Node', function () {
fc.uint8Array({ minLength: 1 }), fc.uint8Array({ minLength: 1 }),
fc.uint8Array({ minLength: 32, maxLength: 32 }), fc.uint8Array({ minLength: 32, maxLength: 32 }),
async (payload, key) => { async (payload, key) => {
const msg = await WakuMessage.fromBytes(payload, { const msg = await WakuMessage.fromBytes(payload, TestContentTopic, {
symKey: key, symKey: key,
}); });
@ -102,7 +105,7 @@ describe('Waku Message: Browser & Node', function () {
async (payload, sigPrivKey, symKey) => { async (payload, sigPrivKey, symKey) => {
const sigPubKey = getPublicKey(sigPrivKey); const sigPubKey = getPublicKey(sigPrivKey);
const msg = await WakuMessage.fromBytes(payload, { const msg = await WakuMessage.fromBytes(payload, TestContentTopic, {
symKey: symKey, symKey: symKey,
sigPrivKey: sigPrivKey, sigPrivKey: sigPrivKey,
}); });

View File

@ -16,10 +16,12 @@ import { Waku } from '../waku';
import { generatePrivateKey, getPublicKey } from './version_1'; import { generatePrivateKey, getPublicKey } from './version_1';
import { DefaultContentTopic, WakuMessage } from './index'; import { WakuMessage } from './index';
const dbg = debug('waku:test:message'); const dbg = debug('waku:test:message');
const TestContentTopic = '/test/1/waku-message/utf8';
describe('Waku Message: Node only', function () { describe('Waku Message: Node only', function () {
describe('Interop: Nim', function () { describe('Interop: Nim', function () {
let waku: Waku; let waku: Waku;
@ -56,7 +58,7 @@ describe('Waku Message: Node only', function () {
const messageText = 'Here is an encrypted message.'; const messageText = 'Here is an encrypted message.';
const message: WakuRelayMessage = { const message: WakuRelayMessage = {
contentTopic: DefaultContentTopic, contentTopic: TestContentTopic,
payload: Buffer.from(messageText, 'utf-8').toString('hex'), payload: Buffer.from(messageText, 'utf-8').toString('hex'),
}; };
@ -89,9 +91,13 @@ describe('Waku Message: Node only', function () {
const publicKey = hexToBuf(keyPair.publicKey); const publicKey = hexToBuf(keyPair.publicKey);
const messageText = 'This is a message I am going to encrypt'; const messageText = 'This is a message I am going to encrypt';
const message = await WakuMessage.fromUtf8String(messageText, { const message = await WakuMessage.fromUtf8String(
encPublicKey: publicKey, messageText,
}); TestContentTopic,
{
encPublicKey: publicKey,
}
);
await waku.relay.send(message); await waku.relay.send(message);
@ -112,7 +118,7 @@ describe('Waku Message: Node only', function () {
const messageText = 'Here is a message encrypted in a symmetric manner.'; const messageText = 'Here is a message encrypted in a symmetric manner.';
const message: WakuRelayMessage = { const message: WakuRelayMessage = {
contentTopic: DefaultContentTopic, contentTopic: TestContentTopic,
payload: Buffer.from(messageText, 'utf-8').toString('hex'), payload: Buffer.from(messageText, 'utf-8').toString('hex'),
}; };
@ -143,9 +149,13 @@ describe('Waku Message: Node only', function () {
const messageText = const messageText =
'This is a message I am going to encrypt with a symmetric key'; 'This is a message I am going to encrypt with a symmetric key';
const message = await WakuMessage.fromUtf8String(messageText, { const message = await WakuMessage.fromUtf8String(
symKey: symKey, messageText,
}); TestContentTopic,
{
symKey: symKey,
}
);
await waku.relay.send(message); await waku.relay.send(message);

View File

@ -9,16 +9,10 @@ import * as proto from '../../proto/waku/v2/message';
import * as version_1 from './version_1'; import * as version_1 from './version_1';
export const DefaultContentTopic = '/waku/2/default-content/proto';
const DefaultVersion = 0; const DefaultVersion = 0;
const dbg = debug('waku:message'); const dbg = debug('waku:message');
export interface Options { export interface Options {
/**
* Content topic to set on the message, defaults to {@link DefaultContentTopic}
* if not passed.
*/
contentTopic?: string;
/** /**
* Timestamp to set on the message, defaults to now if not passed. * Timestamp to set on the message, defaults to now if not passed.
*/ */
@ -54,10 +48,11 @@ export class WakuMessage {
*/ */
static async fromUtf8String( static async fromUtf8String(
utf8: string, utf8: string,
contentTopic: string,
opts?: Options opts?: Options
): Promise<WakuMessage> { ): Promise<WakuMessage> {
const payload = Buffer.from(utf8, 'utf-8'); const payload = Buffer.from(utf8, 'utf-8');
return WakuMessage.fromBytes(payload, opts); return WakuMessage.fromBytes(payload, contentTopic, opts);
} }
/** /**
@ -74,13 +69,13 @@ export class WakuMessage {
*/ */
static async fromBytes( static async fromBytes(
payload: Uint8Array, payload: Uint8Array,
contentTopic: string,
opts?: Options opts?: Options
): Promise<WakuMessage> { ): Promise<WakuMessage> {
const { timestamp, contentTopic, encPublicKey, symKey, sigPrivKey } = const { timestamp, encPublicKey, symKey, sigPrivKey } = Object.assign(
Object.assign( { timestamp: new Date() },
{ timestamp: new Date(), contentTopic: DefaultContentTopic }, opts ? opts : {}
opts ? opts : {} );
);
let _payload = payload; let _payload = payload;
let version = DefaultVersion; let version = DefaultVersion;

View File

@ -18,6 +18,8 @@ import { DefaultPubsubTopic } from './index';
const log = debug('waku:test'); const log = debug('waku:test');
const TestContentTopic = '/test/1/waku-relay/utf8';
describe('Waku Relay', () => { describe('Waku Relay', () => {
describe('js only', () => { describe('js only', () => {
afterEach(function () { afterEach(function () {
@ -81,9 +83,13 @@ describe('Waku Relay', () => {
const messageText = 'JS to JS communication works'; const messageText = 'JS to JS communication works';
const messageTimestamp = new Date('1995-12-17T03:24:00'); const messageTimestamp = new Date('1995-12-17T03:24:00');
const message = await WakuMessage.fromUtf8String(messageText, { const message = await WakuMessage.fromUtf8String(
timestamp: messageTimestamp, messageText,
}); TestContentTopic,
{
timestamp: messageTimestamp,
}
);
const receivedMsgPromise: Promise<WakuMessage> = new Promise( const receivedMsgPromise: Promise<WakuMessage> = new Promise(
(resolve) => { (resolve) => {
@ -108,12 +114,14 @@ describe('Waku Relay', () => {
const fooMessageText = 'Published on content topic foo'; const fooMessageText = 'Published on content topic foo';
const barMessageText = 'Published on content topic bar'; const barMessageText = 'Published on content topic bar';
const fooMessage = await WakuMessage.fromUtf8String(fooMessageText, { const fooMessage = await WakuMessage.fromUtf8String(
contentTopic: 'foo', fooMessageText,
}); 'foo'
const barMessage = await WakuMessage.fromUtf8String(barMessageText, { );
contentTopic: 'bar', const barMessage = await WakuMessage.fromUtf8String(
}); barMessageText,
'bar'
);
const receivedBarMsgPromise: Promise<WakuMessage> = new Promise( const receivedBarMsgPromise: Promise<WakuMessage> = new Promise(
(resolve) => { (resolve) => {
@ -148,9 +156,10 @@ describe('Waku Relay', () => {
const messageText = const messageText =
'Published on content topic with added then deleted observer'; 'Published on content topic with added then deleted observer';
const message = await WakuMessage.fromUtf8String(messageText, { const message = await WakuMessage.fromUtf8String(
contentTopic: 'added-then-deleted-observer', messageText,
}); 'added-then-deleted-observer'
);
// The promise **fails** if we receive a message on this observer. // The promise **fails** if we receive a message on this observer.
const receivedMsgPromise: Promise<WakuMessage> = new Promise( const receivedMsgPromise: Promise<WakuMessage> = new Promise(
@ -207,7 +216,10 @@ describe('Waku Relay', () => {
]); ]);
const messageText = 'Communicating using a custom pubsub topic'; const messageText = 'Communicating using a custom pubsub topic';
const message = await WakuMessage.fromUtf8String(messageText); const message = await WakuMessage.fromUtf8String(
messageText,
TestContentTopic
);
const waku2ReceivedMsgPromise: Promise<WakuMessage> = new Promise( const waku2ReceivedMsgPromise: Promise<WakuMessage> = new Promise(
(resolve) => { (resolve) => {
@ -278,7 +290,10 @@ describe('Waku Relay', () => {
this.timeout(5000); this.timeout(5000);
const messageText = 'This is a message'; const messageText = 'This is a message';
const message = await WakuMessage.fromUtf8String(messageText); const message = await WakuMessage.fromUtf8String(
messageText,
TestContentTopic
);
await waku.relay.send(message); await waku.relay.send(message);
@ -297,7 +312,10 @@ describe('Waku Relay', () => {
it('Nim publishes to js', async function () { it('Nim publishes to js', async function () {
this.timeout(5000); this.timeout(5000);
const messageText = 'Here is another message.'; const messageText = 'Here is another message.';
const message = await WakuMessage.fromUtf8String(messageText); const message = await WakuMessage.fromUtf8String(
messageText,
TestContentTopic
);
const receivedMsgPromise: Promise<WakuMessage> = new Promise( const receivedMsgPromise: Promise<WakuMessage> = new Promise(
(resolve) => { (resolve) => {
@ -363,7 +381,10 @@ describe('Waku Relay', () => {
this.timeout(30000); this.timeout(30000);
const messageText = 'This is a message'; const messageText = 'This is a message';
const message = await WakuMessage.fromUtf8String(messageText); const message = await WakuMessage.fromUtf8String(
messageText,
TestContentTopic
);
await delay(1000); await delay(1000);
await waku.relay.send(message); await waku.relay.send(message);
@ -384,7 +405,10 @@ describe('Waku Relay', () => {
await delay(200); await delay(200);
const messageText = 'Here is another message.'; const messageText = 'Here is another message.';
const message = await WakuMessage.fromUtf8String(messageText); const message = await WakuMessage.fromUtf8String(
messageText,
TestContentTopic
);
const receivedMsgPromise: Promise<WakuMessage> = new Promise( const receivedMsgPromise: Promise<WakuMessage> = new Promise(
(resolve) => { (resolve) => {
@ -466,7 +490,10 @@ describe('Waku Relay', () => {
).to.be.false; ).to.be.false;
const msgStr = 'Hello there!'; const msgStr = 'Hello there!';
const message = await WakuMessage.fromUtf8String(msgStr); const message = await WakuMessage.fromUtf8String(
msgStr,
TestContentTopic
);
const waku2ReceivedMsgPromise: Promise<WakuMessage> = new Promise( const waku2ReceivedMsgPromise: Promise<WakuMessage> = new Promise(
(resolve) => { (resolve) => {

View File

@ -12,13 +12,15 @@ import {
} from '../../test_utils'; } from '../../test_utils';
import { delay } from '../delay'; import { delay } from '../delay';
import { Waku } from '../waku'; import { Waku } from '../waku';
import { DefaultContentTopic, WakuMessage } from '../waku_message'; import { WakuMessage } from '../waku_message';
import { generatePrivateKey, getPublicKey } from '../waku_message/version_1'; import { generatePrivateKey, getPublicKey } from '../waku_message/version_1';
import { Direction } from './history_rpc'; import { Direction } from './history_rpc';
const dbg = debug('waku:test:store'); const dbg = debug('waku:test:store');
const TestContentTopic = '/test/1/waku-store/utf8';
describe('Waku Store', () => { describe('Waku Store', () => {
let waku: Waku; let waku: Waku;
let nimWaku: NimWaku; let nimWaku: NimWaku;
@ -37,7 +39,7 @@ describe('Waku Store', () => {
for (let i = 0; i < 2; i++) { for (let i = 0; i < 2; i++) {
expect( expect(
await nimWaku.sendMessage( await nimWaku.sendMessage(
await WakuMessage.fromUtf8String(`Message ${i}`) await WakuMessage.fromUtf8String(`Message ${i}`, TestContentTopic)
) )
).to.be.true; ).to.be.true;
} }
@ -73,7 +75,7 @@ describe('Waku Store', () => {
for (let i = 0; i < 15; i++) { for (let i = 0; i < 15; i++) {
expect( expect(
await nimWaku.sendMessage( await nimWaku.sendMessage(
await WakuMessage.fromUtf8String(`Message ${i}`) await WakuMessage.fromUtf8String(`Message ${i}`, TestContentTopic)
) )
).to.be.true; ).to.be.true;
} }
@ -90,7 +92,7 @@ describe('Waku Store', () => {
}); });
const messages = await waku.store.queryHistory({ const messages = await waku.store.queryHistory({
contentTopics: [DefaultContentTopic], contentTopics: [],
direction: Direction.FORWARD, direction: Direction.FORWARD,
}); });
@ -114,7 +116,7 @@ describe('Waku Store', () => {
for (let i = 0; i < 2; i++) { for (let i = 0; i < 2; i++) {
expect( expect(
await nimWaku.sendMessage( await nimWaku.sendMessage(
await WakuMessage.fromUtf8String(`Message ${i}`), await WakuMessage.fromUtf8String(`Message ${i}`, TestContentTopic),
customPubSubTopic customPubSubTopic
) )
).to.be.true; ).to.be.true;
@ -171,14 +173,22 @@ describe('Waku Store', () => {
clearMessage, clearMessage,
otherEncMessage, otherEncMessage,
] = await Promise.all([ ] = await Promise.all([
WakuMessage.fromUtf8String(encryptedAsymmetricMessageText, { WakuMessage.fromUtf8String(
encPublicKey: publicKey, encryptedAsymmetricMessageText,
}), TestContentTopic,
WakuMessage.fromUtf8String(encryptedSymmetricMessageText, { {
symKey: symKey, encPublicKey: publicKey,
}), }
WakuMessage.fromUtf8String(clearMessageText), ),
WakuMessage.fromUtf8String(otherEncMessageText, { WakuMessage.fromUtf8String(
encryptedSymmetricMessageText,
TestContentTopic,
{
symKey: symKey,
}
),
WakuMessage.fromUtf8String(clearMessageText, TestContentTopic),
WakuMessage.fromUtf8String(otherEncMessageText, TestContentTopic, {
encPublicKey: getPublicKey(generatePrivateKey()), encPublicKey: getPublicKey(generatePrivateKey()),
}), }),
]); ]);