use serde::{Deserialize, Serialize};
use std::fmt;
use uuid::Uuid;
pub use crate::api::types::{
AudioFrame, AudioStreamConfig, CallDecision, CallDirection, CallSession, IncomingCall,
MediaInfo, PreparedCall, Session, SessionRole, SessionStats, StatusCode, TerminationReason,
};
pub use crate::state_table::types::{DialogId, MediaSessionId, SessionId};
#[derive(Debug, Clone, Copy, Hash, Eq, PartialEq, Serialize, Deserialize)]
pub enum FailureReason {
Timeout,
Rejected,
NetworkError,
MediaError,
ProtocolError,
Other,
}
impl fmt::Display for FailureReason {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
FailureReason::Timeout => write!(f, "Timeout"),
FailureReason::Rejected => write!(f, "Rejected"),
FailureReason::NetworkError => write!(f, "Network error"),
FailureReason::MediaError => write!(f, "Media error"),
FailureReason::ProtocolError => write!(f, "Protocol error"),
FailureReason::Other => write!(f, "Other error"),
}
}
}
#[derive(Debug, Clone, Copy, Hash, Eq, PartialEq, Serialize, Deserialize)]
pub enum CallState {
Idle,
Initiating,
CancelPending,
Cancelling,
Ringing,
Answering, AnsweringHangupPending,
EarlyMedia,
Active,
HoldPending,
OnHold,
Resuming,
Muted,
Bridged, Transferring,
TransferringCall, ConsultationCall,
Terminating,
Terminated,
Cancelled,
Failed(FailureReason),
Registering,
Registered,
Unregistering,
Subscribing,
Subscribed,
Publishing,
Authenticating,
Messaging, }
impl CallState {
pub fn is_final(&self) -> bool {
matches!(
self,
CallState::Terminated | CallState::Cancelled | CallState::Failed(_)
)
}
pub fn is_in_progress(&self) -> bool {
matches!(
self,
CallState::Initiating
| CallState::CancelPending
| CallState::Cancelling
| CallState::Ringing
| CallState::Answering
| CallState::AnsweringHangupPending
| CallState::Active
| CallState::HoldPending
| CallState::OnHold
| CallState::EarlyMedia
| CallState::Resuming
| CallState::Muted
| CallState::Bridged
| CallState::Transferring
| CallState::TransferringCall
| CallState::ConsultationCall
)
}
}
impl fmt::Display for CallState {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
CallState::Idle => write!(f, "Idle"),
CallState::Initiating => write!(f, "Initiating"),
CallState::CancelPending => write!(f, "CancelPending"),
CallState::Cancelling => write!(f, "Cancelling"),
CallState::Ringing => write!(f, "Ringing"),
CallState::Answering => write!(f, "Answering"),
CallState::AnsweringHangupPending => write!(f, "AnsweringHangupPending"),
CallState::EarlyMedia => write!(f, "EarlyMedia"),
CallState::Active => write!(f, "Active"),
CallState::HoldPending => write!(f, "HoldPending"),
CallState::OnHold => write!(f, "OnHold"),
CallState::Resuming => write!(f, "Resuming"),
CallState::Muted => write!(f, "Muted"),
CallState::Bridged => write!(f, "Bridged"),
CallState::Transferring => write!(f, "Transferring"),
CallState::TransferringCall => write!(f, "TransferringCall"),
CallState::ConsultationCall => write!(f, "ConsultationCall"),
CallState::Terminating => write!(f, "Terminating"),
CallState::Terminated => write!(f, "Terminated"),
CallState::Cancelled => write!(f, "Cancelled"),
CallState::Failed(reason) => write!(f, "Failed({})", reason),
CallState::Registering => write!(f, "Registering"),
CallState::Registered => write!(f, "Registered"),
CallState::Unregistering => write!(f, "Unregistering"),
CallState::Subscribing => write!(f, "Subscribing"),
CallState::Subscribed => write!(f, "Subscribed"),
CallState::Publishing => write!(f, "Publishing"),
CallState::Authenticating => write!(f, "Authenticating"),
CallState::Messaging => write!(f, "Messaging"),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CallInfo {
pub session_id: SessionId,
pub from: String,
pub to: String,
pub state: CallState,
pub start_time: std::time::SystemTime,
pub media_active: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SessionInfo {
pub session_id: SessionId,
pub from: String,
pub to: String,
pub state: CallState,
pub start_time: std::time::SystemTime,
pub media_active: bool,
}
pub struct AudioFrameSubscriber {
pub session_id: SessionId,
pub receiver: tokio::sync::mpsc::Receiver<rvoip_media_core::types::AudioFrame>,
}
impl AudioFrameSubscriber {
pub fn new(
session_id: SessionId,
receiver: tokio::sync::mpsc::Receiver<rvoip_media_core::types::AudioFrame>,
) -> Self {
Self {
session_id,
receiver,
}
}
pub async fn recv(&mut self) -> Option<rvoip_media_core::types::AudioFrame> {
self.receiver.recv().await
}
pub fn try_recv(
&mut self,
) -> Result<rvoip_media_core::types::AudioFrame, tokio::sync::mpsc::error::TryRecvError> {
self.receiver.try_recv()
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum SessionEvent {
IncomingCall {
from: String,
to: String,
call_id: String,
dialog_id: DialogId,
sdp: Option<String>,
},
CallProgress {
dialog_id: DialogId,
status_code: u16,
reason: Option<String>,
},
CallAnswered {
dialog_id: DialogId,
sdp: Option<String>,
},
CallTerminated {
dialog_id: DialogId,
reason: Option<String>,
},
CallFailed { dialog_id: DialogId, reason: String },
MediaStateChanged {
media_id: MediaSessionId,
state: MediaState,
},
DtmfReceived { dialog_id: DialogId, digit: char },
HoldRequest { dialog_id: DialogId },
ResumeRequest { dialog_id: DialogId },
TransferRequest {
dialog_id: DialogId,
target: String,
attended: bool,
},
RegistrationStarted {
dialog_id: DialogId,
uri: String,
expires: u32,
},
RegistrationSuccess {
dialog_id: DialogId,
uri: String,
expires: u32,
},
RegistrationFailed {
dialog_id: DialogId,
reason: String,
status_code: u16,
},
UnregistrationComplete { dialog_id: DialogId },
SubscriptionStarted {
dialog_id: DialogId,
uri: String,
event_package: String,
expires: u32,
},
SubscriptionAccepted { dialog_id: DialogId, expires: u32 },
SubscriptionFailed {
dialog_id: DialogId,
reason: String,
status_code: u16,
},
NotifyReceived {
dialog_id: DialogId,
event_package: String,
body: Option<String>,
},
MessageSent {
dialog_id: DialogId,
to: String,
body: String,
},
MessageReceived {
dialog_id: DialogId,
from: String,
body: String,
},
MessageDelivered { dialog_id: DialogId },
MessageDeliveryFailed {
dialog_id: DialogId,
reason: String,
status_code: u16,
},
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum MediaState {
Idle,
Negotiating,
Active,
OnHold,
Failed(String),
Terminated,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum TransferStatus {
Initiated,
InProgress,
Completed,
Failed(String),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum MediaDirection {
SendRecv,
SendOnly,
RecvOnly,
Inactive,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum RegistrationState {
Unregistered,
Registering,
Registered,
Failed(String),
Unregistering,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum PresenceStatus {
Available,
Away,
Busy,
DoNotDisturb,
Offline,
Custom(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Credentials {
pub username: String,
pub password: String,
pub realm: Option<String>,
}
impl Credentials {
pub fn new(username: impl Into<String>, password: impl Into<String>) -> Self {
Self {
username: username.into(),
password: password.into(),
realm: None,
}
}
pub fn with_realm(mut self, realm: impl Into<String>) -> Self {
self.realm = Some(realm.into());
self
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AudioDevice {
pub id: String,
pub name: String,
pub is_input: bool,
pub is_output: bool,
pub sample_rates: Vec<u32>,
pub channels: u8,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct ConferenceId(pub Uuid);
impl ConferenceId {
pub fn new() -> Self {
Self(Uuid::new_v4())
}
}
impl Default for ConferenceId {
fn default() -> Self {
Self::new()
}
}
impl fmt::Display for ConferenceId {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.0)
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CallDetailRecord {
pub session_id: SessionId,
pub dialog_id: DialogId,
pub from: String,
pub to: String,
pub start_time: std::time::SystemTime,
pub end_time: Option<std::time::SystemTime>,
pub duration: Option<u64>,
pub termination_reason: Option<String>,
pub call_id: String,
}
#[derive(Debug, Clone)]
pub struct IncomingCallInfo {
pub session_id: SessionId,
pub dialog_id: DialogId,
pub from: String,
pub to: String,
pub call_id: String,
pub p_asserted_identity: Option<String>,
}