socketio_rs/server/
client.rs

1use std::{fmt::Debug, ops::Deref, sync::Arc, time::Duration};
2
3use dashmap::DashMap;
4use engineio_rs::Sid;
5use futures_util::future::BoxFuture;
6use tracing::trace;
7
8use crate::{
9    ack::AckId,
10    callback::Callback,
11    server::server::Server,
12    socket::{RawSocket, Socket},
13    Event, Payload,
14};
15
16#[derive(Clone)]
17pub struct Client {
18    socket: Socket<Self>,
19    server: Arc<Server>,
20    sid: Sid,
21}
22
23impl Debug for Client {
24    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
25        f.debug_tuple("sid").field(&self.sid).finish()
26    }
27}
28
29impl Client {
30    pub(crate) fn new<T: Into<String>>(
31        socket: RawSocket,
32        namespace: T,
33        sid: Sid,
34        on: Arc<DashMap<Event, Callback<Self>>>,
35        server: Arc<Server>,
36    ) -> Self {
37        let server_clone = server.clone();
38        let sid_clone = sid.clone();
39        let client = Socket::new(
40            socket,
41            namespace,
42            on,
43            Arc::new(move |c| Client {
44                sid: sid_clone.clone(),
45                socket: c,
46                server: server_clone.clone(),
47            }),
48        );
49
50        Self {
51            sid,
52            socket: client,
53            server,
54        }
55    }
56
57    pub(crate) async fn connect_callback(&self) {
58        trace!("server handle_connect");
59        let _ = self.socket.handle_connect(None).await;
60    }
61
62    pub fn sid(&self) -> Sid {
63        self.sid.clone()
64    }
65
66    pub fn namespace(&self) -> String {
67        self.socket.nsp.clone()
68    }
69
70    pub async fn join<T: Into<String>>(&self, rooms: Vec<T>) {
71        self.server
72            .join(&self.socket.nsp, rooms, self.sid.clone())
73            .await;
74    }
75
76    pub async fn leave(&self, rooms: Vec<&str>) {
77        self.server.leave(&self.socket.nsp, rooms, &self.sid).await;
78    }
79
80    pub async fn emit_to<E, D>(&self, rooms: Vec<&str>, event: E, data: D)
81    where
82        E: Into<Event>,
83        D: Into<Payload>,
84    {
85        self.server
86            .emit_to(&self.socket.nsp, rooms, event, data)
87            .await
88    }
89
90    pub async fn emit_to_with_ack<F, E, D>(
91        &self,
92        rooms: Vec<&str>,
93        event: E,
94        data: D,
95        timeout: Duration,
96        callback: F,
97    ) where
98        F: for<'a> std::ops::FnMut(Option<Payload>, Self, Option<AckId>) -> BoxFuture<'static, ()>
99            + 'static
100            + Send
101            + Sync
102            + Clone,
103        E: Into<Event>,
104        D: Into<Payload>,
105    {
106        self.server
107            .emit_to_with_ack(&self.socket.nsp, rooms, event, data, timeout, callback)
108            .await
109    }
110}
111
112impl Deref for Client {
113    type Target = Socket<Client>;
114    fn deref(&self) -> &Self::Target {
115        &self.socket
116    }
117}