next_web_websocket/core/
session.rs

1use std::net::SocketAddr;
2
3use axum::extract::ws::{CloseFrame, Message};
4use flume::Sender;
5use uuid::Uuid;
6
7///
8#[derive(Debug, Clone)]
9pub struct WebSocketSession {
10    id: uuid::Uuid,
11    msg_channel: Sender<Message>,
12    remote_address: SocketAddr,
13}
14
15impl WebSocketSession {
16    ///
17    pub fn new(msg_channel: Sender<Message>, remote_address: SocketAddr) -> Self {
18        let id = Uuid::new_v4();
19        Self {
20            id,
21            msg_channel,
22            remote_address,
23        }
24    }
25
26    ///
27    pub async fn send_message(&self, message: Message) -> Result<(), Message> {
28        if let Err(error) = self.msg_channel.send_async(message).await {
29            return Err(error.0);
30        }
31        Ok(())
32    }
33
34    ///
35    pub async fn is_open(&self) -> bool {
36        false
37    }
38
39    /// 123
40    pub async fn close(&self) {
41        let _ = self
42            .msg_channel
43            .send_async(Message::Close(Some(CloseFrame {
44                code: axum::extract::ws::close_code::NORMAL,
45                reason: "0".into(),
46            })))
47            .await;
48    }
49
50    /// Get session id
51    pub fn id(&self) -> &Uuid {
52        &self.id
53    }
54
55    ///
56    pub fn remote_address(&self) -> &SocketAddr {
57        &self.remote_address
58    }
59    
60}