cubic_protocol_server/
connection.rs1use 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}