// 前端公网配置客户端。 // 从 GET /api/public/config/profile?name=web-public-config 拉取运行时配置, // 包括 OSS 公网 base URL 与 logo URL。 // 按 AGENTS.md 规则 1/4/5:这些环境权威数据不硬编码在前端源码,由 API 下发。 // // 设计:进程内单例缓存 + promise 去重,App 启动时预加载一次, // 之后 getOssPublicBaseUrl() / getLogoUrl() 同步返回缓存值。 // API 不可用时回退到 FALLBACK 值(当前生产 bucket),保证渐进可用。 import { serverRequest } from "./serverConnection"; interface PublicConfigPayload { name: string; config: { ossPublicBaseUrl?: string; logoUrl?: string; }; description?: string; updatedAt?: string; } // Fallback:API 不可用或未加载时的兜底值,保证首屏不白屏。 // 这些值仅作为降级,正式来源是 API 返回的 config。 const FALLBACK_OSS_PUBLIC_BASE_URL = "https://stringtest.oss-cn-hangzhou.aliyuncs.com"; const FALLBACK_LOGO_URL = "https://stringtest.oss-cn-hangzhou.aliyuncs.com/muban/logo.png"; let cachedConfig: PublicConfigPayload["config"] | null = null; let loadPromise: Promise | null = null; async function fetchPublicConfig(): Promise { const payload = await serverRequest("public/config/profile?name=web-public-config", { // 公开端点,无需 token。 maxRetries: 2, fallbackMessage: "加载公网配置失败", }); return payload?.config ?? {}; } /** 预加载公网配置。App 启动时调用一次,后续同步读取缓存。可安全重复调用(promise 去重)。 */ export async function preloadPublicConfig(): Promise { if (loadPromise) return loadPromise.then(() => undefined); loadPromise = fetchPublicConfig() .then((config) => { cachedConfig = config; return config; }) .catch((error) => { // 加载失败不阻断启动,用 fallback 值;记录后允许后续重试。 console.warn("[publicConfig] 加载失败,使用 fallback 值", error); cachedConfig = null; loadPromise = null; return {}; }); return loadPromise.then(() => undefined); } /** 同步获取 OSS 公网 base URL。未加载时返回 fallback。 */ export function getOssPublicBaseUrl(): string { return cachedConfig?.ossPublicBaseUrl?.trim() || FALLBACK_OSS_PUBLIC_BASE_URL; } /** 同步获取 logo URL。未加载时返回 fallback。 */ export function getLogoUrl(): string { return cachedConfig?.logoUrl?.trim() || FALLBACK_LOGO_URL; }