非同期エグゼキュータ
VM を非同期で実行し、バイトコードの復号キーをバンドルに同梱せず実行時に取得できるようにします。
vmAsyncExecutor オプションは非同期の VM エグゼキュータを有効にします。その最大の利点は、vmBytecodeArrayEncodingKeyGetter が Promise を返せるようになること、すなわち 非同期キーゲッター です。これにより復号キーは、コードが最初に実行される時点で同期的に利用可能である必要がなくなり、読み込み時にネットワークリクエスト、IndexedDB、あるいは任意の非同期ソースから取得できるようになります。
バックエンドからキーを取得する手順の完全な解説は、レシピ バックエンドからバイトコード配列キーを取得する を参照してください。
使いどころ
完全に非同期のコードベースには強く推奨されます。 このモードでは async 関数のみが仮想化されます。同期関数は、戻り値を Promise に変えて呼び出し側を壊すことなく非同期化することはできないため、コード全体が async になっているものが最も広くカバーされます。ルートが同期の場合(例えば同期の IIFE や UMD ラッパー)でも機能します。その内部にある最も外側の async 関数が保護され、同期部分はそのまま残ります。
変換されるもの
最も外側の async 関数すべてが対象です(同期ラッパーの内部にネストされたものも含みます)。各チェーンにおける最も外側の async が保護の単位であり、その内部にあるものは同期・非同期を問わずすべてコンパイルに取り込まれます。同期関数と通常のジェネレータは難読化されずに残ります。
function foo() { // sync — left as-is
function bar() {} // sync — left as-is
async function baz() { // transformed
// any code here, including calls to other async or sync functions
}
async function bark() { // transformed
// any code here, including calls to other async or sync functions
}
}
スキップと警告
非同期キーゲッターが有効な場合、async ジェネレータも難読化されずに残ります。async ジェネレータはイテレータを同期的に返さなければならず、キーを待つことができないためです。デフォルトの vmTargetFunctionsMode: 'root' ではスキップは無言で行われます(選択は自動です)。'comment' モードでは、明示的にマークした関数が仮想化できない場合(同期関数であることが判明した場合や、非同期キーゲッター下の async ジェネレータであった場合)に、ObfuscationResult.getWarnings() を通じて警告が発行されます。これらの警告(VMSyncFunctionSkippedInAsyncMode、VMAsyncGeneratorSkippedInAsyncMode)は、warnings オプション(v7.8.0 以降)を使ってタイプごとに抑制できます。
要件
- 非同期キーゲッターには、
vmBytecodeArrayEncodingとvmBytecodeArrayEncodingKeyGetterの両方が必要です。 - 難読化ツールのバージョン 7.3.0 以降。
例
JavaScriptObfuscator.obfuscate(code, {
vmObfuscation: true,
vmAsyncExecutor: true,
vmBytecodeArrayEncoding: true,
vmBytecodeArrayEncodingKey: 'mySecretKey123',
// the key getter may now return a Promise
vmBytecodeArrayEncodingKeyGetter: 'fetch("/vm-key").then((res) => res.text())'
});
