wasm: enable JSPI

PR-URL: https://github.com/nodejs/node/pull/59941
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
This commit is contained in:
Guy Bedford 2025-09-19 17:05:34 -07:00
parent 81af7b93c5
commit 4396cf2d45
3 changed files with 47 additions and 0 deletions

View File

@ -782,6 +782,9 @@ static ExitCode ProcessGlobalArgsInternal(std::vector<std::string>* args,
v8_args.emplace_back("--js-source-phase-imports");
// WebAssembly JS Promise Integration
v8_args.emplace_back("--experimental-wasm-jspi");
#ifdef __POSIX__
// Block SIGPROF signals when sleeping in epoll_wait/kevent/etc. Avoids the
// performance penalty of frequent EINTR wakeups when the profiler is running.

BIN
test/fixtures/wasm/jspi.wasm vendored Normal file

Binary file not shown.

View File

@ -0,0 +1,44 @@
import '../common/index.mjs';
import { strictEqual } from 'node:assert';
import { readSync } from '../common/fixtures.mjs';
// Test Wasm JSPI
{
const asyncImport = async (x) => {
await new Promise((resolve) => setTimeout(resolve, 10));
return x + 42;
};
/**
* wasm/jspi.wasm contains:
*
* (module
* (type (;0;) (func (param i32) (result i32)))
* (import "js" "async" (func $async (;0;) (type 0)))
* (export "test" (func $test))
* (func $test (;1;) (type 0) (param $x i32) (result i32)
* local.get $x
* call $async
* )
* )
*
* Which is the JS equivalent to:
*
* import { async_ } from 'js';
* export function test (val) {
* return async_(val);
* }
*
* JSPI then allows turning this sync style Wasm call into async code
* that suspends on the promise.
*/
const { instance } = await WebAssembly.instantiate(readSync('wasm/jspi.wasm'), {
js: {
async: new WebAssembly.Suspending(asyncImport),
},
});
const promisingExport = WebAssembly.promising(instance.exports.test);
strictEqual(await promisingExport(10), 52);
}