Add cache validation func to startup
| @@ -66,6 +66,7 @@ import { init as statsInit, onExit as statsOnExit } from './src/endpoints/stats. | |||
| 66 | import { checkForNewContent } from './src/endpoints/content-manager.js'; | 66 | import { checkForNewContent } from './src/endpoints/content-manager.js'; |
| 67 | import { init as settingsInit } from './src/endpoints/settings.js'; | 67 | import { init as settingsInit } from './src/endpoints/settings.js'; |
| 68 | import { redirectDeprecatedEndpoints, ServerStartup, setupPrivateEndpoints } from './src/server-startup.js'; | 68 | import { redirectDeprecatedEndpoints, ServerStartup, setupPrivateEndpoints } from './src/server-startup.js'; |
| 69 | import { verifyCharactersDiskCache } from './src/endpoints/characters.js'; | ||
| 69 | 70 | ||
| 70 | // Unrestrict console logs display limit | 71 | // Unrestrict console logs display limit |
| 71 | util.inspect.defaultOptions.maxArrayLength = null; | 72 | util.inspect.defaultOptions.maxArrayLength = null; |
| @@ -268,6 +269,7 @@ async function preSetupTasks() { | |||
| 268 | const directories = await getUserDirectoriesList(); | 269 | const directories = await getUserDirectoriesList(); |
| 269 | await checkForNewContent(directories); | 270 | await checkForNewContent(directories); |
| 270 | await ensureThumbnailCache(); | 271 | await ensureThumbnailCache(); |
| 272 | await verifyCharactersDiskCache(directories); | ||
| 271 | cleanUploads(); | 273 | cleanUploads(); |
| 272 | migrateAccessLog(); | 274 | migrateAccessLog(); |
| 273 | 275 | ||
| @@ -55,6 +55,34 @@ const diskCache = { | |||
| 55 | }; | 55 | }; |
| 56 | 56 | ||
| 57 | /** | 57 | /** |
| 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 | /** | ||
| 58 | * Reads the character card from the specified image file. | 86 | * Reads the character card from the specified image file. |
| 59 | * @param {string} inputFile - Path to the image file | 87 | * @param {string} inputFile - Path to the image file |
| 60 | * @param {string} inputFormat - 'png' | 88 | * @param {string} inputFormat - 'png' |