Параметр driver: явное указание драйвера

Механизм driver определяет, какой backend используется для хранения данных внутри localForage. Библиотека абстрагирует доступ к различным браузерным хранилищам и предоставляет единый API поверх нескольких технологий:

  • IndexedDB
  • WebSQL (устаревший, но всё ещё поддерживаемый в ряде окружений)
  • localStorage

Параметр driver управляет тем, какой из этих механизмов будет использоваться как основной или единственный.


Роль driver в архитектуре localForage

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

  1. IndexedDB (предпочтительный вариант)
  2. WebSQL (fallback в старых браузерах)
  3. localStorage (самый простой и ограниченный вариант)

driver позволяет:

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

Формы задания driver

Глобальная конфигурация через config

localForage.config({
  driver: localForage.INDEXEDDB
});

или множественный список с приоритетом:

localForage.config({
  driver: [
    localForage.INDEXEDDB,
    localForage.WEBSQL,
    localForage.LOCALSTORAGE
  ]
});

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


Явное назначение через setDriver

localForage.setDriver(localForage.INDEXEDDB);

Метод возвращает Promise и позволяет динамически переключать backend:

localForage.setDriver(localForage.WEBSQL)
  .then(() => {
    // driver установлен
  })
  .catch((err) => {
    // выбранный driver недоступен
  });

Константы driver

В localForage доступны предопределённые идентификаторы:

  • localForage.INDEXEDDB
  • localForage.WEBSQL
  • localForage.LOCALSTORAGE

Каждый из них соответствует конкретной реализации storage API браузера.


Поведение при явном выборе driver

Отключение fallback-логики

При установке одного конкретного driver:

localForage.setDriver(localForage.LOCALSTORAGE);

fallback-поведение отключается. Если выбранный backend недоступен, операция завершается ошибкой.


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

Перед установкой драйвера библиотека выполняет проверку:

  • доступен ли API в текущем окружении
  • разрешено ли использование storage (например, private mode браузера)
  • не превышены ли ограничения безопасности

Если проверка не проходит, Promise отклоняется.


Множественный driver как стратегия устойчивости

Наиболее распространённый сценарий:

localForage.config({
  driver: [
    localForage.INDEXEDDB,
    localForage.WEBSQL,
    localForage.LOCALSTORAGE
  ]
});

Логика работы:

  1. Попытка IndexedDB
  2. При неудаче переход к WebSQL
  3. При неудаче переход к localStorage

Такой подход обеспечивает максимальную совместимость между браузерами и устройствами.


Особенности IndexedDB как default driver

IndexedDB обеспечивает:

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

В localForage именно IndexedDB рассматривается как основной driver для современных браузеров.

Однако поведение может отличаться:

  • Safari иногда ограничивает IndexedDB в приватном режиме
  • мобильные браузеры могут очищать данные агрессивно
  • старые WebView не поддерживают полноценный API

Ограничения WebSQL driver

WebSQL используется как legacy-решение:

  • отсутствует в современных спецификациях
  • поддерживается частично (Chrome-based окружения)
  • имеет SQL-подобный интерфейс внутри реализации, но скрыт от API

При явном выборе:

localForage.setDriver(localForage.WEBSQL);

возможны ошибки в браузерах без поддержки WebSQL.


localStorage driver и его поведение

localStorage — самый простой backend:

  • синхронный API (но обёрнут в async интерфейс localForage)
  • лимит ~5–10MB
  • хранение только строк

При использовании driver:

localForage.setDriver(localForage.LOCALSTORAGE);

все данные сериализуются в строки, что может влиять на производительность при больших объектах.


Сценарии явного выбора driver

1. Предсказуемость окружения

В приложениях с ограниченным стеком (например, WebView):

localForage.setDriver(localForage.LOCALSTORAGE);

Используется гарантированно доступный механизм.


2. Производительные приложения

В приложениях с большими данными:

localForage.setDriver(localForage.INDEXEDDB);

Фиксация IndexedDB исключает fallback на менее производительные варианты.


3. Контроль поведения в enterprise-среде

В корпоративных приложениях:

  • отключается WebSQL из-за непредсказуемости
  • фиксируется IndexedDB или localStorage

Ошибки при работе с driver

Типовые проблемы:

Недоступность API

Error: No available storage method found

Возникает, если ни один driver не подходит.


SecurityError

Часто встречается в Safari Private Mode при IndexedDB.


QuotaExceededError

Возникает при использовании localStorage driver при переполнении лимита.


Динамическое переключение driver

localForage позволяет менять backend во время выполнения:

async function switchToIndexedDB() {
  try {
    await localForage.setDriver(localForage.INDEXEDDB);
  } catch (e) {
    await localForage.setDriver(localForage.LOCALSTORAGE);
  }
}

Такой подход применяется при адаптации к окружению после runtime-диагностики.


Влияние driver на сериализацию данных

Driver напрямую влияет на способ хранения:

  • IndexedDB → нативные объекты (structured clone)
  • WebSQL → строковое представление внутри SQL слоя
  • localStorage → JSON/string serialization

Это отражается на:

  • скорости записи/чтения
  • размере данных
  • совместимости типов (Blob, ArrayBuffer)

Практическая модель выбора driver

Внутренняя логика часто строится по принципу:

  • производительность важнее совместимости → IndexedDB
  • совместимость важнее производительности → fallback chain
  • предсказуемость важнее всего → фиксированный driver

Поведение при повторной конфигурации

Повторный вызов:

localForage.config({
  driver: localForage.LOCALSTORAGE
});

может:

  • переинициализировать storage backend
  • сбросить внутренний state подключения
  • вызвать повторную проверку доступности API

В localForage это считается тяжёлой операцией и обычно выполняется один раз при старте приложения.


Совместимость с окружениями

Driver-логика учитывает:

  • браузеры desktop
  • mobile Safari / Chrome
  • Electron
  • hybrid WebView
  • приватные режимы

Поведение driver становится ключевым фактором стабильности работы storage слоя в разных средах.