trtc-sdk-v5
Version:
Tencent Cloud RTC SDK for Web
1 lines • 45.6 kB
JavaScript
var __create=Object.create,__defProp=Object.defineProperty,__defProps=Object.defineProperties,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__getOwnPropDescs=Object.getOwnPropertyDescriptors,__getOwnPropNames=Object.getOwnPropertyNames,__getOwnPropSymbols=Object.getOwnPropertySymbols,__getProtoOf=Object.getPrototypeOf,__hasOwnProp=Object.prototype.hasOwnProperty,__propIsEnum=Object.prototype.propertyIsEnumerable,__defNormalProp=(e,t,i)=>t in e?__defProp(e,t,{enumerable:!0,configurable:!0,writable:!0,value:i}):e[t]=i,__spreadValues=(e,t)=>{for(var i in t||(t={}))__hasOwnProp.call(t,i)&&__defNormalProp(e,i,t[i]);if(__getOwnPropSymbols)for(var i of __getOwnPropSymbols(t))__propIsEnum.call(t,i)&&__defNormalProp(e,i,t[i]);return e},__spreadProps=(e,t)=>__defProps(e,__getOwnPropDescs(t)),__commonJS=(e,t)=>function(){return t||(0,e[__getOwnPropNames(e)[0]])((t={exports:{}}).exports,t),t.exports},__copyProps=(e,t,i,r)=>{if(t&&"object"==typeof t||"function"==typeof t)for(let o of __getOwnPropNames(t))__hasOwnProp.call(e,o)||o===i||__defProp(e,o,{get:()=>t[o],enumerable:!(r=__getOwnPropDesc(t,o))||r.enumerable});return e},__toESM=(e,t,i)=>(i=null!=e?__create(__getProtoOf(e)):{},__copyProps(!t&&e&&e.__esModule?i:__defProp(i,"default",{value:e,enumerable:!0}),e)),__decorateClass=(e,t,i,r)=>{for(var o,s=r>1?void 0:r?__getOwnPropDesc(t,i):t,a=e.length-1;a>=0;a--)(o=e[a])&&(s=(r?o(t,i,s):o(s))||s);return r&&s&&__defProp(t,i,s),s},__publicField=(e,t,i)=>__defNormalProp(e,"symbol"!=typeof t?t+"":t,i),require_eventemitter3=__commonJS({"../node_modules/.pnpm/eventemitter3@4.0.7/node_modules/eventemitter3/index.js"(e,t){"use strict";var i=Object.prototype.hasOwnProperty,r="~";function o(){}function s(e,t,i){this.fn=e,this.context=t,this.once=i||!1}function a(e,t,i,o,a){if("function"!=typeof i)throw new TypeError("The listener must be a function");var n=new s(i,o||e,a),c=r?r+t:t;return e._events[c]?e._events[c].fn?e._events[c]=[e._events[c],n]:e._events[c].push(n):(e._events[c]=n,e._eventsCount++),e}function n(e,t){0===--e._eventsCount?e._events=new o:delete e._events[t]}function c(){this._events=new o,this._eventsCount=0}Object.create&&(o.prototype=Object.create(null),(new o).__proto__||(r=!1)),c.prototype.eventNames=function(){var e,t,o=[];if(0===this._eventsCount)return o;for(t in e=this._events)i.call(e,t)&&o.push(r?t.slice(1):t);return Object.getOwnPropertySymbols?o.concat(Object.getOwnPropertySymbols(e)):o},c.prototype.listeners=function(e){var t=r?r+e:e,i=this._events[t];if(!i)return[];if(i.fn)return[i.fn];for(var o=0,s=i.length,a=new Array(s);o<s;o++)a[o]=i[o].fn;return a},c.prototype.listenerCount=function(e){var t=r?r+e:e,i=this._events[t];return i?i.fn?1:i.length:0},c.prototype.emit=function(e,t,i,o,s,a){var n=r?r+e:e;if(!this._events[n])return!1;var c,l,d=this._events[n],h=arguments.length;if(d.fn){switch(d.once&&this.removeListener(e,d.fn,void 0,!0),h){case 1:return d.fn.call(d.context),!0;case 2:return d.fn.call(d.context,t),!0;case 3:return d.fn.call(d.context,t,i),!0;case 4:return d.fn.call(d.context,t,i,o),!0;case 5:return d.fn.call(d.context,t,i,o,s),!0;case 6:return d.fn.call(d.context,t,i,o,s,a),!0}for(l=1,c=new Array(h-1);l<h;l++)c[l-1]=arguments[l];d.fn.apply(d.context,c)}else{var u,p=d.length;for(l=0;l<p;l++)switch(d[l].once&&this.removeListener(e,d[l].fn,void 0,!0),h){case 1:d[l].fn.call(d[l].context);break;case 2:d[l].fn.call(d[l].context,t);break;case 3:d[l].fn.call(d[l].context,t,i);break;case 4:d[l].fn.call(d[l].context,t,i,o);break;default:if(!c)for(u=1,c=new Array(h-1);u<h;u++)c[u-1]=arguments[u];d[l].fn.apply(d[l].context,c)}}return!0},c.prototype.on=function(e,t,i){return a(this,e,t,i,!1)},c.prototype.once=function(e,t,i){return a(this,e,t,i,!0)},c.prototype.removeListener=function(e,t,i,o){var s=r?r+e:e;if(!this._events[s])return this;if(!t)return n(this,s),this;var a=this._events[s];if(a.fn)a.fn!==t||o&&!a.once||i&&a.context!==i||n(this,s);else{for(var c=0,l=[],d=a.length;c<d;c++)(a[c].fn!==t||o&&!a[c].once||i&&a[c].context!==i)&&l.push(a[c]);l.length?this._events[s]=1===l.length?l[0]:l:n(this,s)}return this},c.prototype.removeAllListeners=function(e){var t;return e?(t=r?r+e:e,this._events[t]&&n(this,t)):(this._events=new o,this._eventsCount=0),this},c.prototype.off=c.prototype.removeListener,c.prototype.addListener=c.prototype.on,c.prefixed=r,c.EventEmitter=c,void 0!==t&&(t.exports=c)}}),StartValidateRule={name:"option",required:!0,properties:{view:{type:["string",HTMLElement],required:!0},url:{type:"string",required:!0},muted:{type:"boolean",required:!1},volume:{type:"number",required:!1},fillMode:{type:"string",required:!1,values:["contain","cover","fill"]},loggerConfig:{type:"object",required:!0,properties:{sdkAppId:{type:"number",required:!0},userId:{type:"string",required:!0}}},signalDomain:{type:["string","object"],required:!1}}},UpdateValidateRule={name:"option",required:!0,properties:{view:{type:["string",HTMLElement],required:!1},volume:{type:"number",required:!1},muted:{type:"boolean",required:!1},fillMode:{type:"string",required:!1,values:["contain","cover","fill"]},action:{type:"string",required:!1,values:["pause","resume"]},fullScreen:{type:"boolean",required:!1},pictureInPicture:{type:"boolean",required:!1}}},updateSdpForFirefox=e=>{if(!navigator.userAgent.includes("Firefox"))return e;const t=e.split("\r\n"),i=[],r=[];t.forEach(e=>{const t=e.toLowerCase();t.includes("a=rtpmap")&&t.includes("h264")&&i.push(e)}),i.length>1&&r.push(...i.slice(1));const o=r.map(e=>{const t=/a=rtpmap:(\d+)\s/.exec(e);return t&&t.length>1?t[1]:null}).filter(e=>null!==e),s=[];return t.forEach(e=>{let t=e;if(e.includes("a=setup")&&(t="a=setup:passive"),(e.includes("m=audio")||e.includes("m=video"))&&(t=e.split(" ").filter((e,t)=>t<3||!o.includes(e)).join(" ")),e.includes("a=fmtp")||e.includes("a=rtcp-fb")||e.includes("a=rtpmap")){const t=/a=(?:fmtp|rtcp-fb|rtpmap):(\d+)\s/.exec(e);if(t&&t.length>1&&o.includes(t[1]))return}s.push(t)}),s.join("\r\n")},updateSdpRestriction=e=>{const t=e.split("\r\n"),i=[];t.forEach(e=>{const t=e.toLowerCase();t.includes("a=rtpmap")&&t.includes("h264")&&i.push(e)});const r=i.map(e=>{const t=/a=rtpmap:(\d+)\s/.exec(e);return t&&t.length>1?t[1]:null}).filter(e=>null!==e),o=[];t.forEach(e=>{let t=e;if(e.includes("a=fmtp:111")&&(t=`${e};stereo=1`),e.includes("a=fmtp")){const i=/a=fmtp:(\d+)\s/.exec(e);i&&i.length>1&&r.includes(i[1])&&(t=`${e};sps-pps-idr-in-keyframe=1`)}o.push(t)});const s=o.join("\r\n");return updateSdpForFirefox(s)},urlAlphabet="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict",nanoid=(e=21)=>{let t="",i=crypto.getRandomValues(new Uint8Array(e|=0));for(;e--;)t+=urlAlphabet[63&i[e]];return t},isFunction=e=>"function"==typeof e,RETRY_STATE_NOT_START=0,RETRY_STATE_STARTED=1,RETRY_STATE_STOPPED=2;function promiseRetry({retryFunction:e,settings:t,onError:i,onRetrying:r,onRetryFailed:o,onRetrySuccess:s,context:a}){return function(...n){const{retries:c=5,timeout:l=1e3}=t;let d=0,h=-1,u=RETRY_STATE_NOT_START;const p=async(t,f)=>{const m=a||this;try{const i=await e.apply(m,n);d>0&&s&&s.call(this,d),d=0,t(i)}catch(e){const s=()=>{clearTimeout(h),d=0,u=RETRY_STATE_STOPPED,f(e)},a=()=>{u!==RETRY_STATE_STOPPED&&d<(isFunction(c)?c():c)?(d++,u=RETRY_STATE_STARTED,isFunction(r)&&r.call(this,d,s),h=window.setTimeout(()=>{h=-1,p(t,f)},isFunction(l)?l(d):l)):(s(),isFunction(o)&&o.call(this,e))};isFunction(i)?i.call(this,{error:e,retry:a,reject:f,retryFuncArgs:n,retriedCount:d}):a()}};return new Promise(p)}}var retry_default=promiseRetry,retryingMap=new WeakMap;function addPromiseRetry({settings:e={retries:5,timeout:2e3},onError:t,onRetrying:i,onRetryFailed:r}){return function(o,s,a){const n=retry_default({retryFunction:a.value,settings:e,onError({error:e,retry:i,reject:r,retryFuncArgs:a}){var n;t?t.call(this,e,()=>{var t;(null==(t=retryingMap.get(o))?void 0:t.has(s))?i():r(e)},r,a):(null==(n=retryingMap.get(o))?void 0:n.has(s))?i():r(e)},onRetrying(e,t){var r;isFunction(i)&&i.call(this,e,t),(null==(r=retryingMap.get(o))?void 0:r.has(s))&&(retryingMap.get(o).get(s).stopRetry=t)},onRetryFailed:r});return a.value=function(...e){const t=retryingMap.get(o);return t?t.set(s,{args:e}):retryingMap.set(o,new Map([[s,{args:e}]])),n.apply(this,e).finally(()=>{var e;return null==(e=retryingMap.get(o))?void 0:e.delete(s)})},a}}function removePromiseRetry({fnName:e,callback:t,validateArgs:i=!0}){return function(r,o,s){const a=s.value;return s.value=function(...o){var s,n;if(null==(s=retryingMap.get(r))?void 0:s.has(e)){const{stopRetry:s,args:a}=retryingMap.get(r).get(e);let c=!0;if(i)for(const e of a)if(!o.find(t=>t===e)){c=!1;break}c&&(t&&t.apply(this,o),s&&s(),null==(n=retryingMap.get(r))||n.delete(e))}return a.apply(this,o)},s}}var Stat=class{constructor(e,t){this.core=t,__publicField(this,"peerConnection"),__publicField(this,"audioTransceiver",null),__publicField(this,"videoTransceiver",null),__publicField(this,"timerId",null),__publicField(this,"callback",null),__publicField(this,"previousRawStats",null),__publicField(this,"_prevReportTime",0),__publicField(this,"_prevDecoderImplementation",""),__publicField(this,"_decodeMap",new Map),this.peerConnection=e,this.findTransceivers()}get statInterval(){return 0===this._prevReportTime?2:(Date.now()-this._prevReportTime)/1e3}findTransceivers(){const e=this.peerConnection.getTransceivers();for(const t of e)if(t.receiver&&t.receiver.track){const{track:e}=t.receiver;"audio"===e.kind?this.audioTransceiver=t:"video"===e.kind&&(this.videoTransceiver=t)}}start(e,t=2e3){this.stop(),this.callback=e,this.collectStats(),this.timerId=window.setInterval(()=>{this.collectStats()},t)}stop(){null!==this.timerId&&(clearInterval(this.timerId),this.timerId=null),this.callback=null,this.previousRawStats=null,this._prevReportTime=0}async collectStats(){if(this.callback)try{const e=await this.peerConnection.getStats(),t=new Set(["inbound-rtp","track","candidate-pair","media-source","codec"]),i=[];e.forEach(e=>t.has(e.type)&&i.push(e));const r=Date.now(),o=this.parseAudioStats(i),s=this.parseVideoStats(i),a=this.parseNetworkStats(i);this._prevReportTime=r,this.callback({audio:o,video:s,network:a})}catch(e){this.core.log.error("Failed to collect WebRTC stats:",e)}}getDifferenceValue(e,t){if(this.core.utils.isUndefined(e))return t;const i=(t||0)-e;return i<0?0:i}parseAudioStats(e){var t,i,r,o;const s={bitrate:0,volume:0,packetLossRate:0,jitterBufferDelay:0,bytesReceived:0,packetsReceived:0,packetsLost:0};for(const a of e){if("inbound-rtp"===a.type&&("audio"===a.mediaType||"audio"===a.kind)){if(s.bytesReceived=a.bytesReceived||0,s.packetsReceived=a.packetsReceived||0,s.packetsLost=a.packetsLost||0,this.previousRawStats&&this.previousRawStats.audio){const e=this.getDifferenceValue(this.previousRawStats.audio.bytesReceived,s.bytesReceived);s.bitrate=Math.round(8*e/this.statInterval/1e3)}const e=this.getDifferenceValue(null==(t=this.previousRawStats)?void 0:t.audio.packetsLost,s.packetsLost),o=this.getDifferenceValue(null==(i=this.previousRawStats)?void 0:i.audio.packetsReceived,s.packetsReceived)+e;if(o>0&&(s.packetLossRate=Math.round(e/o*100)),this.core.utils.isUndefined(a.audioLevel)||(s.volume=a.audioLevel||0),a.jitterBufferDelay&&a.jitterBufferEmittedCount){let{jitterBufferEmittedCount:e}=a,{jitterBufferDelay:t}=a;(null==(r=this.previousRawStats)?void 0:r.audio)&&(e=this.getDifferenceValue(this.previousRawStats.audio.jitterBufferEmittedCount,a.jitterBufferEmittedCount),t=this.getDifferenceValue(this.previousRawStats.audio.jitterBufferDelay,a.jitterBufferDelay)),e>0&&(s.jitterBufferDelay=Math.floor(t/e*1e3)),this.previousRawStats||this.initPreviousRawStats(),this.previousRawStats.audio.jitterBufferDelay=a.jitterBufferDelay,this.previousRawStats.audio.jitterBufferEmittedCount=a.jitterBufferEmittedCount}this.previousRawStats||this.initPreviousRawStats(),this.previousRawStats.audio.bytesReceived=s.bytesReceived,this.previousRawStats.audio.packetsReceived=s.packetsReceived,this.previousRawStats.audio.packetsLost=s.packetsLost}!this.core.utils.isUndefined(a.audioLevel)&&(null==(o=this.audioTransceiver)?void 0:o.receiver.track)&&a.trackIdentifier===this.audioTransceiver.receiver.track.id&&(s.volume=a.audioLevel||0)}return s}parseVideoStats(e){var t,i,r,o,s;const a={bitrate:0,frameRate:0,width:0,height:0,packetLossRate:0,jitterBufferDelay:0,bytesReceived:0,packetsReceived:0,packetsLost:0,framesDecoded:0};for(const n of e){if("codec"===n.type&&this._decodeMap.set(n.id,n),"inbound-rtp"===n.type&&("video"===n.mediaType||"video"===n.kind)){if(a.bytesReceived=n.bytesReceived||0,a.packetsReceived=n.packetsReceived||0,a.packetsLost=n.packetsLost||0,a.framesDecoded=n.framesDecoded||0,this.core.utils.isUndefined(n.framesPerSecond)||(a.frameRate=Math.round(n.framesPerSecond)),n.decoderImplementation&&this._prevDecoderImplementation!==n.decoderImplementation){const e=this._decodeMap.get(n.codecId),i=(null==(t=null==e?void 0:e.mimeType)?void 0:t.split("/")[1])||"unknown",r=n.powerEfficientDecoder;this.core.log.info(`decoderImplementation change to ${n.decoderImplementation}(${i}) HWDecoder: ${r}`),this._prevDecoderImplementation=n.decoderImplementation}if(this.previousRawStats&&this.previousRawStats.video){const e=this.getDifferenceValue(this.previousRawStats.video.bytesReceived,a.bytesReceived);a.bitrate=Math.round(8*e/this.statInterval/1e3)}const e=this.getDifferenceValue(null==(i=this.previousRawStats)?void 0:i.video.packetsLost,a.packetsLost),s=this.getDifferenceValue(null==(r=this.previousRawStats)?void 0:r.video.packetsReceived,a.packetsReceived)+e;if(s>0&&(a.packetLossRate=Math.round(e/s*100)),n.jitterBufferDelay&&n.jitterBufferEmittedCount){let{jitterBufferEmittedCount:e}=n,{jitterBufferDelay:t}=n;(null==(o=this.previousRawStats)?void 0:o.video)&&(e=this.getDifferenceValue(this.previousRawStats.video.jitterBufferEmittedCount,n.jitterBufferEmittedCount),t=this.getDifferenceValue(this.previousRawStats.video.jitterBufferDelay,n.jitterBufferDelay)),e>0&&(a.jitterBufferDelay=Math.floor(t/e*1e3)),this.previousRawStats||this.initPreviousRawStats(),this.previousRawStats.video.jitterBufferDelay=n.jitterBufferDelay,this.previousRawStats.video.jitterBufferEmittedCount=n.jitterBufferEmittedCount}this.previousRawStats||this.initPreviousRawStats(),this.previousRawStats.video.bytesReceived=a.bytesReceived,this.previousRawStats.video.packetsReceived=a.packetsReceived,this.previousRawStats.video.packetsLost=a.packetsLost}!this.core.utils.isUndefined(n.frameWidth)&&(null==(s=this.videoTransceiver)?void 0:s.receiver.track)&&n.trackIdentifier===this.videoTransceiver.receiver.track.id&&(a.width=n.frameWidth,a.height=n.frameHeight)}return a}parseNetworkStats(e){const t={rtt:0};for(const i of e)if("candidate-pair"===i.type){if((i.selected||"succeeded"===i.state)&&this.core.utils.isNumber(i.currentRoundTripTime)){t.rtt=Math.floor(1e3*i.currentRoundTripTime);break}}return t}initPreviousRawStats(){this.previousRawStats={timestamp:Date.now(),audio:{bytesReceived:0,packetsReceived:0,packetsLost:0},video:{bytesReceived:0,packetsReceived:0,packetsLost:0}}}},import_eventemitter3=__toESM(require_eventemitter3(),1),instance=Symbol("instance"),abortCtrl=Symbol("abortCtrl"),cacheResult=Symbol("cacheResult"),MiddleState=class{constructor(e,t,i){this.oldState=e,this.newState=t,this.action=i,this.aborted=!1}abort(e){this.aborted=!0,setState.call(e,this.oldState,new Error(`action '${this.action}' aborted`))}toString(){return`${this.action}ing`}},FSMError=class extends Error{constructor(e,t,i){super(t),this.state=e,this.message=t,this.cause=i}};function thenAble(e){return"object"==typeof e&&e&&"then"in e}var stateDiagram=new Map;function ChangeState(e,t,i={}){return(r,o,s)=>{const a=i.action||o;if(!i.context){const i=stateDiagram.get(r)||[];stateDiagram.has(r)||stateDiagram.set(r,i),i.push({from:e,to:t,action:a})}const n=s.value;s.value=function(...r){let o=this;if(i.context&&(o=FSM.get("function"==typeof i.context?i.context.call(this,...r):i.context)),o.state===t)return i.sync?o[cacheResult]:Promise.resolve(o[cacheResult]);o.state instanceof MiddleState&&o.state.action==i.abortAction&&o.state.abort(o);let s=null;Array.isArray(e)?0==e.length?o.state instanceof MiddleState&&o.state.abort(o):"string"==typeof o.state&&e.includes(o.state)||(s=new FSMError(o._state,`${o.name} ${a} to ${t} failed: current state ${o._state} not from ${e.join("|")}`)):e!==o.state&&(s=new FSMError(o._state,`${o.name} ${a} to ${t} failed: current state ${o._state} not from ${e}`));const c=e=>{if(i.fail&&i.fail.call(this,e),i.sync){if(i.ignoreError)return e;throw e}return i.ignoreError?Promise.resolve(e):Promise.reject(e)};if(s)return c(s);const l=o.state,d=new MiddleState(l,t,a);setState.call(o,d);const h=e=>{var r;return o[cacheResult]=e,d.aborted||(setState.call(o,t),null===(r=i.success)||void 0===r||r.call(this,o[cacheResult])),e},u=e=>(setState.call(o,l,e),c(e));try{const e=n.apply(this,r);return thenAble(e)?e.then(h).catch(u):i.sync?h(e):Promise.resolve(h(e))}catch(i){return u(new FSMError(o._state,`${o.name} ${a} from ${e} to ${t} failed: ${i}`,i instanceof Error?i:new Error(String(i))))}}}}var sendDevTools=(()=>{const e="undefined"!=typeof window&&window.__AFSM__,t="undefined"!=typeof importScripts;return e?(e,t)=>{window.dispatchEvent(new CustomEvent(e,{detail:t}))}:t?(e,t)=>{postMessage({type:e,payload:t})}:()=>{}})();function setState(e,t){const i=this._state;this._state=e;const r=e.toString();e&&this.emit(r,i),this.emit(FSM.STATECHANGED,e,i,t),this.updateDevTools({value:e,old:i,err:t instanceof Error?t.message:String(t)})}var FSM=class e extends import_eventemitter3.default{constructor(t,i,r){super(),this.name=t,this.groupName=i,this._state=e.INIT,t||(t=Date.now().toString(36)),r?Object.setPrototypeOf(this,r):r=Object.getPrototypeOf(this),i||(this.groupName=this.constructor.name);const o=r[instance];o?this.name=o.name+"-"+o.count++:r[instance]={name:this.name,count:0},this.updateDevTools({diagram:this.stateDiagram})}get stateDiagram(){const e=Object.getPrototypeOf(this),t=stateDiagram.get(e)||[];let i=new Set,r=[],o=[];const s=new Set,a=Object.getPrototypeOf(e);stateDiagram.has(a)&&(a.stateDiagram.forEach(e=>i.add(e)),a.allStates.forEach(e=>s.add(e))),t.forEach(({from:e,to:t,action:i})=>{"string"==typeof e?r.push({from:e,to:t,action:i}):e.length?e.forEach(e=>{r.push({from:e,to:t,action:i})}):o.push({to:t,action:i})}),r.forEach(({from:e,to:t,action:r})=>{s.add(e),s.add(t),s.add(r+"ing"),i.add(`${e} --\x3e ${r}ing : ${r}`),i.add(`${r}ing --\x3e ${t} : ${r} 🟢`),i.add(`${r}ing --\x3e ${e} : ${r} 🔴`)}),o.forEach(({to:e,action:t})=>{i.add(`${t}ing --\x3e ${e} : ${t} 🟢`),s.forEach(r=>{r!==e&&i.add(`${r} --\x3e ${t}ing : ${t}`)})});const n=[...i];return Object.defineProperties(e,{stateDiagram:{value:n},allStates:{value:s}}),n}static get(t){let i;return"string"==typeof t?(i=e.instances.get(t),i||e.instances.set(t,i=new e(t,void 0,Object.create(e.prototype)))):(i=e.instances2.get(t),i||e.instances2.set(t,i=new e(t.constructor.name,void 0,Object.create(e.prototype)))),i}static getState(t){var i;return null===(i=e.get(t))||void 0===i?void 0:i.state}updateDevTools(t={}){sendDevTools(e.UPDATEAFSM,Object.assign({name:this.name,group:this.groupName},t))}get state(){return this._state}set state(e){setState.call(this,e)}};FSM.STATECHANGED="stateChanged",FSM.UPDATEAFSM="updateAFSM",FSM.INIT="[*]",FSM.ON="on",FSM.OFF="off",FSM.instances=new Map,FSM.instances2=new WeakMap;var Player=class extends FSM{constructor(e,t){super(),this.core=e,__publicField(this,"audioPlayer"),__publicField(this,"videoPlayer"),__publicField(this,"callback"),__publicField(this,"avPlayerStateSyncManager"),__publicField(this,"_log"),__publicField(this,"_videoPlayerLog"),__publicField(this,"_audioPlayerLog"),__publicField(this,"lastPausedReason"),__publicField(this,"muted",!1),this._log=t,this._videoPlayerLog=this._log.createChild({id:"vp"}),this._audioPlayerLog=this._log.createChild({id:"ap"}),this.videoPlayer=new e.VideoPlayer({id:"vp",log:this._videoPlayerLog,track:null,muted:!1,container:null,enableLogTrackState:!0}),this.audioPlayer=new e.RemoteAudioPlayer({id:"ap",log:this._audioPlayerLog,track:null,muted:!1,container:null,enableVolumeControlInIOS:!0,enableLogTrackState:!0}),this.audioPlayer.on(e.PlayerEvent.AUTOPLAY_FAILED,e=>this.handleAutoPlayFailed(this.audioPlayer,e)),this.videoPlayer.on(e.PlayerEvent.LOAD_START,()=>this.handleLoadStart("video")),this.audioPlayer.on(e.PlayerEvent.LOAD_START,()=>this.handleLoadStart("audio")),this.videoPlayer.on(e.PlayerEvent.PLAYER_STATE_CHANGED,this.handlePlayerStateChanged,this),this.audioPlayer.on(e.PlayerEvent.PLAYER_STATE_CHANGED,this.handlePlayerStateChanged,this),this.videoPlayer.on(e.PlayerEvent.ENTER_PICTURE_IN_PICTURE,this.handleEnterPictureInPicture,this),this.videoPlayer.on(e.PlayerEvent.LEAVE_PICTURE_IN_PICTURE,this.handleLeavePictureInPicture,this),this.videoPlayer.on(e.PlayerEvent.ENTER_FULL_SCREEN,this.handleEnterFullScreen,this),this.videoPlayer.on(e.PlayerEvent.LEAVE_FULL_SCREEN,this.handleLeaveFullScreen,this),this.avPlayerStateSyncManager=new e.AVPlayerStateSyncManager({log:this._log,audioPlayer:this.audioPlayer,videoPlayer:this.videoPlayer})}get isPlaying(){return this.videoPlayer.isPlaying&&this.audioPlayer.isPlaying}get isPaused(){return this.videoPlayer.isPaused&&this.audioPlayer.isPaused}get isStopped(){return this.videoPlayer.isStopped&&this.audioPlayer.isStopped}setCallback(e){this.callback=e}updateLogConfig(e){this._audioPlayerLog.setSdkAppId(e.sdkAppId),this._audioPlayerLog.setUserId(e.userId),this._videoPlayerLog.setSdkAppId(e.sdkAppId),this._videoPlayerLog.setUserId(e.userId)}handleLoadStart(e){this.onLoadStart()}handlePlayerStateChanged(e){"PLAYING"===e.state&&this.isPlaying&&this.onPlaying(),"PAUSED"===e.state&&this.isPaused&&this.onPaused(e.reason),"STOPPED"===e.state&&this.isStopped&&this.onStopped()}async handleEnterPictureInPicture(){var e,t;await this.videoPlayer.enterPIPPromise,null==(t=null==(e=this.callback)?void 0:e.onPictureInPictureStateChanged)||t.call(e,{isPictureInPicture:!0,pictureInPictureWindow:this.videoPlayer.pipWindow})}handleLeavePictureInPicture(){var e,t;null==(t=null==(e=this.callback)?void 0:e.onPictureInPictureStateChanged)||t.call(e,{isPictureInPicture:!1})}handleEnterFullScreen(){var e,t;null==(t=null==(e=this.callback)?void 0:e.onFullScreenStateChanged)||t.call(e,{isFullScreen:!0})}handleLeaveFullScreen(){var e,t;null==(t=null==(e=this.callback)?void 0:e.onFullScreenStateChanged)||t.call(e,{isFullScreen:!1})}onLoadStart(){}onPlaying(){}onPaused(e){this.lastPausedReason=e}onStopped(){}setVideoContainer(e){if(this.core.utils.isString(e)){const t=document.getElementById(e);t&&this.videoPlayer.setContainer(t)}else this.videoPlayer.setContainer(e)}setVolume(e){this.core.utils.isUndefined(e)||this.audioPlayer.setVolume(e/100)}setMuted(e){this.core.utils.isUndefined(e)||(this.muted=e,this.audioPlayer.setMuted(e))}setFillMode(e){e&&this.videoPlayer.setObjectFit(e)}setAudioTrack(e){this.audioPlayer.setTrack(e)}setVideoTrack(e){this.videoPlayer.setTrack(e)}async play(){const e=this.videoPlayer.play().catch(e=>{this.handleAutoPlayFailed(this.videoPlayer,e,"video")}),t=this.audioPlayer.play().catch(e=>{this.handleAutoPlayFailed(this.audioPlayer,e)});await Promise.all([e,t])}handleAutoPlayFailed(e,t,i="audio"){var r,o;this._log.warn("handleAutoPlayFailed",t);const s=()=>{this.audioPlayer.resume().then(()=>{document.removeEventListener("click",s,!0)})};document.addEventListener("click",s,!0),null==(o=null==(r=this.callback)?void 0:r.onAutoPlayFailed)||o.call(r,{type:i,resume:()=>e.resume()})}pause(){this.videoPlayer.pause(!0),this.audioPlayer.setMuted(!0),this.audioPlayer.pause()}resume(){this.videoPlayer.resume(!0),this.audioPlayer.setMuted(this.muted),this.audioPlayer.resume()}async enterFullscreen(){await this.videoPlayer.enterFullscreen()}async exitFullscreen(){await this.videoPlayer.exitFullscreen()}async enterPictureInPicture(){await this.videoPlayer.enterPictureInPicture()}async exitPictureInPicture(){await this.videoPlayer.exitPictureInPicture()}stop(){this.videoPlayer&&this.videoPlayer.stop(),this.audioPlayer&&(this.audioPlayer.stop(),this.audioPlayer.setMuted(!1))}};__decorateClass([ChangeState([FSM.INIT,"PAUSED"],"LOADSTART",{ignoreError:!0,sync:!0,success(){var e,t;null==(t=null==(e=this.callback)?void 0:e.onLoadStart)||t.call(e)},fail(e){this._log.warn("onLoadStart",e)}})],Player.prototype,"onLoadStart",1),__decorateClass([ChangeState(["LOADSTART","PAUSED"],"PLAYING",{ignoreError:!0,sync:!0,success(){var e,t;null==(t=null==(e=this.callback)?void 0:e.onPlaying)||t.call(e)},fail(e){this._log.warn("onPlaying",e)}})],Player.prototype,"onPlaying",1),__decorateClass([ChangeState("PLAYING","PAUSED",{ignoreError:!0,sync:!0,success(){var e,t;null==(t=null==(e=this.callback)?void 0:e.onPaused)||t.call(e,{reason:this.lastPausedReason})},fail(e){this._log.warn("onPaused",e)}})],Player.prototype,"onPaused",1),__decorateClass([ChangeState([],FSM.INIT,{ignoreError:!0,sync:!0,success(){var e,t;null==(t=null==(e=this.callback)?void 0:e.onStopped)||t.call(e)},fail(e){this._log.warn("onStopped",e)}})],Player.prototype,"onStopped",1);var player_default=Player,SIGNAL_DOMAIN_NAME_LIST=["overseas-webrtc.tlivewebrtc.com","oswebrtc-lint.tliveplay.com"],_LEBPlayer=class e{constructor(e){this.core=e,__publicField(this,"_sdkAppId"),__publicField(this,"_userId"),__publicField(this,"connectedRoomIdSet",new Set),__publicField(this,"updateSeq",0),__publicField(this,"_log"),__publicField(this,"player"),__publicField(this,"peerConnection"),__publicField(this,"svrSig"),__publicField(this,"streamURL"),__publicField(this,"signalURL"),__publicField(this,"insertableStreamsAbortMap",new Map),__publicField(this,"scriptTransformWorker"),__publicField(this,"scriptTransformWorkerPromise"),__publicField(this,"connectionState","disconnected"),__publicField(this,"isStarted",!1),__publicField(this,"isStopped",!0),__publicField(this,"isReconnecting",!1),__publicField(this,"callback"),__publicField(this,"isFireWallErrorEmitted",!1),__publicField(this,"stat"),__publicField(this,"isH264DecodeSupported"),__publicField(this,"signalConfig",{protocol:"https",domain:"",query:!0}),__publicField(this,"connectionTimeoutId"),__publicField(this,"streamHealthCheckTimeoutId"),__publicField(this,"streamHealthCheckReject"),e.loggerManager.startUpload(),this._log=this.core.log.createChild({id:`${this.getAlias()}`}),this.player=new player_default(e,this._log),e.innerEmitter.on(e.INNER_EVENT.SEI_MESSAGE,this.onSEIMessage,this)}getName(){return e.Name}getAlias(){return"LEB"}getGroup(){return""}getValidateRule(e){switch(e){case"start":return StartValidateRule;case"update":case"stop":return{}}}get enableSEI(){return this.core.room.enableSEI&&(this.core.rtcDectection.IS_INSERTABLE_STREAM_SUPPORTED||this.core.rtcDectection.IS_SCRIPT_TRANSFORM_SUPPORTED)}wrapCallback(e){if(!e)return;const t={},i=["onStats","onSEIMessage"];for(const r of Object.keys(e)){const o=e[r];"function"==typeof o&&(i.includes(r)?t[r]=o:t[r]=(...e)=>(this._log.debug(`callback ${r} called`,e.length>0?e[0]:""),o(...e)))}return t}async start(e){var t;this.isStopped=!1;const{view:i,url:r,volume:o,muted:s,fillMode:a,loggerConfig:n,callback:c,signalDomain:l}=e;if(this.callback=this.wrapCallback(c),void 0!==l){if("string"==typeof l)this.signalConfig=__spreadProps(__spreadValues({},this.signalConfig),{domain:l});else{const{protocol:e,domain:t,query:i}=l;this.signalConfig={protocol:e&&["https","http"].includes(e)?e:"https",domain:t||"",query:void 0===i||i}}this._log.info("signalConfig",JSON.stringify(this.signalConfig))}this.player.setCallback(this.callback);const{errorModule:{RtcError:d,ErrorCode:h,ErrorCodeDictionary:u},loggerManager:p,rtcDectection:f}=this.core;if(this._sdkAppId=n.sdkAppId,this._userId=n.userId,this._log.setSdkAppId(n.sdkAppId),this._log.setUserId(n.userId),this.player.updateLogConfig(n),p.addJoinedUser(n),!f.isWebRTCSupported()||!f.isAddTransceiverSupported())throw new d({code:h.ENV_NOT_SUPPORTED,extraCode:u.NOT_SUPPORTED_WEBRTC,message:"webrtc not supported"});if(!(await f.decodeSupportStatus()).isH264DecodeSupported||!1===this.isH264DecodeSupported)throw this.isH264DecodeSupported=!1,new d({code:h.ENV_NOT_SUPPORTED,extraCode:u.NOT_SUPPORTED_H264_DECODE,message:"h264 not supported"});!f.IS_SEI_SUPPORTED&&(null==c?void 0:c.onSEIMessage)&&(null==(t=c.onError)||t.call(c,new d({code:h.ENV_NOT_SUPPORTED,extraCode:u.NOT_SUPPORTED_SEI,message:"sei not supported"}))),this.player.setVideoContainer(i),this.player.setMuted(s),this.player.setFillMode(a);try{await this.connect(r),this.stat=new Stat(this.peerConnection,this.core),this.stat.start(e=>{var t,i;return null==(i=null==(t=this.callback)?void 0:t.onStats)?void 0:i.call(t,e)});const e=this.player.play();this.player.setVolume(o);const t=this.createStreamHealthCheckPromise();await Promise.race([e,t]),this.clearStreamHealthCheck(),this.isStarted=!0}catch(e){throw this.stop(),e}}async update(e){const{view:t,url:i,volume:r,muted:o,fillMode:s,action:a,fullScreen:n,pictureInPicture:c}=e;i&&i!==this.streamURL&&await this.switchStream(i),this.player.setMuted(o),this.player.setVolume(r),this.player.setFillMode(s),t&&this.player.videoPlayer.setContainer(this.core.utils.isString(t)?document.getElementById(t):t),"pause"===a?this.player.pause():"resume"===a&&this.player.resume(),this.core.utils.isBoolean(n)&&(n?await this.player.enterFullscreen():await this.player.exitFullscreen()),this.core.utils.isBoolean(c)&&(c?await this.player.enterPictureInPicture():await this.player.exitPictureInPicture())}async switchStream(e){this._log.info("switchStream",e);const t=this.peerConnection,i=this.streamURL,r=this.signalURL,o=this.svrSig,s=new Map(this.insertableStreamsAbortMap),a=this.player;delete this.peerConnection,delete this.streamURL,delete this.signalURL,delete this.svrSig,this.insertableStreamsAbortMap.clear();const n=new player_default(this.core,this._log);n.setVideoContainer(a.videoPlayer.container),n.setFillMode(a.videoPlayer.objectFit),n.setMuted(a.muted),n.setCallback(this.callback);const c=e=>{const{track:t}=e;this.createEncodedStreams(e.receiver),this.initReceiverTransform(e.receiver,"audio"===t.kind),"audio"===t.kind?n.setAudioTrack(t):n.setVideoTrack(t)};try{await this.connectForSwitch(e,c),this._log.info("switchStream: new connection established"),await this.waitForNewPlayerFirstFrame(n),this._log.info("switchStream: new stream first frame received"),a.audioPlayer.setMuted(!0),a.stop(),this.player=n,t&&(clearTimeout(this.connectionTimeoutId),t.close(),t.getReceivers().forEach(e=>s.delete(e)),i&&o&&r&&this.fetchStopStreamWithParams(i,r,o).catch(e=>{this._log.warn("switchStream: stop old stream failed",e)})),this._log.info("switchStream: switch completed successfully")}catch(e){this._log.error("switchStream failed",e),n.stop();const c=this.peerConnection;throw c&&(c.close(),c.getReceivers().forEach(e=>this.insertableStreamsAbortMap.delete(e))),this.peerConnection=t,this.streamURL=i,this.signalURL=r,this.svrSig=o,this.insertableStreamsAbortMap=s,this.player=a,a.audioPlayer.setMuted(a.muted),e}}waitForNewPlayerFirstFrame(e){return new Promise((t,i)=>{let r=0,o=!1;const s=e.videoPlayer.getElement();if(!s)return void i(new Error("VideoPlayer has no video element"));const a=()=>{o=!0,clearInterval(l),s.removeEventListener("loadeddata",n),s.removeEventListener("playing",c)},n=()=>{o||(this._log.info("waitForNewPlayerFirstFrame: loadeddata event fired"),a(),t())},c=()=>{o||(this._log.info("waitForNewPlayerFirstFrame: playing event fired"),a(),t())};s.addEventListener("loadeddata",n,{once:!0}),s.addEventListener("playing",c,{once:!0}),e.play().catch(e=>{this._log.warn("waitForNewPlayerFirstFrame: play failed",e)});const l=setInterval(()=>{if(!o){if(r+=100,s.videoWidth>0&&s.videoHeight>0)return this._log.info(`waitForNewPlayerFirstFrame: video has valid dimensions ${s.videoWidth}x${s.videoHeight}`),a(),void t();r>=1e4&&(a(),i(new Error("waitForNewPlayerFirstFrame timeout")))}},100)})}connectForSwitch(e,t){return new Promise((i,r)=>{try{this.initScriptTransformWorker();const o={encodedInsertableStreams:this.enableSEI,iceServers:[],sdpSemantics:"unified-plan",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require",tcpCandidatePolicy:"disable",IceTransportsType:"nohost"},s=new RTCPeerConnection(o);this.peerConnection=s,s.onconnectionstatechange=()=>{this.connectionState=s.connectionState,this._log.info("connectForSwitch connectionState",s.connectionState),"failed"!==s.connectionState&&"closed"!==s.connectionState||r(new Error(`connection is ${s.connectionState}`)),"connected"===s.connectionState&&(this.logSelectedCandidate(),i())},s.ontrack=t,s.addTransceiver("audio",{direction:"recvonly"}),s.addTransceiver("video",{direction:"recvonly"}),this._log.info("connectForSwitch createOffer"),s.createOffer({offerToReceiveAudio:!0,offerToReceiveVideo:!0,voiceActivityDetection:!1}).then(e=>(e.sdp=updateSdpRestriction(e.sdp),this._log.info("connectForSwitch setOffer"),s.setLocalDescription(e))).then(()=>{const t={sessionId:nanoid(),streamurl:e,clientinfo:this.core.environment.getOSString(),localsdp:s.localDescription};return this.exchangeSDP(e,t)}).then(e=>(this._log.info("connectForSwitch setAnswer"),s.setRemoteDescription(e))).catch(r)}catch(e){r(e)}this.connectionTimeoutId=setTimeout(()=>r(new Error("connection timeout")),1e4)})}async fetchStopStreamWithParams(e,t,i){try{const r=`${t}/webrtc/v1/stopstream`,o=await fetchPost(r,{streamurl:e,svrsig:i},{timeout:3}),{errcode:s,errmsg:a}=o;if(0!==s)throw new Error(`errCode:${s}, errmsg:${a}`);return o}catch(e){this._log.error("fetchStopStreamWithParams error",e)}}async stop(){this.isStopped=!0,this.clearStreamHealthCheck(),this.player.stop(),this.peerConnection&&(clearTimeout(this.connectionTimeoutId),this.peerConnection.close(),this.peerConnection.getReceivers().forEach(e=>this.insertableStreamsAbortMap.delete(e)),delete this.peerConnection,await this.fetchStopStream(),delete this.streamURL,delete this.signalURL,delete this.svrSig),this.stat&&(this.stat.stop(),delete this.stat),this.scriptTransformWorker&&(this.scriptTransformWorker.onmessage=null,this.scriptTransformWorker.onerror=null,this.scriptTransformWorker.terminate(),delete this.scriptTransformWorker),delete this.scriptTransformWorkerPromise,this.core.room.keyPointManager.uploadKVStat(this.core.kvStatManager,this._sdkAppId)}destroy(){this.stop(),this.core.innerEmitter.off(this.core.INNER_EVENT.SEI_MESSAGE,this.onSEIMessage,this)}createStreamHealthCheckPromise(){return new Promise((e,t)=>{this.streamHealthCheckReject=t,this.streamHealthCheckTimeoutId=window.setTimeout(()=>this.checkStreamHealth(t),5e3)})}clearStreamHealthCheck(){this.streamHealthCheckTimeoutId&&(clearTimeout(this.streamHealthCheckTimeoutId),delete this.streamHealthCheckTimeoutId),delete this.streamHealthCheckReject}async checkStreamHealth(e){if(!this.isStopped&&this.peerConnection)try{const t=this.peerConnection.getReceivers().find(e=>{var t;return"video"===(null==(t=e.track)?void 0:t.kind)});if(!t)return void this._log.warn("checkStreamHealth: no video receiver found");const i=await t.getStats();let r=0,o=0;i.forEach(e=>{"inbound-rtp"===e.type&&("video"===e.mediaType||"video"===e.kind)&&(r=e.bytesReceived||0,o=e.framesDecoded||0)});const{isPlaying:s}=this.player,a=s||o>0;this._log.info(`checkStreamHealth: bytesReceived=${r}, framesDecoded=${o}, isPlaying=${s}`);const{RtcError:n,ErrorCode:c,ErrorCodeDictionary:l}=this.core.errorModule;if(0===r){this._log.warn("checkStreamHealth: no stream data received after 5s");e(new n({code:c.OPERATION_FAILED,message:"no stream data received"}))}else if(!a){this._log.warn("checkStreamHealth: decode failed"),this.isH264DecodeSupported=!1;e(new n({code:c.ENV_NOT_SUPPORTED,extraCode:l.NOT_SUPPORTED_H264_DECODE,message:"h264 decode failed"}))}}catch(e){this._log.warn("checkStreamHealth error",e)}}connect(e){return new Promise((t,i)=>{try{this.initScriptTransformWorker();const r={encodedInsertableStreams:this.enableSEI,iceServers:[],sdpSemantics:"unified-plan",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require",tcpCandidatePolicy:"disable",IceTransportsType:"nohost"},o=new RTCPeerConnection(r);this.peerConnection=o,o.onconnectionstatechange=()=>{this.connectionState=o.connectionState,this._log.info("connectionState",o.connectionState),"failed"!==o.connectionState&&"closed"!==o.connectionState||(this.isStarted?this.reconnect(e):i(new Error(`connection is ${o.connectionState}`))),"connected"===o.connectionState&&(this.logSelectedCandidate(),t())},o.ontrack=e=>this.onTrack(e),o.addTransceiver("audio",{direction:"recvonly"}),o.addTransceiver("video",{direction:"recvonly"}),this._log.info("createOffer"),o.createOffer({offerToReceiveAudio:!0,offerToReceiveVideo:!0,voiceActivityDetection:!1}).then(e=>(e.sdp=updateSdpRestriction(e.sdp),this._log.info("setOffer"),o.setLocalDescription(e))).then(()=>{const t={sessionId:nanoid(),streamurl:e,clientinfo:this.core.environment.getOSString(),localsdp:o.localDescription};return this.exchangeSDP(e,t)}).then(e=>(this._log.info("setAnswer"),o.setRemoteDescription(e))).catch(i)}catch(e){i(e)}this.connectionTimeoutId=setTimeout(()=>i(new Error("connection timeout")),1e4)})}async exchangeSDP(e,t){let i,r,o;const{protocol:s,domain:a,query:n}=this.signalConfig,c=getStreamDomain(e);if(n)try{if(this._log.info("exchangeSDP"),!c)throw new Error("streamDomain is empty");const{signalDomain:e,cached:a}=await this.fetchSignalDomain(c);if(!e)throw new Error("signalDomain is empty");{this._log.info("try exchangeSDP signalDomain:",e,a);const n=await this.doExchangeSDP(`${s}://${e}`,t,3);i=n.url,r=n.remoteSdp,o=n.svrSig}}catch(e){this._log.warn("exchangeSDP failed, fallback",e);const n=a?[`${s}://${a}`]:SIGNAL_DOMAIN_NAME_LIST.map(e=>`${s}://${e}`);try{const e=await this.core.utils.promiseAny(n.map(e=>this.doExchangeSDP(e,t,3)));i=e.url,r=e.remoteSdp,o=e.svrSig}catch(e){throw this._log.error("exchangeSDP failed",e),e[0]||e}}else{this._log.info("exchangeSDP with query=false, domain:",a);const e=a?[`${s}://${a}`]:SIGNAL_DOMAIN_NAME_LIST.map(e=>`${s}://${e}`);try{const s=await this.core.utils.promiseAny(e.map(e=>this.doExchangeSDP(e,t,3)));i=s.url,r=s.remoteSdp,o=s.svrSig}catch(e){throw this._log.error("exchangeSDP failed",e),e[0]||e}c&&!a&&this.fetchSignalDomain(c).catch(()=>{})}return this.streamURL=e,this.signalURL=i,this.svrSig=o,r}async reconnect(e){var t,i;if(!this.isReconnecting){this.isReconnecting=!0;try{this._log.warn("start reconnect"),await this.connect(e),this._log.warn("reconnect success")}catch(e){this._log.error("reconnect error",e);const{RtcError:r,ErrorCode:o}=this.core.errorModule;null==(i=null==(t=this.callback)?void 0:t.onError)||i.call(t,new r({code:o.OPERATION_FAILED,message:"reconnect failed"}))}finally{this.isReconnecting=!1}}}async logSelectedCandidate(){if(!this.peerConnection)return;const e=await this.peerConnection.getStats();for(const[t,i]of e)if(this.core.rtcDectection.isSelectedCandidatePair(i)){const t=e.get(i.localCandidateId),r=e.get(i.remoteCandidateId);t&&this._log.info(`local candidate: ${t.candidateType} ${t.protocol}:${t.ip||t.address}:${t.port} ${t.networkType||""} ${t.relayProtocol?`relayProtocol:${t.relayProtocol} url: ${t.url}`:""}`),r&&this._log.info(`remote candidate: ${r.candidateType} ${r.protocol}:${r.ip||r.address}:${r.port}`);break}}async doExchangeSDP(e,t,i){const r=`${e}/webrtc/v1/pullstream`,o=await fetchPost(r,t,{timeout:i}),{errcode:s,errmsg:a,remotesdp:n,svrsig:c}=o;if(0!==s){const e=new Error(`errCode:${s}, errMsg:${a}`);throw e.name="RequestSignalError",e}return{url:e,remoteSdp:n,svrSig:c}}createEncodedStreams(e){var t;if(this.enableSEI&&this.core.rtcDectection.IS_INSERTABLE_STREAM_SUPPORTED)try{if(this._log.warn("enableSEI",this.enableSEI),!this.insertableStreamsAbortMap.has(e)){const i=e.createEncodedStreams(),r=new AbortController,o={abortController:r,enqueue:t=>"audio"===e.track.kind?t:this.decodeVideoFrame(t)};i.readable.pipeThrough(new TransformStream({transform:(e,t)=>{const i=o.enqueue(e);i&&t.enqueue(i)}})).pipeTo(i.writable,r).catch(e=>{"destroy"!==e&&this._log.warn(e)}),null==(t=this.insertableStreamsAbortMap.get(e))||t.abort("destroy"),this.insertableStreamsAbortMap.set(e,r)}}catch(t){this._log.warn(`createEncodedStreams ${e.track.kind} failed`,t)}}initReceiverTransform(e,t){var i;this.peerConnection&&this.enableSEI&&!e.transform&&(null==(i=this.initScriptTransformWorker())||i.then(i=>{if(this.peerConnection&&this.enableSEI&&i&&!e.transform)try{e.transform=new RTCRtpScriptTransform(i,{isReceiver:!0,isAudio:t,userId:"",streamType:this.core.enums.RemoteStreamType.Main})}catch(e){this._log.error("initReceiverTransform failed",e)}}))}initScriptTransformWorker(){const{room:e,rtcDectection:t,createScriptTransformWorker:i}=this.core;if(this.enableSEI&&!t.IS_INSERTABLE_STREAM_SUPPORTED)return this.scriptTransformWorker?Promise.resolve(this.scriptTransformWorker):this.scriptTransformWorkerPromise?this.scriptTransformWorkerPromise:t.IS_SCRIPT_TRANSFORM_SUPPORTED?(this._log.info("initScriptTransformWorker"),this.scriptTransformWorkerPromise=i({videoEncodePipeline:e.videoManager.encodePipeline,videoDecodePipeline:e.videoManager.decodePipeline,audioEncodePipeline:e.audioManager.encodePipeline,audioDecodePipeline:e.audioManager.decodePipeline}).then(e=>{if(this.scriptTransformWorkerPromise=void 0,!this.isStopped)return this.scriptTransformWorker=e,e.onmessage=e=>{var t,i;"sei"===e.data.type&&(null==(i=null==(t=this.callback)?void 0:t.onSEIMessage)||i.call(t,{data:e.data.data,seiPayloadType:e.data.seiPayloadType}))},e.onerror=e=>{this._log.error("scriptTransformWorker error: ",e.message)},e.postMessage({type:"enable-sei"}),e;e.terminate()}).catch(e=>{this.scriptTransformWorkerPromise=void 0,this._log.error("Failed to create scriptTransformWorker",e)}),this.scriptTransformWorkerPromise):void 0}decodeVideoFrame(e){if(!this.core.room.videoManager)return e;for(const t of this.core.room.videoManager.decodePipeline){if(!t)continue;const i=t({frame:e});if(!i)return;e="frame"in i?i.frame:i}return e}async fetchStopStream(){if(this.streamURL&&this.svrSig&&this.signalURL)try{const e=`${this.signalURL}/webrtc/v1/stopstream`,t=await fetchPost(e,{streamurl:this.streamURL,svrsig:this.svrSig},{timeout:3}),{errcode:i,errmsg:r}=t;if(0!==i)throw new Error(`errCode:${i}, errmsg:${r}`);return t}catch(e){this._log.error("fetchStopStream error",e)}}onTrack(e){const{track:t}=e;this.createEncodedStreams(e.receiver),this.initReceiverTransform(e.receiver,"audio"===t.kind),"audio"===t.kind?this.player.setAudioTrack(t):this.player.setVideoTrack(t)}onSEIMessage({room:e,nalu:t}){var i,r;e===this.core.room&&(null==(r=null==(i=this.callback)?void 0:i.onSEIMessage)||r.call(i,{data:t.seiPayload.buffer,seiPayloadType:t.seiPayloadType}))}async fetchSignalDomain(e,t=REQUEST_DOMAIN_NAME_LIST[0]){var i;const r=`https://${t}/signal_query`;try{const t=window.localStorage.getItem(SIGNAL_DOMAIN_NAME_DATA_KEY);if(t){const r=JSON.parse(t);if((null==(i=r[e])?void 0:i.expire)-(new Date).getTime()>0)return{signalDomain:r[e].signal,cached:!0}}const o=await fetchPost(r,{domain:e,requestid:nanoid(16),client_type:"Web",client_info:window.navigator.userAgent}),{errcode:s,errmsg:a,data:n}=o;if(0===s){const{signal_domain:t,cache_time:i}=n;let r={};const o=window.localStorage.getItem(SIGNAL_DOMAIN_NAME_DATA_KEY);o&&(r=JSON.parse(o)),r[e]={signal:t,expire:(new Date).getTime()+1e3*i};try{window.localStorage.setItem(SIGNAL_DOMAIN_NAME_DATA_KEY,JSON.stringify(r))}catch(e){}return{signalDomain:t,cached:!1}}throw new Error(`errCode:${s} errmsg:${a}`)}catch(i){return this._log.error("fetchSignalDomain error",i),REQUEST_DOMAIN_NAME_LIST[1]&&t!==REQUEST_DOMAIN_NAME_LIST[1]?this.fetchSignalDomain(e,REQUEST_DOMAIN_NAME_LIST[1]):{signalDomain:"",cached:!1}}}};__publicField(_LEBPlayer,"Name","LEBPlayer"),__decorateClass([removePromiseRetry({fnName:"connect"})],_LEBPlayer.prototype,"stop",1),__decorateClass([addPromiseRetry({settings:{retries:1/0,timeout:2e3},onRetrying(e){var t;if(this._log.warn(`retry connect ${e}`),e>=3&&(null==(t=this.callback)?void 0:t.onError)&&!this.isFireWallErrorEmitted){const{RtcError:e,ErrorCode:t,ErrorCodeDictionary:i}=this.core.errorModule;this.isFireWallErrorEmitted=!0,this.callback.onError(new e({code:t.OPERATION_FAILED,extraCode:i.FIREWALL_RESTRICTION,message:"firewall restriction"}))}},onError(e,t,i,r){var o;if(this._log.warn("connect failed",e),this.peerConnection&&(this.peerConnection.close(),delete this.peerConnection),!this.isStopped&&(null==(o=e.message||e)?void 0:o.includes("connection")))t();else{const{RtcError:t,ErrorCode:r}=this.core.errorModule;i(new t({code:r.UNKNOWN_ERROR,message:e.message}))}}})],_LEBPlayer.prototype,"connect",1);var LEBPlayer=_LEBPlayer,fetchPost=async(e,t,i={})=>{const{timeout:r=10}=i;let o,s=0,a={};window.AbortController&&(o=new window.AbortController,a={signal:o.signal},s=window.setTimeout(()=>o.abort(),1e3*r));const n=await fetch(e,__spreadValues({body:JSON.stringify(t),cache:"no-cache",credentials:"same-origin",headers:{"content-type":"text/plain;charset=utf-8"},method:"POST",mode:"cors"},a));if(s&&window.clearTimeout(s),200!==n.status)throw new Error(`Network Error, status code:${n.status}`);return n.json()},REQUEST_DOMAIN_NAME_LIST=["webrtc-signal-scheduler.tlivesource.com","bak-webrtc-signal-scheduler.tlivesource.com"],SIGNAL_DOMAIN_NAME_DATA_KEY="LEB_PLAYER_STORAGE_KEY",getStreamDomain=e=>{const t=/^(?:webrtc:\/\/)([0-9.\-A-Za-z_]+)(?:\/)(?:[0-9.\-A-Za-z_=]+)(?:\/)(?:[^?#]*)(?:\?*)(?:[^?#]*)/.exec(e);return t?t[1]:""},index_default=LEBPlayer;export{index_default as default};export{LEBPlayer};