WebAssembly JavaScript Promise 統合(JSPI)のオリジン トライアルの開始

JavaScript Promise Integration(JSPI)は、WebAssembly にコンパイルされた同期シーケンシャル コードが非同期ウェブ API にアクセスできるようにする API です。ウェブ 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 を参照)をお待ちしています。この機能がリリースされたときに、お客様のニーズに応えることができます。