discourse/app/assets/javascripts/discourse/lib/key-value-store.js.es6
2015-10-13 10:52:42 +02:00

78 lines
1.9 KiB
JavaScript

// A simple key value store that uses LocalStorage
let safeLocalStorage;
try {
safeLocalStorage = localStorage;
if (localStorage["disableLocalStorage"] === "true") {
safeLocalStorage = null;
} else {
// makes sure we can write to the local storage
safeLocalStorage["safeLocalStorage"] = true;
}
} catch (e) {
// cookies disabled, we don't care
safeLocalStorage = null;
}
const KeyValueStore = function(ctx) {
this.context = ctx;
};
KeyValueStore.prototype = {
abandonLocal() {
if (!safeLocalStorage) { return; }
let i = safeLocalStorage.length - 1;
while (i >= 0) {
let k = safeLocalStorage.key(i);
if (k.substring(0, this.context.length) === this.context) {
safeLocalStorage.removeItem(k);
}
i--;
}
return true;
},
remove(key) {
if (!safeLocalStorage) { return; }
return safeLocalStorage.removeItem(this.context + key);
},
set(opts) {
if (!safeLocalStorage) { return false; }
safeLocalStorage[this.context + opts.key] = opts.value;
},
setObject(opts) {
this.set({ key: opts.key, value: JSON.stringify(opts.value) });
},
get(key) {
if (!safeLocalStorage) { return null; }
return safeLocalStorage[this.context + key];
},
getInt(key, def) {
if (!def) { def = 0; }
if (!safeLocalStorage) { return def; }
const result = parseInt(this.get(key));
if (!isFinite(result)) { return def; }
return result;
},
getObject(key) {
if (!safeLocalStorage) { return null; }
try { return JSON.parse(safeLocalStorage[this.context + key]); }
catch (e) { }
}
};
// API compatibility with `localStorage`
KeyValueStore.prototype.getItem = KeyValueStore.prototype.get;
KeyValueStore.prototype.removeItem = KeyValueStore.prototype.remove;
KeyValueStore.prototype.setItem = function(key, value) {
this.set({ key, value });
};
export default KeyValueStore;