rvoip-core 0.3.5

Transport-agnostic spine for RVoIP — types, ConnectionAdapter trait, BridgeManager, Orchestrator entry point
Documentation
use crate::adapter::EndReason;
use crate::capability::CapabilityIntersection;
use crate::ids::{ConnectionId, ConversationId, ParticipantId, SessionId};
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use std::collections::{HashMap, HashSet};
use std::fmt;

#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub enum SessionState {
    Initiating,
    Active,
    Ending,
    Ended,
    Failed,
}

#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub enum SessionMedium {
    Voice,
    Video,
    VoiceVideo,
    ScreenShare,
    TextChat,
    Mixed,
}

#[derive(Clone)]
pub struct ConnectionRef {
    pub id: ConnectionId,
    pub participant_id: ParticipantId,
}

impl fmt::Debug for ConnectionRef {
    fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
        formatter.write_str("ConnectionRef")
    }
}

#[derive(Clone)]
pub struct Session {
    pub id: SessionId,
    pub conversation_id: ConversationId,
    pub state: SessionState,
    pub medium: SessionMedium,
    pub participants: HashSet<ParticipantId>,
    pub connections: HashMap<ConnectionId, ConnectionRef>,
    pub negotiated_capabilities: CapabilityIntersection,
    pub started_at: DateTime<Utc>,
    pub ended_at: Option<DateTime<Utc>>,
    pub end_reason: Option<EndReason>,
}

impl fmt::Debug for Session {
    fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
        formatter
            .debug_struct("Session")
            .field("state", &self.state)
            .field("medium", &self.medium)
            .field("participant_count", &self.participants.len())
            .field("connection_count", &self.connections.len())
            .field("started_at", &self.started_at)
            .field("ended_at", &self.ended_at)
            .field("end_reason_present", &self.end_reason.is_some())
            .finish()
    }
}