@@ -71,6 +71,39 @@ impl Packet {
71
71
_ => panic ! ( "Packet is not a binary" ) ,
72
72
}
73
73
}
74
+
75
+ /// Get the max size the packet could have when serialized
76
+ ///
77
+ /// If b64 is true, it returns the max size when serialized to base64
78
+ ///
79
+ /// The base64 max size factor is `ceil(n / 3) * 4`
80
+ pub ( crate ) fn get_size_hint ( & self , b64 : bool ) -> usize {
81
+ match self {
82
+ Packet :: Open ( _) => 151 , // max possible size for the open packet serialized
83
+ Packet :: Close => 1 ,
84
+ Packet :: Ping => 1 ,
85
+ Packet :: Pong => 1 ,
86
+ Packet :: PingUpgrade => 6 ,
87
+ Packet :: PongUpgrade => 6 ,
88
+ Packet :: Message ( msg) => 1 + msg. len ( ) ,
89
+ Packet :: Upgrade => 1 ,
90
+ Packet :: Noop => 1 ,
91
+ Packet :: Binary ( data) => {
92
+ if b64 {
93
+ 1 + ( ( data. len ( ) as f64 ) / 3. ) . ceil ( ) as usize * 4
94
+ } else {
95
+ 1 + data. len ( )
96
+ }
97
+ }
98
+ Packet :: BinaryV3 ( data) => {
99
+ if b64 {
100
+ 2 + ( ( data. len ( ) as f64 ) / 3. ) . ceil ( ) as usize * 4
101
+ } else {
102
+ 1 + data. len ( )
103
+ }
104
+ }
105
+ }
106
+ }
74
107
}
75
108
76
109
/// Serialize a [Packet] to a [String] according to the Engine.IO protocol
@@ -179,7 +212,7 @@ mod tests {
179
212
use crate :: config:: EngineIoConfig ;
180
213
181
214
use super :: * ;
182
- use std:: convert:: TryInto ;
215
+ use std:: { convert:: TryInto , time :: Duration } ;
183
216
184
217
#[ test]
185
218
fn test_open_packet ( ) {
@@ -249,4 +282,56 @@ mod tests {
249
282
let packet: Packet = packet_str. try_into ( ) . unwrap ( ) ;
250
283
assert_eq ! ( packet, Packet :: BinaryV3 ( vec![ 1 , 2 , 3 ] ) ) ;
251
284
}
285
+
286
+ #[ test]
287
+ fn test_packet_get_size_hint ( ) {
288
+ // Max serialized packet
289
+ let open = OpenPacket :: new (
290
+ TransportType :: Polling ,
291
+ Sid :: MAX ,
292
+ & EngineIoConfig {
293
+ max_buffer_size : usize:: MAX ,
294
+ max_payload : u64:: MAX ,
295
+ ping_interval : Duration :: MAX ,
296
+ ping_timeout : Duration :: MAX ,
297
+ transports : TransportType :: Polling as u8 | TransportType :: Websocket as u8 ,
298
+ ..Default :: default ( )
299
+ } ,
300
+ ) ;
301
+ let size = serde_json:: to_string ( & open) . unwrap ( ) . len ( ) ;
302
+ let packet = Packet :: Open ( open) ;
303
+ assert_eq ! ( packet. get_size_hint( false ) , size) ;
304
+
305
+ let packet = Packet :: Close ;
306
+ assert_eq ! ( packet. get_size_hint( false ) , 1 ) ;
307
+
308
+ let packet = Packet :: Ping ;
309
+ assert_eq ! ( packet. get_size_hint( false ) , 1 ) ;
310
+
311
+ let packet = Packet :: Pong ;
312
+ assert_eq ! ( packet. get_size_hint( false ) , 1 ) ;
313
+
314
+ let packet = Packet :: PingUpgrade ;
315
+ assert_eq ! ( packet. get_size_hint( false ) , 6 ) ;
316
+
317
+ let packet = Packet :: PongUpgrade ;
318
+ assert_eq ! ( packet. get_size_hint( false ) , 6 ) ;
319
+
320
+ let packet = Packet :: Message ( "hello" . to_string ( ) ) ;
321
+ assert_eq ! ( packet. get_size_hint( false ) , 6 ) ;
322
+
323
+ let packet = Packet :: Upgrade ;
324
+ assert_eq ! ( packet. get_size_hint( false ) , 1 ) ;
325
+
326
+ let packet = Packet :: Noop ;
327
+ assert_eq ! ( packet. get_size_hint( false ) , 1 ) ;
328
+
329
+ let packet = Packet :: Binary ( vec ! [ 1 , 2 , 3 ] ) ;
330
+ assert_eq ! ( packet. get_size_hint( false ) , 4 ) ;
331
+ assert_eq ! ( packet. get_size_hint( true ) , 5 ) ;
332
+
333
+ let packet = Packet :: BinaryV3 ( vec ! [ 1 , 2 , 3 ] ) ;
334
+ assert_eq ! ( packet. get_size_hint( false ) , 4 ) ;
335
+ assert_eq ! ( packet. get_size_hint( true ) , 6 ) ;
336
+ }
252
337
}
0 commit comments