43 lines
1.3 KiB
JavaScript
43 lines
1.3 KiB
JavaScript
// P2-6(audit):通用 LRU 缓存 —— Map 迭代序即插入序,get/set 命中时
|
||
// delete+set 把键提到最新;set 超 maxSize 删最老(第一个键)。
|
||
//
|
||
// 用途:main/ai.js 的 pickOpenAITokenConfig / joinUrl 每次调用重复跑
|
||
// 正则 + new URL 解析;同 model / 同 baseURL 在一次会话里反复命中,
|
||
// 缓存结果省 CPU。maxSize 64 足够覆盖「用户试过的模型 + URL」组合,
|
||
// 不会无界增长。
|
||
|
||
'use strict';
|
||
|
||
/**
|
||
* @param {object} [opts]
|
||
* @param {number} [opts.maxSize=64]
|
||
* @returns {{ get: (k: any) => any, set: (k: any, v: any) => void,
|
||
* has: (k: any) => boolean, size: number }}
|
||
*/
|
||
function createLruCache({ maxSize = 64 } = {}) {
|
||
const map = new Map();
|
||
return {
|
||
get(key) {
|
||
if (!map.has(key)) return undefined;
|
||
const v = map.get(key);
|
||
// LRU:提到最新
|
||
map.delete(key);
|
||
map.set(key, v);
|
||
return v;
|
||
},
|
||
set(key, value) {
|
||
// 覆盖同键 = 使用一次,提到最新
|
||
if (map.has(key)) map.delete(key);
|
||
map.set(key, value);
|
||
if (map.size > maxSize) {
|
||
// Map 第一个键 = 最老
|
||
map.delete(map.keys().next().value);
|
||
}
|
||
},
|
||
has(key) { return map.has(key); },
|
||
get size() { return map.size; },
|
||
};
|
||
}
|
||
|
||
module.exports = { createLruCache };
|