वर्कबॉक्स-बैकग्राउंड-सिंक

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

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

Workbox के बैकग्राउंड सिंक को इस तरह डिज़ाइन किया गया है कि बैकग्राउंड सिंक एपीआई को डाउनलोड करें और इसके इस्तेमाल को अन्य Workbox मॉड्यूल के साथ इंटिग्रेट करें. यह यह उन ब्राउज़र के लिए एक फ़ॉलबैक स्ट्रेटजी भी लागू करता है जो अभी तक लागू नहीं हुए हैं बैकग्राउंड सिंक.

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

बुनियादी इस्तेमाल

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

import {BackgroundSyncPlugin} from 'workbox-background-sync';
import {registerRoute} from 'workbox-routing';
import {NetworkOnly} from 'workbox-strategies';

const bgSyncPlugin = new BackgroundSyncPlugin('myQueueName', {
  maxRetentionTime: 24 * 60, // Retry for max of 24 Hours (specified in minutes)
});

registerRoute(
  /\/api\/.*\/*.json/,
  new NetworkOnly({
    plugins: [bgSyncPlugin],
  }),
  'POST'
);

BackgroundSyncPlugin ने हुक को fetchDidFail प्लगिन कॉलबैक, और fetchDidFail का इस्तेमाल सिर्फ़ तब किया जाता है, जब कोई अपवाद मौजूद हो. इसकी सबसे ज़्यादा संभावना होती है नेटवर्क में गड़बड़ी हुई है. इसका मतलब है कि अगर के साथ जवाब मिला 4xx या 5xx गड़बड़ी की स्थिति. अगर आपको मिलने वाले सभी अनुरोधों को फिर से करना है, जैसे कि 5xx स्थिति, ऐसा करके यह पता लगाया जा सकता है कि fetchDidSucceed प्लगिन जोड़ना रणनीति को ध्यान में रखकर भी ऐसा किया जा सकता है:

const statusPlugin = {
  fetchDidSucceed: ({response}) => {
    if (response.status >= 500) {
      // Throwing anything here will trigger fetchDidFail.
      throw new Error('Server error.');
    }
    // If it's not 5xx, use the response as-is.
    return response;
  },
};

// Add statusPlugin to the plugins array in your strategy.

बेहतर इस्तेमाल के लिए

Workbox के बैकग्राउंड सिंक में एक Queue क्लास भी मिलती है. इसकी मदद से ये काम किए जा सकते हैं विफल अनुरोधों को इंस्टैंशिएट करें और जोड़ें. पूरे न हो पाने वाले अनुरोधों को सेव कर लिया गया है IndexedDB में और जब ब्राउज़र को लगता है कि कनेक्टिविटी पुनर्स्थापित हो गई है, तो पुनः प्रयास किया जाता है (यानी सिंक इवेंट मिलने पर).

कोई सूची बनाना

Workbox की बैकग्राउंड सिंक वाली सूची बनाने के लिए, आपको इसका इस्तेमाल करना होगा सूची का नाम (जो आपके चैनल के लिए यूनीक होना चाहिए शुरुआत की जगह):

import {Queue} from 'workbox-background-sync';

const queue = new Queue('myQueueName');

सूची का नाम, उन टैग के नाम के हिस्से के रूप में इस्तेमाल किया जाता है जिन्हें register() से जुड़ा दुनिया भर के SyncManager. यह समय है इसका इस्तेमाल इस तरह से भी किया जाता है: इसके लिए Object Store नाम IndexedDB डेटाबेस.

सूची में अनुरोध जोड़ना

सूची बनाने के बाद, उसमें पूरे न हो पाने वाले अनुरोध जोड़े जा सकते हैं. आपने .pushRequest() तरीके का इस्तेमाल करके, पूरा अनुरोध नहीं जोड़ा है. उदाहरण के लिए, यह कोड, पूरे न हो पाने वाले सभी अनुरोधों को कैच करके उन्हें सूची में जोड़ देता है:

import {Queue} from 'workbox-background-sync';

const queue = new Queue('myQueueName');

self.addEventListener('fetch', event => {
  // Add in your own criteria here to return early if this
  // isn't a request that should use background sync.
  if (event.request.method !== 'POST') {
    return;
  }

  const bgSyncLogic = async () => {
    try {
      const response = await fetch(event.request.clone());
      return response;
    } catch (error) {
      await queue.pushRequest({request: event.request});
      return error;
    }
  };

  event.respondWith(bgSyncLogic());
});

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

वर्कबॉक्स बैकग्राउंड सिंक की जांच की जा रही है

अफ़सोस की बात है, BackdropSync की जांच करना कुछ हद तक आसान और मुश्किल है कई वजहों से ऐसा किया जा सकता है.

लागू होने की जांच करने का सबसे सही तरीका, यहां दिया गया तरीका है:

  1. पेज लोड करें और अपने सर्विस वर्कर को रजिस्टर करें.
  2. अपने कंप्यूटर का नेटवर्क या वेब सर्वर बंद कर दें.
    • Chrome DevTools का ऑफ़लाइन इस्तेमाल न करें. ऑफ़लाइन चेकबॉक्स DevTools सिर्फ़ पेज के अनुरोधों पर असर डालता है. सर्विस वर्कर के लिए अनुरोध पहले की तरह ही काम करता रहेगा.
  3. ऐसे नेटवर्क अनुरोध करें जिन्हें वर्कबॉक्स बैकग्राउंड सिंक के साथ सूची में रखा जाना चाहिए.
    • आप Chrome DevTools > Application > IndexedDB > workbox-background-sync > requests अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है
  4. अब अपना नेटवर्क या वेब सर्वर चालू करें.
  5. इस पर जाकर, sync इवेंट से पहले इसे ज़बरदस्ती चालू करें Chrome DevTools > Application > Service Workers, इसका टैग नाम डालकर workbox-background-sync:<your queue name> जहां <your queue name> होना चाहिए सूची का नाम डालें, और फिर 'सिंक करें' पर क्लिक करें बटन.

    Chrome DevTools में सिंक बटन का उदाहरण

  6. आपको पूरे न हो पाने वाले अनुरोधों के लिए पूरे नेटवर्क अनुरोध दिखेंगे और IndexedDB डेटा अब खाली होना चाहिए, क्योंकि अनुरोध किए गए फिर से चलाया गया.

टाइप

BackgroundSyncPlugin

fetchDidFail लाइफ़साइकल कॉलबैक लागू करने वाली क्लास. इससे यह बैकग्राउंड में सिंक करने की सूची में, पूरे न हो पाने वाले अनुरोधों को जोड़ना आसान है.

प्रॉपर्टी

  • कंस्ट्रक्टर

    अमान्य

    constructor फ़ंक्शन इस तरह दिखता है:

    (name: string, options?: QueueOptions) => {...}

    • नाम

      स्ट्रिंग

      workbox-background-sync.Queue देखें पैरामीटर की जानकारी के लिए दस्तावेज़.

    • विकल्प

      QueueOptions ज़रूरी नहीं

Queue

IndexedDB में पूरे न हो पाने वाले अनुरोधों को मैनेज करने और फिर से कोशिश करने वाली क्लास बाद में. स्टोर करने और फिर से चलाने की प्रोसेस के सभी हिस्सों की निगरानी कॉलबैक.

प्रॉपर्टी

  • कंस्ट्रक्टर

    अमान्य

    दिए गए विकल्पों के साथ सूची का इंस्टेंस बनाता है

    constructor फ़ंक्शन इस तरह दिखता है:

    (name: string, options?: QueueOptions) => {...}

    • नाम

      स्ट्रिंग

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

    • विकल्प

      QueueOptions ज़रूरी नहीं

  • नाम

    स्ट्रिंग

  • getAll

    अमान्य

    वे सभी एंट्री दिखाता है जिनकी समयसीमा खत्म नहीं हुई है (हर maxRetentionTime के हिसाब से). जिन एंट्री की समयसीमा खत्म हो चुकी है उन्हें सूची से हटा दिया जाता है.

    getAll फ़ंक्शन इस तरह दिखता है:

    () => {...}

    • returns

      Promise&lt;QueueEntry[]&gt;

  • popRequest

    अमान्य

    सूची में मौजूद आखिरी अनुरोध को हटाता है और वापस भेजता है. साथ ही, टाइमस्टैंप और कोई भी मेटाडेटा). लौटाया गया ऑब्जेक्ट इस तरह से होता है: {request, timestamp, metadata}.

    popRequest फ़ंक्शन इस तरह दिखता है:

    () => {...}

    • returns

      Promise&lt;QueueEntry&gt;

  • pushRequest

    अमान्य

    पास किए गए अनुरोध को IndexedDB में संग्रहित करता है (उसके टाइमस्टैंप और किसी भी मेटाडेटा) पर क्लिक करें.

    pushRequest फ़ंक्शन इस तरह दिखता है:

    (entry: QueueEntry) => {...}

    • एंट्री

      QueueEntry

    • returns

      प्रॉमिस<void>

  • registerSync

    अमान्य

    इस इंस्टेंस के लिए यूनीक टैग के साथ, सिंक इवेंट को रजिस्टर करता है.

    registerSync फ़ंक्शन इस तरह दिखता है:

    () => {...}

    • returns

      प्रॉमिस<void>

  • replayRequests

    अमान्य

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

    replayRequests फ़ंक्शन इस तरह दिखता है:

    () => {...}

    • returns

      प्रॉमिस<void>

  • shiftRequest

    अमान्य

    सूची में मौजूद पहले अनुरोध को हटाता है और दिखाता है (इसके साथ टाइमस्टैंप और कोई भी मेटाडेटा). लौटाया गया ऑब्जेक्ट इस तरह से होता है: {request, timestamp, metadata}.

    shiftRequest फ़ंक्शन इस तरह दिखता है:

    () => {...}

    • returns

      Promise&lt;QueueEntry&gt;

  • साइज़

    अमान्य

    सूची में मौजूद एंट्री की संख्या दिखाता है. ध्यान दें कि इस संख्या में ऐसी एंट्री भी शामिल होती हैं जिनकी समयसीमा खत्म हो चुकी है (हर maxRetentionTime).

    size फ़ंक्शन इस तरह दिखता है:

    () => {...}

    • returns

      Promise&lt;number&gt;

  • unshiftRequest

    अमान्य

    पास किए गए अनुरोध को IndexedDB में संग्रहित करता है (उसके टाइमस्टैंप और किसी भी मेटाडेटा) जोड़ दें.

    unshiftRequest फ़ंक्शन इस तरह दिखता है:

    (entry: QueueEntry) => {...}

    • एंट्री

      QueueEntry

    • returns

      प्रॉमिस<void>

QueueOptions

प्रॉपर्टी

  • forceSyncFallback

    बूलियन ज़रूरी नहीं

  • maxRetentionTime

    नंबर वैकल्पिक

  • ऑनसिंक

    OnSyncCallback ज़रूरी नहीं

QueueStore

IndexedDB में सूची से अनुरोधों को मैनेज करने के लिए मैनेज की जाने वाली क्लास, आसानी से ऐक्सेस करने के लिए, सूची को उनके नाम से इंडेक्स किया जाता है.

ज़्यादातर डेवलपर को इस क्लास को सीधे ऐक्सेस करने की ज़रूरत नहीं होगी; यह बेहतर तरीके से इस्तेमाल किया जा सकता है.

प्रॉपर्टी

  • कंस्ट्रक्टर

    अमान्य

    इस इंस्टेंस को सूची इंस्टेंस के साथ जोड़ता है, ताकि जोड़ी गई एंट्री ये हो सकती हैं इसकी पहचान उनकी सूची के नाम से की जाती है.

    constructor फ़ंक्शन इस तरह दिखता है:

    (queueName: string) => {...}

    • queueName

      स्ट्रिंग

  • deleteEntry

    अमान्य

    दिए गए आईडी की एंट्री को मिटाता है.

    चेतावनी: इस तरीके से यह पक्का नहीं होता कि मिटाई गई एंट्री इससे जुड़ी है सूची (यानी queueName से मेल खाती है). हालांकि, यह सीमा स्वीकार की जा सकती है क्योंकि यह क्लास सार्वजनिक तौर पर ज़ाहिर नहीं की जाती. एक और जाँच करने पर यह तरीका काफ़ी धीमा है.

    deleteEntry फ़ंक्शन इस तरह दिखता है:

    (id: number) => {...}

    • आईडी

      संख्या

    • returns

      प्रॉमिस<void>

  • getAll

    अमान्य

    स्टोर की queueName से मिलती-जुलती सभी एंट्री दिखाता है.

    getAll फ़ंक्शन इस तरह दिखता है:

    () => {...}

    • returns

      Promise&lt;QueueStoreEntry[]&gt;

  • popEntry

    अमान्य

    queueName से मिलान करने वाली सूची की आखिरी एंट्री को हटाकर, उसे दिखाता है.

    popEntry फ़ंक्शन इस तरह दिखता है:

    () => {...}

    • returns

      Promise&lt;QueueStoreEntry&gt;

  • pushEntry

    अमान्य

    सूची के आखिरी हिस्से में कोई एंट्री जोड़ें.

    pushEntry फ़ंक्शन इस तरह दिखता है:

    (entry: UnidentifiedQueueStoreEntry) => {...}

    • एंट्री

      UnidentifiedQueueStoreEntry

    • returns

      प्रॉमिस<void>

  • shiftEntry

    अमान्य

    queueName से मिलान करने वाली सूची की पहली एंट्री को हटाकर, उसे नतीजे के तौर पर दिखाता है.

    shiftEntry फ़ंक्शन इस तरह दिखता है:

    () => {...}

    • returns

      Promise&lt;QueueStoreEntry&gt;

  • साइज़

    अमान्य

    queueName से मेल खाने वाले स्टोर में एंट्री की संख्या दिखाता है.

    size फ़ंक्शन इस तरह दिखता है:

    () => {...}

    • returns

      Promise&lt;number&gt;

  • unshiftEntry

    अमान्य

    सूची में पहले कोई एंट्री जोड़ें.

    unshiftEntry फ़ंक्शन इस तरह दिखता है:

    (entry: UnidentifiedQueueStoreEntry) => {...}

    • एंट्री

      UnidentifiedQueueStoreEntry

    • returns

      प्रॉमिस<void>

StorableRequest

अनुरोधों को क्रम से लगाने और क्रम से लगाने की प्रोसेस को आसान बनाने के लिए क्लास, ताकि वे को IndexedDB में सेव किया जा सकता है.

ज़्यादातर डेवलपर को इस क्लास को सीधे ऐक्सेस करने की ज़रूरत नहीं होगी; यह बेहतर तरीके से इस्तेमाल किया जा सकता है.

प्रॉपर्टी

  • कंस्ट्रक्टर

    अमान्य

    यह अनुरोध डेटा के उस ऑब्जेक्ट को स्वीकार करता है जिसका इस्तेमाल Request है, लेकिन इसे IndexedDB में भी सेव किया जा सकता है.

    constructor फ़ंक्शन इस तरह दिखता है:

    (requestData: RequestData) => {...}

    • requestData

      RequestData

      अनुरोध किए गए डेटा का ऑब्जेक्ट, जिसमें url और इसकी सभी काम की प्रॉपर्टी [requestInit]https://fetch.spec.whatwg.org/#requestinit.

  • क्लोन

    अमान्य

    इंस्टेंस का डीप क्लोन बनाता है और दिखाता है.

    clone फ़ंक्शन इस तरह दिखता है:

    () => {...}

  • toObject

    अमान्य

    _requestData ऑब्जेक्ट के इंस्टेंस का डीप क्लोन दिखाता है.

    toObject फ़ंक्शन इस तरह दिखता है:

    () => {...}

    • returns

      RequestData

  • toRequest

    अमान्य

    इस इंस्टेंस को अनुरोध में बदलता है.

    toRequest फ़ंक्शन इस तरह दिखता है:

    () => {...}

    • returns

      अनुरोध

  • fromRequest

    अमान्य

    यह अनुरोध ऑब्जेक्ट को ऐसे सादे ऑब्जेक्ट में बदलता है जिसे स्ट्रक्चर्ड किया जा सकता है क्लोन किया गया या JSON फ़ाइल किया गया.

    fromRequest फ़ंक्शन इस तरह दिखता है:

    (request: Request) => {...}

    • CANNOT TRANSLATE

      अनुरोध