Gz encode+decode datagrams

This commit is contained in:
Sofia 2026-08-08 01:57:11 +03:00
parent 9ec70ab6db
commit a2e25d1c3f
3 changed files with 8 additions and 3 deletions

View File

@ -5,6 +5,7 @@ edition = "2024"
[dependencies] [dependencies]
ciborium = "0.2.2" ciborium = "0.2.2"
flate2 = "1.1.9"
serde = "1.0.228" serde = "1.0.228"
thiserror = "2.0.18" thiserror = "2.0.18"
## Make it easier to generate errors ## Make it easier to generate errors

View File

@ -6,6 +6,7 @@ use std::{
time::{Duration, Instant}, time::{Duration, Instant},
}; };
use flate2::{Compression, write::GzEncoder};
use serde::{Serialize, de::DeserializeOwned}; use serde::{Serialize, de::DeserializeOwned};
use thiserror::Error; use thiserror::Error;
@ -482,7 +483,8 @@ impl UdpWrapper {
if let Some(socket) = &self.socket { if let Some(socket) = &self.socket {
let mut buf = Vec::new(); let mut buf = Vec::new();
let cursor = Cursor::new(&mut buf); let cursor = Cursor::new(&mut buf);
ciborium::into_writer(&package, cursor) let encoder = GzEncoder::new(cursor, Compression::fast());
ciborium::into_writer(&package, encoder)
.map_err(|err| SendError::SerializationError(err))?; .map_err(|err| SendError::SerializationError(err))?;
if buf.len() > DATAGRAM_SIZE { if buf.len() > DATAGRAM_SIZE {
return Err(SendError::DatagramTooLarge(buf.len())); return Err(SendError::DatagramTooLarge(buf.len()));

View File

@ -5,6 +5,7 @@ use std::{
sync::{Arc, mpsc::Sender}, sync::{Arc, mpsc::Sender},
}; };
use flate2::read::GzDecoder;
use serde::{Serialize, de::DeserializeOwned}; use serde::{Serialize, de::DeserializeOwned};
use thiserror::Error; use thiserror::Error;
@ -35,9 +36,10 @@ impl<'a, T: Clone + Serialize + DeserializeOwned> Listener<T> {
match self.socket.recv_from(&mut buffer) { match self.socket.recv_from(&mut buffer) {
Ok((num_bytes, from_addr)) => { Ok((num_bytes, from_addr)) => {
let mut ciborium_buf: Datagram = [0; _]; let mut ciborium_buf: Datagram = [0; _];
let bytes = Cursor::new(&mut buffer[..num_bytes]); let cursor = Cursor::new(&mut buffer[..num_bytes]);
let decoder = GzDecoder::new(cursor);
let res = let res =
ciborium::from_reader_with_buffer::<Package<T>, _>(bytes, &mut ciborium_buf); ciborium::from_reader_with_buffer::<Package<T>, _>(decoder, &mut ciborium_buf);
match res { match res {
Ok(pkg) => self Ok(pkg) => self
.sender .sender