- SeekBeyondBuffer and LoadTrackStreaming assign _activeStreamingTask before
awaiting; DrainActiveStreamingTaskAsync awaits previous task before new
stream starts, closing the concurrent-seek race on the JS StreamDecoder
- Always slice ArrayPool buffer to currentBytes before sending to JS interop;
eliminates stale bytes from prior rentals reaching the audio decoder
- getSampleAlignedChunkSize accepts streamComplete flag; bypasses minimum
chunk guard on final tail so trailing bytes are decoded, not dropped
- StreamDecoder accumulates headerSearchChunks until parseHeader succeeds,
with 256 KB MAX_HEADER_SEARCH_BYTES bound; handles fragmented first chunks
and extended WAV headers with LIST/INFO/JUNK chunks
- markStreamComplete early-returns when streamComplete already set to prevent
double-drain and incorrect streamingCompleted flag after partial failure
- processedBytes advances only after successful decode; failed segments leave
cursor in place rather than permanently skipping audio
- AudioInteropService.MarkStreamCompleteAsync wires C# loop exit to JS decoder
ensuring tail drain fires even when Content-Length header is absent
- Replace object lock with SemaphoreSlim(1,1) on both DirectoryIndexDirectory
and VaultIndexDirectory; SaveIndexAsync now executes inside the semaphore
so mutate+persist is atomic
- ReloadIndexAsync acquires the semaphore before LoadIndexAsync so disk load
and in-memory swap are atomic with respect to concurrent writes
- HasIndexEntry and GetEntryMetadata converted to async Task with WaitAsync;
MediaVault.GetEntryAsync call sites updated accordingly
- TrackRepository.Update throws InvalidOperationException when Id not found
instead of silently calling Create; service layer catches and wraps as fail result
Cold-storage audit: eight projects (net10.0), dual-database, streaming playback.
DOC_PLAN.md briefs doc-keeper on eight folder-level CLAUDE.mds to write or
rewrite; Services libraries are the biggest gap.
- Redesigned audio player bar to be mobile-friendly
- Added unloading for track switching (needs to be fixed)
- Added IsLoading status so loading spinner isn't hanging around when it shouldn't be
- Normalized styles with scoped files (will further reduce)
- Layout Cleanup
- EF fixes (migrations now function for deployment)
- deploy script updates (new dedicated host)