moqtap_client/draft15/event.rs
1//! Client event types emitted by a MoQT connection.
2
3use moqtap_codec::dispatch::{
4 AnyControlMessage, AnyDatagramHeader, AnyFetchHeader, AnySubgroupHeader,
5};
6use moqtap_codec::draft15::data_stream::{FetchHeader, SubgroupHeader, SubgroupObject};
7
8/// Direction of a message or stream relative to this endpoint.
9#[derive(Debug, Clone, Copy, PartialEq, Eq)]
10pub enum Direction {
11 /// Sent (outgoing).
12 Send,
13 /// Received (incoming).
14 Receive,
15}
16
17/// Data stream type.
18#[derive(Debug, Clone, Copy, PartialEq, Eq)]
19pub enum StreamKind {
20 /// Subgroup data stream.
21 Subgroup,
22 /// Fetch data stream.
23 Fetch,
24 /// Datagram.
25 Datagram,
26}
27
28/// Events emitted by a MoQT connection.
29///
30/// This enum is `#[non_exhaustive]` -- new variants may be added in minor
31/// releases. Downstream `match` arms should include a wildcard `_ =>` branch.
32#[non_exhaustive]
33#[derive(Debug, Clone)]
34pub enum ClientEvent {
35 /// MoQT setup handshake completed.
36 SetupComplete {
37 /// The negotiated MoQT version (from ALPN in draft-15).
38 negotiated_version: u64,
39 },
40
41 /// A control message was sent or received.
42 ControlMessage {
43 /// Whether the message was sent or received.
44 direction: Direction,
45 /// The decoded control message.
46 message: AnyControlMessage,
47 /// The raw wire bytes of the framed message (type + length + payload).
48 /// `None` if raw capture is not available.
49 raw: Option<Vec<u8>>,
50 },
51
52 /// A data stream was opened.
53 StreamOpened {
54 /// Whether we opened (Send) or accepted (Receive) the stream.
55 direction: Direction,
56 /// The type of data stream.
57 stream_kind: StreamKind,
58 /// Transport-level stream identifier.
59 stream_id: u64,
60 },
61
62 /// A data stream header was decoded after the stream opened.
63 DataStreamHeader {
64 /// Transport-level stream identifier.
65 stream_id: u64,
66 /// Whether we opened (Send) or accepted (Receive) the stream.
67 direction: Direction,
68 /// The parsed subgroup header.
69 header: AnySubgroupHeader,
70 },
71
72 /// A fetch response stream header was decoded.
73 FetchStreamHeader {
74 /// Transport-level stream identifier.
75 stream_id: u64,
76 /// Whether we opened (Send) or accepted (Receive) the stream.
77 direction: Direction,
78 /// The parsed fetch header.
79 header: AnyFetchHeader,
80 },
81
82 /// A subgroup object header was decoded on a subgroup stream.
83 SubgroupObjectReceived {
84 /// Transport-level stream identifier.
85 stream_id: u64,
86 /// Direction (Send when emitted from a writer, Receive from a reader).
87 direction: Direction,
88 /// The decoded subgroup header (for context).
89 subgroup_header: SubgroupHeader,
90 /// The decoded subgroup object.
91 object: SubgroupObject,
92 },
93
94 /// A fetch header was decoded on a fetch stream.
95 FetchHeaderReceived {
96 /// Transport-level stream identifier.
97 stream_id: u64,
98 /// Direction (Send when emitted from a writer, Receive from a reader).
99 direction: Direction,
100 /// The decoded fetch header.
101 header: FetchHeader,
102 },
103
104 /// A datagram was sent or received.
105 DatagramReceived {
106 /// Whether sent or received.
107 direction: Direction,
108 /// The parsed datagram header.
109 header: AnyDatagramHeader,
110 /// Size of the payload in bytes.
111 payload_len: usize,
112 },
113
114 /// A data stream was closed.
115 StreamClosed {
116 /// Transport-level stream identifier.
117 stream_id: u64,
118 /// Error code (0 = clean close).
119 error_code: u64,
120 },
121
122 /// Session entered draining state (GOAWAY received).
123 Draining {
124 /// The new session URI from the GOAWAY message.
125 new_session_uri: Vec<u8>,
126 },
127
128 /// Connection was closed.
129 Closed {
130 /// Application error code.
131 code: u32,
132 /// Human-readable reason.
133 reason: Vec<u8>,
134 },
135
136 /// A transport or protocol error occurred.
137 Error {
138 /// Error description.
139 error: String,
140 },
141}