बजट एपीआई का परिचय

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

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

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

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

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

बजट रिज़र्व करना

Chrome 60 और उसके बाद के वर्शन में, navigator.budget.reserve() तरीका बिना किसी फ़्लैग के उपलब्ध होगा.

reserve() वाले तरीके की मदद से, किसी खास कार्रवाई के लिए बजट का अनुरोध किया जा सकता है. यह एक बूलियन दिखाएगा, ताकि यह पता चल सके कि बजट रिज़र्व किया जा सकता है या नहीं. अगर बजट रिज़र्व था, तो उपयोगकर्ता को बैकग्राउंड में हो रहे काम के बारे में बताने की ज़रूरत नहीं है.

पुश नोटिफ़िकेशन के उदाहरण में, "साइलेंट-पुश" कार्रवाई के लिए बजट रिज़र्व करने की कोशिश की जा सकती है. अगर reserve() 'सही' दिखाता है, तो कार्रवाई की अनुमति होगी. ऐसा न करने पर, यह'गलत' दिखेगा और आपको एक सूचना दिखानी होगी

self.addEventListener('push', event => {
 const promiseChain = navigator.budget.reserve('silent-push')
   .then((reserved) => {
     if (reserved) {
       // No need to show a notification.
       return;
     }

     // Not enough budget is available, must show a notification.
     return registration.showNotification(...);
   });
 event.waitUntil(promiseChain);
});

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

आपको reserve() को सिर्फ़ तब कॉल करना चाहिए, जब आपको कोई ऐसी कार्रवाई करनी हो जिसे आने वाले समय में किया जा रहा हो. ध्यान दें कि अगर आपने ऊपर दिए गए उदाहरण में, रिज़र्व को कॉल किया है, लेकिन फिर भी आपको सूचना दिखाई गई है, तो भी बजट का इस्तेमाल किया जाएगा.

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

बजट एपीआई और ऑरिजिन ट्रायल

वेब ऐप्लिकेशन अपने बजट के इस्तेमाल का प्लान बनाने के लिए, इन दो तरीकों का इस्तेमाल कर सकता है: getBudget() और getCost().

Chrome 60 में, ये दोनों तरीके तब उपलब्ध होते हैं, जब ऑरिजिन ट्रायल के लिए साइन अप किया जाता है. हालांकि, अगर टेस्टिंग के लिए साइन अप किया जाता है, तो एक्सपेरिमेंटल वेब प्लैटफ़ॉर्म की सुविधाओं वाले फ़्लैग को चालू करके, स्थानीय तौर पर इनका इस्तेमाल किया जा सकता है. (Chrome में chrome://flags/#enable-experimental-web-platform-features खोलें).

आइए, अब इन एपीआई को इस्तेमाल करने का तरीका देखते हैं.

अपना बजट पाएं

getBudget() तरीके से अपने उपलब्ध बजट की जानकारी देखी जा सकती है. कुछ ब्राउज़र (जैसे Chrome) में समय के साथ बजट 'क्षरण' होता है, इसलिए आपको पूरी जानकारी देने के लिए यह BudgetStates की एक कैटगरी दिखाता है, जो बताता है कि आने वाले समय में आपका बजट अलग-अलग समय पर क्या होगा.

बजट एंट्री की सूची बनाने के लिए, हम इन्हें चला सकते हैं:

navigator.budget.getBudget()
.then((budgets) => {
  budgets.forEach((element) => {
    console.log(\`At '${new Date(element.time).toString()}' \` +
      \`your budget will be '${element.budgetAt}'.\`);
  });
});

पहली एंट्री, आपका मौजूदा बजट होगा. अतिरिक्त वैल्यू से पता चलेगा कि आने वाले समय में अलग-अलग पॉइंट पर आपका बजट कितना होगा.

At 'Mon Jun 05 2017 12:47:20' you will have a budget of '3'.
At 'Fri Jun 09 2017 10:42:57' you will have a budget of '2'.
At 'Fri Jun 09 2017 12:31:09' you will have a budget of '1'.

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

किसी ऑपरेशन की लागत का पता लगाना

यह जानने के लिए कि किसी कार्रवाई के लिए कितना शुल्क लगेगा, getCost() को कॉल करने पर एक नंबर दिखेगा. इसमें बताया जाएगा कि उस कार्रवाई के लिए reserve() को कॉल करने पर, कितने बजट का इस्तेमाल होगा.

उदाहरण के लिए, जब आपको कोई पुश मैसेज (जैसे कि साइलेंट पुश नोटिफ़िकेशन) मिलता है, तो हम सूचना न दिखाने के शुल्क का पता लगा सकते हैं. इसके लिए, इस कोड का इस्तेमाल किया जा सकता है:

navigator.budget.getCost('silent-push')
.then((cost) => {
  console.log('Cost of silent push is:', cost);
})
.catch((err) => {
  console.error('Unable to get cost:', err);
});

लिखते समय, Chrome 60 प्रिंट करेगा:

Cost of silent push is: 2

reserve() और getCost() तरीकों से हाइलाइट की जाने वाली एक चीज़ यह है कि किसी कार्रवाई की असल लागत, getCost() से मिलने वाली लागत से कम हो सकती है. अगर आपका मौजूदा बजट बताई गई लागत से कम है, तो भी आप कार्रवाई के लिए बुकिंग कर सकते हैं. खास जानकारी से जुड़ी जानकारी यहां दी गई है:

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

एपीआई का इस्तेमाल करते समय, कृपया GitHub Repo के बारे में सुझाव/राय दें या शिकायत करें. इसके अलावा, crbug.com पर जाकर Chrome की गड़बड़ियों की शिकायत करें.