@axonkit/client-sdk-js 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).AxonKit={})}(this,function(e){"use strict";var t,i={exports:{}};function r(){if(t)return i.exports;t=1;var e,r="object"==typeof Reflect?Reflect:null,s=r&&"function"==typeof r.apply?r.apply:function(e,t,i){return Function.prototype.apply.call(e,t,i)};e=r&&"function"==typeof r.ownKeys?r.ownKeys:Object.getOwnPropertySymbols?function(e){return Object.getOwnPropertyNames(e).concat(Object.getOwnPropertySymbols(e))}:function(e){return Object.getOwnPropertyNames(e)};var a=Number.isNaN||function(e){return e!=e};function n(){n.init.call(this)}i.exports=n,i.exports.once=function(e,t){return new Promise(function(i,r){function s(i){e.removeListener(t,a),r(i)}function a(){"function"==typeof e.removeListener&&e.removeListener("error",s),i([].slice.call(arguments))}g(e,t,a,{once:!0}),"error"!==t&&function(e,t,i){"function"==typeof e.on&&g(e,"error",t,i)}(e,s,{once:!0})})},n.EventEmitter=n,n.prototype._events=void 0,n.prototype._eventsCount=0,n.prototype._maxListeners=void 0;var o=10;function c(e){if("function"!=typeof e)throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof e)}function d(e){return void 0===e._maxListeners?n.defaultMaxListeners:e._maxListeners}function p(e,t,i,r){var s,a,n,o;if(c(i),void 0===(a=e._events)?(a=e._events=Object.create(null),e._eventsCount=0):(void 0!==a.newListener&&(e.emit("newListener",t,i.listener?i.listener:i),a=e._events),n=a[t]),void 0===n)n=a[t]=i,++e._eventsCount;else if("function"==typeof n?n=a[t]=r?[i,n]:[n,i]:r?n.unshift(i):n.push(i),(s=d(e))>0&&n.length>s&&!n.warned){n.warned=!0;var p=new Error("Possible EventEmitter memory leak detected. "+n.length+" "+String(t)+" listeners added. Use emitter.setMaxListeners() to increase limit");p.name="MaxListenersExceededWarning",p.emitter=e,p.type=t,p.count=n.length,o=p,console&&console.warn&&console.warn(o)}return e}function l(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,0===arguments.length?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function h(e,t,i){var r={fired:!1,wrapFn:void 0,target:e,type:t,listener:i},s=l.bind(r);return s.listener=i,r.wrapFn=s,s}function u(e,t,i){var r=e._events;if(void 0===r)return[];var s=r[t];return void 0===s?[]:"function"==typeof s?i?[s.listener||s]:[s]:i?function(e){for(var t=new Array(e.length),i=0;i<t.length;++i)t[i]=e[i].listener||e[i];return t}(s):f(s,s.length)}function m(e){var t=this._events;if(void 0!==t){var i=t[e];if("function"==typeof i)return 1;if(void 0!==i)return i.length}return 0}function f(e,t){for(var i=new Array(t),r=0;r<t;++r)i[r]=e[r];return i}function g(e,t,i,r){if("function"==typeof e.on)r.once?e.once(t,i):e.on(t,i);else{if("function"!=typeof e.addEventListener)throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type '+typeof e);e.addEventListener(t,function s(a){r.once&&e.removeEventListener(t,s),i(a)})}}return Object.defineProperty(n,"defaultMaxListeners",{enumerable:!0,get:function(){return o},set:function(e){if("number"!=typeof e||e<0||a(e))throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received '+e+".");o=e}}),n.init=function(){void 0!==this._events&&this._events!==Object.getPrototypeOf(this)._events||(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},n.prototype.setMaxListeners=function(e){if("number"!=typeof e||e<0||a(e))throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received '+e+".");return this._maxListeners=e,this},n.prototype.getMaxListeners=function(){return d(this)},n.prototype.emit=function(e){for(var t=[],i=1;i<arguments.length;i++)t.push(arguments[i]);var r="error"===e,a=this._events;if(void 0!==a)r=r&&void 0===a.error;else if(!r)return!1;if(r){var n;if(t.length>0&&(n=t[0]),n instanceof Error)throw n;var o=new Error("Unhandled error."+(n?" ("+n.message+")":""));throw o.context=n,o}var c=a[e];if(void 0===c)return!1;if("function"==typeof c)s(c,this,t);else{var d=c.length,p=f(c,d);for(i=0;i<d;++i)s(p[i],this,t)}return!0},n.prototype.addListener=function(e,t){return p(this,e,t,!1)},n.prototype.on=n.prototype.addListener,n.prototype.prependListener=function(e,t){return p(this,e,t,!0)},n.prototype.once=function(e,t){return c(t),this.on(e,h(this,e,t)),this},n.prototype.prependOnceListener=function(e,t){return c(t),this.prependListener(e,h(this,e,t)),this},n.prototype.removeListener=function(e,t){var i,r,s,a,n;if(c(t),void 0===(r=this._events))return this;if(void 0===(i=r[e]))return this;if(i===t||i.listener===t)0===--this._eventsCount?this._events=Object.create(null):(delete r[e],r.removeListener&&this.emit("removeListener",e,i.listener||t));else if("function"!=typeof i){for(s=-1,a=i.length-1;a>=0;a--)if(i[a]===t||i[a].listener===t){n=i[a].listener,s=a;break}if(s<0)return this;0===s?i.shift():function(e,t){for(;t+1<e.length;t++)e[t]=e[t+1];e.pop()}(i,s),1===i.length&&(r[e]=i[0]),void 0!==r.removeListener&&this.emit("removeListener",e,n||t)}return this},n.prototype.off=n.prototype.removeListener,n.prototype.removeAllListeners=function(e){var t,i,r;if(void 0===(i=this._events))return this;if(void 0===i.removeListener)return 0===arguments.length?(this._events=Object.create(null),this._eventsCount=0):void 0!==i[e]&&(0===--this._eventsCount?this._events=Object.create(null):delete i[e]),this;if(0===arguments.length){var s,a=Object.keys(i);for(r=0;r<a.length;++r)"removeListener"!==(s=a[r])&&this.removeAllListeners(s);return this.removeAllListeners("removeListener"),this._events=Object.create(null),this._eventsCount=0,this}if("function"==typeof(t=i[e]))this.removeListener(e,t);else if(void 0!==t)for(r=t.length-1;r>=0;r--)this.removeListener(e,t[r]);return this},n.prototype.listeners=function(e){return u(this,e,!0)},n.prototype.rawListeners=function(e){return u(this,e,!1)},n.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):m.call(e,t)},n.prototype.listenerCount=m,n.prototype.eventNames=function(){return this._eventsCount>0?e(this._events):[]},i.exports}var s,a=r();class n extends a.EventEmitter{}e.LogLevel=void 0,(s=e.LogLevel||(e.LogLevel={}))[s.TRACE=0]="TRACE",s[s.DEBUG=1]="DEBUG",s[s.INFO=2]="INFO",s[s.WARN=3]="WARN",s[s.ERROR=4]="ERROR",s[s.SILENT=5]="SILENT";let o,c,d=e.LogLevel.INFO;function p(t){const i=`[AxonKit:${t}]`,r=()=>{};return new Proxy({},{get(t,s){const a={trace:[e.LogLevel.TRACE,console.debug],debug:[e.LogLevel.DEBUG,console.debug],info:[e.LogLevel.INFO,console.info],warn:[e.LogLevel.WARN,console.warn],error:[e.LogLevel.ERROR,console.error]}[s];if(!a)return;const[n,p]=a;return d>n?r:o||c?function(t,r){return(s,...a)=>{if(d>t)return;const n=`${i} ${s}`;if(c)try{c(t,n,a.length>0?{args:a}:{})}catch{}if(o){const i=e.LogLevel[t].toLowerCase();o[i](n,...a)}else r(n,...a)}}(n,p):p.bind(console,i)}})}var l;e.ErrorCode=void 0,(l=e.ErrorCode||(e.ErrorCode={}))[l.OK=200]="OK",l[l.BadRequest=400]="BadRequest",l[l.Unauthorized=401]="Unauthorized",l[l.Forbidden=403]="Forbidden",l[l.NotFound=404]="NotFound",l[l.Conflict=409]="Conflict",l[l.InternalError=500]="InternalError";class h extends Error{constructor(e,t,i){super(t),this.name="AxonError",this.code=e,this.logId=i}static fromStatus(t,i,r){const s=Object.values(e.ErrorCode).includes(t)?t:e.ErrorCode.InternalError;return new h(s,i,r)}}class u extends Error{constructor(e,t){super(e),this.name="ConnectionError",this.status=t}}class m extends Error{constructor(e="Request timed out"){super(e),this.name="TimeoutError"}}const f=p("SignalClient");function g(e){return e&&"iceParameters"in e&&!("participant"in e)&&!e.fullReconnect}class v{constructor(){this.nodeId="",this.logId=""}get currentNodeId(){return this.nodeId}get currentLogId(){return this.logId}async join(e,t){const i=new URL(`${e}/rtc/join`);t.room.name&&i.searchParams.set("room",t.room.name);const r=i.toString();f.info(`Joining room at ${r}`);const s=await fetch(r,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({payload:JSON.stringify(t)})});if(!s.ok){const e=await s.text().catch(()=>"");throw new u(`Join failed: ${s.status} ${s.statusText} ${e}`,s.status)}const a=await s.json();return this.logId=s.headers.get("X-Log-Id")??"",g(a)?f.info("Received ICE restart response"):(this.nodeId=a.serverInfo.nodeId,f.info(`Joined room ${a.room.name}, nodeId=${this.nodeId}`)),{response:a,logId:this.logId}}async connect(e,t,i){const r=new URL(`${e}/rtc/connect`);i&&r.searchParams.set("room",i);const s=r.toString();f.info(`Connecting transports at ${s}`);const a=await fetch(s,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({payload:JSON.stringify(t)})});if(!a.ok){const e=await a.text().catch(()=>"");throw new u(`Connect failed: ${a.status} ${a.statusText} ${e}`,a.status)}f.info("Transport connect succeeded")}}let b=0;const _="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function y(){return b++,`${function(e){let t="";for(let i=0;i<e;i++)t+=_[Math.floor(62*Math.random())];return t}(6)}${b.toString(36)}`}const S="\r\n",w=new Uint8Array([13,10]),k="AXON/1.0",T=new TextEncoder,C=new TextDecoder;var P;function R(e,t){for(let i=t;i<e.byteLength-1;i++)if(13===e[i]&&10===e[i+1])return i;return-1}function E(e){let t;switch(e.type){case P.REQ:t=`REQ ${e.method} ${e.logId}`;break;case P.RES:t=`RES ${e.logId} ${e.status}`;break;case P.MSG:t=e.logId?`MSG ${e.method} ${e.logId}`:`MSG ${e.method}`}const i=[T.encode(t),w];return e.headers&&Object.keys(e.headers).length>0&&i.push(function(e){let t=`${k}${S}`;for(const[i,r]of Object.entries(e))t+=`${i}: ${r}${S}`;return t+=S,T.encode(t)}(e.headers)),e.body&&e.body.byteLength>0&&i.push(e.body),function(...e){let t=0;for(const i of e)t+=i.byteLength;const i=new Uint8Array(t);let r=0;for(const t of e)i.set(t,r),r+=t.byteLength;return i}(...i)}function D(e){if(!e.body||0===e.body.byteLength)return;const t=C.decode(e.body);return JSON.parse(t)}function x(e){return T.encode(JSON.stringify(e))}!function(e){e.REQ="REQ",e.RES="RES",e.MSG="MSG"}(P||(P={}));const I=p("RPCClient");class M extends n{constructor(){super(...arguments),this.sendDC=null,this.pending=new Map,this.requestHandlers=new Map,this.notificationHandlers=new Map,this.closed=!1,this.lastSentAt=0}bind(e,t){this.sendDC=e,t.on("message",e=>{this.handleMessage(e)}),t.on("close",()=>{I.warn("Receive DataChannel closed")})}async request(e,t,i=1e4){if(this.closed||!this.sendDC)throw new Error("RPCClient is closed or not bound");const r=y(),s={type:P.REQ,method:e,logId:r,body:t?x(t):void 0};return"ping"!==e&&I.debug(`REQ ${e} logId=${r} body=${JSON.stringify(t)}`),new Promise((t,a)=>{const n=setTimeout(()=>{this.pending.delete(r),a(new m(`RPC ${e} timed out after ${i}ms`))},i);this.pending.set(r,{resolve:t,reject:a,timer:n,method:e});const o=E(s);this.sendDC.send(o),this.lastSentAt=Date.now()})}respond(e,t,i,r){if(this.closed||!this.sendDC)return;const s={type:P.RES,logId:e,status:t,headers:r,body:i?x(i):void 0};I.debug(`RES logId=${e} status=${t} body=${JSON.stringify(i)}`),this.sendDC.send(E(s)),this.lastSentAt=Date.now()}notify(e,t){if(this.closed||!this.sendDC)return;const i={type:P.MSG,method:e,body:t?x(t):void 0};this.sendDC.send(E(i)),this.lastSentAt=Date.now()}onRequest(e,t){this.requestHandlers.set(e,t)}onNotification(e,t){this.notificationHandlers.set(e,t)}close(){this.closed=!0;for(const[e,t]of this.pending)clearTimeout(t.timer),t.reject(new Error("RPCClient closed")),this.pending.delete(e);this.requestHandlers.clear(),this.notificationHandlers.clear(),this.sendDC=null}handleMessage(e){try{const t=function(e){const t=e instanceof Uint8Array?e:new Uint8Array(e),i=R(t,0);if(i<0)throw new Error("Invalid Axon message: no CRLF found");const r=C.decode(t.subarray(0,i)),s=r.split(" ");if(s.length<2)throw new Error(`Invalid Axon message first line: ${r}`);const a={type:s[0]};switch(a.type){case P.REQ:a.method=s[1],a.logId=s[2];break;case P.RES:a.logId=s[1],a.status=parseInt(s[2],10);break;case P.MSG:a.method=s[1],a.logId=s.length>2?s[2]:void 0;break;default:throw new Error(`Unknown message type: ${s[0]}`)}let n=i+2;if(C.decode(t.subarray(n,Math.min(n+8,t.byteLength))).startsWith(k))for(a.headers={},n+=10;n<t.byteLength;){const e=R(t,n);if(e<0)break;if(e===n){n+=2;break}const i=C.decode(t.subarray(n,e)),r=i.indexOf(": ");r>0&&(a.headers[i.substring(0,r)]=i.substring(r+2)),n=e+2}return n<t.byteLength&&(a.body=t.subarray(n)),a}("string"==typeof e?(new TextEncoder).encode(e):new Uint8Array(e));switch(t.type){case P.RES:this.handleResponse(t);break;case P.REQ:this.handleIncomingRequest(t);break;case P.MSG:this.handleNotification(t)}}catch(e){I.error("Failed to handle message",e),this.emit("error",e instanceof Error?e:new Error(String(e)))}}handleResponse(e){const t=e.logId;if(!t)return;const i=this.pending.get(t);if(!i)return void I.warn(`Received response for unknown logId=${t}`);if(this.pending.delete(t),clearTimeout(i.timer),e.status&&e.status>=400){const r=e.headers?.Error??`RPC error status=${e.status}`;return void i.reject(h.fromStatus(e.status,r,t))}const r=D(e);"ping"!==i.method&&I.debug(`RES ${i.method} logId=${t} status=${e.status} body=${JSON.stringify(r)}`),i.resolve(r)}async handleIncomingRequest(e){const t=e.method;if(!t)return;const i=this.requestHandlers.get(t);if(!i)return I.warn(`No handler for server request: ${t}`),void(e.logId&&this.respond(e.logId,404,void 0,{Error:"No handler"}));try{const r=D(e);I.debug(`Incoming REQ ${t} logId=${e.logId} body=${JSON.stringify(r)}`);const s=await i(r);e.logId&&this.respond(e.logId,200,s)}catch(i){I.error(`Handler error for ${t}`,i),e.logId&&this.respond(e.logId,500,void 0,{Error:i instanceof Error?i.message:String(i)})}}handleNotification(e){const t=e.method;if(!t)return;const i=this.notificationHandlers.get(t);if(i)try{const r=D(e);I.debug(`MSG ${t} logId=${e.logId} body=${JSON.stringify(r)}`),i(r)}catch(e){I.error(`Notification handler error for ${t}`,e)}else I.debug(`No handler for notification: ${t}`)}}var L,O,A,j,F,N={},$={exports:{}};function U(){if(O)return L;O=1;var e=1e3,t=60*e,i=60*t,r=24*i,s=7*r,a=365.25*r;function n(e,t,i,r){var s=t>=1.5*i;return Math.round(e/i)+" "+r+(s?"s":"")}return L=function(o,c){c=c||{};var d=typeof o;if("string"===d&&o.length>0)return function(n){if((n=String(n)).length>100)return;var o=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(n);if(!o)return;var c=parseFloat(o[1]);switch((o[2]||"ms").toLowerCase()){case"years":case"year":case"yrs":case"yr":case"y":return c*a;case"weeks":case"week":case"w":return c*s;case"days":case"day":case"d":return c*r;case"hours":case"hour":case"hrs":case"hr":case"h":return c*i;case"minutes":case"minute":case"mins":case"min":case"m":return c*t;case"seconds":case"second":case"secs":case"sec":case"s":return c*e;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return c;default:return}}(o);if("number"===d&&isFinite(o))return c.long?function(s){var a=Math.abs(s);if(a>=r)return n(s,a,r,"day");if(a>=i)return n(s,a,i,"hour");if(a>=t)return n(s,a,t,"minute");if(a>=e)return n(s,a,e,"second");return s+" ms"}(o):function(s){var a=Math.abs(s);if(a>=r)return Math.round(s/r)+"d";if(a>=i)return Math.round(s/i)+"h";if(a>=t)return Math.round(s/t)+"m";if(a>=e)return Math.round(s/e)+"s";return s+"ms"}(o);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(o))}}function B(){return F||(F=1,function(e,t){t.formatArgs=function(t){if(t[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+t[0]+(this.useColors?"%c ":" ")+"+"+e.exports.humanize(this.diff),!this.useColors)return;const i="color: "+this.color;t.splice(1,0,i,"color: inherit");let r=0,s=0;t[0].replace(/%[a-zA-Z%]/g,e=>{"%%"!==e&&(r++,"%c"===e&&(s=r))}),t.splice(s,0,i)},t.save=function(e){try{e?t.storage.setItem("debug",e):t.storage.removeItem("debug")}catch(e){}},t.load=function(){let e;try{e=t.storage.getItem("debug")||t.storage.getItem("DEBUG")}catch(e){}!e&&"undefined"!=typeof process&&"env"in process&&(e=process.env.DEBUG);return e},t.useColors=function(){if("undefined"!=typeof window&&window.process&&("renderer"===window.process.type||window.process.__nwjs))return!0;if("undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))return!1;let e;return"undefined"!=typeof document&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||"undefined"!=typeof window&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||"undefined"!=typeof navigator&&navigator.userAgent&&(e=navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/))&&parseInt(e[1],10)>=31||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)},t.storage=function(){try{return localStorage}catch(e){}}(),t.destroy=(()=>{let e=!1;return()=>{e||(e=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})(),t.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"],t.log=console.debug||console.log||(()=>{}),e.exports=(j||(j=1,A=function(e){function t(e){let r,s,a,n=null;function o(...e){if(!o.enabled)return;const i=o,s=Number(new Date),a=s-(r||s);i.diff=a,i.prev=r,i.curr=s,r=s,e[0]=t.coerce(e[0]),"string"!=typeof e[0]&&e.unshift("%O");let n=0;e[0]=e[0].replace(/%([a-zA-Z%])/g,(r,s)=>{if("%%"===r)return"%";n++;const a=t.formatters[s];if("function"==typeof a){const t=e[n];r=a.call(i,t),e.splice(n,1),n--}return r}),t.formatArgs.call(i,e),(i.log||t.log).apply(i,e)}return o.namespace=e,o.useColors=t.useColors(),o.color=t.selectColor(e),o.extend=i,o.destroy=t.destroy,Object.defineProperty(o,"enabled",{enumerable:!0,configurable:!1,get:()=>null!==n?n:(s!==t.namespaces&&(s=t.namespaces,a=t.enabled(e)),a),set:e=>{n=e}}),"function"==typeof t.init&&t.init(o),o}function i(e,i){const r=t(this.namespace+(void 0===i?":":i)+e);return r.log=this.log,r}function r(e,t){let i=0,r=0,s=-1,a=0;for(;i<e.length;)if(r<t.length&&(t[r]===e[i]||"*"===t[r]))"*"===t[r]?(s=r,a=i,r++):(i++,r++);else{if(-1===s)return!1;r=s+1,a++,i=a}for(;r<t.length&&"*"===t[r];)r++;return r===t.length}return t.debug=t,t.default=t,t.coerce=function(e){return e instanceof Error?e.stack||e.message:e},t.disable=function(){const e=[...t.names,...t.skips.map(e=>"-"+e)].join(",");return t.enable(""),e},t.enable=function(e){t.save(e),t.namespaces=e,t.names=[],t.skips=[];const i=("string"==typeof e?e:"").trim().replace(/\s+/g,",").split(",").filter(Boolean);for(const e of i)"-"===e[0]?t.skips.push(e.slice(1)):t.names.push(e)},t.enabled=function(e){for(const i of t.skips)if(r(e,i))return!1;for(const i of t.names)if(r(e,i))return!0;return!1},t.humanize=U(),t.destroy=function(){console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")},Object.keys(e).forEach(i=>{t[i]=e[i]}),t.names=[],t.skips=[],t.formatters={},t.selectColor=function(e){let i=0;for(let t=0;t<e.length;t++)i=(i<<5)-i+e.charCodeAt(t),i|=0;return t.colors[Math.abs(i)%t.colors.length]},t.enable(t.load()),t}),A)(t);const{formatters:i}=e.exports;i.j=function(e){try{return JSON.stringify(e)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}}}($,$.exports)),$.exports}var z,V={};var H,q={},Q={};function G(){if(H)return Q;H=1,Object.defineProperty(Q,"__esModule",{value:!0}),Q.Logger=void 0;const e=B(),t="mediasoup-client";return Q.Logger=class{_debug;_warn;_error;constructor(i){i?(this._debug=(0,e.default)(`${t}:${i}`),this._warn=(0,e.default)(`${t}:WARN:${i}`),this._error=(0,e.default)(`${t}:ERROR:${i}`)):(this._debug=(0,e.default)(t),this._warn=(0,e.default)(`${t}:WARN`),this._error=(0,e.default)(`${t}:ERROR`)),this._debug.log=console.info.bind(console),this._warn.log=console.warn.bind(console),this._error.log=console.error.bind(console)}get debug(){return this._debug}get warn(){return this._warn}get error(){return this._error}},Q}var K,W={};function J(){if(K)return W;K=1,Object.defineProperty(W,"__esModule",{value:!0}),W.EnhancedEventEmitter=void 0;const e=r(),t=new(G().Logger)("EnhancedEventEmitter");class i extends e.EventEmitter{constructor(){super(),this.setMaxListeners(1/0)}close(){super.removeAllListeners()}emit(e,...t){return super.emit(e,...t)}safeEmit(e,...i){try{return super.emit(e,...i)}catch(i){t.error("safeEmit() | event listener threw an error [eventName:%s]:%o",e,i);try{super.emit("listenererror",e,i)}catch(e){}return Boolean(super.listenerCount(e))}}on(e,t){return super.on(e,t),this}off(e,t){return super.off(e,t),this}addListener(e,t){return super.on(e,t),this}prependListener(e,t){return super.prependListener(e,t),this}once(e,t){return super.once(e,t),this}prependOnceListener(e,t){return super.prependOnceListener(e,t),this}removeListener(e,t){return super.off(e,t),this}removeAllListeners(e){return super.removeAllListeners(e),this}listenerCount(e){return super.listenerCount(e)}listeners(e){return super.listeners(e)}rawListeners(e){return super.rawListeners(e)}}return W.EnhancedEventEmitter=i,W}var Y,X={};function Z(){if(Y)return X;Y=1,Object.defineProperty(X,"__esModule",{value:!0}),X.InvalidStateError=X.UnsupportedError=void 0;class e extends Error{constructor(t){super(t),this.name="UnsupportedError",Error.hasOwnProperty("captureStackTrace")?Error.captureStackTrace(this,e):this.stack=new Error(t).stack}}X.UnsupportedError=e;class t extends Error{constructor(e){super(e),this.name="InvalidStateError",Error.hasOwnProperty("captureStackTrace")?Error.captureStackTrace(this,t):this.stack=new Error(e).stack}}return X.InvalidStateError=t,X}var ee,te={};function ie(){if(ee)return te;return ee=1,Object.defineProperty(te,"__esModule",{value:!0}),te.clone=function(e){return void 0===e?void 0:Number.isNaN(e)?NaN:"function"==typeof structuredClone?structuredClone(e):JSON.parse(JSON.stringify(e))},te.generateRandomNumber=function(){return Math.round(1e7*Math.random())},te.deepFreeze=function e(t){const i=Reflect.ownKeys(t);for(const r of i){const i=t[r];(i&&"object"==typeof i||"function"==typeof i)&&e(i)}return Object.freeze(t)},te}var re,se,ae,ne={},oe={},ce={};function de(){if(se)return oe;se=1,Object.defineProperty(oe,"__esModule",{value:!0}),oe.ProfileLevelId=oe.Level=oe.Profile=void 0,oe.parseProfileLevelId=d,oe.profileLevelIdToString=p,oe.profileToString=function(i){switch(i){case t.ConstrainedBaseline:return"ConstrainedBaseline";case t.Baseline:return"Baseline";case t.Main:return"Main";case t.ConstrainedHigh:return"ConstrainedHigh";case t.High:return"High";case t.PredictiveHigh444:return"PredictiveHigh444";default:return void e.warn(`profileToString() | unrecognized profile ${i}`)}},oe.levelToString=function(t){switch(t){case i.L1_b:return"1b";case i.L1:return"1";case i.L1_1:return"1.1";case i.L1_2:return"1.2";case i.L1_3:return"1.3";case i.L2:return"2";case i.L2_1:return"2.1";case i.L2_2:return"2.2";case i.L3:return"3";case i.L3_1:return"3.1";case i.L3_2:return"3.2";case i.L4:return"4";case i.L4_1:return"4.1";case i.L4_2:return"4.2";case i.L5:return"5";case i.L5_1:return"5.1";case i.L5_2:return"5.2";default:return void e.warn(`levelToString() | unrecognized level ${t}`)}},oe.parseSdpProfileLevelId=l,oe.isSameProfile=function(e={},t={}){const i=l(e),r=l(t);return Boolean(i&&r&&i.profile===r.profile)},oe.isSameProfileAndLevel=function(e={},t={}){const i=l(e),r=l(t);return Boolean(i&&r&&i.profile===r.profile&&i.level==r.level)},oe.generateProfileLevelIdStringForAnswer=function(t={},s={}){if(!t["profile-level-id"]&&!s["profile-level-id"])return void e.warn("generateProfileLevelIdStringForAnswer() | profile-level-id missing in local and remote params");const a=l(t),n=l(s);if(!a)throw new TypeError("invalid local_profile_level_id");if(!n)throw new TypeError("invalid remote_profile_level_id");if(a.profile!==n.profile)throw new TypeError("H264 Profile mismatch");const o=u(t)&&u(s),c=a.level,d=n.level,h=(f=c,g=d,function(e,t){return e===i.L1_b?t!==i.L1&&t!==i.L1_b:t===i.L1_b?e!==i.L1:e<t}(f,g)?f:g),m=o?c:h;var f,g;return e.debug(`generateProfileLevelIdStringForAnswer() | result [profile:${a.profile}, level:${m}]`),p(new r(a.profile,m))},oe.supportedLevel=function(t,i){for(let r=c.length-1;r>=0;--r){const s=c[r];if(256*s.max_macroblock_frame_size<=t&&s.max_macroblocks_per_second<=i*s.max_macroblock_frame_size)return e.debug(`supportedLevel() | result [max_frame_pixel_count:${t}, max_fps:${i}, level:${s.level}]`),s.level}return void e.warn(`supportedLevel() | no level supported [max_frame_pixel_count:${t}, max_fps:${i}]`)};const e=new(function(){if(re)return ce;re=1,Object.defineProperty(ce,"__esModule",{value:!0}),ce.Logger=void 0;const e=B(),t="h264-profile-level-id";return ce.Logger=class{_debug;_warn;_error;constructor(i){i?(this._debug=(0,e.default)(`${t}:${i}`),this._warn=(0,e.default)(`${t}:WARN:${i}`),this._error=(0,e.default)(`${t}:ERROR:${i}`)):(this._debug=(0,e.default)(t),this._warn=(0,e.default)(`${t}:WARN`),this._error=(0,e.default)(`${t}:ERROR`)),this._debug.log=console.info.bind(console),this._warn.log=console.warn.bind(console),this._error.log=console.error.bind(console)}get debug(){return this._debug}get warn(){return this._warn}get error(){return this._error}},ce}().Logger);var t,i;!function(e){e[e.ConstrainedBaseline=1]="ConstrainedBaseline",e[e.Baseline=2]="Baseline",e[e.Main=3]="Main",e[e.ConstrainedHigh=4]="ConstrainedHigh",e[e.High=5]="High",e[e.PredictiveHigh444=6]="PredictiveHigh444"}(t||(oe.Profile=t={})),function(e){e[e.L1_b=0]="L1_b",e[e.L1=10]="L1",e[e.L1_1=11]="L1_1",e[e.L1_2=12]="L1_2",e[e.L1_3=13]="L1_3",e[e.L2=20]="L2",e[e.L2_1=21]="L2_1",e[e.L2_2=22]="L2_2",e[e.L3=30]="L3",e[e.L3_1=31]="L3_1",e[e.L3_2=32]="L3_2",e[e.L4=40]="L4",e[e.L4_1=41]="L4_1",e[e.L4_2=42]="L4_2",e[e.L5=50]="L5",e[e.L5_1=51]="L5_1",e[e.L5_2=52]="L5_2"}(i||(oe.Level=i={}));class r{profile;level;constructor(e,t){this.profile=e,this.level=t}}oe.ProfileLevelId=r;const s=new r(t.ConstrainedBaseline,i.L3_1);class a{mask;masked_value;constructor(e){this.mask=~h("x",e),this.masked_value=h("1",e)}isMatch(e){return this.masked_value===(e&this.mask)}}class n{profile_idc;profile_iop;profile;constructor(e,t,i){this.profile_idc=e,this.profile_iop=t,this.profile=i}}const o=[new n(66,new a("x1xx0000"),t.ConstrainedBaseline),new n(77,new a("1xxx0000"),t.ConstrainedBaseline),new n(88,new a("11xx0000"),t.ConstrainedBaseline),new n(66,new a("x0xx0000"),t.Baseline),new n(88,new a("10xx0000"),t.Baseline),new n(77,new a("0x0x0000"),t.Main),new n(100,new a("00000000"),t.High),new n(100,new a("00001100"),t.ConstrainedHigh),new n(244,new a("00000000"),t.PredictiveHigh444)],c=[{max_macroblocks_per_second:1485,max_macroblock_frame_size:99,level:i.L1},{max_macroblocks_per_second:1485,max_macroblock_frame_size:99,level:i.L1_b},{max_macroblocks_per_second:3e3,max_macroblock_frame_size:396,level:i.L1_1},{max_macroblocks_per_second:6e3,max_macroblock_frame_size:396,level:i.L1_2},{max_macroblocks_per_second:11880,max_macroblock_frame_size:396,level:i.L1_3},{max_macroblocks_per_second:11880,max_macroblock_frame_size:396,level:i.L2},{max_macroblocks_per_second:19800,max_macroblock_frame_size:792,level:i.L2_1},{max_macroblocks_per_second:20250,max_macroblock_frame_size:1620,level:i.L2_2},{max_macroblocks_per_second:40500,max_macroblock_frame_size:1620,level:i.L3},{max_macroblocks_per_second:108e3,max_macroblock_frame_size:3600,level:i.L3_1},{max_macroblocks_per_second:216e3,max_macroblock_frame_size:5120,level:i.L3_2},{max_macroblocks_per_second:245760,max_macroblock_frame_size:8192,level:i.L4},{max_macroblocks_per_second:245760,max_macroblock_frame_size:8192,level:i.L4_1},{max_macroblocks_per_second:522240,max_macroblock_frame_size:8704,level:i.L4_2},{max_macroblocks_per_second:589824,max_macroblock_frame_size:22080,level:i.L5},{max_macroblocks_per_second:983040,max_macroblock_frame_size:36864,level:i.L5_1},{max_macroblocks_per_second:2073600,max_macroblock_frame_size:36864,level:i.L5_2}];function d(t){if("string"!=typeof t||6!==t.length)return;const s=parseInt(t,16);if(0===s)return;const a=255&s,n=s>>8&255,c=s>>16&255;let d;switch(a){case i.L1_1:d=16&n?i.L1_b:i.L1_1;break;case i.L1:case i.L1_2:case i.L1_3:case i.L2:case i.L2_1:case i.L2_2:case i.L3:case i.L3_1:case i.L3_2:case i.L4:case i.L4_1:case i.L4_2:case i.L5:case i.L5_1:case i.L5_2:d=a;break;default:return void e.warn(`parseProfileLevelId() | unrecognized level_idc [str:${t}, level_idc:${a}]`)}for(const i of o)if(c===i.profile_idc&&i.profile_iop.isMatch(n))return e.debug(`parseProfileLevelId() | result [str:${t}, profile:${i.profile}, level:${d}]`),new r(i.profile,d);e.warn(`parseProfileLevelId() | unrecognized profile_idc/profile_iop combination [str:${t}, profile_idc:${c}, profile_iop:${n}]`)}function p(r){if(r.level==i.L1_b)switch(r.profile){case t.ConstrainedBaseline:return"42f00b";case t.Baseline:return"42100b";case t.Main:return"4d100b";default:return void e.warn(`profileLevelIdToString() | Level 1_b not is allowed for profile ${r.profile}`)}let s;switch(r.profile){case t.ConstrainedBaseline:s="42e0";break;case t.Baseline:s="4200";break;case t.Main:s="4d00";break;case t.ConstrainedHigh:s="640c";break;case t.High:s="6400";break;case t.PredictiveHigh444:s="f400";break;default:return void e.warn(`profileLevelIdToString() | unrecognized profile ${r.profile}`)}let a=r.level.toString(16);return 1===a.length&&(a=`0${a}`),`${s}${a}`}function l(e={}){const t=e["profile-level-id"];return t?d(t):s}function h(e,t){return Number(t[0]===e)<<7|Number(t[1]===e)<<6|Number(t[2]===e)<<5|Number(t[3]===e)<<4|Number(t[4]===e)<<3|Number(t[5]===e)<<2|Number(t[6]===e)<<1|Number(t[7]===e)}function u(e={}){const t=e["level-asymmetry-allowed"];return!0===t||1===t||"1"===t}return oe}function pe(){if(ae)return ne;ae=1,Object.defineProperty(ne,"__esModule",{value:!0}),ne.validateAndNormalizeRtpCapabilities=function(e){if("object"!=typeof e)throw new TypeError("caps is not an object");if(e.codecs&&!Array.isArray(e.codecs))throw new TypeError("caps.codecs is not an array");e.codecs||(e.codecs=[]);for(const t of e.codecs)n(t);if(e.headerExtensions&&!Array.isArray(e.headerExtensions))throw new TypeError("caps.headerExtensions is not an array");e.headerExtensions||(e.headerExtensions=[]);for(const t of e.headerExtensions)c(t)},ne.validateAndNormalizeRtpParameters=a,ne.validateAndNormalizeSctpStreamParameters=function(e){if("object"!=typeof e)throw new TypeError("params is not an object");if("number"!=typeof e.streamId)throw new TypeError("missing params.streamId");let t=!1;"boolean"==typeof e.ordered?t=!0:e.ordered=!0;if(e.maxPacketLifeTime&&"number"!=typeof e.maxPacketLifeTime)throw new TypeError("invalid params.maxPacketLifeTime");if(e.maxRetransmits&&"number"!=typeof e.maxRetransmits)throw new TypeError("invalid params.maxRetransmits");if(e.maxPacketLifeTime&&e.maxRetransmits)throw new TypeError("cannot provide both maxPacketLifeTime and maxRetransmits");if(t&&e.ordered&&(e.maxPacketLifeTime||e.maxRetransmits))throw new TypeError("cannot be ordered with maxPacketLifeTime or maxRetransmits");t||!e.maxPacketLifeTime&&!e.maxRetransmits||(e.ordered=!1);if(e.label&&"string"!=typeof e.label)throw new TypeError("invalid params.label");if(e.protocol&&"string"!=typeof e.protocol)throw new TypeError("invalid params.protocol")},ne.validateSctpCapabilities=function(e){if("object"!=typeof e)throw new TypeError("caps is not an object");if(!e.numStreams||"object"!=typeof e.numStreams)throw new TypeError("missing caps.numStreams");!function(e){if("object"!=typeof e)throw new TypeError("numStreams is not an object");if("number"!=typeof e.OS)throw new TypeError("missing numStreams.OS");if("number"!=typeof e.MIS)throw new TypeError("missing numStreams.MIS")}(e.numStreams)},ne.getExtendedRtpCapabilities=function(e,t,i){const r={codecs:[],headerExtensions:[]};if(i)for(const i of e.codecs??[]){if(u(i))continue;const e=(t.codecs??[]).find(e=>m(e,i,{strict:!0,modify:!0}));if(!e)continue;const s={kind:i.kind,mimeType:i.mimeType,clockRate:i.clockRate,channels:i.channels,localPayloadType:i.preferredPayloadType,localRtxPayloadType:void 0,remotePayloadType:e.preferredPayloadType,remoteRtxPayloadType:void 0,localParameters:i.parameters??{},remoteParameters:e.parameters??{},rtcpFeedback:g(i,e)};r.codecs.push(s)}else for(const i of t.codecs??[]){if(u(i))continue;const t=(e.codecs??[]).find(e=>m(e,i,{strict:!0,modify:!0}));if(!t)continue;const s={kind:t.kind,mimeType:t.mimeType,clockRate:t.clockRate,channels:t.channels,localPayloadType:t.preferredPayloadType,localRtxPayloadType:void 0,remotePayloadType:i.preferredPayloadType,remoteRtxPayloadType:void 0,localParameters:t.parameters??{},remoteParameters:i.parameters??{},rtcpFeedback:g(t,i)};r.codecs.push(s)}for(const i of r.codecs){const r=e.codecs.find(e=>u(e)&&e.parameters?.apt===i.localPayloadType),s=t.codecs.find(e=>u(e)&&e.parameters?.apt===i.remotePayloadType);r&&s&&(i.localRtxPayloadType=r.preferredPayloadType,i.remoteRtxPayloadType=s.preferredPayloadType)}for(const i of t.headerExtensions){const t=e.headerExtensions.find(e=>f(e,i));if(!t)continue;const s={kind:i.kind,uri:i.uri,sendId:t.preferredId,recvId:i.preferredId,encrypt:t.preferredEncrypt??!1,direction:"sendrecv"};switch(i.direction){case"sendrecv":s.direction="sendrecv";break;case"recvonly":s.direction="sendonly";break;case"sendonly":s.direction="recvonly";break;case"inactive":s.direction="inactive"}r.headerExtensions.push(s)}return r},ne.getRecvRtpCapabilities=function(e){return h({direction:"recvonly",extendedRtpCapabilities:e})},ne.getSendRtpCapabilities=function(e){return h({direction:"sendonly",extendedRtpCapabilities:e})},ne.getSendingRtpParameters=function(e,t){const i={mid:void 0,codecs:[],headerExtensions:[],encodings:[],rtcp:{}};for(const r of t.codecs){if(r.kind!==e)continue;const t={mimeType:r.mimeType,payloadType:r.localPayloadType,clockRate:r.clockRate,channels:r.channels,parameters:r.localParameters,rtcpFeedback:r.rtcpFeedback};if(i.codecs.push(t),r.localRtxPayloadType){const e={mimeType:`${r.kind}/rtx`,payloadType:r.localRtxPayloadType,clockRate:r.clockRate,parameters:{apt:r.localPayloadType},rtcpFeedback:[]};i.codecs.push(e)}}for(const r of t.headerExtensions){if(r.kind&&r.kind!==e||"sendrecv"!==r.direction&&"sendonly"!==r.direction)continue;const t={uri:r.uri,id:r.sendId,encrypt:r.encrypt,parameters:{}};i.headerExtensions.push(t)}return i},ne.getSendingRemoteRtpParameters=function(e,t){const i={mid:void 0,codecs:[],headerExtensions:[],encodings:[],rtcp:{}};for(const r of t.codecs){if(r.kind!==e)continue;const t={mimeType:r.mimeType,payloadType:r.localPayloadType,clockRate:r.clockRate,channels:r.channels,parameters:r.remoteParameters,rtcpFeedback:r.rtcpFeedback};if(i.codecs.push(t),r.localRtxPayloadType){const e={mimeType:`${r.kind}/rtx`,payloadType:r.localRtxPayloadType,clockRate:r.clockRate,parameters:{apt:r.localPayloadType},rtcpFeedback:[]};i.codecs.push(e)}}for(const r of t.headerExtensions){if(r.kind&&r.kind!==e||"sendrecv"!==r.direction&&"sendonly"!==r.direction)continue;const t={uri:r.uri,id:r.sendId,encrypt:r.encrypt,parameters:{}};i.headerExtensions.push(t)}if(i.headerExtensions.some(e=>"http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01"===e.uri))for(const e of i.codecs)e.rtcpFeedback=(e.rtcpFeedback??[]).filter(e=>"goog-remb"!==e.type);else if(i.headerExtensions.some(e=>"http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time"===e.uri))for(const e of i.codecs)e.rtcpFeedback=(e.rtcpFeedback??[]).filter(e=>"transport-cc"!==e.type);else for(const e of i.codecs)e.rtcpFeedback=(e.rtcpFeedback??[]).filter(e=>"transport-cc"!==e.type&&"goog-remb"!==e.type);return i},ne.reduceCodecs=function(e,t){const i=[];if(t){for(let r=0;r<e.length;++r)if(m(e[r],t,{strict:!0})){i.push(e[r]),u(e[r+1])&&i.push(e[r+1]);break}if(0===i.length)throw new TypeError("no matching codec found")}else i.push(e[0]),u(e[1])&&i.push(e[1]);return i},ne.generateProbatorRtpParameters=function(e){a(e=t.clone(e));const n={mid:i,codecs:[],headerExtensions:[],encodings:[{ssrc:r}],rtcp:{cname:"probator"}};return n.codecs.push(e.codecs[0]),n.codecs[0].payloadType=s,n.headerExtensions=e.headerExtensions,n},ne.canSend=function(e,t){return(t.codecs??[]).some(t=>t.kind===e)},ne.canReceive=function(e,t){if(a(e),0===e.codecs.length)return!1;const i=e.codecs[0];return(t.codecs??[]).some(e=>e.preferredPayloadType===i.payloadType)};const e=de(),t=ie(),i="probator",r=1234,s=127;function a(e){if("object"!=typeof e)throw new TypeError("params is not an object");if(e.mid&&"string"!=typeof e.mid)throw new TypeError("params.mid is not a string");if(!Array.isArray(e.codecs))throw new TypeError("missing params.codecs");for(const t of e.codecs)d(t);if(e.headerExtensions&&!Array.isArray(e.headerExtensions))throw new TypeError("params.headerExtensions is not an array");e.headerExtensions||(e.headerExtensions=[]);for(const t of e.headerExtensions)p(t);if(e.encodings&&!Array.isArray(e.encodings))throw new TypeError("params.encodings is not an array");e.encodings||(e.encodings=[]);for(const t of e.encodings)l(t);if(e.rtcp&&"object"!=typeof e.rtcp)throw new TypeError("params.rtcp is not an object");e.rtcp||(e.rtcp={}),function(e){if("object"!=typeof e)throw new TypeError("rtcp is not an object");if(e.cname&&"string"!=typeof e.cname)throw new TypeError("invalid rtcp.cname");e.reducedSize&&"boolean"==typeof e.reducedSize||(e.reducedSize=!0)}(e.rtcp)}function n(e){const t=new RegExp("^(audio|video)/(.+)","i");if("object"!=typeof e)throw new TypeError("codec is not an object");if(!e.mimeType||"string"!=typeof e.mimeType)throw new TypeError("missing codec.mimeType");const i=t.exec(e.mimeType);if(!i)throw new TypeError("invalid codec.mimeType");if(e.kind=i[1].toLowerCase(),"number"!=typeof e.preferredPayloadType)throw new TypeError("missing codec.preferredPayloadType");if("number"!=typeof e.clockRate)throw new TypeError("missing codec.clockRate");"audio"===e.kind?"number"!=typeof e.channels&&(e.channels=1):delete e.channels,e.parameters&&"object"==typeof e.parameters||(e.parameters={});for(const t of Object.keys(e.parameters)){let i=e.parameters[t];if(void 0===i&&(e.parameters[t]="",i=""),"string"!=typeof i&&"number"!=typeof i)throw new TypeError(`invalid codec parameter [key:${t}s, value:${i}]`);if("apt"===t&&"number"!=typeof i)throw new TypeError("invalid codec apt parameter")}e.rtcpFeedback&&Array.isArray(e.rtcpFeedback)||(e.rtcpFeedback=[]);for(const t of e.rtcpFeedback)o(t)}function o(e){if("object"!=typeof e)throw new TypeError("fb is not an object");if(!e.type||"string"!=typeof e.type)throw new TypeError("missing fb.type");e.parameter&&"string"==typeof e.parameter||(e.parameter="")}function c(e){if("object"!=typeof e)throw new TypeError("ext is not an object");if("audio"!==e.kind&&"video"!==e.kind)throw new TypeError("invalid ext.kind");if(!e.uri||"string"!=typeof e.uri)throw new TypeError("missing ext.uri");if("number"!=typeof e.preferredId)throw new TypeError("missing ext.preferredId");if(e.preferredEncrypt&&"boolean"!=typeof e.preferredEncrypt)throw new TypeError("invalid ext.preferredEncrypt");if(e.preferredEncrypt||(e.preferredEncrypt=!1),e.direction&&"string"!=typeof e.direction)throw new TypeError("invalid ext.direction");e.direction||(e.direction="sendrecv")}function d(e){const t=new RegExp("^(audio|video)/(.+)","i");if("object"!=typeof e)throw new TypeError("codec is not an object");if(!e.mimeType||"string"!=typeof e.mimeType)throw new TypeError("missing codec.mimeType");const i=t.exec(e.mimeType);if(!i)throw new TypeError("invalid codec.mimeType");if("number"!=typeof e.payloadType)throw new TypeError("missing codec.payloadType");if("number"!=typeof e.clockRate)throw new TypeError("missing codec.clockRate");"audio"===i[1].toLowerCase()?"number"!=typeof e.channels&&(e.channels=1):delete e.channels,e.parameters&&"object"==typeof e.parameters||(e.parameters={});for(const t of Object.keys(e.parameters)){let i=e.parameters[t];if(void 0===i&&(e.parameters[t]="",i=""),"string"!=typeof i&&"number"!=typeof i)throw new TypeError(`invalid codec parameter [key:${t}s, value:${i}]`);if("apt"===t&&"number"!=typeof i)throw new TypeError("invalid codec apt parameter")}e.rtcpFeedback&&Array.isArray(e.rtcpFeedback)||(e.rtcpFeedback=[]);for(const t of e.rtcpFeedback)o(t)}function p(e){if("object"!=typeof e)throw new TypeError("ext is not an object");if(!e.uri||"string"!=typeof e.uri)throw new TypeError("missing ext.uri");if("number"!=typeof e.id)throw new TypeError("missing ext.id");if(e.encrypt&&"boolean"!=typeof e.encrypt)throw new TypeError("invalid ext.encrypt");e.encrypt||(e.encrypt=!1),e.parameters&&"object"==typeof e.parameters||(e.parameters={});for(const t of Object.keys(e.parameters)){let i=e.parameters[t];if(void 0===i&&(e.parameters[t]="",i=""),"string"!=typeof i&&"number"!=typeof i)throw new TypeError("invalid header extension parameter")}}function l(e){if("object"!=typeof e)throw new TypeError("encoding is not an object");if(e.ssrc&&"number"!=typeof e.ssrc)throw new TypeError("invalid encoding.ssrc");if(e.rid&&"string"!=typeof e.rid)throw new TypeError("invalid encoding.rid");if(e.rtx&&"object"!=typeof e.rtx)throw new TypeError("invalid encoding.rtx");if(e.rtx&&"number"!=typeof e.rtx.ssrc)throw new TypeError("missing encoding.rtx.ssrc");if(e.dtx&&"boolean"==typeof e.dtx||(e.dtx=!1),e.scalabilityMode&&"string"!=typeof e.scalabilityMode)throw new TypeError("invalid encoding.scalabilityMode")}function h({direction:e,extendedRtpCapabilities:t}){const i={codecs:[],headerExtensions:[]};for(const e of t.codecs){const t={kind:e.kind,mimeType:e.mimeType,preferredPayloadType:e.remotePayloadType,clockRate:e.clockRate,channels:e.channels,parameters:e.localParameters,rtcpFeedback:e.rtcpFeedback};if(i.codecs.push(t),!e.remoteRtxPayloadType)continue;const r={kind:e.kind,mimeType:`${e.kind}/rtx`,preferredPayloadType:e.remoteRtxPayloadType,clockRate:e.clockRate,parameters:{apt:e.remotePayloadType},rtcpFeedback:[]};i.codecs.push(r)}for(const r of t.headerExtensions){if("sendrecv"!==r.direction&&r.direction!==e)continue;const t={kind:r.kind,uri:r.uri,preferredId:r.recvId,preferredEncrypt:r.encrypt??!1,direction:r.direction};i.headerExtensions.push(t)}return i}function u(e){return!!e&&/.+\/rtx$/i.test(e.mimeType)}function m(t,i,{strict:r=!1,modify:s=!1}={}){const a=t.mimeType.toLowerCase();if(a!==i.mimeType.toLowerCase())return!1;if(t.clockRate!==i.clockRate)return!1;if(t.channels!==i.channels)return!1;switch(a){case"video/h264":if(r){if((t.parameters["packetization-mode"]??0)!==(i.parameters["packetization-mode"]??0))return!1;if(!e.isSameProfile(t.parameters,i.parameters))return!1;let r;try{r=e.generateProfileLevelIdStringForAnswer(t.parameters,i.parameters)}catch(e){return!1}s&&(r?(t.parameters["profile-level-id"]=r,i.parameters["profile-level-id"]=r):(delete t.parameters["profile-level-id"],delete i.parameters["profile-level-id"]))}break;case"video/vp9":if(r){if((t.parameters["profile-id"]??0)!==(i.parameters["profile-id"]??0))return!1}}return!0}function f(e,t){return(!e.kind||!t.kind||e.kind===t.kind)&&e.uri===t.uri}function g(e,t){const i=[];for(const r of e.rtcpFeedback??[]){const e=(t.rtcpFeedback??[]).find(e=>e.type===r.type&&(e.parameter===r.parameter||!e.parameter&&!r.parameter));e&&i.push(e)}return i}return ne}var le,he={},ue={},me={},fe={};var ge,ve,be,_e={};function ye(){if(ge)return _e;ge=1,Object.defineProperty(_e,"__esModule",{value:!0}),_e.AwaitQueueRemovedTaskError=_e.AwaitQueueStoppedError=void 0;class e extends Error{constructor(t){super(t??"queue stopped"),this.name="AwaitQueueStoppedError","function"==typeof Error.captureStackTrace&&Error.captureStackTrace(this,e)}}_e.AwaitQueueStoppedError=e;class t extends Error{constructor(e){super(e??"queue task removed"),this.name="AwaitQueueRemovedTaskError","function"==typeof Error.captureStackTrace&&Error.captureStackTrace(this,t)}}return _e.AwaitQueueRemovedTaskError=t,_e}function Se(){if(ve)return me;ve=1,Object.defineProperty(me,"__esModule",{value:!0}),me.AwaitQueue=void 0;const e=function(){if(le)return fe;le=1,Object.defineProperty(fe,"__esModule",{value:!0}),fe.Logger=void 0;const e=B(),t="awaitqueue";return fe.Logger=class{_debug;_warn;_error;constructor(i){i?(this._debug=e(`${t}:${i}`),this._warn=e(`${t}:WARN:${i}`),this._error=e(`${t}:ERROR:${i}`)):(this._debug=e(t),this._warn=e(`${t}:WARN`),this._error=e(`${t}:ERROR`)),this._debug.log=console.info.bind(console),this._warn.log=console.warn.bind(console),this._error.log=console.error.bind(console)}get debug(){return this._debug}get warn(){return this._warn}get error(){return this._error}},fe}(),t=ye(),i=new e.Logger("AwaitQueue");return me.AwaitQueue=class{pendingTasks=new Map;nextTaskId=0;constructor(){i.debug("constructor()")}get size(){return this.pendingTasks.size}async push(e,r,s){if(r=r??e.name,i.debug(`push() [name:${r}, options:%o]`,s),"function"!=typeof e)throw new TypeError("given task is not a function");if(r)try{Object.defineProperty(e,"name",{value:r})}catch(e){}return new Promise((a,n)=>{if(r&&s?.removeOngoingTasksWithSameName)for(const e of this.pendingTasks.values())e.name===r&&e.reject(new t.AwaitQueueRemovedTaskError,{canExecuteNextTask:!1});const o={id:this.nextTaskId++,task:e,name:r,enqueuedAt:Date.now(),executedAt:void 0,completed:!1,resolve:e=>{if(o.completed)return;o.completed=!0,this.pendingTasks.delete(o.id),i.debug(`resolving task [name:${o.name}]`),a(e);const[t]=this.pendingTasks.values();t&&!t.executedAt&&this.execute(t)},reject:(e,{canExecuteNextTask:t})=>{if(!o.completed&&(o.completed=!0,this.pendingTasks.delete(o.id),i.debug(`rejecting task [name:${o.name}]: %s`,String(e)),n(e),t)){const[e]=this.pendingTasks.values();e&&!e.executedAt&&this.execute(e)}}};this.pendingTasks.set(o.id,o),1===this.pendingTasks.size&&this.execute(o)})}stop(){i.debug("stop()");for(const e of this.pendingTasks.values())i.debug(`stop() | stopping task [name:${e.name}]`),e.reject(new t.AwaitQueueStoppedError,{canExecuteNextTask:!1})}remove(e){i.debug(`remove() [taskIdx:${e}]`);const r=Array.from(this.pendingTasks.values())[e];r?r.reject(new t.AwaitQueueRemovedTaskError,{canExecuteNextTask:!0}):i.debug(`stop() | no task with given idx [taskIdx:${e}]`)}dump(){const e=Date.now();let t=0;return Array.from(this.pendingTasks.values()).map(i=>({idx:t++,task:i.task,name:i.name,enqueuedTime:i.executedAt?i.executedAt-i.enqueuedAt:e-i.enqueuedAt,executionTime:i.executedAt?e-i.executedAt:0}))}async execute(e){if(i.debug(`execute() [name:${e.name}]`),e.executedAt)throw new Error("task already being executed");e.executedAt=Date.now();try{const t=await e.task();e.resolve(t)}catch(t){e.reject(t,{canExecuteNextTask:!0})}}},me}var we,ke={};var Te,Ce={};var Pe,Re={};var Ee,De,xe={};function Ie(){if(De)return he;De=1,Object.defineProperty(he,"__esModule",{value:!0}),he.Transport=void 0;const e=(be||(be=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.AwaitQueueRemovedTaskError=e.AwaitQueueStoppedError=e.AwaitQueue=void 0;var t=Se();Object.defineProperty(e,"AwaitQueue",{enumerable:!0,get:function(){return t.AwaitQueue}});var i=ye();Object.defineProperty(e,"AwaitQueueStoppedError",{enumerable:!0,get:function(){return i.AwaitQueueStoppedError}}),Object.defineProperty(e,"AwaitQueueRemovedTaskError",{enumerable:!0,get:function(){return i.AwaitQueueRemovedTaskError}})}(ue)),ue),t=G(),i=J(),r=Z(),s=ie(),a=pe(),n=function(){if(we)return ke;we=1,Object.defineProperty(ke,"__esModule",{value:!0}),ke.Producer=void 0;const e=G(),t=J(),i=Z(),r=new e.Logger("Producer");let s=class extends t.EnhancedEventEmitter{_id;_localId;_closed=!1;_rtpSender;_track;_kind;_rtpParameters;_paused;_maxSpatialLayer;_stopTracks;_disableTrackOnPause;_zeroRtpOnPause;_appData;_observer=new t.EnhancedEventEmitter;constructor({id:e,localId:t,rtpSender:i,track:s,rtpParameters:a,stopTracks:n,disableTrackOnPause:o,zeroRtpOnPause:c,appData:d}){super(),r.debug("constructor()"),this._id=e,this._localId=t,this._rtpSender=i,this._track=s,this._kind=s.kind,this._rtpParameters=a,this._paused=!!o&&!s.enabled,this._maxSpatialLayer=void 0,this._stopTracks=n,this._disableTrackOnPause=o,this._zeroRtpOnPause=c,this._appData=d??{},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){this._appData=e}get observer(){return this._observer}close(){this._closed||(r.debug("close()"),this._closed=!0,this.destroyTrack(),this.emit("@close"),this._observer.safeEmit("close"),super.close(),this._observer.close())}transportClosed(){this._closed||(r.debug("transportClosed()"),this._closed=!0,this.destroyTrack(),this.safeEmit("transportclose"),this._observer.safeEmit("close"))}async getStats(){if(this._closed)throw new i.InvalidStateError("closed");return new Promise((e,t)=>{this.safeEmit("@getstats",e,t)})}pause(){r.debug("pause()"),this._closed?r.error("pause() | Producer closed"):(this._paused=!0,this._track&&this._disableTrackOnPause&&(this._track.enabled=!1),this._zeroRtpOnPause&&new Promise((e,t)=>{this.safeEmit("@pause",e,t)}).catch(()=>{}),this._observer.safeEmit("pause"))}resume(){r.debug("resume()"),this._closed?r.error("resume() | Producer closed"):(this._paused=!1,this._track&&this._disableTrackOnPause&&(this._track.enabled=!0),this._zeroRtpOnPause&&new Promise((e,t)=>{this.safeEmit("@resume",e,t)}).catch(()=>{}),this._observer.safeEmit("resume"))}async replaceTrack({track:e}){if(r.debug("replaceTrack() [track:%o]",e),this._closed){if(e&&this._stopTracks)try{e.stop()}catch(e){}throw new i.InvalidStateError("closed")}if("ended"===e?.readyState)throw new i.InvalidStateError("track ended");e!==this._track?(await new Promise((t,i)=>{this.safeEmit("@replacetrack",e,t,i)}),this.destroyTrack(),this._track=e,this._track&&this._disableTrackOnPause&&(this._paused?this._paused&&(this._track.enabled=!1):this._track.enabled=!0),this.handleTrack()):r.debug("replaceTrack() | same track, ignored")}async setMaxSpatialLayer(e){if(this._closed)throw new i.InvalidStateError("closed");if("video"!==this._kind)throw new i.UnsupportedError("not a video Producer");if("number"!=typeof e)throw new TypeError("invalid spatialLayer");e!==this._maxSpatialLayer&&(await new Promise((t,i)=>{this.safeEmit("@setmaxspatiallayer",e,t,i)}).catch(()=>{}),this._maxSpatialLayer=e)}async setRtpEncodingParameters(e){if(this._closed)throw new i.InvalidStateError("closed");if("object"!=typeof e)throw new TypeError("invalid params");await new Promise((t,i)=>{this.safeEmit("@setrtpencodingparameters",e,t,i)})}onTrackEnded(){r.debug('track "ended" event'),this.safeEmit("trackended"),this._observer.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(e){}}};return ke.Producer=s,ke}(),o=function(){if(Te)return Ce;Te=1,Object.defineProperty(Ce,"__esModule",{value:!0}),Ce.Consumer=void 0;const e=G(),t=J(),i=Z(),r=new e.Logger("Consumer");let s=class extends t.EnhancedEventEmitter{_id;_localId;_producerId;_closed=!1;_rtpReceiver;_track;_rtpParameters;_paused;_appData;_observer=new t.EnhancedEventEmitter;constructor({id:e,localId:t,producerId:i,rtpReceiver:s,track:a,rtpParameters:n,appData:o}){super(),r.debug("constructor()"),this._id=e,this._localId=t,this._producerId=i,this._rtpReceiver=s,this._track=a,this._rtpParameters=n,this._paused=!a.enabled,this._appData=o??{},this.onTrackEnded=this.onTrackEnded.bind(this),this.handleTrack()}get id(){return this._id}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){this._appData=e}get observer(){return this._observer}close(){this._closed||(r.debug("close()"),this._closed=!0,this.destroyTrack(),this.emit("@close"),this._observer.safeEmit("close"),super.close(),this._observer.close())}transportClosed(){this._closed||(r.debug("transportClosed()"),this._closed=!0,this.destroyTrack(),this.safeEmit("transportclose"),this._observer.safeEmit("close"))}async getStats(){if(this._closed)throw new i.InvalidStateError("closed");return new Promise((e,t)=>{this.safeEmit("@getstats",e,t)})}pause(){r.debug("pause()"),this._closed?r.error("pause() | Consumer closed"):this._paused?r.debug("pause() | Consumer is already paused"):(this._paused=!0,this._track.enabled=!1,this.emit("@pause"),this._observer.safeEmit("pause"))}resume(){r.debug("resume()"),this._closed?r.error("resume() | Consumer closed"):this._paused?(this._paused=!1,this._track.enabled=!0,this.emit("@resume"),this._observer.safeEmit("resume")):r.debug("resume() | Consumer is already resumed")}onTrackEnded(){r.debug('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(e){}}};return Ce.Consumer=s,Ce}(),c=function(){if(Pe)return Re;Pe=1,Object.defineProperty(Re,"__esModule",{value:!0}),Re.DataProducer=void 0;const e=G(),t=J(),i=Z(),r=new e.Logger("DataProducer");let s=class extends t.EnhancedEventEmitter{_id;_dataChannel;_closed=!1;_sctpStreamParameters;_appData;_observer=new t.EnhancedEventEmitter;constructor({id:e,dataChannel:t,sctpStreamParameters:i,appData:s}){super(),r.debug("constructor()"),this._id=e,this._dataChannel=t,this._sctpStreamParameters=i,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){this._appData=e}get observer(){return this._observer}close(){this._closed||(r.debug("close()"),this._closed=!0,this._dataChannel.close(),this.emit("@close"),this._observer.safeEmit("close"),super.close(),this._observer.close())}transportClosed(){this._closed||(r.debug("transportClosed()"),this._closed=!0,this._dataChannel.close(),this.safeEmit("transportclose"),this._observer.safeEmit("close"))}send(e){if(r.debug("send()"),this._closed)throw new i.InvalidStateError("closed");this._dataChannel.send(e)}handleDataChannel(){this._dataChannel.addEventListener("open",()=>{this._closed||(r.debug('DataChannel "open" event'),this.safeEmit("open"))}),this._dataChannel.addEventListener("error",e=>{if(this._closed)return;const t=e.error??new Error("unknown DataChannel error");"sctp-failure"===e.error?.errorDetail?r.error("DataChannel SCTP error [sctpCauseCode:%s]: %s",e.error?.sctpCauseCode,e.error.message):r.error('DataChannel "error" event: %o',t),this.safeEmit("error",t)}),this._dataChannel.addEventListener("close",()=>{this._closed||(r.warn('DataChannel "close" event'),this._closed=!0,this.emit("@close"),this.safeEmit("close"),this._observer.safeEmit("close"))}),this._dataChannel.addEventListener("message",()=>{this._closed||r.warn('DataChannel "message" event in a DataProducer, message discarded')}),this._dataChannel.addEventListener("bufferedamountlow",()=>{this._closed||this.safeEmit("bufferedamountlow")})}};return Re.DataProducer=s,Re}(),d=function(){if(Ee)return xe;Ee=1,Object.defineProperty(xe,"__esModule",{value:!0}),xe.DataConsumer=void 0;const e=G(),t=J(),i=new e.Logger("DataConsumer");let r=class extends t.EnhancedEventEmitter{_id;_dataProducerId;_dataChannel;_closed=!1;_sctpStreamParameters;_appData;_observer=new t.EnhancedEventEmitter;constructor({id:e,dataProducerId:t,dataChannel:r,sctpStreamParameters:s,appData:a}){super(),i.debug("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){this._appData=e}get observer(){return this._observer}close(){this._closed||(i.debug("close()"),this._closed=!0,this._dataChannel.close(),this.emit("@close"),this._observer.safeEmit("close"),super.close(),this._observer.close())}transportClosed(){this._closed||(i.debug("transportClosed()"),this._closed=!0,this._dataChannel.close(),this.safeEmit("transportclose"),this._observer.safeEmit("close"))}handleDataChannel(){this._dataChannel.addEventListener("open",()=>{this._closed||(i.debug('DataChannel "open" event'),this.safeEmit("open"))}),this._dataChannel.addEventListener("error",e=>{if(this._closed)return;const t=e.error??new Error("unknown DataChannel error");"sctp-failure"===e.error?.errorDetail?i.error("DataChannel SCTP error [sctpCauseCode:%s]: %s",e.error?.sctpCauseCode,e.error.message):i.error('DataChannel "error" event: %o',t),this.safeEmit("error",t)}),this._dataChannel.addEventListener("close",()=>{this._closed||(i.warn('DataChannel "close" event'),this._closed=!0,this.emit("@close"),this.safeEmit("close"),this._observer.safeEmit("close"))}),this._dataChannel.addEventListener("message",e=>{this._closed||this.safeEmit("message",e.data)})}};return xe.DataConsumer=r,xe}(),p=new t.Logger("Transport");class l{consumerOptions;promise;resolve;reject;constructor(e){this.consumerOptions=e,this.promise=new Promise((e,t)=>{this.resolve=e,this.reject=t})}}let h=class extends i.EnhancedEventEmitter{_id;_closed=!1;_direction;_getSendExtendedRtpCapabilities;_recvRtpCapabilities;_canProduceByKind;_maxSctpMessageSize;_handler;_iceGatheringState="new";_connectionState="new";_appData;_producers=new Map;_consumers=new Map;_dataProducers=new Map;_dataConsumers=new Map;_probatorConsumerCreated=!1;_awaitQueue=new e.AwaitQueue;_pendingConsumerTasks=[];_consumerCreationInProgress=!1;_pendingPauseConsumers=new Map;_consumerPauseInProgress=!1;_pendingResumeConsumers=new Map;_consumerResumeInProgress=!1;_pendingCloseConsumers=new Map;_consumerCloseInProgress=!1;_observer=new i.EnhancedEventEmitter;constructor({direction:e,id:t,iceParameters:i,iceCandidates:r,dtlsParameters:a,sctpParameters:n,iceServers:o,iceTransportPolicy:c,additionalSettings:d,appData:l,handlerFactory:h,getSendExtendedRtpCapabilities:u,recvRtpCapabilities:m,canProduceByKind:f}){super(),p.debug("constructor() [id:%s, direction:%s]",t,e),this._id=t,this._direction=e,this._getSendExtendedRtpCapabilities=u,this._recvRtpCapabilities=m,this._canProduceByKind=f,this._maxSctpMessageSize=n?n.maxMessageSize:null;const g=s.clone(d)??{};delete g.iceServers,delete g.iceTransportPolicy,delete g.bundlePolicy,delete g.rtcpMuxPolicy,this._handler=h.factory({direction:e,iceParameters:i,iceCandidates:r,dtlsParameters:a,sctpParameters:n,iceServers:o,iceTransportPolicy:c,additionalSettings:g,getSendExtendedRtpCapabilities:this._getSendExtendedRtpCapabilities}),this._appData=l??{},this.handleHandler()}get id(){return this._id}get closed(){return this._closed}get direction(){return this._direction}get handler(){return this._handler}get iceGatheringState(){return this._iceGatheringState}get connectionState(){return this._connectionState}get appData(){return this._appData}set appData(e){this._appData=e}get observer(){return this._observer}close(){if(!this._closed){p.debug("close()"),this._closed=!0,this._awaitQueue.stop(),this._handler.close(),this._connectionState="closed";for(const e of this._producers.values())e.transportClosed();this._producers.clear();for(const e of this._consumers.values())e.transportClosed();this._consumers.clear();for(const e of this._dataProducers.values())e.transportClosed();this._dataProducers.clear();for(const e of this._dataConsumers.values())e.transportClosed();this._dataConsumers.clear(),this._observer.safeEmit("close"),super.close(),this._observer.close()}}async getStats(){if(this._closed)throw new r.InvalidStateError("closed");return this._handler.getTransportStats()}async restartIce({iceParameters:e}){if(p.debug("restartIce()"),this._closed)throw new r.InvalidStateError("closed");if(!e)throw new TypeError("missing iceParameters");return this._awaitQueue.push(async()=>await this._handler.restartIce(e),"transport.restartIce()")}async updateIceServers({iceServers:e}={}){if(p.debug("updateIceServers()"),this._closed)throw new r.InvalidStateError("closed");if(!Array.isArray(e))throw new TypeError("missing iceServers");return this._awaitQueue.push(async()=>this._handler.updateIceServers(e),"transport.updateIceServers()")}async produce({track:e,streamId:t,encodings:i,codecOptions:s,headerExtensionOptions:o,codec:c,stopTracks:d=!0,disableTrackOnPause:l=!0,zeroRtpOnPause:h=!1,onRtpSender:u,appData:m={}}={}){if(p.debug("produce() [track:%o]",e),this._closed)throw new r.InvalidStateError("closed");if(!e)throw new TypeError("missing track");if("send"!==this._direction)throw new r.UnsupportedError("not a sending Transport");if(!this._canProduceByKind[e.kind])throw new r.UnsupportedError(`cannot produce ${e.kind}`);if("ended"===e.readyState)throw new r.InvalidStateError("track ended");if(0===this.listenerCount("connect")&&"new"===this._connectionState)throw new TypeError('no "connect" listener set into this transport');if(0===this.listenerCount("produce"))throw new TypeError('no "produce" listener set into this transport');if(m&&"object"!=typeof m)throw new TypeError("if given, appData must be an object");return this._awaitQueue.push(async()=>{let r;if(i&&!Array.isArray(i))throw TypeError("encodings must be an array");0===i?.length?r=void 0:i&&(r=i.map(e=>{const t={active:!0};return!1===e.active&&(t.active=!1),"boolean"==typeof e.dtx&&(t.dtx=e.dtx),"string"==typeof e.scalabilityMode&&(t.scalabilityMode=e.scalabilityMode),"number"==typeof e.scaleResolutionDownBy&&(t.scaleResolutionDownBy=e.scaleResolutionDownBy),"number"==typeof e.maxBitrate&&(t.maxBitrate=e.maxBitrate),"number"==typeof e.maxFramerate&&(t.maxFramerate=e.maxFramerate),"boolean"==typeof e.adaptivePtime&&(t.adaptivePtime=e.adaptivePtime),"string"==typeof e.priority&&(t.priority=e.priority),"string"==typeof e.networkPriority&&(t.networkPriority=e.networkPriority),t}));const{localId:p,rtpParameters:f,rtpSender:g}=await this._handler.send({track:e,streamId:t,encodings:r,codecOptions:s,headerExtensionOptions:o,codec:c,onRtpSender:u});try{a.validateAndNormalizeRtpParameters(f);const{id:t}=await new Promise((t,i)=>{this.safeEmit("produce",{kind:e.kind,rtpParameters:f,appData:m},t,i)}),i=new n.Producer({id:t,localId:p,rtpSender:g,track:e,rtpParameters:f,stopTracks:d,disableTrackOnPause:l,zeroRtpOnPause:h,appData:m});return this._producers.set(i.id,i),this.handleProducer(i),this._observer.safeEmit("newproducer",i),i}catch(e){throw this._handler.stopSending(p).catch(()=>{}),e}},"transport.produce()").catch(t=>{if(d)try{e.stop()}catch(e){}throw t})}async consume({id:e,producerId:t,kind:i,rtpParameters:n,streamId:o,onRtpReceiver:c,appData:d={}}){if(p.debug("consume()"),this._closed)throw new r.InvalidStateError("closed");if("recv"!==this._direction)throw new r.UnsupportedError("not a receiving Transport");if("string"!=typeof e)throw new TypeError("missing id");if("string"!=typeof t)throw new TypeError("missing producerId");if("audio"!==i&&"video"!==i)throw new TypeError(`invalid kind '${i}'`);if(0===this.listenerCount("connect")&&"new"===this._connectionState)throw new TypeError('no "connect" listener set into this transport');if(d&&"object"!=typeof d)throw new TypeError("if given, appData must be an object");const h=s.clone(n);if(!a.canReceive(h,this._recvRtpCapabilities))throw new r.UnsupportedError("cannot consume this Producer");const u=new l({id:e,producerId:t,kind:i,rtpParameters:h,streamId:o,onRtpReceiver:c,appData:d});return this._pendingConsumerTasks.push(u),queueMicrotask(()=>{this._closed||!1===this._consumerCreationInProgress&&this.createPendingConsumers()}),u.promise}async produceData({ordered:e=!0,maxPacketLifeTime:t,maxRetransmits:i,label:s="",protocol:n="",appData:o={}}={}){if(p.debug("produceData()"),this._closed)throw new r.InvalidStateError("closed");if("send"!==this._direction)throw new r.UnsupportedError("not a sending Transport");if(!this._maxSctpMessageSize)throw new r.UnsupportedError("SCTP not enabled by remote Transport");if(0===this.listenerCount("connect")&&"new"===this._connectionState)throw new TypeError('no "connect" listener set into this transport');if(0===this.listenerCount("producedata"))throw new TypeError('no "producedata" listener set into this transport');if(o&&"object"!=typeof o)throw new TypeError("if given, appData must be an object");return(t||i)&&(e=!1),this._awaitQueue.push(async()=>{const{dataChannel:r,sctpStreamParameters:d}=await this._handler.sendDataChannel({ordered:e,maxPacketLifeTime:t,maxRetransmits:i,label:s,protocol:n});a.validateAndNormalizeSctpStreamParameters(d);const{id:p}=await new Promise((e,t)=>{this.safeEmit("producedata",{sctpStreamParameters:d,label:s,protocol:n,appData:o},e,t)}),l=new c.DataProducer({id:p,dataChannel:r,sctpStreamParameters:d,appData:o});return this._dataProducers.set(l.id,l),this.handleDataProducer(l),this._observer.safeEmit("newdataproducer",l),l},"transport.produceData()")}async consumeData({id:e,dataProducerId:t,sctpStreamParameters:i,label:n="",protocol:o="",appData:c={}}){if(p.debug("consumeData()"),this._closed)throw new r.InvalidStateError("closed");if("recv"!==this._direction)throw new r.UnsupportedError("not a receiving Transport");if(!this._maxSctpMessageSize)throw new r.UnsupportedError("SCTP not enabled by remote Transport");if("string"!=typeof e)throw new TypeError("missing id");if("string"!=typeof t)throw new TypeError("missing dataProducerId");if(0===this.listenerCount("connect")&&"new"===this._connectionState)throw new TypeError('no "connect" listener set into this transport');if(c&&"object"!=typeof c)throw new TypeError("if given, appData must be an object");const l=s.clone(i);return a.validateAndNormalizeSctpStreamParameters(l),this._awaitQueue.push(async()=>{const{dataChannel:i}=await this._handler.receiveDataChannel({sctpStreamParameters:l,label:n,protocol:o}),r=new d.DataConsumer({id:e,dataProducerId:t,dataChannel:i,sctpStreamParameters:l,appData:c});return this._dataConsumers.set(r.id,r),this.handleDataConsumer(r),this._observer.safeEmit("newdataconsumer",r),r},"transport.consumeData()")}createPendingConsumers(){this._consumerCreationInProgress=!0,this._awaitQueue.push(async()=>{if(0===this._pendingConsumerTasks.length)return void p.debug("createPendingConsumers() | there is no Consumer to be created");const e=[...this._pendingConsumerTasks];let t;this._pendingConsumerTasks=[];const i=[];for(const t of e){const{id:e,kind:r,rtpParameters:s,streamId:a,onRtpReceiver:n}=t.consumerOptions;i.push({trackId:e,kind:r,rtpParameters:s,streamId:a,onRtpReceiver:n})}try{const r=await this._handler.receive(i);for(let i=0;i<r.length;++i){const s=e[i],a=r[i],{id:n,producerId:c,kind:d,rtpParameters:p,appData:l}=s.consumerOptions,{localId:h,rtpReceiver:u,track:m}=a,f=new o.Consumer({id:n,localId:h,producerId:c,rtpReceiver:u,track:m,rtpParameters:p,appData:l});this._consumers.set(f.id,f),this.handleConsumer(f),this._probatorConsumerCreated||t||"video"!==d||(t=f),this._observer.safeEmit("newconsumer",f),s.resolve(f)}}catch(t){for(const i of e)i.reject(t)}if(t)try{const e=a.generateProbatorRtpParameters(t.rtpParameters);await this._handler.receive([{trackId:"probator",kind:"video",rtpParameters:e}]),p.debug("createPendingConsumers() | Consumer for RTP probation created"),this._probatorConsumerCreated=!0}catch(e){p.error("createPendingConsumers() | failed to create Consumer for RTP probation:%o",e)}},"transport.createPendingConsumers()").then(()=>{this._consumerCreationInProgress=!1,this._pendingConsumerTasks.length>0&&this.createPendingConsumers()}).catch(()=>{})}pausePendingConsumers(){this._consumerPauseInProgress=!0,this._awaitQueue.push(async()=>{if(0===this._pendingPauseConsumers.size)return void p.debug("pausePendingConsumers() | there is no Consumer to be paused");const e=Array.from(this._pendingPauseConsumers.values());this._pendingPauseConsumers.clear();try{const t=e.map(e=>e.localId);await this._handler.pauseReceiving(t)}catch(e){p.error("pausePendingConsumers() | failed to pause Consumers:",e)}},"transport.pausePendingConsumers()").then(()=>{this._consumerPauseInProgress=!1,this._pendingPauseConsumers.size>0&&this.pausePendingConsumers()}).catch(()=>{})}resumePendingConsumers(){this._consumerResumeInProgress=!0,this._awaitQueue.push(async()=>{if(0===this._pendingResumeConsumers.size)return void p.debug("resumePendingConsumers() | there is no Consumer to be resumed");const e=Array.from(this._pendingResumeConsumers.values());this._pendingResumeConsumers.clear();try{const t=e.map(e=>e.localId);await this._handler.resumeReceiving(t)}catch(e){p.error("resumePendingConsumers() | failed to resume Consumers:",e)}},"transport.resumePendingConsumers()").then(()=>{this._consumerResumeInProgress=!1,this._pendingResumeConsumers.size>0&&this.resumePendingConsumers()}).catch(()=>{})}closePendingConsumers(){this._consumerCloseInProgress=!0,this._awaitQueue.push(async()=>{if(0===this._pendingCloseConsumers.size)return void p.debug("closePendingConsumers() | there is no Consumer to be closed");const e=Array.from(this._pendingCloseConsumers.values());this._pendingCloseConsumers.clear();try{await this._handler.stopReceiving(e.map(e=>e.localId))}catch(e){p.error("closePendingConsumers() | failed to close Consumers:",e)}},"transport.closePendingConsumers()").then(()=>{this._consumerCloseInProgress=!1,this._pendingCloseConsumers.size>0&&this.closePendingConsumers()}).catch(()=>{})}handleHandler(){const e=this._handler;e.on("@connect",({dtlsParameters:e},t,i)=>{this._closed?i(new r.InvalidStateError("closed")):this.safeEmit("connect",{dtlsParameters:e},t,i)}),e.on("@icegatheringstatechange",e=>{e!==this._iceGatheringState&&(p.debug("ICE gathering state changed to %s",e),this._iceGatheringState=e,this._closed||this.safeEmit("icegatheringstatechange",e))}),e.on("@icecandidateerror",e=>{p.warn(`ICE candidate error [url:${e.url}, localAddress:${e.address}, localPort:${e.port}]: ${e.errorCode} "${e.errorText}"`),this.safeEmit("icecandidateerror",e)}),e.on("@connectionstatechange",e=>{e!==this._connectionState&&(p.debug("connection state changed to %s",e),this._connectionState=e,this._closed||this.safeEmit("connectionstatechange",e))})}handleProducer(e){e.on("@close",()=>{this._producers.delete(e.id),this._closed||this._awaitQueue.push(async()=>await this._handler.stopSending(e.localId),"producer @close event").catch(e=>p.warn("producer.close() failed:%o",e))}),e.on("@pause",(t,i)=>{this._awaitQueue.push(async()=>await this._handler.pauseSending(e.localId),"producer @pause event").then(t).catch(i)}),e.on("@resume",(t,i)=>{this._awaitQueue.push(async()=>await this._handler.resumeSending(e.localId),"producer @resume event").then(t).catch(i)}),e.on("@replacetrack",(t,i,r)=>{this._awaitQueue.push(async()=>await this._handler.replaceTrack(e.localId,t),"producer @replacetrack event").then(i).catch(r)}),e.on("@setmaxspatiallayer",(t,i,r)=>{this._awaitQueue.push(async()=>await this._handler.setMaxSpatialLayer(e.localId,t),"producer @setmaxspatiallayer event").then(i).catch(r)}),e.on("@setrtpencodingparameters",(t,i,r)=>{this._awaitQueue.push(async()=>await this._handler.setRtpEncodingParameters(e.localId,t),"producer @setrtpencodingparameters event").then(i).catch(r)}),e.on("@getstats",(t,i)=>{if(this._closed)return i(new r.InvalidStateError("closed"));this._handler.getSenderStats(e.localId).then(t).catch(i)})}handleConsumer(e){e.on("@close",()=>{this._consumers.delete(e.id),this._pendingPauseConsumers.delete(e.id),this._pendingResumeConsumers.delete(e.id),this._closed||(this._pendingCloseConsumers.set(e.id,e),!1===this._consumerCloseInProgress&&this.closePendingConsumers())}),e.on("@pause",()=>{this._pendingResumeConsumers.has(e.id)&&this._pendingResumeConsumers.delete(e.id),this._pendingPauseConsumers.set(e.id,e),queueMicrotask(()=>{this._closed||!1===this._consumerPauseInProgress&&this.pausePendingConsumers()})}),e.on("@resume",()=>{this._pendingPauseConsumers.has(e.id)&&this._pendingPauseConsumers.delete(e.id),this._pendingResumeConsumers.set(e.id,e),queueMicrotask(()=>{this._closed||!1===this._consumerResumeInProgress&&this.resumePendingConsumers()})}),e.on("@getstats",(t,i)=>{if(this._closed)return i(new r.InvalidStateError("closed"));this._handler.getReceiverStats(e.localId).then(t).catch(i)})}handleDataProducer(e){e.on("@close",()=>{this._dataProducers.delete(e.id)})}handleDataConsumer(e){e.on("@close",()=>{this._dataConsumers.delete(e.id)})}};return he.Transport=h,he}var Me,Le,Oe,Ae,je,Fe={},Ne={},$e={},Ue={exports:{}};function Be(){if(Me)return Ue.exports;Me=1;var e=Ue.exports={v:[{name:"version",reg:/^(\d*)$/}],o:[{name:"origin",reg:/^(\S*) (\d*) (\d*) (\S*) IP(\d) (\S*)/,names:["username","sessionId","sessionVersion","netType","ipVer","address"],format:"%s %s %d %s IP%d %s"}],s:[{name:"name"}],i:[{name:"description"}],u:[{name:"uri"}],e:[{name:"email"}],p:[{name:"phone"}],z:[{name:"timezones"}],r:[{name:"repeats"}],t:[{name:"timing",reg:/^(\d*) (\d*)/,names:["start","stop"],format:"%d %d"}],c:[{name:"connection",reg:/^IN IP(\d) (\S*)/,names:["version","ip"],format:"IN IP%d %s"}],b:[{push:"bandwidth",reg:/^(TIAS|AS|CT|RR|RS):(\d*)/,names:["type","limit"],format:"%s:%s"}],m:[{reg:/^(\w*) (\d*) ([\w/]*)(?: (.*))?/,names:["type","port","protocol","payloads"],format:"%s %d %s %s"}],a:[{push:"rtp",reg:/^rtpmap:(\d*) ([\w\-.]*)(?:\s*\/(\d*)(?:\s*\/(\S*))?)?/,names:["payload","codec","rate","encoding"],format:function(e){return e.encoding?"rtpmap:%d %s/%s/%s":e.rate?"rtpmap:%d %s/%s":"rtpmap:%d %s"}},{push:"fmtp",reg:/^fmtp:(\d*) ([\S| ]*)/,names:["payload","config"],format:"fmtp:%d %s"},{name:"control",reg:/^control:(.*)/,format:"control:%s"},{name:"rtcp",reg:/^rtcp:(\d*)(?: (\S*) IP(\d) (\S*))?/,names:["port","netType","ipVer","address"],format:function(e){return null!=e.address?"rtcp:%d %s IP%d %s":"rtcp:%d"}},{push:"rtcpFbTrrInt",reg:/^rtcp-fb:(\*|\d*) trr-int (\d*)/,names:["payload","value"],format:"rtcp-fb:%s trr-int %d"},{push:"rtcpFb",reg:/^rtcp-fb:(\*|\d*) ([\w-_]*)(?: ([\w-_]*))?/,names:["payload","type","subtype"],format:function(e){return null!=e.subtype?"rtcp-fb:%s %s %s":"rtcp-fb:%s %s"}},{push:"ext",reg:/^extmap:(\d+)(?:\/(\w+))?(?: (urn:ietf:params:rtp-hdrext:encrypt))? (\S*)(?: (\S*))?/,names:["value","direction","encrypt-uri","uri","config"],format:function(e){return"extmap:%d"+(e.direction?"/%s":"%v")+(e["encrypt-uri"]?" %s":"%v")+" %s"+(e.config?" %s":"")}},{name:"extmapAllowMixed",reg:/^(extmap-allow-mixed)/},{push:"crypto",reg:/^crypto:(\d*) ([\w_]*) (\S*)(?: (\S*))?/,names:["id","suite","config","sessionConfig"],format:function(e){return null!=e.sessionConfig?"crypto:%d %s %s %s":"crypto:%d %s %s"}},{name:"setup",reg:/^setup:(\w*)/,format:"setup:%s"},{name:"connectionType",reg:/^connection:(new|existing)/,format:"connection:%s"},{name:"mid",reg:/^mid:([^\s]*)/,format:"mid:%s"},{push:"msid",reg:/^msid:([\w-]+)(?: ([\w-]+))?/,names:["id","appdata"],format:"msid:%s %s"},{name:"ptime",reg:/^ptime:(\d*(?:\.\d*)*)/,format:"ptime:%d"},{name:"maxptime",reg:/^maxptime:(\d*(?:\.\d*)*)/,format:"maxptime:%d"},{name:"direction",reg:/^(sendrecv|recvonly|sendonly|inactive)/},{name:"icelite",reg:/^(ice-lite)/},{name:"iceUfrag",reg:/^ice-ufrag:(\S*)/,format:"ice-ufrag:%s"},{name:"icePwd",reg:/^ice-pwd:(\S*)/,format:"ice-pwd:%s"},{name:"fingerprint",reg:/^fingerprint:(\S*) (\S*)/,names:["type","hash"],format:"fingerprint:%s %s"},{push:"candidates",reg:/^candidate:(\S*) (\d*) (\S*) (\d*) (\S*) (\d*) typ (\S*)(?: raddr (\S*) rport (\d*))?(?: tcptype (\S*))?(?: generation (\d*))?(?: network-id (\d*))?(?: network-cost (\d*))?/,names:["foundation","component","transport","priority","ip","port","type","raddr","rport","tcptype","generation","network-id","network-cost"],format:function(e){var t="candidate:%s %d %s %d %s %d typ %s";return t+=null!=e.raddr?" raddr %s rport %d":"%v%v",t+=null!=e.tcptype?" tcptype %s":"%v",null!=e.generation&&(t+=" generation %d"),t+=null!=e["network-id"]?" network-id %d":"%v",t+=null!=e["network-cost"]?" network-cost %d":"%v"}},{name:"endOfCandidates",reg:/^(end-of-candidates)/},{name:"remoteCandidates",reg:/^remote-candidates:(.*)/,format:"remote-candidates:%s"},{name:"iceOptions",reg:/^ice-options:(\S*)/,format:"ice-options:%s"},{push:"ssrcs",reg:/^ssrc:(\d*) ([\w_-]*)(?::(.*))?/,names:["id","attribute","value"],format:function(e){var t="ssrc:%d";return null!=e.attribute&&(t+=" %s",null!=e.value&&(t+=":%s")),t}},{push:"ssrcGroups",reg:/^ssrc-group:([\x21\x23\x24\x25\x26\x27\x2A\x2B\x2D\x2E\w]*) (.*)/,names:["semantics","ssrcs"],format:"ssrc-group:%s %s"},{name:"msidSemantic",reg:/^msid-semantic:\s?(\w*) (\S*)/,names:["semantic","token"],format:"msid-semantic: %s %s"},{push:"groups",reg:/^group:(\w*) (.*)/,names:["type","mids"],format:"group:%s %s"},{name:"rtcpMux",reg:/^(rtcp-mux)/},{name:"rtcpRsize",reg:/^(rtcp-rsize)/},{name:"sctpmap",reg:/^sctpmap:([\w_/]*) (\S*)(?: (\S*))?/,names:["sctpmapNumber","app","maxMessageSize"],format:function(e){return null!=e.maxMessageSize?"sctpmap:%s %s %s":"sctpmap:%s %s"}},{name:"xGoogleFlag",reg:/^x-google-flag:([^\s]*)/,format:"x-google-flag:%s"},{push:"rids",reg:/^rid:([\d\w]+) (\w+)(?: ([\S| ]*))?/,names:["id","direction","params"],format:function(e){return e.params?"rid:%s %s %s":"rid:%s %s"}},{push:"imageattrs",reg:new RegExp("^imageattr:(\\d+|\\*)[\\s\\t]+(send|recv)[\\s\\t]+(\\*|\\[\\S+\\](?:[\\s\\t]+\\[\\S+\\])*)(?:[\\s\\t]+(recv|send)[\\s\\t]+(\\*|\\[\\S+\\](?:[\\s\\t]+\\[\\S+\\])*))?"),names:["pt","dir1","attrs1","dir2","attrs2"],format:function(e){return"imageattr:%s %s %s"+(e.dir2?" %s %s":"")}},{name:"simulcast",reg:new RegExp("^simulcast:(send|recv) ([a-zA-Z0-9\\-_~;,]+)(?:\\s?(send|recv) ([a-zA-Z0-9\\-_~;,]+))?$"),names:["dir1","list1","dir2","list2"],format:function(e){return"simulcast:%s %s"+(e.dir2?" %s %s":"")}},{name:"simulcast_03",reg:/^simulcast:[\s\t]+([\S+\s\t]+)$/,names:["value"],format:"simulcast: %s"},{name:"framerate",reg:/^framerate:(\d+(?:$|\.\d+))/,format:"framerate:%s"},{name:"sourceFilter",reg:/^source-filter: *(excl|incl) (\S*) (IP4|IP6|\*) (\S*) (.*)/,names:["filterMode","netType","addressTypes","destAddress","srcList"],format:"source-filter: %s %s %s %s %s"},{name:"bundleOnly",reg:/^(bundle-only)/},{name:"label",reg:/^label:(.+)/,format:"label:%s"},{name:"sctpPort",reg:/^sctp-port:(\d+)$/,format:"sctp-port:%s"},{name:"maxMessageSize",reg:/^max-message-size:(\d+)$/,format:"max-message-size:%s"},{push:"tsRefClocks",reg:/^ts-refclk:([^\s=]*)(?:=(\S*))?/,names:["clksrc","clksrcExt"],format:function(e){return"ts-refclk:%s"+(null!=e.clksrcExt?"=%s":"")}},{name:"mediaClk",reg:/^mediaclk:(?:id=(\S*))? *([^\s=]*)(?:=(\S*))?(?: *rate=(\d+)\/(\d+))?/,names:["id","mediaClockName","mediaClockValue","rateNumerator","rateDenominator"],format:function(e){var t="mediaclk:";return t+=null!=e.id?"id=%s %s":"%v%s",t+=null!=e.mediaClockValue?"=%s":"",t+=null!=e.rateNumerator?" rate=%s":"",t+=null!=e.rateDenominator?"/%s":""}},{name:"keywords",reg:/^keywds:(.+)$/,format:"keywds:%s"},{name:"content",reg:/^content:(.+)/,format:"content:%s"},{name:"bfcpFloorCtrl",reg:/^floorctrl:(c-only|s-only|c-s)/,format:"floorctrl:%s"},{name:"bfcpConfId",reg:/^confid:(\d+)/,format:"confid:%s"},{name:"bfcpUserId",reg:/^userid:(\d+)/,format:"userid:%s"},{name:"bfcpFloorId",reg:/^floorid:(.+) (?:m-stream|mstrm):(.+)/,names:["id","mStream"],format:"floorid:%s mstrm:%s"},{push:"invalid",names:["value"]}]};return Object.keys(e).forEach(function(t){e[t].forEach(function(e){e.reg||(e.reg=/(.*)/),e.format||(e.format="%s")})}),Ue.exports}function ze(){return Le||(Le=1,function(e){var t=function(e){return String(Number(e))===e?Number(e):e},i=function(e,i,r){var s=e.name&&e.names;e.push&&!i[e.push]?i[e.push]=[]:s&&!i[e.name]&&(i[e.name]={});var a=e.push?{}:s?i[e.name]:i;!function(e,i,r,s){if(s&&!r)i[s]=t(e[1]);else for(var a=0;a<r.length;a+=1)null!=e[a+1]&&(i[r[a]]=t(e[a+1]))}(r.match(e.reg),a,e.names,e.name),e.push&&i[e.push].push(a)},r=Be(),s=RegExp.prototype.test.bind(/^([a-z])=(.*)/);e.parse=function(e){var t={},a=[],n=t;return e.split(/(\r\n|\r|\n)/).filter(s).forEach(function(e){var t=e[0],s=e.slice(2);"m"===t&&(a.push({rtp:[],fmtp:[]}),n=a[a.length-1]);for(var o=0;o<(r[t]||[]).length;o+=1){var c=r[t][o];if(c.reg.test(s))return i(c,n,s)}}),t.media=a,t};var a=function(e,i){var r=i.split(/=(.+)/,2);return 2===r.length?e[r[0]]=t(r[1]):1===r.length&&i.length>1&&(e[r[0]]=void 0),e};e.parseParams=function(e){return e.split(/;\s?/).reduce(a,{})},e.parseFmtpConfig=e.parseParams,e.parsePayloads=function(e){return e.toString().split(" ").map(Number)},e.parseRemoteCandidates=function(e){for(var i=[],r=e.split(" ").map(t),s=0;s<r.length;s+=3)i.push({component:r[s],ip:r[s+1],port:r[s+2]});return i},e.parseImageAttributes=function(e){return e.split(" ").map(function(e){return e.substring(1,e.length-1).split(",").reduce(a,{})})},e.parseSimulcastStreamList=function(e){return e.split(";").map(function(e){return e.split(",").map(function(e){var i,r=!1;return"~"!==e[0]?i=t(e):(i=t(e.substring(1,e.length)),r=!0),{scid:i,paused:r}})})}}($e)),$e}function Ve(){if(Ae)return Oe;Ae=1;var e=Be(),t=/%[sdv%]/g,i=function(e){var i=1,r=arguments,s=r.length;return e.replace(t,function(e){if(i>=s)return e;var t=r[i];switch(i+=1,e){case"%%":return"%";case"%s":return String(t);case"%d":return Number(t);case"%v":return""}})},r=function(e,t,r){var s=[e+"="+(t.format instanceof Function?t.format(t.push?r:r[t.name]):t.format)];if(t.names)for(var a=0;a<t.names.length;a+=1){var n=t.names[a];t.name?s.push(r[t.name][n]):s.push(r[t.names[a]])}else s.push(r[t.name]);return i.apply(null,s)},s=["v","o","s","i","u","e","p","c","b","t","r","z","a"],a=["i","c","b","a"];return Oe=function(t,i){i=i||{},null==t.version&&(t.version=0),null==t.name&&(t.name=" "),t.media.forEach(function(e){null==e.payloads&&(e.payloads="")});var n=i.outerOrder||s,o=i.innerOrder||a,c=[];return n.forEach(function(i){e[i].forEach(function(e){e.name in t&&null!=t[e.name]?c.push(r(i,e,t)):e.push in t&&null!=t[e.push]&&t[e.push].forEach(function(t){c.push(r(i,e,t))})})}),t.media.forEach(function(t){c.push(r("m",e.m[0],t)),o.forEach(function(i){e[i].forEach(function(e){e.name in t&&null!=t[e.name]?c.push(r(i,e,t)):e.push in t&&null!=t[e.push]&&t[e.push].forEach(function(t){c.push(r(i,e,t))})})})}),c.join("\r\n")+"\r\n"}}function He(){if(je)return Ne;je=1;var e=ze(),t=Ve(),i=Be();return Ne.grammar=i,Ne.write=t,Ne.parse=e.parse,Ne.parseParams=e.parseParams,Ne.parseFmtpConfig=e.parseFmtpConfig,Ne.parsePayloads=e.parsePayloads,Ne.parseRemoteCandidates=e.parseRemoteCandidates,Ne.parseImageAttributes=e.parseImageAttributes,Ne.parseSimulcastStreamList=e.parseSimulcastStreamList,Ne}var qe,Qe={};function Ge(){if(qe)return Qe;qe=1,Object.defineProperty(Qe,"__esModule",{value:!0}),Qe.parse=function(t){const i=e.exec(t??"");return i?{spatialLayers:Number(i[1]),temporalLayers:Number(i[2])}:{spatialLayers:1,temporalLayers:1}};const e=new RegExp("^[LS]([1-9]\\d{0,1})T([1-9]\\d{0,1})");return Qe}var Ke,We,Je={},Ye={};function Xe(){if(We)return Je;We=1,Object.defineProperty(Je,"__esModule",{value:!0}),Je.RemoteSdp=void 0;const e=He(),t=G(),i=function(){if(Ke)return Ye;Ke=1,Object.defineProperty(Ye,"__esModule",{value:!0}),Ye.OfferMediaSection=Ye.AnswerMediaSection=Ye.MediaSection=void 0;const e=He(),t=ie();let i=class{_mediaObject;constructor({iceParameters:e,iceCandidates:t,dtlsParameters:i}){if(this._mediaObject={type:"",port:0,protocol:"",payloads:"",rtp:[],fmtp:[]},e&&this.setIceParameters(e),t){this._mediaObject.candidates=[];for(const e of t){const t={foundation:e.foundation,component:1,ip:e.address??e.ip,port:e.port,priority:e.priority,transport:e.protocol,type:e.type};e.tcpType&&(t.tcptype=e.tcpType),this._mediaObject.candidates.push(t)}this._mediaObject.endOfCandidates="end-of-candidates",this._mediaObject.iceOptions="renomination"}i&&this.setDtlsRole(i.role)}get mid(){return String(this._mediaObject.mid)}get closed(){return 0===this._mediaObject.port}getObject(){return this._mediaObject}setIceParameters(e){this._mediaObject.iceUfrag=e.usernameFragment,this._mediaObject.icePwd=e.password}pause(){this._mediaObject.direction="inactive"}disable(){this.pause()}close(){this.disable(),this._mediaObject.port=0,delete this._mediaObject.candidates,delete this._mediaObject.endOfCandidates,delete this._mediaObject.iceUfrag,delete this._mediaObject.icePwd,delete this._mediaObject.iceOptions,this._mediaObject.rtp=[],this._mediaObject.fmtp=[],delete this._mediaObject.rtcp,delete this._mediaObject.rtcpFb,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}};function r(e){const t=new RegExp("^(audio|video)/(.+)","i").exec(e.mimeType);if(!t)throw new TypeError("invalid codec.mimeType");return t[2]}return Ye.MediaSection=i,Ye.AnswerMediaSection=class extends i{constructor({iceParameters:e,iceCandidates:i,dtlsParameters:s,sctpParameters:a,plainRtpParameters:n,offerMediaObject:o,offerRtpParameters:c,answerRtpParameters:d,codecOptions:p}){switch(super({iceParameters:e,iceCandidates:i,dtlsParameters:s}),this._mediaObject.mid=String(o.mid),this._mediaObject.type=o.type,this._mediaObject.protocol=o.protocol,n?(this._mediaObject.connection={ip:n.ip,version:n.ipVersion},this._mediaObject.port=n.port):(this._mediaObject.connection={ip:"127.0.0.1",version:4},this._mediaObject.port=7),o.type){case"audio":case"video":this._mediaObject.direction="recvonly",this._mediaObject.rtp=[],this._mediaObject.rtcpFb=[],this._mediaObject.fmtp=[];for(const e of d.codecs){const i={payload:e.payloadType,codec:r(e),rate:e.clockRate};e.channels>1&&(i.encoding=e.channels),this._mediaObject.rtp.push(i);const s=t.clone(e.parameters)??{};let a=t.clone(e.rtcpFeedback)??[];if(p){const{opusStereo:t,opusFec:i,opusDtx:r,opusMaxPlaybackRate:n,opusMaxAverageBitrate:o,opusPtime:d,opusNack:l,videoGoogleStartBitrate:h,videoGoogleMaxBitrate:u,videoGoogleMinBitrate:m}=p,f=c.codecs.find(t=>t.payloadType===e.payloadType);switch(e.mimeType.toLowerCase()){case"audio/opus":case"audio/multiopus":void 0!==t&&(f.parameters["sprop-stereo"]=t?1:0,s.stereo=t?1:0),void 0!==i&&(f.parameters.useinbandfec=i?1:0,s.useinbandfec=i?1:0),void 0!==r&&(f.parameters.usedtx=r?1:0,s.usedtx=r?1:0),void 0!==n&&(s.maxplaybackrate=n),void 0!==o&&(s.maxaveragebitrate=o),void 0!==d&&(f.parameters.ptime=d,s.ptime=d),l||(f.rtcpFeedback=f.rtcpFeedback.filter(e=>"nack"!==e.type||e.parameter),a=a.filter(e=>"nack"!==e.type||e.parameter));break;case"video/vp8":case"video/vp9":case"video/h264":case"video/h265":case"video/av1":void 0!==h&&(s["x-google-start-bitrate"]=h),void 0!==u&&(s["x-google-max-bitrate"]=u),void 0!==m&&(s["x-google-min-bitrate"]=m)}}const n={payload:e.payloadType,config:""};for(const e of Object.keys(s))n.config&&(n.config+=";"),n.config+=`${e}=${s[e]}`;n.config&&this._mediaObject.fmtp.push(n);for(const t of a)this._mediaObject.rtcpFb.push({payload:e.payloadType,type:t.type,subtype:t.parameter})}this._mediaObject.payloads=d.codecs.map(e=>e.payloadType).join(" "),this._mediaObject.ext=[];for(const e of d.headerExtensions)(o.ext??[]).some(t=>t.uri===e.uri)&&this._mediaObject.ext.push({uri:e.uri,value:e.id});if("extmap-allow-mixed"===o.extmapAllowMixed&&(this._mediaObject.extmapAllowMixed="extmap-allow-mixed"),o.simulcast){this._mediaObject.simulcast={dir1:"recv",list1:o.simulcast.list1},this._mediaObject.rids=[];for(const e of o.rids??[])"send"===e.direction&&this._mediaObject.rids.push({id:e.id,direction:"recv"})}else if(o.simulcast_03){this._mediaObject.simulcast_03={value:o.simulcast_03.value.replace(/send/g,"recv")},this._mediaObject.rids=[];for(const e of o.rids??[])"send"===e.direction&&this._mediaObject.rids.push({id:e.id,direction:"recv"})}this._mediaObject.rtcpMux="rtcp-mux",this._mediaObject.rtcpRsize="rtcp-rsize";break;case"application":"number"==typeof o.sctpPort?(this._mediaObject.payloads="webrtc-datachannel",this._mediaObject.sctpPort=a.port,this._mediaObject.maxMessageSize=a.maxMessageSize):o.sctpmap&&(this._mediaObject.payloads=String(a.port),this._mediaObject.sctpmap={app:"webrtc-datachannel",sctpmapNumber:a.port,maxMessageSize:a.maxMessageSize})}}setDtlsRole(e){switch(e){case"client":this._mediaObject.setup="active";break;case"server":this._mediaObject.setup="passive";break;case"auto":this._mediaObject.setup="actpass"}}resume(){this._mediaObject.direction="recvonly"}muxSimulcastStreams(t){if(!this._mediaObject.simulcast?.list1)return;const i={};for(const e of t)e.rid&&(i[e.rid]=e);const r=this._mediaObject.simulcast.list1,s=e.parseSimulcastStreamList(r);for(const e of s)for(const t of e)t.paused=!i[t.scid]?.active;this._mediaObject.simulcast.list1=s.map(e=>e.map(e=>`${e.paused?"~":""}${e.scid}`).join(",")).join(";")}},Ye.OfferMediaSection=class extends i{constructor({iceParameters:e,iceCandidates:t,dtlsParameters:i,sctpParameters:s,plainRtpParameters:a,mid:n,kind:o,offerRtpParameters:c,streamId:d,trackId:p}){switch(super({iceParameters:e,iceCandidates:t,dtlsParameters:i}),this._mediaObject.mid=String(n),this._mediaObject.type=o,a?(this._mediaObject.connection={ip:a.ip,version:a.ipVersion},this._mediaObject.protocol="RTP/AVP",this._mediaObject.port=a.port):(this._mediaObject.connection={ip:"127.0.0.1",version:4},this._mediaObject.protocol=s?"UDP/DTLS/SCTP":"UDP/TLS/RTP/SAVPF",this._mediaObject.port=7),this._mediaObject.extmapAllowMixed="extmap-allow-mixed",o){case"audio":case"video":{this._mediaObject.direction="sendonly",this._mediaObject.rtp=[],this._mediaObject.rtcpFb=[],this._mediaObject.fmtp=[],this._mediaObject.msid=[{id:d,appdata:p}];for(const e of c.codecs){const t={payload:e.payloadType,codec:r(e),rate:e.clockRate};e.channels>1&&(t.encoding=e.channels),this._mediaObject.rtp.push(t);const i={payload:e.payloadType,config:""};for(const t of Object.keys(e.parameters??{}))i.config&&(i.config+=";"),i.config+=`${t}=${e.parameters[t]}`;i.config&&this._mediaObject.fmtp.push(i);for(const t of e.rtcpFeedback)this._mediaObject.rtcpFb.push({payload:e.payloadType,type:t.type,subtype:t.parameter})}this._mediaObject.payloads=c.codecs.map(e=>e.payloadType).join(" "),this._mediaObject.ext=[];for(const e of c.headerExtensions)this._mediaObject.ext.push({uri:e.uri,value:e.id});this._mediaObject.rtcpMux="rtcp-mux",this._mediaObject.rtcpRsize="rtcp-rsize";const e=c.encodings[0],t=e.ssrc,i=e.rtx?.ssrc;this._mediaObject.ssrcs=[],this._mediaObject.ssrcGroups=[],t&&c.rtcp.cname&&this._mediaObject.ssrcs.push({id:t,attribute:"cname",value:c.rtcp.cname}),i&&(c.rtcp.cname&&this._mediaObject.ssrcs.push({id:i,attribute:"cname",value:c.rtcp.cname}),t&&this._mediaObject.ssrcGroups.push({semantics:"FID",ssrcs:`${t} ${i}`}));break}case"application":this._mediaObject.payloads="webrtc-datachannel",this._mediaObject.sctpPort=s.port,this._mediaObject.maxMessageSize=s.maxMessageSize}}setDtlsRole(e){this._mediaObject.setup="actpass"}resume(){this._mediaObject.direction="sendonly"}},Ye}(),r=Nt(),s=["av1","h264"],a=new t.Logger("RemoteSdp");return Je.RemoteSdp=class{_iceParameters;_iceCandidates;_dtlsParameters;_sctpParameters;_plainRtpParameters;_mediaSections=[];_midToIndex=new Map;_firstMid;_sdpObject;constructor({iceParameters:e,iceCandidates:t,dtlsParameters:i,sctpParameters:s,plainRtpParameters:a}){if(this._iceParameters=e,this._iceCandidates=t,this._dtlsParameters=i,this._sctpParameters=s,this._plainRtpParameters=a,this._sdpObject={version:0,origin:{address:"0.0.0.0",ipVer:4,netType:"IN",sessionId:"10000",sessionVersion:0,username:`mediasoup-client-v${r.version}`},name:"-",timing:{start:0,stop:0},media:[]},this._sdpObject.iceOptions="ice2",e?.iceLite&&(this._sdpObject.icelite="ice-lite"),i){this._sdpObject.msidSemantic={semantic:"WMS",token:"*"};const e=this._dtlsParameters.fingerprints.length;this._sdpObject.fingerprint={type:i.fingerprints[e-1].algorithm,hash:i.fingerprints[e-1].value},this._sdpObject.groups=[{type:"BUNDLE",mids:""}]}a&&(this._sdpObject.origin.address=a.ip,this._sdpObject.origin.ipVer=a.ipVersion)}updateIceParameters(e){a.debug("updateIceParameters() [iceParameters:%o]",e),this._iceParameters=e,this._sdpObject.icelite=e.iceLite?"ice-lite":void 0;for(const t of this._mediaSections)t.setIceParameters(e)}updateDtlsRole(e){a.debug("updateDtlsRole() [role:%s]",e),this._dtlsParameters.role=e;for(const t of this._mediaSections)t.setDtlsRole(e)}setSessionExtmapAllowMixed(){a.debug("setSessionExtmapAllowMixed()"),this._sdpObject.extmapAllowMixed="extmap-allow-mixed"}getNextMediaSectionIdx(){for(let e=0;e<this._mediaSections.length;++e){const t=this._mediaSections[e];if(t.closed)return{idx:e,reuseMid:t.mid}}return{idx:this._mediaSections.length}}send({offerMediaObject:e,reuseMid:t,offerRtpParameters:r,answerRtpParameters:a,codecOptions:n}){const o=new i.AnswerMediaSection({iceParameters:this._iceParameters,iceCandidates:this._iceCandidates,dtlsParameters:this._dtlsParameters,plainRtpParameters:this._plainRtpParameters,offerMediaObject:e,offerRtpParameters:r,answerRtpParameters:a,codecOptions:n}),c=o.getObject();c.rtp.find(e=>s.includes(e.codec.toLowerCase()))||(c.ext=c.ext?.filter(e=>"https://aomediacodec.github.io/av1-rtp-spec/#dependency-descriptor-rtp-header-extension"!==e.uri)),t?this.replaceMediaSection(o,t):this._midToIndex.has(o.mid)?this.replaceMediaSection(o):this.addMediaSection(o)}receive({mid:e,kind:t,offerRtpParameters:r,streamId:s,trackId:a}){this.setSessionExtmapAllowMixed();const n=new i.OfferMediaSection({iceParameters:this._iceParameters,iceCandidates:this._iceCandidates,dtlsParameters:this._dtlsParameters,plainRtpParameters:this._plainRtpParameters,mid:e,kind:t,offerRtpParameters:r,streamId:s,trackId:a}),o=this._mediaSections.find(e=>e.closed);o?this.replaceMediaSection(n,o.mid):this.addMediaSection(n)}pauseMediaSection(e){this.findMediaSection(e).pause()}resumeSendingMediaSection(e){this.findMediaSection(e).resume()}resumeReceivingMediaSection(e){this.findMediaSection(e).resume()}disableMediaSection(e){this.findMediaSection(e).disable()}closeMediaSection(e){const t=this.findMediaSection(e);return e===this._firstMid?(a.debug("closeMediaSection() | cannot close first media section, disabling it instead [mid:%s]",e),this.disableMediaSection(e),!1):(t.close(),this.regenerateBundleMids(),!0)}muxMediaSectionSimulcast(e,t){const i=this.findMediaSection(e);i.muxSimulcastStreams(t),this.replaceMediaSection(i)}sendSctpAssociation({offerMediaObject:e}){const t=new i.AnswerMediaSection({iceParameters:this._iceParameters,iceCandidates:this._iceCandidates,dtlsParameters:this._dtlsParameters,sctpParameters:this._sctpParameters,plainRtpParameters:this._plainRtpParameters,offerMediaObject:e});this.addMediaSection(t)}receiveSctpAssociation(){const e=new i.OfferMediaSection({iceParameters:this._iceParameters,iceCandidates:this._iceCandidates,dtlsParameters:this._dtlsParameters,sctpParameters:this._sctpParameters,plainRtpParameters:this._plainRtpParameters,mid:"datachannel",kind:"application"});this.addMediaSection(e)}getSdp(){return this._sdpObject.origin.sessionVersion++,e.write(this._sdpObject)}addMediaSection(e){this._firstMid||(this._firstMid=e.mid),this._mediaSections.push(e),this._midToIndex.set(e.mid,this._mediaSections.length-1),this._sdpObject.media.push(e.getObject()),this.regenerateBundleMids()}replaceMediaSection(e,t){if("string"==typeof t){const i=this._midToIndex.get(t);if(void 0===i)throw new Error(`no media section found for reuseMid '${t}'`);const r=this._mediaSections[i];this._mediaSections[i]=e,this._midToIndex.delete(r.mid),this._midToIndex.set(e.mid,i),this._sdpObject.media[i]=e.getObject(),this.regenerateBundleMids()}else{const t=this._midToIndex.get(e.mid);if(void 0===t)throw new Error(`no media section found with mid '${e.mid}'`);this._mediaSections[t]=e,this._sdpObject.media[t]=e.getObject()}}findMediaSection(e){const t=this._midToIndex.get(e);if(void 0===t)throw new Error(`no media section found with mid '${e}'`);return this._mediaSections[t]}regenerateBundleMids(){this._dtlsParameters&&(this._sdpObject.groups[0].mids=this._mediaSections.filter(e=>!e.closed).map(e=>e.mid).join(" "))}},Je}var Ze,et={};function tt(){if(Ze)return et;Ze=1,Object.defineProperty(et,"__esModule",{value:!0}),et.extractRtpCapabilities=function({sdpObject:t}){const i=new Map,r=new Map;for(const s of t.media){const t=s.type;switch(t){case"audio":case"video":break;default:continue}for(const e of s.rtp){const r={kind:t,mimeType:`${t}/${e.codec}`,preferredPayloadType:e.payload,clockRate:e.rate,channels:e.encoding,parameters:{},rtcpFeedback:[]};i.set(r.preferredPayloadType,r)}for(const t of s.fmtp??[]){const r=e.parseParams(t.config),s=i.get(t.payload);s&&(r?.hasOwnProperty("profile-level-id")&&(r["profile-level-id"]=String(r["profile-level-id"])),s.parameters=r)}for(const e of s.rtcpFb??[]){const r={type:e.type,parameter:e.subtype};if(r.parameter||delete r.parameter,"*"!==e.payload){const t=i.get(Number(e.payload));if(!t)continue;t.rtcpFeedback.push(r)}else for(const e of i.values())e.kind!==t||/.+\/rtx$/i.test(e.mimeType)||e.rtcpFeedback.push(r)}for(const e of s.ext??[]){if(e["encrypt-uri"])continue;const i={kind:t,uri:e.uri,preferredId:e.value};r.set(i.preferredId,i)}}return{codecs:Array.from(i.values()),headerExtensions:Array.from(r.values())}},et.extractDtlsParameters=function({sdpObject:e}){let t,i=e.setup,r=e.fingerprint;if(!i||!r){const t=(e.media??[]).find(e=>0!==e.port);t&&(i=i??t.setup,r=r??t.fingerprint)}if(!i)throw new Error("no a=setup found at SDP session or media level");if(!r)throw new Error("no a=fingerprint found at SDP session or media level");switch(i){case"active":t="client";break;case"passive":t="server";break;case"actpass":t="auto"}return{role:t,fingerprints:[{algorithm:r.type,value:r.hash}]}},et.getCname=function({offerMediaObject:e}){const t=(e.ssrcs??[]).find(e=>"cname"===e.attribute);if(!t)return"";return t.value},et.applyCodecParameters=function({offerRtpParameters:t,answerMediaObject:i}){for(const r of t.codecs){const t=r.mimeType.toLowerCase();if("audio/opus"!==t)continue;if(!(i.rtp??[]).find(e=>e.payload===r.payloadType))continue;i.fmtp=i.fmtp??[];let s=i.fmtp.find(e=>e.payload===r.payloadType);s||(s={payload:r.payloadType,config:""},i.fmtp.push(s));const a=e.parseParams(s.config);switch(t){case"audio/opus":{const e=r.parameters?.["sprop-stereo"];void 0!==e&&(a.stereo=Number(e)?1:0);break}}s.config="";for(const e of Object.keys(a))s.config&&(s.config+=";"),s.config+=`${e}=${a[e]}`}},et.addHeaderExtension=function({offerMediaObject:e,headerExtensionUri:t,headerExtensionId:i}){e.ext||(e.ext=[]);e.ext.push({uri:t,value:i})};const e=He();return et}var it,rt={};function st(){if(it)return rt;return it=1,Object.defineProperty(rt,"__esModule",{value:!0}),rt.getRtpEncodings=function({offerMediaObject:e,codecs:t}){const i=new Set;for(const t of e.ssrcs??[]){const e=t.id;e&&i.add(e)}if(0===i.size)throw new Error("no a=ssrc lines found");const r=new Map;for(const t of e.ssrcGroups??[]){if("FID"!==t.semantics)continue;const e=t.ssrcs.split(/\s+/),s=Number(e[0]),a=Number(e[1]);i.has(s)&&(i.delete(s),i.delete(a),r.set(s,a))}for(const e of i)r.set(e,void 0);const s=[];for(const[e,i]of r){const r={ssrc:e};i&&t.length>1&&(r.rtx={ssrc:i}),s.push(r)}return s},rt.addLegacySimulcast=function({offerMediaObject:e,numStreams:t}){if(t<=1)throw new TypeError("numStreams must be greater than 1");const i=(e.ssrcs??[]).find(e=>"msid"===e.attribute);if(!i)throw new Error("a=ssrc line with msid information not found");const[r,s]=i.value.split(" "),a=Number(i.id);let n;(e.ssrcGroups??[]).some(e=>{if("FID"!==e.semantics)return!1;const t=e.ssrcs.split(/\s+/);return Number(t[0])===a&&(n=Number(t[1]),!0)});const o=(e.ssrcs??[]).find(e=>"cname"===e.attribute);if(!o)throw new Error("a=ssrc line with cname information not found");const c=o.value,d=[],p=[];for(let e=0;e<t;++e)d.push(a+e),n&&p.push(n+e);e.ssrcGroups=[],e.ssrcs=[],e.ssrcGroups.push({semantics:"SIM",ssrcs:d.join(" ")});for(const t of d)e.ssrcs.push({id:t,attribute:"cname",value:c}),e.ssrcs.push({id:t,attribute:"msid",value:`${r} ${s}`});for(let t=0;t<p.length;++t){const i=d[t],a=p[t];e.ssrcs.push({id:a,attribute:"cname",value:c}),e.ssrcs.push({id:a,attribute:"msid",value:`${r} ${s}`}),e.ssrcGroups.push({semantics:"FID",ssrcs:`${i} ${a}`})}},rt}var at,nt,ot={};function ct(){if(at)return ot;return at=1,Object.defineProperty(ot,"__esModule",{value:!0}),ot.addNackSupportForOpus=function(e){for(const t of e.codecs??[])"audio/opus"!==t.mimeType.toLowerCase()&&"audio/multiopus"!==t.mimeType.toLowerCase()||t.rtcpFeedback?.some(e=>"nack"===e.type&&!e.parameter)||(t.rtcpFeedback||(t.rtcpFeedback=[]),t.rtcpFeedback.push({type:"nack"}))},ot.addHeaderExtensionSupport=function(e,t){let i;const r=e.headerExtensions?.find(e=>e.uri===t.uri);if(r){if(r.kind===t.kind)return;i=r.preferredId}e.headerExtensions||(e.headerExtensions=[]);if(void 0===i){i=1;const t=new Set(e.headerExtensions.map(e=>e.preferredId));for(;t.has(i);)++i}const s={kind:t.kind,uri:t.uri,preferredId:i,preferredEncrypt:!1,direction:t.direction};e.headerExtensions.push(s)},ot.getMsidStreamIdAndTrackId=function(e){if(!e||"string"!=typeof e)return{msidStreamId:void 0,msidTrackId:void 0};const[t,i]=e.trim().split(/\s+/);if(!t)return{msidStreamId:void 0,msidTrackId:void 0};return{msidStreamId:t,msidTrackId:i}},ot}var dt,pt={};var lt,ht={};var ut,mt={};var ft,gt,vt={};function bt(){if(gt)return q;gt=1,Object.defineProperty(q,"__esModule",{value:!0}),q.Device=void 0,q.detectDevice=h,q.detectDeviceAsync=u;const e=G(),t=J(),i=Z(),r=ie(),s=pe(),a=Ie(),n=function(){if(nt)return Fe;nt=1,Object.defineProperty(Fe,"__esModule",{value:!0}),Fe.Chrome111=void 0;const e=He(),t=J(),i=G(),r=pe(),s=Z(),a=Ge(),n=Xe(),o=tt(),c=st(),d=ct(),p=new i.Logger("Chrome111"),l="Chrome111",h={OS:1024,MIS:1024};let u=class i extends t.EnhancedEventEmitter{_closed=!1;_direction;_remoteSdp;_getSendExtendedRtpCapabilities;_forcedLocalDtlsRole;_pc;_mapMidTransceiver=new Map;_sendStream=new MediaStream;_hasDataChannelMediaSection=!1;_nextSendSctpStreamId=0;_transportReady=!1;static createFactory(){return{name:l,factory:e=>new i(e),getNativeRtpCapabilities:async({direction:t})=>{p.debug("getNativeRtpCapabilities() [direction:%o]",t);let r=new RTCPeerConnection({iceServers:[],iceTransportPolicy:"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require"});try{r.addTransceiver("audio",{direction:t}),r.addTransceiver("video",{direction:t,sendEncodings:[{scalabilityMode:"L3T3"}]});const s=await r.createOffer();try{r.close()}catch(e){}r=void 0;const a=e.parse(s.sdp);return i.getLocalRtpCapabilities(a)}catch(e){try{r?.close()}catch(e){}throw r=void 0,e}},getNativeSctpCapabilities:async()=>(p.debug("getNativeSctpCapabilities()"),{numStreams:h})}}static getLocalRtpCapabilities(e,t=[]){const i=o.extractRtpCapabilities({sdpObject:e});r.validateAndNormalizeRtpCapabilities(i),d.addNackSupportForOpus(i);for(const e of t)d.addHeaderExtensionSupport(i,e);return i}constructor({direction:e,iceParameters:t,iceCandidates:i,dtlsParameters:r,sctpParameters:s,iceServers:a,iceTransportPolicy:o,additionalSettings:c,getSendExtendedRtpCapabilities:d}){super(),p.debug("constructor()"),this._direction=e,this._remoteSdp=new n.RemoteSdp({iceParameters:t,iceCandidates:i,dtlsParameters:r,sctpParameters:s}),this._getSendExtendedRtpCapabilities=d,r.role&&"auto"!==r.role&&(this._forcedLocalDtlsRole="server"===r.role?"client":"server"),this._pc=new RTCPeerConnection({iceServers:a??[],iceTransportPolicy:o??"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require",...c}),this._pc.addEventListener("icegatheringstatechange",this.onIceGatheringStateChange),this._pc.addEventListener("icecandidateerror",this.onIceCandidateError),this._pc.connectionState?this._pc.addEventListener("connectionstatechange",this.onConnectionStateChange):(p.warn("run() | pc.connectionState not supported, using pc.iceConnectionState"),this._pc.addEventListener("iceconnectionstatechange",this.onIceConnectionStateChange))}get name(){return l}close(){if(p.debug("close()"),!this._closed){this._closed=!0;try{this._pc.close()}catch(e){}this._pc.removeEventListener("icegatheringstatechange",this.onIceGatheringStateChange),this._pc.removeEventListener("icecandidateerror",this.onIceCandidateError),this._pc.removeEventListener("connectionstatechange",this.onConnectionStateChange),this._pc.removeEventListener("iceconnectionstatechange",this.onIceConnectionStateChange),this.emit("@close"),super.close()}}async updateIceServers(e){this.assertNotClosed(),p.debug("updateIceServers()");const t=this._pc.getConfiguration();t.iceServers=e,this._pc.setConfiguration(t)}async restartIce(e){if(this.assertNotClosed(),p.debug("restartIce()"),this._remoteSdp.updateIceParameters(e),this._transportReady)if("send"===this._direction){const e=await this._pc.createOffer({iceRestart:!0});p.debug("restartIce() | calling pc.setLocalDescription() [offer:%o]",e),await this._pc.setLocalDescription(e);const t={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("restartIce() | calling pc.setRemoteDescription() [answer:%o]",t),await this._pc.setRemoteDescription(t)}else{const e={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("restartIce() | calling pc.setRemoteDescription() [offer:%o]",e),await this._pc.setRemoteDescription(e);const t=await this._pc.createAnswer();p.debug("restartIce() | calling pc.setLocalDescription() [answer:%o]",t),await this._pc.setLocalDescription(t)}}async getTransportStats(){return this.assertNotClosed(),this._pc.getStats()}async send({track:t,streamId:s,encodings:n,codecOptions:d,headerExtensionOptions:l,codec:h,onRtpSender:u}){if(this.assertNotClosed(),this.assertSendDirection(),p.debug("send() [kind:%s, track.id:%s, streamId:%s]",t.kind,t.id,s),n&&n.length>1){let e=1;for(const t of n){const i=t.scalabilityMode?(0,a.parse)(t.scalabilityMode).temporalLayers:3;i>e&&(e=i)}n.forEach((t,i)=>{t.rid=`r${i}`,t.scalabilityMode=`L1T${e}`})}const m=this._remoteSdp.getNextMediaSectionIdx(),f=this._pc.addTransceiver(t,{direction:"sendonly",streams:[this._sendStream],sendEncodings:n});u&&u(f.sender);let g=await this._pc.createOffer(),v=e.parse(g.sdp);v.extmapAllowMixed&&this._remoteSdp.setSessionExtmapAllowMixed();const b=[];b.push({uri:"http://www.webrtc.org/experiments/rtp-hdrext/abs-capture-time",kind:t.kind,direction:"sendonly"});const _=i.getLocalRtpCapabilities(v,b),y=this._getSendExtendedRtpCapabilities(_),S=r.getSendingRtpParameters(t.kind,y);S.codecs=r.reduceCodecs(S.codecs,h);const w=r.getSendingRemoteRtpParameters(t.kind,y);if(w.codecs=r.reduceCodecs(w.codecs,h),this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:v}),l?.absCaptureTime){const t=v.media[m.idx];o.addHeaderExtension({offerMediaObject:t,headerExtensionUri:"http://www.webrtc.org/experiments/rtp-hdrext/abs-capture-time",headerExtensionId:w.headerExtensions.find(e=>"http://www.webrtc.org/experiments/rtp-hdrext/abs-capture-time"===e.uri).id}),g={type:"offer",sdp:e.write(v)}}p.debug("send() | calling pc.setLocalDescription() [offer:%o]",g),await this._pc.setLocalDescription(g);const k=f.mid;S.mid=k,v=e.parse(this._pc.localDescription.sdp);const T=v.media[m.idx];if(S.rtcp.cname=o.getCname({offerMediaObject:T}),S.msid=`${s??this._sendStream.id} ${t.id}`,n)if(1===n.length){const e=c.getRtpEncodings({offerMediaObject:T,codecs:S.codecs});Object.assign(e[0],n[0]),S.encodings=e}else S.encodings=n;else S.encodings=c.getRtpEncodings({offerMediaObject:T,codecs:S.codecs});this._remoteSdp.send({offerMediaObject:T,reuseMid:m.reuseMid,offerRtpParameters:S,answerRtpParameters:w,codecOptions:d});const C={type:"answer",sdp:this._remoteSdp.getSdp()};return p.debug("send() | calling pc.setRemoteDescription() [answer:%o]",C),await this._pc.setRemoteDescription(C),this._mapMidTransceiver.set(k,f),{localId:k,rtpParameters:S,rtpSender:f.sender}}async stopSending(e){if(this.assertSendDirection(),p.debug("stopSending() [localId:%s]",e),this._closed)return;const t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated RTCRtpTransceiver not found");if(t.sender.replaceTrack(null),this._pc.removeTrack(t.sender),this._remoteSdp.closeMediaSection(t.mid))try{t.stop()}catch(e){}const i=await this._pc.createOffer();p.debug("stopSending() | calling pc.setLocalDescription() [offer:%o]",i),await this._pc.setLocalDescription(i);const r={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("stopSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r),this._mapMidTransceiver.delete(e)}async pauseSending(e){this.assertNotClosed(),this.assertSendDirection(),p.debug("pauseSending() [localId:%s]",e);const t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated RTCRtpTransceiver not found");t.direction="inactive",this._remoteSdp.pauseMediaSection(e);const i=await this._pc.createOffer();p.debug("pauseSending() | calling pc.setLocalDescription() [offer:%o]",i),await this._pc.setLocalDescription(i);const r={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("pauseSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r)}async resumeSending(e){this.assertNotClosed(),this.assertSendDirection(),p.debug("resumeSending() [localId:%s]",e);const t=this._mapMidTransceiver.get(e);if(this._remoteSdp.resumeSendingMediaSection(e),!t)throw new Error("associated RTCRtpTransceiver not found");t.direction="sendonly";const i=await this._pc.createOffer();p.debug("resumeSending() | calling pc.setLocalDescription() [offer:%o]",i),await this._pc.setLocalDescription(i);const r={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("resumeSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r)}async replaceTrack(e,t){this.assertNotClosed(),this.assertSendDirection(),t?p.debug("replaceTrack() [localId:%s, track.id:%s]",e,t.id):p.debug("replaceTrack() [localId:%s, no track]",e);const i=this._mapMidTransceiver.get(e);if(!i)throw new Error("associated RTCRtpTransceiver not found");await i.sender.replaceTrack(t)}async setMaxSpatialLayer(e,t){this.assertNotClosed(),this.assertSendDirection(),p.debug("setMaxSpatialLayer() [localId:%s, spatialLayer:%s]",e,t);const i=this._mapMidTransceiver.get(e);if(!i)throw new Error("associated RTCRtpTransceiver not found");const r=i.sender.getParameters();r.encodings.forEach((e,i)=>{e.active=i<=t}),await i.sender.setParameters(r),this._remoteSdp.muxMediaSectionSimulcast(e,r.encodings);const s=await this._pc.createOffer();p.debug("setMaxSpatialLayer() | calling pc.setLocalDescription() [offer:%o]",s),await this._pc.setLocalDescription(s);const a={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("setMaxSpatialLayer() | calling pc.setRemoteDescription() [answer:%o]",a),await this._pc.setRemoteDescription(a)}async setRtpEncodingParameters(e,t){this.assertNotClosed(),this.assertSendDirection(),p.debug("setRtpEncodingParameters() [localId:%s, params:%o]",e,t);const i=this._mapMidTransceiver.get(e);if(!i)throw new Error("associated RTCRtpTransceiver not found");const r=i.sender.getParameters();r.encodings.forEach((e,i)=>{r.encodings[i]={...e,...t}}),await i.sender.setParameters(r),this._remoteSdp.muxMediaSectionSimulcast(e,r.encodings);const s=await this._pc.createOffer();p.debug("setRtpEncodingParameters() | calling pc.setLocalDescription() [offer:%o]",s),await this._pc.setLocalDescription(s);const a={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("setRtpEncodingParameters() | calling pc.setRemoteDescription() [answer:%o]",a),await this._pc.setRemoteDescription(a)}async getSenderStats(e){this.assertNotClosed(),this.assertSendDirection();const t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated RTCRtpTransceiver not found");return t.sender.getStats()}async sendDataChannel({ordered:t,maxPacketLifeTime:i,maxRetransmits:r,label:s,protocol:a}){this.assertNotClosed(),this.assertSendDirection();const n={negotiated:!0,id:this._nextSendSctpStreamId,ordered:t,maxPacketLifeTime:i,maxRetransmits:r,protocol:a};p.debug("sendDataChannel() [options:%o]",n);const o=this._pc.createDataChannel(s,n);if(this._nextSendSctpStreamId=++this._nextSendSctpStreamId%h.MIS,!this._hasDataChannelMediaSection){const t=await this._pc.createOffer(),i=e.parse(t.sdp),r=i.media.find(e=>"application"===e.type);this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:i}),p.debug("sendDataChannel() | calling pc.setLocalDescription() [offer:%o]",t),await this._pc.setLocalDescription(t),this._remoteSdp.sendSctpAssociation({offerMediaObject:r});const s={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]",s),await this._pc.setRemoteDescription(s),this._hasDataChannelMediaSection=!0}return{dataChannel:o,sctpStreamParameters:{streamId:n.id,ordered:n.ordered,maxPacketLifeTime:n.maxPacketLifeTime,maxRetransmits:n.maxRetransmits}}}async receive(t){this.assertNotClosed(),this.assertRecvDirection();const i=[],r=new Map;for(const e of t){const{trackId:t,kind:i,rtpParameters:s,streamId:a}=e;p.debug("receive() [trackId:%s, kind:%s]",t,i);const n=s.mid??String(this._mapMidTransceiver.size);r.set(t,n);const{msidStreamId:o}=d.getMsidStreamIdAndTrackId(s.msid);this._remoteSdp.receive({mid:n,kind:i,offerRtpParameters:s,streamId:a??o??s.rtcp?.cname??"-",trackId:t})}const s={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("receive() | calling pc.setRemoteDescription() [offer:%o]",s),await this._pc.setRemoteDescription(s);for(const e of t){const{trackId:t,onRtpReceiver:i}=e;if(i){const e=r.get(t),s=this._pc.getTransceivers().find(t=>t.mid===e);if(!s)throw new Error("transceiver not found");i(s.receiver)}}let a=await this._pc.createAnswer();const n=e.parse(a.sdp);for(const e of t){const{trackId:t,rtpParameters:i}=e,s=r.get(t),a=n.media.find(e=>String(e.mid)===s);o.applyCodecParameters({offerRtpParameters:i,answerMediaObject:a})}a={type:"answer",sdp:e.write(n)},this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:n}),p.debug("receive() | calling pc.setLocalDescription() [answer:%o]",a),await this._pc.setLocalDescription(a);for(const e of t){const{trackId:t}=e,s=r.get(t),a=this._pc.getTransceivers().find(e=>e.mid===s);if(!a)throw new Error("new RTCRtpTransceiver not found");this._mapMidTransceiver.set(s,a),i.push({localId:s,track:a.receiver.track,rtpReceiver:a.receiver})}return i}async stopReceiving(e){if(this.assertRecvDirection(),this._closed)return;for(const t of e){p.debug("stopReceiving() [localId:%s]",t);const e=this._mapMidTransceiver.get(t);if(!e)throw new Error("associated RTCRtpTransceiver not found");this._remoteSdp.closeMediaSection(e.mid)}const t={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("stopReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const i=await this._pc.createAnswer();p.debug("stopReceiving() | calling pc.setLocalDescription() [answer:%o]",i),await this._pc.setLocalDescription(i);for(const t of e)this._mapMidTransceiver.delete(t)}async pauseReceiving(e){this.assertNotClosed(),this.assertRecvDirection();for(const t of e){p.debug("pauseReceiving() [localId:%s]",t);const e=this._mapMidTransceiver.get(t);if(!e)throw new Error("associated RTCRtpTransceiver not found");e.direction="inactive",this._remoteSdp.pauseMediaSection(t)}const t={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("pauseReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const i=await this._pc.createAnswer();p.debug("pauseReceiving() | calling pc.setLocalDescription() [answer:%o]",i),await this._pc.setLocalDescription(i)}async resumeReceiving(e){this.assertNotClosed(),this.assertRecvDirection();for(const t of e){p.debug("resumeReceiving() [localId:%s]",t);const e=this._mapMidTransceiver.get(t);if(!e)throw new Error("associated RTCRtpTransceiver not found");e.direction="recvonly",this._remoteSdp.resumeReceivingMediaSection(t)}const t={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("resumeReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const i=await this._pc.createAnswer();p.debug("resumeReceiving() | calling pc.setLocalDescription() [answer:%o]",i),await this._pc.setLocalDescription(i)}async getReceiverStats(e){this.assertNotClosed(),this.assertRecvDirection();const t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated RTCRtpTransceiver not found");return t.receiver.getStats()}async receiveDataChannel({sctpStreamParameters:t,label:i,protocol:r}){this.assertNotClosed(),this.assertRecvDirection();const{streamId:s,ordered:a,maxPacketLifeTime:n,maxRetransmits:o}=t,c={negotiated:!0,id:s,ordered:a,maxPacketLifeTime:n,maxRetransmits:o,protocol:r};p.debug("receiveDataChannel() [options:%o]",c);const d=this._pc.createDataChannel(i,c);if(!this._hasDataChannelMediaSection){this._remoteSdp.receiveSctpAssociation();const t={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("receiveDataChannel() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const i=await this._pc.createAnswer();if(!this._transportReady){const t=e.parse(i.sdp);await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:t})}p.debug("receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]",i),await this._pc.setLocalDescription(i),this._hasDataChannelMediaSection=!0}return{dataChannel:d}}async setupTransport({localDtlsRole:t,localSdpObject:i}){i||(i=e.parse(this._pc.localDescription.sdp));const r=o.extractDtlsParameters({sdpObject:i});r.role=t,this._remoteSdp.updateDtlsRole("client"===t?"server":"client"),await new Promise((e,t)=>{this.safeEmit("@connect",{dtlsParameters:r},e,t)}),this._transportReady=!0}onIceGatheringStateChange=()=>{this.emit("@icegatheringstatechange",this._pc.iceGatheringState)};onIceCandidateError=e=>{this.emit("@icecandidateerror",e)};onConnectionStateChange=()=>{this.emit("@connectionstatechange",this._pc.connectionState)};onIceConnectionStateChange=()=>{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")}};assertNotClosed(){if(this._closed)throw new s.InvalidStateError("method called in a closed handler")}assertSendDirection(){if("send"!==this._direction)throw new Error('method can just be called for handlers with "send" direction')}assertRecvDirection(){if("recv"!==this._direction)throw new Error('method can just be called for handlers with "recv" direction')}};return Fe.Chrome111=u,Fe}(),o=function(){if(dt)return pt;dt=1,Object.defineProperty(pt,"__esModule",{value:!0}),pt.Chrome74=void 0;const e=He(),t=G(),i=J(),r=pe(),s=Z(),a=Ge(),n=Xe(),o=tt(),c=st(),d=ct(),p=new t.Logger("Chrome74"),l="Chrome74",h={OS:1024,MIS:1024};let u=class t extends i.EnhancedEventEmitter{_closed=!1;_direction;_remoteSdp;_getSendExtendedRtpCapabilities;_forcedLocalDtlsRole;_pc;_mapMidTransceiver=new Map;_sendStream=new MediaStream;_hasDataChannelMediaSection=!1;_nextSendSctpStreamId=0;_transportReady=!1;static createFactory(){return{name:l,factory:e=>new t(e),getNativeRtpCapabilities:async({direction:i})=>{p.debug("getNativeRtpCapabilities() [direction:%o]",i);let r=new RTCPeerConnection({iceServers:[],iceTransportPolicy:"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require"});try{r.addTransceiver("audio",{direction:i}),r.addTransceiver("video",{direction:i});const s=await r.createOffer();try{r.close()}catch(e){}r=void 0;const a=e.parse(s.sdp);return t.getLocalRtpCapabilities(a)}catch(e){try{r?.close()}catch(e){}throw r=void 0,e}},getNativeSctpCapabilities:async()=>(p.debug("getNativeSctpCapabilities()"),{numStreams:h})}}static getLocalRtpCapabilities(e,t=[]){const i=o.extractRtpCapabilities({sdpObject:e});r.validateAndNormalizeRtpCapabilities(i),d.addNackSupportForOpus(i);for(const e of t)d.addHeaderExtensionSupport(i,e);return i}constructor({direction:e,iceParameters:t,iceCandidates:i,dtlsParameters:r,sctpParameters:s,iceServers:a,iceTransportPolicy:o,additionalSettings:c,getSendExtendedRtpCapabilities:d}){super(),p.debug("constructor()"),this._direction=e,this._remoteSdp=new n.RemoteSdp({iceParameters:t,iceCandidates:i,dtlsParameters:r,sctpParameters:s}),this._getSendExtendedRtpCapabilities=d,r.role&&"auto"!==r.role&&(this._forcedLocalDtlsRole="server"===r.role?"client":"server"),this._pc=new RTCPeerConnection({iceServers:a??[],iceTransportPolicy:o??"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require",...c}),this._pc.addEventListener("icegatheringstatechange",this.onIceGatheringStateChange),this._pc.addEventListener("icecandidateerror",this.onIceCandidateError),this._pc.connectionState?this._pc.addEventListener("connectionstatechange",this.onConnectionStateChange):(p.warn("run() | pc.connectionState not supported, using pc.iceConnectionState"),this._pc.addEventListener("iceconnectionstatechange",this.onIceConnectionStateChange))}get name(){return l}close(){if(p.debug("close()"),!this._closed){this._closed=!0;try{this._pc.close()}catch(e){}this._pc.removeEventListener("icegatheringstatechange",this.onIceGatheringStateChange),this._pc.removeEventListener("icecandidateerror",this.onIceCandidateError),this._pc.removeEventListener("connectionstatechange",this.onConnectionStateChange),this._pc.removeEventListener("iceconnectionstatechange",this.onIceConnectionStateChange),this.emit("@close"),super.close()}}async updateIceServers(e){this.assertNotClosed(),p.debug("updateIceServers()");const t=this._pc.getConfiguration();t.iceServers=e,this._pc.setConfiguration(t)}async restartIce(e){if(this.assertNotClosed(),p.debug("restartIce()"),this._remoteSdp.updateIceParameters(e),this._transportReady)if("send"===this._direction){const e=await this._pc.createOffer({iceRestart:!0});p.debug("restartIce() | calling pc.setLocalDescription() [offer:%o]",e),await this._pc.setLocalDescription(e);const t={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("restartIce() | calling pc.setRemoteDescription() [answer:%o]",t),await this._pc.setRemoteDescription(t)}else{const e={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("restartIce() | calling pc.setRemoteDescription() [offer:%o]",e),await this._pc.setRemoteDescription(e);const t=await this._pc.createAnswer();p.debug("restartIce() | calling pc.setLocalDescription() [answer:%o]",t),await this._pc.setLocalDescription(t)}}async getTransportStats(){return this.assertNotClosed(),this._pc.getStats()}async send({track:i,streamId:s,encodings:n,codecOptions:d,headerExtensionOptions:l,codec:h}){this.assertNotClosed(),this.assertSendDirection(),p.debug("send() [kind:%s, track.id:%s, streamId:%s]",i.kind,i.id,s),n&&n.length>1&&n.forEach((e,t)=>{e.rid=`r${t}`});const u=this._remoteSdp.getNextMediaSectionIdx(),m=this._pc.addTransceiver(i,{direction:"sendonly",streams:[this._sendStream],sendEncodings:n});let f=await this._pc.createOffer(),g=e.parse(f.sdp);g.extmapAllowMixed&&this._remoteSdp.setSessionExtmapAllowMixed();const v=[];v.push({uri:"http://www.webrtc.org/experiments/rtp-hdrext/abs-capture-time",kind:i.kind,direction:"sendonly"});const b=t.getLocalRtpCapabilities(g,v),_=this._getSendExtendedRtpCapabilities(b),y=r.getSendingRtpParameters(i.kind,_);y.codecs=r.reduceCodecs(y.codecs,h);const S=r.getSendingRemoteRtpParameters(i.kind,_);S.codecs=r.reduceCodecs(S.codecs,h),this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:g});let w=!1;const k=(0,a.parse)((n??[{}])[0].scalabilityMode);let T;1===n?.length&&k.spatialLayers>1&&"video/vp9"===y.codecs[0].mimeType.toLowerCase()&&(p.debug("send() | enabling legacy simulcast for VP9 SVC"),w=!0,g=e.parse(f.sdp),T=g.media[u.idx],c.addLegacySimulcast({offerMediaObject:T,numStreams:k.spatialLayers}),f={type:"offer",sdp:e.write(g)}),p.debug("send() | calling pc.setLocalDescription() [offer:%o]",f),l?.absCaptureTime&&(T=g.media[u.idx],o.addHeaderExtension({offerMediaObject:T,headerExtensionUri:"http://www.webrtc.org/experiments/rtp-hdrext/abs-capture-time",headerExtensionId:S.headerExtensions.find(e=>"http://www.webrtc.org/experiments/rtp-hdrext/abs-capture-time"===e.uri).id}),f={type:"offer",sdp:e.write(g)}),await this._pc.setLocalDescription(f);const C=m.mid;if(y.mid=C,g=e.parse(this._pc.localDescription.sdp),T=g.media[u.idx],y.rtcp.cname=o.getCname({offerMediaObject:T}),y.msid=`${s??this._sendStream.id} ${i.id}`,n)if(1===n.length){let e=c.getRtpEncodings({offerMediaObject:T,codecs:y.codecs});Object.assign(e[0],n[0]),w&&(e=[e[0]]),y.encodings=e}else y.encodings=n;else y.encodings=c.getRtpEncodings({offerMediaObject:T,codecs:y.codecs});if(y.encodings.length>1&&("video/vp8"===y.codecs[0].mimeType.toLowerCase()||"video/h264"===y.codecs[0].mimeType.toLowerCase()))for(const e of y.encodings)e.scalabilityMode?e.scalabilityMode=`L1T${k.temporalLayers}`:e.scalabilityMode="L1T3";this._remoteSdp.send({offerMediaObject:T,reuseMid:u.reuseMid,offerRtpParameters:y,answerRtpParameters:S,codecOptions:d});const P={type:"answer",sdp:this._remoteSdp.getSdp()};return p.debug("send() | calling pc.setRemoteDescription() [answer:%o]",P),await this._pc.setRemoteDescription(P),this._mapMidTransceiver.set(C,m),{localId:C,rtpParameters:y,rtpSender:m.sender}}async stopSending(e){if(this.assertSendDirection(),p.debug("stopSending() [localId:%s]",e),this._closed)return;const t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated RTCRtpTransceiver not found");if(t.sender.replaceTrack(null),this._pc.removeTrack(t.sender),this._remoteSdp.closeMediaSection(t.mid))try{t.stop()}catch(e){}const i=await this._pc.createOffer();p.debug("stopSending() | calling pc.setLocalDescription() [offer:%o]",i),await this._pc.setLocalDescription(i);const r={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("stopSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r),this._mapMidTransceiver.delete(e)}async pauseSending(e){this.assertNotClosed(),this.assertSendDirection(),p.debug("pauseSending() [localId:%s]",e);const t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated RTCRtpTransceiver not found");t.direction="inactive",this._remoteSdp.pauseMediaSection(e);const i=await this._pc.createOffer();p.debug("pauseSending() | calling pc.setLocalDescription() [offer:%o]",i),await this._pc.setLocalDescription(i);const r={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("pauseSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r)}async resumeSending(e){this.assertNotClosed(),this.assertSendDirection(),p.debug("resumeSending() [localId:%s]",e);const t=this._mapMidTransceiver.get(e);if(this._remoteSdp.resumeSendingMediaSection(e),!t)throw new Error("associated RTCRtpTransceiver not found");t.direction="sendonly";const i=await this._pc.createOffer();p.debug("resumeSending() | calling pc.setLocalDescription() [offer:%o]",i),await this._pc.setLocalDescription(i);const r={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("resumeSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r)}async replaceTrack(e,t){this.assertNotClosed(),this.assertSendDirection(),t?p.debug("replaceTrack() [localId:%s, track.id:%s]",e,t.id):p.debug("replaceTrack() [localId:%s, no track]",e);const i=this._mapMidTransceiver.get(e);if(!i)throw new Error("associated RTCRtpTransceiver not found");await i.sender.replaceTrack(t)}async setMaxSpatialLayer(e,t){this.assertNotClosed(),this.assertSendDirection(),p.debug("setMaxSpatialLayer() [localId:%s, spatialLayer:%s]",e,t);const i=this._mapMidTransceiver.get(e);if(!i)throw new Error("associated RTCRtpTransceiver not found");const r=i.sender.getParameters();r.encodings.forEach((e,i)=>{e.active=i<=t}),await i.sender.setParameters(r),this._remoteSdp.muxMediaSectionSimulcast(e,r.encodings);const s=await this._pc.createOffer();p.debug("setMaxSpatialLayer() | calling pc.setLocalDescription() [offer:%o]",s),await this._pc.setLocalDescription(s);const a={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("setMaxSpatialLayer() | calling pc.setRemoteDescription() [answer:%o]",a),await this._pc.setRemoteDescription(a)}async setRtpEncodingParameters(e,t){this.assertNotClosed(),this.assertSendDirection(),p.debug("setRtpEncodingParameters() [localId:%s, params:%o]",e,t);const i=this._mapMidTransceiver.get(e);if(!i)throw new Error("associated RTCRtpTransceiver not found");const r=i.sender.getParameters();r.encodings.forEach((e,i)=>{r.encodings[i]={...e,...t}}),await i.sender.setParameters(r),this._remoteSdp.muxMediaSectionSimulcast(e,r.encodings);const s=await this._pc.createOffer();p.debug("setRtpEncodingParameters() | calling pc.setLocalDescription() [offer:%o]",s),await this._pc.setLocalDescription(s);const a={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("setRtpEncodingParameters() | calling pc.setRemoteDescription() [answer:%o]",a),await this._pc.setRemoteDescription(a)}async getSenderStats(e){this.assertNotClosed(),this.assertSendDirection();const t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated RTCRtpTransceiver not found");return t.sender.getStats()}async sendDataChannel({ordered:t,maxPacketLifeTime:i,maxRetransmits:r,label:s,protocol:a}){this.assertNotClosed(),this.assertSendDirection();const n={negotiated:!0,id:this._nextSendSctpStreamId,ordered:t,maxPacketLifeTime:i,maxRetransmits:r,protocol:a};p.debug("sendDataChannel() [options:%o]",n);const o=this._pc.createDataChannel(s,n);if(this._nextSendSctpStreamId=++this._nextSendSctpStreamId%h.MIS,!this._hasDataChannelMediaSection){const t=await this._pc.createOffer(),i=e.parse(t.sdp),r=i.media.find(e=>"application"===e.type);this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:i}),p.debug("sendDataChannel() | calling pc.setLocalDescription() [offer:%o]",t),await this._pc.setLocalDescription(t),this._remoteSdp.sendSctpAssociation({offerMediaObject:r});const s={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]",s),await this._pc.setRemoteDescription(s),this._hasDataChannelMediaSection=!0}return{dataChannel:o,sctpStreamParameters:{streamId:n.id,ordered:n.ordered,maxPacketLifeTime:n.maxPacketLifeTime,maxRetransmits:n.maxRetransmits}}}async receive(t){this.assertNotClosed(),this.assertRecvDirection();const i=[],r=new Map;for(const e of t){const{trackId:t,kind:i,rtpParameters:s,streamId:a}=e;p.debug("receive() [trackId:%s, kind:%s]",t,i);const n=s.mid??String(this._mapMidTransceiver.size);r.set(t,n);const{msidStreamId:o}=d.getMsidStreamIdAndTrackId(s.msid);this._remoteSdp.receive({mid:n,kind:i,offerRtpParameters:s,streamId:a??o??s.rtcp?.cname??"-",trackId:t})}const s={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("receive() | calling pc.setRemoteDescription() [offer:%o]",s),await this._pc.setRemoteDescription(s);let a=await this._pc.createAnswer();const n=e.parse(a.sdp);for(const e of t){const{trackId:t,rtpParameters:i}=e,s=r.get(t),a=n.media.find(e=>String(e.mid)===s);o.applyCodecParameters({offerRtpParameters:i,answerMediaObject:a})}a={type:"answer",sdp:e.write(n)},this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:n}),p.debug("receive() | calling pc.setLocalDescription() [answer:%o]",a),await this._pc.setLocalDescription(a);for(const e of t){const{trackId:t}=e,s=r.get(t),a=this._pc.getTransceivers().find(e=>e.mid===s);if(!a)throw new Error("new RTCRtpTransceiver not found");this._mapMidTransceiver.set(s,a),i.push({localId:s,track:a.receiver.track,rtpReceiver:a.receiver})}return i}async stopReceiving(e){if(this.assertRecvDirection(),this._closed)return;for(const t of e){p.debug("stopReceiving() [localId:%s]",t);const e=this._mapMidTransceiver.get(t);if(!e)throw new Error("associated RTCRtpTransceiver not found");this._remoteSdp.closeMediaSection(e.mid)}const t={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("stopReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const i=await this._pc.createAnswer();p.debug("stopReceiving() | calling pc.setLocalDescription() [answer:%o]",i),await this._pc.setLocalDescription(i);for(const t of e)this._mapMidTransceiver.delete(t)}async pauseReceiving(e){this.assertNotClosed(),this.assertRecvDirection();for(const t of e){p.debug("pauseReceiving() [localId:%s]",t);const e=this._mapMidTransceiver.get(t);if(!e)throw new Error("associated RTCRtpTransceiver not found");e.direction="inactive",this._remoteSdp.pauseMediaSection(t)}const t={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("pauseReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const i=await this._pc.createAnswer();p.debug("pauseReceiving() | calling pc.setLocalDescription() [answer:%o]",i),await this._pc.setLocalDescription(i)}async resumeReceiving(e){this.assertNotClosed(),this.assertRecvDirection();for(const t of e){p.debug("resumeReceiving() [localId:%s]",t);const e=this._mapMidTransceiver.get(t);if(!e)throw new Error("associated RTCRtpTransceiver not found");e.direction="recvonly",this._remoteSdp.resumeReceivingMediaSection(t)}const t={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("resumeReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const i=await this._pc.createAnswer();p.debug("resumeReceiving() | calling pc.setLocalDescription() [answer:%o]",i),await this._pc.setLocalDescription(i)}async getReceiverStats(e){this.assertNotClosed(),this.assertRecvDirection();const t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated RTCRtpTransceiver not found");return t.receiver.getStats()}async receiveDataChannel({sctpStreamParameters:t,label:i,protocol:r}){this.assertNotClosed(),this.assertRecvDirection();const{streamId:s,ordered:a,maxPacketLifeTime:n,maxRetransmits:o}=t,c={negotiated:!0,id:s,ordered:a,maxPacketLifeTime:n,maxRetransmits:o,protocol:r};p.debug("receiveDataChannel() [options:%o]",c);const d=this._pc.createDataChannel(i,c);if(!this._hasDataChannelMediaSection){this._remoteSdp.receiveSctpAssociation();const t={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("receiveDataChannel() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const i=await this._pc.createAnswer();if(!this._transportReady){const t=e.parse(i.sdp);await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:t})}p.debug("receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]",i),await this._pc.setLocalDescription(i),this._hasDataChannelMediaSection=!0}return{dataChannel:d}}async setupTransport({localDtlsRole:t,localSdpObject:i}){i||(i=e.parse(this._pc.localDescription.sdp));const r=o.extractDtlsParameters({sdpObject:i});r.role=t,this._remoteSdp.updateDtlsRole("client"===t?"server":"client"),await new Promise((e,t)=>{this.safeEmit("@connect",{dtlsParameters:r},e,t)}),this._transportReady=!0}onIceGatheringStateChange=()=>{this.emit("@icegatheringstatechange",this._pc.iceGatheringState)};onIceCandidateError=e=>{this.emit("@icecandidateerror",e)};onConnectionStateChange=()=>{this.emit("@connectionstatechange",this._pc.connectionState)};onIceConnectionStateChange=()=>{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")}};assertNotClosed(){if(this._closed)throw new s.InvalidStateError("method called in a closed handler")}assertSendDirection(){if("send"!==this._direction)throw new Error('method can just be called for handlers with "send" direction')}assertRecvDirection(){if("recv"!==this._direction)throw new Error('method can just be called for handlers with "recv" direction')}};return pt.Chrome74=u,pt}(),c=function(){if(lt)return ht;lt=1,Object.defineProperty(ht,"__esModule",{value:!0}),ht.Firefox120=void 0;const e=He(),t=J(),i=G(),r=Z(),s=pe(),a=Ge(),n=Xe(),o=tt(),c=st(),d=ct(),p=new i.Logger("Firefox120"),l="Firefox120",h={OS:16,MIS:2048};let u=class i extends t.EnhancedEventEmitter{_closed=!1;_direction;_remoteSdp;_getSendExtendedRtpCapabilities;_pc;_mapMidTransceiver=new Map;_sendStream=new MediaStream;_hasDataChannelMediaSection=!1;_nextSendSctpStreamId=0;_transportReady=!1;static createFactory(){return{name:l,factory:e=>new i(e),getNativeRtpCapabilities:async({direction:t})=>{p.debug("getNativeRtpCapabilities() [direction:%o]",t);let r=new RTCPeerConnection({iceServers:[],iceTransportPolicy:"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require"});const s=document.createElement("canvas");s.getContext("2d");const a=s.captureStream().getVideoTracks()[0];try{r.addTransceiver("audio",{direction:t}),r.addTransceiver(a,{direction:t,sendEncodings:[{rid:"r0",maxBitrate:1e5},{rid:"r1",maxBitrate:5e5}]});const n=await r.createOffer();try{s.remove()}catch(e){}try{a.stop()}catch(e){}try{r.close()}catch(e){}r=void 0;const o=e.parse(n.sdp);return i.getLocalRtpCapabilities(o)}catch(e){try{s.remove()}catch(e){}try{a.stop()}catch(e){}try{r?.close()}catch(e){}throw r=void 0,e}},getNativeSctpCapabilities:async()=>(p.debug("getNativeSctpCapabilities()"),{numStreams:h})}}static getLocalRtpCapabilities(e){const t=o.extractRtpCapabilities({sdpObject:e});return s.validateAndNormalizeRtpCapabilities(t),t}constructor({direction:e,iceParameters:t,iceCandidates:i,dtlsParameters:r,sctpParameters:s,iceServers:a,iceTransportPolicy:o,additionalSettings:c,getSendExtendedRtpCapabilities:d}){super(),p.debug("constructor()"),this._direction=e,this._remoteSdp=new n.RemoteSdp({iceParameters:t,iceCandidates:i,dtlsParameters:r,sctpParameters:s}),this._getSendExtendedRtpCapabilities=d,this._pc=new RTCPeerConnection({iceServers:a??[],iceTransportPolicy:o??"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require",...c}),this._pc.addEventListener("icegatheringstatechange",this.onIceGatheringStateChange),this._pc.addEventListener("icecandidateerror",this.onIceCandidateError),this._pc.connectionState?this._pc.addEventListener("connectionstatechange",this.onConnectionStateChange):(p.warn("run() | pc.connectionState not supported, using pc.iceConnectionState"),this._pc.addEventListener("iceconnectionstatechange",this.onIceConnectionStateChange))}get name(){return l}close(){if(p.debug("close()"),!this._closed){this._closed=!0;try{this._pc.close()}catch(e){}this._pc.removeEventListener("icegatheringstatechange",this.onIceGatheringStateChange),this._pc.removeEventListener("icecandidateerror",this.onIceCandidateError),this._pc.removeEventListener("connectionstatechange",this.onConnectionStateChange),this._pc.removeEventListener("iceconnectionstatechange",this.onIceConnectionStateChange),this.emit("@close"),super.close()}}async updateIceServers(e){throw this.assertNotClosed(),new r.UnsupportedError("not supported")}async restartIce(e){if(this.assertNotClosed(),p.debug("restartIce()"),this._remoteSdp.updateIceParameters(e),this._transportReady)if("send"===this._direction){const e=await this._pc.createOffer({iceRestart:!0});p.debug("restartIce() | calling pc.setLocalDescription() [offer:%o]",e),await this._pc.setLocalDescription(e);const t={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("restartIce() | calling pc.setRemoteDescription() [answer:%o]",t),await this._pc.setRemoteDescription(t)}else{const e={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("restartIce() | calling pc.setRemoteDescription() [offer:%o]",e),await this._pc.setRemoteDescription(e);const t=await this._pc.createAnswer();p.debug("restartIce() | calling pc.setLocalDescription() [answer:%o]",t),await this._pc.setLocalDescription(t)}}async getTransportStats(){return this.assertNotClosed(),this._pc.getStats()}async send({track:t,streamId:r,encodings:n,codecOptions:d,codec:l,onRtpSender:h}){this.assertNotClosed(),this.assertSendDirection(),p.debug("send() [kind:%s, track.id:%s, streamId:%s]",t.kind,t.id,r),n&&n.length>1&&n.forEach((e,t)=>{e.rid=`r${t}`});const u=this._pc.addTransceiver(t,{direction:"sendonly",streams:[this._sendStream],sendEncodings:n});h&&h(u.sender);const m=await this._pc.createOffer();let f=e.parse(m.sdp);f.extmapAllowMixed&&this._remoteSdp.setSessionExtmapAllowMixed();const g=i.getLocalRtpCapabilities(f),v=this._getSendExtendedRtpCapabilities(g),b=s.getSendingRtpParameters(t.kind,v);b.codecs=s.reduceCodecs(b.codecs,l);const _=s.getSendingRemoteRtpParameters(t.kind,v);_.codecs=s.reduceCodecs(_.codecs,l),this._transportReady||await this.setupTransport({localDtlsRole:"client",localSdpObject:f});const y=(0,a.parse)((n??[{}])[0].scalabilityMode);p.debug("send() | calling pc.setLocalDescription() [offer:%o]",m),await this._pc.setLocalDescription(m);const S=u.mid;b.mid=S,f=e.parse(this._pc.localDescription.sdp);const w=f.media[f.media.length-1];if(b.rtcp.cname=o.getCname({offerMediaObject:w}),b.msid=`${r??this._sendStream.id} ${t.id}`,n)if(1===n.length){const e=c.getRtpEncodings({offerMediaObject:w,codecs:b.codecs});Object.assign(e[0],n[0]),b.encodings=e}else b.encodings=n;else b.encodings=c.getRtpEncodings({offerMediaObject:w,codecs:b.codecs});if(b.encodings.length>1&&("video/vp8"===b.codecs[0].mimeType.toLowerCase()||"video/h264"===b.codecs[0].mimeType.toLowerCase()))for(const e of b.encodings)e.scalabilityMode?e.scalabilityMode=`L1T${y.temporalLayers}`:e.scalabilityMode="L1T3";this._remoteSdp.send({offerMediaObject:w,offerRtpParameters:b,answerRtpParameters:_,codecOptions:d});const k={type:"answer",sdp:this._remoteSdp.getSdp()};return p.debug("send() | calling pc.setRemoteDescription() [answer:%o]",k),await this._pc.setRemoteDescription(k),this._mapMidTransceiver.set(S,u),{localId:S,rtpParameters:b,rtpSender:u.sender}}async stopSending(e){if(this.assertSendDirection(),p.debug("stopSending() [localId:%s]",e),this._closed)return;const 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);const i=await this._pc.createOffer();p.debug("stopSending() | calling pc.setLocalDescription() [offer:%o]",i),await this._pc.setLocalDescription(i);const r={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("stopSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r),this._mapMidTransceiver.delete(e)}async pauseSending(e){this.assertNotClosed(),this.assertSendDirection(),p.debug("pauseSending() [localId:%s]",e);const t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated RTCRtpTransceiver not found");t.direction="inactive",this._remoteSdp.pauseMediaSection(e);const i=await this._pc.createOffer();p.debug("pauseSending() | calling pc.setLocalDescription() [offer:%o]",i),await this._pc.setLocalDescription(i);const r={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("pauseSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r)}async resumeSending(e){this.assertNotClosed(),this.assertSendDirection(),p.debug("resumeSending() [localId:%s]",e);const t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated RTCRtpTransceiver not found");t.direction="sendonly",this._remoteSdp.resumeSendingMediaSection(e);const i=await this._pc.createOffer();p.debug("resumeSending() | calling pc.setLocalDescription() [offer:%o]",i),await this._pc.setLocalDescription(i);const r={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("resumeSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r)}async replaceTrack(e,t){this.assertNotClosed(),this.assertSendDirection(),t?p.debug("replaceTrack() [localId:%s, track.id:%s]",e,t.id):p.debug("replaceTrack() [localId:%s, no track]",e);const i=this._mapMidTransceiver.get(e);if(!i)throw new Error("associated RTCRtpTransceiver not found");await i.sender.replaceTrack(t)}async setMaxSpatialLayer(e,t){this.assertNotClosed(),this.assertSendDirection(),p.debug("setMaxSpatialLayer() [localId:%s, spatialLayer:%s]",e,t);const i=this._mapMidTransceiver.get(e);if(!i)throw new Error("associated transceiver not found");const r=i.sender.getParameters();r.encodings.forEach((e,i)=>{e.active=i<=t}),await i.sender.setParameters(r),this._remoteSdp.muxMediaSectionSimulcast(e,r.encodings);const s=await this._pc.createOffer();p.debug("setMaxSpatialLayer() | calling pc.setLocalDescription() [offer:%o]",s),await this._pc.setLocalDescription(s);const a={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("setMaxSpatialLayer() | calling pc.setRemoteDescription() [answer:%o]",a),await this._pc.setRemoteDescription(a)}async setRtpEncodingParameters(e,t){this.assertNotClosed(),this.assertSendDirection(),p.debug("setRtpEncodingParameters() [localId:%s, params:%o]",e,t);const i=this._mapMidTransceiver.get(e);if(!i)throw new Error("associated RTCRtpTransceiver not found");const r=i.sender.getParameters();r.encodings.forEach((e,i)=>{r.encodings[i]={...e,...t}}),await i.sender.setParameters(r),this._remoteSdp.muxMediaSectionSimulcast(e,r.encodings);const s=await this._pc.createOffer();p.debug("setRtpEncodingParameters() | calling pc.setLocalDescription() [offer:%o]",s),await this._pc.setLocalDescription(s);const a={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("setRtpEncodingParameters() | calling pc.setRemoteDescription() [answer:%o]",a),await this._pc.setRemoteDescription(a)}async getSenderStats(e){this.assertNotClosed(),this.assertSendDirection();const t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated RTCRtpTransceiver not found");return t.sender.getStats()}async sendDataChannel({ordered:t,maxPacketLifeTime:i,maxRetransmits:r,label:s,protocol:a}){this.assertNotClosed(),this.assertSendDirection();const n={negotiated:!0,id:this._nextSendSctpStreamId,ordered:t,maxPacketLifeTime:i,maxRetransmits:r,protocol:a};p.debug("sendDataChannel() [options:%o]",n);const o=this._pc.createDataChannel(s,n);if(this._nextSendSctpStreamId=++this._nextSendSctpStreamId%h.MIS,!this._hasDataChannelMediaSection){const t=await this._pc.createOffer(),i=e.parse(t.sdp),r=i.media.find(e=>"application"===e.type);this._transportReady||await this.setupTransport({localDtlsRole:"client",localSdpObject:i}),p.debug("sendDataChannel() | calling pc.setLocalDescription() [offer:%o]",t),await this._pc.setLocalDescription(t),this._remoteSdp.sendSctpAssociation({offerMediaObject:r});const s={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]",s),await this._pc.setRemoteDescription(s),this._hasDataChannelMediaSection=!0}return{dataChannel:o,sctpStreamParameters:{streamId:n.id,ordered:n.ordered,maxPacketLifeTime:n.maxPacketLifeTime,maxRetransmits:n.maxRetransmits}}}async receive(t){this.assertNotClosed(),this.assertRecvDirection();const i=[],r=new Map;for(const e of t){const{trackId:t,kind:i,rtpParameters:s,streamId:a}=e;p.debug("receive() [trackId:%s, kind:%s]",t,i);const n=s.mid??String(this._mapMidTransceiver.size);r.set(t,n);const{msidStreamId:o}=d.getMsidStreamIdAndTrackId(s.msid);this._remoteSdp.receive({mid:n,kind:i,offerRtpParameters:s,streamId:a??o??s.rtcp?.cname??"-",trackId:t})}const s={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("receive() | calling pc.setRemoteDescription() [offer:%o]",s),await this._pc.setRemoteDescription(s);for(const e of t){const{trackId:t,onRtpReceiver:i}=e;if(i){const e=r.get(t),s=this._pc.getTransceivers().find(t=>t.mid===e);if(!s)throw new Error("transceiver not found");i(s.receiver)}}let a=await this._pc.createAnswer();const n=e.parse(a.sdp);for(const i of t){const{trackId:t,rtpParameters:s}=i,c=r.get(t),d=n.media.find(e=>String(e.mid)===c);o.applyCodecParameters({offerRtpParameters:s,answerMediaObject:d}),a={type:"answer",sdp:e.write(n)}}this._transportReady||await this.setupTransport({localDtlsRole:"client",localSdpObject:n}),p.debug("receive() | calling pc.setLocalDescription() [answer:%o]",a),await this._pc.setLocalDescription(a);for(const e of t){const{trackId:t}=e,s=r.get(t),a=this._pc.getTransceivers().find(e=>e.mid===s);if(!a)throw new Error("new RTCRtpTransceiver not found");this._mapMidTransceiver.set(s,a),i.push({localId:s,track:a.receiver.track,rtpReceiver:a.receiver})}return i}async stopReceiving(e){if(this.assertRecvDirection(),this._closed)return;for(const t of e){p.debug("stopReceiving() [localId:%s]",t);const e=this._mapMidTransceiver.get(t);if(!e)throw new Error("associated RTCRtpTransceiver not found");this._remoteSdp.closeMediaSection(e.mid)}const t={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("stopReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const i=await this._pc.createAnswer();p.debug("stopReceiving() | calling pc.setLocalDescription() [answer:%o]",i),await this._pc.setLocalDescription(i);for(const t of e)this._mapMidTransceiver.delete(t)}async pauseReceiving(e){this.assertNotClosed(),this.assertRecvDirection();for(const t of e){p.debug("pauseReceiving() [localId:%s]",t);const e=this._mapMidTransceiver.get(t);if(!e)throw new Error("associated RTCRtpTransceiver not found");e.direction="inactive",this._remoteSdp.pauseMediaSection(t)}const t={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("pauseReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const i=await this._pc.createAnswer();p.debug("pauseReceiving() | calling pc.setLocalDescription() [answer:%o]",i),await this._pc.setLocalDescription(i)}async resumeReceiving(e){this.assertNotClosed(),this.assertRecvDirection();for(const t of e){p.debug("resumeReceiving() [localId:%s]",t);const e=this._mapMidTransceiver.get(t);if(!e)throw new Error("associated RTCRtpTransceiver not found");e.direction="recvonly",this._remoteSdp.resumeReceivingMediaSection(t)}const t={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("resumeReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const i=await this._pc.createAnswer();p.debug("resumeReceiving() | calling pc.setLocalDescription() [answer:%o]",i),await this._pc.setLocalDescription(i)}async getReceiverStats(e){this.assertRecvDirection();const t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated RTCRtpTransceiver not found");return t.receiver.getStats()}async receiveDataChannel({sctpStreamParameters:t,label:i,protocol:r}){this.assertNotClosed(),this.assertRecvDirection();const{streamId:s,ordered:a,maxPacketLifeTime:n,maxRetransmits:o}=t,c={negotiated:!0,id:s,ordered:a,maxPacketLifeTime:n,maxRetransmits:o,protocol:r};p.debug("receiveDataChannel() [options:%o]",c);const d=this._pc.createDataChannel(i,c);if(!this._hasDataChannelMediaSection){this._remoteSdp.receiveSctpAssociation();const t={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("receiveDataChannel() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const i=await this._pc.createAnswer();if(!this._transportReady){const t=e.parse(i.sdp);await this.setupTransport({localDtlsRole:"client",localSdpObject:t})}p.debug("receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]",i),await this._pc.setLocalDescription(i),this._hasDataChannelMediaSection=!0}return{dataChannel:d}}async setupTransport({localDtlsRole:t,localSdpObject:i}){i||(i=e.parse(this._pc.localDescription.sdp));const r=o.extractDtlsParameters({sdpObject:i});r.role=t,this._remoteSdp.updateDtlsRole("client"===t?"server":"client"),await new Promise((e,t)=>{this.safeEmit("@connect",{dtlsParameters:r},e,t)}),this._transportReady=!0}onIceGatheringStateChange=()=>{this.emit("@icegatheringstatechange",this._pc.iceGatheringState)};onIceCandidateError=e=>{this.emit("@icecandidateerror",e)};onConnectionStateChange=()=>{this.emit("@connectionstatechange",this._pc.connectionState)};onIceConnectionStateChange=()=>{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")}};assertNotClosed(){if(this._closed)throw new r.InvalidStateError("method called in a closed handler")}assertSendDirection(){if("send"!==this._direction)throw new Error('method can just be called for handlers with "send" direction')}assertRecvDirection(){if("recv"!==this._direction)throw new Error('method can just be called for handlers with "recv" direction')}};return ht.Firefox120=u,ht}(),d=function(){if(ut)return mt;ut=1,Object.defineProperty(mt,"__esModule",{value:!0}),mt.Safari12=void 0;const e=He(),t=J(),i=G(),r=pe(),s=Z(),a=Ge(),n=Xe(),o=tt(),c=st(),d=ct(),p=new i.Logger("Safari12"),l="Safari12",h={OS:1024,MIS:1024};let u=class i extends t.EnhancedEventEmitter{_closed=!1;_direction;_remoteSdp;_getSendExtendedRtpCapabilities;_forcedLocalDtlsRole;_pc;_mapMidTransceiver=new Map;_sendStream=new MediaStream;_hasDataChannelMediaSection=!1;_nextSendSctpStreamId=0;_transportReady=!1;static createFactory(){return{name:l,factory:e=>new i(e),getNativeRtpCapabilities:async({direction:t})=>{p.debug("getNativeRtpCapabilities() [direction:%o]",t);let r=new RTCPeerConnection({iceServers:[],iceTransportPolicy:"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require"});try{r.addTransceiver("audio",{direction:t}),r.addTransceiver("video",{direction:t});const s=await r.createOffer();try{r.close()}catch(e){}r=void 0;const a=e.parse(s.sdp);return i.getLocalRtpCapabilities(a)}catch(e){try{r?.close()}catch(e){}throw r=void 0,e}},getNativeSctpCapabilities:async()=>(p.debug("getNativeSctpCapabilities()"),{numStreams:h})}}static getLocalRtpCapabilities(e,t=[]){const i=o.extractRtpCapabilities({sdpObject:e});r.validateAndNormalizeRtpCapabilities(i),d.addNackSupportForOpus(i);for(const e of t)d.addHeaderExtensionSupport(i,e);return i}constructor({direction:e,iceParameters:t,iceCandidates:i,dtlsParameters:r,sctpParameters:s,iceServers:a,iceTransportPolicy:o,additionalSettings:c,getSendExtendedRtpCapabilities:d}){super(),p.debug("constructor()"),this._direction=e,this._remoteSdp=new n.RemoteSdp({iceParameters:t,iceCandidates:i,dtlsParameters:r,sctpParameters:s}),this._getSendExtendedRtpCapabilities=d,r.role&&"auto"!==r.role&&(this._forcedLocalDtlsRole="server"===r.role?"client":"server"),this._pc=new RTCPeerConnection({iceServers:a??[],iceTransportPolicy:o??"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require",...c}),this._pc.addEventListener("icegatheringstatechange",()=>{this.emit("@icegatheringstatechange",this._pc.iceGatheringState)}),this._pc.addEventListener("icecandidateerror",e=>{this.emit("@icecandidateerror",e)}),this._pc.addEventListener("icegatheringstatechange",this.onIceGatheringStateChange),this._pc.addEventListener("icecandidateerror",this.onIceCandidateError),this._pc.connectionState?this._pc.addEventListener("connectionstatechange",this.onConnectionStateChange):(p.warn("run() | pc.connectionState not supported, using pc.iceConnectionState"),this._pc.addEventListener("iceconnectionstatechange",this.onIceConnectionStateChange))}get name(){return l}close(){if(p.debug("close()"),!this._closed){this._closed=!0;try{this._pc.close()}catch(e){}this._pc.removeEventListener("icegatheringstatechange",this.onIceGatheringStateChange),this._pc.removeEventListener("icecandidateerror",this.onIceCandidateError),this._pc.removeEventListener("connectionstatechange",this.onConnectionStateChange),this._pc.removeEventListener("iceconnectionstatechange",this.onIceConnectionStateChange),this.emit("@close"),super.close()}}async updateIceServers(e){this.assertNotClosed(),p.debug("updateIceServers()");const t=this._pc.getConfiguration();t.iceServers=e,this._pc.setConfiguration(t)}async restartIce(e){if(this.assertNotClosed(),p.debug("restartIce()"),this._remoteSdp.updateIceParameters(e),this._transportReady)if("send"===this._direction){const e=await this._pc.createOffer({iceRestart:!0});p.debug("restartIce() | calling pc.setLocalDescription() [offer:%o]",e),await this._pc.setLocalDescription(e);const t={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("restartIce() | calling pc.setRemoteDescription() [answer:%o]",t),await this._pc.setRemoteDescription(t)}else{const e={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("restartIce() | calling pc.setRemoteDescription() [offer:%o]",e),await this._pc.setRemoteDescription(e);const t=await this._pc.createAnswer();p.debug("restartIce() | calling pc.setLocalDescription() [answer:%o]",t),await this._pc.setLocalDescription(t)}}async getTransportStats(){return this.assertNotClosed(),this._pc.getStats()}async send({track:t,streamId:s,encodings:n,codecOptions:d,headerExtensionOptions:l,codec:h,onRtpSender:u}){this.assertNotClosed(),this.assertSendDirection(),p.debug("send() [kind:%s, track.id:%s, streamId:%s]",t.kind,t.id,s);const m=this._remoteSdp.getNextMediaSectionIdx(),f=this._pc.addTransceiver(t,{direction:"sendonly",streams:[this._sendStream]});u&&u(f.sender);let g=await this._pc.createOffer(),v=e.parse(g.sdp);v.extmapAllowMixed&&this._remoteSdp.setSessionExtmapAllowMixed();const b=[];b.push({uri:"http://www.webrtc.org/experiments/rtp-hdrext/abs-capture-time",kind:t.kind,direction:"sendonly"});const _=i.getLocalRtpCapabilities(v,b),y=this._getSendExtendedRtpCapabilities(_),S=r.getSendingRtpParameters(t.kind,y);S.codecs=r.reduceCodecs(S.codecs,h);const w=r.getSendingRemoteRtpParameters(t.kind,y);let k;w.codecs=r.reduceCodecs(w.codecs,h),this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:v});const T=(0,a.parse)((n??[{}])[0].scalabilityMode);n&&n.length>1&&(p.debug("send() | enabling legacy simulcast"),v=e.parse(g.sdp),k=v.media[m.idx],c.addLegacySimulcast({offerMediaObject:k,numStreams:n.length}),g={type:"offer",sdp:e.write(v)}),l?.absCaptureTime&&(k=v.media[m.idx],o.addHeaderExtension({offerMediaObject:k,headerExtensionUri:"http://www.webrtc.org/experiments/rtp-hdrext/abs-capture-time",headerExtensionId:w.headerExtensions.find(e=>"http://www.webrtc.org/experiments/rtp-hdrext/abs-capture-time"===e.uri).id}),g={type:"offer",sdp:e.write(v)}),p.debug("send() | calling pc.setLocalDescription() [offer:%o]",g),await this._pc.setLocalDescription(g);const C=f.mid;if(S.mid=C,v=e.parse(this._pc.localDescription.sdp),k=v.media[m.idx],S.rtcp.cname=o.getCname({offerMediaObject:k}),S.msid=`${s??this._sendStream.id} ${t.id}`,S.encodings=c.getRtpEncodings({offerMediaObject:k,codecs:S.codecs}),n)for(let e=0;e<S.encodings.length;++e)n[e]&&Object.assign(S.encodings[e],n[e]);if(S.encodings.length>1&&("video/vp8"===S.codecs[0].mimeType.toLowerCase()||"video/h264"===S.codecs[0].mimeType.toLowerCase()))for(const e of S.encodings)e.scalabilityMode?e.scalabilityMode=`L1T${T.temporalLayers}`:e.scalabilityMode="L1T3";this._remoteSdp.send({offerMediaObject:k,reuseMid:m.reuseMid,offerRtpParameters:S,answerRtpParameters:w,codecOptions:d});const P={type:"answer",sdp:this._remoteSdp.getSdp()};return p.debug("send() | calling pc.setRemoteDescription() [answer:%o]",P),await this._pc.setRemoteDescription(P),this._mapMidTransceiver.set(C,f),{localId:C,rtpParameters:S,rtpSender:f.sender}}async stopSending(e){if(this.assertSendDirection(),this._closed)return;p.debug("stopSending() [localId:%s]",e);const t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated RTCRtpTransceiver not found");if(t.sender.replaceTrack(null),this._pc.removeTrack(t.sender),this._remoteSdp.closeMediaSection(t.mid))try{t.stop()}catch(e){}const i=await this._pc.createOffer();p.debug("stopSending() | calling pc.setLocalDescription() [offer:%o]",i),await this._pc.setLocalDescription(i);const r={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("stopSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r),this._mapMidTransceiver.delete(e)}async pauseSending(e){this.assertNotClosed(),this.assertSendDirection(),p.debug("pauseSending() [localId:%s]",e);const t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated RTCRtpTransceiver not found");t.direction="inactive",this._remoteSdp.pauseMediaSection(e);const i=await this._pc.createOffer();p.debug("pauseSending() | calling pc.setLocalDescription() [offer:%o]",i),await this._pc.setLocalDescription(i);const r={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("pauseSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r)}async resumeSending(e){this.assertNotClosed(),this.assertSendDirection(),p.debug("resumeSending() [localId:%s]",e);const t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated RTCRtpTransceiver not found");t.direction="sendonly",this._remoteSdp.resumeSendingMediaSection(e);const i=await this._pc.createOffer();p.debug("resumeSending() | calling pc.setLocalDescription() [offer:%o]",i),await this._pc.setLocalDescription(i);const r={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("resumeSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r)}async replaceTrack(e,t){this.assertNotClosed(),this.assertSendDirection(),t?p.debug("replaceTrack() [localId:%s, track.id:%s]",e,t.id):p.debug("replaceTrack() [localId:%s, no track]",e);const i=this._mapMidTransceiver.get(e);if(!i)throw new Error("associated RTCRtpTransceiver not found");await i.sender.replaceTrack(t)}async setMaxSpatialLayer(e,t){this.assertNotClosed(),this.assertSendDirection(),p.debug("setMaxSpatialLayer() [localId:%s, spatialLayer:%s]",e,t);const i=this._mapMidTransceiver.get(e);if(!i)throw new Error("associated RTCRtpTransceiver not found");const r=i.sender.getParameters();r.encodings.forEach((e,i)=>{e.active=i<=t}),await i.sender.setParameters(r),this._remoteSdp.muxMediaSectionSimulcast(e,r.encodings);const s=await this._pc.createOffer();p.debug("setMaxSpatialLayer() | calling pc.setLocalDescription() [offer:%o]",s),await this._pc.setLocalDescription(s);const a={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("setMaxSpatialLayer() | calling pc.setRemoteDescription() [answer:%o]",a),await this._pc.setRemoteDescription(a)}async setRtpEncodingParameters(e,t){this.assertNotClosed(),this.assertSendDirection(),p.debug("setRtpEncodingParameters() [localId:%s, params:%o]",e,t);const i=this._mapMidTransceiver.get(e);if(!i)throw new Error("associated RTCRtpTransceiver not found");const r=i.sender.getParameters();r.encodings.forEach((e,i)=>{r.encodings[i]={...e,...t}}),await i.sender.setParameters(r),this._remoteSdp.muxMediaSectionSimulcast(e,r.encodings);const s=await this._pc.createOffer();p.debug("setRtpEncodingParameters() | calling pc.setLocalDescription() [offer:%o]",s),await this._pc.setLocalDescription(s);const a={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("setRtpEncodingParameters() | calling pc.setRemoteDescription() [answer:%o]",a),await this._pc.setRemoteDescription(a)}async getSenderStats(e){this.assertNotClosed(),this.assertSendDirection();const t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated RTCRtpTransceiver not found");return t.sender.getStats()}async sendDataChannel({ordered:t,maxPacketLifeTime:i,maxRetransmits:r,label:s,protocol:a}){this.assertNotClosed(),this.assertSendDirection();const n={negotiated:!0,id:this._nextSendSctpStreamId,ordered:t,maxPacketLifeTime:i,maxRetransmits:r,protocol:a};p.debug("sendDataChannel() [options:%o]",n);const o=this._pc.createDataChannel(s,n);if(this._nextSendSctpStreamId=++this._nextSendSctpStreamId%h.MIS,!this._hasDataChannelMediaSection){const t=await this._pc.createOffer(),i=e.parse(t.sdp),r=i.media.find(e=>"application"===e.type);this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:i}),p.debug("sendDataChannel() | calling pc.setLocalDescription() [offer:%o]",t),await this._pc.setLocalDescription(t),this._remoteSdp.sendSctpAssociation({offerMediaObject:r});const s={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]",s),await this._pc.setRemoteDescription(s),this._hasDataChannelMediaSection=!0}return{dataChannel:o,sctpStreamParameters:{streamId:n.id,ordered:n.ordered,maxPacketLifeTime:n.maxPacketLifeTime,maxRetransmits:n.maxRetransmits}}}async receive(t){this.assertNotClosed(),this.assertRecvDirection();const i=[],r=new Map;for(const e of t){const{trackId:t,kind:i,rtpParameters:s,streamId:a}=e;p.debug("receive() [trackId:%s, kind:%s]",t,i);const n=s.mid??String(this._mapMidTransceiver.size);r.set(t,n);const{msidStreamId:o}=d.getMsidStreamIdAndTrackId(s.msid);this._remoteSdp.receive({mid:n,kind:i,offerRtpParameters:s,streamId:a??o??s.rtcp?.cname??"-",trackId:t})}const s={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("receive() | calling pc.setRemoteDescription() [offer:%o]",s),await this._pc.setRemoteDescription(s);for(const e of t){const{trackId:t,onRtpReceiver:i}=e;if(i){const e=r.get(t),s=this._pc.getTransceivers().find(t=>t.mid===e);if(!s)throw new Error("transceiver not found");i(s.receiver)}}let a=await this._pc.createAnswer();const n=e.parse(a.sdp);for(const e of t){const{trackId:t,rtpParameters:i}=e,s=r.get(t),a=n.media.find(e=>String(e.mid)===s);o.applyCodecParameters({offerRtpParameters:i,answerMediaObject:a})}a={type:"answer",sdp:e.write(n)},this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:n}),p.debug("receive() | calling pc.setLocalDescription() [answer:%o]",a),await this._pc.setLocalDescription(a);for(const e of t){const{trackId:t}=e,s=r.get(t),a=this._pc.getTransceivers().find(e=>e.mid===s);if(!a)throw new Error("new RTCRtpTransceiver not found");this._mapMidTransceiver.set(s,a),i.push({localId:s,track:a.receiver.track,rtpReceiver:a.receiver})}return i}async stopReceiving(e){if(this.assertRecvDirection(),this._closed)return;for(const t of e){p.debug("stopReceiving() [localId:%s]",t);const e=this._mapMidTransceiver.get(t);if(!e)throw new Error("associated RTCRtpTransceiver not found");this._remoteSdp.closeMediaSection(e.mid)}const t={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("stopReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const i=await this._pc.createAnswer();p.debug("stopReceiving() | calling pc.setLocalDescription() [answer:%o]",i),await this._pc.setLocalDescription(i);for(const t of e)this._mapMidTransceiver.delete(t)}async pauseReceiving(e){this.assertNotClosed(),this.assertRecvDirection();for(const t of e){p.debug("pauseReceiving() [localId:%s]",t);const e=this._mapMidTransceiver.get(t);if(!e)throw new Error("associated RTCRtpTransceiver not found");e.direction="inactive",this._remoteSdp.pauseMediaSection(t)}const t={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("pauseReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const i=await this._pc.createAnswer();p.debug("pauseReceiving() | calling pc.setLocalDescription() [answer:%o]",i),await this._pc.setLocalDescription(i)}async resumeReceiving(e){this.assertNotClosed(),this.assertRecvDirection();for(const t of e){p.debug("resumeReceiving() [localId:%s]",t);const e=this._mapMidTransceiver.get(t);if(!e)throw new Error("associated RTCRtpTransceiver not found");e.direction="recvonly",this._remoteSdp.resumeReceivingMediaSection(t)}const t={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("resumeReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const i=await this._pc.createAnswer();p.debug("resumeReceiving() | calling pc.setLocalDescription() [answer:%o]",i),await this._pc.setLocalDescription(i)}async getReceiverStats(e){this.assertNotClosed(),this.assertRecvDirection();const t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated RTCRtpTransceiver not found");return t.receiver.getStats()}async receiveDataChannel({sctpStreamParameters:t,label:i,protocol:r}){this.assertNotClosed(),this.assertRecvDirection();const{streamId:s,ordered:a,maxPacketLifeTime:n,maxRetransmits:o}=t,c={negotiated:!0,id:s,ordered:a,maxPacketLifeTime:n,maxRetransmits:o,protocol:r};p.debug("receiveDataChannel() [options:%o]",c);const d=this._pc.createDataChannel(i,c);if(!this._hasDataChannelMediaSection){this._remoteSdp.receiveSctpAssociation();const t={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("receiveDataChannel() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const i=await this._pc.createAnswer();if(!this._transportReady){const t=e.parse(i.sdp);await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:t})}p.debug("receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]",i),await this._pc.setLocalDescription(i),this._hasDataChannelMediaSection=!0}return{dataChannel:d}}async setupTransport({localDtlsRole:t,localSdpObject:i}){i||(i=e.parse(this._pc.localDescription.sdp));const r=o.extractDtlsParameters({sdpObject:i});r.role=t,this._remoteSdp.updateDtlsRole("client"===t?"server":"client"),await new Promise((e,t)=>{this.safeEmit("@connect",{dtlsParameters:r},e,t)}),this._transportReady=!0}onIceGatheringStateChange=()=>{this.emit("@icegatheringstatechange",this._pc.iceGatheringState)};onIceCandidateError=e=>{this.emit("@icecandidateerror",e)};onConnectionStateChange=()=>{this.emit("@connectionstatechange",this._pc.connectionState)};onIceConnectionStateChange=()=>{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")}};assertNotClosed(){if(this._closed)throw new s.InvalidStateError("method called in a closed handler")}assertSendDirection(){if("send"!==this._direction)throw new Error('method can just be called for handlers with "send" direction')}assertRecvDirection(){if("recv"!==this._direction)throw new Error('method can just be called for handlers with "recv" direction')}};return mt.Safari12=u,mt}(),p=function(){if(ft)return vt;ft=1,Object.defineProperty(vt,"__esModule",{value:!0}),vt.ReactNative106=void 0;const e=He(),t=J(),i=G(),r=pe(),s=Z(),a=Ge(),n=Xe(),o=tt(),c=st(),d=ct(),p=new i.Logger("ReactNative106"),l="ReactNative106",h={OS:1024,MIS:1024};let u=class i extends t.EnhancedEventEmitter{_closed=!1;_direction;_remoteSdp;_getSendExtendedRtpCapabilities;_forcedLocalDtlsRole;_pc;_mapMidTransceiver=new Map;_sendStream=new MediaStream;_hasDataChannelMediaSection=!1;_nextSendSctpStreamId=0;_transportReady=!1;static createFactory(){return{name:l,factory:e=>new i(e),getNativeRtpCapabilities:async({direction:t})=>{p.debug("getNativeRtpCapabilities() [direction:%o]",t);let r=new RTCPeerConnection({iceServers:[],iceTransportPolicy:"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require"});try{r.addTransceiver("audio",{direction:t}),r.addTransceiver("video",{direction:t});const s=await r.createOffer();try{r.close()}catch(e){}r=void 0;const a=e.parse(s.sdp);return i.getLocalRtpCapabilities(a)}catch(e){try{r?.close()}catch(e){}throw r=void 0,e}},getNativeSctpCapabilities:async()=>(p.debug("getNativeSctpCapabilities()"),{numStreams:h})}}static getLocalRtpCapabilities(e,t=[]){const i=o.extractRtpCapabilities({sdpObject:e});r.validateAndNormalizeRtpCapabilities(i),d.addNackSupportForOpus(i);for(const e of t)d.addHeaderExtensionSupport(i,e);return i}constructor({direction:e,iceParameters:t,iceCandidates:i,dtlsParameters:r,sctpParameters:s,iceServers:a,iceTransportPolicy:o,additionalSettings:c,getSendExtendedRtpCapabilities:d}){super(),p.debug("constructor()"),this._direction=e,this._remoteSdp=new n.RemoteSdp({iceParameters:t,iceCandidates:i,dtlsParameters:r,sctpParameters:s}),this._getSendExtendedRtpCapabilities=d,r.role&&"auto"!==r.role&&(this._forcedLocalDtlsRole="server"===r.role?"client":"server"),this._pc=new RTCPeerConnection({iceServers:a??[],iceTransportPolicy:o??"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require",...c}),this._pc.addEventListener("icegatheringstatechange",this.onIceGatheringStateChange),this._pc.addEventListener("icecandidateerror",this.onIceCandidateError),this._pc.connectionState?this._pc.addEventListener("connectionstatechange",this.onConnectionStateChange):(p.warn("run() | pc.connectionState not supported, using pc.iceConnectionState"),this._pc.addEventListener("iceconnectionstatechange",this.onIceConnectionStateChange))}get name(){return l}close(){if(p.debug("close()"),!this._closed){this._closed=!0,this._sendStream.release(!1);try{this._pc.close()}catch(e){}this._pc.removeEventListener("icegatheringstatechange",this.onIceGatheringStateChange),this._pc.removeEventListener("icecandidateerror",this.onIceCandidateError),this._pc.removeEventListener("connectionstatechange",this.onConnectionStateChange),this._pc.removeEventListener("iceconnectionstatechange",this.onIceConnectionStateChange),this.emit("@close"),super.close()}}async updateIceServers(e){this.assertNotClosed(),p.debug("updateIceServers()");const t=this._pc.getConfiguration();t.iceServers=e,this._pc.setConfiguration(t)}async restartIce(e){if(this.assertNotClosed(),p.debug("restartIce()"),this._remoteSdp.updateIceParameters(e),this._transportReady)if("send"===this._direction){const e=await this._pc.createOffer({iceRestart:!0});p.debug("restartIce() | calling pc.setLocalDescription() [offer:%o]",e),await this._pc.setLocalDescription(e);const t={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("restartIce() | calling pc.setRemoteDescription() [answer:%o]",t),await this._pc.setRemoteDescription(t)}else{const e={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("restartIce() | calling pc.setRemoteDescription() [offer:%o]",e),await this._pc.setRemoteDescription(e);const t=await this._pc.createAnswer();p.debug("restartIce() | calling pc.setLocalDescription() [answer:%o]",t),await this._pc.setLocalDescription(t)}}async getTransportStats(){return this.assertNotClosed(),this._pc.getStats()}async send({track:t,streamId:s,encodings:n,codecOptions:d,headerExtensionOptions:l,codec:h,onRtpSender:u}){this.assertNotClosed(),this.assertSendDirection(),p.debug("send() [kind:%s, track.id:%s, streamId:%s]",t.kind,t.id,s),n&&n.length>1&&n.forEach((e,t)=>{e.rid=`r${t}`});const m=this._remoteSdp.getNextMediaSectionIdx(),f=this._pc.addTransceiver(t,{direction:"sendonly",streams:[this._sendStream],sendEncodings:n});u&&u(f.sender);let g=await this._pc.createOffer(),v=e.parse(g.sdp);v.extmapAllowMixed&&this._remoteSdp.setSessionExtmapAllowMixed();const b=[];b.push({uri:"http://www.webrtc.org/experiments/rtp-hdrext/abs-capture-time",kind:t.kind,direction:"sendonly"});const _=i.getLocalRtpCapabilities(v,b),y=this._getSendExtendedRtpCapabilities(_),S=r.getSendingRtpParameters(t.kind,y);S.codecs=r.reduceCodecs(S.codecs,h);const w=r.getSendingRemoteRtpParameters(t.kind,y);w.codecs=r.reduceCodecs(w.codecs,h),this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:v});let k=!1;const T=(0,a.parse)((n??[{}])[0].scalabilityMode);let C;1===n?.length&&T.spatialLayers>1&&"video/vp9"===S.codecs[0].mimeType.toLowerCase()&&(p.debug("send() | enabling legacy simulcast for VP9 SVC"),k=!0,v=e.parse(g.sdp),C=v.media[m.idx],c.addLegacySimulcast({offerMediaObject:C,numStreams:T.spatialLayers}),g={type:"offer",sdp:e.write(v)}),l?.absCaptureTime&&(C=v.media[m.idx],o.addHeaderExtension({offerMediaObject:C,headerExtensionUri:"http://www.webrtc.org/experiments/rtp-hdrext/abs-capture-time",headerExtensionId:w.headerExtensions.find(e=>"http://www.webrtc.org/experiments/rtp-hdrext/abs-capture-time"===e.uri).id}),g={type:"offer",sdp:e.write(v)}),p.debug("send() | calling pc.setLocalDescription() [offer:%o]",g),await this._pc.setLocalDescription(g);let P=f.mid??void 0;if(P||p.warn("send() | missing transceiver.mid (bug in react-native-webrtc, using a workaround"),S.mid=P,v=e.parse(this._pc.localDescription.sdp),C=v.media[m.idx],S.rtcp.cname=o.getCname({offerMediaObject:C}),S.msid=`${s??this._sendStream.id} ${t.id}`,n)if(1===n.length){let e=c.getRtpEncodings({offerMediaObject:C,codecs:S.codecs});Object.assign(e[0],n[0]),k&&(e=[e[0]]),S.encodings=e}else S.encodings=n;else S.encodings=c.getRtpEncodings({offerMediaObject:C,codecs:S.codecs});if(S.encodings.length>1&&("video/vp8"===S.codecs[0].mimeType.toLowerCase()||"video/h264"===S.codecs[0].mimeType.toLowerCase()))for(const e of S.encodings)e.scalabilityMode?e.scalabilityMode=`L1T${T.temporalLayers}`:e.scalabilityMode="L1T3";this._remoteSdp.send({offerMediaObject:C,reuseMid:m.reuseMid,offerRtpParameters:S,answerRtpParameters:w,codecOptions:d});const R={type:"answer",sdp:this._remoteSdp.getSdp()};return p.debug("send() | calling pc.setRemoteDescription() [answer:%o]",R),await this._pc.setRemoteDescription(R),P||(P=f.mid,S.mid=P),this._mapMidTransceiver.set(P,f),{localId:P,rtpParameters:S,rtpSender:f.sender}}async stopSending(e){if(this.assertSendDirection(),this._closed)return;p.debug("stopSending() [localId:%s]",e);const t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated RTCRtpTransceiver not found");if(t.sender.replaceTrack(null),this._pc.removeTrack(t.sender),this._remoteSdp.closeMediaSection(t.mid))try{t.stop()}catch(e){}const i=await this._pc.createOffer();p.debug("stopSending() | calling pc.setLocalDescription() [offer:%o]",i),await this._pc.setLocalDescription(i);const r={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("stopSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r),this._mapMidTransceiver.delete(e)}async pauseSending(e){this.assertNotClosed(),this.assertSendDirection(),p.debug("pauseSending() [localId:%s]",e);const t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated RTCRtpTransceiver not found");t.direction="inactive",this._remoteSdp.pauseMediaSection(e);const i=await this._pc.createOffer();p.debug("pauseSending() | calling pc.setLocalDescription() [offer:%o]",i),await this._pc.setLocalDescription(i);const r={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("pauseSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r)}async resumeSending(e){this.assertNotClosed(),this.assertSendDirection(),p.debug("resumeSending() [localId:%s]",e);const t=this._mapMidTransceiver.get(e);if(this._remoteSdp.resumeSendingMediaSection(e),!t)throw new Error("associated RTCRtpTransceiver not found");t.direction="sendonly";const i=await this._pc.createOffer();p.debug("resumeSending() | calling pc.setLocalDescription() [offer:%o]",i),await this._pc.setLocalDescription(i);const r={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("resumeSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r)}async replaceTrack(e,t){this.assertNotClosed(),this.assertSendDirection(),t?p.debug("replaceTrack() [localId:%s, track.id:%s]",e,t.id):p.debug("replaceTrack() [localId:%s, no track]",e);const i=this._mapMidTransceiver.get(e);if(!i)throw new Error("associated RTCRtpTransceiver not found");await i.sender.replaceTrack(t)}async setMaxSpatialLayer(e,t){this.assertNotClosed(),this.assertSendDirection(),p.debug("setMaxSpatialLayer() [localId:%s, spatialLayer:%s]",e,t);const i=this._mapMidTransceiver.get(e);if(!i)throw new Error("associated RTCRtpTransceiver not found");const r=i.sender.getParameters();r.encodings.forEach((e,i)=>{e.active=i<=t}),await i.sender.setParameters(r),this._remoteSdp.muxMediaSectionSimulcast(e,r.encodings);const s=await this._pc.createOffer();p.debug("setMaxSpatialLayer() | calling pc.setLocalDescription() [offer:%o]",s),await this._pc.setLocalDescription(s);const a={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("setMaxSpatialLayer() | calling pc.setRemoteDescription() [answer:%o]",a),await this._pc.setRemoteDescription(a)}async setRtpEncodingParameters(e,t){this.assertNotClosed(),this.assertSendDirection(),p.debug("setRtpEncodingParameters() [localId:%s, params:%o]",e,t);const i=this._mapMidTransceiver.get(e);if(!i)throw new Error("associated RTCRtpTransceiver not found");const r=i.sender.getParameters();r.encodings.forEach((e,i)=>{r.encodings[i]={...e,...t}}),await i.sender.setParameters(r),this._remoteSdp.muxMediaSectionSimulcast(e,r.encodings);const s=await this._pc.createOffer();p.debug("setRtpEncodingParameters() | calling pc.setLocalDescription() [offer:%o]",s),await this._pc.setLocalDescription(s);const a={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("setRtpEncodingParameters() | calling pc.setRemoteDescription() [answer:%o]",a),await this._pc.setRemoteDescription(a)}async getSenderStats(e){this.assertNotClosed(),this.assertSendDirection();const t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated RTCRtpTransceiver not found");return t.sender.getStats()}async sendDataChannel({ordered:t,maxPacketLifeTime:i,maxRetransmits:r,label:s,protocol:a}){this.assertNotClosed(),this.assertSendDirection();const n={negotiated:!0,id:this._nextSendSctpStreamId,ordered:t,maxPacketLifeTime:i,maxRetransmits:r,protocol:a};p.debug("sendDataChannel() [options:%o]",n);const o=this._pc.createDataChannel(s,n);if(this._nextSendSctpStreamId=++this._nextSendSctpStreamId%h.MIS,!this._hasDataChannelMediaSection){const t=await this._pc.createOffer(),i=e.parse(t.sdp),r=i.media.find(e=>"application"===e.type);this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:i}),p.debug("sendDataChannel() | calling pc.setLocalDescription() [offer:%o]",t),await this._pc.setLocalDescription(t),this._remoteSdp.sendSctpAssociation({offerMediaObject:r});const s={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]",s),await this._pc.setRemoteDescription(s),this._hasDataChannelMediaSection=!0}return{dataChannel:o,sctpStreamParameters:{streamId:n.id,ordered:n.ordered,maxPacketLifeTime:n.maxPacketLifeTime,maxRetransmits:n.maxRetransmits}}}async receive(t){this.assertNotClosed(),this.assertRecvDirection();const i=[],r=new Map;for(const e of t){const{trackId:t,kind:i,rtpParameters:s,streamId:a}=e;p.debug("receive() [trackId:%s, kind:%s]",t,i);const n=s.mid??String(this._mapMidTransceiver.size);r.set(t,n);const{msidStreamId:o}=d.getMsidStreamIdAndTrackId(s.msid);this._remoteSdp.receive({mid:n,kind:i,offerRtpParameters:s,streamId:a??o??s.rtcp?.cname??"-",trackId:t})}const s={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("receive() | calling pc.setRemoteDescription() [offer:%o]",s),await this._pc.setRemoteDescription(s);for(const e of t){const{trackId:t,onRtpReceiver:i}=e;if(i){const e=r.get(t),s=this._pc.getTransceivers().find(t=>t.mid===e);if(!s)throw new Error("transceiver not found");i(s.receiver)}}let a=await this._pc.createAnswer();const n=e.parse(a.sdp);for(const e of t){const{trackId:t,rtpParameters:i}=e,s=r.get(t),a=n.media.find(e=>String(e.mid)===s);o.applyCodecParameters({offerRtpParameters:i,answerMediaObject:a})}a={type:"answer",sdp:e.write(n)},this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:n}),p.debug("receive() | calling pc.setLocalDescription() [answer:%o]",a),await this._pc.setLocalDescription(a);for(const e of t){const{trackId:t}=e,s=r.get(t),a=this._pc.getTransceivers().find(e=>e.mid===s);if(!a)throw new Error("new RTCRtpTransceiver not found");this._mapMidTransceiver.set(s,a),i.push({localId:s,track:a.receiver.track,rtpReceiver:a.receiver})}return i}async stopReceiving(e){if(this.assertRecvDirection(),this._closed)return;for(const t of e){p.debug("stopReceiving() [localId:%s]",t);const e=this._mapMidTransceiver.get(t);if(!e)throw new Error("associated RTCRtpTransceiver not found");this._remoteSdp.closeMediaSection(e.mid)}const t={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("stopReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const i=await this._pc.createAnswer();p.debug("stopReceiving() | calling pc.setLocalDescription() [answer:%o]",i),await this._pc.setLocalDescription(i);for(const t of e)this._mapMidTransceiver.delete(t)}async pauseReceiving(e){this.assertNotClosed(),this.assertRecvDirection();for(const t of e){p.debug("pauseReceiving() [localId:%s]",t);const e=this._mapMidTransceiver.get(t);if(!e)throw new Error("associated RTCRtpTransceiver not found");e.direction="inactive",this._remoteSdp.pauseMediaSection(t)}const t={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("pauseReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const i=await this._pc.createAnswer();p.debug("pauseReceiving() | calling pc.setLocalDescription() [answer:%o]",i),await this._pc.setLocalDescription(i)}async resumeReceiving(e){this.assertNotClosed(),this.assertRecvDirection();for(const t of e){p.debug("resumeReceiving() [localId:%s]",t);const e=this._mapMidTransceiver.get(t);if(!e)throw new Error("associated RTCRtpTransceiver not found");e.direction="recvonly",this._remoteSdp.resumeReceivingMediaSection(t)}const t={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("resumeReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const i=await this._pc.createAnswer();p.debug("resumeReceiving() | calling pc.setLocalDescription() [answer:%o]",i),await this._pc.setLocalDescription(i)}async getReceiverStats(e){this.assertNotClosed(),this.assertRecvDirection();const t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated RTCRtpTransceiver not found");return t.receiver.getStats()}async receiveDataChannel({sctpStreamParameters:t,label:i,protocol:r}){this.assertNotClosed(),this.assertRecvDirection();const{streamId:s,ordered:a,maxPacketLifeTime:n,maxRetransmits:o}=t,c={negotiated:!0,id:s,ordered:a,maxPacketLifeTime:n,maxRetransmits:o,protocol:r};p.debug("receiveDataChannel() [options:%o]",c);const d=this._pc.createDataChannel(i,c);if(!this._hasDataChannelMediaSection){this._remoteSdp.receiveSctpAssociation();const t={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("receiveDataChannel() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const i=await this._pc.createAnswer();if(!this._transportReady){const t=e.parse(i.sdp);await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:t})}p.debug("receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]",i),await this._pc.setLocalDescription(i),this._hasDataChannelMediaSection=!0}return{dataChannel:d}}async setupTransport({localDtlsRole:t,localSdpObject:i}){i||(i=e.parse(this._pc.localDescription.sdp));const r=o.extractDtlsParameters({sdpObject:i});r.role=t,this._remoteSdp.updateDtlsRole("client"===t?"server":"client"),await new Promise((e,t)=>{this.safeEmit("@connect",{dtlsParameters:r},e,t)}),this._transportReady=!0}onIceGatheringStateChange=()=>{this.emit("@icegatheringstatechange",this._pc.iceGatheringState)};onIceCandidateError=e=>{this.emit("@icecandidateerror",e)};onConnectionStateChange=()=>{this.emit("@connectionstatechange",this._pc.connectionState)};onIceConnectionStateChange=()=>{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")}};assertNotClosed(){if(this._closed)throw new s.InvalidStateError("method called in a closed handler")}assertSendDirection(){if("send"!==this._direction)throw new Error('method can just be called for handlers with "send" direction')}assertRecvDirection(){if("recv"!==this._direction)throw new Error('method can just be called for handlers with "recv" direction')}};return vt.ReactNative106=u,vt}(),l=new e.Logger("Device");function h(e,t){return l.debug("detectDevice()"),e||"object"!=typeof navigator||(e=navigator.userAgent),t||"object"!=typeof navigator||(t=navigator.userAgentData),m(e,t)}async function u(e,t){return l.debug("detectDeviceAsync()"),e||"object"!=typeof navigator||(e=navigator.userAgent),t||"object"!=typeof navigator||(t=navigator.userAgentData),m(e,t)}function m(e,t){l.debug('detectDeviceImpl() [userAgent:"%s", userAgentData:%o]',e,t);const i=function(e,t){if(l.debug("getChromiumMajorVersion()"),f(e,t))return void l.debug("getChromiumMajorVersion() | this is iOS => undefined");if(g())return void l.debug("getChromiumMajorVersion() | this is React-Native => undefined");if(t){const e=(t.brands??[]).find(e=>"Chromium"===e.brand);if(e){const t=Number(e.version);return l.debug(`getChromiumMajorVersion() | Chromium major version based on NavigatorUAData => ${t}`),t}}const i=e?.match(/\b(?:Chrome|Chromium)\/(\w+)/i);if(i?.[1]){const e=Number(i[1]);return l.debug(`getChromiumMajorVersion() | Chromium major version based on User-Agent => ${e}`),e}return void l.debug("getChromiumMajorVersion() | this is not Chromium => undefined")}(e,t);if(i)return i>=111?(l.debug("detectDeviceImpl() | using Chrome111 handler"),"Chrome111"):i>=74?(l.debug("detectDeviceImpl() | using Chrome74 handler"),"Chrome74"):void l.warn("detectDeviceImpl() | unsupported Chromium based browser/version");const r=function(e){if(l.debug("getFirefoxMajorVersion()"),f(e))return void l.debug("getFirefoxMajorVersion() | this is iOS => undefined");if(g())return void l.debug("getFirefoxMajorVersion() | this is React-Native => undefined");const t=e?.match(/\bFirefox\/(\w+)/i);if(t?.[1]){const e=Number(t[1]);return l.debug(`getFirefoxMajorVersion() | Firefox major version based on User-Agent => ${e}`),e}return void l.debug("getFirefoxMajorVersion() | this is not Firefox => undefined")}(e);if(r)return r>=120?(l.debug("detectDeviceImpl() | using Firefox120 handler"),"Firefox120"):void l.warn("detectDeviceImpl() | unsupported Firefox browser/version");const s=function(e){if(l.debug("getMacOSWebKitMajorVersion()"),f(e))return void l.debug("getMacOSWebKitMajorVersion() | this is iOS => undefined");if(g())return void l.debug("getMacOSWebKitMajorVersion() | this is React-Native => undefined");const t=e&&/\bSafari\b/i.test(e)&&!/\bChrome\b/i.test(e)&&!/\bChromium\b/i.test(e)&&!/\bFirefox\b/i.test(e);if(!t)return void l.debug("getMacOSWebKitMajorVersion() | this is not Safari => undefined");const i=e.match(/AppleWebKit\/(\w+)/i);if(i?.[1]){const e=Number(i[1]);return l.debug(`getMacOSWebKitMajorVersion() | WebKit major version based on User-Agent => ${e}`),e}return void l.debug("getMacOSWebKitMajorVersion() | this is not WebKit => undefined")}(e);if(s)return s>=605?(l.debug("detectDeviceImpl() | using Safari12 handler"),"Safari12"):void l.warn("detectDeviceImpl() | unsupported desktop Safari browser/version");const a=function(e){if(l.debug("getIOSWebKitMajorVersion()"),!f(e))return void l.debug("getIOSWebKitMajorVersion() | this is not iOS => undefined");if(g())return void l.debug("getIOSWebKitMajorVersion() | this is React-Native => undefined");const t=e?.match(/AppleWebKit\/(\w+)/i);if(t?.[1]){const e=Number(t[1]);return l.debug(`getIOSWebKitMajorVersion() | WebKit major version based on User-Agent => ${e}`),e}return void l.debug("getIOSWebKitMajorVersion() | this is not WebKit => undefined")}(e);return a?a>=605?(l.debug("detectDeviceImpl() | using Safari12 handler"),"Safari12"):void l.warn("detectDeviceImpl() | unsupported iOS Safari based browser/version"):g()?"undefined"!=typeof RTCPeerConnection&&"undefined"!=typeof RTCRtpTransceiver?(l.debug("detectDeviceImpl() | using ReactNative106 handler"),"ReactNative106"):void l.warn("detectDeviceImpl() | unsupported react-native-webrtc version without RTCPeerConnection or RTCRtpTransceiver, forgot to call registerGlobals() on it?"):void l.warn('detectDeviceImpl() | device not supported [userAgent:"%s", userAgentData:%o]',e,t)}function f(e,t){return l.debug("isIOS()"),"iOS"===t?.platform?(l.debug("isIOS() | this is iOS based on NavigatorUAData.platform => true"),!0):t?.platform?(l.debug("isIOS() | this is not iOS based on NavigatorUAData.platform => false"),!1):e&&/iPad|iPhone|iPod/.test(e)?(l.debug("isIOS() | this is iOS based on User-Agent => true"),!0):"object"==typeof navigator&&"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1?(l.debug("isIOS() | this is iPadOS 13+ based on User-Agent => true"),!0):(l.debug("isIOS() | this is not iOS => false"),!1)}function g(){return l.debug("isReactNative()"),"object"==typeof navigator&&"ReactNative"===navigator.product?(l.debug("isReactNative() | this is React-Native based on navigator.product"),!0):(l.debug("isReactNative() | this is not React-Native => false"),!1)}return q.Device=class e{_handlerFactory;_handlerName;_loaded=!1;_getSendExtendedRtpCapabilities;_recvRtpCapabilities;_sendRtpCapabilities;_canProduceByKind={audio:!1,video:!1};_sctpCapabilities;_observer=new t.EnhancedEventEmitter;static async factory({handlerName:t,handlerFactory:r}={}){if(l.debug("factory()"),t&&r)throw new TypeError("just one of handlerName or handlerInterface can be given");if(!t&&!r&&!(t=await u()))throw new i.UnsupportedError("device not supported");return new e({handlerName:t,handlerFactory:r})}constructor({handlerName:e,handlerFactory:t}={}){if(l.debug("constructor()"),e&&t)throw new TypeError("just one of handlerName or handlerInterface can be given");if(t)this._handlerFactory=t;else{if(e)l.debug("constructor() | handler given: %s",e);else{if(!(e=h()))throw new i.UnsupportedError("device not supported");l.debug("constructor() | detected handler: %s",e)}switch(e){case"Chrome111":this._handlerFactory=n.Chrome111.createFactory();break;case"Chrome74":this._handlerFactory=o.Chrome74.createFactory();break;case"Firefox120":this._handlerFactory=c.Firefox120.createFactory();break;case"Safari12":this._handlerFactory=d.Safari12.createFactory();break;case"ReactNative106":this._handlerFactory=p.ReactNative106.createFactory();break;default:throw new TypeError(`unknown handlerName "${e}"`)}}this._handlerName=this._handlerFactory.name}get handlerName(){return this._handlerName}get loaded(){return this._loaded}get rtpCapabilities(){return this.recvRtpCapabilities}get recvRtpCapabilities(){if(!this._loaded)throw new i.InvalidStateError("not loaded");return this._recvRtpCapabilities}get sendRtpCapabilities(){if(!this._loaded)throw new i.InvalidStateError("not loaded");return this._sendRtpCapabilities}get sctpCapabilities(){if(!this._loaded)throw new i.InvalidStateError("not loaded");return this._sctpCapabilities}get observer(){return this._observer}async load({routerRtpCapabilities:e,preferLocalCodecsOrder:t=!1}){if(l.debug("load() [routerRtpCapabilities:%o]",e),this._loaded)throw new i.InvalidStateError("already loaded");const a=r.clone(e);s.validateAndNormalizeRtpCapabilities(a);const{getNativeRtpCapabilities:n,getNativeSctpCapabilities:o}=this._handlerFactory,c=r.clone(await n({direction:"recvonly"}));l.debug("load() | got native receiving RTP capabilities:%o",c),s.validateAndNormalizeRtpCapabilities(c);const d=r.clone(await n({direction:"sendonly"}));l.debug("load() | got native sending RTP capabilities:%o",d),s.validateAndNormalizeRtpCapabilities(d),this._getSendExtendedRtpCapabilities=e=>r.clone(s.getExtendedRtpCapabilities(e,a,t));const p=s.getExtendedRtpCapabilities(c,a,!1);this._recvRtpCapabilities=s.getRecvRtpCapabilities(p),l.debug("load() | got receiving RTP capabilities:%o",this._recvRtpCapabilities),s.validateAndNormalizeRtpCapabilities(this._recvRtpCapabilities);const h=s.getExtendedRtpCapabilities(d,a,t);this._sendRtpCapabilities=s.getSendRtpCapabilities(h),l.debug("load() | got sending RTP capabilities:%o",this._sendRtpCapabilities),s.validateAndNormalizeRtpCapabilities(this._sendRtpCapabilities),this._canProduceByKind.audio=s.canSend("audio",this._sendRtpCapabilities),this._canProduceByKind.video=s.canSend("video",this._sendRtpCapabilities),this._sctpCapabilities=await o(),s.validateSctpCapabilities(this._sctpCapabilities),l.debug("load() | got native SCTP capabilities:%o",this._sctpCapabilities),l.debug("load() succeeded"),this._loaded=!0}canProduce(e){if(!this._loaded)throw new i.InvalidStateError("not loaded");if("audio"!==e&&"video"!==e)throw new TypeError(`invalid kind "${e}"`);return this._canProduceByKind[e]}createSendTransport({id:e,iceParameters:t,iceCandidates:i,dtlsParameters:r,sctpParameters:s,iceServers:a,iceTransportPolicy:n,additionalSettings:o,appData:c}){return l.debug("createSendTransport()"),this.createTransport({direction:"send",id:e,iceParameters:t,iceCandidates:i,dtlsParameters:r,sctpParameters:s,iceServers:a,iceTransportPolicy:n,additionalSettings:o,appData:c})}createRecvTransport({id:e,iceParameters:t,iceCandidates:i,dtlsParameters:r,sctpParameters:s,iceServers:a,iceTransportPolicy:n,additionalSettings:o,appData:c}){return l.debug("createRecvTransport()"),this.createTransport({direction:"recv",id:e,iceParameters:t,iceCandidates:i,dtlsParameters:r,sctpParameters:s,iceServers:a,iceTransportPolicy:n,additionalSettings:o,appData:c})}createTransport({direction:e,id:t,iceParameters:r,iceCandidates:s,dtlsParameters:n,sctpParameters:o,iceServers:c,iceTransportPolicy:d,additionalSettings:p,appData:l}){if(!this._loaded)throw new i.InvalidStateError("not loaded");if("string"!=typeof t)throw new TypeError("missing id");if("object"!=typeof r)throw new TypeError("missing iceParameters");if(!Array.isArray(s))throw new TypeError("missing iceCandidates");if("object"!=typeof n)throw new TypeError("missing dtlsParameters");if(o&&"object"!=typeof o)throw new TypeError("wrong sctpParameters");if(l&&"object"!=typeof l)throw new TypeError("if given, appData must be an object");const h=new a.Transport({direction:e,id:t,iceParameters:r,iceCandidates:s,dtlsParameters:n,sctpParameters:o,iceServers:c,iceTransportPolicy:d,additionalSettings:p,appData:l,handlerFactory:this._handlerFactory,getSendExtendedRtpCapabilities:this._getSendExtendedRtpCapabilities,recvRtpCapabilities:this._recvRtpCapabilities,canProduceByKind:this._canProduceByKind});return this._observer.safeEmit("newtransport",h),h}},q}var _t,yt={},St={},wt={};var kt,Tt={};var Ct,Pt={};var Rt,Et,Dt={};function xt(){if(Et)return St;Et=1,Object.defineProperty(St,"__esModule",{value:!0}),St.FakeMediaStreamTrack=void 0;const e=function(){if(_t)return wt;_t=1;for(var e,t=256,i=[];t--;)i[t]=(t+256).toString(16).substring(1);return wt.v4=function(){var r,s=0,a="";if(!e||t+16>256){for(e=Array(s=256);s--;)e[s]=256*Math.random()|0;s=t=0}for(;s<16;s++)r=e[t+s],a+=6==s?i[15&r|64]:8==s?i[63&r|128]:i[r],1&s&&s>1&&s<11&&(a+="-");return t++,a},wt}(),t=(kt||(kt=1,Object.defineProperty(Tt,"__esModule",{value:!0}),Tt.FakeEventTarget=void 0,Tt.FakeEventTarget=class{listeners={};addEventListener(e,t,i){t&&(this.listeners[e]=this.listeners[e]??[],this.listeners[e].push({callback:"function"==typeof t?t:t.handleEvent,once:"object"==typeof i&&!0===i.once}))}removeEventListener(e,t,i){this.listeners[e]&&t&&(this.listeners[e]=this.listeners[e].filter(e=>e.callback!==("function"==typeof t?t:t.handleEvent)))}dispatchEvent(e){if(!e||"string"!=typeof e.type)throw new Error("invalid event object");const t=this.listeners[e.type];if(!t)return!0;for(const i of[...t]){try{i.callback.call(this,e)}catch(e){setTimeout(()=>{throw e},0)}i.once&&this.removeEventListener(e.type,i.callback)}return!e.defaultPrevented}}),Tt),i=(Ct||(Ct=1,Object.defineProperty(Pt,"__esModule",{value:!0}),Pt.FakeEvent=void 0,Pt.FakeEvent=class{NONE=0;CAPTURING_PHASE=1;AT_TARGET=2;BUBBLING_PHASE=3;type;bubbles;cancelable;defaultPrevented=!1;composed=!1;currentTarget=null;eventPhase=this.NONE;isTrusted=!0;target=null;timeStamp=0;cancelBubble=!1;returnValue=!0;srcElement=null;constructor(e,t={}){this.type=e,this.bubbles=t.bubbles??!1,this.cancelable=t.cancelable??!1}preventDefault(){this.cancelable&&(this.defaultPrevented=!0)}stopPropagation(){}stopImmediatePropagation(){}composedPath(){return[]}initEvent(e,t,i){}}),Pt),r=(Rt||(Rt=1,Object.defineProperty(Dt,"__esModule",{value:!0}),Dt.clone=function(e){return void 0===e?void 0:Number.isNaN(e)?NaN:"function"==typeof structuredClone?structuredClone(e):JSON.parse(JSON.stringify(e))}),Dt);class s extends t.FakeEventTarget{#e;#t;#i;#r;#s;#a;#n;#o;#c;#d;#p;#l=null;#h=null;#u=null;#m=null;#f=null;constructor({kind:t,id:i,label:r,contentHint:s,enabled:a,muted:n,readyState:o,capabilities:c,constraints:d,settings:p,data:l}){super(),this.#e=i??(0,e.v4)(),this.#t=t,this.#i=r??"",this.#n=s??"",this.#s=a??!0,this.#a=n??!1,this.#r=o??"live",this.#o=c??{},this.#c=d??{},this.#d=p??{},this.#p=l??{}}get id(){return this.#e}get kind(){return this.#t}get label(){return this.#i}get contentHint(){return this.#n}set contentHint(e){this.#n=e}get enabled(){return this.#s}set enabled(e){const t=this.#s!==e;this.#s=e,t&&this.dispatchEvent(new i.FakeEvent("enabledchange"))}get muted(){return this.#a}get readyState(){return this.#r}get data(){return this.#p}set data(e){this.#p=e}get onmute(){return this.#l}set onmute(e){this.#l&&this.removeEventListener("mute",this.#l),this.#l=e,e&&this.addEventListener("mute",e)}get onunmute(){return this.#h}set onunmute(e){this.#h&&this.removeEventListener("unmute",this.#h),this.#h=e,e&&this.addEventListener("unmute",e)}get onended(){return this.#u}set onended(e){this.#u&&this.removeEventListener("ended",this.#u),this.#u=e,e&&this.addEventListener("ended",e)}get onenabledchange(){return this.#m}set onenabledchange(e){this.#m&&this.removeEventListener("enabledchange",this.#m),this.#m=e,e&&this.addEventListener("enabledchange",e)}get onstopped(){return this.#f}set onstopped(e){this.#f&&this.removeEventListener("stopped",this.#f),this.#f=e,e&&this.addEventListener("stopped",e)}addEventListener(e,t,i){super.addEventListener(e,t,i)}removeEventListener(e,t,i){super.removeEventListener(e,t,i)}stop(){"ended"!==this.#r&&(this.#r="ended",this.dispatchEvent(new i.FakeEvent("stopped")))}clone({id:t,data:i}={}){return new s({id:t??(0,e.v4)(),kind:this.#t,label:this.#i,contentHint:this.#n,enabled:this.#s,muted:this.#a,readyState:this.#r,capabilities:(0,r.clone)(this.#o),constraints:(0,r.clone)(this.#c),settings:(0,r.clone)(this.#d),data:i??(0,r.clone)(this.#p)})}getCapabilities(){return this.#o}getConstraints(){return this.#c}async applyConstraints(e={}){return this.#c=e,Promise.resolve()}getSettings(){return this.#d}remoteStop(){"ended"!==this.#r&&(this.#r="ended",this.dispatchEvent(new i.FakeEvent("stopped")),this.dispatchEvent(new i.FakeEvent("ended")))}remoteMute(){this.#a||(this.#a=!0,this.dispatchEvent(new i.FakeEvent("mute")))}remoteUnmute(){this.#a&&(this.#a=!1,this.dispatchEvent(new i.FakeEvent("unmute")))}}return St.FakeMediaStreamTrack=s,St}var It,Mt,Lt={};function Ot(){if(Mt)return yt;Mt=1,Object.defineProperty(yt,"__esModule",{value:!0}),yt.FakeHandler=void 0;const e=xt(),t=J(),i=G(),r=ie(),s=pe(),a=Z(),n=(It||(It=1,Object.defineProperty(Lt,"__esModule",{value:!0}),Lt.FakeEventTarget=void 0,Lt.FakeEventTarget=class{listeners={};addEventListener(e,t,i){t&&(this.listeners[e]=this.listeners[e]??[],this.listeners[e].push({callback:"function"==typeof t?t:t.handleEvent,once:"object"==typeof i&&!0===i.once}))}removeEventListener(e,t,i){this.listeners[e]&&t&&(this.listeners[e]=this.listeners[e].filter(e=>e.callback!==("function"==typeof t?t:t.handleEvent)))}dispatchEvent(e){if(!e||"string"!=typeof e.type)throw new Error("invalid event object");const t=this.listeners[e.type];if(!t)return!0;for(const i of[...t]){try{i.callback.call(this,e)}catch(e){setTimeout(()=>{throw e},0)}i.once&&this.removeEventListener(e.type,i.callback)}return!e.defaultPrevented}}),Lt),o=new i.Logger("FakeHandler"),c="FakeHandler";let d=class i extends t.EnhancedEventEmitter{_closed=!1;_fakeParameters;_getSendExtendedRtpCapabilities;_cname=`CNAME-${r.generateRandomNumber()}`;_defaultSendStreamId=`${r.generateRandomNumber()}`;_transportReady=!1;_nextLocalId=1;_tracks=new Map;_nextSctpStreamId=0;static createFactory(e){return{name:c,factory:t=>new i(t,e),getNativeRtpCapabilities:async({direction:t})=>(o.debug("getNativeRtpCapabilities() [direction:%o]",t),i.getLocalRtpCapabilities(e)),getNativeSctpCapabilities:async()=>(o.debug("getNativeSctpCapabilities()"),e.generateNativeSctpCapabilities())}}static getLocalRtpCapabilities(e){const t=e.generateNativeRtpCapabilities();return s.validateAndNormalizeRtpCapabilities(t),t}constructor({getSendExtendedRtpCapabilities:e},t){super(),o.debug("constructor()"),this._getSendExtendedRtpCapabilities=e,this._fakeParameters=t}get name(){return c}close(){o.debug("close()"),this._closed||(this._closed=!0,super.close())}setIceGatheringState(e){this.emit("@icegatheringstatechange",e)}setConnectionState(e){this.emit("@connectionstatechange",e)}async updateIceServers(e){this.assertNotClosed(),o.debug("updateIceServers()")}async restartIce(e){this.assertNotClosed(),o.debug("restartIce()")}async getTransportStats(){return this.assertNotClosed(),new Map}async send({track:e,streamId:t,encodings:a,codecOptions:n,codec:c}){this.assertNotClosed(),o.debug("send() [kind:%s, track.id:%s]",e.kind,e.id),this._transportReady||await this.setupTransport({localDtlsRole:"server"});const d=i.getLocalRtpCapabilities(this._fakeParameters),p=this._getSendExtendedRtpCapabilities(d),l=s.getSendingRtpParameters(e.kind,p);l.codecs=s.reduceCodecs(l.codecs,c);const h=l.codecs.some(e=>/.+\/rtx$/i.test(e.mimeType));l.mid=`mid-${r.generateRandomNumber()}`,l.msid=`${t??"-"} ${e.id}`,a||(a=[{}]);for(const e of a)e.ssrc=r.generateRandomNumber(),h&&(e.rtx={ssrc:r.generateRandomNumber()});l.encodings=a,l.rtcp={cname:this._cname,reducedSize:!0,mux:!0},l.msid=`${t??this._defaultSendStreamId} ${e.id}`;const u=this._nextLocalId++;return this._tracks.set(u,e),{localId:String(u),rtpParameters:l}}async stopSending(e){if(o.debug("stopSending() [localId:%s]",e),!this._closed){if(!this._tracks.has(Number(e)))throw new Error("local track not found");this._tracks.delete(Number(e))}}async pauseSending(e){this.assertNotClosed()}async resumeSending(e){this.assertNotClosed()}async replaceTrack(e,t){this.assertNotClosed(),t?o.debug("replaceTrack() [localId:%s, track.id:%s]",e,t.id):o.debug("replaceTrack() [localId:%s, no track]",e),this._tracks.delete(Number(e)),this._tracks.set(Number(e),t)}async setMaxSpatialLayer(e,t){this.assertNotClosed(),o.debug("setMaxSpatialLayer() [localId:%s, spatialLayer:%s]",e,t)}async setRtpEncodingParameters(e,t){this.assertNotClosed(),o.debug("setRtpEncodingParameters() [localId:%s, params:%o]",e,t)}async getSenderStats(e){return this.assertNotClosed(),new Map}async sendDataChannel({ordered:e,maxPacketLifeTime:t,maxRetransmits:i,label:r,protocol:s}){this.assertNotClosed(),this._transportReady||await this.setupTransport({localDtlsRole:"server"}),o.debug("sendDataChannel()");return{dataChannel:new p({id:this._nextSctpStreamId++,ordered:e,maxPacketLifeTime:t,maxRetransmits:i,label:r,protocol:s}),sctpStreamParameters:{streamId:this._nextSctpStreamId,ordered:e,maxPacketLifeTime:t,maxRetransmits:i}}}async receive(t){this.assertNotClosed();const i=[];for(const r of t){const{trackId:t,kind:s}=r;this._transportReady||await this.setupTransport({localDtlsRole:"client"}),o.debug("receive() [trackId:%s, kind:%s]",t,s);const a=this._nextLocalId++,n=new e.FakeMediaStreamTrack({kind:s});this._tracks.set(a,n),i.push({localId:String(a),track:n})}return i}async stopReceiving(e){if(!this._closed)for(const t of e)o.debug("stopReceiving() [localId:%s]",t),this._tracks.delete(Number(t))}async pauseReceiving(e){this.assertNotClosed()}async resumeReceiving(e){this.assertNotClosed()}async getReceiverStats(e){return this.assertNotClosed(),new Map}async receiveDataChannel({sctpStreamParameters:e,label:t,protocol:i}){this.assertNotClosed(),this._transportReady||await this.setupTransport({localDtlsRole:"client"}),o.debug("receiveDataChannel()");return{dataChannel:new p({id:e.streamId,ordered:e.ordered,maxPacketLifeTime:e.maxPacketLifeTime,maxRetransmits:e.maxRetransmits,label:t,protocol:i})}}async setupTransport({localDtlsRole:e,localSdpObject:t}){const i=r.clone(this._fakeParameters.generateLocalDtlsParameters());e&&(i.role=e),this.emit("@connectionstatechange","connecting"),await new Promise((e,t)=>this.emit("@connect",{dtlsParameters:i},e,t)),this._transportReady=!0}assertNotClosed(){if(this._closed)throw new a.InvalidStateError("method called in a closed handler")}};yt.FakeHandler=d;class p extends n.FakeEventTarget{_id;_negotiated=!0;_ordered;_maxPacketLifeTime;_maxRetransmits;_label;_protocol;_readyState="connecting";_bufferedAmount=0;_bufferedAmountLowThreshold=0;_binaryType="arraybuffer";_onopen=null;_onclosing=null;_onclose=null;_onmessage=null;_onbufferedamountlow=null;_onerror=null;constructor({id:e,ordered:t=!0,maxPacketLifeTime:i=null,maxRetransmits:r=null,label:s="",protocol:a=""}){super(),o.debug(`constructor() [id:${e}, ordered:${t}, maxPacketLifeTime:${i}, maxRetransmits:${r}, label:${s}, protocol:${a}`),this._id=e,this._ordered=t,this._maxPacketLifeTime=i,this._maxRetransmits=r,this._label=s,this._protocol=a}get id(){return this._id}get negotiated(){return this._negotiated}get ordered(){return this._ordered}get maxPacketLifeTime(){return this._maxPacketLifeTime}get maxRetransmits(){return this._maxRetransmits}get label(){return this._label}get protocol(){return this._protocol}get readyState(){return this._readyState}get bufferedAmount(){return this._bufferedAmount}get bufferedAmountLowThreshold(){return this._bufferedAmountLowThreshold}set bufferedAmountLowThreshold(e){this._bufferedAmountLowThreshold=e}get binaryType(){return this._binaryType}set binaryType(e){this._binaryType=e}get onopen(){return this._onopen}set onopen(e){this._onopen&&this.removeEventListener("open",this._onopen),this._onopen=e,e&&this.addEventListener("open",e)}get onclosing(){return this._onclosing}set onclosing(e){this._onclosing&&this.removeEventListener("closing",this._onclosing),this._onclosing=e,e&&this.addEventListener("closing",e)}get onclose(){return this._onclose}set onclose(e){this._onclose&&this.removeEventListener("close",this._onclose),this._onclose=e,e&&this.addEventListener("close",e)}get onmessage(){return this._onmessage}set onmessage(e){this._onmessage&&this.removeEventListener("message",this._onmessage),this._onmessage=e,e&&this.addEventListener("message",e)}get onbufferedamountlow(){return this._onbufferedamountlow}set onbufferedamountlow(e){this._onbufferedamountlow&&this.removeEventListener("bufferedamountlow",this._onbufferedamountlow),this._onbufferedamountlow=e,e&&this.addEventListener("bufferedamountlow",e)}get onerror(){return this._onerror}set onerror(e){this._onerror&&this.removeEventListener("error",this._onerror),this._onerror=e,e&&this.addEventListener("error",e)}addEventListener(e,t,i){super.addEventListener(e,t,i)}removeEventListener(e,t,i){super.removeEventListener(e,t,i)}close(){["closing","closed"].includes(this._readyState)||(this._readyState="closed")}send(e){if("open"!==this._readyState)throw new a.InvalidStateError("not open")}}return yt}var At,jt,Ft={};function Nt(){return jt||(jt=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.debug=e.testFakeParameters=e.FakeHandler=e.enhancedEvents=e.ortc=e.parseScalabilityMode=e.detectDeviceAsync=e.detectDevice=e.Device=e.version=e.types=void 0;const t=B();e.debug=t.default,e.types=(z||(z=1,Object.defineProperty(V,"__esModule",{value:!0})),V),e.version="3.18.7";var i=bt();Object.defineProperty(e,"Device",{enumerable:!0,get:function(){return i.Device}}),Object.defineProperty(e,"detectDevice",{enumerable:!0,get:function(){return i.detectDevice}}),Object.defineProperty(e,"detectDeviceAsync",{enumerable:!0,get:function(){return i.detectDeviceAsync}});var r=Ge();Object.defineProperty(e,"parseScalabilityMode",{enumerable:!0,get:function(){return r.parse}}),e.ortc=pe(),e.enhancedEvents=J();var s=Ot();Object.defineProperty(e,"FakeHandler",{enumerable:!0,get:function(){return s.FakeHandler}}),e.testFakeParameters=function(){if(At)return Ft;At=1,Object.defineProperty(Ft,"__esModule",{value:!0}),Ft.generateRouterRtpCapabilities=function(){return e.deepFreeze({codecs:[{mimeType:"audio/opus",kind:"audio",preferredPayloadType:100,clockRate:48e3,channels:2,rtcpFeedback:[{type:"transport-cc"}],parameters:{useinbandfec:1,foo:"bar"}},{mimeType:"video/VP8",kind:"video",preferredPayloadType:101,clockRate:9e4,rtcpFeedback:[{type:"nack"},{type:"nack",parameter:"pli"},{type:"ccm",parameter:"fir"},{type:"goog-remb"},{type:"transport-cc"}],parameters:{"x-google-start-bitrate":1500}},{mimeType:"video/rtx",kind:"video",preferredPayloadType:102,clockRate:9e4,rtcpFeedback:[],parameters:{apt:101}},{mimeType:"video/H264",kind:"video",preferredPayloadType:103,clockRate:9e4,rtcpFeedback:[{type:"nack"},{type:"nack",parameter:"pli"},{type:"ccm",parameter:"fir"},{type:"goog-remb"},{type:"transport-cc"}],parameters:{"level-asymmetry-allowed":1,"packetization-mode":1,"profile-level-id":"42e01f"}},{mimeType:"video/rtx",kind:"video",preferredPayloadType:104,clockRate:9e4,rtcpFeedback:[],parameters:{apt:103}},{mimeType:"video/VP9",kind:"video",preferredPayloadType:105,clockRate:9e4,rtcpFeedback:[{type:"nack"},{type:"nack",parameter:"pli"},{type:"ccm",parameter:"fir"},{type:"goog-remb"},{type:"transport-cc"}],parameters:{"profile-id":0,"x-google-start-bitrate":1500}},{mimeType:"video/rtx",kind:"video",preferredPayloadType:106,clockRate:9e4,rtcpFeedback:[],parameters:{apt:105}}],headerExtensions:[{kind:"audio",uri:"urn:ietf:params:rtp-hdrext:sdes:mid",preferredId:1,preferredEncrypt:!1,direction:"sendrecv"},{kind:"video",uri:"urn:ietf:params:rtp-hdrext:sdes:mid",preferredId:1,preferredEncrypt:!1,direction:"sendrecv"},{kind:"video",uri:"urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id",preferredId:2,preferredEncrypt:!1,direction:"recvonly"},{kind:"video",uri:"urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id",preferredId:3,preferredEncrypt:!1,direction:"recvonly"},{kind:"audio",uri:"http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time",preferredId:4,preferredEncrypt:!1,direction:"sendrecv"},{kind:"video",uri:"http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time",preferredId:4,preferredEncrypt:!1,direction:"sendrecv"},{kind:"audio",uri:"http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01",preferredId:5,preferredEncrypt:!1,direction:"recvonly"},{kind:"video",uri:"http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01",preferredId:5,preferredEncrypt:!1,direction:"sendrecv"},{kind:"audio",uri:"urn:ietf:params:rtp-hdrext:ssrc-audio-level",preferredId:10,preferredEncrypt:!1,direction:"sendrecv"},{kind:"video",uri:"urn:3gpp:video-orientation",preferredId:11,preferredEncrypt:!1,direction:"sendrecv"},{kind:"video",uri:"urn:ietf:params:rtp-hdrext:toffset",preferredId:12,preferredEncrypt:!1,direction:"sendrecv"}]})},Ft.generateNativeRtpCapabilities=function(){return{codecs:[{mimeType:"audio/opus",kind:"audio",preferredPayloadType:111,clockRate:48e3,channels:2,rtcpFeedback:[{type:"transport-cc"}],parameters:{minptime:10,useinbandfec:1}},{mimeType:"audio/ISAC",kind:"audio",preferredPayloadType:103,clockRate:16e3,channels:1,rtcpFeedback:[{type:"transport-cc"}],parameters:{}},{mimeType:"audio/CN",kind:"audio",preferredPayloadType:106,clockRate:32e3,channels:1,rtcpFeedback:[{type:"transport-cc"}],parameters:{}},{mimeType:"audio/foo",kind:"audio",preferredPayloadType:107,clockRate:9e4,channels:4,rtcpFeedback:[{type:"foo-qwe-qwe"}],parameters:{foo:"lalala"}},{mimeType:"video/BAZCODEC",kind:"video",preferredPayloadType:100,clockRate:9e4,rtcpFeedback:[{type:"foo"},{type:"transport-cc"},{type:"ccm",parameter:"fir"},{type:"nack"},{type:"nack",parameter:"pli"}],parameters:{baz:"1234abcd"}},{mimeType:"video/rtx",kind:"video",preferredPayloadType:101,clockRate:9e4,rtcpFeedback:[],parameters:{apt:100}},{mimeType:"video/VP8",kind:"video",preferredPayloadType:96,clockRate:9e4,rtcpFeedback:[{type:"goog-remb"},{type:"transport-cc"},{type:"ccm",parameter:"fir"},{type:"nack"},{type:"nack",parameter:"pli"}],parameters:{baz:"1234abcd"}},{mimeType:"video/rtx",kind:"video",preferredPayloadType:97,clockRate:9e4,rtcpFeedback:[],parameters:{apt:96}},{mimeType:"video/VP9",kind:"video",preferredPayloadType:98,clockRate:9e4,rtcpFeedback:[{type:"goog-remb"},{type:"transport-cc"},{type:"ccm",parameter:"fir"},{type:"nack"},{type:"nack",parameter:"pli"}],parameters:{"profile-id":0}},{mimeType:"video/rtx",kind:"video",preferredPayloadType:99,clockRate:9e4,rtcpFeedback:[],parameters:{apt:98}}],headerExtensions:[{kind:"audio",uri:"urn:ietf:params:rtp-hdrext:sdes:mid",preferredId:1},{kind:"video",uri:"urn:ietf:params:rtp-hdrext:sdes:mid",preferredId:1},{kind:"video",uri:"urn:ietf:params:rtp-hdrext:toffset",preferredId:2},{kind:"video",uri:"http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time",preferredId:3},{kind:"video",uri:"urn:3gpp:video-orientation",preferredId:4},{kind:"video",uri:"http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01",preferredId:5},{kind:"video",uri:"http://www.webrtc.org/experiments/rtp-hdrext/playout-delay",preferredId:6},{kind:"video",uri:"http://www.webrtc.org/experiments/rtp-hdrext/video-content-type",preferredId:7},{kind:"video",uri:"http://www.webrtc.org/experiments/rtp-hdrext/video-timing",preferredId:8},{kind:"audio",uri:"urn:ietf:params:rtp-hdrext:ssrc-audio-level",preferredId:10}]}},Ft.generateNativeSctpCapabilities=function(){return e.deepFreeze({numStreams:{OS:2048,MIS:2048}})},Ft.generateLocalDtlsParameters=function(){return e.deepFreeze({fingerprints:[{algorithm:"sha-256",value:"82:5A:68:3D:36:C3:0A:DE:AF:E7:32:43:D2:88:83:57:AC:2D:65:E5:80:C4:B6:FB:AF:1A:A0:21:9F:6D:0C:AD"}],role:"auto"})},Ft.generateTransportRemoteParameters=function(){return{id:t(),iceParameters:e.deepFreeze({iceLite:!0,password:"yku5ej8nvfaor28lvtrabcx0wkrpkztz",usernameFragment:"h3hk1iz6qqlnqlne"}),iceCandidates:e.deepFreeze([{foundation:"udpcandidate",address:"9.9.9.9",ip:"9.9.9.9",port:40533,priority:1078862079,protocol:"udp",type:"host",tcpType:"passive"},{foundation:"udpcandidate",address:"9.9.9.9",ip:"9:9:9:9:9:9",port:41333,priority:1078862089,protocol:"udp",type:"host",tcpType:"passive"}]),dtlsParameters:e.deepFreeze({fingerprints:[{algorithm:"sha-256",value:"A9:F4:E0:D2:74:D3:0F:D9:CA:A5:2F:9F:7F:47:FA:F0:C4:72:DD:73:49:D0:3B:14:90:20:51:30:1B:90:8E:71"},{algorithm:"sha-384",value:"03:D9:0B:87:13:98:F6:6D:BC:FC:92:2E:39:D4:E1:97:32:61:30:56:84:70:81:6E:D1:82:97:EA:D9:C1:21:0F:6B:C5:E7:7F:E1:97:0C:17:97:6E:CF:B3:EF:2E:74:B0"},{algorithm:"sha-512",value:"84:27:A4:28:A4:73:AF:43:02:2A:44:68:FF:2F:29:5C:3B:11:9A:60:F4:A8:F0:F5:AC:A0:E3:49:3E:B1:34:53:A9:85:CE:51:9B:ED:87:5E:B8:F4:8E:3D:FA:20:51:B8:96:EE:DA:56:DC:2F:5C:62:79:15:23:E0:21:82:2B:2C"}],role:"auto"}),sctpParameters:e.deepFreeze({port:5e3,OS:2048,MIS:2048,maxMessageSize:2e6})}},Ft.generateProducerRemoteParameters=function(){return e.deepFreeze({id:t()})},Ft.generateConsumerRemoteParameters=function({id:i,codecMimeType:r}={}){switch(r){case"audio/opus":return{id:i??t(),producerId:t(),kind:"audio",rtpParameters:e.deepFreeze({codecs:[{mimeType:"audio/opus",payloadType:100,clockRate:48e3,channels:2,rtcpFeedback:[{type:"transport-cc"}],parameters:{useinbandfec:1,foo:"bar"}}],encodings:[{ssrc:46687003}],headerExtensions:[{uri:"urn:ietf:params:rtp-hdrext:sdes:mid",id:1},{uri:"http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01",id:5},{uri:"urn:ietf:params:rtp-hdrext:ssrc-audio-level",id:10}],rtcp:{cname:"wB4Ql4lrsxYLjzuN",reducedSize:!0,mux:!0}})};case"audio/ISAC":return{id:i??t(),producerId:t(),kind:"audio",rtpParameters:e.deepFreeze({codecs:[{mimeType:"audio/ISAC",payloadType:111,clockRate:16e3,channels:1,rtcpFeedback:[{type:"transport-cc"}],parameters:{}}],encodings:[{ssrc:46687004}],headerExtensions:[{uri:"urn:ietf:params:rtp-hdrext:sdes:mid",id:1},{uri:"http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01",id:5}],rtcp:{cname:"wB4Ql4lrsxYLjzuN",reducedSize:!0,mux:!0}})};case"video/VP8":return{id:i??t(),producerId:t(),kind:"video",rtpParameters:e.deepFreeze({codecs:[{mimeType:"video/VP8",payloadType:101,clockRate:9e4,rtcpFeedback:[{type:"nack"},{type:"nack",parameter:"pli"},{type:"ccm",parameter:"fir"},{type:"goog-remb"},{type:"transport-cc"}],parameters:{"x-google-start-bitrate":1500}},{mimeType:"video/rtx",payloadType:102,clockRate:9e4,rtcpFeedback:[],parameters:{apt:101}}],encodings:[{ssrc:99991111,rtx:{ssrc:99991112}}],headerExtensions:[{uri:"urn:ietf:params:rtp-hdrext:sdes:mid",id:1},{uri:"http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time",id:4},{uri:"http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01",id:5},{uri:"urn:3gpp:video-orientation",id:11},{uri:"urn:ietf:params:rtp-hdrext:toffset",id:12}],rtcp:{cname:"wB4Ql4lrsxYLjzuN",reducedSize:!0,mux:!0}})};case"video/H264":return{id:i??t(),producerId:t(),kind:"video",rtpParameters:e.deepFreeze({codecs:[{mimeType:"video/H264",payloadType:103,clockRate:9e4,rtcpFeedback:[{type:"nack"},{type:"nack",parameter:"pli"},{type:"ccm",parameter:"fir"},{type:"goog-remb"},{type:"transport-cc"}],parameters:{"level-asymmetry-allowed":1,"packetization-mode":1,"profile-level-id":"42e01f"}},{mimeType:"video/rtx",payloadType:104,clockRate:9e4,rtcpFeedback:[],parameters:{apt:103}}],encodings:[{ssrc:99991113,rtx:{ssrc:99991114}}],headerExtensions:[{uri:"urn:ietf:params:rtp-hdrext:sdes:mid",id:1},{uri:"http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time",id:4},{uri:"http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01",id:5},{uri:"urn:3gpp:video-orientation",id:11},{uri:"urn:ietf:params:rtp-hdrext:toffset",id:12}],rtcp:{cname:"wB4Ql4lrsxYLjzuN",reducedSize:!0,mux:!0}})};default:throw new TypeError(`unknown codecMimeType '${r}'`)}},Ft.generateDataProducerRemoteParameters=function(){return e.deepFreeze({id:t()})},Ft.generateDataConsumerRemoteParameters=function({id:i}={}){return{id:i??t(),dataProducerId:t(),sctpStreamParameters:e.deepFreeze({streamId:666,maxPacketLifeTime:5e3,maxRetransmits:void 0})}};const e=ie();function t(){return String(e.generateRandomNumber())}return Ft}()}(N)),N}var $t=Nt();const Ut=p("TransportManager");class Bt extends n{constructor(e){super(),this.sendTransport=null,this.recvTransport=null,this.signalDataProducer=null,this.signalDataConsumer=null,this.url="",this.hasDtlsFingerprints=!1,this.joinResponse=null,this.certificate=null,this.pendingProduceCallbacks=new Map,this.pendingProduceDataCallbacks=new Map,this.device=new $t.Device,this.signalClient=e}registerProduceCallback(e,t){this.pendingProduceCallbacks.set(e,t)}registerProduceDataCallback(e,t){this.pendingProduceDataCallbacks.set(e,t)}async generateCertificate(){try{const e=await RTCPeerConnection.generateCertificate({name:"ECDSA",namedCurve:"P-256"});this.certificate=e;const t=e.getFingerprints().map(e=>({algorithm:e.algorithm??"",value:e.value?.toUpperCase()??""}));return Ut.info(`Generated certificate with ${t.length} fingerprint(s)`),t}catch(e){return Ut.warn("Failed to generate certificate, falling back to auto-generated",e),[]}}getCertificate(){return this.certificate}setCertificate(e){this.certificate=e}getDtlsFingerprints(){return this.certificate?this.certificate.getFingerprints().map(e=>({algorithm:e.algorithm??"",value:e.value?.toUpperCase()??""})):[]}async setup(e,t,i,r){this.url=e,this.joinResponse=t,this.hasDtlsFingerprints=i,this.device.loaded||(await this.device.load({routerRtpCapabilities:t.rtpCapabilities}),Ut.info("Device loaded with RTP capabilities"));const s={};this.certificate&&(s.certificates=[this.certificate]),t.iceTransportPolicy&&(s.iceTransportPolicy=t.iceTransportPolicy),r&&Object.assign(s,r),this.sendTransport=this.device.createSendTransport({id:t.sendTransport.sid,iceParameters:t.sendTransport.iceParameters,iceCandidates:t.sendTransport.iceCandidates,dtlsParameters:t.sendTransport.dtlsParameters,sctpParameters:t.sendTransport.sctpParameters,iceServers:t.iceServers,additionalSettings:s}),Ut.info(`Send transport created: ${this.sendTransport.id}`),this.recvTransport=this.device.createRecvTransport({id:t.receiveTransport.sid,iceParameters:t.receiveTransport.iceParameters,iceCandidates:t.receiveTransport.iceCandidates,dtlsParameters:t.receiveTransport.dtlsParameters,sctpParameters:t.receiveTransport.sctpParameters,iceServers:t.iceServers,additionalSettings:s}),Ut.info(`Recv transport created: ${this.recvTransport.id}`),this.setupTransportEvents(),await this.setupSignalChannels(t)}async restartIce(e){if(this.sendTransport){const t=e[this.sendTransport.id];t&&(await this.sendTransport.restartIce({iceParameters:t}),Ut.info(`ICE restarted on send transport ${this.sendTransport.id}`))}if(this.recvTransport){const t=e[this.recvTransport.id];t&&(await this.recvTransport.restartIce({iceParameters:t}),Ut.info(`ICE restarted on recv transport ${this.recvTransport.id}`))}}async getStats(){const[e,t]=await Promise.all([this.sendTransport?.getStats(),this.recvTransport?.getStats()]);return{send:e??void 0,recv:t??void 0}}close(){(this.sendTransport||this.recvTransport)&&(this.signalDataProducer?.close(),this.signalDataConsumer?.close(),this.sendTransport?.close(),this.recvTransport?.close(),this.signalDataProducer=null,this.signalDataConsumer=null,this.sendTransport=null,this.recvTransport=null,this.emit("closed"),Ut.info("Transport manager closed"))}setupTransportEvents(){const e=[];this.sendTransport.on("connect",({dtlsParameters:t},i,r)=>{this.hasDtlsFingerprints?i():(e.push({transportSid:this.sendTransport.id,dtlsParameters:t}),this.connectTransports(e).then(()=>i()).catch(r))}),this.sendTransport.on("produce",(e,t,i)=>{const r=e.appData?.clientTrackId;if(r){const s=this.pendingProduceCallbacks.get(r);if(s)return this.pendingProduceCallbacks.delete(r),void s(e,t,i)}Ut.warn("Unhandled produce event, no matching clientTrackId callback"),i(new Error("No produce callback registered for this track"))}),this.sendTransport.on("producedata",(e,t,i)=>{if(e.label===this.joinResponse?.signal.send.label)return void t({id:this.joinResponse.signal.send.channelSid});const r=e.appData?.clientTrackId;if(r){const s=this.pendingProduceDataCallbacks.get(r);if(s)return this.pendingProduceDataCallbacks.delete(r),void s(e,t,i)}Ut.warn("Unhandled producedata event, no matching callback"),i(new Error("No producedata callback registered"))}),this.sendTransport.on("connectionstatechange",e=>{Ut.info(`Send transport connection state: ${e}`),"failed"!==e&&"disconnected"!==e||this.emit("connectionFailed","send")}),this.recvTransport.on("connect",({dtlsParameters:t},i,r)=>{this.hasDtlsFingerprints?i():(e.push({transportSid:this.recvTransport.id,dtlsParameters:t}),this.connectTransports(e).then(()=>i()).catch(r))}),this.recvTransport.on("connectionstatechange",e=>{Ut.info(`Recv transport connection state: ${e}`),"failed"!==e&&"disconnected"!==e||this.emit("connectionFailed","recv")})}async connectTransports(e){if(!this.joinResponse)return;const t={nodeId:this.signalClient.currentNodeId,participantSid:this.joinResponse.participant.sid,transports:e};await this.signalClient.connect(this.url,t,this.joinResponse.room?.name),e.length=0}async setupSignalChannels(e){this.signalDataConsumer=await this.recvTransport.consumeData({id:e.signal.receive.channelSid,dataProducerId:e.signal.receive.dataSourceSid,sctpStreamParameters:e.signal.receive.sctpStreamParameters,label:e.signal.receive.label,protocol:e.signal.receive.protocol}),Ut.info("Signal receive DataChannel established");const t={sctpStreamParameters:e.signal.send.sctpStreamParameters,label:e.signal.send.label,protocol:e.signal.send.protocol};this.signalDataProducer=await this.sendTransport.produceData(t),Ut.info("Signal send DataChannel established"),await Promise.all([this.waitForDataChannelOpen(this.signalDataProducer,"signalDataProducer"),this.waitForDataChannelOpen(this.signalDataConsumer,"signalDataConsumer")]),this.emit("signalReady",this.signalDataProducer,this.signalDataConsumer)}waitForDataChannelOpen(e,t){const i=e.readyState;if("open"===i)return Promise.resolve();if("closed"===i||"closing"===i)return Promise.reject(new Error(`${t} is already ${i}`));const r=e;return new Promise((e,i)=>{const s=setTimeout(()=>{a(),i(new Error(`${t} open timed out after ${Bt.DC_OPEN_TIMEOUT}ms`))},Bt.DC_OPEN_TIMEOUT),a=()=>{clearTimeout(s),r.off("open",n),r.off("close",o),r.off("error",c)},n=()=>{a(),e()},o=()=>{a(),i(new Error(`${t} closed before opening`))},c=e=>{a(),i(e)};r.on("open",n),r.on("close",o),r.on("error",c)})}}var zt,Vt,Ht,qt,Qt,Gt,Kt,Wt,Jt,Yt,Xt,Zt,ei,ti;Bt.DC_OPEN_TIMEOUT=1e4,e.RoomState=void 0,(zt=e.RoomState||(e.RoomState={})).Disconnected="disconnected",zt.Connecting="connecting",zt.Connected="connected",zt.Reconnecting="reconnecting",e.ConnectionQuality=void 0,(Vt=e.ConnectionQuality||(e.ConnectionQuality={})).Excellent="excellent",Vt.Good="good",Vt.Poor="poor",Vt.Lost="lost",Vt.Unknown="unknown",e.TrackKind=void 0,(Ht=e.TrackKind||(e.TrackKind={})).Audio="audio",Ht.Video="video",e.TrackSource=void 0,(qt=e.TrackSource||(e.TrackSource={})).Camera="camera",qt.Microphone="microphone",qt.ScreenShare="screen_share",qt.ScreenShareAudio="screen_share_audio",qt.Unknown="unknown",e.VideoQuality=void 0,(Qt=e.VideoQuality||(e.VideoQuality={}))[Qt.LOW=0]="LOW",Qt[Qt.MEDIUM=1]="MEDIUM",Qt[Qt.HIGH=2]="HIGH",e.AudioTrackFeature=void 0,(Gt=e.AudioTrackFeature||(e.AudioTrackFeature={})).AutoGainControl="auto_gain_control",Gt.EchoCancellation="echo_cancellation",Gt.NoiseSuppression="noise_suppression",Gt.Stereo="stereo",Gt.NoDtx="no_dtx",Gt.EnhancedNoiseCancellation="enhanced_noise_cancellation",e.StreamState=void 0,(Kt=e.StreamState||(e.StreamState={})).Active="active",Kt.Paused="paused",Kt.Unknown="unknown",e.DisconnectReason=void 0,(Wt=e.DisconnectReason||(e.DisconnectReason={}))[Wt.UnknownReason=0]="UnknownReason",Wt[Wt.ClientInitiated=1]="ClientInitiated",Wt[Wt.DuplicateIdentity=2]="DuplicateIdentity",Wt[Wt.ServerShutdown=3]="ServerShutdown",Wt[Wt.ParticipantRemoved=4]="ParticipantRemoved",Wt[Wt.RoomDeleted=5]="RoomDeleted",Wt[Wt.StateMismatch=6]="StateMismatch",Wt[Wt.JoinFailure=7]="JoinFailure",Wt[Wt.Migration=8]="Migration",Wt[Wt.SignalClose=9]="SignalClose",Wt[Wt.RoomClosed=10]="RoomClosed",Wt[Wt.UserUnavailable=11]="UserUnavailable",Wt[Wt.UserRejected=12]="UserRejected",Wt[Wt.SipTrunkFailure=13]="SipTrunkFailure",Wt[Wt.ConnectionTimeout=14]="ConnectionTimeout",Wt[Wt.MediaFailure=15]="MediaFailure",e.ParticipantState=void 0,(Jt=e.ParticipantState||(e.ParticipantState={}))[Jt.Joining=0]="Joining",Jt[Jt.Joined=1]="Joined",Jt[Jt.Suspended=2]="Suspended",Jt[Jt.Disconnected=3]="Disconnected",e.ParticipantKind=void 0,(Yt=e.ParticipantKind||(e.ParticipantKind={}))[Yt.Standard=0]="Standard",Yt[Yt.Ingress=1]="Ingress",Yt[Yt.Egress=2]="Egress",Yt[Yt.Sip=3]="Sip",Yt[Yt.Agent=4]="Agent",e.RoomEvent=void 0,(Xt=e.RoomEvent||(e.RoomEvent={})).Connected="connected",Xt.Disconnected="disconnected",Xt.Reconnecting="reconnecting",Xt.Reconnected="reconnected",Xt.ConnectionStateChanged="connectionStateChanged",Xt.SignalReconnecting="signalReconnecting",Xt.MediaDevicesChanged="mediaDevicesChanged",Xt.MediaDevicesError="mediaDevicesError",Xt.ParticipantJoined="participantJoined",Xt.ParticipantLeft="participantLeft",Xt.ParticipantUpdated="participantUpdated",Xt.ParticipantMetadataChanged="participantMetadataChanged",Xt.ParticipantNameChanged="participantNameChanged",Xt.ParticipantAttributesChanged="participantAttributesChanged",Xt.TrackPublished="trackPublished",Xt.TrackUnpublished="trackUnpublished",Xt.DataTrackPublished="dataTrackPublished",Xt.DataTrackUnpublished="dataTrackUnpublished",Xt.TrackSubscribed="trackSubscribed",Xt.TrackSubscriptionFailed="trackSubscriptionFailed",Xt.TrackUnsubscribed="trackUnsubscribed",Xt.TrackMuted="trackMuted",Xt.TrackUnmuted="trackUnmuted",Xt.LocalTrackPublished="localTrackPublished",Xt.LocalTrackUnpublished="localTrackUnpublished",Xt.LocalAudioSilenceDetected="localAudioSilenceDetected",Xt.ActiveSpeakersChanged="activeSpeakersChanged",Xt.RoomUpdated="roomUpdated",Xt.DataReceived="dataReceived",Xt.ConnectionQualityChanged="connectionQualityChanged",Xt.AudioPlaybackStatusChanged="audioPlaybackStatusChanged",Xt.ChatMessage="chatMessage",Xt.MessageDeleted="messageDeleted",Xt.StateUpdated="stateUpdated",Xt.StateDeleted="stateDeleted",Xt.TokenRefreshed="tokenRefreshed",Xt.VideoPlaybackStatusChanged="videoPlaybackStatusChanged",Xt.TrackStreamStateChanged="trackStreamStateChanged",Xt.GroupCreated="groupCreated",Xt.GroupUpdated="groupUpdated",Xt.GroupDeleted="groupDeleted",Xt.GroupParticipantJoined="groupParticipantJoined",Xt.GroupParticipantLeft="groupParticipantLeft",e.ParticipantEvent=void 0,(Zt=e.ParticipantEvent||(e.ParticipantEvent={})).TrackPublished="trackPublished",Zt.TrackUnpublished="trackUnpublished",Zt.TrackMuted="trackMuted",Zt.TrackUnmuted="trackUnmuted",Zt.TrackSubscribed="trackSubscribed",Zt.TrackUnsubscribed="trackUnsubscribed",Zt.LocalTrackPublished="localTrackPublished",Zt.LocalTrackUnpublished="localTrackUnpublished",Zt.MetadataChanged="metadataChanged",Zt.NameChanged="nameChanged",Zt.AttributesChanged="attributesChanged",Zt.IsSpeakingChanged="isSpeakingChanged",Zt.ConnectionQualityChanged="connectionQualityChanged",Zt.PermissionsChanged="permissionsChanged",Zt.TrackStreamStateChanged="trackStreamStateChanged",Zt.DataReceived="dataReceived",Zt.ChatMessage="chatMessage",e.TrackEvent=void 0,(ei=e.TrackEvent||(e.TrackEvent={})).Muted="muted",ei.Unmuted="unmuted",ei.Ended="ended",ei.Restarted="restarted",ei.Subscribed="subscribed",ei.Unsubscribed="unsubscribed",ei.ElementAttached="elementAttached",ei.ElementDetached="elementDetached",ei.AudioPlaybackStarted="audioPlaybackStarted",ei.AudioPlaybackFailed="audioPlaybackFailed",ei.VideoPlaybackStarted="videoPlaybackStarted",ei.VideoPlaybackFailed="videoPlaybackFailed",ei.VisibilityChanged="visibilityChanged",ei.VideoDimensionsChanged="videoDimensionsChanged",ei.UpstreamPaused="upstreamPaused",ei.UpstreamResumed="upstreamResumed",ei.AudioSilenceDetected="audioSilenceDetected",ei.StreamStateChanged="streamStateChanged",ei.TimeSyncUpdate="timeSyncUpdate",e.SubscriptionStatus=void 0,(ti=e.SubscriptionStatus||(e.SubscriptionStatus={})).Desired="desired",ti.Subscribed="subscribed",ti.Unsubscribed="unsubscribed";class ii{constructor(e){this.trackSid=e.trackSid,this.trackName=e.trackName,this.kind=e.kind,this.source=e.source,this.track=e.track,this.muted=e.muted,this.info=e.info,e.info&&e.info.width&&e.info.height&&(this.dimensions={width:e.info.width,height:e.info.height})}get isSubscribed(){return void 0!==this.track}get isEnabled(){return!this.muted}get isMuted(){return this.muted}get audioTrack(){if(this.kind===e.TrackKind.Audio)return this.track}get videoTrack(){if(this.kind===e.TrackKind.Video)return this.track}get isLocal(){return!1}}class ri extends n{emitParticipantEvent(e,...t){a.EventEmitter.prototype.emit.call(this,e,...t)}constructor(t,i,r,s){super(),this.isSpeaking=!1,this.audioLevel=0,this.attributes={},this.trackPublications=new Map,this.audioTrackPublications=new Map,this.videoTrackPublications=new Map,this._connectionQuality=e.ConnectionQuality.Unknown,this._kind=e.ParticipantKind.Standard,this._activeResolvers=[],this.sid=t,this.identity=i,this.name=r,this.metadata=s,this.state=e.ParticipantState.Joining}get kind(){return this._kind}get isAgent(){return this._kind===e.ParticipantKind.Agent}get isActive(){return this.state===e.ParticipantState.Joined}waitUntilActive(){return this.isActive?Promise.resolve():new Promise(e=>{this._activeResolvers.push(e)})}get connectionQuality(){return this._connectionQuality}setConnectionQuality(t){this._connectionQuality!==t&&(this._connectionQuality=t,this.emitParticipantEvent(e.ParticipantEvent.ConnectionQualityChanged,t))}setPermissions(t){const i=this.permissions,r=t.canPublish!==this.permissions?.canPublish||t.canSubscribe!==this.permissions?.canSubscribe||t.canPublishData!==this.permissions?.canPublishData||t.hidden!==this.permissions?.hidden||t.recorder!==this.permissions?.recorder||(t.canPublishSources?.length??0)!==(this.permissions?.canPublishSources?.length??0)||(t.canPublishSources??[]).some((e,t)=>e!==this.permissions?.canPublishSources?.[t]);return this.permissions=t,r&&this.emitParticipantEvent(e.ParticipantEvent.PermissionsChanged,i),r}get isCameraEnabled(){return this.isTrackEnabled("camera")}get isMicrophoneEnabled(){return this.isTrackEnabled("microphone")}get isScreenShareEnabled(){return this.isTrackEnabled("screen_share")}getTrackPublications(){return Array.from(this.trackPublications.values())}updateFromInfo(t){this.sid=t.sid,this.identity=t.identity;const i=this.isActive;if(this.state=t.state,void 0!==t.kind&&(this._kind=t.kind),void 0===t.joinedAt||this.joinedAt||(this.joinedAt=new Date(t.joinedAt)),void 0!==t.name&&t.name!==this.name&&(this.name=t.name,this.emitParticipantEvent(e.ParticipantEvent.NameChanged,this.name,this)),void 0!==t.metadata&&t.metadata!==this.metadata&&(this.metadata=t.metadata,this.emitParticipantEvent(e.ParticipantEvent.MetadataChanged,this.metadata,this)),t.permission&&this.setPermissions(t.permission),void 0!==t.groupId&&(this.groupId=t.groupId||void 0),t.attributes){const i={};for(const[e,r]of Object.entries(t.attributes))this.attributes[e]!==r&&(i[e]=r);this.attributes={...t.attributes},Object.keys(i).length>0&&this.emitParticipantEvent(e.ParticipantEvent.AttributesChanged,i,this)}if(!i&&this.isActive){for(const e of this._activeResolvers)e();this._activeResolvers=[]}}getTrackPublication(e){for(const t of this.trackPublications.values())if(t.source===e)return t}getTrackPublicationBySid(e){return this.trackPublications.get(e)}getTrackPublicationByName(e){for(const t of this.trackPublications.values())if(t.trackName===e)return t}addTrackPublicationToMaps(t){this.trackPublications.set(t.trackSid,t),t.kind===e.TrackKind.Audio?this.audioTrackPublications.set(t.trackSid,t):t.kind===e.TrackKind.Video&&this.videoTrackPublications.set(t.trackSid,t)}removeTrackPublicationFromMaps(e){const t=this.trackPublications.get(e);if(t)return this.trackPublications.delete(e),this.audioTrackPublications.delete(e),this.videoTrackPublications.delete(e),t}isTrackEnabled(e){const t=this.getTrackPublication(e);return!0===t?.isSubscribed&&t.isEnabled}}class si extends ii{constructor(e){super(e),this.producer=e.producer,this.options=e.options}get isLocal(){return!0}get isMuted(){const e=this.track;return e?e.isMuted:super.isMuted}get isUpstreamPaused(){return this.track?.isUpstreamPaused??!1}mute(){const e=this.track;e?.mute()}unmute(){const e=this.track;e?.unmute()}async pauseUpstream(){await(this.track?.pauseUpstream())}async resumeUpstream(){await(this.track?.resumeUpstream())}getTrackFeatures(){if(this.kind!==e.TrackKind.Audio||!this.track)return[];const t=this.track.mediaStreamTrack.getSettings(),i=new Set;return t.autoGainControl&&i.add(e.AudioTrackFeature.AutoGainControl),t.echoCancellation&&i.add(e.AudioTrackFeature.EchoCancellation),t.noiseSuppression&&i.add(e.AudioTrackFeature.NoiseSuppression),t.channelCount&&t.channelCount>1&&i.add(e.AudioTrackFeature.Stereo),this.options&&!this.options.dtx&&i.add(e.AudioTrackFeature.NoDtx),Array.from(i)}}const ai=new Error("request for lock canceled");var ni=function(e,t,i,r){return new(i||(i=Promise))(function(s,a){function n(e){try{c(r.next(e))}catch(e){a(e)}}function o(e){try{c(r.throw(e))}catch(e){a(e)}}function c(e){var t;e.done?s(e.value):(t=e.value,t instanceof i?t:new i(function(e){e(t)})).then(n,o)}c((r=r.apply(e,t||[])).next())})};class oi{constructor(e,t=ai){this._value=e,this._cancelError=t,this._queue=[],this._weightedWaiters=[]}acquire(e=1,t=0){if(e<=0)throw new Error(`invalid weight ${e}: must be positive`);return new Promise((i,r)=>{const s={resolve:i,reject:r,weight:e,priority:t},a=ci(this._queue,e=>t<=e.priority);-1===a&&e<=this._value?this._dispatchItem(s):this._queue.splice(a+1,0,s)})}runExclusive(e){return ni(this,arguments,void 0,function*(e,t=1,i=0){const[r,s]=yield this.acquire(t,i);try{return yield e(r)}finally{s()}})}waitForUnlock(e=1,t=0){if(e<=0)throw new Error(`invalid weight ${e}: must be positive`);return this._couldLockImmediately(e,t)?Promise.resolve():new Promise(i=>{this._weightedWaiters[e-1]||(this._weightedWaiters[e-1]=[]),function(e,t){const i=ci(e,e=>t.priority<=e.priority);e.splice(i+1,0,t)}(this._weightedWaiters[e-1],{resolve:i,priority:t})})}isLocked(){return this._value<=0}getValue(){return this._value}setValue(e){this._value=e,this._dispatchQueue()}release(e=1){if(e<=0)throw new Error(`invalid weight ${e}: must be positive`);this._value+=e,this._dispatchQueue()}cancel(){this._queue.forEach(e=>e.reject(this._cancelError)),this._queue=[]}_dispatchQueue(){for(this._drainUnlockWaiters();this._queue.length>0&&this._queue[0].weight<=this._value;)this._dispatchItem(this._queue.shift()),this._drainUnlockWaiters()}_dispatchItem(e){const t=this._value;this._value-=e.weight,e.resolve([t,this._newReleaser(e.weight)])}_newReleaser(e){let t=!1;return()=>{t||(t=!0,this.release(e))}}_drainUnlockWaiters(){if(0===this._queue.length)for(let e=this._value;e>0;e--){const t=this._weightedWaiters[e-1];t&&(t.forEach(e=>e.resolve()),this._weightedWaiters[e-1]=[])}else{const e=this._queue[0].priority;for(let t=this._value;t>0;t--){const i=this._weightedWaiters[t-1];if(!i)continue;const r=i.findIndex(t=>t.priority<=e);(-1===r?i:i.splice(0,r)).forEach(e=>e.resolve())}}}_couldLockImmediately(e,t){return(0===this._queue.length||this._queue[0].priority<t)&&e<=this._value}}function ci(e,t){for(let i=e.length-1;i>=0;i--)if(t(e[i]))return i;return-1}var di=function(e,t,i,r){return new(i||(i=Promise))(function(s,a){function n(e){try{c(r.next(e))}catch(e){a(e)}}function o(e){try{c(r.throw(e))}catch(e){a(e)}}function c(e){var t;e.done?s(e.value):(t=e.value,t instanceof i?t:new i(function(e){e(t)})).then(n,o)}c((r=r.apply(e,t||[])).next())})};class pi{constructor(e){this._semaphore=new oi(1,e)}acquire(){return di(this,arguments,void 0,function*(e=0){const[,t]=yield this._semaphore.acquire(1,e);return t})}runExclusive(e,t=0){return this._semaphore.runExclusive(()=>e(),1,t)}isLocked(){return this._semaphore.isLocked()}waitForUnlock(e=0){return this._semaphore.waitForUnlock(1,e)}release(){this._semaphore.isLocked()&&this._semaphore.release()}cancel(){return this._semaphore.cancel()}}const li=[];class hi extends n{get mediaStreamTrack(){return this._mediaStreamTrack}constructor(t,i=e.TrackSource.Unknown,r){super(),this._isMuted=!1,this._streamState=e.StreamState.Active,this.attachedElements=[],this._currentBitrate=0,this.kind=t,this.source=i,this._mediaStreamTrack=r,r.addEventListener("ended",()=>{this.emit(e.TrackEvent.Ended,this)})}get currentBitrate(){return this._currentBitrate}get isMuted(){return this._isMuted}get streamState(){return this._streamState}setStreamState(t){this._streamState!==t&&(this._streamState=t,this.emit(e.TrackEvent.StreamStateChanged,this,t))}stopMonitor(){this.monitorInterval&&(clearInterval(this.monitorInterval),this.monitorInterval=void 0)}attach(t){if(!t){if(this.kind===e.TrackKind.Audio){const e=li.find(e=>null===e.parentElement);e&&(li.splice(li.indexOf(e),1),t=e)}t||(t=document.createElement(this.kind===e.TrackKind.Audio?"audio":"video")),t.autoplay=!0,this.kind===e.TrackKind.Video&&(t.playsInline=!0)}this.attachedElements.includes(t)||this.attachedElements.push(t);const i=new MediaStream([this.mediaStreamTrack]);t.muted=0===i.getAudioTracks().length,t.srcObject=i,this.emit(e.TrackEvent.ElementAttached,t);const r=i.getAudioTracks().length>0;return t.play().then(()=>{this.emit(r?e.TrackEvent.AudioPlaybackStarted:e.TrackEvent.VideoPlaybackStarted)}).catch(s=>{"NotAllowedError"===s.name&&this.emit(r?e.TrackEvent.AudioPlaybackFailed:e.TrackEvent.VideoPlaybackFailed,s),r&&t&&i.getVideoTracks().length>0&&"NotAllowedError"===s.name&&(t.muted=!0,t.play().catch(()=>{}))}),t}detach(e){if(e)return this.detachElement(e),[e];const t=[...this.attachedElements];for(const e of t)this.detachElement(e);return t}detachElement(t){t.srcObject=null;const i=this.attachedElements.indexOf(t);i>=0&&this.attachedElements.splice(i,1),this.recycleElement(t),this.emit(e.TrackEvent.ElementDetached,t)}recycleElement(e){e instanceof HTMLAudioElement&&(e.pause(),(0===li.length||li.every(e=>null!==e.parentElement))&&li.push(e))}stop(){this.stopMonitor(),this.detach()}}function ui(){return"undefined"!=typeof document}function mi(){return!!ui()&&(navigator.userAgentData?.mobile??/Tablet|iPad|Mobile|Android|BlackBerry/.test(navigator.userAgent))}function fi(){return"undefined"!=typeof navigator&&navigator.userAgent.includes("Firefox/")}function gi(){return"Safari"===Si()?.name}function vi(){const e=Si();return"Safari"===e?.name||"iOS"===e?.os}function bi(){return!gi()&&!fi()&&ki("video/AV1")}function _i(){if(fi())return!1;const e=Si();if("iOS"===e.os){if(!e.osVersion||yi(e.osVersion,"16")<0)return!1}else if("Safari"===e.name&&(!e.version||yi(e.version,"16")<0))return!1;return ki("video/VP9")}function yi(e,t){const i=e.split(".").map(Number),r=t.split(".").map(Number),s=Math.max(i.length,r.length);for(let e=0;e<s;e++){const t=i[e]??0,s=r[e]??0;if(t!==s)return t-s}return 0}function Si(){if("undefined"==typeof navigator)return{name:"unknown",version:"",supportsInsertableStreams:!1,supportsTransceiver:!1};const e=navigator.userAgent;let t,i,r="unknown",s="";if(/iPad|iPhone|iPod/.test(e)||e.includes("Macintosh")&&"ontouchend"in document){t="iOS";const r=e.match(/OS (\d+[_.\d]*)/);r&&(i=r[1].replace(/_/g,"."))}else if(e.includes("Android")){t="Android";const r=e.match(/Android ([\d.]+)/);r&&(i=r[1])}else if(e.includes("Mac OS X")){t="macOS";const r=e.match(/Mac OS X ([\d_]+)/);r&&(i=r[1].replace(/_/g,"."))}else e.includes("Windows")?t="Windows":e.includes("Linux")&&(t="Linux");if(/firefox|fxios/i.test(e)){r="Firefox";const t=e.match(/(?:Firefox|FxiOS)\/([\d.]+)/);s=t?.[1]??""}else if(/chrom|crios|crmo/i.test(e)){r="Chrome";const t=e.match(/(?:Chrome|CriOS|Chromium)\/([\d.]+)/);s=t?.[1]??""}else if(/safari|applewebkit/i.test(e)){r="Safari";const t=e.match(/Version\/([\d.]+)/);s=t?.[1]??""}return{name:r,version:s,os:t,osVersion:i,supportsInsertableStreams:"function"==typeof RTCRtpSender.prototype.createEncodedStreams||void 0!==window.RTCRtpScriptTransform,supportsTransceiver:"function"==typeof RTCPeerConnection.prototype.addTransceiver}}function wi(e){const t=e.toLowerCase();return t.includes("front")||t.includes("user")||t.includes("facetime")?"user":t.includes("back")||t.includes("rear")||t.includes("environment")?"environment":void 0}function ki(e){if("undefined"==typeof RTCRtpSender)return!1;if("function"!=typeof RTCRtpSender.getCapabilities)return!1;const t=RTCRtpSender.getCapabilities("video");return!!t&&t.codecs.some(t=>t.mimeType.toLowerCase()===e.toLowerCase())}const Ti=p("LocalTrack");class Ci extends hi{constructor(t,i,r,s,a=!1){super(t,r??e.TrackSource.Unknown,i),this._isUpstreamPaused=!1,this._providedByUser=!1,this._prevBytesSent=0,this._prevStatsTime=0,this._handleVisibilityChange=this.onVisibilityChange.bind(this),this.trackChangeLock=new pi,this.pauseUpstreamLock=new pi,this.onMediaTrackMute=()=>{this._mediaTrackMuteDebounce&&clearTimeout(this._mediaTrackMuteDebounce),this._mediaTrackMuteDebounce=setTimeout(()=>{this.mediaStreamTrack.muted&&(Ti.debug(`MediaStreamTrack muted by system for ${this.sid??"unknown"}`),this.pauseUpstream().catch(()=>{}))},200)},this.onMediaTrackUnmute=()=>{this._mediaTrackMuteDebounce&&(clearTimeout(this._mediaTrackMuteDebounce),this._mediaTrackMuteDebounce=void 0),this._isUpstreamPaused&&(Ti.debug(`MediaStreamTrack unmuted by system for ${this.sid??"unknown"}`),this.resumeUpstream().catch(()=>{}))},this._constraints=s,this._providedByUser=a,this.attachMediaTrackListeners(i)}get mediaStreamTrack(){return this._processor?.processedTrack??this._mediaStreamTrack}get isLocal(){return!0}get id(){return this._mediaStreamTrack.id}get constraints(){return this._constraints}get dimensions(){if(this.kind!==e.TrackKind.Video)return;const{width:t,height:i}=this.mediaStreamTrack.getSettings();return t&&i?{width:t,height:i}:void 0}get isUpstreamPaused(){return this._isUpstreamPaused}get isUserProvided(){return this._providedByUser}get producer(){return this._producer}set producer(e){this._producer=e}getProcessor(){return this._processor}getSourceTrackSettings(){return this._mediaStreamTrack.getSettings()}async setProcessor(e,t=!0){const i=await this.trackChangeLock.acquire();try{if(this._processor&&(await this._processor.destroy(),this._processor=void 0),!e)return this.destroyProcessorElement(),this._producer&&await this._producer.replaceTrack({track:this._mediaStreamTrack}),void this.reattachElementsToTrack(this._mediaStreamTrack);this.ensureProcessorElement();const i={kind:this.kind,track:this._mediaStreamTrack,element:this.processorElement};await e.init(i),this._processor=e;const r=e.processedTrack??this._mediaStreamTrack;t&&this.reattachElementsToTrack(r),this._producer&&await this._producer.replaceTrack({track:r})}finally{i()}}async stopProcessor(){const e=await this.trackChangeLock.acquire();try{if(!this._processor)return;this._processor.processedTrack?.stop(),await this._processor.destroy(),this._processor=void 0,this.destroyProcessorElement(),this._producer&&await this._producer.replaceTrack({track:this._mediaStreamTrack}),this.reattachElementsToTrack(this._mediaStreamTrack)}finally{e()}}mute(){this.setTrackMuted(!0)}unmute(){this.setTrackMuted(!1)}async pauseUpstream(){const t=await this.pauseUpstreamLock.acquire();try{if(this._isUpstreamPaused)return;if(!this._producer)return void Ti.warn("Cannot pause upstream for an unpublished track");this._isUpstreamPaused=!0,await this._producer.replaceTrack({track:null}),this.emit(e.TrackEvent.UpstreamPaused,this)}finally{t()}}async resumeUpstream(){const t=await this.pauseUpstreamLock.acquire();try{if(!this._isUpstreamPaused)return;if(!this._producer)return void Ti.warn("Cannot resume upstream for an unpublished track");this._isUpstreamPaused=!1;const t=this._processor?.processedTrack??this.mediaStreamTrack;await this._producer.replaceTrack({track:t}),this.emit(e.TrackEvent.UpstreamResumed,this)}finally{t()}}async getRTCStatsReport(){if(this._producer)return this._producer.getStats()}async getDeviceId(){if(this.source!==e.TrackSource.ScreenShare)return this.mediaStreamTrack.getSettings().deviceId}async waitForDimensions(t=1e3){if(this.kind===e.TrackKind.Audio)throw new Error("Cannot get dimensions for audio tracks");"iOS"===Si()?.os&&await new Promise(e=>setTimeout(e,10));const i=Date.now();for(;Date.now()-i<t;){const e=this.dimensions;if(e)return e;await new Promise(e=>setTimeout(e,50))}throw new Error("Unable to get track dimensions after timeout")}startMonitor(){this.monitorInterval||(this._prevBytesSent=0,this._prevStatsTime=0,this.monitorInterval=setInterval(()=>this.monitorSender(),2e3))}async restart(t){const i=await this.trackChangeLock.acquire();try{t&&(this._constraints=t);const i=this.kind===e.TrackKind.Audio?"audio":"video";"audio"===i&&vi()&&this._mediaStreamTrack?.stop();const r=await navigator.mediaDevices.getUserMedia({[i]:this._constraints??!0}),s="audio"===i?r.getAudioTracks()[0]:r.getVideoTracks()[0];if(!s)throw new Error("Failed to get new media track");await this.replaceTrackInternal(s),Ti.info(`Track ${this.sid??"unknown"} restarted`),this.emit(e.TrackEvent.Restarted,this)}finally{i()}}async replaceTrack(e){const t=await this.trackChangeLock.acquire();try{await this.replaceTrackInternal(e)}finally{t()}}async replaceTrackInternal(e){this.detachMediaTrackListeners(this._mediaStreamTrack);const t=this._mediaStreamTrack;this._mediaStreamTrack=e,this.attachMediaTrackListeners(e),this.processorElement&&this.attachTrackToProcessorElement(e);let i=e;this._processor&&(await this._processor.restart({kind:this.kind,track:e,element:this.processorElement}),this._processor.processedTrack&&(i=this._processor.processedTrack)),this._producer&&await this._producer.replaceTrack({track:i});const r=this._processor?.processedTrack??e;this.reattachElementsToTrack(r),this._providedByUser||t?.stop()}stop(){this.detachMediaTrackListeners(this._mediaStreamTrack),this.removeVisibilityListener(),this._mediaTrackMuteDebounce&&(clearTimeout(this._mediaTrackMuteDebounce),this._mediaTrackMuteDebounce=void 0),this._processor&&(this._processor.destroy().catch(()=>{}),this._processor=void 0),this.destroyProcessorElement(),this._mediaStreamTrack?.stop(),super.stop(),Ti.debug(`Track ${this.sid??"unknown"} stopped`)}setTrackMuted(t){this._isMuted!==t&&(this._isMuted=t,this._mediaStreamTrack.enabled=!t,this._producer&&(t?this._producer.pause():this._producer.resume()),this.emit(t?e.TrackEvent.Muted:e.TrackEvent.Unmuted,this))}async monitorSender(){if(this._producer)try{const e=await this._producer.getStats();let t=0;e.forEach(e=>{"outbound-rtp"===e.type&&(t+=e.bytesSent??0)});const i=Date.now();if(this._prevStatsTime>0&&t>this._prevBytesSent){const e=(i-this._prevStatsTime)/1e3;this._currentBitrate=8*(t-this._prevBytesSent)/e}this._prevBytesSent=t,this._prevStatsTime=i}catch{}}attachMediaTrackListeners(e){e.addEventListener("mute",this.onMediaTrackMute),e.addEventListener("unmute",this.onMediaTrackUnmute)}detachMediaTrackListeners(e){e.removeEventListener("mute",this.onMediaTrackMute),e.removeEventListener("unmute",this.onMediaTrackUnmute)}addVisibilityListener(){ui()&&mi()&&document.addEventListener("visibilitychange",this._handleVisibilityChange)}removeVisibilityListener(){ui()&&document.removeEventListener("visibilitychange",this._handleVisibilityChange)}async onVisibilityChange(){if("visible"===document.visibilityState&&"ended"===this._mediaStreamTrack.readyState&&!this._providedByUser){Ti.info(`Track ${this.sid??"unknown"} ended while in background, restarting`);try{await this.restart()}catch(e){Ti.warn("Failed to restart track after visibility change",e)}}}ensureProcessorElement(){if(this.processorElement)return void this.attachTrackToProcessorElement(this._mediaStreamTrack);const t=document.createElement(this.kind===e.TrackKind.Audio?"audio":"video");t.muted=!0,t.autoplay=!0,t instanceof HTMLVideoElement&&(t.playsInline=!0),t.style.width="0",t.style.height="0",t.style.position="absolute",t.style.opacity="0",this.attachTrackToProcessorElement(this._mediaStreamTrack,t),t.play().catch(()=>{}),this.processorElement=t}attachTrackToProcessorElement(e,t){const i=t??this.processorElement;i&&(i.srcObject=new MediaStream([e]))}destroyProcessorElement(){this.processorElement&&(this.processorElement.srcObject=null,this.processorElement.remove(),this.processorElement=void 0)}reattachElementsToTrack(e){for(const t of this.attachedElements)t.srcObject=new MediaStream([e])}}const Pi=p("LocalAudioTrack");class Ri extends Ci{constructor(t,i){super(e.TrackKind.Audio,t,e.TrackSource.Microphone,i),this.stopOnMute=!1,this.muteLock=new pi}async mute(){const e=await this.muteLock.acquire();try{if(this.isMuted)return;this.stopOnMute&&!this.isUserProvided&&this._mediaStreamTrack.stop(),super.mute()}finally{e()}}async unmute(){const e=await this.muteLock.acquire();try{if(!this.isMuted)return;this.pendingRestartConstraints?(Pi.debug("applying pending device change on unmute"),await this.restart(this.pendingRestartConstraints),this.pendingRestartConstraints=void 0):!this.stopOnMute&&"ended"!==this._mediaStreamTrack.readyState||this.isUserProvided||await this.restart(),super.unmute()}finally{e()}}async setDeviceId(e){const t={...this.constraints??{},deviceId:{exact:e}};if(this.isMuted)return Pi.debug("track is muted, deferring device change to unmute"),void(this.pendingRestartConstraints=t);await this.restart(t)}}class Ei{constructor(e,t,i,r,s){if("object"==typeof e)this.width=e.width,this.height=e.height,this.aspectRatio=e.aspectRatio,this.encoding={maxBitrate:e.maxBitrate,maxFramerate:e.maxFramerate,priority:e.priority};else{if(void 0===t||void 0===i)throw new TypeError("Unsupported options: provide at least width, height and maxBitrate");this.width=e,this.height=t,this.aspectRatio=e/t,this.encoding={maxBitrate:i,maxFramerate:r,priority:s}}}get resolution(){return{width:this.width,height:this.height,frameRate:this.encoding.maxFramerate,aspectRatio:this.aspectRatio}}}const Di=["vp8","h264"];function xi(e){return Di.includes(e)}var Ii;e.BackupCodecPolicy=void 0,(Ii=e.BackupCodecPolicy||(e.BackupCodecPolicy={}))[Ii.PREFER_REGRESSION=0]="PREFER_REGRESSION",Ii[Ii.SIMULCAST=1]="SIMULCAST",Ii[Ii.REGRESSION=2]="REGRESSION";const Mi={resolution:{width:1280,height:720},frameRate:30},Li={echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0},Oi={maxBitrate:17e5,maxFramerate:30},Ai={h90:new Ei(160,90,9e4,20),h180:new Ei(320,180,16e4,20),h216:new Ei(384,216,18e4,20),h360:new Ei(640,360,45e4,20),h540:new Ei(960,540,8e5,25),h720:new Ei(1280,720,17e5,30),h1080:new Ei(1920,1080,3e6,30),h1440:new Ei(2560,1440,5e6,30),h2160:new Ei(3840,2160,8e6,30)},ji={h120:new Ei(160,120,7e4,20),h180:new Ei(240,180,125e3,20),h240:new Ei(320,240,14e4,20),h360:new Ei(480,360,33e4,20),h480:new Ei(640,480,5e5,20),h540:new Ei(720,540,6e5,25),h720:new Ei(960,720,13e5,30),h1080:new Ei(1440,1080,23e5,30),h1440:new Ei(1920,1440,38e5,30)},Fi={h360fps3:new Ei(640,360,2e5,3,"medium"),h360fps15:new Ei(640,360,4e5,15,"medium"),h720fps5:new Ei(1280,720,8e5,5,"medium"),h720fps15:new Ei(1280,720,15e5,15,"medium"),h720fps30:new Ei(1280,720,2e6,30,"medium"),h1080fps15:new Ei(1920,1080,25e5,15,"medium"),h1080fps30:new Ei(1920,1080,5e6,30,"medium"),original:new Ei(0,0,7e6,30,"medium")},Ni={h180:Ai.h180.encoding,h360:Ai.h360.encoding,h720:Ai.h720.encoding,h1080:Ai.h1080.encoding},$i=p("LocalVideoTrack"),Ui={[e.VideoQuality.LOW]:"q",[e.VideoQuality.MEDIUM]:"h",[e.VideoQuality.HIGH]:"f"};class Bi extends Ci{constructor(t,i=e.TrackSource.Camera,r){super(e.TrackKind.Video,t,i,r),this.simulcast=!1,this.senderLock=new pi}get dimensions(){const e=this.mediaStreamTrack?.getSettings();if(e?.width&&e?.height)return{width:e.width,height:e.height}}setSimulcast(e){this.simulcast=e}setEncoding(e){this.encoding=e}getSimulcastEncodings(){if(!this.simulcast){const e=this.encoding??Oi;return[{maxBitrate:e.maxBitrate,maxFramerate:e.maxFramerate}]}return[{rid:"q",maxBitrate:Ni.h180.maxBitrate,maxFramerate:Ni.h180.maxFramerate,scaleResolutionDownBy:4},{rid:"h",maxBitrate:Ni.h360.maxBitrate,maxFramerate:Ni.h360.maxFramerate,scaleResolutionDownBy:2},{rid:"f",maxBitrate:(this.encoding??Ni.h720).maxBitrate,maxFramerate:(this.encoding??Ni.h720).maxFramerate}]}async setDynacastQuality(e){const t=await this.senderLock.acquire();try{const t=this.producer?.rtpSender;if(!t)return;const i=t.getParameters();if(!i.encodings||0===i.encodings.length)return;let r=!1;if(i.encodings.length>1){const t=this.getSimulcastEncodings();for(const s of e){const e=Ui[s.quality],a=i.encodings.find(t=>t.rid===e);if(a&&((a.active??!0)!==s.enabled&&(a.active=s.enabled,r=!0),fi()))if(s.enabled){const i=t.find(t=>t.rid===e);i&&(a.scaleResolutionDownBy=i.scaleResolutionDownBy,a.maxBitrate=i.maxBitrate,a.maxFramerate=i.maxFramerate)}else a.scaleResolutionDownBy=4,a.maxBitrate=10,a.maxFramerate=2}}else{const t=e.some(e=>e.enabled);(i.encodings[0].active??!0)!==t&&(i.encodings[0].active=t,r=!0)}if(r){await t.setParameters(i);const r=e.map(e=>`${e.quality}=${e.enabled}`).join(",");$i.info(`Dynacast quality updated for ${this.sid??"unknown"}: [${r}]`)}}finally{t()}}async setDegradationPreference(e){const t=await this.senderLock.acquire();try{const t=this.producer?.rtpSender;if(!t)return;const i=t.getParameters();i.degradationPreference!==e&&(i.degradationPreference=e,await t.setParameters(i))}finally{t()}}async setDeviceId(e){await this.restart({...this.constraints??{},deviceId:{exact:e}})}}const zi=p("create");function Vi(e){return!0===e&&(e=Li),{echoCancellation:e.echoCancellation,noiseSuppression:e.noiseSuppression,autoGainControl:e.autoGainControl,deviceId:e.deviceId,channelCount:e.channelCount,sampleRate:e.sampleRate,sampleSize:e.sampleSize}}function Hi(e){return!0===e&&(e=Mi),{width:e.resolution?.width,height:e.resolution?.height,frameRate:e.frameRate,facingMode:e.facingMode,deviceId:e.deviceId}}async function qi(t={audio:!0,video:!0}){const i={};t.audio&&(i.audio=Vi(t.audio)),t.video&&(i.video=Hi(t.video));const r=await navigator.mediaDevices.getUserMedia(i),s=[];for(const e of r.getAudioTracks())s.push(new Ri(e,i.audio));for(const t of r.getVideoTracks())s.push(new Bi(t,e.TrackSource.Camera,i.video));return s}async function Qi(e){const t=Vi(e??Li),i=(await navigator.mediaDevices.getUserMedia({audio:t})).getAudioTracks()[0];return new Ri(i,t)}async function Gi(t){const i=Hi(t??Mi),r=(await navigator.mediaDevices.getUserMedia({video:i})).getVideoTracks()[0];return new Bi(r,e.TrackSource.Camera,i)}async function Ki(t){const i=function(){const e=Si();return!!("iOS"===e.os&&e.osVersion&&yi(e.osVersion,"17")>=0)||!!("Safari"===e.name&&e.version&&yi(e.version,"17")>=0)}(),r={};t?.video&&"object"==typeof t.video&&Object.assign(r,t.video),i?t?.resolution&&zi.debug("skipping resolution constraints for Safari 17+ screen share"):(t?.resolution?.width&&(r.width=t.resolution.width),t?.resolution?.height&&(r.height=t.resolution.height)),t?.frameRate&&(r.frameRate=t.frameRate);const s={video:!0!==t?.video&&t?.video?r:!(Object.keys(r).length>0)||r,audio:!!t?.audio&&("boolean"==typeof t.audio||Vi(t.audio))};t?.selfBrowserSurface&&(s.selfBrowserSurface=t.selfBrowserSurface),t?.surfaceSwitching&&(s.surfaceSwitching=t.surfaceSwitching),t?.systemAudio&&(s.systemAudio=t.systemAudio),void 0!==t?.preferCurrentTab&&(s.preferCurrentTab=t.preferCurrentTab),t?.controller&&(s.controller=t.controller),void 0!==t?.suppressLocalAudioPlayback&&(s.suppressLocalAudioPlayback=t.suppressLocalAudioPlayback);const a=await navigator.mediaDevices.getDisplayMedia(s),n=[];for(const i of a.getVideoTracks())t?.contentHint&&"contentHint"in i&&(i.contentHint=t.contentHint),n.push(new Bi(i,e.TrackSource.ScreenShare));for(const t of a.getAudioTracks()){const i=new Ri(t);i.source=e.TrackSource.ScreenShareAudio,n.push(i)}return n}const Wi=p("publishUtils"),Ji=["q","h","f"],Yi=Object.values(Ai),Xi=Object.values(ji),Zi=Object.values(Fi),er=[Ai.h180,Ai.h360],tr=[ji.h180,ji.h360];function ir(e){return"av1"===e||"vp9"===e}function rr(e,t,i,r){const s=function(e,t,i){if(e)return Zi;const r=t>i?t/i:i/t;return Math.abs(r-16/9)<Math.abs(r-4/3)?Yi:Xi}(e,t,i);let{encoding:a}=s[0];const n=Math.max(t,i);for(let e=0;e<s.length;e+=1){const t=s[e];if(a=t.encoding,t.width>=n)break}if(r)switch(r){case"av1":case"h265":a={...a},a.maxBitrate=.7*a.maxBitrate;break;case"vp9":a={...a},a.maxBitrate=.85*a.maxBitrate}return a}function sr(e,t){if(e)return[{scaleResolutionDownBy:2,fps:(i=t).encoding.maxFramerate}].map(e=>new Ei(Math.floor(i.width/e.scaleResolutionDownBy),Math.floor(i.height/e.scaleResolutionDownBy),Math.max(15e4,Math.floor(i.encoding.maxBitrate/(e.scaleResolutionDownBy**2*((i.encoding.maxFramerate??30)/(e.fps??30))))),e.fps,i.encoding.priority));var i;const{width:r,height:s}=t,a=r>s?r/s:s/r;return Math.abs(a-16/9)<Math.abs(a-4/3)?er:tr}function ar(e,t){const i=Math.min(t.width,t.height);return i<=0?1:Math.max(1,Math.ceil(e/i))}function nr(e){if(e)return e.sort((e,t)=>{const{encoding:i}=e,{encoding:r}=t;return i.maxBitrate>r.maxBitrate?1:i.maxBitrate<r.maxBitrate?-1:i.maxBitrate===r.maxBitrate&&i.maxFramerate&&r.maxFramerate?i.maxFramerate>r.maxFramerate?1:-1:0})}function or(e,t,i,r){const s=[];return i.forEach((i,a)=>{if(a>=Ji.length)return;const n=Math.min(e,t),o={rid:Ji[a],scaleResolutionDownBy:ar(n,i),maxBitrate:i.encoding.maxBitrate},c=r&&i.encoding.maxFramerate?Math.min(r,i.encoding.maxFramerate):i.encoding.maxFramerate;c&&(o.maxFramerate=c);const d=fi()||0===a;i.encoding.priority&&d&&(o.priority=i.encoding.priority,o.networkPriority=i.encoding.priority),s.push(o)}),s}function cr(e,t,i,r){let s=e?r?.screenShareEncoding:r?.videoEncoding;const a=r?.simulcast,n=r?.scalabilityMode,o=r?.videoCodec;if(!s&&!a&&!n||!t||!i)return[{}];s||(s=rr(e,t,i,o),Wi.debug("using video encoding",s));const c=s.maxFramerate,d=new Ei(t,i,s.maxBitrate,s.maxFramerate,s.priority);if(n&&ir(o)){const e=function(e){const t=e.match(/^L(\d)T(\d)(h|_KEY|_KEY_SHIFT)?$/);if(!t)throw new Error(`invalid scalability mode: ${e}`);return{spatial:parseInt(t[1]),temporal:parseInt(t[2]),suffix:t[3]}}(n),t=[];if(e.spatial>3)throw new Error(`unsupported scalabilityMode: ${n}`);const i=Si();if(vi()||"Chrome"===i.name&&yi(i.version,"113")<0){const r="h"===e.suffix?2:3,a=function(e){const t=e??Si();return!!("iOS"===t.os&&t.osVersion&&yi(t.osVersion,"18.4")>=0)||!!("Safari"===t.name&&t.version&&yi(t.version,"18.4")>=0)}(i);for(let i=0;i<e.spatial;i+=1)t.push({rid:Ji[2-i],maxBitrate:s.maxBitrate/r**i,maxFramerate:d.encoding.maxFramerate,scaleResolutionDownBy:a?2**i:void 0});t[0].scalabilityMode=n}else t.push({maxBitrate:s.maxBitrate,maxFramerate:d.encoding.maxFramerate,scalabilityMode:n});return d.encoding.priority&&(t[0].priority=d.encoding.priority,t[0].networkPriority=d.encoding.priority),Wi.debug("using svc encoding",{encodings:t}),t}if(!a)return[s];let p,l=[];if(l=e?nr(r?.screenShareSimulcastLayers)??sr(e,d):nr(r?.videoSimulcastLayers)??sr(e,d),l.length>0){const e=l[0];l.length>1&&([,p]=l);const r=Math.max(t,i);if(r>=960&&p)return or(t,i,[e,p,d],c);if(r>=480)return or(t,i,[e,d],c)}return or(t,i,[d])}function dr(t,i){if(t===e.TrackSource.ScreenShare)return"maintain-resolution";if(i?.height){const e="string"==typeof(r=i.height)||"number"==typeof r?r:Array.isArray(r)?r[0]:"object"==typeof r?r.exact??r.ideal??r.min??r.max??0:r;if("number"==typeof e&&e>=1080)return"maintain-resolution"}var r;return"balanced"}const pr=p("DataStream"),lr="__stream",hr=15e3;function ur(e,t,i){const r=(new TextEncoder).encode(t),s=new ArrayBuffer(3+r.byteLength+i.byteLength),a=new DataView(s),n=new Uint8Array(s);return a.setUint8(0,e),a.setUint16(1,r.byteLength,!1),n.set(r,3),n.set(i,3+r.byteLength),s}class mr{constructor(e,t){this.info=e,this.stream=t}[Symbol.asyncIterator](){const e=this.stream.getReader();return{async next(){const{done:t,value:i}=await e.read();return t?{done:!0,value:void 0}:{done:!1,value:i}},return:async()=>(e.releaseLock(),{done:!0,value:void 0})}}async readAll(){const e=[];for await(const t of this)e.push(t);return e.join("")}}class fr{constructor(e,t){this.info=e,this.stream=t}[Symbol.asyncIterator](){const e=this.stream.getReader();return{async next(){const{done:t,value:i}=await e.read();return t?{done:!0,value:void 0}:{done:!1,value:i}},return:async()=>(e.releaseLock(),{done:!0,value:void 0})}}async readAll(){const e=[];let t=0;for await(const i of this)e.push(i),t+=i.byteLength;const i=new Uint8Array(t);let r=0;for(const t of e)i.set(t,r),r+=t.byteLength;return i}}class gr{constructor(e,t,i){this.closed=!1,this.info=e,this.dataProducer=t,this.streamId=i}async write(e){if(this.closed)throw new Error("Stream is closed");const t=new TextEncoder,i=yr(e,hr);for(const e of i){const i=ur(2,this.streamId,t.encode(e));this.dataProducer.send(i)}}async close(){if(this.closed)return;this.closed=!0;const e=ur(3,this.streamId,new Uint8Array(0));this.dataProducer.send(e)}}class vr{constructor(e,t,i){this.closed=!1,this.info=e,this.dataProducer=t,this.streamId=i}async write(e){if(this.closed)throw new Error("Stream is closed");for(let t=0;t<e.byteLength;t+=hr){const i=Math.min(t+hr,e.byteLength),r=e.subarray(t,i),s=ur(2,this.streamId,r);this.dataProducer.send(s)}}async close(){if(this.closed)return;this.closed=!0;const e=ur(3,this.streamId,new Uint8Array(0));this.dataProducer.send(e)}}class br{constructor(e,t){this.rpc=e,this.transportManager=t}async ensureDataProducer(){if(this.dataProducer&&!this.dataProducer.closed)return this.dataProducer;if(this.dataProducerPromise)return this.dataProducerPromise;this.dataProducerPromise=this.createDataProducer();try{return this.dataProducer=await this.dataProducerPromise,this.dataProducer}finally{this.dataProducerPromise=void 0}}async createDataProducer(){const e=this.transportManager.sendTransport;if(!e)throw new Error("Send transport not available");const t=y(),i=new Promise((i,r)=>{this.transportManager.registerProduceDataCallback(t,async(s,a,n)=>{try{const r={clientTrackId:t,transportSid:e.id,sctpStreamParameters:s.sctpStreamParameters,name:lr,label:s.label??lr,protocol:s.protocol??""},n=await this.rpc.request("dataTrack.publish",r);a({id:n.dataTrackSid}),i(n.dataTrackSid)}catch(e){n(e instanceof Error?e:new Error(String(e))),r(e)}})}),r=await e.produceData({ordered:!0,label:lr,protocol:"",appData:{clientTrackId:t}});return await i,pr.info("Stream DataProducer created"),r}async sendText(e,t){const i=await this.ensureDataProducer(),r=crypto.randomUUID(),s=new TextEncoder,a=s.encode(e),n=JSON.stringify({topic:t?.topic??"",streamType:"text",mimeType:"text/plain",totalSize:a.byteLength,timestamp:Date.now(),attributes:t?.attributes,destinationIdentities:t?.destinationIdentities});i.send(ur(1,r,s.encode(n)));const o=yr(e,hr);for(let e=0;e<o.length;e++)i.send(ur(2,r,s.encode(o[e]))),t?.onProgress?.((e+1)/o.length);return i.send(ur(3,r,new Uint8Array(0))),{id:r}}async streamText(e){const t=await this.ensureDataProducer(),i=crypto.randomUUID(),r=new TextEncoder,s={id:i,mimeType:"text/plain",topic:e?.topic??"",timestamp:Date.now(),size:e?.totalSize,attributes:e?.attributes},a=JSON.stringify({topic:e?.topic??"",streamType:"text",mimeType:"text/plain",totalSize:e?.totalSize,timestamp:s.timestamp,attributes:e?.attributes,destinationIdentities:e?.destinationIdentities});return t.send(ur(1,i,r.encode(a))),new gr(s,t,i)}async sendFile(e,t){const i=await this.ensureDataProducer(),r=crypto.randomUUID(),s=new TextEncoder,a=t?.mimeType??(e.type||"application/octet-stream"),n=JSON.stringify({topic:t?.topic??"",streamType:"byte",mimeType:a,name:e.name,totalSize:e.size,timestamp:Date.now(),destinationIdentities:t?.destinationIdentities});i.send(ur(1,r,s.encode(n)));const o=await e.arrayBuffer(),c=new Uint8Array(o),d=Math.ceil(c.byteLength/hr)||1;for(let e=0;e<d;e++){const s=e*hr,a=Math.min(s+hr,c.byteLength);i.send(ur(2,r,c.subarray(s,a))),t?.onProgress?.((e+1)/d)}return i.send(ur(3,r,new Uint8Array(0))),{id:r}}async streamBytes(e){const t=await this.ensureDataProducer(),i=crypto.randomUUID(),r=new TextEncoder,s={id:i,mimeType:e?.mimeType??"application/octet-stream",topic:e?.topic??"",timestamp:Date.now(),size:e?.totalSize,name:e?.name??"",attributes:e?.attributes},a=JSON.stringify({topic:e?.topic??"",streamType:"byte",mimeType:s.mimeType,name:e?.name,totalSize:e?.totalSize,timestamp:s.timestamp,attributes:e?.attributes,destinationIdentities:e?.destinationIdentities});return t.send(ur(1,i,r.encode(a))),new vr(s,t,i)}close(){this.dataProducer?.close(),this.dataProducer=void 0}}class _r{constructor(){this.textHandlers=new Map,this.byteHandlers=new Map,this.activeStreams=new Map,this.localIdentity=""}setLocalIdentity(e){this.localIdentity=e}registerTextStreamHandler(e,t){this.textHandlers.set(e,t)}unregisterTextStreamHandler(e){this.textHandlers.delete(e)}registerByteStreamHandler(e,t){this.byteHandlers.set(e,t)}unregisterByteStreamHandler(e){this.byteHandlers.delete(e)}handleMessage(e,t,i){let r;try{r=function(e){const t=new DataView(e),i=new Uint8Array(e),r=t.getUint8(0),s=t.getUint16(1,!1);return{type:r,streamId:(new TextDecoder).decode(i.subarray(3,3+s)),payload:i.subarray(3+s)}}(e)}catch{return void pr.warn("Failed to decode data stream frame")}switch(r.type){case 1:this.handleHeader(r.streamId,r.payload,t,i);break;case 2:this.handleChunk(r.streamId,r.payload);break;case 3:this.handleClose(r.streamId);break;default:pr.warn(`Unknown frame type: ${r.type}`)}}handleHeader(e,t,i,r){const s=new TextDecoder;let a;try{a=JSON.parse(s.decode(t))}catch{return void pr.warn("Failed to parse stream header")}const n=a.destinationIdentities;if(n&&n.length>0&&!n.includes(this.localIdentity))return;const o=a.topic??"",c=a.streamType??"byte",d="text"===c,p=d?this.textHandlers.get(o):this.byteHandlers.get(o);if(p)if(d){let t;const s=new ReadableStream({start(e){t=e}}),n={id:e,mimeType:a.mimeType??"text/plain",topic:o,timestamp:a.timestamp??Date.now(),size:a.totalSize,attributes:a.attributes};this.activeStreams.set(e,{info:n,streamType:c,controller:t,senderIdentity:i,senderSid:r});p(new mr(n,s),{identity:i,sid:r})}else{let t;const s=new ReadableStream({start(e){t=e}}),n={id:e,mimeType:a.mimeType??"application/octet-stream",topic:o,timestamp:a.timestamp??Date.now(),size:a.totalSize,name:a.name??"",attributes:a.attributes};this.activeStreams.set(e,{info:n,streamType:c,controller:t,senderIdentity:i,senderSid:r});p(new fr(n,s),{identity:i,sid:r})}else pr.debug(`No handler for topic '${o}' (${c}), ignoring stream ${e}`)}handleChunk(e,t){const i=this.activeStreams.get(e);if(i)if("text"===i.streamType){const e=new TextDecoder;i.controller.enqueue(e.decode(t))}else i.controller.enqueue(new Uint8Array(t))}handleClose(e){const t=this.activeStreams.get(e);if(t){try{t.controller.close()}catch{}this.activeStreams.delete(e)}}}function yr(e,t){const i=new TextEncoder,r=[];let s=0;for(;s<e.length;){let a=Math.min(s+t,e.length);for(;a>s&&i.encode(e.slice(s,a)).byteLength>t;)a--;a===s&&(a=s+1),r.push(e.slice(s,a)),s=a}return 0===r.length&&r.push(""),r}class Sr extends Error{constructor(e,t,i){super(t),this.code=e,this.data=i}static builtIn(e,t){return new Sr(Sr.ErrorCode[e],Sr.ErrorMessage[e],t)}}Sr.MAX_MESSAGE_BYTES=256,Sr.MAX_DATA_BYTES=15360,Sr.ErrorCode={APPLICATION_ERROR:1500,CONNECTION_TIMEOUT:1501,RESPONSE_TIMEOUT:1502,RECIPIENT_DISCONNECTED:1503,RESPONSE_PAYLOAD_TOO_LARGE:1504,SEND_FAILED:1505,UNSUPPORTED_METHOD:1400,RECIPIENT_NOT_FOUND:1401,REQUEST_PAYLOAD_TOO_LARGE:1402},Sr.ErrorMessage={APPLICATION_ERROR:"Application error in method handler",CONNECTION_TIMEOUT:"Connection timeout",RESPONSE_TIMEOUT:"Response timeout",RECIPIENT_DISCONNECTED:"Recipient disconnected",RESPONSE_PAYLOAD_TOO_LARGE:"Response payload too large",SEND_FAILED:"Failed to send",UNSUPPORTED_METHOD:"Method not supported at destination",RECIPIENT_NOT_FOUND:"Recipient not found",REQUEST_PAYLOAD_TOO_LARGE:"Request payload too large"};const wr=p("LocalParticipant");class kr extends ri{constructor(){super(...arguments),this.producers=new Map,this.dataProducers=new Map,this.participantTrackPermissions=[],this.allParticipantsAllowedToSubscribe=!0,this.rpcHandlers=new Map,this.pendingRpcResponses=new Map}get isLocal(){return!0}init(e,t){this.rpc=e,this.transportManager=t,this.dataStreamSender=new br(e,t)}getProducers(){return this.producers}getDataProducers(){return this.dataProducers}get lastCameraError(){return this._lastCameraError}get lastMicrophoneError(){return this._lastMicrophoneError}async setCameraEnabled(t,i,r){if(!t){const t=this.getTrackPublication(e.TrackSource.Camera);return t?.track&&await this.unpublishTrack(t.track),t}try{const t={...this.roomOptions?.videoCaptureDefaults,...i},s=await Gi(t);return await this.publishTrack(s,{...r,source:e.TrackSource.Camera,stopTrackOnUnpublish:!0})}catch(e){throw this._lastCameraError=e instanceof Error?e:new Error(String(e)),e}}async setMicrophoneEnabled(t,i,r){if(!t){const t=this.getTrackPublication(e.TrackSource.Microphone);return t?.track&&await this.unpublishTrack(t.track),t}try{const t={...this.roomOptions?.audioCaptureDefaults,...i},s=await Qi(t);return await this.publishTrack(s,{...r,source:e.TrackSource.Microphone,stopTrackOnUnpublish:!0})}catch(e){throw this._lastMicrophoneError=e instanceof Error?e:new Error(String(e)),e}}async setScreenShareEnabled(t,i,r){if(t){const e=await Ki(i);let t;for(const i of e)t=await this.publishTrack(i,{...r,source:i.source,stopTrackOnUnpublish:!0});return t}{const t=this.getTrackPublication(e.TrackSource.ScreenShare);t?.track&&await this.unpublishTrack(t.track);const i=this.getTrackPublication(e.TrackSource.ScreenShareAudio);return i?.track&&await this.unpublishTrack(i.track),t}}async enableCameraAndMicrophone(t,i){let r;try{const e={...this.roomOptions?.audioCaptureDefaults,...t?.audio},i={...this.roomOptions?.videoCaptureDefaults,...t?.video};r=await qi({audio:e,video:i})}catch(e){const t=e instanceof Error?e:new Error(String(e));return this._lastMicrophoneError=t,this._lastCameraError=t,void wr.warn("Failed to create local tracks",e)}const s=await Promise.allSettled(r.map(t=>{const r=t.kind===e.TrackKind.Audio?e.TrackSource.Microphone:e.TrackSource.Camera;return this.publishTrack(t,{...i,source:r})}));for(const e of s)"rejected"===e.status&&wr.warn("Failed to publish track",e.reason)}async publishTrack(t,i){let r;if(t instanceof MediaStreamTrack){const i="audio"===t.kind?e.TrackKind.Audio:e.TrackKind.Video;r=i===e.TrackKind.Audio?new Ri(t):new Bi(t)}else r=t;const s={...this.roomOptions?.publishDefaults,...i};s.source&&(r.source=s.source);for(const[,e]of this.trackPublications)if(e.track===r)return wr.warn("track has already been published, skipping"),e;const a=r.kind===e.TrackKind.Audio;let n=!1;if(a){const e=r.mediaStreamTrack.getSettings(),t=r.mediaStreamTrack.getConstraints(),i="channelCount"in e&&2===e.channelCount||2===t.channelCount;n=s.forceStereo??i,n&&(void 0===s.dtx&&wr.info("Opus DTX will be disabled for stereo tracks by default. Enable explicitly to override."),void 0===s.red&&wr.info("Opus RED will be disabled for stereo tracks by default. Enable explicitly to override."),s.dtx??(s.dtx=!1),s.red??(s.red=!1)),s.stopMicTrackOnMute&&r instanceof Ri&&(r.stopOnMute=!0)}const o=this.transportManager.sendTransport;if(!o)throw new Error("Send transport not available");const c=r.kind===e.TrackKind.Video,d=r.source===e.TrackSource.ScreenShare||r.source===e.TrackSource.ScreenShareAudio;let p;if(c&&("av1"!==s.videoCodec||bi()||(wr.warn("AV1 not supported by browser, falling back to default codec"),s.videoCodec=void 0),"vp9"!==s.videoCodec||_i()||(wr.warn("VP9 not supported by browser, falling back to default codec"),s.videoCodec=void 0),s.videoCodec??(s.videoCodec="vp8")),d&&fi()&&(s.simulcast=!1),c&&s.videoCodec&&ir(s.videoCodec)&&(d?(s.scalabilityMode="L1T3","contentHint"in r.mediaStreamTrack&&(r.mediaStreamTrack.contentHint="motion",wr.info("forcing contentHint to motion for screenshare with SVC codecs",{videoCodec:s.videoCodec,source:r.source}))):s.scalabilityMode??(s.scalabilityMode="L3T3_KEY")),c&&r instanceof Bi){let e={width:0,height:0};try{e=await r.waitForDimensions()}catch{const t=this.roomOptions?.videoCaptureDefaults?.resolution??{width:1280,height:720};e={width:t.width,height:t.height},wr.warn("could not determine track dimensions, using defaults",e)}p=cr(d,e.width,e.height,s)}else if(a){const e=s.audioPreset?.maxBitrate??s.audioBitrate,t=s.audioPreset?.priority??"high";void 0!==e&&(p=[{maxBitrate:e,priority:t,networkPriority:t}])}const l=this.buildCodecOptions(s);let h;if(c&&s.videoCodec){const e=`video/${s.videoCodec}`;h=this.transportManager.device.recvRtpCapabilities.codecs?.find(t=>t.mimeType.toLowerCase()===e)}const u=y(),m=new Promise((t,i)=>{this.transportManager.registerProduceCallback(u,async(a,n,o)=>{try{const i={clientTrackId:u,name:s.name??r.mediaStreamTrack.label,kind:r.kind,rtpParameters:a.rtpParameters,source:r.source,muted:r.isMuted};if(c&&r instanceof Bi){try{const e=await r.waitForDimensions();i.width=e.width,i.height=e.height}catch{}s.videoCodec&&(i.videoCodec=s.videoCodec);const t=function(e){if(!e.backupCodec)return;if(!0===e.backupCodec)return e.videoCodec&&!xi(e.videoCodec)?"vp8":void 0;if("object"==typeof e.backupCodec&&e.backupCodec.codec!==e.videoCodec)return e.backupCodec.codec;return}(s);t&&(i.backupCodec=t,i.backupCodecPolicy=s.backupCodecPolicy??e.BackupCodecPolicy.PREFER_REGRESSION)}const o=await this.rpc.request("track.publish",i);n({id:o.trackSid}),t(o.trackSid)}catch(e){o(e instanceof Error?e:new Error(String(e))),i(e)}})}),f=await o.produce({track:r.mediaStreamTrack,encodings:p,codecOptions:l,codec:h,stopTracks:s.stopTrackOnUnpublish??!1,disableTrackOnPause:!0,appData:{clientTrackId:u,source:r.source}}),g=await m;if(r.sid=g,r.producer=f,c&&r instanceof Bi&&s.videoCodec&&(r.publishedCodec=s.videoCodec),c&&r instanceof Bi){const e=s.degradationPreference??dr(r.source,r.constraints??void 0);r.setDegradationPreference(e).catch(e=>{wr.warn("Failed to set degradation preference",e)})}this.producers.set(g,f);const v=new si({trackSid:g,trackName:s.name??r.mediaStreamTrack.label,kind:r.kind,source:r.source,track:r,muted:r.isMuted,producer:f,options:s});return this.addTrackPublicationToMaps(v),r.startMonitor(),r.addVisibilityListener(),r.on(e.TrackEvent.Muted,()=>{v.muted=!0,this.emit(e.ParticipantEvent.TrackMuted,v),this.rpc.request("track.mute",{trackSid:g,muted:!0}).catch(()=>{})}),r.on(e.TrackEvent.Unmuted,()=>{v.muted=!1,this.emit(e.ParticipantEvent.TrackUnmuted,v),this.rpc.request("track.mute",{trackSid:g,muted:!1}).catch(()=>{})}),f.observer.on("trackended",()=>{!r.isUserProvided&&(r.source===e.TrackSource.Camera||r.source===e.TrackSource.Microphone)?(wr.info(`Track ${g} ended, attempting restart`),r.restart().then(()=>{wr.info(`Track ${g} successfully restarted after ended`)}).catch(e=>{wr.warn(`Failed to restart track ${g}, unpublishing`,e),this.unpublishTrack(r).catch(e=>{wr.warn(`Failed to auto-unpublish track ${g}`,e)})})):(wr.info(`Track ${g} ended, unpublishing`),this.unpublishTrack(r).catch(e=>{wr.warn(`Failed to auto-unpublish track ${g}`,e)}))}),f.on("transportclose",()=>{wr.info(`Transport closed for track ${g}`),this.producers.delete(g)}),this.emit(e.ParticipantEvent.TrackPublished,v),this.emit(e.ParticipantEvent.LocalTrackPublished,v),wr.info(`Published track ${g} (${r.kind}/${r.source})`),v}async unpublishTrack(t){let i;if(t instanceof Ci)i=t.sid;else for(const[e,r]of this.trackPublications)if(r.track?.mediaStreamTrack===t){i=e;break}if(!i)return;const r=this.producers.get(i),s=this.trackPublications.get(i);try{await this.rpc.request("track.unpublish",{trackSid:i})}catch(e){wr.warn(`Failed to unpublish track ${i}`,e)}const a=s?.track instanceof Ci?s.track:void 0;return a?.stopMonitor(),r?.close(),this.producers.delete(i),a&&(a.producer=void 0),s&&(this.removeTrackPublicationFromMaps(i),this.emit(e.ParticipantEvent.TrackUnpublished,s),this.emit(e.ParticipantEvent.LocalTrackUnpublished,s)),wr.info(`Unpublished track ${i}`),s}async publishData(e,t){const i=this.transportManager.sendTransport;if(!i)throw new Error("Send transport not available");const r=y(),s=await i.produceData({ordered:t?.ordered??!0,maxRetransmits:t?.maxRetransmits,maxPacketLifeTime:t?.maxPacketLifeTime,label:t?.label??"data",protocol:""}),a={clientTrackId:r,transportSid:i.id,sctpStreamParameters:s.sctpStreamParameters,name:t?.name??"data",label:t?.label??"data",protocol:""},n=await this.rpc.request("dataTrack.publish",a);this.dataProducers.set(n.dataTrackSid,s),s.send(e),wr.info(`Published data track ${n.dataTrackSid}`)}async setMetadata(e){await this.rpc.request("participant.update",{metadata:e}),this.metadata=e}async setName(e){await this.rpc.request("participant.update",{name:e}),this.name=e}async setAttributes(e){await this.rpc.request("participant.update",{attributes:e}),this.attributes={...this.attributes,...e}}async joinGroup(e){const t=await this.rpc.request("group.join",{groupId:e});return this.groupId=e,t.otherParticipants??[]}async leaveGroup(){await this.rpc.request("group.leave",{}),this.groupId=void 0}setTrackSubscriptionPermissions(e,t=[]){this.participantTrackPermissions=t,this.allParticipantsAllowedToSubscribe=e,this.updateTrackSubscriptionPermissions()}updateTrackSubscriptionPermissions(){this.rpc.request("subscription.updatePermissions",{allParticipantsAllowed:this.allParticipantsAllowedToSubscribe,trackPermissions:this.participantTrackPermissions}).catch(()=>{})}async sendMessage(t,i){const r={id:crypto.randomUUID(),type:i?.type,message:t,timestamp:Date.now(),transient:i?.transient};return this.rpc.notify("message.send",{...r,destinationIdentities:i?.destinationIdentities,topic:i?.topic,attributes:i?.attributes}),this.emit(e.ParticipantEvent.ChatMessage,r),r}async editMessage(t,i){const r={...i,message:t,editTimestamp:Date.now()};return this.rpc.notify("message.send",r),this.emit(e.ParticipantEvent.ChatMessage,r),r}async deleteMessage(e){await this.rpc.request("message.delete",{id:e})}async deleteMessagesByType(e){await this.rpc.request("message.deleteByType",{type:e})}async updateRoomState(e,t){await this.rpc.request("state.update",{key:e,value:t})}async deleteRoomState(e){await this.rpc.request("state.delete",{key:e})}async sendChatMessage(e,t){return this.sendMessage(e,t)}async editChatMessage(e,t){return this.editMessage(e,t)}async sendText(e,t){if(!this.dataStreamSender)throw new Error("Not connected");return this.dataStreamSender.sendText(e,t)}async streamText(e){if(!this.dataStreamSender)throw new Error("Not connected");return this.dataStreamSender.streamText(e)}async sendFile(e,t){if(!this.dataStreamSender)throw new Error("Not connected");return this.dataStreamSender.sendFile(e,t)}async streamBytes(e){if(!this.dataStreamSender)throw new Error("Not connected");return this.dataStreamSender.streamBytes(e)}async performRpc(e){const{destinationIdentity:t,method:i,payload:r,responseTimeout:s=15e3}=e;if(a=r,(new TextEncoder).encode(a).length>15360)throw Sr.builtIn("REQUEST_PAYLOAD_TOO_LARGE");var a;const n=crypto.randomUUID();return new Promise((e,a)=>{const o=setTimeout(()=>{this.pendingRpcResponses.delete(n),a(Sr.builtIn("RESPONSE_TIMEOUT"))},s);this.pendingRpcResponses.set(n,{resolve:e,reject:a,timer:o}),this.rpc.notify("rpc.request",{requestId:n,destinationIdentity:t,method:i,payload:r,responseTimeout:s,callerIdentity:this.identity})})}handleRpcResponse(e){const t=this.pendingRpcResponses.get(e.requestId);t&&(this.pendingRpcResponses.delete(e.requestId),clearTimeout(t.timer),e.error?t.reject(new Sr(e.error.code??1500,e.error.message??"Application error",e.error.data)):t.resolve(e.payload??""))}async handleRpcInvocation(e){const t=this.rpcHandlers.get(e.method);if(t)try{const i=await t({requestId:e.requestId,callerIdentity:e.callerIdentity,payload:e.payload??"",responseTimeout:e.responseTimeout??15e3});this.rpc.notify("rpc.response",{requestId:e.requestId,callerIdentity:e.callerIdentity,payload:i})}catch(t){const i=t instanceof Sr?t:new Sr(Sr.ErrorCode.APPLICATION_ERROR,t instanceof Error?t.message:String(t));this.rpc.notify("rpc.response",{requestId:e.requestId,callerIdentity:e.callerIdentity,error:{code:i.code,message:i.message,data:i.data}})}else this.rpc.notify("rpc.response",{requestId:e.requestId,callerIdentity:e.callerIdentity,error:{code:Sr.ErrorCode.UNSUPPORTED_METHOD,message:"Method not supported"}})}buildCodecOptions(e){const t=e?.codecOptions,i=e?.dtx,r=e?.red,s=e?.audioPreset?.maxBitrate??e?.audioBitrate,a=e?.forceStereo;if(t||void 0!==i||void 0!==r||void 0!==s||void 0!==a)return{...t,...void 0!==i&&{opusDtx:i},...void 0!==r&&{opusFec:r},...void 0!==s&&{opusMaxAverageBitrate:s},...void 0!==a&&{opusStereo:a}}}closeAll(e=!1){for(const[,e]of this.producers)e.close();for(const[,e]of this.dataProducers)e.close();if(this.dataStreamSender?.close(),!e)for(const[,e]of this.trackPublications)e.track instanceof Ci&&e.track.stop();this.producers.clear(),this.dataProducers.clear(),this.trackPublications.clear(),this.audioTrackPublications.clear(),this.videoTrackPublications.clear()}async unpublishTracks(e){await Promise.all(e.map(e=>this.unpublishTrack(e)))}async createTracks(e){const t=[];if(!1!==e?.audio){const i="object"==typeof e?.audio?{...this.roomOptions?.audioCaptureDefaults,...e.audio}:this.roomOptions?.audioCaptureDefaults;t.push(await Qi(i))}if(!1!==e?.video){const i="object"==typeof e?.video?{...this.roomOptions?.videoCaptureDefaults,...e.video}:this.roomOptions?.videoCaptureDefaults;t.push(await Gi(i))}return t}async createScreenTracks(e){return Ki(e)}async republishAllTracks(e,t=!0){const i=[...this.trackPublications.values()];this.clearPublications();for(const r of i){if(!r.track)continue;const i=r.track;if(i.producer=void 0,t&&"ended"===i.mediaStreamTrack?.readyState)try{await i.restart()}catch(e){wr.warn(`Failed to restart track ${r.trackSid}`,e);continue}try{await this.publishTrack(i,{name:r.trackName,source:r.source,...e})}catch(e){wr.warn(`Failed to republish track ${r.trackSid}`,e)}}}async handleSubscribedCodecs(e,t){if(!(e.track instanceof Bi))return;const i=e.track,r=i.publishedCodec;for(const s of t){const t=s.codec.toLowerCase(),a=s.qualities.some(e=>e.enabled);t===r?await i.setDynacastQuality(s.qualities):a&&xi(t)?i.backupProducer||(wr.info(`Publishing backup codec ${t} for ${e.trackSid}`),await this.publishAdditionalCodecForTrack(i,t,e)):!a&&i.backupProducer&&(wr.info(`Stopping backup codec for ${e.trackSid}`),i.backupProducer.close(),i.backupProducer=void 0)}}async publishAdditionalCodecForTrack(e,t,i){const r=this.transportManager.sendTransport;if(!r)throw new Error("Send transport not available");const s=`video/${t}`,a=this.transportManager.device.recvRtpCapabilities.codecs?.find(e=>e.mimeType.toLowerCase()===s);if(!a)return void wr.warn(`Backup codec ${t} not found in device capabilities`);const n=y(),o=new Promise((e,t)=>{this.transportManager.registerProduceCallback(n,async(r,s,a)=>{try{const t={trackSid:i.trackSid,clientTrackId:n,rtpParameters:r.rtpParameters},a=await this.rpc.request("track.publishBackup",t);s({id:a.backupTrackSid}),e(a.backupTrackSid)}catch(e){a(e instanceof Error?e:new Error(String(e))),t(e)}})}),c=await r.produce({track:e.mediaStreamTrack,codec:a,stopTracks:!1,disableTrackOnPause:!1,appData:{clientTrackId:n,source:e.source,backup:!0}}),d=await o;e.backupProducer=c,e.backupCodec=t,wr.info(`Backup codec published: ${t}, sid=${d}`)}clearPublications(){this.producers.clear(),this.dataProducers.clear(),this.trackPublications.clear(),this.audioTrackPublications.clear(),this.videoTrackPublications.clear()}}const Tr=p("RemoteTrackPublication");class Cr extends ii{constructor(t){super(t),this.streamState=e.StreamState.Active,this._subscribed=!0,this._enabled=!0,this._consumer=t.consumer,this._rpc=t.rpc,this._subscribed=t.subscribed??!0}attachSubscription(e,t,i){this.track=e,this._consumer=t,this._rpc=i,this._subscribed=!0}get isSubscribed(){return!!this._subscribed&&super.isSubscribed}get isDesired(){return this._subscribed}get subscriptionStatus(){return this._subscribed?super.isSubscribed?e.SubscriptionStatus.Subscribed:e.SubscriptionStatus.Desired:e.SubscriptionStatus.Unsubscribed}get videoQuality(){return this._videoQuality??e.VideoQuality.HIGH}get isEnabled(){return this._enabled}setEnabled(e){this._enabled!==e&&(this._enabled=e,this._consumer&&this._rpc&&(e?(this._consumer.resume(),this._rpc.request("subscription.resume",{subscriptionSid:this._consumer.id}).catch(()=>{})):(this._consumer.pause(),this._rpc.request("subscription.pause",{subscriptionSid:this._consumer.id}).catch(()=>{}))))}setSubscribed(e){this._subscribed!==e&&(this._subscribed=e,this._rpc&&(e?this._rpc.request("subscription.subscribe",{trackSid:this.trackSid}).catch(e=>{Tr.warn("Failed to subscribe",e)}):this._rpc.request("subscription.unsubscribe",{trackSid:this.trackSid}).catch(e=>{Tr.warn("Failed to unsubscribe",e)})))}setVideoQuality(e){this.isManualOperationAllowed()&&this._videoQuality!==e&&(this._videoQuality=e,this._requestedVideoDimensions=void 0,this.emitTrackUpdate())}setVideoDimensions(e){this.isManualOperationAllowed()&&(this._requestedVideoDimensions?.width===e.width&&this._requestedVideoDimensions?.height===e.height||(this._requestedVideoDimensions=e,this._videoQuality=void 0,this.emitTrackUpdate()))}setVideoFPS(t){this.isManualOperationAllowed()&&this.kind===e.TrackKind.Video&&this._fps!==t&&(this._fps=t,this.emitTrackUpdate())}isManualOperationAllowed(){return!!this.isDesired||(Tr.warn("Cannot update track settings when not subscribed"),!1)}emitTrackUpdate(){if(!this._rpc||!this._consumer)return;let t,i;t=this._requestedVideoDimensions?this.spatialLayerForDimensions(this._requestedVideoDimensions):void 0!==this._videoQuality?this._videoQuality===e.VideoQuality.LOW?0:this._videoQuality===e.VideoQuality.MEDIUM?1:2:2,void 0!==this._fps&&(i=this._fps<=10?0:this._fps<=20?1:2),this._rpc.request("subscription.setPreferredLayers",{subscriptionSid:this._consumer.id,spatialLayer:t,temporalLayer:i}).catch(e=>{Tr.warn("Failed to set preferred layers",e)})}spatialLayerForDimensions(e){const t=this.info?.width,i=this.info?.height;if(!t||!i)return 2;const r=[{q:0,width:Math.ceil(t/4),height:Math.ceil(i/4)},{q:1,width:Math.ceil(t/2),height:Math.ceil(i/2)},{q:2,width:t,height:i}];for(const t of r)if(t.width>=e.width&&t.height>=e.height)return t.q;return 2}}const Pr=p("RemoteTrack");class Rr extends hi{constructor(t,i=e.TrackSource.Unknown,r){super(t,i,r),this._prevBytesReceived=0,this._prevStatsTime=0}get isLocal(){return!1}setMuted(t){this._isMuted!==t&&(this._isMuted=t,this.consumer?t?this.consumer.pause():this.consumer.resume():this.mediaStreamTrack.enabled=!t,this.emit(t?e.TrackEvent.Muted:e.TrackEvent.Unmuted,this))}stop(){this.stopMonitor(),this.detach(),this.consumer?this.consumer.close():this._mediaStreamTrack.enabled=!1}stopMonitor(){super.stopMonitor(),void 0!==this._timeSyncHandle&&(cancelAnimationFrame(this._timeSyncHandle),this._timeSyncHandle=void 0)}async getRTCStatsReport(){if(this.consumer)return this.consumer.getStats()}setPlayoutDelay(e){const t=this.consumer?.rtpReceiver;t&&"playoutDelayHint"in t?t.playoutDelayHint=e:Pr.warn("Playout delay not supported in this browser")}getPlayoutDelay(){const e=this.consumer?.rtpReceiver;return e&&"playoutDelayHint"in e?e.playoutDelayHint:0}startMonitor(){this.monitorInterval||(this._prevBytesReceived=0,this._prevStatsTime=0,this.monitorInterval=setInterval(()=>this.monitorReceiver(),2e3),this.supportsSynchronizationSources()&&this.registerTimeSyncUpdate())}registerTimeSyncUpdate(){const t=this.consumer?.rtpReceiver;if(!t)return;const i=()=>{this._timeSyncHandle=requestAnimationFrame(()=>i());const r=t.getSynchronizationSources?.()?.[0];if(r){const{timestamp:t,rtpTimestamp:i}=r;i&&this._rtpTimestamp!==i&&(this.emit(e.TrackEvent.TimeSyncUpdate,{timestamp:t,rtpTimestamp:i}),this._rtpTimestamp=i)}};i()}supportsSynchronizationSources(){return"undefined"!=typeof RTCRtpReceiver&&"getSynchronizationSources"in RTCRtpReceiver.prototype}async monitorReceiver(){if(this.consumer)try{const e=await this.consumer.getStats();let t=0;e.forEach(e=>{"inbound-rtp"===e.type&&(t+=e.bytesReceived??0)});const i=Date.now();if(this._prevStatsTime>0&&t>this._prevBytesReceived){const e=(i-this._prevStatsTime)/1e3;this._currentBitrate=8*(t-this._prevBytesReceived)/e}this._prevBytesReceived=t,this._prevStatsTime=i}catch{}}}class Er extends Rr{constructor(t){super(e.TrackKind.Audio,e.TrackSource.Microphone,t),this._volume=1}get volume(){return this._volume}setVolume(e){this._volume=Math.max(0,Math.min(1,e));for(const e of this.attachedElements)e.volume=this._volume}}const Dr=p("RemoteVideoTrack");class xr extends Rr{constructor(t=e.TrackSource.Camera,i){super(e.TrackKind.Video,t,i),this.elementInfos=[]}get isAdaptiveStream(){return void 0!==this.adaptiveStreamSettings}setAdaptiveStream(e,t){this.rpc=e,this.adaptiveStreamSettings=t,this.setupAdaptiveObservers()}attach(e){const t=super.attach(e);return this.isAdaptiveStream&&this.observeElement(t),t}detach(e){const t=super.detach(e);for(const e of t)this.unobserveElement(e);return t}async requestPictureInPicture(){if(!document.pictureInPictureEnabled)return;const e=this.getFirstVideoElement();if(e)try{const t=await e.requestPictureInPicture();return this.pipElement=e,e.addEventListener("leavepictureinpicture",()=>{this.pipElement=void 0},{once:!0}),t}catch(e){return void Dr.warn("Failed to enter PiP",e)}}stop(){this.cleanupAdaptive(),super.stop()}setupAdaptiveObservers(){if("undefined"==typeof window)return;this.intersectionObserver=new IntersectionObserver(t=>{for(const i of t){const t=this.elementInfos.find(e=>e.element===i.target);if(t){const r=t.visible;t.visible=i.isIntersecting,r!==t.visible&&(this.emit(e.TrackEvent.VisibilityChanged,t.visible,this),this.handleVisibilityUpdate())}}},{threshold:0}),this.resizeObserver=new ResizeObserver(t=>{for(const i of t){const t=this.elementInfos.find(e=>e.element===i.target);if(t){const{width:r,height:s}=i.contentRect;(Math.abs(r-t.width)>=10||Math.abs(s-t.height)>=10)&&(t.width=r,t.height=s,this.emit(e.TrackEvent.VideoDimensionsChanged,{width:r,height:s},this),this.debouncedUpdateLayers())}}});(this.adaptiveStreamSettings?.pauseVideoInBackground??!0)&&"undefined"!=typeof document&&(this.visibilityBound=()=>this.handlePageVisibilityChange(),document.addEventListener("visibilitychange",this.visibilityBound))}observeElement(e){if(this.elementInfos.some(t=>t.element===e))return;const t={element:e,visible:!0,width:e.clientWidth,height:e.clientHeight};this.elementInfos.push(t),this.intersectionObserver?.observe(e),this.resizeObserver?.observe(e)}unobserveElement(e){const t=this.elementInfos.findIndex(t=>t.element===e);t>=0&&this.elementInfos.splice(t,1),this.intersectionObserver?.unobserve(e),this.resizeObserver?.unobserve(e)}handleVisibilityUpdate(){if(!this.rpc||!this.subscriptionSid)return;this.elementInfos.some(e=>e.visible)||void 0!==this.pipElement?this.rpc.request("subscription.resume",{subscriptionSid:this.subscriptionSid}).catch(e=>{Dr.warn("Failed to resume subscription",e)}):this.rpc.request("subscription.pause",{subscriptionSid:this.subscriptionSid}).catch(e=>{Dr.warn("Failed to pause subscription",e)})}handlePageVisibilityChange(){if(this.rpc&&this.subscriptionSid)if(document.hidden){if(this.pipElement)return;this.rpc.request("subscription.pause",{subscriptionSid:this.subscriptionSid}).catch(e=>{Dr.warn("Failed to pause subscription on visibility change",e)})}else{this.elementInfos.some(e=>e.visible)&&this.rpc.request("subscription.resume",{subscriptionSid:this.subscriptionSid}).catch(e=>{Dr.warn("Failed to resume subscription on visibility change",e)})}}debouncedUpdateLayers(){this.debounceTimer&&clearTimeout(this.debounceTimer),this.debounceTimer=setTimeout(()=>{this.updatePreferredLayers()},300)}updatePreferredLayers(){if(!this.rpc||!this.subscriptionSid)return;let e=0,t=0;for(const i of this.elementInfos)i.visible&&(e=Math.max(e,i.width),t=Math.max(t,i.height));if(0===e&&0===t)return;const i=this.getPixelDensity(),r=this.calculateSpatialLayer(e*i,t*i);this.rpc.request("subscription.setPreferredLayers",{subscriptionSid:this.subscriptionSid,spatialLayer:r}).catch(e=>{Dr.warn("Failed to set preferred layers",e)})}getPixelDensity(){const e=this.adaptiveStreamSettings?.pixelDensity;return"screen"===e?"undefined"!=typeof window?window.devicePixelRatio:1:e??1}calculateSpatialLayer(e,t){const i=e*t;return i<3e4?0:i<230400?1:2}cleanupAdaptive(){this.debounceTimer&&clearTimeout(this.debounceTimer),this.intersectionObserver?.disconnect(),this.resizeObserver?.disconnect(),this.visibilityBound&&"undefined"!=typeof document&&document.removeEventListener("visibilitychange",this.visibilityBound),this.elementInfos=[]}getFirstVideoElement(){for(const e of this.attachedElements)if(e instanceof HTMLVideoElement)return e}}const Ir=p("RemoteParticipant");class Mr extends ri{constructor(e,t){super(e.sid,e.identity,e.name,e.metadata),this.consumers=new Map,this.dataConsumers=new Map,this.autoSubscribe=!0,this.state=e.state,this.transportManager=t.transportManager,this.rpc=t.rpc,this.autoSubscribe=t.autoSubscribe??!0,this.streamReceiver=t.streamReceiver,e.attributes&&(this.attributes={...e.attributes}),e.groupId&&(this.groupId=e.groupId);for(const t of e.tracks??[])this.addTrackPublication(t)}get isLocal(){return!1}rebindTransport(e,t){this.transportManager=e,this.rpc=t}getConsumers(){return this.consumers}getDataConsumers(){return this.dataConsumers}setVolume(e){for(const t of this.audioTrackPublications.values()){const i=t.track;i?.setVolume(e)}}getVolume(){for(const e of this.audioTrackPublications.values()){const t=e.track;if(t)return t.volume}return 1}addTrackPublication(t){const i=new Cr({trackSid:t.sid,trackName:t.name,kind:t.kind,source:t.source,muted:t.muted,info:t,rpc:this.rpc,subscribed:this.autoSubscribe});return this.addTrackPublicationToMaps(i),this.emit(e.ParticipantEvent.TrackPublished,i),i}removeTrackPublication(t){const i=this.removeTrackPublicationFromMaps(t);if(i){if(i.track){const t=i.track;t.subscriptionSid&&this.consumers.delete(t.subscriptionSid),t.stop(),this.emit(e.ParticipantEvent.TrackUnsubscribed,t,i)}return this.emit(e.ParticipantEvent.TrackUnpublished,i),i}}async handleSubscriptionCreate(t){const i=this.transportManager.recvTransport;if(!i)throw new Error("Recv transport not available");const r=await i.consume({id:t.subscriptionSid,producerId:t.trackSid,kind:t.kind===e.TrackKind.Audio?"audio":"video",rtpParameters:t.rtpParameters});let s;this.consumers.set(t.subscriptionSid,r),s=t.kind===e.TrackKind.Audio?new Er(r.track):new xr(t.trackSource,r.track),s.sid=t.trackSid,s.subscriptionSid=t.subscriptionSid,s.publisherSid=t.publisherSid,s.consumer=r,t.trackMuted&&s.setMuted(!0);let a=this.trackPublications.get(t.trackSid);a?(a.attachSubscription(s,r,this.rpc),a.muted=t.trackMuted):(a=new Cr({trackSid:t.trackSid,trackName:t.trackName,kind:t.kind,source:t.trackSource,track:s,muted:t.trackMuted,consumer:r,rpc:this.rpc}),this.addTrackPublicationToMaps(a));const n=a;return r.observer.on("trackended",()=>{Ir.info(`Remote track ended for subscription ${t.subscriptionSid}`)}),r.observer.on("pause",()=>{s.setStreamState(e.StreamState.Paused),n.streamState=e.StreamState.Paused,this.emit(e.ParticipantEvent.TrackStreamStateChanged,n,e.StreamState.Paused)}),r.observer.on("resume",()=>{s.setStreamState(e.StreamState.Active),n.streamState=e.StreamState.Active,this.emit(e.ParticipantEvent.TrackStreamStateChanged,n,e.StreamState.Active)}),r.observer.on("close",()=>{Ir.info(`Consumer closed for subscription ${t.subscriptionSid}`),this.consumers.delete(t.subscriptionSid)}),s.startMonitor(),this.emit(e.ParticipantEvent.TrackSubscribed,s,n),Ir.info(`Subscribed to track ${t.trackSid} via subscription ${t.subscriptionSid}`),{ok:!0}}async handleDataSubscriptionCreate(t){const i=this.transportManager.recvTransport;if(!i)throw new Error("Recv transport not available");const r=await i.consumeData({id:t.dataSubscriptionSid,dataProducerId:t.dataTrackSid,sctpStreamParameters:t.sctpStreamParameters,label:t.label,protocol:t.protocol});if(this.dataConsumers.set(t.dataSubscriptionSid,r),t.label===lr&&this.streamReceiver){const e=this.streamReceiver,t=this.identity??"",i=this.sid;r.on("message",r=>{e.handleMessage(r,t,i)})}else r.on("message",i=>{Ir.debug(`Data message from ${this.sid} subscription ${t.dataSubscriptionSid}`),this.emit(e.ParticipantEvent.DataReceived,i)});return Ir.info(`Data subscription created: ${t.dataSubscriptionSid} (label=${t.label})`),{ok:!0}}handleSubscriptionClosed(t){const i=this.consumers.get(t);i&&(i.close(),this.consumers.delete(t));for(const[,i]of this.trackPublications)if(i.track&&i.track.subscriptionSid===t){const t=i.track;i.track=void 0,this.emit(e.ParticipantEvent.TrackUnsubscribed,t,i),t.stop();break}}handleDataSubscriptionClosed(e){const t=this.dataConsumers.get(e);t&&(t.close(),this.dataConsumers.delete(e))}setTrackMuted(t,i){const r=this.trackPublications.get(t);r&&(r.muted=i,r.track&&r.track.setMuted(i),this.emit(i?e.ParticipantEvent.TrackMuted:e.ParticipantEvent.TrackUnmuted,r))}closeAll(){for(const[,e]of this.consumers)e.close();for(const[,e]of this.dataConsumers)e.close();for(const[,e]of this.trackPublications)e.track&&e.track.stop();this.consumers.clear(),this.dataConsumers.clear(),this.trackPublications.clear(),this.audioTrackPublications.clear(),this.videoTrackPublications.clear()}}const Lr="0.1.0",Or=p("StatsCollector");function Ar(e){const t=[];return e.forEach(e=>{t.push(e)}),t}class jr{constructor(e,t,i,r){this.rpc=e,this.transportManager=t,this.localParticipant=i,this.remoteParticipants=r}start(e){this.stop(),e<=0||(Or.info("Stats collector started"),this.timer=setInterval(()=>{this.collect().catch(e=>{Or.warn("Failed to collect stats",e)})},1e3*e))}stop(){this.timer&&(clearInterval(this.timer),this.timer=void 0,Or.info("Stats collector stopped"))}async collect(){const e={timestamp:Date.now()},t=[];if(this.transportManager.sendTransport)try{const e=await this.transportManager.sendTransport.getStats();t.push({id:this.transportManager.sendTransport.id,direction:"send",stats:Ar(e)})}catch{}if(this.transportManager.recvTransport)try{const e=await this.transportManager.recvTransport.getStats();t.push({id:this.transportManager.recvTransport.id,direction:"recv",stats:Ar(e)})}catch{}t.length>0&&(e.transports=t);const i=[];for(const[e,t]of this.localParticipant.getProducers())try{const r=await t.getStats();i.push({id:t.id,trackSid:e,stats:Ar(r)})}catch{}i.length>0&&(e.producers=i);const r=[];for(const[e,t]of this.remoteParticipants)for(const[,i]of t.getConsumers())try{const t=await i.getStats();r.push({id:i.id,participantSid:e,stats:Ar(t)})}catch{}r.length>0&&(e.consumers=r),this.rpc.notify("stats.report",e)}}class Fr{constructor(e=10,t=300,i=1e4){this.maxRetries=e,this.baseDelay=t,this.maxDelay=i}nextRetryDelayInMs(e){if(e.retryCount>this.maxRetries)return null;const t=Math.min(this.baseDelay*Math.pow(2,e.retryCount-1),this.maxDelay);return t+.5*t*Math.random()}reset(){}}const Nr=p("Room");var $r;e.CheckStatus=void 0,($r=e.CheckStatus||(e.CheckStatus={})).Idle="idle",$r.Running="running",$r.Success="success",$r.Failed="failed",$r.Skipped="skipped";e.AudioPresets={telephone:{maxBitrate:12e3},speech:{maxBitrate:24e3},music:{maxBitrate:48e3},musicStereo:{maxBitrate:64e3},musicHighQuality:{maxBitrate:96e3},musicHighQualityStereo:{maxBitrate:128e3}},e.AxonError=h,e.ByteStreamReader=fr,e.ByteStreamWriter=vr,e.ConnectionCheck=class extends n{constructor(e){super(),this.url=e}async checkSignalConnectivity(){return this.runCheck("signal-connectivity","Check signalling server reachability",async()=>{const e=await fetch(this.url,{method:"HEAD",signal:AbortSignal.timeout(5e3)});if(!e.ok&&405!==e.status)throw new Error(`Signal server returned ${e.status}`)})}async checkWebRTC(){return this.runCheck("webrtc","Check WebRTC peer connection",async()=>{const e=new RTCPeerConnection;try{const t=await e.createOffer();await e.setLocalDescription(t)}finally{e.close()}})}async checkPublishAudio(){return this.runCheck("publish-audio","Check audio publishing capability",async()=>{const e=await navigator.mediaDevices.getUserMedia({audio:!0});for(const t of e.getTracks())t.stop()})}async checkPublishVideo(){return this.runCheck("publish-video","Check video publishing capability",async()=>{const e=await navigator.mediaDevices.getUserMedia({video:!0});for(const t of e.getTracks())t.stop()})}async checkAll(){const e=[];return e.push(await this.checkSignalConnectivity()),e.push(await this.checkWebRTC()),e.push(await this.checkPublishAudio()),e.push(await this.checkPublishVideo()),e}async runCheck(t,i,r){const s={name:t,status:e.CheckStatus.Running,description:i};this.emit("statusChanged",s);const a=Date.now();try{await r(),s.status=e.CheckStatus.Success,s.duration=Date.now()-a}catch(t){s.status=e.CheckStatus.Failed,s.error=t instanceof Error?t.message:String(t),s.duration=Date.now()-a}return this.emit("statusChanged",s),s}},e.ConnectionError=u,e.DefaultReconnectPolicy=Fr,e.LocalAudioTrack=Ri,e.LocalParticipant=kr,e.LocalTrack=Ci,e.LocalTrackPublication=si,e.LocalVideoTrack=Bi,e.MAX_RPC_PAYLOAD_BYTES=15360,e.MediaDeviceFailure=class{static getFailure(e){if(!e)return;const t=e.name??"",i=(e.message??"").toLowerCase();return"NotAllowedError"===t||"PermissionDeniedError"===t?"PermissionDenied":"NotFoundError"===t||"DevicesNotFoundError"===t?"NotFound":"NotReadableError"===t||"TrackStartError"===t||"AbortError"===t?"DeviceInUse":i.includes("permission")?"PermissionDenied":i.includes("not found")?"NotFound":i.includes("in use")||i.includes("could not start")?"DeviceInUse":void 0}},e.PROTOCOL_VERSION=1,e.Participant=ri,e.RemoteAudioTrack=Er,e.RemoteParticipant=Mr,e.RemoteTrack=Rr,e.RemoteTrackPublication=Cr,e.RemoteVideoTrack=xr,e.Room=class extends n{constructor(t){super(),this._state=e.RoomState.Disconnected,this._name="",this._sid="",this.url="",this.token="",this._refreshToken="",this.nodeId="",this.participantSid="",this._remoteParticipants=new Map,this._groups=new Map,this._sharedState=new Map,this.pingIntervalSec=5,this.pingTimeoutSec=15,this.lastRtt=0,this.reconnectAttempts=0,this.reconnectPolicy=new Fr,this._canPlaybackAudio=!0,this._canPlaybackVideo=!0,this._activeDeviceMap=new Map,this.dataStreamReceiver=new _r,this._lastMessageTimestamp=0,this._connectOptions={},this._options=t??{},this._options.audioCaptureDefaults={...Li,...t?.audioCaptureDefaults},this._options.videoCaptureDefaults={...Mi,...t?.videoCaptureDefaults},this._options.publishDefaults={...t?.publishDefaults},this.signalClient=new v}get state(){return this._state}get name(){return this._name}get sid(){return this._sid}get serverInfo(){return this._serverInfo}get localParticipant(){return this._localParticipant}get remoteParticipants(){return this._remoteParticipants}async getTransportStats(){return this.transportManager.getStats()}get groups(){return this._groups}get sharedState(){return this._sharedState}getGroupParticipants(e){const t=[];this._localParticipant?.groupId===e&&t.push(this._localParticipant);for(const[,i]of this._remoteParticipants)i.groupId===e&&t.push(i);return t}getParticipants(){const e=[];this._localParticipant&&!this._localParticipant.groupId&&e.push(this._localParticipant);for(const[,t]of this._remoteParticipants)t.groupId||e.push(t);return e}get canPlaybackAudio(){return this._canPlaybackAudio}get canPlaybackVideo(){return this._canPlaybackVideo}get isRecording(){return this._roomInfo?.activeRecording??!1}get metadata(){return this._roomInfo?.metadata}get numParticipants(){return this._remoteParticipants.size+1}get numPublishers(){let e=0;this._localParticipant?.trackPublications.size>0&&e++;for(const[,t]of this._remoteParticipants)t.trackPublications.size>0&&e++;return e}get activeSpeakers(){const e=[];this._localParticipant?.isSpeaking&&e.push(this._localParticipant);for(const[,t]of this._remoteParticipants)t.isSpeaking&&e.push(t);return e.sort((e,t)=>t.audioLevel-e.audioLevel),e}getParticipantByIdentity(e){for(const[,t]of this._remoteParticipants)if(t.identity===e)return t}getParticipantBySid(e){return this._localParticipant?.sid===e?this._localParticipant:this._remoteParticipants.get(e)}async createGroup(e,t){return(await this.rpcClient.request("group.create",{name:e,permissions:t})).group}async deleteGroup(e){await this.rpcClient.request("group.delete",{groupId:e})}async listGroups(){return(await this.rpcClient.request("group.list",{})).groups}async pinParticipant(e){await this.rpcClient.request("participant.pin",{participantSid:e})}async unpinParticipant(e){await this.rpcClient.request("participant.unpin",{participantSid:e})}static async getLocalDevices(e){const t=await navigator.mediaDevices.enumerateDevices();return e?t.filter(t=>t.kind===e):t}async switchActiveDevice(e,t,i=!0){if(this._activeDeviceMap.set(e,t),!this._localParticipant)return;const r=i?{exact:t}:t;for(const[,i]of this._localParticipant.trackPublications){const s=i.track;if(s&&s instanceof Ci)if("audioinput"===e&&"audio"===s.kind)await(s.setDeviceId?.(r));else if("videoinput"===e&&"video"===s.kind)await(s.setDeviceId?.(r));else if("audiooutput"===e)for(const e of s.attachedElements??[])"function"==typeof e.setSinkId&&await e.setSinkId(t)}if("audiooutput"===e)for(const[,e]of this._remoteParticipants)for(const[,i]of e.trackPublications)if(i.track)for(const e of i.track.attachedElements??[])"function"==typeof e.setSinkId&&await e.setSinkId(t)}async connect(t,i,r){if(this._state!==e.RoomState.Disconnected)throw new Error(`Cannot connect: room state is ${this._state}`);this.url=t,this.token=i??"",this._connectOptions=r??{},this.setState(e.RoomState.Connecting);const s=this._connectOptions.peerConnectionTimeout??15e3;try{const i=await this.withTimeout(this.performConnect(t),s);this.setState(e.RoomState.Connected),this.scheduleReadySnapshotReplay(i.readyParticipants),this.startHeartbeat(i.pingInterval,i.pingTimeout),this.startStatsCollector(i.statsInterval),this.reconnectAttempts=0,this.reconnectPolicy.reset(),this.setupDeviceChangeListener(),this.wireLocalParticipantEvents(),this.emit(e.RoomEvent.Connected),Nr.info(`Connected to room ${this._name}`),this.setupPageLeaveHandler()}catch(t){throw this.setState(e.RoomState.Disconnected),this.transportManager?.close(),t}}async performConnect(t){this.transportManager&&this.transportManager.close(),this.transportManager=new Bt(this.signalClient),this.rpcClient=new M;const i=await this.transportManager.generateCertificate(),r=i.length>0,s=this._connectOptions.autoSubscribe??!0,a=this._options.lastN??0,n={room:{name:this._options.roomName??"",metadata:this._options.metadata},clientInfo:{sdk:1,version:Lr,protocol:1},connectionSettings:{autoSubscribe:s,adaptiveStream:!!this._options.adaptiveStream,lastN:a>0?a:void 0,dtlsFingerprints:r?i:void 0},reconnect:!1,participantSid:"",nodeId:"",token:this.token||void 0},{response:o}=await this.signalClient.join(t,n),c=o;this.nodeId=c.serverInfo.nodeId,this.applyJoinResponse(c),await this.transportManager.setup(t,c,r,this._connectOptions.rtcConfig),this.wireTransportEvents(),this.transportManager.signalDataProducer&&this.transportManager.signalDataConsumer&&this.rpcClient.bind(this.transportManager.signalDataProducer,this.transportManager.signalDataConsumer),this.registerRPCHandlers(),this.registerNotificationHandlers();const d={rtpCapabilities:this.transportManager.device.recvRtpCapabilities},p=await this.rpcClient.request("ready",d);this._localParticipant&&(this._localParticipant.state=e.ParticipantState.Joined);return{readyParticipants:this.applyReadySnapshot(p),pingInterval:c.pingInterval,pingTimeout:c.pingTimeout,statsInterval:c.statsInterval}}async disconnect(t=!0){if(this._state!==e.RoomState.Disconnected){Nr.info("Disconnecting from room");try{await this.rpcClient.request("leave",{reason:"client_initiated"}).catch(()=>{})}catch{}this.cleanup(e.DisconnectReason.ClientInitiated,t)}}async attemptReconnect(){this.setState(e.RoomState.Reconnecting),this.emit(e.RoomEvent.Reconnecting),this.reconnectAttempts++;const t=this.reconnectPolicy.nextRetryDelayInMs({retryCount:this.reconnectAttempts,elapsedMs:0});if(null===t)return Nr.warn("Reconnect policy says stop"),void this.cleanup(e.DisconnectReason.StateMismatch);if(Nr.info(`Reconnecting in ${t}ms (attempt ${this.reconnectAttempts})`),await new Promise(e=>setTimeout(e,t)),this._state!==e.RoomState.Reconnecting)return;const i=this._connectOptions.peerConnectionTimeout??15e3;try{await this.withTimeout(this.performReconnect(),i)}catch(e){Nr.warn(`Reconnect attempt ${this.reconnectAttempts} failed`,e),this.attemptReconnect()}}async performReconnect(){const t=this.transportManager.getDtlsFingerprints(),i=t.length>0,r=this.transportManager.getCertificate(),s=this._options.lastN??0,a={room:{name:this._name},clientInfo:{sdk:1,version:Lr,protocol:1},connectionSettings:{autoSubscribe:this._connectOptions.autoSubscribe??!0,adaptiveStream:!!this._options.adaptiveStream,lastN:s>0?s:void 0,dtlsFingerprints:i?t:void 0},reconnect:!0,participantSid:this.participantSid,nodeId:this.nodeId,token:this.token||void 0,refreshToken:this._refreshToken||void 0},{response:n}=await this.signalClient.join(this.url,a);if(g(n))return await this.transportManager.restartIce(n.iceParameters),this.setState(e.RoomState.Connected),this.reconnectAttempts=0,this.reconnectPolicy.reset(),this.emit(e.RoomEvent.Reconnected),void Nr.info("ICE restart completed");const o=n;this.stopHeartbeat(),this.stopStatsCollector(),this.rpcClient.close(),this.transportManager.close(),this.rpcClient=new M,this.transportManager=new Bt(this.signalClient),r&&this.transportManager.setCertificate(r),this.nodeId=o.serverInfo.nodeId,this.applyJoinResponse(o),await this.transportManager.setup(this.url,o,i,this._connectOptions.rtcConfig),this.wireTransportEvents(),this.transportManager.signalDataProducer&&this.transportManager.signalDataConsumer&&this.rpcClient.bind(this.transportManager.signalDataProducer,this.transportManager.signalDataConsumer),this.registerRPCHandlers(),this.registerNotificationHandlers(),this._localParticipant.init(this.rpcClient,this.transportManager);for(const[,e]of this._remoteParticipants)e.rebindTransport(this.transportManager,this.rpcClient);const c={rtpCapabilities:this.transportManager.device.recvRtpCapabilities,syncState:this.buildSyncState()},d=await this.rpcClient.request("ready",c);if(this.applyReadySnapshot(d),d.messages)for(const e of d.messages)this.handleMessage(e);if(d.sharedState){this._sharedState.clear();for(const[e,t]of Object.entries(d.sharedState))this._sharedState.set(e,t)}await this._localParticipant.republishAllTracks(),this.startHeartbeat(o.pingInterval,o.pingTimeout),this.startStatsCollector(o.statsInterval),this.setState(e.RoomState.Connected),this.reconnectAttempts=0,this.reconnectPolicy.reset(),this.emit(e.RoomEvent.Reconnected),Nr.info("Reconnected successfully")}withTimeout(e,t){if(t<=0)return e;let i;return Promise.race([e,new Promise((e,r)=>{i=setTimeout(()=>r(new m(`Connection timed out after ${t}ms`)),t)})]).finally(()=>clearTimeout(i))}buildSyncState(){const e=[],t=[];for(const[e]of this._localParticipant.trackPublications)t.push(e);for(const[,t]of this._remoteParticipants)for(const[i,r]of t.trackPublications)r.track&&e.push(i);return{subscribedTrackSids:e,subscribedDataTrackSids:[],publishedTrackSids:t,dataReceiveStates:[],lastMessageTimestamp:this._lastMessageTimestamp||void 0}}setState(t){this._state!==t&&(this._state=t,this.emit(e.RoomEvent.ConnectionStateChanged,t))}startHeartbeat(e,t){this.stopHeartbeat(),this.pingIntervalSec=e||5,this.pingTimeoutSec=t||15,this.pingInterval=setInterval(()=>{this.sendPing()},1e3*this.pingIntervalSec)}stopHeartbeat(){this.pingInterval&&(clearInterval(this.pingInterval),this.pingInterval=void 0),this.pingTimeoutTimer&&(clearTimeout(this.pingTimeoutTimer),this.pingTimeoutTimer=void 0)}sendPing(){if(this._state!==e.RoomState.Connected)return;const t=1e3*this.pingIntervalSec;if(this.rpcClient.lastSentAt>0&&Date.now()-this.rpcClient.lastSentAt<t)return;const i={timestamp:Date.now()};this.pingTimeoutTimer&&clearTimeout(this.pingTimeoutTimer),this.pingTimeoutTimer=setTimeout(()=>{Nr.warn("Ping timeout, attempting reconnect"),this.handleDisconnect(e.DisconnectReason.ConnectionTimeout)},1e3*this.pingTimeoutSec),this.rpcClient.request("ping",i,1e3*this.pingTimeoutSec).then(e=>{this.pingTimeoutTimer&&(clearTimeout(this.pingTimeoutTimer),this.pingTimeoutTimer=void 0),this.lastRtt=Date.now()-e.lastTimestamp}).catch(e=>{Nr.warn("Ping failed",e)})}get rtt(){return this.lastRtt}startStatsCollector(e){this.stopStatsCollector(),!e||e<=0||(this.statsCollector=new jr(this.rpcClient,this.transportManager,this._localParticipant,this._remoteParticipants),this.statsCollector.start(e))}stopStatsCollector(){this.statsCollector&&(this.statsCollector.stop(),this.statsCollector=void 0)}async startAudio(){const t=[];for(const[,i]of this._remoteParticipants)for(const[,r]of i.trackPublications)if(r.track&&"audio"===r.kind){const i=r.track.attach();t.push(i.play().then(()=>{this._canPlaybackAudio||(this._canPlaybackAudio=!0,this.emit(e.RoomEvent.AudioPlaybackStatusChanged,!0))}).catch(()=>{}))}await Promise.allSettled(t)}async startVideo(){const t=[];for(const[,i]of this._remoteParticipants)for(const[,r]of i.trackPublications)if(r.track&&"video"===r.kind){const i=r.track.attach();t.push(i.play().then(()=>{this._canPlaybackVideo||(this._canPlaybackVideo=!0,this.emit(e.RoomEvent.VideoPlaybackStatusChanged,!0))}).catch(()=>{}))}await Promise.allSettled(t)}getActiveDevice(e){return this._activeDeviceMap.get(e)}registerRpcMethod(e,t){this._localParticipant.rpcHandlers.set(e,t)}unregisterRpcMethod(e){this._localParticipant.rpcHandlers.delete(e)}registerTextStreamHandler(e,t){this.dataStreamReceiver.registerTextStreamHandler(e,t)}unregisterTextStreamHandler(e){this.dataStreamReceiver.unregisterTextStreamHandler(e)}registerByteStreamHandler(e,t){this.dataStreamReceiver.registerByteStreamHandler(e,t)}unregisterByteStreamHandler(e){this.dataStreamReceiver.unregisterByteStreamHandler(e)}applyJoinResponse(e){this._name=e.room.name,this._sid=e.room.sid,this._roomInfo=e.room,this._serverInfo=e.serverInfo,this.participantSid=e.participant.sid,e.refreshToken&&(this._refreshToken=e.refreshToken),this._localParticipant?this._localParticipant.updateFromInfo(e.participant):this._localParticipant=new kr(e.participant.sid,e.participant.identity,e.participant.name,e.participant.metadata),this._localParticipant.roomOptions=this._options,this._localParticipant.init(this.rpcClient,this.transportManager),this.dataStreamReceiver.setLocalIdentity(e.participant.identity)}registerRPCHandlers(){this.rpcClient.onRequest("subscription.create",async e=>this.handleSubscriptionCreate(e)),this.rpcClient.onRequest("dataSubscription.create",async e=>this.handleDataSubscriptionCreate(e))}registerNotificationHandlers(){this.rpcClient.onNotification("token.refreshed",t=>{this._refreshToken=t.token,this.emit(e.RoomEvent.TokenRefreshed,t.token)}),this.rpcClient.onNotification("participant.joined",e=>{this.handleParticipantJoined(e)}),this.rpcClient.onNotification("participant.left",e=>{this.handleParticipantLeft(e)}),this.rpcClient.onNotification("participant.updated",e=>{this.handleParticipantUpdated(e)}),this.rpcClient.onNotification("track.published",e=>{this.handleTrackPublished(e)}),this.rpcClient.onNotification("track.unpublished",e=>{this.handleTrackUnpublished(e)}),this.rpcClient.onNotification("dataTrack.published",e=>{this.handleDataTrackPublished(e)}),this.rpcClient.onNotification("dataTrack.unpublished",e=>{this.handleDataTrackUnpublished(e)}),this.rpcClient.onNotification("track.muted",e=>{this.handleTrackMuted(e)}),this.rpcClient.onNotification("track.subscribedQualityChanged",e=>{this.handleSubscribedQualityChanged(e)}),this.rpcClient.onNotification("activeSpeakers.changed",e=>{this.handleActiveSpeakersChanged(e)}),this.rpcClient.onNotification("room.updated",e=>{this.handleRoomUpdated(e)}),this.rpcClient.onNotification("disconnect",e=>{this.handleDisconnect(e.reason)}),this.rpcClient.onNotification("subscription.closed",e=>{this.handleSubscriptionClosed(e)}),this.rpcClient.onNotification("dataSubscription.closed",e=>{this.handleDataSubscriptionClosed(e)}),this.rpcClient.onNotification("message.received",e=>{this.handleMessage(e)}),this.rpcClient.onNotification("message.deleted",t=>{this.emit(e.RoomEvent.MessageDeleted,t.ids,t.type)}),this.rpcClient.onNotification("state.updated",t=>{this._sharedState.set(t.key,t.value),this.emit(e.RoomEvent.StateUpdated,t.key,t.value,t.participantSid,t.participantIdentity)}),this.rpcClient.onNotification("state.deleted",t=>{this._sharedState.delete(t.key),this.emit(e.RoomEvent.StateDeleted,t.key,t.participantSid,t.participantIdentity)}),this.rpcClient.onNotification("rpc.invoke",e=>{this._localParticipant.handleRpcInvocation(e)}),this.rpcClient.onNotification("rpc.response",e=>{this._localParticipant.handleRpcResponse(e)}),this.rpcClient.onNotification("group.created",t=>{this._groups.set(t.group.groupId,t.group),this.emit(e.RoomEvent.GroupCreated,t.group)}),this.rpcClient.onNotification("group.updated",t=>{this._groups.set(t.group.groupId,t.group),this.emit(e.RoomEvent.GroupUpdated,t.group)}),this.rpcClient.onNotification("group.deleted",t=>{this._groups.delete(t.groupId),this._localParticipant.groupId===t.groupId&&(this._localParticipant.groupId=void 0);for(const[,e]of this._remoteParticipants)e.groupId===t.groupId&&(e.groupId=void 0);this.emit(e.RoomEvent.GroupDeleted,t.groupId)}),this.rpcClient.onNotification("group.participantJoined",t=>{const i=this.getParticipantBySid(t.participantSid);i&&(i.groupId=t.groupId,this.emit(e.RoomEvent.GroupParticipantJoined,t.groupId,i))}),this.rpcClient.onNotification("group.participantLeft",t=>{const i=this.getParticipantBySid(t.participantSid);i&&(i.groupId=void 0,this.emit(e.RoomEvent.GroupParticipantLeft,t.groupId,i))})}applyReadySnapshot(e){e.room&&(this._roomInfo=e.room,this._name=e.room.name);const t=this.replaceRemoteParticipants(e.otherParticipants);return this.replaceGroups(e.groups),this.replaceSharedState(e.sharedState),t}replaceRemoteParticipants(e){if(!e)return[];const t=new Set,i=[];for(const r of e)t.add(r.sid),i.push(this.upsertRemoteParticipant(r));for(const[e,i]of this._remoteParticipants)t.has(e)||(i.closeAll(),this._remoteParticipants.delete(e));return i}replaceGroups(e){if(e){this._groups.clear();for(const t of e)this._groups.set(t.groupId,t)}}replaceSharedState(e){if(e){this._sharedState.clear();for(const[t,i]of Object.entries(e))this._sharedState.set(t,i)}}upsertRemoteParticipant(e){const t=this._remoteParticipants.get(e.sid);if(t)return t.updateFromInfo(e),t;const i=new Mr(e,{transportManager:this.transportManager,rpc:this.rpcClient,autoSubscribe:this._connectOptions.autoSubscribe,streamReceiver:this.dataStreamReceiver});return this._remoteParticipants.set(e.sid,i),this.wireRemoteParticipantEvents(i),i}scheduleReadySnapshotReplay(t){if(0===t.length)return;const i=t.map(e=>({participant:e,publications:[...e.trackPublications.values()]}));setTimeout(()=>{if(this._state===e.RoomState.Connected)for(const{participant:t,publications:r}of i)if(this._remoteParticipants.get(t.sid)===t){this.emit(e.RoomEvent.ParticipantJoined,t);for(const i of r)t.getTrackPublicationBySid(i.trackSid)===i&&this.emit(e.RoomEvent.TrackPublished,i,t)}},0)}handleParticipantJoined(t){const i=this._remoteParticipants.has(t.participant.sid),r=this.upsertRemoteParticipant(t.participant);if(i)return this.emit(e.RoomEvent.ParticipantUpdated,r),void Nr.info(`Participant updated via join event: ${r.identity} (${r.sid})`);this.emit(e.RoomEvent.ParticipantJoined,r),Nr.info(`Participant joined: ${r.identity} (${r.sid})`)}handleParticipantLeft(t){const i=this._remoteParticipants.get(t.participantSid);i&&(i.closeAll(),this._remoteParticipants.delete(t.participantSid),this.emit(e.RoomEvent.ParticipantLeft,i,t.reason),Nr.info(`Participant left: ${i.identity} (${i.sid})`))}handleParticipantUpdated(t){const i=this._remoteParticipants.has(t.participant.sid),r=this.upsertRemoteParticipant(t.participant);if(!i)return this.emit(e.RoomEvent.ParticipantJoined,r),void Nr.warn(`Participant updated before join event: ${r.identity} (${r.sid})`);this.emit(e.RoomEvent.ParticipantUpdated,r)}handleTrackPublished(t){const i=this._remoteParticipants.get(t.participantSid);if(!i)return;const r=i.addTrackPublication(t.track);this.emit(e.RoomEvent.TrackPublished,r,i)}handleTrackUnpublished(t){const i=this._remoteParticipants.get(t.participantSid);if(!i)return;const r=i.removeTrackPublication(t.trackSid);r&&this.emit(e.RoomEvent.TrackUnpublished,r,i)}handleDataTrackPublished(t){const i=this._remoteParticipants.get(t.participantSid);i&&this.emit(e.RoomEvent.DataTrackPublished,t.dataTrack,i)}handleDataTrackUnpublished(t){const i=this._remoteParticipants.get(t.participantSid);i&&this.emit(e.RoomEvent.DataTrackUnpublished,t.dataTrackSid,i)}handleTrackMuted(t){const i=this._remoteParticipants.get(t.participantSid);if(!i)return;i.setTrackMuted(t.trackSid,t.muted);const r=i.getTrackPublicationBySid(t.trackSid);r&&this.emit(t.muted?e.RoomEvent.TrackMuted:e.RoomEvent.TrackUnmuted,r,i)}handleSubscribedQualityChanged(e){if(!this._options.dynacast)return;const t=this._localParticipant.getTrackPublicationBySid(e.trackSid);t?.track&&t.track instanceof Bi&&(e.subscribedCodecs&&e.subscribedCodecs.length>0?this._localParticipant.handleSubscribedCodecs(t,e.subscribedCodecs).catch(e=>{Nr.warn("Failed to handle subscribed codecs",e)}):t.track.setDynacastQuality(e.subscribedQualities).catch(e=>{Nr.warn("Failed to set dynacast quality",e)}))}handleActiveSpeakersChanged(t){const i=[],r=new Date;for(const s of t.speakers){let t;if(t=s.participantSid===this.participantSid?this._localParticipant:this._remoteParticipants.get(s.participantSid),!t)continue;const a=t.isSpeaking;t.isSpeaking=s.active,t.audioLevel=s.level,s.active&&(t.lastSpokeAt=r,i.push(t)),a!==s.active&&t.emit(e.ParticipantEvent.IsSpeakingChanged,s.active)}i.sort((e,t)=>t.audioLevel-e.audioLevel),this.emit(e.RoomEvent.ActiveSpeakersChanged,i)}handleMessage(t){const i={id:t.id,type:t.type,message:t.message,timestamp:t.timestamp,editTimestamp:t.editTimestamp,transient:t.transient,attachedFiles:t.attachedFiles},r=i.editTimestamp??i.timestamp;r>this._lastMessageTimestamp&&(this._lastMessageTimestamp=r);const s=t.participantSid?this._remoteParticipants.get(t.participantSid):void 0;s?.emit(e.ParticipantEvent.ChatMessage,i),this.emit(e.RoomEvent.ChatMessage,i,s)}handleRoomUpdated(t){this._roomInfo=t.room,this._name=t.room.name,this.emit(e.RoomEvent.RoomUpdated,t.room)}handleDisconnect(t){Nr.info(`handleDisconnect: ${e.DisconnectReason[t]}`);const i=t===e.DisconnectReason.ClientInitiated||t===e.DisconnectReason.DuplicateIdentity||t===e.DisconnectReason.ParticipantRemoved||t===e.DisconnectReason.RoomDeleted||t===e.DisconnectReason.ServerShutdown;this._state!==e.RoomState.Reconnecting?i?this.cleanup(t):this.attemptReconnect():i&&this.cleanup(t)}async handleSubscriptionCreate(t){const i=this._remoteParticipants.get(t.publisherSid);if(!i){Nr.warn(`Subscription create for unknown publisher ${t.publisherSid}`);const i=new Mr({sid:t.publisherSid,identity:t.publisherSid,state:e.ParticipantState.Joined},{transportManager:this.transportManager,rpc:this.rpcClient,autoSubscribe:this._connectOptions.autoSubscribe});return this._remoteParticipants.set(t.publisherSid,i),this.wireRemoteParticipantEvents(i),i.handleSubscriptionCreate(t)}return i.handleSubscriptionCreate(t)}async handleDataSubscriptionCreate(e){const t=this._remoteParticipants.get(e.publisherSid);return t?t.handleDataSubscriptionCreate(e):(Nr.warn(`Data subscription create for unknown publisher ${e.publisherSid}`),{ok:!1})}handleSubscriptionClosed(e){for(const[,t]of this._remoteParticipants)t.handleSubscriptionClosed(e.subscriptionSid)}handleDataSubscriptionClosed(e){for(const[,t]of this._remoteParticipants)t.handleDataSubscriptionClosed(e.dataSubscriptionSid)}wireRemoteParticipantEvents(t){t.on(e.ParticipantEvent.TrackSubscribed,(i,r)=>{this.emit(e.RoomEvent.TrackSubscribed,i,r,t)}),t.on(e.ParticipantEvent.TrackUnsubscribed,(i,r)=>{this.emit(e.RoomEvent.TrackUnsubscribed,i,r,t)}),t.on(e.ParticipantEvent.TrackPublished,i=>{this.emit(e.RoomEvent.TrackPublished,i,t)}),t.on(e.ParticipantEvent.TrackUnpublished,i=>{this.emit(e.RoomEvent.TrackUnpublished,i,t)}),t.on(e.ParticipantEvent.TrackMuted,i=>{this.emit(e.RoomEvent.TrackMuted,i,t)}),t.on(e.ParticipantEvent.TrackUnmuted,i=>{this.emit(e.RoomEvent.TrackUnmuted,i,t)}),t.on(e.ParticipantEvent.TrackStreamStateChanged,(i,r)=>{this.emit(e.RoomEvent.TrackStreamStateChanged,i,r,t)}),t.on(e.ParticipantEvent.DataReceived,i=>{this.emit(e.RoomEvent.DataReceived,i,t)}),t.on(e.ParticipantEvent.MetadataChanged,(t,i)=>{this.emit(e.RoomEvent.ParticipantMetadataChanged,t,i)}),t.on(e.ParticipantEvent.NameChanged,(t,i)=>{this.emit(e.RoomEvent.ParticipantNameChanged,t,i)}),t.on(e.ParticipantEvent.AttributesChanged,(t,i)=>{this.emit(e.RoomEvent.ParticipantAttributesChanged,t,i)})}wireLocalParticipantEvents(){this._localParticipant&&(this._localParticipant.on(e.ParticipantEvent.LocalTrackPublished,t=>{this.emit(e.RoomEvent.LocalTrackPublished,t,this._localParticipant)}),this._localParticipant.on(e.ParticipantEvent.LocalTrackUnpublished,t=>{this.emit(e.RoomEvent.LocalTrackUnpublished,t,this._localParticipant)}),this._localParticipant.on(e.ParticipantEvent.TrackMuted,t=>{this.emit(e.RoomEvent.TrackMuted,t,this._localParticipant)}),this._localParticipant.on(e.ParticipantEvent.TrackUnmuted,t=>{this.emit(e.RoomEvent.TrackUnmuted,t,this._localParticipant)}),this._localParticipant.on(e.ParticipantEvent.ChatMessage,t=>{const i=t.editTimestamp??t.timestamp;i>this._lastMessageTimestamp&&(this._lastMessageTimestamp=i),this.emit(e.RoomEvent.ChatMessage,t,this._localParticipant)}))}setupDeviceChangeListener(){"undefined"!=typeof navigator&&navigator.mediaDevices&&(this.deviceChangeHandler=()=>{this.emit(e.RoomEvent.MediaDevicesChanged)},navigator.mediaDevices.addEventListener("devicechange",this.deviceChangeHandler))}cleanup(t,i=!0){if(this._state!==e.RoomState.Disconnected){this.setState(e.RoomState.Disconnected),this.stopHeartbeat(),this.stopStatsCollector(),this.rpcClient.close(),this.transportManager.close(),this._localParticipant?.closeAll(!i);for(const[,e]of this._remoteParticipants)e.closeAll();this._remoteParticipants.clear(),this.pageLeaveHandler&&ui()&&(window.removeEventListener("beforeunload",this.pageLeaveHandler),window.removeEventListener("pagehide",this.pageLeaveHandler),window.removeEventListener("freeze",this.pageLeaveHandler),this.pageLeaveHandler=void 0),this.deviceChangeHandler&&"undefined"!=typeof navigator&&navigator.mediaDevices&&(navigator.mediaDevices.removeEventListener("devicechange",this.deviceChangeHandler),this.deviceChangeHandler=void 0),this.emit(e.RoomEvent.Disconnected,t),Nr.info(`Disconnected from room: reason=${e.DisconnectReason[t]}`)}}wireTransportEvents(){this.transportManager.on("connectionFailed",t=>{Nr.warn(`Transport connection failed (${t}), attempting reconnect`),this.handleDisconnect(e.DisconnectReason.MediaFailure)})}setupPageLeaveHandler(){ui()&&(this.pageLeaveHandler=()=>{this.disconnect()},window.addEventListener("beforeunload",this.pageLeaveHandler),window.addEventListener("pagehide",this.pageLeaveHandler),window.addEventListener("freeze",this.pageLeaveHandler))}},e.RpcError=Sr,e.ScreenSharePresets=Fi,e.TextStreamReader=mr,e.TextStreamWriter=gr,e.TimeoutError=m,e.Track=hi,e.TrackPublication=ii,e.TypedEmitter=n,e.VERSION=Lr,e.VideoPreset=Ei,e.VideoPresets=Ai,e.VideoPresets43=ji,e.audioCodecs=["opus","red"],e.compareVersions=yi,e.createAudioAnalyser=function(e,t){const i=new AudioContext,r=i.createMediaStreamSource(new MediaStream([e.mediaStreamTrack])),s=i.createAnalyser();return s.fftSize=t?.fftSize??2048,s.smoothingTimeConstant=t?.smoothingTimeConstant??.8,r.connect(s),{analyser:s,cleanup:()=>{r.disconnect(),s.disconnect(),i.close()}}},e.createLocalAudioTrack=Qi,e.createLocalScreenTracks=Ki,e.createLocalTracks=qi,e.createLocalVideoTrack=Gi,e.defaultAudioCaptureOptions=Li,e.defaultScreenShareEncoding={maxBitrate:3e6,maxFramerate:30},e.defaultVideoCaptureOptions=Mi,e.defaultVideoEncoding=Oi,e.facingModeFromDeviceLabel=wi,e.facingModeFromLocalTrack=function(e){const t=e.mediaStreamTrack?.getSettings();if(t?.facingMode)return t.facingMode;const i=e.mediaStreamTrack?.label;return i?wi(i):void 0},e.getBrowser=Si,e.getEmptyAudioStreamTrack=function(){const e=new AudioContext,t=e.createOscillator(),i=e.createMediaStreamDestination();t.connect(i),t.start();const r=i.stream.getAudioTracks()[0];return t.stop(),e.close(),r},e.getEmptyVideoStreamTrack=function(e=16,t=16){const i=document.createElement("canvas");i.width=e,i.height=t;const r=i.getContext("2d");return r&&(r.fillStyle="black",r.fillRect(0,0,e,t)),i.captureStream(0).getVideoTracks()[0]},e.isBackupVideoCodec=xi,e.isBrowserSupported=function(){return"undefined"!=typeof RTCPeerConnection&&("undefined"!=typeof navigator&&(void 0!==navigator.mediaDevices&&void 0!==navigator.mediaDevices.getUserMedia))},e.isChromiumBased=function(){const e=Si();return!!e&&"Chrome"===e.name&&"iOS"!==e.os},e.isFireFox=fi,e.isMobile=mi,e.isSafari=gi,e.isSafariBased=vi,e.isWeb=ui,e.setLogExtension=function(e){c=e},e.setLogLevel=function(e){d=e},e.setLogger=function(e){o=e},e.supportsAV1=bi,e.supportsAdaptiveStream=function(){return"undefined"!=typeof IntersectionObserver&&"undefined"!=typeof ResizeObserver},e.supportsAudioOutputSelection=function(){return!(!ui()||"undefined"==typeof HTMLMediaElement)&&(!vi()&&"function"==typeof HTMLMediaElement.prototype.setSinkId)},e.supportsDynacast=function(){return"undefined"!=typeof RTCRtpSender&&("function"==typeof RTCRtpSender.prototype.getParameters&&"function"==typeof RTCRtpSender.prototype.setParameters)},e.supportsVP9=_i,e.videoCodecs=["vp8","h264","vp9","av1","h265"],e.videoSimulcastPresets=Ni});
1
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).AxonKit={})}(this,function(e){"use strict";var t,i={exports:{}};function r(){if(t)return i.exports;t=1;var e,r="object"==typeof Reflect?Reflect:null,s=r&&"function"==typeof r.apply?r.apply:function(e,t,i){return Function.prototype.apply.call(e,t,i)};e=r&&"function"==typeof r.ownKeys?r.ownKeys:Object.getOwnPropertySymbols?function(e){return Object.getOwnPropertyNames(e).concat(Object.getOwnPropertySymbols(e))}:function(e){return Object.getOwnPropertyNames(e)};var a=Number.isNaN||function(e){return e!=e};function n(){n.init.call(this)}i.exports=n,i.exports.once=function(e,t){return new Promise(function(i,r){function s(i){e.removeListener(t,a),r(i)}function a(){"function"==typeof e.removeListener&&e.removeListener("error",s),i([].slice.call(arguments))}g(e,t,a,{once:!0}),"error"!==t&&function(e,t,i){"function"==typeof e.on&&g(e,"error",t,i)}(e,s,{once:!0})})},n.EventEmitter=n,n.prototype._events=void 0,n.prototype._eventsCount=0,n.prototype._maxListeners=void 0;var o=10;function c(e){if("function"!=typeof e)throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof e)}function d(e){return void 0===e._maxListeners?n.defaultMaxListeners:e._maxListeners}function p(e,t,i,r){var s,a,n,o;if(c(i),void 0===(a=e._events)?(a=e._events=Object.create(null),e._eventsCount=0):(void 0!==a.newListener&&(e.emit("newListener",t,i.listener?i.listener:i),a=e._events),n=a[t]),void 0===n)n=a[t]=i,++e._eventsCount;else if("function"==typeof n?n=a[t]=r?[i,n]:[n,i]:r?n.unshift(i):n.push(i),(s=d(e))>0&&n.length>s&&!n.warned){n.warned=!0;var p=new Error("Possible EventEmitter memory leak detected. "+n.length+" "+String(t)+" listeners added. Use emitter.setMaxListeners() to increase limit");p.name="MaxListenersExceededWarning",p.emitter=e,p.type=t,p.count=n.length,o=p,console&&console.warn&&console.warn(o)}return e}function l(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,0===arguments.length?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function h(e,t,i){var r={fired:!1,wrapFn:void 0,target:e,type:t,listener:i},s=l.bind(r);return s.listener=i,r.wrapFn=s,s}function u(e,t,i){var r=e._events;if(void 0===r)return[];var s=r[t];return void 0===s?[]:"function"==typeof s?i?[s.listener||s]:[s]:i?function(e){for(var t=new Array(e.length),i=0;i<t.length;++i)t[i]=e[i].listener||e[i];return t}(s):f(s,s.length)}function m(e){var t=this._events;if(void 0!==t){var i=t[e];if("function"==typeof i)return 1;if(void 0!==i)return i.length}return 0}function f(e,t){for(var i=new Array(t),r=0;r<t;++r)i[r]=e[r];return i}function g(e,t,i,r){if("function"==typeof e.on)r.once?e.once(t,i):e.on(t,i);else{if("function"!=typeof e.addEventListener)throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type '+typeof e);e.addEventListener(t,function s(a){r.once&&e.removeEventListener(t,s),i(a)})}}return Object.defineProperty(n,"defaultMaxListeners",{enumerable:!0,get:function(){return o},set:function(e){if("number"!=typeof e||e<0||a(e))throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received '+e+".");o=e}}),n.init=function(){void 0!==this._events&&this._events!==Object.getPrototypeOf(this)._events||(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},n.prototype.setMaxListeners=function(e){if("number"!=typeof e||e<0||a(e))throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received '+e+".");return this._maxListeners=e,this},n.prototype.getMaxListeners=function(){return d(this)},n.prototype.emit=function(e){for(var t=[],i=1;i<arguments.length;i++)t.push(arguments[i]);var r="error"===e,a=this._events;if(void 0!==a)r=r&&void 0===a.error;else if(!r)return!1;if(r){var n;if(t.length>0&&(n=t[0]),n instanceof Error)throw n;var o=new Error("Unhandled error."+(n?" ("+n.message+")":""));throw o.context=n,o}var c=a[e];if(void 0===c)return!1;if("function"==typeof c)s(c,this,t);else{var d=c.length,p=f(c,d);for(i=0;i<d;++i)s(p[i],this,t)}return!0},n.prototype.addListener=function(e,t){return p(this,e,t,!1)},n.prototype.on=n.prototype.addListener,n.prototype.prependListener=function(e,t){return p(this,e,t,!0)},n.prototype.once=function(e,t){return c(t),this.on(e,h(this,e,t)),this},n.prototype.prependOnceListener=function(e,t){return c(t),this.prependListener(e,h(this,e,t)),this},n.prototype.removeListener=function(e,t){var i,r,s,a,n;if(c(t),void 0===(r=this._events))return this;if(void 0===(i=r[e]))return this;if(i===t||i.listener===t)0===--this._eventsCount?this._events=Object.create(null):(delete r[e],r.removeListener&&this.emit("removeListener",e,i.listener||t));else if("function"!=typeof i){for(s=-1,a=i.length-1;a>=0;a--)if(i[a]===t||i[a].listener===t){n=i[a].listener,s=a;break}if(s<0)return this;0===s?i.shift():function(e,t){for(;t+1<e.length;t++)e[t]=e[t+1];e.pop()}(i,s),1===i.length&&(r[e]=i[0]),void 0!==r.removeListener&&this.emit("removeListener",e,n||t)}return this},n.prototype.off=n.prototype.removeListener,n.prototype.removeAllListeners=function(e){var t,i,r;if(void 0===(i=this._events))return this;if(void 0===i.removeListener)return 0===arguments.length?(this._events=Object.create(null),this._eventsCount=0):void 0!==i[e]&&(0===--this._eventsCount?this._events=Object.create(null):delete i[e]),this;if(0===arguments.length){var s,a=Object.keys(i);for(r=0;r<a.length;++r)"removeListener"!==(s=a[r])&&this.removeAllListeners(s);return this.removeAllListeners("removeListener"),this._events=Object.create(null),this._eventsCount=0,this}if("function"==typeof(t=i[e]))this.removeListener(e,t);else if(void 0!==t)for(r=t.length-1;r>=0;r--)this.removeListener(e,t[r]);return this},n.prototype.listeners=function(e){return u(this,e,!0)},n.prototype.rawListeners=function(e){return u(this,e,!1)},n.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):m.call(e,t)},n.prototype.listenerCount=m,n.prototype.eventNames=function(){return this._eventsCount>0?e(this._events):[]},i.exports}var s,a=r();class n extends a.EventEmitter{}e.LogLevel=void 0,(s=e.LogLevel||(e.LogLevel={}))[s.TRACE=0]="TRACE",s[s.DEBUG=1]="DEBUG",s[s.INFO=2]="INFO",s[s.WARN=3]="WARN",s[s.ERROR=4]="ERROR",s[s.SILENT=5]="SILENT";let o,c,d=e.LogLevel.INFO;function p(t){const i=`[AxonKit:${t}]`,r=()=>{};return new Proxy({},{get(t,s){const a={trace:[e.LogLevel.TRACE,console.debug],debug:[e.LogLevel.DEBUG,console.debug],info:[e.LogLevel.INFO,console.info],warn:[e.LogLevel.WARN,console.warn],error:[e.LogLevel.ERROR,console.error]}[s];if(!a)return;const[n,p]=a;return d>n?r:o||c?function(t,r){return(s,...a)=>{if(d>t)return;const n=`${i} ${s}`;if(c)try{c(t,n,a.length>0?{args:a}:{})}catch{}if(o){const i=e.LogLevel[t].toLowerCase();o[i](n,...a)}else r(n,...a)}}(n,p):p.bind(console,i)}})}var l;e.ErrorCode=void 0,(l=e.ErrorCode||(e.ErrorCode={}))[l.OK=200]="OK",l[l.BadRequest=400]="BadRequest",l[l.Unauthorized=401]="Unauthorized",l[l.Forbidden=403]="Forbidden",l[l.NotFound=404]="NotFound",l[l.Conflict=409]="Conflict",l[l.InternalError=500]="InternalError";class h extends Error{constructor(e,t,i){super(t),this.name="AxonError",this.code=e,this.logId=i}static fromStatus(t,i,r){const s=Object.values(e.ErrorCode).includes(t)?t:e.ErrorCode.InternalError;return new h(s,i,r)}}class u extends Error{constructor(e,t){super(e),this.name="ConnectionError",this.status=t}}class m extends Error{constructor(e="Request timed out"){super(e),this.name="TimeoutError"}}const f=p("SignalClient");function g(e){return e&&"iceParameters"in e&&!("participant"in e)&&!e.fullReconnect}class v{constructor(){this.nodeId="",this.logId=""}get currentNodeId(){return this.nodeId}get currentLogId(){return this.logId}async join(e,t){const i=new URL(`${e}/rtc/join`);t.room.name&&i.searchParams.set("room",t.room.name);const r=i.toString();f.info(`Joining room at ${r}`);const s=await fetch(r,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({payload:JSON.stringify(t)})});if(!s.ok){const e=await s.text().catch(()=>"");throw new u(`Join failed: ${s.status} ${s.statusText} ${e}`,s.status)}const a=await s.json();return this.logId=s.headers.get("X-Log-Id")??"",g(a)?f.info("Received ICE restart response"):(this.nodeId=a.serverInfo.nodeId,f.info(`Joined room ${a.room.name}, nodeId=${this.nodeId}`)),{response:a,logId:this.logId}}async connect(e,t,i){const r=new URL(`${e}/rtc/connect`);i&&r.searchParams.set("room",i);const s=r.toString();f.info(`Connecting transports at ${s}`);const a=await fetch(s,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({payload:JSON.stringify(t)})});if(!a.ok){const e=await a.text().catch(()=>"");throw new u(`Connect failed: ${a.status} ${a.statusText} ${e}`,a.status)}f.info("Transport connect succeeded")}}let b=0;const _="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function y(){return b++,`${function(e){let t="";for(let i=0;i<e;i++)t+=_[Math.floor(62*Math.random())];return t}(6)}${b.toString(36)}`}const S="\r\n",w=new Uint8Array([13,10]),k="AXON/1.0",T=new TextEncoder,C=new TextDecoder;var P;function R(e,t){for(let i=t;i<e.byteLength-1;i++)if(13===e[i]&&10===e[i+1])return i;return-1}function E(e){let t;switch(e.type){case P.REQ:t=`REQ ${e.method} ${e.logId}`;break;case P.RES:t=`RES ${e.logId} ${e.status}`;break;case P.MSG:t=e.logId?`MSG ${e.method} ${e.logId}`:`MSG ${e.method}`}const i=[T.encode(t),w];return e.headers&&Object.keys(e.headers).length>0&&i.push(function(e){let t=`${k}${S}`;for(const[i,r]of Object.entries(e))t+=`${i}: ${r}${S}`;return t+=S,T.encode(t)}(e.headers)),e.body&&e.body.byteLength>0&&i.push(e.body),function(...e){let t=0;for(const i of e)t+=i.byteLength;const i=new Uint8Array(t);let r=0;for(const t of e)i.set(t,r),r+=t.byteLength;return i}(...i)}function D(e){if(!e.body||0===e.body.byteLength)return;const t=C.decode(e.body);return JSON.parse(t)}function x(e){return T.encode(JSON.stringify(e))}!function(e){e.REQ="REQ",e.RES="RES",e.MSG="MSG"}(P||(P={}));const I=p("RPCClient");class M extends n{constructor(){super(...arguments),this.sendDC=null,this.pending=new Map,this.requestHandlers=new Map,this.notificationHandlers=new Map,this.closed=!1,this.lastSentAt=0}bind(e,t){this.sendDC=e,t.on("message",e=>{this.handleMessage(e)}),t.on("close",()=>{I.warn("Receive DataChannel closed")})}async request(e,t,i=1e4){if(this.closed||!this.sendDC)throw new Error("RPCClient is closed or not bound");const r=y(),s={type:P.REQ,method:e,logId:r,body:t?x(t):void 0};return"ping"!==e&&I.debug(`REQ ${e} logId=${r} body=${JSON.stringify(t)}`),new Promise((t,a)=>{const n=setTimeout(()=>{this.pending.delete(r),a(new m(`RPC ${e} timed out after ${i}ms`))},i);this.pending.set(r,{resolve:t,reject:a,timer:n,method:e});try{const e=E(s);this.sendDC.send(e),this.lastSentAt=Date.now()}catch(e){clearTimeout(n),this.pending.delete(r),a(e instanceof Error?e:new Error(String(e)))}})}respond(e,t,i,r){if(this.closed||!this.sendDC)return;const s={type:P.RES,logId:e,status:t,headers:r,body:i?x(i):void 0};I.debug(`RES logId=${e} status=${t} body=${JSON.stringify(i)}`),this.sendDC.send(E(s)),this.lastSentAt=Date.now()}notify(e,t){if(this.closed||!this.sendDC)return;const i={type:P.MSG,method:e,body:t?x(t):void 0};this.sendDC.send(E(i)),this.lastSentAt=Date.now()}onRequest(e,t){this.requestHandlers.set(e,t)}onNotification(e,t){this.notificationHandlers.set(e,t)}close(){this.closed=!0;for(const[e,t]of this.pending)clearTimeout(t.timer),t.reject(new Error("RPCClient closed")),this.pending.delete(e);this.requestHandlers.clear(),this.notificationHandlers.clear(),this.sendDC=null}handleMessage(e){try{const t=function(e){const t=e instanceof Uint8Array?e:new Uint8Array(e),i=R(t,0);if(i<0)throw new Error("Invalid Axon message: no CRLF found");const r=C.decode(t.subarray(0,i)),s=r.split(" ");if(s.length<2)throw new Error(`Invalid Axon message first line: ${r}`);const a={type:s[0]};switch(a.type){case P.REQ:a.method=s[1],a.logId=s[2];break;case P.RES:a.logId=s[1],a.status=parseInt(s[2],10);break;case P.MSG:a.method=s[1],a.logId=s.length>2?s[2]:void 0;break;default:throw new Error(`Unknown message type: ${s[0]}`)}let n=i+2;if(C.decode(t.subarray(n,Math.min(n+8,t.byteLength))).startsWith(k))for(a.headers={},n+=10;n<t.byteLength;){const e=R(t,n);if(e<0)break;if(e===n){n+=2;break}const i=C.decode(t.subarray(n,e)),r=i.indexOf(": ");r>0&&(a.headers[i.substring(0,r)]=i.substring(r+2)),n=e+2}return n<t.byteLength&&(a.body=t.subarray(n)),a}("string"==typeof e?(new TextEncoder).encode(e):new Uint8Array(e));switch(t.type){case P.RES:this.handleResponse(t);break;case P.REQ:this.handleIncomingRequest(t);break;case P.MSG:this.handleNotification(t)}}catch(e){I.error("Failed to handle message",e),this.emit("error",e instanceof Error?e:new Error(String(e)))}}handleResponse(e){const t=e.logId;if(!t)return;const i=this.pending.get(t);if(!i)return void I.warn(`Received response for unknown logId=${t}`);if(this.pending.delete(t),clearTimeout(i.timer),e.status&&e.status>=400){const r=e.headers?.Error??`RPC error status=${e.status}`;return void i.reject(h.fromStatus(e.status,r,t))}const r=D(e);"ping"!==i.method&&I.debug(`RES ${i.method} logId=${t} status=${e.status} body=${JSON.stringify(r)}`),i.resolve(r)}async handleIncomingRequest(e){const t=e.method;if(!t)return;const i=this.requestHandlers.get(t);if(!i)return I.warn(`No handler for server request: ${t}`),void(e.logId&&this.respond(e.logId,404,void 0,{Error:"No handler"}));try{const r=D(e);I.debug(`Incoming REQ ${t} logId=${e.logId} body=${JSON.stringify(r)}`);const s=await i(r);e.logId&&this.respond(e.logId,200,s)}catch(i){I.error(`Handler error for ${t}`,i),e.logId&&this.respond(e.logId,500,void 0,{Error:i instanceof Error?i.message:String(i)})}}handleNotification(e){const t=e.method;if(!t)return;const i=this.notificationHandlers.get(t);if(i)try{const r=D(e);I.debug(`MSG ${t} logId=${e.logId} body=${JSON.stringify(r)}`),i(r)}catch(e){I.error(`Notification handler error for ${t}`,e)}else I.debug(`No handler for notification: ${t}`)}}var L,O,A,j,F,N={},$={exports:{}};function U(){if(O)return L;O=1;var e=1e3,t=60*e,i=60*t,r=24*i,s=7*r,a=365.25*r;function n(e,t,i,r){var s=t>=1.5*i;return Math.round(e/i)+" "+r+(s?"s":"")}return L=function(o,c){c=c||{};var d=typeof o;if("string"===d&&o.length>0)return function(n){if((n=String(n)).length>100)return;var o=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(n);if(!o)return;var c=parseFloat(o[1]);switch((o[2]||"ms").toLowerCase()){case"years":case"year":case"yrs":case"yr":case"y":return c*a;case"weeks":case"week":case"w":return c*s;case"days":case"day":case"d":return c*r;case"hours":case"hour":case"hrs":case"hr":case"h":return c*i;case"minutes":case"minute":case"mins":case"min":case"m":return c*t;case"seconds":case"second":case"secs":case"sec":case"s":return c*e;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return c;default:return}}(o);if("number"===d&&isFinite(o))return c.long?function(s){var a=Math.abs(s);if(a>=r)return n(s,a,r,"day");if(a>=i)return n(s,a,i,"hour");if(a>=t)return n(s,a,t,"minute");if(a>=e)return n(s,a,e,"second");return s+" ms"}(o):function(s){var a=Math.abs(s);if(a>=r)return Math.round(s/r)+"d";if(a>=i)return Math.round(s/i)+"h";if(a>=t)return Math.round(s/t)+"m";if(a>=e)return Math.round(s/e)+"s";return s+"ms"}(o);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(o))}}function B(){return F||(F=1,function(e,t){t.formatArgs=function(t){if(t[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+t[0]+(this.useColors?"%c ":" ")+"+"+e.exports.humanize(this.diff),!this.useColors)return;const i="color: "+this.color;t.splice(1,0,i,"color: inherit");let r=0,s=0;t[0].replace(/%[a-zA-Z%]/g,e=>{"%%"!==e&&(r++,"%c"===e&&(s=r))}),t.splice(s,0,i)},t.save=function(e){try{e?t.storage.setItem("debug",e):t.storage.removeItem("debug")}catch(e){}},t.load=function(){let e;try{e=t.storage.getItem("debug")||t.storage.getItem("DEBUG")}catch(e){}!e&&"undefined"!=typeof process&&"env"in process&&(e=process.env.DEBUG);return e},t.useColors=function(){if("undefined"!=typeof window&&window.process&&("renderer"===window.process.type||window.process.__nwjs))return!0;if("undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))return!1;let e;return"undefined"!=typeof document&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||"undefined"!=typeof window&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||"undefined"!=typeof navigator&&navigator.userAgent&&(e=navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/))&&parseInt(e[1],10)>=31||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)},t.storage=function(){try{return localStorage}catch(e){}}(),t.destroy=(()=>{let e=!1;return()=>{e||(e=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})(),t.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"],t.log=console.debug||console.log||(()=>{}),e.exports=(j||(j=1,A=function(e){function t(e){let r,s,a,n=null;function o(...e){if(!o.enabled)return;const i=o,s=Number(new Date),a=s-(r||s);i.diff=a,i.prev=r,i.curr=s,r=s,e[0]=t.coerce(e[0]),"string"!=typeof e[0]&&e.unshift("%O");let n=0;e[0]=e[0].replace(/%([a-zA-Z%])/g,(r,s)=>{if("%%"===r)return"%";n++;const a=t.formatters[s];if("function"==typeof a){const t=e[n];r=a.call(i,t),e.splice(n,1),n--}return r}),t.formatArgs.call(i,e),(i.log||t.log).apply(i,e)}return o.namespace=e,o.useColors=t.useColors(),o.color=t.selectColor(e),o.extend=i,o.destroy=t.destroy,Object.defineProperty(o,"enabled",{enumerable:!0,configurable:!1,get:()=>null!==n?n:(s!==t.namespaces&&(s=t.namespaces,a=t.enabled(e)),a),set:e=>{n=e}}),"function"==typeof t.init&&t.init(o),o}function i(e,i){const r=t(this.namespace+(void 0===i?":":i)+e);return r.log=this.log,r}function r(e,t){let i=0,r=0,s=-1,a=0;for(;i<e.length;)if(r<t.length&&(t[r]===e[i]||"*"===t[r]))"*"===t[r]?(s=r,a=i,r++):(i++,r++);else{if(-1===s)return!1;r=s+1,a++,i=a}for(;r<t.length&&"*"===t[r];)r++;return r===t.length}return t.debug=t,t.default=t,t.coerce=function(e){return e instanceof Error?e.stack||e.message:e},t.disable=function(){const e=[...t.names,...t.skips.map(e=>"-"+e)].join(",");return t.enable(""),e},t.enable=function(e){t.save(e),t.namespaces=e,t.names=[],t.skips=[];const i=("string"==typeof e?e:"").trim().replace(/\s+/g,",").split(",").filter(Boolean);for(const e of i)"-"===e[0]?t.skips.push(e.slice(1)):t.names.push(e)},t.enabled=function(e){for(const i of t.skips)if(r(e,i))return!1;for(const i of t.names)if(r(e,i))return!0;return!1},t.humanize=U(),t.destroy=function(){console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")},Object.keys(e).forEach(i=>{t[i]=e[i]}),t.names=[],t.skips=[],t.formatters={},t.selectColor=function(e){let i=0;for(let t=0;t<e.length;t++)i=(i<<5)-i+e.charCodeAt(t),i|=0;return t.colors[Math.abs(i)%t.colors.length]},t.enable(t.load()),t}),A)(t);const{formatters:i}=e.exports;i.j=function(e){try{return JSON.stringify(e)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}}}($,$.exports)),$.exports}var z,V={};var H,q={},Q={};function G(){if(H)return Q;H=1,Object.defineProperty(Q,"__esModule",{value:!0}),Q.Logger=void 0;const e=B(),t="mediasoup-client";return Q.Logger=class{_debug;_warn;_error;constructor(i){i?(this._debug=(0,e.default)(`${t}:${i}`),this._warn=(0,e.default)(`${t}:WARN:${i}`),this._error=(0,e.default)(`${t}:ERROR:${i}`)):(this._debug=(0,e.default)(t),this._warn=(0,e.default)(`${t}:WARN`),this._error=(0,e.default)(`${t}:ERROR`)),this._debug.log=console.info.bind(console),this._warn.log=console.warn.bind(console),this._error.log=console.error.bind(console)}get debug(){return this._debug}get warn(){return this._warn}get error(){return this._error}},Q}var K,W={};function J(){if(K)return W;K=1,Object.defineProperty(W,"__esModule",{value:!0}),W.EnhancedEventEmitter=void 0;const e=r(),t=new(G().Logger)("EnhancedEventEmitter");class i extends e.EventEmitter{constructor(){super(),this.setMaxListeners(1/0)}close(){super.removeAllListeners()}emit(e,...t){return super.emit(e,...t)}safeEmit(e,...i){try{return super.emit(e,...i)}catch(i){t.error("safeEmit() | event listener threw an error [eventName:%s]:%o",e,i);try{super.emit("listenererror",e,i)}catch(e){}return Boolean(super.listenerCount(e))}}on(e,t){return super.on(e,t),this}off(e,t){return super.off(e,t),this}addListener(e,t){return super.on(e,t),this}prependListener(e,t){return super.prependListener(e,t),this}once(e,t){return super.once(e,t),this}prependOnceListener(e,t){return super.prependOnceListener(e,t),this}removeListener(e,t){return super.off(e,t),this}removeAllListeners(e){return super.removeAllListeners(e),this}listenerCount(e){return super.listenerCount(e)}listeners(e){return super.listeners(e)}rawListeners(e){return super.rawListeners(e)}}return W.EnhancedEventEmitter=i,W}var Y,X={};function Z(){if(Y)return X;Y=1,Object.defineProperty(X,"__esModule",{value:!0}),X.InvalidStateError=X.UnsupportedError=void 0;class e extends Error{constructor(t){super(t),this.name="UnsupportedError",Error.hasOwnProperty("captureStackTrace")?Error.captureStackTrace(this,e):this.stack=new Error(t).stack}}X.UnsupportedError=e;class t extends Error{constructor(e){super(e),this.name="InvalidStateError",Error.hasOwnProperty("captureStackTrace")?Error.captureStackTrace(this,t):this.stack=new Error(e).stack}}return X.InvalidStateError=t,X}var ee,te={};function ie(){if(ee)return te;return ee=1,Object.defineProperty(te,"__esModule",{value:!0}),te.clone=function(e){return void 0===e?void 0:Number.isNaN(e)?NaN:"function"==typeof structuredClone?structuredClone(e):JSON.parse(JSON.stringify(e))},te.generateRandomNumber=function(){return Math.round(1e7*Math.random())},te.deepFreeze=function e(t){const i=Reflect.ownKeys(t);for(const r of i){const i=t[r];(i&&"object"==typeof i||"function"==typeof i)&&e(i)}return Object.freeze(t)},te}var re,se,ae,ne={},oe={},ce={};function de(){if(se)return oe;se=1,Object.defineProperty(oe,"__esModule",{value:!0}),oe.ProfileLevelId=oe.Level=oe.Profile=void 0,oe.parseProfileLevelId=d,oe.profileLevelIdToString=p,oe.profileToString=function(i){switch(i){case t.ConstrainedBaseline:return"ConstrainedBaseline";case t.Baseline:return"Baseline";case t.Main:return"Main";case t.ConstrainedHigh:return"ConstrainedHigh";case t.High:return"High";case t.PredictiveHigh444:return"PredictiveHigh444";default:return void e.warn(`profileToString() | unrecognized profile ${i}`)}},oe.levelToString=function(t){switch(t){case i.L1_b:return"1b";case i.L1:return"1";case i.L1_1:return"1.1";case i.L1_2:return"1.2";case i.L1_3:return"1.3";case i.L2:return"2";case i.L2_1:return"2.1";case i.L2_2:return"2.2";case i.L3:return"3";case i.L3_1:return"3.1";case i.L3_2:return"3.2";case i.L4:return"4";case i.L4_1:return"4.1";case i.L4_2:return"4.2";case i.L5:return"5";case i.L5_1:return"5.1";case i.L5_2:return"5.2";default:return void e.warn(`levelToString() | unrecognized level ${t}`)}},oe.parseSdpProfileLevelId=l,oe.isSameProfile=function(e={},t={}){const i=l(e),r=l(t);return Boolean(i&&r&&i.profile===r.profile)},oe.isSameProfileAndLevel=function(e={},t={}){const i=l(e),r=l(t);return Boolean(i&&r&&i.profile===r.profile&&i.level==r.level)},oe.generateProfileLevelIdStringForAnswer=function(t={},s={}){if(!t["profile-level-id"]&&!s["profile-level-id"])return void e.warn("generateProfileLevelIdStringForAnswer() | profile-level-id missing in local and remote params");const a=l(t),n=l(s);if(!a)throw new TypeError("invalid local_profile_level_id");if(!n)throw new TypeError("invalid remote_profile_level_id");if(a.profile!==n.profile)throw new TypeError("H264 Profile mismatch");const o=u(t)&&u(s),c=a.level,d=n.level,h=(f=c,g=d,function(e,t){return e===i.L1_b?t!==i.L1&&t!==i.L1_b:t===i.L1_b?e!==i.L1:e<t}(f,g)?f:g),m=o?c:h;var f,g;return e.debug(`generateProfileLevelIdStringForAnswer() | result [profile:${a.profile}, level:${m}]`),p(new r(a.profile,m))},oe.supportedLevel=function(t,i){for(let r=c.length-1;r>=0;--r){const s=c[r];if(256*s.max_macroblock_frame_size<=t&&s.max_macroblocks_per_second<=i*s.max_macroblock_frame_size)return e.debug(`supportedLevel() | result [max_frame_pixel_count:${t}, max_fps:${i}, level:${s.level}]`),s.level}return void e.warn(`supportedLevel() | no level supported [max_frame_pixel_count:${t}, max_fps:${i}]`)};const e=new(function(){if(re)return ce;re=1,Object.defineProperty(ce,"__esModule",{value:!0}),ce.Logger=void 0;const e=B(),t="h264-profile-level-id";return ce.Logger=class{_debug;_warn;_error;constructor(i){i?(this._debug=(0,e.default)(`${t}:${i}`),this._warn=(0,e.default)(`${t}:WARN:${i}`),this._error=(0,e.default)(`${t}:ERROR:${i}`)):(this._debug=(0,e.default)(t),this._warn=(0,e.default)(`${t}:WARN`),this._error=(0,e.default)(`${t}:ERROR`)),this._debug.log=console.info.bind(console),this._warn.log=console.warn.bind(console),this._error.log=console.error.bind(console)}get debug(){return this._debug}get warn(){return this._warn}get error(){return this._error}},ce}().Logger);var t,i;!function(e){e[e.ConstrainedBaseline=1]="ConstrainedBaseline",e[e.Baseline=2]="Baseline",e[e.Main=3]="Main",e[e.ConstrainedHigh=4]="ConstrainedHigh",e[e.High=5]="High",e[e.PredictiveHigh444=6]="PredictiveHigh444"}(t||(oe.Profile=t={})),function(e){e[e.L1_b=0]="L1_b",e[e.L1=10]="L1",e[e.L1_1=11]="L1_1",e[e.L1_2=12]="L1_2",e[e.L1_3=13]="L1_3",e[e.L2=20]="L2",e[e.L2_1=21]="L2_1",e[e.L2_2=22]="L2_2",e[e.L3=30]="L3",e[e.L3_1=31]="L3_1",e[e.L3_2=32]="L3_2",e[e.L4=40]="L4",e[e.L4_1=41]="L4_1",e[e.L4_2=42]="L4_2",e[e.L5=50]="L5",e[e.L5_1=51]="L5_1",e[e.L5_2=52]="L5_2"}(i||(oe.Level=i={}));class r{profile;level;constructor(e,t){this.profile=e,this.level=t}}oe.ProfileLevelId=r;const s=new r(t.ConstrainedBaseline,i.L3_1);class a{mask;masked_value;constructor(e){this.mask=~h("x",e),this.masked_value=h("1",e)}isMatch(e){return this.masked_value===(e&this.mask)}}class n{profile_idc;profile_iop;profile;constructor(e,t,i){this.profile_idc=e,this.profile_iop=t,this.profile=i}}const o=[new n(66,new a("x1xx0000"),t.ConstrainedBaseline),new n(77,new a("1xxx0000"),t.ConstrainedBaseline),new n(88,new a("11xx0000"),t.ConstrainedBaseline),new n(66,new a("x0xx0000"),t.Baseline),new n(88,new a("10xx0000"),t.Baseline),new n(77,new a("0x0x0000"),t.Main),new n(100,new a("00000000"),t.High),new n(100,new a("00001100"),t.ConstrainedHigh),new n(244,new a("00000000"),t.PredictiveHigh444)],c=[{max_macroblocks_per_second:1485,max_macroblock_frame_size:99,level:i.L1},{max_macroblocks_per_second:1485,max_macroblock_frame_size:99,level:i.L1_b},{max_macroblocks_per_second:3e3,max_macroblock_frame_size:396,level:i.L1_1},{max_macroblocks_per_second:6e3,max_macroblock_frame_size:396,level:i.L1_2},{max_macroblocks_per_second:11880,max_macroblock_frame_size:396,level:i.L1_3},{max_macroblocks_per_second:11880,max_macroblock_frame_size:396,level:i.L2},{max_macroblocks_per_second:19800,max_macroblock_frame_size:792,level:i.L2_1},{max_macroblocks_per_second:20250,max_macroblock_frame_size:1620,level:i.L2_2},{max_macroblocks_per_second:40500,max_macroblock_frame_size:1620,level:i.L3},{max_macroblocks_per_second:108e3,max_macroblock_frame_size:3600,level:i.L3_1},{max_macroblocks_per_second:216e3,max_macroblock_frame_size:5120,level:i.L3_2},{max_macroblocks_per_second:245760,max_macroblock_frame_size:8192,level:i.L4},{max_macroblocks_per_second:245760,max_macroblock_frame_size:8192,level:i.L4_1},{max_macroblocks_per_second:522240,max_macroblock_frame_size:8704,level:i.L4_2},{max_macroblocks_per_second:589824,max_macroblock_frame_size:22080,level:i.L5},{max_macroblocks_per_second:983040,max_macroblock_frame_size:36864,level:i.L5_1},{max_macroblocks_per_second:2073600,max_macroblock_frame_size:36864,level:i.L5_2}];function d(t){if("string"!=typeof t||6!==t.length)return;const s=parseInt(t,16);if(0===s)return;const a=255&s,n=s>>8&255,c=s>>16&255;let d;switch(a){case i.L1_1:d=16&n?i.L1_b:i.L1_1;break;case i.L1:case i.L1_2:case i.L1_3:case i.L2:case i.L2_1:case i.L2_2:case i.L3:case i.L3_1:case i.L3_2:case i.L4:case i.L4_1:case i.L4_2:case i.L5:case i.L5_1:case i.L5_2:d=a;break;default:return void e.warn(`parseProfileLevelId() | unrecognized level_idc [str:${t}, level_idc:${a}]`)}for(const i of o)if(c===i.profile_idc&&i.profile_iop.isMatch(n))return e.debug(`parseProfileLevelId() | result [str:${t}, profile:${i.profile}, level:${d}]`),new r(i.profile,d);e.warn(`parseProfileLevelId() | unrecognized profile_idc/profile_iop combination [str:${t}, profile_idc:${c}, profile_iop:${n}]`)}function p(r){if(r.level==i.L1_b)switch(r.profile){case t.ConstrainedBaseline:return"42f00b";case t.Baseline:return"42100b";case t.Main:return"4d100b";default:return void e.warn(`profileLevelIdToString() | Level 1_b not is allowed for profile ${r.profile}`)}let s;switch(r.profile){case t.ConstrainedBaseline:s="42e0";break;case t.Baseline:s="4200";break;case t.Main:s="4d00";break;case t.ConstrainedHigh:s="640c";break;case t.High:s="6400";break;case t.PredictiveHigh444:s="f400";break;default:return void e.warn(`profileLevelIdToString() | unrecognized profile ${r.profile}`)}let a=r.level.toString(16);return 1===a.length&&(a=`0${a}`),`${s}${a}`}function l(e={}){const t=e["profile-level-id"];return t?d(t):s}function h(e,t){return Number(t[0]===e)<<7|Number(t[1]===e)<<6|Number(t[2]===e)<<5|Number(t[3]===e)<<4|Number(t[4]===e)<<3|Number(t[5]===e)<<2|Number(t[6]===e)<<1|Number(t[7]===e)}function u(e={}){const t=e["level-asymmetry-allowed"];return!0===t||1===t||"1"===t}return oe}function pe(){if(ae)return ne;ae=1,Object.defineProperty(ne,"__esModule",{value:!0}),ne.validateAndNormalizeRtpCapabilities=function(e){if("object"!=typeof e)throw new TypeError("caps is not an object");if(e.codecs&&!Array.isArray(e.codecs))throw new TypeError("caps.codecs is not an array");e.codecs||(e.codecs=[]);for(const t of e.codecs)n(t);if(e.headerExtensions&&!Array.isArray(e.headerExtensions))throw new TypeError("caps.headerExtensions is not an array");e.headerExtensions||(e.headerExtensions=[]);for(const t of e.headerExtensions)c(t)},ne.validateAndNormalizeRtpParameters=a,ne.validateAndNormalizeSctpStreamParameters=function(e){if("object"!=typeof e)throw new TypeError("params is not an object");if("number"!=typeof e.streamId)throw new TypeError("missing params.streamId");let t=!1;"boolean"==typeof e.ordered?t=!0:e.ordered=!0;if(e.maxPacketLifeTime&&"number"!=typeof e.maxPacketLifeTime)throw new TypeError("invalid params.maxPacketLifeTime");if(e.maxRetransmits&&"number"!=typeof e.maxRetransmits)throw new TypeError("invalid params.maxRetransmits");if(e.maxPacketLifeTime&&e.maxRetransmits)throw new TypeError("cannot provide both maxPacketLifeTime and maxRetransmits");if(t&&e.ordered&&(e.maxPacketLifeTime||e.maxRetransmits))throw new TypeError("cannot be ordered with maxPacketLifeTime or maxRetransmits");t||!e.maxPacketLifeTime&&!e.maxRetransmits||(e.ordered=!1);if(e.label&&"string"!=typeof e.label)throw new TypeError("invalid params.label");if(e.protocol&&"string"!=typeof e.protocol)throw new TypeError("invalid params.protocol")},ne.validateSctpCapabilities=function(e){if("object"!=typeof e)throw new TypeError("caps is not an object");if(!e.numStreams||"object"!=typeof e.numStreams)throw new TypeError("missing caps.numStreams");!function(e){if("object"!=typeof e)throw new TypeError("numStreams is not an object");if("number"!=typeof e.OS)throw new TypeError("missing numStreams.OS");if("number"!=typeof e.MIS)throw new TypeError("missing numStreams.MIS")}(e.numStreams)},ne.getExtendedRtpCapabilities=function(e,t,i){const r={codecs:[],headerExtensions:[]};if(i)for(const i of e.codecs??[]){if(u(i))continue;const e=(t.codecs??[]).find(e=>m(e,i,{strict:!0,modify:!0}));if(!e)continue;const s={kind:i.kind,mimeType:i.mimeType,clockRate:i.clockRate,channels:i.channels,localPayloadType:i.preferredPayloadType,localRtxPayloadType:void 0,remotePayloadType:e.preferredPayloadType,remoteRtxPayloadType:void 0,localParameters:i.parameters??{},remoteParameters:e.parameters??{},rtcpFeedback:g(i,e)};r.codecs.push(s)}else for(const i of t.codecs??[]){if(u(i))continue;const t=(e.codecs??[]).find(e=>m(e,i,{strict:!0,modify:!0}));if(!t)continue;const s={kind:t.kind,mimeType:t.mimeType,clockRate:t.clockRate,channels:t.channels,localPayloadType:t.preferredPayloadType,localRtxPayloadType:void 0,remotePayloadType:i.preferredPayloadType,remoteRtxPayloadType:void 0,localParameters:t.parameters??{},remoteParameters:i.parameters??{},rtcpFeedback:g(t,i)};r.codecs.push(s)}for(const i of r.codecs){const r=e.codecs.find(e=>u(e)&&e.parameters?.apt===i.localPayloadType),s=t.codecs.find(e=>u(e)&&e.parameters?.apt===i.remotePayloadType);r&&s&&(i.localRtxPayloadType=r.preferredPayloadType,i.remoteRtxPayloadType=s.preferredPayloadType)}for(const i of t.headerExtensions){const t=e.headerExtensions.find(e=>f(e,i));if(!t)continue;const s={kind:i.kind,uri:i.uri,sendId:t.preferredId,recvId:i.preferredId,encrypt:t.preferredEncrypt??!1,direction:"sendrecv"};switch(i.direction){case"sendrecv":s.direction="sendrecv";break;case"recvonly":s.direction="sendonly";break;case"sendonly":s.direction="recvonly";break;case"inactive":s.direction="inactive"}r.headerExtensions.push(s)}return r},ne.getRecvRtpCapabilities=function(e){return h({direction:"recvonly",extendedRtpCapabilities:e})},ne.getSendRtpCapabilities=function(e){return h({direction:"sendonly",extendedRtpCapabilities:e})},ne.getSendingRtpParameters=function(e,t){const i={mid:void 0,codecs:[],headerExtensions:[],encodings:[],rtcp:{}};for(const r of t.codecs){if(r.kind!==e)continue;const t={mimeType:r.mimeType,payloadType:r.localPayloadType,clockRate:r.clockRate,channels:r.channels,parameters:r.localParameters,rtcpFeedback:r.rtcpFeedback};if(i.codecs.push(t),r.localRtxPayloadType){const e={mimeType:`${r.kind}/rtx`,payloadType:r.localRtxPayloadType,clockRate:r.clockRate,parameters:{apt:r.localPayloadType},rtcpFeedback:[]};i.codecs.push(e)}}for(const r of t.headerExtensions){if(r.kind&&r.kind!==e||"sendrecv"!==r.direction&&"sendonly"!==r.direction)continue;const t={uri:r.uri,id:r.sendId,encrypt:r.encrypt,parameters:{}};i.headerExtensions.push(t)}return i},ne.getSendingRemoteRtpParameters=function(e,t){const i={mid:void 0,codecs:[],headerExtensions:[],encodings:[],rtcp:{}};for(const r of t.codecs){if(r.kind!==e)continue;const t={mimeType:r.mimeType,payloadType:r.localPayloadType,clockRate:r.clockRate,channels:r.channels,parameters:r.remoteParameters,rtcpFeedback:r.rtcpFeedback};if(i.codecs.push(t),r.localRtxPayloadType){const e={mimeType:`${r.kind}/rtx`,payloadType:r.localRtxPayloadType,clockRate:r.clockRate,parameters:{apt:r.localPayloadType},rtcpFeedback:[]};i.codecs.push(e)}}for(const r of t.headerExtensions){if(r.kind&&r.kind!==e||"sendrecv"!==r.direction&&"sendonly"!==r.direction)continue;const t={uri:r.uri,id:r.sendId,encrypt:r.encrypt,parameters:{}};i.headerExtensions.push(t)}if(i.headerExtensions.some(e=>"http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01"===e.uri))for(const e of i.codecs)e.rtcpFeedback=(e.rtcpFeedback??[]).filter(e=>"goog-remb"!==e.type);else if(i.headerExtensions.some(e=>"http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time"===e.uri))for(const e of i.codecs)e.rtcpFeedback=(e.rtcpFeedback??[]).filter(e=>"transport-cc"!==e.type);else for(const e of i.codecs)e.rtcpFeedback=(e.rtcpFeedback??[]).filter(e=>"transport-cc"!==e.type&&"goog-remb"!==e.type);return i},ne.reduceCodecs=function(e,t){const i=[];if(t){for(let r=0;r<e.length;++r)if(m(e[r],t,{strict:!0})){i.push(e[r]),u(e[r+1])&&i.push(e[r+1]);break}if(0===i.length)throw new TypeError("no matching codec found")}else i.push(e[0]),u(e[1])&&i.push(e[1]);return i},ne.generateProbatorRtpParameters=function(e){a(e=t.clone(e));const n={mid:i,codecs:[],headerExtensions:[],encodings:[{ssrc:r}],rtcp:{cname:"probator"}};return n.codecs.push(e.codecs[0]),n.codecs[0].payloadType=s,n.headerExtensions=e.headerExtensions,n},ne.canSend=function(e,t){return(t.codecs??[]).some(t=>t.kind===e)},ne.canReceive=function(e,t){if(a(e),0===e.codecs.length)return!1;const i=e.codecs[0];return(t.codecs??[]).some(e=>e.preferredPayloadType===i.payloadType)};const e=de(),t=ie(),i="probator",r=1234,s=127;function a(e){if("object"!=typeof e)throw new TypeError("params is not an object");if(e.mid&&"string"!=typeof e.mid)throw new TypeError("params.mid is not a string");if(!Array.isArray(e.codecs))throw new TypeError("missing params.codecs");for(const t of e.codecs)d(t);if(e.headerExtensions&&!Array.isArray(e.headerExtensions))throw new TypeError("params.headerExtensions is not an array");e.headerExtensions||(e.headerExtensions=[]);for(const t of e.headerExtensions)p(t);if(e.encodings&&!Array.isArray(e.encodings))throw new TypeError("params.encodings is not an array");e.encodings||(e.encodings=[]);for(const t of e.encodings)l(t);if(e.rtcp&&"object"!=typeof e.rtcp)throw new TypeError("params.rtcp is not an object");e.rtcp||(e.rtcp={}),function(e){if("object"!=typeof e)throw new TypeError("rtcp is not an object");if(e.cname&&"string"!=typeof e.cname)throw new TypeError("invalid rtcp.cname");e.reducedSize&&"boolean"==typeof e.reducedSize||(e.reducedSize=!0)}(e.rtcp)}function n(e){const t=new RegExp("^(audio|video)/(.+)","i");if("object"!=typeof e)throw new TypeError("codec is not an object");if(!e.mimeType||"string"!=typeof e.mimeType)throw new TypeError("missing codec.mimeType");const i=t.exec(e.mimeType);if(!i)throw new TypeError("invalid codec.mimeType");if(e.kind=i[1].toLowerCase(),"number"!=typeof e.preferredPayloadType)throw new TypeError("missing codec.preferredPayloadType");if("number"!=typeof e.clockRate)throw new TypeError("missing codec.clockRate");"audio"===e.kind?"number"!=typeof e.channels&&(e.channels=1):delete e.channels,e.parameters&&"object"==typeof e.parameters||(e.parameters={});for(const t of Object.keys(e.parameters)){let i=e.parameters[t];if(void 0===i&&(e.parameters[t]="",i=""),"string"!=typeof i&&"number"!=typeof i)throw new TypeError(`invalid codec parameter [key:${t}s, value:${i}]`);if("apt"===t&&"number"!=typeof i)throw new TypeError("invalid codec apt parameter")}e.rtcpFeedback&&Array.isArray(e.rtcpFeedback)||(e.rtcpFeedback=[]);for(const t of e.rtcpFeedback)o(t)}function o(e){if("object"!=typeof e)throw new TypeError("fb is not an object");if(!e.type||"string"!=typeof e.type)throw new TypeError("missing fb.type");e.parameter&&"string"==typeof e.parameter||(e.parameter="")}function c(e){if("object"!=typeof e)throw new TypeError("ext is not an object");if("audio"!==e.kind&&"video"!==e.kind)throw new TypeError("invalid ext.kind");if(!e.uri||"string"!=typeof e.uri)throw new TypeError("missing ext.uri");if("number"!=typeof e.preferredId)throw new TypeError("missing ext.preferredId");if(e.preferredEncrypt&&"boolean"!=typeof e.preferredEncrypt)throw new TypeError("invalid ext.preferredEncrypt");if(e.preferredEncrypt||(e.preferredEncrypt=!1),e.direction&&"string"!=typeof e.direction)throw new TypeError("invalid ext.direction");e.direction||(e.direction="sendrecv")}function d(e){const t=new RegExp("^(audio|video)/(.+)","i");if("object"!=typeof e)throw new TypeError("codec is not an object");if(!e.mimeType||"string"!=typeof e.mimeType)throw new TypeError("missing codec.mimeType");const i=t.exec(e.mimeType);if(!i)throw new TypeError("invalid codec.mimeType");if("number"!=typeof e.payloadType)throw new TypeError("missing codec.payloadType");if("number"!=typeof e.clockRate)throw new TypeError("missing codec.clockRate");"audio"===i[1].toLowerCase()?"number"!=typeof e.channels&&(e.channels=1):delete e.channels,e.parameters&&"object"==typeof e.parameters||(e.parameters={});for(const t of Object.keys(e.parameters)){let i=e.parameters[t];if(void 0===i&&(e.parameters[t]="",i=""),"string"!=typeof i&&"number"!=typeof i)throw new TypeError(`invalid codec parameter [key:${t}s, value:${i}]`);if("apt"===t&&"number"!=typeof i)throw new TypeError("invalid codec apt parameter")}e.rtcpFeedback&&Array.isArray(e.rtcpFeedback)||(e.rtcpFeedback=[]);for(const t of e.rtcpFeedback)o(t)}function p(e){if("object"!=typeof e)throw new TypeError("ext is not an object");if(!e.uri||"string"!=typeof e.uri)throw new TypeError("missing ext.uri");if("number"!=typeof e.id)throw new TypeError("missing ext.id");if(e.encrypt&&"boolean"!=typeof e.encrypt)throw new TypeError("invalid ext.encrypt");e.encrypt||(e.encrypt=!1),e.parameters&&"object"==typeof e.parameters||(e.parameters={});for(const t of Object.keys(e.parameters)){let i=e.parameters[t];if(void 0===i&&(e.parameters[t]="",i=""),"string"!=typeof i&&"number"!=typeof i)throw new TypeError("invalid header extension parameter")}}function l(e){if("object"!=typeof e)throw new TypeError("encoding is not an object");if(e.ssrc&&"number"!=typeof e.ssrc)throw new TypeError("invalid encoding.ssrc");if(e.rid&&"string"!=typeof e.rid)throw new TypeError("invalid encoding.rid");if(e.rtx&&"object"!=typeof e.rtx)throw new TypeError("invalid encoding.rtx");if(e.rtx&&"number"!=typeof e.rtx.ssrc)throw new TypeError("missing encoding.rtx.ssrc");if(e.dtx&&"boolean"==typeof e.dtx||(e.dtx=!1),e.scalabilityMode&&"string"!=typeof e.scalabilityMode)throw new TypeError("invalid encoding.scalabilityMode")}function h({direction:e,extendedRtpCapabilities:t}){const i={codecs:[],headerExtensions:[]};for(const e of t.codecs){const t={kind:e.kind,mimeType:e.mimeType,preferredPayloadType:e.remotePayloadType,clockRate:e.clockRate,channels:e.channels,parameters:e.localParameters,rtcpFeedback:e.rtcpFeedback};if(i.codecs.push(t),!e.remoteRtxPayloadType)continue;const r={kind:e.kind,mimeType:`${e.kind}/rtx`,preferredPayloadType:e.remoteRtxPayloadType,clockRate:e.clockRate,parameters:{apt:e.remotePayloadType},rtcpFeedback:[]};i.codecs.push(r)}for(const r of t.headerExtensions){if("sendrecv"!==r.direction&&r.direction!==e)continue;const t={kind:r.kind,uri:r.uri,preferredId:r.recvId,preferredEncrypt:r.encrypt??!1,direction:r.direction};i.headerExtensions.push(t)}return i}function u(e){return!!e&&/.+\/rtx$/i.test(e.mimeType)}function m(t,i,{strict:r=!1,modify:s=!1}={}){const a=t.mimeType.toLowerCase();if(a!==i.mimeType.toLowerCase())return!1;if(t.clockRate!==i.clockRate)return!1;if(t.channels!==i.channels)return!1;switch(a){case"video/h264":if(r){if((t.parameters["packetization-mode"]??0)!==(i.parameters["packetization-mode"]??0))return!1;if(!e.isSameProfile(t.parameters,i.parameters))return!1;let r;try{r=e.generateProfileLevelIdStringForAnswer(t.parameters,i.parameters)}catch(e){return!1}s&&(r?(t.parameters["profile-level-id"]=r,i.parameters["profile-level-id"]=r):(delete t.parameters["profile-level-id"],delete i.parameters["profile-level-id"]))}break;case"video/vp9":if(r){if((t.parameters["profile-id"]??0)!==(i.parameters["profile-id"]??0))return!1}}return!0}function f(e,t){return(!e.kind||!t.kind||e.kind===t.kind)&&e.uri===t.uri}function g(e,t){const i=[];for(const r of e.rtcpFeedback??[]){const e=(t.rtcpFeedback??[]).find(e=>e.type===r.type&&(e.parameter===r.parameter||!e.parameter&&!r.parameter));e&&i.push(e)}return i}return ne}var le,he={},ue={},me={},fe={};var ge,ve,be,_e={};function ye(){if(ge)return _e;ge=1,Object.defineProperty(_e,"__esModule",{value:!0}),_e.AwaitQueueRemovedTaskError=_e.AwaitQueueStoppedError=void 0;class e extends Error{constructor(t){super(t??"queue stopped"),this.name="AwaitQueueStoppedError","function"==typeof Error.captureStackTrace&&Error.captureStackTrace(this,e)}}_e.AwaitQueueStoppedError=e;class t extends Error{constructor(e){super(e??"queue task removed"),this.name="AwaitQueueRemovedTaskError","function"==typeof Error.captureStackTrace&&Error.captureStackTrace(this,t)}}return _e.AwaitQueueRemovedTaskError=t,_e}function Se(){if(ve)return me;ve=1,Object.defineProperty(me,"__esModule",{value:!0}),me.AwaitQueue=void 0;const e=function(){if(le)return fe;le=1,Object.defineProperty(fe,"__esModule",{value:!0}),fe.Logger=void 0;const e=B(),t="awaitqueue";return fe.Logger=class{_debug;_warn;_error;constructor(i){i?(this._debug=e(`${t}:${i}`),this._warn=e(`${t}:WARN:${i}`),this._error=e(`${t}:ERROR:${i}`)):(this._debug=e(t),this._warn=e(`${t}:WARN`),this._error=e(`${t}:ERROR`)),this._debug.log=console.info.bind(console),this._warn.log=console.warn.bind(console),this._error.log=console.error.bind(console)}get debug(){return this._debug}get warn(){return this._warn}get error(){return this._error}},fe}(),t=ye(),i=new e.Logger("AwaitQueue");return me.AwaitQueue=class{pendingTasks=new Map;nextTaskId=0;constructor(){i.debug("constructor()")}get size(){return this.pendingTasks.size}async push(e,r,s){if(r=r??e.name,i.debug(`push() [name:${r}, options:%o]`,s),"function"!=typeof e)throw new TypeError("given task is not a function");if(r)try{Object.defineProperty(e,"name",{value:r})}catch(e){}return new Promise((a,n)=>{if(r&&s?.removeOngoingTasksWithSameName)for(const e of this.pendingTasks.values())e.name===r&&e.reject(new t.AwaitQueueRemovedTaskError,{canExecuteNextTask:!1});const o={id:this.nextTaskId++,task:e,name:r,enqueuedAt:Date.now(),executedAt:void 0,completed:!1,resolve:e=>{if(o.completed)return;o.completed=!0,this.pendingTasks.delete(o.id),i.debug(`resolving task [name:${o.name}]`),a(e);const[t]=this.pendingTasks.values();t&&!t.executedAt&&this.execute(t)},reject:(e,{canExecuteNextTask:t})=>{if(!o.completed&&(o.completed=!0,this.pendingTasks.delete(o.id),i.debug(`rejecting task [name:${o.name}]: %s`,String(e)),n(e),t)){const[e]=this.pendingTasks.values();e&&!e.executedAt&&this.execute(e)}}};this.pendingTasks.set(o.id,o),1===this.pendingTasks.size&&this.execute(o)})}stop(){i.debug("stop()");for(const e of this.pendingTasks.values())i.debug(`stop() | stopping task [name:${e.name}]`),e.reject(new t.AwaitQueueStoppedError,{canExecuteNextTask:!1})}remove(e){i.debug(`remove() [taskIdx:${e}]`);const r=Array.from(this.pendingTasks.values())[e];r?r.reject(new t.AwaitQueueRemovedTaskError,{canExecuteNextTask:!0}):i.debug(`stop() | no task with given idx [taskIdx:${e}]`)}dump(){const e=Date.now();let t=0;return Array.from(this.pendingTasks.values()).map(i=>({idx:t++,task:i.task,name:i.name,enqueuedTime:i.executedAt?i.executedAt-i.enqueuedAt:e-i.enqueuedAt,executionTime:i.executedAt?e-i.executedAt:0}))}async execute(e){if(i.debug(`execute() [name:${e.name}]`),e.executedAt)throw new Error("task already being executed");e.executedAt=Date.now();try{const t=await e.task();e.resolve(t)}catch(t){e.reject(t,{canExecuteNextTask:!0})}}},me}var we,ke={};var Te,Ce={};var Pe,Re={};var Ee,De,xe={};function Ie(){if(De)return he;De=1,Object.defineProperty(he,"__esModule",{value:!0}),he.Transport=void 0;const e=(be||(be=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.AwaitQueueRemovedTaskError=e.AwaitQueueStoppedError=e.AwaitQueue=void 0;var t=Se();Object.defineProperty(e,"AwaitQueue",{enumerable:!0,get:function(){return t.AwaitQueue}});var i=ye();Object.defineProperty(e,"AwaitQueueStoppedError",{enumerable:!0,get:function(){return i.AwaitQueueStoppedError}}),Object.defineProperty(e,"AwaitQueueRemovedTaskError",{enumerable:!0,get:function(){return i.AwaitQueueRemovedTaskError}})}(ue)),ue),t=G(),i=J(),r=Z(),s=ie(),a=pe(),n=function(){if(we)return ke;we=1,Object.defineProperty(ke,"__esModule",{value:!0}),ke.Producer=void 0;const e=G(),t=J(),i=Z(),r=new e.Logger("Producer");let s=class extends t.EnhancedEventEmitter{_id;_localId;_closed=!1;_rtpSender;_track;_kind;_rtpParameters;_paused;_maxSpatialLayer;_stopTracks;_disableTrackOnPause;_zeroRtpOnPause;_appData;_observer=new t.EnhancedEventEmitter;constructor({id:e,localId:t,rtpSender:i,track:s,rtpParameters:a,stopTracks:n,disableTrackOnPause:o,zeroRtpOnPause:c,appData:d}){super(),r.debug("constructor()"),this._id=e,this._localId=t,this._rtpSender=i,this._track=s,this._kind=s.kind,this._rtpParameters=a,this._paused=!!o&&!s.enabled,this._maxSpatialLayer=void 0,this._stopTracks=n,this._disableTrackOnPause=o,this._zeroRtpOnPause=c,this._appData=d??{},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){this._appData=e}get observer(){return this._observer}close(){this._closed||(r.debug("close()"),this._closed=!0,this.destroyTrack(),this.emit("@close"),this._observer.safeEmit("close"),super.close(),this._observer.close())}transportClosed(){this._closed||(r.debug("transportClosed()"),this._closed=!0,this.destroyTrack(),this.safeEmit("transportclose"),this._observer.safeEmit("close"))}async getStats(){if(this._closed)throw new i.InvalidStateError("closed");return new Promise((e,t)=>{this.safeEmit("@getstats",e,t)})}pause(){r.debug("pause()"),this._closed?r.error("pause() | Producer closed"):(this._paused=!0,this._track&&this._disableTrackOnPause&&(this._track.enabled=!1),this._zeroRtpOnPause&&new Promise((e,t)=>{this.safeEmit("@pause",e,t)}).catch(()=>{}),this._observer.safeEmit("pause"))}resume(){r.debug("resume()"),this._closed?r.error("resume() | Producer closed"):(this._paused=!1,this._track&&this._disableTrackOnPause&&(this._track.enabled=!0),this._zeroRtpOnPause&&new Promise((e,t)=>{this.safeEmit("@resume",e,t)}).catch(()=>{}),this._observer.safeEmit("resume"))}async replaceTrack({track:e}){if(r.debug("replaceTrack() [track:%o]",e),this._closed){if(e&&this._stopTracks)try{e.stop()}catch(e){}throw new i.InvalidStateError("closed")}if("ended"===e?.readyState)throw new i.InvalidStateError("track ended");e!==this._track?(await new Promise((t,i)=>{this.safeEmit("@replacetrack",e,t,i)}),this.destroyTrack(),this._track=e,this._track&&this._disableTrackOnPause&&(this._paused?this._paused&&(this._track.enabled=!1):this._track.enabled=!0),this.handleTrack()):r.debug("replaceTrack() | same track, ignored")}async setMaxSpatialLayer(e){if(this._closed)throw new i.InvalidStateError("closed");if("video"!==this._kind)throw new i.UnsupportedError("not a video Producer");if("number"!=typeof e)throw new TypeError("invalid spatialLayer");e!==this._maxSpatialLayer&&(await new Promise((t,i)=>{this.safeEmit("@setmaxspatiallayer",e,t,i)}).catch(()=>{}),this._maxSpatialLayer=e)}async setRtpEncodingParameters(e){if(this._closed)throw new i.InvalidStateError("closed");if("object"!=typeof e)throw new TypeError("invalid params");await new Promise((t,i)=>{this.safeEmit("@setrtpencodingparameters",e,t,i)})}onTrackEnded(){r.debug('track "ended" event'),this.safeEmit("trackended"),this._observer.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(e){}}};return ke.Producer=s,ke}(),o=function(){if(Te)return Ce;Te=1,Object.defineProperty(Ce,"__esModule",{value:!0}),Ce.Consumer=void 0;const e=G(),t=J(),i=Z(),r=new e.Logger("Consumer");let s=class extends t.EnhancedEventEmitter{_id;_localId;_producerId;_closed=!1;_rtpReceiver;_track;_rtpParameters;_paused;_appData;_observer=new t.EnhancedEventEmitter;constructor({id:e,localId:t,producerId:i,rtpReceiver:s,track:a,rtpParameters:n,appData:o}){super(),r.debug("constructor()"),this._id=e,this._localId=t,this._producerId=i,this._rtpReceiver=s,this._track=a,this._rtpParameters=n,this._paused=!a.enabled,this._appData=o??{},this.onTrackEnded=this.onTrackEnded.bind(this),this.handleTrack()}get id(){return this._id}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){this._appData=e}get observer(){return this._observer}close(){this._closed||(r.debug("close()"),this._closed=!0,this.destroyTrack(),this.emit("@close"),this._observer.safeEmit("close"),super.close(),this._observer.close())}transportClosed(){this._closed||(r.debug("transportClosed()"),this._closed=!0,this.destroyTrack(),this.safeEmit("transportclose"),this._observer.safeEmit("close"))}async getStats(){if(this._closed)throw new i.InvalidStateError("closed");return new Promise((e,t)=>{this.safeEmit("@getstats",e,t)})}pause(){r.debug("pause()"),this._closed?r.error("pause() | Consumer closed"):this._paused?r.debug("pause() | Consumer is already paused"):(this._paused=!0,this._track.enabled=!1,this.emit("@pause"),this._observer.safeEmit("pause"))}resume(){r.debug("resume()"),this._closed?r.error("resume() | Consumer closed"):this._paused?(this._paused=!1,this._track.enabled=!0,this.emit("@resume"),this._observer.safeEmit("resume")):r.debug("resume() | Consumer is already resumed")}onTrackEnded(){r.debug('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(e){}}};return Ce.Consumer=s,Ce}(),c=function(){if(Pe)return Re;Pe=1,Object.defineProperty(Re,"__esModule",{value:!0}),Re.DataProducer=void 0;const e=G(),t=J(),i=Z(),r=new e.Logger("DataProducer");let s=class extends t.EnhancedEventEmitter{_id;_dataChannel;_closed=!1;_sctpStreamParameters;_appData;_observer=new t.EnhancedEventEmitter;constructor({id:e,dataChannel:t,sctpStreamParameters:i,appData:s}){super(),r.debug("constructor()"),this._id=e,this._dataChannel=t,this._sctpStreamParameters=i,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){this._appData=e}get observer(){return this._observer}close(){this._closed||(r.debug("close()"),this._closed=!0,this._dataChannel.close(),this.emit("@close"),this._observer.safeEmit("close"),super.close(),this._observer.close())}transportClosed(){this._closed||(r.debug("transportClosed()"),this._closed=!0,this._dataChannel.close(),this.safeEmit("transportclose"),this._observer.safeEmit("close"))}send(e){if(r.debug("send()"),this._closed)throw new i.InvalidStateError("closed");this._dataChannel.send(e)}handleDataChannel(){this._dataChannel.addEventListener("open",()=>{this._closed||(r.debug('DataChannel "open" event'),this.safeEmit("open"))}),this._dataChannel.addEventListener("error",e=>{if(this._closed)return;const t=e.error??new Error("unknown DataChannel error");"sctp-failure"===e.error?.errorDetail?r.error("DataChannel SCTP error [sctpCauseCode:%s]: %s",e.error?.sctpCauseCode,e.error.message):r.error('DataChannel "error" event: %o',t),this.safeEmit("error",t)}),this._dataChannel.addEventListener("close",()=>{this._closed||(r.warn('DataChannel "close" event'),this._closed=!0,this.emit("@close"),this.safeEmit("close"),this._observer.safeEmit("close"))}),this._dataChannel.addEventListener("message",()=>{this._closed||r.warn('DataChannel "message" event in a DataProducer, message discarded')}),this._dataChannel.addEventListener("bufferedamountlow",()=>{this._closed||this.safeEmit("bufferedamountlow")})}};return Re.DataProducer=s,Re}(),d=function(){if(Ee)return xe;Ee=1,Object.defineProperty(xe,"__esModule",{value:!0}),xe.DataConsumer=void 0;const e=G(),t=J(),i=new e.Logger("DataConsumer");let r=class extends t.EnhancedEventEmitter{_id;_dataProducerId;_dataChannel;_closed=!1;_sctpStreamParameters;_appData;_observer=new t.EnhancedEventEmitter;constructor({id:e,dataProducerId:t,dataChannel:r,sctpStreamParameters:s,appData:a}){super(),i.debug("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){this._appData=e}get observer(){return this._observer}close(){this._closed||(i.debug("close()"),this._closed=!0,this._dataChannel.close(),this.emit("@close"),this._observer.safeEmit("close"),super.close(),this._observer.close())}transportClosed(){this._closed||(i.debug("transportClosed()"),this._closed=!0,this._dataChannel.close(),this.safeEmit("transportclose"),this._observer.safeEmit("close"))}handleDataChannel(){this._dataChannel.addEventListener("open",()=>{this._closed||(i.debug('DataChannel "open" event'),this.safeEmit("open"))}),this._dataChannel.addEventListener("error",e=>{if(this._closed)return;const t=e.error??new Error("unknown DataChannel error");"sctp-failure"===e.error?.errorDetail?i.error("DataChannel SCTP error [sctpCauseCode:%s]: %s",e.error?.sctpCauseCode,e.error.message):i.error('DataChannel "error" event: %o',t),this.safeEmit("error",t)}),this._dataChannel.addEventListener("close",()=>{this._closed||(i.warn('DataChannel "close" event'),this._closed=!0,this.emit("@close"),this.safeEmit("close"),this._observer.safeEmit("close"))}),this._dataChannel.addEventListener("message",e=>{this._closed||this.safeEmit("message",e.data)})}};return xe.DataConsumer=r,xe}(),p=new t.Logger("Transport");class l{consumerOptions;promise;resolve;reject;constructor(e){this.consumerOptions=e,this.promise=new Promise((e,t)=>{this.resolve=e,this.reject=t})}}let h=class extends i.EnhancedEventEmitter{_id;_closed=!1;_direction;_getSendExtendedRtpCapabilities;_recvRtpCapabilities;_canProduceByKind;_maxSctpMessageSize;_handler;_iceGatheringState="new";_connectionState="new";_appData;_producers=new Map;_consumers=new Map;_dataProducers=new Map;_dataConsumers=new Map;_probatorConsumerCreated=!1;_awaitQueue=new e.AwaitQueue;_pendingConsumerTasks=[];_consumerCreationInProgress=!1;_pendingPauseConsumers=new Map;_consumerPauseInProgress=!1;_pendingResumeConsumers=new Map;_consumerResumeInProgress=!1;_pendingCloseConsumers=new Map;_consumerCloseInProgress=!1;_observer=new i.EnhancedEventEmitter;constructor({direction:e,id:t,iceParameters:i,iceCandidates:r,dtlsParameters:a,sctpParameters:n,iceServers:o,iceTransportPolicy:c,additionalSettings:d,appData:l,handlerFactory:h,getSendExtendedRtpCapabilities:u,recvRtpCapabilities:m,canProduceByKind:f}){super(),p.debug("constructor() [id:%s, direction:%s]",t,e),this._id=t,this._direction=e,this._getSendExtendedRtpCapabilities=u,this._recvRtpCapabilities=m,this._canProduceByKind=f,this._maxSctpMessageSize=n?n.maxMessageSize:null;const g=s.clone(d)??{};delete g.iceServers,delete g.iceTransportPolicy,delete g.bundlePolicy,delete g.rtcpMuxPolicy,this._handler=h.factory({direction:e,iceParameters:i,iceCandidates:r,dtlsParameters:a,sctpParameters:n,iceServers:o,iceTransportPolicy:c,additionalSettings:g,getSendExtendedRtpCapabilities:this._getSendExtendedRtpCapabilities}),this._appData=l??{},this.handleHandler()}get id(){return this._id}get closed(){return this._closed}get direction(){return this._direction}get handler(){return this._handler}get iceGatheringState(){return this._iceGatheringState}get connectionState(){return this._connectionState}get appData(){return this._appData}set appData(e){this._appData=e}get observer(){return this._observer}close(){if(!this._closed){p.debug("close()"),this._closed=!0,this._awaitQueue.stop(),this._handler.close(),this._connectionState="closed";for(const e of this._producers.values())e.transportClosed();this._producers.clear();for(const e of this._consumers.values())e.transportClosed();this._consumers.clear();for(const e of this._dataProducers.values())e.transportClosed();this._dataProducers.clear();for(const e of this._dataConsumers.values())e.transportClosed();this._dataConsumers.clear(),this._observer.safeEmit("close"),super.close(),this._observer.close()}}async getStats(){if(this._closed)throw new r.InvalidStateError("closed");return this._handler.getTransportStats()}async restartIce({iceParameters:e}){if(p.debug("restartIce()"),this._closed)throw new r.InvalidStateError("closed");if(!e)throw new TypeError("missing iceParameters");return this._awaitQueue.push(async()=>await this._handler.restartIce(e),"transport.restartIce()")}async updateIceServers({iceServers:e}={}){if(p.debug("updateIceServers()"),this._closed)throw new r.InvalidStateError("closed");if(!Array.isArray(e))throw new TypeError("missing iceServers");return this._awaitQueue.push(async()=>this._handler.updateIceServers(e),"transport.updateIceServers()")}async produce({track:e,streamId:t,encodings:i,codecOptions:s,headerExtensionOptions:o,codec:c,stopTracks:d=!0,disableTrackOnPause:l=!0,zeroRtpOnPause:h=!1,onRtpSender:u,appData:m={}}={}){if(p.debug("produce() [track:%o]",e),this._closed)throw new r.InvalidStateError("closed");if(!e)throw new TypeError("missing track");if("send"!==this._direction)throw new r.UnsupportedError("not a sending Transport");if(!this._canProduceByKind[e.kind])throw new r.UnsupportedError(`cannot produce ${e.kind}`);if("ended"===e.readyState)throw new r.InvalidStateError("track ended");if(0===this.listenerCount("connect")&&"new"===this._connectionState)throw new TypeError('no "connect" listener set into this transport');if(0===this.listenerCount("produce"))throw new TypeError('no "produce" listener set into this transport');if(m&&"object"!=typeof m)throw new TypeError("if given, appData must be an object");return this._awaitQueue.push(async()=>{let r;if(i&&!Array.isArray(i))throw TypeError("encodings must be an array");0===i?.length?r=void 0:i&&(r=i.map(e=>{const t={active:!0};return!1===e.active&&(t.active=!1),"boolean"==typeof e.dtx&&(t.dtx=e.dtx),"string"==typeof e.scalabilityMode&&(t.scalabilityMode=e.scalabilityMode),"number"==typeof e.scaleResolutionDownBy&&(t.scaleResolutionDownBy=e.scaleResolutionDownBy),"number"==typeof e.maxBitrate&&(t.maxBitrate=e.maxBitrate),"number"==typeof e.maxFramerate&&(t.maxFramerate=e.maxFramerate),"boolean"==typeof e.adaptivePtime&&(t.adaptivePtime=e.adaptivePtime),"string"==typeof e.priority&&(t.priority=e.priority),"string"==typeof e.networkPriority&&(t.networkPriority=e.networkPriority),t}));const{localId:p,rtpParameters:f,rtpSender:g}=await this._handler.send({track:e,streamId:t,encodings:r,codecOptions:s,headerExtensionOptions:o,codec:c,onRtpSender:u});try{a.validateAndNormalizeRtpParameters(f);const{id:t}=await new Promise((t,i)=>{this.safeEmit("produce",{kind:e.kind,rtpParameters:f,appData:m},t,i)}),i=new n.Producer({id:t,localId:p,rtpSender:g,track:e,rtpParameters:f,stopTracks:d,disableTrackOnPause:l,zeroRtpOnPause:h,appData:m});return this._producers.set(i.id,i),this.handleProducer(i),this._observer.safeEmit("newproducer",i),i}catch(e){throw this._handler.stopSending(p).catch(()=>{}),e}},"transport.produce()").catch(t=>{if(d)try{e.stop()}catch(e){}throw t})}async consume({id:e,producerId:t,kind:i,rtpParameters:n,streamId:o,onRtpReceiver:c,appData:d={}}){if(p.debug("consume()"),this._closed)throw new r.InvalidStateError("closed");if("recv"!==this._direction)throw new r.UnsupportedError("not a receiving Transport");if("string"!=typeof e)throw new TypeError("missing id");if("string"!=typeof t)throw new TypeError("missing producerId");if("audio"!==i&&"video"!==i)throw new TypeError(`invalid kind '${i}'`);if(0===this.listenerCount("connect")&&"new"===this._connectionState)throw new TypeError('no "connect" listener set into this transport');if(d&&"object"!=typeof d)throw new TypeError("if given, appData must be an object");const h=s.clone(n);if(!a.canReceive(h,this._recvRtpCapabilities))throw new r.UnsupportedError("cannot consume this Producer");const u=new l({id:e,producerId:t,kind:i,rtpParameters:h,streamId:o,onRtpReceiver:c,appData:d});return this._pendingConsumerTasks.push(u),queueMicrotask(()=>{this._closed||!1===this._consumerCreationInProgress&&this.createPendingConsumers()}),u.promise}async produceData({ordered:e=!0,maxPacketLifeTime:t,maxRetransmits:i,label:s="",protocol:n="",appData:o={}}={}){if(p.debug("produceData()"),this._closed)throw new r.InvalidStateError("closed");if("send"!==this._direction)throw new r.UnsupportedError("not a sending Transport");if(!this._maxSctpMessageSize)throw new r.UnsupportedError("SCTP not enabled by remote Transport");if(0===this.listenerCount("connect")&&"new"===this._connectionState)throw new TypeError('no "connect" listener set into this transport');if(0===this.listenerCount("producedata"))throw new TypeError('no "producedata" listener set into this transport');if(o&&"object"!=typeof o)throw new TypeError("if given, appData must be an object");return(t||i)&&(e=!1),this._awaitQueue.push(async()=>{const{dataChannel:r,sctpStreamParameters:d}=await this._handler.sendDataChannel({ordered:e,maxPacketLifeTime:t,maxRetransmits:i,label:s,protocol:n});a.validateAndNormalizeSctpStreamParameters(d);const{id:p}=await new Promise((e,t)=>{this.safeEmit("producedata",{sctpStreamParameters:d,label:s,protocol:n,appData:o},e,t)}),l=new c.DataProducer({id:p,dataChannel:r,sctpStreamParameters:d,appData:o});return this._dataProducers.set(l.id,l),this.handleDataProducer(l),this._observer.safeEmit("newdataproducer",l),l},"transport.produceData()")}async consumeData({id:e,dataProducerId:t,sctpStreamParameters:i,label:n="",protocol:o="",appData:c={}}){if(p.debug("consumeData()"),this._closed)throw new r.InvalidStateError("closed");if("recv"!==this._direction)throw new r.UnsupportedError("not a receiving Transport");if(!this._maxSctpMessageSize)throw new r.UnsupportedError("SCTP not enabled by remote Transport");if("string"!=typeof e)throw new TypeError("missing id");if("string"!=typeof t)throw new TypeError("missing dataProducerId");if(0===this.listenerCount("connect")&&"new"===this._connectionState)throw new TypeError('no "connect" listener set into this transport');if(c&&"object"!=typeof c)throw new TypeError("if given, appData must be an object");const l=s.clone(i);return a.validateAndNormalizeSctpStreamParameters(l),this._awaitQueue.push(async()=>{const{dataChannel:i}=await this._handler.receiveDataChannel({sctpStreamParameters:l,label:n,protocol:o}),r=new d.DataConsumer({id:e,dataProducerId:t,dataChannel:i,sctpStreamParameters:l,appData:c});return this._dataConsumers.set(r.id,r),this.handleDataConsumer(r),this._observer.safeEmit("newdataconsumer",r),r},"transport.consumeData()")}createPendingConsumers(){this._consumerCreationInProgress=!0,this._awaitQueue.push(async()=>{if(0===this._pendingConsumerTasks.length)return void p.debug("createPendingConsumers() | there is no Consumer to be created");const e=[...this._pendingConsumerTasks];let t;this._pendingConsumerTasks=[];const i=[];for(const t of e){const{id:e,kind:r,rtpParameters:s,streamId:a,onRtpReceiver:n}=t.consumerOptions;i.push({trackId:e,kind:r,rtpParameters:s,streamId:a,onRtpReceiver:n})}try{const r=await this._handler.receive(i);for(let i=0;i<r.length;++i){const s=e[i],a=r[i],{id:n,producerId:c,kind:d,rtpParameters:p,appData:l}=s.consumerOptions,{localId:h,rtpReceiver:u,track:m}=a,f=new o.Consumer({id:n,localId:h,producerId:c,rtpReceiver:u,track:m,rtpParameters:p,appData:l});this._consumers.set(f.id,f),this.handleConsumer(f),this._probatorConsumerCreated||t||"video"!==d||(t=f),this._observer.safeEmit("newconsumer",f),s.resolve(f)}}catch(t){for(const i of e)i.reject(t)}if(t)try{const e=a.generateProbatorRtpParameters(t.rtpParameters);await this._handler.receive([{trackId:"probator",kind:"video",rtpParameters:e}]),p.debug("createPendingConsumers() | Consumer for RTP probation created"),this._probatorConsumerCreated=!0}catch(e){p.error("createPendingConsumers() | failed to create Consumer for RTP probation:%o",e)}},"transport.createPendingConsumers()").then(()=>{this._consumerCreationInProgress=!1,this._pendingConsumerTasks.length>0&&this.createPendingConsumers()}).catch(()=>{})}pausePendingConsumers(){this._consumerPauseInProgress=!0,this._awaitQueue.push(async()=>{if(0===this._pendingPauseConsumers.size)return void p.debug("pausePendingConsumers() | there is no Consumer to be paused");const e=Array.from(this._pendingPauseConsumers.values());this._pendingPauseConsumers.clear();try{const t=e.map(e=>e.localId);await this._handler.pauseReceiving(t)}catch(e){p.error("pausePendingConsumers() | failed to pause Consumers:",e)}},"transport.pausePendingConsumers()").then(()=>{this._consumerPauseInProgress=!1,this._pendingPauseConsumers.size>0&&this.pausePendingConsumers()}).catch(()=>{})}resumePendingConsumers(){this._consumerResumeInProgress=!0,this._awaitQueue.push(async()=>{if(0===this._pendingResumeConsumers.size)return void p.debug("resumePendingConsumers() | there is no Consumer to be resumed");const e=Array.from(this._pendingResumeConsumers.values());this._pendingResumeConsumers.clear();try{const t=e.map(e=>e.localId);await this._handler.resumeReceiving(t)}catch(e){p.error("resumePendingConsumers() | failed to resume Consumers:",e)}},"transport.resumePendingConsumers()").then(()=>{this._consumerResumeInProgress=!1,this._pendingResumeConsumers.size>0&&this.resumePendingConsumers()}).catch(()=>{})}closePendingConsumers(){this._consumerCloseInProgress=!0,this._awaitQueue.push(async()=>{if(0===this._pendingCloseConsumers.size)return void p.debug("closePendingConsumers() | there is no Consumer to be closed");const e=Array.from(this._pendingCloseConsumers.values());this._pendingCloseConsumers.clear();try{await this._handler.stopReceiving(e.map(e=>e.localId))}catch(e){p.error("closePendingConsumers() | failed to close Consumers:",e)}},"transport.closePendingConsumers()").then(()=>{this._consumerCloseInProgress=!1,this._pendingCloseConsumers.size>0&&this.closePendingConsumers()}).catch(()=>{})}handleHandler(){const e=this._handler;e.on("@connect",({dtlsParameters:e},t,i)=>{this._closed?i(new r.InvalidStateError("closed")):this.safeEmit("connect",{dtlsParameters:e},t,i)}),e.on("@icegatheringstatechange",e=>{e!==this._iceGatheringState&&(p.debug("ICE gathering state changed to %s",e),this._iceGatheringState=e,this._closed||this.safeEmit("icegatheringstatechange",e))}),e.on("@icecandidateerror",e=>{p.warn(`ICE candidate error [url:${e.url}, localAddress:${e.address}, localPort:${e.port}]: ${e.errorCode} "${e.errorText}"`),this.safeEmit("icecandidateerror",e)}),e.on("@connectionstatechange",e=>{e!==this._connectionState&&(p.debug("connection state changed to %s",e),this._connectionState=e,this._closed||this.safeEmit("connectionstatechange",e))})}handleProducer(e){e.on("@close",()=>{this._producers.delete(e.id),this._closed||this._awaitQueue.push(async()=>await this._handler.stopSending(e.localId),"producer @close event").catch(e=>p.warn("producer.close() failed:%o",e))}),e.on("@pause",(t,i)=>{this._awaitQueue.push(async()=>await this._handler.pauseSending(e.localId),"producer @pause event").then(t).catch(i)}),e.on("@resume",(t,i)=>{this._awaitQueue.push(async()=>await this._handler.resumeSending(e.localId),"producer @resume event").then(t).catch(i)}),e.on("@replacetrack",(t,i,r)=>{this._awaitQueue.push(async()=>await this._handler.replaceTrack(e.localId,t),"producer @replacetrack event").then(i).catch(r)}),e.on("@setmaxspatiallayer",(t,i,r)=>{this._awaitQueue.push(async()=>await this._handler.setMaxSpatialLayer(e.localId,t),"producer @setmaxspatiallayer event").then(i).catch(r)}),e.on("@setrtpencodingparameters",(t,i,r)=>{this._awaitQueue.push(async()=>await this._handler.setRtpEncodingParameters(e.localId,t),"producer @setrtpencodingparameters event").then(i).catch(r)}),e.on("@getstats",(t,i)=>{if(this._closed)return i(new r.InvalidStateError("closed"));this._handler.getSenderStats(e.localId).then(t).catch(i)})}handleConsumer(e){e.on("@close",()=>{this._consumers.delete(e.id),this._pendingPauseConsumers.delete(e.id),this._pendingResumeConsumers.delete(e.id),this._closed||(this._pendingCloseConsumers.set(e.id,e),!1===this._consumerCloseInProgress&&this.closePendingConsumers())}),e.on("@pause",()=>{this._pendingResumeConsumers.has(e.id)&&this._pendingResumeConsumers.delete(e.id),this._pendingPauseConsumers.set(e.id,e),queueMicrotask(()=>{this._closed||!1===this._consumerPauseInProgress&&this.pausePendingConsumers()})}),e.on("@resume",()=>{this._pendingPauseConsumers.has(e.id)&&this._pendingPauseConsumers.delete(e.id),this._pendingResumeConsumers.set(e.id,e),queueMicrotask(()=>{this._closed||!1===this._consumerResumeInProgress&&this.resumePendingConsumers()})}),e.on("@getstats",(t,i)=>{if(this._closed)return i(new r.InvalidStateError("closed"));this._handler.getReceiverStats(e.localId).then(t).catch(i)})}handleDataProducer(e){e.on("@close",()=>{this._dataProducers.delete(e.id)})}handleDataConsumer(e){e.on("@close",()=>{this._dataConsumers.delete(e.id)})}};return he.Transport=h,he}var Me,Le,Oe,Ae,je,Fe={},Ne={},$e={},Ue={exports:{}};function Be(){if(Me)return Ue.exports;Me=1;var e=Ue.exports={v:[{name:"version",reg:/^(\d*)$/}],o:[{name:"origin",reg:/^(\S*) (\d*) (\d*) (\S*) IP(\d) (\S*)/,names:["username","sessionId","sessionVersion","netType","ipVer","address"],format:"%s %s %d %s IP%d %s"}],s:[{name:"name"}],i:[{name:"description"}],u:[{name:"uri"}],e:[{name:"email"}],p:[{name:"phone"}],z:[{name:"timezones"}],r:[{name:"repeats"}],t:[{name:"timing",reg:/^(\d*) (\d*)/,names:["start","stop"],format:"%d %d"}],c:[{name:"connection",reg:/^IN IP(\d) (\S*)/,names:["version","ip"],format:"IN IP%d %s"}],b:[{push:"bandwidth",reg:/^(TIAS|AS|CT|RR|RS):(\d*)/,names:["type","limit"],format:"%s:%s"}],m:[{reg:/^(\w*) (\d*) ([\w/]*)(?: (.*))?/,names:["type","port","protocol","payloads"],format:"%s %d %s %s"}],a:[{push:"rtp",reg:/^rtpmap:(\d*) ([\w\-.]*)(?:\s*\/(\d*)(?:\s*\/(\S*))?)?/,names:["payload","codec","rate","encoding"],format:function(e){return e.encoding?"rtpmap:%d %s/%s/%s":e.rate?"rtpmap:%d %s/%s":"rtpmap:%d %s"}},{push:"fmtp",reg:/^fmtp:(\d*) ([\S| ]*)/,names:["payload","config"],format:"fmtp:%d %s"},{name:"control",reg:/^control:(.*)/,format:"control:%s"},{name:"rtcp",reg:/^rtcp:(\d*)(?: (\S*) IP(\d) (\S*))?/,names:["port","netType","ipVer","address"],format:function(e){return null!=e.address?"rtcp:%d %s IP%d %s":"rtcp:%d"}},{push:"rtcpFbTrrInt",reg:/^rtcp-fb:(\*|\d*) trr-int (\d*)/,names:["payload","value"],format:"rtcp-fb:%s trr-int %d"},{push:"rtcpFb",reg:/^rtcp-fb:(\*|\d*) ([\w-_]*)(?: ([\w-_]*))?/,names:["payload","type","subtype"],format:function(e){return null!=e.subtype?"rtcp-fb:%s %s %s":"rtcp-fb:%s %s"}},{push:"ext",reg:/^extmap:(\d+)(?:\/(\w+))?(?: (urn:ietf:params:rtp-hdrext:encrypt))? (\S*)(?: (\S*))?/,names:["value","direction","encrypt-uri","uri","config"],format:function(e){return"extmap:%d"+(e.direction?"/%s":"%v")+(e["encrypt-uri"]?" %s":"%v")+" %s"+(e.config?" %s":"")}},{name:"extmapAllowMixed",reg:/^(extmap-allow-mixed)/},{push:"crypto",reg:/^crypto:(\d*) ([\w_]*) (\S*)(?: (\S*))?/,names:["id","suite","config","sessionConfig"],format:function(e){return null!=e.sessionConfig?"crypto:%d %s %s %s":"crypto:%d %s %s"}},{name:"setup",reg:/^setup:(\w*)/,format:"setup:%s"},{name:"connectionType",reg:/^connection:(new|existing)/,format:"connection:%s"},{name:"mid",reg:/^mid:([^\s]*)/,format:"mid:%s"},{push:"msid",reg:/^msid:([\w-]+)(?: ([\w-]+))?/,names:["id","appdata"],format:"msid:%s %s"},{name:"ptime",reg:/^ptime:(\d*(?:\.\d*)*)/,format:"ptime:%d"},{name:"maxptime",reg:/^maxptime:(\d*(?:\.\d*)*)/,format:"maxptime:%d"},{name:"direction",reg:/^(sendrecv|recvonly|sendonly|inactive)/},{name:"icelite",reg:/^(ice-lite)/},{name:"iceUfrag",reg:/^ice-ufrag:(\S*)/,format:"ice-ufrag:%s"},{name:"icePwd",reg:/^ice-pwd:(\S*)/,format:"ice-pwd:%s"},{name:"fingerprint",reg:/^fingerprint:(\S*) (\S*)/,names:["type","hash"],format:"fingerprint:%s %s"},{push:"candidates",reg:/^candidate:(\S*) (\d*) (\S*) (\d*) (\S*) (\d*) typ (\S*)(?: raddr (\S*) rport (\d*))?(?: tcptype (\S*))?(?: generation (\d*))?(?: network-id (\d*))?(?: network-cost (\d*))?/,names:["foundation","component","transport","priority","ip","port","type","raddr","rport","tcptype","generation","network-id","network-cost"],format:function(e){var t="candidate:%s %d %s %d %s %d typ %s";return t+=null!=e.raddr?" raddr %s rport %d":"%v%v",t+=null!=e.tcptype?" tcptype %s":"%v",null!=e.generation&&(t+=" generation %d"),t+=null!=e["network-id"]?" network-id %d":"%v",t+=null!=e["network-cost"]?" network-cost %d":"%v"}},{name:"endOfCandidates",reg:/^(end-of-candidates)/},{name:"remoteCandidates",reg:/^remote-candidates:(.*)/,format:"remote-candidates:%s"},{name:"iceOptions",reg:/^ice-options:(\S*)/,format:"ice-options:%s"},{push:"ssrcs",reg:/^ssrc:(\d*) ([\w_-]*)(?::(.*))?/,names:["id","attribute","value"],format:function(e){var t="ssrc:%d";return null!=e.attribute&&(t+=" %s",null!=e.value&&(t+=":%s")),t}},{push:"ssrcGroups",reg:/^ssrc-group:([\x21\x23\x24\x25\x26\x27\x2A\x2B\x2D\x2E\w]*) (.*)/,names:["semantics","ssrcs"],format:"ssrc-group:%s %s"},{name:"msidSemantic",reg:/^msid-semantic:\s?(\w*) (\S*)/,names:["semantic","token"],format:"msid-semantic: %s %s"},{push:"groups",reg:/^group:(\w*) (.*)/,names:["type","mids"],format:"group:%s %s"},{name:"rtcpMux",reg:/^(rtcp-mux)/},{name:"rtcpRsize",reg:/^(rtcp-rsize)/},{name:"sctpmap",reg:/^sctpmap:([\w_/]*) (\S*)(?: (\S*))?/,names:["sctpmapNumber","app","maxMessageSize"],format:function(e){return null!=e.maxMessageSize?"sctpmap:%s %s %s":"sctpmap:%s %s"}},{name:"xGoogleFlag",reg:/^x-google-flag:([^\s]*)/,format:"x-google-flag:%s"},{push:"rids",reg:/^rid:([\d\w]+) (\w+)(?: ([\S| ]*))?/,names:["id","direction","params"],format:function(e){return e.params?"rid:%s %s %s":"rid:%s %s"}},{push:"imageattrs",reg:new RegExp("^imageattr:(\\d+|\\*)[\\s\\t]+(send|recv)[\\s\\t]+(\\*|\\[\\S+\\](?:[\\s\\t]+\\[\\S+\\])*)(?:[\\s\\t]+(recv|send)[\\s\\t]+(\\*|\\[\\S+\\](?:[\\s\\t]+\\[\\S+\\])*))?"),names:["pt","dir1","attrs1","dir2","attrs2"],format:function(e){return"imageattr:%s %s %s"+(e.dir2?" %s %s":"")}},{name:"simulcast",reg:new RegExp("^simulcast:(send|recv) ([a-zA-Z0-9\\-_~;,]+)(?:\\s?(send|recv) ([a-zA-Z0-9\\-_~;,]+))?$"),names:["dir1","list1","dir2","list2"],format:function(e){return"simulcast:%s %s"+(e.dir2?" %s %s":"")}},{name:"simulcast_03",reg:/^simulcast:[\s\t]+([\S+\s\t]+)$/,names:["value"],format:"simulcast: %s"},{name:"framerate",reg:/^framerate:(\d+(?:$|\.\d+))/,format:"framerate:%s"},{name:"sourceFilter",reg:/^source-filter: *(excl|incl) (\S*) (IP4|IP6|\*) (\S*) (.*)/,names:["filterMode","netType","addressTypes","destAddress","srcList"],format:"source-filter: %s %s %s %s %s"},{name:"bundleOnly",reg:/^(bundle-only)/},{name:"label",reg:/^label:(.+)/,format:"label:%s"},{name:"sctpPort",reg:/^sctp-port:(\d+)$/,format:"sctp-port:%s"},{name:"maxMessageSize",reg:/^max-message-size:(\d+)$/,format:"max-message-size:%s"},{push:"tsRefClocks",reg:/^ts-refclk:([^\s=]*)(?:=(\S*))?/,names:["clksrc","clksrcExt"],format:function(e){return"ts-refclk:%s"+(null!=e.clksrcExt?"=%s":"")}},{name:"mediaClk",reg:/^mediaclk:(?:id=(\S*))? *([^\s=]*)(?:=(\S*))?(?: *rate=(\d+)\/(\d+))?/,names:["id","mediaClockName","mediaClockValue","rateNumerator","rateDenominator"],format:function(e){var t="mediaclk:";return t+=null!=e.id?"id=%s %s":"%v%s",t+=null!=e.mediaClockValue?"=%s":"",t+=null!=e.rateNumerator?" rate=%s":"",t+=null!=e.rateDenominator?"/%s":""}},{name:"keywords",reg:/^keywds:(.+)$/,format:"keywds:%s"},{name:"content",reg:/^content:(.+)/,format:"content:%s"},{name:"bfcpFloorCtrl",reg:/^floorctrl:(c-only|s-only|c-s)/,format:"floorctrl:%s"},{name:"bfcpConfId",reg:/^confid:(\d+)/,format:"confid:%s"},{name:"bfcpUserId",reg:/^userid:(\d+)/,format:"userid:%s"},{name:"bfcpFloorId",reg:/^floorid:(.+) (?:m-stream|mstrm):(.+)/,names:["id","mStream"],format:"floorid:%s mstrm:%s"},{push:"invalid",names:["value"]}]};return Object.keys(e).forEach(function(t){e[t].forEach(function(e){e.reg||(e.reg=/(.*)/),e.format||(e.format="%s")})}),Ue.exports}function ze(){return Le||(Le=1,function(e){var t=function(e){return String(Number(e))===e?Number(e):e},i=function(e,i,r){var s=e.name&&e.names;e.push&&!i[e.push]?i[e.push]=[]:s&&!i[e.name]&&(i[e.name]={});var a=e.push?{}:s?i[e.name]:i;!function(e,i,r,s){if(s&&!r)i[s]=t(e[1]);else for(var a=0;a<r.length;a+=1)null!=e[a+1]&&(i[r[a]]=t(e[a+1]))}(r.match(e.reg),a,e.names,e.name),e.push&&i[e.push].push(a)},r=Be(),s=RegExp.prototype.test.bind(/^([a-z])=(.*)/);e.parse=function(e){var t={},a=[],n=t;return e.split(/(\r\n|\r|\n)/).filter(s).forEach(function(e){var t=e[0],s=e.slice(2);"m"===t&&(a.push({rtp:[],fmtp:[]}),n=a[a.length-1]);for(var o=0;o<(r[t]||[]).length;o+=1){var c=r[t][o];if(c.reg.test(s))return i(c,n,s)}}),t.media=a,t};var a=function(e,i){var r=i.split(/=(.+)/,2);return 2===r.length?e[r[0]]=t(r[1]):1===r.length&&i.length>1&&(e[r[0]]=void 0),e};e.parseParams=function(e){return e.split(/;\s?/).reduce(a,{})},e.parseFmtpConfig=e.parseParams,e.parsePayloads=function(e){return e.toString().split(" ").map(Number)},e.parseRemoteCandidates=function(e){for(var i=[],r=e.split(" ").map(t),s=0;s<r.length;s+=3)i.push({component:r[s],ip:r[s+1],port:r[s+2]});return i},e.parseImageAttributes=function(e){return e.split(" ").map(function(e){return e.substring(1,e.length-1).split(",").reduce(a,{})})},e.parseSimulcastStreamList=function(e){return e.split(";").map(function(e){return e.split(",").map(function(e){var i,r=!1;return"~"!==e[0]?i=t(e):(i=t(e.substring(1,e.length)),r=!0),{scid:i,paused:r}})})}}($e)),$e}function Ve(){if(Ae)return Oe;Ae=1;var e=Be(),t=/%[sdv%]/g,i=function(e){var i=1,r=arguments,s=r.length;return e.replace(t,function(e){if(i>=s)return e;var t=r[i];switch(i+=1,e){case"%%":return"%";case"%s":return String(t);case"%d":return Number(t);case"%v":return""}})},r=function(e,t,r){var s=[e+"="+(t.format instanceof Function?t.format(t.push?r:r[t.name]):t.format)];if(t.names)for(var a=0;a<t.names.length;a+=1){var n=t.names[a];t.name?s.push(r[t.name][n]):s.push(r[t.names[a]])}else s.push(r[t.name]);return i.apply(null,s)},s=["v","o","s","i","u","e","p","c","b","t","r","z","a"],a=["i","c","b","a"];return Oe=function(t,i){i=i||{},null==t.version&&(t.version=0),null==t.name&&(t.name=" "),t.media.forEach(function(e){null==e.payloads&&(e.payloads="")});var n=i.outerOrder||s,o=i.innerOrder||a,c=[];return n.forEach(function(i){e[i].forEach(function(e){e.name in t&&null!=t[e.name]?c.push(r(i,e,t)):e.push in t&&null!=t[e.push]&&t[e.push].forEach(function(t){c.push(r(i,e,t))})})}),t.media.forEach(function(t){c.push(r("m",e.m[0],t)),o.forEach(function(i){e[i].forEach(function(e){e.name in t&&null!=t[e.name]?c.push(r(i,e,t)):e.push in t&&null!=t[e.push]&&t[e.push].forEach(function(t){c.push(r(i,e,t))})})})}),c.join("\r\n")+"\r\n"}}function He(){if(je)return Ne;je=1;var e=ze(),t=Ve(),i=Be();return Ne.grammar=i,Ne.write=t,Ne.parse=e.parse,Ne.parseParams=e.parseParams,Ne.parseFmtpConfig=e.parseFmtpConfig,Ne.parsePayloads=e.parsePayloads,Ne.parseRemoteCandidates=e.parseRemoteCandidates,Ne.parseImageAttributes=e.parseImageAttributes,Ne.parseSimulcastStreamList=e.parseSimulcastStreamList,Ne}var qe,Qe={};function Ge(){if(qe)return Qe;qe=1,Object.defineProperty(Qe,"__esModule",{value:!0}),Qe.parse=function(t){const i=e.exec(t??"");return i?{spatialLayers:Number(i[1]),temporalLayers:Number(i[2])}:{spatialLayers:1,temporalLayers:1}};const e=new RegExp("^[LS]([1-9]\\d{0,1})T([1-9]\\d{0,1})");return Qe}var Ke,We,Je={},Ye={};function Xe(){if(We)return Je;We=1,Object.defineProperty(Je,"__esModule",{value:!0}),Je.RemoteSdp=void 0;const e=He(),t=G(),i=function(){if(Ke)return Ye;Ke=1,Object.defineProperty(Ye,"__esModule",{value:!0}),Ye.OfferMediaSection=Ye.AnswerMediaSection=Ye.MediaSection=void 0;const e=He(),t=ie();let i=class{_mediaObject;constructor({iceParameters:e,iceCandidates:t,dtlsParameters:i}){if(this._mediaObject={type:"",port:0,protocol:"",payloads:"",rtp:[],fmtp:[]},e&&this.setIceParameters(e),t){this._mediaObject.candidates=[];for(const e of t){const t={foundation:e.foundation,component:1,ip:e.address??e.ip,port:e.port,priority:e.priority,transport:e.protocol,type:e.type};e.tcpType&&(t.tcptype=e.tcpType),this._mediaObject.candidates.push(t)}this._mediaObject.endOfCandidates="end-of-candidates",this._mediaObject.iceOptions="renomination"}i&&this.setDtlsRole(i.role)}get mid(){return String(this._mediaObject.mid)}get closed(){return 0===this._mediaObject.port}getObject(){return this._mediaObject}setIceParameters(e){this._mediaObject.iceUfrag=e.usernameFragment,this._mediaObject.icePwd=e.password}pause(){this._mediaObject.direction="inactive"}disable(){this.pause()}close(){this.disable(),this._mediaObject.port=0,delete this._mediaObject.candidates,delete this._mediaObject.endOfCandidates,delete this._mediaObject.iceUfrag,delete this._mediaObject.icePwd,delete this._mediaObject.iceOptions,this._mediaObject.rtp=[],this._mediaObject.fmtp=[],delete this._mediaObject.rtcp,delete this._mediaObject.rtcpFb,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}};function r(e){const t=new RegExp("^(audio|video)/(.+)","i").exec(e.mimeType);if(!t)throw new TypeError("invalid codec.mimeType");return t[2]}return Ye.MediaSection=i,Ye.AnswerMediaSection=class extends i{constructor({iceParameters:e,iceCandidates:i,dtlsParameters:s,sctpParameters:a,plainRtpParameters:n,offerMediaObject:o,offerRtpParameters:c,answerRtpParameters:d,codecOptions:p}){switch(super({iceParameters:e,iceCandidates:i,dtlsParameters:s}),this._mediaObject.mid=String(o.mid),this._mediaObject.type=o.type,this._mediaObject.protocol=o.protocol,n?(this._mediaObject.connection={ip:n.ip,version:n.ipVersion},this._mediaObject.port=n.port):(this._mediaObject.connection={ip:"127.0.0.1",version:4},this._mediaObject.port=7),o.type){case"audio":case"video":this._mediaObject.direction="recvonly",this._mediaObject.rtp=[],this._mediaObject.rtcpFb=[],this._mediaObject.fmtp=[];for(const e of d.codecs){const i={payload:e.payloadType,codec:r(e),rate:e.clockRate};e.channels>1&&(i.encoding=e.channels),this._mediaObject.rtp.push(i);const s=t.clone(e.parameters)??{};let a=t.clone(e.rtcpFeedback)??[];if(p){const{opusStereo:t,opusFec:i,opusDtx:r,opusMaxPlaybackRate:n,opusMaxAverageBitrate:o,opusPtime:d,opusNack:l,videoGoogleStartBitrate:h,videoGoogleMaxBitrate:u,videoGoogleMinBitrate:m}=p,f=c.codecs.find(t=>t.payloadType===e.payloadType);switch(e.mimeType.toLowerCase()){case"audio/opus":case"audio/multiopus":void 0!==t&&(f.parameters["sprop-stereo"]=t?1:0,s.stereo=t?1:0),void 0!==i&&(f.parameters.useinbandfec=i?1:0,s.useinbandfec=i?1:0),void 0!==r&&(f.parameters.usedtx=r?1:0,s.usedtx=r?1:0),void 0!==n&&(s.maxplaybackrate=n),void 0!==o&&(s.maxaveragebitrate=o),void 0!==d&&(f.parameters.ptime=d,s.ptime=d),l||(f.rtcpFeedback=f.rtcpFeedback.filter(e=>"nack"!==e.type||e.parameter),a=a.filter(e=>"nack"!==e.type||e.parameter));break;case"video/vp8":case"video/vp9":case"video/h264":case"video/h265":case"video/av1":void 0!==h&&(s["x-google-start-bitrate"]=h),void 0!==u&&(s["x-google-max-bitrate"]=u),void 0!==m&&(s["x-google-min-bitrate"]=m)}}const n={payload:e.payloadType,config:""};for(const e of Object.keys(s))n.config&&(n.config+=";"),n.config+=`${e}=${s[e]}`;n.config&&this._mediaObject.fmtp.push(n);for(const t of a)this._mediaObject.rtcpFb.push({payload:e.payloadType,type:t.type,subtype:t.parameter})}this._mediaObject.payloads=d.codecs.map(e=>e.payloadType).join(" "),this._mediaObject.ext=[];for(const e of d.headerExtensions)(o.ext??[]).some(t=>t.uri===e.uri)&&this._mediaObject.ext.push({uri:e.uri,value:e.id});if("extmap-allow-mixed"===o.extmapAllowMixed&&(this._mediaObject.extmapAllowMixed="extmap-allow-mixed"),o.simulcast){this._mediaObject.simulcast={dir1:"recv",list1:o.simulcast.list1},this._mediaObject.rids=[];for(const e of o.rids??[])"send"===e.direction&&this._mediaObject.rids.push({id:e.id,direction:"recv"})}else if(o.simulcast_03){this._mediaObject.simulcast_03={value:o.simulcast_03.value.replace(/send/g,"recv")},this._mediaObject.rids=[];for(const e of o.rids??[])"send"===e.direction&&this._mediaObject.rids.push({id:e.id,direction:"recv"})}this._mediaObject.rtcpMux="rtcp-mux",this._mediaObject.rtcpRsize="rtcp-rsize";break;case"application":"number"==typeof o.sctpPort?(this._mediaObject.payloads="webrtc-datachannel",this._mediaObject.sctpPort=a.port,this._mediaObject.maxMessageSize=a.maxMessageSize):o.sctpmap&&(this._mediaObject.payloads=String(a.port),this._mediaObject.sctpmap={app:"webrtc-datachannel",sctpmapNumber:a.port,maxMessageSize:a.maxMessageSize})}}setDtlsRole(e){switch(e){case"client":this._mediaObject.setup="active";break;case"server":this._mediaObject.setup="passive";break;case"auto":this._mediaObject.setup="actpass"}}resume(){this._mediaObject.direction="recvonly"}muxSimulcastStreams(t){if(!this._mediaObject.simulcast?.list1)return;const i={};for(const e of t)e.rid&&(i[e.rid]=e);const r=this._mediaObject.simulcast.list1,s=e.parseSimulcastStreamList(r);for(const e of s)for(const t of e)t.paused=!i[t.scid]?.active;this._mediaObject.simulcast.list1=s.map(e=>e.map(e=>`${e.paused?"~":""}${e.scid}`).join(",")).join(";")}},Ye.OfferMediaSection=class extends i{constructor({iceParameters:e,iceCandidates:t,dtlsParameters:i,sctpParameters:s,plainRtpParameters:a,mid:n,kind:o,offerRtpParameters:c,streamId:d,trackId:p}){switch(super({iceParameters:e,iceCandidates:t,dtlsParameters:i}),this._mediaObject.mid=String(n),this._mediaObject.type=o,a?(this._mediaObject.connection={ip:a.ip,version:a.ipVersion},this._mediaObject.protocol="RTP/AVP",this._mediaObject.port=a.port):(this._mediaObject.connection={ip:"127.0.0.1",version:4},this._mediaObject.protocol=s?"UDP/DTLS/SCTP":"UDP/TLS/RTP/SAVPF",this._mediaObject.port=7),this._mediaObject.extmapAllowMixed="extmap-allow-mixed",o){case"audio":case"video":{this._mediaObject.direction="sendonly",this._mediaObject.rtp=[],this._mediaObject.rtcpFb=[],this._mediaObject.fmtp=[],this._mediaObject.msid=[{id:d,appdata:p}];for(const e of c.codecs){const t={payload:e.payloadType,codec:r(e),rate:e.clockRate};e.channels>1&&(t.encoding=e.channels),this._mediaObject.rtp.push(t);const i={payload:e.payloadType,config:""};for(const t of Object.keys(e.parameters??{}))i.config&&(i.config+=";"),i.config+=`${t}=${e.parameters[t]}`;i.config&&this._mediaObject.fmtp.push(i);for(const t of e.rtcpFeedback)this._mediaObject.rtcpFb.push({payload:e.payloadType,type:t.type,subtype:t.parameter})}this._mediaObject.payloads=c.codecs.map(e=>e.payloadType).join(" "),this._mediaObject.ext=[];for(const e of c.headerExtensions)this._mediaObject.ext.push({uri:e.uri,value:e.id});this._mediaObject.rtcpMux="rtcp-mux",this._mediaObject.rtcpRsize="rtcp-rsize";const e=c.encodings[0],t=e.ssrc,i=e.rtx?.ssrc;this._mediaObject.ssrcs=[],this._mediaObject.ssrcGroups=[],t&&c.rtcp.cname&&this._mediaObject.ssrcs.push({id:t,attribute:"cname",value:c.rtcp.cname}),i&&(c.rtcp.cname&&this._mediaObject.ssrcs.push({id:i,attribute:"cname",value:c.rtcp.cname}),t&&this._mediaObject.ssrcGroups.push({semantics:"FID",ssrcs:`${t} ${i}`}));break}case"application":this._mediaObject.payloads="webrtc-datachannel",this._mediaObject.sctpPort=s.port,this._mediaObject.maxMessageSize=s.maxMessageSize}}setDtlsRole(e){this._mediaObject.setup="actpass"}resume(){this._mediaObject.direction="sendonly"}},Ye}(),r=Nt(),s=["av1","h264"],a=new t.Logger("RemoteSdp");return Je.RemoteSdp=class{_iceParameters;_iceCandidates;_dtlsParameters;_sctpParameters;_plainRtpParameters;_mediaSections=[];_midToIndex=new Map;_firstMid;_sdpObject;constructor({iceParameters:e,iceCandidates:t,dtlsParameters:i,sctpParameters:s,plainRtpParameters:a}){if(this._iceParameters=e,this._iceCandidates=t,this._dtlsParameters=i,this._sctpParameters=s,this._plainRtpParameters=a,this._sdpObject={version:0,origin:{address:"0.0.0.0",ipVer:4,netType:"IN",sessionId:"10000",sessionVersion:0,username:`mediasoup-client-v${r.version}`},name:"-",timing:{start:0,stop:0},media:[]},this._sdpObject.iceOptions="ice2",e?.iceLite&&(this._sdpObject.icelite="ice-lite"),i){this._sdpObject.msidSemantic={semantic:"WMS",token:"*"};const e=this._dtlsParameters.fingerprints.length;this._sdpObject.fingerprint={type:i.fingerprints[e-1].algorithm,hash:i.fingerprints[e-1].value},this._sdpObject.groups=[{type:"BUNDLE",mids:""}]}a&&(this._sdpObject.origin.address=a.ip,this._sdpObject.origin.ipVer=a.ipVersion)}updateIceParameters(e){a.debug("updateIceParameters() [iceParameters:%o]",e),this._iceParameters=e,this._sdpObject.icelite=e.iceLite?"ice-lite":void 0;for(const t of this._mediaSections)t.setIceParameters(e)}updateDtlsRole(e){a.debug("updateDtlsRole() [role:%s]",e),this._dtlsParameters.role=e;for(const t of this._mediaSections)t.setDtlsRole(e)}setSessionExtmapAllowMixed(){a.debug("setSessionExtmapAllowMixed()"),this._sdpObject.extmapAllowMixed="extmap-allow-mixed"}getNextMediaSectionIdx(){for(let e=0;e<this._mediaSections.length;++e){const t=this._mediaSections[e];if(t.closed)return{idx:e,reuseMid:t.mid}}return{idx:this._mediaSections.length}}send({offerMediaObject:e,reuseMid:t,offerRtpParameters:r,answerRtpParameters:a,codecOptions:n}){const o=new i.AnswerMediaSection({iceParameters:this._iceParameters,iceCandidates:this._iceCandidates,dtlsParameters:this._dtlsParameters,plainRtpParameters:this._plainRtpParameters,offerMediaObject:e,offerRtpParameters:r,answerRtpParameters:a,codecOptions:n}),c=o.getObject();c.rtp.find(e=>s.includes(e.codec.toLowerCase()))||(c.ext=c.ext?.filter(e=>"https://aomediacodec.github.io/av1-rtp-spec/#dependency-descriptor-rtp-header-extension"!==e.uri)),t?this.replaceMediaSection(o,t):this._midToIndex.has(o.mid)?this.replaceMediaSection(o):this.addMediaSection(o)}receive({mid:e,kind:t,offerRtpParameters:r,streamId:s,trackId:a}){this.setSessionExtmapAllowMixed();const n=new i.OfferMediaSection({iceParameters:this._iceParameters,iceCandidates:this._iceCandidates,dtlsParameters:this._dtlsParameters,plainRtpParameters:this._plainRtpParameters,mid:e,kind:t,offerRtpParameters:r,streamId:s,trackId:a}),o=this._mediaSections.find(e=>e.closed);o?this.replaceMediaSection(n,o.mid):this.addMediaSection(n)}pauseMediaSection(e){this.findMediaSection(e).pause()}resumeSendingMediaSection(e){this.findMediaSection(e).resume()}resumeReceivingMediaSection(e){this.findMediaSection(e).resume()}disableMediaSection(e){this.findMediaSection(e).disable()}closeMediaSection(e){const t=this.findMediaSection(e);return e===this._firstMid?(a.debug("closeMediaSection() | cannot close first media section, disabling it instead [mid:%s]",e),this.disableMediaSection(e),!1):(t.close(),this.regenerateBundleMids(),!0)}muxMediaSectionSimulcast(e,t){const i=this.findMediaSection(e);i.muxSimulcastStreams(t),this.replaceMediaSection(i)}sendSctpAssociation({offerMediaObject:e}){const t=new i.AnswerMediaSection({iceParameters:this._iceParameters,iceCandidates:this._iceCandidates,dtlsParameters:this._dtlsParameters,sctpParameters:this._sctpParameters,plainRtpParameters:this._plainRtpParameters,offerMediaObject:e});this.addMediaSection(t)}receiveSctpAssociation(){const e=new i.OfferMediaSection({iceParameters:this._iceParameters,iceCandidates:this._iceCandidates,dtlsParameters:this._dtlsParameters,sctpParameters:this._sctpParameters,plainRtpParameters:this._plainRtpParameters,mid:"datachannel",kind:"application"});this.addMediaSection(e)}getSdp(){return this._sdpObject.origin.sessionVersion++,e.write(this._sdpObject)}addMediaSection(e){this._firstMid||(this._firstMid=e.mid),this._mediaSections.push(e),this._midToIndex.set(e.mid,this._mediaSections.length-1),this._sdpObject.media.push(e.getObject()),this.regenerateBundleMids()}replaceMediaSection(e,t){if("string"==typeof t){const i=this._midToIndex.get(t);if(void 0===i)throw new Error(`no media section found for reuseMid '${t}'`);const r=this._mediaSections[i];this._mediaSections[i]=e,this._midToIndex.delete(r.mid),this._midToIndex.set(e.mid,i),this._sdpObject.media[i]=e.getObject(),this.regenerateBundleMids()}else{const t=this._midToIndex.get(e.mid);if(void 0===t)throw new Error(`no media section found with mid '${e.mid}'`);this._mediaSections[t]=e,this._sdpObject.media[t]=e.getObject()}}findMediaSection(e){const t=this._midToIndex.get(e);if(void 0===t)throw new Error(`no media section found with mid '${e}'`);return this._mediaSections[t]}regenerateBundleMids(){this._dtlsParameters&&(this._sdpObject.groups[0].mids=this._mediaSections.filter(e=>!e.closed).map(e=>e.mid).join(" "))}},Je}var Ze,et={};function tt(){if(Ze)return et;Ze=1,Object.defineProperty(et,"__esModule",{value:!0}),et.extractRtpCapabilities=function({sdpObject:t}){const i=new Map,r=new Map;for(const s of t.media){const t=s.type;switch(t){case"audio":case"video":break;default:continue}for(const e of s.rtp){const r={kind:t,mimeType:`${t}/${e.codec}`,preferredPayloadType:e.payload,clockRate:e.rate,channels:e.encoding,parameters:{},rtcpFeedback:[]};i.set(r.preferredPayloadType,r)}for(const t of s.fmtp??[]){const r=e.parseParams(t.config),s=i.get(t.payload);s&&(r?.hasOwnProperty("profile-level-id")&&(r["profile-level-id"]=String(r["profile-level-id"])),s.parameters=r)}for(const e of s.rtcpFb??[]){const r={type:e.type,parameter:e.subtype};if(r.parameter||delete r.parameter,"*"!==e.payload){const t=i.get(Number(e.payload));if(!t)continue;t.rtcpFeedback.push(r)}else for(const e of i.values())e.kind!==t||/.+\/rtx$/i.test(e.mimeType)||e.rtcpFeedback.push(r)}for(const e of s.ext??[]){if(e["encrypt-uri"])continue;const i={kind:t,uri:e.uri,preferredId:e.value};r.set(i.preferredId,i)}}return{codecs:Array.from(i.values()),headerExtensions:Array.from(r.values())}},et.extractDtlsParameters=function({sdpObject:e}){let t,i=e.setup,r=e.fingerprint;if(!i||!r){const t=(e.media??[]).find(e=>0!==e.port);t&&(i=i??t.setup,r=r??t.fingerprint)}if(!i)throw new Error("no a=setup found at SDP session or media level");if(!r)throw new Error("no a=fingerprint found at SDP session or media level");switch(i){case"active":t="client";break;case"passive":t="server";break;case"actpass":t="auto"}return{role:t,fingerprints:[{algorithm:r.type,value:r.hash}]}},et.getCname=function({offerMediaObject:e}){const t=(e.ssrcs??[]).find(e=>"cname"===e.attribute);if(!t)return"";return t.value},et.applyCodecParameters=function({offerRtpParameters:t,answerMediaObject:i}){for(const r of t.codecs){const t=r.mimeType.toLowerCase();if("audio/opus"!==t)continue;if(!(i.rtp??[]).find(e=>e.payload===r.payloadType))continue;i.fmtp=i.fmtp??[];let s=i.fmtp.find(e=>e.payload===r.payloadType);s||(s={payload:r.payloadType,config:""},i.fmtp.push(s));const a=e.parseParams(s.config);switch(t){case"audio/opus":{const e=r.parameters?.["sprop-stereo"];void 0!==e&&(a.stereo=Number(e)?1:0);break}}s.config="";for(const e of Object.keys(a))s.config&&(s.config+=";"),s.config+=`${e}=${a[e]}`}},et.addHeaderExtension=function({offerMediaObject:e,headerExtensionUri:t,headerExtensionId:i}){e.ext||(e.ext=[]);e.ext.push({uri:t,value:i})};const e=He();return et}var it,rt={};function st(){if(it)return rt;return it=1,Object.defineProperty(rt,"__esModule",{value:!0}),rt.getRtpEncodings=function({offerMediaObject:e,codecs:t}){const i=new Set;for(const t of e.ssrcs??[]){const e=t.id;e&&i.add(e)}if(0===i.size)throw new Error("no a=ssrc lines found");const r=new Map;for(const t of e.ssrcGroups??[]){if("FID"!==t.semantics)continue;const e=t.ssrcs.split(/\s+/),s=Number(e[0]),a=Number(e[1]);i.has(s)&&(i.delete(s),i.delete(a),r.set(s,a))}for(const e of i)r.set(e,void 0);const s=[];for(const[e,i]of r){const r={ssrc:e};i&&t.length>1&&(r.rtx={ssrc:i}),s.push(r)}return s},rt.addLegacySimulcast=function({offerMediaObject:e,numStreams:t}){if(t<=1)throw new TypeError("numStreams must be greater than 1");const i=(e.ssrcs??[]).find(e=>"msid"===e.attribute);if(!i)throw new Error("a=ssrc line with msid information not found");const[r,s]=i.value.split(" "),a=Number(i.id);let n;(e.ssrcGroups??[]).some(e=>{if("FID"!==e.semantics)return!1;const t=e.ssrcs.split(/\s+/);return Number(t[0])===a&&(n=Number(t[1]),!0)});const o=(e.ssrcs??[]).find(e=>"cname"===e.attribute);if(!o)throw new Error("a=ssrc line with cname information not found");const c=o.value,d=[],p=[];for(let e=0;e<t;++e)d.push(a+e),n&&p.push(n+e);e.ssrcGroups=[],e.ssrcs=[],e.ssrcGroups.push({semantics:"SIM",ssrcs:d.join(" ")});for(const t of d)e.ssrcs.push({id:t,attribute:"cname",value:c}),e.ssrcs.push({id:t,attribute:"msid",value:`${r} ${s}`});for(let t=0;t<p.length;++t){const i=d[t],a=p[t];e.ssrcs.push({id:a,attribute:"cname",value:c}),e.ssrcs.push({id:a,attribute:"msid",value:`${r} ${s}`}),e.ssrcGroups.push({semantics:"FID",ssrcs:`${i} ${a}`})}},rt}var at,nt,ot={};function ct(){if(at)return ot;return at=1,Object.defineProperty(ot,"__esModule",{value:!0}),ot.addNackSupportForOpus=function(e){for(const t of e.codecs??[])"audio/opus"!==t.mimeType.toLowerCase()&&"audio/multiopus"!==t.mimeType.toLowerCase()||t.rtcpFeedback?.some(e=>"nack"===e.type&&!e.parameter)||(t.rtcpFeedback||(t.rtcpFeedback=[]),t.rtcpFeedback.push({type:"nack"}))},ot.addHeaderExtensionSupport=function(e,t){let i;const r=e.headerExtensions?.find(e=>e.uri===t.uri);if(r){if(r.kind===t.kind)return;i=r.preferredId}e.headerExtensions||(e.headerExtensions=[]);if(void 0===i){i=1;const t=new Set(e.headerExtensions.map(e=>e.preferredId));for(;t.has(i);)++i}const s={kind:t.kind,uri:t.uri,preferredId:i,preferredEncrypt:!1,direction:t.direction};e.headerExtensions.push(s)},ot.getMsidStreamIdAndTrackId=function(e){if(!e||"string"!=typeof e)return{msidStreamId:void 0,msidTrackId:void 0};const[t,i]=e.trim().split(/\s+/);if(!t)return{msidStreamId:void 0,msidTrackId:void 0};return{msidStreamId:t,msidTrackId:i}},ot}var dt,pt={};var lt,ht={};var ut,mt={};var ft,gt,vt={};function bt(){if(gt)return q;gt=1,Object.defineProperty(q,"__esModule",{value:!0}),q.Device=void 0,q.detectDevice=h,q.detectDeviceAsync=u;const e=G(),t=J(),i=Z(),r=ie(),s=pe(),a=Ie(),n=function(){if(nt)return Fe;nt=1,Object.defineProperty(Fe,"__esModule",{value:!0}),Fe.Chrome111=void 0;const e=He(),t=J(),i=G(),r=pe(),s=Z(),a=Ge(),n=Xe(),o=tt(),c=st(),d=ct(),p=new i.Logger("Chrome111"),l="Chrome111",h={OS:1024,MIS:1024};let u=class i extends t.EnhancedEventEmitter{_closed=!1;_direction;_remoteSdp;_getSendExtendedRtpCapabilities;_forcedLocalDtlsRole;_pc;_mapMidTransceiver=new Map;_sendStream=new MediaStream;_hasDataChannelMediaSection=!1;_nextSendSctpStreamId=0;_transportReady=!1;static createFactory(){return{name:l,factory:e=>new i(e),getNativeRtpCapabilities:async({direction:t})=>{p.debug("getNativeRtpCapabilities() [direction:%o]",t);let r=new RTCPeerConnection({iceServers:[],iceTransportPolicy:"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require"});try{r.addTransceiver("audio",{direction:t}),r.addTransceiver("video",{direction:t,sendEncodings:[{scalabilityMode:"L3T3"}]});const s=await r.createOffer();try{r.close()}catch(e){}r=void 0;const a=e.parse(s.sdp);return i.getLocalRtpCapabilities(a)}catch(e){try{r?.close()}catch(e){}throw r=void 0,e}},getNativeSctpCapabilities:async()=>(p.debug("getNativeSctpCapabilities()"),{numStreams:h})}}static getLocalRtpCapabilities(e,t=[]){const i=o.extractRtpCapabilities({sdpObject:e});r.validateAndNormalizeRtpCapabilities(i),d.addNackSupportForOpus(i);for(const e of t)d.addHeaderExtensionSupport(i,e);return i}constructor({direction:e,iceParameters:t,iceCandidates:i,dtlsParameters:r,sctpParameters:s,iceServers:a,iceTransportPolicy:o,additionalSettings:c,getSendExtendedRtpCapabilities:d}){super(),p.debug("constructor()"),this._direction=e,this._remoteSdp=new n.RemoteSdp({iceParameters:t,iceCandidates:i,dtlsParameters:r,sctpParameters:s}),this._getSendExtendedRtpCapabilities=d,r.role&&"auto"!==r.role&&(this._forcedLocalDtlsRole="server"===r.role?"client":"server"),this._pc=new RTCPeerConnection({iceServers:a??[],iceTransportPolicy:o??"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require",...c}),this._pc.addEventListener("icegatheringstatechange",this.onIceGatheringStateChange),this._pc.addEventListener("icecandidateerror",this.onIceCandidateError),this._pc.connectionState?this._pc.addEventListener("connectionstatechange",this.onConnectionStateChange):(p.warn("run() | pc.connectionState not supported, using pc.iceConnectionState"),this._pc.addEventListener("iceconnectionstatechange",this.onIceConnectionStateChange))}get name(){return l}close(){if(p.debug("close()"),!this._closed){this._closed=!0;try{this._pc.close()}catch(e){}this._pc.removeEventListener("icegatheringstatechange",this.onIceGatheringStateChange),this._pc.removeEventListener("icecandidateerror",this.onIceCandidateError),this._pc.removeEventListener("connectionstatechange",this.onConnectionStateChange),this._pc.removeEventListener("iceconnectionstatechange",this.onIceConnectionStateChange),this.emit("@close"),super.close()}}async updateIceServers(e){this.assertNotClosed(),p.debug("updateIceServers()");const t=this._pc.getConfiguration();t.iceServers=e,this._pc.setConfiguration(t)}async restartIce(e){if(this.assertNotClosed(),p.debug("restartIce()"),this._remoteSdp.updateIceParameters(e),this._transportReady)if("send"===this._direction){const e=await this._pc.createOffer({iceRestart:!0});p.debug("restartIce() | calling pc.setLocalDescription() [offer:%o]",e),await this._pc.setLocalDescription(e);const t={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("restartIce() | calling pc.setRemoteDescription() [answer:%o]",t),await this._pc.setRemoteDescription(t)}else{const e={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("restartIce() | calling pc.setRemoteDescription() [offer:%o]",e),await this._pc.setRemoteDescription(e);const t=await this._pc.createAnswer();p.debug("restartIce() | calling pc.setLocalDescription() [answer:%o]",t),await this._pc.setLocalDescription(t)}}async getTransportStats(){return this.assertNotClosed(),this._pc.getStats()}async send({track:t,streamId:s,encodings:n,codecOptions:d,headerExtensionOptions:l,codec:h,onRtpSender:u}){if(this.assertNotClosed(),this.assertSendDirection(),p.debug("send() [kind:%s, track.id:%s, streamId:%s]",t.kind,t.id,s),n&&n.length>1){let e=1;for(const t of n){const i=t.scalabilityMode?(0,a.parse)(t.scalabilityMode).temporalLayers:3;i>e&&(e=i)}n.forEach((t,i)=>{t.rid=`r${i}`,t.scalabilityMode=`L1T${e}`})}const m=this._remoteSdp.getNextMediaSectionIdx(),f=this._pc.addTransceiver(t,{direction:"sendonly",streams:[this._sendStream],sendEncodings:n});u&&u(f.sender);let g=await this._pc.createOffer(),v=e.parse(g.sdp);v.extmapAllowMixed&&this._remoteSdp.setSessionExtmapAllowMixed();const b=[];b.push({uri:"http://www.webrtc.org/experiments/rtp-hdrext/abs-capture-time",kind:t.kind,direction:"sendonly"});const _=i.getLocalRtpCapabilities(v,b),y=this._getSendExtendedRtpCapabilities(_),S=r.getSendingRtpParameters(t.kind,y);S.codecs=r.reduceCodecs(S.codecs,h);const w=r.getSendingRemoteRtpParameters(t.kind,y);if(w.codecs=r.reduceCodecs(w.codecs,h),this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:v}),l?.absCaptureTime){const t=v.media[m.idx];o.addHeaderExtension({offerMediaObject:t,headerExtensionUri:"http://www.webrtc.org/experiments/rtp-hdrext/abs-capture-time",headerExtensionId:w.headerExtensions.find(e=>"http://www.webrtc.org/experiments/rtp-hdrext/abs-capture-time"===e.uri).id}),g={type:"offer",sdp:e.write(v)}}p.debug("send() | calling pc.setLocalDescription() [offer:%o]",g),await this._pc.setLocalDescription(g);const k=f.mid;S.mid=k,v=e.parse(this._pc.localDescription.sdp);const T=v.media[m.idx];if(S.rtcp.cname=o.getCname({offerMediaObject:T}),S.msid=`${s??this._sendStream.id} ${t.id}`,n)if(1===n.length){const e=c.getRtpEncodings({offerMediaObject:T,codecs:S.codecs});Object.assign(e[0],n[0]),S.encodings=e}else S.encodings=n;else S.encodings=c.getRtpEncodings({offerMediaObject:T,codecs:S.codecs});this._remoteSdp.send({offerMediaObject:T,reuseMid:m.reuseMid,offerRtpParameters:S,answerRtpParameters:w,codecOptions:d});const C={type:"answer",sdp:this._remoteSdp.getSdp()};return p.debug("send() | calling pc.setRemoteDescription() [answer:%o]",C),await this._pc.setRemoteDescription(C),this._mapMidTransceiver.set(k,f),{localId:k,rtpParameters:S,rtpSender:f.sender}}async stopSending(e){if(this.assertSendDirection(),p.debug("stopSending() [localId:%s]",e),this._closed)return;const t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated RTCRtpTransceiver not found");if(t.sender.replaceTrack(null),this._pc.removeTrack(t.sender),this._remoteSdp.closeMediaSection(t.mid))try{t.stop()}catch(e){}const i=await this._pc.createOffer();p.debug("stopSending() | calling pc.setLocalDescription() [offer:%o]",i),await this._pc.setLocalDescription(i);const r={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("stopSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r),this._mapMidTransceiver.delete(e)}async pauseSending(e){this.assertNotClosed(),this.assertSendDirection(),p.debug("pauseSending() [localId:%s]",e);const t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated RTCRtpTransceiver not found");t.direction="inactive",this._remoteSdp.pauseMediaSection(e);const i=await this._pc.createOffer();p.debug("pauseSending() | calling pc.setLocalDescription() [offer:%o]",i),await this._pc.setLocalDescription(i);const r={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("pauseSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r)}async resumeSending(e){this.assertNotClosed(),this.assertSendDirection(),p.debug("resumeSending() [localId:%s]",e);const t=this._mapMidTransceiver.get(e);if(this._remoteSdp.resumeSendingMediaSection(e),!t)throw new Error("associated RTCRtpTransceiver not found");t.direction="sendonly";const i=await this._pc.createOffer();p.debug("resumeSending() | calling pc.setLocalDescription() [offer:%o]",i),await this._pc.setLocalDescription(i);const r={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("resumeSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r)}async replaceTrack(e,t){this.assertNotClosed(),this.assertSendDirection(),t?p.debug("replaceTrack() [localId:%s, track.id:%s]",e,t.id):p.debug("replaceTrack() [localId:%s, no track]",e);const i=this._mapMidTransceiver.get(e);if(!i)throw new Error("associated RTCRtpTransceiver not found");await i.sender.replaceTrack(t)}async setMaxSpatialLayer(e,t){this.assertNotClosed(),this.assertSendDirection(),p.debug("setMaxSpatialLayer() [localId:%s, spatialLayer:%s]",e,t);const i=this._mapMidTransceiver.get(e);if(!i)throw new Error("associated RTCRtpTransceiver not found");const r=i.sender.getParameters();r.encodings.forEach((e,i)=>{e.active=i<=t}),await i.sender.setParameters(r),this._remoteSdp.muxMediaSectionSimulcast(e,r.encodings);const s=await this._pc.createOffer();p.debug("setMaxSpatialLayer() | calling pc.setLocalDescription() [offer:%o]",s),await this._pc.setLocalDescription(s);const a={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("setMaxSpatialLayer() | calling pc.setRemoteDescription() [answer:%o]",a),await this._pc.setRemoteDescription(a)}async setRtpEncodingParameters(e,t){this.assertNotClosed(),this.assertSendDirection(),p.debug("setRtpEncodingParameters() [localId:%s, params:%o]",e,t);const i=this._mapMidTransceiver.get(e);if(!i)throw new Error("associated RTCRtpTransceiver not found");const r=i.sender.getParameters();r.encodings.forEach((e,i)=>{r.encodings[i]={...e,...t}}),await i.sender.setParameters(r),this._remoteSdp.muxMediaSectionSimulcast(e,r.encodings);const s=await this._pc.createOffer();p.debug("setRtpEncodingParameters() | calling pc.setLocalDescription() [offer:%o]",s),await this._pc.setLocalDescription(s);const a={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("setRtpEncodingParameters() | calling pc.setRemoteDescription() [answer:%o]",a),await this._pc.setRemoteDescription(a)}async getSenderStats(e){this.assertNotClosed(),this.assertSendDirection();const t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated RTCRtpTransceiver not found");return t.sender.getStats()}async sendDataChannel({ordered:t,maxPacketLifeTime:i,maxRetransmits:r,label:s,protocol:a}){this.assertNotClosed(),this.assertSendDirection();const n={negotiated:!0,id:this._nextSendSctpStreamId,ordered:t,maxPacketLifeTime:i,maxRetransmits:r,protocol:a};p.debug("sendDataChannel() [options:%o]",n);const o=this._pc.createDataChannel(s,n);if(this._nextSendSctpStreamId=++this._nextSendSctpStreamId%h.MIS,!this._hasDataChannelMediaSection){const t=await this._pc.createOffer(),i=e.parse(t.sdp),r=i.media.find(e=>"application"===e.type);this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:i}),p.debug("sendDataChannel() | calling pc.setLocalDescription() [offer:%o]",t),await this._pc.setLocalDescription(t),this._remoteSdp.sendSctpAssociation({offerMediaObject:r});const s={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]",s),await this._pc.setRemoteDescription(s),this._hasDataChannelMediaSection=!0}return{dataChannel:o,sctpStreamParameters:{streamId:n.id,ordered:n.ordered,maxPacketLifeTime:n.maxPacketLifeTime,maxRetransmits:n.maxRetransmits}}}async receive(t){this.assertNotClosed(),this.assertRecvDirection();const i=[],r=new Map;for(const e of t){const{trackId:t,kind:i,rtpParameters:s,streamId:a}=e;p.debug("receive() [trackId:%s, kind:%s]",t,i);const n=s.mid??String(this._mapMidTransceiver.size);r.set(t,n);const{msidStreamId:o}=d.getMsidStreamIdAndTrackId(s.msid);this._remoteSdp.receive({mid:n,kind:i,offerRtpParameters:s,streamId:a??o??s.rtcp?.cname??"-",trackId:t})}const s={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("receive() | calling pc.setRemoteDescription() [offer:%o]",s),await this._pc.setRemoteDescription(s);for(const e of t){const{trackId:t,onRtpReceiver:i}=e;if(i){const e=r.get(t),s=this._pc.getTransceivers().find(t=>t.mid===e);if(!s)throw new Error("transceiver not found");i(s.receiver)}}let a=await this._pc.createAnswer();const n=e.parse(a.sdp);for(const e of t){const{trackId:t,rtpParameters:i}=e,s=r.get(t),a=n.media.find(e=>String(e.mid)===s);o.applyCodecParameters({offerRtpParameters:i,answerMediaObject:a})}a={type:"answer",sdp:e.write(n)},this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:n}),p.debug("receive() | calling pc.setLocalDescription() [answer:%o]",a),await this._pc.setLocalDescription(a);for(const e of t){const{trackId:t}=e,s=r.get(t),a=this._pc.getTransceivers().find(e=>e.mid===s);if(!a)throw new Error("new RTCRtpTransceiver not found");this._mapMidTransceiver.set(s,a),i.push({localId:s,track:a.receiver.track,rtpReceiver:a.receiver})}return i}async stopReceiving(e){if(this.assertRecvDirection(),this._closed)return;for(const t of e){p.debug("stopReceiving() [localId:%s]",t);const e=this._mapMidTransceiver.get(t);if(!e)throw new Error("associated RTCRtpTransceiver not found");this._remoteSdp.closeMediaSection(e.mid)}const t={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("stopReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const i=await this._pc.createAnswer();p.debug("stopReceiving() | calling pc.setLocalDescription() [answer:%o]",i),await this._pc.setLocalDescription(i);for(const t of e)this._mapMidTransceiver.delete(t)}async pauseReceiving(e){this.assertNotClosed(),this.assertRecvDirection();for(const t of e){p.debug("pauseReceiving() [localId:%s]",t);const e=this._mapMidTransceiver.get(t);if(!e)throw new Error("associated RTCRtpTransceiver not found");e.direction="inactive",this._remoteSdp.pauseMediaSection(t)}const t={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("pauseReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const i=await this._pc.createAnswer();p.debug("pauseReceiving() | calling pc.setLocalDescription() [answer:%o]",i),await this._pc.setLocalDescription(i)}async resumeReceiving(e){this.assertNotClosed(),this.assertRecvDirection();for(const t of e){p.debug("resumeReceiving() [localId:%s]",t);const e=this._mapMidTransceiver.get(t);if(!e)throw new Error("associated RTCRtpTransceiver not found");e.direction="recvonly",this._remoteSdp.resumeReceivingMediaSection(t)}const t={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("resumeReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const i=await this._pc.createAnswer();p.debug("resumeReceiving() | calling pc.setLocalDescription() [answer:%o]",i),await this._pc.setLocalDescription(i)}async getReceiverStats(e){this.assertNotClosed(),this.assertRecvDirection();const t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated RTCRtpTransceiver not found");return t.receiver.getStats()}async receiveDataChannel({sctpStreamParameters:t,label:i,protocol:r}){this.assertNotClosed(),this.assertRecvDirection();const{streamId:s,ordered:a,maxPacketLifeTime:n,maxRetransmits:o}=t,c={negotiated:!0,id:s,ordered:a,maxPacketLifeTime:n,maxRetransmits:o,protocol:r};p.debug("receiveDataChannel() [options:%o]",c);const d=this._pc.createDataChannel(i,c);if(!this._hasDataChannelMediaSection){this._remoteSdp.receiveSctpAssociation();const t={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("receiveDataChannel() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const i=await this._pc.createAnswer();if(!this._transportReady){const t=e.parse(i.sdp);await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:t})}p.debug("receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]",i),await this._pc.setLocalDescription(i),this._hasDataChannelMediaSection=!0}return{dataChannel:d}}async setupTransport({localDtlsRole:t,localSdpObject:i}){i||(i=e.parse(this._pc.localDescription.sdp));const r=o.extractDtlsParameters({sdpObject:i});r.role=t,this._remoteSdp.updateDtlsRole("client"===t?"server":"client"),await new Promise((e,t)=>{this.safeEmit("@connect",{dtlsParameters:r},e,t)}),this._transportReady=!0}onIceGatheringStateChange=()=>{this.emit("@icegatheringstatechange",this._pc.iceGatheringState)};onIceCandidateError=e=>{this.emit("@icecandidateerror",e)};onConnectionStateChange=()=>{this.emit("@connectionstatechange",this._pc.connectionState)};onIceConnectionStateChange=()=>{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")}};assertNotClosed(){if(this._closed)throw new s.InvalidStateError("method called in a closed handler")}assertSendDirection(){if("send"!==this._direction)throw new Error('method can just be called for handlers with "send" direction')}assertRecvDirection(){if("recv"!==this._direction)throw new Error('method can just be called for handlers with "recv" direction')}};return Fe.Chrome111=u,Fe}(),o=function(){if(dt)return pt;dt=1,Object.defineProperty(pt,"__esModule",{value:!0}),pt.Chrome74=void 0;const e=He(),t=G(),i=J(),r=pe(),s=Z(),a=Ge(),n=Xe(),o=tt(),c=st(),d=ct(),p=new t.Logger("Chrome74"),l="Chrome74",h={OS:1024,MIS:1024};let u=class t extends i.EnhancedEventEmitter{_closed=!1;_direction;_remoteSdp;_getSendExtendedRtpCapabilities;_forcedLocalDtlsRole;_pc;_mapMidTransceiver=new Map;_sendStream=new MediaStream;_hasDataChannelMediaSection=!1;_nextSendSctpStreamId=0;_transportReady=!1;static createFactory(){return{name:l,factory:e=>new t(e),getNativeRtpCapabilities:async({direction:i})=>{p.debug("getNativeRtpCapabilities() [direction:%o]",i);let r=new RTCPeerConnection({iceServers:[],iceTransportPolicy:"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require"});try{r.addTransceiver("audio",{direction:i}),r.addTransceiver("video",{direction:i});const s=await r.createOffer();try{r.close()}catch(e){}r=void 0;const a=e.parse(s.sdp);return t.getLocalRtpCapabilities(a)}catch(e){try{r?.close()}catch(e){}throw r=void 0,e}},getNativeSctpCapabilities:async()=>(p.debug("getNativeSctpCapabilities()"),{numStreams:h})}}static getLocalRtpCapabilities(e,t=[]){const i=o.extractRtpCapabilities({sdpObject:e});r.validateAndNormalizeRtpCapabilities(i),d.addNackSupportForOpus(i);for(const e of t)d.addHeaderExtensionSupport(i,e);return i}constructor({direction:e,iceParameters:t,iceCandidates:i,dtlsParameters:r,sctpParameters:s,iceServers:a,iceTransportPolicy:o,additionalSettings:c,getSendExtendedRtpCapabilities:d}){super(),p.debug("constructor()"),this._direction=e,this._remoteSdp=new n.RemoteSdp({iceParameters:t,iceCandidates:i,dtlsParameters:r,sctpParameters:s}),this._getSendExtendedRtpCapabilities=d,r.role&&"auto"!==r.role&&(this._forcedLocalDtlsRole="server"===r.role?"client":"server"),this._pc=new RTCPeerConnection({iceServers:a??[],iceTransportPolicy:o??"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require",...c}),this._pc.addEventListener("icegatheringstatechange",this.onIceGatheringStateChange),this._pc.addEventListener("icecandidateerror",this.onIceCandidateError),this._pc.connectionState?this._pc.addEventListener("connectionstatechange",this.onConnectionStateChange):(p.warn("run() | pc.connectionState not supported, using pc.iceConnectionState"),this._pc.addEventListener("iceconnectionstatechange",this.onIceConnectionStateChange))}get name(){return l}close(){if(p.debug("close()"),!this._closed){this._closed=!0;try{this._pc.close()}catch(e){}this._pc.removeEventListener("icegatheringstatechange",this.onIceGatheringStateChange),this._pc.removeEventListener("icecandidateerror",this.onIceCandidateError),this._pc.removeEventListener("connectionstatechange",this.onConnectionStateChange),this._pc.removeEventListener("iceconnectionstatechange",this.onIceConnectionStateChange),this.emit("@close"),super.close()}}async updateIceServers(e){this.assertNotClosed(),p.debug("updateIceServers()");const t=this._pc.getConfiguration();t.iceServers=e,this._pc.setConfiguration(t)}async restartIce(e){if(this.assertNotClosed(),p.debug("restartIce()"),this._remoteSdp.updateIceParameters(e),this._transportReady)if("send"===this._direction){const e=await this._pc.createOffer({iceRestart:!0});p.debug("restartIce() | calling pc.setLocalDescription() [offer:%o]",e),await this._pc.setLocalDescription(e);const t={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("restartIce() | calling pc.setRemoteDescription() [answer:%o]",t),await this._pc.setRemoteDescription(t)}else{const e={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("restartIce() | calling pc.setRemoteDescription() [offer:%o]",e),await this._pc.setRemoteDescription(e);const t=await this._pc.createAnswer();p.debug("restartIce() | calling pc.setLocalDescription() [answer:%o]",t),await this._pc.setLocalDescription(t)}}async getTransportStats(){return this.assertNotClosed(),this._pc.getStats()}async send({track:i,streamId:s,encodings:n,codecOptions:d,headerExtensionOptions:l,codec:h}){this.assertNotClosed(),this.assertSendDirection(),p.debug("send() [kind:%s, track.id:%s, streamId:%s]",i.kind,i.id,s),n&&n.length>1&&n.forEach((e,t)=>{e.rid=`r${t}`});const u=this._remoteSdp.getNextMediaSectionIdx(),m=this._pc.addTransceiver(i,{direction:"sendonly",streams:[this._sendStream],sendEncodings:n});let f=await this._pc.createOffer(),g=e.parse(f.sdp);g.extmapAllowMixed&&this._remoteSdp.setSessionExtmapAllowMixed();const v=[];v.push({uri:"http://www.webrtc.org/experiments/rtp-hdrext/abs-capture-time",kind:i.kind,direction:"sendonly"});const b=t.getLocalRtpCapabilities(g,v),_=this._getSendExtendedRtpCapabilities(b),y=r.getSendingRtpParameters(i.kind,_);y.codecs=r.reduceCodecs(y.codecs,h);const S=r.getSendingRemoteRtpParameters(i.kind,_);S.codecs=r.reduceCodecs(S.codecs,h),this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:g});let w=!1;const k=(0,a.parse)((n??[{}])[0].scalabilityMode);let T;1===n?.length&&k.spatialLayers>1&&"video/vp9"===y.codecs[0].mimeType.toLowerCase()&&(p.debug("send() | enabling legacy simulcast for VP9 SVC"),w=!0,g=e.parse(f.sdp),T=g.media[u.idx],c.addLegacySimulcast({offerMediaObject:T,numStreams:k.spatialLayers}),f={type:"offer",sdp:e.write(g)}),p.debug("send() | calling pc.setLocalDescription() [offer:%o]",f),l?.absCaptureTime&&(T=g.media[u.idx],o.addHeaderExtension({offerMediaObject:T,headerExtensionUri:"http://www.webrtc.org/experiments/rtp-hdrext/abs-capture-time",headerExtensionId:S.headerExtensions.find(e=>"http://www.webrtc.org/experiments/rtp-hdrext/abs-capture-time"===e.uri).id}),f={type:"offer",sdp:e.write(g)}),await this._pc.setLocalDescription(f);const C=m.mid;if(y.mid=C,g=e.parse(this._pc.localDescription.sdp),T=g.media[u.idx],y.rtcp.cname=o.getCname({offerMediaObject:T}),y.msid=`${s??this._sendStream.id} ${i.id}`,n)if(1===n.length){let e=c.getRtpEncodings({offerMediaObject:T,codecs:y.codecs});Object.assign(e[0],n[0]),w&&(e=[e[0]]),y.encodings=e}else y.encodings=n;else y.encodings=c.getRtpEncodings({offerMediaObject:T,codecs:y.codecs});if(y.encodings.length>1&&("video/vp8"===y.codecs[0].mimeType.toLowerCase()||"video/h264"===y.codecs[0].mimeType.toLowerCase()))for(const e of y.encodings)e.scalabilityMode?e.scalabilityMode=`L1T${k.temporalLayers}`:e.scalabilityMode="L1T3";this._remoteSdp.send({offerMediaObject:T,reuseMid:u.reuseMid,offerRtpParameters:y,answerRtpParameters:S,codecOptions:d});const P={type:"answer",sdp:this._remoteSdp.getSdp()};return p.debug("send() | calling pc.setRemoteDescription() [answer:%o]",P),await this._pc.setRemoteDescription(P),this._mapMidTransceiver.set(C,m),{localId:C,rtpParameters:y,rtpSender:m.sender}}async stopSending(e){if(this.assertSendDirection(),p.debug("stopSending() [localId:%s]",e),this._closed)return;const t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated RTCRtpTransceiver not found");if(t.sender.replaceTrack(null),this._pc.removeTrack(t.sender),this._remoteSdp.closeMediaSection(t.mid))try{t.stop()}catch(e){}const i=await this._pc.createOffer();p.debug("stopSending() | calling pc.setLocalDescription() [offer:%o]",i),await this._pc.setLocalDescription(i);const r={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("stopSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r),this._mapMidTransceiver.delete(e)}async pauseSending(e){this.assertNotClosed(),this.assertSendDirection(),p.debug("pauseSending() [localId:%s]",e);const t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated RTCRtpTransceiver not found");t.direction="inactive",this._remoteSdp.pauseMediaSection(e);const i=await this._pc.createOffer();p.debug("pauseSending() | calling pc.setLocalDescription() [offer:%o]",i),await this._pc.setLocalDescription(i);const r={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("pauseSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r)}async resumeSending(e){this.assertNotClosed(),this.assertSendDirection(),p.debug("resumeSending() [localId:%s]",e);const t=this._mapMidTransceiver.get(e);if(this._remoteSdp.resumeSendingMediaSection(e),!t)throw new Error("associated RTCRtpTransceiver not found");t.direction="sendonly";const i=await this._pc.createOffer();p.debug("resumeSending() | calling pc.setLocalDescription() [offer:%o]",i),await this._pc.setLocalDescription(i);const r={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("resumeSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r)}async replaceTrack(e,t){this.assertNotClosed(),this.assertSendDirection(),t?p.debug("replaceTrack() [localId:%s, track.id:%s]",e,t.id):p.debug("replaceTrack() [localId:%s, no track]",e);const i=this._mapMidTransceiver.get(e);if(!i)throw new Error("associated RTCRtpTransceiver not found");await i.sender.replaceTrack(t)}async setMaxSpatialLayer(e,t){this.assertNotClosed(),this.assertSendDirection(),p.debug("setMaxSpatialLayer() [localId:%s, spatialLayer:%s]",e,t);const i=this._mapMidTransceiver.get(e);if(!i)throw new Error("associated RTCRtpTransceiver not found");const r=i.sender.getParameters();r.encodings.forEach((e,i)=>{e.active=i<=t}),await i.sender.setParameters(r),this._remoteSdp.muxMediaSectionSimulcast(e,r.encodings);const s=await this._pc.createOffer();p.debug("setMaxSpatialLayer() | calling pc.setLocalDescription() [offer:%o]",s),await this._pc.setLocalDescription(s);const a={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("setMaxSpatialLayer() | calling pc.setRemoteDescription() [answer:%o]",a),await this._pc.setRemoteDescription(a)}async setRtpEncodingParameters(e,t){this.assertNotClosed(),this.assertSendDirection(),p.debug("setRtpEncodingParameters() [localId:%s, params:%o]",e,t);const i=this._mapMidTransceiver.get(e);if(!i)throw new Error("associated RTCRtpTransceiver not found");const r=i.sender.getParameters();r.encodings.forEach((e,i)=>{r.encodings[i]={...e,...t}}),await i.sender.setParameters(r),this._remoteSdp.muxMediaSectionSimulcast(e,r.encodings);const s=await this._pc.createOffer();p.debug("setRtpEncodingParameters() | calling pc.setLocalDescription() [offer:%o]",s),await this._pc.setLocalDescription(s);const a={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("setRtpEncodingParameters() | calling pc.setRemoteDescription() [answer:%o]",a),await this._pc.setRemoteDescription(a)}async getSenderStats(e){this.assertNotClosed(),this.assertSendDirection();const t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated RTCRtpTransceiver not found");return t.sender.getStats()}async sendDataChannel({ordered:t,maxPacketLifeTime:i,maxRetransmits:r,label:s,protocol:a}){this.assertNotClosed(),this.assertSendDirection();const n={negotiated:!0,id:this._nextSendSctpStreamId,ordered:t,maxPacketLifeTime:i,maxRetransmits:r,protocol:a};p.debug("sendDataChannel() [options:%o]",n);const o=this._pc.createDataChannel(s,n);if(this._nextSendSctpStreamId=++this._nextSendSctpStreamId%h.MIS,!this._hasDataChannelMediaSection){const t=await this._pc.createOffer(),i=e.parse(t.sdp),r=i.media.find(e=>"application"===e.type);this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:i}),p.debug("sendDataChannel() | calling pc.setLocalDescription() [offer:%o]",t),await this._pc.setLocalDescription(t),this._remoteSdp.sendSctpAssociation({offerMediaObject:r});const s={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]",s),await this._pc.setRemoteDescription(s),this._hasDataChannelMediaSection=!0}return{dataChannel:o,sctpStreamParameters:{streamId:n.id,ordered:n.ordered,maxPacketLifeTime:n.maxPacketLifeTime,maxRetransmits:n.maxRetransmits}}}async receive(t){this.assertNotClosed(),this.assertRecvDirection();const i=[],r=new Map;for(const e of t){const{trackId:t,kind:i,rtpParameters:s,streamId:a}=e;p.debug("receive() [trackId:%s, kind:%s]",t,i);const n=s.mid??String(this._mapMidTransceiver.size);r.set(t,n);const{msidStreamId:o}=d.getMsidStreamIdAndTrackId(s.msid);this._remoteSdp.receive({mid:n,kind:i,offerRtpParameters:s,streamId:a??o??s.rtcp?.cname??"-",trackId:t})}const s={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("receive() | calling pc.setRemoteDescription() [offer:%o]",s),await this._pc.setRemoteDescription(s);let a=await this._pc.createAnswer();const n=e.parse(a.sdp);for(const e of t){const{trackId:t,rtpParameters:i}=e,s=r.get(t),a=n.media.find(e=>String(e.mid)===s);o.applyCodecParameters({offerRtpParameters:i,answerMediaObject:a})}a={type:"answer",sdp:e.write(n)},this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:n}),p.debug("receive() | calling pc.setLocalDescription() [answer:%o]",a),await this._pc.setLocalDescription(a);for(const e of t){const{trackId:t}=e,s=r.get(t),a=this._pc.getTransceivers().find(e=>e.mid===s);if(!a)throw new Error("new RTCRtpTransceiver not found");this._mapMidTransceiver.set(s,a),i.push({localId:s,track:a.receiver.track,rtpReceiver:a.receiver})}return i}async stopReceiving(e){if(this.assertRecvDirection(),this._closed)return;for(const t of e){p.debug("stopReceiving() [localId:%s]",t);const e=this._mapMidTransceiver.get(t);if(!e)throw new Error("associated RTCRtpTransceiver not found");this._remoteSdp.closeMediaSection(e.mid)}const t={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("stopReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const i=await this._pc.createAnswer();p.debug("stopReceiving() | calling pc.setLocalDescription() [answer:%o]",i),await this._pc.setLocalDescription(i);for(const t of e)this._mapMidTransceiver.delete(t)}async pauseReceiving(e){this.assertNotClosed(),this.assertRecvDirection();for(const t of e){p.debug("pauseReceiving() [localId:%s]",t);const e=this._mapMidTransceiver.get(t);if(!e)throw new Error("associated RTCRtpTransceiver not found");e.direction="inactive",this._remoteSdp.pauseMediaSection(t)}const t={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("pauseReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const i=await this._pc.createAnswer();p.debug("pauseReceiving() | calling pc.setLocalDescription() [answer:%o]",i),await this._pc.setLocalDescription(i)}async resumeReceiving(e){this.assertNotClosed(),this.assertRecvDirection();for(const t of e){p.debug("resumeReceiving() [localId:%s]",t);const e=this._mapMidTransceiver.get(t);if(!e)throw new Error("associated RTCRtpTransceiver not found");e.direction="recvonly",this._remoteSdp.resumeReceivingMediaSection(t)}const t={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("resumeReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const i=await this._pc.createAnswer();p.debug("resumeReceiving() | calling pc.setLocalDescription() [answer:%o]",i),await this._pc.setLocalDescription(i)}async getReceiverStats(e){this.assertNotClosed(),this.assertRecvDirection();const t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated RTCRtpTransceiver not found");return t.receiver.getStats()}async receiveDataChannel({sctpStreamParameters:t,label:i,protocol:r}){this.assertNotClosed(),this.assertRecvDirection();const{streamId:s,ordered:a,maxPacketLifeTime:n,maxRetransmits:o}=t,c={negotiated:!0,id:s,ordered:a,maxPacketLifeTime:n,maxRetransmits:o,protocol:r};p.debug("receiveDataChannel() [options:%o]",c);const d=this._pc.createDataChannel(i,c);if(!this._hasDataChannelMediaSection){this._remoteSdp.receiveSctpAssociation();const t={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("receiveDataChannel() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const i=await this._pc.createAnswer();if(!this._transportReady){const t=e.parse(i.sdp);await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:t})}p.debug("receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]",i),await this._pc.setLocalDescription(i),this._hasDataChannelMediaSection=!0}return{dataChannel:d}}async setupTransport({localDtlsRole:t,localSdpObject:i}){i||(i=e.parse(this._pc.localDescription.sdp));const r=o.extractDtlsParameters({sdpObject:i});r.role=t,this._remoteSdp.updateDtlsRole("client"===t?"server":"client"),await new Promise((e,t)=>{this.safeEmit("@connect",{dtlsParameters:r},e,t)}),this._transportReady=!0}onIceGatheringStateChange=()=>{this.emit("@icegatheringstatechange",this._pc.iceGatheringState)};onIceCandidateError=e=>{this.emit("@icecandidateerror",e)};onConnectionStateChange=()=>{this.emit("@connectionstatechange",this._pc.connectionState)};onIceConnectionStateChange=()=>{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")}};assertNotClosed(){if(this._closed)throw new s.InvalidStateError("method called in a closed handler")}assertSendDirection(){if("send"!==this._direction)throw new Error('method can just be called for handlers with "send" direction')}assertRecvDirection(){if("recv"!==this._direction)throw new Error('method can just be called for handlers with "recv" direction')}};return pt.Chrome74=u,pt}(),c=function(){if(lt)return ht;lt=1,Object.defineProperty(ht,"__esModule",{value:!0}),ht.Firefox120=void 0;const e=He(),t=J(),i=G(),r=Z(),s=pe(),a=Ge(),n=Xe(),o=tt(),c=st(),d=ct(),p=new i.Logger("Firefox120"),l="Firefox120",h={OS:16,MIS:2048};let u=class i extends t.EnhancedEventEmitter{_closed=!1;_direction;_remoteSdp;_getSendExtendedRtpCapabilities;_pc;_mapMidTransceiver=new Map;_sendStream=new MediaStream;_hasDataChannelMediaSection=!1;_nextSendSctpStreamId=0;_transportReady=!1;static createFactory(){return{name:l,factory:e=>new i(e),getNativeRtpCapabilities:async({direction:t})=>{p.debug("getNativeRtpCapabilities() [direction:%o]",t);let r=new RTCPeerConnection({iceServers:[],iceTransportPolicy:"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require"});const s=document.createElement("canvas");s.getContext("2d");const a=s.captureStream().getVideoTracks()[0];try{r.addTransceiver("audio",{direction:t}),r.addTransceiver(a,{direction:t,sendEncodings:[{rid:"r0",maxBitrate:1e5},{rid:"r1",maxBitrate:5e5}]});const n=await r.createOffer();try{s.remove()}catch(e){}try{a.stop()}catch(e){}try{r.close()}catch(e){}r=void 0;const o=e.parse(n.sdp);return i.getLocalRtpCapabilities(o)}catch(e){try{s.remove()}catch(e){}try{a.stop()}catch(e){}try{r?.close()}catch(e){}throw r=void 0,e}},getNativeSctpCapabilities:async()=>(p.debug("getNativeSctpCapabilities()"),{numStreams:h})}}static getLocalRtpCapabilities(e){const t=o.extractRtpCapabilities({sdpObject:e});return s.validateAndNormalizeRtpCapabilities(t),t}constructor({direction:e,iceParameters:t,iceCandidates:i,dtlsParameters:r,sctpParameters:s,iceServers:a,iceTransportPolicy:o,additionalSettings:c,getSendExtendedRtpCapabilities:d}){super(),p.debug("constructor()"),this._direction=e,this._remoteSdp=new n.RemoteSdp({iceParameters:t,iceCandidates:i,dtlsParameters:r,sctpParameters:s}),this._getSendExtendedRtpCapabilities=d,this._pc=new RTCPeerConnection({iceServers:a??[],iceTransportPolicy:o??"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require",...c}),this._pc.addEventListener("icegatheringstatechange",this.onIceGatheringStateChange),this._pc.addEventListener("icecandidateerror",this.onIceCandidateError),this._pc.connectionState?this._pc.addEventListener("connectionstatechange",this.onConnectionStateChange):(p.warn("run() | pc.connectionState not supported, using pc.iceConnectionState"),this._pc.addEventListener("iceconnectionstatechange",this.onIceConnectionStateChange))}get name(){return l}close(){if(p.debug("close()"),!this._closed){this._closed=!0;try{this._pc.close()}catch(e){}this._pc.removeEventListener("icegatheringstatechange",this.onIceGatheringStateChange),this._pc.removeEventListener("icecandidateerror",this.onIceCandidateError),this._pc.removeEventListener("connectionstatechange",this.onConnectionStateChange),this._pc.removeEventListener("iceconnectionstatechange",this.onIceConnectionStateChange),this.emit("@close"),super.close()}}async updateIceServers(e){throw this.assertNotClosed(),new r.UnsupportedError("not supported")}async restartIce(e){if(this.assertNotClosed(),p.debug("restartIce()"),this._remoteSdp.updateIceParameters(e),this._transportReady)if("send"===this._direction){const e=await this._pc.createOffer({iceRestart:!0});p.debug("restartIce() | calling pc.setLocalDescription() [offer:%o]",e),await this._pc.setLocalDescription(e);const t={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("restartIce() | calling pc.setRemoteDescription() [answer:%o]",t),await this._pc.setRemoteDescription(t)}else{const e={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("restartIce() | calling pc.setRemoteDescription() [offer:%o]",e),await this._pc.setRemoteDescription(e);const t=await this._pc.createAnswer();p.debug("restartIce() | calling pc.setLocalDescription() [answer:%o]",t),await this._pc.setLocalDescription(t)}}async getTransportStats(){return this.assertNotClosed(),this._pc.getStats()}async send({track:t,streamId:r,encodings:n,codecOptions:d,codec:l,onRtpSender:h}){this.assertNotClosed(),this.assertSendDirection(),p.debug("send() [kind:%s, track.id:%s, streamId:%s]",t.kind,t.id,r),n&&n.length>1&&n.forEach((e,t)=>{e.rid=`r${t}`});const u=this._pc.addTransceiver(t,{direction:"sendonly",streams:[this._sendStream],sendEncodings:n});h&&h(u.sender);const m=await this._pc.createOffer();let f=e.parse(m.sdp);f.extmapAllowMixed&&this._remoteSdp.setSessionExtmapAllowMixed();const g=i.getLocalRtpCapabilities(f),v=this._getSendExtendedRtpCapabilities(g),b=s.getSendingRtpParameters(t.kind,v);b.codecs=s.reduceCodecs(b.codecs,l);const _=s.getSendingRemoteRtpParameters(t.kind,v);_.codecs=s.reduceCodecs(_.codecs,l),this._transportReady||await this.setupTransport({localDtlsRole:"client",localSdpObject:f});const y=(0,a.parse)((n??[{}])[0].scalabilityMode);p.debug("send() | calling pc.setLocalDescription() [offer:%o]",m),await this._pc.setLocalDescription(m);const S=u.mid;b.mid=S,f=e.parse(this._pc.localDescription.sdp);const w=f.media[f.media.length-1];if(b.rtcp.cname=o.getCname({offerMediaObject:w}),b.msid=`${r??this._sendStream.id} ${t.id}`,n)if(1===n.length){const e=c.getRtpEncodings({offerMediaObject:w,codecs:b.codecs});Object.assign(e[0],n[0]),b.encodings=e}else b.encodings=n;else b.encodings=c.getRtpEncodings({offerMediaObject:w,codecs:b.codecs});if(b.encodings.length>1&&("video/vp8"===b.codecs[0].mimeType.toLowerCase()||"video/h264"===b.codecs[0].mimeType.toLowerCase()))for(const e of b.encodings)e.scalabilityMode?e.scalabilityMode=`L1T${y.temporalLayers}`:e.scalabilityMode="L1T3";this._remoteSdp.send({offerMediaObject:w,offerRtpParameters:b,answerRtpParameters:_,codecOptions:d});const k={type:"answer",sdp:this._remoteSdp.getSdp()};return p.debug("send() | calling pc.setRemoteDescription() [answer:%o]",k),await this._pc.setRemoteDescription(k),this._mapMidTransceiver.set(S,u),{localId:S,rtpParameters:b,rtpSender:u.sender}}async stopSending(e){if(this.assertSendDirection(),p.debug("stopSending() [localId:%s]",e),this._closed)return;const 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);const i=await this._pc.createOffer();p.debug("stopSending() | calling pc.setLocalDescription() [offer:%o]",i),await this._pc.setLocalDescription(i);const r={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("stopSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r),this._mapMidTransceiver.delete(e)}async pauseSending(e){this.assertNotClosed(),this.assertSendDirection(),p.debug("pauseSending() [localId:%s]",e);const t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated RTCRtpTransceiver not found");t.direction="inactive",this._remoteSdp.pauseMediaSection(e);const i=await this._pc.createOffer();p.debug("pauseSending() | calling pc.setLocalDescription() [offer:%o]",i),await this._pc.setLocalDescription(i);const r={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("pauseSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r)}async resumeSending(e){this.assertNotClosed(),this.assertSendDirection(),p.debug("resumeSending() [localId:%s]",e);const t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated RTCRtpTransceiver not found");t.direction="sendonly",this._remoteSdp.resumeSendingMediaSection(e);const i=await this._pc.createOffer();p.debug("resumeSending() | calling pc.setLocalDescription() [offer:%o]",i),await this._pc.setLocalDescription(i);const r={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("resumeSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r)}async replaceTrack(e,t){this.assertNotClosed(),this.assertSendDirection(),t?p.debug("replaceTrack() [localId:%s, track.id:%s]",e,t.id):p.debug("replaceTrack() [localId:%s, no track]",e);const i=this._mapMidTransceiver.get(e);if(!i)throw new Error("associated RTCRtpTransceiver not found");await i.sender.replaceTrack(t)}async setMaxSpatialLayer(e,t){this.assertNotClosed(),this.assertSendDirection(),p.debug("setMaxSpatialLayer() [localId:%s, spatialLayer:%s]",e,t);const i=this._mapMidTransceiver.get(e);if(!i)throw new Error("associated transceiver not found");const r=i.sender.getParameters();r.encodings.forEach((e,i)=>{e.active=i<=t}),await i.sender.setParameters(r),this._remoteSdp.muxMediaSectionSimulcast(e,r.encodings);const s=await this._pc.createOffer();p.debug("setMaxSpatialLayer() | calling pc.setLocalDescription() [offer:%o]",s),await this._pc.setLocalDescription(s);const a={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("setMaxSpatialLayer() | calling pc.setRemoteDescription() [answer:%o]",a),await this._pc.setRemoteDescription(a)}async setRtpEncodingParameters(e,t){this.assertNotClosed(),this.assertSendDirection(),p.debug("setRtpEncodingParameters() [localId:%s, params:%o]",e,t);const i=this._mapMidTransceiver.get(e);if(!i)throw new Error("associated RTCRtpTransceiver not found");const r=i.sender.getParameters();r.encodings.forEach((e,i)=>{r.encodings[i]={...e,...t}}),await i.sender.setParameters(r),this._remoteSdp.muxMediaSectionSimulcast(e,r.encodings);const s=await this._pc.createOffer();p.debug("setRtpEncodingParameters() | calling pc.setLocalDescription() [offer:%o]",s),await this._pc.setLocalDescription(s);const a={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("setRtpEncodingParameters() | calling pc.setRemoteDescription() [answer:%o]",a),await this._pc.setRemoteDescription(a)}async getSenderStats(e){this.assertNotClosed(),this.assertSendDirection();const t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated RTCRtpTransceiver not found");return t.sender.getStats()}async sendDataChannel({ordered:t,maxPacketLifeTime:i,maxRetransmits:r,label:s,protocol:a}){this.assertNotClosed(),this.assertSendDirection();const n={negotiated:!0,id:this._nextSendSctpStreamId,ordered:t,maxPacketLifeTime:i,maxRetransmits:r,protocol:a};p.debug("sendDataChannel() [options:%o]",n);const o=this._pc.createDataChannel(s,n);if(this._nextSendSctpStreamId=++this._nextSendSctpStreamId%h.MIS,!this._hasDataChannelMediaSection){const t=await this._pc.createOffer(),i=e.parse(t.sdp),r=i.media.find(e=>"application"===e.type);this._transportReady||await this.setupTransport({localDtlsRole:"client",localSdpObject:i}),p.debug("sendDataChannel() | calling pc.setLocalDescription() [offer:%o]",t),await this._pc.setLocalDescription(t),this._remoteSdp.sendSctpAssociation({offerMediaObject:r});const s={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]",s),await this._pc.setRemoteDescription(s),this._hasDataChannelMediaSection=!0}return{dataChannel:o,sctpStreamParameters:{streamId:n.id,ordered:n.ordered,maxPacketLifeTime:n.maxPacketLifeTime,maxRetransmits:n.maxRetransmits}}}async receive(t){this.assertNotClosed(),this.assertRecvDirection();const i=[],r=new Map;for(const e of t){const{trackId:t,kind:i,rtpParameters:s,streamId:a}=e;p.debug("receive() [trackId:%s, kind:%s]",t,i);const n=s.mid??String(this._mapMidTransceiver.size);r.set(t,n);const{msidStreamId:o}=d.getMsidStreamIdAndTrackId(s.msid);this._remoteSdp.receive({mid:n,kind:i,offerRtpParameters:s,streamId:a??o??s.rtcp?.cname??"-",trackId:t})}const s={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("receive() | calling pc.setRemoteDescription() [offer:%o]",s),await this._pc.setRemoteDescription(s);for(const e of t){const{trackId:t,onRtpReceiver:i}=e;if(i){const e=r.get(t),s=this._pc.getTransceivers().find(t=>t.mid===e);if(!s)throw new Error("transceiver not found");i(s.receiver)}}let a=await this._pc.createAnswer();const n=e.parse(a.sdp);for(const i of t){const{trackId:t,rtpParameters:s}=i,c=r.get(t),d=n.media.find(e=>String(e.mid)===c);o.applyCodecParameters({offerRtpParameters:s,answerMediaObject:d}),a={type:"answer",sdp:e.write(n)}}this._transportReady||await this.setupTransport({localDtlsRole:"client",localSdpObject:n}),p.debug("receive() | calling pc.setLocalDescription() [answer:%o]",a),await this._pc.setLocalDescription(a);for(const e of t){const{trackId:t}=e,s=r.get(t),a=this._pc.getTransceivers().find(e=>e.mid===s);if(!a)throw new Error("new RTCRtpTransceiver not found");this._mapMidTransceiver.set(s,a),i.push({localId:s,track:a.receiver.track,rtpReceiver:a.receiver})}return i}async stopReceiving(e){if(this.assertRecvDirection(),this._closed)return;for(const t of e){p.debug("stopReceiving() [localId:%s]",t);const e=this._mapMidTransceiver.get(t);if(!e)throw new Error("associated RTCRtpTransceiver not found");this._remoteSdp.closeMediaSection(e.mid)}const t={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("stopReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const i=await this._pc.createAnswer();p.debug("stopReceiving() | calling pc.setLocalDescription() [answer:%o]",i),await this._pc.setLocalDescription(i);for(const t of e)this._mapMidTransceiver.delete(t)}async pauseReceiving(e){this.assertNotClosed(),this.assertRecvDirection();for(const t of e){p.debug("pauseReceiving() [localId:%s]",t);const e=this._mapMidTransceiver.get(t);if(!e)throw new Error("associated RTCRtpTransceiver not found");e.direction="inactive",this._remoteSdp.pauseMediaSection(t)}const t={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("pauseReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const i=await this._pc.createAnswer();p.debug("pauseReceiving() | calling pc.setLocalDescription() [answer:%o]",i),await this._pc.setLocalDescription(i)}async resumeReceiving(e){this.assertNotClosed(),this.assertRecvDirection();for(const t of e){p.debug("resumeReceiving() [localId:%s]",t);const e=this._mapMidTransceiver.get(t);if(!e)throw new Error("associated RTCRtpTransceiver not found");e.direction="recvonly",this._remoteSdp.resumeReceivingMediaSection(t)}const t={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("resumeReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const i=await this._pc.createAnswer();p.debug("resumeReceiving() | calling pc.setLocalDescription() [answer:%o]",i),await this._pc.setLocalDescription(i)}async getReceiverStats(e){this.assertRecvDirection();const t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated RTCRtpTransceiver not found");return t.receiver.getStats()}async receiveDataChannel({sctpStreamParameters:t,label:i,protocol:r}){this.assertNotClosed(),this.assertRecvDirection();const{streamId:s,ordered:a,maxPacketLifeTime:n,maxRetransmits:o}=t,c={negotiated:!0,id:s,ordered:a,maxPacketLifeTime:n,maxRetransmits:o,protocol:r};p.debug("receiveDataChannel() [options:%o]",c);const d=this._pc.createDataChannel(i,c);if(!this._hasDataChannelMediaSection){this._remoteSdp.receiveSctpAssociation();const t={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("receiveDataChannel() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const i=await this._pc.createAnswer();if(!this._transportReady){const t=e.parse(i.sdp);await this.setupTransport({localDtlsRole:"client",localSdpObject:t})}p.debug("receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]",i),await this._pc.setLocalDescription(i),this._hasDataChannelMediaSection=!0}return{dataChannel:d}}async setupTransport({localDtlsRole:t,localSdpObject:i}){i||(i=e.parse(this._pc.localDescription.sdp));const r=o.extractDtlsParameters({sdpObject:i});r.role=t,this._remoteSdp.updateDtlsRole("client"===t?"server":"client"),await new Promise((e,t)=>{this.safeEmit("@connect",{dtlsParameters:r},e,t)}),this._transportReady=!0}onIceGatheringStateChange=()=>{this.emit("@icegatheringstatechange",this._pc.iceGatheringState)};onIceCandidateError=e=>{this.emit("@icecandidateerror",e)};onConnectionStateChange=()=>{this.emit("@connectionstatechange",this._pc.connectionState)};onIceConnectionStateChange=()=>{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")}};assertNotClosed(){if(this._closed)throw new r.InvalidStateError("method called in a closed handler")}assertSendDirection(){if("send"!==this._direction)throw new Error('method can just be called for handlers with "send" direction')}assertRecvDirection(){if("recv"!==this._direction)throw new Error('method can just be called for handlers with "recv" direction')}};return ht.Firefox120=u,ht}(),d=function(){if(ut)return mt;ut=1,Object.defineProperty(mt,"__esModule",{value:!0}),mt.Safari12=void 0;const e=He(),t=J(),i=G(),r=pe(),s=Z(),a=Ge(),n=Xe(),o=tt(),c=st(),d=ct(),p=new i.Logger("Safari12"),l="Safari12",h={OS:1024,MIS:1024};let u=class i extends t.EnhancedEventEmitter{_closed=!1;_direction;_remoteSdp;_getSendExtendedRtpCapabilities;_forcedLocalDtlsRole;_pc;_mapMidTransceiver=new Map;_sendStream=new MediaStream;_hasDataChannelMediaSection=!1;_nextSendSctpStreamId=0;_transportReady=!1;static createFactory(){return{name:l,factory:e=>new i(e),getNativeRtpCapabilities:async({direction:t})=>{p.debug("getNativeRtpCapabilities() [direction:%o]",t);let r=new RTCPeerConnection({iceServers:[],iceTransportPolicy:"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require"});try{r.addTransceiver("audio",{direction:t}),r.addTransceiver("video",{direction:t});const s=await r.createOffer();try{r.close()}catch(e){}r=void 0;const a=e.parse(s.sdp);return i.getLocalRtpCapabilities(a)}catch(e){try{r?.close()}catch(e){}throw r=void 0,e}},getNativeSctpCapabilities:async()=>(p.debug("getNativeSctpCapabilities()"),{numStreams:h})}}static getLocalRtpCapabilities(e,t=[]){const i=o.extractRtpCapabilities({sdpObject:e});r.validateAndNormalizeRtpCapabilities(i),d.addNackSupportForOpus(i);for(const e of t)d.addHeaderExtensionSupport(i,e);return i}constructor({direction:e,iceParameters:t,iceCandidates:i,dtlsParameters:r,sctpParameters:s,iceServers:a,iceTransportPolicy:o,additionalSettings:c,getSendExtendedRtpCapabilities:d}){super(),p.debug("constructor()"),this._direction=e,this._remoteSdp=new n.RemoteSdp({iceParameters:t,iceCandidates:i,dtlsParameters:r,sctpParameters:s}),this._getSendExtendedRtpCapabilities=d,r.role&&"auto"!==r.role&&(this._forcedLocalDtlsRole="server"===r.role?"client":"server"),this._pc=new RTCPeerConnection({iceServers:a??[],iceTransportPolicy:o??"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require",...c}),this._pc.addEventListener("icegatheringstatechange",()=>{this.emit("@icegatheringstatechange",this._pc.iceGatheringState)}),this._pc.addEventListener("icecandidateerror",e=>{this.emit("@icecandidateerror",e)}),this._pc.addEventListener("icegatheringstatechange",this.onIceGatheringStateChange),this._pc.addEventListener("icecandidateerror",this.onIceCandidateError),this._pc.connectionState?this._pc.addEventListener("connectionstatechange",this.onConnectionStateChange):(p.warn("run() | pc.connectionState not supported, using pc.iceConnectionState"),this._pc.addEventListener("iceconnectionstatechange",this.onIceConnectionStateChange))}get name(){return l}close(){if(p.debug("close()"),!this._closed){this._closed=!0;try{this._pc.close()}catch(e){}this._pc.removeEventListener("icegatheringstatechange",this.onIceGatheringStateChange),this._pc.removeEventListener("icecandidateerror",this.onIceCandidateError),this._pc.removeEventListener("connectionstatechange",this.onConnectionStateChange),this._pc.removeEventListener("iceconnectionstatechange",this.onIceConnectionStateChange),this.emit("@close"),super.close()}}async updateIceServers(e){this.assertNotClosed(),p.debug("updateIceServers()");const t=this._pc.getConfiguration();t.iceServers=e,this._pc.setConfiguration(t)}async restartIce(e){if(this.assertNotClosed(),p.debug("restartIce()"),this._remoteSdp.updateIceParameters(e),this._transportReady)if("send"===this._direction){const e=await this._pc.createOffer({iceRestart:!0});p.debug("restartIce() | calling pc.setLocalDescription() [offer:%o]",e),await this._pc.setLocalDescription(e);const t={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("restartIce() | calling pc.setRemoteDescription() [answer:%o]",t),await this._pc.setRemoteDescription(t)}else{const e={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("restartIce() | calling pc.setRemoteDescription() [offer:%o]",e),await this._pc.setRemoteDescription(e);const t=await this._pc.createAnswer();p.debug("restartIce() | calling pc.setLocalDescription() [answer:%o]",t),await this._pc.setLocalDescription(t)}}async getTransportStats(){return this.assertNotClosed(),this._pc.getStats()}async send({track:t,streamId:s,encodings:n,codecOptions:d,headerExtensionOptions:l,codec:h,onRtpSender:u}){this.assertNotClosed(),this.assertSendDirection(),p.debug("send() [kind:%s, track.id:%s, streamId:%s]",t.kind,t.id,s);const m=this._remoteSdp.getNextMediaSectionIdx(),f=this._pc.addTransceiver(t,{direction:"sendonly",streams:[this._sendStream]});u&&u(f.sender);let g=await this._pc.createOffer(),v=e.parse(g.sdp);v.extmapAllowMixed&&this._remoteSdp.setSessionExtmapAllowMixed();const b=[];b.push({uri:"http://www.webrtc.org/experiments/rtp-hdrext/abs-capture-time",kind:t.kind,direction:"sendonly"});const _=i.getLocalRtpCapabilities(v,b),y=this._getSendExtendedRtpCapabilities(_),S=r.getSendingRtpParameters(t.kind,y);S.codecs=r.reduceCodecs(S.codecs,h);const w=r.getSendingRemoteRtpParameters(t.kind,y);let k;w.codecs=r.reduceCodecs(w.codecs,h),this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:v});const T=(0,a.parse)((n??[{}])[0].scalabilityMode);n&&n.length>1&&(p.debug("send() | enabling legacy simulcast"),v=e.parse(g.sdp),k=v.media[m.idx],c.addLegacySimulcast({offerMediaObject:k,numStreams:n.length}),g={type:"offer",sdp:e.write(v)}),l?.absCaptureTime&&(k=v.media[m.idx],o.addHeaderExtension({offerMediaObject:k,headerExtensionUri:"http://www.webrtc.org/experiments/rtp-hdrext/abs-capture-time",headerExtensionId:w.headerExtensions.find(e=>"http://www.webrtc.org/experiments/rtp-hdrext/abs-capture-time"===e.uri).id}),g={type:"offer",sdp:e.write(v)}),p.debug("send() | calling pc.setLocalDescription() [offer:%o]",g),await this._pc.setLocalDescription(g);const C=f.mid;if(S.mid=C,v=e.parse(this._pc.localDescription.sdp),k=v.media[m.idx],S.rtcp.cname=o.getCname({offerMediaObject:k}),S.msid=`${s??this._sendStream.id} ${t.id}`,S.encodings=c.getRtpEncodings({offerMediaObject:k,codecs:S.codecs}),n)for(let e=0;e<S.encodings.length;++e)n[e]&&Object.assign(S.encodings[e],n[e]);if(S.encodings.length>1&&("video/vp8"===S.codecs[0].mimeType.toLowerCase()||"video/h264"===S.codecs[0].mimeType.toLowerCase()))for(const e of S.encodings)e.scalabilityMode?e.scalabilityMode=`L1T${T.temporalLayers}`:e.scalabilityMode="L1T3";this._remoteSdp.send({offerMediaObject:k,reuseMid:m.reuseMid,offerRtpParameters:S,answerRtpParameters:w,codecOptions:d});const P={type:"answer",sdp:this._remoteSdp.getSdp()};return p.debug("send() | calling pc.setRemoteDescription() [answer:%o]",P),await this._pc.setRemoteDescription(P),this._mapMidTransceiver.set(C,f),{localId:C,rtpParameters:S,rtpSender:f.sender}}async stopSending(e){if(this.assertSendDirection(),this._closed)return;p.debug("stopSending() [localId:%s]",e);const t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated RTCRtpTransceiver not found");if(t.sender.replaceTrack(null),this._pc.removeTrack(t.sender),this._remoteSdp.closeMediaSection(t.mid))try{t.stop()}catch(e){}const i=await this._pc.createOffer();p.debug("stopSending() | calling pc.setLocalDescription() [offer:%o]",i),await this._pc.setLocalDescription(i);const r={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("stopSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r),this._mapMidTransceiver.delete(e)}async pauseSending(e){this.assertNotClosed(),this.assertSendDirection(),p.debug("pauseSending() [localId:%s]",e);const t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated RTCRtpTransceiver not found");t.direction="inactive",this._remoteSdp.pauseMediaSection(e);const i=await this._pc.createOffer();p.debug("pauseSending() | calling pc.setLocalDescription() [offer:%o]",i),await this._pc.setLocalDescription(i);const r={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("pauseSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r)}async resumeSending(e){this.assertNotClosed(),this.assertSendDirection(),p.debug("resumeSending() [localId:%s]",e);const t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated RTCRtpTransceiver not found");t.direction="sendonly",this._remoteSdp.resumeSendingMediaSection(e);const i=await this._pc.createOffer();p.debug("resumeSending() | calling pc.setLocalDescription() [offer:%o]",i),await this._pc.setLocalDescription(i);const r={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("resumeSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r)}async replaceTrack(e,t){this.assertNotClosed(),this.assertSendDirection(),t?p.debug("replaceTrack() [localId:%s, track.id:%s]",e,t.id):p.debug("replaceTrack() [localId:%s, no track]",e);const i=this._mapMidTransceiver.get(e);if(!i)throw new Error("associated RTCRtpTransceiver not found");await i.sender.replaceTrack(t)}async setMaxSpatialLayer(e,t){this.assertNotClosed(),this.assertSendDirection(),p.debug("setMaxSpatialLayer() [localId:%s, spatialLayer:%s]",e,t);const i=this._mapMidTransceiver.get(e);if(!i)throw new Error("associated RTCRtpTransceiver not found");const r=i.sender.getParameters();r.encodings.forEach((e,i)=>{e.active=i<=t}),await i.sender.setParameters(r),this._remoteSdp.muxMediaSectionSimulcast(e,r.encodings);const s=await this._pc.createOffer();p.debug("setMaxSpatialLayer() | calling pc.setLocalDescription() [offer:%o]",s),await this._pc.setLocalDescription(s);const a={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("setMaxSpatialLayer() | calling pc.setRemoteDescription() [answer:%o]",a),await this._pc.setRemoteDescription(a)}async setRtpEncodingParameters(e,t){this.assertNotClosed(),this.assertSendDirection(),p.debug("setRtpEncodingParameters() [localId:%s, params:%o]",e,t);const i=this._mapMidTransceiver.get(e);if(!i)throw new Error("associated RTCRtpTransceiver not found");const r=i.sender.getParameters();r.encodings.forEach((e,i)=>{r.encodings[i]={...e,...t}}),await i.sender.setParameters(r),this._remoteSdp.muxMediaSectionSimulcast(e,r.encodings);const s=await this._pc.createOffer();p.debug("setRtpEncodingParameters() | calling pc.setLocalDescription() [offer:%o]",s),await this._pc.setLocalDescription(s);const a={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("setRtpEncodingParameters() | calling pc.setRemoteDescription() [answer:%o]",a),await this._pc.setRemoteDescription(a)}async getSenderStats(e){this.assertNotClosed(),this.assertSendDirection();const t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated RTCRtpTransceiver not found");return t.sender.getStats()}async sendDataChannel({ordered:t,maxPacketLifeTime:i,maxRetransmits:r,label:s,protocol:a}){this.assertNotClosed(),this.assertSendDirection();const n={negotiated:!0,id:this._nextSendSctpStreamId,ordered:t,maxPacketLifeTime:i,maxRetransmits:r,protocol:a};p.debug("sendDataChannel() [options:%o]",n);const o=this._pc.createDataChannel(s,n);if(this._nextSendSctpStreamId=++this._nextSendSctpStreamId%h.MIS,!this._hasDataChannelMediaSection){const t=await this._pc.createOffer(),i=e.parse(t.sdp),r=i.media.find(e=>"application"===e.type);this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:i}),p.debug("sendDataChannel() | calling pc.setLocalDescription() [offer:%o]",t),await this._pc.setLocalDescription(t),this._remoteSdp.sendSctpAssociation({offerMediaObject:r});const s={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]",s),await this._pc.setRemoteDescription(s),this._hasDataChannelMediaSection=!0}return{dataChannel:o,sctpStreamParameters:{streamId:n.id,ordered:n.ordered,maxPacketLifeTime:n.maxPacketLifeTime,maxRetransmits:n.maxRetransmits}}}async receive(t){this.assertNotClosed(),this.assertRecvDirection();const i=[],r=new Map;for(const e of t){const{trackId:t,kind:i,rtpParameters:s,streamId:a}=e;p.debug("receive() [trackId:%s, kind:%s]",t,i);const n=s.mid??String(this._mapMidTransceiver.size);r.set(t,n);const{msidStreamId:o}=d.getMsidStreamIdAndTrackId(s.msid);this._remoteSdp.receive({mid:n,kind:i,offerRtpParameters:s,streamId:a??o??s.rtcp?.cname??"-",trackId:t})}const s={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("receive() | calling pc.setRemoteDescription() [offer:%o]",s),await this._pc.setRemoteDescription(s);for(const e of t){const{trackId:t,onRtpReceiver:i}=e;if(i){const e=r.get(t),s=this._pc.getTransceivers().find(t=>t.mid===e);if(!s)throw new Error("transceiver not found");i(s.receiver)}}let a=await this._pc.createAnswer();const n=e.parse(a.sdp);for(const e of t){const{trackId:t,rtpParameters:i}=e,s=r.get(t),a=n.media.find(e=>String(e.mid)===s);o.applyCodecParameters({offerRtpParameters:i,answerMediaObject:a})}a={type:"answer",sdp:e.write(n)},this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:n}),p.debug("receive() | calling pc.setLocalDescription() [answer:%o]",a),await this._pc.setLocalDescription(a);for(const e of t){const{trackId:t}=e,s=r.get(t),a=this._pc.getTransceivers().find(e=>e.mid===s);if(!a)throw new Error("new RTCRtpTransceiver not found");this._mapMidTransceiver.set(s,a),i.push({localId:s,track:a.receiver.track,rtpReceiver:a.receiver})}return i}async stopReceiving(e){if(this.assertRecvDirection(),this._closed)return;for(const t of e){p.debug("stopReceiving() [localId:%s]",t);const e=this._mapMidTransceiver.get(t);if(!e)throw new Error("associated RTCRtpTransceiver not found");this._remoteSdp.closeMediaSection(e.mid)}const t={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("stopReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const i=await this._pc.createAnswer();p.debug("stopReceiving() | calling pc.setLocalDescription() [answer:%o]",i),await this._pc.setLocalDescription(i);for(const t of e)this._mapMidTransceiver.delete(t)}async pauseReceiving(e){this.assertNotClosed(),this.assertRecvDirection();for(const t of e){p.debug("pauseReceiving() [localId:%s]",t);const e=this._mapMidTransceiver.get(t);if(!e)throw new Error("associated RTCRtpTransceiver not found");e.direction="inactive",this._remoteSdp.pauseMediaSection(t)}const t={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("pauseReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const i=await this._pc.createAnswer();p.debug("pauseReceiving() | calling pc.setLocalDescription() [answer:%o]",i),await this._pc.setLocalDescription(i)}async resumeReceiving(e){this.assertNotClosed(),this.assertRecvDirection();for(const t of e){p.debug("resumeReceiving() [localId:%s]",t);const e=this._mapMidTransceiver.get(t);if(!e)throw new Error("associated RTCRtpTransceiver not found");e.direction="recvonly",this._remoteSdp.resumeReceivingMediaSection(t)}const t={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("resumeReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const i=await this._pc.createAnswer();p.debug("resumeReceiving() | calling pc.setLocalDescription() [answer:%o]",i),await this._pc.setLocalDescription(i)}async getReceiverStats(e){this.assertNotClosed(),this.assertRecvDirection();const t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated RTCRtpTransceiver not found");return t.receiver.getStats()}async receiveDataChannel({sctpStreamParameters:t,label:i,protocol:r}){this.assertNotClosed(),this.assertRecvDirection();const{streamId:s,ordered:a,maxPacketLifeTime:n,maxRetransmits:o}=t,c={negotiated:!0,id:s,ordered:a,maxPacketLifeTime:n,maxRetransmits:o,protocol:r};p.debug("receiveDataChannel() [options:%o]",c);const d=this._pc.createDataChannel(i,c);if(!this._hasDataChannelMediaSection){this._remoteSdp.receiveSctpAssociation();const t={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("receiveDataChannel() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const i=await this._pc.createAnswer();if(!this._transportReady){const t=e.parse(i.sdp);await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:t})}p.debug("receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]",i),await this._pc.setLocalDescription(i),this._hasDataChannelMediaSection=!0}return{dataChannel:d}}async setupTransport({localDtlsRole:t,localSdpObject:i}){i||(i=e.parse(this._pc.localDescription.sdp));const r=o.extractDtlsParameters({sdpObject:i});r.role=t,this._remoteSdp.updateDtlsRole("client"===t?"server":"client"),await new Promise((e,t)=>{this.safeEmit("@connect",{dtlsParameters:r},e,t)}),this._transportReady=!0}onIceGatheringStateChange=()=>{this.emit("@icegatheringstatechange",this._pc.iceGatheringState)};onIceCandidateError=e=>{this.emit("@icecandidateerror",e)};onConnectionStateChange=()=>{this.emit("@connectionstatechange",this._pc.connectionState)};onIceConnectionStateChange=()=>{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")}};assertNotClosed(){if(this._closed)throw new s.InvalidStateError("method called in a closed handler")}assertSendDirection(){if("send"!==this._direction)throw new Error('method can just be called for handlers with "send" direction')}assertRecvDirection(){if("recv"!==this._direction)throw new Error('method can just be called for handlers with "recv" direction')}};return mt.Safari12=u,mt}(),p=function(){if(ft)return vt;ft=1,Object.defineProperty(vt,"__esModule",{value:!0}),vt.ReactNative106=void 0;const e=He(),t=J(),i=G(),r=pe(),s=Z(),a=Ge(),n=Xe(),o=tt(),c=st(),d=ct(),p=new i.Logger("ReactNative106"),l="ReactNative106",h={OS:1024,MIS:1024};let u=class i extends t.EnhancedEventEmitter{_closed=!1;_direction;_remoteSdp;_getSendExtendedRtpCapabilities;_forcedLocalDtlsRole;_pc;_mapMidTransceiver=new Map;_sendStream=new MediaStream;_hasDataChannelMediaSection=!1;_nextSendSctpStreamId=0;_transportReady=!1;static createFactory(){return{name:l,factory:e=>new i(e),getNativeRtpCapabilities:async({direction:t})=>{p.debug("getNativeRtpCapabilities() [direction:%o]",t);let r=new RTCPeerConnection({iceServers:[],iceTransportPolicy:"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require"});try{r.addTransceiver("audio",{direction:t}),r.addTransceiver("video",{direction:t});const s=await r.createOffer();try{r.close()}catch(e){}r=void 0;const a=e.parse(s.sdp);return i.getLocalRtpCapabilities(a)}catch(e){try{r?.close()}catch(e){}throw r=void 0,e}},getNativeSctpCapabilities:async()=>(p.debug("getNativeSctpCapabilities()"),{numStreams:h})}}static getLocalRtpCapabilities(e,t=[]){const i=o.extractRtpCapabilities({sdpObject:e});r.validateAndNormalizeRtpCapabilities(i),d.addNackSupportForOpus(i);for(const e of t)d.addHeaderExtensionSupport(i,e);return i}constructor({direction:e,iceParameters:t,iceCandidates:i,dtlsParameters:r,sctpParameters:s,iceServers:a,iceTransportPolicy:o,additionalSettings:c,getSendExtendedRtpCapabilities:d}){super(),p.debug("constructor()"),this._direction=e,this._remoteSdp=new n.RemoteSdp({iceParameters:t,iceCandidates:i,dtlsParameters:r,sctpParameters:s}),this._getSendExtendedRtpCapabilities=d,r.role&&"auto"!==r.role&&(this._forcedLocalDtlsRole="server"===r.role?"client":"server"),this._pc=new RTCPeerConnection({iceServers:a??[],iceTransportPolicy:o??"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require",...c}),this._pc.addEventListener("icegatheringstatechange",this.onIceGatheringStateChange),this._pc.addEventListener("icecandidateerror",this.onIceCandidateError),this._pc.connectionState?this._pc.addEventListener("connectionstatechange",this.onConnectionStateChange):(p.warn("run() | pc.connectionState not supported, using pc.iceConnectionState"),this._pc.addEventListener("iceconnectionstatechange",this.onIceConnectionStateChange))}get name(){return l}close(){if(p.debug("close()"),!this._closed){this._closed=!0,this._sendStream.release(!1);try{this._pc.close()}catch(e){}this._pc.removeEventListener("icegatheringstatechange",this.onIceGatheringStateChange),this._pc.removeEventListener("icecandidateerror",this.onIceCandidateError),this._pc.removeEventListener("connectionstatechange",this.onConnectionStateChange),this._pc.removeEventListener("iceconnectionstatechange",this.onIceConnectionStateChange),this.emit("@close"),super.close()}}async updateIceServers(e){this.assertNotClosed(),p.debug("updateIceServers()");const t=this._pc.getConfiguration();t.iceServers=e,this._pc.setConfiguration(t)}async restartIce(e){if(this.assertNotClosed(),p.debug("restartIce()"),this._remoteSdp.updateIceParameters(e),this._transportReady)if("send"===this._direction){const e=await this._pc.createOffer({iceRestart:!0});p.debug("restartIce() | calling pc.setLocalDescription() [offer:%o]",e),await this._pc.setLocalDescription(e);const t={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("restartIce() | calling pc.setRemoteDescription() [answer:%o]",t),await this._pc.setRemoteDescription(t)}else{const e={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("restartIce() | calling pc.setRemoteDescription() [offer:%o]",e),await this._pc.setRemoteDescription(e);const t=await this._pc.createAnswer();p.debug("restartIce() | calling pc.setLocalDescription() [answer:%o]",t),await this._pc.setLocalDescription(t)}}async getTransportStats(){return this.assertNotClosed(),this._pc.getStats()}async send({track:t,streamId:s,encodings:n,codecOptions:d,headerExtensionOptions:l,codec:h,onRtpSender:u}){this.assertNotClosed(),this.assertSendDirection(),p.debug("send() [kind:%s, track.id:%s, streamId:%s]",t.kind,t.id,s),n&&n.length>1&&n.forEach((e,t)=>{e.rid=`r${t}`});const m=this._remoteSdp.getNextMediaSectionIdx(),f=this._pc.addTransceiver(t,{direction:"sendonly",streams:[this._sendStream],sendEncodings:n});u&&u(f.sender);let g=await this._pc.createOffer(),v=e.parse(g.sdp);v.extmapAllowMixed&&this._remoteSdp.setSessionExtmapAllowMixed();const b=[];b.push({uri:"http://www.webrtc.org/experiments/rtp-hdrext/abs-capture-time",kind:t.kind,direction:"sendonly"});const _=i.getLocalRtpCapabilities(v,b),y=this._getSendExtendedRtpCapabilities(_),S=r.getSendingRtpParameters(t.kind,y);S.codecs=r.reduceCodecs(S.codecs,h);const w=r.getSendingRemoteRtpParameters(t.kind,y);w.codecs=r.reduceCodecs(w.codecs,h),this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:v});let k=!1;const T=(0,a.parse)((n??[{}])[0].scalabilityMode);let C;1===n?.length&&T.spatialLayers>1&&"video/vp9"===S.codecs[0].mimeType.toLowerCase()&&(p.debug("send() | enabling legacy simulcast for VP9 SVC"),k=!0,v=e.parse(g.sdp),C=v.media[m.idx],c.addLegacySimulcast({offerMediaObject:C,numStreams:T.spatialLayers}),g={type:"offer",sdp:e.write(v)}),l?.absCaptureTime&&(C=v.media[m.idx],o.addHeaderExtension({offerMediaObject:C,headerExtensionUri:"http://www.webrtc.org/experiments/rtp-hdrext/abs-capture-time",headerExtensionId:w.headerExtensions.find(e=>"http://www.webrtc.org/experiments/rtp-hdrext/abs-capture-time"===e.uri).id}),g={type:"offer",sdp:e.write(v)}),p.debug("send() | calling pc.setLocalDescription() [offer:%o]",g),await this._pc.setLocalDescription(g);let P=f.mid??void 0;if(P||p.warn("send() | missing transceiver.mid (bug in react-native-webrtc, using a workaround"),S.mid=P,v=e.parse(this._pc.localDescription.sdp),C=v.media[m.idx],S.rtcp.cname=o.getCname({offerMediaObject:C}),S.msid=`${s??this._sendStream.id} ${t.id}`,n)if(1===n.length){let e=c.getRtpEncodings({offerMediaObject:C,codecs:S.codecs});Object.assign(e[0],n[0]),k&&(e=[e[0]]),S.encodings=e}else S.encodings=n;else S.encodings=c.getRtpEncodings({offerMediaObject:C,codecs:S.codecs});if(S.encodings.length>1&&("video/vp8"===S.codecs[0].mimeType.toLowerCase()||"video/h264"===S.codecs[0].mimeType.toLowerCase()))for(const e of S.encodings)e.scalabilityMode?e.scalabilityMode=`L1T${T.temporalLayers}`:e.scalabilityMode="L1T3";this._remoteSdp.send({offerMediaObject:C,reuseMid:m.reuseMid,offerRtpParameters:S,answerRtpParameters:w,codecOptions:d});const R={type:"answer",sdp:this._remoteSdp.getSdp()};return p.debug("send() | calling pc.setRemoteDescription() [answer:%o]",R),await this._pc.setRemoteDescription(R),P||(P=f.mid,S.mid=P),this._mapMidTransceiver.set(P,f),{localId:P,rtpParameters:S,rtpSender:f.sender}}async stopSending(e){if(this.assertSendDirection(),this._closed)return;p.debug("stopSending() [localId:%s]",e);const t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated RTCRtpTransceiver not found");if(t.sender.replaceTrack(null),this._pc.removeTrack(t.sender),this._remoteSdp.closeMediaSection(t.mid))try{t.stop()}catch(e){}const i=await this._pc.createOffer();p.debug("stopSending() | calling pc.setLocalDescription() [offer:%o]",i),await this._pc.setLocalDescription(i);const r={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("stopSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r),this._mapMidTransceiver.delete(e)}async pauseSending(e){this.assertNotClosed(),this.assertSendDirection(),p.debug("pauseSending() [localId:%s]",e);const t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated RTCRtpTransceiver not found");t.direction="inactive",this._remoteSdp.pauseMediaSection(e);const i=await this._pc.createOffer();p.debug("pauseSending() | calling pc.setLocalDescription() [offer:%o]",i),await this._pc.setLocalDescription(i);const r={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("pauseSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r)}async resumeSending(e){this.assertNotClosed(),this.assertSendDirection(),p.debug("resumeSending() [localId:%s]",e);const t=this._mapMidTransceiver.get(e);if(this._remoteSdp.resumeSendingMediaSection(e),!t)throw new Error("associated RTCRtpTransceiver not found");t.direction="sendonly";const i=await this._pc.createOffer();p.debug("resumeSending() | calling pc.setLocalDescription() [offer:%o]",i),await this._pc.setLocalDescription(i);const r={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("resumeSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r)}async replaceTrack(e,t){this.assertNotClosed(),this.assertSendDirection(),t?p.debug("replaceTrack() [localId:%s, track.id:%s]",e,t.id):p.debug("replaceTrack() [localId:%s, no track]",e);const i=this._mapMidTransceiver.get(e);if(!i)throw new Error("associated RTCRtpTransceiver not found");await i.sender.replaceTrack(t)}async setMaxSpatialLayer(e,t){this.assertNotClosed(),this.assertSendDirection(),p.debug("setMaxSpatialLayer() [localId:%s, spatialLayer:%s]",e,t);const i=this._mapMidTransceiver.get(e);if(!i)throw new Error("associated RTCRtpTransceiver not found");const r=i.sender.getParameters();r.encodings.forEach((e,i)=>{e.active=i<=t}),await i.sender.setParameters(r),this._remoteSdp.muxMediaSectionSimulcast(e,r.encodings);const s=await this._pc.createOffer();p.debug("setMaxSpatialLayer() | calling pc.setLocalDescription() [offer:%o]",s),await this._pc.setLocalDescription(s);const a={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("setMaxSpatialLayer() | calling pc.setRemoteDescription() [answer:%o]",a),await this._pc.setRemoteDescription(a)}async setRtpEncodingParameters(e,t){this.assertNotClosed(),this.assertSendDirection(),p.debug("setRtpEncodingParameters() [localId:%s, params:%o]",e,t);const i=this._mapMidTransceiver.get(e);if(!i)throw new Error("associated RTCRtpTransceiver not found");const r=i.sender.getParameters();r.encodings.forEach((e,i)=>{r.encodings[i]={...e,...t}}),await i.sender.setParameters(r),this._remoteSdp.muxMediaSectionSimulcast(e,r.encodings);const s=await this._pc.createOffer();p.debug("setRtpEncodingParameters() | calling pc.setLocalDescription() [offer:%o]",s),await this._pc.setLocalDescription(s);const a={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("setRtpEncodingParameters() | calling pc.setRemoteDescription() [answer:%o]",a),await this._pc.setRemoteDescription(a)}async getSenderStats(e){this.assertNotClosed(),this.assertSendDirection();const t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated RTCRtpTransceiver not found");return t.sender.getStats()}async sendDataChannel({ordered:t,maxPacketLifeTime:i,maxRetransmits:r,label:s,protocol:a}){this.assertNotClosed(),this.assertSendDirection();const n={negotiated:!0,id:this._nextSendSctpStreamId,ordered:t,maxPacketLifeTime:i,maxRetransmits:r,protocol:a};p.debug("sendDataChannel() [options:%o]",n);const o=this._pc.createDataChannel(s,n);if(this._nextSendSctpStreamId=++this._nextSendSctpStreamId%h.MIS,!this._hasDataChannelMediaSection){const t=await this._pc.createOffer(),i=e.parse(t.sdp),r=i.media.find(e=>"application"===e.type);this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:i}),p.debug("sendDataChannel() | calling pc.setLocalDescription() [offer:%o]",t),await this._pc.setLocalDescription(t),this._remoteSdp.sendSctpAssociation({offerMediaObject:r});const s={type:"answer",sdp:this._remoteSdp.getSdp()};p.debug("sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]",s),await this._pc.setRemoteDescription(s),this._hasDataChannelMediaSection=!0}return{dataChannel:o,sctpStreamParameters:{streamId:n.id,ordered:n.ordered,maxPacketLifeTime:n.maxPacketLifeTime,maxRetransmits:n.maxRetransmits}}}async receive(t){this.assertNotClosed(),this.assertRecvDirection();const i=[],r=new Map;for(const e of t){const{trackId:t,kind:i,rtpParameters:s,streamId:a}=e;p.debug("receive() [trackId:%s, kind:%s]",t,i);const n=s.mid??String(this._mapMidTransceiver.size);r.set(t,n);const{msidStreamId:o}=d.getMsidStreamIdAndTrackId(s.msid);this._remoteSdp.receive({mid:n,kind:i,offerRtpParameters:s,streamId:a??o??s.rtcp?.cname??"-",trackId:t})}const s={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("receive() | calling pc.setRemoteDescription() [offer:%o]",s),await this._pc.setRemoteDescription(s);for(const e of t){const{trackId:t,onRtpReceiver:i}=e;if(i){const e=r.get(t),s=this._pc.getTransceivers().find(t=>t.mid===e);if(!s)throw new Error("transceiver not found");i(s.receiver)}}let a=await this._pc.createAnswer();const n=e.parse(a.sdp);for(const e of t){const{trackId:t,rtpParameters:i}=e,s=r.get(t),a=n.media.find(e=>String(e.mid)===s);o.applyCodecParameters({offerRtpParameters:i,answerMediaObject:a})}a={type:"answer",sdp:e.write(n)},this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:n}),p.debug("receive() | calling pc.setLocalDescription() [answer:%o]",a),await this._pc.setLocalDescription(a);for(const e of t){const{trackId:t}=e,s=r.get(t),a=this._pc.getTransceivers().find(e=>e.mid===s);if(!a)throw new Error("new RTCRtpTransceiver not found");this._mapMidTransceiver.set(s,a),i.push({localId:s,track:a.receiver.track,rtpReceiver:a.receiver})}return i}async stopReceiving(e){if(this.assertRecvDirection(),this._closed)return;for(const t of e){p.debug("stopReceiving() [localId:%s]",t);const e=this._mapMidTransceiver.get(t);if(!e)throw new Error("associated RTCRtpTransceiver not found");this._remoteSdp.closeMediaSection(e.mid)}const t={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("stopReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const i=await this._pc.createAnswer();p.debug("stopReceiving() | calling pc.setLocalDescription() [answer:%o]",i),await this._pc.setLocalDescription(i);for(const t of e)this._mapMidTransceiver.delete(t)}async pauseReceiving(e){this.assertNotClosed(),this.assertRecvDirection();for(const t of e){p.debug("pauseReceiving() [localId:%s]",t);const e=this._mapMidTransceiver.get(t);if(!e)throw new Error("associated RTCRtpTransceiver not found");e.direction="inactive",this._remoteSdp.pauseMediaSection(t)}const t={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("pauseReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const i=await this._pc.createAnswer();p.debug("pauseReceiving() | calling pc.setLocalDescription() [answer:%o]",i),await this._pc.setLocalDescription(i)}async resumeReceiving(e){this.assertNotClosed(),this.assertRecvDirection();for(const t of e){p.debug("resumeReceiving() [localId:%s]",t);const e=this._mapMidTransceiver.get(t);if(!e)throw new Error("associated RTCRtpTransceiver not found");e.direction="recvonly",this._remoteSdp.resumeReceivingMediaSection(t)}const t={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("resumeReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const i=await this._pc.createAnswer();p.debug("resumeReceiving() | calling pc.setLocalDescription() [answer:%o]",i),await this._pc.setLocalDescription(i)}async getReceiverStats(e){this.assertNotClosed(),this.assertRecvDirection();const t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated RTCRtpTransceiver not found");return t.receiver.getStats()}async receiveDataChannel({sctpStreamParameters:t,label:i,protocol:r}){this.assertNotClosed(),this.assertRecvDirection();const{streamId:s,ordered:a,maxPacketLifeTime:n,maxRetransmits:o}=t,c={negotiated:!0,id:s,ordered:a,maxPacketLifeTime:n,maxRetransmits:o,protocol:r};p.debug("receiveDataChannel() [options:%o]",c);const d=this._pc.createDataChannel(i,c);if(!this._hasDataChannelMediaSection){this._remoteSdp.receiveSctpAssociation();const t={type:"offer",sdp:this._remoteSdp.getSdp()};p.debug("receiveDataChannel() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const i=await this._pc.createAnswer();if(!this._transportReady){const t=e.parse(i.sdp);await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:t})}p.debug("receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]",i),await this._pc.setLocalDescription(i),this._hasDataChannelMediaSection=!0}return{dataChannel:d}}async setupTransport({localDtlsRole:t,localSdpObject:i}){i||(i=e.parse(this._pc.localDescription.sdp));const r=o.extractDtlsParameters({sdpObject:i});r.role=t,this._remoteSdp.updateDtlsRole("client"===t?"server":"client"),await new Promise((e,t)=>{this.safeEmit("@connect",{dtlsParameters:r},e,t)}),this._transportReady=!0}onIceGatheringStateChange=()=>{this.emit("@icegatheringstatechange",this._pc.iceGatheringState)};onIceCandidateError=e=>{this.emit("@icecandidateerror",e)};onConnectionStateChange=()=>{this.emit("@connectionstatechange",this._pc.connectionState)};onIceConnectionStateChange=()=>{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")}};assertNotClosed(){if(this._closed)throw new s.InvalidStateError("method called in a closed handler")}assertSendDirection(){if("send"!==this._direction)throw new Error('method can just be called for handlers with "send" direction')}assertRecvDirection(){if("recv"!==this._direction)throw new Error('method can just be called for handlers with "recv" direction')}};return vt.ReactNative106=u,vt}(),l=new e.Logger("Device");function h(e,t){return l.debug("detectDevice()"),e||"object"!=typeof navigator||(e=navigator.userAgent),t||"object"!=typeof navigator||(t=navigator.userAgentData),m(e,t)}async function u(e,t){return l.debug("detectDeviceAsync()"),e||"object"!=typeof navigator||(e=navigator.userAgent),t||"object"!=typeof navigator||(t=navigator.userAgentData),m(e,t)}function m(e,t){l.debug('detectDeviceImpl() [userAgent:"%s", userAgentData:%o]',e,t);const i=function(e,t){if(l.debug("getChromiumMajorVersion()"),f(e,t))return void l.debug("getChromiumMajorVersion() | this is iOS => undefined");if(g())return void l.debug("getChromiumMajorVersion() | this is React-Native => undefined");if(t){const e=(t.brands??[]).find(e=>"Chromium"===e.brand);if(e){const t=Number(e.version);return l.debug(`getChromiumMajorVersion() | Chromium major version based on NavigatorUAData => ${t}`),t}}const i=e?.match(/\b(?:Chrome|Chromium)\/(\w+)/i);if(i?.[1]){const e=Number(i[1]);return l.debug(`getChromiumMajorVersion() | Chromium major version based on User-Agent => ${e}`),e}return void l.debug("getChromiumMajorVersion() | this is not Chromium => undefined")}(e,t);if(i)return i>=111?(l.debug("detectDeviceImpl() | using Chrome111 handler"),"Chrome111"):i>=74?(l.debug("detectDeviceImpl() | using Chrome74 handler"),"Chrome74"):void l.warn("detectDeviceImpl() | unsupported Chromium based browser/version");const r=function(e){if(l.debug("getFirefoxMajorVersion()"),f(e))return void l.debug("getFirefoxMajorVersion() | this is iOS => undefined");if(g())return void l.debug("getFirefoxMajorVersion() | this is React-Native => undefined");const t=e?.match(/\bFirefox\/(\w+)/i);if(t?.[1]){const e=Number(t[1]);return l.debug(`getFirefoxMajorVersion() | Firefox major version based on User-Agent => ${e}`),e}return void l.debug("getFirefoxMajorVersion() | this is not Firefox => undefined")}(e);if(r)return r>=120?(l.debug("detectDeviceImpl() | using Firefox120 handler"),"Firefox120"):void l.warn("detectDeviceImpl() | unsupported Firefox browser/version");const s=function(e){if(l.debug("getMacOSWebKitMajorVersion()"),f(e))return void l.debug("getMacOSWebKitMajorVersion() | this is iOS => undefined");if(g())return void l.debug("getMacOSWebKitMajorVersion() | this is React-Native => undefined");const t=e&&/\bSafari\b/i.test(e)&&!/\bChrome\b/i.test(e)&&!/\bChromium\b/i.test(e)&&!/\bFirefox\b/i.test(e);if(!t)return void l.debug("getMacOSWebKitMajorVersion() | this is not Safari => undefined");const i=e.match(/AppleWebKit\/(\w+)/i);if(i?.[1]){const e=Number(i[1]);return l.debug(`getMacOSWebKitMajorVersion() | WebKit major version based on User-Agent => ${e}`),e}return void l.debug("getMacOSWebKitMajorVersion() | this is not WebKit => undefined")}(e);if(s)return s>=605?(l.debug("detectDeviceImpl() | using Safari12 handler"),"Safari12"):void l.warn("detectDeviceImpl() | unsupported desktop Safari browser/version");const a=function(e){if(l.debug("getIOSWebKitMajorVersion()"),!f(e))return void l.debug("getIOSWebKitMajorVersion() | this is not iOS => undefined");if(g())return void l.debug("getIOSWebKitMajorVersion() | this is React-Native => undefined");const t=e?.match(/AppleWebKit\/(\w+)/i);if(t?.[1]){const e=Number(t[1]);return l.debug(`getIOSWebKitMajorVersion() | WebKit major version based on User-Agent => ${e}`),e}return void l.debug("getIOSWebKitMajorVersion() | this is not WebKit => undefined")}(e);return a?a>=605?(l.debug("detectDeviceImpl() | using Safari12 handler"),"Safari12"):void l.warn("detectDeviceImpl() | unsupported iOS Safari based browser/version"):g()?"undefined"!=typeof RTCPeerConnection&&"undefined"!=typeof RTCRtpTransceiver?(l.debug("detectDeviceImpl() | using ReactNative106 handler"),"ReactNative106"):void l.warn("detectDeviceImpl() | unsupported react-native-webrtc version without RTCPeerConnection or RTCRtpTransceiver, forgot to call registerGlobals() on it?"):void l.warn('detectDeviceImpl() | device not supported [userAgent:"%s", userAgentData:%o]',e,t)}function f(e,t){return l.debug("isIOS()"),"iOS"===t?.platform?(l.debug("isIOS() | this is iOS based on NavigatorUAData.platform => true"),!0):t?.platform?(l.debug("isIOS() | this is not iOS based on NavigatorUAData.platform => false"),!1):e&&/iPad|iPhone|iPod/.test(e)?(l.debug("isIOS() | this is iOS based on User-Agent => true"),!0):"object"==typeof navigator&&"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1?(l.debug("isIOS() | this is iPadOS 13+ based on User-Agent => true"),!0):(l.debug("isIOS() | this is not iOS => false"),!1)}function g(){return l.debug("isReactNative()"),"object"==typeof navigator&&"ReactNative"===navigator.product?(l.debug("isReactNative() | this is React-Native based on navigator.product"),!0):(l.debug("isReactNative() | this is not React-Native => false"),!1)}return q.Device=class e{_handlerFactory;_handlerName;_loaded=!1;_getSendExtendedRtpCapabilities;_recvRtpCapabilities;_sendRtpCapabilities;_canProduceByKind={audio:!1,video:!1};_sctpCapabilities;_observer=new t.EnhancedEventEmitter;static async factory({handlerName:t,handlerFactory:r}={}){if(l.debug("factory()"),t&&r)throw new TypeError("just one of handlerName or handlerInterface can be given");if(!t&&!r&&!(t=await u()))throw new i.UnsupportedError("device not supported");return new e({handlerName:t,handlerFactory:r})}constructor({handlerName:e,handlerFactory:t}={}){if(l.debug("constructor()"),e&&t)throw new TypeError("just one of handlerName or handlerInterface can be given");if(t)this._handlerFactory=t;else{if(e)l.debug("constructor() | handler given: %s",e);else{if(!(e=h()))throw new i.UnsupportedError("device not supported");l.debug("constructor() | detected handler: %s",e)}switch(e){case"Chrome111":this._handlerFactory=n.Chrome111.createFactory();break;case"Chrome74":this._handlerFactory=o.Chrome74.createFactory();break;case"Firefox120":this._handlerFactory=c.Firefox120.createFactory();break;case"Safari12":this._handlerFactory=d.Safari12.createFactory();break;case"ReactNative106":this._handlerFactory=p.ReactNative106.createFactory();break;default:throw new TypeError(`unknown handlerName "${e}"`)}}this._handlerName=this._handlerFactory.name}get handlerName(){return this._handlerName}get loaded(){return this._loaded}get rtpCapabilities(){return this.recvRtpCapabilities}get recvRtpCapabilities(){if(!this._loaded)throw new i.InvalidStateError("not loaded");return this._recvRtpCapabilities}get sendRtpCapabilities(){if(!this._loaded)throw new i.InvalidStateError("not loaded");return this._sendRtpCapabilities}get sctpCapabilities(){if(!this._loaded)throw new i.InvalidStateError("not loaded");return this._sctpCapabilities}get observer(){return this._observer}async load({routerRtpCapabilities:e,preferLocalCodecsOrder:t=!1}){if(l.debug("load() [routerRtpCapabilities:%o]",e),this._loaded)throw new i.InvalidStateError("already loaded");const a=r.clone(e);s.validateAndNormalizeRtpCapabilities(a);const{getNativeRtpCapabilities:n,getNativeSctpCapabilities:o}=this._handlerFactory,c=r.clone(await n({direction:"recvonly"}));l.debug("load() | got native receiving RTP capabilities:%o",c),s.validateAndNormalizeRtpCapabilities(c);const d=r.clone(await n({direction:"sendonly"}));l.debug("load() | got native sending RTP capabilities:%o",d),s.validateAndNormalizeRtpCapabilities(d),this._getSendExtendedRtpCapabilities=e=>r.clone(s.getExtendedRtpCapabilities(e,a,t));const p=s.getExtendedRtpCapabilities(c,a,!1);this._recvRtpCapabilities=s.getRecvRtpCapabilities(p),l.debug("load() | got receiving RTP capabilities:%o",this._recvRtpCapabilities),s.validateAndNormalizeRtpCapabilities(this._recvRtpCapabilities);const h=s.getExtendedRtpCapabilities(d,a,t);this._sendRtpCapabilities=s.getSendRtpCapabilities(h),l.debug("load() | got sending RTP capabilities:%o",this._sendRtpCapabilities),s.validateAndNormalizeRtpCapabilities(this._sendRtpCapabilities),this._canProduceByKind.audio=s.canSend("audio",this._sendRtpCapabilities),this._canProduceByKind.video=s.canSend("video",this._sendRtpCapabilities),this._sctpCapabilities=await o(),s.validateSctpCapabilities(this._sctpCapabilities),l.debug("load() | got native SCTP capabilities:%o",this._sctpCapabilities),l.debug("load() succeeded"),this._loaded=!0}canProduce(e){if(!this._loaded)throw new i.InvalidStateError("not loaded");if("audio"!==e&&"video"!==e)throw new TypeError(`invalid kind "${e}"`);return this._canProduceByKind[e]}createSendTransport({id:e,iceParameters:t,iceCandidates:i,dtlsParameters:r,sctpParameters:s,iceServers:a,iceTransportPolicy:n,additionalSettings:o,appData:c}){return l.debug("createSendTransport()"),this.createTransport({direction:"send",id:e,iceParameters:t,iceCandidates:i,dtlsParameters:r,sctpParameters:s,iceServers:a,iceTransportPolicy:n,additionalSettings:o,appData:c})}createRecvTransport({id:e,iceParameters:t,iceCandidates:i,dtlsParameters:r,sctpParameters:s,iceServers:a,iceTransportPolicy:n,additionalSettings:o,appData:c}){return l.debug("createRecvTransport()"),this.createTransport({direction:"recv",id:e,iceParameters:t,iceCandidates:i,dtlsParameters:r,sctpParameters:s,iceServers:a,iceTransportPolicy:n,additionalSettings:o,appData:c})}createTransport({direction:e,id:t,iceParameters:r,iceCandidates:s,dtlsParameters:n,sctpParameters:o,iceServers:c,iceTransportPolicy:d,additionalSettings:p,appData:l}){if(!this._loaded)throw new i.InvalidStateError("not loaded");if("string"!=typeof t)throw new TypeError("missing id");if("object"!=typeof r)throw new TypeError("missing iceParameters");if(!Array.isArray(s))throw new TypeError("missing iceCandidates");if("object"!=typeof n)throw new TypeError("missing dtlsParameters");if(o&&"object"!=typeof o)throw new TypeError("wrong sctpParameters");if(l&&"object"!=typeof l)throw new TypeError("if given, appData must be an object");const h=new a.Transport({direction:e,id:t,iceParameters:r,iceCandidates:s,dtlsParameters:n,sctpParameters:o,iceServers:c,iceTransportPolicy:d,additionalSettings:p,appData:l,handlerFactory:this._handlerFactory,getSendExtendedRtpCapabilities:this._getSendExtendedRtpCapabilities,recvRtpCapabilities:this._recvRtpCapabilities,canProduceByKind:this._canProduceByKind});return this._observer.safeEmit("newtransport",h),h}},q}var _t,yt={},St={},wt={};var kt,Tt={};var Ct,Pt={};var Rt,Et,Dt={};function xt(){if(Et)return St;Et=1,Object.defineProperty(St,"__esModule",{value:!0}),St.FakeMediaStreamTrack=void 0;const e=function(){if(_t)return wt;_t=1;for(var e,t=256,i=[];t--;)i[t]=(t+256).toString(16).substring(1);return wt.v4=function(){var r,s=0,a="";if(!e||t+16>256){for(e=Array(s=256);s--;)e[s]=256*Math.random()|0;s=t=0}for(;s<16;s++)r=e[t+s],a+=6==s?i[15&r|64]:8==s?i[63&r|128]:i[r],1&s&&s>1&&s<11&&(a+="-");return t++,a},wt}(),t=(kt||(kt=1,Object.defineProperty(Tt,"__esModule",{value:!0}),Tt.FakeEventTarget=void 0,Tt.FakeEventTarget=class{listeners={};addEventListener(e,t,i){t&&(this.listeners[e]=this.listeners[e]??[],this.listeners[e].push({callback:"function"==typeof t?t:t.handleEvent,once:"object"==typeof i&&!0===i.once}))}removeEventListener(e,t,i){this.listeners[e]&&t&&(this.listeners[e]=this.listeners[e].filter(e=>e.callback!==("function"==typeof t?t:t.handleEvent)))}dispatchEvent(e){if(!e||"string"!=typeof e.type)throw new Error("invalid event object");const t=this.listeners[e.type];if(!t)return!0;for(const i of[...t]){try{i.callback.call(this,e)}catch(e){setTimeout(()=>{throw e},0)}i.once&&this.removeEventListener(e.type,i.callback)}return!e.defaultPrevented}}),Tt),i=(Ct||(Ct=1,Object.defineProperty(Pt,"__esModule",{value:!0}),Pt.FakeEvent=void 0,Pt.FakeEvent=class{NONE=0;CAPTURING_PHASE=1;AT_TARGET=2;BUBBLING_PHASE=3;type;bubbles;cancelable;defaultPrevented=!1;composed=!1;currentTarget=null;eventPhase=this.NONE;isTrusted=!0;target=null;timeStamp=0;cancelBubble=!1;returnValue=!0;srcElement=null;constructor(e,t={}){this.type=e,this.bubbles=t.bubbles??!1,this.cancelable=t.cancelable??!1}preventDefault(){this.cancelable&&(this.defaultPrevented=!0)}stopPropagation(){}stopImmediatePropagation(){}composedPath(){return[]}initEvent(e,t,i){}}),Pt),r=(Rt||(Rt=1,Object.defineProperty(Dt,"__esModule",{value:!0}),Dt.clone=function(e){return void 0===e?void 0:Number.isNaN(e)?NaN:"function"==typeof structuredClone?structuredClone(e):JSON.parse(JSON.stringify(e))}),Dt);class s extends t.FakeEventTarget{#e;#t;#i;#r;#s;#a;#n;#o;#c;#d;#p;#l=null;#h=null;#u=null;#m=null;#f=null;constructor({kind:t,id:i,label:r,contentHint:s,enabled:a,muted:n,readyState:o,capabilities:c,constraints:d,settings:p,data:l}){super(),this.#e=i??(0,e.v4)(),this.#t=t,this.#i=r??"",this.#n=s??"",this.#s=a??!0,this.#a=n??!1,this.#r=o??"live",this.#o=c??{},this.#c=d??{},this.#d=p??{},this.#p=l??{}}get id(){return this.#e}get kind(){return this.#t}get label(){return this.#i}get contentHint(){return this.#n}set contentHint(e){this.#n=e}get enabled(){return this.#s}set enabled(e){const t=this.#s!==e;this.#s=e,t&&this.dispatchEvent(new i.FakeEvent("enabledchange"))}get muted(){return this.#a}get readyState(){return this.#r}get data(){return this.#p}set data(e){this.#p=e}get onmute(){return this.#l}set onmute(e){this.#l&&this.removeEventListener("mute",this.#l),this.#l=e,e&&this.addEventListener("mute",e)}get onunmute(){return this.#h}set onunmute(e){this.#h&&this.removeEventListener("unmute",this.#h),this.#h=e,e&&this.addEventListener("unmute",e)}get onended(){return this.#u}set onended(e){this.#u&&this.removeEventListener("ended",this.#u),this.#u=e,e&&this.addEventListener("ended",e)}get onenabledchange(){return this.#m}set onenabledchange(e){this.#m&&this.removeEventListener("enabledchange",this.#m),this.#m=e,e&&this.addEventListener("enabledchange",e)}get onstopped(){return this.#f}set onstopped(e){this.#f&&this.removeEventListener("stopped",this.#f),this.#f=e,e&&this.addEventListener("stopped",e)}addEventListener(e,t,i){super.addEventListener(e,t,i)}removeEventListener(e,t,i){super.removeEventListener(e,t,i)}stop(){"ended"!==this.#r&&(this.#r="ended",this.dispatchEvent(new i.FakeEvent("stopped")))}clone({id:t,data:i}={}){return new s({id:t??(0,e.v4)(),kind:this.#t,label:this.#i,contentHint:this.#n,enabled:this.#s,muted:this.#a,readyState:this.#r,capabilities:(0,r.clone)(this.#o),constraints:(0,r.clone)(this.#c),settings:(0,r.clone)(this.#d),data:i??(0,r.clone)(this.#p)})}getCapabilities(){return this.#o}getConstraints(){return this.#c}async applyConstraints(e={}){return this.#c=e,Promise.resolve()}getSettings(){return this.#d}remoteStop(){"ended"!==this.#r&&(this.#r="ended",this.dispatchEvent(new i.FakeEvent("stopped")),this.dispatchEvent(new i.FakeEvent("ended")))}remoteMute(){this.#a||(this.#a=!0,this.dispatchEvent(new i.FakeEvent("mute")))}remoteUnmute(){this.#a&&(this.#a=!1,this.dispatchEvent(new i.FakeEvent("unmute")))}}return St.FakeMediaStreamTrack=s,St}var It,Mt,Lt={};function Ot(){if(Mt)return yt;Mt=1,Object.defineProperty(yt,"__esModule",{value:!0}),yt.FakeHandler=void 0;const e=xt(),t=J(),i=G(),r=ie(),s=pe(),a=Z(),n=(It||(It=1,Object.defineProperty(Lt,"__esModule",{value:!0}),Lt.FakeEventTarget=void 0,Lt.FakeEventTarget=class{listeners={};addEventListener(e,t,i){t&&(this.listeners[e]=this.listeners[e]??[],this.listeners[e].push({callback:"function"==typeof t?t:t.handleEvent,once:"object"==typeof i&&!0===i.once}))}removeEventListener(e,t,i){this.listeners[e]&&t&&(this.listeners[e]=this.listeners[e].filter(e=>e.callback!==("function"==typeof t?t:t.handleEvent)))}dispatchEvent(e){if(!e||"string"!=typeof e.type)throw new Error("invalid event object");const t=this.listeners[e.type];if(!t)return!0;for(const i of[...t]){try{i.callback.call(this,e)}catch(e){setTimeout(()=>{throw e},0)}i.once&&this.removeEventListener(e.type,i.callback)}return!e.defaultPrevented}}),Lt),o=new i.Logger("FakeHandler"),c="FakeHandler";let d=class i extends t.EnhancedEventEmitter{_closed=!1;_fakeParameters;_getSendExtendedRtpCapabilities;_cname=`CNAME-${r.generateRandomNumber()}`;_defaultSendStreamId=`${r.generateRandomNumber()}`;_transportReady=!1;_nextLocalId=1;_tracks=new Map;_nextSctpStreamId=0;static createFactory(e){return{name:c,factory:t=>new i(t,e),getNativeRtpCapabilities:async({direction:t})=>(o.debug("getNativeRtpCapabilities() [direction:%o]",t),i.getLocalRtpCapabilities(e)),getNativeSctpCapabilities:async()=>(o.debug("getNativeSctpCapabilities()"),e.generateNativeSctpCapabilities())}}static getLocalRtpCapabilities(e){const t=e.generateNativeRtpCapabilities();return s.validateAndNormalizeRtpCapabilities(t),t}constructor({getSendExtendedRtpCapabilities:e},t){super(),o.debug("constructor()"),this._getSendExtendedRtpCapabilities=e,this._fakeParameters=t}get name(){return c}close(){o.debug("close()"),this._closed||(this._closed=!0,super.close())}setIceGatheringState(e){this.emit("@icegatheringstatechange",e)}setConnectionState(e){this.emit("@connectionstatechange",e)}async updateIceServers(e){this.assertNotClosed(),o.debug("updateIceServers()")}async restartIce(e){this.assertNotClosed(),o.debug("restartIce()")}async getTransportStats(){return this.assertNotClosed(),new Map}async send({track:e,streamId:t,encodings:a,codecOptions:n,codec:c}){this.assertNotClosed(),o.debug("send() [kind:%s, track.id:%s]",e.kind,e.id),this._transportReady||await this.setupTransport({localDtlsRole:"server"});const d=i.getLocalRtpCapabilities(this._fakeParameters),p=this._getSendExtendedRtpCapabilities(d),l=s.getSendingRtpParameters(e.kind,p);l.codecs=s.reduceCodecs(l.codecs,c);const h=l.codecs.some(e=>/.+\/rtx$/i.test(e.mimeType));l.mid=`mid-${r.generateRandomNumber()}`,l.msid=`${t??"-"} ${e.id}`,a||(a=[{}]);for(const e of a)e.ssrc=r.generateRandomNumber(),h&&(e.rtx={ssrc:r.generateRandomNumber()});l.encodings=a,l.rtcp={cname:this._cname,reducedSize:!0,mux:!0},l.msid=`${t??this._defaultSendStreamId} ${e.id}`;const u=this._nextLocalId++;return this._tracks.set(u,e),{localId:String(u),rtpParameters:l}}async stopSending(e){if(o.debug("stopSending() [localId:%s]",e),!this._closed){if(!this._tracks.has(Number(e)))throw new Error("local track not found");this._tracks.delete(Number(e))}}async pauseSending(e){this.assertNotClosed()}async resumeSending(e){this.assertNotClosed()}async replaceTrack(e,t){this.assertNotClosed(),t?o.debug("replaceTrack() [localId:%s, track.id:%s]",e,t.id):o.debug("replaceTrack() [localId:%s, no track]",e),this._tracks.delete(Number(e)),this._tracks.set(Number(e),t)}async setMaxSpatialLayer(e,t){this.assertNotClosed(),o.debug("setMaxSpatialLayer() [localId:%s, spatialLayer:%s]",e,t)}async setRtpEncodingParameters(e,t){this.assertNotClosed(),o.debug("setRtpEncodingParameters() [localId:%s, params:%o]",e,t)}async getSenderStats(e){return this.assertNotClosed(),new Map}async sendDataChannel({ordered:e,maxPacketLifeTime:t,maxRetransmits:i,label:r,protocol:s}){this.assertNotClosed(),this._transportReady||await this.setupTransport({localDtlsRole:"server"}),o.debug("sendDataChannel()");return{dataChannel:new p({id:this._nextSctpStreamId++,ordered:e,maxPacketLifeTime:t,maxRetransmits:i,label:r,protocol:s}),sctpStreamParameters:{streamId:this._nextSctpStreamId,ordered:e,maxPacketLifeTime:t,maxRetransmits:i}}}async receive(t){this.assertNotClosed();const i=[];for(const r of t){const{trackId:t,kind:s}=r;this._transportReady||await this.setupTransport({localDtlsRole:"client"}),o.debug("receive() [trackId:%s, kind:%s]",t,s);const a=this._nextLocalId++,n=new e.FakeMediaStreamTrack({kind:s});this._tracks.set(a,n),i.push({localId:String(a),track:n})}return i}async stopReceiving(e){if(!this._closed)for(const t of e)o.debug("stopReceiving() [localId:%s]",t),this._tracks.delete(Number(t))}async pauseReceiving(e){this.assertNotClosed()}async resumeReceiving(e){this.assertNotClosed()}async getReceiverStats(e){return this.assertNotClosed(),new Map}async receiveDataChannel({sctpStreamParameters:e,label:t,protocol:i}){this.assertNotClosed(),this._transportReady||await this.setupTransport({localDtlsRole:"client"}),o.debug("receiveDataChannel()");return{dataChannel:new p({id:e.streamId,ordered:e.ordered,maxPacketLifeTime:e.maxPacketLifeTime,maxRetransmits:e.maxRetransmits,label:t,protocol:i})}}async setupTransport({localDtlsRole:e,localSdpObject:t}){const i=r.clone(this._fakeParameters.generateLocalDtlsParameters());e&&(i.role=e),this.emit("@connectionstatechange","connecting"),await new Promise((e,t)=>this.emit("@connect",{dtlsParameters:i},e,t)),this._transportReady=!0}assertNotClosed(){if(this._closed)throw new a.InvalidStateError("method called in a closed handler")}};yt.FakeHandler=d;class p extends n.FakeEventTarget{_id;_negotiated=!0;_ordered;_maxPacketLifeTime;_maxRetransmits;_label;_protocol;_readyState="connecting";_bufferedAmount=0;_bufferedAmountLowThreshold=0;_binaryType="arraybuffer";_onopen=null;_onclosing=null;_onclose=null;_onmessage=null;_onbufferedamountlow=null;_onerror=null;constructor({id:e,ordered:t=!0,maxPacketLifeTime:i=null,maxRetransmits:r=null,label:s="",protocol:a=""}){super(),o.debug(`constructor() [id:${e}, ordered:${t}, maxPacketLifeTime:${i}, maxRetransmits:${r}, label:${s}, protocol:${a}`),this._id=e,this._ordered=t,this._maxPacketLifeTime=i,this._maxRetransmits=r,this._label=s,this._protocol=a}get id(){return this._id}get negotiated(){return this._negotiated}get ordered(){return this._ordered}get maxPacketLifeTime(){return this._maxPacketLifeTime}get maxRetransmits(){return this._maxRetransmits}get label(){return this._label}get protocol(){return this._protocol}get readyState(){return this._readyState}get bufferedAmount(){return this._bufferedAmount}get bufferedAmountLowThreshold(){return this._bufferedAmountLowThreshold}set bufferedAmountLowThreshold(e){this._bufferedAmountLowThreshold=e}get binaryType(){return this._binaryType}set binaryType(e){this._binaryType=e}get onopen(){return this._onopen}set onopen(e){this._onopen&&this.removeEventListener("open",this._onopen),this._onopen=e,e&&this.addEventListener("open",e)}get onclosing(){return this._onclosing}set onclosing(e){this._onclosing&&this.removeEventListener("closing",this._onclosing),this._onclosing=e,e&&this.addEventListener("closing",e)}get onclose(){return this._onclose}set onclose(e){this._onclose&&this.removeEventListener("close",this._onclose),this._onclose=e,e&&this.addEventListener("close",e)}get onmessage(){return this._onmessage}set onmessage(e){this._onmessage&&this.removeEventListener("message",this._onmessage),this._onmessage=e,e&&this.addEventListener("message",e)}get onbufferedamountlow(){return this._onbufferedamountlow}set onbufferedamountlow(e){this._onbufferedamountlow&&this.removeEventListener("bufferedamountlow",this._onbufferedamountlow),this._onbufferedamountlow=e,e&&this.addEventListener("bufferedamountlow",e)}get onerror(){return this._onerror}set onerror(e){this._onerror&&this.removeEventListener("error",this._onerror),this._onerror=e,e&&this.addEventListener("error",e)}addEventListener(e,t,i){super.addEventListener(e,t,i)}removeEventListener(e,t,i){super.removeEventListener(e,t,i)}close(){["closing","closed"].includes(this._readyState)||(this._readyState="closed")}send(e){if("open"!==this._readyState)throw new a.InvalidStateError("not open")}}return yt}var At,jt,Ft={};function Nt(){return jt||(jt=1,function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.debug=e.testFakeParameters=e.FakeHandler=e.enhancedEvents=e.ortc=e.parseScalabilityMode=e.detectDeviceAsync=e.detectDevice=e.Device=e.version=e.types=void 0;const t=B();e.debug=t.default,e.types=(z||(z=1,Object.defineProperty(V,"__esModule",{value:!0})),V),e.version="3.18.7";var i=bt();Object.defineProperty(e,"Device",{enumerable:!0,get:function(){return i.Device}}),Object.defineProperty(e,"detectDevice",{enumerable:!0,get:function(){return i.detectDevice}}),Object.defineProperty(e,"detectDeviceAsync",{enumerable:!0,get:function(){return i.detectDeviceAsync}});var r=Ge();Object.defineProperty(e,"parseScalabilityMode",{enumerable:!0,get:function(){return r.parse}}),e.ortc=pe(),e.enhancedEvents=J();var s=Ot();Object.defineProperty(e,"FakeHandler",{enumerable:!0,get:function(){return s.FakeHandler}}),e.testFakeParameters=function(){if(At)return Ft;At=1,Object.defineProperty(Ft,"__esModule",{value:!0}),Ft.generateRouterRtpCapabilities=function(){return e.deepFreeze({codecs:[{mimeType:"audio/opus",kind:"audio",preferredPayloadType:100,clockRate:48e3,channels:2,rtcpFeedback:[{type:"transport-cc"}],parameters:{useinbandfec:1,foo:"bar"}},{mimeType:"video/VP8",kind:"video",preferredPayloadType:101,clockRate:9e4,rtcpFeedback:[{type:"nack"},{type:"nack",parameter:"pli"},{type:"ccm",parameter:"fir"},{type:"goog-remb"},{type:"transport-cc"}],parameters:{"x-google-start-bitrate":1500}},{mimeType:"video/rtx",kind:"video",preferredPayloadType:102,clockRate:9e4,rtcpFeedback:[],parameters:{apt:101}},{mimeType:"video/H264",kind:"video",preferredPayloadType:103,clockRate:9e4,rtcpFeedback:[{type:"nack"},{type:"nack",parameter:"pli"},{type:"ccm",parameter:"fir"},{type:"goog-remb"},{type:"transport-cc"}],parameters:{"level-asymmetry-allowed":1,"packetization-mode":1,"profile-level-id":"42e01f"}},{mimeType:"video/rtx",kind:"video",preferredPayloadType:104,clockRate:9e4,rtcpFeedback:[],parameters:{apt:103}},{mimeType:"video/VP9",kind:"video",preferredPayloadType:105,clockRate:9e4,rtcpFeedback:[{type:"nack"},{type:"nack",parameter:"pli"},{type:"ccm",parameter:"fir"},{type:"goog-remb"},{type:"transport-cc"}],parameters:{"profile-id":0,"x-google-start-bitrate":1500}},{mimeType:"video/rtx",kind:"video",preferredPayloadType:106,clockRate:9e4,rtcpFeedback:[],parameters:{apt:105}}],headerExtensions:[{kind:"audio",uri:"urn:ietf:params:rtp-hdrext:sdes:mid",preferredId:1,preferredEncrypt:!1,direction:"sendrecv"},{kind:"video",uri:"urn:ietf:params:rtp-hdrext:sdes:mid",preferredId:1,preferredEncrypt:!1,direction:"sendrecv"},{kind:"video",uri:"urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id",preferredId:2,preferredEncrypt:!1,direction:"recvonly"},{kind:"video",uri:"urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id",preferredId:3,preferredEncrypt:!1,direction:"recvonly"},{kind:"audio",uri:"http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time",preferredId:4,preferredEncrypt:!1,direction:"sendrecv"},{kind:"video",uri:"http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time",preferredId:4,preferredEncrypt:!1,direction:"sendrecv"},{kind:"audio",uri:"http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01",preferredId:5,preferredEncrypt:!1,direction:"recvonly"},{kind:"video",uri:"http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01",preferredId:5,preferredEncrypt:!1,direction:"sendrecv"},{kind:"audio",uri:"urn:ietf:params:rtp-hdrext:ssrc-audio-level",preferredId:10,preferredEncrypt:!1,direction:"sendrecv"},{kind:"video",uri:"urn:3gpp:video-orientation",preferredId:11,preferredEncrypt:!1,direction:"sendrecv"},{kind:"video",uri:"urn:ietf:params:rtp-hdrext:toffset",preferredId:12,preferredEncrypt:!1,direction:"sendrecv"}]})},Ft.generateNativeRtpCapabilities=function(){return{codecs:[{mimeType:"audio/opus",kind:"audio",preferredPayloadType:111,clockRate:48e3,channels:2,rtcpFeedback:[{type:"transport-cc"}],parameters:{minptime:10,useinbandfec:1}},{mimeType:"audio/ISAC",kind:"audio",preferredPayloadType:103,clockRate:16e3,channels:1,rtcpFeedback:[{type:"transport-cc"}],parameters:{}},{mimeType:"audio/CN",kind:"audio",preferredPayloadType:106,clockRate:32e3,channels:1,rtcpFeedback:[{type:"transport-cc"}],parameters:{}},{mimeType:"audio/foo",kind:"audio",preferredPayloadType:107,clockRate:9e4,channels:4,rtcpFeedback:[{type:"foo-qwe-qwe"}],parameters:{foo:"lalala"}},{mimeType:"video/BAZCODEC",kind:"video",preferredPayloadType:100,clockRate:9e4,rtcpFeedback:[{type:"foo"},{type:"transport-cc"},{type:"ccm",parameter:"fir"},{type:"nack"},{type:"nack",parameter:"pli"}],parameters:{baz:"1234abcd"}},{mimeType:"video/rtx",kind:"video",preferredPayloadType:101,clockRate:9e4,rtcpFeedback:[],parameters:{apt:100}},{mimeType:"video/VP8",kind:"video",preferredPayloadType:96,clockRate:9e4,rtcpFeedback:[{type:"goog-remb"},{type:"transport-cc"},{type:"ccm",parameter:"fir"},{type:"nack"},{type:"nack",parameter:"pli"}],parameters:{baz:"1234abcd"}},{mimeType:"video/rtx",kind:"video",preferredPayloadType:97,clockRate:9e4,rtcpFeedback:[],parameters:{apt:96}},{mimeType:"video/VP9",kind:"video",preferredPayloadType:98,clockRate:9e4,rtcpFeedback:[{type:"goog-remb"},{type:"transport-cc"},{type:"ccm",parameter:"fir"},{type:"nack"},{type:"nack",parameter:"pli"}],parameters:{"profile-id":0}},{mimeType:"video/rtx",kind:"video",preferredPayloadType:99,clockRate:9e4,rtcpFeedback:[],parameters:{apt:98}}],headerExtensions:[{kind:"audio",uri:"urn:ietf:params:rtp-hdrext:sdes:mid",preferredId:1},{kind:"video",uri:"urn:ietf:params:rtp-hdrext:sdes:mid",preferredId:1},{kind:"video",uri:"urn:ietf:params:rtp-hdrext:toffset",preferredId:2},{kind:"video",uri:"http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time",preferredId:3},{kind:"video",uri:"urn:3gpp:video-orientation",preferredId:4},{kind:"video",uri:"http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01",preferredId:5},{kind:"video",uri:"http://www.webrtc.org/experiments/rtp-hdrext/playout-delay",preferredId:6},{kind:"video",uri:"http://www.webrtc.org/experiments/rtp-hdrext/video-content-type",preferredId:7},{kind:"video",uri:"http://www.webrtc.org/experiments/rtp-hdrext/video-timing",preferredId:8},{kind:"audio",uri:"urn:ietf:params:rtp-hdrext:ssrc-audio-level",preferredId:10}]}},Ft.generateNativeSctpCapabilities=function(){return e.deepFreeze({numStreams:{OS:2048,MIS:2048}})},Ft.generateLocalDtlsParameters=function(){return e.deepFreeze({fingerprints:[{algorithm:"sha-256",value:"82:5A:68:3D:36:C3:0A:DE:AF:E7:32:43:D2:88:83:57:AC:2D:65:E5:80:C4:B6:FB:AF:1A:A0:21:9F:6D:0C:AD"}],role:"auto"})},Ft.generateTransportRemoteParameters=function(){return{id:t(),iceParameters:e.deepFreeze({iceLite:!0,password:"yku5ej8nvfaor28lvtrabcx0wkrpkztz",usernameFragment:"h3hk1iz6qqlnqlne"}),iceCandidates:e.deepFreeze([{foundation:"udpcandidate",address:"9.9.9.9",ip:"9.9.9.9",port:40533,priority:1078862079,protocol:"udp",type:"host",tcpType:"passive"},{foundation:"udpcandidate",address:"9.9.9.9",ip:"9:9:9:9:9:9",port:41333,priority:1078862089,protocol:"udp",type:"host",tcpType:"passive"}]),dtlsParameters:e.deepFreeze({fingerprints:[{algorithm:"sha-256",value:"A9:F4:E0:D2:74:D3:0F:D9:CA:A5:2F:9F:7F:47:FA:F0:C4:72:DD:73:49:D0:3B:14:90:20:51:30:1B:90:8E:71"},{algorithm:"sha-384",value:"03:D9:0B:87:13:98:F6:6D:BC:FC:92:2E:39:D4:E1:97:32:61:30:56:84:70:81:6E:D1:82:97:EA:D9:C1:21:0F:6B:C5:E7:7F:E1:97:0C:17:97:6E:CF:B3:EF:2E:74:B0"},{algorithm:"sha-512",value:"84:27:A4:28:A4:73:AF:43:02:2A:44:68:FF:2F:29:5C:3B:11:9A:60:F4:A8:F0:F5:AC:A0:E3:49:3E:B1:34:53:A9:85:CE:51:9B:ED:87:5E:B8:F4:8E:3D:FA:20:51:B8:96:EE:DA:56:DC:2F:5C:62:79:15:23:E0:21:82:2B:2C"}],role:"auto"}),sctpParameters:e.deepFreeze({port:5e3,OS:2048,MIS:2048,maxMessageSize:2e6})}},Ft.generateProducerRemoteParameters=function(){return e.deepFreeze({id:t()})},Ft.generateConsumerRemoteParameters=function({id:i,codecMimeType:r}={}){switch(r){case"audio/opus":return{id:i??t(),producerId:t(),kind:"audio",rtpParameters:e.deepFreeze({codecs:[{mimeType:"audio/opus",payloadType:100,clockRate:48e3,channels:2,rtcpFeedback:[{type:"transport-cc"}],parameters:{useinbandfec:1,foo:"bar"}}],encodings:[{ssrc:46687003}],headerExtensions:[{uri:"urn:ietf:params:rtp-hdrext:sdes:mid",id:1},{uri:"http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01",id:5},{uri:"urn:ietf:params:rtp-hdrext:ssrc-audio-level",id:10}],rtcp:{cname:"wB4Ql4lrsxYLjzuN",reducedSize:!0,mux:!0}})};case"audio/ISAC":return{id:i??t(),producerId:t(),kind:"audio",rtpParameters:e.deepFreeze({codecs:[{mimeType:"audio/ISAC",payloadType:111,clockRate:16e3,channels:1,rtcpFeedback:[{type:"transport-cc"}],parameters:{}}],encodings:[{ssrc:46687004}],headerExtensions:[{uri:"urn:ietf:params:rtp-hdrext:sdes:mid",id:1},{uri:"http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01",id:5}],rtcp:{cname:"wB4Ql4lrsxYLjzuN",reducedSize:!0,mux:!0}})};case"video/VP8":return{id:i??t(),producerId:t(),kind:"video",rtpParameters:e.deepFreeze({codecs:[{mimeType:"video/VP8",payloadType:101,clockRate:9e4,rtcpFeedback:[{type:"nack"},{type:"nack",parameter:"pli"},{type:"ccm",parameter:"fir"},{type:"goog-remb"},{type:"transport-cc"}],parameters:{"x-google-start-bitrate":1500}},{mimeType:"video/rtx",payloadType:102,clockRate:9e4,rtcpFeedback:[],parameters:{apt:101}}],encodings:[{ssrc:99991111,rtx:{ssrc:99991112}}],headerExtensions:[{uri:"urn:ietf:params:rtp-hdrext:sdes:mid",id:1},{uri:"http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time",id:4},{uri:"http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01",id:5},{uri:"urn:3gpp:video-orientation",id:11},{uri:"urn:ietf:params:rtp-hdrext:toffset",id:12}],rtcp:{cname:"wB4Ql4lrsxYLjzuN",reducedSize:!0,mux:!0}})};case"video/H264":return{id:i??t(),producerId:t(),kind:"video",rtpParameters:e.deepFreeze({codecs:[{mimeType:"video/H264",payloadType:103,clockRate:9e4,rtcpFeedback:[{type:"nack"},{type:"nack",parameter:"pli"},{type:"ccm",parameter:"fir"},{type:"goog-remb"},{type:"transport-cc"}],parameters:{"level-asymmetry-allowed":1,"packetization-mode":1,"profile-level-id":"42e01f"}},{mimeType:"video/rtx",payloadType:104,clockRate:9e4,rtcpFeedback:[],parameters:{apt:103}}],encodings:[{ssrc:99991113,rtx:{ssrc:99991114}}],headerExtensions:[{uri:"urn:ietf:params:rtp-hdrext:sdes:mid",id:1},{uri:"http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time",id:4},{uri:"http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01",id:5},{uri:"urn:3gpp:video-orientation",id:11},{uri:"urn:ietf:params:rtp-hdrext:toffset",id:12}],rtcp:{cname:"wB4Ql4lrsxYLjzuN",reducedSize:!0,mux:!0}})};default:throw new TypeError(`unknown codecMimeType '${r}'`)}},Ft.generateDataProducerRemoteParameters=function(){return e.deepFreeze({id:t()})},Ft.generateDataConsumerRemoteParameters=function({id:i}={}){return{id:i??t(),dataProducerId:t(),sctpStreamParameters:e.deepFreeze({streamId:666,maxPacketLifeTime:5e3,maxRetransmits:void 0})}};const e=ie();function t(){return String(e.generateRandomNumber())}return Ft}()}(N)),N}var $t=Nt();const Ut=p("TransportManager");class Bt extends n{constructor(e){super(),this.sendTransport=null,this.recvTransport=null,this.signalDataProducer=null,this.signalDataConsumer=null,this.url="",this.hasDtlsFingerprints=!1,this.joinResponse=null,this.certificate=null,this.pendingProduceCallbacks=new Map,this.pendingProduceDataCallbacks=new Map,this.device=new $t.Device,this.signalClient=e}registerProduceCallback(e,t){this.pendingProduceCallbacks.set(e,t)}registerProduceDataCallback(e,t){this.pendingProduceDataCallbacks.set(e,t)}async generateCertificate(){try{const e=await RTCPeerConnection.generateCertificate({name:"ECDSA",namedCurve:"P-256"});this.certificate=e;const t=e.getFingerprints().map(e=>({algorithm:e.algorithm??"",value:e.value?.toUpperCase()??""}));return Ut.info(`Generated certificate with ${t.length} fingerprint(s)`),t}catch(e){return Ut.warn("Failed to generate certificate, falling back to auto-generated",e),[]}}getCertificate(){return this.certificate}setCertificate(e){this.certificate=e}getDtlsFingerprints(){return this.certificate?this.certificate.getFingerprints().map(e=>({algorithm:e.algorithm??"",value:e.value?.toUpperCase()??""})):[]}async setup(e,t,i,r){this.url=e,this.joinResponse=t,this.hasDtlsFingerprints=i,this.device.loaded||(await this.device.load({routerRtpCapabilities:t.rtpCapabilities}),Ut.info("Device loaded with RTP capabilities"));const s={};this.certificate&&(s.certificates=[this.certificate]),t.iceTransportPolicy&&(s.iceTransportPolicy=t.iceTransportPolicy),r&&Object.assign(s,r),this.sendTransport=this.device.createSendTransport({id:t.sendTransport.sid,iceParameters:t.sendTransport.iceParameters,iceCandidates:t.sendTransport.iceCandidates,dtlsParameters:t.sendTransport.dtlsParameters,sctpParameters:t.sendTransport.sctpParameters,iceServers:t.iceServers,additionalSettings:s}),Ut.info(`Send transport created: ${this.sendTransport.id}`),this.recvTransport=this.device.createRecvTransport({id:t.receiveTransport.sid,iceParameters:t.receiveTransport.iceParameters,iceCandidates:t.receiveTransport.iceCandidates,dtlsParameters:t.receiveTransport.dtlsParameters,sctpParameters:t.receiveTransport.sctpParameters,iceServers:t.iceServers,additionalSettings:s}),Ut.info(`Recv transport created: ${this.recvTransport.id}`),this.setupTransportEvents(),await this.setupSignalChannels(t)}async restartIce(e){if(this.sendTransport){const t=e[this.sendTransport.id];t&&(await this.sendTransport.restartIce({iceParameters:t}),Ut.info(`ICE restarted on send transport ${this.sendTransport.id}`))}if(this.recvTransport){const t=e[this.recvTransport.id];t&&(await this.recvTransport.restartIce({iceParameters:t}),Ut.info(`ICE restarted on recv transport ${this.recvTransport.id}`))}}async getStats(){const[e,t]=await Promise.all([this.sendTransport?.getStats(),this.recvTransport?.getStats()]);return{send:e??void 0,recv:t??void 0}}close(){(this.sendTransport||this.recvTransport)&&(this.signalDataProducer?.close(),this.signalDataConsumer?.close(),this.sendTransport?.close(),this.recvTransport?.close(),this.signalDataProducer=null,this.signalDataConsumer=null,this.sendTransport=null,this.recvTransport=null,this.emit("closed"),Ut.info("Transport manager closed"))}setupTransportEvents(){const e=[];this.sendTransport.on("connect",({dtlsParameters:t},i,r)=>{this.hasDtlsFingerprints?i():(e.push({transportSid:this.sendTransport.id,dtlsParameters:t}),this.connectTransports(e).then(()=>i()).catch(r))}),this.sendTransport.on("produce",(e,t,i)=>{const r=e.appData?.clientTrackId;if(r){const s=this.pendingProduceCallbacks.get(r);if(s)return this.pendingProduceCallbacks.delete(r),void s(e,t,i)}Ut.warn("Unhandled produce event, no matching clientTrackId callback"),i(new Error("No produce callback registered for this track"))}),this.sendTransport.on("producedata",(e,t,i)=>{if(e.label===this.joinResponse?.signal.send.label)return void t({id:this.joinResponse.signal.send.channelSid});const r=e.appData?.clientTrackId;if(r){const s=this.pendingProduceDataCallbacks.get(r);if(s)return this.pendingProduceDataCallbacks.delete(r),void s(e,t,i)}Ut.warn("Unhandled producedata event, no matching callback"),i(new Error("No producedata callback registered"))}),this.sendTransport.on("connectionstatechange",e=>{Ut.info(`Send transport connection state: ${e}`),"failed"!==e&&"disconnected"!==e||this.emit("connectionFailed","send")}),this.recvTransport.on("connect",({dtlsParameters:t},i,r)=>{this.hasDtlsFingerprints?i():(e.push({transportSid:this.recvTransport.id,dtlsParameters:t}),this.connectTransports(e).then(()=>i()).catch(r))}),this.recvTransport.on("connectionstatechange",e=>{Ut.info(`Recv transport connection state: ${e}`),"failed"!==e&&"disconnected"!==e||this.emit("connectionFailed","recv")})}async connectTransports(e){if(!this.joinResponse)return;const t={nodeId:this.signalClient.currentNodeId,participantSid:this.joinResponse.participant.sid,transports:e};await this.signalClient.connect(this.url,t,this.joinResponse.room?.name),e.length=0}async setupSignalChannels(e){this.signalDataConsumer=await this.recvTransport.consumeData({id:e.signal.receive.channelSid,dataProducerId:e.signal.receive.dataSourceSid,sctpStreamParameters:e.signal.receive.sctpStreamParameters,label:e.signal.receive.label,protocol:e.signal.receive.protocol}),Ut.info("Signal receive DataChannel established");const t={sctpStreamParameters:e.signal.send.sctpStreamParameters,label:e.signal.send.label,protocol:e.signal.send.protocol};this.signalDataProducer=await this.sendTransport.produceData(t),Ut.info("Signal send DataChannel established"),await Promise.all([this.waitForDataChannelOpen(this.signalDataProducer,"signalDataProducer"),this.waitForDataChannelOpen(this.signalDataConsumer,"signalDataConsumer")]),this.emit("signalReady",this.signalDataProducer,this.signalDataConsumer)}waitForDataChannelOpen(e,t){const i=e.readyState;if("open"===i)return Promise.resolve();if("closed"===i||"closing"===i)return Promise.reject(new Error(`${t} is already ${i}`));const r=e;return new Promise((e,i)=>{const s=setTimeout(()=>{a(),i(new Error(`${t} open timed out after ${Bt.DC_OPEN_TIMEOUT}ms`))},Bt.DC_OPEN_TIMEOUT),a=()=>{clearTimeout(s),r.off("open",n),r.off("close",o),r.off("error",c)},n=()=>{a(),e()},o=()=>{a(),i(new Error(`${t} closed before opening`))},c=e=>{a(),i(e)};r.on("open",n),r.on("close",o),r.on("error",c)})}}var zt,Vt,Ht,qt,Qt,Gt,Kt,Wt,Jt,Yt,Xt,Zt,ei,ti;Bt.DC_OPEN_TIMEOUT=1e4,e.RoomState=void 0,(zt=e.RoomState||(e.RoomState={})).Disconnected="disconnected",zt.Connecting="connecting",zt.Connected="connected",zt.Reconnecting="reconnecting",e.ConnectionQuality=void 0,(Vt=e.ConnectionQuality||(e.ConnectionQuality={})).Excellent="excellent",Vt.Good="good",Vt.Poor="poor",Vt.Lost="lost",Vt.Unknown="unknown",e.TrackKind=void 0,(Ht=e.TrackKind||(e.TrackKind={})).Audio="audio",Ht.Video="video",e.TrackSource=void 0,(qt=e.TrackSource||(e.TrackSource={})).Camera="camera",qt.Microphone="microphone",qt.ScreenShare="screen_share",qt.ScreenShareAudio="screen_share_audio",qt.Unknown="unknown",e.VideoQuality=void 0,(Qt=e.VideoQuality||(e.VideoQuality={}))[Qt.LOW=0]="LOW",Qt[Qt.MEDIUM=1]="MEDIUM",Qt[Qt.HIGH=2]="HIGH",e.AudioTrackFeature=void 0,(Gt=e.AudioTrackFeature||(e.AudioTrackFeature={})).AutoGainControl="auto_gain_control",Gt.EchoCancellation="echo_cancellation",Gt.NoiseSuppression="noise_suppression",Gt.Stereo="stereo",Gt.NoDtx="no_dtx",Gt.EnhancedNoiseCancellation="enhanced_noise_cancellation",e.StreamState=void 0,(Kt=e.StreamState||(e.StreamState={})).Active="active",Kt.Paused="paused",Kt.Unknown="unknown",e.DisconnectReason=void 0,(Wt=e.DisconnectReason||(e.DisconnectReason={}))[Wt.UnknownReason=0]="UnknownReason",Wt[Wt.ClientInitiated=1]="ClientInitiated",Wt[Wt.DuplicateIdentity=2]="DuplicateIdentity",Wt[Wt.ServerShutdown=3]="ServerShutdown",Wt[Wt.ParticipantRemoved=4]="ParticipantRemoved",Wt[Wt.RoomDeleted=5]="RoomDeleted",Wt[Wt.StateMismatch=6]="StateMismatch",Wt[Wt.JoinFailure=7]="JoinFailure",Wt[Wt.Migration=8]="Migration",Wt[Wt.SignalClose=9]="SignalClose",Wt[Wt.RoomClosed=10]="RoomClosed",Wt[Wt.UserUnavailable=11]="UserUnavailable",Wt[Wt.UserRejected=12]="UserRejected",Wt[Wt.SipTrunkFailure=13]="SipTrunkFailure",Wt[Wt.ConnectionTimeout=14]="ConnectionTimeout",Wt[Wt.MediaFailure=15]="MediaFailure",e.ParticipantState=void 0,(Jt=e.ParticipantState||(e.ParticipantState={}))[Jt.Joining=0]="Joining",Jt[Jt.Joined=1]="Joined",Jt[Jt.Suspended=2]="Suspended",Jt[Jt.Disconnected=3]="Disconnected",e.ParticipantKind=void 0,(Yt=e.ParticipantKind||(e.ParticipantKind={}))[Yt.Standard=0]="Standard",Yt[Yt.Ingress=1]="Ingress",Yt[Yt.Egress=2]="Egress",Yt[Yt.Sip=3]="Sip",Yt[Yt.Agent=4]="Agent",e.RoomEvent=void 0,(Xt=e.RoomEvent||(e.RoomEvent={})).Connected="connected",Xt.Disconnected="disconnected",Xt.Reconnecting="reconnecting",Xt.Reconnected="reconnected",Xt.ConnectionStateChanged="connectionStateChanged",Xt.SignalReconnecting="signalReconnecting",Xt.MediaDevicesChanged="mediaDevicesChanged",Xt.MediaDevicesError="mediaDevicesError",Xt.ParticipantJoined="participantJoined",Xt.ParticipantLeft="participantLeft",Xt.ParticipantUpdated="participantUpdated",Xt.ParticipantMetadataChanged="participantMetadataChanged",Xt.ParticipantNameChanged="participantNameChanged",Xt.ParticipantAttributesChanged="participantAttributesChanged",Xt.TrackPublished="trackPublished",Xt.TrackUnpublished="trackUnpublished",Xt.DataTrackPublished="dataTrackPublished",Xt.DataTrackUnpublished="dataTrackUnpublished",Xt.TrackSubscribed="trackSubscribed",Xt.TrackSubscriptionFailed="trackSubscriptionFailed",Xt.TrackUnsubscribed="trackUnsubscribed",Xt.TrackMuted="trackMuted",Xt.TrackUnmuted="trackUnmuted",Xt.LocalTrackPublished="localTrackPublished",Xt.LocalTrackUnpublished="localTrackUnpublished",Xt.LocalAudioSilenceDetected="localAudioSilenceDetected",Xt.ActiveSpeakersChanged="activeSpeakersChanged",Xt.RoomUpdated="roomUpdated",Xt.DataReceived="dataReceived",Xt.ConnectionQualityChanged="connectionQualityChanged",Xt.AudioPlaybackStatusChanged="audioPlaybackStatusChanged",Xt.ChatMessage="chatMessage",Xt.MessageDeleted="messageDeleted",Xt.StateUpdated="stateUpdated",Xt.StateDeleted="stateDeleted",Xt.TokenRefreshed="tokenRefreshed",Xt.VideoPlaybackStatusChanged="videoPlaybackStatusChanged",Xt.TrackStreamStateChanged="trackStreamStateChanged",Xt.GroupCreated="groupCreated",Xt.GroupUpdated="groupUpdated",Xt.GroupDeleted="groupDeleted",Xt.GroupParticipantJoined="groupParticipantJoined",Xt.GroupParticipantLeft="groupParticipantLeft",e.ParticipantEvent=void 0,(Zt=e.ParticipantEvent||(e.ParticipantEvent={})).TrackPublished="trackPublished",Zt.TrackUnpublished="trackUnpublished",Zt.TrackMuted="trackMuted",Zt.TrackUnmuted="trackUnmuted",Zt.TrackSubscribed="trackSubscribed",Zt.TrackUnsubscribed="trackUnsubscribed",Zt.LocalTrackPublished="localTrackPublished",Zt.LocalTrackUnpublished="localTrackUnpublished",Zt.MetadataChanged="metadataChanged",Zt.NameChanged="nameChanged",Zt.AttributesChanged="attributesChanged",Zt.IsSpeakingChanged="isSpeakingChanged",Zt.ConnectionQualityChanged="connectionQualityChanged",Zt.PermissionsChanged="permissionsChanged",Zt.TrackStreamStateChanged="trackStreamStateChanged",Zt.DataReceived="dataReceived",Zt.ChatMessage="chatMessage",e.TrackEvent=void 0,(ei=e.TrackEvent||(e.TrackEvent={})).Muted="muted",ei.Unmuted="unmuted",ei.Ended="ended",ei.Restarted="restarted",ei.Subscribed="subscribed",ei.Unsubscribed="unsubscribed",ei.ElementAttached="elementAttached",ei.ElementDetached="elementDetached",ei.AudioPlaybackStarted="audioPlaybackStarted",ei.AudioPlaybackFailed="audioPlaybackFailed",ei.VideoPlaybackStarted="videoPlaybackStarted",ei.VideoPlaybackFailed="videoPlaybackFailed",ei.VisibilityChanged="visibilityChanged",ei.VideoDimensionsChanged="videoDimensionsChanged",ei.UpstreamPaused="upstreamPaused",ei.UpstreamResumed="upstreamResumed",ei.AudioSilenceDetected="audioSilenceDetected",ei.StreamStateChanged="streamStateChanged",ei.TimeSyncUpdate="timeSyncUpdate",e.SubscriptionStatus=void 0,(ti=e.SubscriptionStatus||(e.SubscriptionStatus={})).Desired="desired",ti.Subscribed="subscribed",ti.Unsubscribed="unsubscribed";class ii{constructor(e){this.trackSid=e.trackSid,this.trackName=e.trackName,this.kind=e.kind,this.source=e.source,this.track=e.track,this.muted=e.muted,this.info=e.info,e.info&&e.info.width&&e.info.height&&(this.dimensions={width:e.info.width,height:e.info.height})}get isSubscribed(){return void 0!==this.track}get isEnabled(){return!this.muted}get isMuted(){return this.muted}get audioTrack(){if(this.kind===e.TrackKind.Audio)return this.track}get videoTrack(){if(this.kind===e.TrackKind.Video)return this.track}get isLocal(){return!1}}class ri extends n{emitParticipantEvent(e,...t){a.EventEmitter.prototype.emit.call(this,e,...t)}constructor(t,i,r,s){super(),this.isSpeaking=!1,this.audioLevel=0,this.attributes={},this.trackPublications=new Map,this.audioTrackPublications=new Map,this.videoTrackPublications=new Map,this._connectionQuality=e.ConnectionQuality.Unknown,this._kind=e.ParticipantKind.Standard,this._activeResolvers=[],this.sid=t,this.identity=i,this.name=r,this.metadata=s,this.state=e.ParticipantState.Joining}get kind(){return this._kind}get isAgent(){return this._kind===e.ParticipantKind.Agent}get isActive(){return this.state===e.ParticipantState.Joined}waitUntilActive(){return this.isActive?Promise.resolve():new Promise(e=>{this._activeResolvers.push(e)})}get connectionQuality(){return this._connectionQuality}setConnectionQuality(t){this._connectionQuality!==t&&(this._connectionQuality=t,this.emitParticipantEvent(e.ParticipantEvent.ConnectionQualityChanged,t))}setPermissions(t){const i=this.permissions,r=t.canPublish!==this.permissions?.canPublish||t.canSubscribe!==this.permissions?.canSubscribe||t.canPublishData!==this.permissions?.canPublishData||t.hidden!==this.permissions?.hidden||t.recorder!==this.permissions?.recorder||(t.canPublishSources?.length??0)!==(this.permissions?.canPublishSources?.length??0)||(t.canPublishSources??[]).some((e,t)=>e!==this.permissions?.canPublishSources?.[t]);return this.permissions=t,r&&this.emitParticipantEvent(e.ParticipantEvent.PermissionsChanged,i),r}get isCameraEnabled(){return this.isTrackEnabled("camera")}get isMicrophoneEnabled(){return this.isTrackEnabled("microphone")}get isScreenShareEnabled(){return this.isTrackEnabled("screen_share")}getTrackPublications(){return Array.from(this.trackPublications.values())}updateFromInfo(t){this.sid=t.sid,this.identity=t.identity;const i=this.isActive;if(this.state=t.state,void 0!==t.kind&&(this._kind=t.kind),void 0===t.joinedAt||this.joinedAt||(this.joinedAt=new Date(t.joinedAt)),void 0!==t.name&&t.name!==this.name&&(this.name=t.name,this.emitParticipantEvent(e.ParticipantEvent.NameChanged,this.name,this)),void 0!==t.metadata&&t.metadata!==this.metadata&&(this.metadata=t.metadata,this.emitParticipantEvent(e.ParticipantEvent.MetadataChanged,this.metadata,this)),t.permission&&this.setPermissions(t.permission),void 0!==t.groupId&&(this.groupId=t.groupId||void 0),t.attributes){const i={};for(const[e,r]of Object.entries(t.attributes))this.attributes[e]!==r&&(i[e]=r);this.attributes={...t.attributes},Object.keys(i).length>0&&this.emitParticipantEvent(e.ParticipantEvent.AttributesChanged,i,this)}if(!i&&this.isActive){for(const e of this._activeResolvers)e();this._activeResolvers=[]}}getTrackPublication(e){for(const t of this.trackPublications.values())if(t.source===e)return t}getTrackPublicationBySid(e){return this.trackPublications.get(e)}getTrackPublicationByName(e){for(const t of this.trackPublications.values())if(t.trackName===e)return t}addTrackPublicationToMaps(t){this.trackPublications.set(t.trackSid,t),t.kind===e.TrackKind.Audio?this.audioTrackPublications.set(t.trackSid,t):t.kind===e.TrackKind.Video&&this.videoTrackPublications.set(t.trackSid,t)}removeTrackPublicationFromMaps(e){const t=this.trackPublications.get(e);if(t)return this.trackPublications.delete(e),this.audioTrackPublications.delete(e),this.videoTrackPublications.delete(e),t}isTrackEnabled(e){const t=this.getTrackPublication(e);return!0===t?.isSubscribed&&t.isEnabled}}class si extends ii{constructor(e){super(e),this.producer=e.producer,this.options=e.options}get isLocal(){return!0}get isMuted(){const e=this.track;return e?e.isMuted:super.isMuted}get isUpstreamPaused(){return this.track?.isUpstreamPaused??!1}mute(){const e=this.track;e?.mute()}unmute(){const e=this.track;e?.unmute()}async pauseUpstream(){await(this.track?.pauseUpstream())}async resumeUpstream(){await(this.track?.resumeUpstream())}getTrackFeatures(){if(this.kind!==e.TrackKind.Audio||!this.track)return[];const t=this.track.mediaStreamTrack.getSettings(),i=new Set;return t.autoGainControl&&i.add(e.AudioTrackFeature.AutoGainControl),t.echoCancellation&&i.add(e.AudioTrackFeature.EchoCancellation),t.noiseSuppression&&i.add(e.AudioTrackFeature.NoiseSuppression),t.channelCount&&t.channelCount>1&&i.add(e.AudioTrackFeature.Stereo),this.options&&!this.options.dtx&&i.add(e.AudioTrackFeature.NoDtx),Array.from(i)}}const ai=new Error("request for lock canceled");var ni=function(e,t,i,r){return new(i||(i=Promise))(function(s,a){function n(e){try{c(r.next(e))}catch(e){a(e)}}function o(e){try{c(r.throw(e))}catch(e){a(e)}}function c(e){var t;e.done?s(e.value):(t=e.value,t instanceof i?t:new i(function(e){e(t)})).then(n,o)}c((r=r.apply(e,t||[])).next())})};class oi{constructor(e,t=ai){this._value=e,this._cancelError=t,this._queue=[],this._weightedWaiters=[]}acquire(e=1,t=0){if(e<=0)throw new Error(`invalid weight ${e}: must be positive`);return new Promise((i,r)=>{const s={resolve:i,reject:r,weight:e,priority:t},a=ci(this._queue,e=>t<=e.priority);-1===a&&e<=this._value?this._dispatchItem(s):this._queue.splice(a+1,0,s)})}runExclusive(e){return ni(this,arguments,void 0,function*(e,t=1,i=0){const[r,s]=yield this.acquire(t,i);try{return yield e(r)}finally{s()}})}waitForUnlock(e=1,t=0){if(e<=0)throw new Error(`invalid weight ${e}: must be positive`);return this._couldLockImmediately(e,t)?Promise.resolve():new Promise(i=>{this._weightedWaiters[e-1]||(this._weightedWaiters[e-1]=[]),function(e,t){const i=ci(e,e=>t.priority<=e.priority);e.splice(i+1,0,t)}(this._weightedWaiters[e-1],{resolve:i,priority:t})})}isLocked(){return this._value<=0}getValue(){return this._value}setValue(e){this._value=e,this._dispatchQueue()}release(e=1){if(e<=0)throw new Error(`invalid weight ${e}: must be positive`);this._value+=e,this._dispatchQueue()}cancel(){this._queue.forEach(e=>e.reject(this._cancelError)),this._queue=[]}_dispatchQueue(){for(this._drainUnlockWaiters();this._queue.length>0&&this._queue[0].weight<=this._value;)this._dispatchItem(this._queue.shift()),this._drainUnlockWaiters()}_dispatchItem(e){const t=this._value;this._value-=e.weight,e.resolve([t,this._newReleaser(e.weight)])}_newReleaser(e){let t=!1;return()=>{t||(t=!0,this.release(e))}}_drainUnlockWaiters(){if(0===this._queue.length)for(let e=this._value;e>0;e--){const t=this._weightedWaiters[e-1];t&&(t.forEach(e=>e.resolve()),this._weightedWaiters[e-1]=[])}else{const e=this._queue[0].priority;for(let t=this._value;t>0;t--){const i=this._weightedWaiters[t-1];if(!i)continue;const r=i.findIndex(t=>t.priority<=e);(-1===r?i:i.splice(0,r)).forEach(e=>e.resolve())}}}_couldLockImmediately(e,t){return(0===this._queue.length||this._queue[0].priority<t)&&e<=this._value}}function ci(e,t){for(let i=e.length-1;i>=0;i--)if(t(e[i]))return i;return-1}var di=function(e,t,i,r){return new(i||(i=Promise))(function(s,a){function n(e){try{c(r.next(e))}catch(e){a(e)}}function o(e){try{c(r.throw(e))}catch(e){a(e)}}function c(e){var t;e.done?s(e.value):(t=e.value,t instanceof i?t:new i(function(e){e(t)})).then(n,o)}c((r=r.apply(e,t||[])).next())})};class pi{constructor(e){this._semaphore=new oi(1,e)}acquire(){return di(this,arguments,void 0,function*(e=0){const[,t]=yield this._semaphore.acquire(1,e);return t})}runExclusive(e,t=0){return this._semaphore.runExclusive(()=>e(),1,t)}isLocked(){return this._semaphore.isLocked()}waitForUnlock(e=0){return this._semaphore.waitForUnlock(1,e)}release(){this._semaphore.isLocked()&&this._semaphore.release()}cancel(){return this._semaphore.cancel()}}const li=[];class hi extends n{get mediaStreamTrack(){return this._mediaStreamTrack}constructor(t,i=e.TrackSource.Unknown,r){super(),this._isMuted=!1,this._streamState=e.StreamState.Active,this.attachedElements=[],this._currentBitrate=0,this.kind=t,this.source=i,this._mediaStreamTrack=r,r.addEventListener("ended",()=>{this.emit(e.TrackEvent.Ended,this)})}get currentBitrate(){return this._currentBitrate}get isMuted(){return this._isMuted}get streamState(){return this._streamState}setStreamState(t){this._streamState!==t&&(this._streamState=t,this.emit(e.TrackEvent.StreamStateChanged,this,t))}stopMonitor(){this.monitorInterval&&(clearInterval(this.monitorInterval),this.monitorInterval=void 0)}attach(t){if(!t){if(this.kind===e.TrackKind.Audio){const e=li.find(e=>null===e.parentElement);e&&(li.splice(li.indexOf(e),1),t=e)}t||(t=document.createElement(this.kind===e.TrackKind.Audio?"audio":"video")),t.autoplay=!0,this.kind===e.TrackKind.Video&&(t.playsInline=!0)}this.attachedElements.includes(t)||this.attachedElements.push(t);const i=new MediaStream([this.mediaStreamTrack]);t.muted=0===i.getAudioTracks().length,t.srcObject=i,this.emit(e.TrackEvent.ElementAttached,t);const r=i.getAudioTracks().length>0;return t.play().then(()=>{this.emit(r?e.TrackEvent.AudioPlaybackStarted:e.TrackEvent.VideoPlaybackStarted)}).catch(s=>{"NotAllowedError"===s.name&&this.emit(r?e.TrackEvent.AudioPlaybackFailed:e.TrackEvent.VideoPlaybackFailed,s),r&&t&&i.getVideoTracks().length>0&&"NotAllowedError"===s.name&&(t.muted=!0,t.play().catch(()=>{}))}),t}detach(e){if(e)return this.detachElement(e),[e];const t=[...this.attachedElements];for(const e of t)this.detachElement(e);return t}detachElement(t){t.srcObject=null;const i=this.attachedElements.indexOf(t);i>=0&&this.attachedElements.splice(i,1),this.recycleElement(t),this.emit(e.TrackEvent.ElementDetached,t)}recycleElement(e){e instanceof HTMLAudioElement&&(e.pause(),(0===li.length||li.every(e=>null!==e.parentElement))&&li.push(e))}stop(){this.stopMonitor(),this.detach()}}function ui(){return"undefined"!=typeof document}function mi(){return!!ui()&&(navigator.userAgentData?.mobile??/Tablet|iPad|Mobile|Android|BlackBerry/.test(navigator.userAgent))}function fi(){return"undefined"!=typeof navigator&&navigator.userAgent.includes("Firefox/")}function gi(){return"Safari"===Si()?.name}function vi(){const e=Si();return"Safari"===e?.name||"iOS"===e?.os}function bi(){return!gi()&&!fi()&&ki("video/AV1")}function _i(){if(fi())return!1;const e=Si();if("iOS"===e.os){if(!e.osVersion||yi(e.osVersion,"16")<0)return!1}else if("Safari"===e.name&&(!e.version||yi(e.version,"16")<0))return!1;return ki("video/VP9")}function yi(e,t){const i=e.split(".").map(Number),r=t.split(".").map(Number),s=Math.max(i.length,r.length);for(let e=0;e<s;e++){const t=i[e]??0,s=r[e]??0;if(t!==s)return t-s}return 0}function Si(){if("undefined"==typeof navigator)return{name:"unknown",version:"",supportsInsertableStreams:!1,supportsTransceiver:!1};const e=navigator.userAgent;let t,i,r="unknown",s="";if(/iPad|iPhone|iPod/.test(e)||e.includes("Macintosh")&&"ontouchend"in document){t="iOS";const r=e.match(/OS (\d+[_.\d]*)/);r&&(i=r[1].replace(/_/g,"."))}else if(e.includes("Android")){t="Android";const r=e.match(/Android ([\d.]+)/);r&&(i=r[1])}else if(e.includes("Mac OS X")){t="macOS";const r=e.match(/Mac OS X ([\d_]+)/);r&&(i=r[1].replace(/_/g,"."))}else e.includes("Windows")?t="Windows":e.includes("Linux")&&(t="Linux");if(/firefox|fxios/i.test(e)){r="Firefox";const t=e.match(/(?:Firefox|FxiOS)\/([\d.]+)/);s=t?.[1]??""}else if(/chrom|crios|crmo/i.test(e)){r="Chrome";const t=e.match(/(?:Chrome|CriOS|Chromium)\/([\d.]+)/);s=t?.[1]??""}else if(/safari|applewebkit/i.test(e)){r="Safari";const t=e.match(/Version\/([\d.]+)/);s=t?.[1]??""}return{name:r,version:s,os:t,osVersion:i,supportsInsertableStreams:"function"==typeof RTCRtpSender.prototype.createEncodedStreams||void 0!==window.RTCRtpScriptTransform,supportsTransceiver:"function"==typeof RTCPeerConnection.prototype.addTransceiver}}function wi(e){const t=e.toLowerCase();return t.includes("front")||t.includes("user")||t.includes("facetime")?"user":t.includes("back")||t.includes("rear")||t.includes("environment")?"environment":void 0}function ki(e){if("undefined"==typeof RTCRtpSender)return!1;if("function"!=typeof RTCRtpSender.getCapabilities)return!1;const t=RTCRtpSender.getCapabilities("video");return!!t&&t.codecs.some(t=>t.mimeType.toLowerCase()===e.toLowerCase())}const Ti=p("LocalTrack");class Ci extends hi{constructor(t,i,r,s,a=!1){super(t,r??e.TrackSource.Unknown,i),this._isUpstreamPaused=!1,this._providedByUser=!1,this._prevBytesSent=0,this._prevStatsTime=0,this._handleVisibilityChange=this.onVisibilityChange.bind(this),this.trackChangeLock=new pi,this.pauseUpstreamLock=new pi,this.onMediaTrackMute=()=>{this._mediaTrackMuteDebounce&&clearTimeout(this._mediaTrackMuteDebounce),this._mediaTrackMuteDebounce=setTimeout(()=>{this.mediaStreamTrack.muted&&(Ti.debug(`MediaStreamTrack muted by system for ${this.sid??"unknown"}`),this.pauseUpstream().catch(()=>{}))},200)},this.onMediaTrackUnmute=()=>{this._mediaTrackMuteDebounce&&(clearTimeout(this._mediaTrackMuteDebounce),this._mediaTrackMuteDebounce=void 0),this._isUpstreamPaused&&(Ti.debug(`MediaStreamTrack unmuted by system for ${this.sid??"unknown"}`),this.resumeUpstream().catch(()=>{}))},this._constraints=s,this._providedByUser=a,this.attachMediaTrackListeners(i)}get mediaStreamTrack(){return this._processor?.processedTrack??this._mediaStreamTrack}get isLocal(){return!0}get id(){return this._mediaStreamTrack.id}get constraints(){return this._constraints}get dimensions(){if(this.kind!==e.TrackKind.Video)return;const{width:t,height:i}=this.mediaStreamTrack.getSettings();return t&&i?{width:t,height:i}:void 0}get isUpstreamPaused(){return this._isUpstreamPaused}get isUserProvided(){return this._providedByUser}get producer(){return this._producer}set producer(e){this._producer=e}getProcessor(){return this._processor}getSourceTrackSettings(){return this._mediaStreamTrack.getSettings()}async setProcessor(e,t=!0){const i=await this.trackChangeLock.acquire();try{if(this._processor&&(await this._processor.destroy(),this._processor=void 0),!e)return this.destroyProcessorElement(),this._producer&&await this._producer.replaceTrack({track:this._mediaStreamTrack}),void this.reattachElementsToTrack(this._mediaStreamTrack);this.ensureProcessorElement();const i={kind:this.kind,track:this._mediaStreamTrack,element:this.processorElement};await e.init(i),this._processor=e;const r=e.processedTrack??this._mediaStreamTrack;t&&this.reattachElementsToTrack(r),this._producer&&await this._producer.replaceTrack({track:r})}finally{i()}}async stopProcessor(){const e=await this.trackChangeLock.acquire();try{if(!this._processor)return;this._processor.processedTrack?.stop(),await this._processor.destroy(),this._processor=void 0,this.destroyProcessorElement(),this._producer&&await this._producer.replaceTrack({track:this._mediaStreamTrack}),this.reattachElementsToTrack(this._mediaStreamTrack)}finally{e()}}mute(){this.setTrackMuted(!0)}unmute(){this.setTrackMuted(!1)}async pauseUpstream(){const t=await this.pauseUpstreamLock.acquire();try{if(this._isUpstreamPaused)return;if(!this._producer)return void Ti.warn("Cannot pause upstream for an unpublished track");this._isUpstreamPaused=!0,await this._producer.replaceTrack({track:null}),this.emit(e.TrackEvent.UpstreamPaused,this)}finally{t()}}async resumeUpstream(){const t=await this.pauseUpstreamLock.acquire();try{if(!this._isUpstreamPaused)return;if(!this._producer)return void Ti.warn("Cannot resume upstream for an unpublished track");this._isUpstreamPaused=!1;const t=this._processor?.processedTrack??this.mediaStreamTrack;await this._producer.replaceTrack({track:t}),this.emit(e.TrackEvent.UpstreamResumed,this)}finally{t()}}async getRTCStatsReport(){if(this._producer)return this._producer.getStats()}async getDeviceId(){if(this.source!==e.TrackSource.ScreenShare)return this.mediaStreamTrack.getSettings().deviceId}async waitForDimensions(t=1e3){if(this.kind===e.TrackKind.Audio)throw new Error("Cannot get dimensions for audio tracks");"iOS"===Si()?.os&&await new Promise(e=>setTimeout(e,10));const i=Date.now();for(;Date.now()-i<t;){const e=this.dimensions;if(e)return e;await new Promise(e=>setTimeout(e,50))}throw new Error("Unable to get track dimensions after timeout")}startMonitor(){this.monitorInterval||(this._prevBytesSent=0,this._prevStatsTime=0,this.monitorInterval=setInterval(()=>this.monitorSender(),2e3))}async restart(t){const i=await this.trackChangeLock.acquire();try{t&&(this._constraints=t);const i=this.kind===e.TrackKind.Audio?"audio":"video";"audio"===i&&vi()&&this._mediaStreamTrack?.stop();const r=await navigator.mediaDevices.getUserMedia({[i]:this._constraints??!0}),s="audio"===i?r.getAudioTracks()[0]:r.getVideoTracks()[0];if(!s)throw new Error("Failed to get new media track");await this.replaceTrackInternal(s),Ti.info(`Track ${this.sid??"unknown"} restarted`),this.emit(e.TrackEvent.Restarted,this)}finally{i()}}async replaceTrack(e){const t=await this.trackChangeLock.acquire();try{await this.replaceTrackInternal(e)}finally{t()}}async replaceTrackInternal(e){this.detachMediaTrackListeners(this._mediaStreamTrack);const t=this._mediaStreamTrack;this._mediaStreamTrack=e,this.attachMediaTrackListeners(e),this.processorElement&&this.attachTrackToProcessorElement(e);let i=e;this._processor&&(await this._processor.restart({kind:this.kind,track:e,element:this.processorElement}),this._processor.processedTrack&&(i=this._processor.processedTrack)),this._producer&&await this._producer.replaceTrack({track:i});const r=this._processor?.processedTrack??e;this.reattachElementsToTrack(r),this._providedByUser||t?.stop()}stop(){this.detachMediaTrackListeners(this._mediaStreamTrack),this.removeVisibilityListener(),this._mediaTrackMuteDebounce&&(clearTimeout(this._mediaTrackMuteDebounce),this._mediaTrackMuteDebounce=void 0),this._processor&&(this._processor.destroy().catch(()=>{}),this._processor=void 0),this.destroyProcessorElement(),this._mediaStreamTrack?.stop(),super.stop(),Ti.debug(`Track ${this.sid??"unknown"} stopped`)}setTrackMuted(t){this._isMuted!==t&&(this._isMuted=t,this._mediaStreamTrack.enabled=!t,this._producer&&(t?this._producer.pause():this._producer.resume()),this.emit(t?e.TrackEvent.Muted:e.TrackEvent.Unmuted,this))}async monitorSender(){if(this._producer)try{const e=await this._producer.getStats();let t=0;e.forEach(e=>{"outbound-rtp"===e.type&&(t+=e.bytesSent??0)});const i=Date.now();if(this._prevStatsTime>0&&t>this._prevBytesSent){const e=(i-this._prevStatsTime)/1e3;this._currentBitrate=8*(t-this._prevBytesSent)/e}this._prevBytesSent=t,this._prevStatsTime=i}catch{}}attachMediaTrackListeners(e){e.addEventListener("mute",this.onMediaTrackMute),e.addEventListener("unmute",this.onMediaTrackUnmute)}detachMediaTrackListeners(e){e.removeEventListener("mute",this.onMediaTrackMute),e.removeEventListener("unmute",this.onMediaTrackUnmute)}addVisibilityListener(){ui()&&mi()&&document.addEventListener("visibilitychange",this._handleVisibilityChange)}removeVisibilityListener(){ui()&&document.removeEventListener("visibilitychange",this._handleVisibilityChange)}async onVisibilityChange(){if("visible"===document.visibilityState&&"ended"===this._mediaStreamTrack.readyState&&!this._providedByUser){Ti.info(`Track ${this.sid??"unknown"} ended while in background, restarting`);try{await this.restart()}catch(e){Ti.warn("Failed to restart track after visibility change",e)}}}ensureProcessorElement(){if(this.processorElement)return void this.attachTrackToProcessorElement(this._mediaStreamTrack);const t=document.createElement(this.kind===e.TrackKind.Audio?"audio":"video");t.muted=!0,t.autoplay=!0,t instanceof HTMLVideoElement&&(t.playsInline=!0),t.style.width="0",t.style.height="0",t.style.position="absolute",t.style.opacity="0",this.attachTrackToProcessorElement(this._mediaStreamTrack,t),t.play().catch(()=>{}),this.processorElement=t}attachTrackToProcessorElement(e,t){const i=t??this.processorElement;i&&(i.srcObject=new MediaStream([e]))}destroyProcessorElement(){this.processorElement&&(this.processorElement.srcObject=null,this.processorElement.remove(),this.processorElement=void 0)}reattachElementsToTrack(e){for(const t of this.attachedElements)t.srcObject=new MediaStream([e])}}const Pi=p("LocalAudioTrack");class Ri extends Ci{constructor(t,i){super(e.TrackKind.Audio,t,e.TrackSource.Microphone,i),this.stopOnMute=!1,this.muteLock=new pi}async mute(){const e=await this.muteLock.acquire();try{if(this.isMuted)return;this.stopOnMute&&!this.isUserProvided&&this._mediaStreamTrack.stop(),super.mute()}finally{e()}}async unmute(){const e=await this.muteLock.acquire();try{if(!this.isMuted)return;this.pendingRestartConstraints?(Pi.debug("applying pending device change on unmute"),await this.restart(this.pendingRestartConstraints),this.pendingRestartConstraints=void 0):!this.stopOnMute&&"ended"!==this._mediaStreamTrack.readyState||this.isUserProvided||await this.restart(),super.unmute()}finally{e()}}async setDeviceId(e,t=!0){const i=t?{exact:e}:e,r={...this.constraints??{},deviceId:i};if(this.isMuted)return Pi.debug("track is muted, deferring device change to unmute"),void(this.pendingRestartConstraints=r);await this.restart(r)}}class Ei{constructor(e,t,i,r,s){if("object"==typeof e)this.width=e.width,this.height=e.height,this.aspectRatio=e.aspectRatio,this.encoding={maxBitrate:e.maxBitrate,maxFramerate:e.maxFramerate,priority:e.priority};else{if(void 0===t||void 0===i)throw new TypeError("Unsupported options: provide at least width, height and maxBitrate");this.width=e,this.height=t,this.aspectRatio=e/t,this.encoding={maxBitrate:i,maxFramerate:r,priority:s}}}get resolution(){return{width:this.width,height:this.height,frameRate:this.encoding.maxFramerate,aspectRatio:this.aspectRatio}}}const Di=["vp8","h264"];function xi(e){return Di.includes(e)}var Ii;e.BackupCodecPolicy=void 0,(Ii=e.BackupCodecPolicy||(e.BackupCodecPolicy={}))[Ii.PREFER_REGRESSION=0]="PREFER_REGRESSION",Ii[Ii.SIMULCAST=1]="SIMULCAST",Ii[Ii.REGRESSION=2]="REGRESSION";const Mi={resolution:{width:1280,height:720},frameRate:30},Li={echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0},Oi={maxBitrate:17e5,maxFramerate:30},Ai={h90:new Ei(160,90,9e4,20),h180:new Ei(320,180,16e4,20),h216:new Ei(384,216,18e4,20),h360:new Ei(640,360,45e4,20),h540:new Ei(960,540,8e5,25),h720:new Ei(1280,720,17e5,30),h1080:new Ei(1920,1080,3e6,30),h1440:new Ei(2560,1440,5e6,30),h2160:new Ei(3840,2160,8e6,30)},ji={h120:new Ei(160,120,7e4,20),h180:new Ei(240,180,125e3,20),h240:new Ei(320,240,14e4,20),h360:new Ei(480,360,33e4,20),h480:new Ei(640,480,5e5,20),h540:new Ei(720,540,6e5,25),h720:new Ei(960,720,13e5,30),h1080:new Ei(1440,1080,23e5,30),h1440:new Ei(1920,1440,38e5,30)},Fi={h360fps3:new Ei(640,360,2e5,3,"medium"),h360fps15:new Ei(640,360,4e5,15,"medium"),h720fps5:new Ei(1280,720,8e5,5,"medium"),h720fps15:new Ei(1280,720,15e5,15,"medium"),h720fps30:new Ei(1280,720,2e6,30,"medium"),h1080fps15:new Ei(1920,1080,25e5,15,"medium"),h1080fps30:new Ei(1920,1080,5e6,30,"medium"),original:new Ei(0,0,7e6,30,"medium")},Ni={h180:Ai.h180.encoding,h360:Ai.h360.encoding,h720:Ai.h720.encoding,h1080:Ai.h1080.encoding},$i=p("LocalVideoTrack"),Ui={[e.VideoQuality.LOW]:"q",[e.VideoQuality.MEDIUM]:"h",[e.VideoQuality.HIGH]:"f"};class Bi extends Ci{constructor(t,i=e.TrackSource.Camera,r){super(e.TrackKind.Video,t,i,r),this.simulcast=!1,this.senderLock=new pi}get dimensions(){const e=this.mediaStreamTrack?.getSettings();if(e?.width&&e?.height)return{width:e.width,height:e.height}}setSimulcast(e){this.simulcast=e}setEncoding(e){this.encoding=e}getSimulcastEncodings(){if(!this.simulcast){const e=this.encoding??Oi;return[{maxBitrate:e.maxBitrate,maxFramerate:e.maxFramerate}]}return[{rid:"q",maxBitrate:Ni.h180.maxBitrate,maxFramerate:Ni.h180.maxFramerate,scaleResolutionDownBy:4},{rid:"h",maxBitrate:Ni.h360.maxBitrate,maxFramerate:Ni.h360.maxFramerate,scaleResolutionDownBy:2},{rid:"f",maxBitrate:(this.encoding??Ni.h720).maxBitrate,maxFramerate:(this.encoding??Ni.h720).maxFramerate}]}async setDynacastQuality(e){const t=await this.senderLock.acquire();try{const t=this.producer?.rtpSender;if(!t)return;const i=t.getParameters();if(!i.encodings||0===i.encodings.length)return;let r=!1;if(i.encodings.length>1){const t=this.getSimulcastEncodings();for(const s of e){const e=Ui[s.quality],a=i.encodings.find(t=>t.rid===e);if(a&&((a.active??!0)!==s.enabled&&(a.active=s.enabled,r=!0),fi()))if(s.enabled){const i=t.find(t=>t.rid===e);i&&(a.scaleResolutionDownBy=i.scaleResolutionDownBy,a.maxBitrate=i.maxBitrate,a.maxFramerate=i.maxFramerate)}else a.scaleResolutionDownBy=4,a.maxBitrate=10,a.maxFramerate=2}}else{const t=e.some(e=>e.enabled);(i.encodings[0].active??!0)!==t&&(i.encodings[0].active=t,r=!0)}if(r){await t.setParameters(i);const r=e.map(e=>`${e.quality}=${e.enabled}`).join(",");$i.info(`Dynacast quality updated for ${this.sid??"unknown"}: [${r}]`)}}finally{t()}}async setDegradationPreference(e){const t=await this.senderLock.acquire();try{const t=this.producer?.rtpSender;if(!t)return;const i=t.getParameters();i.degradationPreference!==e&&(i.degradationPreference=e,await t.setParameters(i))}finally{t()}}async setDeviceId(e,t=!0){const i=t?{exact:e}:e;await this.restart({...this.constraints??{},deviceId:i})}}const zi=p("create");function Vi(e){return!0===e&&(e=Li),{echoCancellation:e.echoCancellation,noiseSuppression:e.noiseSuppression,autoGainControl:e.autoGainControl,deviceId:e.deviceId,channelCount:e.channelCount,sampleRate:e.sampleRate,sampleSize:e.sampleSize}}function Hi(e){return!0===e&&(e=Mi),{width:e.resolution?.width,height:e.resolution?.height,frameRate:e.frameRate,facingMode:e.facingMode,deviceId:e.deviceId}}async function qi(t={audio:!0,video:!0}){const i={};t.audio&&(i.audio=Vi(t.audio)),t.video&&(i.video=Hi(t.video));const r=await navigator.mediaDevices.getUserMedia(i),s=[];for(const e of r.getAudioTracks())s.push(new Ri(e,i.audio));for(const t of r.getVideoTracks())s.push(new Bi(t,e.TrackSource.Camera,i.video));return s}async function Qi(e){const t=Vi(e??Li),i=(await navigator.mediaDevices.getUserMedia({audio:t})).getAudioTracks()[0];return new Ri(i,t)}async function Gi(t){const i=Hi(t??Mi),r=(await navigator.mediaDevices.getUserMedia({video:i})).getVideoTracks()[0];return new Bi(r,e.TrackSource.Camera,i)}async function Ki(t){const i=function(){const e=Si();return!!("iOS"===e.os&&e.osVersion&&yi(e.osVersion,"17")>=0)||!!("Safari"===e.name&&e.version&&yi(e.version,"17")>=0)}(),r={};t?.video&&"object"==typeof t.video&&Object.assign(r,t.video),i?t?.resolution&&zi.debug("skipping resolution constraints for Safari 17+ screen share"):(t?.resolution?.width&&(r.width=t.resolution.width),t?.resolution?.height&&(r.height=t.resolution.height)),t?.frameRate&&(r.frameRate=t.frameRate);const s={video:!0!==t?.video&&t?.video?r:!(Object.keys(r).length>0)||r,audio:!!t?.audio&&("boolean"==typeof t.audio||Vi(t.audio))};t?.selfBrowserSurface&&(s.selfBrowserSurface=t.selfBrowserSurface),t?.surfaceSwitching&&(s.surfaceSwitching=t.surfaceSwitching),t?.systemAudio&&(s.systemAudio=t.systemAudio),void 0!==t?.preferCurrentTab&&(s.preferCurrentTab=t.preferCurrentTab),t?.controller&&(s.controller=t.controller),void 0!==t?.suppressLocalAudioPlayback&&(s.suppressLocalAudioPlayback=t.suppressLocalAudioPlayback);const a=await navigator.mediaDevices.getDisplayMedia(s),n=[];for(const i of a.getVideoTracks())t?.contentHint&&"contentHint"in i&&(i.contentHint=t.contentHint),n.push(new Bi(i,e.TrackSource.ScreenShare));for(const t of a.getAudioTracks()){const i=new Ri(t);i.source=e.TrackSource.ScreenShareAudio,n.push(i)}return n}const Wi=p("publishUtils"),Ji=["q","h","f"],Yi=Object.values(Ai),Xi=Object.values(ji),Zi=Object.values(Fi),er=[Ai.h180,Ai.h360],tr=[ji.h180,ji.h360];function ir(e){return"av1"===e||"vp9"===e}function rr(e,t,i,r){const s=function(e,t,i){if(e)return Zi;const r=t>i?t/i:i/t;return Math.abs(r-16/9)<Math.abs(r-4/3)?Yi:Xi}(e,t,i);let{encoding:a}=s[0];const n=Math.max(t,i);for(let e=0;e<s.length;e+=1){const t=s[e];if(a=t.encoding,t.width>=n)break}if(r)switch(r){case"av1":case"h265":a={...a},a.maxBitrate=.7*a.maxBitrate;break;case"vp9":a={...a},a.maxBitrate=.85*a.maxBitrate}return a}function sr(e,t){if(e)return[{scaleResolutionDownBy:2,fps:(i=t).encoding.maxFramerate}].map(e=>new Ei(Math.floor(i.width/e.scaleResolutionDownBy),Math.floor(i.height/e.scaleResolutionDownBy),Math.max(15e4,Math.floor(i.encoding.maxBitrate/(e.scaleResolutionDownBy**2*((i.encoding.maxFramerate??30)/(e.fps??30))))),e.fps,i.encoding.priority));var i;const{width:r,height:s}=t,a=r>s?r/s:s/r;return Math.abs(a-16/9)<Math.abs(a-4/3)?er:tr}function ar(e,t){const i=Math.min(t.width,t.height);return i<=0?1:Math.max(1,Math.ceil(e/i))}function nr(e){if(e)return e.sort((e,t)=>{const{encoding:i}=e,{encoding:r}=t;return i.maxBitrate>r.maxBitrate?1:i.maxBitrate<r.maxBitrate?-1:i.maxBitrate===r.maxBitrate&&i.maxFramerate&&r.maxFramerate?i.maxFramerate>r.maxFramerate?1:-1:0})}function or(e,t,i,r){const s=[];return i.forEach((i,a)=>{if(a>=Ji.length)return;const n=Math.min(e,t),o={rid:Ji[a],scaleResolutionDownBy:ar(n,i),maxBitrate:i.encoding.maxBitrate},c=r&&i.encoding.maxFramerate?Math.min(r,i.encoding.maxFramerate):i.encoding.maxFramerate;c&&(o.maxFramerate=c);const d=fi()||0===a;i.encoding.priority&&d&&(o.priority=i.encoding.priority,o.networkPriority=i.encoding.priority),s.push(o)}),s}function cr(e,t,i,r){let s=e?r?.screenShareEncoding:r?.videoEncoding;const a=r?.simulcast,n=r?.scalabilityMode,o=r?.videoCodec;if(!s&&!a&&!n||!t||!i)return[{}];s||(s=rr(e,t,i,o),Wi.debug("using video encoding",s));const c=s.maxFramerate,d=new Ei(t,i,s.maxBitrate,s.maxFramerate,s.priority);if(n&&ir(o)){const e=function(e){const t=e.match(/^L(\d)T(\d)(h|_KEY|_KEY_SHIFT)?$/);if(!t)throw new Error(`invalid scalability mode: ${e}`);return{spatial:parseInt(t[1]),temporal:parseInt(t[2]),suffix:t[3]}}(n),t=[];if(e.spatial>3)throw new Error(`unsupported scalabilityMode: ${n}`);const i=Si();if(vi()||"Chrome"===i.name&&yi(i.version,"113")<0){const r="h"===e.suffix?2:3,a=function(e){const t=e??Si();return!!("iOS"===t.os&&t.osVersion&&yi(t.osVersion,"18.4")>=0)||!!("Safari"===t.name&&t.version&&yi(t.version,"18.4")>=0)}(i);for(let i=0;i<e.spatial;i+=1)t.push({rid:Ji[2-i],maxBitrate:s.maxBitrate/r**i,maxFramerate:d.encoding.maxFramerate,scaleResolutionDownBy:a?2**i:void 0});t[0].scalabilityMode=n}else t.push({maxBitrate:s.maxBitrate,maxFramerate:d.encoding.maxFramerate,scalabilityMode:n});return d.encoding.priority&&(t[0].priority=d.encoding.priority,t[0].networkPriority=d.encoding.priority),Wi.debug("using svc encoding",{encodings:t}),t}if(!a)return[s];let p,l=[];if(l=e?nr(r?.screenShareSimulcastLayers)??sr(e,d):nr(r?.videoSimulcastLayers)??sr(e,d),l.length>0){const e=l[0];l.length>1&&([,p]=l);const r=Math.max(t,i);if(r>=960&&p)return or(t,i,[e,p,d],c);if(r>=480)return or(t,i,[e,d],c)}return or(t,i,[d])}function dr(t,i){if(t===e.TrackSource.ScreenShare)return"maintain-resolution";if(i?.height){const e="string"==typeof(r=i.height)||"number"==typeof r?r:Array.isArray(r)?r[0]:"object"==typeof r?r.exact??r.ideal??r.min??r.max??0:r;if("number"==typeof e&&e>=1080)return"maintain-resolution"}var r;return"balanced"}const pr=p("DataStream"),lr="__stream",hr=15e3;function ur(e,t,i){const r=(new TextEncoder).encode(t),s=new ArrayBuffer(3+r.byteLength+i.byteLength),a=new DataView(s),n=new Uint8Array(s);return a.setUint8(0,e),a.setUint16(1,r.byteLength,!1),n.set(r,3),n.set(i,3+r.byteLength),s}class mr{constructor(e,t){this.info=e,this.stream=t}[Symbol.asyncIterator](){const e=this.stream.getReader();return{async next(){const{done:t,value:i}=await e.read();return t?{done:!0,value:void 0}:{done:!1,value:i}},return:async()=>(e.releaseLock(),{done:!0,value:void 0})}}async readAll(){const e=[];for await(const t of this)e.push(t);return e.join("")}}class fr{constructor(e,t){this.info=e,this.stream=t}[Symbol.asyncIterator](){const e=this.stream.getReader();return{async next(){const{done:t,value:i}=await e.read();return t?{done:!0,value:void 0}:{done:!1,value:i}},return:async()=>(e.releaseLock(),{done:!0,value:void 0})}}async readAll(){const e=[];let t=0;for await(const i of this)e.push(i),t+=i.byteLength;const i=new Uint8Array(t);let r=0;for(const t of e)i.set(t,r),r+=t.byteLength;return i}}class gr{constructor(e,t,i){this.closed=!1,this.info=e,this.dataProducer=t,this.streamId=i}async write(e){if(this.closed)throw new Error("Stream is closed");const t=new TextEncoder,i=yr(e,hr);for(const e of i){const i=ur(2,this.streamId,t.encode(e));this.dataProducer.send(i)}}async close(){if(this.closed)return;this.closed=!0;const e=ur(3,this.streamId,new Uint8Array(0));this.dataProducer.send(e)}}class vr{constructor(e,t,i){this.closed=!1,this.info=e,this.dataProducer=t,this.streamId=i}async write(e){if(this.closed)throw new Error("Stream is closed");for(let t=0;t<e.byteLength;t+=hr){const i=Math.min(t+hr,e.byteLength),r=e.subarray(t,i),s=ur(2,this.streamId,r);this.dataProducer.send(s)}}async close(){if(this.closed)return;this.closed=!0;const e=ur(3,this.streamId,new Uint8Array(0));this.dataProducer.send(e)}}class br{constructor(e,t){this.rpc=e,this.transportManager=t}async ensureDataProducer(){if(this.dataProducer&&!this.dataProducer.closed)return this.dataProducer;if(this.dataProducerPromise)return this.dataProducerPromise;this.dataProducerPromise=this.createDataProducer();try{return this.dataProducer=await this.dataProducerPromise,this.dataProducer}finally{this.dataProducerPromise=void 0}}async createDataProducer(){const e=this.transportManager.sendTransport;if(!e)throw new Error("Send transport not available");const t=y(),i=new Promise((i,r)=>{this.transportManager.registerProduceDataCallback(t,async(s,a,n)=>{try{const r={clientTrackId:t,transportSid:e.id,sctpStreamParameters:s.sctpStreamParameters,name:lr,label:s.label??lr,protocol:s.protocol??""},n=await this.rpc.request("dataTrack.publish",r);a({id:n.dataTrackSid}),i(n.dataTrackSid)}catch(e){n(e instanceof Error?e:new Error(String(e))),r(e)}})}),r=await e.produceData({ordered:!0,label:lr,protocol:"",appData:{clientTrackId:t}});return await i,pr.info("Stream DataProducer created"),r}async sendText(e,t){const i=await this.ensureDataProducer(),r=crypto.randomUUID(),s=new TextEncoder,a=s.encode(e),n=JSON.stringify({topic:t?.topic??"",streamType:"text",mimeType:"text/plain",totalSize:a.byteLength,timestamp:Date.now(),attributes:t?.attributes,destinationIdentities:t?.destinationIdentities});i.send(ur(1,r,s.encode(n)));const o=yr(e,hr);for(let e=0;e<o.length;e++)i.send(ur(2,r,s.encode(o[e]))),t?.onProgress?.((e+1)/o.length);return i.send(ur(3,r,new Uint8Array(0))),{id:r}}async streamText(e){const t=await this.ensureDataProducer(),i=crypto.randomUUID(),r=new TextEncoder,s={id:i,mimeType:"text/plain",topic:e?.topic??"",timestamp:Date.now(),size:e?.totalSize,attributes:e?.attributes},a=JSON.stringify({topic:e?.topic??"",streamType:"text",mimeType:"text/plain",totalSize:e?.totalSize,timestamp:s.timestamp,attributes:e?.attributes,destinationIdentities:e?.destinationIdentities});return t.send(ur(1,i,r.encode(a))),new gr(s,t,i)}async sendFile(e,t){const i=await this.ensureDataProducer(),r=crypto.randomUUID(),s=new TextEncoder,a=t?.mimeType??(e.type||"application/octet-stream"),n=JSON.stringify({topic:t?.topic??"",streamType:"byte",mimeType:a,name:e.name,totalSize:e.size,timestamp:Date.now(),destinationIdentities:t?.destinationIdentities});i.send(ur(1,r,s.encode(n)));const o=await e.arrayBuffer(),c=new Uint8Array(o),d=Math.ceil(c.byteLength/hr)||1;for(let e=0;e<d;e++){const s=e*hr,a=Math.min(s+hr,c.byteLength);i.send(ur(2,r,c.subarray(s,a))),t?.onProgress?.((e+1)/d)}return i.send(ur(3,r,new Uint8Array(0))),{id:r}}async streamBytes(e){const t=await this.ensureDataProducer(),i=crypto.randomUUID(),r=new TextEncoder,s={id:i,mimeType:e?.mimeType??"application/octet-stream",topic:e?.topic??"",timestamp:Date.now(),size:e?.totalSize,name:e?.name??"",attributes:e?.attributes},a=JSON.stringify({topic:e?.topic??"",streamType:"byte",mimeType:s.mimeType,name:e?.name,totalSize:e?.totalSize,timestamp:s.timestamp,attributes:e?.attributes,destinationIdentities:e?.destinationIdentities});return t.send(ur(1,i,r.encode(a))),new vr(s,t,i)}close(){this.dataProducer?.close(),this.dataProducer=void 0}}class _r{constructor(){this.textHandlers=new Map,this.byteHandlers=new Map,this.activeStreams=new Map,this.localIdentity=""}setLocalIdentity(e){this.localIdentity=e}registerTextStreamHandler(e,t){this.textHandlers.set(e,t)}unregisterTextStreamHandler(e){this.textHandlers.delete(e)}registerByteStreamHandler(e,t){this.byteHandlers.set(e,t)}unregisterByteStreamHandler(e){this.byteHandlers.delete(e)}handleMessage(e,t,i){let r;try{r=function(e){const t=new DataView(e),i=new Uint8Array(e),r=t.getUint8(0),s=t.getUint16(1,!1);return{type:r,streamId:(new TextDecoder).decode(i.subarray(3,3+s)),payload:i.subarray(3+s)}}(e)}catch{return void pr.warn("Failed to decode data stream frame")}switch(r.type){case 1:this.handleHeader(r.streamId,r.payload,t,i);break;case 2:this.handleChunk(r.streamId,r.payload);break;case 3:this.handleClose(r.streamId);break;default:pr.warn(`Unknown frame type: ${r.type}`)}}handleHeader(e,t,i,r){const s=new TextDecoder;let a;try{a=JSON.parse(s.decode(t))}catch{return void pr.warn("Failed to parse stream header")}const n=a.destinationIdentities;if(n&&n.length>0&&!n.includes(this.localIdentity))return;const o=a.topic??"",c=a.streamType??"byte",d="text"===c,p=d?this.textHandlers.get(o):this.byteHandlers.get(o);if(p)if(d){let t;const s=new ReadableStream({start(e){t=e}}),n={id:e,mimeType:a.mimeType??"text/plain",topic:o,timestamp:a.timestamp??Date.now(),size:a.totalSize,attributes:a.attributes};this.activeStreams.set(e,{info:n,streamType:c,controller:t,senderIdentity:i,senderSid:r});p(new mr(n,s),{identity:i,sid:r})}else{let t;const s=new ReadableStream({start(e){t=e}}),n={id:e,mimeType:a.mimeType??"application/octet-stream",topic:o,timestamp:a.timestamp??Date.now(),size:a.totalSize,name:a.name??"",attributes:a.attributes};this.activeStreams.set(e,{info:n,streamType:c,controller:t,senderIdentity:i,senderSid:r});p(new fr(n,s),{identity:i,sid:r})}else pr.debug(`No handler for topic '${o}' (${c}), ignoring stream ${e}`)}handleChunk(e,t){const i=this.activeStreams.get(e);if(i)if("text"===i.streamType){const e=new TextDecoder;i.controller.enqueue(e.decode(t))}else i.controller.enqueue(new Uint8Array(t))}handleClose(e){const t=this.activeStreams.get(e);if(t){try{t.controller.close()}catch{}this.activeStreams.delete(e)}}}function yr(e,t){const i=new TextEncoder,r=[];let s=0;for(;s<e.length;){let a=Math.min(s+t,e.length);for(;a>s&&i.encode(e.slice(s,a)).byteLength>t;)a--;a===s&&(a=s+1),r.push(e.slice(s,a)),s=a}return 0===r.length&&r.push(""),r}class Sr extends Error{constructor(e,t,i){super(t),this.code=e,this.data=i}static builtIn(e,t){return new Sr(Sr.ErrorCode[e],Sr.ErrorMessage[e],t)}}Sr.MAX_MESSAGE_BYTES=256,Sr.MAX_DATA_BYTES=15360,Sr.ErrorCode={APPLICATION_ERROR:1500,CONNECTION_TIMEOUT:1501,RESPONSE_TIMEOUT:1502,RECIPIENT_DISCONNECTED:1503,RESPONSE_PAYLOAD_TOO_LARGE:1504,SEND_FAILED:1505,UNSUPPORTED_METHOD:1400,RECIPIENT_NOT_FOUND:1401,REQUEST_PAYLOAD_TOO_LARGE:1402},Sr.ErrorMessage={APPLICATION_ERROR:"Application error in method handler",CONNECTION_TIMEOUT:"Connection timeout",RESPONSE_TIMEOUT:"Response timeout",RECIPIENT_DISCONNECTED:"Recipient disconnected",RESPONSE_PAYLOAD_TOO_LARGE:"Response payload too large",SEND_FAILED:"Failed to send",UNSUPPORTED_METHOD:"Method not supported at destination",RECIPIENT_NOT_FOUND:"Recipient not found",REQUEST_PAYLOAD_TOO_LARGE:"Request payload too large"};const wr=p("LocalParticipant");class kr extends ri{constructor(){super(...arguments),this.producers=new Map,this.dataProducers=new Map,this.participantTrackPermissions=[],this.allParticipantsAllowedToSubscribe=!0,this.rpcHandlers=new Map,this.pendingRpcResponses=new Map}get isLocal(){return!0}init(e,t){this.rpc=e,this.transportManager=t,this.dataStreamSender=new br(e,t)}getProducers(){return this.producers}getDataProducers(){return this.dataProducers}get lastCameraError(){return this._lastCameraError}get lastMicrophoneError(){return this._lastMicrophoneError}async setCameraEnabled(t,i,r){if(!t){const t=this.getTrackPublication(e.TrackSource.Camera);return t?.track&&await this.unpublishTrack(t.track),t}try{const t={...this.roomOptions?.videoCaptureDefaults,...i},s=await Gi(t);return await this.publishTrack(s,{...r,source:e.TrackSource.Camera,stopTrackOnUnpublish:!0})}catch(e){throw this._lastCameraError=e instanceof Error?e:new Error(String(e)),e}}async setMicrophoneEnabled(t,i,r){if(!t){const t=this.getTrackPublication(e.TrackSource.Microphone);return t?.track&&await this.unpublishTrack(t.track),t}try{const t={...this.roomOptions?.audioCaptureDefaults,...i},s=await Qi(t);return await this.publishTrack(s,{...r,source:e.TrackSource.Microphone,stopTrackOnUnpublish:!0})}catch(e){throw this._lastMicrophoneError=e instanceof Error?e:new Error(String(e)),e}}async setScreenShareEnabled(t,i,r){if(t){const e=await Ki(i);let t;for(const i of e)t=await this.publishTrack(i,{...r,source:i.source,stopTrackOnUnpublish:!0});return t}{const t=this.getTrackPublication(e.TrackSource.ScreenShare);t?.track&&await this.unpublishTrack(t.track);const i=this.getTrackPublication(e.TrackSource.ScreenShareAudio);return i?.track&&await this.unpublishTrack(i.track),t}}async enableCameraAndMicrophone(t,i){let r;try{const e={...this.roomOptions?.audioCaptureDefaults,...t?.audio},i={...this.roomOptions?.videoCaptureDefaults,...t?.video};r=await qi({audio:e,video:i})}catch(e){const t=e instanceof Error?e:new Error(String(e));return this._lastMicrophoneError=t,this._lastCameraError=t,void wr.warn("Failed to create local tracks",e)}const s=await Promise.allSettled(r.map(t=>{const r=t.kind===e.TrackKind.Audio?e.TrackSource.Microphone:e.TrackSource.Camera;return this.publishTrack(t,{...i,source:r})}));for(const e of s)"rejected"===e.status&&wr.warn("Failed to publish track",e.reason)}async publishTrack(t,i){let r;if(t instanceof MediaStreamTrack){const i="audio"===t.kind?e.TrackKind.Audio:e.TrackKind.Video;r=i===e.TrackKind.Audio?new Ri(t):new Bi(t)}else r=t;const s={...this.roomOptions?.publishDefaults,...i};s.source&&(r.source=s.source);for(const[,e]of this.trackPublications)if(e.track===r)return wr.warn("track has already been published, skipping"),e;const a=r.kind===e.TrackKind.Audio;let n=!1;if(a){const e=r.mediaStreamTrack.getSettings(),t=r.mediaStreamTrack.getConstraints(),i="channelCount"in e&&2===e.channelCount||2===t.channelCount;n=s.forceStereo??i,n&&(void 0===s.dtx&&wr.info("Opus DTX will be disabled for stereo tracks by default. Enable explicitly to override."),void 0===s.red&&wr.info("Opus RED will be disabled for stereo tracks by default. Enable explicitly to override."),s.dtx??(s.dtx=!1),s.red??(s.red=!1)),s.stopMicTrackOnMute&&r instanceof Ri&&(r.stopOnMute=!0)}const o=this.transportManager.sendTransport;if(!o)throw new Error("Send transport not available");const c=r.kind===e.TrackKind.Video,d=r.source===e.TrackSource.ScreenShare||r.source===e.TrackSource.ScreenShareAudio;let p;if(c&&("av1"!==s.videoCodec||bi()||(wr.warn("AV1 not supported by browser, falling back to default codec"),s.videoCodec=void 0),"vp9"!==s.videoCodec||_i()||(wr.warn("VP9 not supported by browser, falling back to default codec"),s.videoCodec=void 0),s.videoCodec??(s.videoCodec="vp8")),d&&fi()&&(s.simulcast=!1),c&&s.videoCodec&&ir(s.videoCodec)&&(d?(s.scalabilityMode="L1T3","contentHint"in r.mediaStreamTrack&&(r.mediaStreamTrack.contentHint="motion",wr.info("forcing contentHint to motion for screenshare with SVC codecs",{videoCodec:s.videoCodec,source:r.source}))):s.scalabilityMode??(s.scalabilityMode="L3T3_KEY")),c&&r instanceof Bi){let e={width:0,height:0};try{e=await r.waitForDimensions()}catch{const t=this.roomOptions?.videoCaptureDefaults?.resolution??{width:1280,height:720};e={width:t.width,height:t.height},wr.warn("could not determine track dimensions, using defaults",e)}p=cr(d,e.width,e.height,s)}else if(a){const e=s.audioPreset?.maxBitrate??s.audioBitrate,t=s.audioPreset?.priority??"high";void 0!==e&&(p=[{maxBitrate:e,priority:t,networkPriority:t}])}const l=this.buildCodecOptions(s);let h;if(c&&s.videoCodec){const e=`video/${s.videoCodec}`;h=this.transportManager.device.recvRtpCapabilities.codecs?.find(t=>t.mimeType.toLowerCase()===e)}const u=y(),m=new Promise((t,i)=>{this.transportManager.registerProduceCallback(u,async(a,n,o)=>{try{const i={clientTrackId:u,name:s.name??r.mediaStreamTrack.label,kind:r.kind,rtpParameters:a.rtpParameters,source:r.source,muted:r.isMuted};if(c&&r instanceof Bi){try{const e=await r.waitForDimensions();i.width=e.width,i.height=e.height}catch{}s.videoCodec&&(i.videoCodec=s.videoCodec);const t=function(e){if(!e.backupCodec)return;if(!0===e.backupCodec)return e.videoCodec&&!xi(e.videoCodec)?"vp8":void 0;if("object"==typeof e.backupCodec&&e.backupCodec.codec!==e.videoCodec)return e.backupCodec.codec;return}(s);t&&(i.backupCodec=t,i.backupCodecPolicy=s.backupCodecPolicy??e.BackupCodecPolicy.PREFER_REGRESSION)}const o=await this.rpc.request("track.publish",i);n({id:o.trackSid}),t(o.trackSid)}catch(e){o(e instanceof Error?e:new Error(String(e))),i(e)}})}),f=await o.produce({track:r.mediaStreamTrack,encodings:p,codecOptions:l,codec:h,stopTracks:s.stopTrackOnUnpublish??!1,disableTrackOnPause:!0,appData:{clientTrackId:u,source:r.source}}),g=await m;if(r.sid=g,r.producer=f,c&&r instanceof Bi&&s.videoCodec&&(r.publishedCodec=s.videoCodec),c&&r instanceof Bi){const e=s.degradationPreference??dr(r.source,r.constraints??void 0);r.setDegradationPreference(e).catch(e=>{wr.warn("Failed to set degradation preference",e)})}this.producers.set(g,f);const v=new si({trackSid:g,trackName:s.name??r.mediaStreamTrack.label,kind:r.kind,source:r.source,track:r,muted:r.isMuted,producer:f,options:s});return this.addTrackPublicationToMaps(v),r.startMonitor(),r.addVisibilityListener(),r.on(e.TrackEvent.Muted,()=>{v.muted=!0,this.emit(e.ParticipantEvent.TrackMuted,v),this.rpc.request("track.mute",{trackSid:g,muted:!0}).catch(()=>{})}),r.on(e.TrackEvent.Unmuted,()=>{v.muted=!1,this.emit(e.ParticipantEvent.TrackUnmuted,v),this.rpc.request("track.mute",{trackSid:g,muted:!1}).catch(()=>{})}),f.observer.on("trackended",()=>{!r.isUserProvided&&(r.source===e.TrackSource.Camera||r.source===e.TrackSource.Microphone)?(wr.info(`Track ${g} ended, attempting restart`),r.restart().then(()=>{wr.info(`Track ${g} successfully restarted after ended`)}).catch(e=>{wr.warn(`Failed to restart track ${g}, unpublishing`,e),this.unpublishTrack(r).catch(e=>{wr.warn(`Failed to auto-unpublish track ${g}`,e)})})):(wr.info(`Track ${g} ended, unpublishing`),this.unpublishTrack(r).catch(e=>{wr.warn(`Failed to auto-unpublish track ${g}`,e)}))}),f.on("transportclose",()=>{wr.info(`Transport closed for track ${g}`),this.producers.delete(g)}),this.emit(e.ParticipantEvent.TrackPublished,v),this.emit(e.ParticipantEvent.LocalTrackPublished,v),wr.info(`Published track ${g} (${r.kind}/${r.source})`),v}async unpublishTrack(t){let i;if(t instanceof Ci)i=t.sid;else for(const[e,r]of this.trackPublications)if(r.track?.mediaStreamTrack===t){i=e;break}if(!i)return;const r=this.producers.get(i),s=this.trackPublications.get(i);try{await this.rpc.request("track.unpublish",{trackSid:i})}catch(e){wr.warn(`Failed to unpublish track ${i}`,e)}const a=s?.track instanceof Ci?s.track:void 0;return a?.stopMonitor(),r?.close(),this.producers.delete(i),a&&(a.producer=void 0),s&&(this.removeTrackPublicationFromMaps(i),this.emit(e.ParticipantEvent.TrackUnpublished,s),this.emit(e.ParticipantEvent.LocalTrackUnpublished,s)),wr.info(`Unpublished track ${i}`),s}async publishData(e,t){const i=this.transportManager.sendTransport;if(!i)throw new Error("Send transport not available");const r=y(),s=await i.produceData({ordered:t?.ordered??!0,maxRetransmits:t?.maxRetransmits,maxPacketLifeTime:t?.maxPacketLifeTime,label:t?.label??"data",protocol:""}),a={clientTrackId:r,transportSid:i.id,sctpStreamParameters:s.sctpStreamParameters,name:t?.name??"data",label:t?.label??"data",protocol:""},n=await this.rpc.request("dataTrack.publish",a);this.dataProducers.set(n.dataTrackSid,s),s.send(e),wr.info(`Published data track ${n.dataTrackSid}`)}async setMetadata(e){await this.rpc.request("participant.update",{metadata:e}),this.metadata=e}async setName(e){await this.rpc.request("participant.update",{name:e}),this.name=e}async setAttributes(e){await this.rpc.request("participant.update",{attributes:e}),this.attributes={...this.attributes,...e}}async joinGroup(e){const t=await this.rpc.request("group.join",{groupId:e});return this.groupId=e,t.otherParticipants??[]}async leaveGroup(){await this.rpc.request("group.leave",{}),this.groupId=void 0}setTrackSubscriptionPermissions(e,t=[]){this.participantTrackPermissions=t,this.allParticipantsAllowedToSubscribe=e,this.updateTrackSubscriptionPermissions()}updateTrackSubscriptionPermissions(){this.rpc.request("subscription.updatePermissions",{allParticipantsAllowed:this.allParticipantsAllowedToSubscribe,trackPermissions:this.participantTrackPermissions}).catch(()=>{})}async sendMessage(t,i){const r={id:crypto.randomUUID(),type:i?.type,message:t,timestamp:Date.now(),transient:i?.transient};return this.rpc.notify("message.send",{...r,destinationIdentities:i?.destinationIdentities,topic:i?.topic,attributes:i?.attributes}),this.emit(e.ParticipantEvent.ChatMessage,r),r}async editMessage(t,i){const r={...i,message:t,editTimestamp:Date.now()};return this.rpc.notify("message.send",r),this.emit(e.ParticipantEvent.ChatMessage,r),r}async deleteMessage(e){await this.rpc.request("message.delete",{id:e})}async deleteMessagesByType(e){await this.rpc.request("message.deleteByType",{type:e})}async updateRoomState(e,t){await this.rpc.request("state.update",{key:e,value:t})}async deleteRoomState(e){await this.rpc.request("state.delete",{key:e})}async sendChatMessage(e,t){return this.sendMessage(e,t)}async editChatMessage(e,t){return this.editMessage(e,t)}async sendText(e,t){if(!this.dataStreamSender)throw new Error("Not connected");return this.dataStreamSender.sendText(e,t)}async streamText(e){if(!this.dataStreamSender)throw new Error("Not connected");return this.dataStreamSender.streamText(e)}async sendFile(e,t){if(!this.dataStreamSender)throw new Error("Not connected");return this.dataStreamSender.sendFile(e,t)}async streamBytes(e){if(!this.dataStreamSender)throw new Error("Not connected");return this.dataStreamSender.streamBytes(e)}async performRpc(e){const{destinationIdentity:t,method:i,payload:r,responseTimeout:s=15e3}=e;if(a=r,(new TextEncoder).encode(a).length>15360)throw Sr.builtIn("REQUEST_PAYLOAD_TOO_LARGE");var a;const n=crypto.randomUUID();return new Promise((e,a)=>{const o=setTimeout(()=>{this.pendingRpcResponses.delete(n),a(Sr.builtIn("RESPONSE_TIMEOUT"))},s);this.pendingRpcResponses.set(n,{resolve:e,reject:a,timer:o}),this.rpc.notify("rpc.request",{requestId:n,destinationIdentity:t,method:i,payload:r,responseTimeout:s,callerIdentity:this.identity})})}handleRpcResponse(e){const t=this.pendingRpcResponses.get(e.requestId);t&&(this.pendingRpcResponses.delete(e.requestId),clearTimeout(t.timer),e.error?t.reject(new Sr(e.error.code??1500,e.error.message??"Application error",e.error.data)):t.resolve(e.payload??""))}async handleRpcInvocation(e){const t=this.rpcHandlers.get(e.method);if(t)try{const i=await t({requestId:e.requestId,callerIdentity:e.callerIdentity,payload:e.payload??"",responseTimeout:e.responseTimeout??15e3});this.rpc.notify("rpc.response",{requestId:e.requestId,callerIdentity:e.callerIdentity,payload:i})}catch(t){const i=t instanceof Sr?t:new Sr(Sr.ErrorCode.APPLICATION_ERROR,t instanceof Error?t.message:String(t));this.rpc.notify("rpc.response",{requestId:e.requestId,callerIdentity:e.callerIdentity,error:{code:i.code,message:i.message,data:i.data}})}else this.rpc.notify("rpc.response",{requestId:e.requestId,callerIdentity:e.callerIdentity,error:{code:Sr.ErrorCode.UNSUPPORTED_METHOD,message:"Method not supported"}})}buildCodecOptions(e){const t=e?.codecOptions,i=e?.dtx,r=e?.red,s=e?.audioPreset?.maxBitrate??e?.audioBitrate,a=e?.forceStereo;if(t||void 0!==i||void 0!==r||void 0!==s||void 0!==a)return{...t,...void 0!==i&&{opusDtx:i},...void 0!==r&&{opusFec:r},...void 0!==s&&{opusMaxAverageBitrate:s},...void 0!==a&&{opusStereo:a}}}closeAll(e=!1){for(const[,e]of this.producers)e.close();for(const[,e]of this.dataProducers)e.close();if(this.dataStreamSender?.close(),!e)for(const[,e]of this.trackPublications)e.track instanceof Ci&&e.track.stop();this.producers.clear(),this.dataProducers.clear(),this.trackPublications.clear(),this.audioTrackPublications.clear(),this.videoTrackPublications.clear()}async unpublishTracks(e){await Promise.all(e.map(e=>this.unpublishTrack(e)))}async createTracks(e){const t=[];if(!1!==e?.audio){const i="object"==typeof e?.audio?{...this.roomOptions?.audioCaptureDefaults,...e.audio}:this.roomOptions?.audioCaptureDefaults;t.push(await Qi(i))}if(!1!==e?.video){const i="object"==typeof e?.video?{...this.roomOptions?.videoCaptureDefaults,...e.video}:this.roomOptions?.videoCaptureDefaults;t.push(await Gi(i))}return t}async createScreenTracks(e){return Ki(e)}async republishAllTracks(e,t=!0){const i=[...this.trackPublications.values()];this.clearPublications();for(const r of i){if(!r.track)continue;const i=r.track;if(i.producer=void 0,t&&"ended"===i.mediaStreamTrack?.readyState)try{await i.restart()}catch(e){wr.warn(`Failed to restart track ${r.trackSid}`,e);continue}try{await this.publishTrack(i,{name:r.trackName,source:r.source,...e})}catch(e){wr.warn(`Failed to republish track ${r.trackSid}`,e)}}}async handleSubscribedCodecs(e,t){if(!(e.track instanceof Bi))return;const i=e.track,r=i.publishedCodec;for(const s of t){const t=s.codec.toLowerCase(),a=s.qualities.some(e=>e.enabled);t===r?await i.setDynacastQuality(s.qualities):a&&xi(t)?i.backupProducer||(wr.info(`Publishing backup codec ${t} for ${e.trackSid}`),await this.publishAdditionalCodecForTrack(i,t,e)):!a&&i.backupProducer&&(wr.info(`Stopping backup codec for ${e.trackSid}`),i.backupProducer.close(),i.backupProducer=void 0)}}async publishAdditionalCodecForTrack(e,t,i){const r=this.transportManager.sendTransport;if(!r)throw new Error("Send transport not available");const s=`video/${t}`,a=this.transportManager.device.recvRtpCapabilities.codecs?.find(e=>e.mimeType.toLowerCase()===s);if(!a)return void wr.warn(`Backup codec ${t} not found in device capabilities`);const n=y(),o=new Promise((e,t)=>{this.transportManager.registerProduceCallback(n,async(r,s,a)=>{try{const t={trackSid:i.trackSid,clientTrackId:n,rtpParameters:r.rtpParameters},a=await this.rpc.request("track.publishBackup",t);s({id:a.backupTrackSid}),e(a.backupTrackSid)}catch(e){a(e instanceof Error?e:new Error(String(e))),t(e)}})}),c=await r.produce({track:e.mediaStreamTrack,codec:a,stopTracks:!1,disableTrackOnPause:!1,appData:{clientTrackId:n,source:e.source,backup:!0}}),d=await o;e.backupProducer=c,e.backupCodec=t,wr.info(`Backup codec published: ${t}, sid=${d}`)}clearPublications(){this.producers.clear(),this.dataProducers.clear(),this.trackPublications.clear(),this.audioTrackPublications.clear(),this.videoTrackPublications.clear()}}const Tr=p("RemoteTrackPublication");class Cr extends ii{constructor(t){super(t),this.streamState=e.StreamState.Active,this._subscribed=!0,this._enabled=!0,this._consumer=t.consumer,this._rpc=t.rpc,this._subscribed=t.subscribed??!0}attachSubscription(e,t,i){this.track=e,this._consumer=t,this._rpc=i,this._subscribed=!0}get isSubscribed(){return!!this._subscribed&&super.isSubscribed}get isDesired(){return this._subscribed}get subscriptionStatus(){return this._subscribed?super.isSubscribed?e.SubscriptionStatus.Subscribed:e.SubscriptionStatus.Desired:e.SubscriptionStatus.Unsubscribed}get videoQuality(){return this._videoQuality??e.VideoQuality.HIGH}get isEnabled(){return this._enabled}setEnabled(e){this._enabled!==e&&(this._enabled=e,this._consumer&&this._rpc&&(e?(this._consumer.resume(),this._rpc.request("subscription.resume",{subscriptionSid:this._consumer.id}).catch(()=>{})):(this._consumer.pause(),this._rpc.request("subscription.pause",{subscriptionSid:this._consumer.id}).catch(()=>{}))))}setSubscribed(e){this._subscribed!==e&&(this._subscribed=e,this._rpc&&(e?this._rpc.request("subscription.subscribe",{trackSid:this.trackSid}).catch(e=>{Tr.warn("Failed to subscribe",e)}):this._rpc.request("subscription.unsubscribe",{trackSid:this.trackSid}).catch(e=>{Tr.warn("Failed to unsubscribe",e)})))}setVideoQuality(e){this.isManualOperationAllowed()&&this._videoQuality!==e&&(this._videoQuality=e,this._requestedVideoDimensions=void 0,this.emitTrackUpdate())}setVideoDimensions(e){this.isManualOperationAllowed()&&(this._requestedVideoDimensions?.width===e.width&&this._requestedVideoDimensions?.height===e.height||(this._requestedVideoDimensions=e,this._videoQuality=void 0,this.emitTrackUpdate()))}setVideoFPS(t){this.isManualOperationAllowed()&&this.kind===e.TrackKind.Video&&this._fps!==t&&(this._fps=t,this.emitTrackUpdate())}isManualOperationAllowed(){return!!this.isDesired||(Tr.warn("Cannot update track settings when not subscribed"),!1)}emitTrackUpdate(){if(!this._rpc||!this._consumer)return;let t,i;t=this._requestedVideoDimensions?this.spatialLayerForDimensions(this._requestedVideoDimensions):void 0!==this._videoQuality?this._videoQuality===e.VideoQuality.LOW?0:this._videoQuality===e.VideoQuality.MEDIUM?1:2:2,void 0!==this._fps&&(i=this._fps<=10?0:this._fps<=20?1:2),this._rpc.request("subscription.setPreferredLayers",{subscriptionSid:this._consumer.id,spatialLayer:t,temporalLayer:i}).catch(e=>{Tr.warn("Failed to set preferred layers",e)})}spatialLayerForDimensions(e){const t=this.info?.width,i=this.info?.height;if(!t||!i)return 2;const r=[{q:0,width:Math.ceil(t/4),height:Math.ceil(i/4)},{q:1,width:Math.ceil(t/2),height:Math.ceil(i/2)},{q:2,width:t,height:i}];for(const t of r)if(t.width>=e.width&&t.height>=e.height)return t.q;return 2}}const Pr=p("RemoteTrack");class Rr extends hi{constructor(t,i=e.TrackSource.Unknown,r){super(t,i,r),this._prevBytesReceived=0,this._prevStatsTime=0}get isLocal(){return!1}setMuted(t){this._isMuted!==t&&(this._isMuted=t,this.consumer?t?this.consumer.pause():this.consumer.resume():this.mediaStreamTrack.enabled=!t,this.emit(t?e.TrackEvent.Muted:e.TrackEvent.Unmuted,this))}stop(){this.stopMonitor(),this.detach(),this.consumer?this.consumer.close():this._mediaStreamTrack.enabled=!1}stopMonitor(){super.stopMonitor(),void 0!==this._timeSyncHandle&&(cancelAnimationFrame(this._timeSyncHandle),this._timeSyncHandle=void 0)}async getRTCStatsReport(){if(this.consumer)return this.consumer.getStats()}setPlayoutDelay(e){const t=this.consumer?.rtpReceiver;t&&"playoutDelayHint"in t?t.playoutDelayHint=e:Pr.warn("Playout delay not supported in this browser")}getPlayoutDelay(){const e=this.consumer?.rtpReceiver;return e&&"playoutDelayHint"in e?e.playoutDelayHint:0}startMonitor(){this.monitorInterval||(this._prevBytesReceived=0,this._prevStatsTime=0,this.monitorInterval=setInterval(()=>this.monitorReceiver(),2e3),this.supportsSynchronizationSources()&&this.registerTimeSyncUpdate())}registerTimeSyncUpdate(){const t=this.consumer?.rtpReceiver;if(!t)return;const i=()=>{this._timeSyncHandle=requestAnimationFrame(()=>i());const r=t.getSynchronizationSources?.()?.[0];if(r){const{timestamp:t,rtpTimestamp:i}=r;i&&this._rtpTimestamp!==i&&(this.emit(e.TrackEvent.TimeSyncUpdate,{timestamp:t,rtpTimestamp:i}),this._rtpTimestamp=i)}};i()}supportsSynchronizationSources(){return"undefined"!=typeof RTCRtpReceiver&&"getSynchronizationSources"in RTCRtpReceiver.prototype}async monitorReceiver(){if(this.consumer)try{const e=await this.consumer.getStats();let t=0;e.forEach(e=>{"inbound-rtp"===e.type&&(t+=e.bytesReceived??0)});const i=Date.now();if(this._prevStatsTime>0&&t>this._prevBytesReceived){const e=(i-this._prevStatsTime)/1e3;this._currentBitrate=8*(t-this._prevBytesReceived)/e}this._prevBytesReceived=t,this._prevStatsTime=i}catch{}}}class Er extends Rr{constructor(t){super(e.TrackKind.Audio,e.TrackSource.Microphone,t),this._volume=1}get volume(){return this._volume}setVolume(e){this._volume=Math.max(0,Math.min(1,e));for(const e of this.attachedElements)e.volume=this._volume}}const Dr=p("RemoteVideoTrack");class xr extends Rr{constructor(t=e.TrackSource.Camera,i){super(e.TrackKind.Video,t,i),this.elementInfos=[]}get isAdaptiveStream(){return void 0!==this.adaptiveStreamSettings}setAdaptiveStream(e,t){this.rpc=e,this.adaptiveStreamSettings=t,this.setupAdaptiveObservers()}attach(e){const t=super.attach(e);return this.isAdaptiveStream&&this.observeElement(t),t}detach(e){const t=super.detach(e);for(const e of t)this.unobserveElement(e);return t}async requestPictureInPicture(){if(!document.pictureInPictureEnabled)return;const e=this.getFirstVideoElement();if(e)try{const t=await e.requestPictureInPicture();return this.pipElement=e,e.addEventListener("leavepictureinpicture",()=>{this.pipElement=void 0},{once:!0}),t}catch(e){return void Dr.warn("Failed to enter PiP",e)}}stop(){this.cleanupAdaptive(),super.stop()}setupAdaptiveObservers(){if("undefined"==typeof window)return;this.intersectionObserver=new IntersectionObserver(t=>{for(const i of t){const t=this.elementInfos.find(e=>e.element===i.target);if(t){const r=t.visible;t.visible=i.isIntersecting,r!==t.visible&&(this.emit(e.TrackEvent.VisibilityChanged,t.visible,this),this.handleVisibilityUpdate())}}},{threshold:0}),this.resizeObserver=new ResizeObserver(t=>{for(const i of t){const t=this.elementInfos.find(e=>e.element===i.target);if(t){const{width:r,height:s}=i.contentRect;(Math.abs(r-t.width)>=10||Math.abs(s-t.height)>=10)&&(t.width=r,t.height=s,this.emit(e.TrackEvent.VideoDimensionsChanged,{width:r,height:s},this),this.debouncedUpdateLayers())}}});(this.adaptiveStreamSettings?.pauseVideoInBackground??!0)&&"undefined"!=typeof document&&(this.visibilityBound=()=>this.handlePageVisibilityChange(),document.addEventListener("visibilitychange",this.visibilityBound))}observeElement(e){if(this.elementInfos.some(t=>t.element===e))return;const t={element:e,visible:!0,width:e.clientWidth,height:e.clientHeight};this.elementInfos.push(t),this.intersectionObserver?.observe(e),this.resizeObserver?.observe(e)}unobserveElement(e){const t=this.elementInfos.findIndex(t=>t.element===e);t>=0&&this.elementInfos.splice(t,1),this.intersectionObserver?.unobserve(e),this.resizeObserver?.unobserve(e)}handleVisibilityUpdate(){if(!this.rpc||!this.subscriptionSid)return;this.elementInfos.some(e=>e.visible)||void 0!==this.pipElement?this.rpc.request("subscription.resume",{subscriptionSid:this.subscriptionSid}).catch(e=>{Dr.warn("Failed to resume subscription",e)}):this.rpc.request("subscription.pause",{subscriptionSid:this.subscriptionSid}).catch(e=>{Dr.warn("Failed to pause subscription",e)})}handlePageVisibilityChange(){if(this.rpc&&this.subscriptionSid)if(document.hidden){if(this.pipElement)return;this.rpc.request("subscription.pause",{subscriptionSid:this.subscriptionSid}).catch(e=>{Dr.warn("Failed to pause subscription on visibility change",e)})}else{this.elementInfos.some(e=>e.visible)&&this.rpc.request("subscription.resume",{subscriptionSid:this.subscriptionSid}).catch(e=>{Dr.warn("Failed to resume subscription on visibility change",e)})}}debouncedUpdateLayers(){this.debounceTimer&&clearTimeout(this.debounceTimer),this.debounceTimer=setTimeout(()=>{this.updatePreferredLayers()},300)}updatePreferredLayers(){if(!this.rpc||!this.subscriptionSid)return;let e=0,t=0;for(const i of this.elementInfos)i.visible&&(e=Math.max(e,i.width),t=Math.max(t,i.height));if(0===e&&0===t)return;const i=this.getPixelDensity(),r=this.calculateSpatialLayer(e*i,t*i);this.rpc.request("subscription.setPreferredLayers",{subscriptionSid:this.subscriptionSid,spatialLayer:r}).catch(e=>{Dr.warn("Failed to set preferred layers",e)})}getPixelDensity(){const e=this.adaptiveStreamSettings?.pixelDensity;return"screen"===e?"undefined"!=typeof window?window.devicePixelRatio:1:e??1}calculateSpatialLayer(e,t){const i=e*t;return i<3e4?0:i<230400?1:2}cleanupAdaptive(){this.debounceTimer&&clearTimeout(this.debounceTimer),this.intersectionObserver?.disconnect(),this.resizeObserver?.disconnect(),this.visibilityBound&&"undefined"!=typeof document&&document.removeEventListener("visibilitychange",this.visibilityBound),this.elementInfos=[]}getFirstVideoElement(){for(const e of this.attachedElements)if(e instanceof HTMLVideoElement)return e}}const Ir=p("RemoteParticipant");class Mr extends ri{constructor(e,t){super(e.sid,e.identity,e.name,e.metadata),this.consumers=new Map,this.dataConsumers=new Map,this.autoSubscribe=!0,this.state=e.state,this.transportManager=t.transportManager,this.rpc=t.rpc,this.autoSubscribe=t.autoSubscribe??!0,this.streamReceiver=t.streamReceiver,e.attributes&&(this.attributes={...e.attributes}),e.groupId&&(this.groupId=e.groupId);for(const t of e.tracks??[])this.addTrackPublication(t)}get isLocal(){return!1}rebindTransport(e,t){this.transportManager=e,this.rpc=t}getConsumers(){return this.consumers}getDataConsumers(){return this.dataConsumers}setVolume(e){for(const t of this.audioTrackPublications.values()){const i=t.track;i?.setVolume(e)}}getVolume(){for(const e of this.audioTrackPublications.values()){const t=e.track;if(t)return t.volume}return 1}addTrackPublication(t){const i=new Cr({trackSid:t.sid,trackName:t.name,kind:t.kind,source:t.source,muted:t.muted,info:t,rpc:this.rpc,subscribed:this.autoSubscribe});return this.addTrackPublicationToMaps(i),this.emit(e.ParticipantEvent.TrackPublished,i),i}removeTrackPublication(t){const i=this.removeTrackPublicationFromMaps(t);if(i){if(i.track){const t=i.track;t.subscriptionSid&&this.consumers.delete(t.subscriptionSid),t.stop(),this.emit(e.ParticipantEvent.TrackUnsubscribed,t,i)}return this.emit(e.ParticipantEvent.TrackUnpublished,i),i}}async handleSubscriptionCreate(t){const i=this.transportManager.recvTransport;if(!i)throw new Error("Recv transport not available");const r=await i.consume({id:t.subscriptionSid,producerId:t.trackSid,kind:t.kind===e.TrackKind.Audio?"audio":"video",rtpParameters:t.rtpParameters});let s;this.consumers.set(t.subscriptionSid,r),s=t.kind===e.TrackKind.Audio?new Er(r.track):new xr(t.trackSource,r.track),s.sid=t.trackSid,s.subscriptionSid=t.subscriptionSid,s.publisherSid=t.publisherSid,s.consumer=r,t.trackMuted&&s.setMuted(!0);let a=this.trackPublications.get(t.trackSid);a?(a.attachSubscription(s,r,this.rpc),a.muted=t.trackMuted):(a=new Cr({trackSid:t.trackSid,trackName:t.trackName,kind:t.kind,source:t.trackSource,track:s,muted:t.trackMuted,consumer:r,rpc:this.rpc}),this.addTrackPublicationToMaps(a));const n=a;return r.observer.on("trackended",()=>{Ir.info(`Remote track ended for subscription ${t.subscriptionSid}`)}),r.observer.on("pause",()=>{s.setStreamState(e.StreamState.Paused),n.streamState=e.StreamState.Paused,this.emit(e.ParticipantEvent.TrackStreamStateChanged,n,e.StreamState.Paused)}),r.observer.on("resume",()=>{s.setStreamState(e.StreamState.Active),n.streamState=e.StreamState.Active,this.emit(e.ParticipantEvent.TrackStreamStateChanged,n,e.StreamState.Active)}),r.observer.on("close",()=>{Ir.info(`Consumer closed for subscription ${t.subscriptionSid}`),this.consumers.delete(t.subscriptionSid)}),s.startMonitor(),setTimeout(()=>{this.emit(e.ParticipantEvent.TrackSubscribed,s,n)},0),Ir.info(`Subscribed to track ${t.trackSid} via subscription ${t.subscriptionSid}`),{ok:!0}}async handleDataSubscriptionCreate(t){const i=this.transportManager.recvTransport;if(!i)throw new Error("Recv transport not available");const r=await i.consumeData({id:t.dataSubscriptionSid,dataProducerId:t.dataTrackSid,sctpStreamParameters:t.sctpStreamParameters,label:t.label,protocol:t.protocol});if(this.dataConsumers.set(t.dataSubscriptionSid,r),t.label===lr&&this.streamReceiver){const e=this.streamReceiver,t=this.identity??"",i=this.sid;r.on("message",r=>{e.handleMessage(r,t,i)})}else r.on("message",i=>{Ir.debug(`Data message from ${this.sid} subscription ${t.dataSubscriptionSid}`),this.emit(e.ParticipantEvent.DataReceived,i)});return Ir.info(`Data subscription created: ${t.dataSubscriptionSid} (label=${t.label})`),{ok:!0}}handleSubscriptionClosed(t){const i=this.consumers.get(t);i&&(i.close(),this.consumers.delete(t));for(const[,i]of this.trackPublications)if(i.track&&i.track.subscriptionSid===t){const t=i.track;i.track=void 0,this.emit(e.ParticipantEvent.TrackUnsubscribed,t,i),t.stop();break}}handleDataSubscriptionClosed(e){const t=this.dataConsumers.get(e);t&&(t.close(),this.dataConsumers.delete(e))}setTrackMuted(t,i){const r=this.trackPublications.get(t);r&&(r.muted=i,r.track&&r.track.setMuted(i),this.emit(i?e.ParticipantEvent.TrackMuted:e.ParticipantEvent.TrackUnmuted,r))}closeAll(){for(const[,e]of this.consumers)e.close();for(const[,e]of this.dataConsumers)e.close();for(const[,e]of this.trackPublications)e.track&&e.track.stop();this.consumers.clear(),this.dataConsumers.clear(),this.trackPublications.clear(),this.audioTrackPublications.clear(),this.videoTrackPublications.clear()}}const Lr="0.1.1",Or=p("StatsCollector");function Ar(e){const t=[];return e.forEach(e=>{t.push(e)}),t}class jr{constructor(e,t,i,r){this.rpc=e,this.transportManager=t,this.localParticipant=i,this.remoteParticipants=r}start(e){this.stop(),e<=0||(Or.info("Stats collector started"),this.timer=setInterval(()=>{this.collect().catch(e=>{Or.warn("Failed to collect stats",e)})},1e3*e))}stop(){this.timer&&(clearInterval(this.timer),this.timer=void 0,Or.info("Stats collector stopped"))}async collect(){const e={timestamp:Date.now()},t=[];if(this.transportManager.sendTransport)try{const e=await this.transportManager.sendTransport.getStats();t.push({id:this.transportManager.sendTransport.id,direction:"send",stats:Ar(e)})}catch{}if(this.transportManager.recvTransport)try{const e=await this.transportManager.recvTransport.getStats();t.push({id:this.transportManager.recvTransport.id,direction:"recv",stats:Ar(e)})}catch{}t.length>0&&(e.transports=t);const i=[];for(const[e,t]of this.localParticipant.getProducers())try{const r=await t.getStats();i.push({id:t.id,trackSid:e,stats:Ar(r)})}catch{}i.length>0&&(e.producers=i);const r=[];for(const[e,t]of this.remoteParticipants)for(const[,i]of t.getConsumers())try{const t=await i.getStats();r.push({id:i.id,participantSid:e,stats:Ar(t)})}catch{}r.length>0&&(e.consumers=r),this.rpc.notify("stats.report",e)}}class Fr{constructor(e=10,t=300,i=1e4){this.maxRetries=e,this.baseDelay=t,this.maxDelay=i}nextRetryDelayInMs(e){if(e.retryCount>this.maxRetries)return null;const t=Math.min(this.baseDelay*Math.pow(2,e.retryCount-1),this.maxDelay);return t+.5*t*Math.random()}reset(){}}const Nr=p("Room");var $r;e.CheckStatus=void 0,($r=e.CheckStatus||(e.CheckStatus={})).Idle="idle",$r.Running="running",$r.Success="success",$r.Failed="failed",$r.Skipped="skipped";e.AudioPresets={telephone:{maxBitrate:12e3},speech:{maxBitrate:24e3},music:{maxBitrate:48e3},musicStereo:{maxBitrate:64e3},musicHighQuality:{maxBitrate:96e3},musicHighQualityStereo:{maxBitrate:128e3}},e.AxonError=h,e.ByteStreamReader=fr,e.ByteStreamWriter=vr,e.ConnectionCheck=class extends n{constructor(e){super(),this.url=e}async checkSignalConnectivity(){return this.runCheck("signal-connectivity","Check signalling server reachability",async()=>{const e=await fetch(this.url,{method:"HEAD",signal:AbortSignal.timeout(5e3)});if(!e.ok&&405!==e.status)throw new Error(`Signal server returned ${e.status}`)})}async checkWebRTC(){return this.runCheck("webrtc","Check WebRTC peer connection",async()=>{const e=new RTCPeerConnection;try{const t=await e.createOffer();await e.setLocalDescription(t)}finally{e.close()}})}async checkPublishAudio(){return this.runCheck("publish-audio","Check audio publishing capability",async()=>{const e=await navigator.mediaDevices.getUserMedia({audio:!0});for(const t of e.getTracks())t.stop()})}async checkPublishVideo(){return this.runCheck("publish-video","Check video publishing capability",async()=>{const e=await navigator.mediaDevices.getUserMedia({video:!0});for(const t of e.getTracks())t.stop()})}async checkAll(){const e=[];return e.push(await this.checkSignalConnectivity()),e.push(await this.checkWebRTC()),e.push(await this.checkPublishAudio()),e.push(await this.checkPublishVideo()),e}async runCheck(t,i,r){const s={name:t,status:e.CheckStatus.Running,description:i};this.emit("statusChanged",s);const a=Date.now();try{await r(),s.status=e.CheckStatus.Success,s.duration=Date.now()-a}catch(t){s.status=e.CheckStatus.Failed,s.error=t instanceof Error?t.message:String(t),s.duration=Date.now()-a}return this.emit("statusChanged",s),s}},e.ConnectionError=u,e.DefaultReconnectPolicy=Fr,e.LocalAudioTrack=Ri,e.LocalParticipant=kr,e.LocalTrack=Ci,e.LocalTrackPublication=si,e.LocalVideoTrack=Bi,e.MAX_RPC_PAYLOAD_BYTES=15360,e.MediaDeviceFailure=class{static getFailure(e){if(!e)return;const t=e.name??"",i=(e.message??"").toLowerCase();return"NotAllowedError"===t||"PermissionDeniedError"===t?"PermissionDenied":"NotFoundError"===t||"DevicesNotFoundError"===t?"NotFound":"NotReadableError"===t||"TrackStartError"===t||"AbortError"===t?"DeviceInUse":i.includes("permission")?"PermissionDenied":i.includes("not found")?"NotFound":i.includes("in use")||i.includes("could not start")?"DeviceInUse":void 0}},e.PROTOCOL_VERSION=1,e.Participant=ri,e.RemoteAudioTrack=Er,e.RemoteParticipant=Mr,e.RemoteTrack=Rr,e.RemoteTrackPublication=Cr,e.RemoteVideoTrack=xr,e.Room=class extends n{constructor(t){super(),this._state=e.RoomState.Disconnected,this._name="",this._sid="",this.url="",this.token="",this._refreshToken="",this.nodeId="",this.participantSid="",this._remoteParticipants=new Map,this._groups=new Map,this._sharedState=new Map,this.pingIntervalSec=5,this.pingTimeoutSec=15,this.lastRtt=0,this.reconnectAttempts=0,this.reconnectPolicy=new Fr,this._canPlaybackAudio=!0,this._canPlaybackVideo=!0,this._activeDeviceMap=new Map,this.dataStreamReceiver=new _r,this._lastMessageTimestamp=0,this._connectOptions={},this._options=t??{},this._options.audioCaptureDefaults={...Li,...t?.audioCaptureDefaults},this._options.videoCaptureDefaults={...Mi,...t?.videoCaptureDefaults},this._options.publishDefaults={...t?.publishDefaults},this.signalClient=new v}get state(){return this._state}get name(){return this._name}get sid(){return this._sid}get serverInfo(){return this._serverInfo}get localParticipant(){return this._localParticipant}get remoteParticipants(){return this._remoteParticipants}async getTransportStats(){return this.transportManager.getStats()}get groups(){return this._groups}get sharedState(){return this._sharedState}getGroupParticipants(e){const t=[];this._localParticipant?.groupId===e&&t.push(this._localParticipant);for(const[,i]of this._remoteParticipants)i.groupId===e&&t.push(i);return t}getParticipants(){const e=[];this._localParticipant&&!this._localParticipant.groupId&&e.push(this._localParticipant);for(const[,t]of this._remoteParticipants)t.groupId||e.push(t);return e}get canPlaybackAudio(){return this._canPlaybackAudio}get canPlaybackVideo(){return this._canPlaybackVideo}get isRecording(){return this._roomInfo?.activeRecording??!1}get metadata(){return this._roomInfo?.metadata}get numParticipants(){return this._remoteParticipants.size+1}get numPublishers(){let e=0;this._localParticipant?.trackPublications.size>0&&e++;for(const[,t]of this._remoteParticipants)t.trackPublications.size>0&&e++;return e}get activeSpeakers(){const e=[];this._localParticipant?.isSpeaking&&e.push(this._localParticipant);for(const[,t]of this._remoteParticipants)t.isSpeaking&&e.push(t);return e.sort((e,t)=>t.audioLevel-e.audioLevel),e}getParticipantByIdentity(e){for(const[,t]of this._remoteParticipants)if(t.identity===e)return t}getParticipantBySid(e){return this._localParticipant?.sid===e?this._localParticipant:this._remoteParticipants.get(e)}async createGroup(e,t){return(await this.rpcClient.request("group.create",{name:e,permissions:t})).group}async deleteGroup(e){await this.rpcClient.request("group.delete",{groupId:e})}async listGroups(){return(await this.rpcClient.request("group.list",{})).groups}async pinParticipant(e){await this.rpcClient.request("participant.pin",{participantSid:e})}async unpinParticipant(e){await this.rpcClient.request("participant.unpin",{participantSid:e})}static async getLocalDevices(e){const t=await navigator.mediaDevices.enumerateDevices();return e?t.filter(t=>t.kind===e):t}async switchActiveDevice(e,t,i=!0){if(this._activeDeviceMap.set(e,t),this._localParticipant){for(const[,r]of this._localParticipant.trackPublications){const s=r.track;if(s&&s instanceof Ci)if("audioinput"===e&&s instanceof Ri)await s.setDeviceId(t,i);else if("videoinput"===e&&s instanceof Bi)await s.setDeviceId(t,i);else if("audiooutput"===e)for(const e of s.attachedElements??[])"function"==typeof e.setSinkId&&await e.setSinkId(t)}if("audiooutput"===e)for(const[,e]of this._remoteParticipants)for(const[,i]of e.trackPublications)if(i.track)for(const e of i.track.attachedElements??[])"function"==typeof e.setSinkId&&await e.setSinkId(t)}}async connect(t,i,r){if(this._state!==e.RoomState.Disconnected)throw new Error(`Cannot connect: room state is ${this._state}`);this.url=t,this.token=i??"",this._connectOptions=r??{},this.setState(e.RoomState.Connecting);const s=this._connectOptions.peerConnectionTimeout??15e3;try{const i=await this.withTimeout(this.performConnect(t),s);this.setState(e.RoomState.Connected),this.scheduleReadySnapshotReplay(i.readyParticipants),this.startHeartbeat(i.pingInterval,i.pingTimeout),this.startStatsCollector(i.statsInterval),this.reconnectAttempts=0,this.reconnectPolicy.reset(),this.setupDeviceChangeListener(),this.wireLocalParticipantEvents(),this.emit(e.RoomEvent.Connected),Nr.info(`Connected to room ${this._name}`),this.setupPageLeaveHandler()}catch(t){throw this.setState(e.RoomState.Disconnected),this.transportManager?.close(),t}}async performConnect(t){this.transportManager&&this.transportManager.close(),this.transportManager=new Bt(this.signalClient),this.rpcClient=new M;const i=await this.transportManager.generateCertificate(),r=i.length>0,s=this._connectOptions.autoSubscribe??!0,a=this._options.lastN??0,n={room:{name:this._options.roomName??"",metadata:this._options.metadata},clientInfo:{sdk:1,version:Lr,protocol:1},connectionSettings:{autoSubscribe:s,adaptiveStream:!!this._options.adaptiveStream,lastN:a>0?a:void 0,dtlsFingerprints:r?i:void 0},reconnect:!1,participantSid:"",nodeId:"",token:this.token||void 0},{response:o}=await this.signalClient.join(t,n),c=o;this.nodeId=c.serverInfo.nodeId,this.applyJoinResponse(c),await this.transportManager.setup(t,c,r,this._connectOptions.rtcConfig),this.wireTransportEvents(),this.transportManager.signalDataProducer&&this.transportManager.signalDataConsumer&&this.rpcClient.bind(this.transportManager.signalDataProducer,this.transportManager.signalDataConsumer),this.registerRPCHandlers(),this.registerNotificationHandlers();const d={rtpCapabilities:this.transportManager.device.recvRtpCapabilities},p=await this.rpcClient.request("ready",d);this._localParticipant&&(this._localParticipant.state=e.ParticipantState.Joined);return{readyParticipants:this.applyReadySnapshot(p),pingInterval:c.pingInterval,pingTimeout:c.pingTimeout,statsInterval:c.statsInterval}}async disconnect(t=!0){this._state!==e.RoomState.Disconnected&&(Nr.info("Disconnecting from room"),await(this.rpcClient?.request("leave",{reason:"client_initiated"}).catch(()=>{})),this.cleanup(e.DisconnectReason.ClientInitiated,t))}async attemptReconnect(){this.setState(e.RoomState.Reconnecting),this.emit(e.RoomEvent.Reconnecting),this.reconnectAttempts++;const t=this.reconnectPolicy.nextRetryDelayInMs({retryCount:this.reconnectAttempts,elapsedMs:0});if(null===t)return Nr.warn("Reconnect policy says stop"),void this.cleanup(e.DisconnectReason.StateMismatch);if(Nr.info(`Reconnecting in ${t}ms (attempt ${this.reconnectAttempts})`),await new Promise(e=>setTimeout(e,t)),this._state!==e.RoomState.Reconnecting)return;const i=this._connectOptions.peerConnectionTimeout??15e3;try{await this.withTimeout(this.performReconnect(),i)}catch(e){Nr.warn(`Reconnect attempt ${this.reconnectAttempts} failed`,e),this.attemptReconnect()}}async performReconnect(){const t=this.transportManager.getDtlsFingerprints(),i=t.length>0,r=this.transportManager.getCertificate(),s=this._options.lastN??0,a={room:{name:this._name},clientInfo:{sdk:1,version:Lr,protocol:1},connectionSettings:{autoSubscribe:this._connectOptions.autoSubscribe??!0,adaptiveStream:!!this._options.adaptiveStream,lastN:s>0?s:void 0,dtlsFingerprints:i?t:void 0},reconnect:!0,participantSid:this.participantSid,nodeId:this.nodeId,token:this.token||void 0,refreshToken:this._refreshToken||void 0},{response:n}=await this.signalClient.join(this.url,a);if(g(n))return await this.transportManager.restartIce(n.iceParameters),this.setState(e.RoomState.Connected),this.reconnectAttempts=0,this.reconnectPolicy.reset(),this.emit(e.RoomEvent.Reconnected),void Nr.info("ICE restart completed");const o=n;this.stopHeartbeat(),this.stopStatsCollector(),this.rpcClient.close(),this.transportManager.close(),this.rpcClient=new M,this.transportManager=new Bt(this.signalClient),r&&this.transportManager.setCertificate(r),this.nodeId=o.serverInfo.nodeId,this.applyJoinResponse(o),await this.transportManager.setup(this.url,o,i,this._connectOptions.rtcConfig),this.wireTransportEvents(),this.transportManager.signalDataProducer&&this.transportManager.signalDataConsumer&&this.rpcClient.bind(this.transportManager.signalDataProducer,this.transportManager.signalDataConsumer),this.registerRPCHandlers(),this.registerNotificationHandlers(),this._localParticipant.init(this.rpcClient,this.transportManager);for(const[,e]of this._remoteParticipants)e.rebindTransport(this.transportManager,this.rpcClient);const c={rtpCapabilities:this.transportManager.device.recvRtpCapabilities,syncState:this.buildSyncState()},d=await this.rpcClient.request("ready",c);if(this.applyReadySnapshot(d,!0),d.messages)for(const e of d.messages)this.handleMessage(e);if(d.sharedState){this._sharedState.clear();for(const[e,t]of Object.entries(d.sharedState))this._sharedState.set(e,t)}await this._localParticipant.republishAllTracks(),this.startHeartbeat(o.pingInterval,o.pingTimeout),this.startStatsCollector(o.statsInterval),this.setState(e.RoomState.Connected),this.reconnectAttempts=0,this.reconnectPolicy.reset(),this.emit(e.RoomEvent.Reconnected),Nr.info("Reconnected successfully")}withTimeout(e,t){if(t<=0)return e;let i;return Promise.race([e,new Promise((e,r)=>{i=setTimeout(()=>r(new m(`Connection timed out after ${t}ms`)),t)})]).finally(()=>clearTimeout(i))}buildSyncState(){const e=[],t=[];for(const[e]of this._localParticipant.trackPublications)t.push(e);for(const[,t]of this._remoteParticipants)for(const[i,r]of t.trackPublications)r.track&&e.push(i);return{subscribedTrackSids:e,subscribedDataTrackSids:[],publishedTrackSids:t,dataReceiveStates:[],lastMessageTimestamp:this._lastMessageTimestamp||void 0}}setState(t){this._state!==t&&(this._state=t,this.emit(e.RoomEvent.ConnectionStateChanged,t))}startHeartbeat(e,t){this.stopHeartbeat(),this.pingIntervalSec=e||5,this.pingTimeoutSec=t||15,this.pingInterval=setInterval(()=>{this.sendPing()},1e3*this.pingIntervalSec)}stopHeartbeat(){this.pingInterval&&(clearInterval(this.pingInterval),this.pingInterval=void 0),this.pingTimeoutTimer&&(clearTimeout(this.pingTimeoutTimer),this.pingTimeoutTimer=void 0)}sendPing(){if(this._state!==e.RoomState.Connected)return;const t=1e3*this.pingIntervalSec;if(this.rpcClient.lastSentAt>0&&Date.now()-this.rpcClient.lastSentAt<t)return;const i={timestamp:Date.now()};this.pingTimeoutTimer&&clearTimeout(this.pingTimeoutTimer),this.pingTimeoutTimer=setTimeout(()=>{Nr.warn("Ping timeout, attempting reconnect"),this.handleDisconnect(e.DisconnectReason.ConnectionTimeout)},1e3*this.pingTimeoutSec),this.rpcClient.request("ping",i,1e3*this.pingTimeoutSec).then(e=>{this.pingTimeoutTimer&&(clearTimeout(this.pingTimeoutTimer),this.pingTimeoutTimer=void 0),this.lastRtt=Date.now()-e.lastTimestamp}).catch(e=>{Nr.warn("Ping failed",e)})}get rtt(){return this.lastRtt}startStatsCollector(e){this.stopStatsCollector(),!e||e<=0||(this.statsCollector=new jr(this.rpcClient,this.transportManager,this._localParticipant,this._remoteParticipants),this.statsCollector.start(e))}stopStatsCollector(){this.statsCollector&&(this.statsCollector.stop(),this.statsCollector=void 0)}async startAudio(){const t=[];for(const[,i]of this._remoteParticipants)for(const[,r]of i.trackPublications)if(r.track&&"audio"===r.kind){const i=r.track.attach();t.push(i.play().then(()=>{this._canPlaybackAudio||(this._canPlaybackAudio=!0,this.emit(e.RoomEvent.AudioPlaybackStatusChanged,!0))}).catch(()=>{}))}await Promise.allSettled(t)}async startVideo(){const t=[];for(const[,i]of this._remoteParticipants)for(const[,r]of i.trackPublications)if(r.track&&"video"===r.kind){const i=r.track.attach();t.push(i.play().then(()=>{this._canPlaybackVideo||(this._canPlaybackVideo=!0,this.emit(e.RoomEvent.VideoPlaybackStatusChanged,!0))}).catch(()=>{}))}await Promise.allSettled(t)}getActiveDevice(e){return this._activeDeviceMap.get(e)}registerRpcMethod(e,t){this._localParticipant.rpcHandlers.set(e,t)}unregisterRpcMethod(e){this._localParticipant.rpcHandlers.delete(e)}registerTextStreamHandler(e,t){this.dataStreamReceiver.registerTextStreamHandler(e,t)}unregisterTextStreamHandler(e){this.dataStreamReceiver.unregisterTextStreamHandler(e)}registerByteStreamHandler(e,t){this.dataStreamReceiver.registerByteStreamHandler(e,t)}unregisterByteStreamHandler(e){this.dataStreamReceiver.unregisterByteStreamHandler(e)}applyJoinResponse(e){this._name=e.room.name,this._sid=e.room.sid,this._roomInfo=e.room,this._serverInfo=e.serverInfo,this.participantSid=e.participant.sid,e.refreshToken&&(this._refreshToken=e.refreshToken),this._localParticipant?this._localParticipant.updateFromInfo(e.participant):this._localParticipant=new kr(e.participant.sid,e.participant.identity,e.participant.name,e.participant.metadata),this._localParticipant.roomOptions=this._options,this._localParticipant.init(this.rpcClient,this.transportManager),this.dataStreamReceiver.setLocalIdentity(e.participant.identity)}registerRPCHandlers(){this.rpcClient.onRequest("subscription.create",async e=>this.handleSubscriptionCreate(e)),this.rpcClient.onRequest("dataSubscription.create",async e=>this.handleDataSubscriptionCreate(e))}registerNotificationHandlers(){this.rpcClient.onNotification("token.refreshed",t=>{this._refreshToken=t.token,this.emit(e.RoomEvent.TokenRefreshed,t.token)}),this.rpcClient.onNotification("participant.joined",e=>{this.handleParticipantJoined(e)}),this.rpcClient.onNotification("participant.left",e=>{this.handleParticipantLeft(e)}),this.rpcClient.onNotification("participant.updated",e=>{this.handleParticipantUpdated(e)}),this.rpcClient.onNotification("track.published",e=>{this.handleTrackPublished(e)}),this.rpcClient.onNotification("track.unpublished",e=>{this.handleTrackUnpublished(e)}),this.rpcClient.onNotification("dataTrack.published",e=>{this.handleDataTrackPublished(e)}),this.rpcClient.onNotification("dataTrack.unpublished",e=>{this.handleDataTrackUnpublished(e)}),this.rpcClient.onNotification("track.muted",e=>{this.handleTrackMuted(e)}),this.rpcClient.onNotification("track.subscribedQualityChanged",e=>{this.handleSubscribedQualityChanged(e)}),this.rpcClient.onNotification("activeSpeakers.changed",e=>{this.handleActiveSpeakersChanged(e)}),this.rpcClient.onNotification("room.updated",e=>{this.handleRoomUpdated(e)}),this.rpcClient.onNotification("disconnect",e=>{this.handleDisconnect(e.reason)}),this.rpcClient.onNotification("subscription.closed",e=>{this.handleSubscriptionClosed(e)}),this.rpcClient.onNotification("dataSubscription.closed",e=>{this.handleDataSubscriptionClosed(e)}),this.rpcClient.onNotification("message.received",e=>{this.handleMessage(e)}),this.rpcClient.onNotification("message.deleted",t=>{this.emit(e.RoomEvent.MessageDeleted,t.ids,t.type)}),this.rpcClient.onNotification("state.updated",t=>{this._sharedState.set(t.key,t.value),this.emit(e.RoomEvent.StateUpdated,t.key,t.value,t.participantSid,t.participantIdentity)}),this.rpcClient.onNotification("state.deleted",t=>{this._sharedState.delete(t.key),this.emit(e.RoomEvent.StateDeleted,t.key,t.participantSid,t.participantIdentity)}),this.rpcClient.onNotification("rpc.invoke",e=>{this._localParticipant.handleRpcInvocation(e)}),this.rpcClient.onNotification("rpc.response",e=>{this._localParticipant.handleRpcResponse(e)}),this.rpcClient.onNotification("group.created",t=>{this._groups.set(t.group.groupId,t.group),this.emit(e.RoomEvent.GroupCreated,t.group)}),this.rpcClient.onNotification("group.updated",t=>{this._groups.set(t.group.groupId,t.group),this.emit(e.RoomEvent.GroupUpdated,t.group)}),this.rpcClient.onNotification("group.deleted",t=>{this._groups.delete(t.groupId),this._localParticipant.groupId===t.groupId&&(this._localParticipant.groupId=void 0);for(const[,e]of this._remoteParticipants)e.groupId===t.groupId&&(e.groupId=void 0);this.emit(e.RoomEvent.GroupDeleted,t.groupId)}),this.rpcClient.onNotification("group.participantJoined",t=>{const i=this.getParticipantBySid(t.participantSid);i&&(i.groupId=t.groupId,this.emit(e.RoomEvent.GroupParticipantJoined,t.groupId,i))}),this.rpcClient.onNotification("group.participantLeft",t=>{const i=this.getParticipantBySid(t.participantSid);i&&(i.groupId=void 0,this.emit(e.RoomEvent.GroupParticipantLeft,t.groupId,i))})}applyReadySnapshot(e,t=!1){e.room&&(this._roomInfo=e.room,this._name=e.room.name);const i=this.replaceRemoteParticipants(e.otherParticipants,t);return this.replaceGroups(e.groups),this.replaceSharedState(e.sharedState),i}replaceRemoteParticipants(t,i=!1){if(!t)return[];const r=new Set,s=[];for(const a of t){r.add(a.sid);const t=this._remoteParticipants.has(a.sid),n=this.upsertRemoteParticipant(a);if(s.push(n),i&&!t){this.emit(e.RoomEvent.ParticipantJoined,n);for(const[,t]of n.trackPublications)this.emit(e.RoomEvent.TrackPublished,t,n)}}for(const[t,s]of this._remoteParticipants)r.has(t)||(s.closeAll(),this._remoteParticipants.delete(t),i&&this.emit(e.RoomEvent.ParticipantLeft,s));return s}replaceGroups(e){if(e){this._groups.clear();for(const t of e)this._groups.set(t.groupId,t)}}replaceSharedState(e){if(e){this._sharedState.clear();for(const[t,i]of Object.entries(e))this._sharedState.set(t,i)}}upsertRemoteParticipant(e){const t=this._remoteParticipants.get(e.sid);if(t)return t.updateFromInfo(e),t;const i=new Mr(e,{transportManager:this.transportManager,rpc:this.rpcClient,autoSubscribe:this._connectOptions.autoSubscribe,streamReceiver:this.dataStreamReceiver});return this._remoteParticipants.set(e.sid,i),this.wireRemoteParticipantEvents(i),i}scheduleReadySnapshotReplay(t){if(0===t.length)return;const i=t.map(e=>({participant:e,publications:[...e.trackPublications.values()]}));setTimeout(()=>{if(this._state===e.RoomState.Connected)for(const{participant:t,publications:r}of i)if(this._remoteParticipants.get(t.sid)===t){this.emit(e.RoomEvent.ParticipantJoined,t);for(const i of r)t.getTrackPublicationBySid(i.trackSid)===i&&this.emit(e.RoomEvent.TrackPublished,i,t)}},0)}handleParticipantJoined(t){const i=this._remoteParticipants.has(t.participant.sid),r=this.upsertRemoteParticipant(t.participant);if(i)return this.emit(e.RoomEvent.ParticipantUpdated,r),void Nr.info(`Participant updated via join event: ${r.identity} (${r.sid})`);this.emit(e.RoomEvent.ParticipantJoined,r),Nr.info(`Participant joined: ${r.identity} (${r.sid})`)}handleParticipantLeft(t){const i=this._remoteParticipants.get(t.participantSid);i&&(i.closeAll(),this._remoteParticipants.delete(t.participantSid),this.emit(e.RoomEvent.ParticipantLeft,i,t.reason),Nr.info(`Participant left: ${i.identity} (${i.sid})`))}handleParticipantUpdated(t){const i=this._remoteParticipants.has(t.participant.sid),r=this.upsertRemoteParticipant(t.participant);if(!i)return this.emit(e.RoomEvent.ParticipantJoined,r),void Nr.warn(`Participant updated before join event: ${r.identity} (${r.sid})`);this.emit(e.RoomEvent.ParticipantUpdated,r)}handleTrackPublished(e){const t=this._remoteParticipants.get(e.participantSid);t&&t.addTrackPublication(e.track)}handleTrackUnpublished(e){const t=this._remoteParticipants.get(e.participantSid);t&&t.removeTrackPublication(e.trackSid)}handleDataTrackPublished(t){const i=this._remoteParticipants.get(t.participantSid);i&&this.emit(e.RoomEvent.DataTrackPublished,t.dataTrack,i)}handleDataTrackUnpublished(t){const i=this._remoteParticipants.get(t.participantSid);i&&this.emit(e.RoomEvent.DataTrackUnpublished,t.dataTrackSid,i)}handleTrackMuted(e){const t=this._remoteParticipants.get(e.participantSid);t&&t.setTrackMuted(e.trackSid,e.muted)}handleSubscribedQualityChanged(e){if(!this._options.dynacast)return;const t=this._localParticipant.getTrackPublicationBySid(e.trackSid);t?.track&&t.track instanceof Bi&&(e.subscribedCodecs&&e.subscribedCodecs.length>0?this._localParticipant.handleSubscribedCodecs(t,e.subscribedCodecs).catch(e=>{Nr.warn("Failed to handle subscribed codecs",e)}):t.track.setDynacastQuality(e.subscribedQualities).catch(e=>{Nr.warn("Failed to set dynacast quality",e)}))}handleActiveSpeakersChanged(t){const i=[],r=new Date;for(const s of t.speakers){let t;if(t=s.participantSid===this.participantSid?this._localParticipant:this._remoteParticipants.get(s.participantSid),!t)continue;const a=t.isSpeaking;t.isSpeaking=s.active,t.audioLevel=s.level,s.active&&(t.lastSpokeAt=r,i.push(t)),a!==s.active&&t.emit(e.ParticipantEvent.IsSpeakingChanged,s.active)}i.sort((e,t)=>t.audioLevel-e.audioLevel),this.emit(e.RoomEvent.ActiveSpeakersChanged,i)}handleMessage(t){const i={id:t.id,type:t.type,message:t.message,timestamp:t.timestamp,editTimestamp:t.editTimestamp,transient:t.transient,attachedFiles:t.attachedFiles},r=i.editTimestamp??i.timestamp;r>this._lastMessageTimestamp&&(this._lastMessageTimestamp=r);const s=t.participantSid?this._remoteParticipants.get(t.participantSid):void 0;s?.emit(e.ParticipantEvent.ChatMessage,i),this.emit(e.RoomEvent.ChatMessage,i,s)}handleRoomUpdated(t){this._roomInfo=t.room,this._name=t.room.name,this.emit(e.RoomEvent.RoomUpdated,t.room)}handleDisconnect(t){Nr.info(`handleDisconnect: ${e.DisconnectReason[t]}`);const i=t===e.DisconnectReason.ClientInitiated||t===e.DisconnectReason.DuplicateIdentity||t===e.DisconnectReason.ParticipantRemoved||t===e.DisconnectReason.RoomDeleted||t===e.DisconnectReason.ServerShutdown;this._state!==e.RoomState.Reconnecting?i?this.cleanup(t):this.attemptReconnect():i&&this.cleanup(t)}async handleSubscriptionCreate(t){const i=this._remoteParticipants.get(t.publisherSid);if(!i){Nr.warn(`Subscription create for unknown publisher ${t.publisherSid}`);const i=new Mr({sid:t.publisherSid,identity:t.publisherSid,state:e.ParticipantState.Joined},{transportManager:this.transportManager,rpc:this.rpcClient,autoSubscribe:this._connectOptions.autoSubscribe});return this._remoteParticipants.set(t.publisherSid,i),this.wireRemoteParticipantEvents(i),i.handleSubscriptionCreate(t)}return i.handleSubscriptionCreate(t)}async handleDataSubscriptionCreate(e){const t=this._remoteParticipants.get(e.publisherSid);return t?t.handleDataSubscriptionCreate(e):(Nr.warn(`Data subscription create for unknown publisher ${e.publisherSid}`),{ok:!1})}handleSubscriptionClosed(e){for(const[,t]of this._remoteParticipants)t.handleSubscriptionClosed(e.subscriptionSid)}handleDataSubscriptionClosed(e){for(const[,t]of this._remoteParticipants)t.handleDataSubscriptionClosed(e.dataSubscriptionSid)}wireRemoteParticipantEvents(t){t.on(e.ParticipantEvent.TrackSubscribed,(i,r)=>{this.emit(e.RoomEvent.TrackSubscribed,i,r,t)}),t.on(e.ParticipantEvent.TrackUnsubscribed,(i,r)=>{this.emit(e.RoomEvent.TrackUnsubscribed,i,r,t)}),t.on(e.ParticipantEvent.TrackPublished,i=>{this.emit(e.RoomEvent.TrackPublished,i,t)}),t.on(e.ParticipantEvent.TrackUnpublished,i=>{this.emit(e.RoomEvent.TrackUnpublished,i,t)}),t.on(e.ParticipantEvent.TrackMuted,i=>{this.emit(e.RoomEvent.TrackMuted,i,t)}),t.on(e.ParticipantEvent.TrackUnmuted,i=>{this.emit(e.RoomEvent.TrackUnmuted,i,t)}),t.on(e.ParticipantEvent.TrackStreamStateChanged,(i,r)=>{this.emit(e.RoomEvent.TrackStreamStateChanged,i,r,t)}),t.on(e.ParticipantEvent.DataReceived,i=>{this.emit(e.RoomEvent.DataReceived,i,t)}),t.on(e.ParticipantEvent.MetadataChanged,(t,i)=>{this.emit(e.RoomEvent.ParticipantMetadataChanged,t,i)}),t.on(e.ParticipantEvent.NameChanged,(t,i)=>{this.emit(e.RoomEvent.ParticipantNameChanged,t,i)}),t.on(e.ParticipantEvent.AttributesChanged,(t,i)=>{this.emit(e.RoomEvent.ParticipantAttributesChanged,t,i)})}wireLocalParticipantEvents(){this._localParticipant&&(this._localParticipant.on(e.ParticipantEvent.LocalTrackPublished,t=>{this.emit(e.RoomEvent.LocalTrackPublished,t,this._localParticipant)}),this._localParticipant.on(e.ParticipantEvent.LocalTrackUnpublished,t=>{this.emit(e.RoomEvent.LocalTrackUnpublished,t,this._localParticipant)}),this._localParticipant.on(e.ParticipantEvent.TrackMuted,t=>{this.emit(e.RoomEvent.TrackMuted,t,this._localParticipant)}),this._localParticipant.on(e.ParticipantEvent.TrackUnmuted,t=>{this.emit(e.RoomEvent.TrackUnmuted,t,this._localParticipant)}),this._localParticipant.on(e.ParticipantEvent.ChatMessage,t=>{const i=t.editTimestamp??t.timestamp;i>this._lastMessageTimestamp&&(this._lastMessageTimestamp=i),this.emit(e.RoomEvent.ChatMessage,t,this._localParticipant)}))}setupDeviceChangeListener(){"undefined"!=typeof navigator&&navigator.mediaDevices&&(this.deviceChangeHandler=()=>{this.emit(e.RoomEvent.MediaDevicesChanged)},navigator.mediaDevices.addEventListener("devicechange",this.deviceChangeHandler))}cleanup(t,i=!0){if(this._state!==e.RoomState.Disconnected){this.setState(e.RoomState.Disconnected),this.stopHeartbeat(),this.stopStatsCollector(),this.rpcClient?.close(),this.transportManager?.close(),this._localParticipant?.closeAll(!i);for(const[,e]of this._remoteParticipants)e.closeAll();this._remoteParticipants.clear(),this.pageLeaveHandler&&ui()&&(window.removeEventListener("beforeunload",this.pageLeaveHandler),window.removeEventListener("pagehide",this.pageLeaveHandler),window.removeEventListener("freeze",this.pageLeaveHandler),this.pageLeaveHandler=void 0),this.deviceChangeHandler&&"undefined"!=typeof navigator&&navigator.mediaDevices&&(navigator.mediaDevices.removeEventListener("devicechange",this.deviceChangeHandler),this.deviceChangeHandler=void 0),this.emit(e.RoomEvent.Disconnected,t),Nr.info(`Disconnected from room: reason=${e.DisconnectReason[t]}`)}}wireTransportEvents(){this.transportManager.on("connectionFailed",t=>{Nr.warn(`Transport connection failed (${t}), attempting reconnect`),this.handleDisconnect(e.DisconnectReason.MediaFailure)})}setupPageLeaveHandler(){ui()&&(this.pageLeaveHandler=()=>{this.disconnect()},window.addEventListener("beforeunload",this.pageLeaveHandler),window.addEventListener("pagehide",this.pageLeaveHandler),window.addEventListener("freeze",this.pageLeaveHandler))}},e.RpcError=Sr,e.ScreenSharePresets=Fi,e.TextStreamReader=mr,e.TextStreamWriter=gr,e.TimeoutError=m,e.Track=hi,e.TrackPublication=ii,e.TypedEmitter=n,e.VERSION=Lr,e.VideoPreset=Ei,e.VideoPresets=Ai,e.VideoPresets43=ji,e.audioCodecs=["opus","red"],e.compareVersions=yi,e.createAudioAnalyser=function(e,t){const i=new AudioContext,r=i.createMediaStreamSource(new MediaStream([e.mediaStreamTrack])),s=i.createAnalyser();return s.fftSize=t?.fftSize??2048,s.smoothingTimeConstant=t?.smoothingTimeConstant??.8,r.connect(s),{analyser:s,cleanup:()=>{r.disconnect(),s.disconnect(),i.close()}}},e.createLocalAudioTrack=Qi,e.createLocalScreenTracks=Ki,e.createLocalTracks=qi,e.createLocalVideoTrack=Gi,e.defaultAudioCaptureOptions=Li,e.defaultScreenShareEncoding={maxBitrate:3e6,maxFramerate:30},e.defaultVideoCaptureOptions=Mi,e.defaultVideoEncoding=Oi,e.facingModeFromDeviceLabel=wi,e.facingModeFromLocalTrack=function(e){const t=e.mediaStreamTrack?.getSettings();if(t?.facingMode)return t.facingMode;const i=e.mediaStreamTrack?.label;return i?wi(i):void 0},e.getBrowser=Si,e.getEmptyAudioStreamTrack=function(){const e=new AudioContext,t=e.createOscillator(),i=e.createMediaStreamDestination();t.connect(i),t.start();const r=i.stream.getAudioTracks()[0];return t.stop(),e.close(),r},e.getEmptyVideoStreamTrack=function(e=16,t=16){const i=document.createElement("canvas");i.width=e,i.height=t;const r=i.getContext("2d");return r&&(r.fillStyle="black",r.fillRect(0,0,e,t)),i.captureStream(0).getVideoTracks()[0]},e.isBackupVideoCodec=xi,e.isBrowserSupported=function(){return"undefined"!=typeof RTCPeerConnection&&("undefined"!=typeof navigator&&(void 0!==navigator.mediaDevices&&void 0!==navigator.mediaDevices.getUserMedia))},e.isChromiumBased=function(){const e=Si();return!!e&&"Chrome"===e.name&&"iOS"!==e.os},e.isFireFox=fi,e.isMobile=mi,e.isSafari=gi,e.isSafariBased=vi,e.isWeb=ui,e.setLogExtension=function(e){c=e},e.setLogLevel=function(e){d=e},e.setLogger=function(e){o=e},e.supportsAV1=bi,e.supportsAdaptiveStream=function(){return"undefined"!=typeof IntersectionObserver&&"undefined"!=typeof ResizeObserver},e.supportsAudioOutputSelection=function(){return!(!ui()||"undefined"==typeof HTMLMediaElement)&&(!vi()&&"function"==typeof HTMLMediaElement.prototype.setSinkId)},e.supportsDynacast=function(){return"undefined"!=typeof RTCRtpSender&&("function"==typeof RTCRtpSender.prototype.getParameters&&"function"==typeof RTCRtpSender.prototype.setParameters)},e.supportsVP9=_i,e.videoCodecs=["vp8","h264","vp9","av1","h265"],e.videoSimulcastPresets=Ni});