الوثائق
رفيق المحمول
عميل iOS لسطح المكتب المقترن، مع تثبيت الشهادة ومراجعة المشروع وجلسات المساعدة المشتركة.
مترجم تلقائيًا من الإنجليزية. عرض الأصل بالإنجليزية
المنصة والإمكانيات
apps/mobile هو تطبيق Expo SDK 57 يستخدم React Native 0.86.3، React 19.2، Expo Router، NativeWind، Reanimated، وGesture Handler. يتم تنفيذ نقل الشبكة المثبتة المدعومة في Swift بواسطة المحلي companion-net وحدة. معرف حزمة iOS هو com.cadcamfun.mobile.
يقرأ الهاتف المشاريع، ويراجع التاريخ ويسحب الطلبات، ويرسل سير العمل، ويستقبل النشاط، ويتفاعل مع جلسات المساعد التي تعمل على سطح المكتب المقترن. يستمر سطح المكتب في امتلاك قاعدة البيانات والحسابات الهندسية وبيانات اعتماد موفر الذكاء الاصطناعي وتنفيذ سير العمل. يلزم توفر سطح مكتب قابل للتشغيل ويمكن الوصول إليه لإجراء هذه العمليات.
استخدم إصدار iOS الأصلي
لا يشمل Expo Go companion-net ولا يمكن الاتصال بسطح المكتب المقترن. تفشل الطلبات الأصلية عندما تكون وحدة التثبيت غير متوفرة. يستخدم الإجراء الاحتياطي لتطوير الويب جلب المتصفح والتخزين المحلي؛ ولا يوفر تثبيت الشهادة الأصلية.
هيكل التطبيق
يقوم جهاز Expo Router بفصل شاشات الاتصال عن علامات تبويب التطبيقات المعتمدة. app/connect.tsx يعالج مدخلات الاقتران ، app/pair.tsx يقبل الروابط العميقة، و app/(app) يحتوي على المشاريع والمساعد والنشاط والإعدادات. تتضمن شاشات المشروع لوحات النظرة العامة/السجل/السحب/سير العمل، وتفاصيل الالتزام، ومراجعة طلب السحب.
components/: عناصر تحكم قابلة لإعادة الاستخدام، ولوحات المشروع، والنص المساعد، وواجهة مستخدم الاتصال.lib/client.ts: العميل المكتوب عبر وسيلة نقل محقونة؛ يتم استيراد أنواع واجهة برمجة التطبيقات بدون وقت تشغيل الخادم.lib/pairing.ts,native.ts، وstorage.ts: التحقق من صحة الاقتران واختيار النقل وبيانات الاعتماد المستمرة.lib/sse.ts,live-events.ts، وchat-log.ts: تحليل الدفق والاشتراكات المباشرة وحالة النص.modules/companion-net/: وحدة Expo وتنفيذ HTTPS المثبت على Swift.
نطاق النقل والبوابة
البوابة المصاحبة منفصلة عن مستمع الاسترجاع الخاص بالسايدكار. يتم إيقاف تشغيله بشكل افتراضي. يؤدي تمكينه إلى تشغيل خادم HTTPS 0.0.0.0، باستخدام المنفذ 8443 ما لم يتم تحديد منفذ آخر صالح. تستمر الخدمة في حالتها الممكّنة وتستأنفها بعد بدء تشغيل السايدكار. يجب أن يسمح جدار الحماية لسطح المكتب ومسار الشبكة للهاتف بالوصول إلى هذا المستمع.
يرسل الهاتف رمزًا مميزًا للجهاز قابلاً للإلغاء. تقوم البوابة بتخزين تجزئة SHA-256 الخاصة بها، والتحقق من طريقة/مسار الطلب مقابل قائمة السماح، وإعادة توجيه الطلبات المقبولة إلى واجهة برمجة تطبيقات الاسترجاع باستخدام رمز سطح المكتب. لا يتلقى الهاتف رمز الإطلاق هذا. المصادقة غير الصالحة ترجع 401، والمسارات المرفوضة ترجع 403، والمصادقة الفاشلة المتكررة يمكن أن ترجع 429، وترجع المنبع غير المتاح 502.
Allowed families include project reads; version-control, pull-request, and workflow endpoints; project events; notifications; assistant status/models/agents; streaming chat; queue/abort; permissions; and session state/control. Files, credentials, plugins, billing, gateway administration, and GitHub remote/push/pull endpoints are excluded.
يتضمن الوصول إلى الجهاز عمليات الكتابة
تسمح البوابة حاليًا بالتزام التحكم في الإصدار والتفرع والخروج وطلبات الاستعادة بالإضافة إلى مراجعة طلبات السحب ودمجها. يتم تحديد نطاق الرموز المميزة للجهاز وفقًا لسياسة توجيه البوابة؛ فهي ليست دورًا للقراءة فقط أو تقييدًا لكل مشروع. قم بإبطال الهاتف المفقود أو غير الموثوق به في إعدادات رفيق سطح المكتب.
تحدد البوابة محاولات المصادقة الفاشلة: بعد عشر محاولات حامل فاشلة من عنوان IP واحد خلال 60 ثانية، تتلقى الطلبات الإضافية من هذا العنوان HTTP 429 حتى تنتهي صلاحية النافذة (apps/sidecar/src/services/companion-gateway.ts).
جلسات المساعد والرسائل دون اتصال
يرسل الرفيق طلبات الدردشة إلى POST /api/ai/chat/stream ويوزع الأحداث المرسلة من الخادم. يسمح معرف الجلسة بمواصلة محادثة سطح المكتب. يمكن للعميل توجيه الرسائل أو وضعها في قائمة الانتظار، وإلغاء الدور، والإجابة على الأسئلة، والرد على طلبات الأذونات. تكوين موفر النموذج على سطح المكتب؛ يستعلم الهاتف عن حالة الذكاء الاصطناعي قبل الاستخدام.
إذا انتهى الدفق بدون محطة done أو error الإطار ولم يتم إلغاؤه، أبلغ العميل عن اتصال غير كامل. يغلق النقل المحلي عنوان الدفق الخاص به عند الإلغاء والإكمال. يحافظ فك التشفير الأصلي على كميات UTF-8 غير كاملة بين أجزاء البايت.
يمكن لرسائل المساعد التي لا يمكن إرسالها أن تدخل في قائمة انتظار مستمرة. ويحتفظ بعدد 50 من الإدخالات على الأكثر، مع إسقاط الإدخالات الأقدم عندما تكون ممتلئة، وإعادة المحاولة في المقدمة واسترداد الاتصال. تبقى الإدخالات الفاشلة في قائمة الانتظار. تقوم قائمة الانتظار هذه بتخزين الرسائل للتنفيذ لاحقًا؛ إنها ليست نسخة غير متصلة بالإنترنت من هندسة المشروع أو وقت تشغيل AI غير متصل بالإنترنت.
بناء وتشغيل
bun install
bun run --cwd apps/mobile test
bun run --cwd apps/mobile typecheck
bun run --cwd apps/mobile build
bun run --cwd apps/mobile ios
bun run --cwd apps/mobile ios:release --device يقوم أمر الإنشاء بتصدير حزمة iOS JavaScript إلى apps/mobile/dist; لا ينتج IPA. تتطلب أوامر تشغيل iOS أنظمة التشغيل macOS وXcode وCocoaPods. يتطلب تثبيت الجهاز أيضًا جهازًا موثوقًا به ووضع المطور وفريق توقيع Apple الذي تم تكوينه لمشروع Xcode الذي تم إنشاؤه. native:generate يقوم بتشغيل Expo prebuild لنظام التشغيل iOS دون تثبيت القرون. بالنسبة للعمل اليومي، start (الاسم المستعار dev) يدير حزمة عميل تطوير Expo، ios:dev قم بتشغيله على المضيف المحلي وفتح محاكي iOS، ios:build يجمع تطبيق تصحيح الأخطاء دون بدء أداة تجميع، و web يبدأ هدف الويب الخاص بـ Expo. ال test يعمل البرنامج النصي bun test test داخل apps/mobile.
.github/workflows/ci.yml يحدد فحص النوع المصاحب، والاختبارات المنطقية، وتصدير جافا سكريبت. .github/workflows/ios.yml ينشئ مشروع Xcode، وينشئ تطبيق محاكاة إصدار غير موقّع، ويقرنه بسايدكار مباشرة، ويتحقق من قائمة المشاريع المصادق عليها، ويلتقط لقطة شاشة. لا تؤدي عمليات التحقق التي تم تكوينها إلى إنشاء قبول للجهاز الفعلي أو التوقيع أو TestFlight أو الموفر الحقيقي.
التخزين وأمن الجهاز
على نظام التشغيل iOS الأصلي، يتم تخزين بيانات اعتماد الاقتران في Expo SecureStore. يستخدم إدخال الاقتران WHEN_UNLOCKED_THIS_DEVICE_ONLY. تستخدم إدخالات قائمة الانتظار غير المتصلة والعلامات التي تمت مشاهدتها خلال الجلسة أيضًا SecureStore. يستخدم الاحتياطي للمتصفح التخزين المحلي للتطوير.
يستعلم التطبيق عن القدرة والاستخدامات البيومترية expo-local-authentication للمصادقة المحلية، مع تمكين الرجوع إلى رمز مرور النظام. لا تغير واجهة المستخدم البيومترية أذونات المسار من جانب الخادم الخاصة بالبوابة. يتم التحكم في إلغاء الجهاز من خلال سطح المكتب المقترن.
يحتفظ سطح المكتب بشهادة البوابة والمفتاح الخاص في الدليل المصاحب لبيانات التطبيق الخاص به؛ المفتاح مكتوب بأذونات المالك فقط. يؤدي استبدال هذه الشهادة إلى تغيير بصمة الإصبع المثبتة ويتطلب إقرانًا جديدًا موثوقًا به.
سير عمل مراجعة المشروع
- افتح المشاريع واختر مشروع سطح المكتب.
- افحص حالة العمل أو الفروع أو الالتزامات أو طلبات السحب أو تشغيل سير العمل.
- افتح التزامًا لمراجعة الفروق الخاصة به، أو افتح طلب سحب لمراجعة التغييرات وإرسال الحكم.
- استخدم إجراءات الدمج/الإغلاق أو إرسال سير العمل المتوفرة عندما يكون ذلك مناسبًا للمشروع.
- افتح المساعد بسياق المشروع المحدد لمواصلة أو بدء جلسة الذكاء الاصطناعي.
يتم تنفيذ جميع التغييرات على سطح المكتب. انقطاع الشبكة، أو إلغاء الترخيص، أو توقف سطح المكتب يمنع عمل الخادم الجديد؛ تتم إعادة محاولة رسائل المساعد الموجودة في قائمة الانتظار محليًا لاحقًا.
واجهة العميل
CompanionClient يقبل أ Transport with JSON request and text-stream methods. It exposes project reads; VCS status, history, diff, commit, branch, checkout, and restore; pull requests and reviews; workflow runs and dispatch; AI status/models/agents; session control; notifications; and project event streams.
تصبح حالات فشل JSON CompanionError مع الحالة والرسالة. تستخدم الدردشة المتدفقة والأحداث المباشرة محلل SSE المشترك بحيث لا تصبح حدود قطع الشبكة التعسفية حدود أحداث التطبيق. تقوم الاختبارات بإدخال وسائل النقل دون استيراد الوحدات الأصلية أو تشغيل جهاز محاكاة.
إقران الهاتف
- على سطح المكتب، افتح الإعدادات ولوحة الجوال المصاحبة لها، أو
/settings/companion، وقم بتشغيل البوابة. - قم بإنشاء اقتران جهاز مسمى وعرض رمز الاستجابة السريعة. يحتوي الرابط على مرشحي مضيف HTTPS، ورمز الجهاز، وبصمة الشهادة.
- على نظام iOS، قم بمسح رمز QR ضوئيًا أو لصقه
cadcamfun://pairوصلة. السماح بالوصول إلى الشبكة المحلية عند المطالبة بذلك. - يتحقق التطبيق من صحة الرابط، ويتنافس مع المرشحين المضيفين المُعلن عنهم، ويحتفظ بأول اتصال صحي ناجح.
- تأكد من ظهور الجهاز في إعدادات سطح المكتب. استخدم إجراء إبطال سطح المكتب لإزالة وصوله.
يتضمن مرشحو المضيف عناوين IPv 4 الخاصة المناسبة وعناوين الشبكة المتراكبة؛ تعلن البوابة عن ستة عناوين مكتشفة على الأكثر. المستمع الحالي هو IPv4، لذا لا يتم الإعلان عن عناوين IPv6 المكتشفة. يجب أن توفر شبكة VPN أو الشبكة المتراكبة بالفعل توجيهًا للاستخدام بعيدًا عن الشبكة المحلية؛ لا يؤدي الاقتران إلى إنشاء مرحل أو VPN.
تثبيت الشهادة
يستخدم تطبيق Swift سريع الزوال URLSession الحالات مع مندوب الثقة. فهو يقبل الشهادة الطرفية فقط عندما تكون تجزئة SHA-256 لبايتات DER الخاصة بها مساوية لبصمة الإصبع من الاقتران. تتطلب الطلبات HTTPS، ويتم رفض عمليات إعادة التوجيه، ولا يقوم المتصلون الأصليون أبدًا بالرجوع إلى نقل المتصفح بصمت.
ولذلك تأتي ثقة الشهادة من رابط الاقتران. تعامل مع رمز الاستجابة السريعة والرابط الملصق كبيانات اعتماد. يجب استبدال الرابط ذو الأصل غير المتوقع أو بصمة الإصبع من خلال تدفق الاقتران بسطح المكتب بدلاً من تجاوز التحقق من صحة TLS.
تشخيص اتصال
- لا توجد وسيلة نقل محلية: تثبيت تطوير iOS أو إصدار الإصدار الذي يحتوي على الوحدة المحلية.
- لا يوجد مضيف يمكن الوصول إليه: تحقق من إذن الشبكة المحلية وجدار حماية سطح المكتب والعنوان المعلن عنه ومنفذ البوابة وتوجيه الشبكة.
- 401: الرمز المميز للجهاز غير صالح أو تم إبطاله؛ إنشاء اقتران جديد.
- 403: نقطة النهاية خارج القائمة المسموح بها المصاحبة.
- عدم تطابق الشهادة: قم بإقرانه مرة أخرى بشهادة سطح المكتب الحالية.
- المساعد غير متاح: تحقق من تكوين موفر سطح المكتب وما إذا كان السايدكار قيد التشغيل.
إعدادات الهاتف والحالة المحلية
| جلسة | تقصير | سلوك |
|---|---|---|
| مظهر | نظام | اختر النظام، أو الضوء، أو الظلام. يتبع النظام iOS حتى يتم تجاوزه. |
| اللمس | ممكّن | علامات التحديد وتعليقات النجاح/الخطأ لها مفاتيح تبديل منفصلة. |
| قفل معرف الوجه | عاجز | يتطلب التمكين القياسات الحيوية المتاحة والمسجلة ومصادقة النظام الناجحة. |
| قفل على الخلفية | ممكّن | عند تمكين القفل البيومتري، يؤدي الانتقال إلى الوضع غير النشط/الخلفية إلى قفل التطبيق المقترن. |
| اتصال سطح المكتب | الاقتران الحالي | يظهر العنوان وبادئة بصمة الإصبع؛ يؤدي النقر فوق صف سطح المكتب إلى إعادة فحص الاتصال. |
| الرسائل في قائمة الانتظار | صفر | يعرض رسائل المساعد المعلقة عندما يكون سطح المكتب غير قابل للوصول. |
توجد تفضيلات واجهة المستخدم في AsyncStorage ضمن cadcamfun.ui.v1; تستخدم بيانات الاعتماد والرسائل الموضوعة في قائمة الانتظار وعلامات الجلسة المرئية SecureStore. يتذكر متجر واجهة المستخدم المشروع المحدد والجلسة الأخيرة لكل مشروع لسطح مكتب واحد مقترن. يؤدي تغيير هوية سطح المكتب إلى مسح تعيين المشروع/الجلسة الذي تم تذكره بحيث لا يتم إعادة استخدامه على خادم غير ذي صلة.
يتخطى منسق القفل شاشات التمهيد والاتصال ويعرض تراكب إلغاء قفل ملء الشاشة للتطبيق المقترن. ولا يقوم بتعليق الجلسات من جانب الخادم أو إلغاء الرمز المميز. يؤدي إلغاء الاقتران إلى إزالة الاقتران المحفوظ بالهاتف والعودة إلى الاتصال؛ إبطال سطح المكتب هو الإجراء المنفصل الذي يمنع الرمز المميز من المصادقة مرة أخرى.
مثال على إدارة البوابة
تعمل هذه الطلبات ضد واجهة برمجة تطبيقات الاسترجاع لسطح المكتب مع رمز التشغيل الخاص بها، وليس ضد بوابة الهاتف. استخدم مثيل تطوير معزول. استبدل منفذ المثال بالمنفذ من حدثه الجاهز وقم بتوفير الرمز المميز لهذه العملية.
CADCAM_URL=http://127.0.0.1:43111
CADCAM_TOKEN=local-development-token
curl --fail-with-body "$CADCAM_URL/api/companion" -H "Authorization: Bearer $CADCAM_TOKEN"
curl --fail-with-body -X POST "$CADCAM_URL/api/companion/enable" -H "Authorization: Bearer $CADCAM_TOKEN" -H 'Content-Type: application/json' -d '{"port":18443}' تحتوي استجابة الحالة على enabled، لاغية port، لاغية fingerprint، المقترح host، و devices. تقبل الخدمة منافذ صريحة من 1024 حتى 65535. يفشل المنفذ المستخدم بالفعل في بدء تشغيل المستمع؛ اختر منفذًا آخر وأعد إنشاء عنوان الاقتران.
curl --fail-with-body -X POST "$CADCAM_URL/api/companion/pair" -H "Authorization: Bearer $CADCAM_TOKEN" -H 'Content-Type: application/json' -d '{"name":"Development iPhone","host":"192.168.1.20"}' استبدل المضيف المثال بعنوان يمكن للهاتف التوجه إليه. يؤدي إنشاء الاقتران الناجح إلى إرجاع HTTP 201 مع الجهاز id وحاملة أوراق الاعتماد link. يجب أن يحتوي الاسم المقصوص على 1–60 من الأحرف. قم بمسح/لصق هذا الرابط بشكل خاص؛ لا تنسخه في تقرير الأخطاء. لا يؤدي إنشاء الرمز المميز إلى تشغيل البوابة تلقائيًا.
لإزالة الوصول، أرسل DELETE /api/companion/devices/<id> باستخدام ترخيص سطح المكتب. لإيقاف كل حركة مرور البوابة الجديدة، أرسل POST /api/companion/disable. يتم فحص تجزئات الجهاز في كل طلب، لذلك يتم رفض الرموز المميزة الملغاة في الطلبات اللاحقة.
الاسترداد دون فقدان السياق
- انقر فوق صف الاتصال بسطح المكتب في الإعدادات لإعادة محاولة الحماية ضد المضيفين المعلنين.
- إذا فشل مسار شبكة واحد فقط، فتحقق من مسار Wi-Fi/نقطة الاتصال/VPN الصحيح وأعد إنشاء رمز QR بعد تغيير عنوان سطح المكتب.
- إذا فشل التفويض، قم بإلغاء الجهاز القديم على سطح المكتب وإنشاء اقتران جديد.
- إذا فشل التدفق المساعد فقط، فأعد فتح جلسة المشروع وافحص حالته قبل إعادة إرسال نفس التعليمات.
- فحص عدد الرسائل في قائمة الانتظار قبل إرسال مطالبة مكررة؛ العمليات في قائمة الانتظار أعد المحاولة لاحقًا.
تحتوي قائمة الانتظار غير المتصلة على الاحتفاظ بحدود وتعيد تشغيل كل عملية معلقة من خلال طلب دردشة جديد يحمل معرف الجلسة المخزنة عندما يكون ذلك متاحًا. إنه ليس ضمان التسليم مرة واحدة بالضبط. قد يؤدي انقطاع الشبكة بعد تنفيذ الخادم إلى ترك العميل غير متأكد من اكتمال العملية؛ فحص حالة المشروع/الجلسة الناتجة قبل تكرار التغيير.
مراسي التنفيذ: app/(app)/settings.tsx, components/layout/AppLockCoordinator.tsx, lib/store.ts, lib/server.tsx، و lib/offline-queue.ts.
قائمة السماح بالبوابة
يتحدث الهاتف إلى سطح المكتب فقط من خلال البوابة المصاحبة، التي تعترف بهذه المجموعة الثابتة من المسارات وتعيد توجيهها إلى واجهة برمجة تطبيقات الاسترجاع:
| طُرق | نمط المسار | غاية |
|---|---|---|
| GET | /api/health | التحقق من إمكانية الوصول. |
| GET | /api/projects, /api/projects/:id | قائمة المشروع والرأس. |
| الحصول على، نشر | /api/projects/:id/vcs/* (يستثني remote, push, pull), /pulls/*, /actions/* | التاريخ وطلبات السحب والمراجعات وعمليات سير العمل. تظل مزامنة GitHub على سطح المكتب لأنها تحتاج إلى رمز GitHub الخاص بالمالك. |
| GET | /api/projects/:id/events | بث مباشر لـ SSE للتاريخ وسير العمل ونشاط المساعد؛ قناة الدفع الوحيدة للهاتف. |
| الحصول على، نشر، وضع، حذف | /api/notifications, /mark-all-read, /:id | قراءة، ووضع علامة على القراءة، وحذف الإخطارات. |
| GET | /api/ai/status, /models, /agents | اكتشاف مساعد. |
| POST | /api/ai/chat/stream, chat/abort, chat/queue, permission/reply, sessions/state, sessions/control | جلسات مساعده. |
نظرًا لأن القائمة ثابتة في السايدكار، فإن الميزة التي تحتاج إلى مسار آخر (على سبيل المثال تحميل ملف أو دفع GitHub) هي ميزة لسطح المكتب فقط حتى تتغير القائمة.
ما يخزنه الهاتف
| غرض | تخزين | ملحوظات |
|---|---|---|
| أصل (مصادر) البوابة | SecureStore | يتناوب المضيف المفضل بالإضافة إلى رابط الاقتران. |
| رمز الجهاز | متجر آمن, WHEN_UNLOCKED_THIS_DEVICE_ONLY | لا تترك الجهاز أبدًا إلا كحامل رأسي للبوابة. |
| بصمة الشهادة | SecureStore | مقارنة بشهادة البوابة في كل اتصال. |
| قائمة الانتظار دون اتصال، علامات الجلسة | SecureStore | الرسائل التي تم إنشاؤها أثناء عدم الاتصال بالإنترنت وحالة الجلسة الأخيرة. |
في بناء تطوير المتصفح، تعود نفس البيانات إلى التخزين المحلي، وهو غير مشفر. استخدمه فقط مع الاقترانات السريعة.
شاشات
| ملف الطريق | شاشة |
|---|---|
app/index.tsx | الإدخال: لا يوجد اقتران → شاشة الزوج؛ مقترن → المشاريع |
app/connect.tsx, app/pair.tsx | الاقتران: امسح رمز الاستجابة السريعة بالكاميرا أو الصق الرابط |
app/(app)/projects/index.tsx | قائمة المشروع |
app/(app)/projects/[id].tsx | مشروع واحد |
app/(app)/projects/[id]/commit/[oid].tsx | الالتزام وتغيراته |
app/(app)/projects/[id]/pulls/[number].tsx | طلب سحب: المراجعة والدمج |
app/(app)/assistant.tsx | دردشة مساعد |
app/(app)/activity.tsx | نشاط حي |
app/(app)/settings.tsx | إعدادات الاتصال والجهاز |
تستخدم المسارات اصطلاحات ملفات Expo Router: (app) هي مجموعة تشترك في التخطيط دون إضافة مقطع URL، و [id] هي معلمة.
قائمة انتظار مساعد غير متصل
عندما لا يمكن الوصول إلى سطح المكتب، يتم وضع الرسالة المكتوبة في المساعد في قائمة الانتظار على الهاتف بدلاً من فقدانها:
| قاعدة | قيمة |
|---|---|
| أين | SecureStore، لذلك يحتفظ التطبيق المقتول بقائمة الانتظار |
| ما يتم تخزينه | projectId, text، خياري sessionId, agent, mode (عام، CAD، كام، gcode، مسار الأدوات؛ عام افتراضي) و queuedAt |
| سعة | 50 إدخالات؛ يتم إسقاط الأقدم أولاً |
| عندما ينضب | عندما يعود التطبيق إلى المقدمة مع الاقتران المخزن |
| كيف | يفتح كل إدخال دورة دفق جديدة ويقرأ حتى done; ان error الحدث أو الانتقال في الخلفية يبقيه في قائمة الانتظار |
| تعليق | نخب: "تم إرسال رسالة في قائمة الانتظار" أو "تم إرسال N من الرسائل في قائمة الانتظار" |
فشل الاتصال فقط في قائمة الانتظار للرسالة. يتم احتساب الإرسال على أنه غير متصل عندما يبلغ العميل عن الحالة 0، أو عندما يشير نص الخطأ إلى فشل الشبكة، أو انتهاء المهلة، أو رفض الاتصال أو ما شابه ذلك؛ تظهر أخطاء HTTP وأخطاء الأعمال ("طلب ... فشل مع ...") بدلاً من وضعها في قائمة الانتظار.