Async Executor
Uruchamiaj VM asynchronicznie, aby klucz deszyfrujący kod bajtowy mógł być pobierany w czasie wykonania zamiast trafiać do paczki.
Opcja vmAsyncExecutor włącza asynchroniczny executor VM. Jej najważniejszą zaletą jest to, że vmBytecodeArrayEncodingKeyGetter może teraz zwracać obiekt Promise — jako asynchroniczny getter klucza — dzięki czemu klucz deszyfrujący może pochodzić z żądania sieciowego, z IndexedDB lub z dowolnego źródła asynchronicznego podczas ładowania, zamiast być dostępny synchronicznie w momencie pierwszego uruchomienia kodu.
Kompletną instrukcję pobierania klucza z backendu zawiera przepis Pobieranie klucza tablicy kodu bajtowego z backendu.
Kiedy jej używać
Zdecydowanie zalecana dla w pełni asynchronicznych baz kodu. W tym trybie wirtualizowane są wyłącznie funkcje async — funkcji synchronicznej nie da się uczynić asynchroniczną bez zamiany jej wartości zwracanej na Promise, co zepsułoby kod ją wywołujący — więc kod asynchroniczny na wskroś objęty zostaje ochroną w największym stopniu. Opcja działa również wtedy, gdy poziom główny jest synchroniczny (na przykład synchroniczne IIFE lub wrapper UMD): chronione są najbardziej zewnętrzne funkcje async znajdujące się w środku, a części synchroniczne pozostają bez zmian.
Co jest przekształcane
Każda najbardziej zewnętrzna funkcja async, niezależnie od tego, gdzie się pojawia (również zagnieżdżona w synchronicznych wrapperach). Najbardziej zewnętrzna funkcja async w każdym łańcuchu stanowi chronioną jednostkę — wszystko, co znajduje się w jej wnętrzu, synchroniczne i asynchroniczne, zostaje skompilowane razem z nią. Funkcje synchroniczne oraz zwykłe generatory pozostają niezobfuskowane.
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
}
}
Pominięcia i ostrzeżenia
Generatory asynchroniczne również pozostają niezobfuskowane, gdy aktywny jest asynchroniczny getter klucza — generator asynchroniczny musi zwrócić swój iterator synchronicznie i nie może czekać na klucz. W domyślnym trybie vmTargetFunctionsMode: 'root' pominięcia są ciche (wybór odbywa się automatycznie). W trybie 'comment' ostrzeżenie zgłaszane jest przez ObfuscationResult.getWarnings() za każdym razem, gdy jawnie oznaczonej funkcji nie da się zwirtualizować — bo okazała się synchroniczna albo jest generatorem asynchronicznym przy asynchronicznym getterze klucza. Ostrzeżenia te (VMSyncFunctionSkippedInAsyncMode, VMAsyncGeneratorSkippedInAsyncMode) można wyciszać osobno dla każdego typu za pomocą opcji warnings (v7.8.0+).
Wymagania
- Asynchroniczny getter klucza wymaga włączenia
vmBytecodeArrayEncodingwraz zvmBytecodeArrayEncodingKeyGetter. - Obfuskator w wersji 7.3.0 lub nowszej.
Przykład
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())'
});
