Skip to main content

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}