indexedb-utils.js (1833B)
1 const STORAGE_NAME = 'prerender_test'; 2 const INITIATOR_KEY = 'initiator'; 3 const INITIATOR_VALUE = INITIATOR_KEY + '_set'; 4 const PRERENDER_KEY = 'prerender'; 5 const PRERENDER_VALUE = PRERENDER_KEY + '_set'; 6 7 async function openIndexedDatabase(t) { 8 return new Promise(resolve => { 9 const request = window.indexedDB.open(STORAGE_NAME); 10 if (t) 11 t.add_cleanup(() => new Promise(resolve => { 12 window.indexedDB.deleteDatabase(STORAGE_NAME); 13 resolve(); 14 })); 15 request.onupgradeneeded = e => { 16 const db = e.target.result; 17 const objectStore = 18 db.createObjectStore(STORAGE_NAME, {autoIncrement: true}); 19 objectStore.createIndex('key', 'key', {unique: true}); 20 }; 21 request.onerror = e => { 22 resolve(null); 23 }; 24 request.onsuccess = e => { 25 resolve(e.target.result); 26 }; 27 }); 28 } 29 30 async function addData(db, key, value) { 31 return new Promise((resolve, reject) => { 32 const transaction = db.transaction(STORAGE_NAME, 'readwrite'); 33 const request = 34 transaction.objectStore(STORAGE_NAME).add({'key': key, 'value': value}); 35 // Use `transaction.oncomplete` rather than `request.onsuccess` to ensure 36 // that IndexedDB has flushed to disk. 37 transaction.oncomplete = e => { 38 resolve(true); 39 }; 40 transaction.onerror = e => { 41 reject(e.target.error); 42 }; 43 }); 44 } 45 46 async function readData(db, key) { 47 return new Promise((resolve, reject) => { 48 const transaction = db.transaction(STORAGE_NAME); 49 const request = transaction.objectStore(STORAGE_NAME).index('key').get(key); 50 request.onsuccess = e => { 51 if (e.target.result) { 52 resolve(e.target.result.value); 53 } else { 54 reject(new Error('Empty result.')); 55 } 56 }; 57 request.onerror = e => { 58 reject(e.target.error); 59 }; 60 }); 61 }