### Added
- Examples (web-chat): New `/fleet` command to switch connection between
Status prod and test fleets.
- Export `generatePrivateKey` and `getPublicKey` directly from the root.
- Usage of the encryption and signature APIs to the readme.
### Changed
- **Breaking**: Renamed `WakuRelay.(add|delete)PrivateDecryptionKey` to
`WakuRelay.(add|delete)DecryptionKey` to make it clearer that it
accepts both symmetric keys and asymmetric private keys.
### Fix
- Align `WakuMessage` readme example with actual code behaviour.
### Added
- `WakuRelay.deleteObserver` to allow removal of observers, useful when
a React component add observers when mounting and needs to delete it
when unmounting.
- Keep alive feature that pings host regularly, reducing the chance of
connections being dropped due to idle.
Can be disabled or default frequency (10s) can be changed when calling
`Waku.create`.
- New `lib/utils` module for easy, dependency-less hex/bytes
conversions.
- New `peers` and `randomPeer` methods on `WakuStore` and
`WakuLightPush` to have a better idea of available peers;
Note that it does not check whether Waku node is currently connected
to said peers.
- Enable passing decryption private keys to `WakuStore.queryHistory`.
- Test: Introduce testing in browser environment (Chrome) using Karma.
- Add support for Waku Message version 1: Asymmetric encryption,
symmetric encryption, and signature of the data.
### Changed
- **Breaking**: Auto select peer if none provided for store and light
push protocols.
- Upgrade to `libp2p@0.31.7` and `libp2p-gossipsub@0.10.0` to avoid
`TextEncoder` errors in ReactJS tests.
- Disable keep alive by default as latest nim-waku release does not
support ping protocol.
- **Breaking**: Optional parameters for `WakuMessage.fromBytes` and
`WakuMessage.fromUtf8String` are now passed in a single `Options`
object.
- **Breaking**: `WakuMessage` static functions are now async to allow
for encryption and decryption.
- **Breaking**: `WakuMessage` constructor is now private, `from*` and
`decode*` function should be used.
- `WakuMessage` version 1 is partially supported, enabling asymmetrical
encryption and signature of messages;
this can be done by passing keys to `WakuMessage.from*` and
`WakuMessage.decode*` methods.
- Examples (eth-dm): Use Waku Message version 1 encryption scheme
instead of `eth-crypto`.
- Examples (eth-dm): Use Protobuf for direct messages instead of JSON
([#214](https://github.com/status-im/js-waku/issues/214)).
### Fixed
- Disable `keepAlive` if set to `0`.
### Changed
- **Breaking**: Websocket protocol is not automatically added anymore
if the user specifies a protocol in `libp2p.modules` when using
`Waku.create`.
- **Breaking**: Options passed to `Waku.create` used to be passed to
`Libp2p.create`; Now, only the `libp2p` property is passed to
`Libp2p.create`, allowing for a cleaner interface.
- Examples (cli chat): Use tcp protocol instead of websocket.
### Added
- Enable access to `WakuMessage.timestamp`.
- Examples (web chat): Use `WakuMessage.timestamp` as unique key for
list items.
- Doc: Link to new [topic guidelines](https://rfc.vac.dev/spec/23/) in
README.
- Doc: Link to [Waku v2 Toy Chat specs](https://rfc.vac.dev/spec/22/) in
README.
- Examples (web chat): Persist nick.
- Support for custom PubSub Topics to `Waku`, `WakuRelay`, `WakuStore`
and `WakuLightPush`;
Passing a PubSub Topic is optional and still defaults to
`/waku/2/default-waku/proto`;
JS-Waku currently supports one, and only, PubSub topic per instance.
Due to #201, Websocket protocol is not added by default if the caller
specifies a protocol for libp2p.
In the case cli-chat. We were using both tcp and ws.
As the web-chat already demonstrates usage of websocket protocol, we
cli-chat to tcp only.
Note that we currently only support one, and only one, pubsub topic for
a given instance across the codebase. The PubSub topic needs to be set
when instantiating the Waku* classes.
At this stage, we believe that most DApp will use, and only use, the
default PubSub topic. Some application want to use an alternative topic
but not use the default one so this behaviour should be fine. See #174
for details.