sword_layers/socketio/
layer.rs

1use crate::socketio::SocketIoServerConfig;
2use socketioxide::{ParserConfig, SocketIo, TransportType, layer::SocketIoLayer};
3use std::collections::HashSet;
4
5pub struct SocketIoServerLayer;
6
7impl SocketIoServerLayer {
8    pub fn new(config: SocketIoServerConfig) -> (SocketIoLayer, SocketIo) {
9        let mut layer_builder = SocketIo::builder();
10
11        if let Some(ack_timeout) = config.ack_timeout {
12            layer_builder = layer_builder.ack_timeout(ack_timeout.parsed);
13        }
14        if let Some(connect_timeout) = config.connect_timeout {
15            layer_builder = layer_builder.connect_timeout(connect_timeout.parsed);
16        }
17        if let Some(max_buffer_size) = config.max_buffer_size {
18            layer_builder = layer_builder.max_buffer_size(max_buffer_size);
19        }
20        if let Some(max_payload) = config.max_payload {
21            layer_builder = layer_builder.max_payload(max_payload.parsed as u64);
22        }
23        if let Some(ping_interval) = config.ping_interval {
24            layer_builder = layer_builder.ping_interval(ping_interval.parsed);
25        }
26        if let Some(ping_timeout) = config.ping_timeout {
27            layer_builder = layer_builder.ping_timeout(ping_timeout.parsed);
28        }
29        if let Some(req_path) = config.req_path {
30            layer_builder = layer_builder.req_path(req_path);
31        }
32        if let Some(transports) = config.transports {
33            let parsed_transports = transports
34                .into_iter()
35                .collect::<HashSet<_>>()
36                .iter()
37                .filter_map(|t| match t.as_str() {
38                    "polling" => Some(TransportType::Polling),
39                    "websocket" => Some(TransportType::Websocket),
40                    _ => None,
41                })
42                .collect::<Vec<_>>();
43
44            match parsed_transports.len() {
45                1 => layer_builder = layer_builder.transports([parsed_transports[0]]),
46                2 => {
47                    layer_builder =
48                        layer_builder.transports([parsed_transports[0], parsed_transports[1]])
49                }
50                _ => {}
51            };
52        }
53        if let Some(parser) = config.parser {
54            match parser.as_str() {
55                "common" => layer_builder = layer_builder.with_parser(ParserConfig::common()),
56                "msgpack" => layer_builder = layer_builder.with_parser(ParserConfig::msgpack()),
57                _ => {}
58            }
59        }
60        if let Some(ws_read_buffer_size) = config.ws_read_buffer_size {
61            layer_builder = layer_builder.ws_read_buffer_size(ws_read_buffer_size);
62        }
63
64        layer_builder.build_layer() as (SocketIoLayer, SocketIo)
65    }
66}