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