Durée de vie des service workers d'extension plus longue

Les services d'extension peuvent désormais rester actifs tant qu'ils reçoivent des événements. Cela augmente la fiabilité des nœuds de calcul des services d'extension, mais présente un piège que vous devez éviter.

Joe Medley
Joe Medley

À partir de Chrome 110 (en version bêta à compter du 7 février 2023), les service workers d'extension restent actifs tant qu'ils reçoivent des événements. Cela corrige un problème de synchronisation dans l'implémentation précédente des service workers d'extension. Les délais d'inactivité pouvaient se produire lorsque de nouveaux événements se trouvaient dans la file d'attente des événements, et ces délais pouvaient tronquer le travail asynchrone. Cette amélioration supprime la durée de vie maximale de cinq minutes pour les service workers d'extension.

Cet article décrit les modifications apportées à ces comportements.

Contexte

Les service workers d'extension se comportent principalement comme des service workers Web, mais en plus des événements des service workers, ils peuvent écouter les événements d'extension. Bien que les événements normaux du service worker prolongent la durée de vie d'un service worker, avant la sortie de la version 110, seuls quelques événements de plate-forme d'extension permettaient à un service worker d'être actif.

Normalement, Chromium met fin au service worker lorsque l'une des conditions suivantes est remplie:

  • Le service worker n'a pas reçu d'événement depuis plus de 30 secondes, et aucune tâche de longue durée n'est en cours. Si un service worker recevait un événement pendant cette période, le minuteur d'inactivité était supprimé.
  • Une tâche de longue durée a pris plus de cinq minutes et aucun événement n'a été reçu au cours des 30 dernières secondes.

De nouveaux événements de service worker reçus avant l'expiration du minuteur d'inactivité ou de la tâche de longue durée réinitialisent les minuteurs et prolongent la durée de vie du service worker.

Malheureusement, ce comportement ne s'applique pas aux événements d'extension. Les événements d'extension peuvent réveiller un service worker d'extension et le maintenir actif jusqu'à la fin de l'événement, mais ils ne peuvent pas prolonger le délai d'inactivité de 30 secondes. Cela signifiait que les service workers d'extension pouvaient être clôturés à tout moment après le dernier événement d'extension, même si le navigateur venait d'envoyer un nouvel événement à l'extension.

Modifications apportées

À partir de Chrome 110, tous les événements réinitialisent le délai d'inactivité, et le délai d'inactivité ne se produira pas s'il y a des événements en attente. En d'autres termes, en l'absence d'interruptions inattendues, les service workers d'extension restent généralement actifs tant qu'ils traitent activement les événements. En outre, les appels aux API Chrome spécifiques aux extensions, telles que chrome.storage.local.get(), réinitialisent le délai d'inactivité. Notamment :

  • Le service worker s'arrête après 30 secondes d'inactivité. (Lorsque vous recevez un événement ou appelez une API d'extension, ce minuteur est réinitialisé.)
  • Le service worker met fin au traitement d'une requête unique, comme un événement ou un appel d'API, qui prend plus de cinq minutes.

Certaines API, telles que la messagerie native, fournissent un message keep-alive efficace qui annule ces deux minuteurs.

Nous mettons tout en œuvre pour que les service workers d'extension soient arrêtés dans la mesure du possible, sans interrompre les tâches de longue durée. Les services d'extension soucieux des ressources doivent toujours abandonner lorsque cela est possible. De plus, les extensions doivent se préparer à une fermeture inattendue grâce à la persistance de l'état. Cela permet d'éviter les événements imprévisibles, tels que la fermeture forcée du navigateur par l'utilisateur.

Photo de Paula Guerreiro, publiée sur Unsplash