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

Thomas Steiner
Thomas Steiner

El Estándar de almacenamiento define una API para el almacenamiento persistente y las estimaciones de cuota, 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 la alta presión de la memoria. 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 de solicitud de persistencia del almacenamiento es todo o nada. No hay forma de expresar necesidades de persistencia más detalladas. Todo es un bucket de almacenamiento.

La API de Storage Buckets

La idea principal de la API de Storage Buckets es brindar 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 priorización de 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, imaginemos una aplicación de correo electrónico. Sería imperdonable 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 no le importe que se quiten algunos de sus correos electrónicos más antiguos de la carpeta Recibidos del cliente si su 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 carpeta Recibidos y los borradores. (Solo a modo de ejemplo, 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 asegurarte de que el bucket de almacenamiento persista, puedes pasar argumentos de opción durability y persisted al método open():

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

    • Los buckets de 'strict' intentan minimizar el riesgo de pérdida de datos en caso de falla 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 una carga de batería dure más y prolongar la vida útil del dispositivo de almacenamiento. Además, una falla de energía no provocará 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 almacenamiento desde un bucket de almacenamiento

Cada bucket de almacenamiento está asociado con APIs de almacenamiento, por ejemplo, IndexedDB, la interfaz de Cache o la interfaz de 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);
});

Cómo depurar buckets de almacenamiento en DevTools

Inspecciona los buckets de almacenamiento en un árbol exclusivo 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