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}