🪇 Refactors file-service to handle non-browser context

This commit is contained in:
Rune Harlyk
2024-08-19 20:14:11 +02:00
committed by Rune Harlyk
parent 3da1717341
commit 7ba5b5118a
+20 -37
View File
@@ -1,51 +1,38 @@
import { Result } from '$lib/utilities/result'; import { Result } from '$lib/utilities/result';
import { browser } from '$app/environment';
class FileService { class FileService {
private dbName = 'fileStorageDB'; private dbPromise: Promise<Result<IDBDatabase, string>> | null = browser
private dbVersion = 1; ? this.openDatabase()
private storeName = 'files'; : null;
private dbPromise: Promise<Result<IDBDatabase, string>>;
constructor() {
this.dbPromise = this.openDatabase();
}
private async openDatabase(): Promise<Result<IDBDatabase, string>> { private async openDatabase(): Promise<Result<IDBDatabase, string>> {
return new Promise((resolve) => { return new Promise((resolve) => {
const request = indexedDB.open(this.dbName, this.dbVersion); const request = indexedDB.open('fileStorageDB', 1);
request.onerror = () => resolve(Result.err('Error opening database')); request.onupgradeneeded = () => {
request.result.createObjectStore('files');
request.onsuccess = () => resolve(Result.ok(request.result));
request.onupgradeneeded = (event) => {
const db = request.result;
if (!db.objectStoreNames.contains(this.storeName)) {
db.createObjectStore(this.storeName);
}
}; };
request.onsuccess = () => resolve(Result.ok(request.result));
request.onerror = () => resolve(Result.err('Error opening database'));
}); });
} }
private async getStore(mode: IDBTransactionMode): Promise<Result<IDBObjectStore, string>> { private async getStore(mode: IDBTransactionMode): Promise<Result<IDBObjectStore, string>> {
if (!browser || !this.dbPromise)
return Result.err('Not running in browser or DB not initialized');
const dbResult = await this.dbPromise; const dbResult = await this.dbPromise;
if (dbResult.isErr()) { if (dbResult.isErr()) return Result.err('Database not initialized');
return Result.err('Database not initialized properly'); const store = dbResult.inner.transaction('files', mode).objectStore('files');
} return Result.ok(store);
const db = dbResult.inner;
const transaction = db.transaction(this.storeName, mode);
return Result.ok(transaction.objectStore(this.storeName));
} }
public async saveFile(key: string, file: Uint8Array): Promise<Result<IDBValidKey, string>> { public async saveFile(key: string, file: Uint8Array): Promise<Result<IDBValidKey, string>> {
const storeResult = await this.getStore('readwrite'); const storeResult = await this.getStore('readwrite');
if (storeResult.isErr()) { if (storeResult.isErr()) return Result.err('Failed to access store');
return Result.err('Failed to access object store for writing');
}
const store = storeResult.inner;
return new Promise((resolve) => { return new Promise((resolve) => {
const request = store.put(file, key); const request = storeResult.inner.put(file, key);
request.onsuccess = () => resolve(Result.ok(request.result)); request.onsuccess = () => resolve(Result.ok(request.result));
request.onerror = () => resolve(Result.err('Failed to save file')); request.onerror = () => resolve(Result.err('Failed to save file'));
}); });
@@ -53,19 +40,15 @@ class FileService {
public async getFile(key: string): Promise<Result<Uint8Array | undefined, string>> { public async getFile(key: string): Promise<Result<Uint8Array | undefined, string>> {
const storeResult = await this.getStore('readonly'); const storeResult = await this.getStore('readonly');
if (storeResult.isErr()) { if (storeResult.isErr()) return Result.err('Failed to access store');
return Result.err('Failed to access object store for reading');
}
const store = storeResult.inner;
return new Promise((resolve) => { return new Promise((resolve) => {
const request = store.get(key); const request = storeResult.inner.get(key);
request.onsuccess = () => request.onsuccess = () =>
resolve(request.result ? Result.ok(request.result) : Result.err('File content not found')); resolve(request.result ? Result.ok(request.result) : Result.err('File not found'));
request.onerror = () => resolve(Result.err('Failed to retrieve file')); request.onerror = () => resolve(Result.err('Failed to retrieve file'));
}); });
} }
} }
export default new FileService(); export default browser ? new FileService() : null;