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}