socketio_rs/server/
builder.rs

1use crate::server::server::Server;
2use crate::{callback::Callback, server::client::Client};
3use crate::{AckId, NameSpace};
4use crate::{Event, Payload};
5use dashmap::DashMap;
6use engineio_rs::{ServerBuilder as EngineServerBuilder, ServerOption};
7use futures_util::future::BoxFuture;
8use std::{collections::HashMap, sync::Arc};
9
10#[allow(dead_code)]
11pub struct ServerBuilder {
12    server_option: ServerOption,
13    on: HashMap<NameSpace, DashMap<Event, Callback<Client>>>,
14    builder: EngineServerBuilder,
15}
16
17#[allow(dead_code)]
18impl ServerBuilder {
19    pub fn new(port: u16) -> Self {
20        Self {
21            builder: EngineServerBuilder::new(port),
22            server_option: Default::default(),
23            on: Default::default(),
24        }
25    }
26
27    pub fn server_option(mut self, server_option: ServerOption) -> Self {
28        self.builder = self.builder.server_option(server_option);
29        self
30    }
31
32    pub fn on<S: Into<String>, T: Into<Event>, F>(
33        mut self,
34        namespace: S,
35        event: T,
36        callback: F,
37    ) -> Self
38    where
39        F: for<'a> std::ops::FnMut(
40                Option<Payload>,
41                Client,
42                Option<AckId>,
43            ) -> BoxFuture<'static, ()>
44            + 'static
45            + Send
46            + Sync,
47    {
48        let namespace = namespace.into();
49        if let Some(on) = self.on.get_mut(&namespace) {
50            on.insert(event.into(), Callback::new(callback));
51        } else {
52            let on = DashMap::new();
53            on.insert(event.into(), Callback::new(callback));
54            self.on.insert(namespace, on);
55        }
56        self
57    }
58
59    pub fn build(self) -> Arc<Server> {
60        let engine_server = self.builder.build();
61        let on = DashMap::new();
62
63        for (k, v) in self.on.into_iter() {
64            on.insert(k, Arc::new(v));
65        }
66
67        Arc::new(Server {
68            on,
69            engine_server,
70            rooms: Default::default(),
71            clients: Default::default(),
72            sid_generator: Default::default(),
73        })
74    }
75}