1use crate::adapter::EndReason;
2use crate::capability::CapabilityIntersection;
3use crate::ids::{ConnectionId, ConversationId, ParticipantId, SessionId};
4use chrono::{DateTime, Utc};
5use serde::{Deserialize, Serialize};
6use std::collections::{HashMap, HashSet};
7use std::fmt;
8
9#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)]
10pub enum SessionState {
11 Initiating,
12 Active,
13 Ending,
14 Ended,
15 Failed,
16}
17
18#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)]
19pub enum SessionMedium {
20 Voice,
21 Video,
22 VoiceVideo,
23 ScreenShare,
24 TextChat,
25 Mixed,
26}
27
28#[derive(Clone)]
29pub struct ConnectionRef {
30 pub id: ConnectionId,
31 pub participant_id: ParticipantId,
32}
33
34impl fmt::Debug for ConnectionRef {
35 fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
36 formatter.write_str("ConnectionRef")
37 }
38}
39
40#[derive(Clone)]
41pub struct Session {
42 pub id: SessionId,
43 pub conversation_id: ConversationId,
44 pub state: SessionState,
45 pub medium: SessionMedium,
46 pub participants: HashSet<ParticipantId>,
47 pub connections: HashMap<ConnectionId, ConnectionRef>,
48 pub negotiated_capabilities: CapabilityIntersection,
49 pub started_at: DateTime<Utc>,
50 pub ended_at: Option<DateTime<Utc>>,
51 pub end_reason: Option<EndReason>,
52}
53
54impl fmt::Debug for Session {
55 fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
56 formatter
57 .debug_struct("Session")
58 .field("state", &self.state)
59 .field("medium", &self.medium)
60 .field("participant_count", &self.participants.len())
61 .field("connection_count", &self.connections.len())
62 .field("started_at", &self.started_at)
63 .field("ended_at", &self.ended_at)
64 .field("end_reason_present", &self.end_reason.is_some())
65 .finish()
66 }
67}