#napi #future #async #extend #local #env #run-time

napi_ext

扩展 napi-rs 以支持运行本地 futures

2 个不稳定版本

0.4.0 2024 年 7 月 31 日
0.3.0 2024 年 7 月 31 日

#239异步

Download history 254/week @ 2024-07-30

每月 254 次下载

MIT 许可证

39KB
1K SLoC

Napi 扩展

此 crate 通过以下功能扩展了 napi-rs

  • 本地 futures 运行时
  • [napi_async] 宏用于本地 futures
  • 环境变量.spawn_local_promise()
  • 环境变量.spawn_local()
  • JsPromise
  • JsRc

使用以下方式运行本地 futures:

use napi::*;
use napi_ext::*;

#[napi_async]
async fn my_js_func(env: Env, num: JsNumber) -> napi::Result<JsString> {
  task::sleep(Duration::from_millis(1000)).await;
  
  // Log number in JavaScript context
  env.console_log(&[num])?;

  // Returns Promise<String>
  env.create_string("Hello World")
}

本地线程 futures

允许在 Rust 中使用异步通道、定时器和其他异步工具,而不会阻塞主 JavaScript 线程,同时保留与底层 JavaScript 值交互的能力。

安装

使用以下命令安装 crate:

cargo add napi_ext

示例

定时器与回调

use std::time::Duration;

use napi::*;
use napi_ext::*;

#[napi_derive::napi]
fn my_js_func(env: Env, callback: JsRc<JsFunction>) -> napi::Result<JsObject> {
  env.spawn_local(move |env| async move {
    task::sleep(Duration::from_millis(1000)).await;
    callback.inner(&env)?.call_without_args(None)?;
    Ok(())
  })
}
import napi from './napi.node'

napi.myJsFunc(() => console.log('Waited for 1 second'))

通道与线程

您可以将操作系统线程与异步通道结合起来,以协调线程外的作业。

我建议使用 async_stdasync-channel 作为异步工具,因为自定义 futures 反应器与 Tokio 工具不兼容。

use std::thread;
use std::time::Duration;
 
use napi::*;
use napi_ext::*;
use async_std::channel;
 
#[napi_derive::napi]
fn my_js_func(env: Env, callback: JsRc<JsFunction>) -> napi::Result<JsObject> {
  let (tx, rx) = channel::unbounded();
 
  thread::spawn(move || {
    for i in 0..10 {
      tx.send_blocking(i).unwrap();
      thread::sleep(Duration::from_millis(1000));
    }
  });
 
  env.spawn_local(move |env| async move {
    while let Ok(value) = rx.recv().await {
      println!("Got number: {}", value);
      callback.inner(&env)?.call(None, &[env.create_int32(value)?])?;
    }
 
    Ok(())
  })
}

开发

要设置开发环境,请确保您已安装 just,然后运行

npm install
just run example-a

依赖关系

~1.5–7MB
~52K SLoC