mirror of
https://github.com/waku-org/docs.waku.org.git
synced 2025-02-23 18:28:13 +00:00
* add @waku/react outline * add @waku/react hooks docs * add @waku/react providers docs * add more snippet comments + fix code indents
219 lines
6.3 KiB
Markdown
219 lines
6.3 KiB
Markdown
---
|
|
title: Retrieve Messages Using Store
|
|
---
|
|
|
|
This guide provides detailed steps to create a Light Node for retrieving and filtering historical messages using the [Store protocol](/overview/concepts/protocols#store).
|
|
|
|
## Create a Light Node
|
|
|
|
Use the `createLightNode()` function to create a 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();
|
|
```
|
|
|
|
## Connect to Store Peers
|
|
|
|
Use the `waitForRemotePeer()` function to wait for the node to connect with Store peers:
|
|
|
|
```js
|
|
import { waitForRemotePeer, Protocols } from "@waku/sdk";
|
|
|
|
// Wait for a successful peer connection
|
|
await waitForRemotePeer(node, [Protocols.Store]);
|
|
```
|
|
|
|
## Choose a Content Topic
|
|
|
|
[Choose a content topic](/overview/concepts/content-topics) for filtering the messages to retrieve and create a `decoder` for [message decryption](https://rfc.vac.dev/spec/26/):
|
|
|
|
```js
|
|
import { createDecoder } from "@waku/sdk";
|
|
|
|
// Choose a content topic
|
|
const contentTopic = "/store-guide/1/message/proto";
|
|
|
|
// Create a message decoder
|
|
const decoder = createDecoder(contentTopic);
|
|
```
|
|
|
|
## Retrieve Messages
|
|
|
|
`js-waku` provides the `queryOrderedCallback()` and `queryGenerator()` functions for querying `Store` nodes and retrieving historical or missed messages. The responses from `Store` nodes are paginated and require you to handle them sequentially, processing each page when received.
|
|
|
|
### `queryOrderedCallback`
|
|
|
|
The `store.queryOrderedCallback()` function provides a straightforward method for querying `Store` nodes and processing messages in chronological order through a callback function. It accepts these parameters:
|
|
|
|
- `decoders`: List of `decoders` that specify the `content topic` to query for and their [message decryption](https://rfc.vac.dev/spec/26/) methods.
|
|
- `callback`: The callback function for processing the retrieved messages.
|
|
- `options` (optional): [Query options](/guides/js-waku/store-retrieve-messages#store-query-options) to filter the retrieved messages.
|
|
|
|
```js
|
|
// Create the callback function
|
|
const callback = (wakuMessage) => {
|
|
// Render the message/payload in your application
|
|
console.log(wakuMessage);
|
|
};
|
|
|
|
// Set the query options
|
|
const queryOptions = {
|
|
pageSize: 5,
|
|
};
|
|
|
|
// Query the Store peer
|
|
await node.store.queryOrderedCallback(
|
|
[decoder],
|
|
callback,
|
|
queryOptions,
|
|
);
|
|
```
|
|
|
|
### `queryGenerator`
|
|
|
|
The `store.queryGenerator()` function provides more control and flexibility over processing messages retrieved from `Store` nodes through [Async Generators](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/AsyncGenerator). It accepts these parameters:
|
|
|
|
- `decoders`: List of `decoders` that specify the `content topic` to query for and their [message decryption](https://rfc.vac.dev/spec/26/) methods.
|
|
- `options` (optional): [Query options](/guides/js-waku/store-retrieve-messages#store-query-options) to filter the retrieved messages.
|
|
|
|
```js
|
|
// Set the query options
|
|
const queryOptions = {
|
|
pageSize: 5,
|
|
};
|
|
|
|
// Create the store query
|
|
const storeQuery = node.store.queryGenerator(
|
|
[decoder],
|
|
queryOptions,
|
|
);
|
|
|
|
// Process the messages
|
|
for await (const messagesPromises of storeQuery) {
|
|
// Fulfill all the messages promises
|
|
const messages = await Promise.all(messagesPromises);
|
|
// Render the message/payload in your application
|
|
console.log(messages);
|
|
}
|
|
```
|
|
|
|
## Store Query Options
|
|
|
|
### `pageDirection`
|
|
|
|
The `pageDirection` option specifies the direction in which pages are retrieved:
|
|
|
|
- `BACKWARD` (default): Most recent page first.
|
|
- `FORWARD`: Oldest page first.
|
|
|
|
```js
|
|
import { PageDirection } from "@waku/sdk";
|
|
|
|
// Retrieve recent messages first
|
|
const queryOptions = {
|
|
pageDirection: PageDirection.BACKWARD,
|
|
};
|
|
|
|
// Retrieve oldest messages first
|
|
const queryOptions = {
|
|
pageDirection: PageDirection.FORWARD,
|
|
};
|
|
```
|
|
|
|
:::info
|
|
The `pageDirection` option does not affect the ordering of messages within the page, as the oldest message always returns first.
|
|
:::
|
|
|
|
### `pageSize`
|
|
|
|
The `pageSize` option specifies the number of messages to be returned per page. For example, consider a query that retrieves `20` messages per page:
|
|
|
|
```js
|
|
const queryOptions = {
|
|
pageSize: 20,
|
|
};
|
|
```
|
|
|
|
### `timeFilter`
|
|
|
|
The `timeFilter` option specifies a time frame to retrieve messages from. For example, consider a query that retrieves messages from the previous week:
|
|
|
|
```js
|
|
// Get the time frame
|
|
const endTime = new Date();
|
|
const startTime = new Date();
|
|
startTime.setDate(endTime.getDate() - 7);
|
|
|
|
// Retrieve a week of messages
|
|
const queryOptions = {
|
|
timeFilter: {
|
|
startTime,
|
|
endTime,
|
|
},
|
|
};
|
|
```
|
|
|
|
:::info
|
|
If you omit the `timeFilter` option, the query will start from the beginning or end of the history, depending on the [page direction](#pagedirection).
|
|
:::
|
|
|
|
### `cursor`
|
|
|
|
The `cursor` option specifies the starting index for retrieving messages. For example, consider a query that retrieves the first `10` messages and then continues with the next `10` messages:
|
|
|
|
```js
|
|
import { waku } from "@waku/sdk";
|
|
|
|
// Create the callback function
|
|
const messages = [];
|
|
const callback = (wakuMessage) => {
|
|
messages.push(wakuMessage);
|
|
};
|
|
|
|
// Retrieve the first 10 messages
|
|
await node.store.queryOrderedCallback(
|
|
[decoder],
|
|
callback,
|
|
{
|
|
pageSize: 10,
|
|
},
|
|
);
|
|
|
|
// Create the cursor
|
|
const lastMessage = messages[messages.length - 1];
|
|
const cursor = await waku.createCursor(lastMessage);
|
|
|
|
// Retrieve the next 10 messages
|
|
// The message at the cursor index is excluded from the result
|
|
await node.store.queryOrderedCallback(
|
|
[decoder],
|
|
callback,
|
|
{
|
|
pageSize: 10,
|
|
cursor: cursor,
|
|
},
|
|
);
|
|
console.log(messages);
|
|
```
|
|
|
|
:::info
|
|
If you omit the `cursor` option, the query will start from the beginning or end of the history, depending on the [page direction](#pagedirection).
|
|
:::
|
|
|
|
### `peerId`
|
|
|
|
The `peerId` option specifies the peer to query. A pseudo-random peer is selected from the connected `Store` peers if omitted.
|
|
|
|
```js
|
|
const queryOptions = {
|
|
peerId: "[WAKU STORE PEER ID]",
|
|
};
|
|
```
|
|
|
|
:::tip Congratulations!
|
|
You have successfully retrieved and filtered historical messages on a Light Node using the `Store` protocol. Check out the [store-js](https://github.com/waku-org/js-waku-examples/tree/master/examples/store-js) and [store-reactjs-chat](https://github.com/waku-org/js-waku-examples/tree/master/examples/store-reactjs-chat) examples for working demos.
|
|
::: |