1let db; 2 3const DATABASE_NAME = "d2"; 4const STORE_NAME = "s"; 5 6const openDatabase = () => { 7 return new Promise((resolve, reject) => { 8 if (db) resolve(); 9 10 if (!window.indexedDB) return reject("IndexedDB is not supported"); 11 const request = window.indexedDB.open(DATABASE_NAME); 12 13 request.onsuccess = event => { 14 db = event.target.result; 15 resolve(); 16 }; 17 18 request.onerror = event => { 19 console.error("IndexedDB request error"); 20 reject(); 21 }; 22 23 request.onupgradeneeded = event => { 24 db = event.target.result; 25 const objectStore = db.createObjectStore(STORE_NAME, {keyPath: "key"}); 26 objectStore.transaction.oncomplete = () => { 27 db = event.target.result; 28 }; 29 }; 30 }); 31}; 32 33const ldb = { 34 get: key => { 35 return new Promise((resolve, reject) => { 36 openDatabase().then(() => { 37 const hasStore = Array.from(db.objectStoreNames).includes(STORE_NAME); 38 if (!hasStore) return reject("IndexedDB: no store found"); 39 40 const transaction = db.transaction(STORE_NAME, "readonly"); 41 const objectStore = transaction.objectStore(STORE_NAME); 42 const getRequest = objectStore.get(key); 43 44 getRequest.onsuccess = event => { 45 const result = event.target.result?.value || null; 46 resolve(result); 47 }; 48 }); 49 }); 50 }, 51 52 set: (keyName, value) => { 53 return new Promise(resolve => { 54 openDatabase().then(() => { 55 const transaction = db.transaction(STORE_NAME, "readwrite"); 56 const objectStore = transaction.objectStore([STORE_NAME]); 57 const putRequest = objectStore.put({key: keyName, value}); 58 59 putRequest.onsuccess = () => { 60 resolve(); 61 }; 62 }); 63 }); 64 } 65};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.