umbral_socket/stream/client/
sync.rs

1use bytes::Bytes;
2use std::io::{Read, Result, Write};
3
4pub struct UmbralClient {
5    stream: Option<std::os::unix::net::UnixStream>,
6    socket: String,
7}
8
9impl UmbralClient {
10    pub fn new(socket: &str) -> Self {
11        Self {
12            stream: None,
13            socket: socket.to_string(),
14        }
15    }
16
17    pub fn send(&mut self, method: &str, payload: &Bytes) -> Result<Bytes> {
18        match self.call(method, payload) {
19            Ok(bytes) => Ok(bytes),
20            Err(e) => {
21                println!("Conexão falhou, tentando reconectar... ({})", e);
22                self.stream = None;
23                self.call(method, payload)
24            }
25        }
26    }
27
28    fn call(&mut self, method: &str, payload: &Bytes) -> Result<Bytes> {
29        if self.stream.is_none() {
30            let stream = std::os::unix::net::UnixStream::connect(&self.socket)?;
31            stream.set_read_timeout(Some(std::time::Duration::from_secs(5)))?;
32            self.stream = Some(stream);
33        }
34
35        if let Some(stream) = self.stream.as_mut() {
36            let mut message = Vec::new();
37            message.extend_from_slice(method.as_bytes());
38            message.extend_from_slice(b"[%]");
39            message.extend_from_slice(payload);
40
41            stream.write_all(&message)?;
42
43            let mut len_bytes = [0u8; 4];
44            stream.read_exact(&mut len_bytes)?;
45            let len = u32::from_be_bytes(len_bytes);
46
47            let mut response_buffer = vec![0u8; len as usize];
48            stream.read_exact(&mut response_buffer)?;
49
50            return Ok(Bytes::from(response_buffer));
51        }
52        unreachable!();
53    }
54}