From ed25ccb3ca2b0aa16c68190c7ff045540f8af84f Mon Sep 17 00:00:00 2001 From: Jonathan Krebs <jonathan.krebs@bruckbu.de> Date: Tue, 6 Apr 2021 23:26:21 +0200 Subject: [PATCH] dinge. will schlafen. --- Cargo.toml | 9 ++++++- src/screenshot.rs | 3 +++ src/server_jonny.rs | 59 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 src/server_jonny.rs diff --git a/Cargo.toml b/Cargo.toml index 5050fec..aa4a6f2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,9 +11,12 @@ structure = "0.1" async-stream = "*" futures-core = "*" futures-util = "*" -tokio = { version = "0.2", features = ["full"] } +futures = "*" +warp = "*" +tokio = { version = "1", features = ["full"] } png = "*" deflate = {version = "*", features = ["gzip"] } +pretty_env_logger = "*" @@ -25,3 +28,7 @@ path = "src/tipa.rs" [[bin]] name = "screenshot" path = "src/screenshot.rs" + +[[bin]] +name = "server_jonny" +path = "src/server_jonny.rs" diff --git a/src/screenshot.rs b/src/screenshot.rs index 4a8b700..e05ca32 100644 --- a/src/screenshot.rs +++ b/src/screenshot.rs @@ -146,6 +146,9 @@ impl Iterator for ScreenShotIter { res.is_deflated = true; } } + else{ + res.png = make_png(&*new_frame, png::ColorType::Grayscale); + } } else{ res.png = make_png(&*new_frame, png::ColorType::Grayscale); diff --git a/src/server_jonny.rs b/src/server_jonny.rs new file mode 100644 index 0000000..d9fef66 --- /dev/null +++ b/src/server_jonny.rs @@ -0,0 +1,59 @@ +use futures::{FutureExt, StreamExt}; +use warp::Filter; +use std::time::Duration; +use std::cell::RefCell; + +use std::sync::RwLock; +use std::sync::Arc; + +mod screenshot; + +use screenshot::ScreenShot; + +async fn background_shooter(current_screenshot: Arc<RwLock<ScreenShot>>) { + let mut it = screenshot::ScreenShotIter::new().unwrap(); + loop{ + let (screenshot, itback) = tokio::task::spawn_blocking(move ||{ + (it.next().unwrap(), it) + }).await.unwrap(); + it = itback; + + println!("screenshot: {} bytes", screenshot.png.len()); + // save screenshot for webserver + *current_screenshot.write().unwrap() = screenshot; + + // notify websockets + + tokio::time::sleep(Duration::from_secs(2)).await; + + } + +} + +#[tokio::main] +async fn main() { + pretty_env_logger::init(); + + let current_screenshot = Arc::new(RwLock::<ScreenShot>::new(Default::default())); + tokio::task::spawn(background_shooter(current_screenshot.clone())); + + let bg_route = warp::path("bg.png").map(move || current_screenshot.read().unwrap().png.clone()); + let routes = warp::path("echo") + // The `ws()` filter will prepare the Websocket handshake. + .and(warp::ws()) + .map(|ws: warp::ws::Ws| { + // And then our closure will be called when it completes... + ws.on_upgrade(|websocket| { + // Just echo all messages back... + let (tx, rx) = websocket.split(); + rx.forward(tx).map(|result| { + if let Err(e) = result { + eprintln!("websocket error: {:?}", e); + } + }) + }) + }) + .or(bg_route); + + warp::serve(routes).run((std::net::Ipv6Addr::UNSPECIFIED, 3030)).await; +} -- GitLab