JavaScript Promise Integration(JSPI)は、WebAssembly にコンパイルされた同期シーケンシャル コードが非同期 Web API にアクセスできるようにする API です。多くの Web API は JavaScript のPromise で作成されています。リクエストされたオペレーションをすぐに実行するのではなく、実行する Promise を返します。アクションが最終的に実行されると、ブラウザのタスクランナーが Promise を使用してコールバックを呼び出します。JSPI はこのアーキテクチャにフックし、Promise が返されたときに WebAssembly アプリケーションを一時停止し、Promise が解決されたときに再開できるようにします。
Chrome 123 ~ Chrome 128 では、JSPI をオリジン トライアルとして使用できます。JSPI の詳細については、WebAssembly JavaScript Promise Integration API のご紹介のブログ投稿または仕様ドラフトをご覧ください。
この機能の使用方法を詳しく理解するには、加算を JavaScript 関数にアウトソースしてフィボナッチ数列を計算する C プログラムの抜粋を以下に示します。
// This is C code.
long promiseFib(long x) {
if (x == 0)
return 0;
if (x == 1)
return 1;
// This is where the C code calls asynchronous JavaScript.
return promiseAdd(promiseFib(x - 1), promiseFib(x - 2));
}
// Addition artificially wrapped in a Promise.
EM_ASYNC_JS(long, promiseAdd, (long x, long y), {
// This is asynchronous JavaScript code.
return Promise.resolve(x+y);
});
この C プログラムを WebAssembly にコンパイルするには、次のコマンドを使用します。これには Emscripten SDK が必要です。
emcc -O3 badfib.c -o index.html -s ASYNCIFY=2
JavaScript から JSPI のサポートを機能検出するには、次のようにします。
if ('Suspender' in WebAssembly) {
// JSPI is supported.
}
上記のコードサンプルの JSPI のデモは、Glitch で利用可能で、以下にも埋め込まれています。必要に応じて、Emscripten によって生成されたソースコードを確認できますが、実際に興味深いコードは元の C プログラムです(このリンクをクリックするとコードがダウンロードされます)。
アプリケーションの実際のユーザーで JSPI を試すには、オリジン トライアルに登録してください。手順が必要な場合は、オリジン トライアルの開始をご覧ください。JSPI チームは、この機能がリリースされたときにお客様のニーズに合うように、オリジン トライアルのフィードバック(手順のステップ 5 を参照)をお待ちしております。