use crate::varint::VarInt;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct WtStreamReset {
pub stream_id: u64,
pub reliable_size: u64,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum WebTransportEvent {
BidiStreamOpen {
stream_id: u64,
session_id: u64,
},
BidiStreamData {
stream_id: u64,
data: Vec<u8>,
},
BidiStreamEnd {
stream_id: u64,
},
UniStreamOpen {
stream_id: u64,
session_id: u64,
},
UniStreamData {
stream_id: u64,
data: Vec<u8>,
},
UniStreamEnd {
stream_id: u64,
},
SessionClosed {
session_id: u64,
reset_streams: Vec<WtStreamReset>,
error_code: u64,
close_error_code: u32,
close_message: String,
},
SessionEstablished {
session_id: u64,
flow_control_enabled: bool,
},
SessionDraining {
session_id: u64,
},
Capsule {
session_id: u64,
capsule: crate::webtransport::Capsule,
},
Datagram {
session_id: u64,
payload: Vec<u8>,
},
StreamReset {
session_id: u64,
stream_id: u64,
error_code: u64,
final_size: u64,
},
StreamStopSending {
session_id: u64,
stream_id: u64,
error_code: u64,
},
BufferedStreamRejected {
stream_id: u64,
error_code: u64,
},
}
impl WebTransportEvent {
pub fn stream_id(&self) -> Option<u64> {
match self {
Self::BidiStreamOpen { stream_id, .. }
| Self::BidiStreamData { stream_id, .. }
| Self::BidiStreamEnd { stream_id }
| Self::UniStreamOpen { stream_id, .. }
| Self::UniStreamData { stream_id, .. }
| Self::UniStreamEnd { stream_id }
| Self::StreamReset { stream_id, .. }
| Self::StreamStopSending { stream_id, .. }
| Self::BufferedStreamRejected { stream_id, .. } => Some(*stream_id),
Self::SessionClosed { session_id, .. }
| Self::SessionEstablished { session_id, .. }
| Self::SessionDraining { session_id }
| Self::Capsule { session_id, .. }
| Self::Datagram { session_id, .. } => Some(*session_id),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Event {
SettingsReceived {
settings: crate::settings::Settings,
wt_settings: Option<crate::webtransport::settings::Settings>,
},
HeadersBegin {
stream_id: u64,
},
Header {
stream_id: u64,
name: Vec<u8>,
value: Vec<u8>,
},
HeadersEnd {
stream_id: u64,
},
Data {
stream_id: u64,
data: Vec<u8>,
},
StreamEnd {
stream_id: u64,
},
StreamReset {
stream_id: u64,
error_code: u64,
},
StopSending {
stream_id: u64,
error_code: u64,
},
GoawayReceived {
id: VarInt,
},
WebTransport(WebTransportEvent),
ConnectionError {
error_code: u64,
reason: String,
},
}
impl Event {
pub fn stream_id(&self) -> Option<u64> {
match self {
Self::HeadersBegin { stream_id }
| Self::Header { stream_id, .. }
| Self::HeadersEnd { stream_id }
| Self::Data { stream_id, .. }
| Self::StreamEnd { stream_id }
| Self::StreamReset { stream_id, .. }
| Self::StopSending { stream_id, .. } => Some(*stream_id),
Self::WebTransport(wt) => wt.stream_id(),
_ => None,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_event_stream_id() {
let event = Event::HeadersBegin { stream_id: 4 };
assert_eq!(event.stream_id(), Some(4));
let event = Event::SettingsReceived {
settings: crate::settings::Settings::new(),
wt_settings: None,
};
assert_eq!(event.stream_id(), None);
}
#[test]
fn test_webtransport_event_stream_id() {
let wt = WebTransportEvent::BidiStreamOpen {
stream_id: 10,
session_id: 0,
};
assert_eq!(wt.stream_id(), Some(10));
let wt = WebTransportEvent::SessionEstablished {
session_id: 20,
flow_control_enabled: false,
};
assert_eq!(wt.stream_id(), Some(20));
let event = Event::WebTransport(WebTransportEvent::UniStreamEnd { stream_id: 30 });
assert_eq!(event.stream_id(), Some(30));
}
}