🪇 Refactors file-service to handle non-browser context
This commit is contained in:
@@ -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;
|
||||||
Reference in New Issue
Block a user