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

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

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

25 lines
866 B
TypeScript

const settingsCache = new Map<string, { etag: string; data: unknown }>();
export async function fetchCanvasSiteSettings(url: string) {
const cached = settingsCache.get(url);
const controller = new AbortController();
const timeoutId = setTimeout(
() => controller.abort(),
url === "/api/site-settings?scope=agent-canvas" ? 30_000 : 10_000
);
try {
const response = await fetch(url, {
headers: cached ? { "If-None-Match": cached.etag } : undefined,
signal: controller.signal,
});
if (response.status === 304 && cached) return cached.data;
if (!response.ok) throw new Error("Failed to fetch canvas site settings");
const data = await response.json();
const etag = response.headers.get("ETag");
if (etag) settingsCache.set(url, { etag, data });
return data;
} finally {
clearTimeout(timeoutId);
}
}