diff --git a/xmpp/Cargo.toml b/xmpp/Cargo.toml index 8d4e2c5cb5dd72cb32b26c62872219fe366e646e..7d75069ab92cff917383ade593887f28c261d3de 100644 --- a/xmpp/Cargo.toml +++ b/xmpp/Cargo.toml @@ -35,6 +35,7 @@ default = ["avatars", "starttls-rust"] starttls-native = ["tokio-xmpp/starttls", "tokio-xmpp/tls-native", "reqwest/native-tls"] starttls-rust = ["tokio-xmpp/starttls", "tokio-xmpp/tls-rust", "reqwest/rustls-tls"] avatars = [] +escape-hatch = [] syntax-highlighting = [ "tokio-xmpp/syntax-highlighting" ] # Enable serde support in jid crate serde = [ "tokio-xmpp/serde" ] diff --git a/xmpp/ChangeLog b/xmpp/ChangeLog index dc86cf5eff8cb0c17bd06e4497dc1f39e7dc7f09..4202c29bd1c6c35bccafa6b23e588ae9ac0260ff 100644 --- a/xmpp/ChangeLog +++ b/xmpp/ChangeLog @@ -24,6 +24,9 @@ XXXX-YY-ZZ [ RELEASER ] - Agent::new helper method. - Handle SIGINT, SIGTERM and SIGKILL in hello_bot example to avoid leaving hibernating resources around. + - New 'escape-hatch' feature: Allow sending tokio_xmpp::Stanza directly + instead of having to go through xmpp-rs' API when it's lacking. This + is meant to stay behind a feature. * Fixes: - Use tokio::sync::RwLock not std::sync::RwLock (!432) - Agent::wait_for_events now return Vec and sets inner tokio_xmpp Client diff --git a/xmpp/src/agent.rs b/xmpp/src/agent.rs index a65158fb8af20bcc6a1c34f5c6552abd45a9ea78..1cf71eff18e839dadf2394aa56535c0a08fbc704 100644 --- a/xmpp/src/agent.rs +++ b/xmpp/src/agent.rs @@ -7,6 +7,8 @@ use alloc::sync::Arc; use std::collections::HashMap; use std::path::{Path, PathBuf}; +#[cfg(feature = "escape-hatch")] +use tokio::io; use tokio::sync::RwLock; use crate::{ @@ -17,6 +19,8 @@ use crate::{ upload, Error, Event, RoomNick, }; use tokio_xmpp::Client as TokioXmppClient; +#[cfg(feature = "escape-hatch")] +use tokio_xmpp::{stanzastream::StanzaToken, Stanza}; pub struct Agent { pub(crate) client: TokioXmppClient, @@ -58,6 +62,11 @@ impl Agent { self.client.send_end().await } + #[cfg(feature = "escape-hatch")] + pub async fn send_stanza>(&mut self, st: S) -> Result { + self.client.send_stanza(st.into()).await + } + pub async fn join_room<'a>(&mut self, settings: muc::room::JoinRoomSettings<'a>) { muc::room::join_room(self, settings).await }