Метод _initStorage

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


Назначение метода _initStorage

Метод _initStorage реализует механизм первичной инициализации экземпляра хранилища. Его основная задача заключается в том, чтобы привести объект storage к рабочему состоянию с учётом:

  • выбранного драйвера (IndexedDB, WebSQL или localStorage);
  • пользовательской конфигурации;
  • текущей среды выполнения (браузер, ограничения API);
  • состояния ранее сохранённых данных.

Фактически _initStorage выступает как точка сборки всей инфраструктуры доступа к данным.


Этапы выполнения инициализации

Проверка состояния экземпляра

Первым шагом выполняется проверка, был ли экземпляр уже инициализирован. Это важно для предотвращения повторной настройки одного и того же storage-инстанса.

Внутренне используется флаг состояния, который позволяет различать:

  • неинициализированный экземпляр;
  • экземпляр в процессе инициализации;
  • полностью готовый экземпляр.

Если инициализация уже завершена, метод возвращает ранее созданный promise или готовое состояние.


Загрузка конфигурации

На следующем этапе происходит объединение конфигурационных параметров:

  • настройки по умолчанию;
  • параметры, переданные через createInstance;
  • глобальная конфигурация библиотеки.

Ключевые параметры, влияющие на _initStorage:

  • driver — предпочтительный тип хранилища;
  • name — имя базы данных или namespace;
  • storeName — имя таблицы/объекта хранения;
  • version — версия схемы (актуально для IndexedDB);
  • size — лимиты хранилища (для WebSQL);
  • description — метаданные базы.

Результатом является финализированный конфигурационный объект, используемый на следующих этапах.


Определение доступных драйверов

Метод _initStorage инициирует проверку доступности всех зарегистрированных драйверов. Обычно список включает:

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

Для каждого драйвера выполняется проверка:

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

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


Выбор драйвера

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

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

  1. Проверка явного драйвера.
  2. Валидация его доступности.
  3. Переход к списку предпочтительных драйверов.
  4. Выбор первого доступного варианта.

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


Инициализация выбранного драйвера

После выбора драйвера выполняется его загрузка и инициализация. На этом этапе:

  • создаётся подключение к хранилищу;
  • открывается или создаётся база данных;
  • подготавливается объект store;
  • устанавливаются внутренние методы доступа (getItem, setItem, removeItem и др.).

Каждый драйвер реализует собственную стратегию инициализации, но интерфейс унифицирован.


Подготовка очереди операций

Одной из ключевых особенностей localForage является асинхронность всех операций. До завершения _initStorage любые вызовы к API не блокируются, а помещаются в очередь.

В рамках метода:

  • создаётся очередь промисов;
  • регистрируются pending-операции;
  • задаётся механизм их последующего выполнения.

Это обеспечивает консистентность при вызовах до полной готовности storage.


Установка состояния ready

После успешного завершения всех этапов экземпляр помечается как готовый.

Внутренне это включает:

  • установку флага ready = true;
  • разрешение promise инициализации;
  • выполнение отложенных операций из очереди.

С этого момента storage считается полностью активным.


Обработка ошибок

Метод _initStorage включает несколько уровней обработки ошибок:

Ошибки недоступности драйвера

Возникают при отсутствии API (например, IndexedDB в старых окружениях). В этом случае происходит переход к следующему драйверу.

Ошибки открытия базы

Могут быть вызваны:

  • ограничениями браузера;
  • повреждённым storage;
  • режимом приватного просмотра.

Ошибки конфигурации

Возникают при некорректных параметрах (например, недопустимое имя store).

При критических сбоях инициализация завершается с reject и соответствующим сообщением.


Роль в жизненном цикле экземпляра

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

  1. Создание экземпляра.
  2. Вызов _initStorage.
  3. Выбор и запуск драйвера.
  4. Переход в состояние ready.
  5. Обработка операций.

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


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

Драйверная архитектура localForage строится вокруг унифицированного интерфейса. _initStorage выполняет роль связующего слоя между ядром библиотеки и конкретной реализацией хранения данных.

Взаимодействие включает:

  • регистрацию драйвера в системе;
  • передачу конфигурации;
  • получение callback-методов;
  • интеграцию с очередью операций.

Это позволяет абстрагировать различия между IndexedDB, WebSQL и localStorage.


Особенности асинхронной инициализации

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

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

  • инициализация выполняется через Promise;
  • операции могут вызываться до завершения setup;
  • гарантируется последовательность выполнения команд;
  • исключается блокировка основного потока.

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


Внутренние зависимости метода

Метод опирается на несколько внутренних компонентов:

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

Совместная работа этих компонентов формирует устойчивую систему инициализации.


Поведение при повторной инициализации

Если _initStorage вызывается повторно:

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

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