umbral_socket/stream/client/
sync.rs1use 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}