js-waku/README.md

182 lines
5.9 KiB
Markdown
Raw Normal View History

2021-05-12 03:18:37 +00:00
# WakuJS
2021-05-12 03:18:37 +00:00
A JavaScript implementation of the [Waku v2 protocol](https://rfc.vac.dev/spec/10/).
2021-03-15 03:35:10 +00:00
2021-05-12 03:18:37 +00:00
## Usage
2021-05-10 06:52:53 +00:00
2021-05-13 00:36:28 +00:00
Install `waku-js` package:
2021-05-12 03:18:37 +00:00
```shell
2021-05-13 00:36:28 +00:00
npm install waku-js
2021-05-12 03:18:37 +00:00
```
Start a waku node:
```javascript
2021-05-13 00:36:28 +00:00
import { Waku } from 'waku-js';
2021-05-12 03:18:37 +00:00
const waku = await Waku.create();
```
Connect to a new peer:
```javascript
import { multiaddr } from 'multiaddr';
import PeerId from 'peer-id';
waku.libp2p.peerStore.addressBook.add(
PeerId.createFromB58String(
'16Uiu2HAmPLe7Mzm8TsYUubgCAW1aJoeFScxrLj8ppHFivPo97bUZ'
),
[multiaddr('/dns4/node-01.do-ams3.jdev.misc.statusim.net/tcp/7010/wss')]
);
```
The `contentTopic` is a metadata `string` that allows categorization of messages on the waku network.
Depending on your use case, you can either create a new `contentTopic` or look at the [RFCs](https://rfc.vac.dev/) and use an existing `contentTopic`.
See the [Waku v2 Message spec](https://rfc.vac.dev/spec/14/) for more details.
Listen to new messages received via [Waku v2 Relay](https://rfc.vac.dev/spec/11/), filtering the `contentTopic` to `waku/2/my-cool-app/proto`:
```javascript
waku.relay.addObserver((msg) => {
console.log("Message received:", msg.payloadAsUtf8)
}, ["waku/2/my-cool-app/proto"]);
```
Send a message on the waku relay network:
```javascript
2021-05-13 00:36:28 +00:00
import { WakuMessage } from 'waku-js';
2021-05-12 03:18:37 +00:00
const msg = WakuMessage.fromUtf8String("Here is a message!", "waku/2/my-cool-app/proto")
await waku.relay.send(msg);
```
The [Waku v2 Store protocol](https://rfc.vac.dev/spec/13/) enables full nodes to store messages received via relay
and clients to retrieve them (e.g. after resuming connectivity).
The protocol implements pagination meaning that it may take several queries to retrieve all messages.
Query a waku store peer to check historical messages:
```javascript
// Process messages once they are all retrieved:
const messages = await waku.store.queryHistory(storePeerId, ["waku/2/my-cool-app/proto"]);
messages.forEach((msg) => {
console.log("Message retrieved:", msg.payloadAsUtf8)
})
// Or, pass a callback function to be executed as pages are received:
waku.store.queryHistory(storePeerId, ["waku/2/my-cool-app/proto"],
(messages) => {
messages.forEach((msg) => {
console.log("Message retrieved:", msg.payloadAsUtf8)
})
});
```
Find more [examples](#examples) below
2021-05-13 00:42:14 +00:00
or checkout the latest `main` branch documentation at [https://status-im.github.io/waku-js/docs/](https://status-im.github.io/waku-js/docs/).
2021-05-10 06:52:53 +00:00
Docs can also be generated locally using:
```shell
npm install
npm run doc
```
## Waku Protocol Support
2021-05-13 00:42:14 +00:00
You can track progress on the [project board](https://github.com/status-im/waku-js/projects/1).
- ✔: Supported
- 🚧: Implementation in progress
- ⛔: Support is not planned
| Spec | Implementation Status |
| ---- | -------------- |
|[6/WAKU1](https://rfc.vac.dev/spec/6)|⛔|
|[7/WAKU-DATA](https://rfc.vac.dev/spec/7)|⛔|
|[8/WAKU-MAIL](https://rfc.vac.dev/spec/8)|⛔|
|[9/WAKU-RPC](https://rfc.vac.dev/spec/9)|⛔|
|[10/WAKU2](https://rfc.vac.dev/spec/10)|🚧|
|[11/WAKU2-RELAY](https://rfc.vac.dev/spec/11)|✔|
|[12/WAKU2-FILTER](https://rfc.vac.dev/spec/12)||
|[13/WAKU2-STORE](https://rfc.vac.dev/spec/13)|✔ (querying node only)|
|[14/WAKU2-MESSAGE](https://rfc.vac.dev/spec/14)|✔|
|[15/WAKU2-BRIDGE](https://rfc.vac.dev/spec/15)||
|[16/WAKU2-RPC](https://rfc.vac.dev/spec/16)|⛔|
|[17/WAKU2-RLNRELAY](https://rfc.vac.dev/spec/17)||
|[18/WAKU2-SWAP](https://rfc.vac.dev/spec/18)||
## Bugs, Questions & Features
2021-04-01 00:09:51 +00:00
2021-05-13 00:42:14 +00:00
If you encounter any bug or would like to propose new features, feel free to [open an issue](https://github.com/status-im/waku-js/issues/new/).
2021-05-13 00:42:14 +00:00
For support, questions & more general topics, please join the discussion on the [Vac forum](https://forum.vac.dev/tag/waku-js) (use _\#js-waku_ tag).
2021-04-01 00:09:51 +00:00
## Examples
2021-04-27 23:53:33 +00:00
## Web Chat App (ReactJS)
2021-05-12 03:18:37 +00:00
A ReactJS chat app is provided as a showcase of the library used in the browser.
2021-05-13 00:42:14 +00:00
A deployed version is available at https://status-im.github.io/waku-js/
2021-04-27 23:53:33 +00:00
2021-05-13 00:42:14 +00:00
Find the code in the [examples folder](https://github.com/status-im/waku-js/tree/main/examples/web-chat).
2021-05-12 03:18:37 +00:00
2021-04-27 23:53:33 +00:00
To run a development version locally, do:
```shell
2021-05-13 00:42:14 +00:00
git clone https://github.com/status-im/waku-js/ ; cd waku-js
npm install # Install dependencies for waku-js
npm run build # Build waku-js
2021-05-05 04:57:46 +00:00
cd examples/web-chat
npm install # Install dependencies for the web app
2021-05-13 00:42:14 +00:00
npm run start # Start development server to serve the web app on http://localhost:3000/waku-js
2021-04-27 23:53:33 +00:00
```
Use `/help` to see the available commands.
2021-04-27 23:53:33 +00:00
## CLI Chat App (NodeJS)
2021-04-01 00:09:51 +00:00
A node chat app is provided as a working example of the library.
It is interoperable with the [nim-waku chat app example](https://github.com/status-im/nim-waku/blob/master/examples/v2/chat2.nim).
2021-05-12 03:18:37 +00:00
2021-05-13 00:42:14 +00:00
Find the code in the [examples folder](https://github.com/status-im/waku-js/tree/main/examples/cli-chat).
2021-05-12 03:18:37 +00:00
2021-04-23 06:33:53 +00:00
To run the chat app, first ensure you have [Node.js](https://nodejs.org/en/) v14 or above:
```shell
node --version
```
Then, install and run:
2021-04-01 00:09:51 +00:00
```shell
2021-05-13 00:42:14 +00:00
git clone https://github.com/status-im/waku-js/ ; cd waku-js
npm install # Install dependencies for waku-js
npm run build # Build waku-js
2021-05-04 05:12:36 +00:00
cd examples/cli-chat
npm install # Install dependencies for the cli app
npm run start -- --staticNode /ip4/134.209.139.210/tcp/30303/p2p/16Uiu2HAmPLe7Mzm8TsYUubgCAW1aJoeFScxrLj8ppHFivPo97bUZ
2021-04-01 00:09:51 +00:00
```
2021-04-23 06:33:53 +00:00
You can also specify an optional `listenAddr` parameter (.e.g `--listenAddr /ip4/0.0.0.0/tcp/7777/ws`).
This is only useful if you want a remote node to dial to your chat app,
it is not necessary in normal usage when you just connect to the fleet.
## Contributing
See [CONTRIBUTING.md](./CONTRIBUTING.md).
2021-04-28 06:29:43 +00:00
## License
Licensed and distributed under either of
* MIT license: [LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT
or
* Apache License, Version 2.0, ([LICENSE-APACHE-v2](LICENSE-APACHE-v2) or http://www.apache.org/licenses/LICENSE-2.0)
at your option. These files may not be copied, modified, or distributed except according to those terms.