From 42d6a77050824251126892c37303cef8349fa885 Mon Sep 17 00:00:00 2001 From: shockrah Date: Sun, 11 Apr 2021 17:39:54 -0700 Subject: [PATCH] - Removing network control from the cache From this point forward the cache should basically just be a data container. Methods on the cache object are there for convenience and should only ever return very simple data [booleans, integers, () etc.]. The cache should also have very litter/no concept of commands to decouple it from the renderer process. ! list_channels is still implemented in the cache however it remaains a vestige and will be moved to the net module Also the client is getting some new packages for websocket connections and while they work some additional work has to be put in to figure out where fug to actually place the websocket so that it can update the cache+DOM in a seomewhat sensible fashion --- freechat-client/package-lock.json | 122 ++---------------------------- freechat-client/package.json | 2 +- tui/src/cache.rs | 69 +++++------------ tui/src/config.rs | 10 +++ tui/src/main.rs | 36 +++++---- tui/src/net.rs | 1 + 6 files changed, 56 insertions(+), 184 deletions(-) diff --git a/freechat-client/package-lock.json b/freechat-client/package-lock.json index aa0d497..cc0c01b 100644 --- a/freechat-client/package-lock.json +++ b/freechat-client/package-lock.json @@ -259,14 +259,6 @@ "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, - "bufferutil": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.3.tgz", - "integrity": "sha512-yEYTwGndELGvfXsImMBLop58eaGW+YdONi1fNjTINSY98tmMmFijBG6WXgdkfuLNt4imzQNtIE+eBp1PVpMCSw==", - "requires": { - "node-gyp-build": "^4.2.0" - } - }, "cacheable-lookup": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", @@ -330,19 +322,11 @@ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, - "d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, "requires": { "ms": "2.0.0" }, @@ -350,7 +334,8 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, @@ -445,16 +430,6 @@ "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "dev": true }, - "es5-ext": { - "version": "0.10.53", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", - "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" - } - }, "es6-error": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", @@ -462,25 +437,6 @@ "dev": true, "optional": true }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "requires": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, "escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -488,21 +444,6 @@ "dev": true, "optional": true }, - "ext": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", - "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", - "requires": { - "type": "^2.0.0" - }, - "dependencies": { - "type": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", - "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==" - } - } - }, "extract-zip": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", @@ -645,11 +586,6 @@ "dev": true, "optional": true }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -826,16 +762,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" - }, - "node-gyp-build": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.2.3.tgz", - "integrity": "sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg==" - }, "normalize-url": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", @@ -1070,11 +996,6 @@ "dev": true, "optional": true }, - "type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" - }, "type-fest": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", @@ -1088,14 +1009,6 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "requires": { - "is-typedarray": "^1.0.0" - } - }, "typescript": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz", @@ -1116,42 +1029,21 @@ "prepend-http": "^2.0.0" } }, - "utf-8-validate": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.4.tgz", - "integrity": "sha512-MEF05cPSq3AwJ2C7B7sHAA6i53vONoZbMGX8My5auEVm6W+dJ2Jd/TZPyGJ5CH42V2XtbI5FD28HeHeqlPzZ3Q==", - "requires": { - "node-gyp-build": "^4.2.0" - } - }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, - "websocket": { - "version": "1.0.33", - "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.33.tgz", - "integrity": "sha512-XwNqM2rN5eh3G2CUQE3OHZj+0xfdH42+OFK6LdC2yqiC0YU8e5UK0nYre220T0IyyN031V/XOvtHvXozvJYFWA==", - "requires": { - "bufferutil": "^4.0.1", - "debug": "^2.2.0", - "es5-ext": "^0.10.50", - "typedarray-to-buffer": "^3.1.5", - "utf-8-validate": "^5.0.2", - "yaeti": "^0.0.6" - } - }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, - "yaeti": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", - "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=" + "ws": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.4.tgz", + "integrity": "sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw==" }, "yallist": { "version": "4.0.0", diff --git a/freechat-client/package.json b/freechat-client/package.json index bbe1458..397776a 100644 --- a/freechat-client/package.json +++ b/freechat-client/package.json @@ -16,7 +16,7 @@ "jsonwebtoken": "^8.5.1", "popper.js": "^1.16.1", "typescript": "^4.2.3", - "websocket": "^1.0.33" + "ws": "^7.4.4" }, "devDependencies": { "electron": "^7.3.3" diff --git a/tui/src/cache.rs b/tui/src/cache.rs index 9d31957..9df99ae 100644 --- a/tui/src/cache.rs +++ b/tui/src/cache.rs @@ -16,16 +16,11 @@ use crate::api_types::Channel; use crate::net; use crate::command::Command; use crate::config::{ConfigFile, ServerConfig}; -use tokio_tungstenite::connect_async; -use futures::StreamExt; use std::collections::HashMap; use crate::api_types as api; type ChannelMeta = Channel; -async fn nop() { -} - struct ChannelCache { pub meta: ChannelMeta, pub messages: Vec @@ -67,17 +62,6 @@ impl Cache { } } - pub fn find_serv(&self, portion: String) -> Option<(String, u64)> { - let item = self.servers.iter() - .find(|(url, _)| url.contains(portion.as_str())); - - if let Some((url, cache)) = item { - Some((url.clone(), cache.meta.user.id)) - } else { - None - } - } - pub async fn switch_channel(&mut self, id: u64) -> Command { if let None = self.active_server { return Command::Failure("No active server set!".into()) @@ -99,48 +83,29 @@ impl Cache { } - fn new_message(&mut self, msg: api::Message, url: String, chan_id: u64) { + pub fn set_jwt(&mut self, url: &str, jwt: &str) -> bool { + let mut set = false; + for (surl, serv) in self.servers.iter_mut() { + if url == surl { + serv.meta.user.jwt = Some(jwt.into()); + set = true; + } + }; + return set; + } + + fn _new_message(&mut self, msg: api::Message, url: String, chan_id: u64) { self.servers.get_mut(&url).unwrap() .channels.get_mut(&chan_id).unwrap() .messages.push(msg); } - pub async fn switch_server(&mut self, host: &str) -> (Command, Option) { - // TODO: clean this func to be less ugly/easier to read - let mut found = false; - let mut err_msg = String::from("Nothing found"); - let mut fresh_token: Option = None; - for (url, meta) in self.servers.iter_mut() { - if url.contains(host) { - let id = meta.meta.user.id; - let secret = &meta.meta.user.secret; - found = match net::login(url, id, secret).await { - Ok(jwt) => { - fresh_token = Some(jwt.clone()); - meta.meta.user.jwt = Some(jwt); - self.active_server = Some(meta.meta.clone()); - self.active_text = None; - true - }, - Err(e) => { - err_msg = match e.is_status() { - true => format!("{:?}", e.status().unwrap()), - false => format!("Issue connecting to server") - }; - meta.meta.user.jwt = None; - false - } - }; - meta.meta.user.jwt = Some(String::from("asdf")); - break + pub fn set_active(&mut self, url: &str) { + for (surl, serv) in self.servers.iter() { + if url == surl { + self.active_server = Some(serv.meta.clone()); } } - - if found { - (Command::Text(format!("logged in - /lc to list to list channels")), fresh_token) - } else { - (Command::Failure(err_msg), None) - } } pub async fn send_message(&self, msg: &str) -> Command { @@ -156,7 +121,7 @@ impl Cache { Err(_) => Command::Failure("Couldn't send text message".into()) } } - Command::Text("yes".into()) + Command::Text("No active channel".into()) } pub fn list_hosts(&self) -> Command { diff --git a/tui/src/config.rs b/tui/src/config.rs index 1849131..452a63d 100644 --- a/tui/src/config.rs +++ b/tui/src/config.rs @@ -43,6 +43,16 @@ impl ConfigFile { Ok(()) } + + pub fn find_login_data(&self, url_portion: &str) -> Option<(u64, String, String)> { + let mut found: Option<(u64, String, String)> = None; + for serv in self.servers.iter() { + if serv.server.url.contains(url_portion) { + found = Some((serv.user.id, serv.user.secret.clone(), serv.server.url.clone())) + } + } + return found; + } } diff --git a/tui/src/main.rs b/tui/src/main.rs index 5a44878..44c9ac6 100644 --- a/tui/src/main.rs +++ b/tui/src/main.rs @@ -37,8 +37,7 @@ struct App { /// Current input mode input_mode: InputMode, /// History of recorded messages - messages: Mutex>, - cache: Cache + messages: Vec, } impl App { @@ -54,8 +53,7 @@ impl App { App { input: String::new(), input_mode: InputMode::Normal, - messages: Mutex::new(init_commands), - cache + messages: init_commands, } } } @@ -113,6 +111,7 @@ async fn main() -> Result<(), Box> { // Create default app state let mut app = App::new(&config); + let cache: Mutex = Mutex::new(Cache::from(&config)); loop { // Draw UI @@ -157,7 +156,7 @@ async fn main() -> Result<(), Box> { f.render_widget(input, chunks[1]); let mut lines: Vec = Vec::new(); - let msgs = app.messages.lock().unwrap(); + let msgs = &app.messages; for cmd in msgs.iter().rev() { &lines.push(cmd.styled()); } @@ -219,27 +218,32 @@ async fn main() -> Result<(), Box> { let raw: String = app.input.drain(..).collect(); let trimmed = raw.trim(); - // ensure that we don't bother with empty input + // TODO: flattten me mommy if trimmed.len() != 0 { let cmd = Command::from(trimmed); - app.messages.lock().unwrap().push(match cmd { + app.messages.push(match cmd { // only for networked commands do we need to touch cache Command::Channel(id) => { - app.cache.switch_channel(id).await + cache.lock().unwrap().switch_channel(id).await }, Command::Server(url_portion) => { - if let Some((url, id)) = app.cache.find_serv(url_portion) { - let (cmd, jwt) = app.cache.switch_server(url.as_str()).await; - let url = net::ws_url(url.as_str(), jwt); - // maybe hook some message passing listener here? - cmd + if let Some((id, secret, url)) = config.find_login_data(&url_portion) { + match net::login(&url, id, &secret).await { + Ok(jwt) => if cache.lock().unwrap().set_jwt(&url, &jwt) { + cache.lock().unwrap().set_active(&url); + Command::Text("[Tell shock to make this ux not suck btw] /lc to fetch/update channels".into()) + } else { + Command::Failure("Token could not be set".into()) + }, + Err(_) => Command::Failure(format!("Unable to login to {}", url)) + } } else { Command::Failure("No server found".into()) } }, - Command::Message(msg) => app.cache.send_message(&msg).await, - Command::ListHost => app.cache.list_hosts(), - Command::ListChannel => app.cache.list_channels().await, + Command::Message(msg) => cache.lock().unwrap().send_message(&msg).await, + Command::ListHost => cache.lock().unwrap().list_hosts(), + Command::ListChannel => cache.lock().unwrap().list_channels().await, _ => cmd }); } diff --git a/tui/src/net.rs b/tui/src/net.rs index 8188e99..5b31608 100644 --- a/tui/src/net.rs +++ b/tui/src/net.rs @@ -61,3 +61,4 @@ pub fn ws_url(base: &str, jwt: Option) -> String { let _ = url.set_scheme("ws"); url.to_string() } +