From 464fbcd98b230a727d56eca075615785a690bfa8 Mon Sep 17 00:00:00 2001 From: Daniel Sanchez Quiros Date: Wed, 12 Oct 2022 11:35:27 -0500 Subject: [PATCH] Fix signal -> event -> message deserialization --- waku/src/events/mod.rs | 20 +++++++++++++++++--- waku/src/general/mod.rs | 10 +++++++++- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/waku/src/events/mod.rs b/waku/src/events/mod.rs index a9182ce..a46601e 100644 --- a/waku/src/events/mod.rs +++ b/waku/src/events/mod.rs @@ -13,6 +13,7 @@ use once_cell::sync::Lazy; use serde::{Deserialize, Serialize}; // internal use crate::general::{WakuMessage, WakuPubSubTopic}; +use crate::MessageId; /// Event signal #[derive(Serialize, Deserialize)] @@ -34,7 +35,7 @@ impl Signal { /// For now just WakuMessage is supported #[non_exhaustive] #[derive(Serialize, Deserialize)] -#[serde(tag = "untagged", rename_all = "camelCase")] +#[serde(untagged, rename_all = "camelCase")] pub enum Event { WakuMessage(WakuMessageEvent), } @@ -46,7 +47,7 @@ pub struct WakuMessageEvent { /// The pubsub topic on which the message was received pubsub_topic: WakuPubSubTopic, /// The message id - message_id: String, + message_id: MessageId, /// The message in [`WakuMessage`] format waku_message: WakuMessage, } @@ -93,16 +94,29 @@ extern "C" fn callback(data: *const c_char) { /// which are used to react to asynchronous events in Waku pub fn waku_set_event_callback(f: F) { set_callback(f); - unsafe { waku_sys::waku_set_event_callback(&mut callback as *mut _ as *mut std::ffi::c_void) }; + unsafe { waku_sys::waku_set_event_callback(callback as *mut std::ffi::c_void) }; } #[cfg(test)] mod tests { use crate::events::waku_set_event_callback; + use crate::{Event, MessageId, Signal, WakuMessage, WakuPubSubTopic}; // TODO: how to actually send a signal and check if the callback is run? #[test] fn set_event_callback() { waku_set_event_callback(|_signal| {}); } + + #[test] + fn deserialize_signal() { + let s = "{\"type\":\"message\",\"event\":{\"messageId\":\"0x26ff3d7fbc950ea2158ce62fd76fd745eee0323c9eac23d0713843b0f04ea27c\",\"pubsubTopic\":\"/waku/2/default-waku/proto\",\"wakuMessage\":{\"payload\":\"SGkgZnJvbSDwn6aAIQ==\",\"contentTopic\":\"/toychat/2/huilong/proto\",\"timestamp\":1665580926660}}}"; + let _: Signal = serde_json::from_str(s).unwrap(); + } + + #[test] + fn deserialize_event() { + let e = "{\"messageId\":\"0x26ff3d7fbc950ea2158ce62fd76fd745eee0323c9eac23d0713843b0f04ea27c\",\"pubsubTopic\":\"/waku/2/default-waku/proto\",\"wakuMessage\":{\"payload\":\"SGkgZnJvbSDwn6aAIQ==\",\"contentTopic\":\"/toychat/2/huilong/proto\",\"timestamp\":1665580926660}}"; + let _: Event = serde_json::from_str(e).unwrap(); + } } diff --git a/waku/src/general/mod.rs b/waku/src/general/mod.rs index 64074ea..94e49d7 100644 --- a/waku/src/general/mod.rs +++ b/waku/src/general/mod.rs @@ -80,7 +80,9 @@ pub struct WakuMessage { payload: Vec, /// The content topic to be set on the message content_topic: WakuContentTopic, + // TODO: check if missing default should be 0 /// The Waku Message version number + #[serde(default)] version: WakuMessageVersion, /// Unix timestamp in nanoseconds timestamp: usize, @@ -325,7 +327,7 @@ impl FromStr for WakuContentTopic { fn from_str(s: &str) -> std::result::Result { if let Ok((application_name, version, content_topic_name, encoding)) = - scanf!(s, "/{}/{}/{}/{}", String, usize, String, Encoding) + scanf!(s, "/{}/{}/{}/{:/.+?/}", String, usize, String, Encoding) { Ok(WakuContentTopic { application_name, @@ -498,4 +500,10 @@ mod tests { let s = "/waku/2/default-waku/proto"; let _: WakuPubSubTopic = s.parse().unwrap(); } + + #[test] + fn deserialize_waku_message() { + let message = "{\"payload\":\"SGkgZnJvbSDwn6aAIQ==\",\"contentTopic\":\"/toychat/2/huilong/proto\",\"timestamp\":1665580926660}"; + let _: WakuMessage = serde_json::from_str(message).unwrap(); + } }