const config = require('game/config'); /** * Local storage wrapper. * No need to create instance, an instance is exported as default. * * @class Storage */ class Storage { /** * @constructor * @param {object} config Settings from `game/config`. */ constructor(config) { /** * Namespace to save data to. * @type {string} */ this.id = config.id; /** * Is local storage supported? * @type {boolean} */ this.supported = this._isSupported(); } /** * Set value to local storage. * @memberof Storage# * @method set * @param {string} key Key of the property * @param {*} value Value to set */ set(key, value) { if (!this.supported) { return; } localStorage.setItem(this.id + '.' + key, this._encode(value)); } /** * Get key from local storage. * @memberof Storage# * @method get * @param {string} key Key of the property * @param {*} [defaultValue] Default value if no value is found * @return {*} value Value for the key */ get(key, defaultValue) { let raw = localStorage.getItem(this.id + '.' + key); if (raw === null) {return defaultValue;} try { return this._decode(raw); } catch (e) { return raw; } } /** * Check if a key is in local storage. * @memberof Storage# * @method has * @param {string} key Key to find * @return {boolean} Whether a property with this key exists */ has(key) { return localStorage.getItem(this.id + '.' + key) !== null; } /** * Remove key from local storage. * @memberof Storage# * @method remove * @param {string} key Key to remove */ remove(key) { localStorage.removeItem(this.id + '.' + key); } /** * Reset local storage. This removes ALL keys. * @memberof Storage# * @method reset */ reset() { let i, key; for (i = localStorage.length - 1; i >= 0; i--) { key = localStorage.key(i); if (key.indexOf(this.id + '.') !== -1) {localStorage.removeItem(key);} } } /** * @memberof Storage# * @method _encode * @private * @param {*} val Value to encoe * @return {String} Encoded string */ _encode(val) { return JSON.stringify(val); } /** * @memberof Storage# * @method _decode * @private * @param {String} str String to decode * @return {Object} Decoded object */ _decode(str) { return JSON.parse(str); } /** * @memberof Storage# * @method _isSupported * @private * @return {Boolean} Whether `localStorage` is supported by the browser */ _isSupported() { if (typeof localStorage !== 'object') {return false;} try { localStorage.setItem('localStorage', 1); localStorage.removeItem('localStorage'); } catch (e) { return false; } return true; } } module.exports = new Storage(Object.assign({ id: 'lpanda-debug', }, config.storage));