@callpromn/rtc-sdk 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.txt +32 -0
- package/README.md +173 -0
- package/dist/index.d.mts +244 -0
- package/dist/index.d.ts +244 -0
- package/dist/index.js +10 -0
- package/dist/index.mjs +10 -0
- package/package.json +57 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
'use strict';var uuid=require('uuid'),Nt=require('events'),websocket=require('websocket'),Ge=require('retry'),Ut=require('bowser'),ve=require('h264-profile-level-id'),awaitqueue=require('awaitqueue'),j=require('sdp-transform'),ut=require('js-cookie'),socket_ioClient=require('socket.io-client');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var Nt__default=/*#__PURE__*/_interopDefault(Nt);var Ge__namespace=/*#__PURE__*/_interopNamespace(Ge);var Ut__default=/*#__PURE__*/_interopDefault(Ut);var ve__namespace=/*#__PURE__*/_interopNamespace(ve);var j__namespace=/*#__PURE__*/_interopNamespace(j);var ut__default=/*#__PURE__*/_interopDefault(ut);var ie=class extends Error{constructor(n,e,t){super(e),this.name="YRTCError",this.errorName=n,this.errorCode=t;}};var oe=class extends Nt.EventEmitter{constructor(){super(),this.setMaxListeners(1/0);}safeEmit(n,...e){try{this.emit(n,...e);}catch(t){console.log("safeEmit() | event listener threw an error [event:%s]:%o",n,t);}}async safeEmitAsPromise(n,...e){return new Promise((t,r)=>{this.safeEmit(n,...e,t,r);})}};function qe(){return Math.round(Math.random()*1e7)}var Q=class{static parse(n){let e,t={};try{e=JSON.parse(n);}catch(r){console.log("parse() | invalid JSON: %s",r);return}if(typeof e!="object"||Array.isArray(e)){console.log("parse() | not an object");return}if(e.request){if(t.request=true,typeof e.method!="string"){console.log("parse() | missing/invalid method field");return}if(typeof e.id!="number"){console.log("parse() | missing/invalid id field");return}t.id=e.id,t.method=e.method,t.data=e.data||{};}else if(e.response){if(t.response=true,typeof e.id!="number"){console.log("parse() | missing/invalid id field");return}t.id=e.id,e.ok?(t.ok=true,t.data=e.data||{}):(t.ok=false,t.errorCode=e.errorCode,t.errorReason=e.errorReason);}else if(e.notification){if(t.notification=true,typeof e.method!="string"){console.log("parse() | missing/invalid method field");return}t.method=e.method,t.data=e.data||{};}else {console.log("parse() | missing request/response field");return}return t}static createRequest(n,e){return {data:e||{},id:qe(),method:n,request:true}}static createSuccessResponse(n,e){return {data:e||{},id:n.id,ok:true,response:true}}static createErrorResponse(n,e,t){return {errorCode:e,errorReason:t,id:n.id,ok:false,response:true}}static createNotification(n,e){return {data:e||{},method:n,notification:true}}};var de=class extends oe{constructor(n){super(),console.log("constructor()"),this._closed=false,this._transport=n,this._connected=false,this._data={},this._sents=new Map,this._handleTransport();}get closed(){return this._closed}get connected(){return this._connected}get data(){return this._data}set data(n){throw new Error("cannot override data object")}close(){if(!this._closed){console.log("close()"),this._closed=true,this._connected=false,this._transport.close();for(let n of this._sents.values())n.close();}}async request(n,e=void 0){let t=Q.createRequest(n,e);return console.log("request() [method:%s, id:%s]",n,t.id),await this._transport.send(t),new Promise((r,s)=>{let a=1500*(15+.1*this._sents.size),i={close:()=>{clearTimeout(i.timer),s(new Error("peer closed"));},id:t.id,method:t.method,reject:c=>{this._sents.delete(t.id)&&(clearTimeout(i.timer),s(c));},resolve:c=>{this._sents.delete(t.id)&&(clearTimeout(i.timer),r(c));},timer:setTimeout(()=>{this._sents.delete(t.id)&&s(new Error("request timeout"));},a)};this._sents.set(t.id,i);})}async notify(n,e=void 0){let t=Q.createNotification(n,e);console.log("notify() [method:%s]",n),await this._transport.send(t);}_handleTransport(){if(this._transport.closed){this._closed=true,setTimeout(()=>{this._closed||(this._connected=false,this.safeEmit("close"));});return}this._transport.on("open",()=>{this._closed||(console.log('emit "open"'),this._connected=true,this.safeEmit("open"));}),this._transport.on("disconnected",()=>{this._closed||(console.log('emit "disconnected"'),this._connected=false,this.safeEmit("disconnected"));}),this._transport.on("failed",n=>{this._closed||(console.log('emit "failed" [currentAttempt:%s]',n),this._connected=false,this.safeEmit("failed",n));}),this._transport.on("error",()=>{this._closed||this.safeEmit("error");}),this._transport.on("close",()=>{if(this._closed){this.safeEmit("close");return}this._closed=true,console.log('emit "close"'),this._connected=false,this.safeEmit("close");}),this._transport.on("connectionTimeOut",()=>{this.safeEmit("connectionTimeOut");}),this._transport.on("message",n=>{n.request?this._handleRequest(n):n.response?this._handleResponse(n):n.notification&&this._handleNotification(n);});}_handleRequest(n){try{this.emit("request",n,e=>{let t=Q.createSuccessResponse(n,e);this._transport.send(t).catch(()=>{});},(e,t)=>{e instanceof Error?(e=500,t=String(e)):typeof e=="number"&&t instanceof Error&&(t=String(t));let r=Q.createErrorResponse(n,e,t);this._transport.send(r).catch(()=>{});});}catch(e){let t=Q.createErrorResponse(n,500,String(e));this._transport.send(t).catch(()=>{});}}_handleResponse(n){let e=this._sents.get(n.id);if(!e){console.log("received response does not match any sent request [id:%s]",n.id);return}if(n.ok)e.resolve(n.data);else {let t=new Error(n.errorReason);t.code=n.errorCode,e.reject(t);}}_handleNotification(n){this.safeEmit("notification",n);}};var bt="protoo",re={none:1,connected:3,disconnected:4,reconnecting:5,reconnected:6},se=class extends oe{constructor(n,e){super(),this._closed=false,this._url=n,this._options=e||{},this._ws=null,this.isCheckSuccess=false,this.pingCountwithoutPong=0,this.sendHeartTimer=null,this.checkDisconnectTimer=null,this._retryOption={factor:2,maxRetryTime:60*1e3,maxTimeout:8*1e3,minTimeout:1*1e3},this._connectState=re.none,e.maxRetryTime!==void 0&&(this._retryOption.maxRetryTime=e.maxRetryTime),console.log(`[WebSocketTransport] retryOption=${JSON.stringify(this._retryOption)}`),this._pingFromServer=e.pingFromServer!==void 0?e.pingFromServer:false,this._runWebSocket();}get closed(){return this._closed}close(){if(!this._closed){console.log("[WebSocketTransport] close()"),this._closed=true,this.safeEmit("close");try{this._ws.onopen=null,this._ws.onerror=null,this._ws.onmessage=null,this._clearPingTimer(),this._ws.close();}catch(n){console.log("[WebSocketTransport] close() | error closing the WebSocket: %o",n);}}}disconnect(){console.log("[WebSocketTransport] ws.close"),this._ws.close();}async send(n){if(!this._closed)try{this._ws.send(JSON.stringify(n));}catch(e){throw console.log(`[WebSocketTransport] send() failed:${e}`),e}}_runWebSocket(){let n=Ge__namespace.operation(this._retryOption),e=false;n.attempt(t=>{if(this._closed){n.stop();return}console.log(`[WebSocketTransport] _runWebSocket() [currentAttempt:${t}]`),this._ws=new websocket.w3cwebsocket(this._url,bt,this._options.origin,this._options.headers,this._options.requestOptions,this._options.clientConfig);let r=this;this._ws.onopen=()=>{r._closed||(e=true,this._options.pingFromServer||this._checkHeart(),r._connectState===re.reconnecting?(r._connectState=re.reconnected,console.log("[WebSocketTransport] WebSocket connectState reconnected"),r.safeEmit("reconnected")):(console.log("[WebSocketTransport] WebSocket connectState connected"),r._connectState=re.connected),this.safeEmit("open"));},this._ws.onclose=s=>{if(this._closed){this.safeEmit("close");return}if(this._options.pingFromServer||this._clearPingTimer(),console.log(`[WebSocketTransport] WebSocket close event [wasClean:${s.wasClean}, code:${s.code}, reason:${s.reason}]`),s.code!==4e3){if(e){if(n.stop(),this.safeEmit("disconnected"),this._closed)return;this._runWebSocket();return}else if(this._closed||(this._connectState!==re.reconnecting&&(this._connectState=re.disconnected,console.log("[WebSocketTransport] WebSocket connectState disconnected"),this.safeEmit("disconnected")),this._connectState=re.reconnecting,console.log(`[WebSocketTransport] WebSocket connectState reconnecting...${t}`),this.safeEmit("tryToReconnect"),n.retry(true)))return}console.log(`[WebSocketTransport] WebSocket closed event:${s.code}`),this._closed=true,console.error("[WebSocketTransport] WebSocket connectState connectionTimeOut"),this.safeEmit("connectionTimeOut");},this._ws.onerror=s=>{this._closed||(this.safeEmit("error"),console.log('WebSocket "error" event'),console.log(s));},this._ws.onmessage=s=>{if(this._closed)return;let a=s.data;if(a==="pong")this.pingCountwithoutPong=0;else {let i=Q.parse(a);if(!i){this.safeEmit("errorParseMessage");return}if(this.listenerCount("message")===0){console.log('no listeners for WebSocket "message" event, ignoring received message');return}this.safeEmit("message",i);}};});}_checkHeart(){this._clearPingTimer(),this.pingCountwithoutPong=0,this._closed||this._ws.send("ping"),this.checkDisconnectTimer=setInterval(()=>{this.pingCountwithoutPong>5&&(console.error("[WebSocketTransport] Heartbeat detection and reconnection on disconnection------------"),this._clearPingTimer(),this.pingCountwithoutPong=0,this.disconnect());},3e3),this.sendHeartTimer=setInterval(()=>{this._ws.send("ping");},2e3);}_clearPingTimer(){clearInterval(this.checkDisconnectTimer),clearInterval(this.sendHeartTimer);}};var y=class o extends Error{constructor(n){super(n),this.name="UnsupportedError",Error.hasOwnProperty("captureStackTrace")?Error.captureStackTrace(this,o):this.stack=new Error(n).stack;}},w=class o extends Error{constructor(n){super(n),this.name="InvalidStateError",Error.hasOwnProperty("captureStackTrace")?Error.captureStackTrace(this,o):this.stack=new Error(n).stack;}};function v(o){return typeof o!="object"?{}:JSON.parse(JSON.stringify(o))}function ne(){return Math.round(Math.random()*1e7)}function ye(o,n){let e=new Set(o),t=new Set(n),r=[];for(let s of e)t.has(s)||r.push(s);return r}function Pt(o){return new Promise(function(n,e){let t=new Image;t.onload=function(){n(t);},t.onerror=function(){e(o);},t.src=`${o}?random-no-cache=${Math.floor((1+Math.random())*65536).toString(16)}`;})}function ze(o,n){return new Promise(function(e,t){let r=new Date().getTime(),s=function(){let a=new Date().getTime()-r;a*=n,e(a);};Pt(o).then(s).catch(s),setTimeout(function(){t(Error("Timeout"));},5e3);})}var Ct="probator",Tt=1234,Dt=127;function Qe(o){if(typeof o!="object")throw new TypeError("fb is not an object");if(!o.type||typeof o.type!="string")throw new TypeError("missing fb.type");(!o.parameter||typeof o.parameter!="string")&&(o.parameter="");}function kt(o){let n=new RegExp("^(audio|video)/(.+)","i");if(typeof o!="object")throw new TypeError("codec is not an object");if(!o.mimeType||typeof o.mimeType!="string")throw new TypeError("missing codec.mimeType");let e=n.exec(o.mimeType);if(!e)throw new TypeError("invalid codec.mimeType");if(o.kind=e[1].toLowerCase(),o.preferredPayloadType&&typeof o.preferredPayloadType!="number")throw new TypeError("invalid codec.preferredPayloadType");if(typeof o.clockRate!="number")throw new TypeError("missing codec.clockRate");o.kind==="audio"?typeof o.channels!="number"&&(o.channels=1):delete o.channels,(!o.parameters||typeof o.parameters!="object")&&(o.parameters={});for(let t of Object.keys(o.parameters)){let r=o.parameters[t];if(r===void 0&&(o.parameters[t]="",r=""),typeof r!="string"&&typeof r!="number")throw new TypeError(`invalid codec parameter [key:${t}s, value:${r}]`);if(t==="apt"&&typeof r!="number")throw new TypeError("invalid codec apt parameter")}(!o.rtcpFeedback||!Array.isArray(o.rtcpFeedback))&&(o.rtcpFeedback=[]);for(let t of o.rtcpFeedback)Qe(t);}function It(o){if(typeof o!="object")throw new TypeError("ext is not an object");if((!o.kind||typeof o.kind!="string")&&(o.kind=""),o.kind!==""&&o.kind!=="audio"&&o.kind!=="video")throw new TypeError("invalid ext.kind");if(!o.uri||typeof o.uri!="string")throw new TypeError("missing ext.uri");if(typeof o.preferredId!="number")throw new TypeError("missing ext.preferredId");if(o.preferredEncrypt&&typeof o.preferredEncrypt!="boolean")throw new TypeError("invalid ext.preferredEncrypt");if(o.preferredEncrypt||(o.preferredEncrypt=false),o.direction&&typeof o.direction!="string")throw new TypeError("invalid ext.direction");o.direction||(o.direction="sendrecv");}function Se(o){if(typeof o!="object")throw new TypeError("caps is not an object");if(o.codecs&&!Array.isArray(o.codecs))throw new TypeError("caps.codecs is not an array");o.codecs||(o.codecs=[]);for(let n of o.codecs)kt(n);if(o.headerExtensions&&!Array.isArray(o.headerExtensions))throw new TypeError("caps.headerExtensions is not an array");o.headerExtensions||(o.headerExtensions=[]);for(let n of o.headerExtensions)It(n);}function Et(o){let n=new RegExp("^(audio|video)/(.+)","i");if(typeof o!="object")throw new TypeError("codec is not an object");if(!o.mimeType||typeof o.mimeType!="string")throw new TypeError("missing codec.mimeType");let e=n.exec(o.mimeType);if(!e)throw new TypeError("invalid codec.mimeType");if(typeof o.payloadType!="number")throw new TypeError("missing codec.payloadType");if(typeof o.clockRate!="number")throw new TypeError("missing codec.clockRate");e[1].toLowerCase()==="audio"?typeof o.channels!="number"&&(o.channels=1):delete o.channels,(!o.parameters||typeof o.parameters!="object")&&(o.parameters={});for(let r of Object.keys(o.parameters)){let s=o.parameters[r];if(s===void 0&&(o.parameters[r]="",s=""),typeof s!="string"&&typeof s!="number")throw new TypeError(`invalid codec parameter [key:${r}s, value:${s}]`);if(r==="apt"&&typeof s!="number")throw new TypeError("invalid codec apt parameter")}(!o.rtcpFeedback||!Array.isArray(o.rtcpFeedback))&&(o.rtcpFeedback=[]);for(let r of o.rtcpFeedback)Qe(r);}function Lt(o){if(typeof o!="object")throw new TypeError("ext is not an object");if(!o.uri||typeof o.uri!="string")throw new TypeError("missing ext.uri");if(typeof o.id!="number")throw new TypeError("missing ext.id");if(o.encrypt&&typeof o.encrypt!="boolean")throw new TypeError("invalid ext.encrypt");o.encrypt||(o.encrypt=false),(!o.parameters||typeof o.parameters!="object")&&(o.parameters={});for(let n of Object.keys(o.parameters)){let e=o.parameters[n];if(e===void 0&&(o.parameters[n]="",e=""),typeof e!="string"&&typeof e!="number")throw new TypeError("invalid header extension parameter")}}function xt(o){if(typeof o!="object")throw new TypeError("encoding is not an object");if(o.ssrc&&typeof o.ssrc!="number")throw new TypeError("invalid encoding.ssrc");if(o.rid&&typeof o.rid!="string")throw new TypeError("invalid encoding.rid");if(o.rtx&&typeof o.rtx!="object")throw new TypeError("invalid encoding.rtx");if(o.rtx&&typeof o.rtx.ssrc!="number")throw new TypeError("missing encoding.rtx.ssrc");if((!o.dtx||typeof o.dtx!="boolean")&&(o.dtx=false),o.scalabilityMode&&typeof o.scalabilityMode!="string")throw new TypeError("invalid encoding.scalabilityMode")}function Mt(o){if(typeof o!="object")throw new TypeError("rtcp is not an object");if(o.cname&&typeof o.cname!="string")throw new TypeError("invalid rtcp.cname");(!o.reducedSize||typeof o.reducedSize!="boolean")&&(o.reducedSize=true);}function we(o){if(typeof o!="object")throw new TypeError("params is not an object");if(o.mid&&typeof o.mid!="string")throw new TypeError("params.mid is not a string");if(!Array.isArray(o.codecs))throw new TypeError("missing params.codecs");for(let n of o.codecs)Et(n);if(o.headerExtensions&&!Array.isArray(o.headerExtensions))throw new TypeError("params.headerExtensions is not an array");o.headerExtensions||(o.headerExtensions=[]);for(let n of o.headerExtensions)Lt(n);if(o.encodings&&!Array.isArray(o.encodings))throw new TypeError("params.encodings is not an array");o.encodings||(o.encodings=[]);for(let n of o.encodings)xt(n);if(o.rtcp&&typeof o.rtcp!="object")throw new TypeError("params.rtcp is not an object");o.rtcp||(o.rtcp={}),Mt(o.rtcp);}function Ot(o){if(typeof o!="object")throw new TypeError("numStreams is not an object");if(typeof o.OS!="number")throw new TypeError("missing numStreams.OS");if(typeof o.MIS!="number")throw new TypeError("missing numStreams.MIS")}function Je(o){if(typeof o!="object")throw new TypeError("caps is not an object");if(!o.numStreams||typeof o.numStreams!="object")throw new TypeError("missing caps.numStreams");Ot(o.numStreams);}function Fe(o){if(typeof o!="object")throw new TypeError("params is not an object");if(typeof o.streamId!="number")throw new TypeError("missing params.streamId");let n=false;if(typeof o.ordered=="boolean"?n=true:o.ordered=true,o.maxPacketLifeTime&&typeof o.maxPacketLifeTime!="number")throw new TypeError("invalid params.maxPacketLifeTime");if(o.maxRetransmits&&typeof o.maxRetransmits!="number")throw new TypeError("invalid params.maxRetransmits");if(o.maxPacketLifeTime&&o.maxRetransmits)throw new TypeError("cannot provide both maxPacketLifeTime and maxRetransmits");if(n&&o.ordered&&(o.maxPacketLifeTime||o.maxRetransmits))throw new TypeError("cannot be ordered with maxPacketLifeTime or maxRetransmits");if(!n&&(o.maxPacketLifeTime||o.maxRetransmits)&&(o.ordered=false),o.priority&&typeof o.priority!="string")throw new TypeError("invalid params.priority");if(o.label&&typeof o.label!="string")throw new TypeError("invalid params.label");if(o.protocol&&typeof o.protocol!="string")throw new TypeError("invalid params.protocol")}function pe(o){return o?/.+\/rtx$/i.test(o.mimeType):false}function Ye(o,n,{strict:e=false,modify:t=false}={}){let r=o.mimeType.toLowerCase(),s=n.mimeType.toLowerCase();if(r!==s||o.clockRate!==n.clockRate||o.channels!==n.channels)return false;switch(r){case "video/h264":{let a=o.parameters["packetization-mode"]||0,i=n.parameters["packetization-mode"]||0;if(a!==i)return false;if(e){if(!ve__namespace.isSameProfile(o.parameters,n.parameters))return false;let c;try{c=ve__namespace.generateProfileLevelIdStringForAnswer(o.parameters,n.parameters);}catch{return false}t&&(c?o.parameters["profile-level-id"]=c:delete o.parameters["profile-level-id"]);}break}case "video/vp9":{if(e){let a=o.parameters["profile-id"]||0,i=n.parameters["profile-id"]||0;if(a!==i)return false}break}}return true}function At(o,n){let e=[];for(let t of o.rtcpFeedback||[]){let r=(n.rtcpFeedback||[]).find(s=>s.type===t.type&&(s.parameter===t.parameter||!s.parameter&&!t.parameter));r&&e.push(r);}return e}function jt(o,n){return !(o.kind&&n.kind&&o.kind!==n.kind||o.uri!==n.uri)}function Xe(o,n){let e={codecs:[],headerExtensions:[]};for(let t of n.codecs||[]){if(pe(t))continue;let r=(o.codecs||[]).find(a=>Ye(a,t,{modify:true,strict:true}));if(!r)continue;let s={channels:r.channels,clockRate:r.clockRate,kind:r.kind,localParameters:r.parameters,localPayloadType:r.preferredPayloadType,localRtxPayloadType:void 0,mimeType:r.mimeType,remoteParameters:t.parameters,remotePayloadType:t.preferredPayloadType,remoteRtxPayloadType:void 0,rtcpFeedback:At(r,t)};e.codecs.push(s);}for(let t of e.codecs){let r=o.codecs.find(a=>pe(a)&&a.parameters.apt===t.localPayloadType),s=n.codecs.find(a=>pe(a)&&a.parameters.apt===t.remotePayloadType);r&&s&&(t.localRtxPayloadType=r.preferredPayloadType,t.remoteRtxPayloadType=s.preferredPayloadType);}for(let t of n.headerExtensions){let r=o.headerExtensions.find(a=>jt(a,t));if(!r)continue;let s={direction:"sendrecv",encrypt:r.preferredEncrypt,kind:t.kind,recvId:t.preferredId,sendId:r.preferredId,uri:t.uri};switch(t.direction){case "sendrecv":s.direction="sendrecv";break;case "recvonly":s.direction="sendonly";break;case "sendonly":s.direction="recvonly";break;case "inactive":s.direction="inactive";break}e.headerExtensions.push(s);}return e}function Ze(o){let n={codecs:[],headerExtensions:[]};for(let e of o.codecs){let t={channels:e.channels,clockRate:e.clockRate,kind:e.kind,mimeType:e.mimeType,parameters:e.localParameters,preferredPayloadType:e.remotePayloadType,rtcpFeedback:e.rtcpFeedback};if(n.codecs.push(t),!e.remoteRtxPayloadType)continue;let r={clockRate:e.clockRate,kind:e.kind,mimeType:`${e.kind}/rtx`,parameters:{apt:e.remotePayloadType},preferredPayloadType:e.remoteRtxPayloadType,rtcpFeedback:[]};n.codecs.push(r);}for(let e of o.headerExtensions){if(e.direction!=="sendrecv"&&e.direction!=="recvonly")continue;let t={direction:e.direction,kind:e.kind,preferredEncrypt:e.encrypt,preferredId:e.recvId,uri:e.uri};n.headerExtensions.push(t);}return n}function b(o,n){let e={codecs:[],encodings:[],headerExtensions:[],mid:void 0,rtcp:{}};for(let t of n.codecs){if(t.kind!==o)continue;let r={channels:t.channels,clockRate:t.clockRate,mimeType:t.mimeType,parameters:t.localParameters,payloadType:t.localPayloadType,rtcpFeedback:t.rtcpFeedback};if(e.codecs.push(r),t.localRtxPayloadType){let s={clockRate:t.clockRate,mimeType:`${t.kind}/rtx`,parameters:{apt:t.localPayloadType},payloadType:t.localRtxPayloadType,rtcpFeedback:[]};e.codecs.push(s);}}for(let t of n.headerExtensions){if(t.kind&&t.kind!==o||t.direction!=="sendrecv"&&t.direction!=="sendonly")continue;let r={encrypt:t.encrypt,id:t.sendId,parameters:{},uri:t.uri};e.headerExtensions.push(r);}return e}function T(o,n){let e={codecs:[],encodings:[],headerExtensions:[],mid:void 0,rtcp:{}};for(let t of n.codecs){if(t.kind!==o)continue;let r={channels:t.channels,clockRate:t.clockRate,mimeType:t.mimeType,parameters:t.remoteParameters,payloadType:t.localPayloadType,rtcpFeedback:t.rtcpFeedback};if(e.codecs.push(r),t.localRtxPayloadType){let s={clockRate:t.clockRate,mimeType:`${t.kind}/rtx`,parameters:{apt:t.localPayloadType},payloadType:t.localRtxPayloadType,rtcpFeedback:[]};e.codecs.push(s);}}for(let t of n.headerExtensions){if(t.kind&&t.kind!==o||t.direction!=="sendrecv"&&t.direction!=="sendonly")continue;let r={encrypt:t.encrypt,id:t.sendId,parameters:{},uri:t.uri};e.headerExtensions.push(r);}if(e.headerExtensions.some(t=>t.uri==="http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01"))for(let t of e.codecs)t.rtcpFeedback=(t.rtcpFeedback||[]).filter(r=>r.type!=="goog-remb");else if(e.headerExtensions.some(t=>t.uri==="http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time"))for(let t of e.codecs)t.rtcpFeedback=(t.rtcpFeedback||[]).filter(r=>r.type!=="transport-cc");else for(let t of e.codecs)t.rtcpFeedback=(t.rtcpFeedback||[]).filter(r=>r.type!=="transport-cc"&&r.type!=="goog-remb");return e}function P(o,n){let e=[];if(!n)e.push(o[0]),pe(o[1])&&e.push(o[1]);else {for(let t=0;t<o.length;++t)if(Ye(o[t],n)){e.push(o[t]),pe(o[t+1])&&e.push(o[t+1]);break}if(e.length===0)throw new TypeError("no matching codec found")}return e}function et(o){o=v(o),we(o);let n={codecs:[],encodings:[{ssrc:Tt}],headerExtensions:[],mid:Ct,rtcp:{cname:"probator"}};return n.codecs.push(o.codecs[0]),n.codecs[0].payloadType=Dt,n.headerExtensions=o.headerExtensions,n}function Ue(o,n){return n.codecs.some(e=>e.kind===o)}function tt(o,n){if(we(o),o.codecs.length===0)return false;let e=o.codecs[0];return n.codecs.some(t=>t.remotePayloadType===e.payloadType)}var I=class extends Nt__default.default{constructor(){super(),this.setMaxListeners(1/0);}safeEmit(n,...e){let t=this.listenerCount(n);try{return this.emit(n,...e)}catch(r){return console.log("safeEmit() | event listener threw an error [event:%s]:%o",n,r),!!t}}async safeEmitAsPromise(n,...e){return new Promise((t,r)=>this.safeEmit(n,...e,t,r))}};var be=class extends I{constructor({id:e,localId:t,rtpSender:r,track:s,rtpParameters:a,stopTracks:i,zeroRtpOnPause:c,appData:d}){super();this._closed=false;console.log("constructor()"),this._id=e,this._localId=t,this._rtpSender=r,this._track=s,this._kind=s.kind,this._rtpParameters=a,this._paused=!s.enabled,this._maxSpatialLayer=void 0,this._stopTracks=i,this._zeroRtpOnPause=c,this._appData=d,this._totalFramesSent=0,this._onTrackEnded=this._onTrackEnded.bind(this),this._handleTrack();}get id(){return this._id}get localId(){return this._localId}get closed(){return this._closed}get kind(){return this._kind}get rtpSender(){return this._rtpSender}get track(){return this._track}get rtpParameters(){return this._rtpParameters}get paused(){return this._paused}get maxSpatialLayer(){return this._maxSpatialLayer}get appData(){return this._appData}set appData(e){throw new Error("cannot override appData object")}get totalFramesSent(){return this._totalFramesSent}set totalFramesSent(e){this._totalFramesSent=e;}close(){this._closed||(console.log("close()"),this._closed=true,this._destroyTrack(),this.emit("@close"));}transportClosed(){this._closed||(console.log("transportClosed()"),this._closed=true,this._destroyTrack(),this.safeEmit("transportclose"));}async getStats(){if(this._closed)throw new w("closed");return this.safeEmitAsPromise("@getstats")}pause(){if(this._totalFramesSent=0,console.log("pause()"),this._closed){console.log("pause() | Producer closed");return}this._paused=true,this._track&&(this._track.enabled=false),this._zeroRtpOnPause&&this.safeEmitAsPromise("@replacetrack",null).catch(()=>{});}resume(){if(console.log("resume()"),this._closed){console.log("resume() | Producer closed");return}this._paused=false,this._track&&(this._track.enabled=true),this._zeroRtpOnPause&&this.safeEmitAsPromise("@replacetrack",this._track).catch(()=>{});}async replaceTrack({track:e}){if(console.log("replaceTrack() [track:%o]",e),this._closed){if(e&&this._stopTracks)try{e.stop();}catch{}throw new w("closed")}else if(e&&e.readyState==="ended")throw new w("track ended");if(e===this._track){console.log("replaceTrack() | same track, ignored");return}(!this._zeroRtpOnPause||!this._paused)&&await this.safeEmitAsPromise("@replacetrack",e),this._destroyTrack(),this._track=e,e&&!this._paused?this._track.enabled=true:e&&this._paused&&(this._track.enabled=false),this._handleTrack();}async setMaxSpatialLayer(e){if(this._closed)throw new w("closed");if(this._kind!=="video")throw new y("not a video Producer");if(typeof e!="number")throw new TypeError("invalid spatialLayer");e!==this._maxSpatialLayer&&(await this.safeEmitAsPromise("@setmaxspatiallayer",e),this._maxSpatialLayer=e);}async setRtpEncodingParameters(e){if(this._closed)throw new w("closed");if(typeof e!="object")throw new TypeError("invalid params");await this.safeEmitAsPromise("@setrtpencodingparameters",e);}_onTrackEnded(){console.log('track "ended" event'),this.safeEmit("trackended");}_handleTrack(){this._track&&this._track.addEventListener("ended",this._onTrackEnded);}_destroyTrack(){if(this._track)try{this._track.removeEventListener("ended",this._onTrackEnded),this._stopTracks&&this._track.stop();}catch{}}};var Pe=class extends I{constructor({id:e,recvTransportId:t,localId:r,producerId:s,rtpReceiver:a,track:i,rtpParameters:c,appData:d}){super();this._closed=false;this._observer=new I;console.log("constructor()"),this._id=e,this._recvTransportId=t,this._localId=r,this._producerId=s,this._rtpReceiver=a,this._track=i,this._rtpParameters=c,this._paused=!i.enabled,this._appData=d,this._remotePaused=true,this._voiceEnergyState="stop",this._framesLastReceived=0,this._noFrameRecvInterval=0,this._firstFrameArrived=false,this._packetsLastReceived=0,this._bytesLastReceived=0,this._noPacketRecvInterval=0,this._firstPacketArrived=false,this._onTrackEnded=this._onTrackEnded.bind(this),this._handleTrack();}get id(){return this._id}get recvTransportId(){return this._recvTransportId}get localId(){return this._localId}get producerId(){return this._producerId}get closed(){return this._closed}get kind(){return this._track.kind}get rtpReceiver(){return this._rtpReceiver}get track(){return this._track}get rtpParameters(){return this._rtpParameters}get paused(){return this._paused}get appData(){return this._appData}set appData(e){throw new Error("cannot override appData object")}get observer(){return this._observer}get remotePaused(){return this._remotePaused}SetRemotePaused(e){console.log(`[Consumer] SetRemotePaused=${e}`),this._remotePaused=e;}get voiceEnergyState(){return this._voiceEnergyState}SetVoiceEnergyState(e){this._voiceEnergyState=e;}get framesLastReceived(){return this._framesLastReceived}SetFramesLastReceived(e){this._framesLastReceived=e;}get noFrameRecvInterval(){return this._noFrameRecvInterval}SetNoFrameRecvInterval(e){this._noFrameRecvInterval=e;}get firstFrameArrived(){return this._firstFrameArrived}SetFirstFrameArrived(e){this._firstFrameArrived=e;}get packetsLastReceived(){return this._packetsLastReceived}SetPacketsLastReceived(e){this._packetsLastReceived=e;}get bytesLastReceived(){return this._bytesLastReceived}SetBytesLastReceived(e){this._bytesLastReceived=e;}get noPacketRecvInterval(){return this._noPacketRecvInterval}SetNoPacketRecvInterval(e){this._noPacketRecvInterval=e;}get firstPacketArrived(){return this._firstPacketArrived}SetFirstPacketArrived(e){this._firstPacketArrived=e;}close(){this._closed||(console.log("close()"),this._closed=true,this._destroyTrack(),this.emit("@close"),this._observer.safeEmit("close"));}transportClosed(){this._closed||(console.log("transportClosed()"),this._closed=true,this._destroyTrack(),this.safeEmit("transportclose"),this._observer.safeEmit("close"));}async getStats(){if(this._closed)throw new w("closed");return this.safeEmitAsPromise("@getstats")}pause(){if(console.log("pause()"),this._closed){console.log("pause() | Consumer closed");return}this._paused=true,this._track.enabled=false,this._observer.safeEmit("pause");}resume(){if(console.log("resume()"),this._closed){console.log("resume() | Consumer closed");return}this._paused=false,this._track.enabled=true,this._observer.safeEmit("resume");}_onTrackEnded(){console.log('track "ended" event'),this.safeEmit("trackended"),this._observer.safeEmit("trackended");}_handleTrack(){this._track.addEventListener("ended",this._onTrackEnded);}_destroyTrack(){try{this._track.removeEventListener("ended",this._onTrackEnded),this._track.stop();}catch{}}};var Ce=class extends I{constructor({id:e,dataChannel:t,sctpStreamParameters:r,appData:s}){super();this._closed=false;console.log("constructor()"),this._id=e,this._dataChannel=t,this._sctpStreamParameters=r,this._appData=s,this._handleDataChannel();}get id(){return this._id}get closed(){return this._closed}get sctpStreamParameters(){return this._sctpStreamParameters}get readyState(){return this._dataChannel.readyState}get label(){return this._dataChannel.label}get protocol(){return this._dataChannel.protocol}get bufferedAmount(){return this._dataChannel.bufferedAmount}get bufferedAmountLowThreshold(){return this._dataChannel.bufferedAmountLowThreshold}set bufferedAmountLowThreshold(e){this._dataChannel.bufferedAmountLowThreshold=e;}get appData(){return this._appData}set appData(e){throw new Error("cannot override appData object")}close(){this._closed||(console.log("close()"),this._closed=true,this._dataChannel.close(),this.emit("@close"));}transportClosed(){this._closed||(console.log("transportClosed()"),this._closed=true,this._dataChannel.close(),this.safeEmit("transportclose"));}send(e){if(console.log("send()"),this._closed)throw new w("closed");this._dataChannel.send(e);}_handleDataChannel(){this._dataChannel.addEventListener("open",()=>{this._closed||(console.log('DataChannel "open" event'),this.safeEmit("open"));}),this._dataChannel.addEventListener("error",e=>{if(this._closed)return;let{error:t}=e;t||(t=new Error("unknown DataChannel error")),t.errorDetail==="sctp-failure"?console.log("DataChannel SCTP error [sctpCauseCode:%s]: %s",t.sctpCauseCode,t.message):console.log('DataChannel "error" event: %o',t),this.safeEmit("error",t);}),this._dataChannel.addEventListener("close",()=>{this._closed||(console.log('DataChannel "close" event'),this._closed=true,this.emit("@close"),this.safeEmit("close"));}),this._dataChannel.addEventListener("message",()=>{this._closed||console.log('DataChannel "message" event in a DataProducer, message discarded');}),this._dataChannel.addEventListener("bufferedamountlow",()=>{this._closed||this.safeEmit("bufferedamountlow");});}};var Te=class extends I{constructor({id:e,dataProducerId:t,dataChannel:r,sctpStreamParameters:s,appData:a}){super();this._closed=false;console.log("constructor()"),this._id=e,this._dataProducerId=t,this._dataChannel=r,this._sctpStreamParameters=s,this._appData=a,this._handleDataChannel();}get id(){return this._id}get dataProducerId(){return this._dataProducerId}get closed(){return this._closed}get sctpStreamParameters(){return this._sctpStreamParameters}get readyState(){return this._dataChannel.readyState}get label(){return this._dataChannel.label}get protocol(){return this._dataChannel.protocol}get binaryType(){return this._dataChannel.binaryType}set binaryType(e){this._dataChannel.binaryType=e;}get appData(){return this._appData}set appData(e){throw new Error("cannot override appData object")}close(){this._closed||(console.log("close()"),this._closed=true,this._dataChannel.close(),this.emit("@close"));}transportClosed(){this._closed||(console.log("transportClosed()"),this._closed=true,this._dataChannel.close(),this.safeEmit("transportclose"));}_handleDataChannel(){this._dataChannel.addEventListener("open",()=>{this._closed||(console.log('DataChannel "open" event'),this.safeEmit("open"));}),this._dataChannel.addEventListener("error",e=>{if(this._closed)return;let{error:t}=e;t||(t=new Error("unknown DataChannel error")),t.errorDetail==="sctp-failure"?console.log("DataChannel SCTP error [sctpCauseCode:%s]: %s",t.sctpCauseCode,t.message):console.log('DataChannel "error" event: %o',t),this.safeEmit("error",t);}),this._dataChannel.addEventListener("close",()=>{this._closed||(console.log('DataChannel "close" event'),this._closed=true,this.emit("@close"),this.safeEmit("close"));}),this._dataChannel.addEventListener("message",e=>{this._closed||this.safeEmit("message",e.data);});}};var De=class extends I{constructor({direction:e,id:t,iceParameters:r,iceCandidates:s,dtlsParameters:a,sctpParameters:i,iceServers:c,iceTransportPolicy:d,additionalSettings:l,proprietaryConstraints:p,appData:m,handlerFactory:h,extendedRtpCapabilities:u,canProduceByKind:f}){super();this._closed=false;this._connectionState="new";this._producers=new Map;this._consumers=new Map;this._dataProducers=new Map;this._dataConsumers=new Map;this._probatorConsumerCreated=false;this._awaitQueue=new awaitqueue.AwaitQueue({ClosedErrorClass:w});this._lastpacketlost=0;this._lastpacketsSentOrRecv=0;console.log("constructor() [id:%s, direction:%s]",t,e),this._id=t,this._direction=e,this._extendedRtpCapabilities=u,this._canProduceByKind=f,this._maxSctpMessageSize=i?i.maxMessageSize:null,l=v(l),delete l.iceServers,delete l.iceTransportPolicy,delete l.bundlePolicy,delete l.rtcpMuxPolicy,delete l.sdpSemantics,this._handler=h(),this._handler.run({additionalSettings:l,direction:e,dtlsParameters:a,extendedRtpCapabilities:u,iceCandidates:s,iceParameters:r,iceServers:c,iceTransportPolicy:d,proprietaryConstraints:p,sctpParameters:i}),this._lastpacketlost=0,this._appData=m,this._handleHandler();}get id(){return this._id}get lastpacketlost(){return this._lastpacketlost}set lastpacketlost(e){this._lastpacketlost=e;}get lastpacketsSentOrRecv(){return this._lastpacketsSentOrRecv}set lastpacketsSentOrRecv(e){this._lastpacketsSentOrRecv=e;}get closed(){return this._closed}get direction(){return this._direction}get handler(){return this._handler}get connectionState(){return this._connectionState}get appData(){return this._appData}set appData(e){throw new Error("cannot override appData object")}close(){if(!this._closed){console.log("close()"),this._closed=true,this._awaitQueue.close(),this._handler.close();for(let e of this._producers.values())e.transportClosed();this._producers.clear();for(let e of this._consumers.values())e.transportClosed();this._consumers.clear();for(let e of this._dataProducers.values())e.transportClosed();this._dataProducers.clear();for(let e of this._dataConsumers.values())e.transportClosed();this._dataConsumers.clear();}}async getStats(){if(this._closed)throw new w("closed");return this._handler.getTransportStats()}async restartIce({iceParameters:e}){if(console.log("restartIce()"),this._closed)throw new w("closed");if(!e)throw new TypeError("missing iceParameters");return this._awaitQueue.push(async()=>this._handler.restartIce(e))}async updateIceServers({iceServers:e}={}){if(console.log("updateIceServers()"),this._closed)throw new w("closed");if(!Array.isArray(e))throw new TypeError("missing iceServers");return this._awaitQueue.push(async()=>this._handler.updateIceServers(e))}async produce({track:e,encodings:t,codecOptions:r,codec:s,stopTracks:a=true,zeroRtpOnPause:i=false,appData:c={}}={}){if(console.log("produce() [track:%o]",e),e){if(this._direction!=="send")throw new y("not a sending Transport");if(this._canProduceByKind[e.kind]){if(e.readyState==="ended")throw new w("track ended");if(this.listenerCount("connect")===0&&this._connectionState==="new")throw new TypeError('no "connect" listener set into this transport');if(this.listenerCount("produce")===0)throw new TypeError('no "produce" listener set into this transport');if(c&&typeof c!="object")throw new TypeError("if given, appData must be an object")}else throw new y(`cannot produce ${e.kind}`)}else throw new TypeError("missing track");return this._awaitQueue.push(async()=>{let d;if(t&&!Array.isArray(t))throw TypeError("encodings must be an array");t&&t.length===0?d=void 0:t&&(d=t.map(h=>{let u={active:true};return h.active===false&&(u.active=false),typeof h.maxBitrate=="number"&&(u.maxBitrate=h.maxBitrate),typeof h.maxFramerate=="number"&&(u.maxFramerate=h.maxFramerate),typeof h.scaleResolutionDownBy=="number"&&(u.scaleResolutionDownBy=h.scaleResolutionDownBy),typeof h.dtx=="boolean"&&(u.dtx=h.dtx),typeof h.scalabilityMode=="string"&&(u.scalabilityMode=h.scalabilityMode),typeof h.priority=="string"&&(u.priority=h.priority),typeof h.networkPriority=="string"&&(u.networkPriority=h.networkPriority),u}));let{localId:l,rtpParameters:p,rtpSender:m}=await this._handler.send({codec:s,codecOptions:r,encodings:d,track:e});try{we(p);let{id:h}=await this.safeEmitAsPromise("produce",{appData:c,kind:e.kind,rtpParameters:p}),u=new be({appData:c,id:h,localId:l,rtpParameters:p,rtpSender:m,stopTracks:a,track:e,zeroRtpOnPause:i});return this._producers.set(u.id,u),this._handleProducer(u),u}catch(h){throw this._handler.stopSending(l).catch(()=>{}),h}}).catch(d=>{if(a)try{e.stop();}catch{}throw d})}async consume({id:e,recvTransportId:t,producerId:r,kind:s,rtpParameters:a,appData:i={}}={}){if(console.log("consume()"),this._closed)throw new w("closed");if(this._direction!=="recv")throw new y("not a receiving Transport");if(typeof e!="string")throw new TypeError("missing id");if(typeof r!="string")throw new TypeError("missing producerId");if(s!=="audio"&&s!=="video")throw new TypeError(`invalid kind '${s}'`);if(this.listenerCount("connect")===0&&this._connectionState==="new")throw new TypeError('no "connect" listener set into this transport');if(i&&typeof i!="object")throw new TypeError("if given, appData must be an object");return this._awaitQueue.push(async()=>{if(!tt(a,this._extendedRtpCapabilities))throw new y("cannot consume this Producer");if(a===void 0)throw new y("cannot consume this Producer");if(t===void 0)throw new y("cannot consume this Producer");if(a===void 0)throw new y("cannot consume this Producer");let{localId:d,rtpReceiver:l,track:p}=await this._handler.receive({kind:s,rtpParameters:a,trackId:e}),m=new Pe({appData:i,id:e,localId:d,producerId:r,recvTransportId:t,rtpParameters:a,rtpReceiver:l,track:p});if(this._consumers.set(m.id,m),this._handleConsumer(m),!this._probatorConsumerCreated&&s==="video")try{let h=et(m.rtpParameters);await this._handler.receive({kind:"video",rtpParameters:h,trackId:"probator"}),console.log("consume() | Consumer for RTP probation created"),this._probatorConsumerCreated=!0;}catch(h){console.log("consume() | failed to create Consumer for RTP probation:%o",h);}return m})}async produceData({ordered:e=true,maxPacketLifeTime:t,maxRetransmits:r,priority:s="low",label:a="",protocol:i="",appData:c={}}={}){if(console.log("produceData()"),this._direction!=="send")throw new y("not a sending Transport");if(this._maxSctpMessageSize)if(["very-low","low","medium","high"].includes(s)){if(this.listenerCount("connect")===0&&this._connectionState==="new")throw new TypeError('no "connect" listener set into this transport');if(this.listenerCount("producedata")===0)throw new TypeError('no "producedata" listener set into this transport');if(c&&typeof c!="object")throw new TypeError("if given, appData must be an object")}else throw new TypeError("wrong priority");else throw new y("SCTP not enabled by remote Transport");return (t||r)&&(e=false),this._awaitQueue.push(async()=>{let{dataChannel:d,sctpStreamParameters:l}=await this._handler.sendDataChannel({label:a,maxPacketLifeTime:t,maxRetransmits:r,ordered:e,priority:s,protocol:i});Fe(l);let{id:p}=await this.safeEmitAsPromise("producedata",{appData:c,label:a,protocol:i,sctpStreamParameters:l}),m=new Ce({appData:c,dataChannel:d,id:p,sctpStreamParameters:l});return this._dataProducers.set(m.id,m),this._handleDataProducer(m),m})}async consumeData({id:e,dataProducerId:t,sctpStreamParameters:r,label:s="",protocol:a="",appData:i={}}){if(console.log("consumeData()"),this._closed)throw new w("closed");if(this._direction!=="recv")throw new y("not a receiving Transport");if(this._maxSctpMessageSize){if(typeof e!="string")throw new TypeError("missing id");if(typeof t!="string")throw new TypeError("missing dataProducerId");if(this.listenerCount("connect")===0&&this._connectionState==="new")throw new TypeError('no "connect" listener set into this transport');if(i&&typeof i!="object")throw new TypeError("if given, appData must be an object")}else throw new y("SCTP not enabled by remote Transport");return Fe(r),this._awaitQueue.push(async()=>{let{dataChannel:c}=await this._handler.receiveDataChannel({label:s,protocol:a,sctpStreamParameters:r}),d=new Te({appData:i,dataChannel:c,dataProducerId:t,id:e,sctpStreamParameters:r});return this._dataConsumers.set(d.id,d),this._handleDataConsumer(d),d})}_handleHandler(){let e=this._handler;e.on("@connect",({dtlsParameters:t},r,s)=>{if(this._closed){s(new w("closed"));return}this.safeEmit("connect",{dtlsParameters:t},r,s);}),e.on("@connectionstatechange",t=>{t!==this._connectionState&&(console.log("connection state changed to %s",t),this._connectionState=t,this._closed||this.safeEmit("connectionstatechange",t));});}_handleProducer(e){e.on("@close",()=>{this._producers.delete(e.id),!this._closed&&this._awaitQueue.push(async()=>this._handler.stopSending(e.localId)).catch(t=>console.log("producer.close() failed:%o",t));}),e.on("@replacetrack",(t,r,s)=>{this._awaitQueue.push(async()=>this._handler.replaceTrack(e.localId,t)).then(r).catch(s);}),e.on("@setmaxspatiallayer",(t,r,s)=>{this._awaitQueue.push(async()=>this._handler.setMaxSpatialLayer(e.localId,t)).then(r).catch(s);}),e.on("@setrtpencodingparameters",(t,r,s)=>{this._awaitQueue.push(async()=>this._handler.setRtpEncodingParameters(e.localId,t)).then(r).catch(s);}),e.on("@getstats",(t,r)=>{if(this._closed)return r(new w("closed"));this._handler.getSenderStats(e.localId).then(t).catch(r);});}_handleConsumer(e){e.on("@close",()=>{this._consumers.delete(e.id),!this._closed&&this._awaitQueue.push(async()=>this._handler.stopReceiving(e.localId)).catch(()=>{});}),e.on("@getstats",(t,r)=>{if(this._closed)return r(new w("closed"));this._handler.getReceiverStats(e.localId).then(t).catch(r);});}_handleDataProducer(e){e.on("@close",()=>{this._dataProducers.delete(e.id);});}_handleDataConsumer(e){e.on("@close",()=>{this._dataConsumers.delete(e.id);});}};function L({sdpObject:o}){let n=new Map,e=[],t=false,r=false;for(let a of o.media){let i=a.type;switch(i){case "audio":{if(t)continue;t=true;break}case "video":{if(r)continue;r=true;break}default:continue}for(let c of a.rtp){let d={channels:c.encoding,clockRate:c.rate,kind:i,mimeType:`${i}/${c.codec}`,parameters:{},preferredPayloadType:c.payload,rtcpFeedback:[]};n.set(d.preferredPayloadType,d);}for(let c of a.fmtp||[]){let d=j__namespace.parseParams(c.config),l=n.get(c.payload);l&&(d&&d["profile-level-id"]&&(d["profile-level-id"]=String(d["profile-level-id"])),l.parameters=d);}for(let c of a.rtcpFb||[]){let d=n.get(c.payload);if(!d)continue;let l={parameter:c.subtype,type:c.type};l.parameter||delete l.parameter,d.rtcpFeedback.push(l);}for(let c of a.ext||[]){if(c["encrypt-uri"])continue;let d={kind:i,preferredId:c.value,uri:c.uri};e.push(d);}}return {codecs:Array.from(n.values()),headerExtensions:e}}function x({sdpObject:o}){let n=(o.media||[]).find(s=>s.iceUfrag&&s.port!==0);if(!n)throw new Error("no active media section found");let e=n.fingerprint||o.fingerprint,t=null;switch(n.setup){case "active":t="client";break;case "passive":t="server";break;case "actpass":t="auto";break}if(!t)throw new Error("no DTLS role found");return {fingerprints:[{algorithm:e.type,value:e.hash}],role:t}}function M({offerMediaObject:o}){let n=(o.ssrcs||[]).find(e=>e.attribute==="cname");return n?n.value:""}function O({offerRtpParameters:o,answerMediaObject:n}){for(let e of o.codecs){let t=e.mimeType.toLowerCase();if(t!=="audio/opus"||!(n.rtp||[]).find(i=>i.payload===e.payloadType))continue;n.fmtp=n.fmtp||[];let s=n.fmtp.find(i=>i.payload===e.payloadType);s||(s={config:"",payload:e.payloadType},n.fmtp.push(s));let a=j__namespace.parseParams(s.config);switch(t){case "audio/opus":{let i=e.parameters["sprop-stereo"];i!==void 0&&(a.stereo=i?1:0);break}}s.config="";for(let i of Object.keys(a))s.config&&(s.config+=";"),s.config+=`${i}=${a[i]}`;}}function J({offerMediaObject:o}){let n=new Set;for(let r of o.ssrcs||[]){let s=r.id;n.add(s);}if(n.size===0)throw new Error("no a=ssrc lines found");let e=new Map;for(let r of o.ssrcGroups||[]){if(r.semantics!=="FID")continue;let[s,a]=r.ssrcs.split(/\s+/);s=Number(s),a=Number(a),n.has(s)&&(n.delete(s),n.delete(a),e.set(s,a));}for(let r of n)e.set(r,null);let t=[];for(let[r,s]of e){let a={ssrc:r};s&&(a.rtx={ssrc:s}),t.push(a);}return t}function ae({offerMediaObject:o,numStreams:n}){if(n<=1)throw new TypeError("numStreams must be greater than 1");let e=(o.ssrcs||[]).find(p=>p.attribute==="msid");if(!e)throw new Error("a=ssrc line with msid information not found");let[t,r]=e.value.split(" ")[0],s=e.id,a;(o.ssrcGroups||[]).some(p=>{if(p.semantics!=="FID")return false;let m=p.ssrcs.split(/\s+/);return Number(m[0])===s?(a=Number(m[1]),true):false});let i=o.ssrcs.find(p=>p.attribute==="cname");if(!i)throw new Error("a=ssrc line with cname information not found");let c=i.value,d=[],l=[];for(let p=0;p<n;++p)d.push(s+p),a&&l.push(a+p);o.ssrcGroups=[],o.ssrcs=[],o.ssrcGroups.push({semantics:"SIM",ssrcs:d.join(" ")});for(let p=0;p<d.length;++p){let m=d[p];o.ssrcs.push({attribute:"cname",id:m,value:c}),o.ssrcs.push({attribute:"msid",id:m,value:`${t} ${r}`});}for(let p=0;p<l.length;++p){let m=d[p],h=l[p];o.ssrcs.push({attribute:"cname",id:h,value:c}),o.ssrcs.push({attribute:"msid",id:h,value:`${t} ${r}`}),o.ssrcGroups.push({semantics:"FID",ssrcs:`${m} ${h}`});}}var D=class extends I{constructor(){super();}};function rt(o){let e=new RegExp("^(audio|video)/(.+)","i").exec(o.mimeType);if(!e)throw new TypeError("invalid codec.mimeType");return e[2]}var Ie=class{constructor({iceParameters:n,iceCandidates:e,dtlsParameters:t,planB:r=false}){if(this._mediaObject={},this._planB=r,n&&this.setIceParameters(n),e){this._mediaObject.candidates=[];for(let s of e){let a={};a.component=1,a.foundation=s.foundation,a.ip=s.ip,a.port=s.port,a.priority=s.priority,a.transport=s.protocol,a.type=s.type,s.tcpType&&(a.tcptype=s.tcpType),this._mediaObject.candidates.push(a);}this._mediaObject.endOfCandidates="end-of-candidates",this._mediaObject.iceOptions="renomination";}t&&this.setDtlsRole(t.role);}get mid(){return String(this._mediaObject.mid)}get closed(){return this._mediaObject.port===0}getObject(){return this._mediaObject}setIceParameters(n){this._mediaObject.iceUfrag=n.usernameFragment,this._mediaObject.icePwd=n.password;}disable(){this._mediaObject.direction="inactive",delete this._mediaObject.ext,delete this._mediaObject.ssrcs,delete this._mediaObject.ssrcGroups,delete this._mediaObject.simulcast,delete this._mediaObject.simulcast_03,delete this._mediaObject.rids;}close(){this._mediaObject.direction="inactive",this._mediaObject.port=0,delete this._mediaObject.ext,delete this._mediaObject.ssrcs,delete this._mediaObject.ssrcGroups,delete this._mediaObject.simulcast,delete this._mediaObject.simulcast_03,delete this._mediaObject.rids,delete this._mediaObject.extmapAllowMixed;}},le=class extends Ie{constructor({iceParameters:n,iceCandidates:e,dtlsParameters:t,sctpParameters:r,plainRtpParameters:s,planB:a=false,offerMediaObject:i,offerRtpParameters:c,answerRtpParameters:d,codecOptions:l,extmapAllowMixed:p=false}){switch(super({dtlsParameters:t,iceCandidates:e,iceParameters:n,planB:a}),this._mediaObject.mid=String(i.mid),this._mediaObject.type=i.type,this._mediaObject.protocol=i.protocol,s?(this._mediaObject.connection={ip:s.ip,version:s.ipVersion},this._mediaObject.port=s.port):(this._mediaObject.connection={ip:"127.0.0.1",version:4},this._mediaObject.port=7),i.type){case "audio":case "video":{this._mediaObject.direction="recvonly",this._mediaObject.rtp=[],this._mediaObject.rtcpFb=[],this._mediaObject.fmtp=[];for(let m of d.codecs){let h={codec:rt(m),payload:m.payloadType,rate:m.clockRate};m.channels>1&&(h.encoding=m.channels),this._mediaObject.rtp.push(h);let u=v(m.parameters||{});if(l){let{opusStereo:g,opusFec:R,opusDtx:S,opusMaxPlaybackRate:N,opusMaxAverageBitrate:z,opusPtime:E,videoGoogleStartBitrate:C,videoGoogleMaxBitrate:K,videoGoogleMinBitrate:_}=l,A=c.codecs.find(X=>X.payloadType===m.payloadType);switch(m.mimeType.toLowerCase()){case "audio/opus":{g!==void 0&&(A.parameters["sprop-stereo"]=g?1:0,u.stereo=g?1:0),R!==void 0&&(A.parameters.useinbandfec=R?1:0,u.useinbandfec=R?1:0),S!==void 0&&(A.parameters.usedtx=S?1:0,u.usedtx=S?1:0),N!==void 0&&(u.maxplaybackrate=N),z!==void 0&&(u.maxaveragebitrate=z),E!==void 0&&(A.parameters.ptime=E,u.ptime=E);break}case "video/vp8":case "video/vp9":case "video/h264":case "video/h265":{C!==void 0&&(u["x-google-start-bitrate"]=C),K!==void 0&&(u["x-google-max-bitrate"]=K),_!==void 0&&(u["x-google-min-bitrate"]=_);break}}}let f={config:"",payload:m.payloadType};for(let g of Object.keys(u))f.config&&(f.config+=";"),f.config+=`${g}=${u[g]}`;f.config&&this._mediaObject.fmtp.push(f);for(let g of m.rtcpFeedback)this._mediaObject.rtcpFb.push({payload:m.payloadType,subtype:g.parameter,type:g.type});}this._mediaObject.payloads=d.codecs.map(m=>m.payloadType).join(" "),this._mediaObject.ext=[];for(let m of d.headerExtensions)(i.ext||[]).some(u=>u.uri===m.uri)&&this._mediaObject.ext.push({uri:m.uri,value:m.id});if(p&&i.extmapAllowMixed==="extmap-allow-mixed"&&(this._mediaObject.extmapAllowMixed="extmap-allow-mixed"),i.simulcast){this._mediaObject.simulcast={dir1:"recv",list1:i.simulcast.list1},this._mediaObject.rids=[];for(let m of i.rids||[])m.direction==="send"&&this._mediaObject.rids.push({direction:"recv",id:m.id});}else if(i.simulcast_03){this._mediaObject.simulcast_03={value:i.simulcast_03.value.replace(/send/g,"recv")},this._mediaObject.rids=[];for(let m of i.rids||[])m.direction==="send"&&this._mediaObject.rids.push({id:m.id,direction:"recv"});}this._mediaObject.rtcpMux="rtcp-mux",this._mediaObject.rtcpRsize="rtcp-rsize",this._planB&&this._mediaObject.type==="video"&&(this._mediaObject.xGoogleFlag="conference");break}case "application":{typeof i.sctpPort=="number"?(this._mediaObject.payloads="webrtc-datachannel",this._mediaObject.sctpPort=r.port,this._mediaObject.maxMessageSize=r.maxMessageSize):i.sctpmap&&(this._mediaObject.payloads=r.port,this._mediaObject.sctpmap={app:"webrtc-datachannel",sctpmapNumber:r.port,maxMessageSize:r.maxMessageSize});break}}}setDtlsRole(n){switch(n){case "client":this._mediaObject.setup="active";break;case "server":this._mediaObject.setup="passive";break;case "auto":this._mediaObject.setup="actpass";break}}},me=class extends Ie{constructor({iceParameters:n,iceCandidates:e,dtlsParameters:t,sctpParameters:r,plainRtpParameters:s,planB:a=false,mid:i,kind:c,offerRtpParameters:d,streamId:l,trackId:p,oldDataChannelSpec:m=false}){switch(super({iceParameters:n,iceCandidates:e,dtlsParameters:t,planB:a}),this._mediaObject.mid=String(i),this._mediaObject.type=c,s?(this._mediaObject.connection={ip:s.ip,version:s.ipVersion},this._mediaObject.protocol="RTP/AVP",this._mediaObject.port=s.port):(this._mediaObject.connection={ip:"127.0.0.1",version:4},r?this._mediaObject.protocol="UDP/DTLS/SCTP":this._mediaObject.protocol="UDP/TLS/RTP/SAVPF",this._mediaObject.port=7),c){case "audio":case "video":{this._mediaObject.direction="sendonly",this._mediaObject.rtp=[],this._mediaObject.rtcpFb=[],this._mediaObject.fmtp=[],this._planB||(this._mediaObject.msid=`${l||"-"} ${p}`);for(let g of d.codecs){let R={payload:g.payloadType,codec:rt(g),rate:g.clockRate};g.channels>1&&(R.encoding=g.channels),this._mediaObject.rtp.push(R);let S={payload:g.payloadType,config:""};for(let N of Object.keys(g.parameters))S.config&&(S.config+=";"),S.config+=`${N}=${g.parameters[N]}`;S.config&&this._mediaObject.fmtp.push(S);for(let N of g.rtcpFeedback)this._mediaObject.rtcpFb.push({payload:g.payloadType,type:N.type,subtype:N.parameter});}this._mediaObject.payloads=d.codecs.map(g=>g.payloadType).join(" "),this._mediaObject.ext=[];for(let g of d.headerExtensions)this._mediaObject.ext.push({uri:g.uri,value:g.id});this._mediaObject.rtcpMux="rtcp-mux",this._mediaObject.rtcpRsize="rtcp-rsize";let h=d.encodings[0],u=h.ssrc,f=h.rtx&&h.rtx.ssrc?h.rtx.ssrc:void 0;this._mediaObject.ssrcs=[],this._mediaObject.ssrcGroups=[],d.rtcp.cname&&this._mediaObject.ssrcs.push({id:u,attribute:"cname",value:d.rtcp.cname}),this._planB&&this._mediaObject.ssrcs.push({id:u,attribute:"msid",value:`${l||"-"} ${p}`}),f&&(d.rtcp.cname&&this._mediaObject.ssrcs.push({id:f,attribute:"cname",value:d.rtcp.cname}),this._planB&&this._mediaObject.ssrcs.push({id:f,attribute:"msid",value:`${l||"-"} ${p}`}),this._mediaObject.ssrcGroups.push({semantics:"FID",ssrcs:`${u} ${f}`}));break}case "application":{m?(this._mediaObject.payloads=r.port,this._mediaObject.sctpmap={app:"webrtc-datachannel",sctpmapNumber:r.port,maxMessageSize:r.maxMessageSize}):(this._mediaObject.payloads="webrtc-datachannel",this._mediaObject.sctpPort=r.port,this._mediaObject.maxMessageSize=r.maxMessageSize);break}}}setDtlsRole(n){this._mediaObject.setup="actpass";}planBReceive({offerRtpParameters:n,streamId:e,trackId:t}){let r=n.encodings[0],s=r.ssrc,a=r.rtx&&r.rtx.ssrc?r.rtx.ssrc:void 0;n.rtcp.cname&&this._mediaObject.ssrcs.push({id:s,attribute:"cname",value:n.rtcp.cname}),this._mediaObject.ssrcs.push({id:s,attribute:"msid",value:`${e||"-"} ${t}`}),a&&(n.rtcp.cname&&this._mediaObject.ssrcs.push({id:a,attribute:"cname",value:n.rtcp.cname}),this._mediaObject.ssrcs.push({id:a,attribute:"msid",value:`${e||"-"} ${t}`}),this._mediaObject.ssrcGroups.push({semantics:"FID",ssrcs:`${s} ${a}`}));}planBStopReceiving({offerRtpParameters:n}){let e=n.encodings[0],t=e.ssrc,r=e.rtx&&e.rtx.ssrc?e.rtx.ssrc:void 0;this._mediaObject.ssrcs=this._mediaObject.ssrcs.filter(s=>s.id!==t&&s.id!==r),r&&(this._mediaObject.ssrcGroups=this._mediaObject.ssrcGroups.filter(s=>s.ssrcs!==`${t} ${r}`));}};var k=class{constructor({iceParameters:n,iceCandidates:e,dtlsParameters:t,sctpParameters:r,plainRtpParameters:s,planB:a=false}){this._mediaSections=[];this._midToIndex=new Map;if(this._iceParameters=n,this._iceCandidates=e,this._dtlsParameters=t,this._sctpParameters=r,this._plainRtpParameters=s,this._planB=a,this._sdpObject={media:[],name:"-",origin:{address:"0.0.0.0",ipVer:4,netType:"IN",sessionId:1e4,sessionVersion:0,username:"mediasoup-client"},timing:{start:0,stop:0},version:0},n&&n.iceLite&&(this._sdpObject.icelite="ice-lite"),t){this._sdpObject.msidSemantic={semantic:"WMS",token:"*"};let i=this._dtlsParameters.fingerprints.length;this._sdpObject.fingerprint={hash:t.fingerprints[i-1].value,type:t.fingerprints[i-1].algorithm},this._sdpObject.groups=[{mids:"",type:"BUNDLE"}];}s&&(this._sdpObject.origin.address=s.ip,this._sdpObject.origin.ipVer=s.ipVersion);}updateIceParameters(n){this._iceParameters=n,this._sdpObject.icelite=n.iceLite?"ice-lite":void 0;for(let e of this._mediaSections)e.setIceParameters(n);}updateDtlsRole(n){console.log("updateDtlsRole() [role:%s]",n),this._dtlsParameters.role=n;for(let e of this._mediaSections)e.setDtlsRole(n);}getNextMediaSectionIdx(){for(let n=0;n<this._mediaSections.length;++n){let e=this._mediaSections[n];if(e.closed)return {idx:n,reuseMid:e.mid}}return {idx:this._mediaSections.length}}send({offerMediaObject:n,reuseMid:e,offerRtpParameters:t,answerRtpParameters:r,codecOptions:s,extmapAllowMixed:a=false}){let i=new le({answerRtpParameters:r,codecOptions:s,dtlsParameters:this._dtlsParameters,extmapAllowMixed:a,iceCandidates:this._iceCandidates,iceParameters:this._iceParameters,offerMediaObject:n,offerRtpParameters:t,plainRtpParameters:this._plainRtpParameters,planB:this._planB});e?this._replaceMediaSection(i,e):this._midToIndex.has(i.mid)?this._replaceMediaSection(i):this._addMediaSection(i);}receive({mid:n,kind:e,offerRtpParameters:t,streamId:r,trackId:s}){let a=this._midToIndex.get(n),i;a!==void 0?i=this._mediaSections[a]:i=null,i?(i.planBReceive({offerRtpParameters:t,streamId:r,trackId:s}),this._replaceMediaSection(i)):(i=new me({dtlsParameters:this._dtlsParameters,iceCandidates:this._iceCandidates,iceParameters:this._iceParameters,kind:e,mid:n,offerRtpParameters:t,plainRtpParameters:this._plainRtpParameters,planB:this._planB,streamId:r,trackId:s}),this._addMediaSection(i));}disableMediaSection(n){let e=this._midToIndex.get(n);this._mediaSections[e].disable();}closeMediaSection(n){let e=this._midToIndex.get(n),t=this._mediaSections[e];if(n===this._firstMid){console.log("closeMediaSection() | cannot close first media section, disabling it instead [mid:%s]",n),this.disableMediaSection(n);return}t.close(),this._regenerateBundleMids();}planBStopReceiving({mid:n,offerRtpParameters:e}){let t=this._midToIndex.get(n),r=this._mediaSections[t];r.planBStopReceiving({offerRtpParameters:e}),this._replaceMediaSection(r);}sendSctpAssociation({offerMediaObject:n}){let e=new le({dtlsParameters:this._dtlsParameters,iceCandidates:this._iceCandidates,iceParameters:this._iceParameters,offerMediaObject:n,plainRtpParameters:this._plainRtpParameters,sctpParameters:this._sctpParameters});this._addMediaSection(e);}receiveSctpAssociation({oldDataChannelSpec:n=false}={}){let e=new me({dtlsParameters:this._dtlsParameters,iceCandidates:this._iceCandidates,iceParameters:this._iceParameters,kind:"application",mid:"datachannel",oldDataChannelSpec:n,plainRtpParameters:this._plainRtpParameters,sctpParameters:this._sctpParameters});this._addMediaSection(e);}getSdp(){return this._sdpObject.origin.sessionVersion++,j__namespace.write(this._sdpObject)}_addMediaSection(n){this._firstMid||(this._firstMid=n.mid),this._mediaSections.push(n),this._midToIndex.set(n.mid,this._mediaSections.length-1),this._sdpObject.media.push(n.getObject()),this._regenerateBundleMids();}_replaceMediaSection(n,e){if(e){let t=this._midToIndex.get(e),r=this._mediaSections[t];this._mediaSections[t]=n,this._midToIndex.delete(r.mid),this._midToIndex.set(n.mid,t),this._sdpObject.media[t]=n.getObject(),this._regenerateBundleMids();}else {let t=this._midToIndex.get(n.mid);this._mediaSections[t]=n,this._sdpObject.media[t]=n.getObject();}}_regenerateBundleMids(){this._dtlsParameters&&(this._sdpObject.groups[0].mids=this._mediaSections.filter(n=>!n.closed).map(n=>n.mid).join(" "));}};var Ht=new RegExp("^[LS]([1-9]\\d{0,1})T([1-9]\\d{0,1})");function he(o){let n=Ht.exec(o);return n?{spatialLayers:Number(n[1]),temporalLayers:Number(n[2])}:{spatialLayers:1,temporalLayers:1}}var at={MIS:1024,OS:1024},Ee=class o extends D{constructor(){super();this._direction="send";this._remoteSdp=null;this._sendingRtpParametersByKind=null;this._sendingRemoteRtpParametersByKind=null;this._mapMidTransceiver=new Map;this._sendStream=new MediaStream;this._hasDataChannelMediaSection=false;this._nextSendSctpStreamId=0;this._transportReady=false;}static createFactory(){return ()=>new o}get name(){return "Chrome74"}close(){if(console.log("[Chrome74] close()"),this._pc)try{this._pc.close();}catch{}}async getNativeRtpCapabilities(){console.log("[Chrome74] getNativeRtpCapabilities()");let e=new RTCPeerConnection({bundlePolicy:"max-bundle",iceServers:[],iceTransportPolicy:"all",rtcpMuxPolicy:"require",sdpSemantics:"unified-plan"});try{e.addTransceiver("audio"),e.addTransceiver("video");let t=await e.createOffer();try{e.close();}catch{}let r=j__namespace.parse(t.sdp);return L({sdpObject:r})}catch{try{e.close();}catch{}throw "error occured"}}async getNativeSctpCapabilities(){return console.log("[Chrome74] getNativeSctpCapabilities()"),{numStreams:at}}run({direction:e,iceParameters:t,iceCandidates:r,dtlsParameters:s,sctpParameters:a,iceServers:i,iceTransportPolicy:c,additionalSettings:d,proprietaryConstraints:l,extendedRtpCapabilities:p}){console.log("[Chrome74] run()"),this._direction=e,this._remoteSdp=new k({dtlsParameters:s,iceCandidates:r,iceParameters:t,sctpParameters:a}),this._sendingRtpParametersByKind={audio:b("audio",p),video:b("video",p)},this._sendingRemoteRtpParametersByKind={audio:T("audio",p),video:T("video",p)},this._pc=new RTCPeerConnection({bundlePolicy:"max-bundle",iceServers:i||[],iceTransportPolicy:c||"all",rtcpMuxPolicy:"require",sdpSemantics:"unified-plan",...d},l),this._pc.addEventListener("iceconnectionstatechange",()=>{switch(this._pc.iceConnectionState){case "checking":this.emit("@connectionstatechange","connecting");break;case "connected":case "completed":this.emit("@connectionstatechange","connected");break;case "failed":this.emit("@connectionstatechange","failed");break;case "disconnected":this.emit("@connectionstatechange","disconnected");break;case "closed":this.emit("@connectionstatechange","closed");break}});}async updateIceServers(e){console.log("[Chrome74] updateIceServers()");let t=this._pc.getConfiguration();t.iceServers=e,this._pc.setConfiguration(t);}async restartIce(e){if(console.log("[Chrome74] restartIce()"),this._remoteSdp.updateIceParameters(e),!!this._transportReady)if(this._direction==="send"){let t=await this._pc.createOffer({iceRestart:true});console.log(`[Chrome74] restartIce() | calling pc.setLocalDescription() [offer:${t}]`),await this._pc.setLocalDescription(t);let r={sdp:this._remoteSdp.getSdp(),type:"answer"};console.log(`[Chrome74] restartIce() | calling pc.setRemoteDescription() [answer:${r}]`),await this._pc.setRemoteDescription(r);}else {let t={sdp:this._remoteSdp.getSdp(),type:"offer"};console.log(`[Chrome74] restartIce() | calling pc.setRemoteDescription() [offer:${t}]`),await this._pc.setRemoteDescription(t);let r=await this._pc.createAnswer();console.log(`[Chrome74] restartIce() | calling pc.setLocalDescription() [answer:${r}]`),await this._pc.setLocalDescription(r);}}async getTransportStats(){return this._pc.getStats()}async send({track:e,encodings:t,codecOptions:r,codec:s}){this._assertSendDirection(),console.log(`[Chrome74] send() [kind:${e.kind}, track.id:${e.id}]`),t&&t.length>1&&t.forEach((R,S)=>{R.rid=`r${S}`;});let a=v(this._sendingRtpParametersByKind[e.kind]);a.codecs=P(a.codecs,s);let i=v(this._sendingRemoteRtpParametersByKind[e.kind]);i.codecs=P(i.codecs,s);let c=this._remoteSdp.getNextMediaSectionIdx(),d=this._pc.addTransceiver(e,{direction:"sendonly",sendEncodings:t,streams:[this._sendStream]}),l=await this._pc.createOffer(),p=j__namespace.parse(l.sdp),m;this._transportReady||await this._setupTransport({localDtlsRole:"server",localSdpObject:p});let h=false,u=he((t||[{}])[0].scalabilityMode||"");t&&t.length===1&&u.spatialLayers>1&&a.codecs[0].mimeType.toLowerCase()==="video/vp9"&&(console.log("[Chrome74] send() | enabling legacy simulcast for VP9 SVC"),h=true,p=j__namespace.parse(l.sdp),m=p.media[c.idx],ae({numStreams:u.spatialLayers,offerMediaObject:m}),l={sdp:j__namespace.write(p),type:"offer"}),console.log(`[Chrome74] send() | calling pc.setLocalDescription() [offer:${l}]`),await this._pc.setLocalDescription(l);let f=d.mid;if(a.mid=f,p=j__namespace.parse(this._pc.localDescription.sdp),m=p.media[c.idx],a.rtcp.cname=M({offerMediaObject:m}),!t)a.encodings=J({offerMediaObject:m});else if(t.length===1){let R=J({offerMediaObject:m});Object.assign(R[0],t[0]),h&&(R=[R[0]]),a.encodings=R;}else a.encodings=t;if(a.encodings.length>1&&(a.codecs[0].mimeType.toLowerCase()==="video/vp8"||a.codecs[0].mimeType.toLowerCase()==="video/h264"))for(let R of a.encodings)R.scalabilityMode="S1T3";this._remoteSdp.send({answerRtpParameters:i,codecOptions:r,extmapAllowMixed:true,offerMediaObject:m,offerRtpParameters:a,reuseMid:c.reuseMid});let g={sdp:this._remoteSdp.getSdp(),type:"answer"};return console.log(`[Chrome74] send() | calling pc.setRemoteDescription() [answer:${g}]`),await this._pc.setRemoteDescription(g),this._mapMidTransceiver.set(f,d),{localId:f,rtpParameters:a,rtpSender:d.sender}}async stopSending(e){this._assertSendDirection(),console.log(`[Chrome74] stopSending() [localId:${e}]`);let t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated RTCRtpTransceiver not found");t.sender.replaceTrack(null),this._pc.removeTrack(t.sender),this._remoteSdp.closeMediaSection(t.mid);let r=await this._pc.createOffer();console.log(`[Chrome74] stopSending() | calling pc.setLocalDescription() [offer:${r}]`),await this._pc.setLocalDescription(r);let s={sdp:this._remoteSdp.getSdp(),type:"answer"};console.log(`[Chrome74] stopSending() | calling pc.setRemoteDescription() [answer:${s}]`),await this._pc.setRemoteDescription(s);}async replaceTrack(e,t){this._assertSendDirection(),console.log(t?`[Chrome74] replaceTrack() [localId:${e}, track.id:${t.id}]`:`[Chrome74] replaceTrack() [localId:${e}, no track]`);let r=this._mapMidTransceiver.get(e);if(!r)throw new Error("associated RTCRtpTransceiver not found");await r.sender.replaceTrack(t);}async setMaxSpatialLayer(e,t){this._assertSendDirection(),console.log(`[Chrome74] setMaxSpatialLayer() [localId:${e}, spatialLayer:${t}]`);let r=this._mapMidTransceiver.get(e);if(!r)throw new Error("associated RTCRtpTransceiver not found");let s=r.sender.getParameters();s.encodings.forEach((a,i)=>{i<=t?a.active=true:a.active=false;}),await r.sender.setParameters(s);}async setRtpEncodingParameters(e,t){this._assertSendDirection(),console.log(`[Chrome74] setRtpEncodingParameters() [localId:${e}, params:${t}]`);let r=this._mapMidTransceiver.get(e);if(!r)throw new Error("associated RTCRtpTransceiver not found");let s=r.sender.getParameters();s.encodings.forEach((a,i)=>{s.encodings[i]={...a,...t};}),await r.sender.setParameters(s);}async getSenderStats(e){this._assertSendDirection();let t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated RTCRtpTransceiver not found");return t.sender.getStats()}async sendDataChannel({ordered:e,maxPacketLifeTime:t,maxRetransmits:r,label:s,protocol:a,priority:i}){this._assertSendDirection();let c={id:this._nextSendSctpStreamId,maxPacketLifeTime:t,maxRetransmits:r,negotiated:true,ordered:e,priority:i,protocol:a};console.log(`[Chrome74] sendDataChannel() [options:${c}]`);let d=this._pc.createDataChannel(s,c);if(this._nextSendSctpStreamId=++this._nextSendSctpStreamId%at.MIS,!this._hasDataChannelMediaSection){let p=await this._pc.createOffer(),m=j__namespace.parse(p.sdp),h=m.media.find(f=>f.type==="application");this._transportReady||await this._setupTransport({localDtlsRole:"server",localSdpObject:m}),console.log(`[Chrome74] sendDataChannel() | calling pc.setLocalDescription() [offer:${p}]`),await this._pc.setLocalDescription(p),this._remoteSdp.sendSctpAssociation({offerMediaObject:h});let u={sdp:this._remoteSdp.getSdp(),type:"answer"};console.log(`[Chrome74] sendDataChannel() | calling pc.setRemoteDescription() [answer:${u}]`),await this._pc.setRemoteDescription(u),this._hasDataChannelMediaSection=true;}let l={maxPacketLifeTime:c.maxPacketLifeTime,maxRetransmits:c.maxRetransmits,ordered:c.ordered,streamId:c.id};return {dataChannel:d,sctpStreamParameters:l}}async receive({trackId:e,kind:t,rtpParameters:r}){this._assertRecvDirection(),console.log(`[Chrome74] receive() [trackId:${e}, kind:${t}]`);let s=r.mid||String(this._mapMidTransceiver.size);this._remoteSdp.receive({kind:t,mid:s,offerRtpParameters:r,streamId:r.rtcp.cname,trackId:e});let a={sdp:this._remoteSdp.getSdp(),type:"offer"};console.log(`[Chrome74] receive() | calling pc.setRemoteDescription() [offer:${a}]`),await this._pc.setRemoteDescription(a);let i=await this._pc.createAnswer(),c=j__namespace.parse(i.sdp),d=c.media.find(p=>String(p.mid)===s);O({answerMediaObject:d,offerRtpParameters:r}),i={sdp:j__namespace.write(c),type:"answer"},this._transportReady||await this._setupTransport({localDtlsRole:"client",localSdpObject:c}),console.log(`[Chrome74] receive() | calling pc.setLocalDescription() [answer:${i}]`),await this._pc.setLocalDescription(i);let l=this._pc.getTransceivers().find(p=>p.mid===s);if(!l)throw new Error("new RTCRtpTransceiver not found");return this._mapMidTransceiver.set(s,l),{localId:s,rtpReceiver:l.receiver,track:l.receiver.track}}async stopReceiving(e){this._assertRecvDirection(),console.log(`[Chrome74] stopReceiving() [localId:${e}]`);let t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated RTCRtpTransceiver not found");this._remoteSdp.closeMediaSection(t.mid);let r={sdp:this._remoteSdp.getSdp(),type:"offer"};console.log(`[Chrome74] stopReceiving() | calling pc.setRemoteDescription() [offer:${r}]`),await this._pc.setRemoteDescription(r);let s=await this._pc.createAnswer();console.log(`[Chrome74] stopReceiving() | calling pc.setLocalDescription() [answer:${s}]`),await this._pc.setLocalDescription(s);}async getReceiverStats(e){this._assertRecvDirection();let t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated RTCRtpTransceiver not found");return t.receiver.getStats()}async receiveDataChannel({sctpStreamParameters:e,label:t,protocol:r}){this._assertRecvDirection();let{streamId:s,ordered:a,maxPacketLifeTime:i,maxRetransmits:c}=e,d={id:s,maxPacketLifeTime:i,maxRetransmits:c,negotiated:true,ordered:a,protocol:r};console.log(`[Chrome74] receiveDataChannel() [options:${d}]`);let l=this._pc.createDataChannel(t,d);if(!this._hasDataChannelMediaSection){this._remoteSdp.receiveSctpAssociation();let p={sdp:this._remoteSdp.getSdp(),type:"offer"};console.log(`[Chrome74] receiveDataChannel() | calling pc.setRemoteDescription() [offer:${p}]`),await this._pc.setRemoteDescription(p);let m=await this._pc.createAnswer();if(!this._transportReady){let h=j__namespace.parse(m.sdp);await this._setupTransport({localDtlsRole:"client",localSdpObject:h});}console.log(`[Chrome74] receiveDataChannel() | calling pc.setRemoteDescription() [answer:${m}]`),await this._pc.setLocalDescription(m),this._hasDataChannelMediaSection=true;}return {dataChannel:l}}async _setupTransport({localDtlsRole:e,localSdpObject:t}){t||(t=j__namespace.parse(this._pc.localDescription.sdp));let r=x({sdpObject:t});r.role=e,this._remoteSdp.updateDtlsRole(e==="client"?"server":"client"),await this.safeEmitAsPromise("@connect",{dtlsParameters:r}),this._transportReady=true;}_assertSendDirection(){if(this._direction!=="send")throw new Error('method can just be called for handlers with "send" direction')}_assertRecvDirection(){if(this._direction!=="recv")throw new Error('method can just be called for handlers with "recv" direction')}};var it={MIS:1024,OS:1024},Le=class o extends D{constructor(){super();this._direction="send";this._remoteSdp=null;this._sendingRtpParametersByKind=null;this._sendingRemoteRtpParametersByKind=null;this._mapMidTransceiver=new Map;this._sendStream=new MediaStream;this._hasDataChannelMediaSection=false;this._nextSendSctpStreamId=0;this._transportReady=false;}static createFactory(){return ()=>new o}get name(){return "Chrome70"}close(){if(console.log("close()"),this._pc)try{this._pc.close();}catch{}}run({direction:e,iceParameters:t,iceCandidates:r,dtlsParameters:s,sctpParameters:a,iceServers:i,iceTransportPolicy:c,additionalSettings:d,proprietaryConstraints:l,extendedRtpCapabilities:p}){console.log("run()"),this._direction=e,this._remoteSdp=new k({dtlsParameters:s,iceCandidates:r,iceParameters:t,sctpParameters:a}),this._sendingRtpParametersByKind={audio:b("audio",p),video:b("video",p)},this._sendingRemoteRtpParametersByKind={audio:T("audio",p),video:T("video",p)},this._pc=new RTCPeerConnection({bundlePolicy:"max-bundle",iceServers:i||[],iceTransportPolicy:c||"all",rtcpMuxPolicy:"require",sdpSemantics:"unified-plan",...d},l),this._pc.addEventListener("iceconnectionstatechange",()=>{switch(this._pc.iceConnectionState){case "checking":this.emit("@connectionstatechange","connecting");break;case "connected":case "completed":this.emit("@connectionstatechange","connected");break;case "failed":this.emit("@connectionstatechange","failed");break;case "disconnected":this.emit("@connectionstatechange","disconnected");break;case "closed":this.emit("@connectionstatechange","closed");break}});}async getNativeRtpCapabilities(){console.log("getNativeRtpCapabilities()");let e=new RTCPeerConnection({bundlePolicy:"max-bundle",iceServers:[],iceTransportPolicy:"all",rtcpMuxPolicy:"require",sdpSemantics:"unified-plan"});try{e.addTransceiver("audio"),e.addTransceiver("video");let t=await e.createOffer();try{e.close();}catch{}let r=j__namespace.parse(t.sdp);return L({sdpObject:r})}catch(t){try{e.close();}catch{}throw t}}async getNativeSctpCapabilities(){return console.log("getNativeSctpCapabilities()"),{numStreams:it}}async updateIceServers(e){console.log("updateIceServers()");let t=this._pc.getConfiguration();t.iceServers=e,this._pc.setConfiguration(t);}async restartIce(e){if(console.log("restartIce()"),this._remoteSdp.updateIceParameters(e),!!this._transportReady)if(this._direction==="send"){let t=await this._pc.createOffer({iceRestart:true});console.log("restartIce() | calling pc.setLocalDescription() [offer:%o]",t),await this._pc.setLocalDescription(t);let r={sdp:this._remoteSdp.getSdp(),type:"answer"};console.log("restartIce() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r);}else {let t={sdp:this._remoteSdp.getSdp(),type:"offer"};console.log("restartIce() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);let r=await this._pc.createAnswer();console.log("restartIce() | calling pc.setLocalDescription() [answer:%o]",r),await this._pc.setLocalDescription(r);}}async getTransportStats(){return this._pc.getStats()}async send({track:e,encodings:t,codecOptions:r,codec:s}){this._assertSendDirection(),console.log("send() [kind:%s, track.id:%s]",e.kind,e.id);let a=v(this._sendingRtpParametersByKind[e.kind]);a.codecs=P(a.codecs,s);let i=v(this._sendingRemoteRtpParametersByKind[e.kind]);i.codecs=P(i.codecs,s);let c=this._remoteSdp.getNextMediaSectionIdx(),d=this._pc.addTransceiver(e,{direction:"sendonly",streams:[this._sendStream]}),l=await this._pc.createOffer(),p=j__namespace.parse(l.sdp),m;this._transportReady||await this._setupTransport({localDtlsRole:"server",localSdpObject:p}),t&&t.length>1&&(console.log("send() | enabling legacy simulcast"),p=j__namespace.parse(l.sdp),m=p.media[c.idx],ae({numStreams:t.length,offerMediaObject:m}),l={sdp:j__namespace.write(p),type:"offer"});let h=false,u=he((t||[{}])[0].scalabilityMode||"");t&&t.length===1&&u.spatialLayers>1&&a.codecs[0].mimeType.toLowerCase()==="video/vp9"&&(console.log("send() | enabling legacy simulcast for VP9 SVC"),h=true,p=j__namespace.parse(l.sdp),m=p.media[c.idx],ae({numStreams:u.spatialLayers,offerMediaObject:m}),l={sdp:j__namespace.write(p),type:"offer"}),console.log("send() | calling pc.setLocalDescription() [offer:%o]",l),await this._pc.setLocalDescription(l);let f=d.mid;if(a.mid=f,p=j__namespace.parse(this._pc.localDescription.sdp),m=p.media[c.idx],a.rtcp.cname=M({offerMediaObject:m}),a.encodings=J({offerMediaObject:m}),t)for(let R=0;R<a.encodings.length;++R)t[R]&&Object.assign(a.encodings[R],t[R]);if(h&&(a.encodings=[a.encodings[0]]),a.encodings.length>1&&(a.codecs[0].mimeType.toLowerCase()==="video/vp8"||a.codecs[0].mimeType.toLowerCase()==="video/h264"))for(let R of a.encodings)R.scalabilityMode="S1T3";this._remoteSdp.send({answerRtpParameters:i,codecOptions:r,offerMediaObject:m,offerRtpParameters:a,reuseMid:c.reuseMid});let g={sdp:this._remoteSdp.getSdp(),type:"answer"};return console.log("send() | calling pc.setRemoteDescription() [answer:%o]",g),await this._pc.setRemoteDescription(g),this._mapMidTransceiver.set(f,d),{localId:f,rtpParameters:a,rtpSender:d.sender}}async stopSending(e){this._assertSendDirection(),console.log("stopSending() [localId:%s]",e);let t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated RTCRtpTransceiver not found");t.sender.replaceTrack(null),this._pc.removeTrack(t.sender),this._remoteSdp.closeMediaSection(t.mid);let r=await this._pc.createOffer();console.log("stopSending() | calling pc.setLocalDescription() [offer:%o]",r),await this._pc.setLocalDescription(r);let s={sdp:this._remoteSdp.getSdp(),type:"answer"};console.log("stopSending() | calling pc.setRemoteDescription() [answer:%o]",s),await this._pc.setRemoteDescription(s);}async replaceTrack(e,t){this._assertSendDirection(),t?console.log("replaceTrack() [localId:%s, track.id:%s]",e,t.id):console.log("replaceTrack() [localId:%s, no track]",e);let r=this._mapMidTransceiver.get(e);if(!r)throw new Error("associated RTCRtpTransceiver not found");await r.sender.replaceTrack(t);}async setMaxSpatialLayer(e,t){this._assertSendDirection(),console.log("setMaxSpatialLayer() [localId:%s, spatialLayer:%s]",e,t);let r=this._mapMidTransceiver.get(e);if(!r)throw new Error("associated RTCRtpTransceiver not found");let s=r.sender.getParameters();s.encodings.forEach((a,i)=>{i<=t?a.active=true:a.active=false;}),await r.sender.setParameters(s);}async setRtpEncodingParameters(e,t){this._assertSendDirection(),console.log("setRtpEncodingParameters() [localId:%s, params:%o]",e,t);let r=this._mapMidTransceiver.get(e);if(!r)throw new Error("associated RTCRtpTransceiver not found");let s=r.sender.getParameters();s.encodings.forEach((a,i)=>{s.encodings[i]={...a,...t};}),await r.sender.setParameters(s);}async getSenderStats(e){this._assertSendDirection();let t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated RTCRtpTransceiver not found");return t.sender.getStats()}async sendDataChannel({ordered:e,maxPacketLifeTime:t,maxRetransmits:r,label:s,protocol:a,priority:i}){this._assertSendDirection();let c={id:this._nextSendSctpStreamId,maxPacketLifeTime:t,maxRetransmitTime:t,maxRetransmits:r,negotiated:true,ordered:e,priority:i,protocol:a};console.log("sendDataChannel() [options:%o]",c);let d=this._pc.createDataChannel(s,c);if(this._nextSendSctpStreamId=++this._nextSendSctpStreamId%it.MIS,!this._hasDataChannelMediaSection){let p=await this._pc.createOffer(),m=j__namespace.parse(p.sdp),h=m.media.find(f=>f.type==="application");this._transportReady||await this._setupTransport({localDtlsRole:"server",localSdpObject:m}),console.log("sendDataChannel() | calling pc.setLocalDescription() [offer:%o]",p),await this._pc.setLocalDescription(p),this._remoteSdp.sendSctpAssociation({offerMediaObject:h});let u={sdp:this._remoteSdp.getSdp(),type:"answer"};console.log("sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]",u),await this._pc.setRemoteDescription(u),this._hasDataChannelMediaSection=true;}let l={maxPacketLifeTime:c.maxPacketLifeTime,maxRetransmits:c.maxRetransmits,ordered:c.ordered,streamId:c.id};return {dataChannel:d,sctpStreamParameters:l}}async receive({trackId:e,kind:t,rtpParameters:r}){this._assertRecvDirection(),console.log("receive() [trackId:%s, kind:%s]",e,t);let s=r.mid||String(this._mapMidTransceiver.size);this._remoteSdp.receive({kind:t,mid:s,offerRtpParameters:r,streamId:r.rtcp.cname,trackId:e});let a={sdp:this._remoteSdp.getSdp(),type:"offer"};console.log("receive() | calling pc.setRemoteDescription() [offer:%o]",a),await this._pc.setRemoteDescription(a);let i=await this._pc.createAnswer(),c=j__namespace.parse(i.sdp),d=c.media.find(p=>String(p.mid)===s);O({answerMediaObject:d,offerRtpParameters:r}),i={sdp:j__namespace.write(c),type:"answer"},this._transportReady||await this._setupTransport({localDtlsRole:"client",localSdpObject:c}),console.log("receive() | calling pc.setLocalDescription() [answer:%o]",i),await this._pc.setLocalDescription(i);let l=this._pc.getTransceivers().find(p=>p.mid===s);if(!l)throw new Error("new RTCRtpTransceiver not found");return this._mapMidTransceiver.set(s,l),{localId:s,rtpReceiver:l.receiver,track:l.receiver.track}}async stopReceiving(e){this._assertRecvDirection(),console.log("stopReceiving() [localId:%s]",e);let t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated RTCRtpTransceiver not found");this._remoteSdp.closeMediaSection(t.mid);let r={sdp:this._remoteSdp.getSdp(),type:"offer"};console.log("stopReceiving() | calling pc.setRemoteDescription() [offer:%o]",r),await this._pc.setRemoteDescription(r);let s=await this._pc.createAnswer();console.log("stopReceiving() | calling pc.setLocalDescription() [answer:%o]",s),await this._pc.setLocalDescription(s);}async getReceiverStats(e){this._assertRecvDirection();let t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated RTCRtpTransceiver not found");return t.receiver.getStats()}async receiveDataChannel({sctpStreamParameters:e,label:t,protocol:r}){this._assertRecvDirection();let{streamId:s,ordered:a,maxPacketLifeTime:i,maxRetransmits:c}=e,d={id:s,maxPacketLifeTime:i,maxRetransmitTime:i,maxRetransmits:c,negotiated:true,ordered:a,protocol:r};console.log("receiveDataChannel() [options:%o]",d);let l=this._pc.createDataChannel(t,d);if(!this._hasDataChannelMediaSection){this._remoteSdp.receiveSctpAssociation();let p={sdp:this._remoteSdp.getSdp(),type:"offer"};console.log("receiveDataChannel() | calling pc.setRemoteDescription() [offer:%o]",p),await this._pc.setRemoteDescription(p);let m=await this._pc.createAnswer();if(!this._transportReady){let h=j__namespace.parse(m.sdp);await this._setupTransport({localDtlsRole:"client",localSdpObject:h});}console.log("receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]",m),await this._pc.setLocalDescription(m),this._hasDataChannelMediaSection=true;}return {dataChannel:l}}async _setupTransport({localDtlsRole:e,localSdpObject:t}){t||(t=j__namespace.parse(this._pc.localDescription.sdp));let r=x({sdpObject:t});r.role=e,this._remoteSdp.updateDtlsRole(e==="client"?"server":"client"),await this.safeEmitAsPromise("@connect",{dtlsParameters:r}),this._transportReady=true;}_assertSendDirection(){if(this._direction!=="send")throw new Error('method can just be called for handlers with "send" direction')}_assertRecvDirection(){if(this._direction!=="recv")throw new Error('method can just be called for handlers with "recv" direction')}};function ee({offerMediaObject:o,track:n}){let t=new Set;for(let a of o.ssrcs||[]){if(a.attribute!=="msid")continue;if(a.value.split(" ")[1]===n.id){let c=a.id;t.add(c);}}if(t.size===0)throw new Error(`a=ssrc line with msid information not found [track.id:${n.id}]`);let r=new Map;for(let a of o.ssrcGroups||[]){if(a.semantics!=="FID")continue;let[i,c]=a.ssrcs.split(/\s+/);i=Number(i),c=Number(c),t.has(i)&&(t.delete(i),t.delete(c),r.set(i,c));}for(let a of t)r.set(a,null);let s=[];for(let[a,i]of r){let c={ssrc:a};i&&(c.rtx={ssrc:i}),s.push(c);}return s}function te({offerMediaObject:o,track:n,numStreams:e}){if(e<=1)throw new TypeError("numStreams must be greater than 1");let t,r,s;if(!(o.ssrcs||[]).find(p=>p.attribute!=="msid"?false:p.value.split(" ")[1]===n.id?(t=p.id,s=p.value.split(" ")[0],true):false))throw new Error(`a=ssrc line with msid information not found [track.id:${n.id}]`);(o.ssrcGroups||[]).some(p=>{if(p.semantics!=="FID")return false;let m=p.ssrcs.split(/\s+/);return Number(m[0])===t?(r=Number(m[1]),true):false});let i=o.ssrcs.find(p=>p.attribute==="cname"&&p.id===t);if(!i)throw new Error(`a=ssrc line with cname information not found [track.id:${n.id}]`);let c=i.value,d=[],l=[];for(let p=0;p<e;++p)d.push(t+p),r&&l.push(r+p);o.ssrcGroups=o.ssrcGroups||[],o.ssrcs=o.ssrcs||[],o.ssrcGroups.push({semantics:"SIM",ssrcs:d.join(" ")});for(let p=0;p<d.length;++p){let m=d[p];o.ssrcs.push({attribute:"cname",id:m,value:c}),o.ssrcs.push({attribute:"msid",id:m,value:`${s} ${n.id}`});}for(let p=0;p<l.length;++p){let m=d[p],h=l[p];o.ssrcs.push({attribute:"cname",id:h,value:c}),o.ssrcs.push({attribute:"msid",id:h,value:`${s} ${n.id}`}),o.ssrcGroups.push({semantics:"FID",ssrcs:`${m} ${h}`});}}var ot={MIS:1024,OS:1024},Me=class o extends D{constructor(){super();this._direction="send";this._remoteSdp=null;this._sendingRtpParametersByKind=null;this._sendingRemoteRtpParametersByKind=null;this._sendStream=new MediaStream;this._mapSendLocalIdRtpSender=new Map;this._nextSendLocalId=0;this._mapRecvLocalIdInfo=new Map;this._hasDataChannelMediaSection=false;this._nextSendSctpStreamId=0;this._transportReady=false;}static createFactory(){return ()=>new o}get name(){return "Chrome67"}close(){if(console.log("close()"),this._pc)try{this._pc.close();}catch{}}async getNativeRtpCapabilities(){console.log("getNativeRtpCapabilities()");let e=new RTCPeerConnection({bundlePolicy:"max-bundle",iceServers:[],iceTransportPolicy:"all",rtcpMuxPolicy:"require",sdpSemantics:"plan-b"});try{let t=await e.createOffer({offerToReceiveAudio:!0,offerToReceiveVideo:!0});try{e.close();}catch{}let r=j__namespace.parse(t.sdp);return L({sdpObject:r})}catch(t){try{e.close();}catch{}throw t}}async getNativeSctpCapabilities(){return console.log("getNativeSctpCapabilities()"),{numStreams:ot}}run({direction:e,iceParameters:t,iceCandidates:r,dtlsParameters:s,sctpParameters:a,iceServers:i,iceTransportPolicy:c,additionalSettings:d,proprietaryConstraints:l,extendedRtpCapabilities:p}){console.log("run()"),this._direction=e,this._remoteSdp=new k({dtlsParameters:s,iceCandidates:r,iceParameters:t,planB:true,sctpParameters:a}),this._sendingRtpParametersByKind={audio:b("audio",p),video:b("video",p)},this._sendingRemoteRtpParametersByKind={audio:T("audio",p),video:T("video",p)},this._pc=new RTCPeerConnection({bundlePolicy:"max-bundle",iceServers:i||[],iceTransportPolicy:c||"all",rtcpMuxPolicy:"require",sdpSemantics:"plan-b",...d},l),this._pc.addEventListener("iceconnectionstatechange",()=>{switch(this._pc.iceConnectionState){case "checking":this.emit("@connectionstatechange","connecting");break;case "connected":case "completed":this.emit("@connectionstatechange","connected");break;case "failed":this.emit("@connectionstatechange","failed");break;case "disconnected":this.emit("@connectionstatechange","disconnected");break;case "closed":this.emit("@connectionstatechange","closed");break}});}async updateIceServers(e){console.log("updateIceServers()");let t=this._pc.getConfiguration();t.iceServers=e,this._pc.setConfiguration(t);}async restartIce(e){if(console.log("restartIce()"),this._remoteSdp.updateIceParameters(e),!!this._transportReady)if(this._direction==="send"){let t=await this._pc.createOffer({iceRestart:true});console.log("restartIce() | calling pc.setLocalDescription() [offer:%o]",t),await this._pc.setLocalDescription(t);let r={sdp:this._remoteSdp.getSdp(),type:"answer"};console.log("restartIce() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r);}else {let t={sdp:this._remoteSdp.getSdp(),type:"offer"};console.log("restartIce() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);let r=await this._pc.createAnswer();console.log("restartIce() | calling pc.setLocalDescription() [answer:%o]",r),await this._pc.setLocalDescription(r);}}async getTransportStats(){return this._pc.getStats()}async send({track:e,encodings:t,codecOptions:r,codec:s}){this._assertSendDirection(),console.log("send() [kind:%s, track.id:%s]",e.kind,e.id),s&&console.log("send() | codec selection is not available in %s handler",this.name),this._sendStream.addTrack(e),this._pc.addTrack(e,this._sendStream);let a=await this._pc.createOffer(),i=j__namespace.parse(a.sdp),c,d=v(this._sendingRtpParametersByKind[e.kind]);d.codecs=P(d.codecs);let l=v(this._sendingRemoteRtpParametersByKind[e.kind]);if(l.codecs=P(l.codecs),this._transportReady||await this._setupTransport({localDtlsRole:"server",localSdpObject:i}),e.kind==="video"&&t&&t.length>1&&(console.log("send() | enabling simulcast"),i=j__namespace.parse(a.sdp),c=i.media.find(u=>u.type==="video"),te({numStreams:t.length,offerMediaObject:c,track:e}),a={sdp:j__namespace.write(i),type:"offer"}),console.log("send() | calling pc.setLocalDescription() [offer:%o]",a),await this._pc.setLocalDescription(a),i=j__namespace.parse(this._pc.localDescription.sdp),c=i.media.find(u=>u.type===e.kind),d.rtcp.cname=M({offerMediaObject:c}),d.encodings=ee({offerMediaObject:c,track:e}),t)for(let u=0;u<d.encodings.length;++u)t[u]&&Object.assign(d.encodings[u],t[u]);if(d.encodings.length>1&&d.codecs[0].mimeType.toLowerCase()==="video/vp8")for(let u of d.encodings)u.scalabilityMode="S1T3";this._remoteSdp.send({answerRtpParameters:l,codecOptions:r,offerMediaObject:c,offerRtpParameters:d});let p={sdp:this._remoteSdp.getSdp(),type:"answer"};console.log("send() | calling pc.setRemoteDescription() [answer:%o]",p),await this._pc.setRemoteDescription(p);let m=String(this._nextSendLocalId);this._nextSendLocalId++;let h=this._pc.getSenders().find(u=>u.track===e);return this._mapSendLocalIdRtpSender.set(m,h),{localId:m,rtpParameters:d,rtpSender:h}}async stopSending(e){this._assertSendDirection(),console.log("stopSending() [localId:%s]",e);let t=this._mapSendLocalIdRtpSender.get(e);if(!t)throw new Error("associated RTCRtpSender not found");this._pc.removeTrack(t),t.track&&this._sendStream.removeTrack(t.track),this._mapSendLocalIdRtpSender.delete(e);let r=await this._pc.createOffer();console.log("stopSending() | calling pc.setLocalDescription() [offer:%o]",r);try{await this._pc.setLocalDescription(r);}catch(a){if(this._sendStream.getTracks().length===0){console.log("stopSending() | ignoring expected error due no sending tracks: %s",a.toString());return}throw a}if(this._pc.signalingState==="stable")return;let s={sdp:this._remoteSdp.getSdp(),type:"answer"};console.log("stopSending() | calling pc.setRemoteDescription() [answer:%o]",s),await this._pc.setRemoteDescription(s);}async replaceTrack(e,t){this._assertSendDirection(),t?console.log("replaceTrack() [localId:%s, track.id:%s]",e,t.id):console.log("replaceTrack() [localId:%s, no track]",e);let r=this._mapSendLocalIdRtpSender.get(e);if(!r)throw new Error("associated RTCRtpSender not found");let s=r.track;await r.replaceTrack(t),s&&this._sendStream.removeTrack(s),t&&this._sendStream.addTrack(t);}async setMaxSpatialLayer(e,t){this._assertSendDirection(),console.log("setMaxSpatialLayer() [localId:%s, spatialLayer:%s]",e,t);let r=this._mapSendLocalIdRtpSender.get(e);if(!r)throw new Error("associated RTCRtpSender not found");let s=r.getParameters();s.encodings.forEach((a,i)=>{i<=t?a.active=true:a.active=false;}),await r.setParameters(s);}async setRtpEncodingParameters(e,t){this._assertSendDirection(),console.log("setRtpEncodingParameters() [localId:%s, params:%o]",e,t);let r=this._mapSendLocalIdRtpSender.get(e);if(!r)throw new Error("associated RTCRtpSender not found");let s=r.getParameters();s.encodings.forEach((a,i)=>{s.encodings[i]={...a,...t};}),await r.setParameters(s);}async getSenderStats(e){this._assertSendDirection();let t=this._mapSendLocalIdRtpSender.get(e);if(!t)throw new Error("associated RTCRtpSender not found");return t.getStats()}async sendDataChannel({ordered:e,maxPacketLifeTime:t,maxRetransmits:r,label:s,protocol:a,priority:i}){this._assertSendDirection();let c={id:this._nextSendSctpStreamId,maxPacketLifeTime:t,maxRetransmitTime:t,maxRetransmits:r,negotiated:true,ordered:e,priority:i,protocol:a};console.log("sendDataChannel() [options:%o]",c);let d=this._pc.createDataChannel(s,c);if(this._nextSendSctpStreamId=++this._nextSendSctpStreamId%ot.MIS,!this._hasDataChannelMediaSection){let p=await this._pc.createOffer(),m=j__namespace.parse(p.sdp),h=m.media.find(f=>f.type==="application");this._transportReady||await this._setupTransport({localDtlsRole:"server",localSdpObject:m}),console.log("sendDataChannel() | calling pc.setLocalDescription() [offer:%o]",p),await this._pc.setLocalDescription(p),this._remoteSdp.sendSctpAssociation({offerMediaObject:h});let u={sdp:this._remoteSdp.getSdp(),type:"answer"};console.log("sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]",u),await this._pc.setRemoteDescription(u),this._hasDataChannelMediaSection=true;}let l={maxPacketLifeTime:c.maxPacketLifeTime,maxRetransmits:c.maxRetransmits,ordered:c.ordered,streamId:c.id};return {dataChannel:d,sctpStreamParameters:l}}async receive({trackId:e,kind:t,rtpParameters:r}){this._assertRecvDirection(),console.log("receive() [trackId:%s, kind:%s]",e,t);let s=e,a=t;this._remoteSdp.receive({kind:t,mid:a,offerRtpParameters:r,streamId:r.rtcp.cname,trackId:e});let i={sdp:this._remoteSdp.getSdp(),type:"offer"};console.log("receive() | calling pc.setRemoteDescription() [offer:%o]",i),await this._pc.setRemoteDescription(i);let c=await this._pc.createAnswer(),d=j__namespace.parse(c.sdp),l=d.media.find(m=>String(m.mid)===a);O({answerMediaObject:l,offerRtpParameters:r}),c={sdp:j__namespace.write(d),type:"answer"},this._transportReady||await this._setupTransport({localDtlsRole:"client",localSdpObject:d}),console.log("receive() | calling pc.setLocalDescription() [answer:%o]",c),await this._pc.setLocalDescription(c);let p=this._pc.getReceivers().find(m=>m.track&&m.track.id===s);if(!p)throw new Error("new RTCRtpReceiver not");return this._mapRecvLocalIdInfo.set(s,{mid:a,rtpParameters:r,rtpReceiver:p}),{localId:s,rtpReceiver:p,track:p.track}}async stopReceiving(e){this._assertRecvDirection(),console.log("stopReceiving() [localId:%s]",e);let t=this._mapRecvLocalIdInfo.get(e);if(t===void 0)throw new Error("localInfo is undefined");let{mid:r,rtpParameters:s}=t;this._mapRecvLocalIdInfo.delete(e),this._remoteSdp.planBStopReceiving({mid:r,offerRtpParameters:s});let a={sdp:this._remoteSdp.getSdp(),type:"offer"};console.log("stopReceiving() | calling pc.setRemoteDescription() [offer:%o]",a),await this._pc.setRemoteDescription(a);let i=await this._pc.createAnswer();console.log("stopReceiving() | calling pc.setLocalDescription() [answer:%o]",i),await this._pc.setLocalDescription(i);}async getReceiverStats(e){this._assertRecvDirection();let t=this._mapRecvLocalIdInfo.get(e);if(t===void 0)throw new Error("localInfo is undefined");let{rtpReceiver:r}=t;if(!r)throw new Error("associated RTCRtpReceiver not found");return r.getStats()}async receiveDataChannel({sctpStreamParameters:e,label:t,protocol:r}){this._assertRecvDirection();let{streamId:s,ordered:a,maxPacketLifeTime:i,maxRetransmits:c}=e,d={id:s,maxPacketLifeTime:i,maxRetransmitTime:i,maxRetransmits:c,negotiated:true,ordered:a,protocol:r};console.log("receiveDataChannel() [options:%o]",d);let l=this._pc.createDataChannel(t,d);if(!this._hasDataChannelMediaSection){this._remoteSdp.receiveSctpAssociation({oldDataChannelSpec:true});let p={sdp:this._remoteSdp.getSdp(),type:"offer"};console.log("receiveDataChannel() | calling pc.setRemoteDescription() [offer:%o]",p),await this._pc.setRemoteDescription(p);let m=await this._pc.createAnswer();if(!this._transportReady){let h=j__namespace.parse(m.sdp);await this._setupTransport({localDtlsRole:"client",localSdpObject:h});}console.log("receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]",m),await this._pc.setLocalDescription(m),this._hasDataChannelMediaSection=true;}return {dataChannel:l}}async _setupTransport({localDtlsRole:e,localSdpObject:t}){t||(t=j__namespace.parse(this._pc.localDescription.sdp));let r=x({sdpObject:t});r.role=e,this._remoteSdp.updateDtlsRole(e==="client"?"server":"client"),await this.safeEmitAsPromise("@connect",{dtlsParameters:r}),this._transportReady=true;}_assertSendDirection(){if(this._direction!=="send")throw new Error('method can just be called for handlers with "send" direction')}_assertRecvDirection(){if(this._direction!=="recv")throw new Error('method can just be called for handlers with "recv" direction')}};var nt={MIS:1024,OS:1024},Oe=class o extends D{constructor(){super();this._direction="send";this._remoteSdp=null;this._sendingRtpParametersByKind=null;this._sendingRemoteRtpParametersByKind=null;this._sendStream=new MediaStream;this._mapSendLocalIdTrack=new Map;this._nextSendLocalId=0;this._mapRecvLocalIdInfo=new Map;this._hasDataChannelMediaSection=false;this._nextSendSctpStreamId=0;this._transportReady=false;}static createFactory(){return ()=>new o}get name(){return "Chrome55"}close(){if(console.log("close()"),this._pc)try{this._pc.close();}catch{}}async getNativeRtpCapabilities(){console.log("getNativeRtpCapabilities()");let e=new RTCPeerConnection({bundlePolicy:"max-bundle",iceServers:[],iceTransportPolicy:"all",rtcpMuxPolicy:"require",sdpSemantics:"plan-b"});try{let t=await e.createOffer({offerToReceiveAudio:!0,offerToReceiveVideo:!0});try{e.close();}catch{}let r=j__namespace.parse(t.sdp);return L({sdpObject:r})}catch(t){try{e.close();}catch{}throw t}}async getNativeSctpCapabilities(){return console.log("getNativeSctpCapabilities()"),{numStreams:nt}}run({direction:e,iceParameters:t,iceCandidates:r,dtlsParameters:s,sctpParameters:a,iceServers:i,iceTransportPolicy:c,additionalSettings:d,proprietaryConstraints:l,extendedRtpCapabilities:p}){console.log("run()"),this._direction=e,this._remoteSdp=new k({dtlsParameters:s,iceCandidates:r,iceParameters:t,planB:true,sctpParameters:a}),this._sendingRtpParametersByKind={audio:b("audio",p),video:b("video",p)},this._sendingRemoteRtpParametersByKind={audio:T("audio",p),video:T("video",p)},this._pc=new RTCPeerConnection({bundlePolicy:"max-bundle",iceServers:i||[],iceTransportPolicy:c||"all",rtcpMuxPolicy:"require",sdpSemantics:"plan-b",...d},l),this._pc.addEventListener("iceconnectionstatechange",()=>{switch(this._pc.iceConnectionState){case "checking":this.emit("@connectionstatechange","connecting");break;case "connected":case "completed":this.emit("@connectionstatechange","connected");break;case "failed":this.emit("@connectionstatechange","failed");break;case "disconnected":this.emit("@connectionstatechange","disconnected");break;case "closed":this.emit("@connectionstatechange","closed");break}});}async updateIceServers(e){console.log("updateIceServers()");let t=this._pc.getConfiguration();t.iceServers=e,this._pc.setConfiguration(t);}async restartIce(e){if(console.log("restartIce()"),this._remoteSdp.updateIceParameters(e),!!this._transportReady)if(this._direction==="send"){let t=await this._pc.createOffer({iceRestart:true});console.log("restartIce() | calling pc.setLocalDescription() [offer:%o]",t),await this._pc.setLocalDescription(t);let r={sdp:this._remoteSdp.getSdp(),type:"answer"};console.log("restartIce() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r);}else {let t={sdp:this._remoteSdp.getSdp(),type:"offer"};console.log("restartIce() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);let r=await this._pc.createAnswer();console.log("restartIce() | calling pc.setLocalDescription() [answer:%o]",r),await this._pc.setLocalDescription(r);}}async getTransportStats(){return this._pc.getStats()}async send({track:e,encodings:t,codecOptions:r,codec:s}){this._assertSendDirection(),console.log("send() [kind:%s, track.id:%s]",e.kind,e.id),s&&console.log("send() | codec selection is not available in %s handler",this.name),this._sendStream.addTrack(e),this._pc.addStream(this._sendStream);let a=await this._pc.createOffer(),i=j__namespace.parse(a.sdp),c,d=v(this._sendingRtpParametersByKind[e.kind]);d.codecs=P(d.codecs);let l=v(this._sendingRemoteRtpParametersByKind[e.kind]);if(l.codecs=P(l.codecs),this._transportReady||await this._setupTransport({localDtlsRole:"server",localSdpObject:i}),e.kind==="video"&&t&&t.length>1&&(console.log("send() | enabling simulcast"),i=j__namespace.parse(a.sdp),c=i.media.find(h=>h.type==="video"),te({numStreams:t.length,offerMediaObject:c,track:e}),a={sdp:j__namespace.write(i),type:"offer"}),console.log("send() | calling pc.setLocalDescription() [offer:%o]",a),await this._pc.setLocalDescription(a),i=j__namespace.parse(this._pc.localDescription.sdp),c=i.media.find(h=>h.type===e.kind),d.rtcp.cname=M({offerMediaObject:c}),d.encodings=ee({offerMediaObject:c,track:e}),t)for(let h=0;h<d.encodings.length;++h)t[h]&&Object.assign(d.encodings[h],t[h]);if(d.encodings.length>1&&d.codecs[0].mimeType.toLowerCase()==="video/vp8")for(let h of d.encodings)h.scalabilityMode="S1T3";this._remoteSdp.send({answerRtpParameters:l,codecOptions:r,offerMediaObject:c,offerRtpParameters:d});let p={sdp:this._remoteSdp.getSdp(),type:"answer"};console.log("send() | calling pc.setRemoteDescription() [answer:%o]",p),await this._pc.setRemoteDescription(p);let m=String(this._nextSendLocalId);return this._nextSendLocalId++,this._mapSendLocalIdTrack.set(m,e),{localId:m,rtpParameters:d}}async stopSending(e){this._assertSendDirection(),console.log("stopSending() [localId:%s]",e);let t=this._mapSendLocalIdTrack.get(e);if(!t)throw new Error("track not found");this._mapSendLocalIdTrack.delete(e),this._sendStream.removeTrack(t),this._pc.addStream(this._sendStream);let r=await this._pc.createOffer();console.log("stopSending() | calling pc.setLocalDescription() [offer:%o]",r);try{await this._pc.setLocalDescription(r);}catch(a){if(this._sendStream.getTracks().length===0){console.log("stopSending() | ignoring expected error due no sending tracks: %s",a.toString());return}throw a}if(this._pc.signalingState==="stable")return;let s={sdp:this._remoteSdp.getSdp(),type:"answer"};console.log("stopSending() | calling pc.setRemoteDescription() [answer:%o]",s),await this._pc.setRemoteDescription(s);}async replaceTrack(e,t){throw new y("not implemented")}async setMaxSpatialLayer(e,t){throw new y(" not implemented")}async setRtpEncodingParameters(e,t){throw new y("not supported")}async getSenderStats(e){throw new y("not implemented")}async sendDataChannel({ordered:e,maxPacketLifeTime:t,maxRetransmits:r,label:s,protocol:a,priority:i}){this._assertSendDirection();let c={id:this._nextSendSctpStreamId,maxPacketLifeTime:t,maxRetransmitTime:t,maxRetransmits:r,negotiated:true,ordered:e,priority:i,protocol:a};console.log("sendDataChannel() [options:%o]",c);let d=this._pc.createDataChannel(s,c);if(this._nextSendSctpStreamId=++this._nextSendSctpStreamId%nt.MIS,!this._hasDataChannelMediaSection){let p=await this._pc.createOffer(),m=j__namespace.parse(p.sdp),h=m.media.find(f=>f.type==="application");this._transportReady||await this._setupTransport({localDtlsRole:"server",localSdpObject:m}),console.log("sendDataChannel() | calling pc.setLocalDescription() [offer:%o]",p),await this._pc.setLocalDescription(p),this._remoteSdp.sendSctpAssociation({offerMediaObject:h});let u={sdp:this._remoteSdp.getSdp(),type:"answer"};console.log("sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]",u),await this._pc.setRemoteDescription(u),this._hasDataChannelMediaSection=true;}let l={maxPacketLifeTime:c.maxPacketLifeTime,maxRetransmits:c.maxRetransmits,ordered:c.ordered,streamId:c.id};return {dataChannel:d,sctpStreamParameters:l}}async receive({trackId:e,kind:t,rtpParameters:r}){this._assertRecvDirection(),console.log("receive() [trackId:%s, kind:%s]",e,t);let s=e,a=t,i=r.rtcp.cname;if(!i)throw new Error("cname not found");this._remoteSdp.receive({kind:t,mid:a,offerRtpParameters:r,streamId:i,trackId:e});let c={sdp:this._remoteSdp.getSdp(),type:"offer"};console.log("receive() | calling pc.setRemoteDescription() [offer:%o]",c),await this._pc.setRemoteDescription(c);let d=await this._pc.createAnswer(),l=j__namespace.parse(d.sdp),p=l.media.find(u=>String(u.mid)===a);O({answerMediaObject:p,offerRtpParameters:r}),d={sdp:j__namespace.write(l),type:"answer"},this._transportReady||await this._setupTransport({localDtlsRole:"client",localSdpObject:l}),console.log("receive() | calling pc.setLocalDescription() [answer:%o]",d),await this._pc.setLocalDescription(d);let h=this._pc.getRemoteStreams().find(u=>u.id===i).getTrackById(s);if(!h)throw new Error("remote track not found");return this._mapRecvLocalIdInfo.set(s,{mid:a,rtpParameters:r}),{localId:s,track:h}}async stopReceiving(e){this._assertRecvDirection(),console.log("stopReceiving() [localId:%s]",e);let t=this._mapRecvLocalIdInfo.get(e);if(!t)return;let{mid:r,rtpParameters:s}=t;this._mapRecvLocalIdInfo.delete(e),this._remoteSdp.planBStopReceiving({mid:r,offerRtpParameters:s});let a={sdp:this._remoteSdp.getSdp(),type:"offer"};console.log("stopReceiving() | calling pc.setRemoteDescription() [offer:%o]",a),await this._pc.setRemoteDescription(a);let i=await this._pc.createAnswer();console.log("stopReceiving() | calling pc.setLocalDescription() [answer:%o]",i),await this._pc.setLocalDescription(i);}async getReceiverStats(e){throw new y("not implemented")}async receiveDataChannel({sctpStreamParameters:e,label:t,protocol:r}){this._assertRecvDirection();let{streamId:s,ordered:a,maxPacketLifeTime:i,maxRetransmits:c}=e,d={id:s,maxPacketLifeTime:i,maxRetransmitTime:i,maxRetransmits:c,negotiated:true,ordered:a,protocol:r};console.log("receiveDataChannel() [options:%o]",d);let l=this._pc.createDataChannel(t,d);if(!this._hasDataChannelMediaSection){this._remoteSdp.receiveSctpAssociation({oldDataChannelSpec:true});let p={sdp:this._remoteSdp.getSdp(),type:"offer"};console.log("receiveDataChannel() | calling pc.setRemoteDescription() [offer:%o]",p),await this._pc.setRemoteDescription(p);let m=await this._pc.createAnswer();if(!this._transportReady){let h=j__namespace.parse(m.sdp);await this._setupTransport({localDtlsRole:"client",localSdpObject:h});}console.log("receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]",m),await this._pc.setLocalDescription(m),this._hasDataChannelMediaSection=true;}return {dataChannel:l}}async _setupTransport({localDtlsRole:e,localSdpObject:t}){t||(t=j__namespace.parse(this._pc.localDescription.sdp));let r=x({sdpObject:t});r.role=e,this._remoteSdp.updateDtlsRole(e==="client"?"server":"client"),await this.safeEmitAsPromise("@connect",{dtlsParameters:r}),this._transportReady=true;}_assertSendDirection(){if(this._direction!=="send")throw new Error('method can just be called for handlers with "send" direction')}_assertRecvDirection(){if(this._direction!=="recv")throw new Error('method can just be called for handlers with "recv" direction')}};var ct={MIS:2048,OS:16},Ae=class o extends D{constructor(){super();this._direction="send";this._remoteSdp=null;this._sendingRtpParametersByKind=null;this._sendingRemoteRtpParametersByKind=null;this._mapMidTransceiver=new Map;this._sendStream=new MediaStream;this._hasDataChannelMediaSection=false;this._nextSendSctpStreamId=0;this._transportReady=false;}static createFactory(){return ()=>new o}get name(){return "Firefox60"}close(){if(console.log("close()"),this._pc)try{this._pc.close();}catch{}}async getNativeRtpCapabilities(){console.log("getNativeRtpCapabilities()");let e=new RTCPeerConnection({bundlePolicy:"max-bundle",iceServers:[],iceTransportPolicy:"all",rtcpMuxPolicy:"require"}),t=document.createElement("canvas");t.getContext("2d");let s=t.captureStream().getVideoTracks()[0];try{e.addTransceiver("audio",{direction:"sendrecv"});let a=e.addTransceiver(s,{direction:"sendrecv"}),i=a.sender.getParameters(),c=[{rid:"r0",maxBitrate:1e5},{rid:"r1",maxBitrate:5e5}];i.encodings=c,await a.sender.setParameters(i);let d=await e.createOffer();try{t.remove();}catch{}try{s.stop();}catch{}try{e.close();}catch{}let l=j__namespace.parse(d.sdp);return L({sdpObject:l})}catch(a){try{t.remove();}catch{}try{s.stop();}catch{}try{e.close();}catch{}throw a}}async getNativeSctpCapabilities(){return console.log("getNativeSctpCapabilities()"),{numStreams:ct}}run({direction:e,iceParameters:t,iceCandidates:r,dtlsParameters:s,sctpParameters:a,iceServers:i,iceTransportPolicy:c,additionalSettings:d,proprietaryConstraints:l,extendedRtpCapabilities:p}){console.log("run()"),this._direction=e,this._remoteSdp=new k({dtlsParameters:s,iceCandidates:r,iceParameters:t,sctpParameters:a}),this._sendingRtpParametersByKind={audio:b("audio",p),video:b("video",p)},this._sendingRemoteRtpParametersByKind={audio:T("audio",p),video:T("video",p)},this._pc=new RTCPeerConnection({bundlePolicy:"max-bundle",iceServers:i||[],iceTransportPolicy:c||"all",rtcpMuxPolicy:"require",...d},l),this._pc.addEventListener("iceconnectionstatechange",()=>{switch(this._pc.iceConnectionState){case "checking":this.emit("@connectionstatechange","connecting");break;case "connected":case "completed":this.emit("@connectionstatechange","connected");break;case "failed":this.emit("@connectionstatechange","failed");break;case "disconnected":this.emit("@connectionstatechange","disconnected");break;case "closed":this.emit("@connectionstatechange","closed");break}});}async updateIceServers(e){throw new y("not supported")}async restartIce(e){if(console.log("restartIce()"),this._remoteSdp.updateIceParameters(e),!!this._transportReady)if(this._direction==="send"){let t=await this._pc.createOffer({iceRestart:true});console.log("restartIce() | calling pc.setLocalDescription() [offer:%o]",t),await this._pc.setLocalDescription(t);let r={sdp:this._remoteSdp.getSdp(),type:"answer"};console.log("restartIce() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r);}else {let t={sdp:this._remoteSdp.getSdp(),type:"offer"};console.log("restartIce() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);let r=await this._pc.createAnswer();console.log("restartIce() | calling pc.setLocalDescription() [answer:%o]",r),await this._pc.setLocalDescription(r);}}async getTransportStats(){return this._pc.getStats()}async send({track:e,encodings:t,codecOptions:r,codec:s}){this._assertSendDirection(),console.log("send() [kind:%s, track.id:%s]",e.kind,e.id);let a;t&&t.length>1&&(t.forEach((f,g)=>{f.rid=`r${g}`;}),a=v(t).reverse());let i=v(this._sendingRtpParametersByKind[e.kind]);i.codecs=P(i.codecs,s);let c=v(this._sendingRemoteRtpParametersByKind[e.kind]);c.codecs=P(c.codecs,s);let d=this._pc.addTransceiver(e,{direction:"sendonly",streams:[this._sendStream]});if(a){let f=d.sender.getParameters();f.encodings=a,await d.sender.setParameters(f);}let l=await this._pc.createOffer(),p=j__namespace.parse(l.sdp);this._transportReady||await this._setupTransport({localDtlsRole:"client",localSdpObject:p}),console.log("send() | calling pc.setLocalDescription() [offer:%o]",l),await this._pc.setLocalDescription(l);let m=d.mid;i.mid=m,p=j__namespace.parse(this._pc.localDescription.sdp);let h=p.media[p.media.length-1];if(i.rtcp.cname=M({offerMediaObject:h}),!t)i.encodings=J({offerMediaObject:h});else if(t.length===1){let f=J({offerMediaObject:h});Object.assign(f[0],t[0]),i.encodings=f;}else i.encodings=t;if(i.encodings.length>1&&(i.codecs[0].mimeType.toLowerCase()==="video/vp8"||i.codecs[0].mimeType.toLowerCase()==="video/h264"))for(let f of i.encodings)f.scalabilityMode="S1T3";this._remoteSdp.send({answerRtpParameters:c,codecOptions:r,extmapAllowMixed:true,offerMediaObject:h,offerRtpParameters:i});let u={sdp:this._remoteSdp.getSdp(),type:"answer"};return console.log("send() | calling pc.setRemoteDescription() [answer:%o]",u),await this._pc.setRemoteDescription(u),this._mapMidTransceiver.set(m,d),{localId:m,rtpParameters:i,rtpSender:d.sender}}async stopSending(e){console.log("stopSending() [localId:%s]",e);let t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated transceiver not found");t.sender.replaceTrack(null),this._pc.removeTrack(t.sender),this._remoteSdp.disableMediaSection(t.mid);let r=await this._pc.createOffer();console.log("stopSending() | calling pc.setLocalDescription() [offer:%o]",r),await this._pc.setLocalDescription(r);let s={sdp:this._remoteSdp.getSdp(),type:"answer"};console.log("stopSending() | calling pc.setRemoteDescription() [answer:%o]",s),await this._pc.setRemoteDescription(s);}async replaceTrack(e,t){this._assertSendDirection(),t?console.log("replaceTrack() [localId:%s, track.id:%s]",e,t.id):console.log("replaceTrack() [localId:%s, no track]",e);let r=this._mapMidTransceiver.get(e);if(!r)throw new Error("associated RTCRtpTransceiver not found");await r.sender.replaceTrack(t);}async setMaxSpatialLayer(e,t){this._assertSendDirection(),console.log("setMaxSpatialLayer() [localId:%s, spatialLayer:%s]",e,t);let r=this._mapMidTransceiver.get(e);if(!r)throw new Error("associated transceiver not found");let s=r.sender.getParameters();t=s.encodings.length-1-t,s.encodings.forEach((a,i)=>{i>=t?a.active=true:a.active=false;}),await r.sender.setParameters(s);}async setRtpEncodingParameters(e,t){this._assertSendDirection(),console.log("setRtpEncodingParameters() [localId:%s, params:%o]",e,t);let r=this._mapMidTransceiver.get(e);if(!r)throw new Error("associated RTCRtpTransceiver not found");let s=r.sender.getParameters();s.encodings.forEach((a,i)=>{s.encodings[i]={...a,...t};}),await r.sender.setParameters(s);}async getSenderStats(e){this._assertSendDirection();let t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated RTCRtpTransceiver not found");return t.sender.getStats()}async sendDataChannel({ordered:e,maxPacketLifeTime:t,maxRetransmits:r,label:s,protocol:a,priority:i}){this._assertSendDirection();let c={id:this._nextSendSctpStreamId,maxPacketLifeTime:t,maxRetransmits:r,negotiated:true,ordered:e,priority:i,protocol:a};console.log("sendDataChannel() [options:%o]",c);let d=this._pc.createDataChannel(s,c);if(this._nextSendSctpStreamId=++this._nextSendSctpStreamId%ct.MIS,!this._hasDataChannelMediaSection){let p=await this._pc.createOffer(),m=j__namespace.parse(p.sdp),h=m.media.find(f=>f.type==="application");this._transportReady||await this._setupTransport({localDtlsRole:"server",localSdpObject:m}),console.log("sendDataChannel() | calling pc.setLocalDescription() [offer:%o]",p),await this._pc.setLocalDescription(p),this._remoteSdp.sendSctpAssociation({offerMediaObject:h});let u={sdp:this._remoteSdp.getSdp(),type:"answer"};console.log("sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]",u),await this._pc.setRemoteDescription(u),this._hasDataChannelMediaSection=true;}let l={maxPacketLifeTime:c.maxPacketLifeTime,maxRetransmits:c.maxRetransmits,ordered:c.ordered,streamId:c.id};return {dataChannel:d,sctpStreamParameters:l}}async receive({trackId:e,kind:t,rtpParameters:r}){this._assertRecvDirection(),console.log("receive() [trackId:%s, kind:%s]",e,t);let s=r.mid||String(this._mapMidTransceiver.size);this._remoteSdp.receive({kind:t,mid:s,offerRtpParameters:r,streamId:r.rtcp.cname,trackId:e});let a={sdp:this._remoteSdp.getSdp(),type:"offer"};console.log("receive() | calling pc.setRemoteDescription() [offer:%o]",a),await this._pc.setRemoteDescription(a);let i=await this._pc.createAnswer(),c=j__namespace.parse(i.sdp),d=c.media.find(p=>String(p.mid)===s);O({answerMediaObject:d,offerRtpParameters:r}),i={sdp:j__namespace.write(c),type:"answer"},this._transportReady||await this._setupTransport({localDtlsRole:"client",localSdpObject:c}),console.log("receive() | calling pc.setLocalDescription() [answer:%o]",i),await this._pc.setLocalDescription(i);let l=this._pc.getTransceivers().find(p=>p.mid===s);if(!l)throw new Error("new RTCRtpTransceiver not found");return this._mapMidTransceiver.set(s,l),{localId:s,rtpReceiver:l.receiver,track:l.receiver.track}}async stopReceiving(e){this._assertRecvDirection(),console.log("stopReceiving() [localId:%s]",e);let t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated RTCRtpTransceiver not found");this._remoteSdp.closeMediaSection(t.mid);let r={sdp:this._remoteSdp.getSdp(),type:"offer"};console.log("stopReceiving() | calling pc.setRemoteDescription() [offer:%o]",r),await this._pc.setRemoteDescription(r);let s=await this._pc.createAnswer();console.log("stopReceiving() | calling pc.setLocalDescription() [answer:%o]",s),await this._pc.setLocalDescription(s);}async getReceiverStats(e){this._assertRecvDirection();let t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated RTCRtpTransceiver not found");return t.receiver.getStats()}async receiveDataChannel({sctpStreamParameters:e,label:t,protocol:r}){this._assertRecvDirection();let{streamId:s,ordered:a,maxPacketLifeTime:i,maxRetransmits:c}=e,d={id:s,maxPacketLifeTime:i,maxRetransmits:c,negotiated:true,ordered:a,protocol:r};console.log("receiveDataChannel() [options:%o]",d);let l=this._pc.createDataChannel(t,d);if(!this._hasDataChannelMediaSection){this._remoteSdp.receiveSctpAssociation();let p={sdp:this._remoteSdp.getSdp(),type:"offer"};console.log("receiveDataChannel() | calling pc.setRemoteDescription() [offer:%o]",p),await this._pc.setRemoteDescription(p);let m=await this._pc.createAnswer();if(!this._transportReady){let h=j__namespace.parse(m.sdp);await this._setupTransport({localDtlsRole:"client",localSdpObject:h});}console.log("receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]",m),await this._pc.setLocalDescription(m),this._hasDataChannelMediaSection=true;}return {dataChannel:l}}async _setupTransport({localDtlsRole:e,localSdpObject:t}){t||(t=j__namespace.parse(this._pc.localDescription.sdp));let r=x({sdpObject:t});r.role=e,this._remoteSdp.updateDtlsRole(e==="client"?"server":"client"),await this.safeEmitAsPromise("@connect",{dtlsParameters:r}),this._transportReady=true;}_assertSendDirection(){if(this._direction!=="send")throw new Error('method can just be called for handlers with "send" direction')}_assertRecvDirection(){if(this._direction!=="recv")throw new Error('method can just be called for handlers with "recv" direction')}};var dt={MIS:1024,OS:1024},je=class o extends D{constructor(){super();this._direction="send";this._remoteSdp=null;this._sendingRtpParametersByKind=null;this._sendingRemoteRtpParametersByKind=null;this._mapMidTransceiver=new Map;this._sendStream=new MediaStream;this._hasDataChannelMediaSection=false;this._nextSendSctpStreamId=0;this._transportReady=false;}static createFactory(){return ()=>new o}get name(){return "Safari12"}close(){if(console.log("close()"),this._pc)try{this._pc.close();}catch{}}async getNativeRtpCapabilities(){console.log("getNativeRtpCapabilities()");let e=new RTCPeerConnection({bundlePolicy:"max-bundle",iceServers:[],iceTransportPolicy:"all",rtcpMuxPolicy:"require"});try{e.addTransceiver("audio"),e.addTransceiver("video");let t=await e.createOffer();try{e.close();}catch{}let r=j__namespace.parse(t.sdp);return L({sdpObject:r})}catch(t){try{e.close();}catch{}throw t}}async getNativeSctpCapabilities(){return console.log("getNativeSctpCapabilities()"),{numStreams:dt}}run({direction:e,iceParameters:t,iceCandidates:r,dtlsParameters:s,sctpParameters:a,iceServers:i,iceTransportPolicy:c,additionalSettings:d,proprietaryConstraints:l,extendedRtpCapabilities:p}){console.log("run()"),this._direction=e,this._remoteSdp=new k({dtlsParameters:s,iceCandidates:r,iceParameters:t,sctpParameters:a}),this._sendingRtpParametersByKind={audio:b("audio",p),video:b("video",p)},this._sendingRemoteRtpParametersByKind={audio:T("audio",p),video:T("video",p)},this._pc=new RTCPeerConnection({bundlePolicy:"max-bundle",iceServers:i||[],iceTransportPolicy:c||"all",rtcpMuxPolicy:"require",...d},l),this._pc.addEventListener("iceconnectionstatechange",()=>{switch(this._pc.iceConnectionState){case "checking":this.emit("@connectionstatechange","connecting");break;case "connected":case "completed":this.emit("@connectionstatechange","connected");break;case "failed":this.emit("@connectionstatechange","failed");break;case "disconnected":this.emit("@connectionstatechange","disconnected");break;case "closed":this.emit("@connectionstatechange","closed");break}});}async updateIceServers(e){console.log("updateIceServers()");let t=this._pc.getConfiguration();t.iceServers=e,this._pc.setConfiguration(t);}async restartIce(e){if(console.log("restartIce()"),this._remoteSdp.updateIceParameters(e),!!this._transportReady)if(this._direction==="send"){let t=await this._pc.createOffer({iceRestart:true});console.log("restartIce() | calling pc.setLocalDescription() [offer:%o]",t),await this._pc.setLocalDescription(t);let r={sdp:this._remoteSdp.getSdp(),type:"answer"};console.log("restartIce() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r);}else {let t={sdp:this._remoteSdp.getSdp(),type:"offer"};console.log("restartIce() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);let r=await this._pc.createAnswer();console.log("restartIce() | calling pc.setLocalDescription() [answer:%o]",r),await this._pc.setLocalDescription(r);}}async getTransportStats(){return this._pc.getStats()}async send({track:e,encodings:t,codecOptions:r,codec:s}){this._assertSendDirection(),console.log("send() [kind:%s, track.id:%s]",e.kind,e.id);let a=v(this._sendingRtpParametersByKind[e.kind]);a.codecs=P(a.codecs,s);let i=v(this._sendingRemoteRtpParametersByKind[e.kind]);i.codecs=P(i.codecs,s);let c=this._remoteSdp.getNextMediaSectionIdx(),d=this._pc.addTransceiver(e,{direction:"sendonly",streams:[this._sendStream]}),l=await this._pc.createOffer(),p=j__namespace.parse(l.sdp),m;this._transportReady||await this._setupTransport({localDtlsRole:"server",localSdpObject:p}),t&&t.length>1&&(console.log("send() | enabling legacy simulcast"),p=j__namespace.parse(l.sdp),m=p.media[c.idx],ae({numStreams:t.length,offerMediaObject:m}),l={sdp:j__namespace.write(p),type:"offer"}),console.log("send() | calling pc.setLocalDescription() [offer:%o]",l),await this._pc.setLocalDescription(l);let h=d.mid;if(a.mid=h,p=j__namespace.parse(this._pc.localDescription.sdp),m=p.media[c.idx],a.rtcp.cname=M({offerMediaObject:m}),a.encodings=J({offerMediaObject:m}),t)for(let f=0;f<a.encodings.length;++f)t[f]&&Object.assign(a.encodings[f],t[f]);if(a.encodings.length>1&&(a.codecs[0].mimeType.toLowerCase()==="video/vp8"||a.codecs[0].mimeType.toLowerCase()==="video/h264"))for(let f of a.encodings)f.scalabilityMode="S1T3";this._remoteSdp.send({answerRtpParameters:i,codecOptions:r,offerMediaObject:m,offerRtpParameters:a,reuseMid:c.reuseMid});let u={sdp:this._remoteSdp.getSdp(),type:"answer"};return console.log("send() | calling pc.setRemoteDescription() [answer:%o]",u),await this._pc.setRemoteDescription(u),this._mapMidTransceiver.set(h,d),{localId:h,rtpParameters:a,rtpSender:d.sender}}async stopSending(e){this._assertSendDirection(),console.log("stopSending() [localId:%s]",e);let t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated RTCRtpTransceiver not found");t.sender.replaceTrack(null),this._pc.removeTrack(t.sender),this._remoteSdp.closeMediaSection(t.mid);let r=await this._pc.createOffer();console.log("stopSending() | calling pc.setLocalDescription() [offer:%o]",r),await this._pc.setLocalDescription(r);let s={sdp:this._remoteSdp.getSdp(),type:"answer"};console.log("stopSending() | calling pc.setRemoteDescription() [answer:%o]",s),await this._pc.setRemoteDescription(s);}async replaceTrack(e,t){this._assertSendDirection(),t?console.log("replaceTrack() [localId:%s, track.id:%s]",e,t.id):console.log("replaceTrack() [localId:%s, no track]",e);let r=this._mapMidTransceiver.get(e);if(!r)throw new Error("associated RTCRtpTransceiver not found");await r.sender.replaceTrack(t);}async setMaxSpatialLayer(e,t){this._assertSendDirection(),console.log("setMaxSpatialLayer() [localId:%s, spatialLayer:%s]",e,t);let r=this._mapMidTransceiver.get(e);if(!r)throw new Error("associated RTCRtpTransceiver not found");let s=r.sender.getParameters();s.encodings.forEach((a,i)=>{i<=t?a.active=true:a.active=false;}),await r.sender.setParameters(s);}async setRtpEncodingParameters(e,t){this._assertSendDirection(),console.log("setRtpEncodingParameters() [localId:%s, params:%o]",e,t);let r=this._mapMidTransceiver.get(e);if(!r)throw new Error("associated RTCRtpTransceiver not found");let s=r.sender.getParameters();s.encodings.forEach((a,i)=>{s.encodings[i]={...a,...t};}),await r.sender.setParameters(s);}async getSenderStats(e){this._assertSendDirection();let t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated RTCRtpTransceiver not found");return t.sender.getStats()}async sendDataChannel({ordered:e,maxPacketLifeTime:t,maxRetransmits:r,label:s,protocol:a,priority:i}){this._assertSendDirection();let c={id:this._nextSendSctpStreamId,maxPacketLifeTime:t,maxRetransmits:r,negotiated:true,ordered:e,priority:i,protocol:a};console.log("sendDataChannel() [options:%o]",c);let d=this._pc.createDataChannel(s,c);if(this._nextSendSctpStreamId=++this._nextSendSctpStreamId%dt.MIS,!this._hasDataChannelMediaSection){let p=await this._pc.createOffer(),m=j__namespace.parse(p.sdp),h=m.media.find(f=>f.type==="application");this._transportReady||await this._setupTransport({localDtlsRole:"server",localSdpObject:m}),console.log("sendDataChannel() | calling pc.setLocalDescription() [offer:%o]",p),await this._pc.setLocalDescription(p),this._remoteSdp.sendSctpAssociation({offerMediaObject:h});let u={sdp:this._remoteSdp.getSdp(),type:"answer"};console.log("sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]",u),await this._pc.setRemoteDescription(u),this._hasDataChannelMediaSection=true;}let l={maxPacketLifeTime:c.maxPacketLifeTime,maxRetransmits:c.maxRetransmits,ordered:c.ordered,streamId:c.id};return {dataChannel:d,sctpStreamParameters:l}}async receive({trackId:e,kind:t,rtpParameters:r}){this._assertRecvDirection(),console.log("receive() [trackId:%s, kind:%s]",e,t);let s=r.mid||String(this._mapMidTransceiver.size);this._remoteSdp.receive({kind:t,mid:s,offerRtpParameters:r,streamId:r.rtcp.cname,trackId:e});let a={sdp:this._remoteSdp.getSdp(),type:"offer"};console.log("receive() | calling pc.setRemoteDescription() [offer:%o]",a),await this._pc.setRemoteDescription(a);let i=await this._pc.createAnswer(),c=j__namespace.parse(i.sdp),d=c.media.find(p=>String(p.mid)===s);O({answerMediaObject:d,offerRtpParameters:r}),i={sdp:j__namespace.write(c),type:"answer"},this._transportReady||await this._setupTransport({localDtlsRole:"client",localSdpObject:c}),console.log("receive() | calling pc.setLocalDescription() [answer:%o]",i),await this._pc.setLocalDescription(i);let l=this._pc.getTransceivers().find(p=>p.mid===s);if(!l)throw new Error("new RTCRtpTransceiver not found");return this._mapMidTransceiver.set(s,l),{localId:s,rtpReceiver:l.receiver,track:l.receiver.track}}async stopReceiving(e){this._assertRecvDirection(),console.log("stopReceiving() [localId:%s]",e);let t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated RTCRtpTransceiver not found");this._remoteSdp.closeMediaSection(t.mid);let r={sdp:this._remoteSdp.getSdp(),type:"offer"};console.log("stopReceiving() | calling pc.setRemoteDescription() [offer:%o]",r),await this._pc.setRemoteDescription(r);let s=await this._pc.createAnswer();console.log("stopReceiving() | calling pc.setLocalDescription() [answer:%o]",s),await this._pc.setLocalDescription(s);}async getReceiverStats(e){this._assertRecvDirection();let t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated RTCRtpTransceiver not found");return t.receiver.getStats()}async receiveDataChannel({sctpStreamParameters:e,label:t,protocol:r}){this._assertRecvDirection();let{streamId:s,ordered:a,maxPacketLifeTime:i,maxRetransmits:c}=e,d={id:s,maxPacketLifeTime:i,maxRetransmits:c,negotiated:true,ordered:a,protocol:r};console.log("receiveDataChannel() [options:%o]",d);let l=this._pc.createDataChannel(t,d);if(!this._hasDataChannelMediaSection){this._remoteSdp.receiveSctpAssociation();let p={sdp:this._remoteSdp.getSdp(),type:"offer"};console.log("receiveDataChannel() | calling pc.setRemoteDescription() [offer:%o]",p),await this._pc.setRemoteDescription(p);let m=await this._pc.createAnswer();if(!this._transportReady){let h=j__namespace.parse(m.sdp);await this._setupTransport({localDtlsRole:"client",localSdpObject:h});}console.log("receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]",m),await this._pc.setLocalDescription(m),this._hasDataChannelMediaSection=true;}return {dataChannel:l}}async _setupTransport({localDtlsRole:e,localSdpObject:t}){t||(t=j__namespace.parse(this._pc.localDescription.sdp));let r=x({sdpObject:t});r.role=e,this._remoteSdp.updateDtlsRole(e==="client"?"server":"client"),await this.safeEmitAsPromise("@connect",{dtlsParameters:r}),this._transportReady=true;}_assertSendDirection(){if(this._direction!=="send")throw new Error('method can just be called for handlers with "send" direction')}_assertRecvDirection(){if(this._direction!=="recv")throw new Error('method can just be called for handlers with "recv" direction')}};var pt={MIS:1024,OS:1024},Ne=class o extends D{constructor(){super();this._direction="send";this._remoteSdp=null;this._sendingRtpParametersByKind=null;this._sendingRemoteRtpParametersByKind=null;this._sendStream=new MediaStream;this._mapSendLocalIdRtpSender=new Map;this._nextSendLocalId=0;this._mapRecvLocalIdInfo=new Map;this._hasDataChannelMediaSection=false;this._nextSendSctpStreamId=0;this._transportReady=false;}static createFactory(){return ()=>new o}get name(){return "Safari11"}close(){if(console.log("close()"),this._pc)try{this._pc.close();}catch{}}async getNativeRtpCapabilities(){console.log("getNativeRtpCapabilities()");let e=new RTCPeerConnection({bundlePolicy:"max-bundle",iceServers:[],iceTransportPolicy:"all",rtcpMuxPolicy:"require",sdpSemantics:"plan-b"});try{let t=await e.createOffer({offerToReceiveAudio:!0,offerToReceiveVideo:!0});try{e.close();}catch{}let r=j__namespace.parse(t.sdp);return L({sdpObject:r})}catch(t){try{e.close();}catch{}throw t}}async getNativeSctpCapabilities(){return console.log("getNativeSctpCapabilities()"),{numStreams:pt}}run({direction:e,iceParameters:t,iceCandidates:r,dtlsParameters:s,sctpParameters:a,iceServers:i,iceTransportPolicy:c,additionalSettings:d,proprietaryConstraints:l,extendedRtpCapabilities:p}){console.log("run()"),this._direction=e,this._remoteSdp=new k({dtlsParameters:s,iceCandidates:r,iceParameters:t,planB:true,sctpParameters:a}),this._sendingRtpParametersByKind={audio:b("audio",p),video:b("video",p)},this._sendingRemoteRtpParametersByKind={audio:T("audio",p),video:T("video",p)},this._pc=new RTCPeerConnection({bundlePolicy:"max-bundle",iceServers:i||[],iceTransportPolicy:c||"all",rtcpMuxPolicy:"require",...d},l),this._pc.addEventListener("iceconnectionstatechange",()=>{switch(this._pc.iceConnectionState){case "checking":this.emit("@connectionstatechange","connecting");break;case "connected":case "completed":this.emit("@connectionstatechange","connected");break;case "failed":this.emit("@connectionstatechange","failed");break;case "disconnected":this.emit("@connectionstatechange","disconnected");break;case "closed":this.emit("@connectionstatechange","closed");break}});}async updateIceServers(e){console.log("updateIceServers()");let t=this._pc.getConfiguration();t.iceServers=e,this._pc.setConfiguration(t);}async restartIce(e){if(console.log("restartIce()"),this._remoteSdp.updateIceParameters(e),!!this._transportReady)if(this._direction==="send"){let t=await this._pc.createOffer({iceRestart:true});console.log("restartIce() | calling pc.setLocalDescription() [offer:%o]",t),await this._pc.setLocalDescription(t);let r={sdp:this._remoteSdp.getSdp(),type:"answer"};console.log("restartIce() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r);}else {let t={sdp:this._remoteSdp.getSdp(),type:"offer"};console.log("restartIce() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);let r=await this._pc.createAnswer();console.log("restartIce() | calling pc.setLocalDescription() [answer:%o]",r),await this._pc.setLocalDescription(r);}}async getTransportStats(){return this._pc.getStats()}async send({track:e,encodings:t,codecOptions:r,codec:s}){this._assertSendDirection(),console.log("send() [kind:%s, track.id:%s]",e.kind,e.id),s&&console.log("send() | codec selection is not available in %s handler",this.name),this._sendStream.addTrack(e),this._pc.addTrack(e,this._sendStream);let a=await this._pc.createOffer(),i=j__namespace.parse(a.sdp),c,d=v(this._sendingRtpParametersByKind[e.kind]);d.codecs=P(d.codecs);let l=v(this._sendingRemoteRtpParametersByKind[e.kind]);if(l.codecs=P(l.codecs),this._transportReady||await this._setupTransport({localDtlsRole:"server",localSdpObject:i}),e.kind==="video"&&t&&t.length>1&&(console.log("send() | enabling simulcast"),i=j__namespace.parse(a.sdp),c=i.media.find(u=>u.type==="video"),te({numStreams:t.length,offerMediaObject:c,track:e}),a={sdp:j__namespace.write(i),type:"offer"}),console.log("send() | calling pc.setLocalDescription() [offer:%o]",a),await this._pc.setLocalDescription(a),i=j__namespace.parse(this._pc.localDescription.sdp),c=i.media.find(u=>u.type===e.kind),d.rtcp.cname=M({offerMediaObject:c}),d.encodings=ee({offerMediaObject:c,track:e}),t)for(let u=0;u<d.encodings.length;++u)t[u]&&Object.assign(d.encodings[u],t[u]);if(d.encodings.length>1&&d.codecs[0].mimeType.toLowerCase()==="video/vp8")for(let u of d.encodings)u.scalabilityMode="S1T3";this._remoteSdp.send({answerRtpParameters:l,codecOptions:r,offerMediaObject:c,offerRtpParameters:d});let p={sdp:this._remoteSdp.getSdp(),type:"answer"};console.log("send() | calling pc.setRemoteDescription() [answer:%o]",p),await this._pc.setRemoteDescription(p);let m=String(this._nextSendLocalId);this._nextSendLocalId++;let h=this._pc.getSenders().find(u=>u.track===e);return this._mapSendLocalIdRtpSender.set(m,h),{localId:m,rtpParameters:d,rtpSender:h}}async stopSending(e){this._assertSendDirection();let t=this._mapSendLocalIdRtpSender.get(e);if(!t)throw new Error("associated RTCRtpSender not found");t.track&&this._sendStream.removeTrack(t.track),this._mapSendLocalIdRtpSender.delete(e);let r=await this._pc.createOffer();console.log("stopSending() | calling pc.setLocalDescription() [offer:%o]",r);try{await this._pc.setLocalDescription(r);}catch(a){if(this._sendStream.getTracks().length===0){console.log("stopSending() | ignoring expected error due no sending tracks: %s",a.toString());return}throw a}if(this._pc.signalingState==="stable")return;let s={sdp:this._remoteSdp.getSdp(),type:"answer"};console.log("stopSending() | calling pc.setRemoteDescription() [answer:%o]",s),await this._pc.setRemoteDescription(s);}async replaceTrack(e,t){this._assertSendDirection(),t?console.log("replaceTrack() [localId:%s, track.id:%s]",e,t.id):console.log("replaceTrack() [localId:%s, no track]",e);let r=this._mapSendLocalIdRtpSender.get(e);if(!r)throw new Error("associated RTCRtpSender not found");let s=r.track;await r.replaceTrack(t),s&&this._sendStream.removeTrack(s),t&&this._sendStream.addTrack(t);}async setMaxSpatialLayer(e,t){this._assertSendDirection(),console.log("setMaxSpatialLayer() [localId:%s, spatialLayer:%s]",e,t);let r=this._mapSendLocalIdRtpSender.get(e);if(!r)throw new Error("associated RTCRtpSender not found");let s=r.getParameters();s.encodings.forEach((a,i)=>{i<=t?a.active=true:a.active=false;}),await r.setParameters(s);}async setRtpEncodingParameters(e,t){this._assertSendDirection(),console.log("setRtpEncodingParameters() [localId:%s, params:%o]",e,t);let r=this._mapSendLocalIdRtpSender.get(e);if(!r)throw new Error("associated RTCRtpSender not found");let s=r.getParameters();s.encodings.forEach((a,i)=>{s.encodings[i]={...a,...t};}),await r.setParameters(s);}async getSenderStats(e){this._assertSendDirection();let t=this._mapSendLocalIdRtpSender.get(e);if(!t)throw new Error("associated RTCRtpSender not found");return t.getStats()}async sendDataChannel({ordered:e,maxPacketLifeTime:t,maxRetransmits:r,label:s,protocol:a,priority:i}){this._assertSendDirection();let c={id:this._nextSendSctpStreamId,maxPacketLifeTime:t,maxRetransmits:r,negotiated:true,ordered:e,priority:i,protocol:a};console.log("sendDataChannel() [options:%o]",c);let d=this._pc.createDataChannel(s,c);if(this._nextSendSctpStreamId=++this._nextSendSctpStreamId%pt.MIS,!this._hasDataChannelMediaSection){let p=await this._pc.createOffer(),m=j__namespace.parse(p.sdp),h=m.media.find(f=>f.type==="application");this._transportReady||await this._setupTransport({localDtlsRole:"server",localSdpObject:m}),console.log("sendDataChannel() | calling pc.setLocalDescription() [offer:%o]",p),await this._pc.setLocalDescription(p),this._remoteSdp.sendSctpAssociation({offerMediaObject:h});let u={sdp:this._remoteSdp.getSdp(),type:"answer"};console.log("sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]",u),await this._pc.setRemoteDescription(u),this._hasDataChannelMediaSection=true;}let l={maxPacketLifeTime:c.maxPacketLifeTime,maxRetransmits:c.maxRetransmits,ordered:c.ordered,streamId:c.id};return {dataChannel:d,sctpStreamParameters:l}}async receive({trackId:e,kind:t,rtpParameters:r}){this._assertRecvDirection(),console.log("receive() [trackId:%s, kind:%s]",e,t);let s=e,a=t;this._remoteSdp.receive({kind:t,mid:a,offerRtpParameters:r,streamId:r.rtcp.cname,trackId:e});let i={sdp:this._remoteSdp.getSdp(),type:"offer"};console.log("receive() | calling pc.setRemoteDescription() [offer:%o]",i),await this._pc.setRemoteDescription(i);let c=await this._pc.createAnswer(),d=j__namespace.parse(c.sdp),l=d.media.find(m=>String(m.mid)===a);O({answerMediaObject:l,offerRtpParameters:r}),c={sdp:j__namespace.write(d),type:"answer"},this._transportReady||await this._setupTransport({localDtlsRole:"client",localSdpObject:d}),console.log("receive() | calling pc.setLocalDescription() [answer:%o]",c),await this._pc.setLocalDescription(c);let p=this._pc.getReceivers().find(m=>m.track&&m.track.id===s);if(!p)throw new Error("new RTCRtpReceiver not");return this._mapRecvLocalIdInfo.set(s,{mid:a,rtpParameters:r,rtpReceiver:p}),{localId:s,rtpReceiver:p,track:p.track}}async stopReceiving(e){this._assertRecvDirection(),console.log("stopReceiving() [localId:%s]",e);let t=this._mapRecvLocalIdInfo.get(e);if(!t)throw new Error("associated RTCRtpReceiver not found");let{mid:r,rtpParameters:s}=t;this._mapRecvLocalIdInfo.delete(e),this._remoteSdp.planBStopReceiving({mid:r,offerRtpParameters:s});let a={sdp:this._remoteSdp.getSdp(),type:"offer"};console.log("stopReceiving() | calling pc.setRemoteDescription() [offer:%o]",a),await this._pc.setRemoteDescription(a);let i=await this._pc.createAnswer();console.log("stopReceiving() | calling pc.setLocalDescription() [answer:%o]",i),await this._pc.setLocalDescription(i);}async getReceiverStats(e){this._assertRecvDirection();let t=this._mapRecvLocalIdInfo.get(e);if(!t||!t.rtpReceiver)throw new Error("associated RTCRtpReceiver not found");return t.rtpReceiver.getStats()}async receiveDataChannel({sctpStreamParameters:e,label:t,protocol:r}){this._assertRecvDirection();let{streamId:s,ordered:a,maxPacketLifeTime:i,maxRetransmits:c}=e,d={id:s,maxPacketLifeTime:i,maxRetransmits:c,negotiated:true,ordered:a,protocol:r};console.log("receiveDataChannel() [options:%o]",d);let l=this._pc.createDataChannel(t,d);if(!this._hasDataChannelMediaSection){this._remoteSdp.receiveSctpAssociation({oldDataChannelSpec:true});let p={sdp:this._remoteSdp.getSdp(),type:"offer"};console.log("receiveDataChannel() | calling pc.setRemoteDescription() [offer:%o]",p),await this._pc.setRemoteDescription(p);let m=await this._pc.createAnswer();if(!this._transportReady){let h=j__namespace.parse(m.sdp);await this._setupTransport({localDtlsRole:"client",localSdpObject:h});}console.log("receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]",m),await this._pc.setLocalDescription(m),this._hasDataChannelMediaSection=true;}return {dataChannel:l}}async _setupTransport({localDtlsRole:e,localSdpObject:t}){t||(t=j__namespace.parse(this._pc.localDescription.sdp));let r=x({sdpObject:t});r.role=e,this._remoteSdp.updateDtlsRole(e==="client"?"server":"client"),await this.safeEmitAsPromise("@connect",{dtlsParameters:r}),this._transportReady=true;}_assertSendDirection(){if(this._direction!=="send")throw new Error('method can just be called for handlers with "send" direction')}_assertRecvDirection(){if(this._direction!=="recv")throw new Error('method can just be called for handlers with "recv" direction')}};function lt(){let o=RTCRtpReceiver.getCapabilities(),n=v(o);for(let e of n.codecs){if(e.channels=e.numChannels,delete e.numChannels,e.mimeType=e.mimeType||`${e.kind}/${e.name}`,e.parameters){let t=e.parameters;t.apt&&(t.apt=Number(t.apt)),t["packetization-mode"]&&(t["packetization-mode"]=Number(t["packetization-mode"]));}for(let t of e.rtcpFeedback||[])t.parameter||(t.parameter="");}return n}function $e(o){let n=v(o);n.mid&&(n.muxId=n.mid,delete n.mid);for(let e of n.codecs)e.channels&&(e.numChannels=e.channels,delete e.channels),e.mimeType&&!e.name&&(e.name=e.mimeType.split("/")[1]),delete e.mimeType;return n}var Be=class o extends D{constructor(){super();this._sendingRtpParametersByKind=null;this._remoteIceParameters=null;this._remoteIceCandidates=null;this._remoteDtlsParameters=null;this._rtpSenders=new Map;this._rtpReceivers=new Map;this._nextSendLocalId=0;this._cname="";this._transportReady=false;}static createFactory(){return ()=>new o}get name(){return "Edge11"}close(){console.log("close()");try{this._iceGatherer.close();}catch{}try{this._iceTransport.stop();}catch{}try{this._dtlsTransport.stop();}catch{}for(let e of this._rtpSenders.values())try{e.stop();}catch{}for(let e of this._rtpReceivers.values())try{e.stop();}catch{}}async getNativeRtpCapabilities(){return console.log("getNativeRtpCapabilities()"),lt()}async getNativeSctpCapabilities(){return console.log("getNativeSctpCapabilities()"),{numStreams:{MIS:0,OS:0}}}run({direction:e,iceParameters:t,iceCandidates:r,dtlsParameters:s,sctpParameters:a,iceServers:i,iceTransportPolicy:c,additionalSettings:d,proprietaryConstraints:l,extendedRtpCapabilities:p}){console.log("run()"),this._sendingRtpParametersByKind={audio:b("audio",p),video:b("video",p)},this._remoteIceParameters=t,this._remoteIceCandidates=r,this._remoteDtlsParameters=s,this._cname=`CNAME-${ne()}`,this._setIceGatherer({iceServers:i||[],iceTransportPolicy:c||"all"}),this._setIceTransport(),this._setDtlsTransport();}async updateIceServers(e){throw new y("not supported")}async restartIce(e){if(console.log("restartIce()"),this._remoteIceParameters=e,!!this._transportReady){console.log("restartIce() | calling iceTransport.start()"),this._iceTransport.start(this._iceGatherer,e,"controlling");for(let t of this._remoteIceCandidates)this._iceTransport.addRemoteCandidate(t);this._iceTransport.addRemoteCandidate({});}}async getTransportStats(){return this._iceTransport.getStats()}async send({track:e,encodings:t,codecOptions:r,codec:s}){console.log("send() [kind:%s, track.id:%s]",e.kind,e.id),this._transportReady||await this._setupTransport({localDtlsRole:"server"}),console.log("send() | calling new RTCRtpSender()");let a=new RTCRtpSender(e,this._dtlsTransport),i=v(this._sendingRtpParametersByKind[e.kind]);i.codecs=P(i.codecs,s);let c=i.codecs.some(p=>/.+\/rtx$/i.test(p.mimeType));t||(t=[{}]);for(let p of t)p.ssrc=ne(),c&&(p.rtx={ssrc:ne()});i.encodings=t,i.rtcp={cname:this._cname,mux:true,reducedSize:true};let d=$e(i);console.log("send() | calling rtpSender.send() [params:%o]",d),await a.send(d);let l=String(this._nextSendLocalId);return this._nextSendLocalId++,this._rtpSenders.set(l,a),{localId:l,rtpParameters:i,rtpSender:a}}async stopSending(e){console.log("stopSending() [localId:%s]",e);let t=this._rtpSenders.get(e);if(!t)throw new Error("RTCRtpSender not found");this._rtpSenders.delete(e);try{console.log("stopSending() | calling rtpSender.stop()"),t.stop();}catch(r){throw console.log("stopSending() | rtpSender.stop() failed:%o",r),r}}async replaceTrack(e,t){t?console.log("replaceTrack() [localId:%s, track.id:%s]",e,t.id):console.log("replaceTrack() [localId:%s, no track]",e);let r=this._rtpSenders.get(e);if(!r)throw new Error("RTCRtpSender not found");r.setTrack(t);}async setMaxSpatialLayer(e,t){console.log("setMaxSpatialLayer() [localId:%s, spatialLayer:%s]",e,t);let r=this._rtpSenders.get(e);if(!r)throw new Error("RTCRtpSender not found");let s=r.getParameters();s.encodings.forEach((a,i)=>{i<=t?a.active=true:a.active=false;}),await r.setParameters(s);}async setRtpEncodingParameters(e,t){console.log("setRtpEncodingParameters() [localId:%s, params:%o]",e,t);let r=this._rtpSenders.get(e);if(!r)throw new Error("RTCRtpSender not found");let s=r.getParameters();s.encodings.forEach((a,i)=>{s.encodings[i]={...a,...t};}),await r.setParameters(s);}async getSenderStats(e){let t=this._rtpSenders.get(e);if(!t)throw new Error("RTCRtpSender not found");return t.getStats()}async sendDataChannel(e){throw new y("not implemented")}async receive({trackId:e,kind:t,rtpParameters:r}){console.log("receive() [trackId:%s, kind:%s]",e,t),this._transportReady||await this._setupTransport({localDtlsRole:"server"}),console.log("receive() | calling new RTCRtpReceiver()");let s=new RTCRtpReceiver(this._dtlsTransport,t);s.addEventListener("error",c=>{console.log('rtpReceiver "error" event [event:%o]',c);});let a=$e(r);console.log("receive() | calling rtpReceiver.receive() [params:%o]",a),await s.receive(a);let i=e;return this._rtpReceivers.set(i,s),{localId:i,rtpReceiver:s,track:s.track}}async stopReceiving(e){console.log("stopReceiving() [localId:%s]",e);let t=this._rtpReceivers.get(e);if(!t)throw new Error("RTCRtpReceiver not found");this._rtpReceivers.delete(e);try{console.log("stopReceiving() | calling rtpReceiver.stop()"),t.stop();}catch(r){console.log("stopReceiving() | rtpReceiver.stop() failed:%o",r);}}async getReceiverStats(e){let t=this._rtpReceivers.get(e);if(!t)throw new Error("RTCRtpReceiver not found");return t.getStats()}async receiveDataChannel(e){throw new y("not implemented")}_setIceGatherer({iceServers:e,iceTransportPolicy:t}){}_setIceTransport(){let e=new RTCIceTransport(this._iceGatherer);e.addEventListener("statechange",()=>{switch(e.state){case "checking":this.emit("@connectionstatechange","connecting");break;case "connected":case "completed":this.emit("@connectionstatechange","connected");break;case "failed":this.emit("@connectionstatechange","failed");break;case "disconnected":this.emit("@connectionstatechange","disconnected");break;case "closed":this.emit("@connectionstatechange","closed");break}}),e.addEventListener("icestatechange",()=>{switch(e.state){case "checking":this.emit("@connectionstatechange","connecting");break;case "connected":case "completed":this.emit("@connectionstatechange","connected");break;case "failed":this.emit("@connectionstatechange","failed");break;case "disconnected":this.emit("@connectionstatechange","disconnected");break;case "closed":this.emit("@connectionstatechange","closed");break}}),e.addEventListener("candidatepairchange",t=>{console.log('iceTransport "candidatepairchange" event [pair:%o]',t.pair);}),this._iceTransport=e;}_setDtlsTransport(){let e=new RTCDtlsTransport(this._iceTransport);e.addEventListener("statechange",()=>{console.log('dtlsTransport "statechange" event [state:%s]',e.state);}),e.addEventListener("dtlsstatechange",()=>{console.log('dtlsTransport "dtlsstatechange" event [state:%s]',e.state),e.state==="closed"&&this.emit("@connectionstatechange","closed");}),e.addEventListener("error",t=>{console.log('dtlsTransport "error" event [event:%o]',t);}),this._dtlsTransport=e;}async _setupTransport({localDtlsRole:e}){console.log("_setupTransport()");let t=this._dtlsTransport.getLocalParameters();t.role=e,await this.safeEmitAsPromise("@connect",{dtlsParameters:t}),this._iceTransport.start(this._iceGatherer,this._remoteIceParameters,"controlling");for(let r of this._remoteIceCandidates)this._iceTransport.addRemoteCandidate(r);this._iceTransport.addRemoteCandidate({}),this._remoteDtlsParameters.fingerprints=this._remoteDtlsParameters.fingerprints.filter(r=>r.algorithm==="sha-256"||r.algorithm==="sha-384"||r.algorithm==="sha-512"),this._dtlsTransport.start(this._remoteDtlsParameters),this._transportReady=true;}};var mt={MIS:1024,OS:1024},He=class o extends D{constructor(){super();this._direction="send";this._remoteSdp=null;this._sendingRtpParametersByKind=null;this._sendingRemoteRtpParametersByKind=null;this._sendStream=new MediaStream;this._mapSendLocalIdTrack=new Map;this._nextSendLocalId=0;this._mapRecvLocalIdInfo=new Map;this._hasDataChannelMediaSection=false;this._nextSendSctpStreamId=0;this._transportReady=false;}static createFactory(){return ()=>new o}get name(){return "ReactNative"}close(){if(console.log("close()"),this._pc)try{this._pc.close();}catch{}}async getNativeRtpCapabilities(){console.log("getNativeRtpCapabilities()");let e=new RTCPeerConnection({bundlePolicy:"max-bundle",iceServers:[],iceTransportPolicy:"all",rtcpMuxPolicy:"require",sdpSemantics:"plan-b"});try{let t=await e.createOffer({offerToReceiveAudio:!0,offerToReceiveVideo:!0});try{e.close();}catch{}let r=j__namespace.parse(t.sdp);return L({sdpObject:r})}catch(t){try{e.close();}catch{}throw t}}async getNativeSctpCapabilities(){return console.log("getNativeSctpCapabilities()"),{numStreams:mt}}run({direction:e,iceParameters:t,iceCandidates:r,dtlsParameters:s,sctpParameters:a,iceServers:i,iceTransportPolicy:c,additionalSettings:d,proprietaryConstraints:l,extendedRtpCapabilities:p}){console.log("run()"),this._direction=e,this._remoteSdp=new k({dtlsParameters:s,iceCandidates:r,iceParameters:t,planB:true,sctpParameters:a}),this._sendingRtpParametersByKind={audio:b("audio",p),video:b("video",p)},this._sendingRemoteRtpParametersByKind={audio:T("audio",p),video:T("video",p)},this._pc=new RTCPeerConnection({bundlePolicy:"max-bundle",iceServers:i||[],iceTransportPolicy:c||"all",rtcpMuxPolicy:"require",sdpSemantics:"plan-b",...d},l),this._pc.addEventListener("iceconnectionstatechange",()=>{switch(this._pc.iceConnectionState){case "checking":this.emit("@connectionstatechange","connecting");break;case "connected":case "completed":this.emit("@connectionstatechange","connected");break;case "failed":this.emit("@connectionstatechange","failed");break;case "disconnected":this.emit("@connectionstatechange","disconnected");break;case "closed":this.emit("@connectionstatechange","closed");break}});}async updateIceServers(e){console.log("updateIceServers()");let t=this._pc.getConfiguration();t.iceServers=e,this._pc.setConfiguration(t);}async restartIce(e){if(console.log("restartIce()"),this._remoteSdp.updateIceParameters(e),!!this._transportReady)if(this._direction==="send"){let t=await this._pc.createOffer({iceRestart:true});console.log("restartIce() | calling pc.setLocalDescription() [offer:%o]",t),await this._pc.setLocalDescription(t);let r={sdp:this._remoteSdp.getSdp(),type:"answer"};console.log("restartIce() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r);}else {let t={sdp:this._remoteSdp.getSdp(),type:"offer"};console.log("restartIce() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);let r=await this._pc.createAnswer();console.log("restartIce() | calling pc.setLocalDescription() [answer:%o]",r),await this._pc.setLocalDescription(r);}}async getTransportStats(){return this._pc.getStats()}async send({track:e,encodings:t,codecOptions:r,codec:s}){this._assertSendDirection(),console.log("send() [kind:%s, track.id:%s]",e.kind,e.id),s&&console.log("send() | codec selection is not available in %s handler",this.name),this._sendStream.addTrack(e),this._pc.addStream(this._sendStream);let a=await this._pc.createOffer(),i=j__namespace.parse(a.sdp),c,d=v(this._sendingRtpParametersByKind[e.kind]);d.codecs=P(d.codecs);let l=v(this._sendingRemoteRtpParametersByKind[e.kind]);if(l.codecs=P(l.codecs),this._transportReady||await this._setupTransport({localDtlsRole:"server",localSdpObject:i}),e.kind==="video"&&t&&t.length>1&&(console.log("send() | enabling simulcast"),i=j__namespace.parse(a.sdp),c=i.media.find(h=>h.type==="video"),te({numStreams:t.length,offerMediaObject:c,track:e}),a={sdp:j__namespace.write(i),type:"offer"}),console.log("send() | calling pc.setLocalDescription() [offer:%o]",a),await this._pc.setLocalDescription(a),i=j__namespace.parse(this._pc.localDescription.sdp),c=i.media.find(h=>h.type===e.kind),d.rtcp.cname=M({offerMediaObject:c}),d.encodings=ee({offerMediaObject:c,track:e}),t)for(let h=0;h<d.encodings.length;++h)t[h]&&Object.assign(d.encodings[h],t[h]);if(d.encodings.length>1&&(d.codecs[0].mimeType.toLowerCase()==="video/vp8"||d.codecs[0].mimeType.toLowerCase()==="video/h264"))for(let h of d.encodings)h.scalabilityMode="S1T3";this._remoteSdp.send({answerRtpParameters:l,codecOptions:r,offerMediaObject:c,offerRtpParameters:d});let p={sdp:this._remoteSdp.getSdp(),type:"answer"};console.log("send() | calling pc.setRemoteDescription() [answer:%o]",p),await this._pc.setRemoteDescription(p);let m=String(this._nextSendLocalId);return this._nextSendLocalId++,this._mapSendLocalIdTrack.set(m,e),{localId:m,rtpParameters:d}}async stopSending(e){this._assertSendDirection(),console.log("stopSending() [localId:%s]",e);let t=this._mapSendLocalIdTrack.get(e);if(!t)throw new Error("track not found");this._mapSendLocalIdTrack.delete(e),this._sendStream.removeTrack(t),this._pc.addStream(this._sendStream);let r=await this._pc.createOffer();console.log("stopSending() | calling pc.setLocalDescription() [offer:%o]",r);try{await this._pc.setLocalDescription(r);}catch(a){if(this._sendStream.getTracks().length===0){console.log("stopSending() | ignoring expected error due no sending tracks: %s",a.toString());return}throw a}if(this._pc.signalingState==="stable")return;let s={sdp:this._remoteSdp.getSdp(),type:"answer"};console.log("stopSending() | calling pc.setRemoteDescription() [answer:%o]",s),await this._pc.setRemoteDescription(s);}async replaceTrack(e,t){throw new y("not implemented")}async setMaxSpatialLayer(e,t){throw new y("not implemented")}async setRtpEncodingParameters(e,t){throw new y("not implemented")}async getSenderStats(e){throw new y("not implemented")}async sendDataChannel({ordered:e,maxPacketLifeTime:t,maxRetransmits:r,label:s,protocol:a,priority:i}){this._assertSendDirection();let c={id:this._nextSendSctpStreamId,maxPacketLifeTime:t,maxRetransmitTime:t,maxRetransmits:r,negotiated:true,ordered:e,priority:i,protocol:a};console.log("sendDataChannel() [options:%o]",c);let d=this._pc.createDataChannel(s,c);if(this._nextSendSctpStreamId=++this._nextSendSctpStreamId%mt.MIS,!this._hasDataChannelMediaSection){let p=await this._pc.createOffer(),m=j__namespace.parse(p.sdp),h=m.media.find(f=>f.type==="application");this._transportReady||await this._setupTransport({localDtlsRole:"server",localSdpObject:m}),console.log("sendDataChannel() | calling pc.setLocalDescription() [offer:%o]",p),await this._pc.setLocalDescription(p),this._remoteSdp.sendSctpAssociation({offerMediaObject:h});let u={sdp:this._remoteSdp.getSdp(),type:"answer"};console.log("sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]",u),await this._pc.setRemoteDescription(u),this._hasDataChannelMediaSection=true;}let l={maxPacketLifeTime:c.maxPacketLifeTime,maxRetransmits:c.maxRetransmits,ordered:c.ordered,streamId:c.id};return {dataChannel:d,sctpStreamParameters:l}}async receive({trackId:e,kind:t,rtpParameters:r}){this._assertRecvDirection(),console.log("receive() [trackId:%s, kind:%s]",e,t);let s=e,a=t,i=r.rtcp.cname;if(console.log("receive() | forcing a random remote streamId to avoid well known bug in react-native-webrtc"),i+=`-hack-${ne()}`,i===void 0)throw new Error("streamId is undefined");this._remoteSdp.receive({kind:t,mid:a,offerRtpParameters:r,streamId:i,trackId:e});let c={sdp:this._remoteSdp.getSdp(),type:"offer"};console.log("receive() | calling pc.setRemoteDescription() [offer:%o]",c),await this._pc.setRemoteDescription(c);let d=await this._pc.createAnswer(),l=j__namespace.parse(d.sdp),p=l.media.find(u=>String(u.mid)===a);O({answerMediaObject:p,offerRtpParameters:r}),d={sdp:j__namespace.write(l),type:"answer"},this._transportReady||await this._setupTransport({localDtlsRole:"client",localSdpObject:l}),console.log("receive() | calling pc.setLocalDescription() [answer:%o]",d),await this._pc.setLocalDescription(d);let h=this._pc.getRemoteStreams().find(u=>u.id===i).getTrackById(s);if(!h)throw new Error("remote track not found");return this._mapRecvLocalIdInfo.set(s,{mid:a,rtpParameters:r}),{localId:s,track:h}}async stopReceiving(e){this._assertRecvDirection(),console.log("stopReceiving() [localId:%s]",e);let t=this._mapRecvLocalIdInfo.get(e);if(t===void 0)throw new Error("localInfo is undefined");let{mid:r,rtpParameters:s}=t;this._mapRecvLocalIdInfo.delete(e),this._remoteSdp.planBStopReceiving({mid:r,offerRtpParameters:s});let a={sdp:this._remoteSdp.getSdp(),type:"offer"};console.log("stopReceiving() | calling pc.setRemoteDescription() [offer:%o]",a),await this._pc.setRemoteDescription(a);let i=await this._pc.createAnswer();console.log("stopReceiving() | calling pc.setLocalDescription() [answer:%o]",i),await this._pc.setLocalDescription(i);}async getReceiverStats(e){throw new y("not implemented")}async receiveDataChannel({sctpStreamParameters:e,label:t,protocol:r}){this._assertRecvDirection();let{streamId:s,ordered:a,maxPacketLifeTime:i,maxRetransmits:c}=e,d={id:s,maxPacketLifeTime:i,maxRetransmitTime:i,maxRetransmits:c,negotiated:true,ordered:a,protocol:r};console.log("receiveDataChannel() [options:%o]",d);let l=this._pc.createDataChannel(t,d);if(!this._hasDataChannelMediaSection){this._remoteSdp.receiveSctpAssociation({oldDataChannelSpec:true});let p={sdp:this._remoteSdp.getSdp(),type:"offer"};console.log("receiveDataChannel() | calling pc.setRemoteDescription() [offer:%o]",p),await this._pc.setRemoteDescription(p);let m=await this._pc.createAnswer();if(!this._transportReady){let h=j__namespace.parse(m.sdp);await this._setupTransport({localDtlsRole:"client",localSdpObject:h});}console.log("receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]",m),await this._pc.setLocalDescription(m),this._hasDataChannelMediaSection=true;}return {dataChannel:l}}async _setupTransport({localDtlsRole:e,localSdpObject:t}){t||(t=j__namespace.parse(this._pc.localDescription.sdp));let r=x({sdpObject:t});r.role=e,this._remoteSdp.updateDtlsRole(e==="client"?"server":"client"),await this.safeEmitAsPromise("@connect",{dtlsParameters:r}),this._transportReady=true;}_assertSendDirection(){if(this._direction!=="send")throw new Error('method can just be called for handlers with "send" direction')}_assertRecvDirection(){if(this._direction!=="recv")throw new Error('method can just be called for handlers with "recv" direction')}};function ht(){if(typeof navigator=="object"&&navigator.product==="ReactNative"){if(typeof RTCPeerConnection=="undefined"){console.log("this._detectDevice() | unsupported ReactNative without RTCPeerConnection");return}return console.log("this._detectDevice() | ReactNative handler chosen"),"ReactNative"}else if(typeof navigator=="object"&&typeof navigator.userAgent=="string"){let o=navigator.userAgent,n=Ut__default.default.getParser(o),e=n.getEngine();if(n.satisfies({chrome:">=74",chromium:">=74"}))return "Chrome74";if(n.satisfies({chrome:">=70",chromium:">=70"}))return "Chrome70";if(n.satisfies({chrome:">=67",chromium:">=67"}))return "Chrome67";if(n.satisfies({chrome:">=55",chromium:">=55"}))return "Chrome55";if(n.satisfies({firefox:">=60"}))return "Firefox60";if(n.satisfies({safari:">=12.0"})&&typeof RTCRtpTransceiver!="undefined"&&RTCRtpTransceiver.prototype.hasOwnProperty("currentDirection"))return "Safari12";if(n.satisfies({safari:">=11"}))return "Safari11";if(n.satisfies({"microsoft edge":">=11"})&&n.satisfies({"microsoft edge":"<=18"}))return "Edge11";if(e.name&&e.name.toLowerCase()==="blink"){let t=o.match(/(?:(?:Chrome|Chromium))[ /](\w+)/i);if(t){let r=Number(t[1]);return r>=74?"Chrome74":r>=70?"Chrome70":r>=67?"Chrome67":"Chrome55"}return "Chrome74"}console.log("this._detectDevice() | browser not supported [name:%s, version:%s]",n.getBrowserName(),n.getBrowserVersion());return}console.log("this._detectDevice() | unknown device");}var ue=class{constructor({handlerName:n,handlerFactory:e,Handler:t}={}){this._loaded=false;if(console.log("constructor()"),t)if(console.log("constructor() | Handler option is DEPRECATED, use handlerName or handlerFactory instead"),typeof t=="string")n=t;else throw new TypeError("non string Handler option no longer supported, use handlerFactory instead");if(n&&e)throw new TypeError("just one of handlerName or handlerInterface can be given");if(e)this._handlerFactory=e;else {if(n)console.log("constructor() | handler given: %s",n);else if(n=ht(),n)console.log("constructor() | detected handler: %s",n);else throw new y("device not supported");switch(n){case "Chrome74":this._handlerFactory=Ee.createFactory();break;case "Chrome70":this._handlerFactory=Le.createFactory();break;case "Chrome67":this._handlerFactory=Me.createFactory();break;case "Chrome55":this._handlerFactory=Oe.createFactory();break;case "Firefox60":this._handlerFactory=Ae.createFactory();break;case "Safari12":this._handlerFactory=je.createFactory();break;case "Safari11":this._handlerFactory=Ne.createFactory();break;case "Edge11":this._handlerFactory=Be.createFactory();break;case "ReactNative":this._handlerFactory=He.createFactory();break;default:throw new TypeError(`unknown handlerName "${n}"`)}}let r=this._handlerFactory();this._handlerName=r.name,r.close(),this._extendedRtpCapabilities=null,this._recvRtpCapabilities=void 0,this._canProduceByKind={audio:false,video:false},this._sctpCapabilities=null;}get handlerName(){return this._handlerName}get loaded(){return this._loaded}get rtpCapabilities(){if(!this._loaded)throw new w("not loaded");return this._recvRtpCapabilities}get sctpCapabilities(){if(!this._loaded)throw new w("not loaded");return this._sctpCapabilities}async load({routerRtpCapabilities:n}={}){console.log("load() [routerRtpCapabilities:%o]",n);let e;try{if(this._loaded)throw new w("already loaded");if(!n)throw new TypeError("missing routerRtpCapabilities");Se(n),e=this._handlerFactory();let t=await e.getNativeRtpCapabilities();console.log("load() | got native RTP capabilities:%o",t),Se(t),this._extendedRtpCapabilities=Xe(t,n),console.log("load() | got extended RTP capabilities:%o",this._extendedRtpCapabilities),this._canProduceByKind.audio=Ue("audio",this._extendedRtpCapabilities),this._canProduceByKind.video=Ue("video",this._extendedRtpCapabilities),this._recvRtpCapabilities=Ze(this._extendedRtpCapabilities),Se(this._recvRtpCapabilities),console.log("load() | got receiving RTP capabilities:%o",this._recvRtpCapabilities),this._sctpCapabilities=await e.getNativeSctpCapabilities(),console.log("load() | got native SCTP capabilities:%o",this._sctpCapabilities),Je(this._sctpCapabilities),console.log("load() succeeded"),this._loaded=!0,e.close();}catch(t){throw e&&e.close(),t}}canProduce(n){if(this._loaded){if(n!=="audio"&&n!=="video")throw new TypeError(`invalid kind "${n}"`)}else throw new w("not loaded");return this._canProduceByKind[n]}createSendTransport({id:n,iceParameters:e,iceCandidates:t,dtlsParameters:r,sctpParameters:s,iceServers:a,iceTransportPolicy:i,additionalSettings:c,proprietaryConstraints:d,appData:l={}}){return console.log("[Device] createSendTransport()"),this._createTransport({additionalSettings:c,appData:l,direction:"send",dtlsParameters:r,iceCandidates:t,iceParameters:e,iceServers:a,iceTransportPolicy:i,id:n,proprietaryConstraints:d,sctpParameters:s})}createRecvTransport({id:n,iceParameters:e,iceCandidates:t,dtlsParameters:r,sctpParameters:s,iceServers:a,iceTransportPolicy:i,additionalSettings:c,proprietaryConstraints:d,appData:l={}}){return console.log("createRecvTransport()"),this._createTransport({additionalSettings:c,appData:l,direction:"recv",dtlsParameters:r,iceCandidates:t,iceParameters:e,iceServers:a,iceTransportPolicy:i,id:n,proprietaryConstraints:d,sctpParameters:s})}_createTransport({direction:n,id:e,iceParameters:t,iceCandidates:r,dtlsParameters:s,sctpParameters:a,iceServers:i,iceTransportPolicy:c,additionalSettings:d,proprietaryConstraints:l,appData:p={}}){if(this._loaded){if(typeof e!="string")throw new TypeError("missing id");if(typeof t!="object")throw new TypeError("missing iceParameters");if(Array.isArray(r)){if(typeof s!="object")throw new TypeError("missing dtlsParameters");if(a&&typeof a!="object")throw new TypeError("wrong sctpParameters");if(p&&typeof p!="object")throw new TypeError("if given, appData must be an object")}else throw new TypeError("missing iceCandidates")}else throw new w("not loaded");return console.log("[Device] _createTransport"),new De({additionalSettings:d,appData:p,canProduceByKind:this._canProduceByKind,direction:n,dtlsParameters:s,extendedRtpCapabilities:this._extendedRtpCapabilities,handlerFactory:this._handlerFactory,iceCandidates:r,iceParameters:t,iceServers:i,iceTransportPolicy:c,id:e,proprietaryConstraints:l,sctpParameters:a})}};var Wt="mediasoup-demo.user",Kt="mediasoup-demo.devices";function ft({displayName:o}){ut__default.default.set(Wt,{displayName:o});}function _t(){return ut__default.default.getJSON(Kt)}function We(){let o=navigator.userAgent,n=Ut__default.default.getParser(o),e;return n.satisfies({chrome:">=0",chromium:">=0"})?e="chrome":n.satisfies({firefox:">=0"})?e="firefox":n.satisfies({safari:">=0"})?e="safari":n.satisfies({opera:">=0"})?e="opera":n.satisfies({"microsoft edge":">=0"})?e="edge":e="unknown",{flag:e,name:n.getBrowserName(),version:n.getBrowserVersion()}}var fe=class{constructor(n){this.context=n,this.instant=0,this.script=n.createScriptProcessor(2048,1,1);let e=this;this.script.onaudioprocess=function(t){let r=t.inputBuffer.getChannelData(0),s,a=0,i=0;for(s=0;s<r.length;++s)a+=r[s]*r[s],Math.abs(r[s])>.99&&(i+=1);e.instant=Math.sqrt(a/r.length);};}connectToSource(n){this.mic=this.context.createMediaStreamSource(n),this.mic.connect(this.script),this.script.connect(this.context.destination);}stop(){this.mic.disconnect(),this.script.disconnect();}};var Qt={optional:[{googDscp:true}]},G=class extends I{constructor(){super();this._webcam={device:null,resolution:"qvga"};this._encoderParam={enableAdjustRes:true,maxVideoBitrate:500,minVideoBitrate:200,resMode:0,videoFps:24,videoResolution:9};this._camDeviceList=[];this._micDeviceList=[];this._speakerDeviceList=[];this._audioLevelMap=new Map;this._averageRemoteVideoStats={framesPerSecond:0,jitter:0,jitterBufferDelay:0,packetBitrate:0,packetsLostRatio:0};this._averageRemoteAudioStats={jitter:0,jitterBufferDelay:0,packetBitrate:0,packetsLostRatio:0};this._averageRemoteShareStats={framesPerSecond:0,jitter:0,jitterBufferDelay:0,packetBitrate:0,packetsLostRatio:0};this._localVideoStats={framesPerSecond:0,jitter:0,jitterBufferDelay:0,packetBitrate:0,packetsLostRatio:0};this._localAudioStats={jitter:0,jitterBufferDelay:0,packetBitrate:0,packetsLostRatio:0};this._localShareStats={framesPerSecond:0,jitter:0,jitterBufferDelay:0,packetBitrate:0,packetsLostRatio:0};this._closed=false,this._device=We(),this._forceTcp=false,this._forceH264=true,this._useDataChannel=false,this._handlerName="",this._useSimulcast=false,this._useSharingSimulcast=false,this._protooUrl="",this._protoo=null,this._mediasoupDevice=null,this._sendTransport=null,this._micProducer=null,this._webcamProducer=null,this._shareProducer=null,this._chatDataProducer=null,this._botDataProducer=null,this._peers=new Map,this._recvTransports=new Map,this._needConsumes=new Map,this._consumers=new Map,this._dataConsumers=new Map,this._webcams=new Map,this._roomInfo=null,this._audioVolumn=0,this._audioPlayoutVolumn=0,this._remoteVideoDoms=new Map,this._audioStartWithMute=false,this._audioLocalMute=false,this._voiceTimeout=null,this._audioProfile=0,this._audioLevelMap=new Map;}async close(){this._closed||(this.cleanStatus(),this._closed=true,await this.safeRequest("leave"),this._protoo.close());}async exitRoom(e=false){this._closed||(this.cleanStatus(),this._closed=true,e||await this.safeRequest("leave"),this._protoo.close());}async cleanStatus(){this._closed=false,this._device=We(),this._forceTcp=false,this._forceH264=true,this._useSimulcast=false,this._useSharingSimulcast=false,this._mediasoupDevice=null,this._micProducer=null,this._webcamProducer=null,this._shareProducer=null,this._peers=new Map,this._audioLevelMap=new Map,this._needConsumes=new Map,this._consumers=new Map,this._webcams=new Map,this._audioVolumn=0,this._audioPlayoutVolumn=0,this._remoteVideoDoms=new Map,this._audioLevelQueryInterval&&(clearInterval(this._audioLevelQueryInterval),this._audioLevelQueryInterval=null),this._voiceTimeout&&(clearTimeout(this._voiceTimeout),this._voiceTimeout=null),this._sendTransport&&(this._sendTransport.close(),this._sendTransport=null);for(let e of this._recvTransports.values())e.close();this._recvTransports=new Map;}async safeRequest(e,t=void 0){try{await this._protoo.request(e,t);}catch(r){console.log(`request failed due to: ${r}`);}}setVideoEncoderParam(e){this._encoderParam=e;}setAudioProfile(e){this._audioProfile=e;}async enterRoom(e){if(e.roomId===null||e.userId===null||e.userId===""||e.serverUrl===null){this.safeEmit("error",{code:-3316});return}if(e.maxRetryTime==null&&(e.maxRetryTime=900*1e3),e.userId.length<4){this.safeEmit("error",{code:-3319});return}if(e.roomId.length<4){this.safeEmit("error",{code:-3318});return}e.xConferenceToken=e.xConferenceToken?e.xConferenceToken:"1234567890",e.avatarUrl=e.avatarUrl?e.avatarUrl:"",e.acceptLanguage=e.acceptLanguage?e.acceptLanguage:"zh-CN",this._roomInfo=e,this._protooUrl=`${e.serverUrl}?roomId=${e.roomId}&peerId=${e.userId}&forceH264=false&forceVP9=false`;let t=new se(this._protooUrl,{clientConfig:{keepalive:true,keepaliveInterval:30*1e3},maxRetryTime:e.maxRetryTime});this._protoo=new de(t),this.enableDevicesMonitor(),this._protoo.on("open",async()=>{this.reportLog("[RoomClient] websocket connected!"),this.cleanStatus();try{await this._enterRoom();}catch{console.log("enter room failed");}}),this._protoo.on("failed",()=>{this.safeEmit("error","WebSocket connection failed");}),this._protoo.on("error",()=>{}),this._protoo.on("disconnected",()=>{this.safeEmit("connectionLost","WebSocket disconnected"),this.safeEmit("connectionLost","room closed");}),this._protoo.on("close",()=>{if(this.reportLog("[RoomClient] protoo on close!"),this._closed){this.safeEmit("exitRoom",{reason:4});return}this.close(),this.safeEmit("connectionLost");}),this._protoo.on("connectionTimeOut",()=>{this.reportLog("[RoomClient] protoo connectionTimeOut!"),this.safeEmit("connectionTimeOut");}),this._protoo.on("request",async(r,s,a)=>{switch(r.method){case "heartBeat":{this.reportLog("[RoomClient] heartBeat"),s();break}}}),this._protoo.on("notification",r=>{switch(r.method){case "producerCreated":{let{peerId:s,producerId:a,kind:i,paused:c,appData:d}=r.data;this._needConsumes.set(a,{appData:d,kind:i,peerId:s,producerId:a}),c||(d.share!==void 0?this.safeEmit("userShareAvailable",{available:true,userId:s}):i==="audio"&&this._audioLevelMap.set(s,0),this.safeEmit(i==="video"?"userVideoAvailable":"userAudioAvailable",{available:true,userId:s}));break}case "newPeerJoined":{let{peerId:s,displayName:a,device:i,timeMs:c,avatarUrl:d}=r.data;this._peers.set(s,r.data);for(let l of this._needConsumes.values())s===l.peerId&&this._needConsumes.delete(l.producerId);for(let l of this._consumers.values())s===l.appData.peerId&&this._consumers.delete(l.id);this.safeEmit("remoteUserEnterRoom",{avatarUrl:d,timeMs:c,userDevice:i,userId:s,userName:a});break}case "peerLeft":{let{peerId:s}=r.data;this._peers.delete(s);for(let a of this._needConsumes.values())s===a.peerId&&this._needConsumes.delete(a.producerId);for(let a of this._consumers.values())s===a.appData.peerId&&this._consumers.delete(a.id);this.safeEmit("remoteUserLeaveRoom",{userId:s});break}case "producerScore":{let{score:s}=r.data,a=2;if(s===0?a=6:s>0&&s<=2?a=5:s>2&&s<=4?a=4:s>4&&s<=6?a=3:s>6&&s<=9?a=2:s===10&&(a=1),!this._roomInfo)return;let i={quality:a,userId:this._roomInfo.userId};this.safeEmit("networkQuality",i);break}case "displayNameChanged":{let{peerId:s,displayName:a,oldDisplayName:i}=r.data;this.safeEmit("displayNameChanged",{displayName:a,oldDisplayName:i,peerId:s});break}case "consumerClosed":{let{peerId:s,producerId:a,consumerId:i}=r.data;this._needConsumes.delete(a);let c=this._consumers.get(i);if(!c)break;c.close(),this._consumers.delete(i),this._remoteVideoDoms.delete(s),c.appData.share!==void 0?(this.reportLog("[RoomClient] userShareAvailable false"),this.safeEmit("userShareAvailable",{available:false,paused:false,userId:s})):this.safeEmit(c.kind==="video"?"userVideoAvailable":"userAudioAvailable",{available:false,userId:s});break}case "consumerPaused":{let{consumerId:s,peerId:a,appData:i,kind:c,producerId:d}=r.data,l=this._consumers.get(s);l||c==="audio"||l!==void 0&&"pause"in l&&l.pause(),i!==void 0&&i.share!==void 0?this.safeEmit("userShareAvailable",{available:true,paused:true,userId:a}):this.safeEmit(c==="video"?"userVideoAvailable":"userAudioAvailable",{appData:i,available:false,producerId:d,userId:a});break}case "consumerResumed":{let{peerId:s,consumerId:a,appData:i,kind:c,producerId:d}=r.data;this._needConsumes.set(d,{appData:i,kind:c,peerId:s,producerId:d});let l=this._consumers.get(a);l&&l.resume(),i!==void 0&&i.share!==void 0?this.safeEmit("userShareAvailable",{available:true,userId:s}):this.safeEmit(c==="video"?"userVideoAvailable":"userAudioAvailable",{available:true,userId:s});break}case "consumerLayersChanged":break;case "consumerScore":break;case "activeSpeaker":break;case "rtcControlNotify":{this.safeEmit("customCommand",r.data);break}case "peerKicked":{let{peerId:s}=r.data;if(!this._roomInfo)return;this._roomInfo.userId===s?this.safeEmit("exitRoom",{reason:1}):this.safeEmit("remoteUserLeaveRoom",{reason:2,userId:s});break}case "roomDestroyed":{let{reason:s}=r.data;console.log(`[RoomClient] roomDestroyed reason=${s}`);let a=s==="forceEndConference";this.safeEmit("exitRoom",{reason:a?3:2});break}case "customCmdMsg":{let{peerId:s,cmdId:a,seq:i,data:c}=r.data;a===999?this.safeEmit("recvRoomTextMsg",{message:c,peerId:s}):a>1e3&&a<=1100?this.safeEmit("recvRoomCustomMsg",{cmd:a-1e3,message:c,peerId:s}):this.safeEmit("recvCustomCmdMsg",{cmdId:a,data:c,peerId:s,seq:i});break}}});}async startLocalPreview(e){await this._createSendTransport();let t=_t();(!t||t.webcamEnabled)&&await this.enableWebcam(e);}async stopLocalPreview(){this.disableWebcam();}async muteLocalVideo(e){if(this._webcamProducer&&this._sendTransport)if(e){this._webcamProducer.pause();try{await this._protoo.request("pauseProducer",{producerId:this._webcamProducer.id,transportId:this._sendTransport.id,transportType:"webrtc"});}catch(t){this.reportLog(`[RoomClient] muteLocalVideo failed:${t}`);}}else {this._webcamProducer.resume();try{await this._protoo.request("resumeProducer",{producerId:this._webcamProducer.id,transportId:this._sendTransport.id,transportType:"webrtc"});}catch(t){this.reportLog(`[RoomClient] unMuteLocalVideo failed:${t}`);}}}async startLocalAudio(e){await this._createSendTransport(),this._audioStartWithMute=e,this._audioLocalMute=e,this.enableMic(e);}async stopLocalAudio(){this.disableMic();}async muteLocalAudio(e){if(!this._micProducer){await this.startLocalAudio(e);return}if(this._sendTransport){if(e){this._micProducer.pause();try{await this._protoo.request("pauseProducer",{producerId:this._micProducer.id,transportId:this._sendTransport.id,transportType:"webrtc"});}catch(t){this.reportLog(`muteMic() | failed: ${t}`);}}else {this._micProducer.resume();try{await this._protoo.request("resumeProducer",{producerId:this._micProducer.id,transportId:this._sendTransport.id,transportType:"webrtc"});}catch(t){this.reportLog(`unmuteMic() | failed: ${t}`);}}this._audioLocalMute=e;}}async startRemoteVideo(e,t){let r=null;for(let a of this._consumers.values())if(e===a.appData.peerId&&a.kind==="video"&&a.appData.share===void 0){r=a;break}if(r){if(await this._resumeConsumer(r),t){let a=new MediaStream;a.addTrack(r.track),this._remoteVideoDoms.set(e,t),t.srcObject=a,t.play().catch(i=>this.reportLog(`videoElem.play() failed: ${i}`));}return}let s=null;for(let a of this._needConsumes.values())if(e===a.peerId&&a.kind==="video"&&a.appData.share===void 0){s=a;break}if(s){let a=await this._createRecvTransport(s.producerId);if(!this._mediasoupDevice)return;let i=await this._protoo.request("consume",{appData:{peerId:e},producerId:s.producerId,rtpCapabilities:this._mediasoupDevice.rtpCapabilities,transportId:a,transportType:"webrtc"}),{id:c,producerId:d,kind:l,rtpParameters:p,type:m}=i;try{let h=this._recvTransports.get(a);if(!h)return;let u=await h.consume({appData:{...s.appData,peerId:e},id:c,kind:"video",producerId:d,recvTransportId:a,rtpParameters:p});if(this._consumers.set(u.id,u),u.on("transportclose",()=>{this._consumers.delete(u.id);}),await this._resumeConsumer(u),t){let f=new MediaStream;f.addTrack(u.track),this._remoteVideoDoms.set(e,t),t.srcObject=f,t.play().catch(g=>this.reportLog(`videoElem.play() failed: ${g}`));}}catch(h){throw this.reportLog(`"newConsumer" request failed: ${h}`),h}}}async stopRemoteVideo(e){let t=null;for(let r of this._consumers.values())if(e===r.appData.peerId&&r.kind==="video"&&r.appData.share===void 0){t=r;break}t&&(t.close(),this._consumers.delete(t.id));}async stopRemoteAudio(e){let t=null;for(let r of this._consumers.values())if(e===r.appData.peerId&&r.kind==="audio"){t=r;break}t&&(t.close(),this._consumers.delete(t.id));}async stopAllRemoteViews(){for(let e of this._consumers.values())await this._protoo.request("closeConsumer",{appData:{},consumerId:e.id,producerId:e.producerId,transportId:e.recvTransportId,transportType:"webrtc"});}async startRemoteAudio(e,t){let r=null;for(let a of this._consumers.values())if(e===a.appData.peerId&&a.kind==="audio"){r=a;break}if(r){await this._resumeConsumer(r);let a=new MediaStream;a.addTrack(r.track),t.srcObject=a,t.play().catch(i=>this.reportLog(`audioElem.play() failed: ${i}`));return}let s=null;for(let a of this._needConsumes.values())if(e===a.peerId&&a.kind==="audio"){s=a;break}if(s){let a=await this._createRecvTransport(s.producerId);if(!this._mediasoupDevice)return;let i=await this._protoo.request("consume",{appData:{peerId:e,share:false},paused:true,producerId:s.producerId,rtpCapabilities:this._mediasoupDevice.rtpCapabilities,transportId:a,transportType:"webrtc"}),{id:c,producerId:d,kind:l,rtpParameters:p}=i;try{let m=this._recvTransports.get(a);if(!m)return;let h=await m.consume({appData:{...s.appData,peerId:e},id:c,kind:l,producerId:d,recvTransportId:a,rtpParameters:p});this._consumers.set(h.id,h),h.on("transportclose",()=>{this._consumers.delete(h.id);});let u=new MediaStream;u.addTrack(h.track),t.srcObject=u,t.play().catch(f=>this.reportLog(`audioElem.play() failed: ${f}`)),await this._protoo.request("resumeConsumer",{consumerId:h.id,producerId:s.producerId,transportId:a,transportType:"webrtc"});}catch(m){throw this.reportLog(`"newConsumer" request failed:${m}`),m}}}async muteRemoteVideo(e,t){let r=null;for(let s of this._consumers.values())if(e===s.appData.peerId&&s.kind==="video"&&s.appData.share===void 0){r=s;break}r&&(t?await this._pauseConsumer(r):await this._resumeConsumer(r));}async muteAllRemoteViews(e){await this._protoo.request(e?"unViewAll":"viewAll",{});}async muteAllRemoteAudios(e){await this._protoo.request(e?"muteAll":"unMuteAll",{});}async muteRemoteAudio(e,t){let r=null;for(let s of this._consumers.values())if(e===s.appData.peerId&&s.kind==="audio"){r=s;break}r&&(t?await this._pauseConsumer(r):await this._resumeConsumer(r));}enableEncSmallVideoStream(e){return e?(this._useSimulcast=true,this.getResolutionInfo(this._encoderParam.videoResolution).canScaleDown?0:-1):(this._useSimulcast=false,-1)}async setRemoteVideoStreamType(e,t){let r=null;for(let s of this._consumers.values())if(e===s.appData.peerId&&s.kind==="video"&&s.appData.share===void 0){r=s;break}if(r)try{let s={consumerId:r.id,preferredLayers:{spatialLayer:t===1?0:1},producerId:r.producerId,transportId:r.recvTransportId,transportType:"webrtc"};this.reportLog(`[RoomClient] layerInfo=${JSON.stringify(s)}`);let a=await this._protoo.request("setPreferredLayers",{consumerId:r.id,preferredLayers:{spatialLayer:t===1?0:1},producerId:r.producerId,transportId:r.recvTransportId,transportType:"webrtc"});this.reportLog(`setRemoteVideoStreamTypeResult=${a}`);}catch(s){this.reportLog(`setConsumerPreferredLayers() | failed:${s}`);}}async startScreenCapture(e){this.enableShare(e);}async startScreenCaptureForElectron(e){if(this._shareProducer||!this._mediasoupDevice||!this._mediasoupDevice.canProduce("video"))return;let t=e.getVideoTracks()[0],r,s={videoGoogleStartBitrate:1e3};if(this._mediasoupDevice.rtpCapabilities===void 0||this._mediasoupDevice.rtpCapabilities.codecs===void 0)return;if(this._forceH264&&(r=this._mediasoupDevice.rtpCapabilities.codecs.find(i=>i.mimeType.toLowerCase()==="video/h264"),!r))throw new Error("desired H264 codec+configuration is not supported");let a=[{maxBitrate:this._encoderParam.maxVideoBitrate*1e3}];this._sendTransport&&this._roomInfo&&(this._shareProducer=await this._sendTransport.produce({appData:{peerId:this._roomInfo.userId,peerName:this._roomInfo.userName,share:true},codec:r,codecOptions:s,encodings:a,track:t}),this.safeEmit("screenCaptureStarted"),this._shareProducer.on("transportclose",()=>{this._shareProducer=null;}),this._shareProducer.on("trackended",async()=>{await this.disableShare().catch(()=>{});}));}async stopScreenCapture(){await this.disableShare();}async stopScreenCaptureForElectron(){await this.disableShare();}async pauseScreenCapture(){if(this._shareProducer){this._shareProducer.pause();try{await this._protoo.request("pauseProducer",{producerId:this._shareProducer.id});}catch(e){this.reportLog(`[RoomClient] pauseScreenCapture() | failed: ${e}`);}this.safeEmit("screenCapturePaused");}}async resumeScreenCapture(){if(this.reportLog("resumeScreenCapture()"),!!this._shareProducer&&this._sendTransport){this._shareProducer.resume();try{await this._protoo.request("resumeProducer",{producerId:this._shareProducer.id,transportId:this._sendTransport.id,transportType:"webrtc"});}catch(e){this.reportLog(`[RoomClient] resumeScreenCapture() | failed: ${e}`);}this.safeEmit("screenCaptureResumed");}}async startRemoteShare(e,t){if(!this._mediasoupDevice)return;let r=null;for(let a of this._consumers.values())if(e===a.appData.peerId&&a.kind==="video"&&a.appData.share!==void 0){r=a;break}if(r){await this._resumeConsumer(r);let a=new MediaStream;a.addTrack(r.track),this._remoteVideoDoms.set(e,t),t.srcObject=a,t.play().catch(i=>this.reportLog(`videoElem.play() failed: ${i}`));return}let s=null;for(let a of this._needConsumes.values())if(e===a.peerId&&a.kind==="video"&&a.appData.share!==void 0){s=a;break}if(s){let a=s.peerId,i=await this._createRecvTransport(s.producerId),c=await this._protoo.request("consume",{appData:{...s.appData,peerId:a},producerId:s.producerId,rtpCapabilities:this._mediasoupDevice.rtpCapabilities,transportId:i,transportType:"webrtc"}),{id:d,producerId:l,kind:p,producerPaused:m,rtpParameters:h,type:u}=c;try{let f=this._recvTransports.get(i);if(!f)return;let g=await f.consume({appData:{...s.appData,peerId:e},id:d,kind:p,producerId:l,recvTransportId:i,rtpParameters:h});this._consumers.set(g.id,g),g.on("transportclose",()=>{this._consumers.delete(g.id);}),m&&await this._protoo.request("resumeConsumer",{consumerId:g.id,producerId:s.producerId,transportId:i,transportType:"webrtc"});let R=new MediaStream;R.addTrack(g.track),t.srcObject=null,t.srcObject=R,t.play().catch(S=>this.reportLog(`videoElem.play() failed: ${S}`));}catch(f){throw this.reportLog(`"newConsumer" request failed: ${f}`),f}}}async stopRemoteShare(e){let t=null;for(let r of this._consumers.values())if(e===r.appData.peerId&&r.kind==="video"&&r.appData.share!==void 0){t=r;break}t&&(t.close(),this._consumers.delete(t.id));}async getCameraDeviceList(){let e=await navigator.mediaDevices.enumerateDevices(),t=[];for(let r=0;r!==e.length;++r){let s=e[r];if(s.kind==="videoinput"){let a={deviceId:s.deviceId,deviceName:s.label||`camera ${r+1}`,type:3};t.push(a);}}return t.length===0&&this.safeEmit("warning",{code:1111}),t}async getCurrentCameraDevice(){return this._webcam.device.deviceId}async setCurrentCameraDevice(e){try{this._webcam.resolution="hd",this._webcamProducer.track.stop(),this.reportLog("changeWebcam() | calling getUserMedia()");let t=this.getResolutionInfo(this._encoderParam.videoResolution),r=this._encoderParam.videoFps,a=(await navigator.mediaDevices.getUserMedia({video:{deviceId:{ideal:e},frameRate:r,height:{ideal:t.resHeight},width:{ideal:t.resWidth}}})).getVideoTracks()[0];await this._webcamProducer.replaceTrack({track:a});}catch(t){this.reportLog(`changeWebcam() | failed: ${t}`);}}async getMicDevicesList(){let e=await navigator.mediaDevices.enumerateDevices(),t=[];for(let r=0;r!==e.length;++r){let s=e[r];if(s.kind==="audioinput"&&s.deviceId!=="communications"&&s.deviceId!=="default"){let a={deviceId:s.deviceId,deviceName:s.label||`microphone ${r+1}`,type:1};t.push(a);}}return this.reportLog(`[RoomClient] getMicDeviceList:${JSON.stringify(t)}`),t.length===0&&this.safeEmit("warning",{code:1201}),t}async setCurrentMic(e){this._micProducer.track.stop();try{this.reportLog("enableMic() | calling getUserMedia()");let t={audio:{deviceId:e?{exact:e}:void 0}},s=(await navigator.mediaDevices.getUserMedia(t)).getAudioTracks()[0];await this._micProducer.replaceTrack({track:s});}catch(t){this.reportLog(`setCurrentMic() | failed: ${t}`);}}async getSpeakerDevicesList(){let e=await navigator.mediaDevices.enumerateDevices(),t=[];for(let r=0;r!==e.length;++r){let s=e[r];if(s.kind==="audiooutput"&&s.deviceId!=="communications"&&s.deviceId!=="default"){let a={deviceId:s.deviceId,deviceName:s.label||`speaker ${r+1}`,type:2};t.push(a);}}return this.reportLog(`[RoomClient] getSpeakerDeviceList:${JSON.stringify(t)}`),t}async setCurrentSpeaker(e,t=[]){for(let r of t)typeof r.sinkId!="undefined"?r.setSinkId(e).then(()=>{}).catch(s=>{let a=s;s.name==="SecurityError"&&(a=`You need to use HTTPS for selecting audio output device: ${s}`),console.error(a);}):console.warn("Browser does not support output device selection.");}async getLocalUserAudioStats(){return this._micProducer?this._micProducer.getStats():null}async getLocalUserVideoStats(){return this._webcamProducer?this._webcamProducer.getStats():null}async getLocalUserShareStats(){return this._shareProducer?this._shareProducer.getStats():null}async getRemoteUserAudioStats(e){let t=null;for(let r of this._consumers.values())if(e===r.appData.peerId&&r.kind==="audio"){t=r;break}return t?t.getStats():null}async getRemoteUserVideoStats(e){let t=null;for(let r of this._consumers.values())if(e===r.appData.peerId&&r.kind==="video"&&r.appData.share===void 0){t=r;break}return t?t.getStats():null}async getRemoteUserShareStats(e){let t=null;for(let r of this._consumers.values())if(e===r.appData.peerId&&r.kind==="video"&&r.appData.share!==void 0){t=r;break}return t?t.getStats():null}async onFlyBandWidth(){let e=this._webcamProducer.rtpSender.getParameters();e.encodings[0].maxBitrate=125*1e3,this._webcamProducer.rtpSender.setParameters(e);}getAudioCaptureVolume(){return this._audioVolumn}setAudioCaptureVolume(e){e<0||e>100||(this._audioVolumn=e);}getAudioPlayoutVolume(){return this._audioPlayoutVolumn}setAudioPlayoutVolume(e,t){e.forEach(r=>{r.volume=.01*t;});}setRemoteViewFillMode(e,t){let r=this._remoteVideoDoms.get(e);r&&(r.style["object-fit"]=t===0?"fill":"contain");}getSDKVersion(){return "0.5.0.0"}async _createSendTransport(){if(!this._sendTransport){this.reportLog("[RoomClient] createWebRtcTransport");let e=await this._protoo.request("createWebRtcTransport",{appData:{consuming:false,producing:true},direction:"sendonly",forceTcp:this._forceTcp,workerId:0}),{id:t,iceParameters:r,iceCandidates:s,dtlsParameters:a,sctpParameters:i}=e;this._sendTransport=this._mediasoupDevice.createSendTransport({dtlsParameters:a,iceCandidates:s,iceParameters:r,iceServers:[],id:t,proprietaryConstraints:Qt,sctpParameters:i}),this._sendTransport.on("connect",({dtlsParameters:c},d,l)=>{this._protoo.request("connectWebRtcTransport",{transportId:this._sendTransport.id,dtlsParameters:c}).then(d).catch(l);}),this._sendTransport.on("produce",async({kind:c,rtpParameters:d,appData:l},p,m)=>{try{let h=this.getResolutionInfo(this._encoderParam.videoResolution),{id:u}=await this._protoo.request("produce",{appData:l,kind:c,paused:c==="audio"?this._audioStartWithMute:!1,rtpParameters:d,transportId:this._sendTransport.id,videoWidth:h.resWidth,videoHeight:h.resHeight});p({id:u});}catch(h){m(h);}}),this._sendTransport.on("connectionstatechange",c=>{if(this.reportLog(`[RoomClient] _sendTransport on connectionstatechange=${c}`),c==="disconnected"){let d=this,l=Ge__namespace.operation({factor:2,maxTimeout:2*1e3,minTimeout:1*1e3,retries:3});l.attempt(p=>{if(!d._sendTransport){l.stop();return}if(d._sendTransport.closed){l.stop();return}if(d._sendTransport.connectionState!=="connected"){if(this.reportLog(`[RoomClient] Attempt restart sendTransport failed for ${p}`),d.restartIce(),l.retry())return}else {this.reportLog(`[RoomClient] restartIce success after ${p} retry times`),l.stop();return}});}});}}async _createRecvTransport(e){let t=await this._protoo.request("createWebRtcTransport",{appData:{consuming:true,producerId:e,producing:false},direction:"recvonly",forceTcp:this._forceTcp,workerId:0}),{id:r,iceParameters:s,iceCandidates:a,dtlsParameters:i,sctpParameters:c}=t,d=this;return new Promise(function(p,m){let h=false;if(d._recvTransports.forEach(function(u,f,g){r===u.id&&(h=true);}),h)d.reportLog("[RoomClient] recvTransport already Exist"),p(r);else {d.reportLog("[RoomClient] recvTransport not Exist,creating...");let u=d._mediasoupDevice.createRecvTransport({dtlsParameters:i,iceCandidates:a,iceParameters:s,iceServers:[],id:r,sctpParameters:c});u.on("connect",({dtlsParameters:f},g,R)=>{d._protoo.request("connectWebRtcTransport",{dtlsParameters:f,transportId:u.id}).then(g).catch(R);}),d._recvTransports.set(r,u),p(r);}})}async enableMic(e){if(this.reportLog("[RoomClient] enableMic()"),this._micProducer)return;if(!this._mediasoupDevice.canProduce("audio")){this.reportLog("[RoomClient] enableMic() | cannot produce audio");return}let t;try{this.reportLog("[RoomClient] enableMic() | calling getUserMedia()");let r=null;try{r=await navigator.mediaDevices.getUserMedia({audio:!0});}catch(c){c.name==="NotAllowedError"?this.safeEmit("error",{code:-1317}):c.name==="AbortError"?this.safeEmit("error",{code:-1302}):c.name==="OverConstrainedError"?this.safeEmit("error",{code:-1318}):c.name==="NotReadableError"&&this.safeEmit("error",{code:-131});}t=r.getAudioTracks()[0];let s=!1,a=16e3,i=4e4;switch(this._audioProfile){case 0:s=!1,a=16e3,i=16e3;break;case 1:s=!1,a=48e3,i=128e3;break;case 2:s=!0,a=48e3,i=64e3;break;case 3:s=!0,a=48e3,i=192e3;break}this._micProducer=await this._sendTransport.produce({appData:{peerId:this._roomInfo.userId,peerName:this._roomInfo.userName},codecOptions:{opusDtx:!0,opusMaxAverageBitrate:i,opusMaxPlaybackRate:a,opusStereo:s},track:t}),this.safeEmit("localAudioTrack",this._micProducer.track),this._micProducer.on("transportclose",()=>{this._micProducer=null;}),this._micProducer.on("trackended",()=>{this.disableMic().catch(()=>{});});}catch(r){this.reportLog(`[RoomClient] enableMic() | failed:${r}`),t&&t.stop();}}async disableMic(){if(this.reportLog("disableMic()"),!!this._micProducer){this._micProducer.close();try{await this._protoo.request("closeProducer",{producerId:this._micProducer.id,transportId:this._sendTransport.id,transportType:"webrtc",kind:"audio"});}catch{}this._micProducer=null;}}async enableWebcam(e){if(this.reportLog("enableWebcam()"),this._webcamProducer){if(e){let s=new MediaStream;s.addTrack(this._webcamProducer.track),e.srcObject=s,e.play().catch(a=>this.reportLog(`videoElem.play() failed: ${a}`));}return}if(!this._mediasoupDevice.canProduce("video")){this.reportLog("enableWebcam() | cannot produce video");return}let t,r;try{if(await this._updateWebcams(),r=this._webcam.device,!r)throw new Error("no webcam devices");this.reportLog("enableWebcam() | calling getUserMedia()");let s=this.getResolutionInfo(this._encoderParam.videoResolution),a=this._encoderParam.videoFps,i=null;try{i=await navigator.mediaDevices.getUserMedia({video:{deviceId:{ideal:r.deviceId},frameRate:a,height:{ideal:s.resHeight},width:{ideal:s.resWidth}}});}catch(p){p.name==="NotAllowedError"?this.safeEmit("error",{code:-1314}):p.name==="AbortError"?this.safeEmit("error",{code:-1301}):p.name==="OverConstrainedError"?this.safeEmit("error",{code:-1315}):p.name==="NotReadableError"&&(console.log("[RoomClient] camera NotReadableError"),this.safeEmit("error",{code:-1316}));}t=i.getVideoTracks()[0];let c,d,l={videoGoogleStartBitrate:1e3};if(this._forceH264&&(d=this._mediasoupDevice.rtpCapabilities.codecs.find(p=>p.mimeType.toLowerCase()==="video/h264"),!d))throw new Error("desired H264 codec+configuration is not supported");if(this._useSimulcast&&s.canScaleDown){let p=this._mediasoupDevice.rtpCapabilities.codecs.find(h=>h.kind==="video"),m=[{maxBitrate:s.maxDownBitrate*1e3,scaleResolutionDownBy:s.scaleDownBy},{maxBitrate:s.maxUpBitrate*1e3,scaleResolutionDownBy:1}];this.reportLog("[RoomClient] firstVideoCodec is not vp9..."),c=m,this._webcamProducer=await this._sendTransport.produce({appData:{peerId:this._roomInfo.userId,peerName:this._roomInfo.userName},codec:this._mediasoupDevice.rtpCapabilities.codecs.find(h=>h.mimeType.toLowerCase()==="video/h264"),codecOptions:{videoGoogleStartBitrate:1e3},encodings:c,track:t});}else this.reportLog("[RoomClient] else......"),c=[{maxBitrate:this._encoderParam.maxVideoBitrate*1e3}],this._webcamProducer=await this._sendTransport.produce({appData:{peerId:this._roomInfo.userId,peerName:this._roomInfo.userName},codec:d,codecOptions:l,encodings:c,track:t});if(e){let p=new MediaStream;p.addTrack(this._webcamProducer.track),e.srcObject=p,e.play().catch(m=>this.reportLog(`videoElem.play() failed: ${m}`));}this.reportLog("[RoomClient] emit localVideoTrack event"),this._webcamProducer.on("transportclose",()=>{this.reportLog("[RoomClientD] _webcamProducer on transportclose"),this._webcamProducer=null;}),this._webcamProducer.on("trackended",()=>{this.reportLog("[RoomClientD] _webcamProducer on transportclose"),this.disableWebcam().catch(()=>{});});}catch(s){this.reportLog(`enableWebcam() | failed:${s}`),t&&t.stop();}}async disableWebcam(){if(this.reportLog("disableWebcam()"),!!this._webcamProducer){console.log("[RoomClient111] this._webcamProducer.close"),this._webcamProducer.close();try{await this._protoo.request("closeProducer",{producerId:this._webcamProducer.id,transportId:this._sendTransport.id,transportType:"webrtc",kind:"video"});}catch{}this._webcamProducer=null;}}async enableShare(e){if(this.reportLog("[RoomClient] enableShare()"),await this._createSendTransport(),this._shareProducer)return;if(!this._mediasoupDevice.canProduce("video")){this.reportLog("[RoomClient] enableShare() | cannot produce video");return}let t;try{this.reportLog("[RoomClient] enableShare() | calling getUserMedia()");let r=this.getResolutionInfo(e.videoResolution),s=null;try{s=await navigator.mediaDevices.getDisplayMedia({audio:!1,video:{cursor:!0,displaySurface:"monitor",frameRate:{max:e.videoFps},height:{max:r.resHeight},logicalSurface:!0,width:{max:r.resWidth}}});}catch(d){d.name==="NotAllowedError"?this.safeEmit("error",{code:-1308}):this.safeEmit("error",{code:-1309});}if(!s)return;t=s.getVideoTracks()[0];let a,i,c={videoGoogleStartBitrate:1e3};if(this._forceH264&&(i=this._mediasoupDevice.rtpCapabilities.codecs.find(d=>d.mimeType.toLowerCase()==="video/h264"),!i))throw new Error("desired H264 codec+configuration is not supported");if(this._useSharingSimulcast&&r.canScaleDown){let d=this._mediasoupDevice.rtpCapabilities.codecs.find(m=>m.kind==="video"),l=[{maxBitrate:r.maxDownBitrate*1e3,scaleResolutionDownBy:r.scaleDownBy},{maxBitrate:r.maxUpBitrate*1e3,scaleResolutionDownBy:1}];this.reportLog("[RoomClient] firstVideoCodec is not vp9...");let p=l.map(m=>({...m,dtx:!0}));this._shareProducer=await this._sendTransport.produce({appData:{peerId:this._roomInfo.userId,peerName:this._roomInfo.userName,share:!0},codecOptions:{videoGoogleStartBitrate:1e3},encodings:p,track:t});}else a=[{maxBitrate:this._encoderParam.maxVideoBitrate*1e3}],this._shareProducer=await this._sendTransport.produce({appData:{peerId:this._roomInfo.userId,peerName:this._roomInfo.userName,share:!0},codec:i,codecOptions:c,encodings:a,track:t});this.safeEmit("screenCaptureStarted"),this.reportLog(`[RoomClient] startScreenShare using codec=${this._shareProducer.rtpParameters.codecs[0].mimeType.split("/")[1]}`),this._shareProducer.on("transportclose",()=>{this.reportLog("[RoomClient] shareProducer transportclose!"),this._shareProducer=null;}),this._shareProducer.on("trackended",async()=>{this.reportLog("[RoomClient] shareProducer trackended!"),await this.disableShare().catch(()=>{});});}catch(r){this.reportLog(`enableShare() | failed:${r}`),r.name,t&&t.stop();}}async disableShare(){if(this.reportLog("disableShare()"),!!this._shareProducer){this._shareProducer.close();try{await this._protoo.request("closeProducer",{producerId:this._shareProducer.id,transportId:this._sendTransport.id,transportType:"webrtc",kind:"video"});}catch{}this.safeEmit("screenCaptureStopped"),this._shareProducer=null;}}async muteAudio(){this.reportLog("muteAudio()");}async unmuteAudio(){this.reportLog("unmuteAudio()");}async restartIce(){this.reportLog("restartIce()");try{if(this._sendTransport){let e=await this._protoo.request("restartIce",{transportId:this._sendTransport.id});await this._sendTransport.restartIce({iceParameters:e});}}catch(e){this.reportLog(`restartIce() | failed:${e}`);}}async setMaxSendingSpatialLayer(e){try{this._webcamProducer?await this._webcamProducer.setMaxSpatialLayer(e):this._shareProducer&&await this._shareProducer.setMaxSpatialLayer(e);}catch(t){this.reportLog(`setMaxSendingSpatialLayer() | failed:${t}`);}}async setConsumerPreferredLayers(e,t,r){try{await this._protoo.request("setConsumerPreferredLayers",{consumerId:e,spatialLayer:t,temporalLayer:r});}catch(s){this.reportLog(`setConsumerPreferredLayers() | failed:${s}`);}}async setConsumerPriority(e,t){try{await this._protoo.request("setConsumerPriority",{consumerId:e,priority:t});}catch(r){this.reportLog(`setConsumerPriority() | failed:${r}`);}}async requestConsumerKeyFrame(e){this.reportLog(`requestConsumerKeyFrame() [consumerId:${e}]`);try{await this._protoo.request("requestConsumerKeyFrame",{consumerId:e});}catch(t){this.reportLog(`requestConsumerKeyFrame() | failed:${t}`);}}async enableChatDataProducer(){if(this.reportLog("enableChatDataProducer()"),!!this._useDataChannel)try{this._chatDataProducer=await this._sendTransport.produceData({appData:{info:"my-chat-DataProducer"},label:"chat",maxRetransmits:1,ordered:!1,priority:"medium"}),this._chatDataProducer.on("transportclose",()=>{this._chatDataProducer=null;}),this._chatDataProducer.on("open",()=>{this.reportLog('chat DataProducer "open" event');}),this._chatDataProducer.on("close",()=>{this.reportLog('chat DataProducer "close" event'),this._chatDataProducer=null;}),this._chatDataProducer.on("error",e=>{this.reportLog(`chat DataProducer "error" event:${e}`);}),this._chatDataProducer.on("bufferedamountlow",()=>{this.reportLog('chat DataProducer "bufferedamountlow" event');});}catch(e){throw this.reportLog(`enableChatDataProducer() | failed:${e}`),e}}async enableBotDataProducer(){if(this.reportLog("enableBotDataProducer()"),!!this._useDataChannel)try{this._botDataProducer=await this._sendTransport.produceData({appData:{info:"my-bot-DataProducer"},label:"bot",maxPacketLifeTime:2e3,ordered:!1,priority:"medium"}),this._botDataProducer.on("transportclose",()=>{this._botDataProducer=null;}),this._botDataProducer.on("open",()=>{this.reportLog('bot DataProducer "open" event');}),this._botDataProducer.on("close",()=>{this.reportLog('bot DataProducer "close" event'),this._botDataProducer=null;}),this._botDataProducer.on("error",e=>{this.reportLog(`bot DataProducer "error" event:${e}`);}),this._botDataProducer.on("bufferedamountlow",()=>{this.reportLog('bot DataProducer "bufferedamountlow" event');});}catch(e){throw this.reportLog(`enableBotDataProducer() | failed:${e}`),e}}async sendCustomCmdMsg(e,t){await this._protoo.notify("customCmdMsg",{cmdId:e,data:t,peerId:this._roomInfo.userId,seq:1});}async sendChatMessage(e){if(this.reportLog(`sendChatMessage() [text:${e}]`),!!this._chatDataProducer)try{this._chatDataProducer.send(e);}catch(t){this.reportLog(`chat DataProducer.send() failed:${t}`);}}async sendBotMessage(e){if(this._botDataProducer)try{this._botDataProducer.send(e);}catch(t){this.reportLog(`bot DataProducer.send() failed:${t}`);}}async changeDisplayName(e){this.reportLog(`changeDisplayName() [displayName:${e}]`),ft({displayName:e});try{await this._protoo.request("changeDisplayName",{displayName:e}),this._roomInfo.userName=e;}catch(t){this.reportLog(`changeDisplayName() | failed: ${t}`);}}async getSendTransportRemoteStats(){if(this.reportLog("getSendTransportRemoteStats()"),!!this._sendTransport)return this._protoo.request("getTransportStats",{transportId:this._sendTransport.id})}async getAudioRemoteStats(){if(this.reportLog("getAudioRemoteStats()"),!!this._micProducer)return this._protoo.request("getProducerStats",{producerId:this._micProducer.id})}async getVideoRemoteStats(){this.reportLog("getVideoRemoteStats()");let e=this._webcamProducer||this._shareProducer;if(e)return this._protoo.request("getProducerStats",{producerId:e.id})}async getConsumerRemoteStats(e){if(this.reportLog("getConsumerRemoteStats()"),!!this._consumers.get(e))return this._protoo.request("getConsumerStats",{consumerId:e})}async getChatDataProducerRemoteStats(){this.reportLog("getChatDataProducerRemoteStats()");let e=this._chatDataProducer;if(e)return this._protoo.request("getDataProducerStats",{dataProducerId:e.id})}async getBotDataProducerRemoteStats(){this.reportLog("getBotDataProducerRemoteStats()");let e=this._botDataProducer;if(e)return this._protoo.request("getDataProducerStats",{dataProducerId:e.id})}async getDataConsumerRemoteStats(e){if(this.reportLog("getDataConsumerRemoteStats()"),!!this._dataConsumers.get(e))return this._protoo.request("getDataConsumerStats",{dataConsumerId:e})}async getSendTransportLocalStats(){return this._sendTransport?this._sendTransport.getStats():null}async getAudioLocalStats(){return this.reportLog("getAudioLocalStats()"),this._micProducer?this._micProducer.getStats():null}async getVideoLocalStats(){this.reportLog("getVideoLocalStats()");let e=this._webcamProducer||this._shareProducer;return e?e.getStats():null}async getConsumerLocalStats(e){let t=this._consumers.get(e);return t?t.getStats():null}async applyNetworkThrottle({uplink:e,downlink:t,rtt:r,secret:s}){try{await this._protoo.request("applyNetworkThrottle",{downlink:t,rtt:r,secret:s,uplink:e});}catch(a){this.reportLog(`applyNetworkThrottle() | failed:${a}`);}}async resetNetworkThrottle({silent:e=false,secret:t}){this.reportLog("resetNetworkThrottle()");try{await this._protoo.request("resetNetworkThrottle",{secret:t});}catch(r){e||this.reportLog(`resetNetworkThrottle() | failed:${r}`);}}async _enterRoom(){this._mediasoupDevice=new ue({handlerName:this._handlerName});let t=(await this._protoo.request("getRouterRtpCapabilities",{sdkAppId:this._roomInfo.sdkAppId,streamId:this._roomInfo.userId,tokenId:this._roomInfo.xConferenceToken})).rtpCapabilities;try{await this._mediasoupDevice.load({routerRtpCapabilities:t});}catch{throw new ie("The request to enter the room timed out, please check the network","",80000107)}try{let s=(await navigator.mediaDevices.getUserMedia({audio:!0})).getAudioTracks()[0];s.enabled=!1,setTimeout(()=>s.stop(),12e4);}catch(r){let s=new ie(r.name,r.message,80000302);this.handleGetUserMediaError(s,"audio");}try{let r=await this._protoo.request("join",{acceptLanguage:this._roomInfo.acceptLanguage,avatarUrl:this._roomInfo.avatarUrl,device:this._device,displayName:this._roomInfo.userName,rtpCapabilities:this._mediasoupDevice.rtpCapabilities,sctpCapabilities:void 0,xConferenceToken:this._roomInfo.xConferenceToken}),{peerList:s,selfTimeMs:a}=r;this.safeEmit("enterRoom",{selfTimeMs:a});let i=[];for(let c of s){if(c.peerId===this._roomInfo.userId)continue;this._peers.set(c.peerId,c),this.safeEmit("remoteUserEnterRoom",{avatarUrl:c.avatarUrl,timeMs:c.timeMs,userDevice:c.device,userId:c.peerId,userName:c.displayName});let d=c.simpleTrack;d&&(d.audio||d.video||d.share)&&i.push(c.peerId);}i.length>0&&this._queryPeerListTrack(i);}catch{throw new ie("Request to enter room timed out, please check your network","",80000107)}await this.calculateRoomStats();}handleGetUserMediaError(e,t){e.errorName==="OverconstrainedError"?t==="video"?(e.errorCode=80000301,this.safeEmit("errorMsg",{code:80000301,errorData:{msg:"Resolution not supported"}})):(e.errorCode=80000302,this.safeEmit("errorMsg",{code:80000302,errorData:{msg:"Microphone OverconstrainedError"}})):e.errorName==="AbortError"?t==="video"?(e.errorCode=80000303,this.safeEmit("errorMsg",{code:80000303,errorData:{msg:"Camera device AbortError"}})):(e.errorCode=80000304,this.safeEmit("errorMsg",{code:80000304,errorData:{msg:"Microphone device AbortError"}})):e.errorName==="NotAllowedError"?t==="video"?(e.errorCode=80000303,this.safeEmit("errorMsg",{code:80000303,errorData:{msg:"Camera device not authorized, possibly due to user denial of permission"}})):(e.errorCode=80000304,this.safeEmit("errorMsg",{code:80000304,errorData:{msg:"Microphone device not authorized, possibly due to user denial of permission"}})):e.errorName==="NotFoundError"?t==="video"?(e.errorCode=80000301,this.safeEmit("errorMsg",{code:80000301,errorData:{msg:"Camera device not found"}})):(e.errorCode=80000302,this.safeEmit("errorMsg",{code:80000302,errorData:{msg:"Microphone device not found"}})):e.errorName==="NotReadableError"?t==="video"?(e.errorCode=80000310,this.safeEmit("errorMsg",{code:80000310,errorData:{msg:"Failed to open camera"}})):(e.errorCode=80000311,this.safeEmit("errorMsg",{code:80000311,errorData:{msg:"Failed to open microphone"}})):e.errorName==="SecurityError"?t==="video"?(e.errorCode=80000301,this.safeEmit("errorMsg",{code:80000301,errorData:{msg:"Camera device does not meet security requirements"}})):(e.errorCode=80000302,this.safeEmit("errorMsg",{code:80000302,errorData:{msg:"Microphone device does not meet security requirements"}})):t==="video"?(e.errorCode=80000301,this.safeEmit("errorMsg",{code:80000301,errorData:{msg:"Unknown camera error"}})):(e.errorCode=80000302,this.safeEmit("errorMsg",{code:80000302,errorData:{msg:"Unknown microphone error"}}));}async calculateRoomStats(){let e=this,t=0;this._roomInfo.disableDataStats||(this._audioLevelQueryInterval=setInterval(async function(){if(e._webcamProducer&&!e._webcamProducer.closed){let R=await e._webcamProducer.getStats();e._localVideoStats=e.handleLocalVideoStats(R,e._webcamProducer);}if(e._micProducer&&!e._micProducer.closed){let R=await e._micProducer.getStats();e._localAudioStats=e.handleLocalAudioStats(R,e._micProducer);}if(e._shareProducer&&!e._shareProducer.closed){let R=await e._shareProducer.getStats();e._localShareStats=e.handleLocalShareStats(R,e._shareProducer);}let i={framesPerSecond:0,jitter:0,jitterBufferDelay:0,packetBitrate:0,packetsLostRatio:0},c={framesPerSecond:0,jitter:0,jitterBufferDelay:0,packetBitrate:0,packetsLostRatio:0},d={jitter:0,jitterBufferDelay:0,packetBitrate:0,packetsLostRatio:0},p=0,m=0;for(let[,R]of e._consumers){let S=await e.getConsumerLocalStats(R.id);if(R.appData.share!==void 0){let C=e.handleRemoteShareStats(S,R);c.packetBitrate+=C.packetBitrate,c.packetsLostRatio+=C.packetsLostRatio,c.jitterBufferDelay+=C.jitterBufferDelay,c.jitter+=C.jitter,c.framesPerSecond+=C.framesPerSecond;}else if(R.kind==="video"){let C=e.handleRemoteVideoStats(S,R);i.packetBitrate+=C.packetBitrate,i.packetsLostRatio+=C.packetsLostRatio,i.jitterBufferDelay+=C.jitterBufferDelay,i.jitter+=C.jitter,i.framesPerSecond+=C.framesPerSecond,p++;}else {let C=e.handleRemoteAudioStats(S,R);d.packetBitrate+=C.packetBitrate,d.packetsLostRatio+=C.packetsLostRatio,d.jitterBufferDelay+=C.jitterBufferDelay,d.jitter+=C.jitter,m++;}}e._averageRemoteShareStats=c,p>0&&(e._averageRemoteVideoStats={framesPerSecond:i.framesPerSecond/p,jitter:i.jitter/p,jitterBufferDelay:i.jitterBufferDelay/p,packetBitrate:i.packetBitrate/p,packetsLostRatio:i.packetsLostRatio/p}),m>0&&(e._averageRemoteAudioStats={jitter:d.jitter/m,jitterBufferDelay:d.jitterBufferDelay/m,packetBitrate:d.packetBitrate/m,packetsLostRatio:d.packetsLostRatio/m});let h=0,u=0,f=0,g=0;if(t===1e3&&(t=0),t++,t%5===0){if(e._sendTransport){let z=0,E=0,C=await e.getSendTransportLocalStats();for(let[_,A]of C)_.startsWith("RTCRemoteInboundRtp")?z+=A.packetsLost:_.startsWith("RTCTransport")&&(E+=A.packetsSent);let K=E-e._sendTransport.lastpacketsSentOrRecv;if(K>0){let _=(z-e._sendTransport.lastpacketlost)/K*100;switch(f=_,true){case _<=.001:h=1;break;case(_>.001&&_<=2):h=2;break;case(_>2&&_<=5):h=3;break;case(_>5&&_<=10):h=4;break;case(_>10&&_<=20):h=5;break;case(_>10&&_>20):h=6;break}}e._sendTransport.lastpacketlost=z,e._sendTransport.lastpacketsSentOrRecv=E;}let R=0;for(let[z,E]of e._recvTransports){let C=await E.getStats(),K=0,_=0;for(let[X,Ke]of C)X.startsWith("RTCInboundRTP")?K+=Ke.packetsLost:X.startsWith("RTCTransport")&&(_+=Ke.packetsReceived);let A=_-E.lastpacketsSentOrRecv;if(A>0){let X=(K-E.lastpacketlost)/A;R+=X;}E.lastpacketlost=K,E.lastpacketsSentOrRecv=_;}let S=R/e._recvTransports.size*100;switch(g=S,true){case S<=.001:u=1;break;case(S>.001&&S<=2):u=2;break;case(S>2&&S<=5):u=3;break;case(S>5&&S<=10):u=4;break;case(S>10&&S<=20):u=5;break;case(S>10&&S>20):u=6;break}let N={downAveragePacketLost:g,downlink:u,upAveragePacketLost:f,uplink:h};e.safeEmit("networkQuality",N);}},1e3));}handleLocalShareStats(e,t){let r={framesPerSecond:0,jitter:0,jitterBufferDelay:0,packetBitrate:0,packetsLostRatio:0};return e.forEach(function(s,a,i){s.type==="outbound-rtp"?(r.packetsLostRatio=s.bytesSent>0?s.retransmittedBytesSent/s.bytesSent:0,r.packetBitrate=s.bytesSent-t.bytesLastSent,r.framesPerSecond=s.framesPerSecond?s.framesPerSecond:0,t.bytesLastSent=s.bytesSent):s.type==="remote-inbound-rtp"&&(r.jitter=s.jitter!==void 0?s.jitter:0,r.jitterBufferDelay=s.jitter!==void 0?s.jitter:0);}),r}handleLocalVideoStats(e,t){let r=this,s={framesPerSecond:0,jitter:0,jitterBufferDelay:0,packetBitrate:0,packetsLostRatio:0};return e.forEach(function(a,i,c){a.type==="outbound-rtp"?(a.framesSent&&(r._webcamProducer.totalFramesSent=a.framesSent),s.packetsLostRatio=a.bytesSent>0?a.retransmittedBytesSent/a.bytesSent:0,s.packetBitrate=a.bytesSent-t.bytesLastSent,s.framesPerSecond=a.framesPerSecond?a.framesPerSecond:0,t.bytesLastSent=a.bytesSent):a.type==="remote-inbound-rtp"&&(s.jitter=a.jitter!==void 0?a.jitter:0,s.jitterBufferDelay=a.jitter!==void 0?a.jitter:0);}),s}handleLocalAudioStats(e,t){let r=this,s={jitter:0,jitterBufferDelay:0,packetBitrate:0,packetsLostRatio:0};return e.forEach(function(a,i,c){if(a.type==="outbound-rtp")a.packetsSent&&(r._micProducer.totalFramesSent=a.packetsSent),s.packetsLostRatio=a.packetsSent>0?a.retransmittedPacketsSent/a.packetsSent:0,s.packetBitrate=a.bytesSent-t.bytesLastSent,t.bytesLastSent=a.bytesSent,a.bytesSent>0;else if(a.type==="media-source"){let d=a.audioLevel!==void 0?Math.round(a.audioLevel*100):0,l=r._roomInfo.userId,p=d>15?"unmute":null;r._audioLevelMap.has(l)&&(Number(r._audioLevelMap.get(l))>15&&d<=15?p="mute":Number(r._audioLevelMap.get(l))>15&&(p=null)),p&&r.safeEmit("userSpeaking",{action:p,userId:l,volume:r._audioLevelMap.get(l)}),r._audioLevelMap.set(r._roomInfo.userId,d>100?100:d);}else a.type==="remote-inbound-rtp"&&(s.jitter=a.jitter!==void 0?a.jitter:0,s.jitterBufferDelay=a.jitter!==void 0?a.jitter:0);}),s}handleRemoteShareStats(e,t){let r=this,s={framesPerSecond:0,jitter:0,jitterBufferDelay:0,packetBitrate:0,packetsLostRatio:0};return e.forEach(function(a,i,c){if(a.type==="inbound-rtp"){s.jitter=a.jitter!==void 0?a.jitter:0,s.jitterBufferDelay=a.jitterBufferDelay!==void 0?a.jitterBufferDelay:0,s.packetsLostRatio=a.packetsReceived>0?a.packetsLost/(a.packetsReceived+a.packetsLost):0,s.packetBitrate=a.bytesReceived-t.bytesLastReceived,t.SetBytesLastReceived(a.bytesReceived);let d=a.framesReceived,l=d-t.framesLastReceived;t.SetFramesLastReceived(d),l===0?(t.SetNoFrameRecvInterval(t.noFrameRecvInterval+1),(t.noFrameRecvInterval===5||t.noFrameRecvInterval===10||t.noFrameRecvInterval===15)&&(t.remotePaused||r.safeEmit("errorMsg",{code:80000508,errorData:{userId:t.appData.peerId,share:true,msg:"The media package for the specified subscribed stream was not received for several consecutive seconds (5/10/15)."}}))):(t.firstFrameArrived||(r.safeEmit("errorMsg",{code:80000518,errorData:{userId:t.appData.peerId,share:true,msg:"The media package of the subscribed instruction stream is received again"}}),t.SetFirstFrameArrived(true)),t.noFrameRecvInterval>=3&&r.safeEmit("errorMsg",{code:80000518,errorData:{userId:t.appData.peerId,share:true,msg:"The media package of the subscribed instruction stream is received again"}}),t.SetNoFrameRecvInterval(0));}}),s}handleRemoteVideoStats(e,t){let r=this,s={framesPerSecond:0,jitter:0,jitterBufferDelay:0,packetBitrate:0,packetsLostRatio:0};for(let[a,i]of e)if(i.type==="inbound-rtp"){s.jitter=i.jitter!==void 0?i.jitter:0,s.jitterBufferDelay=i.jitterBufferDelay!==void 0?i.jitterBufferDelay:0,s.packetsLostRatio=i.packetsReceived>0?i.packetsLost/(i.packetsReceived+i.packetsLost):0,s.packetBitrate=i.bytesReceived-t.bytesLastReceived,t.SetBytesLastReceived(i.bytesReceived);let c=i.framesReceived,d=c-t.framesLastReceived;t.SetFramesLastReceived(c),d===0?(t.SetNoFrameRecvInterval(t.noFrameRecvInterval+1),(t.noFrameRecvInterval===5||t.noFrameRecvInterval===10||t.noFrameRecvInterval===15)&&(t.remotePaused||r.safeEmit("errorMsg",{code:80000508,errorData:{appData:t.appData,msg:"The media package for the specified subscribed stream was not received for several consecutive seconds (5/10/15).",remoteVideoStats:s,share:false,userId:t.appData.peerId}}))):(t.firstFrameArrived||(r.safeEmit("errorMsg",{code:80000518,errorData:{appData:t.appData,msg:"The media package of the subscribed instruction stream is received again",share:false,userId:t.appData.peerId}}),t.SetFirstFrameArrived(true)),t.noFrameRecvInterval>=3&&r.safeEmit("errorMsg",{code:80000518,errorData:{appData:t.appData,msg:"The media package of the subscribed instruction stream is received again",share:false,userId:t.appData.peerId}}),t.SetNoFrameRecvInterval(0)),r.safeEmit("errorMsg",{code:80000518,errorData:{appData:t.appData,msg:"Video related information",remoteVideoStats:s,share:false,userId:t.appData.peerId}});}return s}handleRemoteAudioStats(e,t){let r=this,s=t.appData.peerId,a={jitter:0,jitterBufferDelay:0,packetBitrate:0,packetsLostRatio:0};for(let[i,c]of e)if(c.type==="inbound-rtp"){let d=c.audioLevel!==void 0?Math.round(c.audioLevel*100):0,l=d>15?"unmute":null;r._audioLevelMap.has(s)&&(Number(r._audioLevelMap.get(s))>15&&d<=15?l="mute":Number(r._audioLevelMap.get(s))>15&&(l=null)),l&&r.safeEmit("userSpeaking",{action:l,userId:s,volume:r._audioLevelMap.get(s)}),r._audioLevelMap.set(s,d>100?100:d),a.jitter=c.jitter!==void 0?c.jitter:0,a.jitterBufferDelay=c.jitterBufferDelay!==void 0?c.jitterBufferDelay:0,a.packetsLostRatio=c.packetsReceived>0?c.packetsLost/(c.packetsReceived+c.packetsLost):0,a.packetBitrate=c.bytesReceived-t.bytesLastReceived,t.SetBytesLastReceived(c.bytesReceived);let p=c.packetsReceived,m=p-t.packetsLastReceived;t.SetPacketsLastReceived(p),m===0?(t.SetNoPacketRecvInterval(t.noPacketRecvInterval+1),(t.noPacketRecvInterval===5||t.noPacketRecvInterval===10||t.noPacketRecvInterval===15)&&!t.remotePaused&&!t.closed&&r.safeEmit("errorMsg",{code:80000528,errorData:{appData:t.appData,msg:"The audio package of the specified subscribed stream was not received for several consecutive seconds (5/10/15).",userId:t.appData.peerId}})):(t.firstPacketArrived||(r.safeEmit("errorMsg",{code:80000538,errorData:{appData:t.appData,msg:"Audio packets for subscribed command streams are re-received",userId:t.appData.peerId}}),t.SetFirstPacketArrived(true)),t.noPacketRecvInterval>=5&&r.safeEmit("errorMsg",{code:80000538,errorData:{appData:t.appData,msg:"Audio packets for subscribed command streams are re-received",userId:t.appData.peerId}}),t.SetNoPacketRecvInterval(0));}return a}getLocalMediaStats(){return [this._localVideoStats,this._localAudioStats,this._localShareStats]}getRemoteMediaStats(){return [this._averageRemoteVideoStats,this._averageRemoteAudioStats,this._averageRemoteShareStats]}getAudioLevels(){return this._audioLevelMap}_queryPeerListTrack(e){let t=this._splitQueryTrack(e,50);console.log(t),t.forEach(r=>{this._protoo.request("queryUser",{peerId:r}).then(s=>{for(let a of s.peerList)for(let i of a.track){let{producerId:c,kind:d,paused:l,appData:p}=i;this._needConsumes.set(c,{appData:p,kind:d,peerId:a.peerId,producerId:c});let m=p.share!==void 0?"userShareAvailable":d==="video"?"userVideoAvailable":"userAudioAvailable";l?(this.reportLog("[RoomClient] after enterRoom, there is track paused!"),m==="userShareAvailable"&&this.safeEmit(m,{appData:p,available:true,paused:true,producerId:c,userId:a.peerId})):this.safeEmit(m,{appData:p,available:true,producerId:c,userId:a.peerId});}}).catch(s=>{console.log(s);});});}_splitQueryTrack(e,t){let r=0,s=[];for(;r<e.length;)s.push(e.slice(r,r+=t));return s}async getPageUserInfo(e){let t=await this._protoo.request("getPeerList",{page:e}),{peerNumberInRoom:r,peerPages:s,currentPage:a,peerNumberInCurrentPage:i,peerList:c}=t;this.safeEmit("pageUserInfo",{currentPage:a,peerNumberInCurrentPage:i,peerNumberInRoom:r,peerPages:s});for(let d of c)if(d.id!==this._roomInfo.userId&&!this._peers.has(d.id)){this._peers.set(d.id,d),this.safeEmit("remoteUserEnterRoom",{avatarUrl:d.avatarUrl,timeMs:d.timeMs,userDevice:d.device,userId:d.id,userName:d.displayName});for(let l of d.track){let{producerId:p,kind:m,paused:h,appData:u}=l;this._needConsumes.set(p,{appData:u,kind:m,peerId:d.peerId,producerId:p});let f=u.share!==void 0?"userShareAvailable":m==="video"?"userVideoAvailable":"userAudioAvailable";h?this.reportLog("[RoomClient] after enterRoom, there is track paused!"):this.safeEmit(f,{available:true,userId:d.peerId});}}}async _updateWebcams(){this.reportLog("_updateWebcams()"),this._webcams=new Map,this.reportLog("_updateWebcams() | calling enumerateDevices()");let e=await navigator.mediaDevices.enumerateDevices();for(let a of e)a.kind==="videoinput"&&this._webcams.set(a.deviceId,a);let t=Array.from(this._webcams.values()),r=t.length,s=this._webcam.device?this._webcam.device.deviceId:void 0;this.reportLog(`_updateWebcams() [webcams:${t}]`),r===0?this._webcam.device=null:this._webcams.has(s)||(this._webcam.device=t[0]);}_getWebcamType(e){let t="front";return /(back|rear)/i.test(e.label)?(this.reportLog("_getWebcamType() | it seems to be a back camera"),t="back"):this.reportLog("_getWebcamType() | it seems to be a front camera"),t}async _pauseConsumer(e){try{await this._protoo.request("pauseConsumer",{consumerId:e.id,producerId:e.producerId,transportId:e.recvTransportId,transportType:"webrtc"});}catch(t){this.reportLog(`_resumeConsumer() | failed:${t}`);}}async _resumeConsumer(e){try{await this._protoo.request("resumeConsumer",{consumerId:e.id,producerId:e.producerId,transportId:e.recvTransportId,transportType:"webrtc"});}catch(t){this.reportLog(`_resumeConsumer() | failed:${t}`);}}getErrorInfo(e){switch(e){case 16385:return {SIGNAL_CAHNNEL_SETUP_FAILED:"Signaling channel establishment failed"};default:return {}}}getResolutionInfo(e){let t={canScaleDown:true,maxDownBitrate:100,maxUpBitrate:300,resHeight:1,resWidth:1,scaleDownBy:2};switch(e){case 0:t.resWidth=120,t.resHeight=120,t.canScaleDown=false;break;case 1:t.resWidth=160,t.resHeight=160,t.canScaleDown=false;break;case 2:t.resWidth=270,t.resHeight=270,t.canScaleDown=false;break;case 3:t.resWidth=480,t.resHeight=480,t.canScaleDown=false;break;case 4:t.resWidth=160,t.resHeight=120,t.canScaleDown=false;break;case 5:t.resWidth=240,t.resHeight=180,t.canScaleDown=false;break;case 6:t.resWidth=280,t.resHeight=210,t.canScaleDown=false;break;case 7:t.resWidth=320,t.resHeight=240,t.canScaleDown=true,t.maxDownBitrate=150,t.maxUpBitrate=375;break;case 8:t.resWidth=400,t.resHeight=300,t.canScaleDown=false;break;case 9:t.resWidth=480,t.resHeight=360,t.canScaleDown=true,t.maxDownBitrate=225,t.maxUpBitrate=600;break;case 10:t.resWidth=640,t.resHeight=480,t.canScaleDown=true,t.scaleDownBy=4,t.maxDownBitrate=150,t.maxUpBitrate=900;break;case 11:t.resWidth=960,t.resHeight=720,t.canScaleDown=true,t.scaleDownBy=4,t.maxDownBitrate=200,t.maxUpBitrate=1100;break;case 12:t.resWidth=160,t.resHeight=90,t.canScaleDown=false;break;case 13:t.resWidth=256,t.resHeight=144,t.canScaleDown=false;break;case 14:t.resWidth=320,t.resHeight=180,t.canScaleDown=true,t.maxDownBitrate=200,t.maxUpBitrate=300;break;case 15:t.resWidth=480,t.resHeight=270,t.canScaleDown=false;break;case 16:t.resWidth=640,t.resHeight=360,t.canScaleDown=true,t.scaleDownBy=4,t.maxDownBitrate=200,t.maxUpBitrate=600;break;case 17:t.resWidth=960,t.resHeight=540,t.canScaleDown=true,t.maxDownBitrate=400,t.maxUpBitrate=900;break;case 18:t.resWidth=1280,t.resHeight=720,t.canScaleDown=true,t.scaleDownBy=4,t.maxDownBitrate=300,t.maxUpBitrate=1300;break;case 19:t.resWidth=1920,t.resHeight=1080,t.canScaleDown=true,t.scaleDownBy=4,t.maxDownBitrate=400,t.maxUpBitrate=2100;break;}return t}async enableDevicesMonitor(){this.reportLog("[RoomClient] devicechanged"),this._camDeviceList=await this.getCameraDeviceList(),this._micDeviceList=await this.getMicDevicesList(),this._speakerDeviceList=await this.getSpeakerDevicesList(),navigator.mediaDevices.addEventListener("devicechange",async e=>{this.reportLog(`[RoomClient] devicechanged event=${JSON.stringify(e)}`);let t=await this.getCameraDeviceList(),r=await this.getMicDevicesList(),s=await this.getSpeakerDevicesList(),a=[],i=6;t.length!==this._camDeviceList.length&&(a=ye(t,this._camDeviceList),i=t.length>this._camDeviceList.length?0:1,this.safeEmit("deviceChanged",{deviceId:a[0].deviceId,event:i}),this.reportLog(`[RoomClient] cam changed deviceId=${a[0].deviceId}`)),r.length!==this._micDeviceList.length&&(a=ye(r,this._micDeviceList),i=r.length>this._micDeviceList.length?2:3,this.safeEmit("deviceChanged",{deviceId:a[0].deviceId,event:i}),this.reportLog(`[RoomClient] mic changed deviceId=${a[0].deviceId}`)),s.length!==this._speakerDeviceList.length&&(a=ye(s,this._speakerDeviceList),i=s.length>this._speakerDeviceList.length?4:5,this.safeEmit("deviceChanged",{deviceId:a[0].deviceId,event:i}),this.reportLog(`[RoomClient] speaker changed deviceId=${a[0].deviceId}`)),this._camDeviceList=t,this._micDeviceList=r,this._speakerDeviceList=s;});}reportLog(e){console.log(e),this.safeEmit("sdkLogReport",e);}static async enableMicTest(){try{this.audioContext=new AudioContext;}catch{console.log("Web audio API not supported.");}this.soundMeter=new fe(this.audioContext);try{this.micStream=await navigator.mediaDevices.getUserMedia({audio:!0});let t=this.micStream.getAudioTracks()[0];this.soundMeter.connectToSource(this.micStream),this.micTestVolumeQueryInterval=setInterval(()=>{let r=this.soundMeter.instant;this.micTestVolume=r*348,console.log(`[RoomClient] micTestVolume = ${this.micTestVolume}`);},500);}catch{}}static getMicTestVolume(){return this.micTestVolume}static async disableMicTest(){if(this.micTestVolumeQueryInterval&&(clearInterval(this.micTestVolumeQueryInterval),this.micTestVolumeQueryInterval=null),this.soundMeter.stop(),this.micStream){let e,t,r;if(this.micStream.getTracks)for(e=this.micStream.getTracks(),t=0,r=e.length;t<r;t+=1)await e[t].stop();else for(e=this.micStream.getAudioTracks(),t=0,r=e.length;t<r;t+=1)e[t].stop();}this.audioContext=null,this.soundMeter=null,this.micTestVolume=0,this.micStream=null;}static testHttpConnection(e){return new Promise(function(r,s){ze(e||"https://baidu.com",.3).then(function(a){console.log(`[RoomClient] Ping time was ${a} ms`),r({pingTime:a});}).catch(function(a){console.error("Could not ping remote URL",a),s(a);});})}static testWSConnection(e){return new Promise(function(r,s){let a=new se(e,{});a.on("open",()=>{console.log("Test open");}),a.on("connectionTimeOut",()=>{console.log("Test connectionTimeOut");}),a.on("error",()=>{console.log("Test error");});})}};G.audioContext=null,G.soundMeter=null,G.micTestVolume=0,G.micTestVolumeQueryInterval=null,G.micStream=null;function Rt(){let o,n,e=()=>{let c=document.createElement("audio");return c.autoplay=true,c.muted=false,c.controls=false,c};function t(){o||(o=new G),o.on("enterRoom",async()=>{console.log("[RoomClient] \u0414\u0443\u0443\u0434\u043B\u0430\u0433\u0430 \u0430\u043C\u0436\u0438\u043B\u0442\u0442\u0430\u0439 \u044D\u0445\u044D\u043B\u043B\u044D\u044D!"),await(o==null?void 0:o.startLocalAudio(false));}),o.on("exitRoom",async c=>{console.log(`[RoomClient] exitRoom ${JSON.stringify(c)}`),o==null||o.removeAllListeners();}),o.on("connectionLost",()=>{console.log("[RoomClient] connectionLost");}),o.on("remoteUserEnterRoom",c=>{n=e(),console.log(`[RoomClient] remoteUserEnterRoom:${JSON.stringify(c)}`);}),o.on("remoteUserLeaveRoom",c=>{console.log(`[RoomClient] userLeaveRoom:${JSON.stringify(c)}`);}),o.on("userAudioAvailable",async c=>{console.log(`[userAudioAvailable] audioInfo=${JSON.stringify(c)}`);let{userId:d,available:l}=c;l&&n&&await(o==null?void 0:o.startRemoteAudio(d,n));}),o.on("close",()=>{console.log("[RoomClient] close"),o&&(o=null);});}async function r(c,d,l,p,m,h){try{o||(o=new G);let u={maxRetryTime:10*1e3,roomId:c,sdkAppId:p,serverUrl:h,userId:d,userName:l,userSig:"",xConferenceToken:m};o.setAudioProfile(0),t(),await o.enterRoom(u);}catch(u){console.error("\u04E9\u0440\u04E9\u04E9\u043D\u0434 \u043D\u044D\u0432\u0442\u0440\u044D\u0445\u044D\u0434 \u0430\u043B\u0434\u0430\u0430 \u0433\u0430\u0440\u043B\u0430\u0430!"),console.error(u);}}async function s(){if(o)try{n&&(n.pause(),n.src="",n=null),await o.exitRoom();}catch(c){console.error("RoomClient-\u0438\u0439\u0433 \u0445\u0430\u0430\u0445\u0430\u0434 \u0430\u043B\u0434\u0430\u0430 \u0433\u0430\u0440\u043B\u0430\u0430:",c);}finally{o=null;}}async function a(c){console.log(`[muteLocalAudio] mute=${c}`),await(o==null?void 0:o.muteLocalAudio(c));}function i(){return {enterRoom:r,clearRoomClient:s,muteLocalAudio:a}}return {createCallingClient:i}}async function ce(o,n,e){return new Promise((t,r)=>{o&&o.connected?(o.emit("joinRoom",{room:n,username:e}),t(true),console.log("[JoinSocketRoom]: \u04E9\u0440\u04E9\u04E9\u043D\u0434 \u0430\u043C\u0436\u0438\u043B\u0442\u0442\u0430\u0439 \u043D\u044D\u0432\u0442\u044D\u0440\u043B\u044D\u044D.")):(console.error("\u04E8\u0440\u04E9\u04E9 \u0440\u04AF\u04AF \u043E\u0440\u043E\u0445\u043E\u0434 \u0430\u0441\u0443\u0443\u0434\u0430\u043B \u0433\u0430\u0440\u043B\u0430\u0430...\u0422\u0430 \u0434\u0430\u0445\u0438\u043D \u043E\u0440\u043E\u043B\u0434\u043E\u043D\u043E \u0443\u0443."),r(false));})}async function _e(o,n,e){if(!o||!o.connected){console.error("[ListenChannel]: Socket \u0445\u043E\u043B\u0431\u043E\u0433\u0434\u043E\u043E\u0433\u04AF\u0439 \u0431\u0430\u0439\u043D\u0430.");return}o.on("message",t=>{try{let r=JSON.parse(t.message);e(r);}catch(r){console.error('"Message" \u0444\u043E\u0440\u043C\u0430\u0442 \u0431\u0443\u0440\u0443\u0443 \u0431\u0430\u0439\u043D\u0430.',r);}});}async function ge(o,n,e,t){o!=null&&o.connected?(o.emit("sendMessage",{room:e,username:n,message:t}),console.log("[sendMessage]: \u0421\u0438\u0433\u043D\u0430\u043B \u0430\u043C\u0436\u0438\u043B\u0442\u0442\u0430\u0439 \u0438\u043B\u0433\u044D\u044D\u0433\u0434\u043B\u044D\u044D.")):console.error(`\u0421\u0438\u0433\u043D\u0430\u043B \u0438\u043B\u0433\u044D\u044D\u0445\u044D\u0434 \u0430\u0441\u0443\u0443\u0434\u0430\u043B \u0433\u0430\u0440\u043B\u0430\u0430...\u0422\u0430 \u0434\u0430\u0445\u0438\u043D \u043E\u0440\u043E\u043B\u0434\u043E\u043D\u043E \u0443\u0443.
|
|
2
|
+
|
|
3
|
+
[Socket] ${o==null?void 0:o.connected}`);}function yt(){let o,n;async function a(p,m,h){return new Promise((u,f)=>{o=socket_ioClient.io(p,{reconnection:true,...h,auth:{serverToken:m}}),o.on("connect",()=>{console.log("[Socket] Socket \u0445\u043E\u043B\u0431\u043E\u0433\u0434\u043B\u043E\u043E."),u(true);}),o.on("connect_error",g=>{console.error("[Socket] Socket \u0445\u043E\u043B\u0431\u043E\u0433\u0434\u043E\u0445\u043E\u0434 \u0430\u043B\u0434\u0430\u0430 \u0433\u0430\u0440\u043B\u0430\u0430.",g),f(false);});})}async function i(p,m,h){if(!o)throw new Error(`[CallPro CallScreen]: \u0421\u0438\u0433\u043D\u0430\u043B\u0438\u043D\u0433 \u0441\u0435\u0440\u0432\u0435\u0440\u0442\u044D\u0439 \u0445\u043E\u043B\u0431\u043E\u0433\u0434\u043E\u0445\u043E\u0434 \u0430\u043B\u0434\u0430\u0430 \u0433\u0430\u0440\u043B\u0430\u0430!
|
|
4
|
+
|
|
5
|
+
\u0411\u043E\u043B\u043E\u043C\u0436\u0438\u0442 \u0448\u0430\u043B\u0442\u0433\u0430\u0430\u043D\u0443\u0443\u0434:
|
|
6
|
+
|
|
7
|
+
- Config-\u044B\u043D \u0431\u0443\u0440\u0443\u0443 \u0443\u0442\u0433\u0430
|
|
8
|
+
- \u0421\u04AF\u043B\u0436\u044D\u044D\u043D\u0438\u0439 \u0434\u043E\u0433\u043E\u043B\u0434\u043E\u043B
|
|
9
|
+
- ...
|
|
10
|
+
`);await ce(o,p,m),await _e(o,p,h);}async function c(p,m,h,u,f,g,R){return (!o||!n)&&(n=await a(p,m,R)),await i(u,f,g),{socket:o}}function d(p){o&&o.emit("leaveRoom",p);}async function l(p,m){if(o)try{o.emit("joinRoom",{username:m,room:p});let h={room:p,username:m,message:{channelName:p,hash:"hash",type:"busy",socketId:o.id}};o.emit("sendMessage",h),o.emit("leaveRoom",p);}catch{}}return {createSignalClient:c,leaveChannel:d,secondCallBusy:l}}var Re=class{constructor(){this.events=new Map;}on(n,e){this.events.has(n)||this.events.set(n,new Set),this.events.get(n).add(e);}off(n,e){var t;(t=this.events.get(n))==null||t.delete(e);}emit(n,e){var t;(t=this.events.get(n))==null||t.forEach(r=>r(e));}once(n,e){let t=r=>{e(r),this.off(n,t);};this.on(n,t);}clear(n){n?this.events.delete(n):this.events.clear();}};function vt(){async function o(n){let e=new Re,t=n.socketUrl,r=n.socketToken,s=n.socketConnectionOptions,a=n.phoneNumber,i=n.outboundRoom,c=n.inboundRoom,d,l,m=await yt().createSignalClient(t,r,i,c,a,g,s),u=Rt().createCallingClient(),f=false;async function g(_){if(_.roomId!==void 0&&(l=_.roomId),_.data)switch(_.data.method){case "call_init":_.data.destNumber===a?(_.data.callRoom?d=_.data:_.data.roomId&&(d={..._.data,callRoom:_.data.roomId}),e.emit("call_init","incoming"),console.log("[CallClient]: \u0418\u0440\u0436 \u0431\u0443\u0439 \u0434\u0443\u0443\u0434\u043B\u0430\u0433\u044B\u0433 \u0445\u04AF\u043B\u044D\u044D\u0436 \u0430\u0432\u043B\u0430\u0430.")):_.data.destination!==a&&(_.data.callRoom?d=_.data:_.data.roomId&&(d={..._.data,callRoom:_.data.roomId}),await u.enterRoom(_.data.roomId,_.data.userId,_.data.fromNumber,_.data.appId,_.data.rtcToken,_.data.serverUrl),e.emit("call_init","outbound"),console.log("[CallClient]: \u0425\u0438\u0439\u0436 \u0431\u0443\u0439 \u0434\u0443\u0443\u0434\u043B\u0430\u0433\u044B\u0433 \u0445\u04AF\u043B\u044D\u044D\u0436 \u0430\u0432\u043B\u0430\u0430."));break;case "ringing":console.log("[CallClient]: actions event ringing"),e.emit("ringing");break;case "hangup":console.log("[CallClient]: actions event hangup"),u.clearRoomClient(),e.emit("hangup");break;case "busy":console.log("[CallClient]: actions event busy"),u.clearRoomClient(),e.emit("busy");break;case "answered":console.log("[CallClient]: actions event answered"),e.emit("answered");break;case "bye":console.log("[CallClient]: actions event bye"),u.clearRoomClient(),e.emit("bye");break;default:console.log("[CallClient]: actions event unknown");break}}async function R(_){console.log(`[CallClient] ${_} \u0434\u0443\u0433\u0430\u0430\u0440-\u043B\u0443\u0443 \u0434\u0443\u0443\u0434\u043B\u0430\u0433\u0430 \u044D\u0445\u043B\u04AF\u04AF\u043B\u043B\u044D\u044D!`);let A=`${c}.${uuid.v4()}`,X={destination:`${_}`,fromNumber:a,fromName:a,video:"false",roomId:A,callType:"audio"};await ce(m.socket,i,a),await ge(m.socket,a,i,JSON.stringify(X)),await ce(m.socket,A,a),await _e(m.socket,A,g);}async function S(){console.log(`[CallClient] ${d.fromNumber} \u0434\u0443\u0433\u0430\u0430\u0440\u0430\u0430\u0441 \u0438\u0440\u0441\u044D\u043D \u0434\u0443\u0443\u0434\u043B\u0430\u0433\u044B\u0433 \u0445\u04AF\u043B\u044D\u044D\u0436 \u0430\u0432\u043B\u0430\u0430!`),await ce(m.socket,d.callRoom,a),await _e(m.socket,d.callRoom,g),await u.enterRoom(d.roomId,d.userId,d.fromNumber,d.appId,d.rtcToken,d.serverUrl);let _={status:"success",message:{reason:"",text:"\u0414\u0443\u0443\u0434\u043B\u0430\u0433\u044B\u0433 \u0445\u04AF\u043B\u044D\u044D\u043D \u0430\u0432\u043B\u0430\u0430",show:true},data:{userId:a,fromNumber:a,fromName:a,destNumber:d.destNumber,direction:"inbound",method:"answered"}};await ge(m.socket,a,l!==void 0?l:d.callRoom,JSON.stringify(_));}async function N(){console.log("[CallClient] \u0414\u0443\u0443\u0434\u043B\u0430\u0433\u0430 \u0434\u0443\u0443\u0441\u0433\u0430\u043B\u0430\u0430.");let _={data:{method:"bye"},message:{text:"\u0414\u0443\u0443\u0434\u043B\u0430\u0433\u044B\u0433 \u0442\u0430\u0441\u0430\u043B\u043B\u0430\u0430"},status:"success"};await ge(m.socket,a,l!==void 0?l:d.callRoom,JSON.stringify(_)),u.clearRoomClient();}async function z(){console.log("[CallClient] \u0418\u0440\u0441\u044D\u043D \u0434\u0443\u0443\u0434\u043B\u0430\u0433\u044B\u0433 \u0445\u04AF\u043B\u044D\u044D\u0436 \u0430\u0432\u0430\u0445\u0430\u0430\u0441 \u0442\u0430\u0442\u0433\u0430\u043B\u0437\u043B\u0430\u0430.");let _={data:{method:"bye"},message:{text:"\u0414\u0443\u0443\u0434\u043B\u0430\u0433\u044B\u0433 \u0430\u0432\u0430\u0445\u044B\u0433 \u0442\u0430\u0442\u0433\u0430\u043B\u0437\u043B\u0430\u0430"},status:"success"};await ge(m.socket,a,l!==void 0?l:d.callRoom,JSON.stringify(_)),u.clearRoomClient();}async function E(){console.log(`[CallClient] \u041C\u0438\u043A\u0440\u043E\u0444\u043E\u043D\u044B\u0433 ${f?"\u043D\u044D\u044D\u0432":"\u0445\u0430\u0430\u0432"}`),u.muteLocalAudio(!f),f=!f;}async function C(){return d}function K(){var _;return ((_=m.socket)==null?void 0:_.connected)||false}return {createCall:R,acceptCall:S,endCall:N,declineCall:z,isConnected:K,toggleMic:E,getInboundUserData:C,on:e.on.bind(e)}}return {createClient:o}}exports.CallClient=vt;
|