2022-10-09 16:50:40 +02:00
|
|
|
//! Waku message [event](https://rfc.vac.dev/spec/36/#events) related items
|
|
|
|
|
//!
|
|
|
|
|
//! Asynchronous events require a callback to be registered.
|
|
|
|
|
//! An example of an asynchronous event that might be emitted is receiving a message.
|
2025-01-10 15:19:31 +01:00
|
|
|
//! When an event is emitted, this callback will be triggered receiving an [`WakuEvent`]
|
2022-10-09 16:50:40 +02:00
|
|
|
|
2022-09-29 15:17:52 +02:00
|
|
|
// crates
|
|
|
|
|
use serde::{Deserialize, Serialize};
|
|
|
|
|
// internal
|
2024-02-14 16:52:21 -04:00
|
|
|
use crate::general::WakuMessage;
|
2024-11-28 10:35:41 +01:00
|
|
|
use std::str;
|
|
|
|
|
|
2024-03-01 11:31:00 -04:00
|
|
|
use crate::MessageHash;
|
2022-10-09 16:50:40 +02:00
|
|
|
|
|
|
|
|
/// Waku event
|
|
|
|
|
/// For now just WakuMessage is supported
|
|
|
|
|
#[non_exhaustive]
|
2024-11-28 10:35:41 +01:00
|
|
|
#[derive(Serialize, Deserialize, Debug)]
|
2024-02-14 16:52:21 -04:00
|
|
|
#[serde(tag = "eventType", rename_all = "camelCase")]
|
2025-01-10 15:19:31 +01:00
|
|
|
pub enum WakuEvent {
|
2024-02-14 16:52:21 -04:00
|
|
|
#[serde(rename = "message")]
|
2022-09-29 15:17:52 +02:00
|
|
|
WakuMessage(WakuMessageEvent),
|
2025-01-10 15:19:31 +01:00
|
|
|
|
|
|
|
|
#[serde(rename = "relay_topic_health_change")]
|
|
|
|
|
RelayTopicHealthChange(TopicHealthEvent),
|
|
|
|
|
|
|
|
|
|
#[serde(rename = "connection_change")]
|
|
|
|
|
ConnectionChange(ConnectionChangeEvent),
|
|
|
|
|
|
2026-03-02 18:07:38 +05:30
|
|
|
#[serde(rename = "node_health_change")]
|
|
|
|
|
NodeHealthChange(NodeHealthChangeEvent),
|
|
|
|
|
|
2022-10-19 15:58:09 +02:00
|
|
|
Unrecognized(serde_json::Value),
|
2022-09-29 15:17:52 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Type of `event` field for a `message` event
|
2024-11-28 10:35:41 +01:00
|
|
|
#[derive(Serialize, Deserialize, Debug)]
|
2022-09-29 15:17:52 +02:00
|
|
|
#[serde(rename_all = "camelCase")]
|
|
|
|
|
pub struct WakuMessageEvent {
|
|
|
|
|
/// The pubsub topic on which the message was received
|
2024-02-22 10:57:02 -04:00
|
|
|
pub pubsub_topic: String,
|
2024-03-01 11:31:00 -04:00
|
|
|
/// The message hash
|
|
|
|
|
pub message_hash: MessageHash,
|
2022-09-29 15:17:52 +02:00
|
|
|
/// The message in [`WakuMessage`] format
|
2024-02-22 10:57:02 -04:00
|
|
|
pub waku_message: WakuMessage,
|
2022-09-29 15:17:52 +02:00
|
|
|
}
|
|
|
|
|
|
2025-01-10 15:19:31 +01:00
|
|
|
/// Type of `event` field for a `topic health` event
|
|
|
|
|
#[derive(Serialize, Deserialize, Debug)]
|
|
|
|
|
#[serde(rename_all = "camelCase")]
|
|
|
|
|
pub struct TopicHealthEvent {
|
|
|
|
|
/// The pubsub topic on which the message was received
|
|
|
|
|
pub pubsub_topic: String,
|
|
|
|
|
/// The message hash
|
|
|
|
|
pub topic_health: String,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Type of `event` field for a `connection change` event
|
|
|
|
|
#[derive(Serialize, Deserialize, Debug)]
|
|
|
|
|
#[serde(rename_all = "camelCase")]
|
|
|
|
|
pub struct ConnectionChangeEvent {
|
|
|
|
|
pub peer_id: String,
|
|
|
|
|
pub peer_event: String,
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-02 18:07:38 +05:30
|
|
|
/// Type of `event` field for a `node_health_change` event
|
|
|
|
|
#[derive(Serialize, Deserialize, Debug)]
|
|
|
|
|
#[serde(rename_all = "camelCase")]
|
|
|
|
|
pub struct NodeHealthChangeEvent {
|
|
|
|
|
pub status: String,
|
|
|
|
|
}
|
|
|
|
|
|
2022-09-29 15:17:52 +02:00
|
|
|
#[cfg(test)]
|
|
|
|
|
mod tests {
|
2025-01-10 15:19:31 +01:00
|
|
|
use crate::WakuEvent;
|
|
|
|
|
use crate::WakuEvent::{ConnectionChange, RelayTopicHealthChange};
|
2022-09-29 15:17:52 +02:00
|
|
|
|
2022-10-17 19:30:07 +02:00
|
|
|
#[test]
|
2024-02-14 16:52:21 -04:00
|
|
|
fn deserialize_message_event() {
|
2025-02-12 10:06:16 +01:00
|
|
|
let s = "{\"eventType\":\"message\",\"messageHash\":\"0xd40aa51bbb4867fe40329a255575cfc9ef4000358cc7321b2668b008cba94b30\",\"pubsubTopic\":\"/waku/2/default-waku/proto\",\"wakuMessage\":{\"payload\":\"SGkgZnJvbSDwn6aAIQ==\",\"contentTopic\":\"/toychat/2/huilong/proto\",\"timestamp\":1665580926660}}";
|
2025-01-10 15:19:31 +01:00
|
|
|
let evt: WakuEvent = serde_json::from_str(s).unwrap();
|
|
|
|
|
assert!(matches!(evt, WakuEvent::WakuMessage(_)));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
|
fn deserialize_topic_health_change_event() {
|
|
|
|
|
let s = "{\"eventType\":\"relay_topic_health_change\", \"pubsubTopic\":\"/waku/2/rs/16/1\",\"topicHealth\":\"MinimallyHealthy\"}";
|
|
|
|
|
let evt: WakuEvent = serde_json::from_str(s).unwrap();
|
|
|
|
|
match evt {
|
|
|
|
|
RelayTopicHealthChange(topic_health_event) => {
|
|
|
|
|
assert_eq!(topic_health_event.pubsub_topic, "/waku/2/rs/16/1");
|
|
|
|
|
assert_eq!(topic_health_event.topic_health, "MinimallyHealthy");
|
|
|
|
|
}
|
|
|
|
|
_ => panic!("Expected RelayTopicHealthChange event, but got {:?}", evt),
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
|
fn deserialize_connection_change_event() {
|
|
|
|
|
let s = "{\"eventType\":\"connection_change\", \"peerId\":\"16Uiu2HAmAR24Mbb6VuzoyUiGx42UenDkshENVDj4qnmmbabLvo31\",\"peerEvent\":\"Joined\"}";
|
|
|
|
|
let evt: WakuEvent = serde_json::from_str(s).unwrap();
|
|
|
|
|
match evt {
|
|
|
|
|
ConnectionChange(conn_change_event) => {
|
|
|
|
|
assert_eq!(
|
|
|
|
|
conn_change_event.peer_id,
|
|
|
|
|
"16Uiu2HAmAR24Mbb6VuzoyUiGx42UenDkshENVDj4qnmmbabLvo31"
|
|
|
|
|
);
|
|
|
|
|
assert_eq!(conn_change_event.peer_event, "Joined");
|
|
|
|
|
}
|
|
|
|
|
_ => panic!("Expected RelayTopicHealthChange event, but got {:?}", evt),
|
|
|
|
|
}
|
2022-10-17 19:30:07 +02:00
|
|
|
}
|
2022-09-29 15:17:52 +02:00
|
|
|
}
|