From 651f048b43cde5216d4497dd8b9fe275af85e89e Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 27 Sep 2024 09:52:28 -0700 Subject: [PATCH 001/149] added stuff --- Cargo.toml | 13 ++++++++++ src/bin/client.rs | 41 +++++++++++++++++++++++++++++++ src/bin/server.rs | 62 +++++++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 15 ++++++++++++ 4 files changed, 131 insertions(+) create mode 100644 Cargo.toml create mode 100644 src/bin/client.rs create mode 100644 src/bin/server.rs create mode 100644 src/main.rs diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..621b099 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "chat-app" +version = "0.1.0" +edition = "2021" + +#[package.metadata.release] +#release = false + +[dependencies] +futures-util = { version = "0.3.30", features = ["sink"] } +http = "1.1.0" +tokio = { version = "1.40.0", features = ["full"] } +tokio-websockets = { version = "0.9.0", features = ["client", "fastrand", "server", "sha1_smol"] } \ No newline at end of file diff --git a/src/bin/client.rs b/src/bin/client.rs new file mode 100644 index 0000000..da20ec0 --- /dev/null +++ b/src/bin/client.rs @@ -0,0 +1,41 @@ +use futures_util::stream::StreamExt; +use futures_util::SinkExt; +use http::Uri; +use tokio::io::{AsyncBufReadExt, BufReader}; +use tokio_websockets::{ClientBuilder, Message}; + +#[tokio::main] +async fn main() -> Result<(), tokio_websockets::Error> { + let (mut ws_stream, _) = + ClientBuilder::from_uri(Uri::from_static("ws://127.0.0.1:2000")) + .connect() + .await?; + + let stdin = tokio::io::stdin(); + let mut stdin = BufReader::new(stdin).lines(); + + // Continuous loop for concurrently sending and receiving messages. + loop { + tokio::select! { + incoming = ws_stream.next() => { + match incoming { + Some(Ok(msg)) => { + if let Some(text) = msg.as_text() { + println!("From server: {}", text); + } + }, + Some(Err(err)) => return Err(err.into()), + None => return Ok(()), + } + } + res = stdin.next_line() => { + match res { + Ok(None) => return Ok(()), + Ok(Some(line)) => ws_stream.send(Message::text(line.to_string())).await?, + Err(err) => return Err(err.into()), + } + } + + } + } +} \ No newline at end of file diff --git a/src/bin/server.rs b/src/bin/server.rs new file mode 100644 index 0000000..67afe60 --- /dev/null +++ b/src/bin/server.rs @@ -0,0 +1,62 @@ +use futures_util::sink::SinkExt; +use futures_util::stream::StreamExt; +use std::error::Error; +use std::net::SocketAddr; +use tokio::net::{TcpListener, TcpStream}; +use tokio::sync::broadcast::{channel, Sender}; +use tokio_websockets::{Message, ServerBuilder, WebSocketStream}; + +async fn handle_connection( + addr: SocketAddr, + mut ws_stream: WebSocketStream, + bcast_tx: Sender, +) -> Result<(), Box> { + + ws_stream + .send(Message::text("Welcome to chat! Type a message".to_string())) + .await?; + let mut bcast_rx = bcast_tx.subscribe(); + + // A continuous loop for concurrently performing two tasks: (1) receiving + // messages from `ws_stream` and broadcasting them, and (2) receiving + // messages on `bcast_rx` and sending them to the client. + loop { + tokio::select! { + incoming = ws_stream.next() => { + match incoming { + Some(Ok(msg)) => { + if let Some(text) = msg.as_text() { + println!("From client {addr:?} {text:?}"); + bcast_tx.send(text.into())?; + } + } + Some(Err(err)) => return Err(err.into()), + None => return Ok(()), + } + } + msg = bcast_rx.recv() => { + ws_stream.send(Message::text(msg?)).await?; + } + } + } +} + +#[tokio::main] +async fn main() -> Result<(), Box> { + let (bcast_tx, _) = channel(16); + + let listener = TcpListener::bind("127.0.0.1:2000").await?; + println!("listening on port 2000"); + + loop { + let (socket, addr) = listener.accept().await?; + println!("New connection from {addr:?}"); + let bcast_tx = bcast_tx.clone(); + tokio::spawn(async move { + // Wrap the raw TCP stream into a websocket. + let ws_stream = ServerBuilder::new().accept(socket).await?; + + handle_connection(addr, ws_stream, bcast_tx).await + }); + } +} \ No newline at end of file diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..ed68a9c --- /dev/null +++ b/src/main.rs @@ -0,0 +1,15 @@ + +#[tokio::main] +async fn main() -> std::io::Result<(),()> { + // 1 + let listener = tokio::TcpListener::bind(ADDR).await?; + // 2 + match litener.accept().await { + // 3 + Ok((mut socket, addr)) => { + // do something + } + + Err(err) => println!("Error connecting. {}", err); + } +} \ No newline at end of file From 048af78cd6b49eb39573b87c732f71d5b984ad59 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 27 Sep 2024 10:02:01 -0700 Subject: [PATCH 002/149] added stuff --- src/main.rs | 15 --------------- 1 file changed, 15 deletions(-) delete mode 100644 src/main.rs diff --git a/src/main.rs b/src/main.rs deleted file mode 100644 index ed68a9c..0000000 --- a/src/main.rs +++ /dev/null @@ -1,15 +0,0 @@ - -#[tokio::main] -async fn main() -> std::io::Result<(),()> { - // 1 - let listener = tokio::TcpListener::bind(ADDR).await?; - // 2 - match litener.accept().await { - // 3 - Ok((mut socket, addr)) => { - // do something - } - - Err(err) => println!("Error connecting. {}", err); - } -} \ No newline at end of file From d80815c4f50b68e0015b355f4f34515fa6cf5e15 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 27 Sep 2024 10:23:23 -0700 Subject: [PATCH 003/149] added stuff --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 621b099..01cd06f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,4 +10,4 @@ edition = "2021" futures-util = { version = "0.3.30", features = ["sink"] } http = "1.1.0" tokio = { version = "1.40.0", features = ["full"] } -tokio-websockets = { version = "0.9.0", features = ["client", "fastrand", "server", "sha1_smol"] } \ No newline at end of file +tokio-websockets = { version = "0.8.0", features = ["client", "fastrand", "server", "sha1_smol"] } \ No newline at end of file From c2ed6504015c44aaf3f01dc07d777d08feb21f89 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 27 Sep 2024 11:08:03 -0700 Subject: [PATCH 004/149] added stuff --- src/bin/client.rs | 43 ++++++++++++++++++---- src/bin/server.rs | 93 ++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 111 insertions(+), 25 deletions(-) diff --git a/src/bin/client.rs b/src/bin/client.rs index da20ec0..0a9194b 100644 --- a/src/bin/client.rs +++ b/src/bin/client.rs @@ -1,20 +1,39 @@ use futures_util::stream::StreamExt; use futures_util::SinkExt; use http::Uri; +use structopt::StructOpt; use tokio::io::{AsyncBufReadExt, BufReader}; use tokio_websockets::{ClientBuilder, Message}; +#[derive(StructOpt)] +struct Cli { + #[structopt(short, long, default_value = "127.0.0.1")] + host: String, + + #[structopt(short, long, default_value = "2000")] + port: String, + + #[structopt(short, long)] + username: String, +} + #[tokio::main] async fn main() -> Result<(), tokio_websockets::Error> { - let (mut ws_stream, _) = - ClientBuilder::from_uri(Uri::from_static("ws://127.0.0.1:2000")) - .connect() - .await?; + let args = Cli::from_args(); + let ws_url = format!("ws://{}:{}/", args.host, args.port); + + let (mut ws_stream, _) = ClientBuilder::from_uri(Uri::from_maybe_shared(ws_url).unwrap()) + .connect() + .await?; let stdin = tokio::io::stdin(); let mut stdin = BufReader::new(stdin).lines(); - // Continuous loop for concurrently sending and receiving messages. + // Send the join message immediately + ws_stream + .send(Message::text(format!("/join {}", args.username))) + .await?; + loop { tokio::select! { incoming = ws_stream.next() => { @@ -28,14 +47,24 @@ async fn main() -> Result<(), tokio_websockets::Error> { None => return Ok(()), } } + res = stdin.next_line() => { match res { Ok(None) => return Ok(()), - Ok(Some(line)) => ws_stream.send(Message::text(line.to_string())).await?, + Ok(Some(line)) => { + if line.starts_with("send ") { + let msg = line[5..].to_string(); + ws_stream.send(Message::text(msg)).await?; + } else if line == "leave" { + ws_stream.send(Message::text("/leave".to_string())).await?; + return Ok(()); + } else { + println!("Unknown command."); + } + } Err(err) => return Err(err.into()), } } - } } } \ No newline at end of file diff --git a/src/bin/server.rs b/src/bin/server.rs index 67afe60..e3758a7 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -1,39 +1,93 @@ use futures_util::sink::SinkExt; use futures_util::stream::StreamExt; +use std::collections::HashMap; use std::error::Error; use std::net::SocketAddr; use tokio::net::{TcpListener, TcpStream}; -use tokio::sync::broadcast::{channel, Sender}; +use tokio::sync::{broadcast::{channel, Sender}, Mutex}; use tokio_websockets::{Message, ServerBuilder, WebSocketStream}; +use std::sync::Arc; + +// Structure to hold user data +struct User { + username: String, + addr: SocketAddr, + ws_stream: WebSocketStream, +} + +// Structure to hold server state +struct ServerState { + users: Mutex>, // map addr to username + bcast_tx: Sender, // broadcast channel for sending messages to all users +} + +impl ServerState { + async fn broadcast_message(&self, addr: &SocketAddr, message: String) { + let users = self.users.lock().await; + let sender_name = users.get(addr).unwrap(); + let full_msg = format!("{}: {}", sender_name, message); + + for (user_addr, _) in users.iter() { + if user_addr != addr { + self.bcast_tx.send(full_msg.clone()).unwrap(); + } + } + } +} async fn handle_connection( addr: SocketAddr, mut ws_stream: WebSocketStream, - bcast_tx: Sender, + state: Arc, ) -> Result<(), Box> { + // Send a welcome message + ws_stream.send(Message::text("Welcome to chat! Type '/join ' to join.".to_string())).await?; - ws_stream - .send(Message::text("Welcome to chat! Type a message".to_string())) - .await?; - let mut bcast_rx = bcast_tx.subscribe(); + let mut bcast_rx = state.bcast_tx.subscribe(); + let mut username: Option = None; - // A continuous loop for concurrently performing two tasks: (1) receiving - // messages from `ws_stream` and broadcasting them, and (2) receiving - // messages on `bcast_rx` and sending them to the client. loop { tokio::select! { + // Handle incoming messages from the client incoming = ws_stream.next() => { match incoming { Some(Ok(msg)) => { if let Some(text) = msg.as_text() { - println!("From client {addr:?} {text:?}"); - bcast_tx.send(text.into())?; + if text.starts_with("/join ") { + // Handle user joining + let new_username = text[6..].trim().to_string(); + let mut users = state.users.lock().await; + + if users.values().any(|name| name == &new_username) { + ws_stream.send(Message::text("Username already taken.".to_string())).await?; + } else { + users.insert(addr, new_username.clone()); + ws_stream.send(Message::text(format!("Joined as {}", new_username))).await?; + state.bcast_tx.send(format!("{} has joined the chat.", new_username))?; + username = Some(new_username); + } + } else if text == "/leave" { + // Handle user leaving + if let Some(name) = username.take() { + let mut users = state.users.lock().await; + users.remove(&addr); + state.bcast_tx.send(format!("{} has left the chat.", name))?; + return Ok(()); + } + } else if let Some(_) = username { + // Broadcast regular messages + state.broadcast_message(&addr, text.into()).await; + } else { + ws_stream.send(Message::text("Please join with '/join ' first.".to_string())).await?; + } } } Some(Err(err)) => return Err(err.into()), None => return Ok(()), } } + + // Handle messages from the broadcast channel msg = bcast_rx.recv() => { ws_stream.send(Message::text(msg?)).await?; } @@ -44,19 +98,22 @@ async fn handle_connection( #[tokio::main] async fn main() -> Result<(), Box> { let (bcast_tx, _) = channel(16); + let state = Arc::new(ServerState { + users: Mutex::new(HashMap::new()), + bcast_tx, + }); let listener = TcpListener::bind("127.0.0.1:2000").await?; - println!("listening on port 2000"); + println!("Listening on port 2000"); loop { let (socket, addr) = listener.accept().await?; - println!("New connection from {addr:?}"); - let bcast_tx = bcast_tx.clone(); + let state = state.clone(); + tokio::spawn(async move { - // Wrap the raw TCP stream into a websocket. let ws_stream = ServerBuilder::new().accept(socket).await?; - - handle_connection(addr, ws_stream, bcast_tx).await + handle_connection(addr, ws_stream, state).await }); } -} \ No newline at end of file +} + From 6b810367b6c99081802c56d9b03d66afdb8167f4 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 27 Sep 2024 11:18:45 -0700 Subject: [PATCH 005/149] added stuff --- Cargo.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 01cd06f..6c9bc70 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,4 +10,5 @@ edition = "2021" futures-util = { version = "0.3.30", features = ["sink"] } http = "1.1.0" tokio = { version = "1.40.0", features = ["full"] } -tokio-websockets = { version = "0.8.0", features = ["client", "fastrand", "server", "sha1_smol"] } \ No newline at end of file +tokio-websockets = { version = "0.8.0", features = ["client", "fastrand", "server", "sha1_smol"] } +structopt = { version = "0.3", default-features = false } \ No newline at end of file From 8e49ae888e7b0cc2e5da8b62dfb6e8a80ba038ea Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 27 Sep 2024 12:43:09 -0700 Subject: [PATCH 006/149] added tests --- src/bin/server.rs | 39 +++++++++++++++++++++++++++++++++++++++ tests/integration.rs | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+) create mode 100644 tests/integration.rs diff --git a/src/bin/server.rs b/src/bin/server.rs index e3758a7..79c3d14 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -21,6 +21,7 @@ struct ServerState { bcast_tx: Sender, // broadcast channel for sending messages to all users } +//Make sure to broadcast to all others except sender impl ServerState { async fn broadcast_message(&self, addr: &SocketAddr, message: String) { let users = self.users.lock().await; @@ -117,3 +118,41 @@ async fn main() -> Result<(), Box> { } } +#[cfg(test)] +mod tests { + use super::*; + use tokio::sync::broadcast; + use tokio_websockets::{Message, WebSocketStream}; + use futures_util::stream::StreamExt; + use tokio::net::TcpStream; + use futures::channel::mpsc; + use std::net::SocketAddr; + + #[tokio::test] + async fn test_user_join() { + let (bcast_tx, _) = broadcast::channel(16); + + let (mut tx, mut rx) = mpsc::channel(1); + let (mock_socket, _other_end) = TcpStream::pair().unwrap(); + let addr: SocketAddr = "127.0.0.1:8080".parse().unwrap(); + + let ws_stream = WebSocketStream::new(mock_socket); + tokio::spawn(async move { + handle_connection(addr, ws_stream, bcast_tx).await.unwrap(); + }); + + // Simulate sending a message to the server (client sends a message) + tx.send(Message::text("/join username")).await.unwrap(); + + // Check that the broadcast receiver gets a message about user joining + let result = rx.next().await; + assert_eq!(result.unwrap().to_string(), "INFO: Joined as username"); + + // Check that error is raised on duplicate username + tx.send(Message::text("/join username")).await.unwrap(); + let error_result = rx.next().await; + assert!(error_result.unwrap().contains("ERROR: Username already taken")); + } +} + + diff --git a/tests/integration.rs b/tests/integration.rs new file mode 100644 index 0000000..7ebd7df --- /dev/null +++ b/tests/integration.rs @@ -0,0 +1,38 @@ +#[tokio::test] +async fn test_chat_interaction() { + let server_handle = tokio::spawn(async { + // Start the server + bin::server::main().await.unwrap(); + }); + + let client1_handle = tokio::spawn(async { + let mut ws_stream = ClientBuilder::from_uri(Uri::from_static("ws://127.0.0.1:2000")) + .connect() + .await + .unwrap(); + + ws_stream.send(Message::text("/join user1")).await.unwrap(); + ws_stream.send(Message::text("send Hello, this is user1")).await.unwrap(); + + let received = ws_stream.next().await.unwrap(); + assert!(received.as_text().unwrap().contains("INFO: user1 has joined")); + assert!(received.as_text().unwrap().contains("Hello, this is user1")); + }); + + let client2_handle = tokio::spawn(async { + let mut ws_stream = ClientBuilder::from_uri(Uri::from_static("ws://127.0.0.1:2000")) + .connect() + .await + .unwrap(); + + ws_stream.send(Message::text("/join user2")).await.unwrap(); + let received = ws_stream.next().await.unwrap(); + assert!(received.as_text().unwrap().contains("INFO: user1 has joined")); + + ws_stream.send(Message::text("send Hello from user2")).await.unwrap(); + let received = ws_stream.next().await.unwrap(); + assert!(received.as_text().unwrap().contains("Hello from user2")); + }); + + let _ = tokio::join!(server_handle, client1_handle, client2_handle); +} From 0fe51a9da967a3683f90afa6066b3dff079d57d6 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 27 Sep 2024 12:47:01 -0700 Subject: [PATCH 007/149] added tests --- tests/integration.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/integration.rs b/tests/integration.rs index 7ebd7df..a4aa094 100644 --- a/tests/integration.rs +++ b/tests/integration.rs @@ -1,3 +1,8 @@ +use tokio_websockets::{ClientBuilder, Message}; // Import Message from the crate +use http::Uri; +use futures_util::stream::StreamExt; +use futures_util::SinkExt; + #[tokio::test] async fn test_chat_interaction() { let server_handle = tokio::spawn(async { From c6ce5a0f3435df555909288b8007df7bf5eacfe7 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 27 Sep 2024 12:53:09 -0700 Subject: [PATCH 008/149] added tests --- Cargo.toml | 2 +- tests/integration.rs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 6c9bc70..e061142 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,5 +10,5 @@ edition = "2021" futures-util = { version = "0.3.30", features = ["sink"] } http = "1.1.0" tokio = { version = "1.40.0", features = ["full"] } -tokio-websockets = { version = "0.8.0", features = ["client", "fastrand", "server", "sha1_smol"] } +tokio-websockets = { version = "0.8.0", features = ["client", "fastrand", "server", "sha1_smol", "sync"] } structopt = { version = "0.3", default-features = false } \ No newline at end of file diff --git a/tests/integration.rs b/tests/integration.rs index a4aa094..6aeed4c 100644 --- a/tests/integration.rs +++ b/tests/integration.rs @@ -1,7 +1,7 @@ use tokio_websockets::{ClientBuilder, Message}; // Import Message from the crate use http::Uri; -use futures_util::stream::StreamExt; -use futures_util::SinkExt; +use futures_util::{stream::StreamExt, SinkExt}; +use futures_util::sink::SinkExt; #[tokio::test] async fn test_chat_interaction() { From fa3d0c10713552873714269404db53fa08852149 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 27 Sep 2024 12:54:18 -0700 Subject: [PATCH 009/149] added tests --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index e061142..c551b9b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,5 +10,5 @@ edition = "2021" futures-util = { version = "0.3.30", features = ["sink"] } http = "1.1.0" tokio = { version = "1.40.0", features = ["full"] } -tokio-websockets = { version = "0.8.0", features = ["client", "fastrand", "server", "sha1_smol", "sync"] } +tokio-websockets = { version = "0.8.3", features = ["client", "fastrand", "server", "sha1_smol", "sync"] } structopt = { version = "0.3", default-features = false } \ No newline at end of file From dbde1dd89c5cc19b6fd7e6a5d1277b70cbe38f16 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 27 Sep 2024 12:55:51 -0700 Subject: [PATCH 010/149] added tests --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index c551b9b..c6a17a3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,5 +10,5 @@ edition = "2021" futures-util = { version = "0.3.30", features = ["sink"] } http = "1.1.0" tokio = { version = "1.40.0", features = ["full"] } -tokio-websockets = { version = "0.8.3", features = ["client", "fastrand", "server", "sha1_smol", "sync"] } +tokio-websockets = { version = "0.8.3", features = ["client", "fastrand", "server", "sha1_smol"] } structopt = { version = "0.3", default-features = false } \ No newline at end of file From 467a11481ca77e27b7906ede4932116b9fbda5d1 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 27 Sep 2024 12:57:54 -0700 Subject: [PATCH 011/149] added tests --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index c6a17a3..e061142 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,5 +10,5 @@ edition = "2021" futures-util = { version = "0.3.30", features = ["sink"] } http = "1.1.0" tokio = { version = "1.40.0", features = ["full"] } -tokio-websockets = { version = "0.8.3", features = ["client", "fastrand", "server", "sha1_smol"] } +tokio-websockets = { version = "0.8.0", features = ["client", "fastrand", "server", "sha1_smol", "sync"] } structopt = { version = "0.3", default-features = false } \ No newline at end of file From 27351f2396a04fa50cb1bf36186004ebfc33bcb0 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 27 Sep 2024 13:01:32 -0700 Subject: [PATCH 012/149] added tests --- Cargo.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index e061142..4e2a97e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,8 +7,9 @@ edition = "2021" #release = false [dependencies] -futures-util = { version = "0.3.30", features = ["sink"] } +#futures-util = { version = "0.3.30", features = ["sink"] } http = "1.1.0" +futures-util = "0.3" tokio = { version = "1.40.0", features = ["full"] } tokio-websockets = { version = "0.8.0", features = ["client", "fastrand", "server", "sha1_smol", "sync"] } structopt = { version = "0.3", default-features = false } \ No newline at end of file From 75e53ac7a22ea7c5a9bf15c3dfa748d3ad473f8a Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 27 Sep 2024 13:06:53 -0700 Subject: [PATCH 013/149] added tests --- Cargo.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 4e2a97e..62a00fe 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,9 +7,9 @@ edition = "2021" #release = false [dependencies] -#futures-util = { version = "0.3.30", features = ["sink"] } +futures-util = { version = "0.3.30", features = ["sink"] } http = "1.1.0" -futures-util = "0.3" +#futures-util = "0.3" tokio = { version = "1.40.0", features = ["full"] } -tokio-websockets = { version = "0.8.0", features = ["client", "fastrand", "server", "sha1_smol", "sync"] } +tokio-websockets = { version = "0.8.0", features = ["client", "fastrand", "server", "sha1_smol"] } structopt = { version = "0.3", default-features = false } \ No newline at end of file From f7043610df33daee85c928166726b3857dea4106 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 27 Sep 2024 14:12:20 -0700 Subject: [PATCH 014/149] added tests --- src/bin/client.rs | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/bin/client.rs b/src/bin/client.rs index 0a9194b..f458ac8 100644 --- a/src/bin/client.rs +++ b/src/bin/client.rs @@ -67,4 +67,43 @@ async fn main() -> Result<(), tokio_websockets::Error> { } } } +} + +#[cfg(test)] +mod tests { + use super::*; + use futures_util::stream; + use tokio_websockets::Message; + + #[tokio::test] + async fn test_handle_server_messages() { + let messages = vec![ + Message::text("INFO: Welcome to the chat"), + Message::text("ERROR: Username already taken"), + Message::text("Hello from another user"), + ]; + + let ws_stream = stream::iter(messages); + + let mut results = vec![]; + + ws_stream + .for_each(|msg| { + if let Ok(text) = msg.as_text() { + if text.starts_with("ERROR:") { + results.push(format!("Error from server: {}", &text[6..])); + } else if text.starts_with("INFO:") { + results.push(format!("Info: {}", &text[5..])); + } else { + results.push(format!("From server: {}", text)); + } + } + futures::future::ready(()) + }) + .await; + + assert_eq!(results[0], "Info: Welcome to the chat"); + assert_eq!(results[1], "Error from server: Username already taken"); + assert_eq!(results[2], "From server: Hello from another user"); + } } \ No newline at end of file From 9e08467cee1fe0208ac8fd1c84ca6af4bed82632 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 27 Sep 2024 14:39:29 -0700 Subject: [PATCH 015/149] added tests --- Cargo.toml | 3 ++- src/bin/client.rs | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 62a00fe..cd9f543 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,4 +12,5 @@ http = "1.1.0" #futures-util = "0.3" tokio = { version = "1.40.0", features = ["full"] } tokio-websockets = { version = "0.8.0", features = ["client", "fastrand", "server", "sha1_smol"] } -structopt = { version = "0.3", default-features = false } \ No newline at end of file +structopt = { version = "0.3", default-features = false } +futures = "0.3.30" \ No newline at end of file diff --git a/src/bin/client.rs b/src/bin/client.rs index f458ac8..c60ecc0 100644 --- a/src/bin/client.rs +++ b/src/bin/client.rs @@ -74,6 +74,7 @@ mod tests { use super::*; use futures_util::stream; use tokio_websockets::Message; + use futures::*; #[tokio::test] async fn test_handle_server_messages() { From 234a5337e9498a32ceef725c7706caf467bd18f2 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 27 Sep 2024 18:58:06 -0700 Subject: [PATCH 016/149] added tests --- tests/integration.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integration.rs b/tests/integration.rs index 6aeed4c..eabc9df 100644 --- a/tests/integration.rs +++ b/tests/integration.rs @@ -1,7 +1,7 @@ use tokio_websockets::{ClientBuilder, Message}; // Import Message from the crate use http::Uri; use futures_util::{stream::StreamExt, SinkExt}; -use futures_util::sink::SinkExt; +//use futures_util::sink::SinkExt; #[tokio::test] async fn test_chat_interaction() { From 65e30c7156e4d2868cc9e07caa101b6182837f76 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 27 Sep 2024 19:00:17 -0700 Subject: [PATCH 017/149] added tests --- tests/integration.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/integration.rs b/tests/integration.rs index eabc9df..36e4d27 100644 --- a/tests/integration.rs +++ b/tests/integration.rs @@ -16,6 +16,8 @@ async fn test_chat_interaction() { .await .unwrap(); + let (mut ws_stream, _) = ws_stream; + ws_stream.send(Message::text("/join user1")).await.unwrap(); ws_stream.send(Message::text("send Hello, this is user1")).await.unwrap(); From 738a18ff7d68cfac51adbcd09151d9e0c3da8bbc Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 27 Sep 2024 19:01:04 -0700 Subject: [PATCH 018/149] added tests --- tests/integration.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/integration.rs b/tests/integration.rs index 36e4d27..41ee7d7 100644 --- a/tests/integration.rs +++ b/tests/integration.rs @@ -32,6 +32,7 @@ async fn test_chat_interaction() { .await .unwrap(); + let (mut ws_stream, _) = ws_stream; ws_stream.send(Message::text("/join user2")).await.unwrap(); let received = ws_stream.next().await.unwrap(); assert!(received.as_text().unwrap().contains("INFO: user1 has joined")); From c9d757f23eb52c1a247bfb756dca550419913e00 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 27 Sep 2024 19:24:43 -0700 Subject: [PATCH 019/149] added tests --- tests/integration.rs | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/tests/integration.rs b/tests/integration.rs index 41ee7d7..1a64624 100644 --- a/tests/integration.rs +++ b/tests/integration.rs @@ -19,11 +19,25 @@ async fn test_chat_interaction() { let (mut ws_stream, _) = ws_stream; ws_stream.send(Message::text("/join user1")).await.unwrap(); + + let received = ws_stream.next().await.unwrap(); + if let Ok(msg) = received { + assert!(msg.as_text().unwrap().contains("INFO: user1 has joined")); + } else { + panic!("Failed to receive message"); + } + ws_stream.send(Message::text("send Hello, this is user1")).await.unwrap(); let received = ws_stream.next().await.unwrap(); - assert!(received.as_text().unwrap().contains("INFO: user1 has joined")); - assert!(received.as_text().unwrap().contains("Hello, this is user1")); + if let Ok(msg) = received { + assert!(msg.as_text().unwrap().contains("Hello, this is user1")); + } else { + panic!("Failed to receive message"); + } + + //assert!(received.as_text().unwrap().contains("INFO: user1 has joined")); + //assert!(received.as_text().unwrap().contains("Hello, this is user1")); }); let client2_handle = tokio::spawn(async { @@ -35,11 +49,21 @@ async fn test_chat_interaction() { let (mut ws_stream, _) = ws_stream; ws_stream.send(Message::text("/join user2")).await.unwrap(); let received = ws_stream.next().await.unwrap(); - assert!(received.as_text().unwrap().contains("INFO: user1 has joined")); + if let Ok(msg) = received { + assert!(msg.as_text().unwrap().contains("INFO: user2 has joined")); + } else { + panic!("Failed to receive message"); + } + //assert!(received.as_text().unwrap().contains("INFO: user1 has joined")); ws_stream.send(Message::text("send Hello from user2")).await.unwrap(); let received = ws_stream.next().await.unwrap(); - assert!(received.as_text().unwrap().contains("Hello from user2")); + if let Ok(msg) = received { + assert!(msg.as_text().unwrap().contains("Hello from user2")); + } else { + panic!("Failed to receive message"); + } + //assert!(received[0].as_text().unwrap().contains("Hello from user2")); }); let _ = tokio::join!(server_handle, client1_handle, client2_handle); From 628c2ac14737be13dfb8afbdc3eb3b8572568412 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 27 Sep 2024 19:27:39 -0700 Subject: [PATCH 020/149] added tests --- tests/integration.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/integration.rs b/tests/integration.rs index 1a64624..be3da14 100644 --- a/tests/integration.rs +++ b/tests/integration.rs @@ -3,6 +3,12 @@ use http::Uri; use futures_util::{stream::StreamExt, SinkExt}; //use futures_util::sink::SinkExt; +#[path = "../src/bin/server.rs"] +mod server; + +#[path = "../src/bin/client.rs"] +mod client; + #[tokio::test] async fn test_chat_interaction() { let server_handle = tokio::spawn(async { From b4e348bfcb77681f9aa297d1cb5d5a7ff3dbf7da Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 27 Sep 2024 19:30:24 -0700 Subject: [PATCH 021/149] added tests --- tests/integration.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integration.rs b/tests/integration.rs index be3da14..1ca3867 100644 --- a/tests/integration.rs +++ b/tests/integration.rs @@ -13,7 +13,7 @@ mod client; async fn test_chat_interaction() { let server_handle = tokio::spawn(async { // Start the server - bin::server::main().await.unwrap(); + server::main().await.unwrap(); }); let client1_handle = tokio::spawn(async { From b8239f7310443175d4a556e31fb1678e26f3ffc1 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 27 Sep 2024 19:54:17 -0700 Subject: [PATCH 022/149] added tests --- src/bin/client.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/client.rs b/src/bin/client.rs index c60ecc0..458ffac 100644 --- a/src/bin/client.rs +++ b/src/bin/client.rs @@ -90,7 +90,7 @@ mod tests { ws_stream .for_each(|msg| { - if let Ok(text) = msg.as_text() { + if let Some(text) = msg.as_text() { if text.starts_with("ERROR:") { results.push(format!("Error from server: {}", &text[6..])); } else if text.starts_with("INFO:") { From 396da74e4d8d7ad62ee35b1e36c53ce845d227e4 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 27 Sep 2024 20:28:33 -0700 Subject: [PATCH 023/149] added tests --- src/bin/client.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/client.rs b/src/bin/client.rs index 458ffac..8c5fbd8 100644 --- a/src/bin/client.rs +++ b/src/bin/client.rs @@ -94,7 +94,7 @@ mod tests { if text.starts_with("ERROR:") { results.push(format!("Error from server: {}", &text[6..])); } else if text.starts_with("INFO:") { - results.push(format!("Info: {}", &text[5..])); + results.push(format!("Info: {}", &text[6..])); } else { results.push(format!("From server: {}", text)); } From fc58fff4d7b0dc4d8d201d2b0056fb460ab77c2c Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 27 Sep 2024 20:29:28 -0700 Subject: [PATCH 024/149] added tests --- src/bin/client.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/client.rs b/src/bin/client.rs index 8c5fbd8..3d651c9 100644 --- a/src/bin/client.rs +++ b/src/bin/client.rs @@ -92,7 +92,7 @@ mod tests { .for_each(|msg| { if let Some(text) = msg.as_text() { if text.starts_with("ERROR:") { - results.push(format!("Error from server: {}", &text[6..])); + results.push(format!("Error from server: {}", &text[7..])); } else if text.starts_with("INFO:") { results.push(format!("Info: {}", &text[6..])); } else { From abaa8eeaaecaf3c9c6c5b5a79cdcf039d75127c8 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Mon, 30 Sep 2024 08:11:23 -0700 Subject: [PATCH 025/149] added tests --- src/bin/server.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index 79c3d14..1bbcd89 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -101,7 +101,7 @@ async fn main() -> Result<(), Box> { let (bcast_tx, _) = channel(16); let state = Arc::new(ServerState { users: Mutex::new(HashMap::new()), - bcast_tx, + bcast_tx: bcast_tx.clone(), }); let listener = TcpListener::bind("127.0.0.1:2000").await?; @@ -113,7 +113,7 @@ async fn main() -> Result<(), Box> { tokio::spawn(async move { let ws_stream = ServerBuilder::new().accept(socket).await?; - handle_connection(addr, ws_stream, state).await + handle_connection(addr, ws_stream, state.clone()).await }); } } From b7180bdf524aa31efd0b932f1440d285f710fa3b Mon Sep 17 00:00:00 2001 From: rsouvik Date: Mon, 30 Sep 2024 08:20:32 -0700 Subject: [PATCH 026/149] added tests --- src/bin/server.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index 1bbcd89..3f3c7bb 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -131,6 +131,10 @@ mod tests { #[tokio::test] async fn test_user_join() { let (bcast_tx, _) = broadcast::channel(16); + let state = Arc::new(ServerState { + users: Mutex::new(HashMap::new()), + bcast_tx: bcast_tx.clone(), + }); let (mut tx, mut rx) = mpsc::channel(1); let (mock_socket, _other_end) = TcpStream::pair().unwrap(); @@ -138,7 +142,7 @@ mod tests { let ws_stream = WebSocketStream::new(mock_socket); tokio::spawn(async move { - handle_connection(addr, ws_stream, bcast_tx).await.unwrap(); + handle_connection(addr, ws_stream, state.clone()).await.unwrap(); }); // Simulate sending a message to the server (client sends a message) From 3a4b2cff1357c795cec0b06a480a7e895a71ddf5 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Mon, 30 Sep 2024 08:33:10 -0700 Subject: [PATCH 027/149] added tests --- src/bin/server.rs | 50 ++++++++++++++++++++++++++++------------------- 1 file changed, 30 insertions(+), 20 deletions(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index 3f3c7bb..8be5353 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -122,41 +122,51 @@ async fn main() -> Result<(), Box> { mod tests { use super::*; use tokio::sync::broadcast; - use tokio_websockets::{Message, WebSocketStream}; + use tokio_websockets::{Message, WebSocketStream, ServerBuilder}; use futures_util::stream::StreamExt; - use tokio::net::TcpStream; - use futures::channel::mpsc; - use std::net::SocketAddr; + use tokio::net::TcpListener; + use std::sync::Arc; #[tokio::test] async fn test_user_join() { + // Create a broadcast channel for the test let (bcast_tx, _) = broadcast::channel(16); let state = Arc::new(ServerState { users: Mutex::new(HashMap::new()), bcast_tx: bcast_tx.clone(), }); - let (mut tx, mut rx) = mpsc::channel(1); - let (mock_socket, _other_end) = TcpStream::pair().unwrap(); - let addr: SocketAddr = "127.0.0.1:8080".parse().unwrap(); + // Set up a TCP listener to simulate a server + let listener = TcpListener::bind("127.0.0.1:0").await.unwrap(); // Bind to an available port + let addr = listener.local_addr().unwrap(); - let ws_stream = WebSocketStream::new(mock_socket); + // Spawn a task to accept a connection in the background + let server_state = state.clone(); tokio::spawn(async move { - handle_connection(addr, ws_stream, state.clone()).await.unwrap(); + let (socket, _peer_addr) = listener.accept().await.unwrap(); + let ws_stream = ServerBuilder::new().accept(socket).await.unwrap(); + handle_connection(_peer_addr, ws_stream, server_state).await.unwrap(); }); - // Simulate sending a message to the server (client sends a message) - tx.send(Message::text("/join username")).await.unwrap(); + // Simulate a client connecting to the server + let client_socket = TcpStream::connect(addr).await.unwrap(); + let mut ws_stream = tokio_websockets::ClientBuilder::new() + .connect(client_socket) + .await + .unwrap(); - // Check that the broadcast receiver gets a message about user joining - let result = rx.next().await; - assert_eq!(result.unwrap().to_string(), "INFO: Joined as username"); + // Simulate sending a join message from the client + ws_stream.send(Message::text("/join username")).await.unwrap(); + + // Simulate receiving the welcome message from the server + if let Some(Ok(received)) = ws_stream.next().await { + assert!(received.as_text().unwrap().contains("Joined as username")); + } // Check that error is raised on duplicate username - tx.send(Message::text("/join username")).await.unwrap(); - let error_result = rx.next().await; - assert!(error_result.unwrap().contains("ERROR: Username already taken")); + ws_stream.send(Message::text("/join username")).await.unwrap(); + if let Some(Ok(received)) = ws_stream.next().await { + assert!(received.as_text().unwrap().contains("Username already taken")); + } } -} - - +} \ No newline at end of file From 9006d37fc7e7d140882506c5a91426c2c0b93554 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Mon, 30 Sep 2024 08:43:10 -0700 Subject: [PATCH 028/149] added tests --- src/bin/server.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index 8be5353..738840a 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -140,11 +140,13 @@ mod tests { let listener = TcpListener::bind("127.0.0.1:0").await.unwrap(); // Bind to an available port let addr = listener.local_addr().unwrap(); + // Spawn a task to accept a connection in the background let server_state = state.clone(); tokio::spawn(async move { let (socket, _peer_addr) = listener.accept().await.unwrap(); - let ws_stream = ServerBuilder::new().accept(socket).await.unwrap(); + //let ws_stream = ServerBuilder::new().accept(socket).await.unwrap(); + let (mut ws_stream, _) = tokio_websockets::ServerBuilder::new().accept(mock_socket).await.unwrap(); handle_connection(_peer_addr, ws_stream, server_state).await.unwrap(); }); From 8bc24525fe861c76783834032171f3194599229e Mon Sep 17 00:00:00 2001 From: rsouvik Date: Mon, 30 Sep 2024 08:44:05 -0700 Subject: [PATCH 029/149] added tests --- src/bin/server.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index 738840a..8be5353 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -140,13 +140,11 @@ mod tests { let listener = TcpListener::bind("127.0.0.1:0").await.unwrap(); // Bind to an available port let addr = listener.local_addr().unwrap(); - // Spawn a task to accept a connection in the background let server_state = state.clone(); tokio::spawn(async move { let (socket, _peer_addr) = listener.accept().await.unwrap(); - //let ws_stream = ServerBuilder::new().accept(socket).await.unwrap(); - let (mut ws_stream, _) = tokio_websockets::ServerBuilder::new().accept(mock_socket).await.unwrap(); + let ws_stream = ServerBuilder::new().accept(socket).await.unwrap(); handle_connection(_peer_addr, ws_stream, server_state).await.unwrap(); }); From 59932996ce79937d962f1830172834f322dbab19 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Mon, 30 Sep 2024 08:49:44 -0700 Subject: [PATCH 030/149] added tests --- src/bin/server.rs | 48 ++++++++++++++++++----------------------------- 1 file changed, 18 insertions(+), 30 deletions(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index 8be5353..ab1f6cf 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -122,51 +122,39 @@ async fn main() -> Result<(), Box> { mod tests { use super::*; use tokio::sync::broadcast; - use tokio_websockets::{Message, WebSocketStream, ServerBuilder}; - use futures_util::stream::StreamExt; - use tokio::net::TcpListener; - use std::sync::Arc; + use tokio_websockets::{Message, ServerBuilder}; + use tokio::net::TcpStream; + use std::net::SocketAddr; #[tokio::test] async fn test_user_join() { - // Create a broadcast channel for the test let (bcast_tx, _) = broadcast::channel(16); let state = Arc::new(ServerState { users: Mutex::new(HashMap::new()), bcast_tx: bcast_tx.clone(), }); - // Set up a TCP listener to simulate a server - let listener = TcpListener::bind("127.0.0.1:0").await.unwrap(); // Bind to an available port - let addr = listener.local_addr().unwrap(); + // Create a mock socket pair (one for client, one for server) + let (client_socket, server_socket) = tokio::net::TcpStream::pair().unwrap(); + let addr: SocketAddr = "127.0.0.1:8080".parse().unwrap(); - // Spawn a task to accept a connection in the background - let server_state = state.clone(); + // Simulate accepting a WebSocket connection + let (mut ws_stream, _) = ServerBuilder::new().accept(server_socket).await.unwrap(); + + // Spawn the server side of the connection tokio::spawn(async move { - let (socket, _peer_addr) = listener.accept().await.unwrap(); - let ws_stream = ServerBuilder::new().accept(socket).await.unwrap(); - handle_connection(_peer_addr, ws_stream, server_state).await.unwrap(); + handle_connection(addr, ws_stream, state.clone()).await.unwrap(); }); - // Simulate a client connecting to the server - let client_socket = TcpStream::connect(addr).await.unwrap(); - let mut ws_stream = tokio_websockets::ClientBuilder::new() - .connect(client_socket) - .await - .unwrap(); - - // Simulate sending a join message from the client - ws_stream.send(Message::text("/join username")).await.unwrap(); + // Simulate sending a message to the server (client sends a message) + let (mut client_ws_stream, _) = ServerBuilder::new().accept(client_socket).await.unwrap(); - // Simulate receiving the welcome message from the server - if let Some(Ok(received)) = ws_stream.next().await { - assert!(received.as_text().unwrap().contains("Joined as username")); - } + let msg = Message::text("/join username"); + client_ws_stream.send(msg).await.unwrap(); // Client sends a join message - // Check that error is raised on duplicate username - ws_stream.send(Message::text("/join username")).await.unwrap(); - if let Some(Ok(received)) = ws_stream.next().await { - assert!(received.as_text().unwrap().contains("Username already taken")); + // Simulate receiving the broadcasted message from the server + if let Some(Ok(received)) = client_ws_stream.next().await { + assert!(received.as_text().unwrap().contains("username has joined the chat")); } } } \ No newline at end of file From 6dfe091c69e244d1daf63a0db6471fab826331d9 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Mon, 30 Sep 2024 08:53:26 -0700 Subject: [PATCH 031/149] added tests --- src/bin/server.rs | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index ab1f6cf..e688629 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -123,7 +123,7 @@ mod tests { use super::*; use tokio::sync::broadcast; use tokio_websockets::{Message, ServerBuilder}; - use tokio::net::TcpStream; + use tokio::net::{TcpListener, TcpStream}; use std::net::SocketAddr; #[tokio::test] @@ -134,21 +134,21 @@ mod tests { bcast_tx: bcast_tx.clone(), }); - // Create a mock socket pair (one for client, one for server) - let (client_socket, server_socket) = tokio::net::TcpStream::pair().unwrap(); - let addr: SocketAddr = "127.0.0.1:8080".parse().unwrap(); + // Create a TCP listener for the server + let listener = TcpListener::bind("127.0.0.1:8080").await.unwrap(); - // Simulate accepting a WebSocket connection - let (mut ws_stream, _) = ServerBuilder::new().accept(server_socket).await.unwrap(); - - // Spawn the server side of the connection + // Simulate a client connecting to the server tokio::spawn(async move { - handle_connection(addr, ws_stream, state.clone()).await.unwrap(); + let (client_socket, _) = listener.accept().await.unwrap(); + let (mut ws_stream, _) = ServerBuilder::new().accept(client_socket).await.unwrap(); + handle_connection("127.0.0.1:8080".parse().unwrap(), ws_stream, state.clone()).await.unwrap(); }); - // Simulate sending a message to the server (client sends a message) + // Create a client-side TCP stream + let client_socket = TcpStream::connect("127.0.0.1:8080").await.unwrap(); let (mut client_ws_stream, _) = ServerBuilder::new().accept(client_socket).await.unwrap(); + // Simulate client sending a message let msg = Message::text("/join username"); client_ws_stream.send(msg).await.unwrap(); // Client sends a join message @@ -157,4 +157,4 @@ mod tests { assert!(received.as_text().unwrap().contains("username has joined the chat")); } } -} \ No newline at end of file +} From 6031e0088e74bde9f1ea84f3900e9c12c5d15bb7 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Mon, 30 Sep 2024 08:55:34 -0700 Subject: [PATCH 032/149] added tests --- src/bin/server.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index e688629..3985347 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -140,13 +140,13 @@ mod tests { // Simulate a client connecting to the server tokio::spawn(async move { let (client_socket, _) = listener.accept().await.unwrap(); - let (mut ws_stream, _) = ServerBuilder::new().accept(client_socket).await.unwrap(); + let (mut ws_stream, _) = ServerBuilder::new().accept(client_socket).await.unwrap(); // Extract the WebSocketStream handle_connection("127.0.0.1:8080".parse().unwrap(), ws_stream, state.clone()).await.unwrap(); }); // Create a client-side TCP stream let client_socket = TcpStream::connect("127.0.0.1:8080").await.unwrap(); - let (mut client_ws_stream, _) = ServerBuilder::new().accept(client_socket).await.unwrap(); + let (mut client_ws_stream, _) = ServerBuilder::new().accept(client_socket).await.unwrap(); // Extract the WebSocketStream // Simulate client sending a message let msg = Message::text("/join username"); From 96c7bcebb1eb70d122eb6c8c3b4318ae9567ef7b Mon Sep 17 00:00:00 2001 From: rsouvik Date: Mon, 30 Sep 2024 08:58:33 -0700 Subject: [PATCH 033/149] added tests --- src/bin/server.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index 3985347..c10ba0c 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -140,13 +140,13 @@ mod tests { // Simulate a client connecting to the server tokio::spawn(async move { let (client_socket, _) = listener.accept().await.unwrap(); - let (mut ws_stream, _) = ServerBuilder::new().accept(client_socket).await.unwrap(); // Extract the WebSocketStream + let (mut ws_stream, _) = ServerBuilder::new().accept(client_socket).await.unwrap(); // Correctly destructuring the tuple handle_connection("127.0.0.1:8080".parse().unwrap(), ws_stream, state.clone()).await.unwrap(); }); // Create a client-side TCP stream let client_socket = TcpStream::connect("127.0.0.1:8080").await.unwrap(); - let (mut client_ws_stream, _) = ServerBuilder::new().accept(client_socket).await.unwrap(); // Extract the WebSocketStream + let (mut client_ws_stream, _) = ServerBuilder::new().accept(client_socket).await.unwrap(); // Correctly destructuring the tuple // Simulate client sending a message let msg = Message::text("/join username"); @@ -158,3 +158,4 @@ mod tests { } } } + From bdcbc61f612049382710788a4c14b2f47ffbfbff Mon Sep 17 00:00:00 2001 From: rsouvik Date: Thu, 13 Mar 2025 13:49:52 -0700 Subject: [PATCH 034/149] feat: adding counters to store stats --- Cargo.toml | 3 ++- src/bin/server.rs | 11 ++++++++--- src/lib.rs | 14 ++++++++++++++ src/models.rs | 17 +++++++++++++++++ 4 files changed, 41 insertions(+), 4 deletions(-) create mode 100644 src/lib.rs create mode 100644 src/models.rs diff --git a/Cargo.toml b/Cargo.toml index cd9f543..e7dcbfc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,4 +13,5 @@ http = "1.1.0" tokio = { version = "1.40.0", features = ["full"] } tokio-websockets = { version = "0.8.0", features = ["client", "fastrand", "server", "sha1_smol"] } structopt = { version = "0.3", default-features = false } -futures = "0.3.30" \ No newline at end of file +futures = "0.3.30" +diesel = { version = "", features = [""] } diff --git a/src/bin/server.rs b/src/bin/server.rs index c10ba0c..69f9119 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -12,12 +12,13 @@ use std::sync::Arc; struct User { username: String, addr: SocketAddr, - ws_stream: WebSocketStream, + ws_stream: WebSocketStream, // do we need this? + lifetime_cnt: i32, } // Structure to hold server state struct ServerState { - users: Mutex>, // map addr to username + users: Mutex>, // map addr to username bcast_tx: Sender, // broadcast channel for sending messages to all users } @@ -62,7 +63,11 @@ async fn handle_connection( if users.values().any(|name| name == &new_username) { ws_stream.send(Message::text("Username already taken.".to_string())).await?; } else { - users.insert(addr, new_username.clone()); + if users.entry(&addr) == true { + users.insert(addr, (users.get(addr)[0],users.get(addr)[1]+1)); + } + else + users.insert(addr, (new_username.clone(),0)); ws_stream.send(Message::text(format!("Joined as {}", new_username))).await?; state.bcast_tx.send(format!("{} has joined the chat.", new_username))?; username = Some(new_username); diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..2cd3916 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,14 @@ +use diesel::prelude::*; +use dotenvy::dotenv; +use std::env; + +pub mod models; +pub mod schema; + +pub fn establish_connection() -> PgConnection { + dotenv().ok(); + + let database_url = env::var("DATABASE_URL").expect("DATABASE_URL must be set"); + PgConnection::establish(&database_url) + .unwrap_or_else(|_| panic!("Error connecting to {}", database_url)) +} \ No newline at end of file diff --git a/src/models.rs b/src/models.rs new file mode 100644 index 0000000..e7081d3 --- /dev/null +++ b/src/models.rs @@ -0,0 +1,17 @@ +use diesel::prelude::*; + +#[derive(Queryable, Selectable)] +#[diesel(table_name = crate::schema::posts)] +#[diesel(check_for_backend(diesel::pg::Pg))] +pub struct Post { + pub id: i32, + pub title: String, + pub body: String, + pub published: bool, +} + +pub struct User { + pub username: String, + pub addr: String, + //ws_stream: WebSocketStream, // do we need this? +} \ No newline at end of file From b1e2d16d4328478973f92498b896636065fd1d23 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Thu, 13 Mar 2025 13:58:43 -0700 Subject: [PATCH 035/149] updating with appropriate flags for flamegraph --- Cargo.toml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Cargo.toml b/Cargo.toml index e7dcbfc..23f235d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,6 +6,13 @@ edition = "2021" #[package.metadata.release] #release = false +[profile.release] +debug = true + +[target.x86_64-unknown-linux-gnu] +linker = "/usr/bin/clang" +rustflags = ["-Clink-arg=-fuse-ld=lld", "-Clink-arg=-Wl,--no-rosegment"] + [dependencies] futures-util = { version = "0.3.30", features = ["sink"] } http = "1.1.0" From 332828e631a73986c8c9e51eac589c6dd95c0fff Mon Sep 17 00:00:00 2001 From: rsouvik Date: Thu, 13 Mar 2025 14:03:10 -0700 Subject: [PATCH 036/149] updating with appropriate flags for flamegraph --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 23f235d..1de2023 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,4 +21,4 @@ tokio = { version = "1.40.0", features = ["full"] } tokio-websockets = { version = "0.8.0", features = ["client", "fastrand", "server", "sha1_smol"] } structopt = { version = "0.3", default-features = false } futures = "0.3.30" -diesel = { version = "", features = [""] } +diesel = { version = "2.2.8", features = [""] } From 6ea3261864f70adbeb5926d3e08d30190270c0d2 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Thu, 13 Mar 2025 14:04:48 -0700 Subject: [PATCH 037/149] updating with appropriate flags for flamegraph --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 1de2023..cd02485 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,4 +21,4 @@ tokio = { version = "1.40.0", features = ["full"] } tokio-websockets = { version = "0.8.0", features = ["client", "fastrand", "server", "sha1_smol"] } structopt = { version = "0.3", default-features = false } futures = "0.3.30" -diesel = { version = "2.2.8", features = [""] } +diesel = "2.2.8" From cf82a069fae4baa4c0341d47e5b82fd399fe5805 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Thu, 13 Mar 2025 14:08:51 -0700 Subject: [PATCH 038/149] updating with appropriate flags for flamegraph --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index cd02485..1c2d15e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,4 +21,4 @@ tokio = { version = "1.40.0", features = ["full"] } tokio-websockets = { version = "0.8.0", features = ["client", "fastrand", "server", "sha1_smol"] } structopt = { version = "0.3", default-features = false } futures = "0.3.30" -diesel = "2.2.8" +diesel = { version = "2.2.8", features = [""] } \ No newline at end of file From d4328ed8fa00f6e67bd78a3cbb831faa16781068 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Thu, 13 Mar 2025 14:10:50 -0700 Subject: [PATCH 039/149] updating with appropriate flags for flamegraph --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 1c2d15e..12912c8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,4 +21,4 @@ tokio = { version = "1.40.0", features = ["full"] } tokio-websockets = { version = "0.8.0", features = ["client", "fastrand", "server", "sha1_smol"] } structopt = { version = "0.3", default-features = false } futures = "0.3.30" -diesel = { version = "2.2.8", features = [""] } \ No newline at end of file +diesel = { version = "~2.2.0", features = [""] } \ No newline at end of file From 3f3db6cdeda0e5a4e7bf208a0b24742dd5f6f090 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Thu, 13 Mar 2025 14:12:39 -0700 Subject: [PATCH 040/149] updating with appropriate flags for flamegraph --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 12912c8..dd39285 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,4 +21,4 @@ tokio = { version = "1.40.0", features = ["full"] } tokio-websockets = { version = "0.8.0", features = ["client", "fastrand", "server", "sha1_smol"] } structopt = { version = "0.3", default-features = false } futures = "0.3.30" -diesel = { version = "~2.2.0", features = [""] } \ No newline at end of file +diesel = { version = "2.2.8", features = ["postgres, mysql, sqlite"] } \ No newline at end of file From 6b21a6307822bebe650347007d2c1aee82ee5cd6 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Thu, 13 Mar 2025 14:13:59 -0700 Subject: [PATCH 041/149] updating with appropriate flags for flamegraph --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index dd39285..275178b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,4 +21,4 @@ tokio = { version = "1.40.0", features = ["full"] } tokio-websockets = { version = "0.8.0", features = ["client", "fastrand", "server", "sha1_smol"] } structopt = { version = "0.3", default-features = false } futures = "0.3.30" -diesel = { version = "2.2.8", features = ["postgres, mysql, sqlite"] } \ No newline at end of file +diesel = { version = "2.2.8", features = ["postgres, sqlite"] } \ No newline at end of file From ed884215905dbeaec3361c2fa812c09866865059 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Thu, 13 Mar 2025 14:15:21 -0700 Subject: [PATCH 042/149] updating with appropriate flags for flamegraph --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 275178b..0837c7e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,4 +21,4 @@ tokio = { version = "1.40.0", features = ["full"] } tokio-websockets = { version = "0.8.0", features = ["client", "fastrand", "server", "sha1_smol"] } structopt = { version = "0.3", default-features = false } futures = "0.3.30" -diesel = { version = "2.2.8", features = ["postgres, sqlite"] } \ No newline at end of file +diesel = { version = "2.2.8", features = ["postgres"] } \ No newline at end of file From d6c0803e129a2f44bdc9535dde37c60d1d11b1dc Mon Sep 17 00:00:00 2001 From: rsouvik Date: Thu, 13 Mar 2025 19:17:00 -0700 Subject: [PATCH 043/149] updating with appropriate flags for flamegraph --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 0837c7e..dcfc5f0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,4 +21,4 @@ tokio = { version = "1.40.0", features = ["full"] } tokio-websockets = { version = "0.8.0", features = ["client", "fastrand", "server", "sha1_smol"] } structopt = { version = "0.3", default-features = false } futures = "0.3.30" -diesel = { version = "2.2.8", features = ["postgres"] } \ No newline at end of file +diesel = { version = "2.2.8", features = ["postgres", "mysql"] } \ No newline at end of file From 77da868941689dfe271ee7e541ec1db27879dd76 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 14 Mar 2025 12:29:30 -0700 Subject: [PATCH 044/149] updating with appropriate flags for flamegraph --- Cargo.toml | 3 ++- src/lib.rs | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index dcfc5f0..79e1fce 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,4 +21,5 @@ tokio = { version = "1.40.0", features = ["full"] } tokio-websockets = { version = "0.8.0", features = ["client", "fastrand", "server", "sha1_smol"] } structopt = { version = "0.3", default-features = false } futures = "0.3.30" -diesel = { version = "2.2.8", features = ["postgres", "mysql"] } \ No newline at end of file +diesel = { version = "2.2.8", features = ["postgres", "mysql"] } +dotenvy = "0.15.7" \ No newline at end of file diff --git a/src/lib.rs b/src/lib.rs index 2cd3916..6e320ae 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -3,7 +3,7 @@ use dotenvy::dotenv; use std::env; pub mod models; -pub mod schema; +//pub mod schema; pub fn establish_connection() -> PgConnection { dotenv().ok(); From dedd8a99993f3900495709b46979ddb70f19fc34 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 14 Mar 2025 13:18:25 -0700 Subject: [PATCH 045/149] updating with appropriate flags for flamegraph --- src/lib.rs | 2 +- src/schema.rs | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 src/schema.rs diff --git a/src/lib.rs b/src/lib.rs index 6e320ae..2cd3916 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -3,7 +3,7 @@ use dotenvy::dotenv; use std::env; pub mod models; -//pub mod schema; +pub mod schema; pub fn establish_connection() -> PgConnection { dotenv().ok(); diff --git a/src/schema.rs b/src/schema.rs new file mode 100644 index 0000000..a638e69 --- /dev/null +++ b/src/schema.rs @@ -0,0 +1,8 @@ +diesel::table! { + posts (id) { + id -> Int4, + title -> Varchar, + body -> Text, + published -> Bool, + } +} \ No newline at end of file From ae5f0f2a0fe4ec2e26b4068f78ab33284d378651 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 14 Mar 2025 13:24:26 -0700 Subject: [PATCH 046/149] updating with appropriate flags for flamegraph --- src/bin/server.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index 69f9119..64062ca 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -26,7 +26,7 @@ struct ServerState { impl ServerState { async fn broadcast_message(&self, addr: &SocketAddr, message: String) { let users = self.users.lock().await; - let sender_name = users.get(addr).unwrap(); + let sender_name = users.get(addr)[0].unwrap(); let full_msg = format!("{}: {}", sender_name, message); for (user_addr, _) in users.iter() { @@ -60,14 +60,15 @@ async fn handle_connection( let new_username = text[6..].trim().to_string(); let mut users = state.users.lock().await; - if users.values().any(|name| name == &new_username) { + if users.values().any(|name[0]| name[0] == &new_username) { ws_stream.send(Message::text("Username already taken.".to_string())).await?; } else { if users.entry(&addr) == true { users.insert(addr, (users.get(addr)[0],users.get(addr)[1]+1)); } - else + else { users.insert(addr, (new_username.clone(),0)); + } ws_stream.send(Message::text(format!("Joined as {}", new_username))).await?; state.bcast_tx.send(format!("{} has joined the chat.", new_username))?; username = Some(new_username); From 6d7ecdf220e87f1b40668516e747eef3451562ba Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 14 Mar 2025 13:32:10 -0700 Subject: [PATCH 047/149] updating with appropriate flags for flamegraph --- src/bin/server.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index 64062ca..b019749 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -60,7 +60,7 @@ async fn handle_connection( let new_username = text[6..].trim().to_string(); let mut users = state.users.lock().await; - if users.values().any(|name[0]| name[0] == &new_username) { + if users.values().any(|name| name.0 == &new_username) { ws_stream.send(Message::text("Username already taken.".to_string())).await?; } else { if users.entry(&addr) == true { From c376f64cef4308b026cc55ccbf577e5dac2f82aa Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 14 Mar 2025 13:36:12 -0700 Subject: [PATCH 048/149] updating with appropriate flags for flamegraph --- src/bin/server.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index b019749..8af6659 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -60,7 +60,7 @@ async fn handle_connection( let new_username = text[6..].trim().to_string(); let mut users = state.users.lock().await; - if users.values().any(|name| name.0 == &new_username) { + if users.values().any(|name| name.0.to_string() == &new_username) { ws_stream.send(Message::text("Username already taken.".to_string())).await?; } else { if users.entry(&addr) == true { From a04482862ba046fdaf351f71a643e6868cbd2040 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 14 Mar 2025 13:41:03 -0700 Subject: [PATCH 049/149] updating with appropriate flags for flamegraph --- src/bin/server.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index 8af6659..e2deda6 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -60,7 +60,7 @@ async fn handle_connection( let new_username = text[6..].trim().to_string(); let mut users = state.users.lock().await; - if users.values().any(|name| name.0.to_string() == &new_username) { + if users.values().any(|name| name.0.as_slice() == &new_username) { ws_stream.send(Message::text("Username already taken.".to_string())).await?; } else { if users.entry(&addr) == true { From f4edc18390c7b5cd52c434728654379552a14cd4 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 14 Mar 2025 13:44:52 -0700 Subject: [PATCH 050/149] updating with appropriate flags for flamegraph --- src/bin/server.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index e2deda6..26cf62f 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -60,7 +60,7 @@ async fn handle_connection( let new_username = text[6..].trim().to_string(); let mut users = state.users.lock().await; - if users.values().any(|name| name.0.as_slice() == &new_username) { + if users.values().any(|name| &name.0 == &new_username) { ws_stream.send(Message::text("Username already taken.".to_string())).await?; } else { if users.entry(&addr) == true { From 9f04dea2ee64cdb51f7150a8a167cd5cfc26d4e2 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 14 Mar 2025 14:38:31 -0700 Subject: [PATCH 051/149] updating with appropriate flags for flamegraph --- src/bin/server.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index 26cf62f..bd79db5 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -26,7 +26,7 @@ struct ServerState { impl ServerState { async fn broadcast_message(&self, addr: &SocketAddr, message: String) { let users = self.users.lock().await; - let sender_name = users.get(addr)[0].unwrap(); + let sender_name = users.get(addr).0.unwrap(); let full_msg = format!("{}: {}", sender_name, message); for (user_addr, _) in users.iter() { @@ -64,7 +64,7 @@ async fn handle_connection( ws_stream.send(Message::text("Username already taken.".to_string())).await?; } else { if users.entry(&addr) == true { - users.insert(addr, (users.get(addr)[0],users.get(addr)[1]+1)); + users.insert(addr, (users.get(addr).0,users.get(addr).1+1)); } else { users.insert(addr, (new_username.clone(),0)); From d3b6d4ed1d6292d99c82f3d84282d87cf44b021b Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 14 Mar 2025 14:44:11 -0700 Subject: [PATCH 052/149] updating with appropriate flags for flamegraph --- src/bin/server.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index bd79db5..52f790a 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -64,7 +64,7 @@ async fn handle_connection( ws_stream.send(Message::text("Username already taken.".to_string())).await?; } else { if users.entry(&addr) == true { - users.insert(addr, (users.get(addr).0,users.get(addr).1+1)); + users.insert(addr, (users.get(&addr).0,users.get(&addr).1+1)); } else { users.insert(addr, (new_username.clone(),0)); From 92c51f29aa5dc28d89a8fc9004c271c8a7b53f59 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 14 Mar 2025 14:46:47 -0700 Subject: [PATCH 053/149] updating with appropriate flags for flamegraph --- src/bin/server.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index 52f790a..31a9605 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -63,7 +63,7 @@ async fn handle_connection( if users.values().any(|name| &name.0 == &new_username) { ws_stream.send(Message::text("Username already taken.".to_string())).await?; } else { - if users.entry(&addr) == true { + if users.entry(addr) == true { users.insert(addr, (users.get(&addr).0,users.get(&addr).1+1)); } else { From f2b9e48d3ced466e544ae1e2c07ef4119f853aaa Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 14 Mar 2025 14:48:15 -0700 Subject: [PATCH 054/149] updating with appropriate flags for flamegraph --- src/bin/server.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index 31a9605..7c2ee33 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -64,7 +64,7 @@ async fn handle_connection( ws_stream.send(Message::text("Username already taken.".to_string())).await?; } else { if users.entry(addr) == true { - users.insert(addr, (users.get(&addr).0,users.get(&addr).1+1)); + users.insert(addr, (users.get(addr).0,users.get(addr).1+1)); } else { users.insert(addr, (new_username.clone(),0)); From b4e00c48b466fb98be489734ff7df4f749a4a9dc Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 14 Mar 2025 14:49:42 -0700 Subject: [PATCH 055/149] updating with appropriate flags for flamegraph --- src/bin/server.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index 7c2ee33..c38866d 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -64,7 +64,7 @@ async fn handle_connection( ws_stream.send(Message::text("Username already taken.".to_string())).await?; } else { if users.entry(addr) == true { - users.insert(addr, (users.get(addr).0,users.get(addr).1+1)); + users.insert(addr, ((users.get(&addr)).0,(users.get(&addr)).1+1)); } else { users.insert(addr, (new_username.clone(),0)); From 82251ceb62f20c07f2081be75325d60f452e8187 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 14 Mar 2025 15:30:12 -0700 Subject: [PATCH 056/149] updating with appropriate flags for flamegraph --- src/bin/server.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index c38866d..a23ff73 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -63,8 +63,8 @@ async fn handle_connection( if users.values().any(|name| &name.0 == &new_username) { ws_stream.send(Message::text("Username already taken.".to_string())).await?; } else { - if users.entry(addr) == true { - users.insert(addr, ((users.get(&addr)).0,(users.get(&addr)).1+1)); + if users.contains_key(addr) == true { + users.insert(addr, ((users.get(&addr)).copied().0,(users.get(&addr)).copied().1+1)); } else { users.insert(addr, (new_username.clone(),0)); From a2facf4a7e8dfb41088dd6aa6a0c91730f15ae7d Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 14 Mar 2025 15:46:14 -0700 Subject: [PATCH 057/149] updating with appropriate flags for flamegraph --- src/bin/server.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index a23ff73..816f342 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -63,8 +63,14 @@ async fn handle_connection( if users.values().any(|name| &name.0 == &new_username) { ws_stream.send(Message::text("Username already taken.".to_string())).await?; } else { - if users.contains_key(addr) == true { - users.insert(addr, ((users.get(&addr)).copied().0,(users.get(&addr)).copied().1+1)); + if users.contains_key(&addr) == true { + if let Some(tuple_ref) = users.get(&addr) { + if let Some(fe) = tuple_ref.as_ref().map(|t| &t.0) + && let Some(se) = tuple_ref.as_ref().map(|t| &t.1) { + users.insert(addr, (fe,se+1)); + } + } + //users.insert(addr, ((users.get(&addr)).copied().0,(users.get(&addr)).copied().1+1)); } else { users.insert(addr, (new_username.clone(),0)); From 24493fb9829a7cb65fa5158ac8ac1f3bcb5fa668 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 14 Mar 2025 15:48:41 -0700 Subject: [PATCH 058/149] updating with appropriate flags for flamegraph --- src/bin/server.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index 816f342..f7b4135 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -64,13 +64,13 @@ async fn handle_connection( ws_stream.send(Message::text("Username already taken.".to_string())).await?; } else { if users.contains_key(&addr) == true { - if let Some(tuple_ref) = users.get(&addr) { + /*if let Some(tuple_ref) = users.get(&addr) { if let Some(fe) = tuple_ref.as_ref().map(|t| &t.0) && let Some(se) = tuple_ref.as_ref().map(|t| &t.1) { users.insert(addr, (fe,se+1)); } - } - //users.insert(addr, ((users.get(&addr)).copied().0,(users.get(&addr)).copied().1+1)); + }*/ + users.insert(addr, ((users.get(&addr)).as_ref().0,(users.get(&addr)).as_ref().1+1)); } else { users.insert(addr, (new_username.clone(),0)); From bb37afc1521534dfcc7aea06065da7d46ba80c22 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 14 Mar 2025 15:49:31 -0700 Subject: [PATCH 059/149] updating with appropriate flags for flamegraph --- src/bin/server.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index f7b4135..f8ce537 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -26,7 +26,7 @@ struct ServerState { impl ServerState { async fn broadcast_message(&self, addr: &SocketAddr, message: String) { let users = self.users.lock().await; - let sender_name = users.get(addr).0.unwrap(); + let sender_name = users.get(addr).as_ref().0.unwrap(); let full_msg = format!("{}: {}", sender_name, message); for (user_addr, _) in users.iter() { From 07a730bfe49c0fb35a20b304e9eadb59db4287dc Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 14 Mar 2025 16:04:44 -0700 Subject: [PATCH 060/149] updating with appropriate flags for flamegraph --- src/bin/server.rs | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index f8ce537..f492efe 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -26,14 +26,24 @@ struct ServerState { impl ServerState { async fn broadcast_message(&self, addr: &SocketAddr, message: String) { let users = self.users.lock().await; - let sender_name = users.get(addr).as_ref().0.unwrap(); + if let Some(sname) = users.get(addr).map(|t| &t.0){ + let sender_name = sname.unwrap(); + let full_msg = format!("{}: {}", sender_name, message); + + for (user_addr, _) in users.iter() { + if user_addr != addr { + self.bcast_tx.send(full_msg.clone()).unwrap(); + } + } + } + /*let sender_name = users.get(addr).as_ref().0.unwrap(); let full_msg = format!("{}: {}", sender_name, message); for (user_addr, _) in users.iter() { if user_addr != addr { self.bcast_tx.send(full_msg.clone()).unwrap(); } - } + }*/ } } From 4f87630b0ba9bffa251a6051ed68a140e2450fd2 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 14 Mar 2025 16:05:31 -0700 Subject: [PATCH 061/149] updating with appropriate flags for flamegraph --- src/bin/server.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index f492efe..9637f27 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -27,7 +27,7 @@ impl ServerState { async fn broadcast_message(&self, addr: &SocketAddr, message: String) { let users = self.users.lock().await; if let Some(sname) = users.get(addr).map(|t| &t.0){ - let sender_name = sname.unwrap(); + let sender_name = sname; let full_msg = format!("{}: {}", sender_name, message); for (user_addr, _) in users.iter() { From 66cbe9dabc71fbf44e57c5f3f3a46c85acc53411 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 14 Mar 2025 16:22:03 -0700 Subject: [PATCH 062/149] updating with appropriate flags for flamegraph --- src/bin/server.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index 9637f27..3b78242 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -80,7 +80,14 @@ async fn handle_connection( users.insert(addr, (fe,se+1)); } }*/ - users.insert(addr, ((users.get(&addr)).as_ref().0,(users.get(&addr)).as_ref().1+1)); + if let Some(fv) = users.get(&addr).map(|t| &t.0){ + let sname = fv; + if let Some(sv) = users.get(&addr).map(|t| &t.1){ + let count = sv; + users.insert(addr, sname,count+1); + } + } + //users.insert(addr, ((users.get(&addr)).as_ref().0,(users.get(&addr)).as_ref().1+1)); } else { users.insert(addr, (new_username.clone(),0)); From 7861a5ff302f13c7d52471084b7a00ef11ee0461 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 14 Mar 2025 16:22:46 -0700 Subject: [PATCH 063/149] updating with appropriate flags for flamegraph --- src/bin/server.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index 3b78242..4f291ea 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -84,7 +84,7 @@ async fn handle_connection( let sname = fv; if let Some(sv) = users.get(&addr).map(|t| &t.1){ let count = sv; - users.insert(addr, sname,count+1); + users.insert(addr, (sname,count+1)); } } //users.insert(addr, ((users.get(&addr)).as_ref().0,(users.get(&addr)).as_ref().1+1)); From 23af64a4af52dc4b86942266faea90b50bbaa5f7 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 14 Mar 2025 16:24:49 -0700 Subject: [PATCH 064/149] updating with appropriate flags for flamegraph --- src/bin/server.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index 4f291ea..e31978f 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -84,7 +84,7 @@ async fn handle_connection( let sname = fv; if let Some(sv) = users.get(&addr).map(|t| &t.1){ let count = sv; - users.insert(addr, (sname,count+1)); + users.insert(addr, (sname.clone(),count+1)); } } //users.insert(addr, ((users.get(&addr)).as_ref().0,(users.get(&addr)).as_ref().1+1)); From f1b81f5bbec66dd4e6b73aaa310c69344ff5a0c2 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 14 Mar 2025 16:26:57 -0700 Subject: [PATCH 065/149] updating with appropriate flags for flamegraph --- src/bin/server.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index e31978f..283d063 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -84,7 +84,7 @@ async fn handle_connection( let sname = fv; if let Some(sv) = users.get(&addr).map(|t| &t.1){ let count = sv; - users.insert(addr, (sname.clone(),count+1)); + users.insert(addr, (sname.copy(),count+1)); } } //users.insert(addr, ((users.get(&addr)).as_ref().0,(users.get(&addr)).as_ref().1+1)); From bfc9166e24e1762d9a414ff33f60ec5000365fa2 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 14 Mar 2025 16:34:54 -0700 Subject: [PATCH 066/149] updating with appropriate flags for flamegraph --- src/bin/server.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index 283d063..4f291ea 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -84,7 +84,7 @@ async fn handle_connection( let sname = fv; if let Some(sv) = users.get(&addr).map(|t| &t.1){ let count = sv; - users.insert(addr, (sname.copy(),count+1)); + users.insert(addr, (sname,count+1)); } } //users.insert(addr, ((users.get(&addr)).as_ref().0,(users.get(&addr)).as_ref().1+1)); From b2ab226beed74fbd26506ff5e4484d6f4c4b12ef Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 14 Mar 2025 16:35:57 -0700 Subject: [PATCH 067/149] updating with appropriate flags for flamegraph --- src/bin/server.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index 4f291ea..a1dd8a4 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -81,7 +81,7 @@ async fn handle_connection( } }*/ if let Some(fv) = users.get(&addr).map(|t| &t.0){ - let sname = fv; + let sname = fv.clone(); if let Some(sv) = users.get(&addr).map(|t| &t.1){ let count = sv; users.insert(addr, (sname,count+1)); From bc342e9ae7e93b23e183b354ca58b1362688334b Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 14 Mar 2025 17:10:00 -0700 Subject: [PATCH 068/149] updating with appropriate flags for flamegraph --- src/bin/server.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index a1dd8a4..d1df87f 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -18,7 +18,7 @@ struct User { // Structure to hold server state struct ServerState { - users: Mutex>, // map addr to username + users: Mutex> , // map addr to username bcast_tx: Sender, // broadcast channel for sending messages to all users } @@ -81,7 +81,7 @@ async fn handle_connection( } }*/ if let Some(fv) = users.get(&addr).map(|t| &t.0){ - let sname = fv.clone(); + let sname = fv; if let Some(sv) = users.get(&addr).map(|t| &t.1){ let count = sv; users.insert(addr, (sname,count+1)); From 316818d17b4f4c119083ddb0714d3e372483f630 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 14 Mar 2025 17:10:58 -0700 Subject: [PATCH 069/149] updating with appropriate flags for flamegraph --- src/bin/server.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index d1df87f..41fbe41 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -84,7 +84,7 @@ async fn handle_connection( let sname = fv; if let Some(sv) = users.get(&addr).map(|t| &t.1){ let count = sv; - users.insert(addr, (sname,count+1)); + users.insert(addr, (String::from(sname),count+1)); } } //users.insert(addr, ((users.get(&addr)).as_ref().0,(users.get(&addr)).as_ref().1+1)); From 5b5535d8c1693ded2b26696cb19a8799cff12a70 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 14 Mar 2025 17:16:34 -0700 Subject: [PATCH 070/149] updating with appropriate flags for flamegraph --- src/bin/server.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index 41fbe41..4caca31 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -80,7 +80,7 @@ async fn handle_connection( users.insert(addr, (fe,se+1)); } }*/ - if let Some(fv) = users.get(&addr).map(|t| &t.0){ + if let Some(fv) = users.get(addr).map(|t| &t.0){ let sname = fv; if let Some(sv) = users.get(&addr).map(|t| &t.1){ let count = sv; From e6f4faf7549b43496527e88b5e2dbfbd8743c65c Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 14 Mar 2025 17:22:44 -0700 Subject: [PATCH 071/149] updating with appropriate flags for flamegraph --- src/bin/server.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index 4caca31..ec76542 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -80,7 +80,7 @@ async fn handle_connection( users.insert(addr, (fe,se+1)); } }*/ - if let Some(fv) = users.get(addr).map(|t| &t.0){ + if let Some(fv) = mut users.get(&addr).map(|t| &t.0){ let sname = fv; if let Some(sv) = users.get(&addr).map(|t| &t.1){ let count = sv; From 6635d0b43b00ecc0adfb81fda03e30460f256c99 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 14 Mar 2025 17:32:48 -0700 Subject: [PATCH 072/149] updating with appropriate flags for flamegraph --- src/bin/server.rs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index ec76542..7ae32e4 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -80,13 +80,16 @@ async fn handle_connection( users.insert(addr, (fe,se+1)); } }*/ - if let Some(fv) = mut users.get(&addr).map(|t| &t.0){ + if let Some(fv) = users.get(&addr).cloned().map(|t| &t.0){ let sname = fv; - if let Some(sv) = users.get(&addr).map(|t| &t.1){ + if let Some(sv) = users.get(&addr).cloned().map(|t| &t.1){ let count = sv; - users.insert(addr, (String::from(sname),count+1)); + users.insert(addr, (sname.clone(),count+1)); } } + /*users.entry(addr). + .and_modify(|entry| entry.1+=1) + .or_insert("default_name".to_string(),1);*/ //users.insert(addr, ((users.get(&addr)).as_ref().0,(users.get(&addr)).as_ref().1+1)); } else { From c7054cf12e55035f3473dcd65961b5cf298f9724 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 14 Mar 2025 17:34:43 -0700 Subject: [PATCH 073/149] updating with appropriate flags for flamegraph --- src/bin/server.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index 7ae32e4..428d1e8 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -80,12 +80,16 @@ async fn handle_connection( users.insert(addr, (fe,se+1)); } }*/ - if let Some(fv) = users.get(&addr).cloned().map(|t| &t.0){ + /*if let Some(fv) = users.get(&addr).cloned().map(|t| &t.0){ let sname = fv; if let Some(sv) = users.get(&addr).cloned().map(|t| &t.1){ let count = sv; users.insert(addr, (sname.clone(),count+1)); } + }*/ + + if let Some((sname, count)) = users.get(&addr).cloned() { + users.insert(addr, (sname.clone(), count + 1)); } /*users.entry(addr). .and_modify(|entry| entry.1+=1) From 05048ccbd92198cff8a0a0126b489b027d25c75c Mon Sep 17 00:00:00 2001 From: rsouvik Date: Mon, 17 Mar 2025 09:05:38 -0700 Subject: [PATCH 074/149] feat: adding a web-server --- src/bin/server.rs | 22 ++++++++++++++++++++++ src/webutils.rs | 0 2 files changed, 22 insertions(+) create mode 100644 src/webutils.rs diff --git a/src/bin/server.rs b/src/bin/server.rs index 428d1e8..3217fd7 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -8,6 +8,9 @@ use tokio::sync::{broadcast::{channel, Sender}, Mutex}; use tokio_websockets::{Message, ServerBuilder, WebSocketStream}; use std::sync::Arc; +extern crate actix_web; +use webutils::{index, indexPost}; + // Structure to hold user data struct User { username: String, @@ -140,6 +143,25 @@ async fn main() -> Result<(), Box> { bcast_tx: bcast_tx.clone(), }); + //Web server + //Start the web server + let server = HttpServer::new(move || { + App::new() + //.app_data(received_data.clone()) + .app_data(web::Data::new(web_sender.clone())) + //.app_data(swarm_controller.clone()) + //.route("/", web::post().to(receive_data)) + .route("/test", web::get().to(index)) + .route("/model", web::post().to(indexPost)) + }) + //.bind("127.0.0.1:8080")? + .bind("0.0.0.0:8080")? + .run(); + //.await; + + // Start the event loop + tokio::spawn(server); + let listener = TcpListener::bind("127.0.0.1:2000").await?; println!("Listening on port 2000"); diff --git a/src/webutils.rs b/src/webutils.rs new file mode 100644 index 0000000..e69de29 From 1cd5ec67b21918016c45508b74248b43b1755556 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Thu, 10 Apr 2025 09:53:22 -0700 Subject: [PATCH 075/149] feat: adding a web-server --- src/bin/server.rs | 5 ++-- src/models.rs | 4 +++ src/schema.rs | 8 ++++++ src/webutils.rs | 62 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 77 insertions(+), 2 deletions(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index 3217fd7..3f2733a 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -151,8 +151,9 @@ async fn main() -> Result<(), Box> { .app_data(web::Data::new(web_sender.clone())) //.app_data(swarm_controller.clone()) //.route("/", web::post().to(receive_data)) - .route("/test", web::get().to(index)) - .route("/model", web::post().to(indexPost)) + .route("/statsuser", web::get().to(index)) + .route("/statsall", web::get().to(index)) + .route("/updateuser", web::post().to(indexPost)) }) //.bind("127.0.0.1:8080")? .bind("0.0.0.0:8080")? diff --git a/src/models.rs b/src/models.rs index e7081d3..d823997 100644 --- a/src/models.rs +++ b/src/models.rs @@ -10,7 +10,11 @@ pub struct Post { pub published: bool, } +#[derive(Queryable, Selectable)] +#[diesel(table_name = crate::schema::users)] +#[diesel(check_for_backend(diesel::pg::Pg))] pub struct User { + pub id: i32, pub username: String, pub addr: String, //ws_stream: WebSocketStream, // do we need this? diff --git a/src/schema.rs b/src/schema.rs index a638e69..9b61917 100644 --- a/src/schema.rs +++ b/src/schema.rs @@ -5,4 +5,12 @@ diesel::table! { body -> Text, published -> Bool, } +} + +diesel::table! { + users (id) { + id -> Int4, + username -> Varchar, + addr -> Varchar, + } } \ No newline at end of file diff --git a/src/webutils.rs b/src/webutils.rs index e69de29..f3a8000 100644 --- a/src/webutils.rs +++ b/src/webutils.rs @@ -0,0 +1,62 @@ +use actix_web::{web, Responder, HttpResponse}; +use crate::SwarmWebMessage; +use tokio::{sync::mpsc}; + + +//get handler +pub(crate) async fn index(query: web::Query) -> impl Responder { + let name = &query.user_name; + + + + + let sender_clone = sender.get_ref().clone(); + + // Send the query parameter data to the libp2p swarm through the sender channel + if sender_clone.send(SwarmWebMessage::DataGet(name.to_owned())).await.is_ok() { + HttpResponse::Ok().body(format!("Data sent to libp2p swarm: {}", name)) + } else { + HttpResponse::InternalServerError().body("Failed to send data to libp2p swarm") + } +} + +pub(crate) async fn indexPost(query: web::Json) -> impl Responder { + + /*let model_type = &query.mtype; + let model_loc = &query.mlocation; + let model_data_loc = &query.mdataloc; + let model_algo = &query.malgo; + let model_output_loc = &query.moutputloc;*/ + + let sender_clone = sender.get_ref().clone(); + + /*let metadata = serde_json::json!( + { + "mtype": model_type, + "mlocation": model_loc, //e.g. s3://picxelate/dgp/create_model.py + "mdataloc": model_data_loc, + "malgo": model_algo, + "moutputloc": model_output_loc, + } + );*/ + //e.g. s3://picxelate/dgp/create_model.py + /*let metadata = r#"{ + "mtype": model_type, + "mlocation": model_loc, + "mdataloc": model_data_loc, + "malgo": model_algo, + "moutputloc": model_output_loc, + }"#;*/ + + //do metadata check about known peers + + // Send the query parameter data to the libp2p swarm through the sender channel + //if sender_clone.send(SwarmWebMessage::Data(model_loc.to_owned())).await.is_ok() { + if sender_clone.send(SwarmWebMessage::Data(query)).await.is_ok() { + //HttpResponse::Ok().body(format!("Data sent to libp2p swarm: {}", model_loc)) + HttpResponse::Ok().body("Data sent to libp2p swarm") + + } else { + HttpResponse::InternalServerError().body("Failed to send data to libp2p swarm") + } +} From fc96588bf98666bd319781d805a9111eed2623e8 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Thu, 10 Apr 2025 10:44:52 -0700 Subject: [PATCH 076/149] feat: adding a web-server --- Cargo.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 79e1fce..89c05b6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,4 +22,5 @@ tokio-websockets = { version = "0.8.0", features = ["client", "fastrand", "serve structopt = { version = "0.3", default-features = false } futures = "0.3.30" diesel = { version = "2.2.8", features = ["postgres", "mysql"] } -dotenvy = "0.15.7" \ No newline at end of file +dotenvy = "0.15.7" +actix-web = "4.5.1" \ No newline at end of file From c119b62adfa2b86456535f0de0f4f10409353554 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Thu, 10 Apr 2025 11:02:34 -0700 Subject: [PATCH 077/149] feat: adding a web-server --- src/bin/server.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/bin/server.rs b/src/bin/server.rs index 3f2733a..2c6ab45 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -11,6 +11,8 @@ use std::sync::Arc; extern crate actix_web; use webutils::{index, indexPost}; +use actix_web::{web, App, HttpServer, Responder}; + // Structure to hold user data struct User { username: String, From 0d6643ec180f32a7f3009cc850f2c386136729d1 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Thu, 10 Apr 2025 11:16:32 -0700 Subject: [PATCH 078/149] feat: adding a web-server --- src/bin/server.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index 2c6ab45..5a960aa 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -145,12 +145,15 @@ async fn main() -> Result<(), Box> { bcast_tx: bcast_tx.clone(), }); + //web data processing + //let (web_sender, mut web_receiver) = mpsc::channel::(100); + //Web server //Start the web server let server = HttpServer::new(move || { App::new() //.app_data(received_data.clone()) - .app_data(web::Data::new(web_sender.clone())) + //.app_data(web::Data::new(web_sender.clone())) //.app_data(swarm_controller.clone()) //.route("/", web::post().to(receive_data)) .route("/statsuser", web::get().to(index)) From 54a18fe142271f03ee9484513fdbce01541e26f5 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Thu, 10 Apr 2025 11:19:34 -0700 Subject: [PATCH 079/149] feat: adding a web-server --- src/bin/server.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index 5a960aa..d415cb4 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -7,11 +7,11 @@ use tokio::net::{TcpListener, TcpStream}; use tokio::sync::{broadcast::{channel, Sender}, Mutex}; use tokio_websockets::{Message, ServerBuilder, WebSocketStream}; use std::sync::Arc; - +use actix_web::{web, App, HttpServer, Responder}; extern crate actix_web; -use webutils::{index, indexPost}; -use actix_web::{web, App, HttpServer, Responder}; +mod webutils; +use webutils::{index, indexPost}; // Structure to hold user data struct User { From 758a4ec4ebcdba45e99fac83536b5af92a867474 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Thu, 10 Apr 2025 11:27:08 -0700 Subject: [PATCH 080/149] feat: adding a web-server --- src/bin/server.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index d415cb4..ec2d8f8 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -10,7 +10,7 @@ use std::sync::Arc; use actix_web::{web, App, HttpServer, Responder}; extern crate actix_web; -mod webutils; +use crate::webutils; use webutils::{index, indexPost}; // Structure to hold user data From 8a6e88033f69b853b915e68a64c2fa9d27842d5b Mon Sep 17 00:00:00 2001 From: rsouvik Date: Thu, 10 Apr 2025 11:33:52 -0700 Subject: [PATCH 081/149] feat: adding a web-server --- src/bin/server.rs | 2 +- src/lib.rs | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index ec2d8f8..d415cb4 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -10,7 +10,7 @@ use std::sync::Arc; use actix_web::{web, App, HttpServer, Responder}; extern crate actix_web; -use crate::webutils; +mod webutils; use webutils::{index, indexPost}; // Structure to hold user data diff --git a/src/lib.rs b/src/lib.rs index 2cd3916..40f0b8a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,6 +4,7 @@ use std::env; pub mod models; pub mod schema; +pub mod webutils; pub fn establish_connection() -> PgConnection { dotenv().ok(); From 53c618613a9b6b7619040fe42c341b57244bf9bc Mon Sep 17 00:00:00 2001 From: rsouvik Date: Thu, 10 Apr 2025 12:26:13 -0700 Subject: [PATCH 082/149] feat: adding a web-server --- src/webutils.rs | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/webutils.rs b/src/webutils.rs index f3a8000..66c756d 100644 --- a/src/webutils.rs +++ b/src/webutils.rs @@ -2,22 +2,20 @@ use actix_web::{web, Responder, HttpResponse}; use crate::SwarmWebMessage; use tokio::{sync::mpsc}; - //get handler pub(crate) async fn index(query: web::Query) -> impl Responder { let name = &query.user_name; + HttpResponse::Ok().body(format!("Data sent to libp2p swarm: {}", name)) - - - let sender_clone = sender.get_ref().clone(); + //let sender_clone = sender.get_ref().clone(); // Send the query parameter data to the libp2p swarm through the sender channel - if sender_clone.send(SwarmWebMessage::DataGet(name.to_owned())).await.is_ok() { + /*if sender_clone.send(SwarmWebMessage::DataGet(name.to_owned())).await.is_ok() { HttpResponse::Ok().body(format!("Data sent to libp2p swarm: {}", name)) } else { HttpResponse::InternalServerError().body("Failed to send data to libp2p swarm") - } + }*/ } pub(crate) async fn indexPost(query: web::Json) -> impl Responder { @@ -28,7 +26,8 @@ pub(crate) async fn indexPost(query: web::Json) -> impl Responder { let model_algo = &query.malgo; let model_output_loc = &query.moutputloc;*/ - let sender_clone = sender.get_ref().clone(); + HttpResponse::Ok().body("Data sent to libp2p swarm") + //let sender_clone = sender.get_ref().clone(); /*let metadata = serde_json::json!( { @@ -52,11 +51,11 @@ pub(crate) async fn indexPost(query: web::Json) -> impl Responder { // Send the query parameter data to the libp2p swarm through the sender channel //if sender_clone.send(SwarmWebMessage::Data(model_loc.to_owned())).await.is_ok() { - if sender_clone.send(SwarmWebMessage::Data(query)).await.is_ok() { + /*if sender_clone.send(SwarmWebMessage::Data(query)).await.is_ok() { //HttpResponse::Ok().body(format!("Data sent to libp2p swarm: {}", model_loc)) HttpResponse::Ok().body("Data sent to libp2p swarm") } else { HttpResponse::InternalServerError().body("Failed to send data to libp2p swarm") - } + }*/ } From f211e184352ebee5f105d78d4eba670f8bcd29ac Mon Sep 17 00:00:00 2001 From: rsouvik Date: Thu, 10 Apr 2025 12:34:10 -0700 Subject: [PATCH 083/149] feat: adding a web-server --- src/webutils.rs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/webutils.rs b/src/webutils.rs index 66c756d..a0f4831 100644 --- a/src/webutils.rs +++ b/src/webutils.rs @@ -1,7 +1,12 @@ use actix_web::{web, Responder, HttpResponse}; -use crate::SwarmWebMessage; +//use crate::SwarmWebMessage; use tokio::{sync::mpsc}; +#[derive(Deserialize)] +struct MyQueryParams { + user_name: String, +} + //get handler pub(crate) async fn index(query: web::Query) -> impl Responder { let name = &query.user_name; @@ -18,7 +23,7 @@ pub(crate) async fn index(query: web::Query) -> impl Responder { }*/ } -pub(crate) async fn indexPost(query: web::Json) -> impl Responder { +pub(crate) async fn indexPost(query: web::Json) -> impl Responder { /*let model_type = &query.mtype; let model_loc = &query.mlocation; From 931d344b780083253eac7e4104821e0900636f46 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Thu, 10 Apr 2025 12:36:05 -0700 Subject: [PATCH 084/149] feat: adding a web-server --- Cargo.toml | 4 +++- src/webutils.rs | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 89c05b6..f995be0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -23,4 +23,6 @@ structopt = { version = "0.3", default-features = false } futures = "0.3.30" diesel = { version = "2.2.8", features = ["postgres", "mysql"] } dotenvy = "0.15.7" -actix-web = "4.5.1" \ No newline at end of file +actix-web = "4.5.1" +serde = {version = "1.0.27", features = ["derive"] } +serde_json = "1.0.9" \ No newline at end of file diff --git a/src/webutils.rs b/src/webutils.rs index a0f4831..6f6cee8 100644 --- a/src/webutils.rs +++ b/src/webutils.rs @@ -1,6 +1,7 @@ use actix_web::{web, Responder, HttpResponse}; //use crate::SwarmWebMessage; use tokio::{sync::mpsc}; +use serde::{Serialize, Deserialize}; #[derive(Deserialize)] struct MyQueryParams { From 519b973d01e15566d59fa2932819fe474657a3b4 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Thu, 10 Apr 2025 12:38:35 -0700 Subject: [PATCH 085/149] feat: adding a web-server --- src/bin/server.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index d415cb4..141ba17 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -10,7 +10,7 @@ use std::sync::Arc; use actix_web::{web, App, HttpServer, Responder}; extern crate actix_web; -mod webutils; +//mod webutils; use webutils::{index, indexPost}; // Structure to hold user data From 86f6c255848a5f01a7bba5558641f73da4f4bf71 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Thu, 10 Apr 2025 12:39:40 -0700 Subject: [PATCH 086/149] feat: adding a web-server --- src/bin/server.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index 141ba17..fbc5b8d 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -11,7 +11,7 @@ use actix_web::{web, App, HttpServer, Responder}; extern crate actix_web; //mod webutils; -use webutils::{index, indexPost}; +use chat_app::webutils::{index, indexPost}; // Structure to hold user data struct User { From 7f792479ffcad487811f59d42abb93946f2cfbd9 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Thu, 10 Apr 2025 13:01:09 -0700 Subject: [PATCH 087/149] feat: adding a web-server --- src/bin/server.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index fbc5b8d..2a777c3 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -10,7 +10,7 @@ use std::sync::Arc; use actix_web::{web, App, HttpServer, Responder}; extern crate actix_web; -//mod webutils; +mod webutils; use chat_app::webutils::{index, indexPost}; // Structure to hold user data From 837526a51b0edbd74779926008627f00c1a5a171 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Thu, 10 Apr 2025 13:02:50 -0700 Subject: [PATCH 088/149] feat: adding a web-server --- src/bin/server.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index 2a777c3..aa65c5b 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -10,8 +10,8 @@ use std::sync::Arc; use actix_web::{web, App, HttpServer, Responder}; extern crate actix_web; -mod webutils; -use chat_app::webutils::{index, indexPost}; +//mod webutils; +use crate::webutils::{index, indexPost}; // Structure to hold user data struct User { From 963903f8ebeb8184d010523c452df80de1b1d887 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Thu, 10 Apr 2025 13:03:39 -0700 Subject: [PATCH 089/149] feat: adding a web-server --- src/bin/server.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index aa65c5b..5f466fb 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -11,7 +11,7 @@ use actix_web::{web, App, HttpServer, Responder}; extern crate actix_web; //mod webutils; -use crate::webutils::{index, indexPost}; +use crate::chat_app::webutils::{index, indexPost}; // Structure to hold user data struct User { From 4e893865b17a49166e456bb845de718e7624e5f9 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Thu, 10 Apr 2025 13:04:14 -0700 Subject: [PATCH 090/149] feat: adding a web-server --- src/bin/server.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index 5f466fb..4aaba3c 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -11,7 +11,7 @@ use actix_web::{web, App, HttpServer, Responder}; extern crate actix_web; //mod webutils; -use crate::chat_app::webutils::{index, indexPost}; +use crate::chat-app::webutils::{index, indexPost}; // Structure to hold user data struct User { From 69928c0d686c46f0fc7d976680c8e03db5e6e2fa Mon Sep 17 00:00:00 2001 From: rsouvik Date: Thu, 10 Apr 2025 13:18:23 -0700 Subject: [PATCH 091/149] feat: adding a web-server --- .idea/.gitignore | 2 + .idea/codeStyles/codeStyleConfig.xml | 5 +++ .idea/dictionaries/rsouvik.xml | 7 +++ .idea/misc.xml | 6 +++ .idea/modules.xml | 8 ++++ .idea/simple-chat.iml | 9 ++++ .idea/vcs.xml | 6 +++ src/bin/server.rs | 4 +- src/webutils/mod.rs | 67 ++++++++++++++++++++++++++++ 9 files changed, 112 insertions(+), 2 deletions(-) create mode 100644 .idea/.gitignore create mode 100644 .idea/codeStyles/codeStyleConfig.xml create mode 100644 .idea/dictionaries/rsouvik.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/simple-chat.iml create mode 100644 .idea/vcs.xml create mode 100644 src/webutils/mod.rs diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..5c98b42 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,2 @@ +# Default ignored files +/workspace.xml \ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 0000000..a55e7a1 --- /dev/null +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.idea/dictionaries/rsouvik.xml b/.idea/dictionaries/rsouvik.xml new file mode 100644 index 0000000..006c293 --- /dev/null +++ b/.idea/dictionaries/rsouvik.xml @@ -0,0 +1,7 @@ + + + + webutils + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..28a804d --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..ecb10da --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/simple-chat.iml b/.idea/simple-chat.iml new file mode 100644 index 0000000..d6ebd48 --- /dev/null +++ b/.idea/simple-chat.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/bin/server.rs b/src/bin/server.rs index 4aaba3c..d415cb4 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -10,8 +10,8 @@ use std::sync::Arc; use actix_web::{web, App, HttpServer, Responder}; extern crate actix_web; -//mod webutils; -use crate::chat-app::webutils::{index, indexPost}; +mod webutils; +use webutils::{index, indexPost}; // Structure to hold user data struct User { diff --git a/src/webutils/mod.rs b/src/webutils/mod.rs new file mode 100644 index 0000000..4bd87c7 --- /dev/null +++ b/src/webutils/mod.rs @@ -0,0 +1,67 @@ +use actix_web::{web, Responder, HttpResponse}; +//use crate::SwarmWebMessage; +use tokio::{sync::mpsc}; +use serde::{Serialize, Deserialize}; + +#[derive(Deserialize)] +struct MyQueryParams { + user_name: String, +} + +//get handler +pub(crate) async fn index(query: web::Query) -> impl Responder { + let name = &query.user_name; + + HttpResponse::Ok().body(format!("Data sent to libp2p swarm: {}", name)) + + //let sender_clone = sender.get_ref().clone(); + + // Send the query parameter data to the libp2p swarm through the sender channel + /*if sender_clone.send(SwarmWebMessage::DataGet(name.to_owned())).await.is_ok() { + HttpResponse::Ok().body(format!("Data sent to libp2p swarm: {}", name)) + } else { + HttpResponse::InternalServerError().body("Failed to send data to libp2p swarm") + }*/ +} + +pub(crate) async fn indexPost(query: web::Json) -> impl Responder { + + /*let model_type = &query.mtype; + let model_loc = &query.mlocation; + let model_data_loc = &query.mdataloc; + let model_algo = &query.malgo; + let model_output_loc = &query.moutputloc;*/ + + HttpResponse::Ok().body("Data sent to libp2p swarm") + //let sender_clone = sender.get_ref().clone(); + + /*let metadata = serde_json::json!( + { + "mtype": model_type, + "mlocation": model_loc, //e.g. s3://picxelate/dgp/create_model.py + "mdataloc": model_data_loc, + "malgo": model_algo, + "moutputloc": model_output_loc, + } + );*/ + //e.g. s3://picxelate/dgp/create_model.py + /*let metadata = r#"{ + "mtype": model_type, + "mlocation": model_loc, + "mdataloc": model_data_loc, + "malgo": model_algo, + "moutputloc": model_output_loc, + }"#;*/ + + //do metadata check about known peers + + // Send the query parameter data to the libp2p swarm through the sender channel + //if sender_clone.send(SwarmWebMessage::Data(model_loc.to_owned())).await.is_ok() { + /*if sender_clone.send(SwarmWebMessage::Data(query)).await.is_ok() { + //HttpResponse::Ok().body(format!("Data sent to libp2p swarm: {}", model_loc)) + HttpResponse::Ok().body("Data sent to libp2p swarm") + + } else { + HttpResponse::InternalServerError().body("Failed to send data to libp2p swarm") + }*/ +} \ No newline at end of file From 3f1d832750a655d04888b04ca6e5364b4e20a6bb Mon Sep 17 00:00:00 2001 From: rsouvik Date: Thu, 10 Apr 2025 13:48:43 -0700 Subject: [PATCH 092/149] feat: adding a web-server --- src/bin/server.rs | 4 +++- src/{ => webutils}/webutils.rs | 0 2 files changed, 3 insertions(+), 1 deletion(-) rename src/{ => webutils}/webutils.rs (100%) diff --git a/src/bin/server.rs b/src/bin/server.rs index d415cb4..7175081 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -1,3 +1,6 @@ + +mod webutils; + use futures_util::sink::SinkExt; use futures_util::stream::StreamExt; use std::collections::HashMap; @@ -10,7 +13,6 @@ use std::sync::Arc; use actix_web::{web, App, HttpServer, Responder}; extern crate actix_web; -mod webutils; use webutils::{index, indexPost}; // Structure to hold user data diff --git a/src/webutils.rs b/src/webutils/webutils.rs similarity index 100% rename from src/webutils.rs rename to src/webutils/webutils.rs From 69386552c1bdaf70c60411abaaa9dc3edf4ce25e Mon Sep 17 00:00:00 2001 From: rsouvik Date: Thu, 10 Apr 2025 13:49:36 -0700 Subject: [PATCH 093/149] feat: adding a web-server --- src/bin/server.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index 7175081..003226e 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -1,6 +1,4 @@ -mod webutils; - use futures_util::sink::SinkExt; use futures_util::stream::StreamExt; use std::collections::HashMap; From c5c7c974b3579c950ebce88e6b0d746a70f0a930 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Thu, 10 Apr 2025 13:50:15 -0700 Subject: [PATCH 094/149] feat: adding a web-server --- src/bin/server.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index 003226e..01c2e79 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -11,7 +11,7 @@ use std::sync::Arc; use actix_web::{web, App, HttpServer, Responder}; extern crate actix_web; -use webutils::{index, indexPost}; +use chat_app::webutils::{index, indexPost}; // Structure to hold user data struct User { From 3348d139c8cebb17360a6683087421b28bc82926 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Thu, 10 Apr 2025 13:53:56 -0700 Subject: [PATCH 095/149] feat: adding a web-server --- src/bin/server.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index 01c2e79..2c9c13c 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -11,7 +11,7 @@ use std::sync::Arc; use actix_web::{web, App, HttpServer, Responder}; extern crate actix_web; -use chat_app::webutils::{index, indexPost}; +use crate::webutils::{index, indexPost}; // Structure to hold user data struct User { From 07baf248932abeb631d227ac9376dfdae2d67904 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Thu, 10 Apr 2025 13:56:22 -0700 Subject: [PATCH 096/149] feat: adding a web-server --- src/bin/server.rs | 3 +- src/{webutils => bin}/webutils.rs | 0 src/webutils/mod.rs | 67 ------------------------------- 3 files changed, 2 insertions(+), 68 deletions(-) rename src/{webutils => bin}/webutils.rs (100%) delete mode 100644 src/webutils/mod.rs diff --git a/src/bin/server.rs b/src/bin/server.rs index 2c9c13c..e2c17c1 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -11,7 +11,8 @@ use std::sync::Arc; use actix_web::{web, App, HttpServer, Responder}; extern crate actix_web; -use crate::webutils::{index, indexPost}; +mod webutils; +use webutils::{index, indexPost}; // Structure to hold user data struct User { diff --git a/src/webutils/webutils.rs b/src/bin/webutils.rs similarity index 100% rename from src/webutils/webutils.rs rename to src/bin/webutils.rs diff --git a/src/webutils/mod.rs b/src/webutils/mod.rs deleted file mode 100644 index 4bd87c7..0000000 --- a/src/webutils/mod.rs +++ /dev/null @@ -1,67 +0,0 @@ -use actix_web::{web, Responder, HttpResponse}; -//use crate::SwarmWebMessage; -use tokio::{sync::mpsc}; -use serde::{Serialize, Deserialize}; - -#[derive(Deserialize)] -struct MyQueryParams { - user_name: String, -} - -//get handler -pub(crate) async fn index(query: web::Query) -> impl Responder { - let name = &query.user_name; - - HttpResponse::Ok().body(format!("Data sent to libp2p swarm: {}", name)) - - //let sender_clone = sender.get_ref().clone(); - - // Send the query parameter data to the libp2p swarm through the sender channel - /*if sender_clone.send(SwarmWebMessage::DataGet(name.to_owned())).await.is_ok() { - HttpResponse::Ok().body(format!("Data sent to libp2p swarm: {}", name)) - } else { - HttpResponse::InternalServerError().body("Failed to send data to libp2p swarm") - }*/ -} - -pub(crate) async fn indexPost(query: web::Json) -> impl Responder { - - /*let model_type = &query.mtype; - let model_loc = &query.mlocation; - let model_data_loc = &query.mdataloc; - let model_algo = &query.malgo; - let model_output_loc = &query.moutputloc;*/ - - HttpResponse::Ok().body("Data sent to libp2p swarm") - //let sender_clone = sender.get_ref().clone(); - - /*let metadata = serde_json::json!( - { - "mtype": model_type, - "mlocation": model_loc, //e.g. s3://picxelate/dgp/create_model.py - "mdataloc": model_data_loc, - "malgo": model_algo, - "moutputloc": model_output_loc, - } - );*/ - //e.g. s3://picxelate/dgp/create_model.py - /*let metadata = r#"{ - "mtype": model_type, - "mlocation": model_loc, - "mdataloc": model_data_loc, - "malgo": model_algo, - "moutputloc": model_output_loc, - }"#;*/ - - //do metadata check about known peers - - // Send the query parameter data to the libp2p swarm through the sender channel - //if sender_clone.send(SwarmWebMessage::Data(model_loc.to_owned())).await.is_ok() { - /*if sender_clone.send(SwarmWebMessage::Data(query)).await.is_ok() { - //HttpResponse::Ok().body(format!("Data sent to libp2p swarm: {}", model_loc)) - HttpResponse::Ok().body("Data sent to libp2p swarm") - - } else { - HttpResponse::InternalServerError().body("Failed to send data to libp2p swarm") - }*/ -} \ No newline at end of file From 4f59adc3858d55d1ca024ed26863a3249128037a Mon Sep 17 00:00:00 2001 From: rsouvik Date: Thu, 10 Apr 2025 13:57:18 -0700 Subject: [PATCH 097/149] feat: adding a web-server --- src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index 40f0b8a..ed9e5e5 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,7 +4,7 @@ use std::env; pub mod models; pub mod schema; -pub mod webutils; +//pub mod webutils; pub fn establish_connection() -> PgConnection { dotenv().ok(); From f13c4903c8b4333177c31f75ae1a6b410c87f0d5 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Thu, 10 Apr 2025 14:04:58 -0700 Subject: [PATCH 098/149] feat: adding a web-server --- src/bin/server.rs | 2 +- src/lib.rs | 2 +- src/{bin/webutils.rs => webutils/mod.rs} | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename src/{bin/webutils.rs => webutils/mod.rs} (100%) diff --git a/src/bin/server.rs b/src/bin/server.rs index e2c17c1..326ad3e 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -11,7 +11,7 @@ use std::sync::Arc; use actix_web::{web, App, HttpServer, Responder}; extern crate actix_web; -mod webutils; +extern crate webutils; use webutils::{index, indexPost}; // Structure to hold user data diff --git a/src/lib.rs b/src/lib.rs index ed9e5e5..40f0b8a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,7 +4,7 @@ use std::env; pub mod models; pub mod schema; -//pub mod webutils; +pub mod webutils; pub fn establish_connection() -> PgConnection { dotenv().ok(); diff --git a/src/bin/webutils.rs b/src/webutils/mod.rs similarity index 100% rename from src/bin/webutils.rs rename to src/webutils/mod.rs From 3c16ba7c77deb8f9664c1aa9f0053115dea46ef8 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Thu, 10 Apr 2025 14:09:11 -0700 Subject: [PATCH 099/149] feat: adding a web-server --- src/bin/server.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index 326ad3e..e2c17c1 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -11,7 +11,7 @@ use std::sync::Arc; use actix_web::{web, App, HttpServer, Responder}; extern crate actix_web; -extern crate webutils; +mod webutils; use webutils::{index, indexPost}; // Structure to hold user data From 5bee3bd8732ef18afa631e5ff736b1b167199f1f Mon Sep 17 00:00:00 2001 From: rsouvik Date: Thu, 10 Apr 2025 14:10:04 -0700 Subject: [PATCH 100/149] feat: adding a web-server --- src/bin/server.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index e2c17c1..649a9ee 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -11,8 +11,8 @@ use std::sync::Arc; use actix_web::{web, App, HttpServer, Responder}; extern crate actix_web; -mod webutils; -use webutils::{index, indexPost}; +//mod webutils; +use crate::webutils::{index, indexPost}; // Structure to hold user data struct User { From 9820204d198567a4f0869ffadea1eeeb6b223906 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Thu, 10 Apr 2025 14:17:29 -0700 Subject: [PATCH 101/149] feat: adding a web-server --- src/bin/server.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index 649a9ee..e8a3f12 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -12,7 +12,7 @@ use actix_web::{web, App, HttpServer, Responder}; extern crate actix_web; //mod webutils; -use crate::webutils::{index, indexPost}; +use crate::chat_app::webutils::{index, indexPost}; // Structure to hold user data struct User { From b087e4bd7155f405d32d1dcec8888951be6f810c Mon Sep 17 00:00:00 2001 From: rsouvik Date: Thu, 10 Apr 2025 14:25:08 -0700 Subject: [PATCH 102/149] feat: adding a web-server --- src/bin/server.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index e8a3f12..b3901a1 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -12,7 +12,8 @@ use actix_web::{web, App, HttpServer, Responder}; extern crate actix_web; //mod webutils; -use crate::chat_app::webutils::{index, indexPost}; +//use crate::webutils::{index, indexPost}; +use simple_chat::*; // Structure to hold user data struct User { From e443f37d1f26111f23b2e5f82395813861f3f128 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Thu, 10 Apr 2025 14:26:04 -0700 Subject: [PATCH 103/149] feat: adding a web-server --- src/bin/server.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index b3901a1..6827b5d 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -13,7 +13,7 @@ extern crate actix_web; //mod webutils; //use crate::webutils::{index, indexPost}; -use simple_chat::*; +use chat_app::*; // Structure to hold user data struct User { From a49a0421237be5c2a54be73c9d6f5f471eafa337 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Thu, 10 Apr 2025 14:56:53 -0700 Subject: [PATCH 104/149] feat: adding a web-server --- Cargo.toml | 2 +- src/bin/server.rs | 3 +-- src/{webutils/mod.rs => webutils.rs} | 0 3 files changed, 2 insertions(+), 3 deletions(-) rename src/{webutils/mod.rs => webutils.rs} (100%) diff --git a/Cargo.toml b/Cargo.toml index f995be0..693f8ff 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "chat-app" +name = "chat_app" version = "0.1.0" edition = "2021" diff --git a/src/bin/server.rs b/src/bin/server.rs index 6827b5d..ef0a3eb 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -12,8 +12,7 @@ use actix_web::{web, App, HttpServer, Responder}; extern crate actix_web; //mod webutils; -//use crate::webutils::{index, indexPost}; -use chat_app::*; +use chat_app::webutils::{index, indexPost}; // Structure to hold user data struct User { diff --git a/src/webutils/mod.rs b/src/webutils.rs similarity index 100% rename from src/webutils/mod.rs rename to src/webutils.rs From 2e87c0116cf5045f0ea1f4e2a098b72e497079d1 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Thu, 10 Apr 2025 15:07:02 -0700 Subject: [PATCH 105/149] feat: adding a web-server --- src/webutils.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/webutils.rs b/src/webutils.rs index 6f6cee8..eb21a60 100644 --- a/src/webutils.rs +++ b/src/webutils.rs @@ -9,7 +9,7 @@ struct MyQueryParams { } //get handler -pub(crate) async fn index(query: web::Query) -> impl Responder { +pub(super) async fn index(query: web::Query) -> impl Responder { let name = &query.user_name; HttpResponse::Ok().body(format!("Data sent to libp2p swarm: {}", name)) From 4e85868e40f8a51583c566b850453cfda1cc5c60 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Thu, 10 Apr 2025 15:10:15 -0700 Subject: [PATCH 106/149] feat: adding a web-server --- src/lib.rs | 6 +++--- src/webutils.rs | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 40f0b8a..1249097 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2,9 +2,9 @@ use diesel::prelude::*; use dotenvy::dotenv; use std::env; -pub mod models; -pub mod schema; -pub mod webutils; +pub(crate) mod models; +pub(crate) mod schema; +pub(crate) mod webutils; pub fn establish_connection() -> PgConnection { dotenv().ok(); diff --git a/src/webutils.rs b/src/webutils.rs index eb21a60..6f6cee8 100644 --- a/src/webutils.rs +++ b/src/webutils.rs @@ -9,7 +9,7 @@ struct MyQueryParams { } //get handler -pub(super) async fn index(query: web::Query) -> impl Responder { +pub(crate) async fn index(query: web::Query) -> impl Responder { let name = &query.user_name; HttpResponse::Ok().body(format!("Data sent to libp2p swarm: {}", name)) From 65448d59b691004990cec96d0dae77b2d664cef8 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Mon, 14 Apr 2025 12:05:32 -0700 Subject: [PATCH 107/149] feat: adding a web-server --- src/webutils.rs | 57 +++++++++++++++++++++++++------------------------ 1 file changed, 29 insertions(+), 28 deletions(-) diff --git a/src/webutils.rs b/src/webutils.rs index 6f6cee8..a18dc0a 100644 --- a/src/webutils.rs +++ b/src/webutils.rs @@ -1,41 +1,41 @@ -use actix_web::{web, Responder, HttpResponse}; -//use crate::SwarmWebMessage; -use tokio::{sync::mpsc}; -use serde::{Serialize, Deserialize}; +pub mod webutils { + use actix_web::{web, Responder, HttpResponse}; + //use crate::SwarmWebMessage; + use tokio::{sync::mpsc}; + use serde::{Serialize, Deserialize}; -#[derive(Deserialize)] -struct MyQueryParams { - user_name: String, -} + #[derive(Deserialize)] + struct MyQueryParams { + user_name: String, + } -//get handler -pub(crate) async fn index(query: web::Query) -> impl Responder { - let name = &query.user_name; + //get handler + pub(crate) async fn index(query: web::Query) -> impl Responder { + let name = &query.user_name; - HttpResponse::Ok().body(format!("Data sent to libp2p swarm: {}", name)) + HttpResponse::Ok().body(format!("Data sent to libp2p swarm: {}", name)) - //let sender_clone = sender.get_ref().clone(); + //let sender_clone = sender.get_ref().clone(); - // Send the query parameter data to the libp2p swarm through the sender channel - /*if sender_clone.send(SwarmWebMessage::DataGet(name.to_owned())).await.is_ok() { + // Send the query parameter data to the libp2p swarm through the sender channel + /*if sender_clone.send(SwarmWebMessage::DataGet(name.to_owned())).await.is_ok() { HttpResponse::Ok().body(format!("Data sent to libp2p swarm: {}", name)) } else { HttpResponse::InternalServerError().body("Failed to send data to libp2p swarm") }*/ -} + } -pub(crate) async fn indexPost(query: web::Json) -> impl Responder { - - /*let model_type = &query.mtype; + pub(crate) async fn indexPost(query: web::Json) -> impl Responder { + /*let model_type = &query.mtype; let model_loc = &query.mlocation; let model_data_loc = &query.mdataloc; let model_algo = &query.malgo; let model_output_loc = &query.moutputloc;*/ - HttpResponse::Ok().body("Data sent to libp2p swarm") - //let sender_clone = sender.get_ref().clone(); + HttpResponse::Ok().body("Data sent to libp2p swarm") + //let sender_clone = sender.get_ref().clone(); - /*let metadata = serde_json::json!( + /*let metadata = serde_json::json!( { "mtype": model_type, "mlocation": model_loc, //e.g. s3://picxelate/dgp/create_model.py @@ -44,8 +44,8 @@ pub(crate) async fn indexPost(query: web::Json) -> impl Responder "moutputloc": model_output_loc, } );*/ - //e.g. s3://picxelate/dgp/create_model.py - /*let metadata = r#"{ + //e.g. s3://picxelate/dgp/create_model.py + /*let metadata = r#"{ "mtype": model_type, "mlocation": model_loc, "mdataloc": model_data_loc, @@ -53,15 +53,16 @@ pub(crate) async fn indexPost(query: web::Json) -> impl Responder "moutputloc": model_output_loc, }"#;*/ - //do metadata check about known peers + //do metadata check about known peers - // Send the query parameter data to the libp2p swarm through the sender channel - //if sender_clone.send(SwarmWebMessage::Data(model_loc.to_owned())).await.is_ok() { - /*if sender_clone.send(SwarmWebMessage::Data(query)).await.is_ok() { + // Send the query parameter data to the libp2p swarm through the sender channel + //if sender_clone.send(SwarmWebMessage::Data(model_loc.to_owned())).await.is_ok() { + /*if sender_clone.send(SwarmWebMessage::Data(query)).await.is_ok() { //HttpResponse::Ok().body(format!("Data sent to libp2p swarm: {}", model_loc)) HttpResponse::Ok().body("Data sent to libp2p swarm") } else { HttpResponse::InternalServerError().body("Failed to send data to libp2p swarm") }*/ + } } From dc7828092ffdbaac020b8b0103b6368e3c24c9db Mon Sep 17 00:00:00 2001 From: rsouvik Date: Mon, 14 Apr 2025 12:06:48 -0700 Subject: [PATCH 108/149] feat: adding a web-server --- src/webutils.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/webutils.rs b/src/webutils.rs index a18dc0a..8427e09 100644 --- a/src/webutils.rs +++ b/src/webutils.rs @@ -1,4 +1,3 @@ -pub mod webutils { use actix_web::{web, Responder, HttpResponse}; //use crate::SwarmWebMessage; use tokio::{sync::mpsc}; @@ -65,4 +64,3 @@ pub mod webutils { HttpResponse::InternalServerError().body("Failed to send data to libp2p swarm") }*/ } -} From 0c3af548f2b3641ef14a40b2a5042ac8ab63eb23 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Mon, 14 Apr 2025 12:11:38 -0700 Subject: [PATCH 109/149] feat: adding a web-server --- src/lib.rs | 2 +- src/webutils.rs | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 1249097..f0b4418 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,7 +4,7 @@ use std::env; pub(crate) mod models; pub(crate) mod schema; -pub(crate) mod webutils; +//pub(crate) mod webutils; pub fn establish_connection() -> PgConnection { dotenv().ok(); diff --git a/src/webutils.rs b/src/webutils.rs index 8427e09..6eb0fef 100644 --- a/src/webutils.rs +++ b/src/webutils.rs @@ -1,3 +1,4 @@ +pub mod webutils { use actix_web::{web, Responder, HttpResponse}; //use crate::SwarmWebMessage; use tokio::{sync::mpsc}; @@ -9,7 +10,7 @@ } //get handler - pub(crate) async fn index(query: web::Query) -> impl Responder { + pub async fn index(query: web::Query) -> impl Responder { let name = &query.user_name; HttpResponse::Ok().body(format!("Data sent to libp2p swarm: {}", name)) @@ -24,7 +25,7 @@ }*/ } - pub(crate) async fn indexPost(query: web::Json) -> impl Responder { + pub async fn indexPost(query: web::Json) -> impl Responder { /*let model_type = &query.mtype; let model_loc = &query.mlocation; let model_data_loc = &query.mdataloc; @@ -64,3 +65,4 @@ HttpResponse::InternalServerError().body("Failed to send data to libp2p swarm") }*/ } +} From f0dc73acca19df327305d51c3553da738b93ab15 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Mon, 14 Apr 2025 12:12:18 -0700 Subject: [PATCH 110/149] feat: adding a web-server --- src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index f0b4418..1249097 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,7 +4,7 @@ use std::env; pub(crate) mod models; pub(crate) mod schema; -//pub(crate) mod webutils; +pub(crate) mod webutils; pub fn establish_connection() -> PgConnection { dotenv().ok(); From 029302100fc3a7b039e0425e95c50b89a52765d9 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Mon, 14 Apr 2025 12:23:22 -0700 Subject: [PATCH 111/149] feat: adding a web-server --- src/lib.rs | 2 +- src/webutils.rs | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 1249097..c8ac58c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,7 +4,7 @@ use std::env; pub(crate) mod models; pub(crate) mod schema; -pub(crate) mod webutils; +pub mod webutils; pub fn establish_connection() -> PgConnection { dotenv().ok(); diff --git a/src/webutils.rs b/src/webutils.rs index 6eb0fef..c823efd 100644 --- a/src/webutils.rs +++ b/src/webutils.rs @@ -1,4 +1,4 @@ -pub mod webutils { + use actix_web::{web, Responder, HttpResponse}; //use crate::SwarmWebMessage; use tokio::{sync::mpsc}; @@ -65,4 +65,3 @@ pub mod webutils { HttpResponse::InternalServerError().body("Failed to send data to libp2p swarm") }*/ } -} From 584448b2d86783800e487d37b9dd42dc04a34ef5 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Mon, 14 Apr 2025 12:24:13 -0700 Subject: [PATCH 112/149] feat: adding a web-server --- src/webutils.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/webutils.rs b/src/webutils.rs index c823efd..6d6ed40 100644 --- a/src/webutils.rs +++ b/src/webutils.rs @@ -5,7 +5,7 @@ use serde::{Serialize, Deserialize}; #[derive(Deserialize)] - struct MyQueryParams { + pub struct MyQueryParams { user_name: String, } From d3cb3fe4b8ba1bc01c76c9516c27fb1bf8b0fccd Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 18 Apr 2025 15:10:37 -0700 Subject: [PATCH 113/149] feat: adding a web-server --- src/bin/server.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index ef0a3eb..ca61e0e 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -24,7 +24,8 @@ struct User { // Structure to hold server state struct ServerState { - users: Mutex> , // map addr to username + users: Mutex> , // map addr to username + //users: Mutex> , // map addr to username bcast_tx: Sender, // broadcast channel for sending messages to all users } @@ -32,7 +33,7 @@ struct ServerState { impl ServerState { async fn broadcast_message(&self, addr: &SocketAddr, message: String) { let users = self.users.lock().await; - if let Some(sname) = users.get(addr).map(|t| &t.0){ + if let Some(sname) = users.get(addr).map(|t| &t.username){ let sender_name = sname; let full_msg = format!("{}: {}", sender_name, message); From b4fe235f58aa10e4ba0ff3311a632c77e5affa2d Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 18 Apr 2025 15:41:57 -0700 Subject: [PATCH 114/149] feat: adding a web-server --- src/bin/server.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index ca61e0e..95822f1 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -15,6 +15,7 @@ extern crate actix_web; use chat_app::webutils::{index, indexPost}; // Structure to hold user data +#[derive(Debug, Serialize, Deserialize, Clone)] struct User { username: String, addr: SocketAddr, @@ -77,7 +78,8 @@ async fn handle_connection( let new_username = text[6..].trim().to_string(); let mut users = state.users.lock().await; - if users.values().any(|name| &name.0 == &new_username) { + //if users.values().any(|name| &name.0 == &new_username) { + if users.values().any(|name| &name.username == &new_username) { ws_stream.send(Message::text("Username already taken.".to_string())).await?; } else { if users.contains_key(&addr) == true { From c6ff34d4de5f5362b1853b9326ac678b94956661 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 18 Apr 2025 16:32:49 -0700 Subject: [PATCH 115/149] feat: adding a web-server --- src/bin/server.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index 95822f1..a8aa01b 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -98,7 +98,8 @@ async fn handle_connection( }*/ if let Some((sname, count)) = users.get(&addr).cloned() { - users.insert(addr, (sname.clone(), count + 1)); + //users.insert(addr, (sname.clone(), count + 1)); + users.insert(addr, User(sname.clone(),count+1)); } /*users.entry(addr). .and_modify(|entry| entry.1+=1) From 1ae1b878e968dbbeb7ee1d4152abeb5fcf564a2a Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 18 Apr 2025 16:55:41 -0700 Subject: [PATCH 116/149] feat: adding a web-server --- src/bin/server.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index a8aa01b..0ebbaf5 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -19,7 +19,7 @@ use chat_app::webutils::{index, indexPost}; struct User { username: String, addr: SocketAddr, - ws_stream: WebSocketStream, // do we need this? + //ws_stream: WebSocketStream, // do we need this? lifetime_cnt: i32, } @@ -99,7 +99,7 @@ async fn handle_connection( if let Some((sname, count)) = users.get(&addr).cloned() { //users.insert(addr, (sname.clone(), count + 1)); - users.insert(addr, User(sname.clone(),count+1)); + users.insert(addr, User(sname.clone(), addr, count+1)); } /*users.entry(addr). .and_modify(|entry| entry.1+=1) @@ -107,7 +107,7 @@ async fn handle_connection( //users.insert(addr, ((users.get(&addr)).as_ref().0,(users.get(&addr)).as_ref().1+1)); } else { - users.insert(addr, (new_username.clone(),0)); + users.insert(addr, User(new_username.clone(),addr,0)); } ws_stream.send(Message::text(format!("Joined as {}", new_username))).await?; state.bcast_tx.send(format!("{} has joined the chat.", new_username))?; From f08e40b6b49b939324ea7f8246a12095fd52f87d Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 18 Apr 2025 17:00:05 -0700 Subject: [PATCH 117/149] feat: adding a web-server --- src/bin/server.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index 0ebbaf5..3952bcc 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -99,7 +99,8 @@ async fn handle_connection( if let Some((sname, count)) = users.get(&addr).cloned() { //users.insert(addr, (sname.clone(), count + 1)); - users.insert(addr, User(sname.clone(), addr, count+1)); + //users.insert(addr, User(sname.clone(), addr, count+1)); + users.insert(addr, User{sname.clone(), addr, count+1}); } /*users.entry(addr). .and_modify(|entry| entry.1+=1) @@ -107,7 +108,7 @@ async fn handle_connection( //users.insert(addr, ((users.get(&addr)).as_ref().0,(users.get(&addr)).as_ref().1+1)); } else { - users.insert(addr, User(new_username.clone(),addr,0)); + users.insert(addr, User{new_username.clone(),addr,0}); } ws_stream.send(Message::text(format!("Joined as {}", new_username))).await?; state.bcast_tx.send(format!("{} has joined the chat.", new_username))?; From 1c6e212a80e98cea4d49725e3765591c08bbbcb7 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 18 Apr 2025 17:02:09 -0700 Subject: [PATCH 118/149] feat: adding a web-server --- src/bin/server.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index 3952bcc..97fd591 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -100,7 +100,7 @@ async fn handle_connection( if let Some((sname, count)) = users.get(&addr).cloned() { //users.insert(addr, (sname.clone(), count + 1)); //users.insert(addr, User(sname.clone(), addr, count+1)); - users.insert(addr, User{sname.clone(), addr, count+1}); + users.insert(addr, User{username: sname.clone(), addr: addr, lifetime_cnt: count+1}); } /*users.entry(addr). .and_modify(|entry| entry.1+=1) @@ -108,7 +108,7 @@ async fn handle_connection( //users.insert(addr, ((users.get(&addr)).as_ref().0,(users.get(&addr)).as_ref().1+1)); } else { - users.insert(addr, User{new_username.clone(),addr,0}); + users.insert(addr, User{username:new_username.clone(), addr: addr, lifetime_cnt: 0}); } ws_stream.send(Message::text(format!("Joined as {}", new_username))).await?; state.bcast_tx.send(format!("{} has joined the chat.", new_username))?; From 2c736f0f194d3e18585a616a1c5da15cc305dd10 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 18 Apr 2025 17:03:52 -0700 Subject: [PATCH 119/149] feat: adding a web-server --- src/bin/server.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/bin/server.rs b/src/bin/server.rs index 97fd591..413d499 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -9,6 +9,7 @@ use tokio::sync::{broadcast::{channel, Sender}, Mutex}; use tokio_websockets::{Message, ServerBuilder, WebSocketStream}; use std::sync::Arc; use actix_web::{web, App, HttpServer, Responder}; +use serde::{Serialize, Deserialize}; extern crate actix_web; //mod webutils; From 9579265fb88eddff62643c1c9c465bc144a26717 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 18 Apr 2025 17:08:28 -0700 Subject: [PATCH 120/149] feat: adding a web-server --- src/bin/server.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index 413d499..140155e 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -98,10 +98,10 @@ async fn handle_connection( } }*/ - if let Some((sname, count)) = users.get(&addr).cloned() { + if let Some(U) = users.get(&addr).cloned(), { //users.insert(addr, (sname.clone(), count + 1)); //users.insert(addr, User(sname.clone(), addr, count+1)); - users.insert(addr, User{username: sname.clone(), addr: addr, lifetime_cnt: count+1}); + users.insert(addr, User{username: U.username, addr: addr, lifetime_cnt: U.lifetime_cnt+1}); } /*users.entry(addr). .and_modify(|entry| entry.1+=1) From 9be41f0794c3249410de8d1d08c3cd7a1cd10772 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Fri, 18 Apr 2025 17:09:12 -0700 Subject: [PATCH 121/149] feat: adding a web-server --- src/bin/server.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index 140155e..fc4df54 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -98,7 +98,7 @@ async fn handle_connection( } }*/ - if let Some(U) = users.get(&addr).cloned(), { + if let Some(U) = users.get(&addr).cloned() { //users.insert(addr, (sname.clone(), count + 1)); //users.insert(addr, User(sname.clone(), addr, count+1)); users.insert(addr, User{username: U.username, addr: addr, lifetime_cnt: U.lifetime_cnt+1}); From 5515bdf6a999bef6272cc5165e01483b0231eab9 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Tue, 29 Apr 2025 20:33:35 -0700 Subject: [PATCH 122/149] feat: adding a web-server --- src/bin/server.rs | 2 +- src/webutils.rs | 117 ++++++++++++++++++++++++---------------------- 2 files changed, 63 insertions(+), 56 deletions(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index fc4df54..4bce86e 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -160,7 +160,7 @@ async fn main() -> Result<(), Box> { let server = HttpServer::new(move || { App::new() //.app_data(received_data.clone()) - //.app_data(web::Data::new(web_sender.clone())) + .app_data(web::Data::new(state.users.clone())) //.app_data(swarm_controller.clone()) //.route("/", web::post().to(receive_data)) .route("/statsuser", web::get().to(index)) diff --git a/src/webutils.rs b/src/webutils.rs index 6d6ed40..4ad8300 100644 --- a/src/webutils.rs +++ b/src/webutils.rs @@ -1,67 +1,74 @@ - use actix_web::{web, Responder, HttpResponse}; - //use crate::SwarmWebMessage; - use tokio::{sync::mpsc}; - use serde::{Serialize, Deserialize}; +use std::collections::HashMap; +use std::net::SocketAddr; +use actix_web::{web, Responder, HttpResponse}; +//use crate::SwarmWebMessage; +use tokio::{sync::mpsc}; +use serde::{Serialize, Deserialize}; - #[derive(Deserialize)] - pub struct MyQueryParams { - user_name: String, - } +#[derive(Deserialize)] +pub struct MyQueryParams { + user_name: String, +} - //get handler - pub async fn index(query: web::Query) -> impl Responder { - let name = &query.user_name; +//get handler +pub async fn statsall(query: web::Query, users: HashMap) -> impl Responder { + HttpResponse::Ok().body(format!("Data sent to libp2p swarm: {}", name)) +} - HttpResponse::Ok().body(format!("Data sent to libp2p swarm: {}", name)) +//get handler +pub async fn index(query: web::Query) -> impl Responder { + let name = &query.user_name; - //let sender_clone = sender.get_ref().clone(); + HttpResponse::Ok().body(format!("Data sent to libp2p swarm: {}", name)) - // Send the query parameter data to the libp2p swarm through the sender channel - /*if sender_clone.send(SwarmWebMessage::DataGet(name.to_owned())).await.is_ok() { - HttpResponse::Ok().body(format!("Data sent to libp2p swarm: {}", name)) - } else { - HttpResponse::InternalServerError().body("Failed to send data to libp2p swarm") - }*/ - } + //let sender_clone = sender.get_ref().clone(); - pub async fn indexPost(query: web::Json) -> impl Responder { - /*let model_type = &query.mtype; - let model_loc = &query.mlocation; - let model_data_loc = &query.mdataloc; - let model_algo = &query.malgo; - let model_output_loc = &query.moutputloc;*/ + // Send the query parameter data to the libp2p swarm through the sender channel + /*if sender_clone.send(SwarmWebMessage::DataGet(name.to_owned())).await.is_ok() { + HttpResponse::Ok().body(format!("Data sent to libp2p swarm: {}", name)) +} else { + HttpResponse::InternalServerError().body("Failed to send data to libp2p swarm") +}*/ +} - HttpResponse::Ok().body("Data sent to libp2p swarm") - //let sender_clone = sender.get_ref().clone(); +pub async fn indexPost(query: web::Json) -> impl Responder { + /*let model_type = &query.mtype; +let model_loc = &query.mlocation; +let model_data_loc = &query.mdataloc; +let model_algo = &query.malgo; +let model_output_loc = &query.moutputloc;*/ - /*let metadata = serde_json::json!( - { - "mtype": model_type, - "mlocation": model_loc, //e.g. s3://picxelate/dgp/create_model.py - "mdataloc": model_data_loc, - "malgo": model_algo, - "moutputloc": model_output_loc, - } - );*/ - //e.g. s3://picxelate/dgp/create_model.py - /*let metadata = r#"{ - "mtype": model_type, - "mlocation": model_loc, - "mdataloc": model_data_loc, - "malgo": model_algo, - "moutputloc": model_output_loc, - }"#;*/ + HttpResponse::Ok().body("Data sent to libp2p swarm") + //let sender_clone = sender.get_ref().clone(); - //do metadata check about known peers + /*let metadata = serde_json::json!( + { + "mtype": model_type, + "mlocation": model_loc, //e.g. s3://picxelate/dgp/create_model.py + "mdataloc": model_data_loc, + "malgo": model_algo, + "moutputloc": model_output_loc, + } + );*/ + //e.g. s3://picxelate/dgp/create_model.py + /*let metadata = r#"{ + "mtype": model_type, + "mlocation": model_loc, + "mdataloc": model_data_loc, + "malgo": model_algo, + "moutputloc": model_output_loc, + }"#;*/ - // Send the query parameter data to the libp2p swarm through the sender channel - //if sender_clone.send(SwarmWebMessage::Data(model_loc.to_owned())).await.is_ok() { - /*if sender_clone.send(SwarmWebMessage::Data(query)).await.is_ok() { - //HttpResponse::Ok().body(format!("Data sent to libp2p swarm: {}", model_loc)) - HttpResponse::Ok().body("Data sent to libp2p swarm") + //do metadata check about known peers - } else { - HttpResponse::InternalServerError().body("Failed to send data to libp2p swarm") - }*/ - } + // Send the query parameter data to the libp2p swarm through the sender channel + //if sender_clone.send(SwarmWebMessage::Data(model_loc.to_owned())).await.is_ok() { + /*if sender_clone.send(SwarmWebMessage::Data(query)).await.is_ok() { + //HttpResponse::Ok().body(format!("Data sent to libp2p swarm: {}", model_loc)) + HttpResponse::Ok().body("Data sent to libp2p swarm") + +} else { + HttpResponse::InternalServerError().body("Failed to send data to libp2p swarm") +}*/ +} From e6fd381d34c4d63562d359c5613183412f41796d Mon Sep 17 00:00:00 2001 From: rsouvik Date: Wed, 30 Apr 2025 09:07:10 -0700 Subject: [PATCH 123/149] feat: adding a web-server --- src/bin/server.rs | 1 + src/webutils.rs | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index 4bce86e..5a77227 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -13,6 +13,7 @@ use serde::{Serialize, Deserialize}; extern crate actix_web; //mod webutils; + use chat_app::webutils::{index, indexPost}; // Structure to hold user data diff --git a/src/webutils.rs b/src/webutils.rs index 4ad8300..6526161 100644 --- a/src/webutils.rs +++ b/src/webutils.rs @@ -6,13 +6,16 @@ use actix_web::{web, Responder, HttpResponse}; use tokio::{sync::mpsc}; use serde::{Serialize, Deserialize}; +#[path = "../src/bin/server.rs"] +mod server; + #[derive(Deserialize)] pub struct MyQueryParams { user_name: String, } //get handler -pub async fn statsall(query: web::Query, users: HashMap) -> impl Responder { +pub async fn statsall(query: web::Query, users: HashMap) -> impl Responder { HttpResponse::Ok().body(format!("Data sent to libp2p swarm: {}", name)) } From f8899d8b3bab78f6fb3e8e56464bf207c0caebc9 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Wed, 30 Apr 2025 12:07:21 -0700 Subject: [PATCH 124/149] fix: updating utils to include common functions and ds --- src/bin/server.rs | 11 +---------- src/webutils.rs | 15 ++++++++++++--- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index 5a77227..dd5ee39 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -14,16 +14,7 @@ extern crate actix_web; //mod webutils; -use chat_app::webutils::{index, indexPost}; - -// Structure to hold user data -#[derive(Debug, Serialize, Deserialize, Clone)] -struct User { - username: String, - addr: SocketAddr, - //ws_stream: WebSocketStream, // do we need this? - lifetime_cnt: i32, -} +use chat_app::webutils::{index, indexPost, User}; // Structure to hold server state struct ServerState { diff --git a/src/webutils.rs b/src/webutils.rs index 6526161..e849910 100644 --- a/src/webutils.rs +++ b/src/webutils.rs @@ -6,16 +6,25 @@ use actix_web::{web, Responder, HttpResponse}; use tokio::{sync::mpsc}; use serde::{Serialize, Deserialize}; -#[path = "../src/bin/server.rs"] -mod server; +//#[path = "../src/bin/server.rs"] +//mod server; #[derive(Deserialize)] pub struct MyQueryParams { user_name: String, } +// Structure to hold user data +#[derive(Debug, Serialize, Deserialize, Clone)] +struct User { + username: String, + addr: SocketAddr, + //ws_stream: WebSocketStream, // do we need this? + lifetime_cnt: i32, +} + //get handler -pub async fn statsall(query: web::Query, users: HashMap) -> impl Responder { +pub async fn statsall(query: web::Query, users: HashMap) -> impl Responder { HttpResponse::Ok().body(format!("Data sent to libp2p swarm: {}", name)) } From b84dfeeb28a3bc9a80ead6f073b37956fda7ca5f Mon Sep 17 00:00:00 2001 From: rsouvik Date: Wed, 30 Apr 2025 12:13:23 -0700 Subject: [PATCH 125/149] fix: updating utils to include common functions and ds --- src/webutils.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/webutils.rs b/src/webutils.rs index e849910..dce6f7d 100644 --- a/src/webutils.rs +++ b/src/webutils.rs @@ -25,7 +25,7 @@ struct User { //get handler pub async fn statsall(query: web::Query, users: HashMap) -> impl Responder { - HttpResponse::Ok().body(format!("Data sent to libp2p swarm: {}", name)) + HttpResponse::Ok().body(format!("Data sent to libp2p swarm: {}", users.keys().len())) } //get handler From dcfb7bfc433aa5d2100620e312ff87e4fb1d9860 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Wed, 30 Apr 2025 12:14:10 -0700 Subject: [PATCH 126/149] fix: updating utils to include common functions and ds --- src/webutils.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/webutils.rs b/src/webutils.rs index dce6f7d..695f917 100644 --- a/src/webutils.rs +++ b/src/webutils.rs @@ -16,7 +16,7 @@ pub struct MyQueryParams { // Structure to hold user data #[derive(Debug, Serialize, Deserialize, Clone)] -struct User { +pub struct User { username: String, addr: SocketAddr, //ws_stream: WebSocketStream, // do we need this? From e9073105021650e8b7d9d3a3e3f1b1e039e0a1c3 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Wed, 30 Apr 2025 12:16:04 -0700 Subject: [PATCH 127/149] fix: updating utils to include common functions and ds --- src/webutils.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/webutils.rs b/src/webutils.rs index 695f917..14752ae 100644 --- a/src/webutils.rs +++ b/src/webutils.rs @@ -17,10 +17,10 @@ pub struct MyQueryParams { // Structure to hold user data #[derive(Debug, Serialize, Deserialize, Clone)] pub struct User { - username: String, - addr: SocketAddr, + pub username: String, + pub addr: SocketAddr, //ws_stream: WebSocketStream, // do we need this? - lifetime_cnt: i32, + pub lifetime_cnt: i32, } //get handler From bfc82f80aa6f02ea1df676b3cc268fece1be9fec Mon Sep 17 00:00:00 2001 From: rsouvik Date: Wed, 30 Apr 2025 12:20:35 -0700 Subject: [PATCH 128/149] fix: updating utils to include common functions and ds --- src/bin/server.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/bin/server.rs b/src/bin/server.rs index dd5ee39..b2f1f46 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -17,6 +17,7 @@ extern crate actix_web; use chat_app::webutils::{index, indexPost, User}; // Structure to hold server state +#[derive(Debug, Serialize, Deserialize, Clone)] struct ServerState { users: Mutex> , // map addr to username //users: Mutex> , // map addr to username From 6633454113e5968f8677a537ff3df3fb412c9ee9 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Wed, 30 Apr 2025 12:25:33 -0700 Subject: [PATCH 129/149] fix: updating utils to include common functions and ds --- src/bin/server.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index b2f1f46..2f38e98 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -153,7 +153,7 @@ async fn main() -> Result<(), Box> { let server = HttpServer::new(move || { App::new() //.app_data(received_data.clone()) - .app_data(web::Data::new(state.users.clone())) + .app_data(web::Data::new(state.clone())) //.app_data(swarm_controller.clone()) //.route("/", web::post().to(receive_data)) .route("/statsuser", web::get().to(index)) From 184f580f786fde2c9dbf123802755a6fe49d3d2b Mon Sep 17 00:00:00 2001 From: rsouvik Date: Wed, 30 Apr 2025 13:52:23 -0700 Subject: [PATCH 130/149] fix: updating utils to include common functions and ds --- src/bin/server.rs | 11 ++++++----- src/webutils.rs | 7 +++++-- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index 2f38e98..999ed0a 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -17,11 +17,11 @@ extern crate actix_web; use chat_app::webutils::{index, indexPost, User}; // Structure to hold server state -#[derive(Debug, Serialize, Deserialize, Clone)] -struct ServerState { - users: Mutex> , // map addr to username +#[derive(Debug, Clone)] +pub struct ServerState { + pub users: Mutex> , // map addr to username //users: Mutex> , // map addr to username - bcast_tx: Sender, // broadcast channel for sending messages to all users + pub bcast_tx: Sender, // broadcast channel for sending messages to all users } //Make sure to broadcast to all others except sender @@ -148,12 +148,13 @@ async fn main() -> Result<(), Box> { //web data processing //let (web_sender, mut web_receiver) = mpsc::channel::(100); + let shared_state = web::Data::new(state); //Web server //Start the web server let server = HttpServer::new(move || { App::new() //.app_data(received_data.clone()) - .app_data(web::Data::new(state.clone())) + .app_data(shared_state.clone()) //.app_data(swarm_controller.clone()) //.route("/", web::post().to(receive_data)) .route("/statsuser", web::get().to(index)) diff --git a/src/webutils.rs b/src/webutils.rs index 14752ae..2639af2 100644 --- a/src/webutils.rs +++ b/src/webutils.rs @@ -24,8 +24,11 @@ pub struct User { } //get handler -pub async fn statsall(query: web::Query, users: HashMap) -> impl Responder { - HttpResponse::Ok().body(format!("Data sent to libp2p swarm: {}", users.keys().len())) +pub async fn statsall(query: web::Query, state: web::Data) -> impl Responder { + let users_map = state.users.lock().unwrap(); // be careful with unwrap + let count = users_map.len(); + HttpResponse::Ok().body(format!("Total users: {}", count)) + //HttpResponse::Ok().body(format!("Data sent to libp2p swarm: {}", users.keys().len())) } //get handler From 0274a21732622ca3ccfddc8f127b8ebe2a5a80be Mon Sep 17 00:00:00 2001 From: rsouvik Date: Wed, 30 Apr 2025 13:55:14 -0700 Subject: [PATCH 131/149] fix: updating utils to include common functions and ds --- src/bin/server.rs | 10 +--------- src/webutils.rs | 8 ++++++++ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index 999ed0a..aaeac32 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -14,15 +14,7 @@ extern crate actix_web; //mod webutils; -use chat_app::webutils::{index, indexPost, User}; - -// Structure to hold server state -#[derive(Debug, Clone)] -pub struct ServerState { - pub users: Mutex> , // map addr to username - //users: Mutex> , // map addr to username - pub bcast_tx: Sender, // broadcast channel for sending messages to all users -} +use chat_app::webutils::{index, indexPost, User, ServerState}; //Make sure to broadcast to all others except sender impl ServerState { diff --git a/src/webutils.rs b/src/webutils.rs index 2639af2..c13079a 100644 --- a/src/webutils.rs +++ b/src/webutils.rs @@ -23,6 +23,14 @@ pub struct User { pub lifetime_cnt: i32, } +// Structure to hold server state +#[derive(Debug, Clone)] +pub struct ServerState { + pub users: Mutex> , // map addr to username + //users: Mutex> , // map addr to username + pub bcast_tx: Sender, // broadcast channel for sending messages to all users +} + //get handler pub async fn statsall(query: web::Query, state: web::Data) -> impl Responder { let users_map = state.users.lock().unwrap(); // be careful with unwrap From 97f629d7c031aab87a02aa4cfaf11c917668c953 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Wed, 30 Apr 2025 13:56:08 -0700 Subject: [PATCH 132/149] fix: updating utils to include common functions and ds --- src/webutils.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/webutils.rs b/src/webutils.rs index c13079a..43fb0fd 100644 --- a/src/webutils.rs +++ b/src/webutils.rs @@ -5,6 +5,7 @@ use actix_web::{web, Responder, HttpResponse}; //use crate::SwarmWebMessage; use tokio::{sync::mpsc}; use serde::{Serialize, Deserialize}; +use tokio::sync::{broadcast::{channel, Sender}, Mutex}; //#[path = "../src/bin/server.rs"] //mod server; From c1021655c39316cc8c8f3c4c1c76f90701872362 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Wed, 30 Apr 2025 13:58:46 -0700 Subject: [PATCH 133/149] fix: updating utils to include common functions and ds --- src/webutils.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/webutils.rs b/src/webutils.rs index 43fb0fd..a00cbdb 100644 --- a/src/webutils.rs +++ b/src/webutils.rs @@ -27,14 +27,15 @@ pub struct User { // Structure to hold server state #[derive(Debug, Clone)] pub struct ServerState { - pub users: Mutex> , // map addr to username + pub users: Arc>>, + //pub users: Mutex> , // map addr to username //users: Mutex> , // map addr to username pub bcast_tx: Sender, // broadcast channel for sending messages to all users } //get handler pub async fn statsall(query: web::Query, state: web::Data) -> impl Responder { - let users_map = state.users.lock().unwrap(); // be careful with unwrap + let users_map = state.users.lock().await; // be careful with unwrap let count = users_map.len(); HttpResponse::Ok().body(format!("Total users: {}", count)) //HttpResponse::Ok().body(format!("Data sent to libp2p swarm: {}", users.keys().len())) From a71bc53d6355bb72ff387778c572e48e66c0f29e Mon Sep 17 00:00:00 2001 From: rsouvik Date: Wed, 30 Apr 2025 13:59:30 -0700 Subject: [PATCH 134/149] fix: updating utils to include common functions and ds --- src/webutils.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/webutils.rs b/src/webutils.rs index a00cbdb..816de26 100644 --- a/src/webutils.rs +++ b/src/webutils.rs @@ -6,6 +6,7 @@ use actix_web::{web, Responder, HttpResponse}; use tokio::{sync::mpsc}; use serde::{Serialize, Deserialize}; use tokio::sync::{broadcast::{channel, Sender}, Mutex}; +use std::sync::Arc; //#[path = "../src/bin/server.rs"] //mod server; From 05f92741d8e55a04113d35edc2e7a59826edf1bb Mon Sep 17 00:00:00 2001 From: rsouvik Date: Wed, 30 Apr 2025 14:01:10 -0700 Subject: [PATCH 135/149] fix: updating utils to include common functions and ds --- src/webutils.rs | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/webutils.rs b/src/webutils.rs index 816de26..c2af68a 100644 --- a/src/webutils.rs +++ b/src/webutils.rs @@ -34,6 +34,31 @@ pub struct ServerState { pub bcast_tx: Sender, // broadcast channel for sending messages to all users } +//Make sure to broadcast to all others except sender +impl ServerState { + pub async fn broadcast_message(&self, addr: &SocketAddr, message: String) { + let users = self.users.lock().await; + if let Some(sname) = users.get(addr).map(|t| &t.username){ + let sender_name = sname; + let full_msg = format!("{}: {}", sender_name, message); + + for (user_addr, _) in users.iter() { + if user_addr != addr { + self.bcast_tx.send(full_msg.clone()).unwrap(); + } + } + } + /*let sender_name = users.get(addr).as_ref().0.unwrap(); + let full_msg = format!("{}: {}", sender_name, message); + + for (user_addr, _) in users.iter() { + if user_addr != addr { + self.bcast_tx.send(full_msg.clone()).unwrap(); + } + }*/ + } +} + //get handler pub async fn statsall(query: web::Query, state: web::Data) -> impl Responder { let users_map = state.users.lock().await; // be careful with unwrap From e215c358e8eee94a8d74f425e9199e39f5cd0ca6 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Wed, 30 Apr 2025 14:02:02 -0700 Subject: [PATCH 136/149] fix: updating utils to include common functions and ds --- src/bin/server.rs | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index aaeac32..7fba3f5 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -16,31 +16,6 @@ extern crate actix_web; use chat_app::webutils::{index, indexPost, User, ServerState}; -//Make sure to broadcast to all others except sender -impl ServerState { - async fn broadcast_message(&self, addr: &SocketAddr, message: String) { - let users = self.users.lock().await; - if let Some(sname) = users.get(addr).map(|t| &t.username){ - let sender_name = sname; - let full_msg = format!("{}: {}", sender_name, message); - - for (user_addr, _) in users.iter() { - if user_addr != addr { - self.bcast_tx.send(full_msg.clone()).unwrap(); - } - } - } - /*let sender_name = users.get(addr).as_ref().0.unwrap(); - let full_msg = format!("{}: {}", sender_name, message); - - for (user_addr, _) in users.iter() { - if user_addr != addr { - self.bcast_tx.send(full_msg.clone()).unwrap(); - } - }*/ - } -} - async fn handle_connection( addr: SocketAddr, mut ws_stream: WebSocketStream, From ec117f8ecb9b30dee0107d81f943f1030219f25e Mon Sep 17 00:00:00 2001 From: rsouvik Date: Wed, 30 Apr 2025 14:04:23 -0700 Subject: [PATCH 137/149] fix: updating utils to include common functions and ds --- src/bin/server.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index 7fba3f5..04bcff3 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -108,7 +108,7 @@ async fn handle_connection( async fn main() -> Result<(), Box> { let (bcast_tx, _) = channel(16); let state = Arc::new(ServerState { - users: Mutex::new(HashMap::new()), + users: Arc::Mutex::new(HashMap::new()), bcast_tx: bcast_tx.clone(), }); From 54c01a28b466e7ec67c15a66cdf755c2d02544d8 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Wed, 30 Apr 2025 14:06:22 -0700 Subject: [PATCH 138/149] fix: updating utils to include common functions and ds --- src/bin/server.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index 04bcff3..ef9b20d 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -108,7 +108,7 @@ async fn handle_connection( async fn main() -> Result<(), Box> { let (bcast_tx, _) = channel(16); let state = Arc::new(ServerState { - users: Arc::Mutex::new(HashMap::new()), + users: Arc::new(Mutex::new(HashMap::new())), bcast_tx: bcast_tx.clone(), }); From 8875a045e3103934ec98eb1629f3b62b417f5b7c Mon Sep 17 00:00:00 2001 From: rsouvik Date: Wed, 30 Apr 2025 14:42:05 -0700 Subject: [PATCH 139/149] fix: updating utils to include common functions and ds --- src/bin/server.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index ef9b20d..9cc906e 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -141,7 +141,7 @@ async fn main() -> Result<(), Box> { loop { let (socket, addr) = listener.accept().await?; - let state = state.clone(); + let state = shared_state.clone(); tokio::spawn(async move { let ws_stream = ServerBuilder::new().accept(socket).await?; From f0f122df8ff391d59b7edd25e18630078c0334f9 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Wed, 30 Apr 2025 14:51:45 -0700 Subject: [PATCH 140/149] fix: updating utils to include common functions and ds --- src/bin/server.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index 9cc906e..34f82e4 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -115,7 +115,7 @@ async fn main() -> Result<(), Box> { //web data processing //let (web_sender, mut web_receiver) = mpsc::channel::(100); - let shared_state = web::Data::new(state); + let shared_state = web::Data::new(state.clone()); //Web server //Start the web server let server = HttpServer::new(move || { @@ -141,11 +141,11 @@ async fn main() -> Result<(), Box> { loop { let (socket, addr) = listener.accept().await?; - let state = shared_state.clone(); + let conn_state = state.clone(); tokio::spawn(async move { let ws_stream = ServerBuilder::new().accept(socket).await?; - handle_connection(addr, ws_stream, state.clone()).await + handle_connection(addr, ws_stream, conn_state).await }); } } From e1d2cd4e9b4ef5d084fe66094a8b6a765ed8157b Mon Sep 17 00:00:00 2001 From: rsouvik Date: Wed, 30 Apr 2025 16:55:13 -0700 Subject: [PATCH 141/149] fix: updating utils to include common functions and ds --- src/bin/server.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index 34f82e4..5aa23f4 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -125,7 +125,7 @@ async fn main() -> Result<(), Box> { //.app_data(swarm_controller.clone()) //.route("/", web::post().to(receive_data)) .route("/statsuser", web::get().to(index)) - .route("/statsall", web::get().to(index)) + .route("/statsall", web::get().to(statsall)) .route("/updateuser", web::post().to(indexPost)) }) //.bind("127.0.0.1:8080")? From 2a796c977bf2ef676b3d30648c873c3e4c4ea8b8 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Wed, 30 Apr 2025 16:55:56 -0700 Subject: [PATCH 142/149] fix: updating utils to include common functions and ds --- src/bin/server.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index 5aa23f4..c309eac 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -14,7 +14,7 @@ extern crate actix_web; //mod webutils; -use chat_app::webutils::{index, indexPost, User, ServerState}; +use chat_app::webutils::{statsall, index, indexPost, User, ServerState}; async fn handle_connection( addr: SocketAddr, From 029db51406e76b257b5a9159df2b0c1cde76ec4d Mon Sep 17 00:00:00 2001 From: rsouvik Date: Wed, 30 Apr 2025 17:00:42 -0700 Subject: [PATCH 143/149] fix: updating utils to include common functions and ds --- src/webutils.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/webutils.rs b/src/webutils.rs index c2af68a..402c275 100644 --- a/src/webutils.rs +++ b/src/webutils.rs @@ -61,9 +61,10 @@ impl ServerState { //get handler pub async fn statsall(query: web::Query, state: web::Data) -> impl Responder { - let users_map = state.users.lock().await; // be careful with unwrap + HttpResponse::Ok().body(format!("Total users: ")) + /*let users_map = state.users.lock().await; // be careful with unwrap let count = users_map.len(); - HttpResponse::Ok().body(format!("Total users: {}", count)) + HttpResponse::Ok().body(format!("Total users: {}", count))*/ //HttpResponse::Ok().body(format!("Data sent to libp2p swarm: {}", users.keys().len())) } From 1672e002794d8eb17b2af1eb22845ec934445ef4 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Wed, 30 Apr 2025 17:18:47 -0700 Subject: [PATCH 144/149] fix: updating utils to include common functions and ds --- src/webutils.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/webutils.rs b/src/webutils.rs index 402c275..f6fae1c 100644 --- a/src/webutils.rs +++ b/src/webutils.rs @@ -60,7 +60,7 @@ impl ServerState { } //get handler -pub async fn statsall(query: web::Query, state: web::Data) -> impl Responder { +pub async fn statsall(query: web::Query, state: web::Data>) -> impl Responder { HttpResponse::Ok().body(format!("Total users: ")) /*let users_map = state.users.lock().await; // be careful with unwrap let count = users_map.len(); From 98c30063e7ea1955b93bb910e1fa44a33c83f4ef Mon Sep 17 00:00:00 2001 From: rsouvik Date: Wed, 30 Apr 2025 17:22:35 -0700 Subject: [PATCH 145/149] fix: updating utils to include common functions and ds --- src/webutils.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/webutils.rs b/src/webutils.rs index f6fae1c..b341797 100644 --- a/src/webutils.rs +++ b/src/webutils.rs @@ -61,10 +61,9 @@ impl ServerState { //get handler pub async fn statsall(query: web::Query, state: web::Data>) -> impl Responder { - HttpResponse::Ok().body(format!("Total users: ")) - /*let users_map = state.users.lock().await; // be careful with unwrap + let users_map = state.users.lock().await; // be careful with unwrap let count = users_map.len(); - HttpResponse::Ok().body(format!("Total users: {}", count))*/ + HttpResponse::Ok().body(format!("Total users: {}", count)) //HttpResponse::Ok().body(format!("Data sent to libp2p swarm: {}", users.keys().len())) } From 7cd44ad4032465a56b4e4608f595f7b69e8fb478 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Thu, 1 May 2025 18:56:59 -0700 Subject: [PATCH 146/149] fix: updating utils to include common functions and ds --- src/webutils.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/webutils.rs b/src/webutils.rs index b341797..ade095c 100644 --- a/src/webutils.rs +++ b/src/webutils.rs @@ -63,6 +63,9 @@ impl ServerState { pub async fn statsall(query: web::Query, state: web::Data>) -> impl Responder { let users_map = state.users.lock().await; // be careful with unwrap let count = users_map.len(); + for (sock_add, U) in users_map.into_iter() { + println!("{} / {}", U.username, U.lifetime_cnt); + } HttpResponse::Ok().body(format!("Total users: {}", count)) //HttpResponse::Ok().body(format!("Data sent to libp2p swarm: {}", users.keys().len())) } From b925609a9fdc82e4705590a73893b8194889a92f Mon Sep 17 00:00:00 2001 From: rsouvik Date: Thu, 1 May 2025 19:07:41 -0700 Subject: [PATCH 147/149] fix: updating utils to include common functions and ds --- src/webutils.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/webutils.rs b/src/webutils.rs index ade095c..1ebeefa 100644 --- a/src/webutils.rs +++ b/src/webutils.rs @@ -63,7 +63,8 @@ impl ServerState { pub async fn statsall(query: web::Query, state: web::Data>) -> impl Responder { let users_map = state.users.lock().await; // be careful with unwrap let count = users_map.len(); - for (sock_add, U) in users_map.into_iter() { + let s_users_map = users_map.clone(); + for (sock_add, U) in s_users_map.into_iter() { println!("{} / {}", U.username, U.lifetime_cnt); } HttpResponse::Ok().body(format!("Total users: {}", count)) From 9b9fef5d6406973342d41b25ef60f741793ae149 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Thu, 1 May 2025 19:43:27 -0700 Subject: [PATCH 148/149] fix: updating utils to include common functions and ds --- src/bin/server.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/bin/server.rs b/src/bin/server.rs index c309eac..0c5181a 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -141,6 +141,8 @@ async fn main() -> Result<(), Box> { loop { let (socket, addr) = listener.accept().await?; + println!("socket: {}", socket); + println!("address: {}", addr); let conn_state = state.clone(); tokio::spawn(async move { From d1da3b885580e727cdd168126305f6ddfd3fbaa8 Mon Sep 17 00:00:00 2001 From: rsouvik Date: Thu, 1 May 2025 19:45:33 -0700 Subject: [PATCH 149/149] fix: updating utils to include common functions and ds --- src/bin/server.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/bin/server.rs b/src/bin/server.rs index 0c5181a..f8a6300 100644 --- a/src/bin/server.rs +++ b/src/bin/server.rs @@ -141,8 +141,8 @@ async fn main() -> Result<(), Box> { loop { let (socket, addr) = listener.accept().await?; - println!("socket: {}", socket); - println!("address: {}", addr); + println!("socket: {:?}", socket); + println!("address: {:?}", addr); let conn_state = state.clone(); tokio::spawn(async move {