#![allow(clippy::mem_forget)] // False positives from #[wasm_bindgen] macro use eframe::wasm_bindgen::{self, prelude::*}; use crate::WrapApp; /// Our handle to the web app from JavaScript. #[derive(Clone)] #[wasm_bindgen] pub struct WebHandle { runner: eframe::WebRunner, } #[wasm_bindgen] impl WebHandle { /// Installs a panic hook, then returns. #[allow(clippy::new_without_default)] #[wasm_bindgen(constructor)] pub fn new() -> Self { // Redirect [`log`] message to `console.log` and friends: let log_level = if cfg!(debug_assertions) { log::LevelFilter::Trace } else { log::LevelFilter::Debug }; eframe::WebLogger::init(log_level).ok(); Self { runner: eframe::WebRunner::new(), } } /// Call this once from JavaScript to start your app. #[wasm_bindgen] pub async fn start( &self, canvas: web_sys::HtmlCanvasElement, ) -> Result<(), wasm_bindgen::JsValue> { self.runner .start( canvas, eframe::WebOptions::default(), Box::new(|cc| Ok(Box::new(WrapApp::new(cc)))), ) .await } #[wasm_bindgen] pub fn destroy(&self) { self.runner.destroy(); } /// Example on how to call into your app from JavaScript. #[wasm_bindgen] pub fn example(&self) { if let Some(_app) = self.runner.app_mut::() { // _app.example(); } } /// The JavaScript can check whether or not your app has crashed: #[wasm_bindgen] pub fn has_panicked(&self) -> bool { self.runner.has_panicked() } #[wasm_bindgen] pub fn panic_message(&self) -> Option { self.runner.panic_summary().map(|s| s.message()) } #[wasm_bindgen] pub fn panic_callstack(&self) -> Option { self.runner.panic_summary().map(|s| s.callstack()) } }