From 348c78a98615977a044dc902f0cd72575a57293a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn?= Date: Mon, 27 Apr 2020 09:03:01 +0200 Subject: [PATCH] Sends Connected, Disconnected and Destroy messages when a private worker is loaded, and when a PrivateBridge drops. (#1146) Fixes #946 and #948. --- yew/src/agent.rs | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/yew/src/agent.rs b/yew/src/agent.rs index b43fe3c6d4c..c3ca7ab7313 100644 --- a/yew/src/agent.rs +++ b/yew/src/agent.rs @@ -451,11 +451,13 @@ pub struct Private; impl Discoverer for Private { fn spawn_or_join(callback: Option>) -> Box> { let callback = callback.expect("Callback required for Private agents"); - let handler = move |data: Vec| { + let handler = move |data: Vec, + #[cfg(feature = "std_web")] worker: Value, + #[cfg(feature = "web_sys")] worker: &Worker| { let msg = FromWorker::::unpack(&data); match msg { FromWorker::WorkerLoaded => { - // TODO(#948): Send `Connected` message + send_to_remote::(&worker, ToWorker::Connected(SINGLETON_ID)); } FromWorker::ProcessOutput(id, output) => { assert_eq!(id.raw_id(), SINGLETON_ID.raw_id()); @@ -471,13 +473,14 @@ impl Discoverer for Private { var worker = new Worker(@{name_of_resource}); var handler = @{handler}; worker.onmessage = function(event) { - handler(event.data); + handler(event.data, worker); }; return worker; }, feature = "web_sys" => ({ let worker = worker_new(name_of_resource, AGN::is_module()); - worker.set_onmessage_closure(handler); + let worker_clone = worker.clone(); + worker.set_onmessage_closure(move |data: Vec| handler(data, &worker_clone)); worker }), }; @@ -526,7 +529,11 @@ impl Bridge for PrivateBridge { impl Drop for PrivateBridge { fn drop(&mut self) { - // TODO(#946): Send `Destroy` message. + let disconnected = ToWorker::Disconnected(SINGLETON_ID); + send_to_remote::(&self.worker, disconnected); + + let destroy = ToWorker::Destroy; + send_to_remote::(&self.worker, destroy); } }