Apresentamos os buckets de armazenamento nem sempre são iguais

O Storage Standard define uma API para armazenamento persistente e estimativas de cota, além da arquitetura de armazenamento da plataforma. Estamos lançando uma API para tornar a exclusão persistente de armazenamento sob pressão de memória pesada mais previsível. Ele está disponível a partir do Chromium 122.

Qual 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 permissão ao usuário final e muda o armazenamento para ser persistente após a concessão:

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

Esse método de solicitação de persistência do armazenamento é tudo ou nada. Não há como expressar necessidades de persistência mais detalhadas. Tudo é um bucket de armazenamento.

API Storage Buckets

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

Exemplo de caso de uso

Para ilustrar onde os buckets de armazenamento são úteis, imagine um aplicativo de e-mail. Seria inaceitável se o app perdesse os rascunhos não enviados do usuário que só existem no cliente. Por outro lado, se eles estiverem armazenados em um servidor, o usuário provavelmente não se importará se alguns dos e-mails mais antigos da caixa de entrada forem removidos do cliente se o armazenamento do navegador estiver sob pressão.

Interface do app de e-mail
App de e-mail 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

Criar um bucket de armazenamento

Um novo bucket de armazenamento pode ser criado 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 persistente

Para garantir que o bucket de armazenamento seja mantido, é possível transmitir 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.
  • O durability fornece uma dica ao navegador que ajuda a trocar o desempenho de gravação por um risco reduzido de perda de dados em caso de falhas de energia. Os valores permitidos são 'relaxed' (padrão) ou 'strict':

    • Os buckets 'strict' tentam minimizar o risco de perda de dados em caso de falha de energia. Isso pode acontecer à custa de uma redução no desempenho, o que significa que as gravações podem levar mais tempo para serem concluídas, afetar o desempenho geral do sistema, consumir mais energia da bateria e desgastar o dispositivo de armazenamento mais rapidamente.
    • Os 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 melhores características de desempenho, permitir que a bateria dure mais e resultar em uma vida útil maior do dispositivo de armazenamento. Além disso, a falha de energia não leva à corrupção de dados em uma taxa mais alta do que para os 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

Cada bucket de armazenamento é associado a APIs de armazenamento, por exemplo, IndexedDB, a interface Cache ou a File. Essas APIs de armazenamento funcionam normalmente, apenas 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);
});

Depurar buckets de armazenamento no DevTools

Inspecione os buckets de armazenamento em uma árvore dedicada na seção Application > Storage.

Antes e depois de ativar a árvore de buckets de armazenamento na seção "Armazenamento".

Recursos úteis