//! 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 for WsError { fn from(e: std::io::Error) -> Self { WsError::Io(e) } }