- الرئيسية
- Documentation
- الأصلية
- عقد الربط الأصلي (جانب TypeScript)
عقد الربط الأصلي (جانب TypeScript)
يُحدّد هذا المستند العقد من جانب TypeScript الذي يقع بين مستدعي @f5-sales-demo/pi-natives والإضافة N-API المحمّلة.
يركّز على ثلاثة عناصر:
- شكل العقد (
NativeBindings+ توسيع الوحدة)، - سلوك الغلاف (
src/<module>/index.ts)، - سطح التصدير العام (
src/index.ts).
ملفات التنفيذ
Section titled “ملفات التنفيذ”packages/natives/src/bindings.tspackages/natives/src/native.tspackages/natives/src/index.tspackages/natives/src/clipboard/types.tspackages/natives/src/clipboard/index.tspackages/natives/src/glob/types.tspackages/natives/src/glob/index.tspackages/natives/src/grep/types.tspackages/natives/src/grep/index.tspackages/natives/src/highlight/types.tspackages/natives/src/highlight/index.tspackages/natives/src/html/types.tspackages/natives/src/html/index.tspackages/natives/src/image/types.tspackages/natives/src/image/index.tspackages/natives/src/keys/types.tspackages/natives/src/keys/index.tspackages/natives/src/ps/types.tspackages/natives/src/ps/index.tspackages/natives/src/pty/types.tspackages/natives/src/pty/index.tspackages/natives/src/shell/types.tspackages/natives/src/shell/index.tspackages/natives/src/system-info/types.tspackages/natives/src/system-info/index.tspackages/natives/src/text/types.tspackages/natives/src/text/index.tspackages/natives/src/work/types.tspackages/natives/src/work/index.ts
نموذج العقد
Section titled “نموذج العقد”يُعرّف packages/natives/src/bindings.ts العقد الأساسي:
NativeBindings(الواجهة الأساسية، تتضمن حاليًاcancelWork(id: number): void)Cancellable(timeoutMs?: number،signal?: AbortSignal)- شكل ردّ الاتصال
TsFunc<T>المستخدم من قِبَل ردود الاتصال الآمنة للخيوط في N-API
تُضيف كل وحدة حقولها الخاصة عن طريق دمج التصريحات:
// packages/natives/src/<module>/types.tsdeclare module "../bindings" { interface NativeBindings { grep(options: GrepOptions, onMatch?: TsFunc<GrepMatch>): Promise<GrepResult>; }}يُبقي هذا على واجهة ربط مجمّعة واحدة دون الحاجة إلى ملف نوع مركزي ضخم.
دورة حياة دمج التصريحات وانتقالات الحالة
Section titled “دورة حياة دمج التصريحات وانتقالات الحالة”1) تجميع النوع في وقت الترجمة
Section titled “1) تجميع النوع في وقت الترجمة”- يوفّر
bindings.tsالرمز الأساسيNativeBindings. - يُوسّع كل
src/<module>/types.tsواجهةNativeBindings. - يستورد
src/native.tsجميع ملفات./<module>/typesكتأثيرات جانبية لضمان وجود العقد المدموج في النطاق حيث يُستخدمNativeBindings.
انتقال الحالة: العقد الأساسي → العقد المدموج.
2) تحميل الإضافة في وقت التشغيل وبوابة التحقق
Section titled “2) تحميل الإضافة في وقت التشغيل وبوابة التحقق”- يُحمّل
src/native.tsالملفات الثنائية المرشّحة ذات الامتداد.node. - يُعامَل الكائن المحمّل على أنه
NativeBindingsويُمرَّر فورًا عبرvalidateNative(...). - يتحقق
validateNativeمن مفاتيح التصدير المطلوبة عبرtypeof bindings[name] === "function".
انتقال الحالة: كائن الإضافة غير الموثوق → كائن الربط الأصلي المُتحقَّق منه (أو فشل غير قابل للاسترداد).
3) استدعاء الغلاف
Section titled “3) استدعاء الغلاف”- تستدعي أغلفة الوحدات في
src/<module>/index.tsالـnative.<export>. - تُكيّف الأغلفة القيم الافتراضية وشكل ردّ الاتصال (من نمط
(err, value)إلى أنماط رد الاتصال التي تعتمد على القيمة فقط في واجهات برمجة JS). - يُعيد تصدير
src/index.tsأغلفة الوحدات وأنواعها كواجهة برمجة تطبيقات عامة للحزمة.
انتقال الحالة: روابط خام مُتحقَّق منها → واجهة برمجة تطبيقات عامة سهلة الاستخدام.
مسؤوليات الغلاف
Section titled “مسؤوليات الغلاف”الأغلفة رفيعة بصورة مقصودة؛ إذ لا تُعيد تنفيذ المنطق الأصلي.
المسؤوليات الأساسية:
- تطبيع الحجج وتعيين قيمها الافتراضية
- يحلّ
glob()options.pathإلى مسار مطلق ويضع قيمًا افتراضية لـhiddenوgitignoreوrecursive. - يملأ
hasMatch()الأعلام الافتراضية (ignoreCase،multiline) قبل استدعاء الدالة الأصلية.
- يحلّ
- تكييف ردّ الاتصال
- تحوّل
grep()وglob()وexecuteShell()الـTsFunc<T>(error, value) إلى رد اتصال المستخدم الذي يستقبل القيم الناجحة فقط.
- تحوّل
- سلوك البيئة أو السياسة حول الاستدعاءات الأصلية
- يُضيف غلاف الحافظة معالجة OSC52/Termux/بدون واجهة رسومية، ويتعامل مع النسخ على أنه بذل أفضل جهد.
- التسمية العامة وتنسيق إعادة التصدير
- تُعيّن
searchContent()تعيينًا إلى التصدير الأصليsearch.
- تُعيّن
تنظيم سطح التصدير العام
Section titled “تنظيم سطح التصدير العام”packages/natives/src/index.ts هو البرميل العام الرئيسي. يُجمّع الصادرات حسب نطاق القدرة:
- البحث/النص:
grep،glob،text،highlight - التنفيذ/العملية/الطرفية:
shell،pty،ps،keys - النظام/الوسائط/التحويل:
image،html،clipboard،system-info،work
قاعدة للمشرفين: إذا لم يُعَد تصدير غلاف ما من src/index.ts، فهو ليس جزءًا من سطح الحزمة العام المقصود.
تعيين واجهة برمجة JS ↔ تصدير أصلي (تمثيلي)
Section titled “تعيين واجهة برمجة JS ↔ تصدير أصلي (تمثيلي)”تستخدم جانب Rust أسماء تصدير N-API (مشتقة عادةً من تحويل #[napi] من snake_case إلى camelCase، مع أسماء مستعارة صريحة أحيانًا) يجب أن تتطابق مع مفاتيح الربط هذه.
| الفئة | واجهة برمجة JS العامة (الغلاف) | مفتاح الربط الأصلي | نوع الإرجاع | غير متزامن؟ |
|---|---|---|---|---|
| Grep | grep(options, onMatch?) | grep | Promise<GrepResult> | نعم |
| Grep | searchContent(content, options) | search | SearchResult | لا |
| Grep | hasMatch(content, pattern, opts?) | hasMatch | boolean | لا |
| Grep | fuzzyFind(options) | fuzzyFind | Promise<FuzzyFindResult> | نعم |
| Glob | glob(options, onMatch?) | glob | Promise<GlobResult> | نعم |
| Glob | invalidateFsScanCache(path?) | invalidateFsScanCache | void | لا |
| Shell | executeShell(options, onChunk?) | executeShell | Promise<ShellExecuteResult> | نعم |
| Shell | Shell | Shell | مُنشئ الفئة | غير مُنطبق |
| PTY | PtySession | PtySession | مُنشئ الفئة | غير مُنطبق |
| Text | truncateToWidth(...) | truncateToWidth | string | لا |
| Text | sliceWithWidth(...) | sliceWithWidth | SliceWithWidthResult | لا |
| Text | visibleWidth(text) | visibleWidth | number | لا |
| Highlight | highlightCode(code, lang, colors) | highlightCode | string | لا |
| HTML | htmlToMarkdown(html, options?) | htmlToMarkdown | Promise<string> | نعم |
| System | getSystemInfo() | getSystemInfo | SystemInfo | لا |
| Work | getWorkProfile(lastSeconds) | getWorkProfile | WorkProfile | لا |
| Process | killTree(pid, signal) | killTree | number | لا |
| Process | listDescendants(pid) | listDescendants | number[] | لا |
| Clipboard | copyToClipboard(text) | copyToClipboard | Promise<void> (سلوك الغلاف ببذل أفضل جهد) | نعم |
| Clipboard | readImageFromClipboard() | readImageFromClipboard | Promise<ClipboardImage | null> | نعم |
| Keys | parseKey(data, kittyProtocolActive) | parseKey | string | null | لا |
الفروقات بين عقود المزامنة وغير المزامنة
Section titled “الفروقات بين عقود المزامنة وغير المزامنة”يمزج العقد بين واجهات برمجة التطبيقات المتزامنة وغير المتزامنة؛ وتُبقي الأغلفة على أسلوب الاستدعاء الأصلي بدلًا من فرض نموذج واحد:
- صادرات غير متزامنة قائمة على الوعود للعمليات التي تتضمن إدخالًا/إخراجًا أو مهامًا طويلة الأمد (
grep،glob،htmlToMarkdown،executeShell، الحافظة، عمليات الصور). - صادرات متزامنة للتحويلات/المحلّلات الحتمية في الذاكرة (
search،hasMatch، التمييز البرمجي، عرض النص/التقطيع، تحليل المفاتيح، استعلامات العمليات). - صادرات المُنشئ للكائنات التشغيلية ذات الحالة (
Shell،PtySession،PhotonImage).
انعكاس على المشرفين: تغيير نمط تصدير قائم من متزامن إلى غير متزامن أو العكس يُعدّ تغييرًا كسرًا في العقد والواجهة البرمجية عبر الأغلفة والمستدعين.
أنماط كتابة الكائنات والتعدادات
Section titled “أنماط كتابة الكائنات والتعدادات”أنماط الكائنات (كائنات JS بنمط #[napi(object)])
Section titled “أنماط الكائنات (كائنات JS بنمط #[napi(object)])”يُمثّل TypeScript القيم الأصلية ذات شكل الكائن كواجهات، على سبيل المثال:
GrepResult،SearchResult،GlobResultSystemInfo،WorkProfileClipboardImage،ParsedKittyResult
هذه عقود هيكلية في وقت الترجمة؛ وصحة الشكل في وقت التشغيل تقع على عاتق التنفيذ الأصلي.
أنماط التعدادات
Section titled “أنماط التعدادات”تُمثَّل التعدادات الرقمية الأصلية كقيم const enum في TypeScript:
FileType(1=file،2=dir،3=symlink)ImageFormat(0=PNG،1=JPEG،2=WEBP،3=GIF)SamplingFilter،Ellipsis،KeyEventType
يرى المستدعون أعضاء التعداد بأسمائها؛ بينما يمرّر حدّ الربط أرقامًا.
كيفية اكتشاف عدم التطابق
Section titled “كيفية اكتشاف عدم التطابق”يحدث اكتشاف عدم التطابق على طبقتين:
-
فحوصات عقد TypeScript في وقت الترجمة
- تستدعي الأغلفة
native.<name>مقابلNativeBindingsالمدموجة. - تؤدي مفاتيح الربط المفقودة أو المُعاد تسميتها إلى كسر فحص النوع في TypeScript داخل الأغلفة.
- تستدعي الأغلفة
-
التحقق في وقت التشغيل في
validateNative- بعد التحميل، يتحقق
native.tsمن الصادرات المطلوبة ويرمي استثناءً إن كان أيٌّ منها مفقودًا. - تتضمن رسالة الخطأ المفاتيح المفقودة وتعليمات إعادة البناء.
- بعد التحميل، يتحقق
يُمكّن هذا من اكتشاف انحراف الثنائي القديم الشائع: يوجد الغلاف/النوع لكن ملف .node المحمّل لا يحتوي على التصدير.
سلوك الفشل والتحفظات
Section titled “سلوك الفشل والتحفظات”فشل التحميل/التحقق (فشل غير قابل للاسترداد)
Section titled “فشل التحميل/التحقق (فشل غير قابل للاسترداد)”- يُرمى استثناء عند فشل تحميل الإضافة أو عدم دعم المنصة أثناء تهيئة الوحدة في
native.ts. - يُرمى استثناء عند وجود صادرات مطلوبة مفقودة قبل أن تصبح الأغلفة قابلة للاستخدام.
الأثر: تفشل الحزمة بسرعة بدلًا من تأجيل الفشل إلى الاستدعاء الأول.
فروقات السلوك على مستوى الغلاف
Section titled “فروقات السلوك على مستوى الغلاف”- تُليّن بعض الأغلفة الفشل عن قصد (
copyToClipboardتبذل أفضل جهد وتتجاهل فشل الاستدعاء الأصلي). - تتجاهل ردود الاتصال للبث حمولات خطأ ردّ الاتصال وتُعيد توجيه أحداث القيمة الناجحة فقط.
تحفظات على مستوى النوع (وقت التشغيل أشدّ دقةً من TypeScript)
Section titled “تحفظات على مستوى النوع (وقت التشغيل أشدّ دقةً من TypeScript)”- الحقول الاختيارية في TypeScript لا تضمن الصحة الدلالية؛ إذ يمكن للطبقة الأصلية رفض القيم المشوّهة.
- كتابة
const enumلا تمنع القيم الرقمية خارج النطاق من المستدعين غير المكتوبين في وقت التشغيل. - يتحقق
validateNativeمن وجود الصادرات المطلوبة وكونها دالة فحسب، وليس من توافق شكل الحجج/القيمة المُرجعة بعمق. - يتضمن
bindings.tscancelWork(id)في الواجهة الأساسية، لكن قائمة التحقق في وقت التشغيل الحالية لا تُطبّق هذا المفتاح.
قائمة فحص المشرف لتغييرات الربط
Section titled “قائمة فحص المشرف لتغييرات الربط”عند إضافة تصدير أو تغييره، قم بتحديث جميع ما يلي:
src/<module>/types.ts(التوسيع + أنواع العقد)src/<module>/index.ts(سلوك الغلاف)- استيرادات
src/native.tsلأنواع الوحدة (في حال إنشاء وحدة جديدة) - فحوصات التصدير المطلوبة في
validateNative - إعادة التصديرات العامة في
src/index.ts
إغفال أيّ خطوة يُفضي إلى انحراف في وقت الترجمة أو فشل في وقت تحميل وقت التشغيل.