cubic_protocol_server/
connection.rs

1use std::net::SocketAddr;
2use tokio::sync::mpsc::Sender;
3use cubic_protocol::packet::{CustomError, PacketWritable, PacketWritableResult};
4use cubic_protocol::packet_bytes::OutputPacketBytesVec;
5use cubic_protocol::types::VarInt;
6use crate::write::{WriteMessage};
7
8pub struct Connection {
9    addr: SocketAddr,
10    sender: Sender<WriteMessage>,
11}
12
13impl Connection {
14    pub(crate) fn new(addr: SocketAddr, sender: Sender<WriteMessage>) -> Self {
15        Self { addr, sender }
16    }
17
18    pub fn get_addr(&self) -> SocketAddr {
19        self.addr
20    }
21
22    pub fn set_addr(&mut self, addr: SocketAddr) {
23        self.addr = addr;
24    }
25
26    pub async fn close(&self) -> Result<(), CustomError> {
27        self.sender.send(WriteMessage::Close).await
28            .map_err(|err| CustomError::String(err.to_string()))
29    }
30
31    pub async fn write_raw_bytes(&self, bytes: Vec<u8>) -> Result<(), CustomError>{
32        self.sender.send(WriteMessage::Bytes(bytes)).await
33            .map_err(|err| CustomError::String(err.to_string()))
34    }
35
36    pub async fn write_bytes(&self, mut bytes: Vec<u8>) -> PacketWritableResult {
37        let mut length_bytes = OutputPacketBytesVec::new();
38        VarInt::from(bytes.len() as i32).write(&mut length_bytes).await?;
39        length_bytes.data.into_iter()
40            .rev()
41            .for_each(|byte| bytes.insert(0, byte));
42        self.write_raw_bytes(bytes).await?;
43        Ok(())
44    }
45
46    pub async fn write_object<T: PacketWritable>(&self, object: T) -> PacketWritableResult {
47        let mut length_bytes = OutputPacketBytesVec::new();
48        object.write(&mut length_bytes).await?;
49        self.write_bytes(length_bytes.into()).await
50    }
51}