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);