aliyun-rtc-sdk 7.2.7 → 7.2.8-beta.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.
@@ -1 +1 @@
1
- import{o as k,m as A,A as I}from"./index-DBpkuGL4.js";import"eventemitter3";const b=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,10,1,8,0,65,0,253,15,253,98,11]));function m(n,t,e,o){return new(e||(e=Promise))(function(l,r){function a(h){try{d(o.next(h))}catch(u){r(u)}}function i(h){try{d(o.throw(h))}catch(u){r(u)}}function d(h){var u;h.done?l(h.value):(u=h.value,u instanceof e?u:new e(function(g){g(u)})).then(a,i)}d((o=o.apply(n,[])).next())})}typeof SuppressedError=="function"&&SuppressedError;var c;function f(){return m(this,void 0,void 0,function*(){let n=!1;try{n=yield b()}catch{n=!1}return console.log("isSupportedSIMD",n),n})}(function(n){n[n.ERROR=0]="ERROR",n[n.WARN=1]="WARN",n[n.INFO=2]="INFO",n[n.LOG=3]="LOG",n[n.DEBUG=4]="DEBUG"})(c||(c={}));class s{static error(...t){var e;s.logLevel>=c.ERROR&&((e=console.error)===null||e===void 0||e.call(console,`[${s.logTag}] `,...t))}static warn(...t){var e;s.logLevel>=c.WARN&&((e=console.warn)===null||e===void 0||e.call(console,`[${s.logTag}] `,...t))}static info(...t){var e;s.logLevel>=c.INFO&&((e=console.info)===null||e===void 0||e.call(console,`[${s.logTag}] `,...t))}static log(...t){var e;s.logLevel>=c.LOG&&((e=console.log)===null||e===void 0||e.call(console,`[${s.logTag}] `,...t))}static debug(...t){var e;s.logLevel>=c.DEBUG&&((e=console.debug)===null||e===void 0||e.call(console,`[${s.logTag}] `,...t))}}s.logLevel=c.WARN,s.logTag="aliyun-audio-3a";class O{}let _=class extends O{static isSupported(){return function(){if(typeof window=="object"&&window!==null){const t="AudioWorklet"in window,e="WebAssembly"in window;return t&&e}return!1}()}static isSupportedSIMD(){return m(this,void 0,void 0,function*(){return yield f()})}static setLogger(t){s.logLevel=t}constructor(t){super(),this.channelCount=1,this.sampleRate=48e3,this.collectDumpOutputData=[],this.collectDumpNearInputData=[],this.collectDumpFarInputData=[],this.collectDumpMetaData=[],this.statUpdateTimer=0,this.statUpdateInterval=5e3,this.options=Object.assign({aecOn:!0,ansOn:!0,agcOn:!0,hdOn:!1,ansMode:1,dumpOn:!1,aiaecOn:!1,wasmCdnPath:"https://g.alicdn.com/code/npm/@ali/aliyun-audio-3a/0.0.6/"},t||{})}initWASM(t,e,o){return m(this,void 0,void 0,function*(){s.log("initWASM",t,e,o);const l=a=>m(this,void 0,void 0,function*(){try{const i=yield fetch(a,{credentials:"same-origin"});return i.ok||this.onLoadError(new Error(`Failed to fetch WASM: ${i.status}:${i.statusText}, url:${a}`)),i.arrayBuffer()}catch(i){return this.onLoadError(new Error("WASM load error")),s.error("Error fetching WASM:",i),new Uint8Array(0)}}),r=a=>m(this,void 0,void 0,function*(){return fetch(a).then(i=>i.text())});try{const a=yield f(),i=this.options.wasmCdnPath+"audio_module_v2.wasm",d=this.options.wasmCdnPath+"audio_module_v2_simd.wasm",u=yield l(a?d:i),g=this.options.wasmCdnPath+"audio_module_v2.js",v=this.options.wasmCdnPath+"audio_module_v2_simd.js",w=a?v:g,y=yield r(w);t.port.postMessage(Object.assign({type:"init",channelCount:e,sampleRate:o,wasmBuffer:u,isSupportSIMD:a,audioModuleScript:y,logLevel:s.logLevel},this.options),[u])}catch(a){s.error("Error initializing WASM:",a),this.onLoadError(new Error("WASM init error"))}t.port.onmessage=a=>{a.data.type==="init_done"&&this.onLoadSuccess(void 0),a.data.type==="dump_output_data"&&this.onDumpOutputData(a.data.data),a.data.type==="dump_near_data"&&this.onDumpNearInputData(a.data.data),a.data.type==="dump_far_data"&&this.onDumpFarInputData(a.data.data),a.data.type==="dump_meta_data"&&this.onDumpMeatData(a.data.data),a.data.type==="output_log"&&this.onOutputLog(a.data.data),a.data.type==="apm_stat_data"&&this.onStatData(a.data.data)}})}createProcessor(t,e,o,l,r){return m(this,void 0,void 0,function*(){this.audioContext=t,this.audioContext.resume(),this.channelCount=o,this.sampleRate=l;try{const d=new Blob(['!function(){"use strict";function t(t,e,a,n){return new(a||(a=Promise))((function(s,i){function o(t){try{h(n.next(t))}catch(t){i(t)}}function r(t){try{h(n.throw(t))}catch(t){i(t)}}function h(t){var e;t.done?s(t.value):(e=t.value,e instanceof a?e:new a((function(t){t(e)}))).then(o,r)}h((n=n.apply(t,e||[])).next())}))}var e;"function"==typeof SuppressedError&&SuppressedError,function(t){t[t.ERROR=0]="ERROR",t[t.WARN=1]="WARN",t[t.INFO=2]="INFO",t[t.LOG=3]="LOG",t[t.DEBUG=4]="DEBUG"}(e||(e={}));class a{static error(...t){var n;a.logLevel>=e.ERROR&&(null===(n=console.error)||void 0===n||n.call(console,`[${a.logTag}] `,...t))}static warn(...t){var n;a.logLevel>=e.WARN&&(null===(n=console.warn)||void 0===n||n.call(console,`[${a.logTag}] `,...t))}static info(...t){var n;a.logLevel>=e.INFO&&(null===(n=console.info)||void 0===n||n.call(console,`[${a.logTag}] `,...t))}static log(...t){var n;a.logLevel>=e.LOG&&(null===(n=console.log)||void 0===n||n.call(console,`[${a.logTag}] `,...t))}static debug(...t){var n;a.logLevel>=e.DEBUG&&(null===(n=console.debug)||void 0===n||n.call(console,`[${a.logTag}] `,...t))}}a.logLevel=e.WARN,a.logTag="aliyun-audio-3a";const n=Float32Array.BYTES_PER_ELEMENT,s=Uint16Array.BYTES_PER_ELEMENT;class i{constructor(t,e,a,n,s){this._channelData=[],this._name=t,this._isInitialized=!1,this._module=e,this._length=a,this._ringLength=2*a,this._maxChannelCount=s?Math.min(s,32):n,this._channelCount=n,this._allocateHeap(),this._isInitialized=!0,this._readIndex=0,this._writeIndex=0,this._framesAvailable=0,this._channelDataLocal=[];for(let t=0;t<this._channelCount;++t)this._channelDataLocal[t]=new Float32Array(this._ringLength)}_allocateHeap(){const t=this._length*n,e=this._channelCount*t;this._dataPtr=this._module._malloc(e),this._channelData=[];for(let e=0;e<this._channelCount;++e){const a=this._dataPtr+e*t,n=a+t;this._channelData[e]=this._module.HEAPF32.subarray(a>>s,n>>s)}}adaptChannel(t){t<this._maxChannelCount&&(this._channelCount=t)}get length(){return this._isInitialized?this._length:null}get numberOfChannels(){return this._isInitialized?this._channelCount:null}get maxChannelCount(){return this._isInitialized?this._maxChannelCount:null}getChannelData(t){return void 0!==t&&t>=this._channelCount?null:void 0===t?this._channelData:this._channelData[t]}getHeapAddress(){return this._dataPtr}getPointer(){return this._dataPtr}free(){this._isInitialized=!1,null!==this._dataPtr&&this._module._free(this._dataPtr),this._channelData=[]}get framesAvailable(){return this._framesAvailable}push(t){const e=t[0].length;for(let a=0;a<e;++a){for(let e=0;e<this._channelCount;++e)this._channelDataLocal[e][this._writeIndex]=t[e][a];this._writeIndex=(this._writeIndex+1)%this._ringLength}this._framesAvailable+=e,this._framesAvailable>this._ringLength&&(console.warn(this._name,"Too many frames available, overflow"),this._framesAvailable=this._ringLength,this._writeIndex=0)}pull(t){if(0===this._framesAvailable)return void console.warn(this._name,"No frames available");const e=t[0].length;for(let a=0;a<e;++a){for(let e=0;e<this._channelCount;++e)t[e][a]=this._channelDataLocal[e][this._readIndex];this._readIndex=(this._readIndex+1)%this._ringLength}this._framesAvailable-=e,this._framesAvailable<0&&(this._framesAvailable=0,this._readIndex=0)}}class o{constructor(t){this.inited=!1,this.handle=null,this.channelCount=1,this.isEnable=!0,this.dumpAudioData=!1,this.kernelBufferSize=512,this.node=t,this.onDumpOutputDataFunction=null,this.onDumpNearDataFunction=null,this.onDumpFarDataFunction=null,this.onDumpMetaDataFunction=null,this.wasmInvoker=null,this._nearAudioBuffer={},this._outputAudioBuffer={}}destructor(){this.wasmInvoker=null,this.handle=null}init(n){return t(this,void 0,void 0,(function*(){const{wasmBuffer:t,audioModuleScript:s,channelCount:o=1,sampleRate:r=44100,dumpAudioData:h=!1,logLevel:l=e.DEBUG}=n;a.logLevel=l,a.log("AudioAPM init",JSON.stringify(n)),this.channelCount=o,this.dumpAudioData=h;try{const e=new Function(`let module={};let exports={};${s}; return module`)();this.wasmInvoker=yield e.exports({wasmBinary:t})}catch(t){this.node.port.postMessage({type:"error",message:"audioModule init error"}),a.error(t)}this._nearAudioBuffer=new i("inBuffer",this.wasmInvoker,this.kernelBufferSize,2*this.channelCount,32),this._outputAudioBuffer=new i("outBuffer",this.wasmInvoker,this.kernelBufferSize,this.channelCount,32);const u=this.wasmInvoker.addFunction(((t,e)=>{const a=this.wasmInvoker.HEAPU8.subarray(t,t+e),n=String.fromCharCode.apply(null,a);this.node&&this.node.port&&this.node.port.postMessage({type:"output_log",message:"output_log",data:n})}),"vii");if(this.wasmInvoker.__apm_log_callback(u),this.handle=this.wasmInvoker.__apm_create(n.aecOn?1:0,n.ansOn?1:0,n.agcOn?1:0,n.hdOn?1:0,r,o,n.dumpOn?1:0,this.kernelBufferSize),n.aiaecOn){const t=102;this.wasmInvoker.__apm_set_param(this.handle,t,7)}if(n.useHardOnly){const t=108;this.wasmInvoker.__apm_set_param(this.handle,t,1)}this.node.port.postMessage({type:"init_done",message:"init done"}),this.inited=!0}))}getStatData(){if(this.wasmInvoker&&this.isEnable){let t=this.wasmInvoker.__apm_get_stat(this.handle),e=this.wasmInvoker.UTF8ToString(t);this.wasmInvoker._free(t),this.node&&this.node.port&&this.node.port.postMessage({type:"apm_stat_data",message:"apm_stat_data",data:e})}}onOutputLog(t){console.log("[WASM_LOG]",t)}destory(){return t(this,void 0,void 0,(function*(){var t;try{null===(t=this.wasmInvoker)||void 0===t||t.__apm_destory(this.handle),this.inited=!1}catch(t){a.error(t)}finally{this.handle=null}}))}enable(){this.isEnable=!0,a.log("APM enable")}disable(){this.isEnable=!1,a.log("APM disable")}getStat(){if(null==this.wasmInvoker||null==this.handle)return"";let t=this.wasmInvoker.__apm_get_stat(this.handle),e=this.wasmInvoker.UTF8ToString(t);return this.wasmInvoker._free(t),e}startDump(){this.onDumpOutputDataFunction=this.wasmInvoker.addFunction(((t,e)=>{const a=this.wasmInvoker.HEAPU8.subarray(t,t+e),n=new Uint8Array(a);this.node&&this.node.port&&this.node.port.postMessage({type:"dump_output_data",message:"dump_output_data",data:n})}),"vii"),this.onDumpNearDataFunction=this.wasmInvoker.addFunction(((t,e)=>{const a=this.wasmInvoker.HEAPU8.subarray(t,t+e),n=new Uint8Array(a);this.node&&this.node.port&&this.node.port.postMessage({type:"dump_near_data",message:"dump_near_data",data:n})}),"vii"),this.onDumpFarDataFunction=this.wasmInvoker.addFunction(((t,e)=>{const a=this.wasmInvoker.HEAPU8.subarray(t,t+e),n=new Uint8Array(a);this.node&&this.node.port&&this.node.port.postMessage({type:"dump_far_data",message:"dump_far_data",data:n})}),"vii"),this.onDumpMetaDataFunction=this.wasmInvoker.addFunction(((t,e)=>{const a=this.wasmInvoker.HEAPU8.subarray(t,t+e),n=new Uint8Array(a);this.node&&this.node.port&&this.node.port.postMessage({type:"dump_meta_data",message:"dump_meta_data",data:n})}),"vii"),this.wasmInvoker.__apm_dump_start(this.handle,this.onDumpOutputDataFunction,this.onDumpNearDataFunction,this.onDumpFarDataFunction,this.onDumpMetaDataFunction)}stopDump(){this.wasmInvoker.__apm_dump_stop(this.handle),this.wasmInvoker&&(this.wasmInvoker.removeFunction(this.onDumpOutputDataFunction),this.wasmInvoker.removeFunction(this.onDumpNearDataFunction),this.wasmInvoker.removeFunction(this.onDumpFarDataFunction),this.wasmInvoker.removeFunction(this.onDumpMetaDataFunction))}process(t,e,a){if(!this.inited||!this.isEnable){for(let e=0;e<this.channelCount;e++){a[e].set(t[e])}return}const n=this.channelCount;let s=0;if(this.handle&&this.isEnable){const i=t[0].length,o=[];for(let a=0;a<n;a++)e[a]&&e[a].length>0&&(s=1),o.push(t[a]||new Float32Array(i).fill(0)),o.push(e[a]||new Float32Array(i).fill(0));if(this._nearAudioBuffer.push(o),this._nearAudioBuffer.framesAvailable>=this.kernelBufferSize){this._nearAudioBuffer.pull(this._nearAudioBuffer.getChannelData()),this.wasmInvoker.__apm_process_new(this.handle,this._nearAudioBuffer.getHeapAddress(),this._outputAudioBuffer.getHeapAddress(),n,s);const t=this._outputAudioBuffer.getChannelData();this._outputAudioBuffer.push(t)}this._outputAudioBuffer.pull(a)}}}class r extends AudioWorkletProcessor{constructor(){super(),this.apm=new o(this),this.port.onmessage=t=>{const e=t.data||{};switch(a.log("onmessage data",e),e.type){case"init":this.apm.init(e);break;case"destroy":this.apm.destory();break;case"enable":this.apm.enable();break;case"disable":this.apm.disable();break;case"start_dump":this.apm.startDump();break;case"stop_dump":this.apm.stopDump();break;case"get_stat_data":this.apm.getStatData();break;default:a.warn("Unknown message type:",e.type)}}}process(t,e){const a=t[0],n=t.length>1?t[1]:[],s=e[0];return this.apm.process(a,n,s),!0}}registerProcessor("aliyun-web-3a-processor",r)}();\n'],{type:"application/javascript"}),h=URL.createObjectURL(d);yield this.audioContext.audioWorklet.addModule(h)}catch(d){s.error("Failed to add module to audio worklet:",d)}let a=new AudioWorkletNode(this.audioContext,"aliyun-web-3a-processor",{numberOfInputs:2,outputChannelCount:[o]});this.workletNode=a,e.connect(a),r&&(this.farNode=r,r.connect(a,0,1));const i=this.audioContext.createMediaStreamDestination();a.connect(i),this.targetMediaTrack=i.stream.getAudioTracks()[0],yield this.initWASM(a,o,l),this.statUpdateTimer=window.setInterval(()=>{this.getStatData()},this.statUpdateInterval)})}addFarNode(t){this.workletNode&&(this.farNode&&this.farNode.disconnect(this.workletNode),t&&(this.farNode=t,t.connect(this.workletNode,0,1)))}getStatData(){var t;try{(t=this.workletNode)===null||t===void 0||t.port.postMessage({type:"get_stat_data"})}catch(e){s.error("Failed to post message to worklet node:",e)}}destroy(){if(this.statUpdateTimer&&window.clearInterval(this.statUpdateTimer),this.audioContext&&this.workletNode&&this.workletNode.port)try{this.workletNode.port.postMessage({type:"destroy"}),this.workletNode.port.onmessage=null,this.workletNode.disconnect(),s.log("postMessage destroy")}catch(t){s.error("Failed to post message to worklet node:",t)}}startDump(){var t;try{(t=this.workletNode)===null||t===void 0||t.port.postMessage({type:"start_dump"})}catch(e){s.error("Failed to post message to worklet node:",e)}}stopDump(){var t;try{(t=this.workletNode)===null||t===void 0||t.port.postMessage({type:"stop_dump"})}catch(e){s.error("Failed to post message to worklet node:",e)}setTimeout(()=>{this.onDumpOutputData(null,!0),this.onDumpNearInputData(null,!0),this.onDumpFarInputData(null,!0),this.onDumpMeatData(null,!0)},3e3)}onDumpOutputData(t,e=!1){if(t&&t.length>0&&this.collectDumpOutputData.push(t),e&&this.collectDumpOutputData.length>0||1024*this.collectDumpOutputData.length>=this.getMaxDumpBytes()){let o=new Blob(this.collectDumpOutputData);this.onDumpData(o,"output_"+this.sampleRate+"hz_"+this.channelCount+"ch.pcm"),this.collectDumpOutputData=[]}}onDumpNearInputData(t,e=!1){if(t&&t.length>0&&this.collectDumpNearInputData.push(t),e&&this.collectDumpNearInputData.length>0||1024*this.collectDumpNearInputData.length>=this.getMaxDumpBytes()){let o=new Blob(this.collectDumpNearInputData);this.onDumpData(o,"near_input_"+this.sampleRate+"hz_"+this.channelCount+"ch.pcm"),this.collectDumpNearInputData=[]}}onDumpFarInputData(t,e=!1){if(t&&t.length>0&&this.collectDumpFarInputData.push(t),e&&this.collectDumpFarInputData.length>0||1024*this.collectDumpFarInputData.length>=this.getMaxDumpBytes()){let o=new Blob(this.collectDumpFarInputData);this.onDumpData(o,"far_input_"+this.sampleRate+"hz_"+this.channelCount+"ch.pcm"),this.collectDumpFarInputData=[]}}onDumpMeatData(t,e=!1){if(t&&t.length>0&&this.collectDumpMetaData.push(t),e&&this.collectDumpMetaData.length>0||1024*this.collectDumpMetaData.length>=this.getMaxDumpBytes()){let o=new Blob(this.collectDumpMetaData);this.onDumpData(o,"meta_"+this.sampleRate+"hz_"+this.channelCount+"ch.pcm"),this.collectDumpMetaData=[]}}getMaxDumpBytes(){return 600*Number(this.sampleRate.toFixed(0))*Number(this.channelCount.toFixed(0))*2}enable(){var t;if(!((t=this.workletNode)===null||t===void 0)&&t.port)try{this.workletNode.port.postMessage({type:"enable"}),s.log("postMessage enable")}catch(e){s.error("Failed to post message to worklet node:",e)}}disable(){var t;if(!((t=this.workletNode)===null||t===void 0)&&t.port)try{s.log("postMessage disable"),this.workletNode.port.postMessage({type:"disable"})}catch(e){s.error("Failed to post message to worklet node:",e)}}on(t,e){t==="loaderror"&&(this.onLoadError=e),t==="loadsuccess"&&(this.onLoadSuccess=e),t==="dumpdata"&&(this.onDumpData=e),t==="outputlog"&&(this.onOutputLog=e),t==="statdata"&&(this.onStatData=e)}onLoadError(t){console.log("onLoadError",t)}onLoadSuccess(t){console.log("onLoadSuccess",t)}onDumpData(t,e){console.log("onDumpData",t,e)}onOutputLog(t){console.log("[WASM]",t)}onStatData(t){console.log("onStatData:",t)}};var C=Object.defineProperty,M=(n,t,e)=>t in n?C(n,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):n[t]=e,p=(n,t,e)=>M(n,typeof t!="symbol"?t+"":t,e);const D=48e3;class N extends k{constructor(t){super("AliRtcAudioProcessPlugin",A.AliRtcSdkStreamTypeCapture,I.AUDIO),p(this,"audioProcessor"),p(this,"slsReporter"),p(this,"enableSoft3ACheck",!1),p(this,"useHardOnly",!1),p(this,"lastDiffOutputLog",""),p(this,"audioContext",new AudioContext({sampleRate:D})),p(this,"farNode"),p(this,"createNode",e=>this.audioContext.createMediaStreamSource(new MediaStream([e]))),this.options=t,this.slsReporter=t?.slsReporter,this.enableSoft3ACheck=t?.enableSoft3ACheck||!1,this.useHardOnly=t?.useHardOnly||!1,this.zIndex=7,document.addEventListener("click",this.activeAudioContext)}activeAudioContext(){this.audioContext?.resume(),document.removeEventListener("click",this.activeAudioContext)}audioUpdated(t){return this.lastInputAudioTrack?.id!==t.currentAudioTrack?.id}videoUpdated(t){return console.log("videoUpdated",t),!1}setOptions(t){this.farNode||!t.farMediaStream||(this.farNode=this.audioContext.createMediaStreamSource(t.farMediaStream),this.audioProcessor&&this.audioProcessor?.addFarNode(this.farNode),this.options={...this.options,...t})}isSupported(){return _.isSupported()}shouldUpdate(t){return!!(t.originAudioTrack&&!this.audioProcessor||!t.originAudioTrack&&this.audioProcessor)}async process(t){if(!t.currentAudioTrack){t.updateAudioTrack(),this.clear(t);return}if(!this.audioProcessor){this.audioProcessor=new _({aecOn:!0,ansOn:!0,agcOn:!0,dumpOn:this.options?.dumpAudioData||!1,aiaecOn:this.options.aiaecOn||!1,useHardOnly:this.useHardOnly,wasmCdnPath:this.options.wasmCdnPath||"https://g.alicdn.com/code/npm/@ali/aliyun-audio-3a/0.0.6/"}),this.audioProcessor.on("dumpdata",(o,l)=>{let r=3e3;l.includes("far")?r=5e3:l.includes("output")?r=1e4:l.includes("meta")&&(r=8e3),setTimeout(()=>{const a=URL.createObjectURL(o),i=document.createElement("a");i.href=a,i.download=l,document.body.appendChild(i),i.click(),document.body.removeChild(i)},r)}),this.audioProcessor.on("loadsuccess",()=>{this.enableSoft3ACheck||t.updateAudioTrack(this.audioProcessor?.targetMediaTrack),this.options.dumpAudioData&&this.audioProcessor?.startDump()}),this.audioProcessor.on("loaderror",o=>{this.emit("error",o)}),this.audioProcessor.on("outputlog",o=>{o?.includes("diff")&&(this.lastDiffOutputLog=o||"")}),this.audioProcessor.on("statdata",o=>{if(o)try{let l=o;if(this.lastDiffOutputLog){const r=this.extractDiffValue(this.lastDiffOutputLog),a=JSON.parse(o);r!==null&&(a.diff=r);const i=this.extractLeakValue(this.lastDiffOutputLog);i!==null&&(a.leak=i),l=JSON.stringify(a)}this.slsReporter?.reportPublishAudio3A("","","",l)}catch{}});const e=this.createNode(t.currentAudioTrack);await this.audioProcessor.createProcessor(this.audioContext,e,1,D,this.farNode)}}extractDiffValue(t){if(!t)return null;const e=t.match(/diff\s*=\s*(-?\d+\.?\d*)/);return e?parseFloat(e[1]):null}extractLeakValue(t){if(!t)return null;const e=t.match(/leak\s*=\s*(-?\d+\.?\d*)/);return e?parseFloat(e[1]):null}clear(t){this.options.dumpAudioData&&this.audioProcessor?.stopDump(),super.clear(t),this.audioProcessor?.destroy(),this.audioProcessor=void 0,document.removeEventListener("click",this.activeAudioContext),this.farNode?.disconnect(),this.farNode=void 0}dump(){this.audioProcessor?.stopDump()}}export{N as default};
1
+ import{o as k,m as A,A as I}from"./index-DBpkuGL4.js";import"eventemitter3";const b=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,10,1,8,0,65,0,253,15,253,98,11]));function m(n,t,e,o){return new(e||(e=Promise))(function(l,r){function a(h){try{d(o.next(h))}catch(u){r(u)}}function i(h){try{d(o.throw(h))}catch(u){r(u)}}function d(h){var u;h.done?l(h.value):(u=h.value,u instanceof e?u:new e(function(g){g(u)})).then(a,i)}d((o=o.apply(n,[])).next())})}typeof SuppressedError=="function"&&SuppressedError;var p;function f(){return m(this,void 0,void 0,function*(){let n=!1;try{n=yield b()}catch{n=!1}return console.log("isSupportedSIMD",n),n})}(function(n){n[n.ERROR=0]="ERROR",n[n.WARN=1]="WARN",n[n.INFO=2]="INFO",n[n.LOG=3]="LOG",n[n.DEBUG=4]="DEBUG"})(p||(p={}));class s{static error(...t){var e;s.logLevel>=p.ERROR&&((e=console.error)===null||e===void 0||e.call(console,`[${s.logTag}] `,...t))}static warn(...t){var e;s.logLevel>=p.WARN&&((e=console.warn)===null||e===void 0||e.call(console,`[${s.logTag}] `,...t))}static info(...t){var e;s.logLevel>=p.INFO&&((e=console.info)===null||e===void 0||e.call(console,`[${s.logTag}] `,...t))}static log(...t){var e;s.logLevel>=p.LOG&&((e=console.log)===null||e===void 0||e.call(console,`[${s.logTag}] `,...t))}static debug(...t){var e;s.logLevel>=p.DEBUG&&((e=console.debug)===null||e===void 0||e.call(console,`[${s.logTag}] `,...t))}}s.logLevel=p.WARN,s.logTag="aliyun-audio-3a";class O{}let _=class extends O{static isSupported(){return function(){if(typeof window=="object"&&window!==null){const t="AudioWorklet"in window,e="WebAssembly"in window;return t&&e}return!1}()}static isSupportedSIMD(){return m(this,void 0,void 0,function*(){return yield f()})}static setLogger(t){s.logLevel=t}constructor(t){super(),this.channelCount=1,this.sampleRate=48e3,this.collectDumpOutputData=[],this.collectDumpNearInputData=[],this.collectDumpFarInputData=[],this.collectDumpMetaData=[],this.statUpdateTimer=0,this.statUpdateInterval=5e3,this.options=Object.assign({aecOn:!0,ansOn:!0,agcOn:!0,hdOn:!1,ansMode:1,dumpOn:!1,aiaecOn:!1,wasmCdnPath:"https://g.alicdn.com/code/npm/@ali/aliyun-audio-3a/0.0.6/"},t||{})}initWASM(t,e,o){return m(this,void 0,void 0,function*(){s.log("initWASM",t,e,o);const l=a=>m(this,void 0,void 0,function*(){try{const i=yield fetch(a,{credentials:"same-origin"});return i.ok||this.onLoadError(new Error(`Failed to fetch WASM: ${i.status}:${i.statusText}, url:${a}`)),i.arrayBuffer()}catch(i){return this.onLoadError(new Error("WASM load error")),s.error("Error fetching WASM:",i),new Uint8Array(0)}}),r=a=>m(this,void 0,void 0,function*(){return fetch(a).then(i=>i.text())});try{const a=yield f(),i=this.options.wasmCdnPath+"audio_module_v2.wasm",d=this.options.wasmCdnPath+"audio_module_v2_simd.wasm",u=yield l(a?d:i),g=this.options.wasmCdnPath+"audio_module_v2.js",v=this.options.wasmCdnPath+"audio_module_v2_simd.js",w=a?v:g,y=yield r(w);t.port.postMessage(Object.assign({type:"init",channelCount:e,sampleRate:o,wasmBuffer:u,isSupportSIMD:a,audioModuleScript:y,logLevel:s.logLevel},this.options),[u])}catch(a){s.error("Error initializing WASM:",a),this.onLoadError(new Error("WASM init error"))}t.port.onmessage=a=>{a.data.type==="init_done"&&this.onLoadSuccess(void 0),a.data.type==="dump_output_data"&&this.onDumpOutputData(a.data.data),a.data.type==="dump_near_data"&&this.onDumpNearInputData(a.data.data),a.data.type==="dump_far_data"&&this.onDumpFarInputData(a.data.data),a.data.type==="dump_meta_data"&&this.onDumpMeatData(a.data.data),a.data.type==="output_log"&&this.onOutputLog(a.data.data),a.data.type==="apm_stat_data"&&this.onStatData(a.data.data)}})}createProcessor(t,e,o,l,r){return m(this,void 0,void 0,function*(){this.audioContext=t,this.audioContext.resume(),this.channelCount=o,this.sampleRate=l;try{const d=new Blob(['!function(){"use strict";function t(t,e,a,n){return new(a||(a=Promise))((function(s,i){function o(t){try{h(n.next(t))}catch(t){i(t)}}function r(t){try{h(n.throw(t))}catch(t){i(t)}}function h(t){var e;t.done?s(t.value):(e=t.value,e instanceof a?e:new a((function(t){t(e)}))).then(o,r)}h((n=n.apply(t,e||[])).next())}))}var e;"function"==typeof SuppressedError&&SuppressedError,function(t){t[t.ERROR=0]="ERROR",t[t.WARN=1]="WARN",t[t.INFO=2]="INFO",t[t.LOG=3]="LOG",t[t.DEBUG=4]="DEBUG"}(e||(e={}));class a{static error(...t){var n;a.logLevel>=e.ERROR&&(null===(n=console.error)||void 0===n||n.call(console,`[${a.logTag}] `,...t))}static warn(...t){var n;a.logLevel>=e.WARN&&(null===(n=console.warn)||void 0===n||n.call(console,`[${a.logTag}] `,...t))}static info(...t){var n;a.logLevel>=e.INFO&&(null===(n=console.info)||void 0===n||n.call(console,`[${a.logTag}] `,...t))}static log(...t){var n;a.logLevel>=e.LOG&&(null===(n=console.log)||void 0===n||n.call(console,`[${a.logTag}] `,...t))}static debug(...t){var n;a.logLevel>=e.DEBUG&&(null===(n=console.debug)||void 0===n||n.call(console,`[${a.logTag}] `,...t))}}a.logLevel=e.WARN,a.logTag="aliyun-audio-3a";const n=Float32Array.BYTES_PER_ELEMENT,s=Uint16Array.BYTES_PER_ELEMENT;class i{constructor(t,e,a,n,s){this._channelData=[],this._name=t,this._isInitialized=!1,this._module=e,this._length=a,this._ringLength=2*a,this._maxChannelCount=s?Math.min(s,32):n,this._channelCount=n,this._allocateHeap(),this._isInitialized=!0,this._readIndex=0,this._writeIndex=0,this._framesAvailable=0,this._channelDataLocal=[];for(let t=0;t<this._channelCount;++t)this._channelDataLocal[t]=new Float32Array(this._ringLength)}_allocateHeap(){const t=this._length*n,e=this._channelCount*t;this._dataPtr=this._module._malloc(e),this._channelData=[];for(let e=0;e<this._channelCount;++e){const a=this._dataPtr+e*t,n=a+t;this._channelData[e]=this._module.HEAPF32.subarray(a>>s,n>>s)}}adaptChannel(t){t<this._maxChannelCount&&(this._channelCount=t)}get length(){return this._isInitialized?this._length:null}get numberOfChannels(){return this._isInitialized?this._channelCount:null}get maxChannelCount(){return this._isInitialized?this._maxChannelCount:null}getChannelData(t){return void 0!==t&&t>=this._channelCount?null:void 0===t?this._channelData:this._channelData[t]}getHeapAddress(){return this._dataPtr}getPointer(){return this._dataPtr}free(){this._isInitialized=!1,null!==this._dataPtr&&this._module._free(this._dataPtr),this._channelData=[]}get framesAvailable(){return this._framesAvailable}push(t){const e=t[0].length;for(let a=0;a<e;++a){for(let e=0;e<this._channelCount;++e)this._channelDataLocal[e][this._writeIndex]=t[e][a];this._writeIndex=(this._writeIndex+1)%this._ringLength}this._framesAvailable+=e,this._framesAvailable>this._ringLength&&(console.warn(this._name,"Too many frames available, overflow"),this._framesAvailable=this._ringLength,this._writeIndex=0)}pull(t){if(0===this._framesAvailable)return void console.warn(this._name,"No frames available");const e=t[0].length;for(let a=0;a<e;++a){for(let e=0;e<this._channelCount;++e)t[e][a]=this._channelDataLocal[e][this._readIndex];this._readIndex=(this._readIndex+1)%this._ringLength}this._framesAvailable-=e,this._framesAvailable<0&&(this._framesAvailable=0,this._readIndex=0)}}class o{constructor(t){this.inited=!1,this.handle=null,this.channelCount=1,this.isEnable=!0,this.dumpAudioData=!1,this.kernelBufferSize=512,this.node=t,this.onDumpOutputDataFunction=null,this.onDumpNearDataFunction=null,this.onDumpFarDataFunction=null,this.onDumpMetaDataFunction=null,this.wasmInvoker=null,this._nearAudioBuffer={},this._outputAudioBuffer={}}destructor(){this.wasmInvoker=null,this.handle=null}init(n){return t(this,void 0,void 0,(function*(){const{wasmBuffer:t,audioModuleScript:s,channelCount:o=1,sampleRate:r=44100,dumpAudioData:h=!1,logLevel:l=e.DEBUG}=n;a.logLevel=l,a.log("AudioAPM init",JSON.stringify(n)),this.channelCount=o,this.dumpAudioData=h;try{const e=new Function(`let module={};let exports={};${s}; return module`)();this.wasmInvoker=yield e.exports({wasmBinary:t})}catch(t){this.node.port.postMessage({type:"error",message:"audioModule init error"}),a.error(t)}this._nearAudioBuffer=new i("inBuffer",this.wasmInvoker,this.kernelBufferSize,2*this.channelCount,32),this._outputAudioBuffer=new i("outBuffer",this.wasmInvoker,this.kernelBufferSize,this.channelCount,32);const u=this.wasmInvoker.addFunction(((t,e)=>{const a=this.wasmInvoker.HEAPU8.subarray(t,t+e),n=String.fromCharCode.apply(null,a);this.node&&this.node.port&&this.node.port.postMessage({type:"output_log",message:"output_log",data:n})}),"vii");if(this.wasmInvoker.__apm_log_callback(u),this.handle=this.wasmInvoker.__apm_create(n.aecOn?1:0,n.ansOn?1:0,n.agcOn?1:0,n.hdOn?1:0,r,o,n.dumpOn?1:0,this.kernelBufferSize),n.aiaecOn){const t=102;this.wasmInvoker.__apm_set_param(this.handle,t,7)}if(n.useHardOnly){const t=108;this.wasmInvoker.__apm_set_param(this.handle,t,1)}this.node.port.postMessage({type:"init_done",message:"init done"}),this.inited=!0}))}getStatData(){if(this.wasmInvoker&&this.isEnable){let t=this.wasmInvoker.__apm_get_stat(this.handle),e=this.wasmInvoker.UTF8ToString(t);this.wasmInvoker._free(t),this.node&&this.node.port&&this.node.port.postMessage({type:"apm_stat_data",message:"apm_stat_data",data:e})}}onOutputLog(t){console.log("[WASM_LOG]",t)}destory(){return t(this,void 0,void 0,(function*(){var t;try{null===(t=this.wasmInvoker)||void 0===t||t.__apm_destory(this.handle),this.inited=!1}catch(t){a.error(t)}finally{this.handle=null}}))}enable(){this.isEnable=!0,a.log("APM enable")}disable(){this.isEnable=!1,a.log("APM disable")}getStat(){if(null==this.wasmInvoker||null==this.handle)return"";let t=this.wasmInvoker.__apm_get_stat(this.handle),e=this.wasmInvoker.UTF8ToString(t);return this.wasmInvoker._free(t),e}startDump(){this.onDumpOutputDataFunction=this.wasmInvoker.addFunction(((t,e)=>{const a=this.wasmInvoker.HEAPU8.subarray(t,t+e),n=new Uint8Array(a);this.node&&this.node.port&&this.node.port.postMessage({type:"dump_output_data",message:"dump_output_data",data:n})}),"vii"),this.onDumpNearDataFunction=this.wasmInvoker.addFunction(((t,e)=>{const a=this.wasmInvoker.HEAPU8.subarray(t,t+e),n=new Uint8Array(a);this.node&&this.node.port&&this.node.port.postMessage({type:"dump_near_data",message:"dump_near_data",data:n})}),"vii"),this.onDumpFarDataFunction=this.wasmInvoker.addFunction(((t,e)=>{const a=this.wasmInvoker.HEAPU8.subarray(t,t+e),n=new Uint8Array(a);this.node&&this.node.port&&this.node.port.postMessage({type:"dump_far_data",message:"dump_far_data",data:n})}),"vii"),this.onDumpMetaDataFunction=this.wasmInvoker.addFunction(((t,e)=>{const a=this.wasmInvoker.HEAPU8.subarray(t,t+e),n=new Uint8Array(a);this.node&&this.node.port&&this.node.port.postMessage({type:"dump_meta_data",message:"dump_meta_data",data:n})}),"vii"),this.wasmInvoker.__apm_dump_start(this.handle,this.onDumpOutputDataFunction,this.onDumpNearDataFunction,this.onDumpFarDataFunction,this.onDumpMetaDataFunction)}stopDump(){this.wasmInvoker.__apm_dump_stop(this.handle),this.wasmInvoker&&(this.wasmInvoker.removeFunction(this.onDumpOutputDataFunction),this.wasmInvoker.removeFunction(this.onDumpNearDataFunction),this.wasmInvoker.removeFunction(this.onDumpFarDataFunction),this.wasmInvoker.removeFunction(this.onDumpMetaDataFunction))}process(t,e,a){if(!this.inited||!this.isEnable){for(let e=0;e<this.channelCount;e++){a[e].set(t[e])}return}const n=this.channelCount;let s=0;if(this.handle&&this.isEnable){const i=t[0].length,o=[];for(let a=0;a<n;a++)e[a]&&e[a].length>0&&(s=1),o.push(t[a]||new Float32Array(i).fill(0)),o.push(e[a]||new Float32Array(i).fill(0));if(this._nearAudioBuffer.push(o),this._nearAudioBuffer.framesAvailable>=this.kernelBufferSize){this._nearAudioBuffer.pull(this._nearAudioBuffer.getChannelData()),this.wasmInvoker.__apm_process_new(this.handle,this._nearAudioBuffer.getHeapAddress(),this._outputAudioBuffer.getHeapAddress(),n,s);const t=this._outputAudioBuffer.getChannelData();this._outputAudioBuffer.push(t)}this._outputAudioBuffer.pull(a)}}}class r extends AudioWorkletProcessor{constructor(){super(),this.apm=new o(this),this.port.onmessage=t=>{const e=t.data||{};switch(a.log("onmessage data",e),e.type){case"init":this.apm.init(e);break;case"destroy":this.apm.destory();break;case"enable":this.apm.enable();break;case"disable":this.apm.disable();break;case"start_dump":this.apm.startDump();break;case"stop_dump":this.apm.stopDump();break;case"get_stat_data":this.apm.getStatData();break;default:a.warn("Unknown message type:",e.type)}}}process(t,e){const a=t[0],n=t.length>1?t[1]:[],s=e[0];return this.apm.process(a,n,s),!0}}registerProcessor("aliyun-web-3a-processor",r)}();\n'],{type:"application/javascript"}),h=URL.createObjectURL(d);yield this.audioContext.audioWorklet.addModule(h)}catch(d){s.error("Failed to add module to audio worklet:",d)}let a=new AudioWorkletNode(this.audioContext,"aliyun-web-3a-processor",{numberOfInputs:2,outputChannelCount:[o]});this.workletNode=a,e.connect(a),r&&(this.farNode=r,r.connect(a,0,1));const i=this.audioContext.createMediaStreamDestination();a.connect(i),this.targetMediaTrack=i.stream.getAudioTracks()[0],yield this.initWASM(a,o,l),this.statUpdateTimer=window.setInterval(()=>{this.getStatData()},this.statUpdateInterval)})}addFarNode(t){this.workletNode&&(this.farNode&&this.farNode.disconnect(this.workletNode),t&&(this.farNode=t,t.connect(this.workletNode,0,1)))}getStatData(){var t;try{(t=this.workletNode)===null||t===void 0||t.port.postMessage({type:"get_stat_data"})}catch(e){s.error("Failed to post message to worklet node:",e)}}destroy(){if(this.statUpdateTimer&&window.clearInterval(this.statUpdateTimer),this.audioContext&&this.workletNode&&this.workletNode.port)try{this.workletNode.port.postMessage({type:"destroy"}),this.workletNode.port.onmessage=null,this.workletNode.disconnect(),s.log("postMessage destroy")}catch(t){s.error("Failed to post message to worklet node:",t)}}startDump(){var t;try{(t=this.workletNode)===null||t===void 0||t.port.postMessage({type:"start_dump"})}catch(e){s.error("Failed to post message to worklet node:",e)}}stopDump(){var t;try{(t=this.workletNode)===null||t===void 0||t.port.postMessage({type:"stop_dump"})}catch(e){s.error("Failed to post message to worklet node:",e)}setTimeout(()=>{this.onDumpOutputData(null,!0),this.onDumpNearInputData(null,!0),this.onDumpFarInputData(null,!0),this.onDumpMeatData(null,!0)},3e3)}onDumpOutputData(t,e=!1){if(t&&t.length>0&&this.collectDumpOutputData.push(t),e&&this.collectDumpOutputData.length>0||1024*this.collectDumpOutputData.length>=this.getMaxDumpBytes()){let o=new Blob(this.collectDumpOutputData);this.onDumpData(o,"output_"+this.sampleRate+"hz_"+this.channelCount+"ch.pcm"),this.collectDumpOutputData=[]}}onDumpNearInputData(t,e=!1){if(t&&t.length>0&&this.collectDumpNearInputData.push(t),e&&this.collectDumpNearInputData.length>0||1024*this.collectDumpNearInputData.length>=this.getMaxDumpBytes()){let o=new Blob(this.collectDumpNearInputData);this.onDumpData(o,"near_input_"+this.sampleRate+"hz_"+this.channelCount+"ch.pcm"),this.collectDumpNearInputData=[]}}onDumpFarInputData(t,e=!1){if(t&&t.length>0&&this.collectDumpFarInputData.push(t),e&&this.collectDumpFarInputData.length>0||1024*this.collectDumpFarInputData.length>=this.getMaxDumpBytes()){let o=new Blob(this.collectDumpFarInputData);this.onDumpData(o,"far_input_"+this.sampleRate+"hz_"+this.channelCount+"ch.pcm"),this.collectDumpFarInputData=[]}}onDumpMeatData(t,e=!1){if(t&&t.length>0&&this.collectDumpMetaData.push(t),e&&this.collectDumpMetaData.length>0||1024*this.collectDumpMetaData.length>=this.getMaxDumpBytes()){let o=new Blob(this.collectDumpMetaData);this.onDumpData(o,"meta_"+this.sampleRate+"hz_"+this.channelCount+"ch.pcm"),this.collectDumpMetaData=[]}}getMaxDumpBytes(){return 600*Number(this.sampleRate.toFixed(0))*Number(this.channelCount.toFixed(0))*2}enable(){var t;if(!((t=this.workletNode)===null||t===void 0)&&t.port)try{this.workletNode.port.postMessage({type:"enable"}),s.log("postMessage enable")}catch(e){s.error("Failed to post message to worklet node:",e)}}disable(){var t;if(!((t=this.workletNode)===null||t===void 0)&&t.port)try{s.log("postMessage disable"),this.workletNode.port.postMessage({type:"disable"})}catch(e){s.error("Failed to post message to worklet node:",e)}}on(t,e){t==="loaderror"&&(this.onLoadError=e),t==="loadsuccess"&&(this.onLoadSuccess=e),t==="dumpdata"&&(this.onDumpData=e),t==="outputlog"&&(this.onOutputLog=e),t==="statdata"&&(this.onStatData=e)}onLoadError(t){console.log("onLoadError",t)}onLoadSuccess(t){console.log("onLoadSuccess",t)}onDumpData(t,e){console.log("onDumpData",t,e)}onOutputLog(t){console.log("[WASM]",t)}onStatData(t){console.log("onStatData:",t)}};var C=Object.defineProperty,M=(n,t,e)=>t in n?C(n,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):n[t]=e,c=(n,t,e)=>M(n,typeof t!="symbol"?t+"":t,e);const D=48e3;class N extends k{constructor(t){super("AliRtcAudioProcessPlugin",A.AliRtcSdkStreamTypeCapture,I.AUDIO),c(this,"audioProcessor"),c(this,"slsReporter"),c(this,"enableSoft3ACheck",!1),c(this,"useHardOnly",!1),c(this,"lastDiffOutputLog",""),c(this,"audioContext",new AudioContext({sampleRate:D})),c(this,"farNode"),c(this,"activeAudioContext",()=>{this.audioContext?.resume(),document.removeEventListener("click",this.activeAudioContext)}),c(this,"createNode",e=>this.audioContext.createMediaStreamSource(new MediaStream([e]))),this.options=t,this.slsReporter=t?.slsReporter,this.enableSoft3ACheck=t?.enableSoft3ACheck||!1,this.useHardOnly=t?.useHardOnly||!1,this.zIndex=7,document.addEventListener("click",this.activeAudioContext)}audioUpdated(t){return this.lastInputAudioTrack?.id!==t.currentAudioTrack?.id}videoUpdated(t){return console.log("videoUpdated",t),!1}setOptions(t){this.farNode||!t.farMediaStream||(this.farNode=this.audioContext.createMediaStreamSource(t.farMediaStream),this.audioProcessor&&this.audioProcessor?.addFarNode(this.farNode),this.options={...this.options,...t})}isSupported(){return _.isSupported()}shouldUpdate(t){return!!(t.originAudioTrack&&!this.audioProcessor||!t.originAudioTrack&&this.audioProcessor)}async process(t){if(!t.currentAudioTrack){t.updateAudioTrack(),this.clear(t);return}if(!this.audioProcessor){this.audioProcessor=new _({aecOn:!0,ansOn:!0,agcOn:!0,dumpOn:this.options?.dumpAudioData||!1,aiaecOn:this.options.aiaecOn||!1,useHardOnly:this.useHardOnly,wasmCdnPath:this.options.wasmCdnPath||"https://g.alicdn.com/code/npm/@ali/aliyun-audio-3a/0.0.6/"}),this.audioProcessor.on("dumpdata",(o,l)=>{let r=3e3;l.includes("far")?r=5e3:l.includes("output")?r=1e4:l.includes("meta")&&(r=8e3),setTimeout(()=>{const a=URL.createObjectURL(o),i=document.createElement("a");i.href=a,i.download=l,document.body.appendChild(i),i.click(),document.body.removeChild(i)},r)}),this.audioProcessor.on("loadsuccess",()=>{this.enableSoft3ACheck||t.updateAudioTrack(this.audioProcessor?.targetMediaTrack),this.options.dumpAudioData&&this.audioProcessor?.startDump()}),this.audioProcessor.on("loaderror",o=>{this.emit("error",o)}),this.audioProcessor.on("outputlog",o=>{o?.includes("diff")&&(this.lastDiffOutputLog=o||"")}),this.audioProcessor.on("statdata",o=>{if(o)try{let l=o;if(this.lastDiffOutputLog){const r=this.extractDiffValue(this.lastDiffOutputLog),a=JSON.parse(o);r!==null&&(a.diff=r);const i=this.extractLeakValue(this.lastDiffOutputLog);i!==null&&(a.leak=i),l=JSON.stringify(a)}this.slsReporter?.reportPublishAudio3A("","","",l)}catch{}});const e=this.createNode(t.currentAudioTrack);await this.audioProcessor.createProcessor(this.audioContext,e,1,D,this.farNode)}}extractDiffValue(t){if(!t)return null;const e=t.match(/diff\s*=\s*(-?\d+\.?\d*)/);return e?parseFloat(e[1]):null}extractLeakValue(t){if(!t)return null;const e=t.match(/leak\s*=\s*(-?\d+\.?\d*)/);return e?parseFloat(e[1]):null}clear(t){this.options.dumpAudioData&&this.audioProcessor?.stopDump(),super.clear(t),this.audioProcessor?.destroy(),this.audioProcessor=void 0,document.removeEventListener("click",this.activeAudioContext),this.farNode?.disconnect(),this.farNode=void 0}dump(){this.audioProcessor?.stopDump()}}export{N as default};
@@ -1,7 +1,6 @@
1
1
  /// <reference types="dom-mediacapture-transform" />
2
2
 
3
3
  import { default as default_2 } from 'eventemitter3';
4
- import { default as default_3 } from '@aliyun-sls/web-track-browser';
5
4
  import { IProfile } from 'aliyun-rts-sdk';
6
5
  import { IStreamConfig } from 'aliyun-rts-sdk';
7
6
  import { ISubDeleteResult } from 'aliyun-peerconnection-core/dist/core';
@@ -200,6 +199,32 @@ declare class AliRtcEngine_2 extends default_2<AliRtcEngineEventListener> {
200
199
  * @param level
201
200
  */
202
201
  static setLogLevel(level: AliRtcLogLevel): void;
202
+ private static _instances;
203
+ private static _instanceCounter;
204
+ readonly instanceId: string;
205
+ private _globalEnv;
206
+ /**
207
+ * @brief 创建新的 AliRtcEngine 实例(多实例模式)
208
+ * @param config 实例配置
209
+ * @returns 新创建的 AliRtcEngine 实例
210
+ * @details 每次调用都会创建一个新的独立实例,适用于需要同时管理多个用户的场景
211
+ */
212
+ static createInstance(config?: AliRtcEngineConfig): AliRtcEngine_2;
213
+ /**
214
+ * @brief 获取所有活跃的实例
215
+ * @returns 实例列表
216
+ */
217
+ static getAllInstances(): AliRtcEngine_2[];
218
+ /**
219
+ * @brief 根据实例ID获取实例
220
+ * @param instanceId 实例ID
221
+ * @returns AliRtcEngine实例或undefined
222
+ */
223
+ static getInstanceById(instanceId: string): AliRtcEngine_2 | undefined;
224
+ /**
225
+ * @brief 销毁所有实例
226
+ */
227
+ static destroyAll(): Promise<void>;
203
228
  private static _instance?;
204
229
  /**
205
230
  * @brief 获取AliRtcEngine实例
@@ -247,10 +272,22 @@ declare class AliRtcEngine_2 extends default_2<AliRtcEngineEventListener> {
247
272
  static AliRtcDataMsgType: typeof AliRtcDataMsgType;
248
273
  /**
249
274
  * @brief 销毁 {@link AliRtcEngine}实例
250
- * @details 调用该方法将会释放所有内部使用的资源,当完成音视频通信之后都建议调用该方法释放实例.调用该方法后,你将不能再使用 {@link AliRtcEngine} 的其他方法和任何回调,如需要再次使用需要重新调用 {@link AliRtcEngine.getInstance} 方法创建一个新的实例。
275
+ * @details 调用该方法将会释放所有内部使用的资源,当完成音视频通信之后都建议调用该方法释放实例.调用该方法后,你将不能再使用 {@link AliRtcEngine} 的其他方法和任何回调,如需要再次使用需要重新调用 {@link AliRtcEngine.getInstance} 或 {@link AliRtcEngine.createInstance} 方法创建一个新的实例。
251
276
  * @note 该方法为同步调用,需要等待内部资源释放之后才能执行其他方法
252
277
  */
253
278
  destroy(): Promise<void>;
279
+ /**
280
+ * C1: 配置 tracer 的实例方法
281
+ * @param config 引擎配置
282
+ * @note tracer 是模块级的类包装器,只应由第一个实例配置一次
283
+ */
284
+ private configureTracer;
285
+ /**
286
+ * C2: 同步全局环境配置
287
+ * @details 在关键操作前调用此方法,确保该实例使用正确的环境配置
288
+ * 注意: AliRTS.ENV 是外部库的全局配置,多实例并发场景下可能存在竞争
289
+ */
290
+ private syncGlobalEnv;
254
291
  protected channelProfile: AliRtcSdkChannelProfile;
255
292
  protected clientRole: AliRtcSdkClientRole;
256
293
  protected signalingManager: SignalingManager;
@@ -261,6 +298,7 @@ declare class AliRtcEngine_2 extends default_2<AliRtcEngineEventListener> {
261
298
  protected connectState: AliRtcConnectionStatus;
262
299
  protected networkError: boolean;
263
300
  private _audioOnlyMode;
301
+ private _destroyed;
264
302
  private _authInfoWillExpireTimer;
265
303
  private _authInfoExpiredTimer;
266
304
  private _serverCheckAuthInfoTimestamp;
@@ -268,7 +306,7 @@ declare class AliRtcEngine_2 extends default_2<AliRtcEngineEventListener> {
268
306
  private _proxyAiTid;
269
307
  private _agentParam;
270
308
  sessionId?: string;
271
- constructor(config?: AliRtcEngineConfig | undefined);
309
+ constructor(config?: AliRtcEngineConfig | undefined, instanceId?: string);
272
310
  /**
273
311
  * 获取当前频道号,已经入会成功返回频道号,否则返回undefined
274
312
  */
@@ -1036,6 +1074,8 @@ declare interface AliRtcEngineConfig {
1036
1074
  webTrack?: boolean | AliRtcWebTrackConfig;
1037
1075
  maxSignalingReconnectDuration?: number;
1038
1076
  parameter?: Parameter;
1077
+ /** 多实例模式下的实例唯一标识 */
1078
+ instanceId?: string;
1039
1079
  }
1040
1080
 
1041
1081
  declare interface AliRtcEngineEventListener {
@@ -1240,6 +1280,14 @@ declare interface AliRtcEngineEventListener {
1240
1280
  * @note 当一端通过 {@link AliRtcEngine.sendMediaExtensionMsg} 发送信息后,其他端通过该回调接收数据
1241
1281
  */
1242
1282
  mediaExtensionMsgReceived: (uid: string, message: ArrayBuffer, payloadType: number) => void;
1283
+ /**
1284
+ * 全链路端到端延迟回调(cumuDelay)
1285
+ * @param uid 推流端用户ID
1286
+ * @param totalDelay 全链路总延迟(ms)
1287
+ * @param msid 媒体流标识,标识该延迟数据对应的具体视频轨道(如 'sophon_video_camera_large'、'sophon_video_screen_share')
1288
+ * @note 需通过 setParameter('{"net":{"cumuDelay":true}}') 开启,由推流端在视频帧中携带 SEI 数据(payloadType=99)
1289
+ */
1290
+ rtcCumuDelayReceived: (uid: string, msid: string, totalDelay: number) => void;
1243
1291
  /**
1244
1292
  * @brief 用户鉴权信息即将过期通知,收到后30秒鉴权过期
1245
1293
  * @note 该回调在鉴权信息30秒前触发,收到该回调后应该及时更新鉴权信息,参考 {@link AliRtcEngine.refreshAuthInfo:}
@@ -2329,6 +2377,7 @@ declare class BizControl extends default_2<BizControlListener> {
2329
2377
  * @ignore
2330
2378
  */
2331
2379
  static logName: string;
2380
+ _loggerInstanceId: string;
2332
2381
  protected self: LocalUser;
2333
2382
  protected userMap: RemoteUserMap;
2334
2383
  private usersViewMap;
@@ -2497,6 +2546,7 @@ declare interface BizControlConfig {
2497
2546
  slsReporter: SLSReporter;
2498
2547
  signalingManager: SignalingManager;
2499
2548
  parameter?: Parameter;
2549
+ instanceId?: string;
2500
2550
  }
2501
2551
 
2502
2552
  declare interface BizControlListener {
@@ -2723,6 +2773,70 @@ declare interface _LocalStreamConfig extends IStreamConfig {
2723
2773
  screenProfile?: string;
2724
2774
  }
2725
2775
 
2776
+ /**
2777
+ * P2 设计方案:getUserMedia 并发控制
2778
+ *
2779
+ * 背景:
2780
+ * getUserMedia() 是浏览器级别的全局资源,同一时间只能有一个活跃的获取操作。
2781
+ * 多实例同时调用 createLocalStream() 会导致并发竞争:
2782
+ * - Chrome: 后续请求返回 NotAllowedError
2783
+ * - Safari: 后续请求返回 NotReadableError
2784
+ * - Firefox: 后续请求排队但可能超时
2785
+ *
2786
+ * 设计方案 1:Promise 队列化
2787
+ * ```
2788
+ * class MediaAcquisitionQueue {
2789
+ * private static queue: Promise<any> = Promise.resolve();
2790
+ *
2791
+ * static async enqueue<T>(fn: () => Promise<T>): Promise<T> {
2792
+ * const prev = MediaAcquisitionQueue.queue;
2793
+ * let resolve: (v: T) => void;
2794
+ * MediaAcquisitionQueue.queue = new Promise(r => resolve = r as any);
2795
+ * await prev;
2796
+ * try {
2797
+ * const result = await fn();
2798
+ * resolve!(result);
2799
+ * return result;
2800
+ * } catch (e) {
2801
+ * resolve!(undefined as any);
2802
+ * throw e;
2803
+ * }
2804
+ * }
2805
+ * }
2806
+ * ```
2807
+ *
2808
+ * 设计方案 2:指数退避重试
2809
+ * ```
2810
+ * async function withRetry<T>(
2811
+ * fn: () => Promise<T>,
2812
+ * maxRetries = 3,
2813
+ * baseDelay = 100
2814
+ * ): Promise<T> {
2815
+ * for (let i = 0; i <= maxRetries; i++) {
2816
+ * try { return await fn(); }
2817
+ * catch (e) {
2818
+ * if (i === maxRetries) throw e;
2819
+ * if (isDeviceBusyError(e)) {
2820
+ * await delay(baseDelay * Math.pow(2, i));
2821
+ * } else { throw e; }
2822
+ * }
2823
+ * }
2824
+ * }
2825
+ * ```
2826
+ *
2827
+ * 设计方案 3:跨实例设备锁定(推荐组合使用方案 1 + 3)
2828
+ * - 维护全局设备占用注册表
2829
+ * - 请求前检查设备是否被其他实例占用
2830
+ * - 支持设备共享模式(多实例共用同一摄像头 track)
2831
+ *
2832
+ * 迁移路径:
2833
+ * 在 createLocalStream() 方法中将 AliRTS.createStream() 调用包装到队列中:
2834
+ * ```
2835
+ * localStream = await MediaAcquisitionQueue.enqueue(() =>
2836
+ * AliRTS.createStream({ audio, video, screen, ... })
2837
+ * );
2838
+ * ```
2839
+ */
2726
2840
  declare class LocalStreamManager extends default_2<LocalStreamManagerListener> {
2727
2841
  /**
2728
2842
  * @ignore
@@ -3067,26 +3181,35 @@ declare interface LocalUserConfig {
3067
3181
  /**
3068
3182
  * 日志埋点类,调用LogReporter进行日志埋点
3069
3183
  * 在入会之前,会将埋点缓存,入会后以每200ms一条的速度将缓存的埋点按顺序上报
3184
+ *
3185
+ * 多实例模式:使用共享的 Tracker 实例,避免并发请求过多导致 ERR_INSUFFICIENT_RESOURCES
3070
3186
  */
3071
3187
  declare class LogClient {
3072
- protected tracker?: default_3;
3188
+ private static sharedTrackers;
3189
+ private static sharedStsData;
3190
+ private static sharedStsExpiration;
3191
+ private static sharedUpdateTimers;
3192
+ private static sharedClientId;
3193
+ private static instanceCount;
3073
3194
  protected param?: any;
3074
3195
  protected msgCacheArr: any[];
3075
3196
  protected index: number;
3076
3197
  protected ntpClock: NTPClient;
3077
- private clientId;
3078
- private stsData?;
3079
- private stsExpiration;
3080
- private updateTaskTimer?;
3081
3198
  private globalEnv;
3199
+ private envKey;
3200
+ private stopped;
3082
3201
  constructor(globalEnv?: 'DEFAULT' | 'SEA');
3202
+ private get stsData();
3203
+ private set stsData(value);
3204
+ private get stsExpiration();
3205
+ private set stsExpiration(value);
3083
3206
  private createTracker;
3084
3207
  private startSTSUpdateTask;
3085
3208
  private refreshSTSToken;
3086
3209
  private requestSTSToken;
3087
3210
  start(info: AliRtcAuthInfo): void;
3088
3211
  /**
3089
- * 断开连接
3212
+ * 断开连接(幂等方法,重复调用不会出错)
3090
3213
  */
3091
3214
  stop(): void;
3092
3215
  /**
@@ -3150,10 +3273,12 @@ declare enum MsidType {
3150
3273
  }
3151
3274
 
3152
3275
  declare class NTPClient {
3153
- private static instance;
3276
+ private static instances;
3277
+ private static refCounts;
3154
3278
  private ntpClock;
3155
3279
  private constructor();
3156
- static getInstance(): NTPClient;
3280
+ static getInstance(globalEnv?: string): NTPClient;
3281
+ static releaseInstance(globalEnv?: string): void;
3157
3282
  now(): number;
3158
3283
  }
3159
3284
 
@@ -3677,6 +3802,8 @@ declare class RemoteUser extends User {
3677
3802
  streamInfo: RemoteStreamInfo;
3678
3803
  private _streamUrl;
3679
3804
  private parameter;
3805
+ private _audioResumeHandler;
3806
+ private _videoResumeHandler;
3680
3807
  private monitorTimerId?;
3681
3808
  private monitorDataCache;
3682
3809
  traceId: string;
@@ -3798,8 +3925,10 @@ declare class RemoteUser extends User {
3798
3925
  deleteOption: SubscribeOptions;
3799
3926
  };
3800
3927
  private handleAutoPlayFailed;
3928
+ private _removeAudioResumeHandler;
3801
3929
  private handleAudioPaused;
3802
3930
  private handleVideoPlayFailded;
3931
+ private _removeVideoResumeHandler;
3803
3932
  private playAudio;
3804
3933
  stopPlayAudio(): void;
3805
3934
  playAll(isScreen?: boolean, isReplace?: boolean): void;
@@ -3990,38 +4119,38 @@ declare class RoomServerMessageCenter extends default_2<RoomServerListener> {
3990
4119
  * 收到websocket连接成功的消息
3991
4120
  * ws连接建立成功后立刻发送join消息
3992
4121
  */
3993
- protected onOpen(): void;
4122
+ protected onOpen: () => void;
3994
4123
  /**
3995
4124
  * 收到业务信令消息
3996
4125
  * @param event
3997
4126
  */
3998
- protected onMessage(event: MessageEvent): void;
4127
+ protected onMessage: (event: MessageEvent) => void;
3999
4128
  /**
4000
4129
  * 收到错误消息
4001
4130
  * @param event
4002
4131
  */
4003
- protected onError(event: Event): void;
4132
+ protected onError: (event: Event) => void;
4004
4133
  /**
4005
4134
  * 连接失败
4006
4135
  */
4007
- protected onConnectFail(): void;
4136
+ protected onConnectFail: () => void;
4008
4137
  /**
4009
4138
  * 鉴权失败
4010
4139
  */
4011
- protected onAuthInvalid(): void;
4140
+ protected onAuthInvalid: () => void;
4012
4141
  /**
4013
4142
  * 网络异常
4014
4143
  */
4015
- protected onNetworkError(): void;
4144
+ protected onNetworkError: () => void;
4016
4145
  /**
4017
4146
  * 收到websocket断开消息
4018
4147
  * @param event
4019
4148
  */
4020
- protected onClose(event: CloseEvent): void;
4149
+ protected onClose: (event: CloseEvent) => void;
4021
4150
  protected onKeepAliveRsp(): void;
4022
- protected onWillReconnect(): void;
4023
- protected onReconnectStart(): void;
4024
- protected onReconnectFail(): void;
4151
+ protected onWillReconnect: () => void;
4152
+ protected onReconnectStart: () => void;
4153
+ protected onReconnectFail: () => void;
4025
4154
  /**
4026
4155
  * 处理 Keepalive 心跳,加速判断网络异常
4027
4156
  */
@@ -4440,6 +4569,7 @@ declare class SLSReporter {
4440
4569
  protected logClient: LogClient;
4441
4570
  protected authInfo?: AliRtcAuthInfo;
4442
4571
  private ntpClock;
4572
+ private globalEnv;
4443
4573
  constructor(engine: WrappedAliRtcEngine, globalEnv?: 'DEFAULT' | 'SEA');
4444
4574
  private customFields;
4445
4575
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aliyun-rtc-sdk",
3
- "version": "7.2.7",
3
+ "version": "7.2.8-beta.2",
4
4
  "type": "module",
5
5
  "description": "rtc web sdk of aliyun",
6
6
  "main": "dist/aliyun-rtc-sdk.umd.js",
@@ -10,7 +10,7 @@
10
10
  "@aliyun-sls/web-sts-plugin": "^0.3.5",
11
11
  "@aliyun-sls/web-track-browser": "^0.3.5",
12
12
  "aliyun-queen-engine": "^6.3.14",
13
- "aliyun-rts-sdk": "2.14.8",
13
+ "aliyun-rts-sdk": "2.15.0-beta.4",
14
14
  "crypto-js": "^4.1.1",
15
15
  "dateformat": "^5.0.3",
16
16
  "eventemitter3": "^5.0.1",