rudp2plib/
network.rs

1use self::{events::*, request::Type};
2use crate::{
3    configuration::Configuration,
4    peer::RemotePeer,
5    utils::{multipart::Multipart, unwrap::unwrap_result},
6};
7use log::error;
8use serialize_bits::ser::SerializerData;
9use std::{
10    fmt::Debug,
11    net::{SocketAddr, UdpSocket},
12};
13
14pub mod events;
15pub mod request;
16
17/// # Request
18///
19/// A request for exchange data with another Peer.
20#[derive(Clone, PartialEq, Eq)]
21pub struct Request {
22    pub(crate) request_type: Type,
23    pub(crate) content: Vec<u8>,
24}
25
26impl Debug for Request {
27    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
28        f.debug_struct("Request")
29            .field("request_type", &self.request_type)
30            .field("content", &self.content.len())
31            .finish()
32    }
33}
34
35impl Request {
36    /// New Request with Data.
37    pub fn new<D>(data: D) -> Self
38    where
39        D: SerializerData,
40    {
41        let instance = Self {
42            request_type: Type::Message,
43            content: data.to_data().clone(),
44        };
45        log::trace!("Request::new(data) => {:?}", instance);
46        instance
47    }
48
49    #[cfg(not(feature = "ssl"))]
50    pub(crate) fn new_connection(configuration: &Configuration) -> Self {
51        let instance = Self {
52            request_type: Type::Connection,
53            content: vec![0],
54        };
55        log::trace!(
56            "Request::new_connection({:?}) => {:?}",
57            configuration,
58            instance
59        );
60        instance
61    }
62
63    #[cfg(feature = "ssl")]
64    pub(crate) fn new_connection(configuration: &Configuration) -> Self {
65        let content = configuration.ssl.public_key.to_data();
66        let instance = Self {
67            request_type: Type::Connection,
68            content,
69        };
70        log::trace!(
71            "Request::new_connection({:?}) => {:?}",
72            configuration,
73            instance
74        );
75        instance
76    }
77
78    pub(crate) fn new_disconnection() -> Self {
79        let instance = Self {
80            request_type: Type::Disconnection,
81            content: vec![1],
82        };
83        log::trace!("Request::new_disconnection() => {:?}", instance);
84        instance
85    }
86
87    pub(crate) fn new_message(data: &Vec<u8>) -> Self {
88        let instance = Self {
89            request_type: Type::Message,
90            content: data.clone(),
91        };
92        log::trace!("Request::new_message({}) => {:?}", data.len(), instance);
93        instance
94    }
95
96    pub(crate) fn new_share_connection(peers: &Vec<RemotePeer>) -> Self {
97        let mut content = Vec::new();
98        for remote in peers {
99            content.append(&mut remote.addr.to_string().as_bytes().to_vec());
100            content.push(',' as u8);
101        }
102        let instance = Self {
103            request_type: Type::ShareConnection,
104            content: content.clone(),
105        };
106        log::trace!(
107            "Request::new_share_connection({:?}) => {:?}",
108            content,
109            instance
110        );
111        instance
112    }
113
114    pub(crate) fn to_peers_values(&self) -> Vec<SocketAddr> {
115        let mut res = Vec::new();
116        let mut current = Vec::new();
117        for b in self.content.clone() {
118            if b == ',' as u8 {
119                let addr = unwrap_result(
120                    unwrap_result(String::from_utf8(current), "Unable to read address").parse(),
121                    "Unable to parse address",
122                );
123                res.push(addr);
124                current = Vec::new();
125            } else {
126                current.push(b);
127            }
128        }
129        log::trace!("Request::to_peers_values() => {:?}", res);
130        res
131    }
132
133    #[cfg(feature = "ssl")]
134    pub(crate) fn parse_public_key(&self) -> Vec<u8> {
135        use serialize_bits::des::DeserializerData;
136
137        let content = self.content.clone();
138        let (pk, _) = Vec::from_data(&content, 0);
139        log::trace!("Request::parse_public_key() => {}", pk.len());
140        pk
141    }
142
143    pub(crate) fn to_message_event(&self, remote: &RemotePeer) -> Message {
144        let message = Message {
145            from: remote.clone(),
146            content: self.content.clone(),
147        };
148        log::trace!("Request::to_message_event({:?}) => {:?}", remote, message);
149        message
150    }
151
152    #[cfg(not(feature = "ssl"))]
153    pub(crate) fn send(&self, socket: &UdpSocket, addr: &SocketAddr) -> () {
154        log::trace!("Request::send({:?}, {addr})", socket);
155        let socket_address = unwrap_result(socket.local_addr(), "Unable to get the local address");
156        let parts = Multipart::split(self, &vec![], &socket_address);
157        for part in parts {
158            socket.send_to(&part.to_data(), addr).unwrap_or_else(|e| {
159                error!("Unable to send request : {e}");
160                0
161            });
162        }
163    }
164
165    #[cfg(feature = "ssl")]
166    pub(crate) fn send(&self, socket: &UdpSocket, addr: &SocketAddr, public_key: &Vec<u8>) -> () {
167        log::trace!("Request::send({:?}, {addr}, {})", socket, public_key.len());
168        let socket_address = unwrap_result(socket.local_addr(), "Unable to get the local address");
169        let parts = Multipart::split(self, public_key, &socket_address);
170        for part in parts {
171            socket.send_to(&part.to_data(), addr).unwrap_or_else(|e| {
172                error!("Unable to send request : {e}");
173                0
174            });
175        }
176    }
177}
178
179/// # Response
180///
181/// Response send after an event in Observer.
182#[derive(Clone, Debug, PartialEq, Eq)]
183pub struct Response {
184    pub(crate) address: Option<SocketAddr>,
185    pub(crate) data: Vec<u8>,
186}
187
188impl Response {
189    /// New Response from text.
190    pub fn text(value: &str) -> Self {
191        let instance = Self {
192            address: None,
193            data: value.as_bytes().to_vec(),
194        };
195        log::trace!("Response::text({value}) => {:?}", instance);
196        instance
197    }
198
199    /// New Response from Data.
200    pub fn new<D>(data: D) -> Self
201    where
202        D: SerializerData,
203    {
204        let instance = Self {
205            address: None,
206            data: data.to_data(),
207        };
208        log::trace!("Response::new(data) => {:?}", instance);
209        instance
210    }
211
212    pub(crate) fn to_request(&self) -> Request {
213        let req = Request::new_message(&self.data);
214        log::trace!("Response::to_request() => {:?}", req);
215        req
216    }
217}
218
219#[cfg(not(feature = "ssl"))]
220pub(crate) fn send(socket: &UdpSocket, request: &Request, address: &SocketAddr) {
221    request.send(socket, address);
222}
223
224#[cfg(feature = "ssl")]
225pub(crate) fn send(socket: &UdpSocket, request: &Request, address: &SocketAddr) {
226    request.send(socket, address, &vec![]);
227}