ما هي أحداث الخادم المُرسلة (Server-Sent Events) ولماذا تحتاجها؟
\n\nتخيل أنك تفتح موقعًا لأسعار العملات، وسعر الدولار يتغير أمام عينيك مباشرة — دون تحديث الصفحة أو الضغط على أي أزرار. أو أنك تنتظر نتيجة معالجة ملف كبير على الخادم، وفجأة يظهر سطر: "اكتمل 70%". كيف يعمل هذا؟ واحدة من أكثر الطرق أناقةً هي أحداث الخادم المُرسلة (Server-Sent Events أو SSE).
\n\nSSE هي تقنية تسمح للخادم بإرسال البيانات إلى العميل تلقائيًا في أي لحظة، بمجرد ظهورها. على عكس WebSocket، تعمل SSE في اتجاه واحد فقط — من الخادم إلى العميل. ولكن في هذا تكمن قوتها الخارقة: فهي بسيطة للغاية، فعّالة، ومثالية للمهام التي يحتاج فيها العميل فقط إلى تلقي التحديثات.
\n\nفي هذا المقال، سنتعمق في كيفية استخدام أحداث الخادم المُرسلة في JavaScript، وسنكتب كودًا عمليًا، وسنفهم متى يكون SSE هو الخيار الأفضل، ومتى يكون من الأفضل النظر نحو WebSocket. هل أنت مستعد؟ هيا بنا!
\n\nكيف تعمل أحداث الخادم المُرسلة (SSE)؟
\n\nمن الناحية التقنية، SSE هي مجرد اتصال HTTP لا يغلقه الخادم بعد إرسال الرد. بدلاً من ذلك، يرسل البيانات على أجزاء باستخدام تنسيق خاص text/event-stream. العميل (المتصفح) يستمع إلى هذا الاتصال عبر كائن EventSource ويُولّد أحداثًا عند استلام كل رسالة جديدة.
إليك كيف يبدو رد الخادم النموذجي:
\n\ndata: {"message": "مرحبًا!", "timestamp": 1700000000}\n\ndata: {"message": "إشعار جديد", "timestamp": 1700000001}\n\nتبدأ كل رسالة بـ data:، يليها مسافة ثم المحتوى نفسه. تُفصل الرسائل بسطرين جديدين \\n\\n. يمكن للخادم أيضًا إرسال معرفات (id:) وأنواع أحداث (event:)، لكن الحد الأدنى هو data.
الجانب العميل أبسط:
\n\nconst eventSource = new EventSource('/events');\n\neventSource.onmessage = (e) => {\n console.log('تم استلام البيانات:', e.data);\n};\n\neventSource.onerror = (e) => {\n console.error('خطأ في الاتصال', e);\n};\n\nهذا كل شيء! لا مصافحة معقدة، ولا مكتبات — المتصفح يعيد الاتصال تلقائيًا عند الانقطاع، ويتعامل مع فقدان الاتصال بنفسه. هذا هو السحر الحقيقي لـ أحداث الخادم المُرسلة.
\n\nSSE مقابل WebSocket: متى تختار أيهما؟
\n\nغالبًا ما يعتقد المبتدئون: "بما أن SSE أبسط، فهي دائمًا أفضل". لكن هذا غير صحيح. لكل تقنية مجالها الخاص. دعنا نقارن.
\n\n| الخاصية | \nSSE | \nWebSocket | \n
|---|---|---|
| اتجاه البيانات | \nخادم → عميل فقط | \nثنائي الاتجاه | \n
| سهولة التنفيذ | \nبسيطة جدًا (متصفح أصلي) | \nمتوسطة (تحتاج مكتبة) | \n
| إعادة الاتصال التلقائي | \nمدمجة | \nتحتاج تنفيذ يدوي | \n
| دعم المتصفحات | \nجميع المتصفحات الحديثة (باستثناء IE) | \nجميع المتصفحات الحديثة | \n