🦘
Rustで書いた処理をNode.jsで呼び出す
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との値の受け渡し仕様はドキュメントにあります
背景にあるNode-APIのドキュメント
Discussion