Внутренняя логика библиотеки основана на последовательной проверке доступных механизмов хранения и выборе наиболее приоритетного из них. Основная цель такого подхода — обеспечить максимальную производительность, стабильность и совместимость между браузерами без участия прикладного кода.
При инициализации создаётся список потенциальных драйверов. Каждый из них представляет собой отдельный адаптер к конкретному механизму хранения:
Каждый драйвер содержит набор характеристик:
Процесс выбора начинается с проверки доступности API в глобальном контексте браузера. Однако наличие API не означает его пригодность: драйвер должен пройти дополнительную валидацию через тестовую запись и чтение.
Порядок выбора определяется не случайным образом, а отражает баланс между производительностью и современностью технологий.
Первым кандидатом обычно выступает IndexedDB. Причины приоритета:
Если IndexedDB недоступен или работает нестабильно, происходит переход к следующему уровню.
WebSQL рассматривается как промежуточный вариант. Несмотря на де-факто устаревание стандарта, он всё ещё присутствует в некоторых WebView и старых версиях браузеров. Его особенности:
При отсутствии WebSQL используется localStorage как последний fallback-вариант. Его характеристики существенно отличаются:
Такой порядок отражает компромисс: от наиболее современного и масштабируемого к максимально совместимому, но ограниченному варианту.
Каждый драйвер проходит проверку на корректность работы. Она включает несколько этапов:
Если хотя бы один этап завершается ошибкой, драйвер считается неподходящим и исключается из цепочки выбора.
Особое внимание уделяется асинхронным ошибкам IndexedDB, которые могут возникать не сразу, а в процессе выполнения транзакций. Поэтому проверка выполняется с учётом отложенных исключений.
Хотя библиотека использует предопределённую стратегию, порядок выбора может быть изменён через явное указание предпочтений. Это реализуется через конфигурацию драйверов, где задаётся массив приоритетов.
Если разработчик задаёт собственный порядок, он полностью заменяет стандартный алгоритм. Например, можно принудительно установить localStorage как основной механизм, даже если IndexedDB доступен.
Такой подход используется в специфических сценариях:
При этом библиотека не запрещает использование менее эффективных драйверов, но предупреждает о возможных ограничениях производительности.
Выбор драйвера напрямую влияет на модель выполнения операций.
IndexedDB и WebSQL реализуют асинхронное поведение. Это означает:
localStorage, напротив, работает синхронно:
Приоритет выбора драйвера фактически является выбором модели выполнения всего слоя хранения данных. Поэтому библиотека стремится автоматически избегать синхронных механизмов, если доступны асинхронные альтернативы.
Существуют браузеры, где API формально присутствует, но работает с ограничениями. Это может выражаться в следующих сценариях:
В таких случаях драйвер может быть технически “обнаружен”, но не проходит тестовую проверку. Это приводит к автоматическому понижению приоритета и переходу к следующему варианту.
Логика выбора формирует цепочку fallback-уровней. Она функционирует как последовательный обход:
IndexedDB → WebSQL → localStorage
Каждый уровень рассматривается только при неудаче предыдущего. При этом процесс строго детерминирован: однажды выбранный драйвер сохраняется в рамках экземпляра хранилища и не меняется во время выполнения приложения.
Это важно для предотвращения ситуации, при которой данные распределяются между несколькими механизмами хранения в одном приложении.
Создание отдельного экземпляра хранилища приводит к независимому процессу определения драйвера. Каждый экземпляр:
Таким образом, разные части приложения могут использовать разные стратегии хранения, не влияя друг на друга. Это особенно важно при модульной архитектуре, где различные подсистемы предъявляют разные требования к производительности и объёму данных.
В некоторых браузерах приватный режим накладывает ограничения на IndexedDB и WebSQL. В таких случаях:
Алгоритм приоритета учитывает эти сценарии через тестовую запись. Если проверка завершается неуспешно, происходит переход к localStorage, несмотря на его ограничения.
После успешного выбора драйвера дальнейшая работа происходит исключительно через него. Повторная переоценка окружения не выполняется, даже если состояние браузера изменяется.
Это обеспечивает:
Изменение драйвера возможно только через явный вызов переинициализации экземпляра.
Хотя выбор драйвера не зависит напрямую от формата данных, косвенное влияние существует. IndexedDB способен хранить сложные структуры без преобразования в строку, тогда как localStorage требует сериализации.
Это означает, что при использовании localStorage накладываются дополнительные расходы:
Эти ограничения учитываются в стратегии приоритета, поскольку напрямую влияют на производительность приложения.
В крайне редких случаях ни один механизм хранения не проходит проверку. Это может происходить в:
В такой ситуации инициализация считается неуспешной, и любые операции записи или чтения становятся невозможными. Библиотека при этом не выполняет автоматического восстановления окружения, так как отсутствует альтернативный канал хранения.
Процесс выбора драйвера представляет собой последовательную систему фильтрации, основанную на трёх ключевых принципах:
Каждый этап отбора снижает приоритет менее надёжных или менее функциональных механизмов, оставляя наиболее подходящий вариант для конкретного браузера и его состояния.