متوفر أيضًا بلغات أخرى: English · Español · Português · Français
محلل أحداث الخادم SSE: انظر ما ينطلق فعلًا
الصق دفق أحداث لتحصل على ما يُرسَل منه، ومعرّف آخر حدث عند كل واحد، وسببِ ألا تفعل بقية السطور شيئًا.
ما أحداث الخادم؟
أحداث الخادم هي النصف البسيط من الزمن الحقيقي في الويب: يُبقي الخادم استجابةً مفتوحة ويكتب فيها سطور نص، ويحوّل المتصفح كل كتلة سطور إلى حدث، وتستمع شيفرتك. لا مصافحة ولا تأطير ولا مكتبة، بل استجابة نوعُ محتواها text/event-stream ومتنُها سطورٌ مثل data: شيء. وهذا ما تستعمله أكثر الواجهات المتدفقة لدفع الرموز أولًا بأول، وهي صيغة من البساطة بحيث يكتب الناس خوادمها بأيديهم.
وكتابتها باليد هي بالضبط حيث يبدأ العَنَت، لأن الصيغة أشد صرامةً مما تبدو. فخوارزمية التحليل محددة بتمامها، حتى أيُّ مخزنٍ يحمل ماذا ومتى يُفرَّغ كلٌّ منها، وعدةٌ من قواعدها عكسُ ما يوحي به شكل التركيب. وقد يبدو الدفق معقولًا تمامًا، ولا يحوي خطأً البتة، ولا يسلّم شيئًا.
تشغّل هذه الصفحة تلك الخوارزمية على ما تلصقه. تعرض الأحداث الخارجة، ومعها معرّف آخر حدث كما يحمله المحلّل في تلك اللحظة، وتعرض كل سطر لم يُسهم بشيء ومعه السبب. وهذا النصف الثاني هو الذي جئتَ تبحث عنه غالبًا.
طريقة الاستخدام
- الصق متن الدفق. متن الاستجابة كما سار على الشبكة، لا الترويسات. ويجوز أن تنتهي السطور بسطر جديد أو بإرجاع المؤشر أو بهما معًا؛ الثلاثة جائزة، وفي الأمثلة دفقٌ يستعمل كلًّا منها.
- اقرأ الأحداث التي انطلقت. كلٌّ بنوعه وبياناته ومعرّف آخر حدث لحظة الإرسال. وإن خرج الجدول فارغًا، فالكتلة أدناه تبيّن أي سطر كان السبب.
- انظر السطور التي لم تفعل شيئًا. تعليقات، وحقول غير معروفة، واسم حقل بحالة أحرف خاطئة، ومعرّفٌ فيه محرف صفر، وretry ليس رقمًا، وأي كتلة انتهت بلا إرسال. وكل صف يذكر أي هذه الحالات كان.
القاعدة التي يتعثر بها الجميع
الحدث الذي لا بيانات له لا يُرسَل. والمواصفة صريحة: إذا كان مخزن البيانات فارغًا حين يصل سطر فارغ، أفرغ المحلّل المخازن وعاد بلا أن يُنتج شيئًا. فالخادم الذي يرسل حقل event ثم سطرًا فارغًا، وهي طريقة طبيعية تمامًا لكتابة نبضة إبقاء، لا يوقظ مستمعًا ولا يسجّل خطأً ولا يُظهر في لوحة الشبكة إلا دفقًا يبدو عاملًا.
والعلاج حقلُ data ولو فارغًا، أو تعليق. ويكفي حقل data فارغ، لأن المحلّل يضيف سطرًا جديدًا إلى المخزن عن كل سطر data، فلا يبقى المخزن فارغًا وإن كانت القيمة فارغة. وسطر التعليق نقطتان يتلوهما ما شئت، وهو الطريقة المتعارفة لإبقاء الاتصال حيًّا: لا يعيد ضبط مؤقّت أحد ولا يُنتج شيئًا.
والنصف الآخر من القاعدة نفسها يسهل أن يفوت في الاتجاه المعاكس. فمخزن نوع الحدث يُفرَّغ عند كل إرسال، فالحدث الذي لا حقل event له هو message. أما مخزن معرّف آخر حدث فلا يُفرَّغ: تقول المواصفة صراحةً إنه لا يُعاد ضبطه، فيحتفظ بقيمته حتى يضبطها الخادم من جديد. مخزنان متجاوران في الخوارزمية نفسها، وعمراهما متعاكسان. والحدث الذي لا معرّف له يرث سابقه، وهذا ما يعود في ترويسة Last-Event-ID حين ينقطع الاتصال ويعيد المتصفح الوصل.
أربع قواعد أصغر يحسن معرفتها
تُزال مسافة واحدة بالضبط من أول القيمة. واحدة. فالسطر data: مرحبا والسطر data:مرحبا سواء، أما data: مرحبا بمسافتين فيبقي واحدة. وهذه طريقة شائعة لتسريب مسافة زائدة إلى JSON يفشل تحليله بعدها بلا سبب ظاهر.
وتُقارن أسماء الحقول حرفيًّا بلا طيّ لحالة الأحرف. فـ Data ليست data. والاسم بحرف كبير ليس خطأً ولا يُنبَّه عليه في أي مكان، بل هو ببساطة حقل غير معروف، والحقول غير المعروفة تُهمَل. وكذلك أي خطأ إملائي: الأسماء أربعة بالضبط، وما عداها يُسقَط في صمت.
والمعرّف الذي تحوي قيمته محرف الصفر يُهمَل بتمامه. لا يُقتطع عند الصفر ولا يُفرَّغ: بل يحتفظ المخزن بما كان فيه، فيرث الحدثُ التالي المعرّفَ الأقدم. ولا يُطبَّق retry إلا إذا كانت قيمته أرقامًا خالصة، وهذا يستبعد العدد السالب والعشري وكل ما التصقت به وحدة.
وأخيرًا، الدفق الذي يتوقف في وسط حدث يفقد ذلك الحدث. تقول المواصفة إنه عند بلوغ النهاية يجب إسقاط أي بيانات معلّقة، فالكتلة التي فيها سطر data ولا سطر فارغ بعدها لا تصل أبدًا. وتميّز هذه الأداة تلك الحالة من حالة دفق يتوقف في وسط سطر، حيث لم تصر الحروف الأخيرة سطرًا قط ولم يُنظر إليها أصلًا.
ما لا تفعله هذه الأداة
لا تتصل بشيء. أنت تلصق متنًا، والصفحة تقرؤه. ولالتقاط دفق حقيقي، تعرض لوحة الشبكة في متصفحك الاستجابةَ وهي تصل، ويطبعها عميل HTTP في سطر الأوامر أولًا بأول.
وهي تقرأ دفقًا كاملًا لا دفقًا حيًّا، وهذا يجعل حالةً واحدة تختلف عن عميل حقيقي. فالدفق المنتهي بإرجاع مؤشر مفرد لا لبس فيه هنا، إذ لا شيء بعده؛ أما المحلّل المتدفق الذي يتلقى البايتات نفسها فعليه أن يمسك ذلك الإرجاع تحسّبًا لأن تبدأ القطعة التالية بسطر جديد، فهما معًا نهاية سطر واحدة. وكلا السلوكين صحيح لما هو عليه.
ولا تتحقق كذلك من أن بياناتك JSON سليم ولا من أي شيء آخر. فالصيغة تحمل نصًّا ولا تعنيها دلالته، وهذا جدير بالتذكر: إذ يُوصَل حقل data الموزَّع على سطور عدة بأسطر جديدة بين قطعه، وتلك طريقة جائزة لإرسال JSON منسَّق تنتجها خوادم كثيرة مكتوبة باليد من غير قصد.
لماذا هي مجانية؟
قراءة سطور من نص شيء يؤديه متصفحك في الحال. فلا خادم في المسار، ولا شيء يستوجب فاتورة، ولا حساب يلزم إنشاؤه.
ولا يُرفع أي شيء. فالدفق الذي تلصقه يبقى في هذا التبويب.