@zeewain/3d-avatar-sdk 2.1.1 → 2.1.3
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.
- package/README.md +38 -4
- package/dist/examples/test-vue2/package.json +1 -1
- package/dist/examples/test-vue3/package.json +1 -1
- package/dist/examples/test-vue3/src/App.vue +7 -3
- package/dist/examples/test-vue3/src/components/BroadcastAPI.vue +270 -2
- package/dist/index.d.ts +428 -398
- package/dist/index.es5.js +195 -45
- package/dist/index.es5.umd.js +195 -45
- package/dist/index.esm.js +188 -48
- package/dist/index.umd.cjs +188 -48
- package/package.json +2 -1
package/dist/index.esm.js
CHANGED
|
@@ -1023,7 +1023,7 @@ const ENV_MAP = {
|
|
|
1023
1023
|
},
|
|
1024
1024
|
/** 生产环境配置 */
|
|
1025
1025
|
prod: {
|
|
1026
|
-
apiBaseUrl: 'https://
|
|
1026
|
+
apiBaseUrl: 'https://ai.zeewain3d.com'
|
|
1027
1027
|
}
|
|
1028
1028
|
};
|
|
1029
1029
|
/**
|
|
@@ -1034,7 +1034,7 @@ const ENV_MAP = {
|
|
|
1034
1034
|
* @example
|
|
1035
1035
|
* ```typescript
|
|
1036
1036
|
* const config = getEnvConfig('prod');
|
|
1037
|
-
* console.log(config.apiBaseUrl); // https://
|
|
1037
|
+
* console.log(config.apiBaseUrl); // https://ai.zeewain3d.com/api/dh-talker
|
|
1038
1038
|
* ```
|
|
1039
1039
|
*/
|
|
1040
1040
|
function getEnvConfig(env = 'dev', withApiModule = true) {
|
|
@@ -1505,6 +1505,8 @@ var BroadcastType;
|
|
|
1505
1505
|
*/
|
|
1506
1506
|
var BroadcastTaskStatus;
|
|
1507
1507
|
(function (BroadcastTaskStatus) {
|
|
1508
|
+
/** 等待中(尚未开始请求) */
|
|
1509
|
+
BroadcastTaskStatus["PENDING"] = "pending";
|
|
1508
1510
|
/** 请求中 */
|
|
1509
1511
|
BroadcastTaskStatus["REQUESTING"] = "requesting";
|
|
1510
1512
|
/** 已完成 */
|
|
@@ -1570,7 +1572,7 @@ class BroadcastService extends UnityBaseService {
|
|
|
1570
1572
|
* @override
|
|
1571
1573
|
*/
|
|
1572
1574
|
handleCallback(operation, code, message, data) {
|
|
1573
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _j;
|
|
1575
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
|
|
1574
1576
|
// 提取 isBroadcastCompleted 参数
|
|
1575
1577
|
const { isBroadcastCompleted } = JSON.parse(data || '{}');
|
|
1576
1578
|
// 先调用基类处理逻辑
|
|
@@ -1582,7 +1584,14 @@ class BroadcastService extends UnityBaseService {
|
|
|
1582
1584
|
if (isBroadcastCompleted) {
|
|
1583
1585
|
this.broadcastCompletedCount++;
|
|
1584
1586
|
const status = this.getStatus();
|
|
1585
|
-
|
|
1587
|
+
// 判断是否所有任务都已完成:
|
|
1588
|
+
// 1. 没有待请求的任务 (PENDING)
|
|
1589
|
+
// 2. 没有正在请求的任务 (REQUESTING)
|
|
1590
|
+
// 3. Unity播放完成次数等于已完成任务数
|
|
1591
|
+
const isAllTasksCompleted = ((_a = status.queueInfo) === null || _a === void 0 ? void 0 : _a.pendingTasks) === 0
|
|
1592
|
+
&& ((_b = status.queueInfo) === null || _b === void 0 ? void 0 : _b.requestingTasks) === 0
|
|
1593
|
+
&& ((_c = status.queueInfo) === null || _c === void 0 ? void 0 : _c.completedTasks) === this.broadcastCompletedCount;
|
|
1594
|
+
if (isAllTasksCompleted) {
|
|
1586
1595
|
// 重置状态、计数
|
|
1587
1596
|
this.isBroadcastingAudio = false;
|
|
1588
1597
|
this.hasReceivedAudio = false;
|
|
@@ -1592,19 +1601,19 @@ class BroadcastService extends UnityBaseService {
|
|
|
1592
1601
|
this.logger.warn('Broadcast all completed');
|
|
1593
1602
|
}
|
|
1594
1603
|
// this.logger.warn('AAAAAA', { status: this.getStatus(), broadcastCompletedCount: this.broadcastCompletedCount });
|
|
1595
|
-
(
|
|
1604
|
+
(_e = (_d = this.callbacks).onFinish) === null || _e === void 0 ? void 0 : _e.call(_d);
|
|
1596
1605
|
}
|
|
1597
1606
|
break;
|
|
1598
1607
|
case BroadcastOperationType.PAUSE_BROADCAST:
|
|
1599
|
-
(
|
|
1608
|
+
(_g = (_f = this.callbacks).onPause) === null || _g === void 0 ? void 0 : _g.call(_f);
|
|
1600
1609
|
this.logger.debug('Broadcast paused callback triggered');
|
|
1601
1610
|
break;
|
|
1602
1611
|
case BroadcastOperationType.RESUME_BROADCAST:
|
|
1603
|
-
(
|
|
1612
|
+
(_j = (_h = this.callbacks).onResume) === null || _j === void 0 ? void 0 : _j.call(_h);
|
|
1604
1613
|
this.logger.debug('Broadcast resumed callback triggered');
|
|
1605
1614
|
break;
|
|
1606
1615
|
case BroadcastOperationType.STOP_BROADCAST:
|
|
1607
|
-
(
|
|
1616
|
+
(_l = (_k = this.callbacks).onStop) === null || _l === void 0 ? void 0 : _l.call(_k);
|
|
1608
1617
|
this.logger.debug('Broadcast stopped callback triggered');
|
|
1609
1618
|
break;
|
|
1610
1619
|
}
|
|
@@ -1661,7 +1670,7 @@ class BroadcastService extends UnityBaseService {
|
|
|
1661
1670
|
// 重置序号计数器
|
|
1662
1671
|
this.taskSequence = 0;
|
|
1663
1672
|
this.currentSendingSequence = 0;
|
|
1664
|
-
// 通知Unity
|
|
1673
|
+
// 通知Unity开始新任务(清空队列),这里不使用sendAsyncMessage,因为startBroadcast不需要等待完成,而是在任务播报完成后通过回调通知
|
|
1665
1674
|
this.sendMessage('StartBroadcast', {
|
|
1666
1675
|
callbackFun: this.uniqueCallbackName,
|
|
1667
1676
|
operationType: BroadcastOperationType.START_BROADCAST,
|
|
@@ -1773,18 +1782,20 @@ class BroadcastService extends UnityBaseService {
|
|
|
1773
1782
|
* @description 获取当前播报服务的状态信息,包括队列状态
|
|
1774
1783
|
*/
|
|
1775
1784
|
getStatus() {
|
|
1785
|
+
const pendingTasks = this.taskQueue.filter((t) => t.status === BroadcastTaskStatus.PENDING).length;
|
|
1776
1786
|
const completedTasks = this.taskQueue.filter((t) => t.status === BroadcastTaskStatus.COMPLETED).length;
|
|
1777
1787
|
const requestingTasks = this.taskQueue.filter((t) => t.status === BroadcastTaskStatus.REQUESTING).length;
|
|
1778
1788
|
const failedTasks = this.taskQueue.filter((t) => t.status === BroadcastTaskStatus.FAILED).length;
|
|
1779
1789
|
const totalPendingResponses = this.taskQueue.reduce((sum, t) => sum + t.pendingResponses.length, 0);
|
|
1780
1790
|
const currentSendingSequence = this.currentSendingSequence;
|
|
1781
|
-
const isGeneratingAudio =
|
|
1791
|
+
const isGeneratingAudio = pendingTasks + requestingTasks > 0;
|
|
1782
1792
|
return {
|
|
1783
1793
|
isActive: this.isBroadcastingAudio || isGeneratingAudio, // 是否正在播报音频或正在生成音频
|
|
1784
1794
|
isGeneratingAudio,
|
|
1785
1795
|
hasReceivedAudio: this.hasReceivedAudio,
|
|
1786
1796
|
queueInfo: {
|
|
1787
1797
|
totalTasks: this.taskQueue.length,
|
|
1798
|
+
pendingTasks,
|
|
1788
1799
|
requestingTasks,
|
|
1789
1800
|
completedTasks,
|
|
1790
1801
|
failedTasks,
|
|
@@ -1818,7 +1829,7 @@ class BroadcastService extends UnityBaseService {
|
|
|
1818
1829
|
id: `broadcast_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`,
|
|
1819
1830
|
sequence: ++this.taskSequence,
|
|
1820
1831
|
params,
|
|
1821
|
-
status: BroadcastTaskStatus.
|
|
1832
|
+
status: BroadcastTaskStatus.PENDING,
|
|
1822
1833
|
controller: new AbortController(),
|
|
1823
1834
|
pendingResponses: [],
|
|
1824
1835
|
isGenerationComplete: false,
|
|
@@ -1830,46 +1841,58 @@ class BroadcastService extends UnityBaseService {
|
|
|
1830
1841
|
/**
|
|
1831
1842
|
* 添加任务到队列
|
|
1832
1843
|
* @param task - 播报任务
|
|
1833
|
-
* @description
|
|
1844
|
+
* @description 将任务添加到队列,只有当没有正在请求的任务时才开始请求(串行请求模式)
|
|
1834
1845
|
* @private
|
|
1835
1846
|
*/
|
|
1836
1847
|
addTaskToQueue(task) {
|
|
1837
1848
|
this.taskQueue.push(task);
|
|
1838
|
-
this.logger.debug('Task added to queue', { taskId: task.id, queueLength: this.taskQueue.length });
|
|
1839
|
-
//
|
|
1840
|
-
this.
|
|
1849
|
+
this.logger.debug('Task added to queue', { taskId: task.id, params: task.params, queueLength: this.taskQueue.length });
|
|
1850
|
+
// 检查是否有正在请求的任务
|
|
1851
|
+
const hasRequestingTask = this.taskQueue.some((t) => t.status === BroadcastTaskStatus.REQUESTING);
|
|
1852
|
+
// 只有当没有正在请求的任务时,才开始当前任务的请求
|
|
1853
|
+
if (!hasRequestingTask) {
|
|
1854
|
+
this.startTaskRequest(task);
|
|
1855
|
+
}
|
|
1856
|
+
else {
|
|
1857
|
+
this.logger.debug('Task queued, waiting for previous task to complete', {
|
|
1858
|
+
taskId: task.id,
|
|
1859
|
+
pendingTasks: this.taskQueue.filter((t) => t.status === BroadcastTaskStatus.PENDING).length
|
|
1860
|
+
});
|
|
1861
|
+
}
|
|
1841
1862
|
// 开始处理队列
|
|
1842
|
-
this.
|
|
1863
|
+
this.processTaskQueue();
|
|
1843
1864
|
}
|
|
1844
1865
|
/**
|
|
1845
1866
|
* 处理队列
|
|
1846
|
-
* @description
|
|
1867
|
+
* @description 处理队列中的任务响应,按序号发送给unity播放
|
|
1847
1868
|
* @private
|
|
1848
1869
|
*/
|
|
1849
|
-
|
|
1870
|
+
processTaskQueue() {
|
|
1850
1871
|
// 启动队列处理定时器(如果尚未启动)
|
|
1851
1872
|
if (!this.queueProcessTimer) {
|
|
1852
1873
|
this.queueProcessTimer = setInterval(() => {
|
|
1853
|
-
this.
|
|
1874
|
+
this.processTaskQueueStep();
|
|
1854
1875
|
}, 100); // 每100ms检查一次队列状态
|
|
1855
1876
|
}
|
|
1856
1877
|
// 立即处理一次
|
|
1857
|
-
this.
|
|
1878
|
+
this.processTaskQueueStep();
|
|
1858
1879
|
}
|
|
1859
1880
|
/**
|
|
1860
1881
|
* 队列处理步骤
|
|
1861
|
-
* @description
|
|
1882
|
+
* @description 处理队列中的单个步骤,按序号发送给unity播放
|
|
1862
1883
|
* @private
|
|
1863
1884
|
*/
|
|
1864
|
-
|
|
1865
|
-
//
|
|
1885
|
+
processTaskQueueStep() {
|
|
1886
|
+
// 按序号找到下一个要处理的任务(只处理已开始请求的任务,排除 PENDING 状态)
|
|
1866
1887
|
const nextTask = this.taskQueue.find((task) => task.sequence === this.currentSendingSequence + 1
|
|
1888
|
+
&& task.status !== BroadcastTaskStatus.PENDING
|
|
1867
1889
|
&& task.pendingResponses.length > 0);
|
|
1868
1890
|
if (nextTask) {
|
|
1869
1891
|
this.sendNextResponse(nextTask);
|
|
1870
1892
|
}
|
|
1871
|
-
//
|
|
1872
|
-
const remainingTasks = this.taskQueue.filter(task => task.status !== BroadcastTaskStatus.
|
|
1893
|
+
// 如果队列中没有剩余任务(排除待处理、已完成、失败和取消的任务),则停止定时器
|
|
1894
|
+
const remainingTasks = this.taskQueue.filter(task => task.status !== BroadcastTaskStatus.PENDING
|
|
1895
|
+
&& task.status !== BroadcastTaskStatus.COMPLETED
|
|
1873
1896
|
&& task.status !== BroadcastTaskStatus.FAILED
|
|
1874
1897
|
&& task.status !== BroadcastTaskStatus.CANCELLED);
|
|
1875
1898
|
if (remainingTasks.length === 0) {
|
|
@@ -1915,6 +1938,19 @@ class BroadcastService extends UnityBaseService {
|
|
|
1915
1938
|
body: JSON.stringify(requestBody),
|
|
1916
1939
|
signal: task.controller.signal,
|
|
1917
1940
|
openWhenHidden: true,
|
|
1941
|
+
/**
|
|
1942
|
+
* 连接建立时的回调,用于检查 HTTP 状态码
|
|
1943
|
+
* @param response - HTTP 响应对象
|
|
1944
|
+
* @throws {SDKError} 当 HTTP 状态码异常时抛出对应的 SDKError
|
|
1945
|
+
*/
|
|
1946
|
+
onopen: (response) => __awaiter(this, void 0, void 0, function* () {
|
|
1947
|
+
// 检查 HTTP 状态码,处理 401 token 过期等异常
|
|
1948
|
+
if (!response.ok) {
|
|
1949
|
+
const error = this.createHttpError(response.status, response.statusText, task.id);
|
|
1950
|
+
this.handleTaskError(task, error);
|
|
1951
|
+
throw error;
|
|
1952
|
+
}
|
|
1953
|
+
}),
|
|
1918
1954
|
onmessage: (event) => {
|
|
1919
1955
|
this.handleTaskResponse(task, event.data);
|
|
1920
1956
|
},
|
|
@@ -1922,13 +1958,17 @@ class BroadcastService extends UnityBaseService {
|
|
|
1922
1958
|
this.handleTaskClose(task);
|
|
1923
1959
|
},
|
|
1924
1960
|
onerror: (error) => {
|
|
1925
|
-
|
|
1926
|
-
|
|
1961
|
+
// 将所有异常统一转换为 SDKError
|
|
1962
|
+
const sdkError = this.convertToSDKError(error, task.id);
|
|
1963
|
+
this.handleTaskError(task, sdkError);
|
|
1964
|
+
throw sdkError;
|
|
1927
1965
|
}
|
|
1928
1966
|
});
|
|
1929
1967
|
}
|
|
1930
1968
|
catch (error) {
|
|
1931
|
-
|
|
1969
|
+
// 将所有异常统一转换为 SDKError
|
|
1970
|
+
const sdkError = this.convertToSDKError(error, task.id);
|
|
1971
|
+
this.handleTaskError(task, sdkError);
|
|
1932
1972
|
}
|
|
1933
1973
|
});
|
|
1934
1974
|
}
|
|
@@ -1944,7 +1984,7 @@ class BroadcastService extends UnityBaseService {
|
|
|
1944
1984
|
const response = JSON.parse(data);
|
|
1945
1985
|
// 错误处理
|
|
1946
1986
|
if (response.code !== 0) {
|
|
1947
|
-
this.handleBroadcastError(response.code);
|
|
1987
|
+
this.handleBroadcastError(response.code, response.message);
|
|
1948
1988
|
return;
|
|
1949
1989
|
}
|
|
1950
1990
|
// 处理音频数据
|
|
@@ -1956,7 +1996,7 @@ class BroadcastService extends UnityBaseService {
|
|
|
1956
1996
|
}
|
|
1957
1997
|
// 添加处理后的响应对象到待发送队列
|
|
1958
1998
|
task.pendingResponses.push(response);
|
|
1959
|
-
this.logger.debug('Response added to task', { taskId: task.id, pendingCount: task.pendingResponses.length });
|
|
1999
|
+
this.logger.debug('Response added to task', { taskId: task.id, response, pendingCount: task.pendingResponses.length });
|
|
1960
2000
|
// 检查是否完成
|
|
1961
2001
|
if (response.data.done) {
|
|
1962
2002
|
task.isGenerationComplete = true;
|
|
@@ -1965,13 +2005,13 @@ class BroadcastService extends UnityBaseService {
|
|
|
1965
2005
|
}
|
|
1966
2006
|
}
|
|
1967
2007
|
catch (error) {
|
|
1968
|
-
this.handleTaskError(task, error);
|
|
2008
|
+
this.handleTaskError(task, new SDKError(OperationErrorCode.OPERATION_FAILED, typeof error === 'string' ? error : (error.message || '播报服务错误')));
|
|
1969
2009
|
}
|
|
1970
2010
|
}
|
|
1971
2011
|
/**
|
|
1972
|
-
*
|
|
2012
|
+
* 发送下一个响应给unity播放
|
|
1973
2013
|
* @param task - 播报任务
|
|
1974
|
-
* @description
|
|
2014
|
+
* @description 发送任务的响应数组中的第一个待发送响应到Unity(按顺序发送),发送后立即删除
|
|
1975
2015
|
* @private
|
|
1976
2016
|
*/
|
|
1977
2017
|
sendNextResponse(task) {
|
|
@@ -1986,7 +2026,7 @@ class BroadcastService extends UnityBaseService {
|
|
|
1986
2026
|
remainingResponses: task.pendingResponses.length,
|
|
1987
2027
|
voiceUrl: (_a = response.data) === null || _a === void 0 ? void 0 : _a.voiceUrl
|
|
1988
2028
|
});
|
|
1989
|
-
// 发送响应到Unity
|
|
2029
|
+
// 发送响应到Unity,这里不使用sendAsyncMessage,因为appendBroadcast不需要等待完成,而是在任务播报完成后通过startBroadcast回调通知
|
|
1990
2030
|
this.sendMessage('AppendBroadcast', {
|
|
1991
2031
|
response,
|
|
1992
2032
|
callbackFun: this.uniqueCallbackName,
|
|
@@ -2002,7 +2042,7 @@ class BroadcastService extends UnityBaseService {
|
|
|
2002
2042
|
/**
|
|
2003
2043
|
* 处理任务关闭
|
|
2004
2044
|
* @param task - 播报任务
|
|
2005
|
-
* @description
|
|
2045
|
+
* @description 处理任务的流式连接关闭,并启动下一个待处理任务的请求
|
|
2006
2046
|
* @private
|
|
2007
2047
|
*/
|
|
2008
2048
|
handleTaskClose(task) {
|
|
@@ -2011,20 +2051,26 @@ class BroadcastService extends UnityBaseService {
|
|
|
2011
2051
|
if (!task.isGenerationComplete && task.status === BroadcastTaskStatus.REQUESTING) {
|
|
2012
2052
|
task.isGenerationComplete = true;
|
|
2013
2053
|
}
|
|
2054
|
+
// 当前任务请求完成后(流断开后),启动下一个待处理任务的请求
|
|
2055
|
+
this.startNextPendingTask();
|
|
2014
2056
|
}
|
|
2015
2057
|
/**
|
|
2016
2058
|
* 处理任务错误
|
|
2017
2059
|
* @param task - 播报任务
|
|
2018
2060
|
* @param error - 错误对象
|
|
2019
|
-
* @description
|
|
2061
|
+
* @description 处理任务执行过程中的错误,防止重复触发错误回调,并启动下一个待处理任务
|
|
2020
2062
|
* @private
|
|
2021
2063
|
*/
|
|
2022
2064
|
handleTaskError(task, error) {
|
|
2023
2065
|
var _a, _b;
|
|
2066
|
+
// 如果任务已经是失败或取消状态,不再重复处理,防止回调被多次触发
|
|
2067
|
+
if (task.status === BroadcastTaskStatus.FAILED || task.status === BroadcastTaskStatus.CANCELLED) {
|
|
2068
|
+
return;
|
|
2069
|
+
}
|
|
2024
2070
|
task.status = BroadcastTaskStatus.FAILED;
|
|
2025
2071
|
task.error = error;
|
|
2026
2072
|
this.logger.error(`Task failed - ${task.id}`, error);
|
|
2027
|
-
//
|
|
2073
|
+
// 触发错误回调(只触发一次)
|
|
2028
2074
|
(_b = (_a = this.callbacks).onError) === null || _b === void 0 ? void 0 : _b.call(_a, error);
|
|
2029
2075
|
}
|
|
2030
2076
|
/**
|
|
@@ -2115,10 +2161,11 @@ class BroadcastService extends UnityBaseService {
|
|
|
2115
2161
|
/**
|
|
2116
2162
|
* 处理播报错误
|
|
2117
2163
|
* @param errorCode - 错误码
|
|
2164
|
+
* @param errorMessage - 错误消息
|
|
2118
2165
|
* @description 处理播报过程中的错误
|
|
2119
2166
|
* @private
|
|
2120
2167
|
*/
|
|
2121
|
-
handleBroadcastError(errorCode) {
|
|
2168
|
+
handleBroadcastError(errorCode, errorMessage) {
|
|
2122
2169
|
// 用户权益额度不存在错误码 14001
|
|
2123
2170
|
// 用户权益额度不足错误码 14002
|
|
2124
2171
|
// 用户权益额度冻结失败 14003
|
|
@@ -2133,10 +2180,31 @@ class BroadcastService extends UnityBaseService {
|
|
|
2133
2180
|
this.handleError(new SDKError(OperationErrorCode.BROADCAST_EQUITY_FREEZE_FAILED, '用户权益额度冻结失败'));
|
|
2134
2181
|
break;
|
|
2135
2182
|
default:
|
|
2136
|
-
this.handleError(new SDKError(OperationErrorCode.OPERATION_FAILED,
|
|
2183
|
+
this.handleError(new SDKError(OperationErrorCode.OPERATION_FAILED, `${errorMessage}(${errorCode})` || `播报服务错误(${errorCode})`));
|
|
2137
2184
|
break;
|
|
2138
2185
|
}
|
|
2139
2186
|
}
|
|
2187
|
+
/**
|
|
2188
|
+
* 启动下一个待处理任务的请求
|
|
2189
|
+
* @description 在当前任务请求完成或失败后,检查并启动下一个待处理任务
|
|
2190
|
+
* @private
|
|
2191
|
+
*/
|
|
2192
|
+
startNextPendingTask() {
|
|
2193
|
+
// 查找下一个待处理的任务(按序号排序,取第一个 PENDING 状态的任务)
|
|
2194
|
+
const nextPendingTask = this.taskQueue
|
|
2195
|
+
.filter((t) => t.status === BroadcastTaskStatus.PENDING)
|
|
2196
|
+
.sort((a, b) => a.sequence - b.sequence)[0];
|
|
2197
|
+
if (nextPendingTask) {
|
|
2198
|
+
this.logger.debug('Starting next pending task', {
|
|
2199
|
+
taskId: nextPendingTask.id,
|
|
2200
|
+
sequence: nextPendingTask.sequence
|
|
2201
|
+
});
|
|
2202
|
+
this.startTaskRequest(nextPendingTask);
|
|
2203
|
+
}
|
|
2204
|
+
else {
|
|
2205
|
+
this.logger.debug('No pending tasks to start');
|
|
2206
|
+
}
|
|
2207
|
+
}
|
|
2140
2208
|
/**
|
|
2141
2209
|
* 清理队列处理定时器
|
|
2142
2210
|
* @description 清理队列处理定时器
|
|
@@ -2146,7 +2214,73 @@ class BroadcastService extends UnityBaseService {
|
|
|
2146
2214
|
if (this.queueProcessTimer) {
|
|
2147
2215
|
clearInterval(this.queueProcessTimer);
|
|
2148
2216
|
this.queueProcessTimer = null;
|
|
2217
|
+
this.logger.debug('Queue process timer cleared');
|
|
2218
|
+
}
|
|
2219
|
+
}
|
|
2220
|
+
/**
|
|
2221
|
+
* 根据 HTTP 状态码创建对应的 SDKError
|
|
2222
|
+
* @param status - HTTP 状态码
|
|
2223
|
+
* @param statusText - HTTP 状态文本
|
|
2224
|
+
* @param taskId - 任务 ID(用于日志记录)
|
|
2225
|
+
* @returns SDKError 实例
|
|
2226
|
+
* @description 将 HTTP 错误状态码映射为对应的 SDKError
|
|
2227
|
+
* @private
|
|
2228
|
+
*/
|
|
2229
|
+
createHttpError(status, statusText, taskId) {
|
|
2230
|
+
this.logger.warn(`HTTP error occurred - Task: ${taskId}, Status: ${status}`, { status, statusText });
|
|
2231
|
+
switch (status) {
|
|
2232
|
+
case 401:
|
|
2233
|
+
// Token 过期或未授权
|
|
2234
|
+
return new SDKError(NetworkErrorCode.UNAUTHORIZED, `Token 已过期或无效,请重新授权 (HTTP ${status})`);
|
|
2235
|
+
case 403:
|
|
2236
|
+
// 禁止访问
|
|
2237
|
+
return new SDKError(NetworkErrorCode.UNAUTHORIZED, `无权限访问该资源 (HTTP ${status})`);
|
|
2238
|
+
case 404:
|
|
2239
|
+
// 资源不存在
|
|
2240
|
+
return new SDKError(NetworkErrorCode.SERVER_ERROR, `请求的资源不存在 (HTTP ${status})`);
|
|
2241
|
+
case 500:
|
|
2242
|
+
case 502:
|
|
2243
|
+
case 503:
|
|
2244
|
+
case 504:
|
|
2245
|
+
// 服务器错误
|
|
2246
|
+
return new SDKError(NetworkErrorCode.SERVER_ERROR, `服务器错误,请稍后重试 (HTTP ${status})`);
|
|
2247
|
+
default:
|
|
2248
|
+
// 其他 HTTP 错误
|
|
2249
|
+
return new SDKError(NetworkErrorCode.CONNECTION_FAILED, `网络请求失败: ${statusText || 'Unknown Error'} (HTTP ${status})`);
|
|
2250
|
+
}
|
|
2251
|
+
}
|
|
2252
|
+
/**
|
|
2253
|
+
* 将任意错误转换为 SDKError
|
|
2254
|
+
* @param error - 原始错误对象
|
|
2255
|
+
* @param taskId - 任务 ID(用于日志记录)
|
|
2256
|
+
* @returns SDKError 实例
|
|
2257
|
+
* @description 统一将各种类型的错误转换为 SDKError,便于上层统一处理
|
|
2258
|
+
* @private
|
|
2259
|
+
*/
|
|
2260
|
+
convertToSDKError(error, taskId) {
|
|
2261
|
+
// 如果已经是 SDKError,直接返回
|
|
2262
|
+
if (error instanceof SDKError) {
|
|
2263
|
+
return error;
|
|
2149
2264
|
}
|
|
2265
|
+
// 如果是普通 Error 对象
|
|
2266
|
+
if (error instanceof Error) {
|
|
2267
|
+
// 检查是否是网络相关的错误
|
|
2268
|
+
const errorMessage = error.message.toLowerCase();
|
|
2269
|
+
if (errorMessage.includes('timeout') || errorMessage.includes('timed out')) {
|
|
2270
|
+
return new SDKError(NetworkErrorCode.REQUEST_TIMEOUT, `请求超时 - Task: ${taskId}`, error);
|
|
2271
|
+
}
|
|
2272
|
+
if (errorMessage.includes('network') || errorMessage.includes('fetch') || errorMessage.includes('connection')) {
|
|
2273
|
+
return new SDKError(NetworkErrorCode.CONNECTION_FAILED, `网络连接失败 - Task: ${taskId}: ${error.message}`, error);
|
|
2274
|
+
}
|
|
2275
|
+
if (errorMessage.includes('abort') || errorMessage.includes('cancel')) {
|
|
2276
|
+
return new SDKError(OperationErrorCode.OPERATION_CANCELLED, `操作已取消 - Task: ${taskId}`, error);
|
|
2277
|
+
}
|
|
2278
|
+
// 默认作为操作失败处理
|
|
2279
|
+
return new SDKError(OperationErrorCode.OPERATION_FAILED, `播报任务执行失败 - Task: ${taskId}: ${error.message}`, error);
|
|
2280
|
+
}
|
|
2281
|
+
// 如果是字符串或其他类型
|
|
2282
|
+
const errorMessage = String(error);
|
|
2283
|
+
return new SDKError(OperationErrorCode.OPERATION_FAILED, `播报任务执行失败 - Task: ${taskId}: ${errorMessage}`);
|
|
2150
2284
|
}
|
|
2151
2285
|
}
|
|
2152
2286
|
|
|
@@ -2273,6 +2407,7 @@ class ZEEAvatarLoader {
|
|
|
2273
2407
|
*/
|
|
2274
2408
|
initGlobalConfig() {
|
|
2275
2409
|
const config = ConfigManager.getInstance().getConfig();
|
|
2410
|
+
const { assetsFrom } = config;
|
|
2276
2411
|
const globalParams = {
|
|
2277
2412
|
token: config === null || config === void 0 ? void 0 : config.token,
|
|
2278
2413
|
apiBaseUrl: ConfigManager.getInstance().getApiBaseUrl(false),
|
|
@@ -2280,14 +2415,17 @@ class ZEEAvatarLoader {
|
|
|
2280
2415
|
// 純AB包方案在SDK 2.1.0 中已弃用
|
|
2281
2416
|
// assetsUrl: config?.assetsUrl
|
|
2282
2417
|
};
|
|
2283
|
-
const assetModuleParams = {
|
|
2284
|
-
isZip: true,
|
|
2285
|
-
assetBundlePath: config === null || config === void 0 ? void 0 : config.assetsUrl
|
|
2286
|
-
};
|
|
2287
2418
|
this.unityInstance.SendMessage('AvatarSDK', 'InitializeConfig', JSON.stringify(globalParams));
|
|
2288
|
-
this.unityInstance.SendMessage('AvatarSDK', 'InitAssetBundleModule', JSON.stringify(assetModuleParams));
|
|
2289
2419
|
console.warn('[ Send Unity message ]: AvatarSDK.InitializeConfig', globalParams);
|
|
2290
|
-
|
|
2420
|
+
//
|
|
2421
|
+
if (assetsFrom !== 'cloud') {
|
|
2422
|
+
const assetModuleParams = {
|
|
2423
|
+
isZip: true,
|
|
2424
|
+
assetBundlePath: config === null || config === void 0 ? void 0 : config.assetsUrl
|
|
2425
|
+
};
|
|
2426
|
+
this.unityInstance.SendMessage('AvatarSDK', 'InitAssetBundleModule', JSON.stringify(assetModuleParams));
|
|
2427
|
+
console.warn('[ Send Unity message ]: AvatarSDK.InitAssetBundleModule', assetModuleParams);
|
|
2428
|
+
}
|
|
2291
2429
|
}
|
|
2292
2430
|
}
|
|
2293
2431
|
|
|
@@ -2325,7 +2463,7 @@ function compareVersionCompatibility(version1, version2) {
|
|
|
2325
2463
|
* SDK 版本号
|
|
2326
2464
|
* @const {string} SDK_VERSION
|
|
2327
2465
|
*/
|
|
2328
|
-
const SDK_VERSION = '2.1.
|
|
2466
|
+
const SDK_VERSION = '2.1.3';
|
|
2329
2467
|
|
|
2330
2468
|
/**
|
|
2331
2469
|
* @fileoverview 统一的3D数字人SDK入口类
|
|
@@ -2391,14 +2529,16 @@ class ZEEAvatarSDK {
|
|
|
2391
2529
|
this.avatarService = new AvatarService({
|
|
2392
2530
|
unityInstance: this.unityInstance,
|
|
2393
2531
|
instanceId: this.instanceId,
|
|
2394
|
-
enableDebugLog: config.enableDebugLog
|
|
2532
|
+
enableDebugLog: config.enableDebugLog,
|
|
2533
|
+
timeout: config.operationTimeout
|
|
2395
2534
|
});
|
|
2396
2535
|
// 5. 创建带有唯一标识符的播报服务
|
|
2397
2536
|
this.broadcastService = new BroadcastService({
|
|
2398
2537
|
unityInstance: this.unityInstance,
|
|
2399
2538
|
instanceId: this.instanceId,
|
|
2400
2539
|
callbacks: config.broadcastCallbacks,
|
|
2401
|
-
enableDebugLog: config.enableDebugLog
|
|
2540
|
+
enableDebugLog: config.enableDebugLog,
|
|
2541
|
+
timeout: config.operationTimeout
|
|
2402
2542
|
});
|
|
2403
2543
|
// 6. 初始化数字人
|
|
2404
2544
|
const result = yield this.avatarService.initializeAvatar(avatarCode, cameraType);
|