الميزات ومسار الطلب الكامل
صفحة مرجعية: ما يوفّره openFetch وترتيب التنفيذ من دمج الإعداد حتى إرجاع الاستجابة (بعد آخر التعديلات على الحزمة).
للمقارنات المعمّقة راجع البنية والداخلية. لجدول الخيارات راجع الإعدادات. النسخة الإنجليزية الكاملة: Features & pipeline.
نظرة على الحزمة
| الموضوع | التفاصيل |
|---|---|
| npm | @hamdymohamedak/openfetch |
| التنسيق | ESM فقط |
| اعتماديات التشغيل | صفر في الحزمة المنشورة (حزمة undici اختيارية ومن المستخدم على Node فقط عند dispatcher / allowH2) |
| المحركات | Node 18+ والمتصفحات وBun وDeno وWorkers |
| نقاط الدخول | الحزمة الرئيسية؛ /plugins؛ /sugar |
| النقل | fetch الأصلي فقط. HTTP/2 على Node عبر Undici اختياري وبتحكم المستخدم — راجع الإعدادات |
قائمة الميزات
العميل والإعداد
createClient/create— افتراضيات، أوامر HTTP،request،use.mergeConfig— دمج افتراضيات + استدعاء؛ دمج رؤوس؛ سلسلة للـmiddlewaresوtransformRequestوtransformResponseو**init**؛ دمج مركّب لـretry.onBeforeRetry/onAfterResponse؛ دمج سطحي لـretryوmemoryCache.init— مصفوفة دوال متزامنة على الإعداد المدمج قبل المعترضات (تعديل رؤوس، إلخ).Requestكمدخل —client.request(request, تجاوزات?)يدمج عنوان الطلب والطريقة والرؤوس والجسم والإشارة مع الافتراضيات.throwHttpErrors— سلوك قريب من Ky عند عدم وجودvalidateStatus:falseلا يرمي على حالة HTTP؛ دالة ترجعtrueتعني «ارمِ خطأ HTTP لهذه الحالة». إن وُجدvalidateStatusفهو يغلبthrowHttpErrors.
المعترضات والوسيط
- معترضات الطلب — تسلسل غير متزامن (LIFO).
- معترضات الاستجابة — تسلسل غير متزامن (FIFO).
- الوسيط — حول
next()حتى يصل الطلب إلىdispatch(استدعاءfetchالفعلي).
dispatch (النقل)
- بناء URL،
assertSafeUrlاختياري، رؤوس،Acceptمقترح عندresponseType، مصادقة Basic،transformRequest، ثمfetch. timeout— مع تمييزERR_TIMEOUTعن إلغاء المستخدمERR_CANCELEDعندما يكون الإلغاء من المهلة الداخلية فقط.rawResponse— تخطي التحليل وtransformResponse؛dataهيResponseالأصلية.
بعد fetch (المسار العادي)
- تحليل الجسم
validateStatus— فشل →ERR_BAD_RESPONSE(مع الجسم المحلّل إن وُجد)jsonSchema— تحقق Standard Schema اختياري؛ فشل →SchemaValidationErrortransformResponse
إعادة المحاولة
- backoff، حالات HTTP، الشبكة، مفتاح Idempotency لـ POST عند التفعيل، ميزانية زمنية أحادية
timeoutTotalMs. onAfterResponse— بعد نجاح المحاولة؛ رميOpenFetchForceRetryيعيد المحاولة.onBeforeRetry— بعد فشل محاولة وقبل الانتظار (عند وجود محاولة لاحقة).hooks()— يدمجonBeforeRetry/onAfterResponseفيctx.request.retry.
التخزين المؤقت والـ fluent
- وسيط ذاكرة للـ GET/HEAD مع TTL وSWR (انظر إعادة المحاولة والتخزين المؤقت).
- الإضافات:
timeout،hooks،debug،strictFetch. - Fluent:
createFluentClient، سلاسل مثل.json()و**.json(schema)**،.memo().
الأخطاء والمساعدات
OpenFetchError+toShape()للسجلات الآمنة نسبياً.isOpenFetchError,isHTTPError,isTimeoutError,isSchemaValidationError.assertSafeHttpUrl,maskHeaderValues,redactSensitiveUrlQuery, مفاتيح idempotency،cloneResponse.
الصورة الكاملة للـ pipeline (مخطط)
mermaid
flowchart TD
M[mergeConfig] --> I[init hooks متزامنة]
I --> RI[معترضات الطلب]
RI --> MW[كومة الوسيط]
MW --> RO[معترضات الاستجابة]
RO --> OUT[إرجاع OpenFetchResponse أو unwrap]داخل الوسيط (مثال createRetryMiddleware): كل محاولة تنفّذ await next() فيمرّ الوسيط الداخلي ثم dispatch. عند النجاح يُستدعى onAfterResponse؛ إذا أُلقِي OpenFetchForceRetry تُعاد المحاولة. عند الفشل يُستدعى onBeforeRetry (إن وُجد) ثم الانتظار ثم المحاولة التالية إن سمحت السياسة.
داخل dispatch (بعد fetch — ليس rawResponse)
mermaid
flowchart TD
A[URL + رؤوس + transformRequest + fetch] --> E{rawResponse?}
E -->|نعم| VS1[validateStatus على الحالة فقط] --> Z[إرجاع Response كـ data]
E -->|لا| P[parseBody]
P --> VS2[validateStatus]
VS2 --> JV{jsonSchema?}
JV -->|نعم| SCHEMA[Standard Schema]
JV -->|لا| TR
SCHEMA --> TR[transformResponse]
TR --> Z2[إرجاع OpenFetchResponse]مخطط نصي (نسخ سريع)
mergeConfig
↓
init hooks (sync)
↓
request interceptors
↓
middleware stack
↓
┌─ retry: لكل محاولة → next → … → dispatch
│ dispatch: URL/headers → transformRequest → fetch
│ [raw?] validateStatus → return Response
│ OR parse → validateStatus → jsonSchema? → transformResponse
│ ↓
│ onAfterResponse — رمي OpenFetchForceRetry؟ → حلقة المحاولة
│ ↓
└─ عند الفشل: onBeforeRetry → backoff → حلقة
↓
response interceptors
↓
returnملاحظات
onAfterResponseيعمل بعد اكتمالdispatch(بما فيهtransformResponse)، فيرىdataالنهائية إلا في حالةrawResponse.- الوسيط فوق retry يعمل مرة واحدة لكل استدعاء عميل؛ الوسيط تحت retry يعمل مرة لكل محاولة.
