Mayores vidas de los service worker de extensiones

Los service workers de extensión ahora pueden permanecer activos mientras reciban eventos. Esto aumenta la confiabilidad de los trabajadores de los servicios de extensión, pero tiene un error que debes evitar.

Joe Medley
Jo Medley

A partir de Chrome 110 (versión beta a partir del 7 de febrero de 2023), los service workers de extensión se mantienen activos siempre que reciban eventos. Esto corrige un problema de tiempo en la implementación anterior de los service workers de extensión. Era posible que los tiempos de espera ocurrieran cuando los eventos nuevos estaban en la cola de eventos y que los tiempos de espera truncaran el trabajo asíncrono. Esta mejora quita el ciclo de vida máximo estricto de cinco minutos para los service workers de extensión.

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

Información general

En general, los service worker de extensiones se comportan como trabajadores web, pero, además de los eventos de service worker, también pueden escucharlos. Si bien los eventos normales de service worker extienden la vida útil del service worker, antes del lanzamiento de 110, solo unos pocos eventos de plataforma de extensión mantenían activo un service worker de extensión.

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

  • El service worker no recibió ningún evento durante 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 quita el temporizador de inactividad.
  • Una tarea de larga duración ha tomado más de cinco minutos en completarse y no se han recibido eventos en los últimos treinta segundos.

Los nuevos eventos del service worker recibidos antes de que caduque el temporizador de inactividad o el temporizador de tareas de larga duración restablecerían los temporizadores y prolongaría la vida útil del service worker.

Lamentablemente, este comportamiento no se aplicó a los eventos de extensión. Los eventos de extensión pueden activar un service worker de extensión y mantenerlo activo hasta que finaliza el evento, pero no pueden extender el temporizador de inactividad de treinta segundos. Esto significaba que los service workers de extensión podían finalizarse en cualquier momento después de que se completara el último evento de extensión, incluso si el navegador acababa de enviar un nuevo evento 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 produce si hay eventos pendientes. En otras palabras, si no hay interrupciones inesperadas, los service workers de extensión normalmente permanecerán activos siempre que procesen los eventos de forma activa. Además, las llamadas a las APIs de Chrome específicas de extensiones, 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 solicitud única, 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 keep-alive sólido que cancela ambos temporizadores.

Seguimos trabajando para garantizar que los service workers de extensión se cierren cuando sea posible, sin cerrar el trabajo de larga duración. Los service workers de extensión conscientes de los recursos siempre deben rendir el trabajo cuando sea posible. Además, las extensiones deben prepararse para la finalización inesperada mediante un estado persistente. De esta manera, se brinda protección contra eventos impredecibles, como el cierre forzoso del navegador.

Foto de Paula Guerreiro en Unsplash