your personal website on atproto - mirror
blento.app
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}