refactor: simplify web bootstrap

Amp-Thread-ID: https://ampcode.com/threads/T-019f9d91-77c1-7206-a60f-ed6554ce92ab

Co-authored-by: Heaust Azure <heaust.azure@gmail.com>
This commit is contained in:
Amp
2026-07-29 02:02:22 +00:00
co-authored by heaust
parent 2ff8a4a17b
commit c1a95e4b27
5 changed files with 15 additions and 91 deletions
+10 -61
View File
@@ -14,27 +14,13 @@ use wasm_bindgen_futures::spawn_local;
#[cfg(target_arch = "wasm32")]
use web_sys::AddEventListenerOptions;
/// Helper struct to store event listener closures
#[cfg(target_arch = "wasm32")]
pub struct EventListeners {
pub resize_listener: Option<Closure<dyn FnMut()>>,
pub pointer_listener: Option<Closure<dyn FnMut(web_sys::PointerEvent)>>,
pub click_listener: Option<Closure<dyn FnMut(web_sys::MouseEvent)>>,
pub wheel_listener: Option<Closure<dyn FnMut(web_sys::WheelEvent)>>,
pub contextmenu_listener: Option<Closure<dyn FnMut(web_sys::MouseEvent)>>,
}
#[cfg(target_arch = "wasm32")]
impl EventListeners {
pub fn new() -> Self {
Self {
resize_listener: None,
pointer_listener: None,
click_listener: None,
wheel_listener: None,
contextmenu_listener: None,
}
}
_resize_listener: Closure<dyn FnMut()>,
_pointer_listener: Closure<dyn FnMut(web_sys::PointerEvent)>,
_click_listener: Closure<dyn FnMut(web_sys::MouseEvent)>,
_wheel_listener: Closure<dyn FnMut(web_sys::WheelEvent)>,
_contextmenu_listener: Closure<dyn FnMut(web_sys::MouseEvent)>,
}
/// Setup default window event listeners that forward events to the worker thread
@@ -152,11 +138,11 @@ pub fn setup_event_listeners(
)?;
Ok(EventListeners {
resize_listener: Some(resize_listener),
pointer_listener: Some(pointer_listener),
click_listener: Some(click_listener),
wheel_listener: Some(wheel_listener),
contextmenu_listener: Some(contextmenu_listener),
_resize_listener: resize_listener,
_pointer_listener: pointer_listener,
_click_listener: click_listener,
_wheel_listener: wheel_listener,
_contextmenu_listener: contextmenu_listener,
})
}
@@ -164,7 +150,6 @@ pub fn setup_event_listeners(
#[cfg(target_arch = "wasm32")]
pub struct WebAppRuntime {
worker: MainWorker,
worker_chan: Sender<WindowEvent>,
_event_listeners: EventListeners,
ring: Box<CommandRing>,
}
@@ -199,17 +184,11 @@ impl WebAppRuntime {
Ok(Self {
worker,
worker_chan: sender,
_event_listeners: event_listeners,
ring,
})
}
/// Access the worker channel sender for dispatching custom window events.
pub fn sender(&self) -> &Sender<WindowEvent> {
&self.worker_chan
}
/// Access the spawned worker reference.
pub fn worker(&self) -> &MainWorker {
&self.worker
@@ -218,33 +197,3 @@ impl WebAppRuntime {
self.ring.ptr()
}
}
/// Trait for applications that rely on the renderer's default WASM setup.
#[cfg(target_arch = "wasm32")]
pub trait WebApp {
type Scene: crate::renderer::scene::Scene + 'static;
/// Name used for the spawned `MainWorker`.
fn worker_name() -> &'static str {
"main-worker"
}
/// CSS selector for the canvas element that will be transferred to the worker.
fn canvas_selector() -> &'static str {
"#canvas0"
}
/// Hook invoked after the runtime has been created.
fn on_runtime_initialized(_runtime: &mut WebAppRuntime) {}
/// Perform the default WASM initialization routine.
fn setup_runtime(profile: bool) -> Result<WebAppRuntime, JsValue> {
let mut runtime = WebAppRuntime::new::<Self::Scene>(
Self::worker_name(),
Self::canvas_selector(),
profile,
)?;
Self::on_runtime_initialized(&mut runtime);
Ok(runtime)
}
}
+1 -7
View File
@@ -6,11 +6,5 @@ pub fn get_canvas_element(selectors: &str) -> web_sys::HtmlCanvasElement {
let window = web_sys::window().unwrap();
let document = window.document().unwrap();
let element = document.query_selector(selectors).unwrap().unwrap();
let canvas = element.dyn_into::<web_sys::HtmlCanvasElement>().unwrap();
let scale_factor = window.device_pixel_ratio();
let width = (canvas.client_width() as f64 * scale_factor) as u32;
let height = (canvas.client_height() as f64 * scale_factor) as u32;
canvas.set_width(width);
canvas.set_height(height);
canvas
element.dyn_into::<web_sys::HtmlCanvasElement>().unwrap()
}
@@ -2,8 +2,6 @@
// Works for any application because the relative depth from this file to pkg is stable.
import initWasm, { clear_payloads, discard_payload, stage_payload, worker_entrypoint } from "/level-editor/pkg/level_editor.js";
export function attachMain() {}
export function listenerReady() {
if (state !== "waiting-listener") return;
state = "replaying";
-4
View File
@@ -20,10 +20,6 @@ extern "C" {
/// So that bundler can bundle it together.
#[wasm_bindgen(module = "/src/platform/web/worker/mainWorker.js")]
extern "C" {
/// Nothing to do.
#[wasm_bindgen]
fn attachMain();
#[wasm_bindgen(js_name = "listenerReady")]
fn listener_ready();
}