next_web_websocket/core/
session.rs1use std::net::SocketAddr;
2
3use axum::extract::ws::{CloseFrame, Message};
4use flume::Sender;
5use uuid::Uuid;
6
7#[derive(Debug, Clone)]
9pub struct WebSocketSession {
10 id: uuid::Uuid,
11 msg_channel: Sender<Message>,
12 remote_address: SocketAddr,
13}
14
15impl WebSocketSession {
16 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 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 pub async fn is_open(&self) -> bool {
36 false
37 }
38
39 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 pub fn id(&self) -> &Uuid {
52 &self.id
53 }
54
55 pub fn remote_address(&self) -> &SocketAddr {
57 &self.remote_address
58 }
59
60}