Skip to main content

wsio_core/
lib.rs

1use tungstenite::protocol::WebSocketConfig;
2
3pub mod event;
4pub mod packet;
5pub mod traits;
6pub mod types;
7pub mod utils;
8
9pub fn channel_capacity_from_websocket_config(websocket_config: &WebSocketConfig) -> usize {
10    let ratio = (websocket_config.max_write_buffer_size as f64 / websocket_config.write_buffer_size as f64).max(1.0);
11    let capacity = (ratio.log2() * 256.0).round() as usize;
12    capacity.clamp(64, 16384)
13}
14
15#[cfg(test)]
16mod tests {
17    use super::*;
18
19    #[test]
20    fn test_channel_capacity_from_websocket_config() {
21        let mut config = WebSocketConfig::default();
22
23        // Scenario 1: High ratio
24        config.write_buffer_size = 1024;
25        config.max_write_buffer_size = 1024 * 16; // ratio 16
26        let capacity = channel_capacity_from_websocket_config(&config);
27        assert_eq!(capacity, 1024); // log2(16) * 256 = 4 * 256 = 1024
28
29        // Scenario 2: Ratio < 1 (fallback max)
30        config.write_buffer_size = 1024;
31        config.max_write_buffer_size = 512;
32        let capacity = channel_capacity_from_websocket_config(&config);
33        assert_eq!(capacity, 64); // log2(1) * 256 = 0 -> clamped to 64
34
35        // Scenario 3: Very high ratio (but within clamp)
36        config.write_buffer_size = 1024;
37        config.max_write_buffer_size = 1024 * 1024 * 1024; // ratio 2^20
38        let capacity = channel_capacity_from_websocket_config(&config);
39        assert_eq!(capacity, 5120); // log2(2^20) * 256 = 20 * 256 = 5120
40
41        // Scenario 4: Absolute maximum clamp
42        config.write_buffer_size = 1;
43        config.max_write_buffer_size = 1024 * 1024 * 1024 * 1024; // ratio 2^40
44        let capacity = channel_capacity_from_websocket_config(&config);
45        assert_eq!(capacity, 10240); // 40 * 256 = 10240, still below 16384
46    }
47}