المنفِّذ غير المتزامن
شغّل الآلة الافتراضية بشكل غير متزامن ليُجلب مفتاح فك تشفير البايت كود أثناء التشغيل بدلًا من شحنه ضمن الحزمة.
يفعّل الخيار vmAsyncExecutor منفِّذ الآلة الافتراضية غير المتزامن. وفائدته الأبرز أن vmBytecodeArrayEncodingKeyGetter صار بإمكانه إعادة Promise — أي دالة جلب مفتاح غير متزامنة — فيمكن لمفتاح فك التشفير أن يأتي من طلب شبكي أو من IndexedDB أو من أي مصدر غير متزامن عند التحميل، بدلًا من وجوب توفره بشكل متزامن عند أول تشغيل للكود.
وللاطلاع على شرح متكامل لجلب المفتاح من الخادم الخلفي، انظر الوصفة جلب مفتاح مصفوفة البايت كود من الخادم الخلفي.
متى تستخدمه
موصى به بشدة للمشاريع غير المتزامنة بالكامل. ففي هذا الوضع لا تُحوَّل إلى الآلة الافتراضية سوى الدوال async — إذ لا يمكن جعل دالة متزامنة غير متزامنة دون تحويل قيمتها المعادة إلى Promise وتعطيل مستدعيها — ولذلك يحظى الكود غير المتزامن بالكامل بأوسع تغطية. وهو يعمل أيضًا عندما يكون الجذر متزامنًا (مثل IIFE متزامن أو غلاف UMD): فتُحمى الدوال 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())'
});
