use crate::ffi::web::*;
use js_sys::{global, Array};
use std::iter::FromIterator;
use web_sys::{DedicatedWorkerGlobalScope, Worker};
impl TransferClosure<JsValue> {
pub fn apply(self, worker: &Worker) -> Result<(), JsValue> {
let transfer = self.transfer.into_iter().filter(|value| value.is_truthy());
let transfer = Array::from_iter(transfer);
let data = Array::from_iter(self.data);
let payload = Box::into_raw(Box::new(TransferClosurePayload { func: self.closure }));
data.unshift(&JsValue::from(payload as i32));
worker
.post_message_with_transfer(&data, &transfer)
.map_err(|err| {
drop(unsafe { Box::from_raw(payload) });
err
})
}
}
#[wasm_bindgen]
#[allow(clippy::not_unsafe_ptr_arg_deref)]
pub fn receive_transfer_closure(
payload: *mut TransferClosurePayload<JsValue>,
transfer: Box<[JsValue]>,
) -> Result<(), JsValue> {
let closure = unsafe { Box::from_raw(payload) };
(closure.func)(&transfer);
global()
.unchecked_into::<DedicatedWorkerGlobalScope>()
.post_message(&JsValue::UNDEFINED)
}