Documentação
/
Ofuscação VM
/

Executor assíncrono

Executor assíncrono

Pro
v7.3.0+

Execute a VM de forma assíncrona para que a chave de descriptografia do bytecode seja obtida em tempo de execução, em vez de ser enviada dentro do bundle.

A opção vmAsyncExecutor ativa o executor assíncrono da VM. O principal benefício é que o vmBytecodeArrayEncodingKeyGetter agora pode retornar uma Promise — um getter de chave assíncrono — de modo que a chave de descriptografia pode vir de uma requisição de rede, do IndexedDB ou de qualquer fonte assíncrona no momento do carregamento, em vez de precisar estar disponível de forma síncrona quando o código roda pela primeira vez.

Para um passo a passo completo com a chave obtida no backend, veja a receita Obtendo a chave do array de bytecode no backend.

Quando usar

Fortemente recomendado para bases de código totalmente assíncronas. Nesse modo, só as funções async são virtualizadas — uma função síncrona não pode se tornar assíncrona sem transformar o valor de retorno em uma Promise e quebrar quem a chama —, então o código que é async de ponta a ponta tem a maior cobertura. Ele ainda funciona quando a raiz é síncrona (por exemplo, uma IIFE síncrona ou um wrapper UMD): as funções async mais externas lá dentro são protegidas, e as partes síncronas ficam como estão.

O que é transformado

Toda função async mais externa, onde quer que ela apareça (inclusive aninhada dentro de wrappers síncronos). A async mais externa de cada cadeia é a unidade protegida — tudo dentro dela, síncrono e assíncrono, é compilado junto. Funções síncronas e generators comuns ficam sem ofuscação.

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
    }
}

Casos ignorados e avisos

Os async generators também ficam sem ofuscação quando um getter de chave assíncrono está ativo — um async generator precisa retornar seu iterador de forma síncrona e não pode esperar pela chave. No modo padrão vmTargetFunctionsMode: 'root', os casos ignorados são silenciosos (a seleção é automática). No modo 'comment', um aviso é emitido por meio de ObfuscationResult.getWarnings() sempre que uma função que você marcou explicitamente não pode ser virtualizada — porque ela acabou sendo síncrona ou é um async generator sob um getter de chave assíncrono. Esses avisos (VMSyncFunctionSkippedInAsyncMode, VMAsyncGeneratorSkippedInAsyncMode) podem ser silenciados por tipo pela opção warnings (v7.8.0+).

Requisitos

  • O getter de chave assíncrono requer vmBytecodeArrayEncoding junto com um vmBytecodeArrayEncodingKeyGetter.
  • Versão do obfuscator 7.3.0 ou posterior.

Exemplo

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())'
});