Ejecutor asíncrono
Ejecuta la VM de forma asíncrona para que la clave de descifrado del bytecode pueda obtenerse en tiempo de ejecución en lugar de enviarse dentro del bundle.
La opción vmAsyncExecutor activa el ejecutor asíncrono de la VM. Su principal ventaja es que vmBytecodeArrayEncodingKeyGetter ahora puede devolver una Promise —un key getter asíncrono— de modo que la clave de descifrado puede provenir de una petición de red, IndexedDB o cualquier fuente asíncrona en el momento de la carga, en lugar de estar disponible de forma síncrona cuando el código se ejecuta por primera vez.
Para ver una guía completa de obtención de la clave desde el backend, consulta la receta Obtener la clave del array de bytecode desde el backend.
Cuándo usarlo
Muy recomendado para bases de código totalmente asíncronas. En este modo solo se virtualizan las funciones async —una función síncrona no puede convertirse en asíncrona sin transformar su valor de retorno en una Promise y romper a quienes la llaman—, por lo que el código que es async de principio a fin obtiene la mayor cobertura. Sigue funcionando cuando la raíz es síncrona (por ejemplo, una IIFE síncrona o un wrapper UMD): las funciones async más externas del interior quedan protegidas y las partes síncronas se dejan tal cual.
Qué se transforma
Cada función async más externa, dondequiera que aparezca (incluso anidada dentro de wrappers síncronos). La función async más externa de cada cadena es la unidad protegida: todo lo que hay dentro de ella, síncrono y asíncrono, se compila. Las funciones síncronas y los generadores normales se dejan sin ofuscar.
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
}
}
Exclusiones y advertencias
Los generadores asíncronos también se dejan sin ofuscar cuando hay un key getter asíncrono activo: un generador asíncrono debe devolver su iterador de forma síncrona y no puede esperar a la clave. En el modo por defecto vmTargetFunctionsMode: 'root' las exclusiones son silenciosas (la selección es automática). En el modo 'comment' se emite una advertencia a través de ObfuscationResult.getWarnings() cada vez que una función que marcaste explícitamente no puede virtualizarse, ya sea porque resultó ser síncrona o porque es un generador asíncrono bajo un key getter asíncrono. Estas advertencias (VMSyncFunctionSkippedInAsyncMode, VMAsyncGeneratorSkippedInAsyncMode) pueden silenciarse por tipo mediante la opción warnings (v7.8.0+).
Requisitos
- El key getter asíncrono requiere
vmBytecodeArrayEncodingjunto con unvmBytecodeArrayEncodingKeyGetter. - Versión del ofuscador 7.3.0 o posterior.
Ejemplo
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())'
});
