computercraft_websocket_control/
port.rs1use std::time::Duration;
2
3use axum::extract::ws::{Message, WebSocket};
4
5use crate::error::Errors;
6
7pub 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}