Async Executor

Pro
v7.3.0+

Uruchamiaj VM asynchronicznie, aby klucz deszyfrujący kod bajtowy mógł być pobierany w czasie wykonania zamiast trafiać do bundle'a.

Obejrzyj

Obfuscator.io Async Executor: Async Bytecode Key Getter and Async-Only VM Virtualization

Obejrzyj na YouTube

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 strona Wyniesienie klucza Bytecode Array Encoding poza bundle.

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 nie są wirtualizowane (pozostała obfuskacja nadal jest do nich stosowana).

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 nie są wirtualizowane (pozostała obfuskacja nadal jest do nich stosowana).

JavaScript

Pominięcia i ostrzeżenia

Generatory asynchroniczne również nie są wirtualizowane, 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), chyba że nic nie zostanie zwirtualizowane - wtedy zgłaszane jest VMNoFunctionsToVirtualize. W trybie 'comment' ostrzeżenie jest zgłaszane (w panelu oraz w tablicy warnings odpowiedzi API) 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+).

W trybie root vmAsyncExecutor pozostawia inicjalizatory zmiennych najwyższego poziomu jako zwykły JavaScript, nawet gdy włączona jest opcja vmWrapTopLevelInitializers, a (v7.8.0+) ostrzeżenie VMTopLevelInitializerNotVirtualized je wymienia.

Wymagania

  • Asynchroniczny getter klucza wymaga włączenia vmBytecodeArrayEncoding, a vmBytecodeArrayEncodingKeyGetter musi występować w parze z vmBytecodeArrayEncodingKey - obfuskator sprawdza, czy obie opcje są ustawione (albo obie pominięte) i czy getter daje się sparsować jako wyrażenie, a w przeciwnym razie odrzuca build.
  • Obfuskator w wersji 7.3.0 lub nowszej.

Samo włączenie opcji przełącza jedynie executor w tryb asynchroniczny (wirtualizowane są wyłącznie najbardziej zewnętrzne funkcje async). Dopiero zwracanie obiektu Promise przez getter klucza odblokowuje pobieranie klucza w czasie wykonania, a to wymaga dodatkowo opcji Bytecode Array Encoding wraz z getterem klucza. Tego, czy getter zwraca Promise, nie da się sprawdzić w czasie budowania, więc getter zwracający Promise przy wyłączonym vmAsyncExecutor zawiedzie w czasie wykonania - dekoder otrzyma obiekt Promise zamiast klucza.

Przykład

JavaScript

W całkowicie synchronicznej bazie kodu wirtualizacji podlega niemal nic, ponieważ kwalifikują się do niej wyłącznie funkcje async. Jeśli punkty wejścia nie są asynchroniczne, lepiej użyć synchronicznego gettera klucza i pozostawić vmAsyncExecutor wyłączone.