From 75eebf52bc91507a3c51a1a0ac2f5e3c1584c8f2 Mon Sep 17 00:00:00 2001 From: Maze Winther Date: Tue, 21 Apr 2026 20:45:33 +0200 Subject: [PATCH] fix: project loading thing --- .../src/services/storage/migrations/runner.ts | 1 + apps/web/src/services/storage/service.ts | 59 +++++++++++++------ 2 files changed, 43 insertions(+), 17 deletions(-) diff --git a/apps/web/src/services/storage/migrations/runner.ts b/apps/web/src/services/storage/migrations/runner.ts index 409a8695..f63fe983 100644 --- a/apps/web/src/services/storage/migrations/runner.ts +++ b/apps/web/src/services/storage/migrations/runner.ts @@ -43,6 +43,7 @@ export async function runStorageMigrations({ "projects", 1, ); + const projects = await projectsAdapter.getAll(); const orderedMigrations = [...migrations].sort((a, b) => a.from - b.from); diff --git a/apps/web/src/services/storage/service.ts b/apps/web/src/services/storage/service.ts index 8ef77846..858198eb 100644 --- a/apps/web/src/services/storage/service.ts +++ b/apps/web/src/services/storage/service.ts @@ -113,11 +113,7 @@ class StorageService { return isStorageQuotaExceededError({ error }); } - private stripAudioBuffers({ - tracks, - }: { - tracks: SceneTracks; - }): SceneTracks { + private stripAudioBuffers({ tracks }: { tracks: SceneTracks }): SceneTracks { return { ...tracks, audio: tracks.audio.map((track) => ({ @@ -173,6 +169,19 @@ class StorageService { if (!serializedProject) return null; + if ( + typeof serializedProject !== "object" || + serializedProject === null || + typeof serializedProject.metadata !== "object" || + serializedProject.metadata === null + ) { + console.warn( + "[storage] Skipping malformed project entry (missing metadata):", + { id, entry: serializedProject }, + ); + return null; + } + const scenes = serializedProject.scenes?.map((scene) => ({ id: scene.id, @@ -225,18 +234,34 @@ class StorageService { await this.ensureMigrations(); const serializedProjects = await this.projectsAdapter.getAll(); - const metadata = serializedProjects.map((serializedProject) => ({ - id: serializedProject.metadata.id, - name: serializedProject.metadata.name, - thumbnail: serializedProject.metadata.thumbnail, - duration: - serializedProject.metadata.duration ?? - getProjectDurationFromScenes({ - scenes: (serializedProject.scenes ?? []) as unknown as TScene[], - }), - createdAt: new Date(serializedProject.metadata.createdAt), - updatedAt: new Date(serializedProject.metadata.updatedAt), - })); + const metadata: TProjectMetadata[] = []; + for (const serializedProject of serializedProjects) { + if ( + typeof serializedProject !== "object" || + serializedProject === null || + typeof serializedProject.metadata !== "object" || + serializedProject.metadata === null + ) { + console.warn( + "[storage] Skipping malformed project entry (missing metadata):", + serializedProject, + ); + continue; + } + + metadata.push({ + id: serializedProject.metadata.id, + name: serializedProject.metadata.name, + thumbnail: serializedProject.metadata.thumbnail, + duration: + serializedProject.metadata.duration ?? + getProjectDurationFromScenes({ + scenes: (serializedProject.scenes ?? []) as unknown as TScene[], + }), + createdAt: new Date(serializedProject.metadata.createdAt), + updatedAt: new Date(serializedProject.metadata.updatedAt), + }); + } return metadata.sort( (a, b) => b.updatedAt.getTime() - a.updatedAt.getTime(),