Async Executor
شغّل الآلة الافتراضية بشكل غير متزامن ليُجلب مفتاح فك تشفير البايت كود أثناء التشغيل بدلًا من شحنه ضمن الحزمة.
شاهد
Obfuscator.io Async Executor: Async Bytecode Key Getter and Async-Only VM Virtualization
يفعّل الخيار vmAsyncExecutor منفِّذ الآلة الافتراضية غير المتزامن. وفائدته الأبرز أن vmBytecodeArrayEncodingKeyGetter صار بإمكانه إعادة Promise - أي دالة جلب مفتاح غير متزامنة - فيمكن لمفتاح فك التشفير أن يأتي من طلب شبكي أو من IndexedDB أو من أي مصدر غير متزامن عند التحميل، بدلًا من وجوب توفره بشكل متزامن عند أول تشغيل للكود.
وللاطلاع على شرح متكامل لجلب المفتاح من الخادم الخلفي، انظر مفتاح Bytecode Array Encoding.
متى تستخدمه
موصى به بشدة للمشاريع غير المتزامنة بالكامل. ففي هذا الوضع لا تُحوَّل إلى الآلة الافتراضية سوى الدوال async - إذ لا يمكن جعل دالة متزامنة غير متزامنة دون تحويل قيمتها المعادة إلى Promise وتعطيل مستدعيها - ولذلك يحظى الكود غير المتزامن بالكامل بأوسع تغطية. وهو يعمل أيضًا عندما يكون الجذر متزامنًا (مثل IIFE متزامن أو غلاف UMD): فتُحمى الدوال async الأبعد إلى الخارج في الداخل، ولا تُحوَّل الأجزاء المتزامنة إلى الآلة الافتراضية (لكن بقية التشويش تظل تنطبق عليها).
ما الذي يُحوَّل
كل دالة async في أبعد موضع خارجي، أينما ظهرت (بما في ذلك المتداخلة داخل أغلفة متزامنة). فالدالة غير المتزامنة الأبعد خارجًا في كل سلسلة هي الوحدة المحمية - وكل ما بداخلها، متزامنًا كان أم غير متزامن، يُترجم ضمنها. أما الدوال المتزامنة والمولِّدات العادية فلا تُحوَّل إلى الآلة الافتراضية (لكن بقية التشويش تظل تنطبق عليها).
حالات التخطي والتحذيرات
لا تُحوَّل المولِّدات غير المتزامنة كذلك إلى الآلة الافتراضية عندما تكون دالة جلب مفتاح غير متزامنة نشطة - إذ يجب على المولِّد غير المتزامن أن يعيد مُكرِّره بشكل متزامن ولا يمكنه انتظار المفتاح. وفي الوضع الافتراضي vmTargetFunctionsMode: 'root' تجري حالات التخطي بصمت (لأن الاختيار تلقائي)، ما لم يُحوَّل أي شيء على الإطلاق، فيُبلَغ حينها عن VMNoFunctionsToVirtualize. أما في وضع 'comment' فيُبلَغ عن تحذير (في لوحة التحكم، وفي المصفوفة warnings ضمن استجابة API) كلما تعذّر تحويل دالة أشّرت عليها صراحةً إلى الآلة الافتراضية - سواء تبيّن أنها متزامنة أو كانت مولِّدًا غير متزامن في ظل دالة جلب مفتاح غير متزامنة. ويمكن كتم هذه التحذيرات (VMSyncFunctionSkippedInAsyncMode وVMAsyncGeneratorSkippedInAsyncMode) لكل نوع على حدة عبر الخيار warnings (v7.8.0+).
في وضع الجذر، يترك vmAsyncExecutor مُهيِّئات المتغيرات في المستوى الأعلى بصورة JavaScript عادية حتى عندما يكون vmWrapTopLevelInitializers مفعّلًا، ويسردها (v7.8.0+) تحذير VMTopLevelInitializerNotVirtualized.
المتطلبات
- تتطلب دالة جلب المفتاح غير المتزامنة تفعيل
vmBytecodeArrayEncoding، ويجب أن يقترنvmBytecodeArrayEncodingKeyGetterبالخيارvmBytecodeArrayEncodingKey- إذ يتحقق المشوِّش من ضبط الاثنين معًا (أو غيابهما معًا) ومن أن دالة الجلب تُحلَّل بوصفها تعبيرًا، ويرفض البناء بخلاف ذلك. - إصدار المشوِّش 7.3.0 أو أحدث.
تفعيل الخيار وحده لا يفعل سوى تبديل المنفِّذ إلى الوضع غير المتزامن (فلا تُحوَّل سوى الدوال async الأبعد خارجًا). أما ما يفتح إمكانية جلب المفتاح أثناء التشغيل فهو إعادة Promise من دالة جلب المفتاح، وهذا يحتاج إضافةً إلى خيار Bytecode Array Encoding مع دالة جلب مفتاح. ولا يمكن التحقق وقت البناء مما إذا كانت دالة الجلب تعيد Promise، لذا فإن دالة جلب تعيد Promise مع كون vmAsyncExecutor معطَّلًا تفشل أثناء التشغيل - إذ يتلقى مفكّك الترميز كائن Promise بدلًا من المفتاح.
مثال
في مشروع متزامن بالكامل لن يُحوَّل شيء تقريبًا إلى الآلة الافتراضية، لأن الدوال async وحدها هي المؤهلة. وإذا لم تكن نقاط الدخول لديك async، فاختر دالة جلب مفتاح متزامنة واترك vmAsyncExecutor معطَّلًا.
