mod executor;
mod runtime;
mod waker;
use std::future::Future;
use executor::ThreadNotifyRef;
use napi::Env;
use napi::JsUnknown;
use waker::LocalWaker;
use waker::WakerEvent;
use self::runtime::LocalRuntime;
pub fn spawn_async_local(
env: &Env,
future: impl Future + 'static,
) -> napi::Result<()> {
LocalRuntime::queue_future(future);
if LocalRuntime::futures_count() > 1 {
return Ok(());
}
let jsfn = env.create_function_from_closure::<Vec<JsUnknown>, _>("", |_| Ok(vec![]))?;
LocalWaker::send(WakerEvent::Init(
env.create_threadsafe_function::<ThreadNotifyRef, Vec<JsUnknown>, _>(&jsfn, 0, |ctx| {
let thread_notify = ctx.value;
let done = LocalRuntime::run_until_stalled(thread_notify);
if done {
LocalWaker::send(WakerEvent::Done);
} else {
LocalWaker::send(WakerEvent::Next);
}
Ok(vec![])
})?,
));
Ok(())
}