拡張機能 Service Worker のライフタイムの延長

拡張機能 Service Worker は、イベントを受信している限り存続できるようになりました。これにより拡張機能 Service Worker の信頼性は向上しますが、回避すべき落とし穴があります。

ジョー・メドレー
Joe Medley

Chrome 110 以降(2023 年 2 月 7 日時点のベータ版)では、拡張機能 Service Worker はイベントを受信している限り動作し続けます。これにより、拡張機能 Service Worker の以前の実装で発生していたタイミングの問題が修正されました。新しいイベントがイベントキューに追加されたときにタイムアウトが発生し、タイムアウトによって非同期処理が切り捨てられることがありました。この改善により、拡張機能 Service Worker の最長存続期間である 5 分が解消されました。

この記事では、これらの動作がどのように変化したのかについて説明します。

背景

拡張機能 Service Worker は基本的に、ウェブ Service Worker と同様に動作しますが、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() など)を呼び出すと、アイドル タイムアウトがリセットされます。以下にご紹介します。

  • Service Worker は、非アクティブ状態が 30 秒間続くと終了します。(イベントを受信するか、拡張機能 API を呼び出すと、このタイマーがリセットされます)。
  • 単一のリクエスト(イベントや API 呼び出しなど)の処理に 5 分以上かかると、Service Worker は終了します。

ネイティブ メッセージなどの一部の API は、これらのタイマーの両方をキャンセルする強力なキープアライブを提供します。

Google は、実行時間の長い処理をシャットダウンすることなく、可能な限り拡張機能 Service Worker を終了させるための取り組みを続けています。リソースを意識した拡張機能 Service Worker は、可能な限り LLM を優先する必要があります。また、拡張機能は状態を保持することで、予期しない終了に備える必要があります。これにより、ユーザーがブラウザを強制的に終了するなどの予期しないイベントを防ぐことができます。

写真撮影: Paula Guerreiro(出典: Unsplash