风格化入口并发下载完整配置时,新建项目的响应可能超过前端超时限制,重复点击会产生多个空项目。现在未选项目时只加载轻量配置,进入项目后再加载完整风格配置;配置未变化时按更新时间返回 304,复用已加载数据。配置下载超时覆盖响应正文读取,完整配置保留 30 秒读取时间。 新建请求使用稳定的项目编号,数据库按主键去重;丢失响应后按编号核对结果,尚未确认时保留编号供重试和刷新恢复。已有项目的内容与账号归属检查保持有效。 验证:8 项专项测试通过,辅助测试 633 项通过、1 项原有跳过,TypeScript、改动文件 lint、日志脱敏、凭据、环境、元数据、测试和制品检查通过。全量 lint 仍有 1005 项历史诊断;发布构建和线上验收另行核对。
56 lines
1.4 KiB
TypeScript
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 };
|