computercraft_websocket_control/
port.rs

1use std::time::Duration;
2
3use axum::extract::ws::{Message, WebSocket};
4
5use crate::error::Errors;
6
7/// a computer craft computer which running the client side lua script
8pub struct Port<'a> {
9    pub(crate) inner: &'a mut WebSocket,
10    pub(crate) closed: &'a mut bool,
11}
12
13impl<'a> Port<'a> {
14    pub(crate) async fn send(&mut self, msg: String) -> Result<(), Errors> {
15        let a = tokio::time::timeout(
16            Duration::from_secs_f32(0.5),
17            self.inner.send(axum::extract::ws::Message::Text(msg)),
18        )
19        .await;
20        let send_result = match a {
21            Ok(v) => v,
22            Err(_) => {
23                *self.closed = true;
24                return Err(Errors::WebSocketClosed);
25            }
26        };
27
28        match send_result {
29            Ok(_) => Ok(()),
30            Err(err) => {
31                *self.closed = true;
32                Err(err.into())
33            }
34        }
35    }
36    pub(crate) async fn receive(&mut self) -> Result<String, Errors> {
37        if *self.closed {
38            return Err(Errors::WebSocketClosed);
39        }
40        let a = tokio::time::timeout(Duration::from_secs_f32(0.5), self.inner.recv()).await;
41        let received = match a {
42            Ok(v) => v,
43            Err(_) => {
44                *self.closed = true;
45                return Err(Errors::WebSocketClosed);
46            }
47        };
48        match received {
49            Some(v) => match v {
50                Ok(v) => match v {
51                    Message::Text(v) => Ok(v),
52                    Message::Binary(_) => Err(Errors::WrongMessageType("Binary")),
53                    Message::Ping(_) => Err(Errors::WrongMessageType("Ping")),
54                    Message::Pong(_) => Err(Errors::WrongMessageType("Pong")),
55                    Message::Close(_) => Err(Errors::WrongMessageType("Close")),
56                },
57                Err(e) => {
58                    *self.closed = true;
59                    Err(Errors::Axum(e))
60                }
61            },
62            None => {
63                *self.closed = true;
64                Err(Errors::WebSocketClosed)
65            }
66        }
67    }
68}