拡張機能の Service Worker は、イベントを受信している限り存続できるようになりました。これにより、拡張機能 Service Worker の信頼性は向上しますが、回避すべき問題があります。
Chrome 110(2023 年 2 月 7 日時点のベータ版)以降、拡張機能の Service Worker はイベントを受信する限り存続します。これにより、拡張機能 Service Worker の以前の実装におけるタイミングの問題が修正されました。イベントキューに新しいイベントが追加されたときにタイムアウトが発生したり、非同期処理がタイムアウトになったりする可能性がありました。この改善により、拡張機能 Service Worker の最大 5 分間という厳格な制限がなくなります。
この記事では、これらの動作の変更点について説明します。
背景情報
拡張機能 Service Worker はほとんどの場合、ウェブサービス ワーカーと同様に動作しますが、Service Worker イベントに加えて拡張機能イベントもリッスンできます。通常の Service Worker イベントによって Service Worker の存続期間が延長されますが、110 がリリースされるまでは、拡張機能 Service Worker を存続させる拡張機能プラットフォーム イベントはほとんどありませんでした。
通常、Chromium は次のいずれかの条件が満たされると、Service Worker を終了します。
- Service Worker が 30 秒以上イベントを受信しておらず、未処理の長時間実行タスクはありません。その間に Service Worker がイベントを受信した場合、アイドル タイマーは削除されています。
- 長時間実行タスクの完了に 5 分以上かかり、過去 30 秒間にイベントを受信していません。
アイドル タイマーまたは長時間実行タスクタイマーが期限切れになる前に新しい Service Worker イベントを受信すると、タイマーがリセットされ、Service Worker の存続期間が延長されます。
残念ながら、この動作は拡張機能イベントには当てはまりませんでした。拡張機能のイベントによって拡張機能の Service Worker が起動され、イベントが完了するまで存続できますが、30 秒のアイドル タイマーは延長されませんでした。これは実質的に、ブラウザが拡張機能に新しいイベントをディスパッチした直後であっても、拡張機能の最後のイベントが完了した後はいつでも拡張機能の Service Worker を終了できることを意味します。
変更内容
Chrome 110 では、すべてのイベントでアイドル タイマーがリセットされ、保留中のイベントがある場合にアイドル タイムアウトは発生しません。言い換えれば、予期しない中断がないと仮定した場合、拡張機能の Service Worker は通常、イベントをアクティブに処理している限り存続します。また、拡張機能固有の Chrome API(chrome.storage.local.get()
など)を呼び出すと、アイドル タイムアウトがリセットされます。詳細:
- 非アクティブ状態が 30 秒間続くと、Service Worker は終了します。(イベントを受信するか、拡張機能 API を呼び出すと、このタイマーはリセットされます)。
- 1 つのリクエスト(イベントや API 呼び出しなど)の処理に 5 分以上かかると、Service Worker は終了します。
ネイティブ メッセージングなどの一部の API は、両方のタイマーをキャンセルする強力なキープアライブを提供します。
Google では、長時間実行作業をシャットダウンすることなく、拡張機能 Service Worker を可能な限り終了できるように引き続き取り組んでいます。リソースを意識した拡張 Service Worker は、可能な限り常にスケーリングすべきです。また、拡張機能は状態を保持することで、予期しない終了に備える必要があります。これにより、ユーザーによってブラウザが強制的に閉じられるなどの予測不可能なイベントを防ぐことができます。
写真撮影: Paula Guerreiro(Unsplash より)