umbral_socket/stream/
server.rs

1use bytes::Bytes;
2use std::io;
3use std::path::Path;
4use std::sync::Arc;
5
6use crossbeam_queue::SegQueue;
7use tokio::io::AsyncReadExt;
8use tokio::net::{UnixListener, UnixStream};
9
10pub struct Server {
11    queue: Arc<SegQueue<Bytes>>,
12}
13
14impl Server {
15    pub fn open(queue: Arc<SegQueue<Bytes>>) -> Self {
16        return Self { queue: queue };
17    }
18
19    pub async fn run(&self, socket: &str) -> io::Result<()> {
20        let path = Path::new(socket);
21        if path.exists() {
22            tokio::fs::remove_file(path).await?;
23        }
24        let listener = UnixListener::bind(path)?;
25
26        loop {
27            let (stream, _) = listener.accept().await?;
28            let queue = self.queue.clone();
29            tokio::spawn(async move {
30                Server::handle_connection(stream, queue).await;
31            });
32        }
33    }
34
35    async fn handle_connection(mut stream: UnixStream, queue: Arc<SegQueue<Bytes>>) {
36        let mut buffer = Vec::with_capacity(1024);
37        match stream.read_to_end(&mut buffer).await {
38            Ok(n) if n > 0 => {
39                queue.push(Bytes::from(buffer));
40            }
41            Ok(_) => {}
42            Err(e) => {
43                eprintln!("Erro ao ler do socket: {}", e);
44            }
45        }
46    }
47}