mirror of
https://github.com/logos-messaging/docs.waku.org.git
synced 2026-01-02 21:03:13 +00:00
* Split website in 4: - build - run node - learn - research * only show pages of section in sidebar * home button on each sidebar * index.md for homepages * Add video tutorials * delete old getting-started * rename to "Waku node" * fix nwaku compose * add to dict * script revert research changes * fix broken links * move research index content * move research folder under learn * move research folder under learn: side bar and buttons * remove pointless links
199 lines
6.7 KiB
Markdown
199 lines
6.7 KiB
Markdown
---
|
|
title: Send and Receive Messages Using Light Push and Filter
|
|
hide_table_of_contents: true
|
|
displayed_sidebar: build
|
|
---
|
|
|
|
This guide provides detailed steps to start using the `@waku/sdk` package by setting up a [Light Node](/learn/glossary#light-node) to send messages using the [Light Push protocol](/learn/concepts/protocols#light-push), and receive messages using the [Filter protocol](/learn/concepts/protocols#filter). Have a look at the [installation guide](/build/javascript/#installation) for steps on adding `@waku/sdk` to your project.
|
|
|
|
## Create a light node
|
|
|
|
Use the `createLightNode()` function to create a [Light Node](/learn/glossary#light-node) and interact with the Waku Network:
|
|
|
|
```js
|
|
import { createLightNode } from "@waku/sdk";
|
|
|
|
// Create and start a Light Node
|
|
const node = await createLightNode({ defaultBootstrap: true });
|
|
await node.start();
|
|
|
|
// Use the stop() function to stop a running node
|
|
// await node.stop();
|
|
```
|
|
|
|
:::info
|
|
When the `defaultBootstrap` parameter is set to `true`, your node will be bootstrapped using the [default bootstrap method](/build/javascript/configure-discovery#default-bootstrap-method). Have a look at the [Bootstrap Nodes and Discover Peers](/build/javascript/configure-discovery) guide to learn more methods to bootstrap nodes.
|
|
:::
|
|
|
|
A node needs to know how to route messages. By default, it will use The Waku Network configuration (`{ clusterId: 1, shards: [0,1,2,3,4,5,6,7] }`). For most applications, it's recommended to use autosharding:
|
|
|
|
```js
|
|
// Create node with auto sharding (recommended)
|
|
const node = await createLightNode({
|
|
defaultBootstrap: true,
|
|
networkConfig: {
|
|
clusterId: 1,
|
|
contentTopics: ["/my-app/1/notifications/proto"],
|
|
},
|
|
});
|
|
```
|
|
|
|
### Alternative network configuration
|
|
|
|
If your project requires a specific network configuration, you can use static sharding:
|
|
|
|
```js
|
|
// Create node with static sharding
|
|
const node = await createLightNode({
|
|
defaultBootstrap: true,
|
|
networkConfig: {
|
|
clusterId: 1,
|
|
shards: [0, 1, 2, 3],
|
|
},
|
|
});
|
|
```
|
|
|
|
## Connect to remote peers
|
|
|
|
Use the `node.waitForPeers()` function to wait for the node to connect with peers on the Waku Network:
|
|
|
|
```js
|
|
// Wait for a successful peer connection
|
|
await node.waitForPeers();
|
|
```
|
|
|
|
The `protocols` parameter allows you to specify the [protocols](/learn/concepts/protocols) that the remote peers should have enabled:
|
|
|
|
```js
|
|
import { Protocols } from "@waku/sdk";
|
|
|
|
// Wait for peer connections with specific protocols
|
|
await node.waitForPeers([Protocols.LightPush, Protocols.Filter]);
|
|
```
|
|
|
|
## Choose a content topic
|
|
|
|
Choose a [content topic](/learn/concepts/content-topics) for your application and create a message `encoder` and `decoder`:
|
|
|
|
```js
|
|
import { createEncoder, createDecoder } from "@waku/sdk";
|
|
|
|
// Choose a content topic
|
|
const contentTopic = "/light-guide/1/message/proto";
|
|
|
|
// Create a message encoder and decoder
|
|
const encoder = createEncoder({ contentTopic });
|
|
const decoder = createDecoder(contentTopic);
|
|
```
|
|
|
|
The `ephemeral` parameter allows you to specify whether messages should **NOT** be stored by [Store peers](/build/javascript/store-retrieve-messages):
|
|
|
|
```js
|
|
const encoder = createEncoder({
|
|
contentTopic: contentTopic, // message content topic
|
|
ephemeral: true, // allows messages NOT be stored on the network
|
|
});
|
|
```
|
|
|
|
The `pubsubTopicShardInfo` parameter allows you to configure a different network configuration for your `encoder` and `decoder`:
|
|
|
|
```js
|
|
// Create the network config
|
|
const networkConfig = { clusterId: 3, shards: [1, 2] };
|
|
|
|
// Create encoder and decoder with custom network config
|
|
const encoder = createEncoder({
|
|
contentTopic: contentTopic,
|
|
pubsubTopicShardInfo: networkConfig,
|
|
});
|
|
const decoder = createDecoder(contentTopic, networkConfig);
|
|
```
|
|
|
|
:::info
|
|
In this example, users send and receive messages on a shared content topic. However, real applications may have users broadcasting messages while others listen or only have 1:1 exchanges. Waku supports all these use cases.
|
|
:::
|
|
|
|
## Create a message structure
|
|
|
|
Create your application's message structure using [Protobuf's valid message](https://github.com/protobufjs/protobuf.js#usage) fields:
|
|
|
|
```js
|
|
import protobuf from "protobufjs";
|
|
|
|
// Create a message structure using Protobuf
|
|
const DataPacket = new protobuf.Type("DataPacket")
|
|
.add(new protobuf.Field("timestamp", 1, "uint64"))
|
|
.add(new protobuf.Field("sender", 2, "string"))
|
|
.add(new protobuf.Field("message", 3, "string"));
|
|
```
|
|
|
|
:::info
|
|
Have a look at the [Protobuf installation](/build/javascript/#message-structure) guide for adding the `protobufjs` package to your project.
|
|
:::
|
|
|
|
## Send messages using light push
|
|
|
|
To send messages over the Waku Network using the `Light Push` protocol, create a new message object and use the `lightPush.send()` function:
|
|
|
|
```js
|
|
// Create a new message object
|
|
const protoMessage = DataPacket.create({
|
|
timestamp: Date.now(),
|
|
sender: "Alice",
|
|
message: "Hello, World!",
|
|
});
|
|
|
|
// Serialise the message using Protobuf
|
|
const serialisedMessage = DataPacket.encode(protoMessage).finish();
|
|
|
|
// Send the message using Light Push
|
|
await node.lightPush.send(encoder, {
|
|
payload: serialisedMessage,
|
|
});
|
|
```
|
|
|
|
## Receive messages using filter
|
|
|
|
To receive messages using the `Filter` protocol, create a callback function for message processing, then use the `filter.subscribe()` function to subscribe to a `content topic`:
|
|
|
|
```js
|
|
// Create the callback function
|
|
const callback = (wakuMessage) => {
|
|
// Check if there is a payload on the message
|
|
if (!wakuMessage.payload) return;
|
|
// Render the messageObj as desired in your application
|
|
const messageObj = DataPacket.decode(wakuMessage.payload);
|
|
console.log(messageObj);
|
|
};
|
|
|
|
// Create a Filter subscription
|
|
const { error, subscription } = await node.filter.createSubscription({ contentTopics: [contentTopic] });
|
|
|
|
if (error) {
|
|
// handle errors if happens
|
|
throw Error(error);
|
|
}
|
|
|
|
// Subscribe to content topics and process new messages
|
|
await subscription.subscribe([decoder], callback);
|
|
```
|
|
|
|
The `pubsubTopicShardInfo` parameter allows you to configure a different network configuration for your `Filter` subscription:
|
|
|
|
```js
|
|
// Create the network config
|
|
const networkConfig = { clusterId: 3, shards: [1, 2] };
|
|
|
|
// Create Filter subscription with custom network config
|
|
const subscription = await node.filter.createSubscription(networkConfig);
|
|
```
|
|
|
|
You can use the `subscription.unsubscribe()` function to stop receiving messages from a content topic:
|
|
|
|
```js
|
|
await subscription.unsubscribe([contentTopic]);
|
|
```
|
|
|
|
:::tip Congratulations!
|
|
You have successfully sent and received messages over the Waku Network using the `Light Push` and `Filter` protocols. Have a look at the [light-js](https://github.com/waku-org/js-waku-examples/tree/master/examples/light-js) and [light-chat](https://github.com/waku-org/js-waku-examples/tree/master/examples/light-chat) examples for working demos.
|
|
::: |