انتقل إلى المحتوى

المحاكيات ​

المحاكي هو Signal Lab في دور الـ API أو الجهاز أو الخدمة التي يتحدث إليها النظام. يستمع على عنوان واحد ويجيب وفق قواعد: واجهة HTTP API حسب المسارات، وجهاز OSC أو UDP أو TCP وفق «عند هذا، يُرد بذاك»، ووسيط MQTT كما يفعل أي وسيط إضافةً إلى قواعد خاصة به. ويمكن أن يكون بطيئًا، أو يفشل، أو يتعطل من حين لآخر، لاختبار ما يفعله النظام حين تسيء تبعيته التصرف. ويُعدّ كل تبادل ويُسرد ويُرسل إلى الفاحص.

المحاكي مستند واحد. تحتفظ شاشة المحاكيات بمكتبة منها؛ ويعمل المستند نفسه داخل تجربة بوصفه عقدة محاكٍ، ومن سطر الأوامر بـ signallab emulate، وعبر واجهة API وMCP، ويجيب بالطريقة نفسها في كل مكان.

الشاشة ​

على اليمين المكتبة (المكتبة): كل محاكٍ مع بروتوكوله وعنوانه، ونقطة نابضة وعدد الطلبات على المحاكيات الجارية. وعلى اليسار إعدادات المحاكي المحدد وقواعده، وتحتها ما استقبله (مباشر).

إنشاء محاكٍ ​

  1. الضغط على أحد الأزرار أعلى المكتبة:

    الزرما ينشئهيستمع علىمع قاعدة واحدة تعمل كما هي
    + HTTP APIواجهة HTTP API127.0.0.1:18080GET /health ← 200 {"status":"ok"}
    + جهاز OSCجهاز OSC127.0.0.1:9100/ping ← /pong مع العدد بنوع int
    + جهاز UDPجهاز UDP127.0.0.1:7100مخطط بيانات يحتوي على PING ← PONG 1، PONG 2، …
    + جهاز TCPجهاز TCP127.0.0.1:7200سطر يحتوي على PING ← PONG
    + وسيط MQTTوسيط MQTT127.0.0.1:1883نشر إلى lab/<name>/set ← الحمولة نفسها، محتفظًا بها، على lab/<name>/state

    وإذا كان محاكٍ آخر في المكتبة يستخدم ذلك المنفذ، يؤخذ المنفذ الحر التالي.

  2. تعيين الحقل الاسم (120 حرفًا على الأكثر).

  3. تعيين الحقل الاستماع على: IP:port. العنوان 127.0.0.1 يجيب هذا الكمبيوتر فقط؛ و0.0.0.0 يجيب الشبكة أيضًا.

  4. تغيير القواعد (أدناه)، وذكر ما يقوم المحاكي مقامه في الحقل ملاحظة.

تُحفظ التغييرات تلقائيًا. وينشئ الزر استنساخ نسخة على المنفذ الحر التالي. ويطلب الزر حذف تأكيدًا مرة أخرى (حذف؟)، ويوقف المحاكي إن كان يعمل، ويزيله من المكتبة.

تُجرَّب القواعد بالترتيب، من الأولى إلى الأخيرة؛ وأول قاعدة تطابق هي التي تجيب. يعرض رأس كل قاعدة ملخصًا في سطر واحد؛ وبالنقر عليه تُفتح القاعدة أو تُطوى. ويحرّك الزران ↑ و↓ القاعدة، ويزيلها ×.

تشغيله ​

  1. تحديد المحاكي والضغط على بدء. يُفتح منفذه قبل أن يعود الزر: والمنفذ المشغول، أو المحاكي الذي فيه مشكلة، يُرفض هناك مع ذكر السبب.
  2. توجيه النظام إليه. لواجهة HTTP API، ينسخ الزر نسخ URL عنوانها (http://127.0.0.1:18080)، ولكل مسار زر نسخ URL لعنوانه الخاص (إلا إذا تضمّن مساره قالب {{…}}).
  3. متابعة قائمة المستلمة وهي تمتلئ.
  4. الضغط على إيقاف، أو إيقاف مهمته من شريط وحدة التحكم.

تعرض الحالة بجانب الأزرار لا يعمل، أو أين يجيب المحاكي، أو أنه متعطل.

يواصل المحاكي الإجابة بالقواعد التي بدأ بها. وعند تغييره أثناء عمله، يظهر الزر إعادة التشغيل: والضغط عليه يعيد التشغيل بالقواعد كما هي الآن. وحتى ذلك الحين تُخفى أعداد المطابقات على القواعد، لأنها تخص القواعد القديمة.

ويجعل الزر تعطيل المحاكي الجاري غير متاح حتى يُضغط إعادة التفعيل: يتلقى طلب HTTP الرمز 503، ويُسقط جهاز TCP ووسيط MQTT اتصالاتهما ويرفضان الجديدة، ولا يجيب جهاز OSC أو UDP بشيء. انظر التعطل.

لا يمكن لمحاكيين من بروتوكول نقل واحد أن يتشاركا منفذًا: محاكيات HTTP وTCP وMQTT تستمع على منافذ TCP، ومحاكيات OSC وUDP على منافذ UDP. فيمكن لواجهة HTTP API ولجهاز OSC أن يستخدما المنفذ 8080 معًا؛ أما واجهتا HTTP API فلا. والثاني على منفذ مشغول يُرفض عند بدئه.

TIP

في متصفح متصل بخادم، يعمل المحاكي على الخادم. فالمحاكي الذي يستمع على 0.0.0.0 يُوصل إليه باسم الخادم، وينسخ الزر نسخ URL ذلك العنوان؛ أما الذي على 127.0.0.1 فلا يجيب إلا البرامج الموجودة على الخادم نفسه.

ما وصل ​

تعدّ لوحة مباشر أثناء عمله:

العددما يعدّه
الطلباتكل ما وصل: الطلبات، والرسائل، والأسطر.
بلا قاعدةما لم تأخذه أي قاعدة. وطلب HTTP الذي لا مسار له يتلقى رده مع ذلك (انظر الطلبات التي لا يأخذها أي مسار)؛ أما غيره فلا يتلقى شيئًا.
الفاشلةالتبادلات التي تعذّر فيها إعداد رد أو إرساله.
أثناء التعطلما وصل والمحاكي متعطل. يظهر حين يكون للمحاكي انقطاع مضبوط أو حين يصل إليه شيء وهو متعطل. ولا يُعدّ أبدًا ضمن بلا قاعدة.
غير المسلَّمةلـ MQTT فقط، عند حدوثه: رسائل تأخر العميل عنها كثيرًا فلم يأخذها.

يعرض رأس كل قاعدة عدد مرات مطابقتها منذ البدء.

تسرد قائمة المستلمة أحدث 300 تبادل، الأحدث أولًا:

العمودما فيه
الوقتوقت الوصول.
منعنوان العميل.
الطلبما وصل، بصيغة البروتوكول: GET /users/7، /ping 1، POWER?.
القاعدةالقاعدة التي أخذته (#2)، أو —.
الردما عاد: 200 OK · 37 B، /pong 3، حمولة؛ أو محتجَز أو مغلق عند العطل؛ أو الخطأ حين فشل الرد؛ أو معطّل حين وصل والمحاكي متعطل.
msمن الوصول حتى خروج الرد، بما في ذلك التأخير.

يفتح الزر ⌕ في الصف (فتح في الفاحص) ذلك التبادل في الفاحص، إن كان الالتقاط مفعّلًا. وحين يصل أكثر من 200 تبادل خلال خُمس ثانية، تتخطى القائمة بعضها وتذكر عددها. ويحتفظ المحرك بأحدث 500 تبادل لكل محاكٍ جارٍ، مع ما وصل، لسطر الأوامر وواجهة API وMCP.

واجهة HTTP API ​

خادم HTTP/1.1. يُجاب كل طلب بأول مسار يأخذه.

المسارات ​

يأخذ المسارُ طلبًا حين تتطابق طريقته ومسار URL الخاص به وكل شروطه.

الحقلما هو
الطريقةGET، POST، PUT، PATCH، DELETE، HEAD، OPTIONS، أو أي طريقة. ومسار GET يجيب HEAD أيضًا.
مسار URLيبدأ بـ /. المقطع :name يأخذ أي مقطع واحد، ويُقرأ بـ {{request.params.name}}؛ والمقطع الأخير * يأخذ كل ما تحته. ولا فرق تُحدثه الشرطة / في النهاية؛ وسلسلة الاستعلام ليست جزءًا من مسار URL.
الشروطيجب أن يتحقق كلٌّ منها. ويُضاف شرط بالزر + شرط.

أمثلة على مسار URL:

مسار URLيأخذلا يأخذ
/health/health، /health//health/db، /Health
/users/:id/users/7 (params.id هو 7)، /users/a%20b (a b)/users، /users/7/orders
/files/*/files، /files/a، /files/a/b/c/file، /other/files/a

يقرأ الشرط جزءًا واحدًا من الطلب (الموضع) ويقارنه:

الموضعالاسمما يقرؤه
ترويسةاسم ترويسة، بأي حالة أحرفقيمة الترويسة؛ والترويسة المرسلة عدة مرات تُضم قيمها بـ , .
الاستعلاممعامل استعلامقيمته، بعد فك ترميزها؛ والأولى إن تكرر.
المتن—المتن كاملًا نصًا.
JSONمسار JSON، مثل $.user.idذلك الحقل من متن JSON.

المقارنات هي يساوي، ولا يساوي، وأقل من، وعلى الأكثر، وأكبر من، وعلى الأقل، ويحتوي على، ويطابق التعبير النمطي، وفارغ، وغير فارغ. تُقارن الأرقام بوصفها أرقامًا، والنصوص حرفيًا. والترويسة أو المعامل أو الحقل غير الموجود فارغ. والمقارنة التي لا يمكن إجراؤها — نص مقابل رقم — لا تتحقق.

الاستجابات ​

للمسار من استجابة واحدة إلى 16 استجابة (الاستجابات).

الحقلما هوالافتراضي
الحالةبين 100 و599.200
العطلشيء آخر غير الرد؛ انظر الأعطال.بلا عطل — الرد
التأخير، msمدة الانتظار قبل الرد، بين 0 و60,000 ms.0
التذبذب، msزيادة عشوائية حتى هذا المقدار، بين 0 و60,000 ms.0
الوزنحصتها حين يجيب المسار عشوائيًا. لا يظهر إلا عندئذٍ.1
الترويساتحتى 32. يمكن أن تستخدم الأسماء المعاملات؛ والقيم قوالب.لا شيء
المتنقالب، حتى 256 KiB كما كُتب.فارغ

من دون ترويسة Content-Type، يُرسل المتن الذي هو JSON صالح بنوع application/json، وأي متن آخر بنوع text/plain; charset=utf-8.

مع استجابتين أو أكثر، يحدد الحقل أي استجابة الاستجابة التي يتلقاها الطلب:

أي استجابةما تتلقاه الطلباتالاستخدام
بالتسلسل، ثم الأخيرةالأولى، ثم الثانية، …، ثم الأخيرة من ذلك الحين: 500، 500، 200، 200، 200…إعادة المحاولة: فشل مرتين، ثم نجاح.
بالتناوبالأولى مجددًا بعد الأخيرة: 200، 500، 200، 500…تبعية تفشل من حين لآخر، بانتظام.
عشوائيًا، حسب الوزنتُسحب كلٌّ منها حسب وزنها. الوزنان 8 و2 يعطيان الأولى نحو 80% من المرات. ويجب أن يكون وزن واحد على الأقل أكبر من 0.نسبة واقعية من الإخفاقات.

يضيف الزر إضافة استجابة استجابة جاهزة إلى المسار:

الإعداد المسبقما يضيفه
200 JSON200، {"ok":true}
201 تم الإنشاء201، {"id":"{{uuid}}"}، والترويسة Location: {{request.path}}/{{counter}}
404 غير موجود404، {"error":"not found"}
500 خطأ في الخادم500، {"error":"internal"}
503 غير متاح503، {"error":"unavailable"}، والترويسة Retry-After: 1
بطيء — 2 ث200، {"ok":true} بعد 2000 ms
بلا ردالعطل بلا رد
إغلاق الاتصالالعطل إغلاق الاتصال
JSON مشوّه200، {"items":[{"id":1},{"id":2}]} مع العطل متن مشوّه

الأعطال ​

العطلما يواجهه العميل
بلا عطل — الردالاستجابة.
بلا ردلا شيء. يُحتجز الطلب حتى دقيقتين، ثم يُغلق الاتصال — فتُختبر بذلك مهلة العميل نفسه. ولا ينطبق التأخير.
إغلاق الاتصاليُغلق الاتصال دون رد، بعد التأخير.
متن مشوّهرد HTTP كامل بالحالة والترويسات المضبوطة، لكن متنه يتوقف في منتصفه: JSON لا يمكن تحليله. وحين يكون المتن كله JSON، يظل نوع المحتوى application/json.

الطلبات التي لا يأخذها أي مسار ​

يحدد الحقل الطلبات التي لا يأخذها أي مسار ما يتلقاه الطلب الذي لا يطابق أي مسار:

  • 404 غير موجود — الرمز 404 بالمتن {"error":"no_route"}؛
  • هذا الرد — استجابة تُضبط يدويًا، بكل ما في استجابة المسار. ويعدّ {{counter}} فيها الطلبات التي لم يأخذها أي مسار.

وفي الحالتين يُعدّ الطلب ضمن بلا قاعدة.

ما يمكن أن يقرأه رد HTTP ​

القالبما هو
{{request.method}}GET، POST، …
{{request.path}}مسار URL، دون الاستعلام.
{{request.params.id}}مقطع مسار URL المسمّى :id.
{{request.query.page}}معامل استعلام، بعد فك ترميزه.
{{request.headers.x-key}}ترويسة؛ والأسماء بأحرف صغيرة.
{{request.body}}المتن نصًا: أول 64 KiB منه.
{{request.json.name}}حقل من متن JSON، حين يكون المتن JSON وفي حدود 64 KiB.
{{request.from}}IP:port الخاص بالعميل.

الطلب الذي يتجاوز متنه 1 MiB يتلقى 413 ويُعدّ ضمن الفاشلة. والرد الذي يتعذّر إعداده — قالب يسمّي شيئًا ليس في الطلب — يتلقى 500 مع الخطأ في متنه، ويُعدّ ضمن الفاشلة.

جهاز OSC ​

كل رسالة تصل — وكل رسالة من رسائل الـ bundle على حدة — يُجاب عنها بأول قاعدة تطابقها. ومخطط البيانات الذي ليس OSC يُعدّ ضمن بلا قاعدة.

الحقلما هو
نمط العنواننمط عنوان OSC 1.0: * أي أحرف، و? حرف واحد، و[a-z] مجموعة، و{a,b} أيٌّ منهما، كلٌّ منها ضمن مقطع واحد (انظر OSC).
قواعد الوسائطحتى 16 شرطًا على الوسائط، كما في انتظار OSC (انظر العقد).
الردإن كان معطّلًا: تؤخذ الرسالة ولا يُجاب بشيء.
عنوان الردعنوان الرد، قالب.
وسائط الردحتى 16 وسيطة، لكلٍّ منها النوع (int، float، str، long، double، bool، blob، nil) وقالب القيمة.
الرد إلىفارغ: يعود الرد إلى عنوان المرسل ومنفذه. وإلا IP:port.
التأخير، ms، التذبذب، msبين 0 و60,000 ms لكلٍّ منهما.

تُقرأ قيمة الوسيطة حسب نوعها بعد ملء القالب: {{request.args[0]}} يعيد الوسيطة الأولى رقمًا حين يكون النوع رقميًا. ويقبل bool القيم true و1 وyes وon أو false و0 وno وoff؛ ويقبل blob بايتات hex؛ والقيمة الفارغة هي صفر النوع.

تخرج الردود من منفذ المحاكي نفسه، فيسمعها العميل الذي يستمع على المنفذ الذي أرسل منه.

يمكن لرد OSC أن يقرأ {{request.address}} و{{request.args[0]}} و{{request.from}}.

جهاز UDP ​

يُجاب كل مخطط بيانات بأول قاعدة يطابقها.

الحقلما هو
المطابقةأي مخطط بيانات، أو يحتوي على النص، أو يطابق التعبير النمطي، أو يحتوي على البايتات (hex).
النمطالنص أو التعبير النمطي أو البايتات المبحوث عنها.
الردالاستلام دون رد، أو نص، أو Hex، ثم الرد نفسه قالبًا.
الرد إلىفارغ: يعود الرد إلى المرسل. وإلا IP:port.
التأخير، ms، التذبذب، msبين 0 و60,000 ms لكلٍّ منهما.

يمكن لرد UDP أو TCP أن يقرأ:

القالبما هو
{{request.text}}الحمولة نصًا.
{{request.match}}ما طابق: النص، أو المجموعة الأولى في التعبير النمطي (أو المطابقة كاملة)، أو البايتات.
{{request.hex}}الحمولة بايتاتِ hex، أول 1024 منها.
{{request.bytes}}حجم الحمولة.
{{request.from}}IP:port الخاص بالمرسل.

الرد النصي 65,507 بايت على الأكثر.

جهاز TCP ​

جهاز يتخاطب بالأسطر على اتصال TCP، كما يفعل جهاز العرض أو المحوّل المصفوفي. يُجاب كل رسالة يرسلها العميل بأول قاعدة تطابقها؛ ويعود الرد على الاتصال نفسه.

الحقلما هو
نهاية الرسالةما يُنهي الرسالة، ويُضاف بعد كل رد وبعد التحية: LF (\n) (ويُحذف \r الذي يسبقه)، أو CR LF (\r\n)، أو CR (\r)، أو بلا — كل جزء. وتُتخطى الأسطر الفارغة.
التحيةتُرسل عند اتصال العميل؛ وتُترك فارغة إن لم تُرد تحية. ويمكن أن تقرأ {{request.from}}.
المطابقة، النمط، الردكما في جهاز UDP.
ثم إغلاق الاتصالإغلاق الاتصال بعد رد هذه القاعدة — عند QUIT مثلًا.
التأخير، ms، التذبذب، msبين 0 و60,000 ms لكلٍّ منهما.

الرسالة التي تتجاوز 64 KiB دون فاصلها تؤخذ كما هي.

وسيط MQTT ​

وسيط MQTT 3.1.1 صغير على TCP عادي. يفعل ما يفعله الوسيط: يتصل العملاء، ويشتركون بـ + و#، وينشرون بـ QoS 0 و1 و2، وتعمل الرسائل المحتفظ بها ورسائل الوصية الأخيرة، والاتصال الثاني بمعرّف العميل نفسه يحل محل الأول. والجلسات نظيفة دائمًا: العميل الذي يطلب الاحتفاظ بجلسته يحصل على جلسة جديدة، ولا يُصَفّ شيء في انتظار عميل غائب.

وفوق ذلك، تُفحص كل رسالة تُنشر إليه مقابل القواعد: وأول قاعدة تطابق تنشر ردًا أيضًا — كجهاز يبلغ عمّا فعله.

الحقلما هو
اسم المستخدم، كلمة المرورحين يُعيَّن اسم مستخدم، يجب أن يتصل العميل به وبكلمة المرور؛ وإن كان فارغًا: يمكن لأي أحد الاتصال. وتُرفض كلمة المرور دون اسم مستخدم، إذ لا يستطيع MQTT 3.1.1 حملها.
المحتفظ بهاحتى 64 رسالة (الموضوع، الحمولة، QoS) محفوظة منذ البدء، كأنها نُشرت مع retain: العميل الذي يشترك يتلقاها أولًا.
مرشّح المواضيعالمواضيع التي تأخذها القاعدة: + مستوى واحد، و# الباقي — lab/+/set.
المطابقة، النمطشرط على الحمولة، كما في جهاز UDP.
الردإن كان معطّلًا: تؤخذ الرسالة ولا يُنشر شيء آخر.
موضوع الرد، حمولة الردقوالب. ولا يمكن أن يتضمن الموضوع + أو #.
QoS، الاحتفاظ (retain)للرد.
التأخير، ms، التذبذب، msبين 0 و60,000 ms لكلٍّ منهما.

يمكن لرد MQTT أن يقرأ {{request.topic}}، و{{request.levels[1]}} (مستويات الموضوع، بدءًا من 0)، و{{request.payload}}، و{{request.json.state}}، و{{request.match}}، و{{request.qos}}، و{{request.retain}}، و{{request.client}} (معرّف العميل)، و{{request.from}}.

القوالب في الردود ​

تُكتب الردود بلغة القوالب نفسها التي في التجارب، فيعني الحقل الشيء نفسه هنا وهناك. ويمكن للرد أن يقرأ:

  • request — ما وصل، كما هو مسرود لكل بروتوكول أعلاه؛
  • {{counter}} — عدد الرسائل التي أخذتها هذه القاعدة منذ بدء المحاكي، بما فيها هذه الرسالة؛
  • المولّدات — {{uuid}}، و{{now.iso}}، والقيم العشوائية وغيرها؛ وتُسحب القيم العشوائية من بذرة المحاكي؛
  • المعاملات، حين يعمل المحاكي في تجربة أو يبدأ بـ signallab emulate --param.

ولا يقرأ الرد الأسرار أبدًا، والاسم غير المعروف خطأ، لا نص فارغ.

بعض الحقول تُثبَّت عند بدء المحاكي، قبل أن يصل أي شيء: مسار URL، والشرط، ونمط العنوان، ونمط الحمولة، ومرشّح المواضيع، والحقل الرد إلى، واسم الترويسة، والرسائل المحتفظ بها، وبيانات الدخول إلى الوسيط. وهي تقبل النص والمعاملات فقط، دون request ودون مولّدات.

تتحكم البذرة في الترتيب العشوائي للاستجابات، وفي التذبذب، وفي المولّدات العشوائية. وفي شاشة المحاكيات يأخذ كل بدء بذرة جديدة؛ وتستخدم التجربة بذرة التشغيل، ويأخذ signallab emulate --seed البذرة المعطاة له.

التعطل ​

لاختبار ما يفعله النظام حين تتقلب إحدى تبعياته بين العمل والتعطل، يُحدَّد الخيار يتعطل من حين لآخر:

الحقلما هوالافتراضي
مدة العمل، msمدة الإجابة، بين 10 و3,600,000 ms.10,000
مدة التعطل، msمدة التعطل، بين 10 و3,600,000 ms.3000
أثناء التعطللـ HTTP فقط: ما يواجهه الطلب والمحاكي متعطل.503 غير متاح

يبدأ الجدول مع بدء المحاكي ويتكرر: عمل، تعطل، عمل، تعطل… وأثناء التعطل:

المحاكيما يُواجَه
HTTP503 غير متاح: الرمز 503 مع Retry-After مضبوطًا على عدد الثواني حتى عودته (ثانية واحدة على الأقل). إغلاق الاتصال: يُغلق الاتصال دون رد. بلا رد: يُحتجز الطلب حتى دقيقتين، ثم يُغلق.
جهاز TCPتُسقط الاتصالات المفتوحة خلال 0.1 ث؛ وتُغلق الجديدة فور وصولها.
وسيط MQTTيُسقط كل اتصال؛ وتُرفض الاتصالات الجديدة (رمز الإرجاع 3 في CONNACK، الخادم غير متاح).
جهاز OSC أو UDPلا يُجاب عن شيء.

ما يصل أثناء التعطل يُعدّ ضمن أثناء التعطل، لا ضمن بلا قاعدة، ولا تُسأل قواعده.

ويفعل الزر تعطيل الشيء نفسه عند الطلب، أيًّا كان ما يقوله الجدول، حتى يُضغط إعادة التفعيل؛ وعندئذٍ يواجه HTTP الرمز 503 دون Retry-After. وفي التجربة، تفعل العقدة تعطيل/تفعيل المحاكي ذلك عند خطوة من التشغيل (انظر العقد والأعطال).

المشكلات ​

أثناء التعديل، يُفحص المحاكي بعد كل تغيير بلحظة، وتظهر المشكلة تحت أزراره قبل الضغط على بدء. وتسمّي المشكلة موضعها — القاعدة، أو الاستجابة، أو الرسالة المحتفظ بها، والحقل — وما الخطأ فيها: مسار URL بلا /، أو تعبير نمطي غير صالح، أو قالب رد يسمّي شيئًا غير request والمعاملات والمولّدات، أو قيمة خارج النطاق. ويرفض الزر بدء المحاكي الذي فيه مشكلة.

الحدود ​

ما يُحدّالحدعند بلوغه
المسارات أو القواعد لكل محاكٍ64يُرفض عند الفحص.
الاستجابات لكل مسار16يُرفض.
الشروط لكل مسار16يُرفض.
الترويسات لكل استجابة32يُرفض.
شروط الوسائط، ووسائط الرد (OSC)16 لكلٍّ منهمايُرفض.
الرسائل المحتفظ بها (MQTT)64يُرفض.
المتن أو الرد أو التحية كما كُتب256 KiBيُرفض.
التأخير أو التذبذب60,000 msيُرفض.
متن طلب HTTP1 MiB413.
اتصالات HTTP في آن واحد512يُغلق ما يزيد فور وصوله.
رأس طلب HTTP30 ثيجب أن يرسله العميل خلالها.
اتصالات TCP في آن واحد256يُغلق ما يزيد فور وصوله.
ردود OSC وUDP المنتظرة لتأخيرها1024يُسقط ما يزيد ويُعدّ ضمن الفاشلة.
عملاء MQTT في آن واحد256يُغلق ما يزيد فور وصوله.
حزمة MQTT256 KiBينتهي اتصال العميل.
اشتراكات MQTT لكل عميل100يُرفض ما يزيد.
مواضيع MQTT المحتفظ بها1000 موضوع، 16 MiBتُوجَّه الرسالة المحتفظ بها الجديدة لكنها لا تُحفظ.
رسائل MQTT المنتظرة لعميل بطيء واحد1024 رسالة، 8 MiBتفوته؛ وتُعدّ ضمن غير المسلَّمة.

محاكاة استجابة ​

لإنشاء محاكٍ من استجابة نجحت:

  1. في شاشة HTTP، إرسال طلب والحصول على استجابة — أو استخدام إرسال الآن على عقدة HTTP في تجربة.
  2. الضغط على ⧉ محاكاة هذه بجانب الاستجابة. تعرض نافذة محاكاة هذه الاستجابة المسار الذي ستنشئه.
  3. في الحقل إضافة إلى، اختيار أحد محاكيات HTTP، أو محاكٍ جديد.
  4. الضغط على إضافة المسار. تُفتح شاشة المحاكيات على ذلك المحاكي.

يجيب المسار طريقةَ الطلب ومسار URL الخاص به (دون الاستعلام) بحالة الاستجابة وترويساتها ومتنها. وتُستبعد الترويسات التي تخص ذلك التبادل وحده (Content-Length، وDate، وServer، وETag وما شابهها)، ويُرسل المتن كما كان، حتى لو تضمّن {{. والمحاكي الجديد لا يضم إلا هذا المسار. وإذا أُضيف المسار إلى محاكٍ موجود، يأتي أولًا، فيجيب قبل أي مسار أعم؛ ويلتقطه المحاكي الجاري عند الضغط على إعادة التشغيل.

ومن تجربة، يصبح URL المكتوب بالقوالب نمطًا: يُحذف جزؤه الأساسي ({{api}})، ويصبح المقطع الذي هو قالب واحد (/orders/{{order_id}}) :order_id، والمقطع الذي فيه قالب جزئي يُنهي مسار URL بـ *.

المجموعة الأولية ​

في أول مرة لا يجد فيها Signal Lab مكتبة محاكيات، يكتب خمسة محاكيات، كلها على هذا الكمبيوتر. وتُكتب أسماؤها وملاحظاتها بلغة الواجهة في تلك اللحظة.

المحاكييستمع علىما يفعله
API تجريبية127.0.0.1:8080GET /health ← {"status":"ok","time":…}؛ GET /users/:id ← مستخدم بذلك المعرّف؛ POST /users ← 201 مع Location؛ GET /slow ← بعد 1500 ms؛ /flaky ← 503، 503، ثم 200 من بعدها.
جهاز OSC تجريبي127.0.0.1:9100/ping ← /pong مع العدد؛ /fader/* ← /ack مع العنوان الذي استقبله؛ /cue/* يُؤخذ دون رد.
جهاز UDP تجريبي127.0.0.1:7100PING ← PONG والعدد؛ وأي شيء آخر ← ACK وحجمه بالبايت.
جهاز TCP تجريبي127.0.0.1:7200أسطر تنتهي بـ CR LF. يرحّب بـ READY؛ POWER? ← POWER=ON؛ POWER ON أو POWER OFF ← OK ON / OK OFF؛ QUIT ← BYE، ثم ينهي الاتصال.
وسيط MQTT تجريبي127.0.0.1:1883يحتفظ بـ online على lab/status؛ ON أو OFF منشورة إلى lab/<name>/set ← القيمة نفسها، محتفظًا بها، على lab/<name>/state.

والإشارة الأولية هل الخدمة تعمل؟ في مكتبة الإشارات تسأل http://127.0.0.1:8080/، وهو عنوان المحاكي API تجريبية: وليس فيه مسار لـ /، فتتلقى 404.

ملف المكتبة ​

المكتبة هي emulators.json في مجلد البيانات (انظر الملفات)؛ ويظهر مساره بتمرير المؤشر فوق العدد تحت القائمة. يُكتب الملف كاملًا بعد 0.7 ث من آخر تغيير، عبر ملف مؤقت، فالكتابة الفاشلة تُبقي الملف السابق. وإن تعذّرت قراءة الملف، تعرض القائمة الخطأ مع المسار والسطر والعمود، ويُترك الملف كما هو: يُصلَح ثم يُضغط إعادة تحميل الملف. ويُضغط إعادة تحميل الملف أيضًا بعد تعديله يدويًا. وإن لم يوجد ملف، تُكتب المجموعة الأولية مجددًا.

json
{
  "version": 1,
  "emulators": [
    {
      "id": "orders-api",
      "note": "Stands in for the orders service.",
      "emulator": {
        "name": "Orders API",
        "bind": "127.0.0.1:18080",
        "protocol": "http",
        "routes": [
          { "method": "GET", "path": "/orders/:id",
            "responses": [{ "body": "{\"id\":\"{{request.params.id}}\",\"state\":\"open\"}" }] },
          { "method": "POST", "path": "/orders", "order": "sequence",
            "responses": [{ "status": 503 }, { "status": 201, "body": "{\"id\":\"{{uuid}}\"}" }] }
        ],
        "outage": { "up_ms": 20000, "down_ms": 2000, "fault": "unavailable" }
      }
    }
  ]
}

كائن emulator وحده مستند يقرؤه signallab emulate أيضًا.

في التجارب والسكربتات ​

  • في التجربة، تفتح عقدة محاكٍ محاكيها قبل الخطوة الأولى وتجيب حتى ينتهي التشغيل؛ ويُعدّ ما استقبلته في التقرير. ومحاكي HTTP هناك هو أيضًا ما تستمع إليه العقدة انتظار طلب HTTP (العقد)، ومحاكي OSC أو UDP يتشارك منفذه مع عقد الانتظار في التشغيل. ولا يمكن لمحاكيين من بروتوكول نقل واحد في تجربة واحدة أن يتشاركا منفذًا. انظر العقد والأعطال.
  • يشغّل signallab emulate المحاكيات من ملفات أو من هذه المكتبة حتى Ctrl+C أو --for، طابعًا ما تجيب به؛ انظر سطر الأوامر.