function collectErrorText(err: unknown): string { const parts: string[] = [] let cur: unknown = err let depth = 0 while (cur != null && depth < 6) { if (typeof cur === 'string') { parts.push(cur) break } if (typeof cur === 'object') { const o = cur as Record if (typeof o.message === 'string') parts.push(o.message) if (typeof o.name === 'string') parts.push(o.name) if (typeof o.code !== 'undefined') parts.push(String(o.code)) cur = o.cause } else { parts.push(String(cur)) break } depth++ } return parts.join(' ').toLowerCase() } /** 腾讯云通话套餐/能力类错误常见码(如 wasm 日志 error_code:-1001) */ export const TUICALL_PACKAGE_ERROR_CODE = -1001 /** 是否为「套餐不含该能力 / 需续费」类错误(如 TUICallEngineError: The package you purchased does not support this ability) */ export function isTUICallPackageAbilityError(err: unknown): boolean { if (err && typeof err === 'object') { const o = err as Record const code = o.code ?? o.error_code if (code === TUICALL_PACKAGE_ERROR_CODE || code === String(TUICALL_PACKAGE_ERROR_CODE)) { return true } } const text = collectErrorText(err) return ( text.includes('does not support this ability') || text.includes('package you purchased') || (text.includes('-1001') && text.includes('does not support')) ) } /** 用户可见短文案 */ export function getTUICallPackageArrearsMessage(): string { return '套餐欠费或未开通该能力,请联系管理员在腾讯云续费或升级套餐。' } /** 发起通话等失败时:套餐类错误用友好文案,否则返回原始信息 */ export function formatTUICallUserError(err: unknown, defaultMessage = '通话操作失败'): string { if (isTUICallPackageAbilityError(err)) return getTUICallPackageArrearsMessage() if (err instanceof Error) return err.message || defaultMessage if (typeof err === 'string') return err || defaultMessage return defaultMessage }