Source: service/storage/CookieStorage.js

(function() {
    /**
     * @augments Help4.service.StorageService.StorageInterface
     */
    Help4.service.StorageService.CookieStorage = class extends Help4.service.StorageService.StorageInterface {
        /**
         * @override
         * @constructor
         */
        constructor() {
            const {STORAGE_LEVEL: {cookie}} = Help4.service.StorageService;
            super({
                params: {
                    available:    {init: true},
                    storageLevel: {init: cookie}
                },
                statics: {
                    _isReady: {init: true}
                }
            });
        }

        /**
         * @override
         * @param {string} key
         * @returns {?string}
         */
        get(key) {
            key += '=';

            const len = key.length;
            const all = document.cookie.split(';');

            for (let cookie of all) {
                cookie = cookie.trim();

                if (cookie.startsWith(key)) {
                    return decodeURIComponent(cookie.substring(len));
                }
            }

            return undefined;
        }

        /**
         * @param {string} key
         * @param {string} value
         * @param {number} [days = undefined]
         * @returns {true}
         */
        set(key, value, days = undefined) {
            let params = '; name=sap_help4; path=/; ';

            if (days !== null) {
                days = Number(days);

                if (days === -1) {
                    params += 'expires=Thu, 01-Jan-70 00:00:01 GMT; ';
                } else {
                    if (isNaN(days)) days = 365;

                    const day = 1000 * 3600 * 24;
                    const d = new Date();
                    d.setTime(d.getTime() + days * day);
                    params += `expires=${d.toUTCString()}; `;
                }
            }

            document.cookie = Help4.removeXSSCode(key + '=' + encodeURIComponent(value) + params);
            return true;
        }

        /**
         * @override
         * @param {string} key
         * @returns {true}
         */
        del(key) {
            return this.set(key, '', -1);
        }
    }
})();