हर स्टोरेज एक जैसा नहीं होता: स्टोरेज बकेट की सुविधा शुरू की जा रही है

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

स्टोरेज स्टैंडर्ड से क्या समस्या हल होती है?

आम तौर पर, जब उपयोगकर्ता के डिवाइस में स्टोरेज के लिए बची जगह खत्म हो जाती है, तो इंडेक्स किया गया DB या localStorage जैसे एपीआई से सेव किया गया डेटा खो जाता है. इसके लिए, उपयोगकर्ता उसे बीच में दखल नहीं देता. स्टोरेज को स्थायी बनाए रखने का एक तरीका है. इसके लिए, StorageManager इंटरफ़ेस के persist() तरीके का इस्तेमाल करें. यह अनुमति के लिए असली उपयोगकर्ता से एक साथ अनुरोध करती है. साथ ही, स्टोरेज मिलने के बाद, उसे स्थायी तौर पर बदलती है:

const persisted = await navigator.storage.persist();
if (persisted) {
  /* Storage will not be cleared except by explicit user action. */
}

स्टोरेज को बनाए रखने के लिए, अनुरोध करने का यह तरीका काफ़ी है या कुछ नहीं. और मज़बूती से बनी रहने की ज़रूरतों को पूरा करने का कोई तरीका नहीं है. यह सिर्फ़ एक स्टोरेज बकेट है.

स्टोरेज बकेट एपीआई

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

इस्तेमाल के उदाहरण

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

ईमेल ऐप्लिकेशन का इंटरफ़ेस
इनबॉक्स और ड्राफ़्ट के लिए, अलग-अलग स्टोरेज बकेट के साथ ईमेल ऐप्लिकेशन. (यह ज़रूरी नहीं है कि Gmail के काम करने का तरीका, सिर्फ़ समझाने के मकसद से दिया गया हो.)

स्टोरेज बकेट एपीआई का इस्तेमाल करना

नया स्टोरेज बकेट बनाएं

StorageBucketManager इंटरफ़ेस पर open() तरीके का इस्तेमाल करके, नई स्टोरेज बकेट बनाई जा सकती है.

// Create a storage bucket for emails that are synchronized with the
// server.
const inboxBucket = await navigator.storageBuckets.open('inbox');

एक नया स्टोरेज बकेट बनाएं

स्टोरेज बकेट जारी रखने के लिए, open() तरीके में durability और persisted विकल्प वाले तर्क पास किए जा सकते हैं:

  • persisted से तय होता है कि स्टोरेज बकेट को जारी रखना चाहिए या नहीं. वैल्यू, false (डिफ़ॉल्ट) या true होनी चाहिए.
  • durability, ब्राउज़र के लिए एक संकेत देता है. यह ब्राउज़र के लिए सही तरीके से काम करने में मदद करता है, ताकि पावर फ़ेल होने पर डेटा खोने के जोखिम को कम किया जा सके. वैल्यू के तौर पर 'relaxed' (डिफ़ॉल्ट) या 'strict' का इस्तेमाल किया जा सकता है:

    • 'strict' बकेट, पावर सप्लाई फ़ेल होने पर डेटा खोने के जोखिम को कम करने की कोशिश करती है. इससे परफ़ॉर्मेंस में कमी हो सकती है. इसका मतलब है कि कॉन्टेंट लिखने में ज़्यादा समय लग सकता है और पूरे सिस्टम की परफ़ॉर्मेंस पर असर पड़ सकता है. साथ ही, इससे बैटरी ज़्यादा खर्च हो सकती है और स्टोरेज डिवाइस जल्दी खत्म हो सकता है.
    • पावर सप्लाई बंद होने पर, पिछले कुछ सेकंड में पूरे हुए 'relaxed' बकेट को "मिटाया" जा सकता है. बदले में, इन बकेट में डेटा लिखने से परफ़ॉर्मेंस से जुड़ी ख़ासियतें बेहतर हो सकती हैं. साथ ही, इससे बैटरी ज़्यादा समय तक चार्ज हो सकती है और डिवाइस का स्टोरेज लंबा हो सकता है. साथ ही, बिजली न जाने की वजह से, 'strict' बकेट के मुकाबले ज़्यादा डेटा खराब नहीं होगा.
// Create a storage bucket for email drafts that only exist on the client.
const draftsBucket = await navigator.storageBuckets.open('drafts', {
  durability: 'strict', // Or `'relaxed'`.
  persisted: true, // Or `false`.
});

स्टोरेज बकेट से स्टोरेज एपीआई ऐक्सेस करना

हर स्टोरेज बकेट, स्टोरेज एपीआई से जुड़ी होती है. उदाहरण के लिए, IndexedDB, कैश इंटरफ़ेस या फ़ाइल इंटरफ़ेस. ये स्टोरेज एपीआई सामान्य तरीके से काम करते हैं. सिर्फ़ वैसे ही, जैसे कि एंट्री पॉइंट, StorageBucket इंटरफ़ेस से हों, जैसे कि StorageBucket.indexedDB.

const inboxDb = await new Promise(resolve => {
  const request = inboxBucket.indexedDB.open('messages');
  request.onupgradeneeded = () => { /* migration code */ };
  request.onsuccess = () => resolve(request.result);
  request.onerror = () => reject(request.error);
});

ज़रूरी संसाधन