lib-gst-meet 0.2.0

Connect GStreamer pipelines to Jitsi Meet conferences
use std::convert::TryFrom;

use anyhow::{anyhow, Result};
use async_trait::async_trait;
use tokio::sync::mpsc;
use xmpp_parsers::{iq::Iq, Element, FullJid, Jid};

use crate::stanza_filter::StanzaFilter;

#[derive(Debug)]
pub(crate) struct Pinger {
  pub(crate) jid: FullJid,
  pub(crate) tx: mpsc::Sender<Element>,
}

#[async_trait]
impl StanzaFilter for Pinger {
  #[tracing::instrument(level = "trace")]
  fn filter(&self, element: &Element) -> bool {
    element.is("iq", "jabber:client") && element.has_child("ping", "urn:xmpp:ping")
  }

  #[tracing::instrument(level = "trace", err)]
  async fn take(&self, element: Element) -> Result<()> {
    let iq = Iq::try_from(element)?;
    let result_iq = Iq::empty_result(
      iq.from.ok_or_else(|| anyhow!("iq missing from"))?,
      iq.id.clone(),
    )
    .with_from(Jid::Full(self.jid.clone()));
    self.tx.send(result_iq.into()).await?;
    Ok(())
  }
}