1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
use std::fmt::{Display, Formatter};
use ockam_core::Error;
use ockam_transport_core::TransportError;
use tokio_tungstenite::tungstenite::Error as TungsteniteError;
#[derive(Clone, Copy, Debug)]
#[non_exhaustive]
pub enum WebSocketError {
Transport(TransportError),
Http,
Tls,
}
impl WebSocketError {
pub const DOMAIN_CODE: u32 = 21_000;
pub const DOMAIN_NAME: &'static str = "OCKAM_TRANSPORT_WEBSOCKET";
pub fn code(&self) -> u32 {
match self {
WebSocketError::Transport(_) => 0,
WebSocketError::Http => 0,
WebSocketError::Tls => 1,
}
}
}
impl Display for WebSocketError {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
let err: Error = (*self).into();
err.fmt(f)
}
}
impl From<WebSocketError> for Error {
fn from(e: WebSocketError) -> Error {
match e {
WebSocketError::Transport(e) => e.into(),
_ => Error::new(
WebSocketError::DOMAIN_CODE + e.code(),
WebSocketError::DOMAIN_NAME,
),
}
}
}
impl From<TungsteniteError> for WebSocketError {
fn from(e: TungsteniteError) -> Self {
match e {
TungsteniteError::ConnectionClosed => Self::Transport(TransportError::ConnectionDrop),
TungsteniteError::AlreadyClosed => Self::Transport(TransportError::ConnectionDrop),
TungsteniteError::Io(_) => Self::Transport(TransportError::GenericIo),
TungsteniteError::Url(_) => Self::Transport(TransportError::InvalidAddress),
TungsteniteError::HttpFormat(_) => Self::Transport(TransportError::InvalidAddress),
TungsteniteError::Capacity(_) => Self::Transport(TransportError::Capacity),
TungsteniteError::Utf8 => Self::Transport(TransportError::Encoding),
TungsteniteError::Protocol(_) => Self::Transport(TransportError::Protocol),
TungsteniteError::SendQueueFull(_) => Self::Transport(TransportError::SendBadMessage),
TungsteniteError::Http(_) => Self::Http,
TungsteniteError::Tls(_) => Self::Tls,
}
}
}
impl<T> From<futures_channel::mpsc::TrySendError<T>> for WebSocketError {
fn from(_e: futures_channel::mpsc::TrySendError<T>) -> Self {
Self::Transport(TransportError::GenericIo)
}
}