@zeewain/3d-avatar-sdk 2.2.1 → 2.2.2
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/dist/assets/Build/webgl.data.unityweb +0 -0
- package/dist/assets/Build/webgl.framework.js.unityweb +0 -0
- package/dist/assets/Build/webgl.wasm.unityweb +0 -0
- 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 +2 -2
- package/dist/examples/test-vue3/src/components/UnityPreview.vue +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.es5.js +1 -1
- package/dist/index.es5.umd.js +1 -1
- package/dist/index.esm.js +1 -1
- package/dist/index.umd.cjs +1 -1
- package/package.json +1 -1
package/dist/index.esm.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
function __awaiter(thisArg,_arguments,P,generator){return new(P||(P=Promise))(function(resolve,reject){function fulfilled(value){try{step(generator.next(value))}catch(e){reject(e)}}function rejected(value){try{step(generator.throw(value))}catch(e){reject(e)}}function step(result){result.done?resolve(result.value):function adopt(value){return value instanceof P?value:new P(function(resolve){resolve(value)})}(result.value).then(fulfilled,rejected)}step((generator=generator.apply(thisArg,_arguments||[])).next())})}var ErrorCategory,NetworkErrorCode,OperationErrorCode,ResourceErrorCode,SystemErrorCode,ConfigErrorCode;"function"==typeof SuppressedError&&SuppressedError,function(ErrorCategory){ErrorCategory.NETWORK="NETWORK",ErrorCategory.OPERATION="OPERATION",ErrorCategory.RESOURCE="RESOURCE",ErrorCategory.SYSTEM="SYSTEM",ErrorCategory.CONFIG="CONFIG"}(ErrorCategory||(ErrorCategory={})),function(NetworkErrorCode){NetworkErrorCode[NetworkErrorCode.CONNECTION_FAILED=1001]="CONNECTION_FAILED",NetworkErrorCode[NetworkErrorCode.REQUEST_TIMEOUT=1002]="REQUEST_TIMEOUT",NetworkErrorCode[NetworkErrorCode.SERVER_ERROR=1003]="SERVER_ERROR",NetworkErrorCode[NetworkErrorCode.UNAUTHORIZED=1004]="UNAUTHORIZED"}(NetworkErrorCode||(NetworkErrorCode={})),function(OperationErrorCode){OperationErrorCode[OperationErrorCode.UNITY_NOT_INITIALIZED=2001]="UNITY_NOT_INITIALIZED",OperationErrorCode[OperationErrorCode.AVATAR_NOT_LOADED=2002]="AVATAR_NOT_LOADED",OperationErrorCode[OperationErrorCode.OPERATION_FAILED=2003]="OPERATION_FAILED",OperationErrorCode[OperationErrorCode.OPERATION_TIMEOUT=2004]="OPERATION_TIMEOUT",OperationErrorCode[OperationErrorCode.OPERATION_CANCELLED=2005]="OPERATION_CANCELLED",OperationErrorCode[OperationErrorCode.BROADCAST_EQUITY_NOT_EXIST=2006]="BROADCAST_EQUITY_NOT_EXIST",OperationErrorCode[OperationErrorCode.BROADCAST_EQUITY_NOT_ENOUGH=2007]="BROADCAST_EQUITY_NOT_ENOUGH",OperationErrorCode[OperationErrorCode.BROADCAST_EQUITY_FREEZE_FAILED=2008]="BROADCAST_EQUITY_FREEZE_FAILED"}(OperationErrorCode||(OperationErrorCode={})),function(ResourceErrorCode){ResourceErrorCode[ResourceErrorCode.LOAD_FAILED=3001]="LOAD_FAILED",ResourceErrorCode[ResourceErrorCode.FILE_CORRUPTED=3002]="FILE_CORRUPTED",ResourceErrorCode[ResourceErrorCode.NOT_FOUND=3003]="NOT_FOUND",ResourceErrorCode[ResourceErrorCode.UNSUPPORTED_FORMAT=3004]="UNSUPPORTED_FORMAT",ResourceErrorCode[ResourceErrorCode.VERSION_INCOMPATIBLE=3005]="VERSION_INCOMPATIBLE"}(ResourceErrorCode||(ResourceErrorCode={})),function(SystemErrorCode){SystemErrorCode[SystemErrorCode.OUT_OF_MEMORY=4001]="OUT_OF_MEMORY",SystemErrorCode[SystemErrorCode.GPU_NOT_SUPPORTED=4002]="GPU_NOT_SUPPORTED",SystemErrorCode[SystemErrorCode.WEBGL_NOT_SUPPORTED=4003]="WEBGL_NOT_SUPPORTED",SystemErrorCode[SystemErrorCode.BROWSER_NOT_COMPATIBLE=4004]="BROWSER_NOT_COMPATIBLE"}(SystemErrorCode||(SystemErrorCode={})),function(ConfigErrorCode){ConfigErrorCode[ConfigErrorCode.INVALID_CONFIG=5001]="INVALID_CONFIG",ConfigErrorCode[ConfigErrorCode.MISSING_REQUIRED_PARAM=5002]="MISSING_REQUIRED_PARAM",ConfigErrorCode[ConfigErrorCode.PARAM_OUT_OF_RANGE=5003]="PARAM_OUT_OF_RANGE",ConfigErrorCode[ConfigErrorCode.INVALID_JSON_FORMAT=5004]="INVALID_JSON_FORMAT"}(ConfigErrorCode||(ConfigErrorCode={}));const ERROR_CODE_MAP={[NetworkErrorCode.CONNECTION_FAILED]:{category:ErrorCategory.NETWORK,message:"网络连接失败"},[NetworkErrorCode.REQUEST_TIMEOUT]:{category:ErrorCategory.NETWORK,message:"请求超时"},[NetworkErrorCode.SERVER_ERROR]:{category:ErrorCategory.NETWORK,message:"服务器错误"},[NetworkErrorCode.UNAUTHORIZED]:{category:ErrorCategory.NETWORK,message:"未授权访问"},[OperationErrorCode.UNITY_NOT_INITIALIZED]:{category:ErrorCategory.OPERATION,message:"Unity实例未初始化"},[OperationErrorCode.AVATAR_NOT_LOADED]:{category:ErrorCategory.OPERATION,message:"数字人未加载"},[OperationErrorCode.OPERATION_FAILED]:{category:ErrorCategory.OPERATION,message:"操作执行失败"},[OperationErrorCode.OPERATION_TIMEOUT]:{category:ErrorCategory.OPERATION,message:"操作超时"},[OperationErrorCode.OPERATION_CANCELLED]:{category:ErrorCategory.OPERATION,message:"操作被取消"},[OperationErrorCode.BROADCAST_EQUITY_NOT_EXIST]:{category:ErrorCategory.OPERATION,message:"用户权益额度不存在"},[OperationErrorCode.BROADCAST_EQUITY_NOT_ENOUGH]:{category:ErrorCategory.OPERATION,message:"用户权益额度不足"},[OperationErrorCode.BROADCAST_EQUITY_FREEZE_FAILED]:{category:ErrorCategory.OPERATION,message:"用户权益额度冻结失败"},[ResourceErrorCode.LOAD_FAILED]:{category:ErrorCategory.RESOURCE,message:"资源加载失败"},[ResourceErrorCode.FILE_CORRUPTED]:{category:ErrorCategory.RESOURCE,message:"资源文件损坏"},[ResourceErrorCode.NOT_FOUND]:{category:ErrorCategory.RESOURCE,message:"资源不存在"},[ResourceErrorCode.UNSUPPORTED_FORMAT]:{category:ErrorCategory.RESOURCE,message:"资源格式不支持"},[ResourceErrorCode.VERSION_INCOMPATIBLE]:{category:ErrorCategory.RESOURCE,message:"资源版本不兼容"},[SystemErrorCode.OUT_OF_MEMORY]:{category:ErrorCategory.SYSTEM,message:"内存不足"},[SystemErrorCode.GPU_NOT_SUPPORTED]:{category:ErrorCategory.SYSTEM,message:"GPU不支持"},[SystemErrorCode.WEBGL_NOT_SUPPORTED]:{category:ErrorCategory.SYSTEM,message:"WebGL不支持"},[SystemErrorCode.BROWSER_NOT_COMPATIBLE]:{category:ErrorCategory.SYSTEM,message:"浏览器不兼容"},[ConfigErrorCode.INVALID_CONFIG]:{category:ErrorCategory.CONFIG,message:"配置参数无效"},[ConfigErrorCode.MISSING_REQUIRED_PARAM]:{category:ErrorCategory.CONFIG,message:"必需参数缺失"},[ConfigErrorCode.PARAM_OUT_OF_RANGE]:{category:ErrorCategory.CONFIG,message:"参数值超出范围"},[ConfigErrorCode.INVALID_JSON_FORMAT]:{category:ErrorCategory.CONFIG,message:"JSON格式错误"}};function getErrorInfo(code){return ERROR_CODE_MAP[code]||{category:ErrorCategory.SYSTEM,message:"未知错误"}}class SDKError extends Error{constructor(code,message,originalError){const errorInfo=getErrorInfo(code),finalMessage=message||errorInfo.message;super(finalMessage),this.name="SDKError",this.code=code,this.category=errorInfo.category,this.message=finalMessage,this.timestamp=Date.now(),originalError&&originalError.stack?this.stack=originalError.stack:Error.captureStackTrace&&Error.captureStackTrace(this,SDKError)}toJSON(){return{name:this.name,code:this.code,category:this.category,message:this.message,timestamp:this.timestamp}}static createNetworkError(code,message,originalError){return new SDKError(code,message,originalError)}static createOperationError(code,message,originalError){return new SDKError(code,message,originalError)}static createResourceError(code,message,originalError){return new SDKError(code,message,originalError)}static createSystemError(code,message,originalError){return new SDKError(code,message,originalError)}static createConfigError(code,message,originalError){return new SDKError(code,message,originalError)}static createFromUnityError(unityCode,message){switch(unityCode){case 100:return new SDKError(ResourceErrorCode.LOAD_FAILED,message);case 200:return new SDKError(NetworkErrorCode.CONNECTION_FAILED,message);case 300:case 700:return new SDKError(ConfigErrorCode.INVALID_CONFIG,message);case 400:return new SDKError(OperationErrorCode.OPERATION_FAILED,message);case 500:return new SDKError(SystemErrorCode.OUT_OF_MEMORY,message);case 600:return new SDKError(OperationErrorCode.OPERATION_CANCELLED,message);default:return new SDKError(3001,message||`Unity错误 (错误码: ${unityCode})`)}}}var LogLevel,UnityOperationStatus;!function(LogLevel){LogLevel.DEBUG="debug",LogLevel.INFO="info",LogLevel.WARN="warn",LogLevel.ERROR="error"}(LogLevel||(LogLevel={}));class SimpleLogger{constructor(enableDebug=!1){this.enableDebug=enableDebug}pad(num,len){let s=String(num);for(;s.length<len;)s=`0${s}`;return s}getTimestamp(){const now=new Date;return`[${this.pad(now.getHours(),2)}:${this.pad(now.getMinutes(),2)}:${this.pad(now.getSeconds(),2)}.${this.pad(now.getMilliseconds(),3).slice(0,2)}]`}debug(message,data){this.enableDebug&&console.debug(`[SDK DEBUG]${this.getTimestamp()} ${message}`,data)}info(message,data){console.info(`[SDK INFO]${this.getTimestamp()} ${message}`,data)}warn(message,data){console.warn(`[SDK WARN]${this.getTimestamp()} ${message}`,data)}error(message,error,data){console.error(`[SDK ERROR]${this.getTimestamp()} ${message}`,error,error instanceof SDKError?error.code:null,data)}}!function(UnityOperationStatus){UnityOperationStatus[UnityOperationStatus.SUCCESS=0]="SUCCESS",UnityOperationStatus[UnityOperationStatus.FAILURE=1]="FAILURE",UnityOperationStatus[UnityOperationStatus.TIMEOUT=2]="TIMEOUT",UnityOperationStatus[UnityOperationStatus.CANCELLED=3]="CANCELLED"}(UnityOperationStatus||(UnityOperationStatus={}));const DEFAULT_CONFIG={targetObjectName:"AvatarSDK",timeout:3e4,enableDebugLog:!1,maxRetries:0};class UnityBaseService{get uniqueCallbackName(){return`${this.callbackFunctionName}_${this.instanceId}`}constructor(config){this.pendingCallbacks=new Map;const finalConfig=Object.assign(Object.assign({},DEFAULT_CONFIG),config);this.unityInstance=finalConfig.unityInstance,this.targetObjectName=finalConfig.targetObjectName,this.timeout=finalConfig.timeout||DEFAULT_CONFIG.timeout,this.maxRetries=finalConfig.maxRetries,this.instanceId=finalConfig.instanceId||"default",this.logger=new SimpleLogger(finalConfig.enableDebugLog),this.initializeGlobalCallback(),this.logger.debug("Unity service initialized",{config:finalConfig})}handleCallback(operation,code,message,data){const dataObj=data?JSON.parse(data):void 0;this.logger.warn("[ Received Unity callback ]",{operation:operation,code:code,message:message,data:dataObj,originalData:data});const callback=this.pendingCallbacks.get(operation);if(!callback)return void this.logger.warn(`No pending callback for operation: ${operation}`);callback.timer&&clearTimeout(callback.timer);const response={success:code===UnityOperationStatus.SUCCESS,message:message,errorCode:code,data:dataObj};try{if(code===UnityOperationStatus.SUCCESS)callback.resolve(response),this.logger.debug(`Operation '${operation}' completed successfully`);else{const error=SDKError.createFromUnityError(code,`Unity operation '${operation}' failed: ${message}`);callback.reject(error),this.logger.error(`Operation '${operation}' failed`,error)}}catch(error){this.logger.error(`Error handling callback for operation '${operation}'`,error)}finally{this.pendingCallbacks.delete(operation)}}setupCallback(operation){return this.clearCallback(operation),new Promise((resolve,reject)=>{const timer=setTimeout(()=>{this.pendingCallbacks.delete(operation);const timeoutError=new SDKError(OperationErrorCode.OPERATION_TIMEOUT,`Unity operation '${operation}' timed out after ${this.timeout}ms`);this.logger.error(`Operation '${operation}' timed out`,timeoutError),reject(timeoutError)},this.timeout);this.pendingCallbacks.set(operation,{resolve:resolve,reject:reject,timer:timer,retries:0}),this.logger.debug(`Callback setup for operation '${operation}' with timeout ${this.timeout}ms`)})}clearCallback(operation){const callback=this.pendingCallbacks.get(operation);callback&&(callback.timer&&clearTimeout(callback.timer),this.pendingCallbacks.delete(operation),this.logger.debug(`Cleared callback for operation '${operation}'`))}clearAllCallbacks(){this.pendingCallbacks.forEach(callback=>{callback.timer&&clearTimeout(callback.timer)}),this.pendingCallbacks.clear(),this.logger.debug("Cleared all pending callbacks")}sendMessage(methodName,parameter){if(!this.isUnityAvailable())throw new SDKError(OperationErrorCode.UNITY_NOT_INITIALIZED,"Unity实例未初始化");try{this.logger.warn(`[ Sending message ]: ${this.targetObjectName}.${methodName}`,parameter);const paramString=parameter?JSON.stringify(parameter):"";this.unityInstance.SendMessage(this.targetObjectName,methodName,paramString)}catch(error){const serviceError=new SDKError(OperationErrorCode.OPERATION_FAILED,`Failed to send Unity message: ${methodName}`,error);throw this.logger.error(`Failed to send Unity message: ${methodName}`,serviceError),serviceError}}sendAsyncMessage(methodName,operation,parameter){return __awaiter(this,void 0,void 0,function*(){if(!this.isUnityAvailable())throw new SDKError(OperationErrorCode.UNITY_NOT_INITIALIZED,"Unity实例未初始化");try{const callbackPromise=this.setupCallback(operation),fullParameter=Object.assign(Object.assign({},parameter),{callbackFun:this.uniqueCallbackName,operationType:operation});return this.sendMessage(methodName,fullParameter),yield callbackPromise}catch(error){if(this.clearCallback(operation),this.maxRetries>0&&error instanceof SDKError&&error.code===OperationErrorCode.OPERATION_TIMEOUT)return yield this.retryOperation(operation,methodName,parameter);throw error}})}destroy(){this.clearAllCallbacks(),window[this.uniqueCallbackName]&&(delete window[this.uniqueCallbackName],this.logger.debug(`Global callback unregistered: ${this.uniqueCallbackName}`)),this.logger.info("Unity service destroyed")}isUnityAvailable(){return null!==this.unityInstance&&"function"==typeof this.unityInstance.SendMessage}getPendingCallbackCount(){return this.pendingCallbacks.size}initializeGlobalCallback(){window[this.uniqueCallbackName]=(operation,code,message,data)=>{this.handleCallback(operation,code,message,data)},this.logger.warn(`Global callback registered: ${this.uniqueCallbackName}`)}retryOperation(operation,methodName,parameter){return __awaiter(this,void 0,void 0,function*(){let lastError=null;for(let attempt=0;attempt<=this.maxRetries;attempt++)try{return attempt>0&&(this.logger.debug(`Retrying operation '${operation}', attempt ${attempt}/${this.maxRetries}`),yield new Promise(resolve=>setTimeout(resolve,1e3*Math.pow(2,attempt)))),yield this.sendAsyncMessage(methodName,operation,parameter)}catch(error){if(lastError=error,this.logger.warn(`Operation '${operation}' failed, attempt ${attempt+1}/${this.maxRetries+1}`,error),error instanceof SDKError&&error.code===OperationErrorCode.OPERATION_TIMEOUT&&attempt<this.maxRetries)continue;if(!(error instanceof SDKError&&error.code===OperationErrorCode.OPERATION_TIMEOUT)||attempt>=this.maxRetries)throw error}throw lastError||new SDKError(OperationErrorCode.OPERATION_TIMEOUT,`All retry attempts failed for operation: ${operation}`)})}}var AvatarOperationType,AvatarCameraType;!function(AvatarOperationType){AvatarOperationType.INITIALIZE_AVATAR="initializeAvatar",AvatarOperationType.PLAY_MOTION="playMotion",AvatarOperationType.GET_CURRENT_MOTION="getCurrentMotion",AvatarOperationType.UNLOAD_AVATAR="unloadAvatar",AvatarOperationType.SET_CAMERA="setCamera"}(AvatarOperationType||(AvatarOperationType={})),function(AvatarCameraType){AvatarCameraType.WHOLE="whole",AvatarCameraType.HALF="half",AvatarCameraType.FACE="face"}(AvatarCameraType||(AvatarCameraType={}));class AvatarService extends UnityBaseService{get callbackFunctionName(){return"uniAvatarCallback"}constructor(config){super(config),this.logger.info("Avatar API service initialized")}initializeAvatar(avatarCode_1){return __awaiter(this,arguments,void 0,function*(avatarCode,cameraType=AvatarCameraType.WHOLE){this.logger.info(`Initializing avatar: ${avatarCode} with camera type: ${cameraType}`);try{const result=yield this.sendAsyncMessage("InitializeAvatar",AvatarOperationType.INITIALIZE_AVATAR,{avatarCode:avatarCode,cameraType:cameraType});return this.logger.info("Avatar initialization "+(result.success?"succeeded":"failed")),result}catch(error){throw this.logger.error("Failed to initialize avatar",error),error}})}handleCallback(operation,code,message,data){super.handleCallback(operation,code,message,data)}playMotion(clipCode){return __awaiter(this,void 0,void 0,function*(){this.logger.info(`Playing motion: ${clipCode}`);try{const result=yield this.sendAsyncMessage("PlayMotion",AvatarOperationType.PLAY_MOTION,{clipCode:clipCode});return this.logger.info("Motion play "+(result.success?"succeeded":"failed")),result}catch(error){throw this.logger.error("Failed to play motion",error),error}})}getCurrentMotion(getRemainingTime){return __awaiter(this,void 0,void 0,function*(){var _a,_b;this.logger.info(`Getting current motion info, includeRemainingTime: ${getRemainingTime}`);try{const result=yield this.sendAsyncMessage("GetCurrentMotion",AvatarOperationType.GET_CURRENT_MOTION,{getRemainingTime:getRemainingTime});return this.logger.info("Current motion info retrieved",{motionId:null===(_a=result.data)||void 0===_a?void 0:_a.motionId,remainingTime:null===(_b=result.data)||void 0===_b?void 0:_b.motionRemainingTime}),result}catch(error){throw this.logger.error("Failed to get current motion info",error),error}})}unloadAvatar(){return __awaiter(this,void 0,void 0,function*(){this.logger.info("Unloading avatar");try{const result=yield this.sendAsyncMessage("UnloadAvatar",AvatarOperationType.UNLOAD_AVATAR);return this.logger.info("Avatar unload "+(result.success?"succeeded":"failed")),result}catch(error){throw this.logger.error("Failed to unload avatar",error),error}})}setCamera(cameraType){return __awaiter(this,void 0,void 0,function*(){this.logger.info(`Setting camera type: ${cameraType}`);try{const result=yield this.sendAsyncMessage("SetCamera",AvatarOperationType.SET_CAMERA,{cameraType:cameraType});return this.logger.info("Camera type setting "+(result.success?"succeeded":"failed")),result}catch(error){throw this.logger.error("Failed to set camera type",error),error}})}batchExecute(operations){return __awaiter(this,void 0,void 0,function*(){this.logger.info(`Executing batch operations: ${operations.length} items`);const results=[];for(const operation of operations)try{const method=this[operation.method],result=yield method.apply(this,operation.params);results.push(result)}catch(error){this.logger.error(`Batch operation failed: ${operation.method}`,error),results.push({success:!1,message:`Batch operation failed: ${error.message}`,errorCode:1})}return this.logger.info(`Batch operations completed: ${results.filter(r=>r.success).length}/${results.length} successful`),results})}}const ENV_MAP={dev:{apiBaseUrl:"https://dev.local.zeewain.com"},test:{apiBaseUrl:"https://test.local.zeewain.com"},prod:{apiBaseUrl:"https://ai.zeewain3d.com"}};class ConfigManager{constructor(){this.config=null}static getInstance(){return ConfigManager.instance||(ConfigManager.instance=new ConfigManager),ConfigManager.instance}setConfig(config){this.config=Object.assign(Object.assign({},config),{env:config.env||"prod",containerId:config.containerId||"unity-container"})}updateConfig(config){this.config&&(this.config=Object.assign(Object.assign({},this.config),config))}getConfig(){return this.config}getApiBaseUrl(withApiModule=!0){var _a,_b,_c,_d;return"custom"===(null===(_a=this.config)||void 0===_a?void 0:_a.env)&&(null===(_b=this.config)||void 0===_b?void 0:_b.apiUrl)?`${this.config.apiUrl}${withApiModule?"/api":""}`:(null===(_d=function getEnvConfig(env="dev",withApiModule=!0){const baseUrl=ENV_MAP[env];return baseUrl?{apiBaseUrl:`${baseUrl.apiBaseUrl}${withApiModule?"/api":""}`}:null}((null===(_c=this.config)||void 0===_c?void 0:_c.env)||"prod",withApiModule))||void 0===_d?void 0:_d.apiBaseUrl)||""}reset(){this.config=null}}ConfigManager.instance=null;class UnityLoader{constructor(){this.config=ConfigManager.getInstance().getConfig()}init(){return __awaiter(this,void 0,void 0,function*(){const container=this.createContainer();return yield this.loadUnityLoader(),yield this.createUnityInstance(container)})}createContainer(){const container=document.getElementById(this.config.containerId);if(!container)throw new TypeError(`Avatar container element with ID "${this.config.containerId}" not found`);if(!(container instanceof HTMLDivElement))throw new TypeError("Avatar container element must be a div element");return container.style.position="relative",container}loadUnityLoader(){return new Promise((resolve,reject)=>{if(window.createUnityInstance)return resolve();const script=document.createElement("script");script.src=this.config.loaderUrl,script.async=!0,script.crossOrigin="anonymous",script.onload=()=>{"function"==typeof window.createUnityInstance?resolve():reject(new Error("createUnityInstance function not found"))},script.onerror=error=>{reject(new Error(`Failed to load UnityLoader: ${error}`))},document.head.appendChild(script)})}createUnityInstance(container){return __awaiter(this,void 0,void 0,function*(){let canvas=container.querySelector("#unity-canvas");if(canvas||(canvas=document.createElement("canvas"),canvas.id="unity-canvas",canvas.style.width="100%",canvas.style.height="100%",container.appendChild(canvas)),/iPhone|iPad|iPod|Android/i.test(navigator.userAgent)){const meta=document.createElement("meta");meta.name="viewport",meta.content="width=device-width, height=device-height, initial-scale=1.0, user-scalable=no, shrink-to-fit=yes",document.head.appendChild(meta),canvas.style.width="100%",canvas.style.height="100%",canvas.style.position="fixed"}if("function"==typeof window.createUnityInstance){return yield window.createUnityInstance(canvas,{dataUrl:this.config.dataUrl,frameworkUrl:this.config.frameworkUrl,codeUrl:this.config.codeUrl,companyName:"广州紫为云科技有限公司",productName:"数字人SDK",productVersion:"1.0"},progress=>{this.config.onProgress&&this.config.onProgress(progress)})}throw new TypeError("createUnityInstance is not defined on window.")})}}function getLines(onLine){let buffer,position,fieldLength,discardTrailingNewline=!1;return function onChunk(arr){void 0===buffer?(buffer=arr,position=0,fieldLength=-1):buffer=function concat(a,b){const res=new Uint8Array(a.length+b.length);return res.set(a),res.set(b,a.length),res}(buffer,arr);const bufLength=buffer.length;let lineStart=0;for(;position<bufLength;){discardTrailingNewline&&(10===buffer[position]&&(lineStart=++position),discardTrailingNewline=!1);let lineEnd=-1;for(;position<bufLength&&-1===lineEnd;++position)switch(buffer[position]){case 58:-1===fieldLength&&(fieldLength=position-lineStart);break;case 13:discardTrailingNewline=!0;case 10:lineEnd=position}if(-1===lineEnd)break;onLine(buffer.subarray(lineStart,lineEnd),fieldLength),lineStart=position,fieldLength=-1}lineStart===bufLength?buffer=void 0:0!==lineStart&&(buffer=buffer.subarray(lineStart),position-=lineStart)}}var __rest=function(s,e){var t={};for(var p in s)Object.prototype.hasOwnProperty.call(s,p)&&e.indexOf(p)<0&&(t[p]=s[p]);if(null!=s&&"function"==typeof Object.getOwnPropertySymbols){var i=0;for(p=Object.getOwnPropertySymbols(s);i<p.length;i++)e.indexOf(p[i])<0&&Object.prototype.propertyIsEnumerable.call(s,p[i])&&(t[p[i]]=s[p[i]])}return t};function fetchEventSource(input,_a){var{signal:inputSignal,headers:inputHeaders,onopen:inputOnOpen,onmessage:onmessage,onclose:onclose,onerror:onerror,openWhenHidden:openWhenHidden,fetch:inputFetch}=_a,rest=__rest(_a,["signal","headers","onopen","onmessage","onclose","onerror","openWhenHidden","fetch"]);return new Promise((resolve,reject)=>{const headers=Object.assign({},inputHeaders);let curRequestController;function onVisibilityChange(){curRequestController.abort(),document.hidden||create()}headers.accept||(headers.accept="text/event-stream"),openWhenHidden||document.addEventListener("visibilitychange",onVisibilityChange);let retryInterval=1e3,retryTimer=0;function dispose(){document.removeEventListener("visibilitychange",onVisibilityChange),window.clearTimeout(retryTimer),curRequestController.abort()}null==inputSignal||inputSignal.addEventListener("abort",()=>{dispose(),resolve()});const fetch=null!=inputFetch?inputFetch:window.fetch,onopen=null!=inputOnOpen?inputOnOpen:defaultOnOpen;async function create(){var _a;curRequestController=new AbortController;try{const response=await fetch(input,Object.assign(Object.assign({},rest),{headers:headers,signal:curRequestController.signal}));await onopen(response),await async function getBytes(stream,onChunk){const reader=stream.getReader();let result;for(;!(result=await reader.read()).done;)onChunk(result.value)}(response.body,getLines(function getMessages(onId,onRetry,onMessage){let message={data:"",event:"",id:"",retry:void 0};const decoder=new TextDecoder;return function onLine(line,fieldLength){if(0===line.length)null==onMessage||onMessage(message),message={data:"",event:"",id:"",retry:void 0};else if(fieldLength>0){const field=decoder.decode(line.subarray(0,fieldLength)),valueOffset=fieldLength+(32===line[fieldLength+1]?2:1),value=decoder.decode(line.subarray(valueOffset));switch(field){case"data":message.data=message.data?message.data+"\n"+value:value;break;case"event":message.event=value;break;case"id":onId(message.id=value);break;case"retry":const retry=parseInt(value,10);isNaN(retry)||onRetry(message.retry=retry)}}}}(id=>{id?headers["last-event-id"]=id:delete headers["last-event-id"]},retry=>{retryInterval=retry},onmessage))),null==onclose||onclose(),dispose(),resolve()}catch(err){if(!curRequestController.signal.aborted)try{const interval=null!==(_a=null==onerror?void 0:onerror(err))&&void 0!==_a?_a:retryInterval;window.clearTimeout(retryTimer),retryTimer=window.setTimeout(create,interval)}catch(innerErr){dispose(),reject(innerErr)}}}create()})}function defaultOnOpen(response){const contentType=response.headers.get("content-type");if(!(null==contentType?void 0:contentType.startsWith("text/event-stream")))throw new Error(`Expected content-type to be text/event-stream, Actual: ${contentType}`)}var BroadcastOperationType,BroadcastType,BroadcastTaskStatus;!function(BroadcastOperationType){BroadcastOperationType.START_BROADCAST="startBroadcast",BroadcastOperationType.PAUSE_BROADCAST="pauseBroadcast",BroadcastOperationType.RESUME_BROADCAST="resumeBroadcast",BroadcastOperationType.STOP_BROADCAST="stopBroadcast",BroadcastOperationType.APPEND_BROADCAST="appendBroadcast"}(BroadcastOperationType||(BroadcastOperationType={})),function(BroadcastType){BroadcastType.TEXT="text",BroadcastType.AUDIO="audio"}(BroadcastType||(BroadcastType={})),function(BroadcastTaskStatus){BroadcastTaskStatus.PENDING="pending",BroadcastTaskStatus.REQUESTING="requesting",BroadcastTaskStatus.COMPLETED="completed",BroadcastTaskStatus.FAILED="failed",BroadcastTaskStatus.CANCELLED="cancelled"}(BroadcastTaskStatus||(BroadcastTaskStatus={}));class BroadcastService extends UnityBaseService{constructor(config){super(config),this.callbacks={},this.taskQueue=[],this.taskSequence=0,this.currentSendingSequence=0,this.isBroadcastingAudio=!1,this.hasReceivedAudio=!1,this.queueProcessTimer=null,this.broadcastCompletedCount=0,this.callbacks=config.callbacks||{},this.logger.info("Broadcast service initialized",{config:config})}handleCallback(operation,code,message,data){var _a,_b,_c,_d,_e,_f,_g,_h,_j,_k,_l;const{isBroadcastCompleted:isBroadcastCompleted}=JSON.parse(data||"{}");if(super.handleCallback(operation,code,message,data),0===code)switch(operation){case BroadcastOperationType.START_BROADCAST:if(isBroadcastCompleted){this.broadcastCompletedCount++;const status=this.getStatus();0===(null===(_a=status.queueInfo)||void 0===_a?void 0:_a.pendingTasks)&&0===(null===(_b=status.queueInfo)||void 0===_b?void 0:_b.requestingTasks)&&(null===(_c=status.queueInfo)||void 0===_c?void 0:_c.completedTasks)===this.broadcastCompletedCount&&(this.isBroadcastingAudio=!1,this.hasReceivedAudio=!1,this.currentSendingSequence=0,this.cleanupCompletedTasks(),this.logger.warn("Broadcast all completed")),null===(_e=(_d=this.callbacks).onFinish)||void 0===_e||_e.call(_d)}break;case BroadcastOperationType.PAUSE_BROADCAST:null===(_g=(_f=this.callbacks).onPause)||void 0===_g||_g.call(_f),this.logger.debug("Broadcast paused callback triggered");break;case BroadcastOperationType.RESUME_BROADCAST:null===(_j=(_h=this.callbacks).onResume)||void 0===_j||_j.call(_h),this.logger.debug("Broadcast resumed callback triggered");break;case BroadcastOperationType.STOP_BROADCAST:null===(_l=(_k=this.callbacks).onStop)||void 0===_l||_l.call(_k),this.logger.debug("Broadcast stopped callback triggered")}else{const error=SDKError.createFromUnityError(code,`Unity operation '${operation}' failed: ${message}`);this.handleError(error)}}startBroadcast(params,isAppend){return __awaiter(this,void 0,void 0,function*(){var _a,_b;this.logger.info(`Starting broadcast: ${params.type}`,{humanCode:params.humanCode,text:params.text,audioUrl:params.audioUrl,isAppend:isAppend,queueLength:this.taskQueue.length}),this.validateBroadcastParams(params),isAppend||(yield this.stopBroadcast(),this.taskSequence=0,this.currentSendingSequence=0,this.sendMessage("StartBroadcast",{callbackFun:this.uniqueCallbackName,operationType:BroadcastOperationType.START_BROADCAST,motionList:params.motionList,motionPlayMode:params.motionPlayMode}),null===(_b=(_a=this.callbacks).onStart)||void 0===_b||_b.call(_a),this.isBroadcastingAudio=!0);const task=this.createBroadcastTask(params);this.addTaskToQueue(task),this.logger.debug("Broadcast task created and queued",{taskId:task.id,sequence:task.sequence,isAppend:isAppend})})}pauseBroadcast(resetIdle){return __awaiter(this,void 0,void 0,function*(){this.logger.info("Pausing broadcast");try{yield this.sendAsyncMessage("PauseBroadcast",BroadcastOperationType.PAUSE_BROADCAST,{resetIdle:resetIdle}),this.logger.info("Broadcast paused successfully")}catch(error){throw this.logger.error("Failed to pause broadcast",error),error}})}resumeBroadcast(){return __awaiter(this,void 0,void 0,function*(){this.logger.info("Resuming broadcast");try{yield this.sendAsyncMessage("ResumeBroadcast",BroadcastOperationType.RESUME_BROADCAST,{}),this.logger.info("Broadcast resumed successfully")}catch(error){throw this.logger.error("Failed to resume broadcast",error),error}})}stopBroadcast(){return __awaiter(this,void 0,void 0,function*(){this.logger.info("Stopping broadcast and clearing queue",{queueLength:this.taskQueue.length}),this.cancelAllTasks(),yield new Promise(resolve=>setTimeout(resolve,100)),this.isBroadcastingAudio=!1,this.hasReceivedAudio=!1,this.broadcastCompletedCount=0;try{yield this.sendAsyncMessage("StopBroadcast",BroadcastOperationType.STOP_BROADCAST,{}),this.logger.info("Broadcast stopped successfully")}catch(error){throw this.logger.error("Failed to stop broadcast",error),error}})}updateCallbacks(callbacks){this.callbacks=Object.assign(Object.assign({},this.callbacks),callbacks),this.logger.debug("Broadcast callbacks updated")}getStatus(){const pendingTasks=this.taskQueue.filter(t=>t.status===BroadcastTaskStatus.PENDING).length,requestingTasks=this.taskQueue.filter(t=>t.status===BroadcastTaskStatus.REQUESTING).length,completedTasks=this.taskQueue.filter(t=>t.status===BroadcastTaskStatus.COMPLETED).length,failedTasks=this.taskQueue.filter(t=>t.status===BroadcastTaskStatus.FAILED).length,totalPendingResponses=this.taskQueue.reduce((sum,t)=>sum+t.pendingResponses.length,0),currentSendingSequence=this.currentSendingSequence,isGeneratingAudio=pendingTasks+requestingTasks>0;return{isActive:this.isBroadcastingAudio||isGeneratingAudio,isGeneratingAudio:isGeneratingAudio,hasReceivedAudio:this.hasReceivedAudio,queueInfo:{totalTasks:this.taskQueue.length,pendingTasks:pendingTasks,requestingTasks:requestingTasks,completedTasks:completedTasks,failedTasks:failedTasks,totalPendingResponses:totalPendingResponses,currentSendingSequence:currentSendingSequence}}}destroy(){this.clearQueueProcessTimer(),this.cancelAllTasks(),super.destroy(),this.logger.info("Broadcast service destroyed")}createBroadcastTask(params){const task={id:`[${params.type===BroadcastType.TEXT?"TEXT":"AUDIO"}]-(${params.type===BroadcastType.TEXT?params.text:params.audioUrl})_${Math.random().toString(36).substring(2,9)}`,sequence:++this.taskSequence,params:params,status:BroadcastTaskStatus.PENDING,controller:new AbortController,pendingResponses:[],isGenerationComplete:!1,createdAt:new Date};return this.logger.debug("Created broadcast task",{taskId:task.id,sequence:task.sequence}),task}addTaskToQueue(task){this.taskQueue.push(task),this.logger.debug("Task added to queue",{taskId:task.id,params:task.params,queueLength:this.taskQueue.length});this.taskQueue.some(t=>t.status===BroadcastTaskStatus.REQUESTING)?this.logger.debug("Task queued, waiting for previous task to complete",{taskId:task.id,pendingTasks:this.taskQueue.filter(t=>t.status===BroadcastTaskStatus.PENDING).length}):this.startTaskRequest(task),this.processTaskQueue()}processTaskQueue(){this.queueProcessTimer||(this.queueProcessTimer=setInterval(()=>{this.processTaskQueueStep()},100)),this.processTaskQueueStep()}processTaskQueueStep(){const nextTask=this.taskQueue.find(task=>task.sequence===this.currentSendingSequence+1&&task.status!==BroadcastTaskStatus.PENDING&&task.pendingResponses.length>0);nextTask?this.sendNextResponse(nextTask):this.logger.debug("No next task to process",{currentSendingSequence:this.currentSendingSequence,taskQueue:this.taskQueue});0===this.taskQueue.filter(task=>task.status===BroadcastTaskStatus.PENDING||task.status===BroadcastTaskStatus.REQUESTING).length&&this.clearQueueProcessTimer()}startTaskRequest(task){return __awaiter(this,void 0,void 0,function*(){var _a;task.status=BroadcastTaskStatus.REQUESTING,this.logger.debug("Starting task request",{taskId:task.id});try{const apiUrl=`${ConfigManager.getInstance().getApiBaseUrl(!0)}${this.getBroadcastApiPath(task.params.type)}`,requestBody={humanCode:task.params.humanCode,speed:task.params.speed,volume:task.params.volume>=0?100*task.params.volume:void 0,isSubtitle:task.params.isSubtitle,audioDrivenVersion:ConfigManager.getInstance().getConfig().audioDrivenVersion};task.params.type===BroadcastType.TEXT?(requestBody.text=task.params.text,requestBody.voiceCode=task.params.voiceCode):task.params.type===BroadcastType.AUDIO&&(requestBody.text=task.params.text,requestBody.audioUrl=task.params.audioUrl),fetchEventSource(apiUrl,{method:"POST",headers:{"Content-Type":"application/json",x_auth_token:(null===(_a=ConfigManager.getInstance().getConfig())||void 0===_a?void 0:_a.token)||""},body:JSON.stringify(requestBody),signal:task.controller.signal,openWhenHidden:!0,onopen:response=>__awaiter(this,void 0,void 0,function*(){if(!response.ok){const error=this.createHttpError(response.status,response.statusText,task.id);throw this.handleTaskError(task,error),error}}),onmessage:event=>{this.handleTaskResponse(task,event.data)},onclose:()=>{this.handleTaskClose(task)},onerror:error=>{if(error instanceof SDKError)throw error;this.logger.error("broadcast onerror",error);const sdkError=this.convertToSDKError(error,task.id);throw this.handleTaskError(task,sdkError),sdkError}})}catch(error){const sdkError=this.convertToSDKError(error,task.id);this.handleTaskError(task,sdkError)}})}handleTaskResponse(task,data){try{const response=JSON.parse(data);if(0!==response.code){const error=this.createBroadcastError(response.code,response.message);return void this.handleTaskError(task,error)}if(response.data){this.hasReceivedAudio=!0,task.params.type===BroadcastType.AUDIO&&task.params.audioUrl&&!response.data.voiceUrl&&(response.data.voiceUrl=task.params.audioUrl);const{voiceUrl:voiceUrl,mouthShapeUrl:mouthShapeUrl}=response.data;voiceUrl&&!voiceUrl.startsWith("http")&&(response.data.voiceUrl=`${ConfigManager.getInstance().getApiBaseUrl(!1)}${voiceUrl}`),mouthShapeUrl&&!mouthShapeUrl.startsWith("http")&&(response.data.mouthShapeUrl=`${ConfigManager.getInstance().getApiBaseUrl(!1)}${mouthShapeUrl}`),task.pendingResponses.push(response),this.logger.debug("Response added to task",{taskId:task.id,response:response,pendingCount:task.pendingResponses.length}),response.data.done&&(task.isGenerationComplete=!0,this.logger.debug("Task generation completed",{taskId:task.id,totalResponses:task.pendingResponses.length}))}}catch(error){this.handleTaskError(task,new SDKError(OperationErrorCode.OPERATION_FAILED,"string"==typeof error?error:error.message||"播报服务错误"))}}sendNextResponse(task){var _a;if(0===task.pendingResponses.length)return;const response=task.pendingResponses.shift();this.logger.debug("Sending response to Unity",{taskId:task.id,remainingResponses:task.pendingResponses.length,voiceUrl:null===(_a=response.data)||void 0===_a?void 0:_a.voiceUrl}),this.sendMessage("AppendBroadcast",{response:response,callbackFun:this.uniqueCallbackName,operationType:BroadcastOperationType.APPEND_BROADCAST}),task.isGenerationComplete&&0===task.pendingResponses.length&&(task.status=BroadcastTaskStatus.COMPLETED,this.currentSendingSequence=task.sequence,this.logger.debug("Task completed",{taskId:task.id}))}handleTaskClose(task){return __awaiter(this,void 0,void 0,function*(){this.logger.debug("Task stream closed",{taskId:task.id}),task.status!==BroadcastTaskStatus.FAILED&&task.status!==BroadcastTaskStatus.CANCELLED&&(task.isGenerationComplete||task.status!==BroadcastTaskStatus.REQUESTING||(task.isGenerationComplete=!0),this.startNextPendingTask())})}handleTaskError(task,error){var _a,_b;task.status!==BroadcastTaskStatus.FAILED&&task.status!==BroadcastTaskStatus.CANCELLED&&(task.status=BroadcastTaskStatus.FAILED,task.error=error,this.logger.error(`Task failed - ${task.id}`,error),null===(_b=(_a=this.callbacks).onError)||void 0===_b||_b.call(_a,error),this.cancelAllTasks(),this.isBroadcastingAudio=!1,this.hasReceivedAudio=!1,this.currentSendingSequence=0,this.clearQueueProcessTimer(),this.logger.debug("Task failed, all tasks cancelled and broadcast state reset"))}cleanupCompletedTasks(){const beforeLength=this.taskQueue.length;this.taskQueue=this.taskQueue.filter(task=>task.status!==BroadcastTaskStatus.COMPLETED&&task.status!==BroadcastTaskStatus.FAILED&&task.status!==BroadcastTaskStatus.CANCELLED);const removedCount=beforeLength-this.taskQueue.length;removedCount>0&&this.logger.debug("Cleaned up completed tasks",{removedCount:removedCount,remainingTasks:this.taskQueue.length})}cancelAllTasks(){for(const task of this.taskQueue)task.status===BroadcastTaskStatus.REQUESTING?(task.controller.abort(),task.status=BroadcastTaskStatus.CANCELLED,this.logger.debug("Task aborted",{taskId:task.id,previousStatus:"requesting"})):task.status===BroadcastTaskStatus.PENDING&&(task.status=BroadcastTaskStatus.CANCELLED,this.logger.debug("Task cancelled",{taskId:task.id,previousStatus:"pending"}));this.taskQueue=[],this.taskSequence=0,this.currentSendingSequence=0,this.logger.debug("All tasks cancelled and queue cleared")}get callbackFunctionName(){return"uniBroadcastCallback"}getBroadcastApiPath(type){switch(type){case BroadcastType.TEXT:return"/aiep-openapi/avatar-interaction/v1/broadcast/text";case BroadcastType.AUDIO:return"/aiep-openapi/avatar-interaction/v1/broadcast/audio";default:throw new SDKError(ConfigErrorCode.INVALID_CONFIG,`未知的播报类型: ${type}`)}}validateBroadcastParams(params){if(params.type===BroadcastType.TEXT){if(!params.text||!params.voiceCode)throw new SDKError(ConfigErrorCode.MISSING_REQUIRED_PARAM,"文本播报需要提供text和voiceCode参数")}else if(params.type===BroadcastType.AUDIO&&!params.audioUrl)throw new SDKError(ConfigErrorCode.MISSING_REQUIRED_PARAM,"自定义音频播报需要提供audioUrl参数")}handleError(error){var _a,_b;this.logger.error("Broadcast error occurred",error),null===(_b=(_a=this.callbacks).onError)||void 0===_b||_b.call(_a,error)}createBroadcastError(errorCode,errorMessage){switch(errorCode){case 14001:return new SDKError(OperationErrorCode.BROADCAST_EQUITY_NOT_EXIST,"用户权益额度不存在");case 14002:return new SDKError(OperationErrorCode.BROADCAST_EQUITY_NOT_ENOUGH,"用户权益额度不足");case 14003:return new SDKError(OperationErrorCode.BROADCAST_EQUITY_FREEZE_FAILED,"用户权益额度冻结失败");default:return new SDKError(OperationErrorCode.OPERATION_FAILED,`${errorMessage}(${errorCode})`||`播报服务错误(${errorCode})`)}}startNextPendingTask(){const nextPendingTask=this.taskQueue.filter(t=>t.status===BroadcastTaskStatus.PENDING).sort((a,b)=>a.sequence-b.sequence)[0];nextPendingTask?(this.logger.debug("Starting next pending task",{taskId:nextPendingTask.id,sequence:nextPendingTask.sequence}),this.startTaskRequest(nextPendingTask)):this.logger.debug("No pending tasks to start")}clearQueueProcessTimer(){this.queueProcessTimer&&(clearInterval(this.queueProcessTimer),this.queueProcessTimer=null,this.logger.debug("Queue process timer cleared"))}createHttpError(status,statusText,taskId){switch(this.logger.warn(`HTTP error occurred - Task: ${taskId}, Status: ${status}`,{status:status,statusText:statusText}),status){case 401:return new SDKError(NetworkErrorCode.UNAUTHORIZED,`Token 已过期或无效,请重新授权 (HTTP ${status})`);case 403:return new SDKError(NetworkErrorCode.UNAUTHORIZED,`无权限访问该资源 (HTTP ${status})`);case 404:return new SDKError(NetworkErrorCode.SERVER_ERROR,`请求的资源不存在 (HTTP ${status})`);case 500:case 502:case 503:case 504:return new SDKError(NetworkErrorCode.SERVER_ERROR,`服务器错误,请稍后重试 (HTTP ${status})`);default:return new SDKError(NetworkErrorCode.CONNECTION_FAILED,`网络请求失败: ${statusText||"Unknown Error"} (HTTP ${status})`)}}convertToSDKError(error,taskId){if(error instanceof SDKError)return error;if(error instanceof Error){const errorMessage=error.message.toLowerCase();if(errorMessage.includes("timeout")||errorMessage.includes("timed out"))return new SDKError(NetworkErrorCode.REQUEST_TIMEOUT,`请求超时 - Task: ${taskId}`,error);if(errorMessage.includes("network")||errorMessage.includes("fetch")||errorMessage.includes("connection")){const hint=errorMessage.includes("failed to fetch")?"(可能是 Token 过期或 CORS 跨域问题,请检查 Token 是否有效)":"";return new SDKError(NetworkErrorCode.CONNECTION_FAILED,`网络请求失败 - Task: ${taskId}: ${error.message}${hint}`,error)}return errorMessage.includes("abort")||errorMessage.includes("cancel")?new SDKError(OperationErrorCode.OPERATION_CANCELLED,`操作已取消 - Task: ${taskId}`,error):new SDKError(OperationErrorCode.OPERATION_FAILED,`播报任务执行失败 - Task: ${taskId}: ${error.message}`,error)}const errorMessage=String(error);return new SDKError(OperationErrorCode.OPERATION_FAILED,`播报任务执行失败 - Task: ${taskId}: ${errorMessage}`)}}class ZEEAvatarLoader{constructor(){this.apiService=null,this.unityInstance=null,this.loader=new UnityLoader}init(){return __awaiter(this,void 0,void 0,function*(){return this.unityInstance=yield this.loader.init(),this.initGlobalConfig(),this.apiService=new AvatarService({unityInstance:this.unityInstance}),this.apiService})}updateToken(token){const currentConfig=ConfigManager.getInstance().getConfig();currentConfig&&(ConfigManager.getInstance().setConfig(Object.assign(Object.assign({},currentConfig),{token:token})),this.initGlobalConfig())}getAPI(){return this.apiService}getInstance(){return this.unityInstance}getContainerId(){return ConfigManager.getInstance().getConfig().containerId}destroy(){if(this.unityInstance){const container=document.getElementById(this.getContainerId());if(container){const canvas=container.querySelector("#unity-canvas");canvas&&canvas.remove()}"function"==typeof this.unityInstance.Quit&&this.unityInstance.Quit(),this.unityInstance=null,this.apiService=null}ConfigManager.getInstance().reset()}initGlobalConfig(){const config=ConfigManager.getInstance().getConfig(),{assetsFrom:assetsFrom}=config,globalParams={token:null==config?void 0:config.token,apiBaseUrl:ConfigManager.getInstance().getApiBaseUrl(!1),idleMotionList:null==config?void 0:config.idleMotionList};if(this.unityInstance.SendMessage("AvatarSDK","InitializeConfig",JSON.stringify(globalParams)),console.warn("[ Send Unity message ]: AvatarSDK.InitializeConfig",globalParams),"cloud"!==assetsFrom){const assetModuleParams={isZip:!0,assetBundlePath:null==config?void 0:config.assetsUrl};this.unityInstance.SendMessage("AvatarSDK","InitAssetBundleModule",JSON.stringify(assetModuleParams)),console.warn("[ Send Unity message ]: AvatarSDK.InitAssetBundleModule",assetModuleParams)}}}const SDK_VERSION="2.2.1";class ZEEAvatarSDK{constructor(config){var _a;this.loader=null,this.avatarService=null,this.broadcastService=null,this.unityInstance=null,this.isInitialized=!1,this.instanceId=function generateUniqueId(){return`${Date.now()}_${Math.random().toString(36).substring(2,9)}`}(),ConfigManager.getInstance().setConfig(config),this.logger=new SimpleLogger(null===(_a=ConfigManager.getInstance().getConfig().enableDebugLog)||void 0===_a||_a),this.logger.info("SDK版本","2.2.1")}initializeAvatar(avatarCode_1){return __awaiter(this,arguments,void 0,function*(avatarCode,cameraType=AvatarCameraType.WHOLE){var _a;if(this.isInitialized)throw new SDKError(OperationErrorCode.OPERATION_FAILED,"SDK已经初始化,请勿重复初始化");try{const config=ConfigManager.getInstance().getConfig();this.loader=new ZEEAvatarLoader,yield this.loader.init(),this.unityInstance=this.loader.getInstance(),this.avatarService=new AvatarService({unityInstance:this.unityInstance,instanceId:this.instanceId,enableDebugLog:config.enableDebugLog,timeout:config.operationTimeout}),this.broadcastService=new BroadcastService({unityInstance:this.unityInstance,instanceId:this.instanceId,callbacks:config.broadcastCallbacks,enableDebugLog:config.enableDebugLog,timeout:config.operationTimeout});const result=yield this.avatarService.initializeAvatar(avatarCode,cameraType);if(result.success){const audioDrivenVersion=null===(_a=result.data)||void 0===_a?void 0:_a.audioDrivenVersion;if(config.audioDrivenVersion=audioDrivenVersion,this.logger.info("AudioDrivenVersion",audioDrivenVersion),audioDrivenVersion){if(!function compareVersionCompatibility(version1,version2){const getMajorMinor=version=>{const parts=version.split(".");return parts.length<2?version:`${parts[0]}.${parts[1]}`};return getMajorMinor(version1)===getMajorMinor(version2)}("2.2.1",audioDrivenVersion))throw this.destroy(),new SDKError(ResourceErrorCode.VERSION_INCOMPATIBLE,`资源版本不兼容: SDK版本为 2.2.1,WebGL资源版本为 ${audioDrivenVersion},前两位版本号必须一致`);this.logger.info("版本兼容性检查通过",`SDK: 2.2.1, 资源: ${audioDrivenVersion}`)}this.isInitialized=!0}return result}catch(error){throw new SDKError(OperationErrorCode.OPERATION_FAILED,`数字人初始化失败: ${error instanceof Error?error.message:String(error)}`)}})}updateToken(token){ConfigManager.getInstance().updateConfig({token:token}),this.loader&&this.loader.updateToken(token)}playMotion(clipCode){return __awaiter(this,void 0,void 0,function*(){return this.ensureInitialized(),yield this.avatarService.playMotion(clipCode)})}getCurrentMotion(){return __awaiter(this,arguments,void 0,function*(getRemainingTime=!1){return this.ensureInitialized(),yield this.avatarService.getCurrentMotion(getRemainingTime)})}unloadAvatar(){return __awaiter(this,void 0,void 0,function*(){this.ensureInitialized();try{const result=yield this.avatarService.unloadAvatar();return result.success&&(this.isInitialized=!1),result}catch(error){throw new SDKError(OperationErrorCode.OPERATION_FAILED,`数字人卸载失败: ${error instanceof Error?error.message:String(error)}`)}})}setCamera(cameraType){return __awaiter(this,void 0,void 0,function*(){return this.ensureInitialized(),yield this.avatarService.setCamera(cameraType)})}startBroadcast(params,isAppend){return __awaiter(this,void 0,void 0,function*(){return this.ensureInitialized(),yield this.broadcastService.startBroadcast(params,isAppend)})}startStreamBroadcast(params,forceRestart){return __awaiter(this,void 0,void 0,function*(){this.ensureInitialized();const status=this.broadcastService.getStatus(),isAppend=status.isActive;return this.logger.debug("startStreamBroadcast",{isActive:status.isActive,isAppend:isAppend}),yield this.broadcastService.startBroadcast(params,!forceRestart&&isAppend)})}pauseBroadcast(resetIdle){return __awaiter(this,void 0,void 0,function*(){return this.ensureInitialized(),yield this.broadcastService.pauseBroadcast(resetIdle)})}resumeBroadcast(){return __awaiter(this,void 0,void 0,function*(){return this.ensureInitialized(),yield this.broadcastService.resumeBroadcast()})}stopBroadcast(){return __awaiter(this,void 0,void 0,function*(){return this.ensureInitialized(),yield this.broadcastService.stopBroadcast()})}updateBroadcastCallbacks(callbacks){this.ensureInitialized(),this.broadcastService.updateCallbacks(callbacks)}getBroadcastStatus(){return this.ensureInitialized(),this.broadcastService.getStatus()}destroy(){try{this.broadcastService&&(this.broadcastService.destroy(),this.broadcastService=null),this.avatarService&&(this.avatarService.destroy(),this.avatarService=null),this.loader&&(this.loader.destroy(),this.loader=null),this.unityInstance=null,this.isInitialized=!1}catch(error){console.error("SDK销毁过程中发生错误:",error)}}getInstanceId(){return this.instanceId}isSDKInitialized(){return this.isInitialized}isAvatarInitialized(){return this.isInitialized}getConfig(){const config=ConfigManager.getInstance().getConfig();return config?Object.assign({},config):null}ensureInitialized(){if(!this.isInitialized)throw new SDKError(OperationErrorCode.UNITY_NOT_INITIALIZED,"Avatar尚未初始化,请先调用initializeAvatar()方法")}}export{AvatarCameraType,AvatarOperationType,AvatarService,BroadcastOperationType,BroadcastService,BroadcastType,ConfigErrorCode,ERROR_CODE_MAP,ErrorCategory,NetworkErrorCode,OperationErrorCode,ResourceErrorCode,SDKError,SDK_VERSION,SystemErrorCode,UnityOperationStatus,ZEEAvatarLoader,ZEEAvatarSDK,getErrorInfo};
|
|
1
|
+
function __awaiter(thisArg,_arguments,P,generator){return new(P||(P=Promise))(function(resolve,reject){function fulfilled(value){try{step(generator.next(value))}catch(e){reject(e)}}function rejected(value){try{step(generator.throw(value))}catch(e){reject(e)}}function step(result){result.done?resolve(result.value):function adopt(value){return value instanceof P?value:new P(function(resolve){resolve(value)})}(result.value).then(fulfilled,rejected)}step((generator=generator.apply(thisArg,_arguments||[])).next())})}var ErrorCategory,NetworkErrorCode,OperationErrorCode,ResourceErrorCode,SystemErrorCode,ConfigErrorCode;"function"==typeof SuppressedError&&SuppressedError,function(ErrorCategory){ErrorCategory.NETWORK="NETWORK",ErrorCategory.OPERATION="OPERATION",ErrorCategory.RESOURCE="RESOURCE",ErrorCategory.SYSTEM="SYSTEM",ErrorCategory.CONFIG="CONFIG"}(ErrorCategory||(ErrorCategory={})),function(NetworkErrorCode){NetworkErrorCode[NetworkErrorCode.CONNECTION_FAILED=1001]="CONNECTION_FAILED",NetworkErrorCode[NetworkErrorCode.REQUEST_TIMEOUT=1002]="REQUEST_TIMEOUT",NetworkErrorCode[NetworkErrorCode.SERVER_ERROR=1003]="SERVER_ERROR",NetworkErrorCode[NetworkErrorCode.UNAUTHORIZED=1004]="UNAUTHORIZED"}(NetworkErrorCode||(NetworkErrorCode={})),function(OperationErrorCode){OperationErrorCode[OperationErrorCode.UNITY_NOT_INITIALIZED=2001]="UNITY_NOT_INITIALIZED",OperationErrorCode[OperationErrorCode.AVATAR_NOT_LOADED=2002]="AVATAR_NOT_LOADED",OperationErrorCode[OperationErrorCode.OPERATION_FAILED=2003]="OPERATION_FAILED",OperationErrorCode[OperationErrorCode.OPERATION_TIMEOUT=2004]="OPERATION_TIMEOUT",OperationErrorCode[OperationErrorCode.OPERATION_CANCELLED=2005]="OPERATION_CANCELLED",OperationErrorCode[OperationErrorCode.BROADCAST_EQUITY_NOT_EXIST=2006]="BROADCAST_EQUITY_NOT_EXIST",OperationErrorCode[OperationErrorCode.BROADCAST_EQUITY_NOT_ENOUGH=2007]="BROADCAST_EQUITY_NOT_ENOUGH",OperationErrorCode[OperationErrorCode.BROADCAST_EQUITY_FREEZE_FAILED=2008]="BROADCAST_EQUITY_FREEZE_FAILED"}(OperationErrorCode||(OperationErrorCode={})),function(ResourceErrorCode){ResourceErrorCode[ResourceErrorCode.LOAD_FAILED=3001]="LOAD_FAILED",ResourceErrorCode[ResourceErrorCode.FILE_CORRUPTED=3002]="FILE_CORRUPTED",ResourceErrorCode[ResourceErrorCode.NOT_FOUND=3003]="NOT_FOUND",ResourceErrorCode[ResourceErrorCode.UNSUPPORTED_FORMAT=3004]="UNSUPPORTED_FORMAT",ResourceErrorCode[ResourceErrorCode.VERSION_INCOMPATIBLE=3005]="VERSION_INCOMPATIBLE"}(ResourceErrorCode||(ResourceErrorCode={})),function(SystemErrorCode){SystemErrorCode[SystemErrorCode.OUT_OF_MEMORY=4001]="OUT_OF_MEMORY",SystemErrorCode[SystemErrorCode.GPU_NOT_SUPPORTED=4002]="GPU_NOT_SUPPORTED",SystemErrorCode[SystemErrorCode.WEBGL_NOT_SUPPORTED=4003]="WEBGL_NOT_SUPPORTED",SystemErrorCode[SystemErrorCode.BROWSER_NOT_COMPATIBLE=4004]="BROWSER_NOT_COMPATIBLE"}(SystemErrorCode||(SystemErrorCode={})),function(ConfigErrorCode){ConfigErrorCode[ConfigErrorCode.INVALID_CONFIG=5001]="INVALID_CONFIG",ConfigErrorCode[ConfigErrorCode.MISSING_REQUIRED_PARAM=5002]="MISSING_REQUIRED_PARAM",ConfigErrorCode[ConfigErrorCode.PARAM_OUT_OF_RANGE=5003]="PARAM_OUT_OF_RANGE",ConfigErrorCode[ConfigErrorCode.INVALID_JSON_FORMAT=5004]="INVALID_JSON_FORMAT"}(ConfigErrorCode||(ConfigErrorCode={}));const ERROR_CODE_MAP={[NetworkErrorCode.CONNECTION_FAILED]:{category:ErrorCategory.NETWORK,message:"网络连接失败"},[NetworkErrorCode.REQUEST_TIMEOUT]:{category:ErrorCategory.NETWORK,message:"请求超时"},[NetworkErrorCode.SERVER_ERROR]:{category:ErrorCategory.NETWORK,message:"服务器错误"},[NetworkErrorCode.UNAUTHORIZED]:{category:ErrorCategory.NETWORK,message:"未授权访问"},[OperationErrorCode.UNITY_NOT_INITIALIZED]:{category:ErrorCategory.OPERATION,message:"Unity实例未初始化"},[OperationErrorCode.AVATAR_NOT_LOADED]:{category:ErrorCategory.OPERATION,message:"数字人未加载"},[OperationErrorCode.OPERATION_FAILED]:{category:ErrorCategory.OPERATION,message:"操作执行失败"},[OperationErrorCode.OPERATION_TIMEOUT]:{category:ErrorCategory.OPERATION,message:"操作超时"},[OperationErrorCode.OPERATION_CANCELLED]:{category:ErrorCategory.OPERATION,message:"操作被取消"},[OperationErrorCode.BROADCAST_EQUITY_NOT_EXIST]:{category:ErrorCategory.OPERATION,message:"用户权益额度不存在"},[OperationErrorCode.BROADCAST_EQUITY_NOT_ENOUGH]:{category:ErrorCategory.OPERATION,message:"用户权益额度不足"},[OperationErrorCode.BROADCAST_EQUITY_FREEZE_FAILED]:{category:ErrorCategory.OPERATION,message:"用户权益额度冻结失败"},[ResourceErrorCode.LOAD_FAILED]:{category:ErrorCategory.RESOURCE,message:"资源加载失败"},[ResourceErrorCode.FILE_CORRUPTED]:{category:ErrorCategory.RESOURCE,message:"资源文件损坏"},[ResourceErrorCode.NOT_FOUND]:{category:ErrorCategory.RESOURCE,message:"资源不存在"},[ResourceErrorCode.UNSUPPORTED_FORMAT]:{category:ErrorCategory.RESOURCE,message:"资源格式不支持"},[ResourceErrorCode.VERSION_INCOMPATIBLE]:{category:ErrorCategory.RESOURCE,message:"资源版本不兼容"},[SystemErrorCode.OUT_OF_MEMORY]:{category:ErrorCategory.SYSTEM,message:"内存不足"},[SystemErrorCode.GPU_NOT_SUPPORTED]:{category:ErrorCategory.SYSTEM,message:"GPU不支持"},[SystemErrorCode.WEBGL_NOT_SUPPORTED]:{category:ErrorCategory.SYSTEM,message:"WebGL不支持"},[SystemErrorCode.BROWSER_NOT_COMPATIBLE]:{category:ErrorCategory.SYSTEM,message:"浏览器不兼容"},[ConfigErrorCode.INVALID_CONFIG]:{category:ErrorCategory.CONFIG,message:"配置参数无效"},[ConfigErrorCode.MISSING_REQUIRED_PARAM]:{category:ErrorCategory.CONFIG,message:"必需参数缺失"},[ConfigErrorCode.PARAM_OUT_OF_RANGE]:{category:ErrorCategory.CONFIG,message:"参数值超出范围"},[ConfigErrorCode.INVALID_JSON_FORMAT]:{category:ErrorCategory.CONFIG,message:"JSON格式错误"}};function getErrorInfo(code){return ERROR_CODE_MAP[code]||{category:ErrorCategory.SYSTEM,message:"未知错误"}}class SDKError extends Error{constructor(code,message,originalError){const errorInfo=getErrorInfo(code),finalMessage=message||errorInfo.message;super(finalMessage),this.name="SDKError",this.code=code,this.category=errorInfo.category,this.message=finalMessage,this.timestamp=Date.now(),originalError&&originalError.stack?this.stack=originalError.stack:Error.captureStackTrace&&Error.captureStackTrace(this,SDKError)}toJSON(){return{name:this.name,code:this.code,category:this.category,message:this.message,timestamp:this.timestamp}}static createNetworkError(code,message,originalError){return new SDKError(code,message,originalError)}static createOperationError(code,message,originalError){return new SDKError(code,message,originalError)}static createResourceError(code,message,originalError){return new SDKError(code,message,originalError)}static createSystemError(code,message,originalError){return new SDKError(code,message,originalError)}static createConfigError(code,message,originalError){return new SDKError(code,message,originalError)}static createFromUnityError(unityCode,message){switch(unityCode){case 100:return new SDKError(ResourceErrorCode.LOAD_FAILED,message);case 200:return new SDKError(NetworkErrorCode.CONNECTION_FAILED,message);case 300:case 700:return new SDKError(ConfigErrorCode.INVALID_CONFIG,message);case 400:return new SDKError(OperationErrorCode.OPERATION_FAILED,message);case 500:return new SDKError(SystemErrorCode.OUT_OF_MEMORY,message);case 600:return new SDKError(OperationErrorCode.OPERATION_CANCELLED,message);default:return new SDKError(3001,message||`Unity错误 (错误码: ${unityCode})`)}}}var LogLevel,UnityOperationStatus;!function(LogLevel){LogLevel.DEBUG="debug",LogLevel.INFO="info",LogLevel.WARN="warn",LogLevel.ERROR="error"}(LogLevel||(LogLevel={}));class SimpleLogger{constructor(enableDebug=!1){this.enableDebug=enableDebug}pad(num,len){let s=String(num);for(;s.length<len;)s=`0${s}`;return s}getTimestamp(){const now=new Date;return`[${this.pad(now.getHours(),2)}:${this.pad(now.getMinutes(),2)}:${this.pad(now.getSeconds(),2)}.${this.pad(now.getMilliseconds(),3).slice(0,2)}]`}debug(message,data){this.enableDebug&&console.debug(`[SDK DEBUG]${this.getTimestamp()} ${message}`,data)}info(message,data){console.info(`[SDK INFO]${this.getTimestamp()} ${message}`,data)}warn(message,data){console.warn(`[SDK WARN]${this.getTimestamp()} ${message}`,data)}error(message,error,data){console.error(`[SDK ERROR]${this.getTimestamp()} ${message}`,error,error instanceof SDKError?error.code:null,data)}}!function(UnityOperationStatus){UnityOperationStatus[UnityOperationStatus.SUCCESS=0]="SUCCESS",UnityOperationStatus[UnityOperationStatus.FAILURE=1]="FAILURE",UnityOperationStatus[UnityOperationStatus.TIMEOUT=2]="TIMEOUT",UnityOperationStatus[UnityOperationStatus.CANCELLED=3]="CANCELLED"}(UnityOperationStatus||(UnityOperationStatus={}));const DEFAULT_CONFIG={targetObjectName:"AvatarSDK",timeout:3e4,enableDebugLog:!1,maxRetries:0};class UnityBaseService{get uniqueCallbackName(){return`${this.callbackFunctionName}_${this.instanceId}`}constructor(config){this.pendingCallbacks=new Map;const finalConfig=Object.assign(Object.assign({},DEFAULT_CONFIG),config);this.unityInstance=finalConfig.unityInstance,this.targetObjectName=finalConfig.targetObjectName,this.timeout=finalConfig.timeout||DEFAULT_CONFIG.timeout,this.maxRetries=finalConfig.maxRetries,this.instanceId=finalConfig.instanceId||"default",this.logger=new SimpleLogger(finalConfig.enableDebugLog),this.initializeGlobalCallback(),this.logger.debug("Unity service initialized",{config:finalConfig})}handleCallback(operation,code,message,data){const dataObj=data?JSON.parse(data):void 0;this.logger.warn("[ Received Unity callback ]",{operation:operation,code:code,message:message,data:dataObj,originalData:data});const callback=this.pendingCallbacks.get(operation);if(!callback)return void this.logger.warn(`No pending callback for operation: ${operation}`);callback.timer&&clearTimeout(callback.timer);const response={success:code===UnityOperationStatus.SUCCESS,message:message,errorCode:code,data:dataObj};try{if(code===UnityOperationStatus.SUCCESS)callback.resolve(response),this.logger.debug(`Operation '${operation}' completed successfully`);else{const error=SDKError.createFromUnityError(code,`Unity operation '${operation}' failed: ${message}`);callback.reject(error),this.logger.error(`Operation '${operation}' failed`,error)}}catch(error){this.logger.error(`Error handling callback for operation '${operation}'`,error)}finally{this.pendingCallbacks.delete(operation)}}setupCallback(operation){return this.clearCallback(operation),new Promise((resolve,reject)=>{const timer=setTimeout(()=>{this.pendingCallbacks.delete(operation);const timeoutError=new SDKError(OperationErrorCode.OPERATION_TIMEOUT,`Unity operation '${operation}' timed out after ${this.timeout}ms`);this.logger.error(`Operation '${operation}' timed out`,timeoutError),reject(timeoutError)},this.timeout);this.pendingCallbacks.set(operation,{resolve:resolve,reject:reject,timer:timer,retries:0}),this.logger.debug(`Callback setup for operation '${operation}' with timeout ${this.timeout}ms`)})}clearCallback(operation){const callback=this.pendingCallbacks.get(operation);callback&&(callback.timer&&clearTimeout(callback.timer),this.pendingCallbacks.delete(operation),this.logger.debug(`Cleared callback for operation '${operation}'`))}clearAllCallbacks(){this.pendingCallbacks.forEach(callback=>{callback.timer&&clearTimeout(callback.timer)}),this.pendingCallbacks.clear(),this.logger.debug("Cleared all pending callbacks")}sendMessage(methodName,parameter){if(!this.isUnityAvailable())throw new SDKError(OperationErrorCode.UNITY_NOT_INITIALIZED,"Unity实例未初始化");try{this.logger.warn(`[ Sending message ]: ${this.targetObjectName}.${methodName}`,parameter);const paramString=parameter?JSON.stringify(parameter):"";this.unityInstance.SendMessage(this.targetObjectName,methodName,paramString)}catch(error){const serviceError=new SDKError(OperationErrorCode.OPERATION_FAILED,`Failed to send Unity message: ${methodName}`,error);throw this.logger.error(`Failed to send Unity message: ${methodName}`,serviceError),serviceError}}sendAsyncMessage(methodName,operation,parameter){return __awaiter(this,void 0,void 0,function*(){if(!this.isUnityAvailable())throw new SDKError(OperationErrorCode.UNITY_NOT_INITIALIZED,"Unity实例未初始化");try{const callbackPromise=this.setupCallback(operation),fullParameter=Object.assign(Object.assign({},parameter),{callbackFun:this.uniqueCallbackName,operationType:operation});return this.sendMessage(methodName,fullParameter),yield callbackPromise}catch(error){if(this.clearCallback(operation),this.maxRetries>0&&error instanceof SDKError&&error.code===OperationErrorCode.OPERATION_TIMEOUT)return yield this.retryOperation(operation,methodName,parameter);throw error}})}destroy(){this.clearAllCallbacks(),window[this.uniqueCallbackName]&&(delete window[this.uniqueCallbackName],this.logger.debug(`Global callback unregistered: ${this.uniqueCallbackName}`)),this.logger.info("Unity service destroyed")}isUnityAvailable(){return null!==this.unityInstance&&"function"==typeof this.unityInstance.SendMessage}getPendingCallbackCount(){return this.pendingCallbacks.size}initializeGlobalCallback(){window[this.uniqueCallbackName]=(operation,code,message,data)=>{this.handleCallback(operation,code,message,data)},this.logger.warn(`Global callback registered: ${this.uniqueCallbackName}`)}retryOperation(operation,methodName,parameter){return __awaiter(this,void 0,void 0,function*(){let lastError=null;for(let attempt=0;attempt<=this.maxRetries;attempt++)try{return attempt>0&&(this.logger.debug(`Retrying operation '${operation}', attempt ${attempt}/${this.maxRetries}`),yield new Promise(resolve=>setTimeout(resolve,1e3*Math.pow(2,attempt)))),yield this.sendAsyncMessage(methodName,operation,parameter)}catch(error){if(lastError=error,this.logger.warn(`Operation '${operation}' failed, attempt ${attempt+1}/${this.maxRetries+1}`,error),error instanceof SDKError&&error.code===OperationErrorCode.OPERATION_TIMEOUT&&attempt<this.maxRetries)continue;if(!(error instanceof SDKError&&error.code===OperationErrorCode.OPERATION_TIMEOUT)||attempt>=this.maxRetries)throw error}throw lastError||new SDKError(OperationErrorCode.OPERATION_TIMEOUT,`All retry attempts failed for operation: ${operation}`)})}}var AvatarOperationType,AvatarCameraType;!function(AvatarOperationType){AvatarOperationType.INITIALIZE_AVATAR="initializeAvatar",AvatarOperationType.PLAY_MOTION="playMotion",AvatarOperationType.GET_CURRENT_MOTION="getCurrentMotion",AvatarOperationType.UNLOAD_AVATAR="unloadAvatar",AvatarOperationType.SET_CAMERA="setCamera"}(AvatarOperationType||(AvatarOperationType={})),function(AvatarCameraType){AvatarCameraType.WHOLE="whole",AvatarCameraType.HALF="half",AvatarCameraType.FACE="face"}(AvatarCameraType||(AvatarCameraType={}));class AvatarService extends UnityBaseService{get callbackFunctionName(){return"uniAvatarCallback"}constructor(config){super(config),this.logger.info("Avatar API service initialized")}initializeAvatar(avatarCode_1){return __awaiter(this,arguments,void 0,function*(avatarCode,cameraType=AvatarCameraType.WHOLE){this.logger.info(`Initializing avatar: ${avatarCode} with camera type: ${cameraType}`);try{const result=yield this.sendAsyncMessage("InitializeAvatar",AvatarOperationType.INITIALIZE_AVATAR,{avatarCode:avatarCode,cameraType:cameraType});return this.logger.info("Avatar initialization "+(result.success?"succeeded":"failed")),result}catch(error){throw this.logger.error("Failed to initialize avatar",error),error}})}handleCallback(operation,code,message,data){super.handleCallback(operation,code,message,data)}playMotion(clipCode){return __awaiter(this,void 0,void 0,function*(){this.logger.info(`Playing motion: ${clipCode}`);try{const result=yield this.sendAsyncMessage("PlayMotion",AvatarOperationType.PLAY_MOTION,{clipCode:clipCode});return this.logger.info("Motion play "+(result.success?"succeeded":"failed")),result}catch(error){throw this.logger.error("Failed to play motion",error),error}})}getCurrentMotion(getRemainingTime){return __awaiter(this,void 0,void 0,function*(){var _a,_b;this.logger.info(`Getting current motion info, includeRemainingTime: ${getRemainingTime}`);try{const result=yield this.sendAsyncMessage("GetCurrentMotion",AvatarOperationType.GET_CURRENT_MOTION,{getRemainingTime:getRemainingTime});return this.logger.info("Current motion info retrieved",{motionId:null===(_a=result.data)||void 0===_a?void 0:_a.motionId,remainingTime:null===(_b=result.data)||void 0===_b?void 0:_b.motionRemainingTime}),result}catch(error){throw this.logger.error("Failed to get current motion info",error),error}})}unloadAvatar(){return __awaiter(this,void 0,void 0,function*(){this.logger.info("Unloading avatar");try{const result=yield this.sendAsyncMessage("UnloadAvatar",AvatarOperationType.UNLOAD_AVATAR);return this.logger.info("Avatar unload "+(result.success?"succeeded":"failed")),result}catch(error){throw this.logger.error("Failed to unload avatar",error),error}})}setCamera(cameraType){return __awaiter(this,void 0,void 0,function*(){this.logger.info(`Setting camera type: ${cameraType}`);try{const result=yield this.sendAsyncMessage("SetCamera",AvatarOperationType.SET_CAMERA,{cameraType:cameraType});return this.logger.info("Camera type setting "+(result.success?"succeeded":"failed")),result}catch(error){throw this.logger.error("Failed to set camera type",error),error}})}batchExecute(operations){return __awaiter(this,void 0,void 0,function*(){this.logger.info(`Executing batch operations: ${operations.length} items`);const results=[];for(const operation of operations)try{const method=this[operation.method],result=yield method.apply(this,operation.params);results.push(result)}catch(error){this.logger.error(`Batch operation failed: ${operation.method}`,error),results.push({success:!1,message:`Batch operation failed: ${error.message}`,errorCode:1})}return this.logger.info(`Batch operations completed: ${results.filter(r=>r.success).length}/${results.length} successful`),results})}}const ENV_MAP={dev:{apiBaseUrl:"https://dev.local.zeewain.com"},test:{apiBaseUrl:"https://test.local.zeewain.com"},prod:{apiBaseUrl:"https://ai.zeewain3d.com"}};class ConfigManager{constructor(){this.config=null}static getInstance(){return ConfigManager.instance||(ConfigManager.instance=new ConfigManager),ConfigManager.instance}setConfig(config){this.config=Object.assign(Object.assign({},config),{env:config.env||"prod",containerId:config.containerId||"unity-container"})}updateConfig(config){this.config&&(this.config=Object.assign(Object.assign({},this.config),config))}getConfig(){return this.config}getApiBaseUrl(withApiModule=!0){var _a,_b,_c,_d;return"custom"===(null===(_a=this.config)||void 0===_a?void 0:_a.env)&&(null===(_b=this.config)||void 0===_b?void 0:_b.apiUrl)?`${this.config.apiUrl}${withApiModule?"/api":""}`:(null===(_d=function getEnvConfig(env="dev",withApiModule=!0){const baseUrl=ENV_MAP[env];return baseUrl?{apiBaseUrl:`${baseUrl.apiBaseUrl}${withApiModule?"/api":""}`}:null}((null===(_c=this.config)||void 0===_c?void 0:_c.env)||"prod",withApiModule))||void 0===_d?void 0:_d.apiBaseUrl)||""}reset(){this.config=null}}ConfigManager.instance=null;class UnityLoader{constructor(){this.config=ConfigManager.getInstance().getConfig()}init(){return __awaiter(this,void 0,void 0,function*(){const container=this.createContainer();return yield this.loadUnityLoader(),yield this.createUnityInstance(container)})}createContainer(){const container=document.getElementById(this.config.containerId);if(!container)throw new TypeError(`Avatar container element with ID "${this.config.containerId}" not found`);if(!(container instanceof HTMLDivElement))throw new TypeError("Avatar container element must be a div element");return container.style.position="relative",container}loadUnityLoader(){return new Promise((resolve,reject)=>{if(window.createUnityInstance)return resolve();const script=document.createElement("script");script.src=this.config.loaderUrl,script.async=!0,script.crossOrigin="anonymous",script.onload=()=>{"function"==typeof window.createUnityInstance?resolve():reject(new Error("createUnityInstance function not found"))},script.onerror=error=>{reject(new Error(`Failed to load UnityLoader: ${error}`))},document.head.appendChild(script)})}createUnityInstance(container){return __awaiter(this,void 0,void 0,function*(){let canvas=container.querySelector("#unity-canvas");if(canvas||(canvas=document.createElement("canvas"),canvas.id="unity-canvas",canvas.style.width="100%",canvas.style.height="100%",canvas.style.display="none",container.appendChild(canvas)),/iPhone|iPad|iPod|Android/i.test(navigator.userAgent)){const meta=document.createElement("meta");meta.name="viewport",meta.content="width=device-width, height=device-height, initial-scale=1.0, user-scalable=no, shrink-to-fit=yes",document.head.appendChild(meta),canvas.style.width="100%",canvas.style.height="100%",canvas.style.position="fixed"}if("function"==typeof window.createUnityInstance){const instance=yield window.createUnityInstance(canvas,{dataUrl:this.config.dataUrl,frameworkUrl:this.config.frameworkUrl,codeUrl:this.config.codeUrl,companyName:"广州紫为云科技有限公司",productName:"数字人SDK",productVersion:"1.0"},progress=>{this.config.onProgress&&this.config.onProgress(progress)});return yield new Promise(resolve=>setTimeout(resolve,500)),canvas.style.display="block",instance}throw new TypeError("createUnityInstance is not defined on window.")})}}function getLines(onLine){let buffer,position,fieldLength,discardTrailingNewline=!1;return function onChunk(arr){void 0===buffer?(buffer=arr,position=0,fieldLength=-1):buffer=function concat(a,b){const res=new Uint8Array(a.length+b.length);return res.set(a),res.set(b,a.length),res}(buffer,arr);const bufLength=buffer.length;let lineStart=0;for(;position<bufLength;){discardTrailingNewline&&(10===buffer[position]&&(lineStart=++position),discardTrailingNewline=!1);let lineEnd=-1;for(;position<bufLength&&-1===lineEnd;++position)switch(buffer[position]){case 58:-1===fieldLength&&(fieldLength=position-lineStart);break;case 13:discardTrailingNewline=!0;case 10:lineEnd=position}if(-1===lineEnd)break;onLine(buffer.subarray(lineStart,lineEnd),fieldLength),lineStart=position,fieldLength=-1}lineStart===bufLength?buffer=void 0:0!==lineStart&&(buffer=buffer.subarray(lineStart),position-=lineStart)}}var __rest=function(s,e){var t={};for(var p in s)Object.prototype.hasOwnProperty.call(s,p)&&e.indexOf(p)<0&&(t[p]=s[p]);if(null!=s&&"function"==typeof Object.getOwnPropertySymbols){var i=0;for(p=Object.getOwnPropertySymbols(s);i<p.length;i++)e.indexOf(p[i])<0&&Object.prototype.propertyIsEnumerable.call(s,p[i])&&(t[p[i]]=s[p[i]])}return t};function fetchEventSource(input,_a){var{signal:inputSignal,headers:inputHeaders,onopen:inputOnOpen,onmessage:onmessage,onclose:onclose,onerror:onerror,openWhenHidden:openWhenHidden,fetch:inputFetch}=_a,rest=__rest(_a,["signal","headers","onopen","onmessage","onclose","onerror","openWhenHidden","fetch"]);return new Promise((resolve,reject)=>{const headers=Object.assign({},inputHeaders);let curRequestController;function onVisibilityChange(){curRequestController.abort(),document.hidden||create()}headers.accept||(headers.accept="text/event-stream"),openWhenHidden||document.addEventListener("visibilitychange",onVisibilityChange);let retryInterval=1e3,retryTimer=0;function dispose(){document.removeEventListener("visibilitychange",onVisibilityChange),window.clearTimeout(retryTimer),curRequestController.abort()}null==inputSignal||inputSignal.addEventListener("abort",()=>{dispose(),resolve()});const fetch=null!=inputFetch?inputFetch:window.fetch,onopen=null!=inputOnOpen?inputOnOpen:defaultOnOpen;async function create(){var _a;curRequestController=new AbortController;try{const response=await fetch(input,Object.assign(Object.assign({},rest),{headers:headers,signal:curRequestController.signal}));await onopen(response),await async function getBytes(stream,onChunk){const reader=stream.getReader();let result;for(;!(result=await reader.read()).done;)onChunk(result.value)}(response.body,getLines(function getMessages(onId,onRetry,onMessage){let message={data:"",event:"",id:"",retry:void 0};const decoder=new TextDecoder;return function onLine(line,fieldLength){if(0===line.length)null==onMessage||onMessage(message),message={data:"",event:"",id:"",retry:void 0};else if(fieldLength>0){const field=decoder.decode(line.subarray(0,fieldLength)),valueOffset=fieldLength+(32===line[fieldLength+1]?2:1),value=decoder.decode(line.subarray(valueOffset));switch(field){case"data":message.data=message.data?message.data+"\n"+value:value;break;case"event":message.event=value;break;case"id":onId(message.id=value);break;case"retry":const retry=parseInt(value,10);isNaN(retry)||onRetry(message.retry=retry)}}}}(id=>{id?headers["last-event-id"]=id:delete headers["last-event-id"]},retry=>{retryInterval=retry},onmessage))),null==onclose||onclose(),dispose(),resolve()}catch(err){if(!curRequestController.signal.aborted)try{const interval=null!==(_a=null==onerror?void 0:onerror(err))&&void 0!==_a?_a:retryInterval;window.clearTimeout(retryTimer),retryTimer=window.setTimeout(create,interval)}catch(innerErr){dispose(),reject(innerErr)}}}create()})}function defaultOnOpen(response){const contentType=response.headers.get("content-type");if(!(null==contentType?void 0:contentType.startsWith("text/event-stream")))throw new Error(`Expected content-type to be text/event-stream, Actual: ${contentType}`)}var BroadcastOperationType,BroadcastType,BroadcastTaskStatus;!function(BroadcastOperationType){BroadcastOperationType.START_BROADCAST="startBroadcast",BroadcastOperationType.PAUSE_BROADCAST="pauseBroadcast",BroadcastOperationType.RESUME_BROADCAST="resumeBroadcast",BroadcastOperationType.STOP_BROADCAST="stopBroadcast",BroadcastOperationType.APPEND_BROADCAST="appendBroadcast"}(BroadcastOperationType||(BroadcastOperationType={})),function(BroadcastType){BroadcastType.TEXT="text",BroadcastType.AUDIO="audio"}(BroadcastType||(BroadcastType={})),function(BroadcastTaskStatus){BroadcastTaskStatus.PENDING="pending",BroadcastTaskStatus.REQUESTING="requesting",BroadcastTaskStatus.COMPLETED="completed",BroadcastTaskStatus.FAILED="failed",BroadcastTaskStatus.CANCELLED="cancelled"}(BroadcastTaskStatus||(BroadcastTaskStatus={}));class BroadcastService extends UnityBaseService{constructor(config){super(config),this.callbacks={},this.taskQueue=[],this.taskSequence=0,this.currentSendingSequence=0,this.isBroadcastingAudio=!1,this.hasReceivedAudio=!1,this.queueProcessTimer=null,this.broadcastCompletedCount=0,this.callbacks=config.callbacks||{},this.logger.info("Broadcast service initialized",{config:config})}handleCallback(operation,code,message,data){var _a,_b,_c,_d,_e,_f,_g,_h,_j,_k,_l;const{isBroadcastCompleted:isBroadcastCompleted}=JSON.parse(data||"{}");if(super.handleCallback(operation,code,message,data),0===code)switch(operation){case BroadcastOperationType.START_BROADCAST:if(isBroadcastCompleted){this.broadcastCompletedCount++;const status=this.getStatus();0===(null===(_a=status.queueInfo)||void 0===_a?void 0:_a.pendingTasks)&&0===(null===(_b=status.queueInfo)||void 0===_b?void 0:_b.requestingTasks)&&(null===(_c=status.queueInfo)||void 0===_c?void 0:_c.completedTasks)===this.broadcastCompletedCount&&(this.isBroadcastingAudio=!1,this.hasReceivedAudio=!1,this.currentSendingSequence=0,this.cleanupCompletedTasks(),this.logger.warn("Broadcast all completed")),null===(_e=(_d=this.callbacks).onFinish)||void 0===_e||_e.call(_d)}break;case BroadcastOperationType.PAUSE_BROADCAST:null===(_g=(_f=this.callbacks).onPause)||void 0===_g||_g.call(_f),this.logger.debug("Broadcast paused callback triggered");break;case BroadcastOperationType.RESUME_BROADCAST:null===(_j=(_h=this.callbacks).onResume)||void 0===_j||_j.call(_h),this.logger.debug("Broadcast resumed callback triggered");break;case BroadcastOperationType.STOP_BROADCAST:null===(_l=(_k=this.callbacks).onStop)||void 0===_l||_l.call(_k),this.logger.debug("Broadcast stopped callback triggered")}else{const error=SDKError.createFromUnityError(code,`Unity operation '${operation}' failed: ${message}`);this.handleError(error)}}startBroadcast(params,isAppend){return __awaiter(this,void 0,void 0,function*(){var _a,_b;this.logger.info(`Starting broadcast: ${params.type}`,{humanCode:params.humanCode,text:params.text,audioUrl:params.audioUrl,isAppend:isAppend,queueLength:this.taskQueue.length}),this.validateBroadcastParams(params),isAppend||(yield this.stopBroadcast(),this.taskSequence=0,this.currentSendingSequence=0,this.sendMessage("StartBroadcast",{callbackFun:this.uniqueCallbackName,operationType:BroadcastOperationType.START_BROADCAST,motionList:params.motionList,motionPlayMode:params.motionPlayMode}),null===(_b=(_a=this.callbacks).onStart)||void 0===_b||_b.call(_a),this.isBroadcastingAudio=!0);const task=this.createBroadcastTask(params);this.addTaskToQueue(task),this.logger.debug("Broadcast task created and queued",{taskId:task.id,sequence:task.sequence,isAppend:isAppend})})}pauseBroadcast(resetIdle){return __awaiter(this,void 0,void 0,function*(){this.logger.info("Pausing broadcast");try{yield this.sendAsyncMessage("PauseBroadcast",BroadcastOperationType.PAUSE_BROADCAST,{resetIdle:resetIdle}),this.logger.info("Broadcast paused successfully")}catch(error){throw this.logger.error("Failed to pause broadcast",error),error}})}resumeBroadcast(){return __awaiter(this,void 0,void 0,function*(){this.logger.info("Resuming broadcast");try{yield this.sendAsyncMessage("ResumeBroadcast",BroadcastOperationType.RESUME_BROADCAST,{}),this.logger.info("Broadcast resumed successfully")}catch(error){throw this.logger.error("Failed to resume broadcast",error),error}})}stopBroadcast(){return __awaiter(this,void 0,void 0,function*(){this.logger.info("Stopping broadcast and clearing queue",{queueLength:this.taskQueue.length}),this.cancelAllTasks(),yield new Promise(resolve=>setTimeout(resolve,100)),this.isBroadcastingAudio=!1,this.hasReceivedAudio=!1,this.broadcastCompletedCount=0;try{yield this.sendAsyncMessage("StopBroadcast",BroadcastOperationType.STOP_BROADCAST,{}),this.logger.info("Broadcast stopped successfully")}catch(error){throw this.logger.error("Failed to stop broadcast",error),error}})}updateCallbacks(callbacks){this.callbacks=Object.assign(Object.assign({},this.callbacks),callbacks),this.logger.debug("Broadcast callbacks updated")}getStatus(){const pendingTasks=this.taskQueue.filter(t=>t.status===BroadcastTaskStatus.PENDING).length,requestingTasks=this.taskQueue.filter(t=>t.status===BroadcastTaskStatus.REQUESTING).length,completedTasks=this.taskQueue.filter(t=>t.status===BroadcastTaskStatus.COMPLETED).length,failedTasks=this.taskQueue.filter(t=>t.status===BroadcastTaskStatus.FAILED).length,totalPendingResponses=this.taskQueue.reduce((sum,t)=>sum+t.pendingResponses.length,0),currentSendingSequence=this.currentSendingSequence,isGeneratingAudio=pendingTasks+requestingTasks>0;return{isActive:this.isBroadcastingAudio||isGeneratingAudio,isGeneratingAudio:isGeneratingAudio,hasReceivedAudio:this.hasReceivedAudio,queueInfo:{totalTasks:this.taskQueue.length,pendingTasks:pendingTasks,requestingTasks:requestingTasks,completedTasks:completedTasks,failedTasks:failedTasks,totalPendingResponses:totalPendingResponses,currentSendingSequence:currentSendingSequence}}}destroy(){this.clearQueueProcessTimer(),this.cancelAllTasks(),super.destroy(),this.logger.info("Broadcast service destroyed")}createBroadcastTask(params){const task={id:`[${params.type===BroadcastType.TEXT?"TEXT":"AUDIO"}]-(${params.type===BroadcastType.TEXT?params.text:params.audioUrl})_${Math.random().toString(36).substring(2,9)}`,sequence:++this.taskSequence,params:params,status:BroadcastTaskStatus.PENDING,controller:new AbortController,pendingResponses:[],isGenerationComplete:!1,createdAt:new Date};return this.logger.debug("Created broadcast task",{taskId:task.id,sequence:task.sequence}),task}addTaskToQueue(task){this.taskQueue.push(task),this.logger.debug("Task added to queue",{taskId:task.id,params:task.params,queueLength:this.taskQueue.length});this.taskQueue.some(t=>t.status===BroadcastTaskStatus.REQUESTING)?this.logger.debug("Task queued, waiting for previous task to complete",{taskId:task.id,pendingTasks:this.taskQueue.filter(t=>t.status===BroadcastTaskStatus.PENDING).length}):this.startTaskRequest(task),this.processTaskQueue()}processTaskQueue(){this.queueProcessTimer||(this.queueProcessTimer=setInterval(()=>{this.processTaskQueueStep()},100)),this.processTaskQueueStep()}processTaskQueueStep(){const nextTask=this.taskQueue.find(task=>task.sequence===this.currentSendingSequence+1&&task.status!==BroadcastTaskStatus.PENDING&&task.pendingResponses.length>0);nextTask?this.sendNextResponse(nextTask):this.logger.debug("No next task to process",{currentSendingSequence:this.currentSendingSequence,taskQueue:this.taskQueue});0===this.taskQueue.filter(task=>task.status===BroadcastTaskStatus.PENDING||task.status===BroadcastTaskStatus.REQUESTING).length&&this.clearQueueProcessTimer()}startTaskRequest(task){return __awaiter(this,void 0,void 0,function*(){var _a;task.status=BroadcastTaskStatus.REQUESTING,this.logger.debug("Starting task request",{taskId:task.id});try{const apiUrl=`${ConfigManager.getInstance().getApiBaseUrl(!0)}${this.getBroadcastApiPath(task.params.type)}`,requestBody={humanCode:task.params.humanCode,speed:task.params.speed,volume:task.params.volume>=0?100*task.params.volume:void 0,isSubtitle:task.params.isSubtitle,audioDrivenVersion:ConfigManager.getInstance().getConfig().audioDrivenVersion};task.params.type===BroadcastType.TEXT?(requestBody.text=task.params.text,requestBody.voiceCode=task.params.voiceCode):task.params.type===BroadcastType.AUDIO&&(requestBody.text=task.params.text,requestBody.audioUrl=task.params.audioUrl),fetchEventSource(apiUrl,{method:"POST",headers:{"Content-Type":"application/json",x_auth_token:(null===(_a=ConfigManager.getInstance().getConfig())||void 0===_a?void 0:_a.token)||""},body:JSON.stringify(requestBody),signal:task.controller.signal,openWhenHidden:!0,onopen:response=>__awaiter(this,void 0,void 0,function*(){if(!response.ok){const error=this.createHttpError(response.status,response.statusText,task.id);throw this.handleTaskError(task,error),error}}),onmessage:event=>{this.handleTaskResponse(task,event.data)},onclose:()=>{this.handleTaskClose(task)},onerror:error=>{if(error instanceof SDKError)throw error;this.logger.error("broadcast onerror",error);const sdkError=this.convertToSDKError(error,task.id);throw this.handleTaskError(task,sdkError),sdkError}})}catch(error){const sdkError=this.convertToSDKError(error,task.id);this.handleTaskError(task,sdkError)}})}handleTaskResponse(task,data){try{const response=JSON.parse(data);if(0!==response.code){const error=this.createBroadcastError(response.code,response.message);return void this.handleTaskError(task,error)}if(response.data){this.hasReceivedAudio=!0,task.params.type===BroadcastType.AUDIO&&task.params.audioUrl&&!response.data.voiceUrl&&(response.data.voiceUrl=task.params.audioUrl);const{voiceUrl:voiceUrl,mouthShapeUrl:mouthShapeUrl}=response.data;voiceUrl&&!voiceUrl.startsWith("http")&&(response.data.voiceUrl=`${ConfigManager.getInstance().getApiBaseUrl(!1)}${voiceUrl}`),mouthShapeUrl&&!mouthShapeUrl.startsWith("http")&&(response.data.mouthShapeUrl=`${ConfigManager.getInstance().getApiBaseUrl(!1)}${mouthShapeUrl}`),task.pendingResponses.push(response),this.logger.debug("Response added to task",{taskId:task.id,response:response,pendingCount:task.pendingResponses.length}),response.data.done&&(task.isGenerationComplete=!0,this.logger.debug("Task generation completed",{taskId:task.id,totalResponses:task.pendingResponses.length}))}}catch(error){this.handleTaskError(task,new SDKError(OperationErrorCode.OPERATION_FAILED,"string"==typeof error?error:error.message||"播报服务错误"))}}sendNextResponse(task){var _a;if(0===task.pendingResponses.length)return;const response=task.pendingResponses.shift();this.logger.debug("Sending response to Unity",{taskId:task.id,remainingResponses:task.pendingResponses.length,voiceUrl:null===(_a=response.data)||void 0===_a?void 0:_a.voiceUrl}),this.sendMessage("AppendBroadcast",{response:response,callbackFun:this.uniqueCallbackName,operationType:BroadcastOperationType.APPEND_BROADCAST}),task.isGenerationComplete&&0===task.pendingResponses.length&&(task.status=BroadcastTaskStatus.COMPLETED,this.currentSendingSequence=task.sequence,this.logger.debug("Task completed",{taskId:task.id}))}handleTaskClose(task){return __awaiter(this,void 0,void 0,function*(){this.logger.debug("Task stream closed",{taskId:task.id}),task.status!==BroadcastTaskStatus.FAILED&&task.status!==BroadcastTaskStatus.CANCELLED&&(task.isGenerationComplete||task.status!==BroadcastTaskStatus.REQUESTING||(task.isGenerationComplete=!0),this.startNextPendingTask())})}handleTaskError(task,error){var _a,_b;task.status!==BroadcastTaskStatus.FAILED&&task.status!==BroadcastTaskStatus.CANCELLED&&(task.status=BroadcastTaskStatus.FAILED,task.error=error,this.logger.error(`Task failed - ${task.id}`,error),null===(_b=(_a=this.callbacks).onError)||void 0===_b||_b.call(_a,error),this.cancelAllTasks(),this.isBroadcastingAudio=!1,this.hasReceivedAudio=!1,this.currentSendingSequence=0,this.clearQueueProcessTimer(),this.logger.debug("Task failed, all tasks cancelled and broadcast state reset"))}cleanupCompletedTasks(){const beforeLength=this.taskQueue.length;this.taskQueue=this.taskQueue.filter(task=>task.status!==BroadcastTaskStatus.COMPLETED&&task.status!==BroadcastTaskStatus.FAILED&&task.status!==BroadcastTaskStatus.CANCELLED);const removedCount=beforeLength-this.taskQueue.length;removedCount>0&&this.logger.debug("Cleaned up completed tasks",{removedCount:removedCount,remainingTasks:this.taskQueue.length})}cancelAllTasks(){for(const task of this.taskQueue)task.status===BroadcastTaskStatus.REQUESTING?(task.controller.abort(),task.status=BroadcastTaskStatus.CANCELLED,this.logger.debug("Task aborted",{taskId:task.id,previousStatus:"requesting"})):task.status===BroadcastTaskStatus.PENDING&&(task.status=BroadcastTaskStatus.CANCELLED,this.logger.debug("Task cancelled",{taskId:task.id,previousStatus:"pending"}));this.taskQueue=[],this.taskSequence=0,this.currentSendingSequence=0,this.logger.debug("All tasks cancelled and queue cleared")}get callbackFunctionName(){return"uniBroadcastCallback"}getBroadcastApiPath(type){switch(type){case BroadcastType.TEXT:return"/aiep-openapi/avatar-interaction/v1/broadcast/text";case BroadcastType.AUDIO:return"/aiep-openapi/avatar-interaction/v1/broadcast/audio";default:throw new SDKError(ConfigErrorCode.INVALID_CONFIG,`未知的播报类型: ${type}`)}}validateBroadcastParams(params){if(params.type===BroadcastType.TEXT){if(!params.text||!params.voiceCode)throw new SDKError(ConfigErrorCode.MISSING_REQUIRED_PARAM,"文本播报需要提供text和voiceCode参数")}else if(params.type===BroadcastType.AUDIO&&!params.audioUrl)throw new SDKError(ConfigErrorCode.MISSING_REQUIRED_PARAM,"自定义音频播报需要提供audioUrl参数")}handleError(error){var _a,_b;this.logger.error("Broadcast error occurred",error),null===(_b=(_a=this.callbacks).onError)||void 0===_b||_b.call(_a,error)}createBroadcastError(errorCode,errorMessage){switch(errorCode){case 14001:return new SDKError(OperationErrorCode.BROADCAST_EQUITY_NOT_EXIST,"用户权益额度不存在");case 14002:return new SDKError(OperationErrorCode.BROADCAST_EQUITY_NOT_ENOUGH,"用户权益额度不足");case 14003:return new SDKError(OperationErrorCode.BROADCAST_EQUITY_FREEZE_FAILED,"用户权益额度冻结失败");default:return new SDKError(OperationErrorCode.OPERATION_FAILED,`${errorMessage}(${errorCode})`||`播报服务错误(${errorCode})`)}}startNextPendingTask(){const nextPendingTask=this.taskQueue.filter(t=>t.status===BroadcastTaskStatus.PENDING).sort((a,b)=>a.sequence-b.sequence)[0];nextPendingTask?(this.logger.debug("Starting next pending task",{taskId:nextPendingTask.id,sequence:nextPendingTask.sequence}),this.startTaskRequest(nextPendingTask)):this.logger.debug("No pending tasks to start")}clearQueueProcessTimer(){this.queueProcessTimer&&(clearInterval(this.queueProcessTimer),this.queueProcessTimer=null,this.logger.debug("Queue process timer cleared"))}createHttpError(status,statusText,taskId){switch(this.logger.warn(`HTTP error occurred - Task: ${taskId}, Status: ${status}`,{status:status,statusText:statusText}),status){case 401:return new SDKError(NetworkErrorCode.UNAUTHORIZED,`Token 已过期或无效,请重新授权 (HTTP ${status})`);case 403:return new SDKError(NetworkErrorCode.UNAUTHORIZED,`无权限访问该资源 (HTTP ${status})`);case 404:return new SDKError(NetworkErrorCode.SERVER_ERROR,`请求的资源不存在 (HTTP ${status})`);case 500:case 502:case 503:case 504:return new SDKError(NetworkErrorCode.SERVER_ERROR,`服务器错误,请稍后重试 (HTTP ${status})`);default:return new SDKError(NetworkErrorCode.CONNECTION_FAILED,`网络请求失败: ${statusText||"Unknown Error"} (HTTP ${status})`)}}convertToSDKError(error,taskId){if(error instanceof SDKError)return error;if(error instanceof Error){const errorMessage=error.message.toLowerCase();if(errorMessage.includes("timeout")||errorMessage.includes("timed out"))return new SDKError(NetworkErrorCode.REQUEST_TIMEOUT,`请求超时 - Task: ${taskId}`,error);if(errorMessage.includes("network")||errorMessage.includes("fetch")||errorMessage.includes("connection")){const hint=errorMessage.includes("failed to fetch")?"(可能是 Token 过期或 CORS 跨域问题,请检查 Token 是否有效)":"";return new SDKError(NetworkErrorCode.CONNECTION_FAILED,`网络请求失败 - Task: ${taskId}: ${error.message}${hint}`,error)}return errorMessage.includes("abort")||errorMessage.includes("cancel")?new SDKError(OperationErrorCode.OPERATION_CANCELLED,`操作已取消 - Task: ${taskId}`,error):new SDKError(OperationErrorCode.OPERATION_FAILED,`播报任务执行失败 - Task: ${taskId}: ${error.message}`,error)}const errorMessage=String(error);return new SDKError(OperationErrorCode.OPERATION_FAILED,`播报任务执行失败 - Task: ${taskId}: ${errorMessage}`)}}class ZEEAvatarLoader{constructor(){this.apiService=null,this.unityInstance=null,this.loader=new UnityLoader}init(){return __awaiter(this,void 0,void 0,function*(){return this.unityInstance=yield this.loader.init(),this.initGlobalConfig(),this.apiService=new AvatarService({unityInstance:this.unityInstance}),this.apiService})}updateToken(token){const currentConfig=ConfigManager.getInstance().getConfig();currentConfig&&(ConfigManager.getInstance().setConfig(Object.assign(Object.assign({},currentConfig),{token:token})),this.initGlobalConfig())}getAPI(){return this.apiService}getInstance(){return this.unityInstance}getContainerId(){return ConfigManager.getInstance().getConfig().containerId}destroy(){if(this.unityInstance){const container=document.getElementById(this.getContainerId());if(container){const canvas=container.querySelector("#unity-canvas");canvas&&canvas.remove()}"function"==typeof this.unityInstance.Quit&&this.unityInstance.Quit(),this.unityInstance=null,this.apiService=null}ConfigManager.getInstance().reset()}initGlobalConfig(){const config=ConfigManager.getInstance().getConfig(),{assetsFrom:assetsFrom}=config,globalParams={token:null==config?void 0:config.token,apiBaseUrl:ConfigManager.getInstance().getApiBaseUrl(!1),idleMotionList:null==config?void 0:config.idleMotionList};if(this.unityInstance.SendMessage("AvatarSDK","InitializeConfig",JSON.stringify(globalParams)),console.warn("[ Send Unity message ]: AvatarSDK.InitializeConfig",globalParams),"cloud"!==assetsFrom){const assetModuleParams={isZip:!0,assetBundlePath:null==config?void 0:config.assetsUrl};this.unityInstance.SendMessage("AvatarSDK","InitAssetBundleModule",JSON.stringify(assetModuleParams)),console.warn("[ Send Unity message ]: AvatarSDK.InitAssetBundleModule",assetModuleParams)}}}const SDK_VERSION="2.2.2";class ZEEAvatarSDK{constructor(config){var _a;this.loader=null,this.avatarService=null,this.broadcastService=null,this.unityInstance=null,this.isInitialized=!1,this.instanceId=function generateUniqueId(){return`${Date.now()}_${Math.random().toString(36).substring(2,9)}`}(),ConfigManager.getInstance().setConfig(config),this.logger=new SimpleLogger(null===(_a=ConfigManager.getInstance().getConfig().enableDebugLog)||void 0===_a||_a),this.logger.info("SDK版本","2.2.2")}initializeAvatar(avatarCode_1){return __awaiter(this,arguments,void 0,function*(avatarCode,cameraType=AvatarCameraType.WHOLE){var _a;if(this.isInitialized)throw new SDKError(OperationErrorCode.OPERATION_FAILED,"SDK已经初始化,请勿重复初始化");try{const config=ConfigManager.getInstance().getConfig();this.loader=new ZEEAvatarLoader,yield this.loader.init(),this.unityInstance=this.loader.getInstance(),this.avatarService=new AvatarService({unityInstance:this.unityInstance,instanceId:this.instanceId,enableDebugLog:config.enableDebugLog,timeout:config.operationTimeout}),this.broadcastService=new BroadcastService({unityInstance:this.unityInstance,instanceId:this.instanceId,callbacks:config.broadcastCallbacks,enableDebugLog:config.enableDebugLog,timeout:config.operationTimeout});const result=yield this.avatarService.initializeAvatar(avatarCode,cameraType);if(result.success){const audioDrivenVersion=null===(_a=result.data)||void 0===_a?void 0:_a.audioDrivenVersion;if(config.audioDrivenVersion=audioDrivenVersion,this.logger.info("AudioDrivenVersion",audioDrivenVersion),audioDrivenVersion){if(!function compareVersionCompatibility(version1,version2){const getMajorMinor=version=>{const parts=version.split(".");return parts.length<2?version:`${parts[0]}.${parts[1]}`};return getMajorMinor(version1)===getMajorMinor(version2)}("2.2.2",audioDrivenVersion))throw this.destroy(),new SDKError(ResourceErrorCode.VERSION_INCOMPATIBLE,`资源版本不兼容: SDK版本为 2.2.2,WebGL资源版本为 ${audioDrivenVersion},前两位版本号必须一致`);this.logger.info("版本兼容性检查通过",`SDK: 2.2.2, 资源: ${audioDrivenVersion}`)}this.isInitialized=!0}return result}catch(error){throw new SDKError(OperationErrorCode.OPERATION_FAILED,`数字人初始化失败: ${error instanceof Error?error.message:String(error)}`)}})}updateToken(token){ConfigManager.getInstance().updateConfig({token:token}),this.loader&&this.loader.updateToken(token)}playMotion(clipCode){return __awaiter(this,void 0,void 0,function*(){return this.ensureInitialized(),yield this.avatarService.playMotion(clipCode)})}getCurrentMotion(){return __awaiter(this,arguments,void 0,function*(getRemainingTime=!1){return this.ensureInitialized(),yield this.avatarService.getCurrentMotion(getRemainingTime)})}unloadAvatar(){return __awaiter(this,void 0,void 0,function*(){this.ensureInitialized();try{const result=yield this.avatarService.unloadAvatar();return result.success&&(this.isInitialized=!1),result}catch(error){throw new SDKError(OperationErrorCode.OPERATION_FAILED,`数字人卸载失败: ${error instanceof Error?error.message:String(error)}`)}})}setCamera(cameraType){return __awaiter(this,void 0,void 0,function*(){return this.ensureInitialized(),yield this.avatarService.setCamera(cameraType)})}startBroadcast(params,isAppend){return __awaiter(this,void 0,void 0,function*(){return this.ensureInitialized(),yield this.broadcastService.startBroadcast(params,isAppend)})}startStreamBroadcast(params,forceRestart){return __awaiter(this,void 0,void 0,function*(){this.ensureInitialized();const status=this.broadcastService.getStatus(),isAppend=status.isActive;return this.logger.debug("startStreamBroadcast",{isActive:status.isActive,isAppend:isAppend}),yield this.broadcastService.startBroadcast(params,!forceRestart&&isAppend)})}pauseBroadcast(resetIdle){return __awaiter(this,void 0,void 0,function*(){return this.ensureInitialized(),yield this.broadcastService.pauseBroadcast(resetIdle)})}resumeBroadcast(){return __awaiter(this,void 0,void 0,function*(){return this.ensureInitialized(),yield this.broadcastService.resumeBroadcast()})}stopBroadcast(){return __awaiter(this,void 0,void 0,function*(){return this.ensureInitialized(),yield this.broadcastService.stopBroadcast()})}updateBroadcastCallbacks(callbacks){this.ensureInitialized(),this.broadcastService.updateCallbacks(callbacks)}getBroadcastStatus(){return this.ensureInitialized(),this.broadcastService.getStatus()}destroy(){try{this.broadcastService&&(this.broadcastService.destroy(),this.broadcastService=null),this.avatarService&&(this.avatarService.destroy(),this.avatarService=null),this.loader&&(this.loader.destroy(),this.loader=null),this.unityInstance=null,this.isInitialized=!1}catch(error){console.error("SDK销毁过程中发生错误:",error)}}getInstanceId(){return this.instanceId}isSDKInitialized(){return this.isInitialized}isAvatarInitialized(){return this.isInitialized}getConfig(){const config=ConfigManager.getInstance().getConfig();return config?Object.assign({},config):null}ensureInitialized(){if(!this.isInitialized)throw new SDKError(OperationErrorCode.UNITY_NOT_INITIALIZED,"Avatar尚未初始化,请先调用initializeAvatar()方法")}}export{AvatarCameraType,AvatarOperationType,AvatarService,BroadcastOperationType,BroadcastService,BroadcastType,ConfigErrorCode,ERROR_CODE_MAP,ErrorCategory,NetworkErrorCode,OperationErrorCode,ResourceErrorCode,SDKError,SDK_VERSION,SystemErrorCode,UnityOperationStatus,ZEEAvatarLoader,ZEEAvatarSDK,getErrorInfo};
|
package/dist/index.umd.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
!function(global,factory){"object"==typeof exports&&"undefined"!=typeof module?factory(exports):"function"==typeof define&&define.amd?define(["exports"],factory):factory((global="undefined"!=typeof globalThis?globalThis:global||self).ZEEAvatarSDKLib={})}(this,function(exports){"use strict";function __awaiter(thisArg,_arguments,P,generator){return new(P||(P=Promise))(function(resolve,reject){function fulfilled(value){try{step(generator.next(value))}catch(e){reject(e)}}function rejected(value){try{step(generator.throw(value))}catch(e){reject(e)}}function step(result){result.done?resolve(result.value):function adopt(value){return value instanceof P?value:new P(function(resolve){resolve(value)})}(result.value).then(fulfilled,rejected)}step((generator=generator.apply(thisArg,_arguments||[])).next())})}var ErrorCategory,NetworkErrorCode,OperationErrorCode,ResourceErrorCode,SystemErrorCode,ConfigErrorCode;"function"==typeof SuppressedError&&SuppressedError,exports.ErrorCategory=void 0,(ErrorCategory=exports.ErrorCategory||(exports.ErrorCategory={})).NETWORK="NETWORK",ErrorCategory.OPERATION="OPERATION",ErrorCategory.RESOURCE="RESOURCE",ErrorCategory.SYSTEM="SYSTEM",ErrorCategory.CONFIG="CONFIG",exports.NetworkErrorCode=void 0,(NetworkErrorCode=exports.NetworkErrorCode||(exports.NetworkErrorCode={}))[NetworkErrorCode.CONNECTION_FAILED=1001]="CONNECTION_FAILED",NetworkErrorCode[NetworkErrorCode.REQUEST_TIMEOUT=1002]="REQUEST_TIMEOUT",NetworkErrorCode[NetworkErrorCode.SERVER_ERROR=1003]="SERVER_ERROR",NetworkErrorCode[NetworkErrorCode.UNAUTHORIZED=1004]="UNAUTHORIZED",exports.OperationErrorCode=void 0,(OperationErrorCode=exports.OperationErrorCode||(exports.OperationErrorCode={}))[OperationErrorCode.UNITY_NOT_INITIALIZED=2001]="UNITY_NOT_INITIALIZED",OperationErrorCode[OperationErrorCode.AVATAR_NOT_LOADED=2002]="AVATAR_NOT_LOADED",OperationErrorCode[OperationErrorCode.OPERATION_FAILED=2003]="OPERATION_FAILED",OperationErrorCode[OperationErrorCode.OPERATION_TIMEOUT=2004]="OPERATION_TIMEOUT",OperationErrorCode[OperationErrorCode.OPERATION_CANCELLED=2005]="OPERATION_CANCELLED",OperationErrorCode[OperationErrorCode.BROADCAST_EQUITY_NOT_EXIST=2006]="BROADCAST_EQUITY_NOT_EXIST",OperationErrorCode[OperationErrorCode.BROADCAST_EQUITY_NOT_ENOUGH=2007]="BROADCAST_EQUITY_NOT_ENOUGH",OperationErrorCode[OperationErrorCode.BROADCAST_EQUITY_FREEZE_FAILED=2008]="BROADCAST_EQUITY_FREEZE_FAILED",exports.ResourceErrorCode=void 0,(ResourceErrorCode=exports.ResourceErrorCode||(exports.ResourceErrorCode={}))[ResourceErrorCode.LOAD_FAILED=3001]="LOAD_FAILED",ResourceErrorCode[ResourceErrorCode.FILE_CORRUPTED=3002]="FILE_CORRUPTED",ResourceErrorCode[ResourceErrorCode.NOT_FOUND=3003]="NOT_FOUND",ResourceErrorCode[ResourceErrorCode.UNSUPPORTED_FORMAT=3004]="UNSUPPORTED_FORMAT",ResourceErrorCode[ResourceErrorCode.VERSION_INCOMPATIBLE=3005]="VERSION_INCOMPATIBLE",exports.SystemErrorCode=void 0,(SystemErrorCode=exports.SystemErrorCode||(exports.SystemErrorCode={}))[SystemErrorCode.OUT_OF_MEMORY=4001]="OUT_OF_MEMORY",SystemErrorCode[SystemErrorCode.GPU_NOT_SUPPORTED=4002]="GPU_NOT_SUPPORTED",SystemErrorCode[SystemErrorCode.WEBGL_NOT_SUPPORTED=4003]="WEBGL_NOT_SUPPORTED",SystemErrorCode[SystemErrorCode.BROWSER_NOT_COMPATIBLE=4004]="BROWSER_NOT_COMPATIBLE",exports.ConfigErrorCode=void 0,(ConfigErrorCode=exports.ConfigErrorCode||(exports.ConfigErrorCode={}))[ConfigErrorCode.INVALID_CONFIG=5001]="INVALID_CONFIG",ConfigErrorCode[ConfigErrorCode.MISSING_REQUIRED_PARAM=5002]="MISSING_REQUIRED_PARAM",ConfigErrorCode[ConfigErrorCode.PARAM_OUT_OF_RANGE=5003]="PARAM_OUT_OF_RANGE",ConfigErrorCode[ConfigErrorCode.INVALID_JSON_FORMAT=5004]="INVALID_JSON_FORMAT";const ERROR_CODE_MAP={[exports.NetworkErrorCode.CONNECTION_FAILED]:{category:exports.ErrorCategory.NETWORK,message:"网络连接失败"},[exports.NetworkErrorCode.REQUEST_TIMEOUT]:{category:exports.ErrorCategory.NETWORK,message:"请求超时"},[exports.NetworkErrorCode.SERVER_ERROR]:{category:exports.ErrorCategory.NETWORK,message:"服务器错误"},[exports.NetworkErrorCode.UNAUTHORIZED]:{category:exports.ErrorCategory.NETWORK,message:"未授权访问"},[exports.OperationErrorCode.UNITY_NOT_INITIALIZED]:{category:exports.ErrorCategory.OPERATION,message:"Unity实例未初始化"},[exports.OperationErrorCode.AVATAR_NOT_LOADED]:{category:exports.ErrorCategory.OPERATION,message:"数字人未加载"},[exports.OperationErrorCode.OPERATION_FAILED]:{category:exports.ErrorCategory.OPERATION,message:"操作执行失败"},[exports.OperationErrorCode.OPERATION_TIMEOUT]:{category:exports.ErrorCategory.OPERATION,message:"操作超时"},[exports.OperationErrorCode.OPERATION_CANCELLED]:{category:exports.ErrorCategory.OPERATION,message:"操作被取消"},[exports.OperationErrorCode.BROADCAST_EQUITY_NOT_EXIST]:{category:exports.ErrorCategory.OPERATION,message:"用户权益额度不存在"},[exports.OperationErrorCode.BROADCAST_EQUITY_NOT_ENOUGH]:{category:exports.ErrorCategory.OPERATION,message:"用户权益额度不足"},[exports.OperationErrorCode.BROADCAST_EQUITY_FREEZE_FAILED]:{category:exports.ErrorCategory.OPERATION,message:"用户权益额度冻结失败"},[exports.ResourceErrorCode.LOAD_FAILED]:{category:exports.ErrorCategory.RESOURCE,message:"资源加载失败"},[exports.ResourceErrorCode.FILE_CORRUPTED]:{category:exports.ErrorCategory.RESOURCE,message:"资源文件损坏"},[exports.ResourceErrorCode.NOT_FOUND]:{category:exports.ErrorCategory.RESOURCE,message:"资源不存在"},[exports.ResourceErrorCode.UNSUPPORTED_FORMAT]:{category:exports.ErrorCategory.RESOURCE,message:"资源格式不支持"},[exports.ResourceErrorCode.VERSION_INCOMPATIBLE]:{category:exports.ErrorCategory.RESOURCE,message:"资源版本不兼容"},[exports.SystemErrorCode.OUT_OF_MEMORY]:{category:exports.ErrorCategory.SYSTEM,message:"内存不足"},[exports.SystemErrorCode.GPU_NOT_SUPPORTED]:{category:exports.ErrorCategory.SYSTEM,message:"GPU不支持"},[exports.SystemErrorCode.WEBGL_NOT_SUPPORTED]:{category:exports.ErrorCategory.SYSTEM,message:"WebGL不支持"},[exports.SystemErrorCode.BROWSER_NOT_COMPATIBLE]:{category:exports.ErrorCategory.SYSTEM,message:"浏览器不兼容"},[exports.ConfigErrorCode.INVALID_CONFIG]:{category:exports.ErrorCategory.CONFIG,message:"配置参数无效"},[exports.ConfigErrorCode.MISSING_REQUIRED_PARAM]:{category:exports.ErrorCategory.CONFIG,message:"必需参数缺失"},[exports.ConfigErrorCode.PARAM_OUT_OF_RANGE]:{category:exports.ErrorCategory.CONFIG,message:"参数值超出范围"},[exports.ConfigErrorCode.INVALID_JSON_FORMAT]:{category:exports.ErrorCategory.CONFIG,message:"JSON格式错误"}};function getErrorInfo(code){return ERROR_CODE_MAP[code]||{category:exports.ErrorCategory.SYSTEM,message:"未知错误"}}class SDKError extends Error{constructor(code,message,originalError){const errorInfo=getErrorInfo(code),finalMessage=message||errorInfo.message;super(finalMessage),this.name="SDKError",this.code=code,this.category=errorInfo.category,this.message=finalMessage,this.timestamp=Date.now(),originalError&&originalError.stack?this.stack=originalError.stack:Error.captureStackTrace&&Error.captureStackTrace(this,SDKError)}toJSON(){return{name:this.name,code:this.code,category:this.category,message:this.message,timestamp:this.timestamp}}static createNetworkError(code,message,originalError){return new SDKError(code,message,originalError)}static createOperationError(code,message,originalError){return new SDKError(code,message,originalError)}static createResourceError(code,message,originalError){return new SDKError(code,message,originalError)}static createSystemError(code,message,originalError){return new SDKError(code,message,originalError)}static createConfigError(code,message,originalError){return new SDKError(code,message,originalError)}static createFromUnityError(unityCode,message){switch(unityCode){case 100:return new SDKError(exports.ResourceErrorCode.LOAD_FAILED,message);case 200:return new SDKError(exports.NetworkErrorCode.CONNECTION_FAILED,message);case 300:case 700:return new SDKError(exports.ConfigErrorCode.INVALID_CONFIG,message);case 400:return new SDKError(exports.OperationErrorCode.OPERATION_FAILED,message);case 500:return new SDKError(exports.SystemErrorCode.OUT_OF_MEMORY,message);case 600:return new SDKError(exports.OperationErrorCode.OPERATION_CANCELLED,message);default:return new SDKError(3001,message||`Unity错误 (错误码: ${unityCode})`)}}}var LogLevel,UnityOperationStatus;!function(LogLevel){LogLevel.DEBUG="debug",LogLevel.INFO="info",LogLevel.WARN="warn",LogLevel.ERROR="error"}(LogLevel||(LogLevel={}));class SimpleLogger{constructor(enableDebug=!1){this.enableDebug=enableDebug}pad(num,len){let s=String(num);for(;s.length<len;)s=`0${s}`;return s}getTimestamp(){const now=new Date;return`[${this.pad(now.getHours(),2)}:${this.pad(now.getMinutes(),2)}:${this.pad(now.getSeconds(),2)}.${this.pad(now.getMilliseconds(),3).slice(0,2)}]`}debug(message,data){this.enableDebug&&console.debug(`[SDK DEBUG]${this.getTimestamp()} ${message}`,data)}info(message,data){console.info(`[SDK INFO]${this.getTimestamp()} ${message}`,data)}warn(message,data){console.warn(`[SDK WARN]${this.getTimestamp()} ${message}`,data)}error(message,error,data){console.error(`[SDK ERROR]${this.getTimestamp()} ${message}`,error,error instanceof SDKError?error.code:null,data)}}exports.UnityOperationStatus=void 0,(UnityOperationStatus=exports.UnityOperationStatus||(exports.UnityOperationStatus={}))[UnityOperationStatus.SUCCESS=0]="SUCCESS",UnityOperationStatus[UnityOperationStatus.FAILURE=1]="FAILURE",UnityOperationStatus[UnityOperationStatus.TIMEOUT=2]="TIMEOUT",UnityOperationStatus[UnityOperationStatus.CANCELLED=3]="CANCELLED";const DEFAULT_CONFIG={targetObjectName:"AvatarSDK",timeout:3e4,enableDebugLog:!1,maxRetries:0};class UnityBaseService{get uniqueCallbackName(){return`${this.callbackFunctionName}_${this.instanceId}`}constructor(config){this.pendingCallbacks=new Map;const finalConfig=Object.assign(Object.assign({},DEFAULT_CONFIG),config);this.unityInstance=finalConfig.unityInstance,this.targetObjectName=finalConfig.targetObjectName,this.timeout=finalConfig.timeout||DEFAULT_CONFIG.timeout,this.maxRetries=finalConfig.maxRetries,this.instanceId=finalConfig.instanceId||"default",this.logger=new SimpleLogger(finalConfig.enableDebugLog),this.initializeGlobalCallback(),this.logger.debug("Unity service initialized",{config:finalConfig})}handleCallback(operation,code,message,data){const dataObj=data?JSON.parse(data):void 0;this.logger.warn("[ Received Unity callback ]",{operation:operation,code:code,message:message,data:dataObj,originalData:data});const callback=this.pendingCallbacks.get(operation);if(!callback)return void this.logger.warn(`No pending callback for operation: ${operation}`);callback.timer&&clearTimeout(callback.timer);const response={success:code===exports.UnityOperationStatus.SUCCESS,message:message,errorCode:code,data:dataObj};try{if(code===exports.UnityOperationStatus.SUCCESS)callback.resolve(response),this.logger.debug(`Operation '${operation}' completed successfully`);else{const error=SDKError.createFromUnityError(code,`Unity operation '${operation}' failed: ${message}`);callback.reject(error),this.logger.error(`Operation '${operation}' failed`,error)}}catch(error){this.logger.error(`Error handling callback for operation '${operation}'`,error)}finally{this.pendingCallbacks.delete(operation)}}setupCallback(operation){return this.clearCallback(operation),new Promise((resolve,reject)=>{const timer=setTimeout(()=>{this.pendingCallbacks.delete(operation);const timeoutError=new SDKError(exports.OperationErrorCode.OPERATION_TIMEOUT,`Unity operation '${operation}' timed out after ${this.timeout}ms`);this.logger.error(`Operation '${operation}' timed out`,timeoutError),reject(timeoutError)},this.timeout);this.pendingCallbacks.set(operation,{resolve:resolve,reject:reject,timer:timer,retries:0}),this.logger.debug(`Callback setup for operation '${operation}' with timeout ${this.timeout}ms`)})}clearCallback(operation){const callback=this.pendingCallbacks.get(operation);callback&&(callback.timer&&clearTimeout(callback.timer),this.pendingCallbacks.delete(operation),this.logger.debug(`Cleared callback for operation '${operation}'`))}clearAllCallbacks(){this.pendingCallbacks.forEach(callback=>{callback.timer&&clearTimeout(callback.timer)}),this.pendingCallbacks.clear(),this.logger.debug("Cleared all pending callbacks")}sendMessage(methodName,parameter){if(!this.isUnityAvailable())throw new SDKError(exports.OperationErrorCode.UNITY_NOT_INITIALIZED,"Unity实例未初始化");try{this.logger.warn(`[ Sending message ]: ${this.targetObjectName}.${methodName}`,parameter);const paramString=parameter?JSON.stringify(parameter):"";this.unityInstance.SendMessage(this.targetObjectName,methodName,paramString)}catch(error){const serviceError=new SDKError(exports.OperationErrorCode.OPERATION_FAILED,`Failed to send Unity message: ${methodName}`,error);throw this.logger.error(`Failed to send Unity message: ${methodName}`,serviceError),serviceError}}sendAsyncMessage(methodName,operation,parameter){return __awaiter(this,void 0,void 0,function*(){if(!this.isUnityAvailable())throw new SDKError(exports.OperationErrorCode.UNITY_NOT_INITIALIZED,"Unity实例未初始化");try{const callbackPromise=this.setupCallback(operation),fullParameter=Object.assign(Object.assign({},parameter),{callbackFun:this.uniqueCallbackName,operationType:operation});return this.sendMessage(methodName,fullParameter),yield callbackPromise}catch(error){if(this.clearCallback(operation),this.maxRetries>0&&error instanceof SDKError&&error.code===exports.OperationErrorCode.OPERATION_TIMEOUT)return yield this.retryOperation(operation,methodName,parameter);throw error}})}destroy(){this.clearAllCallbacks(),window[this.uniqueCallbackName]&&(delete window[this.uniqueCallbackName],this.logger.debug(`Global callback unregistered: ${this.uniqueCallbackName}`)),this.logger.info("Unity service destroyed")}isUnityAvailable(){return null!==this.unityInstance&&"function"==typeof this.unityInstance.SendMessage}getPendingCallbackCount(){return this.pendingCallbacks.size}initializeGlobalCallback(){window[this.uniqueCallbackName]=(operation,code,message,data)=>{this.handleCallback(operation,code,message,data)},this.logger.warn(`Global callback registered: ${this.uniqueCallbackName}`)}retryOperation(operation,methodName,parameter){return __awaiter(this,void 0,void 0,function*(){let lastError=null;for(let attempt=0;attempt<=this.maxRetries;attempt++)try{return attempt>0&&(this.logger.debug(`Retrying operation '${operation}', attempt ${attempt}/${this.maxRetries}`),yield new Promise(resolve=>setTimeout(resolve,1e3*Math.pow(2,attempt)))),yield this.sendAsyncMessage(methodName,operation,parameter)}catch(error){if(lastError=error,this.logger.warn(`Operation '${operation}' failed, attempt ${attempt+1}/${this.maxRetries+1}`,error),error instanceof SDKError&&error.code===exports.OperationErrorCode.OPERATION_TIMEOUT&&attempt<this.maxRetries)continue;if(!(error instanceof SDKError&&error.code===exports.OperationErrorCode.OPERATION_TIMEOUT)||attempt>=this.maxRetries)throw error}throw lastError||new SDKError(exports.OperationErrorCode.OPERATION_TIMEOUT,`All retry attempts failed for operation: ${operation}`)})}}var AvatarOperationType,AvatarCameraType;exports.AvatarOperationType=void 0,(AvatarOperationType=exports.AvatarOperationType||(exports.AvatarOperationType={})).INITIALIZE_AVATAR="initializeAvatar",AvatarOperationType.PLAY_MOTION="playMotion",AvatarOperationType.GET_CURRENT_MOTION="getCurrentMotion",AvatarOperationType.UNLOAD_AVATAR="unloadAvatar",AvatarOperationType.SET_CAMERA="setCamera",exports.AvatarCameraType=void 0,(AvatarCameraType=exports.AvatarCameraType||(exports.AvatarCameraType={})).WHOLE="whole",AvatarCameraType.HALF="half",AvatarCameraType.FACE="face";class AvatarService extends UnityBaseService{get callbackFunctionName(){return"uniAvatarCallback"}constructor(config){super(config),this.logger.info("Avatar API service initialized")}initializeAvatar(avatarCode_1){return __awaiter(this,arguments,void 0,function*(avatarCode,cameraType=exports.AvatarCameraType.WHOLE){this.logger.info(`Initializing avatar: ${avatarCode} with camera type: ${cameraType}`);try{const result=yield this.sendAsyncMessage("InitializeAvatar",exports.AvatarOperationType.INITIALIZE_AVATAR,{avatarCode:avatarCode,cameraType:cameraType});return this.logger.info("Avatar initialization "+(result.success?"succeeded":"failed")),result}catch(error){throw this.logger.error("Failed to initialize avatar",error),error}})}handleCallback(operation,code,message,data){super.handleCallback(operation,code,message,data)}playMotion(clipCode){return __awaiter(this,void 0,void 0,function*(){this.logger.info(`Playing motion: ${clipCode}`);try{const result=yield this.sendAsyncMessage("PlayMotion",exports.AvatarOperationType.PLAY_MOTION,{clipCode:clipCode});return this.logger.info("Motion play "+(result.success?"succeeded":"failed")),result}catch(error){throw this.logger.error("Failed to play motion",error),error}})}getCurrentMotion(getRemainingTime){return __awaiter(this,void 0,void 0,function*(){var _a,_b;this.logger.info(`Getting current motion info, includeRemainingTime: ${getRemainingTime}`);try{const result=yield this.sendAsyncMessage("GetCurrentMotion",exports.AvatarOperationType.GET_CURRENT_MOTION,{getRemainingTime:getRemainingTime});return this.logger.info("Current motion info retrieved",{motionId:null===(_a=result.data)||void 0===_a?void 0:_a.motionId,remainingTime:null===(_b=result.data)||void 0===_b?void 0:_b.motionRemainingTime}),result}catch(error){throw this.logger.error("Failed to get current motion info",error),error}})}unloadAvatar(){return __awaiter(this,void 0,void 0,function*(){this.logger.info("Unloading avatar");try{const result=yield this.sendAsyncMessage("UnloadAvatar",exports.AvatarOperationType.UNLOAD_AVATAR);return this.logger.info("Avatar unload "+(result.success?"succeeded":"failed")),result}catch(error){throw this.logger.error("Failed to unload avatar",error),error}})}setCamera(cameraType){return __awaiter(this,void 0,void 0,function*(){this.logger.info(`Setting camera type: ${cameraType}`);try{const result=yield this.sendAsyncMessage("SetCamera",exports.AvatarOperationType.SET_CAMERA,{cameraType:cameraType});return this.logger.info("Camera type setting "+(result.success?"succeeded":"failed")),result}catch(error){throw this.logger.error("Failed to set camera type",error),error}})}batchExecute(operations){return __awaiter(this,void 0,void 0,function*(){this.logger.info(`Executing batch operations: ${operations.length} items`);const results=[];for(const operation of operations)try{const method=this[operation.method],result=yield method.apply(this,operation.params);results.push(result)}catch(error){this.logger.error(`Batch operation failed: ${operation.method}`,error),results.push({success:!1,message:`Batch operation failed: ${error.message}`,errorCode:1})}return this.logger.info(`Batch operations completed: ${results.filter(r=>r.success).length}/${results.length} successful`),results})}}const ENV_MAP={dev:{apiBaseUrl:"https://dev.local.zeewain.com"},test:{apiBaseUrl:"https://test.local.zeewain.com"},prod:{apiBaseUrl:"https://ai.zeewain3d.com"}};class ConfigManager{constructor(){this.config=null}static getInstance(){return ConfigManager.instance||(ConfigManager.instance=new ConfigManager),ConfigManager.instance}setConfig(config){this.config=Object.assign(Object.assign({},config),{env:config.env||"prod",containerId:config.containerId||"unity-container"})}updateConfig(config){this.config&&(this.config=Object.assign(Object.assign({},this.config),config))}getConfig(){return this.config}getApiBaseUrl(withApiModule=!0){var _a,_b,_c,_d;return"custom"===(null===(_a=this.config)||void 0===_a?void 0:_a.env)&&(null===(_b=this.config)||void 0===_b?void 0:_b.apiUrl)?`${this.config.apiUrl}${withApiModule?"/api":""}`:(null===(_d=function getEnvConfig(env="dev",withApiModule=!0){const baseUrl=ENV_MAP[env];return baseUrl?{apiBaseUrl:`${baseUrl.apiBaseUrl}${withApiModule?"/api":""}`}:null}((null===(_c=this.config)||void 0===_c?void 0:_c.env)||"prod",withApiModule))||void 0===_d?void 0:_d.apiBaseUrl)||""}reset(){this.config=null}}ConfigManager.instance=null;class UnityLoader{constructor(){this.config=ConfigManager.getInstance().getConfig()}init(){return __awaiter(this,void 0,void 0,function*(){const container=this.createContainer();return yield this.loadUnityLoader(),yield this.createUnityInstance(container)})}createContainer(){const container=document.getElementById(this.config.containerId);if(!container)throw new TypeError(`Avatar container element with ID "${this.config.containerId}" not found`);if(!(container instanceof HTMLDivElement))throw new TypeError("Avatar container element must be a div element");return container.style.position="relative",container}loadUnityLoader(){return new Promise((resolve,reject)=>{if(window.createUnityInstance)return resolve();const script=document.createElement("script");script.src=this.config.loaderUrl,script.async=!0,script.crossOrigin="anonymous",script.onload=()=>{"function"==typeof window.createUnityInstance?resolve():reject(new Error("createUnityInstance function not found"))},script.onerror=error=>{reject(new Error(`Failed to load UnityLoader: ${error}`))},document.head.appendChild(script)})}createUnityInstance(container){return __awaiter(this,void 0,void 0,function*(){let canvas=container.querySelector("#unity-canvas");if(canvas||(canvas=document.createElement("canvas"),canvas.id="unity-canvas",canvas.style.width="100%",canvas.style.height="100%",container.appendChild(canvas)),/iPhone|iPad|iPod|Android/i.test(navigator.userAgent)){const meta=document.createElement("meta");meta.name="viewport",meta.content="width=device-width, height=device-height, initial-scale=1.0, user-scalable=no, shrink-to-fit=yes",document.head.appendChild(meta),canvas.style.width="100%",canvas.style.height="100%",canvas.style.position="fixed"}if("function"==typeof window.createUnityInstance){return yield window.createUnityInstance(canvas,{dataUrl:this.config.dataUrl,frameworkUrl:this.config.frameworkUrl,codeUrl:this.config.codeUrl,companyName:"广州紫为云科技有限公司",productName:"数字人SDK",productVersion:"1.0"},progress=>{this.config.onProgress&&this.config.onProgress(progress)})}throw new TypeError("createUnityInstance is not defined on window.")})}}function getLines(onLine){let buffer,position,fieldLength,discardTrailingNewline=!1;return function onChunk(arr){void 0===buffer?(buffer=arr,position=0,fieldLength=-1):buffer=function concat(a,b){const res=new Uint8Array(a.length+b.length);return res.set(a),res.set(b,a.length),res}(buffer,arr);const bufLength=buffer.length;let lineStart=0;for(;position<bufLength;){discardTrailingNewline&&(10===buffer[position]&&(lineStart=++position),discardTrailingNewline=!1);let lineEnd=-1;for(;position<bufLength&&-1===lineEnd;++position)switch(buffer[position]){case 58:-1===fieldLength&&(fieldLength=position-lineStart);break;case 13:discardTrailingNewline=!0;case 10:lineEnd=position}if(-1===lineEnd)break;onLine(buffer.subarray(lineStart,lineEnd),fieldLength),lineStart=position,fieldLength=-1}lineStart===bufLength?buffer=void 0:0!==lineStart&&(buffer=buffer.subarray(lineStart),position-=lineStart)}}var __rest=function(s,e){var t={};for(var p in s)Object.prototype.hasOwnProperty.call(s,p)&&e.indexOf(p)<0&&(t[p]=s[p]);if(null!=s&&"function"==typeof Object.getOwnPropertySymbols){var i=0;for(p=Object.getOwnPropertySymbols(s);i<p.length;i++)e.indexOf(p[i])<0&&Object.prototype.propertyIsEnumerable.call(s,p[i])&&(t[p[i]]=s[p[i]])}return t};function fetchEventSource(input,_a){var{signal:inputSignal,headers:inputHeaders,onopen:inputOnOpen,onmessage:onmessage,onclose:onclose,onerror:onerror,openWhenHidden:openWhenHidden,fetch:inputFetch}=_a,rest=__rest(_a,["signal","headers","onopen","onmessage","onclose","onerror","openWhenHidden","fetch"]);return new Promise((resolve,reject)=>{const headers=Object.assign({},inputHeaders);let curRequestController;function onVisibilityChange(){curRequestController.abort(),document.hidden||create()}headers.accept||(headers.accept="text/event-stream"),openWhenHidden||document.addEventListener("visibilitychange",onVisibilityChange);let retryInterval=1e3,retryTimer=0;function dispose(){document.removeEventListener("visibilitychange",onVisibilityChange),window.clearTimeout(retryTimer),curRequestController.abort()}null==inputSignal||inputSignal.addEventListener("abort",()=>{dispose(),resolve()});const fetch=null!=inputFetch?inputFetch:window.fetch,onopen=null!=inputOnOpen?inputOnOpen:defaultOnOpen;async function create(){var _a;curRequestController=new AbortController;try{const response=await fetch(input,Object.assign(Object.assign({},rest),{headers:headers,signal:curRequestController.signal}));await onopen(response),await async function getBytes(stream,onChunk){const reader=stream.getReader();let result;for(;!(result=await reader.read()).done;)onChunk(result.value)}(response.body,getLines(function getMessages(onId,onRetry,onMessage){let message={data:"",event:"",id:"",retry:void 0};const decoder=new TextDecoder;return function onLine(line,fieldLength){if(0===line.length)null==onMessage||onMessage(message),message={data:"",event:"",id:"",retry:void 0};else if(fieldLength>0){const field=decoder.decode(line.subarray(0,fieldLength)),valueOffset=fieldLength+(32===line[fieldLength+1]?2:1),value=decoder.decode(line.subarray(valueOffset));switch(field){case"data":message.data=message.data?message.data+"\n"+value:value;break;case"event":message.event=value;break;case"id":onId(message.id=value);break;case"retry":const retry=parseInt(value,10);isNaN(retry)||onRetry(message.retry=retry)}}}}(id=>{id?headers["last-event-id"]=id:delete headers["last-event-id"]},retry=>{retryInterval=retry},onmessage))),null==onclose||onclose(),dispose(),resolve()}catch(err){if(!curRequestController.signal.aborted)try{const interval=null!==(_a=null==onerror?void 0:onerror(err))&&void 0!==_a?_a:retryInterval;window.clearTimeout(retryTimer),retryTimer=window.setTimeout(create,interval)}catch(innerErr){dispose(),reject(innerErr)}}}create()})}function defaultOnOpen(response){const contentType=response.headers.get("content-type");if(!(null==contentType?void 0:contentType.startsWith("text/event-stream")))throw new Error(`Expected content-type to be text/event-stream, Actual: ${contentType}`)}var BroadcastOperationType,BroadcastType,BroadcastTaskStatus;exports.BroadcastOperationType=void 0,(BroadcastOperationType=exports.BroadcastOperationType||(exports.BroadcastOperationType={})).START_BROADCAST="startBroadcast",BroadcastOperationType.PAUSE_BROADCAST="pauseBroadcast",BroadcastOperationType.RESUME_BROADCAST="resumeBroadcast",BroadcastOperationType.STOP_BROADCAST="stopBroadcast",BroadcastOperationType.APPEND_BROADCAST="appendBroadcast",exports.BroadcastType=void 0,(BroadcastType=exports.BroadcastType||(exports.BroadcastType={})).TEXT="text",BroadcastType.AUDIO="audio",function(BroadcastTaskStatus){BroadcastTaskStatus.PENDING="pending",BroadcastTaskStatus.REQUESTING="requesting",BroadcastTaskStatus.COMPLETED="completed",BroadcastTaskStatus.FAILED="failed",BroadcastTaskStatus.CANCELLED="cancelled"}(BroadcastTaskStatus||(BroadcastTaskStatus={}));class BroadcastService extends UnityBaseService{constructor(config){super(config),this.callbacks={},this.taskQueue=[],this.taskSequence=0,this.currentSendingSequence=0,this.isBroadcastingAudio=!1,this.hasReceivedAudio=!1,this.queueProcessTimer=null,this.broadcastCompletedCount=0,this.callbacks=config.callbacks||{},this.logger.info("Broadcast service initialized",{config:config})}handleCallback(operation,code,message,data){var _a,_b,_c,_d,_e,_f,_g,_h,_j,_k,_l;const{isBroadcastCompleted:isBroadcastCompleted}=JSON.parse(data||"{}");if(super.handleCallback(operation,code,message,data),0===code)switch(operation){case exports.BroadcastOperationType.START_BROADCAST:if(isBroadcastCompleted){this.broadcastCompletedCount++;const status=this.getStatus();0===(null===(_a=status.queueInfo)||void 0===_a?void 0:_a.pendingTasks)&&0===(null===(_b=status.queueInfo)||void 0===_b?void 0:_b.requestingTasks)&&(null===(_c=status.queueInfo)||void 0===_c?void 0:_c.completedTasks)===this.broadcastCompletedCount&&(this.isBroadcastingAudio=!1,this.hasReceivedAudio=!1,this.currentSendingSequence=0,this.cleanupCompletedTasks(),this.logger.warn("Broadcast all completed")),null===(_e=(_d=this.callbacks).onFinish)||void 0===_e||_e.call(_d)}break;case exports.BroadcastOperationType.PAUSE_BROADCAST:null===(_g=(_f=this.callbacks).onPause)||void 0===_g||_g.call(_f),this.logger.debug("Broadcast paused callback triggered");break;case exports.BroadcastOperationType.RESUME_BROADCAST:null===(_j=(_h=this.callbacks).onResume)||void 0===_j||_j.call(_h),this.logger.debug("Broadcast resumed callback triggered");break;case exports.BroadcastOperationType.STOP_BROADCAST:null===(_l=(_k=this.callbacks).onStop)||void 0===_l||_l.call(_k),this.logger.debug("Broadcast stopped callback triggered")}else{const error=SDKError.createFromUnityError(code,`Unity operation '${operation}' failed: ${message}`);this.handleError(error)}}startBroadcast(params,isAppend){return __awaiter(this,void 0,void 0,function*(){var _a,_b;this.logger.info(`Starting broadcast: ${params.type}`,{humanCode:params.humanCode,text:params.text,audioUrl:params.audioUrl,isAppend:isAppend,queueLength:this.taskQueue.length}),this.validateBroadcastParams(params),isAppend||(yield this.stopBroadcast(),this.taskSequence=0,this.currentSendingSequence=0,this.sendMessage("StartBroadcast",{callbackFun:this.uniqueCallbackName,operationType:exports.BroadcastOperationType.START_BROADCAST,motionList:params.motionList,motionPlayMode:params.motionPlayMode}),null===(_b=(_a=this.callbacks).onStart)||void 0===_b||_b.call(_a),this.isBroadcastingAudio=!0);const task=this.createBroadcastTask(params);this.addTaskToQueue(task),this.logger.debug("Broadcast task created and queued",{taskId:task.id,sequence:task.sequence,isAppend:isAppend})})}pauseBroadcast(resetIdle){return __awaiter(this,void 0,void 0,function*(){this.logger.info("Pausing broadcast");try{yield this.sendAsyncMessage("PauseBroadcast",exports.BroadcastOperationType.PAUSE_BROADCAST,{resetIdle:resetIdle}),this.logger.info("Broadcast paused successfully")}catch(error){throw this.logger.error("Failed to pause broadcast",error),error}})}resumeBroadcast(){return __awaiter(this,void 0,void 0,function*(){this.logger.info("Resuming broadcast");try{yield this.sendAsyncMessage("ResumeBroadcast",exports.BroadcastOperationType.RESUME_BROADCAST,{}),this.logger.info("Broadcast resumed successfully")}catch(error){throw this.logger.error("Failed to resume broadcast",error),error}})}stopBroadcast(){return __awaiter(this,void 0,void 0,function*(){this.logger.info("Stopping broadcast and clearing queue",{queueLength:this.taskQueue.length}),this.cancelAllTasks(),yield new Promise(resolve=>setTimeout(resolve,100)),this.isBroadcastingAudio=!1,this.hasReceivedAudio=!1,this.broadcastCompletedCount=0;try{yield this.sendAsyncMessage("StopBroadcast",exports.BroadcastOperationType.STOP_BROADCAST,{}),this.logger.info("Broadcast stopped successfully")}catch(error){throw this.logger.error("Failed to stop broadcast",error),error}})}updateCallbacks(callbacks){this.callbacks=Object.assign(Object.assign({},this.callbacks),callbacks),this.logger.debug("Broadcast callbacks updated")}getStatus(){const pendingTasks=this.taskQueue.filter(t=>t.status===BroadcastTaskStatus.PENDING).length,requestingTasks=this.taskQueue.filter(t=>t.status===BroadcastTaskStatus.REQUESTING).length,completedTasks=this.taskQueue.filter(t=>t.status===BroadcastTaskStatus.COMPLETED).length,failedTasks=this.taskQueue.filter(t=>t.status===BroadcastTaskStatus.FAILED).length,totalPendingResponses=this.taskQueue.reduce((sum,t)=>sum+t.pendingResponses.length,0),currentSendingSequence=this.currentSendingSequence,isGeneratingAudio=pendingTasks+requestingTasks>0;return{isActive:this.isBroadcastingAudio||isGeneratingAudio,isGeneratingAudio:isGeneratingAudio,hasReceivedAudio:this.hasReceivedAudio,queueInfo:{totalTasks:this.taskQueue.length,pendingTasks:pendingTasks,requestingTasks:requestingTasks,completedTasks:completedTasks,failedTasks:failedTasks,totalPendingResponses:totalPendingResponses,currentSendingSequence:currentSendingSequence}}}destroy(){this.clearQueueProcessTimer(),this.cancelAllTasks(),super.destroy(),this.logger.info("Broadcast service destroyed")}createBroadcastTask(params){const task={id:`[${params.type===exports.BroadcastType.TEXT?"TEXT":"AUDIO"}]-(${params.type===exports.BroadcastType.TEXT?params.text:params.audioUrl})_${Math.random().toString(36).substring(2,9)}`,sequence:++this.taskSequence,params:params,status:BroadcastTaskStatus.PENDING,controller:new AbortController,pendingResponses:[],isGenerationComplete:!1,createdAt:new Date};return this.logger.debug("Created broadcast task",{taskId:task.id,sequence:task.sequence}),task}addTaskToQueue(task){this.taskQueue.push(task),this.logger.debug("Task added to queue",{taskId:task.id,params:task.params,queueLength:this.taskQueue.length});this.taskQueue.some(t=>t.status===BroadcastTaskStatus.REQUESTING)?this.logger.debug("Task queued, waiting for previous task to complete",{taskId:task.id,pendingTasks:this.taskQueue.filter(t=>t.status===BroadcastTaskStatus.PENDING).length}):this.startTaskRequest(task),this.processTaskQueue()}processTaskQueue(){this.queueProcessTimer||(this.queueProcessTimer=setInterval(()=>{this.processTaskQueueStep()},100)),this.processTaskQueueStep()}processTaskQueueStep(){const nextTask=this.taskQueue.find(task=>task.sequence===this.currentSendingSequence+1&&task.status!==BroadcastTaskStatus.PENDING&&task.pendingResponses.length>0);nextTask?this.sendNextResponse(nextTask):this.logger.debug("No next task to process",{currentSendingSequence:this.currentSendingSequence,taskQueue:this.taskQueue});0===this.taskQueue.filter(task=>task.status===BroadcastTaskStatus.PENDING||task.status===BroadcastTaskStatus.REQUESTING).length&&this.clearQueueProcessTimer()}startTaskRequest(task){return __awaiter(this,void 0,void 0,function*(){var _a;task.status=BroadcastTaskStatus.REQUESTING,this.logger.debug("Starting task request",{taskId:task.id});try{const apiUrl=`${ConfigManager.getInstance().getApiBaseUrl(!0)}${this.getBroadcastApiPath(task.params.type)}`,requestBody={humanCode:task.params.humanCode,speed:task.params.speed,volume:task.params.volume>=0?100*task.params.volume:void 0,isSubtitle:task.params.isSubtitle,audioDrivenVersion:ConfigManager.getInstance().getConfig().audioDrivenVersion};task.params.type===exports.BroadcastType.TEXT?(requestBody.text=task.params.text,requestBody.voiceCode=task.params.voiceCode):task.params.type===exports.BroadcastType.AUDIO&&(requestBody.text=task.params.text,requestBody.audioUrl=task.params.audioUrl),fetchEventSource(apiUrl,{method:"POST",headers:{"Content-Type":"application/json",x_auth_token:(null===(_a=ConfigManager.getInstance().getConfig())||void 0===_a?void 0:_a.token)||""},body:JSON.stringify(requestBody),signal:task.controller.signal,openWhenHidden:!0,onopen:response=>__awaiter(this,void 0,void 0,function*(){if(!response.ok){const error=this.createHttpError(response.status,response.statusText,task.id);throw this.handleTaskError(task,error),error}}),onmessage:event=>{this.handleTaskResponse(task,event.data)},onclose:()=>{this.handleTaskClose(task)},onerror:error=>{if(error instanceof SDKError)throw error;this.logger.error("broadcast onerror",error);const sdkError=this.convertToSDKError(error,task.id);throw this.handleTaskError(task,sdkError),sdkError}})}catch(error){const sdkError=this.convertToSDKError(error,task.id);this.handleTaskError(task,sdkError)}})}handleTaskResponse(task,data){try{const response=JSON.parse(data);if(0!==response.code){const error=this.createBroadcastError(response.code,response.message);return void this.handleTaskError(task,error)}if(response.data){this.hasReceivedAudio=!0,task.params.type===exports.BroadcastType.AUDIO&&task.params.audioUrl&&!response.data.voiceUrl&&(response.data.voiceUrl=task.params.audioUrl);const{voiceUrl:voiceUrl,mouthShapeUrl:mouthShapeUrl}=response.data;voiceUrl&&!voiceUrl.startsWith("http")&&(response.data.voiceUrl=`${ConfigManager.getInstance().getApiBaseUrl(!1)}${voiceUrl}`),mouthShapeUrl&&!mouthShapeUrl.startsWith("http")&&(response.data.mouthShapeUrl=`${ConfigManager.getInstance().getApiBaseUrl(!1)}${mouthShapeUrl}`),task.pendingResponses.push(response),this.logger.debug("Response added to task",{taskId:task.id,response:response,pendingCount:task.pendingResponses.length}),response.data.done&&(task.isGenerationComplete=!0,this.logger.debug("Task generation completed",{taskId:task.id,totalResponses:task.pendingResponses.length}))}}catch(error){this.handleTaskError(task,new SDKError(exports.OperationErrorCode.OPERATION_FAILED,"string"==typeof error?error:error.message||"播报服务错误"))}}sendNextResponse(task){var _a;if(0===task.pendingResponses.length)return;const response=task.pendingResponses.shift();this.logger.debug("Sending response to Unity",{taskId:task.id,remainingResponses:task.pendingResponses.length,voiceUrl:null===(_a=response.data)||void 0===_a?void 0:_a.voiceUrl}),this.sendMessage("AppendBroadcast",{response:response,callbackFun:this.uniqueCallbackName,operationType:exports.BroadcastOperationType.APPEND_BROADCAST}),task.isGenerationComplete&&0===task.pendingResponses.length&&(task.status=BroadcastTaskStatus.COMPLETED,this.currentSendingSequence=task.sequence,this.logger.debug("Task completed",{taskId:task.id}))}handleTaskClose(task){return __awaiter(this,void 0,void 0,function*(){this.logger.debug("Task stream closed",{taskId:task.id}),task.status!==BroadcastTaskStatus.FAILED&&task.status!==BroadcastTaskStatus.CANCELLED&&(task.isGenerationComplete||task.status!==BroadcastTaskStatus.REQUESTING||(task.isGenerationComplete=!0),this.startNextPendingTask())})}handleTaskError(task,error){var _a,_b;task.status!==BroadcastTaskStatus.FAILED&&task.status!==BroadcastTaskStatus.CANCELLED&&(task.status=BroadcastTaskStatus.FAILED,task.error=error,this.logger.error(`Task failed - ${task.id}`,error),null===(_b=(_a=this.callbacks).onError)||void 0===_b||_b.call(_a,error),this.cancelAllTasks(),this.isBroadcastingAudio=!1,this.hasReceivedAudio=!1,this.currentSendingSequence=0,this.clearQueueProcessTimer(),this.logger.debug("Task failed, all tasks cancelled and broadcast state reset"))}cleanupCompletedTasks(){const beforeLength=this.taskQueue.length;this.taskQueue=this.taskQueue.filter(task=>task.status!==BroadcastTaskStatus.COMPLETED&&task.status!==BroadcastTaskStatus.FAILED&&task.status!==BroadcastTaskStatus.CANCELLED);const removedCount=beforeLength-this.taskQueue.length;removedCount>0&&this.logger.debug("Cleaned up completed tasks",{removedCount:removedCount,remainingTasks:this.taskQueue.length})}cancelAllTasks(){for(const task of this.taskQueue)task.status===BroadcastTaskStatus.REQUESTING?(task.controller.abort(),task.status=BroadcastTaskStatus.CANCELLED,this.logger.debug("Task aborted",{taskId:task.id,previousStatus:"requesting"})):task.status===BroadcastTaskStatus.PENDING&&(task.status=BroadcastTaskStatus.CANCELLED,this.logger.debug("Task cancelled",{taskId:task.id,previousStatus:"pending"}));this.taskQueue=[],this.taskSequence=0,this.currentSendingSequence=0,this.logger.debug("All tasks cancelled and queue cleared")}get callbackFunctionName(){return"uniBroadcastCallback"}getBroadcastApiPath(type){switch(type){case exports.BroadcastType.TEXT:return"/aiep-openapi/avatar-interaction/v1/broadcast/text";case exports.BroadcastType.AUDIO:return"/aiep-openapi/avatar-interaction/v1/broadcast/audio";default:throw new SDKError(exports.ConfigErrorCode.INVALID_CONFIG,`未知的播报类型: ${type}`)}}validateBroadcastParams(params){if(params.type===exports.BroadcastType.TEXT){if(!params.text||!params.voiceCode)throw new SDKError(exports.ConfigErrorCode.MISSING_REQUIRED_PARAM,"文本播报需要提供text和voiceCode参数")}else if(params.type===exports.BroadcastType.AUDIO&&!params.audioUrl)throw new SDKError(exports.ConfigErrorCode.MISSING_REQUIRED_PARAM,"自定义音频播报需要提供audioUrl参数")}handleError(error){var _a,_b;this.logger.error("Broadcast error occurred",error),null===(_b=(_a=this.callbacks).onError)||void 0===_b||_b.call(_a,error)}createBroadcastError(errorCode,errorMessage){switch(errorCode){case 14001:return new SDKError(exports.OperationErrorCode.BROADCAST_EQUITY_NOT_EXIST,"用户权益额度不存在");case 14002:return new SDKError(exports.OperationErrorCode.BROADCAST_EQUITY_NOT_ENOUGH,"用户权益额度不足");case 14003:return new SDKError(exports.OperationErrorCode.BROADCAST_EQUITY_FREEZE_FAILED,"用户权益额度冻结失败");default:return new SDKError(exports.OperationErrorCode.OPERATION_FAILED,`${errorMessage}(${errorCode})`||`播报服务错误(${errorCode})`)}}startNextPendingTask(){const nextPendingTask=this.taskQueue.filter(t=>t.status===BroadcastTaskStatus.PENDING).sort((a,b)=>a.sequence-b.sequence)[0];nextPendingTask?(this.logger.debug("Starting next pending task",{taskId:nextPendingTask.id,sequence:nextPendingTask.sequence}),this.startTaskRequest(nextPendingTask)):this.logger.debug("No pending tasks to start")}clearQueueProcessTimer(){this.queueProcessTimer&&(clearInterval(this.queueProcessTimer),this.queueProcessTimer=null,this.logger.debug("Queue process timer cleared"))}createHttpError(status,statusText,taskId){switch(this.logger.warn(`HTTP error occurred - Task: ${taskId}, Status: ${status}`,{status:status,statusText:statusText}),status){case 401:return new SDKError(exports.NetworkErrorCode.UNAUTHORIZED,`Token 已过期或无效,请重新授权 (HTTP ${status})`);case 403:return new SDKError(exports.NetworkErrorCode.UNAUTHORIZED,`无权限访问该资源 (HTTP ${status})`);case 404:return new SDKError(exports.NetworkErrorCode.SERVER_ERROR,`请求的资源不存在 (HTTP ${status})`);case 500:case 502:case 503:case 504:return new SDKError(exports.NetworkErrorCode.SERVER_ERROR,`服务器错误,请稍后重试 (HTTP ${status})`);default:return new SDKError(exports.NetworkErrorCode.CONNECTION_FAILED,`网络请求失败: ${statusText||"Unknown Error"} (HTTP ${status})`)}}convertToSDKError(error,taskId){if(error instanceof SDKError)return error;if(error instanceof Error){const errorMessage=error.message.toLowerCase();if(errorMessage.includes("timeout")||errorMessage.includes("timed out"))return new SDKError(exports.NetworkErrorCode.REQUEST_TIMEOUT,`请求超时 - Task: ${taskId}`,error);if(errorMessage.includes("network")||errorMessage.includes("fetch")||errorMessage.includes("connection")){const hint=errorMessage.includes("failed to fetch")?"(可能是 Token 过期或 CORS 跨域问题,请检查 Token 是否有效)":"";return new SDKError(exports.NetworkErrorCode.CONNECTION_FAILED,`网络请求失败 - Task: ${taskId}: ${error.message}${hint}`,error)}return errorMessage.includes("abort")||errorMessage.includes("cancel")?new SDKError(exports.OperationErrorCode.OPERATION_CANCELLED,`操作已取消 - Task: ${taskId}`,error):new SDKError(exports.OperationErrorCode.OPERATION_FAILED,`播报任务执行失败 - Task: ${taskId}: ${error.message}`,error)}const errorMessage=String(error);return new SDKError(exports.OperationErrorCode.OPERATION_FAILED,`播报任务执行失败 - Task: ${taskId}: ${errorMessage}`)}}class ZEEAvatarLoader{constructor(){this.apiService=null,this.unityInstance=null,this.loader=new UnityLoader}init(){return __awaiter(this,void 0,void 0,function*(){return this.unityInstance=yield this.loader.init(),this.initGlobalConfig(),this.apiService=new AvatarService({unityInstance:this.unityInstance}),this.apiService})}updateToken(token){const currentConfig=ConfigManager.getInstance().getConfig();currentConfig&&(ConfigManager.getInstance().setConfig(Object.assign(Object.assign({},currentConfig),{token:token})),this.initGlobalConfig())}getAPI(){return this.apiService}getInstance(){return this.unityInstance}getContainerId(){return ConfigManager.getInstance().getConfig().containerId}destroy(){if(this.unityInstance){const container=document.getElementById(this.getContainerId());if(container){const canvas=container.querySelector("#unity-canvas");canvas&&canvas.remove()}"function"==typeof this.unityInstance.Quit&&this.unityInstance.Quit(),this.unityInstance=null,this.apiService=null}ConfigManager.getInstance().reset()}initGlobalConfig(){const config=ConfigManager.getInstance().getConfig(),{assetsFrom:assetsFrom}=config,globalParams={token:null==config?void 0:config.token,apiBaseUrl:ConfigManager.getInstance().getApiBaseUrl(!1),idleMotionList:null==config?void 0:config.idleMotionList};if(this.unityInstance.SendMessage("AvatarSDK","InitializeConfig",JSON.stringify(globalParams)),console.warn("[ Send Unity message ]: AvatarSDK.InitializeConfig",globalParams),"cloud"!==assetsFrom){const assetModuleParams={isZip:!0,assetBundlePath:null==config?void 0:config.assetsUrl};this.unityInstance.SendMessage("AvatarSDK","InitAssetBundleModule",JSON.stringify(assetModuleParams)),console.warn("[ Send Unity message ]: AvatarSDK.InitAssetBundleModule",assetModuleParams)}}}exports.AvatarService=AvatarService,exports.BroadcastService=BroadcastService,exports.ERROR_CODE_MAP=ERROR_CODE_MAP,exports.SDKError=SDKError,exports.SDK_VERSION="2.2.1",exports.ZEEAvatarLoader=ZEEAvatarLoader,exports.ZEEAvatarSDK=class ZEEAvatarSDK{constructor(config){var _a;this.loader=null,this.avatarService=null,this.broadcastService=null,this.unityInstance=null,this.isInitialized=!1,this.instanceId=function generateUniqueId(){return`${Date.now()}_${Math.random().toString(36).substring(2,9)}`}(),ConfigManager.getInstance().setConfig(config),this.logger=new SimpleLogger(null===(_a=ConfigManager.getInstance().getConfig().enableDebugLog)||void 0===_a||_a),this.logger.info("SDK版本","2.2.1")}initializeAvatar(avatarCode_1){return __awaiter(this,arguments,void 0,function*(avatarCode,cameraType=exports.AvatarCameraType.WHOLE){var _a;if(this.isInitialized)throw new SDKError(exports.OperationErrorCode.OPERATION_FAILED,"SDK已经初始化,请勿重复初始化");try{const config=ConfigManager.getInstance().getConfig();this.loader=new ZEEAvatarLoader,yield this.loader.init(),this.unityInstance=this.loader.getInstance(),this.avatarService=new AvatarService({unityInstance:this.unityInstance,instanceId:this.instanceId,enableDebugLog:config.enableDebugLog,timeout:config.operationTimeout}),this.broadcastService=new BroadcastService({unityInstance:this.unityInstance,instanceId:this.instanceId,callbacks:config.broadcastCallbacks,enableDebugLog:config.enableDebugLog,timeout:config.operationTimeout});const result=yield this.avatarService.initializeAvatar(avatarCode,cameraType);if(result.success){const audioDrivenVersion=null===(_a=result.data)||void 0===_a?void 0:_a.audioDrivenVersion;if(config.audioDrivenVersion=audioDrivenVersion,this.logger.info("AudioDrivenVersion",audioDrivenVersion),audioDrivenVersion){if(!function compareVersionCompatibility(version1,version2){const getMajorMinor=version=>{const parts=version.split(".");return parts.length<2?version:`${parts[0]}.${parts[1]}`};return getMajorMinor(version1)===getMajorMinor(version2)}("2.2.1",audioDrivenVersion))throw this.destroy(),new SDKError(exports.ResourceErrorCode.VERSION_INCOMPATIBLE,`资源版本不兼容: SDK版本为 2.2.1,WebGL资源版本为 ${audioDrivenVersion},前两位版本号必须一致`);this.logger.info("版本兼容性检查通过",`SDK: 2.2.1, 资源: ${audioDrivenVersion}`)}this.isInitialized=!0}return result}catch(error){throw new SDKError(exports.OperationErrorCode.OPERATION_FAILED,`数字人初始化失败: ${error instanceof Error?error.message:String(error)}`)}})}updateToken(token){ConfigManager.getInstance().updateConfig({token:token}),this.loader&&this.loader.updateToken(token)}playMotion(clipCode){return __awaiter(this,void 0,void 0,function*(){return this.ensureInitialized(),yield this.avatarService.playMotion(clipCode)})}getCurrentMotion(){return __awaiter(this,arguments,void 0,function*(getRemainingTime=!1){return this.ensureInitialized(),yield this.avatarService.getCurrentMotion(getRemainingTime)})}unloadAvatar(){return __awaiter(this,void 0,void 0,function*(){this.ensureInitialized();try{const result=yield this.avatarService.unloadAvatar();return result.success&&(this.isInitialized=!1),result}catch(error){throw new SDKError(exports.OperationErrorCode.OPERATION_FAILED,`数字人卸载失败: ${error instanceof Error?error.message:String(error)}`)}})}setCamera(cameraType){return __awaiter(this,void 0,void 0,function*(){return this.ensureInitialized(),yield this.avatarService.setCamera(cameraType)})}startBroadcast(params,isAppend){return __awaiter(this,void 0,void 0,function*(){return this.ensureInitialized(),yield this.broadcastService.startBroadcast(params,isAppend)})}startStreamBroadcast(params,forceRestart){return __awaiter(this,void 0,void 0,function*(){this.ensureInitialized();const status=this.broadcastService.getStatus(),isAppend=status.isActive;return this.logger.debug("startStreamBroadcast",{isActive:status.isActive,isAppend:isAppend}),yield this.broadcastService.startBroadcast(params,!forceRestart&&isAppend)})}pauseBroadcast(resetIdle){return __awaiter(this,void 0,void 0,function*(){return this.ensureInitialized(),yield this.broadcastService.pauseBroadcast(resetIdle)})}resumeBroadcast(){return __awaiter(this,void 0,void 0,function*(){return this.ensureInitialized(),yield this.broadcastService.resumeBroadcast()})}stopBroadcast(){return __awaiter(this,void 0,void 0,function*(){return this.ensureInitialized(),yield this.broadcastService.stopBroadcast()})}updateBroadcastCallbacks(callbacks){this.ensureInitialized(),this.broadcastService.updateCallbacks(callbacks)}getBroadcastStatus(){return this.ensureInitialized(),this.broadcastService.getStatus()}destroy(){try{this.broadcastService&&(this.broadcastService.destroy(),this.broadcastService=null),this.avatarService&&(this.avatarService.destroy(),this.avatarService=null),this.loader&&(this.loader.destroy(),this.loader=null),this.unityInstance=null,this.isInitialized=!1}catch(error){console.error("SDK销毁过程中发生错误:",error)}}getInstanceId(){return this.instanceId}isSDKInitialized(){return this.isInitialized}isAvatarInitialized(){return this.isInitialized}getConfig(){const config=ConfigManager.getInstance().getConfig();return config?Object.assign({},config):null}ensureInitialized(){if(!this.isInitialized)throw new SDKError(exports.OperationErrorCode.UNITY_NOT_INITIALIZED,"Avatar尚未初始化,请先调用initializeAvatar()方法")}},exports.getErrorInfo=getErrorInfo});
|
|
1
|
+
!function(global,factory){"object"==typeof exports&&"undefined"!=typeof module?factory(exports):"function"==typeof define&&define.amd?define(["exports"],factory):factory((global="undefined"!=typeof globalThis?globalThis:global||self).ZEEAvatarSDKLib={})}(this,function(exports){"use strict";function __awaiter(thisArg,_arguments,P,generator){return new(P||(P=Promise))(function(resolve,reject){function fulfilled(value){try{step(generator.next(value))}catch(e){reject(e)}}function rejected(value){try{step(generator.throw(value))}catch(e){reject(e)}}function step(result){result.done?resolve(result.value):function adopt(value){return value instanceof P?value:new P(function(resolve){resolve(value)})}(result.value).then(fulfilled,rejected)}step((generator=generator.apply(thisArg,_arguments||[])).next())})}var ErrorCategory,NetworkErrorCode,OperationErrorCode,ResourceErrorCode,SystemErrorCode,ConfigErrorCode;"function"==typeof SuppressedError&&SuppressedError,exports.ErrorCategory=void 0,(ErrorCategory=exports.ErrorCategory||(exports.ErrorCategory={})).NETWORK="NETWORK",ErrorCategory.OPERATION="OPERATION",ErrorCategory.RESOURCE="RESOURCE",ErrorCategory.SYSTEM="SYSTEM",ErrorCategory.CONFIG="CONFIG",exports.NetworkErrorCode=void 0,(NetworkErrorCode=exports.NetworkErrorCode||(exports.NetworkErrorCode={}))[NetworkErrorCode.CONNECTION_FAILED=1001]="CONNECTION_FAILED",NetworkErrorCode[NetworkErrorCode.REQUEST_TIMEOUT=1002]="REQUEST_TIMEOUT",NetworkErrorCode[NetworkErrorCode.SERVER_ERROR=1003]="SERVER_ERROR",NetworkErrorCode[NetworkErrorCode.UNAUTHORIZED=1004]="UNAUTHORIZED",exports.OperationErrorCode=void 0,(OperationErrorCode=exports.OperationErrorCode||(exports.OperationErrorCode={}))[OperationErrorCode.UNITY_NOT_INITIALIZED=2001]="UNITY_NOT_INITIALIZED",OperationErrorCode[OperationErrorCode.AVATAR_NOT_LOADED=2002]="AVATAR_NOT_LOADED",OperationErrorCode[OperationErrorCode.OPERATION_FAILED=2003]="OPERATION_FAILED",OperationErrorCode[OperationErrorCode.OPERATION_TIMEOUT=2004]="OPERATION_TIMEOUT",OperationErrorCode[OperationErrorCode.OPERATION_CANCELLED=2005]="OPERATION_CANCELLED",OperationErrorCode[OperationErrorCode.BROADCAST_EQUITY_NOT_EXIST=2006]="BROADCAST_EQUITY_NOT_EXIST",OperationErrorCode[OperationErrorCode.BROADCAST_EQUITY_NOT_ENOUGH=2007]="BROADCAST_EQUITY_NOT_ENOUGH",OperationErrorCode[OperationErrorCode.BROADCAST_EQUITY_FREEZE_FAILED=2008]="BROADCAST_EQUITY_FREEZE_FAILED",exports.ResourceErrorCode=void 0,(ResourceErrorCode=exports.ResourceErrorCode||(exports.ResourceErrorCode={}))[ResourceErrorCode.LOAD_FAILED=3001]="LOAD_FAILED",ResourceErrorCode[ResourceErrorCode.FILE_CORRUPTED=3002]="FILE_CORRUPTED",ResourceErrorCode[ResourceErrorCode.NOT_FOUND=3003]="NOT_FOUND",ResourceErrorCode[ResourceErrorCode.UNSUPPORTED_FORMAT=3004]="UNSUPPORTED_FORMAT",ResourceErrorCode[ResourceErrorCode.VERSION_INCOMPATIBLE=3005]="VERSION_INCOMPATIBLE",exports.SystemErrorCode=void 0,(SystemErrorCode=exports.SystemErrorCode||(exports.SystemErrorCode={}))[SystemErrorCode.OUT_OF_MEMORY=4001]="OUT_OF_MEMORY",SystemErrorCode[SystemErrorCode.GPU_NOT_SUPPORTED=4002]="GPU_NOT_SUPPORTED",SystemErrorCode[SystemErrorCode.WEBGL_NOT_SUPPORTED=4003]="WEBGL_NOT_SUPPORTED",SystemErrorCode[SystemErrorCode.BROWSER_NOT_COMPATIBLE=4004]="BROWSER_NOT_COMPATIBLE",exports.ConfigErrorCode=void 0,(ConfigErrorCode=exports.ConfigErrorCode||(exports.ConfigErrorCode={}))[ConfigErrorCode.INVALID_CONFIG=5001]="INVALID_CONFIG",ConfigErrorCode[ConfigErrorCode.MISSING_REQUIRED_PARAM=5002]="MISSING_REQUIRED_PARAM",ConfigErrorCode[ConfigErrorCode.PARAM_OUT_OF_RANGE=5003]="PARAM_OUT_OF_RANGE",ConfigErrorCode[ConfigErrorCode.INVALID_JSON_FORMAT=5004]="INVALID_JSON_FORMAT";const ERROR_CODE_MAP={[exports.NetworkErrorCode.CONNECTION_FAILED]:{category:exports.ErrorCategory.NETWORK,message:"网络连接失败"},[exports.NetworkErrorCode.REQUEST_TIMEOUT]:{category:exports.ErrorCategory.NETWORK,message:"请求超时"},[exports.NetworkErrorCode.SERVER_ERROR]:{category:exports.ErrorCategory.NETWORK,message:"服务器错误"},[exports.NetworkErrorCode.UNAUTHORIZED]:{category:exports.ErrorCategory.NETWORK,message:"未授权访问"},[exports.OperationErrorCode.UNITY_NOT_INITIALIZED]:{category:exports.ErrorCategory.OPERATION,message:"Unity实例未初始化"},[exports.OperationErrorCode.AVATAR_NOT_LOADED]:{category:exports.ErrorCategory.OPERATION,message:"数字人未加载"},[exports.OperationErrorCode.OPERATION_FAILED]:{category:exports.ErrorCategory.OPERATION,message:"操作执行失败"},[exports.OperationErrorCode.OPERATION_TIMEOUT]:{category:exports.ErrorCategory.OPERATION,message:"操作超时"},[exports.OperationErrorCode.OPERATION_CANCELLED]:{category:exports.ErrorCategory.OPERATION,message:"操作被取消"},[exports.OperationErrorCode.BROADCAST_EQUITY_NOT_EXIST]:{category:exports.ErrorCategory.OPERATION,message:"用户权益额度不存在"},[exports.OperationErrorCode.BROADCAST_EQUITY_NOT_ENOUGH]:{category:exports.ErrorCategory.OPERATION,message:"用户权益额度不足"},[exports.OperationErrorCode.BROADCAST_EQUITY_FREEZE_FAILED]:{category:exports.ErrorCategory.OPERATION,message:"用户权益额度冻结失败"},[exports.ResourceErrorCode.LOAD_FAILED]:{category:exports.ErrorCategory.RESOURCE,message:"资源加载失败"},[exports.ResourceErrorCode.FILE_CORRUPTED]:{category:exports.ErrorCategory.RESOURCE,message:"资源文件损坏"},[exports.ResourceErrorCode.NOT_FOUND]:{category:exports.ErrorCategory.RESOURCE,message:"资源不存在"},[exports.ResourceErrorCode.UNSUPPORTED_FORMAT]:{category:exports.ErrorCategory.RESOURCE,message:"资源格式不支持"},[exports.ResourceErrorCode.VERSION_INCOMPATIBLE]:{category:exports.ErrorCategory.RESOURCE,message:"资源版本不兼容"},[exports.SystemErrorCode.OUT_OF_MEMORY]:{category:exports.ErrorCategory.SYSTEM,message:"内存不足"},[exports.SystemErrorCode.GPU_NOT_SUPPORTED]:{category:exports.ErrorCategory.SYSTEM,message:"GPU不支持"},[exports.SystemErrorCode.WEBGL_NOT_SUPPORTED]:{category:exports.ErrorCategory.SYSTEM,message:"WebGL不支持"},[exports.SystemErrorCode.BROWSER_NOT_COMPATIBLE]:{category:exports.ErrorCategory.SYSTEM,message:"浏览器不兼容"},[exports.ConfigErrorCode.INVALID_CONFIG]:{category:exports.ErrorCategory.CONFIG,message:"配置参数无效"},[exports.ConfigErrorCode.MISSING_REQUIRED_PARAM]:{category:exports.ErrorCategory.CONFIG,message:"必需参数缺失"},[exports.ConfigErrorCode.PARAM_OUT_OF_RANGE]:{category:exports.ErrorCategory.CONFIG,message:"参数值超出范围"},[exports.ConfigErrorCode.INVALID_JSON_FORMAT]:{category:exports.ErrorCategory.CONFIG,message:"JSON格式错误"}};function getErrorInfo(code){return ERROR_CODE_MAP[code]||{category:exports.ErrorCategory.SYSTEM,message:"未知错误"}}class SDKError extends Error{constructor(code,message,originalError){const errorInfo=getErrorInfo(code),finalMessage=message||errorInfo.message;super(finalMessage),this.name="SDKError",this.code=code,this.category=errorInfo.category,this.message=finalMessage,this.timestamp=Date.now(),originalError&&originalError.stack?this.stack=originalError.stack:Error.captureStackTrace&&Error.captureStackTrace(this,SDKError)}toJSON(){return{name:this.name,code:this.code,category:this.category,message:this.message,timestamp:this.timestamp}}static createNetworkError(code,message,originalError){return new SDKError(code,message,originalError)}static createOperationError(code,message,originalError){return new SDKError(code,message,originalError)}static createResourceError(code,message,originalError){return new SDKError(code,message,originalError)}static createSystemError(code,message,originalError){return new SDKError(code,message,originalError)}static createConfigError(code,message,originalError){return new SDKError(code,message,originalError)}static createFromUnityError(unityCode,message){switch(unityCode){case 100:return new SDKError(exports.ResourceErrorCode.LOAD_FAILED,message);case 200:return new SDKError(exports.NetworkErrorCode.CONNECTION_FAILED,message);case 300:case 700:return new SDKError(exports.ConfigErrorCode.INVALID_CONFIG,message);case 400:return new SDKError(exports.OperationErrorCode.OPERATION_FAILED,message);case 500:return new SDKError(exports.SystemErrorCode.OUT_OF_MEMORY,message);case 600:return new SDKError(exports.OperationErrorCode.OPERATION_CANCELLED,message);default:return new SDKError(3001,message||`Unity错误 (错误码: ${unityCode})`)}}}var LogLevel,UnityOperationStatus;!function(LogLevel){LogLevel.DEBUG="debug",LogLevel.INFO="info",LogLevel.WARN="warn",LogLevel.ERROR="error"}(LogLevel||(LogLevel={}));class SimpleLogger{constructor(enableDebug=!1){this.enableDebug=enableDebug}pad(num,len){let s=String(num);for(;s.length<len;)s=`0${s}`;return s}getTimestamp(){const now=new Date;return`[${this.pad(now.getHours(),2)}:${this.pad(now.getMinutes(),2)}:${this.pad(now.getSeconds(),2)}.${this.pad(now.getMilliseconds(),3).slice(0,2)}]`}debug(message,data){this.enableDebug&&console.debug(`[SDK DEBUG]${this.getTimestamp()} ${message}`,data)}info(message,data){console.info(`[SDK INFO]${this.getTimestamp()} ${message}`,data)}warn(message,data){console.warn(`[SDK WARN]${this.getTimestamp()} ${message}`,data)}error(message,error,data){console.error(`[SDK ERROR]${this.getTimestamp()} ${message}`,error,error instanceof SDKError?error.code:null,data)}}exports.UnityOperationStatus=void 0,(UnityOperationStatus=exports.UnityOperationStatus||(exports.UnityOperationStatus={}))[UnityOperationStatus.SUCCESS=0]="SUCCESS",UnityOperationStatus[UnityOperationStatus.FAILURE=1]="FAILURE",UnityOperationStatus[UnityOperationStatus.TIMEOUT=2]="TIMEOUT",UnityOperationStatus[UnityOperationStatus.CANCELLED=3]="CANCELLED";const DEFAULT_CONFIG={targetObjectName:"AvatarSDK",timeout:3e4,enableDebugLog:!1,maxRetries:0};class UnityBaseService{get uniqueCallbackName(){return`${this.callbackFunctionName}_${this.instanceId}`}constructor(config){this.pendingCallbacks=new Map;const finalConfig=Object.assign(Object.assign({},DEFAULT_CONFIG),config);this.unityInstance=finalConfig.unityInstance,this.targetObjectName=finalConfig.targetObjectName,this.timeout=finalConfig.timeout||DEFAULT_CONFIG.timeout,this.maxRetries=finalConfig.maxRetries,this.instanceId=finalConfig.instanceId||"default",this.logger=new SimpleLogger(finalConfig.enableDebugLog),this.initializeGlobalCallback(),this.logger.debug("Unity service initialized",{config:finalConfig})}handleCallback(operation,code,message,data){const dataObj=data?JSON.parse(data):void 0;this.logger.warn("[ Received Unity callback ]",{operation:operation,code:code,message:message,data:dataObj,originalData:data});const callback=this.pendingCallbacks.get(operation);if(!callback)return void this.logger.warn(`No pending callback for operation: ${operation}`);callback.timer&&clearTimeout(callback.timer);const response={success:code===exports.UnityOperationStatus.SUCCESS,message:message,errorCode:code,data:dataObj};try{if(code===exports.UnityOperationStatus.SUCCESS)callback.resolve(response),this.logger.debug(`Operation '${operation}' completed successfully`);else{const error=SDKError.createFromUnityError(code,`Unity operation '${operation}' failed: ${message}`);callback.reject(error),this.logger.error(`Operation '${operation}' failed`,error)}}catch(error){this.logger.error(`Error handling callback for operation '${operation}'`,error)}finally{this.pendingCallbacks.delete(operation)}}setupCallback(operation){return this.clearCallback(operation),new Promise((resolve,reject)=>{const timer=setTimeout(()=>{this.pendingCallbacks.delete(operation);const timeoutError=new SDKError(exports.OperationErrorCode.OPERATION_TIMEOUT,`Unity operation '${operation}' timed out after ${this.timeout}ms`);this.logger.error(`Operation '${operation}' timed out`,timeoutError),reject(timeoutError)},this.timeout);this.pendingCallbacks.set(operation,{resolve:resolve,reject:reject,timer:timer,retries:0}),this.logger.debug(`Callback setup for operation '${operation}' with timeout ${this.timeout}ms`)})}clearCallback(operation){const callback=this.pendingCallbacks.get(operation);callback&&(callback.timer&&clearTimeout(callback.timer),this.pendingCallbacks.delete(operation),this.logger.debug(`Cleared callback for operation '${operation}'`))}clearAllCallbacks(){this.pendingCallbacks.forEach(callback=>{callback.timer&&clearTimeout(callback.timer)}),this.pendingCallbacks.clear(),this.logger.debug("Cleared all pending callbacks")}sendMessage(methodName,parameter){if(!this.isUnityAvailable())throw new SDKError(exports.OperationErrorCode.UNITY_NOT_INITIALIZED,"Unity实例未初始化");try{this.logger.warn(`[ Sending message ]: ${this.targetObjectName}.${methodName}`,parameter);const paramString=parameter?JSON.stringify(parameter):"";this.unityInstance.SendMessage(this.targetObjectName,methodName,paramString)}catch(error){const serviceError=new SDKError(exports.OperationErrorCode.OPERATION_FAILED,`Failed to send Unity message: ${methodName}`,error);throw this.logger.error(`Failed to send Unity message: ${methodName}`,serviceError),serviceError}}sendAsyncMessage(methodName,operation,parameter){return __awaiter(this,void 0,void 0,function*(){if(!this.isUnityAvailable())throw new SDKError(exports.OperationErrorCode.UNITY_NOT_INITIALIZED,"Unity实例未初始化");try{const callbackPromise=this.setupCallback(operation),fullParameter=Object.assign(Object.assign({},parameter),{callbackFun:this.uniqueCallbackName,operationType:operation});return this.sendMessage(methodName,fullParameter),yield callbackPromise}catch(error){if(this.clearCallback(operation),this.maxRetries>0&&error instanceof SDKError&&error.code===exports.OperationErrorCode.OPERATION_TIMEOUT)return yield this.retryOperation(operation,methodName,parameter);throw error}})}destroy(){this.clearAllCallbacks(),window[this.uniqueCallbackName]&&(delete window[this.uniqueCallbackName],this.logger.debug(`Global callback unregistered: ${this.uniqueCallbackName}`)),this.logger.info("Unity service destroyed")}isUnityAvailable(){return null!==this.unityInstance&&"function"==typeof this.unityInstance.SendMessage}getPendingCallbackCount(){return this.pendingCallbacks.size}initializeGlobalCallback(){window[this.uniqueCallbackName]=(operation,code,message,data)=>{this.handleCallback(operation,code,message,data)},this.logger.warn(`Global callback registered: ${this.uniqueCallbackName}`)}retryOperation(operation,methodName,parameter){return __awaiter(this,void 0,void 0,function*(){let lastError=null;for(let attempt=0;attempt<=this.maxRetries;attempt++)try{return attempt>0&&(this.logger.debug(`Retrying operation '${operation}', attempt ${attempt}/${this.maxRetries}`),yield new Promise(resolve=>setTimeout(resolve,1e3*Math.pow(2,attempt)))),yield this.sendAsyncMessage(methodName,operation,parameter)}catch(error){if(lastError=error,this.logger.warn(`Operation '${operation}' failed, attempt ${attempt+1}/${this.maxRetries+1}`,error),error instanceof SDKError&&error.code===exports.OperationErrorCode.OPERATION_TIMEOUT&&attempt<this.maxRetries)continue;if(!(error instanceof SDKError&&error.code===exports.OperationErrorCode.OPERATION_TIMEOUT)||attempt>=this.maxRetries)throw error}throw lastError||new SDKError(exports.OperationErrorCode.OPERATION_TIMEOUT,`All retry attempts failed for operation: ${operation}`)})}}var AvatarOperationType,AvatarCameraType;exports.AvatarOperationType=void 0,(AvatarOperationType=exports.AvatarOperationType||(exports.AvatarOperationType={})).INITIALIZE_AVATAR="initializeAvatar",AvatarOperationType.PLAY_MOTION="playMotion",AvatarOperationType.GET_CURRENT_MOTION="getCurrentMotion",AvatarOperationType.UNLOAD_AVATAR="unloadAvatar",AvatarOperationType.SET_CAMERA="setCamera",exports.AvatarCameraType=void 0,(AvatarCameraType=exports.AvatarCameraType||(exports.AvatarCameraType={})).WHOLE="whole",AvatarCameraType.HALF="half",AvatarCameraType.FACE="face";class AvatarService extends UnityBaseService{get callbackFunctionName(){return"uniAvatarCallback"}constructor(config){super(config),this.logger.info("Avatar API service initialized")}initializeAvatar(avatarCode_1){return __awaiter(this,arguments,void 0,function*(avatarCode,cameraType=exports.AvatarCameraType.WHOLE){this.logger.info(`Initializing avatar: ${avatarCode} with camera type: ${cameraType}`);try{const result=yield this.sendAsyncMessage("InitializeAvatar",exports.AvatarOperationType.INITIALIZE_AVATAR,{avatarCode:avatarCode,cameraType:cameraType});return this.logger.info("Avatar initialization "+(result.success?"succeeded":"failed")),result}catch(error){throw this.logger.error("Failed to initialize avatar",error),error}})}handleCallback(operation,code,message,data){super.handleCallback(operation,code,message,data)}playMotion(clipCode){return __awaiter(this,void 0,void 0,function*(){this.logger.info(`Playing motion: ${clipCode}`);try{const result=yield this.sendAsyncMessage("PlayMotion",exports.AvatarOperationType.PLAY_MOTION,{clipCode:clipCode});return this.logger.info("Motion play "+(result.success?"succeeded":"failed")),result}catch(error){throw this.logger.error("Failed to play motion",error),error}})}getCurrentMotion(getRemainingTime){return __awaiter(this,void 0,void 0,function*(){var _a,_b;this.logger.info(`Getting current motion info, includeRemainingTime: ${getRemainingTime}`);try{const result=yield this.sendAsyncMessage("GetCurrentMotion",exports.AvatarOperationType.GET_CURRENT_MOTION,{getRemainingTime:getRemainingTime});return this.logger.info("Current motion info retrieved",{motionId:null===(_a=result.data)||void 0===_a?void 0:_a.motionId,remainingTime:null===(_b=result.data)||void 0===_b?void 0:_b.motionRemainingTime}),result}catch(error){throw this.logger.error("Failed to get current motion info",error),error}})}unloadAvatar(){return __awaiter(this,void 0,void 0,function*(){this.logger.info("Unloading avatar");try{const result=yield this.sendAsyncMessage("UnloadAvatar",exports.AvatarOperationType.UNLOAD_AVATAR);return this.logger.info("Avatar unload "+(result.success?"succeeded":"failed")),result}catch(error){throw this.logger.error("Failed to unload avatar",error),error}})}setCamera(cameraType){return __awaiter(this,void 0,void 0,function*(){this.logger.info(`Setting camera type: ${cameraType}`);try{const result=yield this.sendAsyncMessage("SetCamera",exports.AvatarOperationType.SET_CAMERA,{cameraType:cameraType});return this.logger.info("Camera type setting "+(result.success?"succeeded":"failed")),result}catch(error){throw this.logger.error("Failed to set camera type",error),error}})}batchExecute(operations){return __awaiter(this,void 0,void 0,function*(){this.logger.info(`Executing batch operations: ${operations.length} items`);const results=[];for(const operation of operations)try{const method=this[operation.method],result=yield method.apply(this,operation.params);results.push(result)}catch(error){this.logger.error(`Batch operation failed: ${operation.method}`,error),results.push({success:!1,message:`Batch operation failed: ${error.message}`,errorCode:1})}return this.logger.info(`Batch operations completed: ${results.filter(r=>r.success).length}/${results.length} successful`),results})}}const ENV_MAP={dev:{apiBaseUrl:"https://dev.local.zeewain.com"},test:{apiBaseUrl:"https://test.local.zeewain.com"},prod:{apiBaseUrl:"https://ai.zeewain3d.com"}};class ConfigManager{constructor(){this.config=null}static getInstance(){return ConfigManager.instance||(ConfigManager.instance=new ConfigManager),ConfigManager.instance}setConfig(config){this.config=Object.assign(Object.assign({},config),{env:config.env||"prod",containerId:config.containerId||"unity-container"})}updateConfig(config){this.config&&(this.config=Object.assign(Object.assign({},this.config),config))}getConfig(){return this.config}getApiBaseUrl(withApiModule=!0){var _a,_b,_c,_d;return"custom"===(null===(_a=this.config)||void 0===_a?void 0:_a.env)&&(null===(_b=this.config)||void 0===_b?void 0:_b.apiUrl)?`${this.config.apiUrl}${withApiModule?"/api":""}`:(null===(_d=function getEnvConfig(env="dev",withApiModule=!0){const baseUrl=ENV_MAP[env];return baseUrl?{apiBaseUrl:`${baseUrl.apiBaseUrl}${withApiModule?"/api":""}`}:null}((null===(_c=this.config)||void 0===_c?void 0:_c.env)||"prod",withApiModule))||void 0===_d?void 0:_d.apiBaseUrl)||""}reset(){this.config=null}}ConfigManager.instance=null;class UnityLoader{constructor(){this.config=ConfigManager.getInstance().getConfig()}init(){return __awaiter(this,void 0,void 0,function*(){const container=this.createContainer();return yield this.loadUnityLoader(),yield this.createUnityInstance(container)})}createContainer(){const container=document.getElementById(this.config.containerId);if(!container)throw new TypeError(`Avatar container element with ID "${this.config.containerId}" not found`);if(!(container instanceof HTMLDivElement))throw new TypeError("Avatar container element must be a div element");return container.style.position="relative",container}loadUnityLoader(){return new Promise((resolve,reject)=>{if(window.createUnityInstance)return resolve();const script=document.createElement("script");script.src=this.config.loaderUrl,script.async=!0,script.crossOrigin="anonymous",script.onload=()=>{"function"==typeof window.createUnityInstance?resolve():reject(new Error("createUnityInstance function not found"))},script.onerror=error=>{reject(new Error(`Failed to load UnityLoader: ${error}`))},document.head.appendChild(script)})}createUnityInstance(container){return __awaiter(this,void 0,void 0,function*(){let canvas=container.querySelector("#unity-canvas");if(canvas||(canvas=document.createElement("canvas"),canvas.id="unity-canvas",canvas.style.width="100%",canvas.style.height="100%",canvas.style.display="none",container.appendChild(canvas)),/iPhone|iPad|iPod|Android/i.test(navigator.userAgent)){const meta=document.createElement("meta");meta.name="viewport",meta.content="width=device-width, height=device-height, initial-scale=1.0, user-scalable=no, shrink-to-fit=yes",document.head.appendChild(meta),canvas.style.width="100%",canvas.style.height="100%",canvas.style.position="fixed"}if("function"==typeof window.createUnityInstance){const instance=yield window.createUnityInstance(canvas,{dataUrl:this.config.dataUrl,frameworkUrl:this.config.frameworkUrl,codeUrl:this.config.codeUrl,companyName:"广州紫为云科技有限公司",productName:"数字人SDK",productVersion:"1.0"},progress=>{this.config.onProgress&&this.config.onProgress(progress)});return yield new Promise(resolve=>setTimeout(resolve,500)),canvas.style.display="block",instance}throw new TypeError("createUnityInstance is not defined on window.")})}}function getLines(onLine){let buffer,position,fieldLength,discardTrailingNewline=!1;return function onChunk(arr){void 0===buffer?(buffer=arr,position=0,fieldLength=-1):buffer=function concat(a,b){const res=new Uint8Array(a.length+b.length);return res.set(a),res.set(b,a.length),res}(buffer,arr);const bufLength=buffer.length;let lineStart=0;for(;position<bufLength;){discardTrailingNewline&&(10===buffer[position]&&(lineStart=++position),discardTrailingNewline=!1);let lineEnd=-1;for(;position<bufLength&&-1===lineEnd;++position)switch(buffer[position]){case 58:-1===fieldLength&&(fieldLength=position-lineStart);break;case 13:discardTrailingNewline=!0;case 10:lineEnd=position}if(-1===lineEnd)break;onLine(buffer.subarray(lineStart,lineEnd),fieldLength),lineStart=position,fieldLength=-1}lineStart===bufLength?buffer=void 0:0!==lineStart&&(buffer=buffer.subarray(lineStart),position-=lineStart)}}var __rest=function(s,e){var t={};for(var p in s)Object.prototype.hasOwnProperty.call(s,p)&&e.indexOf(p)<0&&(t[p]=s[p]);if(null!=s&&"function"==typeof Object.getOwnPropertySymbols){var i=0;for(p=Object.getOwnPropertySymbols(s);i<p.length;i++)e.indexOf(p[i])<0&&Object.prototype.propertyIsEnumerable.call(s,p[i])&&(t[p[i]]=s[p[i]])}return t};function fetchEventSource(input,_a){var{signal:inputSignal,headers:inputHeaders,onopen:inputOnOpen,onmessage:onmessage,onclose:onclose,onerror:onerror,openWhenHidden:openWhenHidden,fetch:inputFetch}=_a,rest=__rest(_a,["signal","headers","onopen","onmessage","onclose","onerror","openWhenHidden","fetch"]);return new Promise((resolve,reject)=>{const headers=Object.assign({},inputHeaders);let curRequestController;function onVisibilityChange(){curRequestController.abort(),document.hidden||create()}headers.accept||(headers.accept="text/event-stream"),openWhenHidden||document.addEventListener("visibilitychange",onVisibilityChange);let retryInterval=1e3,retryTimer=0;function dispose(){document.removeEventListener("visibilitychange",onVisibilityChange),window.clearTimeout(retryTimer),curRequestController.abort()}null==inputSignal||inputSignal.addEventListener("abort",()=>{dispose(),resolve()});const fetch=null!=inputFetch?inputFetch:window.fetch,onopen=null!=inputOnOpen?inputOnOpen:defaultOnOpen;async function create(){var _a;curRequestController=new AbortController;try{const response=await fetch(input,Object.assign(Object.assign({},rest),{headers:headers,signal:curRequestController.signal}));await onopen(response),await async function getBytes(stream,onChunk){const reader=stream.getReader();let result;for(;!(result=await reader.read()).done;)onChunk(result.value)}(response.body,getLines(function getMessages(onId,onRetry,onMessage){let message={data:"",event:"",id:"",retry:void 0};const decoder=new TextDecoder;return function onLine(line,fieldLength){if(0===line.length)null==onMessage||onMessage(message),message={data:"",event:"",id:"",retry:void 0};else if(fieldLength>0){const field=decoder.decode(line.subarray(0,fieldLength)),valueOffset=fieldLength+(32===line[fieldLength+1]?2:1),value=decoder.decode(line.subarray(valueOffset));switch(field){case"data":message.data=message.data?message.data+"\n"+value:value;break;case"event":message.event=value;break;case"id":onId(message.id=value);break;case"retry":const retry=parseInt(value,10);isNaN(retry)||onRetry(message.retry=retry)}}}}(id=>{id?headers["last-event-id"]=id:delete headers["last-event-id"]},retry=>{retryInterval=retry},onmessage))),null==onclose||onclose(),dispose(),resolve()}catch(err){if(!curRequestController.signal.aborted)try{const interval=null!==(_a=null==onerror?void 0:onerror(err))&&void 0!==_a?_a:retryInterval;window.clearTimeout(retryTimer),retryTimer=window.setTimeout(create,interval)}catch(innerErr){dispose(),reject(innerErr)}}}create()})}function defaultOnOpen(response){const contentType=response.headers.get("content-type");if(!(null==contentType?void 0:contentType.startsWith("text/event-stream")))throw new Error(`Expected content-type to be text/event-stream, Actual: ${contentType}`)}var BroadcastOperationType,BroadcastType,BroadcastTaskStatus;exports.BroadcastOperationType=void 0,(BroadcastOperationType=exports.BroadcastOperationType||(exports.BroadcastOperationType={})).START_BROADCAST="startBroadcast",BroadcastOperationType.PAUSE_BROADCAST="pauseBroadcast",BroadcastOperationType.RESUME_BROADCAST="resumeBroadcast",BroadcastOperationType.STOP_BROADCAST="stopBroadcast",BroadcastOperationType.APPEND_BROADCAST="appendBroadcast",exports.BroadcastType=void 0,(BroadcastType=exports.BroadcastType||(exports.BroadcastType={})).TEXT="text",BroadcastType.AUDIO="audio",function(BroadcastTaskStatus){BroadcastTaskStatus.PENDING="pending",BroadcastTaskStatus.REQUESTING="requesting",BroadcastTaskStatus.COMPLETED="completed",BroadcastTaskStatus.FAILED="failed",BroadcastTaskStatus.CANCELLED="cancelled"}(BroadcastTaskStatus||(BroadcastTaskStatus={}));class BroadcastService extends UnityBaseService{constructor(config){super(config),this.callbacks={},this.taskQueue=[],this.taskSequence=0,this.currentSendingSequence=0,this.isBroadcastingAudio=!1,this.hasReceivedAudio=!1,this.queueProcessTimer=null,this.broadcastCompletedCount=0,this.callbacks=config.callbacks||{},this.logger.info("Broadcast service initialized",{config:config})}handleCallback(operation,code,message,data){var _a,_b,_c,_d,_e,_f,_g,_h,_j,_k,_l;const{isBroadcastCompleted:isBroadcastCompleted}=JSON.parse(data||"{}");if(super.handleCallback(operation,code,message,data),0===code)switch(operation){case exports.BroadcastOperationType.START_BROADCAST:if(isBroadcastCompleted){this.broadcastCompletedCount++;const status=this.getStatus();0===(null===(_a=status.queueInfo)||void 0===_a?void 0:_a.pendingTasks)&&0===(null===(_b=status.queueInfo)||void 0===_b?void 0:_b.requestingTasks)&&(null===(_c=status.queueInfo)||void 0===_c?void 0:_c.completedTasks)===this.broadcastCompletedCount&&(this.isBroadcastingAudio=!1,this.hasReceivedAudio=!1,this.currentSendingSequence=0,this.cleanupCompletedTasks(),this.logger.warn("Broadcast all completed")),null===(_e=(_d=this.callbacks).onFinish)||void 0===_e||_e.call(_d)}break;case exports.BroadcastOperationType.PAUSE_BROADCAST:null===(_g=(_f=this.callbacks).onPause)||void 0===_g||_g.call(_f),this.logger.debug("Broadcast paused callback triggered");break;case exports.BroadcastOperationType.RESUME_BROADCAST:null===(_j=(_h=this.callbacks).onResume)||void 0===_j||_j.call(_h),this.logger.debug("Broadcast resumed callback triggered");break;case exports.BroadcastOperationType.STOP_BROADCAST:null===(_l=(_k=this.callbacks).onStop)||void 0===_l||_l.call(_k),this.logger.debug("Broadcast stopped callback triggered")}else{const error=SDKError.createFromUnityError(code,`Unity operation '${operation}' failed: ${message}`);this.handleError(error)}}startBroadcast(params,isAppend){return __awaiter(this,void 0,void 0,function*(){var _a,_b;this.logger.info(`Starting broadcast: ${params.type}`,{humanCode:params.humanCode,text:params.text,audioUrl:params.audioUrl,isAppend:isAppend,queueLength:this.taskQueue.length}),this.validateBroadcastParams(params),isAppend||(yield this.stopBroadcast(),this.taskSequence=0,this.currentSendingSequence=0,this.sendMessage("StartBroadcast",{callbackFun:this.uniqueCallbackName,operationType:exports.BroadcastOperationType.START_BROADCAST,motionList:params.motionList,motionPlayMode:params.motionPlayMode}),null===(_b=(_a=this.callbacks).onStart)||void 0===_b||_b.call(_a),this.isBroadcastingAudio=!0);const task=this.createBroadcastTask(params);this.addTaskToQueue(task),this.logger.debug("Broadcast task created and queued",{taskId:task.id,sequence:task.sequence,isAppend:isAppend})})}pauseBroadcast(resetIdle){return __awaiter(this,void 0,void 0,function*(){this.logger.info("Pausing broadcast");try{yield this.sendAsyncMessage("PauseBroadcast",exports.BroadcastOperationType.PAUSE_BROADCAST,{resetIdle:resetIdle}),this.logger.info("Broadcast paused successfully")}catch(error){throw this.logger.error("Failed to pause broadcast",error),error}})}resumeBroadcast(){return __awaiter(this,void 0,void 0,function*(){this.logger.info("Resuming broadcast");try{yield this.sendAsyncMessage("ResumeBroadcast",exports.BroadcastOperationType.RESUME_BROADCAST,{}),this.logger.info("Broadcast resumed successfully")}catch(error){throw this.logger.error("Failed to resume broadcast",error),error}})}stopBroadcast(){return __awaiter(this,void 0,void 0,function*(){this.logger.info("Stopping broadcast and clearing queue",{queueLength:this.taskQueue.length}),this.cancelAllTasks(),yield new Promise(resolve=>setTimeout(resolve,100)),this.isBroadcastingAudio=!1,this.hasReceivedAudio=!1,this.broadcastCompletedCount=0;try{yield this.sendAsyncMessage("StopBroadcast",exports.BroadcastOperationType.STOP_BROADCAST,{}),this.logger.info("Broadcast stopped successfully")}catch(error){throw this.logger.error("Failed to stop broadcast",error),error}})}updateCallbacks(callbacks){this.callbacks=Object.assign(Object.assign({},this.callbacks),callbacks),this.logger.debug("Broadcast callbacks updated")}getStatus(){const pendingTasks=this.taskQueue.filter(t=>t.status===BroadcastTaskStatus.PENDING).length,requestingTasks=this.taskQueue.filter(t=>t.status===BroadcastTaskStatus.REQUESTING).length,completedTasks=this.taskQueue.filter(t=>t.status===BroadcastTaskStatus.COMPLETED).length,failedTasks=this.taskQueue.filter(t=>t.status===BroadcastTaskStatus.FAILED).length,totalPendingResponses=this.taskQueue.reduce((sum,t)=>sum+t.pendingResponses.length,0),currentSendingSequence=this.currentSendingSequence,isGeneratingAudio=pendingTasks+requestingTasks>0;return{isActive:this.isBroadcastingAudio||isGeneratingAudio,isGeneratingAudio:isGeneratingAudio,hasReceivedAudio:this.hasReceivedAudio,queueInfo:{totalTasks:this.taskQueue.length,pendingTasks:pendingTasks,requestingTasks:requestingTasks,completedTasks:completedTasks,failedTasks:failedTasks,totalPendingResponses:totalPendingResponses,currentSendingSequence:currentSendingSequence}}}destroy(){this.clearQueueProcessTimer(),this.cancelAllTasks(),super.destroy(),this.logger.info("Broadcast service destroyed")}createBroadcastTask(params){const task={id:`[${params.type===exports.BroadcastType.TEXT?"TEXT":"AUDIO"}]-(${params.type===exports.BroadcastType.TEXT?params.text:params.audioUrl})_${Math.random().toString(36).substring(2,9)}`,sequence:++this.taskSequence,params:params,status:BroadcastTaskStatus.PENDING,controller:new AbortController,pendingResponses:[],isGenerationComplete:!1,createdAt:new Date};return this.logger.debug("Created broadcast task",{taskId:task.id,sequence:task.sequence}),task}addTaskToQueue(task){this.taskQueue.push(task),this.logger.debug("Task added to queue",{taskId:task.id,params:task.params,queueLength:this.taskQueue.length});this.taskQueue.some(t=>t.status===BroadcastTaskStatus.REQUESTING)?this.logger.debug("Task queued, waiting for previous task to complete",{taskId:task.id,pendingTasks:this.taskQueue.filter(t=>t.status===BroadcastTaskStatus.PENDING).length}):this.startTaskRequest(task),this.processTaskQueue()}processTaskQueue(){this.queueProcessTimer||(this.queueProcessTimer=setInterval(()=>{this.processTaskQueueStep()},100)),this.processTaskQueueStep()}processTaskQueueStep(){const nextTask=this.taskQueue.find(task=>task.sequence===this.currentSendingSequence+1&&task.status!==BroadcastTaskStatus.PENDING&&task.pendingResponses.length>0);nextTask?this.sendNextResponse(nextTask):this.logger.debug("No next task to process",{currentSendingSequence:this.currentSendingSequence,taskQueue:this.taskQueue});0===this.taskQueue.filter(task=>task.status===BroadcastTaskStatus.PENDING||task.status===BroadcastTaskStatus.REQUESTING).length&&this.clearQueueProcessTimer()}startTaskRequest(task){return __awaiter(this,void 0,void 0,function*(){var _a;task.status=BroadcastTaskStatus.REQUESTING,this.logger.debug("Starting task request",{taskId:task.id});try{const apiUrl=`${ConfigManager.getInstance().getApiBaseUrl(!0)}${this.getBroadcastApiPath(task.params.type)}`,requestBody={humanCode:task.params.humanCode,speed:task.params.speed,volume:task.params.volume>=0?100*task.params.volume:void 0,isSubtitle:task.params.isSubtitle,audioDrivenVersion:ConfigManager.getInstance().getConfig().audioDrivenVersion};task.params.type===exports.BroadcastType.TEXT?(requestBody.text=task.params.text,requestBody.voiceCode=task.params.voiceCode):task.params.type===exports.BroadcastType.AUDIO&&(requestBody.text=task.params.text,requestBody.audioUrl=task.params.audioUrl),fetchEventSource(apiUrl,{method:"POST",headers:{"Content-Type":"application/json",x_auth_token:(null===(_a=ConfigManager.getInstance().getConfig())||void 0===_a?void 0:_a.token)||""},body:JSON.stringify(requestBody),signal:task.controller.signal,openWhenHidden:!0,onopen:response=>__awaiter(this,void 0,void 0,function*(){if(!response.ok){const error=this.createHttpError(response.status,response.statusText,task.id);throw this.handleTaskError(task,error),error}}),onmessage:event=>{this.handleTaskResponse(task,event.data)},onclose:()=>{this.handleTaskClose(task)},onerror:error=>{if(error instanceof SDKError)throw error;this.logger.error("broadcast onerror",error);const sdkError=this.convertToSDKError(error,task.id);throw this.handleTaskError(task,sdkError),sdkError}})}catch(error){const sdkError=this.convertToSDKError(error,task.id);this.handleTaskError(task,sdkError)}})}handleTaskResponse(task,data){try{const response=JSON.parse(data);if(0!==response.code){const error=this.createBroadcastError(response.code,response.message);return void this.handleTaskError(task,error)}if(response.data){this.hasReceivedAudio=!0,task.params.type===exports.BroadcastType.AUDIO&&task.params.audioUrl&&!response.data.voiceUrl&&(response.data.voiceUrl=task.params.audioUrl);const{voiceUrl:voiceUrl,mouthShapeUrl:mouthShapeUrl}=response.data;voiceUrl&&!voiceUrl.startsWith("http")&&(response.data.voiceUrl=`${ConfigManager.getInstance().getApiBaseUrl(!1)}${voiceUrl}`),mouthShapeUrl&&!mouthShapeUrl.startsWith("http")&&(response.data.mouthShapeUrl=`${ConfigManager.getInstance().getApiBaseUrl(!1)}${mouthShapeUrl}`),task.pendingResponses.push(response),this.logger.debug("Response added to task",{taskId:task.id,response:response,pendingCount:task.pendingResponses.length}),response.data.done&&(task.isGenerationComplete=!0,this.logger.debug("Task generation completed",{taskId:task.id,totalResponses:task.pendingResponses.length}))}}catch(error){this.handleTaskError(task,new SDKError(exports.OperationErrorCode.OPERATION_FAILED,"string"==typeof error?error:error.message||"播报服务错误"))}}sendNextResponse(task){var _a;if(0===task.pendingResponses.length)return;const response=task.pendingResponses.shift();this.logger.debug("Sending response to Unity",{taskId:task.id,remainingResponses:task.pendingResponses.length,voiceUrl:null===(_a=response.data)||void 0===_a?void 0:_a.voiceUrl}),this.sendMessage("AppendBroadcast",{response:response,callbackFun:this.uniqueCallbackName,operationType:exports.BroadcastOperationType.APPEND_BROADCAST}),task.isGenerationComplete&&0===task.pendingResponses.length&&(task.status=BroadcastTaskStatus.COMPLETED,this.currentSendingSequence=task.sequence,this.logger.debug("Task completed",{taskId:task.id}))}handleTaskClose(task){return __awaiter(this,void 0,void 0,function*(){this.logger.debug("Task stream closed",{taskId:task.id}),task.status!==BroadcastTaskStatus.FAILED&&task.status!==BroadcastTaskStatus.CANCELLED&&(task.isGenerationComplete||task.status!==BroadcastTaskStatus.REQUESTING||(task.isGenerationComplete=!0),this.startNextPendingTask())})}handleTaskError(task,error){var _a,_b;task.status!==BroadcastTaskStatus.FAILED&&task.status!==BroadcastTaskStatus.CANCELLED&&(task.status=BroadcastTaskStatus.FAILED,task.error=error,this.logger.error(`Task failed - ${task.id}`,error),null===(_b=(_a=this.callbacks).onError)||void 0===_b||_b.call(_a,error),this.cancelAllTasks(),this.isBroadcastingAudio=!1,this.hasReceivedAudio=!1,this.currentSendingSequence=0,this.clearQueueProcessTimer(),this.logger.debug("Task failed, all tasks cancelled and broadcast state reset"))}cleanupCompletedTasks(){const beforeLength=this.taskQueue.length;this.taskQueue=this.taskQueue.filter(task=>task.status!==BroadcastTaskStatus.COMPLETED&&task.status!==BroadcastTaskStatus.FAILED&&task.status!==BroadcastTaskStatus.CANCELLED);const removedCount=beforeLength-this.taskQueue.length;removedCount>0&&this.logger.debug("Cleaned up completed tasks",{removedCount:removedCount,remainingTasks:this.taskQueue.length})}cancelAllTasks(){for(const task of this.taskQueue)task.status===BroadcastTaskStatus.REQUESTING?(task.controller.abort(),task.status=BroadcastTaskStatus.CANCELLED,this.logger.debug("Task aborted",{taskId:task.id,previousStatus:"requesting"})):task.status===BroadcastTaskStatus.PENDING&&(task.status=BroadcastTaskStatus.CANCELLED,this.logger.debug("Task cancelled",{taskId:task.id,previousStatus:"pending"}));this.taskQueue=[],this.taskSequence=0,this.currentSendingSequence=0,this.logger.debug("All tasks cancelled and queue cleared")}get callbackFunctionName(){return"uniBroadcastCallback"}getBroadcastApiPath(type){switch(type){case exports.BroadcastType.TEXT:return"/aiep-openapi/avatar-interaction/v1/broadcast/text";case exports.BroadcastType.AUDIO:return"/aiep-openapi/avatar-interaction/v1/broadcast/audio";default:throw new SDKError(exports.ConfigErrorCode.INVALID_CONFIG,`未知的播报类型: ${type}`)}}validateBroadcastParams(params){if(params.type===exports.BroadcastType.TEXT){if(!params.text||!params.voiceCode)throw new SDKError(exports.ConfigErrorCode.MISSING_REQUIRED_PARAM,"文本播报需要提供text和voiceCode参数")}else if(params.type===exports.BroadcastType.AUDIO&&!params.audioUrl)throw new SDKError(exports.ConfigErrorCode.MISSING_REQUIRED_PARAM,"自定义音频播报需要提供audioUrl参数")}handleError(error){var _a,_b;this.logger.error("Broadcast error occurred",error),null===(_b=(_a=this.callbacks).onError)||void 0===_b||_b.call(_a,error)}createBroadcastError(errorCode,errorMessage){switch(errorCode){case 14001:return new SDKError(exports.OperationErrorCode.BROADCAST_EQUITY_NOT_EXIST,"用户权益额度不存在");case 14002:return new SDKError(exports.OperationErrorCode.BROADCAST_EQUITY_NOT_ENOUGH,"用户权益额度不足");case 14003:return new SDKError(exports.OperationErrorCode.BROADCAST_EQUITY_FREEZE_FAILED,"用户权益额度冻结失败");default:return new SDKError(exports.OperationErrorCode.OPERATION_FAILED,`${errorMessage}(${errorCode})`||`播报服务错误(${errorCode})`)}}startNextPendingTask(){const nextPendingTask=this.taskQueue.filter(t=>t.status===BroadcastTaskStatus.PENDING).sort((a,b)=>a.sequence-b.sequence)[0];nextPendingTask?(this.logger.debug("Starting next pending task",{taskId:nextPendingTask.id,sequence:nextPendingTask.sequence}),this.startTaskRequest(nextPendingTask)):this.logger.debug("No pending tasks to start")}clearQueueProcessTimer(){this.queueProcessTimer&&(clearInterval(this.queueProcessTimer),this.queueProcessTimer=null,this.logger.debug("Queue process timer cleared"))}createHttpError(status,statusText,taskId){switch(this.logger.warn(`HTTP error occurred - Task: ${taskId}, Status: ${status}`,{status:status,statusText:statusText}),status){case 401:return new SDKError(exports.NetworkErrorCode.UNAUTHORIZED,`Token 已过期或无效,请重新授权 (HTTP ${status})`);case 403:return new SDKError(exports.NetworkErrorCode.UNAUTHORIZED,`无权限访问该资源 (HTTP ${status})`);case 404:return new SDKError(exports.NetworkErrorCode.SERVER_ERROR,`请求的资源不存在 (HTTP ${status})`);case 500:case 502:case 503:case 504:return new SDKError(exports.NetworkErrorCode.SERVER_ERROR,`服务器错误,请稍后重试 (HTTP ${status})`);default:return new SDKError(exports.NetworkErrorCode.CONNECTION_FAILED,`网络请求失败: ${statusText||"Unknown Error"} (HTTP ${status})`)}}convertToSDKError(error,taskId){if(error instanceof SDKError)return error;if(error instanceof Error){const errorMessage=error.message.toLowerCase();if(errorMessage.includes("timeout")||errorMessage.includes("timed out"))return new SDKError(exports.NetworkErrorCode.REQUEST_TIMEOUT,`请求超时 - Task: ${taskId}`,error);if(errorMessage.includes("network")||errorMessage.includes("fetch")||errorMessage.includes("connection")){const hint=errorMessage.includes("failed to fetch")?"(可能是 Token 过期或 CORS 跨域问题,请检查 Token 是否有效)":"";return new SDKError(exports.NetworkErrorCode.CONNECTION_FAILED,`网络请求失败 - Task: ${taskId}: ${error.message}${hint}`,error)}return errorMessage.includes("abort")||errorMessage.includes("cancel")?new SDKError(exports.OperationErrorCode.OPERATION_CANCELLED,`操作已取消 - Task: ${taskId}`,error):new SDKError(exports.OperationErrorCode.OPERATION_FAILED,`播报任务执行失败 - Task: ${taskId}: ${error.message}`,error)}const errorMessage=String(error);return new SDKError(exports.OperationErrorCode.OPERATION_FAILED,`播报任务执行失败 - Task: ${taskId}: ${errorMessage}`)}}class ZEEAvatarLoader{constructor(){this.apiService=null,this.unityInstance=null,this.loader=new UnityLoader}init(){return __awaiter(this,void 0,void 0,function*(){return this.unityInstance=yield this.loader.init(),this.initGlobalConfig(),this.apiService=new AvatarService({unityInstance:this.unityInstance}),this.apiService})}updateToken(token){const currentConfig=ConfigManager.getInstance().getConfig();currentConfig&&(ConfigManager.getInstance().setConfig(Object.assign(Object.assign({},currentConfig),{token:token})),this.initGlobalConfig())}getAPI(){return this.apiService}getInstance(){return this.unityInstance}getContainerId(){return ConfigManager.getInstance().getConfig().containerId}destroy(){if(this.unityInstance){const container=document.getElementById(this.getContainerId());if(container){const canvas=container.querySelector("#unity-canvas");canvas&&canvas.remove()}"function"==typeof this.unityInstance.Quit&&this.unityInstance.Quit(),this.unityInstance=null,this.apiService=null}ConfigManager.getInstance().reset()}initGlobalConfig(){const config=ConfigManager.getInstance().getConfig(),{assetsFrom:assetsFrom}=config,globalParams={token:null==config?void 0:config.token,apiBaseUrl:ConfigManager.getInstance().getApiBaseUrl(!1),idleMotionList:null==config?void 0:config.idleMotionList};if(this.unityInstance.SendMessage("AvatarSDK","InitializeConfig",JSON.stringify(globalParams)),console.warn("[ Send Unity message ]: AvatarSDK.InitializeConfig",globalParams),"cloud"!==assetsFrom){const assetModuleParams={isZip:!0,assetBundlePath:null==config?void 0:config.assetsUrl};this.unityInstance.SendMessage("AvatarSDK","InitAssetBundleModule",JSON.stringify(assetModuleParams)),console.warn("[ Send Unity message ]: AvatarSDK.InitAssetBundleModule",assetModuleParams)}}}exports.AvatarService=AvatarService,exports.BroadcastService=BroadcastService,exports.ERROR_CODE_MAP=ERROR_CODE_MAP,exports.SDKError=SDKError,exports.SDK_VERSION="2.2.2",exports.ZEEAvatarLoader=ZEEAvatarLoader,exports.ZEEAvatarSDK=class ZEEAvatarSDK{constructor(config){var _a;this.loader=null,this.avatarService=null,this.broadcastService=null,this.unityInstance=null,this.isInitialized=!1,this.instanceId=function generateUniqueId(){return`${Date.now()}_${Math.random().toString(36).substring(2,9)}`}(),ConfigManager.getInstance().setConfig(config),this.logger=new SimpleLogger(null===(_a=ConfigManager.getInstance().getConfig().enableDebugLog)||void 0===_a||_a),this.logger.info("SDK版本","2.2.2")}initializeAvatar(avatarCode_1){return __awaiter(this,arguments,void 0,function*(avatarCode,cameraType=exports.AvatarCameraType.WHOLE){var _a;if(this.isInitialized)throw new SDKError(exports.OperationErrorCode.OPERATION_FAILED,"SDK已经初始化,请勿重复初始化");try{const config=ConfigManager.getInstance().getConfig();this.loader=new ZEEAvatarLoader,yield this.loader.init(),this.unityInstance=this.loader.getInstance(),this.avatarService=new AvatarService({unityInstance:this.unityInstance,instanceId:this.instanceId,enableDebugLog:config.enableDebugLog,timeout:config.operationTimeout}),this.broadcastService=new BroadcastService({unityInstance:this.unityInstance,instanceId:this.instanceId,callbacks:config.broadcastCallbacks,enableDebugLog:config.enableDebugLog,timeout:config.operationTimeout});const result=yield this.avatarService.initializeAvatar(avatarCode,cameraType);if(result.success){const audioDrivenVersion=null===(_a=result.data)||void 0===_a?void 0:_a.audioDrivenVersion;if(config.audioDrivenVersion=audioDrivenVersion,this.logger.info("AudioDrivenVersion",audioDrivenVersion),audioDrivenVersion){if(!function compareVersionCompatibility(version1,version2){const getMajorMinor=version=>{const parts=version.split(".");return parts.length<2?version:`${parts[0]}.${parts[1]}`};return getMajorMinor(version1)===getMajorMinor(version2)}("2.2.2",audioDrivenVersion))throw this.destroy(),new SDKError(exports.ResourceErrorCode.VERSION_INCOMPATIBLE,`资源版本不兼容: SDK版本为 2.2.2,WebGL资源版本为 ${audioDrivenVersion},前两位版本号必须一致`);this.logger.info("版本兼容性检查通过",`SDK: 2.2.2, 资源: ${audioDrivenVersion}`)}this.isInitialized=!0}return result}catch(error){throw new SDKError(exports.OperationErrorCode.OPERATION_FAILED,`数字人初始化失败: ${error instanceof Error?error.message:String(error)}`)}})}updateToken(token){ConfigManager.getInstance().updateConfig({token:token}),this.loader&&this.loader.updateToken(token)}playMotion(clipCode){return __awaiter(this,void 0,void 0,function*(){return this.ensureInitialized(),yield this.avatarService.playMotion(clipCode)})}getCurrentMotion(){return __awaiter(this,arguments,void 0,function*(getRemainingTime=!1){return this.ensureInitialized(),yield this.avatarService.getCurrentMotion(getRemainingTime)})}unloadAvatar(){return __awaiter(this,void 0,void 0,function*(){this.ensureInitialized();try{const result=yield this.avatarService.unloadAvatar();return result.success&&(this.isInitialized=!1),result}catch(error){throw new SDKError(exports.OperationErrorCode.OPERATION_FAILED,`数字人卸载失败: ${error instanceof Error?error.message:String(error)}`)}})}setCamera(cameraType){return __awaiter(this,void 0,void 0,function*(){return this.ensureInitialized(),yield this.avatarService.setCamera(cameraType)})}startBroadcast(params,isAppend){return __awaiter(this,void 0,void 0,function*(){return this.ensureInitialized(),yield this.broadcastService.startBroadcast(params,isAppend)})}startStreamBroadcast(params,forceRestart){return __awaiter(this,void 0,void 0,function*(){this.ensureInitialized();const status=this.broadcastService.getStatus(),isAppend=status.isActive;return this.logger.debug("startStreamBroadcast",{isActive:status.isActive,isAppend:isAppend}),yield this.broadcastService.startBroadcast(params,!forceRestart&&isAppend)})}pauseBroadcast(resetIdle){return __awaiter(this,void 0,void 0,function*(){return this.ensureInitialized(),yield this.broadcastService.pauseBroadcast(resetIdle)})}resumeBroadcast(){return __awaiter(this,void 0,void 0,function*(){return this.ensureInitialized(),yield this.broadcastService.resumeBroadcast()})}stopBroadcast(){return __awaiter(this,void 0,void 0,function*(){return this.ensureInitialized(),yield this.broadcastService.stopBroadcast()})}updateBroadcastCallbacks(callbacks){this.ensureInitialized(),this.broadcastService.updateCallbacks(callbacks)}getBroadcastStatus(){return this.ensureInitialized(),this.broadcastService.getStatus()}destroy(){try{this.broadcastService&&(this.broadcastService.destroy(),this.broadcastService=null),this.avatarService&&(this.avatarService.destroy(),this.avatarService=null),this.loader&&(this.loader.destroy(),this.loader=null),this.unityInstance=null,this.isInitialized=!1}catch(error){console.error("SDK销毁过程中发生错误:",error)}}getInstanceId(){return this.instanceId}isSDKInitialized(){return this.isInitialized}isAvatarInitialized(){return this.isInitialized}getConfig(){const config=ConfigManager.getInstance().getConfig();return config?Object.assign({},config):null}ensureInitialized(){if(!this.isInitialized)throw new SDKError(exports.OperationErrorCode.UNITY_NOT_INITIALIZED,"Avatar尚未初始化,请先调用initializeAvatar()方法")}},exports.getErrorInfo=getErrorInfo});
|