66 lines
2.5 KiB
TypeScript
66 lines
2.5 KiB
TypeScript
// 前端公网配置客户端。
|
|
// 从 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<PublicConfigPayload["config"]> | null = null;
|
|
|
|
async function fetchPublicConfig(): Promise<PublicConfigPayload["config"]> {
|
|
const payload = await serverRequest<PublicConfigPayload>("public/config/profile?name=web-public-config", {
|
|
// 公开端点,无需 token。
|
|
maxRetries: 2,
|
|
fallbackMessage: "加载公网配置失败",
|
|
});
|
|
return payload?.config ?? {};
|
|
}
|
|
|
|
/** 预加载公网配置。App 启动时调用一次,后续同步读取缓存。可安全重复调用(promise 去重)。 */
|
|
export async function preloadPublicConfig(): Promise<void> {
|
|
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;
|
|
}
|