Mayores vidas de los service worker de extensiones

Los service workers de extensiones ahora pueden permanecer activos mientras estén recibiendo eventos. Esto aumenta la confiabilidad de los service workers de extensiones, pero presenta un inconveniente que deberías evitar.

Joe Medley
Joe Medley

A partir de Chrome 110 (en versión beta desde el 7 de febrero de 2023), los service workers de extensiones permanecerán activos mientras estén recibiendo eventos. Esto corrige un problema de tiempo en la implementación anterior de service workers de extensiones. Era posible que ocurrieran tiempos de espera cuando los eventos nuevos estaban en la cola de eventos y que los tiempos de espera truncaran el trabajo asíncrono. Esta mejora quita la duración máxima de cinco minutos para los service workers de extensiones.

En este artículo, se describe cómo cambiaron estos comportamientos.

Información general

En su mayoría, los service workers de extensiones se comportan como service workers web, pero además de los eventos de service worker, los service workers de extensiones también pueden escuchar los eventos de extensiones. Si bien los eventos normales de un service worker extienden la vida útil del service worker, antes del lanzamiento de 110, solo unos pocos eventos de la plataforma de extensiones mantenían activos un service worker.

Por lo general, Chromium finaliza un service worker después de que se cumple una de las siguientes condiciones:

  • El service worker no recibió ningún evento en más de treinta segundos y no hay tareas de larga duración pendientes en curso. Si un service worker recibe un evento durante ese tiempo, se quitó el temporizador de inactividad.
  • Una tarea de larga duración tardó más de cinco minutos en completarse y no se recibieron eventos en los últimos treinta segundos.

Los nuevos eventos de service worker que se reciban antes de que venza el temporizador de inactividad o de tareas de larga duración restablecerían los cronómetros y extenderían la vida útil del service worker.

Lamentablemente, este comportamiento no se aplicó a los eventos de extensión. Los eventos de extensión podrían activar un service worker de extensión y mantenerlo activo hasta que el evento finalice, pero no podría extender el temporizador de inactividad de treinta segundos. Esto significaba que los service workers de extensiones podían finalizarse en cualquier momento después de que se completara el último evento de la extensión, incluso si el navegador acababa de enviar un evento nuevo a la extensión.

Qué cambió

A partir de Chrome 110, todos los eventos restablecen el temporizador de inactividad y el tiempo de espera de inactividad no se producirá si hay eventos pendientes. En otras palabras, si suponemos que no hay interrupciones inesperadas, los service workers de extensiones, por lo general, permanecerán activos mientras estén procesando eventos de manera activa. Además, las llamadas a las APIs de Chrome específicas de la extensión, como chrome.storage.local.get(), restablecerán el tiempo de espera de inactividad. En particular, haz lo siguiente:

  • El service worker finaliza después de 30 segundos de inactividad. (Recibir un evento o llamar a una API de extensión restablece este temporizador).
  • El service worker finaliza si una única solicitud, como un evento o una llamada a la API, tarda más de 5 minutos en procesarse.

Algunas APIs, como la mensajería nativa, proporcionan un servicio de keep-alive sólido que cancela ambos temporizadores.

Seguimos trabajando para garantizar que los service workers de extensiones finalicen siempre que sea posible, sin cerrar los trabajos de larga duración. Los service workers de extensiones que tienen en cuenta los recursos siempre deben ceder siempre que sea posible. Además, las extensiones deben prepararse para la finalización inesperada mediante la persistencia del estado. De esta manera, se brinda protección contra eventos impredecibles, como el cierre forzoso del navegador.

Foto de Paula Guerreiro en Unsplash