1use std::collections::HashMap;
2use std::io::{self, BufRead, Read, Write};
3use std::net::{TcpListener, TcpStream, UdpSocket};
4use std::sync::{Arc, Mutex};
5use tungstenite::{accept, Message};
6use hyper::{body::Body, Request, Response, Server, service::{make_service_fn, service_fn}};
7use std::collections::hash_map::DefaultHasher;
8use std::hash::{Hash, Hasher};
9
10pub mod net {
11 use super::*;
12
13 pub struct EasySocketServer {
14 handlers: Arc<Mutex<HashMap<String, Arc<dyn Fn(Socket) + Send + Sync + 'static>>>>,
15 }
16
17 #[derive(Clone)]
18 pub struct Socket {
19 id: i32,
20 stream: Option<Arc<Mutex<TcpStream>>>,
21 udp_socket: Option<Arc<UdpSocket>>,
22 handlers: Arc<Mutex<HashMap<String, Box<dyn Fn(&str) + Send>>>>,
23 }
24
25 impl EasySocketServer {
26 pub fn new() -> Self {
27 Self {
28 handlers: Arc::new(Mutex::new(HashMap::new())),
29 }
30 }
31
32 pub fn on<F>(&self, event: &str, callback: F)
33 where
34 F: Fn(Socket) + Send + Sync + 'static,
35 {
36 self.handlers.lock().unwrap().insert(event.to_string(), Arc::new(callback));
37 }
38
39 pub fn listen_tcp(&self, address: &str) -> io::Result<()> {
40 let listener = TcpListener::bind(address)?;
41 for stream in listener.incoming() {
42 let stream = stream?;
43 let socket = Socket::new_tcp(stream);
44 let handlers = Arc::clone(&self.handlers);
45 let callback = handlers.lock().unwrap().get("connection").cloned();
46 if let Some(callback) = callback {
47 callback(socket);
48 }
49 }
50 Ok(())
51 }
52
53 pub fn listen_udp(&self, address: &str) -> io::Result<()> {
54 let socket = UdpSocket::bind(address)?;
55 let udp_socket = Arc::new(socket);
56 let mut buffer = [0; 1024];
57 loop {
58 if let Ok((size, src)) = udp_socket.recv_from(&mut buffer) {
59 let message = String::from_utf8_lossy(&buffer[..size]).to_string();
60 let handlers = Arc::clone(&self.handlers);
61 if let Some(callback) = handlers.lock().unwrap().get("connection") {
62 callback(Socket::new_udp(udp_socket.clone()));
63 }
64 println!("Received from {}: {}", src, message);
65 }
66 }
67 }
68
69 pub async fn listen_http(&self, address: &str) -> Result<(), Box<dyn std::error::Error>> {
70 let make_svc = make_service_fn(|_conn| async {
71 Ok::<_, hyper::Error>(service_fn(|_req: Request<Body>| async {
72 Ok::<_, hyper::Error>(Response::new(Body::from("Hello, HTTP!")))
73 }))
74 });
75
76 let addr = address.parse()?; let server = Server::bind(&addr).serve(make_svc); println!("Listening on http://{}", address);
79 server.await?;
80 Ok(())
81 }
82
83 pub fn listen_ws(&self, address: &str) -> io::Result<()> {
84 let listener = TcpListener::bind(address)?;
85 for stream in listener.incoming() {
86 let stream = stream?;
87 let mut websocket = accept(stream).expect("Error during WebSocket handshake");
88 if let Ok(Message::Text(msg)) = websocket.read_message() {
89 println!("WebSocket received: {}", msg);
90 websocket.write_message(Message::Text("Hello, WebSocket!".into())).unwrap();
91 }
92 }
93 Ok(())
94 }
95 }
96
97 impl Socket {
98 fn generate_stable_id(addr: &str) -> i32 {
99 let mut hasher = DefaultHasher::new();
100 addr.hash(&mut hasher);
101 (hasher.finish() & 0x7FFFFFFF) as i32 }
103
104 pub fn new_tcp(stream: TcpStream) -> Self {
105 let addr = format!("{:?}", stream.peer_addr().unwrap_or_else(|_| panic!("Could not get peer address")));
106 let id = Self::generate_stable_id(&addr);
107 Self {
108 id,
109 stream: Some(Arc::new(Mutex::new(stream))),
110 udp_socket: None,
111 handlers: Arc::new(Mutex::new(HashMap::new())),
112 }
113 }
114
115 pub fn new_udp(socket: Arc<UdpSocket>) -> Self {
116 let addr = format!("{:?}", socket.local_addr().unwrap_or_else(|_| panic!("Could not get local address")));
117 let id = Self::generate_stable_id(&addr);
118 Self {
119 id,
120 stream: None,
121 udp_socket: Some(socket),
122 handlers: Arc::new(Mutex::new(HashMap::new())),
123 }
124 }
125
126 pub fn id(&self) -> i32 {
127 self.id
128 }
129
130 pub fn on<F>(&self, event: &str, callback: F)
131 where
132 F: Fn(&str) + Send + 'static,
133 {
134 self.handlers.lock().unwrap().insert(event.to_string(), Box::new(callback));
135 }
136
137 pub fn emit(&self, event: &str) {
138 if let Some(stream) = &self.stream {
139 let mut stream = stream.lock().unwrap();
140 let message = format!("{}:\n", event); let _ = stream.write_all(message.as_bytes());
142 }
143 }
144
145
146 pub fn listen_tcp(&self) {
147 let mut buffer = [0; 1024];
148 if let Some(stream) = &self.stream {
149 let mut stream = stream.lock().unwrap();
150 if let Ok(size) = stream.read(&mut buffer) {
151 let data = String::from_utf8_lossy(&buffer[..size]).to_string();
152 for line in data.lines() { if let Some((event, _)) = line.split_once(':') {
154 if let Some(callback) = self.handlers.lock().unwrap().get(event) {
155 callback(""); }
157 }
158 }
159 }
160 }
161 }
162
163 }
164
165 #[cfg(test)]
166 mod tests {
167 use super::*;
168
169 #[test]
170 fn test_stable_socket_ids() {
171 let addr = "127.0.0.1:8080";
172 let id1 = Socket::generate_stable_id(addr);
173 let id2 = Socket::generate_stable_id(addr);
174 assert_eq!(id1, id2, "Same address should generate same ID");
175 }
176 }
177}
178
179#[cfg(test)]
180mod tests {
181 use super::net::{self, EasySocketServer};
182 use std::thread;
183
184 #[test]
185 fn test_tcp_server_client() {
186 thread::spawn(|| {
187 let server = EasySocketServer::new();
188 server.on("connection", |socket| {
189 socket.on("hello, server", |msg| {
190 println!("Server received: {}", msg);
191 });
192 socket.emit("hello, client!");
193 socket.listen_tcp();
194 });
195 server.listen_tcp("127.0.0.1:4000").unwrap();
196 });
197
198 thread::sleep(std::time::Duration::from_secs(1)); let client = std::net::TcpStream::connect("127.0.0.1:4000").unwrap();
201 let socket = net::Socket::new_tcp(client);
202 socket.on("hello, client!", |msg| {
203 println!("Client received: {}", msg);
204 });
205 socket.emit("hello, server");
206 socket.listen_tcp();
207 }
208}