Асинхронный исполнитель
Запускайте 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
}
}
Пропуски и предупреждения
Асинхронные генераторы также остаются необфусцированными, когда активен асинхронный геттер ключа, — асинхронный генератор должен возвращать свой итератор синхронно и не может ждать ключ. В режиме по умолчанию vmTargetFunctionsMode: 'root' пропуски происходят молча (выбор автоматический). В режиме 'comment' предупреждение выдаётся через 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())'
});
