From 7ba5b5118ace965f8538e74bcad3bef806bb7b0e Mon Sep 17 00:00:00 2001 From: Rune Harlyk Date: Mon, 19 Aug 2024 20:14:11 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=AA=87=20Refactors=20file-service=20to=20?= =?UTF-8?q?handle=20non-browser=20context?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/lib/services/file-service.ts | 57 ++++++++++------------------ 1 file changed, 20 insertions(+), 37 deletions(-) diff --git a/app/src/lib/services/file-service.ts b/app/src/lib/services/file-service.ts index 2a529db..70f27b5 100644 --- a/app/src/lib/services/file-service.ts +++ b/app/src/lib/services/file-service.ts @@ -1,51 +1,38 @@ import { Result } from '$lib/utilities/result'; +import { browser } from '$app/environment'; class FileService { - private dbName = 'fileStorageDB'; - private dbVersion = 1; - private storeName = 'files'; - private dbPromise: Promise>; - - constructor() { - this.dbPromise = this.openDatabase(); - } + private dbPromise: Promise> | null = browser + ? this.openDatabase() + : null; private async openDatabase(): Promise> { 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.onsuccess = () => resolve(Result.ok(request.result)); - - request.onupgradeneeded = (event) => { - const db = request.result; - if (!db.objectStoreNames.contains(this.storeName)) { - db.createObjectStore(this.storeName); - } + request.onupgradeneeded = () => { + request.result.createObjectStore('files'); }; + request.onsuccess = () => resolve(Result.ok(request.result)); + request.onerror = () => resolve(Result.err('Error opening database')); }); } private async getStore(mode: IDBTransactionMode): Promise> { + if (!browser || !this.dbPromise) + return Result.err('Not running in browser or DB not initialized'); const dbResult = await this.dbPromise; - if (dbResult.isErr()) { - return Result.err('Database not initialized properly'); - } - const db = dbResult.inner; - const transaction = db.transaction(this.storeName, mode); - return Result.ok(transaction.objectStore(this.storeName)); + if (dbResult.isErr()) return Result.err('Database not initialized'); + const store = dbResult.inner.transaction('files', mode).objectStore('files'); + return Result.ok(store); } public async saveFile(key: string, file: Uint8Array): Promise> { const storeResult = await this.getStore('readwrite'); - if (storeResult.isErr()) { - return Result.err('Failed to access object store for writing'); - } - const store = storeResult.inner; + if (storeResult.isErr()) return Result.err('Failed to access store'); 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.onerror = () => resolve(Result.err('Failed to save file')); }); @@ -53,19 +40,15 @@ class FileService { public async getFile(key: string): Promise> { const storeResult = await this.getStore('readonly'); - if (storeResult.isErr()) { - return Result.err('Failed to access object store for reading'); - } - const store = storeResult.inner; + if (storeResult.isErr()) return Result.err('Failed to access store'); return new Promise((resolve) => { - const request = store.get(key); - + const request = storeResult.inner.get(key); 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')); }); } } -export default new FileService(); +export default browser ? new FileService() : null; \ No newline at end of file