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 persistente de armazenamento sob pressão de memória pesada mais previsível. Ela 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 permanente é invocar o método persist() da interface StorageManager. Ela solicita a permissão do usuário final ao mesmo tempo 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 a persistência do armazenamento é tudo ou nada. Não há como expressar necessidades de persistência mais refinadas. Tudo é um bucket de armazenamento.

A API Storage Buckets

A ideia central da API Storage Buckets é conceder aos sites a capacidade de criar vários buckets de armazenamento, em que o navegador pode optar por excluir cada bucket independentemente dos outros. Isso permite que os desenvolvedores especifiquem a prioridade de 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 seriam úteis, imagine um aplicativo de e-mail. Seria imperdoá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, é provável que alguns dos e-mails mais antigos da caixa de entrada sejam removidos do cliente se o navegador estiver sob grande pressão de armazenamento.

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

Crie um novo 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 mantido

Para garantir que o bucket de armazenamento seja mantido, transmita as opções 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 ao navegador que o ajuda a reduzir o desempenho de gravação 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 na falta de energia. Isso pode reduzir o desempenho, 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 descarregar o dispositivo de armazenamento mais rapidamente.
    • Os buckets 'relaxed' podem "esquecer" gravações concluídas nos últimos segundos, quando ocorre uma perda de energia. Por outro lado, a gravação de dados nesses buckets pode ter características de melhor desempenho e permitir que a carga da bateria dure mais tempo, resultando em uma vida útil maior do dispositivo de armazenamento. Além disso, uma falha de energia não causa corrupção de dados a uma taxa mais alta do que em 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`.
});

Acesse as APIs de armazenamento em um bucket de armazenamento

Cada bucket de armazenamento está associado a APIs de armazenamento, por exemplo, IndexedDB, a interface Cache ou a interface 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);
});

Depurar buckets de armazenamento no DevTools

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

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

Recursos úteis