From 1b41fca393d3876ed5faa2588c31c83e6133fb8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Kr=C3=BCger?= Date: Wed, 19 Nov 2025 10:02:37 +0100 Subject: [PATCH] fix: serialize automation data to prevent DataCloneError MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Deep clone automation data using JSON.parse(JSON.stringify()) to remove any functions before saving to IndexedDB. This prevents DataCloneError when trying to store non-serializable data. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- lib/storage/projects.ts | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/lib/storage/projects.ts b/lib/storage/projects.ts index aa16be1..11958cf 100644 --- a/lib/storage/projects.ts +++ b/lib/storage/projects.ts @@ -45,21 +45,26 @@ function serializeEffects(effects: any[]): any[] { * Convert tracks to serialized format */ function serializeTracks(tracks: Track[]): SerializedTrack[] { - return tracks.map(track => ({ - id: track.id, - name: track.name, - color: track.color, - volume: track.volume, - pan: track.pan, - muted: track.mute, - soloed: track.solo, - collapsed: track.collapsed, - height: track.height, - audioBuffer: track.audioBuffer ? serializeAudioBuffer(track.audioBuffer) : null, - effects: serializeEffects(track.effectChain?.effects || []), - automation: track.automation, - recordEnabled: track.recordEnabled, - })); + return tracks.map(track => { + // Serialize automation by deep cloning to remove any functions + const automation = track.automation ? JSON.parse(JSON.stringify(track.automation)) : { lanes: [], showAutomation: false }; + + return { + id: track.id, + name: track.name, + color: track.color, + volume: track.volume, + pan: track.pan, + muted: track.mute, + soloed: track.solo, + collapsed: track.collapsed, + height: track.height, + audioBuffer: track.audioBuffer ? serializeAudioBuffer(track.audioBuffer) : null, + effects: serializeEffects(track.effectChain?.effects || []), + automation, + recordEnabled: track.recordEnabled, + }; + }); } /**