Base protocol
This commit is contained in:
+26
-5
@@ -4,7 +4,10 @@ use std::{
|
||||
sync::{Arc, Mutex},
|
||||
};
|
||||
|
||||
use tungstenite::{Message, WebSocket, accept};
|
||||
use anyhow::Error;
|
||||
use tungstenite::{Message, Utf8Bytes, WebSocket, accept};
|
||||
|
||||
use crate::types::{FromClient, ToClient, WsMessage};
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct Client(Arc<Mutex<WebSocket<TcpStream>>>);
|
||||
@@ -34,11 +37,29 @@ impl Hash for Client {
|
||||
}
|
||||
|
||||
impl Client {
|
||||
pub fn read(&self) -> crate::Result<Message> {
|
||||
self.0.lock().unwrap().read().map_err(|e| e.into())
|
||||
pub fn read(&self) -> crate::Result<Option<WsMessage<FromClient>>> {
|
||||
match self.0.lock().unwrap().read()? {
|
||||
Message::Text(t) => {
|
||||
let v = t.to_string();
|
||||
match serde_json::from_str(&v) {
|
||||
Ok(f) => Ok(Some(WsMessage::FromClient(f))),
|
||||
Err(_) => Ok(Some(WsMessage::String(v))),
|
||||
}
|
||||
}
|
||||
|
||||
Message::Binary(b) => Ok(Some(WsMessage::Binary(b))),
|
||||
|
||||
Message::Close(_) => Ok(None),
|
||||
|
||||
m => Err(Error::msg(format!("Invalid websocket format: {m}"))),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn send(&self, m: Message) -> crate::Result<()> {
|
||||
self.0.lock().unwrap().send(m).map_err(|e| e.into())
|
||||
pub fn send(&self, m: ToClient) -> crate::Result<()> {
|
||||
self.0
|
||||
.lock()
|
||||
.unwrap()
|
||||
.send(Message::Text(Utf8Bytes::from(serde_json::to_string(&m)?)))
|
||||
.map_err(|e| e.into())
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user