blob: ded3c9d3283ebc72081facfb9358a2df47c6ea08 [file] [log] [blame]
/*
*
* Copyright 2017 RIFT.IO Inc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
import appConfiguration from '../utils/appConfiguration'
let versionKeyPrefix = null;
const localCache = new class {
get(key) {
let valueAsString = localStorage.getItem(key);
return valueAsString ? JSON.parse(valueAsString) : undefined;
}
set(key, val) {
localStorage.setItem(key, typeof val === 'string' ? val : JSON.stringify(val));
}
}();
let objCache = new Map();
const storeCache = new class {
get(key) {
if (objCache[key]) {
objCache[key].timerId && clearTimeout(objCache[key].timerId)
objCache[key].timerId = setTimeout((key) => delete objCache[key], 2000)
return objCache[key].value;
}
const obj = localCache.get(key);
if (obj) {
objCache[key] = {
value: obj,
timerId: setTimeout((key) => delete objCache[key], 2000)
}
return obj;
}
}
set(key, obj) {
setTimeout(localCache.set, 100, key, obj);
objCache[key] = {
value: obj,
timerId: setTimeout((key) => delete objCache[key], 2000)
}
}
init(version) {
versionKeyPrefix = 's-v-' + version;
const currentStoreVersion = localStorage.getItem('store-version');
if (currentStoreVersion !== version) {
let removeItems = [];
for (let i = 0; i < localStorage.length; ++i) {
let key = localStorage.key(i);
if (key.startsWith('s-v-')) {
removeItems.push(key);
}
}
removeItems.forEach((key) => localStorage.removeItem(key));
localStorage.setItem('store-version', version);
}
}
}();
class StoreCache {
constructor(name) {
this.name = 's-v-' + name;
}
get(key) {
return storeCache.get(this.name + key);
}
set(key, obj) {
storeCache.set(this.name + key, obj);
}
init() {
return versionKeyPrefix ? Promise.resolve() : new Promise(
(resolve, reject) => {
appConfiguration.get().then((config) => {
storeCache.init(config.version);
resolve();
})
}
)
}
}
module.exports = StoreCache;