pub mod clients;
pub mod service;
pub mod url;
use actix::Message;
use chrono::{DateTime, Utc};
use derive_more::{Display, From};
use medea_control_api_proto::grpc::callback as proto;
use crate::api::control::refs::StatefulFid;
#[doc(inline)]
pub use self::{
clients::{CallbackClientError, CallbackClientFactoryImpl},
service::CallbackService,
url::CallbackUrl,
};
#[derive(Debug)]
pub struct OnLeaveEvent {
reason: OnLeaveReason,
}
impl OnLeaveEvent {
#[inline]
#[must_use]
pub fn new(reason: OnLeaveReason) -> Self {
Self { reason }
}
}
impl From<OnLeaveEvent> for proto::OnLeave {
#[inline]
fn from(ev: OnLeaveEvent) -> Self {
Self {
reason: proto::on_leave::Reason::from(ev.reason) as i32,
}
}
}
#[derive(Debug)]
pub enum OnLeaveReason {
Disconnected,
LostConnection,
Kicked,
ServerShutdown,
}
impl From<OnLeaveReason> for proto::on_leave::Reason {
#[inline]
fn from(rsn: OnLeaveReason) -> Self {
match rsn {
OnLeaveReason::LostConnection => Self::LostConnection,
OnLeaveReason::ServerShutdown => Self::ServerShutdown,
OnLeaveReason::Disconnected => Self::Disconnected,
OnLeaveReason::Kicked => Self::Kicked,
}
}
}
#[derive(Debug)]
pub struct OnJoinEvent;
impl From<OnJoinEvent> for proto::OnJoin {
#[inline]
fn from(_: OnJoinEvent) -> Self {
Self {}
}
}
#[derive(Debug, From)]
pub enum CallbackEvent {
OnJoin(OnJoinEvent),
OnLeave(OnLeaveEvent),
}
impl From<CallbackEvent> for proto::request::Event {
#[inline]
fn from(ev: CallbackEvent) -> Self {
match ev {
CallbackEvent::OnJoin(on_join) => Self::OnJoin(on_join.into()),
CallbackEvent::OnLeave(on_leave) => Self::OnLeave(on_leave.into()),
}
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Display)]
pub enum MediaType {
Audio = 0b1,
Video = 0b10,
Both = 0b11,
}
impl MediaType {
#[must_use]
pub fn get_started(self, after: Self) -> Option<Self> {
match self {
MediaType::Audio => match after {
MediaType::Video => Some(MediaType::Audio),
_ => None,
},
MediaType::Video => match after {
MediaType::Audio => Some(MediaType::Video),
_ => None,
},
MediaType::Both => match after {
MediaType::Audio => Some(MediaType::Video),
MediaType::Video => Some(MediaType::Audio),
MediaType::Both => None,
},
}
}
}
impl From<&medea_client_api_proto::MediaType> for MediaType {
fn from(media_type: &medea_client_api_proto::MediaType) -> Self {
use medea_client_api_proto::MediaType as MediaTypeProto;
match media_type {
MediaTypeProto::Audio(_) => MediaType::Audio,
MediaTypeProto::Video(_) => MediaType::Video,
}
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash)]
pub enum MediaDirection {
Publish,
Play,
}
#[derive(Debug, Message)]
#[rtype(result = "Result<(), CallbackClientError>")]
pub struct CallbackRequest {
fid: StatefulFid,
event: CallbackEvent,
at: DateTime<Utc>,
}
impl CallbackRequest {
#[inline]
#[must_use]
pub fn new(element: StatefulFid, event: CallbackEvent) -> Self {
Self {
fid: element,
event,
at: Utc::now(),
}
}
}
impl From<CallbackRequest> for proto::Request {
fn from(req: CallbackRequest) -> Self {
Self {
event: Some(req.event.into()),
fid: req.fid.to_string(),
at: req.at.to_rfc3339(),
}
}
}