Os workers de serviço de extensão agora podem permanecer ativos enquanto estiverem recebendo eventos. Isso aumenta a confiabilidade dos trabalhadores dos serviços de extensão, mas tem uma armadilha que você precisa evitar.
A partir do Chrome 110 (na versão Beta a partir de 7 de fevereiro de 2023), os service workers de extensão permanecem ativos enquanto recebem eventos. Isso corrige um problema de tempo na implementação anterior de workers de serviço de extensão. Era possível que os timeouts ocorressem quando novos eventos estivessem na fila de eventos e que os timeouts truncassem o trabalho assíncrono. Essa melhoria remove o tempo de vida máximo de cinco minutos para workers de serviço de extensão.
Este artigo descreve como esses comportamentos mudaram.
Contexto
Os service workers de extensão se comportam de maneira semelhante aos service workers da Web, mas, além dos eventos de service worker, também podem detectar eventos de extensão. Embora os eventos normais de worker de serviço aumentem a vida útil do worker, antes do lançamento da 110, apenas alguns eventos da plataforma de extensão mantinham um worker de serviço de extensão ativo.
Normalmente, o Chromium encerra um worker de serviço depois que uma das seguintes condições é atendida:
- O worker de serviço não recebeu um evento por mais de 30 segundos e não há tarefas de execução longa pendentes. Se um worker de serviço recebeu um evento durante esse período, o timer inativo foi removido.
- Uma tarefa de execução longa levou mais de cinco minutos para ser concluída e nenhum evento foi recebido nos últimos 30 segundos.
Novos eventos de worker de serviço recebidos antes do término do cronômetro inativo ou do cronômetro de tarefa de longa duração redefiniriam os cronômetros e estenderiam a vida útil do worker de serviço.
Infelizmente, esse comportamento não se aplica aos eventos de extensão. Os eventos de extensão podem ativar um worker de serviço de extensão e mantê-lo ativo até a conclusão do evento, mas não podem estender o timer inativo de 30 segundos. Isso significa que os workers de serviço 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 redefiniram o timer inativo, e o tempo limite de inatividade não vai ocorrer se houver eventos pendentes. Em outras palavras, supondo que não haja interrupções inesperadas, os workers de serviço de extensão agora normalmente permanecem ativos enquanto estiverem processando eventos. Além disso, as chamadas para APIs específicas da extensão do Chrome, como chrome.storage.local.get()
, vão redefinir o tempo limite de inatividade. Especificamente:
- O worker de serviço é 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 uma chamada de API, levar mais de cinco minutos para ser processada.
Algumas APIs, como as mensagens nativas, oferecem um keep-alive forte que cancela esses dois temporizadores.
Ainda estamos trabalhando para garantir que os service workers de extensão sejam encerrados quando possível, sem interromper o trabalho de longa duração. Os workers de serviço de extensão que consideram os recursos precisam sempre ceder quando possível. Além disso, as extensões precisam se preparar para encerramentos inesperados mantendo o estado. Isso protege contra eventos imprevisíveis, como o fechamento forçado do navegador pelo usuário.
Foto de Paula Guerreiro no Unsplash