@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.umd.cjs
CHANGED
|
@@ -1029,7 +1029,7 @@
|
|
|
1029
1029
|
},
|
|
1030
1030
|
/** 生产环境配置 */
|
|
1031
1031
|
prod: {
|
|
1032
|
-
apiBaseUrl: 'https://
|
|
1032
|
+
apiBaseUrl: 'https://ai.zeewain3d.com'
|
|
1033
1033
|
}
|
|
1034
1034
|
};
|
|
1035
1035
|
/**
|
|
@@ -1040,7 +1040,7 @@
|
|
|
1040
1040
|
* @example
|
|
1041
1041
|
* ```typescript
|
|
1042
1042
|
* const config = getEnvConfig('prod');
|
|
1043
|
-
* console.log(config.apiBaseUrl); // https://
|
|
1043
|
+
* console.log(config.apiBaseUrl); // https://ai.zeewain3d.com/api/dh-talker
|
|
1044
1044
|
* ```
|
|
1045
1045
|
*/
|
|
1046
1046
|
function getEnvConfig(env = 'dev', withApiModule = true) {
|
|
@@ -1511,6 +1511,8 @@
|
|
|
1511
1511
|
*/
|
|
1512
1512
|
var BroadcastTaskStatus;
|
|
1513
1513
|
(function (BroadcastTaskStatus) {
|
|
1514
|
+
/** 等待中(尚未开始请求) */
|
|
1515
|
+
BroadcastTaskStatus["PENDING"] = "pending";
|
|
1514
1516
|
/** 请求中 */
|
|
1515
1517
|
BroadcastTaskStatus["REQUESTING"] = "requesting";
|
|
1516
1518
|
/** 已完成 */
|
|
@@ -1576,7 +1578,7 @@
|
|
|
1576
1578
|
* @override
|
|
1577
1579
|
*/
|
|
1578
1580
|
handleCallback(operation, code, message, data) {
|
|
1579
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _j;
|
|
1581
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
|
|
1580
1582
|
// 提取 isBroadcastCompleted 参数
|
|
1581
1583
|
const { isBroadcastCompleted } = JSON.parse(data || '{}');
|
|
1582
1584
|
// 先调用基类处理逻辑
|
|
@@ -1588,7 +1590,14 @@
|
|
|
1588
1590
|
if (isBroadcastCompleted) {
|
|
1589
1591
|
this.broadcastCompletedCount++;
|
|
1590
1592
|
const status = this.getStatus();
|
|
1591
|
-
|
|
1593
|
+
// 判断是否所有任务都已完成:
|
|
1594
|
+
// 1. 没有待请求的任务 (PENDING)
|
|
1595
|
+
// 2. 没有正在请求的任务 (REQUESTING)
|
|
1596
|
+
// 3. Unity播放完成次数等于已完成任务数
|
|
1597
|
+
const isAllTasksCompleted = ((_a = status.queueInfo) === null || _a === void 0 ? void 0 : _a.pendingTasks) === 0
|
|
1598
|
+
&& ((_b = status.queueInfo) === null || _b === void 0 ? void 0 : _b.requestingTasks) === 0
|
|
1599
|
+
&& ((_c = status.queueInfo) === null || _c === void 0 ? void 0 : _c.completedTasks) === this.broadcastCompletedCount;
|
|
1600
|
+
if (isAllTasksCompleted) {
|
|
1592
1601
|
// 重置状态、计数
|
|
1593
1602
|
this.isBroadcastingAudio = false;
|
|
1594
1603
|
this.hasReceivedAudio = false;
|
|
@@ -1598,19 +1607,19 @@
|
|
|
1598
1607
|
this.logger.warn('Broadcast all completed');
|
|
1599
1608
|
}
|
|
1600
1609
|
// this.logger.warn('AAAAAA', { status: this.getStatus(), broadcastCompletedCount: this.broadcastCompletedCount });
|
|
1601
|
-
(
|
|
1610
|
+
(_e = (_d = this.callbacks).onFinish) === null || _e === void 0 ? void 0 : _e.call(_d);
|
|
1602
1611
|
}
|
|
1603
1612
|
break;
|
|
1604
1613
|
case exports.BroadcastOperationType.PAUSE_BROADCAST:
|
|
1605
|
-
(
|
|
1614
|
+
(_g = (_f = this.callbacks).onPause) === null || _g === void 0 ? void 0 : _g.call(_f);
|
|
1606
1615
|
this.logger.debug('Broadcast paused callback triggered');
|
|
1607
1616
|
break;
|
|
1608
1617
|
case exports.BroadcastOperationType.RESUME_BROADCAST:
|
|
1609
|
-
(
|
|
1618
|
+
(_j = (_h = this.callbacks).onResume) === null || _j === void 0 ? void 0 : _j.call(_h);
|
|
1610
1619
|
this.logger.debug('Broadcast resumed callback triggered');
|
|
1611
1620
|
break;
|
|
1612
1621
|
case exports.BroadcastOperationType.STOP_BROADCAST:
|
|
1613
|
-
(
|
|
1622
|
+
(_l = (_k = this.callbacks).onStop) === null || _l === void 0 ? void 0 : _l.call(_k);
|
|
1614
1623
|
this.logger.debug('Broadcast stopped callback triggered');
|
|
1615
1624
|
break;
|
|
1616
1625
|
}
|
|
@@ -1667,7 +1676,7 @@
|
|
|
1667
1676
|
// 重置序号计数器
|
|
1668
1677
|
this.taskSequence = 0;
|
|
1669
1678
|
this.currentSendingSequence = 0;
|
|
1670
|
-
// 通知Unity
|
|
1679
|
+
// 通知Unity开始新任务(清空队列),这里不使用sendAsyncMessage,因为startBroadcast不需要等待完成,而是在任务播报完成后通过回调通知
|
|
1671
1680
|
this.sendMessage('StartBroadcast', {
|
|
1672
1681
|
callbackFun: this.uniqueCallbackName,
|
|
1673
1682
|
operationType: exports.BroadcastOperationType.START_BROADCAST,
|
|
@@ -1779,18 +1788,20 @@
|
|
|
1779
1788
|
* @description 获取当前播报服务的状态信息,包括队列状态
|
|
1780
1789
|
*/
|
|
1781
1790
|
getStatus() {
|
|
1791
|
+
const pendingTasks = this.taskQueue.filter((t) => t.status === BroadcastTaskStatus.PENDING).length;
|
|
1782
1792
|
const completedTasks = this.taskQueue.filter((t) => t.status === BroadcastTaskStatus.COMPLETED).length;
|
|
1783
1793
|
const requestingTasks = this.taskQueue.filter((t) => t.status === BroadcastTaskStatus.REQUESTING).length;
|
|
1784
1794
|
const failedTasks = this.taskQueue.filter((t) => t.status === BroadcastTaskStatus.FAILED).length;
|
|
1785
1795
|
const totalPendingResponses = this.taskQueue.reduce((sum, t) => sum + t.pendingResponses.length, 0);
|
|
1786
1796
|
const currentSendingSequence = this.currentSendingSequence;
|
|
1787
|
-
const isGeneratingAudio =
|
|
1797
|
+
const isGeneratingAudio = pendingTasks + requestingTasks > 0;
|
|
1788
1798
|
return {
|
|
1789
1799
|
isActive: this.isBroadcastingAudio || isGeneratingAudio, // 是否正在播报音频或正在生成音频
|
|
1790
1800
|
isGeneratingAudio,
|
|
1791
1801
|
hasReceivedAudio: this.hasReceivedAudio,
|
|
1792
1802
|
queueInfo: {
|
|
1793
1803
|
totalTasks: this.taskQueue.length,
|
|
1804
|
+
pendingTasks,
|
|
1794
1805
|
requestingTasks,
|
|
1795
1806
|
completedTasks,
|
|
1796
1807
|
failedTasks,
|
|
@@ -1824,7 +1835,7 @@
|
|
|
1824
1835
|
id: `broadcast_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`,
|
|
1825
1836
|
sequence: ++this.taskSequence,
|
|
1826
1837
|
params,
|
|
1827
|
-
status: BroadcastTaskStatus.
|
|
1838
|
+
status: BroadcastTaskStatus.PENDING,
|
|
1828
1839
|
controller: new AbortController(),
|
|
1829
1840
|
pendingResponses: [],
|
|
1830
1841
|
isGenerationComplete: false,
|
|
@@ -1836,46 +1847,58 @@
|
|
|
1836
1847
|
/**
|
|
1837
1848
|
* 添加任务到队列
|
|
1838
1849
|
* @param task - 播报任务
|
|
1839
|
-
* @description
|
|
1850
|
+
* @description 将任务添加到队列,只有当没有正在请求的任务时才开始请求(串行请求模式)
|
|
1840
1851
|
* @private
|
|
1841
1852
|
*/
|
|
1842
1853
|
addTaskToQueue(task) {
|
|
1843
1854
|
this.taskQueue.push(task);
|
|
1844
|
-
this.logger.debug('Task added to queue', { taskId: task.id, queueLength: this.taskQueue.length });
|
|
1845
|
-
//
|
|
1846
|
-
this.
|
|
1855
|
+
this.logger.debug('Task added to queue', { taskId: task.id, params: task.params, queueLength: this.taskQueue.length });
|
|
1856
|
+
// 检查是否有正在请求的任务
|
|
1857
|
+
const hasRequestingTask = this.taskQueue.some((t) => t.status === BroadcastTaskStatus.REQUESTING);
|
|
1858
|
+
// 只有当没有正在请求的任务时,才开始当前任务的请求
|
|
1859
|
+
if (!hasRequestingTask) {
|
|
1860
|
+
this.startTaskRequest(task);
|
|
1861
|
+
}
|
|
1862
|
+
else {
|
|
1863
|
+
this.logger.debug('Task queued, waiting for previous task to complete', {
|
|
1864
|
+
taskId: task.id,
|
|
1865
|
+
pendingTasks: this.taskQueue.filter((t) => t.status === BroadcastTaskStatus.PENDING).length
|
|
1866
|
+
});
|
|
1867
|
+
}
|
|
1847
1868
|
// 开始处理队列
|
|
1848
|
-
this.
|
|
1869
|
+
this.processTaskQueue();
|
|
1849
1870
|
}
|
|
1850
1871
|
/**
|
|
1851
1872
|
* 处理队列
|
|
1852
|
-
* @description
|
|
1873
|
+
* @description 处理队列中的任务响应,按序号发送给unity播放
|
|
1853
1874
|
* @private
|
|
1854
1875
|
*/
|
|
1855
|
-
|
|
1876
|
+
processTaskQueue() {
|
|
1856
1877
|
// 启动队列处理定时器(如果尚未启动)
|
|
1857
1878
|
if (!this.queueProcessTimer) {
|
|
1858
1879
|
this.queueProcessTimer = setInterval(() => {
|
|
1859
|
-
this.
|
|
1880
|
+
this.processTaskQueueStep();
|
|
1860
1881
|
}, 100); // 每100ms检查一次队列状态
|
|
1861
1882
|
}
|
|
1862
1883
|
// 立即处理一次
|
|
1863
|
-
this.
|
|
1884
|
+
this.processTaskQueueStep();
|
|
1864
1885
|
}
|
|
1865
1886
|
/**
|
|
1866
1887
|
* 队列处理步骤
|
|
1867
|
-
* @description
|
|
1888
|
+
* @description 处理队列中的单个步骤,按序号发送给unity播放
|
|
1868
1889
|
* @private
|
|
1869
1890
|
*/
|
|
1870
|
-
|
|
1871
|
-
//
|
|
1891
|
+
processTaskQueueStep() {
|
|
1892
|
+
// 按序号找到下一个要处理的任务(只处理已开始请求的任务,排除 PENDING 状态)
|
|
1872
1893
|
const nextTask = this.taskQueue.find((task) => task.sequence === this.currentSendingSequence + 1
|
|
1894
|
+
&& task.status !== BroadcastTaskStatus.PENDING
|
|
1873
1895
|
&& task.pendingResponses.length > 0);
|
|
1874
1896
|
if (nextTask) {
|
|
1875
1897
|
this.sendNextResponse(nextTask);
|
|
1876
1898
|
}
|
|
1877
|
-
//
|
|
1878
|
-
const remainingTasks = this.taskQueue.filter(task => task.status !== BroadcastTaskStatus.
|
|
1899
|
+
// 如果队列中没有剩余任务(排除待处理、已完成、失败和取消的任务),则停止定时器
|
|
1900
|
+
const remainingTasks = this.taskQueue.filter(task => task.status !== BroadcastTaskStatus.PENDING
|
|
1901
|
+
&& task.status !== BroadcastTaskStatus.COMPLETED
|
|
1879
1902
|
&& task.status !== BroadcastTaskStatus.FAILED
|
|
1880
1903
|
&& task.status !== BroadcastTaskStatus.CANCELLED);
|
|
1881
1904
|
if (remainingTasks.length === 0) {
|
|
@@ -1921,6 +1944,19 @@
|
|
|
1921
1944
|
body: JSON.stringify(requestBody),
|
|
1922
1945
|
signal: task.controller.signal,
|
|
1923
1946
|
openWhenHidden: true,
|
|
1947
|
+
/**
|
|
1948
|
+
* 连接建立时的回调,用于检查 HTTP 状态码
|
|
1949
|
+
* @param response - HTTP 响应对象
|
|
1950
|
+
* @throws {SDKError} 当 HTTP 状态码异常时抛出对应的 SDKError
|
|
1951
|
+
*/
|
|
1952
|
+
onopen: (response) => __awaiter(this, void 0, void 0, function* () {
|
|
1953
|
+
// 检查 HTTP 状态码,处理 401 token 过期等异常
|
|
1954
|
+
if (!response.ok) {
|
|
1955
|
+
const error = this.createHttpError(response.status, response.statusText, task.id);
|
|
1956
|
+
this.handleTaskError(task, error);
|
|
1957
|
+
throw error;
|
|
1958
|
+
}
|
|
1959
|
+
}),
|
|
1924
1960
|
onmessage: (event) => {
|
|
1925
1961
|
this.handleTaskResponse(task, event.data);
|
|
1926
1962
|
},
|
|
@@ -1928,13 +1964,17 @@
|
|
|
1928
1964
|
this.handleTaskClose(task);
|
|
1929
1965
|
},
|
|
1930
1966
|
onerror: (error) => {
|
|
1931
|
-
|
|
1932
|
-
|
|
1967
|
+
// 将所有异常统一转换为 SDKError
|
|
1968
|
+
const sdkError = this.convertToSDKError(error, task.id);
|
|
1969
|
+
this.handleTaskError(task, sdkError);
|
|
1970
|
+
throw sdkError;
|
|
1933
1971
|
}
|
|
1934
1972
|
});
|
|
1935
1973
|
}
|
|
1936
1974
|
catch (error) {
|
|
1937
|
-
|
|
1975
|
+
// 将所有异常统一转换为 SDKError
|
|
1976
|
+
const sdkError = this.convertToSDKError(error, task.id);
|
|
1977
|
+
this.handleTaskError(task, sdkError);
|
|
1938
1978
|
}
|
|
1939
1979
|
});
|
|
1940
1980
|
}
|
|
@@ -1950,7 +1990,7 @@
|
|
|
1950
1990
|
const response = JSON.parse(data);
|
|
1951
1991
|
// 错误处理
|
|
1952
1992
|
if (response.code !== 0) {
|
|
1953
|
-
this.handleBroadcastError(response.code);
|
|
1993
|
+
this.handleBroadcastError(response.code, response.message);
|
|
1954
1994
|
return;
|
|
1955
1995
|
}
|
|
1956
1996
|
// 处理音频数据
|
|
@@ -1962,7 +2002,7 @@
|
|
|
1962
2002
|
}
|
|
1963
2003
|
// 添加处理后的响应对象到待发送队列
|
|
1964
2004
|
task.pendingResponses.push(response);
|
|
1965
|
-
this.logger.debug('Response added to task', { taskId: task.id, pendingCount: task.pendingResponses.length });
|
|
2005
|
+
this.logger.debug('Response added to task', { taskId: task.id, response, pendingCount: task.pendingResponses.length });
|
|
1966
2006
|
// 检查是否完成
|
|
1967
2007
|
if (response.data.done) {
|
|
1968
2008
|
task.isGenerationComplete = true;
|
|
@@ -1971,13 +2011,13 @@
|
|
|
1971
2011
|
}
|
|
1972
2012
|
}
|
|
1973
2013
|
catch (error) {
|
|
1974
|
-
this.handleTaskError(task, error);
|
|
2014
|
+
this.handleTaskError(task, new SDKError(exports.OperationErrorCode.OPERATION_FAILED, typeof error === 'string' ? error : (error.message || '播报服务错误')));
|
|
1975
2015
|
}
|
|
1976
2016
|
}
|
|
1977
2017
|
/**
|
|
1978
|
-
*
|
|
2018
|
+
* 发送下一个响应给unity播放
|
|
1979
2019
|
* @param task - 播报任务
|
|
1980
|
-
* @description
|
|
2020
|
+
* @description 发送任务的响应数组中的第一个待发送响应到Unity(按顺序发送),发送后立即删除
|
|
1981
2021
|
* @private
|
|
1982
2022
|
*/
|
|
1983
2023
|
sendNextResponse(task) {
|
|
@@ -1992,7 +2032,7 @@
|
|
|
1992
2032
|
remainingResponses: task.pendingResponses.length,
|
|
1993
2033
|
voiceUrl: (_a = response.data) === null || _a === void 0 ? void 0 : _a.voiceUrl
|
|
1994
2034
|
});
|
|
1995
|
-
// 发送响应到Unity
|
|
2035
|
+
// 发送响应到Unity,这里不使用sendAsyncMessage,因为appendBroadcast不需要等待完成,而是在任务播报完成后通过startBroadcast回调通知
|
|
1996
2036
|
this.sendMessage('AppendBroadcast', {
|
|
1997
2037
|
response,
|
|
1998
2038
|
callbackFun: this.uniqueCallbackName,
|
|
@@ -2008,7 +2048,7 @@
|
|
|
2008
2048
|
/**
|
|
2009
2049
|
* 处理任务关闭
|
|
2010
2050
|
* @param task - 播报任务
|
|
2011
|
-
* @description
|
|
2051
|
+
* @description 处理任务的流式连接关闭,并启动下一个待处理任务的请求
|
|
2012
2052
|
* @private
|
|
2013
2053
|
*/
|
|
2014
2054
|
handleTaskClose(task) {
|
|
@@ -2017,20 +2057,26 @@
|
|
|
2017
2057
|
if (!task.isGenerationComplete && task.status === BroadcastTaskStatus.REQUESTING) {
|
|
2018
2058
|
task.isGenerationComplete = true;
|
|
2019
2059
|
}
|
|
2060
|
+
// 当前任务请求完成后(流断开后),启动下一个待处理任务的请求
|
|
2061
|
+
this.startNextPendingTask();
|
|
2020
2062
|
}
|
|
2021
2063
|
/**
|
|
2022
2064
|
* 处理任务错误
|
|
2023
2065
|
* @param task - 播报任务
|
|
2024
2066
|
* @param error - 错误对象
|
|
2025
|
-
* @description
|
|
2067
|
+
* @description 处理任务执行过程中的错误,防止重复触发错误回调,并启动下一个待处理任务
|
|
2026
2068
|
* @private
|
|
2027
2069
|
*/
|
|
2028
2070
|
handleTaskError(task, error) {
|
|
2029
2071
|
var _a, _b;
|
|
2072
|
+
// 如果任务已经是失败或取消状态,不再重复处理,防止回调被多次触发
|
|
2073
|
+
if (task.status === BroadcastTaskStatus.FAILED || task.status === BroadcastTaskStatus.CANCELLED) {
|
|
2074
|
+
return;
|
|
2075
|
+
}
|
|
2030
2076
|
task.status = BroadcastTaskStatus.FAILED;
|
|
2031
2077
|
task.error = error;
|
|
2032
2078
|
this.logger.error(`Task failed - ${task.id}`, error);
|
|
2033
|
-
//
|
|
2079
|
+
// 触发错误回调(只触发一次)
|
|
2034
2080
|
(_b = (_a = this.callbacks).onError) === null || _b === void 0 ? void 0 : _b.call(_a, error);
|
|
2035
2081
|
}
|
|
2036
2082
|
/**
|
|
@@ -2121,10 +2167,11 @@
|
|
|
2121
2167
|
/**
|
|
2122
2168
|
* 处理播报错误
|
|
2123
2169
|
* @param errorCode - 错误码
|
|
2170
|
+
* @param errorMessage - 错误消息
|
|
2124
2171
|
* @description 处理播报过程中的错误
|
|
2125
2172
|
* @private
|
|
2126
2173
|
*/
|
|
2127
|
-
handleBroadcastError(errorCode) {
|
|
2174
|
+
handleBroadcastError(errorCode, errorMessage) {
|
|
2128
2175
|
// 用户权益额度不存在错误码 14001
|
|
2129
2176
|
// 用户权益额度不足错误码 14002
|
|
2130
2177
|
// 用户权益额度冻结失败 14003
|
|
@@ -2139,10 +2186,31 @@
|
|
|
2139
2186
|
this.handleError(new SDKError(exports.OperationErrorCode.BROADCAST_EQUITY_FREEZE_FAILED, '用户权益额度冻结失败'));
|
|
2140
2187
|
break;
|
|
2141
2188
|
default:
|
|
2142
|
-
this.handleError(new SDKError(exports.OperationErrorCode.OPERATION_FAILED,
|
|
2189
|
+
this.handleError(new SDKError(exports.OperationErrorCode.OPERATION_FAILED, `${errorMessage}(${errorCode})` || `播报服务错误(${errorCode})`));
|
|
2143
2190
|
break;
|
|
2144
2191
|
}
|
|
2145
2192
|
}
|
|
2193
|
+
/**
|
|
2194
|
+
* 启动下一个待处理任务的请求
|
|
2195
|
+
* @description 在当前任务请求完成或失败后,检查并启动下一个待处理任务
|
|
2196
|
+
* @private
|
|
2197
|
+
*/
|
|
2198
|
+
startNextPendingTask() {
|
|
2199
|
+
// 查找下一个待处理的任务(按序号排序,取第一个 PENDING 状态的任务)
|
|
2200
|
+
const nextPendingTask = this.taskQueue
|
|
2201
|
+
.filter((t) => t.status === BroadcastTaskStatus.PENDING)
|
|
2202
|
+
.sort((a, b) => a.sequence - b.sequence)[0];
|
|
2203
|
+
if (nextPendingTask) {
|
|
2204
|
+
this.logger.debug('Starting next pending task', {
|
|
2205
|
+
taskId: nextPendingTask.id,
|
|
2206
|
+
sequence: nextPendingTask.sequence
|
|
2207
|
+
});
|
|
2208
|
+
this.startTaskRequest(nextPendingTask);
|
|
2209
|
+
}
|
|
2210
|
+
else {
|
|
2211
|
+
this.logger.debug('No pending tasks to start');
|
|
2212
|
+
}
|
|
2213
|
+
}
|
|
2146
2214
|
/**
|
|
2147
2215
|
* 清理队列处理定时器
|
|
2148
2216
|
* @description 清理队列处理定时器
|
|
@@ -2152,7 +2220,73 @@
|
|
|
2152
2220
|
if (this.queueProcessTimer) {
|
|
2153
2221
|
clearInterval(this.queueProcessTimer);
|
|
2154
2222
|
this.queueProcessTimer = null;
|
|
2223
|
+
this.logger.debug('Queue process timer cleared');
|
|
2224
|
+
}
|
|
2225
|
+
}
|
|
2226
|
+
/**
|
|
2227
|
+
* 根据 HTTP 状态码创建对应的 SDKError
|
|
2228
|
+
* @param status - HTTP 状态码
|
|
2229
|
+
* @param statusText - HTTP 状态文本
|
|
2230
|
+
* @param taskId - 任务 ID(用于日志记录)
|
|
2231
|
+
* @returns SDKError 实例
|
|
2232
|
+
* @description 将 HTTP 错误状态码映射为对应的 SDKError
|
|
2233
|
+
* @private
|
|
2234
|
+
*/
|
|
2235
|
+
createHttpError(status, statusText, taskId) {
|
|
2236
|
+
this.logger.warn(`HTTP error occurred - Task: ${taskId}, Status: ${status}`, { status, statusText });
|
|
2237
|
+
switch (status) {
|
|
2238
|
+
case 401:
|
|
2239
|
+
// Token 过期或未授权
|
|
2240
|
+
return new SDKError(exports.NetworkErrorCode.UNAUTHORIZED, `Token 已过期或无效,请重新授权 (HTTP ${status})`);
|
|
2241
|
+
case 403:
|
|
2242
|
+
// 禁止访问
|
|
2243
|
+
return new SDKError(exports.NetworkErrorCode.UNAUTHORIZED, `无权限访问该资源 (HTTP ${status})`);
|
|
2244
|
+
case 404:
|
|
2245
|
+
// 资源不存在
|
|
2246
|
+
return new SDKError(exports.NetworkErrorCode.SERVER_ERROR, `请求的资源不存在 (HTTP ${status})`);
|
|
2247
|
+
case 500:
|
|
2248
|
+
case 502:
|
|
2249
|
+
case 503:
|
|
2250
|
+
case 504:
|
|
2251
|
+
// 服务器错误
|
|
2252
|
+
return new SDKError(exports.NetworkErrorCode.SERVER_ERROR, `服务器错误,请稍后重试 (HTTP ${status})`);
|
|
2253
|
+
default:
|
|
2254
|
+
// 其他 HTTP 错误
|
|
2255
|
+
return new SDKError(exports.NetworkErrorCode.CONNECTION_FAILED, `网络请求失败: ${statusText || 'Unknown Error'} (HTTP ${status})`);
|
|
2256
|
+
}
|
|
2257
|
+
}
|
|
2258
|
+
/**
|
|
2259
|
+
* 将任意错误转换为 SDKError
|
|
2260
|
+
* @param error - 原始错误对象
|
|
2261
|
+
* @param taskId - 任务 ID(用于日志记录)
|
|
2262
|
+
* @returns SDKError 实例
|
|
2263
|
+
* @description 统一将各种类型的错误转换为 SDKError,便于上层统一处理
|
|
2264
|
+
* @private
|
|
2265
|
+
*/
|
|
2266
|
+
convertToSDKError(error, taskId) {
|
|
2267
|
+
// 如果已经是 SDKError,直接返回
|
|
2268
|
+
if (error instanceof SDKError) {
|
|
2269
|
+
return error;
|
|
2155
2270
|
}
|
|
2271
|
+
// 如果是普通 Error 对象
|
|
2272
|
+
if (error instanceof Error) {
|
|
2273
|
+
// 检查是否是网络相关的错误
|
|
2274
|
+
const errorMessage = error.message.toLowerCase();
|
|
2275
|
+
if (errorMessage.includes('timeout') || errorMessage.includes('timed out')) {
|
|
2276
|
+
return new SDKError(exports.NetworkErrorCode.REQUEST_TIMEOUT, `请求超时 - Task: ${taskId}`, error);
|
|
2277
|
+
}
|
|
2278
|
+
if (errorMessage.includes('network') || errorMessage.includes('fetch') || errorMessage.includes('connection')) {
|
|
2279
|
+
return new SDKError(exports.NetworkErrorCode.CONNECTION_FAILED, `网络连接失败 - Task: ${taskId}: ${error.message}`, error);
|
|
2280
|
+
}
|
|
2281
|
+
if (errorMessage.includes('abort') || errorMessage.includes('cancel')) {
|
|
2282
|
+
return new SDKError(exports.OperationErrorCode.OPERATION_CANCELLED, `操作已取消 - Task: ${taskId}`, error);
|
|
2283
|
+
}
|
|
2284
|
+
// 默认作为操作失败处理
|
|
2285
|
+
return new SDKError(exports.OperationErrorCode.OPERATION_FAILED, `播报任务执行失败 - Task: ${taskId}: ${error.message}`, error);
|
|
2286
|
+
}
|
|
2287
|
+
// 如果是字符串或其他类型
|
|
2288
|
+
const errorMessage = String(error);
|
|
2289
|
+
return new SDKError(exports.OperationErrorCode.OPERATION_FAILED, `播报任务执行失败 - Task: ${taskId}: ${errorMessage}`);
|
|
2156
2290
|
}
|
|
2157
2291
|
}
|
|
2158
2292
|
|
|
@@ -2279,6 +2413,7 @@
|
|
|
2279
2413
|
*/
|
|
2280
2414
|
initGlobalConfig() {
|
|
2281
2415
|
const config = ConfigManager.getInstance().getConfig();
|
|
2416
|
+
const { assetsFrom } = config;
|
|
2282
2417
|
const globalParams = {
|
|
2283
2418
|
token: config === null || config === void 0 ? void 0 : config.token,
|
|
2284
2419
|
apiBaseUrl: ConfigManager.getInstance().getApiBaseUrl(false),
|
|
@@ -2286,14 +2421,17 @@
|
|
|
2286
2421
|
// 純AB包方案在SDK 2.1.0 中已弃用
|
|
2287
2422
|
// assetsUrl: config?.assetsUrl
|
|
2288
2423
|
};
|
|
2289
|
-
const assetModuleParams = {
|
|
2290
|
-
isZip: true,
|
|
2291
|
-
assetBundlePath: config === null || config === void 0 ? void 0 : config.assetsUrl
|
|
2292
|
-
};
|
|
2293
2424
|
this.unityInstance.SendMessage('AvatarSDK', 'InitializeConfig', JSON.stringify(globalParams));
|
|
2294
|
-
this.unityInstance.SendMessage('AvatarSDK', 'InitAssetBundleModule', JSON.stringify(assetModuleParams));
|
|
2295
2425
|
console.warn('[ Send Unity message ]: AvatarSDK.InitializeConfig', globalParams);
|
|
2296
|
-
|
|
2426
|
+
//
|
|
2427
|
+
if (assetsFrom !== 'cloud') {
|
|
2428
|
+
const assetModuleParams = {
|
|
2429
|
+
isZip: true,
|
|
2430
|
+
assetBundlePath: config === null || config === void 0 ? void 0 : config.assetsUrl
|
|
2431
|
+
};
|
|
2432
|
+
this.unityInstance.SendMessage('AvatarSDK', 'InitAssetBundleModule', JSON.stringify(assetModuleParams));
|
|
2433
|
+
console.warn('[ Send Unity message ]: AvatarSDK.InitAssetBundleModule', assetModuleParams);
|
|
2434
|
+
}
|
|
2297
2435
|
}
|
|
2298
2436
|
}
|
|
2299
2437
|
|
|
@@ -2331,7 +2469,7 @@
|
|
|
2331
2469
|
* SDK 版本号
|
|
2332
2470
|
* @const {string} SDK_VERSION
|
|
2333
2471
|
*/
|
|
2334
|
-
const SDK_VERSION = '2.1.
|
|
2472
|
+
const SDK_VERSION = '2.1.3';
|
|
2335
2473
|
|
|
2336
2474
|
/**
|
|
2337
2475
|
* @fileoverview 统一的3D数字人SDK入口类
|
|
@@ -2397,14 +2535,16 @@
|
|
|
2397
2535
|
this.avatarService = new AvatarService({
|
|
2398
2536
|
unityInstance: this.unityInstance,
|
|
2399
2537
|
instanceId: this.instanceId,
|
|
2400
|
-
enableDebugLog: config.enableDebugLog
|
|
2538
|
+
enableDebugLog: config.enableDebugLog,
|
|
2539
|
+
timeout: config.operationTimeout
|
|
2401
2540
|
});
|
|
2402
2541
|
// 5. 创建带有唯一标识符的播报服务
|
|
2403
2542
|
this.broadcastService = new BroadcastService({
|
|
2404
2543
|
unityInstance: this.unityInstance,
|
|
2405
2544
|
instanceId: this.instanceId,
|
|
2406
2545
|
callbacks: config.broadcastCallbacks,
|
|
2407
|
-
enableDebugLog: config.enableDebugLog
|
|
2546
|
+
enableDebugLog: config.enableDebugLog,
|
|
2547
|
+
timeout: config.operationTimeout
|
|
2408
2548
|
});
|
|
2409
2549
|
// 6. 初始化数字人
|
|
2410
2550
|
const result = yield this.avatarService.initializeAvatar(avatarCode, cameraType);
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zeewain/3d-avatar-sdk",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "2.1.
|
|
4
|
+
"version": "2.1.3",
|
|
5
5
|
"description": "SDK for ZEE Avatar WebGL integration",
|
|
6
6
|
"author": "ZEEWain",
|
|
7
7
|
"license": "MIT",
|
|
@@ -55,6 +55,7 @@
|
|
|
55
55
|
"release:patch": "release-it patch",
|
|
56
56
|
"release:minor": "release-it minor",
|
|
57
57
|
"release:major": "release-it major",
|
|
58
|
+
"release:dry:internal": "release-it --dry-run --config .release-it.internal.json",
|
|
58
59
|
"release:dry": "release-it --dry-run",
|
|
59
60
|
"release:internal": "release-it --config .release-it.internal.json",
|
|
60
61
|
"release:alpha": "npm run release:internal -- --preRelease=alpha",
|