veloren_network_protocol/message.rs
1use crate::{
2 frame::OTFrame,
3 types::{Mid, Sid},
4};
5use bytes::{Bytes, BytesMut};
6
7pub(crate) const ALLOC_BLOCK: usize = 16_777_216;
8
9/// Contains a outgoing message for TCP protocol
10/// All Chunks have the same size, except for the last chunk which can end
11/// earlier. E.g.
12/// ```ignore
13/// msg = OTMessage::new();
14/// msg.next();
15/// msg.next();
16/// ```
17#[derive(Debug)]
18pub(crate) struct OTMessage {
19 data: Bytes,
20 original_length: u64,
21 send_header: bool,
22 mid: Mid,
23 sid: Sid,
24 start: u64, /* remove */
25}
26
27#[derive(Debug)]
28pub(crate) struct ITMessage {
29 pub data: BytesMut,
30 pub sid: Sid,
31 pub length: u64,
32}
33
34impl OTMessage {
35 pub(crate) const FRAME_DATA_SIZE: u64 = 1400;
36
37 pub(crate) fn new(data: Bytes, mid: Mid, sid: Sid) -> Self {
38 let original_length = data.len() as u64;
39 Self {
40 data,
41 original_length,
42 send_header: false,
43 mid,
44 sid,
45 start: 0,
46 }
47 }
48
49 fn get_header(&self) -> OTFrame {
50 OTFrame::DataHeader {
51 mid: self.mid,
52 sid: self.sid,
53 length: self.data.len() as u64,
54 }
55 }
56
57 fn get_next_data(&mut self) -> OTFrame {
58 let to_send = std::cmp::min(self.data.len(), Self::FRAME_DATA_SIZE as usize);
59 let data = self.data.split_to(to_send);
60 self.start += Self::FRAME_DATA_SIZE;
61
62 OTFrame::Data {
63 mid: self.mid,
64 data,
65 }
66 }
67
68 /// returns if something was added
69 pub(crate) fn next(&mut self) -> Option<OTFrame> {
70 if !self.send_header {
71 self.send_header = true;
72 Some(self.get_header())
73 } else if !self.data.is_empty() {
74 Some(self.get_next_data())
75 } else {
76 None
77 }
78 }
79
80 pub(crate) fn get_sid_len(&self) -> (Sid, u64) { (self.sid, self.original_length) }
81}
82
83impl ITMessage {
84 pub(crate) fn new(sid: Sid, length: u64, _allocator: &mut BytesMut) -> Self {
85 //allocator.reserve(ALLOC_BLOCK);
86 //TODO: grab mem from the allocatior, but this is only possible with unsafe
87 Self {
88 sid,
89 length,
90 data: BytesMut::with_capacity((length as usize).min(ALLOC_BLOCK /* anti-ddos */)),
91 }
92 }
93}
94
95/*
96/// Contains a outgoing message and store what was *send* and *confirmed*
97/// All Chunks have the same size, except for the last chunk which can end
98/// earlier. E.g.
99/// ```ignore
100/// msg = OutgoingMessage::new();
101/// msg.next();
102/// msg.next();
103/// msg.confirm(1);
104/// msg.confirm(2);
105/// ```
106#[derive(Debug)]
107#[expect(dead_code)]
108pub(crate) struct OUMessage {
109 buffer: Arc<MessageBuffer>,
110 send_index: u64, // 3 => 4200 (3*FRAME_DATA_SIZE)
111 send_header: bool,
112 mid: Mid,
113 sid: Sid,
114 max_index: u64, //speedup
115 missing_header: bool,
116 missing_indices: VecDeque<u64>,
117}
118
119#[expect(dead_code)]
120impl OUMessage {
121 pub(crate) const FRAME_DATA_SIZE: u64 = 1400;
122
123 pub(crate) fn new(buffer: Arc<MessageBuffer>, mid: Mid, sid: Sid) -> Self {
124 let max_index =
125 (buffer.data.len() as u64 + Self::FRAME_DATA_SIZE - 1) / Self::FRAME_DATA_SIZE;
126 Self {
127 buffer,
128 send_index: 0,
129 send_header: false,
130 mid,
131 sid,
132 max_index,
133 missing_header: false,
134 missing_indices: VecDeque::new(),
135 }
136 }
137
138 /// all has been send once, but might been resend due to failures.
139 #[expect(dead_code)]
140 pub(crate) fn initial_sent(&self) -> bool { self.send_index == self.max_index }
141
142 pub fn get_header(&self) -> Frame {
143 Frame::DataHeader {
144 mid: self.mid,
145 sid: self.sid,
146 length: self.buffer.data.len() as u64,
147 }
148 }
149
150 pub fn get_data(&self, index: u64) -> Frame {
151 let start = index * Self::FRAME_DATA_SIZE;
152 let to_send = std::cmp::min(
153 self.buffer.data[start as usize..].len() as u64,
154 Self::FRAME_DATA_SIZE,
155 );
156 Frame::Data {
157 mid: self.mid,
158 start,
159 data: self.buffer.data[start as usize..][..to_send as usize].to_vec(),
160 }
161 }
162
163 #[expect(dead_code)]
164 pub(crate) fn set_missing(&mut self, missing_header: bool, missing_indicies: VecDeque<u64>) {
165 self.missing_header = missing_header;
166 self.missing_indices = missing_indicies;
167 }
168
169 /// returns if something was added
170 pub(crate) fn next(&mut self) -> Option<Frame> {
171 if !self.send_header {
172 self.send_header = true;
173 Some(self.get_header())
174 } else if self.send_index < self.max_index {
175 self.send_index += 1;
176 Some(self.get_data(self.send_index - 1))
177 } else if self.missing_header {
178 self.missing_header = false;
179 Some(self.get_header())
180 } else if let Some(index) = self.missing_indices.pop_front() {
181 Some(self.get_data(index))
182 } else {
183 None
184 }
185 }
186
187 pub(crate) fn get_sid_len(&self) -> (Sid, u64) { (self.sid, self.buffer.data.len() as u64) }
188}
189*/