From 69d725d56cb43d92042eecbcc6d306782799ab88 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Sat, 23 Nov 2019 05:51:00 -0500 Subject: pass configuration from the web server to the web app --- teleterm-web/src/config.rs | 18 ++ teleterm-web/src/lib.rs | 3 +- teleterm-web/src/model.rs | 14 +- teleterm-web/src/views/page.rs | 8 +- teleterm/src/web.rs | 57 ++----- teleterm/src/web/view.rs | 37 ++++ teleterm/static/index.html.tmpl | 4 +- teleterm/static/teleterm_web.js | 316 ++++++++++++++++++----------------- teleterm/static/teleterm_web_bg.wasm | Bin 697715 -> 703802 bytes 9 files changed, 256 insertions(+), 201 deletions(-) create mode 100644 teleterm-web/src/config.rs create mode 100644 teleterm/src/web/view.rs diff --git a/teleterm-web/src/config.rs b/teleterm-web/src/config.rs new file mode 100644 index 0000000..c6dbc50 --- /dev/null +++ b/teleterm-web/src/config.rs @@ -0,0 +1,18 @@ +use crate::prelude::*; + +#[wasm_bindgen] +extern "C" { + #[wasm_bindgen] + static TELETERM_CONFIG: JsValue; +} + +#[derive(Clone, Debug, serde::Deserialize)] +pub(crate) struct Config { + pub(crate) title: String, +} + +impl Config { + pub(crate) fn load() -> Self { + TELETERM_CONFIG.into_serde().unwrap() + } +} diff --git a/teleterm-web/src/lib.rs b/teleterm-web/src/lib.rs index 1b8fdde..7b17421 100644 --- a/teleterm-web/src/lib.rs +++ b/teleterm-web/src/lib.rs @@ -1,3 +1,4 @@ +mod config; mod model; mod prelude; mod protocol; @@ -19,7 +20,7 @@ enum Msg { fn init(_: Url, orders: &mut impl Orders) -> Init { log::trace!("init"); orders.send_msg(Msg::Refresh); - Init::new(crate::model::Model::default()) + Init::new(crate::model::Model::new(crate::config::Config::load())) } fn update( diff --git a/teleterm-web/src/model.rs b/teleterm-web/src/model.rs index 8a22f1b..1ba1f40 100644 --- a/teleterm-web/src/model.rs +++ b/teleterm-web/src/model.rs @@ -15,13 +15,21 @@ impl Drop for WatchConn { } } -#[derive(Default)] pub(crate) struct Model { + config: crate::config::Config, sessions: Vec, watch_conn: Option, } impl Model { + pub(crate) fn new(config: crate::config::Config) -> Self { + Self { + config, + sessions: vec![], + watch_conn: None, + } + } + pub(crate) fn update( &mut self, msg: crate::Msg, @@ -84,6 +92,10 @@ impl Model { } } + pub(crate) fn title(&self) -> &str { + &self.config.title + } + pub(crate) fn screen(&self) -> Option<&vt100::Screen> { self.watch_conn.as_ref().map(|conn| conn.term.screen()) } diff --git a/teleterm-web/src/views/page.rs b/teleterm-web/src/views/page.rs index 7842172..e30e085 100644 --- a/teleterm-web/src/views/page.rs +++ b/teleterm-web/src/views/page.rs @@ -1,9 +1,13 @@ use crate::prelude::*; pub(crate) fn render(model: &crate::model::Model) -> Vec> { + let mut view = vec![seed::h1![model.title()]]; + if model.watching() { - super::watch::render(model) + view.extend(super::watch::render(model)) } else { - super::list::render(model) + view.extend(super::list::render(model)) } + + view } diff --git a/teleterm/src/web.rs b/teleterm/src/web.rs index bfc5bcb..40f23ce 100644 --- a/teleterm/src/web.rs +++ b/teleterm/src/web.rs @@ -1,44 +1,12 @@ +mod view; mod ws; use crate::prelude::*; use gotham::router::builder::{DefineSingleRoute as _, DrawRoutes as _}; use gotham::state::FromState as _; -use lazy_static::lazy_static; -use lazy_static_include::*; use tokio_tungstenite::tungstenite; -lazy_static_include::lazy_static_include_bytes!( - INDEX_HTML_TMPL, - "static/index.html.tmpl" -); -lazy_static_include::lazy_static_include_bytes!( - TELETERM_WEB_JS, - "static/teleterm_web.js" -); -lazy_static_include::lazy_static_include_bytes!( - TELETERM_WEB_WASM, - "static/teleterm_web_bg.wasm" -); -lazy_static_include::lazy_static_include_bytes!( - TELETERM_CSS, - "static/teleterm.css" -); - -const INDEX_HTML_TMPL_NAME: &str = "index"; -lazy_static::lazy_static! { - static ref HANDLEBARS: handlebars::Handlebars = { - let mut handlebars = handlebars::Handlebars::new(); - handlebars - .register_template_string( - INDEX_HTML_TMPL_NAME, - String::from_utf8(INDEX_HTML_TMPL.to_vec()).unwrap(), - ) - .unwrap(); - handlebars - }; -} - #[derive( serde::Deserialize, gotham_derive::StateData, @@ -49,7 +17,7 @@ struct WatchQueryParams { } #[derive(Clone, serde::Serialize)] -struct TemplateData { +struct Config { title: String, } @@ -59,7 +27,7 @@ pub struct Server { impl Server { pub fn new(addr: T) -> Self { - let data = TemplateData { + let data = Config { title: "teleterm".to_string(), }; Self { @@ -96,22 +64,23 @@ impl futures::Future for Server { } } -fn router(data: &TemplateData) -> impl gotham::handler::NewHandler { +fn router(data: &Config) -> impl gotham::handler::NewHandler { gotham::router::builder::build_simple_router(|route| { route.get("/").to_new_handler(serve_template( "text/html", - INDEX_HTML_TMPL_NAME, + view::INDEX_HTML_TMPL_NAME, data, )); - route - .get("/teleterm_web.js") - .to(serve_static("application/javascript", &TELETERM_WEB_JS)); + route.get("/teleterm_web.js").to(serve_static( + "application/javascript", + &view::TELETERM_WEB_JS, + )); route .get("/teleterm_web_bg.wasm") - .to(serve_static("application/wasm", &TELETERM_WEB_WASM)); + .to(serve_static("application/wasm", &view::TELETERM_WEB_WASM)); route .get("/teleterm.css") - .to(serve_static("text/css", &TELETERM_CSS)); + .to(serve_static("text/css", &view::TELETERM_CSS)); route.get("/list").to(handle_list); route .get("/watch") @@ -136,13 +105,13 @@ fn serve_static( fn serve_template( content_type: &'static str, name: &'static str, - data: &TemplateData, + data: &Config, ) -> impl gotham::handler::NewHandler { let data = data.clone(); move || { let data = data.clone(); Ok(move |state| { - let rendered = HANDLEBARS.render(name, &data).unwrap(); + let rendered = view::HANDLEBARS.render(name, &data).unwrap(); let response = hyper::Response::builder() .header("Content-Type", content_type) .body(hyper::Body::from(rendered)) diff --git a/teleterm/src/web/view.rs b/teleterm/src/web/view.rs new file mode 100644 index 0000000..5745614 --- /dev/null +++ b/teleterm/src/web/view.rs @@ -0,0 +1,37 @@ +use handlebars::handlebars_helper; +use lazy_static::lazy_static; +use lazy_static_include::*; + +lazy_static_include::lazy_static_include_bytes!( + pub INDEX_HTML_TMPL, + "static/index.html.tmpl" +); +lazy_static_include::lazy_static_include_bytes!( + pub TELETERM_WEB_JS, + "static/teleterm_web.js" +); +lazy_static_include::lazy_static_include_bytes!( + pub TELETERM_WEB_WASM, + "static/teleterm_web_bg.wasm" +); +lazy_static_include::lazy_static_include_bytes!( + pub TELETERM_CSS, + "static/teleterm.css" +); + +handlebars_helper!(json: |x: object| serde_json::to_string(x).unwrap()); + +pub const INDEX_HTML_TMPL_NAME: &str = "index"; +lazy_static::lazy_static! { + pub static ref HANDLEBARS: handlebars::Handlebars = { + let mut handlebars = handlebars::Handlebars::new(); + handlebars.register_helper("json", Box::new(json)); + handlebars + .register_template_string( + INDEX_HTML_TMPL_NAME, + String::from_utf8(INDEX_HTML_TMPL.to_vec()).unwrap(), + ) + .unwrap(); + handlebars + }; +} diff --git a/teleterm/static/index.html.tmpl b/teleterm/static/index.html.tmpl index c489d87..7a2af50 100644 --- a/teleterm/static/index.html.tmpl +++ b/teleterm/static/index.html.tmpl @@ -4,8 +4,10 @@ -

{{title}}

+