ai-chatbot/lib/site-settings/public-cache.ts
WuYongJie 70f954382a 减轻风格化入口加载并防止新建项目超时重复创建
风格化入口并发下载完整配置时,新建项目的响应可能超过前端超时限制,重复点击会产生多个空项目。现在未选项目时只加载轻量配置,进入项目后再加载完整风格配置;配置未变化时按更新时间返回 304,复用已加载数据。配置下载超时覆盖响应正文读取,完整配置保留 30 秒读取时间。

新建请求使用稳定的项目编号,数据库按主键去重;丢失响应后按编号核对结果,尚未确认时保留编号供重试和刷新恢复。已有项目的内容与账号归属检查保持有效。

验证:8 项专项测试通过,辅助测试 633 项通过、1 项原有跳过,TypeScript、改动文件 lint、日志脱敏、凭据、环境、元数据、测试和制品检查通过。全量 lint 仍有 1005 项历史诊断;发布构建和线上验收另行核对。
2026-11-04 09:46:45 +08:00

56 lines
1.4 KiB
TypeScript

const PUBLIC_SITE_SETTINGS_CACHE_TTL_MS = 30_000;
const PUBLIC_SITE_SETTINGS_CACHE_KEY = Symbol.for(
"ai-chatbot.public-site-settings-cache",
);
type PublicSiteSettingsCacheEntry = {
data: Record<string, unknown>;
expiresAt: number;
etag?: string;
};
function getPublicSiteSettingsCacheStore() {
const globalCache = globalThis as typeof globalThis & {
[PUBLIC_SITE_SETTINGS_CACHE_KEY]?: Map<
string,
PublicSiteSettingsCacheEntry
>;
};
if (!globalCache[PUBLIC_SITE_SETTINGS_CACHE_KEY]) {
globalCache[PUBLIC_SITE_SETTINGS_CACHE_KEY] = new Map<
string,
PublicSiteSettingsCacheEntry
>();
}
return globalCache[PUBLIC_SITE_SETTINGS_CACHE_KEY]!;
}
export function getScopedSiteSettingsCache(cacheKey: string) {
return getPublicSiteSettingsCacheStore().get(cacheKey) ?? null;
}
export function setScopedSiteSettingsCache(
cacheKey: string,
data: Record<string, unknown>,
ttlMs: number = PUBLIC_SITE_SETTINGS_CACHE_TTL_MS,
etag?: string,
) {
getPublicSiteSettingsCacheStore().set(cacheKey, {
data,
expiresAt: Date.now() + ttlMs,
etag,
});
}
export function deleteScopedSiteSettingsCache(cacheKey: string) {
getPublicSiteSettingsCacheStore().delete(cacheKey);
}
export function clearScopedSiteSettingsCache() {
getPublicSiteSettingsCacheStore().clear();
}
export { PUBLIC_SITE_SETTINGS_CACHE_TTL_MS };