56 行
1.9 KiB
TypeScript
56 行
1.9 KiB
TypeScript
|
|
import { z } from 'zod'
|
||
|
|
import type { XuqmRemoteConfig } from './config'
|
||
|
|
|
||
|
|
const flatRemoteConfigSchema = z.object({
|
||
|
|
apiUrl: z.string().optional(),
|
||
|
|
imApiUrl: z.string().optional(),
|
||
|
|
imWsUrl: z.string().optional(),
|
||
|
|
fileServiceUrl: z.string().optional(),
|
||
|
|
imEnabled: z.boolean().optional(),
|
||
|
|
pushEnabled: z.boolean().optional(),
|
||
|
|
bugCollectApiUrl: z.string().optional(),
|
||
|
|
bugCollectEnabled: z.boolean().optional(),
|
||
|
|
updateEnabled: z.boolean().optional(),
|
||
|
|
updateRequiresLogin: z.boolean().optional(),
|
||
|
|
})
|
||
|
|
|
||
|
|
const remoteConfigResponseSchema = flatRemoteConfigSchema
|
||
|
|
.extend({
|
||
|
|
allowAnonymousUpdateCheck: z.boolean().optional(),
|
||
|
|
features: z
|
||
|
|
.object({
|
||
|
|
im: z.boolean().optional(),
|
||
|
|
push: z.boolean().optional(),
|
||
|
|
bugCollect: z.boolean().optional(),
|
||
|
|
update: z.boolean().optional(),
|
||
|
|
})
|
||
|
|
.optional(),
|
||
|
|
})
|
||
|
|
.loose()
|
||
|
|
|
||
|
|
/** 平台远程配置的唯一归一化入口;features 字段优先于历史 flat 字段。 */
|
||
|
|
export function normalizeRemoteConfig(value: unknown): XuqmRemoteConfig {
|
||
|
|
const raw = remoteConfigResponseSchema.parse(value)
|
||
|
|
const features = raw.features ?? {}
|
||
|
|
return {
|
||
|
|
apiUrl: raw.apiUrl,
|
||
|
|
imApiUrl: raw.imApiUrl,
|
||
|
|
imWsUrl: raw.imWsUrl,
|
||
|
|
fileServiceUrl: raw.fileServiceUrl,
|
||
|
|
imEnabled: features.im ?? raw.imEnabled,
|
||
|
|
pushEnabled: features.push ?? raw.pushEnabled,
|
||
|
|
bugCollectApiUrl: raw.bugCollectApiUrl,
|
||
|
|
bugCollectEnabled: features.bugCollect ?? raw.bugCollectEnabled,
|
||
|
|
updateEnabled: features.update ?? raw.updateEnabled,
|
||
|
|
updateRequiresLogin:
|
||
|
|
raw.updateRequiresLogin ??
|
||
|
|
(raw.allowAnonymousUpdateCheck === undefined ? undefined : !raw.allowAnonymousUpdateCheck),
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/** 旧缓存允许缺少 updateEnabled,最终由 XuqmConfig 按安全默认 false 收敛。 */
|
||
|
|
export function parseCachedRemoteConfig(value: unknown): XuqmRemoteConfig | null {
|
||
|
|
const parsed = flatRemoteConfigSchema.safeParse(value)
|
||
|
|
return parsed.success ? parsed.data : null
|
||
|
|
}
|