From ce9f71a592632c840096dd0ebb6a37287367eca8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rich=CE=9Brd?= Date: Wed, 10 May 2023 10:13:50 -0400 Subject: [PATCH] Add new changes from go-waku (#58) * feat: add ephemeral and meta fields * feat: seenTTL * feat: expose list of topics --- Cargo.lock | 4 ++-- examples/toy-chat/src/main.rs | 3 +++ waku-bindings/src/general/mod.rs | 20 ++++++++++++++++++-- waku-bindings/src/node/config.rs | 3 +++ waku-bindings/src/node/mod.rs | 5 +++++ waku-bindings/src/node/relay.rs | 7 +++++++ waku-bindings/tests/node.rs | 16 +++++++++++++--- waku-sys/vendor | 2 +- 8 files changed, 52 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ea928b1..3cd0756 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1674,7 +1674,7 @@ checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "waku-bindings" -version = "0.1.0-rc.2" +version = "0.1.0-rc.3" dependencies = [ "aes-gcm", "base64 0.21.0", @@ -1697,7 +1697,7 @@ dependencies = [ [[package]] name = "waku-sys" -version = "0.1.0-rc.2" +version = "0.1.0-rc.3" dependencies = [ "bindgen", ] diff --git a/examples/toy-chat/src/main.rs b/examples/toy-chat/src/main.rs index cf0c9bc..87d426b 100644 --- a/examples/toy-chat/src/main.rs +++ b/examples/toy-chat/src/main.rs @@ -193,12 +193,15 @@ fn run_app( let message_content: String = app.input.drain(..).collect(); let message = Chat2Message::new(&app.nick, &message_content); let mut buff = Vec::new(); + let meta = Vec::new(); Message::encode(&message, &mut buff)?; let waku_message = WakuMessage::new( buff, TOY_CHAT_CONTENT_TOPIC.clone(), 1, Utc::now().timestamp_nanos() as usize, + meta, + false, ); if let Err(e) = app.node_handle diff --git a/waku-bindings/src/general/mod.rs b/waku-bindings/src/general/mod.rs index b3a5c16..5e7186d 100644 --- a/waku-bindings/src/general/mod.rs +++ b/waku-bindings/src/general/mod.rs @@ -89,25 +89,33 @@ pub struct WakuMessage { version: WakuMessageVersion, /// Unix timestamp in nanoseconds timestamp: usize, + #[serde(with = "base64_serde")] + meta: Vec, + ephemeral: bool, // TODO: implement RLN fields #[serde(flatten)] _extras: serde_json::Value, } impl WakuMessage { - pub fn new>( + pub fn new, META: AsRef<[u8]>>( payload: PAYLOAD, content_topic: WakuContentTopic, version: WakuMessageVersion, timestamp: usize, + meta: META, + ephemeral: bool, ) -> Self { let payload = payload.as_ref().to_vec(); + let meta = meta.as_ref().to_vec(); Self { payload, content_topic, version, timestamp, + meta, + ephemeral, _extras: Default::default(), } } @@ -128,6 +136,14 @@ impl WakuMessage { self.timestamp } + pub fn meta(&self) -> &[u8] { + &self.meta + } + + pub fn ephemeral(&self) -> bool { + self.ephemeral + } + /// Try decode the message with an expected symmetric key /// /// As per the [specification](https://rfc.vac.dev/spec/36/#extern-char-waku_decode_symmetricchar-messagejson-char-symmetrickey) @@ -555,7 +571,7 @@ mod tests { #[test] fn deserialize_waku_message() { - let message = "{\"payload\":\"SGkgZnJvbSDwn6aAIQ==\",\"contentTopic\":\"/toychat/2/huilong/proto\",\"timestamp\":1665580926660}"; + let message = "{\"payload\":\"SGkgZnJvbSDwn6aAIQ==\",\"contentTopic\":\"/toychat/2/huilong/proto\",\"timestamp\":1665580926660,\"ephemeral\":true,\"meta\":\"SGkgZnJvbSDwn6aAIQ==\"}"; let _: WakuMessage = serde_json::from_str(message).unwrap(); } } diff --git a/waku-bindings/src/node/config.rs b/waku-bindings/src/node/config.rs index ae3fe27..a9f32ac 100644 --- a/waku-bindings/src/node/config.rs +++ b/waku-bindings/src/node/config.rs @@ -190,6 +190,9 @@ pub struct GossipSubParams { /// the router may apply bahavioural penalties. #[serde(rename = "iwantFollowupTimeSeconds")] pub iwant_followup_time_seconds: Option, + // Time until a previously seen message ID can be forgotten about. + #[serde(rename = "seenMessagesTTLSeconds")] + pub seen_messages_ttl_seconds: Option, } #[derive(Clone, Default, Serialize, Deserialize, Debug)] diff --git a/waku-bindings/src/node/mod.rs b/waku-bindings/src/node/mod.rs index 24e9d38..a2ac5d5 100644 --- a/waku-bindings/src/node/mod.rs +++ b/waku-bindings/src/node/mod.rs @@ -212,6 +212,11 @@ impl WakuNodeHandle { relay::waku_relay_unsubscribe(pubsub_topic) } + /// Returns the list of pubsub topics the node is subscribed to in Waku Relay + pub fn relay_topics(&self) -> Result> { + relay::waku_relay_topics() + } + /// Retrieves historical messages on specific content topics. This method may be called with [`PagingOptions`](`crate::general::PagingOptions`), /// to retrieve historical messages on a per-page basis. If the request included [`PagingOptions`](`crate::general::PagingOptions`), /// the node must return messages on a per-page basis and include [`PagingOptions`](`crate::general::PagingOptions`) in the response. diff --git a/waku-bindings/src/node/relay.rs b/waku-bindings/src/node/relay.rs index 4c0c8a4..1d64a59 100644 --- a/waku-bindings/src/node/relay.rs +++ b/waku-bindings/src/node/relay.rs @@ -97,6 +97,13 @@ pub fn waku_dafault_pubsub_topic() -> WakuPubSubTopic { result } +/// Get the list of subscribed pubsub topics in Waku Relay. +/// As per the [specification](https://rfc.vac.dev/spec/36/#extern-char-waku_relay_topics) +pub fn waku_relay_topics() -> Result> { + let result_ptr = unsafe { waku_sys::waku_relay_topics() }; + decode_and_free_response(result_ptr) +} + /// Publish a message using Waku Relay /// As per the [specification](https://rfc.vac.dev/spec/36/#extern-char-waku_relay_publishchar-messagejson-char-pubsubtopic-int-timeoutms) pub fn waku_relay_publish_message( diff --git a/waku-bindings/tests/node.rs b/waku-bindings/tests/node.rs index 326bf1f..b50cf38 100644 --- a/waku-bindings/tests/node.rs +++ b/waku-bindings/tests/node.rs @@ -10,9 +10,9 @@ use std::{collections::HashSet, str::from_utf8}; use tokio::sync::mpsc::{self, Sender}; use tokio::time; use waku_bindings::{ - waku_new, waku_set_event_callback, Encoding, Event, GossipSubParams, Key, MessageId, - ProtocolId, Running, WakuContentTopic, WakuLogLevel, WakuMessage, WakuNodeConfig, - WakuNodeHandle, + waku_dafault_pubsub_topic, waku_new, waku_set_event_callback, Encoding, Event, GossipSubParams, + Key, MessageId, ProtocolId, Running, WakuContentTopic, WakuLogLevel, WakuMessage, + WakuNodeConfig, WakuNodeHandle, WakuPubSubTopic, }; const ECHO_TIMEOUT: u64 = 10; @@ -119,6 +119,8 @@ async fn test_echo_messages( .as_millis() .try_into() .unwrap(), + Vec::new(), + false, ); let (tx, mut rx) = mpsc::channel(1); @@ -177,6 +179,13 @@ async fn discv5_echo() -> Result<(), String> { node.relay_subscribe(None)?; let content_topic = WakuContentTopic::new("toychat", 2, "huilong", Encoding::Proto); + let topics = node.relay_topics()?; + let default_topic = waku_dafault_pubsub_topic(); + assert!(topics.len() == 1); + let topic: WakuPubSubTopic = topics[0].parse().unwrap(); + + assert!(topic == default_topic); + let sleep = time::sleep(Duration::from_secs(ECHO_TIMEOUT)); tokio::pin!(sleep); @@ -281,6 +290,7 @@ fn gossipsub_config() -> Result<(), String> { max_ihave_length: Some(32), max_ihave_messages: Some(8), iwant_followup_time_seconds: Some(120), + seen_messages_ttl_seconds: Some(120), }; let config = WakuNodeConfig { diff --git a/waku-sys/vendor b/waku-sys/vendor index 3c4a863..d9a12bf 160000 --- a/waku-sys/vendor +++ b/waku-sys/vendor @@ -1 +1 @@ -Subproject commit 3c4a863cb7c898a6c551a51288a6badf809fd6f5 +Subproject commit d9a12bf079a8bbb59ab1df591062b9bb91d3804d