diff options
| author | Maze Winther <mazewinther@gmail.com> | 2025-06-30 19:58:36 +0200 |
|---|---|---|
| committer | Maze Winther <mazewinther@gmail.com> | 2025-06-30 19:58:36 +0200 |
| commit | 09373eb4a3f792d96d97d81f4fb86539d76e5702 (patch) | |
| tree | add2d5eee3b5922e0291f905ab77eb48f244596a /apps/web/src/lib/storage/opfs-adapter.ts | |
| parent | cd30c205b4019fb38371ced956abe55b47054433 (diff) | |
| download | opencut-09373eb4a3f792d96d97d81f4fb86539d76e5702.tar.gz | |
feat: implement project management features with storage integration, including project creation, deletion, and renaming dialogs
Diffstat (limited to 'apps/web/src/lib/storage/opfs-adapter.ts')
| -rw-r--r-- | apps/web/src/lib/storage/opfs-adapter.ts | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/apps/web/src/lib/storage/opfs-adapter.ts b/apps/web/src/lib/storage/opfs-adapter.ts new file mode 100644 index 00000000..c01954e5 --- /dev/null +++ b/apps/web/src/lib/storage/opfs-adapter.ts @@ -0,0 +1,73 @@ +import { StorageAdapter } from "./types"; + +export class OPFSAdapter implements StorageAdapter<File> { + private directoryName: string; + + constructor(directoryName: string = "media") { + this.directoryName = directoryName; + } + + private async getDirectory(): Promise<FileSystemDirectoryHandle> { + const opfsRoot = await navigator.storage.getDirectory(); + return await opfsRoot.getDirectoryHandle(this.directoryName, { + create: true, + }); + } + + async get(key: string): Promise<File | null> { + try { + const directory = await this.getDirectory(); + const fileHandle = await directory.getFileHandle(key); + return await fileHandle.getFile(); + } catch (error) { + if ((error as Error).name === "NotFoundError") { + return null; + } + throw error; + } + } + + async set(key: string, file: File): Promise<void> { + const directory = await this.getDirectory(); + const fileHandle = await directory.getFileHandle(key, { create: true }); + const writable = await fileHandle.createWritable(); + + await writable.write(file); + await writable.close(); + } + + async remove(key: string): Promise<void> { + try { + const directory = await this.getDirectory(); + await directory.removeEntry(key); + } catch (error) { + if ((error as Error).name !== "NotFoundError") { + throw error; + } + } + } + + async list(): Promise<string[]> { + const directory = await this.getDirectory(); + const keys: string[] = []; + + for await (const name of directory.keys()) { + keys.push(name); + } + + return keys; + } + + async clear(): Promise<void> { + const directory = await this.getDirectory(); + + for await (const name of directory.keys()) { + await directory.removeEntry(name); + } + } + + // Helper method to check OPFS support + static isSupported(): boolean { + return "storage" in navigator && "getDirectory" in navigator.storage; + } +} |
