moqtap_client/draft14/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::draft14::data_stream::{FetchObject, 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.
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 + payload) 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 object.
89 object: SubgroupObject,
90 },
91
92 /// A fetch object (self-contained) was decoded on a fetch stream.
93 FetchObjectReceived {
94 /// Transport-level stream identifier.
95 stream_id: u64,
96 /// Direction (Send when emitted from a writer, Receive from a reader).
97 direction: Direction,
98 /// The decoded fetch object.
99 object: FetchObject,
100 },
101
102 /// A datagram was sent or received.
103 DatagramReceived {
104 /// Whether sent or received.
105 direction: Direction,
106 /// The parsed datagram header.
107 header: AnyDatagramHeader,
108 /// Size of the payload in bytes.
109 payload_len: usize,
110 },
111
112 /// A data stream was closed.
113 StreamClosed {
114 /// Transport-level stream identifier.
115 stream_id: u64,
116 /// Error code (0 = clean close).
117 error_code: u64,
118 },
119
120 /// Session entered draining state (GOAWAY received).
121 Draining {
122 /// The new session URI from the GOAWAY message.
123 new_session_uri: Vec<u8>,
124 },
125
126 /// Connection was closed.
127 Closed {
128 /// Application error code.
129 code: u32,
130 /// Human-readable reason.
131 reason: Vec<u8>,
132 },
133
134 /// A transport or protocol error occurred.
135 Error {
136 /// Error description.
137 error: String,
138 },
139}