Pracownicy obsługi rozszerzenia mogą teraz pozostawać aktywni tak długo, jak długo otrzymują zdarzenia. Zwiększa to niezawodność usług rozszerzeń, ale wiąże się z jednym pułapką, której należy unikać.
Od Chrome 110 (w wersji beta od 7 lutego 2023 r.) pracownicy usług rozszerzeń pozostają aktywni tak długo, jak długo otrzymują zdarzenia. Rozwiązano problem z synchronizacją w poprzednim wdrożeniu rozszerzeń service worker. W przypadku, gdy w kole zdarzeń znajdowały się nowe zdarzenia, mogły występować limity czasu, które mogły prowadzić do przerwania pracy asynchronicznej. Ta poprawka usuwa maksymalny czas trwania 5 minut dla instancji roboczych usługi rozszerzenia.
Z tego artykułu dowiesz się, jak się one zmieniły.
Tło
Rozszerzenia usługi pracują głównie jak pracownicy usługi internetowej, ale oprócz wydarzeń usługi mogą też odbierać zdarzenia rozszerzenia. Chociaż zwykłe zdarzenia usługi rozszerzenia przedłużają jej czas działania, przed wydaniem wersji 110 tylko kilka zdarzeń platformy rozszerzenia powodowało, że rozszerzenie usługi działało nadal.
Zazwyczaj Chromium kończy działanie usługi roboczej po spełnieniu jednego z tych warunków:
- Usługa nie otrzymała zdarzenia od ponad 30 sekund i nie ma żadnych długotrwałych zadań w toku. Jeśli w tym czasie usługa otrzymała zdarzenie, minutnik nieaktywności został usunięty.
- Długotrwałe zadanie zajęło ponad 5 minut, a w ciągu ostatnich 30 sekund nie odebrano żadnych zdarzeń.
Nowe zdarzenia usługi workera otrzymane przed upływem czasu bezczynności lub czasu trwania długotrwałego zadania zresetują liczniki i przedłużą czas działania usługi workera.
Niestety nie dotyczyło to zdarzeń rozszerzeń. Wydarzenia rozszerzenia mogą aktywować rozszerzenie service worker i utrzymywać je do czasu zakończenia zdarzenia, ale nie mogą wydłużać 30-sekundowego licznika czasu bezczynności. Oznacza to, że po zakończeniu ostatniego zdarzenia rozszerzenia można było zakończyć procesy obsługi rozszerzenia w dowolnym momencie, nawet jeśli przeglądarka właśnie wysłała nowe zdarzenie do rozszerzenia.
Co się zmieniło
Od wersji 110 Chrome wszystkie zdarzenia resetują licznik czasu bezczynności, a czas oczekiwania na bezczynność nie nastąpi, jeśli są oczekujące zdarzenia. Innymi słowy, o ile nie wystąpią nieoczekiwane przerwy, pracownicy usługi rozszerzenia będą zwykle aktywni tak długo, jak będą aktywnie przetwarzać zdarzenia. Dodatkowo wywołania interfejsów API Chrome związanych z rozszerzeniem, takich jak chrome.storage.local.get()
, zresetują czas bezczynności. Oto najważniejsze kwestie:
- Pracownik usługi kończy działanie po 30 sekundach braku aktywności. (odbieranie zdarzenia lub wywoływanie interfejsu API rozszerzenia powoduje zresetowanie tego licznika).
- Usługa kończy się, jeśli przetworzenie pojedynczego żądania, np. zdarzenia lub wywołania interfejsu API, zajmuje więcej niż 5 minut.
Niektóre interfejsy API, takie jak natywne przesyłanie wiadomości, zapewniają silne utrzymywanie połączenia, które anuluje oba te liczniki.
Nadal pracujemy nad tym, aby w miarę możliwości kończyć procesy rozszerzeń bez zamykania długotrwałych procesów. Pracownicy obsługi rozszerzeń, którzy świadomie gospodarują zasobami, powinni zawsze ustępować, gdy jest to możliwe. Dodatkowo rozszerzenia powinny być przygotowane na nieoczekiwane zakończenie działania, zachowując stan. Zapewnia to ochronę przed nieprzewidzianymi zdarzeniami, takimi jak przymusowe zamknięcie przeglądarki przez użytkownika.
Zdjęcie: Paula Guerreiro z Unsplash