Nie wszystkie miejsca na dane są sobie równe: wprowadzenie zasobników pamięci masowej

Certyfikat Storage Standard definiuje interfejs API do szacowania ilości pamięci trwałej i szacunków limitów oraz architekturę pamięci masowej platformy. Wprowadzamy interfejs API, który sprawia, że trwałe usuwanie pamięci masowej jest bardziej przewidywalne w przypadku dużego obciążenia pamięci. Jest dostępna od Chromium 122.

Jaki problem rozwiązuje standard pamięci masowej?

Zazwyczaj gdy użytkownikowi zabraknie miejsca na urządzeniu, dane przechowywane przez interfejsy API takie jak IndexedDB czy localStorage zostają utracone bez możliwości interwencji użytkownika. Sposobem na utrzymanie miejsca na dane jest wywołanie metody persist() w interfejsie StorageManager. Jednocześnie prosi użytkownika o uprawnienia i po przyznaniu zmienia miejsce na dane, aby było trwałe:

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

W tej metodzie pojawia się prośba o zachowanie miejsca na dane – wszystko albo nic. Nie da się wyrazić większej szczegółowości potrzeby wytrwałości. To jeden zasobnik na dane.

Interfejs API zasobników Cloud Storage

Podstawową koncepcją interfejsu Storage buckets API jest umożliwienie witrynom tworzenia wielu zasobników na dane, w których przeglądarka może usunąć każdy z nich niezależnie od innych. Dzięki temu deweloperzy mogą określić priorytety trwałego usuwania, aby zapobiec usunięciu najbardziej wartościowych danych.

Przykład zastosowania

Aby pokazać, gdzie mogą się przydać zasobniki na dane, wyobraź sobie aplikację pocztową. Nie można wybaczyć, jeśli aplikacja utraci niewysłane wersje robocze, które istnieją tylko w kliencie. Jeśli natomiast wiadomości są przechowywane na serwerze, użytkownik prawdopodobnie nie poradzi sobie, aby niektóre z najstarszych e-maili ze skrzynki odbiorczej były usuwane z klienta, jeśli w przeglądarce znajduje się duża ilość pamięci.

Interfejs aplikacji Poczta
Aplikacja e-mail z osobnymi zasobnikami na dane dla skrzynki odbiorczej i wersji roboczych. Opisy nie muszą przedstawiać sposobu działania Gmaila. Mają charakter poglądowy.

Użyj interfejsu Storage buckets API

Tworzenie nowego zasobnika na dane

Nowy zasobnik na dane można utworzyć za pomocą metody open() w interfejsie StorageBucketManager.

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

Utwórz nowy zapisany zasobnik na dane

Aby mieć pewność, że zasobnik na dane będzie trwały, możesz przekazywać argumenty opcji durability i persisted do metody open():

  • persisted określa, czy zasobnik na dane ma być utrwalony. Dozwolone wartości to false (domyślna) lub true.
  • durability udostępnia przeglądarce wskazówkę, która pomaga ograniczyć wydajność zapisu ze zmniejszonym ryzykiem utraty danych w przypadku awarii zasilania. Dozwolone wartości to 'relaxed' (domyślna) lub 'strict':

    • 'strict' zasobników próbuje zminimalizować ryzyko utraty danych z powodu awarii zasilania. Może się to wiązać z niższą wydajnością, co oznacza, że operacje zapisu mogą trwać dłużej, może wpływać na ogólną wydajność systemu, zużywać więcej energii baterii i szybciej zużywać urządzenie pamięci masowej.
    • W przypadku utraty zasilania 'relaxed' zasobnik może „zapomnieć” zapisy ukończone w ciągu ostatnich kilku sekund. Z kolei zapisywanie danych w tych zasobnikach może mieć lepsze parametry wydajności i wydłużać czas ładowania baterii oraz wydłużać czas eksploatacji urządzenia. Awaria zasilania nie doprowadzi do uszkodzenia danych częściej niż w przypadku zasobników '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`.
});

Dostęp do interfejsów API pamięci masowej z zasobnika na dane

Każdy zasobnik na dane jest powiązany z interfejsami API pamięci masowej, np. IndexedDB, Cache lub File. Te interfejsy API pamięci masowej działają w zwykły sposób, z tą różnicą, że punkt wejścia pochodzi z interfejsu StorageBucket, np. 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);
});

Przydatne materiały