diff --git a/examples/webworker-gloo/Cargo.lock b/examples/webworker-gloo/Cargo.lock new file mode 100644 index 00000000..778884d9 --- /dev/null +++ b/examples/webworker-gloo/Cargo.lock @@ -0,0 +1,317 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "anymap2" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d301b3b94cb4b2f23d7917810addbbaff90738e0ca2be692bd027e70d7e0330c" + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bumpalo" +version = "3.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a45a46ab1f2412e53d3a0ade76ffad2025804294569aae387231a0cd6e0899" + +[[package]] +name = "cfg-if" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "console_error_panic_hook" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" +dependencies = [ + "cfg-if 1.0.0", + "wasm-bindgen", +] + +[[package]] +name = "gloo-console" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3907f786f65bbb4f419e918b0c5674175ef1c231ecda93b2dbd65fd1e8882637" +dependencies = [ + "js-sys", + "serde", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "gloo-utils" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05c77af6f96a4f9e27c8ac23a88407381a31f4a74c3fb985c85aa79b8d898136" +dependencies = [ + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "gloo-worker" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c843b9a46d07485026f030be7bd008580a12a2920fea837745a440a3b0c97cb" +dependencies = [ + "anymap2", + "bincode", + "gloo-console", + "gloo-utils", + "js-sys", + "serde", + "slab", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "itoa" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" + +[[package]] +name = "js-sys" +version = "0.3.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a38fc24e30fd564ce974c02bf1d337caddff65be6cc4735a1f7eab22a7440f04" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bf2e165bb3457c8e098ea76f3e3bc9db55f87aa90d52d0e6be741470916aaa4" + +[[package]] +name = "log" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" +dependencies = [ + "cfg-if 1.0.0", +] + +[[package]] +name = "memory_units" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8452105ba047068f40ff7093dd1d9da90898e63dd61736462e9cdda6a90ad3c3" + +[[package]] +name = "proc-macro2" +version = "1.0.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7342d5883fbccae1cc37a2353b09c87c9b0f3afd73f5fb9bba687a1f733b029" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "quote" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "864d3e96a899863136fc6e99f3d7cae289dafe43bf2c5ac19b70df7210c0a145" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "ryu" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f" + +[[package]] +name = "serde" +version = "1.0.136" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce31e24b01e1e524df96f1c2fdd054405f8d7376249a5110886fb4b658484789" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.136" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08597e7152fcd306f41838ed3e37be9eaeed2b61c42e2117266a554fab4662f9" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e8d9fa5c3b304765ce1fd9c4c8a3de2c8db365a5b91be52f186efc675681d95" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "slab" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9def91fd1e018fe007022791f865d0ccc9b3a0d5001e01aabb8b40e46000afb5" + +[[package]] +name = "syn" +version = "1.0.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a65b3f4ffa0092e9887669db0eae07941f023991ab58ea44da8fe8e2d511c6b" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "unicode-xid" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" + +[[package]] +name = "wasm-bindgen" +version = "0.2.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25f1af7423d8588a3d840681122e72e6a24ddbcb3f0ec385cac0d12d24256c06" +dependencies = [ + "cfg-if 1.0.0", + "serde", + "serde_json", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b21c0df030f5a177f3cba22e9bc4322695ec43e7257d865302900290bcdedca" +dependencies = [ + "bumpalo", + "lazy_static", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f4203d69e40a52ee523b2529a773d5ffc1dc0071801c87b3d270b471b80ed01" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa8a30d46208db204854cadbb5d4baf5fcf8071ba5bf48190c3e59937962ebc" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d958d035c4438e28c70e4321a2911302f10135ce78a9c7834c0cab4123d06a2" + +[[package]] +name = "web-sys" +version = "0.3.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c060b319f29dd25724f09a2ba1418f142f539b2be99fbf4d2d5a8f7330afb8eb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webworker-gloo" +version = "0.1.0" +dependencies = [ + "console_error_panic_hook", + "gloo-worker", + "wasm-bindgen", + "web-sys", + "wee_alloc", +] + +[[package]] +name = "wee_alloc" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbb3b5a6b2bb17cb6ad44a2e68a43e8d2722c997da10e928665c72ec6c0a0b8e" +dependencies = [ + "cfg-if 0.1.10", + "libc", + "memory_units", + "winapi", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/examples/webworker-gloo/Cargo.toml b/examples/webworker-gloo/Cargo.toml new file mode 100644 index 00000000..7e679450 --- /dev/null +++ b/examples/webworker-gloo/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "webworker-gloo" +version = "0.1.0" +edition = "2021" + +[dependencies] +console_error_panic_hook = "0.1.7" +gloo-worker = "0.1.0" +wasm-bindgen = "0.2.79" +web-sys = { version = "0.3.56", features = ["console"] } +wee_alloc = "0.4.5" diff --git a/examples/webworker-gloo/index.html b/examples/webworker-gloo/index.html new file mode 100644 index 00000000..dd88b1ce --- /dev/null +++ b/examples/webworker-gloo/index.html @@ -0,0 +1,14 @@ + + + + + + Trunk | Web worker | Gloo + + + + + + + + \ No newline at end of file diff --git a/examples/webworker-gloo/src/bin/app.rs b/examples/webworker-gloo/src/bin/app.rs new file mode 100644 index 00000000..ba1d99d4 --- /dev/null +++ b/examples/webworker-gloo/src/bin/app.rs @@ -0,0 +1,20 @@ +use std::rc::Rc; + +use gloo_worker::Bridged; +use webworker_gloo::Multiplier; + +#[global_allocator] +static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT; + +fn main() { + console_error_panic_hook::set_once(); + + let bridge = Multiplier::bridge(Rc::new(Box::new(|((a, b), result)| { + web_sys::console::log_1(&format!("{a} x {b} = {result}").into()); + }))); + let bridge = Box::leak(bridge); + + bridge.send((2, 5)); + bridge.send((3, 3)); + bridge.send((50, 5)); +} diff --git a/examples/webworker-gloo/src/bin/worker.rs b/examples/webworker-gloo/src/bin/worker.rs new file mode 100644 index 00000000..6c38a2aa --- /dev/null +++ b/examples/webworker-gloo/src/bin/worker.rs @@ -0,0 +1,11 @@ +use gloo_worker::PublicWorker; +use webworker_gloo::Multiplier; + +#[global_allocator] +static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT; + +fn main() { + console_error_panic_hook::set_once(); + + Multiplier::register(); +} diff --git a/examples/webworker-gloo/src/lib.rs b/examples/webworker-gloo/src/lib.rs new file mode 100644 index 00000000..9c1ddc58 --- /dev/null +++ b/examples/webworker-gloo/src/lib.rs @@ -0,0 +1,26 @@ +use gloo_worker::{HandlerId, Public, Worker, WorkerLink}; + +pub struct Multiplier { + link: WorkerLink, +} + +impl Worker for Multiplier { + type Input = (u64, u64); + type Message = (); + type Output = ((u64, u64), u64); + type Reach = Public; + + fn create(link: WorkerLink) -> Self { + Self { link } + } + + fn update(&mut self, _msg: Self::Message) {} + + fn handle_input(&mut self, msg: Self::Input, id: HandlerId) { + self.link.respond(id, (msg, msg.0 * msg.1)); + } + + fn name_of_resource() -> &'static str { + "worker.js" + } +} diff --git a/examples/webworker/Cargo.lock b/examples/webworker/Cargo.lock index b4309cd8..57924cc2 100644 --- a/examples/webworker/Cargo.lock +++ b/examples/webworker/Cargo.lock @@ -32,9 +32,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.51" +version = "0.3.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83bdfbace3a0e81a4253f73b49e960b053e396a11012cbd49b9b74d6a2b67062" +checksum = "a38fc24e30fd564ce974c02bf1d337caddff65be6cc4735a1f7eab22a7440f04" dependencies = [ "wasm-bindgen", ] @@ -103,9 +103,9 @@ checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" [[package]] name = "wasm-bindgen" -version = "0.2.74" +version = "0.2.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54ee1d4ed486f78874278e63e4069fc1ab9f6a18ca492076ffb90c5eb2997fd" +checksum = "25f1af7423d8588a3d840681122e72e6a24ddbcb3f0ec385cac0d12d24256c06" dependencies = [ "cfg-if 1.0.0", "wasm-bindgen-macro", @@ -113,9 +113,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.74" +version = "0.2.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b33f6a0694ccfea53d94db8b2ed1c3a8a4c86dd936b13b9f0a15ec4a451b900" +checksum = "8b21c0df030f5a177f3cba22e9bc4322695ec43e7257d865302900290bcdedca" dependencies = [ "bumpalo", "lazy_static", @@ -128,9 +128,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.74" +version = "0.2.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "088169ca61430fe1e58b8096c24975251700e7b1f6fd91cc9d59b04fb9b18bd4" +checksum = "2f4203d69e40a52ee523b2529a773d5ffc1dc0071801c87b3d270b471b80ed01" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -138,9 +138,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.74" +version = "0.2.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be2241542ff3d9f241f5e2cb6dd09b37efe786df8851c54957683a49f0987a97" +checksum = "bfa8a30d46208db204854cadbb5d4baf5fcf8071ba5bf48190c3e59937962ebc" dependencies = [ "proc-macro2", "quote", @@ -151,15 +151,15 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.74" +version = "0.2.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7cff876b8f18eed75a66cf49b65e7f967cb354a7aa16003fb55dbfd25b44b4f" +checksum = "3d958d035c4438e28c70e4321a2911302f10135ce78a9c7834c0cab4123d06a2" [[package]] name = "web-sys" -version = "0.3.51" +version = "0.3.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e828417b379f3df7111d3a2a9e5753706cae29c41f7c4029ee9fd77f3e09e582" +checksum = "c060b319f29dd25724f09a2ba1418f142f539b2be99fbf4d2d5a8f7330afb8eb" dependencies = [ "js-sys", "wasm-bindgen", @@ -170,6 +170,7 @@ name = "webworker-example" version = "0.1.0" dependencies = [ "console_error_panic_hook", + "js-sys", "wasm-bindgen", "web-sys", "wee_alloc", diff --git a/examples/webworker/Cargo.toml b/examples/webworker/Cargo.toml index 13dadcf8..eaae4ca4 100644 --- a/examples/webworker/Cargo.toml +++ b/examples/webworker/Cargo.toml @@ -6,8 +6,24 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -console_error_panic_hook = "0.1" -web-sys = { version = "0.3", features = ["Window", "Location", "Document", "HtmlElement", "Node", "Text", "Worker", "DedicatedWorkerGlobalScope"] } -wasm-bindgen = "=0.2.74" -wee_alloc = "0.4" -js-sys = "0.3.55" +console_error_panic_hook = "0.1.7" +web-sys = { version = "0.3.56", features = [ + "Blob", + "BlobPropertyBag", + "console", + "MessageEvent", + "Url", + + + "Window", + "Location", + "Document", + "HtmlElement", + "Node", + "Text", + "Worker", + "DedicatedWorkerGlobalScope", +] } +wasm-bindgen = "=0.2.79" +wee_alloc = "0.4.5" +js-sys = "=0.3.56" diff --git a/examples/webworker/index.html b/examples/webworker/index.html index a6798157..06280324 100644 --- a/examples/webworker/index.html +++ b/examples/webworker/index.html @@ -1,17 +1,14 @@ - - - - - Trunk | Web worker - - - - - - - - - + + + + Trunk | WebWorker | Vanilla + + + + + + + \ No newline at end of file diff --git a/examples/webworker/src/bin/app.rs b/examples/webworker/src/bin/app.rs index 1c281688..6f04b683 100644 --- a/examples/webworker/src/bin/app.rs +++ b/examples/webworker/src/bin/app.rs @@ -1,24 +1,50 @@ -#![recursion_limit = "1024"] +use js_sys::Array; +use wasm_bindgen::{prelude::*, JsCast}; +use web_sys::{window, Blob, BlobPropertyBag, MessageEvent, Url, Worker}; #[global_allocator] static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT; -use console_error_panic_hook::set_once as set_panic_hook; -use web_sys::{window, Worker}; +fn worker_new(name: &str) -> Worker { + let origin = window() + .expect("window to be available") + .location() + .origin() + .expect("origin to be available"); -fn worker_new(file_name: &str) -> Worker { - let origin = window().unwrap().location().origin().unwrap(); - let url = format!("{}/{}", origin, file_name); + let script = Array::new(); + script.push(&format!(r#"importScripts("{origin}/{name}.js");wasm_bindgen("{origin}/{name}_bg.wasm");"#).into()); + + let blob = Blob::new_with_str_sequence_and_options(&script, BlobPropertyBag::new().type_("text/javascript")).expect("blob creation succeeds"); + + let url = Url::create_object_url_with_blob(&blob).expect("url creation succeeds"); Worker::new(&url).expect("failed to spawn worker") } fn main() { - set_panic_hook(); - let document = window().and_then(|win| win.document()).expect("Could not access document"); - let body = document.body().expect("Could not access document.body"); - let text_node = document.create_text_node("Hello, world from Rust!"); - body.append_child(text_node.as_ref()).expect("Failed to append text"); + console_error_panic_hook::set_once(); + + let worker = worker_new("worker"); + let worker_clone = worker.clone(); + + let onmessage = Closure::wrap(Box::new(move |msg: MessageEvent| { + let worker_clone = worker_clone.clone(); + let data = Array::from(&msg.data()); + + if data.length() == 0 { + let msg = Array::new(); + msg.push(&2.into()); + msg.push(&5.into()); + worker_clone.post_message(&msg.into()).expect("sending message to succeed"); + } else { + let a = data.get(0).as_f64().expect("first array value to be a number") as u32; + let b = data.get(1).as_f64().expect("second array value to be a number") as u32; + let result = data.get(2).as_f64().expect("third array value to be a number") as u32; - let worker = worker_new("worker.js"); + web_sys::console::log_1(&format!("{a} x {b} = {result}").into()); + } + }) as Box); + worker.set_onmessage(Some(onmessage.as_ref().unchecked_ref())); + onmessage.forget(); } diff --git a/examples/webworker/src/bin/worker.rs b/examples/webworker/src/bin/worker.rs index f328e4d9..71176c19 100644 --- a/examples/webworker/src/bin/worker.rs +++ b/examples/webworker/src/bin/worker.rs @@ -1 +1,33 @@ -fn main() {} +use js_sys::Array; +use wasm_bindgen::{prelude::*, JsCast}; +use web_sys::{DedicatedWorkerGlobalScope, MessageEvent}; + +#[global_allocator] +static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT; + +fn main() { + console_error_panic_hook::set_once(); + web_sys::console::log_1(&"worker starting".into()); + + let scope = DedicatedWorkerGlobalScope::from(JsValue::from(js_sys::global())); + let scope_clone = scope.clone(); + + let onmessage = Closure::wrap(Box::new(move |msg: MessageEvent| { + web_sys::console::log_1(&"got message".into()); + + let data = Array::from(&msg.data()); + let a = data.get(0).as_f64().expect("first array value to be a number") as u32; + let b = data.get(1).as_f64().expect("second array value to be a number") as u32; + + data.push(&(a * b).into()); + scope_clone + .post_message(&data.into()) + .expect("posting result message succeeds"); + }) as Box); + scope.set_onmessage(Some(onmessage.as_ref().unchecked_ref())); + onmessage.forget(); + + scope + .post_message(&Array::new().into()) + .expect("posting ready message succeeds"); +} diff --git a/src/pipelines/rust.rs b/src/pipelines/rust.rs index c9f2f6b1..c9144a76 100644 --- a/src/pipelines/rust.rs +++ b/src/pipelines/rust.rs @@ -241,6 +241,13 @@ impl RustApp { #[tracing::instrument(level = "trace", skip(self, wasm, hashed_name))] async fn wasm_bindgen_build(&self, wasm: &Path, hashed_name: &str) -> Result { + // Skip the hashed file name for workers as their file name must be named at runtime. + // Therefore, workers use the Cargo binary name for file naming. + let hashed_name = match self.app_type { + RustAppType::Main => hashed_name, + RustAppType::Worker => &self.name, + }; + let version = find_wasm_bindgen_version(&self.cfg.tools, &self.manifest); let wasm_bindgen = tools::get(Application::WasmBindgen, version.as_deref()).await?; @@ -441,6 +448,8 @@ pub fn pattern_evaluate(template: &str, params: &HashMap) -> Str impl RustAppOutput { pub async fn finalize(self, dom: &mut Document) -> Result<()> { if self.type_ == RustAppType::Worker { + // Skip the script tag and preload links for workers, and remove the link tag only. + // Workers are intialized and managed by the app itself at runtime. if let Some(id) = self.id { dom.select(&super::trunk_id_selector(id)).remove(); }