mirror of
https://github.com/status-im/js-waku.git
synced 2025-02-23 10:28:15 +00:00
Merge pull request #244 from status-im/remove-default-content-topic
This commit is contained in:
commit
aede51f752
@ -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
|
||||||
|
40
README.md
40
README.md
@ -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
|
||||||
|
@ -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 {
|
||||||
|
@ -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,
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
@ -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,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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}'`);
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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,
|
||||||
|
@ -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,
|
||||||
});
|
});
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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) => {
|
||||||
|
@ -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()),
|
||||||
}),
|
}),
|
||||||
]);
|
]);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user