use std::{fmt, time::Duration};
use actix::Message;
use futures::future::LocalBoxFuture;
use medea_client_api_proto::{
CloseDescription, Command, Credential, Event, MemberId, RoomId,
};
use crate::signalling::room::RoomError;
#[derive(Message)]
#[rtype(result = "()")]
pub struct CommandMessage {
pub member_id: MemberId,
pub command: Command,
}
impl CommandMessage {
#[inline]
#[must_use]
pub fn new(member_id: MemberId, command: Command) -> Self {
Self { member_id, command }
}
}
#[derive(Debug, Message)]
#[rtype(result = "()")]
pub struct EventMessage {
pub room_id: RoomId,
pub event: Event,
}
#[cfg_attr(test, mockall::automock)]
pub trait RpcConnection: fmt::Debug + Send {
fn close(
&mut self,
room_id: RoomId,
close_description: CloseDescription,
) -> LocalBoxFuture<'static, ()>;
fn send_event(&self, room_id: RoomId, event: Event);
}
#[cfg(test)]
impl_debug_by_struct_name!(MockRpcConnection);
#[derive(Clone, Copy, Debug)]
pub struct RpcConnectionSettings {
pub idle_timeout: Duration,
pub ping_interval: Duration,
}
#[derive(Debug, Message)]
#[rtype(result = "Result<RpcConnectionSettings, RoomError>")]
pub struct RpcConnectionEstablished {
pub member_id: MemberId,
pub credentials: Credential,
pub connection: Box<dyn RpcConnection>,
}
#[derive(Debug, Message)]
#[rtype(result = "()")]
pub struct RpcConnectionClosed {
pub member_id: MemberId,
pub reason: ClosedReason,
}
#[derive(Debug, Message)]
#[rtype(result = "()")]
pub struct Synchronize(pub MemberId);
#[derive(Clone, Copy, Debug, PartialEq)]
pub enum ClosedReason {
Closed {
normal: bool,
},
Lost,
}