Метод setDriver: смена драйвера

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

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

  • IndexedDBDriver
  • WebSQLDriver
  • LocalStorageDriver

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

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

Синтаксис метода

localforage.setDriver(driverName);

или с использованием массива драйверов:

localforage.setDriver([
  localforage.INDEXEDDB,
  localforage.WEBSQL,
  localforage.LOCALSTORAGE
]);

Метод возвращает Promise, который резолвится после успешной активации драйвера.

localforage.setDriver(localforage.INDEXEDDB)
  .then(() => {
    // драйвер установлен
  })
  .catch((err) => {
    // ошибка установки драйвера
  });

Доступные драйверы

В localForage определены стандартные константы драйверов:

IndexedDB

localforage.INDEXEDDB

Наиболее современный и производительный механизм хранения. Поддерживает асинхронную работу и большие объёмы данных. Используется как основной драйвер в современных браузерах.

Особенности:

  • высокая скорость операций;
  • поддержка транзакций;
  • масштабируемость;
  • асинхронная модель.

WebSQL

localforage.WEBSQL

Устаревший, но всё ещё встречающийся в некоторых браузерах драйвер. Основан на SQL-подобной модели.

Особенности:

  • синхронно-асинхронное поведение внутри реализации;
  • ограниченная поддержка;
  • deprecated-статус в большинстве браузеров.

LocalStorage

localforage.LOCALSTORAGE

Самый простой и универсальный вариант хранения.

Особенности:

  • синхронный API браузера (обёрнут в асинхронный интерфейс);
  • ограниченный объём (обычно ~5–10 МБ);
  • высокая совместимость.

Поведение setDriver

Метод setDriver не просто переключает активный драйвер, а полностью перестраивает внутренний слой доступа к данным.

Инициализация драйвера

При вызове setDriver выполняется:

  1. Проверка доступности драйвера в текущей среде.
  2. Инициализация внутреннего backend.
  3. Переназначение всех операций get/set/remove.
  4. Сброс текущего состояния подключения.

Если драйвер недоступен, Promise отклоняется с ошибкой.

Приоритет и fallback

При передаче массива драйверов происходит последовательная попытка инициализации:

localforage.setDriver([
  localforage.INDEXEDDB,
  localforage.WEBSQL,
  localforage.LOCALSTORAGE
]);

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

  • попытка IndexedDB;
  • если недоступен — переход к WebSQL;
  • если и он недоступен — LocalStorage.

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

Пример использования setDriver

Принудительное использование IndexedDB

import localforage from "localforage";

localforage.setDriver(localforage.INDEXEDDB)
  .then(() => {
    return localforage.setItem("user", { name: "Alex" });
  })
  .then(() => localforage.getItem("user"))
  .then(value => {
    console.log(value);
  });

В этом сценарии гарантируется использование только IndexedDB без fallback.

Гибкий выбор драйверов

localforage.setDriver([
  localforage.INDEXEDDB,
  localforage.LOCALSTORAGE
])
.then(() => localforage.setItem("token", "abc123"));

Здесь WebSQL исключён, что может быть полезно при отказе от устаревших технологий.

Переключение во время выполнения

async function switchStorage(useFast) {
  if (useFast) {
    await localforage.setDriver(localforage.INDEXEDDB);
  } else {
    await localforage.setDriver(localforage.LOCALSTORAGE);
  }

  await localforage.setItem("mode", useFast);
}

Взаимодействие с конфигурацией

Метод setDriver тесно связан с конфигурацией экземпляра localForage. При смене драйвера:

  • сохраняется namespace (storeName);
  • сохраняются настройки сериализации;
  • пересоздаётся backend подключения;
  • не сохраняются открытые транзакции.

Важно учитывать, что setDriver влияет только на текущий экземпляр. Если используется несколько инстансов localForage, каждый из них управляет драйвером независимо.

Ошибки и исключения

При работе с setDriver возможны следующие типы ошибок:

Драйвер недоступен

Error: Invalid driver name

Возникает при передаче неизвестного идентификатора.

Отсутствие поддержки окружением

Error: No available storage method found

Появляется, если ни один из указанных драйверов не поддерживается.

Ошибка инициализации

Error: Failed to open storage

Связана с ограничениями браузера, приватным режимом или повреждённым состоянием хранилища.

Особенности поведения в разных браузерах

Chrome и Chromium-based

IndexedDB используется по умолчанию. setDriver обычно выполняется мгновенно, без fallback.

Firefox

Полная поддержка IndexedDB и LocalStorage. WebSQL отсутствует.

Safari

IndexedDB может иметь ограничения в приватном режиме. В таких случаях fallback на LocalStorage становится критически важным.

Производственные сценарии

Оптимизация производительности

Использование setDriver позволяет жёстко закрепить IndexedDB для больших приложений:

await localforage.setDriver(localforage.INDEXEDDB);

Это снижает задержки при чтении и записи больших объектов.

Режим деградации

Для старых устройств можно задать fallback:

await localforage.setDriver([
  localforage.LOCALSTORAGE
]);

Тестовые окружения

При юнит-тестировании часто используется LocalStorage как наиболее предсказуемый драйвер:

beforeEach(async () => {
  await localforage.setDriver(localforage.LOCALSTORAGE);
});

Внутренние механизмы переключения

При вызове setDriver происходит пересборка внутреннего core-объекта:

  • уничтожается предыдущий driver instance;
  • создаётся новый driver context;
  • обновляются ссылки на методы API;
  • пересобирается queue операций.

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

Совместимость с другими методами

setDriver работает в связке с:

  • config() — установка параметров экземпляра;
  • setItem() — запись данных;
  • getItem() — чтение данных;
  • clear() — очистка хранилища.

При этом смена драйвера не влияет на API-уровень: интерфейс остаётся неизменным, меняется только реализация.

Поведение при повторном вызове

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

await localforage.setDriver(localforage.INDEXEDDB);
await localforage.setDriver(localforage.LOCALSTORAGE);

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

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

Роль setDriver в архитектуре хранения

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

  • API-уровень (единый интерфейс хранения);
  • реализацию (конкретный драйвер);
  • среду выполнения (браузерные ограничения).

Благодаря этому обеспечивается переносимость кода между различными платформами без изменения бизнес-логики.