Async Executor
Запускайте VM асинхронно, чтобы ключ расшифровки байт-кода можно было получить во время выполнения, а не поставлять его внутри бандла.
Смотреть
Obfuscator.io Async Executor: Async Bytecode Key Getter and Async-Only VM Virtualization
Опция vmAsyncExecutor включает асинхронный исполнитель VM. Её главное преимущество в том, что vmBytecodeArrayEncodingKeyGetter теперь может возвращать Promise - асинхронный геттер ключа, - так что ключ расшифровки может поступать из сетевого запроса, IndexedDB или любого асинхронного источника во время загрузки, а не быть доступным синхронно при первом запуске кода.
Полный разбор получения ключа с бэкенда см. в разделе Вынос ключа для Bytecode Array Encoding.
Когда использовать
Настоятельно рекомендуется для полностью асинхронных кодовых баз. В этом режиме виртуализируются только async-функции - синхронную функцию нельзя сделать асинхронной, не превратив её возвращаемое значение в Promise и не сломав вызывающих, - поэтому код, async по всей своей структуре, получает наибольший охват. Он всё равно работает, когда корень синхронен (например, синхронный IIFE или UMD-обёртка): самые внешние async-функции внутри защищаются, а синхронные части не виртуализируются (остальная обфускация к ним по-прежнему применяется).
Что преобразуется
Каждая самая внешняя async-функция, где бы она ни встречалась (в том числе вложенная в синхронные обёртки). Самая внешняя async в каждой цепочке - это защищаемая единица; всё внутри неё, синхронное и асинхронное, компилируется в неё. Синхронные функции и обычные генераторы не виртуализируются (остальная обфускация к ним по-прежнему применяется).
Пропуски и предупреждения
Асинхронные генераторы также не виртуализируются, когда активен асинхронный геттер ключа, - асинхронный генератор должен возвращать свой итератор синхронно и не может ждать ключ. В режиме по умолчанию vmTargetFunctionsMode: 'root' пропуски происходят молча (выбор автоматический), если только не виртуализируется вообще ничего - тогда выдаётся VMNoFunctionsToVirtualize. В режиме 'comment' предупреждение выдаётся (в панели управления и в массиве warnings ответа API), когда явно помеченную вами функцию нельзя виртуализировать - она оказалась синхронной или это асинхронный генератор при асинхронном геттере ключа. Эти предупреждения (VMSyncFunctionSkippedInAsyncMode, VMAsyncGeneratorSkippedInAsyncMode) можно заглушить по типам через опцию warnings (v7.8.0+).
В режиме root vmAsyncExecutor оставляет инициализаторы переменных верхнего уровня обычным JavaScript, даже когда vmWrapTopLevelInitializers включена, и (v7.8.0+) предупреждение VMTopLevelInitializerNotVirtualized перечисляет их.
Требования
- Асинхронный геттер ключа требует
vmBytecodeArrayEncoding, аvmBytecodeArrayEncodingKeyGetterдолжен идти в паре сvmBytecodeArrayEncodingKey- обфускатор проверяет, что заданы оба (или ни один) и что геттер разбирается как выражение, и иначе отклоняет сборку. - Версия обфускатора 7.3.0 или новее.
Включение одной лишь опции просто переключает исполнитель в асинхронный режим (виртуализируются только самые внешние async-функции). Именно возврат Promise из геттера ключа разблокирует получение ключа во время выполнения, и для этого дополнительно нужна опция Bytecode Array Encoding с геттером ключа. Возвращает ли геттер Promise, нельзя проверить при сборке, поэтому геттер, возвращающий Promise, при выключенном vmAsyncExecutor падает во время выполнения - декодер получает Promise вместо ключа.
Пример
В полностью синхронной кодовой базе почти ничего не виртуализируется, поскольку подходят только async-функции. Если ваши точки входа не async, предпочтите синхронный геттер ключа и оставьте vmAsyncExecutor выключенным.
