🦘

Rustで書いた処理をNode.jsで呼び出す

2021/11/27に公開

napi-rsでNode-APIを使ったネイティブAdd-onを作成します。

Getting started | napi-rs Docs

npm i -g @napi-rs/cli
napi new mynapi

自動で動作可能なコードが生成されます。sleep関数を見てみます

src/lib.rs
#[js_function(1)]
fn sleep(ctx: CallContext) -> Result<JsObject> {
  let argument: u32 = ctx.get::<JsNumber>(0)?.try_into()?;
  let task = AsyncTask(argument);
  let async_task = ctx.env.spawn(task)?;
  Ok(async_task.promise_object())
}

これをJavaScript側で呼び出したいので、コンパイルします。

npm run build

mynapi.darwin-arm64.node が生成されました

index.jsがJSモジュールとしてのエントリーポイントで、このように今コンパイルしたバイナリがロードされいます

const { loadBinding } = require('@node-rs/helper')

module.exports = loadBinding(__dirname, 'mynapi', 'mynapi')

自分のプログラムから呼び出して使ってみます

example.js
const {sleep} = require('./index.js');

(async () => {
    await sleep(1000)
    console.log('1 sec')
    await sleep(3000)
    console.log('3 sec')
})()

sleepが動作することが確認できました

node example.js 
1 sec
3 sec

この次は

Rustで書いたコードをNode.jsから呼び出せるようになったので、いろいろなcrateを入れて拡張していきます。

JavaScriptとの値の受け渡し仕様はドキュメントにあります
https://napi.rs/concepts/env

背景にあるNode-APIのドキュメント
https://nodejs.org/api/n-api.html

Discussion