Skip to main content

moqtap_proxy/
event.rs

1//! Proxy event types emitted by the inline parser.
2
3use std::net::SocketAddr;
4
5use moqtap_codec::dispatch::{
6    AnyControlMessage, AnyDatagramHeader, AnyFetchHeader, AnyObjectHeader, AnySubgroupHeader,
7};
8
9/// Which side of the proxy a message originates from.
10#[derive(Debug, Clone, Copy, PartialEq, Eq)]
11pub enum ProxySide {
12    /// Client → Proxy (downstream ingress).
13    ClientToProxy,
14    /// Proxy → Relay (upstream egress).
15    ProxyToRelay,
16    /// Relay → Proxy (upstream ingress).
17    RelayToProxy,
18    /// Proxy → Client (downstream egress).
19    ProxyToClient,
20}
21
22/// Unique session identifier (monotonic counter assigned by the proxy).
23#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
24pub struct SessionId(pub u64);
25
26/// The kind of data stream header parsed from a unidirectional stream.
27#[derive(Debug, Clone)]
28pub enum DataStreamHeaderKind {
29    /// Subgroup stream header.
30    Subgroup(AnySubgroupHeader),
31    /// Fetch response stream header.
32    Fetch(AnyFetchHeader),
33}
34
35/// Events emitted by the proxy during stream forwarding.
36#[derive(Debug, Clone)]
37pub enum ProxyEvent {
38    /// A new client connected and a session was created.
39    SessionStarted {
40        /// The session identifier.
41        session_id: SessionId,
42        /// The client's remote address.
43        client_addr: SocketAddr,
44    },
45
46    /// A setup message (CLIENT_SETUP or SERVER_SETUP) was observed.
47    SetupMessage {
48        /// The session identifier.
49        session_id: SessionId,
50        /// Which side sent the message.
51        side: ProxySide,
52        /// The decoded setup message.
53        message: AnyControlMessage,
54    },
55
56    /// A control message was parsed from the forwarded byte stream.
57    ControlMessage {
58        /// The session identifier.
59        session_id: SessionId,
60        /// Which side sent the message.
61        side: ProxySide,
62        /// The decoded control message.
63        message: AnyControlMessage,
64    },
65
66    /// A data stream header was parsed from a unidirectional stream.
67    DataStreamHeader {
68        /// The session identifier.
69        session_id: SessionId,
70        /// Which side opened the stream.
71        side: ProxySide,
72        /// The parsed header.
73        header: DataStreamHeaderKind,
74    },
75
76    /// An object header was parsed on a data stream.
77    ObjectHeader {
78        /// The session identifier.
79        session_id: SessionId,
80        /// Which side sent the object.
81        side: ProxySide,
82        /// The parsed object header.
83        header: AnyObjectHeader,
84    },
85
86    /// A datagram was forwarded and its header was parsed.
87    Datagram {
88        /// The session identifier.
89        session_id: SessionId,
90        /// Which side sent the datagram.
91        side: ProxySide,
92        /// The parsed datagram header.
93        header: AnyDatagramHeader,
94        /// Size of the datagram payload in bytes.
95        payload_len: usize,
96    },
97
98    /// A bidirectional stream was opened or accepted.
99    BiStreamOpened {
100        /// The session identifier.
101        session_id: SessionId,
102        /// Which side opened the stream.
103        side: ProxySide,
104    },
105
106    /// A unidirectional stream was opened or accepted.
107    UniStreamOpened {
108        /// The session identifier.
109        session_id: SessionId,
110        /// Which side opened the stream.
111        side: ProxySide,
112    },
113
114    /// Inline parse failed (non-fatal — bytes are still forwarded).
115    ParseError {
116        /// The session identifier.
117        session_id: SessionId,
118        /// Which side the error occurred on.
119        side: ProxySide,
120        /// Description of the parse error.
121        error: String,
122    },
123
124    /// A stream direction was closed (FIN or reset).
125    StreamClosed {
126        /// The session identifier.
127        session_id: SessionId,
128        /// Which side closed.
129        side: ProxySide,
130    },
131
132    /// The session ended.
133    SessionEnded {
134        /// The session identifier.
135        session_id: SessionId,
136        /// Reason for session termination.
137        reason: String,
138    },
139}