Background service worker расширения может завершаться после периода бездействия — это штатная модель, а не сбой. Если задача хранится только в переменной, таймере или незавершенном callback, после остановки worker расширение забывает состояние и не выполняет действие.
Не пытайтесь искусственно держать worker живым бесконечными ping. Надежное расширение сохраняет состояние, запускается от поддерживаемого события и может продолжить работу после нового старта.
Найдите зависимость от времени жизни процесса
Повторите задачу после простоя, перезапуска браузера и обновления расширения.
- setTimeout работает при открытом DevTools и пропадает без него.
- Очередь хранится в глобальном массиве и очищается.
- Listener начинает async-операцию, но событие завершается раньше.
- После обновления расширение теряет запланированное действие.
Почему возникает проблема
Service worker является событийным и не гарантирует постоянный процесс.
- Долгая задача запущена из обычного таймера.
- Состояние не сохранено в storage или IndexedDB.
- Listener не возвращает promise там, где API его поддерживает.
- Alarm не создан либо имеет неверное имя и расписание.
- После пробуждения код не восстанавливает незавершенные операции.
Пошаговая диагностика
Журналируйте ID задачи и события запуска, не сохраняя содержимое страниц пользователя.
- Проверьте активные alarms и зарегистрированные listeners.
- Остановите worker вручную и вызовите ожидаемое событие.
- Сравните состояние storage до и после перезапуска.
- Проверьте rejected promises и lastError API.
- Повторите обновление версии расширения с незавершенной задачей.
Сделайте задачу возобновляемой
Каждый этап должен фиксироваться так, чтобы новый экземпляр worker понял, что делать дальше.
- Задача хранит ID, статус, попытку и время следующего запуска.
- Alarm только будит worker, а данные берутся из storage.
- Повтор этапа идемпотентен.
- Большая работа разбивается на короткие контролируемые шаги.
Как исправить проблему
Перенесите фоновую логику на события и постоянное хранилище.
- Замените длинные таймеры на chrome.alarms.
- Сохраняйте очередь и checkpoint до сетевой операции.
- Корректно возвращайте promise или удерживайте канал поддерживаемым способом.
- Обрабатывайте startup, installed и alarm события.
- Добавьте retry с ограничением и защитой от дублей.
Как проверить результат
- Задача выполняется после принудительной остановки worker.
- Перезапуск браузера не теряет очередь.
- Повтор события не запускает действие дважды.
- DevTools не влияет на успешность сценария.
Типичные ошибки
- Держать процесс ping-сообщениями.
- Хранить очередь только в global variable.
- Использовать setInterval как надежный scheduler.
- Игнорировать chrome.runtime.lastError.
Как предотвратить повторение
- Проектируйте background как stateless consumer.
- Добавьте тест остановки worker.
- Версионируйте данные storage при обновлении.
- Ограничивайте permissions расширения.
Когда нужна помощь
Если service worker расширения засыпает и теряет работу, я переработаю фоновый сценарий на события, alarms и checkpoints, добавлю восстановление и защиту от повторного выполнения.