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

Os service workers de extensão agora podem continuar ativos enquanto estiverem recebendo eventos. Isso aumenta a confiabilidade dos workers de serviços de extensão, mas tem uma armadilha que você precisa evitar.

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 vão continuar ativos enquanto estiverem recebendo eventos. Isso corrige um problema de tempo na implementação anterior dos service workers de extensão. Era possível que os tempos limite ocorriam quando novos eventos estavam na fila de eventos e que os tempos limite funcionavam para truncar o trabalho assíncrono. Essa melhoria remove a vida útil máxima de cinco minutos dos service workers de extensão.

Este artigo descreve como esses comportamentos mudaram.

Contexto

Os service workers de extensão geralmente se comportam como workers da Web, mas, além dos eventos do service worker, os service workers também podem detectar eventos de extensão. Embora os eventos normais de service worker prolongem a vida útil do service worker, antes do lançamento do 110, apenas alguns eventos de plataforma de extensão mantinham um service worker ativo.

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

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

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

Esse comportamento não se aplicava aos eventos de extensão. Eventos de extensão podem despertar um service worker e mantê-lo ativo até que o evento seja concluído, mas não é possível 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 enviado 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 quando há eventos pendentes. Em outras palavras, supondo que não haja interrupções inesperadas, os service workers de extensão 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(), vão redefinir o tempo limite de inatividade. Especificamente:

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

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

Ainda estamos trabalhando para garantir que os service workers de extensão sejam encerrados quando possível, sem encerrar o trabalho de longa duração. Os service workers de extensão com foco em recursos precisam sempre produzir quando possível. Além disso, as extensões precisam manter o estado para se preparar para o encerramento inesperado. Isso protege contra eventos imprevisíveis, como o fechamento forçado do navegador pelo usuário.

Foto de Paula Guerreiro no Unsplash (links em inglês)