Chrome एक्सटेंशन: सर्विस वर्कर के निलंबन की जांच करने का सफ़र

यह किस बारे में है?

मेनिफ़ेस्ट V2 से मेनिफ़ेस्ट V3 पर स्विच करने के साथ, एक बुनियादी बदलाव भी होगा. मेनिफ़ेस्ट V2 में, एक्सटेंशन बैकग्राउंड पेज में मौजूद होते थे. बैकग्राउंड पेज, एक्सटेंशन और वेब पेजों के बीच कम्यूनिकेशन मैनेज करते थे. मेनिफ़ेस्ट V3, इसके बजाय सेवा वर्कर का इस्तेमाल करता है.

इस पोस्ट में, हम एक्सटेंशन सेवा देने वाले वर्कर की जांच करने से जुड़ी समस्या के बारे में बताएंगे. खास तौर पर, हम यह पक्का करने के तरीके पर ध्यान देते हैं कि अगर किसी सेवा वर्कर को निलंबित कर दिया जाता है, तो हमारा प्रॉडक्ट सही तरीके से काम करे.

हम कौन हैं?

eyeo एक ऐसी कंपनी है जो उपयोगकर्ताओं, ब्राउज़र, विज्ञापन देने वालों, और पब्लिशर के लिए, ऑनलाइन वैल्यू एक्सचेंज को संतुलित और बेहतर बनाने के लिए काम करती है. दुनिया भर में, विज्ञापन फ़िल्टर करने की सुविधा का इस्तेमाल करने वाले हमारे 30 करोड़ से ज़्यादा उपयोगकर्ता हैं. ये उपयोगकर्ता, 'स्वीकार किए जा सकने वाले विज्ञापन' दिखाने की अनुमति देते हैं. यह विज्ञापन का एक ऐसा स्टैंडर्ड है जिसे स्वतंत्र रूप से तैयार किया गया है. इससे यह तय होता है कि कोई विज्ञापन स्वीकार किया जा सकता है या नहीं और वह परेशान करने वाला है या नहीं.

हमारी एक्सटेंशन इंजन टीम, विज्ञापन फ़िल्टर करने की टेक्नोलॉजी उपलब्ध कराती है. इस टेक्नोलॉजी का इस्तेमाल, विज्ञापन रोकने वाले कुछ सबसे लोकप्रिय ब्राउज़र एक्सटेंशन करते हैं. जैसे, AdBlock और Adblock Plus. इनके दुनिया भर में 11 करोड़ से ज़्यादा उपयोगकर्ता हैं. साथ ही, हम इस टेक्नोलॉजी को ओपन-सोर्स लाइब्रेरी के तौर पर उपलब्ध कराते हैं, ताकि विज्ञापन फ़िल्टर करने वाले अन्य ब्राउज़र एक्सटेंशन इसका इस्तेमाल कर सकें.

सेवा वर्कर क्या है?

एक्सटेंशन सेवा वर्कर्स, ब्राउज़र एक्सटेंशन के मुख्य इवेंट हैंडलर होते हैं. ये बैकग्राउंड में अपने-आप काम करते हैं. आम तौर पर, यह ठीक है. हम नए सेवा वर्कर में, बैकग्राउंड पेज पर ज़्यादातर काम कर सकते हैं. हालांकि, बैकग्राउंड पेजों की तुलना में इसमें कुछ बदलाव हैं:

  • सेवा वर्कर इस्तेमाल में न होने पर बंद हो जाते हैं. इसके लिए, हमें ग्लोबल वैरिएबल के बजाय, ऐप्लिकेशन की स्थितियों को सेव करना होगा. इसका मतलब है कि सिस्टम शुरू होने से पहले, हमारे सिस्टम में मौजूद किसी भी एंट्री पॉइंट को कॉल करने के लिए तैयार किया जाना चाहिए.
  • किसी भी असाइन किए गए कॉलबैक का इंतज़ार करने से पहले, इवेंट के लिसनर अटैच होने चाहिए. निलंबित किए गए सेवा वर्कर को अब भी वे इवेंट मिल सकते हैं जिनकी उन्होंने सदस्यता ली है. अगर इवेंट के लिए लिसनर, इवेंट लूप के पहले टर्न में रजिस्टर नहीं किया गया है, तो अगर वह इवेंट सेवा वर्कर को जगाता है, तो उसे इवेंट नहीं मिलेगा.
  • कोई गतिविधि न होने पर, टाइमर के खत्म होने से पहले ही उन्हें रोका जा सकता है.

सेवा वर्कर कब निलंबित किए जाते हैं?

हमें पता चला है कि Chrome 119 में, सेवा वर्कर निलंबित हैं:

  • 30 सेकंड तक इवेंट न मिलने या एक्सटेंशन एपीआई को कॉल करने के बाद.
  • अगर डेवलपर टूल खुले हैं या ChromeDriver पर आधारित टेस्टिंग लाइब्रेरी का इस्तेमाल किया जा रहा है, तो कभी भी नहीं (सुविधा का अनुरोध देखें).
  • अगर आपने chrome://serviceworker-internals में रोकें पर क्लिक किया है.

हाल की जानकारी के लिए, सर्विस वर्कर का लाइफ़साइकल देखें.

इसकी जांच करना एक समस्या क्यों है?

आम तौर पर, “सेवा वर्कर को असरदार तरीके से टेस्ट करने का तरीका” या काम करने वाले टेस्ट के उदाहरणों के बारे में आधिकारिक दिशा-निर्देश होना मददगार होता. सेवा वर्कर की सुविधा को टेस्ट करते समय, हमें कुछ समस्याओं का सामना करना पड़ा:

  • हमारे टेस्ट एक्सटेंशन में स्टेटस है. जब सेवा वर्कर बंद हो जाता है, तो उसकी स्थिति और रजिस्टर किए गए इवेंट मिट जाते हैं. हम टेस्टिंग फ़्लो में डेटा को कैसे सेव करेंगे?
  • अगर सेवा वर्कर को किसी भी समय निलंबित किया जा सकता है, तो हमें यह जांच करनी होगी कि रुकावट आने पर भी सभी सुविधाएं काम करती हैं या नहीं.
  • भले ही, हम अपने टेस्ट में कोई ऐसा तरीका शामिल करें जो कभी भी सेवा वर्कर को निलंबित कर दे, लेकिन ब्राउज़र में ऐसा कोई एपीआई नहीं है जिससे सेवा वर्कर को आसानी से निलंबित किया जा सके. हमने W3C टीम से इस सुविधा को जोड़ने के लिए कहा है. हालांकि, इस पर अभी बातचीत जारी है.

Service Worker के निलंबन की जांच करना

हमने जांच के दौरान, सेवा वर्कर को निलंबित करने के लिए कई तरीके आज़माए हैं:

तरीका तरीके से जुड़ी समस्याएं
कोई तय समय (उदाहरण के लिए, 30 सेकंड) इंतज़ार करें इससे जांच धीमी और भरोसेमंद नहीं रहती. खास तौर पर, एक से ज़्यादा टेस्ट चलाने पर. यह WebDriver का इस्तेमाल करते समय काम नहीं करता, क्योंकि WebDriver, Chrome के DevTools API का इस्तेमाल करता है. साथ ही, DevTools के खुले होने पर, सेवा वर्कर को निलंबित नहीं किया जाता. भले ही, हम इसे बायपास कर पाएं, लेकिन हमें यह देखना होगा कि सर्विस वर्कर निलंबित किया गया था या नहीं. हमारे पास ऐसा करने का कोई तरीका नहीं है.
सर्विस वर्कर में इनफ़ाइनाइट लूप चलाना स्पेसिफ़िकेशन के मुताबिक, इसकी वजह से खाता बंद किया जा सकता है. हालांकि, यह इस बात पर निर्भर करता है कि ब्राउज़र इस सुविधा को कैसे लागू करता है. इस मामले में, Chrome सर्विस वर्कर को बंद नहीं करता. इसलिए, हम उस स्थिति की जांच नहीं कर सकते जब सर्विस वर्कर निलंबित हो जाता है.
सेवा वर्कर में एक मैसेज होना, ताकि यह पता लगाया जा सके कि उसे निलंबित किया गया है या नहीं मैसेज भेजने पर, सेवा वर्कर चालू हो जाता है. इसका इस्तेमाल यह जांचने के लिए किया जा सकता है कि सेवा वर्कर सो रहा था या नहीं. हालांकि, इससे उन टेस्ट के नतीजे खराब हो जाते हैं जिन्हें सेवा वर्कर को निलंबित करने के तुरंत बाद जांचना होता है.
chrome.processes.terminate() का इस्तेमाल करके, सेवा वर्कर प्रोसेस को बंद करना एक्सटेंशन के सर्विस वर्कर, एक्सटेंशन के अन्य हिस्सों के साथ एक प्रोसेस शेयर करते हैं. इसलिए, chrome.process.terminate() या Chrome के प्रोसेस मैनेजर जीयूआई का इस्तेमाल करके इस प्रोसेस को बंद करने पर, न सिर्फ़ सर्विस वर्कर बंद हो जाता है, बल्कि एक्सटेंशन के सभी पेज भी बंद हो जाते हैं.

हमने एक टेस्ट किया, जिसमें यह जांच की गई कि हमारा कोड, सेवा वर्कर के निलंबित होने पर कैसे प्रतिक्रिया देता है. इसके लिए, Selenium WebDriver ने chrome://serviceworker-internals/ खोला और सेवा वर्कर के लिए "रोकें" बटन पर क्लिक किया.

फ़िलहाल, यह सबसे अच्छा विकल्प है. हालांकि, यह आदर्श नहीं है, क्योंकि हमारे Mocha टेस्ट (जो एक्सटेंशन पेज पर चलते हैं) यह काम खुद नहीं कर सकते. इसलिए, उन्हें हमारे WebDriver नोड प्रोग्राम से संपर्क करना होगा. इसका मतलब है कि इन टेस्ट को सिर्फ़ एक्सटेंशन का इस्तेमाल करके नहीं चलाया जा सकता. इन्हें Selenium WebDriver का इस्तेमाल करके ट्रिगर करना होगा.

यहां एक डायग्राम दिया गया है, जिसमें बताया गया है कि हम अलग-अलग फ़्लो की मदद से, ब्राउज़र एपीआई के साथ कैसे कम्यूनिकेट करते हैं. साथ ही, "सर्विस वर्कर्स को निलंबित करने" वाले तरीके को जोड़ने से, इस पर क्या असर पड़ता है.

टेस्टिंग फ़्लो दिखाने वाला डायग्राम
सर्विस वर्कर के निलंबन के साथ फ़्लो की जांच करना.

सेवा वर्कर (नीले रंग के) को निलंबित करने वाले नए फ़्लो में, हमने यूज़र इंटरफ़ेस (यूआई) के ज़रिए निलंबित करने के लिए Selenium WebDriver जोड़ा है. इससे ब्राउज़र एपीआई में कोई कार्रवाई ट्रिगर होती है.

यह बताना ज़रूरी है कि Selenium WebDriver के साथ ऐसा करने पर, Chrome में एक गड़बड़ी होती थी. इस वजह से, सेवा वर्कर फिर से शुरू नहीं हो पाता था. Chrome 116 में इस समस्या को ठीक कर दिया गया है. हालांकि, इस समस्या को हल करने का एक और तरीका भी है: Chrome को हर टैब पर DevTools अपने-आप खोलने के लिए सेट करने पर, सेवा वर्कर सही तरीके से शुरू हो जाता है.

हम जांच करते समय इस तरीके का इस्तेमाल कर रहे हैं. हालांकि, यह सबसे सही तरीका नहीं है, क्योंकि हो सकता है कि बटन पर क्लिक करने से, स्थिर एपीआई न मिले. साथ ही, पुराने ब्राउज़र के लिए DevTools खोलने पर, परफ़ॉर्मेंस पर असर पड़ता है.

हम पूरी सुविधा को कैसे कवर करते हैं? फ़ज़ टेस्ट

खाते के निलंबन की जांच करने का तरीका तय करने के बाद, हमें यह तय करना था कि इसे अपने ऑटोमेशन टेस्ट सुइट में कैसे जोड़ा जाए. हमने अपने स्टैंडर्ड टेस्ट ऐसे माहौल में चलाए हैं जहां बैकग्राउंड पेज के साथ हर इंटरैक्शन से पहले, WebDriver, chrome://serviceworker-internals/ पेज पर रोकें पर क्लिक करके, सेवा वर्कर को निलंबित कर देता है.

फ़ज़ टेस्ट के रन का सैंपल
टेस्ट के मौजूदा सेटअप को दिखाने वाली इमेज.

हम सभी टेस्ट नहीं करते, बल्कि ज़्यादातर टेस्ट करते हैं. ऐसा इसलिए है, क्योंकि निलंबन की प्रोसेस पूरी तरह से स्थिर नहीं है और कभी-कभी इसमें गड़बड़ियां होती हैं. साथ ही, फ़ज़ मोड में सभी टेस्ट सुइट चलाने में काफ़ी समय लगता है. इसलिए, हमने सभी "मिलते-जुलते" मामलों को कवर करने के बजाय, फ़ज़ मोड में टेस्टिंग के लिए सबसे ज़रूरी पाथ चुने हैं. यह बताना ज़रूरी है कि "फ़ज़" मोड में फ़ंक्शनल टेस्ट चलाने का मतलब है कि हमें टेस्ट के टाइम आउट बढ़ाने पड़े, क्योंकि सेवा वर्कर को निलंबित करने और फिर से शुरू करने में ज़्यादा समय लगता है.

ये टेस्ट, शुरुआती तौर पर एक बार में कई जगहों की जांच करने के लिए अहम हैं. इनसे उन जगहों की जानकारी मिलती है जहां कोड काम नहीं करता. हालांकि, हो सकता है कि इनसे उन सभी तरीकों का पता न चल पाए जिनकी वजह से सेवा वर्कर के निलंबन से समस्याएं आ सकती हैं.

हम इन टेस्ट को "फ़ज़ टेस्ट" कहते हैं. आम तौर पर, फ़ज़ टेस्टिंग में अपने प्रोग्राम में अमान्य इनपुट डाला जाता है. साथ ही, यह पक्का किया जाता है कि प्रोग्राम सही तरीके से काम करे या कम से कम क्रैश न हो. हमारे मामले में, "अमान्य इनपुट" वह सेवा वर्कर है जिसे किसी भी समय निलंबित किया जा सकता है. साथ ही, हमें उम्मीद है कि "सामान्य व्यवहार" के तहत, विज्ञापन फ़िल्टर करने की सुविधा पहले की तरह काम करती रहेगी. यह असल में अमान्य इनपुट नहीं है, क्योंकि मेनिफ़ेस्ट V3 में ऐसा होना चाहिए. हालांकि, मेनिफ़ेस्ट V2 में यह अमान्य होता. इसलिए, यह सही शब्दावली लगती है.

खास जानकारी

मेनिफ़ेस्ट V3 में, declarativeNetRequest नियमों के अलावा, सेवा वर्कर एक बड़ा बदलाव है. मेनिफ़ेस्ट V3 पर माइग्रेट करने के लिए, ब्राउज़र एक्सटेंशन के कोड में कई बदलाव करने पड़ सकते हैं. साथ ही, टेस्टिंग के नए तरीके अपनाने पड़ सकते हैं. साथ ही, यह ज़रूरी है कि ऐसे एक्सटेंशन के डेवलपर अपने एक्सटेंशन को इस तरह से तैयार करें कि अचानक सेवा वर्कर के निलंबन को आसानी से मैनेज किया जा सके.

माफ़ करें, हमारे इस्तेमाल के उदाहरण के हिसाब से, निलंबन को आसानी से मैनेज करने के लिए कोई एपीआई उपलब्ध नहीं है. हम चाहते थे कि शुरुआती दौर में ही, निलंबन के तरीकों के हिसाब से अपने एक्सटेंशन के कोडबेस की जांच की जाए. इसलिए, हमें इस पर काम करना पड़ा. जिन एक्सटेंशन डेवलपर को ऐसी ही समस्याओं का सामना करना पड़ता है वे इस तरीके का इस्तेमाल कर सकते हैं. हालांकि, डेवलपमेंट और रखरखाव के दौरान इसमें ज़्यादा समय लगता है, लेकिन यह तरीका अपनाना ज़रूरी है. इससे हम यह पक्का कर सकते हैं कि हमारे एक्सटेंशन ऐसे माहौल में भी सही तरीके से काम कर सकें जहां सेवा वर्कर नियमित तौर पर निलंबित होते रहते हैं.

सेवा वर्कर के निलंबन की जांच करने के लिए बुनियादी सहायता पहले से ही उपलब्ध है. हालांकि, हमें आने वाले समय में एक्सटेंशन में सेवा वर्कर की जांच करने के लिए बेहतर प्लैटफ़ॉर्म सहायता देखनी है. इससे, जांच को पूरा करने में लगने वाला समय और रखरखाव में लगने वाला समय काफ़ी कम हो सकता है.