From bf4e5c7a5be7d6a67a83dd5cb6cfbda8fcf07a9c Mon Sep 17 00:00:00 2001 From: _ <> Date: Thu, 26 Nov 2020 21:50:55 +0000 Subject: [PATCH] :recycle: Planning changes to relay config --- src/relay/mod.rs | 59 ++++++++++++++++++++++++++++++------------------ todo.md | 3 +++ 2 files changed, 40 insertions(+), 22 deletions(-) diff --git a/src/relay/mod.rs b/src/relay/mod.rs index 6fbe3ca..9b9171e 100644 --- a/src/relay/mod.rs +++ b/src/relay/mod.rs @@ -1,4 +1,5 @@ use std::{ + borrow::Cow, error::Error, collections::*, convert::Infallible, @@ -94,10 +95,16 @@ type ResponseRendezvous = oneshot::Sender , + pub display_names: HashMap , +} + #[derive (Default, Deserialize)] pub struct ConfigFile { pub port: Option , - pub server_tripcodes: HashMap , + pub servers: ConfigServers, } // Stuff we actually need at runtime @@ -108,7 +115,7 @@ struct Config { impl From <&ConfigFile> for Config { fn from (f: &ConfigFile) -> Self { - let server_tripcodes = HashMap::from_iter (f.server_tripcodes.iter () + let server_tripcodes = HashMap::from_iter (f.servers.tripcodes.iter () .map (|(k, v)| { use std::convert::TryInto; let bytes: Vec = base64::decode (v).unwrap (); @@ -529,33 +536,34 @@ fn pretty_print_last_seen ( Description (last_seen.to_rfc3339_opts (SecondsFormat::Secs, true)) } +#[derive (Serialize)] +struct ServerEntry <'a> { + path: String, + name: String, + last_seen: Cow <'a, str>, +} -async fn handle_server_list ( - state: Arc -) -> Response +#[derive (Serialize)] +struct ServerListPage <'a> { + servers: Vec >, +} + +async fn handle_server_list_internal (state: &Arc ) +-> ServerListPage <'static> { - use std::borrow::Cow; + let all_servers: Vec <_> = { + let guard = state.config.read ().await; + (*guard).server_tripcodes.keys ().cloned ().collect () + }; - #[derive (Serialize)] - struct ServerEntry <'a> { - path: String, - name: String, - last_seen: Cow <'a, str>, - } - - #[derive (Serialize)] - struct ServerListPage <'a> { - servers: Vec >, - } - - let servers = { + let server_status = { let guard = state.server_status.lock ().await; (*guard).clone () }; let now = Utc::now (); - let mut servers: Vec <_> = servers.into_iter () + let mut servers: Vec <_> = server_status.into_iter () .map (|(name, server)| { let display_name = percent_encoding::percent_decode_str (&name).decode_utf8 ().unwrap_or_else (|_| "Server name isn't UTF-8".into ()).to_string (); @@ -577,9 +585,16 @@ async fn handle_server_list ( servers.sort_by (|a, b| a.name.cmp (&b.name)); - let page = ServerListPage { + ServerListPage { servers, - }; + } +} + +async fn handle_server_list ( + state: Arc +) -> Response +{ + let page = handle_server_list_internal (&state).await; let s = state.handlebars.render ("relay_server_list", &page).unwrap (); ok_reply (s) diff --git a/todo.md b/todo.md index e100cd8..d2f7013 100644 --- a/todo.md +++ b/todo.md @@ -1,3 +1,6 @@ +- Server list should include offline or never-launched servers +- Allow relay to rename servers +- Estimate bandwidth per server? - "Preview as" feature for Markdown (It's not threaded through the relay yet) - Remote `tail -f` (_Complicated_) (Maybe use chunked encoding or something?) - Make a debug client to replicate the issue Firefox is having with turtling