Skip to main content

rvoip_core_traits/
connection.rs

1use crate::capability::{CapabilityDescriptor, NegotiatedCodecs};
2use crate::ids::{ConnectionId, ParticipantId, SessionId};
3use crate::stream::MediaStreamHandle;
4use chrono::{DateTime, Utc};
5use serde::{Deserialize, Serialize};
6use std::fmt;
7use std::sync::Arc;
8
9#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq, Serialize, Deserialize)]
10pub enum Transport {
11    Quic,
12    WebTransport,
13    WebSocket,
14    Sip,
15    WebRtc,
16    /// Amazon Connect (WebRTC interop via the `StartWebRTCContact` API +
17    /// Amazon Chime SDK media). Like [`Transport::WebRtc`] this is an
18    /// `AdapterKind::Interop` gateway to a foreign protocol.
19    AmazonConnect,
20    /// Vapi's bidirectional WebSocket agent transport. The adapter owns the
21    /// remote AI session while rvoip owns the SIP or WebRTC caller leg.
22    Vapi,
23    InProcessAi,
24}
25
26#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)]
27pub enum Direction {
28    Inbound,
29    Outbound,
30}
31
32#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)]
33pub enum ConnectionState {
34    Connecting,
35    Connected,
36    Held,
37    Ending,
38    Ended,
39    Failed,
40}
41
42/// Opaque transport-specific handle. Resolved by the owning adapter.
43#[derive(Clone)]
44pub struct TransportHandle(pub Arc<dyn std::any::Any + Send + Sync>);
45
46impl fmt::Debug for TransportHandle {
47    fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
48        formatter.write_str("TransportHandle { present: true }")
49    }
50}
51
52#[derive(Clone)]
53pub struct Connection {
54    pub id: ConnectionId,
55    pub session_id: SessionId,
56    pub participant_id: ParticipantId,
57    pub transport: Transport,
58    pub direction: Direction,
59    pub state: ConnectionState,
60    pub capabilities: CapabilityDescriptor,
61    pub negotiated_codecs: NegotiatedCodecs,
62    pub streams: Vec<MediaStreamHandle>,
63    pub messaging_enabled: bool,
64    pub transport_handle: TransportHandle,
65    pub opened_at: DateTime<Utc>,
66    pub closed_at: Option<DateTime<Utc>>,
67}
68
69impl fmt::Debug for Connection {
70    fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
71        formatter
72            .debug_struct("Connection")
73            .field("id", &self.id)
74            .field("session_id", &self.session_id)
75            .field("participant_id", &self.participant_id)
76            .field("transport", &self.transport)
77            .field("direction", &self.direction)
78            .field("state", &self.state)
79            .field("capabilities", &self.capabilities)
80            .field("negotiated_codecs", &self.negotiated_codecs)
81            .field("stream_count", &self.streams.len())
82            .field("messaging_enabled", &self.messaging_enabled)
83            .field("opened_at", &self.opened_at)
84            .field("closed_at", &self.closed_at)
85            .finish()
86    }
87}