Base protocol

This commit is contained in:
2025-09-13 10:35:54 +02:00
parent b143295eda
commit 0919ec30d3
5 changed files with 116 additions and 22 deletions
+26 -5
View File
@@ -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())
}
}