Tout l'espace de stockage ne se valent pas: découvrez les buckets de stockage

La norme Storage Standard définit une API pour les estimations de stockage persistant et de quotas, ainsi que l'architecture de stockage de la plate-forme. Nous lançons une API permettant de rendre plus prévisible l'éviction de l'espace de stockage persistant en cas de forte pression de la mémoire. Elle est disponible depuis Chromium 122.

Quel problème le standard de stockage résout-il ?

Traditionnellement, lorsque l'utilisateur manque d'espace de stockage sur son appareil, les données stockées avec des API telles qu'IndexedDB ou localStorage sont perdues sans qu'il ne puisse intervenir. Pour rendre le stockage persistant, vous pouvez appeler la méthode persist() de l'interface StorageManager. Elle demande simultanément l'autorisation à l'utilisateur final et modifie le stockage pour qu'il devienne persistant une fois accordé:

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

Cette méthode de demande de stockage à conserver est l’équivalent de tout ou rien. Il n'existe aucun moyen d'exprimer des besoins de persistance plus précis. dans un seul bucket de stockage.

API Storage Buckets

L'objectif principal de l'API Storage Buckets est de permettre aux sites de créer plusieurs buckets de stockage que le navigateur peut choisir de supprimer indépendamment des autres. Cela permet aux développeurs de spécifier un niveau de priorité d'éviction afin de s'assurer que les données les plus importantes ne sont pas supprimées.

Exemple de cas d'utilisation

Pour illustrer l'utilité des buckets de stockage, imaginez une application de messagerie. Il serait impossible de parier si l'application perdait les brouillons non envoyés de l'utilisateur qui n'existent que sur le client. En revanche, s'ils sont stockés sur un serveur, l'utilisateur accepterait probablement que certains des e-mails les plus anciens de sa boîte de réception soient supprimés du client si son navigateur est soumis à une forte pression de stockage.

Interface de l'application E-mail
Application de messagerie avec des buckets de stockage distincts pour la boîte de réception et les brouillons. Notez que cela ne reflète pas nécessairement le fonctionnement de Gmail à titre d'illustration uniquement.

Utiliser l'API Storage Buckets

Créer un bucket de stockage

Un bucket de stockage peut être créé à l'aide de la méthode open() sur l'interface StorageBucketManager.

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

Créer un bucket de stockage persistant

Pour garantir la persistance du bucket de stockage, vous pouvez transmettre les arguments d'option durability et persisted à la méthode open():

  • persisted détermine si le bucket de stockage doit être persistant ou non. Les valeurs autorisées sont false (par défaut) ou true.
  • durability fournit au navigateur un indice qui l'aide à concilier les performances d'écriture et un risque réduit de perte de données en cas de coupure de courant. Les valeurs autorisées sont 'relaxed' (par défaut) ou 'strict':

    • Les buckets 'strict' tentent de minimiser le risque de perte de données en cas de coupure de courant. Cela peut entraîner une réduction des performances, ce qui signifie que les opérations d'écriture peuvent prendre plus de temps, affecter les performances globales du système, consommer plus d'énergie et épuiser l'appareil de stockage plus rapidement.
    • Les buckets 'relaxed' peuvent "oublier" les écritures effectuées au cours des dernières secondes en cas de perte de puissance. En retour, l'écriture de données dans ces buckets peut offrir de meilleures caractéristiques de performances et prolonger l'autonomie de la batterie, ce qui peut augmenter la durée de vie de l'appareil de stockage. En outre, une coupure de courant n'entraîne pas de corruption des données plus souvent que pour les buckets '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`.
});

Accéder aux API de stockage depuis un bucket de stockage

Chaque bucket de stockage est associé à des API de stockage, comme IndexedDB, l'interface Cache ou l'interface File. Ces API de stockage fonctionnent normalement, à la différence près que le point d'entrée provient de l'interface StorageBucket (par exemple, 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);
});

Ressources utiles