use hurrycurry_protocol::{PacketC, PacketS, BINCODE_CONFIG}; use log::warn; use std::{collections::VecDeque, net::TcpStream}; use tungstenite::{stream::MaybeTlsStream, Message, WebSocket}; pub struct Network { sock: WebSocket>, queue_in: VecDeque, queue_out: VecDeque, } impl Network { pub fn connect(addr: &str) -> Self { let (sock, _resp) = tungstenite::connect(addr).unwrap(); Self { sock, queue_in: VecDeque::new(), queue_out: VecDeque::new(), } } pub fn poll(&mut self) { self.queue_in.extend(match self.sock.read() { Ok(Message::Text(packet)) => match serde_json::from_str(&packet) { Ok(p) => Some(p), Err(e) => { warn!("invalid json packet: {e:?}"); None } }, Ok(Message::Binary(packet)) => { match bincode::decode_from_slice(&packet, BINCODE_CONFIG) { Ok((p, _)) => Some(p), Err(e) => { warn!("invalid bincode packet: {e:?}"); None } } } Ok(_) => None, Err(e) => { warn!("{e:?}"); None } }); for packet in self.queue_out.drain(..) { self.sock .write(Message::Text(serde_json::to_string(&packet).unwrap())) .unwrap(); } } }