Add config.yaml value for cards cache capacity.

This commit is contained in:
Cohee
2024-12-05 12:59:03 +00:00
parent 41a3035a2a
commit 373a0ad321
3 changed files with 9 additions and 5 deletions

View File

@@ -1,6 +1,8 @@
# -- DATA CONFIGURATION -- # -- DATA CONFIGURATION --
# Root directory for user data storage # Root directory for user data storage
dataRoot: ./data dataRoot: ./data
# The maximum amount of memory that parsed character cards can use in MB
cardsCacheCapacity: 100
# -- SERVER CONFIGURATION -- # -- SERVER CONFIGURATION --
# Listen for incoming connections # Listen for incoming connections
listen: false listen: false

View File

@@ -14,7 +14,7 @@ import jimp from 'jimp';
import { AVATAR_WIDTH, AVATAR_HEIGHT } from '../constants.js'; import { AVATAR_WIDTH, AVATAR_HEIGHT } from '../constants.js';
import { jsonParser, urlencodedParser } from '../express-common.js'; import { jsonParser, urlencodedParser } from '../express-common.js';
import { deepMerge, humanizedISO8601DateTime, tryParse, extractFileFromZipBuffer, MemoryLimitedMap } from '../util.js'; import { deepMerge, humanizedISO8601DateTime, tryParse, extractFileFromZipBuffer, MemoryLimitedMap, getConfigValue } from '../util.js';
import { TavernCardValidator } from '../validator/TavernCardValidator.js'; import { TavernCardValidator } from '../validator/TavernCardValidator.js';
import { parse, write } from '../character-card-parser.js'; import { parse, write } from '../character-card-parser.js';
import { readWorldInfoFile } from './worldinfo.js'; import { readWorldInfoFile } from './worldinfo.js';
@@ -23,8 +23,9 @@ import { importRisuSprites } from './sprites.js';
const defaultAvatarPath = './public/img/ai4.png'; const defaultAvatarPath = './public/img/ai4.png';
// KV-store for parsed character data // KV-store for parsed character data
// 100 MB limit. Would take roughly 3000 characters to reach this limit const cacheCapacity = Number(getConfigValue('cardsCacheCapacity', 100)); // MB
const characterDataCache = new MemoryLimitedMap(1024 * 1024 * 100); // With 100 MB limit it would take roughly 3000 characters to reach this limit
const characterDataCache = new MemoryLimitedMap(1024 * 1024 * cacheCapacity);
// Some Android devices require tighter memory management // Some Android devices require tighter memory management
const isAndroid = process.platform === 'android'; const isAndroid = process.platform === 'android';

View File

@@ -680,8 +680,9 @@ export class MemoryLimitedMap {
* @param {number} maxMemoryInBytes - The maximum allowed memory in bytes for string values. * @param {number} maxMemoryInBytes - The maximum allowed memory in bytes for string values.
*/ */
constructor(maxMemoryInBytes) { constructor(maxMemoryInBytes) {
if (typeof maxMemoryInBytes !== 'number' || maxMemoryInBytes <= 0) { if (typeof maxMemoryInBytes !== 'number' || maxMemoryInBytes <= 0 || isNaN(maxMemoryInBytes)) {
throw new Error('maxMemoryInBytes must be a positive number'); console.warn('Invalid maxMemoryInBytes, using a fallback value of 1 GB.');
maxMemoryInBytes = 1024 * 1024 * 1024; // 1 GB
} }
this.maxMemory = maxMemoryInBytes; this.maxMemory = maxMemoryInBytes;
this.currentMemory = 0; this.currentMemory = 0;