Dłuższy czas działania skryptu service worker rozszerzenia

Skrypty service worker rozszerzeń mogą pozostać aktywne, dopóki otrzymują zdarzenia. Zwiększa to niezawodność instancji roboczych obsługujących rozszerzenia, ale jest pewnego rodzaju pułapką, której należy unikać.

Jan Kowalski
Joe Medley

Począwszy od wersji Chrome 110 (w wersji beta od 7 lutego 2023 roku) mechanizmy Service Worker rozszerzeń pozostają aktywne, dopóki otrzymują zdarzenia. Rozwiązuje to problem z czasem we wcześniejszej implementacji mechanizmów Service Worker rozszerzeń. Czasy oczekiwania mogły następować, gdy w kolejce zdarzeń były nowe zdarzenia, i ograniczać limity czasu w celu skrócenia pracy asynchronicznej. To ulepszenie eliminuje maksymalny 5-minutowy czas pracy mechanizmów obsługi rozszerzeń.

Z tego artykułu dowiesz się, jak te zachowania uległy zmianie.

Wprowadzenie

Skrypty service worker rozszerzeń zachowują się przeważnie jak mechanizmy skryptu service worker, ale oprócz zdarzeń service worker mogą również nasłuchiwać zdarzeń rozszerzeń. Chociaż zwykłe zdarzenia service worker wydłużają czas życia skryptu service worker, przed wprowadzeniem wersji 110 tylko kilka zdarzeń związanych z rozszerzeniem zapewniało jego aktywność.

Normalnie Chromium kończy działanie skryptu service worker po spełnieniu jednego z tych warunków:

  • Skrypt service worker nie odebrał zdarzenia przez ponad 30 sekund i nie ma żadnych oczekujących długotrwałych zadań. Jeśli w tym czasie skrypt service worker odebrał zdarzenie, licznik czasu bezczynności został usunięty.
  • Ukończenie długo trwającego zadania zajęło ponad 5 minut, a w ciągu ostatnich 30 sekund nie zarejestrowano żadnych zdarzeń.

Nowe zdarzenia skryptu service worker odebrane przed wygaśnięciem licznika czasu bezczynności lub długotrwałego licznika zadań spowodują zresetowanie liczników i przedłużenie czasu życia skryptu service worker.

Nie dotyczyło to zdarzeń związanych z rozszerzeniami. Zdarzenia związane z rozszerzeniami mogą wybudzać skrypt service worker rozszerzenia i utrzymywać jego aktywność do momentu zakończenia zdarzenia, ale nie mogły wydłużyć 30-sekundowego licznika czasu bezczynności. Oznaczało to, że mechanizmy uruchamiające rozszerzenie mogły zostać zakończone w dowolnym momencie po zakończeniu ostatniego zdarzenia rozszerzenia, nawet jeśli przeglądarka właśnie wysłała do rozszerzenia nowe zdarzenie.

Co się zmieniło?

Od wersji Chrome 110 wszystkie zdarzenia powodują zresetowanie licznika czasu bezczynności, a w przypadku wystąpienia zdarzeń oczekujących limit czasu bezczynności nie zostanie przekroczony. Innymi słowy, zakładając, że nie występują nieoczekiwane przerwy, mechanizmy service worker rozszerzeń zwykle pozostają aktywne, dopóki aktywnie przetwarzają zdarzenia. Dodatkowo wywołania interfejsów API Chrome specyficznych dla rozszerzeń, takich jak chrome.storage.local.get(), powodują zresetowanie limitu czasu bezczynności. Oto najważniejsze kwestie:

  • Skrypt service worker kończy się po 30 sekundach braku aktywności. Odebranie zdarzenia lub wywołanie interfejsu API rozszerzenia resetuje ten licznik czasu.
  • Skrypt service worker kończy się, jeśli przetworzenie pojedynczego żądania, takiego jak zdarzenie lub wywołanie interfejsu API, trwa dłużej niż 5 minut.

Niektóre interfejsy API, takie jak komunikaty natywne, zapewniają silne utrzymanie, które anulują oba te liczniki czasu.

Nadal pracujemy nad tym, aby w miarę możliwości mechanizmy Service Worker związana z rozszerzeniami były wyłączane bez wyłączania długotrwałych zadań. Wymagające zasobów instancje service worker rozszerzeń powinny zawsze korzystać, gdy to możliwe. Dodatkowo rozszerzenia powinny przygotować się na nieoczekiwane zakończenie połączenia przez utrwalenie stanu. Chroni to przed nieprzewidywalnymi zdarzeniami, takimi jak wymuszanie zamknięcia przeglądarki przez użytkownika.

Zdjęcie: Paula Guerreiro, Unsplash