Um padrão no mundo das APIs JavaScript que os veteranos em desenvolvimento da Web perceberão é que estamos criando novos métodos para realizar o que as APIs mais antigas e grosseiras já realizaram. XMLHttpRequest tornou-se a fetch algumas APIs, como a Battery, tornaram-se assíncronas, e há dezenas de outros exemplos. Outra API que precisa desesperadamente de atualização é a API de cookies… e finalmente conseguimos: cookieStore.

A nova API de cookies, cookieStore, é assíncrona e fornece um método lógico para o gerenciamento de cookies. É preciso lembrar que o método anterior de obter e definir cookies girava completamente em torno da concatenação e análise de document.cookie como uma string. O senhor não acredita em mim? Dê uma olhada nessa monstruosidade!

document.cookie="__Secure-COOKIENAME=cookie-value" +
  '; Path=/' +
  '; expires=Fri, 12 Aug 2016 23:05:17 GMT' +
  '; Secure' +
  '; Domain=example.org';
// now we could assume the write succeeded, but since
// failure is silent it is difficult to tell, so we
// read to see whether the write succeeded
var successRegExp =
  /(^|; ?)__Secure-COOKIENAME=cookie-value(;|$)/;
if (String(document.cookie).match(successRegExp)) {
  console.log('It worked!');
} else {
  console.error('It did not work, and we do not know why');
}

Vamos nos concentrar no uso dessa nova API, cookieStore, para trazer sanidade aos cookies!

Se realmente quiser ver como os cookies são apresentados a você agora, acesse seu site favorito e digite document.cookie . Que horror!

Definir um cookie

cookieStore.set permite que o senhor defina um cookie com nome, valor e outros detalhes específicos:

// All cookieStore methods are async, so you can `await` or `then`/`catch`
await cookieStore.set({ 
  name: "dw-test", 
  value: 1, 
  domain: 'davidwalsh.name', 
  // Very far in the future!
  expires: Date.now() + Date.now() 
});

// Quick, naive set
await cookieStore.set('key', 'value');

Isso é muito melhor do que concatenar uma string estranha em uma string já estranha document.cookie!

Obter um cookie

cookieStore.get fornece um método para obter o valor de um cookie específico:

const testCookie = await cookieStore.get('dw-test');

{
  domain: "davidwalsh.name",
  expires: 3206289322149,
  name: "dw-test",
  path: "/",
  sameSite: "strict",
  secure: true,
  value: "1",
}

Se o cookie existir e não tiver expirado, o valor e muito mais sobre o cookie serão retornados. Sim, um simples get em vez de analisar uma string! Tenho lágrimas nos olhos!

Excluir um cookie

Podemos usar cookieStore.delete para remover um cookie:

await cookieStore.delete('dw-test');

Tão simples quanto o senhor espera!

Evento de mudança de cookie

Se quiser saber quando os cookies estão sendo criados, excluídos ou modificados, o senhor pode ouvir o evento change no site do cookieStore:

cookieStore.addEventListener('change', event => {
  console.log(`${event.changed.length} changed cookies`);
  for (const cookie in event.changed)
    console.log(`Cookie ${cookie.name} changed to ${cookie.value}`);

  console.log(`${event.deleted.length} deleted cookies`);
  for (const cookie in event.deleted)
    console.log(`Cookie ${cookie.name} deleted`);
});

Estou muito feliz que o antigo document.cookie esteja sendo substituído por este incrível e simples cookieStore API. Avante e para cima com as APIs JavaScript! Qual API herdada o senhor gostaria de ver melhorada em seguida?