Background service worker расширения может завершаться после периода бездействия — это штатная модель, а не сбой. Если задача хранится только в переменной, таймере или незавершенном callback, после остановки worker расширение забывает состояние и не выполняет действие.

Не пытайтесь искусственно держать worker живым бесконечными ping. Надежное расширение сохраняет состояние, запускается от поддерживаемого события и может продолжить работу после нового старта.

Найдите зависимость от времени жизни процесса

Повторите задачу после простоя, перезапуска браузера и обновления расширения.

  • setTimeout работает при открытом DevTools и пропадает без него.
  • Очередь хранится в глобальном массиве и очищается.
  • Listener начинает async-операцию, но событие завершается раньше.
  • После обновления расширение теряет запланированное действие.

Почему возникает проблема

Service worker является событийным и не гарантирует постоянный процесс.

  • Долгая задача запущена из обычного таймера.
  • Состояние не сохранено в storage или IndexedDB.
  • Listener не возвращает promise там, где API его поддерживает.
  • Alarm не создан либо имеет неверное имя и расписание.
  • После пробуждения код не восстанавливает незавершенные операции.

Пошаговая диагностика

Журналируйте ID задачи и события запуска, не сохраняя содержимое страниц пользователя.

  1. Проверьте активные alarms и зарегистрированные listeners.
  2. Остановите worker вручную и вызовите ожидаемое событие.
  3. Сравните состояние storage до и после перезапуска.
  4. Проверьте rejected promises и lastError API.
  5. Повторите обновление версии расширения с незавершенной задачей.

Сделайте задачу возобновляемой

Каждый этап должен фиксироваться так, чтобы новый экземпляр worker понял, что делать дальше.

  • Задача хранит ID, статус, попытку и время следующего запуска.
  • Alarm только будит worker, а данные берутся из storage.
  • Повтор этапа идемпотентен.
  • Большая работа разбивается на короткие контролируемые шаги.

Как исправить проблему

Перенесите фоновую логику на события и постоянное хранилище.

  1. Замените длинные таймеры на chrome.alarms.
  2. Сохраняйте очередь и checkpoint до сетевой операции.
  3. Корректно возвращайте promise или удерживайте канал поддерживаемым способом.
  4. Обрабатывайте startup, installed и alarm события.
  5. Добавьте retry с ограничением и защитой от дублей.

Как проверить результат

  • Задача выполняется после принудительной остановки worker.
  • Перезапуск браузера не теряет очередь.
  • Повтор события не запускает действие дважды.
  • DevTools не влияет на успешность сценария.

Типичные ошибки

  • Держать процесс ping-сообщениями.
  • Хранить очередь только в global variable.
  • Использовать setInterval как надежный scheduler.
  • Игнорировать chrome.runtime.lastError.

Как предотвратить повторение

  • Проектируйте background как stateless consumer.
  • Добавьте тест остановки worker.
  • Версионируйте данные storage при обновлении.
  • Ограничивайте permissions расширения.

Когда нужна помощь

Если service worker расширения засыпает и теряет работу, я переработаю фоновый сценарий на события, alarms и checkpoints, добавлю восстановление и защиту от повторного выполнения.