1(() => { 2 'use strict'; 3 4 const databaseName = 'pdfle-local-file-handoff'; 5 const storeName = 'files'; 6 const pendingKey = 'pending'; 7 const maxAgeMs = 2 * 60 * 1000; 8 9 function openDatabase() { 10 return new Promise((resolve, reject) => { 11 const request = indexedDB.open(databaseName, 1); 12 request.onupgradeneeded = () => { 13 if (!request.result.objectStoreNames.contains(storeName)) request.result.createObjectStore(storeName); 14 }; 15 request.onsuccess = () => resolve(request.result); 16 request.onerror = () => reject(request.error ?? new Error('Local file handoff is unavailable.')); 17 }); 18 } 19 20 async function put(file) { 21 const database = await openDatabase(); 22 try { 23 await new Promise((resolve, reject) => { 24 const transaction = database.transaction(storeName, 'readwrite'); 25 transaction.objectStore(storeName).put({ 26 file, 27 name: file.name, 28 type: file.type, 29 lastModified: file.lastModified, 30 createdAt: Date.now() 31 }, pendingKey); 32 transaction.oncomplete = resolve; 33 transaction.onerror = () => reject(transaction.error ?? new Error('Could not prepare this local file.')); 34 transaction.onabort = () => reject(transaction.error ?? new Error('Could not prepare this local file.')); 35 }); 36 } finally { 37 database.close(); 38 } 39 } 40 41 async function take() { 42 const database = await openDatabase(); 43 try { 44 return await new Promise((resolve, reject) => { 45 const transaction = database.transaction(storeName, 'readwrite'); 46 const store = transaction.objectStore(storeName); 47 const request = store.get(pendingKey); 48 request.onsuccess = () => { 49 const record = request.result; 50 store.delete(pendingKey); 51 const valid = record?.file instanceof Blob && Date.now() - Number(record.createdAt) <= maxAgeMs; 52 resolve(valid ? new File([record.file], record.name || 'document', { 53 type: record.type || record.file.type, 54 lastModified: Number(record.lastModified) || Date.now() 55 }) : null); 56 }; 57 request.onerror = () => reject(request.error ?? new Error('Could not read the local file.')); 58 }); 59 } finally { 60 database.close(); 61 } 62 } 63 64 window.PdfleLocalFileHandoff = Object.freeze({ put, take }); 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.