examples/filter2/README.md
# Using the `filter2` application
## Background
The `filter2` application is a basic example app that demonstrates how to subscribe to and publish messages using waku2-filter
## Preparation
```
make
```
## Basic application usage
To start the `filter2` application run the following from the project directory
```
./build/filter2
```
The app will run 2 nodes ("full" node and "light" node), with light node subscribing to full node in order to receive filtered messages.
## Flow description
### Light Node
1. A light node is created with option WithWakuFilterLightNode.
2. Starting this node sets stream handler on wakunode.Host for WakuFilterProtocolId.
3. Light node submits a FilterSubscribeRequest through WakuFilterLightNode.Subscribe. This request is submitted to a particular peer.
Filter is stored in WakuFilterLightNode.subscriptions map. That's it.
4. Now we wait on WakuFilterLightNode.onRequest to process any further messages.
5. On receiving a message check and notify all subscribers on relevant channel (which is part of subscription object).
6. If a broadcaster is specified,
WakuNode.Subscribe has a message loop extracting WakuMessages from a wakurelay.Subscription object. It denotes a pubsub topic subscription. All envelopes are then submitted to node.broadcaster.
### Full Node
1. Full node is created with option WithWakuFilterFullNode.
2. We read incoming messages in WithWakuFilterFullNode.onRequest(). It is set as a stream handler on wakunode.Host for WakuFilterProtocolId.
3. In WakuFilter.onRequest
* We check the type of FilterRequest and handle accordingly.
* If it's a FilterRequest for subscribe, add a subscriber.
* If it is a SubscriberPing request, check if subscriptions exists or not and respond accordingly.
* If it is an unsubscribe/unsubscribeAll request, check and remove relevant subscriptions.