# للمطوّرين

ثلاثة أشياء تستطيع بناءها على URnetwork، وثلاثة اعتمادات مختلفة. واختيار
الصحيح منها هو القرار الأول، والفرق ليس شكلياً.

| ما تبنيه | نقطة البداية | الاعتماد |
| --- | --- | --- |
| تطبيق أو جهاز يتصل بـURnetwork | [SDK](/docs/getting-started-sdk)، ثم [جولة SDK](/docs/tour-sdk) | رمز JWT للحساب، يُستبدل برمز يحمل `clientId` |
| عميل تطبيق يستخدم TCP أو UDP أو TLS/DTLS أو Direct Sockets عبر جهاز Device | [المقابس](/docs/socket) | جهاز Device مُهيّأ ومعه مسار اتصال متاح |
| أتمتة على شبكتك أنت | [API المشغّل](/docs/api) | رمز JWT لشبكتك أو مفتاح API من نوع `urn_` |
| منتج يسجّل الناس الدخول إليه، فيقبلونه في شبكتهم | [تسجيل الدخول باستخدام URnetwork](/docs/sign-in-with-urnetwork) | معرّف `client_id` من OAuth صادر لك |

والحدّ الفاصل الذي يهمّ هو **شبكةُ مَن التي تعمل عليها**. فمع SDK وAPI
المشغّل تعمل أنت على شبكتك أنت، باعتماد تملكه وتتحكم فيه. أما تسجيل الدخول
باستخدام URnetwork فهو شخصٌ يقبل برنامجك في شبكته *هو* — فلا تملك ذلك
الاعتماد أبداً، بل هو يمنحه، وهو يستطيع سحبه.

## SDK

ابدأ من [التثبيت](/docs/install-sdk)، ثم استخدم متصفّح
[الأمثلة](/docs/examples) للاطلاع على برامج قابلة للتنفيذ في اثنتي عشرة لغة.
ولكل لغة دليل تثبيت ومجلد للمقابس فيه تكاملات عملاء HTTP قابلة للتشغيل.

وتتشارك حزمة Go SDK وحزمة JS/WASM SDK وواجهة CGo ABI محركَ شبكات واحداً.
وحزم اللغات لسطح المكتب تغلّف وحدة CGo؛ بينما يستخدم Android ملف AAR المبني
بأداة gomobile، وتستخدم Swift حزمة XCFramework لمنصات Apple. وتتضمن
JavaScript أمثلة لـNode وللمتصفح معاً، تستخدم جهاز Device مستضافاً.

ويشرح [دليل المقابس](/docs/socket) كيف تستخدم اتصالات TCP وUDP وTLS/DTLS
وDirect Sockets في فضاء المستخدم التي يوفّرها جهاز Device. وتستطيع التطبيقات
استخدام هذه المقابس من دون تثبيت شبكة VPN على مستوى النظام. ويستخدم
DeviceRemote في المتصفح مسارَ الحزم الخاص بجهاز Device المستضاف التابع له؛
فلا يتطلب واجهة TUN يملكها المتصفح.

ويعرض قسم [أيُّ طبقة ربط تختار](/docs/getting-started-sdk#which-binding)
المقايضات جنباً إلى جنب. واتخذ ذلك القرار قبل أن تكتب الكود: فهو يحسم نموذج
العمليات لديك، لا صياغتك وحدها.

## API المشغّل

واجهة HTTP API التي تقف خلف URnetwork. فهي تتولى الإقلاع الأولي لبروتوكول
`connect`، وتُصدر رموز JWT التي يصادق بها العملاء، وتكشف معاملات المطابقة
(match-making) التي تقوم عليها الشبكة. وكل مسار ومخطط موجود في
[/docs/api](/docs/api)، مولَّداً من المواصفة.

ونطاقها شبكتك **أنت**. فالاسم يدعو إلى فهمها على أنها تعمل على الشبكة
عموماً؛ وهي لا تفعل ذلك.

وخطوة واحدة يتعثّر بها الجميع تقريباً: مسارات `/auth` تعيد رمز JWT **بلا**
`clientId`، بينما يتطلب بروتوكول `connect` رمزاً **يحمله**. فاستخدم مسارات
`/network` لاستبداله. والشبكة شبكة فرعية فريدة عالمياً (`xyz.ur.network`)؛
و`clientId` عنوانٌ من 16 بايت، يعادل عنوان IPv6 ويُعبَّر عنه بصيغة UDID.

## تسجيل الدخول باستخدام URnetwork

يتيح للناس أن يقبلوا تطبيقك أو وكيلك البرمجي في شبكتهم الخاصة، فيستطيع
التنسيق مع كل ما يشغّلونه هناك. وهذه الميزة قيد التطوير ولم تُطلق بعد — انظر
[الصفحة نفسها](/docs/sign-in-with-urnetwork) لمعرفة ما هو موجود اليوم.

و[خادم MCP](/agents) ليس فئة رابعة. بل هو خادم موارد واحد يمكن الوصول إليه
برمز من تسجيل الدخول باستخدام URnetwork، ومثالٌ عملي على هذا النمط.

## حدود الرموز

يُوقَّع نظاما الاعتمادات **بمجموعتَي مفاتيح لا تتقاطعان**. وهذا حدٌّ أمني لا
مجرد عُرف: فرمز تسجيل الدخول باستخدام URnetwork ليس اعتماداً للمنصة، وتقديمه
حيث يُتوقع رمز JWT للمنصة يُخفق بحكم البناء. ورموز الوصول في OAuth مقيّدة
أيضاً بالجمهور (audience) — فكلٌّ منها يُتحقَّق منه لمورد واحد بالضبط ويُرفض
في كل مكان آخر.

وهناك عبورٌ واحد مُجاز، وهو جسرٌ لا التفاف: فالتطبيق المقبول يستبدل رمز
OAuth الخاص به برمز JWT للمنصة يحمل `clientId`، ونطاقه الشبكة التي قُبل
فيها. والاستبدال قرار تفويض يُتخذ على الخادم؛ ولا يوجد رمز واحد يُتحقَّق منه
في موضعين.

فإن كنت تحمل اعتمادين وأحدهما لا يعمل، فهذا في الغالب هو السبب.
