First version of Karten App
This commit is contained in:
@@ -0,0 +1,57 @@
|
||||
import type { MarksPort } from "../karte/types";
|
||||
|
||||
const DB_NAME = "karte";
|
||||
const STORE = "marks";
|
||||
const KEY = "heruntergeladen";
|
||||
|
||||
function openDatabase(): Promise<IDBDatabase> {
|
||||
return new Promise((resolve, reject) => {
|
||||
const request = indexedDB.open(DB_NAME, 1);
|
||||
request.onupgradeneeded = () => {
|
||||
const db = request.result;
|
||||
if (!db.objectStoreNames.contains(STORE)) db.createObjectStore(STORE);
|
||||
};
|
||||
request.onsuccess = () => resolve(request.result);
|
||||
request.onerror = () => reject(request.error ?? new Error("IndexedDB"));
|
||||
});
|
||||
}
|
||||
|
||||
function stringsFrom(value: unknown): string[] {
|
||||
if (!Array.isArray(value)) return [];
|
||||
return value.filter((item): item is string => typeof item === "string");
|
||||
}
|
||||
|
||||
function settle(tx: IDBTransaction, value: () => unknown): Promise<unknown> {
|
||||
return new Promise((resolve, reject) => {
|
||||
tx.oncomplete = () => resolve(value());
|
||||
tx.onerror = () => reject(tx.error ?? new Error("IndexedDB"));
|
||||
tx.onabort = () => reject(tx.error ?? new Error("IndexedDB"));
|
||||
});
|
||||
}
|
||||
|
||||
export function createMarksDb(): MarksPort {
|
||||
return {
|
||||
async read() {
|
||||
const db = await openDatabase();
|
||||
try {
|
||||
const tx = db.transaction(STORE, "readonly");
|
||||
const request = tx.objectStore(STORE).get(KEY);
|
||||
const value = await settle(tx, () => request.result);
|
||||
return { heruntergeladen: stringsFrom(value) };
|
||||
} finally {
|
||||
db.close();
|
||||
}
|
||||
},
|
||||
|
||||
async write(state) {
|
||||
const db = await openDatabase();
|
||||
try {
|
||||
const tx = db.transaction(STORE, "readwrite");
|
||||
tx.objectStore(STORE).put(state.heruntergeladen, KEY);
|
||||
await settle(tx, () => undefined);
|
||||
} finally {
|
||||
db.close();
|
||||
}
|
||||
},
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user