1pub mod client;
6pub mod helpers;
7pub mod prelude;
8pub mod receiver;
9pub mod sender;
10pub mod server;
11
12use bytemuck::{Pod, Zeroable, bytes_of, checked::pod_read_unaligned};
13pub use client::Client;
14pub use helpers::{
15 ConnectRequestHeader, ConnectResponseHeader, FLAG_CONNECT_REQUEST, FLAG_CONNECT_RESPONSE,
16 read_connect_request, read_connect_response, write_connect_request, write_connect_response,
17};
18pub use receiver::Receiver;
19pub use sender::Sender;
20pub use server::{ServerConnection, ServerHub};
21
22use std::mem::size_of;
23
24pub const PAYLOAD_SIZE: usize = 1024;
25pub const HEADER_SIZE: usize = size_of::<HeaderV2>();
26pub const VERSION: u8 = 2;
27pub const MAX_DATAGRAM_SIZE: usize = 1200;
28
29#[repr(C)]
30#[derive(Copy, Clone, Pod, Zeroable)]
31pub struct HeaderV2 {
33 pub version: u8,
35
36 pub flags: u8,
38
39 pub connection_id: u16,
41
42 pub datagram_counter: u16,
45
46 pub msg_id: u16,
48
49 pub frag_index: u16,
51
52 pub total_frag_count: u16,
54
55 pub sender_ts: u16,
57
58 pub echo_ts: u16,
60}
61
62#[inline]
65pub fn write_datagram(buf: &mut [u8], header: &HeaderV2, payload: &[u8]) -> Option<usize> {
66 let total = HEADER_SIZE + payload.len();
67 if buf.len() < total {
68 return None;
69 }
70
71 let hdr_bytes = bytes_of(header);
72 buf[..HEADER_SIZE].copy_from_slice(hdr_bytes);
73
74 buf[HEADER_SIZE..total].copy_from_slice(payload);
75
76 Some(total)
77}
78
79#[inline]
82#[must_use]
83pub fn read_datagram(buf: &[u8]) -> Option<(HeaderV2, &[u8])> {
84 if buf.len() < HEADER_SIZE {
85 return None;
86 }
87
88 let header: HeaderV2 = pod_read_unaligned(&buf[..HEADER_SIZE]);
89 let payload = &buf[HEADER_SIZE..];
90
91 Some((header, payload))
92}