I service worker di estensione ora possono rimanere in servizio finché ricevono eventi. Questo aumenta l'affidabilità dei worker dei servizi di estensione, ma presenta un'insidia da evitare.
A partire da Chrome 110 (in versione beta a partire dal 7 febbraio 2023), i service worker di estensione rimangono attivi finché ricevono eventi. Questo corregge un problema di tempistica nella precedente implementazione dei service worker delle estensioni. I timeout potevano verificarsi quando nella coda degli eventi erano presenti nuovi eventi e i timeout potevano troncare il lavoro asincrono. Questo miglioramento rimuove la durata massima definitiva di cinque minuti per i worker di servizio delle estensioni.
Questo articolo descrive come sono cambiati questi comportamenti.
Contesto
I service worker di estensione si comportano per lo più come i worker di servizi web, ma oltre agli eventi dei service worker, i Service worker possono anche ascoltare gli eventi delle estensioni. Mentre i normali eventi del service worker estendono la durata del service worker, prima del rilascio della versione 110 solo alcuni eventi della piattaforma di estensione mantenevano attivo un service worker di estensione.
Generalmente, Chromium termina un service worker dopo che si verifica una delle seguenti condizioni:
- Il service worker non ha ricevuto un evento per più di 30 secondi e non sono presenti attività a lunga esecuzione in sospeso in corso. Se un service worker ha ricevuto un evento durante questo periodo di tempo, il timer di inattività è 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 service worker ricevuti prima della scadenza del timer di inattività o del timer dell'attività a lunga esecuzione reimposteranno i timer e prolungheranno la durata del service worker.
Purtroppo, questo comportamento non si applica agli eventi di estensioni. Gli eventi delle estensioni potrebbero riattivare un service worker di estensione e mantenerlo attivo fino al completamento dell'evento, ma non è stato possibile estendere il timer di inattività di trenta secondi. In questo modo, i service worker delle estensioni potevano essere chiusi 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 per inattività non verrà applicato in caso di eventi in attesa. In altre parole, supponendo che non ci siano interruzioni impreviste, i worker del servizio di estensione ora in genere rimangono attivi finché elaborano attivamente gli eventi. Inoltre, le chiamate ad API di Chrome specifiche delle estensioni, come chrome.storage.local.get()
, reimposteranno il timeout per inattività. Nello specifico:
- Il service worker termina dopo 30 secondi di inattività. La ricezione di un evento o la chiamata di un'API di un'estensione reimposta questo timer.
- Il service worker termina 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 forte keep-alive che annulla entrambi i timer.
Stiamo ancora lavorando per garantire che i service worker di estensione vengano chiusi quando possibile, senza arrestare il lavoro a lunga esecuzione. I worker di servizio delle estensioni basati sulle risorse dovrebbero sempre restituire, se possibile. Inoltre, le estensioni devono prepararsi alla terminazione imprevista mantenendo lo stato. In questo modo si evitano eventi imprevedibili, come la chiusura forzata del browser da parte dell'utente.
Foto di Paula Guerreiro su Unsplash