dust_devil_core/sandstorm/
socks5_sockets.rs

1use std::{io::Error, net::SocketAddr};
2
3use tokio::io::{AsyncRead, AsyncWrite};
4
5use crate::serialize::{ByteRead, ByteWrite};
6
7use super::{RemoveSocketResponse, SandstormCommandType};
8
9/// A Sandstorm list-socks5-sockets request.
10pub struct ListSocks5SocketsRequest;
11
12/// A Sandstorm list-socks5-sockets response.
13pub struct ListSocks5SocketsResponse(
14    /// The list of sockets listening for incoming socks5 connections sent by the server.
15    pub Vec<SocketAddr>,
16);
17
18/// A borrowed version of [`ListSocks5SocketsResponse`].
19pub struct ListSocks5SocketsResponseRef<'a>(
20    /// The list of sockets listening for incoming socks5 connections sent by the server.
21    &'a [SocketAddr],
22);
23
24impl ListSocks5SocketsResponse {
25    pub fn as_ref(&self) -> ListSocks5SocketsResponseRef {
26        ListSocks5SocketsResponseRef(&self.0)
27    }
28}
29
30impl ByteRead for ListSocks5SocketsRequest {
31    async fn read<R: AsyncRead + Unpin + ?Sized>(_reader: &mut R) -> Result<Self, Error> {
32        Ok(Self)
33    }
34}
35
36impl ByteWrite for ListSocks5SocketsRequest {
37    async fn write<W: AsyncWrite + Unpin + ?Sized>(&self, writer: &mut W) -> Result<(), Error> {
38        SandstormCommandType::ListSocks5Sockets.write(writer).await
39    }
40}
41
42impl ByteRead for ListSocks5SocketsResponse {
43    async fn read<R: AsyncRead + Unpin + ?Sized>(reader: &mut R) -> Result<Self, Error> {
44        Ok(Self(<Vec<SocketAddr> as ByteRead>::read(reader).await?))
45    }
46}
47
48impl ByteWrite for ListSocks5SocketsResponse {
49    async fn write<W: AsyncWrite + Unpin + ?Sized>(&self, writer: &mut W) -> Result<(), Error> {
50        self.as_ref().write(writer).await
51    }
52}
53
54impl<'a> ByteWrite for ListSocks5SocketsResponseRef<'a> {
55    async fn write<W: AsyncWrite + Unpin + ?Sized>(&self, writer: &mut W) -> Result<(), Error> {
56        (SandstormCommandType::ListSocks5Sockets, self.0).write(writer).await
57    }
58}
59
60/// A Sandstorm add-socks5-socket request.
61pub struct AddSocks5SocketRequest(
62    /// The address of the new socket to open.
63    pub SocketAddr,
64);
65
66/// A Sandstorm add-socks5-socket response.
67pub struct AddSocks5SocketResponse(
68    /// The result of the add socket operation.
69    pub Result<(), Error>,
70);
71
72/// A borrowed version of [`AddSocks5SocketResponse`].
73pub struct AddSocks5SocketResponseRef<'a>(
74    /// The result of the add socket operation.
75    pub Result<(), &'a Error>,
76);
77
78impl AddSocks5SocketResponse {
79    pub fn as_ref(&self) -> AddSocks5SocketResponseRef {
80        AddSocks5SocketResponseRef(self.0.as_ref().map(|_| ()))
81    }
82}
83
84impl ByteRead for AddSocks5SocketRequest {
85    async fn read<R: AsyncRead + Unpin + ?Sized>(reader: &mut R) -> Result<Self, Error> {
86        Ok(Self(SocketAddr::read(reader).await?))
87    }
88}
89
90impl ByteWrite for AddSocks5SocketRequest {
91    async fn write<W: AsyncWrite + Unpin + ?Sized>(&self, writer: &mut W) -> Result<(), Error> {
92        (SandstormCommandType::AddSocks5Socket, &self.0).write(writer).await
93    }
94}
95
96impl ByteRead for AddSocks5SocketResponse {
97    async fn read<R: AsyncRead + Unpin + ?Sized>(reader: &mut R) -> Result<Self, Error> {
98        Ok(Self(<Result<(), Error> as ByteRead>::read(reader).await?))
99    }
100}
101
102impl ByteWrite for AddSocks5SocketResponse {
103    async fn write<W: AsyncWrite + Unpin + ?Sized>(&self, writer: &mut W) -> Result<(), Error> {
104        self.as_ref().write(writer).await
105    }
106}
107
108impl<'a> ByteWrite for AddSocks5SocketResponseRef<'a> {
109    async fn write<W: AsyncWrite + Unpin + ?Sized>(&self, writer: &mut W) -> Result<(), Error> {
110        (SandstormCommandType::AddSocks5Socket, self.0).write(writer).await
111    }
112}
113
114/// A Sandstorm remove-socks5-socket request.
115pub struct RemoveSocks5SocketRequest(
116    /// The address of the socket to remove.
117    pub SocketAddr,
118);
119
120/// A Sandstorm remove-socks5-socket response.
121pub struct RemoveSocks5SocketResponse(
122    /// The status of the remove socket operation.
123    pub RemoveSocketResponse,
124);
125
126impl ByteRead for RemoveSocks5SocketRequest {
127    async fn read<R: AsyncRead + Unpin + ?Sized>(reader: &mut R) -> Result<Self, Error> {
128        Ok(Self(SocketAddr::read(reader).await?))
129    }
130}
131
132impl ByteWrite for RemoveSocks5SocketRequest {
133    async fn write<W: AsyncWrite + Unpin + ?Sized>(&self, writer: &mut W) -> Result<(), Error> {
134        (SandstormCommandType::RemoveSocks5Socket, &self.0).write(writer).await
135    }
136}
137
138impl ByteRead for RemoveSocks5SocketResponse {
139    async fn read<R: AsyncRead + Unpin + ?Sized>(reader: &mut R) -> Result<Self, Error> {
140        Ok(Self(RemoveSocketResponse::read(reader).await?))
141    }
142}
143
144impl ByteWrite for RemoveSocks5SocketResponse {
145    async fn write<W: AsyncWrite + Unpin + ?Sized>(&self, writer: &mut W) -> Result<(), Error> {
146        (SandstormCommandType::RemoveSocks5Socket, &self.0).write(writer).await
147    }
148}