/* global Backbone, Whisper */ /* eslint-disable more/no-then */ // eslint-disable-next-line func-names (function() { 'use strict'; window.Whisper = window.Whisper || {}; const Item = Backbone.Model.extend({ database: Whisper.Database, storeName: 'items', }); const ItemCollection = Backbone.Collection.extend({ model: Item, storeName: 'items', database: Whisper.Database, }); let ready = false; const items = new ItemCollection(); items.on('reset', () => { ready = true; }); window.legacyStorage = { /** *************************** *** Base Storage Routines *** **************************** */ put(key, value) { if (value === undefined) { throw new Error('Tried to store undefined'); } if (!ready) { window.log.warn( 'Called storage.put before storage is ready. key:', key ); } const item = items.add({ id: key, value }, { merge: true }); return new Promise((resolve, reject) => { item.save().then(resolve, reject); }); }, get(key, defaultValue) { const item = items.get(`${key}`); if (!item) { return defaultValue; } return item.get('value'); }, remove(key) { const item = items.get(`${key}`); if (item) { items.remove(item); return new Promise((resolve, reject) => { item.destroy().then(resolve, reject); }); } return Promise.resolve(); }, onready(callback) { if (ready) { callback(); } else { items.on('reset', callback); } }, fetch() { return new Promise((resolve, reject) => { items .fetch({ reset: true }) .fail(() => reject( new Error( 'Failed to fetch from storage.' + ' This may be due to an unexpected database version.' ) ) ) .always(resolve); }); }, reset() { items.reset(); }, }; })();