hanc-webrtc-widgets 2.2.11 → 2.2.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -81,7 +81,7 @@ a=extmap-allow-mixed`)!==-1){const r=s.sdp.split(`
81
81
  `).filter(a=>a.trim()!=="a=extmap-allow-mixed").join(`
82
82
  `);i.RTCSessionDescription&&s instanceof i.RTCSessionDescription?arguments[0]=new i.RTCSessionDescription({type:s.type,sdp:r}):s.sdp=r}return t.apply(this,arguments)}}function Ea(i,e){if(!(i.RTCPeerConnection&&i.RTCPeerConnection.prototype))return;const t=i.RTCPeerConnection.prototype.addIceCandidate;!t||t.length===0||(i.RTCPeerConnection.prototype.addIceCandidate=function(){return arguments[0]?(e.browser==="chrome"&&e.version<78||e.browser==="firefox"&&e.version<68||e.browser==="safari")&&arguments[0]&&arguments[0].candidate===""?Promise.resolve():t.apply(this,arguments):(arguments[1]&&arguments[1].apply(null),Promise.resolve())})}function Ma(i,e){if(!(i.RTCPeerConnection&&i.RTCPeerConnection.prototype))return;const t=i.RTCPeerConnection.prototype.setLocalDescription;!t||t.length===0||(i.RTCPeerConnection.prototype.setLocalDescription=function(){let s=arguments[0]||{};if(typeof s!="object"||s.type&&s.sdp)return t.apply(this,arguments);if(s={type:s.type,sdp:s.sdp},!s.type)switch(this.signalingState){case"stable":case"have-local-offer":case"have-remote-pranswer":s.type="offer";break;default:s.type="answer";break}return s.sdp||s.type!=="offer"&&s.type!=="answer"?t.apply(this,[s]):(s.type==="offer"?this.createOffer:this.createAnswer).apply(this).then(a=>t.apply(this,[a]))})}var t0=Object.freeze({__proto__:null,removeExtmapAllowMixed:cc,shimAddIceCandidateNullOrEmpty:Ea,shimConnectionState:oc,shimMaxMessageSize:Ta,shimParameterlessSetLocalDescription:Ma,shimRTCIceCandidate:xa,shimRTCIceCandidateRelayProtocol:ac,shimSendThrowTypeError:Ca});function n0(){let{window:i}=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{shimChrome:!0,shimFirefox:!0,shimSafari:!0};const t=bh,n=Jv(i),s={browserDetails:n,commonShim:t0,extractVersion:Ar,disableLog:Kv,disableWarnings:Yv,sdp:e0};switch(n.browser){case"chrome":if(!kh||!ic||!e.shimChrome)return t("Chrome shim is not included in this adapter release."),s;if(n.version===null)return t("Chrome shim can not determine version, not shimming."),s;t("adapter.js shimming chrome."),s.browserShim=kh,Ea(i,n),Ma(i),Th(i,n),Ch(i),ic(i,n),Eh(i),Rh(i,n),Mh(i),wh(i),Ph(i,n),xa(i),ac(i),oc(i),Ta(i,n),Ca(i),cc(i,n);break;case"firefox":if(!Gh||!sc||!e.shimFirefox)return t("Firefox shim is not included in this adapter release."),s;t("adapter.js shimming firefox."),s.browserShim=Gh,Ea(i,n),Ma(i),Ih(i,n),sc(i,n),Dh(i),Uh(i),Lh(i),Nh(i),Oh(i),Fh(i),Bh(i),Vh(i),zh(i),xa(i),oc(i),Ta(i,n),Ca(i);break;case"safari":if(!Zh||!e.shimSafari)return t("Safari shim is not included in this adapter release."),s;t("adapter.js shimming safari."),s.browserShim=Zh,Ea(i,n),Ma(i),Xh(i),Yh(i),qh(i),Hh(i),Wh(i),Kh(i),jh(i),Jh(i),xa(i),ac(i),Ta(i,n),Ca(i),cc(i,n);break;default:t("Unsupported browser!");break}return s}n0({window:typeof window>"u"?void 0:window});const i0=10,Rr="lk_e2ee",s0={sharedKey:!1,ratchetSalt:"LKFrameEncryptionKey",ratchetWindowSize:8,failureTolerance:i0,keyringSize:16};var Li;(function(i){i.SetKey="setKey",i.RatchetRequest="ratchetRequest",i.KeyRatcheted="keyRatcheted"})(Li||(Li={}));var tf;(function(i){i.KeyRatcheted="keyRatcheted"})(tf||(tf={}));var Ni;(function(i){i.ParticipantEncryptionStatusChanged="participantEncryptionStatusChanged",i.EncryptionError="encryptionError"})(Ni||(Ni={}));var nf;(function(i){i.Error="cryptorError"})(nf||(nf={}));function r0(){return a0()||lc()}function lc(){return typeof window.RTCRtpScriptTransform<"u"}function a0(){return typeof window.RTCRtpSender<"u"&&typeof window.RTCRtpSender.prototype.createEncodedStreams<"u"}class cE extends Hn.EventEmitter{constructor(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};super(),this.onKeyRatcheted=(t,n,s)=>{Ke.debug("key ratcheted event received",{ratchetResult:t,participantId:n,keyIndex:s})},this.keyInfoMap=new Map,this.options=Object.assign(Object.assign({},s0),e),this.on(Li.KeyRatcheted,this.onKeyRatcheted)}onSetEncryptionKey(e,t,n){const s={key:e,participantIdentity:t,keyIndex:n};if(!this.options.sharedKey&&!t)throw new Error("participant identity needs to be passed for encryption key if sharedKey option is false");this.keyInfoMap.set("".concat(t??"shared","-").concat(n??0),s),this.emit(Li.SetKey,s)}getKeys(){return Array.from(this.keyInfoMap.values())}getOptions(){return this.options}ratchetKey(e,t){this.emit(Li.RatchetRequest,e,t)}}class ui extends Error{constructor(e,t){super(t||"an error has occured"),this.name="LiveKitError",this.code=e}}var Je;(function(i){i[i.NotAllowed=0]="NotAllowed",i[i.ServerUnreachable=1]="ServerUnreachable",i[i.InternalError=2]="InternalError",i[i.Cancelled=3]="Cancelled",i[i.LeaveRequest=4]="LeaveRequest",i[i.Timeout=5]="Timeout"})(Je||(Je={}));class pt extends ui{constructor(e,t,n,s){super(1,e),this.name="ConnectionError",this.status=n,this.reason=t,this.context=s,this.reasonName=Je[t]}}class dc extends ui{constructor(e){super(21,e??"device is unsupported"),this.name="DeviceUnsupportedError"}}class hi extends ui{constructor(e){super(20,e??"track is invalid"),this.name="TrackInvalidError"}}class o0 extends ui{constructor(e){super(10,e??"unsupported server"),this.name="UnsupportedServer"}}class Bt extends ui{constructor(e){super(12,e??"unexpected connection state"),this.name="UnexpectedConnectionState"}}class uc extends ui{constructor(e){super(13,e??"unable to negotiate"),this.name="NegotiationError"}}class sf extends ui{constructor(e,t){super(15,e),this.name="PublishTrackError",this.status=t}}class rf extends ui{constructor(e,t){super(15,e),this.reason=t,this.reasonName=typeof t=="string"?t:Qo[t]}}var Pn;(function(i){i[i.AlreadyOpened=0]="AlreadyOpened",i[i.AbnormalEnd=1]="AbnormalEnd",i[i.DecodeFailed=2]="DecodeFailed",i[i.LengthExceeded=3]="LengthExceeded",i[i.Incomplete=4]="Incomplete",i[i.HandlerAlreadyRegistered=7]="HandlerAlreadyRegistered"})(Pn||(Pn={}));class Ui extends ui{constructor(e,t){super(16,e),this.name="DataStreamError",this.reason=t,this.reasonName=Pn[t]}}var wa;(function(i){i.PermissionDenied="PermissionDenied",i.NotFound="NotFound",i.DeviceInUse="DeviceInUse",i.Other="Other"})(wa||(wa={})),function(i){function e(t){if(t&&"name"in t)return t.name==="NotFoundError"||t.name==="DevicesNotFoundError"?i.NotFound:t.name==="NotAllowedError"||t.name==="PermissionDeniedError"?i.PermissionDenied:t.name==="NotReadableError"||t.name==="TrackStartError"?i.DeviceInUse:i.Other}i.getFailure=e}(wa||(wa={}));var af;(function(i){i[i.InvalidKey=0]="InvalidKey",i[i.MissingKey=1]="MissingKey",i[i.InternalError=2]="InternalError"})(af||(af={}));var ne;(function(i){i.Connected="connected",i.Reconnecting="reconnecting",i.SignalReconnecting="signalReconnecting",i.Reconnected="reconnected",i.Disconnected="disconnected",i.ConnectionStateChanged="connectionStateChanged",i.Moved="moved",i.MediaDevicesChanged="mediaDevicesChanged",i.ParticipantConnected="participantConnected",i.ParticipantDisconnected="participantDisconnected",i.TrackPublished="trackPublished",i.TrackSubscribed="trackSubscribed",i.TrackSubscriptionFailed="trackSubscriptionFailed",i.TrackUnpublished="trackUnpublished",i.TrackUnsubscribed="trackUnsubscribed",i.TrackMuted="trackMuted",i.TrackUnmuted="trackUnmuted",i.LocalTrackPublished="localTrackPublished",i.LocalTrackUnpublished="localTrackUnpublished",i.LocalAudioSilenceDetected="localAudioSilenceDetected",i.ActiveSpeakersChanged="activeSpeakersChanged",i.ParticipantMetadataChanged="participantMetadataChanged",i.ParticipantNameChanged="participantNameChanged",i.ParticipantAttributesChanged="participantAttributesChanged",i.ParticipantActive="participantActive",i.RoomMetadataChanged="roomMetadataChanged",i.DataReceived="dataReceived",i.SipDTMFReceived="sipDTMFReceived",i.TranscriptionReceived="transcriptionReceived",i.ConnectionQualityChanged="connectionQualityChanged",i.TrackStreamStateChanged="trackStreamStateChanged",i.TrackSubscriptionPermissionChanged="trackSubscriptionPermissionChanged",i.TrackSubscriptionStatusChanged="trackSubscriptionStatusChanged",i.AudioPlaybackStatusChanged="audioPlaybackChanged",i.VideoPlaybackStatusChanged="videoPlaybackChanged",i.MediaDevicesError="mediaDevicesError",i.ParticipantPermissionsChanged="participantPermissionsChanged",i.SignalConnected="signalConnected",i.RecordingStatusChanged="recordingStatusChanged",i.ParticipantEncryptionStatusChanged="participantEncryptionStatusChanged",i.EncryptionError="encryptionError",i.DCBufferStatusChanged="dcBufferStatusChanged",i.ActiveDeviceChanged="activeDeviceChanged",i.ChatMessage="chatMessage",i.LocalTrackSubscribed="localTrackSubscribed",i.MetricsReceived="metricsReceived"})(ne||(ne={}));var ce;(function(i){i.TrackPublished="trackPublished",i.TrackSubscribed="trackSubscribed",i.TrackSubscriptionFailed="trackSubscriptionFailed",i.TrackUnpublished="trackUnpublished",i.TrackUnsubscribed="trackUnsubscribed",i.TrackMuted="trackMuted",i.TrackUnmuted="trackUnmuted",i.LocalTrackPublished="localTrackPublished",i.LocalTrackUnpublished="localTrackUnpublished",i.LocalTrackCpuConstrained="localTrackCpuConstrained",i.LocalSenderCreated="localSenderCreated",i.ParticipantMetadataChanged="participantMetadataChanged",i.ParticipantNameChanged="participantNameChanged",i.DataReceived="dataReceived",i.SipDTMFReceived="sipDTMFReceived",i.TranscriptionReceived="transcriptionReceived",i.IsSpeakingChanged="isSpeakingChanged",i.ConnectionQualityChanged="connectionQualityChanged",i.TrackStreamStateChanged="trackStreamStateChanged",i.TrackSubscriptionPermissionChanged="trackSubscriptionPermissionChanged",i.TrackSubscriptionStatusChanged="trackSubscriptionStatusChanged",i.TrackCpuConstrained="trackCpuConstrained",i.MediaDevicesError="mediaDevicesError",i.AudioStreamAcquired="audioStreamAcquired",i.ParticipantPermissionsChanged="participantPermissionsChanged",i.PCTrackAdded="pcTrackAdded",i.AttributesChanged="attributesChanged",i.LocalTrackSubscribed="localTrackSubscribed",i.ChatMessage="chatMessage",i.Active="active"})(ce||(ce={}));var le;(function(i){i.TransportsCreated="transportsCreated",i.Connected="connected",i.Disconnected="disconnected",i.Resuming="resuming",i.Resumed="resumed",i.Restarting="restarting",i.Restarted="restarted",i.SignalResumed="signalResumed",i.SignalRestarted="signalRestarted",i.Closing="closing",i.MediaTrackAdded="mediaTrackAdded",i.ActiveSpeakersUpdate="activeSpeakersUpdate",i.DataPacketReceived="dataPacketReceived",i.RTPVideoMapUpdate="rtpVideoMapUpdate",i.DCBufferStatusChanged="dcBufferStatusChanged",i.ParticipantUpdate="participantUpdate",i.RoomUpdate="roomUpdate",i.SpeakersChanged="speakersChanged",i.StreamStateChanged="streamStateChanged",i.ConnectionQualityUpdate="connectionQualityUpdate",i.SubscriptionError="subscriptionError",i.SubscriptionPermissionUpdate="subscriptionPermissionUpdate",i.RemoteMute="remoteMute",i.SubscribedQualityUpdate="subscribedQualityUpdate",i.LocalTrackUnpublished="localTrackUnpublished",i.LocalTrackSubscribed="localTrackSubscribed",i.Offline="offline",i.SignalRequestResponse="signalRequestResponse",i.SignalConnected="signalConnected",i.RoomMoved="roomMoved"})(le||(le={}));var ae;(function(i){i.Message="message",i.Muted="muted",i.Unmuted="unmuted",i.Restarted="restarted",i.Ended="ended",i.Subscribed="subscribed",i.Unsubscribed="unsubscribed",i.CpuConstrained="cpuConstrained",i.UpdateSettings="updateSettings",i.UpdateSubscription="updateSubscription",i.AudioPlaybackStarted="audioPlaybackStarted",i.AudioPlaybackFailed="audioPlaybackFailed",i.AudioSilenceDetected="audioSilenceDetected",i.VisibilityChanged="visibilityChanged",i.VideoDimensionsChanged="videoDimensionsChanged",i.VideoPlaybackStarted="videoPlaybackStarted",i.VideoPlaybackFailed="videoPlaybackFailed",i.ElementAttached="elementAttached",i.ElementDetached="elementDetached",i.UpstreamPaused="upstreamPaused",i.UpstreamResumed="upstreamResumed",i.SubscriptionPermissionChanged="subscriptionPermissionChanged",i.SubscriptionStatusChanged="subscriptionStatusChanged",i.SubscriptionFailed="subscriptionFailed",i.TrackProcessorUpdate="trackProcessorUpdate",i.AudioTrackFeatureUpdate="audioTrackFeatureUpdate",i.TranscriptionReceived="transcriptionReceived",i.TimeSyncUpdate="timeSyncUpdate",i.PreConnectBufferFlushed="preConnectBufferFlushed"})(ae||(ae={}));function c0(i){return typeof i>"u"?i:typeof structuredClone=="function"?typeof i=="object"&&i!==null?structuredClone(Object.assign({},i)):structuredClone(i):JSON.parse(JSON.stringify(i))}const l0=/version\/(\d+(\.?_?\d+)+)/i;let hc;function fn(i){let e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0;if(typeof navigator>"u")return;const t=navigator.userAgent.toLowerCase();if(hc===void 0||e){const n=d0.find(s=>{let{test:r}=s;return r.test(t)});hc=n==null?void 0:n.describe(t)}return hc}const d0=[{test:/firefox|iceweasel|fxios/i,describe(i){return{name:"Firefox",version:Aa(/(?:firefox|iceweasel|fxios)[\s/](\d+(\.?_?\d+)+)/i,i),os:i.toLowerCase().includes("fxios")?"iOS":void 0,osVersion:fc(i)}}},{test:/chrom|crios|crmo/i,describe(i){return{name:"Chrome",version:Aa(/(?:chrome|chromium|crios|crmo)\/(\d+(\.?_?\d+)+)/i,i),os:i.toLowerCase().includes("crios")?"iOS":void 0,osVersion:fc(i)}}},{test:/safari|applewebkit/i,describe(i){return{name:"Safari",version:Aa(l0,i),os:i.includes("mobile/")?"iOS":"macOS",osVersion:fc(i)}}}];function Aa(i,e){let t=arguments.length>2&&arguments[2]!==void 0?arguments[2]:1;const n=e.match(i);return n&&n.length>=t&&n[t]||""}function fc(i){return i.includes("mac os")?Aa(/\(.+?(\d+_\d+(:?_\d+)?)/,i,1).replace(/_/g,"."):void 0}var u0="2.15.6";const h0=u0,f0=16;class $t{}$t.setTimeout=function(){return setTimeout(...arguments)},$t.setInterval=function(){return setInterval(...arguments)},$t.clearTimeout=function(){return clearTimeout(...arguments)},$t.clearInterval=function(){return clearInterval(...arguments)};const p0=5e3,Pr=[];var pn;(function(i){i[i.LOW=0]="LOW",i[i.MEDIUM=1]="MEDIUM",i[i.HIGH=2]="HIGH"})(pn||(pn={}));class Z extends Hn.EventEmitter{get streamState(){return this._streamState}setStreamState(e){this._streamState=e}constructor(e,t){let n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};var s;super(),this.attachedElements=[],this.isMuted=!1,this._streamState=Z.StreamState.Active,this.isInBackground=!1,this._currentBitrate=0,this.log=Ke,this.appVisibilityChangedListener=()=>{this.backgroundTimeout&&clearTimeout(this.backgroundTimeout),document.visibilityState==="hidden"?this.backgroundTimeout=setTimeout(()=>this.handleAppVisibilityChanged(),p0):this.handleAppVisibilityChanged()},this.log=li((s=n.loggerName)!==null&&s!==void 0?s:Rn.Track),this.loggerContextCb=n.loggerContextCb,this.setMaxListeners(100),this.kind=t,this._mediaStreamTrack=e,this._mediaStreamID=e.id,this.source=Z.Source.Unknown}get logContext(){var e;return Object.assign(Object.assign({},(e=this.loggerContextCb)===null||e===void 0?void 0:e.call(this)),Xe(this))}get currentBitrate(){return this._currentBitrate}get mediaStreamTrack(){return this._mediaStreamTrack}get mediaStreamID(){return this._mediaStreamID}attach(e){let t="audio";this.kind===Z.Kind.Video&&(t="video"),this.attachedElements.length===0&&this.kind===Z.Kind.Video&&this.addAppVisibilityListener(),e||(t==="audio"&&(Pr.forEach(r=>{r.parentElement===null&&!e&&(e=r)}),e&&Pr.splice(Pr.indexOf(e),1)),e||(e=document.createElement(t))),this.attachedElements.includes(e)||this.attachedElements.push(e),Ls(this.mediaStreamTrack,e);const n=e.srcObject.getTracks(),s=n.some(r=>r.kind==="audio");return e.play().then(()=>{this.emit(s?ae.AudioPlaybackStarted:ae.VideoPlaybackStarted)}).catch(r=>{r.name==="NotAllowedError"?this.emit(s?ae.AudioPlaybackFailed:ae.VideoPlaybackFailed,r):r.name==="AbortError"?Ke.debug("".concat(s?"audio":"video"," playback aborted, likely due to new play request")):Ke.warn("could not playback ".concat(s?"audio":"video"),r),s&&e&&n.some(a=>a.kind==="video")&&r.name==="NotAllowedError"&&(e.muted=!0,e.play().catch(()=>{}))}),this.emit(ae.ElementAttached,e),e}detach(e){try{if(e){Ns(this.mediaStreamTrack,e);const n=this.attachedElements.indexOf(e);return n>=0&&(this.attachedElements.splice(n,1),this.recycleElement(e),this.emit(ae.ElementDetached,e)),e}const t=[];return this.attachedElements.forEach(n=>{Ns(this.mediaStreamTrack,n),t.push(n),this.recycleElement(n),this.emit(ae.ElementDetached,n)}),this.attachedElements=[],t}finally{this.attachedElements.length===0&&this.removeAppVisibilityListener()}}stop(){this.stopMonitor(),this._mediaStreamTrack.stop()}enable(){this._mediaStreamTrack.enabled=!0}disable(){this._mediaStreamTrack.enabled=!1}stopMonitor(){this.monitorInterval&&clearInterval(this.monitorInterval),this.timeSyncHandle&&cancelAnimationFrame(this.timeSyncHandle)}updateLoggerOptions(e){e.loggerName&&(this.log=li(e.loggerName)),e.loggerContextCb&&(this.loggerContextCb=e.loggerContextCb)}recycleElement(e){if(e instanceof HTMLAudioElement){let t=!0;e.pause(),Pr.forEach(n=>{n.parentElement||(t=!1)}),t&&Pr.push(e)}}handleAppVisibilityChanged(){return P(this,void 0,void 0,function*(){this.isInBackground=document.visibilityState==="hidden",!this.isInBackground&&this.kind===Z.Kind.Video&&setTimeout(()=>this.attachedElements.forEach(e=>e.play().catch(()=>{})),0)})}addAppVisibilityListener(){cn()?(this.isInBackground=document.visibilityState==="hidden",document.addEventListener("visibilitychange",this.appVisibilityChangedListener)):this.isInBackground=!1}removeAppVisibilityListener(){cn()&&document.removeEventListener("visibilitychange",this.appVisibilityChangedListener)}}function Ls(i,e){let t;e.srcObject instanceof MediaStream?t=e.srcObject:t=new MediaStream;let n;i.kind==="audio"?n=t.getAudioTracks():n=t.getVideoTracks(),n.includes(i)||(n.forEach(s=>{t.removeTrack(s)}),t.addTrack(i)),(!os()||!(e instanceof HTMLVideoElement))&&(e.autoplay=!0),e.muted=t.getAudioTracks().length===0,e instanceof HTMLVideoElement&&(e.playsInline=!0),e.srcObject!==t&&(e.srcObject=t,(os()||as())&&e instanceof HTMLVideoElement&&setTimeout(()=>{e.srcObject=t,e.play().catch(()=>{})},0))}function Ns(i,e){if(e.srcObject instanceof MediaStream){const t=e.srcObject;t.removeTrack(i),t.getTracks().length>0?e.srcObject=t:e.srcObject=null}}(function(i){let e;(function(l){l.Audio="audio",l.Video="video",l.Unknown="unknown"})(e=i.Kind||(i.Kind={}));let t;(function(l){l.Camera="camera",l.Microphone="microphone",l.ScreenShare="screen_share",l.ScreenShareAudio="screen_share_audio",l.Unknown="unknown"})(t=i.Source||(i.Source={}));let n;(function(l){l.Active="active",l.Paused="paused",l.Unknown="unknown"})(n=i.StreamState||(i.StreamState={}));function s(l){switch(l){case e.Audio:return Mn.AUDIO;case e.Video:return Mn.VIDEO;default:return Mn.DATA}}i.kindToProto=s;function r(l){switch(l){case Mn.AUDIO:return e.Audio;case Mn.VIDEO:return e.Video;default:return e.Unknown}}i.kindFromProto=r;function a(l){switch(l){case t.Camera:return Lt.CAMERA;case t.Microphone:return Lt.MICROPHONE;case t.ScreenShare:return Lt.SCREEN_SHARE;case t.ScreenShareAudio:return Lt.SCREEN_SHARE_AUDIO;default:return Lt.UNKNOWN}}i.sourceToProto=a;function o(l){switch(l){case Lt.CAMERA:return t.Camera;case Lt.MICROPHONE:return t.Microphone;case Lt.SCREEN_SHARE:return t.ScreenShare;case Lt.SCREEN_SHARE_AUDIO:return t.ScreenShareAudio;default:return t.Unknown}}i.sourceFromProto=o;function c(l){switch(l){case jo.ACTIVE:return n.Active;case jo.PAUSED:return n.Paused;default:return n.Unknown}}i.streamStateFromProto=c})(Z||(Z={}));class ut{constructor(e,t,n,s,r){if(typeof e=="object")this.width=e.width,this.height=e.height,this.aspectRatio=e.aspectRatio,this.encoding={maxBitrate:e.maxBitrate,maxFramerate:e.maxFramerate,priority:e.priority};else if(t!==void 0&&n!==void 0)this.width=e,this.height=t,this.aspectRatio=e/t,this.encoding={maxBitrate:n,maxFramerate:s,priority:r};else throw new TypeError("Unsupported options: provide at least width, height and maxBitrate")}get resolution(){return{width:this.width,height:this.height,frameRate:this.encoding.maxFramerate,aspectRatio:this.aspectRatio}}}const m0=["vp8","h264"],g0=["vp8","h264","vp9","av1","h265"];function v0(i){return!!m0.find(e=>e===i)}var of;(function(i){i[i.PREFER_REGRESSION=0]="PREFER_REGRESSION",i[i.SIMULCAST=1]="SIMULCAST",i[i.REGRESSION=2]="REGRESSION"})(of||(of={}));var pc;(function(i){i.telephone={maxBitrate:12e3},i.speech={maxBitrate:24e3},i.music={maxBitrate:48e3},i.musicStereo={maxBitrate:64e3},i.musicHighQuality={maxBitrate:96e3},i.musicHighQualityStereo={maxBitrate:128e3}})(pc||(pc={}));const kr={h90:new ut(160,90,9e4,20),h180:new ut(320,180,16e4,20),h216:new ut(384,216,18e4,20),h360:new ut(640,360,45e4,20),h540:new ut(960,540,8e5,25),h720:new ut(1280,720,17e5,30),h1080:new ut(1920,1080,3e6,30),h1440:new ut(2560,1440,5e6,30),h2160:new ut(3840,2160,8e6,30)},mc={h120:new ut(160,120,7e4,20),h180:new ut(240,180,125e3,20),h240:new ut(320,240,14e4,20),h360:new ut(480,360,33e4,20),h480:new ut(640,480,5e5,20),h540:new ut(720,540,6e5,25),h720:new ut(960,720,13e5,30),h1080:new ut(1440,1080,23e5,30),h1440:new ut(1920,1440,38e5,30)},gc={h360fps3:new ut(640,360,2e5,3,"medium"),h360fps15:new ut(640,360,4e5,15,"medium"),h720fps5:new ut(1280,720,8e5,5,"medium"),h720fps15:new ut(1280,720,15e5,15,"medium"),h720fps30:new ut(1280,720,2e6,30,"medium"),h1080fps15:new ut(1920,1080,25e5,15,"medium"),h1080fps30:new ut(1920,1080,5e6,30,"medium"),original:new ut(0,0,7e6,30,"medium")},b0="|",cf="https://aomediacodec.github.io/av1-rtp-spec/#dependency-descriptor-rtp-header-extension";function _0(i){const e=i.split(b0);return e.length>1?[e[0],i.substr(e[0].length+1)]:[i,""]}function on(i){return P(this,void 0,void 0,function*(){return new Promise(e=>$t.setTimeout(e,i))})}function vc(){return"addTransceiver"in RTCPeerConnection.prototype}function bc(){return"addTrack"in RTCPeerConnection.prototype}function y0(){if(!("getCapabilities"in RTCRtpSender)||os()||as())return!1;const i=RTCRtpSender.getCapabilities("video");let e=!1;if(i){for(const t of i.codecs)if(t.mimeType==="video/AV1"){e=!0;break}}return e}function S0(){if(!("getCapabilities"in RTCRtpSender)||as())return!1;if(os()){const t=fn();if(t!=null&&t.version&&jn(t.version,"16")<0||(t==null?void 0:t.os)==="iOS"&&(t!=null&&t.osVersion)&&jn(t.osVersion,"16")<0)return!1}const i=RTCRtpSender.getCapabilities("video");let e=!1;if(i){for(const t of i.codecs)if(t.mimeType==="video/VP9"){e=!0;break}}return e}function Wn(i){return i==="av1"||i==="vp9"}function _c(i){return!document||Ir()?!1:(i||(i=document.createElement("audio")),"setSinkId"in i)}function x0(){return typeof RTCPeerConnection>"u"?!1:vc()||bc()}function as(){var i;return((i=fn())===null||i===void 0?void 0:i.name)==="Firefox"}function os(){var i;return((i=fn())===null||i===void 0?void 0:i.name)==="Safari"}function Ir(){const i=fn();return(i==null?void 0:i.name)==="Safari"||(i==null?void 0:i.os)==="iOS"}function T0(){const i=fn();return(i==null?void 0:i.name)==="Safari"&&i.version.startsWith("17.")||(i==null?void 0:i.os)==="iOS"&&!!(i!=null&&i.osVersion)&&jn(i.osVersion,"17")>=0}function C0(i){return i||(i=fn()),(i==null?void 0:i.name)==="Safari"&&jn(i.version,"18.3")>0||(i==null?void 0:i.os)==="iOS"&&!!(i!=null&&i.osVersion)&&jn(i.osVersion,"18.3")>0}function lf(){var i,e;return cn()?(e=(i=navigator.userAgentData)===null||i===void 0?void 0:i.mobile)!==null&&e!==void 0?e:/Tablet|iPad|Mobile|Android|BlackBerry/.test(navigator.userAgent):!1}function E0(){const i=fn(),e="17.2";if(i)return i.name!=="Safari"&&i.os!=="iOS"||i.os==="iOS"&&i.osVersion&&jn(i.osVersion,e)>=0?!0:i.name==="Safari"&&jn(i.version,e)>=0}function cn(){return typeof document<"u"}function qn(){return navigator.product=="ReactNative"}function yc(i){return i.hostname.endsWith(".livekit.cloud")||i.hostname.endsWith(".livekit.run")}function df(){if(global&&global.LiveKitReactNativeGlobal)return global.LiveKitReactNativeGlobal}function uf(){if(!qn())return;let i=df();if(i)return i.platform}function hf(){if(cn())return window.devicePixelRatio;if(qn()){let i=df();if(i)return i.devicePixelRatio}return 1}function jn(i,e){const t=i.split("."),n=e.split("."),s=Math.min(t.length,n.length);for(let r=0;r<s;++r){const a=parseInt(t[r],10),o=parseInt(n[r],10);if(a>o)return 1;if(a<o)return-1;if(r===s-1&&a===o)return 0}return i===""&&e!==""?-1:e===""?1:t.length==n.length?0:t.length<n.length?-1:1}function M0(i){for(const e of i)e.target.handleResize(e)}function w0(i){for(const e of i)e.target.handleVisibilityChanged(e)}let Sc=null;const ff=()=>(Sc||(Sc=new ResizeObserver(M0)),Sc);let xc=null;const pf=()=>(xc||(xc=new IntersectionObserver(w0,{root:null,rootMargin:"0px"})),xc);function A0(){var i;const e=new gv({sdk:Ku.JS,protocol:f0,version:h0});return qn()&&(e.os=(i=uf())!==null&&i!==void 0?i:""),e}function mf(){let i=arguments.length>0&&arguments[0]!==void 0?arguments[0]:16,e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:16,t=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!1,n=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!1;const s=document.createElement("canvas");s.width=i,s.height=e;const r=s.getContext("2d");r==null||r.fillRect(0,0,s.width,s.height),n&&r&&(r.beginPath(),r.arc(i/2,e/2,50,0,Math.PI*2,!0),r.closePath(),r.fillStyle="grey",r.fill());const a=s.captureStream(),[o]=a.getTracks();if(!o)throw Error("Could not get empty media stream video track");return o.enabled=t,o}let Dr;function Tc(){if(!Dr){const i=new AudioContext,e=i.createOscillator(),t=i.createGain();t.gain.setValueAtTime(0,0);const n=i.createMediaStreamDestination();if(e.connect(t),t.connect(n),e.start(),[Dr]=n.stream.getAudioTracks(),!Dr)throw Error("Could not get empty media stream audio track");Dr.enabled=!1}return Dr.clone()}class $n{get isResolved(){return this._isResolved}constructor(e,t){this._isResolved=!1,this.onFinally=t,this.promise=new Promise((n,s)=>P(this,void 0,void 0,function*(){this.resolve=n,this.reject=s,e&&(yield e(n,s))})).finally(()=>{var n;this._isResolved=!0,(n=this.onFinally)===null||n===void 0||n.call(this)})}}function R0(i){return g0.includes(i)}function Oi(i){if(typeof i=="string"||typeof i=="number")return i;if(Array.isArray(i))return i[0];if(i.exact!==void 0)return Array.isArray(i.exact)?i.exact[0]:i.exact;if(i.ideal!==void 0)return Array.isArray(i.ideal)?i.ideal[0]:i.ideal;throw Error("could not unwrap constraint")}function P0(i){return i.startsWith("http")?i.replace(/^(http)/,"ws"):i}function Cc(i){return i.startsWith("ws")?i.replace(/^(ws)/,"http"):i}function k0(i,e){return i.segments.map(t=>{let{id:n,text:s,language:r,startTime:a,endTime:o,final:c}=t;var l;const d=(l=e.get(n))!==null&&l!==void 0?l:Date.now(),u=Date.now();return c?e.delete(n):e.set(n,d),{id:n,text:s,startTime:Number.parseInt(a.toString()),endTime:Number.parseInt(o.toString()),final:c,language:r,firstReceivedTime:d,lastReceivedTime:u}})}function I0(i){const{id:e,timestamp:t,message:n,editTimestamp:s}=i;return{id:e,timestamp:Number.parseInt(t.toString()),editTimestamp:s?Number.parseInt(s.toString()):void 0,message:n}}function gf(i){switch(i.reason){case Je.LeaveRequest:return i.context;case Je.Cancelled:return wn.CLIENT_INITIATED;case Je.NotAllowed:return wn.USER_REJECTED;case Je.ServerUnreachable:return wn.JOIN_FAILURE;default:return wn.UNKNOWN_REASON}}function Ra(i){return i!==void 0?Number(i):void 0}function cs(i){return i!==void 0?BigInt(i):void 0}function Us(i){return!!i&&!(i instanceof MediaStreamTrack)&&i.isLocal}function Xn(i){return!!i&&i.kind==Z.Kind.Audio}function Fi(i){return!!i&&i.kind==Z.Kind.Video}function Bi(i){return Us(i)&&Fi(i)}function fi(i){return Us(i)&&Xn(i)}function Ec(i){return!!i&&!i.isLocal}function D0(i){return!!i&&!i.isLocal}function Mc(i){return Ec(i)&&Fi(i)}function L0(i){return i.isLocal}function N0(i,e){const t=[];let n=new TextEncoder().encode(i);for(;n.length>e;){let s=e;for(;s>0;){const r=n[s];if(r!==void 0&&(r&192)!==128)break;s--}t.push(n.slice(0,s)),n=n.slice(s)}return n.length>0&&t.push(n),t}function vf(i,e,t){var n,s,r,a;const{optionsWithoutProcessor:o,audioProcessor:c,videoProcessor:l}=yf(i??{}),d=e==null?void 0:e.processor,u=t==null?void 0:t.processor,h=o??{};return h.audio===!0&&(h.audio={}),h.video===!0&&(h.video={}),h.audio&&(wc(h.audio,e),(n=(r=h.audio).deviceId)!==null&&n!==void 0||(r.deviceId={ideal:"default"}),(c||d)&&(h.audio.processor=c??d)),h.video&&(wc(h.video,t),(s=(a=h.video).deviceId)!==null&&s!==void 0||(a.deviceId={ideal:"default"}),(l||u)&&(h.video.processor=l??u)),h}function wc(i,e){return Object.keys(e).forEach(t=>{i[t]===void 0&&(i[t]=e[t])}),i}function Ac(i){var e,t,n,s;const r={};if(i.video)if(typeof i.video=="object"){const a={},o=a,c=i.video;Object.keys(c).forEach(l=>{switch(l){case"resolution":wc(o,c.resolution);break;default:o[l]=c[l]}}),r.video=a,(e=(n=r.video).deviceId)!==null&&e!==void 0||(n.deviceId={ideal:"default"})}else r.video=i.video?{deviceId:{ideal:"default"}}:!1;else r.video=!1;return i.audio?typeof i.audio=="object"?(r.audio=i.audio,(t=(s=r.audio).deviceId)!==null&&t!==void 0||(s.deviceId={ideal:"default"})):r.audio={deviceId:{ideal:"default"}}:r.audio=!1,r}function bf(i){return P(this,arguments,void 0,function(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:200;return function*(){const n=_f();if(n){const s=n.createAnalyser();s.fftSize=2048;const r=s.frequencyBinCount,a=new Uint8Array(r);n.createMediaStreamSource(new MediaStream([e.mediaStreamTrack])).connect(s),yield on(t),s.getByteTimeDomainData(a);const c=a.some(l=>l!==128&&l!==0);return n.close(),!c}return!1}()})}function _f(){var i;const e=typeof window<"u"&&(window.AudioContext||window.webkitAudioContext);if(e){const t=new e({latencyHint:"interactive"});if(t.state==="suspended"&&typeof window<"u"&&(!((i=window.document)===null||i===void 0)&&i.body)){const n=()=>P(this,void 0,void 0,function*(){var s;try{t.state==="suspended"&&(yield t.resume())}catch(r){console.warn("Error trying to auto-resume audio context",r)}(s=window.document.body)===null||s===void 0||s.removeEventListener("click",n)});window.document.body.addEventListener("click",n)}return t}}function U0(i){return i==="audioinput"?Z.Source.Microphone:i==="videoinput"?Z.Source.Camera:Z.Source.Unknown}function Rc(i){return i===Z.Source.Microphone?"audioinput":i===Z.Source.Camera?"videoinput":void 0}function O0(i){var e,t;let n=(e=i.video)!==null&&e!==void 0?e:!0;return i.resolution&&i.resolution.width>0&&i.resolution.height>0&&(n=typeof n=="boolean"?{}:n,os()?n=Object.assign(Object.assign({},n),{width:{max:i.resolution.width},height:{max:i.resolution.height},frameRate:i.resolution.frameRate}):n=Object.assign(Object.assign({},n),{width:{ideal:i.resolution.width},height:{ideal:i.resolution.height},frameRate:i.resolution.frameRate})),{audio:(t=i.audio)!==null&&t!==void 0?t:!1,video:n,controller:i.controller,selfBrowserSurface:i.selfBrowserSurface,surfaceSwitching:i.surfaceSwitching,systemAudio:i.systemAudio,preferCurrentTab:i.preferCurrentTab}}function Lr(i){return i.split("/")[1].toLowerCase()}function F0(i){const e=[];return i.forEach(t=>{t.track!==void 0&&e.push(new Jo({cid:t.track.mediaStreamID,track:t.trackInfo}))}),e}function Xe(i){return"mediaStreamTrack"in i?{trackID:i.sid,source:i.source,muted:i.isMuted,enabled:i.mediaStreamTrack.enabled,kind:i.kind,streamID:i.mediaStreamID,streamTrackID:i.mediaStreamTrack.id}:{trackID:i.trackSid,enabled:i.isEnabled,muted:i.isMuted,trackInfo:Object.assign({mimeType:i.mimeType,name:i.trackName,encrypted:i.isEncrypted,kind:i.kind,source:i.source},i.track?Xe(i.track):{})}}function B0(){return typeof RTCRtpReceiver<"u"&&"getSynchronizationSources"in RTCRtpReceiver}function V0(i,e){var t;i===void 0&&(i={}),e===void 0&&(e={});const n=[...Object.keys(e),...Object.keys(i)],s={};for(const r of n)i[r]!==e[r]&&(s[r]=(t=e[r])!==null&&t!==void 0?t:"");return s}function yf(i){const e=Object.assign({},i);let t,n;return typeof e.audio=="object"&&e.audio.processor&&(t=e.audio.processor,e.audio=Object.assign(Object.assign({},e.audio),{processor:void 0})),typeof e.video=="object"&&e.video.processor&&(n=e.video.processor,e.video=Object.assign(Object.assign({},e.video),{processor:void 0})),{audioProcessor:t,videoProcessor:n,optionsWithoutProcessor:c0(e)}}function z0(i){switch(i){case Lt.CAMERA:return Z.Source.Camera;case Lt.MICROPHONE:return Z.Source.Microphone;case Lt.SCREEN_SHARE:return Z.Source.ScreenShare;case Lt.SCREEN_SHARE_AUDIO:return Z.Source.ScreenShareAudio;default:return Z.Source.Unknown}}function Sf(i,e){return i.width*i.height<e.width*e.height}function G0(i,e){var t;return(t=i.layers)===null||t===void 0?void 0:t.find(n=>n.quality===e)}class H0 extends Hn.EventEmitter{constructor(e){super(),this.onWorkerMessage=t=>{var n,s;const{kind:r,data:a}=t.data;switch(r){case"error":Ke.error(a.error.message),this.emit(Ni.EncryptionError,a.error);break;case"initAck":a.enabled&&this.keyProvider.getKeys().forEach(o=>{this.postKey(o)});break;case"enable":if(a.enabled&&this.keyProvider.getKeys().forEach(o=>{this.postKey(o)}),this.encryptionEnabled!==a.enabled&&a.participantIdentity===((n=this.room)===null||n===void 0?void 0:n.localParticipant.identity))this.emit(Ni.ParticipantEncryptionStatusChanged,a.enabled,this.room.localParticipant),this.encryptionEnabled=a.enabled;else if(a.participantIdentity){const o=(s=this.room)===null||s===void 0?void 0:s.getParticipantByIdentity(a.participantIdentity);if(!o)throw TypeError("couldn't set encryption status, participant not found".concat(a.participantIdentity));this.emit(Ni.ParticipantEncryptionStatusChanged,a.enabled,o)}break;case"ratchetKey":this.keyProvider.emit(Li.KeyRatcheted,a.ratchetResult,a.participantIdentity,a.keyIndex);break}},this.onWorkerError=t=>{Ke.error("e2ee worker encountered an error:",{error:t.error}),this.emit(Ni.EncryptionError,t.error)},this.keyProvider=e.keyProvider,this.worker=e.worker,this.encryptionEnabled=!1}setup(e){if(!r0())throw new dc("tried to setup end-to-end encryption on an unsupported browser");if(Ke.info("setting up e2ee"),e!==this.room){this.room=e,this.setupEventListeners(e,this.keyProvider);const t={kind:"init",data:{keyProviderOptions:this.keyProvider.getOptions(),loglevel:Wv.getLevel()}};this.worker&&(Ke.info("initializing worker",{worker:this.worker}),this.worker.onmessage=this.onWorkerMessage,this.worker.onerror=this.onWorkerError,this.worker.postMessage(t))}}setParticipantCryptorEnabled(e,t){Ke.debug("set e2ee to ".concat(e," for participant ").concat(t)),this.postEnable(e,t)}setSifTrailer(e){!e||e.length===0?Ke.warn("ignoring server sent trailer as it's empty"):this.postSifTrailer(e)}setupEngine(e){e.on(le.RTPVideoMapUpdate,t=>{this.postRTPMap(t)})}setupEventListeners(e,t){e.on(ne.TrackPublished,(n,s)=>this.setParticipantCryptorEnabled(n.trackInfo.encryption!==hn.NONE,s.identity)),e.on(ne.ConnectionStateChanged,n=>{n===st.Connected&&e.remoteParticipants.forEach(s=>{s.trackPublications.forEach(r=>{this.setParticipantCryptorEnabled(r.trackInfo.encryption!==hn.NONE,s.identity)})})}).on(ne.TrackUnsubscribed,(n,s,r)=>{var a;const o={kind:"removeTransform",data:{participantIdentity:r.identity,trackId:n.mediaStreamID}};(a=this.worker)===null||a===void 0||a.postMessage(o)}).on(ne.TrackSubscribed,(n,s,r)=>{this.setupE2EEReceiver(n,r.identity,s.trackInfo)}).on(ne.SignalConnected,()=>{if(!this.room)throw new TypeError("expected room to be present on signal connect");t.getKeys().forEach(n=>{this.postKey(n)}),this.setParticipantCryptorEnabled(this.room.localParticipant.isE2EEEnabled,this.room.localParticipant.identity)}),e.localParticipant.on(ce.LocalSenderCreated,(n,s)=>P(this,void 0,void 0,function*(){this.setupE2EESender(s,n)})),e.localParticipant.on(ce.LocalTrackPublished,n=>{if(!Fi(n.track)||!Ir())return;const s={kind:"updateCodec",data:{trackId:n.track.mediaStreamID,codec:Lr(n.trackInfo.codecs[0].mimeType),participantIdentity:this.room.localParticipant.identity}};this.worker.postMessage(s)}),t.on(Li.SetKey,n=>this.postKey(n)).on(Li.RatchetRequest,(n,s)=>this.postRatchetRequest(n,s))}postRatchetRequest(e,t){if(!this.worker)throw Error("could not ratchet key, worker is missing");const n={kind:"ratchetRequest",data:{participantIdentity:e,keyIndex:t}};this.worker.postMessage(n)}postKey(e){let{key:t,participantIdentity:n,keyIndex:s}=e;var r;if(!this.worker)throw Error("could not set key, worker is missing");const a={kind:"setKey",data:{participantIdentity:n,isPublisher:n===((r=this.room)===null||r===void 0?void 0:r.localParticipant.identity),key:t,keyIndex:s}};this.worker.postMessage(a)}postEnable(e,t){if(this.worker){const n={kind:"enable",data:{enabled:e,participantIdentity:t}};this.worker.postMessage(n)}else throw new ReferenceError("failed to enable e2ee, worker is not ready")}postRTPMap(e){var t;if(!this.worker)throw TypeError("could not post rtp map, worker is missing");if(!(!((t=this.room)===null||t===void 0)&&t.localParticipant.identity))throw TypeError("could not post rtp map, local participant identity is missing");const n={kind:"setRTPMap",data:{map:e,participantIdentity:this.room.localParticipant.identity}};this.worker.postMessage(n)}postSifTrailer(e){if(!this.worker)throw Error("could not post SIF trailer, worker is missing");const t={kind:"setSifTrailer",data:{trailer:e}};this.worker.postMessage(t)}setupE2EEReceiver(e,t,n){if(e.receiver){if(!(n!=null&&n.mimeType)||n.mimeType==="")throw new TypeError("MimeType missing from trackInfo, cannot set up E2EE cryptor");this.handleReceiver(e.receiver,e.mediaStreamID,t,e.kind==="video"?Lr(n.mimeType):void 0)}}setupE2EESender(e,t){if(!Us(e)||!t){t||Ke.warn("early return because sender is not ready");return}this.handleSender(t,e.mediaStreamID,void 0)}handleReceiver(e,t,n,s){return P(this,void 0,void 0,function*(){if(this.worker){if(lc()){const r={kind:"decode",participantIdentity:n,trackId:t,codec:s};e.transform=new RTCRtpScriptTransform(this.worker,r)}else{if(Rr in e&&s){const c={kind:"updateCodec",data:{trackId:t,codec:s,participantIdentity:n}};this.worker.postMessage(c);return}let r=e.writableStream,a=e.readableStream;if(!r||!a){const c=e.createEncodedStreams();e.writableStream=c.writable,r=c.writable,e.readableStream=c.readable,a=c.readable}const o={kind:"decode",data:{readableStream:a,writableStream:r,trackId:t,codec:s,participantIdentity:n,isReuse:Rr in e}};this.worker.postMessage(o,[a,r])}e[Rr]=!0}})}handleSender(e,t,n){var s;if(!(Rr in e||!this.worker)){if(!(!((s=this.room)===null||s===void 0)&&s.localParticipant.identity)||this.room.localParticipant.identity==="")throw TypeError("local identity needs to be known in order to set up encrypted sender");if(lc()){Ke.info("initialize script transform");const r={kind:"encode",participantIdentity:this.room.localParticipant.identity,trackId:t,codec:n};e.transform=new RTCRtpScriptTransform(this.worker,r)}else{Ke.info("initialize encoded streams");const r=e.createEncodedStreams(),a={kind:"encode",data:{readableStream:r.readable,writableStream:r.writable,codec:n,trackId:t,participantIdentity:this.room.localParticipant.identity,isReuse:!1}};this.worker.postMessage(a,[r.readable,r.writable])}e[Rr]=!0}}}const Pc="default";class Wt{constructor(){this._previousDevices=[]}static getInstance(){return this.instance===void 0&&(this.instance=new Wt),this.instance}get previousDevices(){return this._previousDevices}getDevices(e){return P(this,arguments,void 0,function(t){var n=this;let s=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0;return function*(){var r;if(((r=Wt.userMediaPromiseMap)===null||r===void 0?void 0:r.size)>0){Ke.debug("awaiting getUserMedia promise");try{t?yield Wt.userMediaPromiseMap.get(t):yield Promise.all(Wt.userMediaPromiseMap.values())}catch{Ke.warn("error waiting for media permissons")}}let a=yield navigator.mediaDevices.enumerateDevices();if(s&&!(os()&&n.hasDeviceInUse(t))&&(a.filter(c=>c.kind===t).length===0||a.some(c=>{const l=c.label==="",d=t?c.kind===t:!0;return l&&d}))){const c={video:t!=="audioinput"&&t!=="audiooutput",audio:t!=="videoinput"&&{deviceId:{ideal:"default"}}},l=yield navigator.mediaDevices.getUserMedia(c);a=yield navigator.mediaDevices.enumerateDevices(),l.getTracks().forEach(d=>{d.stop()})}return n._previousDevices=a,t&&(a=a.filter(o=>o.kind===t)),a}()})}normalizeDeviceId(e,t,n){return P(this,void 0,void 0,function*(){if(t!==Pc)return t;const s=yield this.getDevices(e),r=s.find(o=>o.deviceId===Pc);if(!r){Ke.warn("could not reliably determine default device");return}const a=s.find(o=>o.deviceId!==Pc&&o.groupId===(n??r.groupId));if(!a){Ke.warn("could not reliably determine default device");return}return a==null?void 0:a.deviceId})}hasDeviceInUse(e){return e?Wt.userMediaPromiseMap.has(e):Wt.userMediaPromiseMap.size>0}}Wt.mediaDeviceKinds=["audioinput","audiooutput","videoinput"],Wt.userMediaPromiseMap=new Map;var Nr;(function(i){i[i.WAITING=0]="WAITING",i[i.RUNNING=1]="RUNNING",i[i.COMPLETED=2]="COMPLETED"})(Nr||(Nr={}));class W0{constructor(){this.pendingTasks=new Map,this.taskMutex=new sn,this.nextTaskIndex=0}run(e){return P(this,void 0,void 0,function*(){const t={id:this.nextTaskIndex++,enqueuedAt:Date.now(),status:Nr.WAITING};this.pendingTasks.set(t.id,t);const n=yield this.taskMutex.lock();try{return t.executedAt=Date.now(),t.status=Nr.RUNNING,yield e()}finally{t.status=Nr.COMPLETED,this.pendingTasks.delete(t.id),n()}})}flush(){return P(this,void 0,void 0,function*(){return this.run(()=>P(this,void 0,void 0,function*(){}))})}snapshot(){return Array.from(this.pendingTasks.values())}}function q0(i,e){const t=new URL(P0(i));return e.forEach((n,s)=>{t.searchParams.set(s,n)}),xf(t,"rtc")}function j0(i){const e=new URL(Cc(i));return xf(e,"validate")}function $0(i){return i.endsWith("/")?i:"".concat(i,"/")}function xf(i,e){return i.pathname="".concat($0(i.pathname)).concat(e),i.toString()}const X0=["syncState","trickle","offer","answer","simulate","leave"];function K0(i){const e=X0.indexOf(i.case)>=0;return Ke.trace("request allowed to bypass queue:",{canPass:e,req:i}),e}var Tt;(function(i){i[i.CONNECTING=0]="CONNECTING",i[i.CONNECTED=1]="CONNECTED",i[i.RECONNECTING=2]="RECONNECTING",i[i.DISCONNECTING=3]="DISCONNECTING",i[i.DISCONNECTED=4]="DISCONNECTED"})(Tt||(Tt={}));class kc{get currentState(){return this.state}get isDisconnected(){return this.state===Tt.DISCONNECTING||this.state===Tt.DISCONNECTED}get isEstablishingConnection(){return this.state===Tt.CONNECTING||this.state===Tt.RECONNECTING}getNextRequestId(){return this._requestId+=1,this._requestId}constructor(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!1,t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};var n;this.rtt=0,this.state=Tt.DISCONNECTED,this.log=Ke,this._requestId=0,this.resetCallbacks=()=>{this.onAnswer=void 0,this.onLeave=void 0,this.onLocalTrackPublished=void 0,this.onLocalTrackUnpublished=void 0,this.onNegotiateRequested=void 0,this.onOffer=void 0,this.onRemoteMuteChanged=void 0,this.onSubscribedQualityUpdate=void 0,this.onTokenRefresh=void 0,this.onTrickle=void 0,this.onClose=void 0},this.log=li((n=t.loggerName)!==null&&n!==void 0?n:Rn.Signal),this.loggerContextCb=t.loggerContextCb,this.useJSON=e,this.requestQueue=new W0,this.queuedRequests=[],this.closingLock=new sn,this.connectionLock=new sn,this.state=Tt.DISCONNECTED}get logContext(){var e,t;return(t=(e=this.loggerContextCb)===null||e===void 0?void 0:e.call(this))!==null&&t!==void 0?t:{}}join(e,t,n,s){return P(this,void 0,void 0,function*(){return this.state=Tt.CONNECTING,this.options=n,yield this.connect(e,t,n,s)})}reconnect(e,t,n,s){return P(this,void 0,void 0,function*(){if(!this.options){this.log.warn("attempted to reconnect without signal options being set, ignoring",this.logContext);return}return this.state=Tt.RECONNECTING,this.clearPingInterval(),yield this.connect(e,t,Object.assign(Object.assign({},this.options),{reconnect:!0,sid:n,reconnectReason:s}))})}connect(e,t,n,s){this.connectOptions=n;const r=A0(),a=Y0(t,r,n),o=q0(e,a),c=j0(o);return new Promise((l,d)=>P(this,void 0,void 0,function*(){const u=yield this.connectionLock.lock();try{const h=()=>P(this,void 0,void 0,function*(){this.close(),clearTimeout(f),d(new pt("room connection has been cancelled (signal)",Je.Cancelled))}),f=setTimeout(()=>{this.close(),d(new pt("room connection has timed out (signal)",Je.ServerUnreachable))},n.websocketTimeout);s!=null&&s.aborted&&h(),s==null||s.addEventListener("abort",h);const g=new URL(o);g.searchParams.has("access_token")&&g.searchParams.set("access_token","<redacted>"),this.log.debug("connecting to ".concat(g),Object.assign({reconnect:n.reconnect,reconnectReason:n.reconnectReason},this.logContext)),this.ws&&(yield this.close(!1)),this.ws=new WebSocket(o),this.ws.binaryType="arraybuffer",this.ws.onopen=()=>{clearTimeout(f)},this.ws.onerror=v=>P(this,void 0,void 0,function*(){if(this.state!==Tt.CONNECTED){this.state=Tt.DISCONNECTED,clearTimeout(f);try{const m=yield fetch(c);if(m.status.toFixed(0).startsWith("4")){const p=yield m.text();d(new pt(p,Je.NotAllowed,m.status))}else d(new pt("Encountered unknown websocket error during connection: ".concat(v.toString()),Je.InternalError,m.status))}catch(m){d(new pt(m instanceof Error?m.message:"server was not reachable",Je.ServerUnreachable))}return}this.handleWSError(v)}),this.ws.onmessage=v=>P(this,void 0,void 0,function*(){var m,p,x;let C;if(typeof v.data=="string"){const b=JSON.parse(v.data);C=th.fromJson(b,{ignoreUnknownFields:!0})}else if(v.data instanceof ArrayBuffer)C=th.fromBinary(new Uint8Array(v.data));else{this.log.error("could not decode websocket message: ".concat(typeof v.data),this.logContext);return}if(this.state!==Tt.CONNECTED){let b=!1;if(((m=C.message)===null||m===void 0?void 0:m.case)==="join"?(this.state=Tt.CONNECTED,s==null||s.removeEventListener("abort",h),this.pingTimeoutDuration=C.message.value.pingTimeout,this.pingIntervalDuration=C.message.value.pingInterval,this.pingTimeoutDuration&&this.pingTimeoutDuration>0&&(this.log.debug("ping config",Object.assign(Object.assign({},this.logContext),{timeout:this.pingTimeoutDuration,interval:this.pingIntervalDuration})),this.startPingInterval()),l(C.message.value)):this.state===Tt.RECONNECTING&&C.message.case!=="leave"?(this.state=Tt.CONNECTED,s==null||s.removeEventListener("abort",h),this.startPingInterval(),((p=C.message)===null||p===void 0?void 0:p.case)==="reconnect"?l(C.message.value):(this.log.debug("declaring signal reconnected without reconnect response received",this.logContext),l(void 0),b=!0)):this.isEstablishingConnection&&C.message.case==="leave"?d(new pt("Received leave request while trying to (re)connect",Je.LeaveRequest,void 0,C.message.value.reason)):n.reconnect||d(new pt("did not receive join response, got ".concat((x=C.message)===null||x===void 0?void 0:x.case," instead"),Je.InternalError)),!b)return}this.signalLatency&&(yield on(this.signalLatency)),this.handleSignalResponse(C)}),this.ws.onclose=v=>{this.isEstablishingConnection&&d(new pt("Websocket got closed during a (re)connection attempt",Je.InternalError)),this.log.warn("websocket closed",Object.assign(Object.assign({},this.logContext),{reason:v.reason,code:v.code,wasClean:v.wasClean,state:this.state})),this.handleOnClose(v.reason)}}finally{u()}}))}close(){return P(this,arguments,void 0,function(){var e=this;let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!0;return function*(){const n=yield e.closingLock.lock();try{if(e.clearPingInterval(),t&&(e.state=Tt.DISCONNECTING),e.ws){e.ws.onmessage=null,e.ws.onopen=null,e.ws.onclose=null;const s=new Promise(r=>{e.ws?e.ws.onclose=()=>{r()}:r()});e.ws.readyState<e.ws.CLOSING&&(e.ws.close(),yield Promise.race([s,on(250)])),e.ws=void 0}}finally{t&&(e.state=Tt.DISCONNECTED),n()}}()})}sendOffer(e,t){this.log.debug("sending offer",Object.assign(Object.assign({},this.logContext),{offerSdp:e.sdp})),this.sendRequest({case:"offer",value:Pa(e,t)})}sendAnswer(e,t){return this.log.debug("sending answer",Object.assign(Object.assign({},this.logContext),{answerSdp:e.sdp})),this.sendRequest({case:"answer",value:Pa(e,t)})}sendIceCandidate(e,t){return this.log.debug("sending ice candidate",Object.assign(Object.assign({},this.logContext),{candidate:e})),this.sendRequest({case:"trickle",value:new Ko({candidateInit:JSON.stringify(e),target:t})})}sendMuteTrack(e,t){return this.sendRequest({case:"mute",value:new Yo({sid:e,muted:t})})}sendAddTrack(e){return this.sendRequest({case:"addTrack",value:e})}sendUpdateLocalMetadata(e,t){return P(this,arguments,void 0,function(n,s){var r=this;let a=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};return function*(){const o=r.getNextRequestId();return yield r.sendRequest({case:"updateMetadata",value:new rh({requestId:o,metadata:n,name:s,attributes:a})}),o}()})}sendUpdateTrackSettings(e){this.sendRequest({case:"trackSetting",value:e})}sendUpdateSubscription(e){return this.sendRequest({case:"subscription",value:e})}sendSyncState(e){return this.sendRequest({case:"syncState",value:e})}sendUpdateVideoLayers(e,t){return this.sendRequest({case:"updateLayers",value:new sh({trackSid:e,layers:t})})}sendUpdateSubscriptionPermissions(e,t){return this.sendRequest({case:"subscriptionPermission",value:new ch({allParticipants:e,trackPermissions:t})})}sendSimulateScenario(e){return this.sendRequest({case:"simulate",value:e})}sendPing(){return Promise.all([this.sendRequest({case:"ping",value:Et.parse(Date.now())}),this.sendRequest({case:"pingReq",value:new hh({timestamp:Et.parse(Date.now()),rtt:Et.parse(this.rtt)})})])}sendUpdateLocalAudioTrack(e,t){return this.sendRequest({case:"updateAudioTrack",value:new ih({trackSid:e,features:t})})}sendLeave(){return this.sendRequest({case:"leave",value:new ba({reason:wn.CLIENT_INITIATED,action:Is.DISCONNECT})})}sendRequest(e){return P(this,arguments,void 0,function(t){var n=this;let s=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1;return function*(){if(!s&&!K0(t)&&n.state===Tt.RECONNECTING){n.queuedRequests.push(()=>P(n,void 0,void 0,function*(){yield this.sendRequest(t,!0)}));return}if(s||(yield n.requestQueue.flush()),n.signalLatency&&(yield on(n.signalLatency)),n.isDisconnected){n.log.debug("skipping signal request (type: ".concat(t.case,") - SignalClient disconnected"));return}if(!n.ws||n.ws.readyState!==n.ws.OPEN){n.log.error("cannot send signal request before connected, type: ".concat(t==null?void 0:t.case),n.logContext);return}const a=new _v({message:t});try{n.useJSON?n.ws.send(a.toJsonString()):n.ws.send(a.toBinary())}catch(o){n.log.error("error sending signal message",Object.assign(Object.assign({},n.logContext),{error:o}))}}()})}handleSignalResponse(e){var t,n;const s=e.message;if(s==null){this.log.debug("received unsupported message",this.logContext);return}let r=!1;if(s.case==="answer"){const a=Tf(s.value);this.onAnswer&&this.onAnswer(a,s.value.id)}else if(s.case==="offer"){const a=Tf(s.value);this.onOffer&&this.onOffer(a,s.value.id)}else if(s.case==="trickle"){const a=JSON.parse(s.value.candidateInit);this.onTrickle&&this.onTrickle(a,s.value.target)}else s.case==="update"?this.onParticipantUpdate&&this.onParticipantUpdate((t=s.value.participants)!==null&&t!==void 0?t:[]):s.case==="trackPublished"?this.onLocalTrackPublished&&this.onLocalTrackPublished(s.value):s.case==="speakersChanged"?this.onSpeakersChanged&&this.onSpeakersChanged((n=s.value.speakers)!==null&&n!==void 0?n:[]):s.case==="leave"?this.onLeave&&this.onLeave(s.value):s.case==="mute"?this.onRemoteMuteChanged&&this.onRemoteMuteChanged(s.value.sid,s.value.muted):s.case==="roomUpdate"?this.onRoomUpdate&&s.value.room&&this.onRoomUpdate(s.value.room):s.case==="connectionQuality"?this.onConnectionQuality&&this.onConnectionQuality(s.value):s.case==="streamStateUpdate"?this.onStreamStateUpdate&&this.onStreamStateUpdate(s.value):s.case==="subscribedQualityUpdate"?this.onSubscribedQualityUpdate&&this.onSubscribedQualityUpdate(s.value):s.case==="subscriptionPermissionUpdate"?this.onSubscriptionPermissionUpdate&&this.onSubscriptionPermissionUpdate(s.value):s.case==="refreshToken"?this.onTokenRefresh&&this.onTokenRefresh(s.value):s.case==="trackUnpublished"?this.onLocalTrackUnpublished&&this.onLocalTrackUnpublished(s.value):s.case==="subscriptionResponse"?this.onSubscriptionError&&this.onSubscriptionError(s.value):s.case==="pong"||(s.case==="pongResp"?(this.rtt=Date.now()-Number.parseInt(s.value.lastPingTimestamp.toString()),this.resetPingTimeout(),r=!0):s.case==="requestResponse"?this.onRequestResponse&&this.onRequestResponse(s.value):s.case==="trackSubscribed"?this.onLocalTrackSubscribed&&this.onLocalTrackSubscribed(s.value.trackSid):s.case==="roomMoved"?(this.onTokenRefresh&&this.onTokenRefresh(s.value.token),this.onRoomMoved&&this.onRoomMoved(s.value)):this.log.debug("unsupported message",Object.assign(Object.assign({},this.logContext),{msgCase:s.case})));r||this.resetPingTimeout()}setReconnected(){for(;this.queuedRequests.length>0;){const e=this.queuedRequests.shift();e&&this.requestQueue.run(e)}}handleOnClose(e){return P(this,void 0,void 0,function*(){if(this.state===Tt.DISCONNECTED)return;const t=this.onClose;yield this.close(),this.log.debug("websocket connection closed: ".concat(e),Object.assign(Object.assign({},this.logContext),{reason:e})),t&&t(e)})}handleWSError(e){this.log.error("websocket error",Object.assign(Object.assign({},this.logContext),{error:e}))}resetPingTimeout(){if(this.clearPingTimeout(),!this.pingTimeoutDuration){this.log.warn("ping timeout duration not set",this.logContext);return}this.pingTimeout=$t.setTimeout(()=>{this.log.warn("ping timeout triggered. last pong received at: ".concat(new Date(Date.now()-this.pingTimeoutDuration*1e3).toUTCString()),this.logContext),this.handleOnClose("ping timeout")},this.pingTimeoutDuration*1e3)}clearPingTimeout(){this.pingTimeout&&$t.clearTimeout(this.pingTimeout)}startPingInterval(){if(this.clearPingInterval(),this.resetPingTimeout(),!this.pingIntervalDuration){this.log.warn("ping interval duration not set",this.logContext);return}this.log.debug("start ping interval",this.logContext),this.pingInterval=$t.setInterval(()=>{this.sendPing()},this.pingIntervalDuration*1e3)}clearPingInterval(){this.log.debug("clearing ping interval",this.logContext),this.clearPingTimeout(),this.pingInterval&&$t.clearInterval(this.pingInterval)}}function Tf(i){const e={type:"offer",sdp:i.sdp};switch(i.type){case"answer":case"offer":case"pranswer":case"rollback":e.type=i.type;break}return e}function Pa(i,e){return new ss({sdp:i.sdp,type:i.type,id:e})}function Y0(i,e,t){var n;const s=new URLSearchParams;return s.set("access_token",i),t.reconnect&&(s.set("reconnect","1"),t.sid&&s.set("sid",t.sid)),s.set("auto_subscribe",t.autoSubscribe?"1":"0"),s.set("sdk",qn()?"reactnative":"js"),s.set("version",e.version),s.set("protocol",e.protocol.toString()),e.deviceModel&&s.set("device_model",e.deviceModel),e.os&&s.set("os",e.os),e.osVersion&&s.set("os_version",e.osVersion),e.browser&&s.set("browser",e.browser),e.browserVersion&&s.set("browser_version",e.browserVersion),t.adaptiveStream&&s.set("adaptive_stream","1"),t.reconnectReason&&s.set("reconnect_reason",t.reconnectReason.toString()),!((n=navigator.connection)===null||n===void 0)&&n.type&&s.set("network",navigator.connection.type),s}class Cf{constructor(){this.buffer=[],this._totalSize=0}push(e){this.buffer.push(e),this._totalSize+=e.data.byteLength}pop(){const e=this.buffer.shift();return e&&(this._totalSize-=e.data.byteLength),e}getAll(){return this.buffer.slice()}popToSequence(e){for(;this.buffer.length>0&&this.buffer[0].sequence<=e;)this.pop()}alignBufferedAmount(e){for(;this.buffer.length>0;){const t=this.buffer[0];if(this._totalSize-t.data.byteLength<=e)break;this.pop()}}get length(){return this.buffer.length}}class J0{constructor(e){this._map=new Map,this._lastCleanup=0,this.ttl=e}set(e,t){const n=Date.now();n-this._lastCleanup>this.ttl/2&&this.cleanup();const s=n+this.ttl;return this._map.set(e,{value:t,expiresAt:s}),this}get(e){const t=this._map.get(e);if(t){if(t.expiresAt<Date.now()){this._map.delete(e);return}return t.value}}has(e){const t=this._map.get(e);return t?t.expiresAt<Date.now()?(this._map.delete(e),!1):!0:!1}delete(e){return this._map.delete(e)}clear(){this._map.clear()}cleanup(){const e=Date.now();for(const[t,n]of this._map.entries())n.expiresAt<e&&this._map.delete(t);this._lastCleanup=e}get size(){return this.cleanup(),this._map.size}forEach(e){this.cleanup();for(const[t,n]of this._map.entries())n.expiresAt>=Date.now()&&e(n.value,t,this.asValueMap())}map(e){this.cleanup();const t=[],n=this.asValueMap();for(const[s,r]of n.entries())t.push(e(r,s,n));return t}asValueMap(){const e=new Map;for(const[t,n]of this._map.entries())n.expiresAt>=Date.now()&&e.set(t,n.value);return e}}var kn={},Ic={},Dc={exports:{}},Ef;function Lc(){if(Ef)return Dc.exports;Ef=1;var i=Dc.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 e.address!=null?"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 e.subtype!=null?"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 e.sessionConfig!=null?"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+=e.raddr!=null?" raddr %s rport %d":"%v%v",t+=e.tcptype!=null?" tcptype %s":"%v",e.generation!=null&&(t+=" generation %d"),t+=e["network-id"]!=null?" network-id %d":"%v",t+=e["network-cost"]!=null?" network-cost %d":"%v",t}},{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 e.attribute!=null&&(t+=" %s",e.value!=null&&(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 e.maxMessageSize!=null?"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"+(e.clksrcExt!=null?"=%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+=e.id!=null?"id=%s %s":"%v%s",t+=e.mediaClockValue!=null?"=%s":"",t+=e.rateNumerator!=null?" rate=%s":"",t+=e.rateDenominator!=null?"/%s":"",t}},{name:"keywords",reg:/^keywds:(.+)$/,format:"keywds:%s"},{name:"content",reg:/^content:(.+)/,format:"content:%s"},{name:"bfcpFloorCtrl",reg:/^floorctrl:(c-only|s-only|c-s)/,format:"floorctrl:%s"},{name:"bfcpConfId",reg:/^confid:(\d+)/,format:"confid:%s"},{name:"bfcpUserId",reg:/^userid:(\d+)/,format:"userid:%s"},{name:"bfcpFloorId",reg:/^floorid:(.+) (?:m-stream|mstrm):(.+)/,names:["id","mStream"],format:"floorid:%s mstrm:%s"},{push:"invalid",names:["value"]}]};return Object.keys(i).forEach(function(e){var t=i[e];t.forEach(function(n){n.reg||(n.reg=/(.*)/),n.format||(n.format="%s")})}),Dc.exports}var Mf;function Z0(){return Mf||(Mf=1,function(i){var e=function(o){return String(Number(o))===o?Number(o):o},t=function(o,c,l,d){if(d&&!l)c[d]=e(o[1]);else for(var u=0;u<l.length;u+=1)o[u+1]!=null&&(c[l[u]]=e(o[u+1]))},n=function(o,c,l){var d=o.name&&o.names;o.push&&!c[o.push]?c[o.push]=[]:d&&!c[o.name]&&(c[o.name]={});var u=o.push?{}:d?c[o.name]:c;t(l.match(o.reg),u,o.names,o.name),o.push&&c[o.push].push(u)},s=Lc(),r=RegExp.prototype.test.bind(/^([a-z])=(.*)/);i.parse=function(o){var c={},l=[],d=c;return o.split(/(\r\n|\r|\n)/).filter(r).forEach(function(u){var h=u[0],f=u.slice(2);h==="m"&&(l.push({rtp:[],fmtp:[]}),d=l[l.length-1]);for(var g=0;g<(s[h]||[]).length;g+=1){var v=s[h][g];if(v.reg.test(f))return n(v,d,f)}}),c.media=l,c};var a=function(o,c){var l=c.split(/=(.+)/,2);return l.length===2?o[l[0]]=e(l[1]):l.length===1&&c.length>1&&(o[l[0]]=void 0),o};i.parseParams=function(o){return o.split(/;\s?/).reduce(a,{})},i.parseFmtpConfig=i.parseParams,i.parsePayloads=function(o){return o.toString().split(" ").map(Number)},i.parseRemoteCandidates=function(o){for(var c=[],l=o.split(" ").map(e),d=0;d<l.length;d+=3)c.push({component:l[d],ip:l[d+1],port:l[d+2]});return c},i.parseImageAttributes=function(o){return o.split(" ").map(function(c){return c.substring(1,c.length-1).split(",").reduce(a,{})})},i.parseSimulcastStreamList=function(o){return o.split(";").map(function(c){return c.split(",").map(function(l){var d,u=!1;return l[0]!=="~"?d=e(l):(d=e(l.substring(1,l.length)),u=!0),{scid:d,paused:u}})})}}(Ic)),Ic}var Nc,wf;function Q0(){if(wf)return Nc;wf=1;var i=Lc(),e=/%[sdv%]/g,t=function(a){var o=1,c=arguments,l=c.length;return a.replace(e,function(d){if(o>=l)return d;var u=c[o];switch(o+=1,d){case"%%":return"%";case"%s":return String(u);case"%d":return Number(u);case"%v":return""}})},n=function(a,o,c){var l=o.format instanceof Function?o.format(o.push?c:c[o.name]):o.format,d=[a+"="+l];if(o.names)for(var u=0;u<o.names.length;u+=1){var h=o.names[u];o.name?d.push(c[o.name][h]):d.push(c[o.names[u]])}else d.push(c[o.name]);return t.apply(null,d)},s=["v","o","s","i","u","e","p","c","b","t","r","z","a"],r=["i","c","b","a"];return Nc=function(a,o){o=o||{},a.version==null&&(a.version=0),a.name==null&&(a.name=" "),a.media.forEach(function(u){u.payloads==null&&(u.payloads="")});var c=o.outerOrder||s,l=o.innerOrder||r,d=[];return c.forEach(function(u){i[u].forEach(function(h){h.name in a&&a[h.name]!=null?d.push(n(u,h,a)):h.push in a&&a[h.push]!=null&&a[h.push].forEach(function(f){d.push(n(u,h,f))})})}),a.media.forEach(function(u){d.push(n("m",i.m[0],u)),l.forEach(function(h){i[h].forEach(function(f){f.name in u&&u[f.name]!=null?d.push(n(h,f,u)):f.push in u&&u[f.push]!=null&&u[f.push].forEach(function(g){d.push(n(h,f,g))})})})}),d.join(`\r
83
83
  `)+`\r
84
- `},Nc}var Af;function eb(){if(Af)return kn;Af=1;var i=Z0(),e=Q0(),t=Lc();return kn.grammar=t,kn.write=e,kn.parse=i.parse,kn.parseParams=i.parseParams,kn.parseFmtpConfig=i.parseFmtpConfig,kn.parsePayloads=i.parsePayloads,kn.parseRemoteCandidates=i.parseRemoteCandidates,kn.parseImageAttributes=i.parseImageAttributes,kn.parseSimulcastStreamList=i.parseSimulcastStreamList,kn}var Vi=eb();function Uc(i,e,t){var n,s,r;e===void 0&&(e=50),t===void 0&&(t={});var a=(n=t.isImmediate)!=null&&n,o=(s=t.callback)!=null&&s,c=t.maxWait,l=Date.now(),d=[];function u(){if(c!==void 0){var f=Date.now()-l;if(f+e>=c)return c-f}return e}var h=function(){var f=[].slice.call(arguments),g=this;return new Promise(function(v,m){var p=a&&r===void 0;if(r!==void 0&&clearTimeout(r),r=setTimeout(function(){if(r=void 0,l=Date.now(),!a){var C=i.apply(g,f);o&&o(C),d.forEach(function(b){return(0,b.resolve)(C)}),d=[]}},u()),p){var x=i.apply(g,f);return o&&o(x),v(x)}d.push({resolve:v,reject:m})})};return h.cancel=function(f){r!==void 0&&clearTimeout(r),d.forEach(function(g){return(0,g.reject)(f)}),d=[]},h}const tb=.7,nb=20,Os={NegotiationStarted:"negotiationStarted",NegotiationComplete:"negotiationComplete",RTPVideoPayloadTypes:"rtpVideoPayloadTypes"};class Rf extends Hn.EventEmitter{get pc(){return this._pc||(this._pc=this.createPC()),this._pc}constructor(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};var n;super(),this.log=Ke,this.ddExtID=0,this.latestOfferId=0,this.pendingCandidates=[],this.restartingIce=!1,this.renegotiate=!1,this.trackBitrates=[],this.remoteStereoMids=[],this.remoteNackMids=[],this.negotiate=Uc(s=>P(this,void 0,void 0,function*(){this.emit(Os.NegotiationStarted);try{yield this.createAndSendOffer()}catch(r){if(s)s(r);else throw r}}),nb),this.close=()=>{this._pc&&(this._pc.close(),this._pc.onconnectionstatechange=null,this._pc.oniceconnectionstatechange=null,this._pc.onicegatheringstatechange=null,this._pc.ondatachannel=null,this._pc.onnegotiationneeded=null,this._pc.onsignalingstatechange=null,this._pc.onicecandidate=null,this._pc.ondatachannel=null,this._pc.ontrack=null,this._pc.onconnectionstatechange=null,this._pc.oniceconnectionstatechange=null,this._pc=null)},this.log=li((n=t.loggerName)!==null&&n!==void 0?n:Rn.PCTransport),this.loggerOptions=t,this.config=e,this._pc=this.createPC(),this.offerLock=new sn}createPC(){const e=new RTCPeerConnection(this.config);return e.onicecandidate=t=>{var n;t.candidate&&((n=this.onIceCandidate)===null||n===void 0||n.call(this,t.candidate))},e.onicecandidateerror=t=>{var n;(n=this.onIceCandidateError)===null||n===void 0||n.call(this,t)},e.oniceconnectionstatechange=()=>{var t;(t=this.onIceConnectionStateChange)===null||t===void 0||t.call(this,e.iceConnectionState)},e.onsignalingstatechange=()=>{var t;(t=this.onSignalingStatechange)===null||t===void 0||t.call(this,e.signalingState)},e.onconnectionstatechange=()=>{var t;(t=this.onConnectionStateChange)===null||t===void 0||t.call(this,e.connectionState)},e.ondatachannel=t=>{var n;(n=this.onDataChannel)===null||n===void 0||n.call(this,t)},e.ontrack=t=>{var n;(n=this.onTrack)===null||n===void 0||n.call(this,t)},e}get logContext(){var e,t;return Object.assign({},(t=(e=this.loggerOptions).loggerContextCb)===null||t===void 0?void 0:t.call(e))}get isICEConnected(){return this._pc!==null&&(this.pc.iceConnectionState==="connected"||this.pc.iceConnectionState==="completed")}addIceCandidate(e){return P(this,void 0,void 0,function*(){if(this.pc.remoteDescription&&!this.restartingIce)return this.pc.addIceCandidate(e);this.pendingCandidates.push(e)})}setRemoteDescription(e,t){return P(this,void 0,void 0,function*(){var n;if(e.type==="answer"&&this.latestOfferId>0&&t>0&&t!==this.latestOfferId)return this.log.warn("ignoring answer for old offer",Object.assign(Object.assign({},this.logContext),{offerId:t,latestOfferId:this.latestOfferId})),!1;let s;if(e.type==="offer"){let{stereoMids:r,nackMids:a}=ib(e);this.remoteStereoMids=r,this.remoteNackMids=a}else if(e.type==="answer"){const r=Vi.parse((n=e.sdp)!==null&&n!==void 0?n:"");r.media.forEach(a=>{a.type==="audio"&&this.trackBitrates.some(o=>{if(!o.transceiver||a.mid!=o.transceiver.mid)return!1;let c=0;if(a.rtp.some(d=>d.codec.toUpperCase()===o.codec.toUpperCase()?(c=d.payload,!0):!1),c===0)return!0;let l=!1;for(const d of a.fmtp)if(d.payload===c){d.config=d.config.split(";").filter(u=>!u.includes("maxaveragebitrate")).join(";"),o.maxbr>0&&(d.config+=";maxaveragebitrate=".concat(o.maxbr*1e3)),l=!0;break}return l||o.maxbr>0&&a.fmtp.push({payload:c,config:"maxaveragebitrate=".concat(o.maxbr*1e3)}),!0})}),s=Vi.write(r)}return yield this.setMungedSDP(e,s,!0),this.pendingCandidates.forEach(r=>{this.pc.addIceCandidate(r)}),this.pendingCandidates=[],this.restartingIce=!1,this.renegotiate?(this.renegotiate=!1,yield this.createAndSendOffer()):e.type==="answer"&&(this.emit(Os.NegotiationComplete),e.sdp&&Vi.parse(e.sdp).media.forEach(a=>{a.type==="video"&&this.emit(Os.RTPVideoPayloadTypes,a.rtp)})),!0})}createAndSendOffer(e){return P(this,void 0,void 0,function*(){var t;const n=yield this.offerLock.lock();try{if(this.onOffer===void 0)return;if(e!=null&&e.iceRestart&&(this.log.debug("restarting ICE",this.logContext),this.restartingIce=!0),this._pc&&this._pc.signalingState==="have-local-offer"){const o=this._pc.remoteDescription;if(e!=null&&e.iceRestart&&o)yield this._pc.setRemoteDescription(o);else{this.renegotiate=!0;return}}else if(!this._pc||this._pc.signalingState==="closed"){this.log.warn("could not createOffer with closed peer connection",this.logContext);return}this.log.debug("starting to negotiate",this.logContext);const s=this.latestOfferId+1;this.latestOfferId=s;const r=yield this.pc.createOffer(e);this.log.debug("original offer",Object.assign({sdp:r.sdp},this.logContext));const a=Vi.parse((t=r.sdp)!==null&&t!==void 0?t:"");if(a.media.forEach(o=>{kf(o),o.type==="audio"?Pf(o,[],[]):o.type==="video"&&this.trackBitrates.some(c=>{if(!o.msid||!c.cid||!o.msid.includes(c.cid))return!1;let l=0;if(o.rtp.some(u=>u.codec.toUpperCase()===c.codec.toUpperCase()?(l=u.payload,!0):!1),l===0||(Wn(c.codec)&&!os()&&this.ensureVideoDDExtensionForSVC(o,a),c.codec!=="av1"))return!0;const d=Math.round(c.maxbr*tb);for(const u of o.fmtp)if(u.payload===l){u.config.includes("x-google-start-bitrate")||(u.config+=";x-google-start-bitrate=".concat(d));break}return!0})}),this.latestOfferId>s){this.log.warn("latestOfferId mismatch",Object.assign(Object.assign({},this.logContext),{latestOfferId:this.latestOfferId,offerId:s}));return}yield this.setMungedSDP(r,Vi.write(a)),this.onOffer(r,this.latestOfferId)}finally{n()}})}createAndSetAnswer(){return P(this,void 0,void 0,function*(){var e;const t=yield this.pc.createAnswer(),n=Vi.parse((e=t.sdp)!==null&&e!==void 0?e:"");return n.media.forEach(s=>{kf(s),s.type==="audio"&&Pf(s,this.remoteStereoMids,this.remoteNackMids)}),yield this.setMungedSDP(t,Vi.write(n)),t})}createDataChannel(e,t){return this.pc.createDataChannel(e,t)}addTransceiver(e,t){return this.pc.addTransceiver(e,t)}addTrack(e){if(!this._pc)throw new Bt("PC closed, cannot add track");return this._pc.addTrack(e)}setTrackCodecBitrate(e){this.trackBitrates.push(e)}setConfiguration(e){var t;if(!this._pc)throw new Bt("PC closed, cannot configure");return(t=this._pc)===null||t===void 0?void 0:t.setConfiguration(e)}canRemoveTrack(){var e;return!!(!((e=this._pc)===null||e===void 0)&&e.removeTrack)}removeTrack(e){var t;return(t=this._pc)===null||t===void 0?void 0:t.removeTrack(e)}getConnectionState(){var e,t;return(t=(e=this._pc)===null||e===void 0?void 0:e.connectionState)!==null&&t!==void 0?t:"closed"}getICEConnectionState(){var e,t;return(t=(e=this._pc)===null||e===void 0?void 0:e.iceConnectionState)!==null&&t!==void 0?t:"closed"}getSignallingState(){var e,t;return(t=(e=this._pc)===null||e===void 0?void 0:e.signalingState)!==null&&t!==void 0?t:"closed"}getTransceivers(){var e,t;return(t=(e=this._pc)===null||e===void 0?void 0:e.getTransceivers())!==null&&t!==void 0?t:[]}getSenders(){var e,t;return(t=(e=this._pc)===null||e===void 0?void 0:e.getSenders())!==null&&t!==void 0?t:[]}getLocalDescription(){var e;return(e=this._pc)===null||e===void 0?void 0:e.localDescription}getRemoteDescription(){var e;return(e=this.pc)===null||e===void 0?void 0:e.remoteDescription}getStats(){return this.pc.getStats()}getConnectedAddress(){return P(this,void 0,void 0,function*(){var e;if(!this._pc)return;let t="";const n=new Map,s=new Map;if((yield this._pc.getStats()).forEach(o=>{switch(o.type){case"transport":t=o.selectedCandidatePairId;break;case"candidate-pair":t===""&&o.selected&&(t=o.id),n.set(o.id,o);break;case"remote-candidate":s.set(o.id,"".concat(o.address,":").concat(o.port));break}}),t==="")return;const a=(e=n.get(t))===null||e===void 0?void 0:e.remoteCandidateId;if(a!==void 0)return s.get(a)})}setMungedSDP(e,t,n){return P(this,void 0,void 0,function*(){if(t){const s=e.sdp;e.sdp=t;try{this.log.debug("setting munged ".concat(n?"remote":"local"," description"),this.logContext),n?yield this.pc.setRemoteDescription(e):yield this.pc.setLocalDescription(e);return}catch(r){this.log.warn("not able to set ".concat(e.type,", falling back to unmodified sdp"),Object.assign(Object.assign({},this.logContext),{error:r,sdp:t})),e.sdp=s}}try{n?yield this.pc.setRemoteDescription(e):yield this.pc.setLocalDescription(e)}catch(s){let r="unknown error";s instanceof Error?r=s.message:typeof s=="string"&&(r=s);const a={error:r,sdp:e.sdp};throw!n&&this.pc.remoteDescription&&(a.remoteSdp=this.pc.remoteDescription),this.log.error("unable to set ".concat(e.type),Object.assign(Object.assign({},this.logContext),{fields:a})),new uc(r)}})}ensureVideoDDExtensionForSVC(e,t){var n,s;if(!((n=e.ext)===null||n===void 0?void 0:n.some(a=>a.uri===cf))){if(this.ddExtID===0){let a=0;t.media.forEach(o=>{var c;o.type==="video"&&((c=o.ext)===null||c===void 0||c.forEach(l=>{l.value>a&&(a=l.value)}))}),this.ddExtID=a+1}(s=e.ext)===null||s===void 0||s.push({value:this.ddExtID,uri:cf})}}}function Pf(i,e,t){let n=0;i.rtp.some(s=>s.codec==="opus"?(n=s.payload,!0):!1),n>0&&(i.rtcpFb||(i.rtcpFb=[]),t.includes(i.mid)&&!i.rtcpFb.some(s=>s.payload===n&&s.type==="nack")&&i.rtcpFb.push({payload:n,type:"nack"}),e.includes(i.mid)&&i.fmtp.some(s=>s.payload===n?(s.config.includes("stereo=1")||(s.config+=";stereo=1"),!0):!1))}function ib(i){var e;const t=[],n=[],s=Vi.parse((e=i.sdp)!==null&&e!==void 0?e:"");let r=0;return s.media.forEach(a=>{var o;a.type==="audio"&&(a.rtp.some(c=>c.codec==="opus"?(r=c.payload,!0):!1),!((o=a.rtcpFb)===null||o===void 0)&&o.some(c=>c.payload===r&&c.type==="nack")&&n.push(a.mid),a.fmtp.some(c=>c.payload===r?(c.config.includes("sprop-stereo=1")&&t.push(a.mid),!0):!1))}),{stereoMids:t,nackMids:n}}function kf(i){if(i.connection){const e=i.connection.ip.indexOf(":")>=0;(i.connection.version===4&&e||i.connection.version===6&&!e)&&(i.connection.ip="0.0.0.0",i.connection.version=4)}}const Oc="vp8",sb={audioPreset:pc.music,dtx:!0,red:!0,forceStereo:!1,simulcast:!0,screenShareEncoding:gc.h1080fps15.encoding,stopMicTrackOnMute:!1,videoCodec:Oc,backupCodec:!0,preConnectBuffer:!1},If={deviceId:{ideal:"default"},autoGainControl:!0,echoCancellation:!0,noiseSuppression:!0,voiceIsolation:!0},Df={deviceId:{ideal:"default"},resolution:kr.h720.resolution},rb={adaptiveStream:!1,dynacast:!1,stopLocalTrackOnUnpublish:!0,reconnectPolicy:new jv,disconnectOnPageLeave:!0,webAudioMix:!1},Fc={autoSubscribe:!0,maxRetries:1,peerConnectionTimeout:15e3,websocketTimeout:15e3};var wt;(function(i){i[i.NEW=0]="NEW",i[i.CONNECTING=1]="CONNECTING",i[i.CONNECTED=2]="CONNECTED",i[i.FAILED=3]="FAILED",i[i.CLOSING=4]="CLOSING",i[i.CLOSED=5]="CLOSED"})(wt||(wt={}));class ab{get needsPublisher(){return this.isPublisherConnectionRequired}get needsSubscriber(){return this.isSubscriberConnectionRequired}get currentState(){return this.state}constructor(e,t,n){var s;this.peerConnectionTimeout=Fc.peerConnectionTimeout,this.log=Ke,this.updateState=()=>{var r;const a=this.state,o=this.requiredTransports.map(c=>c.getConnectionState());o.every(c=>c==="connected")?this.state=wt.CONNECTED:o.some(c=>c==="failed")?this.state=wt.FAILED:o.some(c=>c==="connecting")?this.state=wt.CONNECTING:o.every(c=>c==="closed")?this.state=wt.CLOSED:o.some(c=>c==="closed")?this.state=wt.CLOSING:o.every(c=>c==="new")&&(this.state=wt.NEW),a!==this.state&&(this.log.debug("pc state change: from ".concat(wt[a]," to ").concat(wt[this.state]),this.logContext),(r=this.onStateChange)===null||r===void 0||r.call(this,this.state,this.publisher.getConnectionState(),this.subscriber.getConnectionState()))},this.log=li((s=n.loggerName)!==null&&s!==void 0?s:Rn.PCManager),this.loggerOptions=n,this.isPublisherConnectionRequired=!t,this.isSubscriberConnectionRequired=t,this.publisher=new Rf(e,n),this.subscriber=new Rf(e,n),this.publisher.onConnectionStateChange=this.updateState,this.subscriber.onConnectionStateChange=this.updateState,this.publisher.onIceConnectionStateChange=this.updateState,this.subscriber.onIceConnectionStateChange=this.updateState,this.publisher.onSignalingStatechange=this.updateState,this.subscriber.onSignalingStatechange=this.updateState,this.publisher.onIceCandidate=r=>{var a;(a=this.onIceCandidate)===null||a===void 0||a.call(this,r,An.PUBLISHER)},this.subscriber.onIceCandidate=r=>{var a;(a=this.onIceCandidate)===null||a===void 0||a.call(this,r,An.SUBSCRIBER)},this.subscriber.onDataChannel=r=>{var a;(a=this.onDataChannel)===null||a===void 0||a.call(this,r)},this.subscriber.onTrack=r=>{var a;(a=this.onTrack)===null||a===void 0||a.call(this,r)},this.publisher.onOffer=(r,a)=>{var o;(o=this.onPublisherOffer)===null||o===void 0||o.call(this,r,a)},this.state=wt.NEW,this.connectionLock=new sn,this.remoteOfferLock=new sn}get logContext(){var e,t;return Object.assign({},(t=(e=this.loggerOptions).loggerContextCb)===null||t===void 0?void 0:t.call(e))}requirePublisher(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!0;this.isPublisherConnectionRequired=e,this.updateState()}requireSubscriber(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!0;this.isSubscriberConnectionRequired=e,this.updateState()}createAndSendPublisherOffer(e){return this.publisher.createAndSendOffer(e)}setPublisherAnswer(e,t){return this.publisher.setRemoteDescription(e,t)}removeTrack(e){return this.publisher.removeTrack(e)}close(){return P(this,void 0,void 0,function*(){if(this.publisher&&this.publisher.getSignallingState()!=="closed"){const e=this.publisher;for(const t of e.getSenders())try{e.canRemoveTrack()&&e.removeTrack(t)}catch(n){this.log.warn("could not removeTrack",Object.assign(Object.assign({},this.logContext),{error:n}))}}yield Promise.all([this.publisher.close(),this.subscriber.close()]),this.updateState()})}triggerIceRestart(){return P(this,void 0,void 0,function*(){this.subscriber.restartingIce=!0,this.needsPublisher&&(yield this.createAndSendPublisherOffer({iceRestart:!0}))})}addIceCandidate(e,t){return P(this,void 0,void 0,function*(){t===An.PUBLISHER?yield this.publisher.addIceCandidate(e):yield this.subscriber.addIceCandidate(e)})}createSubscriberAnswerFromOffer(e,t){return P(this,void 0,void 0,function*(){this.log.debug("received server offer",Object.assign(Object.assign({},this.logContext),{RTCSdpType:e.type,sdp:e.sdp,signalingState:this.subscriber.getSignallingState().toString()}));const n=yield this.remoteOfferLock.lock();try{return(yield this.subscriber.setRemoteDescription(e,t))?yield this.subscriber.createAndSetAnswer():void 0}finally{n()}})}updateConfiguration(e,t){this.publisher.setConfiguration(e),this.subscriber.setConfiguration(e),t&&this.triggerIceRestart()}ensurePCTransportConnection(e,t){return P(this,void 0,void 0,function*(){var n;const s=yield this.connectionLock.lock();try{this.isPublisherConnectionRequired&&this.publisher.getConnectionState()!=="connected"&&this.publisher.getConnectionState()!=="connecting"&&(this.log.debug("negotiation required, start negotiating",this.logContext),this.publisher.negotiate()),yield Promise.all((n=this.requiredTransports)===null||n===void 0?void 0:n.map(r=>this.ensureTransportConnected(r,e,t)))}finally{s()}})}negotiate(e){return P(this,void 0,void 0,function*(){return new Promise((t,n)=>P(this,void 0,void 0,function*(){const s=setTimeout(()=>{n("negotiation timed out")},this.peerConnectionTimeout),r=()=>{clearTimeout(s),n("negotiation aborted")};e.signal.addEventListener("abort",r),this.publisher.once(Os.NegotiationStarted,()=>{e.signal.aborted||this.publisher.once(Os.NegotiationComplete,()=>{clearTimeout(s),t()})}),yield this.publisher.negotiate(a=>{clearTimeout(s),n(a)})}))})}addPublisherTransceiver(e,t){return this.publisher.addTransceiver(e,t)}addPublisherTrack(e){return this.publisher.addTrack(e)}createPublisherDataChannel(e,t){return this.publisher.createDataChannel(e,t)}getConnectedAddress(e){return e===An.PUBLISHER?this.publisher.getConnectedAddress():e===An.SUBSCRIBER?this.publisher.getConnectedAddress():this.requiredTransports[0].getConnectedAddress()}get requiredTransports(){const e=[];return this.isPublisherConnectionRequired&&e.push(this.publisher),this.isSubscriberConnectionRequired&&e.push(this.subscriber),e}ensureTransportConnected(e,t){return P(this,arguments,void 0,function(n,s){var r=this;let a=arguments.length>2&&arguments[2]!==void 0?arguments[2]:this.peerConnectionTimeout;return function*(){if(n.getConnectionState()!=="connected")return new Promise((c,l)=>P(r,void 0,void 0,function*(){const d=()=>{this.log.warn("abort transport connection",this.logContext),$t.clearTimeout(u),l(new pt("room connection has been cancelled",Je.Cancelled))};s!=null&&s.signal.aborted&&d(),s==null||s.signal.addEventListener("abort",d);const u=$t.setTimeout(()=>{s==null||s.signal.removeEventListener("abort",d),l(new pt("could not establish pc connection",Je.InternalError))},a);for(;this.state!==wt.CONNECTED;)if(yield on(50),s!=null&&s.signal.aborted){l(new pt("room connection has been cancelled",Je.Cancelled));return}$t.clearTimeout(u),s==null||s.signal.removeEventListener("abort",d),c()}))}()})}}class At extends Error{constructor(e,t,n){super(t),this.code=e,this.message=Nf(t,At.MAX_MESSAGE_BYTES),this.data=n?Nf(n,At.MAX_DATA_BYTES):void 0}static fromProto(e){return new At(e.code,e.message,e.data)}toProto(){return new qu({code:this.code,message:this.message,data:this.data})}static builtIn(e,t){return new At(At.ErrorCode[e],At.ErrorMessage[e],t)}}At.MAX_MESSAGE_BYTES=256,At.MAX_DATA_BYTES=15360,At.ErrorCode={APPLICATION_ERROR:1500,CONNECTION_TIMEOUT:1501,RESPONSE_TIMEOUT:1502,RECIPIENT_DISCONNECTED:1503,RESPONSE_PAYLOAD_TOO_LARGE:1504,SEND_FAILED:1505,UNSUPPORTED_METHOD:1400,RECIPIENT_NOT_FOUND:1401,REQUEST_PAYLOAD_TOO_LARGE:1402,UNSUPPORTED_SERVER:1403,UNSUPPORTED_VERSION:1404},At.ErrorMessage={APPLICATION_ERROR:"Application error in method handler",CONNECTION_TIMEOUT:"Connection timeout",RESPONSE_TIMEOUT:"Response timeout",RECIPIENT_DISCONNECTED:"Recipient disconnected",RESPONSE_PAYLOAD_TOO_LARGE:"Response payload too large",SEND_FAILED:"Failed to send",UNSUPPORTED_METHOD:"Method not supported at destination",RECIPIENT_NOT_FOUND:"Recipient not found",REQUEST_PAYLOAD_TOO_LARGE:"Request payload too large",UNSUPPORTED_SERVER:"RPC not supported by server",UNSUPPORTED_VERSION:"Unsupported RPC version"};const Lf=15360;function Bc(i){return new TextEncoder().encode(i).length}function Nf(i,e){if(Bc(i)<=e)return i;let t=0,n=i.length;const s=new TextEncoder;for(;t<n;){const r=Math.floor((t+n+1)/2);s.encode(i.slice(0,r)).length<=e?t=r:n=r-1}return i.slice(0,t)}const Vc=2e3;function ka(i,e){if(!e)return 0;let t,n;return"bytesReceived"in i?(t=i.bytesReceived,n=e.bytesReceived):"bytesSent"in i&&(t=i.bytesSent,n=e.bytesSent),t===void 0||n===void 0||i.timestamp===void 0||e.timestamp===void 0?0:(t-n)*8*1e3/(i.timestamp-e.timestamp)}const zc=typeof MediaRecorder<"u";class ob{constructor(){throw new Error("MediaRecorder is not available in this environment")}}const cb=zc?MediaRecorder:ob;class lb extends cb{constructor(e,t){if(!zc)throw new Error("MediaRecorder is not available in this environment");super(new MediaStream([e.mediaStreamTrack]),t);let n,s;const r=()=>s===void 0,a=()=>{this.removeEventListener("dataavailable",n),this.removeEventListener("stop",a),this.removeEventListener("error",o),s==null||s.close(),s=void 0},o=c=>{s==null||s.error(c),this.removeEventListener("dataavailable",n),this.removeEventListener("stop",a),this.removeEventListener("error",o),s=void 0};this.byteStream=new ReadableStream({start:c=>{s=c,n=l=>P(this,void 0,void 0,function*(){let d;if(l.data.arrayBuffer){const u=yield l.data.arrayBuffer();d=new Uint8Array(u)}else if(l.data.byteArray)d=l.data.byteArray;else throw new Error("no data available!");r()||c.enqueue(d)}),this.addEventListener("dataavailable",n)},cancel:()=>{a()}}),this.addEventListener("stop",a),this.addEventListener("error",o)}}function db(){return zc}const ub=1e3,hb=1e4;class Uf extends Z{get sender(){return this._sender}set sender(e){this._sender=e}get constraints(){return this._constraints}get hasPreConnectBuffer(){return!!this.localTrackRecorder}constructor(e,t,n){let s=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!1,r=arguments.length>4?arguments[4]:void 0;super(e,t,r),this.manuallyStopped=!1,this._isUpstreamPaused=!1,this.handleTrackMuteEvent=()=>this.debouncedTrackMuteHandler().catch(()=>this.log.debug("track mute bounce got cancelled by an unmute event",this.logContext)),this.debouncedTrackMuteHandler=Uc(()=>P(this,void 0,void 0,function*(){yield this.pauseUpstream()}),5e3),this.handleTrackUnmuteEvent=()=>P(this,void 0,void 0,function*(){this.debouncedTrackMuteHandler.cancel("unmute"),yield this.resumeUpstream()}),this.handleEnded=()=>{this.isInBackground&&(this.reacquireTrack=!0),this._mediaStreamTrack.removeEventListener("mute",this.handleTrackMuteEvent),this._mediaStreamTrack.removeEventListener("unmute",this.handleTrackUnmuteEvent),this.emit(ae.Ended,this)},this.reacquireTrack=!1,this.providedByUser=s,this.muteLock=new sn,this.pauseUpstreamLock=new sn,this.trackChangeLock=new sn,this.trackChangeLock.lock().then(a=>P(this,void 0,void 0,function*(){try{yield this.setMediaStreamTrack(e,!0)}finally{a()}})),this._constraints=e.getConstraints(),n&&(this._constraints=n)}get id(){return this._mediaStreamTrack.id}get dimensions(){if(this.kind!==Z.Kind.Video)return;const{width:e,height:t}=this._mediaStreamTrack.getSettings();if(e&&t)return{width:e,height:t}}get isUpstreamPaused(){return this._isUpstreamPaused}get isUserProvided(){return this.providedByUser}get mediaStreamTrack(){var e,t;return(t=(e=this.processor)===null||e===void 0?void 0:e.processedTrack)!==null&&t!==void 0?t:this._mediaStreamTrack}get isLocal(){return!0}getSourceTrackSettings(){return this._mediaStreamTrack.getSettings()}setMediaStreamTrack(e,t){return P(this,void 0,void 0,function*(){var n;if(e===this._mediaStreamTrack&&!t)return;this._mediaStreamTrack&&(this.attachedElements.forEach(r=>{Ns(this._mediaStreamTrack,r)}),this.debouncedTrackMuteHandler.cancel("new-track"),this._mediaStreamTrack.removeEventListener("ended",this.handleEnded),this._mediaStreamTrack.removeEventListener("mute",this.handleTrackMuteEvent),this._mediaStreamTrack.removeEventListener("unmute",this.handleTrackUnmuteEvent)),this.mediaStream=new MediaStream([e]),e&&(e.addEventListener("ended",this.handleEnded),e.addEventListener("mute",this.handleTrackMuteEvent),e.addEventListener("unmute",this.handleTrackUnmuteEvent),this._constraints=e.getConstraints());let s;if(this.processor&&e){if(this.log.debug("restarting processor",this.logContext),this.kind==="unknown")throw TypeError("cannot set processor on track of unknown kind");this.processorElement&&(Ls(e,this.processorElement),this.processorElement.muted=!0),yield this.processor.restart({track:e,kind:this.kind,element:this.processorElement}),s=this.processor.processedTrack}this.sender&&((n=this.sender.transport)===null||n===void 0?void 0:n.state)!=="closed"&&(yield this.sender.replaceTrack(s??e)),!this.providedByUser&&this._mediaStreamTrack!==e&&this._mediaStreamTrack.stop(),this._mediaStreamTrack=e,e&&(this._mediaStreamTrack.enabled=!this.isMuted,yield this.resumeUpstream(),this.attachedElements.forEach(r=>{Ls(s??e,r)}))})}waitForDimensions(){return P(this,arguments,void 0,function(){var e=this;let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:ub;return function*(){var n;if(e.kind===Z.Kind.Audio)throw new Error("cannot get dimensions for audio tracks");((n=fn())===null||n===void 0?void 0:n.os)==="iOS"&&(yield on(10));const s=Date.now();for(;Date.now()-s<t;){const r=e.dimensions;if(r)return r;yield on(50)}throw new hi("unable to get track dimensions after timeout")}()})}setDeviceId(e){return P(this,void 0,void 0,function*(){return this._constraints.deviceId===e&&this._mediaStreamTrack.getSettings().deviceId===Oi(e)||(this._constraints.deviceId=e,this.isMuted)?!0:(yield this.restartTrack(),Oi(e)===this._mediaStreamTrack.getSettings().deviceId)})}getDeviceId(){return P(this,arguments,void 0,function(){var e=this;let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!0;return function*(){if(e.source===Z.Source.ScreenShare)return;const{deviceId:n,groupId:s}=e._mediaStreamTrack.getSettings(),r=e.kind===Z.Kind.Audio?"audioinput":"videoinput";return t?Wt.getInstance().normalizeDeviceId(r,n,s):n}()})}mute(){return P(this,void 0,void 0,function*(){return this.setTrackMuted(!0),this})}unmute(){return P(this,void 0,void 0,function*(){return this.setTrackMuted(!1),this})}replaceTrack(e,t){return P(this,void 0,void 0,function*(){const n=yield this.trackChangeLock.lock();try{if(!this.sender)throw new hi("unable to replace an unpublished track");let s,r;return typeof t=="boolean"?s=t:t!==void 0&&(s=t.userProvidedTrack,r=t.stopProcessor),this.providedByUser=s??!0,this.log.debug("replace MediaStreamTrack",this.logContext),yield this.setMediaStreamTrack(e),r&&this.processor&&(yield this.internalStopProcessor()),this}finally{n()}})}restart(e){return P(this,void 0,void 0,function*(){this.manuallyStopped=!1;const t=yield this.trackChangeLock.lock();try{e||(e=this._constraints);const{deviceId:n,facingMode:s}=e,r=$v(e,["deviceId","facingMode"]);this.log.debug("restarting track with constraints",Object.assign(Object.assign({},this.logContext),{constraints:e}));const a={audio:!1,video:!1};this.kind===Z.Kind.Video?a.video=n||s?{deviceId:n,facingMode:s}:!0:a.audio=n?Object.assign({deviceId:n},r):!0,this.attachedElements.forEach(l=>{Ns(this.mediaStreamTrack,l)}),this._mediaStreamTrack.removeEventListener("ended",this.handleEnded),this._mediaStreamTrack.stop();const c=(yield navigator.mediaDevices.getUserMedia(a)).getTracks()[0];return this.kind===Z.Kind.Video&&(yield c.applyConstraints(r)),c.addEventListener("ended",this.handleEnded),this.log.debug("re-acquired MediaStreamTrack",this.logContext),yield this.setMediaStreamTrack(c),this._constraints=e,this.emit(ae.Restarted,this),this.manuallyStopped&&(this.log.warn("track was stopped during a restart, stopping restarted track",this.logContext),this.stop()),this}finally{t()}})}setTrackMuted(e){this.log.debug("setting ".concat(this.kind," track ").concat(e?"muted":"unmuted"),this.logContext),!(this.isMuted===e&&this._mediaStreamTrack.enabled!==e)&&(this.isMuted=e,this._mediaStreamTrack.enabled=!e,this.emit(e?ae.Muted:ae.Unmuted,this))}get needsReAcquisition(){return this._mediaStreamTrack.readyState!=="live"||this._mediaStreamTrack.muted||!this._mediaStreamTrack.enabled||this.reacquireTrack}handleAppVisibilityChanged(){const e=Object.create(null,{handleAppVisibilityChanged:{get:()=>super.handleAppVisibilityChanged}});return P(this,void 0,void 0,function*(){yield e.handleAppVisibilityChanged.call(this),lf()&&(this.log.debug("visibility changed, is in Background: ".concat(this.isInBackground),this.logContext),!this.isInBackground&&this.needsReAcquisition&&!this.isUserProvided&&!this.isMuted&&(this.log.debug("track needs to be reacquired, restarting ".concat(this.source),this.logContext),yield this.restart(),this.reacquireTrack=!1))})}stop(){var e;this.manuallyStopped=!0,super.stop(),this._mediaStreamTrack.removeEventListener("ended",this.handleEnded),this._mediaStreamTrack.removeEventListener("mute",this.handleTrackMuteEvent),this._mediaStreamTrack.removeEventListener("unmute",this.handleTrackUnmuteEvent),(e=this.processor)===null||e===void 0||e.destroy(),this.processor=void 0}pauseUpstream(){return P(this,void 0,void 0,function*(){var e;const t=yield this.pauseUpstreamLock.lock();try{if(this._isUpstreamPaused===!0)return;if(!this.sender){this.log.warn("unable to pause upstream for an unpublished track",this.logContext);return}this._isUpstreamPaused=!0,this.emit(ae.UpstreamPaused,this);const n=fn();if((n==null?void 0:n.name)==="Safari"&&jn(n.version,"12.0")<0)throw new dc("pauseUpstream is not supported on Safari < 12.");((e=this.sender.transport)===null||e===void 0?void 0:e.state)!=="closed"&&(yield this.sender.replaceTrack(null))}finally{t()}})}resumeUpstream(){return P(this,void 0,void 0,function*(){var e;const t=yield this.pauseUpstreamLock.lock();try{if(this._isUpstreamPaused===!1)return;if(!this.sender){this.log.warn("unable to resume upstream for an unpublished track",this.logContext);return}this._isUpstreamPaused=!1,this.emit(ae.UpstreamResumed,this),((e=this.sender.transport)===null||e===void 0?void 0:e.state)!=="closed"&&(yield this.sender.replaceTrack(this.mediaStreamTrack))}finally{t()}})}getRTCStatsReport(){return P(this,void 0,void 0,function*(){var e;return!((e=this.sender)===null||e===void 0)&&e.getStats?yield this.sender.getStats():void 0})}setProcessor(e){return P(this,arguments,void 0,function(t){var n=this;let s=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0;return function*(){var r;const a=yield n.trackChangeLock.lock();try{n.log.debug("setting up processor",n.logContext);const o=document.createElement(n.kind),c={kind:n.kind,track:n._mediaStreamTrack,element:o,audioContext:n.audioContext};if(yield t.init(c),n.log.debug("processor initialized",n.logContext),n.processor&&(yield n.internalStopProcessor()),n.kind==="unknown")throw TypeError("cannot set processor on track of unknown kind");if(Ls(n._mediaStreamTrack,o),o.muted=!0,o.play().catch(l=>{l instanceof DOMException&&l.name==="AbortError"?(n.log.warn("failed to play processor element, retrying",Object.assign(Object.assign({},n.logContext),{error:l})),setTimeout(()=>{o.play().catch(d=>{n.log.error("failed to play processor element",Object.assign(Object.assign({},n.logContext),{err:d}))})},100)):n.log.error("failed to play processor element",Object.assign(Object.assign({},n.logContext),{error:l}))}),n.processor=t,n.processorElement=o,n.processor.processedTrack){for(const l of n.attachedElements)l!==n.processorElement&&s&&(Ns(n._mediaStreamTrack,l),Ls(n.processor.processedTrack,l));yield(r=n.sender)===null||r===void 0?void 0:r.replaceTrack(n.processor.processedTrack)}n.emit(ae.TrackProcessorUpdate,n.processor)}finally{a()}}()})}getProcessor(){return this.processor}stopProcessor(){return P(this,arguments,void 0,function(){var e=this;let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!0;return function*(){const n=yield e.trackChangeLock.lock();try{yield e.internalStopProcessor(t)}finally{n()}}()})}internalStopProcessor(){return P(this,arguments,void 0,function(){var e=this;let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!0;return function*(){var n,s;e.processor&&(e.log.debug("stopping processor",e.logContext),(n=e.processor.processedTrack)===null||n===void 0||n.stop(),yield e.processor.destroy(),e.processor=void 0,t||((s=e.processorElement)===null||s===void 0||s.remove(),e.processorElement=void 0),yield e._mediaStreamTrack.applyConstraints(e._constraints),yield e.setMediaStreamTrack(e._mediaStreamTrack,!0),e.emit(ae.TrackProcessorUpdate))}()})}startPreConnectBuffer(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:100;if(!db()){this.log.warn("MediaRecorder is not available, cannot start preconnect buffer",this.logContext);return}if(this.localTrackRecorder){this.log.warn("preconnect buffer already started");return}else{let t="audio/webm;codecs=opus";MediaRecorder.isTypeSupported(t)||(t="video/mp4"),this.localTrackRecorder=new lb(this,{mimeType:t})}this.localTrackRecorder.start(e),this.autoStopPreConnectBuffer=setTimeout(()=>{this.log.warn("preconnect buffer timed out, stopping recording automatically",this.logContext),this.stopPreConnectBuffer()},hb)}stopPreConnectBuffer(){clearTimeout(this.autoStopPreConnectBuffer),this.localTrackRecorder&&(this.localTrackRecorder.stop(),this.localTrackRecorder=void 0)}getPreConnectBuffer(){var e;return(e=this.localTrackRecorder)===null||e===void 0?void 0:e.byteStream}getPreConnectBufferMimeType(){var e;return(e=this.localTrackRecorder)===null||e===void 0?void 0:e.mimeType}}class Ia extends Uf{get enhancedNoiseCancellation(){return this.isKrispNoiseFilterEnabled}constructor(e,t){let n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0,s=arguments.length>3?arguments[3]:void 0,r=arguments.length>4?arguments[4]:void 0;super(e,Z.Kind.Audio,t,n,r),this.stopOnMute=!1,this.isKrispNoiseFilterEnabled=!1,this.monitorSender=()=>P(this,void 0,void 0,function*(){if(!this.sender){this._currentBitrate=0;return}let a;try{a=yield this.getSenderStats()}catch(o){this.log.error("could not get audio sender stats",Object.assign(Object.assign({},this.logContext),{error:o}));return}a&&this.prevStats&&(this._currentBitrate=ka(a,this.prevStats)),this.prevStats=a}),this.handleKrispNoiseFilterEnable=()=>{this.isKrispNoiseFilterEnabled=!0,this.log.debug("Krisp noise filter enabled",this.logContext),this.emit(ae.AudioTrackFeatureUpdate,this,Ht.TF_ENHANCED_NOISE_CANCELLATION,!0)},this.handleKrispNoiseFilterDisable=()=>{this.isKrispNoiseFilterEnabled=!1,this.log.debug("Krisp noise filter disabled",this.logContext),this.emit(ae.AudioTrackFeatureUpdate,this,Ht.TF_ENHANCED_NOISE_CANCELLATION,!1)},this.audioContext=s,this.checkForSilence()}mute(){const e=Object.create(null,{mute:{get:()=>super.mute}});return P(this,void 0,void 0,function*(){const t=yield this.muteLock.lock();try{return this.isMuted?(this.log.debug("Track already muted",this.logContext),this):(this.source===Z.Source.Microphone&&this.stopOnMute&&!this.isUserProvided&&(this.log.debug("stopping mic track",this.logContext),this._mediaStreamTrack.stop()),yield e.mute.call(this),this)}finally{t()}})}unmute(){const e=Object.create(null,{unmute:{get:()=>super.unmute}});return P(this,void 0,void 0,function*(){const t=yield this.muteLock.lock();try{if(!this.isMuted)return this.log.debug("Track already unmuted",this.logContext),this;const n=this._constraints.deviceId&&this._mediaStreamTrack.getSettings().deviceId!==Oi(this._constraints.deviceId);return this.source===Z.Source.Microphone&&(this.stopOnMute||this._mediaStreamTrack.readyState==="ended"||n)&&!this.isUserProvided&&(this.log.debug("reacquiring mic track",this.logContext),yield this.restartTrack()),yield e.unmute.call(this),this}finally{t()}})}restartTrack(e){return P(this,void 0,void 0,function*(){let t;if(e){const n=Ac({audio:e});typeof n.audio!="boolean"&&(t=n.audio)}yield this.restart(t)})}restart(e){const t=Object.create(null,{restart:{get:()=>super.restart}});return P(this,void 0,void 0,function*(){const n=yield t.restart.call(this,e);return this.checkForSilence(),n})}startMonitor(){cn()&&(this.monitorInterval||(this.monitorInterval=setInterval(()=>{this.monitorSender()},Vc)))}setProcessor(e){return P(this,void 0,void 0,function*(){var t;const n=yield this.trackChangeLock.lock();try{if(!qn()&&!this.audioContext)throw Error("Audio context needs to be set on LocalAudioTrack in order to enable processors");this.processor&&(yield this.internalStopProcessor());const s={kind:this.kind,track:this._mediaStreamTrack,audioContext:this.audioContext};this.log.debug("setting up audio processor ".concat(e.name),this.logContext),yield e.init(s),this.processor=e,this.processor.processedTrack&&(yield(t=this.sender)===null||t===void 0?void 0:t.replaceTrack(this.processor.processedTrack),this.processor.processedTrack.addEventListener("enable-lk-krisp-noise-filter",this.handleKrispNoiseFilterEnable),this.processor.processedTrack.addEventListener("disable-lk-krisp-noise-filter",this.handleKrispNoiseFilterDisable)),this.emit(ae.TrackProcessorUpdate,this.processor)}finally{n()}})}setAudioContext(e){this.audioContext=e}getSenderStats(){return P(this,void 0,void 0,function*(){var e;if(!(!((e=this.sender)===null||e===void 0)&&e.getStats))return;const t=yield this.sender.getStats();let n;return t.forEach(s=>{s.type==="outbound-rtp"&&(n={type:"audio",streamId:s.id,packetsSent:s.packetsSent,packetsLost:s.packetsLost,bytesSent:s.bytesSent,timestamp:s.timestamp,roundTripTime:s.roundTripTime,jitter:s.jitter})}),n})}checkForSilence(){return P(this,void 0,void 0,function*(){const e=yield bf(this);return e&&(this.isMuted||this.log.warn("silence detected on local audio track",this.logContext),this.emit(ae.AudioSilenceDetected)),e})}}function fb(i,e,t){switch(i.kind){case"audio":return new Ia(i,e,!1,void 0,t);case"video":return new Da(i,e,!1,t);default:throw new hi("unsupported track type: ".concat(i.kind))}}const pb=Object.values(kr),mb=Object.values(mc),gb=Object.values(gc),vb=[kr.h180,kr.h360],bb=[mc.h180,mc.h360],_b=i=>[{scaleResolutionDownBy:2,fps:i.encoding.maxFramerate}].map(t=>{var n,s;return new ut(Math.floor(i.width/t.scaleResolutionDownBy),Math.floor(i.height/t.scaleResolutionDownBy),Math.max(15e4,Math.floor(i.encoding.maxBitrate/(Math.pow(t.scaleResolutionDownBy,2)*(((n=i.encoding.maxFramerate)!==null&&n!==void 0?n:30)/((s=t.fps)!==null&&s!==void 0?s:30))))),t.fps,i.encoding.priority)}),Gc=["q","h","f"];function Hc(i,e,t,n){var s,r;let a=n==null?void 0:n.videoEncoding;i&&(a=n==null?void 0:n.screenShareEncoding);const o=n==null?void 0:n.simulcast,c=n==null?void 0:n.scalabilityMode,l=n==null?void 0:n.videoCodec;if(!a&&!o&&!c||!e||!t)return[{}];a||(a=Sb(i,e,t,l),Ke.debug("using video encoding",a));const d=a.maxFramerate,u=new ut(e,t,a.maxBitrate,a.maxFramerate,a.priority);if(c&&Wn(l)){const g=new Bf(c),v=[];if(g.spatial>3)throw new Error("unsupported scalabilityMode: ".concat(c));const m=fn();if(Ir()||qn()||(m==null?void 0:m.name)==="Chrome"&&jn(m==null?void 0:m.version,"113")<0){const p=g.suffix=="h"?2:3,x=C0(m);for(let C=0;C<g.spatial;C+=1)v.push({rid:Gc[2-C],maxBitrate:a.maxBitrate/Math.pow(p,C),maxFramerate:u.encoding.maxFramerate,scaleResolutionDownBy:x?Math.pow(2,C):void 0});v[0].scalabilityMode=c}else v.push({maxBitrate:a.maxBitrate,maxFramerate:u.encoding.maxFramerate,scalabilityMode:c});return u.encoding.priority&&(v[0].priority=u.encoding.priority,v[0].networkPriority=u.encoding.priority),Ke.debug("using svc encoding",{encodings:v}),v}if(!o)return[a];let h=[];i?h=(s=Ff(n==null?void 0:n.screenShareSimulcastLayers))!==null&&s!==void 0?s:Of(i,u):h=(r=Ff(n==null?void 0:n.videoSimulcastLayers))!==null&&r!==void 0?r:Of(i,u);let f;if(h.length>0){const g=h[0];h.length>1&&([,f]=h);const v=Math.max(e,t);if(v>=960&&f)return Wc(e,t,[g,f,u],d);if(v>=480)return Wc(e,t,[g,u],d)}return Wc(e,t,[u])}function yb(i,e,t){var n,s,r,a;if(!t.backupCodec||t.backupCodec===!0||t.backupCodec.codec===t.videoCodec)return;e!==t.backupCodec.codec&&Ke.warn("requested a different codec than specified as backup",{serverRequested:e,backup:t.backupCodec.codec}),t.videoCodec=e,t.videoEncoding=t.backupCodec.encoding;const o=i.mediaStreamTrack.getSettings(),c=(n=o.width)!==null&&n!==void 0?n:(s=i.dimensions)===null||s===void 0?void 0:s.width,l=(r=o.height)!==null&&r!==void 0?r:(a=i.dimensions)===null||a===void 0?void 0:a.height;return i.source===Z.Source.ScreenShare&&t.simulcast&&(t.simulcast=!1),Hc(i.source===Z.Source.ScreenShare,c,l,t)}function Sb(i,e,t,n){const s=xb(i,e,t);let{encoding:r}=s[0];const a=Math.max(e,t);for(let o=0;o<s.length;o+=1){const c=s[o];if(r=c.encoding,c.width>=a)break}if(n)switch(n){case"av1":case"h265":r=Object.assign({},r),r.maxBitrate=r.maxBitrate*.7;break;case"vp9":r=Object.assign({},r),r.maxBitrate=r.maxBitrate*.85;break}return r}function xb(i,e,t){if(i)return gb;const n=e>t?e/t:t/e;return Math.abs(n-16/9)<Math.abs(n-4/3)?pb:mb}function Of(i,e){if(i)return _b(e);const{width:t,height:n}=e,s=t>n?t/n:n/t;return Math.abs(s-16/9)<Math.abs(s-4/3)?vb:bb}function Wc(i,e,t,n){const s=[];if(t.forEach((r,a)=>{if(a>=Gc.length)return;const o=Math.min(i,e),l={rid:Gc[a],scaleResolutionDownBy:Math.max(1,o/Math.min(r.width,r.height)),maxBitrate:r.encoding.maxBitrate},d=n&&r.encoding.maxFramerate?Math.min(n,r.encoding.maxFramerate):r.encoding.maxFramerate;d&&(l.maxFramerate=d);const u=as()||a===0;r.encoding.priority&&u&&(l.priority=r.encoding.priority,l.networkPriority=r.encoding.priority),s.push(l)}),qn()&&uf()==="ios"){let r;s.forEach(o=>{r?o.maxFramerate&&o.maxFramerate>r&&(r=o.maxFramerate):r=o.maxFramerate});let a=!0;s.forEach(o=>{var c;o.maxFramerate!=r&&(a&&(a=!1,Ke.info("Simulcast on iOS React-Native requires all encodings to share the same framerate.")),Ke.info('Setting framerate of encoding "'.concat((c=o.rid)!==null&&c!==void 0?c:"",'" to ').concat(r)),o.maxFramerate=r)})}return s}function Ff(i){if(i)return i.sort((e,t)=>{const{encoding:n}=e,{encoding:s}=t;return n.maxBitrate>s.maxBitrate?1:n.maxBitrate<s.maxBitrate?-1:n.maxBitrate===s.maxBitrate&&n.maxFramerate&&s.maxFramerate?n.maxFramerate>s.maxFramerate?1:-1:0})}class Bf{constructor(e){const t=e.match(/^L(\d)T(\d)(h|_KEY|_KEY_SHIFT){0,1}$/);if(!t)throw new Error("invalid scalability mode");if(this.spatial=parseInt(t[1]),this.temporal=parseInt(t[2]),t.length>3)switch(t[3]){case"h":case"_KEY":case"_KEY_SHIFT":this.suffix=t[3]}}toString(){var e;return"L".concat(this.spatial,"T").concat(this.temporal).concat((e=this.suffix)!==null&&e!==void 0?e:"")}}function Tb(i){return i.source===Z.Source.ScreenShare||i.constraints.height&&Oi(i.constraints.height)>=1080?"maintain-resolution":"balanced"}const Cb=5e3;class Da extends Uf{get sender(){return this._sender}set sender(e){this._sender=e,this.degradationPreference&&this.setDegradationPreference(this.degradationPreference)}constructor(e,t){let n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0,s=arguments.length>3?arguments[3]:void 0;super(e,Z.Kind.Video,t,n,s),this.simulcastCodecs=new Map,this.degradationPreference="balanced",this.isCpuConstrained=!1,this.optimizeForPerformance=!1,this.monitorSender=()=>P(this,void 0,void 0,function*(){if(!this.sender){this._currentBitrate=0;return}let r;try{r=yield this.getSenderStats()}catch(c){this.log.error("could not get video sender stats",Object.assign(Object.assign({},this.logContext),{error:c}));return}const a=new Map(r.map(c=>[c.rid,c])),o=r.some(c=>c.qualityLimitationReason==="cpu");if(o!==this.isCpuConstrained&&(this.isCpuConstrained=o,this.isCpuConstrained&&this.emit(ae.CpuConstrained)),this.prevStats){let c=0;a.forEach((l,d)=>{var u;const h=(u=this.prevStats)===null||u===void 0?void 0:u.get(d);c+=ka(l,h)}),this._currentBitrate=c}this.prevStats=a}),this.senderLock=new sn}get isSimulcast(){return!!(this.sender&&this.sender.getParameters().encodings.length>1)}startMonitor(e){var t;if(this.signalClient=e,!cn())return;const n=(t=this.sender)===null||t===void 0?void 0:t.getParameters();n&&(this.encodings=n.encodings),!this.monitorInterval&&(this.monitorInterval=setInterval(()=>{this.monitorSender()},Vc))}stop(){this._mediaStreamTrack.getConstraints(),this.simulcastCodecs.forEach(e=>{e.mediaStreamTrack.stop()}),super.stop()}pauseUpstream(){const e=Object.create(null,{pauseUpstream:{get:()=>super.pauseUpstream}});return P(this,void 0,void 0,function*(){var t,n,s,r,a;yield e.pauseUpstream.call(this);try{for(var o=!0,c=di(this.simulcastCodecs.values()),l;l=yield c.next(),t=l.done,!t;o=!0)r=l.value,o=!1,yield(a=r.sender)===null||a===void 0?void 0:a.replaceTrack(null)}catch(d){n={error:d}}finally{try{!o&&!t&&(s=c.return)&&(yield s.call(c))}finally{if(n)throw n.error}}})}resumeUpstream(){const e=Object.create(null,{resumeUpstream:{get:()=>super.resumeUpstream}});return P(this,void 0,void 0,function*(){var t,n,s,r,a;yield e.resumeUpstream.call(this);try{for(var o=!0,c=di(this.simulcastCodecs.values()),l;l=yield c.next(),t=l.done,!t;o=!0){r=l.value,o=!1;const d=r;yield(a=d.sender)===null||a===void 0?void 0:a.replaceTrack(d.mediaStreamTrack)}}catch(d){n={error:d}}finally{try{!o&&!t&&(s=c.return)&&(yield s.call(c))}finally{if(n)throw n.error}}})}mute(){const e=Object.create(null,{mute:{get:()=>super.mute}});return P(this,void 0,void 0,function*(){const t=yield this.muteLock.lock();try{return this.isMuted?(this.log.debug("Track already muted",this.logContext),this):(this.source===Z.Source.Camera&&!this.isUserProvided&&(this.log.debug("stopping camera track",this.logContext),this._mediaStreamTrack.stop()),yield e.mute.call(this),this)}finally{t()}})}unmute(){const e=Object.create(null,{unmute:{get:()=>super.unmute}});return P(this,void 0,void 0,function*(){const t=yield this.muteLock.lock();try{return this.isMuted?(this.source===Z.Source.Camera&&!this.isUserProvided&&(this.log.debug("reacquiring camera track",this.logContext),yield this.restartTrack()),yield e.unmute.call(this),this):(this.log.debug("Track already unmuted",this.logContext),this)}finally{t()}})}setTrackMuted(e){super.setTrackMuted(e);for(const t of this.simulcastCodecs.values())t.mediaStreamTrack.enabled=!e}getSenderStats(){return P(this,void 0,void 0,function*(){var e;if(!(!((e=this.sender)===null||e===void 0)&&e.getStats))return[];const t=[],n=yield this.sender.getStats();return n.forEach(s=>{var r;if(s.type==="outbound-rtp"){const a={type:"video",streamId:s.id,frameHeight:s.frameHeight,frameWidth:s.frameWidth,framesPerSecond:s.framesPerSecond,framesSent:s.framesSent,firCount:s.firCount,pliCount:s.pliCount,nackCount:s.nackCount,packetsSent:s.packetsSent,bytesSent:s.bytesSent,qualityLimitationReason:s.qualityLimitationReason,qualityLimitationDurations:s.qualityLimitationDurations,qualityLimitationResolutionChanges:s.qualityLimitationResolutionChanges,rid:(r=s.rid)!==null&&r!==void 0?r:s.id,retransmittedPacketsSent:s.retransmittedPacketsSent,targetBitrate:s.targetBitrate,timestamp:s.timestamp},o=n.get(s.remoteId);o&&(a.jitter=o.jitter,a.packetsLost=o.packetsLost,a.roundTripTime=o.roundTripTime),t.push(a)}}),t.sort((s,r)=>{var a,o;return((a=r.frameWidth)!==null&&a!==void 0?a:0)-((o=s.frameWidth)!==null&&o!==void 0?o:0)}),t})}setPublishingQuality(e){const t=[];for(let n=pn.LOW;n<=pn.HIGH;n+=1)t.push(new Zo({quality:n,enabled:n<=e}));this.log.debug("setting publishing quality. max quality ".concat(e),this.logContext),this.setPublishingLayers(Wn(this.codec),t)}restartTrack(e){return P(this,void 0,void 0,function*(){var t,n,s,r,a;let o;if(e){const u=Ac({video:e});typeof u.video!="boolean"&&(o=u.video)}yield this.restart(o),this.isCpuConstrained=!1;try{for(var c=!0,l=di(this.simulcastCodecs.values()),d;d=yield l.next(),t=d.done,!t;c=!0){r=d.value,c=!1;const u=r;u.sender&&((a=u.sender.transport)===null||a===void 0?void 0:a.state)!=="closed"&&(u.mediaStreamTrack=this.mediaStreamTrack.clone(),yield u.sender.replaceTrack(u.mediaStreamTrack))}}catch(u){n={error:u}}finally{try{!c&&!t&&(s=l.return)&&(yield s.call(l))}finally{if(n)throw n.error}}})}setProcessor(e){const t=Object.create(null,{setProcessor:{get:()=>super.setProcessor}});return P(this,arguments,void 0,function(n){var s=this;let r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0;return function*(){var a,o,c,l,d,u;if(yield t.setProcessor.call(s,n,r),!((d=s.processor)===null||d===void 0)&&d.processedTrack)try{for(var h=!0,f=di(s.simulcastCodecs.values()),g;g=yield f.next(),a=g.done,!a;h=!0)l=g.value,h=!1,yield(u=l.sender)===null||u===void 0?void 0:u.replaceTrack(s.processor.processedTrack)}catch(v){o={error:v}}finally{try{!h&&!a&&(c=f.return)&&(yield c.call(f))}finally{if(o)throw o.error}}}()})}setDegradationPreference(e){return P(this,void 0,void 0,function*(){if(this.degradationPreference=e,this.sender)try{this.log.debug("setting degradationPreference to ".concat(e),this.logContext);const t=this.sender.getParameters();t.degradationPreference=e,this.sender.setParameters(t)}catch(t){this.log.warn("failed to set degradationPreference",Object.assign({error:t},this.logContext))}})}addSimulcastTrack(e,t){if(this.simulcastCodecs.has(e)){this.log.error("".concat(e," already added, skipping adding simulcast codec"),this.logContext);return}const n={codec:e,mediaStreamTrack:this.mediaStreamTrack.clone(),sender:void 0,encodings:t};return this.simulcastCodecs.set(e,n),n}setSimulcastTrackSender(e,t){const n=this.simulcastCodecs.get(e);n&&(n.sender=t,setTimeout(()=>{this.subscribedCodecs&&this.setPublishingCodecs(this.subscribedCodecs)},Cb))}setPublishingCodecs(e){return P(this,void 0,void 0,function*(){var t,n,s,r,a,o,c;if(this.log.debug("setting publishing codecs",Object.assign(Object.assign({},this.logContext),{codecs:e,currentCodec:this.codec})),!this.codec&&e.length>0)return yield this.setPublishingLayers(Wn(e[0].codec),e[0].qualities),[];this.subscribedCodecs=e;const l=[];try{for(t=!0,n=di(e);s=yield n.next(),r=s.done,!r;t=!0){c=s.value,t=!1;const d=c;if(!this.codec||this.codec===d.codec)yield this.setPublishingLayers(Wn(d.codec),d.qualities);else{const u=this.simulcastCodecs.get(d.codec);if(this.log.debug("try setPublishingCodec for ".concat(d.codec),Object.assign(Object.assign({},this.logContext),{simulcastCodecInfo:u})),!u||!u.sender){for(const h of d.qualities)if(h.enabled){l.push(d.codec);break}}else u.encodings&&(this.log.debug("try setPublishingLayersForSender ".concat(d.codec),this.logContext),yield Vf(u.sender,u.encodings,d.qualities,this.senderLock,Wn(d.codec),this.log,this.logContext))}}}catch(d){a={error:d}}finally{try{!t&&!r&&(o=n.return)&&(yield o.call(n))}finally{if(a)throw a.error}}return l})}setPublishingLayers(e,t){return P(this,void 0,void 0,function*(){if(this.optimizeForPerformance){this.log.info("skipping setPublishingLayers due to optimized publishing performance",Object.assign(Object.assign({},this.logContext),{qualities:t}));return}this.log.debug("setting publishing layers",Object.assign(Object.assign({},this.logContext),{qualities:t})),!(!this.sender||!this.encodings)&&(yield Vf(this.sender,this.encodings,t,this.senderLock,e,this.log,this.logContext))})}prioritizePerformance(){return P(this,void 0,void 0,function*(){if(!this.sender)throw new Error("sender not found");const e=yield this.senderLock.lock();try{this.optimizeForPerformance=!0;const t=this.sender.getParameters();t.encodings=t.encodings.map((n,s)=>{var r;return Object.assign(Object.assign({},n),{active:s===0,scaleResolutionDownBy:Math.max(1,Math.ceil(((r=this.mediaStreamTrack.getSettings().height)!==null&&r!==void 0?r:360)/360)),scalabilityMode:s===0&&Wn(this.codec)?"L1T3":void 0,maxFramerate:s===0?15:0,maxBitrate:s===0?n.maxBitrate:0})}),this.log.debug("setting performance optimised encodings",Object.assign(Object.assign({},this.logContext),{encodings:t.encodings})),this.encodings=t.encodings,yield this.sender.setParameters(t)}catch(t){this.log.error("failed to set performance optimised encodings",Object.assign(Object.assign({},this.logContext),{error:t})),this.optimizeForPerformance=!1}finally{e()}})}handleAppVisibilityChanged(){const e=Object.create(null,{handleAppVisibilityChanged:{get:()=>super.handleAppVisibilityChanged}});return P(this,void 0,void 0,function*(){yield e.handleAppVisibilityChanged.call(this),lf()&&this.isInBackground&&this.source===Z.Source.Camera&&(this._mediaStreamTrack.enabled=!1)})}}function Vf(i,e,t,n,s,r,a){return P(this,void 0,void 0,function*(){const o=yield n.lock();r.debug("setPublishingLayersForSender",Object.assign(Object.assign({},a),{sender:i,qualities:t,senderEncodings:e}));try{const c=i.getParameters(),{encodings:l}=c;if(!l)return;if(l.length!==e.length){r.warn("cannot set publishing layers, encodings mismatch",Object.assign(Object.assign({},a),{encodings:l,senderEncodings:e}));return}let d=!1;!1&&l[0].scalabilityMode||(s&&t.some(f=>f.enabled)&&t.forEach(f=>f.enabled=!0),l.forEach((h,f)=>{var g;let v=(g=h.rid)!==null&&g!==void 0?g:"";v===""&&(v="q");const m=zf(v),p=t.find(x=>x.quality===m);p&&h.active!==p.enabled&&(d=!0,h.active=p.enabled,r.debug("setting layer ".concat(p.quality," to ").concat(h.active?"enabled":"disabled"),a),as()&&(p.enabled?(h.scaleResolutionDownBy=e[f].scaleResolutionDownBy,h.maxBitrate=e[f].maxBitrate,h.maxFrameRate=e[f].maxFrameRate):(h.scaleResolutionDownBy=4,h.maxBitrate=10,h.maxFrameRate=2)))})),d&&(c.encodings=l,r.debug("setting encodings",Object.assign(Object.assign({},a),{encodings:c.encodings})),yield i.setParameters(c))}finally{o()}})}function zf(i){switch(i){case"f":return pn.HIGH;case"h":return pn.MEDIUM;case"q":return pn.LOW;default:return pn.HIGH}}function Gf(i,e,t,n){if(!t)return[new is({quality:pn.HIGH,width:i,height:e,bitrate:0,ssrc:0})];if(n){const s=t[0].scalabilityMode,r=new Bf(s),a=[],o=r.suffix=="h"?1.5:2,c=r.suffix=="h"?2:3;for(let l=0;l<r.spatial;l+=1)a.push(new is({quality:Math.min(pn.HIGH,r.spatial-1)-l,width:Math.ceil(i/Math.pow(o,l)),height:Math.ceil(e/Math.pow(o,l)),bitrate:t[0].maxBitrate?Math.ceil(t[0].maxBitrate/Math.pow(c,l)):0,ssrc:0}));return a}return t.map(s=>{var r,a,o;const c=(r=s.scaleResolutionDownBy)!==null&&r!==void 0?r:1;let l=zf((a=s.rid)!==null&&a!==void 0?a:"");return new is({quality:l,width:Math.ceil(i/c),height:Math.ceil(e/c),bitrate:(o=s.maxBitrate)!==null&&o!==void 0?o:0,ssrc:0})})}const Hf="_lossy",Wf="_reliable",Eb=2*1e3,qc="leave-reconnect",Mb=3e4;var In;(function(i){i[i.New=0]="New",i[i.Connected=1]="Connected",i[i.Disconnected=2]="Disconnected",i[i.Reconnecting=3]="Reconnecting",i[i.Closed=4]="Closed"})(In||(In={}));class wb extends Hn.EventEmitter{get isClosed(){return this._isClosed}get pendingReconnect(){return!!this.reconnectTimeout}constructor(e){var t;super(),this.options=e,this.rtcConfig={},this.peerConnectionTimeout=Fc.peerConnectionTimeout,this.fullReconnectOnNext=!1,this.latestRemoteOfferId=0,this.subscriberPrimary=!1,this.pcState=In.New,this._isClosed=!0,this.pendingTrackResolvers={},this.reconnectAttempts=0,this.reconnectStart=0,this.attemptingReconnect=!1,this.joinAttempts=0,this.maxJoinAttempts=1,this.shouldFailNext=!1,this.log=Ke,this.reliableDataSequence=1,this.reliableMessageBuffer=new Cf,this.reliableReceivedState=new J0(Mb),this.handleDataChannel=n=>P(this,[n],void 0,function(s){var r=this;let{channel:a}=s;return function*(){if(a){if(a.label===Wf)r.reliableDCSub=a;else if(a.label===Hf)r.lossyDCSub=a;else return;r.log.debug("on data channel ".concat(a.id,", ").concat(a.label),r.logContext),a.onmessage=r.handleDataMessage}}()}),this.handleDataMessage=n=>P(this,void 0,void 0,function*(){var s,r;const a=yield this.dataProcessLock.lock();try{let o;if(n.data instanceof ArrayBuffer)o=n.data;else if(n.data instanceof Blob)o=yield n.data.arrayBuffer();else{this.log.error("unsupported data type",Object.assign(Object.assign({},this.logContext),{data:n.data}));return}const c=an.fromBinary(new Uint8Array(o));if(c.sequence>0&&c.participantSid!==""){const l=this.reliableReceivedState.get(c.participantSid);if(l&&c.sequence<=l)return;this.reliableReceivedState.set(c.participantSid,c.sequence)}((s=c.value)===null||s===void 0?void 0:s.case)==="speaker"?this.emit(le.ActiveSpeakersUpdate,c.value.value.speakers):(((r=c.value)===null||r===void 0?void 0:r.case)==="user"&&Rb(c,c.value.value),this.emit(le.DataPacketReceived,c))}finally{a()}}),this.handleDataError=n=>{const r=n.currentTarget.maxRetransmits===0?"lossy":"reliable";if(n instanceof ErrorEvent&&n.error){const{error:a}=n.error;this.log.error("DataChannel error on ".concat(r,": ").concat(n.message),Object.assign(Object.assign({},this.logContext),{error:a}))}else this.log.error("Unknown DataChannel error on ".concat(r),Object.assign(Object.assign({},this.logContext),{event:n}))},this.handleBufferedAmountLow=n=>{const r=n.currentTarget.maxRetransmits===0?We.LOSSY:We.RELIABLE;this.updateAndEmitDCBufferStatus(r)},this.handleDisconnect=(n,s)=>{if(this._isClosed)return;this.log.warn("".concat(n," disconnected"),this.logContext),this.reconnectAttempts===0&&(this.reconnectStart=Date.now());const r=c=>{this.log.warn("could not recover connection after ".concat(this.reconnectAttempts," attempts, ").concat(c,"ms. giving up"),this.logContext),this.emit(le.Disconnected),this.close()},a=Date.now()-this.reconnectStart;let o=this.getNextRetryDelay({elapsedMs:a,retryCount:this.reconnectAttempts});if(o===null){r(a);return}n===qc&&(o=0),this.log.debug("reconnecting in ".concat(o,"ms"),this.logContext),this.clearReconnectTimeout(),this.token&&this.regionUrlProvider&&this.regionUrlProvider.updateToken(this.token),this.reconnectTimeout=$t.setTimeout(()=>this.attemptReconnect(s).finally(()=>this.reconnectTimeout=void 0),o)},this.waitForRestarted=()=>new Promise((n,s)=>{this.pcState===In.Connected&&n();const r=()=>{this.off(le.Disconnected,a),n()},a=()=>{this.off(le.Restarted,r),s()};this.once(le.Restarted,r),this.once(le.Disconnected,a)}),this.updateAndEmitDCBufferStatus=n=>{const s=this.isBufferStatusLow(n);typeof s<"u"&&s!==this.dcBufferStatus.get(n)&&(this.dcBufferStatus.set(n,s),this.emit(le.DCBufferStatusChanged,s,n))},this.isBufferStatusLow=n=>{const s=this.dataChannelForKind(n);if(s)return n===We.RELIABLE&&this.reliableMessageBuffer.alignBufferedAmount(s.bufferedAmount),s.bufferedAmount<=s.bufferedAmountLowThreshold},this.handleBrowserOnLine=()=>{this.client.currentState===Tt.RECONNECTING&&(this.clearReconnectTimeout(),this.attemptReconnect(Rs.RR_SIGNAL_DISCONNECTED))},this.log=li((t=e.loggerName)!==null&&t!==void 0?t:Rn.Engine),this.loggerOptions={loggerName:e.loggerName,loggerContextCb:()=>this.logContext},this.client=new kc(void 0,this.loggerOptions),this.client.signalLatency=this.options.expSignalLatency,this.reconnectPolicy=this.options.reconnectPolicy,this.registerOnLineListener(),this.closingLock=new sn,this.dataProcessLock=new sn,this.dcBufferStatus=new Map([[We.LOSSY,!0],[We.RELIABLE,!0]]),this.client.onParticipantUpdate=n=>this.emit(le.ParticipantUpdate,n),this.client.onConnectionQuality=n=>this.emit(le.ConnectionQualityUpdate,n),this.client.onRoomUpdate=n=>this.emit(le.RoomUpdate,n),this.client.onSubscriptionError=n=>this.emit(le.SubscriptionError,n),this.client.onSubscriptionPermissionUpdate=n=>this.emit(le.SubscriptionPermissionUpdate,n),this.client.onSpeakersChanged=n=>this.emit(le.SpeakersChanged,n),this.client.onStreamStateUpdate=n=>this.emit(le.StreamStateChanged,n),this.client.onRequestResponse=n=>this.emit(le.SignalRequestResponse,n)}get logContext(){var e,t,n,s,r,a;return{room:(t=(e=this.latestJoinResponse)===null||e===void 0?void 0:e.room)===null||t===void 0?void 0:t.name,roomID:(s=(n=this.latestJoinResponse)===null||n===void 0?void 0:n.room)===null||s===void 0?void 0:s.sid,participant:(a=(r=this.latestJoinResponse)===null||r===void 0?void 0:r.participant)===null||a===void 0?void 0:a.identity,pID:this.participantSid}}join(e,t,n,s){return P(this,void 0,void 0,function*(){this.url=e,this.token=t,this.signalOpts=n,this.maxJoinAttempts=n.maxRetries;try{this.joinAttempts+=1,this.setupSignalClientCallbacks();const r=yield this.client.join(e,t,n,s);return this._isClosed=!1,this.latestJoinResponse=r,this.subscriberPrimary=r.subscriberPrimary,this.pcManager||(yield this.configure(r)),(!this.subscriberPrimary||r.fastPublish)&&this.negotiate(),this.clientConfiguration=r.clientConfiguration,this.emit(le.SignalConnected,r),r}catch(r){if(r instanceof pt&&r.reason===Je.ServerUnreachable&&(this.log.warn("Couldn't connect to server, attempt ".concat(this.joinAttempts," of ").concat(this.maxJoinAttempts),this.logContext),this.joinAttempts<this.maxJoinAttempts))return this.join(e,t,n,s);throw r}})}close(){return P(this,void 0,void 0,function*(){const e=yield this.closingLock.lock();if(this.isClosed){e();return}try{this._isClosed=!0,this.joinAttempts=0,this.emit(le.Closing),this.removeAllListeners(),this.deregisterOnLineListener(),this.clearPendingReconnect(),yield this.cleanupPeerConnections(),yield this.cleanupClient()}finally{e()}})}cleanupPeerConnections(){return P(this,void 0,void 0,function*(){var e;yield(e=this.pcManager)===null||e===void 0?void 0:e.close(),this.pcManager=void 0;const t=n=>{n&&(n.close(),n.onbufferedamountlow=null,n.onclose=null,n.onclosing=null,n.onerror=null,n.onmessage=null,n.onopen=null)};t(this.lossyDC),t(this.lossyDCSub),t(this.reliableDC),t(this.reliableDCSub),this.lossyDC=void 0,this.lossyDCSub=void 0,this.reliableDC=void 0,this.reliableDCSub=void 0,this.reliableMessageBuffer=new Cf,this.reliableDataSequence=1,this.reliableReceivedState.clear()})}cleanupClient(){return P(this,void 0,void 0,function*(){yield this.client.close(),this.client.resetCallbacks()})}addTrack(e){if(this.pendingTrackResolvers[e.cid])throw new hi("a track with the same ID has already been published");return new Promise((t,n)=>{const s=setTimeout(()=>{delete this.pendingTrackResolvers[e.cid],n(new pt("publication of local track timed out, no response from server",Je.Timeout))},1e4);this.pendingTrackResolvers[e.cid]={resolve:r=>{clearTimeout(s),t(r)},reject:()=>{clearTimeout(s),n(new Error("Cancelled publication by calling unpublish"))}},this.client.sendAddTrack(e)})}removeTrack(e){if(e.track&&this.pendingTrackResolvers[e.track.id]){const{reject:t}=this.pendingTrackResolvers[e.track.id];t&&t(),delete this.pendingTrackResolvers[e.track.id]}try{return this.pcManager.removeTrack(e),!0}catch(t){this.log.warn("failed to remove track",Object.assign(Object.assign({},this.logContext),{error:t}))}return!1}updateMuteStatus(e,t){this.client.sendMuteTrack(e,t)}get dataSubscriberReadyState(){var e;return(e=this.reliableDCSub)===null||e===void 0?void 0:e.readyState}getConnectedServerAddress(){return P(this,void 0,void 0,function*(){var e;return(e=this.pcManager)===null||e===void 0?void 0:e.getConnectedAddress()})}setRegionUrlProvider(e){this.regionUrlProvider=e}configure(e){return P(this,void 0,void 0,function*(){var t,n;if(this.pcManager&&this.pcManager.currentState!==wt.NEW)return;this.participantSid=(t=e.participant)===null||t===void 0?void 0:t.sid;const s=this.makeRTCConfiguration(e);this.pcManager=new ab(s,e.subscriberPrimary,this.loggerOptions),this.emit(le.TransportsCreated,this.pcManager.publisher,this.pcManager.subscriber),this.pcManager.onIceCandidate=(r,a)=>{this.client.sendIceCandidate(r,a)},this.pcManager.onPublisherOffer=(r,a)=>{this.client.sendOffer(r,a)},this.pcManager.onDataChannel=this.handleDataChannel,this.pcManager.onStateChange=(r,a,o)=>P(this,void 0,void 0,function*(){if(this.log.debug("primary PC state changed ".concat(r),this.logContext),["closed","disconnected","failed"].includes(a)&&(this.publisherConnectionPromise=void 0),r===wt.CONNECTED){const d=this.pcState===In.New;this.pcState=In.Connected,d&&this.emit(le.Connected,e)}else r===wt.FAILED&&this.pcState===In.Connected&&(this.pcState=In.Disconnected,this.handleDisconnect("peerconnection failed",o==="failed"?Rs.RR_SUBSCRIBER_FAILED:Rs.RR_PUBLISHER_FAILED));const c=this.client.isDisconnected||this.client.currentState===Tt.RECONNECTING,l=[wt.FAILED,wt.CLOSING,wt.CLOSED].includes(r);c&&l&&!this._isClosed&&this.emit(le.Offline)}),this.pcManager.onTrack=r=>{this.emit(le.MediaTrackAdded,r.track,r.streams[0],r.receiver)},Ab((n=e.serverInfo)===null||n===void 0?void 0:n.protocol)||this.createDataChannels()})}setupSignalClientCallbacks(){this.client.onAnswer=(e,t)=>P(this,void 0,void 0,function*(){this.pcManager&&(this.log.debug("received server answer",Object.assign(Object.assign({},this.logContext),{RTCSdpType:e.type})),yield this.pcManager.setPublisherAnswer(e,t))}),this.client.onTrickle=(e,t)=>{this.pcManager&&(this.log.debug("got ICE candidate from peer",Object.assign(Object.assign({},this.logContext),{candidate:e,target:t})),this.pcManager.addIceCandidate(e,t))},this.client.onOffer=(e,t)=>P(this,void 0,void 0,function*(){if(this.latestRemoteOfferId=t,!this.pcManager)return;const n=yield this.pcManager.createSubscriberAnswerFromOffer(e,t);n&&this.client.sendAnswer(n,t)}),this.client.onLocalTrackPublished=e=>{var t;if(this.log.debug("received trackPublishedResponse",Object.assign(Object.assign({},this.logContext),{cid:e.cid,track:(t=e.track)===null||t===void 0?void 0:t.sid})),!this.pendingTrackResolvers[e.cid]){this.log.error("missing track resolver for ".concat(e.cid),Object.assign(Object.assign({},this.logContext),{cid:e.cid}));return}const{resolve:n}=this.pendingTrackResolvers[e.cid];delete this.pendingTrackResolvers[e.cid],n(e.track)},this.client.onLocalTrackUnpublished=e=>{this.emit(le.LocalTrackUnpublished,e)},this.client.onLocalTrackSubscribed=e=>{this.emit(le.LocalTrackSubscribed,e)},this.client.onTokenRefresh=e=>{this.token=e},this.client.onRemoteMuteChanged=(e,t)=>{this.emit(le.RemoteMute,e,t)},this.client.onSubscribedQualityUpdate=e=>{this.emit(le.SubscribedQualityUpdate,e)},this.client.onRoomMoved=e=>{var t;this.participantSid=(t=e.participant)===null||t===void 0?void 0:t.sid,this.latestJoinResponse&&(this.latestJoinResponse.room=e.room),this.emit(le.RoomMoved,e)},this.client.onClose=()=>{this.handleDisconnect("signal",Rs.RR_SIGNAL_DISCONNECTED)},this.client.onLeave=e=>{switch(this.log.debug("client leave request",Object.assign(Object.assign({},this.logContext),{reason:e==null?void 0:e.reason})),e.regions&&this.regionUrlProvider&&(this.log.debug("updating regions",this.logContext),this.regionUrlProvider.setServerReportedRegions(e.regions)),e.action){case Is.DISCONNECT:this.emit(le.Disconnected,e==null?void 0:e.reason),this.close();break;case Is.RECONNECT:this.fullReconnectOnNext=!0,this.handleDisconnect(qc);break;case Is.RESUME:this.handleDisconnect(qc)}}}makeRTCConfiguration(e){var t;const n=Object.assign({},this.rtcConfig);if(!((t=this.signalOpts)===null||t===void 0)&&t.e2eeEnabled&&(this.log.debug("E2EE - setting up transports with insertable streams",this.logContext),n.encodedInsertableStreams=!0),e.iceServers&&!n.iceServers){const s=[];e.iceServers.forEach(r=>{const a={urls:r.urls};r.username&&(a.username=r.username),r.credential&&(a.credential=r.credential),s.push(a)}),n.iceServers=s}return e.clientConfiguration&&e.clientConfiguration.forceRelay===Er.ENABLED&&(n.iceTransportPolicy="relay"),n.sdpSemantics="unified-plan",n.continualGatheringPolicy="gather_continually",n}createDataChannels(){this.pcManager&&(this.lossyDC&&(this.lossyDC.onmessage=null,this.lossyDC.onerror=null),this.reliableDC&&(this.reliableDC.onmessage=null,this.reliableDC.onerror=null),this.lossyDC=this.pcManager.createPublisherDataChannel(Hf,{ordered:!1,maxRetransmits:0}),this.reliableDC=this.pcManager.createPublisherDataChannel(Wf,{ordered:!0}),this.lossyDC.onmessage=this.handleDataMessage,this.reliableDC.onmessage=this.handleDataMessage,this.lossyDC.onerror=this.handleDataError,this.reliableDC.onerror=this.handleDataError,this.lossyDC.bufferedAmountLowThreshold=65535,this.reliableDC.bufferedAmountLowThreshold=65535,this.lossyDC.onbufferedamountlow=this.handleBufferedAmountLow,this.reliableDC.onbufferedamountlow=this.handleBufferedAmountLow)}createSender(e,t,n){return P(this,void 0,void 0,function*(){if(vc())return yield this.createTransceiverRTCRtpSender(e,t,n);if(bc())return this.log.warn("using add-track fallback",this.logContext),yield this.createRTCRtpSender(e.mediaStreamTrack);throw new Bt("Required webRTC APIs not supported on this device")})}createSimulcastSender(e,t,n,s){return P(this,void 0,void 0,function*(){if(vc())return this.createSimulcastTransceiverSender(e,t,n,s);if(bc())return this.log.debug("using add-track fallback",this.logContext),this.createRTCRtpSender(e.mediaStreamTrack);throw new Bt("Cannot stream on this device")})}createTransceiverRTCRtpSender(e,t,n){return P(this,void 0,void 0,function*(){if(!this.pcManager)throw new Bt("publisher is closed");const s=[];e.mediaStream&&s.push(e.mediaStream),Fi(e)&&(e.codec=t.videoCodec);const r={direction:"sendonly",streams:s};return n&&(r.sendEncodings=n),(yield this.pcManager.addPublisherTransceiver(e.mediaStreamTrack,r)).sender})}createSimulcastTransceiverSender(e,t,n,s){return P(this,void 0,void 0,function*(){if(!this.pcManager)throw new Bt("publisher is closed");const r={direction:"sendonly"};s&&(r.sendEncodings=s);const a=yield this.pcManager.addPublisherTransceiver(t.mediaStreamTrack,r);if(n.videoCodec)return e.setSimulcastTrackSender(n.videoCodec,a.sender),a.sender})}createRTCRtpSender(e){return P(this,void 0,void 0,function*(){if(!this.pcManager)throw new Bt("publisher is closed");return this.pcManager.addPublisherTrack(e)})}attemptReconnect(e){return P(this,void 0,void 0,function*(){var t,n,s;if(!this._isClosed){if(this.attemptingReconnect){Ke.warn("already attempting reconnect, returning early",this.logContext);return}(((t=this.clientConfiguration)===null||t===void 0?void 0:t.resumeConnection)===Er.DISABLED||((s=(n=this.pcManager)===null||n===void 0?void 0:n.currentState)!==null&&s!==void 0?s:wt.NEW)===wt.NEW)&&(this.fullReconnectOnNext=!0);try{this.attemptingReconnect=!0,this.fullReconnectOnNext?yield this.restartConnection():yield this.resumeConnection(e),this.clearPendingReconnect(),this.fullReconnectOnNext=!1}catch(r){this.reconnectAttempts+=1;let a=!0;r instanceof Bt?(this.log.debug("received unrecoverable error",Object.assign(Object.assign({},this.logContext),{error:r})),a=!1):r instanceof Fs||(this.fullReconnectOnNext=!0),a?this.handleDisconnect("reconnect",Rs.RR_UNKNOWN):(this.log.info("could not recover connection after ".concat(this.reconnectAttempts," attempts, ").concat(Date.now()-this.reconnectStart,"ms. giving up"),this.logContext),this.emit(le.Disconnected),yield this.close())}finally{this.attemptingReconnect=!1}}})}getNextRetryDelay(e){try{return this.reconnectPolicy.nextRetryDelayInMs(e)}catch(t){this.log.warn("encountered error in reconnect policy",Object.assign(Object.assign({},this.logContext),{error:t}))}return null}restartConnection(e){return P(this,void 0,void 0,function*(){var t,n,s;try{if(!this.url||!this.token)throw new Bt("could not reconnect, url or token not saved");this.log.info("reconnecting, attempt: ".concat(this.reconnectAttempts),this.logContext),this.emit(le.Restarting),this.client.isDisconnected||(yield this.client.sendLeave()),yield this.cleanupPeerConnections(),yield this.cleanupClient();let r;try{if(!this.signalOpts)throw this.log.warn("attempted connection restart, without signal options present",this.logContext),new Fs;r=yield this.join(e??this.url,this.token,this.signalOpts)}catch(a){throw a instanceof pt&&a.reason===Je.NotAllowed?new Bt("could not reconnect, token might be expired"):new Fs}if(this.shouldFailNext)throw this.shouldFailNext=!1,new Error("simulated failure");if(this.client.setReconnected(),this.emit(le.SignalRestarted,r),yield this.waitForPCReconnected(),this.client.currentState!==Tt.CONNECTED)throw new Fs("Signal connection got severed during reconnect");(t=this.regionUrlProvider)===null||t===void 0||t.resetAttempts(),this.emit(le.Restarted)}catch(r){const a=yield(n=this.regionUrlProvider)===null||n===void 0?void 0:n.getNextBestRegionUrl();if(a){yield this.restartConnection(a);return}else throw(s=this.regionUrlProvider)===null||s===void 0||s.resetAttempts(),r}})}resumeConnection(e){return P(this,void 0,void 0,function*(){var t;if(!this.url||!this.token)throw new Bt("could not reconnect, url or token not saved");if(!this.pcManager)throw new Bt("publisher and subscriber connections unset");this.log.info("resuming signal connection, attempt ".concat(this.reconnectAttempts),this.logContext),this.emit(le.Resuming);let n;try{this.setupSignalClientCallbacks(),n=yield this.client.reconnect(this.url,this.token,this.participantSid,e)}catch(s){let r="";throw s instanceof Error&&(r=s.message,this.log.error(s.message,Object.assign(Object.assign({},this.logContext),{error:s}))),s instanceof pt&&s.reason===Je.NotAllowed?new Bt("could not reconnect, token might be expired"):s instanceof pt&&s.reason===Je.LeaveRequest?s:new Fs(r)}if(this.emit(le.SignalResumed),n){const s=this.makeRTCConfiguration(n);this.pcManager.updateConfiguration(s),this.latestJoinResponse&&(this.latestJoinResponse.serverInfo=n.serverInfo)}else this.log.warn("Did not receive reconnect response",this.logContext);if(this.shouldFailNext)throw this.shouldFailNext=!1,new Error("simulated failure");if(yield this.pcManager.triggerIceRestart(),yield this.waitForPCReconnected(),this.client.currentState!==Tt.CONNECTED)throw new Fs("Signal connection got severed during reconnect");this.client.setReconnected(),((t=this.reliableDC)===null||t===void 0?void 0:t.readyState)==="open"&&this.reliableDC.id===null&&this.createDataChannels(),n!=null&&n.lastMessageSeq&&this.resendReliableMessagesForResume(n.lastMessageSeq),this.emit(le.Resumed)})}waitForPCInitialConnection(e,t){return P(this,void 0,void 0,function*(){if(!this.pcManager)throw new Bt("PC manager is closed");yield this.pcManager.ensurePCTransportConnection(t,e)})}waitForPCReconnected(){return P(this,void 0,void 0,function*(){this.pcState=In.Reconnecting,this.log.debug("waiting for peer connection to reconnect",this.logContext);try{if(yield on(Eb),!this.pcManager)throw new Bt("PC manager is closed");yield this.pcManager.ensurePCTransportConnection(void 0,this.peerConnectionTimeout),this.pcState=In.Connected}catch(e){throw this.pcState=In.Disconnected,new pt("could not establish PC connection, ".concat(e.message),Je.InternalError)}})}publishRpcResponse(e,t,n,s){return P(this,void 0,void 0,function*(){const r=new an({destinationIdentities:[e],kind:We.RELIABLE,value:{case:"rpcResponse",value:new Wu({requestId:t,value:s?{case:"error",value:s.toProto()}:{case:"payload",value:n??""}})}});yield this.sendDataPacket(r,We.RELIABLE)})}publishRpcAck(e,t){return P(this,void 0,void 0,function*(){const n=new an({destinationIdentities:[e],kind:We.RELIABLE,value:{case:"rpcAck",value:new Hu({requestId:t})}});yield this.sendDataPacket(n,We.RELIABLE)})}sendDataPacket(e,t){return P(this,void 0,void 0,function*(){yield this.ensurePublisherConnected(t),t===We.RELIABLE&&(e.sequence=this.reliableDataSequence,this.reliableDataSequence+=1);const n=e.toBinary(),s=this.dataChannelForKind(t);if(s){if(t===We.RELIABLE&&this.reliableMessageBuffer.push({data:n,sequence:e.sequence}),this.attemptingReconnect)return;s.send(n)}this.updateAndEmitDCBufferStatus(t)})}resendReliableMessagesForResume(e){return P(this,void 0,void 0,function*(){yield this.ensurePublisherConnected(We.RELIABLE);const t=this.dataChannelForKind(We.RELIABLE);t&&(this.reliableMessageBuffer.popToSequence(e),this.reliableMessageBuffer.getAll().forEach(n=>{t.send(n.data)})),this.updateAndEmitDCBufferStatus(We.RELIABLE)})}waitForBufferStatusLow(e){return new Promise((t,n)=>P(this,void 0,void 0,function*(){if(this.isBufferStatusLow(e))t();else{const s=()=>n("Engine closed");for(this.once(le.Closing,s);!this.dcBufferStatus.get(e);)yield on(10);this.off(le.Closing,s),t()}}))}ensureDataTransportConnected(e){return P(this,arguments,void 0,function(t){var n=this;let s=arguments.length>1&&arguments[1]!==void 0?arguments[1]:this.subscriberPrimary;return function*(){var r;if(!n.pcManager)throw new Bt("PC manager is closed");const a=s?n.pcManager.subscriber:n.pcManager.publisher,o=s?"Subscriber":"Publisher";if(!a)throw new pt("".concat(o," connection not set"),Je.InternalError);let c=!1;!s&&!n.dataChannelForKind(t,s)&&(n.createDataChannels(),c=!0),!c&&!s&&!n.pcManager.publisher.isICEConnected&&n.pcManager.publisher.getICEConnectionState()!=="checking"&&(c=!0),c&&n.negotiate();const l=n.dataChannelForKind(t,s);if((l==null?void 0:l.readyState)==="open")return;const d=new Date().getTime()+n.peerConnectionTimeout;for(;new Date().getTime()<d;){if(a.isICEConnected&&((r=n.dataChannelForKind(t,s))===null||r===void 0?void 0:r.readyState)==="open")return;yield on(50)}throw new pt("could not establish ".concat(o," connection, state: ").concat(a.getICEConnectionState()),Je.InternalError)}()})}ensurePublisherConnected(e){return P(this,void 0,void 0,function*(){this.publisherConnectionPromise||(this.publisherConnectionPromise=this.ensureDataTransportConnected(e,!1)),yield this.publisherConnectionPromise})}verifyTransport(){return!(!this.pcManager||this.pcManager.currentState!==wt.CONNECTED||!this.client.ws||this.client.ws.readyState===WebSocket.CLOSED)}negotiate(){return P(this,void 0,void 0,function*(){return new Promise((e,t)=>P(this,void 0,void 0,function*(){if(!this.pcManager){t(new uc("PC manager is closed"));return}this.pcManager.requirePublisher(),this.pcManager.publisher.getTransceivers().length==0&&!this.lossyDC&&!this.reliableDC&&this.createDataChannels();const n=new AbortController,s=()=>{n.abort(),this.log.debug("engine disconnected while negotiation was ongoing",this.logContext),e()};this.isClosed&&t("cannot negotiate on closed engine"),this.on(le.Closing,s),this.pcManager.publisher.once(Os.RTPVideoPayloadTypes,r=>{const a=new Map;r.forEach(o=>{const c=o.codec.toLowerCase();R0(c)&&a.set(o.payload,c)}),this.emit(le.RTPVideoMapUpdate,a)});try{yield this.pcManager.negotiate(n),e()}catch(r){r instanceof uc&&(this.fullReconnectOnNext=!0),this.handleDisconnect("negotiation",Rs.RR_UNKNOWN),t(r)}finally{this.off(le.Closing,s)}}))})}dataChannelForKind(e,t){if(t){if(e===We.LOSSY)return this.lossyDCSub;if(e===We.RELIABLE)return this.reliableDCSub}else{if(e===We.LOSSY)return this.lossyDC;if(e===We.RELIABLE)return this.reliableDC}}sendSyncState(e,t){var n,s;if(!this.pcManager){this.log.warn("sync state cannot be sent without peer connection setup",this.logContext);return}const r=this.pcManager.subscriber.getLocalDescription(),a=this.pcManager.subscriber.getRemoteDescription(),o=(s=(n=this.signalOpts)===null||n===void 0?void 0:n.autoSubscribe)!==null&&s!==void 0?s:!0,c=new Array,l=new Array;e.forEach(d=>{d.isDesired!==o&&c.push(d.trackSid),d.isEnabled||l.push(d.trackSid)}),this.client.sendSyncState(new lh({answer:r?Pa({sdp:r.sdp,type:r.type}):void 0,offer:a?Pa({sdp:a.sdp,type:a.type}):void 0,subscription:new va({trackSids:c,subscribe:!o,participantTracks:[]}),publishTracks:F0(t),dataChannels:this.dataChannelsInfo(),trackSidsDisabled:l,datachannelReceiveStates:this.reliableReceivedState.map((d,u)=>new dh({publisherSid:u,lastSeq:d}))}))}failNext(){this.shouldFailNext=!0}dataChannelsInfo(){const e=[],t=(n,s)=>{(n==null?void 0:n.id)!==void 0&&n.id!==null&&e.push(new uh({label:n.label,id:n.id,target:s}))};return t(this.dataChannelForKind(We.LOSSY),An.PUBLISHER),t(this.dataChannelForKind(We.RELIABLE),An.PUBLISHER),t(this.dataChannelForKind(We.LOSSY,!0),An.SUBSCRIBER),t(this.dataChannelForKind(We.RELIABLE,!0),An.SUBSCRIBER),e}clearReconnectTimeout(){this.reconnectTimeout&&$t.clearTimeout(this.reconnectTimeout)}clearPendingReconnect(){this.clearReconnectTimeout(),this.reconnectAttempts=0}registerOnLineListener(){cn()&&window.addEventListener("online",this.handleBrowserOnLine)}deregisterOnLineListener(){cn()&&window.removeEventListener("online",this.handleBrowserOnLine)}}class Fs extends Error{}function Ab(i){return i!==void 0&&i>13}function Rb(i,e){const t=i.participantIdentity?i.participantIdentity:e.participantIdentity;i.participantIdentity=t,e.participantIdentity=t;const n=i.destinationIdentities.length!==0?i.destinationIdentities:e.destinationIdentities;i.destinationIdentities=n,e.destinationIdentities=n}class jc{constructor(e,t){this.lastUpdateAt=0,this.settingsCacheTime=3e3,this.attemptedRegions=[],this.serverUrl=new URL(e),this.token=t}updateToken(e){this.token=e}isCloud(){return yc(this.serverUrl)}getServerUrl(){return this.serverUrl}getNextBestRegionUrl(e){return P(this,void 0,void 0,function*(){if(!this.isCloud())throw Error("region availability is only supported for LiveKit Cloud domains");(!this.regionSettings||Date.now()-this.lastUpdateAt>this.settingsCacheTime)&&(this.regionSettings=yield this.fetchRegionSettings(e));const t=this.regionSettings.regions.filter(n=>!this.attemptedRegions.find(s=>s.url===n.url));if(t.length>0){const n=t[0];return this.attemptedRegions.push(n),Ke.debug("next region: ".concat(n.region)),n.url}else return null})}resetAttempts(){this.attemptedRegions=[]}fetchRegionSettings(e){return P(this,void 0,void 0,function*(){const t=yield fetch("".concat(Pb(this.serverUrl),"/regions"),{headers:{authorization:"Bearer ".concat(this.token)},signal:e});if(t.ok){const n=yield t.json();return this.lastUpdateAt=Date.now(),n}else throw new pt("Could not fetch region settings: ".concat(t.statusText),t.status===401?Je.NotAllowed:Je.InternalError,t.status)})}setServerReportedRegions(e){this.regionSettings=e,this.lastUpdateAt=Date.now()}}function Pb(i){return"".concat(i.protocol.replace("ws","http"),"//").concat(i.host,"/settings")}class qf{get info(){return this._info}validateBytesReceived(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!1;if(!(typeof this.totalByteSize!="number"||this.totalByteSize===0)){if(e&&this.bytesReceived<this.totalByteSize)throw new Ui("Not enough chunk(s) received - expected ".concat(this.totalByteSize," bytes of data total, only received ").concat(this.bytesReceived," bytes"),Pn.Incomplete);if(this.bytesReceived>this.totalByteSize)throw new Ui("Extra chunk(s) received - expected ".concat(this.totalByteSize," bytes of data total, received ").concat(this.bytesReceived," bytes"),Pn.LengthExceeded)}}constructor(e,t,n,s){this.reader=t,this.totalByteSize=n,this._info=e,this.bytesReceived=0,this.outOfBandFailureRejectingFuture=s}}class kb extends qf{handleChunkReceived(e){var t;this.bytesReceived+=e.content.byteLength,this.validateBytesReceived();const n=this.totalByteSize?this.bytesReceived/this.totalByteSize:void 0;(t=this.onProgress)===null||t===void 0||t.call(this,n)}[Symbol.asyncIterator](){const e=this.reader.getReader();let t=new $n,n=null,s=null;if(this.signal){const a=this.signal;s=()=>{var o;(o=t.reject)===null||o===void 0||o.call(t,a.reason)},a.addEventListener("abort",s),n=a}const r=()=>{e.releaseLock(),n&&s&&n.removeEventListener("abort",s),this.signal=void 0};return{next:()=>P(this,void 0,void 0,function*(){var a,o;try{const{done:c,value:l}=yield Promise.race([e.read(),t.promise,(o=(a=this.outOfBandFailureRejectingFuture)===null||a===void 0?void 0:a.promise)!==null&&o!==void 0?o:new Promise(()=>{})]);return c?(this.validateBytesReceived(!0),{done:!0,value:void 0}):(this.handleChunkReceived(l),{done:!1,value:l.content})}catch(c){throw r(),c}}),return(){return P(this,void 0,void 0,function*(){return r(),{done:!0,value:void 0}})}}}withAbortSignal(e){return this.signal=e,this}readAll(){return P(this,arguments,void 0,function(){var e=this;let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};return function*(){var n,s,r,a;let o=new Set;const c=t.signal?e.withAbortSignal(t.signal):e;try{for(var l=!0,d=di(c),u;u=yield d.next(),n=u.done,!n;l=!0){a=u.value,l=!1;const h=a;o.add(h)}}catch(h){s={error:h}}finally{try{!l&&!n&&(r=d.return)&&(yield r.call(d))}finally{if(s)throw s.error}}return Array.from(o)}()})}}class Ib extends qf{constructor(e,t,n,s){super(e,t,n,s),this.receivedChunks=new Map}handleChunkReceived(e){var t;const n=Ra(e.chunkIndex),s=this.receivedChunks.get(n);if(s&&s.version>e.version)return;this.receivedChunks.set(n,e),this.bytesReceived+=e.content.byteLength,this.validateBytesReceived();const r=this.totalByteSize?this.bytesReceived/this.totalByteSize:void 0;(t=this.onProgress)===null||t===void 0||t.call(this,r)}[Symbol.asyncIterator](){const e=this.reader.getReader(),t=new TextDecoder("utf-8",{fatal:!0});let n=new $n,s=null,r=null;if(this.signal){const o=this.signal;r=()=>{var c;(c=n.reject)===null||c===void 0||c.call(n,o.reason)},o.addEventListener("abort",r),s=o}const a=()=>{e.releaseLock(),s&&r&&s.removeEventListener("abort",r),this.signal=void 0};return{next:()=>P(this,void 0,void 0,function*(){var o,c;try{const{done:l,value:d}=yield Promise.race([e.read(),n.promise,(c=(o=this.outOfBandFailureRejectingFuture)===null||o===void 0?void 0:o.promise)!==null&&c!==void 0?c:new Promise(()=>{})]);if(l)return this.validateBytesReceived(!0),{done:!0,value:void 0};{this.handleChunkReceived(d);let u;try{u=t.decode(d.content)}catch(h){throw new Ui("Cannot decode datastream chunk ".concat(d.chunkIndex," as text: ").concat(h),Pn.DecodeFailed)}return{done:!1,value:u}}}catch(l){throw a(),l}}),return(){return P(this,void 0,void 0,function*(){return a(),{done:!0,value:void 0}})}}}withAbortSignal(e){return this.signal=e,this}readAll(){return P(this,arguments,void 0,function(){var e=this;let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};return function*(){var n,s,r,a;let o="";const c=t.signal?e.withAbortSignal(t.signal):e;try{for(var l=!0,d=di(c),u;u=yield d.next(),n=u.done,!n;l=!0)a=u.value,l=!1,o+=a}catch(h){s={error:h}}finally{try{!l&&!n&&(r=d.return)&&(yield r.call(d))}finally{if(s)throw s.error}}return o}()})}}class Db{constructor(){this.log=Ke,this.byteStreamControllers=new Map,this.textStreamControllers=new Map,this.byteStreamHandlers=new Map,this.textStreamHandlers=new Map}registerTextStreamHandler(e,t){if(this.textStreamHandlers.has(e))throw new Ui('A text stream handler for topic "'.concat(e,'" has already been set.'),Pn.HandlerAlreadyRegistered);this.textStreamHandlers.set(e,t)}unregisterTextStreamHandler(e){this.textStreamHandlers.delete(e)}registerByteStreamHandler(e,t){if(this.byteStreamHandlers.has(e))throw new Ui('A byte stream handler for topic "'.concat(e,'" has already been set.'),Pn.HandlerAlreadyRegistered);this.byteStreamHandlers.set(e,t)}unregisterByteStreamHandler(e){this.byteStreamHandlers.delete(e)}clearHandlersAndControllers(){this.byteStreamControllers.clear(),this.textStreamControllers.clear(),this.byteStreamHandlers.clear(),this.textStreamHandlers.clear()}validateParticipantHasNoActiveDataStreams(e){var t,n,s,r;const a=Array.from(this.textStreamControllers.entries()).filter(c=>c[1].sendingParticipantIdentity===e),o=Array.from(this.byteStreamControllers.entries()).filter(c=>c[1].sendingParticipantIdentity===e);if(a.length>0||o.length>0){const c=new Ui("Participant ".concat(e," unexpectedly disconnected in the middle of sending data"),Pn.AbnormalEnd);for(const[l,d]of o)(n=(t=d.outOfBandFailureRejectingFuture).reject)===null||n===void 0||n.call(t,c),this.byteStreamControllers.delete(l);for(const[l,d]of a)(r=(s=d.outOfBandFailureRejectingFuture).reject)===null||r===void 0||r.call(s,c),this.textStreamControllers.delete(l)}}handleDataStreamPacket(e){return P(this,void 0,void 0,function*(){switch(e.value.case){case"streamHeader":return this.handleStreamHeader(e.value.value,e.participantIdentity);case"streamChunk":return this.handleStreamChunk(e.value.value);case"streamTrailer":return this.handleStreamTrailer(e.value.value);default:throw new Error('DataPacket of value "'.concat(e.value.case,'" is not data stream related!'))}})}handleStreamHeader(e,t){return P(this,void 0,void 0,function*(){var n;if(e.contentHeader.case==="byteHeader"){const s=this.byteStreamHandlers.get(e.topic);if(!s){this.log.debug("ignoring incoming byte stream due to no handler for topic",e.topic);return}let r;const a=new $n,o={id:e.streamId,name:(n=e.contentHeader.value.name)!==null&&n!==void 0?n:"unknown",mimeType:e.mimeType,size:e.totalLength?Number(e.totalLength):void 0,topic:e.topic,timestamp:Ra(e.timestamp),attributes:e.attributes},c=new ReadableStream({start:l=>{if(r=l,this.textStreamControllers.has(e.streamId))throw new Ui("A data stream read is already in progress for a stream with id ".concat(e.streamId,"."),Pn.AlreadyOpened);this.byteStreamControllers.set(e.streamId,{info:o,controller:r,startTime:Date.now(),sendingParticipantIdentity:t,outOfBandFailureRejectingFuture:a})}});s(new kb(o,c,Ra(e.totalLength),a),{identity:t})}else if(e.contentHeader.case==="textHeader"){const s=this.textStreamHandlers.get(e.topic);if(!s){this.log.debug("ignoring incoming text stream due to no handler for topic",e.topic);return}let r;const a=new $n,o={id:e.streamId,mimeType:e.mimeType,size:e.totalLength?Number(e.totalLength):void 0,topic:e.topic,timestamp:Number(e.timestamp),attributes:e.attributes},c=new ReadableStream({start:l=>{if(r=l,this.textStreamControllers.has(e.streamId))throw new Ui("A data stream read is already in progress for a stream with id ".concat(e.streamId,"."),Pn.AlreadyOpened);this.textStreamControllers.set(e.streamId,{info:o,controller:r,startTime:Date.now(),sendingParticipantIdentity:t,outOfBandFailureRejectingFuture:a})}});s(new Ib(o,c,Ra(e.totalLength),a),{identity:t})}})}handleStreamChunk(e){const t=this.byteStreamControllers.get(e.streamId);t&&e.content.length>0&&t.controller.enqueue(e);const n=this.textStreamControllers.get(e.streamId);n&&e.content.length>0&&n.controller.enqueue(e)}handleStreamTrailer(e){const t=this.textStreamControllers.get(e.streamId);t&&(t.info.attributes=Object.assign(Object.assign({},t.info.attributes),e.attributes),t.controller.close(),this.textStreamControllers.delete(e.streamId));const n=this.byteStreamControllers.get(e.streamId);n&&(n.info.attributes=Object.assign(Object.assign({},n.info.attributes),e.attributes),n.controller.close(),this.byteStreamControllers.delete(e.streamId))}}class jf{constructor(e,t,n){this.writableStream=e,this.defaultWriter=e.getWriter(),this.onClose=n,this.info=t}write(e){return this.defaultWriter.write(e)}close(){return P(this,void 0,void 0,function*(){var e;yield this.defaultWriter.close(),this.defaultWriter.releaseLock(),(e=this.onClose)===null||e===void 0||e.call(this)})}}class Lb extends jf{}class Nb extends jf{}const $f=15e3;class Ub{constructor(e,t){this.engine=e,this.log=t}setupEngine(e){this.engine=e}sendText(e,t){return P(this,void 0,void 0,function*(){var n;const s=crypto.randomUUID(),a=new TextEncoder().encode(e).byteLength,o=(n=t==null?void 0:t.attachments)===null||n===void 0?void 0:n.map(()=>crypto.randomUUID()),c=new Array(o?o.length+1:1).fill(0),l=(u,h)=>{var f;c[h]=u;const g=c.reduce((v,m)=>v+m,0);(f=t==null?void 0:t.onProgress)===null||f===void 0||f.call(t,g)},d=yield this.streamText({streamId:s,totalSize:a,destinationIdentities:t==null?void 0:t.destinationIdentities,topic:t==null?void 0:t.topic,attachedStreamIds:o,attributes:t==null?void 0:t.attributes});return yield d.write(e),l(1,0),yield d.close(),t!=null&&t.attachments&&o&&(yield Promise.all(t.attachments.map((u,h)=>P(this,void 0,void 0,function*(){return this._sendFile(o[h],u,{topic:t.topic,mimeType:u.type,onProgress:f=>{l(f,h+1)}})})))),d.info})}streamText(e){return P(this,void 0,void 0,function*(){var t,n;const s=(t=e==null?void 0:e.streamId)!==null&&t!==void 0?t:crypto.randomUUID(),r={id:s,mimeType:"text/plain",timestamp:Date.now(),topic:(n=e==null?void 0:e.topic)!==null&&n!==void 0?n:"",size:e==null?void 0:e.totalSize,attributes:e==null?void 0:e.attributes},a=new Ho({streamId:s,mimeType:r.mimeType,topic:r.topic,timestamp:cs(r.timestamp),totalLength:cs(e==null?void 0:e.totalSize),attributes:r.attributes,contentHeader:{case:"textHeader",value:new Qu({version:e==null?void 0:e.version,attachedStreamIds:e==null?void 0:e.attachedStreamIds,replyToStreamId:e==null?void 0:e.replyToStreamId,operationType:(e==null?void 0:e.type)==="update"?Go.UPDATE:Go.CREATE})}}),o=e==null?void 0:e.destinationIdentities,c=new an({destinationIdentities:o,value:{case:"streamHeader",value:a}});yield this.engine.sendDataPacket(c,We.RELIABLE);let l=0;const d=this.engine,u=new WritableStream({write(g){return P(this,void 0,void 0,function*(){for(const v of N0(g,$f)){yield d.waitForBufferStatusLow(We.RELIABLE);const m=new Wo({content:v,streamId:s,chunkIndex:cs(l)}),p=new an({destinationIdentities:o,value:{case:"streamChunk",value:m}});yield d.sendDataPacket(p,We.RELIABLE),l+=1}})},close(){return P(this,void 0,void 0,function*(){const g=new qo({streamId:s}),v=new an({destinationIdentities:o,value:{case:"streamTrailer",value:g}});yield d.sendDataPacket(v,We.RELIABLE)})},abort(g){console.log("Sink error:",g)}});let h=()=>P(this,void 0,void 0,function*(){yield f.close()});d.once(le.Closing,h);const f=new Lb(u,r,()=>this.engine.off(le.Closing,h));return f})}sendFile(e,t){return P(this,void 0,void 0,function*(){const n=crypto.randomUUID();return yield this._sendFile(n,e,t),{id:n}})}_sendFile(e,t,n){return P(this,void 0,void 0,function*(){var s;const r=yield this.streamBytes({streamId:e,totalSize:t.size,name:t.name,mimeType:(s=n==null?void 0:n.mimeType)!==null&&s!==void 0?s:t.type,topic:n==null?void 0:n.topic,destinationIdentities:n==null?void 0:n.destinationIdentities}),a=t.stream().getReader();for(;;){const{done:o,value:c}=yield a.read();if(o)break;yield r.write(c)}return yield r.close(),r.info})}streamBytes(e){return P(this,void 0,void 0,function*(){var t,n,s,r,a;const o=(t=e==null?void 0:e.streamId)!==null&&t!==void 0?t:crypto.randomUUID(),c=e==null?void 0:e.destinationIdentities,l={id:o,mimeType:(n=e==null?void 0:e.mimeType)!==null&&n!==void 0?n:"application/octet-stream",topic:(s=e==null?void 0:e.topic)!==null&&s!==void 0?s:"",timestamp:Date.now(),attributes:e==null?void 0:e.attributes,size:e==null?void 0:e.totalSize,name:(r=e==null?void 0:e.name)!==null&&r!==void 0?r:"unknown"},d=new Ho({totalLength:cs((a=l.size)!==null&&a!==void 0?a:0),mimeType:l.mimeType,streamId:o,topic:l.topic,timestamp:cs(Date.now()),attributes:l.attributes,contentHeader:{case:"byteHeader",value:new eh({name:l.name})}}),u=new an({destinationIdentities:c,value:{case:"streamHeader",value:d}});yield this.engine.sendDataPacket(u,We.RELIABLE);let h=0;const f=new sn,g=this.engine,v=this.log,m=new WritableStream({write(x){return P(this,void 0,void 0,function*(){const C=yield f.lock();let b=0;try{for(;b<x.byteLength;){const S=x.slice(b,b+$f);yield g.waitForBufferStatusLow(We.RELIABLE);const M=new an({destinationIdentities:c,value:{case:"streamChunk",value:new Wo({content:S,streamId:o,chunkIndex:cs(h)})}});yield g.sendDataPacket(M,We.RELIABLE),h+=1,b+=S.byteLength}}finally{C()}})},close(){return P(this,void 0,void 0,function*(){const x=new qo({streamId:o}),C=new an({destinationIdentities:c,value:{case:"streamTrailer",value:x}});yield g.sendDataPacket(C,We.RELIABLE)})},abort(x){v.error("Sink error:",x)}});return new Nb(m,l)})}}class Xf extends Z{constructor(e,t,n,s,r){super(e,n,r),this.sid=t,this.receiver=s}get isLocal(){return!1}setMuted(e){this.isMuted!==e&&(this.isMuted=e,this._mediaStreamTrack.enabled=!e,this.emit(e?ae.Muted:ae.Unmuted,this))}setMediaStream(e){this.mediaStream=e;const t=n=>{n.track===this._mediaStreamTrack&&(e.removeEventListener("removetrack",t),this.receiver&&"playoutDelayHint"in this.receiver&&(this.receiver.playoutDelayHint=void 0),this.receiver=void 0,this._currentBitrate=0,this.emit(ae.Ended,this))};e.addEventListener("removetrack",t)}start(){this.startMonitor(),super.enable()}stop(){this.stopMonitor(),super.disable()}getRTCStatsReport(){return P(this,void 0,void 0,function*(){var e;return!((e=this.receiver)===null||e===void 0)&&e.getStats?yield this.receiver.getStats():void 0})}setPlayoutDelay(e){this.receiver?"playoutDelayHint"in this.receiver?this.receiver.playoutDelayHint=e:this.log.warn("Playout delay not supported in this browser"):this.log.warn("Cannot set playout delay, track already ended")}getPlayoutDelay(){if(this.receiver){if("playoutDelayHint"in this.receiver)return this.receiver.playoutDelayHint;this.log.warn("Playout delay not supported in this browser")}else this.log.warn("Cannot get playout delay, track already ended");return 0}startMonitor(){this.monitorInterval||(this.monitorInterval=setInterval(()=>this.monitorReceiver(),Vc)),B0()&&this.registerTimeSyncUpdate()}registerTimeSyncUpdate(){const e=()=>{var t;this.timeSyncHandle=requestAnimationFrame(()=>e());const n=(t=this.receiver)===null||t===void 0?void 0:t.getSynchronizationSources()[0];if(n){const{timestamp:s,rtpTimestamp:r}=n;r&&this.rtpTimestamp!==r&&(this.emit(ae.TimeSyncUpdate,{timestamp:s,rtpTimestamp:r}),this.rtpTimestamp=r)}};e()}}class Ob extends Xf{constructor(e,t,n,s,r,a){super(e,t,Z.Kind.Audio,n,a),this.monitorReceiver=()=>P(this,void 0,void 0,function*(){if(!this.receiver){this._currentBitrate=0;return}const o=yield this.getReceiverStats();o&&this.prevStats&&this.receiver&&(this._currentBitrate=ka(o,this.prevStats)),this.prevStats=o}),this.audioContext=s,this.webAudioPluginNodes=[],r&&(this.sinkId=r.deviceId)}setVolume(e){var t;for(const n of this.attachedElements)this.audioContext?(t=this.gainNode)===null||t===void 0||t.gain.setTargetAtTime(e,0,.1):n.volume=e;qn()&&this._mediaStreamTrack._setVolume(e),this.elementVolume=e}getVolume(){if(this.elementVolume)return this.elementVolume;if(qn())return 1;let e=0;return this.attachedElements.forEach(t=>{t.volume>e&&(e=t.volume)}),e}setSinkId(e){return P(this,void 0,void 0,function*(){this.sinkId=e,yield Promise.all(this.attachedElements.map(t=>{if(_c(t))return t.setSinkId(e)}))})}attach(e){const t=this.attachedElements.length===0;return e?super.attach(e):e=super.attach(),this.sinkId&&_c(e)&&e.setSinkId(this.sinkId).catch(n=>{this.log.error("Failed to set sink id on remote audio track",n,this.logContext)}),this.audioContext&&t&&(this.log.debug("using audio context mapping",this.logContext),this.connectWebAudio(this.audioContext,e),e.volume=0,e.muted=!0),this.elementVolume&&this.setVolume(this.elementVolume),e}detach(e){let t;return e?(t=super.detach(e),this.audioContext&&(this.attachedElements.length>0?this.connectWebAudio(this.audioContext,this.attachedElements[0]):this.disconnectWebAudio())):(t=super.detach(),this.disconnectWebAudio()),t}setAudioContext(e){this.audioContext=e,e&&this.attachedElements.length>0?this.connectWebAudio(e,this.attachedElements[0]):e||this.disconnectWebAudio()}setWebAudioPlugins(e){this.webAudioPluginNodes=e,this.attachedElements.length>0&&this.audioContext&&this.connectWebAudio(this.audioContext,this.attachedElements[0])}connectWebAudio(e,t){this.disconnectWebAudio(),this.sourceNode=e.createMediaStreamSource(t.srcObject);let n=this.sourceNode;this.webAudioPluginNodes.forEach(s=>{n.connect(s),n=s}),this.gainNode=e.createGain(),n.connect(this.gainNode),this.gainNode.connect(e.destination),this.elementVolume&&this.gainNode.gain.setTargetAtTime(this.elementVolume,0,.1),e.state!=="running"&&e.resume().then(()=>{e.state!=="running"&&this.emit(ae.AudioPlaybackFailed,new Error("Audio Context couldn't be started automatically"))}).catch(s=>{this.emit(ae.AudioPlaybackFailed,s)})}disconnectWebAudio(){var e,t;(e=this.gainNode)===null||e===void 0||e.disconnect(),(t=this.sourceNode)===null||t===void 0||t.disconnect(),this.gainNode=void 0,this.sourceNode=void 0}getReceiverStats(){return P(this,void 0,void 0,function*(){if(!this.receiver||!this.receiver.getStats)return;const e=yield this.receiver.getStats();let t;return e.forEach(n=>{n.type==="inbound-rtp"&&(t={type:"audio",streamId:n.id,timestamp:n.timestamp,jitter:n.jitter,bytesReceived:n.bytesReceived,concealedSamples:n.concealedSamples,concealmentEvents:n.concealmentEvents,silentConcealedSamples:n.silentConcealedSamples,silentConcealmentEvents:n.silentConcealmentEvents,totalAudioEnergy:n.totalAudioEnergy,totalSamplesDuration:n.totalSamplesDuration})}),t})}}const $c=100;class Fb extends Xf{constructor(e,t,n,s,r){super(e,t,Z.Kind.Video,n,r),this.elementInfos=[],this.monitorReceiver=()=>P(this,void 0,void 0,function*(){if(!this.receiver){this._currentBitrate=0;return}const a=yield this.getReceiverStats();a&&this.prevStats&&this.receiver&&(this._currentBitrate=ka(a,this.prevStats)),this.prevStats=a}),this.debouncedHandleResize=Uc(()=>{this.updateDimensions()},$c),this.adaptiveStreamSettings=s}get isAdaptiveStream(){return this.adaptiveStreamSettings!==void 0}setStreamState(e){super.setStreamState(e),console.log("setStreamState",e),e===Z.StreamState.Active&&this.updateVisibility()}get mediaStreamTrack(){return this._mediaStreamTrack}setMuted(e){super.setMuted(e),this.attachedElements.forEach(t=>{e?Ns(this._mediaStreamTrack,t):Ls(this._mediaStreamTrack,t)})}attach(e){if(e?super.attach(e):e=super.attach(),this.adaptiveStreamSettings&&this.elementInfos.find(t=>t.element===e)===void 0){const t=new Bb(e);this.observeElementInfo(t)}return e}observeElementInfo(e){this.adaptiveStreamSettings&&this.elementInfos.find(t=>t===e)===void 0?(e.handleResize=()=>{this.debouncedHandleResize()},e.handleVisibilityChanged=()=>{this.updateVisibility()},this.elementInfos.push(e),e.observe(),this.debouncedHandleResize(),this.updateVisibility()):this.log.warn("visibility resize observer not triggered",this.logContext)}stopObservingElementInfo(e){if(!this.isAdaptiveStream){this.log.warn("stopObservingElementInfo ignored",this.logContext);return}const t=this.elementInfos.filter(n=>n===e);for(const n of t)n.stopObserving();this.elementInfos=this.elementInfos.filter(n=>n!==e),this.updateVisibility(),this.debouncedHandleResize()}detach(e){let t=[];if(e)return this.stopObservingElement(e),super.detach(e);t=super.detach();for(const n of t)this.stopObservingElement(n);return t}getDecoderImplementation(){var e;return(e=this.prevStats)===null||e===void 0?void 0:e.decoderImplementation}getReceiverStats(){return P(this,void 0,void 0,function*(){if(!this.receiver||!this.receiver.getStats)return;const e=yield this.receiver.getStats();let t,n="",s=new Map;return e.forEach(r=>{r.type==="inbound-rtp"?(n=r.codecId,t={type:"video",streamId:r.id,framesDecoded:r.framesDecoded,framesDropped:r.framesDropped,framesReceived:r.framesReceived,packetsReceived:r.packetsReceived,packetsLost:r.packetsLost,frameWidth:r.frameWidth,frameHeight:r.frameHeight,pliCount:r.pliCount,firCount:r.firCount,nackCount:r.nackCount,jitter:r.jitter,timestamp:r.timestamp,bytesReceived:r.bytesReceived,decoderImplementation:r.decoderImplementation}):r.type==="codec"&&s.set(r.id,r)}),t&&n!==""&&s.get(n)&&(t.mimeType=s.get(n).mimeType),t})}stopObservingElement(e){const t=this.elementInfos.filter(n=>n.element===e);for(const n of t)this.stopObservingElementInfo(n)}handleAppVisibilityChanged(){const e=Object.create(null,{handleAppVisibilityChanged:{get:()=>super.handleAppVisibilityChanged}});return P(this,void 0,void 0,function*(){yield e.handleAppVisibilityChanged.call(this),this.isAdaptiveStream&&this.updateVisibility()})}updateVisibility(e){var t,n;const s=this.elementInfos.reduce((c,l)=>Math.max(c,l.visibilityChangedAt||0),0),r=!((n=(t=this.adaptiveStreamSettings)===null||t===void 0?void 0:t.pauseVideoInBackground)!==null&&n!==void 0)||n?this.isInBackground:!1,a=this.elementInfos.some(c=>c.pictureInPicture),o=this.elementInfos.some(c=>c.visible)&&!r||a;if(!(this.lastVisible===o&&!e)){if(!o&&Date.now()-s<$c){$t.setTimeout(()=>{this.updateVisibility()},$c);return}this.lastVisible=o,this.emit(ae.VisibilityChanged,o,this)}}updateDimensions(){var e,t;let n=0,s=0;const r=this.getPixelDensity();for(const a of this.elementInfos){const o=a.width()*r,c=a.height()*r;o+c>n+s&&(n=o,s=c)}((e=this.lastDimensions)===null||e===void 0?void 0:e.width)===n&&((t=this.lastDimensions)===null||t===void 0?void 0:t.height)===s||(this.lastDimensions={width:n,height:s},this.emit(ae.VideoDimensionsChanged,this.lastDimensions,this))}getPixelDensity(){var e;const t=(e=this.adaptiveStreamSettings)===null||e===void 0?void 0:e.pixelDensity;return t==="screen"?hf():t||(hf()>2?2:1)}}class Bb{get visible(){return this.isPiP||this.isIntersecting}get pictureInPicture(){return this.isPiP}constructor(e,t){this.onVisibilityChanged=n=>{var s;const{target:r,isIntersecting:a}=n;r===this.element&&(this.isIntersecting=a,this.isPiP=Ur(this.element),this.visibilityChangedAt=Date.now(),(s=this.handleVisibilityChanged)===null||s===void 0||s.call(this))},this.onEnterPiP=()=>{var n,s,r;(s=(n=window.documentPictureInPicture)===null||n===void 0?void 0:n.window)===null||s===void 0||s.addEventListener("pagehide",this.onLeavePiP),this.isPiP=Ur(this.element),(r=this.handleVisibilityChanged)===null||r===void 0||r.call(this)},this.onLeavePiP=()=>{var n;this.isPiP=Ur(this.element),(n=this.handleVisibilityChanged)===null||n===void 0||n.call(this)},this.element=e,this.isIntersecting=t??Xc(e),this.isPiP=cn()&&Ur(e),this.visibilityChangedAt=0}width(){return this.element.clientWidth}height(){return this.element.clientHeight}observe(){var e,t,n;this.isIntersecting=Xc(this.element),this.isPiP=Ur(this.element),this.element.handleResize=()=>{var s;(s=this.handleResize)===null||s===void 0||s.call(this)},this.element.handleVisibilityChanged=this.onVisibilityChanged,pf().observe(this.element),ff().observe(this.element),this.element.addEventListener("enterpictureinpicture",this.onEnterPiP),this.element.addEventListener("leavepictureinpicture",this.onLeavePiP),(e=window.documentPictureInPicture)===null||e===void 0||e.addEventListener("enter",this.onEnterPiP),(n=(t=window.documentPictureInPicture)===null||t===void 0?void 0:t.window)===null||n===void 0||n.addEventListener("pagehide",this.onLeavePiP)}stopObserving(){var e,t,n,s,r;(e=pf())===null||e===void 0||e.unobserve(this.element),(t=ff())===null||t===void 0||t.unobserve(this.element),this.element.removeEventListener("enterpictureinpicture",this.onEnterPiP),this.element.removeEventListener("leavepictureinpicture",this.onLeavePiP),(n=window.documentPictureInPicture)===null||n===void 0||n.removeEventListener("enter",this.onEnterPiP),(r=(s=window.documentPictureInPicture)===null||s===void 0?void 0:s.window)===null||r===void 0||r.removeEventListener("pagehide",this.onLeavePiP)}}function Ur(i){var e,t;return document.pictureInPictureElement===i?!0:!((e=window.documentPictureInPicture)===null||e===void 0)&&e.window?Xc(i,(t=window.documentPictureInPicture)===null||t===void 0?void 0:t.window):!1}function Xc(i,e){const t=e||window;let n=i.offsetTop,s=i.offsetLeft;const r=i.offsetWidth,a=i.offsetHeight,{hidden:o}=i,{display:c}=getComputedStyle(i);for(;i.offsetParent;)i=i.offsetParent,n+=i.offsetTop,s+=i.offsetLeft;return n<t.pageYOffset+t.innerHeight&&s<t.pageXOffset+t.innerWidth&&n+a>t.pageYOffset&&s+r>t.pageXOffset&&!o&&c!=="none"}class pi extends Hn.EventEmitter{constructor(e,t,n,s){var r;super(),this.metadataMuted=!1,this.encryption=hn.NONE,this.log=Ke,this.handleMuted=()=>{this.emit(ae.Muted)},this.handleUnmuted=()=>{this.emit(ae.Unmuted)},this.log=li((r=s==null?void 0:s.loggerName)!==null&&r!==void 0?r:Rn.Publication),this.loggerContextCb=this.loggerContextCb,this.setMaxListeners(100),this.kind=e,this.trackSid=t,this.trackName=n,this.source=Z.Source.Unknown}setTrack(e){this.track&&(this.track.off(ae.Muted,this.handleMuted),this.track.off(ae.Unmuted,this.handleUnmuted)),this.track=e,e&&(e.on(ae.Muted,this.handleMuted),e.on(ae.Unmuted,this.handleUnmuted))}get logContext(){var e;return Object.assign(Object.assign({},(e=this.loggerContextCb)===null||e===void 0?void 0:e.call(this)),Xe(this))}get isMuted(){return this.metadataMuted}get isEnabled(){return!0}get isSubscribed(){return this.track!==void 0}get isEncrypted(){return this.encryption!==hn.NONE}get audioTrack(){if(Xn(this.track))return this.track}get videoTrack(){if(Fi(this.track))return this.track}updateInfo(e){this.trackSid=e.sid,this.trackName=e.name,this.source=Z.sourceFromProto(e.source),this.mimeType=e.mimeType,this.kind===Z.Kind.Video&&e.width>0&&(this.dimensions={width:e.width,height:e.height},this.simulcasted=e.simulcast),this.encryption=e.encryption,this.trackInfo=e,this.log.debug("update publication info",Object.assign(Object.assign({},this.logContext),{info:e}))}}(function(i){(function(e){e.Desired="desired",e.Subscribed="subscribed",e.Unsubscribed="unsubscribed"})(i.SubscriptionStatus||(i.SubscriptionStatus={})),function(e){e.Allowed="allowed",e.NotAllowed="not_allowed"}(i.PermissionStatus||(i.PermissionStatus={}))})(pi||(pi={}));class Kc extends pi{get isUpstreamPaused(){var e;return(e=this.track)===null||e===void 0?void 0:e.isUpstreamPaused}constructor(e,t,n,s){super(e,t.sid,t.name,s),this.track=void 0,this.handleTrackEnded=()=>{this.emit(ae.Ended)},this.handleCpuConstrained=()=>{this.track&&Fi(this.track)&&this.emit(ae.CpuConstrained,this.track)},this.updateInfo(t),this.setTrack(n)}setTrack(e){this.track&&(this.track.off(ae.Ended,this.handleTrackEnded),this.track.off(ae.CpuConstrained,this.handleCpuConstrained)),super.setTrack(e),e&&(e.on(ae.Ended,this.handleTrackEnded),e.on(ae.CpuConstrained,this.handleCpuConstrained))}get isMuted(){return this.track?this.track.isMuted:super.isMuted}get audioTrack(){return super.audioTrack}get videoTrack(){return super.videoTrack}get isLocal(){return!0}mute(){return P(this,void 0,void 0,function*(){var e;return(e=this.track)===null||e===void 0?void 0:e.mute()})}unmute(){return P(this,void 0,void 0,function*(){var e;return(e=this.track)===null||e===void 0?void 0:e.unmute()})}pauseUpstream(){return P(this,void 0,void 0,function*(){var e;yield(e=this.track)===null||e===void 0?void 0:e.pauseUpstream()})}resumeUpstream(){return P(this,void 0,void 0,function*(){var e;yield(e=this.track)===null||e===void 0?void 0:e.resumeUpstream()})}getTrackFeatures(){var e;if(Xn(this.track)){const t=this.track.getSourceTrackSettings(),n=new Set;return t.autoGainControl&&n.add(Ht.TF_AUTO_GAIN_CONTROL),t.echoCancellation&&n.add(Ht.TF_ECHO_CANCELLATION),t.noiseSuppression&&n.add(Ht.TF_NOISE_SUPPRESSION),t.channelCount&&t.channelCount>1&&n.add(Ht.TF_STEREO),!((e=this.options)===null||e===void 0)&&e.dtx||n.add(Ht.TF_NO_DTX),this.track.enhancedNoiseCancellation&&n.add(Ht.TF_ENHANCED_NOISE_CANCELLATION),Array.from(n.values())}else return[]}}function La(i,e){return P(this,void 0,void 0,function*(){i??(i={});let t=!1;const{audioProcessor:n,videoProcessor:s,optionsWithoutProcessor:r}=yf(i);let a=r.audio,o=r.video;if(n&&typeof r.audio=="object"&&(r.audio.processor=n),s&&typeof r.video=="object"&&(r.video.processor=s),i.audio&&typeof r.audio=="object"&&typeof r.audio.deviceId=="string"){const u=r.audio.deviceId;r.audio.deviceId={exact:u},t=!0,a=Object.assign(Object.assign({},r.audio),{deviceId:{ideal:u}})}if(r.video&&typeof r.video=="object"&&typeof r.video.deviceId=="string"){const u=r.video.deviceId;r.video.deviceId={exact:u},t=!0,o=Object.assign(Object.assign({},r.video),{deviceId:{ideal:u}})}(r.audio===!0||typeof r.audio=="object"&&!r.audio.deviceId)&&(r.audio={deviceId:"default"}),r.video===!0?r.video={deviceId:"default"}:typeof r.video=="object"&&!r.video.deviceId&&(r.video.deviceId="default");const c=vf(r,If,Df),l=Ac(c),d=navigator.mediaDevices.getUserMedia(l);r.audio&&(Wt.userMediaPromiseMap.set("audioinput",d),d.catch(()=>Wt.userMediaPromiseMap.delete("audioinput"))),r.video&&(Wt.userMediaPromiseMap.set("videoinput",d),d.catch(()=>Wt.userMediaPromiseMap.delete("videoinput")));try{const u=yield d;return yield Promise.all(u.getTracks().map(h=>P(this,void 0,void 0,function*(){const f=h.kind==="audio";let g=f?c.audio:c.video;(typeof g=="boolean"||!g)&&(g={});let v;const m=f?l.audio:l.video;typeof m!="boolean"&&(v=m);const p=h.getSettings().deviceId;v!=null&&v.deviceId&&Oi(v.deviceId)!==p?v.deviceId=p:v||(v={deviceId:p});const x=fb(h,v,e);return x.kind===Z.Kind.Video?x.source=Z.Source.Camera:x.kind===Z.Kind.Audio&&(x.source=Z.Source.Microphone),x.mediaStream=u,Xn(x)&&n?yield x.setProcessor(n):Fi(x)&&s&&(yield x.setProcessor(s)),x})))}catch(u){if(!t)throw u;return La(Object.assign(Object.assign({},i),{audio:a,video:o}),e)}})}function Vb(i){return P(this,void 0,void 0,function*(){return(yield La({audio:!1,video:!0}))[0]})}function zb(i){return P(this,void 0,void 0,function*(){return(yield La({audio:!0,video:!1}))[0]})}var zi;(function(i){i.Excellent="excellent",i.Good="good",i.Poor="poor",i.Lost="lost",i.Unknown="unknown"})(zi||(zi={}));function Gb(i){switch(i){case Cr.EXCELLENT:return zi.Excellent;case Cr.GOOD:return zi.Good;case Cr.POOR:return zi.Poor;case Cr.LOST:return zi.Lost;default:return zi.Unknown}}class Kf extends Hn.EventEmitter{get logContext(){var e,t;return Object.assign({},(t=(e=this.loggerOptions)===null||e===void 0?void 0:e.loggerContextCb)===null||t===void 0?void 0:t.call(e))}get isEncrypted(){return this.trackPublications.size>0&&Array.from(this.trackPublications.values()).every(e=>e.isEncrypted)}get isAgent(){var e;return((e=this.permissions)===null||e===void 0?void 0:e.agent)||this.kind===Mr.AGENT}get isActive(){var e;return((e=this.participantInfo)===null||e===void 0?void 0:e.state)===Ps.ACTIVE}get kind(){return this._kind}get attributes(){return Object.freeze(Object.assign({},this._attributes))}constructor(e,t,n,s,r,a){let o=arguments.length>6&&arguments[6]!==void 0?arguments[6]:Mr.STANDARD;var c;super(),this.audioLevel=0,this.isSpeaking=!1,this._connectionQuality=zi.Unknown,this.log=Ke,this.log=li((c=a==null?void 0:a.loggerName)!==null&&c!==void 0?c:Rn.Participant),this.loggerOptions=a,this.setMaxListeners(100),this.sid=e,this.identity=t,this.name=n,this.metadata=s,this.audioTrackPublications=new Map,this.videoTrackPublications=new Map,this.trackPublications=new Map,this._kind=o,this._attributes=r??{}}getTrackPublications(){return Array.from(this.trackPublications.values())}getTrackPublication(e){for(const[,t]of this.trackPublications)if(t.source===e)return t}getTrackPublicationByName(e){for(const[,t]of this.trackPublications)if(t.trackName===e)return t}waitUntilActive(){return this.isActive?Promise.resolve():this.activeFuture?this.activeFuture.promise:(this.activeFuture=new $n,this.once(ce.Active,()=>{var e,t;(t=(e=this.activeFuture)===null||e===void 0?void 0:e.resolve)===null||t===void 0||t.call(e),this.activeFuture=void 0}),this.activeFuture.promise)}get connectionQuality(){return this._connectionQuality}get isCameraEnabled(){var e;const t=this.getTrackPublication(Z.Source.Camera);return!(!((e=t==null?void 0:t.isMuted)!==null&&e!==void 0)||e)}get isMicrophoneEnabled(){var e;const t=this.getTrackPublication(Z.Source.Microphone);return!(!((e=t==null?void 0:t.isMuted)!==null&&e!==void 0)||e)}get isScreenShareEnabled(){return!!this.getTrackPublication(Z.Source.ScreenShare)}get isLocal(){return!1}get joinedAt(){return this.participantInfo?new Date(Number.parseInt(this.participantInfo.joinedAt.toString())*1e3):new Date}updateInfo(e){var t;return this.participantInfo&&this.participantInfo.sid===e.sid&&this.participantInfo.version>e.version?!1:(this.identity=e.identity,this.sid=e.sid,this._setName(e.name),this._setMetadata(e.metadata),this._setAttributes(e.attributes),e.state===Ps.ACTIVE&&((t=this.participantInfo)===null||t===void 0?void 0:t.state)!==Ps.ACTIVE&&this.emit(ce.Active),e.permission&&this.setPermissions(e.permission),this.participantInfo=e,!0)}_setMetadata(e){const t=this.metadata!==e,n=this.metadata;this.metadata=e,t&&this.emit(ce.ParticipantMetadataChanged,n)}_setName(e){const t=this.name!==e;this.name=e,t&&this.emit(ce.ParticipantNameChanged,e)}_setAttributes(e){const t=V0(this.attributes,e);this._attributes=e,Object.keys(t).length>0&&this.emit(ce.AttributesChanged,t)}setPermissions(e){var t,n,s,r,a,o;const c=this.permissions,l=e.canPublish!==((t=this.permissions)===null||t===void 0?void 0:t.canPublish)||e.canSubscribe!==((n=this.permissions)===null||n===void 0?void 0:n.canSubscribe)||e.canPublishData!==((s=this.permissions)===null||s===void 0?void 0:s.canPublishData)||e.hidden!==((r=this.permissions)===null||r===void 0?void 0:r.hidden)||e.recorder!==((a=this.permissions)===null||a===void 0?void 0:a.recorder)||e.canPublishSources.length!==this.permissions.canPublishSources.length||e.canPublishSources.some((d,u)=>{var h;return d!==((h=this.permissions)===null||h===void 0?void 0:h.canPublishSources[u])})||e.canSubscribeMetrics!==((o=this.permissions)===null||o===void 0?void 0:o.canSubscribeMetrics);return this.permissions=e,l&&this.emit(ce.ParticipantPermissionsChanged,c),l}setIsSpeaking(e){e!==this.isSpeaking&&(this.isSpeaking=e,e&&(this.lastSpokeAt=new Date),this.emit(ce.IsSpeakingChanged,e))}setConnectionQuality(e){const t=this._connectionQuality;this._connectionQuality=Gb(e),t!==this._connectionQuality&&this.emit(ce.ConnectionQualityChanged,this._connectionQuality)}setDisconnected(){var e,t;this.activeFuture&&((t=(e=this.activeFuture).reject)===null||t===void 0||t.call(e,new Error("Participant disconnected")),this.activeFuture=void 0)}setAudioContext(e){this.audioContext=e,this.audioTrackPublications.forEach(t=>Xn(t.track)&&t.track.setAudioContext(e))}addTrackPublication(e){e.on(ae.Muted,()=>{this.emit(ce.TrackMuted,e)}),e.on(ae.Unmuted,()=>{this.emit(ce.TrackUnmuted,e)});const t=e;switch(t.track&&(t.track.sid=e.trackSid),this.trackPublications.set(e.trackSid,e),e.kind){case Z.Kind.Audio:this.audioTrackPublications.set(e.trackSid,e);break;case Z.Kind.Video:this.videoTrackPublications.set(e.trackSid,e);break}}}function Hb(i){var e,t,n;if(!i.participantSid&&!i.participantIdentity)throw new Error("Invalid track permission, must provide at least one of participantIdentity and participantSid");return new oh({participantIdentity:(e=i.participantIdentity)!==null&&e!==void 0?e:"",participantSid:(t=i.participantSid)!==null&&t!==void 0?t:"",allTracks:(n=i.allowAll)!==null&&n!==void 0?n:!1,trackSids:i.allowedTrackSids||[]})}class Wb extends Kf{constructor(e,t,n,s,r,a){super(e,t,void 0,void 0,void 0,{loggerName:s.loggerName,loggerContextCb:()=>this.engine.logContext}),this.pendingPublishing=new Set,this.pendingPublishPromises=new Map,this.participantTrackPermissions=[],this.allParticipantsAllowedToSubscribe=!0,this.encryptionType=hn.NONE,this.enabledPublishVideoCodecs=[],this.pendingAcks=new Map,this.pendingResponses=new Map,this.handleReconnecting=()=>{this.reconnectFuture||(this.reconnectFuture=new $n)},this.handleReconnected=()=>{var o,c;(c=(o=this.reconnectFuture)===null||o===void 0?void 0:o.resolve)===null||c===void 0||c.call(o),this.reconnectFuture=void 0,this.updateTrackSubscriptionPermissions()},this.handleClosing=()=>{var o,c,l,d,u,h;this.reconnectFuture&&(this.reconnectFuture.promise.catch(f=>this.log.warn(f.message,this.logContext)),(c=(o=this.reconnectFuture)===null||o===void 0?void 0:o.reject)===null||c===void 0||c.call(o,"Got disconnected during reconnection attempt"),this.reconnectFuture=void 0),this.signalConnectedFuture&&((d=(l=this.signalConnectedFuture).reject)===null||d===void 0||d.call(l,"Got disconnected without signal connected"),this.signalConnectedFuture=void 0),(h=(u=this.activeAgentFuture)===null||u===void 0?void 0:u.reject)===null||h===void 0||h.call(u,"Got disconnected without active agent present"),this.activeAgentFuture=void 0,this.firstActiveAgent=void 0},this.handleSignalConnected=o=>{var c,l;o.participant&&this.updateInfo(o.participant),this.signalConnectedFuture||(this.signalConnectedFuture=new $n),(l=(c=this.signalConnectedFuture).resolve)===null||l===void 0||l.call(c)},this.handleSignalRequestResponse=o=>{const{requestId:c,reason:l,message:d}=o,u=this.pendingSignalRequests.get(c);u&&(l!==Qo.OK&&u.reject(new rf(d,l)),this.pendingSignalRequests.delete(c))},this.handleDataPacket=o=>{switch(o.value.case){case"rpcResponse":let c=o.value.value,l=null,d=null;c.value.case==="payload"?l=c.value.value:c.value.case==="error"&&(d=At.fromProto(c.value.value)),this.handleIncomingRpcResponse(c.requestId,l,d);break;case"rpcAck":let u=o.value.value;this.handleIncomingRpcAck(u.requestId);break}},this.updateTrackSubscriptionPermissions=()=>{this.log.debug("updating track subscription permissions",Object.assign(Object.assign({},this.logContext),{allParticipantsAllowed:this.allParticipantsAllowedToSubscribe,participantTrackPermissions:this.participantTrackPermissions})),this.engine.client.sendUpdateSubscriptionPermissions(this.allParticipantsAllowedToSubscribe,this.participantTrackPermissions.map(o=>Hb(o)))},this.onTrackUnmuted=o=>{this.onTrackMuted(o,o.isUpstreamPaused)},this.onTrackMuted=(o,c)=>{if(c===void 0&&(c=!0),!o.sid){this.log.error("could not update mute status for unpublished track",Object.assign(Object.assign({},this.logContext),Xe(o)));return}this.engine.updateMuteStatus(o.sid,c)},this.onTrackUpstreamPaused=o=>{this.log.debug("upstream paused",Object.assign(Object.assign({},this.logContext),Xe(o))),this.onTrackMuted(o,!0)},this.onTrackUpstreamResumed=o=>{this.log.debug("upstream resumed",Object.assign(Object.assign({},this.logContext),Xe(o))),this.onTrackMuted(o,o.isMuted)},this.onTrackFeatureUpdate=o=>{const c=this.audioTrackPublications.get(o.sid);if(!c){this.log.warn("Could not update local audio track settings, missing publication for track ".concat(o.sid),this.logContext);return}this.engine.client.sendUpdateLocalAudioTrack(c.trackSid,c.getTrackFeatures())},this.onTrackCpuConstrained=(o,c)=>{this.log.debug("track cpu constrained",Object.assign(Object.assign({},this.logContext),Xe(c))),this.emit(ce.LocalTrackCpuConstrained,o,c)},this.handleSubscribedQualityUpdate=o=>P(this,void 0,void 0,function*(){var c,l,d,u,h;if(!(!((h=this.roomOptions)===null||h===void 0)&&h.dynacast))return;const f=this.videoTrackPublications.get(o.trackSid);if(!f){this.log.warn("received subscribed quality update for unknown track",Object.assign(Object.assign({},this.logContext),{trackSid:o.trackSid}));return}if(!f.videoTrack)return;const g=yield f.videoTrack.setPublishingCodecs(o.subscribedCodecs);try{for(var v=!0,m=di(g),p;p=yield m.next(),c=p.done,!c;v=!0){u=p.value,v=!1;const x=u;v0(x)&&(this.log.debug("publish ".concat(x," for ").concat(f.videoTrack.sid),Object.assign(Object.assign({},this.logContext),Xe(f))),yield this.publishAdditionalCodecForTrack(f.videoTrack,x,f.options))}}catch(x){l={error:x}}finally{try{!v&&!c&&(d=m.return)&&(yield d.call(m))}finally{if(l)throw l.error}}}),this.handleLocalTrackUnpublished=o=>{const c=this.trackPublications.get(o.trackSid);if(!c){this.log.warn("received unpublished event for unknown track",Object.assign(Object.assign({},this.logContext),{trackSid:o.trackSid}));return}this.unpublishTrack(c.track)},this.handleTrackEnded=o=>P(this,void 0,void 0,function*(){if(o.source===Z.Source.ScreenShare||o.source===Z.Source.ScreenShareAudio)this.log.debug("unpublishing local track due to TrackEnded",Object.assign(Object.assign({},this.logContext),Xe(o))),this.unpublishTrack(o);else if(o.isUserProvided)yield o.mute();else if(fi(o)||Bi(o))try{if(cn())try{const c=yield navigator==null?void 0:navigator.permissions.query({name:o.source===Z.Source.Camera?"camera":"microphone"});if(c&&c.state==="denied")throw this.log.warn("user has revoked access to ".concat(o.source),Object.assign(Object.assign({},this.logContext),Xe(o))),c.onchange=()=>{c.state!=="denied"&&(o.isMuted||o.restartTrack(),c.onchange=null)},new Error("GetUserMedia Permission denied")}catch{}o.isMuted||(this.log.debug("track ended, attempting to use a different device",Object.assign(Object.assign({},this.logContext),Xe(o))),fi(o)?yield o.restartTrack({deviceId:"default"}):yield o.restartTrack())}catch{this.log.warn("could not restart track, muting instead",Object.assign(Object.assign({},this.logContext),Xe(o))),yield o.mute()}}),this.audioTrackPublications=new Map,this.videoTrackPublications=new Map,this.trackPublications=new Map,this.engine=n,this.roomOptions=s,this.setupEngine(n),this.activeDeviceMap=new Map([["audioinput","default"],["videoinput","default"],["audiooutput","default"]]),this.pendingSignalRequests=new Map,this.rpcHandlers=r,this.roomOutgoingDataStreamManager=a}get lastCameraError(){return this.cameraError}get lastMicrophoneError(){return this.microphoneError}get isE2EEEnabled(){return this.encryptionType!==hn.NONE}getTrackPublication(e){const t=super.getTrackPublication(e);if(t)return t}getTrackPublicationByName(e){const t=super.getTrackPublicationByName(e);if(t)return t}setupEngine(e){var t;this.engine=e,this.engine.on(le.RemoteMute,(n,s)=>{const r=this.trackPublications.get(n);!r||!r.track||(s?r.mute():r.unmute())}),!((t=this.signalConnectedFuture)===null||t===void 0)&&t.isResolved&&(this.signalConnectedFuture=void 0),this.engine.on(le.Connected,this.handleReconnected).on(le.SignalConnected,this.handleSignalConnected).on(le.SignalRestarted,this.handleReconnected).on(le.SignalResumed,this.handleReconnected).on(le.Restarting,this.handleReconnecting).on(le.Resuming,this.handleReconnecting).on(le.LocalTrackUnpublished,this.handleLocalTrackUnpublished).on(le.SubscribedQualityUpdate,this.handleSubscribedQualityUpdate).on(le.Closing,this.handleClosing).on(le.SignalRequestResponse,this.handleSignalRequestResponse).on(le.DataPacketReceived,this.handleDataPacket)}setMetadata(e){return P(this,void 0,void 0,function*(){yield this.requestMetadataUpdate({metadata:e})})}setName(e){return P(this,void 0,void 0,function*(){yield this.requestMetadataUpdate({name:e})})}setAttributes(e){return P(this,void 0,void 0,function*(){yield this.requestMetadataUpdate({attributes:e})})}requestMetadataUpdate(e){return P(this,arguments,void 0,function(t){var n=this;let{metadata:s,name:r,attributes:a}=t;return function*(){return new Promise((o,c)=>P(n,void 0,void 0,function*(){var l,d;try{let u=!1;const h=yield this.engine.client.sendUpdateLocalMetadata((l=s??this.metadata)!==null&&l!==void 0?l:"",(d=r??this.name)!==null&&d!==void 0?d:"",a),f=performance.now();for(this.pendingSignalRequests.set(h,{resolve:o,reject:g=>{c(g),u=!0},values:{name:r,metadata:s,attributes:a}});performance.now()-f<5e3&&!u;){if((!r||this.name===r)&&(!s||this.metadata===s)&&(!a||Object.entries(a).every(g=>{let[v,m]=g;return this.attributes[v]===m||m===""&&!this.attributes[v]}))){this.pendingSignalRequests.delete(h),o();return}yield on(50)}c(new rf("Request to update local metadata timed out","TimeoutError"))}catch(u){u instanceof Error&&c(u)}}))}()})}setCameraEnabled(e,t,n){return this.setTrackEnabled(Z.Source.Camera,e,t,n)}setMicrophoneEnabled(e,t,n){return this.setTrackEnabled(Z.Source.Microphone,e,t,n)}setScreenShareEnabled(e,t,n){return this.setTrackEnabled(Z.Source.ScreenShare,e,t,n)}setPermissions(e){const t=this.permissions,n=super.setPermissions(e);return n&&t&&this.emit(ce.ParticipantPermissionsChanged,t),n}setE2EEEnabled(e){return P(this,void 0,void 0,function*(){this.encryptionType=e?hn.GCM:hn.NONE,yield this.republishAllTracks(void 0,!1)})}setTrackEnabled(e,t,n,s){return P(this,void 0,void 0,function*(){var r,a;this.log.debug("setTrackEnabled",Object.assign(Object.assign({},this.logContext),{source:e,enabled:t})),this.republishPromise&&(yield this.republishPromise);let o=this.getTrackPublication(e);if(t)if(o)yield o.unmute();else{let c;if(this.pendingPublishing.has(e)){const l=yield this.waitForPendingPublicationOfSource(e);return l||this.log.info("waiting for pending publication promise timed out",Object.assign(Object.assign({},this.logContext),{source:e})),yield l==null?void 0:l.unmute(),l}this.pendingPublishing.add(e);try{switch(e){case Z.Source.Camera:c=yield this.createTracks({video:(r=n)!==null&&r!==void 0?r:!0});break;case Z.Source.Microphone:c=yield this.createTracks({audio:(a=n)!==null&&a!==void 0?a:!0});break;case Z.Source.ScreenShare:c=yield this.createScreenTracks(Object.assign({},n));break;default:throw new hi(e)}}catch(l){throw c==null||c.forEach(d=>{d.stop()}),l instanceof Error&&this.emit(ce.MediaDevicesError,l,Rc(e)),this.pendingPublishing.delete(e),l}for(const l of c){const d=Object.assign(Object.assign({},this.roomOptions.publishDefaults),n);e===Z.Source.Microphone&&Xn(l)&&d.preConnectBuffer&&(this.log.info("starting preconnect buffer for microphone",Object.assign({},this.logContext)),l.startPreConnectBuffer())}try{const l=[];for(const u of c)this.log.info("publishing track",Object.assign(Object.assign({},this.logContext),Xe(u))),l.push(this.publishTrack(u,s));[o]=yield Promise.all(l)}catch(l){throw c==null||c.forEach(d=>{d.stop()}),l}finally{this.pendingPublishing.delete(e)}}else if(!(o!=null&&o.track)&&this.pendingPublishing.has(e)&&(o=yield this.waitForPendingPublicationOfSource(e),o||this.log.info("waiting for pending publication promise timed out",Object.assign(Object.assign({},this.logContext),{source:e}))),o&&o.track)if(e===Z.Source.ScreenShare){o=yield this.unpublishTrack(o.track);const c=this.getTrackPublication(Z.Source.ScreenShareAudio);c&&c.track&&this.unpublishTrack(c.track)}else yield o.mute();return o})}enableCameraAndMicrophone(){return P(this,void 0,void 0,function*(){if(!(this.pendingPublishing.has(Z.Source.Camera)||this.pendingPublishing.has(Z.Source.Microphone))){this.pendingPublishing.add(Z.Source.Camera),this.pendingPublishing.add(Z.Source.Microphone);try{const e=yield this.createTracks({audio:!0,video:!0});yield Promise.all(e.map(t=>this.publishTrack(t)))}finally{this.pendingPublishing.delete(Z.Source.Camera),this.pendingPublishing.delete(Z.Source.Microphone)}}})}createTracks(e){return P(this,void 0,void 0,function*(){var t,n;e??(e={});const s=vf(e,(t=this.roomOptions)===null||t===void 0?void 0:t.audioCaptureDefaults,(n=this.roomOptions)===null||n===void 0?void 0:n.videoCaptureDefaults);try{return(yield La(s,{loggerName:this.roomOptions.loggerName,loggerContextCb:()=>this.logContext})).map(o=>(Xn(o)&&(this.microphoneError=void 0,o.setAudioContext(this.audioContext),o.source=Z.Source.Microphone,this.emit(ce.AudioStreamAcquired)),Fi(o)&&(this.cameraError=void 0,o.source=Z.Source.Camera),o))}catch(r){throw r instanceof Error&&(e.audio&&(this.microphoneError=r),e.video&&(this.cameraError=r)),r}})}createScreenTracks(e){return P(this,void 0,void 0,function*(){if(e===void 0&&(e={}),navigator.mediaDevices.getDisplayMedia===void 0)throw new dc("getDisplayMedia not supported");e.resolution===void 0&&!T0()&&(e.resolution=gc.h1080fps30.resolution);const t=O0(e),n=yield navigator.mediaDevices.getDisplayMedia(t),s=n.getVideoTracks();if(s.length===0)throw new hi("no video track found");const r=new Da(s[0],void 0,!1,{loggerName:this.roomOptions.loggerName,loggerContextCb:()=>this.logContext});r.source=Z.Source.ScreenShare,e.contentHint&&(r.mediaStreamTrack.contentHint=e.contentHint);const a=[r];if(n.getAudioTracks().length>0){this.emit(ce.AudioStreamAcquired);const o=new Ia(n.getAudioTracks()[0],void 0,!1,this.audioContext,{loggerName:this.roomOptions.loggerName,loggerContextCb:()=>this.logContext});o.source=Z.Source.ScreenShareAudio,a.push(o)}return a})}publishTrack(e,t){return P(this,void 0,void 0,function*(){return this.publishOrRepublishTrack(e,t)})}publishOrRepublishTrack(e,t){return P(this,arguments,void 0,function(n,s){var r=this;let a=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!1;return function*(){var o,c,l,d;fi(n)&&n.setAudioContext(r.audioContext),yield(o=r.reconnectFuture)===null||o===void 0?void 0:o.promise,r.republishPromise&&!a&&(yield r.republishPromise),Us(n)&&r.pendingPublishPromises.has(n)&&(yield r.pendingPublishPromises.get(n));let u;if(n instanceof MediaStreamTrack)u=n.getConstraints();else{u=n.constraints;let p;switch(n.source){case Z.Source.Microphone:p="audioinput";break;case Z.Source.Camera:p="videoinput"}p&&r.activeDeviceMap.has(p)&&(u=Object.assign(Object.assign({},u),{deviceId:r.activeDeviceMap.get(p)}))}if(n instanceof MediaStreamTrack)switch(n.kind){case"audio":n=new Ia(n,u,!0,r.audioContext,{loggerName:r.roomOptions.loggerName,loggerContextCb:()=>r.logContext});break;case"video":n=new Da(n,u,!0,{loggerName:r.roomOptions.loggerName,loggerContextCb:()=>r.logContext});break;default:throw new hi("unsupported MediaStreamTrack kind ".concat(n.kind))}else n.updateLoggerOptions({loggerName:r.roomOptions.loggerName,loggerContextCb:()=>r.logContext});let h;if(r.trackPublications.forEach(p=>{p.track&&p.track===n&&(h=p)}),h)return r.log.warn("track has already been published, skipping",Object.assign(Object.assign({},r.logContext),Xe(h))),h;const f="channelCount"in n.mediaStreamTrack.getSettings()&&n.mediaStreamTrack.getSettings().channelCount===2||n.mediaStreamTrack.getConstraints().channelCount===2,g=(c=s==null?void 0:s.forceStereo)!==null&&c!==void 0?c:f;g&&(s||(s={}),s.dtx===void 0&&r.log.info("Opus DTX will be disabled for stereo tracks by default. Enable them explicitly to make it work.",Object.assign(Object.assign({},r.logContext),Xe(n))),s.red===void 0&&r.log.info("Opus RED will be disabled for stereo tracks by default. Enable them explicitly to make it work."),(l=s.dtx)!==null&&l!==void 0||(s.dtx=!1),(d=s.red)!==null&&d!==void 0||(s.red=!1));const v=Object.assign(Object.assign({},r.roomOptions.publishDefaults),s);!E0()&&r.roomOptions.e2ee&&(r.log.info("End-to-end encryption is set up, simulcast publishing will be disabled on Safari versions and iOS browsers running iOS < v17.2",Object.assign({},r.logContext)),v.simulcast=!1),v.source&&(n.source=v.source);const m=new Promise((p,x)=>P(r,void 0,void 0,function*(){try{if(this.engine.client.currentState!==Tt.CONNECTED){this.log.debug("deferring track publication until signal is connected",Object.assign(Object.assign({},this.logContext),{track:Xe(n)}));const C=setTimeout(()=>{x(new sf("publishing rejected as engine not connected within timeout",408))},15e3);yield this.waitUntilEngineConnected(),clearTimeout(C);const b=yield this.publish(n,v,g);p(b)}else try{const C=yield this.publish(n,v,g);p(C)}catch(C){x(C)}}catch(C){x(C)}}));r.pendingPublishPromises.set(n,m);try{return yield m}catch(p){throw p}finally{r.pendingPublishPromises.delete(n)}}()})}waitUntilEngineConnected(){return this.signalConnectedFuture||(this.signalConnectedFuture=new $n),this.signalConnectedFuture.promise}hasPermissionsToPublish(e){if(!this.permissions)return this.log.warn("no permissions present for publishing track",Object.assign(Object.assign({},this.logContext),Xe(e))),!1;const{canPublish:t,canPublishSources:n}=this.permissions;return t&&(n.length===0||n.map(s=>z0(s)).includes(e.source))?!0:(this.log.warn("insufficient permissions to publish",Object.assign(Object.assign({},this.logContext),Xe(e))),!1)}publish(e,t,n){return P(this,void 0,void 0,function*(){var s,r,a,o,c,l,d,u,h,f;if(!this.hasPermissionsToPublish(e))throw new sf("failed to publish track, insufficient permissions",403);Array.from(this.trackPublications.values()).find(y=>Us(e)&&y.source===e.source)&&e.source!==Z.Source.Unknown&&this.log.info("publishing a second track with the same source: ".concat(e.source),Object.assign(Object.assign({},this.logContext),Xe(e))),t.stopMicTrackOnMute&&Xn(e)&&(e.stopOnMute=!0),e.source===Z.Source.ScreenShare&&as()&&(t.simulcast=!1),t.videoCodec==="av1"&&!y0()&&(t.videoCodec=void 0),t.videoCodec==="vp9"&&!S0()&&(t.videoCodec=void 0),t.videoCodec===void 0&&(t.videoCodec=Oc),this.enabledPublishVideoCodecs.length>0&&(this.enabledPublishVideoCodecs.some(y=>t.videoCodec===Lr(y.mime))||(t.videoCodec=Lr(this.enabledPublishVideoCodecs[0].mime)));const v=t.videoCodec;e.on(ae.Muted,this.onTrackMuted),e.on(ae.Unmuted,this.onTrackUnmuted),e.on(ae.Ended,this.handleTrackEnded),e.on(ae.UpstreamPaused,this.onTrackUpstreamPaused),e.on(ae.UpstreamResumed,this.onTrackUpstreamResumed),e.on(ae.AudioTrackFeatureUpdate,this.onTrackFeatureUpdate);const m=[],p=!(!((s=t.dtx)!==null&&s!==void 0)||s),x=e.getSourceTrackSettings();x.autoGainControl&&m.push(Ht.TF_AUTO_GAIN_CONTROL),x.echoCancellation&&m.push(Ht.TF_ECHO_CANCELLATION),x.noiseSuppression&&m.push(Ht.TF_NOISE_SUPPRESSION),x.channelCount&&x.channelCount>1&&m.push(Ht.TF_STEREO),p&&m.push(Ht.TF_NO_DTX),fi(e)&&e.hasPreConnectBuffer&&m.push(Ht.TF_PRECONNECT_BUFFER);const C=new Xo({cid:e.mediaStreamTrack.id,name:t.name,type:Z.kindToProto(e.kind),muted:e.isMuted,source:Z.sourceToProto(e.source),disableDtx:p,encryption:this.encryptionType,stereo:n,disableRed:this.isE2EEEnabled||!(!((r=t.red)!==null&&r!==void 0)||r),stream:t==null?void 0:t.stream,backupCodecPolicy:t==null?void 0:t.backupCodecPolicy,audioFeatures:m});let b;if(e.kind===Z.Kind.Video){let y={width:0,height:0};try{y=yield e.waitForDimensions()}catch{const R=(o=(a=this.roomOptions.videoCaptureDefaults)===null||a===void 0?void 0:a.resolution)!==null&&o!==void 0?o:kr.h720.resolution;y={width:R.width,height:R.height},this.log.error("could not determine track dimensions, using defaults",Object.assign(Object.assign(Object.assign({},this.logContext),Xe(e)),{dims:y}))}C.width=y.width,C.height=y.height,Bi(e)&&(Wn(v)&&(e.source===Z.Source.ScreenShare&&(t.scalabilityMode="L1T3","contentHint"in e.mediaStreamTrack&&(e.mediaStreamTrack.contentHint="motion",this.log.info("forcing contentHint to motion for screenshare with SVC codecs",Object.assign(Object.assign({},this.logContext),Xe(e))))),t.scalabilityMode=(c=t.scalabilityMode)!==null&&c!==void 0?c:"L3T3_KEY"),C.simulcastCodecs=[new $o({codec:v,cid:e.mediaStreamTrack.id})],t.backupCodec===!0&&(t.backupCodec={codec:Oc}),t.backupCodec&&v!==t.backupCodec.codec&&C.encryption===hn.NONE&&(this.roomOptions.dynacast||(this.roomOptions.dynacast=!0),C.simulcastCodecs.push(new $o({codec:t.backupCodec.codec,cid:""})))),b=Hc(e.source===Z.Source.ScreenShare,C.width,C.height,t),C.layers=Gf(C.width,C.height,b,Wn(t.videoCodec))}else e.kind===Z.Kind.Audio&&(b=[{maxBitrate:(l=t.audioPreset)===null||l===void 0?void 0:l.maxBitrate,priority:(u=(d=t.audioPreset)===null||d===void 0?void 0:d.priority)!==null&&u!==void 0?u:"high",networkPriority:(f=(h=t.audioPreset)===null||h===void 0?void 0:h.priority)!==null&&f!==void 0?f:"high"}]);if(!this.engine||this.engine.isClosed)throw new Bt("cannot publish track when not connected");const S=()=>P(this,void 0,void 0,function*(){var y,T,R;if(!this.engine.pcManager)throw new Bt("pcManager is not ready");if(e.sender=yield this.engine.createSender(e,t,b),this.emit(ce.LocalSenderCreated,e.sender,e),Bi(e)&&((y=t.degradationPreference)!==null&&y!==void 0||(t.degradationPreference=Tb(e)),e.setDegradationPreference(t.degradationPreference)),b)if(as()&&e.kind===Z.Kind.Audio){let U;for(const B of this.engine.pcManager.publisher.getTransceivers())if(B.sender===e.sender){U=B;break}U&&this.engine.pcManager.publisher.setTrackCodecBitrate({transceiver:U,codec:"opus",maxbr:!((T=b[0])===null||T===void 0)&&T.maxBitrate?b[0].maxBitrate/1e3:0})}else e.codec&&Wn(e.codec)&&(!((R=b[0])===null||R===void 0)&&R.maxBitrate)&&this.engine.pcManager.publisher.setTrackCodecBitrate({cid:C.cid,codec:e.codec,maxbr:b[0].maxBitrate/1e3});yield this.engine.negotiate()});let M;const A=new Promise((y,T)=>P(this,void 0,void 0,function*(){var R;try{M=yield this.engine.addTrack(C),y(M)}catch(U){e.sender&&(!((R=this.engine.pcManager)===null||R===void 0)&&R.publisher)&&(this.engine.pcManager.publisher.removeTrack(e.sender),yield this.engine.negotiate().catch(B=>{this.log.error("failed to negotiate after removing track due to failed add track request",Object.assign(Object.assign(Object.assign({},this.logContext),Xe(e)),{error:B}))})),T(U)}}));if(this.enabledPublishVideoCodecs.length>0)M=(yield Promise.all([A,S()]))[0];else{M=yield A;let y;if(M.codecs.forEach(T=>{y===void 0&&(y=T.mimeType)}),y&&e.kind===Z.Kind.Video){const T=Lr(y);T!==v&&(this.log.debug("falling back to server selected codec",Object.assign(Object.assign(Object.assign({},this.logContext),Xe(e)),{codec:T})),t.videoCodec=T,b=Hc(e.source===Z.Source.ScreenShare,C.width,C.height,t))}yield S()}const k=new Kc(e.kind,M,e,{loggerName:this.roomOptions.loggerName,loggerContextCb:()=>this.logContext});if(k.on(ae.CpuConstrained,y=>this.onTrackCpuConstrained(y,k)),k.options=t,e.sid=M.sid,this.log.debug("publishing ".concat(e.kind," with encodings"),Object.assign(Object.assign({},this.logContext),{encodings:b,trackInfo:M})),Bi(e)?e.startMonitor(this.engine.client):fi(e)&&e.startMonitor(),this.addTrackPublication(k),this.emit(ce.LocalTrackPublished,k),fi(e)&&M.audioFeatures.includes(Ht.TF_PRECONNECT_BUFFER)){const y=e.getPreConnectBuffer(),T=e.getPreConnectBufferMimeType();this.on(ce.LocalTrackSubscribed,R=>{if(R.trackSid===M.sid){if(!e.hasPreConnectBuffer){this.log.warn("subscribe event came to late, buffer already closed",this.logContext);return}this.log.debug("finished recording preconnect buffer",Object.assign(Object.assign({},this.logContext),Xe(e))),e.stopPreConnectBuffer()}}),y&&new Promise((U,B)=>P(this,void 0,void 0,function*(){var q,K,H,W,te,ve;try{this.log.debug("waiting for agent",Object.assign(Object.assign({},this.logContext),Xe(e)));const Be=setTimeout(()=>{B(new Error("agent not active within 10 seconds"))},1e4),Ct=yield this.waitUntilActiveAgentPresent();clearTimeout(Be),this.log.debug("sending preconnect buffer",Object.assign(Object.assign({},this.logContext),Xe(e)));const ht=yield this.streamBytes({name:"preconnect-buffer",mimeType:T,topic:"lk.agent.pre-connect-audio-buffer",destinationIdentities:[Ct.identity],attributes:{trackId:k.trackSid,sampleRate:String((te=x.sampleRate)!==null&&te!==void 0?te:"48000"),channels:String((ve=x.channelCount)!==null&&ve!==void 0?ve:"1")}});try{for(var de=!0,_e=di(y),Ve;Ve=yield _e.next(),q=Ve.done,!q;de=!0){W=Ve.value,de=!1;const X=W;yield ht.write(X)}}catch(X){K={error:X}}finally{try{!de&&!q&&(H=_e.return)&&(yield H.call(_e))}finally{if(K)throw K.error}}yield ht.close(),U()}catch(Be){B(Be)}})).then(()=>{this.log.debug("preconnect buffer sent successfully",Object.assign(Object.assign({},this.logContext),Xe(e)))}).catch(U=>{this.log.error("error sending preconnect buffer",Object.assign(Object.assign(Object.assign({},this.logContext),Xe(e)),{error:U}))})}return k})}get isLocal(){return!0}publishAdditionalCodecForTrack(e,t,n){return P(this,void 0,void 0,function*(){var s;if(this.encryptionType!==hn.NONE)return;let r;if(this.trackPublications.forEach(f=>{f.track&&f.track===e&&(r=f)}),!r)throw new hi("track is not published");if(!Bi(e))throw new hi("track is not a video track");const a=Object.assign(Object.assign({},(s=this.roomOptions)===null||s===void 0?void 0:s.publishDefaults),n),o=yb(e,t,a);if(!o){this.log.info("backup codec has been disabled, ignoring request to add additional codec for track",Object.assign(Object.assign({},this.logContext),Xe(e)));return}const c=e.addSimulcastTrack(t,o);if(!c)return;const l=new Xo({cid:c.mediaStreamTrack.id,type:Z.kindToProto(e.kind),muted:e.isMuted,source:Z.sourceToProto(e.source),sid:e.sid,simulcastCodecs:[{codec:a.videoCodec,cid:c.mediaStreamTrack.id}]});if(l.layers=Gf(l.width,l.height,o),!this.engine||this.engine.isClosed)throw new Bt("cannot publish track when not connected");const d=()=>P(this,void 0,void 0,function*(){yield this.engine.createSimulcastSender(e,c,a,o),yield this.engine.negotiate()}),h=(yield Promise.all([this.engine.addTrack(l),d()]))[0];this.log.debug("published ".concat(t," for track ").concat(e.sid),Object.assign(Object.assign({},this.logContext),{encodings:o,trackInfo:h}))})}unpublishTrack(e,t){return P(this,void 0,void 0,function*(){var n,s;if(Us(e)){const l=this.pendingPublishPromises.get(e);l&&(this.log.info("awaiting publish promise before attempting to unpublish",Object.assign(Object.assign({},this.logContext),Xe(e))),yield l)}const r=this.getPublicationForTrack(e),a=r?Xe(r):void 0;if(this.log.debug("unpublishing track",Object.assign(Object.assign({},this.logContext),a)),!r||!r.track){this.log.warn("track was not unpublished because no publication was found",Object.assign(Object.assign({},this.logContext),a));return}e=r.track,e.off(ae.Muted,this.onTrackMuted),e.off(ae.Unmuted,this.onTrackUnmuted),e.off(ae.Ended,this.handleTrackEnded),e.off(ae.UpstreamPaused,this.onTrackUpstreamPaused),e.off(ae.UpstreamResumed,this.onTrackUpstreamResumed),e.off(ae.AudioTrackFeatureUpdate,this.onTrackFeatureUpdate),t===void 0&&(t=(s=(n=this.roomOptions)===null||n===void 0?void 0:n.stopLocalTrackOnUnpublish)!==null&&s!==void 0?s:!0),t?e.stop():e.stopMonitor();let o=!1;const c=e.sender;if(e.sender=void 0,this.engine.pcManager&&this.engine.pcManager.currentState<wt.FAILED&&c)try{for(const l of this.engine.pcManager.publisher.getTransceivers())l.sender===c&&(l.direction="inactive",o=!0);if(this.engine.removeTrack(c)&&(o=!0),Bi(e)){for(const[,l]of e.simulcastCodecs)l.sender&&(this.engine.removeTrack(l.sender)&&(o=!0),l.sender=void 0);e.simulcastCodecs.clear()}}catch(l){this.log.warn("failed to unpublish track",Object.assign(Object.assign(Object.assign({},this.logContext),a),{error:l}))}switch(this.trackPublications.delete(r.trackSid),r.kind){case Z.Kind.Audio:this.audioTrackPublications.delete(r.trackSid);break;case Z.Kind.Video:this.videoTrackPublications.delete(r.trackSid);break}return this.emit(ce.LocalTrackUnpublished,r),r.setTrack(void 0),o&&(yield this.engine.negotiate()),r})}unpublishTracks(e){return P(this,void 0,void 0,function*(){return(yield Promise.all(e.map(n=>this.unpublishTrack(n)))).filter(n=>!!n)})}republishAllTracks(e){return P(this,arguments,void 0,function(t){var n=this;let s=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0;return function*(){n.republishPromise&&(yield n.republishPromise),n.republishPromise=new Promise((r,a)=>P(n,void 0,void 0,function*(){try{const o=[];this.trackPublications.forEach(c=>{c.track&&(t&&(c.options=Object.assign(Object.assign({},c.options),t)),o.push(c))}),yield Promise.all(o.map(c=>P(this,void 0,void 0,function*(){const l=c.track;yield this.unpublishTrack(l,!1),s&&!l.isMuted&&l.source!==Z.Source.ScreenShare&&l.source!==Z.Source.ScreenShareAudio&&(fi(l)||Bi(l))&&!l.isUserProvided&&(this.log.debug("restarting existing track",Object.assign(Object.assign({},this.logContext),{track:c.trackSid})),yield l.restartTrack()),yield this.publishOrRepublishTrack(l,c.options,!0)}))),r()}catch(o){a(o)}finally{this.republishPromise=void 0}})),yield n.republishPromise}()})}publishData(e){return P(this,arguments,void 0,function(t){var n=this;let s=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};return function*(){const r=s.reliable?We.RELIABLE:We.LOSSY,a=s.destinationIdentities,o=s.topic,c=new an({kind:r,value:{case:"user",value:new Vu({participantIdentity:n.identity,payload:t,destinationIdentities:a,topic:o})}});yield n.engine.sendDataPacket(c,r)}()})}publishDtmf(e,t){return P(this,void 0,void 0,function*(){const n=new an({kind:We.RELIABLE,value:{case:"sipDtmf",value:new zu({code:e,digit:t})}});yield this.engine.sendDataPacket(n,We.RELIABLE)})}sendChatMessage(e,t){return P(this,void 0,void 0,function*(){const n={id:crypto.randomUUID(),message:e,timestamp:Date.now(),attachedFiles:t==null?void 0:t.attachments},s=new an({value:{case:"chatMessage",value:new zo(Object.assign(Object.assign({},n),{timestamp:Et.parse(n.timestamp)}))}});return yield this.engine.sendDataPacket(s,We.RELIABLE),this.emit(ce.ChatMessage,n),n})}editChatMessage(e,t){return P(this,void 0,void 0,function*(){const n=Object.assign(Object.assign({},t),{message:e,editTimestamp:Date.now()}),s=new an({value:{case:"chatMessage",value:new zo(Object.assign(Object.assign({},n),{timestamp:Et.parse(n.timestamp),editTimestamp:Et.parse(n.editTimestamp)}))}});return yield this.engine.sendDataPacket(s,We.RELIABLE),this.emit(ce.ChatMessage,n),n})}sendText(e,t){return P(this,void 0,void 0,function*(){return this.roomOutgoingDataStreamManager.sendText(e,t)})}streamText(e){return P(this,void 0,void 0,function*(){return this.roomOutgoingDataStreamManager.streamText(e)})}sendFile(e,t){return P(this,void 0,void 0,function*(){return this.roomOutgoingDataStreamManager.sendFile(e,t)})}streamBytes(e){return P(this,void 0,void 0,function*(){return this.roomOutgoingDataStreamManager.streamBytes(e)})}performRpc(e){return P(this,arguments,void 0,function(t){var n=this;let{destinationIdentity:s,method:r,payload:a,responseTimeout:o=1e4}=t;return function*(){return new Promise((l,d)=>P(n,void 0,void 0,function*(){var u,h,f,g;if(Bc(a)>Lf){d(At.builtIn("REQUEST_PAYLOAD_TOO_LARGE"));return}if(!((h=(u=this.engine.latestJoinResponse)===null||u===void 0?void 0:u.serverInfo)===null||h===void 0)&&h.version&&jn((g=(f=this.engine.latestJoinResponse)===null||f===void 0?void 0:f.serverInfo)===null||g===void 0?void 0:g.version,"1.8.0")<0){d(At.builtIn("UNSUPPORTED_SERVER"));return}const v=crypto.randomUUID();yield this.publishRpcRequest(s,v,r,a,o-2e3);const m=setTimeout(()=>{this.pendingAcks.delete(v),d(At.builtIn("CONNECTION_TIMEOUT")),this.pendingResponses.delete(v),clearTimeout(p)},2e3);this.pendingAcks.set(v,{resolve:()=>{clearTimeout(m)},participantIdentity:s});const p=setTimeout(()=>{this.pendingResponses.delete(v),d(At.builtIn("RESPONSE_TIMEOUT"))},o);this.pendingResponses.set(v,{resolve:(x,C)=>{clearTimeout(p),this.pendingAcks.has(v)&&(console.warn("RPC response received before ack",v),this.pendingAcks.delete(v),clearTimeout(m)),C?d(C):l(x??"")},participantIdentity:s})}))}()})}registerRpcMethod(e,t){this.rpcHandlers.has(e)&&this.log.warn("you're overriding the RPC handler for method ".concat(e,", in the future this will throw an error")),this.rpcHandlers.set(e,t)}unregisterRpcMethod(e){this.rpcHandlers.delete(e)}setTrackSubscriptionPermissions(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:[];this.participantTrackPermissions=t,this.allParticipantsAllowedToSubscribe=e,this.engine.client.isDisconnected||this.updateTrackSubscriptionPermissions()}handleIncomingRpcAck(e){const t=this.pendingAcks.get(e);t?(t.resolve(),this.pendingAcks.delete(e)):console.error("Ack received for unexpected RPC request",e)}handleIncomingRpcResponse(e,t,n){const s=this.pendingResponses.get(e);s?(s.resolve(t,n),this.pendingResponses.delete(e)):console.error("Response received for unexpected RPC request",e)}publishRpcRequest(e,t,n,s,r){return P(this,void 0,void 0,function*(){const a=new an({destinationIdentities:[e],kind:We.RELIABLE,value:{case:"rpcRequest",value:new Gu({id:t,method:n,payload:s,responseTimeoutMs:r,version:1})}});yield this.engine.sendDataPacket(a,We.RELIABLE)})}handleParticipantDisconnected(e){for(const[t,{participantIdentity:n}]of this.pendingAcks)n===e&&this.pendingAcks.delete(t);for(const[t,{participantIdentity:n,resolve:s}]of this.pendingResponses)n===e&&(s(null,At.builtIn("RECIPIENT_DISCONNECTED")),this.pendingResponses.delete(t))}setEnabledPublishCodecs(e){this.enabledPublishVideoCodecs=e.filter(t=>t.mime.split("/")[0].toLowerCase()==="video")}updateInfo(e){return super.updateInfo(e)?(e.tracks.forEach(t=>{var n,s;const r=this.trackPublications.get(t.sid);if(r){const a=r.isMuted||((s=(n=r.track)===null||n===void 0?void 0:n.isUpstreamPaused)!==null&&s!==void 0?s:!1);a!==t.muted&&(this.log.debug("updating server mute state after reconcile",Object.assign(Object.assign(Object.assign({},this.logContext),Xe(r)),{mutedOnServer:a})),this.engine.client.sendMuteTrack(t.sid,a))}}),!0):!1}setActiveAgent(e){var t,n,s,r;this.firstActiveAgent=e,e&&!this.firstActiveAgent&&(this.firstActiveAgent=e),e?(n=(t=this.activeAgentFuture)===null||t===void 0?void 0:t.resolve)===null||n===void 0||n.call(t,e):(r=(s=this.activeAgentFuture)===null||s===void 0?void 0:s.reject)===null||r===void 0||r.call(s,"Agent disconnected"),this.activeAgentFuture=void 0}waitUntilActiveAgentPresent(){return this.firstActiveAgent?Promise.resolve(this.firstActiveAgent):(this.activeAgentFuture||(this.activeAgentFuture=new $n),this.activeAgentFuture.promise)}getPublicationForTrack(e){let t;return this.trackPublications.forEach(n=>{const s=n.track;s&&(e instanceof MediaStreamTrack?(fi(s)||Bi(s))&&s.mediaStreamTrack===e&&(t=n):e===s&&(t=n))}),t}waitForPendingPublicationOfSource(e){return P(this,void 0,void 0,function*(){const n=Date.now();for(;Date.now()<n+1e4;){const s=Array.from(this.pendingPublishPromises.entries()).find(r=>{let[a]=r;return a.source===e});if(s)return s[1];yield on(20)}})}}class qb extends pi{constructor(e,t,n,s){super(e,t.sid,t.name,s),this.track=void 0,this.allowed=!0,this.requestedDisabled=void 0,this.visible=!0,this.handleEnded=r=>{this.setTrack(void 0),this.emit(ae.Ended,r)},this.handleVisibilityChange=r=>{this.log.debug("adaptivestream video visibility ".concat(this.trackSid,", visible=").concat(r),this.logContext),this.visible=r,this.emitTrackUpdate()},this.handleVideoDimensionsChange=r=>{this.log.debug("adaptivestream video dimensions ".concat(r.width,"x").concat(r.height),this.logContext),this.videoDimensionsAdaptiveStream=r,this.emitTrackUpdate()},this.subscribed=n,this.updateInfo(t)}setSubscribed(e){const t=this.subscriptionStatus,n=this.permissionStatus;this.subscribed=e,e&&(this.allowed=!0);const s=new va({trackSids:[this.trackSid],subscribe:this.subscribed,participantTracks:[new ju({participantSid:"",trackSids:[this.trackSid]})]});this.emit(ae.UpdateSubscription,s),this.emitSubscriptionUpdateIfChanged(t),this.emitPermissionUpdateIfChanged(n)}get subscriptionStatus(){return this.subscribed===!1?pi.SubscriptionStatus.Unsubscribed:super.isSubscribed?pi.SubscriptionStatus.Subscribed:pi.SubscriptionStatus.Desired}get permissionStatus(){return this.allowed?pi.PermissionStatus.Allowed:pi.PermissionStatus.NotAllowed}get isSubscribed(){return this.subscribed===!1?!1:super.isSubscribed}get isDesired(){return this.subscribed!==!1}get isEnabled(){return this.requestedDisabled!==void 0?!this.requestedDisabled:this.isAdaptiveStream?this.visible:!0}get isLocal(){return!1}setEnabled(e){!this.isManualOperationAllowed()||this.requestedDisabled===!e||(this.requestedDisabled=!e,this.emitTrackUpdate())}setVideoQuality(e){!this.isManualOperationAllowed()||this.requestedMaxQuality===e||(this.requestedMaxQuality=e,this.requestedVideoDimensions=void 0,this.emitTrackUpdate())}setVideoDimensions(e){var t,n;this.isManualOperationAllowed()&&(((t=this.requestedVideoDimensions)===null||t===void 0?void 0:t.width)===e.width&&((n=this.requestedVideoDimensions)===null||n===void 0?void 0:n.height)===e.height||(Mc(this.track)&&(this.requestedVideoDimensions=e),this.requestedMaxQuality=void 0,this.emitTrackUpdate()))}setVideoFPS(e){this.isManualOperationAllowed()&&Mc(this.track)&&this.fps!==e&&(this.fps=e,this.emitTrackUpdate())}get videoQuality(){var e;return(e=this.requestedMaxQuality)!==null&&e!==void 0?e:pn.HIGH}setTrack(e){const t=this.subscriptionStatus,n=this.permissionStatus,s=this.track;s!==e&&(s&&(s.off(ae.VideoDimensionsChanged,this.handleVideoDimensionsChange),s.off(ae.VisibilityChanged,this.handleVisibilityChange),s.off(ae.Ended,this.handleEnded),s.detach(),s.stopMonitor(),this.emit(ae.Unsubscribed,s)),super.setTrack(e),e&&(e.sid=this.trackSid,e.on(ae.VideoDimensionsChanged,this.handleVideoDimensionsChange),e.on(ae.VisibilityChanged,this.handleVisibilityChange),e.on(ae.Ended,this.handleEnded),this.emit(ae.Subscribed,e)),this.emitPermissionUpdateIfChanged(n),this.emitSubscriptionUpdateIfChanged(t))}setAllowed(e){const t=this.subscriptionStatus,n=this.permissionStatus;this.allowed=e,this.emitPermissionUpdateIfChanged(n),this.emitSubscriptionUpdateIfChanged(t)}setSubscriptionError(e){this.emit(ae.SubscriptionFailed,e)}updateInfo(e){super.updateInfo(e);const t=this.metadataMuted;this.metadataMuted=e.muted,this.track?this.track.setMuted(e.muted):t!==e.muted&&this.emit(e.muted?ae.Muted:ae.Unmuted)}emitSubscriptionUpdateIfChanged(e){const t=this.subscriptionStatus;e!==t&&this.emit(ae.SubscriptionStatusChanged,t,e)}emitPermissionUpdateIfChanged(e){this.permissionStatus!==e&&this.emit(ae.SubscriptionPermissionChanged,this.permissionStatus,e)}isManualOperationAllowed(){return this.isDesired?!0:(this.log.warn("cannot update track settings when not subscribed",this.logContext),!1)}get isAdaptiveStream(){return Mc(this.track)&&this.track.isAdaptiveStream}emitTrackUpdate(){const e=new nh({trackSids:[this.trackSid],disabled:!this.isEnabled,fps:this.fps});if(this.kind===Z.Kind.Video){let t=this.requestedVideoDimensions;if(this.videoDimensionsAdaptiveStream!==void 0)if(t)Sf(this.videoDimensionsAdaptiveStream,t)&&(this.log.debug("using adaptive stream dimensions instead of requested",Object.assign(Object.assign({},this.logContext),this.videoDimensionsAdaptiveStream)),t=this.videoDimensionsAdaptiveStream);else if(this.requestedMaxQuality!==void 0&&this.trackInfo){const n=G0(this.trackInfo,this.requestedMaxQuality);n&&Sf(this.videoDimensionsAdaptiveStream,n)&&(this.log.debug("using adaptive stream dimensions instead of max quality layer",Object.assign(Object.assign({},this.logContext),this.videoDimensionsAdaptiveStream)),t=this.videoDimensionsAdaptiveStream)}else this.log.debug("using adaptive stream dimensions",Object.assign(Object.assign({},this.logContext),this.videoDimensionsAdaptiveStream)),t=this.videoDimensionsAdaptiveStream;t?(e.width=Math.ceil(t.width),e.height=Math.ceil(t.height)):this.requestedMaxQuality!==void 0?(this.log.debug("using requested max quality",Object.assign(Object.assign({},this.logContext),{quality:this.requestedMaxQuality})),e.quality=this.requestedMaxQuality):(this.log.debug("using default quality",Object.assign(Object.assign({},this.logContext),{quality:pn.HIGH})),e.quality=pn.HIGH)}this.emit(ae.UpdateSettings,e)}}class Na extends Kf{static fromParticipantInfo(e,t,n){return new Na(e,t.sid,t.identity,t.name,t.metadata,t.attributes,n,t.kind)}get logContext(){return Object.assign(Object.assign({},super.logContext),{rpID:this.sid,remoteParticipant:this.identity})}constructor(e,t,n,s,r,a,o){let c=arguments.length>7&&arguments[7]!==void 0?arguments[7]:Mr.STANDARD;super(t,n||"",s,r,a,o,c),this.signalClient=e,this.trackPublications=new Map,this.audioTrackPublications=new Map,this.videoTrackPublications=new Map,this.volumeMap=new Map}addTrackPublication(e){super.addTrackPublication(e),e.on(ae.UpdateSettings,t=>{this.log.debug("send update settings",Object.assign(Object.assign(Object.assign({},this.logContext),Xe(e)),{settings:t})),this.signalClient.sendUpdateTrackSettings(t)}),e.on(ae.UpdateSubscription,t=>{t.participantTracks.forEach(n=>{n.participantSid=this.sid}),this.signalClient.sendUpdateSubscription(t)}),e.on(ae.SubscriptionPermissionChanged,t=>{this.emit(ce.TrackSubscriptionPermissionChanged,e,t)}),e.on(ae.SubscriptionStatusChanged,t=>{this.emit(ce.TrackSubscriptionStatusChanged,e,t)}),e.on(ae.Subscribed,t=>{this.emit(ce.TrackSubscribed,t,e)}),e.on(ae.Unsubscribed,t=>{this.emit(ce.TrackUnsubscribed,t,e)}),e.on(ae.SubscriptionFailed,t=>{this.emit(ce.TrackSubscriptionFailed,e.trackSid,t)})}getTrackPublication(e){const t=super.getTrackPublication(e);if(t)return t}getTrackPublicationByName(e){const t=super.getTrackPublicationByName(e);if(t)return t}setVolume(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:Z.Source.Microphone;this.volumeMap.set(t,e);const n=this.getTrackPublication(t);n&&n.track&&n.track.setVolume(e)}getVolume(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:Z.Source.Microphone;const t=this.getTrackPublication(e);return t&&t.track?t.track.getVolume():this.volumeMap.get(e)}addSubscribedMediaTrack(e,t,n,s,r,a){let o=this.getTrackPublicationBySid(t);if(o||t.startsWith("TR")||this.trackPublications.forEach(d=>{!o&&e.kind===d.kind.toString()&&(o=d)}),!o){if(a===0){this.log.error("could not find published track",Object.assign(Object.assign({},this.logContext),{trackSid:t})),this.emit(ce.TrackSubscriptionFailed,t);return}a===void 0&&(a=20),setTimeout(()=>{this.addSubscribedMediaTrack(e,t,n,s,r,a-1)},150);return}if(e.readyState==="ended"){this.log.error("unable to subscribe because MediaStreamTrack is ended. Do not call MediaStreamTrack.stop()",Object.assign(Object.assign({},this.logContext),Xe(o))),this.emit(ce.TrackSubscriptionFailed,t);return}const c=e.kind==="video";let l;return c?l=new Fb(e,t,s,r):l=new Ob(e,t,s,this.audioContext,this.audioOutput),l.source=o.source,l.isMuted=o.isMuted,l.setMediaStream(n),l.start(),o.setTrack(l),this.volumeMap.has(o.source)&&Ec(l)&&Xn(l)&&l.setVolume(this.volumeMap.get(o.source)),o}get hasMetadata(){return!!this.participantInfo}getTrackPublicationBySid(e){return this.trackPublications.get(e)}updateInfo(e){if(!super.updateInfo(e))return!1;const t=new Map,n=new Map;return e.tracks.forEach(s=>{var r,a;let o=this.getTrackPublicationBySid(s.sid);if(o)o.updateInfo(s);else{const c=Z.kindFromProto(s.type);if(!c)return;o=new qb(c,s,(r=this.signalClient.connectOptions)===null||r===void 0?void 0:r.autoSubscribe,{loggerContextCb:()=>this.logContext,loggerName:(a=this.loggerOptions)===null||a===void 0?void 0:a.loggerName}),o.updateInfo(s),n.set(s.sid,o);const l=Array.from(this.trackPublications.values()).find(d=>d.source===(o==null?void 0:o.source));l&&o.source!==Z.Source.Unknown&&this.log.debug("received a second track publication for ".concat(this.identity," with the same source: ").concat(o.source),Object.assign(Object.assign({},this.logContext),{oldTrack:Xe(l),newTrack:Xe(o)})),this.addTrackPublication(o)}t.set(s.sid,o)}),this.trackPublications.forEach(s=>{t.has(s.trackSid)||(this.log.trace("detected removed track on remote participant, unpublishing",Object.assign(Object.assign({},this.logContext),Xe(s))),this.unpublishTrack(s.trackSid,!0))}),n.forEach(s=>{this.emit(ce.TrackPublished,s)}),!0}unpublishTrack(e,t){const n=this.trackPublications.get(e);if(!n)return;const{track:s}=n;switch(s&&(s.stop(),n.setTrack(void 0)),this.trackPublications.delete(e),n.kind){case Z.Kind.Audio:this.audioTrackPublications.delete(e);break;case Z.Kind.Video:this.videoTrackPublications.delete(e);break}t&&this.emit(ce.TrackUnpublished,n)}setAudioOutput(e){return P(this,void 0,void 0,function*(){this.audioOutput=e;const t=[];this.audioTrackPublications.forEach(n=>{var s;Xn(n.track)&&Ec(n.track)&&t.push(n.track.setSinkId((s=e.deviceId)!==null&&s!==void 0?s:"default"))}),yield Promise.all(t)})}emit(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),s=1;s<t;s++)n[s-1]=arguments[s];return this.log.trace("participant event",Object.assign(Object.assign({},this.logContext),{event:e,args:n})),super.emit(e,...n)}}var st;(function(i){i.Disconnected="disconnected",i.Connecting="connecting",i.Connected="connected",i.Reconnecting="reconnecting",i.SignalReconnecting="signalReconnecting"})(st||(st={}));const jb=4*1e3;class Bs extends Hn.EventEmitter{constructor(e){var t,n,s,r;if(super(),t=this,this.state=st.Disconnected,this.activeSpeakers=[],this.isE2EEEnabled=!1,this.audioEnabled=!0,this.isVideoPlaybackBlocked=!1,this.log=Ke,this.bufferedEvents=[],this.isResuming=!1,this.rpcHandlers=new Map,this.connect=(a,o,c)=>P(this,void 0,void 0,function*(){var l;if(!x0())throw qn()?Error("WebRTC isn't detected, have you called registerGlobals?"):Error("LiveKit doesn't seem to be supported on this browser. Try to update your browser and make sure no browser extensions are disabling webRTC.");const d=yield this.disconnectLock.lock();if(this.state===st.Connected)return this.log.info("already connected to room ".concat(this.name),this.logContext),d(),Promise.resolve();if(this.connectFuture)return d(),this.connectFuture.promise;this.setAndEmitConnectionState(st.Connecting),((l=this.regionUrlProvider)===null||l===void 0?void 0:l.getServerUrl().toString())!==a&&(this.regionUrl=void 0,this.regionUrlProvider=void 0),yc(new URL(a))&&(this.regionUrlProvider===void 0?this.regionUrlProvider=new jc(a,o):this.regionUrlProvider.updateToken(o),this.regionUrlProvider.fetchRegionSettings().then(f=>{var g;(g=this.regionUrlProvider)===null||g===void 0||g.setServerReportedRegions(f)}).catch(f=>{this.log.warn("could not fetch region settings",Object.assign(Object.assign({},this.logContext),{error:f}))}));const u=(f,g,v)=>P(this,void 0,void 0,function*(){var m,p;this.abortController&&this.abortController.abort();const x=new AbortController;this.abortController=x,d==null||d();try{yield this.attemptConnection(v??a,o,c,x),this.abortController=void 0,f()}catch(C){if(this.regionUrlProvider&&C instanceof pt&&C.reason!==Je.Cancelled&&C.reason!==Je.NotAllowed){let b=null;try{b=yield this.regionUrlProvider.getNextBestRegionUrl((m=this.abortController)===null||m===void 0?void 0:m.signal)}catch(S){if(S instanceof pt&&(S.status===401||S.reason===Je.Cancelled)){this.handleDisconnect(this.options.stopLocalTrackOnUnpublish),g(S);return}}b&&!(!((p=this.abortController)===null||p===void 0)&&p.signal.aborted)?(this.log.info("Initial connection failed with ConnectionError: ".concat(C.message,". Retrying with another region: ").concat(b),this.logContext),this.recreateEngine(),yield u(f,g,b)):(this.handleDisconnect(this.options.stopLocalTrackOnUnpublish,gf(C)),g(C))}else{let b=wn.UNKNOWN_REASON;C instanceof pt&&(b=gf(C)),this.handleDisconnect(this.options.stopLocalTrackOnUnpublish,b),g(C)}}}),h=this.regionUrl;return this.regionUrl=void 0,this.connectFuture=new $n((f,g)=>{u(f,g,h)},()=>{this.clearConnectionFutures()}),this.connectFuture.promise}),this.connectSignal=(a,o,c,l,d,u)=>P(this,void 0,void 0,function*(){var h,f,g;const v=yield c.join(a,o,{autoSubscribe:l.autoSubscribe,adaptiveStream:typeof d.adaptiveStream=="object"?!0:d.adaptiveStream,maxRetries:l.maxRetries,e2eeEnabled:!!this.e2eeManager,websocketTimeout:l.websocketTimeout},u.signal);let m=v.serverInfo;if(m||(m={version:v.serverVersion,region:v.serverRegion}),this.serverInfo=m,this.log.debug("connected to Livekit Server ".concat(Object.entries(m).map(p=>{let[x,C]=p;return"".concat(x,": ").concat(C)}).join(", ")),{room:(h=v.room)===null||h===void 0?void 0:h.name,roomSid:(f=v.room)===null||f===void 0?void 0:f.sid,identity:(g=v.participant)===null||g===void 0?void 0:g.identity}),!m.version)throw new o0("unknown server version");return m.version==="0.15.1"&&this.options.dynacast&&(this.log.debug("disabling dynacast due to server version",this.logContext),d.dynacast=!1),v}),this.applyJoinResponse=a=>{const o=a.participant;if(this.localParticipant.sid=o.sid,this.localParticipant.identity=o.identity,this.localParticipant.setEnabledPublishCodecs(a.enabledPublishCodecs),this.options.e2ee&&this.e2eeManager)try{this.e2eeManager.setSifTrailer(a.sifTrailer)}catch(c){this.log.error(c instanceof Error?c.message:"Could not set SifTrailer",Object.assign(Object.assign({},this.logContext),{error:c}))}this.handleParticipantUpdates([o,...a.otherParticipants]),a.room&&this.handleRoomUpdate(a.room)},this.attemptConnection=(a,o,c,l)=>P(this,void 0,void 0,function*(){var d,u;this.state===st.Reconnecting||this.isResuming||!((d=this.engine)===null||d===void 0)&&d.pendingReconnect?(this.log.info("Reconnection attempt replaced by new connection attempt",this.logContext),this.recreateEngine()):this.maybeCreateEngine(),!((u=this.regionUrlProvider)===null||u===void 0)&&u.isCloud()&&this.engine.setRegionUrlProvider(this.regionUrlProvider),this.acquireAudioContext(),this.connOptions=Object.assign(Object.assign({},Fc),c),this.connOptions.rtcConfig&&(this.engine.rtcConfig=this.connOptions.rtcConfig),this.connOptions.peerConnectionTimeout&&(this.engine.peerConnectionTimeout=this.connOptions.peerConnectionTimeout);try{const h=yield this.connectSignal(a,o,this.engine,this.connOptions,this.options,l);this.applyJoinResponse(h),this.setupLocalParticipantEvents(),this.emit(ne.SignalConnected)}catch(h){yield this.engine.close(),this.recreateEngine();const f=new pt("could not establish signal connection",Je.ServerUnreachable);throw h instanceof Error&&(f.message="".concat(f.message,": ").concat(h.message)),h instanceof pt&&(f.reason=h.reason,f.status=h.status),this.log.debug("error trying to establish signal connection",Object.assign(Object.assign({},this.logContext),{error:h})),f}if(l.signal.aborted)throw yield this.engine.close(),this.recreateEngine(),new pt("Connection attempt aborted",Je.Cancelled);try{yield this.engine.waitForPCInitialConnection(this.connOptions.peerConnectionTimeout,l)}catch(h){throw yield this.engine.close(),this.recreateEngine(),h}cn()&&this.options.disconnectOnPageLeave&&(window.addEventListener("pagehide",this.onPageLeave),window.addEventListener("beforeunload",this.onPageLeave)),cn()&&document.addEventListener("freeze",this.onPageLeave),this.setAndEmitConnectionState(st.Connected),this.emit(ne.Connected),this.registerConnectionReconcile()}),this.disconnect=function(){for(var a=arguments.length,o=new Array(a),c=0;c<a;c++)o[c]=arguments[c];return P(t,[...o],void 0,function(){var l=this;let d=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!0;return function*(){var u,h,f,g;const v=yield l.disconnectLock.lock();try{if(l.state===st.Disconnected){l.log.debug("already disconnected",l.logContext);return}l.log.info("disconnect from room",Object.assign({},l.logContext)),(l.state===st.Connecting||l.state===st.Reconnecting||l.isResuming)&&(l.log.warn("abort connection attempt",l.logContext),(u=l.abortController)===null||u===void 0||u.abort(),(f=(h=l.connectFuture)===null||h===void 0?void 0:h.reject)===null||f===void 0||f.call(h,new pt("Client initiated disconnect",Je.Cancelled)),l.connectFuture=void 0),!((g=l.engine)===null||g===void 0)&&g.client.isDisconnected||(yield l.engine.client.sendLeave()),l.engine&&(yield l.engine.close()),l.handleDisconnect(d,wn.CLIENT_INITIATED),l.engine=void 0}finally{v()}}()})},this.onPageLeave=()=>P(this,void 0,void 0,function*(){this.log.info("Page leave detected, disconnecting",this.logContext),yield this.disconnect()}),this.startAudio=()=>P(this,void 0,void 0,function*(){const a=[],o=fn();if(o&&o.os==="iOS"){const c="livekit-dummy-audio-el";let l=document.getElementById(c);if(!l){l=document.createElement("audio"),l.id=c,l.autoplay=!0,l.hidden=!0;const d=Tc();d.enabled=!0;const u=new MediaStream([d]);l.srcObject=u,document.addEventListener("visibilitychange",()=>{l&&(l.srcObject=document.hidden?null:u,document.hidden||(this.log.debug("page visible again, triggering startAudio to resume playback and update playback status",this.logContext),this.startAudio()))}),document.body.append(l),this.once(ne.Disconnected,()=>{l==null||l.remove(),l=null})}a.push(l)}this.remoteParticipants.forEach(c=>{c.audioTrackPublications.forEach(l=>{l.track&&l.track.attachedElements.forEach(d=>{a.push(d)})})});try{yield Promise.all([this.acquireAudioContext(),...a.map(c=>(c.muted=!1,c.play()))]),this.handleAudioPlaybackStarted()}catch(c){throw this.handleAudioPlaybackFailed(c),c}}),this.startVideo=()=>P(this,void 0,void 0,function*(){const a=[];for(const o of this.remoteParticipants.values())o.videoTrackPublications.forEach(c=>{var l;(l=c.track)===null||l===void 0||l.attachedElements.forEach(d=>{a.includes(d)||a.push(d)})});yield Promise.all(a.map(o=>o.play())).then(()=>{this.handleVideoPlaybackStarted()}).catch(o=>{o.name==="NotAllowedError"?this.handleVideoPlaybackFailed():this.log.warn("Resuming video playback failed, make sure you call `startVideo` directly in a user gesture handler",this.logContext)})}),this.handleRestarting=()=>{this.clearConnectionReconcile(),this.isResuming=!1;for(const a of this.remoteParticipants.values())this.handleParticipantDisconnected(a.identity,a);this.setAndEmitConnectionState(st.Reconnecting)&&this.emit(ne.Reconnecting)},this.handleSignalRestarted=a=>P(this,void 0,void 0,function*(){this.log.debug("signal reconnected to server, region ".concat(a.serverRegion),Object.assign(Object.assign({},this.logContext),{region:a.serverRegion})),this.bufferedEvents=[],this.applyJoinResponse(a);try{yield this.localParticipant.republishAllTracks(void 0,!0)}catch(o){this.log.error("error trying to re-publish tracks after reconnection",Object.assign(Object.assign({},this.logContext),{error:o}))}try{yield this.engine.waitForRestarted(),this.log.debug("fully reconnected to server",Object.assign(Object.assign({},this.logContext),{region:a.serverRegion}))}catch{return}this.setAndEmitConnectionState(st.Connected),this.emit(ne.Reconnected),this.registerConnectionReconcile(),this.emitBufferedEvents()}),this.handleParticipantUpdates=a=>{a.forEach(o=>{var c;if(o.identity===this.localParticipant.identity){this.localParticipant.updateInfo(o);return}o.identity===""&&(o.identity=(c=this.sidToIdentity.get(o.sid))!==null&&c!==void 0?c:"");let l=this.remoteParticipants.get(o.identity);o.state===Ps.DISCONNECTED?this.handleParticipantDisconnected(o.identity,l):l=this.getOrCreateParticipant(o.identity,o)})},this.handleActiveSpeakersUpdate=a=>{const o=[],c={};a.forEach(l=>{if(c[l.sid]=!0,l.sid===this.localParticipant.sid)this.localParticipant.audioLevel=l.level,this.localParticipant.setIsSpeaking(!0),o.push(this.localParticipant);else{const d=this.getRemoteParticipantBySid(l.sid);d&&(d.audioLevel=l.level,d.setIsSpeaking(!0),o.push(d))}}),c[this.localParticipant.sid]||(this.localParticipant.audioLevel=0,this.localParticipant.setIsSpeaking(!1)),this.remoteParticipants.forEach(l=>{c[l.sid]||(l.audioLevel=0,l.setIsSpeaking(!1))}),this.activeSpeakers=o,this.emitWhenConnected(ne.ActiveSpeakersChanged,o)},this.handleSpeakersChanged=a=>{const o=new Map;this.activeSpeakers.forEach(l=>{const d=this.remoteParticipants.get(l.identity);d&&d.sid!==l.sid||o.set(l.sid,l)}),a.forEach(l=>{let d=this.getRemoteParticipantBySid(l.sid);l.sid===this.localParticipant.sid&&(d=this.localParticipant),d&&(d.audioLevel=l.level,d.setIsSpeaking(l.active),l.active?o.set(l.sid,d):o.delete(l.sid))});const c=Array.from(o.values());c.sort((l,d)=>d.audioLevel-l.audioLevel),this.activeSpeakers=c,this.emitWhenConnected(ne.ActiveSpeakersChanged,c)},this.handleStreamStateUpdate=a=>{a.streamStates.forEach(o=>{const c=this.getRemoteParticipantBySid(o.participantSid);if(!c)return;const l=c.getTrackPublicationBySid(o.trackSid);if(!l||!l.track)return;const d=Z.streamStateFromProto(o.state);l.track.setStreamState(d),d!==l.track.streamState&&(c.emit(ce.TrackStreamStateChanged,l,l.track.streamState),this.emitWhenConnected(ne.TrackStreamStateChanged,l,l.track.streamState,c))})},this.handleSubscriptionPermissionUpdate=a=>{const o=this.getRemoteParticipantBySid(a.participantSid);if(!o)return;const c=o.getTrackPublicationBySid(a.trackSid);c&&c.setAllowed(a.allowed)},this.handleSubscriptionError=a=>{const o=Array.from(this.remoteParticipants.values()).find(l=>l.trackPublications.has(a.trackSid));if(!o)return;const c=o.getTrackPublicationBySid(a.trackSid);c&&c.setSubscriptionError(a.err)},this.handleDataPacket=a=>{const o=this.remoteParticipants.get(a.participantIdentity);if(a.value.case==="user")this.handleUserPacket(o,a.value.value,a.kind);else if(a.value.case==="transcription")this.handleTranscription(o,a.value.value);else if(a.value.case==="sipDtmf")this.handleSipDtmf(o,a.value.value);else if(a.value.case==="chatMessage")this.handleChatMessage(o,a.value.value);else if(a.value.case==="metrics")this.handleMetrics(a.value.value,o);else if(a.value.case==="streamHeader"||a.value.case==="streamChunk"||a.value.case==="streamTrailer")this.handleDataStream(a);else if(a.value.case==="rpcRequest"){const c=a.value.value;this.handleIncomingRpcRequest(a.participantIdentity,c.id,c.method,c.payload,c.responseTimeoutMs,c.version)}},this.handleUserPacket=(a,o,c)=>{this.emit(ne.DataReceived,o.payload,a,c,o.topic),a==null||a.emit(ce.DataReceived,o.payload,c)},this.handleSipDtmf=(a,o)=>{this.emit(ne.SipDTMFReceived,o,a),a==null||a.emit(ce.SipDTMFReceived,o)},this.handleTranscription=(a,o)=>{const c=o.transcribedParticipantIdentity===this.localParticipant.identity?this.localParticipant:this.getParticipantByIdentity(o.transcribedParticipantIdentity),l=c==null?void 0:c.trackPublications.get(o.trackId),d=k0(o,this.transcriptionReceivedTimes);l==null||l.emit(ae.TranscriptionReceived,d),c==null||c.emit(ce.TranscriptionReceived,d,l),this.emit(ne.TranscriptionReceived,d,c,l)},this.handleChatMessage=(a,o)=>{const c=I0(o);this.emit(ne.ChatMessage,c,a)},this.handleMetrics=(a,o)=>{this.emit(ne.MetricsReceived,a,o)},this.handleDataStream=a=>{this.incomingDataStreamManager.handleDataStreamPacket(a)},this.bufferedSegments=new Map,this.handleAudioPlaybackStarted=()=>{this.canPlaybackAudio||(this.audioEnabled=!0,this.emit(ne.AudioPlaybackStatusChanged,!0))},this.handleAudioPlaybackFailed=a=>{this.log.warn("could not playback audio",Object.assign(Object.assign({},this.logContext),{error:a})),this.canPlaybackAudio&&(this.audioEnabled=!1,this.emit(ne.AudioPlaybackStatusChanged,!1))},this.handleVideoPlaybackStarted=()=>{this.isVideoPlaybackBlocked&&(this.isVideoPlaybackBlocked=!1,this.emit(ne.VideoPlaybackStatusChanged,!0))},this.handleVideoPlaybackFailed=()=>{this.isVideoPlaybackBlocked||(this.isVideoPlaybackBlocked=!0,this.emit(ne.VideoPlaybackStatusChanged,!1))},this.handleDeviceChange=()=>P(this,void 0,void 0,function*(){var a;((a=fn())===null||a===void 0?void 0:a.os)!=="iOS"&&(yield this.selectDefaultDevices()),this.emit(ne.MediaDevicesChanged)}),this.handleRoomUpdate=a=>{const o=this.roomInfo;this.roomInfo=a,o&&o.metadata!==a.metadata&&this.emitWhenConnected(ne.RoomMetadataChanged,a.metadata),(o==null?void 0:o.activeRecording)!==a.activeRecording&&this.emitWhenConnected(ne.RecordingStatusChanged,a.activeRecording)},this.handleConnectionQualityUpdate=a=>{a.updates.forEach(o=>{if(o.participantSid===this.localParticipant.sid){this.localParticipant.setConnectionQuality(o.quality);return}const c=this.getRemoteParticipantBySid(o.participantSid);c&&c.setConnectionQuality(o.quality)})},this.onLocalParticipantMetadataChanged=a=>{this.emit(ne.ParticipantMetadataChanged,a,this.localParticipant)},this.onLocalParticipantNameChanged=a=>{this.emit(ne.ParticipantNameChanged,a,this.localParticipant)},this.onLocalAttributesChanged=a=>{this.emit(ne.ParticipantAttributesChanged,a,this.localParticipant)},this.onLocalTrackMuted=a=>{this.emit(ne.TrackMuted,a,this.localParticipant)},this.onLocalTrackUnmuted=a=>{this.emit(ne.TrackUnmuted,a,this.localParticipant)},this.onTrackProcessorUpdate=a=>{var o;(o=a==null?void 0:a.onPublish)===null||o===void 0||o.call(a,this)},this.onLocalTrackPublished=a=>P(this,void 0,void 0,function*(){var o,c,l,d,u,h;(o=a.track)===null||o===void 0||o.on(ae.TrackProcessorUpdate,this.onTrackProcessorUpdate),(c=a.track)===null||c===void 0||c.on(ae.Restarted,this.onLocalTrackRestarted),(u=(d=(l=a.track)===null||l===void 0?void 0:l.getProcessor())===null||d===void 0?void 0:d.onPublish)===null||u===void 0||u.call(d,this),this.emit(ne.LocalTrackPublished,a,this.localParticipant),fi(a.track)&&(yield a.track.checkForSilence())&&this.emit(ne.LocalAudioSilenceDetected,a);const f=yield(h=a.track)===null||h===void 0?void 0:h.getDeviceId(!1),g=Rc(a.source);g&&f&&f!==this.localParticipant.activeDeviceMap.get(g)&&(this.localParticipant.activeDeviceMap.set(g,f),this.emit(ne.ActiveDeviceChanged,g,f))}),this.onLocalTrackUnpublished=a=>{var o,c;(o=a.track)===null||o===void 0||o.off(ae.TrackProcessorUpdate,this.onTrackProcessorUpdate),(c=a.track)===null||c===void 0||c.off(ae.Restarted,this.onLocalTrackRestarted),this.emit(ne.LocalTrackUnpublished,a,this.localParticipant)},this.onLocalTrackRestarted=a=>P(this,void 0,void 0,function*(){const o=yield a.getDeviceId(!1),c=Rc(a.source);c&&o&&o!==this.localParticipant.activeDeviceMap.get(c)&&(this.log.debug("local track restarted, setting ".concat(c," ").concat(o," active"),this.logContext),this.localParticipant.activeDeviceMap.set(c,o),this.emit(ne.ActiveDeviceChanged,c,o))}),this.onLocalConnectionQualityChanged=a=>{this.emit(ne.ConnectionQualityChanged,a,this.localParticipant)},this.onMediaDevicesError=(a,o)=>{this.emit(ne.MediaDevicesError,a,o)},this.onLocalParticipantPermissionsChanged=a=>{this.emit(ne.ParticipantPermissionsChanged,a,this.localParticipant)},this.onLocalChatMessageSent=a=>{this.emit(ne.ChatMessage,a,this.localParticipant)},this.setMaxListeners(100),this.remoteParticipants=new Map,this.sidToIdentity=new Map,this.options=Object.assign(Object.assign({},rb),e),this.log=li((n=this.options.loggerName)!==null&&n!==void 0?n:Rn.Room),this.transcriptionReceivedTimes=new Map,this.options.audioCaptureDefaults=Object.assign(Object.assign({},If),e==null?void 0:e.audioCaptureDefaults),this.options.videoCaptureDefaults=Object.assign(Object.assign({},Df),e==null?void 0:e.videoCaptureDefaults),this.options.publishDefaults=Object.assign(Object.assign({},sb),e==null?void 0:e.publishDefaults),this.maybeCreateEngine(),this.incomingDataStreamManager=new Db,this.outgoingDataStreamManager=new Ub(this.engine,this.log),this.disconnectLock=new sn,this.localParticipant=new Wb("","",this.engine,this.options,this.rpcHandlers,this.outgoingDataStreamManager),this.options.videoCaptureDefaults.deviceId&&this.localParticipant.activeDeviceMap.set("videoinput",Oi(this.options.videoCaptureDefaults.deviceId)),this.options.audioCaptureDefaults.deviceId&&this.localParticipant.activeDeviceMap.set("audioinput",Oi(this.options.audioCaptureDefaults.deviceId)),!((s=this.options.audioOutput)===null||s===void 0)&&s.deviceId&&this.switchActiveDevice("audiooutput",Oi(this.options.audioOutput.deviceId)).catch(a=>this.log.warn("Could not set audio output: ".concat(a.message),this.logContext)),this.options.e2ee&&this.setupE2EE(),cn()){const a=new AbortController;(r=navigator.mediaDevices)===null||r===void 0||r.addEventListener("devicechange",this.handleDeviceChange,{signal:a.signal}),Bs.cleanupRegistry&&Bs.cleanupRegistry.register(this,()=>{a.abort()})}}registerTextStreamHandler(e,t){return this.incomingDataStreamManager.registerTextStreamHandler(e,t)}unregisterTextStreamHandler(e){return this.incomingDataStreamManager.unregisterTextStreamHandler(e)}registerByteStreamHandler(e,t){return this.incomingDataStreamManager.registerByteStreamHandler(e,t)}unregisterByteStreamHandler(e){return this.incomingDataStreamManager.unregisterByteStreamHandler(e)}registerRpcMethod(e,t){if(this.rpcHandlers.has(e))throw Error("RPC handler already registered for method ".concat(e,", unregisterRpcMethod before trying to register again"));this.rpcHandlers.set(e,t)}unregisterRpcMethod(e){this.rpcHandlers.delete(e)}setE2EEEnabled(e){return P(this,void 0,void 0,function*(){if(this.e2eeManager)yield Promise.all([this.localParticipant.setE2EEEnabled(e)]),this.localParticipant.identity!==""&&this.e2eeManager.setParticipantCryptorEnabled(e,this.localParticipant.identity);else throw Error("e2ee not configured, please set e2ee settings within the room options")})}setupE2EE(){var e;this.options.e2ee&&("e2eeManager"in this.options.e2ee?this.e2eeManager=this.options.e2ee.e2eeManager:this.e2eeManager=new H0(this.options.e2ee),this.e2eeManager.on(Ni.ParticipantEncryptionStatusChanged,(t,n)=>{L0(n)&&(this.isE2EEEnabled=t),this.emit(ne.ParticipantEncryptionStatusChanged,t,n)}),this.e2eeManager.on(Ni.EncryptionError,t=>this.emit(ne.EncryptionError,t)),(e=this.e2eeManager)===null||e===void 0||e.setup(this))}get logContext(){var e;return{room:this.name,roomID:(e=this.roomInfo)===null||e===void 0?void 0:e.sid,participant:this.localParticipant.identity,pID:this.localParticipant.sid}}get isRecording(){var e,t;return(t=(e=this.roomInfo)===null||e===void 0?void 0:e.activeRecording)!==null&&t!==void 0?t:!1}getSid(){return P(this,void 0,void 0,function*(){return this.state===st.Disconnected?"":this.roomInfo&&this.roomInfo.sid!==""?this.roomInfo.sid:new Promise((e,t)=>{const n=s=>{s.sid!==""&&(this.engine.off(le.RoomUpdate,n),e(s.sid))};this.engine.on(le.RoomUpdate,n),this.once(ne.Disconnected,()=>{this.engine.off(le.RoomUpdate,n),t("Room disconnected before room server id was available")})})})}get name(){var e,t;return(t=(e=this.roomInfo)===null||e===void 0?void 0:e.name)!==null&&t!==void 0?t:""}get metadata(){var e;return(e=this.roomInfo)===null||e===void 0?void 0:e.metadata}get numParticipants(){var e,t;return(t=(e=this.roomInfo)===null||e===void 0?void 0:e.numParticipants)!==null&&t!==void 0?t:0}get numPublishers(){var e,t;return(t=(e=this.roomInfo)===null||e===void 0?void 0:e.numPublishers)!==null&&t!==void 0?t:0}maybeCreateEngine(){this.engine&&!this.engine.isClosed||(this.engine=new wb(this.options),this.engine.on(le.ParticipantUpdate,this.handleParticipantUpdates).on(le.RoomUpdate,this.handleRoomUpdate).on(le.SpeakersChanged,this.handleSpeakersChanged).on(le.StreamStateChanged,this.handleStreamStateUpdate).on(le.ConnectionQualityUpdate,this.handleConnectionQualityUpdate).on(le.SubscriptionError,this.handleSubscriptionError).on(le.SubscriptionPermissionUpdate,this.handleSubscriptionPermissionUpdate).on(le.MediaTrackAdded,(e,t,n)=>{this.onTrackAdded(e,t,n)}).on(le.Disconnected,e=>{this.handleDisconnect(this.options.stopLocalTrackOnUnpublish,e)}).on(le.ActiveSpeakersUpdate,this.handleActiveSpeakersUpdate).on(le.DataPacketReceived,this.handleDataPacket).on(le.Resuming,()=>{this.clearConnectionReconcile(),this.isResuming=!0,this.log.info("Resuming signal connection",this.logContext),this.setAndEmitConnectionState(st.SignalReconnecting)&&this.emit(ne.SignalReconnecting)}).on(le.Resumed,()=>{this.registerConnectionReconcile(),this.isResuming=!1,this.log.info("Resumed signal connection",this.logContext),this.updateSubscriptions(),this.emitBufferedEvents(),this.setAndEmitConnectionState(st.Connected)&&this.emit(ne.Reconnected)}).on(le.SignalResumed,()=>{this.bufferedEvents=[],(this.state===st.Reconnecting||this.isResuming)&&this.sendSyncState()}).on(le.Restarting,this.handleRestarting).on(le.SignalRestarted,this.handleSignalRestarted).on(le.Offline,()=>{this.setAndEmitConnectionState(st.Reconnecting)&&this.emit(ne.Reconnecting)}).on(le.DCBufferStatusChanged,(e,t)=>{this.emit(ne.DCBufferStatusChanged,e,t)}).on(le.LocalTrackSubscribed,e=>{const t=this.localParticipant.getTrackPublications().find(n=>{let{trackSid:s}=n;return s===e});if(!t){this.log.warn("could not find local track subscription for subscribed event",this.logContext);return}this.localParticipant.emit(ce.LocalTrackSubscribed,t),this.emitWhenConnected(ne.LocalTrackSubscribed,t,this.localParticipant)}).on(le.RoomMoved,e=>{this.log.debug("room moved",e),e.room&&this.handleRoomUpdate(e.room),this.remoteParticipants.forEach((t,n)=>{this.handleParticipantDisconnected(n,t)}),this.emit(ne.Moved,e.room.name),e.participant?this.handleParticipantUpdates([e.participant,...e.otherParticipants]):this.handleParticipantUpdates(e.otherParticipants)}),this.localParticipant&&this.localParticipant.setupEngine(this.engine),this.e2eeManager&&this.e2eeManager.setupEngine(this.engine),this.outgoingDataStreamManager&&this.outgoingDataStreamManager.setupEngine(this.engine))}static getLocalDevices(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0;return Wt.getInstance().getDevices(e,t)}prepareConnection(e,t){return P(this,void 0,void 0,function*(){if(this.state===st.Disconnected){this.log.debug("prepareConnection to ".concat(e),this.logContext);try{if(yc(new URL(e))&&t){this.regionUrlProvider=new jc(e,t);const n=yield this.regionUrlProvider.getNextBestRegionUrl();n&&this.state===st.Disconnected&&(this.regionUrl=n,yield fetch(Cc(n),{method:"HEAD"}),this.log.debug("prepared connection to ".concat(n),this.logContext))}else yield fetch(Cc(e),{method:"HEAD"})}catch(n){this.log.warn("could not prepare connection",Object.assign(Object.assign({},this.logContext),{error:n}))}}})}getParticipantByIdentity(e){return this.localParticipant.identity===e?this.localParticipant:this.remoteParticipants.get(e)}clearConnectionFutures(){this.connectFuture=void 0}simulateScenario(e,t){return P(this,void 0,void 0,function*(){let n=()=>{},s;switch(e){case"signal-reconnect":yield this.engine.client.handleOnClose("simulate disconnect");break;case"speaker":s=new Gn({scenario:{case:"speakerUpdate",value:3}});break;case"node-failure":s=new Gn({scenario:{case:"nodeFailure",value:!0}});break;case"server-leave":s=new Gn({scenario:{case:"serverLeave",value:!0}});break;case"migration":s=new Gn({scenario:{case:"migration",value:!0}});break;case"resume-reconnect":this.engine.failNext(),yield this.engine.client.handleOnClose("simulate resume-disconnect");break;case"disconnect-signal-on-resume":n=()=>P(this,void 0,void 0,function*(){yield this.engine.client.handleOnClose("simulate resume-disconnect")}),s=new Gn({scenario:{case:"disconnectSignalOnResume",value:!0}});break;case"disconnect-signal-on-resume-no-messages":n=()=>P(this,void 0,void 0,function*(){yield this.engine.client.handleOnClose("simulate resume-disconnect")}),s=new Gn({scenario:{case:"disconnectSignalOnResumeNoMessages",value:!0}});break;case"full-reconnect":this.engine.fullReconnectOnNext=!0,yield this.engine.client.handleOnClose("simulate full-reconnect");break;case"force-tcp":case"force-tls":s=new Gn({scenario:{case:"switchCandidateProtocol",value:e==="force-tls"?2:1}}),n=()=>P(this,void 0,void 0,function*(){const r=this.engine.client.onLeave;r&&r(new ba({reason:wn.CLIENT_INITIATED,action:Is.RECONNECT}))});break;case"subscriber-bandwidth":if(t===void 0||typeof t!="number")throw new Error("subscriber-bandwidth requires a number as argument");s=new Gn({scenario:{case:"subscriberBandwidth",value:cs(t)}});break;case"leave-full-reconnect":s=new Gn({scenario:{case:"leaveRequestFullReconnect",value:!0}})}s&&(yield this.engine.client.sendSimulateScenario(s),yield n())})}get canPlaybackAudio(){return this.audioEnabled}get canPlaybackVideo(){return!this.isVideoPlaybackBlocked}getActiveDevice(e){return this.localParticipant.activeDeviceMap.get(e)}switchActiveDevice(e,t){return P(this,arguments,void 0,function(n,s){var r=this;let a=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0;return function*(){var o,c,l,d,u,h,f;let g=!0,v=!1;const m=a?{exact:s}:s;if(n==="audioinput"){v=r.localParticipant.audioTrackPublications.size===0;const p=(o=r.getActiveDevice(n))!==null&&o!==void 0?o:r.options.audioCaptureDefaults.deviceId;r.options.audioCaptureDefaults.deviceId=m;const x=Array.from(r.localParticipant.audioTrackPublications.values()).filter(b=>b.source===Z.Source.Microphone);try{g=(yield Promise.all(x.map(b=>{var S;return(S=b.audioTrack)===null||S===void 0?void 0:S.setDeviceId(m)}))).every(b=>b===!0)}catch(b){throw r.options.audioCaptureDefaults.deviceId=p,b}const C=x.some(b=>{var S,M;return(M=(S=b.track)===null||S===void 0?void 0:S.isMuted)!==null&&M!==void 0?M:!1});g&&C&&(v=!0)}else if(n==="videoinput"){v=r.localParticipant.videoTrackPublications.size===0;const p=(c=r.getActiveDevice(n))!==null&&c!==void 0?c:r.options.videoCaptureDefaults.deviceId;r.options.videoCaptureDefaults.deviceId=m;const x=Array.from(r.localParticipant.videoTrackPublications.values()).filter(b=>b.source===Z.Source.Camera);try{g=(yield Promise.all(x.map(b=>{var S;return(S=b.videoTrack)===null||S===void 0?void 0:S.setDeviceId(m)}))).every(b=>b===!0)}catch(b){throw r.options.videoCaptureDefaults.deviceId=p,b}const C=x.some(b=>{var S,M;return(M=(S=b.track)===null||S===void 0?void 0:S.isMuted)!==null&&M!==void 0?M:!1});g&&C&&(v=!0)}else if(n==="audiooutput"){if(v=!0,!_c()&&!r.options.webAudioMix||r.options.webAudioMix&&r.audioContext&&!("setSinkId"in r.audioContext))throw new Error("cannot switch audio output, the current browser does not support it");r.options.webAudioMix&&(s=(l=yield Wt.getInstance().normalizeDeviceId("audiooutput",s))!==null&&l!==void 0?l:""),(d=(f=r.options).audioOutput)!==null&&d!==void 0||(f.audioOutput={});const p=(u=r.getActiveDevice(n))!==null&&u!==void 0?u:r.options.audioOutput.deviceId;r.options.audioOutput.deviceId=s;try{r.options.webAudioMix&&((h=r.audioContext)===null||h===void 0||h.setSinkId(s)),yield Promise.all(Array.from(r.remoteParticipants.values()).map(x=>x.setAudioOutput({deviceId:s})))}catch(x){throw r.options.audioOutput.deviceId=p,x}}return v&&(r.localParticipant.activeDeviceMap.set(n,s),r.emit(ne.ActiveDeviceChanged,n,s)),g}()})}setupLocalParticipantEvents(){this.localParticipant.on(ce.ParticipantMetadataChanged,this.onLocalParticipantMetadataChanged).on(ce.ParticipantNameChanged,this.onLocalParticipantNameChanged).on(ce.AttributesChanged,this.onLocalAttributesChanged).on(ce.TrackMuted,this.onLocalTrackMuted).on(ce.TrackUnmuted,this.onLocalTrackUnmuted).on(ce.LocalTrackPublished,this.onLocalTrackPublished).on(ce.LocalTrackUnpublished,this.onLocalTrackUnpublished).on(ce.ConnectionQualityChanged,this.onLocalConnectionQualityChanged).on(ce.MediaDevicesError,this.onMediaDevicesError).on(ce.AudioStreamAcquired,this.startAudio).on(ce.ChatMessage,this.onLocalChatMessageSent).on(ce.ParticipantPermissionsChanged,this.onLocalParticipantPermissionsChanged)}recreateEngine(){var e;(e=this.engine)===null||e===void 0||e.close(),this.engine=void 0,this.isResuming=!1,this.remoteParticipants.clear(),this.sidToIdentity.clear(),this.bufferedEvents=[],this.maybeCreateEngine()}onTrackAdded(e,t,n){if(this.state===st.Connecting||this.state===st.Reconnecting){const u=()=>{this.onTrackAdded(e,t,n),h()},h=()=>{this.off(ne.Reconnected,u),this.off(ne.Connected,u),this.off(ne.Disconnected,h)};this.once(ne.Reconnected,u),this.once(ne.Connected,u),this.once(ne.Disconnected,h);return}if(this.state===st.Disconnected){this.log.warn("skipping incoming track after Room disconnected",this.logContext);return}if(e.readyState==="ended"){this.log.info("skipping incoming track as it already ended",this.logContext);return}const s=_0(t.id),r=s[0];let a=s[1],o=e.id;if(a&&a.startsWith("TR")&&(o=a),r===this.localParticipant.sid){this.log.warn("tried to create RemoteParticipant for local participant",this.logContext);return}const c=Array.from(this.remoteParticipants.values()).find(u=>u.sid===r);if(!c){this.log.error("Tried to add a track for a participant, that's not present. Sid: ".concat(r),this.logContext);return}let l;this.options.adaptiveStream&&(typeof this.options.adaptiveStream=="object"?l=this.options.adaptiveStream:l={});const d=c.addSubscribedMediaTrack(e,o,t,n,l);d!=null&&d.isEncrypted&&!this.e2eeManager&&this.emit(ne.EncryptionError,new Error("Encrypted ".concat(d.source," track received from participant ").concat(c.sid,", but room does not have encryption enabled!")))}handleDisconnect(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!0,t=arguments.length>1?arguments[1]:void 0;var n;if(this.clearConnectionReconcile(),this.isResuming=!1,this.bufferedEvents=[],this.transcriptionReceivedTimes.clear(),this.incomingDataStreamManager.clearHandlersAndControllers(),this.state!==st.Disconnected){this.regionUrl=void 0;try{this.remoteParticipants.forEach(s=>{s.trackPublications.forEach(r=>{s.unpublishTrack(r.trackSid)})}),this.localParticipant.trackPublications.forEach(s=>{var r,a,o;s.track&&this.localParticipant.unpublishTrack(s.track,e),e?((r=s.track)===null||r===void 0||r.detach(),(a=s.track)===null||a===void 0||a.stop()):(o=s.track)===null||o===void 0||o.stopMonitor()}),this.localParticipant.off(ce.ParticipantMetadataChanged,this.onLocalParticipantMetadataChanged).off(ce.ParticipantNameChanged,this.onLocalParticipantNameChanged).off(ce.AttributesChanged,this.onLocalAttributesChanged).off(ce.TrackMuted,this.onLocalTrackMuted).off(ce.TrackUnmuted,this.onLocalTrackUnmuted).off(ce.LocalTrackPublished,this.onLocalTrackPublished).off(ce.LocalTrackUnpublished,this.onLocalTrackUnpublished).off(ce.ConnectionQualityChanged,this.onLocalConnectionQualityChanged).off(ce.MediaDevicesError,this.onMediaDevicesError).off(ce.AudioStreamAcquired,this.startAudio).off(ce.ChatMessage,this.onLocalChatMessageSent).off(ce.ParticipantPermissionsChanged,this.onLocalParticipantPermissionsChanged),this.localParticipant.trackPublications.clear(),this.localParticipant.videoTrackPublications.clear(),this.localParticipant.audioTrackPublications.clear(),this.remoteParticipants.clear(),this.sidToIdentity.clear(),this.activeSpeakers=[],this.audioContext&&typeof this.options.webAudioMix=="boolean"&&(this.audioContext.close(),this.audioContext=void 0),cn()&&(window.removeEventListener("beforeunload",this.onPageLeave),window.removeEventListener("pagehide",this.onPageLeave),window.removeEventListener("freeze",this.onPageLeave),(n=navigator.mediaDevices)===null||n===void 0||n.removeEventListener("devicechange",this.handleDeviceChange))}finally{this.setAndEmitConnectionState(st.Disconnected),this.emit(ne.Disconnected,t)}}}handleParticipantDisconnected(e,t){var n;this.remoteParticipants.delete(e),t&&(this.incomingDataStreamManager.validateParticipantHasNoActiveDataStreams(e),t.trackPublications.forEach(s=>{t.unpublishTrack(s.trackSid,!0)}),this.emit(ne.ParticipantDisconnected,t),t.setDisconnected(),(n=this.localParticipant)===null||n===void 0||n.handleParticipantDisconnected(t.identity))}handleIncomingRpcRequest(e,t,n,s,r,a){return P(this,void 0,void 0,function*(){if(yield this.engine.publishRpcAck(e,t),a!==1){yield this.engine.publishRpcResponse(e,t,null,At.builtIn("UNSUPPORTED_VERSION"));return}const o=this.rpcHandlers.get(n);if(!o){yield this.engine.publishRpcResponse(e,t,null,At.builtIn("UNSUPPORTED_METHOD"));return}let c=null,l=null;try{const d=yield o({requestId:t,callerIdentity:e,payload:s,responseTimeout:r});Bc(d)>Lf?(c=At.builtIn("RESPONSE_PAYLOAD_TOO_LARGE"),console.warn("RPC Response payload too large for ".concat(n))):l=d}catch(d){d instanceof At?c=d:(console.warn("Uncaught error returned by RPC handler for ".concat(n,". Returning APPLICATION_ERROR instead."),d),c=At.builtIn("APPLICATION_ERROR"))}yield this.engine.publishRpcResponse(e,t,l,c)})}selectDefaultDevices(){return P(this,void 0,void 0,function*(){var e,t,n;const s=Wt.getInstance().previousDevices,r=yield Wt.getInstance().getDevices(void 0,!1),a=fn();if((a==null?void 0:a.name)==="Chrome"&&a.os!=="iOS")for(let c of r){const l=s.find(d=>d.deviceId===c.deviceId);l&&l.label!==""&&l.kind===c.kind&&l.label!==c.label&&this.getActiveDevice(c.kind)==="default"&&this.emit(ne.ActiveDeviceChanged,c.kind,c.deviceId)}const o=["audiooutput","audioinput","videoinput"];for(let c of o){const l=U0(c),d=this.localParticipant.getTrackPublication(l);if(d&&(!((e=d.track)===null||e===void 0)&&e.isUserProvided))continue;const u=r.filter(f=>f.kind===c),h=this.getActiveDevice(c);if(h===((t=s.filter(f=>f.kind===c)[0])===null||t===void 0?void 0:t.deviceId)&&u.length>0&&((n=u[0])===null||n===void 0?void 0:n.deviceId)!==h){yield this.switchActiveDevice(c,u[0].deviceId);continue}c==="audioinput"&&!Ir()||c==="videoinput"||u.length>0&&!u.find(f=>f.deviceId===this.getActiveDevice(c))&&(c!=="audiooutput"||!Ir())&&(yield this.switchActiveDevice(c,u[0].deviceId))}})}acquireAudioContext(){return P(this,void 0,void 0,function*(){var e,t;if(typeof this.options.webAudioMix!="boolean"&&this.options.webAudioMix.audioContext?this.audioContext=this.options.webAudioMix.audioContext:(!this.audioContext||this.audioContext.state==="closed")&&(this.audioContext=(e=_f())!==null&&e!==void 0?e:void 0),this.options.webAudioMix&&this.remoteParticipants.forEach(s=>s.setAudioContext(this.audioContext)),this.localParticipant.setAudioContext(this.audioContext),this.audioContext&&this.audioContext.state==="suspended")try{yield Promise.race([this.audioContext.resume(),on(200)])}catch(s){this.log.warn("Could not resume audio context",Object.assign(Object.assign({},this.logContext),{error:s}))}const n=((t=this.audioContext)===null||t===void 0?void 0:t.state)==="running";n!==this.canPlaybackAudio&&(this.audioEnabled=n,this.emit(ne.AudioPlaybackStatusChanged,n))})}createParticipant(e,t){var n;let s;return t?s=Na.fromParticipantInfo(this.engine.client,t,{loggerContextCb:()=>this.logContext,loggerName:this.options.loggerName}):s=new Na(this.engine.client,"",e,void 0,void 0,void 0,{loggerContextCb:()=>this.logContext,loggerName:this.options.loggerName}),this.options.webAudioMix&&s.setAudioContext(this.audioContext),!((n=this.options.audioOutput)===null||n===void 0)&&n.deviceId&&s.setAudioOutput(this.options.audioOutput).catch(r=>this.log.warn("Could not set audio output: ".concat(r.message),this.logContext)),s}getOrCreateParticipant(e,t){if(this.remoteParticipants.has(e)){const s=this.remoteParticipants.get(e);return t&&s.updateInfo(t)&&this.sidToIdentity.set(t.sid,t.identity),s}const n=this.createParticipant(e,t);return this.remoteParticipants.set(e,n),this.sidToIdentity.set(t.sid,t.identity),this.emitWhenConnected(ne.ParticipantConnected,n),n.on(ce.TrackPublished,s=>{this.emitWhenConnected(ne.TrackPublished,s,n)}).on(ce.TrackSubscribed,(s,r)=>{s.kind===Z.Kind.Audio?(s.on(ae.AudioPlaybackStarted,this.handleAudioPlaybackStarted),s.on(ae.AudioPlaybackFailed,this.handleAudioPlaybackFailed)):s.kind===Z.Kind.Video&&(s.on(ae.VideoPlaybackFailed,this.handleVideoPlaybackFailed),s.on(ae.VideoPlaybackStarted,this.handleVideoPlaybackStarted)),this.emit(ne.TrackSubscribed,s,r,n)}).on(ce.TrackUnpublished,s=>{this.emit(ne.TrackUnpublished,s,n)}).on(ce.TrackUnsubscribed,(s,r)=>{this.emit(ne.TrackUnsubscribed,s,r,n)}).on(ce.TrackMuted,s=>{this.emitWhenConnected(ne.TrackMuted,s,n)}).on(ce.TrackUnmuted,s=>{this.emitWhenConnected(ne.TrackUnmuted,s,n)}).on(ce.ParticipantMetadataChanged,s=>{this.emitWhenConnected(ne.ParticipantMetadataChanged,s,n)}).on(ce.ParticipantNameChanged,s=>{this.emitWhenConnected(ne.ParticipantNameChanged,s,n)}).on(ce.AttributesChanged,s=>{this.emitWhenConnected(ne.ParticipantAttributesChanged,s,n)}).on(ce.ConnectionQualityChanged,s=>{this.emitWhenConnected(ne.ConnectionQualityChanged,s,n)}).on(ce.ParticipantPermissionsChanged,s=>{this.emitWhenConnected(ne.ParticipantPermissionsChanged,s,n)}).on(ce.TrackSubscriptionStatusChanged,(s,r)=>{this.emitWhenConnected(ne.TrackSubscriptionStatusChanged,s,r,n)}).on(ce.TrackSubscriptionFailed,(s,r)=>{this.emit(ne.TrackSubscriptionFailed,s,n,r)}).on(ce.TrackSubscriptionPermissionChanged,(s,r)=>{this.emitWhenConnected(ne.TrackSubscriptionPermissionChanged,s,r,n)}).on(ce.Active,()=>{this.emitWhenConnected(ne.ParticipantActive,n),n.kind===Mr.AGENT&&this.localParticipant.setActiveAgent(n)}),t&&n.updateInfo(t),n}sendSyncState(){const e=Array.from(this.remoteParticipants.values()).reduce((n,s)=>(n.push(...s.getTrackPublications()),n),[]),t=this.localParticipant.getTrackPublications();this.engine.sendSyncState(e,t)}updateSubscriptions(){for(const e of this.remoteParticipants.values())for(const t of e.videoTrackPublications.values())t.isSubscribed&&D0(t)&&t.emitTrackUpdate()}getRemoteParticipantBySid(e){const t=this.sidToIdentity.get(e);if(t)return this.remoteParticipants.get(t)}registerConnectionReconcile(){this.clearConnectionReconcile();let e=0;this.connectionReconcileInterval=$t.setInterval(()=>{!this.engine||this.engine.isClosed||!this.engine.verifyTransport()?(e++,this.log.warn("detected connection state mismatch",Object.assign(Object.assign({},this.logContext),{numFailures:e,engine:this.engine?{closed:this.engine.isClosed,transportsConnected:this.engine.verifyTransport()}:void 0})),e>=3&&(this.recreateEngine(),this.handleDisconnect(this.options.stopLocalTrackOnUnpublish,wn.STATE_MISMATCH))):e=0},jb)}clearConnectionReconcile(){this.connectionReconcileInterval&&$t.clearInterval(this.connectionReconcileInterval)}setAndEmitConnectionState(e){return e===this.state?!1:(this.state=e,this.emit(ne.ConnectionStateChanged,this.state),!0)}emitBufferedEvents(){this.bufferedEvents.forEach(e=>{let[t,n]=e;this.emit(t,...n)}),this.bufferedEvents=[]}emitWhenConnected(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),s=1;s<t;s++)n[s-1]=arguments[s];if(this.state===st.Reconnecting||this.isResuming||!this.engine||this.engine.pendingReconnect)this.bufferedEvents.push([e,n]);else if(this.state===st.Connected)return this.emit(e,...n);return!1}simulateParticipants(e){return P(this,void 0,void 0,function*(){var t,n;const s=Object.assign({audio:!0,video:!0,useRealTracks:!1},e.publish),r=Object.assign({count:9,audio:!1,video:!0,aspectRatios:[1.66,1.7,1.3]},e.participants);if(this.handleDisconnect(),this.roomInfo=new ma({sid:"RM_SIMULATED",name:"simulated-room",emptyTimeout:0,maxParticipants:0,creationTime:Et.parse(new Date().getTime()),metadata:"",numParticipants:1,numPublishers:1,turnPassword:"",enabledCodecs:[],activeRecording:!1}),this.localParticipant.updateInfo(new ns({identity:"simulated-local",name:"local-name"})),this.setupLocalParticipantEvents(),this.emit(ne.SignalConnected),this.emit(ne.Connected),this.setAndEmitConnectionState(st.Connected),s.video){const a=new Kc(Z.Kind.Video,new ks({source:Lt.CAMERA,sid:Math.floor(Math.random()*1e4).toString(),type:Mn.AUDIO,name:"video-dummy"}),new Da(s.useRealTracks?(yield window.navigator.mediaDevices.getUserMedia({video:!0})).getVideoTracks()[0]:mf(160*((t=r.aspectRatios[0])!==null&&t!==void 0?t:1),160,!0,!0),void 0,!1,{loggerName:this.options.loggerName,loggerContextCb:()=>this.logContext}),{loggerName:this.options.loggerName,loggerContextCb:()=>this.logContext});this.localParticipant.addTrackPublication(a),this.localParticipant.emit(ce.LocalTrackPublished,a)}if(s.audio){const a=new Kc(Z.Kind.Audio,new ks({source:Lt.MICROPHONE,sid:Math.floor(Math.random()*1e4).toString(),type:Mn.AUDIO}),new Ia(s.useRealTracks?(yield navigator.mediaDevices.getUserMedia({audio:!0})).getAudioTracks()[0]:Tc(),void 0,!1,this.audioContext,{loggerName:this.options.loggerName,loggerContextCb:()=>this.logContext}),{loggerName:this.options.loggerName,loggerContextCb:()=>this.logContext});this.localParticipant.addTrackPublication(a),this.localParticipant.emit(ce.LocalTrackPublished,a)}for(let a=0;a<r.count-1;a+=1){let o=new ns({sid:Math.floor(Math.random()*1e4).toString(),identity:"simulated-".concat(a),state:Ps.ACTIVE,tracks:[],joinedAt:Et.parse(Date.now())});const c=this.getOrCreateParticipant(o.identity,o);if(r.video){const l=mf(160*((n=r.aspectRatios[a%r.aspectRatios.length])!==null&&n!==void 0?n:1),160,!1,!0),d=new ks({source:Lt.CAMERA,sid:Math.floor(Math.random()*1e4).toString(),type:Mn.AUDIO});c.addSubscribedMediaTrack(l,d.sid,new MediaStream([l]),new RTCRtpReceiver),o.tracks=[...o.tracks,d]}if(r.audio){const l=Tc(),d=new ks({source:Lt.MICROPHONE,sid:Math.floor(Math.random()*1e4).toString(),type:Mn.AUDIO});c.addSubscribedMediaTrack(l,d.sid,new MediaStream([l]),new RTCRtpReceiver),o.tracks=[...o.tracks,d]}c.updateInfo(o)}})}emit(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),s=1;s<t;s++)n[s-1]=arguments[s];if(e!==ne.ActiveSpeakersChanged&&e!==ne.TranscriptionReceived){const r=Yf(n).filter(a=>a!==void 0);this.log.debug("room event ".concat(e),Object.assign(Object.assign({},this.logContext),{event:e,args:r}))}return super.emit(e,...n)}}Bs.cleanupRegistry=typeof FinalizationRegistry<"u"&&new FinalizationRegistry(i=>{i()});function Yf(i){return i.map(e=>{if(e)return Array.isArray(e)?Yf(e):typeof e=="object"?"logContext"in e?e.logContext:void 0:e})}var Dn;(function(i){i[i.IDLE=0]="IDLE",i[i.RUNNING=1]="RUNNING",i[i.SKIPPED=2]="SKIPPED",i[i.SUCCESS=3]="SUCCESS",i[i.FAILED=4]="FAILED"})(Dn||(Dn={}));class Gi extends Hn.EventEmitter{constructor(e,t){let n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};super(),this.status=Dn.IDLE,this.logs=[],this.options={},this.url=e,this.token=t,this.name=this.constructor.name,this.room=new Bs(n.roomOptions),this.connectOptions=n.connectOptions,this.options=n}run(e){return P(this,void 0,void 0,function*(){if(this.status!==Dn.IDLE)throw Error("check is running already");this.setStatus(Dn.RUNNING);try{yield this.perform()}catch(t){t instanceof Error&&(this.options.errorsAsWarnings?this.appendWarning(t.message):this.appendError(t.message))}return yield this.disconnect(),yield new Promise(t=>setTimeout(t,500)),this.status!==Dn.SKIPPED&&this.setStatus(this.isSuccess()?Dn.SUCCESS:Dn.FAILED),e&&e(),this.getInfo()})}isSuccess(){return!this.logs.some(e=>e.level==="error")}connect(e){return P(this,void 0,void 0,function*(){return this.room.state===st.Connected?this.room:(e||(e=this.url),yield this.room.connect(e,this.token,this.connectOptions),this.room)})}disconnect(){return P(this,void 0,void 0,function*(){this.room&&this.room.state!==st.Disconnected&&(yield this.room.disconnect(),yield new Promise(e=>setTimeout(e,500)))})}skip(){this.setStatus(Dn.SKIPPED)}switchProtocol(e){return P(this,void 0,void 0,function*(){let t=!1,n=!1;if(this.room.on(ne.Reconnecting,()=>{t=!0}),this.room.once(ne.Reconnected,()=>{n=!0}),this.room.simulateScenario("force-".concat(e)),yield new Promise(r=>setTimeout(r,1e3)),!t)return;const s=Date.now()+1e4;for(;Date.now()<s;){if(n)return;yield on(100)}throw new Error("Could not reconnect using ".concat(e," protocol after 10 seconds"))})}appendMessage(e){this.logs.push({level:"info",message:e}),this.emit("update",this.getInfo())}appendWarning(e){this.logs.push({level:"warning",message:e}),this.emit("update",this.getInfo())}appendError(e){this.logs.push({level:"error",message:e}),this.emit("update",this.getInfo())}setStatus(e){this.status=e,this.emit("update",this.getInfo())}get engine(){var e;return(e=this.room)===null||e===void 0?void 0:e.engine}getInfo(){return{logs:this.logs,name:this.name,status:this.status,description:this.description}}}class $b extends Gi{get description(){return"Cloud regions"}perform(){return P(this,void 0,void 0,function*(){const e=new jc(this.url,this.token);if(!e.isCloud()){this.skip();return}const t=[],n=new Set;for(let r=0;r<3;r++){const a=yield e.getNextBestRegionUrl();if(!a)break;if(n.has(a))continue;n.add(a);const o=yield this.checkCloudRegion(a);this.appendMessage("".concat(o.region," RTT: ").concat(o.rtt,"ms, duration: ").concat(o.duration,"ms")),t.push(o)}t.sort((r,a)=>(r.duration-a.duration)*.5+(r.rtt-a.rtt)*.5);const s=t[0];this.bestStats=s,this.appendMessage("best Cloud region: ".concat(s.region))})}getInfo(){const e=super.getInfo();return e.data=this.bestStats,e}checkCloudRegion(e){return P(this,void 0,void 0,function*(){var t,n;yield this.connect(e),this.options.protocol==="tcp"&&(yield this.switchProtocol("tcp"));const s=(t=this.room.serverInfo)===null||t===void 0?void 0:t.region;if(!s)throw new Error("Region not found");const r=yield this.room.localParticipant.streamText({topic:"test"}),a=1e3,c=1e6/a,l="A".repeat(a),d=Date.now();for(let g=0;g<c;g++)yield r.write(l);yield r.close();const u=Date.now(),h=yield(n=this.room.engine.pcManager)===null||n===void 0?void 0:n.publisher.getStats(),f={region:s,rtt:1e4,duration:u-d};return h==null||h.forEach(g=>{g.type==="candidate-pair"&&g.nominated&&(f.rtt=g.currentRoundTripTime*1e3)}),yield this.disconnect(),f})}}const Yc=1e4;class Xb extends Gi{get description(){return"Connection via UDP vs TCP"}perform(){return P(this,void 0,void 0,function*(){const e=yield this.checkConnectionProtocol("udp"),t=yield this.checkConnectionProtocol("tcp");this.bestStats=e,e.qualityLimitationDurations.bandwidth-t.qualityLimitationDurations.bandwidth>.5||(e.packetsLost-t.packetsLost)/e.packetsSent>.01?(this.appendMessage("best connection quality via tcp"),this.bestStats=t):this.appendMessage("best connection quality via udp");const n=this.bestStats;this.appendMessage("upstream bitrate: ".concat((n.bitrateTotal/n.count/1e3/1e3).toFixed(2)," mbps")),this.appendMessage("RTT: ".concat((n.rttTotal/n.count*1e3).toFixed(2)," ms")),this.appendMessage("jitter: ".concat((n.jitterTotal/n.count*1e3).toFixed(2)," ms")),n.packetsLost>0&&this.appendWarning("packets lost: ".concat((n.packetsLost/n.packetsSent*100).toFixed(2),"%")),n.qualityLimitationDurations.bandwidth>1&&this.appendWarning("bandwidth limited ".concat((n.qualityLimitationDurations.bandwidth/(Yc/1e3)*100).toFixed(2),"%")),n.qualityLimitationDurations.cpu>0&&this.appendWarning("cpu limited ".concat((n.qualityLimitationDurations.cpu/(Yc/1e3)*100).toFixed(2),"%"))})}getInfo(){const e=super.getInfo();return e.data=this.bestStats,e}checkConnectionProtocol(e){return P(this,void 0,void 0,function*(){yield this.connect(),e==="tcp"?yield this.switchProtocol("tcp"):yield this.switchProtocol("udp");const t=document.createElement("canvas");t.width=1280,t.height=720;const n=t.getContext("2d");if(!n)throw new Error("Could not get canvas context");let s=0;const r=()=>{s=(s+1)%360,n.fillStyle="hsl(".concat(s,", 100%, 50%)"),n.fillRect(0,0,t.width,t.height),requestAnimationFrame(r)};r();const o=t.captureStream(30).getVideoTracks()[0],l=(yield this.room.localParticipant.publishTrack(o,{simulcast:!1,degradationPreference:"maintain-resolution",videoEncoding:{maxBitrate:2e6}})).track,d={protocol:e,packetsLost:0,packetsSent:0,qualityLimitationDurations:{},rttTotal:0,jitterTotal:0,bitrateTotal:0,count:0},u=setInterval(()=>P(this,void 0,void 0,function*(){const h=yield l.getRTCStatsReport();h==null||h.forEach(f=>{f.type==="outbound-rtp"?(d.packetsSent=f.packetsSent,d.qualityLimitationDurations=f.qualityLimitationDurations,d.bitrateTotal+=f.targetBitrate,d.count++):f.type==="remote-inbound-rtp"&&(d.packetsLost=f.packetsLost,d.rttTotal+=f.roundTripTime,d.jitterTotal+=f.jitter)})}),1e3);return yield new Promise(h=>setTimeout(h,Yc)),clearInterval(u),o.stop(),t.remove(),yield this.disconnect(),d})}}class Kb extends Gi{get description(){return"Can publish audio"}perform(){return P(this,void 0,void 0,function*(){var e;const t=yield this.connect(),n=yield zb();if(yield bf(n,1e3))throw new Error("unable to detect audio from microphone");this.appendMessage("detected audio from microphone"),t.localParticipant.publishTrack(n),yield new Promise(o=>setTimeout(o,3e3));const r=yield(e=n.sender)===null||e===void 0?void 0:e.getStats();if(!r)throw new Error("Could not get RTCStats");let a=0;if(r.forEach(o=>{o.type==="outbound-rtp"&&(o.kind==="audio"||!o.kind&&o.mediaType==="audio")&&(a=o.packetsSent)}),a===0)throw new Error("Could not determine packets are sent");this.appendMessage("published ".concat(a," audio packets"))})}}class Yb extends Gi{get description(){return"Can publish video"}perform(){return P(this,void 0,void 0,function*(){var e;const t=yield this.connect(),n=yield Vb();yield this.checkForVideo(n.mediaStreamTrack),t.localParticipant.publishTrack(n),yield new Promise(a=>setTimeout(a,5e3));const s=yield(e=n.sender)===null||e===void 0?void 0:e.getStats();if(!s)throw new Error("Could not get RTCStats");let r=0;if(s.forEach(a=>{a.type==="outbound-rtp"&&(a.kind==="video"||!a.kind&&a.mediaType==="video")&&(r+=a.packetsSent)}),r===0)throw new Error("Could not determine packets are sent");this.appendMessage("published ".concat(r," video packets"))})}checkForVideo(e){return P(this,void 0,void 0,function*(){const t=new MediaStream;t.addTrack(e.clone());const n=document.createElement("video");n.srcObject=t,n.muted=!0,yield new Promise(s=>{n.onplay=()=>{setTimeout(()=>{var r,a,o,c;const l=document.createElement("canvas"),d=e.getSettings(),u=(a=(r=d.width)!==null&&r!==void 0?r:n.videoWidth)!==null&&a!==void 0?a:1280,h=(c=(o=d.height)!==null&&o!==void 0?o:n.videoHeight)!==null&&c!==void 0?c:720;l.width=u,l.height=h;const f=l.getContext("2d");f.drawImage(n,0,0);const v=f.getImageData(0,0,l.width,l.height).data;let m=!0;for(let p=0;p<v.length;p+=4)if(v[p]!==0||v[p+1]!==0||v[p+2]!==0){m=!1;break}m?this.appendError("camera appears to be producing only black frames"):this.appendMessage("received video frames"),s()},1e3)},n.play()}),t.getTracks().forEach(s=>s.stop()),n.remove()})}}class Jb extends Gi{get description(){return"Resuming connection after interruption"}perform(){return P(this,void 0,void 0,function*(){var e;const t=yield this.connect();let n=!1,s=!1,r;const a=new Promise(l=>{setTimeout(l,5e3),r=l}),o=()=>{n=!0};t.on(ne.SignalReconnecting,o).on(ne.Reconnecting,o).on(ne.Reconnected,()=>{s=!0,r(!0)}),(e=t.engine.client.ws)===null||e===void 0||e.close();const c=t.engine.client.onClose;if(c&&c(""),yield a,n){if(!s||t.state!==st.Connected)throw this.appendWarning("reconnection is only possible in Redis-based configurations"),new Error("Not able to reconnect")}else throw new Error("Did not attempt to reconnect")})}}class Zb extends Gi{get description(){return"Can connect via TURN"}perform(){return P(this,void 0,void 0,function*(){var e,t;const n=new kc,s=yield n.join(this.url,this.token,{autoSubscribe:!0,maxRetries:0,e2eeEnabled:!1,websocketTimeout:15e3});let r=!1,a=!1,o=!1;for(let c of s.iceServers)for(let l of c.urls)l.startsWith("turn:")?(a=!0,o=!0):l.startsWith("turns:")&&(a=!0,o=!0,r=!0),l.startsWith("stun:")&&(o=!0);o?a&&!r&&this.appendWarning("TURN is configured server side, but TURN/TLS is unavailable."):this.appendWarning("No STUN servers configured on server side."),yield n.close(),!((t=(e=this.connectOptions)===null||e===void 0?void 0:e.rtcConfig)===null||t===void 0)&&t.iceServers||a?yield this.room.connect(this.url,this.token,{rtcConfig:{iceTransportPolicy:"relay"}}):(this.appendWarning("No TURN servers configured."),this.skip(),yield new Promise(c=>setTimeout(c,0)))})}}class Qb extends Gi{get description(){return"Establishing WebRTC connection"}perform(){return P(this,void 0,void 0,function*(){let e=!1,t=!1;this.room.on(ne.SignalConnected,()=>{const n=this.room.engine.client.onTrickle;this.room.engine.client.onTrickle=(s,r)=>{if(s.candidate){const a=new RTCIceCandidate(s);let o="".concat(a.protocol," ").concat(a.address,":").concat(a.port," ").concat(a.type);a.address&&(e_(a.address)?o+=" (private)":a.protocol==="tcp"&&a.tcpType==="passive"?(e=!0,o+=" (passive)"):a.protocol==="udp"&&(t=!0)),this.appendMessage(o)}n&&n(s,r)},this.room.engine.pcManager&&(this.room.engine.pcManager.subscriber.onIceCandidateError=s=>{s instanceof RTCPeerConnectionIceErrorEvent&&this.appendWarning("error with ICE candidate: ".concat(s.errorCode," ").concat(s.errorText," ").concat(s.url))})});try{yield this.connect(),Ke.info("now the room is connected")}catch(n){throw this.appendWarning("ports need to be open on firewall in order to connect."),n}e||this.appendWarning("Server is not configured for ICE/TCP"),t||this.appendWarning("No public IPv4 UDP candidates were found. Your server is likely not configured correctly")})}}function e_(i){const e=i.split(".");if(e.length===4){if(e[0]==="10")return!0;if(e[0]==="192"&&e[1]==="168")return!0;if(e[0]==="172"){const t=parseInt(e[1],10);if(t>=16&&t<=31)return!0}}return!1}class t_ extends Gi{get description(){return"Connecting to signal connection via WebSocket"}perform(){return P(this,void 0,void 0,function*(){var e,t,n;(this.url.startsWith("ws:")||this.url.startsWith("http:"))&&this.appendWarning("Server is insecure, clients may block connections to it");let s=new kc;const r=yield s.join(this.url,this.token,{autoSubscribe:!0,maxRetries:0,e2eeEnabled:!1,websocketTimeout:15e3});this.appendMessage("Connected to server, version ".concat(r.serverVersion,".")),((e=r.serverInfo)===null||e===void 0?void 0:e.edition)===Xu.Cloud&&(!((t=r.serverInfo)===null||t===void 0)&&t.region)&&this.appendMessage("LiveKit Cloud: ".concat((n=r.serverInfo)===null||n===void 0?void 0:n.region)),yield s.close()})}}class lE extends Hn.EventEmitter{constructor(e,t){let n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};super(),this.options={},this.checkResults=new Map,this.url=e,this.token=t,this.options=n}getNextCheckId(){const e=this.checkResults.size;return this.checkResults.set(e,{logs:[],status:Dn.IDLE,name:"",description:""}),e}updateCheck(e,t){this.checkResults.set(e,t),this.emit("checkUpdate",e,t)}isSuccess(){return Array.from(this.checkResults.values()).every(e=>e.status!==Dn.FAILED)}getResults(){return Array.from(this.checkResults.values())}createAndRunCheck(e){return P(this,void 0,void 0,function*(){const t=this.getNextCheckId(),n=new e(this.url,this.token,this.options),s=a=>{this.updateCheck(t,a)};n.on("update",s);const r=yield n.run();return n.off("update",s),r})}checkWebsocket(){return P(this,void 0,void 0,function*(){return this.createAndRunCheck(t_)})}checkWebRTC(){return P(this,void 0,void 0,function*(){return this.createAndRunCheck(Qb)})}checkTURN(){return P(this,void 0,void 0,function*(){return this.createAndRunCheck(Zb)})}checkReconnect(){return P(this,void 0,void 0,function*(){return this.createAndRunCheck(Jb)})}checkPublishAudio(){return P(this,void 0,void 0,function*(){return this.createAndRunCheck(Kb)})}checkPublishVideo(){return P(this,void 0,void 0,function*(){return this.createAndRunCheck(Yb)})}checkConnectionProtocol(){return P(this,void 0,void 0,function*(){const e=yield this.createAndRunCheck(Xb);if(e.data&&"protocol"in e.data){const t=e.data;this.options.protocol=t.protocol}return e})}checkCloudRegion(){return P(this,void 0,void 0,function*(){return this.createAndRunCheck($b)})}}class Jc extends EventTarget{constructor(){super(),this.room=null,this.callStatus="idle",this.isReady=!1,this.error=null,this.microphoneEnabled=!1,this.connectedParticipants=[],this.userIdentity="",this.roomName="",this.audioPlaybackPrompt=!1,this.audioElements=new Map,this.audioContainer=null,this.wasConnectedBeforeHidden=!1,this.isPageVisible=!0,this.reconnectAttempts=0,this.maxReconnectAttempts=3,this.isReconnecting=!1,this.isDestroyed=!1,this.pendingTimers=new Set,this.isAppleDevice=/iPhone|iPad|iPod|Macintosh|Mac OS/i.test(navigator.userAgent),this.boundHandleVisibilityChange=this.handleVisibilityChange.bind(this),this.boundHandlePageHide=this.handlePageHide.bind(this),this.boundHandlePageShow=this.handlePageShow.bind(this),this.boundHandleOnline=this.handleOnline.bind(this),this.boundHandleOffline=this.handleOffline.bind(this),this.createAudioContainer(),this.setupLifecycleListeners()}createAudioContainer(){this.audioContainer=document.createElement("div"),this.audioContainer.id=`livekit-audio-${Date.now()}-${Math.random().toString(36).slice(2,9)}`,this.audioContainer.style.cssText="position:absolute;width:0;height:0;overflow:hidden;pointer-events:none;",document.body.appendChild(this.audioContainer)}scheduleTimer(e,t){const n=setTimeout(()=>{this.pendingTimers.delete(n),this.isDestroyed||e()},t);return this.pendingTimers.add(n),n}clearAllTimers(){this.pendingTimers.forEach(e=>clearTimeout(e)),this.pendingTimers.clear()}setupLifecycleListeners(){document.addEventListener("visibilitychange",this.boundHandleVisibilityChange),window.addEventListener("pagehide",this.boundHandlePageHide),window.addEventListener("pageshow",this.boundHandlePageShow),window.addEventListener("online",this.boundHandleOnline),window.addEventListener("offline",this.boundHandleOffline)}removeLifecycleListeners(){document.removeEventListener("visibilitychange",this.boundHandleVisibilityChange),window.removeEventListener("pagehide",this.boundHandlePageHide),window.removeEventListener("pageshow",this.boundHandlePageShow),window.removeEventListener("online",this.boundHandleOnline),window.removeEventListener("offline",this.boundHandleOffline)}handleVisibilityChange(){var t;const e=this.isPageVisible;this.isPageVisible=document.visibilityState==="visible",!this.isPageVisible&&e?(console.log("[LiveKit] Page hidden, pausing media"),this.wasConnectedBeforeHidden=((t=this.room)==null?void 0:t.state)==="connected",this.pauseAllAudio()):this.isPageVisible&&!e&&(console.log("[LiveKit] Page visible, resuming"),this.resumeAfterVisibilityChange())}handlePageHide(e){e.persisted||this.cleanupBeforeUnload()}handlePageShow(e){e.persisted&&(console.log("[LiveKit] Page restored from cache"),this.resumeAfterVisibilityChange())}handleOnline(){var e;console.log("[LiveKit] Network online"),this.wasConnectedBeforeHidden&&((e=this.room)==null?void 0:e.state)!=="connected"&&this.attemptReconnect()}handleOffline(){console.log("[LiveKit] Network offline")}pauseAllAudio(){this.audioElements.forEach(e=>{try{e.pause()}catch(t){console.warn("[LiveKit] Failed to pause audio:",t)}})}async resumeAllAudio(){for(const[,e]of this.audioElements)try{await e.play()}catch(t){console.warn("[LiveKit] Failed to resume audio (may need user interaction):",t),this.audioPlaybackPrompt=!0,this.dispatchEvent(new CustomEvent("audio-playback-status-changed",{detail:{canPlayback:!1}}))}}async resumeAfterVisibilityChange(){this.room&&(this.room.state==="connected"?await this.resumeAllAudio():this.wasConnectedBeforeHidden&&(console.log("[LiveKit] Connection lost while hidden, attempting reconnect"),this.attemptReconnect()))}async attemptReconnect(){var e;if(this.isReconnecting){console.log("[LiveKit] Reconnect already in progress, skipping");return}if(this.reconnectAttempts>=this.maxReconnectAttempts){console.error("[LiveKit] Max reconnect attempts reached"),this.cleanupRoom(),this.dispatchEvent(new CustomEvent("error",{detail:{error:"Connection lost. Please restart the call."}}));return}this.isReconnecting=!0,this.reconnectAttempts++,console.log(`[LiveKit] Reconnect attempt ${this.reconnectAttempts}/${this.maxReconnectAttempts}`);try{((e=this.room)==null?void 0:e.state)==="disconnected"&&(this.cleanupRoom(),this.dispatchEvent(new CustomEvent("error",{detail:{error:"Connection lost. Please restart the call."}})))}finally{this.isReconnecting=!1}}cleanupRoom(){if(this.room){try{this.room.disconnect()}catch(e){console.warn("[LiveKit] Error disconnecting room during cleanup:",e)}this.room=null}this.cleanupAudioElements()}cleanupBeforeUnload(){this.room&&(this.room.disconnect(),this.room=null),this.cleanupAudioElements()}cleanupAudioElements(){this.audioElements.forEach((e,t)=>{try{e.pause(),e.srcObject=null,e.remove()}catch(n){console.warn("[LiveKit] Failed to cleanup audio element:",n)}this.audioElements.delete(t)})}removeAudioContainer(){if(this.audioContainer){try{this.audioContainer.remove()}catch(e){console.warn("[LiveKit] Failed to remove audio container:",e)}this.audioContainer=null}}destroy(){if(this.isDestroyed=!0,this.clearAllTimers(),this.removeLifecycleListeners(),this.cleanupAudioElements(),this.removeAudioContainer(),this.room){try{this.room.disconnect()}catch(e){console.warn("[LiveKit] Error disconnecting room during destroy:",e)}this.room=null}}async playAudioElement(e){try{if(!e.paused)return!0;const t=e.play();return t!==void 0&&await t,!0}catch(t){return t instanceof Error&&t.name==="NotAllowedError"?(console.log("[LiveKit] Autoplay blocked, user interaction required"),!1):t instanceof Error&&t.name==="AbortError"?(console.log("[LiveKit] Play interrupted"),!1):(console.warn("[LiveKit] Failed to play audio:",t),!1)}}async fetchWithTimeout(e,t,n=15e3){const s=new AbortController,r=setTimeout(()=>s.abort(),n);try{return await fetch(e,{...t,signal:s.signal})}finally{clearTimeout(r)}}async connectWithTimeout(e,t,n,s=2e4){return new Promise((r,a)=>{const o=setTimeout(()=>{a(new Error("Connection timeout"))},s);e.connect(t,n).then(()=>{clearTimeout(o),r()}).catch(c=>{clearTimeout(o),a(c)})})}set serviceUrl(e){this._serviceUrl=e}get serviceUrl(){return this._serviceUrl??"https://voice.hanc.ai"}get status(){return this.callStatus}get ready(){return this.isReady}get currentError(){return this.error}get currentRoom(){return this.room}get isMicrophoneEnabled(){return this.microphoneEnabled}get participants(){return this.connectedParticipants}get identity(){return this.userIdentity}get roomNameValue(){return this.roomName}get showAudioPrompt(){return this.audioPlaybackPrompt}updateStatus(e){this.callStatus!==e&&(this.callStatus=e,this.dispatchEvent(new CustomEvent("status-changed",{detail:e})))}async makeCall({agentId:e}){if(this.room&&this.room.state==="connected")return;let t=null;try{t=await navigator.mediaDevices.getUserMedia({audio:!0,video:!1}),console.log("Microphone permission granted")}catch(n){console.warn("Microphone permission denied or not available:",n)}this.updateStatus("connecting"),this.error=null,this.isReady=!1,this.room&&(await this.room.disconnect(),this.room=null);try{const n=new Bs;this.room=n,this.setupRoomEventListeners(n);let s;try{s=await this.fetchWithTimeout(`${this.serviceUrl}/create-room-token`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({metadata:{agent_id:e,timestamp:Date.now()}})},15e3)}catch(l){throw l instanceof Error&&l.name==="AbortError"?new Error("Request timeout - please check your connection"):l}if(!s.ok){const l=await s.text();throw new Error(`Failed to get room token: ${s.status} ${l}`)}const{token:r,url:a,room_name:o,user_identity:c}=await s.json();this.roomName=o,this.userIdentity=c,this.reconnectAttempts=0,this.wasConnectedBeforeHidden=!1,await this.connectWithTimeout(n,a,r,2e4),this.updateStatus("connected"),this.isReady=!0,requestAnimationFrame(()=>{this.scheduleTimer(async()=>{if(this.isDestroyed||!this.room||this.room.state!=="connected"){t&&t.getTracks().forEach(l=>l.stop());return}if(t)try{await n.localParticipant.setMicrophoneEnabled(!0,{echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0}),this.microphoneEnabled=!0,this.dispatchEvent(new CustomEvent("microphone-enabled")),t.getTracks().forEach(l=>l.stop()),this.scheduleTimer(()=>{if(!(this.isDestroyed||!this.room||this.room.state!=="connected"))try{const l=Array.from(n.localParticipant.audioTrackPublications.values()).find(d=>d.kind==="audio");if(l!=null&&l.track){const d=l.track.mediaStreamTrack;d&&this.dispatchEvent(new CustomEvent("local-audio-track",{detail:d}))}}catch(l){console.warn("[LiveKit] Error getting local audio track:",l)}},100)}catch(l){console.warn("Could not enable microphone on connect:",l),this.microphoneEnabled=!1,this.dispatchEvent(new CustomEvent("microphone-disabled"))}else this.microphoneEnabled=!1,this.dispatchEvent(new CustomEvent("microphone-disabled"))},50)}),this.dispatchEvent(new CustomEvent("room-connected",{detail:{roomName:o,identity:c}}))}catch(n){t&&t.getTracks().forEach(s=>s.stop()),this.error=`Connection failed: ${n instanceof Error?n.message:String(n)}`,this.updateStatus("error"),this.isReady=!1,this.room=null,this.dispatchEvent(new CustomEvent("error",{detail:{error:this.error}}))}}setupRoomEventListeners(e){e.on(ne.Connected,()=>{this.updateStatus("connected"),this.isReady=!0,this.reconnectAttempts=0}),e.on(ne.Disconnected,()=>{this.updateStatus("disconnected"),this.connectedParticipants=[],this.microphoneEnabled=!1,this.audioPlaybackPrompt=!1,this.room=null,this.isReady=!1,this.cleanupAudioElements(),this.dispatchEvent(new CustomEvent("disconnected"))}),e.on(ne.Reconnecting,()=>{console.log("[LiveKit] Reconnecting..."),this.dispatchEvent(new CustomEvent("status-changed",{detail:"connecting"}))}),e.on(ne.Reconnected,()=>{console.log("[LiveKit] Reconnected successfully"),this.reconnectAttempts=0,this.isReconnecting=!1,this.resumeAllAudio().catch(t=>{console.warn("[LiveKit] Failed to resume audio after reconnect:",t)}),this.dispatchEvent(new CustomEvent("status-changed",{detail:"connected"}))}),e.on(ne.SignalReconnecting,()=>{console.log("[LiveKit] Signal reconnecting...")}),e.on(ne.ParticipantConnected,t=>{this.connectedParticipants=[...this.connectedParticipants,t.identity];const n=t.identity.includes("agent")||t.identity.includes("voice-assistant")||t.identity.includes("AJ_");n&&(this.updateStatus("agent-connected"),this.audioPlaybackPrompt=!0,this.dispatchEvent(new CustomEvent("agent-connected",{detail:{participant:t.identity}}))),this.dispatchEvent(new CustomEvent("participant-connected",{detail:{participant:t.identity,isAgent:n}}))}),e.on(ne.ParticipantDisconnected,t=>{this.connectedParticipants=this.connectedParticipants.filter(s=>s!==t.identity);const n=t.identity.includes("agent")||t.identity.includes("voice-assistant")||t.identity.includes("AJ_");n&&(this.audioPlaybackPrompt=!1,this.updateStatus("connected"),this.dispatchEvent(new CustomEvent("agent-disconnected",{detail:{participant:t.identity}}))),this.dispatchEvent(new CustomEvent("participant-disconnected",{detail:{participant:t.identity,isAgent:n}}))}),e.on(ne.TrackSubscribed,(t,n,s)=>{if(t.kind==="audio"){const r=this.audioElements.get(s.identity);if(r){try{r.pause(),r.srcObject=null,r.remove()}catch(c){console.warn("[LiveKit] Failed to remove existing audio element:",c)}this.audioElements.delete(s.identity)}const a=t.attach();a.setAttribute("playsinline","true"),a.setAttribute("webkit-playsinline","true"),a.dataset.participantId=s.identity,this.isAppleDevice&&(a.volume=.8),this.audioContainer?this.audioContainer.appendChild(a):(console.warn("[LiveKit] Audio container not found, appending to body"),document.body.appendChild(a)),this.audioElements.set(s.identity,a),this.playAudioElement(a).then(c=>{c||(this.audioPlaybackPrompt=!0,this.dispatchEvent(new CustomEvent("audio-playback-status-changed",{detail:{canPlayback:!1}})))}),this.dispatchEvent(new CustomEvent("audio-track-added",{detail:{participant:s.identity,element:a}}));const o=t.mediaStreamTrack;o&&this.dispatchEvent(new CustomEvent("audio-track",{detail:o}))}}),e.on(ne.TrackUnsubscribed,(t,n,s)=>{const r=this.audioElements.get(s.identity);r&&(r.pause(),r.srcObject=null,r.remove(),this.audioElements.delete(s.identity)),t.detach(),this.dispatchEvent(new CustomEvent("audio-track-removed",{detail:{participant:s.identity}}))}),e.on(ne.MediaDevicesError,t=>{this.error=`Media device error: ${t.message}`,this.updateStatus("error"),this.dispatchEvent(new CustomEvent("error",{detail:{error:this.error}}))}),e.on(ne.AudioPlaybackStatusChanged,async()=>{e.canPlaybackAudio||this.connectedParticipants.some(n=>n.includes("agent")||n.includes("voice-assistant")||n.includes("AJ_"))&&!this.audioPlaybackPrompt&&(this.updateStatus("agent-connected"),this.audioPlaybackPrompt=!0),this.dispatchEvent(new CustomEvent("audio-playback-status-changed",{detail:{canPlayback:e.canPlaybackAudio}}))})}async toggleMicrophone(){if(this.room)try{this.microphoneEnabled?(await this.room.localParticipant.setMicrophoneEnabled(!1),this.microphoneEnabled=!1,this.dispatchEvent(new CustomEvent("microphone-disabled"))):(await this.room.localParticipant.setMicrophoneEnabled(!0,{echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0}),this.microphoneEnabled=!0,this.dispatchEvent(new CustomEvent("microphone-enabled")))}catch(e){this.error=`Failed to toggle microphone: ${e instanceof Error?e.message:String(e)}`,this.dispatchEvent(new CustomEvent("error",{detail:{error:this.error}}))}}async enableAudio(){if(this.room)try{await this.room.startAudio(),this.audioPlaybackPrompt=!1;const e=JSON.stringify({type:"audio_enabled"}),n=new TextEncoder().encode(e);await this.room.localParticipant.publishData(n,{reliable:!0}),this.dispatchEvent(new CustomEvent("audio-enabled"))}catch(e){this.error=`Failed to enable audio: ${e instanceof Error?e.message:String(e)}`,this.dispatchEvent(new CustomEvent("error",{detail:{error:this.error}}))}}async hangUp(){if(!this.room){this.error="No active connection to end.";return}this.updateStatus("disconnecting");const e=this.room;this.room=null,this.connectedParticipants=[],this.microphoneEnabled=!1,this.audioPlaybackPrompt=!1,this.isReady=!1,this.wasConnectedBeforeHidden=!1,this.reconnectAttempts=0,this.isReconnecting=!1,this.cleanupAudioElements(),this.updateStatus("disconnected"),this.dispatchEvent(new CustomEvent("call-ended")),this.scheduleTimer(async()=>{try{await e.disconnect()}catch(t){console.warn("Error during room disconnect:",t)}},0)}}class n_ extends EventTarget{constructor(){super(...arguments),this._status="unknown",this.intervalId=null,this._serviceUrl="",this.INTERVAL_MS=3e4,this.TIMEOUT_MS=5e3,this.refCount=0}get isHealthy(){return this._status!=="unhealthy"}get status(){return this._status}set serviceUrl(e){this._serviceUrl!==e&&(this._serviceUrl=e,this.intervalId!==null&&this.check())}get serviceUrl(){return this._serviceUrl}start(){this.refCount++,this.intervalId===null&&(this.check(),this.intervalId=setInterval(()=>this.check(),this.INTERVAL_MS))}stop(){this.refCount=Math.max(0,this.refCount-1),!(this.refCount>0)&&(this.intervalId!==null&&(clearInterval(this.intervalId),this.intervalId=null),this._status="unknown")}async check(){if(!this._serviceUrl){this.updateStatus("unknown");return}try{const e=new AbortController,t=setTimeout(()=>e.abort(),this.TIMEOUT_MS),n=await fetch(`${this._serviceUrl}/health`,{method:"GET",signal:e.signal});clearTimeout(t),this.updateStatus(n.ok?"healthy":"unhealthy")}catch{this.updateStatus("unhealthy")}}updateStatus(e){this._status!==e&&(this._status=e,this.dispatchEvent(new CustomEvent("health-changed",{detail:e})))}}const Hi=new n_;class Zc{get isHealthy(){return Hi.isHealthy}get status(){return Hi.status}set serviceUrl(e){Hi.serviceUrl=e}get serviceUrl(){return Hi.serviceUrl}start(){Hi.start()}stop(){Hi.stop()}addEventListener(e,t){e==="health-changed"&&Hi.addEventListener(e,t)}removeEventListener(e,t){e==="health-changed"&&Hi.removeEventListener(e,t)}}/**
84
+ `},Nc}var Af;function eb(){if(Af)return kn;Af=1;var i=Z0(),e=Q0(),t=Lc();return kn.grammar=t,kn.write=e,kn.parse=i.parse,kn.parseParams=i.parseParams,kn.parseFmtpConfig=i.parseFmtpConfig,kn.parsePayloads=i.parsePayloads,kn.parseRemoteCandidates=i.parseRemoteCandidates,kn.parseImageAttributes=i.parseImageAttributes,kn.parseSimulcastStreamList=i.parseSimulcastStreamList,kn}var Vi=eb();function Uc(i,e,t){var n,s,r;e===void 0&&(e=50),t===void 0&&(t={});var a=(n=t.isImmediate)!=null&&n,o=(s=t.callback)!=null&&s,c=t.maxWait,l=Date.now(),d=[];function u(){if(c!==void 0){var f=Date.now()-l;if(f+e>=c)return c-f}return e}var h=function(){var f=[].slice.call(arguments),g=this;return new Promise(function(v,m){var p=a&&r===void 0;if(r!==void 0&&clearTimeout(r),r=setTimeout(function(){if(r=void 0,l=Date.now(),!a){var C=i.apply(g,f);o&&o(C),d.forEach(function(b){return(0,b.resolve)(C)}),d=[]}},u()),p){var x=i.apply(g,f);return o&&o(x),v(x)}d.push({resolve:v,reject:m})})};return h.cancel=function(f){r!==void 0&&clearTimeout(r),d.forEach(function(g){return(0,g.reject)(f)}),d=[]},h}const tb=.7,nb=20,Os={NegotiationStarted:"negotiationStarted",NegotiationComplete:"negotiationComplete",RTPVideoPayloadTypes:"rtpVideoPayloadTypes"};class Rf extends Hn.EventEmitter{get pc(){return this._pc||(this._pc=this.createPC()),this._pc}constructor(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};var n;super(),this.log=Ke,this.ddExtID=0,this.latestOfferId=0,this.pendingCandidates=[],this.restartingIce=!1,this.renegotiate=!1,this.trackBitrates=[],this.remoteStereoMids=[],this.remoteNackMids=[],this.negotiate=Uc(s=>P(this,void 0,void 0,function*(){this.emit(Os.NegotiationStarted);try{yield this.createAndSendOffer()}catch(r){if(s)s(r);else throw r}}),nb),this.close=()=>{this._pc&&(this._pc.close(),this._pc.onconnectionstatechange=null,this._pc.oniceconnectionstatechange=null,this._pc.onicegatheringstatechange=null,this._pc.ondatachannel=null,this._pc.onnegotiationneeded=null,this._pc.onsignalingstatechange=null,this._pc.onicecandidate=null,this._pc.ondatachannel=null,this._pc.ontrack=null,this._pc.onconnectionstatechange=null,this._pc.oniceconnectionstatechange=null,this._pc=null)},this.log=li((n=t.loggerName)!==null&&n!==void 0?n:Rn.PCTransport),this.loggerOptions=t,this.config=e,this._pc=this.createPC(),this.offerLock=new sn}createPC(){const e=new RTCPeerConnection(this.config);return e.onicecandidate=t=>{var n;t.candidate&&((n=this.onIceCandidate)===null||n===void 0||n.call(this,t.candidate))},e.onicecandidateerror=t=>{var n;(n=this.onIceCandidateError)===null||n===void 0||n.call(this,t)},e.oniceconnectionstatechange=()=>{var t;(t=this.onIceConnectionStateChange)===null||t===void 0||t.call(this,e.iceConnectionState)},e.onsignalingstatechange=()=>{var t;(t=this.onSignalingStatechange)===null||t===void 0||t.call(this,e.signalingState)},e.onconnectionstatechange=()=>{var t;(t=this.onConnectionStateChange)===null||t===void 0||t.call(this,e.connectionState)},e.ondatachannel=t=>{var n;(n=this.onDataChannel)===null||n===void 0||n.call(this,t)},e.ontrack=t=>{var n;(n=this.onTrack)===null||n===void 0||n.call(this,t)},e}get logContext(){var e,t;return Object.assign({},(t=(e=this.loggerOptions).loggerContextCb)===null||t===void 0?void 0:t.call(e))}get isICEConnected(){return this._pc!==null&&(this.pc.iceConnectionState==="connected"||this.pc.iceConnectionState==="completed")}addIceCandidate(e){return P(this,void 0,void 0,function*(){if(this.pc.remoteDescription&&!this.restartingIce)return this.pc.addIceCandidate(e);this.pendingCandidates.push(e)})}setRemoteDescription(e,t){return P(this,void 0,void 0,function*(){var n;if(e.type==="answer"&&this.latestOfferId>0&&t>0&&t!==this.latestOfferId)return this.log.warn("ignoring answer for old offer",Object.assign(Object.assign({},this.logContext),{offerId:t,latestOfferId:this.latestOfferId})),!1;let s;if(e.type==="offer"){let{stereoMids:r,nackMids:a}=ib(e);this.remoteStereoMids=r,this.remoteNackMids=a}else if(e.type==="answer"){const r=Vi.parse((n=e.sdp)!==null&&n!==void 0?n:"");r.media.forEach(a=>{a.type==="audio"&&this.trackBitrates.some(o=>{if(!o.transceiver||a.mid!=o.transceiver.mid)return!1;let c=0;if(a.rtp.some(d=>d.codec.toUpperCase()===o.codec.toUpperCase()?(c=d.payload,!0):!1),c===0)return!0;let l=!1;for(const d of a.fmtp)if(d.payload===c){d.config=d.config.split(";").filter(u=>!u.includes("maxaveragebitrate")).join(";"),o.maxbr>0&&(d.config+=";maxaveragebitrate=".concat(o.maxbr*1e3)),l=!0;break}return l||o.maxbr>0&&a.fmtp.push({payload:c,config:"maxaveragebitrate=".concat(o.maxbr*1e3)}),!0})}),s=Vi.write(r)}return yield this.setMungedSDP(e,s,!0),this.pendingCandidates.forEach(r=>{this.pc.addIceCandidate(r)}),this.pendingCandidates=[],this.restartingIce=!1,this.renegotiate?(this.renegotiate=!1,yield this.createAndSendOffer()):e.type==="answer"&&(this.emit(Os.NegotiationComplete),e.sdp&&Vi.parse(e.sdp).media.forEach(a=>{a.type==="video"&&this.emit(Os.RTPVideoPayloadTypes,a.rtp)})),!0})}createAndSendOffer(e){return P(this,void 0,void 0,function*(){var t;const n=yield this.offerLock.lock();try{if(this.onOffer===void 0)return;if(e!=null&&e.iceRestart&&(this.log.debug("restarting ICE",this.logContext),this.restartingIce=!0),this._pc&&this._pc.signalingState==="have-local-offer"){const o=this._pc.remoteDescription;if(e!=null&&e.iceRestart&&o)yield this._pc.setRemoteDescription(o);else{this.renegotiate=!0;return}}else if(!this._pc||this._pc.signalingState==="closed"){this.log.warn("could not createOffer with closed peer connection",this.logContext);return}this.log.debug("starting to negotiate",this.logContext);const s=this.latestOfferId+1;this.latestOfferId=s;const r=yield this.pc.createOffer(e);this.log.debug("original offer",Object.assign({sdp:r.sdp},this.logContext));const a=Vi.parse((t=r.sdp)!==null&&t!==void 0?t:"");if(a.media.forEach(o=>{kf(o),o.type==="audio"?Pf(o,[],[]):o.type==="video"&&this.trackBitrates.some(c=>{if(!o.msid||!c.cid||!o.msid.includes(c.cid))return!1;let l=0;if(o.rtp.some(u=>u.codec.toUpperCase()===c.codec.toUpperCase()?(l=u.payload,!0):!1),l===0||(Wn(c.codec)&&!os()&&this.ensureVideoDDExtensionForSVC(o,a),c.codec!=="av1"))return!0;const d=Math.round(c.maxbr*tb);for(const u of o.fmtp)if(u.payload===l){u.config.includes("x-google-start-bitrate")||(u.config+=";x-google-start-bitrate=".concat(d));break}return!0})}),this.latestOfferId>s){this.log.warn("latestOfferId mismatch",Object.assign(Object.assign({},this.logContext),{latestOfferId:this.latestOfferId,offerId:s}));return}yield this.setMungedSDP(r,Vi.write(a)),this.onOffer(r,this.latestOfferId)}finally{n()}})}createAndSetAnswer(){return P(this,void 0,void 0,function*(){var e;const t=yield this.pc.createAnswer(),n=Vi.parse((e=t.sdp)!==null&&e!==void 0?e:"");return n.media.forEach(s=>{kf(s),s.type==="audio"&&Pf(s,this.remoteStereoMids,this.remoteNackMids)}),yield this.setMungedSDP(t,Vi.write(n)),t})}createDataChannel(e,t){return this.pc.createDataChannel(e,t)}addTransceiver(e,t){return this.pc.addTransceiver(e,t)}addTrack(e){if(!this._pc)throw new Bt("PC closed, cannot add track");return this._pc.addTrack(e)}setTrackCodecBitrate(e){this.trackBitrates.push(e)}setConfiguration(e){var t;if(!this._pc)throw new Bt("PC closed, cannot configure");return(t=this._pc)===null||t===void 0?void 0:t.setConfiguration(e)}canRemoveTrack(){var e;return!!(!((e=this._pc)===null||e===void 0)&&e.removeTrack)}removeTrack(e){var t;return(t=this._pc)===null||t===void 0?void 0:t.removeTrack(e)}getConnectionState(){var e,t;return(t=(e=this._pc)===null||e===void 0?void 0:e.connectionState)!==null&&t!==void 0?t:"closed"}getICEConnectionState(){var e,t;return(t=(e=this._pc)===null||e===void 0?void 0:e.iceConnectionState)!==null&&t!==void 0?t:"closed"}getSignallingState(){var e,t;return(t=(e=this._pc)===null||e===void 0?void 0:e.signalingState)!==null&&t!==void 0?t:"closed"}getTransceivers(){var e,t;return(t=(e=this._pc)===null||e===void 0?void 0:e.getTransceivers())!==null&&t!==void 0?t:[]}getSenders(){var e,t;return(t=(e=this._pc)===null||e===void 0?void 0:e.getSenders())!==null&&t!==void 0?t:[]}getLocalDescription(){var e;return(e=this._pc)===null||e===void 0?void 0:e.localDescription}getRemoteDescription(){var e;return(e=this.pc)===null||e===void 0?void 0:e.remoteDescription}getStats(){return this.pc.getStats()}getConnectedAddress(){return P(this,void 0,void 0,function*(){var e;if(!this._pc)return;let t="";const n=new Map,s=new Map;if((yield this._pc.getStats()).forEach(o=>{switch(o.type){case"transport":t=o.selectedCandidatePairId;break;case"candidate-pair":t===""&&o.selected&&(t=o.id),n.set(o.id,o);break;case"remote-candidate":s.set(o.id,"".concat(o.address,":").concat(o.port));break}}),t==="")return;const a=(e=n.get(t))===null||e===void 0?void 0:e.remoteCandidateId;if(a!==void 0)return s.get(a)})}setMungedSDP(e,t,n){return P(this,void 0,void 0,function*(){if(t){const s=e.sdp;e.sdp=t;try{this.log.debug("setting munged ".concat(n?"remote":"local"," description"),this.logContext),n?yield this.pc.setRemoteDescription(e):yield this.pc.setLocalDescription(e);return}catch(r){this.log.warn("not able to set ".concat(e.type,", falling back to unmodified sdp"),Object.assign(Object.assign({},this.logContext),{error:r,sdp:t})),e.sdp=s}}try{n?yield this.pc.setRemoteDescription(e):yield this.pc.setLocalDescription(e)}catch(s){let r="unknown error";s instanceof Error?r=s.message:typeof s=="string"&&(r=s);const a={error:r,sdp:e.sdp};throw!n&&this.pc.remoteDescription&&(a.remoteSdp=this.pc.remoteDescription),this.log.error("unable to set ".concat(e.type),Object.assign(Object.assign({},this.logContext),{fields:a})),new uc(r)}})}ensureVideoDDExtensionForSVC(e,t){var n,s;if(!((n=e.ext)===null||n===void 0?void 0:n.some(a=>a.uri===cf))){if(this.ddExtID===0){let a=0;t.media.forEach(o=>{var c;o.type==="video"&&((c=o.ext)===null||c===void 0||c.forEach(l=>{l.value>a&&(a=l.value)}))}),this.ddExtID=a+1}(s=e.ext)===null||s===void 0||s.push({value:this.ddExtID,uri:cf})}}}function Pf(i,e,t){let n=0;i.rtp.some(s=>s.codec==="opus"?(n=s.payload,!0):!1),n>0&&(i.rtcpFb||(i.rtcpFb=[]),t.includes(i.mid)&&!i.rtcpFb.some(s=>s.payload===n&&s.type==="nack")&&i.rtcpFb.push({payload:n,type:"nack"}),e.includes(i.mid)&&i.fmtp.some(s=>s.payload===n?(s.config.includes("stereo=1")||(s.config+=";stereo=1"),!0):!1))}function ib(i){var e;const t=[],n=[],s=Vi.parse((e=i.sdp)!==null&&e!==void 0?e:"");let r=0;return s.media.forEach(a=>{var o;a.type==="audio"&&(a.rtp.some(c=>c.codec==="opus"?(r=c.payload,!0):!1),!((o=a.rtcpFb)===null||o===void 0)&&o.some(c=>c.payload===r&&c.type==="nack")&&n.push(a.mid),a.fmtp.some(c=>c.payload===r?(c.config.includes("sprop-stereo=1")&&t.push(a.mid),!0):!1))}),{stereoMids:t,nackMids:n}}function kf(i){if(i.connection){const e=i.connection.ip.indexOf(":")>=0;(i.connection.version===4&&e||i.connection.version===6&&!e)&&(i.connection.ip="0.0.0.0",i.connection.version=4)}}const Oc="vp8",sb={audioPreset:pc.music,dtx:!0,red:!0,forceStereo:!1,simulcast:!0,screenShareEncoding:gc.h1080fps15.encoding,stopMicTrackOnMute:!1,videoCodec:Oc,backupCodec:!0,preConnectBuffer:!1},If={deviceId:{ideal:"default"},autoGainControl:!0,echoCancellation:!0,noiseSuppression:!0,voiceIsolation:!0},Df={deviceId:{ideal:"default"},resolution:kr.h720.resolution},rb={adaptiveStream:!1,dynacast:!1,stopLocalTrackOnUnpublish:!0,reconnectPolicy:new jv,disconnectOnPageLeave:!0,webAudioMix:!1},Fc={autoSubscribe:!0,maxRetries:1,peerConnectionTimeout:15e3,websocketTimeout:15e3};var wt;(function(i){i[i.NEW=0]="NEW",i[i.CONNECTING=1]="CONNECTING",i[i.CONNECTED=2]="CONNECTED",i[i.FAILED=3]="FAILED",i[i.CLOSING=4]="CLOSING",i[i.CLOSED=5]="CLOSED"})(wt||(wt={}));class ab{get needsPublisher(){return this.isPublisherConnectionRequired}get needsSubscriber(){return this.isSubscriberConnectionRequired}get currentState(){return this.state}constructor(e,t,n){var s;this.peerConnectionTimeout=Fc.peerConnectionTimeout,this.log=Ke,this.updateState=()=>{var r;const a=this.state,o=this.requiredTransports.map(c=>c.getConnectionState());o.every(c=>c==="connected")?this.state=wt.CONNECTED:o.some(c=>c==="failed")?this.state=wt.FAILED:o.some(c=>c==="connecting")?this.state=wt.CONNECTING:o.every(c=>c==="closed")?this.state=wt.CLOSED:o.some(c=>c==="closed")?this.state=wt.CLOSING:o.every(c=>c==="new")&&(this.state=wt.NEW),a!==this.state&&(this.log.debug("pc state change: from ".concat(wt[a]," to ").concat(wt[this.state]),this.logContext),(r=this.onStateChange)===null||r===void 0||r.call(this,this.state,this.publisher.getConnectionState(),this.subscriber.getConnectionState()))},this.log=li((s=n.loggerName)!==null&&s!==void 0?s:Rn.PCManager),this.loggerOptions=n,this.isPublisherConnectionRequired=!t,this.isSubscriberConnectionRequired=t,this.publisher=new Rf(e,n),this.subscriber=new Rf(e,n),this.publisher.onConnectionStateChange=this.updateState,this.subscriber.onConnectionStateChange=this.updateState,this.publisher.onIceConnectionStateChange=this.updateState,this.subscriber.onIceConnectionStateChange=this.updateState,this.publisher.onSignalingStatechange=this.updateState,this.subscriber.onSignalingStatechange=this.updateState,this.publisher.onIceCandidate=r=>{var a;(a=this.onIceCandidate)===null||a===void 0||a.call(this,r,An.PUBLISHER)},this.subscriber.onIceCandidate=r=>{var a;(a=this.onIceCandidate)===null||a===void 0||a.call(this,r,An.SUBSCRIBER)},this.subscriber.onDataChannel=r=>{var a;(a=this.onDataChannel)===null||a===void 0||a.call(this,r)},this.subscriber.onTrack=r=>{var a;(a=this.onTrack)===null||a===void 0||a.call(this,r)},this.publisher.onOffer=(r,a)=>{var o;(o=this.onPublisherOffer)===null||o===void 0||o.call(this,r,a)},this.state=wt.NEW,this.connectionLock=new sn,this.remoteOfferLock=new sn}get logContext(){var e,t;return Object.assign({},(t=(e=this.loggerOptions).loggerContextCb)===null||t===void 0?void 0:t.call(e))}requirePublisher(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!0;this.isPublisherConnectionRequired=e,this.updateState()}requireSubscriber(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!0;this.isSubscriberConnectionRequired=e,this.updateState()}createAndSendPublisherOffer(e){return this.publisher.createAndSendOffer(e)}setPublisherAnswer(e,t){return this.publisher.setRemoteDescription(e,t)}removeTrack(e){return this.publisher.removeTrack(e)}close(){return P(this,void 0,void 0,function*(){if(this.publisher&&this.publisher.getSignallingState()!=="closed"){const e=this.publisher;for(const t of e.getSenders())try{e.canRemoveTrack()&&e.removeTrack(t)}catch(n){this.log.warn("could not removeTrack",Object.assign(Object.assign({},this.logContext),{error:n}))}}yield Promise.all([this.publisher.close(),this.subscriber.close()]),this.updateState()})}triggerIceRestart(){return P(this,void 0,void 0,function*(){this.subscriber.restartingIce=!0,this.needsPublisher&&(yield this.createAndSendPublisherOffer({iceRestart:!0}))})}addIceCandidate(e,t){return P(this,void 0,void 0,function*(){t===An.PUBLISHER?yield this.publisher.addIceCandidate(e):yield this.subscriber.addIceCandidate(e)})}createSubscriberAnswerFromOffer(e,t){return P(this,void 0,void 0,function*(){this.log.debug("received server offer",Object.assign(Object.assign({},this.logContext),{RTCSdpType:e.type,sdp:e.sdp,signalingState:this.subscriber.getSignallingState().toString()}));const n=yield this.remoteOfferLock.lock();try{return(yield this.subscriber.setRemoteDescription(e,t))?yield this.subscriber.createAndSetAnswer():void 0}finally{n()}})}updateConfiguration(e,t){this.publisher.setConfiguration(e),this.subscriber.setConfiguration(e),t&&this.triggerIceRestart()}ensurePCTransportConnection(e,t){return P(this,void 0,void 0,function*(){var n;const s=yield this.connectionLock.lock();try{this.isPublisherConnectionRequired&&this.publisher.getConnectionState()!=="connected"&&this.publisher.getConnectionState()!=="connecting"&&(this.log.debug("negotiation required, start negotiating",this.logContext),this.publisher.negotiate()),yield Promise.all((n=this.requiredTransports)===null||n===void 0?void 0:n.map(r=>this.ensureTransportConnected(r,e,t)))}finally{s()}})}negotiate(e){return P(this,void 0,void 0,function*(){return new Promise((t,n)=>P(this,void 0,void 0,function*(){const s=setTimeout(()=>{n("negotiation timed out")},this.peerConnectionTimeout),r=()=>{clearTimeout(s),n("negotiation aborted")};e.signal.addEventListener("abort",r),this.publisher.once(Os.NegotiationStarted,()=>{e.signal.aborted||this.publisher.once(Os.NegotiationComplete,()=>{clearTimeout(s),t()})}),yield this.publisher.negotiate(a=>{clearTimeout(s),n(a)})}))})}addPublisherTransceiver(e,t){return this.publisher.addTransceiver(e,t)}addPublisherTrack(e){return this.publisher.addTrack(e)}createPublisherDataChannel(e,t){return this.publisher.createDataChannel(e,t)}getConnectedAddress(e){return e===An.PUBLISHER?this.publisher.getConnectedAddress():e===An.SUBSCRIBER?this.publisher.getConnectedAddress():this.requiredTransports[0].getConnectedAddress()}get requiredTransports(){const e=[];return this.isPublisherConnectionRequired&&e.push(this.publisher),this.isSubscriberConnectionRequired&&e.push(this.subscriber),e}ensureTransportConnected(e,t){return P(this,arguments,void 0,function(n,s){var r=this;let a=arguments.length>2&&arguments[2]!==void 0?arguments[2]:this.peerConnectionTimeout;return function*(){if(n.getConnectionState()!=="connected")return new Promise((c,l)=>P(r,void 0,void 0,function*(){const d=()=>{this.log.warn("abort transport connection",this.logContext),$t.clearTimeout(u),l(new pt("room connection has been cancelled",Je.Cancelled))};s!=null&&s.signal.aborted&&d(),s==null||s.signal.addEventListener("abort",d);const u=$t.setTimeout(()=>{s==null||s.signal.removeEventListener("abort",d),l(new pt("could not establish pc connection",Je.InternalError))},a);for(;this.state!==wt.CONNECTED;)if(yield on(50),s!=null&&s.signal.aborted){l(new pt("room connection has been cancelled",Je.Cancelled));return}$t.clearTimeout(u),s==null||s.signal.removeEventListener("abort",d),c()}))}()})}}class At extends Error{constructor(e,t,n){super(t),this.code=e,this.message=Nf(t,At.MAX_MESSAGE_BYTES),this.data=n?Nf(n,At.MAX_DATA_BYTES):void 0}static fromProto(e){return new At(e.code,e.message,e.data)}toProto(){return new qu({code:this.code,message:this.message,data:this.data})}static builtIn(e,t){return new At(At.ErrorCode[e],At.ErrorMessage[e],t)}}At.MAX_MESSAGE_BYTES=256,At.MAX_DATA_BYTES=15360,At.ErrorCode={APPLICATION_ERROR:1500,CONNECTION_TIMEOUT:1501,RESPONSE_TIMEOUT:1502,RECIPIENT_DISCONNECTED:1503,RESPONSE_PAYLOAD_TOO_LARGE:1504,SEND_FAILED:1505,UNSUPPORTED_METHOD:1400,RECIPIENT_NOT_FOUND:1401,REQUEST_PAYLOAD_TOO_LARGE:1402,UNSUPPORTED_SERVER:1403,UNSUPPORTED_VERSION:1404},At.ErrorMessage={APPLICATION_ERROR:"Application error in method handler",CONNECTION_TIMEOUT:"Connection timeout",RESPONSE_TIMEOUT:"Response timeout",RECIPIENT_DISCONNECTED:"Recipient disconnected",RESPONSE_PAYLOAD_TOO_LARGE:"Response payload too large",SEND_FAILED:"Failed to send",UNSUPPORTED_METHOD:"Method not supported at destination",RECIPIENT_NOT_FOUND:"Recipient not found",REQUEST_PAYLOAD_TOO_LARGE:"Request payload too large",UNSUPPORTED_SERVER:"RPC not supported by server",UNSUPPORTED_VERSION:"Unsupported RPC version"};const Lf=15360;function Bc(i){return new TextEncoder().encode(i).length}function Nf(i,e){if(Bc(i)<=e)return i;let t=0,n=i.length;const s=new TextEncoder;for(;t<n;){const r=Math.floor((t+n+1)/2);s.encode(i.slice(0,r)).length<=e?t=r:n=r-1}return i.slice(0,t)}const Vc=2e3;function ka(i,e){if(!e)return 0;let t,n;return"bytesReceived"in i?(t=i.bytesReceived,n=e.bytesReceived):"bytesSent"in i&&(t=i.bytesSent,n=e.bytesSent),t===void 0||n===void 0||i.timestamp===void 0||e.timestamp===void 0?0:(t-n)*8*1e3/(i.timestamp-e.timestamp)}const zc=typeof MediaRecorder<"u";class ob{constructor(){throw new Error("MediaRecorder is not available in this environment")}}const cb=zc?MediaRecorder:ob;class lb extends cb{constructor(e,t){if(!zc)throw new Error("MediaRecorder is not available in this environment");super(new MediaStream([e.mediaStreamTrack]),t);let n,s;const r=()=>s===void 0,a=()=>{this.removeEventListener("dataavailable",n),this.removeEventListener("stop",a),this.removeEventListener("error",o),s==null||s.close(),s=void 0},o=c=>{s==null||s.error(c),this.removeEventListener("dataavailable",n),this.removeEventListener("stop",a),this.removeEventListener("error",o),s=void 0};this.byteStream=new ReadableStream({start:c=>{s=c,n=l=>P(this,void 0,void 0,function*(){let d;if(l.data.arrayBuffer){const u=yield l.data.arrayBuffer();d=new Uint8Array(u)}else if(l.data.byteArray)d=l.data.byteArray;else throw new Error("no data available!");r()||c.enqueue(d)}),this.addEventListener("dataavailable",n)},cancel:()=>{a()}}),this.addEventListener("stop",a),this.addEventListener("error",o)}}function db(){return zc}const ub=1e3,hb=1e4;class Uf extends Z{get sender(){return this._sender}set sender(e){this._sender=e}get constraints(){return this._constraints}get hasPreConnectBuffer(){return!!this.localTrackRecorder}constructor(e,t,n){let s=arguments.length>3&&arguments[3]!==void 0?arguments[3]:!1,r=arguments.length>4?arguments[4]:void 0;super(e,t,r),this.manuallyStopped=!1,this._isUpstreamPaused=!1,this.handleTrackMuteEvent=()=>this.debouncedTrackMuteHandler().catch(()=>this.log.debug("track mute bounce got cancelled by an unmute event",this.logContext)),this.debouncedTrackMuteHandler=Uc(()=>P(this,void 0,void 0,function*(){yield this.pauseUpstream()}),5e3),this.handleTrackUnmuteEvent=()=>P(this,void 0,void 0,function*(){this.debouncedTrackMuteHandler.cancel("unmute"),yield this.resumeUpstream()}),this.handleEnded=()=>{this.isInBackground&&(this.reacquireTrack=!0),this._mediaStreamTrack.removeEventListener("mute",this.handleTrackMuteEvent),this._mediaStreamTrack.removeEventListener("unmute",this.handleTrackUnmuteEvent),this.emit(ae.Ended,this)},this.reacquireTrack=!1,this.providedByUser=s,this.muteLock=new sn,this.pauseUpstreamLock=new sn,this.trackChangeLock=new sn,this.trackChangeLock.lock().then(a=>P(this,void 0,void 0,function*(){try{yield this.setMediaStreamTrack(e,!0)}finally{a()}})),this._constraints=e.getConstraints(),n&&(this._constraints=n)}get id(){return this._mediaStreamTrack.id}get dimensions(){if(this.kind!==Z.Kind.Video)return;const{width:e,height:t}=this._mediaStreamTrack.getSettings();if(e&&t)return{width:e,height:t}}get isUpstreamPaused(){return this._isUpstreamPaused}get isUserProvided(){return this.providedByUser}get mediaStreamTrack(){var e,t;return(t=(e=this.processor)===null||e===void 0?void 0:e.processedTrack)!==null&&t!==void 0?t:this._mediaStreamTrack}get isLocal(){return!0}getSourceTrackSettings(){return this._mediaStreamTrack.getSettings()}setMediaStreamTrack(e,t){return P(this,void 0,void 0,function*(){var n;if(e===this._mediaStreamTrack&&!t)return;this._mediaStreamTrack&&(this.attachedElements.forEach(r=>{Ns(this._mediaStreamTrack,r)}),this.debouncedTrackMuteHandler.cancel("new-track"),this._mediaStreamTrack.removeEventListener("ended",this.handleEnded),this._mediaStreamTrack.removeEventListener("mute",this.handleTrackMuteEvent),this._mediaStreamTrack.removeEventListener("unmute",this.handleTrackUnmuteEvent)),this.mediaStream=new MediaStream([e]),e&&(e.addEventListener("ended",this.handleEnded),e.addEventListener("mute",this.handleTrackMuteEvent),e.addEventListener("unmute",this.handleTrackUnmuteEvent),this._constraints=e.getConstraints());let s;if(this.processor&&e){if(this.log.debug("restarting processor",this.logContext),this.kind==="unknown")throw TypeError("cannot set processor on track of unknown kind");this.processorElement&&(Ls(e,this.processorElement),this.processorElement.muted=!0),yield this.processor.restart({track:e,kind:this.kind,element:this.processorElement}),s=this.processor.processedTrack}this.sender&&((n=this.sender.transport)===null||n===void 0?void 0:n.state)!=="closed"&&(yield this.sender.replaceTrack(s??e)),!this.providedByUser&&this._mediaStreamTrack!==e&&this._mediaStreamTrack.stop(),this._mediaStreamTrack=e,e&&(this._mediaStreamTrack.enabled=!this.isMuted,yield this.resumeUpstream(),this.attachedElements.forEach(r=>{Ls(s??e,r)}))})}waitForDimensions(){return P(this,arguments,void 0,function(){var e=this;let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:ub;return function*(){var n;if(e.kind===Z.Kind.Audio)throw new Error("cannot get dimensions for audio tracks");((n=fn())===null||n===void 0?void 0:n.os)==="iOS"&&(yield on(10));const s=Date.now();for(;Date.now()-s<t;){const r=e.dimensions;if(r)return r;yield on(50)}throw new hi("unable to get track dimensions after timeout")}()})}setDeviceId(e){return P(this,void 0,void 0,function*(){return this._constraints.deviceId===e&&this._mediaStreamTrack.getSettings().deviceId===Oi(e)||(this._constraints.deviceId=e,this.isMuted)?!0:(yield this.restartTrack(),Oi(e)===this._mediaStreamTrack.getSettings().deviceId)})}getDeviceId(){return P(this,arguments,void 0,function(){var e=this;let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!0;return function*(){if(e.source===Z.Source.ScreenShare)return;const{deviceId:n,groupId:s}=e._mediaStreamTrack.getSettings(),r=e.kind===Z.Kind.Audio?"audioinput":"videoinput";return t?Wt.getInstance().normalizeDeviceId(r,n,s):n}()})}mute(){return P(this,void 0,void 0,function*(){return this.setTrackMuted(!0),this})}unmute(){return P(this,void 0,void 0,function*(){return this.setTrackMuted(!1),this})}replaceTrack(e,t){return P(this,void 0,void 0,function*(){const n=yield this.trackChangeLock.lock();try{if(!this.sender)throw new hi("unable to replace an unpublished track");let s,r;return typeof t=="boolean"?s=t:t!==void 0&&(s=t.userProvidedTrack,r=t.stopProcessor),this.providedByUser=s??!0,this.log.debug("replace MediaStreamTrack",this.logContext),yield this.setMediaStreamTrack(e),r&&this.processor&&(yield this.internalStopProcessor()),this}finally{n()}})}restart(e){return P(this,void 0,void 0,function*(){this.manuallyStopped=!1;const t=yield this.trackChangeLock.lock();try{e||(e=this._constraints);const{deviceId:n,facingMode:s}=e,r=$v(e,["deviceId","facingMode"]);this.log.debug("restarting track with constraints",Object.assign(Object.assign({},this.logContext),{constraints:e}));const a={audio:!1,video:!1};this.kind===Z.Kind.Video?a.video=n||s?{deviceId:n,facingMode:s}:!0:a.audio=n?Object.assign({deviceId:n},r):!0,this.attachedElements.forEach(l=>{Ns(this.mediaStreamTrack,l)}),this._mediaStreamTrack.removeEventListener("ended",this.handleEnded),this._mediaStreamTrack.stop();const c=(yield navigator.mediaDevices.getUserMedia(a)).getTracks()[0];return this.kind===Z.Kind.Video&&(yield c.applyConstraints(r)),c.addEventListener("ended",this.handleEnded),this.log.debug("re-acquired MediaStreamTrack",this.logContext),yield this.setMediaStreamTrack(c),this._constraints=e,this.emit(ae.Restarted,this),this.manuallyStopped&&(this.log.warn("track was stopped during a restart, stopping restarted track",this.logContext),this.stop()),this}finally{t()}})}setTrackMuted(e){this.log.debug("setting ".concat(this.kind," track ").concat(e?"muted":"unmuted"),this.logContext),!(this.isMuted===e&&this._mediaStreamTrack.enabled!==e)&&(this.isMuted=e,this._mediaStreamTrack.enabled=!e,this.emit(e?ae.Muted:ae.Unmuted,this))}get needsReAcquisition(){return this._mediaStreamTrack.readyState!=="live"||this._mediaStreamTrack.muted||!this._mediaStreamTrack.enabled||this.reacquireTrack}handleAppVisibilityChanged(){const e=Object.create(null,{handleAppVisibilityChanged:{get:()=>super.handleAppVisibilityChanged}});return P(this,void 0,void 0,function*(){yield e.handleAppVisibilityChanged.call(this),lf()&&(this.log.debug("visibility changed, is in Background: ".concat(this.isInBackground),this.logContext),!this.isInBackground&&this.needsReAcquisition&&!this.isUserProvided&&!this.isMuted&&(this.log.debug("track needs to be reacquired, restarting ".concat(this.source),this.logContext),yield this.restart(),this.reacquireTrack=!1))})}stop(){var e;this.manuallyStopped=!0,super.stop(),this._mediaStreamTrack.removeEventListener("ended",this.handleEnded),this._mediaStreamTrack.removeEventListener("mute",this.handleTrackMuteEvent),this._mediaStreamTrack.removeEventListener("unmute",this.handleTrackUnmuteEvent),(e=this.processor)===null||e===void 0||e.destroy(),this.processor=void 0}pauseUpstream(){return P(this,void 0,void 0,function*(){var e;const t=yield this.pauseUpstreamLock.lock();try{if(this._isUpstreamPaused===!0)return;if(!this.sender){this.log.warn("unable to pause upstream for an unpublished track",this.logContext);return}this._isUpstreamPaused=!0,this.emit(ae.UpstreamPaused,this);const n=fn();if((n==null?void 0:n.name)==="Safari"&&jn(n.version,"12.0")<0)throw new dc("pauseUpstream is not supported on Safari < 12.");((e=this.sender.transport)===null||e===void 0?void 0:e.state)!=="closed"&&(yield this.sender.replaceTrack(null))}finally{t()}})}resumeUpstream(){return P(this,void 0,void 0,function*(){var e;const t=yield this.pauseUpstreamLock.lock();try{if(this._isUpstreamPaused===!1)return;if(!this.sender){this.log.warn("unable to resume upstream for an unpublished track",this.logContext);return}this._isUpstreamPaused=!1,this.emit(ae.UpstreamResumed,this),((e=this.sender.transport)===null||e===void 0?void 0:e.state)!=="closed"&&(yield this.sender.replaceTrack(this.mediaStreamTrack))}finally{t()}})}getRTCStatsReport(){return P(this,void 0,void 0,function*(){var e;return!((e=this.sender)===null||e===void 0)&&e.getStats?yield this.sender.getStats():void 0})}setProcessor(e){return P(this,arguments,void 0,function(t){var n=this;let s=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0;return function*(){var r;const a=yield n.trackChangeLock.lock();try{n.log.debug("setting up processor",n.logContext);const o=document.createElement(n.kind),c={kind:n.kind,track:n._mediaStreamTrack,element:o,audioContext:n.audioContext};if(yield t.init(c),n.log.debug("processor initialized",n.logContext),n.processor&&(yield n.internalStopProcessor()),n.kind==="unknown")throw TypeError("cannot set processor on track of unknown kind");if(Ls(n._mediaStreamTrack,o),o.muted=!0,o.play().catch(l=>{l instanceof DOMException&&l.name==="AbortError"?(n.log.warn("failed to play processor element, retrying",Object.assign(Object.assign({},n.logContext),{error:l})),setTimeout(()=>{o.play().catch(d=>{n.log.error("failed to play processor element",Object.assign(Object.assign({},n.logContext),{err:d}))})},100)):n.log.error("failed to play processor element",Object.assign(Object.assign({},n.logContext),{error:l}))}),n.processor=t,n.processorElement=o,n.processor.processedTrack){for(const l of n.attachedElements)l!==n.processorElement&&s&&(Ns(n._mediaStreamTrack,l),Ls(n.processor.processedTrack,l));yield(r=n.sender)===null||r===void 0?void 0:r.replaceTrack(n.processor.processedTrack)}n.emit(ae.TrackProcessorUpdate,n.processor)}finally{a()}}()})}getProcessor(){return this.processor}stopProcessor(){return P(this,arguments,void 0,function(){var e=this;let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!0;return function*(){const n=yield e.trackChangeLock.lock();try{yield e.internalStopProcessor(t)}finally{n()}}()})}internalStopProcessor(){return P(this,arguments,void 0,function(){var e=this;let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!0;return function*(){var n,s;e.processor&&(e.log.debug("stopping processor",e.logContext),(n=e.processor.processedTrack)===null||n===void 0||n.stop(),yield e.processor.destroy(),e.processor=void 0,t||((s=e.processorElement)===null||s===void 0||s.remove(),e.processorElement=void 0),yield e._mediaStreamTrack.applyConstraints(e._constraints),yield e.setMediaStreamTrack(e._mediaStreamTrack,!0),e.emit(ae.TrackProcessorUpdate))}()})}startPreConnectBuffer(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:100;if(!db()){this.log.warn("MediaRecorder is not available, cannot start preconnect buffer",this.logContext);return}if(this.localTrackRecorder){this.log.warn("preconnect buffer already started");return}else{let t="audio/webm;codecs=opus";MediaRecorder.isTypeSupported(t)||(t="video/mp4"),this.localTrackRecorder=new lb(this,{mimeType:t})}this.localTrackRecorder.start(e),this.autoStopPreConnectBuffer=setTimeout(()=>{this.log.warn("preconnect buffer timed out, stopping recording automatically",this.logContext),this.stopPreConnectBuffer()},hb)}stopPreConnectBuffer(){clearTimeout(this.autoStopPreConnectBuffer),this.localTrackRecorder&&(this.localTrackRecorder.stop(),this.localTrackRecorder=void 0)}getPreConnectBuffer(){var e;return(e=this.localTrackRecorder)===null||e===void 0?void 0:e.byteStream}getPreConnectBufferMimeType(){var e;return(e=this.localTrackRecorder)===null||e===void 0?void 0:e.mimeType}}class Ia extends Uf{get enhancedNoiseCancellation(){return this.isKrispNoiseFilterEnabled}constructor(e,t){let n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0,s=arguments.length>3?arguments[3]:void 0,r=arguments.length>4?arguments[4]:void 0;super(e,Z.Kind.Audio,t,n,r),this.stopOnMute=!1,this.isKrispNoiseFilterEnabled=!1,this.monitorSender=()=>P(this,void 0,void 0,function*(){if(!this.sender){this._currentBitrate=0;return}let a;try{a=yield this.getSenderStats()}catch(o){this.log.error("could not get audio sender stats",Object.assign(Object.assign({},this.logContext),{error:o}));return}a&&this.prevStats&&(this._currentBitrate=ka(a,this.prevStats)),this.prevStats=a}),this.handleKrispNoiseFilterEnable=()=>{this.isKrispNoiseFilterEnabled=!0,this.log.debug("Krisp noise filter enabled",this.logContext),this.emit(ae.AudioTrackFeatureUpdate,this,Ht.TF_ENHANCED_NOISE_CANCELLATION,!0)},this.handleKrispNoiseFilterDisable=()=>{this.isKrispNoiseFilterEnabled=!1,this.log.debug("Krisp noise filter disabled",this.logContext),this.emit(ae.AudioTrackFeatureUpdate,this,Ht.TF_ENHANCED_NOISE_CANCELLATION,!1)},this.audioContext=s,this.checkForSilence()}mute(){const e=Object.create(null,{mute:{get:()=>super.mute}});return P(this,void 0,void 0,function*(){const t=yield this.muteLock.lock();try{return this.isMuted?(this.log.debug("Track already muted",this.logContext),this):(this.source===Z.Source.Microphone&&this.stopOnMute&&!this.isUserProvided&&(this.log.debug("stopping mic track",this.logContext),this._mediaStreamTrack.stop()),yield e.mute.call(this),this)}finally{t()}})}unmute(){const e=Object.create(null,{unmute:{get:()=>super.unmute}});return P(this,void 0,void 0,function*(){const t=yield this.muteLock.lock();try{if(!this.isMuted)return this.log.debug("Track already unmuted",this.logContext),this;const n=this._constraints.deviceId&&this._mediaStreamTrack.getSettings().deviceId!==Oi(this._constraints.deviceId);return this.source===Z.Source.Microphone&&(this.stopOnMute||this._mediaStreamTrack.readyState==="ended"||n)&&!this.isUserProvided&&(this.log.debug("reacquiring mic track",this.logContext),yield this.restartTrack()),yield e.unmute.call(this),this}finally{t()}})}restartTrack(e){return P(this,void 0,void 0,function*(){let t;if(e){const n=Ac({audio:e});typeof n.audio!="boolean"&&(t=n.audio)}yield this.restart(t)})}restart(e){const t=Object.create(null,{restart:{get:()=>super.restart}});return P(this,void 0,void 0,function*(){const n=yield t.restart.call(this,e);return this.checkForSilence(),n})}startMonitor(){cn()&&(this.monitorInterval||(this.monitorInterval=setInterval(()=>{this.monitorSender()},Vc)))}setProcessor(e){return P(this,void 0,void 0,function*(){var t;const n=yield this.trackChangeLock.lock();try{if(!qn()&&!this.audioContext)throw Error("Audio context needs to be set on LocalAudioTrack in order to enable processors");this.processor&&(yield this.internalStopProcessor());const s={kind:this.kind,track:this._mediaStreamTrack,audioContext:this.audioContext};this.log.debug("setting up audio processor ".concat(e.name),this.logContext),yield e.init(s),this.processor=e,this.processor.processedTrack&&(yield(t=this.sender)===null||t===void 0?void 0:t.replaceTrack(this.processor.processedTrack),this.processor.processedTrack.addEventListener("enable-lk-krisp-noise-filter",this.handleKrispNoiseFilterEnable),this.processor.processedTrack.addEventListener("disable-lk-krisp-noise-filter",this.handleKrispNoiseFilterDisable)),this.emit(ae.TrackProcessorUpdate,this.processor)}finally{n()}})}setAudioContext(e){this.audioContext=e}getSenderStats(){return P(this,void 0,void 0,function*(){var e;if(!(!((e=this.sender)===null||e===void 0)&&e.getStats))return;const t=yield this.sender.getStats();let n;return t.forEach(s=>{s.type==="outbound-rtp"&&(n={type:"audio",streamId:s.id,packetsSent:s.packetsSent,packetsLost:s.packetsLost,bytesSent:s.bytesSent,timestamp:s.timestamp,roundTripTime:s.roundTripTime,jitter:s.jitter})}),n})}checkForSilence(){return P(this,void 0,void 0,function*(){const e=yield bf(this);return e&&(this.isMuted||this.log.warn("silence detected on local audio track",this.logContext),this.emit(ae.AudioSilenceDetected)),e})}}function fb(i,e,t){switch(i.kind){case"audio":return new Ia(i,e,!1,void 0,t);case"video":return new Da(i,e,!1,t);default:throw new hi("unsupported track type: ".concat(i.kind))}}const pb=Object.values(kr),mb=Object.values(mc),gb=Object.values(gc),vb=[kr.h180,kr.h360],bb=[mc.h180,mc.h360],_b=i=>[{scaleResolutionDownBy:2,fps:i.encoding.maxFramerate}].map(t=>{var n,s;return new ut(Math.floor(i.width/t.scaleResolutionDownBy),Math.floor(i.height/t.scaleResolutionDownBy),Math.max(15e4,Math.floor(i.encoding.maxBitrate/(Math.pow(t.scaleResolutionDownBy,2)*(((n=i.encoding.maxFramerate)!==null&&n!==void 0?n:30)/((s=t.fps)!==null&&s!==void 0?s:30))))),t.fps,i.encoding.priority)}),Gc=["q","h","f"];function Hc(i,e,t,n){var s,r;let a=n==null?void 0:n.videoEncoding;i&&(a=n==null?void 0:n.screenShareEncoding);const o=n==null?void 0:n.simulcast,c=n==null?void 0:n.scalabilityMode,l=n==null?void 0:n.videoCodec;if(!a&&!o&&!c||!e||!t)return[{}];a||(a=Sb(i,e,t,l),Ke.debug("using video encoding",a));const d=a.maxFramerate,u=new ut(e,t,a.maxBitrate,a.maxFramerate,a.priority);if(c&&Wn(l)){const g=new Bf(c),v=[];if(g.spatial>3)throw new Error("unsupported scalabilityMode: ".concat(c));const m=fn();if(Ir()||qn()||(m==null?void 0:m.name)==="Chrome"&&jn(m==null?void 0:m.version,"113")<0){const p=g.suffix=="h"?2:3,x=C0(m);for(let C=0;C<g.spatial;C+=1)v.push({rid:Gc[2-C],maxBitrate:a.maxBitrate/Math.pow(p,C),maxFramerate:u.encoding.maxFramerate,scaleResolutionDownBy:x?Math.pow(2,C):void 0});v[0].scalabilityMode=c}else v.push({maxBitrate:a.maxBitrate,maxFramerate:u.encoding.maxFramerate,scalabilityMode:c});return u.encoding.priority&&(v[0].priority=u.encoding.priority,v[0].networkPriority=u.encoding.priority),Ke.debug("using svc encoding",{encodings:v}),v}if(!o)return[a];let h=[];i?h=(s=Ff(n==null?void 0:n.screenShareSimulcastLayers))!==null&&s!==void 0?s:Of(i,u):h=(r=Ff(n==null?void 0:n.videoSimulcastLayers))!==null&&r!==void 0?r:Of(i,u);let f;if(h.length>0){const g=h[0];h.length>1&&([,f]=h);const v=Math.max(e,t);if(v>=960&&f)return Wc(e,t,[g,f,u],d);if(v>=480)return Wc(e,t,[g,u],d)}return Wc(e,t,[u])}function yb(i,e,t){var n,s,r,a;if(!t.backupCodec||t.backupCodec===!0||t.backupCodec.codec===t.videoCodec)return;e!==t.backupCodec.codec&&Ke.warn("requested a different codec than specified as backup",{serverRequested:e,backup:t.backupCodec.codec}),t.videoCodec=e,t.videoEncoding=t.backupCodec.encoding;const o=i.mediaStreamTrack.getSettings(),c=(n=o.width)!==null&&n!==void 0?n:(s=i.dimensions)===null||s===void 0?void 0:s.width,l=(r=o.height)!==null&&r!==void 0?r:(a=i.dimensions)===null||a===void 0?void 0:a.height;return i.source===Z.Source.ScreenShare&&t.simulcast&&(t.simulcast=!1),Hc(i.source===Z.Source.ScreenShare,c,l,t)}function Sb(i,e,t,n){const s=xb(i,e,t);let{encoding:r}=s[0];const a=Math.max(e,t);for(let o=0;o<s.length;o+=1){const c=s[o];if(r=c.encoding,c.width>=a)break}if(n)switch(n){case"av1":case"h265":r=Object.assign({},r),r.maxBitrate=r.maxBitrate*.7;break;case"vp9":r=Object.assign({},r),r.maxBitrate=r.maxBitrate*.85;break}return r}function xb(i,e,t){if(i)return gb;const n=e>t?e/t:t/e;return Math.abs(n-16/9)<Math.abs(n-4/3)?pb:mb}function Of(i,e){if(i)return _b(e);const{width:t,height:n}=e,s=t>n?t/n:n/t;return Math.abs(s-16/9)<Math.abs(s-4/3)?vb:bb}function Wc(i,e,t,n){const s=[];if(t.forEach((r,a)=>{if(a>=Gc.length)return;const o=Math.min(i,e),l={rid:Gc[a],scaleResolutionDownBy:Math.max(1,o/Math.min(r.width,r.height)),maxBitrate:r.encoding.maxBitrate},d=n&&r.encoding.maxFramerate?Math.min(n,r.encoding.maxFramerate):r.encoding.maxFramerate;d&&(l.maxFramerate=d);const u=as()||a===0;r.encoding.priority&&u&&(l.priority=r.encoding.priority,l.networkPriority=r.encoding.priority),s.push(l)}),qn()&&uf()==="ios"){let r;s.forEach(o=>{r?o.maxFramerate&&o.maxFramerate>r&&(r=o.maxFramerate):r=o.maxFramerate});let a=!0;s.forEach(o=>{var c;o.maxFramerate!=r&&(a&&(a=!1,Ke.info("Simulcast on iOS React-Native requires all encodings to share the same framerate.")),Ke.info('Setting framerate of encoding "'.concat((c=o.rid)!==null&&c!==void 0?c:"",'" to ').concat(r)),o.maxFramerate=r)})}return s}function Ff(i){if(i)return i.sort((e,t)=>{const{encoding:n}=e,{encoding:s}=t;return n.maxBitrate>s.maxBitrate?1:n.maxBitrate<s.maxBitrate?-1:n.maxBitrate===s.maxBitrate&&n.maxFramerate&&s.maxFramerate?n.maxFramerate>s.maxFramerate?1:-1:0})}class Bf{constructor(e){const t=e.match(/^L(\d)T(\d)(h|_KEY|_KEY_SHIFT){0,1}$/);if(!t)throw new Error("invalid scalability mode");if(this.spatial=parseInt(t[1]),this.temporal=parseInt(t[2]),t.length>3)switch(t[3]){case"h":case"_KEY":case"_KEY_SHIFT":this.suffix=t[3]}}toString(){var e;return"L".concat(this.spatial,"T").concat(this.temporal).concat((e=this.suffix)!==null&&e!==void 0?e:"")}}function Tb(i){return i.source===Z.Source.ScreenShare||i.constraints.height&&Oi(i.constraints.height)>=1080?"maintain-resolution":"balanced"}const Cb=5e3;class Da extends Uf{get sender(){return this._sender}set sender(e){this._sender=e,this.degradationPreference&&this.setDegradationPreference(this.degradationPreference)}constructor(e,t){let n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0,s=arguments.length>3?arguments[3]:void 0;super(e,Z.Kind.Video,t,n,s),this.simulcastCodecs=new Map,this.degradationPreference="balanced",this.isCpuConstrained=!1,this.optimizeForPerformance=!1,this.monitorSender=()=>P(this,void 0,void 0,function*(){if(!this.sender){this._currentBitrate=0;return}let r;try{r=yield this.getSenderStats()}catch(c){this.log.error("could not get video sender stats",Object.assign(Object.assign({},this.logContext),{error:c}));return}const a=new Map(r.map(c=>[c.rid,c])),o=r.some(c=>c.qualityLimitationReason==="cpu");if(o!==this.isCpuConstrained&&(this.isCpuConstrained=o,this.isCpuConstrained&&this.emit(ae.CpuConstrained)),this.prevStats){let c=0;a.forEach((l,d)=>{var u;const h=(u=this.prevStats)===null||u===void 0?void 0:u.get(d);c+=ka(l,h)}),this._currentBitrate=c}this.prevStats=a}),this.senderLock=new sn}get isSimulcast(){return!!(this.sender&&this.sender.getParameters().encodings.length>1)}startMonitor(e){var t;if(this.signalClient=e,!cn())return;const n=(t=this.sender)===null||t===void 0?void 0:t.getParameters();n&&(this.encodings=n.encodings),!this.monitorInterval&&(this.monitorInterval=setInterval(()=>{this.monitorSender()},Vc))}stop(){this._mediaStreamTrack.getConstraints(),this.simulcastCodecs.forEach(e=>{e.mediaStreamTrack.stop()}),super.stop()}pauseUpstream(){const e=Object.create(null,{pauseUpstream:{get:()=>super.pauseUpstream}});return P(this,void 0,void 0,function*(){var t,n,s,r,a;yield e.pauseUpstream.call(this);try{for(var o=!0,c=di(this.simulcastCodecs.values()),l;l=yield c.next(),t=l.done,!t;o=!0)r=l.value,o=!1,yield(a=r.sender)===null||a===void 0?void 0:a.replaceTrack(null)}catch(d){n={error:d}}finally{try{!o&&!t&&(s=c.return)&&(yield s.call(c))}finally{if(n)throw n.error}}})}resumeUpstream(){const e=Object.create(null,{resumeUpstream:{get:()=>super.resumeUpstream}});return P(this,void 0,void 0,function*(){var t,n,s,r,a;yield e.resumeUpstream.call(this);try{for(var o=!0,c=di(this.simulcastCodecs.values()),l;l=yield c.next(),t=l.done,!t;o=!0){r=l.value,o=!1;const d=r;yield(a=d.sender)===null||a===void 0?void 0:a.replaceTrack(d.mediaStreamTrack)}}catch(d){n={error:d}}finally{try{!o&&!t&&(s=c.return)&&(yield s.call(c))}finally{if(n)throw n.error}}})}mute(){const e=Object.create(null,{mute:{get:()=>super.mute}});return P(this,void 0,void 0,function*(){const t=yield this.muteLock.lock();try{return this.isMuted?(this.log.debug("Track already muted",this.logContext),this):(this.source===Z.Source.Camera&&!this.isUserProvided&&(this.log.debug("stopping camera track",this.logContext),this._mediaStreamTrack.stop()),yield e.mute.call(this),this)}finally{t()}})}unmute(){const e=Object.create(null,{unmute:{get:()=>super.unmute}});return P(this,void 0,void 0,function*(){const t=yield this.muteLock.lock();try{return this.isMuted?(this.source===Z.Source.Camera&&!this.isUserProvided&&(this.log.debug("reacquiring camera track",this.logContext),yield this.restartTrack()),yield e.unmute.call(this),this):(this.log.debug("Track already unmuted",this.logContext),this)}finally{t()}})}setTrackMuted(e){super.setTrackMuted(e);for(const t of this.simulcastCodecs.values())t.mediaStreamTrack.enabled=!e}getSenderStats(){return P(this,void 0,void 0,function*(){var e;if(!(!((e=this.sender)===null||e===void 0)&&e.getStats))return[];const t=[],n=yield this.sender.getStats();return n.forEach(s=>{var r;if(s.type==="outbound-rtp"){const a={type:"video",streamId:s.id,frameHeight:s.frameHeight,frameWidth:s.frameWidth,framesPerSecond:s.framesPerSecond,framesSent:s.framesSent,firCount:s.firCount,pliCount:s.pliCount,nackCount:s.nackCount,packetsSent:s.packetsSent,bytesSent:s.bytesSent,qualityLimitationReason:s.qualityLimitationReason,qualityLimitationDurations:s.qualityLimitationDurations,qualityLimitationResolutionChanges:s.qualityLimitationResolutionChanges,rid:(r=s.rid)!==null&&r!==void 0?r:s.id,retransmittedPacketsSent:s.retransmittedPacketsSent,targetBitrate:s.targetBitrate,timestamp:s.timestamp},o=n.get(s.remoteId);o&&(a.jitter=o.jitter,a.packetsLost=o.packetsLost,a.roundTripTime=o.roundTripTime),t.push(a)}}),t.sort((s,r)=>{var a,o;return((a=r.frameWidth)!==null&&a!==void 0?a:0)-((o=s.frameWidth)!==null&&o!==void 0?o:0)}),t})}setPublishingQuality(e){const t=[];for(let n=pn.LOW;n<=pn.HIGH;n+=1)t.push(new Zo({quality:n,enabled:n<=e}));this.log.debug("setting publishing quality. max quality ".concat(e),this.logContext),this.setPublishingLayers(Wn(this.codec),t)}restartTrack(e){return P(this,void 0,void 0,function*(){var t,n,s,r,a;let o;if(e){const u=Ac({video:e});typeof u.video!="boolean"&&(o=u.video)}yield this.restart(o),this.isCpuConstrained=!1;try{for(var c=!0,l=di(this.simulcastCodecs.values()),d;d=yield l.next(),t=d.done,!t;c=!0){r=d.value,c=!1;const u=r;u.sender&&((a=u.sender.transport)===null||a===void 0?void 0:a.state)!=="closed"&&(u.mediaStreamTrack=this.mediaStreamTrack.clone(),yield u.sender.replaceTrack(u.mediaStreamTrack))}}catch(u){n={error:u}}finally{try{!c&&!t&&(s=l.return)&&(yield s.call(l))}finally{if(n)throw n.error}}})}setProcessor(e){const t=Object.create(null,{setProcessor:{get:()=>super.setProcessor}});return P(this,arguments,void 0,function(n){var s=this;let r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0;return function*(){var a,o,c,l,d,u;if(yield t.setProcessor.call(s,n,r),!((d=s.processor)===null||d===void 0)&&d.processedTrack)try{for(var h=!0,f=di(s.simulcastCodecs.values()),g;g=yield f.next(),a=g.done,!a;h=!0)l=g.value,h=!1,yield(u=l.sender)===null||u===void 0?void 0:u.replaceTrack(s.processor.processedTrack)}catch(v){o={error:v}}finally{try{!h&&!a&&(c=f.return)&&(yield c.call(f))}finally{if(o)throw o.error}}}()})}setDegradationPreference(e){return P(this,void 0,void 0,function*(){if(this.degradationPreference=e,this.sender)try{this.log.debug("setting degradationPreference to ".concat(e),this.logContext);const t=this.sender.getParameters();t.degradationPreference=e,this.sender.setParameters(t)}catch(t){this.log.warn("failed to set degradationPreference",Object.assign({error:t},this.logContext))}})}addSimulcastTrack(e,t){if(this.simulcastCodecs.has(e)){this.log.error("".concat(e," already added, skipping adding simulcast codec"),this.logContext);return}const n={codec:e,mediaStreamTrack:this.mediaStreamTrack.clone(),sender:void 0,encodings:t};return this.simulcastCodecs.set(e,n),n}setSimulcastTrackSender(e,t){const n=this.simulcastCodecs.get(e);n&&(n.sender=t,setTimeout(()=>{this.subscribedCodecs&&this.setPublishingCodecs(this.subscribedCodecs)},Cb))}setPublishingCodecs(e){return P(this,void 0,void 0,function*(){var t,n,s,r,a,o,c;if(this.log.debug("setting publishing codecs",Object.assign(Object.assign({},this.logContext),{codecs:e,currentCodec:this.codec})),!this.codec&&e.length>0)return yield this.setPublishingLayers(Wn(e[0].codec),e[0].qualities),[];this.subscribedCodecs=e;const l=[];try{for(t=!0,n=di(e);s=yield n.next(),r=s.done,!r;t=!0){c=s.value,t=!1;const d=c;if(!this.codec||this.codec===d.codec)yield this.setPublishingLayers(Wn(d.codec),d.qualities);else{const u=this.simulcastCodecs.get(d.codec);if(this.log.debug("try setPublishingCodec for ".concat(d.codec),Object.assign(Object.assign({},this.logContext),{simulcastCodecInfo:u})),!u||!u.sender){for(const h of d.qualities)if(h.enabled){l.push(d.codec);break}}else u.encodings&&(this.log.debug("try setPublishingLayersForSender ".concat(d.codec),this.logContext),yield Vf(u.sender,u.encodings,d.qualities,this.senderLock,Wn(d.codec),this.log,this.logContext))}}}catch(d){a={error:d}}finally{try{!t&&!r&&(o=n.return)&&(yield o.call(n))}finally{if(a)throw a.error}}return l})}setPublishingLayers(e,t){return P(this,void 0,void 0,function*(){if(this.optimizeForPerformance){this.log.info("skipping setPublishingLayers due to optimized publishing performance",Object.assign(Object.assign({},this.logContext),{qualities:t}));return}this.log.debug("setting publishing layers",Object.assign(Object.assign({},this.logContext),{qualities:t})),!(!this.sender||!this.encodings)&&(yield Vf(this.sender,this.encodings,t,this.senderLock,e,this.log,this.logContext))})}prioritizePerformance(){return P(this,void 0,void 0,function*(){if(!this.sender)throw new Error("sender not found");const e=yield this.senderLock.lock();try{this.optimizeForPerformance=!0;const t=this.sender.getParameters();t.encodings=t.encodings.map((n,s)=>{var r;return Object.assign(Object.assign({},n),{active:s===0,scaleResolutionDownBy:Math.max(1,Math.ceil(((r=this.mediaStreamTrack.getSettings().height)!==null&&r!==void 0?r:360)/360)),scalabilityMode:s===0&&Wn(this.codec)?"L1T3":void 0,maxFramerate:s===0?15:0,maxBitrate:s===0?n.maxBitrate:0})}),this.log.debug("setting performance optimised encodings",Object.assign(Object.assign({},this.logContext),{encodings:t.encodings})),this.encodings=t.encodings,yield this.sender.setParameters(t)}catch(t){this.log.error("failed to set performance optimised encodings",Object.assign(Object.assign({},this.logContext),{error:t})),this.optimizeForPerformance=!1}finally{e()}})}handleAppVisibilityChanged(){const e=Object.create(null,{handleAppVisibilityChanged:{get:()=>super.handleAppVisibilityChanged}});return P(this,void 0,void 0,function*(){yield e.handleAppVisibilityChanged.call(this),lf()&&this.isInBackground&&this.source===Z.Source.Camera&&(this._mediaStreamTrack.enabled=!1)})}}function Vf(i,e,t,n,s,r,a){return P(this,void 0,void 0,function*(){const o=yield n.lock();r.debug("setPublishingLayersForSender",Object.assign(Object.assign({},a),{sender:i,qualities:t,senderEncodings:e}));try{const c=i.getParameters(),{encodings:l}=c;if(!l)return;if(l.length!==e.length){r.warn("cannot set publishing layers, encodings mismatch",Object.assign(Object.assign({},a),{encodings:l,senderEncodings:e}));return}let d=!1;!1&&l[0].scalabilityMode||(s&&t.some(f=>f.enabled)&&t.forEach(f=>f.enabled=!0),l.forEach((h,f)=>{var g;let v=(g=h.rid)!==null&&g!==void 0?g:"";v===""&&(v="q");const m=zf(v),p=t.find(x=>x.quality===m);p&&h.active!==p.enabled&&(d=!0,h.active=p.enabled,r.debug("setting layer ".concat(p.quality," to ").concat(h.active?"enabled":"disabled"),a),as()&&(p.enabled?(h.scaleResolutionDownBy=e[f].scaleResolutionDownBy,h.maxBitrate=e[f].maxBitrate,h.maxFrameRate=e[f].maxFrameRate):(h.scaleResolutionDownBy=4,h.maxBitrate=10,h.maxFrameRate=2)))})),d&&(c.encodings=l,r.debug("setting encodings",Object.assign(Object.assign({},a),{encodings:c.encodings})),yield i.setParameters(c))}finally{o()}})}function zf(i){switch(i){case"f":return pn.HIGH;case"h":return pn.MEDIUM;case"q":return pn.LOW;default:return pn.HIGH}}function Gf(i,e,t,n){if(!t)return[new is({quality:pn.HIGH,width:i,height:e,bitrate:0,ssrc:0})];if(n){const s=t[0].scalabilityMode,r=new Bf(s),a=[],o=r.suffix=="h"?1.5:2,c=r.suffix=="h"?2:3;for(let l=0;l<r.spatial;l+=1)a.push(new is({quality:Math.min(pn.HIGH,r.spatial-1)-l,width:Math.ceil(i/Math.pow(o,l)),height:Math.ceil(e/Math.pow(o,l)),bitrate:t[0].maxBitrate?Math.ceil(t[0].maxBitrate/Math.pow(c,l)):0,ssrc:0}));return a}return t.map(s=>{var r,a,o;const c=(r=s.scaleResolutionDownBy)!==null&&r!==void 0?r:1;let l=zf((a=s.rid)!==null&&a!==void 0?a:"");return new is({quality:l,width:Math.ceil(i/c),height:Math.ceil(e/c),bitrate:(o=s.maxBitrate)!==null&&o!==void 0?o:0,ssrc:0})})}const Hf="_lossy",Wf="_reliable",Eb=2*1e3,qc="leave-reconnect",Mb=3e4;var In;(function(i){i[i.New=0]="New",i[i.Connected=1]="Connected",i[i.Disconnected=2]="Disconnected",i[i.Reconnecting=3]="Reconnecting",i[i.Closed=4]="Closed"})(In||(In={}));class wb extends Hn.EventEmitter{get isClosed(){return this._isClosed}get pendingReconnect(){return!!this.reconnectTimeout}constructor(e){var t;super(),this.options=e,this.rtcConfig={},this.peerConnectionTimeout=Fc.peerConnectionTimeout,this.fullReconnectOnNext=!1,this.latestRemoteOfferId=0,this.subscriberPrimary=!1,this.pcState=In.New,this._isClosed=!0,this.pendingTrackResolvers={},this.reconnectAttempts=0,this.reconnectStart=0,this.attemptingReconnect=!1,this.joinAttempts=0,this.maxJoinAttempts=1,this.shouldFailNext=!1,this.log=Ke,this.reliableDataSequence=1,this.reliableMessageBuffer=new Cf,this.reliableReceivedState=new J0(Mb),this.handleDataChannel=n=>P(this,[n],void 0,function(s){var r=this;let{channel:a}=s;return function*(){if(a){if(a.label===Wf)r.reliableDCSub=a;else if(a.label===Hf)r.lossyDCSub=a;else return;r.log.debug("on data channel ".concat(a.id,", ").concat(a.label),r.logContext),a.onmessage=r.handleDataMessage}}()}),this.handleDataMessage=n=>P(this,void 0,void 0,function*(){var s,r;const a=yield this.dataProcessLock.lock();try{let o;if(n.data instanceof ArrayBuffer)o=n.data;else if(n.data instanceof Blob)o=yield n.data.arrayBuffer();else{this.log.error("unsupported data type",Object.assign(Object.assign({},this.logContext),{data:n.data}));return}const c=an.fromBinary(new Uint8Array(o));if(c.sequence>0&&c.participantSid!==""){const l=this.reliableReceivedState.get(c.participantSid);if(l&&c.sequence<=l)return;this.reliableReceivedState.set(c.participantSid,c.sequence)}((s=c.value)===null||s===void 0?void 0:s.case)==="speaker"?this.emit(le.ActiveSpeakersUpdate,c.value.value.speakers):(((r=c.value)===null||r===void 0?void 0:r.case)==="user"&&Rb(c,c.value.value),this.emit(le.DataPacketReceived,c))}finally{a()}}),this.handleDataError=n=>{const r=n.currentTarget.maxRetransmits===0?"lossy":"reliable";if(n instanceof ErrorEvent&&n.error){const{error:a}=n.error;this.log.error("DataChannel error on ".concat(r,": ").concat(n.message),Object.assign(Object.assign({},this.logContext),{error:a}))}else this.log.error("Unknown DataChannel error on ".concat(r),Object.assign(Object.assign({},this.logContext),{event:n}))},this.handleBufferedAmountLow=n=>{const r=n.currentTarget.maxRetransmits===0?We.LOSSY:We.RELIABLE;this.updateAndEmitDCBufferStatus(r)},this.handleDisconnect=(n,s)=>{if(this._isClosed)return;this.log.warn("".concat(n," disconnected"),this.logContext),this.reconnectAttempts===0&&(this.reconnectStart=Date.now());const r=c=>{this.log.warn("could not recover connection after ".concat(this.reconnectAttempts," attempts, ").concat(c,"ms. giving up"),this.logContext),this.emit(le.Disconnected),this.close()},a=Date.now()-this.reconnectStart;let o=this.getNextRetryDelay({elapsedMs:a,retryCount:this.reconnectAttempts});if(o===null){r(a);return}n===qc&&(o=0),this.log.debug("reconnecting in ".concat(o,"ms"),this.logContext),this.clearReconnectTimeout(),this.token&&this.regionUrlProvider&&this.regionUrlProvider.updateToken(this.token),this.reconnectTimeout=$t.setTimeout(()=>this.attemptReconnect(s).finally(()=>this.reconnectTimeout=void 0),o)},this.waitForRestarted=()=>new Promise((n,s)=>{this.pcState===In.Connected&&n();const r=()=>{this.off(le.Disconnected,a),n()},a=()=>{this.off(le.Restarted,r),s()};this.once(le.Restarted,r),this.once(le.Disconnected,a)}),this.updateAndEmitDCBufferStatus=n=>{const s=this.isBufferStatusLow(n);typeof s<"u"&&s!==this.dcBufferStatus.get(n)&&(this.dcBufferStatus.set(n,s),this.emit(le.DCBufferStatusChanged,s,n))},this.isBufferStatusLow=n=>{const s=this.dataChannelForKind(n);if(s)return n===We.RELIABLE&&this.reliableMessageBuffer.alignBufferedAmount(s.bufferedAmount),s.bufferedAmount<=s.bufferedAmountLowThreshold},this.handleBrowserOnLine=()=>{this.client.currentState===Tt.RECONNECTING&&(this.clearReconnectTimeout(),this.attemptReconnect(Rs.RR_SIGNAL_DISCONNECTED))},this.log=li((t=e.loggerName)!==null&&t!==void 0?t:Rn.Engine),this.loggerOptions={loggerName:e.loggerName,loggerContextCb:()=>this.logContext},this.client=new kc(void 0,this.loggerOptions),this.client.signalLatency=this.options.expSignalLatency,this.reconnectPolicy=this.options.reconnectPolicy,this.registerOnLineListener(),this.closingLock=new sn,this.dataProcessLock=new sn,this.dcBufferStatus=new Map([[We.LOSSY,!0],[We.RELIABLE,!0]]),this.client.onParticipantUpdate=n=>this.emit(le.ParticipantUpdate,n),this.client.onConnectionQuality=n=>this.emit(le.ConnectionQualityUpdate,n),this.client.onRoomUpdate=n=>this.emit(le.RoomUpdate,n),this.client.onSubscriptionError=n=>this.emit(le.SubscriptionError,n),this.client.onSubscriptionPermissionUpdate=n=>this.emit(le.SubscriptionPermissionUpdate,n),this.client.onSpeakersChanged=n=>this.emit(le.SpeakersChanged,n),this.client.onStreamStateUpdate=n=>this.emit(le.StreamStateChanged,n),this.client.onRequestResponse=n=>this.emit(le.SignalRequestResponse,n)}get logContext(){var e,t,n,s,r,a;return{room:(t=(e=this.latestJoinResponse)===null||e===void 0?void 0:e.room)===null||t===void 0?void 0:t.name,roomID:(s=(n=this.latestJoinResponse)===null||n===void 0?void 0:n.room)===null||s===void 0?void 0:s.sid,participant:(a=(r=this.latestJoinResponse)===null||r===void 0?void 0:r.participant)===null||a===void 0?void 0:a.identity,pID:this.participantSid}}join(e,t,n,s){return P(this,void 0,void 0,function*(){this.url=e,this.token=t,this.signalOpts=n,this.maxJoinAttempts=n.maxRetries;try{this.joinAttempts+=1,this.setupSignalClientCallbacks();const r=yield this.client.join(e,t,n,s);return this._isClosed=!1,this.latestJoinResponse=r,this.subscriberPrimary=r.subscriberPrimary,this.pcManager||(yield this.configure(r)),(!this.subscriberPrimary||r.fastPublish)&&this.negotiate(),this.clientConfiguration=r.clientConfiguration,this.emit(le.SignalConnected,r),r}catch(r){if(r instanceof pt&&r.reason===Je.ServerUnreachable&&(this.log.warn("Couldn't connect to server, attempt ".concat(this.joinAttempts," of ").concat(this.maxJoinAttempts),this.logContext),this.joinAttempts<this.maxJoinAttempts))return this.join(e,t,n,s);throw r}})}close(){return P(this,void 0,void 0,function*(){const e=yield this.closingLock.lock();if(this.isClosed){e();return}try{this._isClosed=!0,this.joinAttempts=0,this.emit(le.Closing),this.removeAllListeners(),this.deregisterOnLineListener(),this.clearPendingReconnect(),yield this.cleanupPeerConnections(),yield this.cleanupClient()}finally{e()}})}cleanupPeerConnections(){return P(this,void 0,void 0,function*(){var e;yield(e=this.pcManager)===null||e===void 0?void 0:e.close(),this.pcManager=void 0;const t=n=>{n&&(n.close(),n.onbufferedamountlow=null,n.onclose=null,n.onclosing=null,n.onerror=null,n.onmessage=null,n.onopen=null)};t(this.lossyDC),t(this.lossyDCSub),t(this.reliableDC),t(this.reliableDCSub),this.lossyDC=void 0,this.lossyDCSub=void 0,this.reliableDC=void 0,this.reliableDCSub=void 0,this.reliableMessageBuffer=new Cf,this.reliableDataSequence=1,this.reliableReceivedState.clear()})}cleanupClient(){return P(this,void 0,void 0,function*(){yield this.client.close(),this.client.resetCallbacks()})}addTrack(e){if(this.pendingTrackResolvers[e.cid])throw new hi("a track with the same ID has already been published");return new Promise((t,n)=>{const s=setTimeout(()=>{delete this.pendingTrackResolvers[e.cid],n(new pt("publication of local track timed out, no response from server",Je.Timeout))},1e4);this.pendingTrackResolvers[e.cid]={resolve:r=>{clearTimeout(s),t(r)},reject:()=>{clearTimeout(s),n(new Error("Cancelled publication by calling unpublish"))}},this.client.sendAddTrack(e)})}removeTrack(e){if(e.track&&this.pendingTrackResolvers[e.track.id]){const{reject:t}=this.pendingTrackResolvers[e.track.id];t&&t(),delete this.pendingTrackResolvers[e.track.id]}try{return this.pcManager.removeTrack(e),!0}catch(t){this.log.warn("failed to remove track",Object.assign(Object.assign({},this.logContext),{error:t}))}return!1}updateMuteStatus(e,t){this.client.sendMuteTrack(e,t)}get dataSubscriberReadyState(){var e;return(e=this.reliableDCSub)===null||e===void 0?void 0:e.readyState}getConnectedServerAddress(){return P(this,void 0,void 0,function*(){var e;return(e=this.pcManager)===null||e===void 0?void 0:e.getConnectedAddress()})}setRegionUrlProvider(e){this.regionUrlProvider=e}configure(e){return P(this,void 0,void 0,function*(){var t,n;if(this.pcManager&&this.pcManager.currentState!==wt.NEW)return;this.participantSid=(t=e.participant)===null||t===void 0?void 0:t.sid;const s=this.makeRTCConfiguration(e);this.pcManager=new ab(s,e.subscriberPrimary,this.loggerOptions),this.emit(le.TransportsCreated,this.pcManager.publisher,this.pcManager.subscriber),this.pcManager.onIceCandidate=(r,a)=>{this.client.sendIceCandidate(r,a)},this.pcManager.onPublisherOffer=(r,a)=>{this.client.sendOffer(r,a)},this.pcManager.onDataChannel=this.handleDataChannel,this.pcManager.onStateChange=(r,a,o)=>P(this,void 0,void 0,function*(){if(this.log.debug("primary PC state changed ".concat(r),this.logContext),["closed","disconnected","failed"].includes(a)&&(this.publisherConnectionPromise=void 0),r===wt.CONNECTED){const d=this.pcState===In.New;this.pcState=In.Connected,d&&this.emit(le.Connected,e)}else r===wt.FAILED&&this.pcState===In.Connected&&(this.pcState=In.Disconnected,this.handleDisconnect("peerconnection failed",o==="failed"?Rs.RR_SUBSCRIBER_FAILED:Rs.RR_PUBLISHER_FAILED));const c=this.client.isDisconnected||this.client.currentState===Tt.RECONNECTING,l=[wt.FAILED,wt.CLOSING,wt.CLOSED].includes(r);c&&l&&!this._isClosed&&this.emit(le.Offline)}),this.pcManager.onTrack=r=>{this.emit(le.MediaTrackAdded,r.track,r.streams[0],r.receiver)},Ab((n=e.serverInfo)===null||n===void 0?void 0:n.protocol)||this.createDataChannels()})}setupSignalClientCallbacks(){this.client.onAnswer=(e,t)=>P(this,void 0,void 0,function*(){this.pcManager&&(this.log.debug("received server answer",Object.assign(Object.assign({},this.logContext),{RTCSdpType:e.type})),yield this.pcManager.setPublisherAnswer(e,t))}),this.client.onTrickle=(e,t)=>{this.pcManager&&(this.log.debug("got ICE candidate from peer",Object.assign(Object.assign({},this.logContext),{candidate:e,target:t})),this.pcManager.addIceCandidate(e,t))},this.client.onOffer=(e,t)=>P(this,void 0,void 0,function*(){if(this.latestRemoteOfferId=t,!this.pcManager)return;const n=yield this.pcManager.createSubscriberAnswerFromOffer(e,t);n&&this.client.sendAnswer(n,t)}),this.client.onLocalTrackPublished=e=>{var t;if(this.log.debug("received trackPublishedResponse",Object.assign(Object.assign({},this.logContext),{cid:e.cid,track:(t=e.track)===null||t===void 0?void 0:t.sid})),!this.pendingTrackResolvers[e.cid]){this.log.error("missing track resolver for ".concat(e.cid),Object.assign(Object.assign({},this.logContext),{cid:e.cid}));return}const{resolve:n}=this.pendingTrackResolvers[e.cid];delete this.pendingTrackResolvers[e.cid],n(e.track)},this.client.onLocalTrackUnpublished=e=>{this.emit(le.LocalTrackUnpublished,e)},this.client.onLocalTrackSubscribed=e=>{this.emit(le.LocalTrackSubscribed,e)},this.client.onTokenRefresh=e=>{this.token=e},this.client.onRemoteMuteChanged=(e,t)=>{this.emit(le.RemoteMute,e,t)},this.client.onSubscribedQualityUpdate=e=>{this.emit(le.SubscribedQualityUpdate,e)},this.client.onRoomMoved=e=>{var t;this.participantSid=(t=e.participant)===null||t===void 0?void 0:t.sid,this.latestJoinResponse&&(this.latestJoinResponse.room=e.room),this.emit(le.RoomMoved,e)},this.client.onClose=()=>{this.handleDisconnect("signal",Rs.RR_SIGNAL_DISCONNECTED)},this.client.onLeave=e=>{switch(this.log.debug("client leave request",Object.assign(Object.assign({},this.logContext),{reason:e==null?void 0:e.reason})),e.regions&&this.regionUrlProvider&&(this.log.debug("updating regions",this.logContext),this.regionUrlProvider.setServerReportedRegions(e.regions)),e.action){case Is.DISCONNECT:this.emit(le.Disconnected,e==null?void 0:e.reason),this.close();break;case Is.RECONNECT:this.fullReconnectOnNext=!0,this.handleDisconnect(qc);break;case Is.RESUME:this.handleDisconnect(qc)}}}makeRTCConfiguration(e){var t;const n=Object.assign({},this.rtcConfig);if(!((t=this.signalOpts)===null||t===void 0)&&t.e2eeEnabled&&(this.log.debug("E2EE - setting up transports with insertable streams",this.logContext),n.encodedInsertableStreams=!0),e.iceServers&&!n.iceServers){const s=[];e.iceServers.forEach(r=>{const a={urls:r.urls};r.username&&(a.username=r.username),r.credential&&(a.credential=r.credential),s.push(a)}),n.iceServers=s}return e.clientConfiguration&&e.clientConfiguration.forceRelay===Er.ENABLED&&(n.iceTransportPolicy="relay"),n.sdpSemantics="unified-plan",n.continualGatheringPolicy="gather_continually",n}createDataChannels(){this.pcManager&&(this.lossyDC&&(this.lossyDC.onmessage=null,this.lossyDC.onerror=null),this.reliableDC&&(this.reliableDC.onmessage=null,this.reliableDC.onerror=null),this.lossyDC=this.pcManager.createPublisherDataChannel(Hf,{ordered:!1,maxRetransmits:0}),this.reliableDC=this.pcManager.createPublisherDataChannel(Wf,{ordered:!0}),this.lossyDC.onmessage=this.handleDataMessage,this.reliableDC.onmessage=this.handleDataMessage,this.lossyDC.onerror=this.handleDataError,this.reliableDC.onerror=this.handleDataError,this.lossyDC.bufferedAmountLowThreshold=65535,this.reliableDC.bufferedAmountLowThreshold=65535,this.lossyDC.onbufferedamountlow=this.handleBufferedAmountLow,this.reliableDC.onbufferedamountlow=this.handleBufferedAmountLow)}createSender(e,t,n){return P(this,void 0,void 0,function*(){if(vc())return yield this.createTransceiverRTCRtpSender(e,t,n);if(bc())return this.log.warn("using add-track fallback",this.logContext),yield this.createRTCRtpSender(e.mediaStreamTrack);throw new Bt("Required webRTC APIs not supported on this device")})}createSimulcastSender(e,t,n,s){return P(this,void 0,void 0,function*(){if(vc())return this.createSimulcastTransceiverSender(e,t,n,s);if(bc())return this.log.debug("using add-track fallback",this.logContext),this.createRTCRtpSender(e.mediaStreamTrack);throw new Bt("Cannot stream on this device")})}createTransceiverRTCRtpSender(e,t,n){return P(this,void 0,void 0,function*(){if(!this.pcManager)throw new Bt("publisher is closed");const s=[];e.mediaStream&&s.push(e.mediaStream),Fi(e)&&(e.codec=t.videoCodec);const r={direction:"sendonly",streams:s};return n&&(r.sendEncodings=n),(yield this.pcManager.addPublisherTransceiver(e.mediaStreamTrack,r)).sender})}createSimulcastTransceiverSender(e,t,n,s){return P(this,void 0,void 0,function*(){if(!this.pcManager)throw new Bt("publisher is closed");const r={direction:"sendonly"};s&&(r.sendEncodings=s);const a=yield this.pcManager.addPublisherTransceiver(t.mediaStreamTrack,r);if(n.videoCodec)return e.setSimulcastTrackSender(n.videoCodec,a.sender),a.sender})}createRTCRtpSender(e){return P(this,void 0,void 0,function*(){if(!this.pcManager)throw new Bt("publisher is closed");return this.pcManager.addPublisherTrack(e)})}attemptReconnect(e){return P(this,void 0,void 0,function*(){var t,n,s;if(!this._isClosed){if(this.attemptingReconnect){Ke.warn("already attempting reconnect, returning early",this.logContext);return}(((t=this.clientConfiguration)===null||t===void 0?void 0:t.resumeConnection)===Er.DISABLED||((s=(n=this.pcManager)===null||n===void 0?void 0:n.currentState)!==null&&s!==void 0?s:wt.NEW)===wt.NEW)&&(this.fullReconnectOnNext=!0);try{this.attemptingReconnect=!0,this.fullReconnectOnNext?yield this.restartConnection():yield this.resumeConnection(e),this.clearPendingReconnect(),this.fullReconnectOnNext=!1}catch(r){this.reconnectAttempts+=1;let a=!0;r instanceof Bt?(this.log.debug("received unrecoverable error",Object.assign(Object.assign({},this.logContext),{error:r})),a=!1):r instanceof Fs||(this.fullReconnectOnNext=!0),a?this.handleDisconnect("reconnect",Rs.RR_UNKNOWN):(this.log.info("could not recover connection after ".concat(this.reconnectAttempts," attempts, ").concat(Date.now()-this.reconnectStart,"ms. giving up"),this.logContext),this.emit(le.Disconnected),yield this.close())}finally{this.attemptingReconnect=!1}}})}getNextRetryDelay(e){try{return this.reconnectPolicy.nextRetryDelayInMs(e)}catch(t){this.log.warn("encountered error in reconnect policy",Object.assign(Object.assign({},this.logContext),{error:t}))}return null}restartConnection(e){return P(this,void 0,void 0,function*(){var t,n,s;try{if(!this.url||!this.token)throw new Bt("could not reconnect, url or token not saved");this.log.info("reconnecting, attempt: ".concat(this.reconnectAttempts),this.logContext),this.emit(le.Restarting),this.client.isDisconnected||(yield this.client.sendLeave()),yield this.cleanupPeerConnections(),yield this.cleanupClient();let r;try{if(!this.signalOpts)throw this.log.warn("attempted connection restart, without signal options present",this.logContext),new Fs;r=yield this.join(e??this.url,this.token,this.signalOpts)}catch(a){throw a instanceof pt&&a.reason===Je.NotAllowed?new Bt("could not reconnect, token might be expired"):new Fs}if(this.shouldFailNext)throw this.shouldFailNext=!1,new Error("simulated failure");if(this.client.setReconnected(),this.emit(le.SignalRestarted,r),yield this.waitForPCReconnected(),this.client.currentState!==Tt.CONNECTED)throw new Fs("Signal connection got severed during reconnect");(t=this.regionUrlProvider)===null||t===void 0||t.resetAttempts(),this.emit(le.Restarted)}catch(r){const a=yield(n=this.regionUrlProvider)===null||n===void 0?void 0:n.getNextBestRegionUrl();if(a){yield this.restartConnection(a);return}else throw(s=this.regionUrlProvider)===null||s===void 0||s.resetAttempts(),r}})}resumeConnection(e){return P(this,void 0,void 0,function*(){var t;if(!this.url||!this.token)throw new Bt("could not reconnect, url or token not saved");if(!this.pcManager)throw new Bt("publisher and subscriber connections unset");this.log.info("resuming signal connection, attempt ".concat(this.reconnectAttempts),this.logContext),this.emit(le.Resuming);let n;try{this.setupSignalClientCallbacks(),n=yield this.client.reconnect(this.url,this.token,this.participantSid,e)}catch(s){let r="";throw s instanceof Error&&(r=s.message,this.log.error(s.message,Object.assign(Object.assign({},this.logContext),{error:s}))),s instanceof pt&&s.reason===Je.NotAllowed?new Bt("could not reconnect, token might be expired"):s instanceof pt&&s.reason===Je.LeaveRequest?s:new Fs(r)}if(this.emit(le.SignalResumed),n){const s=this.makeRTCConfiguration(n);this.pcManager.updateConfiguration(s),this.latestJoinResponse&&(this.latestJoinResponse.serverInfo=n.serverInfo)}else this.log.warn("Did not receive reconnect response",this.logContext);if(this.shouldFailNext)throw this.shouldFailNext=!1,new Error("simulated failure");if(yield this.pcManager.triggerIceRestart(),yield this.waitForPCReconnected(),this.client.currentState!==Tt.CONNECTED)throw new Fs("Signal connection got severed during reconnect");this.client.setReconnected(),((t=this.reliableDC)===null||t===void 0?void 0:t.readyState)==="open"&&this.reliableDC.id===null&&this.createDataChannels(),n!=null&&n.lastMessageSeq&&this.resendReliableMessagesForResume(n.lastMessageSeq),this.emit(le.Resumed)})}waitForPCInitialConnection(e,t){return P(this,void 0,void 0,function*(){if(!this.pcManager)throw new Bt("PC manager is closed");yield this.pcManager.ensurePCTransportConnection(t,e)})}waitForPCReconnected(){return P(this,void 0,void 0,function*(){this.pcState=In.Reconnecting,this.log.debug("waiting for peer connection to reconnect",this.logContext);try{if(yield on(Eb),!this.pcManager)throw new Bt("PC manager is closed");yield this.pcManager.ensurePCTransportConnection(void 0,this.peerConnectionTimeout),this.pcState=In.Connected}catch(e){throw this.pcState=In.Disconnected,new pt("could not establish PC connection, ".concat(e.message),Je.InternalError)}})}publishRpcResponse(e,t,n,s){return P(this,void 0,void 0,function*(){const r=new an({destinationIdentities:[e],kind:We.RELIABLE,value:{case:"rpcResponse",value:new Wu({requestId:t,value:s?{case:"error",value:s.toProto()}:{case:"payload",value:n??""}})}});yield this.sendDataPacket(r,We.RELIABLE)})}publishRpcAck(e,t){return P(this,void 0,void 0,function*(){const n=new an({destinationIdentities:[e],kind:We.RELIABLE,value:{case:"rpcAck",value:new Hu({requestId:t})}});yield this.sendDataPacket(n,We.RELIABLE)})}sendDataPacket(e,t){return P(this,void 0,void 0,function*(){yield this.ensurePublisherConnected(t),t===We.RELIABLE&&(e.sequence=this.reliableDataSequence,this.reliableDataSequence+=1);const n=e.toBinary(),s=this.dataChannelForKind(t);if(s){if(t===We.RELIABLE&&this.reliableMessageBuffer.push({data:n,sequence:e.sequence}),this.attemptingReconnect)return;s.send(n)}this.updateAndEmitDCBufferStatus(t)})}resendReliableMessagesForResume(e){return P(this,void 0,void 0,function*(){yield this.ensurePublisherConnected(We.RELIABLE);const t=this.dataChannelForKind(We.RELIABLE);t&&(this.reliableMessageBuffer.popToSequence(e),this.reliableMessageBuffer.getAll().forEach(n=>{t.send(n.data)})),this.updateAndEmitDCBufferStatus(We.RELIABLE)})}waitForBufferStatusLow(e){return new Promise((t,n)=>P(this,void 0,void 0,function*(){if(this.isBufferStatusLow(e))t();else{const s=()=>n("Engine closed");for(this.once(le.Closing,s);!this.dcBufferStatus.get(e);)yield on(10);this.off(le.Closing,s),t()}}))}ensureDataTransportConnected(e){return P(this,arguments,void 0,function(t){var n=this;let s=arguments.length>1&&arguments[1]!==void 0?arguments[1]:this.subscriberPrimary;return function*(){var r;if(!n.pcManager)throw new Bt("PC manager is closed");const a=s?n.pcManager.subscriber:n.pcManager.publisher,o=s?"Subscriber":"Publisher";if(!a)throw new pt("".concat(o," connection not set"),Je.InternalError);let c=!1;!s&&!n.dataChannelForKind(t,s)&&(n.createDataChannels(),c=!0),!c&&!s&&!n.pcManager.publisher.isICEConnected&&n.pcManager.publisher.getICEConnectionState()!=="checking"&&(c=!0),c&&n.negotiate();const l=n.dataChannelForKind(t,s);if((l==null?void 0:l.readyState)==="open")return;const d=new Date().getTime()+n.peerConnectionTimeout;for(;new Date().getTime()<d;){if(a.isICEConnected&&((r=n.dataChannelForKind(t,s))===null||r===void 0?void 0:r.readyState)==="open")return;yield on(50)}throw new pt("could not establish ".concat(o," connection, state: ").concat(a.getICEConnectionState()),Je.InternalError)}()})}ensurePublisherConnected(e){return P(this,void 0,void 0,function*(){this.publisherConnectionPromise||(this.publisherConnectionPromise=this.ensureDataTransportConnected(e,!1)),yield this.publisherConnectionPromise})}verifyTransport(){return!(!this.pcManager||this.pcManager.currentState!==wt.CONNECTED||!this.client.ws||this.client.ws.readyState===WebSocket.CLOSED)}negotiate(){return P(this,void 0,void 0,function*(){return new Promise((e,t)=>P(this,void 0,void 0,function*(){if(!this.pcManager){t(new uc("PC manager is closed"));return}this.pcManager.requirePublisher(),this.pcManager.publisher.getTransceivers().length==0&&!this.lossyDC&&!this.reliableDC&&this.createDataChannels();const n=new AbortController,s=()=>{n.abort(),this.log.debug("engine disconnected while negotiation was ongoing",this.logContext),e()};this.isClosed&&t("cannot negotiate on closed engine"),this.on(le.Closing,s),this.pcManager.publisher.once(Os.RTPVideoPayloadTypes,r=>{const a=new Map;r.forEach(o=>{const c=o.codec.toLowerCase();R0(c)&&a.set(o.payload,c)}),this.emit(le.RTPVideoMapUpdate,a)});try{yield this.pcManager.negotiate(n),e()}catch(r){r instanceof uc&&(this.fullReconnectOnNext=!0),this.handleDisconnect("negotiation",Rs.RR_UNKNOWN),t(r)}finally{this.off(le.Closing,s)}}))})}dataChannelForKind(e,t){if(t){if(e===We.LOSSY)return this.lossyDCSub;if(e===We.RELIABLE)return this.reliableDCSub}else{if(e===We.LOSSY)return this.lossyDC;if(e===We.RELIABLE)return this.reliableDC}}sendSyncState(e,t){var n,s;if(!this.pcManager){this.log.warn("sync state cannot be sent without peer connection setup",this.logContext);return}const r=this.pcManager.subscriber.getLocalDescription(),a=this.pcManager.subscriber.getRemoteDescription(),o=(s=(n=this.signalOpts)===null||n===void 0?void 0:n.autoSubscribe)!==null&&s!==void 0?s:!0,c=new Array,l=new Array;e.forEach(d=>{d.isDesired!==o&&c.push(d.trackSid),d.isEnabled||l.push(d.trackSid)}),this.client.sendSyncState(new lh({answer:r?Pa({sdp:r.sdp,type:r.type}):void 0,offer:a?Pa({sdp:a.sdp,type:a.type}):void 0,subscription:new va({trackSids:c,subscribe:!o,participantTracks:[]}),publishTracks:F0(t),dataChannels:this.dataChannelsInfo(),trackSidsDisabled:l,datachannelReceiveStates:this.reliableReceivedState.map((d,u)=>new dh({publisherSid:u,lastSeq:d}))}))}failNext(){this.shouldFailNext=!0}dataChannelsInfo(){const e=[],t=(n,s)=>{(n==null?void 0:n.id)!==void 0&&n.id!==null&&e.push(new uh({label:n.label,id:n.id,target:s}))};return t(this.dataChannelForKind(We.LOSSY),An.PUBLISHER),t(this.dataChannelForKind(We.RELIABLE),An.PUBLISHER),t(this.dataChannelForKind(We.LOSSY,!0),An.SUBSCRIBER),t(this.dataChannelForKind(We.RELIABLE,!0),An.SUBSCRIBER),e}clearReconnectTimeout(){this.reconnectTimeout&&$t.clearTimeout(this.reconnectTimeout)}clearPendingReconnect(){this.clearReconnectTimeout(),this.reconnectAttempts=0}registerOnLineListener(){cn()&&window.addEventListener("online",this.handleBrowserOnLine)}deregisterOnLineListener(){cn()&&window.removeEventListener("online",this.handleBrowserOnLine)}}class Fs extends Error{}function Ab(i){return i!==void 0&&i>13}function Rb(i,e){const t=i.participantIdentity?i.participantIdentity:e.participantIdentity;i.participantIdentity=t,e.participantIdentity=t;const n=i.destinationIdentities.length!==0?i.destinationIdentities:e.destinationIdentities;i.destinationIdentities=n,e.destinationIdentities=n}class jc{constructor(e,t){this.lastUpdateAt=0,this.settingsCacheTime=3e3,this.attemptedRegions=[],this.serverUrl=new URL(e),this.token=t}updateToken(e){this.token=e}isCloud(){return yc(this.serverUrl)}getServerUrl(){return this.serverUrl}getNextBestRegionUrl(e){return P(this,void 0,void 0,function*(){if(!this.isCloud())throw Error("region availability is only supported for LiveKit Cloud domains");(!this.regionSettings||Date.now()-this.lastUpdateAt>this.settingsCacheTime)&&(this.regionSettings=yield this.fetchRegionSettings(e));const t=this.regionSettings.regions.filter(n=>!this.attemptedRegions.find(s=>s.url===n.url));if(t.length>0){const n=t[0];return this.attemptedRegions.push(n),Ke.debug("next region: ".concat(n.region)),n.url}else return null})}resetAttempts(){this.attemptedRegions=[]}fetchRegionSettings(e){return P(this,void 0,void 0,function*(){const t=yield fetch("".concat(Pb(this.serverUrl),"/regions"),{headers:{authorization:"Bearer ".concat(this.token)},signal:e});if(t.ok){const n=yield t.json();return this.lastUpdateAt=Date.now(),n}else throw new pt("Could not fetch region settings: ".concat(t.statusText),t.status===401?Je.NotAllowed:Je.InternalError,t.status)})}setServerReportedRegions(e){this.regionSettings=e,this.lastUpdateAt=Date.now()}}function Pb(i){return"".concat(i.protocol.replace("ws","http"),"//").concat(i.host,"/settings")}class qf{get info(){return this._info}validateBytesReceived(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!1;if(!(typeof this.totalByteSize!="number"||this.totalByteSize===0)){if(e&&this.bytesReceived<this.totalByteSize)throw new Ui("Not enough chunk(s) received - expected ".concat(this.totalByteSize," bytes of data total, only received ").concat(this.bytesReceived," bytes"),Pn.Incomplete);if(this.bytesReceived>this.totalByteSize)throw new Ui("Extra chunk(s) received - expected ".concat(this.totalByteSize," bytes of data total, received ").concat(this.bytesReceived," bytes"),Pn.LengthExceeded)}}constructor(e,t,n,s){this.reader=t,this.totalByteSize=n,this._info=e,this.bytesReceived=0,this.outOfBandFailureRejectingFuture=s}}class kb extends qf{handleChunkReceived(e){var t;this.bytesReceived+=e.content.byteLength,this.validateBytesReceived();const n=this.totalByteSize?this.bytesReceived/this.totalByteSize:void 0;(t=this.onProgress)===null||t===void 0||t.call(this,n)}[Symbol.asyncIterator](){const e=this.reader.getReader();let t=new $n,n=null,s=null;if(this.signal){const a=this.signal;s=()=>{var o;(o=t.reject)===null||o===void 0||o.call(t,a.reason)},a.addEventListener("abort",s),n=a}const r=()=>{e.releaseLock(),n&&s&&n.removeEventListener("abort",s),this.signal=void 0};return{next:()=>P(this,void 0,void 0,function*(){var a,o;try{const{done:c,value:l}=yield Promise.race([e.read(),t.promise,(o=(a=this.outOfBandFailureRejectingFuture)===null||a===void 0?void 0:a.promise)!==null&&o!==void 0?o:new Promise(()=>{})]);return c?(this.validateBytesReceived(!0),{done:!0,value:void 0}):(this.handleChunkReceived(l),{done:!1,value:l.content})}catch(c){throw r(),c}}),return(){return P(this,void 0,void 0,function*(){return r(),{done:!0,value:void 0}})}}}withAbortSignal(e){return this.signal=e,this}readAll(){return P(this,arguments,void 0,function(){var e=this;let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};return function*(){var n,s,r,a;let o=new Set;const c=t.signal?e.withAbortSignal(t.signal):e;try{for(var l=!0,d=di(c),u;u=yield d.next(),n=u.done,!n;l=!0){a=u.value,l=!1;const h=a;o.add(h)}}catch(h){s={error:h}}finally{try{!l&&!n&&(r=d.return)&&(yield r.call(d))}finally{if(s)throw s.error}}return Array.from(o)}()})}}class Ib extends qf{constructor(e,t,n,s){super(e,t,n,s),this.receivedChunks=new Map}handleChunkReceived(e){var t;const n=Ra(e.chunkIndex),s=this.receivedChunks.get(n);if(s&&s.version>e.version)return;this.receivedChunks.set(n,e),this.bytesReceived+=e.content.byteLength,this.validateBytesReceived();const r=this.totalByteSize?this.bytesReceived/this.totalByteSize:void 0;(t=this.onProgress)===null||t===void 0||t.call(this,r)}[Symbol.asyncIterator](){const e=this.reader.getReader(),t=new TextDecoder("utf-8",{fatal:!0});let n=new $n,s=null,r=null;if(this.signal){const o=this.signal;r=()=>{var c;(c=n.reject)===null||c===void 0||c.call(n,o.reason)},o.addEventListener("abort",r),s=o}const a=()=>{e.releaseLock(),s&&r&&s.removeEventListener("abort",r),this.signal=void 0};return{next:()=>P(this,void 0,void 0,function*(){var o,c;try{const{done:l,value:d}=yield Promise.race([e.read(),n.promise,(c=(o=this.outOfBandFailureRejectingFuture)===null||o===void 0?void 0:o.promise)!==null&&c!==void 0?c:new Promise(()=>{})]);if(l)return this.validateBytesReceived(!0),{done:!0,value:void 0};{this.handleChunkReceived(d);let u;try{u=t.decode(d.content)}catch(h){throw new Ui("Cannot decode datastream chunk ".concat(d.chunkIndex," as text: ").concat(h),Pn.DecodeFailed)}return{done:!1,value:u}}}catch(l){throw a(),l}}),return(){return P(this,void 0,void 0,function*(){return a(),{done:!0,value:void 0}})}}}withAbortSignal(e){return this.signal=e,this}readAll(){return P(this,arguments,void 0,function(){var e=this;let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};return function*(){var n,s,r,a;let o="";const c=t.signal?e.withAbortSignal(t.signal):e;try{for(var l=!0,d=di(c),u;u=yield d.next(),n=u.done,!n;l=!0)a=u.value,l=!1,o+=a}catch(h){s={error:h}}finally{try{!l&&!n&&(r=d.return)&&(yield r.call(d))}finally{if(s)throw s.error}}return o}()})}}class Db{constructor(){this.log=Ke,this.byteStreamControllers=new Map,this.textStreamControllers=new Map,this.byteStreamHandlers=new Map,this.textStreamHandlers=new Map}registerTextStreamHandler(e,t){if(this.textStreamHandlers.has(e))throw new Ui('A text stream handler for topic "'.concat(e,'" has already been set.'),Pn.HandlerAlreadyRegistered);this.textStreamHandlers.set(e,t)}unregisterTextStreamHandler(e){this.textStreamHandlers.delete(e)}registerByteStreamHandler(e,t){if(this.byteStreamHandlers.has(e))throw new Ui('A byte stream handler for topic "'.concat(e,'" has already been set.'),Pn.HandlerAlreadyRegistered);this.byteStreamHandlers.set(e,t)}unregisterByteStreamHandler(e){this.byteStreamHandlers.delete(e)}clearHandlersAndControllers(){this.byteStreamControllers.clear(),this.textStreamControllers.clear(),this.byteStreamHandlers.clear(),this.textStreamHandlers.clear()}validateParticipantHasNoActiveDataStreams(e){var t,n,s,r;const a=Array.from(this.textStreamControllers.entries()).filter(c=>c[1].sendingParticipantIdentity===e),o=Array.from(this.byteStreamControllers.entries()).filter(c=>c[1].sendingParticipantIdentity===e);if(a.length>0||o.length>0){const c=new Ui("Participant ".concat(e," unexpectedly disconnected in the middle of sending data"),Pn.AbnormalEnd);for(const[l,d]of o)(n=(t=d.outOfBandFailureRejectingFuture).reject)===null||n===void 0||n.call(t,c),this.byteStreamControllers.delete(l);for(const[l,d]of a)(r=(s=d.outOfBandFailureRejectingFuture).reject)===null||r===void 0||r.call(s,c),this.textStreamControllers.delete(l)}}handleDataStreamPacket(e){return P(this,void 0,void 0,function*(){switch(e.value.case){case"streamHeader":return this.handleStreamHeader(e.value.value,e.participantIdentity);case"streamChunk":return this.handleStreamChunk(e.value.value);case"streamTrailer":return this.handleStreamTrailer(e.value.value);default:throw new Error('DataPacket of value "'.concat(e.value.case,'" is not data stream related!'))}})}handleStreamHeader(e,t){return P(this,void 0,void 0,function*(){var n;if(e.contentHeader.case==="byteHeader"){const s=this.byteStreamHandlers.get(e.topic);if(!s){this.log.debug("ignoring incoming byte stream due to no handler for topic",e.topic);return}let r;const a=new $n,o={id:e.streamId,name:(n=e.contentHeader.value.name)!==null&&n!==void 0?n:"unknown",mimeType:e.mimeType,size:e.totalLength?Number(e.totalLength):void 0,topic:e.topic,timestamp:Ra(e.timestamp),attributes:e.attributes},c=new ReadableStream({start:l=>{if(r=l,this.textStreamControllers.has(e.streamId))throw new Ui("A data stream read is already in progress for a stream with id ".concat(e.streamId,"."),Pn.AlreadyOpened);this.byteStreamControllers.set(e.streamId,{info:o,controller:r,startTime:Date.now(),sendingParticipantIdentity:t,outOfBandFailureRejectingFuture:a})}});s(new kb(o,c,Ra(e.totalLength),a),{identity:t})}else if(e.contentHeader.case==="textHeader"){const s=this.textStreamHandlers.get(e.topic);if(!s){this.log.debug("ignoring incoming text stream due to no handler for topic",e.topic);return}let r;const a=new $n,o={id:e.streamId,mimeType:e.mimeType,size:e.totalLength?Number(e.totalLength):void 0,topic:e.topic,timestamp:Number(e.timestamp),attributes:e.attributes},c=new ReadableStream({start:l=>{if(r=l,this.textStreamControllers.has(e.streamId))throw new Ui("A data stream read is already in progress for a stream with id ".concat(e.streamId,"."),Pn.AlreadyOpened);this.textStreamControllers.set(e.streamId,{info:o,controller:r,startTime:Date.now(),sendingParticipantIdentity:t,outOfBandFailureRejectingFuture:a})}});s(new Ib(o,c,Ra(e.totalLength),a),{identity:t})}})}handleStreamChunk(e){const t=this.byteStreamControllers.get(e.streamId);t&&e.content.length>0&&t.controller.enqueue(e);const n=this.textStreamControllers.get(e.streamId);n&&e.content.length>0&&n.controller.enqueue(e)}handleStreamTrailer(e){const t=this.textStreamControllers.get(e.streamId);t&&(t.info.attributes=Object.assign(Object.assign({},t.info.attributes),e.attributes),t.controller.close(),this.textStreamControllers.delete(e.streamId));const n=this.byteStreamControllers.get(e.streamId);n&&(n.info.attributes=Object.assign(Object.assign({},n.info.attributes),e.attributes),n.controller.close(),this.byteStreamControllers.delete(e.streamId))}}class jf{constructor(e,t,n){this.writableStream=e,this.defaultWriter=e.getWriter(),this.onClose=n,this.info=t}write(e){return this.defaultWriter.write(e)}close(){return P(this,void 0,void 0,function*(){var e;yield this.defaultWriter.close(),this.defaultWriter.releaseLock(),(e=this.onClose)===null||e===void 0||e.call(this)})}}class Lb extends jf{}class Nb extends jf{}const $f=15e3;class Ub{constructor(e,t){this.engine=e,this.log=t}setupEngine(e){this.engine=e}sendText(e,t){return P(this,void 0,void 0,function*(){var n;const s=crypto.randomUUID(),a=new TextEncoder().encode(e).byteLength,o=(n=t==null?void 0:t.attachments)===null||n===void 0?void 0:n.map(()=>crypto.randomUUID()),c=new Array(o?o.length+1:1).fill(0),l=(u,h)=>{var f;c[h]=u;const g=c.reduce((v,m)=>v+m,0);(f=t==null?void 0:t.onProgress)===null||f===void 0||f.call(t,g)},d=yield this.streamText({streamId:s,totalSize:a,destinationIdentities:t==null?void 0:t.destinationIdentities,topic:t==null?void 0:t.topic,attachedStreamIds:o,attributes:t==null?void 0:t.attributes});return yield d.write(e),l(1,0),yield d.close(),t!=null&&t.attachments&&o&&(yield Promise.all(t.attachments.map((u,h)=>P(this,void 0,void 0,function*(){return this._sendFile(o[h],u,{topic:t.topic,mimeType:u.type,onProgress:f=>{l(f,h+1)}})})))),d.info})}streamText(e){return P(this,void 0,void 0,function*(){var t,n;const s=(t=e==null?void 0:e.streamId)!==null&&t!==void 0?t:crypto.randomUUID(),r={id:s,mimeType:"text/plain",timestamp:Date.now(),topic:(n=e==null?void 0:e.topic)!==null&&n!==void 0?n:"",size:e==null?void 0:e.totalSize,attributes:e==null?void 0:e.attributes},a=new Ho({streamId:s,mimeType:r.mimeType,topic:r.topic,timestamp:cs(r.timestamp),totalLength:cs(e==null?void 0:e.totalSize),attributes:r.attributes,contentHeader:{case:"textHeader",value:new Qu({version:e==null?void 0:e.version,attachedStreamIds:e==null?void 0:e.attachedStreamIds,replyToStreamId:e==null?void 0:e.replyToStreamId,operationType:(e==null?void 0:e.type)==="update"?Go.UPDATE:Go.CREATE})}}),o=e==null?void 0:e.destinationIdentities,c=new an({destinationIdentities:o,value:{case:"streamHeader",value:a}});yield this.engine.sendDataPacket(c,We.RELIABLE);let l=0;const d=this.engine,u=new WritableStream({write(g){return P(this,void 0,void 0,function*(){for(const v of N0(g,$f)){yield d.waitForBufferStatusLow(We.RELIABLE);const m=new Wo({content:v,streamId:s,chunkIndex:cs(l)}),p=new an({destinationIdentities:o,value:{case:"streamChunk",value:m}});yield d.sendDataPacket(p,We.RELIABLE),l+=1}})},close(){return P(this,void 0,void 0,function*(){const g=new qo({streamId:s}),v=new an({destinationIdentities:o,value:{case:"streamTrailer",value:g}});yield d.sendDataPacket(v,We.RELIABLE)})},abort(g){console.log("Sink error:",g)}});let h=()=>P(this,void 0,void 0,function*(){yield f.close()});d.once(le.Closing,h);const f=new Lb(u,r,()=>this.engine.off(le.Closing,h));return f})}sendFile(e,t){return P(this,void 0,void 0,function*(){const n=crypto.randomUUID();return yield this._sendFile(n,e,t),{id:n}})}_sendFile(e,t,n){return P(this,void 0,void 0,function*(){var s;const r=yield this.streamBytes({streamId:e,totalSize:t.size,name:t.name,mimeType:(s=n==null?void 0:n.mimeType)!==null&&s!==void 0?s:t.type,topic:n==null?void 0:n.topic,destinationIdentities:n==null?void 0:n.destinationIdentities}),a=t.stream().getReader();for(;;){const{done:o,value:c}=yield a.read();if(o)break;yield r.write(c)}return yield r.close(),r.info})}streamBytes(e){return P(this,void 0,void 0,function*(){var t,n,s,r,a;const o=(t=e==null?void 0:e.streamId)!==null&&t!==void 0?t:crypto.randomUUID(),c=e==null?void 0:e.destinationIdentities,l={id:o,mimeType:(n=e==null?void 0:e.mimeType)!==null&&n!==void 0?n:"application/octet-stream",topic:(s=e==null?void 0:e.topic)!==null&&s!==void 0?s:"",timestamp:Date.now(),attributes:e==null?void 0:e.attributes,size:e==null?void 0:e.totalSize,name:(r=e==null?void 0:e.name)!==null&&r!==void 0?r:"unknown"},d=new Ho({totalLength:cs((a=l.size)!==null&&a!==void 0?a:0),mimeType:l.mimeType,streamId:o,topic:l.topic,timestamp:cs(Date.now()),attributes:l.attributes,contentHeader:{case:"byteHeader",value:new eh({name:l.name})}}),u=new an({destinationIdentities:c,value:{case:"streamHeader",value:d}});yield this.engine.sendDataPacket(u,We.RELIABLE);let h=0;const f=new sn,g=this.engine,v=this.log,m=new WritableStream({write(x){return P(this,void 0,void 0,function*(){const C=yield f.lock();let b=0;try{for(;b<x.byteLength;){const S=x.slice(b,b+$f);yield g.waitForBufferStatusLow(We.RELIABLE);const M=new an({destinationIdentities:c,value:{case:"streamChunk",value:new Wo({content:S,streamId:o,chunkIndex:cs(h)})}});yield g.sendDataPacket(M,We.RELIABLE),h+=1,b+=S.byteLength}}finally{C()}})},close(){return P(this,void 0,void 0,function*(){const x=new qo({streamId:o}),C=new an({destinationIdentities:c,value:{case:"streamTrailer",value:x}});yield g.sendDataPacket(C,We.RELIABLE)})},abort(x){v.error("Sink error:",x)}});return new Nb(m,l)})}}class Xf extends Z{constructor(e,t,n,s,r){super(e,n,r),this.sid=t,this.receiver=s}get isLocal(){return!1}setMuted(e){this.isMuted!==e&&(this.isMuted=e,this._mediaStreamTrack.enabled=!e,this.emit(e?ae.Muted:ae.Unmuted,this))}setMediaStream(e){this.mediaStream=e;const t=n=>{n.track===this._mediaStreamTrack&&(e.removeEventListener("removetrack",t),this.receiver&&"playoutDelayHint"in this.receiver&&(this.receiver.playoutDelayHint=void 0),this.receiver=void 0,this._currentBitrate=0,this.emit(ae.Ended,this))};e.addEventListener("removetrack",t)}start(){this.startMonitor(),super.enable()}stop(){this.stopMonitor(),super.disable()}getRTCStatsReport(){return P(this,void 0,void 0,function*(){var e;return!((e=this.receiver)===null||e===void 0)&&e.getStats?yield this.receiver.getStats():void 0})}setPlayoutDelay(e){this.receiver?"playoutDelayHint"in this.receiver?this.receiver.playoutDelayHint=e:this.log.warn("Playout delay not supported in this browser"):this.log.warn("Cannot set playout delay, track already ended")}getPlayoutDelay(){if(this.receiver){if("playoutDelayHint"in this.receiver)return this.receiver.playoutDelayHint;this.log.warn("Playout delay not supported in this browser")}else this.log.warn("Cannot get playout delay, track already ended");return 0}startMonitor(){this.monitorInterval||(this.monitorInterval=setInterval(()=>this.monitorReceiver(),Vc)),B0()&&this.registerTimeSyncUpdate()}registerTimeSyncUpdate(){const e=()=>{var t;this.timeSyncHandle=requestAnimationFrame(()=>e());const n=(t=this.receiver)===null||t===void 0?void 0:t.getSynchronizationSources()[0];if(n){const{timestamp:s,rtpTimestamp:r}=n;r&&this.rtpTimestamp!==r&&(this.emit(ae.TimeSyncUpdate,{timestamp:s,rtpTimestamp:r}),this.rtpTimestamp=r)}};e()}}class Ob extends Xf{constructor(e,t,n,s,r,a){super(e,t,Z.Kind.Audio,n,a),this.monitorReceiver=()=>P(this,void 0,void 0,function*(){if(!this.receiver){this._currentBitrate=0;return}const o=yield this.getReceiverStats();o&&this.prevStats&&this.receiver&&(this._currentBitrate=ka(o,this.prevStats)),this.prevStats=o}),this.audioContext=s,this.webAudioPluginNodes=[],r&&(this.sinkId=r.deviceId)}setVolume(e){var t;for(const n of this.attachedElements)this.audioContext?(t=this.gainNode)===null||t===void 0||t.gain.setTargetAtTime(e,0,.1):n.volume=e;qn()&&this._mediaStreamTrack._setVolume(e),this.elementVolume=e}getVolume(){if(this.elementVolume)return this.elementVolume;if(qn())return 1;let e=0;return this.attachedElements.forEach(t=>{t.volume>e&&(e=t.volume)}),e}setSinkId(e){return P(this,void 0,void 0,function*(){this.sinkId=e,yield Promise.all(this.attachedElements.map(t=>{if(_c(t))return t.setSinkId(e)}))})}attach(e){const t=this.attachedElements.length===0;return e?super.attach(e):e=super.attach(),this.sinkId&&_c(e)&&e.setSinkId(this.sinkId).catch(n=>{this.log.error("Failed to set sink id on remote audio track",n,this.logContext)}),this.audioContext&&t&&(this.log.debug("using audio context mapping",this.logContext),this.connectWebAudio(this.audioContext,e),e.volume=0,e.muted=!0),this.elementVolume&&this.setVolume(this.elementVolume),e}detach(e){let t;return e?(t=super.detach(e),this.audioContext&&(this.attachedElements.length>0?this.connectWebAudio(this.audioContext,this.attachedElements[0]):this.disconnectWebAudio())):(t=super.detach(),this.disconnectWebAudio()),t}setAudioContext(e){this.audioContext=e,e&&this.attachedElements.length>0?this.connectWebAudio(e,this.attachedElements[0]):e||this.disconnectWebAudio()}setWebAudioPlugins(e){this.webAudioPluginNodes=e,this.attachedElements.length>0&&this.audioContext&&this.connectWebAudio(this.audioContext,this.attachedElements[0])}connectWebAudio(e,t){this.disconnectWebAudio(),this.sourceNode=e.createMediaStreamSource(t.srcObject);let n=this.sourceNode;this.webAudioPluginNodes.forEach(s=>{n.connect(s),n=s}),this.gainNode=e.createGain(),n.connect(this.gainNode),this.gainNode.connect(e.destination),this.elementVolume&&this.gainNode.gain.setTargetAtTime(this.elementVolume,0,.1),e.state!=="running"&&e.resume().then(()=>{e.state!=="running"&&this.emit(ae.AudioPlaybackFailed,new Error("Audio Context couldn't be started automatically"))}).catch(s=>{this.emit(ae.AudioPlaybackFailed,s)})}disconnectWebAudio(){var e,t;(e=this.gainNode)===null||e===void 0||e.disconnect(),(t=this.sourceNode)===null||t===void 0||t.disconnect(),this.gainNode=void 0,this.sourceNode=void 0}getReceiverStats(){return P(this,void 0,void 0,function*(){if(!this.receiver||!this.receiver.getStats)return;const e=yield this.receiver.getStats();let t;return e.forEach(n=>{n.type==="inbound-rtp"&&(t={type:"audio",streamId:n.id,timestamp:n.timestamp,jitter:n.jitter,bytesReceived:n.bytesReceived,concealedSamples:n.concealedSamples,concealmentEvents:n.concealmentEvents,silentConcealedSamples:n.silentConcealedSamples,silentConcealmentEvents:n.silentConcealmentEvents,totalAudioEnergy:n.totalAudioEnergy,totalSamplesDuration:n.totalSamplesDuration})}),t})}}const $c=100;class Fb extends Xf{constructor(e,t,n,s,r){super(e,t,Z.Kind.Video,n,r),this.elementInfos=[],this.monitorReceiver=()=>P(this,void 0,void 0,function*(){if(!this.receiver){this._currentBitrate=0;return}const a=yield this.getReceiverStats();a&&this.prevStats&&this.receiver&&(this._currentBitrate=ka(a,this.prevStats)),this.prevStats=a}),this.debouncedHandleResize=Uc(()=>{this.updateDimensions()},$c),this.adaptiveStreamSettings=s}get isAdaptiveStream(){return this.adaptiveStreamSettings!==void 0}setStreamState(e){super.setStreamState(e),console.log("setStreamState",e),e===Z.StreamState.Active&&this.updateVisibility()}get mediaStreamTrack(){return this._mediaStreamTrack}setMuted(e){super.setMuted(e),this.attachedElements.forEach(t=>{e?Ns(this._mediaStreamTrack,t):Ls(this._mediaStreamTrack,t)})}attach(e){if(e?super.attach(e):e=super.attach(),this.adaptiveStreamSettings&&this.elementInfos.find(t=>t.element===e)===void 0){const t=new Bb(e);this.observeElementInfo(t)}return e}observeElementInfo(e){this.adaptiveStreamSettings&&this.elementInfos.find(t=>t===e)===void 0?(e.handleResize=()=>{this.debouncedHandleResize()},e.handleVisibilityChanged=()=>{this.updateVisibility()},this.elementInfos.push(e),e.observe(),this.debouncedHandleResize(),this.updateVisibility()):this.log.warn("visibility resize observer not triggered",this.logContext)}stopObservingElementInfo(e){if(!this.isAdaptiveStream){this.log.warn("stopObservingElementInfo ignored",this.logContext);return}const t=this.elementInfos.filter(n=>n===e);for(const n of t)n.stopObserving();this.elementInfos=this.elementInfos.filter(n=>n!==e),this.updateVisibility(),this.debouncedHandleResize()}detach(e){let t=[];if(e)return this.stopObservingElement(e),super.detach(e);t=super.detach();for(const n of t)this.stopObservingElement(n);return t}getDecoderImplementation(){var e;return(e=this.prevStats)===null||e===void 0?void 0:e.decoderImplementation}getReceiverStats(){return P(this,void 0,void 0,function*(){if(!this.receiver||!this.receiver.getStats)return;const e=yield this.receiver.getStats();let t,n="",s=new Map;return e.forEach(r=>{r.type==="inbound-rtp"?(n=r.codecId,t={type:"video",streamId:r.id,framesDecoded:r.framesDecoded,framesDropped:r.framesDropped,framesReceived:r.framesReceived,packetsReceived:r.packetsReceived,packetsLost:r.packetsLost,frameWidth:r.frameWidth,frameHeight:r.frameHeight,pliCount:r.pliCount,firCount:r.firCount,nackCount:r.nackCount,jitter:r.jitter,timestamp:r.timestamp,bytesReceived:r.bytesReceived,decoderImplementation:r.decoderImplementation}):r.type==="codec"&&s.set(r.id,r)}),t&&n!==""&&s.get(n)&&(t.mimeType=s.get(n).mimeType),t})}stopObservingElement(e){const t=this.elementInfos.filter(n=>n.element===e);for(const n of t)this.stopObservingElementInfo(n)}handleAppVisibilityChanged(){const e=Object.create(null,{handleAppVisibilityChanged:{get:()=>super.handleAppVisibilityChanged}});return P(this,void 0,void 0,function*(){yield e.handleAppVisibilityChanged.call(this),this.isAdaptiveStream&&this.updateVisibility()})}updateVisibility(e){var t,n;const s=this.elementInfos.reduce((c,l)=>Math.max(c,l.visibilityChangedAt||0),0),r=!((n=(t=this.adaptiveStreamSettings)===null||t===void 0?void 0:t.pauseVideoInBackground)!==null&&n!==void 0)||n?this.isInBackground:!1,a=this.elementInfos.some(c=>c.pictureInPicture),o=this.elementInfos.some(c=>c.visible)&&!r||a;if(!(this.lastVisible===o&&!e)){if(!o&&Date.now()-s<$c){$t.setTimeout(()=>{this.updateVisibility()},$c);return}this.lastVisible=o,this.emit(ae.VisibilityChanged,o,this)}}updateDimensions(){var e,t;let n=0,s=0;const r=this.getPixelDensity();for(const a of this.elementInfos){const o=a.width()*r,c=a.height()*r;o+c>n+s&&(n=o,s=c)}((e=this.lastDimensions)===null||e===void 0?void 0:e.width)===n&&((t=this.lastDimensions)===null||t===void 0?void 0:t.height)===s||(this.lastDimensions={width:n,height:s},this.emit(ae.VideoDimensionsChanged,this.lastDimensions,this))}getPixelDensity(){var e;const t=(e=this.adaptiveStreamSettings)===null||e===void 0?void 0:e.pixelDensity;return t==="screen"?hf():t||(hf()>2?2:1)}}class Bb{get visible(){return this.isPiP||this.isIntersecting}get pictureInPicture(){return this.isPiP}constructor(e,t){this.onVisibilityChanged=n=>{var s;const{target:r,isIntersecting:a}=n;r===this.element&&(this.isIntersecting=a,this.isPiP=Ur(this.element),this.visibilityChangedAt=Date.now(),(s=this.handleVisibilityChanged)===null||s===void 0||s.call(this))},this.onEnterPiP=()=>{var n,s,r;(s=(n=window.documentPictureInPicture)===null||n===void 0?void 0:n.window)===null||s===void 0||s.addEventListener("pagehide",this.onLeavePiP),this.isPiP=Ur(this.element),(r=this.handleVisibilityChanged)===null||r===void 0||r.call(this)},this.onLeavePiP=()=>{var n;this.isPiP=Ur(this.element),(n=this.handleVisibilityChanged)===null||n===void 0||n.call(this)},this.element=e,this.isIntersecting=t??Xc(e),this.isPiP=cn()&&Ur(e),this.visibilityChangedAt=0}width(){return this.element.clientWidth}height(){return this.element.clientHeight}observe(){var e,t,n;this.isIntersecting=Xc(this.element),this.isPiP=Ur(this.element),this.element.handleResize=()=>{var s;(s=this.handleResize)===null||s===void 0||s.call(this)},this.element.handleVisibilityChanged=this.onVisibilityChanged,pf().observe(this.element),ff().observe(this.element),this.element.addEventListener("enterpictureinpicture",this.onEnterPiP),this.element.addEventListener("leavepictureinpicture",this.onLeavePiP),(e=window.documentPictureInPicture)===null||e===void 0||e.addEventListener("enter",this.onEnterPiP),(n=(t=window.documentPictureInPicture)===null||t===void 0?void 0:t.window)===null||n===void 0||n.addEventListener("pagehide",this.onLeavePiP)}stopObserving(){var e,t,n,s,r;(e=pf())===null||e===void 0||e.unobserve(this.element),(t=ff())===null||t===void 0||t.unobserve(this.element),this.element.removeEventListener("enterpictureinpicture",this.onEnterPiP),this.element.removeEventListener("leavepictureinpicture",this.onLeavePiP),(n=window.documentPictureInPicture)===null||n===void 0||n.removeEventListener("enter",this.onEnterPiP),(r=(s=window.documentPictureInPicture)===null||s===void 0?void 0:s.window)===null||r===void 0||r.removeEventListener("pagehide",this.onLeavePiP)}}function Ur(i){var e,t;return document.pictureInPictureElement===i?!0:!((e=window.documentPictureInPicture)===null||e===void 0)&&e.window?Xc(i,(t=window.documentPictureInPicture)===null||t===void 0?void 0:t.window):!1}function Xc(i,e){const t=e||window;let n=i.offsetTop,s=i.offsetLeft;const r=i.offsetWidth,a=i.offsetHeight,{hidden:o}=i,{display:c}=getComputedStyle(i);for(;i.offsetParent;)i=i.offsetParent,n+=i.offsetTop,s+=i.offsetLeft;return n<t.pageYOffset+t.innerHeight&&s<t.pageXOffset+t.innerWidth&&n+a>t.pageYOffset&&s+r>t.pageXOffset&&!o&&c!=="none"}class pi extends Hn.EventEmitter{constructor(e,t,n,s){var r;super(),this.metadataMuted=!1,this.encryption=hn.NONE,this.log=Ke,this.handleMuted=()=>{this.emit(ae.Muted)},this.handleUnmuted=()=>{this.emit(ae.Unmuted)},this.log=li((r=s==null?void 0:s.loggerName)!==null&&r!==void 0?r:Rn.Publication),this.loggerContextCb=this.loggerContextCb,this.setMaxListeners(100),this.kind=e,this.trackSid=t,this.trackName=n,this.source=Z.Source.Unknown}setTrack(e){this.track&&(this.track.off(ae.Muted,this.handleMuted),this.track.off(ae.Unmuted,this.handleUnmuted)),this.track=e,e&&(e.on(ae.Muted,this.handleMuted),e.on(ae.Unmuted,this.handleUnmuted))}get logContext(){var e;return Object.assign(Object.assign({},(e=this.loggerContextCb)===null||e===void 0?void 0:e.call(this)),Xe(this))}get isMuted(){return this.metadataMuted}get isEnabled(){return!0}get isSubscribed(){return this.track!==void 0}get isEncrypted(){return this.encryption!==hn.NONE}get audioTrack(){if(Xn(this.track))return this.track}get videoTrack(){if(Fi(this.track))return this.track}updateInfo(e){this.trackSid=e.sid,this.trackName=e.name,this.source=Z.sourceFromProto(e.source),this.mimeType=e.mimeType,this.kind===Z.Kind.Video&&e.width>0&&(this.dimensions={width:e.width,height:e.height},this.simulcasted=e.simulcast),this.encryption=e.encryption,this.trackInfo=e,this.log.debug("update publication info",Object.assign(Object.assign({},this.logContext),{info:e}))}}(function(i){(function(e){e.Desired="desired",e.Subscribed="subscribed",e.Unsubscribed="unsubscribed"})(i.SubscriptionStatus||(i.SubscriptionStatus={})),function(e){e.Allowed="allowed",e.NotAllowed="not_allowed"}(i.PermissionStatus||(i.PermissionStatus={}))})(pi||(pi={}));class Kc extends pi{get isUpstreamPaused(){var e;return(e=this.track)===null||e===void 0?void 0:e.isUpstreamPaused}constructor(e,t,n,s){super(e,t.sid,t.name,s),this.track=void 0,this.handleTrackEnded=()=>{this.emit(ae.Ended)},this.handleCpuConstrained=()=>{this.track&&Fi(this.track)&&this.emit(ae.CpuConstrained,this.track)},this.updateInfo(t),this.setTrack(n)}setTrack(e){this.track&&(this.track.off(ae.Ended,this.handleTrackEnded),this.track.off(ae.CpuConstrained,this.handleCpuConstrained)),super.setTrack(e),e&&(e.on(ae.Ended,this.handleTrackEnded),e.on(ae.CpuConstrained,this.handleCpuConstrained))}get isMuted(){return this.track?this.track.isMuted:super.isMuted}get audioTrack(){return super.audioTrack}get videoTrack(){return super.videoTrack}get isLocal(){return!0}mute(){return P(this,void 0,void 0,function*(){var e;return(e=this.track)===null||e===void 0?void 0:e.mute()})}unmute(){return P(this,void 0,void 0,function*(){var e;return(e=this.track)===null||e===void 0?void 0:e.unmute()})}pauseUpstream(){return P(this,void 0,void 0,function*(){var e;yield(e=this.track)===null||e===void 0?void 0:e.pauseUpstream()})}resumeUpstream(){return P(this,void 0,void 0,function*(){var e;yield(e=this.track)===null||e===void 0?void 0:e.resumeUpstream()})}getTrackFeatures(){var e;if(Xn(this.track)){const t=this.track.getSourceTrackSettings(),n=new Set;return t.autoGainControl&&n.add(Ht.TF_AUTO_GAIN_CONTROL),t.echoCancellation&&n.add(Ht.TF_ECHO_CANCELLATION),t.noiseSuppression&&n.add(Ht.TF_NOISE_SUPPRESSION),t.channelCount&&t.channelCount>1&&n.add(Ht.TF_STEREO),!((e=this.options)===null||e===void 0)&&e.dtx||n.add(Ht.TF_NO_DTX),this.track.enhancedNoiseCancellation&&n.add(Ht.TF_ENHANCED_NOISE_CANCELLATION),Array.from(n.values())}else return[]}}function La(i,e){return P(this,void 0,void 0,function*(){i??(i={});let t=!1;const{audioProcessor:n,videoProcessor:s,optionsWithoutProcessor:r}=yf(i);let a=r.audio,o=r.video;if(n&&typeof r.audio=="object"&&(r.audio.processor=n),s&&typeof r.video=="object"&&(r.video.processor=s),i.audio&&typeof r.audio=="object"&&typeof r.audio.deviceId=="string"){const u=r.audio.deviceId;r.audio.deviceId={exact:u},t=!0,a=Object.assign(Object.assign({},r.audio),{deviceId:{ideal:u}})}if(r.video&&typeof r.video=="object"&&typeof r.video.deviceId=="string"){const u=r.video.deviceId;r.video.deviceId={exact:u},t=!0,o=Object.assign(Object.assign({},r.video),{deviceId:{ideal:u}})}(r.audio===!0||typeof r.audio=="object"&&!r.audio.deviceId)&&(r.audio={deviceId:"default"}),r.video===!0?r.video={deviceId:"default"}:typeof r.video=="object"&&!r.video.deviceId&&(r.video.deviceId="default");const c=vf(r,If,Df),l=Ac(c),d=navigator.mediaDevices.getUserMedia(l);r.audio&&(Wt.userMediaPromiseMap.set("audioinput",d),d.catch(()=>Wt.userMediaPromiseMap.delete("audioinput"))),r.video&&(Wt.userMediaPromiseMap.set("videoinput",d),d.catch(()=>Wt.userMediaPromiseMap.delete("videoinput")));try{const u=yield d;return yield Promise.all(u.getTracks().map(h=>P(this,void 0,void 0,function*(){const f=h.kind==="audio";let g=f?c.audio:c.video;(typeof g=="boolean"||!g)&&(g={});let v;const m=f?l.audio:l.video;typeof m!="boolean"&&(v=m);const p=h.getSettings().deviceId;v!=null&&v.deviceId&&Oi(v.deviceId)!==p?v.deviceId=p:v||(v={deviceId:p});const x=fb(h,v,e);return x.kind===Z.Kind.Video?x.source=Z.Source.Camera:x.kind===Z.Kind.Audio&&(x.source=Z.Source.Microphone),x.mediaStream=u,Xn(x)&&n?yield x.setProcessor(n):Fi(x)&&s&&(yield x.setProcessor(s)),x})))}catch(u){if(!t)throw u;return La(Object.assign(Object.assign({},i),{audio:a,video:o}),e)}})}function Vb(i){return P(this,void 0,void 0,function*(){return(yield La({audio:!1,video:!0}))[0]})}function zb(i){return P(this,void 0,void 0,function*(){return(yield La({audio:!0,video:!1}))[0]})}var zi;(function(i){i.Excellent="excellent",i.Good="good",i.Poor="poor",i.Lost="lost",i.Unknown="unknown"})(zi||(zi={}));function Gb(i){switch(i){case Cr.EXCELLENT:return zi.Excellent;case Cr.GOOD:return zi.Good;case Cr.POOR:return zi.Poor;case Cr.LOST:return zi.Lost;default:return zi.Unknown}}class Kf extends Hn.EventEmitter{get logContext(){var e,t;return Object.assign({},(t=(e=this.loggerOptions)===null||e===void 0?void 0:e.loggerContextCb)===null||t===void 0?void 0:t.call(e))}get isEncrypted(){return this.trackPublications.size>0&&Array.from(this.trackPublications.values()).every(e=>e.isEncrypted)}get isAgent(){var e;return((e=this.permissions)===null||e===void 0?void 0:e.agent)||this.kind===Mr.AGENT}get isActive(){var e;return((e=this.participantInfo)===null||e===void 0?void 0:e.state)===Ps.ACTIVE}get kind(){return this._kind}get attributes(){return Object.freeze(Object.assign({},this._attributes))}constructor(e,t,n,s,r,a){let o=arguments.length>6&&arguments[6]!==void 0?arguments[6]:Mr.STANDARD;var c;super(),this.audioLevel=0,this.isSpeaking=!1,this._connectionQuality=zi.Unknown,this.log=Ke,this.log=li((c=a==null?void 0:a.loggerName)!==null&&c!==void 0?c:Rn.Participant),this.loggerOptions=a,this.setMaxListeners(100),this.sid=e,this.identity=t,this.name=n,this.metadata=s,this.audioTrackPublications=new Map,this.videoTrackPublications=new Map,this.trackPublications=new Map,this._kind=o,this._attributes=r??{}}getTrackPublications(){return Array.from(this.trackPublications.values())}getTrackPublication(e){for(const[,t]of this.trackPublications)if(t.source===e)return t}getTrackPublicationByName(e){for(const[,t]of this.trackPublications)if(t.trackName===e)return t}waitUntilActive(){return this.isActive?Promise.resolve():this.activeFuture?this.activeFuture.promise:(this.activeFuture=new $n,this.once(ce.Active,()=>{var e,t;(t=(e=this.activeFuture)===null||e===void 0?void 0:e.resolve)===null||t===void 0||t.call(e),this.activeFuture=void 0}),this.activeFuture.promise)}get connectionQuality(){return this._connectionQuality}get isCameraEnabled(){var e;const t=this.getTrackPublication(Z.Source.Camera);return!(!((e=t==null?void 0:t.isMuted)!==null&&e!==void 0)||e)}get isMicrophoneEnabled(){var e;const t=this.getTrackPublication(Z.Source.Microphone);return!(!((e=t==null?void 0:t.isMuted)!==null&&e!==void 0)||e)}get isScreenShareEnabled(){return!!this.getTrackPublication(Z.Source.ScreenShare)}get isLocal(){return!1}get joinedAt(){return this.participantInfo?new Date(Number.parseInt(this.participantInfo.joinedAt.toString())*1e3):new Date}updateInfo(e){var t;return this.participantInfo&&this.participantInfo.sid===e.sid&&this.participantInfo.version>e.version?!1:(this.identity=e.identity,this.sid=e.sid,this._setName(e.name),this._setMetadata(e.metadata),this._setAttributes(e.attributes),e.state===Ps.ACTIVE&&((t=this.participantInfo)===null||t===void 0?void 0:t.state)!==Ps.ACTIVE&&this.emit(ce.Active),e.permission&&this.setPermissions(e.permission),this.participantInfo=e,!0)}_setMetadata(e){const t=this.metadata!==e,n=this.metadata;this.metadata=e,t&&this.emit(ce.ParticipantMetadataChanged,n)}_setName(e){const t=this.name!==e;this.name=e,t&&this.emit(ce.ParticipantNameChanged,e)}_setAttributes(e){const t=V0(this.attributes,e);this._attributes=e,Object.keys(t).length>0&&this.emit(ce.AttributesChanged,t)}setPermissions(e){var t,n,s,r,a,o;const c=this.permissions,l=e.canPublish!==((t=this.permissions)===null||t===void 0?void 0:t.canPublish)||e.canSubscribe!==((n=this.permissions)===null||n===void 0?void 0:n.canSubscribe)||e.canPublishData!==((s=this.permissions)===null||s===void 0?void 0:s.canPublishData)||e.hidden!==((r=this.permissions)===null||r===void 0?void 0:r.hidden)||e.recorder!==((a=this.permissions)===null||a===void 0?void 0:a.recorder)||e.canPublishSources.length!==this.permissions.canPublishSources.length||e.canPublishSources.some((d,u)=>{var h;return d!==((h=this.permissions)===null||h===void 0?void 0:h.canPublishSources[u])})||e.canSubscribeMetrics!==((o=this.permissions)===null||o===void 0?void 0:o.canSubscribeMetrics);return this.permissions=e,l&&this.emit(ce.ParticipantPermissionsChanged,c),l}setIsSpeaking(e){e!==this.isSpeaking&&(this.isSpeaking=e,e&&(this.lastSpokeAt=new Date),this.emit(ce.IsSpeakingChanged,e))}setConnectionQuality(e){const t=this._connectionQuality;this._connectionQuality=Gb(e),t!==this._connectionQuality&&this.emit(ce.ConnectionQualityChanged,this._connectionQuality)}setDisconnected(){var e,t;this.activeFuture&&((t=(e=this.activeFuture).reject)===null||t===void 0||t.call(e,new Error("Participant disconnected")),this.activeFuture=void 0)}setAudioContext(e){this.audioContext=e,this.audioTrackPublications.forEach(t=>Xn(t.track)&&t.track.setAudioContext(e))}addTrackPublication(e){e.on(ae.Muted,()=>{this.emit(ce.TrackMuted,e)}),e.on(ae.Unmuted,()=>{this.emit(ce.TrackUnmuted,e)});const t=e;switch(t.track&&(t.track.sid=e.trackSid),this.trackPublications.set(e.trackSid,e),e.kind){case Z.Kind.Audio:this.audioTrackPublications.set(e.trackSid,e);break;case Z.Kind.Video:this.videoTrackPublications.set(e.trackSid,e);break}}}function Hb(i){var e,t,n;if(!i.participantSid&&!i.participantIdentity)throw new Error("Invalid track permission, must provide at least one of participantIdentity and participantSid");return new oh({participantIdentity:(e=i.participantIdentity)!==null&&e!==void 0?e:"",participantSid:(t=i.participantSid)!==null&&t!==void 0?t:"",allTracks:(n=i.allowAll)!==null&&n!==void 0?n:!1,trackSids:i.allowedTrackSids||[]})}class Wb extends Kf{constructor(e,t,n,s,r,a){super(e,t,void 0,void 0,void 0,{loggerName:s.loggerName,loggerContextCb:()=>this.engine.logContext}),this.pendingPublishing=new Set,this.pendingPublishPromises=new Map,this.participantTrackPermissions=[],this.allParticipantsAllowedToSubscribe=!0,this.encryptionType=hn.NONE,this.enabledPublishVideoCodecs=[],this.pendingAcks=new Map,this.pendingResponses=new Map,this.handleReconnecting=()=>{this.reconnectFuture||(this.reconnectFuture=new $n)},this.handleReconnected=()=>{var o,c;(c=(o=this.reconnectFuture)===null||o===void 0?void 0:o.resolve)===null||c===void 0||c.call(o),this.reconnectFuture=void 0,this.updateTrackSubscriptionPermissions()},this.handleClosing=()=>{var o,c,l,d,u,h;this.reconnectFuture&&(this.reconnectFuture.promise.catch(f=>this.log.warn(f.message,this.logContext)),(c=(o=this.reconnectFuture)===null||o===void 0?void 0:o.reject)===null||c===void 0||c.call(o,"Got disconnected during reconnection attempt"),this.reconnectFuture=void 0),this.signalConnectedFuture&&((d=(l=this.signalConnectedFuture).reject)===null||d===void 0||d.call(l,"Got disconnected without signal connected"),this.signalConnectedFuture=void 0),(h=(u=this.activeAgentFuture)===null||u===void 0?void 0:u.reject)===null||h===void 0||h.call(u,"Got disconnected without active agent present"),this.activeAgentFuture=void 0,this.firstActiveAgent=void 0},this.handleSignalConnected=o=>{var c,l;o.participant&&this.updateInfo(o.participant),this.signalConnectedFuture||(this.signalConnectedFuture=new $n),(l=(c=this.signalConnectedFuture).resolve)===null||l===void 0||l.call(c)},this.handleSignalRequestResponse=o=>{const{requestId:c,reason:l,message:d}=o,u=this.pendingSignalRequests.get(c);u&&(l!==Qo.OK&&u.reject(new rf(d,l)),this.pendingSignalRequests.delete(c))},this.handleDataPacket=o=>{switch(o.value.case){case"rpcResponse":let c=o.value.value,l=null,d=null;c.value.case==="payload"?l=c.value.value:c.value.case==="error"&&(d=At.fromProto(c.value.value)),this.handleIncomingRpcResponse(c.requestId,l,d);break;case"rpcAck":let u=o.value.value;this.handleIncomingRpcAck(u.requestId);break}},this.updateTrackSubscriptionPermissions=()=>{this.log.debug("updating track subscription permissions",Object.assign(Object.assign({},this.logContext),{allParticipantsAllowed:this.allParticipantsAllowedToSubscribe,participantTrackPermissions:this.participantTrackPermissions})),this.engine.client.sendUpdateSubscriptionPermissions(this.allParticipantsAllowedToSubscribe,this.participantTrackPermissions.map(o=>Hb(o)))},this.onTrackUnmuted=o=>{this.onTrackMuted(o,o.isUpstreamPaused)},this.onTrackMuted=(o,c)=>{if(c===void 0&&(c=!0),!o.sid){this.log.error("could not update mute status for unpublished track",Object.assign(Object.assign({},this.logContext),Xe(o)));return}this.engine.updateMuteStatus(o.sid,c)},this.onTrackUpstreamPaused=o=>{this.log.debug("upstream paused",Object.assign(Object.assign({},this.logContext),Xe(o))),this.onTrackMuted(o,!0)},this.onTrackUpstreamResumed=o=>{this.log.debug("upstream resumed",Object.assign(Object.assign({},this.logContext),Xe(o))),this.onTrackMuted(o,o.isMuted)},this.onTrackFeatureUpdate=o=>{const c=this.audioTrackPublications.get(o.sid);if(!c){this.log.warn("Could not update local audio track settings, missing publication for track ".concat(o.sid),this.logContext);return}this.engine.client.sendUpdateLocalAudioTrack(c.trackSid,c.getTrackFeatures())},this.onTrackCpuConstrained=(o,c)=>{this.log.debug("track cpu constrained",Object.assign(Object.assign({},this.logContext),Xe(c))),this.emit(ce.LocalTrackCpuConstrained,o,c)},this.handleSubscribedQualityUpdate=o=>P(this,void 0,void 0,function*(){var c,l,d,u,h;if(!(!((h=this.roomOptions)===null||h===void 0)&&h.dynacast))return;const f=this.videoTrackPublications.get(o.trackSid);if(!f){this.log.warn("received subscribed quality update for unknown track",Object.assign(Object.assign({},this.logContext),{trackSid:o.trackSid}));return}if(!f.videoTrack)return;const g=yield f.videoTrack.setPublishingCodecs(o.subscribedCodecs);try{for(var v=!0,m=di(g),p;p=yield m.next(),c=p.done,!c;v=!0){u=p.value,v=!1;const x=u;v0(x)&&(this.log.debug("publish ".concat(x," for ").concat(f.videoTrack.sid),Object.assign(Object.assign({},this.logContext),Xe(f))),yield this.publishAdditionalCodecForTrack(f.videoTrack,x,f.options))}}catch(x){l={error:x}}finally{try{!v&&!c&&(d=m.return)&&(yield d.call(m))}finally{if(l)throw l.error}}}),this.handleLocalTrackUnpublished=o=>{const c=this.trackPublications.get(o.trackSid);if(!c){this.log.warn("received unpublished event for unknown track",Object.assign(Object.assign({},this.logContext),{trackSid:o.trackSid}));return}this.unpublishTrack(c.track)},this.handleTrackEnded=o=>P(this,void 0,void 0,function*(){if(o.source===Z.Source.ScreenShare||o.source===Z.Source.ScreenShareAudio)this.log.debug("unpublishing local track due to TrackEnded",Object.assign(Object.assign({},this.logContext),Xe(o))),this.unpublishTrack(o);else if(o.isUserProvided)yield o.mute();else if(fi(o)||Bi(o))try{if(cn())try{const c=yield navigator==null?void 0:navigator.permissions.query({name:o.source===Z.Source.Camera?"camera":"microphone"});if(c&&c.state==="denied")throw this.log.warn("user has revoked access to ".concat(o.source),Object.assign(Object.assign({},this.logContext),Xe(o))),c.onchange=()=>{c.state!=="denied"&&(o.isMuted||o.restartTrack(),c.onchange=null)},new Error("GetUserMedia Permission denied")}catch{}o.isMuted||(this.log.debug("track ended, attempting to use a different device",Object.assign(Object.assign({},this.logContext),Xe(o))),fi(o)?yield o.restartTrack({deviceId:"default"}):yield o.restartTrack())}catch{this.log.warn("could not restart track, muting instead",Object.assign(Object.assign({},this.logContext),Xe(o))),yield o.mute()}}),this.audioTrackPublications=new Map,this.videoTrackPublications=new Map,this.trackPublications=new Map,this.engine=n,this.roomOptions=s,this.setupEngine(n),this.activeDeviceMap=new Map([["audioinput","default"],["videoinput","default"],["audiooutput","default"]]),this.pendingSignalRequests=new Map,this.rpcHandlers=r,this.roomOutgoingDataStreamManager=a}get lastCameraError(){return this.cameraError}get lastMicrophoneError(){return this.microphoneError}get isE2EEEnabled(){return this.encryptionType!==hn.NONE}getTrackPublication(e){const t=super.getTrackPublication(e);if(t)return t}getTrackPublicationByName(e){const t=super.getTrackPublicationByName(e);if(t)return t}setupEngine(e){var t;this.engine=e,this.engine.on(le.RemoteMute,(n,s)=>{const r=this.trackPublications.get(n);!r||!r.track||(s?r.mute():r.unmute())}),!((t=this.signalConnectedFuture)===null||t===void 0)&&t.isResolved&&(this.signalConnectedFuture=void 0),this.engine.on(le.Connected,this.handleReconnected).on(le.SignalConnected,this.handleSignalConnected).on(le.SignalRestarted,this.handleReconnected).on(le.SignalResumed,this.handleReconnected).on(le.Restarting,this.handleReconnecting).on(le.Resuming,this.handleReconnecting).on(le.LocalTrackUnpublished,this.handleLocalTrackUnpublished).on(le.SubscribedQualityUpdate,this.handleSubscribedQualityUpdate).on(le.Closing,this.handleClosing).on(le.SignalRequestResponse,this.handleSignalRequestResponse).on(le.DataPacketReceived,this.handleDataPacket)}setMetadata(e){return P(this,void 0,void 0,function*(){yield this.requestMetadataUpdate({metadata:e})})}setName(e){return P(this,void 0,void 0,function*(){yield this.requestMetadataUpdate({name:e})})}setAttributes(e){return P(this,void 0,void 0,function*(){yield this.requestMetadataUpdate({attributes:e})})}requestMetadataUpdate(e){return P(this,arguments,void 0,function(t){var n=this;let{metadata:s,name:r,attributes:a}=t;return function*(){return new Promise((o,c)=>P(n,void 0,void 0,function*(){var l,d;try{let u=!1;const h=yield this.engine.client.sendUpdateLocalMetadata((l=s??this.metadata)!==null&&l!==void 0?l:"",(d=r??this.name)!==null&&d!==void 0?d:"",a),f=performance.now();for(this.pendingSignalRequests.set(h,{resolve:o,reject:g=>{c(g),u=!0},values:{name:r,metadata:s,attributes:a}});performance.now()-f<5e3&&!u;){if((!r||this.name===r)&&(!s||this.metadata===s)&&(!a||Object.entries(a).every(g=>{let[v,m]=g;return this.attributes[v]===m||m===""&&!this.attributes[v]}))){this.pendingSignalRequests.delete(h),o();return}yield on(50)}c(new rf("Request to update local metadata timed out","TimeoutError"))}catch(u){u instanceof Error&&c(u)}}))}()})}setCameraEnabled(e,t,n){return this.setTrackEnabled(Z.Source.Camera,e,t,n)}setMicrophoneEnabled(e,t,n){return this.setTrackEnabled(Z.Source.Microphone,e,t,n)}setScreenShareEnabled(e,t,n){return this.setTrackEnabled(Z.Source.ScreenShare,e,t,n)}setPermissions(e){const t=this.permissions,n=super.setPermissions(e);return n&&t&&this.emit(ce.ParticipantPermissionsChanged,t),n}setE2EEEnabled(e){return P(this,void 0,void 0,function*(){this.encryptionType=e?hn.GCM:hn.NONE,yield this.republishAllTracks(void 0,!1)})}setTrackEnabled(e,t,n,s){return P(this,void 0,void 0,function*(){var r,a;this.log.debug("setTrackEnabled",Object.assign(Object.assign({},this.logContext),{source:e,enabled:t})),this.republishPromise&&(yield this.republishPromise);let o=this.getTrackPublication(e);if(t)if(o)yield o.unmute();else{let c;if(this.pendingPublishing.has(e)){const l=yield this.waitForPendingPublicationOfSource(e);return l||this.log.info("waiting for pending publication promise timed out",Object.assign(Object.assign({},this.logContext),{source:e})),yield l==null?void 0:l.unmute(),l}this.pendingPublishing.add(e);try{switch(e){case Z.Source.Camera:c=yield this.createTracks({video:(r=n)!==null&&r!==void 0?r:!0});break;case Z.Source.Microphone:c=yield this.createTracks({audio:(a=n)!==null&&a!==void 0?a:!0});break;case Z.Source.ScreenShare:c=yield this.createScreenTracks(Object.assign({},n));break;default:throw new hi(e)}}catch(l){throw c==null||c.forEach(d=>{d.stop()}),l instanceof Error&&this.emit(ce.MediaDevicesError,l,Rc(e)),this.pendingPublishing.delete(e),l}for(const l of c){const d=Object.assign(Object.assign({},this.roomOptions.publishDefaults),n);e===Z.Source.Microphone&&Xn(l)&&d.preConnectBuffer&&(this.log.info("starting preconnect buffer for microphone",Object.assign({},this.logContext)),l.startPreConnectBuffer())}try{const l=[];for(const u of c)this.log.info("publishing track",Object.assign(Object.assign({},this.logContext),Xe(u))),l.push(this.publishTrack(u,s));[o]=yield Promise.all(l)}catch(l){throw c==null||c.forEach(d=>{d.stop()}),l}finally{this.pendingPublishing.delete(e)}}else if(!(o!=null&&o.track)&&this.pendingPublishing.has(e)&&(o=yield this.waitForPendingPublicationOfSource(e),o||this.log.info("waiting for pending publication promise timed out",Object.assign(Object.assign({},this.logContext),{source:e}))),o&&o.track)if(e===Z.Source.ScreenShare){o=yield this.unpublishTrack(o.track);const c=this.getTrackPublication(Z.Source.ScreenShareAudio);c&&c.track&&this.unpublishTrack(c.track)}else yield o.mute();return o})}enableCameraAndMicrophone(){return P(this,void 0,void 0,function*(){if(!(this.pendingPublishing.has(Z.Source.Camera)||this.pendingPublishing.has(Z.Source.Microphone))){this.pendingPublishing.add(Z.Source.Camera),this.pendingPublishing.add(Z.Source.Microphone);try{const e=yield this.createTracks({audio:!0,video:!0});yield Promise.all(e.map(t=>this.publishTrack(t)))}finally{this.pendingPublishing.delete(Z.Source.Camera),this.pendingPublishing.delete(Z.Source.Microphone)}}})}createTracks(e){return P(this,void 0,void 0,function*(){var t,n;e??(e={});const s=vf(e,(t=this.roomOptions)===null||t===void 0?void 0:t.audioCaptureDefaults,(n=this.roomOptions)===null||n===void 0?void 0:n.videoCaptureDefaults);try{return(yield La(s,{loggerName:this.roomOptions.loggerName,loggerContextCb:()=>this.logContext})).map(o=>(Xn(o)&&(this.microphoneError=void 0,o.setAudioContext(this.audioContext),o.source=Z.Source.Microphone,this.emit(ce.AudioStreamAcquired)),Fi(o)&&(this.cameraError=void 0,o.source=Z.Source.Camera),o))}catch(r){throw r instanceof Error&&(e.audio&&(this.microphoneError=r),e.video&&(this.cameraError=r)),r}})}createScreenTracks(e){return P(this,void 0,void 0,function*(){if(e===void 0&&(e={}),navigator.mediaDevices.getDisplayMedia===void 0)throw new dc("getDisplayMedia not supported");e.resolution===void 0&&!T0()&&(e.resolution=gc.h1080fps30.resolution);const t=O0(e),n=yield navigator.mediaDevices.getDisplayMedia(t),s=n.getVideoTracks();if(s.length===0)throw new hi("no video track found");const r=new Da(s[0],void 0,!1,{loggerName:this.roomOptions.loggerName,loggerContextCb:()=>this.logContext});r.source=Z.Source.ScreenShare,e.contentHint&&(r.mediaStreamTrack.contentHint=e.contentHint);const a=[r];if(n.getAudioTracks().length>0){this.emit(ce.AudioStreamAcquired);const o=new Ia(n.getAudioTracks()[0],void 0,!1,this.audioContext,{loggerName:this.roomOptions.loggerName,loggerContextCb:()=>this.logContext});o.source=Z.Source.ScreenShareAudio,a.push(o)}return a})}publishTrack(e,t){return P(this,void 0,void 0,function*(){return this.publishOrRepublishTrack(e,t)})}publishOrRepublishTrack(e,t){return P(this,arguments,void 0,function(n,s){var r=this;let a=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!1;return function*(){var o,c,l,d;fi(n)&&n.setAudioContext(r.audioContext),yield(o=r.reconnectFuture)===null||o===void 0?void 0:o.promise,r.republishPromise&&!a&&(yield r.republishPromise),Us(n)&&r.pendingPublishPromises.has(n)&&(yield r.pendingPublishPromises.get(n));let u;if(n instanceof MediaStreamTrack)u=n.getConstraints();else{u=n.constraints;let p;switch(n.source){case Z.Source.Microphone:p="audioinput";break;case Z.Source.Camera:p="videoinput"}p&&r.activeDeviceMap.has(p)&&(u=Object.assign(Object.assign({},u),{deviceId:r.activeDeviceMap.get(p)}))}if(n instanceof MediaStreamTrack)switch(n.kind){case"audio":n=new Ia(n,u,!0,r.audioContext,{loggerName:r.roomOptions.loggerName,loggerContextCb:()=>r.logContext});break;case"video":n=new Da(n,u,!0,{loggerName:r.roomOptions.loggerName,loggerContextCb:()=>r.logContext});break;default:throw new hi("unsupported MediaStreamTrack kind ".concat(n.kind))}else n.updateLoggerOptions({loggerName:r.roomOptions.loggerName,loggerContextCb:()=>r.logContext});let h;if(r.trackPublications.forEach(p=>{p.track&&p.track===n&&(h=p)}),h)return r.log.warn("track has already been published, skipping",Object.assign(Object.assign({},r.logContext),Xe(h))),h;const f="channelCount"in n.mediaStreamTrack.getSettings()&&n.mediaStreamTrack.getSettings().channelCount===2||n.mediaStreamTrack.getConstraints().channelCount===2,g=(c=s==null?void 0:s.forceStereo)!==null&&c!==void 0?c:f;g&&(s||(s={}),s.dtx===void 0&&r.log.info("Opus DTX will be disabled for stereo tracks by default. Enable them explicitly to make it work.",Object.assign(Object.assign({},r.logContext),Xe(n))),s.red===void 0&&r.log.info("Opus RED will be disabled for stereo tracks by default. Enable them explicitly to make it work."),(l=s.dtx)!==null&&l!==void 0||(s.dtx=!1),(d=s.red)!==null&&d!==void 0||(s.red=!1));const v=Object.assign(Object.assign({},r.roomOptions.publishDefaults),s);!E0()&&r.roomOptions.e2ee&&(r.log.info("End-to-end encryption is set up, simulcast publishing will be disabled on Safari versions and iOS browsers running iOS < v17.2",Object.assign({},r.logContext)),v.simulcast=!1),v.source&&(n.source=v.source);const m=new Promise((p,x)=>P(r,void 0,void 0,function*(){try{if(this.engine.client.currentState!==Tt.CONNECTED){this.log.debug("deferring track publication until signal is connected",Object.assign(Object.assign({},this.logContext),{track:Xe(n)}));const C=setTimeout(()=>{x(new sf("publishing rejected as engine not connected within timeout",408))},15e3);yield this.waitUntilEngineConnected(),clearTimeout(C);const b=yield this.publish(n,v,g);p(b)}else try{const C=yield this.publish(n,v,g);p(C)}catch(C){x(C)}}catch(C){x(C)}}));r.pendingPublishPromises.set(n,m);try{return yield m}catch(p){throw p}finally{r.pendingPublishPromises.delete(n)}}()})}waitUntilEngineConnected(){return this.signalConnectedFuture||(this.signalConnectedFuture=new $n),this.signalConnectedFuture.promise}hasPermissionsToPublish(e){if(!this.permissions)return this.log.warn("no permissions present for publishing track",Object.assign(Object.assign({},this.logContext),Xe(e))),!1;const{canPublish:t,canPublishSources:n}=this.permissions;return t&&(n.length===0||n.map(s=>z0(s)).includes(e.source))?!0:(this.log.warn("insufficient permissions to publish",Object.assign(Object.assign({},this.logContext),Xe(e))),!1)}publish(e,t,n){return P(this,void 0,void 0,function*(){var s,r,a,o,c,l,d,u,h,f;if(!this.hasPermissionsToPublish(e))throw new sf("failed to publish track, insufficient permissions",403);Array.from(this.trackPublications.values()).find(y=>Us(e)&&y.source===e.source)&&e.source!==Z.Source.Unknown&&this.log.info("publishing a second track with the same source: ".concat(e.source),Object.assign(Object.assign({},this.logContext),Xe(e))),t.stopMicTrackOnMute&&Xn(e)&&(e.stopOnMute=!0),e.source===Z.Source.ScreenShare&&as()&&(t.simulcast=!1),t.videoCodec==="av1"&&!y0()&&(t.videoCodec=void 0),t.videoCodec==="vp9"&&!S0()&&(t.videoCodec=void 0),t.videoCodec===void 0&&(t.videoCodec=Oc),this.enabledPublishVideoCodecs.length>0&&(this.enabledPublishVideoCodecs.some(y=>t.videoCodec===Lr(y.mime))||(t.videoCodec=Lr(this.enabledPublishVideoCodecs[0].mime)));const v=t.videoCodec;e.on(ae.Muted,this.onTrackMuted),e.on(ae.Unmuted,this.onTrackUnmuted),e.on(ae.Ended,this.handleTrackEnded),e.on(ae.UpstreamPaused,this.onTrackUpstreamPaused),e.on(ae.UpstreamResumed,this.onTrackUpstreamResumed),e.on(ae.AudioTrackFeatureUpdate,this.onTrackFeatureUpdate);const m=[],p=!(!((s=t.dtx)!==null&&s!==void 0)||s),x=e.getSourceTrackSettings();x.autoGainControl&&m.push(Ht.TF_AUTO_GAIN_CONTROL),x.echoCancellation&&m.push(Ht.TF_ECHO_CANCELLATION),x.noiseSuppression&&m.push(Ht.TF_NOISE_SUPPRESSION),x.channelCount&&x.channelCount>1&&m.push(Ht.TF_STEREO),p&&m.push(Ht.TF_NO_DTX),fi(e)&&e.hasPreConnectBuffer&&m.push(Ht.TF_PRECONNECT_BUFFER);const C=new Xo({cid:e.mediaStreamTrack.id,name:t.name,type:Z.kindToProto(e.kind),muted:e.isMuted,source:Z.sourceToProto(e.source),disableDtx:p,encryption:this.encryptionType,stereo:n,disableRed:this.isE2EEEnabled||!(!((r=t.red)!==null&&r!==void 0)||r),stream:t==null?void 0:t.stream,backupCodecPolicy:t==null?void 0:t.backupCodecPolicy,audioFeatures:m});let b;if(e.kind===Z.Kind.Video){let y={width:0,height:0};try{y=yield e.waitForDimensions()}catch{const R=(o=(a=this.roomOptions.videoCaptureDefaults)===null||a===void 0?void 0:a.resolution)!==null&&o!==void 0?o:kr.h720.resolution;y={width:R.width,height:R.height},this.log.error("could not determine track dimensions, using defaults",Object.assign(Object.assign(Object.assign({},this.logContext),Xe(e)),{dims:y}))}C.width=y.width,C.height=y.height,Bi(e)&&(Wn(v)&&(e.source===Z.Source.ScreenShare&&(t.scalabilityMode="L1T3","contentHint"in e.mediaStreamTrack&&(e.mediaStreamTrack.contentHint="motion",this.log.info("forcing contentHint to motion for screenshare with SVC codecs",Object.assign(Object.assign({},this.logContext),Xe(e))))),t.scalabilityMode=(c=t.scalabilityMode)!==null&&c!==void 0?c:"L3T3_KEY"),C.simulcastCodecs=[new $o({codec:v,cid:e.mediaStreamTrack.id})],t.backupCodec===!0&&(t.backupCodec={codec:Oc}),t.backupCodec&&v!==t.backupCodec.codec&&C.encryption===hn.NONE&&(this.roomOptions.dynacast||(this.roomOptions.dynacast=!0),C.simulcastCodecs.push(new $o({codec:t.backupCodec.codec,cid:""})))),b=Hc(e.source===Z.Source.ScreenShare,C.width,C.height,t),C.layers=Gf(C.width,C.height,b,Wn(t.videoCodec))}else e.kind===Z.Kind.Audio&&(b=[{maxBitrate:(l=t.audioPreset)===null||l===void 0?void 0:l.maxBitrate,priority:(u=(d=t.audioPreset)===null||d===void 0?void 0:d.priority)!==null&&u!==void 0?u:"high",networkPriority:(f=(h=t.audioPreset)===null||h===void 0?void 0:h.priority)!==null&&f!==void 0?f:"high"}]);if(!this.engine||this.engine.isClosed)throw new Bt("cannot publish track when not connected");const S=()=>P(this,void 0,void 0,function*(){var y,T,R;if(!this.engine.pcManager)throw new Bt("pcManager is not ready");if(e.sender=yield this.engine.createSender(e,t,b),this.emit(ce.LocalSenderCreated,e.sender,e),Bi(e)&&((y=t.degradationPreference)!==null&&y!==void 0||(t.degradationPreference=Tb(e)),e.setDegradationPreference(t.degradationPreference)),b)if(as()&&e.kind===Z.Kind.Audio){let U;for(const B of this.engine.pcManager.publisher.getTransceivers())if(B.sender===e.sender){U=B;break}U&&this.engine.pcManager.publisher.setTrackCodecBitrate({transceiver:U,codec:"opus",maxbr:!((T=b[0])===null||T===void 0)&&T.maxBitrate?b[0].maxBitrate/1e3:0})}else e.codec&&Wn(e.codec)&&(!((R=b[0])===null||R===void 0)&&R.maxBitrate)&&this.engine.pcManager.publisher.setTrackCodecBitrate({cid:C.cid,codec:e.codec,maxbr:b[0].maxBitrate/1e3});yield this.engine.negotiate()});let M;const A=new Promise((y,T)=>P(this,void 0,void 0,function*(){var R;try{M=yield this.engine.addTrack(C),y(M)}catch(U){e.sender&&(!((R=this.engine.pcManager)===null||R===void 0)&&R.publisher)&&(this.engine.pcManager.publisher.removeTrack(e.sender),yield this.engine.negotiate().catch(B=>{this.log.error("failed to negotiate after removing track due to failed add track request",Object.assign(Object.assign(Object.assign({},this.logContext),Xe(e)),{error:B}))})),T(U)}}));if(this.enabledPublishVideoCodecs.length>0)M=(yield Promise.all([A,S()]))[0];else{M=yield A;let y;if(M.codecs.forEach(T=>{y===void 0&&(y=T.mimeType)}),y&&e.kind===Z.Kind.Video){const T=Lr(y);T!==v&&(this.log.debug("falling back to server selected codec",Object.assign(Object.assign(Object.assign({},this.logContext),Xe(e)),{codec:T})),t.videoCodec=T,b=Hc(e.source===Z.Source.ScreenShare,C.width,C.height,t))}yield S()}const k=new Kc(e.kind,M,e,{loggerName:this.roomOptions.loggerName,loggerContextCb:()=>this.logContext});if(k.on(ae.CpuConstrained,y=>this.onTrackCpuConstrained(y,k)),k.options=t,e.sid=M.sid,this.log.debug("publishing ".concat(e.kind," with encodings"),Object.assign(Object.assign({},this.logContext),{encodings:b,trackInfo:M})),Bi(e)?e.startMonitor(this.engine.client):fi(e)&&e.startMonitor(),this.addTrackPublication(k),this.emit(ce.LocalTrackPublished,k),fi(e)&&M.audioFeatures.includes(Ht.TF_PRECONNECT_BUFFER)){const y=e.getPreConnectBuffer(),T=e.getPreConnectBufferMimeType();this.on(ce.LocalTrackSubscribed,R=>{if(R.trackSid===M.sid){if(!e.hasPreConnectBuffer){this.log.warn("subscribe event came to late, buffer already closed",this.logContext);return}this.log.debug("finished recording preconnect buffer",Object.assign(Object.assign({},this.logContext),Xe(e))),e.stopPreConnectBuffer()}}),y&&new Promise((U,B)=>P(this,void 0,void 0,function*(){var q,K,H,W,te,ve;try{this.log.debug("waiting for agent",Object.assign(Object.assign({},this.logContext),Xe(e)));const Be=setTimeout(()=>{B(new Error("agent not active within 10 seconds"))},1e4),Ct=yield this.waitUntilActiveAgentPresent();clearTimeout(Be),this.log.debug("sending preconnect buffer",Object.assign(Object.assign({},this.logContext),Xe(e)));const ht=yield this.streamBytes({name:"preconnect-buffer",mimeType:T,topic:"lk.agent.pre-connect-audio-buffer",destinationIdentities:[Ct.identity],attributes:{trackId:k.trackSid,sampleRate:String((te=x.sampleRate)!==null&&te!==void 0?te:"48000"),channels:String((ve=x.channelCount)!==null&&ve!==void 0?ve:"1")}});try{for(var de=!0,_e=di(y),Ve;Ve=yield _e.next(),q=Ve.done,!q;de=!0){W=Ve.value,de=!1;const X=W;yield ht.write(X)}}catch(X){K={error:X}}finally{try{!de&&!q&&(H=_e.return)&&(yield H.call(_e))}finally{if(K)throw K.error}}yield ht.close(),U()}catch(Be){B(Be)}})).then(()=>{this.log.debug("preconnect buffer sent successfully",Object.assign(Object.assign({},this.logContext),Xe(e)))}).catch(U=>{this.log.error("error sending preconnect buffer",Object.assign(Object.assign(Object.assign({},this.logContext),Xe(e)),{error:U}))})}return k})}get isLocal(){return!0}publishAdditionalCodecForTrack(e,t,n){return P(this,void 0,void 0,function*(){var s;if(this.encryptionType!==hn.NONE)return;let r;if(this.trackPublications.forEach(f=>{f.track&&f.track===e&&(r=f)}),!r)throw new hi("track is not published");if(!Bi(e))throw new hi("track is not a video track");const a=Object.assign(Object.assign({},(s=this.roomOptions)===null||s===void 0?void 0:s.publishDefaults),n),o=yb(e,t,a);if(!o){this.log.info("backup codec has been disabled, ignoring request to add additional codec for track",Object.assign(Object.assign({},this.logContext),Xe(e)));return}const c=e.addSimulcastTrack(t,o);if(!c)return;const l=new Xo({cid:c.mediaStreamTrack.id,type:Z.kindToProto(e.kind),muted:e.isMuted,source:Z.sourceToProto(e.source),sid:e.sid,simulcastCodecs:[{codec:a.videoCodec,cid:c.mediaStreamTrack.id}]});if(l.layers=Gf(l.width,l.height,o),!this.engine||this.engine.isClosed)throw new Bt("cannot publish track when not connected");const d=()=>P(this,void 0,void 0,function*(){yield this.engine.createSimulcastSender(e,c,a,o),yield this.engine.negotiate()}),h=(yield Promise.all([this.engine.addTrack(l),d()]))[0];this.log.debug("published ".concat(t," for track ").concat(e.sid),Object.assign(Object.assign({},this.logContext),{encodings:o,trackInfo:h}))})}unpublishTrack(e,t){return P(this,void 0,void 0,function*(){var n,s;if(Us(e)){const l=this.pendingPublishPromises.get(e);l&&(this.log.info("awaiting publish promise before attempting to unpublish",Object.assign(Object.assign({},this.logContext),Xe(e))),yield l)}const r=this.getPublicationForTrack(e),a=r?Xe(r):void 0;if(this.log.debug("unpublishing track",Object.assign(Object.assign({},this.logContext),a)),!r||!r.track){this.log.warn("track was not unpublished because no publication was found",Object.assign(Object.assign({},this.logContext),a));return}e=r.track,e.off(ae.Muted,this.onTrackMuted),e.off(ae.Unmuted,this.onTrackUnmuted),e.off(ae.Ended,this.handleTrackEnded),e.off(ae.UpstreamPaused,this.onTrackUpstreamPaused),e.off(ae.UpstreamResumed,this.onTrackUpstreamResumed),e.off(ae.AudioTrackFeatureUpdate,this.onTrackFeatureUpdate),t===void 0&&(t=(s=(n=this.roomOptions)===null||n===void 0?void 0:n.stopLocalTrackOnUnpublish)!==null&&s!==void 0?s:!0),t?e.stop():e.stopMonitor();let o=!1;const c=e.sender;if(e.sender=void 0,this.engine.pcManager&&this.engine.pcManager.currentState<wt.FAILED&&c)try{for(const l of this.engine.pcManager.publisher.getTransceivers())l.sender===c&&(l.direction="inactive",o=!0);if(this.engine.removeTrack(c)&&(o=!0),Bi(e)){for(const[,l]of e.simulcastCodecs)l.sender&&(this.engine.removeTrack(l.sender)&&(o=!0),l.sender=void 0);e.simulcastCodecs.clear()}}catch(l){this.log.warn("failed to unpublish track",Object.assign(Object.assign(Object.assign({},this.logContext),a),{error:l}))}switch(this.trackPublications.delete(r.trackSid),r.kind){case Z.Kind.Audio:this.audioTrackPublications.delete(r.trackSid);break;case Z.Kind.Video:this.videoTrackPublications.delete(r.trackSid);break}return this.emit(ce.LocalTrackUnpublished,r),r.setTrack(void 0),o&&(yield this.engine.negotiate()),r})}unpublishTracks(e){return P(this,void 0,void 0,function*(){return(yield Promise.all(e.map(n=>this.unpublishTrack(n)))).filter(n=>!!n)})}republishAllTracks(e){return P(this,arguments,void 0,function(t){var n=this;let s=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0;return function*(){n.republishPromise&&(yield n.republishPromise),n.republishPromise=new Promise((r,a)=>P(n,void 0,void 0,function*(){try{const o=[];this.trackPublications.forEach(c=>{c.track&&(t&&(c.options=Object.assign(Object.assign({},c.options),t)),o.push(c))}),yield Promise.all(o.map(c=>P(this,void 0,void 0,function*(){const l=c.track;yield this.unpublishTrack(l,!1),s&&!l.isMuted&&l.source!==Z.Source.ScreenShare&&l.source!==Z.Source.ScreenShareAudio&&(fi(l)||Bi(l))&&!l.isUserProvided&&(this.log.debug("restarting existing track",Object.assign(Object.assign({},this.logContext),{track:c.trackSid})),yield l.restartTrack()),yield this.publishOrRepublishTrack(l,c.options,!0)}))),r()}catch(o){a(o)}finally{this.republishPromise=void 0}})),yield n.republishPromise}()})}publishData(e){return P(this,arguments,void 0,function(t){var n=this;let s=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};return function*(){const r=s.reliable?We.RELIABLE:We.LOSSY,a=s.destinationIdentities,o=s.topic,c=new an({kind:r,value:{case:"user",value:new Vu({participantIdentity:n.identity,payload:t,destinationIdentities:a,topic:o})}});yield n.engine.sendDataPacket(c,r)}()})}publishDtmf(e,t){return P(this,void 0,void 0,function*(){const n=new an({kind:We.RELIABLE,value:{case:"sipDtmf",value:new zu({code:e,digit:t})}});yield this.engine.sendDataPacket(n,We.RELIABLE)})}sendChatMessage(e,t){return P(this,void 0,void 0,function*(){const n={id:crypto.randomUUID(),message:e,timestamp:Date.now(),attachedFiles:t==null?void 0:t.attachments},s=new an({value:{case:"chatMessage",value:new zo(Object.assign(Object.assign({},n),{timestamp:Et.parse(n.timestamp)}))}});return yield this.engine.sendDataPacket(s,We.RELIABLE),this.emit(ce.ChatMessage,n),n})}editChatMessage(e,t){return P(this,void 0,void 0,function*(){const n=Object.assign(Object.assign({},t),{message:e,editTimestamp:Date.now()}),s=new an({value:{case:"chatMessage",value:new zo(Object.assign(Object.assign({},n),{timestamp:Et.parse(n.timestamp),editTimestamp:Et.parse(n.editTimestamp)}))}});return yield this.engine.sendDataPacket(s,We.RELIABLE),this.emit(ce.ChatMessage,n),n})}sendText(e,t){return P(this,void 0,void 0,function*(){return this.roomOutgoingDataStreamManager.sendText(e,t)})}streamText(e){return P(this,void 0,void 0,function*(){return this.roomOutgoingDataStreamManager.streamText(e)})}sendFile(e,t){return P(this,void 0,void 0,function*(){return this.roomOutgoingDataStreamManager.sendFile(e,t)})}streamBytes(e){return P(this,void 0,void 0,function*(){return this.roomOutgoingDataStreamManager.streamBytes(e)})}performRpc(e){return P(this,arguments,void 0,function(t){var n=this;let{destinationIdentity:s,method:r,payload:a,responseTimeout:o=1e4}=t;return function*(){return new Promise((l,d)=>P(n,void 0,void 0,function*(){var u,h,f,g;if(Bc(a)>Lf){d(At.builtIn("REQUEST_PAYLOAD_TOO_LARGE"));return}if(!((h=(u=this.engine.latestJoinResponse)===null||u===void 0?void 0:u.serverInfo)===null||h===void 0)&&h.version&&jn((g=(f=this.engine.latestJoinResponse)===null||f===void 0?void 0:f.serverInfo)===null||g===void 0?void 0:g.version,"1.8.0")<0){d(At.builtIn("UNSUPPORTED_SERVER"));return}const v=crypto.randomUUID();yield this.publishRpcRequest(s,v,r,a,o-2e3);const m=setTimeout(()=>{this.pendingAcks.delete(v),d(At.builtIn("CONNECTION_TIMEOUT")),this.pendingResponses.delete(v),clearTimeout(p)},2e3);this.pendingAcks.set(v,{resolve:()=>{clearTimeout(m)},participantIdentity:s});const p=setTimeout(()=>{this.pendingResponses.delete(v),d(At.builtIn("RESPONSE_TIMEOUT"))},o);this.pendingResponses.set(v,{resolve:(x,C)=>{clearTimeout(p),this.pendingAcks.has(v)&&(console.warn("RPC response received before ack",v),this.pendingAcks.delete(v),clearTimeout(m)),C?d(C):l(x??"")},participantIdentity:s})}))}()})}registerRpcMethod(e,t){this.rpcHandlers.has(e)&&this.log.warn("you're overriding the RPC handler for method ".concat(e,", in the future this will throw an error")),this.rpcHandlers.set(e,t)}unregisterRpcMethod(e){this.rpcHandlers.delete(e)}setTrackSubscriptionPermissions(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:[];this.participantTrackPermissions=t,this.allParticipantsAllowedToSubscribe=e,this.engine.client.isDisconnected||this.updateTrackSubscriptionPermissions()}handleIncomingRpcAck(e){const t=this.pendingAcks.get(e);t?(t.resolve(),this.pendingAcks.delete(e)):console.error("Ack received for unexpected RPC request",e)}handleIncomingRpcResponse(e,t,n){const s=this.pendingResponses.get(e);s?(s.resolve(t,n),this.pendingResponses.delete(e)):console.error("Response received for unexpected RPC request",e)}publishRpcRequest(e,t,n,s,r){return P(this,void 0,void 0,function*(){const a=new an({destinationIdentities:[e],kind:We.RELIABLE,value:{case:"rpcRequest",value:new Gu({id:t,method:n,payload:s,responseTimeoutMs:r,version:1})}});yield this.engine.sendDataPacket(a,We.RELIABLE)})}handleParticipantDisconnected(e){for(const[t,{participantIdentity:n}]of this.pendingAcks)n===e&&this.pendingAcks.delete(t);for(const[t,{participantIdentity:n,resolve:s}]of this.pendingResponses)n===e&&(s(null,At.builtIn("RECIPIENT_DISCONNECTED")),this.pendingResponses.delete(t))}setEnabledPublishCodecs(e){this.enabledPublishVideoCodecs=e.filter(t=>t.mime.split("/")[0].toLowerCase()==="video")}updateInfo(e){return super.updateInfo(e)?(e.tracks.forEach(t=>{var n,s;const r=this.trackPublications.get(t.sid);if(r){const a=r.isMuted||((s=(n=r.track)===null||n===void 0?void 0:n.isUpstreamPaused)!==null&&s!==void 0?s:!1);a!==t.muted&&(this.log.debug("updating server mute state after reconcile",Object.assign(Object.assign(Object.assign({},this.logContext),Xe(r)),{mutedOnServer:a})),this.engine.client.sendMuteTrack(t.sid,a))}}),!0):!1}setActiveAgent(e){var t,n,s,r;this.firstActiveAgent=e,e&&!this.firstActiveAgent&&(this.firstActiveAgent=e),e?(n=(t=this.activeAgentFuture)===null||t===void 0?void 0:t.resolve)===null||n===void 0||n.call(t,e):(r=(s=this.activeAgentFuture)===null||s===void 0?void 0:s.reject)===null||r===void 0||r.call(s,"Agent disconnected"),this.activeAgentFuture=void 0}waitUntilActiveAgentPresent(){return this.firstActiveAgent?Promise.resolve(this.firstActiveAgent):(this.activeAgentFuture||(this.activeAgentFuture=new $n),this.activeAgentFuture.promise)}getPublicationForTrack(e){let t;return this.trackPublications.forEach(n=>{const s=n.track;s&&(e instanceof MediaStreamTrack?(fi(s)||Bi(s))&&s.mediaStreamTrack===e&&(t=n):e===s&&(t=n))}),t}waitForPendingPublicationOfSource(e){return P(this,void 0,void 0,function*(){const n=Date.now();for(;Date.now()<n+1e4;){const s=Array.from(this.pendingPublishPromises.entries()).find(r=>{let[a]=r;return a.source===e});if(s)return s[1];yield on(20)}})}}class qb extends pi{constructor(e,t,n,s){super(e,t.sid,t.name,s),this.track=void 0,this.allowed=!0,this.requestedDisabled=void 0,this.visible=!0,this.handleEnded=r=>{this.setTrack(void 0),this.emit(ae.Ended,r)},this.handleVisibilityChange=r=>{this.log.debug("adaptivestream video visibility ".concat(this.trackSid,", visible=").concat(r),this.logContext),this.visible=r,this.emitTrackUpdate()},this.handleVideoDimensionsChange=r=>{this.log.debug("adaptivestream video dimensions ".concat(r.width,"x").concat(r.height),this.logContext),this.videoDimensionsAdaptiveStream=r,this.emitTrackUpdate()},this.subscribed=n,this.updateInfo(t)}setSubscribed(e){const t=this.subscriptionStatus,n=this.permissionStatus;this.subscribed=e,e&&(this.allowed=!0);const s=new va({trackSids:[this.trackSid],subscribe:this.subscribed,participantTracks:[new ju({participantSid:"",trackSids:[this.trackSid]})]});this.emit(ae.UpdateSubscription,s),this.emitSubscriptionUpdateIfChanged(t),this.emitPermissionUpdateIfChanged(n)}get subscriptionStatus(){return this.subscribed===!1?pi.SubscriptionStatus.Unsubscribed:super.isSubscribed?pi.SubscriptionStatus.Subscribed:pi.SubscriptionStatus.Desired}get permissionStatus(){return this.allowed?pi.PermissionStatus.Allowed:pi.PermissionStatus.NotAllowed}get isSubscribed(){return this.subscribed===!1?!1:super.isSubscribed}get isDesired(){return this.subscribed!==!1}get isEnabled(){return this.requestedDisabled!==void 0?!this.requestedDisabled:this.isAdaptiveStream?this.visible:!0}get isLocal(){return!1}setEnabled(e){!this.isManualOperationAllowed()||this.requestedDisabled===!e||(this.requestedDisabled=!e,this.emitTrackUpdate())}setVideoQuality(e){!this.isManualOperationAllowed()||this.requestedMaxQuality===e||(this.requestedMaxQuality=e,this.requestedVideoDimensions=void 0,this.emitTrackUpdate())}setVideoDimensions(e){var t,n;this.isManualOperationAllowed()&&(((t=this.requestedVideoDimensions)===null||t===void 0?void 0:t.width)===e.width&&((n=this.requestedVideoDimensions)===null||n===void 0?void 0:n.height)===e.height||(Mc(this.track)&&(this.requestedVideoDimensions=e),this.requestedMaxQuality=void 0,this.emitTrackUpdate()))}setVideoFPS(e){this.isManualOperationAllowed()&&Mc(this.track)&&this.fps!==e&&(this.fps=e,this.emitTrackUpdate())}get videoQuality(){var e;return(e=this.requestedMaxQuality)!==null&&e!==void 0?e:pn.HIGH}setTrack(e){const t=this.subscriptionStatus,n=this.permissionStatus,s=this.track;s!==e&&(s&&(s.off(ae.VideoDimensionsChanged,this.handleVideoDimensionsChange),s.off(ae.VisibilityChanged,this.handleVisibilityChange),s.off(ae.Ended,this.handleEnded),s.detach(),s.stopMonitor(),this.emit(ae.Unsubscribed,s)),super.setTrack(e),e&&(e.sid=this.trackSid,e.on(ae.VideoDimensionsChanged,this.handleVideoDimensionsChange),e.on(ae.VisibilityChanged,this.handleVisibilityChange),e.on(ae.Ended,this.handleEnded),this.emit(ae.Subscribed,e)),this.emitPermissionUpdateIfChanged(n),this.emitSubscriptionUpdateIfChanged(t))}setAllowed(e){const t=this.subscriptionStatus,n=this.permissionStatus;this.allowed=e,this.emitPermissionUpdateIfChanged(n),this.emitSubscriptionUpdateIfChanged(t)}setSubscriptionError(e){this.emit(ae.SubscriptionFailed,e)}updateInfo(e){super.updateInfo(e);const t=this.metadataMuted;this.metadataMuted=e.muted,this.track?this.track.setMuted(e.muted):t!==e.muted&&this.emit(e.muted?ae.Muted:ae.Unmuted)}emitSubscriptionUpdateIfChanged(e){const t=this.subscriptionStatus;e!==t&&this.emit(ae.SubscriptionStatusChanged,t,e)}emitPermissionUpdateIfChanged(e){this.permissionStatus!==e&&this.emit(ae.SubscriptionPermissionChanged,this.permissionStatus,e)}isManualOperationAllowed(){return this.isDesired?!0:(this.log.warn("cannot update track settings when not subscribed",this.logContext),!1)}get isAdaptiveStream(){return Mc(this.track)&&this.track.isAdaptiveStream}emitTrackUpdate(){const e=new nh({trackSids:[this.trackSid],disabled:!this.isEnabled,fps:this.fps});if(this.kind===Z.Kind.Video){let t=this.requestedVideoDimensions;if(this.videoDimensionsAdaptiveStream!==void 0)if(t)Sf(this.videoDimensionsAdaptiveStream,t)&&(this.log.debug("using adaptive stream dimensions instead of requested",Object.assign(Object.assign({},this.logContext),this.videoDimensionsAdaptiveStream)),t=this.videoDimensionsAdaptiveStream);else if(this.requestedMaxQuality!==void 0&&this.trackInfo){const n=G0(this.trackInfo,this.requestedMaxQuality);n&&Sf(this.videoDimensionsAdaptiveStream,n)&&(this.log.debug("using adaptive stream dimensions instead of max quality layer",Object.assign(Object.assign({},this.logContext),this.videoDimensionsAdaptiveStream)),t=this.videoDimensionsAdaptiveStream)}else this.log.debug("using adaptive stream dimensions",Object.assign(Object.assign({},this.logContext),this.videoDimensionsAdaptiveStream)),t=this.videoDimensionsAdaptiveStream;t?(e.width=Math.ceil(t.width),e.height=Math.ceil(t.height)):this.requestedMaxQuality!==void 0?(this.log.debug("using requested max quality",Object.assign(Object.assign({},this.logContext),{quality:this.requestedMaxQuality})),e.quality=this.requestedMaxQuality):(this.log.debug("using default quality",Object.assign(Object.assign({},this.logContext),{quality:pn.HIGH})),e.quality=pn.HIGH)}this.emit(ae.UpdateSettings,e)}}class Na extends Kf{static fromParticipantInfo(e,t,n){return new Na(e,t.sid,t.identity,t.name,t.metadata,t.attributes,n,t.kind)}get logContext(){return Object.assign(Object.assign({},super.logContext),{rpID:this.sid,remoteParticipant:this.identity})}constructor(e,t,n,s,r,a,o){let c=arguments.length>7&&arguments[7]!==void 0?arguments[7]:Mr.STANDARD;super(t,n||"",s,r,a,o,c),this.signalClient=e,this.trackPublications=new Map,this.audioTrackPublications=new Map,this.videoTrackPublications=new Map,this.volumeMap=new Map}addTrackPublication(e){super.addTrackPublication(e),e.on(ae.UpdateSettings,t=>{this.log.debug("send update settings",Object.assign(Object.assign(Object.assign({},this.logContext),Xe(e)),{settings:t})),this.signalClient.sendUpdateTrackSettings(t)}),e.on(ae.UpdateSubscription,t=>{t.participantTracks.forEach(n=>{n.participantSid=this.sid}),this.signalClient.sendUpdateSubscription(t)}),e.on(ae.SubscriptionPermissionChanged,t=>{this.emit(ce.TrackSubscriptionPermissionChanged,e,t)}),e.on(ae.SubscriptionStatusChanged,t=>{this.emit(ce.TrackSubscriptionStatusChanged,e,t)}),e.on(ae.Subscribed,t=>{this.emit(ce.TrackSubscribed,t,e)}),e.on(ae.Unsubscribed,t=>{this.emit(ce.TrackUnsubscribed,t,e)}),e.on(ae.SubscriptionFailed,t=>{this.emit(ce.TrackSubscriptionFailed,e.trackSid,t)})}getTrackPublication(e){const t=super.getTrackPublication(e);if(t)return t}getTrackPublicationByName(e){const t=super.getTrackPublicationByName(e);if(t)return t}setVolume(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:Z.Source.Microphone;this.volumeMap.set(t,e);const n=this.getTrackPublication(t);n&&n.track&&n.track.setVolume(e)}getVolume(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:Z.Source.Microphone;const t=this.getTrackPublication(e);return t&&t.track?t.track.getVolume():this.volumeMap.get(e)}addSubscribedMediaTrack(e,t,n,s,r,a){let o=this.getTrackPublicationBySid(t);if(o||t.startsWith("TR")||this.trackPublications.forEach(d=>{!o&&e.kind===d.kind.toString()&&(o=d)}),!o){if(a===0){this.log.error("could not find published track",Object.assign(Object.assign({},this.logContext),{trackSid:t})),this.emit(ce.TrackSubscriptionFailed,t);return}a===void 0&&(a=20),setTimeout(()=>{this.addSubscribedMediaTrack(e,t,n,s,r,a-1)},150);return}if(e.readyState==="ended"){this.log.error("unable to subscribe because MediaStreamTrack is ended. Do not call MediaStreamTrack.stop()",Object.assign(Object.assign({},this.logContext),Xe(o))),this.emit(ce.TrackSubscriptionFailed,t);return}const c=e.kind==="video";let l;return c?l=new Fb(e,t,s,r):l=new Ob(e,t,s,this.audioContext,this.audioOutput),l.source=o.source,l.isMuted=o.isMuted,l.setMediaStream(n),l.start(),o.setTrack(l),this.volumeMap.has(o.source)&&Ec(l)&&Xn(l)&&l.setVolume(this.volumeMap.get(o.source)),o}get hasMetadata(){return!!this.participantInfo}getTrackPublicationBySid(e){return this.trackPublications.get(e)}updateInfo(e){if(!super.updateInfo(e))return!1;const t=new Map,n=new Map;return e.tracks.forEach(s=>{var r,a;let o=this.getTrackPublicationBySid(s.sid);if(o)o.updateInfo(s);else{const c=Z.kindFromProto(s.type);if(!c)return;o=new qb(c,s,(r=this.signalClient.connectOptions)===null||r===void 0?void 0:r.autoSubscribe,{loggerContextCb:()=>this.logContext,loggerName:(a=this.loggerOptions)===null||a===void 0?void 0:a.loggerName}),o.updateInfo(s),n.set(s.sid,o);const l=Array.from(this.trackPublications.values()).find(d=>d.source===(o==null?void 0:o.source));l&&o.source!==Z.Source.Unknown&&this.log.debug("received a second track publication for ".concat(this.identity," with the same source: ").concat(o.source),Object.assign(Object.assign({},this.logContext),{oldTrack:Xe(l),newTrack:Xe(o)})),this.addTrackPublication(o)}t.set(s.sid,o)}),this.trackPublications.forEach(s=>{t.has(s.trackSid)||(this.log.trace("detected removed track on remote participant, unpublishing",Object.assign(Object.assign({},this.logContext),Xe(s))),this.unpublishTrack(s.trackSid,!0))}),n.forEach(s=>{this.emit(ce.TrackPublished,s)}),!0}unpublishTrack(e,t){const n=this.trackPublications.get(e);if(!n)return;const{track:s}=n;switch(s&&(s.stop(),n.setTrack(void 0)),this.trackPublications.delete(e),n.kind){case Z.Kind.Audio:this.audioTrackPublications.delete(e);break;case Z.Kind.Video:this.videoTrackPublications.delete(e);break}t&&this.emit(ce.TrackUnpublished,n)}setAudioOutput(e){return P(this,void 0,void 0,function*(){this.audioOutput=e;const t=[];this.audioTrackPublications.forEach(n=>{var s;Xn(n.track)&&Ec(n.track)&&t.push(n.track.setSinkId((s=e.deviceId)!==null&&s!==void 0?s:"default"))}),yield Promise.all(t)})}emit(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),s=1;s<t;s++)n[s-1]=arguments[s];return this.log.trace("participant event",Object.assign(Object.assign({},this.logContext),{event:e,args:n})),super.emit(e,...n)}}var st;(function(i){i.Disconnected="disconnected",i.Connecting="connecting",i.Connected="connected",i.Reconnecting="reconnecting",i.SignalReconnecting="signalReconnecting"})(st||(st={}));const jb=4*1e3;class Bs extends Hn.EventEmitter{constructor(e){var t,n,s,r;if(super(),t=this,this.state=st.Disconnected,this.activeSpeakers=[],this.isE2EEEnabled=!1,this.audioEnabled=!0,this.isVideoPlaybackBlocked=!1,this.log=Ke,this.bufferedEvents=[],this.isResuming=!1,this.rpcHandlers=new Map,this.connect=(a,o,c)=>P(this,void 0,void 0,function*(){var l;if(!x0())throw qn()?Error("WebRTC isn't detected, have you called registerGlobals?"):Error("LiveKit doesn't seem to be supported on this browser. Try to update your browser and make sure no browser extensions are disabling webRTC.");const d=yield this.disconnectLock.lock();if(this.state===st.Connected)return this.log.info("already connected to room ".concat(this.name),this.logContext),d(),Promise.resolve();if(this.connectFuture)return d(),this.connectFuture.promise;this.setAndEmitConnectionState(st.Connecting),((l=this.regionUrlProvider)===null||l===void 0?void 0:l.getServerUrl().toString())!==a&&(this.regionUrl=void 0,this.regionUrlProvider=void 0),yc(new URL(a))&&(this.regionUrlProvider===void 0?this.regionUrlProvider=new jc(a,o):this.regionUrlProvider.updateToken(o),this.regionUrlProvider.fetchRegionSettings().then(f=>{var g;(g=this.regionUrlProvider)===null||g===void 0||g.setServerReportedRegions(f)}).catch(f=>{this.log.warn("could not fetch region settings",Object.assign(Object.assign({},this.logContext),{error:f}))}));const u=(f,g,v)=>P(this,void 0,void 0,function*(){var m,p;this.abortController&&this.abortController.abort();const x=new AbortController;this.abortController=x,d==null||d();try{yield this.attemptConnection(v??a,o,c,x),this.abortController=void 0,f()}catch(C){if(this.regionUrlProvider&&C instanceof pt&&C.reason!==Je.Cancelled&&C.reason!==Je.NotAllowed){let b=null;try{b=yield this.regionUrlProvider.getNextBestRegionUrl((m=this.abortController)===null||m===void 0?void 0:m.signal)}catch(S){if(S instanceof pt&&(S.status===401||S.reason===Je.Cancelled)){this.handleDisconnect(this.options.stopLocalTrackOnUnpublish),g(S);return}}b&&!(!((p=this.abortController)===null||p===void 0)&&p.signal.aborted)?(this.log.info("Initial connection failed with ConnectionError: ".concat(C.message,". Retrying with another region: ").concat(b),this.logContext),this.recreateEngine(),yield u(f,g,b)):(this.handleDisconnect(this.options.stopLocalTrackOnUnpublish,gf(C)),g(C))}else{let b=wn.UNKNOWN_REASON;C instanceof pt&&(b=gf(C)),this.handleDisconnect(this.options.stopLocalTrackOnUnpublish,b),g(C)}}}),h=this.regionUrl;return this.regionUrl=void 0,this.connectFuture=new $n((f,g)=>{u(f,g,h)},()=>{this.clearConnectionFutures()}),this.connectFuture.promise}),this.connectSignal=(a,o,c,l,d,u)=>P(this,void 0,void 0,function*(){var h,f,g;const v=yield c.join(a,o,{autoSubscribe:l.autoSubscribe,adaptiveStream:typeof d.adaptiveStream=="object"?!0:d.adaptiveStream,maxRetries:l.maxRetries,e2eeEnabled:!!this.e2eeManager,websocketTimeout:l.websocketTimeout},u.signal);let m=v.serverInfo;if(m||(m={version:v.serverVersion,region:v.serverRegion}),this.serverInfo=m,this.log.debug("connected to Livekit Server ".concat(Object.entries(m).map(p=>{let[x,C]=p;return"".concat(x,": ").concat(C)}).join(", ")),{room:(h=v.room)===null||h===void 0?void 0:h.name,roomSid:(f=v.room)===null||f===void 0?void 0:f.sid,identity:(g=v.participant)===null||g===void 0?void 0:g.identity}),!m.version)throw new o0("unknown server version");return m.version==="0.15.1"&&this.options.dynacast&&(this.log.debug("disabling dynacast due to server version",this.logContext),d.dynacast=!1),v}),this.applyJoinResponse=a=>{const o=a.participant;if(this.localParticipant.sid=o.sid,this.localParticipant.identity=o.identity,this.localParticipant.setEnabledPublishCodecs(a.enabledPublishCodecs),this.options.e2ee&&this.e2eeManager)try{this.e2eeManager.setSifTrailer(a.sifTrailer)}catch(c){this.log.error(c instanceof Error?c.message:"Could not set SifTrailer",Object.assign(Object.assign({},this.logContext),{error:c}))}this.handleParticipantUpdates([o,...a.otherParticipants]),a.room&&this.handleRoomUpdate(a.room)},this.attemptConnection=(a,o,c,l)=>P(this,void 0,void 0,function*(){var d,u;this.state===st.Reconnecting||this.isResuming||!((d=this.engine)===null||d===void 0)&&d.pendingReconnect?(this.log.info("Reconnection attempt replaced by new connection attempt",this.logContext),this.recreateEngine()):this.maybeCreateEngine(),!((u=this.regionUrlProvider)===null||u===void 0)&&u.isCloud()&&this.engine.setRegionUrlProvider(this.regionUrlProvider),this.acquireAudioContext(),this.connOptions=Object.assign(Object.assign({},Fc),c),this.connOptions.rtcConfig&&(this.engine.rtcConfig=this.connOptions.rtcConfig),this.connOptions.peerConnectionTimeout&&(this.engine.peerConnectionTimeout=this.connOptions.peerConnectionTimeout);try{const h=yield this.connectSignal(a,o,this.engine,this.connOptions,this.options,l);this.applyJoinResponse(h),this.setupLocalParticipantEvents(),this.emit(ne.SignalConnected)}catch(h){yield this.engine.close(),this.recreateEngine();const f=new pt("could not establish signal connection",Je.ServerUnreachable);throw h instanceof Error&&(f.message="".concat(f.message,": ").concat(h.message)),h instanceof pt&&(f.reason=h.reason,f.status=h.status),this.log.debug("error trying to establish signal connection",Object.assign(Object.assign({},this.logContext),{error:h})),f}if(l.signal.aborted)throw yield this.engine.close(),this.recreateEngine(),new pt("Connection attempt aborted",Je.Cancelled);try{yield this.engine.waitForPCInitialConnection(this.connOptions.peerConnectionTimeout,l)}catch(h){throw yield this.engine.close(),this.recreateEngine(),h}cn()&&this.options.disconnectOnPageLeave&&(window.addEventListener("pagehide",this.onPageLeave),window.addEventListener("beforeunload",this.onPageLeave)),cn()&&document.addEventListener("freeze",this.onPageLeave),this.setAndEmitConnectionState(st.Connected),this.emit(ne.Connected),this.registerConnectionReconcile()}),this.disconnect=function(){for(var a=arguments.length,o=new Array(a),c=0;c<a;c++)o[c]=arguments[c];return P(t,[...o],void 0,function(){var l=this;let d=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!0;return function*(){var u,h,f,g;const v=yield l.disconnectLock.lock();try{if(l.state===st.Disconnected){l.log.debug("already disconnected",l.logContext);return}l.log.info("disconnect from room",Object.assign({},l.logContext)),(l.state===st.Connecting||l.state===st.Reconnecting||l.isResuming)&&(l.log.warn("abort connection attempt",l.logContext),(u=l.abortController)===null||u===void 0||u.abort(),(f=(h=l.connectFuture)===null||h===void 0?void 0:h.reject)===null||f===void 0||f.call(h,new pt("Client initiated disconnect",Je.Cancelled)),l.connectFuture=void 0),!((g=l.engine)===null||g===void 0)&&g.client.isDisconnected||(yield l.engine.client.sendLeave()),l.engine&&(yield l.engine.close()),l.handleDisconnect(d,wn.CLIENT_INITIATED),l.engine=void 0}finally{v()}}()})},this.onPageLeave=()=>P(this,void 0,void 0,function*(){this.log.info("Page leave detected, disconnecting",this.logContext),yield this.disconnect()}),this.startAudio=()=>P(this,void 0,void 0,function*(){const a=[],o=fn();if(o&&o.os==="iOS"){const c="livekit-dummy-audio-el";let l=document.getElementById(c);if(!l){l=document.createElement("audio"),l.id=c,l.autoplay=!0,l.hidden=!0;const d=Tc();d.enabled=!0;const u=new MediaStream([d]);l.srcObject=u,document.addEventListener("visibilitychange",()=>{l&&(l.srcObject=document.hidden?null:u,document.hidden||(this.log.debug("page visible again, triggering startAudio to resume playback and update playback status",this.logContext),this.startAudio()))}),document.body.append(l),this.once(ne.Disconnected,()=>{l==null||l.remove(),l=null})}a.push(l)}this.remoteParticipants.forEach(c=>{c.audioTrackPublications.forEach(l=>{l.track&&l.track.attachedElements.forEach(d=>{a.push(d)})})});try{yield Promise.all([this.acquireAudioContext(),...a.map(c=>(c.muted=!1,c.play()))]),this.handleAudioPlaybackStarted()}catch(c){throw this.handleAudioPlaybackFailed(c),c}}),this.startVideo=()=>P(this,void 0,void 0,function*(){const a=[];for(const o of this.remoteParticipants.values())o.videoTrackPublications.forEach(c=>{var l;(l=c.track)===null||l===void 0||l.attachedElements.forEach(d=>{a.includes(d)||a.push(d)})});yield Promise.all(a.map(o=>o.play())).then(()=>{this.handleVideoPlaybackStarted()}).catch(o=>{o.name==="NotAllowedError"?this.handleVideoPlaybackFailed():this.log.warn("Resuming video playback failed, make sure you call `startVideo` directly in a user gesture handler",this.logContext)})}),this.handleRestarting=()=>{this.clearConnectionReconcile(),this.isResuming=!1;for(const a of this.remoteParticipants.values())this.handleParticipantDisconnected(a.identity,a);this.setAndEmitConnectionState(st.Reconnecting)&&this.emit(ne.Reconnecting)},this.handleSignalRestarted=a=>P(this,void 0,void 0,function*(){this.log.debug("signal reconnected to server, region ".concat(a.serverRegion),Object.assign(Object.assign({},this.logContext),{region:a.serverRegion})),this.bufferedEvents=[],this.applyJoinResponse(a);try{yield this.localParticipant.republishAllTracks(void 0,!0)}catch(o){this.log.error("error trying to re-publish tracks after reconnection",Object.assign(Object.assign({},this.logContext),{error:o}))}try{yield this.engine.waitForRestarted(),this.log.debug("fully reconnected to server",Object.assign(Object.assign({},this.logContext),{region:a.serverRegion}))}catch{return}this.setAndEmitConnectionState(st.Connected),this.emit(ne.Reconnected),this.registerConnectionReconcile(),this.emitBufferedEvents()}),this.handleParticipantUpdates=a=>{a.forEach(o=>{var c;if(o.identity===this.localParticipant.identity){this.localParticipant.updateInfo(o);return}o.identity===""&&(o.identity=(c=this.sidToIdentity.get(o.sid))!==null&&c!==void 0?c:"");let l=this.remoteParticipants.get(o.identity);o.state===Ps.DISCONNECTED?this.handleParticipantDisconnected(o.identity,l):l=this.getOrCreateParticipant(o.identity,o)})},this.handleActiveSpeakersUpdate=a=>{const o=[],c={};a.forEach(l=>{if(c[l.sid]=!0,l.sid===this.localParticipant.sid)this.localParticipant.audioLevel=l.level,this.localParticipant.setIsSpeaking(!0),o.push(this.localParticipant);else{const d=this.getRemoteParticipantBySid(l.sid);d&&(d.audioLevel=l.level,d.setIsSpeaking(!0),o.push(d))}}),c[this.localParticipant.sid]||(this.localParticipant.audioLevel=0,this.localParticipant.setIsSpeaking(!1)),this.remoteParticipants.forEach(l=>{c[l.sid]||(l.audioLevel=0,l.setIsSpeaking(!1))}),this.activeSpeakers=o,this.emitWhenConnected(ne.ActiveSpeakersChanged,o)},this.handleSpeakersChanged=a=>{const o=new Map;this.activeSpeakers.forEach(l=>{const d=this.remoteParticipants.get(l.identity);d&&d.sid!==l.sid||o.set(l.sid,l)}),a.forEach(l=>{let d=this.getRemoteParticipantBySid(l.sid);l.sid===this.localParticipant.sid&&(d=this.localParticipant),d&&(d.audioLevel=l.level,d.setIsSpeaking(l.active),l.active?o.set(l.sid,d):o.delete(l.sid))});const c=Array.from(o.values());c.sort((l,d)=>d.audioLevel-l.audioLevel),this.activeSpeakers=c,this.emitWhenConnected(ne.ActiveSpeakersChanged,c)},this.handleStreamStateUpdate=a=>{a.streamStates.forEach(o=>{const c=this.getRemoteParticipantBySid(o.participantSid);if(!c)return;const l=c.getTrackPublicationBySid(o.trackSid);if(!l||!l.track)return;const d=Z.streamStateFromProto(o.state);l.track.setStreamState(d),d!==l.track.streamState&&(c.emit(ce.TrackStreamStateChanged,l,l.track.streamState),this.emitWhenConnected(ne.TrackStreamStateChanged,l,l.track.streamState,c))})},this.handleSubscriptionPermissionUpdate=a=>{const o=this.getRemoteParticipantBySid(a.participantSid);if(!o)return;const c=o.getTrackPublicationBySid(a.trackSid);c&&c.setAllowed(a.allowed)},this.handleSubscriptionError=a=>{const o=Array.from(this.remoteParticipants.values()).find(l=>l.trackPublications.has(a.trackSid));if(!o)return;const c=o.getTrackPublicationBySid(a.trackSid);c&&c.setSubscriptionError(a.err)},this.handleDataPacket=a=>{const o=this.remoteParticipants.get(a.participantIdentity);if(a.value.case==="user")this.handleUserPacket(o,a.value.value,a.kind);else if(a.value.case==="transcription")this.handleTranscription(o,a.value.value);else if(a.value.case==="sipDtmf")this.handleSipDtmf(o,a.value.value);else if(a.value.case==="chatMessage")this.handleChatMessage(o,a.value.value);else if(a.value.case==="metrics")this.handleMetrics(a.value.value,o);else if(a.value.case==="streamHeader"||a.value.case==="streamChunk"||a.value.case==="streamTrailer")this.handleDataStream(a);else if(a.value.case==="rpcRequest"){const c=a.value.value;this.handleIncomingRpcRequest(a.participantIdentity,c.id,c.method,c.payload,c.responseTimeoutMs,c.version)}},this.handleUserPacket=(a,o,c)=>{this.emit(ne.DataReceived,o.payload,a,c,o.topic),a==null||a.emit(ce.DataReceived,o.payload,c)},this.handleSipDtmf=(a,o)=>{this.emit(ne.SipDTMFReceived,o,a),a==null||a.emit(ce.SipDTMFReceived,o)},this.handleTranscription=(a,o)=>{const c=o.transcribedParticipantIdentity===this.localParticipant.identity?this.localParticipant:this.getParticipantByIdentity(o.transcribedParticipantIdentity),l=c==null?void 0:c.trackPublications.get(o.trackId),d=k0(o,this.transcriptionReceivedTimes);l==null||l.emit(ae.TranscriptionReceived,d),c==null||c.emit(ce.TranscriptionReceived,d,l),this.emit(ne.TranscriptionReceived,d,c,l)},this.handleChatMessage=(a,o)=>{const c=I0(o);this.emit(ne.ChatMessage,c,a)},this.handleMetrics=(a,o)=>{this.emit(ne.MetricsReceived,a,o)},this.handleDataStream=a=>{this.incomingDataStreamManager.handleDataStreamPacket(a)},this.bufferedSegments=new Map,this.handleAudioPlaybackStarted=()=>{this.canPlaybackAudio||(this.audioEnabled=!0,this.emit(ne.AudioPlaybackStatusChanged,!0))},this.handleAudioPlaybackFailed=a=>{this.log.warn("could not playback audio",Object.assign(Object.assign({},this.logContext),{error:a})),this.canPlaybackAudio&&(this.audioEnabled=!1,this.emit(ne.AudioPlaybackStatusChanged,!1))},this.handleVideoPlaybackStarted=()=>{this.isVideoPlaybackBlocked&&(this.isVideoPlaybackBlocked=!1,this.emit(ne.VideoPlaybackStatusChanged,!0))},this.handleVideoPlaybackFailed=()=>{this.isVideoPlaybackBlocked||(this.isVideoPlaybackBlocked=!0,this.emit(ne.VideoPlaybackStatusChanged,!1))},this.handleDeviceChange=()=>P(this,void 0,void 0,function*(){var a;((a=fn())===null||a===void 0?void 0:a.os)!=="iOS"&&(yield this.selectDefaultDevices()),this.emit(ne.MediaDevicesChanged)}),this.handleRoomUpdate=a=>{const o=this.roomInfo;this.roomInfo=a,o&&o.metadata!==a.metadata&&this.emitWhenConnected(ne.RoomMetadataChanged,a.metadata),(o==null?void 0:o.activeRecording)!==a.activeRecording&&this.emitWhenConnected(ne.RecordingStatusChanged,a.activeRecording)},this.handleConnectionQualityUpdate=a=>{a.updates.forEach(o=>{if(o.participantSid===this.localParticipant.sid){this.localParticipant.setConnectionQuality(o.quality);return}const c=this.getRemoteParticipantBySid(o.participantSid);c&&c.setConnectionQuality(o.quality)})},this.onLocalParticipantMetadataChanged=a=>{this.emit(ne.ParticipantMetadataChanged,a,this.localParticipant)},this.onLocalParticipantNameChanged=a=>{this.emit(ne.ParticipantNameChanged,a,this.localParticipant)},this.onLocalAttributesChanged=a=>{this.emit(ne.ParticipantAttributesChanged,a,this.localParticipant)},this.onLocalTrackMuted=a=>{this.emit(ne.TrackMuted,a,this.localParticipant)},this.onLocalTrackUnmuted=a=>{this.emit(ne.TrackUnmuted,a,this.localParticipant)},this.onTrackProcessorUpdate=a=>{var o;(o=a==null?void 0:a.onPublish)===null||o===void 0||o.call(a,this)},this.onLocalTrackPublished=a=>P(this,void 0,void 0,function*(){var o,c,l,d,u,h;(o=a.track)===null||o===void 0||o.on(ae.TrackProcessorUpdate,this.onTrackProcessorUpdate),(c=a.track)===null||c===void 0||c.on(ae.Restarted,this.onLocalTrackRestarted),(u=(d=(l=a.track)===null||l===void 0?void 0:l.getProcessor())===null||d===void 0?void 0:d.onPublish)===null||u===void 0||u.call(d,this),this.emit(ne.LocalTrackPublished,a,this.localParticipant),fi(a.track)&&(yield a.track.checkForSilence())&&this.emit(ne.LocalAudioSilenceDetected,a);const f=yield(h=a.track)===null||h===void 0?void 0:h.getDeviceId(!1),g=Rc(a.source);g&&f&&f!==this.localParticipant.activeDeviceMap.get(g)&&(this.localParticipant.activeDeviceMap.set(g,f),this.emit(ne.ActiveDeviceChanged,g,f))}),this.onLocalTrackUnpublished=a=>{var o,c;(o=a.track)===null||o===void 0||o.off(ae.TrackProcessorUpdate,this.onTrackProcessorUpdate),(c=a.track)===null||c===void 0||c.off(ae.Restarted,this.onLocalTrackRestarted),this.emit(ne.LocalTrackUnpublished,a,this.localParticipant)},this.onLocalTrackRestarted=a=>P(this,void 0,void 0,function*(){const o=yield a.getDeviceId(!1),c=Rc(a.source);c&&o&&o!==this.localParticipant.activeDeviceMap.get(c)&&(this.log.debug("local track restarted, setting ".concat(c," ").concat(o," active"),this.logContext),this.localParticipant.activeDeviceMap.set(c,o),this.emit(ne.ActiveDeviceChanged,c,o))}),this.onLocalConnectionQualityChanged=a=>{this.emit(ne.ConnectionQualityChanged,a,this.localParticipant)},this.onMediaDevicesError=(a,o)=>{this.emit(ne.MediaDevicesError,a,o)},this.onLocalParticipantPermissionsChanged=a=>{this.emit(ne.ParticipantPermissionsChanged,a,this.localParticipant)},this.onLocalChatMessageSent=a=>{this.emit(ne.ChatMessage,a,this.localParticipant)},this.setMaxListeners(100),this.remoteParticipants=new Map,this.sidToIdentity=new Map,this.options=Object.assign(Object.assign({},rb),e),this.log=li((n=this.options.loggerName)!==null&&n!==void 0?n:Rn.Room),this.transcriptionReceivedTimes=new Map,this.options.audioCaptureDefaults=Object.assign(Object.assign({},If),e==null?void 0:e.audioCaptureDefaults),this.options.videoCaptureDefaults=Object.assign(Object.assign({},Df),e==null?void 0:e.videoCaptureDefaults),this.options.publishDefaults=Object.assign(Object.assign({},sb),e==null?void 0:e.publishDefaults),this.maybeCreateEngine(),this.incomingDataStreamManager=new Db,this.outgoingDataStreamManager=new Ub(this.engine,this.log),this.disconnectLock=new sn,this.localParticipant=new Wb("","",this.engine,this.options,this.rpcHandlers,this.outgoingDataStreamManager),this.options.videoCaptureDefaults.deviceId&&this.localParticipant.activeDeviceMap.set("videoinput",Oi(this.options.videoCaptureDefaults.deviceId)),this.options.audioCaptureDefaults.deviceId&&this.localParticipant.activeDeviceMap.set("audioinput",Oi(this.options.audioCaptureDefaults.deviceId)),!((s=this.options.audioOutput)===null||s===void 0)&&s.deviceId&&this.switchActiveDevice("audiooutput",Oi(this.options.audioOutput.deviceId)).catch(a=>this.log.warn("Could not set audio output: ".concat(a.message),this.logContext)),this.options.e2ee&&this.setupE2EE(),cn()){const a=new AbortController;(r=navigator.mediaDevices)===null||r===void 0||r.addEventListener("devicechange",this.handleDeviceChange,{signal:a.signal}),Bs.cleanupRegistry&&Bs.cleanupRegistry.register(this,()=>{a.abort()})}}registerTextStreamHandler(e,t){return this.incomingDataStreamManager.registerTextStreamHandler(e,t)}unregisterTextStreamHandler(e){return this.incomingDataStreamManager.unregisterTextStreamHandler(e)}registerByteStreamHandler(e,t){return this.incomingDataStreamManager.registerByteStreamHandler(e,t)}unregisterByteStreamHandler(e){return this.incomingDataStreamManager.unregisterByteStreamHandler(e)}registerRpcMethod(e,t){if(this.rpcHandlers.has(e))throw Error("RPC handler already registered for method ".concat(e,", unregisterRpcMethod before trying to register again"));this.rpcHandlers.set(e,t)}unregisterRpcMethod(e){this.rpcHandlers.delete(e)}setE2EEEnabled(e){return P(this,void 0,void 0,function*(){if(this.e2eeManager)yield Promise.all([this.localParticipant.setE2EEEnabled(e)]),this.localParticipant.identity!==""&&this.e2eeManager.setParticipantCryptorEnabled(e,this.localParticipant.identity);else throw Error("e2ee not configured, please set e2ee settings within the room options")})}setupE2EE(){var e;this.options.e2ee&&("e2eeManager"in this.options.e2ee?this.e2eeManager=this.options.e2ee.e2eeManager:this.e2eeManager=new H0(this.options.e2ee),this.e2eeManager.on(Ni.ParticipantEncryptionStatusChanged,(t,n)=>{L0(n)&&(this.isE2EEEnabled=t),this.emit(ne.ParticipantEncryptionStatusChanged,t,n)}),this.e2eeManager.on(Ni.EncryptionError,t=>this.emit(ne.EncryptionError,t)),(e=this.e2eeManager)===null||e===void 0||e.setup(this))}get logContext(){var e;return{room:this.name,roomID:(e=this.roomInfo)===null||e===void 0?void 0:e.sid,participant:this.localParticipant.identity,pID:this.localParticipant.sid}}get isRecording(){var e,t;return(t=(e=this.roomInfo)===null||e===void 0?void 0:e.activeRecording)!==null&&t!==void 0?t:!1}getSid(){return P(this,void 0,void 0,function*(){return this.state===st.Disconnected?"":this.roomInfo&&this.roomInfo.sid!==""?this.roomInfo.sid:new Promise((e,t)=>{const n=s=>{s.sid!==""&&(this.engine.off(le.RoomUpdate,n),e(s.sid))};this.engine.on(le.RoomUpdate,n),this.once(ne.Disconnected,()=>{this.engine.off(le.RoomUpdate,n),t("Room disconnected before room server id was available")})})})}get name(){var e,t;return(t=(e=this.roomInfo)===null||e===void 0?void 0:e.name)!==null&&t!==void 0?t:""}get metadata(){var e;return(e=this.roomInfo)===null||e===void 0?void 0:e.metadata}get numParticipants(){var e,t;return(t=(e=this.roomInfo)===null||e===void 0?void 0:e.numParticipants)!==null&&t!==void 0?t:0}get numPublishers(){var e,t;return(t=(e=this.roomInfo)===null||e===void 0?void 0:e.numPublishers)!==null&&t!==void 0?t:0}maybeCreateEngine(){this.engine&&!this.engine.isClosed||(this.engine=new wb(this.options),this.engine.on(le.ParticipantUpdate,this.handleParticipantUpdates).on(le.RoomUpdate,this.handleRoomUpdate).on(le.SpeakersChanged,this.handleSpeakersChanged).on(le.StreamStateChanged,this.handleStreamStateUpdate).on(le.ConnectionQualityUpdate,this.handleConnectionQualityUpdate).on(le.SubscriptionError,this.handleSubscriptionError).on(le.SubscriptionPermissionUpdate,this.handleSubscriptionPermissionUpdate).on(le.MediaTrackAdded,(e,t,n)=>{this.onTrackAdded(e,t,n)}).on(le.Disconnected,e=>{this.handleDisconnect(this.options.stopLocalTrackOnUnpublish,e)}).on(le.ActiveSpeakersUpdate,this.handleActiveSpeakersUpdate).on(le.DataPacketReceived,this.handleDataPacket).on(le.Resuming,()=>{this.clearConnectionReconcile(),this.isResuming=!0,this.log.info("Resuming signal connection",this.logContext),this.setAndEmitConnectionState(st.SignalReconnecting)&&this.emit(ne.SignalReconnecting)}).on(le.Resumed,()=>{this.registerConnectionReconcile(),this.isResuming=!1,this.log.info("Resumed signal connection",this.logContext),this.updateSubscriptions(),this.emitBufferedEvents(),this.setAndEmitConnectionState(st.Connected)&&this.emit(ne.Reconnected)}).on(le.SignalResumed,()=>{this.bufferedEvents=[],(this.state===st.Reconnecting||this.isResuming)&&this.sendSyncState()}).on(le.Restarting,this.handleRestarting).on(le.SignalRestarted,this.handleSignalRestarted).on(le.Offline,()=>{this.setAndEmitConnectionState(st.Reconnecting)&&this.emit(ne.Reconnecting)}).on(le.DCBufferStatusChanged,(e,t)=>{this.emit(ne.DCBufferStatusChanged,e,t)}).on(le.LocalTrackSubscribed,e=>{const t=this.localParticipant.getTrackPublications().find(n=>{let{trackSid:s}=n;return s===e});if(!t){this.log.warn("could not find local track subscription for subscribed event",this.logContext);return}this.localParticipant.emit(ce.LocalTrackSubscribed,t),this.emitWhenConnected(ne.LocalTrackSubscribed,t,this.localParticipant)}).on(le.RoomMoved,e=>{this.log.debug("room moved",e),e.room&&this.handleRoomUpdate(e.room),this.remoteParticipants.forEach((t,n)=>{this.handleParticipantDisconnected(n,t)}),this.emit(ne.Moved,e.room.name),e.participant?this.handleParticipantUpdates([e.participant,...e.otherParticipants]):this.handleParticipantUpdates(e.otherParticipants)}),this.localParticipant&&this.localParticipant.setupEngine(this.engine),this.e2eeManager&&this.e2eeManager.setupEngine(this.engine),this.outgoingDataStreamManager&&this.outgoingDataStreamManager.setupEngine(this.engine))}static getLocalDevices(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0;return Wt.getInstance().getDevices(e,t)}prepareConnection(e,t){return P(this,void 0,void 0,function*(){if(this.state===st.Disconnected){this.log.debug("prepareConnection to ".concat(e),this.logContext);try{if(yc(new URL(e))&&t){this.regionUrlProvider=new jc(e,t);const n=yield this.regionUrlProvider.getNextBestRegionUrl();n&&this.state===st.Disconnected&&(this.regionUrl=n,yield fetch(Cc(n),{method:"HEAD"}),this.log.debug("prepared connection to ".concat(n),this.logContext))}else yield fetch(Cc(e),{method:"HEAD"})}catch(n){this.log.warn("could not prepare connection",Object.assign(Object.assign({},this.logContext),{error:n}))}}})}getParticipantByIdentity(e){return this.localParticipant.identity===e?this.localParticipant:this.remoteParticipants.get(e)}clearConnectionFutures(){this.connectFuture=void 0}simulateScenario(e,t){return P(this,void 0,void 0,function*(){let n=()=>{},s;switch(e){case"signal-reconnect":yield this.engine.client.handleOnClose("simulate disconnect");break;case"speaker":s=new Gn({scenario:{case:"speakerUpdate",value:3}});break;case"node-failure":s=new Gn({scenario:{case:"nodeFailure",value:!0}});break;case"server-leave":s=new Gn({scenario:{case:"serverLeave",value:!0}});break;case"migration":s=new Gn({scenario:{case:"migration",value:!0}});break;case"resume-reconnect":this.engine.failNext(),yield this.engine.client.handleOnClose("simulate resume-disconnect");break;case"disconnect-signal-on-resume":n=()=>P(this,void 0,void 0,function*(){yield this.engine.client.handleOnClose("simulate resume-disconnect")}),s=new Gn({scenario:{case:"disconnectSignalOnResume",value:!0}});break;case"disconnect-signal-on-resume-no-messages":n=()=>P(this,void 0,void 0,function*(){yield this.engine.client.handleOnClose("simulate resume-disconnect")}),s=new Gn({scenario:{case:"disconnectSignalOnResumeNoMessages",value:!0}});break;case"full-reconnect":this.engine.fullReconnectOnNext=!0,yield this.engine.client.handleOnClose("simulate full-reconnect");break;case"force-tcp":case"force-tls":s=new Gn({scenario:{case:"switchCandidateProtocol",value:e==="force-tls"?2:1}}),n=()=>P(this,void 0,void 0,function*(){const r=this.engine.client.onLeave;r&&r(new ba({reason:wn.CLIENT_INITIATED,action:Is.RECONNECT}))});break;case"subscriber-bandwidth":if(t===void 0||typeof t!="number")throw new Error("subscriber-bandwidth requires a number as argument");s=new Gn({scenario:{case:"subscriberBandwidth",value:cs(t)}});break;case"leave-full-reconnect":s=new Gn({scenario:{case:"leaveRequestFullReconnect",value:!0}})}s&&(yield this.engine.client.sendSimulateScenario(s),yield n())})}get canPlaybackAudio(){return this.audioEnabled}get canPlaybackVideo(){return!this.isVideoPlaybackBlocked}getActiveDevice(e){return this.localParticipant.activeDeviceMap.get(e)}switchActiveDevice(e,t){return P(this,arguments,void 0,function(n,s){var r=this;let a=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!0;return function*(){var o,c,l,d,u,h,f;let g=!0,v=!1;const m=a?{exact:s}:s;if(n==="audioinput"){v=r.localParticipant.audioTrackPublications.size===0;const p=(o=r.getActiveDevice(n))!==null&&o!==void 0?o:r.options.audioCaptureDefaults.deviceId;r.options.audioCaptureDefaults.deviceId=m;const x=Array.from(r.localParticipant.audioTrackPublications.values()).filter(b=>b.source===Z.Source.Microphone);try{g=(yield Promise.all(x.map(b=>{var S;return(S=b.audioTrack)===null||S===void 0?void 0:S.setDeviceId(m)}))).every(b=>b===!0)}catch(b){throw r.options.audioCaptureDefaults.deviceId=p,b}const C=x.some(b=>{var S,M;return(M=(S=b.track)===null||S===void 0?void 0:S.isMuted)!==null&&M!==void 0?M:!1});g&&C&&(v=!0)}else if(n==="videoinput"){v=r.localParticipant.videoTrackPublications.size===0;const p=(c=r.getActiveDevice(n))!==null&&c!==void 0?c:r.options.videoCaptureDefaults.deviceId;r.options.videoCaptureDefaults.deviceId=m;const x=Array.from(r.localParticipant.videoTrackPublications.values()).filter(b=>b.source===Z.Source.Camera);try{g=(yield Promise.all(x.map(b=>{var S;return(S=b.videoTrack)===null||S===void 0?void 0:S.setDeviceId(m)}))).every(b=>b===!0)}catch(b){throw r.options.videoCaptureDefaults.deviceId=p,b}const C=x.some(b=>{var S,M;return(M=(S=b.track)===null||S===void 0?void 0:S.isMuted)!==null&&M!==void 0?M:!1});g&&C&&(v=!0)}else if(n==="audiooutput"){if(v=!0,!_c()&&!r.options.webAudioMix||r.options.webAudioMix&&r.audioContext&&!("setSinkId"in r.audioContext))throw new Error("cannot switch audio output, the current browser does not support it");r.options.webAudioMix&&(s=(l=yield Wt.getInstance().normalizeDeviceId("audiooutput",s))!==null&&l!==void 0?l:""),(d=(f=r.options).audioOutput)!==null&&d!==void 0||(f.audioOutput={});const p=(u=r.getActiveDevice(n))!==null&&u!==void 0?u:r.options.audioOutput.deviceId;r.options.audioOutput.deviceId=s;try{r.options.webAudioMix&&((h=r.audioContext)===null||h===void 0||h.setSinkId(s)),yield Promise.all(Array.from(r.remoteParticipants.values()).map(x=>x.setAudioOutput({deviceId:s})))}catch(x){throw r.options.audioOutput.deviceId=p,x}}return v&&(r.localParticipant.activeDeviceMap.set(n,s),r.emit(ne.ActiveDeviceChanged,n,s)),g}()})}setupLocalParticipantEvents(){this.localParticipant.on(ce.ParticipantMetadataChanged,this.onLocalParticipantMetadataChanged).on(ce.ParticipantNameChanged,this.onLocalParticipantNameChanged).on(ce.AttributesChanged,this.onLocalAttributesChanged).on(ce.TrackMuted,this.onLocalTrackMuted).on(ce.TrackUnmuted,this.onLocalTrackUnmuted).on(ce.LocalTrackPublished,this.onLocalTrackPublished).on(ce.LocalTrackUnpublished,this.onLocalTrackUnpublished).on(ce.ConnectionQualityChanged,this.onLocalConnectionQualityChanged).on(ce.MediaDevicesError,this.onMediaDevicesError).on(ce.AudioStreamAcquired,this.startAudio).on(ce.ChatMessage,this.onLocalChatMessageSent).on(ce.ParticipantPermissionsChanged,this.onLocalParticipantPermissionsChanged)}recreateEngine(){var e;(e=this.engine)===null||e===void 0||e.close(),this.engine=void 0,this.isResuming=!1,this.remoteParticipants.clear(),this.sidToIdentity.clear(),this.bufferedEvents=[],this.maybeCreateEngine()}onTrackAdded(e,t,n){if(this.state===st.Connecting||this.state===st.Reconnecting){const u=()=>{this.onTrackAdded(e,t,n),h()},h=()=>{this.off(ne.Reconnected,u),this.off(ne.Connected,u),this.off(ne.Disconnected,h)};this.once(ne.Reconnected,u),this.once(ne.Connected,u),this.once(ne.Disconnected,h);return}if(this.state===st.Disconnected){this.log.warn("skipping incoming track after Room disconnected",this.logContext);return}if(e.readyState==="ended"){this.log.info("skipping incoming track as it already ended",this.logContext);return}const s=_0(t.id),r=s[0];let a=s[1],o=e.id;if(a&&a.startsWith("TR")&&(o=a),r===this.localParticipant.sid){this.log.warn("tried to create RemoteParticipant for local participant",this.logContext);return}const c=Array.from(this.remoteParticipants.values()).find(u=>u.sid===r);if(!c){this.log.error("Tried to add a track for a participant, that's not present. Sid: ".concat(r),this.logContext);return}let l;this.options.adaptiveStream&&(typeof this.options.adaptiveStream=="object"?l=this.options.adaptiveStream:l={});const d=c.addSubscribedMediaTrack(e,o,t,n,l);d!=null&&d.isEncrypted&&!this.e2eeManager&&this.emit(ne.EncryptionError,new Error("Encrypted ".concat(d.source," track received from participant ").concat(c.sid,", but room does not have encryption enabled!")))}handleDisconnect(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!0,t=arguments.length>1?arguments[1]:void 0;var n;if(this.clearConnectionReconcile(),this.isResuming=!1,this.bufferedEvents=[],this.transcriptionReceivedTimes.clear(),this.incomingDataStreamManager.clearHandlersAndControllers(),this.state!==st.Disconnected){this.regionUrl=void 0;try{this.remoteParticipants.forEach(s=>{s.trackPublications.forEach(r=>{s.unpublishTrack(r.trackSid)})}),this.localParticipant.trackPublications.forEach(s=>{var r,a,o;s.track&&this.localParticipant.unpublishTrack(s.track,e),e?((r=s.track)===null||r===void 0||r.detach(),(a=s.track)===null||a===void 0||a.stop()):(o=s.track)===null||o===void 0||o.stopMonitor()}),this.localParticipant.off(ce.ParticipantMetadataChanged,this.onLocalParticipantMetadataChanged).off(ce.ParticipantNameChanged,this.onLocalParticipantNameChanged).off(ce.AttributesChanged,this.onLocalAttributesChanged).off(ce.TrackMuted,this.onLocalTrackMuted).off(ce.TrackUnmuted,this.onLocalTrackUnmuted).off(ce.LocalTrackPublished,this.onLocalTrackPublished).off(ce.LocalTrackUnpublished,this.onLocalTrackUnpublished).off(ce.ConnectionQualityChanged,this.onLocalConnectionQualityChanged).off(ce.MediaDevicesError,this.onMediaDevicesError).off(ce.AudioStreamAcquired,this.startAudio).off(ce.ChatMessage,this.onLocalChatMessageSent).off(ce.ParticipantPermissionsChanged,this.onLocalParticipantPermissionsChanged),this.localParticipant.trackPublications.clear(),this.localParticipant.videoTrackPublications.clear(),this.localParticipant.audioTrackPublications.clear(),this.remoteParticipants.clear(),this.sidToIdentity.clear(),this.activeSpeakers=[],this.audioContext&&typeof this.options.webAudioMix=="boolean"&&(this.audioContext.close(),this.audioContext=void 0),cn()&&(window.removeEventListener("beforeunload",this.onPageLeave),window.removeEventListener("pagehide",this.onPageLeave),window.removeEventListener("freeze",this.onPageLeave),(n=navigator.mediaDevices)===null||n===void 0||n.removeEventListener("devicechange",this.handleDeviceChange))}finally{this.setAndEmitConnectionState(st.Disconnected),this.emit(ne.Disconnected,t)}}}handleParticipantDisconnected(e,t){var n;this.remoteParticipants.delete(e),t&&(this.incomingDataStreamManager.validateParticipantHasNoActiveDataStreams(e),t.trackPublications.forEach(s=>{t.unpublishTrack(s.trackSid,!0)}),this.emit(ne.ParticipantDisconnected,t),t.setDisconnected(),(n=this.localParticipant)===null||n===void 0||n.handleParticipantDisconnected(t.identity))}handleIncomingRpcRequest(e,t,n,s,r,a){return P(this,void 0,void 0,function*(){if(yield this.engine.publishRpcAck(e,t),a!==1){yield this.engine.publishRpcResponse(e,t,null,At.builtIn("UNSUPPORTED_VERSION"));return}const o=this.rpcHandlers.get(n);if(!o){yield this.engine.publishRpcResponse(e,t,null,At.builtIn("UNSUPPORTED_METHOD"));return}let c=null,l=null;try{const d=yield o({requestId:t,callerIdentity:e,payload:s,responseTimeout:r});Bc(d)>Lf?(c=At.builtIn("RESPONSE_PAYLOAD_TOO_LARGE"),console.warn("RPC Response payload too large for ".concat(n))):l=d}catch(d){d instanceof At?c=d:(console.warn("Uncaught error returned by RPC handler for ".concat(n,". Returning APPLICATION_ERROR instead."),d),c=At.builtIn("APPLICATION_ERROR"))}yield this.engine.publishRpcResponse(e,t,l,c)})}selectDefaultDevices(){return P(this,void 0,void 0,function*(){var e,t,n;const s=Wt.getInstance().previousDevices,r=yield Wt.getInstance().getDevices(void 0,!1),a=fn();if((a==null?void 0:a.name)==="Chrome"&&a.os!=="iOS")for(let c of r){const l=s.find(d=>d.deviceId===c.deviceId);l&&l.label!==""&&l.kind===c.kind&&l.label!==c.label&&this.getActiveDevice(c.kind)==="default"&&this.emit(ne.ActiveDeviceChanged,c.kind,c.deviceId)}const o=["audiooutput","audioinput","videoinput"];for(let c of o){const l=U0(c),d=this.localParticipant.getTrackPublication(l);if(d&&(!((e=d.track)===null||e===void 0)&&e.isUserProvided))continue;const u=r.filter(f=>f.kind===c),h=this.getActiveDevice(c);if(h===((t=s.filter(f=>f.kind===c)[0])===null||t===void 0?void 0:t.deviceId)&&u.length>0&&((n=u[0])===null||n===void 0?void 0:n.deviceId)!==h){yield this.switchActiveDevice(c,u[0].deviceId);continue}c==="audioinput"&&!Ir()||c==="videoinput"||u.length>0&&!u.find(f=>f.deviceId===this.getActiveDevice(c))&&(c!=="audiooutput"||!Ir())&&(yield this.switchActiveDevice(c,u[0].deviceId))}})}acquireAudioContext(){return P(this,void 0,void 0,function*(){var e,t;if(typeof this.options.webAudioMix!="boolean"&&this.options.webAudioMix.audioContext?this.audioContext=this.options.webAudioMix.audioContext:(!this.audioContext||this.audioContext.state==="closed")&&(this.audioContext=(e=_f())!==null&&e!==void 0?e:void 0),this.options.webAudioMix&&this.remoteParticipants.forEach(s=>s.setAudioContext(this.audioContext)),this.localParticipant.setAudioContext(this.audioContext),this.audioContext&&this.audioContext.state==="suspended")try{yield Promise.race([this.audioContext.resume(),on(200)])}catch(s){this.log.warn("Could not resume audio context",Object.assign(Object.assign({},this.logContext),{error:s}))}const n=((t=this.audioContext)===null||t===void 0?void 0:t.state)==="running";n!==this.canPlaybackAudio&&(this.audioEnabled=n,this.emit(ne.AudioPlaybackStatusChanged,n))})}createParticipant(e,t){var n;let s;return t?s=Na.fromParticipantInfo(this.engine.client,t,{loggerContextCb:()=>this.logContext,loggerName:this.options.loggerName}):s=new Na(this.engine.client,"",e,void 0,void 0,void 0,{loggerContextCb:()=>this.logContext,loggerName:this.options.loggerName}),this.options.webAudioMix&&s.setAudioContext(this.audioContext),!((n=this.options.audioOutput)===null||n===void 0)&&n.deviceId&&s.setAudioOutput(this.options.audioOutput).catch(r=>this.log.warn("Could not set audio output: ".concat(r.message),this.logContext)),s}getOrCreateParticipant(e,t){if(this.remoteParticipants.has(e)){const s=this.remoteParticipants.get(e);return t&&s.updateInfo(t)&&this.sidToIdentity.set(t.sid,t.identity),s}const n=this.createParticipant(e,t);return this.remoteParticipants.set(e,n),this.sidToIdentity.set(t.sid,t.identity),this.emitWhenConnected(ne.ParticipantConnected,n),n.on(ce.TrackPublished,s=>{this.emitWhenConnected(ne.TrackPublished,s,n)}).on(ce.TrackSubscribed,(s,r)=>{s.kind===Z.Kind.Audio?(s.on(ae.AudioPlaybackStarted,this.handleAudioPlaybackStarted),s.on(ae.AudioPlaybackFailed,this.handleAudioPlaybackFailed)):s.kind===Z.Kind.Video&&(s.on(ae.VideoPlaybackFailed,this.handleVideoPlaybackFailed),s.on(ae.VideoPlaybackStarted,this.handleVideoPlaybackStarted)),this.emit(ne.TrackSubscribed,s,r,n)}).on(ce.TrackUnpublished,s=>{this.emit(ne.TrackUnpublished,s,n)}).on(ce.TrackUnsubscribed,(s,r)=>{this.emit(ne.TrackUnsubscribed,s,r,n)}).on(ce.TrackMuted,s=>{this.emitWhenConnected(ne.TrackMuted,s,n)}).on(ce.TrackUnmuted,s=>{this.emitWhenConnected(ne.TrackUnmuted,s,n)}).on(ce.ParticipantMetadataChanged,s=>{this.emitWhenConnected(ne.ParticipantMetadataChanged,s,n)}).on(ce.ParticipantNameChanged,s=>{this.emitWhenConnected(ne.ParticipantNameChanged,s,n)}).on(ce.AttributesChanged,s=>{this.emitWhenConnected(ne.ParticipantAttributesChanged,s,n)}).on(ce.ConnectionQualityChanged,s=>{this.emitWhenConnected(ne.ConnectionQualityChanged,s,n)}).on(ce.ParticipantPermissionsChanged,s=>{this.emitWhenConnected(ne.ParticipantPermissionsChanged,s,n)}).on(ce.TrackSubscriptionStatusChanged,(s,r)=>{this.emitWhenConnected(ne.TrackSubscriptionStatusChanged,s,r,n)}).on(ce.TrackSubscriptionFailed,(s,r)=>{this.emit(ne.TrackSubscriptionFailed,s,n,r)}).on(ce.TrackSubscriptionPermissionChanged,(s,r)=>{this.emitWhenConnected(ne.TrackSubscriptionPermissionChanged,s,r,n)}).on(ce.Active,()=>{this.emitWhenConnected(ne.ParticipantActive,n),n.kind===Mr.AGENT&&this.localParticipant.setActiveAgent(n)}),t&&n.updateInfo(t),n}sendSyncState(){const e=Array.from(this.remoteParticipants.values()).reduce((n,s)=>(n.push(...s.getTrackPublications()),n),[]),t=this.localParticipant.getTrackPublications();this.engine.sendSyncState(e,t)}updateSubscriptions(){for(const e of this.remoteParticipants.values())for(const t of e.videoTrackPublications.values())t.isSubscribed&&D0(t)&&t.emitTrackUpdate()}getRemoteParticipantBySid(e){const t=this.sidToIdentity.get(e);if(t)return this.remoteParticipants.get(t)}registerConnectionReconcile(){this.clearConnectionReconcile();let e=0;this.connectionReconcileInterval=$t.setInterval(()=>{!this.engine||this.engine.isClosed||!this.engine.verifyTransport()?(e++,this.log.warn("detected connection state mismatch",Object.assign(Object.assign({},this.logContext),{numFailures:e,engine:this.engine?{closed:this.engine.isClosed,transportsConnected:this.engine.verifyTransport()}:void 0})),e>=3&&(this.recreateEngine(),this.handleDisconnect(this.options.stopLocalTrackOnUnpublish,wn.STATE_MISMATCH))):e=0},jb)}clearConnectionReconcile(){this.connectionReconcileInterval&&$t.clearInterval(this.connectionReconcileInterval)}setAndEmitConnectionState(e){return e===this.state?!1:(this.state=e,this.emit(ne.ConnectionStateChanged,this.state),!0)}emitBufferedEvents(){this.bufferedEvents.forEach(e=>{let[t,n]=e;this.emit(t,...n)}),this.bufferedEvents=[]}emitWhenConnected(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),s=1;s<t;s++)n[s-1]=arguments[s];if(this.state===st.Reconnecting||this.isResuming||!this.engine||this.engine.pendingReconnect)this.bufferedEvents.push([e,n]);else if(this.state===st.Connected)return this.emit(e,...n);return!1}simulateParticipants(e){return P(this,void 0,void 0,function*(){var t,n;const s=Object.assign({audio:!0,video:!0,useRealTracks:!1},e.publish),r=Object.assign({count:9,audio:!1,video:!0,aspectRatios:[1.66,1.7,1.3]},e.participants);if(this.handleDisconnect(),this.roomInfo=new ma({sid:"RM_SIMULATED",name:"simulated-room",emptyTimeout:0,maxParticipants:0,creationTime:Et.parse(new Date().getTime()),metadata:"",numParticipants:1,numPublishers:1,turnPassword:"",enabledCodecs:[],activeRecording:!1}),this.localParticipant.updateInfo(new ns({identity:"simulated-local",name:"local-name"})),this.setupLocalParticipantEvents(),this.emit(ne.SignalConnected),this.emit(ne.Connected),this.setAndEmitConnectionState(st.Connected),s.video){const a=new Kc(Z.Kind.Video,new ks({source:Lt.CAMERA,sid:Math.floor(Math.random()*1e4).toString(),type:Mn.AUDIO,name:"video-dummy"}),new Da(s.useRealTracks?(yield window.navigator.mediaDevices.getUserMedia({video:!0})).getVideoTracks()[0]:mf(160*((t=r.aspectRatios[0])!==null&&t!==void 0?t:1),160,!0,!0),void 0,!1,{loggerName:this.options.loggerName,loggerContextCb:()=>this.logContext}),{loggerName:this.options.loggerName,loggerContextCb:()=>this.logContext});this.localParticipant.addTrackPublication(a),this.localParticipant.emit(ce.LocalTrackPublished,a)}if(s.audio){const a=new Kc(Z.Kind.Audio,new ks({source:Lt.MICROPHONE,sid:Math.floor(Math.random()*1e4).toString(),type:Mn.AUDIO}),new Ia(s.useRealTracks?(yield navigator.mediaDevices.getUserMedia({audio:!0})).getAudioTracks()[0]:Tc(),void 0,!1,this.audioContext,{loggerName:this.options.loggerName,loggerContextCb:()=>this.logContext}),{loggerName:this.options.loggerName,loggerContextCb:()=>this.logContext});this.localParticipant.addTrackPublication(a),this.localParticipant.emit(ce.LocalTrackPublished,a)}for(let a=0;a<r.count-1;a+=1){let o=new ns({sid:Math.floor(Math.random()*1e4).toString(),identity:"simulated-".concat(a),state:Ps.ACTIVE,tracks:[],joinedAt:Et.parse(Date.now())});const c=this.getOrCreateParticipant(o.identity,o);if(r.video){const l=mf(160*((n=r.aspectRatios[a%r.aspectRatios.length])!==null&&n!==void 0?n:1),160,!1,!0),d=new ks({source:Lt.CAMERA,sid:Math.floor(Math.random()*1e4).toString(),type:Mn.AUDIO});c.addSubscribedMediaTrack(l,d.sid,new MediaStream([l]),new RTCRtpReceiver),o.tracks=[...o.tracks,d]}if(r.audio){const l=Tc(),d=new ks({source:Lt.MICROPHONE,sid:Math.floor(Math.random()*1e4).toString(),type:Mn.AUDIO});c.addSubscribedMediaTrack(l,d.sid,new MediaStream([l]),new RTCRtpReceiver),o.tracks=[...o.tracks,d]}c.updateInfo(o)}})}emit(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),s=1;s<t;s++)n[s-1]=arguments[s];if(e!==ne.ActiveSpeakersChanged&&e!==ne.TranscriptionReceived){const r=Yf(n).filter(a=>a!==void 0);this.log.debug("room event ".concat(e),Object.assign(Object.assign({},this.logContext),{event:e,args:r}))}return super.emit(e,...n)}}Bs.cleanupRegistry=typeof FinalizationRegistry<"u"&&new FinalizationRegistry(i=>{i()});function Yf(i){return i.map(e=>{if(e)return Array.isArray(e)?Yf(e):typeof e=="object"?"logContext"in e?e.logContext:void 0:e})}var Dn;(function(i){i[i.IDLE=0]="IDLE",i[i.RUNNING=1]="RUNNING",i[i.SKIPPED=2]="SKIPPED",i[i.SUCCESS=3]="SUCCESS",i[i.FAILED=4]="FAILED"})(Dn||(Dn={}));class Gi extends Hn.EventEmitter{constructor(e,t){let n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};super(),this.status=Dn.IDLE,this.logs=[],this.options={},this.url=e,this.token=t,this.name=this.constructor.name,this.room=new Bs(n.roomOptions),this.connectOptions=n.connectOptions,this.options=n}run(e){return P(this,void 0,void 0,function*(){if(this.status!==Dn.IDLE)throw Error("check is running already");this.setStatus(Dn.RUNNING);try{yield this.perform()}catch(t){t instanceof Error&&(this.options.errorsAsWarnings?this.appendWarning(t.message):this.appendError(t.message))}return yield this.disconnect(),yield new Promise(t=>setTimeout(t,500)),this.status!==Dn.SKIPPED&&this.setStatus(this.isSuccess()?Dn.SUCCESS:Dn.FAILED),e&&e(),this.getInfo()})}isSuccess(){return!this.logs.some(e=>e.level==="error")}connect(e){return P(this,void 0,void 0,function*(){return this.room.state===st.Connected?this.room:(e||(e=this.url),yield this.room.connect(e,this.token,this.connectOptions),this.room)})}disconnect(){return P(this,void 0,void 0,function*(){this.room&&this.room.state!==st.Disconnected&&(yield this.room.disconnect(),yield new Promise(e=>setTimeout(e,500)))})}skip(){this.setStatus(Dn.SKIPPED)}switchProtocol(e){return P(this,void 0,void 0,function*(){let t=!1,n=!1;if(this.room.on(ne.Reconnecting,()=>{t=!0}),this.room.once(ne.Reconnected,()=>{n=!0}),this.room.simulateScenario("force-".concat(e)),yield new Promise(r=>setTimeout(r,1e3)),!t)return;const s=Date.now()+1e4;for(;Date.now()<s;){if(n)return;yield on(100)}throw new Error("Could not reconnect using ".concat(e," protocol after 10 seconds"))})}appendMessage(e){this.logs.push({level:"info",message:e}),this.emit("update",this.getInfo())}appendWarning(e){this.logs.push({level:"warning",message:e}),this.emit("update",this.getInfo())}appendError(e){this.logs.push({level:"error",message:e}),this.emit("update",this.getInfo())}setStatus(e){this.status=e,this.emit("update",this.getInfo())}get engine(){var e;return(e=this.room)===null||e===void 0?void 0:e.engine}getInfo(){return{logs:this.logs,name:this.name,status:this.status,description:this.description}}}class $b extends Gi{get description(){return"Cloud regions"}perform(){return P(this,void 0,void 0,function*(){const e=new jc(this.url,this.token);if(!e.isCloud()){this.skip();return}const t=[],n=new Set;for(let r=0;r<3;r++){const a=yield e.getNextBestRegionUrl();if(!a)break;if(n.has(a))continue;n.add(a);const o=yield this.checkCloudRegion(a);this.appendMessage("".concat(o.region," RTT: ").concat(o.rtt,"ms, duration: ").concat(o.duration,"ms")),t.push(o)}t.sort((r,a)=>(r.duration-a.duration)*.5+(r.rtt-a.rtt)*.5);const s=t[0];this.bestStats=s,this.appendMessage("best Cloud region: ".concat(s.region))})}getInfo(){const e=super.getInfo();return e.data=this.bestStats,e}checkCloudRegion(e){return P(this,void 0,void 0,function*(){var t,n;yield this.connect(e),this.options.protocol==="tcp"&&(yield this.switchProtocol("tcp"));const s=(t=this.room.serverInfo)===null||t===void 0?void 0:t.region;if(!s)throw new Error("Region not found");const r=yield this.room.localParticipant.streamText({topic:"test"}),a=1e3,c=1e6/a,l="A".repeat(a),d=Date.now();for(let g=0;g<c;g++)yield r.write(l);yield r.close();const u=Date.now(),h=yield(n=this.room.engine.pcManager)===null||n===void 0?void 0:n.publisher.getStats(),f={region:s,rtt:1e4,duration:u-d};return h==null||h.forEach(g=>{g.type==="candidate-pair"&&g.nominated&&(f.rtt=g.currentRoundTripTime*1e3)}),yield this.disconnect(),f})}}const Yc=1e4;class Xb extends Gi{get description(){return"Connection via UDP vs TCP"}perform(){return P(this,void 0,void 0,function*(){const e=yield this.checkConnectionProtocol("udp"),t=yield this.checkConnectionProtocol("tcp");this.bestStats=e,e.qualityLimitationDurations.bandwidth-t.qualityLimitationDurations.bandwidth>.5||(e.packetsLost-t.packetsLost)/e.packetsSent>.01?(this.appendMessage("best connection quality via tcp"),this.bestStats=t):this.appendMessage("best connection quality via udp");const n=this.bestStats;this.appendMessage("upstream bitrate: ".concat((n.bitrateTotal/n.count/1e3/1e3).toFixed(2)," mbps")),this.appendMessage("RTT: ".concat((n.rttTotal/n.count*1e3).toFixed(2)," ms")),this.appendMessage("jitter: ".concat((n.jitterTotal/n.count*1e3).toFixed(2)," ms")),n.packetsLost>0&&this.appendWarning("packets lost: ".concat((n.packetsLost/n.packetsSent*100).toFixed(2),"%")),n.qualityLimitationDurations.bandwidth>1&&this.appendWarning("bandwidth limited ".concat((n.qualityLimitationDurations.bandwidth/(Yc/1e3)*100).toFixed(2),"%")),n.qualityLimitationDurations.cpu>0&&this.appendWarning("cpu limited ".concat((n.qualityLimitationDurations.cpu/(Yc/1e3)*100).toFixed(2),"%"))})}getInfo(){const e=super.getInfo();return e.data=this.bestStats,e}checkConnectionProtocol(e){return P(this,void 0,void 0,function*(){yield this.connect(),e==="tcp"?yield this.switchProtocol("tcp"):yield this.switchProtocol("udp");const t=document.createElement("canvas");t.width=1280,t.height=720;const n=t.getContext("2d");if(!n)throw new Error("Could not get canvas context");let s=0;const r=()=>{s=(s+1)%360,n.fillStyle="hsl(".concat(s,", 100%, 50%)"),n.fillRect(0,0,t.width,t.height),requestAnimationFrame(r)};r();const o=t.captureStream(30).getVideoTracks()[0],l=(yield this.room.localParticipant.publishTrack(o,{simulcast:!1,degradationPreference:"maintain-resolution",videoEncoding:{maxBitrate:2e6}})).track,d={protocol:e,packetsLost:0,packetsSent:0,qualityLimitationDurations:{},rttTotal:0,jitterTotal:0,bitrateTotal:0,count:0},u=setInterval(()=>P(this,void 0,void 0,function*(){const h=yield l.getRTCStatsReport();h==null||h.forEach(f=>{f.type==="outbound-rtp"?(d.packetsSent=f.packetsSent,d.qualityLimitationDurations=f.qualityLimitationDurations,d.bitrateTotal+=f.targetBitrate,d.count++):f.type==="remote-inbound-rtp"&&(d.packetsLost=f.packetsLost,d.rttTotal+=f.roundTripTime,d.jitterTotal+=f.jitter)})}),1e3);return yield new Promise(h=>setTimeout(h,Yc)),clearInterval(u),o.stop(),t.remove(),yield this.disconnect(),d})}}class Kb extends Gi{get description(){return"Can publish audio"}perform(){return P(this,void 0,void 0,function*(){var e;const t=yield this.connect(),n=yield zb();if(yield bf(n,1e3))throw new Error("unable to detect audio from microphone");this.appendMessage("detected audio from microphone"),t.localParticipant.publishTrack(n),yield new Promise(o=>setTimeout(o,3e3));const r=yield(e=n.sender)===null||e===void 0?void 0:e.getStats();if(!r)throw new Error("Could not get RTCStats");let a=0;if(r.forEach(o=>{o.type==="outbound-rtp"&&(o.kind==="audio"||!o.kind&&o.mediaType==="audio")&&(a=o.packetsSent)}),a===0)throw new Error("Could not determine packets are sent");this.appendMessage("published ".concat(a," audio packets"))})}}class Yb extends Gi{get description(){return"Can publish video"}perform(){return P(this,void 0,void 0,function*(){var e;const t=yield this.connect(),n=yield Vb();yield this.checkForVideo(n.mediaStreamTrack),t.localParticipant.publishTrack(n),yield new Promise(a=>setTimeout(a,5e3));const s=yield(e=n.sender)===null||e===void 0?void 0:e.getStats();if(!s)throw new Error("Could not get RTCStats");let r=0;if(s.forEach(a=>{a.type==="outbound-rtp"&&(a.kind==="video"||!a.kind&&a.mediaType==="video")&&(r+=a.packetsSent)}),r===0)throw new Error("Could not determine packets are sent");this.appendMessage("published ".concat(r," video packets"))})}checkForVideo(e){return P(this,void 0,void 0,function*(){const t=new MediaStream;t.addTrack(e.clone());const n=document.createElement("video");n.srcObject=t,n.muted=!0,yield new Promise(s=>{n.onplay=()=>{setTimeout(()=>{var r,a,o,c;const l=document.createElement("canvas"),d=e.getSettings(),u=(a=(r=d.width)!==null&&r!==void 0?r:n.videoWidth)!==null&&a!==void 0?a:1280,h=(c=(o=d.height)!==null&&o!==void 0?o:n.videoHeight)!==null&&c!==void 0?c:720;l.width=u,l.height=h;const f=l.getContext("2d");f.drawImage(n,0,0);const v=f.getImageData(0,0,l.width,l.height).data;let m=!0;for(let p=0;p<v.length;p+=4)if(v[p]!==0||v[p+1]!==0||v[p+2]!==0){m=!1;break}m?this.appendError("camera appears to be producing only black frames"):this.appendMessage("received video frames"),s()},1e3)},n.play()}),t.getTracks().forEach(s=>s.stop()),n.remove()})}}class Jb extends Gi{get description(){return"Resuming connection after interruption"}perform(){return P(this,void 0,void 0,function*(){var e;const t=yield this.connect();let n=!1,s=!1,r;const a=new Promise(l=>{setTimeout(l,5e3),r=l}),o=()=>{n=!0};t.on(ne.SignalReconnecting,o).on(ne.Reconnecting,o).on(ne.Reconnected,()=>{s=!0,r(!0)}),(e=t.engine.client.ws)===null||e===void 0||e.close();const c=t.engine.client.onClose;if(c&&c(""),yield a,n){if(!s||t.state!==st.Connected)throw this.appendWarning("reconnection is only possible in Redis-based configurations"),new Error("Not able to reconnect")}else throw new Error("Did not attempt to reconnect")})}}class Zb extends Gi{get description(){return"Can connect via TURN"}perform(){return P(this,void 0,void 0,function*(){var e,t;const n=new kc,s=yield n.join(this.url,this.token,{autoSubscribe:!0,maxRetries:0,e2eeEnabled:!1,websocketTimeout:15e3});let r=!1,a=!1,o=!1;for(let c of s.iceServers)for(let l of c.urls)l.startsWith("turn:")?(a=!0,o=!0):l.startsWith("turns:")&&(a=!0,o=!0,r=!0),l.startsWith("stun:")&&(o=!0);o?a&&!r&&this.appendWarning("TURN is configured server side, but TURN/TLS is unavailable."):this.appendWarning("No STUN servers configured on server side."),yield n.close(),!((t=(e=this.connectOptions)===null||e===void 0?void 0:e.rtcConfig)===null||t===void 0)&&t.iceServers||a?yield this.room.connect(this.url,this.token,{rtcConfig:{iceTransportPolicy:"relay"}}):(this.appendWarning("No TURN servers configured."),this.skip(),yield new Promise(c=>setTimeout(c,0)))})}}class Qb extends Gi{get description(){return"Establishing WebRTC connection"}perform(){return P(this,void 0,void 0,function*(){let e=!1,t=!1;this.room.on(ne.SignalConnected,()=>{const n=this.room.engine.client.onTrickle;this.room.engine.client.onTrickle=(s,r)=>{if(s.candidate){const a=new RTCIceCandidate(s);let o="".concat(a.protocol," ").concat(a.address,":").concat(a.port," ").concat(a.type);a.address&&(e_(a.address)?o+=" (private)":a.protocol==="tcp"&&a.tcpType==="passive"?(e=!0,o+=" (passive)"):a.protocol==="udp"&&(t=!0)),this.appendMessage(o)}n&&n(s,r)},this.room.engine.pcManager&&(this.room.engine.pcManager.subscriber.onIceCandidateError=s=>{s instanceof RTCPeerConnectionIceErrorEvent&&this.appendWarning("error with ICE candidate: ".concat(s.errorCode," ").concat(s.errorText," ").concat(s.url))})});try{yield this.connect(),Ke.info("now the room is connected")}catch(n){throw this.appendWarning("ports need to be open on firewall in order to connect."),n}e||this.appendWarning("Server is not configured for ICE/TCP"),t||this.appendWarning("No public IPv4 UDP candidates were found. Your server is likely not configured correctly")})}}function e_(i){const e=i.split(".");if(e.length===4){if(e[0]==="10")return!0;if(e[0]==="192"&&e[1]==="168")return!0;if(e[0]==="172"){const t=parseInt(e[1],10);if(t>=16&&t<=31)return!0}}return!1}class t_ extends Gi{get description(){return"Connecting to signal connection via WebSocket"}perform(){return P(this,void 0,void 0,function*(){var e,t,n;(this.url.startsWith("ws:")||this.url.startsWith("http:"))&&this.appendWarning("Server is insecure, clients may block connections to it");let s=new kc;const r=yield s.join(this.url,this.token,{autoSubscribe:!0,maxRetries:0,e2eeEnabled:!1,websocketTimeout:15e3});this.appendMessage("Connected to server, version ".concat(r.serverVersion,".")),((e=r.serverInfo)===null||e===void 0?void 0:e.edition)===Xu.Cloud&&(!((t=r.serverInfo)===null||t===void 0)&&t.region)&&this.appendMessage("LiveKit Cloud: ".concat((n=r.serverInfo)===null||n===void 0?void 0:n.region)),yield s.close()})}}class lE extends Hn.EventEmitter{constructor(e,t){let n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};super(),this.options={},this.checkResults=new Map,this.url=e,this.token=t,this.options=n}getNextCheckId(){const e=this.checkResults.size;return this.checkResults.set(e,{logs:[],status:Dn.IDLE,name:"",description:""}),e}updateCheck(e,t){this.checkResults.set(e,t),this.emit("checkUpdate",e,t)}isSuccess(){return Array.from(this.checkResults.values()).every(e=>e.status!==Dn.FAILED)}getResults(){return Array.from(this.checkResults.values())}createAndRunCheck(e){return P(this,void 0,void 0,function*(){const t=this.getNextCheckId(),n=new e(this.url,this.token,this.options),s=a=>{this.updateCheck(t,a)};n.on("update",s);const r=yield n.run();return n.off("update",s),r})}checkWebsocket(){return P(this,void 0,void 0,function*(){return this.createAndRunCheck(t_)})}checkWebRTC(){return P(this,void 0,void 0,function*(){return this.createAndRunCheck(Qb)})}checkTURN(){return P(this,void 0,void 0,function*(){return this.createAndRunCheck(Zb)})}checkReconnect(){return P(this,void 0,void 0,function*(){return this.createAndRunCheck(Jb)})}checkPublishAudio(){return P(this,void 0,void 0,function*(){return this.createAndRunCheck(Kb)})}checkPublishVideo(){return P(this,void 0,void 0,function*(){return this.createAndRunCheck(Yb)})}checkConnectionProtocol(){return P(this,void 0,void 0,function*(){const e=yield this.createAndRunCheck(Xb);if(e.data&&"protocol"in e.data){const t=e.data;this.options.protocol=t.protocol}return e})}checkCloudRegion(){return P(this,void 0,void 0,function*(){return this.createAndRunCheck($b)})}}class Jc extends EventTarget{constructor(){super(),this.room=null,this.callStatus="idle",this.isReady=!1,this.error=null,this.microphoneEnabled=!1,this.connectedParticipants=[],this.userIdentity="",this.roomName="",this.audioPlaybackPrompt=!1,this.audioElements=new Map,this.audioContainer=null,this.wasConnectedBeforeHidden=!1,this.isPageVisible=!0,this.reconnectAttempts=0,this.maxReconnectAttempts=3,this.isReconnecting=!1,this.isDestroyed=!1,this.pendingTimers=new Set,this.isAppleDevice=/iPhone|iPad|iPod|Macintosh|Mac OS/i.test(navigator.userAgent),this.boundHandleVisibilityChange=this.handleVisibilityChange.bind(this),this.boundHandlePageHide=this.handlePageHide.bind(this),this.boundHandlePageShow=this.handlePageShow.bind(this),this.boundHandleOnline=this.handleOnline.bind(this),this.boundHandleOffline=this.handleOffline.bind(this),this.createAudioContainer(),this.setupLifecycleListeners()}createAudioContainer(){this.audioContainer=document.createElement("div"),this.audioContainer.id=`livekit-audio-${Date.now()}-${Math.random().toString(36).slice(2,9)}`,this.audioContainer.style.cssText="position:absolute;width:0;height:0;overflow:hidden;pointer-events:none;",document.body.appendChild(this.audioContainer)}scheduleTimer(e,t){const n=setTimeout(()=>{this.pendingTimers.delete(n),this.isDestroyed||e()},t);return this.pendingTimers.add(n),n}clearAllTimers(){this.pendingTimers.forEach(e=>clearTimeout(e)),this.pendingTimers.clear()}setupLifecycleListeners(){document.addEventListener("visibilitychange",this.boundHandleVisibilityChange),window.addEventListener("pagehide",this.boundHandlePageHide),window.addEventListener("pageshow",this.boundHandlePageShow),window.addEventListener("online",this.boundHandleOnline),window.addEventListener("offline",this.boundHandleOffline)}removeLifecycleListeners(){document.removeEventListener("visibilitychange",this.boundHandleVisibilityChange),window.removeEventListener("pagehide",this.boundHandlePageHide),window.removeEventListener("pageshow",this.boundHandlePageShow),window.removeEventListener("online",this.boundHandleOnline),window.removeEventListener("offline",this.boundHandleOffline)}handleVisibilityChange(){var t;const e=this.isPageVisible;this.isPageVisible=document.visibilityState==="visible",!this.isPageVisible&&e?(console.log("[LiveKit] Page hidden, pausing media"),this.wasConnectedBeforeHidden=((t=this.room)==null?void 0:t.state)==="connected",this.pauseAllAudio()):this.isPageVisible&&!e&&(console.log("[LiveKit] Page visible, resuming"),this.resumeAfterVisibilityChange())}handlePageHide(e){e.persisted||this.cleanupBeforeUnload()}handlePageShow(e){e.persisted&&(console.log("[LiveKit] Page restored from cache"),this.resumeAfterVisibilityChange())}handleOnline(){var e;console.log("[LiveKit] Network online"),this.wasConnectedBeforeHidden&&((e=this.room)==null?void 0:e.state)!=="connected"&&this.attemptReconnect()}handleOffline(){console.log("[LiveKit] Network offline")}pauseAllAudio(){this.audioElements.forEach(e=>{try{e.pause()}catch(t){console.warn("[LiveKit] Failed to pause audio:",t)}})}async resumeAllAudio(){for(const[,e]of this.audioElements)try{await e.play()}catch(t){console.warn("[LiveKit] Failed to resume audio (may need user interaction):",t),this.audioPlaybackPrompt=!0,this.dispatchEvent(new CustomEvent("audio-playback-status-changed",{detail:{canPlayback:!1}}))}}async resumeAfterVisibilityChange(){this.room&&(this.room.state==="connected"?await this.resumeAllAudio():this.wasConnectedBeforeHidden&&(console.log("[LiveKit] Connection lost while hidden, attempting reconnect"),this.attemptReconnect()))}async attemptReconnect(){var e;if(this.isReconnecting){console.log("[LiveKit] Reconnect already in progress, skipping");return}if(this.reconnectAttempts>=this.maxReconnectAttempts){console.error("[LiveKit] Max reconnect attempts reached"),this.cleanupRoom(),this.dispatchEvent(new CustomEvent("error",{detail:{error:"Connection lost. Please restart the call."}}));return}this.isReconnecting=!0,this.reconnectAttempts++,console.log(`[LiveKit] Reconnect attempt ${this.reconnectAttempts}/${this.maxReconnectAttempts}`);try{((e=this.room)==null?void 0:e.state)==="disconnected"&&(this.cleanupRoom(),this.dispatchEvent(new CustomEvent("error",{detail:{error:"Connection lost. Please restart the call."}})))}finally{this.isReconnecting=!1}}cleanupRoom(){if(this.room){try{this.room.disconnect()}catch(e){console.warn("[LiveKit] Error disconnecting room during cleanup:",e)}this.room=null}this.cleanupAudioElements()}cleanupBeforeUnload(){this.room&&(this.room.disconnect(),this.room=null),this.cleanupAudioElements()}cleanupAudioElements(){this.audioElements.forEach((e,t)=>{try{e.pause(),e.srcObject=null,e.remove()}catch(n){console.warn("[LiveKit] Failed to cleanup audio element:",n)}this.audioElements.delete(t)})}removeAudioContainer(){if(this.audioContainer){try{this.audioContainer.remove()}catch(e){console.warn("[LiveKit] Failed to remove audio container:",e)}this.audioContainer=null}}destroy(){if(this.isDestroyed=!0,this.clearAllTimers(),this.removeLifecycleListeners(),this.cleanupAudioElements(),this.removeAudioContainer(),this.room){try{this.room.disconnect()}catch(e){console.warn("[LiveKit] Error disconnecting room during destroy:",e)}this.room=null}}async playAudioElement(e){try{if(!e.paused)return!0;const t=e.play();return t!==void 0&&await t,!0}catch(t){return t instanceof Error&&t.name==="NotAllowedError"?(console.log("[LiveKit] Autoplay blocked, user interaction required"),!1):t instanceof Error&&t.name==="AbortError"?(console.log("[LiveKit] Play interrupted"),!1):(console.warn("[LiveKit] Failed to play audio:",t),!1)}}async fetchWithTimeout(e,t,n=15e3){const s=new AbortController,r=setTimeout(()=>s.abort(),n);try{return await fetch(e,{...t,signal:s.signal})}finally{clearTimeout(r)}}async connectWithTimeout(e,t,n,s=2e4){return new Promise((r,a)=>{const o=setTimeout(()=>{a(new Error("Connection timeout"))},s);e.connect(t,n).then(()=>{clearTimeout(o),r()}).catch(c=>{clearTimeout(o),a(c)})})}set serviceUrl(e){this._serviceUrl=e}get serviceUrl(){return this._serviceUrl??"https://voice.hanc.ai"}get status(){return this.callStatus}get ready(){return this.isReady}get currentError(){return this.error}get currentRoom(){return this.room}get isMicrophoneEnabled(){return this.microphoneEnabled}get participants(){return this.connectedParticipants}get identity(){return this.userIdentity}get roomNameValue(){return this.roomName}get showAudioPrompt(){return this.audioPlaybackPrompt}updateStatus(e){this.callStatus!==e&&(this.callStatus=e,this.dispatchEvent(new CustomEvent("status-changed",{detail:e})))}async makeCall({agentId:e}){if(this.room&&this.room.state==="connected")return;let t=null;try{t=await navigator.mediaDevices.getUserMedia({audio:!0,video:!1}),console.log("Microphone permission granted")}catch(n){console.warn("Microphone permission denied or not available:",n)}this.updateStatus("connecting"),this.error=null,this.isReady=!1,this.room&&(await this.room.disconnect(),this.room=null);try{const n=new Bs;this.room=n,this.setupRoomEventListeners(n);let s;try{s=await this.fetchWithTimeout(`${this.serviceUrl}/create-room-token`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({metadata:{agent_id:e,timestamp:Date.now(),is_apple_device:this.isAppleDevice}})},15e3)}catch(l){throw l instanceof Error&&l.name==="AbortError"?new Error("Request timeout - please check your connection"):l}if(!s.ok){const l=await s.text();throw new Error(`Failed to get room token: ${s.status} ${l}`)}const{token:r,url:a,room_name:o,user_identity:c}=await s.json();this.roomName=o,this.userIdentity=c,this.reconnectAttempts=0,this.wasConnectedBeforeHidden=!1,await this.connectWithTimeout(n,a,r,2e4),this.updateStatus("connected"),this.isReady=!0,requestAnimationFrame(()=>{this.scheduleTimer(async()=>{if(this.isDestroyed||!this.room||this.room.state!=="connected"){t&&t.getTracks().forEach(l=>l.stop());return}if(t)try{await n.localParticipant.setMicrophoneEnabled(!0,{echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0}),this.microphoneEnabled=!0,this.dispatchEvent(new CustomEvent("microphone-enabled")),t.getTracks().forEach(l=>l.stop()),this.scheduleTimer(()=>{if(!(this.isDestroyed||!this.room||this.room.state!=="connected"))try{const l=Array.from(n.localParticipant.audioTrackPublications.values()).find(d=>d.kind==="audio");if(l!=null&&l.track){const d=l.track.mediaStreamTrack;d&&this.dispatchEvent(new CustomEvent("local-audio-track",{detail:d}))}}catch(l){console.warn("[LiveKit] Error getting local audio track:",l)}},100)}catch(l){console.warn("Could not enable microphone on connect:",l),this.microphoneEnabled=!1,this.dispatchEvent(new CustomEvent("microphone-disabled"))}else this.microphoneEnabled=!1,this.dispatchEvent(new CustomEvent("microphone-disabled"))},50)}),this.dispatchEvent(new CustomEvent("room-connected",{detail:{roomName:o,identity:c}}))}catch(n){t&&t.getTracks().forEach(s=>s.stop()),this.error=`Connection failed: ${n instanceof Error?n.message:String(n)}`,this.updateStatus("error"),this.isReady=!1,this.room=null,this.dispatchEvent(new CustomEvent("error",{detail:{error:this.error}}))}}setupRoomEventListeners(e){e.on(ne.Connected,()=>{this.updateStatus("connected"),this.isReady=!0,this.reconnectAttempts=0}),e.on(ne.Disconnected,()=>{this.updateStatus("disconnected"),this.connectedParticipants=[],this.microphoneEnabled=!1,this.audioPlaybackPrompt=!1,this.room=null,this.isReady=!1,this.cleanupAudioElements(),this.dispatchEvent(new CustomEvent("disconnected"))}),e.on(ne.Reconnecting,()=>{console.log("[LiveKit] Reconnecting..."),this.dispatchEvent(new CustomEvent("status-changed",{detail:"connecting"}))}),e.on(ne.Reconnected,()=>{console.log("[LiveKit] Reconnected successfully"),this.reconnectAttempts=0,this.isReconnecting=!1,this.resumeAllAudio().catch(t=>{console.warn("[LiveKit] Failed to resume audio after reconnect:",t)}),this.dispatchEvent(new CustomEvent("status-changed",{detail:"connected"}))}),e.on(ne.SignalReconnecting,()=>{console.log("[LiveKit] Signal reconnecting...")}),e.on(ne.ParticipantConnected,t=>{this.connectedParticipants=[...this.connectedParticipants,t.identity];const n=t.identity.includes("agent")||t.identity.includes("voice-assistant")||t.identity.includes("AJ_");n&&(this.updateStatus("agent-connected"),this.audioPlaybackPrompt=!0,this.dispatchEvent(new CustomEvent("agent-connected",{detail:{participant:t.identity}}))),this.dispatchEvent(new CustomEvent("participant-connected",{detail:{participant:t.identity,isAgent:n}}))}),e.on(ne.ParticipantDisconnected,t=>{this.connectedParticipants=this.connectedParticipants.filter(s=>s!==t.identity);const n=t.identity.includes("agent")||t.identity.includes("voice-assistant")||t.identity.includes("AJ_");n&&(this.audioPlaybackPrompt=!1,this.updateStatus("connected"),this.dispatchEvent(new CustomEvent("agent-disconnected",{detail:{participant:t.identity}}))),this.dispatchEvent(new CustomEvent("participant-disconnected",{detail:{participant:t.identity,isAgent:n}}))}),e.on(ne.TrackSubscribed,(t,n,s)=>{if(t.kind==="audio"){const r=this.audioElements.get(s.identity);if(r){try{r.pause(),r.srcObject=null,r.remove()}catch(c){console.warn("[LiveKit] Failed to remove existing audio element:",c)}this.audioElements.delete(s.identity)}const a=t.attach();a.setAttribute("playsinline","true"),a.setAttribute("webkit-playsinline","true"),a.dataset.participantId=s.identity,this.isAppleDevice&&(a.volume=.8),this.audioContainer?this.audioContainer.appendChild(a):(console.warn("[LiveKit] Audio container not found, appending to body"),document.body.appendChild(a)),this.audioElements.set(s.identity,a),this.playAudioElement(a).then(c=>{c||(this.audioPlaybackPrompt=!0,this.dispatchEvent(new CustomEvent("audio-playback-status-changed",{detail:{canPlayback:!1}})))}),this.dispatchEvent(new CustomEvent("audio-track-added",{detail:{participant:s.identity,element:a}}));const o=t.mediaStreamTrack;o&&this.dispatchEvent(new CustomEvent("audio-track",{detail:o}))}}),e.on(ne.TrackUnsubscribed,(t,n,s)=>{const r=this.audioElements.get(s.identity);r&&(r.pause(),r.srcObject=null,r.remove(),this.audioElements.delete(s.identity)),t.detach(),this.dispatchEvent(new CustomEvent("audio-track-removed",{detail:{participant:s.identity}}))}),e.on(ne.MediaDevicesError,t=>{this.error=`Media device error: ${t.message}`,this.updateStatus("error"),this.dispatchEvent(new CustomEvent("error",{detail:{error:this.error}}))}),e.on(ne.AudioPlaybackStatusChanged,async()=>{e.canPlaybackAudio||this.connectedParticipants.some(n=>n.includes("agent")||n.includes("voice-assistant")||n.includes("AJ_"))&&!this.audioPlaybackPrompt&&(this.updateStatus("agent-connected"),this.audioPlaybackPrompt=!0),this.dispatchEvent(new CustomEvent("audio-playback-status-changed",{detail:{canPlayback:e.canPlaybackAudio}}))})}async toggleMicrophone(){if(this.room)try{this.microphoneEnabled?(await this.room.localParticipant.setMicrophoneEnabled(!1),this.microphoneEnabled=!1,this.dispatchEvent(new CustomEvent("microphone-disabled"))):(await this.room.localParticipant.setMicrophoneEnabled(!0,{echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0}),this.microphoneEnabled=!0,this.dispatchEvent(new CustomEvent("microphone-enabled")))}catch(e){this.error=`Failed to toggle microphone: ${e instanceof Error?e.message:String(e)}`,this.dispatchEvent(new CustomEvent("error",{detail:{error:this.error}}))}}async enableAudio(){if(this.room)try{await this.room.startAudio(),this.audioPlaybackPrompt=!1;const e=JSON.stringify({type:"audio_enabled"}),n=new TextEncoder().encode(e);await this.room.localParticipant.publishData(n,{reliable:!0}),this.dispatchEvent(new CustomEvent("audio-enabled"))}catch(e){this.error=`Failed to enable audio: ${e instanceof Error?e.message:String(e)}`,this.dispatchEvent(new CustomEvent("error",{detail:{error:this.error}}))}}async hangUp(){if(!this.room){this.error="No active connection to end.";return}this.updateStatus("disconnecting");const e=this.room;this.room=null,this.connectedParticipants=[],this.microphoneEnabled=!1,this.audioPlaybackPrompt=!1,this.isReady=!1,this.wasConnectedBeforeHidden=!1,this.reconnectAttempts=0,this.isReconnecting=!1,this.cleanupAudioElements(),this.updateStatus("disconnected"),this.dispatchEvent(new CustomEvent("call-ended")),this.scheduleTimer(async()=>{try{await e.disconnect()}catch(t){console.warn("Error during room disconnect:",t)}},0)}}class n_ extends EventTarget{constructor(){super(...arguments),this._status="unknown",this.intervalId=null,this._serviceUrl="",this.INTERVAL_MS=3e4,this.TIMEOUT_MS=5e3,this.refCount=0}get isHealthy(){return this._status!=="unhealthy"}get status(){return this._status}set serviceUrl(e){this._serviceUrl!==e&&(this._serviceUrl=e,this.intervalId!==null&&this.check())}get serviceUrl(){return this._serviceUrl}start(){this.refCount++,this.intervalId===null&&(this.check(),this.intervalId=setInterval(()=>this.check(),this.INTERVAL_MS))}stop(){this.refCount=Math.max(0,this.refCount-1),!(this.refCount>0)&&(this.intervalId!==null&&(clearInterval(this.intervalId),this.intervalId=null),this._status="unknown")}async check(){if(!this._serviceUrl){this.updateStatus("unknown");return}try{const e=new AbortController,t=setTimeout(()=>e.abort(),this.TIMEOUT_MS),n=await fetch(`${this._serviceUrl}/health`,{method:"GET",signal:e.signal});clearTimeout(t),this.updateStatus(n.ok?"healthy":"unhealthy")}catch{this.updateStatus("unhealthy")}}updateStatus(e){this._status!==e&&(this._status=e,this.dispatchEvent(new CustomEvent("health-changed",{detail:e})))}}const Hi=new n_;class Zc{get isHealthy(){return Hi.isHealthy}get status(){return Hi.status}set serviceUrl(e){Hi.serviceUrl=e}get serviceUrl(){return Hi.serviceUrl}start(){Hi.start()}stop(){Hi.stop()}addEventListener(e,t){e==="health-changed"&&Hi.addEventListener(e,t)}removeEventListener(e,t){e==="health-changed"&&Hi.removeEventListener(e,t)}}/**
85
85
  * @license
86
86
  * Copyright 2010-2025 Three.js Authors
87
87
  * SPDX-License-Identifier: MIT