use std::panic::AssertUnwindSafe;
use wasm_bindgen::prelude::*;
use crate::util::{
DispatchReceiver, SignalReceiver, SignalSender, ThreadProc, ValueSender, WorkerPanic,
js_arg_vec, js_type, raw_ptr_type,
};
#[doc(hidden)]
#[wasm_bindgen(skip_typescript)]
pub fn __pistonite_wbgspawn_worker_main(
moves_f: raw_ptr_type!(ThreadProc),
maybe_moves_send: raw_ptr_type!(ValueSender),
moves_start: raw_ptr_type!(SignalSender),
) -> js_type!(Promise<void>) {
__unsafe_pistonite_wbgspawn_send_signal(moves_start);
let f: Box<ThreadProc> = unsafe { from_js(moves_f as *mut ThreadProc) };
crate::runtime::thread_main(f, maybe_moves_send)
}
#[doc(hidden)]
#[wasm_bindgen(skip_typescript)]
pub fn __unsafe_pistonite_wbgspawn_send_panic(moves_send: raw_ptr_type!(ValueSender)) {
let send = unsafe { ValueSender::from_raw(moves_send) };
let _ = send.send(Err(WorkerPanic { payload: None }));
}
#[doc(hidden)]
#[wasm_bindgen(skip_typescript)]
pub fn __unsafe_pistonite_wbgspawn_send_signal(moves_signal: raw_ptr_type!(SignalSender)) {
let send = unsafe { SignalSender::from_raw(moves_signal) };
let _ = send.send(());
}
#[doc(hidden)]
#[wasm_bindgen(skip_typescript)]
pub fn __unsafe_pistonite_wbgspawn_poll_signal(
maybe_moves_signal: raw_ptr_type!(SignalReceiver),
) -> Option<bool> {
let recv = unsafe { SignalReceiver::from_raw(maybe_moves_signal) };
let result = recv.try_recv();
match result {
Err(oneshot::TryRecvError::Empty) => {
let _ = recv.into_raw();
Some(false)
}
Err(oneshot::TryRecvError::Disconnected) => {
let _ = recv.into_raw();
None
}
_ => {
drop(recv);
Some(true)
}
}
}
#[doc(hidden)]
#[wasm_bindgen(skip_typescript)]
pub fn __pistonite_wbgspawn_dispatch_recv(
borrows_recv: *mut DispatchReceiver,
) -> js_type!(Promise<Option<DispatchThreadRequest>>) {
js_sys::futures::future_to_promise(AssertUnwindSafe(async move {
let recv: &mut DispatchReceiver = unsafe { borrows_recv.as_mut().unwrap_unchecked() };
let (closure, sender) = match recv.recv().await {
Some(v) => v,
None => return Ok(JsValue::undefined()),
};
let (start_send, start_recv) = oneshot::channel::<()>();
let request = js_arg_vec! {
[
f_ptr: raw_ptr_type!(ThreadProc) = into_js::<ThreadProc>(closure) as *mut (),
sender_ptr: raw_ptr_type!(ValueSender) = sender.into_raw(),
start_send_ptr: raw_ptr_type!(SignalSender) = start_send.into_raw(),
start_recv_ptr: raw_ptr_type!(SignalReceiver) = start_recv.into_raw(),
] as DispatchThreadRequest
};
Ok(request.into())
}))
.into()
}
#[doc(hidden)]
#[wasm_bindgen(skip_typescript)]
pub fn __pistonite_wbgspawn_dispatch_drop(moves_recv: *mut DispatchReceiver) {
let recv: Box<DispatchReceiver> = unsafe { from_js(moves_recv) };
drop(recv);
}
pub fn into_js<T>(value: T) -> *mut T {
Box::into_raw(Box::new(value))
}
pub unsafe fn from_js<T>(nonnull_ptr: *mut T) -> Box<T> {
unsafe { Box::from_raw(nonnull_ptr) }
}