No todo el almacenamiento es igual: presentamos los buckets de almacenamiento

Storage Standard define una API para el almacenamiento persistente, las estimaciones de cuotas y la arquitectura de almacenamiento de la plataforma. Lanzaremos una API para que la expulsión del almacenamiento persistente sea más predecible debido a una presión de memoria pesada. Está disponible a partir de Chromium 122.

¿Qué problema resuelve el estándar de almacenamiento?

Por lo general, a medida que el usuario se queda sin espacio de almacenamiento en su dispositivo, los datos almacenados con APIs como IndexedDB o localStorage se pierden sin que el usuario pueda intervenir. Una forma de hacer que el almacenamiento sea persistente es invocar el método persist() de la interfaz StorageManager. De manera simultánea, solicita permiso al usuario final y cambia el almacenamiento para que sea persistente una vez otorgado:

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

Este método para solicitar la persistencia del almacenamiento es todo o nada. No hay forma de expresar necesidades de persistencia más precisas. Todo es un bucket de almacenamiento.

API de Storage Buckets

La idea principal de la API de Storage Buckets es otorgar a los sitios la capacidad de crear varios buckets de almacenamiento, en los que el navegador puede elegir borrar cada bucket independientemente de los demás. Esto permite a los desarrolladores especificar la prioridad de expulsiones para asegurarse de que no se borren los datos más valiosos.

Ejemplo de caso de uso

Para ilustrar dónde serían útiles los buckets de almacenamiento, imaginemos una aplicación de correo electrónico. No se podrían perdonar si la app perdiera los borradores no enviados del usuario que solo existen en el cliente. Por el contrario, si se almacenan en un servidor, es probable que el usuario esté bien con que se quiten del cliente algunos de sus correos electrónicos más antiguos de la carpeta Recibidos si el navegador está bajo una gran presión de almacenamiento.

Interfaz de la app de correo electrónico
App de correo electrónico con buckets de almacenamiento independientes para la bandeja de entrada y los borradores. (Solo con fines ilustrativos, esto no refleja necesariamente el funcionamiento de Gmail).

Usa la API de Storage Buckets

Crea un bucket de almacenamiento nuevo

Se puede crear un bucket de almacenamiento nuevo con el método open() en la interfaz StorageBucketManager.

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

Crea un bucket de almacenamiento nuevo y persistente

Para garantizar que el bucket de almacenamiento persista, puedes pasar los argumentos de las opciones durability y persisted al método open():

  • persisted determina si el bucket de almacenamiento debe ser persistente o no. Los valores permitidos son false (predeterminado) o true.
  • durability proporciona una sugerencia al navegador que lo ayuda a compensar el rendimiento de las operaciones de escritura con un riesgo reducido de pérdida de datos en caso de cortes de energía. Los valores permitidos son 'relaxed' (predeterminado) o 'strict':

    • 'strict' buckets intentan minimizar el riesgo de pérdida de datos por fallas de energía. Esto puede acarrear una reducción del rendimiento, lo que significa que las operaciones de escritura pueden tardar más en completarse, afectar el rendimiento general del sistema, consumir más batería y agotar el dispositivo de almacenamiento más rápido.
    • Los buckets de 'relaxed' pueden “olvidar” las escrituras que se completaron en los últimos segundos, cuando se produce un corte de energía. A cambio, escribir datos en estos buckets puede tener mejores características de rendimiento, permitir que la carga de la batería dure más tiempo y aumentar la vida útil del dispositivo de almacenamiento. Además, un corte de energía no provocará daños en los datos a una tasa mayor que en los buckets de '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`.
});

Accede a las APIs de Storage desde un bucket de almacenamiento

Cada bucket de almacenamiento está asociado con las APIs de almacenamiento, por ejemplo, IndexedDB, la interfaz Cache o la interfaz File. Estas APIs de almacenamiento funcionan como de costumbre, solo que el punto de entrada es desde la interfaz StorageBucket, por ejemplo, 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);
});

Depura buckets de almacenamiento en Herramientas para desarrolladores

Inspecciona los buckets de almacenamiento en un árbol dedicado en la sección Application > Storage.

El antes y el después de habilitar el árbol de buckets de almacenamiento en la sección Almacenamiento.

Recursos útiles