pcm-agents 0.5.5 → 0.5.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/dist/cjs/{config.store-CKEkFvrj.js → config.store-D6bSL0Ny.js} +3 -3
  2. package/dist/cjs/{config.store-CKEkFvrj.js.map → config.store-D6bSL0Ny.js.map} +1 -1
  3. package/dist/cjs/{index-mS6rAdT-.js → index-CSrasZsM.js} +47 -5
  4. package/dist/cjs/index-CSrasZsM.js.map +1 -0
  5. package/dist/cjs/index.cjs.js +1 -1
  6. package/dist/cjs/pcm-1zhanshi-mnms-modal_17.cjs.entry.js +2 -2
  7. package/dist/cjs/pcm-mnms-video-modal.cjs.entry.js +2 -2
  8. package/dist/cjs/pcm-mnms-zp-modal.cjs.entry.js +2 -2
  9. package/dist/collection/utils/utils.js +51 -3
  10. package/dist/collection/utils/utils.js.map +1 -1
  11. package/dist/components/index.js +45 -3
  12. package/dist/components/index.js.map +1 -1
  13. package/dist/esm/{config.store-DxgEmx8e.js → config.store-DH12tJ7a.js} +3 -3
  14. package/dist/esm/{config.store-DxgEmx8e.js.map → config.store-DH12tJ7a.js.map} +1 -1
  15. package/dist/esm/{index-C70tZyK5.js → index-Nkad66qo.js} +47 -5
  16. package/dist/esm/index-Nkad66qo.js.map +1 -0
  17. package/dist/esm/index.js +1 -1
  18. package/dist/esm/pcm-1zhanshi-mnms-modal_17.entry.js +2 -2
  19. package/dist/esm/pcm-mnms-video-modal.entry.js +2 -2
  20. package/dist/esm/pcm-mnms-zp-modal.entry.js +2 -2
  21. package/dist/pcm-agents/index.esm.js +1 -1
  22. package/dist/pcm-agents/{p-c38c4e71.entry.js → p-653c1be5.entry.js} +2 -2
  23. package/dist/pcm-agents/{p-D5LurcVu.js → p-Ba5-0ra8.js} +2 -2
  24. package/dist/pcm-agents/{p-D5LurcVu.js.map → p-Ba5-0ra8.js.map} +1 -1
  25. package/dist/pcm-agents/p-CUmmX60i.js +2 -0
  26. package/dist/pcm-agents/p-CUmmX60i.js.map +1 -0
  27. package/dist/pcm-agents/{p-6e0c2254.entry.js → p-a1eb7672.entry.js} +2 -2
  28. package/dist/pcm-agents/{p-ba6f589c.entry.js → p-aa072467.entry.js} +2 -2
  29. package/dist/pcm-agents/pcm-agents.esm.js +1 -1
  30. package/package.json +1 -1
  31. package/dist/cjs/index-mS6rAdT-.js.map +0 -1
  32. package/dist/esm/index-C70tZyK5.js.map +0 -1
  33. package/dist/pcm-agents/p-CvwVC5Ba.js +0 -2
  34. package/dist/pcm-agents/p-CvwVC5Ba.js.map +0 -1
  35. /package/dist/pcm-agents/{p-c38c4e71.entry.js.map → p-653c1be5.entry.js.map} +0 -0
  36. /package/dist/pcm-agents/{p-6e0c2254.entry.js.map → p-a1eb7672.entry.js.map} +0 -0
  37. /package/dist/pcm-agents/{p-ba6f589c.entry.js.map → p-aa072467.entry.js.map} +0 -0
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./index-mS6rAdT-.js');
3
+ var index = require('./index-CSrasZsM.js');
4
4
 
5
5
  class ErrorEventBus {
6
6
  /**
@@ -94,6 +94,6 @@ onChange('data', value => {
94
94
 
95
95
  exports.ErrorEventBus = ErrorEventBus;
96
96
  exports.configStore = configStore;
97
- //# sourceMappingURL=config.store-CKEkFvrj.js.map
97
+ //# sourceMappingURL=config.store-D6bSL0Ny.js.map
98
98
 
99
- //# sourceMappingURL=config.store-CKEkFvrj.js.map
99
+ //# sourceMappingURL=config.store-D6bSL0Ny.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.store-CKEkFvrj.js","sources":["src/utils/error-event.ts","store/config.store.ts"],"sourcesContent":["export interface ErrorEventDetail {\r\n source: string;\r\n error: any;\r\n message: string;\r\n type: 'api' | 'ui' | 'network' | 'other';\r\n}\r\n\r\nexport class ErrorEventBus {\r\n /**\r\n * 触发错误事件\r\n */\r\n static emitError(detail: ErrorEventDetail): void {\r\n const event = new CustomEvent('pcm-error', {\r\n bubbles: true,\r\n composed: true,\r\n detail\r\n });\r\n document.dispatchEvent(event);\r\n }\r\n\r\n /**\r\n * 添加错误事件监听器\r\n */\r\n static addErrorListener(callback: (detail: ErrorEventDetail) => void): () => void {\r\n const handler = (event: CustomEvent<ErrorEventDetail>) => {\r\n callback(event.detail);\r\n };\r\n \r\n document.addEventListener('pcm-error', handler as EventListener);\r\n \r\n // 返回移除监听器的函数\r\n return () => {\r\n document.removeEventListener('pcm-error', handler as EventListener);\r\n };\r\n }\r\n} ","import { createStore } from '@stencil/store';\r\n\r\n// 定义配置数据的类型\r\nexport interface ConfigData {\r\n [key: string]: any;\r\n}\r\n\r\n// 从localStorage获取初始配置\r\nconst getInitialConfig = (): ConfigData => {\r\n try {\r\n const storedConfig = localStorage.getItem('pcm-sdk-config-data');\r\n return storedConfig ? JSON.parse(storedConfig) : {};\r\n } catch (error) {\r\n console.error('Error parsing stored config:', error);\r\n return {};\r\n }\r\n};\r\n\r\n// 创建配置存储\r\nexport const { state: configState, onChange } = createStore<{\r\n data: ConfigData;\r\n}>({\r\n data: getInitialConfig()\r\n});\r\n\r\n// 配置存储的辅助方法\r\nexport const configStore = {\r\n // 获取整个配置对象\r\n getConfig: (): ConfigData => configState.data,\r\n \r\n // 获取特定配置项\r\n getItem: <T>(key: string, defaultValue?: T): T => {\r\n return configState.data[key] !== undefined ? configState.data[key] : defaultValue;\r\n },\r\n \r\n // 设置特定配置项\r\n setItem: <T>(key: string, value: T): void => {\r\n configState.data = {\r\n ...configState.data,\r\n [key]: value\r\n };\r\n },\r\n \r\n // 移除特定配置项\r\n removeItem: (key: string): void => {\r\n const newConfig = { ...configState.data };\r\n delete newConfig[key];\r\n configState.data = newConfig;\r\n },\r\n \r\n // 清除所有配置\r\n clear: (): void => {\r\n configState.data = {};\r\n },\r\n \r\n // 批量更新配置\r\n updateConfig: (newConfig: Partial<ConfigData>): void => {\r\n configState.data = {\r\n ...configState.data,\r\n ...newConfig\r\n };\r\n }\r\n};\r\n\r\n// 自动保存到localStorage\r\nonChange('data', value => {\r\n try {\r\n if (Object.keys(value).length > 0) {\r\n localStorage.setItem('pcm-sdk-config-data', JSON.stringify(value));\r\n } else {\r\n localStorage.removeItem('pcm-sdk-config-data');\r\n }\r\n } catch (error) {\r\n console.error('Error saving config to localStorage:', error);\r\n }\r\n}); "],"names":["createStore"],"mappings":";;;;MAOa,aAAa,CAAA;AACxB;;AAEG;IACH,OAAO,SAAS,CAAC,MAAwB,EAAA;AACvC,QAAA,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,WAAW,EAAE;AACzC,YAAA,OAAO,EAAE,IAAI;AACb,YAAA,QAAQ,EAAE,IAAI;YACd;AACD,SAAA,CAAC;AACF,QAAA,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;;AAG/B;;AAEG;IACH,OAAO,gBAAgB,CAAC,QAA4C,EAAA;AAClE,QAAA,MAAM,OAAO,GAAG,CAAC,KAAoC,KAAI;AACvD,YAAA,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;AACxB,SAAC;AAED,QAAA,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,OAAwB,CAAC;;AAGhE,QAAA,OAAO,MAAK;AACV,YAAA,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,OAAwB,CAAC;AACrE,SAAC;;AAEJ;;AC5BD;AACA,MAAM,gBAAgB,GAAG,MAAiB;AACxC,IAAA,IAAI;QACF,MAAM,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,qBAAqB,CAAC;AAChE,QAAA,OAAO,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,EAAE;;IACnD,OAAO,KAAK,EAAE;AACd,QAAA,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC;AACpD,QAAA,OAAO,EAAE;;AAEb,CAAC;AAED;AACO,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAGA,iBAAW,CAExD;IACD,IAAI,EAAE,gBAAgB;AACvB,CAAA,CAAC;AAEF;AACa,MAAA,WAAW,GAAG;;AAEzB,IAAA,SAAS,EAAE,MAAkB,WAAW,CAAC,IAAI;;AAG7C,IAAA,OAAO,EAAE,CAAI,GAAW,EAAE,YAAgB,KAAO;QAC/C,OAAO,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,YAAY;KAClF;;AAGD,IAAA,OAAO,EAAE,CAAI,GAAW,EAAE,KAAQ,KAAU;QAC1C,WAAW,CAAC,IAAI,GAAG;YACjB,GAAG,WAAW,CAAC,IAAI;YACnB,CAAC,GAAG,GAAG;SACR;KACF;;AAGD,IAAA,UAAU,EAAE,CAAC,GAAW,KAAU;QAChC,MAAM,SAAS,GAAG,EAAE,GAAG,WAAW,CAAC,IAAI,EAAE;AACzC,QAAA,OAAO,SAAS,CAAC,GAAG,CAAC;AACrB,QAAA,WAAW,CAAC,IAAI,GAAG,SAAS;KAC7B;;IAGD,KAAK,EAAE,MAAW;AAChB,QAAA,WAAW,CAAC,IAAI,GAAG,EAAE;KACtB;;AAGD,IAAA,YAAY,EAAE,CAAC,SAA8B,KAAU;QACrD,WAAW,CAAC,IAAI,GAAG;YACjB,GAAG,WAAW,CAAC,IAAI;AACnB,YAAA,GAAG;SACJ;;;AAIL;AACA,QAAQ,CAAC,MAAM,EAAE,KAAK,IAAG;AACvB,IAAA,IAAI;QACF,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;AACjC,YAAA,YAAY,CAAC,OAAO,CAAC,qBAAqB,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;;aAC7D;AACL,YAAA,YAAY,CAAC,UAAU,CAAC,qBAAqB,CAAC;;;IAEhD,OAAO,KAAK,EAAE;AACd,QAAA,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,KAAK,CAAC;;AAEhE,CAAC,CAAC;;;;;"}
1
+ {"version":3,"file":"config.store-D6bSL0Ny.js","sources":["src/utils/error-event.ts","store/config.store.ts"],"sourcesContent":["export interface ErrorEventDetail {\r\n source: string;\r\n error: any;\r\n message: string;\r\n type: 'api' | 'ui' | 'network' | 'other';\r\n}\r\n\r\nexport class ErrorEventBus {\r\n /**\r\n * 触发错误事件\r\n */\r\n static emitError(detail: ErrorEventDetail): void {\r\n const event = new CustomEvent('pcm-error', {\r\n bubbles: true,\r\n composed: true,\r\n detail\r\n });\r\n document.dispatchEvent(event);\r\n }\r\n\r\n /**\r\n * 添加错误事件监听器\r\n */\r\n static addErrorListener(callback: (detail: ErrorEventDetail) => void): () => void {\r\n const handler = (event: CustomEvent<ErrorEventDetail>) => {\r\n callback(event.detail);\r\n };\r\n \r\n document.addEventListener('pcm-error', handler as EventListener);\r\n \r\n // 返回移除监听器的函数\r\n return () => {\r\n document.removeEventListener('pcm-error', handler as EventListener);\r\n };\r\n }\r\n} ","import { createStore } from '@stencil/store';\r\n\r\n// 定义配置数据的类型\r\nexport interface ConfigData {\r\n [key: string]: any;\r\n}\r\n\r\n// 从localStorage获取初始配置\r\nconst getInitialConfig = (): ConfigData => {\r\n try {\r\n const storedConfig = localStorage.getItem('pcm-sdk-config-data');\r\n return storedConfig ? JSON.parse(storedConfig) : {};\r\n } catch (error) {\r\n console.error('Error parsing stored config:', error);\r\n return {};\r\n }\r\n};\r\n\r\n// 创建配置存储\r\nexport const { state: configState, onChange } = createStore<{\r\n data: ConfigData;\r\n}>({\r\n data: getInitialConfig()\r\n});\r\n\r\n// 配置存储的辅助方法\r\nexport const configStore = {\r\n // 获取整个配置对象\r\n getConfig: (): ConfigData => configState.data,\r\n \r\n // 获取特定配置项\r\n getItem: <T>(key: string, defaultValue?: T): T => {\r\n return configState.data[key] !== undefined ? configState.data[key] : defaultValue;\r\n },\r\n \r\n // 设置特定配置项\r\n setItem: <T>(key: string, value: T): void => {\r\n configState.data = {\r\n ...configState.data,\r\n [key]: value\r\n };\r\n },\r\n \r\n // 移除特定配置项\r\n removeItem: (key: string): void => {\r\n const newConfig = { ...configState.data };\r\n delete newConfig[key];\r\n configState.data = newConfig;\r\n },\r\n \r\n // 清除所有配置\r\n clear: (): void => {\r\n configState.data = {};\r\n },\r\n \r\n // 批量更新配置\r\n updateConfig: (newConfig: Partial<ConfigData>): void => {\r\n configState.data = {\r\n ...configState.data,\r\n ...newConfig\r\n };\r\n }\r\n};\r\n\r\n// 自动保存到localStorage\r\nonChange('data', value => {\r\n try {\r\n if (Object.keys(value).length > 0) {\r\n localStorage.setItem('pcm-sdk-config-data', JSON.stringify(value));\r\n } else {\r\n localStorage.removeItem('pcm-sdk-config-data');\r\n }\r\n } catch (error) {\r\n console.error('Error saving config to localStorage:', error);\r\n }\r\n}); "],"names":["createStore"],"mappings":";;;;MAOa,aAAa,CAAA;AACxB;;AAEG;IACH,OAAO,SAAS,CAAC,MAAwB,EAAA;AACvC,QAAA,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,WAAW,EAAE;AACzC,YAAA,OAAO,EAAE,IAAI;AACb,YAAA,QAAQ,EAAE,IAAI;YACd;AACD,SAAA,CAAC;AACF,QAAA,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;;AAG/B;;AAEG;IACH,OAAO,gBAAgB,CAAC,QAA4C,EAAA;AAClE,QAAA,MAAM,OAAO,GAAG,CAAC,KAAoC,KAAI;AACvD,YAAA,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;AACxB,SAAC;AAED,QAAA,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,OAAwB,CAAC;;AAGhE,QAAA,OAAO,MAAK;AACV,YAAA,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,OAAwB,CAAC;AACrE,SAAC;;AAEJ;;AC5BD;AACA,MAAM,gBAAgB,GAAG,MAAiB;AACxC,IAAA,IAAI;QACF,MAAM,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,qBAAqB,CAAC;AAChE,QAAA,OAAO,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,EAAE;;IACnD,OAAO,KAAK,EAAE;AACd,QAAA,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC;AACpD,QAAA,OAAO,EAAE;;AAEb,CAAC;AAED;AACO,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAGA,iBAAW,CAExD;IACD,IAAI,EAAE,gBAAgB;AACvB,CAAA,CAAC;AAEF;AACa,MAAA,WAAW,GAAG;;AAEzB,IAAA,SAAS,EAAE,MAAkB,WAAW,CAAC,IAAI;;AAG7C,IAAA,OAAO,EAAE,CAAI,GAAW,EAAE,YAAgB,KAAO;QAC/C,OAAO,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,YAAY;KAClF;;AAGD,IAAA,OAAO,EAAE,CAAI,GAAW,EAAE,KAAQ,KAAU;QAC1C,WAAW,CAAC,IAAI,GAAG;YACjB,GAAG,WAAW,CAAC,IAAI;YACnB,CAAC,GAAG,GAAG;SACR;KACF;;AAGD,IAAA,UAAU,EAAE,CAAC,GAAW,KAAU;QAChC,MAAM,SAAS,GAAG,EAAE,GAAG,WAAW,CAAC,IAAI,EAAE;AACzC,QAAA,OAAO,SAAS,CAAC,GAAG,CAAC;AACrB,QAAA,WAAW,CAAC,IAAI,GAAG,SAAS;KAC7B;;IAGD,KAAK,EAAE,MAAW;AAChB,QAAA,WAAW,CAAC,IAAI,GAAG,EAAE;KACtB;;AAGD,IAAA,YAAY,EAAE,CAAC,SAA8B,KAAU;QACrD,WAAW,CAAC,IAAI,GAAG;YACjB,GAAG,WAAW,CAAC,IAAI;AACnB,YAAA,GAAG;SACJ;;;AAIL;AACA,QAAQ,CAAC,MAAM,EAAE,KAAK,IAAG;AACvB,IAAA,IAAI;QACF,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;AACjC,YAAA,YAAY,CAAC,OAAO,CAAC,qBAAqB,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;;aAC7D;AACL,YAAA,YAAY,CAAC,UAAU,CAAC,qBAAqB,CAAC;;;IAEhD,OAAO,KAAK,EAAE;AACd,QAAA,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,KAAK,CAAC;;AAEhE,CAAC,CAAC;;;;;"}
@@ -233,6 +233,36 @@ function format(first, middle, last) {
233
233
  const getEffectiveToken = () => {
234
234
  return authStore.getToken() || '';
235
235
  };
236
+ /**
237
+ * 请求超时时间(毫秒)
238
+ */
239
+ const REQUEST_TIMEOUT = 2 * 60 * 1000; // 2分钟
240
+ /**
241
+ * 创建带超时的 fetch 请求
242
+ * @param url 请求URL
243
+ * @param options fetch选项
244
+ * @param timeout 超时时间(毫秒)
245
+ * @returns Promise<Response>
246
+ */
247
+ const fetchWithTimeout = async (url, options, timeout = REQUEST_TIMEOUT) => {
248
+ const controller = new AbortController();
249
+ const timeoutId = setTimeout(() => controller.abort(), timeout);
250
+ try {
251
+ const response = await fetch(url, {
252
+ ...options,
253
+ signal: controller.signal,
254
+ });
255
+ clearTimeout(timeoutId);
256
+ return response;
257
+ }
258
+ catch (error) {
259
+ clearTimeout(timeoutId);
260
+ if (error instanceof Error && error.name === 'AbortError') {
261
+ throw new Error('请求超时,请检查网络连接后重试');
262
+ }
263
+ throw error;
264
+ }
265
+ };
236
266
  /**
237
267
  * 发送 SSE 流式请求
238
268
  * @param config 请求配置
@@ -251,7 +281,7 @@ const sendSSERequest = async (config, isRetry = false) => {
251
281
  headers['authorization'] = `Bearer ${token}`;
252
282
  }
253
283
  }
254
- const response = await fetch(requestUrl, {
284
+ const response = await fetchWithTimeout(requestUrl, {
255
285
  method,
256
286
  headers: {
257
287
  'Accept': 'text/event-stream',
@@ -304,6 +334,10 @@ const sendSSERequest = async (config, isRetry = false) => {
304
334
  }
305
335
  catch (error) {
306
336
  console.error('SSE 请求错误:', error);
337
+ // 如果是超时错误且不是重试请求,则重试一次
338
+ if (error instanceof Error && error.message.includes('请求超时') && !isRetry) {
339
+ return sendSSERequest(config, true);
340
+ }
307
341
  onError?.(error);
308
342
  }
309
343
  };
@@ -370,7 +404,7 @@ const sendHttpRequest = async (config, isRetry = true) => {
370
404
  });
371
405
  requestUrl += (queryParams.toString() ? '&' : '?') + dataParams.toString();
372
406
  }
373
- const response = await fetch(requestUrl, requestConfig);
407
+ const response = await fetchWithTimeout(requestUrl, requestConfig);
374
408
  // 检查是否为401错误(未授权)
375
409
  if (response.status === 401) {
376
410
  // 触发全局token无效事件
@@ -411,6 +445,10 @@ const sendHttpRequest = async (config, isRetry = true) => {
411
445
  }
412
446
  catch (error) {
413
447
  console.error('HTTP请求错误:', error);
448
+ // 如果是超时错误且允许重试,则重试一次
449
+ if (error instanceof Error && error.message.includes('请求超时') && isRetry) {
450
+ return sendHttpRequest(config, false);
451
+ }
414
452
  if (config.onError) {
415
453
  config.onError(error);
416
454
  }
@@ -522,7 +560,7 @@ const synthesizeAudio = async (text, token, isRetry = false) => {
522
560
  throw new Error('API密钥不能为空');
523
561
  }
524
562
  try {
525
- const response = await fetch(`${API_DOMAIN}/sdk/v1/tts/synthesize_audio`, {
563
+ const response = await fetchWithTimeout(`${API_DOMAIN}/sdk/v1/tts/synthesize_audio`, {
526
564
  method: 'POST',
527
565
  headers: {
528
566
  'Content-Type': 'application/json',
@@ -548,6 +586,10 @@ const synthesizeAudio = async (text, token, isRetry = false) => {
548
586
  }
549
587
  catch (error) {
550
588
  console.error('语音合成错误:', error);
589
+ // 如果是超时错误且不是重试请求,则重试一次
590
+ if (error instanceof Error && error.message.includes('请求超时') && !isRetry) {
591
+ return synthesizeAudio(text, token, true);
592
+ }
551
593
  throw error;
552
594
  }
553
595
  };
@@ -561,6 +603,6 @@ exports.sendSSERequest = sendSSERequest;
561
603
  exports.synthesizeAudio = synthesizeAudio;
562
604
  exports.uploadFileToBackend = uploadFileToBackend;
563
605
  exports.verifyApiKey = verifyApiKey;
564
- //# sourceMappingURL=index-mS6rAdT-.js.map
606
+ //# sourceMappingURL=index-CSrasZsM.js.map
565
607
 
566
- //# sourceMappingURL=index-mS6rAdT-.js.map
608
+ //# sourceMappingURL=index-CSrasZsM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-CSrasZsM.js","sources":["src/utils/env.ts","node_modules/.pnpm/@stencil+store@2.1.3_@stencil+core@4.31.0/node_modules/@stencil/store/dist/index.js","store/auth.store.ts"],"sourcesContent":["// 默认 API 域名\r\nconst DEFAULT_API_DOMAIN = 'https://api.pincaimao.com/agents/platform';\r\n\r\n// 从环境变量获取 API 域名,如果未设置则使用默认值\r\nexport const API_DOMAIN = process.env.API_DOMAIN || DEFAULT_API_DOMAIN;\r\n\r\n// 导出其他环境变量\r\nexport const ENV = {\r\n API_DOMAIN,\r\n // 可以添加其他环境变量\r\n}; ","import { getRenderingRef, forceUpdate } from '@stencil/core';\n\nconst appendToMap = (map, propName, value) => {\n const items = map.get(propName);\n if (!items) {\n map.set(propName, [value]);\n }\n else if (!items.includes(value)) {\n items.push(value);\n }\n};\nconst debounce = (fn, ms) => {\n let timeoutId;\n return (...args) => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n timeoutId = setTimeout(() => {\n timeoutId = 0;\n fn(...args);\n }, ms);\n };\n};\n\n/**\n * Check if a possible element isConnected.\n * The property might not be there, so we check for it.\n *\n * We want it to return true if isConnected is not a property,\n * otherwise we would remove these elements and would not update.\n *\n * Better leak in Edge than to be useless.\n */\nconst isConnected = (maybeElement) => !('isConnected' in maybeElement) || maybeElement.isConnected;\nconst cleanupElements = debounce((map) => {\n for (let key of map.keys()) {\n map.set(key, map.get(key).filter(isConnected));\n }\n}, 2_000);\nconst stencilSubscription = () => {\n if (typeof getRenderingRef !== 'function') {\n // If we are not in a stencil project, we do nothing.\n // This function is not really exported by @stencil/core.\n return {};\n }\n const elmsToUpdate = new Map();\n return {\n dispose: () => elmsToUpdate.clear(),\n get: (propName) => {\n const elm = getRenderingRef();\n if (elm) {\n appendToMap(elmsToUpdate, propName, elm);\n }\n },\n set: (propName) => {\n const elements = elmsToUpdate.get(propName);\n if (elements) {\n elmsToUpdate.set(propName, elements.filter(forceUpdate));\n }\n cleanupElements(elmsToUpdate);\n },\n reset: () => {\n elmsToUpdate.forEach((elms) => elms.forEach(forceUpdate));\n cleanupElements(elmsToUpdate);\n },\n };\n};\n\nconst unwrap = (val) => (typeof val === 'function' ? val() : val);\nconst createObservableMap = (defaultState, shouldUpdate = (a, b) => a !== b) => {\n const unwrappedState = unwrap(defaultState);\n let states = new Map(Object.entries(unwrappedState ?? {}));\n const handlers = {\n dispose: [],\n get: [],\n set: [],\n reset: [],\n };\n const reset = () => {\n // When resetting the state, the default state may be a function - unwrap it to invoke it.\n // otherwise, the state won't be properly reset\n states = new Map(Object.entries(unwrap(defaultState) ?? {}));\n handlers.reset.forEach((cb) => cb());\n };\n const dispose = () => {\n // Call first dispose as resetting the state would\n // cause less updates ;)\n handlers.dispose.forEach((cb) => cb());\n reset();\n };\n const get = (propName) => {\n handlers.get.forEach((cb) => cb(propName));\n return states.get(propName);\n };\n const set = (propName, value) => {\n const oldValue = states.get(propName);\n if (shouldUpdate(value, oldValue, propName)) {\n states.set(propName, value);\n handlers.set.forEach((cb) => cb(propName, value, oldValue));\n }\n };\n const state = (typeof Proxy === 'undefined'\n ? {}\n : new Proxy(unwrappedState, {\n get(_, propName) {\n return get(propName);\n },\n ownKeys(_) {\n return Array.from(states.keys());\n },\n getOwnPropertyDescriptor() {\n return {\n enumerable: true,\n configurable: true,\n };\n },\n has(_, propName) {\n return states.has(propName);\n },\n set(_, propName, value) {\n set(propName, value);\n return true;\n },\n }));\n const on = (eventName, callback) => {\n handlers[eventName].push(callback);\n return () => {\n removeFromArray(handlers[eventName], callback);\n };\n };\n const onChange = (propName, cb) => {\n const unSet = on('set', (key, newValue) => {\n if (key === propName) {\n cb(newValue);\n }\n });\n // We need to unwrap the defaultState because it might be a function.\n // Otherwise we might not be sending the right reset value.\n const unReset = on('reset', () => cb(unwrap(defaultState)[propName]));\n return () => {\n unSet();\n unReset();\n };\n };\n const use = (...subscriptions) => {\n const unsubs = subscriptions.reduce((unsubs, subscription) => {\n if (subscription.set) {\n unsubs.push(on('set', subscription.set));\n }\n if (subscription.get) {\n unsubs.push(on('get', subscription.get));\n }\n if (subscription.reset) {\n unsubs.push(on('reset', subscription.reset));\n }\n if (subscription.dispose) {\n unsubs.push(on('dispose', subscription.dispose));\n }\n return unsubs;\n }, []);\n return () => unsubs.forEach((unsub) => unsub());\n };\n const forceUpdate = (key) => {\n const oldValue = states.get(key);\n handlers.set.forEach((cb) => cb(key, oldValue, oldValue));\n };\n return {\n state,\n get,\n set,\n on,\n onChange,\n use,\n dispose,\n reset,\n forceUpdate,\n };\n};\nconst removeFromArray = (array, item) => {\n const index = array.indexOf(item);\n if (index >= 0) {\n array[index] = array[array.length - 1];\n array.length--;\n }\n};\n\nconst createStore = (defaultState, shouldUpdate) => {\n const map = createObservableMap(defaultState, shouldUpdate);\n map.use(stencilSubscription());\n return map;\n};\n\nexport { createObservableMap, createStore };\n","// src/store/auth.store.ts\r\nimport { createStore } from '@stencil/store';\r\n\r\nexport const { state: authState, onChange } = createStore({\r\n token: localStorage.getItem('pcm-sdk-auth-token') || null\r\n});\r\n\r\n// 添加一些辅助方法\r\nexport const authStore = {\r\n getToken: () => authState.token,\r\n setToken: (token: string) => {\r\n authState.token = token;\r\n localStorage.setItem('pcm-sdk-auth-token', token);\r\n },\r\n clearToken: () => {\r\n authState.token = null;\r\n localStorage.removeItem('pcm-sdk-auth-token');\r\n }\r\n};\r\n\r\n// 自动保存到localStorage\r\nonChange('token', value => {\r\n if (value) {\r\n localStorage.setItem('pcm-sdk-auth-token', value);\r\n } else {\r\n localStorage.removeItem('pcm-sdk-auth-token');\r\n }\r\n});"],"names":["getRenderingRef","forceUpdate"],"mappings":"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","x_google_ignoreList":[1]}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var index = require('./index-mS6rAdT-.js');
3
+ var index = require('./index-CSrasZsM.js');
4
4
  require('./index-C_qhED9Z.js');
5
5
 
6
6
 
@@ -1,8 +1,8 @@
1
1
  'use strict';
2
2
 
3
3
  var index = require('./index-C_qhED9Z.js');
4
- var index$1 = require('./index-mS6rAdT-.js');
5
- var config_store = require('./config.store-CKEkFvrj.js');
4
+ var index$1 = require('./index-CSrasZsM.js');
5
+ var config_store = require('./config.store-D6bSL0Ny.js');
6
6
 
7
7
  const pcm1zhanshiMnmsModalCss = "";
8
8
 
@@ -1,8 +1,8 @@
1
1
  'use strict';
2
2
 
3
3
  var index = require('./index-C_qhED9Z.js');
4
- var index$1 = require('./index-mS6rAdT-.js');
5
- var config_store = require('./config.store-CKEkFvrj.js');
4
+ var index$1 = require('./index-CSrasZsM.js');
5
+ var config_store = require('./config.store-D6bSL0Ny.js');
6
6
 
7
7
  const pcmMnmsVideoModalCss = "";
8
8
 
@@ -1,8 +1,8 @@
1
1
  'use strict';
2
2
 
3
3
  var index = require('./index-C_qhED9Z.js');
4
- var index$1 = require('./index-mS6rAdT-.js');
5
- var config_store = require('./config.store-CKEkFvrj.js');
4
+ var index$1 = require('./index-CSrasZsM.js');
5
+ var config_store = require('./config.store-D6bSL0Ny.js');
6
6
 
7
7
  const pcmMnmsZpModalCss = "";
8
8
 
@@ -44,6 +44,36 @@ const syncDelay = (ms) => {
44
44
  export const getEffectiveToken = () => {
45
45
  return authStore.getToken() || '';
46
46
  };
47
+ /**
48
+ * 请求超时时间(毫秒)
49
+ */
50
+ const REQUEST_TIMEOUT = 2 * 60 * 1000; // 2分钟
51
+ /**
52
+ * 创建带超时的 fetch 请求
53
+ * @param url 请求URL
54
+ * @param options fetch选项
55
+ * @param timeout 超时时间(毫秒)
56
+ * @returns Promise<Response>
57
+ */
58
+ const fetchWithTimeout = async (url, options, timeout = REQUEST_TIMEOUT) => {
59
+ const controller = new AbortController();
60
+ const timeoutId = setTimeout(() => controller.abort(), timeout);
61
+ try {
62
+ const response = await fetch(url, {
63
+ ...options,
64
+ signal: controller.signal,
65
+ });
66
+ clearTimeout(timeoutId);
67
+ return response;
68
+ }
69
+ catch (error) {
70
+ clearTimeout(timeoutId);
71
+ if (error instanceof Error && error.name === 'AbortError') {
72
+ throw new Error('请求超时,请检查网络连接后重试');
73
+ }
74
+ throw error;
75
+ }
76
+ };
47
77
  /**
48
78
  * 发送 SSE 流式请求
49
79
  * @param config 请求配置
@@ -62,7 +92,7 @@ export const sendSSERequest = async (config, isRetry = false) => {
62
92
  headers['authorization'] = `Bearer ${token}`;
63
93
  }
64
94
  }
65
- const response = await fetch(requestUrl, {
95
+ const response = await fetchWithTimeout(requestUrl, {
66
96
  method,
67
97
  headers: {
68
98
  'Accept': 'text/event-stream',
@@ -116,6 +146,12 @@ export const sendSSERequest = async (config, isRetry = false) => {
116
146
  }
117
147
  catch (error) {
118
148
  console.error('SSE 请求错误:', error);
149
+ // 如果是超时错误且不是重试请求,则重试一次
150
+ if (error instanceof Error && error.message.includes('请求超时') && !isRetry) {
151
+ console.log('SSE请求超时,正在重试...');
152
+ syncDelay(1000); // 延迟1秒后重试
153
+ return sendSSERequest(config, true);
154
+ }
119
155
  onError?.(error);
120
156
  }
121
157
  };
@@ -182,7 +218,7 @@ export const sendHttpRequest = async (config, isRetry = true) => {
182
218
  });
183
219
  requestUrl += (queryParams.toString() ? '&' : '?') + dataParams.toString();
184
220
  }
185
- const response = await fetch(requestUrl, requestConfig);
221
+ const response = await fetchWithTimeout(requestUrl, requestConfig);
186
222
  // 检查是否为401错误(未授权)
187
223
  if (response.status === 401) {
188
224
  // 触发全局token无效事件
@@ -224,6 +260,12 @@ export const sendHttpRequest = async (config, isRetry = true) => {
224
260
  }
225
261
  catch (error) {
226
262
  console.error('HTTP请求错误:', error);
263
+ // 如果是超时错误且允许重试,则重试一次
264
+ if (error instanceof Error && error.message.includes('请求超时') && isRetry) {
265
+ console.log('HTTP请求超时,正在重试...');
266
+ syncDelay(1000); // 延迟1秒后重试
267
+ return sendHttpRequest(config, false);
268
+ }
227
269
  if (config.onError) {
228
270
  config.onError(error);
229
271
  }
@@ -337,7 +379,7 @@ export const synthesizeAudio = async (text, token, isRetry = false) => {
337
379
  throw new Error('API密钥不能为空');
338
380
  }
339
381
  try {
340
- const response = await fetch(`${API_DOMAIN}/sdk/v1/tts/synthesize_audio`, {
382
+ const response = await fetchWithTimeout(`${API_DOMAIN}/sdk/v1/tts/synthesize_audio`, {
341
383
  method: 'POST',
342
384
  headers: {
343
385
  'Content-Type': 'application/json',
@@ -364,6 +406,12 @@ export const synthesizeAudio = async (text, token, isRetry = false) => {
364
406
  }
365
407
  catch (error) {
366
408
  console.error('语音合成错误:', error);
409
+ // 如果是超时错误且不是重试请求,则重试一次
410
+ if (error instanceof Error && error.message.includes('请求超时') && !isRetry) {
411
+ console.log('语音合成请求超时,正在重试...');
412
+ syncDelay(1000); // 延迟1秒后重试
413
+ return synthesizeAudio(text, token, true);
414
+ }
367
415
  throw error;
368
416
  }
369
417
  };
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/utils/utils.ts"],"names":[],"mappings":"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","sourcesContent":["// 导入环境变量\r\nimport { API_DOMAIN } from './env';\r\nimport { authStore } from '../../store/auth.store'; // 导入 authStore\r\n\r\nexport { API_DOMAIN };\r\n\r\nexport function format(first?: string, middle?: string, last?: string): string {\r\n return (first || '') + (middle ? ` ${middle}` : '') + (last ? ` ${last}` : '');\r\n}\r\n\r\n// 添加类型定义\r\nexport interface UserInputMessageType {\r\n message: string;\r\n [key: string]: any;\r\n}\r\n\r\nexport interface WorkFlowNode {\r\n message_id?: string;\r\n conversation_id?: string;\r\n created_at?: string;\r\n event?: string;\r\n answer?: string;\r\n data?: {\r\n outputs?: {\r\n answer?: string;\r\n };\r\n status?: string;\r\n error?: any;\r\n };\r\n}\r\n\r\nexport interface MessageRound extends UserInputMessageType {\r\n id?: string;\r\n conversation_id?: string;\r\n created_at?: string;\r\n answer?: string;\r\n status?: string;\r\n error?: any;\r\n}\r\n\r\n/**\r\n * 将工作流节点转换为消息轮次\r\n * @param message_event 消息事件类型\r\n * @param inputMessage 用户输入消息\r\n * @param streamNode 工作流节点\r\n * @returns 消息轮次\r\n */\r\nexport const convertWorkflowStreamNodeToMessageRound = (message_event: string, inputMessage: UserInputMessageType, streamNode: WorkFlowNode): MessageRound => {\r\n const messageRound: MessageRound = {\r\n ...inputMessage,\r\n };\r\n if (message_event === 'workflow_finished') messageRound.answer = streamNode.data?.outputs?.answer;\r\n if (message_event === 'agent_message' || message_event === 'message') messageRound.answer = streamNode?.answer;\r\n messageRound.id = streamNode.message_id;\r\n messageRound.conversation_id = streamNode.conversation_id;\r\n messageRound.created_at = streamNode.created_at;\r\n messageRound.status = streamNode.data?.status;\r\n messageRound.error = streamNode.data?.error;\r\n return messageRound;\r\n};\r\n\r\n/**\r\n * SSE 流式请求配置接口\r\n */\r\nexport interface SSERequestConfig {\r\n url: string;\r\n method: string;\r\n headers?: Record<string, string>;\r\n data?: any;\r\n onMessage?: (data: any) => void;\r\n onError?: (error: any) => void;\r\n onComplete?: () => void;\r\n}\r\n\r\n/**\r\n * 同步延迟函数,阻塞主线程指定的毫秒数\r\n * @param ms 延迟的毫秒数\r\n */\r\nconst syncDelay = (ms: number) => {\r\n const start = Date.now();\r\n while(Date.now() - start < ms) {\r\n // 空循环,阻塞主线程\r\n }\r\n};\r\n\r\n/**\r\n * 获取有效的 token,从 authStore 中获取\r\n * @returns string 有效的 token\r\n */\r\nexport const getEffectiveToken = (): string => {\r\n return authStore.getToken() || '';\r\n};\r\n\r\n/**\r\n * 发送 SSE 流式请求\r\n * @param config 请求配置\r\n * @param isRetry 是否为重试请求\r\n * @returns Promise<void>\r\n */\r\nexport const sendSSERequest = async (config: SSERequestConfig, isRetry = false): Promise<void> => {\r\n const { url, method, headers = {}, data, onMessage, onError, onComplete } = config;\r\n\r\n try {\r\n // 使用 API_DOMAIN 拼接完整的请求URL\r\n const requestUrl = `${API_DOMAIN}${url}`;\r\n\r\n // 如果没有提供 Authorization 头,则从 authStore 获取 token\r\n if (!headers['authorization'] && !headers['Authorization']) {\r\n const token = getEffectiveToken();\r\n if (token) {\r\n headers['authorization'] = `Bearer ${token}`;\r\n }\r\n }\r\n\r\n const response = await fetch(requestUrl, {\r\n method,\r\n headers: {\r\n 'Accept': 'text/event-stream',\r\n 'Content-Type': 'application/json',\r\n ...headers,\r\n },\r\n body: data ? JSON.stringify(data) : undefined,\r\n });\r\n\r\n // 检查是否为401错误(未授权)\r\n if (response.status === 401) {\r\n // 触发全局token无效事件\r\n createTokenInvalidEvent();\r\n \r\n // 如果不是重试请求,则使用同步延迟500毫秒后重试一次\r\n if (!isRetry) {\r\n syncDelay(500); // 阻塞式延迟\r\n return sendSSERequest(config, true);\r\n }\r\n }\r\n\r\n if (!response.ok) {\r\n console.error(`HTTP error! status: ${response.status}`);\r\n }\r\n\r\n const reader = response.body?.getReader();\r\n if (!reader) throw new Error('No reader available');\r\n\r\n const decoder = new TextDecoder();\r\n let buffer = '';\r\n\r\n while (true) {\r\n const { value, done } = await reader.read();\r\n if (done) break;\r\n\r\n buffer += decoder.decode(value, { stream: true });\r\n\r\n // 处理缓冲区中的完整消息\r\n const lines = buffer.split('\\n');\r\n buffer = lines.pop() || ''; // 保留最后一个不完整的行\r\n\r\n for (const line of lines) {\r\n if (line.startsWith('data:')) {\r\n try {\r\n const jsonStr = line.substring(5).trim();\r\n if (!jsonStr) continue;\r\n\r\n const data = JSON.parse(jsonStr);\r\n onMessage?.(data);\r\n } catch (e) {\r\n console.error('解析 SSE 数据错误:', e, '原始数据:', line);\r\n }\r\n }\r\n }\r\n }\r\n\r\n onComplete?.();\r\n } catch (error) {\r\n console.error('SSE 请求错误:', error);\r\n onError?.(error);\r\n }\r\n};\r\n\r\n/**\r\n * HTTP请求配置接口\r\n */\r\nexport interface HttpRequestConfig {\r\n url: string;\r\n method?: string;\r\n headers?: Record<string, string>;\r\n params?: Record<string, any>;\r\n data?: any;\r\n formData?: FormData; // 添加FormData支持\r\n onMessage?: (data: any) => void;\r\n onError?: (error: any) => void;\r\n onComplete?: () => void;\r\n}\r\n\r\n/**\r\n * 统一的API响应接口\r\n */\r\nexport interface ApiResponse<T = any> {\r\n code: number;\r\n message: string;\r\n data?: T;\r\n}\r\n\r\n/**\r\n * HTTP响应接口\r\n */\r\nexport interface HttpResponse<T = any> {\r\n success: boolean;\r\n data?: T;\r\n error?: any;\r\n message?: string;\r\n}\r\n\r\n// 添加一个全局事件发射器用于处理401错误\r\nexport const createTokenInvalidEvent = () => {\r\n const event = new CustomEvent('pcm-token-invalid', {\r\n bubbles: true,\r\n composed: true,\r\n detail: { timestamp: new Date().getTime() },\r\n });\r\n document.dispatchEvent(event);\r\n};\r\n\r\n/**\r\n * 发送HTTP请求\r\n * @param config 请求配置\r\n * @param isRetry 是否为重试请求\r\n * @returns Promise<HttpResponse>\r\n */\r\nexport const sendHttpRequest = async <T = any>(config: HttpRequestConfig, isRetry = true): Promise<HttpResponse<T>> => {\r\n const { url, method = 'GET', headers = {}, params = {}, data, formData, onMessage } = config;\r\n\r\n try {\r\n // 构建URL和查询参数\r\n const queryParams = new URLSearchParams();\r\n Object.entries(params).forEach(([key, value]) => {\r\n if (value !== undefined && value !== null) {\r\n queryParams.append(key, String(value));\r\n }\r\n });\r\n\r\n // 使用 API_DOMAIN 拼接完整的请求URL\r\n let requestUrl = `${API_DOMAIN}${url}${queryParams.toString() ? `?${queryParams.toString()}` : ''}`;\r\n // 如果没有提供 Authorization 头,则从 authStore 获取 token\r\n if (headers['authorization'] == undefined && headers['Authorization'] == undefined) {\r\n const token = getEffectiveToken();\r\n \r\n if (token) {\r\n headers['authorization'] = `Bearer ${token}`;\r\n }\r\n }\r\n\r\n // 创建请求配置对象\r\n const requestConfig: RequestInit = {\r\n method,\r\n headers: formData\r\n ? { ...headers }\r\n : {\r\n 'Content-Type': 'application/json',\r\n ...headers,\r\n },\r\n };\r\n\r\n // 处理请求体\r\n if (formData) {\r\n // 如果提供了FormData,直接使用\r\n requestConfig.body = formData;\r\n } else if (method !== 'GET' && method !== 'HEAD' && data) {\r\n // 否则,如果是非GET/HEAD请求且有data,将其JSON序列化\r\n requestConfig.body = JSON.stringify(data);\r\n }\r\n\r\n // 如果是 GET 方法且有 data,将其作为查询参数添加到 URL\r\n if (method === 'GET' && data) {\r\n const dataParams = new URLSearchParams();\r\n Object.entries(data).forEach(([key, value]) => {\r\n if (value !== undefined && value !== null) {\r\n dataParams.append(key, String(value));\r\n }\r\n });\r\n requestUrl += (queryParams.toString() ? '&' : '?') + dataParams.toString();\r\n }\r\n\r\n const response = await fetch(requestUrl, requestConfig);\r\n \r\n // 检查是否为401错误(未授权)\r\n if (response.status === 401) {\r\n // 触发全局token无效事件\r\n createTokenInvalidEvent();\r\n \r\n // 重试请求\r\n if (isRetry) {\r\n syncDelay(500); // 阻塞式延迟\r\n return sendHttpRequest(config, false);\r\n }\r\n }\r\n\r\n const responseData: ApiResponse<T> = await response.json();\r\n\r\n // 调用 onMessage 回调\r\n if (onMessage) {\r\n onMessage(responseData);\r\n }\r\n\r\n // 检查响应状态\r\n if (!response.ok) {\r\n console.error(`HTTP错误: ${response.status} ${response.statusText}`);\r\n return {\r\n success: false,\r\n message: responseData.message || `HTTP错误: ${response.status}`,\r\n error: responseData,\r\n };\r\n }\r\n\r\n // 检查业务状态码\r\n if (responseData.code !== 0) {\r\n console.error(`API错误: ${responseData.message}`);\r\n return {\r\n success: false,\r\n message: responseData.message,\r\n error: responseData,\r\n };\r\n }\r\n\r\n // 直接返回data\r\n return {\r\n success: true,\r\n data: responseData.data,\r\n };\r\n } catch (error) {\r\n console.error('HTTP请求错误:', error);\r\n if (config.onError) {\r\n config.onError(error);\r\n }\r\n return {\r\n success: false,\r\n error,\r\n message: error instanceof Error ? error.message : '未知错误',\r\n };\r\n } finally {\r\n if (config.onComplete) {\r\n config.onComplete();\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * 验证API密钥\r\n * @param token API密钥\r\n * @returns Promise<boolean> 验证是否成功\r\n */\r\nexport const verifyApiKey = async (token: string): Promise<boolean> => {\r\n\r\n const response = await sendHttpRequest({\r\n url: '/sdk/v1/user',\r\n method: 'GET',\r\n headers: {\r\n Authorization: `Bearer ${token}`,\r\n },\r\n }, false);\r\n \r\n // 如果是401错误,同步延迟500毫秒后返回\r\n if (!response.success && response.error && response.error.code === 401) {\r\n // 执行同步延迟\r\n syncDelay(500);\r\n return false;\r\n } else {\r\n return response.success;\r\n }\r\n};\r\n\r\n/**\r\n * 获取智能体信息\r\n * @param botId 智能体ID\r\n * @returns Promise<any> 智能体信息数据\r\n */\r\nexport const fetchAgentInfo = async (botId: string): Promise<any> => {\r\n \r\n if (!botId) {\r\n throw new Error('智能体ID不能为空');\r\n }\r\n\r\n try {\r\n const response = await sendHttpRequest({\r\n url: `/sdk/v1/agent/${botId}/info`,\r\n method: 'GET',\r\n });\r\n\r\n if (!response.success) {\r\n throw new Error(response.message || '获取智能体信息失败');\r\n }\r\n\r\n return response.data;\r\n } catch (error) {\r\n console.error('获取智能体信息失败:', error);\r\n throw error;\r\n }\r\n};\r\n\r\n/**\r\n * 文件上传响应数据接口\r\n */\r\nexport interface FileUploadResponse {\r\n /** 文件在对象存储中的唯一标识符 */\r\n cos_key: string;\r\n /** 文件名称 */\r\n file_name: string;\r\n /** 文件大小(带单位的字符串,如 \"1.5MB\") */\r\n file_size: string;\r\n /** 文件的预签名URL */\r\n presigned_url: string;\r\n /** 文件扩展名 */\r\n ext: string;\r\n}\r\n\r\n/**\r\n * 通过后端API上传文件\r\n * @param file 要上传的文件\r\n * @param headers 可选的请求头\r\n * @param params 可选的额外参数\r\n * @returns Promise 包含上传结果\r\n */\r\nexport const uploadFileToBackend = async (file: File, headers?: Record<string, string>, params?: Record<string, any>): Promise<FileUploadResponse> => {\r\n const formData = new FormData();\r\n formData.append('file', file);\r\n\r\n // 添加额外参数到 formData\r\n if (params) {\r\n Object.entries(params).forEach(([key, value]) => {\r\n if (value !== undefined && value !== null) {\r\n formData.append(key, String(value));\r\n }\r\n });\r\n }\r\n\r\n try {\r\n const response = await sendHttpRequest<{ cos_key: string; file_name: string; file_size: string; presigned_url: string; ext: string }>({\r\n url: '/sdk/v1/files/upload',\r\n method: 'POST',\r\n headers: {\r\n ...headers,\r\n },\r\n formData,\r\n });\r\n\r\n if (!response.success || !response.data) {\r\n throw new Error(response.message || '文件上传失败');\r\n }\r\n\r\n return response.data;\r\n } catch (error) {\r\n console.error('文件上传错误:', error);\r\n throw error;\r\n }\r\n};\r\n\r\n/**\r\n * 合成语音音频\r\n * @param text 要转换为语音的文本\r\n * @param token API密钥(可选,如果不提供则从 authStore 获取)\r\n * @param isRetry 是否为重试请求\r\n * @returns Promise<string> 返回音频的Blob URL\r\n */\r\nexport const synthesizeAudio = async (text: string, token?: string, isRetry = false): Promise<string> => {\r\n // 如果没有提供 token,则从 authStore 获取\r\n const effectiveToken = token || getEffectiveToken();\r\n \r\n if (!effectiveToken) {\r\n throw new Error('API密钥不能为空');\r\n }\r\n\r\n try {\r\n const response = await fetch(`${API_DOMAIN}/sdk/v1/tts/synthesize_audio`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'authorization': 'Bearer ' + effectiveToken,\r\n },\r\n body: JSON.stringify({ text }),\r\n });\r\n\r\n // 检查是否为401错误(未授权)\r\n if (response.status === 401) {\r\n // 触发全局token无效事件\r\n createTokenInvalidEvent();\r\n \r\n // 如果不是重试请求,则使用同步延迟500毫秒后重试一次\r\n if (!isRetry) {\r\n syncDelay(500); // 阻塞式延迟\r\n return synthesizeAudio(text, token, true);\r\n }\r\n }\r\n\r\n if (!response.ok) {\r\n throw new Error('语音合成失败');\r\n }\r\n\r\n // 获取音频数据并创建Blob URL\r\n const audioBlob = await response.blob();\r\n return URL.createObjectURL(audioBlob);\r\n } catch (error) {\r\n console.error('语音合成错误:', error);\r\n throw error;\r\n }\r\n};\r\n"]}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/utils/utils.ts"],"names":[],"mappings":"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","sourcesContent":["// 导入环境变量\r\nimport { API_DOMAIN } from './env';\r\nimport { authStore } from '../../store/auth.store'; // 导入 authStore\r\n\r\nexport { API_DOMAIN };\r\n\r\nexport function format(first?: string, middle?: string, last?: string): string {\r\n return (first || '') + (middle ? ` ${middle}` : '') + (last ? ` ${last}` : '');\r\n}\r\n\r\n// 添加类型定义\r\nexport interface UserInputMessageType {\r\n message: string;\r\n [key: string]: any;\r\n}\r\n\r\nexport interface WorkFlowNode {\r\n message_id?: string;\r\n conversation_id?: string;\r\n created_at?: string;\r\n event?: string;\r\n answer?: string;\r\n data?: {\r\n outputs?: {\r\n answer?: string;\r\n };\r\n status?: string;\r\n error?: any;\r\n };\r\n}\r\n\r\nexport interface MessageRound extends UserInputMessageType {\r\n id?: string;\r\n conversation_id?: string;\r\n created_at?: string;\r\n answer?: string;\r\n status?: string;\r\n error?: any;\r\n}\r\n\r\n/**\r\n * 将工作流节点转换为消息轮次\r\n * @param message_event 消息事件类型\r\n * @param inputMessage 用户输入消息\r\n * @param streamNode 工作流节点\r\n * @returns 消息轮次\r\n */\r\nexport const convertWorkflowStreamNodeToMessageRound = (message_event: string, inputMessage: UserInputMessageType, streamNode: WorkFlowNode): MessageRound => {\r\n const messageRound: MessageRound = {\r\n ...inputMessage,\r\n };\r\n if (message_event === 'workflow_finished') messageRound.answer = streamNode.data?.outputs?.answer;\r\n if (message_event === 'agent_message' || message_event === 'message') messageRound.answer = streamNode?.answer;\r\n messageRound.id = streamNode.message_id;\r\n messageRound.conversation_id = streamNode.conversation_id;\r\n messageRound.created_at = streamNode.created_at;\r\n messageRound.status = streamNode.data?.status;\r\n messageRound.error = streamNode.data?.error;\r\n return messageRound;\r\n};\r\n\r\n/**\r\n * SSE 流式请求配置接口\r\n */\r\nexport interface SSERequestConfig {\r\n url: string;\r\n method: string;\r\n headers?: Record<string, string>;\r\n data?: any;\r\n onMessage?: (data: any) => void;\r\n onError?: (error: any) => void;\r\n onComplete?: () => void;\r\n}\r\n\r\n/**\r\n * 同步延迟函数,阻塞主线程指定的毫秒数\r\n * @param ms 延迟的毫秒数\r\n */\r\nconst syncDelay = (ms: number) => {\r\n const start = Date.now();\r\n while(Date.now() - start < ms) {\r\n // 空循环,阻塞主线程\r\n }\r\n};\r\n\r\n/**\r\n * 获取有效的 token,从 authStore 中获取\r\n * @returns string 有效的 token\r\n */\r\nexport const getEffectiveToken = (): string => {\r\n return authStore.getToken() || '';\r\n};\r\n\r\n/**\r\n * 请求超时时间(毫秒)\r\n */\r\nconst REQUEST_TIMEOUT = 2 * 60 * 1000; // 2分钟\r\n\r\n/**\r\n * 创建带超时的 fetch 请求\r\n * @param url 请求URL\r\n * @param options fetch选项\r\n * @param timeout 超时时间(毫秒)\r\n * @returns Promise<Response>\r\n */\r\nconst fetchWithTimeout = async (url: string, options: RequestInit, timeout: number = REQUEST_TIMEOUT): Promise<Response> => {\r\n const controller = new AbortController();\r\n const timeoutId = setTimeout(() => controller.abort(), timeout);\r\n\r\n try {\r\n const response = await fetch(url, {\r\n ...options,\r\n signal: controller.signal,\r\n });\r\n clearTimeout(timeoutId);\r\n return response;\r\n } catch (error) {\r\n clearTimeout(timeoutId);\r\n if (error instanceof Error && error.name === 'AbortError') {\r\n throw new Error('请求超时,请检查网络连接后重试');\r\n }\r\n throw error;\r\n }\r\n};\r\n\r\n/**\r\n * 发送 SSE 流式请求\r\n * @param config 请求配置\r\n * @param isRetry 是否为重试请求\r\n * @returns Promise<void>\r\n */\r\nexport const sendSSERequest = async (config: SSERequestConfig, isRetry = false): Promise<void> => {\r\n const { url, method, headers = {}, data, onMessage, onError, onComplete } = config;\r\n\r\n try {\r\n // 使用 API_DOMAIN 拼接完整的请求URL\r\n const requestUrl = `${API_DOMAIN}${url}`;\r\n\r\n // 如果没有提供 Authorization 头,则从 authStore 获取 token\r\n if (!headers['authorization'] && !headers['Authorization']) {\r\n const token = getEffectiveToken();\r\n if (token) {\r\n headers['authorization'] = `Bearer ${token}`;\r\n }\r\n }\r\n\r\n const response = await fetchWithTimeout(requestUrl, {\r\n method,\r\n headers: {\r\n 'Accept': 'text/event-stream',\r\n 'Content-Type': 'application/json',\r\n ...headers,\r\n },\r\n body: data ? JSON.stringify(data) : undefined,\r\n });\r\n\r\n // 检查是否为401错误(未授权)\r\n if (response.status === 401) {\r\n // 触发全局token无效事件\r\n createTokenInvalidEvent();\r\n \r\n // 如果不是重试请求,则使用同步延迟500毫秒后重试一次\r\n if (!isRetry) {\r\n syncDelay(500); // 阻塞式延迟\r\n return sendSSERequest(config, true);\r\n }\r\n }\r\n\r\n if (!response.ok) {\r\n console.error(`HTTP error! status: ${response.status}`);\r\n }\r\n\r\n const reader = response.body?.getReader();\r\n if (!reader) throw new Error('No reader available');\r\n\r\n const decoder = new TextDecoder();\r\n let buffer = '';\r\n\r\n while (true) {\r\n const { value, done } = await reader.read();\r\n if (done) break;\r\n\r\n buffer += decoder.decode(value, { stream: true });\r\n\r\n // 处理缓冲区中的完整消息\r\n const lines = buffer.split('\\n');\r\n buffer = lines.pop() || ''; // 保留最后一个不完整的行\r\n\r\n for (const line of lines) {\r\n if (line.startsWith('data:')) {\r\n try {\r\n const jsonStr = line.substring(5).trim();\r\n if (!jsonStr) continue;\r\n\r\n const data = JSON.parse(jsonStr);\r\n onMessage?.(data);\r\n } catch (e) {\r\n console.error('解析 SSE 数据错误:', e, '原始数据:', line);\r\n }\r\n }\r\n }\r\n }\r\n\r\n onComplete?.();\r\n } catch (error) {\r\n console.error('SSE 请求错误:', error);\r\n \r\n // 如果是超时错误且不是重试请求,则重试一次\r\n if (error instanceof Error && error.message.includes('请求超时') && !isRetry) {\r\n console.log('SSE请求超时,正在重试...');\r\n syncDelay(1000); // 延迟1秒后重试\r\n return sendSSERequest(config, true);\r\n }\r\n \r\n onError?.(error);\r\n }\r\n};\r\n\r\n/**\r\n * HTTP请求配置接口\r\n */\r\nexport interface HttpRequestConfig {\r\n url: string;\r\n method?: string;\r\n headers?: Record<string, string>;\r\n params?: Record<string, any>;\r\n data?: any;\r\n formData?: FormData; // 添加FormData支持\r\n onMessage?: (data: any) => void;\r\n onError?: (error: any) => void;\r\n onComplete?: () => void;\r\n}\r\n\r\n/**\r\n * 统一的API响应接口\r\n */\r\nexport interface ApiResponse<T = any> {\r\n code: number;\r\n message: string;\r\n data?: T;\r\n}\r\n\r\n/**\r\n * HTTP响应接口\r\n */\r\nexport interface HttpResponse<T = any> {\r\n success: boolean;\r\n data?: T;\r\n error?: any;\r\n message?: string;\r\n}\r\n\r\n// 添加一个全局事件发射器用于处理401错误\r\nexport const createTokenInvalidEvent = () => {\r\n const event = new CustomEvent('pcm-token-invalid', {\r\n bubbles: true,\r\n composed: true,\r\n detail: { timestamp: new Date().getTime() },\r\n });\r\n document.dispatchEvent(event);\r\n};\r\n\r\n/**\r\n * 发送HTTP请求\r\n * @param config 请求配置\r\n * @param isRetry 是否为重试请求\r\n * @returns Promise<HttpResponse>\r\n */\r\nexport const sendHttpRequest = async <T = any>(config: HttpRequestConfig, isRetry = true): Promise<HttpResponse<T>> => {\r\n const { url, method = 'GET', headers = {}, params = {}, data, formData, onMessage } = config;\r\n\r\n try {\r\n // 构建URL和查询参数\r\n const queryParams = new URLSearchParams();\r\n Object.entries(params).forEach(([key, value]) => {\r\n if (value !== undefined && value !== null) {\r\n queryParams.append(key, String(value));\r\n }\r\n });\r\n\r\n // 使用 API_DOMAIN 拼接完整的请求URL\r\n let requestUrl = `${API_DOMAIN}${url}${queryParams.toString() ? `?${queryParams.toString()}` : ''}`;\r\n // 如果没有提供 Authorization 头,则从 authStore 获取 token\r\n if (headers['authorization'] == undefined && headers['Authorization'] == undefined) {\r\n const token = getEffectiveToken();\r\n \r\n if (token) {\r\n headers['authorization'] = `Bearer ${token}`;\r\n }\r\n }\r\n\r\n // 创建请求配置对象\r\n const requestConfig: RequestInit = {\r\n method,\r\n headers: formData\r\n ? { ...headers }\r\n : {\r\n 'Content-Type': 'application/json',\r\n ...headers,\r\n },\r\n };\r\n\r\n // 处理请求体\r\n if (formData) {\r\n // 如果提供了FormData,直接使用\r\n requestConfig.body = formData;\r\n } else if (method !== 'GET' && method !== 'HEAD' && data) {\r\n // 否则,如果是非GET/HEAD请求且有data,将其JSON序列化\r\n requestConfig.body = JSON.stringify(data);\r\n }\r\n\r\n // 如果是 GET 方法且有 data,将其作为查询参数添加到 URL\r\n if (method === 'GET' && data) {\r\n const dataParams = new URLSearchParams();\r\n Object.entries(data).forEach(([key, value]) => {\r\n if (value !== undefined && value !== null) {\r\n dataParams.append(key, String(value));\r\n }\r\n });\r\n requestUrl += (queryParams.toString() ? '&' : '?') + dataParams.toString();\r\n }\r\n\r\n const response = await fetchWithTimeout(requestUrl, requestConfig);\r\n \r\n // 检查是否为401错误(未授权)\r\n if (response.status === 401) {\r\n // 触发全局token无效事件\r\n createTokenInvalidEvent();\r\n \r\n // 重试请求\r\n if (isRetry) {\r\n syncDelay(500); // 阻塞式延迟\r\n return sendHttpRequest(config, false);\r\n }\r\n }\r\n\r\n const responseData: ApiResponse<T> = await response.json();\r\n\r\n // 调用 onMessage 回调\r\n if (onMessage) {\r\n onMessage(responseData);\r\n }\r\n\r\n // 检查响应状态\r\n if (!response.ok) {\r\n console.error(`HTTP错误: ${response.status} ${response.statusText}`);\r\n return {\r\n success: false,\r\n message: responseData.message || `HTTP错误: ${response.status}`,\r\n error: responseData,\r\n };\r\n }\r\n\r\n // 检查业务状态码\r\n if (responseData.code !== 0) {\r\n console.error(`API错误: ${responseData.message}`);\r\n return {\r\n success: false,\r\n message: responseData.message,\r\n error: responseData,\r\n };\r\n }\r\n\r\n // 直接返回data\r\n return {\r\n success: true,\r\n data: responseData.data,\r\n };\r\n } catch (error) {\r\n console.error('HTTP请求错误:', error);\r\n \r\n // 如果是超时错误且允许重试,则重试一次\r\n if (error instanceof Error && error.message.includes('请求超时') && isRetry) {\r\n console.log('HTTP请求超时,正在重试...');\r\n syncDelay(1000); // 延迟1秒后重试\r\n return sendHttpRequest(config, false);\r\n }\r\n \r\n if (config.onError) {\r\n config.onError(error);\r\n }\r\n return {\r\n success: false,\r\n error,\r\n message: error instanceof Error ? error.message : '未知错误',\r\n };\r\n } finally {\r\n if (config.onComplete) {\r\n config.onComplete();\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * 验证API密钥\r\n * @param token API密钥\r\n * @returns Promise<boolean> 验证是否成功\r\n */\r\nexport const verifyApiKey = async (token: string): Promise<boolean> => {\r\n\r\n const response = await sendHttpRequest({\r\n url: '/sdk/v1/user',\r\n method: 'GET',\r\n headers: {\r\n Authorization: `Bearer ${token}`,\r\n },\r\n }, false);\r\n \r\n // 如果是401错误,同步延迟500毫秒后返回\r\n if (!response.success && response.error && response.error.code === 401) {\r\n // 执行同步延迟\r\n syncDelay(500);\r\n return false;\r\n } else {\r\n return response.success;\r\n }\r\n};\r\n\r\n/**\r\n * 获取智能体信息\r\n * @param botId 智能体ID\r\n * @returns Promise<any> 智能体信息数据\r\n */\r\nexport const fetchAgentInfo = async (botId: string): Promise<any> => {\r\n if (!botId) {\r\n throw new Error('智能体ID不能为空');\r\n }\r\n\r\n try {\r\n const response = await sendHttpRequest({\r\n url: `/sdk/v1/agent/${botId}/info`,\r\n method: 'GET',\r\n });\r\n\r\n if (!response.success) {\r\n throw new Error(response.message || '获取智能体信息失败');\r\n }\r\n\r\n return response.data;\r\n } catch (error) {\r\n console.error('获取智能体信息失败:', error);\r\n throw error;\r\n }\r\n};\r\n\r\n/**\r\n * 文件上传响应数据接口\r\n */\r\nexport interface FileUploadResponse {\r\n /** 文件在对象存储中的唯一标识符 */\r\n cos_key: string;\r\n /** 文件名称 */\r\n file_name: string;\r\n /** 文件大小(带单位的字符串,如 \"1.5MB\") */\r\n file_size: string;\r\n /** 文件的预签名URL */\r\n presigned_url: string;\r\n /** 文件扩展名 */\r\n ext: string;\r\n}\r\n\r\n/**\r\n * 通过后端API上传文件\r\n * @param file 要上传的文件\r\n * @param headers 可选的请求头\r\n * @param params 可选的额外参数\r\n * @returns Promise 包含上传结果\r\n */\r\nexport const uploadFileToBackend = async (file: File, headers?: Record<string, string>, params?: Record<string, any>): Promise<FileUploadResponse> => {\r\n const formData = new FormData();\r\n formData.append('file', file);\r\n\r\n // 添加额外参数到 formData\r\n if (params) {\r\n Object.entries(params).forEach(([key, value]) => {\r\n if (value !== undefined && value !== null) {\r\n formData.append(key, String(value));\r\n }\r\n });\r\n }\r\n\r\n try {\r\n const response = await sendHttpRequest<{ cos_key: string; file_name: string; file_size: string; presigned_url: string; ext: string }>({\r\n url: '/sdk/v1/files/upload',\r\n method: 'POST',\r\n headers: {\r\n ...headers,\r\n },\r\n formData,\r\n });\r\n\r\n if (!response.success || !response.data) {\r\n throw new Error(response.message || '文件上传失败');\r\n }\r\n\r\n return response.data;\r\n } catch (error) {\r\n console.error('文件上传错误:', error);\r\n throw error;\r\n }\r\n};\r\n\r\n/**\r\n * 合成语音音频\r\n * @param text 要转换为语音的文本\r\n * @param token API密钥(可选,如果不提供则从 authStore 获取)\r\n * @param isRetry 是否为重试请求\r\n * @returns Promise<string> 返回音频的Blob URL\r\n */\r\nexport const synthesizeAudio = async (text: string, token?: string, isRetry = false): Promise<string> => {\r\n // 如果没有提供 token,则从 authStore 获取\r\n const effectiveToken = token || getEffectiveToken();\r\n \r\n if (!effectiveToken) {\r\n throw new Error('API密钥不能为空');\r\n }\r\n\r\n try {\r\n const response = await fetchWithTimeout(`${API_DOMAIN}/sdk/v1/tts/synthesize_audio`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'authorization': 'Bearer ' + effectiveToken,\r\n },\r\n body: JSON.stringify({ text }),\r\n });\r\n\r\n // 检查是否为401错误(未授权)\r\n if (response.status === 401) {\r\n // 触发全局token无效事件\r\n createTokenInvalidEvent();\r\n \r\n // 如果不是重试请求,则使用同步延迟500毫秒后重试一次\r\n if (!isRetry) {\r\n syncDelay(500); // 阻塞式延迟\r\n return synthesizeAudio(text, token, true);\r\n }\r\n }\r\n\r\n if (!response.ok) {\r\n throw new Error('语音合成失败');\r\n }\r\n\r\n // 获取音频数据并创建Blob URL\r\n const audioBlob = await response.blob();\r\n return URL.createObjectURL(audioBlob);\r\n } catch (error) {\r\n console.error('语音合成错误:', error);\r\n \r\n // 如果是超时错误且不是重试请求,则重试一次\r\n if (error instanceof Error && error.message.includes('请求超时') && !isRetry) {\r\n console.log('语音合成请求超时,正在重试...');\r\n syncDelay(1000); // 延迟1秒后重试\r\n return synthesizeAudio(text, token, true);\r\n }\r\n \r\n throw error;\r\n }\r\n};\r\n"]}
@@ -42,6 +42,36 @@ function format(first, middle, last) {
42
42
  const getEffectiveToken = () => {
43
43
  return authStore.getToken() || '';
44
44
  };
45
+ /**
46
+ * 请求超时时间(毫秒)
47
+ */
48
+ const REQUEST_TIMEOUT = 2 * 60 * 1000; // 2分钟
49
+ /**
50
+ * 创建带超时的 fetch 请求
51
+ * @param url 请求URL
52
+ * @param options fetch选项
53
+ * @param timeout 超时时间(毫秒)
54
+ * @returns Promise<Response>
55
+ */
56
+ const fetchWithTimeout = async (url, options, timeout = REQUEST_TIMEOUT) => {
57
+ const controller = new AbortController();
58
+ const timeoutId = setTimeout(() => controller.abort(), timeout);
59
+ try {
60
+ const response = await fetch(url, {
61
+ ...options,
62
+ signal: controller.signal,
63
+ });
64
+ clearTimeout(timeoutId);
65
+ return response;
66
+ }
67
+ catch (error) {
68
+ clearTimeout(timeoutId);
69
+ if (error instanceof Error && error.name === 'AbortError') {
70
+ throw new Error('请求超时,请检查网络连接后重试');
71
+ }
72
+ throw error;
73
+ }
74
+ };
45
75
  /**
46
76
  * 发送 SSE 流式请求
47
77
  * @param config 请求配置
@@ -60,7 +90,7 @@ const sendSSERequest = async (config, isRetry = false) => {
60
90
  headers['authorization'] = `Bearer ${token}`;
61
91
  }
62
92
  }
63
- const response = await fetch(requestUrl, {
93
+ const response = await fetchWithTimeout(requestUrl, {
64
94
  method,
65
95
  headers: {
66
96
  'Accept': 'text/event-stream',
@@ -113,6 +143,10 @@ const sendSSERequest = async (config, isRetry = false) => {
113
143
  }
114
144
  catch (error) {
115
145
  console.error('SSE 请求错误:', error);
146
+ // 如果是超时错误且不是重试请求,则重试一次
147
+ if (error instanceof Error && error.message.includes('请求超时') && !isRetry) {
148
+ return sendSSERequest(config, true);
149
+ }
116
150
  onError?.(error);
117
151
  }
118
152
  };
@@ -179,7 +213,7 @@ const sendHttpRequest = async (config, isRetry = true) => {
179
213
  });
180
214
  requestUrl += (queryParams.toString() ? '&' : '?') + dataParams.toString();
181
215
  }
182
- const response = await fetch(requestUrl, requestConfig);
216
+ const response = await fetchWithTimeout(requestUrl, requestConfig);
183
217
  // 检查是否为401错误(未授权)
184
218
  if (response.status === 401) {
185
219
  // 触发全局token无效事件
@@ -220,6 +254,10 @@ const sendHttpRequest = async (config, isRetry = true) => {
220
254
  }
221
255
  catch (error) {
222
256
  console.error('HTTP请求错误:', error);
257
+ // 如果是超时错误且允许重试,则重试一次
258
+ if (error instanceof Error && error.message.includes('请求超时') && isRetry) {
259
+ return sendHttpRequest(config, false);
260
+ }
223
261
  if (config.onError) {
224
262
  config.onError(error);
225
263
  }
@@ -331,7 +369,7 @@ const synthesizeAudio = async (text, token, isRetry = false) => {
331
369
  throw new Error('API密钥不能为空');
332
370
  }
333
371
  try {
334
- const response = await fetch(`${API_DOMAIN}/sdk/v1/tts/synthesize_audio`, {
372
+ const response = await fetchWithTimeout(`${API_DOMAIN}/sdk/v1/tts/synthesize_audio`, {
335
373
  method: 'POST',
336
374
  headers: {
337
375
  'Content-Type': 'application/json',
@@ -357,6 +395,10 @@ const synthesizeAudio = async (text, token, isRetry = false) => {
357
395
  }
358
396
  catch (error) {
359
397
  console.error('语音合成错误:', error);
398
+ // 如果是超时错误且不是重试请求,则重试一次
399
+ if (error instanceof Error && error.message.includes('请求超时') && !isRetry) {
400
+ return synthesizeAudio(text, token, true);
401
+ }
360
402
  throw error;
361
403
  }
362
404
  };
@@ -1 +1 @@
1
- {"file":"index.js","mappings":"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","names":[],"sources":["src/utils/env.ts","store/auth.store.ts","src/utils/utils.ts"],"sourcesContent":["// 默认 API 域名\r\nconst DEFAULT_API_DOMAIN = 'https://api.pincaimao.com/agents/platform';\r\n\r\n// 从环境变量获取 API 域名,如果未设置则使用默认值\r\nexport const API_DOMAIN = process.env.API_DOMAIN || DEFAULT_API_DOMAIN;\r\n\r\n// 导出其他环境变量\r\nexport const ENV = {\r\n API_DOMAIN,\r\n // 可以添加其他环境变量\r\n}; ","// src/store/auth.store.ts\r\nimport { createStore } from '@stencil/store';\r\n\r\nexport const { state: authState, onChange } = createStore({\r\n token: localStorage.getItem('pcm-sdk-auth-token') || null\r\n});\r\n\r\n// 添加一些辅助方法\r\nexport const authStore = {\r\n getToken: () => authState.token,\r\n setToken: (token: string) => {\r\n authState.token = token;\r\n localStorage.setItem('pcm-sdk-auth-token', token);\r\n },\r\n clearToken: () => {\r\n authState.token = null;\r\n localStorage.removeItem('pcm-sdk-auth-token');\r\n }\r\n};\r\n\r\n// 自动保存到localStorage\r\nonChange('token', value => {\r\n if (value) {\r\n localStorage.setItem('pcm-sdk-auth-token', value);\r\n } else {\r\n localStorage.removeItem('pcm-sdk-auth-token');\r\n }\r\n});","// 导入环境变量\r\nimport { API_DOMAIN } from './env';\r\nimport { authStore } from '../../store/auth.store'; // 导入 authStore\r\n\r\nexport { API_DOMAIN };\r\n\r\nexport function format(first?: string, middle?: string, last?: string): string {\r\n return (first || '') + (middle ? ` ${middle}` : '') + (last ? ` ${last}` : '');\r\n}\r\n\r\n// 添加类型定义\r\nexport interface UserInputMessageType {\r\n message: string;\r\n [key: string]: any;\r\n}\r\n\r\nexport interface WorkFlowNode {\r\n message_id?: string;\r\n conversation_id?: string;\r\n created_at?: string;\r\n event?: string;\r\n answer?: string;\r\n data?: {\r\n outputs?: {\r\n answer?: string;\r\n };\r\n status?: string;\r\n error?: any;\r\n };\r\n}\r\n\r\nexport interface MessageRound extends UserInputMessageType {\r\n id?: string;\r\n conversation_id?: string;\r\n created_at?: string;\r\n answer?: string;\r\n status?: string;\r\n error?: any;\r\n}\r\n\r\n/**\r\n * 将工作流节点转换为消息轮次\r\n * @param message_event 消息事件类型\r\n * @param inputMessage 用户输入消息\r\n * @param streamNode 工作流节点\r\n * @returns 消息轮次\r\n */\r\nexport const convertWorkflowStreamNodeToMessageRound = (message_event: string, inputMessage: UserInputMessageType, streamNode: WorkFlowNode): MessageRound => {\r\n const messageRound: MessageRound = {\r\n ...inputMessage,\r\n };\r\n if (message_event === 'workflow_finished') messageRound.answer = streamNode.data?.outputs?.answer;\r\n if (message_event === 'agent_message' || message_event === 'message') messageRound.answer = streamNode?.answer;\r\n messageRound.id = streamNode.message_id;\r\n messageRound.conversation_id = streamNode.conversation_id;\r\n messageRound.created_at = streamNode.created_at;\r\n messageRound.status = streamNode.data?.status;\r\n messageRound.error = streamNode.data?.error;\r\n return messageRound;\r\n};\r\n\r\n/**\r\n * SSE 流式请求配置接口\r\n */\r\nexport interface SSERequestConfig {\r\n url: string;\r\n method: string;\r\n headers?: Record<string, string>;\r\n data?: any;\r\n onMessage?: (data: any) => void;\r\n onError?: (error: any) => void;\r\n onComplete?: () => void;\r\n}\r\n\r\n/**\r\n * 同步延迟函数,阻塞主线程指定的毫秒数\r\n * @param ms 延迟的毫秒数\r\n */\r\nconst syncDelay = (ms: number) => {\r\n const start = Date.now();\r\n while(Date.now() - start < ms) {\r\n // 空循环,阻塞主线程\r\n }\r\n};\r\n\r\n/**\r\n * 获取有效的 token,从 authStore 中获取\r\n * @returns string 有效的 token\r\n */\r\nexport const getEffectiveToken = (): string => {\r\n return authStore.getToken() || '';\r\n};\r\n\r\n/**\r\n * 发送 SSE 流式请求\r\n * @param config 请求配置\r\n * @param isRetry 是否为重试请求\r\n * @returns Promise<void>\r\n */\r\nexport const sendSSERequest = async (config: SSERequestConfig, isRetry = false): Promise<void> => {\r\n const { url, method, headers = {}, data, onMessage, onError, onComplete } = config;\r\n\r\n try {\r\n // 使用 API_DOMAIN 拼接完整的请求URL\r\n const requestUrl = `${API_DOMAIN}${url}`;\r\n\r\n // 如果没有提供 Authorization 头,则从 authStore 获取 token\r\n if (!headers['authorization'] && !headers['Authorization']) {\r\n const token = getEffectiveToken();\r\n if (token) {\r\n headers['authorization'] = `Bearer ${token}`;\r\n }\r\n }\r\n\r\n const response = await fetch(requestUrl, {\r\n method,\r\n headers: {\r\n 'Accept': 'text/event-stream',\r\n 'Content-Type': 'application/json',\r\n ...headers,\r\n },\r\n body: data ? JSON.stringify(data) : undefined,\r\n });\r\n\r\n // 检查是否为401错误(未授权)\r\n if (response.status === 401) {\r\n // 触发全局token无效事件\r\n createTokenInvalidEvent();\r\n \r\n // 如果不是重试请求,则使用同步延迟500毫秒后重试一次\r\n if (!isRetry) {\r\n syncDelay(500); // 阻塞式延迟\r\n return sendSSERequest(config, true);\r\n }\r\n }\r\n\r\n if (!response.ok) {\r\n console.error(`HTTP error! status: ${response.status}`);\r\n }\r\n\r\n const reader = response.body?.getReader();\r\n if (!reader) throw new Error('No reader available');\r\n\r\n const decoder = new TextDecoder();\r\n let buffer = '';\r\n\r\n while (true) {\r\n const { value, done } = await reader.read();\r\n if (done) break;\r\n\r\n buffer += decoder.decode(value, { stream: true });\r\n\r\n // 处理缓冲区中的完整消息\r\n const lines = buffer.split('\\n');\r\n buffer = lines.pop() || ''; // 保留最后一个不完整的行\r\n\r\n for (const line of lines) {\r\n if (line.startsWith('data:')) {\r\n try {\r\n const jsonStr = line.substring(5).trim();\r\n if (!jsonStr) continue;\r\n\r\n const data = JSON.parse(jsonStr);\r\n onMessage?.(data);\r\n } catch (e) {\r\n console.error('解析 SSE 数据错误:', e, '原始数据:', line);\r\n }\r\n }\r\n }\r\n }\r\n\r\n onComplete?.();\r\n } catch (error) {\r\n console.error('SSE 请求错误:', error);\r\n onError?.(error);\r\n }\r\n};\r\n\r\n/**\r\n * HTTP请求配置接口\r\n */\r\nexport interface HttpRequestConfig {\r\n url: string;\r\n method?: string;\r\n headers?: Record<string, string>;\r\n params?: Record<string, any>;\r\n data?: any;\r\n formData?: FormData; // 添加FormData支持\r\n onMessage?: (data: any) => void;\r\n onError?: (error: any) => void;\r\n onComplete?: () => void;\r\n}\r\n\r\n/**\r\n * 统一的API响应接口\r\n */\r\nexport interface ApiResponse<T = any> {\r\n code: number;\r\n message: string;\r\n data?: T;\r\n}\r\n\r\n/**\r\n * HTTP响应接口\r\n */\r\nexport interface HttpResponse<T = any> {\r\n success: boolean;\r\n data?: T;\r\n error?: any;\r\n message?: string;\r\n}\r\n\r\n// 添加一个全局事件发射器用于处理401错误\r\nexport const createTokenInvalidEvent = () => {\r\n const event = new CustomEvent('pcm-token-invalid', {\r\n bubbles: true,\r\n composed: true,\r\n detail: { timestamp: new Date().getTime() },\r\n });\r\n document.dispatchEvent(event);\r\n};\r\n\r\n/**\r\n * 发送HTTP请求\r\n * @param config 请求配置\r\n * @param isRetry 是否为重试请求\r\n * @returns Promise<HttpResponse>\r\n */\r\nexport const sendHttpRequest = async <T = any>(config: HttpRequestConfig, isRetry = true): Promise<HttpResponse<T>> => {\r\n const { url, method = 'GET', headers = {}, params = {}, data, formData, onMessage } = config;\r\n\r\n try {\r\n // 构建URL和查询参数\r\n const queryParams = new URLSearchParams();\r\n Object.entries(params).forEach(([key, value]) => {\r\n if (value !== undefined && value !== null) {\r\n queryParams.append(key, String(value));\r\n }\r\n });\r\n\r\n // 使用 API_DOMAIN 拼接完整的请求URL\r\n let requestUrl = `${API_DOMAIN}${url}${queryParams.toString() ? `?${queryParams.toString()}` : ''}`;\r\n // 如果没有提供 Authorization 头,则从 authStore 获取 token\r\n if (headers['authorization'] == undefined && headers['Authorization'] == undefined) {\r\n const token = getEffectiveToken();\r\n \r\n if (token) {\r\n headers['authorization'] = `Bearer ${token}`;\r\n }\r\n }\r\n\r\n // 创建请求配置对象\r\n const requestConfig: RequestInit = {\r\n method,\r\n headers: formData\r\n ? { ...headers }\r\n : {\r\n 'Content-Type': 'application/json',\r\n ...headers,\r\n },\r\n };\r\n\r\n // 处理请求体\r\n if (formData) {\r\n // 如果提供了FormData,直接使用\r\n requestConfig.body = formData;\r\n } else if (method !== 'GET' && method !== 'HEAD' && data) {\r\n // 否则,如果是非GET/HEAD请求且有data,将其JSON序列化\r\n requestConfig.body = JSON.stringify(data);\r\n }\r\n\r\n // 如果是 GET 方法且有 data,将其作为查询参数添加到 URL\r\n if (method === 'GET' && data) {\r\n const dataParams = new URLSearchParams();\r\n Object.entries(data).forEach(([key, value]) => {\r\n if (value !== undefined && value !== null) {\r\n dataParams.append(key, String(value));\r\n }\r\n });\r\n requestUrl += (queryParams.toString() ? '&' : '?') + dataParams.toString();\r\n }\r\n\r\n const response = await fetch(requestUrl, requestConfig);\r\n \r\n // 检查是否为401错误(未授权)\r\n if (response.status === 401) {\r\n // 触发全局token无效事件\r\n createTokenInvalidEvent();\r\n \r\n // 重试请求\r\n if (isRetry) {\r\n syncDelay(500); // 阻塞式延迟\r\n return sendHttpRequest(config, false);\r\n }\r\n }\r\n\r\n const responseData: ApiResponse<T> = await response.json();\r\n\r\n // 调用 onMessage 回调\r\n if (onMessage) {\r\n onMessage(responseData);\r\n }\r\n\r\n // 检查响应状态\r\n if (!response.ok) {\r\n console.error(`HTTP错误: ${response.status} ${response.statusText}`);\r\n return {\r\n success: false,\r\n message: responseData.message || `HTTP错误: ${response.status}`,\r\n error: responseData,\r\n };\r\n }\r\n\r\n // 检查业务状态码\r\n if (responseData.code !== 0) {\r\n console.error(`API错误: ${responseData.message}`);\r\n return {\r\n success: false,\r\n message: responseData.message,\r\n error: responseData,\r\n };\r\n }\r\n\r\n // 直接返回data\r\n return {\r\n success: true,\r\n data: responseData.data,\r\n };\r\n } catch (error) {\r\n console.error('HTTP请求错误:', error);\r\n if (config.onError) {\r\n config.onError(error);\r\n }\r\n return {\r\n success: false,\r\n error,\r\n message: error instanceof Error ? error.message : '未知错误',\r\n };\r\n } finally {\r\n if (config.onComplete) {\r\n config.onComplete();\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * 验证API密钥\r\n * @param token API密钥\r\n * @returns Promise<boolean> 验证是否成功\r\n */\r\nexport const verifyApiKey = async (token: string): Promise<boolean> => {\r\n\r\n const response = await sendHttpRequest({\r\n url: '/sdk/v1/user',\r\n method: 'GET',\r\n headers: {\r\n Authorization: `Bearer ${token}`,\r\n },\r\n }, false);\r\n \r\n // 如果是401错误,同步延迟500毫秒后返回\r\n if (!response.success && response.error && response.error.code === 401) {\r\n // 执行同步延迟\r\n syncDelay(500);\r\n return false;\r\n } else {\r\n return response.success;\r\n }\r\n};\r\n\r\n/**\r\n * 获取智能体信息\r\n * @param botId 智能体ID\r\n * @returns Promise<any> 智能体信息数据\r\n */\r\nexport const fetchAgentInfo = async (botId: string): Promise<any> => {\r\n \r\n if (!botId) {\r\n throw new Error('智能体ID不能为空');\r\n }\r\n\r\n try {\r\n const response = await sendHttpRequest({\r\n url: `/sdk/v1/agent/${botId}/info`,\r\n method: 'GET',\r\n });\r\n\r\n if (!response.success) {\r\n throw new Error(response.message || '获取智能体信息失败');\r\n }\r\n\r\n return response.data;\r\n } catch (error) {\r\n console.error('获取智能体信息失败:', error);\r\n throw error;\r\n }\r\n};\r\n\r\n/**\r\n * 文件上传响应数据接口\r\n */\r\nexport interface FileUploadResponse {\r\n /** 文件在对象存储中的唯一标识符 */\r\n cos_key: string;\r\n /** 文件名称 */\r\n file_name: string;\r\n /** 文件大小(带单位的字符串,如 \"1.5MB\") */\r\n file_size: string;\r\n /** 文件的预签名URL */\r\n presigned_url: string;\r\n /** 文件扩展名 */\r\n ext: string;\r\n}\r\n\r\n/**\r\n * 通过后端API上传文件\r\n * @param file 要上传的文件\r\n * @param headers 可选的请求头\r\n * @param params 可选的额外参数\r\n * @returns Promise 包含上传结果\r\n */\r\nexport const uploadFileToBackend = async (file: File, headers?: Record<string, string>, params?: Record<string, any>): Promise<FileUploadResponse> => {\r\n const formData = new FormData();\r\n formData.append('file', file);\r\n\r\n // 添加额外参数到 formData\r\n if (params) {\r\n Object.entries(params).forEach(([key, value]) => {\r\n if (value !== undefined && value !== null) {\r\n formData.append(key, String(value));\r\n }\r\n });\r\n }\r\n\r\n try {\r\n const response = await sendHttpRequest<{ cos_key: string; file_name: string; file_size: string; presigned_url: string; ext: string }>({\r\n url: '/sdk/v1/files/upload',\r\n method: 'POST',\r\n headers: {\r\n ...headers,\r\n },\r\n formData,\r\n });\r\n\r\n if (!response.success || !response.data) {\r\n throw new Error(response.message || '文件上传失败');\r\n }\r\n\r\n return response.data;\r\n } catch (error) {\r\n console.error('文件上传错误:', error);\r\n throw error;\r\n }\r\n};\r\n\r\n/**\r\n * 合成语音音频\r\n * @param text 要转换为语音的文本\r\n * @param token API密钥(可选,如果不提供则从 authStore 获取)\r\n * @param isRetry 是否为重试请求\r\n * @returns Promise<string> 返回音频的Blob URL\r\n */\r\nexport const synthesizeAudio = async (text: string, token?: string, isRetry = false): Promise<string> => {\r\n // 如果没有提供 token,则从 authStore 获取\r\n const effectiveToken = token || getEffectiveToken();\r\n \r\n if (!effectiveToken) {\r\n throw new Error('API密钥不能为空');\r\n }\r\n\r\n try {\r\n const response = await fetch(`${API_DOMAIN}/sdk/v1/tts/synthesize_audio`, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'authorization': 'Bearer ' + effectiveToken,\r\n },\r\n body: JSON.stringify({ text }),\r\n });\r\n\r\n // 检查是否为401错误(未授权)\r\n if (response.status === 401) {\r\n // 触发全局token无效事件\r\n createTokenInvalidEvent();\r\n \r\n // 如果不是重试请求,则使用同步延迟500毫秒后重试一次\r\n if (!isRetry) {\r\n syncDelay(500); // 阻塞式延迟\r\n return synthesizeAudio(text, token, true);\r\n }\r\n }\r\n\r\n if (!response.ok) {\r\n throw new Error('语音合成失败');\r\n }\r\n\r\n // 获取音频数据并创建Blob URL\r\n const audioBlob = await response.blob();\r\n return URL.createObjectURL(audioBlob);\r\n } catch (error) {\r\n console.error('语音合成错误:', error);\r\n throw error;\r\n }\r\n};\r\n"],"version":3}
1
+ {"file":"index.js","mappings":";;;AAAA;AAGA;AACO,MAAM,UAAU,GAAG,2CAA4C;;ACJtE;AAGO,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,WAAW,CAAC;IACxD,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC,oBAAoB,CAAC,IAAI;AACtD,CAAA,CAAC;AAEF;AACa,MAAA,SAAS,GAAG;AACvB,IAAA,QAAQ,EAAE,MAAM,SAAS,CAAC,KAAK;AAC/B,IAAA,QAAQ,EAAE,CAAC,KAAa,KAAI;AAC1B,QAAA,SAAS,CAAC,KAAK,GAAG,KAAK;AACvB,QAAA,YAAY,CAAC,OAAO,CAAC,oBAAoB,EAAE,KAAK,CAAC;KAClD;IACD,UAAU,EAAE,MAAK;AACf,QAAA,SAAS,CAAC,KAAK,GAAG,IAAI;AACtB,QAAA,YAAY,CAAC,UAAU,CAAC,oBAAoB,CAAC;;;AAIjD;AACA,QAAQ,CAAC,OAAO,EAAE,KAAK,IAAG;IACxB,IAAI,KAAK,EAAE;AACT,QAAA,YAAY,CAAC,OAAO,CAAC,oBAAoB,EAAE,KAAK,CAAC;;SAC5C;AACL,QAAA,YAAY,CAAC,UAAU,CAAC,oBAAoB,CAAC;;AAEjD,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","names":[],"sources":["src/utils/env.ts","store/auth.store.ts"],"sourcesContent":["// 默认 API 域名\r\nconst DEFAULT_API_DOMAIN = 'https://api.pincaimao.com/agents/platform';\r\n\r\n// 从环境变量获取 API 域名,如果未设置则使用默认值\r\nexport const API_DOMAIN = process.env.API_DOMAIN || DEFAULT_API_DOMAIN;\r\n\r\n// 导出其他环境变量\r\nexport const ENV = {\r\n API_DOMAIN,\r\n // 可以添加其他环境变量\r\n}; ","// src/store/auth.store.ts\r\nimport { createStore } from '@stencil/store';\r\n\r\nexport const { state: authState, onChange } = createStore({\r\n token: localStorage.getItem('pcm-sdk-auth-token') || null\r\n});\r\n\r\n// 添加一些辅助方法\r\nexport const authStore = {\r\n getToken: () => authState.token,\r\n setToken: (token: string) => {\r\n authState.token = token;\r\n localStorage.setItem('pcm-sdk-auth-token', token);\r\n },\r\n clearToken: () => {\r\n authState.token = null;\r\n localStorage.removeItem('pcm-sdk-auth-token');\r\n }\r\n};\r\n\r\n// 自动保存到localStorage\r\nonChange('token', value => {\r\n if (value) {\r\n localStorage.setItem('pcm-sdk-auth-token', value);\r\n } else {\r\n localStorage.removeItem('pcm-sdk-auth-token');\r\n }\r\n});"],"version":3}