use async_stomp::{FromServer, Message, ToServer};
use awc::{
error::{WsClientError, WsProtocolError},
ws::CloseReason,
};
use tokio::sync::mpsc::error::SendError;
#[derive(Debug)]
pub enum WStompConnectError {
WsClientError(WsClientError),
ConnectMessageFailed(Box<SendError<Message<ToServer>>>),
ReconnectionLimit,
}
#[derive(Debug)]
pub enum WStompEvent {
Message(Message<FromServer>),
Error(WStompError),
}
impl From<WStompError> for WStompEvent {
fn from(err: WStompError) -> Self {
Self::Error(err)
}
}
#[derive(Debug)]
pub enum WStompError {
WsReceive(WsProtocolError),
WsSend(WsProtocolError),
StompDecoding(anyhow::Error),
StompEncoding(anyhow::Error),
IncompleteStompFrame,
WebsocketClosed(Option<CloseReason>),
PingFailed(anyhow::Error),
PingTimeout,
}
impl std::fmt::Display for WStompConnectError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::WsClientError(WsClientError::InvalidResponseStatus(status)) => write!(
f,
"WebSocket connection error: server rejected upgrade with HTTP {}",
status
),
Self::WsClientError(err) => write!(f, "WebSocket connection error: {}", err),
Self::ConnectMessageFailed(msg) => write!(f, "WebSocket receive error: {}", msg),
Self::ReconnectionLimit => write!(f, "Reconnection retry limit reached"),
}
}
}
impl std::error::Error for WStompConnectError {}
impl std::fmt::Display for WStompError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::WsReceive(err) => write!(f, "WebSocket receive error: {}", err),
Self::WsSend(err) => write!(f, "WebSocket send error: {}", err),
Self::StompDecoding(err) => write!(f, "STOMP decoding error: {}", err),
Self::StompEncoding(err) => write!(f, "STOMP encoding error: {}", err),
Self::IncompleteStompFrame => {
write!(f, "STOMP decoding warning: Dropped incomplete frame")
}
Self::WebsocketClosed(reason) => write!(
f,
"Websocket closed {}",
reason
.as_ref()
.map(|r| r.description.clone().unwrap_or_default())
.unwrap_or_default()
),
Self::PingFailed(err) => write!(f, "Websocket ping failed: {err}"),
Self::PingTimeout => write!(f, "Websocket ping timeout"),
}
}
}
impl std::error::Error for WStompError {}