use crate::Result;
#[derive(Debug, Clone)]
pub enum Message {
Text(String),
Binary(Vec<u8>),
}
impl From<Vec<u8>> for Message {
fn from(data: Vec<u8>) -> Self {
Message::Binary(data)
}
}
impl From<String> for Message {
fn from(text: String) -> Self {
Message::Text(text)
}
}
impl Message {
pub fn text(text: impl Into<String>) -> Self {
Self::Text(text.into())
}
pub fn binary(data: impl Into<Vec<u8>>) -> Self {
Self::Binary(data.into())
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[repr(i64)]
pub enum CloseCode {
Normal = 1000,
GoingAway = 1001,
ProtocolError = 1002,
UnsupportedData = 1003,
NoStatusReceived = 1005,
AbnormalClosure = 1006,
InvalidFramePayloadData = 1007,
PolicyViolation = 1008,
MessageTooBig = 1009,
MandatoryExtension = 1010,
InternalServerError = 1011,
TlsHandshake = 1015,
}
pub enum WebSocket {
#[cfg(target_vendor = "apple")]
Foundation(crate::backend::foundation::FoundationWebSocket),
#[cfg(windows)]
Windows(crate::backend::windows::WindowsWebSocket),
Reqwest(crate::backend::reqwest::ReqwestWebSocket),
}
impl WebSocket {
pub async fn send(&mut self, message: impl Into<Message>) -> Result<()> {
match self {
#[cfg(target_vendor = "apple")]
WebSocket::Foundation(ws) => ws.send(message.into()).await,
#[cfg(windows)]
WebSocket::Windows(ws) => ws.send(message.into()).await,
WebSocket::Reqwest(ws) => ws.send(message.into()).await,
}
}
pub async fn receive(&mut self) -> Result<Message> {
match self {
#[cfg(target_vendor = "apple")]
WebSocket::Foundation(ws) => ws.receive().await,
#[cfg(windows)]
WebSocket::Windows(ws) => ws.receive().await,
WebSocket::Reqwest(ws) => ws.receive().await,
}
}
pub async fn close(&mut self, code: CloseCode, reason: Option<&str>) -> Result<()> {
match self {
#[cfg(target_vendor = "apple")]
WebSocket::Foundation(ws) => ws.close(code, reason).await,
#[cfg(windows)]
WebSocket::Windows(ws) => ws.close(code, reason).await,
WebSocket::Reqwest(ws) => ws.close(code, reason).await,
}
}
pub fn close_code(&self) -> Option<isize> {
match self {
#[cfg(target_vendor = "apple")]
WebSocket::Foundation(ws) => ws.close_code(),
#[cfg(windows)]
WebSocket::Windows(ws) => ws.close_code(),
WebSocket::Reqwest(ws) => ws.close_code(),
}
}
pub fn close_reason(&self) -> Option<String> {
match self {
#[cfg(target_vendor = "apple")]
WebSocket::Foundation(ws) => ws.close_reason(),
#[cfg(windows)]
WebSocket::Windows(ws) => ws.close_reason(),
WebSocket::Reqwest(ws) => ws.close_reason(),
}
}
pub fn set_maximum_message_size(&mut self, size: isize) {
match self {
#[cfg(target_vendor = "apple")]
WebSocket::Foundation(ws) => ws.set_maximum_message_size(size),
#[cfg(windows)]
WebSocket::Windows(ws) => ws.set_maximum_message_size(size),
WebSocket::Reqwest(ws) => ws.set_maximum_message_size(size),
}
}
pub fn maximum_message_size(&self) -> isize {
match self {
#[cfg(target_vendor = "apple")]
WebSocket::Foundation(ws) => ws.maximum_message_size(),
#[cfg(windows)]
WebSocket::Windows(ws) => ws.maximum_message_size(),
WebSocket::Reqwest(ws) => ws.maximum_message_size(),
}
}
}
pub enum WebSocketBuilder {
#[cfg(target_vendor = "apple")]
Foundation(crate::backend::foundation::FoundationWebSocketBuilder),
#[cfg(windows)]
Windows(crate::backend::windows::WindowsWebSocketBuilder),
Reqwest(crate::backend::reqwest::ReqwestWebSocketBuilder),
}
impl WebSocketBuilder {
pub fn maximum_message_size(self, size: isize) -> Self {
match self {
#[cfg(target_vendor = "apple")]
WebSocketBuilder::Foundation(builder) => {
WebSocketBuilder::Foundation(builder.maximum_message_size(size))
}
#[cfg(windows)]
WebSocketBuilder::Windows(builder) => {
WebSocketBuilder::Windows(builder.maximum_message_size(size))
}
WebSocketBuilder::Reqwest(builder) => {
WebSocketBuilder::Reqwest(builder.maximum_message_size(size))
}
}
}
pub async fn connect(self, url: &str) -> Result<WebSocket> {
match self {
#[cfg(target_vendor = "apple")]
WebSocketBuilder::Foundation(builder) => {
let ws = builder.connect(url).await?;
Ok(WebSocket::Foundation(ws))
}
#[cfg(windows)]
WebSocketBuilder::Windows(builder) => {
let ws = builder.connect(url).await?;
Ok(WebSocket::Windows(ws))
}
WebSocketBuilder::Reqwest(builder) => {
let ws = builder.connect(url).await?;
Ok(WebSocket::Reqwest(ws))
}
}
}
}