diff --git a/public/js/RoomClient.js b/public/js/RoomClient.js
index 2b892b25..a823b135 100644
--- a/public/js/RoomClient.js
+++ b/public/js/RoomClient.js
@@ -9,7 +9,7 @@
* @license For commercial or closed source, contact us at license.mirotalk@gmail.com or purchase directly via CodeCanyon
* @license CodeCanyon: https://codecanyon.net/item/mirotalk-sfu-webrtc-realtime-video-conferences/40769970
* @author Miroslav Pejic - miroslav.pejic.85@gmail.com
- * @version 1.8.68
+ * @version 1.8.69
*
*/
diff --git a/public/sfu/MediasoupClient.js b/public/sfu/MediasoupClient.js
index 1feccc29..6d27b787 100644
--- a/public/sfu/MediasoupClient.js
+++ b/public/sfu/MediasoupClient.js
@@ -1 +1 @@
-(()=>{var e={11:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Chrome74=void 0;const r=s(7363),i=s(2994),a=s(1765),n=s(8046),o=s(5544),c=s(5938),d=s(4256),p=s(4893),l=s(521),h=s(1305),m=s(3303),u=new i.Logger("Chrome74"),f={OS:1024,MIS:1024};class g extends l.HandlerInterface{_closed=!1;_direction;_remoteSdp;_sendingRtpParametersByKind;_sendingRemoteRtpParametersByKind;_forcedLocalDtlsRole;_pc;_mapMidTransceiver=new Map;_sendStream=new MediaStream;_hasDataChannelMediaSection=!1;_nextSendSctpStreamId=0;_transportReady=!1;static createFactory(){return()=>new g}constructor(){super()}get name(){return"Chrome74"}close(){if(u.debug("close()"),!this._closed){if(this._closed=!0,this._pc)try{this._pc.close()}catch(e){}this.emit("@close")}}async getNativeRtpCapabilities(){u.debug("getNativeRtpCapabilities()");const e=new RTCPeerConnection({iceServers:[],iceTransportPolicy:"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require",sdpSemantics:"unified-plan"});try{e.addTransceiver("audio"),e.addTransceiver("video");const t=await e.createOffer();try{e.close()}catch(e){}const s=r.parse(t.sdp),i=o.extractRtpCapabilities({sdpObject:s});return d.addNackSupportForOpus(i),i}catch(t){try{e.close()}catch(e){}throw t}}async getNativeSctpCapabilities(){return u.debug("getNativeSctpCapabilities()"),{numStreams:f}}run({direction:e,iceParameters:t,iceCandidates:s,dtlsParameters:r,sctpParameters:i,iceServers:a,iceTransportPolicy:o,additionalSettings:c,proprietaryConstraints:d,extendedRtpCapabilities:p}){u.debug("run()"),this._direction=e,this._remoteSdp=new h.RemoteSdp({iceParameters:t,iceCandidates:s,dtlsParameters:r,sctpParameters:i}),this._sendingRtpParametersByKind={audio:n.getSendingRtpParameters("audio",p),video:n.getSendingRtpParameters("video",p)},this._sendingRemoteRtpParametersByKind={audio:n.getSendingRemoteRtpParameters("audio",p),video:n.getSendingRemoteRtpParameters("video",p)},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",sdpSemantics:"unified-plan",...c},d),this._pc.addEventListener("icegatheringstatechange",(()=>{this.emit("@icegatheringstatechange",this._pc.iceGatheringState)})),this._pc.addEventListener("icecandidateerror",(e=>{this.emit("@icecandidateerror",e)})),this._pc.connectionState?this._pc.addEventListener("connectionstatechange",(()=>{this.emit("@connectionstatechange",this._pc.connectionState)})):(u.warn("run() | pc.connectionState not supported, using pc.iceConnectionState"),this._pc.addEventListener("iceconnectionstatechange",(()=>{switch(this._pc.iceConnectionState){case"checking":this.emit("@connectionstatechange","connecting");break;case"connected":case"completed":this.emit("@connectionstatechange","connected");break;case"failed":this.emit("@connectionstatechange","failed");break;case"disconnected":this.emit("@connectionstatechange","disconnected");break;case"closed":this.emit("@connectionstatechange","closed")}})))}async updateIceServers(e){this.assertNotClosed(),u.debug("updateIceServers()");const t=this._pc.getConfiguration();t.iceServers=e,this._pc.setConfiguration(t)}async restartIce(e){if(this.assertNotClosed(),u.debug("restartIce()"),this._remoteSdp.updateIceParameters(e),this._transportReady)if("send"===this._direction){const e=await this._pc.createOffer({iceRestart:!0});u.debug("restartIce() | calling pc.setLocalDescription() [offer:%o]",e),await this._pc.setLocalDescription(e);const t={type:"answer",sdp:this._remoteSdp.getSdp()};u.debug("restartIce() | calling pc.setRemoteDescription() [answer:%o]",t),await this._pc.setRemoteDescription(t)}else{const e={type:"offer",sdp:this._remoteSdp.getSdp()};u.debug("restartIce() | calling pc.setRemoteDescription() [offer:%o]",e),await this._pc.setRemoteDescription(e);const t=await this._pc.createAnswer();u.debug("restartIce() | calling pc.setLocalDescription() [answer:%o]",t),await this._pc.setLocalDescription(t)}}async getTransportStats(){return this.assertNotClosed(),this._pc.getStats()}async send({track:e,encodings:t,codecOptions:s,codec:i}){this.assertNotClosed(),this.assertSendDirection(),u.debug("send() [kind:%s, track.id:%s]",e.kind,e.id),t&&t.length>1&&t.forEach(((e,t)=>{e.rid=`r${t}`}));const d=a.clone(this._sendingRtpParametersByKind[e.kind]);d.codecs=n.reduceCodecs(d.codecs,i);const p=a.clone(this._sendingRemoteRtpParametersByKind[e.kind]);p.codecs=n.reduceCodecs(p.codecs,i);const l=this._remoteSdp.getNextMediaSectionIdx(),h=this._pc.addTransceiver(e,{direction:"sendonly",streams:[this._sendStream],sendEncodings:t});let f,g=await this._pc.createOffer(),_=r.parse(g.sdp);_.extmapAllowMixed&&this._remoteSdp.setSessionExtmapAllowMixed(),this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:_});let w=!1;const b=(0,m.parse)((t??[{}])[0].scalabilityMode);t&&1===t.length&&b.spatialLayers>1&&"video/vp9"===d.codecs[0].mimeType.toLowerCase()&&(u.debug("send() | enabling legacy simulcast for VP9 SVC"),w=!0,_=r.parse(g.sdp),f=_.media[l.idx],c.addLegacySimulcast({offerMediaObject:f,numStreams:b.spatialLayers}),g={type:"offer",sdp:r.write(_)}),u.debug("send() | calling pc.setLocalDescription() [offer:%o]",g),await this._pc.setLocalDescription(g);const v=h.mid;if(d.mid=v,_=r.parse(this._pc.localDescription.sdp),f=_.media[l.idx],d.rtcp.cname=o.getCname({offerMediaObject:f}),t)if(1===t.length){let e=c.getRtpEncodings({offerMediaObject:f});Object.assign(e[0],t[0]),w&&(e=[e[0]]),d.encodings=e}else d.encodings=t;else d.encodings=c.getRtpEncodings({offerMediaObject:f});if(d.encodings.length>1&&("video/vp8"===d.codecs[0].mimeType.toLowerCase()||"video/h264"===d.codecs[0].mimeType.toLowerCase()))for(const e of d.encodings)e.scalabilityMode?e.scalabilityMode=`L1T${b.temporalLayers}`:e.scalabilityMode="L1T3";this._remoteSdp.send({offerMediaObject:f,reuseMid:l.reuseMid,offerRtpParameters:d,answerRtpParameters:p,codecOptions:s});const y={type:"answer",sdp:this._remoteSdp.getSdp()};return u.debug("send() | calling pc.setRemoteDescription() [answer:%o]",y),await this._pc.setRemoteDescription(y),this._mapMidTransceiver.set(v,h),{localId:v,rtpParameters:d,rtpSender:h.sender}}async stopSending(e){if(this.assertSendDirection(),u.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 s=await this._pc.createOffer();u.debug("stopSending() | calling pc.setLocalDescription() [offer:%o]",s),await this._pc.setLocalDescription(s);const r={type:"answer",sdp:this._remoteSdp.getSdp()};u.debug("stopSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r),this._mapMidTransceiver.delete(e)}async pauseSending(e){this.assertNotClosed(),this.assertSendDirection(),u.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 s=await this._pc.createOffer();u.debug("pauseSending() | calling pc.setLocalDescription() [offer:%o]",s),await this._pc.setLocalDescription(s);const r={type:"answer",sdp:this._remoteSdp.getSdp()};u.debug("pauseSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r)}async resumeSending(e){this.assertNotClosed(),this.assertSendDirection(),u.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 s=await this._pc.createOffer();u.debug("resumeSending() | calling pc.setLocalDescription() [offer:%o]",s),await this._pc.setLocalDescription(s);const r={type:"answer",sdp:this._remoteSdp.getSdp()};u.debug("resumeSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r)}async replaceTrack(e,t){this.assertNotClosed(),this.assertSendDirection(),t?u.debug("replaceTrack() [localId:%s, track.id:%s]",e,t.id):u.debug("replaceTrack() [localId:%s, no track]",e);const s=this._mapMidTransceiver.get(e);if(!s)throw new Error("associated RTCRtpTransceiver not found");await s.sender.replaceTrack(t)}async setMaxSpatialLayer(e,t){this.assertNotClosed(),this.assertSendDirection(),u.debug("setMaxSpatialLayer() [localId:%s, spatialLayer:%s]",e,t);const s=this._mapMidTransceiver.get(e);if(!s)throw new Error("associated RTCRtpTransceiver not found");const r=s.sender.getParameters();r.encodings.forEach(((e,s)=>{e.active=s<=t})),await s.sender.setParameters(r),this._remoteSdp.muxMediaSectionSimulcast(e,r.encodings);const i=await this._pc.createOffer();u.debug("setMaxSpatialLayer() | calling pc.setLocalDescription() [offer:%o]",i),await this._pc.setLocalDescription(i);const a={type:"answer",sdp:this._remoteSdp.getSdp()};u.debug("setMaxSpatialLayer() | calling pc.setRemoteDescription() [answer:%o]",a),await this._pc.setRemoteDescription(a)}async setRtpEncodingParameters(e,t){this.assertNotClosed(),this.assertSendDirection(),u.debug("setRtpEncodingParameters() [localId:%s, params:%o]",e,t);const s=this._mapMidTransceiver.get(e);if(!s)throw new Error("associated RTCRtpTransceiver not found");const r=s.sender.getParameters();r.encodings.forEach(((e,s)=>{r.encodings[s]={...e,...t}})),await s.sender.setParameters(r),this._remoteSdp.muxMediaSectionSimulcast(e,r.encodings);const i=await this._pc.createOffer();u.debug("setRtpEncodingParameters() | calling pc.setLocalDescription() [offer:%o]",i),await this._pc.setLocalDescription(i);const a={type:"answer",sdp:this._remoteSdp.getSdp()};u.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:e,maxPacketLifeTime:t,maxRetransmits:s,label:i,protocol:a}){this.assertNotClosed(),this.assertSendDirection();const n={negotiated:!0,id:this._nextSendSctpStreamId,ordered:e,maxPacketLifeTime:t,maxRetransmits:s,protocol:a};u.debug("sendDataChannel() [options:%o]",n);const o=this._pc.createDataChannel(i,n);if(this._nextSendSctpStreamId=++this._nextSendSctpStreamId%f.MIS,!this._hasDataChannelMediaSection){const e=await this._pc.createOffer(),t=r.parse(e.sdp),s=t.media.find((e=>"application"===e.type));this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:t}),u.debug("sendDataChannel() | calling pc.setLocalDescription() [offer:%o]",e),await this._pc.setLocalDescription(e),this._remoteSdp.sendSctpAssociation({offerMediaObject:s});const i={type:"answer",sdp:this._remoteSdp.getSdp()};u.debug("sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]",i),await this._pc.setRemoteDescription(i),this._hasDataChannelMediaSection=!0}return{dataChannel:o,sctpStreamParameters:{streamId:n.id,ordered:n.ordered,maxPacketLifeTime:n.maxPacketLifeTime,maxRetransmits:n.maxRetransmits}}}async receive(e){this.assertNotClosed(),this.assertRecvDirection();const t=[],s=new Map;for(const t of e){const{trackId:e,kind:r,rtpParameters:i,streamId:a}=t;u.debug("receive() [trackId:%s, kind:%s]",e,r);const n=i.mid??String(this._mapMidTransceiver.size);s.set(e,n),this._remoteSdp.receive({mid:n,kind:r,offerRtpParameters:i,streamId:a??i.rtcp.cname,trackId:e})}const i={type:"offer",sdp:this._remoteSdp.getSdp()};u.debug("receive() | calling pc.setRemoteDescription() [offer:%o]",i),await this._pc.setRemoteDescription(i);let a=await this._pc.createAnswer();const n=r.parse(a.sdp);for(const t of e){const{trackId:e,rtpParameters:r}=t,i=s.get(e),a=n.media.find((e=>String(e.mid)===i));o.applyCodecParameters({offerRtpParameters:r,answerMediaObject:a})}a={type:"answer",sdp:r.write(n)},this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:n}),u.debug("receive() | calling pc.setLocalDescription() [answer:%o]",a),await this._pc.setLocalDescription(a);for(const r of e){const{trackId:e}=r,i=s.get(e),a=this._pc.getTransceivers().find((e=>e.mid===i));if(!a)throw new Error("new RTCRtpTransceiver not found");this._mapMidTransceiver.set(i,a),t.push({localId:i,track:a.receiver.track,rtpReceiver:a.receiver})}return t}async stopReceiving(e){if(this.assertRecvDirection(),this._closed)return;for(const t of e){u.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()};u.debug("stopReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const s=await this._pc.createAnswer();u.debug("stopReceiving() | calling pc.setLocalDescription() [answer:%o]",s),await this._pc.setLocalDescription(s);for(const t of e)this._mapMidTransceiver.delete(t)}async pauseReceiving(e){this.assertNotClosed(),this.assertRecvDirection();for(const t of e){u.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()};u.debug("pauseReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const s=await this._pc.createAnswer();u.debug("pauseReceiving() | calling pc.setLocalDescription() [answer:%o]",s),await this._pc.setLocalDescription(s)}async resumeReceiving(e){this.assertNotClosed(),this.assertRecvDirection();for(const t of e){u.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()};u.debug("resumeReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const s=await this._pc.createAnswer();u.debug("resumeReceiving() | calling pc.setLocalDescription() [answer:%o]",s),await this._pc.setLocalDescription(s)}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:e,label:t,protocol:s}){this.assertNotClosed(),this.assertRecvDirection();const{streamId:i,ordered:a,maxPacketLifeTime:n,maxRetransmits:o}=e,c={negotiated:!0,id:i,ordered:a,maxPacketLifeTime:n,maxRetransmits:o,protocol:s};u.debug("receiveDataChannel() [options:%o]",c);const d=this._pc.createDataChannel(t,c);if(!this._hasDataChannelMediaSection){this._remoteSdp.receiveSctpAssociation();const e={type:"offer",sdp:this._remoteSdp.getSdp()};u.debug("receiveDataChannel() | calling pc.setRemoteDescription() [offer:%o]",e),await this._pc.setRemoteDescription(e);const t=await this._pc.createAnswer();if(!this._transportReady){const e=r.parse(t.sdp);await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:e})}u.debug("receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]",t),await this._pc.setLocalDescription(t),this._hasDataChannelMediaSection=!0}return{dataChannel:d}}async setupTransport({localDtlsRole:e,localSdpObject:t}){t||(t=r.parse(this._pc.localDescription.sdp));const s=o.extractDtlsParameters({sdpObject:t});s.role=e,this._remoteSdp.updateDtlsRole("client"===e?"server":"client"),await new Promise(((e,t)=>{this.safeEmit("@connect",{dtlsParameters:s},e,t)})),this._transportReady=!0}assertNotClosed(){if(this._closed)throw new p.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')}}t.Chrome74=g},76:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.debug=t.testFakeParameters=t.FakeHandler=t.ortc=t.parseScalabilityMode=t.detectDeviceAsync=t.detectDevice=t.Device=t.version=t.types=void 0;const r=s(7833);t.debug=r.default,t.types=s(8057),t.version="3.12.0";var i=s(6004);Object.defineProperty(t,"Device",{enumerable:!0,get:function(){return i.Device}}),Object.defineProperty(t,"detectDevice",{enumerable:!0,get:function(){return i.detectDevice}}),Object.defineProperty(t,"detectDeviceAsync",{enumerable:!0,get:function(){return i.detectDeviceAsync}});var a=s(3303);Object.defineProperty(t,"parseScalabilityMode",{enumerable:!0,get:function(){return a.parse}}),t.ortc=s(8046);var n=s(2731);Object.defineProperty(t,"FakeHandler",{enumerable:!0,get:function(){return n.FakeHandler}}),t.testFakeParameters=s(5248)},182:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.version=t.validate=t.v7=t.v6ToV1=t.v6=t.v5=t.v4=t.v3=t.v1ToV6=t.v1=t.stringify=t.parse=t.NIL=t.MAX=void 0;var r=s(2196);Object.defineProperty(t,"MAX",{enumerable:!0,get:function(){return r.default}});var i=s(3465);Object.defineProperty(t,"NIL",{enumerable:!0,get:function(){return i.default}});var a=s(1797);Object.defineProperty(t,"parse",{enumerable:!0,get:function(){return a.default}});var n=s(6011);Object.defineProperty(t,"stringify",{enumerable:!0,get:function(){return n.default}});var o=s(1425);Object.defineProperty(t,"v1",{enumerable:!0,get:function(){return o.default}});var c=s(6568);Object.defineProperty(t,"v1ToV6",{enumerable:!0,get:function(){return c.default}});var d=s(591);Object.defineProperty(t,"v3",{enumerable:!0,get:function(){return d.default}});var p=s(8286);Object.defineProperty(t,"v4",{enumerable:!0,get:function(){return p.default}});var l=s(4557);Object.defineProperty(t,"v5",{enumerable:!0,get:function(){return l.default}});var h=s(6356);Object.defineProperty(t,"v6",{enumerable:!0,get:function(){return h.default}});var m=s(268);Object.defineProperty(t,"v6ToV1",{enumerable:!0,get:function(){return m.default}});var u=s(4299);Object.defineProperty(t,"v7",{enumerable:!0,get:function(){return u.default}});var f=s(9746);Object.defineProperty(t,"validate",{enumerable:!0,get:function(){return f.default}});var g=s(2770);Object.defineProperty(t,"version",{enumerable:!0,get:function(){return g.default}})},268:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=s(1797),i=s(6011);t.default=function(e){const t=(s="string"==typeof e?(0,r.default)(e):e,Uint8Array.of((15&s[3])<<4|s[4]>>4&15,(15&s[4])<<4|(240&s[5])>>4,(15&s[5])<<4|15&s[6],s[7],(15&s[1])<<4|(240&s[2])>>4,(15&s[2])<<4|(240&s[3])>>4,16|(240&s[0])>>4,(15&s[0])<<4|(240&s[1])>>4,s[8],s[9],s[10],s[11],s[12],s[13],s[14],s[15]));var s;return"string"==typeof e?(0,i.unsafeStringify)(t):t}},338:(e,t)=>{"use strict";function s(e){return 14+(e+64>>>9<<4)+1}function r(e,t){const s=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(s>>16)<<16|65535&s}function i(e,t,s,i,a,n){return r((o=r(r(t,e),r(i,n)))<<(c=a)|o>>>32-c,s);var o,c}function a(e,t,s,r,a,n,o){return i(t&s|~t&r,e,t,a,n,o)}function n(e,t,s,r,a,n,o){return i(t&r|s&~r,e,t,a,n,o)}function o(e,t,s,r,a,n,o){return i(t^s^r,e,t,a,n,o)}function c(e,t,s,r,a,n,o){return i(s^(t|~r),e,t,a,n,o)}Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return function(e){const t=new Uint8Array(4*e.length);for(let s=0;s<4*e.length;s++)t[s]=e[s>>2]>>>s%4*8&255;return t}(function(e,t){const i=new Uint32Array(s(t)).fill(0);i.set(e),i[t>>5]|=128<
>2]|=(255&e[s])<{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.HandlerInterface=void 0;const r=s(3953);class i extends r.EnhancedEventEmitter{constructor(){super()}}t.HandlerInterface=i},591:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.URL=t.DNS=void 0;const r=s(338),i=s(2988);var a=s(2988);function n(e,t,s,a){return(0,i.default)(48,r.default,e,t,s,a)}Object.defineProperty(t,"DNS",{enumerable:!0,get:function(){return a.DNS}}),Object.defineProperty(t,"URL",{enumerable:!0,get:function(){return a.URL}}),n.DNS=i.DNS,n.URL=i.URL,t.default=n},736:(e,t,s)=>{e.exports=function(e){function t(e){let s,i,a,n=null;function o(...e){if(!o.enabled)return;const r=o,i=Number(new Date),a=i-(s||i);r.diff=a,r.prev=s,r.curr=i,s=i,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,((s,i)=>{if("%%"===s)return"%";n++;const a=t.formatters[i];if("function"==typeof a){const t=e[n];s=a.call(r,t),e.splice(n,1),n--}return s})),t.formatArgs.call(r,e),(r.log||t.log).apply(r,e)}return o.namespace=e,o.useColors=t.useColors(),o.color=t.selectColor(e),o.extend=r,o.destroy=t.destroy,Object.defineProperty(o,"enabled",{enumerable:!0,configurable:!1,get:()=>null!==n?n:(i!==t.namespaces&&(i=t.namespaces,a=t.enabled(e)),a),set:e=>{n=e}}),"function"==typeof t.init&&t.init(o),o}function r(e,s){const r=t(this.namespace+(void 0===s?":":s)+e);return r.log=this.log,r}function i(e,t){let s=0,r=0,i=-1,a=0;for(;s"-"+e))].join(",");return t.enable(""),e},t.enable=function(e){t.save(e),t.namespaces=e,t.names=[],t.skips=[];const s=("string"==typeof e?e:"").trim().replace(/\s+/g,",").split(",").filter(Boolean);for(const e of s)"-"===e[0]?t.skips.push(e.slice(1)):t.names.push(e)},t.enabled=function(e){for(const s of t.skips)if(i(e,s))return!1;for(const s of t.names)if(i(e,s))return!0;return!1},t.humanize=s(6585),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((s=>{t[s]=e[s]})),t.names=[],t.skips=[],t.formatters={},t.selectColor=function(e){let s=0;for(let t=0;t{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.RemoteSdp=void 0;const r=s(7363),i=s(2994),a=s(3471),n=["av1","h264"],o=new i.Logger("RemoteSdp");t.RemoteSdp=class{_iceParameters;_iceCandidates;_dtlsParameters;_sctpParameters;_plainRtpParameters;_planB;_mediaSections=[];_midToIndex=new Map;_firstMid;_sdpObject;constructor({iceParameters:e,iceCandidates:t,dtlsParameters:s,sctpParameters:r,plainRtpParameters:i,planB:a=!1}){if(this._iceParameters=e,this._iceCandidates=t,this._dtlsParameters=s,this._sctpParameters=r,this._plainRtpParameters=i,this._planB=a,this._sdpObject={version:0,origin:{address:"0.0.0.0",ipVer:4,netType:"IN",sessionId:1e4,sessionVersion:0,username:"mediasoup-client"},name:"-",timing:{start:0,stop:0},media:[]},e?.iceLite&&(this._sdpObject.icelite="ice-lite"),s){this._sdpObject.msidSemantic={semantic:"WMS",token:"*"};const e=this._dtlsParameters.fingerprints.length;this._sdpObject.fingerprint={type:s.fingerprints[e-1].algorithm,hash:s.fingerprints[e-1].value},this._sdpObject.groups=[{type:"BUNDLE",mids:""}]}i&&(this._sdpObject.origin.address=i.ip,this._sdpObject.origin.ipVer=i.ipVersion)}updateIceParameters(e){o.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){o.debug("updateDtlsRole() [role:%s]",e),this._dtlsParameters.role=e;for(const t of this._mediaSections)t.setDtlsRole(e)}setSessionExtmapAllowMixed(){o.debug("setSessionExtmapAllowMixed()"),this._sdpObject.extmapAllowMixed="extmap-allow-mixed"}getNextMediaSectionIdx(){for(let e=0;en.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:s,streamId:r,trackId:i}){const n=this._midToIndex.get(e);let o;if(void 0!==n&&(o=this._mediaSections[n]),this.setSessionExtmapAllowMixed(),o)o.planBReceive({offerRtpParameters:s,streamId:r,trackId:i}),this._replaceMediaSection(o);else{o=new a.OfferMediaSection({iceParameters:this._iceParameters,iceCandidates:this._iceCandidates,dtlsParameters:this._dtlsParameters,plainRtpParameters:this._plainRtpParameters,planB:this._planB,mid:e,kind:t,offerRtpParameters:s,streamId:r,trackId:i});const n=this._mediaSections.find((e=>e.closed));n?this._replaceMediaSection(o,n.mid):this._addMediaSection(o)}}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?(o.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 s=this._findMediaSection(e);s.muxSimulcastStreams(t),this._replaceMediaSection(s)}planBStopReceiving({mid:e,offerRtpParameters:t}){const s=this._findMediaSection(e);s.planBStopReceiving({offerRtpParameters:t}),this._replaceMediaSection(s)}sendSctpAssociation({offerMediaObject:e}){const t=new a.AnswerMediaSection({iceParameters:this._iceParameters,iceCandidates:this._iceCandidates,dtlsParameters:this._dtlsParameters,sctpParameters:this._sctpParameters,plainRtpParameters:this._plainRtpParameters,offerMediaObject:e});this._addMediaSection(t)}receiveSctpAssociation({oldDataChannelSpec:e=!1}={}){const t=new a.OfferMediaSection({iceParameters:this._iceParameters,iceCandidates:this._iceCandidates,dtlsParameters:this._dtlsParameters,sctpParameters:this._sctpParameters,plainRtpParameters:this._plainRtpParameters,mid:"datachannel",kind:"application",oldDataChannelSpec:e});this._addMediaSection(t)}getSdp(){return this._sdpObject.origin.sessionVersion++,r.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 s=this._midToIndex.get(t);if(void 0===s)throw new Error(`no media section found for reuseMid '${t}'`);const r=this._mediaSections[s];this._mediaSections[s]=e,this._midToIndex.delete(r.mid),this._midToIndex.set(e.mid,s),this._sdpObject.media[s]=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(" "))}}},1425:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.updateV1State=void 0;const r=s(2291),i=s(6011),a={};function n(e,t,s){return e.msecs??=-1/0,e.nsecs??=0,t===e.msecs?(e.nsecs++,e.nsecs>=1e4&&(e.node=void 0,e.nsecs=0)):t>e.msecs?e.nsecs=0:t= 16");if(a){if(n<0||n+16>a.length)throw new RangeError(`UUID byte range ${n}:${n+15} is out of buffer bounds`)}else a=new Uint8Array(16),n=0;t??=Date.now(),s??=0,r??=16383&(e[8]<<8|e[9]),i??=e.slice(10,16);const o=(1e4*(268435455&(t+=122192928e5))+s)%4294967296;a[n++]=o>>>24&255,a[n++]=o>>>16&255,a[n++]=o>>>8&255,a[n++]=255&o;const c=t/4294967296*1e4&268435455;a[n++]=c>>>8&255,a[n++]=255&c,a[n++]=c>>>24&15|16,a[n++]=c>>>16&255,a[n++]=r>>>8|128,a[n++]=255&r;for(let e=0;e<6;++e)a[n++]=i[e];return a}t.updateV1State=n,t.default=function(e,t,s){let c;const d=e?._v6??!1;if(e){const t=Object.keys(e);1===t.length&&"_v6"===t[0]&&(e=void 0)}if(e)c=o(e.random??e.rng?.()??(0,r.default)(),e.msecs,e.nsecs,e.clockseq,e.node,t,s);else{const e=Date.now(),i=(0,r.default)();n(a,e,i),c=o(i,a.msecs,a.nsecs,d?void 0:a.clockseq,d?void 0:a.node,t,s)}return t??(0,i.unsafeStringify)(c)}},1765:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.clone=function(e){return void 0===e?void 0:Number.isNaN(e)?NaN:"function"==typeof structuredClone?structuredClone(e):JSON.parse(JSON.stringify(e))},t.generateRandomNumber=function(){return Math.round(1e7*Math.random())},t.deepFreeze=function e(t){const s=Reflect.ownKeys(t);for(const r of s){const s=t[r];(s&&"object"==typeof s||"function"==typeof s)&&e(s)}return Object.freeze(t)}},1767:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Firefox60=void 0;const r=s(7363),i=s(2994),a=s(4893),n=s(1765),o=s(8046),c=s(5544),d=s(5938),p=s(521),l=s(1305),h=s(3303),m=new i.Logger("Firefox60"),u={OS:16,MIS:2048};class f extends p.HandlerInterface{_closed=!1;_direction;_remoteSdp;_sendingRtpParametersByKind;_sendingRemoteRtpParametersByKind;_pc;_mapMidTransceiver=new Map;_sendStream=new MediaStream;_hasDataChannelMediaSection=!1;_nextSendSctpStreamId=0;_transportReady=!1;static createFactory(){return()=>new f}constructor(){super()}get name(){return"Firefox60"}close(){if(m.debug("close()"),!this._closed){if(this._closed=!0,this._pc)try{this._pc.close()}catch(e){}this.emit("@close")}}async getNativeRtpCapabilities(){m.debug("getNativeRtpCapabilities()");const e=new RTCPeerConnection({iceServers:[],iceTransportPolicy:"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require"}),t=document.createElement("canvas");t.getContext("2d");const s=t.captureStream().getVideoTracks()[0];try{e.addTransceiver("audio",{direction:"sendrecv"});const i=e.addTransceiver(s,{direction:"sendrecv"}),a=i.sender.getParameters(),n=[{rid:"r0",maxBitrate:1e5},{rid:"r1",maxBitrate:5e5}];a.encodings=n,await i.sender.setParameters(a);const o=await e.createOffer();try{t.remove()}catch(e){}try{s.stop()}catch(e){}try{e.close()}catch(e){}const d=r.parse(o.sdp);return c.extractRtpCapabilities({sdpObject:d})}catch(r){try{t.remove()}catch(e){}try{s.stop()}catch(e){}try{e.close()}catch(e){}throw r}}async getNativeSctpCapabilities(){return m.debug("getNativeSctpCapabilities()"),{numStreams:u}}run({direction:e,iceParameters:t,iceCandidates:s,dtlsParameters:r,sctpParameters:i,iceServers:a,iceTransportPolicy:n,additionalSettings:c,proprietaryConstraints:d,extendedRtpCapabilities:p}){this.assertNotClosed(),m.debug("run()"),this._direction=e,this._remoteSdp=new l.RemoteSdp({iceParameters:t,iceCandidates:s,dtlsParameters:r,sctpParameters:i}),this._sendingRtpParametersByKind={audio:o.getSendingRtpParameters("audio",p),video:o.getSendingRtpParameters("video",p)},this._sendingRemoteRtpParametersByKind={audio:o.getSendingRemoteRtpParameters("audio",p),video:o.getSendingRemoteRtpParameters("video",p)},this._pc=new RTCPeerConnection({iceServers:a??[],iceTransportPolicy:n??"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require",...c},d),this._pc.addEventListener("icegatheringstatechange",(()=>{this.emit("@icegatheringstatechange",this._pc.iceGatheringState)})),this._pc.addEventListener("icecandidateerror",(e=>{this.emit("@icecandidateerror",e)})),this._pc.connectionState?this._pc.addEventListener("connectionstatechange",(()=>{this.emit("@connectionstatechange",this._pc.connectionState)})):this._pc.addEventListener("iceconnectionstatechange",(()=>{switch(m.warn("run() | pc.connectionState not supported, using pc.iceConnectionState"),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")}}))}async updateIceServers(e){throw this.assertNotClosed(),new a.UnsupportedError("not supported")}async restartIce(e){if(this.assertNotClosed(),m.debug("restartIce()"),this._remoteSdp.updateIceParameters(e),this._transportReady)if("send"===this._direction){const e=await this._pc.createOffer({iceRestart:!0});m.debug("restartIce() | calling pc.setLocalDescription() [offer:%o]",e),await this._pc.setLocalDescription(e);const t={type:"answer",sdp:this._remoteSdp.getSdp()};m.debug("restartIce() | calling pc.setRemoteDescription() [answer:%o]",t),await this._pc.setRemoteDescription(t)}else{const e={type:"offer",sdp:this._remoteSdp.getSdp()};m.debug("restartIce() | calling pc.setRemoteDescription() [offer:%o]",e),await this._pc.setRemoteDescription(e);const t=await this._pc.createAnswer();m.debug("restartIce() | calling pc.setLocalDescription() [answer:%o]",t),await this._pc.setLocalDescription(t)}}async getTransportStats(){return this.assertNotClosed(),this._pc.getStats()}async send({track:e,encodings:t,codecOptions:s,codec:i}){this.assertNotClosed(),this.assertSendDirection(),m.debug("send() [kind:%s, track.id:%s]",e.kind,e.id),t&&((t=n.clone(t)).forEach(((e,t)=>{e.rid=`r${t}`})),t.reverse());const a=n.clone(this._sendingRtpParametersByKind[e.kind]);a.codecs=o.reduceCodecs(a.codecs,i);const p=n.clone(this._sendingRemoteRtpParametersByKind[e.kind]);p.codecs=o.reduceCodecs(p.codecs,i);const l=this._pc.addTransceiver(e,{direction:"sendonly",streams:[this._sendStream]});if(t){const e=l.sender.getParameters();e.encodings=t,await l.sender.setParameters(e)}const u=await this._pc.createOffer();let f=r.parse(u.sdp);f.extmapAllowMixed&&this._remoteSdp.setSessionExtmapAllowMixed(),this._transportReady||await this.setupTransport({localDtlsRole:"client",localSdpObject:f});const g=(0,h.parse)((t??[{}])[0].scalabilityMode);m.debug("send() | calling pc.setLocalDescription() [offer:%o]",u),await this._pc.setLocalDescription(u);const _=l.mid;a.mid=_,f=r.parse(this._pc.localDescription.sdp);const w=f.media[f.media.length-1];if(a.rtcp.cname=c.getCname({offerMediaObject:w}),t)if(1===t.length){const e=d.getRtpEncodings({offerMediaObject:w});Object.assign(e[0],t[0]),a.encodings=e}else a.encodings=t.reverse();else a.encodings=d.getRtpEncodings({offerMediaObject:w});if(a.encodings.length>1&&("video/vp8"===a.codecs[0].mimeType.toLowerCase()||"video/h264"===a.codecs[0].mimeType.toLowerCase()))for(const e of a.encodings)e.scalabilityMode?e.scalabilityMode=`L1T${g.temporalLayers}`:e.scalabilityMode="L1T3";this._remoteSdp.send({offerMediaObject:w,offerRtpParameters:a,answerRtpParameters:p,codecOptions:s});const b={type:"answer",sdp:this._remoteSdp.getSdp()};return m.debug("send() | calling pc.setRemoteDescription() [answer:%o]",b),await this._pc.setRemoteDescription(b),this._mapMidTransceiver.set(_,l),{localId:_,rtpParameters:a,rtpSender:l.sender}}async stopSending(e){if(this.assertSendDirection(),m.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 s=await this._pc.createOffer();m.debug("stopSending() | calling pc.setLocalDescription() [offer:%o]",s),await this._pc.setLocalDescription(s);const r={type:"answer",sdp:this._remoteSdp.getSdp()};m.debug("stopSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r),this._mapMidTransceiver.delete(e)}async pauseSending(e){this.assertNotClosed(),this.assertSendDirection(),m.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 s=await this._pc.createOffer();m.debug("pauseSending() | calling pc.setLocalDescription() [offer:%o]",s),await this._pc.setLocalDescription(s);const r={type:"answer",sdp:this._remoteSdp.getSdp()};m.debug("pauseSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r)}async resumeSending(e){this.assertNotClosed(),this.assertSendDirection(),m.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 s=await this._pc.createOffer();m.debug("resumeSending() | calling pc.setLocalDescription() [offer:%o]",s),await this._pc.setLocalDescription(s);const r={type:"answer",sdp:this._remoteSdp.getSdp()};m.debug("resumeSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r)}async replaceTrack(e,t){this.assertNotClosed(),this.assertSendDirection(),t?m.debug("replaceTrack() [localId:%s, track.id:%s]",e,t.id):m.debug("replaceTrack() [localId:%s, no track]",e);const s=this._mapMidTransceiver.get(e);if(!s)throw new Error("associated RTCRtpTransceiver not found");await s.sender.replaceTrack(t)}async setMaxSpatialLayer(e,t){this.assertNotClosed(),this.assertSendDirection(),m.debug("setMaxSpatialLayer() [localId:%s, spatialLayer:%s]",e,t);const s=this._mapMidTransceiver.get(e);if(!s)throw new Error("associated transceiver not found");const r=s.sender.getParameters();t=r.encodings.length-1-t,r.encodings.forEach(((e,s)=>{e.active=s>=t})),await s.sender.setParameters(r),this._remoteSdp.muxMediaSectionSimulcast(e,r.encodings);const i=await this._pc.createOffer();m.debug("setMaxSpatialLayer() | calling pc.setLocalDescription() [offer:%o]",i),await this._pc.setLocalDescription(i);const a={type:"answer",sdp:this._remoteSdp.getSdp()};m.debug("setMaxSpatialLayer() | calling pc.setRemoteDescription() [answer:%o]",a),await this._pc.setRemoteDescription(a)}async setRtpEncodingParameters(e,t){this.assertNotClosed(),this.assertSendDirection(),m.debug("setRtpEncodingParameters() [localId:%s, params:%o]",e,t);const s=this._mapMidTransceiver.get(e);if(!s)throw new Error("associated RTCRtpTransceiver not found");const r=s.sender.getParameters();r.encodings.forEach(((e,s)=>{r.encodings[s]={...e,...t}})),await s.sender.setParameters(r),this._remoteSdp.muxMediaSectionSimulcast(e,r.encodings);const i=await this._pc.createOffer();m.debug("setRtpEncodingParameters() | calling pc.setLocalDescription() [offer:%o]",i),await this._pc.setLocalDescription(i);const a={type:"answer",sdp:this._remoteSdp.getSdp()};m.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:e,maxPacketLifeTime:t,maxRetransmits:s,label:i,protocol:a}){this.assertNotClosed(),this.assertSendDirection();const n={negotiated:!0,id:this._nextSendSctpStreamId,ordered:e,maxPacketLifeTime:t,maxRetransmits:s,protocol:a};m.debug("sendDataChannel() [options:%o]",n);const o=this._pc.createDataChannel(i,n);if(this._nextSendSctpStreamId=++this._nextSendSctpStreamId%u.MIS,!this._hasDataChannelMediaSection){const e=await this._pc.createOffer(),t=r.parse(e.sdp),s=t.media.find((e=>"application"===e.type));this._transportReady||await this.setupTransport({localDtlsRole:"client",localSdpObject:t}),m.debug("sendDataChannel() | calling pc.setLocalDescription() [offer:%o]",e),await this._pc.setLocalDescription(e),this._remoteSdp.sendSctpAssociation({offerMediaObject:s});const i={type:"answer",sdp:this._remoteSdp.getSdp()};m.debug("sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]",i),await this._pc.setRemoteDescription(i),this._hasDataChannelMediaSection=!0}return{dataChannel:o,sctpStreamParameters:{streamId:n.id,ordered:n.ordered,maxPacketLifeTime:n.maxPacketLifeTime,maxRetransmits:n.maxRetransmits}}}async receive(e){this.assertNotClosed(),this.assertRecvDirection();const t=[],s=new Map;for(const t of e){const{trackId:e,kind:r,rtpParameters:i,streamId:a}=t;m.debug("receive() [trackId:%s, kind:%s]",e,r);const n=i.mid??String(this._mapMidTransceiver.size);s.set(e,n),this._remoteSdp.receive({mid:n,kind:r,offerRtpParameters:i,streamId:a??i.rtcp.cname,trackId:e})}const i={type:"offer",sdp:this._remoteSdp.getSdp()};m.debug("receive() | calling pc.setRemoteDescription() [offer:%o]",i),await this._pc.setRemoteDescription(i);let a=await this._pc.createAnswer();const n=r.parse(a.sdp);for(const t of e){const{trackId:e,rtpParameters:i}=t,o=s.get(e),d=n.media.find((e=>String(e.mid)===o));c.applyCodecParameters({offerRtpParameters:i,answerMediaObject:d}),a={type:"answer",sdp:r.write(n)}}this._transportReady||await this.setupTransport({localDtlsRole:"client",localSdpObject:n}),m.debug("receive() | calling pc.setLocalDescription() [answer:%o]",a),await this._pc.setLocalDescription(a);for(const r of e){const{trackId:e}=r,i=s.get(e),a=this._pc.getTransceivers().find((e=>e.mid===i));if(!a)throw new Error("new RTCRtpTransceiver not found");this._mapMidTransceiver.set(i,a),t.push({localId:i,track:a.receiver.track,rtpReceiver:a.receiver})}return t}async stopReceiving(e){if(this.assertRecvDirection(),this._closed)return;for(const t of e){m.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()};m.debug("stopReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const s=await this._pc.createAnswer();m.debug("stopReceiving() | calling pc.setLocalDescription() [answer:%o]",s),await this._pc.setLocalDescription(s);for(const t of e)this._mapMidTransceiver.delete(t)}async pauseReceiving(e){this.assertNotClosed(),this.assertRecvDirection();for(const t of e){m.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()};m.debug("pauseReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const s=await this._pc.createAnswer();m.debug("pauseReceiving() | calling pc.setLocalDescription() [answer:%o]",s),await this._pc.setLocalDescription(s)}async resumeReceiving(e){this.assertNotClosed(),this.assertRecvDirection();for(const t of e){m.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()};m.debug("resumeReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const s=await this._pc.createAnswer();m.debug("resumeReceiving() | calling pc.setLocalDescription() [answer:%o]",s),await this._pc.setLocalDescription(s)}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:e,label:t,protocol:s}){this.assertNotClosed(),this.assertRecvDirection();const{streamId:i,ordered:a,maxPacketLifeTime:n,maxRetransmits:o}=e,c={negotiated:!0,id:i,ordered:a,maxPacketLifeTime:n,maxRetransmits:o,protocol:s};m.debug("receiveDataChannel() [options:%o]",c);const d=this._pc.createDataChannel(t,c);if(!this._hasDataChannelMediaSection){this._remoteSdp.receiveSctpAssociation();const e={type:"offer",sdp:this._remoteSdp.getSdp()};m.debug("receiveDataChannel() | calling pc.setRemoteDescription() [offer:%o]",e),await this._pc.setRemoteDescription(e);const t=await this._pc.createAnswer();if(!this._transportReady){const e=r.parse(t.sdp);await this.setupTransport({localDtlsRole:"client",localSdpObject:e})}m.debug("receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]",t),await this._pc.setLocalDescription(t),this._hasDataChannelMediaSection=!0}return{dataChannel:d}}async setupTransport({localDtlsRole:e,localSdpObject:t}){t||(t=r.parse(this._pc.localDescription.sdp));const s=c.extractDtlsParameters({sdpObject:t});s.role=e,this._remoteSdp.updateDtlsRole("client"===e?"server":"client"),await new Promise(((e,t)=>{this.safeEmit("@connect",{dtlsParameters:s},e,t)})),this._transportReady=!0}assertNotClosed(){if(this._closed)throw new a.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')}}t.Firefox60=f},1797:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=s(9746);t.default=function(e){if(!(0,r.default)(e))throw TypeError("Invalid UUID");let t;return Uint8Array.of((t=parseInt(e.slice(0,8),16))>>>24,t>>>16&255,t>>>8&255,255&t,(t=parseInt(e.slice(9,13),16))>>>8,255&t,(t=parseInt(e.slice(14,18),16))>>>8,255&t,(t=parseInt(e.slice(19,23),16))>>>8,255&t,(t=parseInt(e.slice(24,36),16))/1099511627776&255,t/4294967296&255,t>>>24&255,t>>>16&255,t>>>8&255,255&t)}},2109:function(e,t,s){var r;!function(i,a){"use strict";var n,o="user-agent",c="",d="function",p="undefined",l="object",h="string",m="browser",u="cpu",f="device",g="engine",_="os",w="result",b="name",v="type",y="vendor",S="version",R="architecture",C="major",P="model",D="console",k="mobile",T="tablet",x="smarttv",L="wearable",E="xr",I="embedded",M="inapp",O="brands",j="formFactors",N="fullVersionList",A="platform",F="platformVersion",B="bitness",$="sec-ch-ua",z=$+"-full-version-list",U=$+"-arch",K=$+"-"+B,H=$+"-form-factors",q=$+"-"+k,G=$+"-"+P,V=$+"-"+A,Q=V+"-version",W=[O,N,k,P,A,F,R,j,B],X="Amazon",J="Apple",Y="ASUS",Z="BlackBerry",ee="Google",te="Huawei",se="Lenovo",re="Honor",ie="LG",ae="Microsoft",ne="Motorola",oe="Nvidia",ce="OnePlus",de="OPPO",pe="Samsung",le="Sharp",he="Sony",me="Xiaomi",ue="Zebra",fe="Chrome",ge="Chromium",_e="Chromecast",we="Edge",be="Firefox",ve="Opera",ye="Facebook",Se="Sogou",Re="Mobile ",Ce=" Browser",Pe="Windows",De=typeof i!==p,ke=De&&i.navigator?i.navigator:a,Te=ke&&ke.userAgentData?ke.userAgentData:a,xe=function(e){for(var t={},s=0;s0){for(var s in e)if(Oe(t)==Oe(e[s]))return!0;return!1}return!!Ie(e)&&Oe(t)==Oe(e)},Ee=function(e,t){for(var s in e)return/^(browser|cpu|device|engine|os)$/.test(s)||!!t&&Ee(e[s])},Ie=function(e){return typeof e===h},Me=function(e){if(!e)return a;for(var t=[],s=Ae(/\\?\"/g,e).split(","),r=0;r-1){var i=Be(s[r]).split(";v=");t[r]={brand:i[0],version:i[1]}}else t[r]=Be(s[r]);return t},Oe=function(e){return Ie(e)?e.toLowerCase():e},je=function(e){return Ie(e)?Ae(/[^\d\.]/g,e).split(".")[0]:a},Ne=function(e){for(var t in e){var s=e[t];typeof s==l&&2==s.length?this[s[0]]=s[1]:this[s]=a}return this},Ae=function(e,t){return Ie(t)?t.replace(e,c):t},Fe=function(e){return Ae(/\\?\"/g,e)},Be=function(e,t){if(Ie(e))return e=Ae(/^\s\s*/,e),typeof t===p?e:e.substring(0,500)},$e=function(e,t){if(e&&t)for(var s,r,i,n,o,c,p=0;p0?2===n.length?typeof n[1]==d?this[n[0]]=n[1].call(this,c):this[n[0]]=n[1]:n.length>=3&&(typeof n[1]!==d||n[1].exec&&n[1].test?3==n.length?this[n[0]]=c?c.replace(n[1],n[2]):a:4==n.length?this[n[0]]=c?n[3].call(this,c.replace(n[1],n[2])):a:n.length>4&&(this[n[0]]=c?n[3].apply(this,[c.replace(n[1],n[2])].concat(n.slice(4))):a):n.length>3?this[n[0]]=c?n[1].apply(this,n.slice(2)):a:this[n[0]]=c?n[1].call(this,c,n[2]):a):this[n]=c||a;p+=2}},ze=function(e,t){for(var s in t)if(typeof t[s]===l&&t[s].length>0){for(var r=0;r2&&this.set(P,"iPad").set(v,T);break;case _:!this.get(b)&&Te&&Te[A]&&this.set(b,Te[A]);break;case w:var e=this.data,t=function(t){return e[t].getItem().detectFeature().get()};this.set(m,t(m)).set(u,t(u)).set(f,t(f)).set(g,t(g)).set(_,t(_))}return this},this.parseUA=function(){return this.itemType!=w&&$e.call(this.data,this.ua,this.rgxMap),this.itemType==m&&this.set(C,je(this.get(S))),this},this.parseCH=function(){var e=this.uaCH,t=this.rgxMap;switch(this.itemType){case m:case g:var s,r=e[N]||e[O];if(r)for(var i in r){var n=r[i].brand||r[i],o=r[i].version;this.itemType==m&&!/not.a.brand/i.test(n)&&(!s||/Chrom/.test(s)&&n!=ge||s==we&&/WebView2/.test(n))&&(n=ze(n,He),(s=this.get(b))&&!/Chrom/.test(s)&&/Chrom/.test(n)||this.set(b,n).set(S,o).set(C,je(o)),s=n),this.itemType==g&&n==ge&&this.set(S,o)}break;case u:var c=e[R];c&&(c&&"64"==e[B]&&(c+="64"),$e.call(this.data,c+";",t));break;case f:if(e[k]&&this.set(v,k),e[P]&&(this.set(P,e[P]),!this.get(v)||!this.get(y))){var d={};$e.call(d,"droid 9; "+e[P]+")",t),!this.get(v)&&d.type&&this.set(v,d.type),!this.get(y)&&d.vendor&&this.set(y,d.vendor)}if(e[j]){var p;if("string"!=typeof e[j])for(var l=0;!p&&l=13?"11":"10"),this.set(b,h).set(S,D)}this.get(b)==Pe&&"Xbox"==e[P]&&this.set(b,"Xbox").set(S,a);break;case w:var T=this.data,x=function(t){return T[t].getItem().setCH(e).parseCH().get()};this.set(m,x(m)).set(u,x(u)).set(f,x(f)).set(g,x(g)).set(_,x(_))}return this},Ne.call(this,[["itemType",e],["ua",t],["uaCH",r],["rgxMap",s],["data",Ve(this,e)]]),this}function Xe(e,t,s){if(typeof e===l?(Ee(e,!0)?(typeof t===l&&(s=t),t=e):(s=e,t=a),e=a):typeof e!==h||Ee(t,!0)||(s=t,t=a),s&&typeof s.append===d){var r={};s.forEach((function(e,t){r[t]=e})),s=r}if(!(this instanceof Xe))return new Xe(e,t,s).getResult();var i=typeof e===h?e:s&&s[o]?s[o]:ke&&ke.userAgent?ke.userAgent:c,n=new Qe(s,!0),p=t?function(e,t){var s={},r=t;if(!Ee(t))for(var i in r={},t)for(var a in t[i])r[a]=t[i][a].concat(r[a]?r[a]:[]);for(var n in e)s[n]=r[n]&&r[n].length%2==0?r[n].concat(e[n]):e[n];return s}(qe,t):qe,b=function(e){return e==w?function(){return new We(e,i,p,n).set("ua",i).set(m,this.getBrowser()).set(u,this.getCPU()).set(f,this.getDevice()).set(g,this.getEngine()).set(_,this.getOS()).get()}:function(){return new We(e,i,p[e],n).parseUA().get()}};return Ne.call(this,[["getBrowser",b(m)],["getCPU",b(u)],["getDevice",b(f)],["getEngine",b(g)],["getOS",b(_)],["getResult",b(w)],["getUA",function(){return i}],["setUA",function(e){return Ie(e)&&(i=e.length>500?Be(e,500):e),this}]]).setUA(i),this}Xe.VERSION="2.0.4",Xe.BROWSER=xe([b,S,C,v]),Xe.CPU=xe([R]),Xe.DEVICE=xe([P,y,v,D,k,x,T,L,I]),Xe.ENGINE=Xe.OS=xe([b,S]),typeof t!==p?(e.exports&&(t=e.exports=Xe),t.UAParser=Xe):s.amdO?(r=function(){return Xe}.call(t,s,t,e))===a||(e.exports=r):De&&(i.UAParser=Xe);var Je=De&&(i.jQuery||i.Zepto);if(Je&&!Je.ua){var Ye=new Xe;Je.ua=Ye.getResult(),Je.ua.get=function(){return Ye.getUA()},Je.ua.set=function(e){Ye.setUA(e);var t=Ye.getResult();for(var s in t)Je.ua[s]=t[s]}}}("object"==typeof window?window:this)},2183:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Chrome111=void 0;const r=s(7363),i=s(2994),a=s(1765),n=s(8046),o=s(5544),c=s(5938),d=s(4256),p=s(4893),l=s(521),h=s(1305),m=s(3303),u=new i.Logger("Chrome111"),f={OS:1024,MIS:1024};class g extends l.HandlerInterface{_closed=!1;_direction;_remoteSdp;_sendingRtpParametersByKind;_sendingRemoteRtpParametersByKind;_forcedLocalDtlsRole;_pc;_mapMidTransceiver=new Map;_sendStream=new MediaStream;_hasDataChannelMediaSection=!1;_nextSendSctpStreamId=0;_transportReady=!1;static createFactory(){return()=>new g}constructor(){super()}get name(){return"Chrome111"}close(){if(u.debug("close()"),!this._closed){if(this._closed=!0,this._pc)try{this._pc.close()}catch(e){}this.emit("@close")}}async getNativeRtpCapabilities(){u.debug("getNativeRtpCapabilities()");const e=new RTCPeerConnection({iceServers:[],iceTransportPolicy:"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require",sdpSemantics:"unified-plan"});try{e.addTransceiver("audio"),e.addTransceiver("video",{sendEncodings:[{scalabilityMode:"L3T3"}]});const t=await e.createOffer();try{e.close()}catch(e){}const s=r.parse(t.sdp),i=o.extractRtpCapabilities({sdpObject:s});return d.addNackSupportForOpus(i),i}catch(t){try{e.close()}catch(e){}throw t}}async getNativeSctpCapabilities(){return u.debug("getNativeSctpCapabilities()"),{numStreams:f}}run({direction:e,iceParameters:t,iceCandidates:s,dtlsParameters:r,sctpParameters:i,iceServers:a,iceTransportPolicy:o,additionalSettings:c,proprietaryConstraints:d,extendedRtpCapabilities:p}){this.assertNotClosed(),u.debug("run()"),this._direction=e,this._remoteSdp=new h.RemoteSdp({iceParameters:t,iceCandidates:s,dtlsParameters:r,sctpParameters:i}),this._sendingRtpParametersByKind={audio:n.getSendingRtpParameters("audio",p),video:n.getSendingRtpParameters("video",p)},this._sendingRemoteRtpParametersByKind={audio:n.getSendingRemoteRtpParameters("audio",p),video:n.getSendingRemoteRtpParameters("video",p)},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",sdpSemantics:"unified-plan",...c},d),this._pc.addEventListener("icegatheringstatechange",(()=>{this.emit("@icegatheringstatechange",this._pc.iceGatheringState)})),this._pc.addEventListener("icecandidateerror",(e=>{this.emit("@icecandidateerror",e)})),this._pc.connectionState?this._pc.addEventListener("connectionstatechange",(()=>{this.emit("@connectionstatechange",this._pc.connectionState)})):(u.warn("run() | pc.connectionState not supported, using pc.iceConnectionState"),this._pc.addEventListener("iceconnectionstatechange",(()=>{switch(this._pc.iceConnectionState){case"checking":this.emit("@connectionstatechange","connecting");break;case"connected":case"completed":this.emit("@connectionstatechange","connected");break;case"failed":this.emit("@connectionstatechange","failed");break;case"disconnected":this.emit("@connectionstatechange","disconnected");break;case"closed":this.emit("@connectionstatechange","closed")}})))}async updateIceServers(e){this.assertNotClosed(),u.debug("updateIceServers()");const t=this._pc.getConfiguration();t.iceServers=e,this._pc.setConfiguration(t)}async restartIce(e){if(this.assertNotClosed(),u.debug("restartIce()"),this._remoteSdp.updateIceParameters(e),this._transportReady)if("send"===this._direction){const e=await this._pc.createOffer({iceRestart:!0});u.debug("restartIce() | calling pc.setLocalDescription() [offer:%o]",e),await this._pc.setLocalDescription(e);const t={type:"answer",sdp:this._remoteSdp.getSdp()};u.debug("restartIce() | calling pc.setRemoteDescription() [answer:%o]",t),await this._pc.setRemoteDescription(t)}else{const e={type:"offer",sdp:this._remoteSdp.getSdp()};u.debug("restartIce() | calling pc.setRemoteDescription() [offer:%o]",e),await this._pc.setRemoteDescription(e);const t=await this._pc.createAnswer();u.debug("restartIce() | calling pc.setLocalDescription() [answer:%o]",t),await this._pc.setLocalDescription(t)}}async getTransportStats(){return this.assertNotClosed(),this._pc.getStats()}async send({track:e,encodings:t,codecOptions:s,codec:i,onRtpSender:d}){if(this.assertNotClosed(),this.assertSendDirection(),u.debug("send() [kind:%s, track.id:%s]",e.kind,e.id),t&&t.length>1){let e=1;for(const s of t){const t=s.scalabilityMode?(0,m.parse)(s.scalabilityMode).temporalLayers:3;t>e&&(e=t)}t.forEach(((t,s)=>{t.rid=`r${s}`,t.scalabilityMode=`L1T${e}`}))}const p=a.clone(this._sendingRtpParametersByKind[e.kind]);p.codecs=n.reduceCodecs(p.codecs,i);const l=a.clone(this._sendingRemoteRtpParametersByKind[e.kind]);l.codecs=n.reduceCodecs(l.codecs,i);const h=this._remoteSdp.getNextMediaSectionIdx(),f=this._pc.addTransceiver(e,{direction:"sendonly",streams:[this._sendStream],sendEncodings:t});d&&d(f.sender);const g=await this._pc.createOffer();let _=r.parse(g.sdp);_.extmapAllowMixed&&this._remoteSdp.setSessionExtmapAllowMixed(),this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:_}),u.debug("send() | calling pc.setLocalDescription() [offer:%o]",g),await this._pc.setLocalDescription(g);const w=f.mid;p.mid=w,_=r.parse(this._pc.localDescription.sdp);const b=_.media[h.idx];if(p.rtcp.cname=o.getCname({offerMediaObject:b}),t)if(1===t.length){const e=c.getRtpEncodings({offerMediaObject:b});Object.assign(e[0],t[0]),p.encodings=e}else p.encodings=t;else p.encodings=c.getRtpEncodings({offerMediaObject:b});this._remoteSdp.send({offerMediaObject:b,reuseMid:h.reuseMid,offerRtpParameters:p,answerRtpParameters:l,codecOptions:s});const v={type:"answer",sdp:this._remoteSdp.getSdp()};return u.debug("send() | calling pc.setRemoteDescription() [answer:%o]",v),await this._pc.setRemoteDescription(v),this._mapMidTransceiver.set(w,f),{localId:w,rtpParameters:p,rtpSender:f.sender}}async stopSending(e){if(this.assertSendDirection(),u.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 s=await this._pc.createOffer();u.debug("stopSending() | calling pc.setLocalDescription() [offer:%o]",s),await this._pc.setLocalDescription(s);const r={type:"answer",sdp:this._remoteSdp.getSdp()};u.debug("stopSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r),this._mapMidTransceiver.delete(e)}async pauseSending(e){this.assertNotClosed(),this.assertSendDirection(),u.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 s=await this._pc.createOffer();u.debug("pauseSending() | calling pc.setLocalDescription() [offer:%o]",s),await this._pc.setLocalDescription(s);const r={type:"answer",sdp:this._remoteSdp.getSdp()};u.debug("pauseSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r)}async resumeSending(e){this.assertNotClosed(),this.assertSendDirection(),u.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 s=await this._pc.createOffer();u.debug("resumeSending() | calling pc.setLocalDescription() [offer:%o]",s),await this._pc.setLocalDescription(s);const r={type:"answer",sdp:this._remoteSdp.getSdp()};u.debug("resumeSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r)}async replaceTrack(e,t){this.assertNotClosed(),this.assertSendDirection(),t?u.debug("replaceTrack() [localId:%s, track.id:%s]",e,t.id):u.debug("replaceTrack() [localId:%s, no track]",e);const s=this._mapMidTransceiver.get(e);if(!s)throw new Error("associated RTCRtpTransceiver not found");await s.sender.replaceTrack(t)}async setMaxSpatialLayer(e,t){this.assertNotClosed(),this.assertSendDirection(),u.debug("setMaxSpatialLayer() [localId:%s, spatialLayer:%s]",e,t);const s=this._mapMidTransceiver.get(e);if(!s)throw new Error("associated RTCRtpTransceiver not found");const r=s.sender.getParameters();r.encodings.forEach(((e,s)=>{e.active=s<=t})),await s.sender.setParameters(r),this._remoteSdp.muxMediaSectionSimulcast(e,r.encodings);const i=await this._pc.createOffer();u.debug("setMaxSpatialLayer() | calling pc.setLocalDescription() [offer:%o]",i),await this._pc.setLocalDescription(i);const a={type:"answer",sdp:this._remoteSdp.getSdp()};u.debug("setMaxSpatialLayer() | calling pc.setRemoteDescription() [answer:%o]",a),await this._pc.setRemoteDescription(a)}async setRtpEncodingParameters(e,t){this.assertNotClosed(),this.assertSendDirection(),u.debug("setRtpEncodingParameters() [localId:%s, params:%o]",e,t);const s=this._mapMidTransceiver.get(e);if(!s)throw new Error("associated RTCRtpTransceiver not found");const r=s.sender.getParameters();r.encodings.forEach(((e,s)=>{r.encodings[s]={...e,...t}})),await s.sender.setParameters(r),this._remoteSdp.muxMediaSectionSimulcast(e,r.encodings);const i=await this._pc.createOffer();u.debug("setRtpEncodingParameters() | calling pc.setLocalDescription() [offer:%o]",i),await this._pc.setLocalDescription(i);const a={type:"answer",sdp:this._remoteSdp.getSdp()};u.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:e,maxPacketLifeTime:t,maxRetransmits:s,label:i,protocol:a}){this.assertNotClosed(),this.assertSendDirection();const n={negotiated:!0,id:this._nextSendSctpStreamId,ordered:e,maxPacketLifeTime:t,maxRetransmits:s,protocol:a};u.debug("sendDataChannel() [options:%o]",n);const o=this._pc.createDataChannel(i,n);if(this._nextSendSctpStreamId=++this._nextSendSctpStreamId%f.MIS,!this._hasDataChannelMediaSection){const e=await this._pc.createOffer(),t=r.parse(e.sdp),s=t.media.find((e=>"application"===e.type));this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:t}),u.debug("sendDataChannel() | calling pc.setLocalDescription() [offer:%o]",e),await this._pc.setLocalDescription(e),this._remoteSdp.sendSctpAssociation({offerMediaObject:s});const i={type:"answer",sdp:this._remoteSdp.getSdp()};u.debug("sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]",i),await this._pc.setRemoteDescription(i),this._hasDataChannelMediaSection=!0}return{dataChannel:o,sctpStreamParameters:{streamId:n.id,ordered:n.ordered,maxPacketLifeTime:n.maxPacketLifeTime,maxRetransmits:n.maxRetransmits}}}async receive(e){this.assertNotClosed(),this.assertRecvDirection();const t=[],s=new Map;for(const t of e){const{trackId:e,kind:r,rtpParameters:i,streamId:a}=t;u.debug("receive() [trackId:%s, kind:%s]",e,r);const n=i.mid??String(this._mapMidTransceiver.size);s.set(e,n),this._remoteSdp.receive({mid:n,kind:r,offerRtpParameters:i,streamId:a??i.rtcp.cname,trackId:e})}const i={type:"offer",sdp:this._remoteSdp.getSdp()};u.debug("receive() | calling pc.setRemoteDescription() [offer:%o]",i),await this._pc.setRemoteDescription(i);for(const t of e){const{trackId:e,onRtpReceiver:r}=t;if(r){const t=s.get(e),i=this._pc.getTransceivers().find((e=>e.mid===t));if(!i)throw new Error("transceiver not found");r(i.receiver)}}let a=await this._pc.createAnswer();const n=r.parse(a.sdp);for(const t of e){const{trackId:e,rtpParameters:r}=t,i=s.get(e),a=n.media.find((e=>String(e.mid)===i));o.applyCodecParameters({offerRtpParameters:r,answerMediaObject:a})}a={type:"answer",sdp:r.write(n)},this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:n}),u.debug("receive() | calling pc.setLocalDescription() [answer:%o]",a),await this._pc.setLocalDescription(a);for(const r of e){const{trackId:e}=r,i=s.get(e),a=this._pc.getTransceivers().find((e=>e.mid===i));if(!a)throw new Error("new RTCRtpTransceiver not found");this._mapMidTransceiver.set(i,a),t.push({localId:i,track:a.receiver.track,rtpReceiver:a.receiver})}return t}async stopReceiving(e){if(this.assertRecvDirection(),this._closed)return;for(const t of e){u.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()};u.debug("stopReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const s=await this._pc.createAnswer();u.debug("stopReceiving() | calling pc.setLocalDescription() [answer:%o]",s),await this._pc.setLocalDescription(s);for(const t of e)this._mapMidTransceiver.delete(t)}async pauseReceiving(e){this.assertNotClosed(),this.assertRecvDirection();for(const t of e){u.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()};u.debug("pauseReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const s=await this._pc.createAnswer();u.debug("pauseReceiving() | calling pc.setLocalDescription() [answer:%o]",s),await this._pc.setLocalDescription(s)}async resumeReceiving(e){this.assertNotClosed(),this.assertRecvDirection();for(const t of e){u.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()};u.debug("resumeReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const s=await this._pc.createAnswer();u.debug("resumeReceiving() | calling pc.setLocalDescription() [answer:%o]",s),await this._pc.setLocalDescription(s)}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:e,label:t,protocol:s}){this.assertNotClosed(),this.assertRecvDirection();const{streamId:i,ordered:a,maxPacketLifeTime:n,maxRetransmits:o}=e,c={negotiated:!0,id:i,ordered:a,maxPacketLifeTime:n,maxRetransmits:o,protocol:s};u.debug("receiveDataChannel() [options:%o]",c);const d=this._pc.createDataChannel(t,c);if(!this._hasDataChannelMediaSection){this._remoteSdp.receiveSctpAssociation();const e={type:"offer",sdp:this._remoteSdp.getSdp()};u.debug("receiveDataChannel() | calling pc.setRemoteDescription() [offer:%o]",e),await this._pc.setRemoteDescription(e);const t=await this._pc.createAnswer();if(!this._transportReady){const e=r.parse(t.sdp);await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:e})}u.debug("receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]",t),await this._pc.setLocalDescription(t),this._hasDataChannelMediaSection=!0}return{dataChannel:d}}async setupTransport({localDtlsRole:e,localSdpObject:t}){t||(t=r.parse(this._pc.localDescription.sdp));const s=o.extractDtlsParameters({sdpObject:t});s.role=e,this._remoteSdp.updateDtlsRole("client"===e?"server":"client"),await new Promise(((e,t)=>{this.safeEmit("@connect",{dtlsParameters:s},e,t)})),this._transportReady=!0}assertNotClosed(){if(this._closed)throw new p.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')}}t.Chrome111=g},2196:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default="ffffffff-ffff-ffff-ffff-ffffffffffff"},2291:(e,t)=>{"use strict";let s;Object.defineProperty(t,"__esModule",{value:!0});const r=new Uint8Array(16);t.default=function(){if(!s){if("undefined"==typeof crypto||!crypto.getRandomValues)throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");s=crypto.getRandomValues.bind(crypto)}return s(r)}},2292:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Firefox120=void 0;const r=s(7363),i=s(2994),a=s(4893),n=s(1765),o=s(8046),c=s(5544),d=s(5938),p=s(521),l=s(1305),h=s(3303),m=new i.Logger("Firefox120"),u={OS:16,MIS:2048};class f extends p.HandlerInterface{_closed=!1;_direction;_remoteSdp;_sendingRtpParametersByKind;_sendingRemoteRtpParametersByKind;_pc;_mapMidTransceiver=new Map;_sendStream=new MediaStream;_hasDataChannelMediaSection=!1;_nextSendSctpStreamId=0;_transportReady=!1;static createFactory(){return()=>new f}constructor(){super()}get name(){return"Firefox120"}close(){if(m.debug("close()"),!this._closed){if(this._closed=!0,this._pc)try{this._pc.close()}catch(e){}this.emit("@close")}}async getNativeRtpCapabilities(){m.debug("getNativeRtpCapabilities()");const e=new RTCPeerConnection({iceServers:[],iceTransportPolicy:"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require"}),t=document.createElement("canvas");t.getContext("2d");const s=t.captureStream().getVideoTracks()[0];try{e.addTransceiver("audio",{direction:"sendrecv"}),e.addTransceiver(s,{direction:"sendrecv",sendEncodings:[{rid:"r0",maxBitrate:1e5},{rid:"r1",maxBitrate:5e5}]});const i=await e.createOffer();try{t.remove()}catch(e){}try{s.stop()}catch(e){}try{e.close()}catch(e){}const a=r.parse(i.sdp);return c.extractRtpCapabilities({sdpObject:a})}catch(r){try{t.remove()}catch(e){}try{s.stop()}catch(e){}try{e.close()}catch(e){}throw r}}async getNativeSctpCapabilities(){return m.debug("getNativeSctpCapabilities()"),{numStreams:u}}run({direction:e,iceParameters:t,iceCandidates:s,dtlsParameters:r,sctpParameters:i,iceServers:a,iceTransportPolicy:n,additionalSettings:c,proprietaryConstraints:d,extendedRtpCapabilities:p}){this.assertNotClosed(),m.debug("run()"),this._direction=e,this._remoteSdp=new l.RemoteSdp({iceParameters:t,iceCandidates:s,dtlsParameters:r,sctpParameters:i}),this._sendingRtpParametersByKind={audio:o.getSendingRtpParameters("audio",p),video:o.getSendingRtpParameters("video",p)},this._sendingRemoteRtpParametersByKind={audio:o.getSendingRemoteRtpParameters("audio",p),video:o.getSendingRemoteRtpParameters("video",p)},this._pc=new RTCPeerConnection({iceServers:a??[],iceTransportPolicy:n??"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require",...c},d),this._pc.addEventListener("icegatheringstatechange",(()=>{this.emit("@icegatheringstatechange",this._pc.iceGatheringState)})),this._pc.addEventListener("icecandidateerror",(e=>{this.emit("@icecandidateerror",e)})),this._pc.connectionState?this._pc.addEventListener("connectionstatechange",(()=>{this.emit("@connectionstatechange",this._pc.connectionState)})):this._pc.addEventListener("iceconnectionstatechange",(()=>{switch(m.warn("run() | pc.connectionState not supported, using pc.iceConnectionState"),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")}}))}async updateIceServers(e){throw this.assertNotClosed(),new a.UnsupportedError("not supported")}async restartIce(e){if(this.assertNotClosed(),m.debug("restartIce()"),this._remoteSdp.updateIceParameters(e),this._transportReady)if("send"===this._direction){const e=await this._pc.createOffer({iceRestart:!0});m.debug("restartIce() | calling pc.setLocalDescription() [offer:%o]",e),await this._pc.setLocalDescription(e);const t={type:"answer",sdp:this._remoteSdp.getSdp()};m.debug("restartIce() | calling pc.setRemoteDescription() [answer:%o]",t),await this._pc.setRemoteDescription(t)}else{const e={type:"offer",sdp:this._remoteSdp.getSdp()};m.debug("restartIce() | calling pc.setRemoteDescription() [offer:%o]",e),await this._pc.setRemoteDescription(e);const t=await this._pc.createAnswer();m.debug("restartIce() | calling pc.setLocalDescription() [answer:%o]",t),await this._pc.setLocalDescription(t)}}async getTransportStats(){return this.assertNotClosed(),this._pc.getStats()}async send({track:e,encodings:t,codecOptions:s,codec:i,onRtpSender:a}){this.assertNotClosed(),this.assertSendDirection(),m.debug("send() [kind:%s, track.id:%s]",e.kind,e.id),t&&t.length>1&&t.forEach(((e,t)=>{e.rid=`r${t}`}));const p=n.clone(this._sendingRtpParametersByKind[e.kind]);p.codecs=o.reduceCodecs(p.codecs,i);const l=n.clone(this._sendingRemoteRtpParametersByKind[e.kind]);l.codecs=o.reduceCodecs(l.codecs,i);const u=this._pc.addTransceiver(e,{direction:"sendonly",streams:[this._sendStream],sendEncodings:t});a&&a(u.sender);const f=await this._pc.createOffer();let g=r.parse(f.sdp);g.extmapAllowMixed&&this._remoteSdp.setSessionExtmapAllowMixed(),this._transportReady||await this.setupTransport({localDtlsRole:"client",localSdpObject:g});const _=(0,h.parse)((t??[{}])[0].scalabilityMode);m.debug("send() | calling pc.setLocalDescription() [offer:%o]",f),await this._pc.setLocalDescription(f);const w=u.mid;p.mid=w,g=r.parse(this._pc.localDescription.sdp);const b=g.media[g.media.length-1];if(p.rtcp.cname=c.getCname({offerMediaObject:b}),t)if(1===t.length){const e=d.getRtpEncodings({offerMediaObject:b});Object.assign(e[0],t[0]),p.encodings=e}else p.encodings=t;else p.encodings=d.getRtpEncodings({offerMediaObject:b});if(p.encodings.length>1&&("video/vp8"===p.codecs[0].mimeType.toLowerCase()||"video/h264"===p.codecs[0].mimeType.toLowerCase()))for(const e of p.encodings)e.scalabilityMode?e.scalabilityMode=`L1T${_.temporalLayers}`:e.scalabilityMode="L1T3";this._remoteSdp.send({offerMediaObject:b,offerRtpParameters:p,answerRtpParameters:l,codecOptions:s});const v={type:"answer",sdp:this._remoteSdp.getSdp()};return m.debug("send() | calling pc.setRemoteDescription() [answer:%o]",v),await this._pc.setRemoteDescription(v),this._mapMidTransceiver.set(w,u),{localId:w,rtpParameters:p,rtpSender:u.sender}}async stopSending(e){if(this.assertSendDirection(),m.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 s=await this._pc.createOffer();m.debug("stopSending() | calling pc.setLocalDescription() [offer:%o]",s),await this._pc.setLocalDescription(s);const r={type:"answer",sdp:this._remoteSdp.getSdp()};m.debug("stopSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r),this._mapMidTransceiver.delete(e)}async pauseSending(e){this.assertNotClosed(),this.assertSendDirection(),m.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 s=await this._pc.createOffer();m.debug("pauseSending() | calling pc.setLocalDescription() [offer:%o]",s),await this._pc.setLocalDescription(s);const r={type:"answer",sdp:this._remoteSdp.getSdp()};m.debug("pauseSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r)}async resumeSending(e){this.assertNotClosed(),this.assertSendDirection(),m.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 s=await this._pc.createOffer();m.debug("resumeSending() | calling pc.setLocalDescription() [offer:%o]",s),await this._pc.setLocalDescription(s);const r={type:"answer",sdp:this._remoteSdp.getSdp()};m.debug("resumeSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r)}async replaceTrack(e,t){this.assertNotClosed(),this.assertSendDirection(),t?m.debug("replaceTrack() [localId:%s, track.id:%s]",e,t.id):m.debug("replaceTrack() [localId:%s, no track]",e);const s=this._mapMidTransceiver.get(e);if(!s)throw new Error("associated RTCRtpTransceiver not found");await s.sender.replaceTrack(t)}async setMaxSpatialLayer(e,t){this.assertNotClosed(),this.assertSendDirection(),m.debug("setMaxSpatialLayer() [localId:%s, spatialLayer:%s]",e,t);const s=this._mapMidTransceiver.get(e);if(!s)throw new Error("associated transceiver not found");const r=s.sender.getParameters();r.encodings.forEach(((e,s)=>{e.active=s<=t})),await s.sender.setParameters(r),this._remoteSdp.muxMediaSectionSimulcast(e,r.encodings);const i=await this._pc.createOffer();m.debug("setMaxSpatialLayer() | calling pc.setLocalDescription() [offer:%o]",i),await this._pc.setLocalDescription(i);const a={type:"answer",sdp:this._remoteSdp.getSdp()};m.debug("setMaxSpatialLayer() | calling pc.setRemoteDescription() [answer:%o]",a),await this._pc.setRemoteDescription(a)}async setRtpEncodingParameters(e,t){this.assertNotClosed(),this.assertSendDirection(),m.debug("setRtpEncodingParameters() [localId:%s, params:%o]",e,t);const s=this._mapMidTransceiver.get(e);if(!s)throw new Error("associated RTCRtpTransceiver not found");const r=s.sender.getParameters();r.encodings.forEach(((e,s)=>{r.encodings[s]={...e,...t}})),await s.sender.setParameters(r),this._remoteSdp.muxMediaSectionSimulcast(e,r.encodings);const i=await this._pc.createOffer();m.debug("setRtpEncodingParameters() | calling pc.setLocalDescription() [offer:%o]",i),await this._pc.setLocalDescription(i);const a={type:"answer",sdp:this._remoteSdp.getSdp()};m.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:e,maxPacketLifeTime:t,maxRetransmits:s,label:i,protocol:a}){this.assertNotClosed(),this.assertSendDirection();const n={negotiated:!0,id:this._nextSendSctpStreamId,ordered:e,maxPacketLifeTime:t,maxRetransmits:s,protocol:a};m.debug("sendDataChannel() [options:%o]",n);const o=this._pc.createDataChannel(i,n);if(this._nextSendSctpStreamId=++this._nextSendSctpStreamId%u.MIS,!this._hasDataChannelMediaSection){const e=await this._pc.createOffer(),t=r.parse(e.sdp),s=t.media.find((e=>"application"===e.type));this._transportReady||await this.setupTransport({localDtlsRole:"client",localSdpObject:t}),m.debug("sendDataChannel() | calling pc.setLocalDescription() [offer:%o]",e),await this._pc.setLocalDescription(e),this._remoteSdp.sendSctpAssociation({offerMediaObject:s});const i={type:"answer",sdp:this._remoteSdp.getSdp()};m.debug("sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]",i),await this._pc.setRemoteDescription(i),this._hasDataChannelMediaSection=!0}return{dataChannel:o,sctpStreamParameters:{streamId:n.id,ordered:n.ordered,maxPacketLifeTime:n.maxPacketLifeTime,maxRetransmits:n.maxRetransmits}}}async receive(e){this.assertNotClosed(),this.assertRecvDirection();const t=[],s=new Map;for(const t of e){const{trackId:e,kind:r,rtpParameters:i,streamId:a}=t;m.debug("receive() [trackId:%s, kind:%s]",e,r);const n=i.mid??String(this._mapMidTransceiver.size);s.set(e,n),this._remoteSdp.receive({mid:n,kind:r,offerRtpParameters:i,streamId:a??i.rtcp.cname,trackId:e})}const i={type:"offer",sdp:this._remoteSdp.getSdp()};m.debug("receive() | calling pc.setRemoteDescription() [offer:%o]",i),await this._pc.setRemoteDescription(i);for(const t of e){const{trackId:e,onRtpReceiver:r}=t;if(r){const t=s.get(e),i=this._pc.getTransceivers().find((e=>e.mid===t));if(!i)throw new Error("transceiver not found");r(i.receiver)}}let a=await this._pc.createAnswer();const n=r.parse(a.sdp);for(const t of e){const{trackId:e,rtpParameters:i}=t,o=s.get(e),d=n.media.find((e=>String(e.mid)===o));c.applyCodecParameters({offerRtpParameters:i,answerMediaObject:d}),a={type:"answer",sdp:r.write(n)}}this._transportReady||await this.setupTransport({localDtlsRole:"client",localSdpObject:n}),m.debug("receive() | calling pc.setLocalDescription() [answer:%o]",a),await this._pc.setLocalDescription(a);for(const r of e){const{trackId:e}=r,i=s.get(e),a=this._pc.getTransceivers().find((e=>e.mid===i));if(!a)throw new Error("new RTCRtpTransceiver not found");this._mapMidTransceiver.set(i,a),t.push({localId:i,track:a.receiver.track,rtpReceiver:a.receiver})}return t}async stopReceiving(e){if(this.assertRecvDirection(),this._closed)return;for(const t of e){m.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()};m.debug("stopReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const s=await this._pc.createAnswer();m.debug("stopReceiving() | calling pc.setLocalDescription() [answer:%o]",s),await this._pc.setLocalDescription(s);for(const t of e)this._mapMidTransceiver.delete(t)}async pauseReceiving(e){this.assertNotClosed(),this.assertRecvDirection();for(const t of e){m.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()};m.debug("pauseReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const s=await this._pc.createAnswer();m.debug("pauseReceiving() | calling pc.setLocalDescription() [answer:%o]",s),await this._pc.setLocalDescription(s)}async resumeReceiving(e){this.assertNotClosed(),this.assertRecvDirection();for(const t of e){m.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()};m.debug("resumeReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const s=await this._pc.createAnswer();m.debug("resumeReceiving() | calling pc.setLocalDescription() [answer:%o]",s),await this._pc.setLocalDescription(s)}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:e,label:t,protocol:s}){this.assertNotClosed(),this.assertRecvDirection();const{streamId:i,ordered:a,maxPacketLifeTime:n,maxRetransmits:o}=e,c={negotiated:!0,id:i,ordered:a,maxPacketLifeTime:n,maxRetransmits:o,protocol:s};m.debug("receiveDataChannel() [options:%o]",c);const d=this._pc.createDataChannel(t,c);if(!this._hasDataChannelMediaSection){this._remoteSdp.receiveSctpAssociation();const e={type:"offer",sdp:this._remoteSdp.getSdp()};m.debug("receiveDataChannel() | calling pc.setRemoteDescription() [offer:%o]",e),await this._pc.setRemoteDescription(e);const t=await this._pc.createAnswer();if(!this._transportReady){const e=r.parse(t.sdp);await this.setupTransport({localDtlsRole:"client",localSdpObject:e})}m.debug("receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]",t),await this._pc.setLocalDescription(t),this._hasDataChannelMediaSection=!0}return{dataChannel:d}}async setupTransport({localDtlsRole:e,localSdpObject:t}){t||(t=r.parse(this._pc.localDescription.sdp));const s=c.extractDtlsParameters({sdpObject:t});s.role=e,this._remoteSdp.updateDtlsRole("client"===e?"server":"client"),await new Promise(((e,t)=>{this.safeEmit("@connect",{dtlsParameters:s},e,t)})),this._transportReady=!0}assertNotClosed(){if(this._closed)throw new a.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')}}t.Firefox120=f},2731:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.FakeHandler=void 0;const r=s(5328),i=s(3953),a=s(2994),n=s(1765),o=s(8046),c=s(4893),d=s(521),p=new a.Logger("FakeHandler");class l extends i.EnhancedEventEmitter{id;ordered;maxPacketLifeTime;maxRetransmits;label;protocol;constructor({id:e,ordered:t,maxPacketLifeTime:s,maxRetransmits:r,label:i,protocol:a}){super(),this.id=e,this.ordered=t,this.maxPacketLifeTime=s,this.maxRetransmits=r,this.label=i,this.protocol=a}close(){this.safeEmit("close"),this.emit("@close")}send(e){this.safeEmit("message",e)}addEventListener(e,t){this.on(e,t)}}class h extends d.HandlerInterface{_closed=!1;fakeParameters;_rtpParametersByKind;_cname=`CNAME-${n.generateRandomNumber()}`;_transportReady=!1;_nextLocalId=1;_tracks=new Map;_nextSctpStreamId=0;static createFactory(e){return()=>new h(e)}constructor(e){super(),this.fakeParameters=e}get name(){return"FakeHandler"}close(){p.debug("close()"),this._closed||(this._closed=!0)}setIceGatheringState(e){this.emit("@icegatheringstatechange",e)}setConnectionState(e){this.emit("@connectionstatechange",e)}async getNativeRtpCapabilities(){return p.debug("getNativeRtpCapabilities()"),this.fakeParameters.generateNativeRtpCapabilities()}async getNativeSctpCapabilities(){return p.debug("getNativeSctpCapabilities()"),this.fakeParameters.generateNativeSctpCapabilities()}run({direction:e,iceParameters:t,iceCandidates:s,dtlsParameters:r,sctpParameters:i,iceServers:a,iceTransportPolicy:n,proprietaryConstraints:c,extendedRtpCapabilities:d}){this.assertNotClosed(),p.debug("run()"),this._rtpParametersByKind={audio:o.getSendingRtpParameters("audio",d),video:o.getSendingRtpParameters("video",d)}}async updateIceServers(e){this.assertNotClosed(),p.debug("updateIceServers()")}async restartIce(e){this.assertNotClosed(),p.debug("restartIce()")}async getTransportStats(){return this.assertNotClosed(),new Map}async send({track:e,encodings:t,codecOptions:s,codec:r}){this.assertNotClosed(),p.debug("send() [kind:%s, track.id:%s]",e.kind,e.id),this._transportReady||await this.setupTransport({localDtlsRole:"server"});const i=n.clone(this._rtpParametersByKind[e.kind]),a=i.codecs.some((e=>/.+\/rtx$/i.test(e.mimeType)));i.mid=`mid-${n.generateRandomNumber()}`,t||(t=[{}]);for(const e of t)e.ssrc=n.generateRandomNumber(),a&&(e.rtx={ssrc:n.generateRandomNumber()});i.encodings=t,i.rtcp={cname:this._cname,reducedSize:!0,mux:!0};const o=this._nextLocalId++;return this._tracks.set(o,e),{localId:String(o),rtpParameters:i}}async stopSending(e){if(p.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?p.debug("replaceTrack() [localId:%s, track.id:%s]",e,t.id):p.debug("replaceTrack() [localId:%s, no track]",e),this._tracks.delete(Number(e)),this._tracks.set(Number(e),t)}async setMaxSpatialLayer(e,t){this.assertNotClosed(),p.debug("setMaxSpatialLayer() [localId:%s, spatialLayer:%s]",e,t)}async setRtpEncodingParameters(e,t){this.assertNotClosed(),p.debug("setRtpEncodingParameters() [localId:%s, params:%o]",e,t)}async getSenderStats(e){return this.assertNotClosed(),new Map}async sendDataChannel({ordered:e,maxPacketLifeTime:t,maxRetransmits:s,label:r,protocol:i}){return this.assertNotClosed(),this._transportReady||await this.setupTransport({localDtlsRole:"server"}),p.debug("sendDataChannel()"),{dataChannel:new l({id:this._nextSctpStreamId++,ordered:e,maxPacketLifeTime:t,maxRetransmits:s,label:r,protocol:i}),sctpStreamParameters:{streamId:this._nextSctpStreamId,ordered:e,maxPacketLifeTime:t,maxRetransmits:s}}}async receive(e){this.assertNotClosed();const t=[];for(const s of e){const{trackId:e,kind:i}=s;this._transportReady||await this.setupTransport({localDtlsRole:"client"}),p.debug("receive() [trackId:%s, kind:%s]",e,i);const a=this._nextLocalId++,n=new r.FakeMediaStreamTrack({kind:i});this._tracks.set(a,n),t.push({localId:String(a),track:n})}return t}async stopReceiving(e){if(!this._closed)for(const t of e)p.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:s}){return this.assertNotClosed(),this._transportReady||await this.setupTransport({localDtlsRole:"client"}),p.debug("receiveDataChannel()"),{dataChannel:new l({id:e.streamId,ordered:e.ordered,maxPacketLifeTime:e.maxPacketLifeTime,maxRetransmits:e.maxRetransmits,label:t,protocol:s})}}async setupTransport({localDtlsRole:e,localSdpObject:t}){const s=n.clone(this.fakeParameters.generateLocalDtlsParameters());e&&(s.role=e),this.emit("@connectionstatechange","connecting"),await new Promise(((e,t)=>this.emit("@connect",{dtlsParameters:s},e,t))),this._transportReady=!0}assertNotClosed(){if(this._closed)throw new c.InvalidStateError("method called in a closed handler")}}t.FakeHandler=h},2770:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=s(9746);t.default=function(e){if(!(0,r.default)(e))throw TypeError("Invalid UUID");return parseInt(e.slice(14,15),16)}},2829:(e,t)=>{"use strict";function s(e,t,s,r){switch(e){case 0:return t&s^~t&r;case 1:case 3:return t^s^r;case 2:return t&s^t&r^s&r}}function r(e,t){return e<>>32-t}Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){const t=[1518500249,1859775393,2400959708,3395469782],i=[1732584193,4023233417,2562383102,271733878,3285377520],a=new Uint8Array(e.length+1);a.set(e),a[e.length]=128;const n=(e=a).length/4+2,o=Math.ceil(n/16),c=new Array(o);for(let t=0;t>>0;l=p,p=d,d=r(o,30)>>>0,o=n,n=c}i[0]=i[0]+n>>>0,i[1]=i[1]+o>>>0,i[2]=i[2]+d>>>0,i[3]=i[3]+p>>>0,i[4]=i[4]+l>>>0}return Uint8Array.of(i[0]>>24,i[0]>>16,i[0]>>8,i[0],i[1]>>24,i[1]>>16,i[1]>>8,i[1],i[2]>>24,i[2]>>16,i[2]>>8,i[2],i[3]>>24,i[3]>>16,i[3]>>8,i[3],i[4]>>24,i[4]>>16,i[4]>>8,i[4])}},2988:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.URL=t.DNS=t.stringToBytes=void 0;const r=s(1797),i=s(6011);function a(e){e=unescape(encodeURIComponent(e));const t=new Uint8Array(e.length);for(let s=0;s{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Logger=void 0;const r=s(7833),i="mediasoup-client";t.Logger=class{_debug;_warn;_error;constructor(e){e?(this._debug=(0,r.default)(`${i}:${e}`),this._warn=(0,r.default)(`${i}:WARN:${e}`),this._error=(0,r.default)(`${i}:ERROR:${e}`)):(this._debug=(0,r.default)(i),this._warn=(0,r.default)(`${i}:WARN`),this._error=(0,r.default)(`${i}: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}}},3200:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ProfileLevelId=t.Level=t.Profile=void 0,t.parseProfileLevelId=h,t.profileLevelIdToString=m,t.profileToString=function(e){switch(e){case i.ConstrainedBaseline:return"ConstrainedBaseline";case i.Baseline:return"Baseline";case i.Main:return"Main";case i.ConstrainedHigh:return"ConstrainedHigh";case i.High:return"High";case i.PredictiveHigh444:return"PredictiveHigh444";default:return void r.warn(`profileToString() | unrecognized profile ${e}`)}},t.levelToString=function(e){switch(e){case a.L1_b:return"1b";case a.L1:return"1";case a.L1_1:return"1.1";case a.L1_2:return"1.2";case a.L1_3:return"1.3";case a.L2:return"2";case a.L2_1:return"2.1";case a.L2_2:return"2.2";case a.L3:return"3";case a.L3_1:return"3.1";case a.L3_2:return"3.2";case a.L4:return"4";case a.L4_1:return"4.1";case a.L4_2:return"4.2";case a.L5:return"5";case a.L5_1:return"5.1";case a.L5_2:return"5.2";default:return void r.warn(`levelToString() | unrecognized level ${e}`)}},t.parseSdpProfileLevelId=u,t.isSameProfile=function(e={},t={}){const s=u(e),r=u(t);return Boolean(s&&r&&s.profile===r.profile)},t.isSameProfileAndLevel=function(e={},t={}){const s=u(e),r=u(t);return Boolean(s&&r&&s.profile===r.profile&&s.level==r.level)},t.generateProfileLevelIdStringForAnswer=function(e={},t={}){if(!e["profile-level-id"]&&!t["profile-level-id"])return void r.warn("generateProfileLevelIdStringForAnswer() | profile-level-id missing in local and remote params");const s=u(e),i=u(t);if(!s)throw new TypeError("invalid local_profile_level_id");if(!i)throw new TypeError("invalid remote_profile_level_id");if(s.profile!==i.profile)throw new TypeError("H264 Profile mismatch");const o=g(e)&&g(t),c=s.level,d=function(e,t){return e===a.L1_b?t!==a.L1&&t!==a.L1_b:t===a.L1_b?e!==a.L1:e=0;--s){const i=l[s];if(256*i.max_macroblock_frame_size<=e&&i.max_macroblocks_per_second<=t*i.max_macroblock_frame_size)return r.debug(`supportedLevel() | result [max_frame_pixel_count:${e}, max_fps:${t}, level:${i.level}]`),i.level}r.warn(`supportedLevel() | no level supported [max_frame_pixel_count:${e}, max_fps:${t}]`)};const r=new(s(3582).Logger);var i,a;!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"}(i||(t.Profile=i={})),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"}(a||(t.Level=a={}));class n{constructor(e,t){this.profile=e,this.level=t}}t.ProfileLevelId=n;const o=new n(i.ConstrainedBaseline,a.L3_1);class c{constructor(e){this.mask=~f("x",e),this.masked_value=f("1",e)}isMatch(e){return this.masked_value===(e&this.mask)}}class d{constructor(e,t,s){this.profile_idc=e,this.profile_iop=t,this.profile=s}}const p=[new d(66,new c("x1xx0000"),i.ConstrainedBaseline),new d(77,new c("1xxx0000"),i.ConstrainedBaseline),new d(88,new c("11xx0000"),i.ConstrainedBaseline),new d(66,new c("x0xx0000"),i.Baseline),new d(88,new c("10xx0000"),i.Baseline),new d(77,new c("0x0x0000"),i.Main),new d(100,new c("00000000"),i.High),new d(100,new c("00001100"),i.ConstrainedHigh),new d(244,new c("00000000"),i.PredictiveHigh444)],l=[{max_macroblocks_per_second:1485,max_macroblock_frame_size:99,level:a.L1},{max_macroblocks_per_second:1485,max_macroblock_frame_size:99,level:a.L1_b},{max_macroblocks_per_second:3e3,max_macroblock_frame_size:396,level:a.L1_1},{max_macroblocks_per_second:6e3,max_macroblock_frame_size:396,level:a.L1_2},{max_macroblocks_per_second:11880,max_macroblock_frame_size:396,level:a.L1_3},{max_macroblocks_per_second:11880,max_macroblock_frame_size:396,level:a.L2},{max_macroblocks_per_second:19800,max_macroblock_frame_size:792,level:a.L2_1},{max_macroblocks_per_second:20250,max_macroblock_frame_size:1620,level:a.L2_2},{max_macroblocks_per_second:40500,max_macroblock_frame_size:1620,level:a.L3},{max_macroblocks_per_second:108e3,max_macroblock_frame_size:3600,level:a.L3_1},{max_macroblocks_per_second:216e3,max_macroblock_frame_size:5120,level:a.L3_2},{max_macroblocks_per_second:245760,max_macroblock_frame_size:8192,level:a.L4},{max_macroblocks_per_second:245760,max_macroblock_frame_size:8192,level:a.L4_1},{max_macroblocks_per_second:522240,max_macroblock_frame_size:8704,level:a.L4_2},{max_macroblocks_per_second:589824,max_macroblock_frame_size:22080,level:a.L5},{max_macroblocks_per_second:983040,max_macroblock_frame_size:36864,level:a.L5_1},{max_macroblocks_per_second:2073600,max_macroblock_frame_size:36864,level:a.L5_2}];function h(e){if("string"!=typeof e||6!==e.length)return;const t=parseInt(e,16);if(0===t)return;const s=255&t,i=t>>8&255,o=t>>16&255;let c;switch(s){case a.L1_1:c=16&i?a.L1_b:a.L1_1;break;case a.L1:case a.L1_2:case a.L1_3:case a.L2:case a.L2_1:case a.L2_2:case a.L3:case a.L3_1:case a.L3_2:case a.L4:case a.L4_1:case a.L4_2:case a.L5:case a.L5_1:case a.L5_2:c=s;break;default:return void r.warn(`parseProfileLevelId() | unrecognized level_idc [str:${e}, level_idc:${s}]`)}for(const t of p)if(o===t.profile_idc&&t.profile_iop.isMatch(i))return r.debug(`parseProfileLevelId() | result [str:${e}, profile:${t.profile}, level:${c}]`),new n(t.profile,c);r.warn(`parseProfileLevelId() | unrecognized profile_idc/profile_iop combination [str:${e}, profile_idc:${o}, profile_iop:${i}]`)}function m(e){if(e.level==a.L1_b)switch(e.profile){case i.ConstrainedBaseline:return"42f00b";case i.Baseline:return"42100b";case i.Main:return"4d100b";default:return void r.warn(`profileLevelIdToString() | Level 1_b not is allowed for profile ${e.profile}`)}let t;switch(e.profile){case i.ConstrainedBaseline:t="42e0";break;case i.Baseline:t="4200";break;case i.Main:t="4d00";break;case i.ConstrainedHigh:t="640c";break;case i.High:t="6400";break;case i.PredictiveHigh444:t="f400";break;default:return void r.warn(`profileLevelIdToString() | unrecognized profile ${e.profile}`)}let s=e.level.toString(16);return 1===s.length&&(s=`0${s}`),`${t}${s}`}function u(e={}){const t=e["profile-level-id"];return t?h(t):o}function f(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 g(e={}){const t=e["level-asymmetry-allowed"];return!0===t||1===t||"1"===t}},3303:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.parse=function(e){const t=s.exec(e??"");return t?{spatialLayers:Number(t[1]),temporalLayers:Number(t[2])}:{spatialLayers:1,temporalLayers:1}};const s=new RegExp("^[LS]([1-9]\\d{0,1})T([1-9]\\d{0,1})")},3465:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default="00000000-0000-0000-0000-000000000000"},3471:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.OfferMediaSection=t.AnswerMediaSection=t.MediaSection=void 0;const r=s(7363),i=s(1765);class a{_mediaObject;_planB;constructor({iceParameters:e,iceCandidates:t,dtlsParameters:s,planB:r=!1}){if(this._mediaObject={},this._planB=r,e&&this.setIceParameters(e),t){this._mediaObject.candidates=[];for(const e of t){const t={component:1};t.foundation=e.foundation,t.ip=e.address??e.ip,t.port=e.port,t.priority=e.priority,t.transport=e.protocol,t.type=e.type,e.tcpType&&(t.tcptype=e.tcpType),this._mediaObject.candidates.push(t)}this._mediaObject.endOfCandidates="end-of-candidates",this._mediaObject.iceOptions="renomination"}s&&this.setDtlsRole(s.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(),delete this._mediaObject.ext,delete this._mediaObject.ssrcs,delete this._mediaObject.ssrcGroups,delete this._mediaObject.simulcast,delete this._mediaObject.simulcast_03,delete this._mediaObject.rids,delete this._mediaObject.extmapAllowMixed}close(){this.disable(),this._mediaObject.port=0}}function n(e){const t=new RegExp("^(audio|video)/(.+)","i").exec(e.mimeType);if(!t)throw new TypeError("invalid codec.mimeType");return t[2]}t.MediaSection=a,t.AnswerMediaSection=class extends a{constructor({iceParameters:e,iceCandidates:t,dtlsParameters:s,sctpParameters:r,plainRtpParameters:a,planB:o=!1,offerMediaObject:c,offerRtpParameters:d,answerRtpParameters:p,codecOptions:l}){switch(super({iceParameters:e,iceCandidates:t,dtlsParameters:s,planB:o}),this._mediaObject.mid=String(c.mid),this._mediaObject.type=c.type,this._mediaObject.protocol=c.protocol,a?(this._mediaObject.connection={ip:a.ip,version:a.ipVersion},this._mediaObject.port=a.port):(this._mediaObject.connection={ip:"127.0.0.1",version:4},this._mediaObject.port=7),c.type){case"audio":case"video":this._mediaObject.direction="recvonly",this._mediaObject.rtp=[],this._mediaObject.rtcpFb=[],this._mediaObject.fmtp=[];for(const e of p.codecs){const t={payload:e.payloadType,codec:n(e),rate:e.clockRate};e.channels>1&&(t.encoding=e.channels),this._mediaObject.rtp.push(t);const s=i.clone(e.parameters)??{};let r=i.clone(e.rtcpFeedback)??[];if(l){const{opusStereo:t,opusFec:i,opusDtx:a,opusMaxPlaybackRate:n,opusMaxAverageBitrate:o,opusPtime:c,opusNack:p,videoGoogleStartBitrate:h,videoGoogleMaxBitrate:m,videoGoogleMinBitrate:u}=l,f=d.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!==a&&(f.parameters.usedtx=a?1:0,s.usedtx=a?1:0),void 0!==n&&(s.maxplaybackrate=n),void 0!==o&&(s.maxaveragebitrate=o),void 0!==c&&(f.parameters.ptime=c,s.ptime=c),p||(f.rtcpFeedback=f.rtcpFeedback.filter((e=>"nack"!==e.type||e.parameter)),r=r.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!==m&&(s["x-google-max-bitrate"]=m),void 0!==u&&(s["x-google-min-bitrate"]=u)}}const a={payload:e.payloadType,config:""};for(const e of Object.keys(s))a.config&&(a.config+=";"),a.config+=`${e}=${s[e]}`;a.config&&this._mediaObject.fmtp.push(a);for(const t of r)this._mediaObject.rtcpFb.push({payload:e.payloadType,type:t.type,subtype:t.parameter})}this._mediaObject.payloads=p.codecs.map((e=>e.payloadType)).join(" "),this._mediaObject.ext=[];for(const e of p.headerExtensions)(c.ext??[]).some((t=>t.uri===e.uri))&&this._mediaObject.ext.push({uri:e.uri,value:e.id});if("extmap-allow-mixed"===c.extmapAllowMixed&&(this._mediaObject.extmapAllowMixed="extmap-allow-mixed"),c.simulcast){this._mediaObject.simulcast={dir1:"recv",list1:c.simulcast.list1},this._mediaObject.rids=[];for(const e of c.rids??[])"send"===e.direction&&this._mediaObject.rids.push({id:e.id,direction:"recv"})}else if(c.simulcast_03){this._mediaObject.simulcast_03={value:c.simulcast_03.value.replace(/send/g,"recv")},this._mediaObject.rids=[];for(const e of c.rids??[])"send"===e.direction&&this._mediaObject.rids.push({id:e.id,direction:"recv"})}this._mediaObject.rtcpMux="rtcp-mux",this._mediaObject.rtcpRsize="rtcp-rsize",this._planB&&"video"===this._mediaObject.type&&(this._mediaObject.xGoogleFlag="conference");break;case"application":"number"==typeof c.sctpPort?(this._mediaObject.payloads="webrtc-datachannel",this._mediaObject.sctpPort=r.port,this._mediaObject.maxMessageSize=r.maxMessageSize):c.sctpmap&&(this._mediaObject.payloads=r.port,this._mediaObject.sctpmap={app:"webrtc-datachannel",sctpmapNumber:r.port,maxMessageSize:r.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(e){if(!this._mediaObject.simulcast?.list1)return;const t={};for(const s of e)s.rid&&(t[s.rid]=s);const s=this._mediaObject.simulcast.list1,i=r.parseSimulcastStreamList(s);for(const e of i)for(const s of e)s.paused=!t[s.scid]?.active;this._mediaObject.simulcast.list1=i.map((e=>e.map((e=>`${e.paused?"~":""}${e.scid}`)).join(","))).join(";")}},t.OfferMediaSection=class extends a{constructor({iceParameters:e,iceCandidates:t,dtlsParameters:s,sctpParameters:r,plainRtpParameters:i,planB:a=!1,mid:o,kind:c,offerRtpParameters:d,streamId:p,trackId:l,oldDataChannelSpec:h=!1}){switch(super({iceParameters:e,iceCandidates:t,dtlsParameters:s,planB:a}),this._mediaObject.mid=String(o),this._mediaObject.type=c,i?(this._mediaObject.connection={ip:i.ip,version:i.ipVersion},this._mediaObject.protocol="RTP/AVP",this._mediaObject.port=i.port):(this._mediaObject.connection={ip:"127.0.0.1",version:4},this._mediaObject.protocol=r?"UDP/DTLS/SCTP":"UDP/TLS/RTP/SAVPF",this._mediaObject.port=7),this._mediaObject.extmapAllowMixed="extmap-allow-mixed",c){case"audio":case"video":{this._mediaObject.direction="sendonly",this._mediaObject.rtp=[],this._mediaObject.rtcpFb=[],this._mediaObject.fmtp=[],this._planB||(this._mediaObject.msid=`${p??"-"} ${l}`);for(const e of d.codecs){const t={payload:e.payloadType,codec:n(e),rate:e.clockRate};e.channels>1&&(t.encoding=e.channels),this._mediaObject.rtp.push(t);const s={payload:e.payloadType,config:""};for(const t of Object.keys(e.parameters))s.config&&(s.config+=";"),s.config+=`${t}=${e.parameters[t]}`;s.config&&this._mediaObject.fmtp.push(s);for(const t of e.rtcpFeedback)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)this._mediaObject.ext.push({uri:e.uri,value:e.id});this._mediaObject.rtcpMux="rtcp-mux",this._mediaObject.rtcpRsize="rtcp-rsize";const e=d.encodings[0],t=e.ssrc,s=e.rtx?.ssrc;this._mediaObject.ssrcs=[],this._mediaObject.ssrcGroups=[],d.rtcp.cname&&this._mediaObject.ssrcs.push({id:t,attribute:"cname",value:d.rtcp.cname}),this._planB&&this._mediaObject.ssrcs.push({id:t,attribute:"msid",value:`${p??"-"} ${l}`}),s&&(d.rtcp.cname&&this._mediaObject.ssrcs.push({id:s,attribute:"cname",value:d.rtcp.cname}),this._planB&&this._mediaObject.ssrcs.push({id:s,attribute:"msid",value:`${p??"-"} ${l}`}),this._mediaObject.ssrcGroups.push({semantics:"FID",ssrcs:`${t} ${s}`}));break}case"application":h?(this._mediaObject.payloads=r.port,this._mediaObject.sctpmap={app:"webrtc-datachannel",sctpmapNumber:r.port,maxMessageSize:r.maxMessageSize}):(this._mediaObject.payloads="webrtc-datachannel",this._mediaObject.sctpPort=r.port,this._mediaObject.maxMessageSize=r.maxMessageSize)}}setDtlsRole(e){this._mediaObject.setup="actpass"}resume(){this._mediaObject.direction="sendonly"}planBReceive({offerRtpParameters:e,streamId:t,trackId:s}){const r=e.encodings[0],i=r.ssrc,a=r.rtx?.ssrc,o=this._mediaObject.payloads.split(" ");for(const t of e.codecs){if(o.includes(String(t.payloadType)))continue;const e={payload:t.payloadType,codec:n(t),rate:t.clockRate};t.channels>1&&(e.encoding=t.channels),this._mediaObject.rtp.push(e);const s={payload:t.payloadType,config:""};for(const e of Object.keys(t.parameters))s.config&&(s.config+=";"),s.config+=`${e}=${t.parameters[e]}`;s.config&&this._mediaObject.fmtp.push(s);for(const e of t.rtcpFeedback)this._mediaObject.rtcpFb.push({payload:t.payloadType,type:e.type,subtype:e.parameter})}this._mediaObject.payloads+=` ${e.codecs.filter((e=>!this._mediaObject.payloads.includes(e.payloadType))).map((e=>e.payloadType)).join(" ")}`,this._mediaObject.payloads=this._mediaObject.payloads.trim(),e.rtcp.cname&&this._mediaObject.ssrcs.push({id:i,attribute:"cname",value:e.rtcp.cname}),this._mediaObject.ssrcs.push({id:i,attribute:"msid",value:`${t??"-"} ${s}`}),a&&(e.rtcp.cname&&this._mediaObject.ssrcs.push({id:a,attribute:"cname",value:e.rtcp.cname}),this._mediaObject.ssrcs.push({id:a,attribute:"msid",value:`${t??"-"} ${s}`}),this._mediaObject.ssrcGroups.push({semantics:"FID",ssrcs:`${i} ${a}`}))}planBStopReceiving({offerRtpParameters:e}){const t=e.encodings[0],s=t.ssrc,r=t.rtx?.ssrc;this._mediaObject.ssrcs=this._mediaObject.ssrcs.filter((e=>e.id!==s&&e.id!==r)),r&&(this._mediaObject.ssrcGroups=this._mediaObject.ssrcGroups.filter((e=>e.ssrcs!==`${s} ${r}`)))}}},3518:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Consumer=void 0;const r=s(2994),i=s(3953),a=s(4893),n=new r.Logger("Consumer");class o extends i.EnhancedEventEmitter{_id;_localId;_producerId;_closed=!1;_rtpReceiver;_track;_rtpParameters;_paused;_appData;_observer=new i.EnhancedEventEmitter;constructor({id:e,localId:t,producerId:s,rtpReceiver:r,track:i,rtpParameters:a,appData:o}){super(),n.debug("constructor()"),this._id=e,this._localId=t,this._producerId=s,this._rtpReceiver=r,this._track=i,this._rtpParameters=a,this._paused=!i.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||(n.debug("close()"),this._closed=!0,this.destroyTrack(),this.emit("@close"),this._observer.safeEmit("close"))}transportClosed(){this._closed||(n.debug("transportClosed()"),this._closed=!0,this.destroyTrack(),this.safeEmit("transportclose"),this._observer.safeEmit("close"))}async getStats(){if(this._closed)throw new a.InvalidStateError("closed");return new Promise(((e,t)=>{this.safeEmit("@getstats",e,t)}))}pause(){n.debug("pause()"),this._closed?n.error("pause() | Consumer closed"):this._paused?n.debug("pause() | Consumer is already paused"):(this._paused=!0,this._track.enabled=!1,this.emit("@pause"),this._observer.safeEmit("pause"))}resume(){n.debug("resume()"),this._closed?n.error("resume() | Consumer closed"):this._paused?(this._paused=!1,this._track.enabled=!0,this.emit("@resume"),this._observer.safeEmit("resume")):n.debug("resume() | Consumer is already resumed")}onTrackEnded(){n.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){}}}t.Consumer=o},3582:function(e,t,s){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.Logger=void 0;const i=r(s(7833)),a="h264-profile-level-id";t.Logger=class{constructor(e){e?(this._debug=(0,i.default)(`${a}:${e}`),this._warn=(0,i.default)(`${a}:WARN:${e}`),this._error=(0,i.default)(`${a}:ERROR:${e}`)):(this._debug=(0,i.default)(a),this._warn=(0,i.default)(`${a}:WARN`),this._error=(0,i.default)(`${a}: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}}},3779:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const s="undefined"!=typeof crypto&&crypto.randomUUID&&crypto.randomUUID.bind(crypto);t.default={randomUUID:s}},3785:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.clone=function(e){return void 0===e?void 0:Number.isNaN(e)?NaN:"function"==typeof structuredClone?structuredClone(e):JSON.parse(JSON.stringify(e))}},3804:(e,t,s)=>{var r=s(5602),i=/%[sdv%]/g,a=function(e){var t=1,s=arguments,r=s.length;return e.replace(i,(function(e){if(t>=r)return e;var i=s[t];switch(t+=1,e){case"%%":return"%";case"%s":return String(i);case"%d":return Number(i);case"%v":return""}}))},n=function(e,t,s){var r=[e+"="+(t.format instanceof Function?t.format(t.push?s:s[t.name]):t.format)];if(t.names)for(var i=0;i{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.EnhancedEventEmitter=void 0;const r=s(9596),i=new(s(2994).Logger)("EnhancedEventEmitter");class a extends r.EventEmitter{constructor(){super(),this.setMaxListeners(1/0)}emit(e,...t){return super.emit(e,...t)}safeEmit(e,...t){try{return super.emit(e,...t)}catch(t){i.error("safeEmit() | event listener threw an error [eventName:%s]:%o",e,t);try{super.emit("listenererror",e,t)}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)}}t.EnhancedEventEmitter=a},4039:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ReactNativeUnifiedPlan=void 0;const r=s(7363),i=s(2994),a=s(1765),n=s(8046),o=s(5544),c=s(5938),d=s(4256),p=s(4893),l=s(521),h=s(1305),m=s(3303),u=new i.Logger("ReactNativeUnifiedPlan"),f={OS:1024,MIS:1024};class g extends l.HandlerInterface{_closed=!1;_direction;_remoteSdp;_sendingRtpParametersByKind;_sendingRemoteRtpParametersByKind;_forcedLocalDtlsRole;_pc;_mapMidTransceiver=new Map;_sendStream=new MediaStream;_hasDataChannelMediaSection=!1;_nextSendSctpStreamId=0;_transportReady=!1;static createFactory(){return()=>new g}constructor(){super()}get name(){return"ReactNativeUnifiedPlan"}close(){if(u.debug("close()"),!this._closed){if(this._closed=!0,this._sendStream.release(!1),this._pc)try{this._pc.close()}catch(e){}this.emit("@close")}}async getNativeRtpCapabilities(){u.debug("getNativeRtpCapabilities()");const e=new RTCPeerConnection({iceServers:[],iceTransportPolicy:"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require",sdpSemantics:"unified-plan"});try{e.addTransceiver("audio"),e.addTransceiver("video");const t=await e.createOffer();try{e.close()}catch(e){}const s=r.parse(t.sdp),i=o.extractRtpCapabilities({sdpObject:s});return d.addNackSupportForOpus(i),i}catch(t){try{e.close()}catch(e){}throw t}}async getNativeSctpCapabilities(){return u.debug("getNativeSctpCapabilities()"),{numStreams:f}}run({direction:e,iceParameters:t,iceCandidates:s,dtlsParameters:r,sctpParameters:i,iceServers:a,iceTransportPolicy:o,additionalSettings:c,proprietaryConstraints:d,extendedRtpCapabilities:p}){this.assertNotClosed(),u.debug("run()"),this._direction=e,this._remoteSdp=new h.RemoteSdp({iceParameters:t,iceCandidates:s,dtlsParameters:r,sctpParameters:i}),this._sendingRtpParametersByKind={audio:n.getSendingRtpParameters("audio",p),video:n.getSendingRtpParameters("video",p)},this._sendingRemoteRtpParametersByKind={audio:n.getSendingRemoteRtpParameters("audio",p),video:n.getSendingRemoteRtpParameters("video",p)},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",sdpSemantics:"unified-plan",...c},d),this._pc.addEventListener("icegatheringstatechange",(()=>{this.emit("@icegatheringstatechange",this._pc.iceGatheringState)})),this._pc.addEventListener("icecandidateerror",(e=>{this.emit("@icecandidateerror",e)})),this._pc.connectionState?this._pc.addEventListener("connectionstatechange",(()=>{this.emit("@connectionstatechange",this._pc.connectionState)})):this._pc.addEventListener("iceconnectionstatechange",(()=>{switch(u.warn("run() | pc.connectionState not supported, using pc.iceConnectionState"),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")}}))}async updateIceServers(e){this.assertNotClosed(),u.debug("updateIceServers()");const t=this._pc.getConfiguration();t.iceServers=e,this._pc.setConfiguration(t)}async restartIce(e){if(this.assertNotClosed(),u.debug("restartIce()"),this._remoteSdp.updateIceParameters(e),this._transportReady)if("send"===this._direction){const e=await this._pc.createOffer({iceRestart:!0});u.debug("restartIce() | calling pc.setLocalDescription() [offer:%o]",e),await this._pc.setLocalDescription(e);const t={type:"answer",sdp:this._remoteSdp.getSdp()};u.debug("restartIce() | calling pc.setRemoteDescription() [answer:%o]",t),await this._pc.setRemoteDescription(t)}else{const e={type:"offer",sdp:this._remoteSdp.getSdp()};u.debug("restartIce() | calling pc.setRemoteDescription() [offer:%o]",e),await this._pc.setRemoteDescription(e);const t=await this._pc.createAnswer();u.debug("restartIce() | calling pc.setLocalDescription() [answer:%o]",t),await this._pc.setLocalDescription(t)}}async getTransportStats(){return this.assertNotClosed(),this._pc.getStats()}async send({track:e,encodings:t,codecOptions:s,codec:i,onRtpSender:d}){this.assertNotClosed(),this.assertSendDirection(),u.debug("send() [kind:%s, track.id:%s]",e.kind,e.id),t&&t.length>1&&t.forEach(((e,t)=>{e.rid=`r${t}`}));const p=a.clone(this._sendingRtpParametersByKind[e.kind]);p.codecs=n.reduceCodecs(p.codecs,i);const l=a.clone(this._sendingRemoteRtpParametersByKind[e.kind]);l.codecs=n.reduceCodecs(l.codecs,i);const h=this._remoteSdp.getNextMediaSectionIdx(),f=this._pc.addTransceiver(e,{direction:"sendonly",streams:[this._sendStream],sendEncodings:t});d&&d(f.sender);let g,_=await this._pc.createOffer(),w=r.parse(_.sdp);w.extmapAllowMixed&&this._remoteSdp.setSessionExtmapAllowMixed(),this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:w});let b=!1;const v=(0,m.parse)((t??[{}])[0].scalabilityMode);t&&1===t.length&&v.spatialLayers>1&&"video/vp9"===p.codecs[0].mimeType.toLowerCase()&&(u.debug("send() | enabling legacy simulcast for VP9 SVC"),b=!0,w=r.parse(_.sdp),g=w.media[h.idx],c.addLegacySimulcast({offerMediaObject:g,numStreams:v.spatialLayers}),_={type:"offer",sdp:r.write(w)}),u.debug("send() | calling pc.setLocalDescription() [offer:%o]",_),await this._pc.setLocalDescription(_);let y=f.mid??void 0;if(y||u.warn("send() | missing transceiver.mid (bug in react-native-webrtc, using a workaround"),p.mid=y,w=r.parse(this._pc.localDescription.sdp),g=w.media[h.idx],p.rtcp.cname=o.getCname({offerMediaObject:g}),t)if(1===t.length){let e=c.getRtpEncodings({offerMediaObject:g});Object.assign(e[0],t[0]),b&&(e=[e[0]]),p.encodings=e}else p.encodings=t;else p.encodings=c.getRtpEncodings({offerMediaObject:g});if(p.encodings.length>1&&("video/vp8"===p.codecs[0].mimeType.toLowerCase()||"video/h264"===p.codecs[0].mimeType.toLowerCase()))for(const e of p.encodings)e.scalabilityMode?e.scalabilityMode=`L1T${v.temporalLayers}`:e.scalabilityMode="L1T3";this._remoteSdp.send({offerMediaObject:g,reuseMid:h.reuseMid,offerRtpParameters:p,answerRtpParameters:l,codecOptions:s});const S={type:"answer",sdp:this._remoteSdp.getSdp()};return u.debug("send() | calling pc.setRemoteDescription() [answer:%o]",S),await this._pc.setRemoteDescription(S),y||(y=f.mid,p.mid=y),this._mapMidTransceiver.set(y,f),{localId:y,rtpParameters:p,rtpSender:f.sender}}async stopSending(e){if(this.assertSendDirection(),this._closed)return;u.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 s=await this._pc.createOffer();u.debug("stopSending() | calling pc.setLocalDescription() [offer:%o]",s),await this._pc.setLocalDescription(s);const r={type:"answer",sdp:this._remoteSdp.getSdp()};u.debug("stopSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r),this._mapMidTransceiver.delete(e)}async pauseSending(e){this.assertNotClosed(),this.assertSendDirection(),u.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 s=await this._pc.createOffer();u.debug("pauseSending() | calling pc.setLocalDescription() [offer:%o]",s),await this._pc.setLocalDescription(s);const r={type:"answer",sdp:this._remoteSdp.getSdp()};u.debug("pauseSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r)}async resumeSending(e){this.assertNotClosed(),this.assertSendDirection(),u.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 s=await this._pc.createOffer();u.debug("resumeSending() | calling pc.setLocalDescription() [offer:%o]",s),await this._pc.setLocalDescription(s);const r={type:"answer",sdp:this._remoteSdp.getSdp()};u.debug("resumeSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r)}async replaceTrack(e,t){this.assertNotClosed(),this.assertSendDirection(),t?u.debug("replaceTrack() [localId:%s, track.id:%s]",e,t.id):u.debug("replaceTrack() [localId:%s, no track]",e);const s=this._mapMidTransceiver.get(e);if(!s)throw new Error("associated RTCRtpTransceiver not found");await s.sender.replaceTrack(t)}async setMaxSpatialLayer(e,t){this.assertNotClosed(),this.assertSendDirection(),u.debug("setMaxSpatialLayer() [localId:%s, spatialLayer:%s]",e,t);const s=this._mapMidTransceiver.get(e);if(!s)throw new Error("associated RTCRtpTransceiver not found");const r=s.sender.getParameters();r.encodings.forEach(((e,s)=>{e.active=s<=t})),await s.sender.setParameters(r),this._remoteSdp.muxMediaSectionSimulcast(e,r.encodings);const i=await this._pc.createOffer();u.debug("setMaxSpatialLayer() | calling pc.setLocalDescription() [offer:%o]",i),await this._pc.setLocalDescription(i);const a={type:"answer",sdp:this._remoteSdp.getSdp()};u.debug("setMaxSpatialLayer() | calling pc.setRemoteDescription() [answer:%o]",a),await this._pc.setRemoteDescription(a)}async setRtpEncodingParameters(e,t){this.assertNotClosed(),this.assertSendDirection(),u.debug("setRtpEncodingParameters() [localId:%s, params:%o]",e,t);const s=this._mapMidTransceiver.get(e);if(!s)throw new Error("associated RTCRtpTransceiver not found");const r=s.sender.getParameters();r.encodings.forEach(((e,s)=>{r.encodings[s]={...e,...t}})),await s.sender.setParameters(r),this._remoteSdp.muxMediaSectionSimulcast(e,r.encodings);const i=await this._pc.createOffer();u.debug("setRtpEncodingParameters() | calling pc.setLocalDescription() [offer:%o]",i),await this._pc.setLocalDescription(i);const a={type:"answer",sdp:this._remoteSdp.getSdp()};u.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:e,maxPacketLifeTime:t,maxRetransmits:s,label:i,protocol:a}){this.assertNotClosed(),this.assertSendDirection();const n={negotiated:!0,id:this._nextSendSctpStreamId,ordered:e,maxPacketLifeTime:t,maxRetransmits:s,protocol:a};u.debug("sendDataChannel() [options:%o]",n);const o=this._pc.createDataChannel(i,n);if(this._nextSendSctpStreamId=++this._nextSendSctpStreamId%f.MIS,!this._hasDataChannelMediaSection){const e=await this._pc.createOffer(),t=r.parse(e.sdp),s=t.media.find((e=>"application"===e.type));this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:t}),u.debug("sendDataChannel() | calling pc.setLocalDescription() [offer:%o]",e),await this._pc.setLocalDescription(e),this._remoteSdp.sendSctpAssociation({offerMediaObject:s});const i={type:"answer",sdp:this._remoteSdp.getSdp()};u.debug("sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]",i),await this._pc.setRemoteDescription(i),this._hasDataChannelMediaSection=!0}return{dataChannel:o,sctpStreamParameters:{streamId:n.id,ordered:n.ordered,maxPacketLifeTime:n.maxPacketLifeTime,maxRetransmits:n.maxRetransmits}}}async receive(e){this.assertNotClosed(),this.assertRecvDirection();const t=[],s=new Map;for(const t of e){const{trackId:e,kind:r,rtpParameters:i,streamId:a}=t;u.debug("receive() [trackId:%s, kind:%s]",e,r);const n=i.mid??String(this._mapMidTransceiver.size);s.set(e,n),this._remoteSdp.receive({mid:n,kind:r,offerRtpParameters:i,streamId:a??i.rtcp.cname,trackId:e})}const i={type:"offer",sdp:this._remoteSdp.getSdp()};u.debug("receive() | calling pc.setRemoteDescription() [offer:%o]",i),await this._pc.setRemoteDescription(i);for(const t of e){const{trackId:e,onRtpReceiver:r}=t;if(r){const t=s.get(e),i=this._pc.getTransceivers().find((e=>e.mid===t));if(!i)throw new Error("transceiver not found");r(i.receiver)}}let a=await this._pc.createAnswer();const n=r.parse(a.sdp);for(const t of e){const{trackId:e,rtpParameters:r}=t,i=s.get(e),a=n.media.find((e=>String(e.mid)===i));o.applyCodecParameters({offerRtpParameters:r,answerMediaObject:a})}a={type:"answer",sdp:r.write(n)},this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:n}),u.debug("receive() | calling pc.setLocalDescription() [answer:%o]",a),await this._pc.setLocalDescription(a);for(const r of e){const{trackId:e}=r,i=s.get(e),a=this._pc.getTransceivers().find((e=>e.mid===i));if(!a)throw new Error("new RTCRtpTransceiver not found");this._mapMidTransceiver.set(i,a),t.push({localId:i,track:a.receiver.track,rtpReceiver:a.receiver})}return t}async stopReceiving(e){if(this.assertRecvDirection(),this._closed)return;for(const t of e){u.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()};u.debug("stopReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const s=await this._pc.createAnswer();u.debug("stopReceiving() | calling pc.setLocalDescription() [answer:%o]",s),await this._pc.setLocalDescription(s);for(const t of e)this._mapMidTransceiver.delete(t)}async pauseReceiving(e){this.assertNotClosed(),this.assertRecvDirection();for(const t of e){u.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()};u.debug("pauseReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const s=await this._pc.createAnswer();u.debug("pauseReceiving() | calling pc.setLocalDescription() [answer:%o]",s),await this._pc.setLocalDescription(s)}async resumeReceiving(e){this.assertNotClosed(),this.assertRecvDirection();for(const t of e){u.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()};u.debug("resumeReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const s=await this._pc.createAnswer();u.debug("resumeReceiving() | calling pc.setLocalDescription() [answer:%o]",s),await this._pc.setLocalDescription(s)}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:e,label:t,protocol:s}){this.assertNotClosed(),this.assertRecvDirection();const{streamId:i,ordered:a,maxPacketLifeTime:n,maxRetransmits:o}=e,c={negotiated:!0,id:i,ordered:a,maxPacketLifeTime:n,maxRetransmits:o,protocol:s};u.debug("receiveDataChannel() [options:%o]",c);const d=this._pc.createDataChannel(t,c);if(!this._hasDataChannelMediaSection){this._remoteSdp.receiveSctpAssociation();const e={type:"offer",sdp:this._remoteSdp.getSdp()};u.debug("receiveDataChannel() | calling pc.setRemoteDescription() [offer:%o]",e),await this._pc.setRemoteDescription(e);const t=await this._pc.createAnswer();if(!this._transportReady){const e=r.parse(t.sdp);await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:e})}u.debug("receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]",t),await this._pc.setLocalDescription(t),this._hasDataChannelMediaSection=!0}return{dataChannel:d}}async setupTransport({localDtlsRole:e,localSdpObject:t}){t||(t=r.parse(this._pc.localDescription.sdp));const s=o.extractDtlsParameters({sdpObject:t});s.role=e,this._remoteSdp.updateDtlsRole("client"===e?"server":"client"),await new Promise(((e,t)=>{this.safeEmit("@connect",{dtlsParameters:s},e,t)})),this._transportReady=!0}assertNotClosed(){if(this._closed)throw new p.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')}}t.ReactNativeUnifiedPlan=g},4160:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},4253:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.AwaitQueueRemovedTaskError=t.AwaitQueueStoppedError=void 0;class s extends Error{constructor(e){super(e??"queue stopped"),this.name="AwaitQueueStoppedError","function"==typeof Error.captureStackTrace&&Error.captureStackTrace(this,s)}}t.AwaitQueueStoppedError=s;class r extends Error{constructor(e){super(e??"queue task removed"),this.name="AwaitQueueRemovedTaskError","function"==typeof Error.captureStackTrace&&Error.captureStackTrace(this,r)}}t.AwaitQueueRemovedTaskError=r},4256:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.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"}))}},4299:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.updateV7State=void 0;const r=s(2291),i=s(6011),a={};function n(e,t,s){return e.msecs??=-1/0,e.seq??=0,t>e.msecs?(e.seq=s[6]<<23|s[7]<<16|s[8]<<8|s[9],e.msecs=t):(e.seq=e.seq+1|0,0===e.seq&&e.msecs++),e}function o(e,t,s,r,i=0){if(e.length<16)throw new Error("Random bytes length must be >= 16");if(r){if(i<0||i+16>r.length)throw new RangeError(`UUID byte range ${i}:${i+15} is out of buffer bounds`)}else r=new Uint8Array(16),i=0;return t??=Date.now(),s??=127*e[6]<<24|e[7]<<16|e[8]<<8|e[9],r[i++]=t/1099511627776&255,r[i++]=t/4294967296&255,r[i++]=t/16777216&255,r[i++]=t/65536&255,r[i++]=t/256&255,r[i++]=255&t,r[i++]=112|s>>>28&15,r[i++]=s>>>20&255,r[i++]=128|s>>>14&63,r[i++]=s>>>6&255,r[i++]=s<<2&255|3&e[10],r[i++]=e[11],r[i++]=e[12],r[i++]=e[13],r[i++]=e[14],r[i++]=e[15],r}t.updateV7State=n,t.default=function(e,t,s){let c;if(e)c=o(e.random??e.rng?.()??(0,r.default)(),e.msecs,e.seq,t,s);else{const e=Date.now(),i=(0,r.default)();n(a,e,i),c=o(i,a.msecs,a.seq,t,s)}return t??(0,i.unsafeStringify)(c)}},4496:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getRtpEncodings=function({offerMediaObject:e,track:t}){let s;const r=new Set;for(const i of e.ssrcs??[])if("msid"===i.attribute&&i.value.split(" ")[1]===t.id){const e=i.id;r.add(e),s||(s=e)}if(0===r.size)throw new Error(`a=ssrc line with msid information not found [track.id:${t.id}]`);const i=new Map;for(const t of e.ssrcGroups??[]){if("FID"!==t.semantics)continue;let[e,s]=t.ssrcs.split(/\s+/);e=Number(e),s=Number(s),r.has(e)&&(r.delete(e),r.delete(s),i.set(e,s))}for(const e of r)i.set(e,null);const a=[];for(const[e,t]of i){const s={ssrc:e};t&&(s.rtx={ssrc:t}),a.push(s)}return a},t.addLegacySimulcast=function({offerMediaObject:e,track:t,numStreams:s}){if(s<=1)throw new TypeError("numStreams must be greater than 1");let r,i,a;if(!(e.ssrcs??[]).find((e=>"msid"===e.attribute&&(e.value.split(" ")[1]===t.id&&(r=e.id,a=e.value.split(" ")[0],!0)))))throw new Error(`a=ssrc line with msid information not found [track.id:${t.id}]`);(e.ssrcGroups??[]).some((e=>{if("FID"!==e.semantics)return!1;const t=e.ssrcs.split(/\s+/);return Number(t[0])===r&&(i=Number(t[1]),!0)}));const n=e.ssrcs.find((e=>"cname"===e.attribute&&e.id===r));if(!n)throw new Error(`a=ssrc line with cname information not found [track.id:${t.id}]`);const o=n.value,c=[],d=[];for(let e=0;e{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.URL=t.DNS=void 0;const r=s(2829),i=s(2988);var a=s(2988);function n(e,t,s,a){return(0,i.default)(80,r.default,e,t,s,a)}Object.defineProperty(t,"DNS",{enumerable:!0,get:function(){return a.DNS}}),Object.defineProperty(t,"URL",{enumerable:!0,get:function(){return a.URL}}),n.DNS=i.DNS,n.URL=i.URL,t.default=n},4893:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.InvalidStateError=t.UnsupportedError=void 0;class s extends Error{constructor(e){super(e),this.name="UnsupportedError",Error.hasOwnProperty("captureStackTrace")?Error.captureStackTrace(this,s):this.stack=new Error(e).stack}}t.UnsupportedError=s;class r extends Error{constructor(e){super(e),this.name="InvalidStateError",Error.hasOwnProperty("captureStackTrace")?Error.captureStackTrace(this,r):this.stack=new Error(e).stack}}t.InvalidStateError=r},5020:(e,t,s)=>{var r=function(e){return String(Number(e))===e?Number(e):e},i=function(e,t,s){var i=e.name&&e.names;e.push&&!t[e.push]?t[e.push]=[]:i&&!t[e.name]&&(t[e.name]={});var a=e.push?{}:i?t[e.name]:t;!function(e,t,s,i){if(i&&!s)t[i]=r(e[1]);else for(var a=0;a1&&(e[s[0]]=void 0),e};t.parseParams=function(e){return e.split(/;\s?/).reduce(o,{})},t.parseFmtpConfig=t.parseParams,t.parsePayloads=function(e){return e.toString().split(" ").map(Number)},t.parseRemoteCandidates=function(e){for(var t=[],s=e.split(" ").map(r),i=0;i{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.generateRouterRtpCapabilities=function(){return r.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:"video",uri:"http://tools.ietf.org/html/draft-ietf-avtext-framemarking-07",preferredId:6,preferredEncrypt:!1,direction:"sendrecv"},{kind:"video",uri:"urn:ietf:params:rtp-hdrext:framemarking",preferredId:7,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"}]})},t.generateNativeRtpCapabilities=function(){return r.deepFreeze({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:"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}]})},t.generateNativeSctpCapabilities=function(){return r.deepFreeze({numStreams:{OS:2048,MIS:2048}})},t.generateLocalDtlsParameters=function(){return r.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"})},t.generateTransportRemoteParameters=function(){return{id:i(),iceParameters:r.deepFreeze({iceLite:!0,password:"yku5ej8nvfaor28lvtrabcx0wkrpkztz",usernameFragment:"h3hk1iz6qqlnqlne"}),iceCandidates:r.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:r.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:r.deepFreeze({port:5e3,OS:2048,MIS:2048,maxMessageSize:2e6})}},t.generateProducerRemoteParameters=function(){return r.deepFreeze({id:i()})},t.generateConsumerRemoteParameters=function({id:e,codecMimeType:t}={}){switch(t){case"audio/opus":return{id:e??i(),producerId:i(),kind:"audio",rtpParameters:r.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:e??i(),producerId:i(),kind:"audio",rtpParameters:r.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:e??i(),producerId:i(),kind:"video",rtpParameters:r.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:e??i(),producerId:i(),kind:"video",rtpParameters:r.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 '${t}'`)}},t.generateDataProducerRemoteParameters=function(){return r.deepFreeze({id:i()})},t.generateDataConsumerRemoteParameters=function({id:e}={}){return{id:e??i(),dataProducerId:i(),sctpStreamParameters:r.deepFreeze({streamId:666,maxPacketLifeTime:5e3,maxRetransmits:void 0})}};const r=s(1765);function i(){return String(r.generateRandomNumber())}},5328:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.FakeMediaStreamTrack=void 0;const r=s(182),i=s(5862),a=s(3785);class n extends i.FakeEventTarget{#e;#t;#s;#r;#i;#a;#n;#o;#c;#d;#p;#l=null;#h=null;#m=null;#u=null;#f=null;constructor({kind:e,id:t,label:s,contentHint:i,enabled:a,muted:n,readyState:o,capabilities:c,constraints:d,settings:p,data:l}){super(),this.#e=t??(0,r.v4)(),this.#t=e,this.#s=s??"",this.#n=i??"",this.#i=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.#s}get contentHint(){return this.#n}set contentHint(e){this.#n=e}get enabled(){return this.#i}set enabled(e){const t=this.#i!==e;this.#i=e,t&&this.dispatchEvent(new Event("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.#m}set onended(e){this.#m&&this.removeEventListener("ended",this.#m),this.#m=e,e&&this.addEventListener("ended",e)}get onenabledchange(){return this.#u}set onenabledchange(e){this.#u&&this.removeEventListener("enabledchange",this.#u),this.#u=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,s){super.addEventListener(e,t,s)}removeEventListener(e,t){super.removeEventListener(e,t)}stop(){"ended"!==this.#r&&(this.#r="ended",this.dispatchEvent(new Event("stopped")))}clone({id:e,data:t}={}){return new n({id:e??(0,r.v4)(),kind:this.#t,label:this.#s,contentHint:this.#n,enabled:this.#i,muted:this.#a,readyState:this.#r,capabilities:(0,a.clone)(this.#o),constraints:(0,a.clone)(this.#c),settings:(0,a.clone)(this.#d),data:t??(0,a.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 Event("stopped")),this.dispatchEvent(new Event("ended")))}remoteMute(){this.#a||(this.#a=!0,this.dispatchEvent(new Event("mute")))}remoteUnmute(){this.#a&&(this.#a=!1,this.dispatchEvent(new Event("unmute")))}}t.FakeMediaStreamTrack=n},5370:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},5535:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Chrome70=void 0;const r=s(7363),i=s(2994),a=s(1765),n=s(8046),o=s(5544),c=s(5938),d=s(521),p=s(1305),l=s(3303),h=new i.Logger("Chrome70"),m={OS:1024,MIS:1024};class u extends d.HandlerInterface{_direction;_remoteSdp;_sendingRtpParametersByKind;_sendingRemoteRtpParametersByKind;_forcedLocalDtlsRole;_pc;_mapMidTransceiver=new Map;_sendStream=new MediaStream;_hasDataChannelMediaSection=!1;_nextSendSctpStreamId=0;_transportReady=!1;static createFactory(){return()=>new u}constructor(){super()}get name(){return"Chrome70"}close(){if(h.debug("close()"),this._pc)try{this._pc.close()}catch(e){}this.emit("@close")}async getNativeRtpCapabilities(){h.debug("getNativeRtpCapabilities()");const e=new RTCPeerConnection({iceServers:[],iceTransportPolicy:"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require",sdpSemantics:"unified-plan"});try{e.addTransceiver("audio"),e.addTransceiver("video");const t=await e.createOffer();try{e.close()}catch(e){}const s=r.parse(t.sdp);return o.extractRtpCapabilities({sdpObject:s})}catch(t){try{e.close()}catch(e){}throw t}}async getNativeSctpCapabilities(){return h.debug("getNativeSctpCapabilities()"),{numStreams:m}}run({direction:e,iceParameters:t,iceCandidates:s,dtlsParameters:r,sctpParameters:i,iceServers:a,iceTransportPolicy:o,additionalSettings:c,proprietaryConstraints:d,extendedRtpCapabilities:l}){h.debug("run()"),this._direction=e,this._remoteSdp=new p.RemoteSdp({iceParameters:t,iceCandidates:s,dtlsParameters:r,sctpParameters:i}),this._sendingRtpParametersByKind={audio:n.getSendingRtpParameters("audio",l),video:n.getSendingRtpParameters("video",l)},this._sendingRemoteRtpParametersByKind={audio:n.getSendingRemoteRtpParameters("audio",l),video:n.getSendingRemoteRtpParameters("video",l)},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",sdpSemantics:"unified-plan",...c},d),this._pc.addEventListener("icegatheringstatechange",(()=>{this.emit("@icegatheringstatechange",this._pc.iceGatheringState)})),this._pc.addEventListener("icecandidateerror",(e=>{this.emit("@icecandidateerror",e)})),this._pc.connectionState?this._pc.addEventListener("connectionstatechange",(()=>{this.emit("@connectionstatechange",this._pc.connectionState)})):this._pc.addEventListener("iceconnectionstatechange",(()=>{switch(h.warn("run() | pc.connectionState not supported, using pc.iceConnectionState"),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")}}))}async updateIceServers(e){h.debug("updateIceServers()");const t=this._pc.getConfiguration();t.iceServers=e,this._pc.setConfiguration(t)}async restartIce(e){if(h.debug("restartIce()"),this._remoteSdp.updateIceParameters(e),this._transportReady)if("send"===this._direction){const e=await this._pc.createOffer({iceRestart:!0});h.debug("restartIce() | calling pc.setLocalDescription() [offer:%o]",e),await this._pc.setLocalDescription(e);const t={type:"answer",sdp:this._remoteSdp.getSdp()};h.debug("restartIce() | calling pc.setRemoteDescription() [answer:%o]",t),await this._pc.setRemoteDescription(t)}else{const e={type:"offer",sdp:this._remoteSdp.getSdp()};h.debug("restartIce() | calling pc.setRemoteDescription() [offer:%o]",e),await this._pc.setRemoteDescription(e);const t=await this._pc.createAnswer();h.debug("restartIce() | calling pc.setLocalDescription() [answer:%o]",t),await this._pc.setLocalDescription(t)}}async getTransportStats(){return this._pc.getStats()}async send({track:e,encodings:t,codecOptions:s,codec:i}){this.assertSendDirection(),h.debug("send() [kind:%s, track.id:%s]",e.kind,e.id);const d=a.clone(this._sendingRtpParametersByKind[e.kind]);d.codecs=n.reduceCodecs(d.codecs,i);const p=a.clone(this._sendingRemoteRtpParametersByKind[e.kind]);p.codecs=n.reduceCodecs(p.codecs,i);const m=this._remoteSdp.getNextMediaSectionIdx(),u=this._pc.addTransceiver(e,{direction:"sendonly",streams:[this._sendStream]});let f,g=await this._pc.createOffer(),_=r.parse(g.sdp);_.extmapAllowMixed&&this._remoteSdp.setSessionExtmapAllowMixed(),this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:_}),t&&t.length>1&&(h.debug("send() | enabling legacy simulcast"),_=r.parse(g.sdp),f=_.media[m.idx],c.addLegacySimulcast({offerMediaObject:f,numStreams:t.length}),g={type:"offer",sdp:r.write(_)});let w=!1;const b=(0,l.parse)((t??[{}])[0].scalabilityMode);if(t&&1===t.length&&b.spatialLayers>1&&"video/vp9"===d.codecs[0].mimeType.toLowerCase()&&(h.debug("send() | enabling legacy simulcast for VP9 SVC"),w=!0,_=r.parse(g.sdp),f=_.media[m.idx],c.addLegacySimulcast({offerMediaObject:f,numStreams:b.spatialLayers}),g={type:"offer",sdp:r.write(_)}),h.debug("send() | calling pc.setLocalDescription() [offer:%o]",g),await this._pc.setLocalDescription(g),t){h.debug("send() | applying given encodings");const e=u.sender.getParameters();for(let s=0;s<(e.encodings??[]).length;++s){const r=e.encodings[s],i=t[s];if(!i)break;e.encodings[s]=Object.assign(r,i)}await u.sender.setParameters(e)}const v=u.mid;if(d.mid=v,_=r.parse(this._pc.localDescription.sdp),f=_.media[m.idx],d.rtcp.cname=o.getCname({offerMediaObject:f}),d.encodings=c.getRtpEncodings({offerMediaObject:f}),t)for(let e=0;e1&&("video/vp8"===d.codecs[0].mimeType.toLowerCase()||"video/h264"===d.codecs[0].mimeType.toLowerCase()))for(const e of d.encodings)e.scalabilityMode="L1T3";this._remoteSdp.send({offerMediaObject:f,reuseMid:m.reuseMid,offerRtpParameters:d,answerRtpParameters:p,codecOptions:s});const y={type:"answer",sdp:this._remoteSdp.getSdp()};return h.debug("send() | calling pc.setRemoteDescription() [answer:%o]",y),await this._pc.setRemoteDescription(y),this._mapMidTransceiver.set(v,u),{localId:v,rtpParameters:d,rtpSender:u.sender}}async stopSending(e){this.assertSendDirection(),h.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 s=await this._pc.createOffer();h.debug("stopSending() | calling pc.setLocalDescription() [offer:%o]",s),await this._pc.setLocalDescription(s);const r={type:"answer",sdp:this._remoteSdp.getSdp()};h.debug("stopSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r),this._mapMidTransceiver.delete(e)}async pauseSending(e){}async resumeSending(e){}async replaceTrack(e,t){this.assertSendDirection(),t?h.debug("replaceTrack() [localId:%s, track.id:%s]",e,t.id):h.debug("replaceTrack() [localId:%s, no track]",e);const s=this._mapMidTransceiver.get(e);if(!s)throw new Error("associated RTCRtpTransceiver not found");await s.sender.replaceTrack(t)}async setMaxSpatialLayer(e,t){this.assertSendDirection(),h.debug("setMaxSpatialLayer() [localId:%s, spatialLayer:%s]",e,t);const s=this._mapMidTransceiver.get(e);if(!s)throw new Error("associated RTCRtpTransceiver not found");const r=s.sender.getParameters();r.encodings.forEach(((e,s)=>{e.active=s<=t})),await s.sender.setParameters(r),this._remoteSdp.muxMediaSectionSimulcast(e,r.encodings);const i=await this._pc.createOffer();h.debug("setMaxSpatialLayer() | calling pc.setLocalDescription() [offer:%o]",i),await this._pc.setLocalDescription(i);const a={type:"answer",sdp:this._remoteSdp.getSdp()};h.debug("setMaxSpatialLayer() | calling pc.setRemoteDescription() [answer:%o]",a),await this._pc.setRemoteDescription(a)}async setRtpEncodingParameters(e,t){this.assertSendDirection(),h.debug("setRtpEncodingParameters() [localId:%s, params:%o]",e,t);const s=this._mapMidTransceiver.get(e);if(!s)throw new Error("associated RTCRtpTransceiver not found");const r=s.sender.getParameters();r.encodings.forEach(((e,s)=>{r.encodings[s]={...e,...t}})),await s.sender.setParameters(r),this._remoteSdp.muxMediaSectionSimulcast(e,r.encodings);const i=await this._pc.createOffer();h.debug("setRtpEncodingParameters() | calling pc.setLocalDescription() [offer:%o]",i),await this._pc.setLocalDescription(i);const a={type:"answer",sdp:this._remoteSdp.getSdp()};h.debug("setRtpEncodingParameters() | calling pc.setRemoteDescription() [answer:%o]",a),await this._pc.setRemoteDescription(a)}async getSenderStats(e){this.assertSendDirection();const t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated RTCRtpTransceiver not found");return t.sender.getStats()}async sendDataChannel({ordered:e,maxPacketLifeTime:t,maxRetransmits:s,label:i,protocol:a}){this.assertSendDirection();const n={negotiated:!0,id:this._nextSendSctpStreamId,ordered:e,maxPacketLifeTime:t,maxRetransmitTime:t,maxRetransmits:s,protocol:a};h.debug("sendDataChannel() [options:%o]",n);const o=this._pc.createDataChannel(i,n);if(this._nextSendSctpStreamId=++this._nextSendSctpStreamId%m.MIS,!this._hasDataChannelMediaSection){const e=await this._pc.createOffer(),t=r.parse(e.sdp),s=t.media.find((e=>"application"===e.type));this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:t}),h.debug("sendDataChannel() | calling pc.setLocalDescription() [offer:%o]",e),await this._pc.setLocalDescription(e),this._remoteSdp.sendSctpAssociation({offerMediaObject:s});const i={type:"answer",sdp:this._remoteSdp.getSdp()};h.debug("sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]",i),await this._pc.setRemoteDescription(i),this._hasDataChannelMediaSection=!0}return{dataChannel:o,sctpStreamParameters:{streamId:n.id,ordered:n.ordered,maxPacketLifeTime:n.maxPacketLifeTime,maxRetransmits:n.maxRetransmits}}}async receive(e){this.assertRecvDirection();const t=[],s=new Map;for(const t of e){const{trackId:e,kind:r,rtpParameters:i,streamId:a}=t;h.debug("receive() [trackId:%s, kind:%s]",e,r);const n=i.mid??String(this._mapMidTransceiver.size);s.set(e,n),this._remoteSdp.receive({mid:n,kind:r,offerRtpParameters:i,streamId:a??i.rtcp.cname,trackId:e})}const i={type:"offer",sdp:this._remoteSdp.getSdp()};h.debug("receive() | calling pc.setRemoteDescription() [offer:%o]",i),await this._pc.setRemoteDescription(i);let a=await this._pc.createAnswer();const n=r.parse(a.sdp);for(const t of e){const{trackId:e,rtpParameters:r}=t,i=s.get(e),a=n.media.find((e=>String(e.mid)===i));o.applyCodecParameters({offerRtpParameters:r,answerMediaObject:a})}a={type:"answer",sdp:r.write(n)},this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:n}),h.debug("receive() | calling pc.setLocalDescription() [answer:%o]",a),await this._pc.setLocalDescription(a);for(const r of e){const{trackId:e}=r,i=s.get(e),a=this._pc.getTransceivers().find((e=>e.mid===i));if(!a)throw new Error("new RTCRtpTransceiver not found");this._mapMidTransceiver.set(i,a),t.push({localId:i,track:a.receiver.track,rtpReceiver:a.receiver})}return t}async stopReceiving(e){this.assertRecvDirection();for(const t of e){h.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()};h.debug("stopReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const s=await this._pc.createAnswer();h.debug("stopReceiving() | calling pc.setLocalDescription() [answer:%o]",s),await this._pc.setLocalDescription(s);for(const t of e)this._mapMidTransceiver.delete(t)}async pauseReceiving(e){}async resumeReceiving(e){}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:e,label:t,protocol:s}){this.assertRecvDirection();const{streamId:i,ordered:a,maxPacketLifeTime:n,maxRetransmits:o}=e,c={negotiated:!0,id:i,ordered:a,maxPacketLifeTime:n,maxRetransmitTime:n,maxRetransmits:o,protocol:s};h.debug("receiveDataChannel() [options:%o]",c);const d=this._pc.createDataChannel(t,c);if(!this._hasDataChannelMediaSection){this._remoteSdp.receiveSctpAssociation();const e={type:"offer",sdp:this._remoteSdp.getSdp()};h.debug("receiveDataChannel() | calling pc.setRemoteDescription() [offer:%o]",e),await this._pc.setRemoteDescription(e);const t=await this._pc.createAnswer();if(!this._transportReady){const e=r.parse(t.sdp);await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:e})}h.debug("receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]",t),await this._pc.setLocalDescription(t),this._hasDataChannelMediaSection=!0}return{dataChannel:d}}async setupTransport({localDtlsRole:e,localSdpObject:t}){t||(t=r.parse(this._pc.localDescription.sdp));const s=o.extractDtlsParameters({sdpObject:t});s.role=e,this._remoteSdp.updateDtlsRole("client"===e?"server":"client"),await new Promise(((e,t)=>{this.safeEmit("@connect",{dtlsParameters:s},e,t)})),this._transportReady=!0}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')}}t.Chrome70=u},5544:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.extractRtpCapabilities=function({sdpObject:e}){const t=new Map,s=[];let i=!1,a=!1;for(const n of e.media){const e=n.type;switch(e){case"audio":if(i)continue;i=!0;break;case"video":if(a)continue;a=!0;break;default:continue}for(const s of n.rtp){const r={kind:e,mimeType:`${e}/${s.codec}`,preferredPayloadType:s.payload,clockRate:s.rate,channels:s.encoding,parameters:{},rtcpFeedback:[]};t.set(r.preferredPayloadType,r)}for(const e of n.fmtp??[]){const s=r.parseParams(e.config),i=t.get(e.payload);i&&(s?.hasOwnProperty("profile-level-id")&&(s["profile-level-id"]=String(s["profile-level-id"])),i.parameters=s)}for(const s of n.rtcpFb??[]){const r={type:s.type,parameter:s.subtype};if(r.parameter||delete r.parameter,"*"!==s.payload){const e=t.get(s.payload);if(!e)continue;e.rtcpFeedback.push(r)}else for(const s of t.values())s.kind!==e||/.+\/rtx$/i.test(s.mimeType)||s.rtcpFeedback.push(r)}for(const t of n.ext??[]){if(t["encrypt-uri"])continue;const r={kind:e,uri:t.uri,preferredId:t.value};s.push(r)}}return{codecs:Array.from(t.values()),headerExtensions:s}},t.extractDtlsParameters=function({sdpObject:e}){let t,s=e.setup,r=e.fingerprint;if(!s||!r){const t=(e.media??[]).find((e=>0!==e.port));t&&(s??=t.setup,r??=t.fingerprint)}if(!s)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(s){case"active":t="client";break;case"passive":t="server";break;case"actpass":t="auto"}return{role:t,fingerprints:[{algorithm:r.type,value:r.hash}]}},t.getCname=function({offerMediaObject:e}){const t=(e.ssrcs??[]).find((e=>"cname"===e.attribute));return t?t.value:""},t.applyCodecParameters=function({offerRtpParameters:e,answerMediaObject:t}){for(const s of e.codecs){const e=s.mimeType.toLowerCase();if("audio/opus"!==e)continue;if(!(t.rtp??[]).find((e=>e.payload===s.payloadType)))continue;t.fmtp=t.fmtp??[];let i=t.fmtp.find((e=>e.payload===s.payloadType));i||(i={payload:s.payloadType,config:""},t.fmtp.push(i));const a=r.parseParams(i.config);switch(e){case"audio/opus":{const e=s.parameters["sprop-stereo"];void 0!==e&&(a.stereo=Number(e)?1:0);break}}i.config="";for(const e of Object.keys(a))i.config&&(i.config+=";"),i.config+=`${e}=${a[e]}`}};const r=s(7363)},5601:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Transport=void 0;const r=s(8876),i=s(2994),a=s(3953),n=s(4893),o=s(1765),c=s(8046),d=s(9792),p=s(3518),l=s(7504),h=s(9166),m=new i.Logger("Transport");class u{consumerOptions;promise;resolve;reject;constructor(e){this.consumerOptions=e,this.promise=new Promise(((e,t)=>{this.resolve=e,this.reject=t}))}}class f extends a.EnhancedEventEmitter{_id;_closed=!1;_direction;_extendedRtpCapabilities;_canProduceByKind;_maxSctpMessageSize;_handler;_iceGatheringState="new";_connectionState="new";_appData;_producers=new Map;_consumers=new Map;_dataProducers=new Map;_dataConsumers=new Map;_probatorConsumerCreated=!1;_awaitQueue=new r.AwaitQueue;_pendingConsumerTasks=[];_consumerCreationInProgress=!1;_pendingPauseConsumers=new Map;_consumerPauseInProgress=!1;_pendingResumeConsumers=new Map;_consumerResumeInProgress=!1;_pendingCloseConsumers=new Map;_consumerCloseInProgress=!1;_observer=new a.EnhancedEventEmitter;constructor({direction:e,id:t,iceParameters:s,iceCandidates:r,dtlsParameters:i,sctpParameters:a,iceServers:n,iceTransportPolicy:c,additionalSettings:d,proprietaryConstraints:p,appData:l,handlerFactory:h,extendedRtpCapabilities:u,canProduceByKind:f}){super(),m.debug("constructor() [id:%s, direction:%s]",t,e),this._id=t,this._direction=e,this._extendedRtpCapabilities=u,this._canProduceByKind=f,this._maxSctpMessageSize=a?a.maxMessageSize:null;const g=o.clone(d)??{};delete g.iceServers,delete g.iceTransportPolicy,delete g.bundlePolicy,delete g.rtcpMuxPolicy,delete g.sdpSemantics,this._handler=h(),this._handler.run({direction:e,iceParameters:s,iceCandidates:r,dtlsParameters:i,sctpParameters:a,iceServers:n,iceTransportPolicy:c,additionalSettings:g,proprietaryConstraints:p,extendedRtpCapabilities:u}),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){m.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")}}async getStats(){if(this._closed)throw new n.InvalidStateError("closed");return this._handler.getTransportStats()}async restartIce({iceParameters:e}){if(m.debug("restartIce()"),this._closed)throw new n.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(m.debug("updateIceServers()"),this._closed)throw new n.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,encodings:t,codecOptions:s,codec:r,stopTracks:i=!0,disableTrackOnPause:a=!0,zeroRtpOnPause:o=!1,onRtpSender:p,appData:l={}}={}){if(m.debug("produce() [track:%o]",e),this._closed)throw new n.InvalidStateError("closed");if(!e)throw new TypeError("missing track");if("send"!==this._direction)throw new n.UnsupportedError("not a sending Transport");if(!this._canProduceByKind[e.kind])throw new n.UnsupportedError(`cannot produce ${e.kind}`);if("ended"===e.readyState)throw new n.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(l&&"object"!=typeof l)throw new TypeError("if given, appData must be an object");return this._awaitQueue.push((async()=>{let n;if(t&&!Array.isArray(t))throw TypeError("encodings must be an array");t&&0===t.length?n=void 0:t&&(n=t.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:h,rtpParameters:m,rtpSender:u}=await this._handler.send({track:e,encodings:n,codecOptions:s,codec:r,onRtpSender:p});try{c.validateRtpParameters(m);const{id:t}=await new Promise(((t,s)=>{this.safeEmit("produce",{kind:e.kind,rtpParameters:m,appData:l},t,s)})),s=new d.Producer({id:t,localId:h,rtpSender:u,track:e,rtpParameters:m,stopTracks:i,disableTrackOnPause:a,zeroRtpOnPause:o,appData:l});return this._producers.set(s.id,s),this.handleProducer(s),this._observer.safeEmit("newproducer",s),s}catch(e){throw this._handler.stopSending(h).catch((()=>{})),e}}),"transport.produce()").catch((t=>{if(i)try{e.stop()}catch(e){}throw t}))}async consume({id:e,producerId:t,kind:s,rtpParameters:r,streamId:i,onRtpReceiver:a,appData:d={}}){if(m.debug("consume()"),this._closed)throw new n.InvalidStateError("closed");if("recv"!==this._direction)throw new n.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"!==s&&"video"!==s)throw new TypeError(`invalid kind '${s}'`);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 p=o.clone(r);if(!c.canReceive(p,this._extendedRtpCapabilities))throw new n.UnsupportedError("cannot consume this Producer");const l=new u({id:e,producerId:t,kind:s,rtpParameters:p,streamId:i,onRtpReceiver:a,appData:d});return this._pendingConsumerTasks.push(l),queueMicrotask((()=>{this._closed||!1===this._consumerCreationInProgress&&this.createPendingConsumers()})),l.promise}async produceData({ordered:e=!0,maxPacketLifeTime:t,maxRetransmits:s,label:r="",protocol:i="",appData:a={}}={}){if(m.debug("produceData()"),this._closed)throw new n.InvalidStateError("closed");if("send"!==this._direction)throw new n.UnsupportedError("not a sending Transport");if(!this._maxSctpMessageSize)throw new n.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(a&&"object"!=typeof a)throw new TypeError("if given, appData must be an object");return(t||s)&&(e=!1),this._awaitQueue.push((async()=>{const{dataChannel:n,sctpStreamParameters:o}=await this._handler.sendDataChannel({ordered:e,maxPacketLifeTime:t,maxRetransmits:s,label:r,protocol:i});c.validateSctpStreamParameters(o);const{id:d}=await new Promise(((e,t)=>{this.safeEmit("producedata",{sctpStreamParameters:o,label:r,protocol:i,appData:a},e,t)})),p=new l.DataProducer({id:d,dataChannel:n,sctpStreamParameters:o,appData:a});return this._dataProducers.set(p.id,p),this.handleDataProducer(p),this._observer.safeEmit("newdataproducer",p),p}),"transport.produceData()")}async consumeData({id:e,dataProducerId:t,sctpStreamParameters:s,label:r="",protocol:i="",appData:a={}}){if(m.debug("consumeData()"),this._closed)throw new n.InvalidStateError("closed");if("recv"!==this._direction)throw new n.UnsupportedError("not a receiving Transport");if(!this._maxSctpMessageSize)throw new n.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(a&&"object"!=typeof a)throw new TypeError("if given, appData must be an object");const d=o.clone(s);return c.validateSctpStreamParameters(d),this._awaitQueue.push((async()=>{const{dataChannel:s}=await this._handler.receiveDataChannel({sctpStreamParameters:d,label:r,protocol:i}),n=new h.DataConsumer({id:e,dataProducerId:t,dataChannel:s,sctpStreamParameters:d,appData:a});return this._dataConsumers.set(n.id,n),this.handleDataConsumer(n),this._observer.safeEmit("newdataconsumer",n),n}),"transport.consumeData()")}createPendingConsumers(){this._consumerCreationInProgress=!0,this._awaitQueue.push((async()=>{if(0===this._pendingConsumerTasks.length)return void m.debug("createPendingConsumers() | there is no Consumer to be created");const e=[...this._pendingConsumerTasks];let t;this._pendingConsumerTasks=[];const s=[];for(const t of e){const{id:e,kind:r,rtpParameters:i,streamId:a,onRtpReceiver:n}=t.consumerOptions;s.push({trackId:e,kind:r,rtpParameters:i,streamId:a,onRtpReceiver:n})}try{const r=await this._handler.receive(s);for(let s=0;s{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 m.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){m.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 m.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){m.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 m.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){m.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,s)=>{this._closed?s(new n.InvalidStateError("closed")):this.safeEmit("connect",{dtlsParameters:e},t,s)})),e.on("@icegatheringstatechange",(e=>{e!==this._iceGatheringState&&(m.debug("ICE gathering state changed to %s",e),this._iceGatheringState=e,this._closed||this.safeEmit("icegatheringstatechange",e))})),e.on("@icecandidateerror",(e=>{m.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&&(m.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=>m.warn("producer.close() failed:%o",e)))})),e.on("@pause",((t,s)=>{this._awaitQueue.push((async()=>await this._handler.pauseSending(e.localId)),"producer @pause event").then(t).catch(s)})),e.on("@resume",((t,s)=>{this._awaitQueue.push((async()=>await this._handler.resumeSending(e.localId)),"producer @resume event").then(t).catch(s)})),e.on("@replacetrack",((t,s,r)=>{this._awaitQueue.push((async()=>await this._handler.replaceTrack(e.localId,t)),"producer @replacetrack event").then(s).catch(r)})),e.on("@setmaxspatiallayer",((t,s,r)=>{this._awaitQueue.push((async()=>await this._handler.setMaxSpatialLayer(e.localId,t)),"producer @setmaxspatiallayer event").then(s).catch(r)})),e.on("@setrtpencodingparameters",((t,s,r)=>{this._awaitQueue.push((async()=>await this._handler.setRtpEncodingParameters(e.localId,t)),"producer @setrtpencodingparameters event").then(s).catch(r)})),e.on("@getstats",((t,s)=>{if(this._closed)return s(new n.InvalidStateError("closed"));this._handler.getSenderStats(e.localId).then(t).catch(s)}))}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,s)=>{if(this._closed)return s(new n.InvalidStateError("closed"));this._handler.getReceiverStats(e.localId).then(t).catch(s)}))}handleDataProducer(e){e.on("@close",(()=>{this._dataProducers.delete(e.id)}))}handleDataConsumer(e){e.on("@close",(()=>{this._dataConsumers.delete(e.id)}))}}t.Transport=f},5602:e=>{var t=e.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"},{name:"msid",reg:/^msid:(.*)/,format:"msid:%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")+(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":"")+(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"]}]};Object.keys(t).forEach((function(e){t[e].forEach((function(e){e.reg||(e.reg=/(.*)/),e.format||(e.format="%s")}))}))},5765:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Safari12=void 0;const r=s(7363),i=s(2994),a=s(1765),n=s(8046),o=s(5544),c=s(5938),d=s(4256),p=s(4893),l=s(521),h=s(1305),m=s(3303),u=new i.Logger("Safari12"),f={OS:1024,MIS:1024};class g extends l.HandlerInterface{_closed=!1;_direction;_remoteSdp;_sendingRtpParametersByKind;_sendingRemoteRtpParametersByKind;_forcedLocalDtlsRole;_pc;_mapMidTransceiver=new Map;_sendStream=new MediaStream;_hasDataChannelMediaSection=!1;_nextSendSctpStreamId=0;_transportReady=!1;static createFactory(){return()=>new g}constructor(){super()}get name(){return"Safari12"}close(){if(u.debug("close()"),!this._closed){if(this._closed=!0,this._pc)try{this._pc.close()}catch(e){}this.emit("@close")}}async getNativeRtpCapabilities(){u.debug("getNativeRtpCapabilities()");const e=new RTCPeerConnection({iceServers:[],iceTransportPolicy:"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require"});try{e.addTransceiver("audio"),e.addTransceiver("video");const t=await e.createOffer();try{e.close()}catch(e){}const s=r.parse(t.sdp),i=o.extractRtpCapabilities({sdpObject:s});return d.addNackSupportForOpus(i),i}catch(t){try{e.close()}catch(e){}throw t}}async getNativeSctpCapabilities(){return u.debug("getNativeSctpCapabilities()"),{numStreams:f}}run({direction:e,iceParameters:t,iceCandidates:s,dtlsParameters:r,sctpParameters:i,iceServers:a,iceTransportPolicy:o,additionalSettings:c,proprietaryConstraints:d,extendedRtpCapabilities:p}){this.assertNotClosed(),u.debug("run()"),this._direction=e,this._remoteSdp=new h.RemoteSdp({iceParameters:t,iceCandidates:s,dtlsParameters:r,sctpParameters:i}),this._sendingRtpParametersByKind={audio:n.getSendingRtpParameters("audio",p),video:n.getSendingRtpParameters("video",p)},this._sendingRemoteRtpParametersByKind={audio:n.getSendingRemoteRtpParameters("audio",p),video:n.getSendingRemoteRtpParameters("video",p)},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},d),this._pc.addEventListener("icegatheringstatechange",(()=>{this.emit("@icegatheringstatechange",this._pc.iceGatheringState)})),this._pc.addEventListener("icecandidateerror",(e=>{this.emit("@icecandidateerror",e)})),this._pc.connectionState?this._pc.addEventListener("connectionstatechange",(()=>{this.emit("@connectionstatechange",this._pc.connectionState)})):this._pc.addEventListener("iceconnectionstatechange",(()=>{switch(u.warn("run() | pc.connectionState not supported, using pc.iceConnectionState"),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")}}))}async updateIceServers(e){this.assertNotClosed(),u.debug("updateIceServers()");const t=this._pc.getConfiguration();t.iceServers=e,this._pc.setConfiguration(t)}async restartIce(e){if(this.assertNotClosed(),u.debug("restartIce()"),this._remoteSdp.updateIceParameters(e),this._transportReady)if("send"===this._direction){const e=await this._pc.createOffer({iceRestart:!0});u.debug("restartIce() | calling pc.setLocalDescription() [offer:%o]",e),await this._pc.setLocalDescription(e);const t={type:"answer",sdp:this._remoteSdp.getSdp()};u.debug("restartIce() | calling pc.setRemoteDescription() [answer:%o]",t),await this._pc.setRemoteDescription(t)}else{const e={type:"offer",sdp:this._remoteSdp.getSdp()};u.debug("restartIce() | calling pc.setRemoteDescription() [offer:%o]",e),await this._pc.setRemoteDescription(e);const t=await this._pc.createAnswer();u.debug("restartIce() | calling pc.setLocalDescription() [answer:%o]",t),await this._pc.setLocalDescription(t)}}async getTransportStats(){return this.assertNotClosed(),this._pc.getStats()}async send({track:e,encodings:t,codecOptions:s,codec:i,onRtpSender:d}){this.assertNotClosed(),this.assertSendDirection(),u.debug("send() [kind:%s, track.id:%s]",e.kind,e.id);const p=a.clone(this._sendingRtpParametersByKind[e.kind]);p.codecs=n.reduceCodecs(p.codecs,i);const l=a.clone(this._sendingRemoteRtpParametersByKind[e.kind]);l.codecs=n.reduceCodecs(l.codecs,i);const h=this._remoteSdp.getNextMediaSectionIdx(),f=this._pc.addTransceiver(e,{direction:"sendonly",streams:[this._sendStream]});d&&d(f.sender);let g,_=await this._pc.createOffer(),w=r.parse(_.sdp);w.extmapAllowMixed&&this._remoteSdp.setSessionExtmapAllowMixed(),this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:w});const b=(0,m.parse)((t??[{}])[0].scalabilityMode);t&&t.length>1&&(u.debug("send() | enabling legacy simulcast"),w=r.parse(_.sdp),g=w.media[h.idx],c.addLegacySimulcast({offerMediaObject:g,numStreams:t.length}),_={type:"offer",sdp:r.write(w)}),u.debug("send() | calling pc.setLocalDescription() [offer:%o]",_),await this._pc.setLocalDescription(_);const v=f.mid;if(p.mid=v,w=r.parse(this._pc.localDescription.sdp),g=w.media[h.idx],p.rtcp.cname=o.getCname({offerMediaObject:g}),p.encodings=c.getRtpEncodings({offerMediaObject:g}),t)for(let e=0;e1&&("video/vp8"===p.codecs[0].mimeType.toLowerCase()||"video/h264"===p.codecs[0].mimeType.toLowerCase()))for(const e of p.encodings)e.scalabilityMode?e.scalabilityMode=`L1T${b.temporalLayers}`:e.scalabilityMode="L1T3";this._remoteSdp.send({offerMediaObject:g,reuseMid:h.reuseMid,offerRtpParameters:p,answerRtpParameters:l,codecOptions:s});const y={type:"answer",sdp:this._remoteSdp.getSdp()};return u.debug("send() | calling pc.setRemoteDescription() [answer:%o]",y),await this._pc.setRemoteDescription(y),this._mapMidTransceiver.set(v,f),{localId:v,rtpParameters:p,rtpSender:f.sender}}async stopSending(e){if(this.assertSendDirection(),this._closed)return;u.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 s=await this._pc.createOffer();u.debug("stopSending() | calling pc.setLocalDescription() [offer:%o]",s),await this._pc.setLocalDescription(s);const r={type:"answer",sdp:this._remoteSdp.getSdp()};u.debug("stopSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r),this._mapMidTransceiver.delete(e)}async pauseSending(e){this.assertNotClosed(),this.assertSendDirection(),u.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 s=await this._pc.createOffer();u.debug("pauseSending() | calling pc.setLocalDescription() [offer:%o]",s),await this._pc.setLocalDescription(s);const r={type:"answer",sdp:this._remoteSdp.getSdp()};u.debug("pauseSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r)}async resumeSending(e){this.assertNotClosed(),this.assertSendDirection(),u.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 s=await this._pc.createOffer();u.debug("resumeSending() | calling pc.setLocalDescription() [offer:%o]",s),await this._pc.setLocalDescription(s);const r={type:"answer",sdp:this._remoteSdp.getSdp()};u.debug("resumeSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r)}async replaceTrack(e,t){this.assertNotClosed(),this.assertSendDirection(),t?u.debug("replaceTrack() [localId:%s, track.id:%s]",e,t.id):u.debug("replaceTrack() [localId:%s, no track]",e);const s=this._mapMidTransceiver.get(e);if(!s)throw new Error("associated RTCRtpTransceiver not found");await s.sender.replaceTrack(t)}async setMaxSpatialLayer(e,t){this.assertNotClosed(),this.assertSendDirection(),u.debug("setMaxSpatialLayer() [localId:%s, spatialLayer:%s]",e,t);const s=this._mapMidTransceiver.get(e);if(!s)throw new Error("associated RTCRtpTransceiver not found");const r=s.sender.getParameters();r.encodings.forEach(((e,s)=>{e.active=s<=t})),await s.sender.setParameters(r),this._remoteSdp.muxMediaSectionSimulcast(e,r.encodings);const i=await this._pc.createOffer();u.debug("setMaxSpatialLayer() | calling pc.setLocalDescription() [offer:%o]",i),await this._pc.setLocalDescription(i);const a={type:"answer",sdp:this._remoteSdp.getSdp()};u.debug("setMaxSpatialLayer() | calling pc.setRemoteDescription() [answer:%o]",a),await this._pc.setRemoteDescription(a)}async setRtpEncodingParameters(e,t){this.assertNotClosed(),this.assertSendDirection(),u.debug("setRtpEncodingParameters() [localId:%s, params:%o]",e,t);const s=this._mapMidTransceiver.get(e);if(!s)throw new Error("associated RTCRtpTransceiver not found");const r=s.sender.getParameters();r.encodings.forEach(((e,s)=>{r.encodings[s]={...e,...t}})),await s.sender.setParameters(r),this._remoteSdp.muxMediaSectionSimulcast(e,r.encodings);const i=await this._pc.createOffer();u.debug("setRtpEncodingParameters() | calling pc.setLocalDescription() [offer:%o]",i),await this._pc.setLocalDescription(i);const a={type:"answer",sdp:this._remoteSdp.getSdp()};u.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:e,maxPacketLifeTime:t,maxRetransmits:s,label:i,protocol:a}){this.assertNotClosed(),this.assertSendDirection();const n={negotiated:!0,id:this._nextSendSctpStreamId,ordered:e,maxPacketLifeTime:t,maxRetransmits:s,protocol:a};u.debug("sendDataChannel() [options:%o]",n);const o=this._pc.createDataChannel(i,n);if(this._nextSendSctpStreamId=++this._nextSendSctpStreamId%f.MIS,!this._hasDataChannelMediaSection){const e=await this._pc.createOffer(),t=r.parse(e.sdp),s=t.media.find((e=>"application"===e.type));this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:t}),u.debug("sendDataChannel() | calling pc.setLocalDescription() [offer:%o]",e),await this._pc.setLocalDescription(e),this._remoteSdp.sendSctpAssociation({offerMediaObject:s});const i={type:"answer",sdp:this._remoteSdp.getSdp()};u.debug("sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]",i),await this._pc.setRemoteDescription(i),this._hasDataChannelMediaSection=!0}return{dataChannel:o,sctpStreamParameters:{streamId:n.id,ordered:n.ordered,maxPacketLifeTime:n.maxPacketLifeTime,maxRetransmits:n.maxRetransmits}}}async receive(e){this.assertNotClosed(),this.assertRecvDirection();const t=[],s=new Map;for(const t of e){const{trackId:e,kind:r,rtpParameters:i,streamId:a}=t;u.debug("receive() [trackId:%s, kind:%s]",e,r);const n=i.mid??String(this._mapMidTransceiver.size);s.set(e,n),this._remoteSdp.receive({mid:n,kind:r,offerRtpParameters:i,streamId:a??i.rtcp.cname,trackId:e})}const i={type:"offer",sdp:this._remoteSdp.getSdp()};u.debug("receive() | calling pc.setRemoteDescription() [offer:%o]",i),await this._pc.setRemoteDescription(i);for(const t of e){const{trackId:e,onRtpReceiver:r}=t;if(r){const t=s.get(e),i=this._pc.getTransceivers().find((e=>e.mid===t));if(!i)throw new Error("transceiver not found");r(i.receiver)}}let a=await this._pc.createAnswer();const n=r.parse(a.sdp);for(const t of e){const{trackId:e,rtpParameters:r}=t,i=s.get(e),a=n.media.find((e=>String(e.mid)===i));o.applyCodecParameters({offerRtpParameters:r,answerMediaObject:a})}a={type:"answer",sdp:r.write(n)},this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:n}),u.debug("receive() | calling pc.setLocalDescription() [answer:%o]",a),await this._pc.setLocalDescription(a);for(const r of e){const{trackId:e}=r,i=s.get(e),a=this._pc.getTransceivers().find((e=>e.mid===i));if(!a)throw new Error("new RTCRtpTransceiver not found");this._mapMidTransceiver.set(i,a),t.push({localId:i,track:a.receiver.track,rtpReceiver:a.receiver})}return t}async stopReceiving(e){if(this.assertRecvDirection(),this._closed)return;for(const t of e){u.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()};u.debug("stopReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const s=await this._pc.createAnswer();u.debug("stopReceiving() | calling pc.setLocalDescription() [answer:%o]",s),await this._pc.setLocalDescription(s);for(const t of e)this._mapMidTransceiver.delete(t)}async pauseReceiving(e){this.assertNotClosed(),this.assertRecvDirection();for(const t of e){u.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()};u.debug("pauseReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const s=await this._pc.createAnswer();u.debug("pauseReceiving() | calling pc.setLocalDescription() [answer:%o]",s),await this._pc.setLocalDescription(s)}async resumeReceiving(e){this.assertNotClosed(),this.assertRecvDirection();for(const t of e){u.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()};u.debug("resumeReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const s=await this._pc.createAnswer();u.debug("resumeReceiving() | calling pc.setLocalDescription() [answer:%o]",s),await this._pc.setLocalDescription(s)}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:e,label:t,protocol:s}){this.assertNotClosed(),this.assertRecvDirection();const{streamId:i,ordered:a,maxPacketLifeTime:n,maxRetransmits:o}=e,c={negotiated:!0,id:i,ordered:a,maxPacketLifeTime:n,maxRetransmits:o,protocol:s};u.debug("receiveDataChannel() [options:%o]",c);const d=this._pc.createDataChannel(t,c);if(!this._hasDataChannelMediaSection){this._remoteSdp.receiveSctpAssociation();const e={type:"offer",sdp:this._remoteSdp.getSdp()};u.debug("receiveDataChannel() | calling pc.setRemoteDescription() [offer:%o]",e),await this._pc.setRemoteDescription(e);const t=await this._pc.createAnswer();if(!this._transportReady){const e=r.parse(t.sdp);await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:e})}u.debug("receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]",t),await this._pc.setLocalDescription(t),this._hasDataChannelMediaSection=!0}return{dataChannel:d}}async setupTransport({localDtlsRole:e,localSdpObject:t}){t||(t=r.parse(this._pc.localDescription.sdp));const s=o.extractDtlsParameters({sdpObject:t});s.role=e,this._remoteSdp.updateDtlsRole("client"===e?"server":"client"),await new Promise(((e,t)=>{this.safeEmit("@connect",{dtlsParameters:s},e,t)})),this._transportReady=!0}assertNotClosed(){if(this._closed)throw new p.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')}}t.Safari12=g},5862:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.FakeEventTarget=void 0,t.FakeEventTarget=class{listeners={};addEventListener(e,t,s={}){t&&(this.listeners[e]??=[],this.listeners[e].push({callback:t,once:!0===s.once}))}removeEventListener(e,t){this.listeners[e]&&(this.listeners[e]=this.listeners[e].filter((e=>e.callback!==t)))}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 s of[...t]){try{s.callback.call(this,e)}catch(e){setTimeout((()=>{throw e}),0)}s.once&&this.removeEventListener(e.type,s.callback)}return!e.defaultPrevented}}},5938:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getRtpEncodings=function({offerMediaObject:e}){const t=new Set;for(const s of e.ssrcs??[]){const e=s.id;t.add(e)}if(0===t.size)throw new Error("no a=ssrc lines found");const s=new Map;for(const r of e.ssrcGroups??[]){if("FID"!==r.semantics)continue;let[e,i]=r.ssrcs.split(/\s+/);e=Number(e),i=Number(i),t.has(e)&&(t.delete(e),t.delete(i),s.set(e,i))}for(const e of t)s.set(e,null);const r=[];for(const[e,t]of s){const s={ssrc:e};t&&(s.rtx={ssrc:t}),r.push(s)}return r},t.addLegacySimulcast=function({offerMediaObject:e,numStreams:t}){if(t<=1)throw new TypeError("numStreams must be greater than 1");const s=(e.ssrcs??[]).find((e=>"msid"===e.attribute));if(!s)throw new Error("a=ssrc line with msid information not found");const[r,i]=s.value.split(" "),a=Number(s.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{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Device=void 0,t.detectDeviceAsync=R,t.detectDevice=C;const r=s(2109),i=s(2994),a=s(3953),n=s(4893),o=s(1765),c=s(8046),d=s(5601),p=s(2183),l=s(11),h=s(5535),m=s(8155),u=s(7402),f=s(2292),g=s(1767),_=s(5765),w=s(9676),b=s(8633),v=s(4039),y=s(9352),S=new i.Logger("Device");async function R(e){return S.debug("detectDeviceAsync() [userAgent:%s]",e),e||"object"!=typeof navigator||(e=navigator.userAgent),D(await(0,r.UAParser)(e).withFeatureCheck())}function C(e){return S.debug("detectDevice() [userAgent:%s]",e),e||"object"!=typeof navigator||(e=navigator.userAgent),D((0,r.UAParser)(e))}class P{_handlerFactory;_handlerName;_loaded=!1;_extendedRtpCapabilities;_recvRtpCapabilities;_canProduceByKind;_sctpCapabilities;_observer=new a.EnhancedEventEmitter;static async factory({handlerName:e,handlerFactory:t}={}){if(S.debug("factory()"),e&&t)throw new TypeError("just one of handlerName or handlerInterface can be given");if(!e&&!t&&!(e=await R()))throw new n.UnsupportedError("device not supported");return new P({handlerName:e,handlerFactory:t})}constructor({handlerName:e,handlerFactory:t}={}){if(S.debug("constructor()"),e&&t)throw new TypeError("just one of handlerName or handlerInterface can be given");if(t)this._handlerFactory=t;else{if(e)S.debug("constructor() | handler given: %s",e);else{if(!(e=C()))throw new n.UnsupportedError("device not supported");S.debug("constructor() | detected handler: %s",e)}switch(e){case"Chrome111":this._handlerFactory=p.Chrome111.createFactory();break;case"Chrome74":this._handlerFactory=l.Chrome74.createFactory();break;case"Chrome70":this._handlerFactory=h.Chrome70.createFactory();break;case"Chrome67":this._handlerFactory=m.Chrome67.createFactory();break;case"Chrome55":this._handlerFactory=u.Chrome55.createFactory();break;case"Firefox120":this._handlerFactory=f.Firefox120.createFactory();break;case"Firefox60":this._handlerFactory=g.Firefox60.createFactory();break;case"Safari12":this._handlerFactory=_.Safari12.createFactory();break;case"Safari11":this._handlerFactory=w.Safari11.createFactory();break;case"Edge11":this._handlerFactory=b.Edge11.createFactory();break;case"ReactNativeUnifiedPlan":this._handlerFactory=v.ReactNativeUnifiedPlan.createFactory();break;case"ReactNative":this._handlerFactory=y.ReactNative.createFactory();break;default:throw new TypeError(`unknown handlerName "${e}"`)}}const s=this._handlerFactory();this._handlerName=s.name,s.close(),this._extendedRtpCapabilities=void 0,this._recvRtpCapabilities=void 0,this._canProduceByKind={audio:!1,video:!1},this._sctpCapabilities=void 0}get handlerName(){return this._handlerName}get loaded(){return this._loaded}get rtpCapabilities(){if(!this._loaded)throw new n.InvalidStateError("not loaded");return this._recvRtpCapabilities}get sctpCapabilities(){if(!this._loaded)throw new n.InvalidStateError("not loaded");return this._sctpCapabilities}get observer(){return this._observer}async load({routerRtpCapabilities:e,preferLocalCodecsOrder:t=!1}){let s;S.debug("load() [routerRtpCapabilities:%o]",e);try{if(this._loaded)throw new n.InvalidStateError("already loaded");const r=o.clone(e);c.validateRtpCapabilities(r),s=this._handlerFactory();const i=await s.getNativeRtpCapabilities();S.debug("load() | got native RTP capabilities:%o",i);const a=o.clone(i);c.validateRtpCapabilities(a),this._extendedRtpCapabilities=c.getExtendedRtpCapabilities(a,r,t),S.debug("load() | got extended RTP capabilities:%o",this._extendedRtpCapabilities),this._canProduceByKind.audio=c.canSend("audio",this._extendedRtpCapabilities),this._canProduceByKind.video=c.canSend("video",this._extendedRtpCapabilities),this._recvRtpCapabilities=c.getRecvRtpCapabilities(this._extendedRtpCapabilities),c.validateRtpCapabilities(this._recvRtpCapabilities),S.debug("load() | got receiving RTP capabilities:%o",this._recvRtpCapabilities),this._sctpCapabilities=await s.getNativeSctpCapabilities(),S.debug("load() | got native SCTP capabilities:%o",this._sctpCapabilities),c.validateSctpCapabilities(this._sctpCapabilities),S.debug("load() succeeded"),this._loaded=!0,s.close()}catch(e){throw s&&s.close(),e}}canProduce(e){if(!this._loaded)throw new n.InvalidStateError("not loaded");if("audio"!==e&&"video"!==e)throw new TypeError(`invalid kind "${e}"`);return this._canProduceByKind[e]}createSendTransport({id:e,iceParameters:t,iceCandidates:s,dtlsParameters:r,sctpParameters:i,iceServers:a,iceTransportPolicy:n,additionalSettings:o,proprietaryConstraints:c,appData:d}){return S.debug("createSendTransport()"),this.createTransport({direction:"send",id:e,iceParameters:t,iceCandidates:s,dtlsParameters:r,sctpParameters:i,iceServers:a,iceTransportPolicy:n,additionalSettings:o,proprietaryConstraints:c,appData:d})}createRecvTransport({id:e,iceParameters:t,iceCandidates:s,dtlsParameters:r,sctpParameters:i,iceServers:a,iceTransportPolicy:n,additionalSettings:o,proprietaryConstraints:c,appData:d}){return S.debug("createRecvTransport()"),this.createTransport({direction:"recv",id:e,iceParameters:t,iceCandidates:s,dtlsParameters:r,sctpParameters:i,iceServers:a,iceTransportPolicy:n,additionalSettings:o,proprietaryConstraints:c,appData:d})}createTransport({direction:e,id:t,iceParameters:s,iceCandidates:r,dtlsParameters:i,sctpParameters:a,iceServers:o,iceTransportPolicy:c,additionalSettings:p,proprietaryConstraints:l,appData:h}){if(!this._loaded)throw new n.InvalidStateError("not loaded");if("string"!=typeof t)throw new TypeError("missing id");if("object"!=typeof s)throw new TypeError("missing iceParameters");if(!Array.isArray(r))throw new TypeError("missing iceCandidates");if("object"!=typeof i)throw new TypeError("missing dtlsParameters");if(a&&"object"!=typeof a)throw new TypeError("wrong sctpParameters");if(h&&"object"!=typeof h)throw new TypeError("if given, appData must be an object");const m=new d.Transport({direction:e,id:t,iceParameters:s,iceCandidates:r,dtlsParameters:i,sctpParameters:a,iceServers:o,iceTransportPolicy:c,additionalSettings:p,proprietaryConstraints:l,appData:h,handlerFactory:this._handlerFactory,extendedRtpCapabilities:this._extendedRtpCapabilities,canProduceByKind:this._canProduceByKind});return this._observer.safeEmit("newtransport",m),m}}function D(e){if("object"==typeof navigator&&"ReactNative"===navigator.product)return S.debug("detectDeviceImpl() | React-Native detected"),"undefined"==typeof RTCPeerConnection?void S.warn("detectDeviceImpl() | unsupported react-native-webrtc without RTCPeerConnection, forgot to call registerGlobals()?"):"undefined"!=typeof RTCRtpTransceiver?(S.debug("detectDeviceImpl() | ReactNative UnifiedPlan handler chosen"),"ReactNativeUnifiedPlan"):(S.debug("detectDeviceImpl() | ReactNative PlanB handler chosen"),"ReactNative");{S.debug("detectDeviceImpl() | browser detected [userAgent:%s, parsed:%o]",e.ua,e);const t=e.browser,s=t.name?.toLowerCase(),r=parseInt(t.major??"0"),i=e.engine,a=i.name?.toLowerCase(),n=e.os,o=n.name?.toLowerCase(),c=parseFloat(n.version??"0"),d=e.device,p=d.model?.toLowerCase(),l="ios"===o||"ipad"===p,h=s&&["chrome","chromium","mobile chrome","chrome webview","chrome headless"].includes(s),m=s&&["firefox","mobile firefox","mobile focus"].includes(s),u=s&&["safari","mobile safari"].includes(s),f=s&&["edge"].includes(s);if((h||f)&&!l&&r>=111)return"Chrome111";if(h&&!l&&r>=74||f&&!l&&r>=88)return"Chrome74";if(h&&!l&&r>=70)return"Chrome70";if(h&&!l&&r>=67)return"Chrome67";if(h&&!l&&r>=55)return"Chrome55";if(m&&!l&&r>=120)return"Firefox120";if(m&&!l&&r>=60)return"Firefox60";if(m&&l&&c>=14.3)return"Safari12";if(u&&r>=12&&"undefined"!=typeof RTCRtpTransceiver&&RTCRtpTransceiver.prototype.hasOwnProperty("currentDirection"))return"Safari12";if(u&&r>=11)return"Safari11";if(f&&!l&&r>=11&&r<=18)return"Edge11";if("webkit"===a&&l&&"undefined"!=typeof RTCRtpTransceiver&&RTCRtpTransceiver.prototype.hasOwnProperty("currentDirection"))return"Safari12";if("blink"===a){const t=e.ua.match(/(?:(?:Chrome|Chromium))[ /](\w+)/i);if(t){const e=Number(t[1]);return e>=111?"Chrome111":e>=74?"Chrome74":e>=70?"Chrome70":e>=67?"Chrome67":"Chrome55"}return"Chrome111"}return void S.warn("detectDeviceImpl() | browser not supported [name:%s, version:%s]",s,r)}}t.Device=P},6011:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.unsafeStringify=void 0;const r=s(9746),i=[];for(let e=0;e<256;++e)i.push((e+256).toString(16).slice(1));function a(e,t=0){return(i[e[t+0]]+i[e[t+1]]+i[e[t+2]]+i[e[t+3]]+"-"+i[e[t+4]]+i[e[t+5]]+"-"+i[e[t+6]]+i[e[t+7]]+"-"+i[e[t+8]]+i[e[t+9]]+"-"+i[e[t+10]]+i[e[t+11]]+i[e[t+12]]+i[e[t+13]]+i[e[t+14]]+i[e[t+15]]).toLowerCase()}t.unsafeStringify=a,t.default=function(e,t=0){const s=a(e,t);if(!(0,r.default)(s))throw TypeError("Stringified UUID is invalid");return s}},6356:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=s(6011),i=s(1425),a=s(6568);t.default=function(e,t,s){e??={},s??=0;let n=(0,i.default)({...e,_v6:!0},new Uint8Array(16));if(n=(0,a.default)(n),t){for(let e=0;e<16;e++)t[s+e]=n[e];return t}return(0,r.unsafeStringify)(n)}},6568:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=s(1797),i=s(6011);t.default=function(e){const t=(s="string"==typeof e?(0,r.default)(e):e,Uint8Array.of((15&s[6])<<4|s[7]>>4&15,(15&s[7])<<4|(240&s[4])>>4,(15&s[4])<<4|(240&s[5])>>4,(15&s[5])<<4|(240&s[0])>>4,(15&s[0])<<4|(240&s[1])>>4,(15&s[1])<<4|(240&s[2])>>4,96|15&s[2],s[3],s[8],s[9],s[10],s[11],s[12],s[13],s[14],s[15]));var s;return"string"==typeof e?(0,i.unsafeStringify)(t):t}},6585:e=>{var t=1e3,s=60*t,r=60*s,i=24*r,a=7*i;function n(e,t,s,r){var i=t>=1.5*s;return Math.round(e/s)+" "+r+(i?"s":"")}e.exports=function(e,o){o=o||{};var c,d,p=typeof e;if("string"===p&&e.length>0)return function(e){if(!((e=String(e)).length>100)){var n=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(e);if(n){var o=parseFloat(n[1]);switch((n[2]||"ms").toLowerCase()){case"years":case"year":case"yrs":case"yr":case"y":return 315576e5*o;case"weeks":case"week":case"w":return o*a;case"days":case"day":case"d":return o*i;case"hours":case"hour":case"hrs":case"hr":case"h":return o*r;case"minutes":case"minute":case"mins":case"min":case"m":return o*s;case"seconds":case"second":case"secs":case"sec":case"s":return o*t;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return o;default:return}}}}(e);if("number"===p&&isFinite(e))return o.long?(c=e,(d=Math.abs(c))>=i?n(c,d,i,"day"):d>=r?n(c,d,r,"hour"):d>=s?n(c,d,s,"minute"):d>=t?n(c,d,t,"second"):c+" ms"):function(e){var a=Math.abs(e);return a>=i?Math.round(e/i)+"d":a>=r?Math.round(e/r)+"h":a>=s?Math.round(e/s)+"m":a>=t?Math.round(e/t)+"s":e+"ms"}(e);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(e))}},6697:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/i},7363:(e,t,s)=>{var r=s(5020),i=s(3804),a=s(5602);t.grammar=a,t.write=i,t.parse=r.parse,t.parseParams=r.parseParams,t.parseFmtpConfig=r.parseFmtpConfig,t.parsePayloads=r.parsePayloads,t.parseRemoteCandidates=r.parseRemoteCandidates,t.parseImageAttributes=r.parseImageAttributes,t.parseSimulcastStreamList=r.parseSimulcastStreamList},7402:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Chrome55=void 0;const r=s(7363),i=s(2994),a=s(4893),n=s(1765),o=s(8046),c=s(5544),d=s(4496),p=s(521),l=s(1305),h=new i.Logger("Chrome55"),m={OS:1024,MIS:1024};class u extends p.HandlerInterface{_direction;_remoteSdp;_sendingRtpParametersByKind;_sendingRemoteRtpParametersByKind;_forcedLocalDtlsRole;_pc;_sendStream=new MediaStream;_mapSendLocalIdTrack=new Map;_nextSendLocalId=0;_mapRecvLocalIdInfo=new Map;_hasDataChannelMediaSection=!1;_nextSendSctpStreamId=0;_transportReady=!1;static createFactory(){return()=>new u}constructor(){super()}get name(){return"Chrome55"}close(){if(h.debug("close()"),this._pc)try{this._pc.close()}catch(e){}this.emit("@close")}async getNativeRtpCapabilities(){h.debug("getNativeRtpCapabilities()");const e=new RTCPeerConnection({iceServers:[],iceTransportPolicy:"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require",sdpSemantics:"plan-b"});try{const t=await e.createOffer({offerToReceiveAudio:!0,offerToReceiveVideo:!0});try{e.close()}catch(e){}const s=r.parse(t.sdp);return c.extractRtpCapabilities({sdpObject:s})}catch(t){try{e.close()}catch(e){}throw t}}async getNativeSctpCapabilities(){return h.debug("getNativeSctpCapabilities()"),{numStreams:m}}run({direction:e,iceParameters:t,iceCandidates:s,dtlsParameters:r,sctpParameters:i,iceServers:a,iceTransportPolicy:n,additionalSettings:c,proprietaryConstraints:d,extendedRtpCapabilities:p}){h.debug("run()"),this._direction=e,this._remoteSdp=new l.RemoteSdp({iceParameters:t,iceCandidates:s,dtlsParameters:r,sctpParameters:i,planB:!0}),this._sendingRtpParametersByKind={audio:o.getSendingRtpParameters("audio",p),video:o.getSendingRtpParameters("video",p)},this._sendingRemoteRtpParametersByKind={audio:o.getSendingRemoteRtpParameters("audio",p),video:o.getSendingRemoteRtpParameters("video",p)},r.role&&"auto"!==r.role&&(this._forcedLocalDtlsRole="server"===r.role?"client":"server"),this._pc=new RTCPeerConnection({iceServers:a??[],iceTransportPolicy:n??"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require",sdpSemantics:"plan-b",...c},d),this._pc.addEventListener("icegatheringstatechange",(()=>{this.emit("@icegatheringstatechange",this._pc.iceGatheringState)})),this._pc.addEventListener("icecandidateerror",(e=>{this.emit("@icecandidateerror",e)})),this._pc.connectionState?this._pc.addEventListener("connectionstatechange",(()=>{this.emit("@connectionstatechange",this._pc.connectionState)})):this._pc.addEventListener("iceconnectionstatechange",(()=>{switch(h.warn("run() | pc.connectionState not supported, using pc.iceConnectionState"),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")}}))}async updateIceServers(e){h.debug("updateIceServers()");const t=this._pc.getConfiguration();t.iceServers=e,this._pc.setConfiguration(t)}async restartIce(e){if(h.debug("restartIce()"),this._remoteSdp.updateIceParameters(e),this._transportReady)if("send"===this._direction){const e=await this._pc.createOffer({iceRestart:!0});h.debug("restartIce() | calling pc.setLocalDescription() [offer:%o]",e),await this._pc.setLocalDescription(e);const t={type:"answer",sdp:this._remoteSdp.getSdp()};h.debug("restartIce() | calling pc.setRemoteDescription() [answer:%o]",t),await this._pc.setRemoteDescription(t)}else{const e={type:"offer",sdp:this._remoteSdp.getSdp()};h.debug("restartIce() | calling pc.setRemoteDescription() [offer:%o]",e),await this._pc.setRemoteDescription(e);const t=await this._pc.createAnswer();h.debug("restartIce() | calling pc.setLocalDescription() [answer:%o]",t),await this._pc.setLocalDescription(t)}}async getTransportStats(){return this._pc.getStats()}async send({track:e,encodings:t,codecOptions:s,codec:i}){this.assertSendDirection(),h.debug("send() [kind:%s, track.id:%s]",e.kind,e.id),i&&h.warn("send() | codec selection is not available in %s handler",this.name),this._sendStream.addTrack(e),this._pc.addStream(this._sendStream);let a,p=await this._pc.createOffer(),l=r.parse(p.sdp);l.extmapAllowMixed&&this._remoteSdp.setSessionExtmapAllowMixed();const m=n.clone(this._sendingRtpParametersByKind[e.kind]);m.codecs=o.reduceCodecs(m.codecs);const u=n.clone(this._sendingRemoteRtpParametersByKind[e.kind]);if(u.codecs=o.reduceCodecs(u.codecs),this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:l}),"video"===e.kind&&t&&t.length>1&&(h.debug("send() | enabling simulcast"),l=r.parse(p.sdp),a=l.media.find((e=>"video"===e.type)),d.addLegacySimulcast({offerMediaObject:a,track:e,numStreams:t.length}),p={type:"offer",sdp:r.write(l)}),h.debug("send() | calling pc.setLocalDescription() [offer:%o]",p),await this._pc.setLocalDescription(p),l=r.parse(this._pc.localDescription.sdp),a=l.media.find((t=>t.type===e.kind)),m.rtcp.cname=c.getCname({offerMediaObject:a}),m.encodings=d.getRtpEncodings({offerMediaObject:a,track:e}),t)for(let e=0;e1&&"video/vp8"===m.codecs[0].mimeType.toLowerCase())for(const e of m.encodings)e.scalabilityMode="L1T3";this._remoteSdp.send({offerMediaObject:a,offerRtpParameters:m,answerRtpParameters:u,codecOptions:s});const f={type:"answer",sdp:this._remoteSdp.getSdp()};h.debug("send() | calling pc.setRemoteDescription() [answer:%o]",f),await this._pc.setRemoteDescription(f);const g=String(this._nextSendLocalId);return this._nextSendLocalId++,this._mapSendLocalIdTrack.set(g,e),{localId:g,rtpParameters:m}}async stopSending(e){this.assertSendDirection(),h.debug("stopSending() [localId:%s]",e);const t=this._mapSendLocalIdTrack.get(e);if(!t)throw new Error("track not found");this._mapSendLocalIdTrack.delete(e),this._sendStream.removeTrack(t),this._pc.addStream(this._sendStream);const s=await this._pc.createOffer();h.debug("stopSending() | calling pc.setLocalDescription() [offer:%o]",s);try{await this._pc.setLocalDescription(s)}catch(e){if(0===this._sendStream.getTracks().length)return void h.warn("stopSending() | ignoring expected error due no sending tracks: %s",e.toString());throw e}if("stable"===this._pc.signalingState)return;const r={type:"answer",sdp:this._remoteSdp.getSdp()};h.debug("stopSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r)}async pauseSending(e){}async resumeSending(e){}async replaceTrack(e,t){throw new a.UnsupportedError("not implemented")}async setMaxSpatialLayer(e,t){throw new a.UnsupportedError(" not implemented")}async setRtpEncodingParameters(e,t){throw new a.UnsupportedError("not supported")}async getSenderStats(e){throw new a.UnsupportedError("not implemented")}async sendDataChannel({ordered:e,maxPacketLifeTime:t,maxRetransmits:s,label:i,protocol:a}){this.assertSendDirection();const n={negotiated:!0,id:this._nextSendSctpStreamId,ordered:e,maxPacketLifeTime:t,maxRetransmitTime:t,maxRetransmits:s,protocol:a};h.debug("sendDataChannel() [options:%o]",n);const o=this._pc.createDataChannel(i,n);if(this._nextSendSctpStreamId=++this._nextSendSctpStreamId%m.MIS,!this._hasDataChannelMediaSection){const e=await this._pc.createOffer(),t=r.parse(e.sdp),s=t.media.find((e=>"application"===e.type));this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:t}),h.debug("sendDataChannel() | calling pc.setLocalDescription() [offer:%o]",e),await this._pc.setLocalDescription(e),this._remoteSdp.sendSctpAssociation({offerMediaObject:s});const i={type:"answer",sdp:this._remoteSdp.getSdp()};h.debug("sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]",i),await this._pc.setRemoteDescription(i),this._hasDataChannelMediaSection=!0}return{dataChannel:o,sctpStreamParameters:{streamId:n.id,ordered:n.ordered,maxPacketLifeTime:n.maxPacketLifeTime,maxRetransmits:n.maxRetransmits}}}async receive(e){this.assertRecvDirection();const t=[];for(const t of e){const{trackId:e,kind:s,rtpParameters:r,streamId:i}=t;h.debug("receive() [trackId:%s, kind:%s]",e,s);const a=s;this._remoteSdp.receive({mid:a,kind:s,offerRtpParameters:r,streamId:i??r.rtcp.cname,trackId:e})}const s={type:"offer",sdp:this._remoteSdp.getSdp()};h.debug("receive() | calling pc.setRemoteDescription() [offer:%o]",s),await this._pc.setRemoteDescription(s);let i=await this._pc.createAnswer();const a=r.parse(i.sdp);for(const t of e){const{kind:e,rtpParameters:s}=t,r=e,i=a.media.find((e=>String(e.mid)===r));c.applyCodecParameters({offerRtpParameters:s,answerMediaObject:i})}i={type:"answer",sdp:r.write(a)},this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:a}),h.debug("receive() | calling pc.setLocalDescription() [answer:%o]",i),await this._pc.setLocalDescription(i);for(const s of e){const{kind:e,trackId:r,rtpParameters:i}=s,a=e,n=r,o=s.streamId??i.rtcp.cname,c=this._pc.getRemoteStreams().find((e=>e.id===o)).getTrackById(n);if(!c)throw new Error("remote track not found");this._mapRecvLocalIdInfo.set(n,{mid:a,rtpParameters:i}),t.push({localId:n,track:c})}return t}async stopReceiving(e){this.assertRecvDirection();for(const t of e){h.debug("stopReceiving() [localId:%s]",t);const{mid:e,rtpParameters:s}=this._mapRecvLocalIdInfo.get(t)??{};this._mapRecvLocalIdInfo.delete(t),this._remoteSdp.planBStopReceiving({mid:e,offerRtpParameters:s})}const t={type:"offer",sdp:this._remoteSdp.getSdp()};h.debug("stopReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const s=await this._pc.createAnswer();h.debug("stopReceiving() | calling pc.setLocalDescription() [answer:%o]",s),await this._pc.setLocalDescription(s)}async pauseReceiving(e){}async resumeReceiving(e){}async getReceiverStats(e){throw new a.UnsupportedError("not implemented")}async receiveDataChannel({sctpStreamParameters:e,label:t,protocol:s}){this.assertRecvDirection();const{streamId:i,ordered:a,maxPacketLifeTime:n,maxRetransmits:o}=e,c={negotiated:!0,id:i,ordered:a,maxPacketLifeTime:n,maxRetransmitTime:n,maxRetransmits:o,protocol:s};h.debug("receiveDataChannel() [options:%o]",c);const d=this._pc.createDataChannel(t,c);if(!this._hasDataChannelMediaSection){this._remoteSdp.receiveSctpAssociation({oldDataChannelSpec:!0});const e={type:"offer",sdp:this._remoteSdp.getSdp()};h.debug("receiveDataChannel() | calling pc.setRemoteDescription() [offer:%o]",e),await this._pc.setRemoteDescription(e);const t=await this._pc.createAnswer();if(!this._transportReady){const e=r.parse(t.sdp);await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:e})}h.debug("receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]",t),await this._pc.setLocalDescription(t),this._hasDataChannelMediaSection=!0}return{dataChannel:d}}async setupTransport({localDtlsRole:e,localSdpObject:t}){t||(t=r.parse(this._pc.localDescription.sdp));const s=c.extractDtlsParameters({sdpObject:t});s.role=e,this._remoteSdp.updateDtlsRole("client"===e?"server":"client"),await new Promise(((e,t)=>{this.safeEmit("@connect",{dtlsParameters:s},e,t)})),this._transportReady=!0}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')}}t.Chrome55=u},7504:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DataProducer=void 0;const r=s(2994),i=s(3953),a=s(4893),n=new r.Logger("DataProducer");class o extends i.EnhancedEventEmitter{_id;_dataChannel;_closed=!1;_sctpStreamParameters;_appData;_observer=new i.EnhancedEventEmitter;constructor({id:e,dataChannel:t,sctpStreamParameters:s,appData:r}){super(),n.debug("constructor()"),this._id=e,this._dataChannel=t,this._sctpStreamParameters=s,this._appData=r??{},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||(n.debug("close()"),this._closed=!0,this._dataChannel.close(),this.emit("@close"),this._observer.safeEmit("close"))}transportClosed(){this._closed||(n.debug("transportClosed()"),this._closed=!0,this._dataChannel.close(),this.safeEmit("transportclose"),this._observer.safeEmit("close"))}send(e){if(n.debug("send()"),this._closed)throw new a.InvalidStateError("closed");this._dataChannel.send(e)}handleDataChannel(){this._dataChannel.addEventListener("open",(()=>{this._closed||(n.debug('DataChannel "open" event'),this.safeEmit("open"))})),this._dataChannel.addEventListener("error",(e=>{if(this._closed)return;let{error:t}=e;t||(t=new Error("unknown DataChannel error")),"sctp-failure"===t.errorDetail?n.error("DataChannel SCTP error [sctpCauseCode:%s]: %s",t.sctpCauseCode,t.message):n.error('DataChannel "error" event: %o',t),this.safeEmit("error",t)})),this._dataChannel.addEventListener("close",(()=>{this._closed||(n.warn('DataChannel "close" event'),this._closed=!0,this.emit("@close"),this.safeEmit("close"),this._observer.safeEmit("close"))})),this._dataChannel.addEventListener("message",(()=>{this._closed||n.warn('DataChannel "message" event in a DataProducer, message discarded')})),this._dataChannel.addEventListener("bufferedamountlow",(()=>{this._closed||this.safeEmit("bufferedamountlow")}))}}t.DataProducer=o},7833:(e,t,s)=>{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 s="color: "+this.color;t.splice(1,0,s,"color: inherit");let r=0,i=0;t[0].replace(/%[a-zA-Z%]/g,(e=>{"%%"!==e&&(r++,"%c"===e&&(i=r))})),t.splice(i,0,s)},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){}return!e&&"undefined"!=typeof process&&"env"in process&&(e=process.env.DEBUG),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=s(736)(t);const{formatters:r}=e.exports;r.j=function(e){try{return JSON.stringify(e)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}}},8046:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.validateRtpCapabilities=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)d(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)l(t)},t.validateRtpParameters=c,t.validateSctpStreamParameters=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;if("boolean"==typeof e.ordered?t=!0:e.ordered=!0,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");if(t||!e.maxPacketLifeTime&&!e.maxRetransmits||(e.ordered=!1),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")},t.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)},t.getExtendedRtpCapabilities=function(e,t,s){const r={codecs:[],headerExtensions:[]};if(s)for(const s of e.codecs??[]){if(f(s))continue;const e=(t.codecs??[]).find((e=>g(e,s,{strict:!0,modify:!0})));if(!e)continue;const i={mimeType:s.mimeType,kind:s.kind,clockRate:s.clockRate,channels:s.channels,localPayloadType:s.preferredPayloadType,localRtxPayloadType:void 0,remotePayloadType:e.preferredPayloadType,remoteRtxPayloadType:void 0,localParameters:s.parameters,remoteParameters:e.parameters,rtcpFeedback:_(s,e)};r.codecs.push(i)}else for(const s of t.codecs??[]){if(f(s))continue;const t=(e.codecs??[]).find((e=>g(e,s,{strict:!0,modify:!0})));if(!t)continue;const i={mimeType:t.mimeType,kind:t.kind,clockRate:t.clockRate,channels:t.channels,localPayloadType:t.preferredPayloadType,localRtxPayloadType:void 0,remotePayloadType:s.preferredPayloadType,remoteRtxPayloadType:void 0,localParameters:t.parameters,remoteParameters:s.parameters,rtcpFeedback:_(t,s)};r.codecs.push(i)}for(const s of r.codecs){const r=e.codecs.find((e=>f(e)&&e.parameters.apt===s.localPayloadType)),i=t.codecs.find((e=>f(e)&&e.parameters.apt===s.remotePayloadType));r&&i&&(s.localRtxPayloadType=r.preferredPayloadType,s.remoteRtxPayloadType=i.preferredPayloadType)}for(const s of t.headerExtensions){const t=e.headerExtensions.find((e=>{return r=s,!((t=e).kind&&r.kind&&t.kind!==r.kind||t.uri!==r.uri);var t,r}));if(!t)continue;const i={kind:s.kind,uri:s.uri,sendId:t.preferredId,recvId:s.preferredId,encrypt:t.preferredEncrypt,direction:"sendrecv"};switch(s.direction){case"sendrecv":i.direction="sendrecv";break;case"recvonly":i.direction="sendonly";break;case"sendonly":i.direction="recvonly";break;case"inactive":i.direction="inactive"}r.headerExtensions.push(i)}return r},t.getRecvRtpCapabilities=function(e){const t={codecs:[],headerExtensions:[]};for(const s of e.codecs){const e={mimeType:s.mimeType,kind:s.kind,preferredPayloadType:s.remotePayloadType,clockRate:s.clockRate,channels:s.channels,parameters:s.localParameters,rtcpFeedback:s.rtcpFeedback};if(t.codecs.push(e),!s.remoteRtxPayloadType)continue;const r={mimeType:`${s.kind}/rtx`,kind:s.kind,preferredPayloadType:s.remoteRtxPayloadType,clockRate:s.clockRate,parameters:{apt:s.remotePayloadType},rtcpFeedback:[]};t.codecs.push(r)}for(const s of e.headerExtensions){if("sendrecv"!==s.direction&&"recvonly"!==s.direction)continue;const e={kind:s.kind,uri:s.uri,preferredId:s.recvId,preferredEncrypt:s.encrypt,direction:s.direction};t.headerExtensions.push(e)}return t},t.getSendingRtpParameters=function(e,t){const s={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(s.codecs.push(t),r.localRtxPayloadType){const e={mimeType:`${r.kind}/rtx`,payloadType:r.localRtxPayloadType,clockRate:r.clockRate,parameters:{apt:r.localPayloadType},rtcpFeedback:[]};s.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:{}};s.headerExtensions.push(t)}return s},t.getSendingRemoteRtpParameters=function(e,t){const s={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(s.codecs.push(t),r.localRtxPayloadType){const e={mimeType:`${r.kind}/rtx`,payloadType:r.localRtxPayloadType,clockRate:r.clockRate,parameters:{apt:r.localPayloadType},rtcpFeedback:[]};s.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:{}};s.headerExtensions.push(t)}if(s.headerExtensions.some((e=>"http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01"===e.uri)))for(const e of s.codecs)e.rtcpFeedback=(e.rtcpFeedback??[]).filter((e=>"goog-remb"!==e.type));else if(s.headerExtensions.some((e=>"http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time"===e.uri)))for(const e of s.codecs)e.rtcpFeedback=(e.rtcpFeedback??[]).filter((e=>"transport-cc"!==e.type));else for(const e of s.codecs)e.rtcpFeedback=(e.rtcpFeedback??[]).filter((e=>"transport-cc"!==e.type&&"goog-remb"!==e.type));return s},t.reduceCodecs=function(e,t){const s=[];if(t){for(let r=0;rt.kind===e))},t.canReceive=function(e,t){if(c(e),0===e.codecs.length)return!1;const s=e.codecs[0];return t.codecs.some((e=>e.remotePayloadType===s.payloadType))};const r=s(3200),i=s(1765),a="probator",n=1234,o=127;function c(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)h(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)m(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)u(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 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 s=t.exec(e.mimeType);if(!s)throw new TypeError("invalid codec.mimeType");if(e.kind=s[1].toLowerCase(),e.preferredPayloadType&&"number"!=typeof e.preferredPayloadType)throw new TypeError("invalid 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 s=e.parameters[t];if(void 0===s&&(e.parameters[t]="",s=""),"string"!=typeof s&&"number"!=typeof s)throw new TypeError(`invalid codec parameter [key:${t}s, value:${s}]`);if("apt"===t&&"number"!=typeof s)throw new TypeError("invalid codec apt parameter")}e.rtcpFeedback&&Array.isArray(e.rtcpFeedback)||(e.rtcpFeedback=[]);for(const t of e.rtcpFeedback)p(t)}function p(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 l(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 h(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 s=t.exec(e.mimeType);if(!s)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"===s[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 s=e.parameters[t];if(void 0===s&&(e.parameters[t]="",s=""),"string"!=typeof s&&"number"!=typeof s)throw new TypeError(`invalid codec parameter [key:${t}s, value:${s}]`);if("apt"===t&&"number"!=typeof s)throw new TypeError("invalid codec apt parameter")}e.rtcpFeedback&&Array.isArray(e.rtcpFeedback)||(e.rtcpFeedback=[]);for(const t of e.rtcpFeedback)p(t)}function m(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 s=e.parameters[t];if(void 0===s&&(e.parameters[t]="",s=""),"string"!=typeof s&&"number"!=typeof s)throw new TypeError("invalid header extension parameter")}}function u(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 f(e){return!!e&&/.+\/rtx$/i.test(e.mimeType)}function g(e,t,{strict:s=!1,modify:i=!1}={}){const a=e.mimeType.toLowerCase();if(a!==t.mimeType.toLowerCase())return!1;if(e.clockRate!==t.clockRate)return!1;if(e.channels!==t.channels)return!1;switch(a){case"video/h264":if(s){if((e.parameters["packetization-mode"]??0)!==(t.parameters["packetization-mode"]??0))return!1;if(!r.isSameProfile(e.parameters,t.parameters))return!1;let s;try{s=r.generateProfileLevelIdStringForAnswer(e.parameters,t.parameters)}catch(e){return!1}i&&(s?(e.parameters["profile-level-id"]=s,t.parameters["profile-level-id"]=s):(delete e.parameters["profile-level-id"],delete t.parameters["profile-level-id"]))}break;case"video/vp9":if(s&&(e.parameters["profile-id"]??0)!==(t.parameters["profile-id"]??0))return!1}return!0}function _(e,t){const s=[];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&&s.push(e)}return s}},8057:function(e,t,s){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,s,r){void 0===r&&(r=s);var i=Object.getOwnPropertyDescriptor(t,s);i&&!("get"in i?!t.__esModule:i.writable||i.configurable)||(i={enumerable:!0,get:function(){return t[s]}}),Object.defineProperty(e,r,i)}:function(e,t,s,r){void 0===r&&(r=s),e[r]=t[s]}),i=this&&this.__exportStar||function(e,t){for(var s in e)"default"===s||Object.prototype.hasOwnProperty.call(t,s)||r(t,e,s)};Object.defineProperty(t,"__esModule",{value:!0}),i(s(6004),t),i(s(5601),t),i(s(9792),t),i(s(3518),t),i(s(7504),t),i(s(9166),t),i(s(5370),t),i(s(4160),t),i(s(521),t),i(s(4893),t)},8155:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Chrome67=void 0;const r=s(7363),i=s(2994),a=s(1765),n=s(8046),o=s(5544),c=s(4496),d=s(521),p=s(1305),l=new i.Logger("Chrome67"),h={OS:1024,MIS:1024};class m extends d.HandlerInterface{_direction;_remoteSdp;_sendingRtpParametersByKind;_sendingRemoteRtpParametersByKind;_forcedLocalDtlsRole;_pc;_sendStream=new MediaStream;_mapSendLocalIdRtpSender=new Map;_nextSendLocalId=0;_mapRecvLocalIdInfo=new Map;_hasDataChannelMediaSection=!1;_nextSendSctpStreamId=0;_transportReady=!1;static createFactory(){return()=>new m}constructor(){super()}get name(){return"Chrome67"}close(){if(l.debug("close()"),this._pc)try{this._pc.close()}catch(e){}this.emit("@close")}async getNativeRtpCapabilities(){l.debug("getNativeRtpCapabilities()");const e=new RTCPeerConnection({iceServers:[],iceTransportPolicy:"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require",sdpSemantics:"plan-b"});try{const t=await e.createOffer({offerToReceiveAudio:!0,offerToReceiveVideo:!0});try{e.close()}catch(e){}const s=r.parse(t.sdp);return o.extractRtpCapabilities({sdpObject:s})}catch(t){try{e.close()}catch(e){}throw t}}async getNativeSctpCapabilities(){return l.debug("getNativeSctpCapabilities()"),{numStreams:h}}run({direction:e,iceParameters:t,iceCandidates:s,dtlsParameters:r,sctpParameters:i,iceServers:a,iceTransportPolicy:o,additionalSettings:c,proprietaryConstraints:d,extendedRtpCapabilities:h}){l.debug("run()"),this._direction=e,this._remoteSdp=new p.RemoteSdp({iceParameters:t,iceCandidates:s,dtlsParameters:r,sctpParameters:i,planB:!0}),this._sendingRtpParametersByKind={audio:n.getSendingRtpParameters("audio",h),video:n.getSendingRtpParameters("video",h)},this._sendingRemoteRtpParametersByKind={audio:n.getSendingRemoteRtpParameters("audio",h),video:n.getSendingRemoteRtpParameters("video",h)},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",sdpSemantics:"plan-b",...c},d),this._pc.addEventListener("icegatheringstatechange",(()=>{this.emit("@icegatheringstatechange",this._pc.iceGatheringState)})),this._pc.addEventListener("icecandidateerror",(e=>{this.emit("@icecandidateerror",e)})),this._pc.connectionState?this._pc.addEventListener("connectionstatechange",(()=>{this.emit("@connectionstatechange",this._pc.connectionState)})):this._pc.addEventListener("iceconnectionstatechange",(()=>{switch(l.warn("run() | pc.connectionState not supported, using pc.iceConnectionState"),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")}}))}async updateIceServers(e){l.debug("updateIceServers()");const t=this._pc.getConfiguration();t.iceServers=e,this._pc.setConfiguration(t)}async restartIce(e){if(l.debug("restartIce()"),this._remoteSdp.updateIceParameters(e),this._transportReady)if("send"===this._direction){const e=await this._pc.createOffer({iceRestart:!0});l.debug("restartIce() | calling pc.setLocalDescription() [offer:%o]",e),await this._pc.setLocalDescription(e);const t={type:"answer",sdp:this._remoteSdp.getSdp()};l.debug("restartIce() | calling pc.setRemoteDescription() [answer:%o]",t),await this._pc.setRemoteDescription(t)}else{const e={type:"offer",sdp:this._remoteSdp.getSdp()};l.debug("restartIce() | calling pc.setRemoteDescription() [offer:%o]",e),await this._pc.setRemoteDescription(e);const t=await this._pc.createAnswer();l.debug("restartIce() | calling pc.setLocalDescription() [answer:%o]",t),await this._pc.setLocalDescription(t)}}async getTransportStats(){return this._pc.getStats()}async send({track:e,encodings:t,codecOptions:s,codec:i}){this.assertSendDirection(),l.debug("send() [kind:%s, track.id:%s]",e.kind,e.id),i&&l.warn("send() | codec selection is not available in %s handler",this.name),this._sendStream.addTrack(e),this._pc.addTrack(e,this._sendStream);let d,p=await this._pc.createOffer(),h=r.parse(p.sdp);h.extmapAllowMixed&&this._remoteSdp.setSessionExtmapAllowMixed();const m=a.clone(this._sendingRtpParametersByKind[e.kind]);m.codecs=n.reduceCodecs(m.codecs);const u=a.clone(this._sendingRemoteRtpParametersByKind[e.kind]);if(u.codecs=n.reduceCodecs(u.codecs),this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:h}),"video"===e.kind&&t&&t.length>1&&(l.debug("send() | enabling simulcast"),h=r.parse(p.sdp),d=h.media.find((e=>"video"===e.type)),c.addLegacySimulcast({offerMediaObject:d,track:e,numStreams:t.length}),p={type:"offer",sdp:r.write(h)}),l.debug("send() | calling pc.setLocalDescription() [offer:%o]",p),await this._pc.setLocalDescription(p),h=r.parse(this._pc.localDescription.sdp),d=h.media.find((t=>t.type===e.kind)),m.rtcp.cname=o.getCname({offerMediaObject:d}),m.encodings=c.getRtpEncodings({offerMediaObject:d,track:e}),t)for(let e=0;e1&&"video/vp8"===m.codecs[0].mimeType.toLowerCase())for(const e of m.encodings)e.scalabilityMode="L1T3";this._remoteSdp.send({offerMediaObject:d,offerRtpParameters:m,answerRtpParameters:u,codecOptions:s});const f={type:"answer",sdp:this._remoteSdp.getSdp()};l.debug("send() | calling pc.setRemoteDescription() [answer:%o]",f),await this._pc.setRemoteDescription(f);const g=String(this._nextSendLocalId);this._nextSendLocalId++;const _=this._pc.getSenders().find((t=>t.track===e));return this._mapSendLocalIdRtpSender.set(g,_),{localId:g,rtpParameters:m,rtpSender:_}}async stopSending(e){this.assertSendDirection(),l.debug("stopSending() [localId:%s]",e);const t=this._mapSendLocalIdRtpSender.get(e);if(!t)throw new Error("associated RTCRtpSender not found");this._pc.removeTrack(t),t.track&&this._sendStream.removeTrack(t.track),this._mapSendLocalIdRtpSender.delete(e);const s=await this._pc.createOffer();l.debug("stopSending() | calling pc.setLocalDescription() [offer:%o]",s);try{await this._pc.setLocalDescription(s)}catch(e){if(0===this._sendStream.getTracks().length)return void l.warn("stopSending() | ignoring expected error due no sending tracks: %s",e.toString());throw e}if("stable"===this._pc.signalingState)return;const r={type:"answer",sdp:this._remoteSdp.getSdp()};l.debug("stopSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r)}async pauseSending(e){}async resumeSending(e){}async replaceTrack(e,t){this.assertSendDirection(),t?l.debug("replaceTrack() [localId:%s, track.id:%s]",e,t.id):l.debug("replaceTrack() [localId:%s, no track]",e);const s=this._mapSendLocalIdRtpSender.get(e);if(!s)throw new Error("associated RTCRtpSender not found");const r=s.track;await s.replaceTrack(t),r&&this._sendStream.removeTrack(r),t&&this._sendStream.addTrack(t)}async setMaxSpatialLayer(e,t){this.assertSendDirection(),l.debug("setMaxSpatialLayer() [localId:%s, spatialLayer:%s]",e,t);const s=this._mapSendLocalIdRtpSender.get(e);if(!s)throw new Error("associated RTCRtpSender not found");const r=s.getParameters();r.encodings.forEach(((e,s)=>{e.active=s<=t})),await s.setParameters(r)}async setRtpEncodingParameters(e,t){this.assertSendDirection(),l.debug("setRtpEncodingParameters() [localId:%s, params:%o]",e,t);const s=this._mapSendLocalIdRtpSender.get(e);if(!s)throw new Error("associated RTCRtpSender not found");const r=s.getParameters();r.encodings.forEach(((e,s)=>{r.encodings[s]={...e,...t}})),await s.setParameters(r)}async getSenderStats(e){this.assertSendDirection();const t=this._mapSendLocalIdRtpSender.get(e);if(!t)throw new Error("associated RTCRtpSender not found");return t.getStats()}async sendDataChannel({ordered:e,maxPacketLifeTime:t,maxRetransmits:s,label:i,protocol:a}){this.assertSendDirection();const n={negotiated:!0,id:this._nextSendSctpStreamId,ordered:e,maxPacketLifeTime:t,maxRetransmitTime:t,maxRetransmits:s,protocol:a};l.debug("sendDataChannel() [options:%o]",n);const o=this._pc.createDataChannel(i,n);if(this._nextSendSctpStreamId=++this._nextSendSctpStreamId%h.MIS,!this._hasDataChannelMediaSection){const e=await this._pc.createOffer(),t=r.parse(e.sdp),s=t.media.find((e=>"application"===e.type));this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:t}),l.debug("sendDataChannel() | calling pc.setLocalDescription() [offer:%o]",e),await this._pc.setLocalDescription(e),this._remoteSdp.sendSctpAssociation({offerMediaObject:s});const i={type:"answer",sdp:this._remoteSdp.getSdp()};l.debug("sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]",i),await this._pc.setRemoteDescription(i),this._hasDataChannelMediaSection=!0}return{dataChannel:o,sctpStreamParameters:{streamId:n.id,ordered:n.ordered,maxPacketLifeTime:n.maxPacketLifeTime,maxRetransmits:n.maxRetransmits}}}async receive(e){this.assertRecvDirection();const t=[];for(const t of e){const{trackId:e,kind:s,rtpParameters:r,streamId:i}=t;l.debug("receive() [trackId:%s, kind:%s]",e,s);const a=s;this._remoteSdp.receive({mid:a,kind:s,offerRtpParameters:r,streamId:i??r.rtcp.cname,trackId:e})}const s={type:"offer",sdp:this._remoteSdp.getSdp()};l.debug("receive() | calling pc.setRemoteDescription() [offer:%o]",s),await this._pc.setRemoteDescription(s);let i=await this._pc.createAnswer();const a=r.parse(i.sdp);for(const t of e){const{kind:e,rtpParameters:s}=t,r=e,i=a.media.find((e=>String(e.mid)===r));o.applyCodecParameters({offerRtpParameters:s,answerMediaObject:i})}i={type:"answer",sdp:r.write(a)},this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:a}),l.debug("receive() | calling pc.setLocalDescription() [answer:%o]",i),await this._pc.setLocalDescription(i);for(const s of e){const{kind:e,trackId:r,rtpParameters:i}=s,a=r,n=e,o=this._pc.getReceivers().find((e=>e.track&&e.track.id===a));if(!o)throw new Error("new RTCRtpReceiver not");this._mapRecvLocalIdInfo.set(a,{mid:n,rtpParameters:i,rtpReceiver:o}),t.push({localId:a,track:o.track,rtpReceiver:o})}return t}async stopReceiving(e){this.assertRecvDirection();for(const t of e){l.debug("stopReceiving() [localId:%s]",t);const{mid:e,rtpParameters:s}=this._mapRecvLocalIdInfo.get(t)??{};this._mapRecvLocalIdInfo.delete(t),this._remoteSdp.planBStopReceiving({mid:e,offerRtpParameters:s})}const t={type:"offer",sdp:this._remoteSdp.getSdp()};l.debug("stopReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const s=await this._pc.createAnswer();l.debug("stopReceiving() | calling pc.setLocalDescription() [answer:%o]",s),await this._pc.setLocalDescription(s)}async pauseReceiving(e){}async resumeReceiving(e){}async getReceiverStats(e){this.assertRecvDirection();const{rtpReceiver:t}=this._mapRecvLocalIdInfo.get(e)??{};if(!t)throw new Error("associated RTCRtpReceiver not found");return t.getStats()}async receiveDataChannel({sctpStreamParameters:e,label:t,protocol:s}){this.assertRecvDirection();const{streamId:i,ordered:a,maxPacketLifeTime:n,maxRetransmits:o}=e,c={negotiated:!0,id:i,ordered:a,maxPacketLifeTime:n,maxRetransmitTime:n,maxRetransmits:o,protocol:s};l.debug("receiveDataChannel() [options:%o]",c);const d=this._pc.createDataChannel(t,c);if(!this._hasDataChannelMediaSection){this._remoteSdp.receiveSctpAssociation({oldDataChannelSpec:!0});const e={type:"offer",sdp:this._remoteSdp.getSdp()};l.debug("receiveDataChannel() | calling pc.setRemoteDescription() [offer:%o]",e),await this._pc.setRemoteDescription(e);const t=await this._pc.createAnswer();if(!this._transportReady){const e=r.parse(t.sdp);await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:e})}l.debug("receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]",t),await this._pc.setLocalDescription(t),this._hasDataChannelMediaSection=!0}return{dataChannel:d}}async setupTransport({localDtlsRole:e,localSdpObject:t}){t||(t=r.parse(this._pc.localDescription.sdp));const s=o.extractDtlsParameters({sdpObject:t});s.role=e,this._remoteSdp.updateDtlsRole("client"===e?"server":"client"),await new Promise(((e,t)=>{this.safeEmit("@connect",{dtlsParameters:s},e,t)})),this._transportReady=!0}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')}}t.Chrome67=m},8274:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Logger=void 0;const r=s(7833),i="awaitqueue";t.Logger=class{_debug;_warn;_error;constructor(e){e?(this._debug=r(`${i}:${e}`),this._warn=r(`${i}:WARN:${e}`),this._error=r(`${i}:ERROR:${e}`)):(this._debug=r(i),this._warn=r(`${i}:WARN`),this._error=r(`${i}: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}}},8286:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=s(3779),i=s(2291),a=s(6011);t.default=function(e,t,s){if(r.default.randomUUID&&!t&&!e)return r.default.randomUUID();const n=(e=e||{}).random??e.rng?.()??(0,i.default)();if(n.length<16)throw new Error("Random bytes length must be >= 16");if(n[6]=15&n[6]|64,n[8]=63&n[8]|128,t){if((s=s||0)<0||s+16>t.length)throw new RangeError(`UUID byte range ${s}:${s+15} is out of buffer bounds`);for(let e=0;e<16;++e)t[s+e]=n[e];return t}return(0,a.unsafeStringify)(n)}},8633:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Edge11=void 0;const r=s(2994),i=s(4893),a=s(1765),n=s(8046),o=s(8751),c=s(521),d=new r.Logger("Edge11");class p extends c.HandlerInterface{_sendingRtpParametersByKind;_remoteIceParameters;_remoteIceCandidates;_remoteDtlsParameters;_iceGatherer;_iceTransport;_dtlsTransport;_rtpSenders=new Map;_rtpReceivers=new Map;_nextSendLocalId=0;_cname;_transportReady=!1;static createFactory(){return()=>new p}constructor(){super()}get name(){return"Edge11"}close(){d.debug("close()");try{this._iceGatherer.close()}catch(e){}try{this._iceTransport.stop()}catch(e){}try{this._dtlsTransport.stop()}catch(e){}for(const e of this._rtpSenders.values())try{e.stop()}catch(e){}for(const e of this._rtpReceivers.values())try{e.stop()}catch(e){}this.emit("@close")}async getNativeRtpCapabilities(){return d.debug("getNativeRtpCapabilities()"),o.getCapabilities()}async getNativeSctpCapabilities(){return d.debug("getNativeSctpCapabilities()"),{numStreams:{OS:0,MIS:0}}}run({direction:e,iceParameters:t,iceCandidates:s,dtlsParameters:r,sctpParameters:i,iceServers:o,iceTransportPolicy:c,additionalSettings:p,proprietaryConstraints:l,extendedRtpCapabilities:h}){d.debug("run()"),this._sendingRtpParametersByKind={audio:n.getSendingRtpParameters("audio",h),video:n.getSendingRtpParameters("video",h)},this._remoteIceParameters=t,this._remoteIceCandidates=s,this._remoteDtlsParameters=r,this._cname=`CNAME-${a.generateRandomNumber()}`,this.setIceGatherer({iceServers:o,iceTransportPolicy:c}),this.setIceTransport(),this.setDtlsTransport()}async updateIceServers(e){throw new i.UnsupportedError("not supported")}async restartIce(e){if(d.debug("restartIce()"),this._remoteIceParameters=e,this._transportReady){d.debug("restartIce() | calling iceTransport.start()"),this._iceTransport.start(this._iceGatherer,e,"controlling");for(const e of this._remoteIceCandidates)this._iceTransport.addRemoteCandidate(e);this._iceTransport.addRemoteCandidate({})}}async getTransportStats(){return this._iceTransport.getStats()}async send({track:e,encodings:t,codecOptions:s,codec:r}){d.debug("send() [kind:%s, track.id:%s]",e.kind,e.id),this._transportReady||await this.setupTransport({localDtlsRole:"server"}),d.debug("send() | calling new RTCRtpSender()");const i=new RTCRtpSender(e,this._dtlsTransport),c=a.clone(this._sendingRtpParametersByKind[e.kind]);c.codecs=n.reduceCodecs(c.codecs,r);const p=c.codecs.some((e=>/.+\/rtx$/i.test(e.mimeType)));t||(t=[{}]);for(const e of t)e.ssrc=a.generateRandomNumber(),p&&(e.rtx={ssrc:a.generateRandomNumber()});c.encodings=t,c.rtcp={cname:this._cname,reducedSize:!0,mux:!0};const l=o.mangleRtpParameters(c);d.debug("send() | calling rtpSender.send() [params:%o]",l),await i.send(l);const h=String(this._nextSendLocalId);return this._nextSendLocalId++,this._rtpSenders.set(h,i),{localId:h,rtpParameters:c,rtpSender:i}}async stopSending(e){d.debug("stopSending() [localId:%s]",e);const t=this._rtpSenders.get(e);if(!t)throw new Error("RTCRtpSender not found");this._rtpSenders.delete(e);try{d.debug("stopSending() | calling rtpSender.stop()"),t.stop()}catch(e){throw d.warn("stopSending() | rtpSender.stop() failed:%o",e),e}}async pauseSending(e){}async resumeSending(e){}async replaceTrack(e,t){t?d.debug("replaceTrack() [localId:%s, track.id:%s]",e,t.id):d.debug("replaceTrack() [localId:%s, no track]",e);const s=this._rtpSenders.get(e);if(!s)throw new Error("RTCRtpSender not found");s.setTrack(t)}async setMaxSpatialLayer(e,t){d.debug("setMaxSpatialLayer() [localId:%s, spatialLayer:%s]",e,t);const s=this._rtpSenders.get(e);if(!s)throw new Error("RTCRtpSender not found");const r=s.getParameters();r.encodings.forEach(((e,s)=>{e.active=s<=t})),await s.setParameters(r)}async setRtpEncodingParameters(e,t){d.debug("setRtpEncodingParameters() [localId:%s, params:%o]",e,t);const s=this._rtpSenders.get(e);if(!s)throw new Error("RTCRtpSender not found");const r=s.getParameters();r.encodings.forEach(((e,s)=>{r.encodings[s]={...e,...t}})),await s.setParameters(r)}async getSenderStats(e){const t=this._rtpSenders.get(e);if(!t)throw new Error("RTCRtpSender not found");return t.getStats()}async sendDataChannel(e){throw new i.UnsupportedError("not implemented")}async receive(e){const t=[];for(const t of e){const{trackId:e,kind:s}=t;d.debug("receive() [trackId:%s, kind:%s]",e,s)}this._transportReady||await this.setupTransport({localDtlsRole:"server"});for(const s of e){const{trackId:e,kind:r,rtpParameters:i}=s;d.debug("receive() | calling new RTCRtpReceiver()");const a=new RTCRtpReceiver(this._dtlsTransport,r);a.addEventListener("error",(e=>{d.error('rtpReceiver "error" event [event:%o]',e)}));const n=o.mangleRtpParameters(i);d.debug("receive() | calling rtpReceiver.receive() [params:%o]",n),await a.receive(n);const c=e;this._rtpReceivers.set(c,a),t.push({localId:c,track:a.track,rtpReceiver:a})}return t}async stopReceiving(e){for(const t of e){d.debug("stopReceiving() [localId:%s]",t);const e=this._rtpReceivers.get(t);if(!e)throw new Error("RTCRtpReceiver not found");this._rtpReceivers.delete(t);try{d.debug("stopReceiving() | calling rtpReceiver.stop()"),e.stop()}catch(e){d.warn("stopReceiving() | rtpReceiver.stop() failed:%o",e)}}}async pauseReceiving(e){}async resumeReceiving(e){}async getReceiverStats(e){const t=this._rtpReceivers.get(e);if(!t)throw new Error("RTCRtpReceiver not found");return t.getStats()}async receiveDataChannel(e){throw new i.UnsupportedError("not implemented")}setIceGatherer({iceServers:e,iceTransportPolicy:t}){const s=new RTCIceGatherer({iceServers:e??[],gatherPolicy:t??"all"});s.addEventListener("error",(e=>{d.error('iceGatherer "error" event [event:%o]',e)}));try{s.gather()}catch(e){d.debug("setIceGatherer() | iceGatherer.gather() failed: %s",e.toString())}this._iceGatherer=s}setIceTransport(){const e=new RTCIceTransport(this._iceGatherer);e.addEventListener("statechange",(()=>{switch(e.state){case"checking":this.emit("@connectionstatechange","connecting");break;case"connected":case"completed":this.emit("@connectionstatechange","connected");break;case"failed":this.emit("@connectionstatechange","failed");break;case"disconnected":this.emit("@connectionstatechange","disconnected");break;case"closed":this.emit("@connectionstatechange","closed")}})),e.addEventListener("icestatechange",(()=>{switch(e.state){case"checking":this.emit("@connectionstatechange","connecting");break;case"connected":case"completed":this.emit("@connectionstatechange","connected");break;case"failed":this.emit("@connectionstatechange","failed");break;case"disconnected":this.emit("@connectionstatechange","disconnected");break;case"closed":this.emit("@connectionstatechange","closed")}})),e.addEventListener("candidatepairchange",(e=>{d.debug('iceTransport "candidatepairchange" event [pair:%o]',e.pair)})),this._iceTransport=e}setDtlsTransport(){const e=new RTCDtlsTransport(this._iceTransport);e.addEventListener("statechange",(()=>{d.debug('dtlsTransport "statechange" event [state:%s]',e.state)})),e.addEventListener("dtlsstatechange",(()=>{d.debug('dtlsTransport "dtlsstatechange" event [state:%s]',e.state),"closed"===e.state&&this.emit("@connectionstatechange","closed")})),e.addEventListener("error",(e=>{d.error('dtlsTransport "error" event [event:%o]',e)})),this._dtlsTransport=e}async setupTransport({localDtlsRole:e}){d.debug("setupTransport()");const t=this._dtlsTransport.getLocalParameters();t.role=e,await new Promise(((e,s)=>{this.safeEmit("@connect",{dtlsParameters:t},e,s)})),this._iceTransport.start(this._iceGatherer,this._remoteIceParameters,"controlling");for(const e of this._remoteIceCandidates)this._iceTransport.addRemoteCandidate(e);this._iceTransport.addRemoteCandidate({}),this._remoteDtlsParameters.fingerprints=this._remoteDtlsParameters.fingerprints.filter((e=>"sha-256"===e.algorithm||"sha-384"===e.algorithm||"sha-512"===e.algorithm)),this._dtlsTransport.start(this._remoteDtlsParameters),this._transportReady=!0}}t.Edge11=p},8751:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getCapabilities=function(){const e=RTCRtpReceiver.getCapabilities(),t=r.clone(e);for(const e of t.codecs??[]){if(e.channels=e.numChannels,delete e.numChannels,e.mimeType=e.mimeType??`${e.kind}/${e.name}`,e.parameters){const t=e.parameters;t.apt&&(t.apt=Number(t.apt)),t["packetization-mode"]&&(t["packetization-mode"]=Number(t["packetization-mode"]))}for(const t of e.rtcpFeedback??[])t.parameter||(t.parameter="")}return t},t.mangleRtpParameters=function(e){const t=r.clone(e);t.mid&&(t.muxId=t.mid,delete t.mid);for(const e of t.codecs)e.channels&&(e.numChannels=e.channels,delete e.channels),e.mimeType&&!e.name&&(e.name=e.mimeType.split("/")[1]),delete e.mimeType;return t};const r=s(1765)},8876:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.AwaitQueueRemovedTaskError=t.AwaitQueueStoppedError=t.AwaitQueue=void 0;var r=s(9275);Object.defineProperty(t,"AwaitQueue",{enumerable:!0,get:function(){return r.AwaitQueue}});var i=s(4253);Object.defineProperty(t,"AwaitQueueStoppedError",{enumerable:!0,get:function(){return i.AwaitQueueStoppedError}}),Object.defineProperty(t,"AwaitQueueRemovedTaskError",{enumerable:!0,get:function(){return i.AwaitQueueRemovedTaskError}})},9166:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DataConsumer=void 0;const r=s(2994),i=s(3953),a=new r.Logger("DataConsumer");class n extends i.EnhancedEventEmitter{_id;_dataProducerId;_dataChannel;_closed=!1;_sctpStreamParameters;_appData;_observer=new i.EnhancedEventEmitter;constructor({id:e,dataProducerId:t,dataChannel:s,sctpStreamParameters:r,appData:i}){super(),a.debug("constructor()"),this._id=e,this._dataProducerId=t,this._dataChannel=s,this._sctpStreamParameters=r,this._appData=i??{},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||(a.debug("close()"),this._closed=!0,this._dataChannel.close(),this.emit("@close"),this._observer.safeEmit("close"))}transportClosed(){this._closed||(a.debug("transportClosed()"),this._closed=!0,this._dataChannel.close(),this.safeEmit("transportclose"),this._observer.safeEmit("close"))}handleDataChannel(){this._dataChannel.addEventListener("open",(()=>{this._closed||(a.debug('DataChannel "open" event'),this.safeEmit("open"))})),this._dataChannel.addEventListener("error",(e=>{if(this._closed)return;let{error:t}=e;t||(t=new Error("unknown DataChannel error")),"sctp-failure"===t.errorDetail?a.error("DataChannel SCTP error [sctpCauseCode:%s]: %s",t.sctpCauseCode,t.message):a.error('DataChannel "error" event: %o',t),this.safeEmit("error",t)})),this._dataChannel.addEventListener("close",(()=>{this._closed||(a.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)}))}}t.DataConsumer=n},9275:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.AwaitQueue=void 0;const r=s(8274),i=s(4253),a=new r.Logger("AwaitQueue");t.AwaitQueue=class{pendingTasks=new Map;nextTaskId=0;stopping=!1;constructor(){a.debug("constructor()")}get size(){return this.pendingTasks.size}async push(e,t){if(t=t??e.name,a.debug(`push() [name:${t}]`),"function"!=typeof e)throw new TypeError("given task is not a function");if(t)try{Object.defineProperty(e,"name",{value:t})}catch(e){}return new Promise(((s,r)=>{const i={id:this.nextTaskId++,task:e,name:t,enqueuedAt:Date.now(),executedAt:void 0,completed:!1,resolve:e=>{if(i.completed)return;i.completed=!0,this.pendingTasks.delete(i.id),a.debug(`resolving task [name:${i.name}]`),s(e);const[t]=this.pendingTasks.values();t&&!t.executedAt&&this.execute(t)},reject:e=>{if(!i.completed&&(i.completed=!0,this.pendingTasks.delete(i.id),a.debug(`rejecting task [name:${i.name}]: %s`,String(e)),r(e),!this.stopping)){const[e]=this.pendingTasks.values();e&&!e.executedAt&&this.execute(e)}}};this.pendingTasks.set(i.id,i),1===this.pendingTasks.size&&this.execute(i)}))}stop(){a.debug("stop()"),this.stopping=!0;for(const e of this.pendingTasks.values())a.debug(`stop() | stopping task [name:${e.name}]`),e.reject(new i.AwaitQueueStoppedError);this.stopping=!1}remove(e){a.debug(`remove() [taskIdx:${e}]`);const t=Array.from(this.pendingTasks.values())[e];t?t.reject(new i.AwaitQueueRemovedTaskError):a.debug(`stop() | no task with given idx [taskIdx:${e}]`)}dump(){const e=Date.now();let t=0;return Array.from(this.pendingTasks.values()).map((s=>({idx:t++,task:s.task,name:s.name,enqueuedTime:s.executedAt?s.executedAt-s.enqueuedAt:e-s.enqueuedAt,executionTime:s.executedAt?e-s.executedAt:0})))}async execute(e){if(a.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)}}}},9352:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ReactNative=void 0;const r=s(7363),i=s(2994),a=s(4893),n=s(1765),o=s(8046),c=s(5544),d=s(4496),p=s(521),l=s(1305),h=new i.Logger("ReactNative"),m={OS:1024,MIS:1024};class u extends p.HandlerInterface{_direction;_remoteSdp;_sendingRtpParametersByKind;_sendingRemoteRtpParametersByKind;_forcedLocalDtlsRole;_pc;_sendStream=new MediaStream;_mapSendLocalIdTrack=new Map;_nextSendLocalId=0;_mapRecvLocalIdInfo=new Map;_hasDataChannelMediaSection=!1;_nextSendSctpStreamId=0;_transportReady=!1;static createFactory(){return()=>new u}constructor(){super()}get name(){return"ReactNative"}close(){if(h.debug("close()"),this._sendStream.release(!1),this._pc)try{this._pc.close()}catch(e){}this.emit("@close")}async getNativeRtpCapabilities(){h.debug("getNativeRtpCapabilities()");const e=new RTCPeerConnection({iceServers:[],iceTransportPolicy:"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require",sdpSemantics:"plan-b"});try{const t=await e.createOffer({offerToReceiveAudio:!0,offerToReceiveVideo:!0});try{e.close()}catch(e){}const s=r.parse(t.sdp);return c.extractRtpCapabilities({sdpObject:s})}catch(t){try{e.close()}catch(e){}throw t}}async getNativeSctpCapabilities(){return h.debug("getNativeSctpCapabilities()"),{numStreams:m}}run({direction:e,iceParameters:t,iceCandidates:s,dtlsParameters:r,sctpParameters:i,iceServers:a,iceTransportPolicy:n,additionalSettings:c,proprietaryConstraints:d,extendedRtpCapabilities:p}){h.debug("run()"),this._direction=e,this._remoteSdp=new l.RemoteSdp({iceParameters:t,iceCandidates:s,dtlsParameters:r,sctpParameters:i,planB:!0}),this._sendingRtpParametersByKind={audio:o.getSendingRtpParameters("audio",p),video:o.getSendingRtpParameters("video",p)},this._sendingRemoteRtpParametersByKind={audio:o.getSendingRemoteRtpParameters("audio",p),video:o.getSendingRemoteRtpParameters("video",p)},r.role&&"auto"!==r.role&&(this._forcedLocalDtlsRole="server"===r.role?"client":"server"),this._pc=new RTCPeerConnection({iceServers:a??[],iceTransportPolicy:n??"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require",sdpSemantics:"plan-b",...c},d),this._pc.addEventListener("icegatheringstatechange",(()=>{this.emit("@icegatheringstatechange",this._pc.iceGatheringState)})),this._pc.addEventListener("icecandidateerror",(e=>{this.emit("@icecandidateerror",e)})),this._pc.connectionState?this._pc.addEventListener("connectionstatechange",(()=>{this.emit("@connectionstatechange",this._pc.connectionState)})):this._pc.addEventListener("iceconnectionstatechange",(()=>{switch(h.warn("run() | pc.connectionState not supported, using pc.iceConnectionState"),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")}}))}async updateIceServers(e){h.debug("updateIceServers()");const t=this._pc.getConfiguration();t.iceServers=e,this._pc.setConfiguration(t)}async restartIce(e){if(h.debug("restartIce()"),this._remoteSdp.updateIceParameters(e),this._transportReady)if("send"===this._direction){const e=await this._pc.createOffer({iceRestart:!0});h.debug("restartIce() | calling pc.setLocalDescription() [offer:%o]",e),await this._pc.setLocalDescription(e);const t={type:"answer",sdp:this._remoteSdp.getSdp()};h.debug("restartIce() | calling pc.setRemoteDescription() [answer:%o]",t),await this._pc.setRemoteDescription(t)}else{const e={type:"offer",sdp:this._remoteSdp.getSdp()};h.debug("restartIce() | calling pc.setRemoteDescription() [offer:%o]",e),await this._pc.setRemoteDescription(e);const t=await this._pc.createAnswer();h.debug("restartIce() | calling pc.setLocalDescription() [answer:%o]",t),await this._pc.setLocalDescription(t)}}async getTransportStats(){return this._pc.getStats()}async send({track:e,encodings:t,codecOptions:s,codec:i}){this.assertSendDirection(),h.debug("send() [kind:%s, track.id:%s]",e.kind,e.id),i&&h.warn("send() | codec selection is not available in %s handler",this.name),this._sendStream.addTrack(e),this._pc.addStream(this._sendStream);let a,p=await this._pc.createOffer(),l=r.parse(p.sdp);l.extmapAllowMixed&&this._remoteSdp.setSessionExtmapAllowMixed();const m=n.clone(this._sendingRtpParametersByKind[e.kind]);m.codecs=o.reduceCodecs(m.codecs);const u=n.clone(this._sendingRemoteRtpParametersByKind[e.kind]);if(u.codecs=o.reduceCodecs(u.codecs),this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:l}),"video"===e.kind&&t&&t.length>1&&(h.debug("send() | enabling simulcast"),l=r.parse(p.sdp),a=l.media.find((e=>"video"===e.type)),d.addLegacySimulcast({offerMediaObject:a,track:e,numStreams:t.length}),p={type:"offer",sdp:r.write(l)}),h.debug("send() | calling pc.setLocalDescription() [offer:%o]",p),await this._pc.setLocalDescription(p),l=r.parse(this._pc.localDescription.sdp),a=l.media.find((t=>t.type===e.kind)),m.rtcp.cname=c.getCname({offerMediaObject:a}),m.encodings=d.getRtpEncodings({offerMediaObject:a,track:e}),t)for(let e=0;e1&&("video/vp8"===m.codecs[0].mimeType.toLowerCase()||"video/h264"===m.codecs[0].mimeType.toLowerCase()))for(const e of m.encodings)e.scalabilityMode="L1T3";this._remoteSdp.send({offerMediaObject:a,offerRtpParameters:m,answerRtpParameters:u,codecOptions:s});const f={type:"answer",sdp:this._remoteSdp.getSdp()};h.debug("send() | calling pc.setRemoteDescription() [answer:%o]",f),await this._pc.setRemoteDescription(f);const g=String(this._nextSendLocalId);return this._nextSendLocalId++,this._mapSendLocalIdTrack.set(g,e),{localId:g,rtpParameters:m}}async stopSending(e){this.assertSendDirection(),h.debug("stopSending() [localId:%s]",e);const t=this._mapSendLocalIdTrack.get(e);if(!t)throw new Error("track not found");this._mapSendLocalIdTrack.delete(e),this._sendStream.removeTrack(t),this._pc.addStream(this._sendStream);const s=await this._pc.createOffer();h.debug("stopSending() | calling pc.setLocalDescription() [offer:%o]",s);try{await this._pc.setLocalDescription(s)}catch(e){if(0===this._sendStream.getTracks().length)return void h.warn("stopSending() | ignoring expected error due no sending tracks: %s",e.toString());throw e}if("stable"===this._pc.signalingState)return;const r={type:"answer",sdp:this._remoteSdp.getSdp()};h.debug("stopSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r)}async pauseSending(e){}async resumeSending(e){}async replaceTrack(e,t){throw new a.UnsupportedError("not implemented")}async setMaxSpatialLayer(e,t){throw new a.UnsupportedError("not implemented")}async setRtpEncodingParameters(e,t){throw new a.UnsupportedError("not implemented")}async getSenderStats(e){throw new a.UnsupportedError("not implemented")}async sendDataChannel({ordered:e,maxPacketLifeTime:t,maxRetransmits:s,label:i,protocol:a}){this.assertSendDirection();const n={negotiated:!0,id:this._nextSendSctpStreamId,ordered:e,maxPacketLifeTime:t,maxRetransmitTime:t,maxRetransmits:s,protocol:a};h.debug("sendDataChannel() [options:%o]",n);const o=this._pc.createDataChannel(i,n);if(this._nextSendSctpStreamId=++this._nextSendSctpStreamId%m.MIS,!this._hasDataChannelMediaSection){const e=await this._pc.createOffer(),t=r.parse(e.sdp),s=t.media.find((e=>"application"===e.type));this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:t}),h.debug("sendDataChannel() | calling pc.setLocalDescription() [offer:%o]",e),await this._pc.setLocalDescription(e),this._remoteSdp.sendSctpAssociation({offerMediaObject:s});const i={type:"answer",sdp:this._remoteSdp.getSdp()};h.debug("sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]",i),await this._pc.setRemoteDescription(i),this._hasDataChannelMediaSection=!0}return{dataChannel:o,sctpStreamParameters:{streamId:n.id,ordered:n.ordered,maxPacketLifeTime:n.maxPacketLifeTime,maxRetransmits:n.maxRetransmits}}}async receive(e){this.assertRecvDirection();const t=[],s=new Map;for(const t of e){const{trackId:e,kind:r,rtpParameters:i}=t;h.debug("receive() [trackId:%s, kind:%s]",e,r);const a=r;let o=t.streamId??i.rtcp.cname;h.debug("receive() | forcing a random remote streamId to avoid well known bug in react-native-webrtc"),o+=`-hack-${n.generateRandomNumber()}`,s.set(e,o),this._remoteSdp.receive({mid:a,kind:r,offerRtpParameters:i,streamId:o,trackId:e})}const i={type:"offer",sdp:this._remoteSdp.getSdp()};h.debug("receive() | calling pc.setRemoteDescription() [offer:%o]",i),await this._pc.setRemoteDescription(i);let a=await this._pc.createAnswer();const o=r.parse(a.sdp);for(const t of e){const{kind:e,rtpParameters:s}=t,r=e,i=o.media.find((e=>String(e.mid)===r));c.applyCodecParameters({offerRtpParameters:s,answerMediaObject:i})}a={type:"answer",sdp:r.write(o)},this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:o}),h.debug("receive() | calling pc.setLocalDescription() [answer:%o]",a),await this._pc.setLocalDescription(a);for(const r of e){const{kind:e,trackId:i,rtpParameters:a}=r,n=i,o=e,c=s.get(i),d=this._pc.getRemoteStreams().find((e=>e.id===c)).getTrackById(n);if(!d)throw new Error("remote track not found");this._mapRecvLocalIdInfo.set(n,{mid:o,rtpParameters:a}),t.push({localId:n,track:d})}return t}async stopReceiving(e){this.assertRecvDirection();for(const t of e){h.debug("stopReceiving() [localId:%s]",t);const{mid:e,rtpParameters:s}=this._mapRecvLocalIdInfo.get(t)??{};this._mapRecvLocalIdInfo.delete(t),this._remoteSdp.planBStopReceiving({mid:e,offerRtpParameters:s})}const t={type:"offer",sdp:this._remoteSdp.getSdp()};h.debug("stopReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const s=await this._pc.createAnswer();h.debug("stopReceiving() | calling pc.setLocalDescription() [answer:%o]",s),await this._pc.setLocalDescription(s)}async pauseReceiving(e){}async resumeReceiving(e){}async getReceiverStats(e){throw new a.UnsupportedError("not implemented")}async receiveDataChannel({sctpStreamParameters:e,label:t,protocol:s}){this.assertRecvDirection();const{streamId:i,ordered:a,maxPacketLifeTime:n,maxRetransmits:o}=e,c={negotiated:!0,id:i,ordered:a,maxPacketLifeTime:n,maxRetransmitTime:n,maxRetransmits:o,protocol:s};h.debug("receiveDataChannel() [options:%o]",c);const d=this._pc.createDataChannel(t,c);if(!this._hasDataChannelMediaSection){this._remoteSdp.receiveSctpAssociation({oldDataChannelSpec:!0});const e={type:"offer",sdp:this._remoteSdp.getSdp()};h.debug("receiveDataChannel() | calling pc.setRemoteDescription() [offer:%o]",e),await this._pc.setRemoteDescription(e);const t=await this._pc.createAnswer();if(!this._transportReady){const e=r.parse(t.sdp);await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:e})}h.debug("receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]",t),await this._pc.setLocalDescription(t),this._hasDataChannelMediaSection=!0}return{dataChannel:d}}async setupTransport({localDtlsRole:e,localSdpObject:t}){t||(t=r.parse(this._pc.localDescription.sdp));const s=c.extractDtlsParameters({sdpObject:t});s.role=e,this._remoteSdp.updateDtlsRole("client"===e?"server":"client"),await new Promise(((e,t)=>{this.safeEmit("@connect",{dtlsParameters:s},e,t)})),this._transportReady=!0}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')}}t.ReactNative=u},9596:e=>{"use strict";var t,s="object"==typeof Reflect?Reflect:null,r=s&&"function"==typeof s.apply?s.apply:function(e,t,s){return Function.prototype.apply.call(e,t,s)};t=s&&"function"==typeof s.ownKeys?s.ownKeys:Object.getOwnPropertySymbols?function(e){return Object.getOwnPropertyNames(e).concat(Object.getOwnPropertySymbols(e))}:function(e){return Object.getOwnPropertyNames(e)};var i=Number.isNaN||function(e){return e!=e};function a(){a.init.call(this)}e.exports=a,e.exports.once=function(e,t){return new Promise((function(s,r){function i(s){e.removeListener(t,a),r(s)}function a(){"function"==typeof e.removeListener&&e.removeListener("error",i),s([].slice.call(arguments))}f(e,t,a,{once:!0}),"error"!==t&&function(e,t){"function"==typeof e.on&&f(e,"error",t,{once:!0})}(e,i)}))},a.EventEmitter=a,a.prototype._events=void 0,a.prototype._eventsCount=0,a.prototype._maxListeners=void 0;var n=10;function o(e){if("function"!=typeof e)throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof e)}function c(e){return void 0===e._maxListeners?a.defaultMaxListeners:e._maxListeners}function d(e,t,s,r){var i,a,n,d;if(o(s),void 0===(a=e._events)?(a=e._events=Object.create(null),e._eventsCount=0):(void 0!==a.newListener&&(e.emit("newListener",t,s.listener?s.listener:s),a=e._events),n=a[t]),void 0===n)n=a[t]=s,++e._eventsCount;else if("function"==typeof n?n=a[t]=r?[s,n]:[n,s]:r?n.unshift(s):n.push(s),(i=c(e))>0&&n.length>i&&!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,d=p,console&&console.warn&&console.warn(d)}return e}function p(){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 l(e,t,s){var r={fired:!1,wrapFn:void 0,target:e,type:t,listener:s},i=p.bind(r);return i.listener=s,r.wrapFn=i,i}function h(e,t,s){var r=e._events;if(void 0===r)return[];var i=r[t];return void 0===i?[]:"function"==typeof i?s?[i.listener||i]:[i]:s?function(e){for(var t=new Array(e.length),s=0;s0&&(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)r(c,this,t);else{var d=c.length,p=u(c,d);for(s=0;s=0;a--)if(s[a]===t||s[a].listener===t){n=s[a].listener,i=a;break}if(i<0)return this;0===i?s.shift():function(e,t){for(;t+1=0;r--)this.removeListener(e,t[r]);return this},a.prototype.listeners=function(e){return h(this,e,!0)},a.prototype.rawListeners=function(e){return h(this,e,!1)},a.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):m.call(e,t)},a.prototype.listenerCount=m,a.prototype.eventNames=function(){return this._eventsCount>0?t(this._events):[]}},9676:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Safari11=void 0;const r=s(7363),i=s(2994),a=s(1765),n=s(8046),o=s(5544),c=s(4496),d=s(521),p=s(1305),l=new i.Logger("Safari11"),h={OS:1024,MIS:1024};class m extends d.HandlerInterface{_direction;_remoteSdp;_sendingRtpParametersByKind;_sendingRemoteRtpParametersByKind;_forcedLocalDtlsRole;_pc;_sendStream=new MediaStream;_mapSendLocalIdRtpSender=new Map;_nextSendLocalId=0;_mapRecvLocalIdInfo=new Map;_hasDataChannelMediaSection=!1;_nextSendSctpStreamId=0;_transportReady=!1;static createFactory(){return()=>new m}constructor(){super()}get name(){return"Safari11"}close(){if(l.debug("close()"),this._pc)try{this._pc.close()}catch(e){}this.emit("@close")}async getNativeRtpCapabilities(){l.debug("getNativeRtpCapabilities()");const e=new RTCPeerConnection({iceServers:[],iceTransportPolicy:"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require",sdpSemantics:"plan-b"});try{const t=await e.createOffer({offerToReceiveAudio:!0,offerToReceiveVideo:!0});try{e.close()}catch(e){}const s=r.parse(t.sdp);return o.extractRtpCapabilities({sdpObject:s})}catch(t){try{e.close()}catch(e){}throw t}}async getNativeSctpCapabilities(){return l.debug("getNativeSctpCapabilities()"),{numStreams:h}}run({direction:e,iceParameters:t,iceCandidates:s,dtlsParameters:r,sctpParameters:i,iceServers:a,iceTransportPolicy:o,additionalSettings:c,proprietaryConstraints:d,extendedRtpCapabilities:h}){l.debug("run()"),this._direction=e,this._remoteSdp=new p.RemoteSdp({iceParameters:t,iceCandidates:s,dtlsParameters:r,sctpParameters:i,planB:!0}),this._sendingRtpParametersByKind={audio:n.getSendingRtpParameters("audio",h),video:n.getSendingRtpParameters("video",h)},this._sendingRemoteRtpParametersByKind={audio:n.getSendingRemoteRtpParameters("audio",h),video:n.getSendingRemoteRtpParameters("video",h)},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},d),this._pc.addEventListener("icegatheringstatechange",(()=>{this.emit("@icegatheringstatechange",this._pc.iceGatheringState)})),this._pc.addEventListener("icecandidateerror",(e=>{this.emit("@icecandidateerror",e)})),this._pc.connectionState?this._pc.addEventListener("connectionstatechange",(()=>{this.emit("@connectionstatechange",this._pc.connectionState)})):this._pc.addEventListener("iceconnectionstatechange",(()=>{switch(l.warn("run() | pc.connectionState not supported, using pc.iceConnectionState"),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")}}))}async updateIceServers(e){l.debug("updateIceServers()");const t=this._pc.getConfiguration();t.iceServers=e,this._pc.setConfiguration(t)}async restartIce(e){if(l.debug("restartIce()"),this._remoteSdp.updateIceParameters(e),this._transportReady)if("send"===this._direction){const e=await this._pc.createOffer({iceRestart:!0});l.debug("restartIce() | calling pc.setLocalDescription() [offer:%o]",e),await this._pc.setLocalDescription(e);const t={type:"answer",sdp:this._remoteSdp.getSdp()};l.debug("restartIce() | calling pc.setRemoteDescription() [answer:%o]",t),await this._pc.setRemoteDescription(t)}else{const e={type:"offer",sdp:this._remoteSdp.getSdp()};l.debug("restartIce() | calling pc.setRemoteDescription() [offer:%o]",e),await this._pc.setRemoteDescription(e);const t=await this._pc.createAnswer();l.debug("restartIce() | calling pc.setLocalDescription() [answer:%o]",t),await this._pc.setLocalDescription(t)}}async getTransportStats(){return this._pc.getStats()}async send({track:e,encodings:t,codecOptions:s,codec:i}){this.assertSendDirection(),l.debug("send() [kind:%s, track.id:%s]",e.kind,e.id),i&&l.warn("send() | codec selection is not available in %s handler",this.name),this._sendStream.addTrack(e),this._pc.addTrack(e,this._sendStream);let d,p=await this._pc.createOffer(),h=r.parse(p.sdp);h.extmapAllowMixed&&this._remoteSdp.setSessionExtmapAllowMixed();const m=a.clone(this._sendingRtpParametersByKind[e.kind]);m.codecs=n.reduceCodecs(m.codecs);const u=a.clone(this._sendingRemoteRtpParametersByKind[e.kind]);if(u.codecs=n.reduceCodecs(u.codecs),this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:h}),"video"===e.kind&&t&&t.length>1&&(l.debug("send() | enabling simulcast"),h=r.parse(p.sdp),d=h.media.find((e=>"video"===e.type)),c.addLegacySimulcast({offerMediaObject:d,track:e,numStreams:t.length}),p={type:"offer",sdp:r.write(h)}),l.debug("send() | calling pc.setLocalDescription() [offer:%o]",p),await this._pc.setLocalDescription(p),h=r.parse(this._pc.localDescription.sdp),d=h.media.find((t=>t.type===e.kind)),m.rtcp.cname=o.getCname({offerMediaObject:d}),m.encodings=c.getRtpEncodings({offerMediaObject:d,track:e}),t)for(let e=0;e1&&"video/vp8"===m.codecs[0].mimeType.toLowerCase())for(const e of m.encodings)e.scalabilityMode="L1T3";this._remoteSdp.send({offerMediaObject:d,offerRtpParameters:m,answerRtpParameters:u,codecOptions:s});const f={type:"answer",sdp:this._remoteSdp.getSdp()};l.debug("send() | calling pc.setRemoteDescription() [answer:%o]",f),await this._pc.setRemoteDescription(f);const g=String(this._nextSendLocalId);this._nextSendLocalId++;const _=this._pc.getSenders().find((t=>t.track===e));return this._mapSendLocalIdRtpSender.set(g,_),{localId:g,rtpParameters:m,rtpSender:_}}async stopSending(e){this.assertSendDirection();const t=this._mapSendLocalIdRtpSender.get(e);if(!t)throw new Error("associated RTCRtpSender not found");t.track&&this._sendStream.removeTrack(t.track),this._mapSendLocalIdRtpSender.delete(e);const s=await this._pc.createOffer();l.debug("stopSending() | calling pc.setLocalDescription() [offer:%o]",s);try{await this._pc.setLocalDescription(s)}catch(e){if(0===this._sendStream.getTracks().length)return void l.warn("stopSending() | ignoring expected error due no sending tracks: %s",e.toString());throw e}if("stable"===this._pc.signalingState)return;const r={type:"answer",sdp:this._remoteSdp.getSdp()};l.debug("stopSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r)}async pauseSending(e){}async resumeSending(e){}async replaceTrack(e,t){this.assertSendDirection(),t?l.debug("replaceTrack() [localId:%s, track.id:%s]",e,t.id):l.debug("replaceTrack() [localId:%s, no track]",e);const s=this._mapSendLocalIdRtpSender.get(e);if(!s)throw new Error("associated RTCRtpSender not found");const r=s.track;await s.replaceTrack(t),r&&this._sendStream.removeTrack(r),t&&this._sendStream.addTrack(t)}async setMaxSpatialLayer(e,t){this.assertSendDirection(),l.debug("setMaxSpatialLayer() [localId:%s, spatialLayer:%s]",e,t);const s=this._mapSendLocalIdRtpSender.get(e);if(!s)throw new Error("associated RTCRtpSender not found");const r=s.getParameters();r.encodings.forEach(((e,s)=>{e.active=s<=t})),await s.setParameters(r)}async setRtpEncodingParameters(e,t){this.assertSendDirection(),l.debug("setRtpEncodingParameters() [localId:%s, params:%o]",e,t);const s=this._mapSendLocalIdRtpSender.get(e);if(!s)throw new Error("associated RTCRtpSender not found");const r=s.getParameters();r.encodings.forEach(((e,s)=>{r.encodings[s]={...e,...t}})),await s.setParameters(r)}async getSenderStats(e){this.assertSendDirection();const t=this._mapSendLocalIdRtpSender.get(e);if(!t)throw new Error("associated RTCRtpSender not found");return t.getStats()}async sendDataChannel({ordered:e,maxPacketLifeTime:t,maxRetransmits:s,label:i,protocol:a}){this.assertSendDirection();const n={negotiated:!0,id:this._nextSendSctpStreamId,ordered:e,maxPacketLifeTime:t,maxRetransmits:s,protocol:a};l.debug("sendDataChannel() [options:%o]",n);const o=this._pc.createDataChannel(i,n);if(this._nextSendSctpStreamId=++this._nextSendSctpStreamId%h.MIS,!this._hasDataChannelMediaSection){const e=await this._pc.createOffer(),t=r.parse(e.sdp),s=t.media.find((e=>"application"===e.type));this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:t}),l.debug("sendDataChannel() | calling pc.setLocalDescription() [offer:%o]",e),await this._pc.setLocalDescription(e),this._remoteSdp.sendSctpAssociation({offerMediaObject:s});const i={type:"answer",sdp:this._remoteSdp.getSdp()};l.debug("sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]",i),await this._pc.setRemoteDescription(i),this._hasDataChannelMediaSection=!0}return{dataChannel:o,sctpStreamParameters:{streamId:n.id,ordered:n.ordered,maxPacketLifeTime:n.maxPacketLifeTime,maxRetransmits:n.maxRetransmits}}}async receive(e){this.assertRecvDirection();const t=[];for(const t of e){const{trackId:e,kind:s,rtpParameters:r,streamId:i}=t;l.debug("receive() [trackId:%s, kind:%s]",e,s);const a=s;this._remoteSdp.receive({mid:a,kind:s,offerRtpParameters:r,streamId:i??r.rtcp.cname,trackId:e})}const s={type:"offer",sdp:this._remoteSdp.getSdp()};l.debug("receive() | calling pc.setRemoteDescription() [offer:%o]",s),await this._pc.setRemoteDescription(s);let i=await this._pc.createAnswer();const a=r.parse(i.sdp);for(const t of e){const{kind:e,rtpParameters:s}=t,r=e,i=a.media.find((e=>String(e.mid)===r));o.applyCodecParameters({offerRtpParameters:s,answerMediaObject:i})}i={type:"answer",sdp:r.write(a)},this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:a}),l.debug("receive() | calling pc.setLocalDescription() [answer:%o]",i),await this._pc.setLocalDescription(i);for(const s of e){const{kind:e,trackId:r,rtpParameters:i}=s,a=e,n=r,o=this._pc.getReceivers().find((e=>e.track&&e.track.id===n));if(!o)throw new Error("new RTCRtpReceiver not");this._mapRecvLocalIdInfo.set(n,{mid:a,rtpParameters:i,rtpReceiver:o}),t.push({localId:n,track:o.track,rtpReceiver:o})}return t}async stopReceiving(e){this.assertRecvDirection();for(const t of e){l.debug("stopReceiving() [localId:%s]",t);const{mid:e,rtpParameters:s}=this._mapRecvLocalIdInfo.get(t)??{};this._mapRecvLocalIdInfo.delete(t),this._remoteSdp.planBStopReceiving({mid:e,offerRtpParameters:s})}const t={type:"offer",sdp:this._remoteSdp.getSdp()};l.debug("stopReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const s=await this._pc.createAnswer();l.debug("stopReceiving() | calling pc.setLocalDescription() [answer:%o]",s),await this._pc.setLocalDescription(s)}async getReceiverStats(e){this.assertRecvDirection();const{rtpReceiver:t}=this._mapRecvLocalIdInfo.get(e)??{};if(!t)throw new Error("associated RTCRtpReceiver not found");return t.getStats()}async pauseReceiving(e){}async resumeReceiving(e){}async receiveDataChannel({sctpStreamParameters:e,label:t,protocol:s}){this.assertRecvDirection();const{streamId:i,ordered:a,maxPacketLifeTime:n,maxRetransmits:o}=e,c={negotiated:!0,id:i,ordered:a,maxPacketLifeTime:n,maxRetransmits:o,protocol:s};l.debug("receiveDataChannel() [options:%o]",c);const d=this._pc.createDataChannel(t,c);if(!this._hasDataChannelMediaSection){this._remoteSdp.receiveSctpAssociation({oldDataChannelSpec:!0});const e={type:"offer",sdp:this._remoteSdp.getSdp()};l.debug("receiveDataChannel() | calling pc.setRemoteDescription() [offer:%o]",e),await this._pc.setRemoteDescription(e);const t=await this._pc.createAnswer();if(!this._transportReady){const e=r.parse(t.sdp);await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:e})}l.debug("receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]",t),await this._pc.setLocalDescription(t),this._hasDataChannelMediaSection=!0}return{dataChannel:d}}async setupTransport({localDtlsRole:e,localSdpObject:t}){t||(t=r.parse(this._pc.localDescription.sdp));const s=o.extractDtlsParameters({sdpObject:t});s.role=e,this._remoteSdp.updateDtlsRole("client"===e?"server":"client"),await new Promise(((e,t)=>{this.safeEmit("@connect",{dtlsParameters:s},e,t)})),this._transportReady=!0}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')}}t.Safari11=m},9746:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=s(6697);t.default=function(e){return"string"==typeof e&&r.default.test(e)}},9792:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Producer=void 0;const r=s(2994),i=s(3953),a=s(4893),n=new r.Logger("Producer");class o extends i.EnhancedEventEmitter{_id;_localId;_closed=!1;_rtpSender;_track;_kind;_rtpParameters;_paused;_maxSpatialLayer;_stopTracks;_disableTrackOnPause;_zeroRtpOnPause;_appData;_observer=new i.EnhancedEventEmitter;constructor({id:e,localId:t,rtpSender:s,track:r,rtpParameters:i,stopTracks:a,disableTrackOnPause:o,zeroRtpOnPause:c,appData:d}){super(),n.debug("constructor()"),this._id=e,this._localId=t,this._rtpSender=s,this._track=r,this._kind=r.kind,this._rtpParameters=i,this._paused=!!o&&!r.enabled,this._maxSpatialLayer=void 0,this._stopTracks=a,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||(n.debug("close()"),this._closed=!0,this.destroyTrack(),this.emit("@close"),this._observer.safeEmit("close"))}transportClosed(){this._closed||(n.debug("transportClosed()"),this._closed=!0,this.destroyTrack(),this.safeEmit("transportclose"),this._observer.safeEmit("close"))}async getStats(){if(this._closed)throw new a.InvalidStateError("closed");return new Promise(((e,t)=>{this.safeEmit("@getstats",e,t)}))}pause(){n.debug("pause()"),this._closed?n.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(){n.debug("resume()"),this._closed?n.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(n.debug("replaceTrack() [track:%o]",e),this._closed){if(e&&this._stopTracks)try{e.stop()}catch(e){}throw new a.InvalidStateError("closed")}if(e&&"ended"===e.readyState)throw new a.InvalidStateError("track ended");e!==this._track?(await new Promise(((t,s)=>{this.safeEmit("@replacetrack",e,t,s)})),this.destroyTrack(),this._track=e,this._track&&this._disableTrackOnPause&&(this._paused?this._paused&&(this._track.enabled=!1):this._track.enabled=!0),this.handleTrack()):n.debug("replaceTrack() | same track, ignored")}async setMaxSpatialLayer(e){if(this._closed)throw new a.InvalidStateError("closed");if("video"!==this._kind)throw new a.UnsupportedError("not a video Producer");if("number"!=typeof e)throw new TypeError("invalid spatialLayer");e!==this._maxSpatialLayer&&(await new Promise(((t,s)=>{this.safeEmit("@setmaxspatiallayer",e,t,s)})).catch((()=>{})),this._maxSpatialLayer=e)}async setRtpEncodingParameters(e){if(this._closed)throw new a.InvalidStateError("closed");if("object"!=typeof e)throw new TypeError("invalid params");await new Promise(((t,s)=>{this.safeEmit("@setrtpencodingparameters",e,t,s)}))}onTrackEnded(){n.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){}}}t.Producer=o}},t={};function s(r){var i=t[r];if(void 0!==i)return i.exports;var a=t[r]={exports:{}};return e[r].call(a.exports,a,a.exports,s),a.exports}s.amdO={};var r=s(76);window.mediasoupClient=r})();
\ No newline at end of file
+(()=>{var e={11:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Chrome74=void 0;const r=s(7363),i=s(2994),a=s(1765),n=s(8046),o=s(5544),c=s(5938),d=s(4256),p=s(4893),l=s(521),h=s(1305),m=s(3303),u=new i.Logger("Chrome74"),f={OS:1024,MIS:1024};class g extends l.HandlerInterface{_closed=!1;_direction;_remoteSdp;_sendingRtpParametersByKind;_sendingRemoteRtpParametersByKind;_forcedLocalDtlsRole;_pc;_mapMidTransceiver=new Map;_sendStream=new MediaStream;_hasDataChannelMediaSection=!1;_nextSendSctpStreamId=0;_transportReady=!1;static createFactory(){return()=>new g}constructor(){super()}get name(){return"Chrome74"}close(){if(u.debug("close()"),!this._closed){if(this._closed=!0,this._pc)try{this._pc.close()}catch(e){}this.emit("@close")}}async getNativeRtpCapabilities(){u.debug("getNativeRtpCapabilities()");const e=new RTCPeerConnection({iceServers:[],iceTransportPolicy:"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require",sdpSemantics:"unified-plan"});try{e.addTransceiver("audio"),e.addTransceiver("video");const t=await e.createOffer();try{e.close()}catch(e){}const s=r.parse(t.sdp),i=o.extractRtpCapabilities({sdpObject:s});return d.addNackSupportForOpus(i),i}catch(t){try{e.close()}catch(e){}throw t}}async getNativeSctpCapabilities(){return u.debug("getNativeSctpCapabilities()"),{numStreams:f}}run({direction:e,iceParameters:t,iceCandidates:s,dtlsParameters:r,sctpParameters:i,iceServers:a,iceTransportPolicy:o,additionalSettings:c,proprietaryConstraints:d,extendedRtpCapabilities:p}){u.debug("run()"),this._direction=e,this._remoteSdp=new h.RemoteSdp({iceParameters:t,iceCandidates:s,dtlsParameters:r,sctpParameters:i}),this._sendingRtpParametersByKind={audio:n.getSendingRtpParameters("audio",p),video:n.getSendingRtpParameters("video",p)},this._sendingRemoteRtpParametersByKind={audio:n.getSendingRemoteRtpParameters("audio",p),video:n.getSendingRemoteRtpParameters("video",p)},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",sdpSemantics:"unified-plan",...c},d),this._pc.addEventListener("icegatheringstatechange",(()=>{this.emit("@icegatheringstatechange",this._pc.iceGatheringState)})),this._pc.addEventListener("icecandidateerror",(e=>{this.emit("@icecandidateerror",e)})),this._pc.connectionState?this._pc.addEventListener("connectionstatechange",(()=>{this.emit("@connectionstatechange",this._pc.connectionState)})):(u.warn("run() | pc.connectionState not supported, using pc.iceConnectionState"),this._pc.addEventListener("iceconnectionstatechange",(()=>{switch(this._pc.iceConnectionState){case"checking":this.emit("@connectionstatechange","connecting");break;case"connected":case"completed":this.emit("@connectionstatechange","connected");break;case"failed":this.emit("@connectionstatechange","failed");break;case"disconnected":this.emit("@connectionstatechange","disconnected");break;case"closed":this.emit("@connectionstatechange","closed")}})))}async updateIceServers(e){this.assertNotClosed(),u.debug("updateIceServers()");const t=this._pc.getConfiguration();t.iceServers=e,this._pc.setConfiguration(t)}async restartIce(e){if(this.assertNotClosed(),u.debug("restartIce()"),this._remoteSdp.updateIceParameters(e),this._transportReady)if("send"===this._direction){const e=await this._pc.createOffer({iceRestart:!0});u.debug("restartIce() | calling pc.setLocalDescription() [offer:%o]",e),await this._pc.setLocalDescription(e);const t={type:"answer",sdp:this._remoteSdp.getSdp()};u.debug("restartIce() | calling pc.setRemoteDescription() [answer:%o]",t),await this._pc.setRemoteDescription(t)}else{const e={type:"offer",sdp:this._remoteSdp.getSdp()};u.debug("restartIce() | calling pc.setRemoteDescription() [offer:%o]",e),await this._pc.setRemoteDescription(e);const t=await this._pc.createAnswer();u.debug("restartIce() | calling pc.setLocalDescription() [answer:%o]",t),await this._pc.setLocalDescription(t)}}async getTransportStats(){return this.assertNotClosed(),this._pc.getStats()}async send({track:e,encodings:t,codecOptions:s,codec:i}){this.assertNotClosed(),this.assertSendDirection(),u.debug("send() [kind:%s, track.id:%s]",e.kind,e.id),t&&t.length>1&&t.forEach(((e,t)=>{e.rid=`r${t}`}));const d=a.clone(this._sendingRtpParametersByKind[e.kind]);d.codecs=n.reduceCodecs(d.codecs,i);const p=a.clone(this._sendingRemoteRtpParametersByKind[e.kind]);p.codecs=n.reduceCodecs(p.codecs,i);const l=this._remoteSdp.getNextMediaSectionIdx(),h=this._pc.addTransceiver(e,{direction:"sendonly",streams:[this._sendStream],sendEncodings:t});let f,g=await this._pc.createOffer(),_=r.parse(g.sdp);_.extmapAllowMixed&&this._remoteSdp.setSessionExtmapAllowMixed(),this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:_});let w=!1;const b=(0,m.parse)((t??[{}])[0].scalabilityMode);t&&1===t.length&&b.spatialLayers>1&&"video/vp9"===d.codecs[0].mimeType.toLowerCase()&&(u.debug("send() | enabling legacy simulcast for VP9 SVC"),w=!0,_=r.parse(g.sdp),f=_.media[l.idx],c.addLegacySimulcast({offerMediaObject:f,numStreams:b.spatialLayers}),g={type:"offer",sdp:r.write(_)}),u.debug("send() | calling pc.setLocalDescription() [offer:%o]",g),await this._pc.setLocalDescription(g);const v=h.mid;if(d.mid=v,_=r.parse(this._pc.localDescription.sdp),f=_.media[l.idx],d.rtcp.cname=o.getCname({offerMediaObject:f}),t)if(1===t.length){let e=c.getRtpEncodings({offerMediaObject:f});Object.assign(e[0],t[0]),w&&(e=[e[0]]),d.encodings=e}else d.encodings=t;else d.encodings=c.getRtpEncodings({offerMediaObject:f});if(d.encodings.length>1&&("video/vp8"===d.codecs[0].mimeType.toLowerCase()||"video/h264"===d.codecs[0].mimeType.toLowerCase()))for(const e of d.encodings)e.scalabilityMode?e.scalabilityMode=`L1T${b.temporalLayers}`:e.scalabilityMode="L1T3";this._remoteSdp.send({offerMediaObject:f,reuseMid:l.reuseMid,offerRtpParameters:d,answerRtpParameters:p,codecOptions:s});const y={type:"answer",sdp:this._remoteSdp.getSdp()};return u.debug("send() | calling pc.setRemoteDescription() [answer:%o]",y),await this._pc.setRemoteDescription(y),this._mapMidTransceiver.set(v,h),{localId:v,rtpParameters:d,rtpSender:h.sender}}async stopSending(e){if(this.assertSendDirection(),u.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 s=await this._pc.createOffer();u.debug("stopSending() | calling pc.setLocalDescription() [offer:%o]",s),await this._pc.setLocalDescription(s);const r={type:"answer",sdp:this._remoteSdp.getSdp()};u.debug("stopSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r),this._mapMidTransceiver.delete(e)}async pauseSending(e){this.assertNotClosed(),this.assertSendDirection(),u.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 s=await this._pc.createOffer();u.debug("pauseSending() | calling pc.setLocalDescription() [offer:%o]",s),await this._pc.setLocalDescription(s);const r={type:"answer",sdp:this._remoteSdp.getSdp()};u.debug("pauseSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r)}async resumeSending(e){this.assertNotClosed(),this.assertSendDirection(),u.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 s=await this._pc.createOffer();u.debug("resumeSending() | calling pc.setLocalDescription() [offer:%o]",s),await this._pc.setLocalDescription(s);const r={type:"answer",sdp:this._remoteSdp.getSdp()};u.debug("resumeSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r)}async replaceTrack(e,t){this.assertNotClosed(),this.assertSendDirection(),t?u.debug("replaceTrack() [localId:%s, track.id:%s]",e,t.id):u.debug("replaceTrack() [localId:%s, no track]",e);const s=this._mapMidTransceiver.get(e);if(!s)throw new Error("associated RTCRtpTransceiver not found");await s.sender.replaceTrack(t)}async setMaxSpatialLayer(e,t){this.assertNotClosed(),this.assertSendDirection(),u.debug("setMaxSpatialLayer() [localId:%s, spatialLayer:%s]",e,t);const s=this._mapMidTransceiver.get(e);if(!s)throw new Error("associated RTCRtpTransceiver not found");const r=s.sender.getParameters();r.encodings.forEach(((e,s)=>{e.active=s<=t})),await s.sender.setParameters(r),this._remoteSdp.muxMediaSectionSimulcast(e,r.encodings);const i=await this._pc.createOffer();u.debug("setMaxSpatialLayer() | calling pc.setLocalDescription() [offer:%o]",i),await this._pc.setLocalDescription(i);const a={type:"answer",sdp:this._remoteSdp.getSdp()};u.debug("setMaxSpatialLayer() | calling pc.setRemoteDescription() [answer:%o]",a),await this._pc.setRemoteDescription(a)}async setRtpEncodingParameters(e,t){this.assertNotClosed(),this.assertSendDirection(),u.debug("setRtpEncodingParameters() [localId:%s, params:%o]",e,t);const s=this._mapMidTransceiver.get(e);if(!s)throw new Error("associated RTCRtpTransceiver not found");const r=s.sender.getParameters();r.encodings.forEach(((e,s)=>{r.encodings[s]={...e,...t}})),await s.sender.setParameters(r),this._remoteSdp.muxMediaSectionSimulcast(e,r.encodings);const i=await this._pc.createOffer();u.debug("setRtpEncodingParameters() | calling pc.setLocalDescription() [offer:%o]",i),await this._pc.setLocalDescription(i);const a={type:"answer",sdp:this._remoteSdp.getSdp()};u.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:e,maxPacketLifeTime:t,maxRetransmits:s,label:i,protocol:a}){this.assertNotClosed(),this.assertSendDirection();const n={negotiated:!0,id:this._nextSendSctpStreamId,ordered:e,maxPacketLifeTime:t,maxRetransmits:s,protocol:a};u.debug("sendDataChannel() [options:%o]",n);const o=this._pc.createDataChannel(i,n);if(this._nextSendSctpStreamId=++this._nextSendSctpStreamId%f.MIS,!this._hasDataChannelMediaSection){const e=await this._pc.createOffer(),t=r.parse(e.sdp),s=t.media.find((e=>"application"===e.type));this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:t}),u.debug("sendDataChannel() | calling pc.setLocalDescription() [offer:%o]",e),await this._pc.setLocalDescription(e),this._remoteSdp.sendSctpAssociation({offerMediaObject:s});const i={type:"answer",sdp:this._remoteSdp.getSdp()};u.debug("sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]",i),await this._pc.setRemoteDescription(i),this._hasDataChannelMediaSection=!0}return{dataChannel:o,sctpStreamParameters:{streamId:n.id,ordered:n.ordered,maxPacketLifeTime:n.maxPacketLifeTime,maxRetransmits:n.maxRetransmits}}}async receive(e){this.assertNotClosed(),this.assertRecvDirection();const t=[],s=new Map;for(const t of e){const{trackId:e,kind:r,rtpParameters:i,streamId:a}=t;u.debug("receive() [trackId:%s, kind:%s]",e,r);const n=i.mid??String(this._mapMidTransceiver.size);s.set(e,n),this._remoteSdp.receive({mid:n,kind:r,offerRtpParameters:i,streamId:a??i.rtcp.cname,trackId:e})}const i={type:"offer",sdp:this._remoteSdp.getSdp()};u.debug("receive() | calling pc.setRemoteDescription() [offer:%o]",i),await this._pc.setRemoteDescription(i);let a=await this._pc.createAnswer();const n=r.parse(a.sdp);for(const t of e){const{trackId:e,rtpParameters:r}=t,i=s.get(e),a=n.media.find((e=>String(e.mid)===i));o.applyCodecParameters({offerRtpParameters:r,answerMediaObject:a})}a={type:"answer",sdp:r.write(n)},this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:n}),u.debug("receive() | calling pc.setLocalDescription() [answer:%o]",a),await this._pc.setLocalDescription(a);for(const r of e){const{trackId:e}=r,i=s.get(e),a=this._pc.getTransceivers().find((e=>e.mid===i));if(!a)throw new Error("new RTCRtpTransceiver not found");this._mapMidTransceiver.set(i,a),t.push({localId:i,track:a.receiver.track,rtpReceiver:a.receiver})}return t}async stopReceiving(e){if(this.assertRecvDirection(),this._closed)return;for(const t of e){u.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()};u.debug("stopReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const s=await this._pc.createAnswer();u.debug("stopReceiving() | calling pc.setLocalDescription() [answer:%o]",s),await this._pc.setLocalDescription(s);for(const t of e)this._mapMidTransceiver.delete(t)}async pauseReceiving(e){this.assertNotClosed(),this.assertRecvDirection();for(const t of e){u.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()};u.debug("pauseReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const s=await this._pc.createAnswer();u.debug("pauseReceiving() | calling pc.setLocalDescription() [answer:%o]",s),await this._pc.setLocalDescription(s)}async resumeReceiving(e){this.assertNotClosed(),this.assertRecvDirection();for(const t of e){u.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()};u.debug("resumeReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const s=await this._pc.createAnswer();u.debug("resumeReceiving() | calling pc.setLocalDescription() [answer:%o]",s),await this._pc.setLocalDescription(s)}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:e,label:t,protocol:s}){this.assertNotClosed(),this.assertRecvDirection();const{streamId:i,ordered:a,maxPacketLifeTime:n,maxRetransmits:o}=e,c={negotiated:!0,id:i,ordered:a,maxPacketLifeTime:n,maxRetransmits:o,protocol:s};u.debug("receiveDataChannel() [options:%o]",c);const d=this._pc.createDataChannel(t,c);if(!this._hasDataChannelMediaSection){this._remoteSdp.receiveSctpAssociation();const e={type:"offer",sdp:this._remoteSdp.getSdp()};u.debug("receiveDataChannel() | calling pc.setRemoteDescription() [offer:%o]",e),await this._pc.setRemoteDescription(e);const t=await this._pc.createAnswer();if(!this._transportReady){const e=r.parse(t.sdp);await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:e})}u.debug("receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]",t),await this._pc.setLocalDescription(t),this._hasDataChannelMediaSection=!0}return{dataChannel:d}}async setupTransport({localDtlsRole:e,localSdpObject:t}){t||(t=r.parse(this._pc.localDescription.sdp));const s=o.extractDtlsParameters({sdpObject:t});s.role=e,this._remoteSdp.updateDtlsRole("client"===e?"server":"client"),await new Promise(((e,t)=>{this.safeEmit("@connect",{dtlsParameters:s},e,t)})),this._transportReady=!0}assertNotClosed(){if(this._closed)throw new p.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')}}t.Chrome74=g},76:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.debug=t.testFakeParameters=t.FakeHandler=t.ortc=t.parseScalabilityMode=t.detectDeviceAsync=t.detectDevice=t.Device=t.version=t.types=void 0;const r=s(7833);t.debug=r.default,t.types=s(8057),t.version="3.11.0";var i=s(6004);Object.defineProperty(t,"Device",{enumerable:!0,get:function(){return i.Device}}),Object.defineProperty(t,"detectDevice",{enumerable:!0,get:function(){return i.detectDevice}}),Object.defineProperty(t,"detectDeviceAsync",{enumerable:!0,get:function(){return i.detectDeviceAsync}});var a=s(3303);Object.defineProperty(t,"parseScalabilityMode",{enumerable:!0,get:function(){return a.parse}}),t.ortc=s(8046);var n=s(2731);Object.defineProperty(t,"FakeHandler",{enumerable:!0,get:function(){return n.FakeHandler}}),t.testFakeParameters=s(5248)},182:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.version=t.validate=t.v7=t.v6ToV1=t.v6=t.v5=t.v4=t.v3=t.v1ToV6=t.v1=t.stringify=t.parse=t.NIL=t.MAX=void 0;var r=s(2196);Object.defineProperty(t,"MAX",{enumerable:!0,get:function(){return r.default}});var i=s(3465);Object.defineProperty(t,"NIL",{enumerable:!0,get:function(){return i.default}});var a=s(1797);Object.defineProperty(t,"parse",{enumerable:!0,get:function(){return a.default}});var n=s(6011);Object.defineProperty(t,"stringify",{enumerable:!0,get:function(){return n.default}});var o=s(1425);Object.defineProperty(t,"v1",{enumerable:!0,get:function(){return o.default}});var c=s(6568);Object.defineProperty(t,"v1ToV6",{enumerable:!0,get:function(){return c.default}});var d=s(591);Object.defineProperty(t,"v3",{enumerable:!0,get:function(){return d.default}});var p=s(8286);Object.defineProperty(t,"v4",{enumerable:!0,get:function(){return p.default}});var l=s(4557);Object.defineProperty(t,"v5",{enumerable:!0,get:function(){return l.default}});var h=s(6356);Object.defineProperty(t,"v6",{enumerable:!0,get:function(){return h.default}});var m=s(268);Object.defineProperty(t,"v6ToV1",{enumerable:!0,get:function(){return m.default}});var u=s(4299);Object.defineProperty(t,"v7",{enumerable:!0,get:function(){return u.default}});var f=s(9746);Object.defineProperty(t,"validate",{enumerable:!0,get:function(){return f.default}});var g=s(2770);Object.defineProperty(t,"version",{enumerable:!0,get:function(){return g.default}})},268:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=s(1797),i=s(6011);t.default=function(e){const t=(s="string"==typeof e?(0,r.default)(e):e,Uint8Array.of((15&s[3])<<4|s[4]>>4&15,(15&s[4])<<4|(240&s[5])>>4,(15&s[5])<<4|15&s[6],s[7],(15&s[1])<<4|(240&s[2])>>4,(15&s[2])<<4|(240&s[3])>>4,16|(240&s[0])>>4,(15&s[0])<<4|(240&s[1])>>4,s[8],s[9],s[10],s[11],s[12],s[13],s[14],s[15]));var s;return"string"==typeof e?(0,i.unsafeStringify)(t):t}},338:(e,t)=>{"use strict";function s(e){return 14+(e+64>>>9<<4)+1}function r(e,t){const s=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(s>>16)<<16|65535&s}function i(e,t,s,i,a,n){return r((o=r(r(t,e),r(i,n)))<<(c=a)|o>>>32-c,s);var o,c}function a(e,t,s,r,a,n,o){return i(t&s|~t&r,e,t,a,n,o)}function n(e,t,s,r,a,n,o){return i(t&r|s&~r,e,t,a,n,o)}function o(e,t,s,r,a,n,o){return i(t^s^r,e,t,a,n,o)}function c(e,t,s,r,a,n,o){return i(s^(t|~r),e,t,a,n,o)}Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return function(e){const t=new Uint8Array(4*e.length);for(let s=0;s<4*e.length;s++)t[s]=e[s>>2]>>>s%4*8&255;return t}(function(e,t){const i=new Uint32Array(s(t)).fill(0);i.set(e),i[t>>5]|=128<>2]|=(255&e[s])<{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.HandlerInterface=void 0;const r=s(3953);class i extends r.EnhancedEventEmitter{constructor(){super()}}t.HandlerInterface=i},591:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.URL=t.DNS=void 0;const r=s(338),i=s(2988);var a=s(2988);function n(e,t,s,a){return(0,i.default)(48,r.default,e,t,s,a)}Object.defineProperty(t,"DNS",{enumerable:!0,get:function(){return a.DNS}}),Object.defineProperty(t,"URL",{enumerable:!0,get:function(){return a.URL}}),n.DNS=i.DNS,n.URL=i.URL,t.default=n},736:(e,t,s)=>{e.exports=function(e){function t(e){let s,i,a,n=null;function o(...e){if(!o.enabled)return;const r=o,i=Number(new Date),a=i-(s||i);r.diff=a,r.prev=s,r.curr=i,s=i,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,((s,i)=>{if("%%"===s)return"%";n++;const a=t.formatters[i];if("function"==typeof a){const t=e[n];s=a.call(r,t),e.splice(n,1),n--}return s})),t.formatArgs.call(r,e),(r.log||t.log).apply(r,e)}return o.namespace=e,o.useColors=t.useColors(),o.color=t.selectColor(e),o.extend=r,o.destroy=t.destroy,Object.defineProperty(o,"enabled",{enumerable:!0,configurable:!1,get:()=>null!==n?n:(i!==t.namespaces&&(i=t.namespaces,a=t.enabled(e)),a),set:e=>{n=e}}),"function"==typeof t.init&&t.init(o),o}function r(e,s){const r=t(this.namespace+(void 0===s?":":s)+e);return r.log=this.log,r}function i(e,t){let s=0,r=0,i=-1,a=0;for(;s"-"+e))].join(",");return t.enable(""),e},t.enable=function(e){t.save(e),t.namespaces=e,t.names=[],t.skips=[];const s=("string"==typeof e?e:"").trim().replace(/\s+/g,",").split(",").filter(Boolean);for(const e of s)"-"===e[0]?t.skips.push(e.slice(1)):t.names.push(e)},t.enabled=function(e){for(const s of t.skips)if(i(e,s))return!1;for(const s of t.names)if(i(e,s))return!0;return!1},t.humanize=s(6585),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((s=>{t[s]=e[s]})),t.names=[],t.skips=[],t.formatters={},t.selectColor=function(e){let s=0;for(let t=0;t{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.RemoteSdp=void 0;const r=s(7363),i=s(2994),a=s(3471),n=new i.Logger("RemoteSdp");t.RemoteSdp=class{_iceParameters;_iceCandidates;_dtlsParameters;_sctpParameters;_plainRtpParameters;_planB;_mediaSections=[];_midToIndex=new Map;_firstMid;_sdpObject;constructor({iceParameters:e,iceCandidates:t,dtlsParameters:s,sctpParameters:r,plainRtpParameters:i,planB:a=!1}){if(this._iceParameters=e,this._iceCandidates=t,this._dtlsParameters=s,this._sctpParameters=r,this._plainRtpParameters=i,this._planB=a,this._sdpObject={version:0,origin:{address:"0.0.0.0",ipVer:4,netType:"IN",sessionId:1e4,sessionVersion:0,username:"mediasoup-client"},name:"-",timing:{start:0,stop:0},media:[]},e?.iceLite&&(this._sdpObject.icelite="ice-lite"),s){this._sdpObject.msidSemantic={semantic:"WMS",token:"*"};const e=this._dtlsParameters.fingerprints.length;this._sdpObject.fingerprint={type:s.fingerprints[e-1].algorithm,hash:s.fingerprints[e-1].value},this._sdpObject.groups=[{type:"BUNDLE",mids:""}]}i&&(this._sdpObject.origin.address=i.ip,this._sdpObject.origin.ipVer=i.ipVersion)}updateIceParameters(e){n.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){n.debug("updateDtlsRole() [role:%s]",e),this._dtlsParameters.role=e;for(const t of this._mediaSections)t.setDtlsRole(e)}setSessionExtmapAllowMixed(){n.debug("setSessionExtmapAllowMixed()"),this._sdpObject.extmapAllowMixed="extmap-allow-mixed"}getNextMediaSectionIdx(){for(let e=0;ee.closed));n?this._replaceMediaSection(o,n.mid):this._addMediaSection(o)}}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?(n.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 s=this._findMediaSection(e);s.muxSimulcastStreams(t),this._replaceMediaSection(s)}planBStopReceiving({mid:e,offerRtpParameters:t}){const s=this._findMediaSection(e);s.planBStopReceiving({offerRtpParameters:t}),this._replaceMediaSection(s)}sendSctpAssociation({offerMediaObject:e}){const t=new a.AnswerMediaSection({iceParameters:this._iceParameters,iceCandidates:this._iceCandidates,dtlsParameters:this._dtlsParameters,sctpParameters:this._sctpParameters,plainRtpParameters:this._plainRtpParameters,offerMediaObject:e});this._addMediaSection(t)}receiveSctpAssociation({oldDataChannelSpec:e=!1}={}){const t=new a.OfferMediaSection({iceParameters:this._iceParameters,iceCandidates:this._iceCandidates,dtlsParameters:this._dtlsParameters,sctpParameters:this._sctpParameters,plainRtpParameters:this._plainRtpParameters,mid:"datachannel",kind:"application",oldDataChannelSpec:e});this._addMediaSection(t)}getSdp(){return this._sdpObject.origin.sessionVersion++,r.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 s=this._midToIndex.get(t);if(void 0===s)throw new Error(`no media section found for reuseMid '${t}'`);const r=this._mediaSections[s];this._mediaSections[s]=e,this._midToIndex.delete(r.mid),this._midToIndex.set(e.mid,s),this._sdpObject.media[s]=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(" "))}}},1425:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.updateV1State=void 0;const r=s(2291),i=s(6011),a={};function n(e,t,s){return e.msecs??=-1/0,e.nsecs??=0,t===e.msecs?(e.nsecs++,e.nsecs>=1e4&&(e.node=void 0,e.nsecs=0)):t>e.msecs?e.nsecs=0:t= 16");if(a){if(n<0||n+16>a.length)throw new RangeError(`UUID byte range ${n}:${n+15} is out of buffer bounds`)}else a=new Uint8Array(16),n=0;t??=Date.now(),s??=0,r??=16383&(e[8]<<8|e[9]),i??=e.slice(10,16);const o=(1e4*(268435455&(t+=122192928e5))+s)%4294967296;a[n++]=o>>>24&255,a[n++]=o>>>16&255,a[n++]=o>>>8&255,a[n++]=255&o;const c=t/4294967296*1e4&268435455;a[n++]=c>>>8&255,a[n++]=255&c,a[n++]=c>>>24&15|16,a[n++]=c>>>16&255,a[n++]=r>>>8|128,a[n++]=255&r;for(let e=0;e<6;++e)a[n++]=i[e];return a}t.updateV1State=n,t.default=function(e,t,s){let c;const d=e?._v6??!1;if(e){const t=Object.keys(e);1===t.length&&"_v6"===t[0]&&(e=void 0)}if(e)c=o(e.random??e.rng?.()??(0,r.default)(),e.msecs,e.nsecs,e.clockseq,e.node,t,s);else{const e=Date.now(),i=(0,r.default)();n(a,e,i),c=o(i,a.msecs,a.nsecs,d?void 0:a.clockseq,d?void 0:a.node,t,s)}return t??(0,i.unsafeStringify)(c)}},1765:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.clone=function(e){return void 0===e?void 0:Number.isNaN(e)?NaN:"function"==typeof structuredClone?structuredClone(e):JSON.parse(JSON.stringify(e))},t.generateRandomNumber=function(){return Math.round(1e7*Math.random())},t.deepFreeze=function e(t){const s=Reflect.ownKeys(t);for(const r of s){const s=t[r];(s&&"object"==typeof s||"function"==typeof s)&&e(s)}return Object.freeze(t)}},1767:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Firefox60=void 0;const r=s(7363),i=s(2994),a=s(4893),n=s(1765),o=s(8046),c=s(5544),d=s(5938),p=s(521),l=s(1305),h=s(3303),m=new i.Logger("Firefox60"),u={OS:16,MIS:2048};class f extends p.HandlerInterface{_closed=!1;_direction;_remoteSdp;_sendingRtpParametersByKind;_sendingRemoteRtpParametersByKind;_pc;_mapMidTransceiver=new Map;_sendStream=new MediaStream;_hasDataChannelMediaSection=!1;_nextSendSctpStreamId=0;_transportReady=!1;static createFactory(){return()=>new f}constructor(){super()}get name(){return"Firefox60"}close(){if(m.debug("close()"),!this._closed){if(this._closed=!0,this._pc)try{this._pc.close()}catch(e){}this.emit("@close")}}async getNativeRtpCapabilities(){m.debug("getNativeRtpCapabilities()");const e=new RTCPeerConnection({iceServers:[],iceTransportPolicy:"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require"}),t=document.createElement("canvas");t.getContext("2d");const s=t.captureStream().getVideoTracks()[0];try{e.addTransceiver("audio",{direction:"sendrecv"});const i=e.addTransceiver(s,{direction:"sendrecv"}),a=i.sender.getParameters(),n=[{rid:"r0",maxBitrate:1e5},{rid:"r1",maxBitrate:5e5}];a.encodings=n,await i.sender.setParameters(a);const o=await e.createOffer();try{t.remove()}catch(e){}try{s.stop()}catch(e){}try{e.close()}catch(e){}const d=r.parse(o.sdp);return c.extractRtpCapabilities({sdpObject:d})}catch(r){try{t.remove()}catch(e){}try{s.stop()}catch(e){}try{e.close()}catch(e){}throw r}}async getNativeSctpCapabilities(){return m.debug("getNativeSctpCapabilities()"),{numStreams:u}}run({direction:e,iceParameters:t,iceCandidates:s,dtlsParameters:r,sctpParameters:i,iceServers:a,iceTransportPolicy:n,additionalSettings:c,proprietaryConstraints:d,extendedRtpCapabilities:p}){this.assertNotClosed(),m.debug("run()"),this._direction=e,this._remoteSdp=new l.RemoteSdp({iceParameters:t,iceCandidates:s,dtlsParameters:r,sctpParameters:i}),this._sendingRtpParametersByKind={audio:o.getSendingRtpParameters("audio",p),video:o.getSendingRtpParameters("video",p)},this._sendingRemoteRtpParametersByKind={audio:o.getSendingRemoteRtpParameters("audio",p),video:o.getSendingRemoteRtpParameters("video",p)},this._pc=new RTCPeerConnection({iceServers:a??[],iceTransportPolicy:n??"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require",...c},d),this._pc.addEventListener("icegatheringstatechange",(()=>{this.emit("@icegatheringstatechange",this._pc.iceGatheringState)})),this._pc.addEventListener("icecandidateerror",(e=>{this.emit("@icecandidateerror",e)})),this._pc.connectionState?this._pc.addEventListener("connectionstatechange",(()=>{this.emit("@connectionstatechange",this._pc.connectionState)})):this._pc.addEventListener("iceconnectionstatechange",(()=>{switch(m.warn("run() | pc.connectionState not supported, using pc.iceConnectionState"),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")}}))}async updateIceServers(e){throw this.assertNotClosed(),new a.UnsupportedError("not supported")}async restartIce(e){if(this.assertNotClosed(),m.debug("restartIce()"),this._remoteSdp.updateIceParameters(e),this._transportReady)if("send"===this._direction){const e=await this._pc.createOffer({iceRestart:!0});m.debug("restartIce() | calling pc.setLocalDescription() [offer:%o]",e),await this._pc.setLocalDescription(e);const t={type:"answer",sdp:this._remoteSdp.getSdp()};m.debug("restartIce() | calling pc.setRemoteDescription() [answer:%o]",t),await this._pc.setRemoteDescription(t)}else{const e={type:"offer",sdp:this._remoteSdp.getSdp()};m.debug("restartIce() | calling pc.setRemoteDescription() [offer:%o]",e),await this._pc.setRemoteDescription(e);const t=await this._pc.createAnswer();m.debug("restartIce() | calling pc.setLocalDescription() [answer:%o]",t),await this._pc.setLocalDescription(t)}}async getTransportStats(){return this.assertNotClosed(),this._pc.getStats()}async send({track:e,encodings:t,codecOptions:s,codec:i}){this.assertNotClosed(),this.assertSendDirection(),m.debug("send() [kind:%s, track.id:%s]",e.kind,e.id),t&&((t=n.clone(t)).forEach(((e,t)=>{e.rid=`r${t}`})),t.reverse());const a=n.clone(this._sendingRtpParametersByKind[e.kind]);a.codecs=o.reduceCodecs(a.codecs,i);const p=n.clone(this._sendingRemoteRtpParametersByKind[e.kind]);p.codecs=o.reduceCodecs(p.codecs,i);const l=this._pc.addTransceiver(e,{direction:"sendonly",streams:[this._sendStream]});if(t){const e=l.sender.getParameters();e.encodings=t,await l.sender.setParameters(e)}const u=await this._pc.createOffer();let f=r.parse(u.sdp);f.extmapAllowMixed&&this._remoteSdp.setSessionExtmapAllowMixed(),this._transportReady||await this.setupTransport({localDtlsRole:"client",localSdpObject:f});const g=(0,h.parse)((t??[{}])[0].scalabilityMode);m.debug("send() | calling pc.setLocalDescription() [offer:%o]",u),await this._pc.setLocalDescription(u);const _=l.mid;a.mid=_,f=r.parse(this._pc.localDescription.sdp);const w=f.media[f.media.length-1];if(a.rtcp.cname=c.getCname({offerMediaObject:w}),t)if(1===t.length){const e=d.getRtpEncodings({offerMediaObject:w});Object.assign(e[0],t[0]),a.encodings=e}else a.encodings=t.reverse();else a.encodings=d.getRtpEncodings({offerMediaObject:w});if(a.encodings.length>1&&("video/vp8"===a.codecs[0].mimeType.toLowerCase()||"video/h264"===a.codecs[0].mimeType.toLowerCase()))for(const e of a.encodings)e.scalabilityMode?e.scalabilityMode=`L1T${g.temporalLayers}`:e.scalabilityMode="L1T3";this._remoteSdp.send({offerMediaObject:w,offerRtpParameters:a,answerRtpParameters:p,codecOptions:s});const b={type:"answer",sdp:this._remoteSdp.getSdp()};return m.debug("send() | calling pc.setRemoteDescription() [answer:%o]",b),await this._pc.setRemoteDescription(b),this._mapMidTransceiver.set(_,l),{localId:_,rtpParameters:a,rtpSender:l.sender}}async stopSending(e){if(this.assertSendDirection(),m.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 s=await this._pc.createOffer();m.debug("stopSending() | calling pc.setLocalDescription() [offer:%o]",s),await this._pc.setLocalDescription(s);const r={type:"answer",sdp:this._remoteSdp.getSdp()};m.debug("stopSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r),this._mapMidTransceiver.delete(e)}async pauseSending(e){this.assertNotClosed(),this.assertSendDirection(),m.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 s=await this._pc.createOffer();m.debug("pauseSending() | calling pc.setLocalDescription() [offer:%o]",s),await this._pc.setLocalDescription(s);const r={type:"answer",sdp:this._remoteSdp.getSdp()};m.debug("pauseSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r)}async resumeSending(e){this.assertNotClosed(),this.assertSendDirection(),m.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 s=await this._pc.createOffer();m.debug("resumeSending() | calling pc.setLocalDescription() [offer:%o]",s),await this._pc.setLocalDescription(s);const r={type:"answer",sdp:this._remoteSdp.getSdp()};m.debug("resumeSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r)}async replaceTrack(e,t){this.assertNotClosed(),this.assertSendDirection(),t?m.debug("replaceTrack() [localId:%s, track.id:%s]",e,t.id):m.debug("replaceTrack() [localId:%s, no track]",e);const s=this._mapMidTransceiver.get(e);if(!s)throw new Error("associated RTCRtpTransceiver not found");await s.sender.replaceTrack(t)}async setMaxSpatialLayer(e,t){this.assertNotClosed(),this.assertSendDirection(),m.debug("setMaxSpatialLayer() [localId:%s, spatialLayer:%s]",e,t);const s=this._mapMidTransceiver.get(e);if(!s)throw new Error("associated transceiver not found");const r=s.sender.getParameters();t=r.encodings.length-1-t,r.encodings.forEach(((e,s)=>{e.active=s>=t})),await s.sender.setParameters(r),this._remoteSdp.muxMediaSectionSimulcast(e,r.encodings);const i=await this._pc.createOffer();m.debug("setMaxSpatialLayer() | calling pc.setLocalDescription() [offer:%o]",i),await this._pc.setLocalDescription(i);const a={type:"answer",sdp:this._remoteSdp.getSdp()};m.debug("setMaxSpatialLayer() | calling pc.setRemoteDescription() [answer:%o]",a),await this._pc.setRemoteDescription(a)}async setRtpEncodingParameters(e,t){this.assertNotClosed(),this.assertSendDirection(),m.debug("setRtpEncodingParameters() [localId:%s, params:%o]",e,t);const s=this._mapMidTransceiver.get(e);if(!s)throw new Error("associated RTCRtpTransceiver not found");const r=s.sender.getParameters();r.encodings.forEach(((e,s)=>{r.encodings[s]={...e,...t}})),await s.sender.setParameters(r),this._remoteSdp.muxMediaSectionSimulcast(e,r.encodings);const i=await this._pc.createOffer();m.debug("setRtpEncodingParameters() | calling pc.setLocalDescription() [offer:%o]",i),await this._pc.setLocalDescription(i);const a={type:"answer",sdp:this._remoteSdp.getSdp()};m.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:e,maxPacketLifeTime:t,maxRetransmits:s,label:i,protocol:a}){this.assertNotClosed(),this.assertSendDirection();const n={negotiated:!0,id:this._nextSendSctpStreamId,ordered:e,maxPacketLifeTime:t,maxRetransmits:s,protocol:a};m.debug("sendDataChannel() [options:%o]",n);const o=this._pc.createDataChannel(i,n);if(this._nextSendSctpStreamId=++this._nextSendSctpStreamId%u.MIS,!this._hasDataChannelMediaSection){const e=await this._pc.createOffer(),t=r.parse(e.sdp),s=t.media.find((e=>"application"===e.type));this._transportReady||await this.setupTransport({localDtlsRole:"client",localSdpObject:t}),m.debug("sendDataChannel() | calling pc.setLocalDescription() [offer:%o]",e),await this._pc.setLocalDescription(e),this._remoteSdp.sendSctpAssociation({offerMediaObject:s});const i={type:"answer",sdp:this._remoteSdp.getSdp()};m.debug("sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]",i),await this._pc.setRemoteDescription(i),this._hasDataChannelMediaSection=!0}return{dataChannel:o,sctpStreamParameters:{streamId:n.id,ordered:n.ordered,maxPacketLifeTime:n.maxPacketLifeTime,maxRetransmits:n.maxRetransmits}}}async receive(e){this.assertNotClosed(),this.assertRecvDirection();const t=[],s=new Map;for(const t of e){const{trackId:e,kind:r,rtpParameters:i,streamId:a}=t;m.debug("receive() [trackId:%s, kind:%s]",e,r);const n=i.mid??String(this._mapMidTransceiver.size);s.set(e,n),this._remoteSdp.receive({mid:n,kind:r,offerRtpParameters:i,streamId:a??i.rtcp.cname,trackId:e})}const i={type:"offer",sdp:this._remoteSdp.getSdp()};m.debug("receive() | calling pc.setRemoteDescription() [offer:%o]",i),await this._pc.setRemoteDescription(i);let a=await this._pc.createAnswer();const n=r.parse(a.sdp);for(const t of e){const{trackId:e,rtpParameters:i}=t,o=s.get(e),d=n.media.find((e=>String(e.mid)===o));c.applyCodecParameters({offerRtpParameters:i,answerMediaObject:d}),a={type:"answer",sdp:r.write(n)}}this._transportReady||await this.setupTransport({localDtlsRole:"client",localSdpObject:n}),m.debug("receive() | calling pc.setLocalDescription() [answer:%o]",a),await this._pc.setLocalDescription(a);for(const r of e){const{trackId:e}=r,i=s.get(e),a=this._pc.getTransceivers().find((e=>e.mid===i));if(!a)throw new Error("new RTCRtpTransceiver not found");this._mapMidTransceiver.set(i,a),t.push({localId:i,track:a.receiver.track,rtpReceiver:a.receiver})}return t}async stopReceiving(e){if(this.assertRecvDirection(),this._closed)return;for(const t of e){m.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()};m.debug("stopReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const s=await this._pc.createAnswer();m.debug("stopReceiving() | calling pc.setLocalDescription() [answer:%o]",s),await this._pc.setLocalDescription(s);for(const t of e)this._mapMidTransceiver.delete(t)}async pauseReceiving(e){this.assertNotClosed(),this.assertRecvDirection();for(const t of e){m.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()};m.debug("pauseReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const s=await this._pc.createAnswer();m.debug("pauseReceiving() | calling pc.setLocalDescription() [answer:%o]",s),await this._pc.setLocalDescription(s)}async resumeReceiving(e){this.assertNotClosed(),this.assertRecvDirection();for(const t of e){m.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()};m.debug("resumeReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const s=await this._pc.createAnswer();m.debug("resumeReceiving() | calling pc.setLocalDescription() [answer:%o]",s),await this._pc.setLocalDescription(s)}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:e,label:t,protocol:s}){this.assertNotClosed(),this.assertRecvDirection();const{streamId:i,ordered:a,maxPacketLifeTime:n,maxRetransmits:o}=e,c={negotiated:!0,id:i,ordered:a,maxPacketLifeTime:n,maxRetransmits:o,protocol:s};m.debug("receiveDataChannel() [options:%o]",c);const d=this._pc.createDataChannel(t,c);if(!this._hasDataChannelMediaSection){this._remoteSdp.receiveSctpAssociation();const e={type:"offer",sdp:this._remoteSdp.getSdp()};m.debug("receiveDataChannel() | calling pc.setRemoteDescription() [offer:%o]",e),await this._pc.setRemoteDescription(e);const t=await this._pc.createAnswer();if(!this._transportReady){const e=r.parse(t.sdp);await this.setupTransport({localDtlsRole:"client",localSdpObject:e})}m.debug("receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]",t),await this._pc.setLocalDescription(t),this._hasDataChannelMediaSection=!0}return{dataChannel:d}}async setupTransport({localDtlsRole:e,localSdpObject:t}){t||(t=r.parse(this._pc.localDescription.sdp));const s=c.extractDtlsParameters({sdpObject:t});s.role=e,this._remoteSdp.updateDtlsRole("client"===e?"server":"client"),await new Promise(((e,t)=>{this.safeEmit("@connect",{dtlsParameters:s},e,t)})),this._transportReady=!0}assertNotClosed(){if(this._closed)throw new a.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')}}t.Firefox60=f},1797:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=s(9746);t.default=function(e){if(!(0,r.default)(e))throw TypeError("Invalid UUID");let t;return Uint8Array.of((t=parseInt(e.slice(0,8),16))>>>24,t>>>16&255,t>>>8&255,255&t,(t=parseInt(e.slice(9,13),16))>>>8,255&t,(t=parseInt(e.slice(14,18),16))>>>8,255&t,(t=parseInt(e.slice(19,23),16))>>>8,255&t,(t=parseInt(e.slice(24,36),16))/1099511627776&255,t/4294967296&255,t>>>24&255,t>>>16&255,t>>>8&255,255&t)}},2109:function(e,t,s){var r;!function(i,a){"use strict";var n,o="user-agent",c="",d="function",p="undefined",l="object",h="string",m="browser",u="cpu",f="device",g="engine",_="os",w="result",b="name",v="type",y="vendor",S="version",R="architecture",C="major",P="model",D="console",k="mobile",T="tablet",x="smarttv",L="wearable",E="xr",I="embedded",M="inapp",O="brands",j="formFactors",N="fullVersionList",A="platform",F="platformVersion",B="bitness",$="sec-ch-ua",z=$+"-full-version-list",U=$+"-arch",K=$+"-"+B,H=$+"-form-factors",q=$+"-"+k,G=$+"-"+P,V=$+"-"+A,Q=V+"-version",W=[O,N,k,P,A,F,R,j,B],X="Amazon",J="Apple",Y="ASUS",Z="BlackBerry",ee="Google",te="Huawei",se="Lenovo",re="Honor",ie="LG",ae="Microsoft",ne="Motorola",oe="Nvidia",ce="OnePlus",de="OPPO",pe="Samsung",le="Sharp",he="Sony",me="Xiaomi",ue="Zebra",fe="Chrome",ge="Chromium",_e="Chromecast",we="Edge",be="Firefox",ve="Opera",ye="Facebook",Se="Sogou",Re="Mobile ",Ce=" Browser",Pe="Windows",De=typeof i!==p,ke=De&&i.navigator?i.navigator:a,Te=ke&&ke.userAgentData?ke.userAgentData:a,xe=function(e){for(var t={},s=0;s0){for(var s in e)if(Oe(t)==Oe(e[s]))return!0;return!1}return!!Ie(e)&&Oe(t)==Oe(e)},Ee=function(e,t){for(var s in e)return/^(browser|cpu|device|engine|os)$/.test(s)||!!t&&Ee(e[s])},Ie=function(e){return typeof e===h},Me=function(e){if(!e)return a;for(var t=[],s=Ae(/\\?\"/g,e).split(","),r=0;r-1){var i=Be(s[r]).split(";v=");t[r]={brand:i[0],version:i[1]}}else t[r]=Be(s[r]);return t},Oe=function(e){return Ie(e)?e.toLowerCase():e},je=function(e){return Ie(e)?Ae(/[^\d\.]/g,e).split(".")[0]:a},Ne=function(e){for(var t in e){var s=e[t];typeof s==l&&2==s.length?this[s[0]]=s[1]:this[s]=a}return this},Ae=function(e,t){return Ie(t)?t.replace(e,c):t},Fe=function(e){return Ae(/\\?\"/g,e)},Be=function(e,t){if(Ie(e))return e=Ae(/^\s\s*/,e),typeof t===p?e:e.substring(0,500)},$e=function(e,t){if(e&&t)for(var s,r,i,n,o,c,p=0;p0?2===n.length?typeof n[1]==d?this[n[0]]=n[1].call(this,c):this[n[0]]=n[1]:n.length>=3&&(typeof n[1]!==d||n[1].exec&&n[1].test?3==n.length?this[n[0]]=c?c.replace(n[1],n[2]):a:4==n.length?this[n[0]]=c?n[3].call(this,c.replace(n[1],n[2])):a:n.length>4&&(this[n[0]]=c?n[3].apply(this,[c.replace(n[1],n[2])].concat(n.slice(4))):a):n.length>3?this[n[0]]=c?n[1].apply(this,n.slice(2)):a:this[n[0]]=c?n[1].call(this,c,n[2]):a):this[n]=c||a;p+=2}},ze=function(e,t){for(var s in t)if(typeof t[s]===l&&t[s].length>0){for(var r=0;r2&&this.set(P,"iPad").set(v,T);break;case _:!this.get(b)&&Te&&Te[A]&&this.set(b,Te[A]);break;case w:var e=this.data,t=function(t){return e[t].getItem().detectFeature().get()};this.set(m,t(m)).set(u,t(u)).set(f,t(f)).set(g,t(g)).set(_,t(_))}return this},this.parseUA=function(){return this.itemType!=w&&$e.call(this.data,this.ua,this.rgxMap),this.itemType==m&&this.set(C,je(this.get(S))),this},this.parseCH=function(){var e=this.uaCH,t=this.rgxMap;switch(this.itemType){case m:case g:var s,r=e[N]||e[O];if(r)for(var i in r){var n=r[i].brand||r[i],o=r[i].version;this.itemType==m&&!/not.a.brand/i.test(n)&&(!s||/Chrom/.test(s)&&n!=ge||s==we&&/WebView2/.test(n))&&(n=ze(n,He),(s=this.get(b))&&!/Chrom/.test(s)&&/Chrom/.test(n)||this.set(b,n).set(S,o).set(C,je(o)),s=n),this.itemType==g&&n==ge&&this.set(S,o)}break;case u:var c=e[R];c&&(c&&"64"==e[B]&&(c+="64"),$e.call(this.data,c+";",t));break;case f:if(e[k]&&this.set(v,k),e[P]&&(this.set(P,e[P]),!this.get(v)||!this.get(y))){var d={};$e.call(d,"droid 9; "+e[P]+")",t),!this.get(v)&&d.type&&this.set(v,d.type),!this.get(y)&&d.vendor&&this.set(y,d.vendor)}if(e[j]){var p;if("string"!=typeof e[j])for(var l=0;!p&&l=13?"11":"10"),this.set(b,h).set(S,D)}this.get(b)==Pe&&"Xbox"==e[P]&&this.set(b,"Xbox").set(S,a);break;case w:var T=this.data,x=function(t){return T[t].getItem().setCH(e).parseCH().get()};this.set(m,x(m)).set(u,x(u)).set(f,x(f)).set(g,x(g)).set(_,x(_))}return this},Ne.call(this,[["itemType",e],["ua",t],["uaCH",r],["rgxMap",s],["data",Ve(this,e)]]),this}function Xe(e,t,s){if(typeof e===l?(Ee(e,!0)?(typeof t===l&&(s=t),t=e):(s=e,t=a),e=a):typeof e!==h||Ee(t,!0)||(s=t,t=a),s&&typeof s.append===d){var r={};s.forEach((function(e,t){r[t]=e})),s=r}if(!(this instanceof Xe))return new Xe(e,t,s).getResult();var i=typeof e===h?e:s&&s[o]?s[o]:ke&&ke.userAgent?ke.userAgent:c,n=new Qe(s,!0),p=t?function(e,t){var s={},r=t;if(!Ee(t))for(var i in r={},t)for(var a in t[i])r[a]=t[i][a].concat(r[a]?r[a]:[]);for(var n in e)s[n]=r[n]&&r[n].length%2==0?r[n].concat(e[n]):e[n];return s}(qe,t):qe,b=function(e){return e==w?function(){return new We(e,i,p,n).set("ua",i).set(m,this.getBrowser()).set(u,this.getCPU()).set(f,this.getDevice()).set(g,this.getEngine()).set(_,this.getOS()).get()}:function(){return new We(e,i,p[e],n).parseUA().get()}};return Ne.call(this,[["getBrowser",b(m)],["getCPU",b(u)],["getDevice",b(f)],["getEngine",b(g)],["getOS",b(_)],["getResult",b(w)],["getUA",function(){return i}],["setUA",function(e){return Ie(e)&&(i=e.length>500?Be(e,500):e),this}]]).setUA(i),this}Xe.VERSION="2.0.4",Xe.BROWSER=xe([b,S,C,v]),Xe.CPU=xe([R]),Xe.DEVICE=xe([P,y,v,D,k,x,T,L,I]),Xe.ENGINE=Xe.OS=xe([b,S]),typeof t!==p?(e.exports&&(t=e.exports=Xe),t.UAParser=Xe):s.amdO?(r=function(){return Xe}.call(t,s,t,e))===a||(e.exports=r):De&&(i.UAParser=Xe);var Je=De&&(i.jQuery||i.Zepto);if(Je&&!Je.ua){var Ye=new Xe;Je.ua=Ye.getResult(),Je.ua.get=function(){return Ye.getUA()},Je.ua.set=function(e){Ye.setUA(e);var t=Ye.getResult();for(var s in t)Je.ua[s]=t[s]}}}("object"==typeof window?window:this)},2183:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Chrome111=void 0;const r=s(7363),i=s(2994),a=s(1765),n=s(8046),o=s(5544),c=s(5938),d=s(4256),p=s(4893),l=s(521),h=s(1305),m=s(3303),u=new i.Logger("Chrome111"),f={OS:1024,MIS:1024};class g extends l.HandlerInterface{_closed=!1;_direction;_remoteSdp;_sendingRtpParametersByKind;_sendingRemoteRtpParametersByKind;_forcedLocalDtlsRole;_pc;_mapMidTransceiver=new Map;_sendStream=new MediaStream;_hasDataChannelMediaSection=!1;_nextSendSctpStreamId=0;_transportReady=!1;static createFactory(){return()=>new g}constructor(){super()}get name(){return"Chrome111"}close(){if(u.debug("close()"),!this._closed){if(this._closed=!0,this._pc)try{this._pc.close()}catch(e){}this.emit("@close")}}async getNativeRtpCapabilities(){u.debug("getNativeRtpCapabilities()");const e=new RTCPeerConnection({iceServers:[],iceTransportPolicy:"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require",sdpSemantics:"unified-plan"});try{e.addTransceiver("audio"),e.addTransceiver("video");const t=await e.createOffer();try{e.close()}catch(e){}const s=r.parse(t.sdp),i=o.extractRtpCapabilities({sdpObject:s});return d.addNackSupportForOpus(i),i}catch(t){try{e.close()}catch(e){}throw t}}async getNativeSctpCapabilities(){return u.debug("getNativeSctpCapabilities()"),{numStreams:f}}run({direction:e,iceParameters:t,iceCandidates:s,dtlsParameters:r,sctpParameters:i,iceServers:a,iceTransportPolicy:o,additionalSettings:c,proprietaryConstraints:d,extendedRtpCapabilities:p}){this.assertNotClosed(),u.debug("run()"),this._direction=e,this._remoteSdp=new h.RemoteSdp({iceParameters:t,iceCandidates:s,dtlsParameters:r,sctpParameters:i}),this._sendingRtpParametersByKind={audio:n.getSendingRtpParameters("audio",p),video:n.getSendingRtpParameters("video",p)},this._sendingRemoteRtpParametersByKind={audio:n.getSendingRemoteRtpParameters("audio",p),video:n.getSendingRemoteRtpParameters("video",p)},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",sdpSemantics:"unified-plan",...c},d),this._pc.addEventListener("icegatheringstatechange",(()=>{this.emit("@icegatheringstatechange",this._pc.iceGatheringState)})),this._pc.addEventListener("icecandidateerror",(e=>{this.emit("@icecandidateerror",e)})),this._pc.connectionState?this._pc.addEventListener("connectionstatechange",(()=>{this.emit("@connectionstatechange",this._pc.connectionState)})):(u.warn("run() | pc.connectionState not supported, using pc.iceConnectionState"),this._pc.addEventListener("iceconnectionstatechange",(()=>{switch(this._pc.iceConnectionState){case"checking":this.emit("@connectionstatechange","connecting");break;case"connected":case"completed":this.emit("@connectionstatechange","connected");break;case"failed":this.emit("@connectionstatechange","failed");break;case"disconnected":this.emit("@connectionstatechange","disconnected");break;case"closed":this.emit("@connectionstatechange","closed")}})))}async updateIceServers(e){this.assertNotClosed(),u.debug("updateIceServers()");const t=this._pc.getConfiguration();t.iceServers=e,this._pc.setConfiguration(t)}async restartIce(e){if(this.assertNotClosed(),u.debug("restartIce()"),this._remoteSdp.updateIceParameters(e),this._transportReady)if("send"===this._direction){const e=await this._pc.createOffer({iceRestart:!0});u.debug("restartIce() | calling pc.setLocalDescription() [offer:%o]",e),await this._pc.setLocalDescription(e);const t={type:"answer",sdp:this._remoteSdp.getSdp()};u.debug("restartIce() | calling pc.setRemoteDescription() [answer:%o]",t),await this._pc.setRemoteDescription(t)}else{const e={type:"offer",sdp:this._remoteSdp.getSdp()};u.debug("restartIce() | calling pc.setRemoteDescription() [offer:%o]",e),await this._pc.setRemoteDescription(e);const t=await this._pc.createAnswer();u.debug("restartIce() | calling pc.setLocalDescription() [answer:%o]",t),await this._pc.setLocalDescription(t)}}async getTransportStats(){return this.assertNotClosed(),this._pc.getStats()}async send({track:e,encodings:t,codecOptions:s,codec:i,onRtpSender:d}){if(this.assertNotClosed(),this.assertSendDirection(),u.debug("send() [kind:%s, track.id:%s]",e.kind,e.id),t&&t.length>1){let e=1;for(const s of t){const t=s.scalabilityMode?(0,m.parse)(s.scalabilityMode).temporalLayers:3;t>e&&(e=t)}t.forEach(((t,s)=>{t.rid=`r${s}`,t.scalabilityMode=`L1T${e}`}))}const p=a.clone(this._sendingRtpParametersByKind[e.kind]);p.codecs=n.reduceCodecs(p.codecs,i);const l=a.clone(this._sendingRemoteRtpParametersByKind[e.kind]);l.codecs=n.reduceCodecs(l.codecs,i);const h=this._remoteSdp.getNextMediaSectionIdx(),f=this._pc.addTransceiver(e,{direction:"sendonly",streams:[this._sendStream],sendEncodings:t});d&&d(f.sender);const g=await this._pc.createOffer();let _=r.parse(g.sdp);_.extmapAllowMixed&&this._remoteSdp.setSessionExtmapAllowMixed(),this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:_}),u.debug("send() | calling pc.setLocalDescription() [offer:%o]",g),await this._pc.setLocalDescription(g);const w=f.mid;p.mid=w,_=r.parse(this._pc.localDescription.sdp);const b=_.media[h.idx];if(p.rtcp.cname=o.getCname({offerMediaObject:b}),t)if(1===t.length){const e=c.getRtpEncodings({offerMediaObject:b});Object.assign(e[0],t[0]),p.encodings=e}else p.encodings=t;else p.encodings=c.getRtpEncodings({offerMediaObject:b});this._remoteSdp.send({offerMediaObject:b,reuseMid:h.reuseMid,offerRtpParameters:p,answerRtpParameters:l,codecOptions:s});const v={type:"answer",sdp:this._remoteSdp.getSdp()};return u.debug("send() | calling pc.setRemoteDescription() [answer:%o]",v),await this._pc.setRemoteDescription(v),this._mapMidTransceiver.set(w,f),{localId:w,rtpParameters:p,rtpSender:f.sender}}async stopSending(e){if(this.assertSendDirection(),u.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 s=await this._pc.createOffer();u.debug("stopSending() | calling pc.setLocalDescription() [offer:%o]",s),await this._pc.setLocalDescription(s);const r={type:"answer",sdp:this._remoteSdp.getSdp()};u.debug("stopSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r),this._mapMidTransceiver.delete(e)}async pauseSending(e){this.assertNotClosed(),this.assertSendDirection(),u.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 s=await this._pc.createOffer();u.debug("pauseSending() | calling pc.setLocalDescription() [offer:%o]",s),await this._pc.setLocalDescription(s);const r={type:"answer",sdp:this._remoteSdp.getSdp()};u.debug("pauseSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r)}async resumeSending(e){this.assertNotClosed(),this.assertSendDirection(),u.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 s=await this._pc.createOffer();u.debug("resumeSending() | calling pc.setLocalDescription() [offer:%o]",s),await this._pc.setLocalDescription(s);const r={type:"answer",sdp:this._remoteSdp.getSdp()};u.debug("resumeSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r)}async replaceTrack(e,t){this.assertNotClosed(),this.assertSendDirection(),t?u.debug("replaceTrack() [localId:%s, track.id:%s]",e,t.id):u.debug("replaceTrack() [localId:%s, no track]",e);const s=this._mapMidTransceiver.get(e);if(!s)throw new Error("associated RTCRtpTransceiver not found");await s.sender.replaceTrack(t)}async setMaxSpatialLayer(e,t){this.assertNotClosed(),this.assertSendDirection(),u.debug("setMaxSpatialLayer() [localId:%s, spatialLayer:%s]",e,t);const s=this._mapMidTransceiver.get(e);if(!s)throw new Error("associated RTCRtpTransceiver not found");const r=s.sender.getParameters();r.encodings.forEach(((e,s)=>{e.active=s<=t})),await s.sender.setParameters(r),this._remoteSdp.muxMediaSectionSimulcast(e,r.encodings);const i=await this._pc.createOffer();u.debug("setMaxSpatialLayer() | calling pc.setLocalDescription() [offer:%o]",i),await this._pc.setLocalDescription(i);const a={type:"answer",sdp:this._remoteSdp.getSdp()};u.debug("setMaxSpatialLayer() | calling pc.setRemoteDescription() [answer:%o]",a),await this._pc.setRemoteDescription(a)}async setRtpEncodingParameters(e,t){this.assertNotClosed(),this.assertSendDirection(),u.debug("setRtpEncodingParameters() [localId:%s, params:%o]",e,t);const s=this._mapMidTransceiver.get(e);if(!s)throw new Error("associated RTCRtpTransceiver not found");const r=s.sender.getParameters();r.encodings.forEach(((e,s)=>{r.encodings[s]={...e,...t}})),await s.sender.setParameters(r),this._remoteSdp.muxMediaSectionSimulcast(e,r.encodings);const i=await this._pc.createOffer();u.debug("setRtpEncodingParameters() | calling pc.setLocalDescription() [offer:%o]",i),await this._pc.setLocalDescription(i);const a={type:"answer",sdp:this._remoteSdp.getSdp()};u.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:e,maxPacketLifeTime:t,maxRetransmits:s,label:i,protocol:a}){this.assertNotClosed(),this.assertSendDirection();const n={negotiated:!0,id:this._nextSendSctpStreamId,ordered:e,maxPacketLifeTime:t,maxRetransmits:s,protocol:a};u.debug("sendDataChannel() [options:%o]",n);const o=this._pc.createDataChannel(i,n);if(this._nextSendSctpStreamId=++this._nextSendSctpStreamId%f.MIS,!this._hasDataChannelMediaSection){const e=await this._pc.createOffer(),t=r.parse(e.sdp),s=t.media.find((e=>"application"===e.type));this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:t}),u.debug("sendDataChannel() | calling pc.setLocalDescription() [offer:%o]",e),await this._pc.setLocalDescription(e),this._remoteSdp.sendSctpAssociation({offerMediaObject:s});const i={type:"answer",sdp:this._remoteSdp.getSdp()};u.debug("sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]",i),await this._pc.setRemoteDescription(i),this._hasDataChannelMediaSection=!0}return{dataChannel:o,sctpStreamParameters:{streamId:n.id,ordered:n.ordered,maxPacketLifeTime:n.maxPacketLifeTime,maxRetransmits:n.maxRetransmits}}}async receive(e){this.assertNotClosed(),this.assertRecvDirection();const t=[],s=new Map;for(const t of e){const{trackId:e,kind:r,rtpParameters:i,streamId:a}=t;u.debug("receive() [trackId:%s, kind:%s]",e,r);const n=i.mid??String(this._mapMidTransceiver.size);s.set(e,n),this._remoteSdp.receive({mid:n,kind:r,offerRtpParameters:i,streamId:a??i.rtcp.cname,trackId:e})}const i={type:"offer",sdp:this._remoteSdp.getSdp()};u.debug("receive() | calling pc.setRemoteDescription() [offer:%o]",i),await this._pc.setRemoteDescription(i);for(const t of e){const{trackId:e,onRtpReceiver:r}=t;if(r){const t=s.get(e),i=this._pc.getTransceivers().find((e=>e.mid===t));if(!i)throw new Error("transceiver not found");r(i.receiver)}}let a=await this._pc.createAnswer();const n=r.parse(a.sdp);for(const t of e){const{trackId:e,rtpParameters:r}=t,i=s.get(e),a=n.media.find((e=>String(e.mid)===i));o.applyCodecParameters({offerRtpParameters:r,answerMediaObject:a})}a={type:"answer",sdp:r.write(n)},this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:n}),u.debug("receive() | calling pc.setLocalDescription() [answer:%o]",a),await this._pc.setLocalDescription(a);for(const r of e){const{trackId:e}=r,i=s.get(e),a=this._pc.getTransceivers().find((e=>e.mid===i));if(!a)throw new Error("new RTCRtpTransceiver not found");this._mapMidTransceiver.set(i,a),t.push({localId:i,track:a.receiver.track,rtpReceiver:a.receiver})}return t}async stopReceiving(e){if(this.assertRecvDirection(),this._closed)return;for(const t of e){u.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()};u.debug("stopReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const s=await this._pc.createAnswer();u.debug("stopReceiving() | calling pc.setLocalDescription() [answer:%o]",s),await this._pc.setLocalDescription(s);for(const t of e)this._mapMidTransceiver.delete(t)}async pauseReceiving(e){this.assertNotClosed(),this.assertRecvDirection();for(const t of e){u.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()};u.debug("pauseReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const s=await this._pc.createAnswer();u.debug("pauseReceiving() | calling pc.setLocalDescription() [answer:%o]",s),await this._pc.setLocalDescription(s)}async resumeReceiving(e){this.assertNotClosed(),this.assertRecvDirection();for(const t of e){u.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()};u.debug("resumeReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const s=await this._pc.createAnswer();u.debug("resumeReceiving() | calling pc.setLocalDescription() [answer:%o]",s),await this._pc.setLocalDescription(s)}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:e,label:t,protocol:s}){this.assertNotClosed(),this.assertRecvDirection();const{streamId:i,ordered:a,maxPacketLifeTime:n,maxRetransmits:o}=e,c={negotiated:!0,id:i,ordered:a,maxPacketLifeTime:n,maxRetransmits:o,protocol:s};u.debug("receiveDataChannel() [options:%o]",c);const d=this._pc.createDataChannel(t,c);if(!this._hasDataChannelMediaSection){this._remoteSdp.receiveSctpAssociation();const e={type:"offer",sdp:this._remoteSdp.getSdp()};u.debug("receiveDataChannel() | calling pc.setRemoteDescription() [offer:%o]",e),await this._pc.setRemoteDescription(e);const t=await this._pc.createAnswer();if(!this._transportReady){const e=r.parse(t.sdp);await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:e})}u.debug("receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]",t),await this._pc.setLocalDescription(t),this._hasDataChannelMediaSection=!0}return{dataChannel:d}}async setupTransport({localDtlsRole:e,localSdpObject:t}){t||(t=r.parse(this._pc.localDescription.sdp));const s=o.extractDtlsParameters({sdpObject:t});s.role=e,this._remoteSdp.updateDtlsRole("client"===e?"server":"client"),await new Promise(((e,t)=>{this.safeEmit("@connect",{dtlsParameters:s},e,t)})),this._transportReady=!0}assertNotClosed(){if(this._closed)throw new p.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')}}t.Chrome111=g},2196:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default="ffffffff-ffff-ffff-ffff-ffffffffffff"},2291:(e,t)=>{"use strict";let s;Object.defineProperty(t,"__esModule",{value:!0});const r=new Uint8Array(16);t.default=function(){if(!s){if("undefined"==typeof crypto||!crypto.getRandomValues)throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");s=crypto.getRandomValues.bind(crypto)}return s(r)}},2292:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Firefox120=void 0;const r=s(7363),i=s(2994),a=s(4893),n=s(1765),o=s(8046),c=s(5544),d=s(5938),p=s(521),l=s(1305),h=s(3303),m=new i.Logger("Firefox120"),u={OS:16,MIS:2048};class f extends p.HandlerInterface{_closed=!1;_direction;_remoteSdp;_sendingRtpParametersByKind;_sendingRemoteRtpParametersByKind;_pc;_mapMidTransceiver=new Map;_sendStream=new MediaStream;_hasDataChannelMediaSection=!1;_nextSendSctpStreamId=0;_transportReady=!1;static createFactory(){return()=>new f}constructor(){super()}get name(){return"Firefox120"}close(){if(m.debug("close()"),!this._closed){if(this._closed=!0,this._pc)try{this._pc.close()}catch(e){}this.emit("@close")}}async getNativeRtpCapabilities(){m.debug("getNativeRtpCapabilities()");const e=new RTCPeerConnection({iceServers:[],iceTransportPolicy:"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require"}),t=document.createElement("canvas");t.getContext("2d");const s=t.captureStream().getVideoTracks()[0];try{e.addTransceiver("audio",{direction:"sendrecv"}),e.addTransceiver(s,{direction:"sendrecv",sendEncodings:[{rid:"r0",maxBitrate:1e5},{rid:"r1",maxBitrate:5e5}]});const i=await e.createOffer();try{t.remove()}catch(e){}try{s.stop()}catch(e){}try{e.close()}catch(e){}const a=r.parse(i.sdp);return c.extractRtpCapabilities({sdpObject:a})}catch(r){try{t.remove()}catch(e){}try{s.stop()}catch(e){}try{e.close()}catch(e){}throw r}}async getNativeSctpCapabilities(){return m.debug("getNativeSctpCapabilities()"),{numStreams:u}}run({direction:e,iceParameters:t,iceCandidates:s,dtlsParameters:r,sctpParameters:i,iceServers:a,iceTransportPolicy:n,additionalSettings:c,proprietaryConstraints:d,extendedRtpCapabilities:p}){this.assertNotClosed(),m.debug("run()"),this._direction=e,this._remoteSdp=new l.RemoteSdp({iceParameters:t,iceCandidates:s,dtlsParameters:r,sctpParameters:i}),this._sendingRtpParametersByKind={audio:o.getSendingRtpParameters("audio",p),video:o.getSendingRtpParameters("video",p)},this._sendingRemoteRtpParametersByKind={audio:o.getSendingRemoteRtpParameters("audio",p),video:o.getSendingRemoteRtpParameters("video",p)},this._pc=new RTCPeerConnection({iceServers:a??[],iceTransportPolicy:n??"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require",...c},d),this._pc.addEventListener("icegatheringstatechange",(()=>{this.emit("@icegatheringstatechange",this._pc.iceGatheringState)})),this._pc.addEventListener("icecandidateerror",(e=>{this.emit("@icecandidateerror",e)})),this._pc.connectionState?this._pc.addEventListener("connectionstatechange",(()=>{this.emit("@connectionstatechange",this._pc.connectionState)})):this._pc.addEventListener("iceconnectionstatechange",(()=>{switch(m.warn("run() | pc.connectionState not supported, using pc.iceConnectionState"),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")}}))}async updateIceServers(e){throw this.assertNotClosed(),new a.UnsupportedError("not supported")}async restartIce(e){if(this.assertNotClosed(),m.debug("restartIce()"),this._remoteSdp.updateIceParameters(e),this._transportReady)if("send"===this._direction){const e=await this._pc.createOffer({iceRestart:!0});m.debug("restartIce() | calling pc.setLocalDescription() [offer:%o]",e),await this._pc.setLocalDescription(e);const t={type:"answer",sdp:this._remoteSdp.getSdp()};m.debug("restartIce() | calling pc.setRemoteDescription() [answer:%o]",t),await this._pc.setRemoteDescription(t)}else{const e={type:"offer",sdp:this._remoteSdp.getSdp()};m.debug("restartIce() | calling pc.setRemoteDescription() [offer:%o]",e),await this._pc.setRemoteDescription(e);const t=await this._pc.createAnswer();m.debug("restartIce() | calling pc.setLocalDescription() [answer:%o]",t),await this._pc.setLocalDescription(t)}}async getTransportStats(){return this.assertNotClosed(),this._pc.getStats()}async send({track:e,encodings:t,codecOptions:s,codec:i,onRtpSender:a}){this.assertNotClosed(),this.assertSendDirection(),m.debug("send() [kind:%s, track.id:%s]",e.kind,e.id),t&&t.length>1&&t.forEach(((e,t)=>{e.rid=`r${t}`}));const p=n.clone(this._sendingRtpParametersByKind[e.kind]);p.codecs=o.reduceCodecs(p.codecs,i);const l=n.clone(this._sendingRemoteRtpParametersByKind[e.kind]);l.codecs=o.reduceCodecs(l.codecs,i);const u=this._pc.addTransceiver(e,{direction:"sendonly",streams:[this._sendStream],sendEncodings:t});a&&a(u.sender);const f=await this._pc.createOffer();let g=r.parse(f.sdp);g.extmapAllowMixed&&this._remoteSdp.setSessionExtmapAllowMixed(),this._transportReady||await this.setupTransport({localDtlsRole:"client",localSdpObject:g});const _=(0,h.parse)((t??[{}])[0].scalabilityMode);m.debug("send() | calling pc.setLocalDescription() [offer:%o]",f),await this._pc.setLocalDescription(f);const w=u.mid;p.mid=w,g=r.parse(this._pc.localDescription.sdp);const b=g.media[g.media.length-1];if(p.rtcp.cname=c.getCname({offerMediaObject:b}),t)if(1===t.length){const e=d.getRtpEncodings({offerMediaObject:b});Object.assign(e[0],t[0]),p.encodings=e}else p.encodings=t;else p.encodings=d.getRtpEncodings({offerMediaObject:b});if(p.encodings.length>1&&("video/vp8"===p.codecs[0].mimeType.toLowerCase()||"video/h264"===p.codecs[0].mimeType.toLowerCase()))for(const e of p.encodings)e.scalabilityMode?e.scalabilityMode=`L1T${_.temporalLayers}`:e.scalabilityMode="L1T3";this._remoteSdp.send({offerMediaObject:b,offerRtpParameters:p,answerRtpParameters:l,codecOptions:s});const v={type:"answer",sdp:this._remoteSdp.getSdp()};return m.debug("send() | calling pc.setRemoteDescription() [answer:%o]",v),await this._pc.setRemoteDescription(v),this._mapMidTransceiver.set(w,u),{localId:w,rtpParameters:p,rtpSender:u.sender}}async stopSending(e){if(this.assertSendDirection(),m.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 s=await this._pc.createOffer();m.debug("stopSending() | calling pc.setLocalDescription() [offer:%o]",s),await this._pc.setLocalDescription(s);const r={type:"answer",sdp:this._remoteSdp.getSdp()};m.debug("stopSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r),this._mapMidTransceiver.delete(e)}async pauseSending(e){this.assertNotClosed(),this.assertSendDirection(),m.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 s=await this._pc.createOffer();m.debug("pauseSending() | calling pc.setLocalDescription() [offer:%o]",s),await this._pc.setLocalDescription(s);const r={type:"answer",sdp:this._remoteSdp.getSdp()};m.debug("pauseSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r)}async resumeSending(e){this.assertNotClosed(),this.assertSendDirection(),m.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 s=await this._pc.createOffer();m.debug("resumeSending() | calling pc.setLocalDescription() [offer:%o]",s),await this._pc.setLocalDescription(s);const r={type:"answer",sdp:this._remoteSdp.getSdp()};m.debug("resumeSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r)}async replaceTrack(e,t){this.assertNotClosed(),this.assertSendDirection(),t?m.debug("replaceTrack() [localId:%s, track.id:%s]",e,t.id):m.debug("replaceTrack() [localId:%s, no track]",e);const s=this._mapMidTransceiver.get(e);if(!s)throw new Error("associated RTCRtpTransceiver not found");await s.sender.replaceTrack(t)}async setMaxSpatialLayer(e,t){this.assertNotClosed(),this.assertSendDirection(),m.debug("setMaxSpatialLayer() [localId:%s, spatialLayer:%s]",e,t);const s=this._mapMidTransceiver.get(e);if(!s)throw new Error("associated transceiver not found");const r=s.sender.getParameters();r.encodings.forEach(((e,s)=>{e.active=s<=t})),await s.sender.setParameters(r),this._remoteSdp.muxMediaSectionSimulcast(e,r.encodings);const i=await this._pc.createOffer();m.debug("setMaxSpatialLayer() | calling pc.setLocalDescription() [offer:%o]",i),await this._pc.setLocalDescription(i);const a={type:"answer",sdp:this._remoteSdp.getSdp()};m.debug("setMaxSpatialLayer() | calling pc.setRemoteDescription() [answer:%o]",a),await this._pc.setRemoteDescription(a)}async setRtpEncodingParameters(e,t){this.assertNotClosed(),this.assertSendDirection(),m.debug("setRtpEncodingParameters() [localId:%s, params:%o]",e,t);const s=this._mapMidTransceiver.get(e);if(!s)throw new Error("associated RTCRtpTransceiver not found");const r=s.sender.getParameters();r.encodings.forEach(((e,s)=>{r.encodings[s]={...e,...t}})),await s.sender.setParameters(r),this._remoteSdp.muxMediaSectionSimulcast(e,r.encodings);const i=await this._pc.createOffer();m.debug("setRtpEncodingParameters() | calling pc.setLocalDescription() [offer:%o]",i),await this._pc.setLocalDescription(i);const a={type:"answer",sdp:this._remoteSdp.getSdp()};m.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:e,maxPacketLifeTime:t,maxRetransmits:s,label:i,protocol:a}){this.assertNotClosed(),this.assertSendDirection();const n={negotiated:!0,id:this._nextSendSctpStreamId,ordered:e,maxPacketLifeTime:t,maxRetransmits:s,protocol:a};m.debug("sendDataChannel() [options:%o]",n);const o=this._pc.createDataChannel(i,n);if(this._nextSendSctpStreamId=++this._nextSendSctpStreamId%u.MIS,!this._hasDataChannelMediaSection){const e=await this._pc.createOffer(),t=r.parse(e.sdp),s=t.media.find((e=>"application"===e.type));this._transportReady||await this.setupTransport({localDtlsRole:"client",localSdpObject:t}),m.debug("sendDataChannel() | calling pc.setLocalDescription() [offer:%o]",e),await this._pc.setLocalDescription(e),this._remoteSdp.sendSctpAssociation({offerMediaObject:s});const i={type:"answer",sdp:this._remoteSdp.getSdp()};m.debug("sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]",i),await this._pc.setRemoteDescription(i),this._hasDataChannelMediaSection=!0}return{dataChannel:o,sctpStreamParameters:{streamId:n.id,ordered:n.ordered,maxPacketLifeTime:n.maxPacketLifeTime,maxRetransmits:n.maxRetransmits}}}async receive(e){this.assertNotClosed(),this.assertRecvDirection();const t=[],s=new Map;for(const t of e){const{trackId:e,kind:r,rtpParameters:i,streamId:a}=t;m.debug("receive() [trackId:%s, kind:%s]",e,r);const n=i.mid??String(this._mapMidTransceiver.size);s.set(e,n),this._remoteSdp.receive({mid:n,kind:r,offerRtpParameters:i,streamId:a??i.rtcp.cname,trackId:e})}const i={type:"offer",sdp:this._remoteSdp.getSdp()};m.debug("receive() | calling pc.setRemoteDescription() [offer:%o]",i),await this._pc.setRemoteDescription(i);for(const t of e){const{trackId:e,onRtpReceiver:r}=t;if(r){const t=s.get(e),i=this._pc.getTransceivers().find((e=>e.mid===t));if(!i)throw new Error("transceiver not found");r(i.receiver)}}let a=await this._pc.createAnswer();const n=r.parse(a.sdp);for(const t of e){const{trackId:e,rtpParameters:i}=t,o=s.get(e),d=n.media.find((e=>String(e.mid)===o));c.applyCodecParameters({offerRtpParameters:i,answerMediaObject:d}),a={type:"answer",sdp:r.write(n)}}this._transportReady||await this.setupTransport({localDtlsRole:"client",localSdpObject:n}),m.debug("receive() | calling pc.setLocalDescription() [answer:%o]",a),await this._pc.setLocalDescription(a);for(const r of e){const{trackId:e}=r,i=s.get(e),a=this._pc.getTransceivers().find((e=>e.mid===i));if(!a)throw new Error("new RTCRtpTransceiver not found");this._mapMidTransceiver.set(i,a),t.push({localId:i,track:a.receiver.track,rtpReceiver:a.receiver})}return t}async stopReceiving(e){if(this.assertRecvDirection(),this._closed)return;for(const t of e){m.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()};m.debug("stopReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const s=await this._pc.createAnswer();m.debug("stopReceiving() | calling pc.setLocalDescription() [answer:%o]",s),await this._pc.setLocalDescription(s);for(const t of e)this._mapMidTransceiver.delete(t)}async pauseReceiving(e){this.assertNotClosed(),this.assertRecvDirection();for(const t of e){m.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()};m.debug("pauseReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const s=await this._pc.createAnswer();m.debug("pauseReceiving() | calling pc.setLocalDescription() [answer:%o]",s),await this._pc.setLocalDescription(s)}async resumeReceiving(e){this.assertNotClosed(),this.assertRecvDirection();for(const t of e){m.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()};m.debug("resumeReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const s=await this._pc.createAnswer();m.debug("resumeReceiving() | calling pc.setLocalDescription() [answer:%o]",s),await this._pc.setLocalDescription(s)}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:e,label:t,protocol:s}){this.assertNotClosed(),this.assertRecvDirection();const{streamId:i,ordered:a,maxPacketLifeTime:n,maxRetransmits:o}=e,c={negotiated:!0,id:i,ordered:a,maxPacketLifeTime:n,maxRetransmits:o,protocol:s};m.debug("receiveDataChannel() [options:%o]",c);const d=this._pc.createDataChannel(t,c);if(!this._hasDataChannelMediaSection){this._remoteSdp.receiveSctpAssociation();const e={type:"offer",sdp:this._remoteSdp.getSdp()};m.debug("receiveDataChannel() | calling pc.setRemoteDescription() [offer:%o]",e),await this._pc.setRemoteDescription(e);const t=await this._pc.createAnswer();if(!this._transportReady){const e=r.parse(t.sdp);await this.setupTransport({localDtlsRole:"client",localSdpObject:e})}m.debug("receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]",t),await this._pc.setLocalDescription(t),this._hasDataChannelMediaSection=!0}return{dataChannel:d}}async setupTransport({localDtlsRole:e,localSdpObject:t}){t||(t=r.parse(this._pc.localDescription.sdp));const s=c.extractDtlsParameters({sdpObject:t});s.role=e,this._remoteSdp.updateDtlsRole("client"===e?"server":"client"),await new Promise(((e,t)=>{this.safeEmit("@connect",{dtlsParameters:s},e,t)})),this._transportReady=!0}assertNotClosed(){if(this._closed)throw new a.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')}}t.Firefox120=f},2731:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.FakeHandler=void 0;const r=s(5328),i=s(3953),a=s(2994),n=s(1765),o=s(8046),c=s(4893),d=s(521),p=new a.Logger("FakeHandler");class l extends i.EnhancedEventEmitter{id;ordered;maxPacketLifeTime;maxRetransmits;label;protocol;constructor({id:e,ordered:t,maxPacketLifeTime:s,maxRetransmits:r,label:i,protocol:a}){super(),this.id=e,this.ordered=t,this.maxPacketLifeTime=s,this.maxRetransmits=r,this.label=i,this.protocol=a}close(){this.safeEmit("close"),this.emit("@close")}send(e){this.safeEmit("message",e)}addEventListener(e,t){this.on(e,t)}}class h extends d.HandlerInterface{_closed=!1;fakeParameters;_rtpParametersByKind;_cname=`CNAME-${n.generateRandomNumber()}`;_transportReady=!1;_nextLocalId=1;_tracks=new Map;_nextSctpStreamId=0;static createFactory(e){return()=>new h(e)}constructor(e){super(),this.fakeParameters=e}get name(){return"FakeHandler"}close(){p.debug("close()"),this._closed||(this._closed=!0)}setIceGatheringState(e){this.emit("@icegatheringstatechange",e)}setConnectionState(e){this.emit("@connectionstatechange",e)}async getNativeRtpCapabilities(){return p.debug("getNativeRtpCapabilities()"),this.fakeParameters.generateNativeRtpCapabilities()}async getNativeSctpCapabilities(){return p.debug("getNativeSctpCapabilities()"),this.fakeParameters.generateNativeSctpCapabilities()}run({direction:e,iceParameters:t,iceCandidates:s,dtlsParameters:r,sctpParameters:i,iceServers:a,iceTransportPolicy:n,proprietaryConstraints:c,extendedRtpCapabilities:d}){this.assertNotClosed(),p.debug("run()"),this._rtpParametersByKind={audio:o.getSendingRtpParameters("audio",d),video:o.getSendingRtpParameters("video",d)}}async updateIceServers(e){this.assertNotClosed(),p.debug("updateIceServers()")}async restartIce(e){this.assertNotClosed(),p.debug("restartIce()")}async getTransportStats(){return this.assertNotClosed(),new Map}async send({track:e,encodings:t,codecOptions:s,codec:r}){this.assertNotClosed(),p.debug("send() [kind:%s, track.id:%s]",e.kind,e.id),this._transportReady||await this.setupTransport({localDtlsRole:"server"});const i=n.clone(this._rtpParametersByKind[e.kind]),a=i.codecs.some((e=>/.+\/rtx$/i.test(e.mimeType)));i.mid=`mid-${n.generateRandomNumber()}`,t||(t=[{}]);for(const e of t)e.ssrc=n.generateRandomNumber(),a&&(e.rtx={ssrc:n.generateRandomNumber()});i.encodings=t,i.rtcp={cname:this._cname,reducedSize:!0,mux:!0};const o=this._nextLocalId++;return this._tracks.set(o,e),{localId:String(o),rtpParameters:i}}async stopSending(e){if(p.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?p.debug("replaceTrack() [localId:%s, track.id:%s]",e,t.id):p.debug("replaceTrack() [localId:%s, no track]",e),this._tracks.delete(Number(e)),this._tracks.set(Number(e),t)}async setMaxSpatialLayer(e,t){this.assertNotClosed(),p.debug("setMaxSpatialLayer() [localId:%s, spatialLayer:%s]",e,t)}async setRtpEncodingParameters(e,t){this.assertNotClosed(),p.debug("setRtpEncodingParameters() [localId:%s, params:%o]",e,t)}async getSenderStats(e){return this.assertNotClosed(),new Map}async sendDataChannel({ordered:e,maxPacketLifeTime:t,maxRetransmits:s,label:r,protocol:i}){return this.assertNotClosed(),this._transportReady||await this.setupTransport({localDtlsRole:"server"}),p.debug("sendDataChannel()"),{dataChannel:new l({id:this._nextSctpStreamId++,ordered:e,maxPacketLifeTime:t,maxRetransmits:s,label:r,protocol:i}),sctpStreamParameters:{streamId:this._nextSctpStreamId,ordered:e,maxPacketLifeTime:t,maxRetransmits:s}}}async receive(e){this.assertNotClosed();const t=[];for(const s of e){const{trackId:e,kind:i}=s;this._transportReady||await this.setupTransport({localDtlsRole:"client"}),p.debug("receive() [trackId:%s, kind:%s]",e,i);const a=this._nextLocalId++,n=new r.FakeMediaStreamTrack({kind:i});this._tracks.set(a,n),t.push({localId:String(a),track:n})}return t}async stopReceiving(e){if(!this._closed)for(const t of e)p.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:s}){return this.assertNotClosed(),this._transportReady||await this.setupTransport({localDtlsRole:"client"}),p.debug("receiveDataChannel()"),{dataChannel:new l({id:e.streamId,ordered:e.ordered,maxPacketLifeTime:e.maxPacketLifeTime,maxRetransmits:e.maxRetransmits,label:t,protocol:s})}}async setupTransport({localDtlsRole:e,localSdpObject:t}){const s=n.clone(this.fakeParameters.generateLocalDtlsParameters());e&&(s.role=e),this.emit("@connectionstatechange","connecting"),await new Promise(((e,t)=>this.emit("@connect",{dtlsParameters:s},e,t))),this._transportReady=!0}assertNotClosed(){if(this._closed)throw new c.InvalidStateError("method called in a closed handler")}}t.FakeHandler=h},2770:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=s(9746);t.default=function(e){if(!(0,r.default)(e))throw TypeError("Invalid UUID");return parseInt(e.slice(14,15),16)}},2829:(e,t)=>{"use strict";function s(e,t,s,r){switch(e){case 0:return t&s^~t&r;case 1:case 3:return t^s^r;case 2:return t&s^t&r^s&r}}function r(e,t){return e<>>32-t}Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){const t=[1518500249,1859775393,2400959708,3395469782],i=[1732584193,4023233417,2562383102,271733878,3285377520],a=new Uint8Array(e.length+1);a.set(e),a[e.length]=128;const n=(e=a).length/4+2,o=Math.ceil(n/16),c=new Array(o);for(let t=0;t>>0;l=p,p=d,d=r(o,30)>>>0,o=n,n=c}i[0]=i[0]+n>>>0,i[1]=i[1]+o>>>0,i[2]=i[2]+d>>>0,i[3]=i[3]+p>>>0,i[4]=i[4]+l>>>0}return Uint8Array.of(i[0]>>24,i[0]>>16,i[0]>>8,i[0],i[1]>>24,i[1]>>16,i[1]>>8,i[1],i[2]>>24,i[2]>>16,i[2]>>8,i[2],i[3]>>24,i[3]>>16,i[3]>>8,i[3],i[4]>>24,i[4]>>16,i[4]>>8,i[4])}},2988:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.URL=t.DNS=t.stringToBytes=void 0;const r=s(1797),i=s(6011);function a(e){e=unescape(encodeURIComponent(e));const t=new Uint8Array(e.length);for(let s=0;s{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Logger=void 0;const r=s(7833),i="mediasoup-client";t.Logger=class{_debug;_warn;_error;constructor(e){e?(this._debug=(0,r.default)(`${i}:${e}`),this._warn=(0,r.default)(`${i}:WARN:${e}`),this._error=(0,r.default)(`${i}:ERROR:${e}`)):(this._debug=(0,r.default)(i),this._warn=(0,r.default)(`${i}:WARN`),this._error=(0,r.default)(`${i}: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}}},3200:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ProfileLevelId=t.Level=t.Profile=void 0,t.parseProfileLevelId=h,t.profileLevelIdToString=m,t.profileToString=function(e){switch(e){case i.ConstrainedBaseline:return"ConstrainedBaseline";case i.Baseline:return"Baseline";case i.Main:return"Main";case i.ConstrainedHigh:return"ConstrainedHigh";case i.High:return"High";case i.PredictiveHigh444:return"PredictiveHigh444";default:return void r.warn(`profileToString() | unrecognized profile ${e}`)}},t.levelToString=function(e){switch(e){case a.L1_b:return"1b";case a.L1:return"1";case a.L1_1:return"1.1";case a.L1_2:return"1.2";case a.L1_3:return"1.3";case a.L2:return"2";case a.L2_1:return"2.1";case a.L2_2:return"2.2";case a.L3:return"3";case a.L3_1:return"3.1";case a.L3_2:return"3.2";case a.L4:return"4";case a.L4_1:return"4.1";case a.L4_2:return"4.2";case a.L5:return"5";case a.L5_1:return"5.1";case a.L5_2:return"5.2";default:return void r.warn(`levelToString() | unrecognized level ${e}`)}},t.parseSdpProfileLevelId=u,t.isSameProfile=function(e={},t={}){const s=u(e),r=u(t);return Boolean(s&&r&&s.profile===r.profile)},t.isSameProfileAndLevel=function(e={},t={}){const s=u(e),r=u(t);return Boolean(s&&r&&s.profile===r.profile&&s.level==r.level)},t.generateProfileLevelIdStringForAnswer=function(e={},t={}){if(!e["profile-level-id"]&&!t["profile-level-id"])return void r.warn("generateProfileLevelIdStringForAnswer() | profile-level-id missing in local and remote params");const s=u(e),i=u(t);if(!s)throw new TypeError("invalid local_profile_level_id");if(!i)throw new TypeError("invalid remote_profile_level_id");if(s.profile!==i.profile)throw new TypeError("H264 Profile mismatch");const o=g(e)&&g(t),c=s.level,d=function(e,t){return e===a.L1_b?t!==a.L1&&t!==a.L1_b:t===a.L1_b?e!==a.L1:e=0;--s){const i=l[s];if(256*i.max_macroblock_frame_size<=e&&i.max_macroblocks_per_second<=t*i.max_macroblock_frame_size)return r.debug(`supportedLevel() | result [max_frame_pixel_count:${e}, max_fps:${t}, level:${i.level}]`),i.level}r.warn(`supportedLevel() | no level supported [max_frame_pixel_count:${e}, max_fps:${t}]`)};const r=new(s(3582).Logger);var i,a;!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"}(i||(t.Profile=i={})),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"}(a||(t.Level=a={}));class n{constructor(e,t){this.profile=e,this.level=t}}t.ProfileLevelId=n;const o=new n(i.ConstrainedBaseline,a.L3_1);class c{constructor(e){this.mask=~f("x",e),this.masked_value=f("1",e)}isMatch(e){return this.masked_value===(e&this.mask)}}class d{constructor(e,t,s){this.profile_idc=e,this.profile_iop=t,this.profile=s}}const p=[new d(66,new c("x1xx0000"),i.ConstrainedBaseline),new d(77,new c("1xxx0000"),i.ConstrainedBaseline),new d(88,new c("11xx0000"),i.ConstrainedBaseline),new d(66,new c("x0xx0000"),i.Baseline),new d(88,new c("10xx0000"),i.Baseline),new d(77,new c("0x0x0000"),i.Main),new d(100,new c("00000000"),i.High),new d(100,new c("00001100"),i.ConstrainedHigh),new d(244,new c("00000000"),i.PredictiveHigh444)],l=[{max_macroblocks_per_second:1485,max_macroblock_frame_size:99,level:a.L1},{max_macroblocks_per_second:1485,max_macroblock_frame_size:99,level:a.L1_b},{max_macroblocks_per_second:3e3,max_macroblock_frame_size:396,level:a.L1_1},{max_macroblocks_per_second:6e3,max_macroblock_frame_size:396,level:a.L1_2},{max_macroblocks_per_second:11880,max_macroblock_frame_size:396,level:a.L1_3},{max_macroblocks_per_second:11880,max_macroblock_frame_size:396,level:a.L2},{max_macroblocks_per_second:19800,max_macroblock_frame_size:792,level:a.L2_1},{max_macroblocks_per_second:20250,max_macroblock_frame_size:1620,level:a.L2_2},{max_macroblocks_per_second:40500,max_macroblock_frame_size:1620,level:a.L3},{max_macroblocks_per_second:108e3,max_macroblock_frame_size:3600,level:a.L3_1},{max_macroblocks_per_second:216e3,max_macroblock_frame_size:5120,level:a.L3_2},{max_macroblocks_per_second:245760,max_macroblock_frame_size:8192,level:a.L4},{max_macroblocks_per_second:245760,max_macroblock_frame_size:8192,level:a.L4_1},{max_macroblocks_per_second:522240,max_macroblock_frame_size:8704,level:a.L4_2},{max_macroblocks_per_second:589824,max_macroblock_frame_size:22080,level:a.L5},{max_macroblocks_per_second:983040,max_macroblock_frame_size:36864,level:a.L5_1},{max_macroblocks_per_second:2073600,max_macroblock_frame_size:36864,level:a.L5_2}];function h(e){if("string"!=typeof e||6!==e.length)return;const t=parseInt(e,16);if(0===t)return;const s=255&t,i=t>>8&255,o=t>>16&255;let c;switch(s){case a.L1_1:c=16&i?a.L1_b:a.L1_1;break;case a.L1:case a.L1_2:case a.L1_3:case a.L2:case a.L2_1:case a.L2_2:case a.L3:case a.L3_1:case a.L3_2:case a.L4:case a.L4_1:case a.L4_2:case a.L5:case a.L5_1:case a.L5_2:c=s;break;default:return void r.warn(`parseProfileLevelId() | unrecognized level_idc [str:${e}, level_idc:${s}]`)}for(const t of p)if(o===t.profile_idc&&t.profile_iop.isMatch(i))return r.debug(`parseProfileLevelId() | result [str:${e}, profile:${t.profile}, level:${c}]`),new n(t.profile,c);r.warn(`parseProfileLevelId() | unrecognized profile_idc/profile_iop combination [str:${e}, profile_idc:${o}, profile_iop:${i}]`)}function m(e){if(e.level==a.L1_b)switch(e.profile){case i.ConstrainedBaseline:return"42f00b";case i.Baseline:return"42100b";case i.Main:return"4d100b";default:return void r.warn(`profileLevelIdToString() | Level 1_b not is allowed for profile ${e.profile}`)}let t;switch(e.profile){case i.ConstrainedBaseline:t="42e0";break;case i.Baseline:t="4200";break;case i.Main:t="4d00";break;case i.ConstrainedHigh:t="640c";break;case i.High:t="6400";break;case i.PredictiveHigh444:t="f400";break;default:return void r.warn(`profileLevelIdToString() | unrecognized profile ${e.profile}`)}let s=e.level.toString(16);return 1===s.length&&(s=`0${s}`),`${t}${s}`}function u(e={}){const t=e["profile-level-id"];return t?h(t):o}function f(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 g(e={}){const t=e["level-asymmetry-allowed"];return!0===t||1===t||"1"===t}},3303:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.parse=function(e){const t=s.exec(e??"");return t?{spatialLayers:Number(t[1]),temporalLayers:Number(t[2])}:{spatialLayers:1,temporalLayers:1}};const s=new RegExp("^[LS]([1-9]\\d{0,1})T([1-9]\\d{0,1})")},3465:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default="00000000-0000-0000-0000-000000000000"},3471:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.OfferMediaSection=t.AnswerMediaSection=t.MediaSection=void 0;const r=s(7363),i=s(1765);class a{_mediaObject;_planB;constructor({iceParameters:e,iceCandidates:t,dtlsParameters:s,planB:r=!1}){if(this._mediaObject={},this._planB=r,e&&this.setIceParameters(e),t){this._mediaObject.candidates=[];for(const e of t){const t={component:1};t.foundation=e.foundation,t.ip=e.address??e.ip,t.port=e.port,t.priority=e.priority,t.transport=e.protocol,t.type=e.type,e.tcpType&&(t.tcptype=e.tcpType),this._mediaObject.candidates.push(t)}this._mediaObject.endOfCandidates="end-of-candidates",this._mediaObject.iceOptions="renomination"}s&&this.setDtlsRole(s.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(),delete this._mediaObject.ext,delete this._mediaObject.ssrcs,delete this._mediaObject.ssrcGroups,delete this._mediaObject.simulcast,delete this._mediaObject.simulcast_03,delete this._mediaObject.rids,delete this._mediaObject.extmapAllowMixed}close(){this.disable(),this._mediaObject.port=0}}function n(e){const t=new RegExp("^(audio|video)/(.+)","i").exec(e.mimeType);if(!t)throw new TypeError("invalid codec.mimeType");return t[2]}t.MediaSection=a,t.AnswerMediaSection=class extends a{constructor({iceParameters:e,iceCandidates:t,dtlsParameters:s,sctpParameters:r,plainRtpParameters:a,planB:o=!1,offerMediaObject:c,offerRtpParameters:d,answerRtpParameters:p,codecOptions:l}){switch(super({iceParameters:e,iceCandidates:t,dtlsParameters:s,planB:o}),this._mediaObject.mid=String(c.mid),this._mediaObject.type=c.type,this._mediaObject.protocol=c.protocol,a?(this._mediaObject.connection={ip:a.ip,version:a.ipVersion},this._mediaObject.port=a.port):(this._mediaObject.connection={ip:"127.0.0.1",version:4},this._mediaObject.port=7),c.type){case"audio":case"video":this._mediaObject.direction="recvonly",this._mediaObject.rtp=[],this._mediaObject.rtcpFb=[],this._mediaObject.fmtp=[];for(const e of p.codecs){const t={payload:e.payloadType,codec:n(e),rate:e.clockRate};e.channels>1&&(t.encoding=e.channels),this._mediaObject.rtp.push(t);const s=i.clone(e.parameters)??{};let r=i.clone(e.rtcpFeedback)??[];if(l){const{opusStereo:t,opusFec:i,opusDtx:a,opusMaxPlaybackRate:n,opusMaxAverageBitrate:o,opusPtime:c,opusNack:p,videoGoogleStartBitrate:h,videoGoogleMaxBitrate:m,videoGoogleMinBitrate:u}=l,f=d.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!==a&&(f.parameters.usedtx=a?1:0,s.usedtx=a?1:0),void 0!==n&&(s.maxplaybackrate=n),void 0!==o&&(s.maxaveragebitrate=o),void 0!==c&&(f.parameters.ptime=c,s.ptime=c),p||(f.rtcpFeedback=f.rtcpFeedback.filter((e=>"nack"!==e.type||e.parameter)),r=r.filter((e=>"nack"!==e.type||e.parameter)));break;case"video/vp8":case"video/vp9":case"video/h264":case"video/h265":void 0!==h&&(s["x-google-start-bitrate"]=h),void 0!==m&&(s["x-google-max-bitrate"]=m),void 0!==u&&(s["x-google-min-bitrate"]=u)}}const a={payload:e.payloadType,config:""};for(const e of Object.keys(s))a.config&&(a.config+=";"),a.config+=`${e}=${s[e]}`;a.config&&this._mediaObject.fmtp.push(a);for(const t of r)this._mediaObject.rtcpFb.push({payload:e.payloadType,type:t.type,subtype:t.parameter})}this._mediaObject.payloads=p.codecs.map((e=>e.payloadType)).join(" "),this._mediaObject.ext=[];for(const e of p.headerExtensions)(c.ext??[]).some((t=>t.uri===e.uri))&&this._mediaObject.ext.push({uri:e.uri,value:e.id});if("extmap-allow-mixed"===c.extmapAllowMixed&&(this._mediaObject.extmapAllowMixed="extmap-allow-mixed"),c.simulcast){this._mediaObject.simulcast={dir1:"recv",list1:c.simulcast.list1},this._mediaObject.rids=[];for(const e of c.rids??[])"send"===e.direction&&this._mediaObject.rids.push({id:e.id,direction:"recv"})}else if(c.simulcast_03){this._mediaObject.simulcast_03={value:c.simulcast_03.value.replace(/send/g,"recv")},this._mediaObject.rids=[];for(const e of c.rids??[])"send"===e.direction&&this._mediaObject.rids.push({id:e.id,direction:"recv"})}this._mediaObject.rtcpMux="rtcp-mux",this._mediaObject.rtcpRsize="rtcp-rsize",this._planB&&"video"===this._mediaObject.type&&(this._mediaObject.xGoogleFlag="conference");break;case"application":"number"==typeof c.sctpPort?(this._mediaObject.payloads="webrtc-datachannel",this._mediaObject.sctpPort=r.port,this._mediaObject.maxMessageSize=r.maxMessageSize):c.sctpmap&&(this._mediaObject.payloads=r.port,this._mediaObject.sctpmap={app:"webrtc-datachannel",sctpmapNumber:r.port,maxMessageSize:r.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(e){if(!this._mediaObject.simulcast?.list1)return;const t={};for(const s of e)s.rid&&(t[s.rid]=s);const s=this._mediaObject.simulcast.list1,i=r.parseSimulcastStreamList(s);for(const e of i)for(const s of e)s.paused=!t[s.scid]?.active;this._mediaObject.simulcast.list1=i.map((e=>e.map((e=>`${e.paused?"~":""}${e.scid}`)).join(","))).join(";")}},t.OfferMediaSection=class extends a{constructor({iceParameters:e,iceCandidates:t,dtlsParameters:s,sctpParameters:r,plainRtpParameters:i,planB:a=!1,mid:o,kind:c,offerRtpParameters:d,streamId:p,trackId:l,oldDataChannelSpec:h=!1}){switch(super({iceParameters:e,iceCandidates:t,dtlsParameters:s,planB:a}),this._mediaObject.mid=String(o),this._mediaObject.type=c,i?(this._mediaObject.connection={ip:i.ip,version:i.ipVersion},this._mediaObject.protocol="RTP/AVP",this._mediaObject.port=i.port):(this._mediaObject.connection={ip:"127.0.0.1",version:4},this._mediaObject.protocol=r?"UDP/DTLS/SCTP":"UDP/TLS/RTP/SAVPF",this._mediaObject.port=7),this._mediaObject.extmapAllowMixed="extmap-allow-mixed",c){case"audio":case"video":{this._mediaObject.direction="sendonly",this._mediaObject.rtp=[],this._mediaObject.rtcpFb=[],this._mediaObject.fmtp=[],this._planB||(this._mediaObject.msid=`${p??"-"} ${l}`);for(const e of d.codecs){const t={payload:e.payloadType,codec:n(e),rate:e.clockRate};e.channels>1&&(t.encoding=e.channels),this._mediaObject.rtp.push(t);const s={payload:e.payloadType,config:""};for(const t of Object.keys(e.parameters))s.config&&(s.config+=";"),s.config+=`${t}=${e.parameters[t]}`;s.config&&this._mediaObject.fmtp.push(s);for(const t of e.rtcpFeedback)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)this._mediaObject.ext.push({uri:e.uri,value:e.id});this._mediaObject.rtcpMux="rtcp-mux",this._mediaObject.rtcpRsize="rtcp-rsize";const e=d.encodings[0],t=e.ssrc,s=e.rtx?.ssrc;this._mediaObject.ssrcs=[],this._mediaObject.ssrcGroups=[],d.rtcp.cname&&this._mediaObject.ssrcs.push({id:t,attribute:"cname",value:d.rtcp.cname}),this._planB&&this._mediaObject.ssrcs.push({id:t,attribute:"msid",value:`${p??"-"} ${l}`}),s&&(d.rtcp.cname&&this._mediaObject.ssrcs.push({id:s,attribute:"cname",value:d.rtcp.cname}),this._planB&&this._mediaObject.ssrcs.push({id:s,attribute:"msid",value:`${p??"-"} ${l}`}),this._mediaObject.ssrcGroups.push({semantics:"FID",ssrcs:`${t} ${s}`}));break}case"application":h?(this._mediaObject.payloads=r.port,this._mediaObject.sctpmap={app:"webrtc-datachannel",sctpmapNumber:r.port,maxMessageSize:r.maxMessageSize}):(this._mediaObject.payloads="webrtc-datachannel",this._mediaObject.sctpPort=r.port,this._mediaObject.maxMessageSize=r.maxMessageSize)}}setDtlsRole(e){this._mediaObject.setup="actpass"}resume(){this._mediaObject.direction="sendonly"}planBReceive({offerRtpParameters:e,streamId:t,trackId:s}){const r=e.encodings[0],i=r.ssrc,a=r.rtx?.ssrc,o=this._mediaObject.payloads.split(" ");for(const t of e.codecs){if(o.includes(String(t.payloadType)))continue;const e={payload:t.payloadType,codec:n(t),rate:t.clockRate};t.channels>1&&(e.encoding=t.channels),this._mediaObject.rtp.push(e);const s={payload:t.payloadType,config:""};for(const e of Object.keys(t.parameters))s.config&&(s.config+=";"),s.config+=`${e}=${t.parameters[e]}`;s.config&&this._mediaObject.fmtp.push(s);for(const e of t.rtcpFeedback)this._mediaObject.rtcpFb.push({payload:t.payloadType,type:e.type,subtype:e.parameter})}this._mediaObject.payloads+=` ${e.codecs.filter((e=>!this._mediaObject.payloads.includes(e.payloadType))).map((e=>e.payloadType)).join(" ")}`,this._mediaObject.payloads=this._mediaObject.payloads.trim(),e.rtcp.cname&&this._mediaObject.ssrcs.push({id:i,attribute:"cname",value:e.rtcp.cname}),this._mediaObject.ssrcs.push({id:i,attribute:"msid",value:`${t??"-"} ${s}`}),a&&(e.rtcp.cname&&this._mediaObject.ssrcs.push({id:a,attribute:"cname",value:e.rtcp.cname}),this._mediaObject.ssrcs.push({id:a,attribute:"msid",value:`${t??"-"} ${s}`}),this._mediaObject.ssrcGroups.push({semantics:"FID",ssrcs:`${i} ${a}`}))}planBStopReceiving({offerRtpParameters:e}){const t=e.encodings[0],s=t.ssrc,r=t.rtx?.ssrc;this._mediaObject.ssrcs=this._mediaObject.ssrcs.filter((e=>e.id!==s&&e.id!==r)),r&&(this._mediaObject.ssrcGroups=this._mediaObject.ssrcGroups.filter((e=>e.ssrcs!==`${s} ${r}`)))}}},3518:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Consumer=void 0;const r=s(2994),i=s(3953),a=s(4893),n=new r.Logger("Consumer");class o extends i.EnhancedEventEmitter{_id;_localId;_producerId;_closed=!1;_rtpReceiver;_track;_rtpParameters;_paused;_appData;_observer=new i.EnhancedEventEmitter;constructor({id:e,localId:t,producerId:s,rtpReceiver:r,track:i,rtpParameters:a,appData:o}){super(),n.debug("constructor()"),this._id=e,this._localId=t,this._producerId=s,this._rtpReceiver=r,this._track=i,this._rtpParameters=a,this._paused=!i.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||(n.debug("close()"),this._closed=!0,this.destroyTrack(),this.emit("@close"),this._observer.safeEmit("close"))}transportClosed(){this._closed||(n.debug("transportClosed()"),this._closed=!0,this.destroyTrack(),this.safeEmit("transportclose"),this._observer.safeEmit("close"))}async getStats(){if(this._closed)throw new a.InvalidStateError("closed");return new Promise(((e,t)=>{this.safeEmit("@getstats",e,t)}))}pause(){n.debug("pause()"),this._closed?n.error("pause() | Consumer closed"):this._paused?n.debug("pause() | Consumer is already paused"):(this._paused=!0,this._track.enabled=!1,this.emit("@pause"),this._observer.safeEmit("pause"))}resume(){n.debug("resume()"),this._closed?n.error("resume() | Consumer closed"):this._paused?(this._paused=!1,this._track.enabled=!0,this.emit("@resume"),this._observer.safeEmit("resume")):n.debug("resume() | Consumer is already resumed")}onTrackEnded(){n.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){}}}t.Consumer=o},3582:function(e,t,s){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.Logger=void 0;const i=r(s(7833)),a="h264-profile-level-id";t.Logger=class{constructor(e){e?(this._debug=(0,i.default)(`${a}:${e}`),this._warn=(0,i.default)(`${a}:WARN:${e}`),this._error=(0,i.default)(`${a}:ERROR:${e}`)):(this._debug=(0,i.default)(a),this._warn=(0,i.default)(`${a}:WARN`),this._error=(0,i.default)(`${a}: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}}},3779:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const s="undefined"!=typeof crypto&&crypto.randomUUID&&crypto.randomUUID.bind(crypto);t.default={randomUUID:s}},3785:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.clone=function(e){return void 0===e?void 0:Number.isNaN(e)?NaN:"function"==typeof structuredClone?structuredClone(e):JSON.parse(JSON.stringify(e))}},3804:(e,t,s)=>{var r=s(5602),i=/%[sdv%]/g,a=function(e){var t=1,s=arguments,r=s.length;return e.replace(i,(function(e){if(t>=r)return e;var i=s[t];switch(t+=1,e){case"%%":return"%";case"%s":return String(i);case"%d":return Number(i);case"%v":return""}}))},n=function(e,t,s){var r=[e+"="+(t.format instanceof Function?t.format(t.push?s:s[t.name]):t.format)];if(t.names)for(var i=0;i{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.EnhancedEventEmitter=void 0;const r=s(9596),i=new(s(2994).Logger)("EnhancedEventEmitter");class a extends r.EventEmitter{constructor(){super(),this.setMaxListeners(1/0)}emit(e,...t){return super.emit(e,...t)}safeEmit(e,...t){try{return super.emit(e,...t)}catch(t){i.error("safeEmit() | event listener threw an error [eventName:%s]:%o",e,t);try{super.emit("listenererror",e,t)}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)}}t.EnhancedEventEmitter=a},4039:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ReactNativeUnifiedPlan=void 0;const r=s(7363),i=s(2994),a=s(1765),n=s(8046),o=s(5544),c=s(5938),d=s(4256),p=s(4893),l=s(521),h=s(1305),m=s(3303),u=new i.Logger("ReactNativeUnifiedPlan"),f={OS:1024,MIS:1024};class g extends l.HandlerInterface{_closed=!1;_direction;_remoteSdp;_sendingRtpParametersByKind;_sendingRemoteRtpParametersByKind;_forcedLocalDtlsRole;_pc;_mapMidTransceiver=new Map;_sendStream=new MediaStream;_hasDataChannelMediaSection=!1;_nextSendSctpStreamId=0;_transportReady=!1;static createFactory(){return()=>new g}constructor(){super()}get name(){return"ReactNativeUnifiedPlan"}close(){if(u.debug("close()"),!this._closed){if(this._closed=!0,this._sendStream.release(!1),this._pc)try{this._pc.close()}catch(e){}this.emit("@close")}}async getNativeRtpCapabilities(){u.debug("getNativeRtpCapabilities()");const e=new RTCPeerConnection({iceServers:[],iceTransportPolicy:"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require",sdpSemantics:"unified-plan"});try{e.addTransceiver("audio"),e.addTransceiver("video");const t=await e.createOffer();try{e.close()}catch(e){}const s=r.parse(t.sdp),i=o.extractRtpCapabilities({sdpObject:s});return d.addNackSupportForOpus(i),i}catch(t){try{e.close()}catch(e){}throw t}}async getNativeSctpCapabilities(){return u.debug("getNativeSctpCapabilities()"),{numStreams:f}}run({direction:e,iceParameters:t,iceCandidates:s,dtlsParameters:r,sctpParameters:i,iceServers:a,iceTransportPolicy:o,additionalSettings:c,proprietaryConstraints:d,extendedRtpCapabilities:p}){this.assertNotClosed(),u.debug("run()"),this._direction=e,this._remoteSdp=new h.RemoteSdp({iceParameters:t,iceCandidates:s,dtlsParameters:r,sctpParameters:i}),this._sendingRtpParametersByKind={audio:n.getSendingRtpParameters("audio",p),video:n.getSendingRtpParameters("video",p)},this._sendingRemoteRtpParametersByKind={audio:n.getSendingRemoteRtpParameters("audio",p),video:n.getSendingRemoteRtpParameters("video",p)},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",sdpSemantics:"unified-plan",...c},d),this._pc.addEventListener("icegatheringstatechange",(()=>{this.emit("@icegatheringstatechange",this._pc.iceGatheringState)})),this._pc.addEventListener("icecandidateerror",(e=>{this.emit("@icecandidateerror",e)})),this._pc.connectionState?this._pc.addEventListener("connectionstatechange",(()=>{this.emit("@connectionstatechange",this._pc.connectionState)})):this._pc.addEventListener("iceconnectionstatechange",(()=>{switch(u.warn("run() | pc.connectionState not supported, using pc.iceConnectionState"),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")}}))}async updateIceServers(e){this.assertNotClosed(),u.debug("updateIceServers()");const t=this._pc.getConfiguration();t.iceServers=e,this._pc.setConfiguration(t)}async restartIce(e){if(this.assertNotClosed(),u.debug("restartIce()"),this._remoteSdp.updateIceParameters(e),this._transportReady)if("send"===this._direction){const e=await this._pc.createOffer({iceRestart:!0});u.debug("restartIce() | calling pc.setLocalDescription() [offer:%o]",e),await this._pc.setLocalDescription(e);const t={type:"answer",sdp:this._remoteSdp.getSdp()};u.debug("restartIce() | calling pc.setRemoteDescription() [answer:%o]",t),await this._pc.setRemoteDescription(t)}else{const e={type:"offer",sdp:this._remoteSdp.getSdp()};u.debug("restartIce() | calling pc.setRemoteDescription() [offer:%o]",e),await this._pc.setRemoteDescription(e);const t=await this._pc.createAnswer();u.debug("restartIce() | calling pc.setLocalDescription() [answer:%o]",t),await this._pc.setLocalDescription(t)}}async getTransportStats(){return this.assertNotClosed(),this._pc.getStats()}async send({track:e,encodings:t,codecOptions:s,codec:i,onRtpSender:d}){this.assertNotClosed(),this.assertSendDirection(),u.debug("send() [kind:%s, track.id:%s]",e.kind,e.id),t&&t.length>1&&t.forEach(((e,t)=>{e.rid=`r${t}`}));const p=a.clone(this._sendingRtpParametersByKind[e.kind]);p.codecs=n.reduceCodecs(p.codecs,i);const l=a.clone(this._sendingRemoteRtpParametersByKind[e.kind]);l.codecs=n.reduceCodecs(l.codecs,i);const h=this._remoteSdp.getNextMediaSectionIdx(),f=this._pc.addTransceiver(e,{direction:"sendonly",streams:[this._sendStream],sendEncodings:t});d&&d(f.sender);let g,_=await this._pc.createOffer(),w=r.parse(_.sdp);w.extmapAllowMixed&&this._remoteSdp.setSessionExtmapAllowMixed(),this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:w});let b=!1;const v=(0,m.parse)((t??[{}])[0].scalabilityMode);t&&1===t.length&&v.spatialLayers>1&&"video/vp9"===p.codecs[0].mimeType.toLowerCase()&&(u.debug("send() | enabling legacy simulcast for VP9 SVC"),b=!0,w=r.parse(_.sdp),g=w.media[h.idx],c.addLegacySimulcast({offerMediaObject:g,numStreams:v.spatialLayers}),_={type:"offer",sdp:r.write(w)}),u.debug("send() | calling pc.setLocalDescription() [offer:%o]",_),await this._pc.setLocalDescription(_);let y=f.mid??void 0;if(y||u.warn("send() | missing transceiver.mid (bug in react-native-webrtc, using a workaround"),p.mid=y,w=r.parse(this._pc.localDescription.sdp),g=w.media[h.idx],p.rtcp.cname=o.getCname({offerMediaObject:g}),t)if(1===t.length){let e=c.getRtpEncodings({offerMediaObject:g});Object.assign(e[0],t[0]),b&&(e=[e[0]]),p.encodings=e}else p.encodings=t;else p.encodings=c.getRtpEncodings({offerMediaObject:g});if(p.encodings.length>1&&("video/vp8"===p.codecs[0].mimeType.toLowerCase()||"video/h264"===p.codecs[0].mimeType.toLowerCase()))for(const e of p.encodings)e.scalabilityMode?e.scalabilityMode=`L1T${v.temporalLayers}`:e.scalabilityMode="L1T3";this._remoteSdp.send({offerMediaObject:g,reuseMid:h.reuseMid,offerRtpParameters:p,answerRtpParameters:l,codecOptions:s});const S={type:"answer",sdp:this._remoteSdp.getSdp()};return u.debug("send() | calling pc.setRemoteDescription() [answer:%o]",S),await this._pc.setRemoteDescription(S),y||(y=f.mid,p.mid=y),this._mapMidTransceiver.set(y,f),{localId:y,rtpParameters:p,rtpSender:f.sender}}async stopSending(e){if(this.assertSendDirection(),this._closed)return;u.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 s=await this._pc.createOffer();u.debug("stopSending() | calling pc.setLocalDescription() [offer:%o]",s),await this._pc.setLocalDescription(s);const r={type:"answer",sdp:this._remoteSdp.getSdp()};u.debug("stopSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r),this._mapMidTransceiver.delete(e)}async pauseSending(e){this.assertNotClosed(),this.assertSendDirection(),u.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 s=await this._pc.createOffer();u.debug("pauseSending() | calling pc.setLocalDescription() [offer:%o]",s),await this._pc.setLocalDescription(s);const r={type:"answer",sdp:this._remoteSdp.getSdp()};u.debug("pauseSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r)}async resumeSending(e){this.assertNotClosed(),this.assertSendDirection(),u.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 s=await this._pc.createOffer();u.debug("resumeSending() | calling pc.setLocalDescription() [offer:%o]",s),await this._pc.setLocalDescription(s);const r={type:"answer",sdp:this._remoteSdp.getSdp()};u.debug("resumeSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r)}async replaceTrack(e,t){this.assertNotClosed(),this.assertSendDirection(),t?u.debug("replaceTrack() [localId:%s, track.id:%s]",e,t.id):u.debug("replaceTrack() [localId:%s, no track]",e);const s=this._mapMidTransceiver.get(e);if(!s)throw new Error("associated RTCRtpTransceiver not found");await s.sender.replaceTrack(t)}async setMaxSpatialLayer(e,t){this.assertNotClosed(),this.assertSendDirection(),u.debug("setMaxSpatialLayer() [localId:%s, spatialLayer:%s]",e,t);const s=this._mapMidTransceiver.get(e);if(!s)throw new Error("associated RTCRtpTransceiver not found");const r=s.sender.getParameters();r.encodings.forEach(((e,s)=>{e.active=s<=t})),await s.sender.setParameters(r),this._remoteSdp.muxMediaSectionSimulcast(e,r.encodings);const i=await this._pc.createOffer();u.debug("setMaxSpatialLayer() | calling pc.setLocalDescription() [offer:%o]",i),await this._pc.setLocalDescription(i);const a={type:"answer",sdp:this._remoteSdp.getSdp()};u.debug("setMaxSpatialLayer() | calling pc.setRemoteDescription() [answer:%o]",a),await this._pc.setRemoteDescription(a)}async setRtpEncodingParameters(e,t){this.assertNotClosed(),this.assertSendDirection(),u.debug("setRtpEncodingParameters() [localId:%s, params:%o]",e,t);const s=this._mapMidTransceiver.get(e);if(!s)throw new Error("associated RTCRtpTransceiver not found");const r=s.sender.getParameters();r.encodings.forEach(((e,s)=>{r.encodings[s]={...e,...t}})),await s.sender.setParameters(r),this._remoteSdp.muxMediaSectionSimulcast(e,r.encodings);const i=await this._pc.createOffer();u.debug("setRtpEncodingParameters() | calling pc.setLocalDescription() [offer:%o]",i),await this._pc.setLocalDescription(i);const a={type:"answer",sdp:this._remoteSdp.getSdp()};u.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:e,maxPacketLifeTime:t,maxRetransmits:s,label:i,protocol:a}){this.assertNotClosed(),this.assertSendDirection();const n={negotiated:!0,id:this._nextSendSctpStreamId,ordered:e,maxPacketLifeTime:t,maxRetransmits:s,protocol:a};u.debug("sendDataChannel() [options:%o]",n);const o=this._pc.createDataChannel(i,n);if(this._nextSendSctpStreamId=++this._nextSendSctpStreamId%f.MIS,!this._hasDataChannelMediaSection){const e=await this._pc.createOffer(),t=r.parse(e.sdp),s=t.media.find((e=>"application"===e.type));this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:t}),u.debug("sendDataChannel() | calling pc.setLocalDescription() [offer:%o]",e),await this._pc.setLocalDescription(e),this._remoteSdp.sendSctpAssociation({offerMediaObject:s});const i={type:"answer",sdp:this._remoteSdp.getSdp()};u.debug("sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]",i),await this._pc.setRemoteDescription(i),this._hasDataChannelMediaSection=!0}return{dataChannel:o,sctpStreamParameters:{streamId:n.id,ordered:n.ordered,maxPacketLifeTime:n.maxPacketLifeTime,maxRetransmits:n.maxRetransmits}}}async receive(e){this.assertNotClosed(),this.assertRecvDirection();const t=[],s=new Map;for(const t of e){const{trackId:e,kind:r,rtpParameters:i,streamId:a}=t;u.debug("receive() [trackId:%s, kind:%s]",e,r);const n=i.mid??String(this._mapMidTransceiver.size);s.set(e,n),this._remoteSdp.receive({mid:n,kind:r,offerRtpParameters:i,streamId:a??i.rtcp.cname,trackId:e})}const i={type:"offer",sdp:this._remoteSdp.getSdp()};u.debug("receive() | calling pc.setRemoteDescription() [offer:%o]",i),await this._pc.setRemoteDescription(i);for(const t of e){const{trackId:e,onRtpReceiver:r}=t;if(r){const t=s.get(e),i=this._pc.getTransceivers().find((e=>e.mid===t));if(!i)throw new Error("transceiver not found");r(i.receiver)}}let a=await this._pc.createAnswer();const n=r.parse(a.sdp);for(const t of e){const{trackId:e,rtpParameters:r}=t,i=s.get(e),a=n.media.find((e=>String(e.mid)===i));o.applyCodecParameters({offerRtpParameters:r,answerMediaObject:a})}a={type:"answer",sdp:r.write(n)},this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:n}),u.debug("receive() | calling pc.setLocalDescription() [answer:%o]",a),await this._pc.setLocalDescription(a);for(const r of e){const{trackId:e}=r,i=s.get(e),a=this._pc.getTransceivers().find((e=>e.mid===i));if(!a)throw new Error("new RTCRtpTransceiver not found");this._mapMidTransceiver.set(i,a),t.push({localId:i,track:a.receiver.track,rtpReceiver:a.receiver})}return t}async stopReceiving(e){if(this.assertRecvDirection(),this._closed)return;for(const t of e){u.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()};u.debug("stopReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const s=await this._pc.createAnswer();u.debug("stopReceiving() | calling pc.setLocalDescription() [answer:%o]",s),await this._pc.setLocalDescription(s);for(const t of e)this._mapMidTransceiver.delete(t)}async pauseReceiving(e){this.assertNotClosed(),this.assertRecvDirection();for(const t of e){u.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()};u.debug("pauseReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const s=await this._pc.createAnswer();u.debug("pauseReceiving() | calling pc.setLocalDescription() [answer:%o]",s),await this._pc.setLocalDescription(s)}async resumeReceiving(e){this.assertNotClosed(),this.assertRecvDirection();for(const t of e){u.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()};u.debug("resumeReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const s=await this._pc.createAnswer();u.debug("resumeReceiving() | calling pc.setLocalDescription() [answer:%o]",s),await this._pc.setLocalDescription(s)}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:e,label:t,protocol:s}){this.assertNotClosed(),this.assertRecvDirection();const{streamId:i,ordered:a,maxPacketLifeTime:n,maxRetransmits:o}=e,c={negotiated:!0,id:i,ordered:a,maxPacketLifeTime:n,maxRetransmits:o,protocol:s};u.debug("receiveDataChannel() [options:%o]",c);const d=this._pc.createDataChannel(t,c);if(!this._hasDataChannelMediaSection){this._remoteSdp.receiveSctpAssociation();const e={type:"offer",sdp:this._remoteSdp.getSdp()};u.debug("receiveDataChannel() | calling pc.setRemoteDescription() [offer:%o]",e),await this._pc.setRemoteDescription(e);const t=await this._pc.createAnswer();if(!this._transportReady){const e=r.parse(t.sdp);await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:e})}u.debug("receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]",t),await this._pc.setLocalDescription(t),this._hasDataChannelMediaSection=!0}return{dataChannel:d}}async setupTransport({localDtlsRole:e,localSdpObject:t}){t||(t=r.parse(this._pc.localDescription.sdp));const s=o.extractDtlsParameters({sdpObject:t});s.role=e,this._remoteSdp.updateDtlsRole("client"===e?"server":"client"),await new Promise(((e,t)=>{this.safeEmit("@connect",{dtlsParameters:s},e,t)})),this._transportReady=!0}assertNotClosed(){if(this._closed)throw new p.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')}}t.ReactNativeUnifiedPlan=g},4160:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},4253:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.AwaitQueueRemovedTaskError=t.AwaitQueueStoppedError=void 0;class s extends Error{constructor(e){super(e??"queue stopped"),this.name="AwaitQueueStoppedError","function"==typeof Error.captureStackTrace&&Error.captureStackTrace(this,s)}}t.AwaitQueueStoppedError=s;class r extends Error{constructor(e){super(e??"queue task removed"),this.name="AwaitQueueRemovedTaskError","function"==typeof Error.captureStackTrace&&Error.captureStackTrace(this,r)}}t.AwaitQueueRemovedTaskError=r},4256:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.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"}))}},4299:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.updateV7State=void 0;const r=s(2291),i=s(6011),a={};function n(e,t,s){return e.msecs??=-1/0,e.seq??=0,t>e.msecs?(e.seq=s[6]<<23|s[7]<<16|s[8]<<8|s[9],e.msecs=t):(e.seq=e.seq+1|0,0===e.seq&&e.msecs++),e}function o(e,t,s,r,i=0){if(e.length<16)throw new Error("Random bytes length must be >= 16");if(r){if(i<0||i+16>r.length)throw new RangeError(`UUID byte range ${i}:${i+15} is out of buffer bounds`)}else r=new Uint8Array(16),i=0;return t??=Date.now(),s??=127*e[6]<<24|e[7]<<16|e[8]<<8|e[9],r[i++]=t/1099511627776&255,r[i++]=t/4294967296&255,r[i++]=t/16777216&255,r[i++]=t/65536&255,r[i++]=t/256&255,r[i++]=255&t,r[i++]=112|s>>>28&15,r[i++]=s>>>20&255,r[i++]=128|s>>>14&63,r[i++]=s>>>6&255,r[i++]=s<<2&255|3&e[10],r[i++]=e[11],r[i++]=e[12],r[i++]=e[13],r[i++]=e[14],r[i++]=e[15],r}t.updateV7State=n,t.default=function(e,t,s){let c;if(e)c=o(e.random??e.rng?.()??(0,r.default)(),e.msecs,e.seq,t,s);else{const e=Date.now(),i=(0,r.default)();n(a,e,i),c=o(i,a.msecs,a.seq,t,s)}return t??(0,i.unsafeStringify)(c)}},4496:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getRtpEncodings=function({offerMediaObject:e,track:t}){let s;const r=new Set;for(const i of e.ssrcs??[])if("msid"===i.attribute&&i.value.split(" ")[1]===t.id){const e=i.id;r.add(e),s||(s=e)}if(0===r.size)throw new Error(`a=ssrc line with msid information not found [track.id:${t.id}]`);const i=new Map;for(const t of e.ssrcGroups??[]){if("FID"!==t.semantics)continue;let[e,s]=t.ssrcs.split(/\s+/);e=Number(e),s=Number(s),r.has(e)&&(r.delete(e),r.delete(s),i.set(e,s))}for(const e of r)i.set(e,null);const a=[];for(const[e,t]of i){const s={ssrc:e};t&&(s.rtx={ssrc:t}),a.push(s)}return a},t.addLegacySimulcast=function({offerMediaObject:e,track:t,numStreams:s}){if(s<=1)throw new TypeError("numStreams must be greater than 1");let r,i,a;if(!(e.ssrcs??[]).find((e=>"msid"===e.attribute&&(e.value.split(" ")[1]===t.id&&(r=e.id,a=e.value.split(" ")[0],!0)))))throw new Error(`a=ssrc line with msid information not found [track.id:${t.id}]`);(e.ssrcGroups??[]).some((e=>{if("FID"!==e.semantics)return!1;const t=e.ssrcs.split(/\s+/);return Number(t[0])===r&&(i=Number(t[1]),!0)}));const n=e.ssrcs.find((e=>"cname"===e.attribute&&e.id===r));if(!n)throw new Error(`a=ssrc line with cname information not found [track.id:${t.id}]`);const o=n.value,c=[],d=[];for(let e=0;e{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.URL=t.DNS=void 0;const r=s(2829),i=s(2988);var a=s(2988);function n(e,t,s,a){return(0,i.default)(80,r.default,e,t,s,a)}Object.defineProperty(t,"DNS",{enumerable:!0,get:function(){return a.DNS}}),Object.defineProperty(t,"URL",{enumerable:!0,get:function(){return a.URL}}),n.DNS=i.DNS,n.URL=i.URL,t.default=n},4893:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.InvalidStateError=t.UnsupportedError=void 0;class s extends Error{constructor(e){super(e),this.name="UnsupportedError",Error.hasOwnProperty("captureStackTrace")?Error.captureStackTrace(this,s):this.stack=new Error(e).stack}}t.UnsupportedError=s;class r extends Error{constructor(e){super(e),this.name="InvalidStateError",Error.hasOwnProperty("captureStackTrace")?Error.captureStackTrace(this,r):this.stack=new Error(e).stack}}t.InvalidStateError=r},5020:(e,t,s)=>{var r=function(e){return String(Number(e))===e?Number(e):e},i=function(e,t,s){var i=e.name&&e.names;e.push&&!t[e.push]?t[e.push]=[]:i&&!t[e.name]&&(t[e.name]={});var a=e.push?{}:i?t[e.name]:t;!function(e,t,s,i){if(i&&!s)t[i]=r(e[1]);else for(var a=0;a1&&(e[s[0]]=void 0),e};t.parseParams=function(e){return e.split(/;\s?/).reduce(o,{})},t.parseFmtpConfig=t.parseParams,t.parsePayloads=function(e){return e.toString().split(" ").map(Number)},t.parseRemoteCandidates=function(e){for(var t=[],s=e.split(" ").map(r),i=0;i{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.generateRouterRtpCapabilities=function(){return r.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:"video",uri:"http://tools.ietf.org/html/draft-ietf-avtext-framemarking-07",preferredId:6,preferredEncrypt:!1,direction:"sendrecv"},{kind:"video",uri:"urn:ietf:params:rtp-hdrext:framemarking",preferredId:7,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"}]})},t.generateNativeRtpCapabilities=function(){return r.deepFreeze({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:"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}]})},t.generateNativeSctpCapabilities=function(){return r.deepFreeze({numStreams:{OS:2048,MIS:2048}})},t.generateLocalDtlsParameters=function(){return r.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"})},t.generateTransportRemoteParameters=function(){return{id:i(),iceParameters:r.deepFreeze({iceLite:!0,password:"yku5ej8nvfaor28lvtrabcx0wkrpkztz",usernameFragment:"h3hk1iz6qqlnqlne"}),iceCandidates:r.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:r.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:r.deepFreeze({port:5e3,OS:2048,MIS:2048,maxMessageSize:2e6})}},t.generateProducerRemoteParameters=function(){return r.deepFreeze({id:i()})},t.generateConsumerRemoteParameters=function({id:e,codecMimeType:t}={}){switch(t){case"audio/opus":return{id:e??i(),producerId:i(),kind:"audio",rtpParameters:r.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:e??i(),producerId:i(),kind:"audio",rtpParameters:r.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:e??i(),producerId:i(),kind:"video",rtpParameters:r.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:e??i(),producerId:i(),kind:"video",rtpParameters:r.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 '${t}'`)}},t.generateDataProducerRemoteParameters=function(){return r.deepFreeze({id:i()})},t.generateDataConsumerRemoteParameters=function({id:e}={}){return{id:e??i(),dataProducerId:i(),sctpStreamParameters:r.deepFreeze({streamId:666,maxPacketLifeTime:5e3,maxRetransmits:void 0})}};const r=s(1765);function i(){return String(r.generateRandomNumber())}},5328:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.FakeMediaStreamTrack=void 0;const r=s(182),i=s(5862),a=s(3785);class n extends i.FakeEventTarget{#e;#t;#s;#r;#i;#a;#n;#o;#c;#d;#p;#l=null;#h=null;#m=null;#u=null;#f=null;constructor({kind:e,id:t,label:s,contentHint:i,enabled:a,muted:n,readyState:o,capabilities:c,constraints:d,settings:p,data:l}){super(),this.#e=t??(0,r.v4)(),this.#t=e,this.#s=s??"",this.#n=i??"",this.#i=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.#s}get contentHint(){return this.#n}set contentHint(e){this.#n=e}get enabled(){return this.#i}set enabled(e){const t=this.#i!==e;this.#i=e,t&&this.dispatchEvent(new Event("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.#m}set onended(e){this.#m&&this.removeEventListener("ended",this.#m),this.#m=e,e&&this.addEventListener("ended",e)}get onenabledchange(){return this.#u}set onenabledchange(e){this.#u&&this.removeEventListener("enabledchange",this.#u),this.#u=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,s){super.addEventListener(e,t,s)}removeEventListener(e,t){super.removeEventListener(e,t)}stop(){"ended"!==this.#r&&(this.#r="ended",this.dispatchEvent(new Event("stopped")))}clone({id:e,data:t}={}){return new n({id:e??(0,r.v4)(),kind:this.#t,label:this.#s,contentHint:this.#n,enabled:this.#i,muted:this.#a,readyState:this.#r,capabilities:(0,a.clone)(this.#o),constraints:(0,a.clone)(this.#c),settings:(0,a.clone)(this.#d),data:t??(0,a.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 Event("stopped")),this.dispatchEvent(new Event("ended")))}remoteMute(){this.#a||(this.#a=!0,this.dispatchEvent(new Event("mute")))}remoteUnmute(){this.#a&&(this.#a=!1,this.dispatchEvent(new Event("unmute")))}}t.FakeMediaStreamTrack=n},5370:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},5535:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Chrome70=void 0;const r=s(7363),i=s(2994),a=s(1765),n=s(8046),o=s(5544),c=s(5938),d=s(521),p=s(1305),l=s(3303),h=new i.Logger("Chrome70"),m={OS:1024,MIS:1024};class u extends d.HandlerInterface{_direction;_remoteSdp;_sendingRtpParametersByKind;_sendingRemoteRtpParametersByKind;_forcedLocalDtlsRole;_pc;_mapMidTransceiver=new Map;_sendStream=new MediaStream;_hasDataChannelMediaSection=!1;_nextSendSctpStreamId=0;_transportReady=!1;static createFactory(){return()=>new u}constructor(){super()}get name(){return"Chrome70"}close(){if(h.debug("close()"),this._pc)try{this._pc.close()}catch(e){}this.emit("@close")}async getNativeRtpCapabilities(){h.debug("getNativeRtpCapabilities()");const e=new RTCPeerConnection({iceServers:[],iceTransportPolicy:"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require",sdpSemantics:"unified-plan"});try{e.addTransceiver("audio"),e.addTransceiver("video");const t=await e.createOffer();try{e.close()}catch(e){}const s=r.parse(t.sdp);return o.extractRtpCapabilities({sdpObject:s})}catch(t){try{e.close()}catch(e){}throw t}}async getNativeSctpCapabilities(){return h.debug("getNativeSctpCapabilities()"),{numStreams:m}}run({direction:e,iceParameters:t,iceCandidates:s,dtlsParameters:r,sctpParameters:i,iceServers:a,iceTransportPolicy:o,additionalSettings:c,proprietaryConstraints:d,extendedRtpCapabilities:l}){h.debug("run()"),this._direction=e,this._remoteSdp=new p.RemoteSdp({iceParameters:t,iceCandidates:s,dtlsParameters:r,sctpParameters:i}),this._sendingRtpParametersByKind={audio:n.getSendingRtpParameters("audio",l),video:n.getSendingRtpParameters("video",l)},this._sendingRemoteRtpParametersByKind={audio:n.getSendingRemoteRtpParameters("audio",l),video:n.getSendingRemoteRtpParameters("video",l)},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",sdpSemantics:"unified-plan",...c},d),this._pc.addEventListener("icegatheringstatechange",(()=>{this.emit("@icegatheringstatechange",this._pc.iceGatheringState)})),this._pc.addEventListener("icecandidateerror",(e=>{this.emit("@icecandidateerror",e)})),this._pc.connectionState?this._pc.addEventListener("connectionstatechange",(()=>{this.emit("@connectionstatechange",this._pc.connectionState)})):this._pc.addEventListener("iceconnectionstatechange",(()=>{switch(h.warn("run() | pc.connectionState not supported, using pc.iceConnectionState"),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")}}))}async updateIceServers(e){h.debug("updateIceServers()");const t=this._pc.getConfiguration();t.iceServers=e,this._pc.setConfiguration(t)}async restartIce(e){if(h.debug("restartIce()"),this._remoteSdp.updateIceParameters(e),this._transportReady)if("send"===this._direction){const e=await this._pc.createOffer({iceRestart:!0});h.debug("restartIce() | calling pc.setLocalDescription() [offer:%o]",e),await this._pc.setLocalDescription(e);const t={type:"answer",sdp:this._remoteSdp.getSdp()};h.debug("restartIce() | calling pc.setRemoteDescription() [answer:%o]",t),await this._pc.setRemoteDescription(t)}else{const e={type:"offer",sdp:this._remoteSdp.getSdp()};h.debug("restartIce() | calling pc.setRemoteDescription() [offer:%o]",e),await this._pc.setRemoteDescription(e);const t=await this._pc.createAnswer();h.debug("restartIce() | calling pc.setLocalDescription() [answer:%o]",t),await this._pc.setLocalDescription(t)}}async getTransportStats(){return this._pc.getStats()}async send({track:e,encodings:t,codecOptions:s,codec:i}){this.assertSendDirection(),h.debug("send() [kind:%s, track.id:%s]",e.kind,e.id);const d=a.clone(this._sendingRtpParametersByKind[e.kind]);d.codecs=n.reduceCodecs(d.codecs,i);const p=a.clone(this._sendingRemoteRtpParametersByKind[e.kind]);p.codecs=n.reduceCodecs(p.codecs,i);const m=this._remoteSdp.getNextMediaSectionIdx(),u=this._pc.addTransceiver(e,{direction:"sendonly",streams:[this._sendStream]});let f,g=await this._pc.createOffer(),_=r.parse(g.sdp);_.extmapAllowMixed&&this._remoteSdp.setSessionExtmapAllowMixed(),this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:_}),t&&t.length>1&&(h.debug("send() | enabling legacy simulcast"),_=r.parse(g.sdp),f=_.media[m.idx],c.addLegacySimulcast({offerMediaObject:f,numStreams:t.length}),g={type:"offer",sdp:r.write(_)});let w=!1;const b=(0,l.parse)((t??[{}])[0].scalabilityMode);if(t&&1===t.length&&b.spatialLayers>1&&"video/vp9"===d.codecs[0].mimeType.toLowerCase()&&(h.debug("send() | enabling legacy simulcast for VP9 SVC"),w=!0,_=r.parse(g.sdp),f=_.media[m.idx],c.addLegacySimulcast({offerMediaObject:f,numStreams:b.spatialLayers}),g={type:"offer",sdp:r.write(_)}),h.debug("send() | calling pc.setLocalDescription() [offer:%o]",g),await this._pc.setLocalDescription(g),t){h.debug("send() | applying given encodings");const e=u.sender.getParameters();for(let s=0;s<(e.encodings??[]).length;++s){const r=e.encodings[s],i=t[s];if(!i)break;e.encodings[s]=Object.assign(r,i)}await u.sender.setParameters(e)}const v=u.mid;if(d.mid=v,_=r.parse(this._pc.localDescription.sdp),f=_.media[m.idx],d.rtcp.cname=o.getCname({offerMediaObject:f}),d.encodings=c.getRtpEncodings({offerMediaObject:f}),t)for(let e=0;e1&&("video/vp8"===d.codecs[0].mimeType.toLowerCase()||"video/h264"===d.codecs[0].mimeType.toLowerCase()))for(const e of d.encodings)e.scalabilityMode="L1T3";this._remoteSdp.send({offerMediaObject:f,reuseMid:m.reuseMid,offerRtpParameters:d,answerRtpParameters:p,codecOptions:s});const y={type:"answer",sdp:this._remoteSdp.getSdp()};return h.debug("send() | calling pc.setRemoteDescription() [answer:%o]",y),await this._pc.setRemoteDescription(y),this._mapMidTransceiver.set(v,u),{localId:v,rtpParameters:d,rtpSender:u.sender}}async stopSending(e){this.assertSendDirection(),h.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 s=await this._pc.createOffer();h.debug("stopSending() | calling pc.setLocalDescription() [offer:%o]",s),await this._pc.setLocalDescription(s);const r={type:"answer",sdp:this._remoteSdp.getSdp()};h.debug("stopSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r),this._mapMidTransceiver.delete(e)}async pauseSending(e){}async resumeSending(e){}async replaceTrack(e,t){this.assertSendDirection(),t?h.debug("replaceTrack() [localId:%s, track.id:%s]",e,t.id):h.debug("replaceTrack() [localId:%s, no track]",e);const s=this._mapMidTransceiver.get(e);if(!s)throw new Error("associated RTCRtpTransceiver not found");await s.sender.replaceTrack(t)}async setMaxSpatialLayer(e,t){this.assertSendDirection(),h.debug("setMaxSpatialLayer() [localId:%s, spatialLayer:%s]",e,t);const s=this._mapMidTransceiver.get(e);if(!s)throw new Error("associated RTCRtpTransceiver not found");const r=s.sender.getParameters();r.encodings.forEach(((e,s)=>{e.active=s<=t})),await s.sender.setParameters(r),this._remoteSdp.muxMediaSectionSimulcast(e,r.encodings);const i=await this._pc.createOffer();h.debug("setMaxSpatialLayer() | calling pc.setLocalDescription() [offer:%o]",i),await this._pc.setLocalDescription(i);const a={type:"answer",sdp:this._remoteSdp.getSdp()};h.debug("setMaxSpatialLayer() | calling pc.setRemoteDescription() [answer:%o]",a),await this._pc.setRemoteDescription(a)}async setRtpEncodingParameters(e,t){this.assertSendDirection(),h.debug("setRtpEncodingParameters() [localId:%s, params:%o]",e,t);const s=this._mapMidTransceiver.get(e);if(!s)throw new Error("associated RTCRtpTransceiver not found");const r=s.sender.getParameters();r.encodings.forEach(((e,s)=>{r.encodings[s]={...e,...t}})),await s.sender.setParameters(r),this._remoteSdp.muxMediaSectionSimulcast(e,r.encodings);const i=await this._pc.createOffer();h.debug("setRtpEncodingParameters() | calling pc.setLocalDescription() [offer:%o]",i),await this._pc.setLocalDescription(i);const a={type:"answer",sdp:this._remoteSdp.getSdp()};h.debug("setRtpEncodingParameters() | calling pc.setRemoteDescription() [answer:%o]",a),await this._pc.setRemoteDescription(a)}async getSenderStats(e){this.assertSendDirection();const t=this._mapMidTransceiver.get(e);if(!t)throw new Error("associated RTCRtpTransceiver not found");return t.sender.getStats()}async sendDataChannel({ordered:e,maxPacketLifeTime:t,maxRetransmits:s,label:i,protocol:a}){this.assertSendDirection();const n={negotiated:!0,id:this._nextSendSctpStreamId,ordered:e,maxPacketLifeTime:t,maxRetransmitTime:t,maxRetransmits:s,protocol:a};h.debug("sendDataChannel() [options:%o]",n);const o=this._pc.createDataChannel(i,n);if(this._nextSendSctpStreamId=++this._nextSendSctpStreamId%m.MIS,!this._hasDataChannelMediaSection){const e=await this._pc.createOffer(),t=r.parse(e.sdp),s=t.media.find((e=>"application"===e.type));this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:t}),h.debug("sendDataChannel() | calling pc.setLocalDescription() [offer:%o]",e),await this._pc.setLocalDescription(e),this._remoteSdp.sendSctpAssociation({offerMediaObject:s});const i={type:"answer",sdp:this._remoteSdp.getSdp()};h.debug("sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]",i),await this._pc.setRemoteDescription(i),this._hasDataChannelMediaSection=!0}return{dataChannel:o,sctpStreamParameters:{streamId:n.id,ordered:n.ordered,maxPacketLifeTime:n.maxPacketLifeTime,maxRetransmits:n.maxRetransmits}}}async receive(e){this.assertRecvDirection();const t=[],s=new Map;for(const t of e){const{trackId:e,kind:r,rtpParameters:i,streamId:a}=t;h.debug("receive() [trackId:%s, kind:%s]",e,r);const n=i.mid??String(this._mapMidTransceiver.size);s.set(e,n),this._remoteSdp.receive({mid:n,kind:r,offerRtpParameters:i,streamId:a??i.rtcp.cname,trackId:e})}const i={type:"offer",sdp:this._remoteSdp.getSdp()};h.debug("receive() | calling pc.setRemoteDescription() [offer:%o]",i),await this._pc.setRemoteDescription(i);let a=await this._pc.createAnswer();const n=r.parse(a.sdp);for(const t of e){const{trackId:e,rtpParameters:r}=t,i=s.get(e),a=n.media.find((e=>String(e.mid)===i));o.applyCodecParameters({offerRtpParameters:r,answerMediaObject:a})}a={type:"answer",sdp:r.write(n)},this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:n}),h.debug("receive() | calling pc.setLocalDescription() [answer:%o]",a),await this._pc.setLocalDescription(a);for(const r of e){const{trackId:e}=r,i=s.get(e),a=this._pc.getTransceivers().find((e=>e.mid===i));if(!a)throw new Error("new RTCRtpTransceiver not found");this._mapMidTransceiver.set(i,a),t.push({localId:i,track:a.receiver.track,rtpReceiver:a.receiver})}return t}async stopReceiving(e){this.assertRecvDirection();for(const t of e){h.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()};h.debug("stopReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const s=await this._pc.createAnswer();h.debug("stopReceiving() | calling pc.setLocalDescription() [answer:%o]",s),await this._pc.setLocalDescription(s);for(const t of e)this._mapMidTransceiver.delete(t)}async pauseReceiving(e){}async resumeReceiving(e){}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:e,label:t,protocol:s}){this.assertRecvDirection();const{streamId:i,ordered:a,maxPacketLifeTime:n,maxRetransmits:o}=e,c={negotiated:!0,id:i,ordered:a,maxPacketLifeTime:n,maxRetransmitTime:n,maxRetransmits:o,protocol:s};h.debug("receiveDataChannel() [options:%o]",c);const d=this._pc.createDataChannel(t,c);if(!this._hasDataChannelMediaSection){this._remoteSdp.receiveSctpAssociation();const e={type:"offer",sdp:this._remoteSdp.getSdp()};h.debug("receiveDataChannel() | calling pc.setRemoteDescription() [offer:%o]",e),await this._pc.setRemoteDescription(e);const t=await this._pc.createAnswer();if(!this._transportReady){const e=r.parse(t.sdp);await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:e})}h.debug("receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]",t),await this._pc.setLocalDescription(t),this._hasDataChannelMediaSection=!0}return{dataChannel:d}}async setupTransport({localDtlsRole:e,localSdpObject:t}){t||(t=r.parse(this._pc.localDescription.sdp));const s=o.extractDtlsParameters({sdpObject:t});s.role=e,this._remoteSdp.updateDtlsRole("client"===e?"server":"client"),await new Promise(((e,t)=>{this.safeEmit("@connect",{dtlsParameters:s},e,t)})),this._transportReady=!0}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')}}t.Chrome70=u},5544:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.extractRtpCapabilities=function({sdpObject:e}){const t=new Map,s=[];let i=!1,a=!1;for(const n of e.media){const e=n.type;switch(e){case"audio":if(i)continue;i=!0;break;case"video":if(a)continue;a=!0;break;default:continue}for(const s of n.rtp){const r={kind:e,mimeType:`${e}/${s.codec}`,preferredPayloadType:s.payload,clockRate:s.rate,channels:s.encoding,parameters:{},rtcpFeedback:[]};t.set(r.preferredPayloadType,r)}for(const e of n.fmtp??[]){const s=r.parseParams(e.config),i=t.get(e.payload);i&&(s?.hasOwnProperty("profile-level-id")&&(s["profile-level-id"]=String(s["profile-level-id"])),i.parameters=s)}for(const s of n.rtcpFb??[]){const r={type:s.type,parameter:s.subtype};if(r.parameter||delete r.parameter,"*"!==s.payload){const e=t.get(s.payload);if(!e)continue;e.rtcpFeedback.push(r)}else for(const s of t.values())s.kind!==e||/.+\/rtx$/i.test(s.mimeType)||s.rtcpFeedback.push(r)}for(const t of n.ext??[]){if(t["encrypt-uri"])continue;const r={kind:e,uri:t.uri,preferredId:t.value};s.push(r)}}return{codecs:Array.from(t.values()),headerExtensions:s}},t.extractDtlsParameters=function({sdpObject:e}){let t,s=e.setup,r=e.fingerprint;if(!s||!r){const t=(e.media??[]).find((e=>0!==e.port));t&&(s??=t.setup,r??=t.fingerprint)}if(!s)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(s){case"active":t="client";break;case"passive":t="server";break;case"actpass":t="auto"}return{role:t,fingerprints:[{algorithm:r.type,value:r.hash}]}},t.getCname=function({offerMediaObject:e}){const t=(e.ssrcs??[]).find((e=>"cname"===e.attribute));return t?t.value:""},t.applyCodecParameters=function({offerRtpParameters:e,answerMediaObject:t}){for(const s of e.codecs){const e=s.mimeType.toLowerCase();if("audio/opus"!==e)continue;if(!(t.rtp??[]).find((e=>e.payload===s.payloadType)))continue;t.fmtp=t.fmtp??[];let i=t.fmtp.find((e=>e.payload===s.payloadType));i||(i={payload:s.payloadType,config:""},t.fmtp.push(i));const a=r.parseParams(i.config);switch(e){case"audio/opus":{const e=s.parameters["sprop-stereo"];void 0!==e&&(a.stereo=Number(e)?1:0);break}}i.config="";for(const e of Object.keys(a))i.config&&(i.config+=";"),i.config+=`${e}=${a[e]}`}};const r=s(7363)},5601:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Transport=void 0;const r=s(8876),i=s(2994),a=s(3953),n=s(4893),o=s(1765),c=s(8046),d=s(9792),p=s(3518),l=s(7504),h=s(9166),m=new i.Logger("Transport");class u{consumerOptions;promise;resolve;reject;constructor(e){this.consumerOptions=e,this.promise=new Promise(((e,t)=>{this.resolve=e,this.reject=t}))}}class f extends a.EnhancedEventEmitter{_id;_closed=!1;_direction;_extendedRtpCapabilities;_canProduceByKind;_maxSctpMessageSize;_handler;_iceGatheringState="new";_connectionState="new";_appData;_producers=new Map;_consumers=new Map;_dataProducers=new Map;_dataConsumers=new Map;_probatorConsumerCreated=!1;_awaitQueue=new r.AwaitQueue;_pendingConsumerTasks=[];_consumerCreationInProgress=!1;_pendingPauseConsumers=new Map;_consumerPauseInProgress=!1;_pendingResumeConsumers=new Map;_consumerResumeInProgress=!1;_pendingCloseConsumers=new Map;_consumerCloseInProgress=!1;_observer=new a.EnhancedEventEmitter;constructor({direction:e,id:t,iceParameters:s,iceCandidates:r,dtlsParameters:i,sctpParameters:a,iceServers:n,iceTransportPolicy:c,additionalSettings:d,proprietaryConstraints:p,appData:l,handlerFactory:h,extendedRtpCapabilities:u,canProduceByKind:f}){super(),m.debug("constructor() [id:%s, direction:%s]",t,e),this._id=t,this._direction=e,this._extendedRtpCapabilities=u,this._canProduceByKind=f,this._maxSctpMessageSize=a?a.maxMessageSize:null;const g=o.clone(d)??{};delete g.iceServers,delete g.iceTransportPolicy,delete g.bundlePolicy,delete g.rtcpMuxPolicy,delete g.sdpSemantics,this._handler=h(),this._handler.run({direction:e,iceParameters:s,iceCandidates:r,dtlsParameters:i,sctpParameters:a,iceServers:n,iceTransportPolicy:c,additionalSettings:g,proprietaryConstraints:p,extendedRtpCapabilities:u}),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){m.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")}}async getStats(){if(this._closed)throw new n.InvalidStateError("closed");return this._handler.getTransportStats()}async restartIce({iceParameters:e}){if(m.debug("restartIce()"),this._closed)throw new n.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(m.debug("updateIceServers()"),this._closed)throw new n.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,encodings:t,codecOptions:s,codec:r,stopTracks:i=!0,disableTrackOnPause:a=!0,zeroRtpOnPause:o=!1,onRtpSender:p,appData:l={}}={}){if(m.debug("produce() [track:%o]",e),this._closed)throw new n.InvalidStateError("closed");if(!e)throw new TypeError("missing track");if("send"!==this._direction)throw new n.UnsupportedError("not a sending Transport");if(!this._canProduceByKind[e.kind])throw new n.UnsupportedError(`cannot produce ${e.kind}`);if("ended"===e.readyState)throw new n.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(l&&"object"!=typeof l)throw new TypeError("if given, appData must be an object");return this._awaitQueue.push((async()=>{let n;if(t&&!Array.isArray(t))throw TypeError("encodings must be an array");t&&0===t.length?n=void 0:t&&(n=t.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:h,rtpParameters:m,rtpSender:u}=await this._handler.send({track:e,encodings:n,codecOptions:s,codec:r,onRtpSender:p});try{c.validateRtpParameters(m);const{id:t}=await new Promise(((t,s)=>{this.safeEmit("produce",{kind:e.kind,rtpParameters:m,appData:l},t,s)})),s=new d.Producer({id:t,localId:h,rtpSender:u,track:e,rtpParameters:m,stopTracks:i,disableTrackOnPause:a,zeroRtpOnPause:o,appData:l});return this._producers.set(s.id,s),this.handleProducer(s),this._observer.safeEmit("newproducer",s),s}catch(e){throw this._handler.stopSending(h).catch((()=>{})),e}}),"transport.produce()").catch((t=>{if(i)try{e.stop()}catch(e){}throw t}))}async consume({id:e,producerId:t,kind:s,rtpParameters:r,streamId:i,onRtpReceiver:a,appData:d={}}){if(m.debug("consume()"),this._closed)throw new n.InvalidStateError("closed");if("recv"!==this._direction)throw new n.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"!==s&&"video"!==s)throw new TypeError(`invalid kind '${s}'`);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 p=o.clone(r);if(!c.canReceive(p,this._extendedRtpCapabilities))throw new n.UnsupportedError("cannot consume this Producer");const l=new u({id:e,producerId:t,kind:s,rtpParameters:p,streamId:i,onRtpReceiver:a,appData:d});return this._pendingConsumerTasks.push(l),queueMicrotask((()=>{this._closed||!1===this._consumerCreationInProgress&&this.createPendingConsumers()})),l.promise}async produceData({ordered:e=!0,maxPacketLifeTime:t,maxRetransmits:s,label:r="",protocol:i="",appData:a={}}={}){if(m.debug("produceData()"),this._closed)throw new n.InvalidStateError("closed");if("send"!==this._direction)throw new n.UnsupportedError("not a sending Transport");if(!this._maxSctpMessageSize)throw new n.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(a&&"object"!=typeof a)throw new TypeError("if given, appData must be an object");return(t||s)&&(e=!1),this._awaitQueue.push((async()=>{const{dataChannel:n,sctpStreamParameters:o}=await this._handler.sendDataChannel({ordered:e,maxPacketLifeTime:t,maxRetransmits:s,label:r,protocol:i});c.validateSctpStreamParameters(o);const{id:d}=await new Promise(((e,t)=>{this.safeEmit("producedata",{sctpStreamParameters:o,label:r,protocol:i,appData:a},e,t)})),p=new l.DataProducer({id:d,dataChannel:n,sctpStreamParameters:o,appData:a});return this._dataProducers.set(p.id,p),this.handleDataProducer(p),this._observer.safeEmit("newdataproducer",p),p}),"transport.produceData()")}async consumeData({id:e,dataProducerId:t,sctpStreamParameters:s,label:r="",protocol:i="",appData:a={}}){if(m.debug("consumeData()"),this._closed)throw new n.InvalidStateError("closed");if("recv"!==this._direction)throw new n.UnsupportedError("not a receiving Transport");if(!this._maxSctpMessageSize)throw new n.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(a&&"object"!=typeof a)throw new TypeError("if given, appData must be an object");const d=o.clone(s);return c.validateSctpStreamParameters(d),this._awaitQueue.push((async()=>{const{dataChannel:s}=await this._handler.receiveDataChannel({sctpStreamParameters:d,label:r,protocol:i}),n=new h.DataConsumer({id:e,dataProducerId:t,dataChannel:s,sctpStreamParameters:d,appData:a});return this._dataConsumers.set(n.id,n),this.handleDataConsumer(n),this._observer.safeEmit("newdataconsumer",n),n}),"transport.consumeData()")}createPendingConsumers(){this._consumerCreationInProgress=!0,this._awaitQueue.push((async()=>{if(0===this._pendingConsumerTasks.length)return void m.debug("createPendingConsumers() | there is no Consumer to be created");const e=[...this._pendingConsumerTasks];let t;this._pendingConsumerTasks=[];const s=[];for(const t of e){const{id:e,kind:r,rtpParameters:i,streamId:a,onRtpReceiver:n}=t.consumerOptions;s.push({trackId:e,kind:r,rtpParameters:i,streamId:a,onRtpReceiver:n})}try{const r=await this._handler.receive(s);for(let s=0;s{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 m.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){m.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 m.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){m.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 m.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){m.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,s)=>{this._closed?s(new n.InvalidStateError("closed")):this.safeEmit("connect",{dtlsParameters:e},t,s)})),e.on("@icegatheringstatechange",(e=>{e!==this._iceGatheringState&&(m.debug("ICE gathering state changed to %s",e),this._iceGatheringState=e,this._closed||this.safeEmit("icegatheringstatechange",e))})),e.on("@icecandidateerror",(e=>{m.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&&(m.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=>m.warn("producer.close() failed:%o",e)))})),e.on("@pause",((t,s)=>{this._awaitQueue.push((async()=>await this._handler.pauseSending(e.localId)),"producer @pause event").then(t).catch(s)})),e.on("@resume",((t,s)=>{this._awaitQueue.push((async()=>await this._handler.resumeSending(e.localId)),"producer @resume event").then(t).catch(s)})),e.on("@replacetrack",((t,s,r)=>{this._awaitQueue.push((async()=>await this._handler.replaceTrack(e.localId,t)),"producer @replacetrack event").then(s).catch(r)})),e.on("@setmaxspatiallayer",((t,s,r)=>{this._awaitQueue.push((async()=>await this._handler.setMaxSpatialLayer(e.localId,t)),"producer @setmaxspatiallayer event").then(s).catch(r)})),e.on("@setrtpencodingparameters",((t,s,r)=>{this._awaitQueue.push((async()=>await this._handler.setRtpEncodingParameters(e.localId,t)),"producer @setrtpencodingparameters event").then(s).catch(r)})),e.on("@getstats",((t,s)=>{if(this._closed)return s(new n.InvalidStateError("closed"));this._handler.getSenderStats(e.localId).then(t).catch(s)}))}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,s)=>{if(this._closed)return s(new n.InvalidStateError("closed"));this._handler.getReceiverStats(e.localId).then(t).catch(s)}))}handleDataProducer(e){e.on("@close",(()=>{this._dataProducers.delete(e.id)}))}handleDataConsumer(e){e.on("@close",(()=>{this._dataConsumers.delete(e.id)}))}}t.Transport=f},5602:e=>{var t=e.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"},{name:"msid",reg:/^msid:(.*)/,format:"msid:%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")+(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":"")+(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"]}]};Object.keys(t).forEach((function(e){t[e].forEach((function(e){e.reg||(e.reg=/(.*)/),e.format||(e.format="%s")}))}))},5765:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Safari12=void 0;const r=s(7363),i=s(2994),a=s(1765),n=s(8046),o=s(5544),c=s(5938),d=s(4256),p=s(4893),l=s(521),h=s(1305),m=s(3303),u=new i.Logger("Safari12"),f={OS:1024,MIS:1024};class g extends l.HandlerInterface{_closed=!1;_direction;_remoteSdp;_sendingRtpParametersByKind;_sendingRemoteRtpParametersByKind;_forcedLocalDtlsRole;_pc;_mapMidTransceiver=new Map;_sendStream=new MediaStream;_hasDataChannelMediaSection=!1;_nextSendSctpStreamId=0;_transportReady=!1;static createFactory(){return()=>new g}constructor(){super()}get name(){return"Safari12"}close(){if(u.debug("close()"),!this._closed){if(this._closed=!0,this._pc)try{this._pc.close()}catch(e){}this.emit("@close")}}async getNativeRtpCapabilities(){u.debug("getNativeRtpCapabilities()");const e=new RTCPeerConnection({iceServers:[],iceTransportPolicy:"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require"});try{e.addTransceiver("audio"),e.addTransceiver("video");const t=await e.createOffer();try{e.close()}catch(e){}const s=r.parse(t.sdp),i=o.extractRtpCapabilities({sdpObject:s});return d.addNackSupportForOpus(i),i}catch(t){try{e.close()}catch(e){}throw t}}async getNativeSctpCapabilities(){return u.debug("getNativeSctpCapabilities()"),{numStreams:f}}run({direction:e,iceParameters:t,iceCandidates:s,dtlsParameters:r,sctpParameters:i,iceServers:a,iceTransportPolicy:o,additionalSettings:c,proprietaryConstraints:d,extendedRtpCapabilities:p}){this.assertNotClosed(),u.debug("run()"),this._direction=e,this._remoteSdp=new h.RemoteSdp({iceParameters:t,iceCandidates:s,dtlsParameters:r,sctpParameters:i}),this._sendingRtpParametersByKind={audio:n.getSendingRtpParameters("audio",p),video:n.getSendingRtpParameters("video",p)},this._sendingRemoteRtpParametersByKind={audio:n.getSendingRemoteRtpParameters("audio",p),video:n.getSendingRemoteRtpParameters("video",p)},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},d),this._pc.addEventListener("icegatheringstatechange",(()=>{this.emit("@icegatheringstatechange",this._pc.iceGatheringState)})),this._pc.addEventListener("icecandidateerror",(e=>{this.emit("@icecandidateerror",e)})),this._pc.connectionState?this._pc.addEventListener("connectionstatechange",(()=>{this.emit("@connectionstatechange",this._pc.connectionState)})):this._pc.addEventListener("iceconnectionstatechange",(()=>{switch(u.warn("run() | pc.connectionState not supported, using pc.iceConnectionState"),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")}}))}async updateIceServers(e){this.assertNotClosed(),u.debug("updateIceServers()");const t=this._pc.getConfiguration();t.iceServers=e,this._pc.setConfiguration(t)}async restartIce(e){if(this.assertNotClosed(),u.debug("restartIce()"),this._remoteSdp.updateIceParameters(e),this._transportReady)if("send"===this._direction){const e=await this._pc.createOffer({iceRestart:!0});u.debug("restartIce() | calling pc.setLocalDescription() [offer:%o]",e),await this._pc.setLocalDescription(e);const t={type:"answer",sdp:this._remoteSdp.getSdp()};u.debug("restartIce() | calling pc.setRemoteDescription() [answer:%o]",t),await this._pc.setRemoteDescription(t)}else{const e={type:"offer",sdp:this._remoteSdp.getSdp()};u.debug("restartIce() | calling pc.setRemoteDescription() [offer:%o]",e),await this._pc.setRemoteDescription(e);const t=await this._pc.createAnswer();u.debug("restartIce() | calling pc.setLocalDescription() [answer:%o]",t),await this._pc.setLocalDescription(t)}}async getTransportStats(){return this.assertNotClosed(),this._pc.getStats()}async send({track:e,encodings:t,codecOptions:s,codec:i,onRtpSender:d}){this.assertNotClosed(),this.assertSendDirection(),u.debug("send() [kind:%s, track.id:%s]",e.kind,e.id);const p=a.clone(this._sendingRtpParametersByKind[e.kind]);p.codecs=n.reduceCodecs(p.codecs,i);const l=a.clone(this._sendingRemoteRtpParametersByKind[e.kind]);l.codecs=n.reduceCodecs(l.codecs,i);const h=this._remoteSdp.getNextMediaSectionIdx(),f=this._pc.addTransceiver(e,{direction:"sendonly",streams:[this._sendStream]});d&&d(f.sender);let g,_=await this._pc.createOffer(),w=r.parse(_.sdp);w.extmapAllowMixed&&this._remoteSdp.setSessionExtmapAllowMixed(),this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:w});const b=(0,m.parse)((t??[{}])[0].scalabilityMode);t&&t.length>1&&(u.debug("send() | enabling legacy simulcast"),w=r.parse(_.sdp),g=w.media[h.idx],c.addLegacySimulcast({offerMediaObject:g,numStreams:t.length}),_={type:"offer",sdp:r.write(w)}),u.debug("send() | calling pc.setLocalDescription() [offer:%o]",_),await this._pc.setLocalDescription(_);const v=f.mid;if(p.mid=v,w=r.parse(this._pc.localDescription.sdp),g=w.media[h.idx],p.rtcp.cname=o.getCname({offerMediaObject:g}),p.encodings=c.getRtpEncodings({offerMediaObject:g}),t)for(let e=0;e1&&("video/vp8"===p.codecs[0].mimeType.toLowerCase()||"video/h264"===p.codecs[0].mimeType.toLowerCase()))for(const e of p.encodings)e.scalabilityMode?e.scalabilityMode=`L1T${b.temporalLayers}`:e.scalabilityMode="L1T3";this._remoteSdp.send({offerMediaObject:g,reuseMid:h.reuseMid,offerRtpParameters:p,answerRtpParameters:l,codecOptions:s});const y={type:"answer",sdp:this._remoteSdp.getSdp()};return u.debug("send() | calling pc.setRemoteDescription() [answer:%o]",y),await this._pc.setRemoteDescription(y),this._mapMidTransceiver.set(v,f),{localId:v,rtpParameters:p,rtpSender:f.sender}}async stopSending(e){if(this.assertSendDirection(),this._closed)return;u.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 s=await this._pc.createOffer();u.debug("stopSending() | calling pc.setLocalDescription() [offer:%o]",s),await this._pc.setLocalDescription(s);const r={type:"answer",sdp:this._remoteSdp.getSdp()};u.debug("stopSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r),this._mapMidTransceiver.delete(e)}async pauseSending(e){this.assertNotClosed(),this.assertSendDirection(),u.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 s=await this._pc.createOffer();u.debug("pauseSending() | calling pc.setLocalDescription() [offer:%o]",s),await this._pc.setLocalDescription(s);const r={type:"answer",sdp:this._remoteSdp.getSdp()};u.debug("pauseSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r)}async resumeSending(e){this.assertNotClosed(),this.assertSendDirection(),u.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 s=await this._pc.createOffer();u.debug("resumeSending() | calling pc.setLocalDescription() [offer:%o]",s),await this._pc.setLocalDescription(s);const r={type:"answer",sdp:this._remoteSdp.getSdp()};u.debug("resumeSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r)}async replaceTrack(e,t){this.assertNotClosed(),this.assertSendDirection(),t?u.debug("replaceTrack() [localId:%s, track.id:%s]",e,t.id):u.debug("replaceTrack() [localId:%s, no track]",e);const s=this._mapMidTransceiver.get(e);if(!s)throw new Error("associated RTCRtpTransceiver not found");await s.sender.replaceTrack(t)}async setMaxSpatialLayer(e,t){this.assertNotClosed(),this.assertSendDirection(),u.debug("setMaxSpatialLayer() [localId:%s, spatialLayer:%s]",e,t);const s=this._mapMidTransceiver.get(e);if(!s)throw new Error("associated RTCRtpTransceiver not found");const r=s.sender.getParameters();r.encodings.forEach(((e,s)=>{e.active=s<=t})),await s.sender.setParameters(r),this._remoteSdp.muxMediaSectionSimulcast(e,r.encodings);const i=await this._pc.createOffer();u.debug("setMaxSpatialLayer() | calling pc.setLocalDescription() [offer:%o]",i),await this._pc.setLocalDescription(i);const a={type:"answer",sdp:this._remoteSdp.getSdp()};u.debug("setMaxSpatialLayer() | calling pc.setRemoteDescription() [answer:%o]",a),await this._pc.setRemoteDescription(a)}async setRtpEncodingParameters(e,t){this.assertNotClosed(),this.assertSendDirection(),u.debug("setRtpEncodingParameters() [localId:%s, params:%o]",e,t);const s=this._mapMidTransceiver.get(e);if(!s)throw new Error("associated RTCRtpTransceiver not found");const r=s.sender.getParameters();r.encodings.forEach(((e,s)=>{r.encodings[s]={...e,...t}})),await s.sender.setParameters(r),this._remoteSdp.muxMediaSectionSimulcast(e,r.encodings);const i=await this._pc.createOffer();u.debug("setRtpEncodingParameters() | calling pc.setLocalDescription() [offer:%o]",i),await this._pc.setLocalDescription(i);const a={type:"answer",sdp:this._remoteSdp.getSdp()};u.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:e,maxPacketLifeTime:t,maxRetransmits:s,label:i,protocol:a}){this.assertNotClosed(),this.assertSendDirection();const n={negotiated:!0,id:this._nextSendSctpStreamId,ordered:e,maxPacketLifeTime:t,maxRetransmits:s,protocol:a};u.debug("sendDataChannel() [options:%o]",n);const o=this._pc.createDataChannel(i,n);if(this._nextSendSctpStreamId=++this._nextSendSctpStreamId%f.MIS,!this._hasDataChannelMediaSection){const e=await this._pc.createOffer(),t=r.parse(e.sdp),s=t.media.find((e=>"application"===e.type));this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:t}),u.debug("sendDataChannel() | calling pc.setLocalDescription() [offer:%o]",e),await this._pc.setLocalDescription(e),this._remoteSdp.sendSctpAssociation({offerMediaObject:s});const i={type:"answer",sdp:this._remoteSdp.getSdp()};u.debug("sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]",i),await this._pc.setRemoteDescription(i),this._hasDataChannelMediaSection=!0}return{dataChannel:o,sctpStreamParameters:{streamId:n.id,ordered:n.ordered,maxPacketLifeTime:n.maxPacketLifeTime,maxRetransmits:n.maxRetransmits}}}async receive(e){this.assertNotClosed(),this.assertRecvDirection();const t=[],s=new Map;for(const t of e){const{trackId:e,kind:r,rtpParameters:i,streamId:a}=t;u.debug("receive() [trackId:%s, kind:%s]",e,r);const n=i.mid??String(this._mapMidTransceiver.size);s.set(e,n),this._remoteSdp.receive({mid:n,kind:r,offerRtpParameters:i,streamId:a??i.rtcp.cname,trackId:e})}const i={type:"offer",sdp:this._remoteSdp.getSdp()};u.debug("receive() | calling pc.setRemoteDescription() [offer:%o]",i),await this._pc.setRemoteDescription(i);for(const t of e){const{trackId:e,onRtpReceiver:r}=t;if(r){const t=s.get(e),i=this._pc.getTransceivers().find((e=>e.mid===t));if(!i)throw new Error("transceiver not found");r(i.receiver)}}let a=await this._pc.createAnswer();const n=r.parse(a.sdp);for(const t of e){const{trackId:e,rtpParameters:r}=t,i=s.get(e),a=n.media.find((e=>String(e.mid)===i));o.applyCodecParameters({offerRtpParameters:r,answerMediaObject:a})}a={type:"answer",sdp:r.write(n)},this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:n}),u.debug("receive() | calling pc.setLocalDescription() [answer:%o]",a),await this._pc.setLocalDescription(a);for(const r of e){const{trackId:e}=r,i=s.get(e),a=this._pc.getTransceivers().find((e=>e.mid===i));if(!a)throw new Error("new RTCRtpTransceiver not found");this._mapMidTransceiver.set(i,a),t.push({localId:i,track:a.receiver.track,rtpReceiver:a.receiver})}return t}async stopReceiving(e){if(this.assertRecvDirection(),this._closed)return;for(const t of e){u.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()};u.debug("stopReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const s=await this._pc.createAnswer();u.debug("stopReceiving() | calling pc.setLocalDescription() [answer:%o]",s),await this._pc.setLocalDescription(s);for(const t of e)this._mapMidTransceiver.delete(t)}async pauseReceiving(e){this.assertNotClosed(),this.assertRecvDirection();for(const t of e){u.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()};u.debug("pauseReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const s=await this._pc.createAnswer();u.debug("pauseReceiving() | calling pc.setLocalDescription() [answer:%o]",s),await this._pc.setLocalDescription(s)}async resumeReceiving(e){this.assertNotClosed(),this.assertRecvDirection();for(const t of e){u.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()};u.debug("resumeReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const s=await this._pc.createAnswer();u.debug("resumeReceiving() | calling pc.setLocalDescription() [answer:%o]",s),await this._pc.setLocalDescription(s)}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:e,label:t,protocol:s}){this.assertNotClosed(),this.assertRecvDirection();const{streamId:i,ordered:a,maxPacketLifeTime:n,maxRetransmits:o}=e,c={negotiated:!0,id:i,ordered:a,maxPacketLifeTime:n,maxRetransmits:o,protocol:s};u.debug("receiveDataChannel() [options:%o]",c);const d=this._pc.createDataChannel(t,c);if(!this._hasDataChannelMediaSection){this._remoteSdp.receiveSctpAssociation();const e={type:"offer",sdp:this._remoteSdp.getSdp()};u.debug("receiveDataChannel() | calling pc.setRemoteDescription() [offer:%o]",e),await this._pc.setRemoteDescription(e);const t=await this._pc.createAnswer();if(!this._transportReady){const e=r.parse(t.sdp);await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:e})}u.debug("receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]",t),await this._pc.setLocalDescription(t),this._hasDataChannelMediaSection=!0}return{dataChannel:d}}async setupTransport({localDtlsRole:e,localSdpObject:t}){t||(t=r.parse(this._pc.localDescription.sdp));const s=o.extractDtlsParameters({sdpObject:t});s.role=e,this._remoteSdp.updateDtlsRole("client"===e?"server":"client"),await new Promise(((e,t)=>{this.safeEmit("@connect",{dtlsParameters:s},e,t)})),this._transportReady=!0}assertNotClosed(){if(this._closed)throw new p.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')}}t.Safari12=g},5862:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.FakeEventTarget=void 0,t.FakeEventTarget=class{listeners={};addEventListener(e,t,s={}){t&&(this.listeners[e]??=[],this.listeners[e].push({callback:t,once:!0===s.once}))}removeEventListener(e,t){this.listeners[e]&&(this.listeners[e]=this.listeners[e].filter((e=>e.callback!==t)))}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 s of[...t]){try{s.callback.call(this,e)}catch(e){setTimeout((()=>{throw e}),0)}s.once&&this.removeEventListener(e.type,s.callback)}return!e.defaultPrevented}}},5938:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getRtpEncodings=function({offerMediaObject:e}){const t=new Set;for(const s of e.ssrcs??[]){const e=s.id;t.add(e)}if(0===t.size)throw new Error("no a=ssrc lines found");const s=new Map;for(const r of e.ssrcGroups??[]){if("FID"!==r.semantics)continue;let[e,i]=r.ssrcs.split(/\s+/);e=Number(e),i=Number(i),t.has(e)&&(t.delete(e),t.delete(i),s.set(e,i))}for(const e of t)s.set(e,null);const r=[];for(const[e,t]of s){const s={ssrc:e};t&&(s.rtx={ssrc:t}),r.push(s)}return r},t.addLegacySimulcast=function({offerMediaObject:e,numStreams:t}){if(t<=1)throw new TypeError("numStreams must be greater than 1");const s=(e.ssrcs??[]).find((e=>"msid"===e.attribute));if(!s)throw new Error("a=ssrc line with msid information not found");const[r,i]=s.value.split(" "),a=Number(s.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{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Device=void 0,t.detectDeviceAsync=R,t.detectDevice=C;const r=s(2109),i=s(2994),a=s(3953),n=s(4893),o=s(1765),c=s(8046),d=s(5601),p=s(2183),l=s(11),h=s(5535),m=s(8155),u=s(7402),f=s(2292),g=s(1767),_=s(5765),w=s(9676),b=s(8633),v=s(4039),y=s(9352),S=new i.Logger("Device");async function R(e){return S.debug("detectDeviceAsync() [userAgent:%s]",e),e||"object"!=typeof navigator||(e=navigator.userAgent),D(await(0,r.UAParser)(e).withFeatureCheck())}function C(e){return S.debug("detectDevice() [userAgent:%s]",e),e||"object"!=typeof navigator||(e=navigator.userAgent),D((0,r.UAParser)(e))}class P{_handlerFactory;_handlerName;_loaded=!1;_extendedRtpCapabilities;_recvRtpCapabilities;_canProduceByKind;_sctpCapabilities;_observer=new a.EnhancedEventEmitter;static async factory({handlerName:e,handlerFactory:t}={}){if(S.debug("factory()"),e&&t)throw new TypeError("just one of handlerName or handlerInterface can be given");if(!e&&!t&&!(e=await R()))throw new n.UnsupportedError("device not supported");return new P({handlerName:e,handlerFactory:t})}constructor({handlerName:e,handlerFactory:t}={}){if(S.debug("constructor()"),e&&t)throw new TypeError("just one of handlerName or handlerInterface can be given");if(t)this._handlerFactory=t;else{if(e)S.debug("constructor() | handler given: %s",e);else{if(!(e=C()))throw new n.UnsupportedError("device not supported");S.debug("constructor() | detected handler: %s",e)}switch(e){case"Chrome111":this._handlerFactory=p.Chrome111.createFactory();break;case"Chrome74":this._handlerFactory=l.Chrome74.createFactory();break;case"Chrome70":this._handlerFactory=h.Chrome70.createFactory();break;case"Chrome67":this._handlerFactory=m.Chrome67.createFactory();break;case"Chrome55":this._handlerFactory=u.Chrome55.createFactory();break;case"Firefox120":this._handlerFactory=f.Firefox120.createFactory();break;case"Firefox60":this._handlerFactory=g.Firefox60.createFactory();break;case"Safari12":this._handlerFactory=_.Safari12.createFactory();break;case"Safari11":this._handlerFactory=w.Safari11.createFactory();break;case"Edge11":this._handlerFactory=b.Edge11.createFactory();break;case"ReactNativeUnifiedPlan":this._handlerFactory=v.ReactNativeUnifiedPlan.createFactory();break;case"ReactNative":this._handlerFactory=y.ReactNative.createFactory();break;default:throw new TypeError(`unknown handlerName "${e}"`)}}const s=this._handlerFactory();this._handlerName=s.name,s.close(),this._extendedRtpCapabilities=void 0,this._recvRtpCapabilities=void 0,this._canProduceByKind={audio:!1,video:!1},this._sctpCapabilities=void 0}get handlerName(){return this._handlerName}get loaded(){return this._loaded}get rtpCapabilities(){if(!this._loaded)throw new n.InvalidStateError("not loaded");return this._recvRtpCapabilities}get sctpCapabilities(){if(!this._loaded)throw new n.InvalidStateError("not loaded");return this._sctpCapabilities}get observer(){return this._observer}async load({routerRtpCapabilities:e,preferLocalCodecsOrder:t=!1}){let s;S.debug("load() [routerRtpCapabilities:%o]",e);try{if(this._loaded)throw new n.InvalidStateError("already loaded");const r=o.clone(e);c.validateRtpCapabilities(r),s=this._handlerFactory();const i=await s.getNativeRtpCapabilities();S.debug("load() | got native RTP capabilities:%o",i);const a=o.clone(i);c.validateRtpCapabilities(a),this._extendedRtpCapabilities=c.getExtendedRtpCapabilities(a,r,t),S.debug("load() | got extended RTP capabilities:%o",this._extendedRtpCapabilities),this._canProduceByKind.audio=c.canSend("audio",this._extendedRtpCapabilities),this._canProduceByKind.video=c.canSend("video",this._extendedRtpCapabilities),this._recvRtpCapabilities=c.getRecvRtpCapabilities(this._extendedRtpCapabilities),c.validateRtpCapabilities(this._recvRtpCapabilities),S.debug("load() | got receiving RTP capabilities:%o",this._recvRtpCapabilities),this._sctpCapabilities=await s.getNativeSctpCapabilities(),S.debug("load() | got native SCTP capabilities:%o",this._sctpCapabilities),c.validateSctpCapabilities(this._sctpCapabilities),S.debug("load() succeeded"),this._loaded=!0,s.close()}catch(e){throw s&&s.close(),e}}canProduce(e){if(!this._loaded)throw new n.InvalidStateError("not loaded");if("audio"!==e&&"video"!==e)throw new TypeError(`invalid kind "${e}"`);return this._canProduceByKind[e]}createSendTransport({id:e,iceParameters:t,iceCandidates:s,dtlsParameters:r,sctpParameters:i,iceServers:a,iceTransportPolicy:n,additionalSettings:o,proprietaryConstraints:c,appData:d}){return S.debug("createSendTransport()"),this.createTransport({direction:"send",id:e,iceParameters:t,iceCandidates:s,dtlsParameters:r,sctpParameters:i,iceServers:a,iceTransportPolicy:n,additionalSettings:o,proprietaryConstraints:c,appData:d})}createRecvTransport({id:e,iceParameters:t,iceCandidates:s,dtlsParameters:r,sctpParameters:i,iceServers:a,iceTransportPolicy:n,additionalSettings:o,proprietaryConstraints:c,appData:d}){return S.debug("createRecvTransport()"),this.createTransport({direction:"recv",id:e,iceParameters:t,iceCandidates:s,dtlsParameters:r,sctpParameters:i,iceServers:a,iceTransportPolicy:n,additionalSettings:o,proprietaryConstraints:c,appData:d})}createTransport({direction:e,id:t,iceParameters:s,iceCandidates:r,dtlsParameters:i,sctpParameters:a,iceServers:o,iceTransportPolicy:c,additionalSettings:p,proprietaryConstraints:l,appData:h}){if(!this._loaded)throw new n.InvalidStateError("not loaded");if("string"!=typeof t)throw new TypeError("missing id");if("object"!=typeof s)throw new TypeError("missing iceParameters");if(!Array.isArray(r))throw new TypeError("missing iceCandidates");if("object"!=typeof i)throw new TypeError("missing dtlsParameters");if(a&&"object"!=typeof a)throw new TypeError("wrong sctpParameters");if(h&&"object"!=typeof h)throw new TypeError("if given, appData must be an object");const m=new d.Transport({direction:e,id:t,iceParameters:s,iceCandidates:r,dtlsParameters:i,sctpParameters:a,iceServers:o,iceTransportPolicy:c,additionalSettings:p,proprietaryConstraints:l,appData:h,handlerFactory:this._handlerFactory,extendedRtpCapabilities:this._extendedRtpCapabilities,canProduceByKind:this._canProduceByKind});return this._observer.safeEmit("newtransport",m),m}}function D(e){if("object"==typeof navigator&&"ReactNative"===navigator.product)return S.debug("detectDeviceImpl() | React-Native detected"),"undefined"==typeof RTCPeerConnection?void S.warn("detectDeviceImpl() | unsupported react-native-webrtc without RTCPeerConnection, forgot to call registerGlobals()?"):"undefined"!=typeof RTCRtpTransceiver?(S.debug("detectDeviceImpl() | ReactNative UnifiedPlan handler chosen"),"ReactNativeUnifiedPlan"):(S.debug("detectDeviceImpl() | ReactNative PlanB handler chosen"),"ReactNative");{S.debug("detectDeviceImpl() | browser detected [userAgent:%s, parsed:%o]",e.ua,e);const t=e.browser,s=t.name?.toLowerCase(),r=parseInt(t.major??"0"),i=e.engine,a=i.name?.toLowerCase(),n=e.os,o=n.name?.toLowerCase(),c=parseFloat(n.version??"0"),d=e.device,p=d.model?.toLowerCase(),l="ios"===o||"ipad"===p,h=s&&["chrome","chromium","mobile chrome","chrome webview","chrome headless"].includes(s),m=s&&["firefox","mobile firefox","mobile focus"].includes(s),u=s&&["safari","mobile safari"].includes(s),f=s&&["edge"].includes(s);if((h||f)&&!l&&r>=111)return"Chrome111";if(h&&!l&&r>=74||f&&!l&&r>=88)return"Chrome74";if(h&&!l&&r>=70)return"Chrome70";if(h&&!l&&r>=67)return"Chrome67";if(h&&!l&&r>=55)return"Chrome55";if(m&&!l&&r>=120)return"Firefox120";if(m&&!l&&r>=60)return"Firefox60";if(m&&l&&c>=14.3)return"Safari12";if(u&&r>=12&&"undefined"!=typeof RTCRtpTransceiver&&RTCRtpTransceiver.prototype.hasOwnProperty("currentDirection"))return"Safari12";if(u&&r>=11)return"Safari11";if(f&&!l&&r>=11&&r<=18)return"Edge11";if("webkit"===a&&l&&"undefined"!=typeof RTCRtpTransceiver&&RTCRtpTransceiver.prototype.hasOwnProperty("currentDirection"))return"Safari12";if("blink"===a){const t=e.ua.match(/(?:(?:Chrome|Chromium))[ /](\w+)/i);if(t){const e=Number(t[1]);return e>=111?"Chrome111":e>=74?"Chrome74":e>=70?"Chrome70":e>=67?"Chrome67":"Chrome55"}return"Chrome111"}return void S.warn("detectDeviceImpl() | browser not supported [name:%s, version:%s]",s,r)}}t.Device=P},6011:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.unsafeStringify=void 0;const r=s(9746),i=[];for(let e=0;e<256;++e)i.push((e+256).toString(16).slice(1));function a(e,t=0){return(i[e[t+0]]+i[e[t+1]]+i[e[t+2]]+i[e[t+3]]+"-"+i[e[t+4]]+i[e[t+5]]+"-"+i[e[t+6]]+i[e[t+7]]+"-"+i[e[t+8]]+i[e[t+9]]+"-"+i[e[t+10]]+i[e[t+11]]+i[e[t+12]]+i[e[t+13]]+i[e[t+14]]+i[e[t+15]]).toLowerCase()}t.unsafeStringify=a,t.default=function(e,t=0){const s=a(e,t);if(!(0,r.default)(s))throw TypeError("Stringified UUID is invalid");return s}},6356:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=s(6011),i=s(1425),a=s(6568);t.default=function(e,t,s){e??={},s??=0;let n=(0,i.default)({...e,_v6:!0},new Uint8Array(16));if(n=(0,a.default)(n),t){for(let e=0;e<16;e++)t[s+e]=n[e];return t}return(0,r.unsafeStringify)(n)}},6568:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=s(1797),i=s(6011);t.default=function(e){const t=(s="string"==typeof e?(0,r.default)(e):e,Uint8Array.of((15&s[6])<<4|s[7]>>4&15,(15&s[7])<<4|(240&s[4])>>4,(15&s[4])<<4|(240&s[5])>>4,(15&s[5])<<4|(240&s[0])>>4,(15&s[0])<<4|(240&s[1])>>4,(15&s[1])<<4|(240&s[2])>>4,96|15&s[2],s[3],s[8],s[9],s[10],s[11],s[12],s[13],s[14],s[15]));var s;return"string"==typeof e?(0,i.unsafeStringify)(t):t}},6585:e=>{var t=1e3,s=60*t,r=60*s,i=24*r,a=7*i;function n(e,t,s,r){var i=t>=1.5*s;return Math.round(e/s)+" "+r+(i?"s":"")}e.exports=function(e,o){o=o||{};var c,d,p=typeof e;if("string"===p&&e.length>0)return function(e){if(!((e=String(e)).length>100)){var n=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(e);if(n){var o=parseFloat(n[1]);switch((n[2]||"ms").toLowerCase()){case"years":case"year":case"yrs":case"yr":case"y":return 315576e5*o;case"weeks":case"week":case"w":return o*a;case"days":case"day":case"d":return o*i;case"hours":case"hour":case"hrs":case"hr":case"h":return o*r;case"minutes":case"minute":case"mins":case"min":case"m":return o*s;case"seconds":case"second":case"secs":case"sec":case"s":return o*t;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return o;default:return}}}}(e);if("number"===p&&isFinite(e))return o.long?(c=e,(d=Math.abs(c))>=i?n(c,d,i,"day"):d>=r?n(c,d,r,"hour"):d>=s?n(c,d,s,"minute"):d>=t?n(c,d,t,"second"):c+" ms"):function(e){var a=Math.abs(e);return a>=i?Math.round(e/i)+"d":a>=r?Math.round(e/r)+"h":a>=s?Math.round(e/s)+"m":a>=t?Math.round(e/t)+"s":e+"ms"}(e);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(e))}},6697:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/i},7363:(e,t,s)=>{var r=s(5020),i=s(3804),a=s(5602);t.grammar=a,t.write=i,t.parse=r.parse,t.parseParams=r.parseParams,t.parseFmtpConfig=r.parseFmtpConfig,t.parsePayloads=r.parsePayloads,t.parseRemoteCandidates=r.parseRemoteCandidates,t.parseImageAttributes=r.parseImageAttributes,t.parseSimulcastStreamList=r.parseSimulcastStreamList},7402:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Chrome55=void 0;const r=s(7363),i=s(2994),a=s(4893),n=s(1765),o=s(8046),c=s(5544),d=s(4496),p=s(521),l=s(1305),h=new i.Logger("Chrome55"),m={OS:1024,MIS:1024};class u extends p.HandlerInterface{_direction;_remoteSdp;_sendingRtpParametersByKind;_sendingRemoteRtpParametersByKind;_forcedLocalDtlsRole;_pc;_sendStream=new MediaStream;_mapSendLocalIdTrack=new Map;_nextSendLocalId=0;_mapRecvLocalIdInfo=new Map;_hasDataChannelMediaSection=!1;_nextSendSctpStreamId=0;_transportReady=!1;static createFactory(){return()=>new u}constructor(){super()}get name(){return"Chrome55"}close(){if(h.debug("close()"),this._pc)try{this._pc.close()}catch(e){}this.emit("@close")}async getNativeRtpCapabilities(){h.debug("getNativeRtpCapabilities()");const e=new RTCPeerConnection({iceServers:[],iceTransportPolicy:"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require",sdpSemantics:"plan-b"});try{const t=await e.createOffer({offerToReceiveAudio:!0,offerToReceiveVideo:!0});try{e.close()}catch(e){}const s=r.parse(t.sdp);return c.extractRtpCapabilities({sdpObject:s})}catch(t){try{e.close()}catch(e){}throw t}}async getNativeSctpCapabilities(){return h.debug("getNativeSctpCapabilities()"),{numStreams:m}}run({direction:e,iceParameters:t,iceCandidates:s,dtlsParameters:r,sctpParameters:i,iceServers:a,iceTransportPolicy:n,additionalSettings:c,proprietaryConstraints:d,extendedRtpCapabilities:p}){h.debug("run()"),this._direction=e,this._remoteSdp=new l.RemoteSdp({iceParameters:t,iceCandidates:s,dtlsParameters:r,sctpParameters:i,planB:!0}),this._sendingRtpParametersByKind={audio:o.getSendingRtpParameters("audio",p),video:o.getSendingRtpParameters("video",p)},this._sendingRemoteRtpParametersByKind={audio:o.getSendingRemoteRtpParameters("audio",p),video:o.getSendingRemoteRtpParameters("video",p)},r.role&&"auto"!==r.role&&(this._forcedLocalDtlsRole="server"===r.role?"client":"server"),this._pc=new RTCPeerConnection({iceServers:a??[],iceTransportPolicy:n??"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require",sdpSemantics:"plan-b",...c},d),this._pc.addEventListener("icegatheringstatechange",(()=>{this.emit("@icegatheringstatechange",this._pc.iceGatheringState)})),this._pc.addEventListener("icecandidateerror",(e=>{this.emit("@icecandidateerror",e)})),this._pc.connectionState?this._pc.addEventListener("connectionstatechange",(()=>{this.emit("@connectionstatechange",this._pc.connectionState)})):this._pc.addEventListener("iceconnectionstatechange",(()=>{switch(h.warn("run() | pc.connectionState not supported, using pc.iceConnectionState"),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")}}))}async updateIceServers(e){h.debug("updateIceServers()");const t=this._pc.getConfiguration();t.iceServers=e,this._pc.setConfiguration(t)}async restartIce(e){if(h.debug("restartIce()"),this._remoteSdp.updateIceParameters(e),this._transportReady)if("send"===this._direction){const e=await this._pc.createOffer({iceRestart:!0});h.debug("restartIce() | calling pc.setLocalDescription() [offer:%o]",e),await this._pc.setLocalDescription(e);const t={type:"answer",sdp:this._remoteSdp.getSdp()};h.debug("restartIce() | calling pc.setRemoteDescription() [answer:%o]",t),await this._pc.setRemoteDescription(t)}else{const e={type:"offer",sdp:this._remoteSdp.getSdp()};h.debug("restartIce() | calling pc.setRemoteDescription() [offer:%o]",e),await this._pc.setRemoteDescription(e);const t=await this._pc.createAnswer();h.debug("restartIce() | calling pc.setLocalDescription() [answer:%o]",t),await this._pc.setLocalDescription(t)}}async getTransportStats(){return this._pc.getStats()}async send({track:e,encodings:t,codecOptions:s,codec:i}){this.assertSendDirection(),h.debug("send() [kind:%s, track.id:%s]",e.kind,e.id),i&&h.warn("send() | codec selection is not available in %s handler",this.name),this._sendStream.addTrack(e),this._pc.addStream(this._sendStream);let a,p=await this._pc.createOffer(),l=r.parse(p.sdp);l.extmapAllowMixed&&this._remoteSdp.setSessionExtmapAllowMixed();const m=n.clone(this._sendingRtpParametersByKind[e.kind]);m.codecs=o.reduceCodecs(m.codecs);const u=n.clone(this._sendingRemoteRtpParametersByKind[e.kind]);if(u.codecs=o.reduceCodecs(u.codecs),this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:l}),"video"===e.kind&&t&&t.length>1&&(h.debug("send() | enabling simulcast"),l=r.parse(p.sdp),a=l.media.find((e=>"video"===e.type)),d.addLegacySimulcast({offerMediaObject:a,track:e,numStreams:t.length}),p={type:"offer",sdp:r.write(l)}),h.debug("send() | calling pc.setLocalDescription() [offer:%o]",p),await this._pc.setLocalDescription(p),l=r.parse(this._pc.localDescription.sdp),a=l.media.find((t=>t.type===e.kind)),m.rtcp.cname=c.getCname({offerMediaObject:a}),m.encodings=d.getRtpEncodings({offerMediaObject:a,track:e}),t)for(let e=0;e1&&"video/vp8"===m.codecs[0].mimeType.toLowerCase())for(const e of m.encodings)e.scalabilityMode="L1T3";this._remoteSdp.send({offerMediaObject:a,offerRtpParameters:m,answerRtpParameters:u,codecOptions:s});const f={type:"answer",sdp:this._remoteSdp.getSdp()};h.debug("send() | calling pc.setRemoteDescription() [answer:%o]",f),await this._pc.setRemoteDescription(f);const g=String(this._nextSendLocalId);return this._nextSendLocalId++,this._mapSendLocalIdTrack.set(g,e),{localId:g,rtpParameters:m}}async stopSending(e){this.assertSendDirection(),h.debug("stopSending() [localId:%s]",e);const t=this._mapSendLocalIdTrack.get(e);if(!t)throw new Error("track not found");this._mapSendLocalIdTrack.delete(e),this._sendStream.removeTrack(t),this._pc.addStream(this._sendStream);const s=await this._pc.createOffer();h.debug("stopSending() | calling pc.setLocalDescription() [offer:%o]",s);try{await this._pc.setLocalDescription(s)}catch(e){if(0===this._sendStream.getTracks().length)return void h.warn("stopSending() | ignoring expected error due no sending tracks: %s",e.toString());throw e}if("stable"===this._pc.signalingState)return;const r={type:"answer",sdp:this._remoteSdp.getSdp()};h.debug("stopSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r)}async pauseSending(e){}async resumeSending(e){}async replaceTrack(e,t){throw new a.UnsupportedError("not implemented")}async setMaxSpatialLayer(e,t){throw new a.UnsupportedError(" not implemented")}async setRtpEncodingParameters(e,t){throw new a.UnsupportedError("not supported")}async getSenderStats(e){throw new a.UnsupportedError("not implemented")}async sendDataChannel({ordered:e,maxPacketLifeTime:t,maxRetransmits:s,label:i,protocol:a}){this.assertSendDirection();const n={negotiated:!0,id:this._nextSendSctpStreamId,ordered:e,maxPacketLifeTime:t,maxRetransmitTime:t,maxRetransmits:s,protocol:a};h.debug("sendDataChannel() [options:%o]",n);const o=this._pc.createDataChannel(i,n);if(this._nextSendSctpStreamId=++this._nextSendSctpStreamId%m.MIS,!this._hasDataChannelMediaSection){const e=await this._pc.createOffer(),t=r.parse(e.sdp),s=t.media.find((e=>"application"===e.type));this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:t}),h.debug("sendDataChannel() | calling pc.setLocalDescription() [offer:%o]",e),await this._pc.setLocalDescription(e),this._remoteSdp.sendSctpAssociation({offerMediaObject:s});const i={type:"answer",sdp:this._remoteSdp.getSdp()};h.debug("sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]",i),await this._pc.setRemoteDescription(i),this._hasDataChannelMediaSection=!0}return{dataChannel:o,sctpStreamParameters:{streamId:n.id,ordered:n.ordered,maxPacketLifeTime:n.maxPacketLifeTime,maxRetransmits:n.maxRetransmits}}}async receive(e){this.assertRecvDirection();const t=[];for(const t of e){const{trackId:e,kind:s,rtpParameters:r,streamId:i}=t;h.debug("receive() [trackId:%s, kind:%s]",e,s);const a=s;this._remoteSdp.receive({mid:a,kind:s,offerRtpParameters:r,streamId:i??r.rtcp.cname,trackId:e})}const s={type:"offer",sdp:this._remoteSdp.getSdp()};h.debug("receive() | calling pc.setRemoteDescription() [offer:%o]",s),await this._pc.setRemoteDescription(s);let i=await this._pc.createAnswer();const a=r.parse(i.sdp);for(const t of e){const{kind:e,rtpParameters:s}=t,r=e,i=a.media.find((e=>String(e.mid)===r));c.applyCodecParameters({offerRtpParameters:s,answerMediaObject:i})}i={type:"answer",sdp:r.write(a)},this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:a}),h.debug("receive() | calling pc.setLocalDescription() [answer:%o]",i),await this._pc.setLocalDescription(i);for(const s of e){const{kind:e,trackId:r,rtpParameters:i}=s,a=e,n=r,o=s.streamId??i.rtcp.cname,c=this._pc.getRemoteStreams().find((e=>e.id===o)).getTrackById(n);if(!c)throw new Error("remote track not found");this._mapRecvLocalIdInfo.set(n,{mid:a,rtpParameters:i}),t.push({localId:n,track:c})}return t}async stopReceiving(e){this.assertRecvDirection();for(const t of e){h.debug("stopReceiving() [localId:%s]",t);const{mid:e,rtpParameters:s}=this._mapRecvLocalIdInfo.get(t)??{};this._mapRecvLocalIdInfo.delete(t),this._remoteSdp.planBStopReceiving({mid:e,offerRtpParameters:s})}const t={type:"offer",sdp:this._remoteSdp.getSdp()};h.debug("stopReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const s=await this._pc.createAnswer();h.debug("stopReceiving() | calling pc.setLocalDescription() [answer:%o]",s),await this._pc.setLocalDescription(s)}async pauseReceiving(e){}async resumeReceiving(e){}async getReceiverStats(e){throw new a.UnsupportedError("not implemented")}async receiveDataChannel({sctpStreamParameters:e,label:t,protocol:s}){this.assertRecvDirection();const{streamId:i,ordered:a,maxPacketLifeTime:n,maxRetransmits:o}=e,c={negotiated:!0,id:i,ordered:a,maxPacketLifeTime:n,maxRetransmitTime:n,maxRetransmits:o,protocol:s};h.debug("receiveDataChannel() [options:%o]",c);const d=this._pc.createDataChannel(t,c);if(!this._hasDataChannelMediaSection){this._remoteSdp.receiveSctpAssociation({oldDataChannelSpec:!0});const e={type:"offer",sdp:this._remoteSdp.getSdp()};h.debug("receiveDataChannel() | calling pc.setRemoteDescription() [offer:%o]",e),await this._pc.setRemoteDescription(e);const t=await this._pc.createAnswer();if(!this._transportReady){const e=r.parse(t.sdp);await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:e})}h.debug("receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]",t),await this._pc.setLocalDescription(t),this._hasDataChannelMediaSection=!0}return{dataChannel:d}}async setupTransport({localDtlsRole:e,localSdpObject:t}){t||(t=r.parse(this._pc.localDescription.sdp));const s=c.extractDtlsParameters({sdpObject:t});s.role=e,this._remoteSdp.updateDtlsRole("client"===e?"server":"client"),await new Promise(((e,t)=>{this.safeEmit("@connect",{dtlsParameters:s},e,t)})),this._transportReady=!0}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')}}t.Chrome55=u},7504:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DataProducer=void 0;const r=s(2994),i=s(3953),a=s(4893),n=new r.Logger("DataProducer");class o extends i.EnhancedEventEmitter{_id;_dataChannel;_closed=!1;_sctpStreamParameters;_appData;_observer=new i.EnhancedEventEmitter;constructor({id:e,dataChannel:t,sctpStreamParameters:s,appData:r}){super(),n.debug("constructor()"),this._id=e,this._dataChannel=t,this._sctpStreamParameters=s,this._appData=r??{},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||(n.debug("close()"),this._closed=!0,this._dataChannel.close(),this.emit("@close"),this._observer.safeEmit("close"))}transportClosed(){this._closed||(n.debug("transportClosed()"),this._closed=!0,this._dataChannel.close(),this.safeEmit("transportclose"),this._observer.safeEmit("close"))}send(e){if(n.debug("send()"),this._closed)throw new a.InvalidStateError("closed");this._dataChannel.send(e)}handleDataChannel(){this._dataChannel.addEventListener("open",(()=>{this._closed||(n.debug('DataChannel "open" event'),this.safeEmit("open"))})),this._dataChannel.addEventListener("error",(e=>{if(this._closed)return;let{error:t}=e;t||(t=new Error("unknown DataChannel error")),"sctp-failure"===t.errorDetail?n.error("DataChannel SCTP error [sctpCauseCode:%s]: %s",t.sctpCauseCode,t.message):n.error('DataChannel "error" event: %o',t),this.safeEmit("error",t)})),this._dataChannel.addEventListener("close",(()=>{this._closed||(n.warn('DataChannel "close" event'),this._closed=!0,this.emit("@close"),this.safeEmit("close"),this._observer.safeEmit("close"))})),this._dataChannel.addEventListener("message",(()=>{this._closed||n.warn('DataChannel "message" event in a DataProducer, message discarded')})),this._dataChannel.addEventListener("bufferedamountlow",(()=>{this._closed||this.safeEmit("bufferedamountlow")}))}}t.DataProducer=o},7833:(e,t,s)=>{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 s="color: "+this.color;t.splice(1,0,s,"color: inherit");let r=0,i=0;t[0].replace(/%[a-zA-Z%]/g,(e=>{"%%"!==e&&(r++,"%c"===e&&(i=r))})),t.splice(i,0,s)},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){}return!e&&"undefined"!=typeof process&&"env"in process&&(e=process.env.DEBUG),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=s(736)(t);const{formatters:r}=e.exports;r.j=function(e){try{return JSON.stringify(e)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}}},8046:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.validateRtpCapabilities=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)d(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)l(t)},t.validateRtpParameters=c,t.validateSctpStreamParameters=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;if("boolean"==typeof e.ordered?t=!0:e.ordered=!0,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");if(t||!e.maxPacketLifeTime&&!e.maxRetransmits||(e.ordered=!1),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")},t.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)},t.getExtendedRtpCapabilities=function(e,t,s){const r={codecs:[],headerExtensions:[]};if(s)for(const s of e.codecs??[]){if(f(s))continue;const e=(t.codecs??[]).find((e=>g(e,s,{strict:!0,modify:!0})));if(!e)continue;const i={mimeType:s.mimeType,kind:s.kind,clockRate:s.clockRate,channels:s.channels,localPayloadType:s.preferredPayloadType,localRtxPayloadType:void 0,remotePayloadType:e.preferredPayloadType,remoteRtxPayloadType:void 0,localParameters:s.parameters,remoteParameters:e.parameters,rtcpFeedback:_(s,e)};r.codecs.push(i)}else for(const s of t.codecs??[]){if(f(s))continue;const t=(e.codecs??[]).find((e=>g(e,s,{strict:!0,modify:!0})));if(!t)continue;const i={mimeType:t.mimeType,kind:t.kind,clockRate:t.clockRate,channels:t.channels,localPayloadType:t.preferredPayloadType,localRtxPayloadType:void 0,remotePayloadType:s.preferredPayloadType,remoteRtxPayloadType:void 0,localParameters:t.parameters,remoteParameters:s.parameters,rtcpFeedback:_(t,s)};r.codecs.push(i)}for(const s of r.codecs){const r=e.codecs.find((e=>f(e)&&e.parameters.apt===s.localPayloadType)),i=t.codecs.find((e=>f(e)&&e.parameters.apt===s.remotePayloadType));r&&i&&(s.localRtxPayloadType=r.preferredPayloadType,s.remoteRtxPayloadType=i.preferredPayloadType)}for(const s of t.headerExtensions){const t=e.headerExtensions.find((e=>{return r=s,!((t=e).kind&&r.kind&&t.kind!==r.kind||t.uri!==r.uri);var t,r}));if(!t)continue;const i={kind:s.kind,uri:s.uri,sendId:t.preferredId,recvId:s.preferredId,encrypt:t.preferredEncrypt,direction:"sendrecv"};switch(s.direction){case"sendrecv":i.direction="sendrecv";break;case"recvonly":i.direction="sendonly";break;case"sendonly":i.direction="recvonly";break;case"inactive":i.direction="inactive"}r.headerExtensions.push(i)}return r},t.getRecvRtpCapabilities=function(e){const t={codecs:[],headerExtensions:[]};for(const s of e.codecs){const e={mimeType:s.mimeType,kind:s.kind,preferredPayloadType:s.remotePayloadType,clockRate:s.clockRate,channels:s.channels,parameters:s.localParameters,rtcpFeedback:s.rtcpFeedback};if(t.codecs.push(e),!s.remoteRtxPayloadType)continue;const r={mimeType:`${s.kind}/rtx`,kind:s.kind,preferredPayloadType:s.remoteRtxPayloadType,clockRate:s.clockRate,parameters:{apt:s.remotePayloadType},rtcpFeedback:[]};t.codecs.push(r)}for(const s of e.headerExtensions){if("sendrecv"!==s.direction&&"recvonly"!==s.direction)continue;const e={kind:s.kind,uri:s.uri,preferredId:s.recvId,preferredEncrypt:s.encrypt,direction:s.direction};t.headerExtensions.push(e)}return t},t.getSendingRtpParameters=function(e,t){const s={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(s.codecs.push(t),r.localRtxPayloadType){const e={mimeType:`${r.kind}/rtx`,payloadType:r.localRtxPayloadType,clockRate:r.clockRate,parameters:{apt:r.localPayloadType},rtcpFeedback:[]};s.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:{}};s.headerExtensions.push(t)}return s},t.getSendingRemoteRtpParameters=function(e,t){const s={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(s.codecs.push(t),r.localRtxPayloadType){const e={mimeType:`${r.kind}/rtx`,payloadType:r.localRtxPayloadType,clockRate:r.clockRate,parameters:{apt:r.localPayloadType},rtcpFeedback:[]};s.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:{}};s.headerExtensions.push(t)}if(s.headerExtensions.some((e=>"http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01"===e.uri)))for(const e of s.codecs)e.rtcpFeedback=(e.rtcpFeedback??[]).filter((e=>"goog-remb"!==e.type));else if(s.headerExtensions.some((e=>"http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time"===e.uri)))for(const e of s.codecs)e.rtcpFeedback=(e.rtcpFeedback??[]).filter((e=>"transport-cc"!==e.type));else for(const e of s.codecs)e.rtcpFeedback=(e.rtcpFeedback??[]).filter((e=>"transport-cc"!==e.type&&"goog-remb"!==e.type));return s},t.reduceCodecs=function(e,t){const s=[];if(t){for(let r=0;rt.kind===e))},t.canReceive=function(e,t){if(c(e),0===e.codecs.length)return!1;const s=e.codecs[0];return t.codecs.some((e=>e.remotePayloadType===s.payloadType))};const r=s(3200),i=s(1765),a="probator",n=1234,o=127;function c(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)h(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)m(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)u(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 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 s=t.exec(e.mimeType);if(!s)throw new TypeError("invalid codec.mimeType");if(e.kind=s[1].toLowerCase(),e.preferredPayloadType&&"number"!=typeof e.preferredPayloadType)throw new TypeError("invalid 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 s=e.parameters[t];if(void 0===s&&(e.parameters[t]="",s=""),"string"!=typeof s&&"number"!=typeof s)throw new TypeError(`invalid codec parameter [key:${t}s, value:${s}]`);if("apt"===t&&"number"!=typeof s)throw new TypeError("invalid codec apt parameter")}e.rtcpFeedback&&Array.isArray(e.rtcpFeedback)||(e.rtcpFeedback=[]);for(const t of e.rtcpFeedback)p(t)}function p(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 l(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 h(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 s=t.exec(e.mimeType);if(!s)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"===s[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 s=e.parameters[t];if(void 0===s&&(e.parameters[t]="",s=""),"string"!=typeof s&&"number"!=typeof s)throw new TypeError(`invalid codec parameter [key:${t}s, value:${s}]`);if("apt"===t&&"number"!=typeof s)throw new TypeError("invalid codec apt parameter")}e.rtcpFeedback&&Array.isArray(e.rtcpFeedback)||(e.rtcpFeedback=[]);for(const t of e.rtcpFeedback)p(t)}function m(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 s=e.parameters[t];if(void 0===s&&(e.parameters[t]="",s=""),"string"!=typeof s&&"number"!=typeof s)throw new TypeError("invalid header extension parameter")}}function u(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 f(e){return!!e&&/.+\/rtx$/i.test(e.mimeType)}function g(e,t,{strict:s=!1,modify:i=!1}={}){const a=e.mimeType.toLowerCase();if(a!==t.mimeType.toLowerCase())return!1;if(e.clockRate!==t.clockRate)return!1;if(e.channels!==t.channels)return!1;switch(a){case"video/h264":if(s){if((e.parameters["packetization-mode"]??0)!==(t.parameters["packetization-mode"]??0))return!1;if(!r.isSameProfile(e.parameters,t.parameters))return!1;let s;try{s=r.generateProfileLevelIdStringForAnswer(e.parameters,t.parameters)}catch(e){return!1}i&&(s?(e.parameters["profile-level-id"]=s,t.parameters["profile-level-id"]=s):(delete e.parameters["profile-level-id"],delete t.parameters["profile-level-id"]))}break;case"video/vp9":if(s&&(e.parameters["profile-id"]??0)!==(t.parameters["profile-id"]??0))return!1}return!0}function _(e,t){const s=[];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&&s.push(e)}return s}},8057:function(e,t,s){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,s,r){void 0===r&&(r=s);var i=Object.getOwnPropertyDescriptor(t,s);i&&!("get"in i?!t.__esModule:i.writable||i.configurable)||(i={enumerable:!0,get:function(){return t[s]}}),Object.defineProperty(e,r,i)}:function(e,t,s,r){void 0===r&&(r=s),e[r]=t[s]}),i=this&&this.__exportStar||function(e,t){for(var s in e)"default"===s||Object.prototype.hasOwnProperty.call(t,s)||r(t,e,s)};Object.defineProperty(t,"__esModule",{value:!0}),i(s(6004),t),i(s(5601),t),i(s(9792),t),i(s(3518),t),i(s(7504),t),i(s(9166),t),i(s(5370),t),i(s(4160),t),i(s(521),t),i(s(4893),t)},8155:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Chrome67=void 0;const r=s(7363),i=s(2994),a=s(1765),n=s(8046),o=s(5544),c=s(4496),d=s(521),p=s(1305),l=new i.Logger("Chrome67"),h={OS:1024,MIS:1024};class m extends d.HandlerInterface{_direction;_remoteSdp;_sendingRtpParametersByKind;_sendingRemoteRtpParametersByKind;_forcedLocalDtlsRole;_pc;_sendStream=new MediaStream;_mapSendLocalIdRtpSender=new Map;_nextSendLocalId=0;_mapRecvLocalIdInfo=new Map;_hasDataChannelMediaSection=!1;_nextSendSctpStreamId=0;_transportReady=!1;static createFactory(){return()=>new m}constructor(){super()}get name(){return"Chrome67"}close(){if(l.debug("close()"),this._pc)try{this._pc.close()}catch(e){}this.emit("@close")}async getNativeRtpCapabilities(){l.debug("getNativeRtpCapabilities()");const e=new RTCPeerConnection({iceServers:[],iceTransportPolicy:"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require",sdpSemantics:"plan-b"});try{const t=await e.createOffer({offerToReceiveAudio:!0,offerToReceiveVideo:!0});try{e.close()}catch(e){}const s=r.parse(t.sdp);return o.extractRtpCapabilities({sdpObject:s})}catch(t){try{e.close()}catch(e){}throw t}}async getNativeSctpCapabilities(){return l.debug("getNativeSctpCapabilities()"),{numStreams:h}}run({direction:e,iceParameters:t,iceCandidates:s,dtlsParameters:r,sctpParameters:i,iceServers:a,iceTransportPolicy:o,additionalSettings:c,proprietaryConstraints:d,extendedRtpCapabilities:h}){l.debug("run()"),this._direction=e,this._remoteSdp=new p.RemoteSdp({iceParameters:t,iceCandidates:s,dtlsParameters:r,sctpParameters:i,planB:!0}),this._sendingRtpParametersByKind={audio:n.getSendingRtpParameters("audio",h),video:n.getSendingRtpParameters("video",h)},this._sendingRemoteRtpParametersByKind={audio:n.getSendingRemoteRtpParameters("audio",h),video:n.getSendingRemoteRtpParameters("video",h)},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",sdpSemantics:"plan-b",...c},d),this._pc.addEventListener("icegatheringstatechange",(()=>{this.emit("@icegatheringstatechange",this._pc.iceGatheringState)})),this._pc.addEventListener("icecandidateerror",(e=>{this.emit("@icecandidateerror",e)})),this._pc.connectionState?this._pc.addEventListener("connectionstatechange",(()=>{this.emit("@connectionstatechange",this._pc.connectionState)})):this._pc.addEventListener("iceconnectionstatechange",(()=>{switch(l.warn("run() | pc.connectionState not supported, using pc.iceConnectionState"),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")}}))}async updateIceServers(e){l.debug("updateIceServers()");const t=this._pc.getConfiguration();t.iceServers=e,this._pc.setConfiguration(t)}async restartIce(e){if(l.debug("restartIce()"),this._remoteSdp.updateIceParameters(e),this._transportReady)if("send"===this._direction){const e=await this._pc.createOffer({iceRestart:!0});l.debug("restartIce() | calling pc.setLocalDescription() [offer:%o]",e),await this._pc.setLocalDescription(e);const t={type:"answer",sdp:this._remoteSdp.getSdp()};l.debug("restartIce() | calling pc.setRemoteDescription() [answer:%o]",t),await this._pc.setRemoteDescription(t)}else{const e={type:"offer",sdp:this._remoteSdp.getSdp()};l.debug("restartIce() | calling pc.setRemoteDescription() [offer:%o]",e),await this._pc.setRemoteDescription(e);const t=await this._pc.createAnswer();l.debug("restartIce() | calling pc.setLocalDescription() [answer:%o]",t),await this._pc.setLocalDescription(t)}}async getTransportStats(){return this._pc.getStats()}async send({track:e,encodings:t,codecOptions:s,codec:i}){this.assertSendDirection(),l.debug("send() [kind:%s, track.id:%s]",e.kind,e.id),i&&l.warn("send() | codec selection is not available in %s handler",this.name),this._sendStream.addTrack(e),this._pc.addTrack(e,this._sendStream);let d,p=await this._pc.createOffer(),h=r.parse(p.sdp);h.extmapAllowMixed&&this._remoteSdp.setSessionExtmapAllowMixed();const m=a.clone(this._sendingRtpParametersByKind[e.kind]);m.codecs=n.reduceCodecs(m.codecs);const u=a.clone(this._sendingRemoteRtpParametersByKind[e.kind]);if(u.codecs=n.reduceCodecs(u.codecs),this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:h}),"video"===e.kind&&t&&t.length>1&&(l.debug("send() | enabling simulcast"),h=r.parse(p.sdp),d=h.media.find((e=>"video"===e.type)),c.addLegacySimulcast({offerMediaObject:d,track:e,numStreams:t.length}),p={type:"offer",sdp:r.write(h)}),l.debug("send() | calling pc.setLocalDescription() [offer:%o]",p),await this._pc.setLocalDescription(p),h=r.parse(this._pc.localDescription.sdp),d=h.media.find((t=>t.type===e.kind)),m.rtcp.cname=o.getCname({offerMediaObject:d}),m.encodings=c.getRtpEncodings({offerMediaObject:d,track:e}),t)for(let e=0;e1&&"video/vp8"===m.codecs[0].mimeType.toLowerCase())for(const e of m.encodings)e.scalabilityMode="L1T3";this._remoteSdp.send({offerMediaObject:d,offerRtpParameters:m,answerRtpParameters:u,codecOptions:s});const f={type:"answer",sdp:this._remoteSdp.getSdp()};l.debug("send() | calling pc.setRemoteDescription() [answer:%o]",f),await this._pc.setRemoteDescription(f);const g=String(this._nextSendLocalId);this._nextSendLocalId++;const _=this._pc.getSenders().find((t=>t.track===e));return this._mapSendLocalIdRtpSender.set(g,_),{localId:g,rtpParameters:m,rtpSender:_}}async stopSending(e){this.assertSendDirection(),l.debug("stopSending() [localId:%s]",e);const t=this._mapSendLocalIdRtpSender.get(e);if(!t)throw new Error("associated RTCRtpSender not found");this._pc.removeTrack(t),t.track&&this._sendStream.removeTrack(t.track),this._mapSendLocalIdRtpSender.delete(e);const s=await this._pc.createOffer();l.debug("stopSending() | calling pc.setLocalDescription() [offer:%o]",s);try{await this._pc.setLocalDescription(s)}catch(e){if(0===this._sendStream.getTracks().length)return void l.warn("stopSending() | ignoring expected error due no sending tracks: %s",e.toString());throw e}if("stable"===this._pc.signalingState)return;const r={type:"answer",sdp:this._remoteSdp.getSdp()};l.debug("stopSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r)}async pauseSending(e){}async resumeSending(e){}async replaceTrack(e,t){this.assertSendDirection(),t?l.debug("replaceTrack() [localId:%s, track.id:%s]",e,t.id):l.debug("replaceTrack() [localId:%s, no track]",e);const s=this._mapSendLocalIdRtpSender.get(e);if(!s)throw new Error("associated RTCRtpSender not found");const r=s.track;await s.replaceTrack(t),r&&this._sendStream.removeTrack(r),t&&this._sendStream.addTrack(t)}async setMaxSpatialLayer(e,t){this.assertSendDirection(),l.debug("setMaxSpatialLayer() [localId:%s, spatialLayer:%s]",e,t);const s=this._mapSendLocalIdRtpSender.get(e);if(!s)throw new Error("associated RTCRtpSender not found");const r=s.getParameters();r.encodings.forEach(((e,s)=>{e.active=s<=t})),await s.setParameters(r)}async setRtpEncodingParameters(e,t){this.assertSendDirection(),l.debug("setRtpEncodingParameters() [localId:%s, params:%o]",e,t);const s=this._mapSendLocalIdRtpSender.get(e);if(!s)throw new Error("associated RTCRtpSender not found");const r=s.getParameters();r.encodings.forEach(((e,s)=>{r.encodings[s]={...e,...t}})),await s.setParameters(r)}async getSenderStats(e){this.assertSendDirection();const t=this._mapSendLocalIdRtpSender.get(e);if(!t)throw new Error("associated RTCRtpSender not found");return t.getStats()}async sendDataChannel({ordered:e,maxPacketLifeTime:t,maxRetransmits:s,label:i,protocol:a}){this.assertSendDirection();const n={negotiated:!0,id:this._nextSendSctpStreamId,ordered:e,maxPacketLifeTime:t,maxRetransmitTime:t,maxRetransmits:s,protocol:a};l.debug("sendDataChannel() [options:%o]",n);const o=this._pc.createDataChannel(i,n);if(this._nextSendSctpStreamId=++this._nextSendSctpStreamId%h.MIS,!this._hasDataChannelMediaSection){const e=await this._pc.createOffer(),t=r.parse(e.sdp),s=t.media.find((e=>"application"===e.type));this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:t}),l.debug("sendDataChannel() | calling pc.setLocalDescription() [offer:%o]",e),await this._pc.setLocalDescription(e),this._remoteSdp.sendSctpAssociation({offerMediaObject:s});const i={type:"answer",sdp:this._remoteSdp.getSdp()};l.debug("sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]",i),await this._pc.setRemoteDescription(i),this._hasDataChannelMediaSection=!0}return{dataChannel:o,sctpStreamParameters:{streamId:n.id,ordered:n.ordered,maxPacketLifeTime:n.maxPacketLifeTime,maxRetransmits:n.maxRetransmits}}}async receive(e){this.assertRecvDirection();const t=[];for(const t of e){const{trackId:e,kind:s,rtpParameters:r,streamId:i}=t;l.debug("receive() [trackId:%s, kind:%s]",e,s);const a=s;this._remoteSdp.receive({mid:a,kind:s,offerRtpParameters:r,streamId:i??r.rtcp.cname,trackId:e})}const s={type:"offer",sdp:this._remoteSdp.getSdp()};l.debug("receive() | calling pc.setRemoteDescription() [offer:%o]",s),await this._pc.setRemoteDescription(s);let i=await this._pc.createAnswer();const a=r.parse(i.sdp);for(const t of e){const{kind:e,rtpParameters:s}=t,r=e,i=a.media.find((e=>String(e.mid)===r));o.applyCodecParameters({offerRtpParameters:s,answerMediaObject:i})}i={type:"answer",sdp:r.write(a)},this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:a}),l.debug("receive() | calling pc.setLocalDescription() [answer:%o]",i),await this._pc.setLocalDescription(i);for(const s of e){const{kind:e,trackId:r,rtpParameters:i}=s,a=r,n=e,o=this._pc.getReceivers().find((e=>e.track&&e.track.id===a));if(!o)throw new Error("new RTCRtpReceiver not");this._mapRecvLocalIdInfo.set(a,{mid:n,rtpParameters:i,rtpReceiver:o}),t.push({localId:a,track:o.track,rtpReceiver:o})}return t}async stopReceiving(e){this.assertRecvDirection();for(const t of e){l.debug("stopReceiving() [localId:%s]",t);const{mid:e,rtpParameters:s}=this._mapRecvLocalIdInfo.get(t)??{};this._mapRecvLocalIdInfo.delete(t),this._remoteSdp.planBStopReceiving({mid:e,offerRtpParameters:s})}const t={type:"offer",sdp:this._remoteSdp.getSdp()};l.debug("stopReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const s=await this._pc.createAnswer();l.debug("stopReceiving() | calling pc.setLocalDescription() [answer:%o]",s),await this._pc.setLocalDescription(s)}async pauseReceiving(e){}async resumeReceiving(e){}async getReceiverStats(e){this.assertRecvDirection();const{rtpReceiver:t}=this._mapRecvLocalIdInfo.get(e)??{};if(!t)throw new Error("associated RTCRtpReceiver not found");return t.getStats()}async receiveDataChannel({sctpStreamParameters:e,label:t,protocol:s}){this.assertRecvDirection();const{streamId:i,ordered:a,maxPacketLifeTime:n,maxRetransmits:o}=e,c={negotiated:!0,id:i,ordered:a,maxPacketLifeTime:n,maxRetransmitTime:n,maxRetransmits:o,protocol:s};l.debug("receiveDataChannel() [options:%o]",c);const d=this._pc.createDataChannel(t,c);if(!this._hasDataChannelMediaSection){this._remoteSdp.receiveSctpAssociation({oldDataChannelSpec:!0});const e={type:"offer",sdp:this._remoteSdp.getSdp()};l.debug("receiveDataChannel() | calling pc.setRemoteDescription() [offer:%o]",e),await this._pc.setRemoteDescription(e);const t=await this._pc.createAnswer();if(!this._transportReady){const e=r.parse(t.sdp);await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:e})}l.debug("receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]",t),await this._pc.setLocalDescription(t),this._hasDataChannelMediaSection=!0}return{dataChannel:d}}async setupTransport({localDtlsRole:e,localSdpObject:t}){t||(t=r.parse(this._pc.localDescription.sdp));const s=o.extractDtlsParameters({sdpObject:t});s.role=e,this._remoteSdp.updateDtlsRole("client"===e?"server":"client"),await new Promise(((e,t)=>{this.safeEmit("@connect",{dtlsParameters:s},e,t)})),this._transportReady=!0}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')}}t.Chrome67=m},8274:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Logger=void 0;const r=s(7833),i="awaitqueue";t.Logger=class{_debug;_warn;_error;constructor(e){e?(this._debug=r(`${i}:${e}`),this._warn=r(`${i}:WARN:${e}`),this._error=r(`${i}:ERROR:${e}`)):(this._debug=r(i),this._warn=r(`${i}:WARN`),this._error=r(`${i}: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}}},8286:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=s(3779),i=s(2291),a=s(6011);t.default=function(e,t,s){if(r.default.randomUUID&&!t&&!e)return r.default.randomUUID();const n=(e=e||{}).random??e.rng?.()??(0,i.default)();if(n.length<16)throw new Error("Random bytes length must be >= 16");if(n[6]=15&n[6]|64,n[8]=63&n[8]|128,t){if((s=s||0)<0||s+16>t.length)throw new RangeError(`UUID byte range ${s}:${s+15} is out of buffer bounds`);for(let e=0;e<16;++e)t[s+e]=n[e];return t}return(0,a.unsafeStringify)(n)}},8633:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Edge11=void 0;const r=s(2994),i=s(4893),a=s(1765),n=s(8046),o=s(8751),c=s(521),d=new r.Logger("Edge11");class p extends c.HandlerInterface{_sendingRtpParametersByKind;_remoteIceParameters;_remoteIceCandidates;_remoteDtlsParameters;_iceGatherer;_iceTransport;_dtlsTransport;_rtpSenders=new Map;_rtpReceivers=new Map;_nextSendLocalId=0;_cname;_transportReady=!1;static createFactory(){return()=>new p}constructor(){super()}get name(){return"Edge11"}close(){d.debug("close()");try{this._iceGatherer.close()}catch(e){}try{this._iceTransport.stop()}catch(e){}try{this._dtlsTransport.stop()}catch(e){}for(const e of this._rtpSenders.values())try{e.stop()}catch(e){}for(const e of this._rtpReceivers.values())try{e.stop()}catch(e){}this.emit("@close")}async getNativeRtpCapabilities(){return d.debug("getNativeRtpCapabilities()"),o.getCapabilities()}async getNativeSctpCapabilities(){return d.debug("getNativeSctpCapabilities()"),{numStreams:{OS:0,MIS:0}}}run({direction:e,iceParameters:t,iceCandidates:s,dtlsParameters:r,sctpParameters:i,iceServers:o,iceTransportPolicy:c,additionalSettings:p,proprietaryConstraints:l,extendedRtpCapabilities:h}){d.debug("run()"),this._sendingRtpParametersByKind={audio:n.getSendingRtpParameters("audio",h),video:n.getSendingRtpParameters("video",h)},this._remoteIceParameters=t,this._remoteIceCandidates=s,this._remoteDtlsParameters=r,this._cname=`CNAME-${a.generateRandomNumber()}`,this.setIceGatherer({iceServers:o,iceTransportPolicy:c}),this.setIceTransport(),this.setDtlsTransport()}async updateIceServers(e){throw new i.UnsupportedError("not supported")}async restartIce(e){if(d.debug("restartIce()"),this._remoteIceParameters=e,this._transportReady){d.debug("restartIce() | calling iceTransport.start()"),this._iceTransport.start(this._iceGatherer,e,"controlling");for(const e of this._remoteIceCandidates)this._iceTransport.addRemoteCandidate(e);this._iceTransport.addRemoteCandidate({})}}async getTransportStats(){return this._iceTransport.getStats()}async send({track:e,encodings:t,codecOptions:s,codec:r}){d.debug("send() [kind:%s, track.id:%s]",e.kind,e.id),this._transportReady||await this.setupTransport({localDtlsRole:"server"}),d.debug("send() | calling new RTCRtpSender()");const i=new RTCRtpSender(e,this._dtlsTransport),c=a.clone(this._sendingRtpParametersByKind[e.kind]);c.codecs=n.reduceCodecs(c.codecs,r);const p=c.codecs.some((e=>/.+\/rtx$/i.test(e.mimeType)));t||(t=[{}]);for(const e of t)e.ssrc=a.generateRandomNumber(),p&&(e.rtx={ssrc:a.generateRandomNumber()});c.encodings=t,c.rtcp={cname:this._cname,reducedSize:!0,mux:!0};const l=o.mangleRtpParameters(c);d.debug("send() | calling rtpSender.send() [params:%o]",l),await i.send(l);const h=String(this._nextSendLocalId);return this._nextSendLocalId++,this._rtpSenders.set(h,i),{localId:h,rtpParameters:c,rtpSender:i}}async stopSending(e){d.debug("stopSending() [localId:%s]",e);const t=this._rtpSenders.get(e);if(!t)throw new Error("RTCRtpSender not found");this._rtpSenders.delete(e);try{d.debug("stopSending() | calling rtpSender.stop()"),t.stop()}catch(e){throw d.warn("stopSending() | rtpSender.stop() failed:%o",e),e}}async pauseSending(e){}async resumeSending(e){}async replaceTrack(e,t){t?d.debug("replaceTrack() [localId:%s, track.id:%s]",e,t.id):d.debug("replaceTrack() [localId:%s, no track]",e);const s=this._rtpSenders.get(e);if(!s)throw new Error("RTCRtpSender not found");s.setTrack(t)}async setMaxSpatialLayer(e,t){d.debug("setMaxSpatialLayer() [localId:%s, spatialLayer:%s]",e,t);const s=this._rtpSenders.get(e);if(!s)throw new Error("RTCRtpSender not found");const r=s.getParameters();r.encodings.forEach(((e,s)=>{e.active=s<=t})),await s.setParameters(r)}async setRtpEncodingParameters(e,t){d.debug("setRtpEncodingParameters() [localId:%s, params:%o]",e,t);const s=this._rtpSenders.get(e);if(!s)throw new Error("RTCRtpSender not found");const r=s.getParameters();r.encodings.forEach(((e,s)=>{r.encodings[s]={...e,...t}})),await s.setParameters(r)}async getSenderStats(e){const t=this._rtpSenders.get(e);if(!t)throw new Error("RTCRtpSender not found");return t.getStats()}async sendDataChannel(e){throw new i.UnsupportedError("not implemented")}async receive(e){const t=[];for(const t of e){const{trackId:e,kind:s}=t;d.debug("receive() [trackId:%s, kind:%s]",e,s)}this._transportReady||await this.setupTransport({localDtlsRole:"server"});for(const s of e){const{trackId:e,kind:r,rtpParameters:i}=s;d.debug("receive() | calling new RTCRtpReceiver()");const a=new RTCRtpReceiver(this._dtlsTransport,r);a.addEventListener("error",(e=>{d.error('rtpReceiver "error" event [event:%o]',e)}));const n=o.mangleRtpParameters(i);d.debug("receive() | calling rtpReceiver.receive() [params:%o]",n),await a.receive(n);const c=e;this._rtpReceivers.set(c,a),t.push({localId:c,track:a.track,rtpReceiver:a})}return t}async stopReceiving(e){for(const t of e){d.debug("stopReceiving() [localId:%s]",t);const e=this._rtpReceivers.get(t);if(!e)throw new Error("RTCRtpReceiver not found");this._rtpReceivers.delete(t);try{d.debug("stopReceiving() | calling rtpReceiver.stop()"),e.stop()}catch(e){d.warn("stopReceiving() | rtpReceiver.stop() failed:%o",e)}}}async pauseReceiving(e){}async resumeReceiving(e){}async getReceiverStats(e){const t=this._rtpReceivers.get(e);if(!t)throw new Error("RTCRtpReceiver not found");return t.getStats()}async receiveDataChannel(e){throw new i.UnsupportedError("not implemented")}setIceGatherer({iceServers:e,iceTransportPolicy:t}){const s=new RTCIceGatherer({iceServers:e??[],gatherPolicy:t??"all"});s.addEventListener("error",(e=>{d.error('iceGatherer "error" event [event:%o]',e)}));try{s.gather()}catch(e){d.debug("setIceGatherer() | iceGatherer.gather() failed: %s",e.toString())}this._iceGatherer=s}setIceTransport(){const e=new RTCIceTransport(this._iceGatherer);e.addEventListener("statechange",(()=>{switch(e.state){case"checking":this.emit("@connectionstatechange","connecting");break;case"connected":case"completed":this.emit("@connectionstatechange","connected");break;case"failed":this.emit("@connectionstatechange","failed");break;case"disconnected":this.emit("@connectionstatechange","disconnected");break;case"closed":this.emit("@connectionstatechange","closed")}})),e.addEventListener("icestatechange",(()=>{switch(e.state){case"checking":this.emit("@connectionstatechange","connecting");break;case"connected":case"completed":this.emit("@connectionstatechange","connected");break;case"failed":this.emit("@connectionstatechange","failed");break;case"disconnected":this.emit("@connectionstatechange","disconnected");break;case"closed":this.emit("@connectionstatechange","closed")}})),e.addEventListener("candidatepairchange",(e=>{d.debug('iceTransport "candidatepairchange" event [pair:%o]',e.pair)})),this._iceTransport=e}setDtlsTransport(){const e=new RTCDtlsTransport(this._iceTransport);e.addEventListener("statechange",(()=>{d.debug('dtlsTransport "statechange" event [state:%s]',e.state)})),e.addEventListener("dtlsstatechange",(()=>{d.debug('dtlsTransport "dtlsstatechange" event [state:%s]',e.state),"closed"===e.state&&this.emit("@connectionstatechange","closed")})),e.addEventListener("error",(e=>{d.error('dtlsTransport "error" event [event:%o]',e)})),this._dtlsTransport=e}async setupTransport({localDtlsRole:e}){d.debug("setupTransport()");const t=this._dtlsTransport.getLocalParameters();t.role=e,await new Promise(((e,s)=>{this.safeEmit("@connect",{dtlsParameters:t},e,s)})),this._iceTransport.start(this._iceGatherer,this._remoteIceParameters,"controlling");for(const e of this._remoteIceCandidates)this._iceTransport.addRemoteCandidate(e);this._iceTransport.addRemoteCandidate({}),this._remoteDtlsParameters.fingerprints=this._remoteDtlsParameters.fingerprints.filter((e=>"sha-256"===e.algorithm||"sha-384"===e.algorithm||"sha-512"===e.algorithm)),this._dtlsTransport.start(this._remoteDtlsParameters),this._transportReady=!0}}t.Edge11=p},8751:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getCapabilities=function(){const e=RTCRtpReceiver.getCapabilities(),t=r.clone(e);for(const e of t.codecs??[]){if(e.channels=e.numChannels,delete e.numChannels,e.mimeType=e.mimeType??`${e.kind}/${e.name}`,e.parameters){const t=e.parameters;t.apt&&(t.apt=Number(t.apt)),t["packetization-mode"]&&(t["packetization-mode"]=Number(t["packetization-mode"]))}for(const t of e.rtcpFeedback??[])t.parameter||(t.parameter="")}return t},t.mangleRtpParameters=function(e){const t=r.clone(e);t.mid&&(t.muxId=t.mid,delete t.mid);for(const e of t.codecs)e.channels&&(e.numChannels=e.channels,delete e.channels),e.mimeType&&!e.name&&(e.name=e.mimeType.split("/")[1]),delete e.mimeType;return t};const r=s(1765)},8876:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.AwaitQueueRemovedTaskError=t.AwaitQueueStoppedError=t.AwaitQueue=void 0;var r=s(9275);Object.defineProperty(t,"AwaitQueue",{enumerable:!0,get:function(){return r.AwaitQueue}});var i=s(4253);Object.defineProperty(t,"AwaitQueueStoppedError",{enumerable:!0,get:function(){return i.AwaitQueueStoppedError}}),Object.defineProperty(t,"AwaitQueueRemovedTaskError",{enumerable:!0,get:function(){return i.AwaitQueueRemovedTaskError}})},9166:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DataConsumer=void 0;const r=s(2994),i=s(3953),a=new r.Logger("DataConsumer");class n extends i.EnhancedEventEmitter{_id;_dataProducerId;_dataChannel;_closed=!1;_sctpStreamParameters;_appData;_observer=new i.EnhancedEventEmitter;constructor({id:e,dataProducerId:t,dataChannel:s,sctpStreamParameters:r,appData:i}){super(),a.debug("constructor()"),this._id=e,this._dataProducerId=t,this._dataChannel=s,this._sctpStreamParameters=r,this._appData=i??{},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||(a.debug("close()"),this._closed=!0,this._dataChannel.close(),this.emit("@close"),this._observer.safeEmit("close"))}transportClosed(){this._closed||(a.debug("transportClosed()"),this._closed=!0,this._dataChannel.close(),this.safeEmit("transportclose"),this._observer.safeEmit("close"))}handleDataChannel(){this._dataChannel.addEventListener("open",(()=>{this._closed||(a.debug('DataChannel "open" event'),this.safeEmit("open"))})),this._dataChannel.addEventListener("error",(e=>{if(this._closed)return;let{error:t}=e;t||(t=new Error("unknown DataChannel error")),"sctp-failure"===t.errorDetail?a.error("DataChannel SCTP error [sctpCauseCode:%s]: %s",t.sctpCauseCode,t.message):a.error('DataChannel "error" event: %o',t),this.safeEmit("error",t)})),this._dataChannel.addEventListener("close",(()=>{this._closed||(a.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)}))}}t.DataConsumer=n},9275:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.AwaitQueue=void 0;const r=s(8274),i=s(4253),a=new r.Logger("AwaitQueue");t.AwaitQueue=class{pendingTasks=new Map;nextTaskId=0;stopping=!1;constructor(){a.debug("constructor()")}get size(){return this.pendingTasks.size}async push(e,t){if(t=t??e.name,a.debug(`push() [name:${t}]`),"function"!=typeof e)throw new TypeError("given task is not a function");if(t)try{Object.defineProperty(e,"name",{value:t})}catch(e){}return new Promise(((s,r)=>{const i={id:this.nextTaskId++,task:e,name:t,enqueuedAt:Date.now(),executedAt:void 0,completed:!1,resolve:e=>{if(i.completed)return;i.completed=!0,this.pendingTasks.delete(i.id),a.debug(`resolving task [name:${i.name}]`),s(e);const[t]=this.pendingTasks.values();t&&!t.executedAt&&this.execute(t)},reject:e=>{if(!i.completed&&(i.completed=!0,this.pendingTasks.delete(i.id),a.debug(`rejecting task [name:${i.name}]: %s`,String(e)),r(e),!this.stopping)){const[e]=this.pendingTasks.values();e&&!e.executedAt&&this.execute(e)}}};this.pendingTasks.set(i.id,i),1===this.pendingTasks.size&&this.execute(i)}))}stop(){a.debug("stop()"),this.stopping=!0;for(const e of this.pendingTasks.values())a.debug(`stop() | stopping task [name:${e.name}]`),e.reject(new i.AwaitQueueStoppedError);this.stopping=!1}remove(e){a.debug(`remove() [taskIdx:${e}]`);const t=Array.from(this.pendingTasks.values())[e];t?t.reject(new i.AwaitQueueRemovedTaskError):a.debug(`stop() | no task with given idx [taskIdx:${e}]`)}dump(){const e=Date.now();let t=0;return Array.from(this.pendingTasks.values()).map((s=>({idx:t++,task:s.task,name:s.name,enqueuedTime:s.executedAt?s.executedAt-s.enqueuedAt:e-s.enqueuedAt,executionTime:s.executedAt?e-s.executedAt:0})))}async execute(e){if(a.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)}}}},9352:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ReactNative=void 0;const r=s(7363),i=s(2994),a=s(4893),n=s(1765),o=s(8046),c=s(5544),d=s(4496),p=s(521),l=s(1305),h=new i.Logger("ReactNative"),m={OS:1024,MIS:1024};class u extends p.HandlerInterface{_direction;_remoteSdp;_sendingRtpParametersByKind;_sendingRemoteRtpParametersByKind;_forcedLocalDtlsRole;_pc;_sendStream=new MediaStream;_mapSendLocalIdTrack=new Map;_nextSendLocalId=0;_mapRecvLocalIdInfo=new Map;_hasDataChannelMediaSection=!1;_nextSendSctpStreamId=0;_transportReady=!1;static createFactory(){return()=>new u}constructor(){super()}get name(){return"ReactNative"}close(){if(h.debug("close()"),this._sendStream.release(!1),this._pc)try{this._pc.close()}catch(e){}this.emit("@close")}async getNativeRtpCapabilities(){h.debug("getNativeRtpCapabilities()");const e=new RTCPeerConnection({iceServers:[],iceTransportPolicy:"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require",sdpSemantics:"plan-b"});try{const t=await e.createOffer({offerToReceiveAudio:!0,offerToReceiveVideo:!0});try{e.close()}catch(e){}const s=r.parse(t.sdp);return c.extractRtpCapabilities({sdpObject:s})}catch(t){try{e.close()}catch(e){}throw t}}async getNativeSctpCapabilities(){return h.debug("getNativeSctpCapabilities()"),{numStreams:m}}run({direction:e,iceParameters:t,iceCandidates:s,dtlsParameters:r,sctpParameters:i,iceServers:a,iceTransportPolicy:n,additionalSettings:c,proprietaryConstraints:d,extendedRtpCapabilities:p}){h.debug("run()"),this._direction=e,this._remoteSdp=new l.RemoteSdp({iceParameters:t,iceCandidates:s,dtlsParameters:r,sctpParameters:i,planB:!0}),this._sendingRtpParametersByKind={audio:o.getSendingRtpParameters("audio",p),video:o.getSendingRtpParameters("video",p)},this._sendingRemoteRtpParametersByKind={audio:o.getSendingRemoteRtpParameters("audio",p),video:o.getSendingRemoteRtpParameters("video",p)},r.role&&"auto"!==r.role&&(this._forcedLocalDtlsRole="server"===r.role?"client":"server"),this._pc=new RTCPeerConnection({iceServers:a??[],iceTransportPolicy:n??"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require",sdpSemantics:"plan-b",...c},d),this._pc.addEventListener("icegatheringstatechange",(()=>{this.emit("@icegatheringstatechange",this._pc.iceGatheringState)})),this._pc.addEventListener("icecandidateerror",(e=>{this.emit("@icecandidateerror",e)})),this._pc.connectionState?this._pc.addEventListener("connectionstatechange",(()=>{this.emit("@connectionstatechange",this._pc.connectionState)})):this._pc.addEventListener("iceconnectionstatechange",(()=>{switch(h.warn("run() | pc.connectionState not supported, using pc.iceConnectionState"),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")}}))}async updateIceServers(e){h.debug("updateIceServers()");const t=this._pc.getConfiguration();t.iceServers=e,this._pc.setConfiguration(t)}async restartIce(e){if(h.debug("restartIce()"),this._remoteSdp.updateIceParameters(e),this._transportReady)if("send"===this._direction){const e=await this._pc.createOffer({iceRestart:!0});h.debug("restartIce() | calling pc.setLocalDescription() [offer:%o]",e),await this._pc.setLocalDescription(e);const t={type:"answer",sdp:this._remoteSdp.getSdp()};h.debug("restartIce() | calling pc.setRemoteDescription() [answer:%o]",t),await this._pc.setRemoteDescription(t)}else{const e={type:"offer",sdp:this._remoteSdp.getSdp()};h.debug("restartIce() | calling pc.setRemoteDescription() [offer:%o]",e),await this._pc.setRemoteDescription(e);const t=await this._pc.createAnswer();h.debug("restartIce() | calling pc.setLocalDescription() [answer:%o]",t),await this._pc.setLocalDescription(t)}}async getTransportStats(){return this._pc.getStats()}async send({track:e,encodings:t,codecOptions:s,codec:i}){this.assertSendDirection(),h.debug("send() [kind:%s, track.id:%s]",e.kind,e.id),i&&h.warn("send() | codec selection is not available in %s handler",this.name),this._sendStream.addTrack(e),this._pc.addStream(this._sendStream);let a,p=await this._pc.createOffer(),l=r.parse(p.sdp);l.extmapAllowMixed&&this._remoteSdp.setSessionExtmapAllowMixed();const m=n.clone(this._sendingRtpParametersByKind[e.kind]);m.codecs=o.reduceCodecs(m.codecs);const u=n.clone(this._sendingRemoteRtpParametersByKind[e.kind]);if(u.codecs=o.reduceCodecs(u.codecs),this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:l}),"video"===e.kind&&t&&t.length>1&&(h.debug("send() | enabling simulcast"),l=r.parse(p.sdp),a=l.media.find((e=>"video"===e.type)),d.addLegacySimulcast({offerMediaObject:a,track:e,numStreams:t.length}),p={type:"offer",sdp:r.write(l)}),h.debug("send() | calling pc.setLocalDescription() [offer:%o]",p),await this._pc.setLocalDescription(p),l=r.parse(this._pc.localDescription.sdp),a=l.media.find((t=>t.type===e.kind)),m.rtcp.cname=c.getCname({offerMediaObject:a}),m.encodings=d.getRtpEncodings({offerMediaObject:a,track:e}),t)for(let e=0;e1&&("video/vp8"===m.codecs[0].mimeType.toLowerCase()||"video/h264"===m.codecs[0].mimeType.toLowerCase()))for(const e of m.encodings)e.scalabilityMode="L1T3";this._remoteSdp.send({offerMediaObject:a,offerRtpParameters:m,answerRtpParameters:u,codecOptions:s});const f={type:"answer",sdp:this._remoteSdp.getSdp()};h.debug("send() | calling pc.setRemoteDescription() [answer:%o]",f),await this._pc.setRemoteDescription(f);const g=String(this._nextSendLocalId);return this._nextSendLocalId++,this._mapSendLocalIdTrack.set(g,e),{localId:g,rtpParameters:m}}async stopSending(e){this.assertSendDirection(),h.debug("stopSending() [localId:%s]",e);const t=this._mapSendLocalIdTrack.get(e);if(!t)throw new Error("track not found");this._mapSendLocalIdTrack.delete(e),this._sendStream.removeTrack(t),this._pc.addStream(this._sendStream);const s=await this._pc.createOffer();h.debug("stopSending() | calling pc.setLocalDescription() [offer:%o]",s);try{await this._pc.setLocalDescription(s)}catch(e){if(0===this._sendStream.getTracks().length)return void h.warn("stopSending() | ignoring expected error due no sending tracks: %s",e.toString());throw e}if("stable"===this._pc.signalingState)return;const r={type:"answer",sdp:this._remoteSdp.getSdp()};h.debug("stopSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r)}async pauseSending(e){}async resumeSending(e){}async replaceTrack(e,t){throw new a.UnsupportedError("not implemented")}async setMaxSpatialLayer(e,t){throw new a.UnsupportedError("not implemented")}async setRtpEncodingParameters(e,t){throw new a.UnsupportedError("not implemented")}async getSenderStats(e){throw new a.UnsupportedError("not implemented")}async sendDataChannel({ordered:e,maxPacketLifeTime:t,maxRetransmits:s,label:i,protocol:a}){this.assertSendDirection();const n={negotiated:!0,id:this._nextSendSctpStreamId,ordered:e,maxPacketLifeTime:t,maxRetransmitTime:t,maxRetransmits:s,protocol:a};h.debug("sendDataChannel() [options:%o]",n);const o=this._pc.createDataChannel(i,n);if(this._nextSendSctpStreamId=++this._nextSendSctpStreamId%m.MIS,!this._hasDataChannelMediaSection){const e=await this._pc.createOffer(),t=r.parse(e.sdp),s=t.media.find((e=>"application"===e.type));this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:t}),h.debug("sendDataChannel() | calling pc.setLocalDescription() [offer:%o]",e),await this._pc.setLocalDescription(e),this._remoteSdp.sendSctpAssociation({offerMediaObject:s});const i={type:"answer",sdp:this._remoteSdp.getSdp()};h.debug("sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]",i),await this._pc.setRemoteDescription(i),this._hasDataChannelMediaSection=!0}return{dataChannel:o,sctpStreamParameters:{streamId:n.id,ordered:n.ordered,maxPacketLifeTime:n.maxPacketLifeTime,maxRetransmits:n.maxRetransmits}}}async receive(e){this.assertRecvDirection();const t=[],s=new Map;for(const t of e){const{trackId:e,kind:r,rtpParameters:i}=t;h.debug("receive() [trackId:%s, kind:%s]",e,r);const a=r;let o=t.streamId??i.rtcp.cname;h.debug("receive() | forcing a random remote streamId to avoid well known bug in react-native-webrtc"),o+=`-hack-${n.generateRandomNumber()}`,s.set(e,o),this._remoteSdp.receive({mid:a,kind:r,offerRtpParameters:i,streamId:o,trackId:e})}const i={type:"offer",sdp:this._remoteSdp.getSdp()};h.debug("receive() | calling pc.setRemoteDescription() [offer:%o]",i),await this._pc.setRemoteDescription(i);let a=await this._pc.createAnswer();const o=r.parse(a.sdp);for(const t of e){const{kind:e,rtpParameters:s}=t,r=e,i=o.media.find((e=>String(e.mid)===r));c.applyCodecParameters({offerRtpParameters:s,answerMediaObject:i})}a={type:"answer",sdp:r.write(o)},this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:o}),h.debug("receive() | calling pc.setLocalDescription() [answer:%o]",a),await this._pc.setLocalDescription(a);for(const r of e){const{kind:e,trackId:i,rtpParameters:a}=r,n=i,o=e,c=s.get(i),d=this._pc.getRemoteStreams().find((e=>e.id===c)).getTrackById(n);if(!d)throw new Error("remote track not found");this._mapRecvLocalIdInfo.set(n,{mid:o,rtpParameters:a}),t.push({localId:n,track:d})}return t}async stopReceiving(e){this.assertRecvDirection();for(const t of e){h.debug("stopReceiving() [localId:%s]",t);const{mid:e,rtpParameters:s}=this._mapRecvLocalIdInfo.get(t)??{};this._mapRecvLocalIdInfo.delete(t),this._remoteSdp.planBStopReceiving({mid:e,offerRtpParameters:s})}const t={type:"offer",sdp:this._remoteSdp.getSdp()};h.debug("stopReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const s=await this._pc.createAnswer();h.debug("stopReceiving() | calling pc.setLocalDescription() [answer:%o]",s),await this._pc.setLocalDescription(s)}async pauseReceiving(e){}async resumeReceiving(e){}async getReceiverStats(e){throw new a.UnsupportedError("not implemented")}async receiveDataChannel({sctpStreamParameters:e,label:t,protocol:s}){this.assertRecvDirection();const{streamId:i,ordered:a,maxPacketLifeTime:n,maxRetransmits:o}=e,c={negotiated:!0,id:i,ordered:a,maxPacketLifeTime:n,maxRetransmitTime:n,maxRetransmits:o,protocol:s};h.debug("receiveDataChannel() [options:%o]",c);const d=this._pc.createDataChannel(t,c);if(!this._hasDataChannelMediaSection){this._remoteSdp.receiveSctpAssociation({oldDataChannelSpec:!0});const e={type:"offer",sdp:this._remoteSdp.getSdp()};h.debug("receiveDataChannel() | calling pc.setRemoteDescription() [offer:%o]",e),await this._pc.setRemoteDescription(e);const t=await this._pc.createAnswer();if(!this._transportReady){const e=r.parse(t.sdp);await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:e})}h.debug("receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]",t),await this._pc.setLocalDescription(t),this._hasDataChannelMediaSection=!0}return{dataChannel:d}}async setupTransport({localDtlsRole:e,localSdpObject:t}){t||(t=r.parse(this._pc.localDescription.sdp));const s=c.extractDtlsParameters({sdpObject:t});s.role=e,this._remoteSdp.updateDtlsRole("client"===e?"server":"client"),await new Promise(((e,t)=>{this.safeEmit("@connect",{dtlsParameters:s},e,t)})),this._transportReady=!0}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')}}t.ReactNative=u},9596:e=>{"use strict";var t,s="object"==typeof Reflect?Reflect:null,r=s&&"function"==typeof s.apply?s.apply:function(e,t,s){return Function.prototype.apply.call(e,t,s)};t=s&&"function"==typeof s.ownKeys?s.ownKeys:Object.getOwnPropertySymbols?function(e){return Object.getOwnPropertyNames(e).concat(Object.getOwnPropertySymbols(e))}:function(e){return Object.getOwnPropertyNames(e)};var i=Number.isNaN||function(e){return e!=e};function a(){a.init.call(this)}e.exports=a,e.exports.once=function(e,t){return new Promise((function(s,r){function i(s){e.removeListener(t,a),r(s)}function a(){"function"==typeof e.removeListener&&e.removeListener("error",i),s([].slice.call(arguments))}f(e,t,a,{once:!0}),"error"!==t&&function(e,t){"function"==typeof e.on&&f(e,"error",t,{once:!0})}(e,i)}))},a.EventEmitter=a,a.prototype._events=void 0,a.prototype._eventsCount=0,a.prototype._maxListeners=void 0;var n=10;function o(e){if("function"!=typeof e)throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof e)}function c(e){return void 0===e._maxListeners?a.defaultMaxListeners:e._maxListeners}function d(e,t,s,r){var i,a,n,d;if(o(s),void 0===(a=e._events)?(a=e._events=Object.create(null),e._eventsCount=0):(void 0!==a.newListener&&(e.emit("newListener",t,s.listener?s.listener:s),a=e._events),n=a[t]),void 0===n)n=a[t]=s,++e._eventsCount;else if("function"==typeof n?n=a[t]=r?[s,n]:[n,s]:r?n.unshift(s):n.push(s),(i=c(e))>0&&n.length>i&&!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,d=p,console&&console.warn&&console.warn(d)}return e}function p(){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 l(e,t,s){var r={fired:!1,wrapFn:void 0,target:e,type:t,listener:s},i=p.bind(r);return i.listener=s,r.wrapFn=i,i}function h(e,t,s){var r=e._events;if(void 0===r)return[];var i=r[t];return void 0===i?[]:"function"==typeof i?s?[i.listener||i]:[i]:s?function(e){for(var t=new Array(e.length),s=0;s0&&(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)r(c,this,t);else{var d=c.length,p=u(c,d);for(s=0;s=0;a--)if(s[a]===t||s[a].listener===t){n=s[a].listener,i=a;break}if(i<0)return this;0===i?s.shift():function(e,t){for(;t+1=0;r--)this.removeListener(e,t[r]);return this},a.prototype.listeners=function(e){return h(this,e,!0)},a.prototype.rawListeners=function(e){return h(this,e,!1)},a.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):m.call(e,t)},a.prototype.listenerCount=m,a.prototype.eventNames=function(){return this._eventsCount>0?t(this._events):[]}},9676:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Safari11=void 0;const r=s(7363),i=s(2994),a=s(1765),n=s(8046),o=s(5544),c=s(4496),d=s(521),p=s(1305),l=new i.Logger("Safari11"),h={OS:1024,MIS:1024};class m extends d.HandlerInterface{_direction;_remoteSdp;_sendingRtpParametersByKind;_sendingRemoteRtpParametersByKind;_forcedLocalDtlsRole;_pc;_sendStream=new MediaStream;_mapSendLocalIdRtpSender=new Map;_nextSendLocalId=0;_mapRecvLocalIdInfo=new Map;_hasDataChannelMediaSection=!1;_nextSendSctpStreamId=0;_transportReady=!1;static createFactory(){return()=>new m}constructor(){super()}get name(){return"Safari11"}close(){if(l.debug("close()"),this._pc)try{this._pc.close()}catch(e){}this.emit("@close")}async getNativeRtpCapabilities(){l.debug("getNativeRtpCapabilities()");const e=new RTCPeerConnection({iceServers:[],iceTransportPolicy:"all",bundlePolicy:"max-bundle",rtcpMuxPolicy:"require",sdpSemantics:"plan-b"});try{const t=await e.createOffer({offerToReceiveAudio:!0,offerToReceiveVideo:!0});try{e.close()}catch(e){}const s=r.parse(t.sdp);return o.extractRtpCapabilities({sdpObject:s})}catch(t){try{e.close()}catch(e){}throw t}}async getNativeSctpCapabilities(){return l.debug("getNativeSctpCapabilities()"),{numStreams:h}}run({direction:e,iceParameters:t,iceCandidates:s,dtlsParameters:r,sctpParameters:i,iceServers:a,iceTransportPolicy:o,additionalSettings:c,proprietaryConstraints:d,extendedRtpCapabilities:h}){l.debug("run()"),this._direction=e,this._remoteSdp=new p.RemoteSdp({iceParameters:t,iceCandidates:s,dtlsParameters:r,sctpParameters:i,planB:!0}),this._sendingRtpParametersByKind={audio:n.getSendingRtpParameters("audio",h),video:n.getSendingRtpParameters("video",h)},this._sendingRemoteRtpParametersByKind={audio:n.getSendingRemoteRtpParameters("audio",h),video:n.getSendingRemoteRtpParameters("video",h)},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},d),this._pc.addEventListener("icegatheringstatechange",(()=>{this.emit("@icegatheringstatechange",this._pc.iceGatheringState)})),this._pc.addEventListener("icecandidateerror",(e=>{this.emit("@icecandidateerror",e)})),this._pc.connectionState?this._pc.addEventListener("connectionstatechange",(()=>{this.emit("@connectionstatechange",this._pc.connectionState)})):this._pc.addEventListener("iceconnectionstatechange",(()=>{switch(l.warn("run() | pc.connectionState not supported, using pc.iceConnectionState"),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")}}))}async updateIceServers(e){l.debug("updateIceServers()");const t=this._pc.getConfiguration();t.iceServers=e,this._pc.setConfiguration(t)}async restartIce(e){if(l.debug("restartIce()"),this._remoteSdp.updateIceParameters(e),this._transportReady)if("send"===this._direction){const e=await this._pc.createOffer({iceRestart:!0});l.debug("restartIce() | calling pc.setLocalDescription() [offer:%o]",e),await this._pc.setLocalDescription(e);const t={type:"answer",sdp:this._remoteSdp.getSdp()};l.debug("restartIce() | calling pc.setRemoteDescription() [answer:%o]",t),await this._pc.setRemoteDescription(t)}else{const e={type:"offer",sdp:this._remoteSdp.getSdp()};l.debug("restartIce() | calling pc.setRemoteDescription() [offer:%o]",e),await this._pc.setRemoteDescription(e);const t=await this._pc.createAnswer();l.debug("restartIce() | calling pc.setLocalDescription() [answer:%o]",t),await this._pc.setLocalDescription(t)}}async getTransportStats(){return this._pc.getStats()}async send({track:e,encodings:t,codecOptions:s,codec:i}){this.assertSendDirection(),l.debug("send() [kind:%s, track.id:%s]",e.kind,e.id),i&&l.warn("send() | codec selection is not available in %s handler",this.name),this._sendStream.addTrack(e),this._pc.addTrack(e,this._sendStream);let d,p=await this._pc.createOffer(),h=r.parse(p.sdp);h.extmapAllowMixed&&this._remoteSdp.setSessionExtmapAllowMixed();const m=a.clone(this._sendingRtpParametersByKind[e.kind]);m.codecs=n.reduceCodecs(m.codecs);const u=a.clone(this._sendingRemoteRtpParametersByKind[e.kind]);if(u.codecs=n.reduceCodecs(u.codecs),this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:h}),"video"===e.kind&&t&&t.length>1&&(l.debug("send() | enabling simulcast"),h=r.parse(p.sdp),d=h.media.find((e=>"video"===e.type)),c.addLegacySimulcast({offerMediaObject:d,track:e,numStreams:t.length}),p={type:"offer",sdp:r.write(h)}),l.debug("send() | calling pc.setLocalDescription() [offer:%o]",p),await this._pc.setLocalDescription(p),h=r.parse(this._pc.localDescription.sdp),d=h.media.find((t=>t.type===e.kind)),m.rtcp.cname=o.getCname({offerMediaObject:d}),m.encodings=c.getRtpEncodings({offerMediaObject:d,track:e}),t)for(let e=0;e1&&"video/vp8"===m.codecs[0].mimeType.toLowerCase())for(const e of m.encodings)e.scalabilityMode="L1T3";this._remoteSdp.send({offerMediaObject:d,offerRtpParameters:m,answerRtpParameters:u,codecOptions:s});const f={type:"answer",sdp:this._remoteSdp.getSdp()};l.debug("send() | calling pc.setRemoteDescription() [answer:%o]",f),await this._pc.setRemoteDescription(f);const g=String(this._nextSendLocalId);this._nextSendLocalId++;const _=this._pc.getSenders().find((t=>t.track===e));return this._mapSendLocalIdRtpSender.set(g,_),{localId:g,rtpParameters:m,rtpSender:_}}async stopSending(e){this.assertSendDirection();const t=this._mapSendLocalIdRtpSender.get(e);if(!t)throw new Error("associated RTCRtpSender not found");t.track&&this._sendStream.removeTrack(t.track),this._mapSendLocalIdRtpSender.delete(e);const s=await this._pc.createOffer();l.debug("stopSending() | calling pc.setLocalDescription() [offer:%o]",s);try{await this._pc.setLocalDescription(s)}catch(e){if(0===this._sendStream.getTracks().length)return void l.warn("stopSending() | ignoring expected error due no sending tracks: %s",e.toString());throw e}if("stable"===this._pc.signalingState)return;const r={type:"answer",sdp:this._remoteSdp.getSdp()};l.debug("stopSending() | calling pc.setRemoteDescription() [answer:%o]",r),await this._pc.setRemoteDescription(r)}async pauseSending(e){}async resumeSending(e){}async replaceTrack(e,t){this.assertSendDirection(),t?l.debug("replaceTrack() [localId:%s, track.id:%s]",e,t.id):l.debug("replaceTrack() [localId:%s, no track]",e);const s=this._mapSendLocalIdRtpSender.get(e);if(!s)throw new Error("associated RTCRtpSender not found");const r=s.track;await s.replaceTrack(t),r&&this._sendStream.removeTrack(r),t&&this._sendStream.addTrack(t)}async setMaxSpatialLayer(e,t){this.assertSendDirection(),l.debug("setMaxSpatialLayer() [localId:%s, spatialLayer:%s]",e,t);const s=this._mapSendLocalIdRtpSender.get(e);if(!s)throw new Error("associated RTCRtpSender not found");const r=s.getParameters();r.encodings.forEach(((e,s)=>{e.active=s<=t})),await s.setParameters(r)}async setRtpEncodingParameters(e,t){this.assertSendDirection(),l.debug("setRtpEncodingParameters() [localId:%s, params:%o]",e,t);const s=this._mapSendLocalIdRtpSender.get(e);if(!s)throw new Error("associated RTCRtpSender not found");const r=s.getParameters();r.encodings.forEach(((e,s)=>{r.encodings[s]={...e,...t}})),await s.setParameters(r)}async getSenderStats(e){this.assertSendDirection();const t=this._mapSendLocalIdRtpSender.get(e);if(!t)throw new Error("associated RTCRtpSender not found");return t.getStats()}async sendDataChannel({ordered:e,maxPacketLifeTime:t,maxRetransmits:s,label:i,protocol:a}){this.assertSendDirection();const n={negotiated:!0,id:this._nextSendSctpStreamId,ordered:e,maxPacketLifeTime:t,maxRetransmits:s,protocol:a};l.debug("sendDataChannel() [options:%o]",n);const o=this._pc.createDataChannel(i,n);if(this._nextSendSctpStreamId=++this._nextSendSctpStreamId%h.MIS,!this._hasDataChannelMediaSection){const e=await this._pc.createOffer(),t=r.parse(e.sdp),s=t.media.find((e=>"application"===e.type));this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:t}),l.debug("sendDataChannel() | calling pc.setLocalDescription() [offer:%o]",e),await this._pc.setLocalDescription(e),this._remoteSdp.sendSctpAssociation({offerMediaObject:s});const i={type:"answer",sdp:this._remoteSdp.getSdp()};l.debug("sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]",i),await this._pc.setRemoteDescription(i),this._hasDataChannelMediaSection=!0}return{dataChannel:o,sctpStreamParameters:{streamId:n.id,ordered:n.ordered,maxPacketLifeTime:n.maxPacketLifeTime,maxRetransmits:n.maxRetransmits}}}async receive(e){this.assertRecvDirection();const t=[];for(const t of e){const{trackId:e,kind:s,rtpParameters:r,streamId:i}=t;l.debug("receive() [trackId:%s, kind:%s]",e,s);const a=s;this._remoteSdp.receive({mid:a,kind:s,offerRtpParameters:r,streamId:i??r.rtcp.cname,trackId:e})}const s={type:"offer",sdp:this._remoteSdp.getSdp()};l.debug("receive() | calling pc.setRemoteDescription() [offer:%o]",s),await this._pc.setRemoteDescription(s);let i=await this._pc.createAnswer();const a=r.parse(i.sdp);for(const t of e){const{kind:e,rtpParameters:s}=t,r=e,i=a.media.find((e=>String(e.mid)===r));o.applyCodecParameters({offerRtpParameters:s,answerMediaObject:i})}i={type:"answer",sdp:r.write(a)},this._transportReady||await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:a}),l.debug("receive() | calling pc.setLocalDescription() [answer:%o]",i),await this._pc.setLocalDescription(i);for(const s of e){const{kind:e,trackId:r,rtpParameters:i}=s,a=e,n=r,o=this._pc.getReceivers().find((e=>e.track&&e.track.id===n));if(!o)throw new Error("new RTCRtpReceiver not");this._mapRecvLocalIdInfo.set(n,{mid:a,rtpParameters:i,rtpReceiver:o}),t.push({localId:n,track:o.track,rtpReceiver:o})}return t}async stopReceiving(e){this.assertRecvDirection();for(const t of e){l.debug("stopReceiving() [localId:%s]",t);const{mid:e,rtpParameters:s}=this._mapRecvLocalIdInfo.get(t)??{};this._mapRecvLocalIdInfo.delete(t),this._remoteSdp.planBStopReceiving({mid:e,offerRtpParameters:s})}const t={type:"offer",sdp:this._remoteSdp.getSdp()};l.debug("stopReceiving() | calling pc.setRemoteDescription() [offer:%o]",t),await this._pc.setRemoteDescription(t);const s=await this._pc.createAnswer();l.debug("stopReceiving() | calling pc.setLocalDescription() [answer:%o]",s),await this._pc.setLocalDescription(s)}async getReceiverStats(e){this.assertRecvDirection();const{rtpReceiver:t}=this._mapRecvLocalIdInfo.get(e)??{};if(!t)throw new Error("associated RTCRtpReceiver not found");return t.getStats()}async pauseReceiving(e){}async resumeReceiving(e){}async receiveDataChannel({sctpStreamParameters:e,label:t,protocol:s}){this.assertRecvDirection();const{streamId:i,ordered:a,maxPacketLifeTime:n,maxRetransmits:o}=e,c={negotiated:!0,id:i,ordered:a,maxPacketLifeTime:n,maxRetransmits:o,protocol:s};l.debug("receiveDataChannel() [options:%o]",c);const d=this._pc.createDataChannel(t,c);if(!this._hasDataChannelMediaSection){this._remoteSdp.receiveSctpAssociation({oldDataChannelSpec:!0});const e={type:"offer",sdp:this._remoteSdp.getSdp()};l.debug("receiveDataChannel() | calling pc.setRemoteDescription() [offer:%o]",e),await this._pc.setRemoteDescription(e);const t=await this._pc.createAnswer();if(!this._transportReady){const e=r.parse(t.sdp);await this.setupTransport({localDtlsRole:this._forcedLocalDtlsRole??"client",localSdpObject:e})}l.debug("receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]",t),await this._pc.setLocalDescription(t),this._hasDataChannelMediaSection=!0}return{dataChannel:d}}async setupTransport({localDtlsRole:e,localSdpObject:t}){t||(t=r.parse(this._pc.localDescription.sdp));const s=o.extractDtlsParameters({sdpObject:t});s.role=e,this._remoteSdp.updateDtlsRole("client"===e?"server":"client"),await new Promise(((e,t)=>{this.safeEmit("@connect",{dtlsParameters:s},e,t)})),this._transportReady=!0}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')}}t.Safari11=m},9746:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0});const r=s(6697);t.default=function(e){return"string"==typeof e&&r.default.test(e)}},9792:(e,t,s)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Producer=void 0;const r=s(2994),i=s(3953),a=s(4893),n=new r.Logger("Producer");class o extends i.EnhancedEventEmitter{_id;_localId;_closed=!1;_rtpSender;_track;_kind;_rtpParameters;_paused;_maxSpatialLayer;_stopTracks;_disableTrackOnPause;_zeroRtpOnPause;_appData;_observer=new i.EnhancedEventEmitter;constructor({id:e,localId:t,rtpSender:s,track:r,rtpParameters:i,stopTracks:a,disableTrackOnPause:o,zeroRtpOnPause:c,appData:d}){super(),n.debug("constructor()"),this._id=e,this._localId=t,this._rtpSender=s,this._track=r,this._kind=r.kind,this._rtpParameters=i,this._paused=!!o&&!r.enabled,this._maxSpatialLayer=void 0,this._stopTracks=a,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||(n.debug("close()"),this._closed=!0,this.destroyTrack(),this.emit("@close"),this._observer.safeEmit("close"))}transportClosed(){this._closed||(n.debug("transportClosed()"),this._closed=!0,this.destroyTrack(),this.safeEmit("transportclose"),this._observer.safeEmit("close"))}async getStats(){if(this._closed)throw new a.InvalidStateError("closed");return new Promise(((e,t)=>{this.safeEmit("@getstats",e,t)}))}pause(){n.debug("pause()"),this._closed?n.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(){n.debug("resume()"),this._closed?n.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(n.debug("replaceTrack() [track:%o]",e),this._closed){if(e&&this._stopTracks)try{e.stop()}catch(e){}throw new a.InvalidStateError("closed")}if(e&&"ended"===e.readyState)throw new a.InvalidStateError("track ended");e!==this._track?(await new Promise(((t,s)=>{this.safeEmit("@replacetrack",e,t,s)})),this.destroyTrack(),this._track=e,this._track&&this._disableTrackOnPause&&(this._paused?this._paused&&(this._track.enabled=!1):this._track.enabled=!0),this.handleTrack()):n.debug("replaceTrack() | same track, ignored")}async setMaxSpatialLayer(e){if(this._closed)throw new a.InvalidStateError("closed");if("video"!==this._kind)throw new a.UnsupportedError("not a video Producer");if("number"!=typeof e)throw new TypeError("invalid spatialLayer");e!==this._maxSpatialLayer&&(await new Promise(((t,s)=>{this.safeEmit("@setmaxspatiallayer",e,t,s)})).catch((()=>{})),this._maxSpatialLayer=e)}async setRtpEncodingParameters(e){if(this._closed)throw new a.InvalidStateError("closed");if("object"!=typeof e)throw new TypeError("invalid params");await new Promise(((t,s)=>{this.safeEmit("@setrtpencodingparameters",e,t,s)}))}onTrackEnded(){n.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){}}}t.Producer=o}},t={};function s(r){var i=t[r];if(void 0!==i)return i.exports;var a=t[r]={exports:{}};return e[r].call(a.exports,a,a.exports,s),a.exports}s.amdO={};var r=s(76);window.mediasoupClient=r})();
\ No newline at end of file
diff --git a/rtmpServers/demo/client-server-socket/server/RtmpStreamer.js b/rtmpServers/demo/client-server-socket/server/RtmpStreamer.js
index 060fa4e9..800fea02 100644
--- a/rtmpServers/demo/client-server-socket/server/RtmpStreamer.js
+++ b/rtmpServers/demo/client-server-socket/server/RtmpStreamer.js
@@ -28,7 +28,8 @@ console.log('FFmpeg', { platform, ffmpegPath });
class RtmpStreamer {
constructor(rtmpUrl, rtmpKey, socket) {
- (this.socket = socket), (this.rtmpUrl = rtmpUrl);
+ this.socket = socket;
+ this.rtmpUrl = rtmpUrl;
this.rtmpKey = rtmpKey;
this.stream = new PassThrough();
this.ffmpegStream = null;