diff --git a/packages/desktop/build.rs b/packages/desktop/build.rs index 770ebd2d6..8be7761c0 100644 --- a/packages/desktop/build.rs +++ b/packages/desktop/build.rs @@ -16,7 +16,7 @@ fn main() { let target_id = find_real_id(target); if (target_id !== null) { const send = (event_name) => { - const message = serializeIpcMessage("file_diolog", { accept: target.getAttribute("accept"), directory: target.getAttribute("webkitdirectory") === "true", multiple: target.hasAttribute("multiple"), target: parseInt(target_id), bubbles: event_bubbles(event_name), event: event_name }); + const message = window.interpreter.serializeIpcMessage("file_diolog", { accept: target.getAttribute("accept"), directory: target.getAttribute("webkitdirectory") === "true", multiple: target.hasAttribute("multiple"), target: parseInt(target_id), bubbles: event_bubbles(event_name), event: event_name }); window.ipc.postMessage(message); }; send("change&input"); @@ -26,9 +26,21 @@ fn main() { } } }"#; + let polling_request = r#"// Poll for requests + window.interpreter.wait_for_request = () => { + fetch(new Request("dioxus://index.html/edits")) + .then(response => { + response.arrayBuffer() + .then(bytes => { + run_from_bytes(bytes); + window.interpreter.wait_for_request(); + }); + }) + }"#; let mut interpreter = SLEDGEHAMMER_JS .replace("/*POST_HANDLE_EDITS*/", prevent_file_upload) - .replace("export", ""); + .replace("export", "") + + polling_request; while let Some(import_start) = interpreter.find("import") { let import_end = interpreter[import_start..] .find(|c| c == ';' || c == '\n') @@ -38,15 +50,12 @@ fn main() { } let js = format!("{interpreter}\nconst config = new InterpreterConfig(false);"); - let mut file = std::fs::File::create("src/minified.js").unwrap(); - file.write_all(js.as_bytes()).unwrap(); - // TODO: Enable minification on desktop - // use minify_js::*; - // let session = Session::new(); - // let mut out = Vec::new(); - // minify(&session, TopLevelMode::Module, js.as_bytes(), &mut out).unwrap(); - // let minified = String::from_utf8(out).unwrap(); - // let mut file = std::fs::File::create("src/minified.js").unwrap(); - // file.write_all(minified.as_bytes()).unwrap(); + use minify_js::*; + let session = Session::new(); + let mut out = Vec::new(); + minify(&session, TopLevelMode::Module, js.as_bytes(), &mut out).unwrap(); + let minified = String::from_utf8(out).unwrap(); + let mut file = std::fs::File::create("src/minified.js").unwrap(); + file.write_all(minified.as_bytes()).unwrap(); } diff --git a/packages/desktop/src/protocol.rs b/packages/desktop/src/protocol.rs index f8ba940f4..41a491749 100644 --- a/packages/desktop/src/protocol.rs +++ b/packages/desktop/src/protocol.rs @@ -17,27 +17,15 @@ fn module_loader(root_name: &str) -> String { r#" "# diff --git a/packages/interpreter/src/interpreter.js b/packages/interpreter/src/interpreter.js index b5f80a377..54f1d517c 100644 --- a/packages/interpreter/src/interpreter.js +++ b/packages/interpreter/src/interpreter.js @@ -35,7 +35,7 @@ function handler(event, name, bubbles, config) { const href = a_element.getAttribute("href"); if (href !== "" && href !== null && href !== undefined) { window.ipc.postMessage( - serializeIpcMessage("browser_open", { href }) + window.interpreter.serializeIpcMessage("browser_open", { href }) ); } } @@ -89,7 +89,7 @@ function handler(event, name, bubbles, config) { if (realId === null) { return; } - const message = serializeIpcMessage("user_event", { + const message = window.interpreter.serializeIpcMessage("user_event", { name: name, element: parseInt(realId), data: contents, @@ -132,7 +132,7 @@ function handler(event, name, bubbles, config) { return; } window.ipc.postMessage( - serializeIpcMessage("user_event", { + window.interpreter.serializeIpcMessage("user_event", { name: name, element: parseInt(realId), data: contents, @@ -231,11 +231,7 @@ let stack = []; let root; const templates = {}; let node, els, end, k; -function initialize(root) { - nodes = [root]; - stack = [root]; - listeners.root = root; -} + function AppendChildren(id, many) { root = nodes[id]; els = stack.splice(stack.length - many); @@ -246,6 +242,12 @@ function AppendChildren(id, many) { window.interpreter = {} +window.interpreter.initialize = function (root) { + nodes = [root]; + stack = [root]; + listeners.root = root; +} + window.interpreter.getClientRect = function (id) { const node = nodes[id]; if (!node) { @@ -560,7 +562,7 @@ function serialize_event(event) { } } } -function serializeIpcMessage(method, params = {}) { +window.interpreter.serializeIpcMessage = function (method, params = {}) { return JSON.stringify({ method, params }); } diff --git a/packages/interpreter/src/sledgehammer_bindings.rs b/packages/interpreter/src/sledgehammer_bindings.rs index 4203f4d15..e0d4f7045 100644 --- a/packages/interpreter/src/sledgehammer_bindings.rs +++ b/packages/interpreter/src/sledgehammer_bindings.rs @@ -363,7 +363,7 @@ pub mod binary_protocol { // if this is a mounted listener, we send the event immediately if (event_name === "mounted") { window.ipc.postMessage( - serializeIpcMessage("user_event", { + window.interpreter.serializeIpcMessage("user_event", { name: event_name, element: id, data: null, diff --git a/packages/liveview/build.rs b/packages/liveview/build.rs index 824bc4f70..d4dbeb09a 100644 --- a/packages/liveview/build.rs +++ b/packages/liveview/build.rs @@ -28,7 +28,7 @@ fn main() { if (realId === null) { return; } - const message = serializeIpcMessage("user_event", { + const message = window.interpreter.serializeIpcMessage("user_event", { name: name, element: parseInt(realId), data: contents, @@ -56,9 +56,9 @@ fn main() { let js = format!("{interpreter}\n{main_js}"); let session = Session::new(); - // let mut out = Vec::new(); - // minify(&session, TopLevelMode::Module, js.as_bytes(), &mut out).unwrap(); - // let minified = String::from_utf8(out).unwrap(); + let mut out = Vec::new(); + minify(&session, TopLevelMode::Module, js.as_bytes(), &mut out).unwrap(); + let minified = String::from_utf8(out).unwrap(); let mut file = std::fs::File::create("src/minified.js").unwrap(); - file.write_all(js.as_bytes()).unwrap(); + file.write_all(minified.as_bytes()).unwrap(); } diff --git a/packages/liveview/src/main.js b/packages/liveview/src/main.js index 0c60386e3..22267dbab 100644 --- a/packages/liveview/src/main.js +++ b/packages/liveview/src/main.js @@ -9,7 +9,7 @@ function main() { class IPC { constructor(root) { - initialize(root); + window.interpreter.initialize(root); const ws = new WebSocket(WS_ADDR); ws.binaryType = "arraybuffer"; @@ -20,7 +20,7 @@ class IPC { ws.onopen = () => { // we ping every 30 seconds to keep the websocket alive setInterval(ping, 30000); - ws.send(serializeIpcMessage("initialize")); + ws.send(window.interpreter.serializeIpcMessage("initialize")); }; ws.onerror = (err) => {