xmpp: Stop proxying tokio-xmpp event in escape-hatch, add our own variants
This was causing issues with Clone-ing tokio-xmpp Event-s as they include Error-s which are typically not Clone-able. Event and Stanza aren't Clone-able either so might as well do our own stuff here. Signed-off-by: Maxime “pep” Buquet <pep@bouah.net>
This commit is contained in:
parent
a635d0872e
commit
03c7310990
3 changed files with 23 additions and 5 deletions
|
|
@ -40,7 +40,7 @@ XXXX-YY-ZZ [ RELEASER <admin@localhost> ]
|
||||||
- New 'escape-hatch' feature: Allow sending tokio_xmpp::Stanza directly
|
- New 'escape-hatch' feature: Allow sending tokio_xmpp::Stanza directly
|
||||||
instead of having to go through xmpp-rs' API when it's lacking. This
|
instead of having to go through xmpp-rs' API when it's lacking. This
|
||||||
is meant to stay behind a feature. Also allows directly receiving
|
is meant to stay behind a feature. Also allows directly receiving
|
||||||
TokioXmppEvent.
|
stanzas.
|
||||||
- Added documentation on `Event` enum.
|
- Added documentation on `Event` enum.
|
||||||
* Fixes:
|
* Fixes:
|
||||||
- Use tokio::sync::RwLock not std::sync::RwLock (!432)
|
- Use tokio::sync::RwLock not std::sync::RwLock (!432)
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,8 @@ use tokio_xmpp::jid::BareJid;
|
||||||
#[cfg(feature = "avatars")]
|
#[cfg(feature = "avatars")]
|
||||||
use tokio_xmpp::jid::Jid;
|
use tokio_xmpp::jid::Jid;
|
||||||
use tokio_xmpp::parsers::roster::Item as RosterItem;
|
use tokio_xmpp::parsers::roster::Item as RosterItem;
|
||||||
|
#[cfg(feature = "escape-hatch")]
|
||||||
|
use tokio_xmpp::parsers::{iq::Iq, message::Message, presence::Presence};
|
||||||
|
|
||||||
use crate::parsers::confirm::Confirm;
|
use crate::parsers::confirm::Confirm;
|
||||||
use crate::{delay::StanzaTimeInfo, Error, MessageId, RoomNick};
|
use crate::{delay::StanzaTimeInfo, Error, MessageId, RoomNick};
|
||||||
|
|
@ -113,5 +115,15 @@ pub enum Event {
|
||||||
/// A file has been uploaded over HTTP; contains the URL of the file.
|
/// A file has been uploaded over HTTP; contains the URL of the file.
|
||||||
HttpUploadedFile(String),
|
HttpUploadedFile(String),
|
||||||
#[cfg(feature = "escape-hatch")]
|
#[cfg(feature = "escape-hatch")]
|
||||||
TokioXmppEvent(TokioXmppEvent),
|
/// Variant only available when the "escape-hatch" feature is enabled. Proxies an Iq received
|
||||||
|
/// as a tokio-xmpp event.
|
||||||
|
Iq(Iq),
|
||||||
|
#[cfg(feature = "escape-hatch")]
|
||||||
|
/// Variant only available when the "escape-hatch" feature is enabled. Proxies a Message
|
||||||
|
/// received as a tokio-xmpp event.
|
||||||
|
Message(Message),
|
||||||
|
#[cfg(feature = "escape-hatch")]
|
||||||
|
/// Variant only available when the "escape-hatch" feature is enabled. Proxies a Presence
|
||||||
|
/// received as a tokio-xmpp event.
|
||||||
|
Presence(Presence),
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -17,9 +17,6 @@ pub async fn wait_for_events(agent: &mut Agent) -> Vec<Event> {
|
||||||
if let Some(event) = agent.client.next().await {
|
if let Some(event) = agent.client.next().await {
|
||||||
let mut events = Vec::new();
|
let mut events = Vec::new();
|
||||||
|
|
||||||
#[cfg(feature = "escape-hatch")]
|
|
||||||
events.push(Event::TokioXmppEvent(event.clone()));
|
|
||||||
|
|
||||||
match event {
|
match event {
|
||||||
TokioXmppEvent::Online { resumed: false, .. } => {
|
TokioXmppEvent::Online { resumed: false, .. } => {
|
||||||
let presence =
|
let presence =
|
||||||
|
|
@ -47,14 +44,23 @@ pub async fn wait_for_events(agent: &mut Agent) -> Vec<Event> {
|
||||||
events.push(Event::Disconnected(e));
|
events.push(Event::Disconnected(e));
|
||||||
}
|
}
|
||||||
TokioXmppEvent::Stanza(Stanza::Iq(iq)) => {
|
TokioXmppEvent::Stanza(Stanza::Iq(iq)) => {
|
||||||
|
#[cfg(feature = "escape-hatch")]
|
||||||
|
events.push(Event::Iq(iq.clone()));
|
||||||
|
|
||||||
let new_events = iq::handle_iq(agent, iq).await;
|
let new_events = iq::handle_iq(agent, iq).await;
|
||||||
events.extend(new_events);
|
events.extend(new_events);
|
||||||
}
|
}
|
||||||
TokioXmppEvent::Stanza(Stanza::Message(message)) => {
|
TokioXmppEvent::Stanza(Stanza::Message(message)) => {
|
||||||
|
#[cfg(feature = "escape-hatch")]
|
||||||
|
events.push(Event::Message(message.clone()));
|
||||||
|
|
||||||
let new_events = message::receive::handle_message(agent, message).await;
|
let new_events = message::receive::handle_message(agent, message).await;
|
||||||
events.extend(new_events);
|
events.extend(new_events);
|
||||||
}
|
}
|
||||||
TokioXmppEvent::Stanza(Stanza::Presence(presence)) => {
|
TokioXmppEvent::Stanza(Stanza::Presence(presence)) => {
|
||||||
|
#[cfg(feature = "escape-hatch")]
|
||||||
|
events.push(Event::Presence(presence.clone()));
|
||||||
|
|
||||||
let new_events = presence::receive::handle_presence(agent, presence).await;
|
let new_events = presence::receive::handle_presence(agent, presence).await;
|
||||||
events.extend(new_events);
|
events.extend(new_events);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue