Внутренняя модель хранения в localForage построена вокруг абстракции
драйверов. Каждый драйвер представляет собой независимую реализацию API
хранения данных, унифицированную общим интерфейсом:
getItem, setItem, removeItem,
clear, length, key,
keys, iterate. На уровне библиотеки драйверы
выступают взаимозаменяемыми слоями, а выбор конкретного механизма
хранения (IndexedDB, WebSQL, localStorage или кастомная реализация)
осуществляется динамически.
Метод defineDriver является точкой расширения этой
архитектуры. Он позволяет зарегистрировать пользовательский драйвер и
интегрировать его в систему выбора backend-хранилища. После регистрации
кастомный драйвер становится равноправным участником механизма
инициализации экземпляра localForage.
localforage.defineDriver(driverObject)
Возвращаемое значение — Promise, который резолвится
после успешной регистрации драйвера или отклоняется при ошибке
валидации.
Перед регистрацией драйвер обязан соответствовать контракту, определённому localForage. Базовая структура включает:
driver — уникальный идентификатор драйвераПример минимальной структуры:
const CustomDriver = {
_driver: 'customDriver',
_initStorage: function(options) {},
getItem: function(key) {},
setItem: function(key, value) {},
removeItem: function(key) {},
clear: function() {},
length: function() {},
key: function(n) {},
keys: function() {},
iterate: function(iteratorCallback) {}
};
_driverПоле _driver является идентификатором, под которым
драйвер регистрируется в системе. Оно должно быть:
Внутренняя логика localForage использует это значение для
сопоставления предпочтений (setDriver) и фактической
реализации.
defineDriverРегистрация проходит несколько этапов:
localForage проверяет:
_driverПри нарушении контрактных требований Promise отклоняется.
После проверки методы драйвера оборачиваются внутренними адаптерами localForage:
Драйвер помещается во внутренний реестр:
setDriverdefineDriver всегда возвращает Promise, поскольку
регистрация может включать:
Пример использования:
localforage.defineDriver(CustomDriver)
.then(() => {
console.log('Драйвер зарегистрирован');
})
.catch((err) => {
console.error('Ошибка регистрации драйвера', err);
});
setDriverПосле регистрации драйвер не используется автоматически. Он становится доступным, но должен быть явно активирован:
localforage.defineDriver(CustomDriver)
.then(() => localforage.setDriver('customDriver'))
.then(() => localforage.setItem('key', 'value'));
Механизм выбора драйвера работает по приоритету:
Кастомный драйвер участвует в этом процессе наравне с встроенными.
_initStorageОдним из ключевых требований к кастомному драйверу является наличие
метода _initStorage. Он вызывается при инициализации
экземпляра и получает конфигурацию:
_initStorage: function(options) {
this._config = options;
return Promise.resolve();
}
Внутри него выполняются:
Ошибка в _initStorage приводит к отклонению
инициализации драйвера.
getItem(key)null, если ключ
отсутствуетsetItem(key, value)removeItem(key)void или undefinedclear()length()key(n)keys()iterate(callback)localForage предполагает, что любой драйвер:
Нарушение этих правил приводит к непредсказуемому поведению при переключении драйверов.
Ошибки, возникающие при defineDriver, делятся на
категории:
_driver_driver с уже зарегистрированным
драйвером_initStorageПовторный вызов defineDriver с тем же объектом:
Рекомендуемая практика — регистрировать драйвер один раз на уровне приложения.
Кастомные драйверы применяются в случаях:
После регистрации драйвер становится глобально доступным для всех экземпляров localForage в рамках одного контекста выполнения.
Это означает:
createInstance, а не через
defineDriverПри использовании нескольких экземпляров:
const storeA = localforage.createInstance({ name: 'A' });
const storeB = localforage.createInstance({ name: 'B' });
defineDriver регистрирует драйвер на уровне глобального
реестра, после чего оба экземпляра могут использовать его через
setDriver.
_driver после регистрацииПри вызове setDriver localForage формирует цепочку
доступных драйверов. Кастомный драйвер включается в неё только если:
defineDriver_initStorageЕсли любой из этих этапов не пройден, он исключается из цепочки без влияния на остальные драйверы.