diff --git a/server.js b/server.js index d21bb3a2d..dfc8ba434 100644 --- a/server.js +++ b/server.js @@ -66,6 +66,7 @@ import { init as statsInit, onExit as statsOnExit } from './src/endpoints/stats. import { checkForNewContent } from './src/endpoints/content-manager.js'; import { init as settingsInit } from './src/endpoints/settings.js'; import { redirectDeprecatedEndpoints, ServerStartup, setupPrivateEndpoints } from './src/server-startup.js'; +import { verifyCharactersDiskCache } from './src/endpoints/characters.js'; // Unrestrict console logs display limit util.inspect.defaultOptions.maxArrayLength = null; @@ -268,6 +269,7 @@ async function preSetupTasks() { const directories = await getUserDirectoriesList(); await checkForNewContent(directories); await ensureThumbnailCache(); + await verifyCharactersDiskCache(directories); cleanUploads(); migrateAccessLog(); diff --git a/src/endpoints/characters.js b/src/endpoints/characters.js index 019c33504..2794658ba 100644 --- a/src/endpoints/characters.js +++ b/src/endpoints/characters.js @@ -54,6 +54,34 @@ const diskCache = { }, }; +/** + * Verifies disk cache size and prunes it if necessary. + * @param {import('../users.js').UserDirectoryList[]} directoriesList List of user directories + * @returns {Promise} + */ +export async function verifyCharactersDiskCache(directoriesList) { + if (!useDiskCache) { + return; + } + + const cache = await diskCache.instance(); + const validKeys = []; + for (const dir of directoriesList) { + const files = fs.readdirSync(dir.characters); + for (const file of files) { + const filePath = path.join(dir.characters, file); + const stat = fs.statSync(filePath); + validKeys.push(`${filePath}-${stat.mtimeMs}`); + } + } + const cacheKeys = await cache.keys(); + for (const key of cacheKeys) { + if (!validKeys.includes(key)) { + await cache.removeItem(key); + } + } +} + /** * Reads the character card from the specified image file. * @param {string} inputFile - Path to the image file