socketio_rs/server/
client.rs1use 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}