Ciclos de vida mais longos do service worker de extensão

Os service workers de extensão agora podem permanecer ativos enquanto estiverem recebendo eventos. Isso aumenta a confiabilidade dos workers de serviços de extensão, mas tem uma armadilha a ser evitada.

Joe Medley
Joe Medley

A partir do Chrome 110 (na versão Beta a partir de 7 de fevereiro de 2023), os service workers de extensão continuarão ativos enquanto estiverem recebendo eventos. Isso corrige um problema de tempo na implementação anterior de service workers de extensão. Os tempos limite podiam ocorrer quando novos eventos estavam na fila de eventos e os tempos limite truncaram o trabalho assíncrono. Essa melhoria elimina o ciclo de vida máximo de cinco minutos para service workers de extensão.

Este artigo descreve como esses comportamentos mudaram.

Contexto

Os service workers de extensão se comportam principalmente como web service workers, mas além dos eventos, os service workers de extensão também podem detectar eventos de extensão. Embora os eventos normais de service worker estendam o ciclo de vida do service worker, antes do lançamento da versão 110, apenas alguns eventos de plataforma de extensão mantinham um service worker de extensão ativo.

Normalmente, o Chromium encerra um service worker depois que uma das seguintes condições é atendida:

  • O service worker não recebeu um evento por mais de trinta segundos e não há tarefas pendentes de longa duração em andamento. Se um service worker recebesse um evento durante esse tempo, o timer de inatividade era removido.
  • Uma tarefa de longa duração levou mais de cinco minutos para ser concluída e nenhum evento foi recebido nos últimos 30 segundos.

Novos eventos do service worker recebidos antes que o timer de inatividade ou o timer de tarefa de longa duração expire zeram os timers e estendem a vida útil do service worker.

Infelizmente, esse comportamento não se aplicava a eventos de extensão. Eventos de extensão podem despertar um service worker de extensão e mantê-lo ativo até que o evento seja concluído, mas não podem estender o timer de inatividade de 30 segundos. Isso significava que os service workers de extensão podiam ser encerrados a qualquer momento após a conclusão do último evento de extensão, mesmo que o navegador tivesse acabado de enviar um novo evento para a extensão.

O que mudou

A partir do Chrome 110, todos os eventos redefinem o timer de inatividade, e o tempo limite de inatividade não ocorre se houver eventos pendentes. Em outras palavras, supondo que não haja interrupções inesperadas, os service workers de extensão agora normalmente permanecerão ativos enquanto estiverem processando eventos ativamente. Além disso, chamadas para APIs do Chrome específicas de extensões, como chrome.storage.local.get(), redefinem o tempo limite de inatividade. Mais especificamente:

  • O service worker é encerrado após 30 segundos de inatividade. Receber um evento ou chamar uma API de extensão redefine esse cronômetro.
  • O service worker é encerrado se uma única solicitação, como um evento ou chamada de API, demorar mais de cinco minutos para ser processada.

Algumas APIs, como mensagens nativas, oferecem um sinal de atividade forte que cancela esses dois timers.

Ainda estamos trabalhando para garantir que os service workers de extensão sejam encerrados sempre que possível, sem encerrar os trabalhos de longa duração. Os service workers de extensão que se preocupam com recursos devem sempre gerar resultados quando possível. Além disso, as extensões devem se preparar para o encerramento inesperado ao manter o estado. Isso protege contra eventos imprevisíveis, como o navegador sendo fechado pelo usuário à força.

Foto de Paula Guerreiro no Unsplash