Skip to main content

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}