diff --git a/Cargo.toml b/Cargo.toml index f953a6f..b09552f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,5 +5,6 @@ edition = "2021" [dependencies] wg_2024 = { git = "https://github.com/WGL-2024/WGL_repo_2024.git", features = ["serialize", "debug"] } +crossbeam-channel = "0.5.13" serde = { version = "1.0", features = ["derive"] } bincode = "1.3" \ No newline at end of file diff --git a/src/client_commands.rs b/src/client_commands.rs new file mode 100644 index 0000000..912410b --- /dev/null +++ b/src/client_commands.rs @@ -0,0 +1,17 @@ +use crossbeam_channel::Sender; +use wg_2024::{network::NodeId, packet::Packet}; +#[derive(Debug, Clone)] +pub enum ChatClientCommand { + RemoveSender(NodeId), + AddSender(NodeId, Sender), + // Crash, + SendMessageTo(NodeId, String), //dest_client + RegisterTo(NodeId), //dest_server + GetClientListFrom(NodeId), //dest_server +} +#[derive(Debug, Clone)] +pub enum ChatClientEvent { + MessageReceived(NodeId, String), //source_client + SuccessfulRegistration(NodeId), //dest_server + ClientList(NodeId, Vec), //source_server +} diff --git a/src/high_level_messages.rs b/src/high_level_messages.rs new file mode 100644 index 0000000..79e4a0f --- /dev/null +++ b/src/high_level_messages.rs @@ -0,0 +1,127 @@ +use serde::{Deserialize, Serialize}; +use wg_2024::network::NodeId; + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub enum ClientMessage { + // Web Browser Messages + GetServerType, // server_type? + GetFilesList, // files_list? + GetFile(String), // file?(file_id) + GetMedia(String), // media?(media_id) + + // Chat Messages + RegisterToChat, // registration_to_chat + GetClientList, // client_list? + SendMessage { + // message_for?(client_id, message) + recipient_id: NodeId, + content: String, + }, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub enum ServerMessage { + // Web Browser Responses + ServerType(ServerType), // server_type!(type) + FilesList(Vec), // files_list!(list_of_file_ids) + File { + // file!(file_size, file) + size: usize, + content: String, + }, + Media(Vec), // media!(media) + + // Chat Responses + SuccessfulRegistration, + ClientList(Vec), // client_list!(list_of_client_ids) + MessageReceived { + // message_from!(client_id, message) + sender_id: NodeId, + content: String, + }, + + // Error Messages + ErrorRequestedNotFound, // error_requested_not_found! + ErrorUnsupportedRequest, // error_unsupported_request! + ErrorWrongClientId, // error_wrong_client_id! +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub enum ServerType { + Text, + Media, + Chat, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Message { + pub session_id: u64, + pub source_id: NodeId, + pub destination_id: NodeId, + pub content: MessageContent, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub enum MessageContent { + FromClient(ClientMessage), + FromServer(ServerMessage), +} + +impl Message { + pub fn serialize(&self) -> Result, Box> { + Ok(bincode::serialize(self)?) + } + + pub fn deserialize(bytes: &[u8]) -> Result> { + Ok(bincode::deserialize(bytes)?) + } + + pub fn new_client_message( + session_id: u64, + source_id: NodeId, + destination_id: NodeId, + content: ClientMessage, + ) -> Self { + Self { + session_id, + source_id, + destination_id, + content: MessageContent::FromClient(content), + } + } + + pub fn new_server_message( + session_id: u64, + source_id: NodeId, + destination_id: NodeId, + content: ServerMessage, + ) -> Self { + Self { + session_id, + source_id, + destination_id, + content: MessageContent::FromServer(content), + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_serialization() -> Result<(), Box> { + let message = + Message::new_client_message(1, 2, 3, ClientMessage::GetFile("test.txt".to_string())); + + let serialized = message.serialize()?; + + let deserialized = Message::deserialize(&serialized)?; + + assert_eq!(message.session_id, deserialized.session_id); + assert_eq!(message.source_id, deserialized.source_id); + assert_eq!(message.destination_id, deserialized.destination_id); + + Ok(()) + } +} diff --git a/src/lib.rs b/src/lib.rs index 7d339a2..2c048ec 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,126 +1,2 @@ -use serde::{Deserialize, Serialize}; -use wg_2024::network::NodeId; - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub enum ClientMessage { - // Web Browser Messages - GetServerType, // server_type? - GetFilesList, // files_list? - GetFile(String), // file?(file_id) - GetMedia(String), // media?(media_id) - - // Chat Messages - RegisterToChat, // registration_to_chat - GetClientList, // client_list? - SendMessage { - // message_for?(client_id, message) - recipient_id: NodeId, - content: String, - }, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub enum ServerMessage { - // Web Browser Responses - ServerType(ServerType), // server_type!(type) - FilesList(Vec), // files_list!(list_of_file_ids) - File { - // file!(file_size, file) - size: usize, - content: String, - }, - Media(Vec), // media!(media) - - // Chat Responses - ClientList(Vec), // client_list!(list_of_client_ids) - MessageReceived { - // message_from!(client_id, message) - sender_id: NodeId, - content: String, - }, - - // Error Messages - ErrorRequestedNotFound, // error_requested_not_found! - ErrorUnsupportedRequest, // error_unsupported_request! - ErrorWrongClientId, // error_wrong_client_id! -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub enum ServerType { - TextServer, - MediaServer, - ChatServer, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct Message { - pub session_id: u64, - pub source_id: NodeId, - pub destination_id: NodeId, - pub content: MessageContent, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub enum MessageContent { - FromClient(ClientMessage), - FromServer(ServerMessage), -} - -impl Message { - pub fn serialize(&self) -> Result, Box> { - Ok(bincode::serialize(self)?) - } - - pub fn deserialize(bytes: &[u8]) -> Result> { - Ok(bincode::deserialize(bytes)?) - } - - pub fn new_client_message( - session_id: u64, - source_id: NodeId, - destination_id: NodeId, - content: ClientMessage, - ) -> Self { - Self { - session_id, - source_id, - destination_id, - content: MessageContent::FromClient(content), - } - } - - pub fn new_server_message( - session_id: u64, - source_id: NodeId, - destination_id: NodeId, - content: ServerMessage, - ) -> Self { - Self { - session_id, - source_id, - destination_id, - content: MessageContent::FromServer(content), - } - } -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn test_serialization() -> Result<(), Box> { - let message = - Message::new_client_message(1, 2, 3, ClientMessage::GetFile("test.txt".to_string())); - - let serialized = message.serialize()?; - - let deserialized = Message::deserialize(&serialized)?; - - assert_eq!(message.session_id, deserialized.session_id); - assert_eq!(message.source_id, deserialized.source_id); - assert_eq!(message.destination_id, deserialized.destination_id); - - Ok(()) - } -} +mod client_commands; +mod high_level_messages;