Ora i worker del servizio di estensione possono rimanere attivi finché ricevono eventi. Ciò aumenta l'affidabilità dei lavoratori dei servizi di estensione, ma presenta un'insidia che devi evitare.
A partire da Chrome 110 (in versione beta dal 7 febbraio 2023), i worker di servizio delle estensioni rimangono attivi finché ricevono eventi. In questo modo viene corretto un problema di temporizzazione nell'implementazione precedente dei worker di servizio delle estensioni. Era possibile che si verificassero timeout quando nuovi eventi erano nella coda di eventi e che i timeout troncassero il lavoro asincrono. Questo miglioramento rimuove la durata massima obbligatoria di cinque minuti per i worker di servizio di estensione.
Questo articolo descrive in che modo questi comportamenti sono cambiati.
Sfondo
I worker di servizio delle estensioni si comportano in gran parte come i worker di servizio web, ma, oltre agli eventi dei worker di servizio, possono anche ascoltare gli eventi delle estensioni. Sebbene i normali eventi del service worker estendano la sua durata, prima del rilascio della versione 110 solo alcuni eventi della piattaforma di estensione mantenevano attivo un service worker dell'estensione.
In genere, Chromium termina un worker di servizio dopo che è stata soddisfatta una delle seguenti condizioni:
- Il worker di servizio non ha ricevuto un evento da più di 30 secondi e non sono in corso attività di lunga durata in sospeso. Se un worker di servizio ha ricevuto un evento durante questo periodo, il timer inattivo è stato rimosso.
- Il completamento di un'attività a lunga esecuzione ha richiesto più di cinque minuti e non sono stati ricevuti eventi negli ultimi trenta secondi.
I nuovi eventi del servizio worker ricevuti prima della scadenza del timer di inattività o del timer dell'attività a lunga esecuzione reimpostano i timer ed estendono la durata del servizio worker.
Purtroppo, questo comportamento non si applica agli eventi di estensione. Gli eventi di estensione potevano riattivare un worker di servizio dell'estensione e mantenerlo attivo fino al completamento dell'evento, ma non potevano estendere il timer di inattività di 30 secondi. Ciò significava che i worker di servizio dell'estensione potevano essere interrotti in qualsiasi momento dopo il completamento dell'ultimo evento dell'estensione, anche se il browser aveva appena inviato un nuovo evento all'estensione.
Che cosa è cambiato
A partire da Chrome 110, tutti gli eventi reimpostano il timer di inattività e il timeout di inattività non si verifica se sono presenti eventi in attesa. In altre parole, se non si verificano interruzioni impreviste, i worker di servizio delle estensioni rimarranno attivi finché stanno elaborando attivamente gli eventi. Inoltre, le chiamate alle API di Chrome specifiche per le estensioni, come chrome.storage.local.get()
, reimpostano il timeout inattivo. In particolare:
- Il service worker termina dopo 30 secondi di inattività. (la ricezione di un evento o la chiamata a un'API di estensione reimposta questo timer).
- Il worker del servizio viene terminato se l'elaborazione di una singola richiesta, ad esempio un evento o una chiamata API, richiede più di 5 minuti.
Alcune API, come la messaggistica nativa, forniscono un keep-alive efficace che annulla entrambi questi timer.
Stiamo ancora lavorando per garantire che i worker di servizio delle estensioni vengano terminati, se possibile, senza arrestare i lavori di lunga durata. I worker di servizio delle estensioni attenti alle risorse devono sempre cedere la priorità, se possibile. Inoltre, le estensioni devono prepararsi alla terminazione imprevista mantenendo lo stato. In questo modo vengono evitati eventi imprevedibili come la chiusura forzata del browser da parte dell'utente.
Foto di Paula Guerreiro su Unsplash