pub mod builder;
pub mod frame;
mod handshake;
mod parsed_addr;
pub mod split;
mod stream;
use crate::error::WebSocketError;
use builder::WebSocketBuilder;
use frame::Frame;
use split::{WebSocketReadHalf, WebSocketWriteHalf};
#[derive(Debug)]
enum FrameType {
Text,
Binary,
Control,
}
impl Default for FrameType {
fn default() -> Self {
Self::Control
}
}
#[derive(Debug)]
pub struct WebSocket {
read_half: WebSocketReadHalf,
write_half: WebSocketWriteHalf,
accepted_subprotocol: Option<String>,
handshake_response_headers: Option<Vec<(String, String)>>,
}
impl WebSocket {
pub fn builder() -> WebSocketBuilder {
WebSocketBuilder::new()
}
pub async fn connect(url: &str) -> Result<Self, WebSocketError> {
WebSocketBuilder::new().connect(url).await
}
pub async fn receive(&mut self) -> Result<Frame, WebSocketError> {
let received_frame = self.read_half.receive().await?;
self.write_half.flush().await?;
Ok(received_frame)
}
pub async fn receive_without_handling(&mut self) -> Result<Frame, WebSocketError> {
self.read_half.receive_without_handling().await
}
pub async fn send(&mut self, frame: Frame) -> Result<(), WebSocketError> {
self.write_half.send(frame).await
}
pub async fn send_text(&mut self, payload: String) -> Result<(), WebSocketError> {
self.write_half.send_text(payload).await
}
pub async fn send_binary(&mut self, payload: Vec<u8>) -> Result<(), WebSocketError> {
self.write_half.send_binary(payload).await
}
pub async fn close(&mut self, payload: Option<(u16, String)>) -> Result<(), WebSocketError> {
self.write_half.close(payload).await
}
pub async fn send_ping(&mut self, payload: Option<Vec<u8>>) -> Result<(), WebSocketError> {
self.write_half.send_ping(payload).await
}
pub async fn send_pong(&mut self, payload: Option<Vec<u8>>) -> Result<(), WebSocketError> {
self.write_half.send_pong(payload).await
}
pub async fn shutdown(&mut self) -> Result<(), WebSocketError> {
self.write_half.shutdown().await
}
pub fn split(self) -> (WebSocketReadHalf, WebSocketWriteHalf) {
(self.read_half, self.write_half)
}
pub fn join(read_half: WebSocketReadHalf, write_half: WebSocketWriteHalf) -> Self {
Self {
read_half,
write_half,
accepted_subprotocol: None,
handshake_response_headers: None,
}
}
pub fn accepted_subprotocol(&self) -> &Option<String> {
&self.accepted_subprotocol
}
pub fn handshake_response_headers(&self) -> &Option<Vec<(String, String)>> {
&self.handshake_response_headers
}
}