Apresentamos os buckets de armazenamento nem sempre são iguais

O Storage Standard define uma API para armazenamento permanente, estimativas de cota e a arquitetura de armazenamento da plataforma. Estamos lançando uma API para tornar a remoção do armazenamento permanente sob pressão grande de memória mais previsível. Disponível a partir do Chromium 122.

Que problema o padrão de armazenamento resolve?

Tradicionalmente, quando o usuário fica sem espaço de armazenamento no dispositivo, os dados armazenados com APIs como IndexedDB ou localStorage são perdidos sem que o usuário possa intervir. Uma maneira de tornar o armazenamento persistente é invocar o método persist() da interface StorageManager. Ele solicita simultaneamente ao usuário final a permissão e altera o armazenamento para ser permanente depois de concedido:

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

Esse método de solicitar que o armazenamento seja mantido é tudo ou nada. Não há como expressar necessidades de persistência mais refinadas. É tudo um bucket de armazenamento.

API Storage Buckets

A ideia central da API Storage Buckets é permitir que os sites criem vários buckets de armazenamento, em que o navegador pode excluir cada um deles independentemente de outros buckets. Isso permite que os desenvolvedores especifiquem a priorização da remoção para garantir que os dados mais valiosos não sejam excluídos.

Exemplo de caso de uso

Para ilustrar onde os buckets de armazenamento podem ser úteis, imagine um aplicativo de e-mail. Isso não seria perdoável se o app perdesse os rascunhos não enviados do usuário que existem apenas no cliente. Por outro lado, se eles estiverem armazenados em um servidor, o usuário provavelmente aceitaria que alguns dos e-mails mais antigos na caixa de entrada fossem removidos do cliente se o navegador estivesse sob pressão de armazenamento intensa.

Interface do app de e-mails
App de e-mails com buckets de armazenamento separados para caixa de entrada e rascunhos. Apenas para fins ilustrativos, isso não reflete necessariamente como o Gmail funciona.

Usar a API Storage Buckets

Crie um novo bucket de armazenamento

É possível criar um novo bucket de armazenamento com o método open() na interface StorageBucketManager.

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

Criar um novo bucket de armazenamento permanente

Para garantir que o bucket de armazenamento seja mantido, transmita os argumentos de opção durability e persisted para o método open():

  • persisted determina se o bucket de armazenamento precisa ser mantido ou não. Os valores permitidos são false (padrão) ou true.
  • durability fornece uma dica para o navegador que ajuda a compensar o desempenho de gravação com um risco reduzido de perda de dados em caso de falhas de energia. Os valores permitidos são 'relaxed' (padrão) ou 'strict':

    • 'strict' buckets tentam minimizar o risco de perda de dados em caso de falha de energia. Isso pode resultar em um desempenho reduzido, o que significa que as gravações podem levar mais tempo para serem concluídas, podem afetar o desempenho geral do sistema, podem consumir mais energia da bateria e podem desgastar o dispositivo de armazenamento mais rapidamente.
    • Buckets 'relaxed' podem "esquecer" gravações que foram concluídas nos últimos segundos, quando ocorre uma perda de energia. Em troca, a gravação de dados nesses buckets pode ter características de desempenho melhores e permite que a carga da bateria dure mais, resultando em um ciclo de vida maior do dispositivo de armazenamento. Além disso, a falta de energia não levará à corrupção de dados a uma taxa maior do que nos 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`.
});

Acessar as APIs de armazenamento de um bucket do Storage

Cada bucket de armazenamento está associado a APIs de armazenamento, por exemplo, IndexedDB, Cache ou File. Essas APIs de armazenamento funcionam normalmente, apenas que o ponto de entrada é da interface StorageBucket, por exemplo, 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 úteis