بناء إضافات مكتبة
الحالة: مُخطَّط (لم يُبنَ بعد). نظام الإضافات مُصمَّم لكنه لم يُبنَ بعد. لا يوجد اليوم مضيف للإضافات، ولا واجهة برمجية لها، ولا حزمة تطوير (SDK)، ولا أداة
mkp، ولا متجر. تصف هذه الأدلة التصميم الوارد في الملحمة 54، وقد تتغير التفاصيل قبل إطلاقه.
ما الإضافة
تضيف الإضافة وظيفة إلى منزل مكتبة دون تغيير شيفرة مكتبة نفسها. فهي:
- تأخذ المهام من طابور المهام. تعلن إضافتك عن مراحل. تضع مكتبة مهمة لمرحلة ما في الطابور عند وقوع حدث ثابت (أُضيف فيديو، أو جهز نص مفرّغ)، أو وفق جدول زمني، أو حين تطلبها مرحلة أخرى من مراحلك.
- لا تصل إلى الإنترنت. لا تستطيع فتح مقبس (socket)، ولا حلّ اسم نطاق، ولا إرسال طلب HTTP. ولا ترى القرص. ويُفرض هذا مرتين: بيئة تشغيل WebAssembly لا تربط أي واجهات للشبكة أو لنظام الملفات، والعملية التي تشغّل الإضافات يقيّدها نظام التشغيل.
- لا تنال من الواجهة البرمجية إلا ما يمنحه المشرف. تعلن عن قدرات مثل
library.readأوchapters.write. يمنحها المشرف عند التثبيت، ويختار المكتبات التي تراها الإضافة، وتتحقق الواجهة البرمجية من الأمرين في كل استدعاء.
تكتب الإضافة نتائجها عبر الواجهة البرمجية: حقول البيانات الوصفية، والوسوم، والفصول، والترجمات المصاحبة، والصور الفنية، واقتراحات يراجعها المشرف، وبياناتها الخاصة. ويمكنها أن تعلن عن نموذج إعدادات، ولاحقًا عن لوحات للقراءة فقط ترسمها التطبيقات.
الإضافة حزمة واحدة موقّعة (.mkplugin) تضم مكوّن WebAssembly، والبيان، ونصوصًا بالإنجليزية
والعربية، وأيقونة، وواجهة اختيارية معرَّفة على هيئة بيانات. يمكنك كتابتها بلغة Rust، أو
TypeScript أو JavaScript، أو Python، أو Go (TinyGo).
ما لا تستطيع الإضافة فعله
- الوصول إلى الإنترنت، بأي إذن كان. لا توجد قدرة باسم
network. - تغيير التشغيل أو البث، أو إضافة مسارات للواجهة البرمجية تخدم التطبيقات.
- تشغيل شيفرة داخل التطبيقات. نماذج الإعدادات واللوحات بيانات، ومكتبة هي التي ترسمها.
- العمل عند الإقلاع أو خارج مهمة.
- قراءة المستخدمين، أو الجلسات، أو الرموز (tokens)، أو الأسرار، أو مسارات الملفات، أو عناوين الأجهزة.
- التواصل مع إضافة أخرى، إلا بقراءة بيانات اختارت تلك الإضافة تصديرها، وبمنح صريح.
الخطط والمراحل
يُطلق التصميم على مراحل. يحدد كل دليل المرحلة التي تنتمي إليها كل ميزة.
| المرحلة | المحتوى | الحالة |
|---|---|---|
| 1 | البيان والحزمة، ومضيف الإضافات والعزل، والواجهة البرمجية للإضافات، ومراحل الطابور، ودورة الحياة، والمنح، والتثبيت من ملف، والإعدادات، وحزمة التطوير وأداة الاختبار | مُخطَّط |
| 2 | التوقيع والثقة، ومتجر مكتبة، والفحوص الآلية والمراجعة، والفهرس، والتحديثات، ومفتاح الإيقاف الطارئ | مُخطَّط |
| 3 | الإضافات المدفوعة، واللوحات في كل التطبيقات، والحوسبة المحلية (التضمينات والنموذج اللغوي للخادم المنزلي) | مُخطَّط |
ومن المخطط أيضًا أن تنتقل مراحل الطابور الخاصة بمكتبة نفسها لتعمل خلف البيان نفسه والتوزيع نفسه والواجهة البرمجية نفسها، بوصفها إضافات من الطرف الأول. ولا يغيّر هذا العمل ما تستطيع إضافات الأطراف الثالثة فعله.
ما الموجود اليوم
يستطيع خط معالجة مكتبة تحميل حزم Python المسجّلة ضمن مجموعة نقاط الدخول maktaba.extensions.
هذه ميزة للمطوّرين مخصّصة لتكاملات مكتبة نفسها: تعمل هذه الحزمة داخل عامل خط المعالجة بصلاحيات
كاملة. وهي ليست نظام الإضافات، وليست مخصّصة لشيفرة من أشخاص آخرين.
الأدلة
- البيان والحزمة: عقد الإضافة، والملف
manifest.toml، وصيغة.mkplugin. - العزل: لا إنترنت، وعزل نظام التشغيل، وحدود الموارد، وعزل الأعطال، والصحة.
- مراحل الطابور والواجهة البرمجية للإضافات: الأحداث، والجداول الزمنية، وكيف تعمل المهمة، وواجهات الواجهة البرمجية، ومقابض الوسائط، والمنح، والإعدادات، واللوحات، والحوسبة المحلية.
- الاختبار والتحزيم: حزمة التطوير، والقوالب، وأداة الاختبار المحلية، والبناء، والتحزيم، والتثبيت من ملف.
- النشر: مفاتيح التوقيع، ومتجر مكتبة، والمراجعة، والفهرس، ومفتاح الإيقاف الطارئ، والإضافات المدفوعة.
الإضافة في صورة واحدة
queue job (pool "plugins")
-> pipeline worker asks the API for a per-job token
-> plugin host runs your component's run(stage) in a fresh sandbox
your code calls maktaba:plugin/* imports
the host forwards each call with the token to the plugin API
the API checks token, capability, library scope and quota
-> result goes back to the queue (retry, park or done)