actual run --browser instead of just optimized technotunnel

This commit is contained in:
2022-02-20 18:26:57 +01:00
parent 266493ca1c
commit c56196bd2e
6 changed files with 68 additions and 15 deletions

2
Cargo.lock generated
View File

@@ -2122,6 +2122,7 @@ dependencies = [
"futures-core", "futures-core",
"pin-project-lite", "pin-project-lite",
"tokio", "tokio",
"tokio-util",
] ]
[[package]] [[package]]
@@ -2320,6 +2321,7 @@ dependencies = [
"pico-args", "pico-args",
"same-file", "same-file",
"tokio", "tokio",
"tokio-stream",
"uw8-tool", "uw8-tool",
"warp", "warp",
"wasmtime", "wasmtime",

View File

@@ -17,4 +17,5 @@ uw8-tool = { path = "uw8-tool" }
same-file = "1" same-file = "1"
warp = "0.3.2" warp = "0.3.2"
tokio = { version = "1.17.0", features = ["sync", "rt"] } tokio = { version = "1.17.0", features = ["sync", "rt"] }
tokio-stream = { version = "0.1.8", features = ["sync"] }
webbrowser = "0.6.0" webbrowser = "0.6.0"

View File

@@ -70,13 +70,6 @@ fn run(mut args: Arguments) -> Result<()> {
let filename = args.free_from_os_str::<PathBuf, bool>(|s| Ok(s.into()))?; let filename = args.free_from_os_str::<PathBuf, bool>(|s| Ok(s.into()))?;
if !run_browser {
let mut uw8 = MicroW8::new()?;
if let Some(timeout) = timeout {
uw8.set_timeout(timeout);
}
let mut watcher = FileWatcher::builder(); let mut watcher = FileWatcher::builder();
if watch_mode { if watch_mode {
@@ -85,6 +78,13 @@ fn run(mut args: Arguments) -> Result<()> {
let watcher = watcher.build()?; let watcher = watcher.build()?;
if !run_browser {
let mut uw8 = MicroW8::new()?;
if let Some(timeout) = timeout {
uw8.set_timeout(timeout);
}
if let Err(err) = start_cart(&filename, &mut uw8, &config) { if let Err(err) = start_cart(&filename, &mut uw8, &config) {
eprintln!("Load error: {}", err); eprintln!("Load error: {}", err);
if !watch_mode { if !watch_mode {
@@ -119,6 +119,14 @@ fn run(mut args: Arguments) -> Result<()> {
} }
loop { loop {
if watcher.poll_changed_file()?.is_some() {
match load_cart(&filename, &config) {
Ok(cart) => server.load_module(&cart)?,
Err(err) => {
eprintln!("Load error: {}", err);
}
}
}
std::thread::sleep(Duration::from_millis(100)); std::thread::sleep(Duration::from_millis(100));
} }
} }

View File

@@ -1,14 +1,28 @@
use anyhow::Result; use anyhow::Result;
use std::thread; use std::{
sync::{Arc, Mutex},
thread,
};
use tokio::sync::broadcast;
use tokio_stream::{wrappers::BroadcastStream, Stream, StreamExt};
use warp::{http::Response, Filter}; use warp::{http::Response, Filter};
pub struct RunWebServer {} pub struct RunWebServer {
cart: Arc<Mutex<Vec<u8>>>,
tx: broadcast::Sender<()>,
}
impl RunWebServer { impl RunWebServer {
pub fn new() -> RunWebServer { pub fn new() -> RunWebServer {
let cart = Arc::new(Mutex::new(Vec::new()));
let (tx, _) = broadcast::channel(1);
let server_cart = cart.clone();
let server_tx = tx.clone();
thread::spawn(move || { thread::spawn(move || {
let rt = tokio::runtime::Builder::new_current_thread() let rt = tokio::runtime::Builder::new_current_thread()
.enable_io() .enable_io()
.enable_time()
.build() .build()
.expect("Failed to create tokio runtime"); .expect("Failed to create tokio runtime");
rt.block_on(async { rt.block_on(async {
@@ -18,17 +32,37 @@ impl RunWebServer {
.body(include_str!("run-web.html")) .body(include_str!("run-web.html"))
}); });
let server_future = warp::serve(html).bind(([127, 0, 0, 1], 3030)); let cart = warp::path("cart")
.map(move || server_cart.lock().map_or(Vec::new(), |c| c.clone()));
let events = warp::path("events").and(warp::get()).map(move || {
fn event_stream(
tx: &broadcast::Sender<()>,
) -> impl Stream<Item = Result<warp::sse::Event, std::convert::Infallible>>
{
BroadcastStream::new(tx.subscribe())
.map(|_| Ok(warp::sse::Event::default().data("L")))
}
warp::sse::reply(warp::sse::keep_alive().stream(event_stream(&server_tx)))
});
let server_future =
warp::serve(html.or(cart).or(events)).bind(([127, 0, 0, 1], 3030));
println!("Point browser at 127.0.0.1:3030"); println!("Point browser at 127.0.0.1:3030");
let _ = webbrowser::open("http://127.0.0.1:3030"); let _ignore_result = webbrowser::open("http://127.0.0.1:3030");
server_future.await server_future.await
}); });
}); });
RunWebServer {} RunWebServer { cart, tx }
} }
pub fn load_module(&mut self, module_data: &[u8]) -> Result<()> { pub fn load_module(&mut self, module_data: &[u8]) -> Result<()> {
if let Ok(mut lock) = self.cart.lock() {
lock.clear();
lock.extend_from_slice(module_data);
}
let _ignore_result = self.tx.send(());
Ok(()) Ok(())
} }
} }

View File

@@ -2,6 +2,13 @@ import loaderUrl from "data-url:../../platform/bin/loader.wasm";
import platformUrl from "data-url:../../platform/bin/platform.uw8"; import platformUrl from "data-url:../../platform/bin/platform.uw8";
export default function MicroW8(screen, config = {}) { export default function MicroW8(screen, config = {}) {
if(!config.setMessage) {
config.setMessage = (s, e) => {
if(e) {
console.log('error: ' + e);
}
}
}
let canvasCtx = screen.getContext('2d'); let canvasCtx = screen.getContext('2d');
let imageData = canvasCtx.createImageData(320, 240); let imageData = canvasCtx.createImageData(320, 240);

View File

@@ -5,6 +5,7 @@ let events = new EventSource('events');
events.onmessage = event => { events.onmessage = event => {
console.log(event.data); console.log(event.data);
if(event.data == 'L') { if(event.data == 'L') {
uw8.runModuleFromURL('cart'); uw8.runModuleFromURL('cart', true);
} }
}; };
uw8.runModuleFromURL('cart', true);