mirror of
https://github.com/discourse/discourse.git
synced 2025-02-11 23:24:16 +08:00
78 lines
1.9 KiB
JavaScript
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;
|