UNPKG

@inlivedev/inlive-js-sdk

Version:
1 lines 144 kB
function eq(e,t){return e===t||e!=e&&t!=t}function assocIndexOf(e,t){for(var i=e.length;i--;)if(eq(e[i][0],t))return i;return-1}var e=Array.prototype.splice;function ListCache(e){var t=-1,i=null==e?0:e.length;for(this.clear();++t<i;){var a=e[t];this.set(a[0],a[1])}}ListCache.prototype.clear=function listCacheClear(){this.__data__=[],this.size=0},ListCache.prototype.delete=function listCacheDelete(t){var i=this.__data__,a=assocIndexOf(i,t);return!(a<0)&&(a==i.length-1?i.pop():e.call(i,a,1),--this.size,!0)},ListCache.prototype.get=function listCacheGet(e){var t=this.__data__,i=assocIndexOf(t,e);return i<0?void 0:t[i][1]},ListCache.prototype.has=function listCacheHas(e){return assocIndexOf(this.__data__,e)>-1},ListCache.prototype.set=function listCacheSet(e,t){var i=this.__data__,a=assocIndexOf(i,e);return a<0?(++this.size,i.push([e,t])):i[a][1]=t,this};var t="object"==typeof global&&global&&global.Object===Object&&global,i="object"==typeof self&&self&&self.Object===Object&&self,a=t||i||Function("return this")(),r=a.Symbol,n=Object.prototype,s=n.hasOwnProperty,o=n.toString,c=r?r.toStringTag:void 0;var d=Object.prototype.toString;var h="[object Null]",l="[object Undefined]",u=r?r.toStringTag:void 0;function baseGetTag(e){return null==e?void 0===e?l:h:u&&u in Object(e)?function getRawTag(e){var t=s.call(e,c),i=e[c];try{e[c]=void 0;var a=!0}catch(e){}var r=o.call(e);return a&&(t?e[c]=i:delete e[c]),r}(e):function objectToString(e){return d.call(e)}(e)}function isObject(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}var m="[object AsyncFunction]",_="[object Function]",p="[object GeneratorFunction]",v="[object Proxy]";function isFunction(e){if(!isObject(e))return!1;var t=baseGetTag(e);return t==_||t==p||t==m||t==v}var f,g=a["__core-js_shared__"],y=(f=/[^.]+$/.exec(g&&g.keys&&g.keys.IE_PROTO||""))?"Symbol(src)_1."+f:"";var b=Function.prototype.toString;var w=/^\[object .+?Constructor\]$/,S=Function.prototype,k=Object.prototype,C=S.toString,T=k.hasOwnProperty,E=RegExp("^"+C.call(T).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");function baseIsNative(e){return!(!isObject(e)||function isMasked(e){return!!y&&y in e}(e))&&(isFunction(e)?E:w).test(function toSource(e){if(null!=e){try{return b.call(e)}catch(e){}try{return e+""}catch(e){}}return""}(e))}function getNative(e,t){var i=function getValue(e,t){return null==e?void 0:e[t]}(e,t);return baseIsNative(i)?i:void 0}var I=getNative(a,"Map"),O=getNative(Object,"create");var A=Object.prototype.hasOwnProperty;var L=Object.prototype.hasOwnProperty;function Hash(e){var t=-1,i=null==e?0:e.length;for(this.clear();++t<i;){var a=e[t];this.set(a[0],a[1])}}function getMapData(e,t){var i=e.__data__;return function isKeyable(e){var t=typeof e;return"string"==t||"number"==t||"symbol"==t||"boolean"==t?"__proto__"!==e:null===e}(t)?i["string"==typeof t?"string":"hash"]:i.map}function MapCache(e){var t=-1,i=null==e?0:e.length;for(this.clear();++t<i;){var a=e[t];this.set(a[0],a[1])}}Hash.prototype.clear=function hashClear(){this.__data__=O?O(null):{},this.size=0},Hash.prototype.delete=function hashDelete(e){var t=this.has(e)&&delete this.__data__[e];return this.size-=t?1:0,t},Hash.prototype.get=function hashGet(e){var t=this.__data__;if(O){var i=t[e];return"__lodash_hash_undefined__"===i?void 0:i}return A.call(t,e)?t[e]:void 0},Hash.prototype.has=function hashHas(e){var t=this.__data__;return O?void 0!==t[e]:L.call(t,e)},Hash.prototype.set=function hashSet(e,t){var i=this.__data__;return this.size+=this.has(e)?0:1,i[e]=O&&void 0===t?"__lodash_hash_undefined__":t,this},MapCache.prototype.clear=function mapCacheClear(){this.size=0,this.__data__={hash:new Hash,map:new(I||ListCache),string:new Hash}},MapCache.prototype.delete=function mapCacheDelete(e){var t=getMapData(this,e).delete(e);return this.size-=t?1:0,t},MapCache.prototype.get=function mapCacheGet(e){return getMapData(this,e).get(e)},MapCache.prototype.has=function mapCacheHas(e){return getMapData(this,e).has(e)},MapCache.prototype.set=function mapCacheSet(e,t){var i=getMapData(this,e),a=i.size;return i.set(e,t),this.size+=i.size==a?0:1,this};function Stack(e){var t=this.__data__=new ListCache(e);this.size=t.size}Stack.prototype.clear=function stackClear(){this.__data__=new ListCache,this.size=0},Stack.prototype.delete=function stackDelete(e){var t=this.__data__,i=t.delete(e);return this.size=t.size,i},Stack.prototype.get=function stackGet(e){return this.__data__.get(e)},Stack.prototype.has=function stackHas(e){return this.__data__.has(e)},Stack.prototype.set=function stackSet(e,t){var i=this.__data__;if(i instanceof ListCache){var a=i.__data__;if(!I||a.length<199)return a.push([e,t]),this.size=++i.size,this;i=this.__data__=new MapCache(a)}return i.set(e,t),this.size=i.size,this};var R=function(){try{var e=getNative(Object,"defineProperty");return e({},"",{}),e}catch(e){}}();function baseAssignValue(e,t,i){"__proto__"==t&&R?R(e,t,{configurable:!0,enumerable:!0,value:i,writable:!0}):e[t]=i}function assignMergeValue(e,t,i){(void 0!==i&&!eq(e[t],i)||void 0===i&&!(t in e))&&baseAssignValue(e,t,i)}var M=function createBaseFor(e){return function(t,i,a){for(var r=-1,n=Object(t),s=a(t),o=s.length;o--;){var c=s[e?o:++r];if(!1===i(n[c],c,n))break}return t}}(),D="object"==typeof exports&&exports&&!exports.nodeType&&exports,j=D&&"object"==typeof module&&module&&!module.nodeType&&module,x=j&&j.exports===D?a.Buffer:void 0,N=x?x.allocUnsafe:void 0;var P=a.Uint8Array;function cloneTypedArray(e,t){var i=t?function cloneArrayBuffer(e){var t=new e.constructor(e.byteLength);return new P(t).set(new P(e)),t}(e.buffer):e.buffer;return new e.constructor(i,e.byteOffset,e.length)}var V=Object.create,U=function(){function object(){}return function(e){if(!isObject(e))return{};if(V)return V(e);object.prototype=e;var t=new object;return object.prototype=void 0,t}}();var z=function overArg(e,t){return function(i){return e(t(i))}}(Object.getPrototypeOf,Object),B=Object.prototype;function isPrototype(e){var t=e&&e.constructor;return e===("function"==typeof t&&t.prototype||B)}function isObjectLike(e){return null!=e&&"object"==typeof e}function baseIsArguments(e){return isObjectLike(e)&&"[object Arguments]"==baseGetTag(e)}var $=Object.prototype,q=$.hasOwnProperty,H=$.propertyIsEnumerable,F=baseIsArguments(function(){return arguments}())?baseIsArguments:function(e){return isObjectLike(e)&&q.call(e,"callee")&&!H.call(e,"callee")},K=Array.isArray,J=9007199254740991;function isLength(e){return"number"==typeof e&&e>-1&&e%1==0&&e<=J}function isArrayLike(e){return null!=e&&isLength(e.length)&&!isFunction(e)}var G="object"==typeof exports&&exports&&!exports.nodeType&&exports,W=G&&"object"==typeof module&&module&&!module.nodeType&&module,Y=W&&W.exports===G?a.Buffer:void 0,Q=(Y?Y.isBuffer:void 0)||function stubFalse(){return!1},X="[object Object]",Z=Function.prototype,ee=Object.prototype,te=Z.toString,ie=ee.hasOwnProperty,ae=te.call(Object);var re={};re["[object Float32Array]"]=re["[object Float64Array]"]=re["[object Int8Array]"]=re["[object Int16Array]"]=re["[object Int32Array]"]=re["[object Uint8Array]"]=re["[object Uint8ClampedArray]"]=re["[object Uint16Array]"]=re["[object Uint32Array]"]=!0,re["[object Arguments]"]=re["[object Array]"]=re["[object ArrayBuffer]"]=re["[object Boolean]"]=re["[object DataView]"]=re["[object Date]"]=re["[object Error]"]=re["[object Function]"]=re["[object Map]"]=re["[object Number]"]=re["[object Object]"]=re["[object RegExp]"]=re["[object Set]"]=re["[object String]"]=re["[object WeakMap]"]=!1;var ne="object"==typeof exports&&exports&&!exports.nodeType&&exports,se=ne&&"object"==typeof module&&module&&!module.nodeType&&module,oe=se&&se.exports===ne&&t.process,ce=function(){try{var e=se&&se.require&&se.require("util").types;return e||oe&&oe.binding&&oe.binding("util")}catch(e){}}(),de=ce&&ce.isTypedArray,he=de?function baseUnary(e){return function(t){return e(t)}}(de):function baseIsTypedArray(e){return isObjectLike(e)&&isLength(e.length)&&!!re[baseGetTag(e)]};function safeGet(e,t){if(("constructor"!==t||"function"!=typeof e[t])&&"__proto__"!=t)return e[t]}var le=Object.prototype.hasOwnProperty;function assignValue(e,t,i){var a=e[t];le.call(e,t)&&eq(a,i)&&(void 0!==i||t in e)||baseAssignValue(e,t,i)}var ue=9007199254740991,me=/^(?:0|[1-9]\d*)$/;function isIndex(e,t){var i=typeof e;return!!(t=null==t?ue:t)&&("number"==i||"symbol"!=i&&me.test(e))&&e>-1&&e%1==0&&e<t}var _e=Object.prototype.hasOwnProperty;function arrayLikeKeys(e,t){var i=K(e),a=!i&&F(e),r=!i&&!a&&Q(e),n=!i&&!a&&!r&&he(e),s=i||a||r||n,o=s?function baseTimes(e,t){for(var i=-1,a=Array(e);++i<e;)a[i]=t(i);return a}(e.length,String):[],c=o.length;for(var d in e)!t&&!_e.call(e,d)||s&&("length"==d||r&&("offset"==d||"parent"==d)||n&&("buffer"==d||"byteLength"==d||"byteOffset"==d)||isIndex(d,c))||o.push(d);return o}var pe=Object.prototype.hasOwnProperty;function baseKeysIn(e){if(!isObject(e))return function nativeKeysIn(e){var t=[];if(null!=e)for(var i in Object(e))t.push(i);return t}(e);var t=isPrototype(e),i=[];for(var a in e)("constructor"!=a||!t&&pe.call(e,a))&&i.push(a);return i}function keysIn(e){return isArrayLike(e)?arrayLikeKeys(e,!0):baseKeysIn(e)}function toPlainObject(e){return function copyObject(e,t,i,a){var r=!i;i||(i={});for(var n=-1,s=t.length;++n<s;){var o=t[n],c=a?a(i[o],e[o],o,i,e):void 0;void 0===c&&(c=e[o]),r?baseAssignValue(i,o,c):assignValue(i,o,c)}return i}(e,keysIn(e))}function baseMergeDeep(e,t,i,a,r,n,s){var o=safeGet(e,i),c=safeGet(t,i),d=s.get(c);if(d)assignMergeValue(e,i,d);else{var h=n?n(o,c,i+"",e,t,s):void 0,l=void 0===h;if(l){var u=K(c),m=!u&&Q(c),_=!u&&!m&&he(c);h=c,u||m||_?K(o)?h=o:!function isArrayLikeObject(e){return isObjectLike(e)&&isArrayLike(e)}(o)?m?(l=!1,h=function cloneBuffer(e,t){if(t)return e.slice();var i=e.length,a=N?N(i):new e.constructor(i);return e.copy(a),a}(c,!0)):_?(l=!1,h=cloneTypedArray(c,!0)):h=[]:h=function copyArray(e,t){var i=-1,a=e.length;for(t||(t=Array(a));++i<a;)t[i]=e[i];return t}(o):function isPlainObject(e){if(!isObjectLike(e)||baseGetTag(e)!=X)return!1;var t=z(e);if(null===t)return!0;var i=ie.call(t,"constructor")&&t.constructor;return"function"==typeof i&&i instanceof i&&te.call(i)==ae}(c)||F(c)?(h=o,F(o)?h=toPlainObject(o):isObject(o)&&!isFunction(o)||(h=function initCloneObject(e){return"function"!=typeof e.constructor||isPrototype(e)?{}:U(z(e))}(c))):l=!1}l&&(s.set(c,h),r(h,c,a,n,s),s.delete(c)),assignMergeValue(e,i,h)}}function baseMerge(e,t,i,a,r){e!==t&&M(t,(function(n,s){if(r||(r=new Stack),isObject(n))baseMergeDeep(e,t,s,i,baseMerge,a,r);else{var o=a?a(safeGet(e,s),n,s+"",e,t,r):void 0;void 0===o&&(o=n),assignMergeValue(e,s,o)}}),keysIn)}function identity(e){return e}var ve=Math.max;var fe=R?function(e,t){return R(e,"toString",{configurable:!0,enumerable:!1,value:(i=t,function(){return i}),writable:!0});var i}:identity,ge=Date.now;var ye=function shortOut(e){var t=0,i=0;return function(){var a=ge(),r=16-(a-i);if(i=a,r>0){if(++t>=800)return arguments[0]}else t=0;return e.apply(void 0,arguments)}}(fe);function baseRest(e,t){return ye(function overRest(e,t,i){return t=ve(void 0===t?e.length-1:t,0),function(){for(var a=arguments,r=-1,n=ve(a.length-t,0),s=Array(n);++r<n;)s[r]=a[t+r];r=-1;for(var o=Array(t+1);++r<t;)o[r]=a[r];return o[t]=i(s),function apply(e,t,i){switch(i.length){case 0:return e.call(t);case 1:return e.call(t,i[0]);case 2:return e.call(t,i[0],i[1]);case 3:return e.call(t,i[0],i[1],i[2])}return e.apply(t,i)}(e,this,o)}}(e,t,identity),e+"")}var be=function createAssigner(e){return baseRest((function(t,i){var a=-1,r=i.length,n=r>1?i[r-1]:void 0,s=r>2?i[2]:void 0;for(n=e.length>3&&"function"==typeof n?(r--,n):void 0,s&&function isIterateeCall(e,t,i){if(!isObject(i))return!1;var a=typeof t;return!!("number"==a?isArrayLike(i)&&isIndex(t,i.length):"string"==a&&t in i)&&eq(i[t],e)}(i[0],i[1],s)&&(n=r<3?void 0:n,r=1),t=Object(t);++a<r;){var o=i[a];o&&e(t,o,a,n)}return t}))}((function(e,t,i,a){baseMerge(e,t,i,a)}));const createFetcher=()=>{const e=class{_baseUrl;constructor(e){this._baseUrl=e}_resolution=async e=>{if(!e)throw new Error("No response received from the server.");const t=e.headers.get("content-type");if(!t||!t.includes("application/json")){const t=await e.text();throw new Error(`Cannot process response from the server because of unsupported content-type. ${t}.`)}try{return{...await e.json(),url:e.url,code:e.status,ok:e.ok,headers:e.headers}}catch(e){throw new Error(`Cannot process response from the server: ${e}`)}};_rejection=e=>{throw e};_fetcher=(e,t={})=>{t="object"==typeof t?t:{};const i={...t,headers:{"Content-Type":"application/json",..."object"==typeof t.headers?t.headers:{}}};return globalThis.fetch(`${this._baseUrl}${e}`,i).then(this._resolution).catch(this._rejection)};getBaseUrl=()=>this._baseUrl;get=(e,t={})=>this._fetcher(e,{...t,method:"get"});post=(e,t={})=>this._fetcher(e,{...t,method:"post"});put=(e,t={})=>this._fetcher(e,{...t,method:"put"});patch=(e,t={})=>this._fetcher(e,{...t,method:"patch"});delete=(e,t={})=>this._fetcher(e,{...t,method:"delete"})};return{createInstance:t=>{const i=new e(t);return{getBaseUrl:i.getBaseUrl,get:i.get,post:i.post,put:i.put,patch:i.patch,delete:i.delete}}}},we={baseUrl:"https://api.inlive.app",apiVersion:"v1",apiKey:"",expirySeconds:3600},createAuth=async(e=we)=>{be(we,e,((e,t)=>Array.isArray(t)?t:void 0));const t=`${we.baseUrl}/${we.apiVersion}`,i=createFetcher().createInstance(t);if("string"!=typeof we.apiKey||0===we.apiKey.trim().length)throw new Error("API key is required.");const a={expiry_seconds:we.expirySeconds},r=await i.post("/keys/accesstoken",{headers:{Authorization:"Bearer "+we.apiKey},body:JSON.stringify(a),cache:"no-store"}),n=r.data||{};return{url:r.url,headers:r.headers,code:r.code||500,ok:r.ok||!1,message:r.message||"",data:{expirySeconds:we.expirySeconds,accessToken:n.access_token||"",refreshToken:n.refresh_token||""}}},createApi=({fetcher:e,config:t})=>{const i=class{_fetcher;_auth=null;constructor(){this._fetcher=e}createRoom=async(e="",t="",i)=>{const a={};void 0!==i&&(a.bitrates=void 0===i.bitrates?{}:{audio:i.bitrates.audio||0,audio_red:i.bitrates.audioRed||0,video:i.bitrates.video||0,video_high:i.bitrates.videoHigh||0,video_high_pixels:i.bitrates.videoHighPixels||0,video_mid:i.bitrates.videoMid||0,video_mid_pixels:i.bitrates.videoMidPixels||0,video_low:i.bitrates.videoLow||0,video_low_pixels:i.bitrates.videoLowPixels||0,initial_bandwidth:i.bitrates.initialBandwidth||0},a.quality_presets=void 0===i.qualityPresets?{}:{high:{sid:i.qualityPresets.high?.sid||2,tid:i.qualityPresets.high?.tid||2},mid:{sid:i.qualityPresets.mid?.sid||1,tid:i.qualityPresets.mid?.tid||1},low:{sid:i.qualityPresets.low?.sid||0,tid:i.qualityPresets.low?.tid||0}},a.codecs=i.codecs||[],a.pli_interval_ns=i.pliIntervalMS?1e6*i.pliIntervalMS:0,a.empty_room_timeout_ns=i.emptyRoomTimeoutMS?1e6*i.emptyRoomTimeoutMS:0);const r={id:t,name:e,options:a};this._auth=await this._createAuthIfNotSet();const n=await this._fetcher.post("/rooms/create",{headers:{Authorization:"Bearer "+this._auth.accessToken},body:JSON.stringify(r)});if(n.headers.get("x-access-token-expired")){const a=await createAuth({baseUrl:this._auth.baseUrl,apiVersion:this._auth.apiVersion,apiKey:this._auth.refreshToken,expirySeconds:this._auth.expirySeconds});return this._auth=this.setAuth(a),this.createRoom(e,t,i)}const s=n.data||{},o=s.options||{},c=o.bitrates||{},d=o.quality_presets||{};return{url:n.url,headers:n.headers,code:n.code||500,ok:n.ok||!1,message:n.message||"",data:{id:s.id||"",name:s.name||"",options:{bitrates:{audio:c.audio||0,audioRed:c.audio_red||0,video:c.video||0,videoHigh:c.video_high||0,videoHighPixels:c.video_high_pixels||0,videoMid:c.video_mid||0,videoMidPixels:c.video_mid_pixels||0,videoLow:c.video_low||0,videoLowPixels:c.video_low_pixels||0,initialBandwidth:c.initial_bandwidth||0},codecs:o.codecs||[],pliIntervalMS:o.pli_interval_ns/1e6||0,emptyRoomTimeoutMS:o.empty_room_timeout_ns/1e6||0,qualityPresets:{high:{sid:d.high?.sid,tid:d.high?.tid},mid:{sid:d.mid?.sid,tid:d.mid?.tid},low:{sid:d.low?.sid,tid:d.low?.tid}}}}}};getRoom=async e=>{if("string"!=typeof e||0===e.trim().length)throw new Error("Room ID must be a valid string");this._auth=await this._createAuthIfNotSet();const t=await this._fetcher.get(`/rooms/${e}`,{headers:{Authorization:"Bearer "+this._auth.accessToken}});if(t.headers.get("x-access-token-expired")){const t=await createAuth({baseUrl:this._auth.baseUrl,apiVersion:this._auth.apiVersion,apiKey:this._auth.refreshToken,expirySeconds:this._auth.expirySeconds});return this._auth=this.setAuth(t),this.getRoom(e)}const i=t.data||{},a=i.options||{},r=a.bitrates||{},n=a.quality_presets||{};return{url:t.url,headers:t.headers,code:t.code||500,ok:t.ok||!1,message:t.message||"",data:{id:i.id||"",name:i.name||"",options:{bitrates:{audio:r.audio||0,audioRed:r.audio_red||0,video:r.video||0,videoHigh:r.video_high||0,videoHighPixels:r.video_high_pixels||0,videoMid:r.video_mid||0,videoMidPixels:r.video_mid_pixels||0,videoLow:r.video_low||0,videoLowPixels:r.video_low_pixels||0,initialBandwidth:r.initial_bandwidth||0},codecs:a.codecs||[],pliIntervalMS:a.pli_interval_ns/1e6||0,emptyRoomTimeoutMS:a.empty_room_timeout_ns/1e6||0,qualityPresets:{high:{sid:n.high?.sid,tid:n.high?.tid},mid:{sid:n.mid?.sid,tid:n.mid?.tid},low:{sid:n.low?.sid,tid:n.low?.tid}}}}}};registerClient=async(e,t={})=>{if("string"!=typeof e||0===e.trim().length)throw new Error("Room ID must be a valid string");const i={};t.clientId&&t.clientId.trim().length>0&&(i.uid=t.clientId),t.clientName&&t.clientName.trim().length>0&&(i.name=t.clientName),"boolean"==typeof t.enableVAD&&(i.enable_vad=t.enableVAD),this._auth=await this._createAuthIfNotSet();const a={headers:{Authorization:"Bearer "+this._auth.accessToken}};(i.uid||i.name)&&(a.body=JSON.stringify(i));const r=await this._fetcher.post(`/rooms/${e}/register`,a);if(r.headers.get("x-access-token-expired")){const i=await createAuth({baseUrl:this._auth.baseUrl,apiVersion:this._auth.apiVersion,apiKey:this._auth.refreshToken,expirySeconds:this._auth.expirySeconds});return this._auth=this.setAuth(i),this.registerClient(e,t)}const n=r.data||{},s=n.bitrates||{};return{url:r.url,headers:r.headers,code:r.code||500,ok:r.ok||!1,message:r.message||"",data:{clientId:n.client_id||"",clientName:n.name||"",bitrates:{audio:s.audio||0,audioRed:s.audio_red||0,video:s.video||0,videoHigh:s.video_high||0,videoHighPixels:s.video_high_pixels||0,videoMid:s.video_mid||0,videoMidPixels:s.video_mid_pixels||0,videoLow:s.video_low||0,videoLowPixels:s.video_low_pixels||0,initialBandwidth:s.initial_bandwidth||0}}}};getClient=async(e,t)=>{if(0===e.trim().length)throw new Error("Room ID must be a valid string");if(0===t.trim().length)throw new Error("Client ID must be a valid string");const i=await this._fetcher.get(`/rooms/${e}/client/${t}`),a=i.data||{},r=a.events||{};return{url:i.url,headers:i.headers,code:i.code||500,ok:i.ok||!1,message:i.message||"",data:{clientId:a.id||"",clientName:a.name||"",connectionState:a.peer_connection_state||"",iceConnectionState:a.ice_peer_connection_state||"",events:r}}};setClientName=async(e,t,i)=>{if(0===e.trim().length)throw new Error("Room ID must be a valid string");if(0===t.trim().length)throw new Error("Client ID must be a valid string");if(0===i.trim().length)throw new Error("Client name must be a valid string");const a=await this._fetcher.put(`/rooms/${e}/setname/${t}`,{body:JSON.stringify({name:i})}),r=a.data||{},n=r.bitrates||{};return{url:a.url,headers:a.headers,code:a.code||500,ok:a.ok||!1,message:a.message||"",data:{clientId:r.client_id||"",clientName:r.name||"",bitrates:{audio:n.audio||0,audioRed:n.audio_red||0,video:n.video||0,videoHigh:n.video_high||0,videoHighPixels:n.video_high_pixels||0,videoMid:n.video_mid||0,videoMidPixels:n.video_mid_pixels||0,videoLow:n.video_low||0,videoLowPixels:n.video_low_pixels||0,initialBandwidth:n.initial_bandwidth||0}}}};getMetadata=async(e,t)=>{if(0===e.trim().length)throw new Error("Room ID must be a valid string");if(0===t.trim().length)throw new Error("Metadata key must be a valid string");const i=await this._fetcher.get(`/rooms/${e}/getmeta/${t}`),a=i.data||{};return{url:i.url,headers:i.headers,code:i.code||500,ok:i.ok||!1,message:i.message||"",data:a}};setMetadata=async(e,t)=>{if(!e)throw new Error("Room ID is required");if("object"!=typeof t||null===t||Array.isArray(t))throw new TypeError("Metadata must be a valid object");const i=await this._fetcher.post(`/rooms/${e}/setmeta`,{body:JSON.stringify(t)});return{url:i.url,headers:i.headers,code:i.code||500,ok:i.ok||!1,message:i.message||"",data:null}};deleteMetadata=async(e,t)=>{if(0===e.trim().length)throw new Error("Room ID must be a valid string");if(0===t.trim().length)throw new Error("Metadata key must be a valid string");const i=await this._fetcher.delete(`/rooms/${e}/deletemeta/${t}`);return{url:i.url,headers:i.headers,code:i.code||500,ok:i.ok||!1,message:i.message||"",data:null}};sendIceCandidate=async(e,t,i)=>{if(!e||!t||!i)throw new Error("Room ID, client ID, and RTC ice candidate are required");const a=await this._fetcher.post(`/rooms/${e}/candidate/${t}`,{body:JSON.stringify(i.toJSON())});return{url:a.url,headers:a.headers,code:a.code||500,ok:a.ok||!1,message:a.message||"",data:null}};checkNegotiateAllowed=async(e,t)=>{if(!e||!t)throw new Error("Room ID, and client ID are required");const i=await this._fetcher.post(`/rooms/${e}/isallownegotiate/${t}`);return{url:i.url,headers:i.headers,code:i.code||500,ok:i.ok||!1,message:i.message||"",data:null}};negotiateConnection=async(e,t,i)=>{if(!e||!t||!i)throw new Error("Room ID, client ID, and RTC local description are required");const a=await this._fetcher.put(`/rooms/${e}/negotiate/${t}`,{body:JSON.stringify(i.toJSON())}),r=a.data||{};return{url:a.url,headers:a.headers,code:a.code||500,ok:a.ok||!1,message:a.message||"",data:{answer:r.answer}}};setTrackSources=async(e,t,i)=>{if(!e||!t)throw new Error("Room ID, and client ID are required");if(!Array.isArray(i))throw new TypeError("Third parameters must be a valid array of objects with source and track_id properties");const a=await this._fetcher.put(`/rooms/${e}/settracksources/${t}`,{body:JSON.stringify(i)});return{url:a.url,headers:a.headers,code:a.code||500,ok:a.ok||!1,message:a.message||"",data:null}};subscribeTracks=async(e,t,i)=>{if(!e||!t)throw new Error("Room ID, and client ID are required");if(!Array.isArray(i))throw new TypeError("Third parameters must be a valid array of objects with client_id, stream_id, and track_id properties");const a=await this._fetcher.post(`/rooms/${e}/subscribetracks/${t}`,{body:JSON.stringify(i)});return{url:a.url,headers:a.headers,code:a.code||500,ok:a.ok||!1,message:a.message||"",data:null}};leaveRoom=async(e,t,i=!1)=>{if(!e||!t)throw new Error("Room ID, and client ID are required");const a=`/rooms/${e}/leave/${t}`;if(i){const e=navigator.sendBeacon(`${this._fetcher.getBaseUrl()}${a}`);return{code:e?200:500,ok:e,message:e?"OK":"",data:null}}const r=await this._fetcher.delete(`/rooms/${e}/leave/${t}`,{keepalive:!0});return{url:r.url,headers:r.headers,code:r.code||500,ok:r.ok||!1,message:r.message||"",data:null}};endRoom=async e=>{if("string"!=typeof e||0===e.trim().length)throw new Error("Room ID must be a valid string");this._auth=await this._createAuthIfNotSet();const t=await this._fetcher.put(`/rooms/${e}/end`,{headers:{Authorization:"Bearer "+this._auth.accessToken}});if(t.headers.get("x-access-token-expired")){const t=await createAuth({baseUrl:this._auth.baseUrl,apiVersion:this._auth.apiVersion,apiKey:this._auth.refreshToken,expirySeconds:this._auth.expirySeconds});return this._auth=this.setAuth(t),this.endRoom(e)}return{url:t.url,headers:t.headers,code:t.code||500,ok:t.ok||!1,message:t.message||"",data:null}};createDataChannel=async(e,t,i=!0)=>{if("string"!=typeof e||0===e.trim().length)throw new Error("Room ID must be a valid string");if("string"!=typeof e||0===e.trim().length)throw new Error("Channel name must be a valid string");"boolean"!=typeof i&&(i=!0);const a=await this._fetcher.post(`/room/${e}/channel/create`,{body:JSON.stringify({name:t,mode:i})});return{url:a.url,headers:a.headers,code:a.code||500,ok:a.ok||!1,message:a.message||"",data:null}};_createAuthIfNotSet=async()=>{if(!t.api.apiKey&&!this._auth)throw new Error("Auth is not set properly. Use createAuth() and set the response with room.setAuth()");if(this._auth)return this._auth;const e=await createAuth({apiKey:t.api.apiKey});return this.setAuth(e)};setAuth=e=>{const t=new URL(e.url),i=t.pathname.split("/")[1],a={baseUrl:t.origin,apiVersion:i,accessToken:e.data.accessToken,refreshToken:e.data.refreshToken,expirySeconds:e.data.expirySeconds};return this._auth=a,a}};return{createInstance:()=>{const e=new i;return{createRoom:e.createRoom,getRoom:e.getRoom,registerClient:e.registerClient,getClient:e.getClient,setClientName:e.setClientName,getMetadata:e.getMetadata,setMetadata:e.setMetadata,deleteMetadata:e.deleteMetadata,sendIceCandidate:e.sendIceCandidate,checkNegotiateAllowed:e.checkNegotiateAllowed,negotiateConnection:e.negotiateConnection,setTrackSources:e.setTrackSources,subscribeTracks:e.subscribeTracks,leaveRoom:e.leaveRoom,endRoom:e.endRoom,createDataChannel:e.createDataChannel,setAuth:e.setAuth}}}},createEvent=()=>{const e=class{_events;constructor(){this._events={}}emit=(e,t={})=>{if("string"!=typeof e||0===e.trim().length)throw new Error("Valid string for event name is required");const i="object"!=typeof t||null===t||Array.isArray(t)?{data:t}:t,a=this._events[e];if(a instanceof Set)for(const e of a)"function"==typeof e&&e(i)};on=(e,t)=>{if("string"!=typeof e||0===e.trim().length)throw new Error("Valid string for event name is required");if("function"!=typeof t)throw new TypeError("Valid callback function is required");this._events[e]instanceof Set||(this._events[e]=new Set),this._events[e].add(t)};addEventListener=(e,t)=>{if("string"!=typeof e||0===e.trim().length)throw new Error("Valid string for event name is required");if("function"!=typeof t)throw new TypeError("Valid callback function is required");this._events[e]instanceof Set||(this._events[e]=new Set),this._events[e].add(t)};removeEventListener=(e,t)=>{if("string"!=typeof e||0===e.trim().length)throw new Error("Valid string for event name is required");if("function"!=typeof t)throw new TypeError("Valid callback function is required");const i=this._events[e];i instanceof Set&&i.delete(t)}};return{createInstance:()=>{const t=new e;return{emit:t.emit,on:t.on,addEventListener:t.addEventListener,removeEventListener:t.removeEventListener}}}},createStreams=()=>{const e=class{_streams;_drafts;constructor(){class StreamsMap extends Map{}this._streams=new StreamsMap;class DraftStreamsMap extends Map{}this._drafts=new DraftStreamsMap}addStream=(e,t)=>(this._streams.set(e,t),t);removeStream=e=>{const t=this._streams.get(e)||null;return this._streams.delete(e),t};getAllStreams=()=>[...this._streams.values()];getStream=e=>this._streams.get(e)||null;getStreamByTrackId=e=>this.getAllStreams().find((t=>!!t.mediaStream.getTrackById(e)))||null;getTotalStreams=()=>this._streams.size;hasStream=e=>this._streams.has(e);addDraft=(e,t={})=>{this.validateKey(e);const i=this._drafts.get(e)||{};this._drafts.set(e,{clientId:t.clientId||i.clientId||"",name:t.name||i.name||"",origin:t.origin||i.origin||"",source:t.source||i.source||"",mediaStream:t.mediaStream||i.mediaStream||void 0})};getDraft=e=>(this.validateKey(e),this._drafts.get(e)||null);removeDraft=e=>(this.validateKey(e),this._drafts.delete(e));validateKey=e=>{if(0===e.trim().length)throw new Error("Please provide valid string key");return!0};validateStream=e=>!!(e&&e.mediaStream instanceof MediaStream)&&("string"==typeof e.clientId&&0!==e.clientId.trim().length&&("string"==typeof e.name&&("string"==typeof e.origin&&0!==e.origin.trim().length&&("string"==typeof e.source&&0!==e.source.trim().length))))};return{createInstance:()=>{const t=new e;return{addStream:t.addStream,removeStream:t.removeStream,getAllStreams:t.getAllStreams,getStream:t.getStream,getStreamByTrackId:t.getStreamByTrackId,getTotalStreams:t.getTotalStreams,hasStream:t.hasStream,addDraft:t.addDraft,getDraft:t.getDraft,removeDraft:t.removeDraft,validateKey:t.validateKey,validateStream:t.validateStream}}}},createStream=()=>{const e=class extends EventTarget{id;clientId;name;origin;source;mediaStream;audioLevel;lastVoiceActivity;constructor({id:e,clientId:t,name:i,origin:a,source:r,mediaStream:n}){super(),this.id=e,this.clientId=t,this.name=i,this.origin=a,this.source=r,this.mediaStream=n,this.audioLevel=0,this.lastVoiceActivity=0}replaceTrack=e=>{if(!(e instanceof MediaStreamTrack))throw new TypeError("The track must be an instance of MediaStreamTrack");const t=this.mediaStream.getTracks().find((t=>t.kind===e.kind));t&&(this.mediaStream.removeTrack(t),this.mediaStream.addTrack(e))};addVoiceActivity=e=>{if(e.audioLevels)for(const t of e.audioLevels)this.audioLevel=t.audioLevel,this.#e(this.audioLevel),this.lastVoiceActivity=Date.now();else this.audioLevel=0,this.#e(this.audioLevel)};#e=e=>{const t=new CustomEvent("voiceactivity",{detail:{audioLevel:e}});this.dispatchEvent(t)}};return{createInstance:t=>new e(t)}},Se="Chrome",ke="Firefox",Ce="Safari",Te="Opera",Ee="Edge";class VideoObserver{#t;#i;#a;#r;constructor(e){this.#t=e,this.#i=new ResizeObserver(this.#n.bind(this)),this.#a=new IntersectionObserver(this.#s.bind(this)),this.#r={}}#n(e){for(const t of e)if(t.contentBoxSize){if(!(t.target instanceof HTMLVideoElement))continue;if(!(t.target.srcObject instanceof MediaStream))continue;const e=t.target.srcObject.getVideoTracks();if(e.length>0){const i=e[0].id,a=t.contentBoxSize[0],r=a.inlineSize,n=a.blockSize;this.#o(i,r,n)}}}#s(e){for(const t of e){if(!(t.target instanceof HTMLVideoElement))continue;if(!(t.target.srcObject instanceof MediaStream))continue;const e=t.target.srcObject.getVideoTracks();if(e.length>0){const i=e[0].id,a=t.isIntersecting?t.target.offsetWidth:0,r=t.isIntersecting?t.target.offsetHeight:0;this.#o(i,a,r)}}}observe(e){this.#a.observe(e),this.#i.observe(e)}unobserve(e){this.#a.unobserve(e),this.#i.unobserve(e)}#o(e,t,i){0!==t&&0!==i&&(e in this.#r&&(clearTimeout(this.#r[e]),delete this.#r[e]),this.#r[e]=setTimeout((()=>{console.log("video size changed",e,t,i),this.sendVideoSize(e,t,i)}),30),this.sendVideoSize(e,t,i))}sendVideoSize(e,t,i){if("open"===this.#t.readyState){const a={type:"video_size",data:{track_id:e,width:Math.floor(t),height:Math.floor(i)}};console.debug("video size changed",a),this.#t.send(JSON.stringify(a))}else{const listener=()=>{const a={type:"video_size",data:{track_id:e,width:Math.floor(t),height:Math.floor(i)}};console.debug("video size changed",a),this.#t.send(JSON.stringify(a)),this.#t.removeEventListener("open",listener)};this.#t.addEventListener("open",listener)}}}const Ie="internalDataChannelAvailable",Oe="remoteStreamReadyToAdd",Ae=Object.freeze({CHANNEL_OPENED:"channelOpened",CHANNEL_CLOSED:"channelClosed",PEER_OPENED:"peerOpened",PEER_CLOSED:"peerClosed",STREAM_AVAILABLE:"streamAvailable",STREAM_REMOVED:"streamRemoved",META_CHANGED:"metaChanged"});class BandwidthController{#c;#d;#h;#l;#u;#m;#_;#p;constructor({event:e,peer:t}){this.#d=t,this.#c=e,this.#h=0,this.#l=0,this.#u={},this.#m={},this.#_=null,this.#p=null,this.#c.on(Ae.PEER_OPENED,this.#v),this.#c.on(Ae.PEER_CLOSED,this.#f),this.#c.on(Ie,this.#g)}#v=()=>{this.#_&&(clearInterval(this.#_),this.#_=null),this.#_=setInterval(this.#y,3e3)};#f=()=>{this.#_&&(clearInterval(this.#_),this.#_=null)};#g=e=>{this.#p=e};#y=async()=>{const e=this.#d.getPeerConnection();if(Date.now()-this.#l<1e3||!e)return;const t=await e.getStats();this.#l=Date.now();let i=!1,a=!1;for(const[,e]of t)switch(e.type){case"inbound-rtp":this.#b(e);break;case"outbound-rtp":this.#w(e),"cpu"===e.qualityLimitationReason?i=!0:"bandwidth"===e.qualityLimitationReason&&(a=!0);break;case"candidate-pair":void 0!==e.availableOutgoingBitrate&&(this.#h=e.availableOutgoingBitrate)}let r="none";i&&a?r="both":i?r="cpu":a&&(r="bandwidth"),this.#S({available_outgoing_bitrate:this.#h,quality_limitation_reason:r})};#S=async e=>{if(!this.#p)return;if("open"!==this.#p.readyState)return;const t={type:"stats",data:e};this.#p.send(JSON.stringify(t))};#b=e=>{const t=e.trackIdentifier,i=e.bytesReceived||0;if(void 0===this.#u[t]&&(this.#u[t]={source:this.#d.getStreamByTrackId(e.trackIdentifier)?.source||"",kind:e.kind,bytesReceived:0,bitrate:0,lastUpdated:0}),0===this.#u[t].bytesReceived||0===i||0===this.#u[t].lastUpdated)return this.#u[t].bytesReceived=i,void(this.#u[t].lastUpdated=this.#l);const a=i-this.#u[t].bytesReceived;this.#u[t].bytesReceived=i;let r=0;r=8*a/(this.#l-this.#u[t].lastUpdated)*1e3,this.#u[t].bitrate=r,this.#u[t].lastUpdated=this.#l};#w=e=>{const t=e.id;void 0===this.#m[t]&&(this.#m[t]={rid:e.rid||"",kind:e.kind,bytesSent:0,bitrates:0,lastUpdated:0}),0===this.#m[t].bytesSent&&(this.#m[t].bytesSent=e.bytesSent||0,this.#m[t].lastUpdated=this.#l);const i=this.#l-this.#m[t].lastUpdated,a=e.bytesSent||0-this.#m[t].bytesSent,r=Math.floor(8*a/i*1e3);0!==r&&(this.#m[t].bytesSent=e.bytesSent||0,this.#m[t].bitrates=r,this.#m[t].lastUpdated=this.#l)}}const createPeer=({api:e,createStream:t,event:i,streams:a,config:r})=>{const n=class extends EventTarget{_roomId="";_clientId="";_api;_event;_streams;_stream;_peerConnection=null;_bwController;_videoObserver;_pendingObservedVideo;_pendingIceCandidates;pendingNegotiation;constructor(){super(),this._api=e,this._event=i,this._streams=a,this._stream=t(),this._bwController=new BandwidthController({peer:this,event:this._event}),this._videoObserver=null,this._pendingObservedVideo=[],this._pendingIceCandidates=[],this._pendingPreferredCodecs={webcam:[],screen:[],audio:[]},this.pendingNegotiation=!1}connect=async(e,t)=>{this._peerConnection||(this._roomId=e,this._clientId=t,this._peerConnection=new RTCPeerConnection({iceServers:r.webrtc.iceServers}),this._addEventListener(),this._event.emit(Ae.PEER_OPENED,{roomId:this._roomId,clientId:this._clientId}))};disconnect=()=>{if(this._peerConnection){for(const e of this._peerConnection.getTransceivers())e.sender.track&&(e.sender.track.stop(),this._peerConnection.removeTrack(e.sender)),e.stop();this._removeEventListener(),this._peerConnection.close(),this._peerConnection=null,this._roomId="",this._clientId="",this._event.emit(Ae.PEER_CLOSED)}};getClientId=()=>this._clientId;getRoom(){return this._api.getRoom(this._roomId)}getRoomId=()=>this._roomId;getPeerConnection=()=>Object.freeze(this._peerConnection);addStream=(e,t)=>{this._streams.validateKey(e);if(!this._streams.validateStream(t))throw new Error("Please provide valid stream data (clientId, name, origin, source, MediaStream)");const i=this._stream.createInstance({id:e,...t});if(this._streams.addStream(e,i),"local"===i.origin)for(const e of i.mediaStream.getTracks())"video"===e.kind?this._addVideoTrack(e,i):"audio"===e.kind&&this._addAudioTrack(e,i);this._event.emit(Ae.STREAM_AVAILABLE,{stream:i})};removeStream=e=>{this._streams.validateKey(e);const t=this._streams.removeStream(e);return t&&this._event.emit(Ae.STREAM_REMOVED,{stream:t}),t};getAllStreams=()=>this._streams.getAllStreams();getStream=e=>(this._streams.validateKey(e),this._streams.getStream(e));getStreamByTrackId=e=>this._streams.getStreamByTrackId(e);getTotalStreams=()=>this._streams.getTotalStreams();hasStream=e=>(this._streams.validateKey(e),this._streams.hasStream(e));turnOnCamera=async e=>{const t=this.getAllStreams().find((e=>"local"===e.origin&&"media"===e.source));if(!(t&&t.mediaStream instanceof MediaStream))throw new Error("Add local media stream with addStream() before calling this method");const i=t.mediaStream.getVideoTracks()[0];if(e||i){if(e){if("video"!==e.kind)throw new TypeError("Track must be a video track");if("ended"===e.readyState)throw new Error("Cannot use a video track which is not running.");return i?(await this.replaceTrack(i,e),void t.replaceTrack(e)):(this._addVideoTrack(e,t),void await this.negotiate())}if(i){if("ended"===i.readyState)throw new Error("Video capture track has been ended. Use turnOnCamera(newTrack) to replace the ended track with a running one.");this._setTrackEnabled(i,!0)}else;}};turnOnMic=async e=>{const t=this.getAllStreams().find((e=>"local"===e.origin&&"media"===e.source));if(!(t&&t.mediaStream instanceof MediaStream))throw new Error("Add local media stream with addStream() before calling this method");const i=t.mediaStream.getAudioTracks()[0];if(e||i){if(e){if("audio"!==e.kind)throw new TypeError("Track must be an audio track");if("ended"===e.readyState)throw new Error("Cannot use an audio track which is not running.");return i?(await this.replaceTrack(i,e),void t.replaceTrack(e)):(this._addAudioTrack(e,t),void await this.negotiate())}if(i){if("ended"===i.readyState)throw new Error("Audio capture track has been ended. Use turnOnMic(newTrack) to replace the ended track with a running one.");this._setTrackEnabled(i,!0)}else;}};turnOffCamera=e=>{const t=this._streams.getAllStreams().find((e=>"local"===e.origin&&"media"===e.source));if(!(t&&t.mediaStream instanceof MediaStream))throw new Error("Add local media stream with addStream() before calling this method");const i=t?.mediaStream.getVideoTracks()[0];i&&"ended"!==i.readyState&&(e?this._stopTrack(i):this._setTrackEnabled(i,!1))};turnOffMic=e=>{const t=this._streams.getAllStreams().find((e=>"local"===e.origin&&"media"===e.source));if(!(t&&t.mediaStream instanceof MediaStream))throw new Error("Add local media stream with addStream() before calling this method");const i=t?.mediaStream.getAudioTracks()[0];i&&"ended"!==i.readyState&&(e?this._stopTrack(i):this._setTrackEnabled(i,!1))};replaceTrack=async(e,t)=>{if(this._peerConnection){if(!(t instanceof MediaStreamTrack))throw new TypeError("Track must be an instance of MediaStreamTrack");for(const i of this._peerConnection.getSenders())if(i.track&&i.track.kind===e.kind&&i.track.id===e.id)try{await i.replaceTrack(t)}catch(e){throw console.error(e),e}}};observeVideo=e=>{this._videoObserver?this._videoObserver.observe(e):this._pendingObservedVideo.push(e)};updateVideoSize=(e,t,i)=>{this._videoObserver?.sendVideoSize(e,t,i)};unobserveVideo=e=>{this._videoObserver&&this._videoObserver.unobserve(e)};_addEventListener=()=>{this._peerConnection&&(this._peerConnection.addEventListener("iceconnectionstatechange",this._onIceConnectionStateChange),this._peerConnection.addEventListener("icecandidate",this._onIceCandidate),this._peerConnection.addEventListener("track",this._onTrack),this._peerConnection.addEventListener("datachannel",this._onDataChannel),this._event.on(Ae.STREAM_AVAILABLE,(async({stream:e})=>{"local"===e.origin&&await this.negotiate()})),this._event.on(Ae.STREAM_REMOVED,(async({stream:e})=>{"local"===e.origin&&await this.negotiate()})),this._event.on(Oe,(e=>{if(!this.hasStream(e.mediaStream.id)){e.mediaStream.addEventListener("removetrack",(e=>{const t=e.target;t instanceof MediaStream&&this.hasStream(t.id)&&0===t.getTracks().length&&this.removeStream(t.id)}));for(const t of e.mediaStream.getTracks())t.addEventListener("ended",(()=>{this.removeStream(e.mediaStream.id)}));this.addStream(e.mediaStream.id,e)}})),window.addEventListener("beforeunload",this._onBeforeUnload))};_removeEventListener=()=>{this._peerConnection&&(this._peerConnection.removeEventListener("iceconnectionstatechange",this._onIceConnectionStateChange),this._peerConnection.removeEventListener("icecandidate",this._onIceCandidate),this._peerConnection.removeEventListener("track",this._onTrack),this._peerConnection.removeEventListener("datachannel",this._onDataChannel),window.removeEventListener("beforeunload",this._onBeforeUnload))};_setTrackEnabled=(e,t=!0)=>{if(this._peerConnection){if(!(e instanceof MediaStreamTrack))throw new TypeError("Track must be an instance of MediaStreamTrack");for(const i of this._peerConnection.getTransceivers()){const a=i.sender.track;a&&(a.kind===e.kind&&a.id===e.id&&(a.enabled=t))}}};_stopTrack=e=>{if(this._peerConnection){if(!(e instanceof MediaStreamTrack))throw new TypeError("Track must be an instance of MediaStreamTrack");for(const t of this._peerConnection.getTransceivers()){const i=t.sender.track;i&&(i.kind===e.kind&&i.id===e.id&&(i.stop(),e.stop()))}}};_restartNegotiation=async()=>{if(!this._peerConnection)return;if((await this._api.checkNegotiateAllowed(this._roomId,this._clientId)).ok)try{const e=await this._peerConnection.createOffer({iceRestart:!0});if(await this._peerConnection.setLocalDescription(e),!this._peerConnection.localDescription)throw new Error("Failed to set the local description on restart negotiation");await this._api.negotiateConnection(this._roomId,this._clientId,this._peerConnection.localDescription)}catch(e){console.error(e)}else this.pendingNegotiation=!0};_addAudioTrack=(e,t)=>{if(!(e instanceof MediaStreamTrack))throw new TypeError("Track must be an instance of MediaStreamTrack");if(!(t&&t.mediaStream instanceof MediaStream))throw new Error("Provide stream instance for track destination");if("audio"===e.kind){const i=t.mediaStream.getAudioTracks()[0];i?e.id!==i.id&&t.replaceTrack(e):t.mediaStream.addTrack(e);const a=this._addAudioTransceiver(t);e.addEventListener("ended",(()=>{this._peerConnection&&a?.sender.track&&(a.sender.track.stop(),this._peerConnection.removeTrack(a.sender),this.removeStream(t.id))}))}};_addVideoTrack=(e,t)=>{if(!(e instanceof MediaStreamTrack))throw new TypeError("Track must be an instance of MediaStreamTrack");if(!(t&&t.mediaStream instanceof MediaStream))throw new Error("Provide stream instance for track destination");if("video"===e.kind){const i=t.mediaStream.getVideoTracks()[0];i?e.id!==i.id&&t.replaceTrack(e):t.mediaStream.addTrack(e);const a=this._addVideoTransceiver(t);e.addEventListener("ended",(()=>{this._peerConnection&&a?.sender.track&&(a.sender.track.stop(),this._peerConnection.removeTrack(a.sender),this.removeStream(t.id))}))}};_addAudioTransceiver=e=>{if(!this._peerConnection)return;const t=window.RTCRtpTransceiver&&"setCodecPreferences"in window.RTCRtpTransceiver.prototype,i=e.mediaStream.getAudioTracks()[0];if(i){const a=this._peerConnection.addTransceiver(i,{direction:"sendonly",streams:[e.mediaStream],sendEncodings:[{priority:"high"}]}),n=RTCRtpReceiver.getCapabilities("audio")?.codecs||[],s=[];if("media"===e.source&&n.length>0)if(r.media.microphone.audioCodecs.length>0)for(const e of r.media.microphone.audioCodecs)for(const t of n)t.mimeType.toLowerCase()===e.toLowerCase()&&s.push(t);else{for(const e of n)"audio/red"===e.mimeType&&s.push(e);for(const e of n)"audio/opus"===e.mimeType&&s.push(e)}for(const e of n)["audio/red","audio/opus"].includes(e.mimeType)||s.push(e);if(t)a.setCodecPreferences(s);else for(const e of s)this._pendingPreferredCodecs.audio.push(e);return a}};_addVideoTransceiver=e=>{if(!this._peerConnection)return;const t="media"===e.source?"webcam":"screen",i=window.RTCRtpTransceiver&&"setCodecPreferences"in window.RTCRtpTransceiver.prototype,a=(navigator.userAgent.includes(Se)&&navigator.userAgent.includes(Ee)?Ee:navigator.userAgent.includes(Se)&&navigator.userAgent.includes(Te)?Te:navigator.userAgent.includes(Se)?Se:navigator.userAgent.includes(ke)?ke:navigator.userAgent.includes(Ce)?Ce:navigator.userAgent.includes("IE")?"IE":null)||"",n=e.mediaStream.getVideoTracks()[0],s=[];if(n){const o=RTCRtpReceiver.getCapabilities("video")?.codecs||[];for(const e of r.media[t].videoCodecs)for(const t of o)t.mimeType.toLowerCase()===e.toLowerCase()&&s.push(t);for(const e of o)r.media[t].videoCodecs.includes(e.mimeType)||s.push(e);const c={direction:"sendonly",streams:[e.mediaStream],sendEncodings:[{maxBitrate:r.media[t].bitrates.high,maxFramerate:r.media[t].maxFramerate}]},d=r.media[t].svc&&a!==ke,h=r.media[t].simulcast;if(h){let e=[{rid:"high",maxFramerate:r.media[t].maxFramerate,maxBitrate:r.media[t].bitrates.high},{rid:"mid",scaleResolutionDownBy:2,maxFramerate:r.media[t].maxFramerate,maxBitrate:r.media[t].bitrates.mid},{rid:"low",scaleResolutionDownBy:4,maxFramerate:r.media[t].maxFramerate,maxBitrate:r.media[t].bitrates.low}];c.sendEncodings=e}if(d)if(h&&Array.isArray(c.sendEncodings)){const e=c.sendEncodings.map((e=>({...e,scalabilityMode:r.media[t].scalabilityMode})));c.sendEncodings=e}else{const e={maxBitrate:r.media[t].bitrates.high,scalabilityMode:r.media[t].scalabilityMode,maxFramerate:r.media[t].maxFramerate};c.sendEncodings=[e]}const l=this._peerConnection.addTransceiver(n,c);if(i)l.setCodecPreferences(s);else for(const e of s){const i=this._pendingPreferredCodecs[t];Array.isArray(i)&&i.push(e)}return l}};_onIceConnectionStateChange=async()=>{if(!this._peerConnection)return;const{iceConnectionState:e}=this._peerConnection;console.log("ice connection state changed to",e),"failed"===e&&await this._restartNegotiation()};negotiate=async()=>{if(!this._roomId||!this._clientId)return;if(!this._peerConnection)return;if((await this._api.checkNegotiateAllowed(this._roomId,this._clientId)).ok)try{const e=await this._peerConnection.createOffer();if(await this._peerConnection.setLocalDescription(e),!this._peerConnection.localDescription)throw new Error("Failed to set the local description on negotiate");const t=await this._api.negotiateConnection(this._roomId,this._clientId,this._peerConnection.localDescription);if(!t.ok||!t.data)throw new Error("Failed to get a negotiate response");const{answer:i}=t.data,a=new RTCSessionDescription(i);await this._peerConnection.setRemoteDescription(a),this.pendingNegotiation=!0;for(const e of this._pendingIceCandidates)await this._peerConnection.addIceCandidate(e)}catch(e){console.error(e)}else this.pendingNegotiation=!0};addIceCandidate=async e=>{if(this._peerConnection)if(this._peerConnection.remoteDescription)try{await this._peerConnection.addIceCandidate(e)}catch(e){console.error(e)}else this._pendingIceCandidates.push(e)};startViewOnly=async()=>{this._peerConnection&&(this._peerConnection.addTransceiver("video",{direction:"sendrecv"}),this._peerConnection.addTransceiver("audio",{direction:"sendrecv"}),this.negotiate())};_onIceCandidate=async e=>{if(!this._roomId||!this._clientId)return;const{candidate:t}=e;t&&await this._api.sendIceCandidate(this._roomId,this._clientId,t)};_onTrack=async e=>{const t=e.streams.find((e=>!0===e.active));if(!(t instanceof MediaStream))return;const i=this._streams.getDraft(t.id);if(i){const e={...i,mediaStream:t};this._streams.validateStream(e)&&this._event.emit(Oe,e)}else this._streams.addDraft(t.id,{clientId:"",name:"",origin:"remote",source:"",mediaStream:t})};_onDataChannel=e=>{if("internal"===e.channel.label){const t=e.channel;this._event.emit(Ie,t),this._videoObserver=new VideoObserver(t);for(const e of this._pendingObservedVideo)this._videoObserver.observe(e);t.addEventListener("message",(e=>{const t=JSON.parse(e.data);"vad_started"!==t.type&&"vad_ended"!==t.type||this._onVoiceActivity(t.data)}))}};_onBeforeUnload=async()=>{this._roomId&&this._clientId&&(this._api.leaveRoom(this._roomId,this._clientId,!0),this.disconnect())};_onVoiceActivity=e=>{const t=new CustomEvent("voiceactivity",{detail:{voiceActivity:e}});this.dispatchEvent(t);const i=this._streams.getStream(e.streamID);i&&i.addVoiceActivity(e)}};return{createInstance:()=>{const e=new n;return{connect:e.connect,disconnect:e.disconnect,getClientId:e.getClientId,getRoom:e.getRoom,getRoomId:e.getRoomId,getPeerConnection:e.getPeerConnection,addStream:e.addStream,addIceCandidate:e.addIceCandidate,removeStream:e.removeStream,getAllStreams:e.getAllStreams,getStream:e.getStream,getStreamByTrackId:e.getStreamByTrackId,getTotalStreams:e.getTotalStreams,hasStream:e.hasStream,turnOnCamera:e.turnOnCamera,turnOnMic:e.turnOnMic,turnOffCamera:e.turnOffCamera,turnOffMic:e.turnOffMic,replaceTrack:e.replaceTrack,observeVideo:e.observeVideo,updateVideoSize:e.updateVideoSize,unobserveVideo:e.unobserveVideo,negotiate:e.negotiate,startViewOnly:e.startViewOnly,pendingNegotiation:e.pendingNegotiation}}}},Le={PEER_CLOSED:"peerClosed",NOT_FOUND:"notfound",RECONNECT:"reconnect",TIMEOUT:"timeout"},createChannel=({api:e,event:t,peer:i,streams:a})=>{const r=class{_roomId="";_clientId="";_baseUrl;_api;_event;_peer;_streams;_channel=null;_startTime;_reconnecting;constructor(r){this._baseUrl=r,this._api=e,this._event=t,this._peer=i,this._streams=a,this._startTime=0,this._reconnecting=!1,this._event.on(Ae.PEER_OPENED,this._onPeerOpened),this._event.on(Ae.PEER_CLOSED,this._onPeerClosed)}connect=(e,t)=>{if(this._channel)return;this._roomId=e,this._clientId=t;const i=new EventSource(`${this._baseUrl}/rooms/${this._roomId}/events/${this._clientId}`);this._startTime=Date.now(),this._channel=i,this._addEventListener()};disconnect=()=>{this._channel&&(this._removeEventListener(),this._channel.close(),this._channel=null)};_addEventListener=()=>{this._channel&&(this._channel.addEventListener("open",this._onOpen),this._channel.addEventListener("error",this._onError),this._channel.addEventListener("candidate",this._onCandidate),this._channel.addEventListener("offer",this._onOffer),this._channel.addEventListener("tracks_added",this._onTracksAdded),this._channel.addEventListener("tracks_available",this._onTracksAvailable),this._channel.addEventListener("meta_changed",this._onMetaChanged),this._channel.addEventListener("allowed_renegotation",this._onAllowedRenegotiation))};_removeEventListener=()=>{this._channel&&(this._channel.removeEventListener("open",this._onOpen),this._channel.removeEventListener("error",this._onError),this._channel.removeEventListener("candidate",this._onCandidate),this._channel.removeEventListener("offer",this._onOffer),this._channel.removeEventListener("tracks_added",this._onTracksAdded),this._channel.removeEventListener("tracks_available",this._onTracksAvailable),this._channel.removeEventListener("meta_changed",this._onMetaChanged),this._channel.removeEventListener("allowed_renegotation",this._onAllowedRenegotiation))};_reconnect=()=>{this._channel?.readyState!=