your personal website on atproto - mirror blento.app
at update-link-card 58 lines 1.9 kB view raw
1const DB_NAME = 'blento-images'; 2const STORE_NAME = 'images'; 3 4function openDB(): Promise<IDBDatabase> { 5 return new Promise((resolve, reject) => { 6 const request = indexedDB.open(DB_NAME, 1); 7 request.onupgradeneeded = () => { 8 request.result.createObjectStore(STORE_NAME); 9 }; 10 request.onsuccess = () => resolve(request.result); 11 request.onerror = () => reject(request.error); 12 }); 13} 14 15export async function putImage(key: string, blob: Blob, name: string): Promise<void> { 16 const db = await openDB(); 17 const data = await blob.arrayBuffer(); 18 return new Promise((resolve, reject) => { 19 const tx = db.transaction(STORE_NAME, 'readwrite'); 20 tx.objectStore(STORE_NAME).put({ data, type: blob.type, name }, key); 21 tx.oncomplete = () => resolve(); 22 tx.onerror = () => reject(tx.error); 23 }); 24} 25 26export async function getImage(key: string): Promise<{ blob: Blob; name: string } | null> { 27 const db = await openDB(); 28 return new Promise((resolve, reject) => { 29 const tx = db.transaction(STORE_NAME, 'readonly'); 30 const request = tx.objectStore(STORE_NAME).get(key); 31 request.onsuccess = () => { 32 if (!request.result) return resolve(null); 33 const { data, type, name } = request.result; 34 resolve({ blob: new Blob([data], { type }), name }); 35 }; 36 request.onerror = () => reject(request.error); 37 }); 38} 39 40export async function deleteImage(key: string): Promise<void> { 41 const db = await openDB(); 42 return new Promise((resolve, reject) => { 43 const tx = db.transaction(STORE_NAME, 'readwrite'); 44 tx.objectStore(STORE_NAME).delete(key); 45 tx.oncomplete = () => resolve(); 46 tx.onerror = () => reject(tx.error); 47 }); 48} 49 50export async function clearImages(): Promise<void> { 51 const db = await openDB(); 52 return new Promise((resolve, reject) => { 53 const tx = db.transaction(STORE_NAME, 'readwrite'); 54 tx.objectStore(STORE_NAME).clear(); 55 tx.oncomplete = () => resolve(); 56 tx.onerror = () => reject(tx.error); 57 }); 58}