import { FileSystem } from '@/types/system'; import { Book } from '@/types/book'; import { getLibraryFilename } from '@/utils/book'; import { safeLoadJSON, safeSaveJSON } from './persistence'; const COVER_CONCURRENCY = 20; async function processInBatches( items: T[], concurrency: number, fn: (item: T) => Promise, ): Promise { for (let i = 0; i < items.length; i += concurrency) { await Promise.all(items.slice(i, i + concurrency).map(fn)); } } export async function loadLibraryBooks( fs: FileSystem, generateCoverImageUrl: (book: Book) => Promise, ): Promise { const libraryFilename = getLibraryFilename(); if (!(await fs.exists('', 'Books'))) { await fs.createDir('', 'Books', true); } const books = await safeLoadJSON(fs, libraryFilename, 'Books', []); await processInBatches(books, COVER_CONCURRENCY, async (book) => { book.coverImageUrl = await generateCoverImageUrl(book); book.updatedAt ??= book.lastUpdated || Date.now(); }); return books; } export async function saveLibraryBooks(fs: FileSystem, books: Book[]): Promise { // eslint-disable-next-line @typescript-eslint/no-unused-vars const libraryBooks = books.map(({ coverImageUrl, ...rest }) => rest); await safeSaveJSON(fs, getLibraryFilename(), 'Books', libraryBooks); }