Add cache validation func to startup

9c7d3d740028f76b8a93a2bfeb9daba08c2b1fc7

Cohee <18619528+Cohee1207@users.noreply.github.com>

2 files changed, +30 -0Showing whitespace changes
server.js+2 -0
@@ -66,6 +66,7 @@ import { init as statsInit, onExit as statsOnExit } from './src/endpoints/stats.
6666import { checkForNewContent } from './src/endpoints/content-manager.js';
6767import { init as settingsInit } from './src/endpoints/settings.js';
6868import { redirectDeprecatedEndpoints, ServerStartup, setupPrivateEndpoints } from './src/server-startup.js';
69+import { verifyCharactersDiskCache } from './src/endpoints/characters.js';
6970
7071// Unrestrict console logs display limit
7172util.inspect.defaultOptions.maxArrayLength = null;
@@ -268,6 +269,7 @@ async function preSetupTasks() {
268269 const directories = await getUserDirectoriesList();
269270 await checkForNewContent(directories);
270271 await ensureThumbnailCache();
272+ await verifyCharactersDiskCache(directories);
271273 cleanUploads();
272274 migrateAccessLog();
273275
src/endpoints/characters.js+28 -0
@@ -55,6 +55,34 @@ const diskCache = {
5555};
5656
5757/**
58+ * Verifies disk cache size and prunes it if necessary.
59+ * @param {import('../users.js').UserDirectoryList[]} directoriesList List of user directories
60+ * @returns {Promise<void>}
61+ */
62+export async function verifyCharactersDiskCache(directoriesList) {
63+ if (!useDiskCache) {
64+ return;
65+ }
66+
67+ const cache = await diskCache.instance();
68+ const validKeys = [];
69+ for (const dir of directoriesList) {
70+ const files = fs.readdirSync(dir.characters);
71+ for (const file of files) {
72+ const filePath = path.join(dir.characters, file);
73+ const stat = fs.statSync(filePath);
74+ validKeys.push(`${filePath}-${stat.mtimeMs}`);
75+ }
76+ }
77+ const cacheKeys = await cache.keys();
78+ for (const key of cacheKeys) {
79+ if (!validKeys.includes(key)) {
80+ await cache.removeItem(key);
81+ }
82+ }
83+}
84+
85+/**
5886 * Reads the character card from the specified image file.
5987 * @param {string} inputFile - Path to the image file
6088 * @param {string} inputFormat - 'png'