From 57330afd153851af0051dd34ec5dfad7f44d3a03 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Fri, 22 Nov 2019 08:29:00 -0500 Subject: use vt100 to render the terminal data in the browser(!) --- teleterm-web/Cargo.toml | 1 + teleterm-web/src/lib.rs | 7 ++----- teleterm-web/src/model.rs | 18 +++++++++++++++++- 3 files changed, 20 insertions(+), 6 deletions(-) (limited to 'teleterm-web') diff --git a/teleterm-web/Cargo.toml b/teleterm-web/Cargo.toml index a7c82b6..47496de 100644 --- a/teleterm-web/Cargo.toml +++ b/teleterm-web/Cargo.toml @@ -18,5 +18,6 @@ log = "0.4" seed = "0.4" serde = "1" serde_json = "1" +vt100 = "0.6" wasm-bindgen = "0.2" web-sys = { version = "0.3", features = ["ErrorEvent", "MessageEvent", "WebSocket"] } diff --git a/teleterm-web/src/lib.rs b/teleterm-web/src/lib.rs index 030ac45..5dd5a33 100644 --- a/teleterm-web/src/lib.rs +++ b/teleterm-web/src/lib.rs @@ -59,11 +59,7 @@ fn update( serde_json::from_str(&json).unwrap(); match msg { crate::protocol::Message::TerminalOutput { data } => { - log::info!( - "{}: got bytes: {}", - id, - String::from_utf8_lossy(&data) - ); + model.process(&data); } } } @@ -87,6 +83,7 @@ fn view(model: &crate::model::Model) -> impl View { seed::h1!["it's a seed app"], seed::ul![list], seed::button![simple_ev(Ev::Click, Msg::Refresh), "refresh"], + seed::pre![model.screen()], ] } diff --git a/teleterm-web/src/model.rs b/teleterm-web/src/model.rs index 263dd7c..a90ebe2 100644 --- a/teleterm-web/src/model.rs +++ b/teleterm-web/src/model.rs @@ -6,6 +6,7 @@ const WATCH_URL: &str = "ws://127.0.0.1:4145/watch"; struct WatchConn { #[allow(dead_code)] // no idea why it thinks this is dead ws: WebSocket, + term: vt100::Parser, } impl Drop for WatchConn { @@ -44,7 +45,8 @@ impl Model { crate::Msg::Watch, orders, ); - self.watch_conn = Some(WatchConn { ws }) + let term = vt100::Parser::default(); + self.watch_conn = Some(WatchConn { ws, term }) } pub fn sessions(&self) -> &[Session] { @@ -54,4 +56,18 @@ impl Model { pub fn update_sessions(&mut self, sessions: Vec) { self.sessions = sessions; } + + pub fn process(&mut self, bytes: &[u8]) { + if let Some(conn) = &mut self.watch_conn { + conn.term.process(bytes); + } + } + + pub fn screen(&self) -> String { + if let Some(conn) = &self.watch_conn { + conn.term.screen().contents() + } else { + "".to_string() + } + } } -- cgit v1.2.3-54-g00ecf