From ae6694bba6c4e1dc8e78fdec2ea62dddd41c5386 Mon Sep 17 00:00:00 2001 From: Franklin Date: Tue, 28 Feb 2023 20:12:37 -0400 Subject: [PATCH] finished chat client (ws part) --- Cargo.lock | 130 +++++++++++++++++++++++++------------ src/callbacks/chat.rs | 7 +- src/client/chat/handler.rs | 3 - src/client/chat/http.rs | 15 +++++ src/client/chat/mod.rs | 6 +- src/lib.rs | 6 +- src/network.udl | 7 ++ 7 files changed, 125 insertions(+), 49 deletions(-) create mode 100644 src/client/chat/http.rs diff --git a/Cargo.lock b/Cargo.lock index 3adff7a..340bd88 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -132,9 +132,9 @@ dependencies = [ [[package]] name = "actix-web" -version = "4.3.0" +version = "4.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "464e0fddc668ede5f26ec1f9557a8d44eda948732f40c6b0ad79126930eb775f" +checksum = "cd3cb42f9566ab176e1ef0b8b3a896529062b4efc6be0123046095914c4c1c96" dependencies = [ "actix-codec", "actix-http", @@ -167,15 +167,15 @@ dependencies = [ "serde_urlencoded", "smallvec", "socket2", - "time 0.3.19", + "time 0.3.20", "url", ] [[package]] name = "actix-web-codegen" -version = "4.1.0" +version = "4.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fa9362663c8643d67b2d5eafba49e4cb2c8a053a29ed00a0bea121f17c76b13" +checksum = "2262160a7ae29e3415554a3f1fc04c764b1540c116aa524683208078b7a75bc9" dependencies = [ "actix-router", "proc-macro2", @@ -297,9 +297,9 @@ checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" [[package]] name = "base64ct" -version = "1.5.3" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b645a089122eccb6111b4f81cbc1a49f5900ac4666bb93ac027feaecf15607bf" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" [[package]] name = "bincode" @@ -399,19 +399,20 @@ checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" [[package]] name = "bytecheck" -version = "0.6.9" +version = "0.6.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d11cac2c12b5adc6570dad2ee1b87eff4955dac476fe12d81e5fdd352e52406f" +checksum = "13fe11640a23eb24562225322cd3e452b93a3d4091d62fab69c70542fcd17d1f" dependencies = [ "bytecheck_derive", "ptr_meta", + "simdutf8", ] [[package]] name = "bytecheck_derive" -version = "0.6.9" +version = "0.6.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13e576ebe98e605500b3c8041bb888e966653577172df6dd97398714eb30b9bf" +checksum = "e31225543cb46f81a7e224762764f4a6a0f097b1db0b175f69e8065efaa42de5" dependencies = [ "proc-macro2", "quote", @@ -478,7 +479,7 @@ dependencies = [ [[package]] name = "chat-types" version = "0.1.0" -source = "git+https://git.franklinblanco.dev/franklinblanco/chat-types.git#f6ea7041a775c93f05bdd07bf3a38c8983664cce" +source = "git+https://git.franklinblanco.dev/franklinblanco/chat-types.git#ba88d60cf6ccf44841ae0ccf9f2bcd2ad68a7ebd" dependencies = [ "chrono", "dev-dtos", @@ -554,7 +555,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e859cd57d0710d9e06c381b550c06e76992472a8c6d527aecd2fc673dcc231fb" dependencies = [ "percent-encoding", - "time 0.3.19", + "time 0.3.20", "version_check", ] @@ -619,9 +620,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.14" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb766fa798726286dbbb842f174001dab8abc7b627a1dd86e0b7222a95d929f" +checksum = "3c063cd8cc95f5c377ed0d4b49a4b21f632396ff690e8470c29b3359b346984b" dependencies = [ "cfg-if", ] @@ -765,6 +766,27 @@ dependencies = [ "serde", ] +[[package]] +name = "errno" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1" +dependencies = [ + "errno-dragonfly", + "libc", + "winapi", +] + +[[package]] +name = "errno-dragonfly" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", +] + [[package]] name = "event-listener" version = "2.5.3" @@ -949,9 +971,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.15" +version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f9f29bc9dda355256b2916cf526ab02ce0aeaaaf2bad60d65ef3f12f11dd0f4" +checksum = "5be7b54589b581f624f566bf5d8eb2bab1db736c51528720b6bd36b96b55924d" dependencies = [ "bytes", "fnv", @@ -1141,6 +1163,16 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "io-lifetimes" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1abeb7a0dd0f8181267ff8adc397075586500b81b28a73e8a0208b00fc170fb3" +dependencies = [ + "libc", + "windows-sys 0.45.0", +] + [[package]] name = "ipnet" version = "2.7.1" @@ -1164,9 +1196,9 @@ checksum = "fad582f4b9e86b6caa621cabeb0963332d92eea04729ab12892c2533951e6440" [[package]] name = "jobserver" -version = "0.1.25" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "068b1ee6743e4d11fb9c6a1e6064b3693a1b600e7f5f5988047d98b3dc9fb90b" +checksum = "936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2" dependencies = [ "libc", ] @@ -1228,6 +1260,12 @@ dependencies = [ "cc", ] +[[package]] +name = "linux-raw-sys" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4" + [[package]] name = "local-channel" version = "0.1.3" @@ -1744,15 +1782,6 @@ version = "0.6.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" -[[package]] -name = "remove_dir_all" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" -dependencies = [ - "winapi", -] - [[package]] name = "rend" version = "0.4.0" @@ -1886,6 +1915,20 @@ dependencies = [ "semver", ] +[[package]] +name = "rustix" +version = "0.36.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f43abb88211988493c1abb44a70efa56ff0ce98f233b7b276146f1f3f7ba9644" +dependencies = [ + "bitflags", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys", + "windows-sys 0.45.0", +] + [[package]] name = "rustls" version = "0.20.8" @@ -2053,6 +2096,12 @@ dependencies = [ "libc", ] +[[package]] +name = "simdutf8" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" + [[package]] name = "siphasher" version = "0.3.10" @@ -2224,15 +2273,15 @@ dependencies = [ [[package]] name = "subtle" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" [[package]] name = "syn" -version = "1.0.107" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ "proc-macro2", "quote", @@ -2241,16 +2290,15 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.3.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" +checksum = "af18f7ae1acd354b992402e9ec5864359d693cd8a79dcbef59f76891701c1e95" dependencies = [ "cfg-if", "fastrand", - "libc", "redox_syscall", - "remove_dir_all", - "winapi", + "rustix", + "windows-sys 0.42.0", ] [[package]] @@ -2295,9 +2343,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.19" +version = "0.3.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53250a3b3fed8ff8fd988587d8925d26a83ac3845d9e03b220b37f34c2b8d6c2" +checksum = "cd0cbfecb4d19b5ea75bb31ad904eb5b9fa13f21079c3b92017ebdf4999a5890" dependencies = [ "itoa", "serde", @@ -2313,9 +2361,9 @@ checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd" [[package]] name = "time-macros" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a460aeb8de6dcb0f381e1ee05f1cd56fcf5a5f6eb8187ff3d8f0b11078d38b7c" +checksum = "fd80a657e71da814b8e5d60d3374fc6d35045062245d80224748ae522dd76f36" dependencies = [ "time-core", ] diff --git a/src/callbacks/chat.rs b/src/callbacks/chat.rs index 9a63ccb..ed2dee9 100644 --- a/src/callbacks/chat.rs +++ b/src/callbacks/chat.rs @@ -50,7 +50,12 @@ impl<'a> WebsocketCaller { let _ = rt.block_on( add_message_to_queue(&self.message_queue, ServerMessageIn::SendMessage(ChatMessageSender { message: ChatMessageContent::Text(message), to })) ); - + } + pub fn see_messages(&self, messages: Vec,) { + let rt = Runtime::new().unwrap(); + let _ = rt.block_on( + add_message_to_queue(&self.message_queue, ServerMessageIn::SeeMessages(messages)) + ); } } diff --git a/src/client/chat/handler.rs b/src/client/chat/handler.rs index d283f13..e63b8fe 100644 --- a/src/client/chat/handler.rs +++ b/src/client/chat/handler.rs @@ -11,9 +11,6 @@ use super::utils::interpret_message; pub async fn handle_message(message: Message, ws_caller: &Arc>) -> Result<(), Box>{ let server_message_out = interpret_message(message)?; match server_message_out { - ServerMessageOut::Acknowledge => { - todo!() - }, ServerMessageOut::LoggedIn => ws_caller.logged_in()?, ServerMessageOut::MessageSent => ws_caller.message_sent()?, ServerMessageOut::MessageRecieved(message) => ws_caller.message_recieved(message.into())?, diff --git a/src/client/chat/http.rs b/src/client/chat/http.rs new file mode 100644 index 0000000..85828f9 --- /dev/null +++ b/src/client/chat/http.rs @@ -0,0 +1,15 @@ +use chat_types::{dto::chat::ChatRoomParticipants, client_types::chat_room::ChatRoom}; +use dev_dtos::dtos::user::user_dtos::UserForAuthenticationDto; +use reqwest::Client; +use tokio::runtime::Runtime; + +use crate::{RustError, unwrap_rust_error}; + + +pub fn create_new_chat_room(user: UserForAuthenticationDto, participants: ChatRoomParticipants, title: String) -> Result { + let rt = Runtime::new().unwrap(); + let client = Client::new(); + Ok(unwrap_rust_error!(rt.block_on( + chat_communicators::client::chat::create_new_chat_room(&client, &user, &participants, &title) + ))) +} \ No newline at end of file diff --git a/src/client/chat/mod.rs b/src/client/chat/mod.rs index c982cc9..a66b3a8 100644 --- a/src/client/chat/mod.rs +++ b/src/client/chat/mod.rs @@ -1,4 +1,4 @@ -pub mod utils; pub mod handler; +pub mod utils; pub mod handler; pub mod http; use std::{sync::{Arc}, time::Duration}; @@ -91,7 +91,9 @@ where S: futures_util::Sink + Unpin { let mut write_lock_for_queue = message_queue.write().await; if messages_to_remove_from_queue.len() > 0 { for i in messages_to_remove_from_queue { - write_lock_for_queue.remove(i); + if write_lock_for_queue.len() >= i + 1 { + write_lock_for_queue.remove(i); + } } } } diff --git a/src/lib.rs b/src/lib.rs index d1c37ff..2fe076d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -6,6 +6,7 @@ pub mod utils; pub mod callbacks; pub use chat_types::client_types::chat_room::ChatRoom; +pub use chat_types::dto::chat::ChatRoomParticipants; pub use dev_dtos::dtos::user::user_dtos::UserForAuthenticationDto; use utils::storage; pub use utils::storage::*; @@ -13,7 +14,7 @@ pub use callbacks::chat::*; pub use league_types::domain::sport::Sport; pub use types::error::*; -//pub use chat_communicators::client::chat::*; +pub use client::chat::http::*; pub use chat_types::client_types::chat_message::*; pub fn get_all_sports() -> Result, RustError> { @@ -24,11 +25,12 @@ pub fn get_me() -> Result { storage::read("user".into()) } + #[macro_export] macro_rules! unwrap_rust_error { ($e:expr) => { match $e { - Ok(result) => result, + Ok(result) => result.into(), Err(error) => return Err(error.into()) } }; diff --git a/src/network.udl b/src/network.udl index c2c92ee..d8567f9 100644 --- a/src/network.udl +++ b/src/network.udl @@ -53,6 +53,9 @@ dictionary ChatRoom { i64 last_updated; u64 session_messages; }; +dictionary ChatRoomParticipants { + sequence participants; +}; enum ClientError { "One", "Two", @@ -79,11 +82,15 @@ interface WebsocketCaller { constructor(); void init_ws_connection(WebsocketFfi websocket_ffi); void send_text_message(string message, u32 to); + void see_messages(sequence messages); }; + namespace network { [Throws=RustError] UserForAuthenticationDto get_me(); [Throws=RustError] sequence get_all_sports(); void init_storage(string path); + [Throws=RustError] + ChatRoom create_new_chat_room(UserForAuthenticationDto user, ChatRoomParticipants participants, string title); }; \ No newline at end of file