45 lines
1.5 KiB
Rust
45 lines
1.5 KiB
Rust
//! The WebSocket client (RFC 6455; M4a spec, section 6): the handshake, the frame codec, and the
|
|
//! connection that uses them.
|
|
|
|
pub mod conn;
|
|
pub mod frame;
|
|
pub mod handshake;
|
|
|
|
/// Why a WebSocket ended or could not start. Every one of these ends the connection; `gatewayd`
|
|
/// then reconnects.
|
|
#[derive(Debug)]
|
|
pub enum WsError {
|
|
/// The server's answer to the handshake was not an upgrade to a WebSocket.
|
|
Handshake(String),
|
|
/// A frame broke the protocol.
|
|
Protocol(String),
|
|
/// A message over `MAX_MESSAGE`, refused from its length fields.
|
|
TooLarge,
|
|
/// The server closed the connection (a close frame, or the end of the stream).
|
|
Closed,
|
|
/// Nothing was heard for the dead-after limit.
|
|
Dead,
|
|
Io(std::io::Error),
|
|
}
|
|
|
|
impl std::fmt::Display for WsError {
|
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
match self {
|
|
WsError::Handshake(why) => write!(f, "WebSocket handshake failed: {why}"),
|
|
WsError::Protocol(why) => write!(f, "WebSocket protocol error: {why}"),
|
|
WsError::TooLarge => write!(f, "WebSocket message too large"),
|
|
WsError::Closed => write!(f, "WebSocket closed"),
|
|
WsError::Dead => write!(f, "WebSocket silent for too long"),
|
|
WsError::Io(e) => write!(f, "WebSocket I/O: {e}"),
|
|
}
|
|
}
|
|
}
|
|
|
|
impl std::error::Error for WsError {}
|
|
|
|
impl From<std::io::Error> for WsError {
|
|
fn from(e: std::io::Error) -> Self {
|
|
WsError::Io(e)
|
|
}
|
|
}
|