Exécuteur asynchrone
Exécutez la VM de manière asynchrone afin que la clé de déchiffrement du bytecode puisse être récupérée à l'exécution plutôt que livrée dans le bundle.
L'option vmAsyncExecutor active l'exécuteur asynchrone de la VM. Son principal atout : vmBytecodeArrayEncodingKeyGetter peut désormais renvoyer une Promise — un getter de clé asynchrone — de sorte que la clé de déchiffrement peut provenir d'une requête réseau, d'IndexedDB ou de n'importe quelle source asynchrone au moment du chargement, plutôt que d'être disponible de façon synchrone dès la première exécution du code.
Pour une mise en œuvre complète avec récupération de la clé depuis un backend, consultez la recette Récupérer la clé du tableau de bytecode depuis le backend.
Quand l'utiliser
Fortement recommandé pour les bases de code entièrement asynchrones. Dans ce mode, seules les fonctions async sont virtualisées — une fonction synchrone ne peut pas être rendue asynchrone sans transformer sa valeur de retour en Promise et casser ses appelants — c'est donc un code asynchrone de bout en bout qui bénéficie de la meilleure couverture. L'option fonctionne malgré tout lorsque la racine est synchrone (une IIFE synchrone ou un wrapper UMD, par exemple) : les fonctions async les plus externes qu'elle contient sont protégées, et les parties synchrones sont laissées telles quelles.
Ce qui est transformé
Toutes les fonctions async les plus externes, où qu'elles se trouvent (y compris imbriquées dans des wrappers synchrones). L'unité protégée est la fonction async la plus externe de chaque chaîne — tout ce qu'elle contient, synchrone comme asynchrone, est compilé avec elle. Les fonctions synchrones et les générateurs classiques ne sont pas obfusqués.
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
}
}
Exclusions et avertissements
Les générateurs asynchrones ne sont pas non plus obfusqués lorsqu'un getter de clé asynchrone est actif — un générateur asynchrone doit renvoyer son itérateur de façon synchrone et ne peut donc pas attendre la clé. Dans le mode par défaut vmTargetFunctionsMode: 'root', ces exclusions sont silencieuses (la sélection est automatique). En mode 'comment', un avertissement est émis via ObfuscationResult.getWarnings() chaque fois qu'une fonction que vous avez explicitement marquée ne peut pas être virtualisée — parce qu'elle s'est révélée synchrone, ou parce qu'il s'agit d'un générateur asynchrone sous un getter de clé asynchrone. Ces avertissements (VMSyncFunctionSkippedInAsyncMode, VMAsyncGeneratorSkippedInAsyncMode) peuvent être masqués type par type via l'option warnings (v7.8.0+).
Prérequis
- Le getter de clé asynchrone nécessite
vmBytecodeArrayEncodingaccompagné d'unvmBytecodeArrayEncodingKeyGetter. - Obfuscateur en version 7.3.0 ou ultérieure.
Exemple
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())'
});
