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