Storage public but protected props
by JakobJingleheimer
HTML
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.2/lodash.min.js"></script>
Babel + JSX
const helpers = {
document: document,
makeRandomId() { return 'abc12'; },
navigator: window.navigator,
window: window,
}
const checkStorageAvailability = (
type
) => {
switch (type) {
case 'cookie':
if (!helpers.navigator.cookieEnabled) return false;
try {
const key = helpers.makeRandomId();
writeCookie(key, 'bar');
const success = _.includes(helpers.document.cookie, `${key}=bar`);
writeCookie(key, '', false); // cleanup
return success;
} catch (e) {
return false;
}
case 'session':
case 'local':
try {
const storage = helpers.window[`${type}Storage`];
const x = '__storage_test__';
storage.setItem(x, x);
storage.removeItem(x);
return true;
} catch (e) {
return false;
}
default:
return _.filter(types, (storageType) => checkStorageAvailability(storageType));
}
};
const types = [
'cookie',
'local',
'session',
];
class Storage {
constructor() {
let availableTypes = checkStorageAvailability();
Object.defineProperties(this, {
'_forceCookie': {
value: availableTypes.length === 1 && availableTypes[0] === 'cookie',
},
availableTypes: {
get() { return availableTypes },
},
checkAvailableTypes: {
value() { return availableTypes = checkStorageAvailability() },
},
});
}
}
const a = new Storage();
console.log(a.availableTypes);
helpers.window = { localStorage: undefined, sessionStorage: window.sessionStorage };
a.checkAvailableTypes()
console.log(a.availableTypes);