use std::fmt;
use bytes::Bytes;
use deadpool::managed::PoolConfig;
use derive_more::{Display, From};
use failure::Fail;
use medea_coturn_telnet_client::{
pool::{Error as PoolError, Manager as PoolManager, Pool},
CoturnTelnetError,
};
use crate::turn::IceUsername;
#[derive(Display, Debug, Fail, From)]
pub enum CoturnCliError {
#[display(fmt = "Cannot retrieve connection from pool: {}", _0)]
PoolError(PoolError),
#[display(fmt = "Connection returned error: {}", _0)]
CliError(CoturnTelnetError),
}
#[derive(Clone)]
pub struct CoturnTelnetClient(Pool);
impl CoturnTelnetClient {
#[inline]
#[must_use]
pub fn new<H: Into<String>, P: Into<Bytes>>(
addr: (H, u16),
pass: P,
pool_config: PoolConfig,
) -> Self {
Self(Pool::from_config(
PoolManager::new(addr.0, addr.1, pass),
pool_config,
))
}
pub async fn delete_sessions(
&self,
users: &[IceUsername],
) -> Result<(), CoturnCliError> {
let mut conn = self.0.get().await?;
for u in users {
let sessions =
conn.print_sessions(u.to_string()).await?.into_iter();
conn.delete_sessions(sessions).await?;
}
Ok(())
}
}
impl fmt::Debug for CoturnTelnetClient {
#[inline]
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("CoturnTelnetClient")
.field("pool", &self.0.status())
.finish()
}
}