napi_async_local 0.2.0

Extends napi-rs with the ability to run local futures
Documentation
use futures::Future;
use napi::Env;
use napi::JsObject;
use napi::NapiValue;

use crate::runtime;
use crate::utils::UtilsExt;

pub fn spawn_local<F, Fut>(
  env: &Env,
  callback: F,
) -> napi::Result<()>
where
  F: FnOnce(Env) -> Fut + 'static,
  Fut: Future<Output = napi::Result<()>> + 'static,
{
  let future = callback(env.to_owned());

  runtime::spawn_async_local(&env, async move {
    if let Err(error) = future.await {
      eprintln!("Uncaught Napi Error: {}", error);
    };
  })?;

  Ok(())
}

pub fn spawn_local_promise<R, F, Fut>(
  env: &Env,
  callback: F,
) -> napi::Result<JsObject>
where
  R: NapiValue + 'static,
  F: FnOnce(Env) -> Fut + 'static,
  Fut: Future<Output = napi::Result<R>> + 'static,
{
  env.create_promise(Box::new(move |env, resolve_func, reject_func| {
    let future = callback(env);
    runtime::spawn_async_local(&env, async move {
      match future.await {
        Ok(result) => resolve_func(result),
        Err(error) => reject_func(error),
      };
    })
  }))
}