Метод supports: проверка поддержки драйвера

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

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

  • INDEXEDDB
  • WEBSQL
  • LOCALSTORAGE

Каждый из них имеет собственные ограничения, особенности и уровень поддержки в различных браузерах и окружениях. Метод supports(driverName) выступает точкой ранней проверки совместимости, позволяя определить, доступен ли конкретный механизм до его фактического использования.

Ключевая задача метода — исключить необходимость пробных операций записи/чтения и заменить их детерминированной проверкой возможностей окружения.

Сигнатура и поведение

Метод имеет синхронную сигнатуру:

localforage.supports(driverName)

Возвращаемое значение:

  • true — драйвер поддерживается текущим окружением
  • false — драйвер недоступен или отключён

Аргумент driverName представляет собой строку или константу, соответствующую одному из встроенных драйверов.

Поддерживаемые значения driverName

В стандартной конфигурации localForage используются следующие идентификаторы:

IndexedDB

localforage.supports(localforage.INDEXEDDB)

IndexedDB является основным современным хранилищем в браузерах. Оно поддерживается большинством актуальных браузеров, включая Chrome, Firefox, Edge и Safari (с некоторыми ограничениями в старых версиях).

Особенности проверки:

  • наличие window.indexedDB
  • отсутствие режимов, блокирующих IndexedDB (например, приватные режимы некоторых браузеров)
  • корректная работа транзакционного API

WebSQL

localforage.supports(localforage.WEBSQL)

WebSQL считается устаревшим стандартом, но всё ещё поддерживается в некоторых WebKit-браузерах.

Проверка включает:

  • наличие window.openDatabase
  • возможность создания тестовой базы данных
  • отсутствие блокировки API в среде

Важно учитывать, что WebSQL не поддерживается в Firefox и постепенно удаляется из Chromium-экосистемы.

LocalStorage

localforage.supports(localforage.LOCALSTORAGE)

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

Проверка включает:

  • наличие window.localStorage
  • доступность записи и чтения
  • отсутствие режима приватного браузинга, блокирующего синхронное хранилище
  • отсутствие quota errors при тестовой операции

Внутренняя логика работы

Метод supports не выполняет асинхронных операций и не инициирует реальное создание хранилища. Его реализация основана на feature detection, а не на runtime probing в полном объёме.

Общая логика проверки выглядит следующим образом:

  1. Определяется идентификатор драйвера
  2. Выполняется проверка наличия соответствующего API в window
  3. При необходимости выполняется лёгкая тестовая операция (например, запись/удаление ключа)
  4. Возвращается булево значение

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

Отличие от выбора драйвера

Метод supports не равен выбору драйвера и не влияет на текущую конфигурацию localForage.

Сравнение:

supports

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

setDriver / setDrivers

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

Таким образом, supports используется на этапе принятия решения, а не на этапе применения конфигурации.

Пример использования в логике выбора хранилища

if (localforage.supports(localforage.INDEXEDDB)) {
    localforage.setDriver(localforage.INDEXEDDB);
} else if (localforage.supports(localforage.WEBSQL)) {
    localforage.setDriver(localforage.WEBSQL);
} else {
    localforage.setDriver(localforage.LOCALSTORAGE);
}

Такой подход позволяет выстроить ручную стратегию деградации хранилища.

Поведение в различных окружениях

Браузеры

В браузерной среде supports опирается на реальные API объекта window. Однако поведение может отличаться:

  • Safari в приватном режиме может возвращать false для IndexedDB
  • старые мобильные браузеры могут ограничивать WebSQL
  • расширения безопасности могут блокировать LocalStorage

Node.js

В среде Node.js localForage обычно не функционирует в полном объёме, так как отсутствует браузерное хранилище. В этом случае:

  • supports возвращает false для всех драйверов
  • либо библиотека требует адаптеров/полифилов

WebView и гибридные приложения

В Electron, Cordova или Capacitor поведение зависит от конфигурации WebView. supports может возвращать разные результаты для одной и той же платформы в зависимости от настроек безопасности.

Ограничения метода

Несмотря на простоту, метод имеет ряд ограничений:

1. Возможны ложноположительные результаты

API может существовать, но быть фактически недоступным (например, IndexedDB в ограниченном режиме приватного просмотра).

2. Не учитывает quota ограничения

LocalStorage может быть доступен, но иметь крайне малый объём или быть почти заполненным.

3. Не проверяет стабильность хранения

Метод не гарантирует, что операции записи будут успешными в будущем.

4. Не учитывает runtime ошибки

Некоторые ошибки возникают только при реальных транзакциях и не выявляются на этапе supports.

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

Метод часто используется до вызова:

  • config()
  • setDriver()
  • createInstance()

Типичный сценарий — построение стратегии выбора драйвера до инициализации экземпляра.

При этом важно учитывать, что supports не зависит от config и работает независимо от текущих настроек.

Практические сценарии применения

Предварительная диагностика окружения

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

Адаптация под ограничения корпоративных сред

В корпоративных браузерах часто отключён IndexedDB. Проверка позволяет автоматически переключиться на fallback.

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

IndexedDB может быть предпочтительнее LocalStorage, но требует проверки доступности перед использованием.

Изоляция логики выбора хранилища

Позволяет централизовать стратегию выбора драйвера без разбрасывания try/catch по коду.

Взаимодействие с константами localForage

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

  • localforage.INDEXEDDB
  • localforage.WEBSQL
  • localforage.LOCALSTORAGE

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

Особенности реализации проверки LocalStorage

LocalStorage требует более сложной проверки по сравнению с IndexedDB, поскольку:

  • API может быть доступен, но выбрасывать исключения при записи
  • приватные режимы могут имитировать доступность объекта, но блокировать операции
  • квоты могут быть исчерпаны без явного уведомления

Поэтому supports часто включает попытку записи тестового значения с последующим удалением.

Типичные ошибки использования

Использование supports как гарантии работоспособности

Метод не гарантирует успешную работу драйвера в будущем.

Игнорирование асинхронного контекста setDriver

Частая ошибка — предположение, что проверка supports заменяет необходимость обработки ошибок при setDriver.

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

localforage.supports("INDEXEDDB")

Такой подход менее надёжен и может привести к несовместимости.

Итоговая модель поведения метода

Метод supports следует рассматривать как инструмент раннего фильтра:

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

Его основная ценность заключается в возможности построения предсказуемой стратегии выбора драйвера до начала работы с данными, что особенно важно в средах с фрагментированной поддержкой Web API.