sword_layers/socketio/
layer.rs1use 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}