2022-10-09 16:50:40 +02:00
|
|
|
//! Waku [general](https://rfc.vac.dev/spec/36/#general) types
|
|
|
|
|
|
2024-11-28 10:35:41 +01:00
|
|
|
pub mod contenttopic;
|
|
|
|
|
pub mod pubsubtopic;
|
|
|
|
|
|
2022-09-28 16:03:47 +02:00
|
|
|
// crates
|
2024-11-28 10:35:41 +01:00
|
|
|
use contenttopic::WakuContentTopic;
|
|
|
|
|
use serde::{Deserialize, Serialize};
|
2023-12-08 17:30:30 -04:00
|
|
|
use serde_aux::prelude::*;
|
2022-09-28 16:03:47 +02:00
|
|
|
|
2022-10-09 16:50:40 +02:00
|
|
|
/// Waku message version
|
2022-09-29 15:17:52 +02:00
|
|
|
pub type WakuMessageVersion = usize;
|
2024-03-01 11:31:00 -04:00
|
|
|
/// Waku message hash, hex encoded sha256 digest of the message
|
|
|
|
|
pub type MessageHash = String;
|
2022-09-29 15:17:52 +02:00
|
|
|
|
2022-10-03 15:21:19 +02:00
|
|
|
pub type Result<T> = std::result::Result<T, String>;
|
2022-09-28 16:03:47 +02:00
|
|
|
|
2022-10-09 16:50:40 +02:00
|
|
|
// TODO: Properly type and deserialize payload form base64 encoded string
|
|
|
|
|
/// Waku message in JSON format.
|
2022-09-28 16:03:47 +02:00
|
|
|
/// as per the [specification](https://rfc.vac.dev/spec/36/#jsonmessage-type)
|
2024-11-28 10:35:41 +01:00
|
|
|
#[derive(Clone, Serialize, Deserialize, Debug, Default)]
|
2022-09-28 16:03:47 +02:00
|
|
|
#[serde(rename_all = "camelCase")]
|
|
|
|
|
pub struct WakuMessage {
|
2023-05-12 08:06:07 -04:00
|
|
|
#[serde(with = "base64_serde", default = "Vec::new")]
|
2024-02-22 10:57:02 -04:00
|
|
|
pub payload: Vec<u8>,
|
2022-09-28 16:03:47 +02:00
|
|
|
/// The content topic to be set on the message
|
2024-02-22 10:57:02 -04:00
|
|
|
pub content_topic: WakuContentTopic,
|
2022-09-28 16:03:47 +02:00
|
|
|
/// The Waku Message version number
|
2022-10-17 19:30:07 +02:00
|
|
|
#[serde(default)]
|
2024-02-22 10:57:02 -04:00
|
|
|
pub version: WakuMessageVersion,
|
2022-09-28 16:03:47 +02:00
|
|
|
/// Unix timestamp in nanoseconds
|
2023-12-08 17:30:30 -04:00
|
|
|
#[serde(deserialize_with = "deserialize_number_from_string")]
|
2024-02-22 10:57:02 -04:00
|
|
|
pub timestamp: usize,
|
2023-05-12 14:58:47 +03:00
|
|
|
#[serde(with = "base64_serde", default = "Vec::new")]
|
2024-02-22 10:57:02 -04:00
|
|
|
pub meta: Vec<u8>,
|
2023-05-23 08:32:23 -04:00
|
|
|
#[serde(default)]
|
2024-02-22 10:57:02 -04:00
|
|
|
pub ephemeral: bool,
|
2022-10-17 19:30:07 +02:00
|
|
|
// TODO: implement RLN fields
|
|
|
|
|
#[serde(flatten)]
|
|
|
|
|
_extras: serde_json::Value,
|
2022-09-28 16:03:47 +02:00
|
|
|
}
|
|
|
|
|
|
2022-10-09 16:50:40 +02:00
|
|
|
impl WakuMessage {
|
2023-05-10 10:13:50 -04:00
|
|
|
pub fn new<PAYLOAD: AsRef<[u8]>, META: AsRef<[u8]>>(
|
2022-10-09 16:50:40 +02:00
|
|
|
payload: PAYLOAD,
|
|
|
|
|
content_topic: WakuContentTopic,
|
|
|
|
|
version: WakuMessageVersion,
|
|
|
|
|
timestamp: usize,
|
2023-05-10 10:13:50 -04:00
|
|
|
meta: META,
|
|
|
|
|
ephemeral: bool,
|
2022-10-09 16:50:40 +02:00
|
|
|
) -> Self {
|
|
|
|
|
let payload = payload.as_ref().to_vec();
|
2023-05-10 10:13:50 -04:00
|
|
|
let meta = meta.as_ref().to_vec();
|
2022-10-17 19:30:07 +02:00
|
|
|
|
2022-10-09 16:50:40 +02:00
|
|
|
Self {
|
|
|
|
|
payload,
|
|
|
|
|
content_topic,
|
|
|
|
|
version,
|
|
|
|
|
timestamp,
|
2023-05-10 10:13:50 -04:00
|
|
|
meta,
|
|
|
|
|
ephemeral,
|
2022-10-17 19:30:07 +02:00
|
|
|
_extras: Default::default(),
|
2022-10-09 16:50:40 +02:00
|
|
|
}
|
|
|
|
|
}
|
2022-10-06 15:51:00 +02:00
|
|
|
}
|
|
|
|
|
|
2022-10-09 16:50:40 +02:00
|
|
|
mod base64_serde {
|
2023-02-20 12:44:55 +01:00
|
|
|
use base64::Engine;
|
2022-10-09 16:50:40 +02:00
|
|
|
use serde::de::Error;
|
|
|
|
|
use serde::{Deserialize, Deserializer, Serialize, Serializer};
|
|
|
|
|
|
|
|
|
|
pub fn serialize<S>(value: &[u8], serializer: S) -> std::result::Result<S::Ok, S::Error>
|
|
|
|
|
where
|
|
|
|
|
S: Serializer,
|
|
|
|
|
{
|
2023-02-20 12:44:55 +01:00
|
|
|
base64::engine::general_purpose::STANDARD
|
|
|
|
|
.encode(value)
|
|
|
|
|
.serialize(serializer)
|
2022-10-09 16:50:40 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn deserialize<'de, D>(deserializer: D) -> std::result::Result<Vec<u8>, D::Error>
|
|
|
|
|
where
|
|
|
|
|
D: Deserializer<'de>,
|
|
|
|
|
{
|
|
|
|
|
let base64_str: String = String::deserialize(deserializer)?;
|
2023-02-20 12:44:55 +01:00
|
|
|
base64::engine::general_purpose::STANDARD
|
|
|
|
|
.decode(base64_str)
|
|
|
|
|
.map_err(D::Error::custom)
|
2022-10-09 16:50:40 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-10-17 19:30:07 +02:00
|
|
|
#[cfg(test)]
|
|
|
|
|
mod tests {
|
|
|
|
|
use super::*;
|
|
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
|
fn deserialize_waku_message() {
|
2023-05-10 10:13:50 -04:00
|
|
|
let message = "{\"payload\":\"SGkgZnJvbSDwn6aAIQ==\",\"contentTopic\":\"/toychat/2/huilong/proto\",\"timestamp\":1665580926660,\"ephemeral\":true,\"meta\":\"SGkgZnJvbSDwn6aAIQ==\"}";
|
2022-10-17 19:30:07 +02:00
|
|
|
let _: WakuMessage = serde_json::from_str(message).unwrap();
|
|
|
|
|
}
|
|
|
|
|
}
|