सामग्री पर जाएँ

एमुलेटर ​

एमुलेटर में Signal Lab उस API, डिवाइस या सेवा की भूमिका निभाता है जिससे आपका सिस्टम बात करता है। यह एक पते पर सुनता है और नियमों से जवाब देता है: HTTP API रूट के ज़रिए, OSC, UDP या TCP डिवाइस “यह आए तो वह जवाब दो” के ज़रिए, और MQTT ब्रोकर किसी भी ब्रोकर की तरह, साथ में अपने नियमों के साथ। यह धीमा हो सकता है, विफल हो सकता है, या बीच-बीच में बंद हो सकता है, ताकि आप टेस्ट कर सकें कि अपनी डिपेंडेंसी के गड़बड़ करने पर आपका सिस्टम क्या करता है। हर आदान-प्रदान गिना जाता है, सूची में आता है और इंस्पेक्टर में भेजा जाता है।

एमुलेटर एक दस्तावेज़ है। एमुलेटर स्क्रीन इनकी एक लाइब्रेरी रखती है; वही दस्तावेज़ किसी प्रयोग के भीतर एमुलेटर नोड के रूप में, कमांड लाइन से signallab emulate के साथ, और API तथा MCP के ज़रिए चलता है, और हर जगह एक ही तरह जवाब देता है।

स्क्रीन ​

बाईं ओर लाइब्रेरी (लाइब्रेरी) है: हर एमुलेटर अपने प्रोटोकॉल और पते के साथ, और चल रहे एमुलेटर पर धड़कता बिंदु और रिक्वेस्ट की गिनती। दाईं ओर चुने गए एमुलेटर की सेटिंग्स और नियम हैं, और उनके नीचे वह जो उसे प्राप्त हुआ (लाइव)।

एमुलेटर बनाना ​

  1. लाइब्रेरी के ऊपर के बटनों में से एक दबाएँ:

    बटनक्या बनाता हैकहाँ सुनता हैएक नियम के साथ, जो जैसा है वैसा ही काम करता है
    + HTTP APIHTTP API127.0.0.1:18080GET /health → 200 {"status":"ok"}
    + OSC डिवाइसOSC डिवाइस127.0.0.1:9100/ping → /pong, गिनती int के रूप में
    + UDP डिवाइसUDP डिवाइस127.0.0.1:7100PING वाला डेटाग्राम → PONG 1, PONG 2, …
    + TCP डिवाइसTCP डिवाइस127.0.0.1:7200PING वाली पंक्ति → PONG
    + MQTT ब्रोकरMQTT ब्रोकर127.0.0.1:1883lab/<name>/set पर पब्लिश → वही पेलोड, retained, 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 सर्वर। हर रिक्वेस्ट का जवाब वह पहला रूट देता है जो उसे लेता है।

रूट ​

रूट किसी रिक्वेस्ट को तब लेता है, जब उसका मेथड, उसका पाथ और उसकी सभी शर्तें मेल खाती हैं।

फ़ील्डक्या
मेथडGET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS, या कोई भी। GET रूट HEAD का भी जवाब देता है।
पाथ/ से शुरू होता है। :name सेगमेंट कोई भी एक सेगमेंट लेता है, जिसे {{request.params.name}} के रूप में पढ़ा जाता है; अंतिम सेगमेंट * उसके नीचे का सब कुछ लेता है। अंत का / कोई फ़र्क नहीं डालता; क्वेरी स्ट्रिंग पाथ का हिस्सा नहीं है।
शर्तेंहर एक पूरी होनी चाहिए। + शर्त से एक जोड़ें।

पाथ के उदाहरण:

पाथलेता हैनहीं लेता
/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

शर्त रिक्वेस्ट का एक हिस्सा पढ़ती है (कहाँ) और उसकी तुलना करती है:

कहाँनामक्या पढ़ती है
हेडरहेडर का नाम, किसी भी केस मेंहेडर का मान; कई बार भेजे गए हेडर के मान , से जोड़कर।
क्वेरीक्वेरी पैरामीटरउसका मान, डिकोड करके; दोहराए जाने पर पहला।
बॉडी—पूरी बॉडी, टेक्स्ट के रूप में।
JSONJSON पाथ, जैसे $.user.idJSON बॉडी का वह फ़ील्ड।

तुलना के विकल्प हैं: के बराबर है, के बराबर नहीं है, से कम है, से अधिक नहीं है, से अधिक है, से कम नहीं है, को शामिल करता है, regex से मेल खाता है, खाली है और खाली नहीं है। संख्याओं की तुलना संख्या के रूप में होती है, टेक्स्ट की ठीक-ठीक। जो हेडर, पैरामीटर या फ़ील्ड मौजूद नहीं है, वह ख़ाली माना जाता है। जो तुलना की ही नहीं जा सकती — टेक्स्ट की संख्या से — वह पूरी नहीं होती।

रिस्पॉन्स ​

रूट में एक से 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 Created201, {"id":"{{uuid}}"}, हेडर Location: {{request.path}}/{{counter}}
404 Not found404, {"error":"not found"}
500 Server error500, {"error":"internal"}
503 Unavailable503, {"error":"unavailable"}, हेडर Retry-After: 1
धीमा — 2 s200, {"ok":true}, 2000 ms बाद
कोई जवाब नहींफ़ॉल्ट कोई जवाब नहीं
कनेक्शन बंदफ़ॉल्ट कनेक्शन बंद करें
विकृत JSON200, {"items":[{"id":1},{"id":2}]}, फ़ॉल्ट विकृत बॉडी के साथ

फ़ॉल्ट ​

फ़ॉल्टक्लाइंट को क्या मिलता है
कोई नहीं — जवाब देंरिस्पॉन्स।
कोई जवाब नहींकुछ नहीं। रिक्वेस्ट को अधिकतम 2 मिनट तक रोके रखा जाता है, फिर कनेक्शन बंद कर दिया जाता है — इसलिए टेस्ट क्लाइंट के अपने टाइमआउट का होता है। विलंब लागू नहीं होता।
कनेक्शन बंद करेंविलंब के बाद, बिना जवाब के कनेक्शन बंद हो जाता है।
विकृत बॉडीसेट किए गए स्टेटस और हेडर वाला एक पूरा HTTP जवाब, जिसकी बॉडी बीच में रुक जाती है: ऐसा JSON जो पार्स नहीं होता। जब पूरी बॉडी JSON थी, तो कंटेंट टाइप फिर भी application/json बताता है।

वे रिक्वेस्ट, जिन्हें कोई रूट नहीं लेता ​

वे रिक्वेस्ट, जिन्हें कोई रूट नहीं लेता तय करता है कि किसी रूट से मेल न खाने वाली रिक्वेस्ट को क्या मिले:

  • 404 Not found — बॉडी {"error":"no_route"} के साथ 404;
  • यह जवाब — आपका सेट किया गया रिस्पॉन्स, उन सभी चीज़ों के साथ जो किसी रूट के रिस्पॉन्स में होती हैं। इसका {{counter}} उन रिक्वेस्ट को गिनता है जिन्हें किसी रूट ने नहीं लिया।

दोनों ही स्थितियों में रिक्वेस्ट कोई नियम नहीं में गिनी जाती है।

HTTP जवाब क्या पढ़ सकता है ​

टेम्पलेटक्या है
{{request.method}}GET, POST, …
{{request.path}}पाथ, क्वेरी के बिना।
{{request.params.id}}: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 डिवाइस ​

आने वाले हर संदेश का — बंडल के हर संदेश का अलग से — जवाब वह पहला नियम देता है जिससे वह मेल खाता है। जो डेटाग्राम 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 डिवाइस ​

हर डेटाग्राम का जवाब वह पहला नियम देता है जिससे वह मेल खाता है।

फ़ील्डक्या
मिलानकोई भी डेटाग्राम, टेक्स्ट शामिल है, regex से मेल खाता है या बाइट शामिल हैं (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 ब्रोकर ​

सादे TCP पर एक छोटा MQTT 3.1.1 ब्रोकर। यह वही करता है जो कोई ब्रोकर करता है: क्लाइंट कनेक्ट होते हैं, + और # के साथ सब्सक्राइब करते हैं, QoS 0, 1 और 2 पर पब्लिश करते हैं, retained संदेश और लास्ट-विल काम करते हैं, और किसी क्लाइंट की id वाला दूसरा कनेक्शन पहले की जगह ले लेता है। सेशन हमेशा क्लीन होते हैं: अपना सेशन बनाए रखने को कहने वाले क्लाइंट को नया सेशन मिलता है, और अनुपस्थित क्लाइंट के लिए कुछ भी कतार में नहीं रखा जाता।

इसके ऊपर, इस पर पब्लिश किया गया हर संदेश नियमों से जाँचा जाता है: जो पहला मेल खाता है, वह एक जवाब भी पब्लिश करता है — जैसे कोई डिवाइस बता रहा हो कि उसने क्या किया।

फ़ील्डक्या
उपयोगकर्ता नाम, पासवर्डउपयोगकर्ता नाम सेट होने पर क्लाइंट को उसी और पासवर्ड के साथ कनेक्ट करना होगा; ख़ाली: कोई भी कनेक्ट कर सकता है। उपयोगकर्ता नाम के बिना पासवर्ड अस्वीकार किया जाता है, क्योंकि MQTT 3.1.1 उसे नहीं ले जा सकता।
retained संदेशअधिकतम 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}} (क्लाइंट id) और {{request.from}} पढ़ सकता है।

जवाबों में टेम्पलेट ​

जवाब उसी टेम्पलेट भाषा में लिखे जाते हैं जिसमें प्रयोग, इसलिए किसी फ़ील्ड का यहाँ और वहाँ एक ही अर्थ होता है। जवाब पढ़ सकता है:

  • request — जो आया, जैसा ऊपर हर प्रोटोकॉल के लिए बताया गया है;
  • {{counter}} — एमुलेटर के शुरू होने के बाद से इस नियम ने कितने संदेश लिए, यह वाला मिलाकर;
  • जनरेटर — {{uuid}}, {{now.iso}}, रैंडम मान और बाकी; रैंडम मान एमुलेटर के सीड से निकाले जाते हैं;
  • पैरामीटर, जब एमुलेटर किसी प्रयोग में चलता है या signallab emulate --param के साथ शुरू किया जाता है।

जवाब कभी सीक्रेट नहीं पढ़ता, और अज्ञात नाम एक त्रुटि है, ख़ाली टेक्स्ट नहीं।

कुछ फ़ील्ड एमुलेटर के शुरू होने पर, कुछ भी आने से पहले, तय हो जाते हैं: पाथ, शर्त, पता पैटर्न, पेलोड पैटर्न, टॉपिक फ़िल्टर, जवाब किसे, हेडर का नाम, retained संदेश और ब्रोकर का लॉगिन। इनमें केवल टेक्स्ट और पैरामीटर चलते हैं, न request और न जनरेटर।

सीड रिस्पॉन्स के रैंडम क्रम, जिटर और रैंडम जनरेटर को तय करता है। एमुलेटर स्क्रीन पर हर बार शुरू करने पर नया सीड लिया जाता है; प्रयोग रन के सीड का उपयोग करता है, और signallab emulate --seed आपका दिया हुआ सीड लेता है।

बंद होना ​

डिपेंडेंसी के बार-बार गिरने-उठने पर आपका सिस्टम क्या करता है, यह टेस्ट करने के लिए बीच-बीच में बंद होता है पर टिक करें:

फ़ील्डक्याडिफ़ॉल्ट
चालू अवधि, msयह कितनी देर जवाब देता है, 10–36,00,000 ms।10,000
बंद अवधि, msयह कितनी देर बंद रहता है, 10–36,00,000 ms।3000
बंद रहते समयकेवल HTTP: बंद रहते समय रिक्वेस्ट को क्या मिलता है।503 Unavailable

शेड्यूल एमुलेटर के शुरू होने पर शुरू होता है और दोहराता है: चालू, बंद, चालू, बंद… बंद रहते समय:

एमुलेटरक्या मिलता है
HTTP503 Unavailable: 503, जिसमें Retry-After लौटने तक बचे सेकंड पर सेट होता है (कम से कम 1)। कनेक्शन बंद करें: कनेक्शन बिना जवाब के बंद हो जाता है। कोई जवाब नहीं: अधिकतम 2 मिनट तक रोका जाता है, फिर बंद।
TCP डिवाइसखुले कनेक्शन 0.1 s के भीतर तोड़ दिए जाते हैं; नए कनेक्शन आते ही बंद कर दिए जाते हैं।
MQTT ब्रोकरहर कनेक्शन तोड़ दिया जाता है; नए अस्वीकार किए जाते हैं (CONNACK रिटर्न कोड 3, server unavailable)।
OSC, UDP डिवाइसकिसी को जवाब नहीं दिया जाता।

बंद रहते जो आता है, वह बंद रहते में गिना जाता है, कोई नियम नहीं में नहीं, और उसके लिए नियमों से नहीं पूछा जाता।

बंद करें यही काम माँग पर करता है, शेड्यूल चाहे जो कहे, तब तक जब तक आप चालू करें न दबाएँ; तब HTTP को Retry-After के बिना 503 मिलता है। प्रयोग में एमुलेटर बंद/चालू नोड यह रन के किसी चरण पर करता है (देखें नोड और फ़ॉल्ट)।

समस्याएँ ​

संपादन के दौरान हर बदलाव के कुछ क्षण बाद एमुलेटर जाँचा जाता है, और आपके शुरू करें दबाने से पहले ही समस्या उसके बटनों के नीचे दिख जाती है। समस्या बताती है कि वह कहाँ है — नियम, रिस्पॉन्स या retained संदेश, और फ़ील्ड — और क्या ग़लत है: / के बिना पाथ, ऐसा रेगुलर एक्सप्रेशन जो कंपाइल नहीं होता, ऐसा जवाब टेम्पलेट जो request, पैरामीटर और जनरेटर के अलावा किसी और चीज़ का नाम लेता है, सीमा से बाहर का मान। शुरू करें समस्या वाले एमुलेटर को अस्वीकार कर देता है।

सीमाएँ ​

क्यासीमासीमा पर
प्रति एमुलेटर रूट या नियम64जाँच में अस्वीकार।
प्रति रूट रिस्पॉन्स16अस्वीकार।
प्रति रूट शर्तें16अस्वीकार।
प्रति रिस्पॉन्स हेडर32अस्वीकार।
आर्ग्युमेंट शर्तें, जवाब के आर्ग्युमेंट (OSC)हर एक 16अस्वीकार।
retained संदेश (MQTT)64अस्वीकार।
लिखे गए रूप में बॉडी, जवाब या अभिवादन256 KiBअस्वीकार।
विलंब या जिटर60,000 msअस्वीकार।
HTTP रिक्वेस्ट बॉडी1 MiB413।
एक साथ HTTP कनेक्शन512और कनेक्शन आते ही बंद कर दिए जाते हैं।
HTTP रिक्वेस्ट हेड30 sक्लाइंट को इसी समय में इसे भेजना होगा।
एक साथ TCP कनेक्शन256और कनेक्शन आते ही बंद कर दिए जाते हैं।
अपने विलंब की प्रतीक्षा में OSC और UDP जवाब1024और जवाब ड्रॉप होते हैं और विफल में गिने जाते हैं।
एक साथ MQTT क्लाइंट256और क्लाइंट आते ही बंद कर दिए जाते हैं।
MQTT पैकेट256 KiBक्लाइंट का कनेक्शन समाप्त हो जाता है।
प्रति क्लाइंट MQTT सब्सक्रिप्शन100और अस्वीकार किए जाते हैं।
MQTT retained टॉपिक1000 टॉपिक, 16 MiBनया retained संदेश रूट किया जाता है, retain नहीं किया जाता।
एक धीमे क्लाइंट की प्रतीक्षा में MQTT संदेश1024 संदेश, 8 MiBवह इन्हें खो देता है; नहीं पहुँचाए गए में गिना जाता है।

इसका मॉक बनाना ​

किसी सफल रिस्पॉन्स से एमुलेटर बनाने के लिए:

  1. HTTP स्क्रीन पर रिक्वेस्ट भेजें और रिस्पॉन्स पाएँ — या किसी प्रयोग के HTTP नोड पर अभी भेजें का उपयोग करें।
  2. रिस्पॉन्स के पास ⧉ इसका मॉक बनाएँ दबाएँ। इस रिस्पॉन्स का मॉक बनाएँ डायलॉग दिखाता है कि वह कौन-सा रूट बनाएगा।
  3. इसमें जोड़ें में अपने HTTP एमुलेटर में से एक चुनें, या नया एमुलेटर।
  4. रूट जोड़ें दबाएँ। एमुलेटर स्क्रीन उसी एमुलेटर पर खुलती है।

रूट रिक्वेस्ट के मेथड और पाथ (क्वेरी के बिना) का जवाब रिस्पॉन्स के स्टेटस, हेडर और बॉडी से देता है। जो हेडर केवल उस एक आदान-प्रदान के होते हैं (Content-Length, Date, Server, ETag और इसी तरह के), वे छोड़ दिए जाते हैं, और बॉडी वैसी ही भेजी जाती है जैसी थी, भले ही उसमें {{ हो। नए एमुलेटर में केवल यही रूट होता है। किसी मौजूदा एमुलेटर में जोड़ने पर रूट सबसे पहले आता है, ताकि वह किसी व्यापक रूट से पहले जवाब दे; चल रहा एमुलेटर इसे तब अपनाता है जब आप रीस्टार्ट करें दबाते हैं।

प्रयोग से, टेम्पलेट के साथ लिखा URL एक पैटर्न बन जाता है: उसका आधार ({{api}}) हटा दिया जाता है, जो सेगमेंट एक ही टेम्पलेट है (/orders/{{order_id}}), वह :order_id बन जाता है, और जो सेगमेंट केवल आंशिक रूप से टेम्पलेट है, वह पाथ को * के साथ समाप्त कर देता है।

शुरुआती सेट ​

जब Signal Lab को पहली बार कोई एमुलेटर लाइब्रेरी नहीं मिलती, तो वह पाँच एमुलेटर लिखता है, सभी इसी कंप्यूटर पर। उनके नाम और नोट उस समय की इंटरफ़ेस भाषा में लिखे जाते हैं।

एमुलेटरकहाँ सुनता हैक्या करता है
डेमो API127.0.0.1:8080GET /health → {"status":"ok","time":…}; GET /users/:id → उस id वाला उपयोगकर्ता; POST /users → Location के साथ 201; 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:7200CR LF से समाप्त होने वाली पंक्तियाँ। READY से अभिवादन करता है; POWER? → POWER=ON; POWER ON या POWER OFF → OK ON / OK OFF; QUIT → BYE, फिर कनेक्शन काट देता है।
डेमो MQTT ब्रोकर127.0.0.1:1883lab/status पर online retain करता है; lab/<name>/set पर पब्लिश किया गया ON या OFF → वही, retained, lab/<name>/state पर।

सिग्नल लाइब्रेरी का शुरुआती सिग्नल क्या सेवा चालू है?http://127.0.0.1:8080/ से पूछता है, जो डेमो API का पता है: उसमें / के लिए कोई रूट नहीं है, इसलिए उसे 404 मिलता है।

लाइब्रेरी फ़ाइल ​

लाइब्रेरी डेटा फ़ोल्डर में emulators.json है (देखें फ़ाइलें); उसका पथ देखने के लिए सूची के नीचे की गिनती पर पॉइंटर रखें। अंतिम बदलाव के 0.7 s बाद यह पूरी की पूरी, एक अस्थायी फ़ाइल के ज़रिए, लिखी जाती है, इसलिए विफल लेखन पिछली फ़ाइल को बनाए रखता है। अगर फ़ाइल पढ़ी नहीं जा सकती, तो सूची पथ, पंक्ति और कॉलम के साथ त्रुटि दिखाती है, और फ़ाइल को जैसी है वैसी ही छोड़ दिया जाता है: उसे ठीक करें और फ़ाइल फिर से लोड करें दबाएँ। हाथ से संपादित करने के बाद भी फ़ाइल फिर से लोड करें दबाएँ। फ़ाइल न होने पर शुरुआती सेट फिर से लिखा जाता है।

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 तक चलाता है और बताता है कि वे क्या जवाब देते हैं; देखें कमांड लाइन।