You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
86 lines
4.9 KiB
86 lines
4.9 KiB
/**
|
|
* 配置解析模块 - 参数校验 + 默认值填充
|
|
*
|
|
* 参数映射:
|
|
* integrateId → 后端 roleId(客服角色 ID)
|
|
* userId → 后端 accountId(客户账号 ID)
|
|
* chatId → 自动管理(不在用户配置中暴露)
|
|
*/
|
|
import { SDKConfig, ResolvedConfig } from './types';
|
|
import { logger } from './logger';
|
|
|
|
/** 默认悬浮按钮图标 — E5 梦幻拖尾·全粒子:极光旋转渐变底 + 20 颗粒子系统 */
|
|
const DEFAULT_LAUNCHER_ICON = `<span class="csk-pt csk-pt-burst" style="--dx:-16px;--dy:-12px"></span><span class="csk-pt csk-pt-burst" style="--dx:16px;--dy:-10px"></span><span class="csk-pt csk-pt-burst" style="--dx:-14px;--dy:14px"></span><span class="csk-pt csk-pt-burst" style="--dx:13px;--dy:13px"></span><span class="csk-pt csk-pt-burst" style="--dx:0px;--dy:-18px"></span><span class="csk-pt csk-pt-burst" style="--dx:18px;--dy:3px"></span><span class="csk-pt csk-pt-burst" style="--dx:-18px;--dy:-3px"></span><span class="csk-pt csk-pt-burst" style="--dx:0px;--dy:16px"></span><span class="csk-pt csk-pt-float"></span><span class="csk-pt csk-pt-float"></span><span class="csk-pt csk-pt-float"></span><span class="csk-pt csk-pt-float"></span><span class="csk-pt csk-pt-pulse"></span><span class="csk-pt csk-pt-pulse"></span><span class="csk-pt csk-pt-elliptic"></span><span class="csk-pt csk-pt-elliptic"></span><span class="csk-pt csk-pt-ring"></span><span class="csk-pt csk-pt-ring"></span><span class="csk-pt csk-pt-ring"></span><span class="csk-pt csk-pt-ring"></span><span class="csk-sheen"></span><span class="csk-dual"></span>`;
|
|
|
|
/**
|
|
* 解析并校验用户传入的配置,填充默认值
|
|
*/
|
|
export function parseConfig(raw: SDKConfig): ResolvedConfig | null {
|
|
// 校验必传参数:integrateId(对应后端 roleId)
|
|
if (!raw.integrateId || (typeof raw.integrateId !== 'string' && typeof raw.integrateId !== 'number')
|
|
|| (typeof raw.integrateId === 'string' && raw.integrateId.trim() === '')) {
|
|
logger.error('integrateId 是必传参数(对应后端 roleId 客服角色 ID),请检查 init() 调用。示例:ChatbotSDK.init({ integrateId: 1, requestDomain: "https://api.example.com" })');
|
|
return null;
|
|
}
|
|
|
|
// 校验必传参数:requestDomain
|
|
if (!raw.requestDomain || typeof raw.requestDomain !== 'string' || raw.requestDomain.trim() === '') {
|
|
logger.error('requestDomain 是必传参数,请检查 init() 调用。示例:ChatbotSDK.init({ integrateId: 1, requestDomain: "https://api.example.com" })');
|
|
return null;
|
|
}
|
|
|
|
// 校验 requestDomain 是否为合法 URL 格式
|
|
try {
|
|
new URL(raw.requestDomain);
|
|
} catch {
|
|
logger.error(`requestDomain 不是合法的 URL 格式:${raw.requestDomain}。请提供完整的域名,如 https://api.example.com`);
|
|
return null;
|
|
}
|
|
|
|
// integrateId 统一转为字符串(后端 roleId 为 Long,但 query param 传字符串也可接收)
|
|
const integrateIdStr = String(raw.integrateId).trim();
|
|
|
|
// 解析图标:用户传入优先,否则使用默认极光粒子图标
|
|
const resolvedLauncherIcon = raw.launcherIcon || DEFAULT_LAUNCHER_ICON;
|
|
const resolvedPrimaryColor = raw.primaryColor || '#4F46E5';
|
|
|
|
// 填充默认值
|
|
const config: ResolvedConfig = {
|
|
integrateId: integrateIdStr,
|
|
requestDomain: raw.requestDomain.replace(/\/+$/, ''), // 去掉末尾斜杠
|
|
userId: raw.userId,
|
|
categoryId: raw.categoryId,
|
|
showCategorySwitch: raw.showCategorySwitch ?? false,
|
|
title: raw.title || 'AI 智能助手',
|
|
width: raw.width ?? 380,
|
|
height: Math.max(300, raw.height ?? 520),
|
|
position: raw.position === 'left-bottom' ? 'left-bottom' : 'right-bottom',
|
|
primaryColor: resolvedPrimaryColor,
|
|
launcherIcon: resolvedLauncherIcon,
|
|
showClear: raw.showClear ?? true,
|
|
showAdminPanel: raw.showAdminPanel ?? false,
|
|
quickReplies: Array.isArray(raw.quickReplies)
|
|
? raw.quickReplies.map(s => String(s).trim()).filter(Boolean)
|
|
: [],
|
|
theme: raw.theme === 'dark' ? 'dark' : 'light',
|
|
showTeaser: raw.showTeaser ?? true,
|
|
teaserText: (typeof raw.teaserText === 'string' && raw.teaserText.trim()) || '',
|
|
resizable: raw.resizable ?? true,
|
|
streaming: raw.streaming ?? true,
|
|
enableRag: raw.enableRag ?? true,
|
|
rewriteStrategy: raw.rewriteStrategy || 'REWRITE',
|
|
locale: raw.locale || 'zh-CN',
|
|
debug: raw.debug ?? true,
|
|
sound: raw.sound ?? false,
|
|
notification: raw.notification ?? false,
|
|
onError: typeof raw.onError === 'function' ? raw.onError : undefined,
|
|
onReady: typeof raw.onReady === 'function' ? raw.onReady : undefined,
|
|
onMessage: typeof raw.onMessage === 'function' ? raw.onMessage : undefined,
|
|
token: raw.token,
|
|
roles: raw.roles,
|
|
chatId: '', // 初始为空,由 chatId 初始化流程填充
|
|
};
|
|
|
|
logger.info(`配置解析完成 integrateId(=roleId)=${config.integrateId} userId(=accountId)=${config.userId || '(未设置)'} requestDomain=${config.requestDomain}`);
|
|
return config;
|
|
}
|