/* global loadScript tryJSONparse promisifyChrome */ /* exported chromeLocal chromeSync */ 'use strict'; promisifyChrome({ 'storage.local': ['get', 'remove', 'set'], 'storage.sync': ['get', 'remove', 'set'], }); const [chromeLocal, chromeSync] = (() => { return [ createWrapper('local'), createWrapper('sync'), ]; function createWrapper(name) { const storage = browser.storage[name]; const wrapper = { get: storage.get.bind(storage), set: data => storage.set(data).then(() => data), remove: storage.remove.bind(storage), /** * @param {String} key * @param {Any} [defaultValue] * @returns {Promise} */ getValue: (key, defaultValue) => wrapper.get( defaultValue !== undefined ? {[key]: defaultValue} : key ).then(data => data[key]), setValue: (key, value) => wrapper.set({[key]: value}), getLZValue: key => wrapper.getLZValues([key]).then(data => data[key]), getLZValues: keys => Promise.all([ wrapper.get(keys), loadLZStringScript(), ]).then(([data = {}, LZString]) => { for (const key of keys) { const value = data[key]; data[key] = value && tryJSONparse(LZString.decompressFromUTF16(value)); } return data; }), setLZValue: (key, value) => loadLZStringScript().then(LZString => wrapper.set({ [key]: LZString.compressToUTF16(JSON.stringify(value)), })), loadLZStringScript, }; return wrapper; } function loadLZStringScript() { return window.LZString ? Promise.resolve(window.LZString) : loadScript('/vendor/lz-string-unsafe/lz-string-unsafe.min.js').then(() => (window.LZString = window.LZString || window.LZStringUnsafe)); } })();