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        /// The transport the client chose via ALPN — e.g. `"QUIC"` or
45        /// `"WebTransport"`. Observers use this to label per-client
46        /// sessions; the proxy itself accepts either simultaneously.
47        client_transport: String,
48    },
49
50    /// A setup message (CLIENT_SETUP or SERVER_SETUP) was observed.
51    SetupMessage {
52        /// The session identifier.
53        session_id: SessionId,
54        /// Which side sent the message.
55        side: ProxySide,
56        /// The decoded setup message.
57        message: AnyControlMessage,
58    },
59
60    /// A control message was parsed from the forwarded byte stream.
61    ControlMessage {
62        /// The session identifier.
63        session_id: SessionId,
64        /// Which side sent the message.
65        side: ProxySide,
66        /// The decoded control message.
67        message: AnyControlMessage,
68    },
69
70    /// A data stream header was parsed from a unidirectional stream.
71    DataStreamHeader {
72        /// The session identifier.
73        session_id: SessionId,
74        /// Which side opened the stream.
75        side: ProxySide,
76        /// The parsed header.
77        header: DataStreamHeaderKind,
78    },
79
80    /// An object header was parsed on a data stream.
81    ObjectHeader {
82        /// The session identifier.
83        session_id: SessionId,
84        /// Which side sent the object.
85        side: ProxySide,
86        /// The parsed object header.
87        header: AnyObjectHeader,
88    },
89
90    /// A datagram was forwarded and its header was parsed.
91    Datagram {
92        /// The session identifier.
93        session_id: SessionId,
94        /// Which side sent the datagram.
95        side: ProxySide,
96        /// The parsed datagram header.
97        header: AnyDatagramHeader,
98        /// Size of the datagram payload in bytes.
99        payload_len: usize,
100    },
101
102    /// A bidirectional stream was opened or accepted.
103    BiStreamOpened {
104        /// The session identifier.
105        session_id: SessionId,
106        /// Which side opened the stream.
107        side: ProxySide,
108    },
109
110    /// A unidirectional stream was opened or accepted.
111    UniStreamOpened {
112        /// The session identifier.
113        session_id: SessionId,
114        /// Which side opened the stream.
115        side: ProxySide,
116    },
117
118    /// Inline parse failed (non-fatal — bytes are still forwarded).
119    ParseError {
120        /// The session identifier.
121        session_id: SessionId,
122        /// Which side the error occurred on.
123        side: ProxySide,
124        /// Description of the parse error.
125        error: String,
126    },
127
128    /// A stream direction was closed (FIN or reset).
129    StreamClosed {
130        /// The session identifier.
131        session_id: SessionId,
132        /// Which side closed.
133        side: ProxySide,
134    },
135
136    /// The session ended.
137    SessionEnded {
138        /// The session identifier.
139        session_id: SessionId,
140        /// Reason for session termination.
141        reason: String,
142    },
143}