From ce8422b8e35f212bf25e8c99afbc6e528790819a Mon Sep 17 00:00:00 2001 From: CQ Xiao <53201544+xiaocq2001@users.noreply.github.com> Date: Thu, 16 May 2024 23:05:10 +0800 Subject: [PATCH] feat(rumqttc): set `session_expiry_interval` in v5 (#854) Co-authored-by: Devdutt Shenoi --- rumqttc/CHANGELOG.md | 1 + rumqttc/examples/async_manual_acks_v5.rs | 1 + rumqttc/src/v5/eventloop.rs | 5 +++++ rumqttc/src/v5/mod.rs | 21 +++++++++++++++++++++ 4 files changed, 28 insertions(+) diff --git a/rumqttc/CHANGELOG.md b/rumqttc/CHANGELOG.md index d85c89032..7591ba19d 100644 --- a/rumqttc/CHANGELOG.md +++ b/rumqttc/CHANGELOG.md @@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * `size()` method on `Packet` calculates size once serialized. * `read()` and `write()` methods on `Packet`. * `ConnectionAborted` variant on `StateError` type to denote abrupt end to a connection +* `set_session_expiry_interval` and `session_expiry_interval` methods on `MqttOptions`. ### Changed diff --git a/rumqttc/examples/async_manual_acks_v5.rs b/rumqttc/examples/async_manual_acks_v5.rs index bcf1bf356..7597a6164 100644 --- a/rumqttc/examples/async_manual_acks_v5.rs +++ b/rumqttc/examples/async_manual_acks_v5.rs @@ -10,6 +10,7 @@ fn create_conn() -> (AsyncClient, EventLoop) { let mut mqttoptions = MqttOptions::new("test-1", "localhost", 1884); mqttoptions .set_keep_alive(Duration::from_secs(5)) + .set_session_expiry_interval(u32::MAX.into()) .set_manual_acks(true) .set_clean_start(false); diff --git a/rumqttc/src/v5/eventloop.rs b/rumqttc/src/v5/eventloop.rs index a59094807..005beda77 100644 --- a/rumqttc/src/v5/eventloop.rs +++ b/rumqttc/src/v5/eventloop.rs @@ -412,6 +412,11 @@ async fn mqtt_connect( options.keep_alive = Duration::from_secs(keep_alive as u64); } network.set_max_outgoing_size(props.max_packet_size); + + // Override local session_expiry_interval value if set by server. + if props.session_expiry_interval.is_some() { + options.set_session_expiry_interval(props.session_expiry_interval); + } } Ok(Packet::ConnAck(connack)) } diff --git a/rumqttc/src/v5/mod.rs b/rumqttc/src/v5/mod.rs index 44499cde2..2518a93f1 100644 --- a/rumqttc/src/v5/mod.rs +++ b/rumqttc/src/v5/mod.rs @@ -312,6 +312,27 @@ impl MqttOptions { self.connect_properties.clone() } + /// set session expiry interval on connection properties + pub fn set_session_expiry_interval(&mut self, interval: Option) -> &mut Self { + if let Some(conn_props) = &mut self.connect_properties { + conn_props.session_expiry_interval = interval; + self + } else { + let mut conn_props = ConnectProperties::new(); + conn_props.session_expiry_interval = interval; + self.set_connect_properties(conn_props) + } + } + + /// get session expiry interval on connection properties + pub fn session_expiry_interval(&self) -> Option { + if let Some(conn_props) = &self.connect_properties { + conn_props.session_expiry_interval + } else { + None + } + } + /// set receive maximum on connection properties pub fn set_receive_maximum(&mut self, recv_max: Option) -> &mut Self { if let Some(conn_props) = &mut self.connect_properties {