SB = {}; Map.prototype.toJSON = function() { return Array.from(this.entries()); }; function storeEncode(data) { if(!(data instanceof Map)) return data; return JSON.stringify(data); } function strParser(data) { try { return new Map(JSON.parse(data)); } catch(e) { return data } } function configProxy() { chrome.storage.onChanged.addListener((changes, namespace) => { for (key in changes) { Reflect.set(SB.localconfig, key, changes[key].newValue); } }); var handler = { set: function(obj, prop, value) { chrome.storage.sync.set({ [prop]: storeEncode(value) }); }, get: function(obj, prop) { return strParser(Reflect.get(SB.localconfig, prop)); } }; return new Proxy({}, handler); } fetchConfig = () => new Promise((resolve, reject) => { chrome.storage.sync.get(null, function(items) { SB.localconfig = items; // Data is ready resolve(); }); }); function migrate() { // Convert sponsorTimes format for (key in SB.localconfig) { if (key.startsWith("sponsorTimes") && key !== "sponsorTimes" && key !== "sponsorTimesContributed") { SB.config.sponsorTimes.set(key.substr(12), SB.config[key]); delete SB.config[key]; } } } async function config() { await fetchConfig(); addDefaults(); SB.config = configProxy(); migrate(); } SB.defaults = { "sponsorTimes": new Map(), "startSponsorKeybind": ";", "submitKeybind": "'", "minutesSaved": 0, "skipCount": 0, "sponsorTimesContributed": 0, "disableSkipping": false, "disableAutoSkip": false, "trackViewCount": true, "dontShowNotice": false, "hideVideoPlayerControls": false, "hideInfoButtonPlayerControls": false, "hideDeleteButtonPlayerControls": false, "hideDiscordLaunches": 0, "hideDiscordLink": false } // Reset config function resetConfig() { SB.config = SB.defaults; }; // Add defaults function addDefaults() { Object.keys(SB.defaults).forEach(key => { if(!SB.localconfig.hasOwnProperty(key)) { SB.localconfig[key] = SB.defaults[key]; } }); }; // Sync config config();