Async Executor
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.
Regarder
Obfuscator.io Async Executor: Async Bytecode Key Getter and Async-Only VM Virtualization
L'option vmAsyncExecutor active l'Async Executor 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 Externaliser la clé de Bytecode Array Encoding.
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 ne sont pas virtualisées (le reste de l'obfuscation s'applique toujours).
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 virtualisés (le reste de l'obfuscation s'applique toujours à eux).
Exclusions et avertissements
Les générateurs asynchrones ne sont pas non plus virtualisé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), sauf si rien du tout n'est virtualisé, ce qui signale VMNoFunctionsToVirtualize. En mode 'comment', un avertissement est signalé (dans le tableau de bord, et dans le tableau warnings de la réponse de l'API) 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+).
En mode root, vmAsyncExecutor laisse les initialiseurs de variables de premier niveau en JavaScript ordinaire même lorsque vmWrapTopLevelInitializers est activé, et (v7.8.0+) un avertissement VMTopLevelInitializerNotVirtualized les énumère.
Prérequis
- Le getter de clé asynchrone nécessite
vmBytecodeArrayEncoding, etvmBytecodeArrayEncodingKeyGetterdoit être associé àvmBytecodeArrayEncodingKey- l'obfuscateur vérifie que les deux sont définis (ou tous deux absents) et que le getter s'analyse comme une expression, et rejette le build dans le cas contraire. - Obfuscateur en version 7.3.0 ou ultérieure.
Activer l'option seule ne fait que basculer l'exécuteur en mode asynchrone (seules les fonctions async les plus externes sont virtualisées). C'est le fait de renvoyer une Promise depuis le getter de clé qui débloque la récupération de la clé à l'exécution, et cela requiert en plus Bytecode Array Encoding avec un getter de clé. Le fait que le getter renvoie une Promise ne peut pas être vérifié au moment du build : un getter qui renvoie une Promise alors que vmAsyncExecutor est désactivé échoue donc à l'exécution - le décodeur reçoit la Promise au lieu de la clé.
Exemple
Dans une base de code entièrement synchrone, presque rien n'est virtualisé, puisque seules les fonctions async sont éligibles. Si vos points d'entrée ne sont pas async, préférez un getter de clé synchrone et laissez vmAsyncExecutor désactivé.
