AIClient-2-API/src/ui-modules/usage-cache.js
hex2077 245583b96a feat(logging): 添加日志系统配置和下载功能
- 新增日志系统配置选项,支持日志级别、输出模式、文件大小等设置
- 添加当日日志文件下载功能,可通过Web界面直接下载
- 将console.log/error替换为结构化logger,提升日志可管理性
- 在日志页面添加自动滚动到底部功能
- 更新配置示例文件,包含完整的日志配置参数
2026-01-25 17:24:39 +08:00

72 lines
No EOL
2.2 KiB
JavaScript

import { existsSync } from 'fs';
import logger from '../utils/logger.js';
import { promises as fs } from 'fs';
import path from 'path';
// 用量缓存文件路径
const USAGE_CACHE_FILE = path.join(process.cwd(), 'configs', 'usage-cache.json');
/**
* 读取用量缓存文件
* @returns {Promise<Object|null>} 缓存的用量数据,如果不存在或读取失败则返回 null
*/
export async function readUsageCache() {
try {
if (existsSync(USAGE_CACHE_FILE)) {
const content = await fs.readFile(USAGE_CACHE_FILE, 'utf8');
return JSON.parse(content);
}
return null;
} catch (error) {
logger.warn('[Usage Cache] Failed to read usage cache:', error.message);
return null;
}
}
/**
* 写入用量缓存文件
* @param {Object} usageData - 用量数据
*/
export async function writeUsageCache(usageData) {
try {
await fs.writeFile(USAGE_CACHE_FILE, JSON.stringify(usageData, null, 2), 'utf8');
logger.info('[Usage Cache] Usage data cached to', USAGE_CACHE_FILE);
} catch (error) {
logger.error('[Usage Cache] Failed to write usage cache:', error.message);
}
}
/**
* 读取特定提供商类型的用量缓存
* @param {string} providerType - 提供商类型
* @returns {Promise<Object|null>} 缓存的用量数据
*/
export async function readProviderUsageCache(providerType) {
const cache = await readUsageCache();
if (cache && cache.providers && cache.providers[providerType]) {
return {
...cache.providers[providerType],
cachedAt: cache.timestamp,
fromCache: true
};
}
return null;
}
/**
* 更新特定提供商类型的用量缓存
* @param {string} providerType - 提供商类型
* @param {Object} usageData - 用量数据
*/
export async function updateProviderUsageCache(providerType, usageData) {
let cache = await readUsageCache();
if (!cache) {
cache = {
timestamp: new Date().toISOString(),
providers: {}
};
}
cache.providers[providerType] = usageData;
cache.timestamp = new Date().toISOString();
await writeUsageCache(cache);
}