Очистка данных браузером: условия и сценарии

localForage опирается на возможности браузерных механизмов хранения данных, таких как IndexedDB, WebSQL и localStorage, но не контролирует жизненный цикл этих данных. Очистка информации может происходить как по явному действию пользователя, так и автоматически — в результате политики браузера, ограничений устройства или системной оптимизации. Это создаёт важный класс сценариев, в которых данные исчезают вне контроля приложения и требуют отдельной архитектурной обработки.

В основе клиентского хранения лежит принцип: браузер владеет данными, приложение лишь использует предоставленное хранилище. localForage абстрагирует различия между движками хранения, но не гарантирует постоянство записей.

Каждый драйвер имеет собственные особенности:

  • IndexedDB: устойчивое хранилище с асинхронной моделью, но подвержено эвикции
  • localStorage: синхронное, ограниченное по объёму, чаще очищается вручную
  • WebSQL: устаревший механизм, поведение зависит от реализации браузера

В результате слой localForage выступает как адаптер, а не как гарантирующий persistence механизм.

Когда данные очищаются автоматически

Явная очистка пользователем

Самый предсказуемый сценарий — удаление данных через интерфейс браузера:

  • очистка cookies и site data
  • удаление данных конкретного сайта
  • использование режимов приватности с последующим завершением сессии

В таких случаях удаляются все хранилища origin, включая IndexedDB базы, которые использует localForage. Поведение является атомарным: восстановление невозможно на уровне клиента.

Очистка при нехватке места

Современные браузеры применяют политику storage eviction. При достижении лимитов дискового пространства происходит выборочное удаление данных.

Типичные условия:

  • превышение квоты IndexedDB
  • длительное неиспользование сайта
  • низкий приоритет origin (например, отсутствие установки PWA)
  • активная фоновая очистка системы

В Chrome и Chromium-подобных браузерах eviction может затрагивать IndexedDB без предварительного уведомления приложения.

Режим приватного просмотра

В приватных сессиях данные:

  • сохраняются только в памяти процесса браузера
  • удаляются при закрытии вкладки или окна

localForage в этом случае функционирует корректно, но слой хранения физически не обеспечивает долговечность.

Мобильные браузеры и системная очистка

На мобильных устройствах поведение более агрессивное:

  • операционная система может очищать кэш приложений
  • браузер может удалять данные неактивных сайтов
  • ограничение фонового хранения для экономии памяти

Особенно выражено в Safari на iOS, где действует политика Intelligent Tracking Prevention, влияющая на срок жизни данных.

Ограничения приватности и анти-трекинг механизмы

Современные браузеры внедряют политики, ограничивающие долговременное хранение:

  • ограничение срока жизни данных без взаимодействия
  • изоляция storage partitioning
  • блокировка third-party storage

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

Поведение localForage при потере данных

localForage не получает событий «данные удалены извне». С точки зрения API:

  • запросы чтения возвращают null или undefined
  • ошибки возникают только при недоступности драйвера
  • отсутствие ключа не отличимо от удаления

Это ключевой аспект: удаление данных невозможно отличить от их первичного отсутствия.

Пример поведения:

const value = await localforage.getItem('session-cache');
// value === null может означать:
// 1. данные никогда не записывались
// 2. данные были удалены браузером
// 3. данные были очищены вручную

Сценарии, приводящие к неожиданной потере состояния

1. Кэш приложения как единственный источник истины

Использование localForage как единственного хранилища состояния приводит к уязвимости к очистке браузером. Особенно критично для:

  • корзин покупок
  • черновиков документов
  • офлайн-очередей действий

2. Обновление браузера или профиля

При обновлении браузера или переносе профиля:

  • IndexedDB может быть мигрирован частично
  • старые структуры базы могут сбрасываться
  • namespace origin может изменяться

3. Очистка расширениями и корпоративными политиками

Политики управления устройствами (MDM) могут:

  • периодически очищать storage
  • ограничивать размер IndexedDB
  • запрещать persistent storage

Стратегии обнаружения очистки

Поскольку прямого события удаления нет, применяются косвенные механизмы:

Проверка целостности ключей

const meta = await localforage.getItem('meta');

if (!meta) {
  // возможен сценарий первого запуска или очистки
}

Использование контрольных маркеров

Хранение служебных значений:

  • версия схемы данных
  • timestamp последней синхронизации
  • checksum состояния
await localforage.setItem('meta', {
  version: 3,
  lastSync: Date.now()
});

Проверка «пакетной» целостности

При наличии набора ключей:

  • выборочная проверка нескольких записей
  • обнаружение частичной потери состояния

Сценарии восстановления состояния

Восстановление из удалённого источника

Наиболее надёжная модель:

  • localForage используется как кэш
  • сервер хранит авторитетную копию
  • при потере данных выполняется повторная загрузка

Lazy rehydration

Данные восстанавливаются по мере обращения:

  • отсутствующий ключ трактуется как cache miss
  • инициируется запрос к backend
  • результат повторно сохраняется

Идемпотентная запись

Повторная запись данных должна быть безопасной:

  • отсутствие зависимости от состояния storage
  • перезапись без конфликтов
  • версия данных определяет актуальность

Поведение при изменении драйвера

localForage может переключать драйверы в зависимости от поддержки браузера. При этом:

  • данные одного драйвера не видны другому
  • fallback может выглядеть как «потеря данных»
  • миграция не выполняется автоматически

Это создаёт сценарий псевдо-очистки, когда данные существуют, но недоступны через текущий backend.

Проектирование устойчивого слоя хранения

Устойчивость к очистке браузером достигается не предотвращением удаления, а архитектурной изоляцией риска.

Ключевые свойства устойчивой модели:

  • localForage рассматривается как кэш, а не источник истины
  • критические данные дублируются на сервере
  • наличие версии схемы хранения
  • восстановление состояния через детерминированную загрузку
  • обработка null как нормального состояния, а не ошибки

Особое значение имеет принцип: отсутствие данных в storage не интерпретируется как ошибка состояния приложения, а трактуется как сигнал к восстановлению.

В системах с офлайн-режимом дополнительно вводится журнал операций:

  • действия записываются в очередь
  • очередь синхронизируется при восстановлении соединения
  • потеря storage приводит к повторному построению очереди из серверного состояния

Поведение при частичной очистке

Браузеры не всегда удаляют storage полностью. Возможны состояния:

  • удаление части IndexedDB баз
  • сохранение localStorage при очистке IndexedDB
  • потеря только больших объектов (eviction threshold)

Это создаёт эффект «фрагментированного состояния», при котором:

  • часть ключей доступна
  • часть возвращает null
  • структура данных становится неполной

Такие сценарии требуют проверки согласованности данных при каждом восстановлении сессии.