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

El estándar de almacenamiento define una API para el almacenamiento persistente y las estimaciones de cuota, además de la arquitectura de almacenamiento de la plataforma. Lanzaremos una API para que la expulsión de almacenamiento persistente bajo una alta presión de la memoria sea más predecible. Está disponible a partir de Chromium 122.

¿Qué problema resuelve el almacenamiento estándar?

Tradicionalmente, cuando 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 el 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 detalladas. Es un solo bucket de almacenamiento.

La API de Storage Buckets

La idea central 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 uno de forma independiente de los demás. Esto permite a los desarrolladores especificar la priorización de la expulsión 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, imagina una aplicación de correo electrónico. No se podría 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 al usuario le resulte adecuado quitar del cliente algunos de sus correos electrónicos más antiguos de la bandeja de entrada si su navegador está utilizando mucha carga 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 cómo funciona 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');

Crear un nuevo bucket de almacenamiento persistente

Para asegurarte de que el bucket de almacenamiento se conserve, puedes pasar los argumentos de opción durability y persisted al método open():

  • persisted determina si el bucket de almacenamiento debe conservarse o no. Los valores permitidos son false (predeterminado) o true.
  • durability proporciona una sugerencia al navegador que le permite compensar el rendimiento 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':

    • Los buckets de 'strict' intentan minimizar el riesgo de pérdida de datos ante fallas de energía. Esto puede generar un menor 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 'relaxed' pueden “olvidar” las escrituras que se completaron en los últimos segundos, cuando se produce una pérdida de energía. A cambio, la escritura de datos en estos buckets puede tener mejores características de rendimiento, permitir que la carga de la batería dure más tiempo y generar una mayor vida útil del dispositivo de almacenamiento. Además, las fallas de energía no causarán daños en los datos a una tasa más alta 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 se asocia 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 de 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);
});

Recursos útiles