1use super::handle_connection;
2use crate::error::Result;
3use crate::events::event_handler::EventHandler;
4use crate::ipc::context::{Context, ReplyListeners};
5use crate::ipc::stream_emitter::StreamEmitter;
6use crate::namespaces::namespace::Namespace;
7use std::collections::HashMap;
8use std::sync::Arc;
9use tokio::net::TcpListener;
10use tokio::sync::RwLock;
11use typemap_rev::TypeMap;
12
13pub struct IPCServer {
17 pub(crate) handler: EventHandler,
18 pub(crate) namespaces: HashMap<String, Namespace>,
19 pub(crate) data: TypeMap,
20}
21
22impl IPCServer {
23 #[tracing::instrument(skip(self))]
26 pub async fn start(self, address: &str) -> Result<()> {
27 let listener = TcpListener::bind(address).await?;
28 let handler = Arc::new(self.handler);
29 let namespaces = Arc::new(self.namespaces);
30 let data = Arc::new(RwLock::new(self.data));
31 tracing::info!(address);
32
33 while let Ok((stream, remote_address)) = listener.accept().await {
34 let remote_address = remote_address.to_string();
35 tracing::debug!("remote_address = {}", remote_address);
36 let handler = Arc::clone(&handler);
37 let namespaces = Arc::clone(&namespaces);
38 let data = Arc::clone(&data);
39
40 tokio::spawn(async {
41 let (read_half, write_half) = stream.into_split();
42 let emitter = StreamEmitter::new(write_half);
43 let reply_listeners = ReplyListeners::default();
44 let ctx = Context::new(StreamEmitter::clone(&emitter), data, None, reply_listeners);
45
46 handle_connection(namespaces, handler, read_half, ctx).await;
47 });
48 }
49
50 Ok(())
51 }
52}