{"mappings":"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","names":["_","constructor","o","_locking","Promise","resolve","_locks","isLocked","lock","s","t","l","unlockNext","c","then","assert","condition","msg","Error","FLOAT32_MAX","FLOAT32_MIN","UINT32_MAX","INT32_MAX","INT32_MIN","assertInt32","arg","Number","isInteger","assertUInt32","assertFloat32","isFinite","enumTypeSymbol","Symbol","getEnumType","enumObject","setEnumType","typeName","values","opt","makeEnumType","map","v","no","name","localName","_opt","names","Object","create","numbers","normalValues","value","n","normalizeEnumValue","push","findName","findNumber","makeEnum","assign","Message","equals","other","getType","runtime","util","clone","fromBinary","bytes","options","type","format","bin","makeReadOptions","readMessage","readerFactory","byteLength","fromJson","jsonValue","json","fromJsonString","jsonString","JSON","parse","e","concat","message","String","toBinary","makeWriteOptions","writer","writerFactory","writeMessage","finish","toJson","toJsonString","_a","stringify","prettySpaces","toJSON","emitDefaultValues","getPrototypeOf","makeMessageType","fields","substring","lastIndexOf","data","initFields","initPartial","setPrototypeOf","prototype","newFieldList","a","b","varint64read","lowBits","highBits","shift","buf","pos","assertBounds","middleByte","varint64write","lo","hi","i","hasNext","byte","splitBits","hasMoreBits","TWO_PWR_32_DBL","int64FromString","dec","minus","slice","base","add1e6digit","begin","end","digit1e6","negate","newBits","int64ToString","bits","negative","result","uInt64ToString","toUnsigned","low","mid","high","digitA","digitB","digitC","Math","floor","toString","decimalFrom1e7WithLeadingZeros","digit1e7","partial","length","varint32write","varint32read","readBytes","makeInt64Support","dv","DataView","ArrayBuffer","BigInt","getBigInt64","getBigUint64","setBigInt64","setBigUint64","process","env","BUF_BIGINT_DISABLE","MIN","MAX","UMIN","UMAX","zero","supported","bi","uParse","enc","getInt32","uEnc","setInt32","uDec","assertInt64String","test","assertUInt64String","protoInt64","ScalarType","LongType","scalarEquals","BYTES","Uint8Array","UINT64","FIXED64","INT64","SFIXED64","SINT64","scalarZeroValue","longType","BOOL","DOUBLE","FLOAT","STRING","isScalarZeroValue","WireType","BinaryWriter","textEncoder","stack","TextEncoder","chunks","len","offset","set","fork","join","chunk","prev","pop","uint32","raw","tag","fieldNo","int32","bool","string","encode","float","buffer","setFloat32","double","setFloat64","fixed32","setUint32","sfixed32","sint32","sfixed64","view","tc","fixed64","int64","sint64","sign","uint64","BinaryReader","textDecoder","varint64","byteOffset","TextDecoder","wireType","skip","start","Varint","Bit64","Bit32","LengthDelimited","StartGroup","fn","wt","EndGroup","undefined","subarray","RangeError","zze","getUint32","getFloat32","getFloat64","decode","makeExtension","extendee","field","fi","split","jsonName","list","createExtensionContainer","extension","container","initExtensionField","ext","repeated","default","kind","T","L","fieldWrapper","unwrapField","filterUnknownFields","unknownFields","filter","uf","encTable","decTable","charCodeAt","indexOf","protoBase64","base64Str","es","bytePos","groupPos","p","base64","getExtension","assertExtendee","ufs","listUnknownFields","get","readField","setExtension","readOpt","writeOpt","hasExtension","discardUnknownFields","onUnknownField","f","writeField","reader","messageType","find","isFieldSet","target","oneof","case","req","keys","clearField","implicitPresence","isMessage","getOwnPropertyNames","every","m","actualType","wrapField","INT32","UINT32","jsonReadDefaults","ignoreUnknownFields","jsonWriteDefaults","enumAsInteger","useProtoFieldName","tokenNull","tokenIgnoredUnknownEnum","makeJsonFormat","Array","isArray","debugJsonValue","oneofSeen","Map","registry","typeRegistry","jsonKey","entries","findJsonName","seen","found","findExtension","startsWith","endsWith","byNumber","canEmitFieldDefaultValue","findExtensionFor","r","readScalar","BIGINT","writeScalar","debug","parentType","targetArray","jsonItem","enumValue","readEnum","targetMap","jsonMapKey","jsonMapValue","key","readMapKey","K","V","currentValue","scalarValue","nullAsZeroValue","NaN","POSITIVE_INFINITY","NEGATIVE_INFINITY","trim","isNaN","FIXED32","SFIXED32","SINT32","long","uLong","encodeURIComponent","jsonObj","entryKey","entryValue","enumType","writeEnum","jsonArr","val","unknownFieldsSymbol","readDefaults","readUnknownFields","writeDefaults","writeUnknownFields","makeBinaryFormat","lengthOrEndTagFieldNo","delimitedMessageEncoding","scalarType","read","readScalarLTString","arr","readMessageField","mapKey","mapVal","readMapEntry","delimited","packed","writePacked","item","writeMessageField","writeMapEntry","keyValue","parseInt","method","scalarTypeInfo","toLowerCase","makeUtilCommon","source","member","byMember","sk","sourceField","findField","toU8Arr","copy","k","mt","va","vb","any","cloneSingularField","input","makeProtoRuntime","syntax","InternalFieldList","normalizer","_fields","_normalizer","jsonNames","all","numbersAsc","sort","members","localFieldName","protoName","inOneof","protoCamelCase","safeObjectProperty","safeMessageProperty","localOneofName","fieldJsonName","snakeCase","capNext","charAt","toUpperCase","reservedObjectProperties","Set","reservedMessageProperties","fallback","has","InternalOneofInfo","addField","_lookup","normalizeFieldInfos","fieldInfos","packedByDefault","_b","_c","_d","_e","_f","ooname","proto3","Timestamp","seconds","nanos","matches","match","ms","Date","repeat","z","nanosStr","toISOString","replace","toDate","ceil","now","fromDate","date","getTime","MetricsBatch","TimeSeriesMetric","EventMetric","MetricSample","root","definition","module","exports","log","this","noop","undefinedType","isIE","window","navigator","userAgent","logMethods","_loggersByName","defaultLogger","bindMethod","obj","methodName","bind","Function","call","apply","arguments","traceForIE","console","trace","realMethod","replaceLoggingMethods","level","getLevel","methodFactory","levels","SILENT","enableLoggingWhenConsoleArrives","defaultMethodFactory","_level","_loggerName","Logger","factory","self","inheritedLevel","defaultLevel","userLevel","storageKey","persistLevelIfPossible","levelNum","levelName","localStorage","document","cookie","getPersistedLevel","storedLevel","cookieName","location","exec","clearPersistedLevel","removeItem","normalizeLevel","TypeError","setLevel","persist","setDefaultLevel","resetLevel","enableAll","TRACE","disableAll","rebuild","childName","initialLevel","getLogger","logger","_log","noConflict","getLoggers","LogLevel","LoggerNames","livekitLogger","livekitLoggers","info","workerLogger","log","maxRetryDelay","DEFAULT_RETRY_DELAYS_IN_MS","DefaultReconnectPolicy","constructor","retryDelays","_retryDelays","undefined","nextRetryDelayInMs","context","retryCount","length","retryDelay","Math","random","R","Reflect","ReflectApply","apply","target","receiver","args","Function","prototype","call","ReflectOwnKeys","ownKeys","Object","getOwnPropertySymbols","getOwnPropertyNames","concat","ProcessEmitWarning","warning","console","warn","NumberIsNaN","Number","isNaN","value","EventEmitter","init","eventsModule","exports","once","_events","undefined","_eventsCount","_maxListeners","defaultMaxListeners","checkListener","listener","TypeError","defineProperty","enumerable","get","set","arg","RangeError","getPrototypeOf","create","setMaxListeners","n","_getMaxListeners","that","getMaxListeners","emit","type","i","arguments","length","push","doError","events","error","er","Error","err","message","context","handler","len","listeners","arrayClone","_addListener","prepend","m","existing","newListener","unshift","warned","w","String","name","emitter","count","addListener","on","prependListener","onceWrapper","fired","removeListener","wrapFn","_onceWrap","state","wrapped","bind","prependOnceListener","list","position","originalListener","shift","spliceOne","off","removeAllListeners","keys","key","_listeners","unwrap","evlistener","unwrapListeners","rawListeners","listenerCount","eventNames","arr","copy","Array","index","pop","ret","Promise","resolve","reject","errorListener","resolver","slice","eventTargetAgnosticAddListener","addErrorHandlerIfEventEmitter","flags","addEventListener","wrapListener","removeEventListener","logDisabled_","deprecationWarnings_","extractVersion","uastring","expr","pos","match","parseFloat","wrapPeerConnectionEvent","window","eventNameToWrap","wrapper","RTCPeerConnection","proto","nativeAddEventListener","nativeEventName","cb","wrappedCallback","e","modifiedEvent","handleEvent","_eventMap","Map","nativeRemoveEventListener","has","unwrappedCb","delete","size","configurable","disableLog","bool","disableWarnings","log","deprecated","oldMethod","newMethod","detectBrowser","result","browser","version","navigator","userAgent","userAgentData","brands","chromium","find","brand","parseInt","mozGetUserMedia","webkitGetUserMedia","isSecureContext","webkitRTCPeerConnection","supportsUnifiedPlan","RTCRtpTransceiver","_safariVersion","isObject","val","toString","compactObject","data","reduce","accumulator","isObj","isEmptyObject","assign","walkStats","stats","base","resultSet","id","forEach","endsWith","filterStats","track","outbound","streamStatsType","filteredResult","trackStats","trackIdentifier","trackStat","trackId","logging","utils","shimGetUserMedia","browserDetails","mediaDevices","constraintsToChrome_","c","mandatory","optional","cc","r","ideal","exact","min","max","oldname_","prefix","charAt","toUpperCase","oc","mix","advanced","shimConstraints_","constraints","func","JSON","parse","stringify","audio","remap","obj","a","b","video","face","facingMode","getSupportedFacingModeLies","getSupportedConstraints","matches","enumerateDevices","then","devices","filter","d","kind","dev","some","label","toLowerCase","includes","deviceId","shimError_","PermissionDeniedError","PermissionDismissedError","InvalidStateError","DevicesNotFoundError","ConstraintNotSatisfiedError","TrackStartError","MediaDeviceFailedDueToShutdown","MediaDeviceKillSwitchOn","TabCaptureError","ScreenCaptureError","DeviceCaptureError","constraint","constraintName","getUserMedia_","onSuccess","onError","getUserMedia","origGetUserMedia","cs","stream","getAudioTracks","getVideoTracks","getTracks","stop","DOMException","shimMediaStream","MediaStream","webkitMediaStream","shimOnTrack","_ontrack","f","origSetRemoteDescription","setRemoteDescription","_ontrackpoly","te","getReceivers","event","Event","transceiver","streams","dispatchEvent","shimGetSendersWithDtmf","shimSenderWithDtmf","pc","dtmf","_dtmf","createDTMFSender","_pc","getSenders","_senders","origAddTrack","addTrack","sender","origRemoveTrack","removeTrack","idx","indexOf","splice","origAddStream","addStream","origRemoveStream","removeStream","s","RTCRtpSender","origGetSenders","senders","shimSenderReceiverGetStats","RTCRtpReceiver","getStats","origGetReceivers","receivers","srcElement","origGetStats","MediaStreamTrack","shimAddTrackRemoveTrackWithNative","getLocalStreams","_shimmedLocalStreams","map","streamId","existingSenders","newSenders","newSender","shimAddTrackRemoveTrack","origGetLocalStreams","nativeStreams","_reverseStreams","_streams","newStream","signalingState","t","oldStream","replaceInternalStreamId","description","sdp","internalId","externalStream","internalStream","replace","RegExp","RTCSessionDescription","replaceExternalStreamId","method","nativeMethod","methodObj","desc","origSetLocalDescription","setLocalDescription","origLocalDescription","getOwnPropertyDescriptor","streamid","shimPeerConnection","RTCIceCandidate","fixNegotiationNeeded","getConfiguration","sdpSemantics","nativeGetUserMedia","getSettings","nativeGetSettings","applyConstraints","nativeApplyConstraints","shimGetDisplayMedia","preferredMediaSource","getDisplayMedia","code","mediaSource","RTCTrackEvent","mozRTCPeerConnection","modernStatsTypes","inboundrtp","outboundrtp","candidatepair","localcandidate","remotecandidate","nativeGetStats","selector","onSucc","onErr","stat","shimSenderGetStats","shimReceiverGetStats","shimRemoveStream","shimRTCDataChannel","DataChannel","RTCDataChannel","shimAddTransceiver","origAddTransceiver","addTransceiver","setParametersPromises","sendEncodings","shouldPerformCheck","encodingParam","test","rid","scaleResolutionDownBy","maxFramerate","params","getParameters","encodings","setParameters","catch","shimGetParameters","origGetParameters","shimCreateOffer","origCreateOffer","createOffer","all","finally","shimCreateAnswer","origCreateAnswer","createAnswer","shimLocalStreamsAPI","_localStreams","_addTrack","_len","_key","tracks","shimRemoteStreamsAPI","getRemoteStreams","_remoteStreams","_onaddstream","_onaddstreampoly","shimCallbacksAPI","addIceCandidate","successCallback","failureCallback","options","promise","withCallback","candidate","_getUserMedia","shimConstraints","errcb","shimRTCIceServerUrls","OrigPeerConnection","pcConfig","pcConstraints","iceServers","newIceServers","server","urls","url","generateCertificate","shimTrackEventTransceiver","shimCreateOfferLegacy","offerOptions","offerToReceiveAudio","audioTransceiver","getTransceivers","direction","setDirection","offerToReceiveVideo","videoTransceiver","shimAudioContext","AudioContext","webkitAudioContext","SDPUtils","generateIdentifier","Math","random","substring","localCName","splitLines","blob","trim","split","line","splitSections","part","getDescription","sections","getMediaSections","matchPrefix","parseCandidate","parts","foundation","component","protocol","priority","ip","address","port","relatedAddress","relatedPort","tcpType","ufrag","usernameFragment","writeCandidate","join","parseIceOptions","parseRtpMap","parsed","payloadType","clockRate","channels","numChannels","writeRtpMap","codec","pt","preferredPayloadType","parseExtmap","uri","attributes","writeExtmap","headerExtension","preferredId","parseFmtp","kv","j","writeFmtp","parameters","param","parseRtcpFb","parameter","writeRtcpFb","lines","rtcpFeedback","fb","parseSsrcMedia","sp","ssrc","colon","attribute","parseSsrcGroup","semantics","ssrcs","getMid","mediaSection","mid","parseFingerprint","algorithm","getDtlsParameters","sessionpart","role","fingerprints","writeDtlsParameters","setupType","fp","parseCryptoLine","tag","cryptoSuite","keyParams","sessionParams","writeCryptoLine","writeCryptoKeyParams","parseCryptoKeyParams","keyMethod","keySalt","lifeTime","mkiValue","mkiLength","getCryptoParameters","getIceParameters","pwd","password","writeIceParameters","iceLite","parseRtpParameters","codecs","headerExtensions","fecMechanisms","rtcp","mline","profile","rtpmapline","fmtps","wildcardRtcpFb","existingFeedback","writeRtpDescription","caps","maxptime","extension","parseRtpEncodingParameters","encodingParameters","hasRed","hasUlpfec","primarySsrc","secondarySsrc","flows","apt","encParam","codecPayloadType","rtx","fec","mechanism","bandwidth","maxBitrate","parseRtcpParameters","rtcpParameters","remoteSsrc","cname","rsize","reducedSize","compound","mux","writeRtcpParameters","parseMsid","spec","planB","msidParts","parseSctpDescription","parseMLine","maxSizeLine","maxMessageSize","sctpPort","fmt","sctpMapLines","writeSctpDescription","media","sctp","output","generateSessionId","substr","writeSessionBoilerplate","sessId","sessVer","sessUser","sessionId","getDirection","getKind","isRejected","parseOLine","username","sessionVersion","netType","addressType","isValidSDP","module","shimRTCIceCandidate","NativeRTCIceCandidate","nativeCandidate","parsedCandidate","toJSON","sdpMid","sdpMLineIndex","writable","shimRTCIceCandidateRelayProtocol","relayProtocol","shimMaxMessageSize","_sctp","sctpInDescription","mLine","getRemoteFirefoxVersion","getCanSendMaxMessageSize","remoteIsFirefox","canSendMaxMessageSize","getMaxMessageSize","isFirefox","canSendMMS","remoteMMS","POSITIVE_INFINITY","shimSendThrowTypeError","wrapDcSend","dc","origDataChannelSend","send","byteLength","readyState","origCreateDataChannel","createDataChannel","dataChannel","channel","shimConnectionState","completed","checking","iceConnectionState","_onconnectionstatechange","origMethod","_connectionstatechangepoly","_lastConnectionState","connectionState","newEvent","removeExtmapAllowMixed","nativeSRD","shimAddIceCandidateNullOrEmpty","nativeAddIceCandidate","shimParameterlessSetLocalDescription","nativeSetLocalDescription","adapterFactory","shimChrome","shimFirefox","shimSafari","adapter","commonShim","chromeShim","browserShim","firefoxShim","safariShim","DECRYPTION_FAILURE_TOLERANCE","E2EE_FLAG","SALT","KEY_PROVIDER_DEFAULTS","sharedKey","ratchetSalt","ratchetWindowSize","failureTolerance","keyringSize","KeyProviderEvent","KeyHandlerEvent","EncryptionEvent","CryptorEvent","isE2EESupported","isInsertableStreamSupported","isScriptTransformSupported","window","RTCRtpScriptTransform","RTCRtpSender","prototype","createEncodedStreams","BaseKeyProvider","EventEmitter","constructor","options","onKeyRatcheted","ratchetResult","participantId","keyIndex","log","debug","keyInfoMap","Map","Object","assign","KEY_PROVIDER_DEFAULTS","on","KeyProviderEvent","KeyRatcheted","onSetEncryptionKey","key","participantIdentity","keyInfo","sharedKey","Error","set","concat","emit","SetKey","getKeys","Array","from","values","getOptions","ratchetKey","RatchetRequest","LivekitError","Error","constructor","code","message","name","ConnectionErrorReason","ConnectionError","reason","status","context","reasonName","DeviceUnsupportedError","TrackInvalidError","UnsupportedServer","UnexpectedConnectionState","NegotiationError","PublishTrackError","LivekitError","constructor","message","status","name","SignalRequestError","reason","reasonName","RequestResponse_Reason","DataStreamErrorReason","DataStreamError","MediaDeviceFailure","getFailure","error","NotFound","PermissionDenied","DeviceInUse","Other","CryptorErrorReason","RoomEvent","ParticipantEvent","EngineEvent","TrackEvent","cloneDeep","value","structuredClone","Object","assign","JSON","parse","stringify","commonVersionIdentifier","browserDetails","getBrowser","userAgent","force","arguments","length","undefined","navigator","ua","toLowerCase","browser","browsersList","find","_ref","test","describe","name","version","getMatch","os","includes","osVersion","getOSVersion","exp","id","match","replace","v","protocolVersion","CriticalTimers","setTimeout","setInterval","clearTimeout","clearInterval","BACKGROUND_REACTION_DELAY","recycledElements","VideoQuality","Track","EventEmitter","streamState","_streamState","setStreamState","constructor","mediaTrack","kind","loggerOptions","attachedElements","isMuted","StreamState","Active","isInBackground","_currentBitrate","log","appVisibilityChangedListener","backgroundTimeout","document","visibilityState","handleAppVisibilityChanged","getLogger","_a","loggerName","LoggerNames","loggerContextCb","setMaxListeners","_mediaStreamTrack","_mediaStreamID","source","Source","Unknown","logContext","call","getLogContextFromTrack","currentBitrate","mediaStreamTrack","mediaStreamID","attach","element","elementType","Kind","Video","addAppVisibilityListener","forEach","e","parentElement","splice","indexOf","createElement","push","attachToElement","allMediaStreamTracks","srcObject","getTracks","hasAudio","some","tr","play","then","emit","AudioPlaybackStarted","VideoPlaybackStarted","catch","AudioPlaybackFailed","VideoPlaybackFailed","debug","concat","warn","muted","ElementAttached","detach","detachTrack","idx","recycleElement","ElementDetached","detached","elm","removeAppVisibilityListener","stop","stopMonitor","enable","enabled","disable","monitorInterval","timeSyncHandle","cancelAnimationFrame","updateLoggerOptions","HTMLAudioElement","shouldCache","pause","el","isWeb","addEventListener","removeEventListener","track","mediaStream","MediaStream","existingTracks","getAudioTracks","getVideoTracks","et","removeTrack","addTrack","isSafari","HTMLVideoElement","autoplay","playsInline","isFireFox","kindToProto","k","Audio","TrackType","AUDIO","VIDEO","DATA","kindFromProto","t","sourceToProto","s","Camera","TrackSource","CAMERA","Microphone","MICROPHONE","ScreenShare","SCREEN_SHARE","ScreenShareAudio","SCREEN_SHARE_AUDIO","UNKNOWN","sourceFromProto","streamStateFromProto","ProtoStreamState","ACTIVE","PAUSED","Paused","VideoPreset","widthOrOptions","height","maxBitrate","maxFramerate","priority","width","aspectRatio","encoding","TypeError","resolution","frameRate","backupCodecs","videoCodecs","isBackupCodec","codec","backup","BackupCodecPolicy","AudioPresets","telephone","speech","music","musicStereo","musicHighQuality","musicHighQualityStereo","VideoPresets","h90","h180","h216","h360","h540","h720","h1080","h1440","h2160","VideoPresets43","h120","h240","h480","ScreenSharePresets","h360fps3","h360fps15","h720fps5","h720fps15","h720fps30","h1080fps15","h1080fps30","original","separator","ddExtensionURI","unpackStreamId","packed","parts","split","substr","sleep","duration","Promise","resolve","supportsTransceiver","RTCPeerConnection","prototype","supportsAddTrack","supportsAdaptiveStream","ResizeObserver","IntersectionObserver","supportsDynacast","supportsAV1","RTCRtpSender","capabilities","getCapabilities","hasAV1","codecs","mimeType","supportsVP9","compareVersions","hasVP9","isSVCCodec","supportsSetSinkId","isSafariBased","isBrowserSupported","b","isSafari17Based","startsWith","isSafariSvcApi","isMobile","_b","userAgentData","mobile","isE2EESimulcastSupported","supportedSafariVersion","isReactNative","product","isCloud","serverUrl","hostname","endsWith","getLKReactNativeInfo","global","LiveKitReactNativeGlobal","getReactNativeOs","info","platform","getDevicePixelRatio","window","devicePixelRatio","v1","v2","parts1","parts2","Math","min","i","p1","parseInt","p2","roDispatchCallback","entries","entry","target","handleResize","ioDispatchCallback","handleVisibilityChanged","resizeObserver","getResizeObserver","intersectionObserver","getIntersectionObserver","root","rootMargin","getClientInfo","ClientInfo","sdk","ClientInfo_SDK","JS","protocol","createDummyVideoStreamTrack","width","arguments","length","undefined","height","enabled","paintContent","canvas","document","createElement","ctx","getContext","fillRect","beginPath","arc","Math","PI","closePath","fillStyle","fill","dummyStream","captureStream","dummyTrack","getTracks","Error","emptyAudioStreamTrack","getEmptyAudioStreamTrack","AudioContext","oscillator","createOscillator","gain","createGain","setValueAtTime","dst","createMediaStreamDestination","connect","start","stream","getAudioTracks","clone","Future","isResolved","_isResolved","constructor","futureBase","onFinally","promise","Promise","resolve","reject","__awaiter","finally","_a","call","isVideoCodec","maybeCodec","videoCodecs","includes","unwrapConstraint","constraint","Array","isArray","exact","undefined","ideal","Error","toWebsocketUrl","url","startsWith","replace","toHttpUrl","extractTranscriptionSegments","transcription","firstReceivedTimesMap","segments","map","_ref","id","text","language","startTime","endTime","final","firstReceivedTime","_a","get","Date","now","lastReceivedTime","delete","set","Number","parseInt","toString","extractChatMessage","msg","timestamp","message","editTimestamp","getDisconnectReasonFromConnectionError","e","reason","ConnectionErrorReason","LeaveRequest","context","Cancelled","DisconnectReason","CLIENT_INITIATED","NotAllowed","USER_REJECTED","ServerUnreachable","JOIN_FAILURE","UNKNOWN_REASON","bigIntToNumber","value","numberToBigInt","BigInt","isLocalTrack","track","MediaStreamTrack","isLocal","isAudioTrack","kind","Track","Kind","Audio","isVideoTrack","Video","isLocalVideoTrack","isLocalAudioTrack","isRemoteTrack","isRemotePub","pub","isRemoteVideoTrack","isLocalParticipant","p","splitUtf8","s","n","result","encoded","TextEncoder","encode","length","k","byte","undefined","push","slice","mergeDefaultOptions","options","audioDefaults","videoDefaults","optionsWithoutProcessor","audioProcessor","videoProcessor","extractProcessorsFromOptions","defaultAudioProcessor","processor","defaultVideoProcessor","clonedOptions","audio","video","mergeObjectWithoutOverwriting","_a","_c","deviceId","ideal","_b","_d","mainObject","objectToMerge","Object","keys","forEach","key","constraintsForOptions","constraints","videoOptions","target","source","resolution","detectSilence","track_1","track","timeOffset","arguments","ctx","getNewAudioContext","analyser","createAnalyser","fftSize","bufferLength","frequencyBinCount","dataArray","Uint8Array","createMediaStreamSource","MediaStream","mediaStreamTrack","connect","sleep","getByteTimeDomainData","someNoise","some","sample","close","AudioContext","window","webkitAudioContext","audioContext","latencyHint","state","document","body","handleResume","__awaiter","resume","e","console","warn","removeEventListener","addEventListener","kindToSource","kind","Track","Source","Microphone","Camera","Unknown","sourceToKind","screenCaptureToDisplayMediaStreamOptions","videoConstraints","width","height","isSafari","assign","max","frameRate","controller","selfBrowserSurface","surfaceSwitching","systemAudio","preferCurrentTab","mimeTypeToVideoCodecString","mimeType","split","toLowerCase","getTrackPublicationInfo","tracks","infos","TrackPublishedResponse","cid","mediaStreamID","trackInfo","getLogContextFromTrack","trackID","sid","muted","isMuted","enabled","streamID","streamTrackID","id","trackSid","isEnabled","name","trackName","encrypted","isEncrypted","supportsSynchronizationSources","RTCRtpReceiver","diffAttributes","oldValues","newValues","allKeys","diff","newOptions","cloneDeep","getTrackSourceFromProto","TrackSource","CAMERA","MICROPHONE","SCREEN_SHARE","ScreenShare","SCREEN_SHARE_AUDIO","ScreenShareAudio","areDimensionsSmaller","a","b","layerDimensionsFor","quality","layers","find","l","E2EEManager","EventEmitter","constructor","onWorkerMessage","ev","data","log","error","message","emit","EncryptionEvent","EncryptionError","keyProvider","getKeys","keyInfo","postKey","encryptionEnabled","participantIdentity","room","localParticipant","identity","ParticipantEncryptionStatusChanged","participant","getParticipantByIdentity","TypeError","concat","KeyProviderEvent","KeyRatcheted","ratchetResult","keyIndex","onWorkerError","worker","setup","isE2EESupported","DeviceUnsupportedError","info","setupEventListeners","msg","keyProviderOptions","getOptions","loglevel","workerLogger","getLevel","onmessage","onerror","postMessage","setParticipantCryptorEnabled","debug","postEnable","setSifTrailer","trailer","postSifTrailer","setupEngine","engine","on","EngineEvent","RTPVideoMapUpdate","rtpMap","postRTPMap","RoomEvent","TrackPublished","pub","encryption","Encryption_Type","NONE","ConnectionStateChanged","ConnectionState","Connected","remoteParticipants","trackPublications","TrackUnsubscribed","_","trackId","TrackSubscribed","setupE2EEReceiver","SignalConnected","isE2EEEnabled","ParticipantEvent","LocalSenderCreated","sender","setupE2EESender","LocalTrackPublished","publication","isVideoTrack","isSafariBased","codec","codecs","SetKey","RatchetRequest","participantId","postRatchetRequest","Error","_ref","isPublisher","enableMsg","ReferenceError","map","remoteId","receiver","handleReceiver","isLocalTrack","handleSender","isScriptTransformSupported","transform","RTCRtpScriptTransform","E2EE_FLAG","writable","writableStream","readable","readableStream","receiverStreams","createEncodedStreams","isReuse","senderStreams","defaultId","DeviceManager","_previousDevices","getInstance","instance","previousDevices","getDevices","kind_1","_this","requestPermissions","userMediaPromiseMap","size","get","Promise","all","values","devices","navigator","mediaDevices","enumerateDevices","hasDeviceInUse","filter","d","device","noLabel","label","isRelevant","permissionsToAcquire","stream","getUserMedia","getTracks","stop","normalizeDeviceId","groupId","defaultDevice","has","mediaDeviceKinds","Map","QueueTaskStatus","AsyncQueue","pendingTasks","taskMutex","Mutex","nextTaskIndex","run","task","taskInfo","enqueuedAt","Date","now","status","WAITING","set","unlock","lock","executedAt","RUNNING","COMPLETED","delete","flush","snapshot","Array","from","createRtcUrl","url","searchParams","urlObj","URL","toWebsocketUrl","value","appendUrlPath","createValidateUrl","rtcWsUrl","toHttpUrl","ensureTrailingSlash","path","endsWith","pathname","toString","passThroughQueueSignals","canPassThroughQueue","req","canPass","indexOf","case","trace","SignalConnectionState","SignalClient","currentState","isDisconnected","DISCONNECTING","DISCONNECTED","isEstablishingConnection","CONNECTING","RECONNECTING","getNextRequestId","_requestId","useJSON","loggerOptions","rtt","resetCallbacks","onAnswer","onLeave","onLocalTrackPublished","onLocalTrackUnpublished","onNegotiateRequested","onOffer","onRemoteMuteChanged","onSubscribedQualityUpdate","onTokenRefresh","onTrickle","onClose","getLogger","loggerName","LoggerNames","Signal","loggerContextCb","requestQueue","queuedRequests","closingLock","connectionLock","logContext","call","join","token","opts","abortSignal","reconnect","reason","clearPingInterval","reconnectReason","connectOptions","clientInfo","getClientInfo","params","createConnectionParams","rtcUrl","validateUrl","resolve","reject","abortHandler","clearTimeout","wsTimeout","ConnectionError","ConnectionErrorReason","Cancelled","setTimeout","ServerUnreachable","websocketTimeout","aborted","redactedUrl","ws","WebSocket","binaryType","onopen","CONNECTED","resp","fetch","toFixed","startsWith","text","NotAllowed","InternalError","handleWSError","json","JSON","parse","SignalResponse","fromJson","ignoreUnknownFields","ArrayBuffer","fromBinary","shouldProcessMessage","pingTimeoutDuration","pingTimeout","pingIntervalDuration","pingInterval","timeout","interval","startPingInterval","LeaveRequest","signalLatency","handleSignalResponse","onclose","code","wasClean","handleOnClose","updateState","closePromise","readyState","CLOSING","race","sendOffer","offer","offerId","offerSdp","sdp","sendRequest","toProtoSessionDescription","sendAnswer","answer","answerSdp","sendIceCandidate","candidate","TrickleRequest","candidateInit","stringify","sendMuteTrack","MuteTrackRequest","sendAddTrack","sendUpdateLocalMetadata","metadata_1","name_1","metadata","_this2","attributes","requestId","UpdateParticipantMetadata","sendUpdateTrackSettings","settings","sendUpdateSubscription","sub","sendSyncState","sync","sendUpdateVideoLayers","UpdateVideoLayers","sendUpdateSubscriptionPermissions","allParticipants","trackPermissions","SubscriptionPermission","sendSimulateScenario","scenario","sendPing","protoInt64","Ping","timestamp","sendUpdateLocalAudioTrack","features","UpdateLocalAudioTrack","sendLeave","DisconnectReason","CLIENT_INITIATED","action","LeaveRequest_Action","DISCONNECT","message_1","_this3","fromQueue","OPEN","SignalRequest","send","toJsonString","toBinary","res","pingHandled","sd","fromProtoSessionDescription","onParticipantUpdate","participants","onSpeakersChanged","speakers","onRoomUpdate","onConnectionQuality","onStreamStateUpdate","onSubscriptionPermissionUpdate","onSubscriptionError","Number","parseInt","lastPingTimestamp","resetPingTimeout","onRequestResponse","onLocalTrackSubscribed","onRoomMoved","msgCase","setReconnected","shift","onCloseCallback","clearPingTimeout","CriticalTimers","toUTCString","setInterval","clearInterval","rsd","type","SessionDescription","URLSearchParams","autoSubscribe","isReactNative","version","protocol","deviceModel","os","osVersion","browser","browserVersion","adaptiveStream","connection","DataPacketBuffer","buffer","_totalSize","item","byteLength","pop","getAll","popToSequence","sequence","alignBufferedAmount","bufferedAmount","first","TTLMap","ttl","_map","_lastCleanup","cleanup","expiresAt","entry","clear","entries","callback","asValueMap","valueMap","grammar","grammarModule","exports","v","reg","o","names","format","i","u","p","z","r","t","c","m","encoding","rate","address","subtype","direction","config","sessionConfig","str","raddr","tcptype","generation","attribute","maxMessageSize","RegExp","dir2","clksrcExt","mediaClockValue","rateNumerator","rateDenominator","objs","obj","toIntIfInt","String","attachProperties","match","location","rawName","parseReg","content","needsBlank","keyLocation","require$$0","validLine","prototype","test","bind","session","media","rtp","fmtp","j","paramReducer","acc","expr","parseParams","reduce","parseFmtpConfig","parsePayloads","parseRemoteCandidates","candidates","parts","component","ip","port","parseImageAttributes","substring","parseSimulcastStreamList","scid","paused","formatRegExp","formatStr","args","len","replace","x","arg","makeLine","Function","apply","defaultOuterOrder","defaultInnerOrder","writer","mLine","payloads","outerOrder","innerOrder","el","parser","require$$1","require$$2","lib","write","isImmediate","maxWait","f","cancel","startBitrateForSVC","debounceInterval","PCEvents","NegotiationStarted","NegotiationComplete","RTPVideoPayloadTypes","PCTransport","pc","_pc","createPC","ddExtID","latestOfferId","pendingCandidates","restartingIce","renegotiate","trackBitrates","remoteStereoMids","remoteNackMids","negotiate","debounce","onError","createAndSendOffer","onconnectionstatechange","oniceconnectionstatechange","onicegatheringstatechange","ondatachannel","onnegotiationneeded","onsignalingstatechange","onicecandidate","ontrack","offerLock","RTCPeerConnection","onIceCandidate","onicecandidateerror","onIceCandidateError","onIceConnectionStateChange","iceConnectionState","onSignalingStatechange","signalingState","onConnectionStateChange","connectionState","onDataChannel","onTrack","isICEConnected","addIceCandidate","remoteDescription","setRemoteDescription","mungedSDP","stereoMids","nackMids","extractStereoAndNackAudioFromOffer","sdpParsed","mid","getMidString","trackbr","transceiver","codecPayload","toUpperCase","payload","fmtpFound","attr","includes","maxbr","setMungedSDP","iceRestart","currentSD","createOffer","ensureIPAddrMatchVersion","ensureAudioNackAndStereo","msid","isSVCCodec","ensureVideoDDExtensionForSVC","startBitrate","Math","round","createAndSetAnswer","createAnswer","createDataChannel","dataChannelDict","addTransceiver","transceiverInit","addTrack","UnexpectedConnectionState","setTrackCodecBitrate","setConfiguration","rtcConfig","canRemoveTrack","removeTrack","getConnectionState","getICEConnectionState","getSignallingState","getTransceivers","getSenders","getLocalDescription","localDescription","getRemoteDescription","getStats","getConnectedAddress","selectedCandidatePairId","candidatePairs","selected","selectedID","remoteCandidateId","munged","remote","originalSdp","setLocalDescription","fields","remoteSdp","NegotiationError","ext","uri","ddExtensionURI","maxID","opusPayload","rtcpFb","fb","isV6","defaultVideoCodec","publishDefaults","audioPreset","AudioPresets","music","dtx","red","forceStereo","simulcast","screenShareEncoding","ScreenSharePresets","h1080fps15","stopMicTrackOnMute","videoCodec","backupCodec","preConnectBuffer","autoGainControl","echoCancellation","noiseSuppression","voiceIsolation","VideoPresets","h720","roomOptionDefaults","dynacast","stopLocalTrackOnUnpublish","reconnectPolicy","DefaultReconnectPolicy","disconnectOnPageLeave","webAudioMix","roomConnectOptionDefaults","maxRetries","peerConnectionTimeout","PCTransportState","PCTransportManager","needsPublisher","isPublisherConnectionRequired","needsSubscriber","isSubscriberConnectionRequired","subscriberPrimary","previousState","connectionStates","requiredTransports","tr","every","st","FAILED","CLOSED","NEW","onStateChange","publisher","subscriber","PCManager","SignalTarget","PUBLISHER","SUBSCRIBER","onPublisherOffer","remoteOfferLock","requirePublisher","require","requireSubscriber","createAndSendPublisherOffer","setPublisherAnswer","triggerIceRestart","createSubscriberAnswerFromOffer","RTCSdpType","updateConfiguration","ensurePCTransportConnection","abortController","transport","ensureTransportConnected","negotiationTimeout","signal","once","addPublisherTransceiver","addPublisherTrack","createPublisherDataChannel","transports","pcTransport_1","abortController_1","pcTransport","connectTimeout","RpcError","truncateBytes","MAX_MESSAGE_BYTES","MAX_DATA_BYTES","fromProto","proto","toProto","RpcError_Proto","builtIn","ErrorCode","ErrorMessage","APPLICATION_ERROR","CONNECTION_TIMEOUT","RESPONSE_TIMEOUT","RECIPIENT_DISCONNECTED","RESPONSE_PAYLOAD_TOO_LARGE","SEND_FAILED","UNSUPPORTED_METHOD","RECIPIENT_NOT_FOUND","REQUEST_PAYLOAD_TOO_LARGE","UNSUPPORTED_SERVER","UNSUPPORTED_VERSION","MAX_PAYLOAD_BYTES","maxBytes","low","high","encoder","floor","monitorFrequency","computeBitrate","currentStats","prevStats","bytesNow","bytesPrev","bytesReceived","bytesSent","isMediaRecorderAvailable","MediaRecorder","FallbackRecorder","RecorderBase","LocalTrackRecorder","dataListener","streamController","isClosed","onStop","event","byteStream","ReadableStream","start","arrayBuffer","byteArray","enqueue","isRecordingSupported","DEFAULT_DIMENSIONS_TIMEOUT","PRE_CONNECT_BUFFER_TIMEOUT","LocalTrack","_sender","_constraints","hasPreConnectBuffer","localTrackRecorder","mediaTrack","userProvidedTrack","manuallyStopped","_isUpstreamPaused","handleTrackMuteEvent","debouncedTrackMuteHandler","catch","pauseUpstream","handleTrackUnmuteEvent","resumeUpstream","handleEnded","isInBackground","reacquireTrack","_mediaStreamTrack","TrackEvent","Ended","providedByUser","muteLock","pauseUpstreamLock","trackChangeLock","then","setMediaStreamTrack","getConstraints","dimensions","Kind","Video","getSettings","isUpstreamPaused","isUserProvided","processedTrack","isLocal","getSourceTrackSettings","newTrack","force","attachedElements","detachTrack","mediaStream","processorElement","attachToElement","restart","element","replaceTrack","waitForDimensions","Audio","getBrowser","started","dims","TrackInvalidError","setDeviceId","unwrapConstraint","restartTrack","getDeviceId","normalize","mute","setTrackMuted","unmute","userProvidedOrOptions","stopProcessor","internalStopProcessor","facingMode","otherConstraints","__rest","streamConstraints","applyConstraints","Restarted","Muted","Unmuted","needsReAcquisition","handleAppVisibilityChanged","_super","isMobile","destroy","UpstreamPaused","compareVersions","UpstreamResumed","getRTCStatsReport","setProcessor","processor_1","showProcessedStreamLocally","createElement","processorOptions","init","play","DOMException","err","TrackProcessorUpdate","getProcessor","_this4","keepElement","_this5","remove","startPreConnectBuffer","timeslice","isTypeSupported","autoStopPreConnectBuffer","stopPreConnectBuffer","getPreConnectBuffer","getPreConnectBufferMimeType","LocalAudioTrack","enhancedNoiseCancellation","isKrispNoiseFilterEnabled","stopOnMute","monitorSender","_currentBitrate","stats","getSenderStats","handleKrispNoiseFilterEnable","AudioTrackFeatureUpdate","AudioTrackFeature","TF_ENHANCED_NOISE_CANCELLATION","handleKrispNoiseFilterDisable","checkForSilence","deviceHasChanged","startMonitor","isWeb","monitorInterval","setAudioContext","audioStats","streamId","packetsSent","packetsLost","roundTripTime","jitter","trackIsSilent","AudioSilenceDetected","mediaTrackToLocalTrack","LocalVideoTrack","presets169","presets43","VideoPresets43","presetsScreenShare","defaultSimulcastPresets169","h180","h360","defaultSimulcastPresets43","computeDefaultScreenShareSimulcastPresets","fromPreset","scaleResolutionDownBy","fps","maxFramerate","VideoPreset","maxBitrate","priority","videoRids","computeVideoEncodings","isScreenShare","videoEncoding","useSimulcast","scalabilityMode","determineAppropriateEncoding","sourceFramerate","original","sm","ScalabilityMode","encodings","spatial","bitratesRatio","suffix","requireScale","isSafariSvcApi","rid","pow","networkPriority","presets","sortPresets","screenShareSimulcastLayers","defaultSimulcastLayers","videoSimulcastLayers","midPreset","lowPreset","encodingsFromPresets","computeTrackBackupEncodings","serverRequested","backup","presetsForResolution","preset","aspect","abs","idx","min","canSetPriority","isFireFox","getReactNativeOs","topFramerate","notifyOnce","sort","aEnc","bEnc","results","temporal","getDefaultDegradationPreference","refreshSubscribedCodecAfterNewCodec","degradationPreference","setDegradationPreference","simulcastCodecs","isCpuConstrained","optimizeForPerformance","statsMap","qualityLimitationReason","CpuConstrained","totalBitrate","prev","senderLock","isSimulcast","getParameters","signalClient","_e","_f","__asyncValues","_g","next","done","sc","items","vs","frameHeight","frameWidth","framesPerSecond","framesSent","firCount","pliCount","nackCount","qualityLimitationDurations","qualityLimitationResolutionChanges","retransmittedPacketsSent","targetBitrate","setPublishingQuality","maxQuality","qualities","q","VideoQuality","LOW","HIGH","SubscribedQuality","setPublishingLayers","clone","_h","preference","setParameters","addSimulcastTrack","simulcastCodecInfo","setSimulcastTrackSender","subscribedCodecs","setPublishingCodecs","currentCodec","newCodecs","codecs_1","codecs_1_1","setPublishingLayersForSender","isSvc","prioritizePerformance","active","ceil","senderEncodings","isSVC","hasChanged","videoQualityForRid","subscribedQuality","maxFrameRate","MEDIUM","videoLayersFromEncodings","svc","VideoLayer","bitrate","ssrc","encodingSM","resRatio","scale","lossyDataChannel","reliableDataChannel","minReconnectWait","leaveReconnect","reliabeReceiveStateTTL","PCState","RTCEngine","_isClosed","pendingReconnect","reconnectTimeout","fullReconnectOnNext","latestRemoteOfferId","pcState","New","pendingTrackResolvers","reconnectAttempts","reconnectStart","attemptingReconnect","joinAttempts","maxJoinAttempts","shouldFailNext","reliableDataSequence","reliableMessageBuffer","reliableReceivedState","handleDataChannel","channel","reliableDCSub","lossyDCSub","handleDataMessage","dataProcessLock","Blob","dp","DataPacket","participantSid","lastSeq","ActiveSpeakersUpdate","applyUserDataCompat","DataPacketReceived","handleDataError","channelKind","currentTarget","maxRetransmits","ErrorEvent","handleBufferedAmountLow","DataPacket_Kind","LOSSY","RELIABLE","updateAndEmitDCBufferStatus","handleDisconnect","disconnectReason","disconnect","duration","Disconnected","delay","getNextRetryDelay","elapsedMs","retryCount","clearReconnectTimeout","regionUrlProvider","updateToken","attemptReconnect","finally","waitForRestarted","onRestarted","off","onDisconnected","isBufferStatusLow","dcBufferStatus","DCBufferStatusChanged","dc","dataChannelForKind","bufferedAmountLowThreshold","handleBrowserOnLine","client","ReconnectReason","RR_SIGNAL_DISCONNECTED","Engine","expSignalLatency","registerOnLineListener","updates","ParticipantUpdate","update","ConnectionQualityUpdate","RoomUpdate","SubscriptionError","SubscriptionPermissionUpdate","SpeakersChanged","StreamStateChanged","response","SignalRequestResponse","latestJoinResponse","roomID","pID","signalOpts","setupSignalClientCallbacks","joinResponse","pcManager","configure","fastPublish","clientConfiguration","Closing","removeAllListeners","deregisterOnLineListener","clearPendingReconnect","cleanupPeerConnections","cleanupClient","dcCleanup","onbufferedamountlow","onclosing","lossyDC","reliableDC","publicationTimeout","Timeout","updateMuteStatus","dataSubscriberReadyState","getConnectedServerAddress","setRegionUrlProvider","provider","makeRTCConfiguration","TransportsCreated","publisherState","subscriberState","publisherConnectionPromise","shouldEmit","RR_SUBSCRIBER_FAILED","RR_PUBLISHER_FAILED","isSignalSevered","isPCSevered","Offline","MediaTrackAdded","streams","supportOptionalDatachannel","serverInfo","createDataChannels","LocalTrackUnpublished","LocalTrackSubscribed","RemoteMute","SubscribedQualityUpdate","RoomMoved","leave","regions","setServerReportedRegions","RECONNECT","RESUME","serverResponse","e2eeEnabled","encodedInsertableStreams","iceServers","rtcIceServers","iceServer","rtcIceServer","urls","username","credential","forceRelay","ClientConfigSetting","ENABLED","iceTransportPolicy","sdpSemantics","continualGatheringPolicy","ordered","createSender","supportsTransceiver","createTransceiverRTCRtpSender","supportsAddTrack","createRTCRtpSender","createSimulcastSender","simulcastTrack","createSimulcastTransceiverSender","sendEncodings","resumeConnection","DISABLED","restartConnection","recoverable","SignalReconnectError","RR_UNKNOWN","context","nextRetryDelayInMs","regionUrl","Restarting","SignalRestarted","waitForPCReconnected","resetAttempts","nextRegionUrl","getNextBestRegionUrl","Resuming","SignalResumed","lastMessageSeq","resendReliableMessagesForResume","Resumed","waitForPCInitialConnection","Reconnecting","publishRpcResponse","destinationIdentity","packet","destinationIdentities","RpcResponse","sendDataPacket","publishRpcAck","RpcAck","ensurePublisherConnected","waitForBufferStatusLow","onClosing","ensureDataTransportConnected","transportName","needNegotiation","targetChannel","endTime","getTime","verifyTransport","AbortController","handleClosed","abort","rtpTypes","isVideoCodec","remoteTracks","localTracks","previousAnswer","previousOffer","trackSids","trackSidsDisabled","isDesired","SyncState","subscription","UpdateSubscription","subscribe","participantTracks","publishTracks","dataChannels","dataChannelsInfo","datachannelReceiveStates","seq","DataChannelReceiveState","publisherSid","failNext","getInfo","DataChannelInfo","newObj","oldObj","RegionUrlProvider","lastUpdateAt","settingsCacheTime","attemptedRegions","serverUrl","isCloud","getServerUrl","regionSettings","fetchRegionSettings","regionsLeft","region","attempted","nextRegion","regionSettingsResponse","getCloudConfigUrl","headers","authorization","ok","statusText","host","BaseStreamReader","_info","validateBytesReceived","doneReceiving","totalByteSize","DataStreamError","DataStreamErrorReason","Incomplete","LengthExceeded","outOfBandFailureRejectingFuture","reader","ByteStreamReader","handleChunkReceived","chunk","currentProgress","onProgress","Symbol","asyncIterator","getReader","rejectingSignalFuture","Future","activeSignal","onAbort","releaseLock","read","promise","return","withAbortSignal","readAll","chunks","Set","iterator","iterator_1","iterator_1_1","add","TextStreamReader","totalChunkCount","receivedChunks","index","bigIntToNumber","chunkIndex","previousChunkAtIndex","decoder","TextDecoder","fatal","decodedResult","decode","DecodeFailed","finalString","iterator_2","iterator_2_1","IncomingDataStreamManager","byteStreamControllers","textStreamControllers","byteStreamHandlers","textStreamHandlers","registerTextStreamHandler","topic","HandlerAlreadyRegistered","unregisterTextStreamHandler","registerByteStreamHandler","unregisterByteStreamHandler","clearHandlersAndControllers","validateParticipantHasNoActiveDataStreams","textStreamsBeingSentByDisconnectingParticipant","sendingParticipantIdentity","byteStreamsBeingSentByDisconnectingParticipant","abnormalEndError","AbnormalEnd","handleDataStreamPacket","handleStreamHeader","handleStreamChunk","handleStreamTrailer","streamHeader","contentHeader","streamHandlerCallback","totalLength","AlreadyOpened","startTime","fileBuffer","textBuffer","BaseStreamWriter","defaultWriter","getWriter","TextStreamWriter","ByteStreamWriter","STREAM_CHUNK_SIZE","OutgoingDataStreamManager","sendText","crypto","randomUUID","totalTextLength","fileIds","attachments","progresses","fill","handleProgress","progress","totalProgress","val","streamText","totalSize","attachedStreamIds","file","_sendFile","header","DataStream_Header","numberToBigInt","DataStream_TextHeader","replyToStreamId","operationType","DataStream_OperationType","UPDATE","CREATE","chunkId","WritableStream","textByteChunk","DataStream_Chunk","chunkPacket","DataStream_Trailer","trailerPacket","onEngineClose","sendFile","streamBytes","DataStream_ByteHeader","writeMutex","logLocal","byteOffset","subChunk","RemoteTrack","setMuted","setMediaStream","onRemoveTrack","playoutDelayHint","enable","stopMonitor","disable","setPlayoutDelay","delayInSeconds","getPlayoutDelay","monitorReceiver","registerTimeSyncUpdate","loop","timeSyncHandle","requestAnimationFrame","sources","getSynchronizationSources","rtpTimestamp","TimeSyncUpdate","RemoteAudioTrack","audioOutput","getReceiverStats","webAudioPluginNodes","sinkId","setVolume","volume","gainNode","gain","setTargetAtTime","_setVolume","elementVolume","getVolume","highestVolume","setSinkId","elm","supportsSetSinkId","attach","needsNewWebAudioConnection","connectWebAudio","detach","detached","disconnectWebAudio","setWebAudioPlugins","nodes","sourceNode","srcObject","lastNode","node","createGain","destination","AudioPlaybackFailed","receiverStats","concealedSamples","concealmentEvents","silentConcealedSamples","silentConcealmentEvents","totalAudioEnergy","totalSamplesDuration","REACTION_DELAY","RemoteVideoTrack","adaptiveStreamSettings","elementInfos","debouncedHandleResize","updateDimensions","isAdaptiveStream","setStreamState","StreamState","Active","updateVisibility","elementInfo","HTMLElementInfo","observeElementInfo","handleResize","handleVisibilityChanged","observe","stopObservingElementInfo","stopElementInfos","stopObserving","detachedElements","stopObservingElement","getDecoderImplementation","decoderImplementation","codecID","codecId","framesDecoded","framesDropped","framesReceived","packetsReceived","forceEmit","lastVisibilityChange","visibilityChangedAt","backgroundPause","pauseVideoInBackground","isPiPMode","pictureInPicture","isVisible","visible","lastVisible","VisibilityChanged","maxWidth","maxHeight","pixelDensity","getPixelDensity","currentElementWidth","currentElementHeight","lastDimensions","VideoDimensionsChanged","getDevicePixelRatio","isPiP","isIntersecting","onVisibilityChanged","isElementInPiP","onEnterPiP","documentPictureInPicture","onLeavePiP","isElementInViewport","clientWidth","clientHeight","getIntersectionObserver","getResizeObserver","unobserve","pictureInPictureElement","win","viewportWindow","top","offsetTop","left","offsetLeft","offsetWidth","offsetHeight","hidden","display","getComputedStyle","offsetParent","pageYOffset","innerHeight","pageXOffset","innerWidth","TrackPublication","metadataMuted","handleMuted","handleUnmuted","Publication","setMaxListeners","setTrack","isSubscribed","audioTrack","isAudioTrack","videoTrack","updateInfo","sourceFromProto","simulcasted","SubscriptionStatus","PermissionStatus","LocalTrackPublication","ti","handleTrackEnded","handleCpuConstrained","getTrackFeatures","TF_AUTO_GAIN_CONTROL","TF_ECHO_CANCELLATION","TF_NOISE_SUPPRESSION","channelCount","TF_STEREO","TF_NO_DTX","createLocalTracks","attemptExactMatch","internalOptions","retryAudioOptions","retryVideoOptions","exact","mediaPromise","isAudio","trackOptions","trackConstraints","conOrBool","newDeviceId","createLocalVideoTrack","createLocalAudioTrack","ConnectionQuality","qualityFromProto","q","ProtoQuality","EXCELLENT","Excellent","GOOD","Good","POOR","Poor","LOST","Lost","Unknown","Participant","EventEmitter","logContext","Object","assign","_b","_a","loggerOptions","loggerContextCb","isEncrypted","trackPublications","size","Array","from","values","every","tr","isAgent","permissions","agent","kind","ParticipantKind","AGENT","isActive","participantInfo","state","ParticipantInfo_State","ACTIVE","_kind","attributes","freeze","_attributes","constructor","sid","identity","name","metadata","arguments","length","undefined","STANDARD","audioLevel","isSpeaking","_connectionQuality","log","getLogger","loggerName","LoggerNames","setMaxListeners","audioTrackPublications","Map","videoTrackPublications","getTrackPublications","getTrackPublication","source","pub","getTrackPublicationByName","trackName","waitUntilActive","Promise","resolve","activeFuture","promise","Future","once","ParticipantEvent","Active","connectionQuality","isCameraEnabled","track","Track","Source","Camera","isMuted","isMicrophoneEnabled","Microphone","isScreenShareEnabled","ScreenShare","isLocal","joinedAt","Date","Number","parseInt","toString","updateInfo","info","version","_setName","_setMetadata","_setAttributes","emit","permission","setPermissions","md","changed","prevMetadata","ParticipantMetadataChanged","ParticipantNameChanged","diff","diffAttributes","keys","AttributesChanged","prevPermissions","canPublish","canSubscribe","canPublishData","_c","hidden","_d","recorder","_e","canPublishSources","some","value","index","canSubscribeMetrics","_f","ParticipantPermissionsChanged","setIsSpeaking","speaking","lastSpokeAt","IsSpeakingChanged","setConnectionQuality","prevQuality","ConnectionQualityChanged","setDisconnected","reject","call","Error","setAudioContext","ctx","audioContext","forEach","isAudioTrack","addTrackPublication","publication","on","TrackEvent","Muted","TrackMuted","Unmuted","TrackUnmuted","trackSid","set","Kind","Audio","Video","trackPermissionToProto","perms","participantSid","participantIdentity","TrackPermission","allTracks","allowAll","trackSids","allowedTrackSids","LocalParticipant","engine","options","roomRpcHandlers","roomOutgoingDataStreamManager","pendingPublishing","Set","pendingPublishPromises","participantTrackPermissions","allParticipantsAllowedToSubscribe","encryptionType","Encryption_Type","NONE","enabledPublishVideoCodecs","pendingAcks","pendingResponses","handleReconnecting","reconnectFuture","handleReconnected","updateTrackSubscriptionPermissions","handleClosing","catch","e","warn","message","signalConnectedFuture","activeAgentFuture","firstActiveAgent","handleSignalConnected","joinResponse","participant","handleSignalRequestResponse","response","requestId","reason","targetRequest","pendingSignalRequests","get","RequestResponse_Reason","OK","SignalRequestError","delete","handleDataPacket","packet","case","rpcResponse","payload","error","RpcError","fromProto","handleIncomingRpcResponse","rpcAck","handleIncomingRpcAck","debug","allParticipantsAllowed","client","sendUpdateSubscriptionPermissions","map","p","onTrackUnmuted","onTrackMuted","isUpstreamPaused","muted","getLogContextFromTrack","updateMuteStatus","onTrackUpstreamPaused","onTrackUpstreamResumed","onTrackFeatureUpdate","concat","sendUpdateLocalAudioTrack","getTrackFeatures","onTrackCpuConstrained","LocalTrackCpuConstrained","handleSubscribedQualityUpdate","update","__awaiter","roomOptions","dynacast","videoTrack","newCodecs","setPublishingCodecs","subscribedCodecs","newCodecs_1","__asyncValues","newCodecs_1_1","codec","isBackupCodec","publishAdditionalCodecForTrack","handleLocalTrackUnpublished","unpublished","unpublishTrack","handleTrackEnded","ScreenShareAudio","isUserProvided","mute","isLocalAudioTrack","isLocalVideoTrack","isWeb","currentPermissions","navigator","query","onchange","restartTrack","deviceId","setupEngine","activeDeviceMap","rpcHandlers","lastCameraError","cameraError","lastMicrophoneError","microphoneError","isE2EEEnabled","EngineEvent","RemoteMute","unmute","isResolved","Connected","SignalConnected","SignalRestarted","SignalResumed","Restarting","Resuming","LocalTrackUnpublished","SubscribedQualityUpdate","Closing","SignalRequestResponse","DataPacketReceived","setMetadata","requestMetadataUpdate","setName","setAttributes","_ref","_this","isRejected","sendUpdateLocalMetadata","startTime","performance","now","entries","_ref2","key","sleep","setCameraEnabled","enabled","publishOptions","setTrackEnabled","setMicrophoneEnabled","setScreenShareEnabled","setE2EEEnabled","GCM","republishAllTracks","republishPromise","localTracks","has","pendingTrack","waitForPendingPublicationOfSource","add","createTracks","video","audio","createScreenTracks","TrackInvalidError","stop","MediaDevicesError","sourceToKind","localTrack","opts","publishDefaults","preConnectBuffer","startPreConnectBuffer","publishPromises","push","publishTrack","all","screenAudioTrack","enableCameraAndMicrophone","tracks","mergedOptionsWithProcessors","mergeDefaultOptions","audioCaptureDefaults","videoCaptureDefaults","createLocalTracks","AudioStreamAcquired","isVideoTrack","err","mediaDevices","getDisplayMedia","DeviceUnsupportedError","resolution","isSafari17Based","ScreenSharePresets","h1080fps30","constraints","screenCaptureToDisplayMediaStreamOptions","stream","getVideoTracks","screenVideo","LocalVideoTrack","contentHint","mediaStreamTrack","getAudioTracks","screenAudio","LocalAudioTrack","publishOrRepublishTrack","track_1","options_1","_this2","isRepublish","isLocalTrack","defaultConstraints","MediaStreamTrack","getConstraints","deviceKind","updateLoggerOptions","existingPublication","isStereoInput","getSettings","channelCount","isStereo","forceStereo","dtx","red","isE2EESimulcastSupported","e2ee","simulcast","publishPromise","currentState","SignalConnectionState","CONNECTED","timeout","setTimeout","PublishTrackError","waitUntilEngineConnected","clearTimeout","publish","hasPermissionsToPublish","getTrackSourceFromProto","includes","find","publishedTrack","stopMicTrackOnMute","stopOnMute","isFireFox","videoCodec","supportsAV1","supportsVP9","defaultVideoCodec","c","mimeTypeToVideoCodecString","mime","Ended","UpstreamPaused","UpstreamResumed","AudioTrackFeatureUpdate","audioFeatures","disableDtx","settings","getSourceTrackSettings","autoGainControl","AudioTrackFeature","TF_AUTO_GAIN_CONTROL","echoCancellation","TF_ECHO_CANCELLATION","noiseSuppression","TF_NOISE_SUPPRESSION","TF_STEREO","TF_NO_DTX","hasPreConnectBuffer","TF_PRECONNECT_BUFFER","req","AddTrackRequest","cid","id","type","kindToProto","sourceToProto","encryption","stereo","disableRed","backupCodecPolicy","encodings","dims","width","height","waitForDimensions","defaultRes","VideoPresets","h720","isSVCCodec","scalabilityMode","simulcastCodecs","SimulcastCodec","backupCodec","computeVideoEncodings","layers","videoLayersFromEncodings","maxBitrate","audioPreset","priority","_h","_g","networkPriority","_k","_j","isClosed","UnexpectedConnectionState","negotiate","pcManager","sender","createSender","LocalSenderCreated","degradationPreference","getDefaultDegradationPreference","setDegradationPreference","trackTransceiver","transceiver","publisher","getTransceivers","setTrackCodecBitrate","maxbr","ti","addTrackPromise","addTrack","removeTrack","negotiateErr","primaryCodecMime","codecs","mimeType","updatedCodec","LocalTrackPublication","CpuConstrained","constrainedTrack","trackInfo","startMonitor","LocalTrackPublished","getPreConnectBuffer","getPreConnectBufferMimeType","LocalTrackSubscribed","stopPreConnectBuffer","agentActiveTimeout","waitUntilActiveAgentPresent","writer","streamBytes","topic","destinationIdentities","trackId","sampleRate","String","channels","stream_1","stream_1_1","chunk","write","close","then","computeTrackBackupEncodings","simulcastTrack","addSimulcastTrack","createSimulcastSender","stopOnUnpublish","getPublicationForTrack","pubLogContext","off","stopLocalTrackOnUnpublish","stopMonitor","negotiationNeeded","trackSender","PCTransportState","FAILED","direction","clear","setTrack","unpublishTracks","filter","_this3","restartTracks","localPubs","publishData","data_1","data","_this4","reliable","DataPacket_Kind","RELIABLE","LOSSY","DataPacket","UserPacket","sendDataPacket","publishDtmf","code","digit","SipDTMF","sendChatMessage","text","msg","crypto","randomUUID","timestamp","attachedFiles","attachments","ChatMessageModel","protoInt64","parse","ChatMessage","editChatMessage","editText","originalMessage","editTimestamp","sendText","streamText","sendFile","file","performRpc","destinationIdentity","method","responseTimeout","_ref3","_this5","byteLength","MAX_PAYLOAD_BYTES","builtIn","latestJoinResponse","serverInfo","compareVersions","publishRpcRequest","maxRoundTripLatency","ackTimeoutId","responseTimeoutId","responsePayload","responseError","console","registerRpcMethod","handler","unregisterRpcMethod","setTrackSubscriptionPermissions","isDisconnected","RpcRequest","responseTimeoutMs","handleParticipantDisconnected","pendingIdentity","setEnabledPublishCodecs","split","toLowerCase","mutedOnServer","sendMuteTrack","setActiveAgent","waitForPendingTimeout","publishPromiseEntry","_ref4","RemoteTrackPublication","TrackPublication","autoSubscribe","allowed","requestedDisabled","visible","handleEnded","handleVisibilityChange","emitTrackUpdate","handleVideoDimensionsChange","dimensions","videoDimensionsAdaptiveStream","subscribed","setSubscribed","prevStatus","subscriptionStatus","prevPermission","permissionStatus","sub","UpdateSubscription","subscribe","participantTracks","ParticipantTracks","emitSubscriptionUpdateIfChanged","emitPermissionUpdateIfChanged","SubscriptionStatus","Unsubscribed","isSubscribed","Subscribed","Desired","PermissionStatus","Allowed","NotAllowed","isDesired","isEnabled","isAdaptiveStream","setEnabled","isManualOperationAllowed","setVideoQuality","quality","requestedMaxQuality","requestedVideoDimensions","setVideoDimensions","isRemoteVideoTrack","setVideoFPS","fps","videoQuality","VideoQuality","HIGH","prevTrack","VideoDimensionsChanged","VisibilityChanged","detach","setAllowed","setSubscriptionError","SubscriptionFailed","prevMetadataMuted","metadataMuted","setMuted","previousStatus","currentStatus","SubscriptionStatusChanged","previousPermissionStatus","SubscriptionPermissionChanged","UpdateTrackSettings","disabled","minDimensions","areDimensionsSmaller","maxQualityLayer","layerDimensionsFor","Math","ceil","UpdateSettings","RemoteParticipant","fromParticipantInfo","signalClient","pi","rpID","remoteParticipant","volumeMap","sendUpdateTrackSettings","pt","sendUpdateSubscription","status","TrackSubscriptionPermissionChanged","TrackSubscriptionStatusChanged","TrackSubscribed","previousTrack","TrackUnsubscribed","TrackSubscriptionFailed","setVolume","volume","audioPublication","getVolume","addSubscribedMediaTrack","mediaTrack","mediaStream","receiver","adaptiveStreamSettings","triesLeft","getTrackPublicationBySid","startsWith","readyState","isVideo","RemoteVideoTrack","RemoteAudioTrack","audioOutput","setMediaStream","start","isRemoteTrack","hasMetadata","validTracks","newTracks","kindFromProto","connectOptions","existingTrackOfSource","oldTrack","newTrack","trace","TrackPublished","sendUnpublish","TrackUnpublished","setAudioOutput","output","promises","setSinkId","event","_len","args","_key","ConnectionState","connectionReconcileFrequency","Room","this","Disconnected","activeSpeakers","audioEnabled","isVideoPlaybackBlocked","bufferedEvents","isResuming","connect","url","token","isBrowserSupported","isReactNative","unlockDisconnect","disconnectLock","lock","connectFuture","setAndEmitConnectionState","Connecting","regionUrlProvider","getServerUrl","regionUrl","isCloud","URL","RegionUrlProvider","updateToken","fetchRegionSettings","setServerReportedRegions","connectFn","abortController","abort","AbortController","attemptConnection","ConnectionError","ConnectionErrorReason","Cancelled","nextUrl","getNextBestRegionUrl","signal","handleDisconnect","aborted","recreateEngine","getDisconnectReasonFromConnectionError","disconnectReason","DisconnectReason","UNKNOWN_REASON","clearConnectionFutures","connectSignal","join","adaptiveStream","maxRetries","e2eeEnabled","e2eeManager","websocketTimeout","serverVersion","region","serverRegion","room","roomSid","UnsupportedServer","applyJoinResponse","localParticipant","enabledPublishCodecs","setSifTrailer","sifTrailer","handleParticipantUpdates","otherParticipants","handleRoomUpdate","Reconnecting","pendingReconnect","maybeCreateEngine","setRegionUrlProvider","acquireAudioContext","connOptions","roomConnectOptionDefaults","rtcConfig","peerConnectionTimeout","setupLocalParticipantEvents","RoomEvent","resultingError","ServerUnreachable","waitForPCInitialConnection","disconnectOnPageLeave","window","addEventListener","onPageLeave","document","registerConnectionReconcile","disconnect","args_1","stopTracks","unlock","sendLeave","CLIENT_INITIATED","startAudio","elements","browser","getBrowser","os","audioId","dummyAudioEl","getElementById","createElement","autoplay","getEmptyAudioStreamTrack","MediaStream","srcObject","body","append","remove","remoteParticipants","t","attachedElements","play","handleAudioPlaybackStarted","handleAudioPlaybackFailed","startVideo","el","handleVideoPlaybackStarted","handleVideoPlaybackFailed","handleRestarting","clearConnectionReconcile","handleSignalRestarted","waitForRestarted","Reconnected","emitBufferedEvents","participantInfos","sidToIdentity","DISCONNECTED","getOrCreateParticipant","handleActiveSpeakersUpdate","speakers","seenSids","speaker","level","getRemoteParticipantBySid","emitWhenConnected","ActiveSpeakersChanged","handleSpeakersChanged","speakerUpdates","lastSpeakers","active","sort","a","b","handleStreamStateUpdate","streamStateUpdate","streamStates","streamState","newStreamState","streamStateFromProto","setStreamState","TrackStreamStateChanged","handleSubscriptionPermissionUpdate","handleSubscriptionError","handleUserPacket","handleTranscription","handleSipDtmf","handleChatMessage","handleMetrics","handleDataStream","rpc","handleIncomingRpcRequest","userPacket","DataReceived","dtmf","SipDTMFReceived","_remoteParticipant","transcription","transcribedParticipantIdentity","getParticipantByIdentity","segments","extractTranscriptionSegments","transcriptionReceivedTimes","TranscriptionReceived","chatMessage","extractChatMessage","metrics","MetricsReceived","incomingDataStreamManager","handleDataStreamPacket","bufferedSegments","canPlaybackAudio","AudioPlaybackStatusChanged","VideoPlaybackStatusChanged","handleDeviceChange","selectDefaultDevices","MediaDevicesChanged","oldRoom","roomInfo","RoomMetadataChanged","activeRecording","RecordingStatusChanged","handleConnectionQualityUpdate","updates","onLocalParticipantMetadataChanged","onLocalParticipantNameChanged","onLocalAttributesChanged","changedAttributes","ParticipantAttributesChanged","onLocalTrackMuted","onLocalTrackUnmuted","onTrackProcessorUpdate","processor","onPublish","onLocalTrackPublished","TrackProcessorUpdate","Restarted","onLocalTrackRestarted","getProcessor","checkForSilence","LocalAudioSilenceDetected","getDeviceId","ActiveDeviceChanged","onLocalTrackUnpublished","onLocalConnectionQualityChanged","onMediaDevicesError","onLocalParticipantPermissionsChanged","onLocalChatMessageSent","roomOptionDefaults","audioDefaults","videoDefaults","IncomingDataStreamManager","outgoingDataStreamManager","OutgoingDataStreamManager","Mutex","unwrapConstraint","switchActiveDevice","setupE2EE","cleanupRegistry","register","registerTextStreamHandler","callback","unregisterTextStreamHandler","registerByteStreamHandler","unregisterByteStreamHandler","setParticipantCryptorEnabled","E2EEManager","EncryptionEvent","ParticipantEncryptionStatusChanged","isLocalParticipant","EncryptionError","setup","roomID","pID","isRecording","getSid","RoomUpdate","numParticipants","numPublishers","RTCEngine","ParticipantUpdate","SpeakersChanged","StreamStateChanged","ConnectionQualityUpdate","SubscriptionError","SubscriptionPermissionUpdate","MediaTrackAdded","onTrackAdded","ActiveSpeakersUpdate","SignalReconnecting","Resumed","updateSubscriptions","sendSyncState","Offline","DCBufferStatusChanged","subscribedSid","trackPublication","RoomMoved","roomMoved","Moved","getLocalDevices","requestPermissions","DeviceManager","getInstance","getDevices","prepareConnection","fetch","toHttpUrl","simulateScenario","scenario","arg","postAction","handleOnClose","SimulateScenario","failNext","fullReconnectOnNext","onLeave","LeaveRequest","action","LeaveRequest_Action","RECONNECT","numberToBigInt","sendSimulateScenario","canPlaybackVideo","getActiveDevice","kind_1","deviceId_1","exact","success","shouldTriggerImmediateDeviceChange","deviceConstraint","prevDeviceId","audioTrack","setDeviceId","val","supportsSetSinkId","webAudioMix","normalizeDeviceId","reconnectedHandler","cleanup","parts","unpackStreamId","streamId","shouldStopTracks","clearHandlersAndControllers","removeEventListener","validateParticipantHasNoActiveDataStreams","ParticipantDisconnected","callerIdentity","publishRpcAck","publishRpcResponse","previousDevices","availableDevices","availableDevice","previousDevice","label","kinds","targetSource","kindToSource","targetPublication","devicesOfKind","d","activeDevice","isSafariBased","deviceInfo","getNewAudioContext","race","resume","newContextIsRunning","createParticipant","existingParticipant","ParticipantConnected","AudioPlaybackStarted","AudioPlaybackFailed","VideoPlaybackFailed","VideoPlaybackStarted","ParticipantActive","remoteTracks","reduce","acc","isRemotePub","consecutiveFailures","connectionReconcileInterval","CriticalTimers","setInterval","verifyTransport","numFailures","closed","transportsConnected","STATE_MISMATCH","clearInterval","ConnectionStateChanged","ev","_len2","_key2","simulateParticipants","useRealTracks","participantOptions","count","aspectRatios","participants","RoomModel","emptyTimeout","maxParticipants","creationTime","getTime","turnPassword","enabledCodecs","ParticipantInfo","camPub","TrackInfo","TrackSource","CAMERA","floor","random","TrackType","AUDIO","getUserMedia","createDummyVideoStreamTrack","audioPub","MICROPHONE","i","dummyVideo","RTCRtpReceiver","dummyTrack","_len3","_key3","minimizedArgs","mapArgs","FinalizationRegistry","isArray","CheckStatus","Checker","EventEmitter","constructor","url","token","options","status","IDLE","logs","name","room","Room","roomOptions","connectOptions","run","onComplete","Error","setStatus","RUNNING","perform","err","errorsAsWarnings","appendWarning","message","appendError","disconnect","Promise","resolve","setTimeout","SKIPPED","isSuccess","SUCCESS","FAILED","getInfo","some","l","level","connect","state","ConnectionState","Connected","Disconnected","skip","switchProtocol","protocol","hasReconnecting","hasReconnected","on","RoomEvent","Reconnecting","once","Reconnected","simulateScenario","concat","timeout","Date","now","sleep","appendMessage","push","emit","engine","_a","description","CloudRegionCheck","regionProvider","RegionUrlProvider","isCloud","regionStats","seenUrls","Set","i","regionUrl","getNextBestRegionUrl","has","add","stats","checkCloudRegion","region","rtt","duration","sort","a","b","bestRegion","bestStats","info","data","serverInfo","writer","localParticipant","streamText","topic","chunkSize","numChunks","chunkData","repeat","startTime","write","close","endTime","_b","pcManager","publisher","getStats","forEach","stat","type","nominated","currentRoundTripTime","TEST_DURATION","ConnectionProtocolCheck","udpStats","checkConnectionProtocol","tcpStats","qualityLimitationDurations","bandwidth","packetsLost","packetsSent","bitrateTotal","count","toFixed","rttTotal","jitterTotal","cpu","canvas","document","createElement","width","height","ctx","getContext","hue","animate","fillStyle","fillRect","requestAnimationFrame","videoTrack","captureStream","getVideoTracks","track","publishTrack","simulcast","degradationPreference","videoEncoding","maxBitrate","protocolStats","interval","setInterval","__awaiter","getRTCStatsReport","targetBitrate","roundTripTime","jitter","clearInterval","stop","remove","PublishAudioCheck","createLocalAudioTrack","detectSilence","sender","numPackets","kind","mediaType","PublishVideoCheck","createLocalVideoTrack","checkForVideo","mediaStreamTrack","stream","MediaStream","addTrack","clone","video","srcObject","muted","onplay","settings","getSettings","videoWidth","_d","_c","videoHeight","drawImage","getImageData","isAllBlack","length","play","getTracks","t","ReconnectCheck","reconnectingTriggered","reconnected","reconnectResolver","reconnectTimeout","handleReconnecting","SignalReconnecting","client","ws","onClose","TURNCheck","signalClient","SignalClient","joinRes","join","autoSubscribe","maxRetries","e2eeEnabled","websocketTimeout","hasTLS","hasTURN","hasSTUN","iceServer","iceServers","urls","startsWith","rtcConfig","iceTransportPolicy","WebRTCCheck","hasTcp","hasIpv4Udp","SignalConnected","prevTrickle","onTrickle","sd","target","candidate","RTCIceCandidate","str","address","port","isIPPrivate","tcpType","subscriber","onIceCandidateError","ev","RTCPeerConnectionIceErrorEvent","errorCode","errorText","log","parts","split","second","parseInt","WebSocketCheck","serverVersion","edition","ServerInfo_Edition","Cloud","ConnectionCheck","checkResults","Map","getNextCheckId","nextId","size","set","updateCheck","checkId","Array","from","values","every","r","getResults","createAndRunCheck","check","test","handleUpdate","result","off","checkWebsocket","checkWebRTC","checkTURN","checkReconnect","checkPublishAudio","checkPublishVideo","EventEmitter","t","e","s","n","r","o","i","a","m","c","d","u","h","l","p","f","g","S","_S","v","k","#t","y","#s","#n","w","#r","b","#o","#i","#a","#c","P","T","L","#d","D","#u","C","R","M","I","#h","#l","#p","E","#f","#m","N","_","A","O","J","_J","#g","#S","#v","x","#k","__awaiter","thisArg","_arguments","P","generator","adopt","value","resolve","reject","fulfilled","step","e","rejected","result","SessionEvent","AgentEventsEnum","getAgentEventEmitArgs","event","payload","CommandEventsEnum","ElevenLabsAgentCommandType","SessionMode","AgentType","SessionState","SessionDisconnectReason","Language","ConnectionQuality","AbstractConnectionQualityIndicator","onConnectionQualityChanged","newConnectionQuality","params","muted","QualityIndicatorComposite","configs","CombinedQualityIndicator","getParams","TrackerClass","connectionQualities","tracker","quality","LiveKitConnectionQualityIndicator","state","room","ParticipantEvent","RoomEvent","ConnectionState","WebRTCConnectionQualityIndicator","peerConnection","x","scores","ConnectionQualityIndicator","_a","VoiceChatEvent","PushToTalkCommandEvent","PushToTalkServerEvent","VoiceChatState","SessionInteractivityMode","LIVEKIT_COMMAND_CHANNEL_TOPIC","LIVEKIT_SERVER_RESPONSE_CHANNEL_TOPIC","API_URL","initEventPromise","eventType","rejectionEventType","resolve","reject","messageHandler","roomMessage","_","__","topic","eventData","messageString","type","VoiceChat","EventEmitter","mode","_b","__awaiter","config","defaultMuted","deviceId","createLocalAudioTrack","error","TrackEvent","publication","Track","promise","e","command","data","warnMessage","DEFAULT_ERROR_CODE","SUCCESS_CODE","SessionApiError","message","errorCode","status","SessionAPIClient","sessionToken","apiUrl","path","response","err","splitPcm24kStringToChunks","pcmString","totalLength","result","i","HEYGEN_PARTICIPANT_ID","LIVEAVATAR_AGENT_PARTICIPANT_ID_PREFIX","REQUIRED_PARTICIPANTS_TIMEOUT_MS","decodeSessionTokenPayload","token","parts","parseSessionModeFromToken","decoded","parseAgentTypeFromToken","explicit","LiveAvatarSession","sessionAccessToken","Room","supportsAdaptiveStream","supportsDynacast","VideoPresets","livekitRoomUrl","livekitClientToken","websocketUrl","element","event_id","audio","mediaStream","track","_publication","participant","hasVideoTrack","hasAudioTrack","eventMsg","emitArgs","event_type","event_data","mediaTrack","reason","sessionId","agentId","required","p","onConnected","cleanup","timeout","_reject","commandEvent","c","r","audioChunks","audioChunk","ElevenLabsAgentSessionError","ElevenLabsAgentSession","options","wrapper","text","args","_message","_audio"],"sources":["../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/node_modules/.pnpm/@livekit+mutex@1.1.1/node_modules/@livekit/mutex/dist/index.mjs","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/node_modules/.pnpm/@bufbuild+protobuf@1.10.1/node_modules/@bufbuild/protobuf/dist/esm/private/assert.js","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/node_modules/.pnpm/@bufbuild+protobuf@1.10.1/node_modules/@bufbuild/protobuf/dist/esm/private/enum.js","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/node_modules/.pnpm/@bufbuild+protobuf@1.10.1/node_modules/@bufbuild/protobuf/dist/esm/message.js","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/node_modules/.pnpm/@bufbuild+protobuf@1.10.1/node_modules/@bufbuild/protobuf/dist/esm/private/message-type.js","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/node_modules/.pnpm/@bufbuild+protobuf@1.10.1/node_modules/@bufbuild/protobuf/dist/esm/google/varint.js","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/node_modules/.pnpm/@bufbuild+protobuf@1.10.1/node_modules/@bufbuild/protobuf/dist/esm/proto-int64.js","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/node_modules/.pnpm/@bufbuild+protobuf@1.10.1/node_modules/@bufbuild/protobuf/dist/esm/scalar.js","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/node_modules/.pnpm/@bufbuild+protobuf@1.10.1/node_modules/@bufbuild/protobuf/dist/esm/private/scalars.js","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/node_modules/.pnpm/@bufbuild+protobuf@1.10.1/node_modules/@bufbuild/protobuf/dist/esm/binary-encoding.js","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/node_modules/.pnpm/@bufbuild+protobuf@1.10.1/node_modules/@bufbuild/protobuf/dist/esm/private/extensions.js","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/node_modules/.pnpm/@bufbuild+protobuf@1.10.1/node_modules/@bufbuild/protobuf/dist/esm/proto-base64.js","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/node_modules/.pnpm/@bufbuild+protobuf@1.10.1/node_modules/@bufbuild/protobuf/dist/esm/extension-accessor.js","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/node_modules/.pnpm/@bufbuild+protobuf@1.10.1/node_modules/@bufbuild/protobuf/dist/esm/private/reflect.js","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/node_modules/.pnpm/@bufbuild+protobuf@1.10.1/node_modules/@bufbuild/protobuf/dist/esm/is-message.js","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/node_modules/.pnpm/@bufbuild+protobuf@1.10.1/node_modules/@bufbuild/protobuf/dist/esm/private/field-wrapper.js","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/node_modules/.pnpm/@bufbuild+protobuf@1.10.1/node_modules/@bufbuild/protobuf/dist/esm/private/json-format.js","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/node_modules/.pnpm/@bufbuild+protobuf@1.10.1/node_modules/@bufbuild/protobuf/dist/esm/private/binary-format.js","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/node_modules/.pnpm/@bufbuild+protobuf@1.10.1/node_modules/@bufbuild/protobuf/dist/esm/private/util-common.js","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/node_modules/.pnpm/@bufbuild+protobuf@1.10.1/node_modules/@bufbuild/protobuf/dist/esm/private/proto-runtime.js","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/node_modules/.pnpm/@bufbuild+protobuf@1.10.1/node_modules/@bufbuild/protobuf/dist/esm/private/field-list.js","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/node_modules/.pnpm/@bufbuild+protobuf@1.10.1/node_modules/@bufbuild/protobuf/dist/esm/private/names.js","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/node_modules/.pnpm/@bufbuild+protobuf@1.10.1/node_modules/@bufbuild/protobuf/dist/esm/private/field.js","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/node_modules/.pnpm/@bufbuild+protobuf@1.10.1/node_modules/@bufbuild/protobuf/dist/esm/private/field-normalize.js","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/node_modules/.pnpm/@bufbuild+protobuf@1.10.1/node_modules/@bufbuild/protobuf/dist/esm/proto3.js","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/node_modules/.pnpm/@bufbuild+protobuf@1.10.1/node_modules/@bufbuild/protobuf/dist/esm/google/protobuf/timestamp_pb.js","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/node_modules/.pnpm/@livekit+protocol@1.39.3/node_modules/@livekit/protocol/dist/index.mjs","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/node_modules/.pnpm/loglevel@1.9.2/node_modules/loglevel/lib/loglevel.js","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/logger.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/room/DefaultReconnectPolicy.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/node_modules/.pnpm/events@3.3.0/node_modules/events/events.js","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/node_modules/.pnpm/webrtc-adapter@9.0.3/node_modules/webrtc-adapter/src/js/utils.js","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/node_modules/.pnpm/webrtc-adapter@9.0.3/node_modules/webrtc-adapter/src/js/chrome/getusermedia.js","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/node_modules/.pnpm/webrtc-adapter@9.0.3/node_modules/webrtc-adapter/src/js/chrome/chrome_shim.js","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/node_modules/.pnpm/webrtc-adapter@9.0.3/node_modules/webrtc-adapter/src/js/firefox/getusermedia.js","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/node_modules/.pnpm/webrtc-adapter@9.0.3/node_modules/webrtc-adapter/src/js/firefox/getdisplaymedia.js","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/node_modules/.pnpm/webrtc-adapter@9.0.3/node_modules/webrtc-adapter/src/js/firefox/firefox_shim.js","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/node_modules/.pnpm/webrtc-adapter@9.0.3/node_modules/webrtc-adapter/src/js/safari/safari_shim.js","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/node_modules/.pnpm/sdp@3.2.0/node_modules/sdp/sdp.js","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/node_modules/.pnpm/webrtc-adapter@9.0.3/node_modules/webrtc-adapter/src/js/common_shim.js","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/node_modules/.pnpm/webrtc-adapter@9.0.3/node_modules/webrtc-adapter/src/js/adapter_factory.js","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/node_modules/.pnpm/webrtc-adapter@9.0.3/node_modules/webrtc-adapter/src/js/adapter_core.js","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/e2ee/constants.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/e2ee/events.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/e2ee/utils.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/e2ee/KeyProvider.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/room/errors.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/e2ee/errors.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/room/events.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/utils/cloneDeep.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/utils/browserParser.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/version.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/room/timers.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/room/track/Track.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/room/track/options.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/room/utils.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/room/track/utils.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/e2ee/E2eeManager.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/room/DeviceManager.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/utils/AsyncQueue.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/api/utils.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/api/SignalClient.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/utils/dataPacketBuffer.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/utils/ttlmap.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/node_modules/.pnpm/sdp-transform@2.15.0/node_modules/sdp-transform/lib/grammar.js","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/node_modules/.pnpm/sdp-transform@2.15.0/node_modules/sdp-transform/lib/parser.js","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/node_modules/.pnpm/sdp-transform@2.15.0/node_modules/sdp-transform/lib/writer.js","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/node_modules/.pnpm/sdp-transform@2.15.0/node_modules/sdp-transform/lib/index.js","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/node_modules/.pnpm/ts-debounce@4.0.0/node_modules/ts-debounce/dist/src/index.esm.js","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/room/PCTransport.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/room/defaults.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/room/PCTransportManager.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/room/rpc.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/room/stats.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/room/track/record.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/room/track/LocalTrack.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/room/track/LocalAudioTrack.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/room/participant/publishUtils.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/room/track/LocalVideoTrack.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/room/RTCEngine.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/room/RegionUrlProvider.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/room/data-stream/incoming/StreamReader.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/room/data-stream/incoming/IncomingDataStreamManager.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/room/data-stream/outgoing/StreamWriter.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/room/data-stream/outgoing/OutgoingDataStreamManager.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/room/track/RemoteTrack.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/room/track/RemoteAudioTrack.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/room/track/RemoteVideoTrack.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/room/track/TrackPublication.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/room/track/LocalTrackPublication.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/room/track/create.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/room/participant/Participant.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/room/participant/ParticipantTrackPermission.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/room/participant/LocalParticipant.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/room/track/RemoteTrackPublication.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/room/participant/RemoteParticipant.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/room/Room.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/room/attribute-typings.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/connectionHelper/checks/Checker.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/connectionHelper/checks/cloudRegion.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/connectionHelper/checks/connectionProtocol.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/connectionHelper/checks/publishAudio.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/connectionHelper/checks/publishVideo.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/connectionHelper/checks/reconnect.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/connectionHelper/checks/turn.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/connectionHelper/checks/webrtc.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/connectionHelper/checks/websocket.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/connectionHelper/ConnectionCheck.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/livekit-client/src/room/track/facingMode.ts","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/@heygen/liveavatar-web-sdk/lib/index.esm.js","../esm/npm/@heygen/liveavatar-web-sdk@0.0.18/node_modules/webrtc-issue-detector/dist/bundle-esm.js"],"sourcesContent":["var e = Object.defineProperty;\nvar h = (i, s, t) =\u003e s in i ? e(i, s, { enumerable: !0, configurable: !0, writable: !0, value: t }) : i[s] = t;\nvar o = (i, s, t) =\u003e h(i, typeof s != \"symbol\" ? s + \"\" : s, t);\nclass _ {\n  constructor() {\n    o(this, \"_locking\");\n    o(this, \"_locks\");\n    this._locking = Promise.resolve(), this._locks = 0;\n  }\n  isLocked() {\n    return this._locks \u003e 0;\n  }\n  lock() {\n    this._locks += 1;\n    let s;\n    const t = new Promise(\n      (l) =\u003e s = () =\u003e {\n        this._locks -= 1, l();\n      }\n    ), c = this._locking.then(() =\u003e s);\n    return this._locking = this._locking.then(() =\u003e t), c;\n  }\n}\nclass n {\n  constructor(s) {\n    o(this, \"_queue\");\n    o(this, \"_limit\");\n    o(this, \"_locks\");\n    this._queue = [], this._limit = s, this._locks = 0;\n  }\n  isLocked() {\n    return this._locks \u003e= this._limit;\n  }\n  async lock() {\n    return this.isLocked() ? new Promise((s) =\u003e {\n      this._queue.push(() =\u003e {\n        this._locks++, s(this._unlock.bind(this));\n      });\n    }) : (this._locks++, this._unlock.bind(this));\n  }\n  _unlock() {\n    if (this._locks--, this._queue.length \u0026\u0026 !this.isLocked()) {\n      const s = this._queue.shift();\n      s == null || s();\n    }\n  }\n}\nexport {\n  n as MultiMutex,\n  _ as Mutex\n};\n//# sourceMappingURL=index.mjs.map\n","// Copyright 2021-2024 Buf Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n/**\n * Assert that condition is truthy or throw error (with message)\n */\nexport function assert(condition, msg) {\n    // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions -- we want the implicit conversion to boolean\n    if (!condition) {\n        throw new Error(msg);\n    }\n}\nconst FLOAT32_MAX = 3.4028234663852886e38, FLOAT32_MIN = -3.4028234663852886e38, UINT32_MAX = 0xffffffff, INT32_MAX = 0x7fffffff, INT32_MIN = -0x80000000;\n/**\n * Assert a valid signed protobuf 32-bit integer.\n */\nexport function assertInt32(arg) {\n    if (typeof arg !== \"number\")\n        throw new Error(\"invalid int 32: \" + typeof arg);\n    if (!Number.isInteger(arg) || arg \u003e INT32_MAX || arg \u003c INT32_MIN)\n        throw new Error(\"invalid int 32: \" + arg); // eslint-disable-line @typescript-eslint/restrict-plus-operands -- we want the implicit conversion to string\n}\n/**\n * Assert a valid unsigned protobuf 32-bit integer.\n */\nexport function assertUInt32(arg) {\n    if (typeof arg !== \"number\")\n        throw new Error(\"invalid uint 32: \" + typeof arg);\n    if (!Number.isInteger(arg) || arg \u003e UINT32_MAX || arg \u003c 0)\n        throw new Error(\"invalid uint 32: \" + arg); // eslint-disable-line @typescript-eslint/restrict-plus-operands -- we want the implicit conversion to string\n}\n/**\n * Assert a valid protobuf float value.\n */\nexport function assertFloat32(arg) {\n    if (typeof arg !== \"number\")\n        throw new Error(\"invalid float 32: \" + typeof arg);\n    if (!Number.isFinite(arg))\n        return;\n    if (arg \u003e FLOAT32_MAX || arg \u003c FLOAT32_MIN)\n        throw new Error(\"invalid float 32: \" + arg); // eslint-disable-line @typescript-eslint/restrict-plus-operands -- we want the implicit conversion to string\n}\n","// Copyright 2021-2024 Buf Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport { assert } from \"./assert.js\";\nconst enumTypeSymbol = Symbol(\"@bufbuild/protobuf/enum-type\");\n/**\n * Get reflection information from a generated enum.\n * If this function is called on something other than a generated\n * enum, it raises an error.\n */\nexport function getEnumType(enumObject) {\n    // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-explicit-any\n    const t = enumObject[enumTypeSymbol];\n    assert(t, \"missing enum type on enum object\");\n    return t; // eslint-disable-line @typescript-eslint/no-unsafe-return\n}\n/**\n * Sets reflection information on a generated enum.\n */\nexport function setEnumType(enumObject, typeName, values, opt) {\n    // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n    enumObject[enumTypeSymbol] = makeEnumType(typeName, values.map((v) =\u003e ({\n        no: v.no,\n        name: v.name,\n        localName: enumObject[v.no],\n    })), opt);\n}\n/**\n * Create a new EnumType with the given values.\n */\nexport function makeEnumType(typeName, values, \n// eslint-disable-next-line @typescript-eslint/no-unused-vars\n_opt) {\n    const names = Object.create(null);\n    const numbers = Object.create(null);\n    const normalValues = [];\n    for (const value of values) {\n        // We do not surface options at this time\n        // const value: EnumValueInfo = {...v, options: v.options ?? emptyReadonlyObject};\n        const n = normalizeEnumValue(value);\n        normalValues.push(n);\n        names[value.name] = n;\n        numbers[value.no] = n;\n    }\n    return {\n        typeName,\n        values: normalValues,\n        // We do not surface options at this time\n        // options: opt?.options ?? Object.create(null),\n        findName(name) {\n            return names[name];\n        },\n        findNumber(no) {\n            return numbers[no];\n        },\n    };\n}\n/**\n * Create a new enum object with the given values.\n * Sets reflection information.\n */\nexport function makeEnum(typeName, values, opt) {\n    const enumObject = {};\n    for (const value of values) {\n        const n = normalizeEnumValue(value);\n        enumObject[n.localName] = n.no;\n        enumObject[n.no] = n.localName;\n    }\n    setEnumType(enumObject, typeName, values, opt);\n    return enumObject;\n}\nfunction normalizeEnumValue(value) {\n    if (\"localName\" in value) {\n        return value;\n    }\n    return Object.assign(Object.assign({}, value), { localName: value.name });\n}\n","// Copyright 2021-2024 Buf Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n/**\n * Message is the base class of every message, generated, or created at\n * runtime.\n *\n * It is _not_ safe to extend this class. If you want to create a message at\n * run time, use proto3.makeMessageType().\n */\nexport class Message {\n    /**\n     * Compare with a message of the same type.\n     * Note that this function disregards extensions and unknown fields.\n     */\n    equals(other) {\n        return this.getType().runtime.util.equals(this.getType(), this, other);\n    }\n    /**\n     * Create a deep copy.\n     */\n    clone() {\n        return this.getType().runtime.util.clone(this);\n    }\n    /**\n     * Parse from binary data, merging fields.\n     *\n     * Repeated fields are appended. Map entries are added, overwriting\n     * existing keys.\n     *\n     * If a message field is already present, it will be merged with the\n     * new data.\n     */\n    fromBinary(bytes, options) {\n        const type = this.getType(), format = type.runtime.bin, opt = format.makeReadOptions(options);\n        format.readMessage(this, opt.readerFactory(bytes), bytes.byteLength, opt);\n        return this;\n    }\n    /**\n     * Parse a message from a JSON value.\n     */\n    fromJson(jsonValue, options) {\n        const type = this.getType(), format = type.runtime.json, opt = format.makeReadOptions(options);\n        format.readMessage(type, jsonValue, opt, this);\n        return this;\n    }\n    /**\n     * Parse a message from a JSON string.\n     */\n    fromJsonString(jsonString, options) {\n        let json;\n        try {\n            json = JSON.parse(jsonString);\n        }\n        catch (e) {\n            throw new Error(`cannot decode ${this.getType().typeName} from JSON: ${e instanceof Error ? e.message : String(e)}`);\n        }\n        return this.fromJson(json, options);\n    }\n    /**\n     * Serialize the message to binary data.\n     */\n    toBinary(options) {\n        const type = this.getType(), bin = type.runtime.bin, opt = bin.makeWriteOptions(options), writer = opt.writerFactory();\n        bin.writeMessage(this, writer, opt);\n        return writer.finish();\n    }\n    /**\n     * Serialize the message to a JSON value, a JavaScript value that can be\n     * passed to JSON.stringify().\n     */\n    toJson(options) {\n        const type = this.getType(), json = type.runtime.json, opt = json.makeWriteOptions(options);\n        return json.writeMessage(this, opt);\n    }\n    /**\n     * Serialize the message to a JSON string.\n     */\n    toJsonString(options) {\n        var _a;\n        const value = this.toJson(options);\n        return JSON.stringify(value, null, (_a = options === null || options === void 0 ? void 0 : options.prettySpaces) !== null \u0026\u0026 _a !== void 0 ? _a : 0);\n    }\n    /**\n     * Override for serialization behavior. This will be invoked when calling\n     * JSON.stringify on this message (i.e. JSON.stringify(msg)).\n     *\n     * Note that this will not serialize google.protobuf.Any with a packed\n     * message because the protobuf JSON format specifies that it needs to be\n     * unpacked, and this is only possible with a type registry to look up the\n     * message type.  As a result, attempting to serialize a message with this\n     * type will throw an Error.\n     *\n     * This method is protected because you should not need to invoke it\n     * directly -- instead use JSON.stringify or toJsonString for\n     * stringified JSON.  Alternatively, if actual JSON is desired, you should\n     * use toJson.\n     */\n    toJSON() {\n        return this.toJson({\n            emitDefaultValues: true,\n        });\n    }\n    /**\n     * Retrieve the MessageType of this message - a singleton that represents\n     * the protobuf message declaration and provides metadata for reflection-\n     * based operations.\n     */\n    getType() {\n        // Any class that extends Message _must_ provide a complete static\n        // implementation of MessageType.\n        // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-return\n        return Object.getPrototypeOf(this).constructor;\n    }\n}\n","// Copyright 2021-2024 Buf Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport { Message } from \"../message.js\";\n/**\n * Create a new message type using the given runtime.\n */\nexport function makeMessageType(runtime, typeName, fields, opt) {\n    var _a;\n    const localName = (_a = opt === null || opt === void 0 ? void 0 : opt.localName) !== null \u0026\u0026 _a !== void 0 ? _a : typeName.substring(typeName.lastIndexOf(\".\") + 1);\n    const type = {\n        [localName]: function (data) {\n            runtime.util.initFields(this);\n            runtime.util.initPartial(data, this);\n        },\n    }[localName];\n    Object.setPrototypeOf(type.prototype, new Message());\n    Object.assign(type, {\n        runtime,\n        typeName,\n        fields: runtime.util.newFieldList(fields),\n        fromBinary(bytes, options) {\n            return new type().fromBinary(bytes, options);\n        },\n        fromJson(jsonValue, options) {\n            return new type().fromJson(jsonValue, options);\n        },\n        fromJsonString(jsonString, options) {\n            return new type().fromJsonString(jsonString, options);\n        },\n        equals(a, b) {\n            return runtime.util.equals(type, a, b);\n        },\n    });\n    return type;\n}\n","// Copyright 2008 Google Inc.  All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n// * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n// * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n// * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Code generated by the Protocol Buffer compiler is owned by the owner\n// of the input file used when generating it.  This code is not\n// standalone and requires a support library to be linked with it.  This\n// support library is itself covered by the above license.\n/* eslint-disable prefer-const,@typescript-eslint/restrict-plus-operands */\n/**\n * Read a 64 bit varint as two JS numbers.\n *\n * Returns tuple:\n * [0]: low bits\n * [1]: high bits\n *\n * Copyright 2008 Google Inc.  All rights reserved.\n *\n * See https://github.com/protocolbuffers/protobuf/blob/8a71927d74a4ce34efe2d8769fda198f52d20d12/js/experimental/runtime/kernel/buffer_decoder.js#L175\n */\nexport function varint64read() {\n    let lowBits = 0;\n    let highBits = 0;\n    for (let shift = 0; shift \u003c 28; shift += 7) {\n        let b = this.buf[this.pos++];\n        lowBits |= (b \u0026 0x7f) \u003c\u003c shift;\n        if ((b \u0026 0x80) == 0) {\n            this.assertBounds();\n            return [lowBits, highBits];\n        }\n    }\n    let middleByte = this.buf[this.pos++];\n    // last four bits of the first 32 bit number\n    lowBits |= (middleByte \u0026 0x0f) \u003c\u003c 28;\n    // 3 upper bits are part of the next 32 bit number\n    highBits = (middleByte \u0026 0x70) \u003e\u003e 4;\n    if ((middleByte \u0026 0x80) == 0) {\n        this.assertBounds();\n        return [lowBits, highBits];\n    }\n    for (let shift = 3; shift \u003c= 31; shift += 7) {\n        let b = this.buf[this.pos++];\n        highBits |= (b \u0026 0x7f) \u003c\u003c shift;\n        if ((b \u0026 0x80) == 0) {\n            this.assertBounds();\n            return [lowBits, highBits];\n        }\n    }\n    throw new Error(\"invalid varint\");\n}\n/**\n * Write a 64 bit varint, given as two JS numbers, to the given bytes array.\n *\n * Copyright 2008 Google Inc.  All rights reserved.\n *\n * See https://github.com/protocolbuffers/protobuf/blob/8a71927d74a4ce34efe2d8769fda198f52d20d12/js/experimental/runtime/kernel/writer.js#L344\n */\nexport function varint64write(lo, hi, bytes) {\n    for (let i = 0; i \u003c 28; i = i + 7) {\n        const shift = lo \u003e\u003e\u003e i;\n        const hasNext = !(shift \u003e\u003e\u003e 7 == 0 \u0026\u0026 hi == 0);\n        const byte = (hasNext ? shift | 0x80 : shift) \u0026 0xff;\n        bytes.push(byte);\n        if (!hasNext) {\n            return;\n        }\n    }\n    const splitBits = ((lo \u003e\u003e\u003e 28) \u0026 0x0f) | ((hi \u0026 0x07) \u003c\u003c 4);\n    const hasMoreBits = !(hi \u003e\u003e 3 == 0);\n    bytes.push((hasMoreBits ? splitBits | 0x80 : splitBits) \u0026 0xff);\n    if (!hasMoreBits) {\n        return;\n    }\n    for (let i = 3; i \u003c 31; i = i + 7) {\n        const shift = hi \u003e\u003e\u003e i;\n        const hasNext = !(shift \u003e\u003e\u003e 7 == 0);\n        const byte = (hasNext ? shift | 0x80 : shift) \u0026 0xff;\n        bytes.push(byte);\n        if (!hasNext) {\n            return;\n        }\n    }\n    bytes.push((hi \u003e\u003e\u003e 31) \u0026 0x01);\n}\n// constants for binary math\nconst TWO_PWR_32_DBL = 0x100000000;\n/**\n * Parse decimal string of 64 bit integer value as two JS numbers.\n *\n * Copyright 2008 Google Inc.  All rights reserved.\n *\n * See https://github.com/protocolbuffers/protobuf-javascript/blob/a428c58273abad07c66071d9753bc4d1289de426/experimental/runtime/int64.js#L10\n */\nexport function int64FromString(dec) {\n    // Check for minus sign.\n    const minus = dec[0] === \"-\";\n    if (minus) {\n        dec = dec.slice(1);\n    }\n    // Work 6 decimal digits at a time, acting like we're converting base 1e6\n    // digits to binary. This is safe to do with floating point math because\n    // Number.isSafeInteger(ALL_32_BITS * 1e6) == true.\n    const base = 1e6;\n    let lowBits = 0;\n    let highBits = 0;\n    function add1e6digit(begin, end) {\n        // Note: Number('') is 0.\n        const digit1e6 = Number(dec.slice(begin, end));\n        highBits *= base;\n        lowBits = lowBits * base + digit1e6;\n        // Carry bits from lowBits to\n        if (lowBits \u003e= TWO_PWR_32_DBL) {\n            highBits = highBits + ((lowBits / TWO_PWR_32_DBL) | 0);\n            lowBits = lowBits % TWO_PWR_32_DBL;\n        }\n    }\n    add1e6digit(-24, -18);\n    add1e6digit(-18, -12);\n    add1e6digit(-12, -6);\n    add1e6digit(-6);\n    return minus ? negate(lowBits, highBits) : newBits(lowBits, highBits);\n}\n/**\n * Losslessly converts a 64-bit signed integer in 32:32 split representation\n * into a decimal string.\n *\n * Copyright 2008 Google Inc.  All rights reserved.\n *\n * See https://github.com/protocolbuffers/protobuf-javascript/blob/a428c58273abad07c66071d9753bc4d1289de426/experimental/runtime/int64.js#L10\n */\nexport function int64ToString(lo, hi) {\n    let bits = newBits(lo, hi);\n    // If we're treating the input as a signed value and the high bit is set, do\n    // a manual two's complement conversion before the decimal conversion.\n    const negative = (bits.hi \u0026 0x80000000);\n    if (negative) {\n        bits = negate(bits.lo, bits.hi);\n    }\n    const result = uInt64ToString(bits.lo, bits.hi);\n    return negative ? \"-\" + result : result;\n}\n/**\n * Losslessly converts a 64-bit unsigned integer in 32:32 split representation\n * into a decimal string.\n *\n * Copyright 2008 Google Inc.  All rights reserved.\n *\n * See https://github.com/protocolbuffers/protobuf-javascript/blob/a428c58273abad07c66071d9753bc4d1289de426/experimental/runtime/int64.js#L10\n */\nexport function uInt64ToString(lo, hi) {\n    ({ lo, hi } = toUnsigned(lo, hi));\n    // Skip the expensive conversion if the number is small enough to use the\n    // built-in conversions.\n    // Number.MAX_SAFE_INTEGER = 0x001FFFFF FFFFFFFF, thus any number with\n    // highBits \u003c= 0x1FFFFF can be safely expressed with a double and retain\n    // integer precision.\n    // Proven by: Number.isSafeInteger(0x1FFFFF * 2**32 + 0xFFFFFFFF) == true.\n    if (hi \u003c= 0x1FFFFF) {\n        return String(TWO_PWR_32_DBL * hi + lo);\n    }\n    // What this code is doing is essentially converting the input number from\n    // base-2 to base-1e7, which allows us to represent the 64-bit range with\n    // only 3 (very large) digits. Those digits are then trivial to convert to\n    // a base-10 string.\n    // The magic numbers used here are -\n    // 2^24 = 16777216 = (1,6777216) in base-1e7.\n    // 2^48 = 281474976710656 = (2,8147497,6710656) in base-1e7.\n    // Split 32:32 representation into 16:24:24 representation so our\n    // intermediate digits don't overflow.\n    const low = lo \u0026 0xFFFFFF;\n    const mid = ((lo \u003e\u003e\u003e 24) | (hi \u003c\u003c 8)) \u0026 0xFFFFFF;\n    const high = (hi \u003e\u003e 16) \u0026 0xFFFF;\n    // Assemble our three base-1e7 digits, ignoring carries. The maximum\n    // value in a digit at this step is representable as a 48-bit integer, which\n    // can be stored in a 64-bit floating point number.\n    let digitA = low + (mid * 6777216) + (high * 6710656);\n    let digitB = mid + (high * 8147497);\n    let digitC = (high * 2);\n    // Apply carries from A to B and from B to C.\n    const base = 10000000;\n    if (digitA \u003e= base) {\n        digitB += Math.floor(digitA / base);\n        digitA %= base;\n    }\n    if (digitB \u003e= base) {\n        digitC += Math.floor(digitB / base);\n        digitB %= base;\n    }\n    // If digitC is 0, then we should have returned in the trivial code path\n    // at the top for non-safe integers. Given this, we can assume both digitB\n    // and digitA need leading zeros.\n    return digitC.toString() + decimalFrom1e7WithLeadingZeros(digitB) +\n        decimalFrom1e7WithLeadingZeros(digitA);\n}\nfunction toUnsigned(lo, hi) {\n    return { lo: lo \u003e\u003e\u003e 0, hi: hi \u003e\u003e\u003e 0 };\n}\nfunction newBits(lo, hi) {\n    return { lo: lo | 0, hi: hi | 0 };\n}\n/**\n * Returns two's compliment negation of input.\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators#Signed_32-bit_integers\n */\nfunction negate(lowBits, highBits) {\n    highBits = ~highBits;\n    if (lowBits) {\n        lowBits = ~lowBits + 1;\n    }\n    else {\n        // If lowBits is 0, then bitwise-not is 0xFFFFFFFF,\n        // adding 1 to that, results in 0x100000000, which leaves\n        // the low bits 0x0 and simply adds one to the high bits.\n        highBits += 1;\n    }\n    return newBits(lowBits, highBits);\n}\n/**\n * Returns decimal representation of digit1e7 with leading zeros.\n */\nconst decimalFrom1e7WithLeadingZeros = (digit1e7) =\u003e {\n    const partial = String(digit1e7);\n    return \"0000000\".slice(partial.length) + partial;\n};\n/**\n * Write a 32 bit varint, signed or unsigned. Same as `varint64write(0, value, bytes)`\n *\n * Copyright 2008 Google Inc.  All rights reserved.\n *\n * See https://github.com/protocolbuffers/protobuf/blob/1b18833f4f2a2f681f4e4a25cdf3b0a43115ec26/js/binary/encoder.js#L144\n */\nexport function varint32write(value, bytes) {\n    if (value \u003e= 0) {\n        // write value as varint 32\n        while (value \u003e 0x7f) {\n            bytes.push((value \u0026 0x7f) | 0x80);\n            value = value \u003e\u003e\u003e 7;\n        }\n        bytes.push(value);\n    }\n    else {\n        for (let i = 0; i \u003c 9; i++) {\n            bytes.push((value \u0026 127) | 128);\n            value = value \u003e\u003e 7;\n        }\n        bytes.push(1);\n    }\n}\n/**\n * Read an unsigned 32 bit varint.\n *\n * See https://github.com/protocolbuffers/protobuf/blob/8a71927d74a4ce34efe2d8769fda198f52d20d12/js/experimental/runtime/kernel/buffer_decoder.js#L220\n */\nexport function varint32read() {\n    let b = this.buf[this.pos++];\n    let result = b \u0026 0x7f;\n    if ((b \u0026 0x80) == 0) {\n        this.assertBounds();\n        return result;\n    }\n    b = this.buf[this.pos++];\n    result |= (b \u0026 0x7f) \u003c\u003c 7;\n    if ((b \u0026 0x80) == 0) {\n        this.assertBounds();\n        return result;\n    }\n    b = this.buf[this.pos++];\n    result |= (b \u0026 0x7f) \u003c\u003c 14;\n    if ((b \u0026 0x80) == 0) {\n        this.assertBounds();\n        return result;\n    }\n    b = this.buf[this.pos++];\n    result |= (b \u0026 0x7f) \u003c\u003c 21;\n    if ((b \u0026 0x80) == 0) {\n        this.assertBounds();\n        return result;\n    }\n    // Extract only last 4 bits\n    b = this.buf[this.pos++];\n    result |= (b \u0026 0x0f) \u003c\u003c 28;\n    for (let readBytes = 5; (b \u0026 0x80) !== 0 \u0026\u0026 readBytes \u003c 10; readBytes++)\n        b = this.buf[this.pos++];\n    if ((b \u0026 0x80) != 0)\n        throw new Error(\"invalid varint\");\n    this.assertBounds();\n    // Result can have 32 bits, convert it to unsigned\n    return result \u003e\u003e\u003e 0;\n}\n","// Copyright 2021-2024 Buf Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport { assert } from \"./private/assert.js\";\nimport { int64FromString, int64ToString, uInt64ToString, } from \"./google/varint.js\";\nfunction makeInt64Support() {\n    const dv = new DataView(new ArrayBuffer(8));\n    // note that Safari 14 implements BigInt, but not the DataView methods\n    const ok = typeof BigInt === \"function\" \u0026\u0026\n        typeof dv.getBigInt64 === \"function\" \u0026\u0026\n        typeof dv.getBigUint64 === \"function\" \u0026\u0026\n        typeof dv.setBigInt64 === \"function\" \u0026\u0026\n        typeof dv.setBigUint64 === \"function\" \u0026\u0026\n        (typeof process != \"object\" ||\n            typeof process.env != \"object\" ||\n            process.env.BUF_BIGINT_DISABLE !== \"1\");\n    if (ok) {\n        const MIN = BigInt(\"-9223372036854775808\"), MAX = BigInt(\"9223372036854775807\"), UMIN = BigInt(\"0\"), UMAX = BigInt(\"18446744073709551615\");\n        return {\n            zero: BigInt(0),\n            supported: true,\n            parse(value) {\n                const bi = typeof value == \"bigint\" ? value : BigInt(value);\n                if (bi \u003e MAX || bi \u003c MIN) {\n                    throw new Error(`int64 invalid: ${value}`);\n                }\n                return bi;\n            },\n            uParse(value) {\n                const bi = typeof value == \"bigint\" ? value : BigInt(value);\n                if (bi \u003e UMAX || bi \u003c UMIN) {\n                    throw new Error(`uint64 invalid: ${value}`);\n                }\n                return bi;\n            },\n            enc(value) {\n                dv.setBigInt64(0, this.parse(value), true);\n                return {\n                    lo: dv.getInt32(0, true),\n                    hi: dv.getInt32(4, true),\n                };\n            },\n            uEnc(value) {\n                dv.setBigInt64(0, this.uParse(value), true);\n                return {\n                    lo: dv.getInt32(0, true),\n                    hi: dv.getInt32(4, true),\n                };\n            },\n            dec(lo, hi) {\n                dv.setInt32(0, lo, true);\n                dv.setInt32(4, hi, true);\n                return dv.getBigInt64(0, true);\n            },\n            uDec(lo, hi) {\n                dv.setInt32(0, lo, true);\n                dv.setInt32(4, hi, true);\n                return dv.getBigUint64(0, true);\n            },\n        };\n    }\n    const assertInt64String = (value) =\u003e assert(/^-?[0-9]+$/.test(value), `int64 invalid: ${value}`);\n    const assertUInt64String = (value) =\u003e assert(/^[0-9]+$/.test(value), `uint64 invalid: ${value}`);\n    return {\n        zero: \"0\",\n        supported: false,\n        parse(value) {\n            if (typeof value != \"string\") {\n                value = value.toString();\n            }\n            assertInt64String(value);\n            return value;\n        },\n        uParse(value) {\n            if (typeof value != \"string\") {\n                value = value.toString();\n            }\n            assertUInt64String(value);\n            return value;\n        },\n        enc(value) {\n            if (typeof value != \"string\") {\n                value = value.toString();\n            }\n            assertInt64String(value);\n            return int64FromString(value);\n        },\n        uEnc(value) {\n            if (typeof value != \"string\") {\n                value = value.toString();\n            }\n            assertUInt64String(value);\n            return int64FromString(value);\n        },\n        dec(lo, hi) {\n            return int64ToString(lo, hi);\n        },\n        uDec(lo, hi) {\n            return uInt64ToString(lo, hi);\n        },\n    };\n}\nexport const protoInt64 = makeInt64Support();\n","// Copyright 2021-2024 Buf Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n/**\n * Scalar value types. This is a subset of field types declared by protobuf\n * enum google.protobuf.FieldDescriptorProto.Type The types GROUP and MESSAGE\n * are omitted, but the numerical values are identical.\n */\nexport var ScalarType;\n(function (ScalarType) {\n    // 0 is reserved for errors.\n    // Order is weird for historical reasons.\n    ScalarType[ScalarType[\"DOUBLE\"] = 1] = \"DOUBLE\";\n    ScalarType[ScalarType[\"FLOAT\"] = 2] = \"FLOAT\";\n    // Not ZigZag encoded.  Negative numbers take 10 bytes.  Use TYPE_SINT64 if\n    // negative values are likely.\n    ScalarType[ScalarType[\"INT64\"] = 3] = \"INT64\";\n    ScalarType[ScalarType[\"UINT64\"] = 4] = \"UINT64\";\n    // Not ZigZag encoded.  Negative numbers take 10 bytes.  Use TYPE_SINT32 if\n    // negative values are likely.\n    ScalarType[ScalarType[\"INT32\"] = 5] = \"INT32\";\n    ScalarType[ScalarType[\"FIXED64\"] = 6] = \"FIXED64\";\n    ScalarType[ScalarType[\"FIXED32\"] = 7] = \"FIXED32\";\n    ScalarType[ScalarType[\"BOOL\"] = 8] = \"BOOL\";\n    ScalarType[ScalarType[\"STRING\"] = 9] = \"STRING\";\n    // Tag-delimited aggregate.\n    // Group type is deprecated and not supported in proto3. However, Proto3\n    // implementations should still be able to parse the group wire format and\n    // treat group fields as unknown fields.\n    // TYPE_GROUP = 10,\n    // TYPE_MESSAGE = 11,  // Length-delimited aggregate.\n    // New in version 2.\n    ScalarType[ScalarType[\"BYTES\"] = 12] = \"BYTES\";\n    ScalarType[ScalarType[\"UINT32\"] = 13] = \"UINT32\";\n    // TYPE_ENUM = 14,\n    ScalarType[ScalarType[\"SFIXED32\"] = 15] = \"SFIXED32\";\n    ScalarType[ScalarType[\"SFIXED64\"] = 16] = \"SFIXED64\";\n    ScalarType[ScalarType[\"SINT32\"] = 17] = \"SINT32\";\n    ScalarType[ScalarType[\"SINT64\"] = 18] = \"SINT64\";\n})(ScalarType || (ScalarType = {}));\n/**\n * JavaScript representation of fields with 64 bit integral types (int64, uint64,\n * sint64, fixed64, sfixed64).\n *\n * This is a subset of google.protobuf.FieldOptions.JSType, which defines JS_NORMAL,\n * JS_STRING, and JS_NUMBER. Protobuf-ES uses BigInt by default, but will use\n * String if `[jstype = JS_STRING]` is specified.\n *\n * ```protobuf\n * uint64 field_a = 1; // BigInt\n * uint64 field_b = 2 [jstype = JS_NORMAL]; // BigInt\n * uint64 field_b = 2 [jstype = JS_NUMBER]; // BigInt\n * uint64 field_b = 2 [jstype = JS_STRING]; // String\n * ```\n */\nexport var LongType;\n(function (LongType) {\n    /**\n     * Use JavaScript BigInt.\n     */\n    LongType[LongType[\"BIGINT\"] = 0] = \"BIGINT\";\n    /**\n     * Use JavaScript String.\n     *\n     * Field option `[jstype = JS_STRING]`.\n     */\n    LongType[LongType[\"STRING\"] = 1] = \"STRING\";\n})(LongType || (LongType = {}));\n","// Copyright 2021-2024 Buf Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport { protoInt64 } from \"../proto-int64.js\";\nimport { LongType, ScalarType } from \"../scalar.js\";\n/**\n * Returns true if both scalar values are equal.\n */\nexport function scalarEquals(type, a, b) {\n    if (a === b) {\n        // This correctly matches equal values except BYTES and (possibly) 64-bit integers.\n        return true;\n    }\n    // Special case BYTES - we need to compare each byte individually\n    if (type == ScalarType.BYTES) {\n        if (!(a instanceof Uint8Array) || !(b instanceof Uint8Array)) {\n            return false;\n        }\n        if (a.length !== b.length) {\n            return false;\n        }\n        for (let i = 0; i \u003c a.length; i++) {\n            if (a[i] !== b[i]) {\n                return false;\n            }\n        }\n        return true;\n    }\n    // Special case 64-bit integers - we support number, string and bigint representation.\n    // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check\n    switch (type) {\n        case ScalarType.UINT64:\n        case ScalarType.FIXED64:\n        case ScalarType.INT64:\n        case ScalarType.SFIXED64:\n        case ScalarType.SINT64:\n            // Loose comparison will match between 0n, 0 and \"0\".\n            return a == b;\n    }\n    // Anything that hasn't been caught by strict comparison or special cased\n    // BYTES and 64-bit integers is not equal.\n    return false;\n}\n/**\n * Returns the zero value for the given scalar type.\n */\nexport function scalarZeroValue(type, longType) {\n    switch (type) {\n        case ScalarType.BOOL:\n            return false;\n        case ScalarType.UINT64:\n        case ScalarType.FIXED64:\n        case ScalarType.INT64:\n        case ScalarType.SFIXED64:\n        case ScalarType.SINT64:\n            // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison -- acceptable since it's covered by tests\n            return (longType == 0 ? protoInt64.zero : \"0\");\n        case ScalarType.DOUBLE:\n        case ScalarType.FLOAT:\n            return 0.0;\n        case ScalarType.BYTES:\n            return new Uint8Array(0);\n        case ScalarType.STRING:\n            return \"\";\n        default:\n            // Handles INT32, UINT32, SINT32, FIXED32, SFIXED32.\n            // We do not use individual cases to save a few bytes code size.\n            return 0;\n    }\n}\n/**\n * Returns true for a zero-value. For example, an integer has the zero-value `0`,\n * a boolean is `false`, a string is `\"\"`, and bytes is an empty Uint8Array.\n *\n * In proto3, zero-values are not written to the wire, unless the field is\n * optional or repeated.\n */\nexport function isScalarZeroValue(type, value) {\n    switch (type) {\n        case ScalarType.BOOL:\n            return value === false;\n        case ScalarType.STRING:\n            return value === \"\";\n        case ScalarType.BYTES:\n            return value instanceof Uint8Array \u0026\u0026 !value.byteLength;\n        default:\n            return value == 0; // Loose comparison matches 0n, 0 and \"0\"\n    }\n}\n","// Copyright 2021-2024 Buf Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport { varint32read, varint32write, varint64read, varint64write, } from \"./google/varint.js\";\nimport { assertFloat32, assertInt32, assertUInt32 } from \"./private/assert.js\";\nimport { protoInt64 } from \"./proto-int64.js\";\n/* eslint-disable prefer-const,no-case-declarations,@typescript-eslint/restrict-plus-operands */\n/**\n * Protobuf binary format wire types.\n *\n * A wire type provides just enough information to find the length of the\n * following value.\n *\n * See https://developers.google.com/protocol-buffers/docs/encoding#structure\n */\nexport var WireType;\n(function (WireType) {\n    /**\n     * Used for int32, int64, uint32, uint64, sint32, sint64, bool, enum\n     */\n    WireType[WireType[\"Varint\"] = 0] = \"Varint\";\n    /**\n     * Used for fixed64, sfixed64, double.\n     * Always 8 bytes with little-endian byte order.\n     */\n    WireType[WireType[\"Bit64\"] = 1] = \"Bit64\";\n    /**\n     * Used for string, bytes, embedded messages, packed repeated fields\n     *\n     * Only repeated numeric types (types which use the varint, 32-bit,\n     * or 64-bit wire types) can be packed. In proto3, such fields are\n     * packed by default.\n     */\n    WireType[WireType[\"LengthDelimited\"] = 2] = \"LengthDelimited\";\n    /**\n     * Start of a tag-delimited aggregate, such as a proto2 group, or a message\n     * in editions with message_encoding = DELIMITED.\n     */\n    WireType[WireType[\"StartGroup\"] = 3] = \"StartGroup\";\n    /**\n     * End of a tag-delimited aggregate.\n     */\n    WireType[WireType[\"EndGroup\"] = 4] = \"EndGroup\";\n    /**\n     * Used for fixed32, sfixed32, float.\n     * Always 4 bytes with little-endian byte order.\n     */\n    WireType[WireType[\"Bit32\"] = 5] = \"Bit32\";\n})(WireType || (WireType = {}));\nexport class BinaryWriter {\n    constructor(textEncoder) {\n        /**\n         * Previous fork states.\n         */\n        this.stack = [];\n        this.textEncoder = textEncoder !== null \u0026\u0026 textEncoder !== void 0 ? textEncoder : new TextEncoder();\n        this.chunks = [];\n        this.buf = [];\n    }\n    /**\n     * Return all bytes written and reset this writer.\n     */\n    finish() {\n        this.chunks.push(new Uint8Array(this.buf)); // flush the buffer\n        let len = 0;\n        for (let i = 0; i \u003c this.chunks.length; i++)\n            len += this.chunks[i].length;\n        let bytes = new Uint8Array(len);\n        let offset = 0;\n        for (let i = 0; i \u003c this.chunks.length; i++) {\n            bytes.set(this.chunks[i], offset);\n            offset += this.chunks[i].length;\n        }\n        this.chunks = [];\n        return bytes;\n    }\n    /**\n     * Start a new fork for length-delimited data like a message\n     * or a packed repeated field.\n     *\n     * Must be joined later with `join()`.\n     */\n    fork() {\n        this.stack.push({ chunks: this.chunks, buf: this.buf });\n        this.chunks = [];\n        this.buf = [];\n        return this;\n    }\n    /**\n     * Join the last fork. Write its length and bytes, then\n     * return to the previous state.\n     */\n    join() {\n        // get chunk of fork\n        let chunk = this.finish();\n        // restore previous state\n        let prev = this.stack.pop();\n        if (!prev)\n            throw new Error(\"invalid state, fork stack empty\");\n        this.chunks = prev.chunks;\n        this.buf = prev.buf;\n        // write length of chunk as varint\n        this.uint32(chunk.byteLength);\n        return this.raw(chunk);\n    }\n    /**\n     * Writes a tag (field number and wire type).\n     *\n     * Equivalent to `uint32( (fieldNo \u003c\u003c 3 | type) \u003e\u003e\u003e 0 )`.\n     *\n     * Generated code should compute the tag ahead of time and call `uint32()`.\n     */\n    tag(fieldNo, type) {\n        return this.uint32(((fieldNo \u003c\u003c 3) | type) \u003e\u003e\u003e 0);\n    }\n    /**\n     * Write a chunk of raw bytes.\n     */\n    raw(chunk) {\n        if (this.buf.length) {\n            this.chunks.push(new Uint8Array(this.buf));\n            this.buf = [];\n        }\n        this.chunks.push(chunk);\n        return this;\n    }\n    /**\n     * Write a `uint32` value, an unsigned 32 bit varint.\n     */\n    uint32(value) {\n        assertUInt32(value);\n        // write value as varint 32, inlined for speed\n        while (value \u003e 0x7f) {\n            this.buf.push((value \u0026 0x7f) | 0x80);\n            value = value \u003e\u003e\u003e 7;\n        }\n        this.buf.push(value);\n        return this;\n    }\n    /**\n     * Write a `int32` value, a signed 32 bit varint.\n     */\n    int32(value) {\n        assertInt32(value);\n        varint32write(value, this.buf);\n        return this;\n    }\n    /**\n     * Write a `bool` value, a variant.\n     */\n    bool(value) {\n        this.buf.push(value ? 1 : 0);\n        return this;\n    }\n    /**\n     * Write a `bytes` value, length-delimited arbitrary data.\n     */\n    bytes(value) {\n        this.uint32(value.byteLength); // write length of chunk as varint\n        return this.raw(value);\n    }\n    /**\n     * Write a `string` value, length-delimited data converted to UTF-8 text.\n     */\n    string(value) {\n        let chunk = this.textEncoder.encode(value);\n        this.uint32(chunk.byteLength); // write length of chunk as varint\n        return this.raw(chunk);\n    }\n    /**\n     * Write a `float` value, 32-bit floating point number.\n     */\n    float(value) {\n        assertFloat32(value);\n        let chunk = new Uint8Array(4);\n        new DataView(chunk.buffer).setFloat32(0, value, true);\n        return this.raw(chunk);\n    }\n    /**\n     * Write a `double` value, a 64-bit floating point number.\n     */\n    double(value) {\n        let chunk = new Uint8Array(8);\n        new DataView(chunk.buffer).setFloat64(0, value, true);\n        return this.raw(chunk);\n    }\n    /**\n     * Write a `fixed32` value, an unsigned, fixed-length 32-bit integer.\n     */\n    fixed32(value) {\n        assertUInt32(value);\n        let chunk = new Uint8Array(4);\n        new DataView(chunk.buffer).setUint32(0, value, true);\n        return this.raw(chunk);\n    }\n    /**\n     * Write a `sfixed32` value, a signed, fixed-length 32-bit integer.\n     */\n    sfixed32(value) {\n        assertInt32(value);\n        let chunk = new Uint8Array(4);\n        new DataView(chunk.buffer).setInt32(0, value, true);\n        return this.raw(chunk);\n    }\n    /**\n     * Write a `sint32` value, a signed, zigzag-encoded 32-bit varint.\n     */\n    sint32(value) {\n        assertInt32(value);\n        // zigzag encode\n        value = ((value \u003c\u003c 1) ^ (value \u003e\u003e 31)) \u003e\u003e\u003e 0;\n        varint32write(value, this.buf);\n        return this;\n    }\n    /**\n     * Write a `fixed64` value, a signed, fixed-length 64-bit integer.\n     */\n    sfixed64(value) {\n        let chunk = new Uint8Array(8), view = new DataView(chunk.buffer), tc = protoInt64.enc(value);\n        view.setInt32(0, tc.lo, true);\n        view.setInt32(4, tc.hi, true);\n        return this.raw(chunk);\n    }\n    /**\n     * Write a `fixed64` value, an unsigned, fixed-length 64 bit integer.\n     */\n    fixed64(value) {\n        let chunk = new Uint8Array(8), view = new DataView(chunk.buffer), tc = protoInt64.uEnc(value);\n        view.setInt32(0, tc.lo, true);\n        view.setInt32(4, tc.hi, true);\n        return this.raw(chunk);\n    }\n    /**\n     * Write a `int64` value, a signed 64-bit varint.\n     */\n    int64(value) {\n        let tc = protoInt64.enc(value);\n        varint64write(tc.lo, tc.hi, this.buf);\n        return this;\n    }\n    /**\n     * Write a `sint64` value, a signed, zig-zag-encoded 64-bit varint.\n     */\n    sint64(value) {\n        let tc = protoInt64.enc(value), \n        // zigzag encode\n        sign = tc.hi \u003e\u003e 31, lo = (tc.lo \u003c\u003c 1) ^ sign, hi = ((tc.hi \u003c\u003c 1) | (tc.lo \u003e\u003e\u003e 31)) ^ sign;\n        varint64write(lo, hi, this.buf);\n        return this;\n    }\n    /**\n     * Write a `uint64` value, an unsigned 64-bit varint.\n     */\n    uint64(value) {\n        let tc = protoInt64.uEnc(value);\n        varint64write(tc.lo, tc.hi, this.buf);\n        return this;\n    }\n}\nexport class BinaryReader {\n    constructor(buf, textDecoder) {\n        this.varint64 = varint64read; // dirty cast for `this`\n        /**\n         * Read a `uint32` field, an unsigned 32 bit varint.\n         */\n        this.uint32 = varint32read; // dirty cast for `this` and access to protected `buf`\n        this.buf = buf;\n        this.len = buf.length;\n        this.pos = 0;\n        this.view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength);\n        this.textDecoder = textDecoder !== null \u0026\u0026 textDecoder !== void 0 ? textDecoder : new TextDecoder();\n    }\n    /**\n     * Reads a tag - field number and wire type.\n     */\n    tag() {\n        let tag = this.uint32(), fieldNo = tag \u003e\u003e\u003e 3, wireType = tag \u0026 7;\n        if (fieldNo \u003c= 0 || wireType \u003c 0 || wireType \u003e 5)\n            throw new Error(\"illegal tag: field no \" + fieldNo + \" wire type \" + wireType);\n        return [fieldNo, wireType];\n    }\n    /**\n     * Skip one element and return the skipped data.\n     *\n     * When skipping StartGroup, provide the tags field number to check for\n     * matching field number in the EndGroup tag.\n     */\n    skip(wireType, fieldNo) {\n        let start = this.pos;\n        switch (wireType) {\n            case WireType.Varint:\n                while (this.buf[this.pos++] \u0026 0x80) {\n                    // ignore\n                }\n                break;\n            // eslint-disable-next-line\n            // @ts-ignore TS7029: Fallthrough case in switch\n            case WireType.Bit64:\n                this.pos += 4;\n            // eslint-disable-next-line\n            // @ts-ignore TS7029: Fallthrough case in switch\n            case WireType.Bit32:\n                this.pos += 4;\n                break;\n            case WireType.LengthDelimited:\n                let len = this.uint32();\n                this.pos += len;\n                break;\n            case WireType.StartGroup:\n                for (;;) {\n                    const [fn, wt] = this.tag();\n                    if (wt === WireType.EndGroup) {\n                        if (fieldNo !== undefined \u0026\u0026 fn !== fieldNo) {\n                            throw new Error(\"invalid end group tag\");\n                        }\n                        break;\n                    }\n                    this.skip(wt, fn);\n                }\n                break;\n            default:\n                throw new Error(\"cant skip wire type \" + wireType);\n        }\n        this.assertBounds();\n        return this.buf.subarray(start, this.pos);\n    }\n    /**\n     * Throws error if position in byte array is out of range.\n     */\n    assertBounds() {\n        if (this.pos \u003e this.len)\n            throw new RangeError(\"premature EOF\");\n    }\n    /**\n     * Read a `int32` field, a signed 32 bit varint.\n     */\n    int32() {\n        return this.uint32() | 0;\n    }\n    /**\n     * Read a `sint32` field, a signed, zigzag-encoded 32-bit varint.\n     */\n    sint32() {\n        let zze = this.uint32();\n        // decode zigzag\n        return (zze \u003e\u003e\u003e 1) ^ -(zze \u0026 1);\n    }\n    /**\n     * Read a `int64` field, a signed 64-bit varint.\n     */\n    int64() {\n        return protoInt64.dec(...this.varint64());\n    }\n    /**\n     * Read a `uint64` field, an unsigned 64-bit varint.\n     */\n    uint64() {\n        return protoInt64.uDec(...this.varint64());\n    }\n    /**\n     * Read a `sint64` field, a signed, zig-zag-encoded 64-bit varint.\n     */\n    sint64() {\n        let [lo, hi] = this.varint64();\n        // decode zig zag\n        let s = -(lo \u0026 1);\n        lo = ((lo \u003e\u003e\u003e 1) | ((hi \u0026 1) \u003c\u003c 31)) ^ s;\n        hi = (hi \u003e\u003e\u003e 1) ^ s;\n        return protoInt64.dec(lo, hi);\n    }\n    /**\n     * Read a `bool` field, a variant.\n     */\n    bool() {\n        let [lo, hi] = this.varint64();\n        return lo !== 0 || hi !== 0;\n    }\n    /**\n     * Read a `fixed32` field, an unsigned, fixed-length 32-bit integer.\n     */\n    fixed32() {\n        return this.view.getUint32((this.pos += 4) - 4, true);\n    }\n    /**\n     * Read a `sfixed32` field, a signed, fixed-length 32-bit integer.\n     */\n    sfixed32() {\n        return this.view.getInt32((this.pos += 4) - 4, true);\n    }\n    /**\n     * Read a `fixed64` field, an unsigned, fixed-length 64 bit integer.\n     */\n    fixed64() {\n        return protoInt64.uDec(this.sfixed32(), this.sfixed32());\n    }\n    /**\n     * Read a `fixed64` field, a signed, fixed-length 64-bit integer.\n     */\n    sfixed64() {\n        return protoInt64.dec(this.sfixed32(), this.sfixed32());\n    }\n    /**\n     * Read a `float` field, 32-bit floating point number.\n     */\n    float() {\n        return this.view.getFloat32((this.pos += 4) - 4, true);\n    }\n    /**\n     * Read a `double` field, a 64-bit floating point number.\n     */\n    double() {\n        return this.view.getFloat64((this.pos += 8) - 8, true);\n    }\n    /**\n     * Read a `bytes` field, length-delimited arbitrary data.\n     */\n    bytes() {\n        let len = this.uint32(), start = this.pos;\n        this.pos += len;\n        this.assertBounds();\n        return this.buf.subarray(start, start + len);\n    }\n    /**\n     * Read a `string` field, length-delimited data converted to UTF-8 text.\n     */\n    string() {\n        return this.textDecoder.decode(this.bytes());\n    }\n}\n","// Copyright 2021-2024 Buf Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport { scalarZeroValue } from \"./scalars.js\";\nimport { WireType } from \"../binary-encoding.js\";\n/**\n * Create a new extension using the given runtime.\n */\nexport function makeExtension(runtime, typeName, extendee, field) {\n    let fi;\n    return {\n        typeName,\n        extendee,\n        get field() {\n            if (!fi) {\n                const i = (typeof field == \"function\" ? field() : field);\n                i.name = typeName.split(\".\").pop();\n                i.jsonName = `[${typeName}]`;\n                fi = runtime.util.newFieldList([i]).list()[0];\n            }\n            return fi;\n        },\n        runtime,\n    };\n}\n/**\n * Create a container that allows us to read extension fields into it with the\n * same logic as regular fields.\n */\nexport function createExtensionContainer(extension) {\n    const localName = extension.field.localName;\n    const container = Object.create(null);\n    container[localName] = initExtensionField(extension);\n    return [container, () =\u003e container[localName]];\n}\nfunction initExtensionField(ext) {\n    const field = ext.field;\n    if (field.repeated) {\n        return [];\n    }\n    if (field.default !== undefined) {\n        return field.default;\n    }\n    switch (field.kind) {\n        case \"enum\":\n            return field.T.values[0].no;\n        case \"scalar\":\n            return scalarZeroValue(field.T, field.L);\n        case \"message\":\n            // eslint-disable-next-line no-case-declarations\n            const T = field.T, value = new T();\n            return T.fieldWrapper ? T.fieldWrapper.unwrapField(value) : value;\n        case \"map\":\n            throw \"map fields are not allowed to be extensions\";\n    }\n}\n/**\n * Helper to filter unknown fields, optimized based on field type.\n */\nexport function filterUnknownFields(unknownFields, field) {\n    if (!field.repeated \u0026\u0026 (field.kind == \"enum\" || field.kind == \"scalar\")) {\n        // singular scalar fields do not merge, we pick the last\n        for (let i = unknownFields.length - 1; i \u003e= 0; --i) {\n            if (unknownFields[i].no == field.no) {\n                return [unknownFields[i]];\n            }\n        }\n        return [];\n    }\n    return unknownFields.filter((uf) =\u003e uf.no === field.no);\n}\n","// Copyright 2021-2024 Buf Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n/* eslint-disable @typescript-eslint/ban-ts-comment, @typescript-eslint/no-unnecessary-condition, prefer-const */\n// lookup table from base64 character to byte\nlet encTable = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\".split(\"\");\n// lookup table from base64 character *code* to byte because lookup by number is fast\nlet decTable = [];\nfor (let i = 0; i \u003c encTable.length; i++)\n    decTable[encTable[i].charCodeAt(0)] = i;\n// support base64url variants\ndecTable[\"-\".charCodeAt(0)] = encTable.indexOf(\"+\");\ndecTable[\"_\".charCodeAt(0)] = encTable.indexOf(\"/\");\nexport const protoBase64 = {\n    /**\n     * Decodes a base64 string to a byte array.\n     *\n     * - ignores white-space, including line breaks and tabs\n     * - allows inner padding (can decode concatenated base64 strings)\n     * - does not require padding\n     * - understands base64url encoding:\n     *   \"-\" instead of \"+\",\n     *   \"_\" instead of \"/\",\n     *   no padding\n     */\n    dec(base64Str) {\n        // estimate byte size, not accounting for inner padding and whitespace\n        let es = (base64Str.length * 3) / 4;\n        if (base64Str[base64Str.length - 2] == \"=\")\n            es -= 2;\n        else if (base64Str[base64Str.length - 1] == \"=\")\n            es -= 1;\n        let bytes = new Uint8Array(es), bytePos = 0, // position in byte array\n        groupPos = 0, // position in base64 group\n        b, // current byte\n        p = 0; // previous byte\n        for (let i = 0; i \u003c base64Str.length; i++) {\n            b = decTable[base64Str.charCodeAt(i)];\n            if (b === undefined) {\n                switch (base64Str[i]) {\n                    // @ts-ignore TS7029: Fallthrough case in switch\n                    case \"=\":\n                        groupPos = 0; // reset state when padding found\n                    // @ts-ignore TS7029: Fallthrough case in switch\n                    case \"\\n\":\n                    case \"\\r\":\n                    case \"\\t\":\n                    case \" \":\n                        continue; // skip white-space, and padding\n                    default:\n                        throw Error(\"invalid base64 string.\");\n                }\n            }\n            switch (groupPos) {\n                case 0:\n                    p = b;\n                    groupPos = 1;\n                    break;\n                case 1:\n                    bytes[bytePos++] = (p \u003c\u003c 2) | ((b \u0026 48) \u003e\u003e 4);\n                    p = b;\n                    groupPos = 2;\n                    break;\n                case 2:\n                    bytes[bytePos++] = ((p \u0026 15) \u003c\u003c 4) | ((b \u0026 60) \u003e\u003e 2);\n                    p = b;\n                    groupPos = 3;\n                    break;\n                case 3:\n                    bytes[bytePos++] = ((p \u0026 3) \u003c\u003c 6) | b;\n                    groupPos = 0;\n                    break;\n            }\n        }\n        if (groupPos == 1)\n            throw Error(\"invalid base64 string.\");\n        return bytes.subarray(0, bytePos);\n    },\n    /**\n     * Encode a byte array to a base64 string.\n     */\n    enc(bytes) {\n        let base64 = \"\", groupPos = 0, // position in base64 group\n        b, // current byte\n        p = 0; // carry over from previous byte\n        for (let i = 0; i \u003c bytes.length; i++) {\n            b = bytes[i];\n            switch (groupPos) {\n                case 0:\n                    base64 += encTable[b \u003e\u003e 2];\n                    p = (b \u0026 3) \u003c\u003c 4;\n                    groupPos = 1;\n                    break;\n                case 1:\n                    base64 += encTable[p | (b \u003e\u003e 4)];\n                    p = (b \u0026 15) \u003c\u003c 2;\n                    groupPos = 2;\n                    break;\n                case 2:\n                    base64 += encTable[p | (b \u003e\u003e 6)];\n                    base64 += encTable[b \u0026 63];\n                    groupPos = 0;\n                    break;\n            }\n        }\n        // add output padding\n        if (groupPos) {\n            base64 += encTable[p];\n            base64 += \"=\";\n            if (groupPos == 1)\n                base64 += \"=\";\n        }\n        return base64;\n    },\n};\n","// Copyright 2021-2024 Buf Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport { assert } from \"./private/assert.js\";\nimport { createExtensionContainer, filterUnknownFields, } from \"./private/extensions.js\";\n/**\n * Retrieve an extension value from a message.\n *\n * The function never returns undefined. Use hasExtension() to check whether an\n * extension is set. If the extension is not set, this function returns the\n * default value (if one was specified in the protobuf source), or the zero value\n * (for example `0` for numeric types, `[]` for repeated extension fields, and\n * an empty message instance for message fields).\n *\n * Extensions are stored as unknown fields on a message. To mutate an extension\n * value, make sure to store the new value with setExtension() after mutating.\n *\n * If the extension does not extend the given message, an error is raised.\n */\nexport function getExtension(message, extension, options) {\n    assertExtendee(extension, message);\n    const opt = extension.runtime.bin.makeReadOptions(options);\n    const ufs = filterUnknownFields(message.getType().runtime.bin.listUnknownFields(message), extension.field);\n    const [container, get] = createExtensionContainer(extension);\n    for (const uf of ufs) {\n        extension.runtime.bin.readField(container, opt.readerFactory(uf.data), extension.field, uf.wireType, opt);\n    }\n    return get();\n}\n/**\n * Set an extension value on a message. If the message already has a value for\n * this extension, the value is replaced.\n *\n * If the extension does not extend the given message, an error is raised.\n */\nexport function setExtension(message, extension, value, options) {\n    assertExtendee(extension, message);\n    const readOpt = extension.runtime.bin.makeReadOptions(options);\n    const writeOpt = extension.runtime.bin.makeWriteOptions(options);\n    if (hasExtension(message, extension)) {\n        const ufs = message\n            .getType()\n            .runtime.bin.listUnknownFields(message)\n            .filter((uf) =\u003e uf.no != extension.field.no);\n        message.getType().runtime.bin.discardUnknownFields(message);\n        for (const uf of ufs) {\n            message\n                .getType()\n                .runtime.bin.onUnknownField(message, uf.no, uf.wireType, uf.data);\n        }\n    }\n    const writer = writeOpt.writerFactory();\n    let f = extension.field;\n    // Implicit presence does not apply to extensions, see https://github.com/protocolbuffers/protobuf/issues/8234\n    // We patch the field info to use explicit presence:\n    if (!f.opt \u0026\u0026 !f.repeated \u0026\u0026 (f.kind == \"enum\" || f.kind == \"scalar\")) {\n        f = Object.assign(Object.assign({}, extension.field), { opt: true });\n    }\n    extension.runtime.bin.writeField(f, value, writer, writeOpt);\n    const reader = readOpt.readerFactory(writer.finish());\n    while (reader.pos \u003c reader.len) {\n        const [no, wireType] = reader.tag();\n        const data = reader.skip(wireType, no);\n        message.getType().runtime.bin.onUnknownField(message, no, wireType, data);\n    }\n}\n/**\n * Remove an extension value from a message.\n *\n * If the extension does not extend the given message, an error is raised.\n */\nexport function clearExtension(message, extension) {\n    assertExtendee(extension, message);\n    if (hasExtension(message, extension)) {\n        const bin = message.getType().runtime.bin;\n        const ufs = bin\n            .listUnknownFields(message)\n            .filter((uf) =\u003e uf.no != extension.field.no);\n        bin.discardUnknownFields(message);\n        for (const uf of ufs) {\n            bin.onUnknownField(message, uf.no, uf.wireType, uf.data);\n        }\n    }\n}\n/**\n * Check whether an extension is set on a message.\n */\nexport function hasExtension(message, extension) {\n    const messageType = message.getType();\n    return (extension.extendee.typeName === messageType.typeName \u0026\u0026\n        !!messageType.runtime.bin\n            .listUnknownFields(message)\n            .find((uf) =\u003e uf.no == extension.field.no));\n}\nfunction assertExtendee(extension, message) {\n    assert(extension.extendee.typeName == message.getType().typeName, `extension ${extension.typeName} can only be applied to message ${extension.extendee.typeName}`);\n}\n","// Copyright 2021-2024 Buf Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport { isScalarZeroValue, scalarZeroValue } from \"./scalars.js\";\n/**\n * Returns true if the field is set.\n */\nexport function isFieldSet(field, target) {\n    const localName = field.localName;\n    if (field.repeated) {\n        return target[localName].length \u003e 0;\n    }\n    if (field.oneof) {\n        return target[field.oneof.localName].case === localName; // eslint-disable-line @typescript-eslint/no-unsafe-member-access\n    }\n    switch (field.kind) {\n        case \"enum\":\n        case \"scalar\":\n            if (field.opt || field.req) {\n                // explicit presence\n                return target[localName] !== undefined;\n            }\n            // implicit presence\n            if (field.kind == \"enum\") {\n                return target[localName] !== field.T.values[0].no;\n            }\n            return !isScalarZeroValue(field.T, target[localName]);\n        case \"message\":\n            return target[localName] !== undefined;\n        case \"map\":\n            return Object.keys(target[localName]).length \u003e 0; // eslint-disable-line @typescript-eslint/no-unsafe-argument\n    }\n}\n/**\n * Resets the field, so that isFieldSet() will return false.\n */\nexport function clearField(field, target) {\n    const localName = field.localName;\n    const implicitPresence = !field.opt \u0026\u0026 !field.req;\n    if (field.repeated) {\n        target[localName] = [];\n    }\n    else if (field.oneof) {\n        target[field.oneof.localName] = { case: undefined };\n    }\n    else {\n        switch (field.kind) {\n            case \"map\":\n                target[localName] = {};\n                break;\n            case \"enum\":\n                target[localName] = implicitPresence ? field.T.values[0].no : undefined;\n                break;\n            case \"scalar\":\n                target[localName] = implicitPresence\n                    ? scalarZeroValue(field.T, field.L)\n                    : undefined;\n                break;\n            case \"message\":\n                target[localName] = undefined;\n                break;\n        }\n    }\n}\n","// Copyright 2021-2024 Buf Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport { Message } from \"./message.js\";\n/**\n * Check whether the given object is any subtype of Message or is a specific\n * Message by passing the type.\n *\n * Just like `instanceof`, `isMessage` narrows the type. The advantage of\n * `isMessage` is that it compares identity by the message type name, not by\n * class identity. This makes it robust against the dual package hazard and\n * similar situations, where the same message is duplicated.\n *\n * This function is _mostly_ equivalent to the `instanceof` operator. For\n * example, `isMessage(foo, MyMessage)` is the same as `foo instanceof MyMessage`,\n * and `isMessage(foo)` is the same as `foo instanceof Message`. In most cases,\n * `isMessage` should be preferred over `instanceof`.\n *\n * However, due to the fact that `isMessage` does not use class identity, there\n * are subtle differences between this function and `instanceof`. Notably,\n * calling `isMessage` on an explicit type of Message will return false.\n */\nexport function isMessage(arg, type) {\n    if (arg === null || typeof arg != \"object\") {\n        return false;\n    }\n    if (!Object.getOwnPropertyNames(Message.prototype).every((m) =\u003e m in arg \u0026\u0026 typeof arg[m] == \"function\")) {\n        return false;\n    }\n    const actualType = arg.getType();\n    if (actualType === null ||\n        typeof actualType != \"function\" ||\n        !(\"typeName\" in actualType) ||\n        typeof actualType.typeName != \"string\") {\n        return false;\n    }\n    return type === undefined ? true : actualType.typeName == type.typeName;\n}\n","// Copyright 2021-2024 Buf Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport { Message } from \"../message.js\";\nimport { ScalarType } from \"../scalar.js\";\nimport { isMessage } from \"../is-message.js\";\n/**\n * Wrap a primitive message field value in its corresponding wrapper\n * message. This function is idempotent.\n */\nexport function wrapField(type, value) {\n    if (isMessage(value) || !type.fieldWrapper) {\n        return value;\n    }\n    return type.fieldWrapper.wrapField(value);\n}\n/**\n * If the given field uses one of the well-known wrapper types, return\n * the primitive type it wraps.\n */\nexport function getUnwrappedFieldType(field) {\n    if (field.fieldKind !== \"message\") {\n        return undefined;\n    }\n    if (field.repeated) {\n        return undefined;\n    }\n    if (field.oneof != undefined) {\n        return undefined;\n    }\n    return wktWrapperToScalarType[field.message.typeName];\n}\nconst wktWrapperToScalarType = {\n    \"google.protobuf.DoubleValue\": ScalarType.DOUBLE,\n    \"google.protobuf.FloatValue\": ScalarType.FLOAT,\n    \"google.protobuf.Int64Value\": ScalarType.INT64,\n    \"google.protobuf.UInt64Value\": ScalarType.UINT64,\n    \"google.protobuf.Int32Value\": ScalarType.INT32,\n    \"google.protobuf.UInt32Value\": ScalarType.UINT32,\n    \"google.protobuf.BoolValue\": ScalarType.BOOL,\n    \"google.protobuf.StringValue\": ScalarType.STRING,\n    \"google.protobuf.BytesValue\": ScalarType.BYTES,\n};\n","// Copyright 2021-2024 Buf Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport { Message } from \"../message.js\";\nimport { assert, assertFloat32, assertInt32, assertUInt32 } from \"./assert.js\";\nimport { protoInt64 } from \"../proto-int64.js\";\nimport { protoBase64 } from \"../proto-base64.js\";\nimport { createExtensionContainer } from \"./extensions.js\";\nimport { getExtension, hasExtension, setExtension, } from \"../extension-accessor.js\";\nimport { clearField, isFieldSet } from \"./reflect.js\";\nimport { wrapField } from \"./field-wrapper.js\";\nimport { scalarZeroValue } from \"./scalars.js\";\nimport { isScalarZeroValue } from \"./scalars.js\";\nimport { LongType, ScalarType } from \"../scalar.js\";\nimport { isMessage } from \"../is-message.js\";\n/* eslint-disable no-case-declarations,@typescript-eslint/no-unsafe-argument,@typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-call */\n// Default options for parsing JSON.\nconst jsonReadDefaults = {\n    ignoreUnknownFields: false,\n};\n// Default options for serializing to JSON.\nconst jsonWriteDefaults = {\n    emitDefaultValues: false,\n    enumAsInteger: false,\n    useProtoFieldName: false,\n    prettySpaces: 0,\n};\nfunction makeReadOptions(options) {\n    return options ? Object.assign(Object.assign({}, jsonReadDefaults), options) : jsonReadDefaults;\n}\nfunction makeWriteOptions(options) {\n    return options ? Object.assign(Object.assign({}, jsonWriteDefaults), options) : jsonWriteDefaults;\n}\nconst tokenNull = Symbol();\nconst tokenIgnoredUnknownEnum = Symbol();\nexport function makeJsonFormat() {\n    return {\n        makeReadOptions,\n        makeWriteOptions,\n        readMessage(type, json, options, message) {\n            if (json == null || Array.isArray(json) || typeof json != \"object\") {\n                throw new Error(`cannot decode message ${type.typeName} from JSON: ${debugJsonValue(json)}`);\n            }\n            message = message !== null \u0026\u0026 message !== void 0 ? message : new type();\n            const oneofSeen = new Map();\n            const registry = options.typeRegistry;\n            for (const [jsonKey, jsonValue] of Object.entries(json)) {\n                const field = type.fields.findJsonName(jsonKey);\n                if (field) {\n                    if (field.oneof) {\n                        if (jsonValue === null \u0026\u0026 field.kind == \"scalar\") {\n                            // see conformance test Required.Proto3.JsonInput.OneofFieldNull{First,Second}\n                            continue;\n                        }\n                        const seen = oneofSeen.get(field.oneof);\n                        if (seen !== undefined) {\n                            throw new Error(`cannot decode message ${type.typeName} from JSON: multiple keys for oneof \"${field.oneof.name}\" present: \"${seen}\", \"${jsonKey}\"`);\n                        }\n                        oneofSeen.set(field.oneof, jsonKey);\n                    }\n                    readField(message, jsonValue, field, options, type);\n                }\n                else {\n                    let found = false;\n                    if ((registry === null || registry === void 0 ? void 0 : registry.findExtension) \u0026\u0026\n                        jsonKey.startsWith(\"[\") \u0026\u0026\n                        jsonKey.endsWith(\"]\")) {\n                        const ext = registry.findExtension(jsonKey.substring(1, jsonKey.length - 1));\n                        if (ext \u0026\u0026 ext.extendee.typeName == type.typeName) {\n                            found = true;\n                            const [container, get] = createExtensionContainer(ext);\n                            readField(container, jsonValue, ext.field, options, ext);\n                            // We pass on the options as BinaryReadOptions/BinaryWriteOptions,\n                            // so that users can bring their own binary reader and writer factories\n                            // if necessary.\n                            setExtension(message, ext, get(), options);\n                        }\n                    }\n                    if (!found \u0026\u0026 !options.ignoreUnknownFields) {\n                        throw new Error(`cannot decode message ${type.typeName} from JSON: key \"${jsonKey}\" is unknown`);\n                    }\n                }\n            }\n            return message;\n        },\n        writeMessage(message, options) {\n            const type = message.getType();\n            const json = {};\n            let field;\n            try {\n                for (field of type.fields.byNumber()) {\n                    if (!isFieldSet(field, message)) {\n                        // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n                        if (field.req) {\n                            throw `required field not set`;\n                        }\n                        if (!options.emitDefaultValues) {\n                            continue;\n                        }\n                        if (!canEmitFieldDefaultValue(field)) {\n                            continue;\n                        }\n                    }\n                    const value = field.oneof\n                        ? message[field.oneof.localName].value\n                        : message[field.localName];\n                    const jsonValue = writeField(field, value, options);\n                    if (jsonValue !== undefined) {\n                        json[options.useProtoFieldName ? field.name : field.jsonName] =\n                            jsonValue;\n                    }\n                }\n                const registry = options.typeRegistry;\n                if (registry === null || registry === void 0 ? void 0 : registry.findExtensionFor) {\n                    for (const uf of type.runtime.bin.listUnknownFields(message)) {\n                        const ext = registry.findExtensionFor(type.typeName, uf.no);\n                        if (ext \u0026\u0026 hasExtension(message, ext)) {\n                            // We pass on the options as BinaryReadOptions, so that users can bring their own\n                            // binary reader factory if necessary.\n                            const value = getExtension(message, ext, options);\n                            const jsonValue = writeField(ext.field, value, options);\n                            if (jsonValue !== undefined) {\n                                json[ext.field.jsonName] = jsonValue;\n                            }\n                        }\n                    }\n                }\n            }\n            catch (e) {\n                const m = field\n                    ? `cannot encode field ${type.typeName}.${field.name} to JSON`\n                    : `cannot encode message ${type.typeName} to JSON`;\n                const r = e instanceof Error ? e.message : String(e);\n                throw new Error(m + (r.length \u003e 0 ? `: ${r}` : \"\"));\n            }\n            return json;\n        },\n        readScalar(type, json, longType) {\n            // The signature of our internal function has changed. For backwards-\n            // compatibility, we support the old form that is part of the public API\n            // through the interface JsonFormat.\n            return readScalar(type, json, longType !== null \u0026\u0026 longType !== void 0 ? longType : LongType.BIGINT, true);\n        },\n        writeScalar(type, value, emitDefaultValues) {\n            // The signature of our internal function has changed. For backwards-\n            // compatibility, we support the old form that is part of the public API\n            // through the interface JsonFormat.\n            if (value === undefined) {\n                return undefined;\n            }\n            if (emitDefaultValues || isScalarZeroValue(type, value)) {\n                return writeScalar(type, value);\n            }\n            return undefined;\n        },\n        debug: debugJsonValue,\n    };\n}\nfunction debugJsonValue(json) {\n    if (json === null) {\n        return \"null\";\n    }\n    switch (typeof json) {\n        case \"object\":\n            return Array.isArray(json) ? \"array\" : \"object\";\n        case \"string\":\n            return json.length \u003e 100 ? \"string\" : `\"${json.split('\"').join('\\\\\"')}\"`;\n        default:\n            return String(json);\n    }\n}\n// Read a JSON value for a field.\n// The \"parentType\" argument is only used to provide context in errors.\nfunction readField(target, jsonValue, field, options, parentType) {\n    let localName = field.localName;\n    if (field.repeated) {\n        assert(field.kind != \"map\");\n        if (jsonValue === null) {\n            return;\n        }\n        if (!Array.isArray(jsonValue)) {\n            throw new Error(`cannot decode field ${parentType.typeName}.${field.name} from JSON: ${debugJsonValue(jsonValue)}`);\n        }\n        const targetArray = target[localName];\n        for (const jsonItem of jsonValue) {\n            if (jsonItem === null) {\n                throw new Error(`cannot decode field ${parentType.typeName}.${field.name} from JSON: ${debugJsonValue(jsonItem)}`);\n            }\n            switch (field.kind) {\n                case \"message\":\n                    targetArray.push(field.T.fromJson(jsonItem, options));\n                    break;\n                case \"enum\":\n                    const enumValue = readEnum(field.T, jsonItem, options.ignoreUnknownFields, true);\n                    if (enumValue !== tokenIgnoredUnknownEnum) {\n                        targetArray.push(enumValue);\n                    }\n                    break;\n                case \"scalar\":\n                    try {\n                        targetArray.push(readScalar(field.T, jsonItem, field.L, true));\n                    }\n                    catch (e) {\n                        let m = `cannot decode field ${parentType.typeName}.${field.name} from JSON: ${debugJsonValue(jsonItem)}`;\n                        if (e instanceof Error \u0026\u0026 e.message.length \u003e 0) {\n                            m += `: ${e.message}`;\n                        }\n                        throw new Error(m);\n                    }\n                    break;\n            }\n        }\n    }\n    else if (field.kind == \"map\") {\n        if (jsonValue === null) {\n            return;\n        }\n        if (typeof jsonValue != \"object\" || Array.isArray(jsonValue)) {\n            throw new Error(`cannot decode field ${parentType.typeName}.${field.name} from JSON: ${debugJsonValue(jsonValue)}`);\n        }\n        const targetMap = target[localName];\n        for (const [jsonMapKey, jsonMapValue] of Object.entries(jsonValue)) {\n            if (jsonMapValue === null) {\n                throw new Error(`cannot decode field ${parentType.typeName}.${field.name} from JSON: map value null`);\n            }\n            let key;\n            try {\n                key = readMapKey(field.K, jsonMapKey);\n            }\n            catch (e) {\n                let m = `cannot decode map key for field ${parentType.typeName}.${field.name} from JSON: ${debugJsonValue(jsonValue)}`;\n                if (e instanceof Error \u0026\u0026 e.message.length \u003e 0) {\n                    m += `: ${e.message}`;\n                }\n                throw new Error(m);\n            }\n            switch (field.V.kind) {\n                case \"message\":\n                    targetMap[key] = field.V.T.fromJson(jsonMapValue, options);\n                    break;\n                case \"enum\":\n                    const enumValue = readEnum(field.V.T, jsonMapValue, options.ignoreUnknownFields, true);\n                    if (enumValue !== tokenIgnoredUnknownEnum) {\n                        targetMap[key] = enumValue;\n                    }\n                    break;\n                case \"scalar\":\n                    try {\n                        targetMap[key] = readScalar(field.V.T, jsonMapValue, LongType.BIGINT, true);\n                    }\n                    catch (e) {\n                        let m = `cannot decode map value for field ${parentType.typeName}.${field.name} from JSON: ${debugJsonValue(jsonValue)}`;\n                        if (e instanceof Error \u0026\u0026 e.message.length \u003e 0) {\n                            m += `: ${e.message}`;\n                        }\n                        throw new Error(m);\n                    }\n                    break;\n            }\n        }\n    }\n    else {\n        if (field.oneof) {\n            target = target[field.oneof.localName] = { case: localName };\n            localName = \"value\";\n        }\n        switch (field.kind) {\n            case \"message\":\n                const messageType = field.T;\n                if (jsonValue === null \u0026\u0026\n                    messageType.typeName != \"google.protobuf.Value\") {\n                    return;\n                }\n                let currentValue = target[localName];\n                if (isMessage(currentValue)) {\n                    currentValue.fromJson(jsonValue, options);\n                }\n                else {\n                    target[localName] = currentValue = messageType.fromJson(jsonValue, options);\n                    if (messageType.fieldWrapper \u0026\u0026 !field.oneof) {\n                        target[localName] =\n                            messageType.fieldWrapper.unwrapField(currentValue);\n                    }\n                }\n                break;\n            case \"enum\":\n                const enumValue = readEnum(field.T, jsonValue, options.ignoreUnknownFields, false);\n                switch (enumValue) {\n                    case tokenNull:\n                        clearField(field, target);\n                        break;\n                    case tokenIgnoredUnknownEnum:\n                        break;\n                    default:\n                        target[localName] = enumValue;\n                        break;\n                }\n                break;\n            case \"scalar\":\n                try {\n                    const scalarValue = readScalar(field.T, jsonValue, field.L, false);\n                    switch (scalarValue) {\n                        case tokenNull:\n                            clearField(field, target);\n                            break;\n                        default:\n                            target[localName] = scalarValue;\n                            break;\n                    }\n                }\n                catch (e) {\n                    let m = `cannot decode field ${parentType.typeName}.${field.name} from JSON: ${debugJsonValue(jsonValue)}`;\n                    if (e instanceof Error \u0026\u0026 e.message.length \u003e 0) {\n                        m += `: ${e.message}`;\n                    }\n                    throw new Error(m);\n                }\n                break;\n        }\n    }\n}\nfunction readMapKey(type, json) {\n    if (type === ScalarType.BOOL) {\n        // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check\n        switch (json) {\n            case \"true\":\n                json = true;\n                break;\n            case \"false\":\n                json = false;\n                break;\n        }\n    }\n    return readScalar(type, json, LongType.BIGINT, true).toString();\n}\nfunction readScalar(type, json, longType, nullAsZeroValue) {\n    if (json === null) {\n        if (nullAsZeroValue) {\n            return scalarZeroValue(type, longType);\n        }\n        return tokenNull;\n    }\n    // every valid case in the switch below returns, and every fall\n    // through is regarded as a failure.\n    switch (type) {\n        // float, double: JSON value will be a number or one of the special string values \"NaN\", \"Infinity\", and \"-Infinity\".\n        // Either numbers or strings are accepted. Exponent notation is also accepted.\n        case ScalarType.DOUBLE:\n        case ScalarType.FLOAT:\n            if (json === \"NaN\")\n                return Number.NaN;\n            if (json === \"Infinity\")\n                return Number.POSITIVE_INFINITY;\n            if (json === \"-Infinity\")\n                return Number.NEGATIVE_INFINITY;\n            if (json === \"\") {\n                // empty string is not a number\n                break;\n            }\n            if (typeof json == \"string\" \u0026\u0026 json.trim().length !== json.length) {\n                // extra whitespace\n                break;\n            }\n            if (typeof json != \"string\" \u0026\u0026 typeof json != \"number\") {\n                break;\n            }\n            const float = Number(json);\n            if (Number.isNaN(float)) {\n                // not a number\n                break;\n            }\n            if (!Number.isFinite(float)) {\n                // infinity and -infinity are handled by string representation above, so this is an error\n                break;\n            }\n            if (type == ScalarType.FLOAT)\n                assertFloat32(float);\n            return float;\n        // int32, fixed32, uint32: JSON value will be a decimal number. Either numbers or strings are accepted.\n        case ScalarType.INT32:\n        case ScalarType.FIXED32:\n        case ScalarType.SFIXED32:\n        case ScalarType.SINT32:\n        case ScalarType.UINT32:\n            let int32;\n            if (typeof json == \"number\")\n                int32 = json;\n            else if (typeof json == \"string\" \u0026\u0026 json.length \u003e 0) {\n                if (json.trim().length === json.length)\n                    int32 = Number(json);\n            }\n            if (int32 === undefined)\n                break;\n            if (type == ScalarType.UINT32 || type == ScalarType.FIXED32)\n                assertUInt32(int32);\n            else\n                assertInt32(int32);\n            return int32;\n        // int64, fixed64, uint64: JSON value will be a decimal string. Either numbers or strings are accepted.\n        case ScalarType.INT64:\n        case ScalarType.SFIXED64:\n        case ScalarType.SINT64:\n            if (typeof json != \"number\" \u0026\u0026 typeof json != \"string\")\n                break;\n            const long = protoInt64.parse(json);\n            // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n            return longType ? long.toString() : long;\n        case ScalarType.FIXED64:\n        case ScalarType.UINT64:\n            if (typeof json != \"number\" \u0026\u0026 typeof json != \"string\")\n                break;\n            const uLong = protoInt64.uParse(json);\n            // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n            return longType ? uLong.toString() : uLong;\n        // bool:\n        case ScalarType.BOOL:\n            if (typeof json !== \"boolean\")\n                break;\n            return json;\n        // string:\n        case ScalarType.STRING:\n            if (typeof json !== \"string\") {\n                break;\n            }\n            // A string must always contain UTF-8 encoded or 7-bit ASCII.\n            // We validate with encodeURIComponent, which appears to be the fastest widely available option.\n            try {\n                encodeURIComponent(json);\n            }\n            catch (e) {\n                throw new Error(\"invalid UTF8\");\n            }\n            return json;\n        // bytes: JSON value will be the data encoded as a string using standard base64 encoding with paddings.\n        // Either standard or URL-safe base64 encoding with/without paddings are accepted.\n        case ScalarType.BYTES:\n            if (json === \"\")\n                return new Uint8Array(0);\n            if (typeof json !== \"string\")\n                break;\n            return protoBase64.dec(json);\n    }\n    throw new Error();\n}\nfunction readEnum(type, json, ignoreUnknownFields, nullAsZeroValue) {\n    if (json === null) {\n        if (type.typeName == \"google.protobuf.NullValue\") {\n            return 0; // google.protobuf.NullValue.NULL_VALUE = 0\n        }\n        return nullAsZeroValue ? type.values[0].no : tokenNull;\n    }\n    // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check\n    switch (typeof json) {\n        case \"number\":\n            if (Number.isInteger(json)) {\n                return json;\n            }\n            break;\n        case \"string\":\n            const value = type.findName(json);\n            if (value !== undefined) {\n                return value.no;\n            }\n            if (ignoreUnknownFields) {\n                return tokenIgnoredUnknownEnum;\n            }\n            break;\n    }\n    throw new Error(`cannot decode enum ${type.typeName} from JSON: ${debugJsonValue(json)}`);\n}\n// Decide whether an unset field should be emitted with JSON write option `emitDefaultValues`\nfunction canEmitFieldDefaultValue(field) {\n    if (field.repeated || field.kind == \"map\") {\n        // maps are {}, repeated fields are []\n        return true;\n    }\n    if (field.oneof) {\n        // oneof fields are never emitted\n        return false;\n    }\n    if (field.kind == \"message\") {\n        // singular message field are allowed to emit JSON null, but we do not\n        return false;\n    }\n    // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n    if (field.opt || field.req) {\n        // the field uses explicit presence, so we cannot emit a zero value\n        return false;\n    }\n    return true;\n}\nfunction writeField(field, value, options) {\n    if (field.kind == \"map\") {\n        assert(typeof value == \"object\" \u0026\u0026 value != null);\n        const jsonObj = {};\n        const entries = Object.entries(value);\n        switch (field.V.kind) {\n            case \"scalar\":\n                for (const [entryKey, entryValue] of entries) {\n                    jsonObj[entryKey.toString()] = writeScalar(field.V.T, entryValue); // JSON standard allows only (double quoted) string as property key\n                }\n                break;\n            case \"message\":\n                for (const [entryKey, entryValue] of entries) {\n                    // JSON standard allows only (double quoted) string as property key\n                    jsonObj[entryKey.toString()] = entryValue.toJson(options);\n                }\n                break;\n            case \"enum\":\n                const enumType = field.V.T;\n                for (const [entryKey, entryValue] of entries) {\n                    // JSON standard allows only (double quoted) string as property key\n                    jsonObj[entryKey.toString()] = writeEnum(enumType, entryValue, options.enumAsInteger);\n                }\n                break;\n        }\n        return options.emitDefaultValues || entries.length \u003e 0\n            ? jsonObj\n            : undefined;\n    }\n    if (field.repeated) {\n        assert(Array.isArray(value));\n        const jsonArr = [];\n        switch (field.kind) {\n            case \"scalar\":\n                for (let i = 0; i \u003c value.length; i++) {\n                    jsonArr.push(writeScalar(field.T, value[i]));\n                }\n                break;\n            case \"enum\":\n                for (let i = 0; i \u003c value.length; i++) {\n                    jsonArr.push(writeEnum(field.T, value[i], options.enumAsInteger));\n                }\n                break;\n            case \"message\":\n                for (let i = 0; i \u003c value.length; i++) {\n                    jsonArr.push(value[i].toJson(options));\n                }\n                break;\n        }\n        return options.emitDefaultValues || jsonArr.length \u003e 0\n            ? jsonArr\n            : undefined;\n    }\n    switch (field.kind) {\n        case \"scalar\":\n            return writeScalar(field.T, value);\n        case \"enum\":\n            return writeEnum(field.T, value, options.enumAsInteger);\n        case \"message\":\n            return wrapField(field.T, value).toJson(options);\n    }\n}\nfunction writeEnum(type, value, enumAsInteger) {\n    var _a;\n    assert(typeof value == \"number\");\n    if (type.typeName == \"google.protobuf.NullValue\") {\n        return null;\n    }\n    if (enumAsInteger) {\n        return value;\n    }\n    const val = type.findNumber(value);\n    return (_a = val === null || val === void 0 ? void 0 : val.name) !== null \u0026\u0026 _a !== void 0 ? _a : value; // if we don't know the enum value, just return the number\n}\nfunction writeScalar(type, value) {\n    switch (type) {\n        // int32, fixed32, uint32: JSON value will be a decimal number. Either numbers or strings are accepted.\n        case ScalarType.INT32:\n        case ScalarType.SFIXED32:\n        case ScalarType.SINT32:\n        case ScalarType.FIXED32:\n        case ScalarType.UINT32:\n            assert(typeof value == \"number\");\n            return value;\n        // float, double: JSON value will be a number or one of the special string values \"NaN\", \"Infinity\", and \"-Infinity\".\n        // Either numbers or strings are accepted. Exponent notation is also accepted.\n        case ScalarType.FLOAT:\n        // assertFloat32(value);\n        case ScalarType.DOUBLE: // eslint-disable-line no-fallthrough\n            assert(typeof value == \"number\");\n            if (Number.isNaN(value))\n                return \"NaN\";\n            if (value === Number.POSITIVE_INFINITY)\n                return \"Infinity\";\n            if (value === Number.NEGATIVE_INFINITY)\n                return \"-Infinity\";\n            return value;\n        // string:\n        case ScalarType.STRING:\n            assert(typeof value == \"string\");\n            return value;\n        // bool:\n        case ScalarType.BOOL:\n            assert(typeof value == \"boolean\");\n            return value;\n        // JSON value will be a decimal string. Either numbers or strings are accepted.\n        case ScalarType.UINT64:\n        case ScalarType.FIXED64:\n        case ScalarType.INT64:\n        case ScalarType.SFIXED64:\n        case ScalarType.SINT64:\n            assert(typeof value == \"bigint\" ||\n                typeof value == \"string\" ||\n                typeof value == \"number\");\n            return value.toString();\n        // bytes: JSON value will be the data encoded as a string using standard base64 encoding with paddings.\n        // Either standard or URL-safe base64 encoding with/without paddings are accepted.\n        case ScalarType.BYTES:\n            assert(value instanceof Uint8Array);\n            return protoBase64.enc(value);\n    }\n}\n","// Copyright 2021-2024 Buf Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport { BinaryReader, BinaryWriter, WireType } from \"../binary-encoding.js\";\nimport { Message } from \"../message.js\";\nimport { wrapField } from \"./field-wrapper.js\";\nimport { scalarZeroValue } from \"./scalars.js\";\nimport { assert } from \"./assert.js\";\nimport { isFieldSet } from \"./reflect.js\";\nimport { LongType, ScalarType } from \"../scalar.js\";\nimport { isMessage } from \"../is-message.js\";\n/* eslint-disable prefer-const,no-case-declarations,@typescript-eslint/no-explicit-any,@typescript-eslint/no-unsafe-argument,@typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-return */\nconst unknownFieldsSymbol = Symbol(\"@bufbuild/protobuf/unknown-fields\");\n// Default options for parsing binary data.\nconst readDefaults = {\n    readUnknownFields: true,\n    readerFactory: (bytes) =\u003e new BinaryReader(bytes),\n};\n// Default options for serializing binary data.\nconst writeDefaults = {\n    writeUnknownFields: true,\n    writerFactory: () =\u003e new BinaryWriter(),\n};\nfunction makeReadOptions(options) {\n    return options ? Object.assign(Object.assign({}, readDefaults), options) : readDefaults;\n}\nfunction makeWriteOptions(options) {\n    return options ? Object.assign(Object.assign({}, writeDefaults), options) : writeDefaults;\n}\nexport function makeBinaryFormat() {\n    return {\n        makeReadOptions,\n        makeWriteOptions,\n        listUnknownFields(message) {\n            var _a;\n            return (_a = message[unknownFieldsSymbol]) !== null \u0026\u0026 _a !== void 0 ? _a : [];\n        },\n        discardUnknownFields(message) {\n            delete message[unknownFieldsSymbol];\n        },\n        writeUnknownFields(message, writer) {\n            const m = message;\n            const c = m[unknownFieldsSymbol];\n            if (c) {\n                for (const f of c) {\n                    writer.tag(f.no, f.wireType).raw(f.data);\n                }\n            }\n        },\n        onUnknownField(message, no, wireType, data) {\n            const m = message;\n            if (!Array.isArray(m[unknownFieldsSymbol])) {\n                m[unknownFieldsSymbol] = [];\n            }\n            m[unknownFieldsSymbol].push({ no, wireType, data });\n        },\n        readMessage(message, reader, lengthOrEndTagFieldNo, options, delimitedMessageEncoding) {\n            const type = message.getType();\n            // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n            const end = delimitedMessageEncoding\n                ? reader.len\n                : reader.pos + lengthOrEndTagFieldNo;\n            let fieldNo, wireType;\n            while (reader.pos \u003c end) {\n                [fieldNo, wireType] = reader.tag();\n                if (delimitedMessageEncoding === true \u0026\u0026\n                    wireType == WireType.EndGroup) {\n                    break;\n                }\n                const field = type.fields.find(fieldNo);\n                if (!field) {\n                    const data = reader.skip(wireType, fieldNo);\n                    if (options.readUnknownFields) {\n                        this.onUnknownField(message, fieldNo, wireType, data);\n                    }\n                    continue;\n                }\n                readField(message, reader, field, wireType, options);\n            }\n            if (delimitedMessageEncoding \u0026\u0026 // eslint-disable-line @typescript-eslint/strict-boolean-expressions\n                (wireType != WireType.EndGroup || fieldNo !== lengthOrEndTagFieldNo)) {\n                throw new Error(`invalid end group tag`);\n            }\n        },\n        readField,\n        writeMessage(message, writer, options) {\n            const type = message.getType();\n            for (const field of type.fields.byNumber()) {\n                if (!isFieldSet(field, message)) {\n                    if (field.req) {\n                        throw new Error(`cannot encode field ${type.typeName}.${field.name} to binary: required field not set`);\n                    }\n                    continue;\n                }\n                const value = field.oneof\n                    ? message[field.oneof.localName].value\n                    : message[field.localName];\n                writeField(field, value, writer, options);\n            }\n            if (options.writeUnknownFields) {\n                this.writeUnknownFields(message, writer);\n            }\n            return writer;\n        },\n        writeField(field, value, writer, options) {\n            // The behavior of our internal function has changed, it does no longer\n            // accept `undefined` values for singular scalar and map.\n            // For backwards-compatibility, we support the old form that is part of\n            // the public API through the interface BinaryFormat.\n            if (value === undefined) {\n                return undefined;\n            }\n            writeField(field, value, writer, options);\n        },\n    };\n}\nfunction readField(target, // eslint-disable-line @typescript-eslint/no-explicit-any -- `any` is the best choice for dynamic access\nreader, field, wireType, options) {\n    let { repeated, localName } = field;\n    if (field.oneof) {\n        target = target[field.oneof.localName];\n        if (target.case != localName) {\n            delete target.value;\n        }\n        target.case = localName;\n        localName = \"value\";\n    }\n    switch (field.kind) {\n        case \"scalar\":\n        case \"enum\":\n            const scalarType = field.kind == \"enum\" ? ScalarType.INT32 : field.T;\n            let read = readScalar;\n            // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison -- acceptable since it's covered by tests\n            if (field.kind == \"scalar\" \u0026\u0026 field.L \u003e 0) {\n                read = readScalarLTString;\n            }\n            if (repeated) {\n                let arr = target[localName]; // safe to assume presence of array, oneof cannot contain repeated values\n                const isPacked = wireType == WireType.LengthDelimited \u0026\u0026\n                    scalarType != ScalarType.STRING \u0026\u0026\n                    scalarType != ScalarType.BYTES;\n                if (isPacked) {\n                    let e = reader.uint32() + reader.pos;\n                    while (reader.pos \u003c e) {\n                        arr.push(read(reader, scalarType));\n                    }\n                }\n                else {\n                    arr.push(read(reader, scalarType));\n                }\n            }\n            else {\n                target[localName] = read(reader, scalarType);\n            }\n            break;\n        case \"message\":\n            const messageType = field.T;\n            if (repeated) {\n                // safe to assume presence of array, oneof cannot contain repeated values\n                target[localName].push(readMessageField(reader, new messageType(), options, field));\n            }\n            else {\n                if (isMessage(target[localName])) {\n                    readMessageField(reader, target[localName], options, field);\n                }\n                else {\n                    target[localName] = readMessageField(reader, new messageType(), options, field);\n                    if (messageType.fieldWrapper \u0026\u0026 !field.oneof \u0026\u0026 !field.repeated) {\n                        target[localName] = messageType.fieldWrapper.unwrapField(target[localName]);\n                    }\n                }\n            }\n            break;\n        case \"map\":\n            let [mapKey, mapVal] = readMapEntry(field, reader, options);\n            // safe to assume presence of map object, oneof cannot contain repeated values\n            target[localName][mapKey] = mapVal;\n            break;\n    }\n}\n// Read a message, avoiding MessageType.fromBinary() to re-use the\n// BinaryReadOptions and the IBinaryReader.\nfunction readMessageField(reader, message, options, field) {\n    const format = message.getType().runtime.bin;\n    const delimited = field === null || field === void 0 ? void 0 : field.delimited;\n    format.readMessage(message, reader, delimited ? field.no : reader.uint32(), // eslint-disable-line @typescript-eslint/strict-boolean-expressions\n    options, delimited);\n    return message;\n}\n// Read a map field, expecting key field = 1, value field = 2\nfunction readMapEntry(field, reader, options) {\n    const length = reader.uint32(), end = reader.pos + length;\n    let key, val;\n    while (reader.pos \u003c end) {\n        const [fieldNo] = reader.tag();\n        switch (fieldNo) {\n            case 1:\n                key = readScalar(reader, field.K);\n                break;\n            case 2:\n                switch (field.V.kind) {\n                    case \"scalar\":\n                        val = readScalar(reader, field.V.T);\n                        break;\n                    case \"enum\":\n                        val = reader.int32();\n                        break;\n                    case \"message\":\n                        val = readMessageField(reader, new field.V.T(), options, undefined);\n                        break;\n                }\n                break;\n        }\n    }\n    if (key === undefined) {\n        key = scalarZeroValue(field.K, LongType.BIGINT);\n    }\n    if (typeof key != \"string\" \u0026\u0026 typeof key != \"number\") {\n        key = key.toString();\n    }\n    if (val === undefined) {\n        switch (field.V.kind) {\n            case \"scalar\":\n                val = scalarZeroValue(field.V.T, LongType.BIGINT);\n                break;\n            case \"enum\":\n                val = field.V.T.values[0].no;\n                break;\n            case \"message\":\n                val = new field.V.T();\n                break;\n        }\n    }\n    return [key, val];\n}\n// Read a scalar value, but return 64 bit integral types (int64, uint64,\n// sint64, fixed64, sfixed64) as string instead of bigint.\nfunction readScalarLTString(reader, type) {\n    const v = readScalar(reader, type);\n    return typeof v == \"bigint\" ? v.toString() : v;\n}\n// Does not use scalarTypeInfo() for better performance.\nfunction readScalar(reader, type) {\n    switch (type) {\n        case ScalarType.STRING:\n            return reader.string();\n        case ScalarType.BOOL:\n            return reader.bool();\n        case ScalarType.DOUBLE:\n            return reader.double();\n        case ScalarType.FLOAT:\n            return reader.float();\n        case ScalarType.INT32:\n            return reader.int32();\n        case ScalarType.INT64:\n            return reader.int64();\n        case ScalarType.UINT64:\n            return reader.uint64();\n        case ScalarType.FIXED64:\n            return reader.fixed64();\n        case ScalarType.BYTES:\n            return reader.bytes();\n        case ScalarType.FIXED32:\n            return reader.fixed32();\n        case ScalarType.SFIXED32:\n            return reader.sfixed32();\n        case ScalarType.SFIXED64:\n            return reader.sfixed64();\n        case ScalarType.SINT64:\n            return reader.sint64();\n        case ScalarType.UINT32:\n            return reader.uint32();\n        case ScalarType.SINT32:\n            return reader.sint32();\n    }\n}\nfunction writeField(field, value, writer, options) {\n    assert(value !== undefined);\n    const repeated = field.repeated;\n    switch (field.kind) {\n        case \"scalar\":\n        case \"enum\":\n            let scalarType = field.kind == \"enum\" ? ScalarType.INT32 : field.T;\n            if (repeated) {\n                assert(Array.isArray(value));\n                if (field.packed) {\n                    writePacked(writer, scalarType, field.no, value);\n                }\n                else {\n                    for (const item of value) {\n                        writeScalar(writer, scalarType, field.no, item);\n                    }\n                }\n            }\n            else {\n                writeScalar(writer, scalarType, field.no, value);\n            }\n            break;\n        case \"message\":\n            if (repeated) {\n                assert(Array.isArray(value));\n                for (const item of value) {\n                    writeMessageField(writer, options, field, item);\n                }\n            }\n            else {\n                writeMessageField(writer, options, field, value);\n            }\n            break;\n        case \"map\":\n            assert(typeof value == \"object\" \u0026\u0026 value != null);\n            for (const [key, val] of Object.entries(value)) {\n                writeMapEntry(writer, options, field, key, val);\n            }\n            break;\n    }\n}\nexport function writeMapEntry(writer, options, field, key, value) {\n    writer.tag(field.no, WireType.LengthDelimited);\n    writer.fork();\n    // javascript only allows number or string for object properties\n    // we convert from our representation to the protobuf type\n    let keyValue = key;\n    // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check -- we deliberately handle just the special cases for map keys\n    switch (field.K) {\n        case ScalarType.INT32:\n        case ScalarType.FIXED32:\n        case ScalarType.UINT32:\n        case ScalarType.SFIXED32:\n        case ScalarType.SINT32:\n            keyValue = Number.parseInt(key);\n            break;\n        case ScalarType.BOOL:\n            assert(key == \"true\" || key == \"false\");\n            keyValue = key == \"true\";\n            break;\n    }\n    // write key, expecting key field number = 1\n    writeScalar(writer, field.K, 1, keyValue);\n    // write value, expecting value field number = 2\n    switch (field.V.kind) {\n        case \"scalar\":\n            writeScalar(writer, field.V.T, 2, value);\n            break;\n        case \"enum\":\n            writeScalar(writer, ScalarType.INT32, 2, value);\n            break;\n        case \"message\":\n            assert(value !== undefined);\n            writer.tag(2, WireType.LengthDelimited).bytes(value.toBinary(options));\n            break;\n    }\n    writer.join();\n}\n// Value must not be undefined\nfunction writeMessageField(writer, options, field, value) {\n    const message = wrapField(field.T, value);\n    // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n    if (field.delimited)\n        writer\n            .tag(field.no, WireType.StartGroup)\n            .raw(message.toBinary(options))\n            .tag(field.no, WireType.EndGroup);\n    else\n        writer\n            .tag(field.no, WireType.LengthDelimited)\n            .bytes(message.toBinary(options));\n}\nfunction writeScalar(writer, type, fieldNo, value) {\n    assert(value !== undefined);\n    let [wireType, method] = scalarTypeInfo(type);\n    writer.tag(fieldNo, wireType)[method](value);\n}\nfunction writePacked(writer, type, fieldNo, value) {\n    if (!value.length) {\n        return;\n    }\n    writer.tag(fieldNo, WireType.LengthDelimited).fork();\n    let [, method] = scalarTypeInfo(type);\n    for (let i = 0; i \u003c value.length; i++) {\n        writer[method](value[i]);\n    }\n    writer.join();\n}\n/**\n * Get information for writing a scalar value.\n *\n * Returns tuple:\n * [0]: appropriate WireType\n * [1]: name of the appropriate method of IBinaryWriter\n * [2]: whether the given value is a default value for proto3 semantics\n *\n * If argument `value` is omitted, [2] is always false.\n */\n// TODO replace call-sites writeScalar() and writePacked(), then remove\nfunction scalarTypeInfo(type) {\n    let wireType = WireType.Varint;\n    // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check -- INT32, UINT32, SINT32 are covered by the defaults\n    switch (type) {\n        case ScalarType.BYTES:\n        case ScalarType.STRING:\n            wireType = WireType.LengthDelimited;\n            break;\n        case ScalarType.DOUBLE:\n        case ScalarType.FIXED64:\n        case ScalarType.SFIXED64:\n            wireType = WireType.Bit64;\n            break;\n        case ScalarType.FIXED32:\n        case ScalarType.SFIXED32:\n        case ScalarType.FLOAT:\n            wireType = WireType.Bit32;\n            break;\n    }\n    const method = ScalarType[type].toLowerCase();\n    return [wireType, method];\n}\n","// Copyright 2021-2024 Buf Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport { setEnumType } from \"./enum.js\";\nimport { Message } from \"../message.js\";\nimport { scalarEquals } from \"./scalars.js\";\nimport { ScalarType } from \"../scalar.js\";\nimport { isMessage } from \"../is-message.js\";\n/* eslint-disable @typescript-eslint/no-explicit-any,@typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-return,@typescript-eslint/no-unsafe-argument,no-case-declarations */\nexport function makeUtilCommon() {\n    return {\n        setEnumType,\n        initPartial(source, target) {\n            if (source === undefined) {\n                return;\n            }\n            const type = target.getType();\n            for (const member of type.fields.byMember()) {\n                const localName = member.localName, t = target, s = source;\n                if (s[localName] == null) {\n                    // TODO if source is a Message instance, we should use isFieldSet() here to support future field presence\n                    continue;\n                }\n                switch (member.kind) {\n                    case \"oneof\":\n                        const sk = s[localName].case;\n                        if (sk === undefined) {\n                            continue;\n                        }\n                        const sourceField = member.findField(sk);\n                        let val = s[localName].value;\n                        if (sourceField \u0026\u0026\n                            sourceField.kind == \"message\" \u0026\u0026\n                            !isMessage(val, sourceField.T)) {\n                            val = new sourceField.T(val);\n                        }\n                        else if (sourceField \u0026\u0026\n                            sourceField.kind === \"scalar\" \u0026\u0026\n                            sourceField.T === ScalarType.BYTES) {\n                            val = toU8Arr(val);\n                        }\n                        t[localName] = { case: sk, value: val };\n                        break;\n                    case \"scalar\":\n                    case \"enum\":\n                        let copy = s[localName];\n                        if (member.T === ScalarType.BYTES) {\n                            copy = member.repeated\n                                ? copy.map(toU8Arr)\n                                : toU8Arr(copy);\n                        }\n                        t[localName] = copy;\n                        break;\n                    case \"map\":\n                        switch (member.V.kind) {\n                            case \"scalar\":\n                            case \"enum\":\n                                if (member.V.T === ScalarType.BYTES) {\n                                    for (const [k, v] of Object.entries(s[localName])) {\n                                        t[localName][k] = toU8Arr(v);\n                                    }\n                                }\n                                else {\n                                    Object.assign(t[localName], s[localName]);\n                                }\n                                break;\n                            case \"message\":\n                                const messageType = member.V.T;\n                                for (const k of Object.keys(s[localName])) {\n                                    let val = s[localName][k];\n                                    if (!messageType.fieldWrapper) {\n                                        // We only take partial input for messages that are not a wrapper type.\n                                        // For those messages, we recursively normalize the partial input.\n                                        val = new messageType(val);\n                                    }\n                                    t[localName][k] = val;\n                                }\n                                break;\n                        }\n                        break;\n                    case \"message\":\n                        const mt = member.T;\n                        if (member.repeated) {\n                            t[localName] = s[localName].map((val) =\u003e isMessage(val, mt) ? val : new mt(val));\n                        }\n                        else {\n                            const val = s[localName];\n                            if (mt.fieldWrapper) {\n                                if (\n                                // We can't use BytesValue.typeName as that will create a circular import\n                                mt.typeName === \"google.protobuf.BytesValue\") {\n                                    t[localName] = toU8Arr(val);\n                                }\n                                else {\n                                    t[localName] = val;\n                                }\n                            }\n                            else {\n                                t[localName] = isMessage(val, mt) ? val : new mt(val);\n                            }\n                        }\n                        break;\n                }\n            }\n        },\n        // TODO use isFieldSet() here to support future field presence\n        equals(type, a, b) {\n            if (a === b) {\n                return true;\n            }\n            if (!a || !b) {\n                return false;\n            }\n            return type.fields.byMember().every((m) =\u003e {\n                const va = a[m.localName];\n                const vb = b[m.localName];\n                if (m.repeated) {\n                    if (va.length !== vb.length) {\n                        return false;\n                    }\n                    // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check -- repeated fields are never \"map\"\n                    switch (m.kind) {\n                        case \"message\":\n                            return va.every((a, i) =\u003e m.T.equals(a, vb[i]));\n                        case \"scalar\":\n                            return va.every((a, i) =\u003e scalarEquals(m.T, a, vb[i]));\n                        case \"enum\":\n                            return va.every((a, i) =\u003e scalarEquals(ScalarType.INT32, a, vb[i]));\n                    }\n                    throw new Error(`repeated cannot contain ${m.kind}`);\n                }\n                switch (m.kind) {\n                    case \"message\":\n                        let a = va;\n                        let b = vb;\n                        if (m.T.fieldWrapper) {\n                            if (a !== undefined \u0026\u0026 !isMessage(a)) {\n                                a = m.T.fieldWrapper.wrapField(a);\n                            }\n                            if (b !== undefined \u0026\u0026 !isMessage(b)) {\n                                b = m.T.fieldWrapper.wrapField(b);\n                            }\n                        }\n                        return m.T.equals(a, b);\n                    case \"enum\":\n                        return scalarEquals(ScalarType.INT32, va, vb);\n                    case \"scalar\":\n                        return scalarEquals(m.T, va, vb);\n                    case \"oneof\":\n                        if (va.case !== vb.case) {\n                            return false;\n                        }\n                        const s = m.findField(va.case);\n                        if (s === undefined) {\n                            return true;\n                        }\n                        // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check -- oneof fields are never \"map\"\n                        switch (s.kind) {\n                            case \"message\":\n                                return s.T.equals(va.value, vb.value);\n                            case \"enum\":\n                                return scalarEquals(ScalarType.INT32, va.value, vb.value);\n                            case \"scalar\":\n                                return scalarEquals(s.T, va.value, vb.value);\n                        }\n                        throw new Error(`oneof cannot contain ${s.kind}`);\n                    case \"map\":\n                        const keys = Object.keys(va).concat(Object.keys(vb));\n                        switch (m.V.kind) {\n                            case \"message\":\n                                const messageType = m.V.T;\n                                return keys.every((k) =\u003e messageType.equals(va[k], vb[k]));\n                            case \"enum\":\n                                return keys.every((k) =\u003e scalarEquals(ScalarType.INT32, va[k], vb[k]));\n                            case \"scalar\":\n                                const scalarType = m.V.T;\n                                return keys.every((k) =\u003e scalarEquals(scalarType, va[k], vb[k]));\n                        }\n                        break;\n                }\n            });\n        },\n        // TODO use isFieldSet() here to support future field presence\n        clone(message) {\n            const type = message.getType(), target = new type(), any = target;\n            for (const member of type.fields.byMember()) {\n                const source = message[member.localName];\n                let copy;\n                if (member.repeated) {\n                    copy = source.map(cloneSingularField);\n                }\n                else if (member.kind == \"map\") {\n                    copy = any[member.localName];\n                    for (const [key, v] of Object.entries(source)) {\n                        copy[key] = cloneSingularField(v);\n                    }\n                }\n                else if (member.kind == \"oneof\") {\n                    const f = member.findField(source.case);\n                    copy = f\n                        ? { case: source.case, value: cloneSingularField(source.value) }\n                        : { case: undefined };\n                }\n                else {\n                    copy = cloneSingularField(source);\n                }\n                any[member.localName] = copy;\n            }\n            for (const uf of type.runtime.bin.listUnknownFields(message)) {\n                type.runtime.bin.onUnknownField(any, uf.no, uf.wireType, uf.data);\n            }\n            return target;\n        },\n    };\n}\n// clone a single field value - i.e. the element type of repeated fields, the value type of maps\nfunction cloneSingularField(value) {\n    if (value === undefined) {\n        return value;\n    }\n    if (isMessage(value)) {\n        return value.clone();\n    }\n    if (value instanceof Uint8Array) {\n        const c = new Uint8Array(value.byteLength);\n        c.set(value);\n        return c;\n    }\n    return value;\n}\n// converts any ArrayLike\u003cnumber\u003e to Uint8Array if necessary.\nfunction toU8Arr(input) {\n    return input instanceof Uint8Array ? input : new Uint8Array(input);\n}\n","// Copyright 2021-2024 Buf Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport { getEnumType, makeEnum, makeEnumType } from \"./enum.js\";\nimport { makeMessageType } from \"./message-type.js\";\nimport { makeExtension } from \"./extensions.js\";\nimport { makeJsonFormat } from \"./json-format.js\";\nimport { makeBinaryFormat } from \"./binary-format.js\";\nimport { makeUtilCommon } from \"./util-common.js\";\nexport function makeProtoRuntime(syntax, newFieldList, initFields) {\n    return {\n        syntax,\n        json: makeJsonFormat(),\n        bin: makeBinaryFormat(),\n        util: Object.assign(Object.assign({}, makeUtilCommon()), { newFieldList,\n            initFields }),\n        makeMessageType(typeName, fields, opt) {\n            return makeMessageType(this, typeName, fields, opt);\n        },\n        makeEnum,\n        makeEnumType,\n        getEnumType,\n        makeExtension(typeName, extendee, field) {\n            return makeExtension(this, typeName, extendee, field);\n        },\n    };\n}\n","// Copyright 2021-2024 Buf Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nexport class InternalFieldList {\n    constructor(fields, normalizer) {\n        this._fields = fields;\n        this._normalizer = normalizer;\n    }\n    findJsonName(jsonName) {\n        if (!this.jsonNames) {\n            const t = {};\n            for (const f of this.list()) {\n                t[f.jsonName] = t[f.name] = f;\n            }\n            this.jsonNames = t;\n        }\n        return this.jsonNames[jsonName];\n    }\n    find(fieldNo) {\n        if (!this.numbers) {\n            const t = {};\n            for (const f of this.list()) {\n                t[f.no] = f;\n            }\n            this.numbers = t;\n        }\n        return this.numbers[fieldNo];\n    }\n    list() {\n        if (!this.all) {\n            this.all = this._normalizer(this._fields);\n        }\n        return this.all;\n    }\n    byNumber() {\n        if (!this.numbersAsc) {\n            this.numbersAsc = this.list()\n                .concat()\n                .sort((a, b) =\u003e a.no - b.no);\n        }\n        return this.numbersAsc;\n    }\n    byMember() {\n        if (!this.members) {\n            this.members = [];\n            const a = this.members;\n            let o;\n            for (const f of this.list()) {\n                if (f.oneof) {\n                    if (f.oneof !== o) {\n                        o = f.oneof;\n                        a.push(o);\n                    }\n                }\n                else {\n                    a.push(f);\n                }\n            }\n        }\n        return this.members;\n    }\n}\n","// Copyright 2021-2024 Buf Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n/**\n * Returns the name of a protobuf element in generated code.\n *\n * Field names - including oneofs - are converted to lowerCamelCase. For\n * messages, enumerations and services, the package name is stripped from\n * the type name. For nested messages and enumerations, the names are joined\n * with an underscore. For methods, the first character is made lowercase.\n */\nexport function localName(desc) {\n    switch (desc.kind) {\n        case \"field\":\n            return localFieldName(desc.name, desc.oneof !== undefined);\n        case \"oneof\":\n            return localOneofName(desc.name);\n        case \"enum\":\n        case \"message\":\n        case \"service\":\n        case \"extension\": {\n            const pkg = desc.file.proto.package;\n            const offset = pkg === undefined ? 0 : pkg.length + 1;\n            const name = desc.typeName.substring(offset).replace(/\\./g, \"_\");\n            // For services, we only care about safe identifiers, not safe object properties,\n            // but we have shipped v1 with a bug that respected object properties, and we\n            // do not want to introduce a breaking change, so we continue to escape for\n            // safe object properties.\n            // See https://github.com/bufbuild/protobuf-es/pull/391\n            return safeObjectProperty(safeIdentifier(name));\n        }\n        case \"enum_value\": {\n            let name = desc.name;\n            const sharedPrefix = desc.parent.sharedPrefix;\n            if (sharedPrefix !== undefined) {\n                name = name.substring(sharedPrefix.length);\n            }\n            return safeObjectProperty(name);\n        }\n        case \"rpc\": {\n            let name = desc.name;\n            if (name.length == 0) {\n                return name;\n            }\n            name = name[0].toLowerCase() + name.substring(1);\n            return safeObjectProperty(name);\n        }\n    }\n}\n/**\n * Returns the name of a field in generated code.\n */\nexport function localFieldName(protoName, inOneof) {\n    const name = protoCamelCase(protoName);\n    if (inOneof) {\n        // oneof member names are not properties, but values of the `case` property.\n        return name;\n    }\n    return safeObjectProperty(safeMessageProperty(name));\n}\n/**\n * Returns the name of a oneof group in generated code.\n */\nexport function localOneofName(protoName) {\n    return localFieldName(protoName, false);\n}\n/**\n * Returns the JSON name for a protobuf field, exactly like protoc does.\n */\nexport const fieldJsonName = protoCamelCase;\n/**\n * Finds a prefix shared by enum values, for example `MY_ENUM_` for\n * `enum MyEnum {MY_ENUM_A=0; MY_ENUM_B=1;}`.\n */\nexport function findEnumSharedPrefix(enumName, valueNames) {\n    const prefix = camelToSnakeCase(enumName) + \"_\";\n    for (const name of valueNames) {\n        if (!name.toLowerCase().startsWith(prefix)) {\n            return undefined;\n        }\n        const shortName = name.substring(prefix.length);\n        if (shortName.length == 0) {\n            return undefined;\n        }\n        if (/^\\d/.test(shortName)) {\n            // identifiers must not start with numbers\n            return undefined;\n        }\n    }\n    return prefix;\n}\n/**\n * Converts lowerCamelCase or UpperCamelCase into lower_snake_case.\n * This is used to find shared prefixes in an enum.\n */\nfunction camelToSnakeCase(camel) {\n    return (camel.substring(0, 1) + camel.substring(1).replace(/[A-Z]/g, (c) =\u003e \"_\" + c)).toLowerCase();\n}\n/**\n * Converts snake_case to protoCamelCase according to the convention\n * used by protoc to convert a field name to a JSON name.\n */\nfunction protoCamelCase(snakeCase) {\n    let capNext = false;\n    const b = [];\n    for (let i = 0; i \u003c snakeCase.length; i++) {\n        let c = snakeCase.charAt(i);\n        switch (c) {\n            case \"_\":\n                capNext = true;\n                break;\n            case \"0\":\n            case \"1\":\n            case \"2\":\n            case \"3\":\n            case \"4\":\n            case \"5\":\n            case \"6\":\n            case \"7\":\n            case \"8\":\n            case \"9\":\n                b.push(c);\n                capNext = false;\n                break;\n            default:\n                if (capNext) {\n                    capNext = false;\n                    c = c.toUpperCase();\n                }\n                b.push(c);\n                break;\n        }\n    }\n    return b.join(\"\");\n}\n/**\n * Names that cannot be used for identifiers, such as class names,\n * but _can_ be used for object properties.\n */\nconst reservedIdentifiers = new Set([\n    // ECMAScript 2015 keywords\n    \"break\",\n    \"case\",\n    \"catch\",\n    \"class\",\n    \"const\",\n    \"continue\",\n    \"debugger\",\n    \"default\",\n    \"delete\",\n    \"do\",\n    \"else\",\n    \"export\",\n    \"extends\",\n    \"false\",\n    \"finally\",\n    \"for\",\n    \"function\",\n    \"if\",\n    \"import\",\n    \"in\",\n    \"instanceof\",\n    \"new\",\n    \"null\",\n    \"return\",\n    \"super\",\n    \"switch\",\n    \"this\",\n    \"throw\",\n    \"true\",\n    \"try\",\n    \"typeof\",\n    \"var\",\n    \"void\",\n    \"while\",\n    \"with\",\n    \"yield\",\n    // ECMAScript 2015 future reserved keywords\n    \"enum\",\n    \"implements\",\n    \"interface\",\n    \"let\",\n    \"package\",\n    \"private\",\n    \"protected\",\n    \"public\",\n    \"static\",\n    // Class name cannot be 'Object' when targeting ES5 with module CommonJS\n    \"Object\",\n    // TypeScript keywords that cannot be used for types (as opposed to variables)\n    \"bigint\",\n    \"number\",\n    \"boolean\",\n    \"string\",\n    \"object\",\n    // Identifiers reserved for the runtime, so we can generate legible code\n    \"globalThis\",\n    \"Uint8Array\",\n    \"Partial\",\n]);\n/**\n * Names that cannot be used for object properties because they are reserved\n * by built-in JavaScript properties.\n */\nconst reservedObjectProperties = new Set([\n    // names reserved by JavaScript\n    \"constructor\",\n    \"toString\",\n    \"toJSON\",\n    \"valueOf\",\n]);\n/**\n * Names that cannot be used for object properties because they are reserved\n * by the runtime.\n */\nconst reservedMessageProperties = new Set([\n    // names reserved by the runtime\n    \"getType\",\n    \"clone\",\n    \"equals\",\n    \"fromBinary\",\n    \"fromJson\",\n    \"fromJsonString\",\n    \"toBinary\",\n    \"toJson\",\n    \"toJsonString\",\n    // names reserved by the runtime for the future\n    \"toObject\",\n]);\nconst fallback = (name) =\u003e `${name}$`;\n/**\n * Will wrap names that are Object prototype properties or names reserved\n * for `Message`s.\n */\nconst safeMessageProperty = (name) =\u003e {\n    if (reservedMessageProperties.has(name)) {\n        return fallback(name);\n    }\n    return name;\n};\n/**\n * Names that cannot be used for object properties because they are reserved\n * by built-in JavaScript properties.\n */\nexport const safeObjectProperty = (name) =\u003e {\n    if (reservedObjectProperties.has(name)) {\n        return fallback(name);\n    }\n    return name;\n};\n/**\n * Names that can be used for identifiers or class properties\n */\nexport const safeIdentifier = (name) =\u003e {\n    if (reservedIdentifiers.has(name)) {\n        return fallback(name);\n    }\n    return name;\n};\n","// Copyright 2021-2024 Buf Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport { localOneofName } from \"./names.js\";\nimport { assert } from \"./assert.js\";\nexport class InternalOneofInfo {\n    constructor(name) {\n        this.kind = \"oneof\";\n        this.repeated = false;\n        this.packed = false;\n        this.opt = false;\n        this.req = false;\n        this.default = undefined;\n        this.fields = [];\n        this.name = name;\n        this.localName = localOneofName(name);\n    }\n    addField(field) {\n        assert(field.oneof === this, `field ${field.name} not one of ${this.name}`);\n        this.fields.push(field);\n    }\n    findField(localName) {\n        if (!this._lookup) {\n            this._lookup = Object.create(null);\n            for (let i = 0; i \u003c this.fields.length; i++) {\n                this._lookup[this.fields[i].localName] = this.fields[i];\n            }\n        }\n        return this._lookup[localName];\n    }\n}\n","// Copyright 2021-2024 Buf Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport { InternalOneofInfo } from \"./field.js\";\nimport { fieldJsonName, localFieldName } from \"./names.js\";\nimport { LongType, ScalarType } from \"../scalar.js\";\n/**\n * Convert a collection of field info to an array of normalized FieldInfo.\n *\n * The argument `packedByDefault` specifies whether fields that do not specify\n * `packed` should be packed (proto3) or unpacked (proto2).\n */\nexport function normalizeFieldInfos(fieldInfos, packedByDefault) {\n    var _a, _b, _c, _d, _e, _f;\n    const r = [];\n    let o;\n    for (const field of typeof fieldInfos == \"function\"\n        ? fieldInfos()\n        : fieldInfos) {\n        const f = field;\n        f.localName = localFieldName(field.name, field.oneof !== undefined);\n        f.jsonName = (_a = field.jsonName) !== null \u0026\u0026 _a !== void 0 ? _a : fieldJsonName(field.name);\n        f.repeated = (_b = field.repeated) !== null \u0026\u0026 _b !== void 0 ? _b : false;\n        if (field.kind == \"scalar\") {\n            f.L = (_c = field.L) !== null \u0026\u0026 _c !== void 0 ? _c : LongType.BIGINT;\n        }\n        f.delimited = (_d = field.delimited) !== null \u0026\u0026 _d !== void 0 ? _d : false;\n        f.req = (_e = field.req) !== null \u0026\u0026 _e !== void 0 ? _e : false;\n        f.opt = (_f = field.opt) !== null \u0026\u0026 _f !== void 0 ? _f : false;\n        if (field.packed === undefined) {\n            if (packedByDefault) {\n                f.packed =\n                    field.kind == \"enum\" ||\n                        (field.kind == \"scalar\" \u0026\u0026\n                            field.T != ScalarType.BYTES \u0026\u0026\n                            field.T != ScalarType.STRING);\n            }\n            else {\n                f.packed = false;\n            }\n        }\n        // We do not surface options at this time\n        // f.options = field.options ?? emptyReadonlyObject;\n        if (field.oneof !== undefined) {\n            const ooname = typeof field.oneof == \"string\" ? field.oneof : field.oneof.name;\n            if (!o || o.name != ooname) {\n                o = new InternalOneofInfo(ooname);\n            }\n            f.oneof = o;\n            o.addField(f);\n        }\n        r.push(f);\n    }\n    return r;\n}\n","// Copyright 2021-2024 Buf Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport { makeProtoRuntime } from \"./private/proto-runtime.js\";\nimport { InternalFieldList } from \"./private/field-list.js\";\nimport { scalarZeroValue } from \"./private/scalars.js\";\nimport { normalizeFieldInfos } from \"./private/field-normalize.js\";\n/**\n * Provides functionality for messages defined with the proto3 syntax.\n */\nexport const proto3 = makeProtoRuntime(\"proto3\", (fields) =\u003e {\n    return new InternalFieldList(fields, (source) =\u003e normalizeFieldInfos(source, true));\n}, \n// TODO merge with proto2 and initExtensionField, also see initPartial, equals, clone\n(target) =\u003e {\n    for (const member of target.getType().fields.byMember()) {\n        if (member.opt) {\n            continue;\n        }\n        const name = member.localName, t = target;\n        if (member.repeated) {\n            t[name] = [];\n            continue;\n        }\n        switch (member.kind) {\n            case \"oneof\":\n                t[name] = { case: undefined };\n                break;\n            case \"enum\":\n                t[name] = 0;\n                break;\n            case \"map\":\n                t[name] = {};\n                break;\n            case \"scalar\":\n                t[name] = scalarZeroValue(member.T, member.L);\n                break;\n            case \"message\":\n                // message fields are always optional in proto3\n                break;\n        }\n    }\n});\n","// Copyright 2021-2024 Buf Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport { Message } from \"../../message.js\";\nimport { protoInt64 } from \"../../proto-int64.js\";\nimport { proto3 } from \"../../proto3.js\";\n/**\n * A Timestamp represents a point in time independent of any time zone or local\n * calendar, encoded as a count of seconds and fractions of seconds at\n * nanosecond resolution. The count is relative to an epoch at UTC midnight on\n * January 1, 1970, in the proleptic Gregorian calendar which extends the\n * Gregorian calendar backwards to year one.\n *\n * All minutes are 60 seconds long. Leap seconds are \"smeared\" so that no leap\n * second table is needed for interpretation, using a [24-hour linear\n * smear](https://developers.google.com/time/smear).\n *\n * The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By\n * restricting to that range, we ensure that we can convert to and from [RFC\n * 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.\n *\n * # Examples\n *\n * Example 1: Compute Timestamp from POSIX `time()`.\n *\n *     Timestamp timestamp;\n *     timestamp.set_seconds(time(NULL));\n *     timestamp.set_nanos(0);\n *\n * Example 2: Compute Timestamp from POSIX `gettimeofday()`.\n *\n *     struct timeval tv;\n *     gettimeofday(\u0026tv, NULL);\n *\n *     Timestamp timestamp;\n *     timestamp.set_seconds(tv.tv_sec);\n *     timestamp.set_nanos(tv.tv_usec * 1000);\n *\n * Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`.\n *\n *     FILETIME ft;\n *     GetSystemTimeAsFileTime(\u0026ft);\n *     UINT64 ticks = (((UINT64)ft.dwHighDateTime) \u003c\u003c 32) | ft.dwLowDateTime;\n *\n *     // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z\n *     // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z.\n *     Timestamp timestamp;\n *     timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL));\n *     timestamp.set_nanos((INT32) ((ticks % 10000000) * 100));\n *\n * Example 4: Compute Timestamp from Java `System.currentTimeMillis()`.\n *\n *     long millis = System.currentTimeMillis();\n *\n *     Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000)\n *         .setNanos((int) ((millis % 1000) * 1000000)).build();\n *\n * Example 5: Compute Timestamp from Java `Instant.now()`.\n *\n *     Instant now = Instant.now();\n *\n *     Timestamp timestamp =\n *         Timestamp.newBuilder().setSeconds(now.getEpochSecond())\n *             .setNanos(now.getNano()).build();\n *\n * Example 6: Compute Timestamp from current time in Python.\n *\n *     timestamp = Timestamp()\n *     timestamp.GetCurrentTime()\n *\n * # JSON Mapping\n *\n * In JSON format, the Timestamp type is encoded as a string in the\n * [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format. That is, the\n * format is \"{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z\"\n * where {year} is always expressed using four digits while {month}, {day},\n * {hour}, {min}, and {sec} are zero-padded to two digits each. The fractional\n * seconds, which can go up to 9 digits (i.e. up to 1 nanosecond resolution),\n * are optional. The \"Z\" suffix indicates the timezone (\"UTC\"); the timezone\n * is required. A proto3 JSON serializer should always use UTC (as indicated by\n * \"Z\") when printing the Timestamp type and a proto3 JSON parser should be\n * able to accept both UTC and other timezones (as indicated by an offset).\n *\n * For example, \"2017-01-15T01:30:15.01Z\" encodes 15.01 seconds past\n * 01:30 UTC on January 15, 2017.\n *\n * In JavaScript, one can convert a Date object to this format using the\n * standard\n * [toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString)\n * method. In Python, a standard `datetime.datetime` object can be converted\n * to this format using\n * [`strftime`](https://docs.python.org/2/library/time.html#time.strftime) with\n * the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one can use\n * the Joda Time's [`ISODateTimeFormat.dateTime()`](\n * http://joda-time.sourceforge.net/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime()\n * ) to obtain a formatter capable of generating timestamps in this format.\n *\n *\n * @generated from message google.protobuf.Timestamp\n */\nexport class Timestamp extends Message {\n    constructor(data) {\n        super();\n        /**\n         * Represents seconds of UTC time since Unix epoch\n         * 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to\n         * 9999-12-31T23:59:59Z inclusive.\n         *\n         * @generated from field: int64 seconds = 1;\n         */\n        this.seconds = protoInt64.zero;\n        /**\n         * Non-negative fractions of a second at nanosecond resolution. Negative\n         * second values with fractions must still have non-negative nanos values\n         * that count forward in time. Must be from 0 to 999,999,999\n         * inclusive.\n         *\n         * @generated from field: int32 nanos = 2;\n         */\n        this.nanos = 0;\n        proto3.util.initPartial(data, this);\n    }\n    fromJson(json, options) {\n        if (typeof json !== \"string\") {\n            throw new Error(`cannot decode google.protobuf.Timestamp from JSON: ${proto3.json.debug(json)}`);\n        }\n        const matches = json.match(/^([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})(?:Z|\\.([0-9]{3,9})Z|([+-][0-9][0-9]:[0-9][0-9]))$/);\n        if (!matches) {\n            throw new Error(`cannot decode google.protobuf.Timestamp from JSON: invalid RFC 3339 string`);\n        }\n        const ms = Date.parse(matches[1] + \"-\" + matches[2] + \"-\" + matches[3] + \"T\" + matches[4] + \":\" + matches[5] + \":\" + matches[6] + (matches[8] ? matches[8] : \"Z\"));\n        if (Number.isNaN(ms)) {\n            throw new Error(`cannot decode google.protobuf.Timestamp from JSON: invalid RFC 3339 string`);\n        }\n        if (ms \u003c Date.parse(\"0001-01-01T00:00:00Z\") || ms \u003e Date.parse(\"9999-12-31T23:59:59Z\")) {\n            throw new Error(`cannot decode message google.protobuf.Timestamp from JSON: must be from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59Z inclusive`);\n        }\n        this.seconds = protoInt64.parse(ms / 1000);\n        this.nanos = 0;\n        if (matches[7]) {\n            this.nanos = (parseInt(\"1\" + matches[7] + \"0\".repeat(9 - matches[7].length)) - 1000000000);\n        }\n        return this;\n    }\n    toJson(options) {\n        const ms = Number(this.seconds) * 1000;\n        if (ms \u003c Date.parse(\"0001-01-01T00:00:00Z\") || ms \u003e Date.parse(\"9999-12-31T23:59:59Z\")) {\n            throw new Error(`cannot encode google.protobuf.Timestamp to JSON: must be from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59Z inclusive`);\n        }\n        if (this.nanos \u003c 0) {\n            throw new Error(`cannot encode google.protobuf.Timestamp to JSON: nanos must not be negative`);\n        }\n        let z = \"Z\";\n        if (this.nanos \u003e 0) {\n            const nanosStr = (this.nanos + 1000000000).toString().substring(1);\n            if (nanosStr.substring(3) === \"000000\") {\n                z = \".\" + nanosStr.substring(0, 3) + \"Z\";\n            }\n            else if (nanosStr.substring(6) === \"000\") {\n                z = \".\" + nanosStr.substring(0, 6) + \"Z\";\n            }\n            else {\n                z = \".\" + nanosStr + \"Z\";\n            }\n        }\n        return new Date(ms).toISOString().replace(\".000Z\", z);\n    }\n    toDate() {\n        return new Date(Number(this.seconds) * 1000 + Math.ceil(this.nanos / 1000000));\n    }\n    static now() {\n        return Timestamp.fromDate(new Date());\n    }\n    static fromDate(date) {\n        const ms = date.getTime();\n        return new Timestamp({\n            seconds: protoInt64.parse(Math.floor(ms / 1000)),\n            nanos: (ms % 1000) * 1000000,\n        });\n    }\n    static fromBinary(bytes, options) {\n        return new Timestamp().fromBinary(bytes, options);\n    }\n    static fromJson(jsonValue, options) {\n        return new Timestamp().fromJson(jsonValue, options);\n    }\n    static fromJsonString(jsonString, options) {\n        return new Timestamp().fromJsonString(jsonString, options);\n    }\n    static equals(a, b) {\n        return proto3.util.equals(Timestamp, a, b);\n    }\n}\nTimestamp.runtime = proto3;\nTimestamp.typeName = \"google.protobuf.Timestamp\";\nTimestamp.fields = proto3.util.newFieldList(() =\u003e [\n    { no: 1, name: \"seconds\", kind: \"scalar\", T: 3 /* ScalarType.INT64 */ },\n    { no: 2, name: \"nanos\", kind: \"scalar\", T: 5 /* ScalarType.INT32 */ },\n]);\n","import { proto3, Timestamp, Duration } from '@bufbuild/protobuf';\nexport { protoInt64 } from '@bufbuild/protobuf';\n\nconst MetricLabel = /* @__PURE__ */ proto3.makeEnum(\n  \"livekit.MetricLabel\",\n  [\n    { no: 0, name: \"AGENTS_LLM_TTFT\" },\n    { no: 1, name: \"AGENTS_STT_TTFT\" },\n    { no: 2, name: \"AGENTS_TTS_TTFB\" },\n    { no: 3, name: \"CLIENT_VIDEO_SUBSCRIBER_FREEZE_COUNT\" },\n    { no: 4, name: \"CLIENT_VIDEO_SUBSCRIBER_TOTAL_FREEZE_DURATION\" },\n    { no: 5, name: \"CLIENT_VIDEO_SUBSCRIBER_PAUSE_COUNT\" },\n    { no: 6, name: \"CLIENT_VIDEO_SUBSCRIBER_TOTAL_PAUSES_DURATION\" },\n    { no: 7, name: \"CLIENT_AUDIO_SUBSCRIBER_CONCEALED_SAMPLES\" },\n    { no: 8, name: \"CLIENT_AUDIO_SUBSCRIBER_SILENT_CONCEALED_SAMPLES\" },\n    { no: 9, name: \"CLIENT_AUDIO_SUBSCRIBER_CONCEALMENT_EVENTS\" },\n    { no: 10, name: \"CLIENT_AUDIO_SUBSCRIBER_INTERRUPTION_COUNT\" },\n    { no: 11, name: \"CLIENT_AUDIO_SUBSCRIBER_TOTAL_INTERRUPTION_DURATION\" },\n    { no: 12, name: \"CLIENT_SUBSCRIBER_JITTER_BUFFER_DELAY\" },\n    { no: 13, name: \"CLIENT_SUBSCRIBER_JITTER_BUFFER_EMITTED_COUNT\" },\n    { no: 14, name: \"CLIENT_VIDEO_PUBLISHER_QUALITY_LIMITATION_DURATION_BANDWIDTH\" },\n    { no: 15, name: \"CLIENT_VIDEO_PUBLISHER_QUALITY_LIMITATION_DURATION_CPU\" },\n    { no: 16, name: \"CLIENT_VIDEO_PUBLISHER_QUALITY_LIMITATION_DURATION_OTHER\" },\n    { no: 17, name: \"PUBLISHER_RTT\" },\n    { no: 18, name: \"SERVER_MESH_RTT\" },\n    { no: 19, name: \"SUBSCRIBER_RTT\" },\n    { no: 4096, name: \"METRIC_LABEL_PREDEFINED_MAX_VALUE\" }\n  ]\n);\nconst MetricsBatch = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.MetricsBatch\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"timestamp_ms\",\n      kind: \"scalar\",\n      T: 3\n      /* ScalarType.INT64 */\n    },\n    { no: 2, name: \"normalized_timestamp\", kind: \"message\", T: Timestamp },\n    { no: 3, name: \"str_data\", kind: \"scalar\", T: 9, repeated: true },\n    { no: 4, name: \"time_series\", kind: \"message\", T: TimeSeriesMetric, repeated: true },\n    { no: 5, name: \"events\", kind: \"message\", T: EventMetric, repeated: true }\n  ]\n);\nconst TimeSeriesMetric = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.TimeSeriesMetric\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"label\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    {\n      no: 2,\n      name: \"participant_identity\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    {\n      no: 3,\n      name: \"track_sid\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    { no: 4, name: \"samples\", kind: \"message\", T: MetricSample, repeated: true },\n    {\n      no: 5,\n      name: \"rid\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    }\n  ]\n);\nconst MetricSample = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.MetricSample\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"timestamp_ms\",\n      kind: \"scalar\",\n      T: 3\n      /* ScalarType.INT64 */\n    },\n    { no: 2, name: \"normalized_timestamp\", kind: \"message\", T: Timestamp },\n    {\n      no: 3,\n      name: \"value\",\n      kind: \"scalar\",\n      T: 2\n      /* ScalarType.FLOAT */\n    }\n  ]\n);\nconst EventMetric = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.EventMetric\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"label\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    {\n      no: 2,\n      name: \"participant_identity\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    {\n      no: 3,\n      name: \"track_sid\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    {\n      no: 4,\n      name: \"start_timestamp_ms\",\n      kind: \"scalar\",\n      T: 3\n      /* ScalarType.INT64 */\n    },\n    { no: 5, name: \"end_timestamp_ms\", kind: \"scalar\", T: 3, opt: true },\n    { no: 6, name: \"normalized_start_timestamp\", kind: \"message\", T: Timestamp },\n    { no: 7, name: \"normalized_end_timestamp\", kind: \"message\", T: Timestamp, opt: true },\n    {\n      no: 8,\n      name: \"metadata\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 9,\n      name: \"rid\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    }\n  ]\n);\n\nconst AudioCodec = /* @__PURE__ */ proto3.makeEnum(\n  \"livekit.AudioCodec\",\n  [\n    { no: 0, name: \"DEFAULT_AC\" },\n    { no: 1, name: \"OPUS\" },\n    { no: 2, name: \"AAC\" }\n  ]\n);\nconst VideoCodec = /* @__PURE__ */ proto3.makeEnum(\n  \"livekit.VideoCodec\",\n  [\n    { no: 0, name: \"DEFAULT_VC\" },\n    { no: 1, name: \"H264_BASELINE\" },\n    { no: 2, name: \"H264_MAIN\" },\n    { no: 3, name: \"H264_HIGH\" },\n    { no: 4, name: \"VP8\" }\n  ]\n);\nconst ImageCodec = /* @__PURE__ */ proto3.makeEnum(\n  \"livekit.ImageCodec\",\n  [\n    { no: 0, name: \"IC_DEFAULT\" },\n    { no: 1, name: \"IC_JPEG\" }\n  ]\n);\nconst BackupCodecPolicy = /* @__PURE__ */ proto3.makeEnum(\n  \"livekit.BackupCodecPolicy\",\n  [\n    { no: 0, name: \"PREFER_REGRESSION\" },\n    { no: 1, name: \"SIMULCAST\" },\n    { no: 2, name: \"REGRESSION\" }\n  ]\n);\nconst TrackType = /* @__PURE__ */ proto3.makeEnum(\n  \"livekit.TrackType\",\n  [\n    { no: 0, name: \"AUDIO\" },\n    { no: 1, name: \"VIDEO\" },\n    { no: 2, name: \"DATA\" }\n  ]\n);\nconst TrackSource = /* @__PURE__ */ proto3.makeEnum(\n  \"livekit.TrackSource\",\n  [\n    { no: 0, name: \"UNKNOWN\" },\n    { no: 1, name: \"CAMERA\" },\n    { no: 2, name: \"MICROPHONE\" },\n    { no: 3, name: \"SCREEN_SHARE\" },\n    { no: 4, name: \"SCREEN_SHARE_AUDIO\" }\n  ]\n);\nconst VideoQuality = /* @__PURE__ */ proto3.makeEnum(\n  \"livekit.VideoQuality\",\n  [\n    { no: 0, name: \"LOW\" },\n    { no: 1, name: \"MEDIUM\" },\n    { no: 2, name: \"HIGH\" },\n    { no: 3, name: \"OFF\" }\n  ]\n);\nconst ConnectionQuality = /* @__PURE__ */ proto3.makeEnum(\n  \"livekit.ConnectionQuality\",\n  [\n    { no: 0, name: \"POOR\" },\n    { no: 1, name: \"GOOD\" },\n    { no: 2, name: \"EXCELLENT\" },\n    { no: 3, name: \"LOST\" }\n  ]\n);\nconst ClientConfigSetting = /* @__PURE__ */ proto3.makeEnum(\n  \"livekit.ClientConfigSetting\",\n  [\n    { no: 0, name: \"UNSET\" },\n    { no: 1, name: \"DISABLED\" },\n    { no: 2, name: \"ENABLED\" }\n  ]\n);\nconst DisconnectReason = /* @__PURE__ */ proto3.makeEnum(\n  \"livekit.DisconnectReason\",\n  [\n    { no: 0, name: \"UNKNOWN_REASON\" },\n    { no: 1, name: \"CLIENT_INITIATED\" },\n    { no: 2, name: \"DUPLICATE_IDENTITY\" },\n    { no: 3, name: \"SERVER_SHUTDOWN\" },\n    { no: 4, name: \"PARTICIPANT_REMOVED\" },\n    { no: 5, name: \"ROOM_DELETED\" },\n    { no: 6, name: \"STATE_MISMATCH\" },\n    { no: 7, name: \"JOIN_FAILURE\" },\n    { no: 8, name: \"MIGRATION\" },\n    { no: 9, name: \"SIGNAL_CLOSE\" },\n    { no: 10, name: \"ROOM_CLOSED\" },\n    { no: 11, name: \"USER_UNAVAILABLE\" },\n    { no: 12, name: \"USER_REJECTED\" },\n    { no: 13, name: \"SIP_TRUNK_FAILURE\" },\n    { no: 14, name: \"CONNECTION_TIMEOUT\" },\n    { no: 15, name: \"MEDIA_FAILURE\" }\n  ]\n);\nconst ReconnectReason = /* @__PURE__ */ proto3.makeEnum(\n  \"livekit.ReconnectReason\",\n  [\n    { no: 0, name: \"RR_UNKNOWN\" },\n    { no: 1, name: \"RR_SIGNAL_DISCONNECTED\" },\n    { no: 2, name: \"RR_PUBLISHER_FAILED\" },\n    { no: 3, name: \"RR_SUBSCRIBER_FAILED\" },\n    { no: 4, name: \"RR_SWITCH_CANDIDATE\" }\n  ]\n);\nconst SubscriptionError = /* @__PURE__ */ proto3.makeEnum(\n  \"livekit.SubscriptionError\",\n  [\n    { no: 0, name: \"SE_UNKNOWN\" },\n    { no: 1, name: \"SE_CODEC_UNSUPPORTED\" },\n    { no: 2, name: \"SE_TRACK_NOTFOUND\" }\n  ]\n);\nconst AudioTrackFeature = /* @__PURE__ */ proto3.makeEnum(\n  \"livekit.AudioTrackFeature\",\n  [\n    { no: 0, name: \"TF_STEREO\" },\n    { no: 1, name: \"TF_NO_DTX\" },\n    { no: 2, name: \"TF_AUTO_GAIN_CONTROL\" },\n    { no: 3, name: \"TF_ECHO_CANCELLATION\" },\n    { no: 4, name: \"TF_NOISE_SUPPRESSION\" },\n    { no: 5, name: \"TF_ENHANCED_NOISE_CANCELLATION\" },\n    { no: 6, name: \"TF_PRECONNECT_BUFFER\" }\n  ]\n);\nconst Pagination = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.Pagination\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"after_id\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"limit\",\n      kind: \"scalar\",\n      T: 5\n      /* ScalarType.INT32 */\n    }\n  ]\n);\nconst ListUpdate = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.ListUpdate\",\n  () =\u003e [\n    { no: 1, name: \"set\", kind: \"scalar\", T: 9, repeated: true }\n  ]\n);\nconst Room = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.Room\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"sid\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"name\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 3,\n      name: \"empty_timeout\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    {\n      no: 14,\n      name: \"departure_timeout\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    {\n      no: 4,\n      name: \"max_participants\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    {\n      no: 5,\n      name: \"creation_time\",\n      kind: \"scalar\",\n      T: 3\n      /* ScalarType.INT64 */\n    },\n    {\n      no: 15,\n      name: \"creation_time_ms\",\n      kind: \"scalar\",\n      T: 3\n      /* ScalarType.INT64 */\n    },\n    {\n      no: 6,\n      name: \"turn_password\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 7, name: \"enabled_codecs\", kind: \"message\", T: Codec, repeated: true },\n    {\n      no: 8,\n      name: \"metadata\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 9,\n      name: \"num_participants\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    {\n      no: 11,\n      name: \"num_publishers\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    {\n      no: 10,\n      name: \"active_recording\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    { no: 13, name: \"version\", kind: \"message\", T: TimedVersion }\n  ]\n);\nconst Codec = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.Codec\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"mime\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"fmtp_line\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    }\n  ]\n);\nconst PlayoutDelay = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.PlayoutDelay\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"enabled\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    {\n      no: 2,\n      name: \"min\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    {\n      no: 3,\n      name: \"max\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    }\n  ]\n);\nconst ParticipantPermission = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.ParticipantPermission\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"can_subscribe\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    {\n      no: 2,\n      name: \"can_publish\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    {\n      no: 3,\n      name: \"can_publish_data\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    { no: 9, name: \"can_publish_sources\", kind: \"enum\", T: proto3.getEnumType(TrackSource), repeated: true },\n    {\n      no: 7,\n      name: \"hidden\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    {\n      no: 8,\n      name: \"recorder\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    {\n      no: 10,\n      name: \"can_update_metadata\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    {\n      no: 11,\n      name: \"agent\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    {\n      no: 12,\n      name: \"can_subscribe_metrics\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    }\n  ]\n);\nconst ParticipantInfo = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.ParticipantInfo\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"sid\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"identity\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 3, name: \"state\", kind: \"enum\", T: proto3.getEnumType(ParticipantInfo_State) },\n    { no: 4, name: \"tracks\", kind: \"message\", T: TrackInfo, repeated: true },\n    {\n      no: 5,\n      name: \"metadata\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 6,\n      name: \"joined_at\",\n      kind: \"scalar\",\n      T: 3\n      /* ScalarType.INT64 */\n    },\n    {\n      no: 17,\n      name: \"joined_at_ms\",\n      kind: \"scalar\",\n      T: 3\n      /* ScalarType.INT64 */\n    },\n    {\n      no: 9,\n      name: \"name\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 10,\n      name: \"version\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    { no: 11, name: \"permission\", kind: \"message\", T: ParticipantPermission },\n    {\n      no: 12,\n      name: \"region\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 13,\n      name: \"is_publisher\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    { no: 14, name: \"kind\", kind: \"enum\", T: proto3.getEnumType(ParticipantInfo_Kind) },\n    { no: 15, name: \"attributes\", kind: \"map\", K: 9, V: {\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    } },\n    { no: 16, name: \"disconnect_reason\", kind: \"enum\", T: proto3.getEnumType(DisconnectReason) },\n    { no: 18, name: \"kind_details\", kind: \"enum\", T: proto3.getEnumType(ParticipantInfo_KindDetail), repeated: true }\n  ]\n);\nconst ParticipantInfo_State = /* @__PURE__ */ proto3.makeEnum(\n  \"livekit.ParticipantInfo.State\",\n  [\n    { no: 0, name: \"JOINING\" },\n    { no: 1, name: \"JOINED\" },\n    { no: 2, name: \"ACTIVE\" },\n    { no: 3, name: \"DISCONNECTED\" }\n  ]\n);\nconst ParticipantInfo_Kind = /* @__PURE__ */ proto3.makeEnum(\n  \"livekit.ParticipantInfo.Kind\",\n  [\n    { no: 0, name: \"STANDARD\" },\n    { no: 1, name: \"INGRESS\" },\n    { no: 2, name: \"EGRESS\" },\n    { no: 3, name: \"SIP\" },\n    { no: 4, name: \"AGENT\" }\n  ]\n);\nconst ParticipantInfo_KindDetail = /* @__PURE__ */ proto3.makeEnum(\n  \"livekit.ParticipantInfo.KindDetail\",\n  [\n    { no: 0, name: \"CLOUD_AGENT\" },\n    { no: 1, name: \"FORWARDED\" }\n  ]\n);\nconst Encryption = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.Encryption\",\n  []\n);\nconst Encryption_Type = /* @__PURE__ */ proto3.makeEnum(\n  \"livekit.Encryption.Type\",\n  [\n    { no: 0, name: \"NONE\" },\n    { no: 1, name: \"GCM\" },\n    { no: 2, name: \"CUSTOM\" }\n  ]\n);\nconst SimulcastCodecInfo = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.SimulcastCodecInfo\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"mime_type\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"mid\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 3,\n      name: \"cid\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 4, name: \"layers\", kind: \"message\", T: VideoLayer, repeated: true }\n  ]\n);\nconst TrackInfo = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.TrackInfo\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"sid\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 2, name: \"type\", kind: \"enum\", T: proto3.getEnumType(TrackType) },\n    {\n      no: 3,\n      name: \"name\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 4,\n      name: \"muted\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    {\n      no: 5,\n      name: \"width\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    {\n      no: 6,\n      name: \"height\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    {\n      no: 7,\n      name: \"simulcast\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    {\n      no: 8,\n      name: \"disable_dtx\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    { no: 9, name: \"source\", kind: \"enum\", T: proto3.getEnumType(TrackSource) },\n    { no: 10, name: \"layers\", kind: \"message\", T: VideoLayer, repeated: true },\n    {\n      no: 11,\n      name: \"mime_type\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 12,\n      name: \"mid\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 13, name: \"codecs\", kind: \"message\", T: SimulcastCodecInfo, repeated: true },\n    {\n      no: 14,\n      name: \"stereo\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    {\n      no: 15,\n      name: \"disable_red\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    { no: 16, name: \"encryption\", kind: \"enum\", T: proto3.getEnumType(Encryption_Type) },\n    {\n      no: 17,\n      name: \"stream\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 18, name: \"version\", kind: \"message\", T: TimedVersion },\n    { no: 19, name: \"audio_features\", kind: \"enum\", T: proto3.getEnumType(AudioTrackFeature), repeated: true },\n    { no: 20, name: \"backup_codec_policy\", kind: \"enum\", T: proto3.getEnumType(BackupCodecPolicy) }\n  ]\n);\nconst VideoLayer = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.VideoLayer\",\n  () =\u003e [\n    { no: 1, name: \"quality\", kind: \"enum\", T: proto3.getEnumType(VideoQuality) },\n    {\n      no: 2,\n      name: \"width\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    {\n      no: 3,\n      name: \"height\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    {\n      no: 4,\n      name: \"bitrate\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    {\n      no: 5,\n      name: \"ssrc\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    {\n      no: 6,\n      name: \"spatial_layer\",\n      kind: \"scalar\",\n      T: 5\n      /* ScalarType.INT32 */\n    },\n    {\n      no: 7,\n      name: \"rid\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    }\n  ]\n);\nconst DataPacket = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.DataPacket\",\n  () =\u003e [\n    { no: 1, name: \"kind\", kind: \"enum\", T: proto3.getEnumType(DataPacket_Kind) },\n    {\n      no: 4,\n      name: \"participant_identity\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 5, name: \"destination_identities\", kind: \"scalar\", T: 9, repeated: true },\n    { no: 2, name: \"user\", kind: \"message\", T: UserPacket, oneof: \"value\" },\n    { no: 3, name: \"speaker\", kind: \"message\", T: ActiveSpeakerUpdate, oneof: \"value\" },\n    { no: 6, name: \"sip_dtmf\", kind: \"message\", T: SipDTMF, oneof: \"value\" },\n    { no: 7, name: \"transcription\", kind: \"message\", T: Transcription, oneof: \"value\" },\n    { no: 8, name: \"metrics\", kind: \"message\", T: MetricsBatch, oneof: \"value\" },\n    { no: 9, name: \"chat_message\", kind: \"message\", T: ChatMessage, oneof: \"value\" },\n    { no: 10, name: \"rpc_request\", kind: \"message\", T: RpcRequest, oneof: \"value\" },\n    { no: 11, name: \"rpc_ack\", kind: \"message\", T: RpcAck, oneof: \"value\" },\n    { no: 12, name: \"rpc_response\", kind: \"message\", T: RpcResponse, oneof: \"value\" },\n    { no: 13, name: \"stream_header\", kind: \"message\", T: DataStream_Header, oneof: \"value\" },\n    { no: 14, name: \"stream_chunk\", kind: \"message\", T: DataStream_Chunk, oneof: \"value\" },\n    { no: 15, name: \"stream_trailer\", kind: \"message\", T: DataStream_Trailer, oneof: \"value\" },\n    {\n      no: 16,\n      name: \"sequence\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    {\n      no: 17,\n      name: \"participant_sid\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    }\n  ]\n);\nconst DataPacket_Kind = /* @__PURE__ */ proto3.makeEnum(\n  \"livekit.DataPacket.Kind\",\n  [\n    { no: 0, name: \"RELIABLE\" },\n    { no: 1, name: \"LOSSY\" }\n  ]\n);\nconst ActiveSpeakerUpdate = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.ActiveSpeakerUpdate\",\n  () =\u003e [\n    { no: 1, name: \"speakers\", kind: \"message\", T: SpeakerInfo, repeated: true }\n  ]\n);\nconst SpeakerInfo = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.SpeakerInfo\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"sid\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"level\",\n      kind: \"scalar\",\n      T: 2\n      /* ScalarType.FLOAT */\n    },\n    {\n      no: 3,\n      name: \"active\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    }\n  ]\n);\nconst UserPacket = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.UserPacket\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"participant_sid\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 5,\n      name: \"participant_identity\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"payload\",\n      kind: \"scalar\",\n      T: 12\n      /* ScalarType.BYTES */\n    },\n    { no: 3, name: \"destination_sids\", kind: \"scalar\", T: 9, repeated: true },\n    { no: 6, name: \"destination_identities\", kind: \"scalar\", T: 9, repeated: true },\n    { no: 4, name: \"topic\", kind: \"scalar\", T: 9, opt: true },\n    { no: 8, name: \"id\", kind: \"scalar\", T: 9, opt: true },\n    { no: 9, name: \"start_time\", kind: \"scalar\", T: 4, opt: true },\n    { no: 10, name: \"end_time\", kind: \"scalar\", T: 4, opt: true },\n    {\n      no: 11,\n      name: \"nonce\",\n      kind: \"scalar\",\n      T: 12\n      /* ScalarType.BYTES */\n    }\n  ]\n);\nconst SipDTMF = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.SipDTMF\",\n  () =\u003e [\n    {\n      no: 3,\n      name: \"code\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    {\n      no: 4,\n      name: \"digit\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    }\n  ]\n);\nconst Transcription = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.Transcription\",\n  () =\u003e [\n    {\n      no: 2,\n      name: \"transcribed_participant_identity\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 3,\n      name: \"track_id\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 4, name: \"segments\", kind: \"message\", T: TranscriptionSegment, repeated: true }\n  ]\n);\nconst TranscriptionSegment = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.TranscriptionSegment\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"id\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"text\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 3,\n      name: \"start_time\",\n      kind: \"scalar\",\n      T: 4\n      /* ScalarType.UINT64 */\n    },\n    {\n      no: 4,\n      name: \"end_time\",\n      kind: \"scalar\",\n      T: 4\n      /* ScalarType.UINT64 */\n    },\n    {\n      no: 5,\n      name: \"final\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    {\n      no: 6,\n      name: \"language\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    }\n  ]\n);\nconst ChatMessage = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.ChatMessage\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"id\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"timestamp\",\n      kind: \"scalar\",\n      T: 3\n      /* ScalarType.INT64 */\n    },\n    { no: 3, name: \"edit_timestamp\", kind: \"scalar\", T: 3, opt: true },\n    {\n      no: 4,\n      name: \"message\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 5,\n      name: \"deleted\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    {\n      no: 6,\n      name: \"generated\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    }\n  ]\n);\nconst RpcRequest = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.RpcRequest\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"id\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"method\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 3,\n      name: \"payload\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 4,\n      name: \"response_timeout_ms\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    {\n      no: 5,\n      name: \"version\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    }\n  ]\n);\nconst RpcAck = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.RpcAck\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"request_id\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    }\n  ]\n);\nconst RpcResponse = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.RpcResponse\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"request_id\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 2, name: \"payload\", kind: \"scalar\", T: 9, oneof: \"value\" },\n    { no: 3, name: \"error\", kind: \"message\", T: RpcError, oneof: \"value\" }\n  ]\n);\nconst RpcError = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.RpcError\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"code\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    {\n      no: 2,\n      name: \"message\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 3,\n      name: \"data\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    }\n  ]\n);\nconst ParticipantTracks = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.ParticipantTracks\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"participant_sid\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 2, name: \"track_sids\", kind: \"scalar\", T: 9, repeated: true }\n  ]\n);\nconst ServerInfo = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.ServerInfo\",\n  () =\u003e [\n    { no: 1, name: \"edition\", kind: \"enum\", T: proto3.getEnumType(ServerInfo_Edition) },\n    {\n      no: 2,\n      name: \"version\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 3,\n      name: \"protocol\",\n      kind: \"scalar\",\n      T: 5\n      /* ScalarType.INT32 */\n    },\n    {\n      no: 4,\n      name: \"region\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 5,\n      name: \"node_id\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 6,\n      name: \"debug_info\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 7,\n      name: \"agent_protocol\",\n      kind: \"scalar\",\n      T: 5\n      /* ScalarType.INT32 */\n    }\n  ]\n);\nconst ServerInfo_Edition = /* @__PURE__ */ proto3.makeEnum(\n  \"livekit.ServerInfo.Edition\",\n  [\n    { no: 0, name: \"Standard\" },\n    { no: 1, name: \"Cloud\" }\n  ]\n);\nconst ClientInfo = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.ClientInfo\",\n  () =\u003e [\n    { no: 1, name: \"sdk\", kind: \"enum\", T: proto3.getEnumType(ClientInfo_SDK) },\n    {\n      no: 2,\n      name: \"version\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 3,\n      name: \"protocol\",\n      kind: \"scalar\",\n      T: 5\n      /* ScalarType.INT32 */\n    },\n    {\n      no: 4,\n      name: \"os\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 5,\n      name: \"os_version\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 6,\n      name: \"device_model\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 7,\n      name: \"browser\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 8,\n      name: \"browser_version\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 9,\n      name: \"address\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 10,\n      name: \"network\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 11,\n      name: \"other_sdks\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    }\n  ]\n);\nconst ClientInfo_SDK = /* @__PURE__ */ proto3.makeEnum(\n  \"livekit.ClientInfo.SDK\",\n  [\n    { no: 0, name: \"UNKNOWN\" },\n    { no: 1, name: \"JS\" },\n    { no: 2, name: \"SWIFT\" },\n    { no: 3, name: \"ANDROID\" },\n    { no: 4, name: \"FLUTTER\" },\n    { no: 5, name: \"GO\" },\n    { no: 6, name: \"UNITY\" },\n    { no: 7, name: \"REACT_NATIVE\" },\n    { no: 8, name: \"RUST\" },\n    { no: 9, name: \"PYTHON\" },\n    { no: 10, name: \"CPP\" },\n    { no: 11, name: \"UNITY_WEB\" },\n    { no: 12, name: \"NODE\" },\n    { no: 13, name: \"UNREAL\" },\n    { no: 14, name: \"ESP32\" }\n  ]\n);\nconst ClientConfiguration = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.ClientConfiguration\",\n  () =\u003e [\n    { no: 1, name: \"video\", kind: \"message\", T: VideoConfiguration },\n    { no: 2, name: \"screen\", kind: \"message\", T: VideoConfiguration },\n    { no: 3, name: \"resume_connection\", kind: \"enum\", T: proto3.getEnumType(ClientConfigSetting) },\n    { no: 4, name: \"disabled_codecs\", kind: \"message\", T: DisabledCodecs },\n    { no: 5, name: \"force_relay\", kind: \"enum\", T: proto3.getEnumType(ClientConfigSetting) }\n  ]\n);\nconst VideoConfiguration = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.VideoConfiguration\",\n  () =\u003e [\n    { no: 1, name: \"hardware_encoder\", kind: \"enum\", T: proto3.getEnumType(ClientConfigSetting) }\n  ]\n);\nconst DisabledCodecs = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.DisabledCodecs\",\n  () =\u003e [\n    { no: 1, name: \"codecs\", kind: \"message\", T: Codec, repeated: true },\n    { no: 2, name: \"publish\", kind: \"message\", T: Codec, repeated: true }\n  ]\n);\nconst RTPDrift = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.RTPDrift\",\n  () =\u003e [\n    { no: 1, name: \"start_time\", kind: \"message\", T: Timestamp },\n    { no: 2, name: \"end_time\", kind: \"message\", T: Timestamp },\n    {\n      no: 3,\n      name: \"duration\",\n      kind: \"scalar\",\n      T: 1\n      /* ScalarType.DOUBLE */\n    },\n    {\n      no: 4,\n      name: \"start_timestamp\",\n      kind: \"scalar\",\n      T: 4\n      /* ScalarType.UINT64 */\n    },\n    {\n      no: 5,\n      name: \"end_timestamp\",\n      kind: \"scalar\",\n      T: 4\n      /* ScalarType.UINT64 */\n    },\n    {\n      no: 6,\n      name: \"rtp_clock_ticks\",\n      kind: \"scalar\",\n      T: 4\n      /* ScalarType.UINT64 */\n    },\n    {\n      no: 7,\n      name: \"drift_samples\",\n      kind: \"scalar\",\n      T: 3\n      /* ScalarType.INT64 */\n    },\n    {\n      no: 8,\n      name: \"drift_ms\",\n      kind: \"scalar\",\n      T: 1\n      /* ScalarType.DOUBLE */\n    },\n    {\n      no: 9,\n      name: \"clock_rate\",\n      kind: \"scalar\",\n      T: 1\n      /* ScalarType.DOUBLE */\n    }\n  ]\n);\nconst RTPStats = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.RTPStats\",\n  () =\u003e [\n    { no: 1, name: \"start_time\", kind: \"message\", T: Timestamp },\n    { no: 2, name: \"end_time\", kind: \"message\", T: Timestamp },\n    {\n      no: 3,\n      name: \"duration\",\n      kind: \"scalar\",\n      T: 1\n      /* ScalarType.DOUBLE */\n    },\n    {\n      no: 4,\n      name: \"packets\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    {\n      no: 5,\n      name: \"packet_rate\",\n      kind: \"scalar\",\n      T: 1\n      /* ScalarType.DOUBLE */\n    },\n    {\n      no: 6,\n      name: \"bytes\",\n      kind: \"scalar\",\n      T: 4\n      /* ScalarType.UINT64 */\n    },\n    {\n      no: 39,\n      name: \"header_bytes\",\n      kind: \"scalar\",\n      T: 4\n      /* ScalarType.UINT64 */\n    },\n    {\n      no: 7,\n      name: \"bitrate\",\n      kind: \"scalar\",\n      T: 1\n      /* ScalarType.DOUBLE */\n    },\n    {\n      no: 8,\n      name: \"packets_lost\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    {\n      no: 9,\n      name: \"packet_loss_rate\",\n      kind: \"scalar\",\n      T: 1\n      /* ScalarType.DOUBLE */\n    },\n    {\n      no: 10,\n      name: \"packet_loss_percentage\",\n      kind: \"scalar\",\n      T: 2\n      /* ScalarType.FLOAT */\n    },\n    {\n      no: 11,\n      name: \"packets_duplicate\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    {\n      no: 12,\n      name: \"packet_duplicate_rate\",\n      kind: \"scalar\",\n      T: 1\n      /* ScalarType.DOUBLE */\n    },\n    {\n      no: 13,\n      name: \"bytes_duplicate\",\n      kind: \"scalar\",\n      T: 4\n      /* ScalarType.UINT64 */\n    },\n    {\n      no: 40,\n      name: \"header_bytes_duplicate\",\n      kind: \"scalar\",\n      T: 4\n      /* ScalarType.UINT64 */\n    },\n    {\n      no: 14,\n      name: \"bitrate_duplicate\",\n      kind: \"scalar\",\n      T: 1\n      /* ScalarType.DOUBLE */\n    },\n    {\n      no: 15,\n      name: \"packets_padding\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    {\n      no: 16,\n      name: \"packet_padding_rate\",\n      kind: \"scalar\",\n      T: 1\n      /* ScalarType.DOUBLE */\n    },\n    {\n      no: 17,\n      name: \"bytes_padding\",\n      kind: \"scalar\",\n      T: 4\n      /* ScalarType.UINT64 */\n    },\n    {\n      no: 41,\n      name: \"header_bytes_padding\",\n      kind: \"scalar\",\n      T: 4\n      /* ScalarType.UINT64 */\n    },\n    {\n      no: 18,\n      name: \"bitrate_padding\",\n      kind: \"scalar\",\n      T: 1\n      /* ScalarType.DOUBLE */\n    },\n    {\n      no: 19,\n      name: \"packets_out_of_order\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    {\n      no: 20,\n      name: \"frames\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    {\n      no: 21,\n      name: \"frame_rate\",\n      kind: \"scalar\",\n      T: 1\n      /* ScalarType.DOUBLE */\n    },\n    {\n      no: 22,\n      name: \"jitter_current\",\n      kind: \"scalar\",\n      T: 1\n      /* ScalarType.DOUBLE */\n    },\n    {\n      no: 23,\n      name: \"jitter_max\",\n      kind: \"scalar\",\n      T: 1\n      /* ScalarType.DOUBLE */\n    },\n    { no: 24, name: \"gap_histogram\", kind: \"map\", K: 5, V: {\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    } },\n    {\n      no: 25,\n      name: \"nacks\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    {\n      no: 37,\n      name: \"nack_acks\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    {\n      no: 26,\n      name: \"nack_misses\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    {\n      no: 38,\n      name: \"nack_repeated\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    {\n      no: 27,\n      name: \"plis\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    { no: 28, name: \"last_pli\", kind: \"message\", T: Timestamp },\n    {\n      no: 29,\n      name: \"firs\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    { no: 30, name: \"last_fir\", kind: \"message\", T: Timestamp },\n    {\n      no: 31,\n      name: \"rtt_current\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    {\n      no: 32,\n      name: \"rtt_max\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    {\n      no: 33,\n      name: \"key_frames\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    { no: 34, name: \"last_key_frame\", kind: \"message\", T: Timestamp },\n    {\n      no: 35,\n      name: \"layer_lock_plis\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    { no: 36, name: \"last_layer_lock_pli\", kind: \"message\", T: Timestamp },\n    { no: 44, name: \"packet_drift\", kind: \"message\", T: RTPDrift },\n    { no: 45, name: \"ntp_report_drift\", kind: \"message\", T: RTPDrift },\n    { no: 46, name: \"rebased_report_drift\", kind: \"message\", T: RTPDrift },\n    { no: 47, name: \"received_report_drift\", kind: \"message\", T: RTPDrift }\n  ]\n);\nconst RTCPSenderReportState = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.RTCPSenderReportState\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"rtp_timestamp\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    {\n      no: 2,\n      name: \"rtp_timestamp_ext\",\n      kind: \"scalar\",\n      T: 4\n      /* ScalarType.UINT64 */\n    },\n    {\n      no: 3,\n      name: \"ntp_timestamp\",\n      kind: \"scalar\",\n      T: 4\n      /* ScalarType.UINT64 */\n    },\n    {\n      no: 4,\n      name: \"at\",\n      kind: \"scalar\",\n      T: 3\n      /* ScalarType.INT64 */\n    },\n    {\n      no: 5,\n      name: \"at_adjusted\",\n      kind: \"scalar\",\n      T: 3\n      /* ScalarType.INT64 */\n    },\n    {\n      no: 6,\n      name: \"packets\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    {\n      no: 7,\n      name: \"octets\",\n      kind: \"scalar\",\n      T: 4\n      /* ScalarType.UINT64 */\n    }\n  ]\n);\nconst RTPForwarderState = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.RTPForwarderState\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"started\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    {\n      no: 2,\n      name: \"reference_layer_spatial\",\n      kind: \"scalar\",\n      T: 5\n      /* ScalarType.INT32 */\n    },\n    {\n      no: 3,\n      name: \"pre_start_time\",\n      kind: \"scalar\",\n      T: 3\n      /* ScalarType.INT64 */\n    },\n    {\n      no: 4,\n      name: \"ext_first_timestamp\",\n      kind: \"scalar\",\n      T: 4\n      /* ScalarType.UINT64 */\n    },\n    {\n      no: 5,\n      name: \"dummy_start_timestamp_offset\",\n      kind: \"scalar\",\n      T: 4\n      /* ScalarType.UINT64 */\n    },\n    { no: 6, name: \"rtp_munger\", kind: \"message\", T: RTPMungerState },\n    { no: 7, name: \"vp8_munger\", kind: \"message\", T: VP8MungerState, oneof: \"codec_munger\" },\n    { no: 8, name: \"sender_report_state\", kind: \"message\", T: RTCPSenderReportState, repeated: true }\n  ]\n);\nconst RTPMungerState = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.RTPMungerState\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"ext_last_sequence_number\",\n      kind: \"scalar\",\n      T: 4\n      /* ScalarType.UINT64 */\n    },\n    {\n      no: 2,\n      name: \"ext_second_last_sequence_number\",\n      kind: \"scalar\",\n      T: 4\n      /* ScalarType.UINT64 */\n    },\n    {\n      no: 3,\n      name: \"ext_last_timestamp\",\n      kind: \"scalar\",\n      T: 4\n      /* ScalarType.UINT64 */\n    },\n    {\n      no: 4,\n      name: \"ext_second_last_timestamp\",\n      kind: \"scalar\",\n      T: 4\n      /* ScalarType.UINT64 */\n    },\n    {\n      no: 5,\n      name: \"last_marker\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    {\n      no: 6,\n      name: \"second_last_marker\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    }\n  ]\n);\nconst VP8MungerState = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.VP8MungerState\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"ext_last_picture_id\",\n      kind: \"scalar\",\n      T: 5\n      /* ScalarType.INT32 */\n    },\n    {\n      no: 2,\n      name: \"picture_id_used\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    {\n      no: 3,\n      name: \"last_tl0_pic_idx\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    {\n      no: 4,\n      name: \"tl0_pic_idx_used\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    {\n      no: 5,\n      name: \"tid_used\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    {\n      no: 6,\n      name: \"last_key_idx\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    {\n      no: 7,\n      name: \"key_idx_used\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    }\n  ]\n);\nconst TimedVersion = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.TimedVersion\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"unix_micro\",\n      kind: \"scalar\",\n      T: 3\n      /* ScalarType.INT64 */\n    },\n    {\n      no: 2,\n      name: \"ticks\",\n      kind: \"scalar\",\n      T: 5\n      /* ScalarType.INT32 */\n    }\n  ]\n);\nconst DataStream = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.DataStream\",\n  []\n);\nconst DataStream_OperationType = /* @__PURE__ */ proto3.makeEnum(\n  \"livekit.DataStream.OperationType\",\n  [\n    { no: 0, name: \"CREATE\" },\n    { no: 1, name: \"UPDATE\" },\n    { no: 2, name: \"DELETE\" },\n    { no: 3, name: \"REACTION\" }\n  ]\n);\nconst DataStream_TextHeader = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.DataStream.TextHeader\",\n  () =\u003e [\n    { no: 1, name: \"operation_type\", kind: \"enum\", T: proto3.getEnumType(DataStream_OperationType) },\n    {\n      no: 2,\n      name: \"version\",\n      kind: \"scalar\",\n      T: 5\n      /* ScalarType.INT32 */\n    },\n    {\n      no: 3,\n      name: \"reply_to_stream_id\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 4, name: \"attached_stream_ids\", kind: \"scalar\", T: 9, repeated: true },\n    {\n      no: 5,\n      name: \"generated\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    }\n  ],\n  { localName: \"DataStream_TextHeader\" }\n);\nconst DataStream_ByteHeader = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.DataStream.ByteHeader\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"name\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    }\n  ],\n  { localName: \"DataStream_ByteHeader\" }\n);\nconst DataStream_Header = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.DataStream.Header\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"stream_id\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"timestamp\",\n      kind: \"scalar\",\n      T: 3\n      /* ScalarType.INT64 */\n    },\n    {\n      no: 3,\n      name: \"topic\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 4,\n      name: \"mime_type\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 5, name: \"total_length\", kind: \"scalar\", T: 4, opt: true },\n    { no: 7, name: \"encryption_type\", kind: \"enum\", T: proto3.getEnumType(Encryption_Type) },\n    { no: 8, name: \"attributes\", kind: \"map\", K: 9, V: {\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    } },\n    { no: 9, name: \"text_header\", kind: \"message\", T: DataStream_TextHeader, oneof: \"content_header\" },\n    { no: 10, name: \"byte_header\", kind: \"message\", T: DataStream_ByteHeader, oneof: \"content_header\" }\n  ],\n  { localName: \"DataStream_Header\" }\n);\nconst DataStream_Chunk = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.DataStream.Chunk\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"stream_id\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"chunk_index\",\n      kind: \"scalar\",\n      T: 4\n      /* ScalarType.UINT64 */\n    },\n    {\n      no: 3,\n      name: \"content\",\n      kind: \"scalar\",\n      T: 12\n      /* ScalarType.BYTES */\n    },\n    {\n      no: 4,\n      name: \"version\",\n      kind: \"scalar\",\n      T: 5\n      /* ScalarType.INT32 */\n    },\n    { no: 5, name: \"iv\", kind: \"scalar\", T: 12, opt: true }\n  ],\n  { localName: \"DataStream_Chunk\" }\n);\nconst DataStream_Trailer = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.DataStream.Trailer\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"stream_id\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"reason\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 3, name: \"attributes\", kind: \"map\", K: 9, V: {\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    } }\n  ],\n  { localName: \"DataStream_Trailer\" }\n);\nconst WebhookConfig = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.WebhookConfig\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"url\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"signing_key\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    }\n  ]\n);\n\nconst JobType = /* @__PURE__ */ proto3.makeEnum(\n  \"livekit.JobType\",\n  [\n    { no: 0, name: \"JT_ROOM\" },\n    { no: 1, name: \"JT_PUBLISHER\" },\n    { no: 2, name: \"JT_PARTICIPANT\" }\n  ]\n);\nconst WorkerStatus = /* @__PURE__ */ proto3.makeEnum(\n  \"livekit.WorkerStatus\",\n  [\n    { no: 0, name: \"WS_AVAILABLE\" },\n    { no: 1, name: \"WS_FULL\" }\n  ]\n);\nconst JobStatus = /* @__PURE__ */ proto3.makeEnum(\n  \"livekit.JobStatus\",\n  [\n    { no: 0, name: \"JS_PENDING\" },\n    { no: 1, name: \"JS_RUNNING\" },\n    { no: 2, name: \"JS_SUCCESS\" },\n    { no: 3, name: \"JS_FAILED\" }\n  ]\n);\nconst Job = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.Job\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"id\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 9,\n      name: \"dispatch_id\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 2, name: \"type\", kind: \"enum\", T: proto3.getEnumType(JobType) },\n    { no: 3, name: \"room\", kind: \"message\", T: Room },\n    { no: 4, name: \"participant\", kind: \"message\", T: ParticipantInfo, opt: true },\n    {\n      no: 5,\n      name: \"namespace\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 6,\n      name: \"metadata\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 7,\n      name: \"agent_name\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 8, name: \"state\", kind: \"message\", T: JobState }\n  ]\n);\nconst JobState = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.JobState\",\n  () =\u003e [\n    { no: 1, name: \"status\", kind: \"enum\", T: proto3.getEnumType(JobStatus) },\n    {\n      no: 2,\n      name: \"error\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 3,\n      name: \"started_at\",\n      kind: \"scalar\",\n      T: 3\n      /* ScalarType.INT64 */\n    },\n    {\n      no: 4,\n      name: \"ended_at\",\n      kind: \"scalar\",\n      T: 3\n      /* ScalarType.INT64 */\n    },\n    {\n      no: 5,\n      name: \"updated_at\",\n      kind: \"scalar\",\n      T: 3\n      /* ScalarType.INT64 */\n    },\n    {\n      no: 6,\n      name: \"participant_identity\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 7,\n      name: \"worker_id\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    }\n  ]\n);\nconst WorkerMessage = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.WorkerMessage\",\n  () =\u003e [\n    { no: 1, name: \"register\", kind: \"message\", T: RegisterWorkerRequest, oneof: \"message\" },\n    { no: 2, name: \"availability\", kind: \"message\", T: AvailabilityResponse, oneof: \"message\" },\n    { no: 3, name: \"update_worker\", kind: \"message\", T: UpdateWorkerStatus, oneof: \"message\" },\n    { no: 4, name: \"update_job\", kind: \"message\", T: UpdateJobStatus, oneof: \"message\" },\n    { no: 5, name: \"ping\", kind: \"message\", T: WorkerPing, oneof: \"message\" },\n    { no: 6, name: \"simulate_job\", kind: \"message\", T: SimulateJobRequest, oneof: \"message\" },\n    { no: 7, name: \"migrate_job\", kind: \"message\", T: MigrateJobRequest, oneof: \"message\" }\n  ]\n);\nconst ServerMessage = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.ServerMessage\",\n  () =\u003e [\n    { no: 1, name: \"register\", kind: \"message\", T: RegisterWorkerResponse, oneof: \"message\" },\n    { no: 2, name: \"availability\", kind: \"message\", T: AvailabilityRequest, oneof: \"message\" },\n    { no: 3, name: \"assignment\", kind: \"message\", T: JobAssignment, oneof: \"message\" },\n    { no: 5, name: \"termination\", kind: \"message\", T: JobTermination, oneof: \"message\" },\n    { no: 4, name: \"pong\", kind: \"message\", T: WorkerPong, oneof: \"message\" }\n  ]\n);\nconst SimulateJobRequest = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.SimulateJobRequest\",\n  () =\u003e [\n    { no: 1, name: \"type\", kind: \"enum\", T: proto3.getEnumType(JobType) },\n    { no: 2, name: \"room\", kind: \"message\", T: Room },\n    { no: 3, name: \"participant\", kind: \"message\", T: ParticipantInfo }\n  ]\n);\nconst WorkerPing = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.WorkerPing\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"timestamp\",\n      kind: \"scalar\",\n      T: 3\n      /* ScalarType.INT64 */\n    }\n  ]\n);\nconst WorkerPong = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.WorkerPong\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"last_timestamp\",\n      kind: \"scalar\",\n      T: 3\n      /* ScalarType.INT64 */\n    },\n    {\n      no: 2,\n      name: \"timestamp\",\n      kind: \"scalar\",\n      T: 3\n      /* ScalarType.INT64 */\n    }\n  ]\n);\nconst RegisterWorkerRequest = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.RegisterWorkerRequest\",\n  () =\u003e [\n    { no: 1, name: \"type\", kind: \"enum\", T: proto3.getEnumType(JobType) },\n    {\n      no: 8,\n      name: \"agent_name\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 3,\n      name: \"version\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 5,\n      name: \"ping_interval\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    { no: 6, name: \"namespace\", kind: \"scalar\", T: 9, opt: true },\n    { no: 7, name: \"allowed_permissions\", kind: \"message\", T: ParticipantPermission }\n  ]\n);\nconst RegisterWorkerResponse = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.RegisterWorkerResponse\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"worker_id\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 3, name: \"server_info\", kind: \"message\", T: ServerInfo }\n  ]\n);\nconst MigrateJobRequest = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.MigrateJobRequest\",\n  () =\u003e [\n    { no: 2, name: \"job_ids\", kind: \"scalar\", T: 9, repeated: true }\n  ]\n);\nconst AvailabilityRequest = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.AvailabilityRequest\",\n  () =\u003e [\n    { no: 1, name: \"job\", kind: \"message\", T: Job },\n    {\n      no: 2,\n      name: \"resuming\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    }\n  ]\n);\nconst AvailabilityResponse = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.AvailabilityResponse\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"job_id\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"available\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    {\n      no: 3,\n      name: \"supports_resume\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    {\n      no: 8,\n      name: \"terminate\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    {\n      no: 4,\n      name: \"participant_name\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 5,\n      name: \"participant_identity\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 6,\n      name: \"participant_metadata\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 7, name: \"participant_attributes\", kind: \"map\", K: 9, V: {\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    } }\n  ]\n);\nconst UpdateJobStatus = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.UpdateJobStatus\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"job_id\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 2, name: \"status\", kind: \"enum\", T: proto3.getEnumType(JobStatus) },\n    {\n      no: 3,\n      name: \"error\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    }\n  ]\n);\nconst UpdateWorkerStatus = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.UpdateWorkerStatus\",\n  () =\u003e [\n    { no: 1, name: \"status\", kind: \"enum\", T: proto3.getEnumType(WorkerStatus), opt: true },\n    {\n      no: 3,\n      name: \"load\",\n      kind: \"scalar\",\n      T: 2\n      /* ScalarType.FLOAT */\n    },\n    {\n      no: 4,\n      name: \"job_count\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    }\n  ]\n);\nconst JobAssignment = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.JobAssignment\",\n  () =\u003e [\n    { no: 1, name: \"job\", kind: \"message\", T: Job },\n    { no: 2, name: \"url\", kind: \"scalar\", T: 9, opt: true },\n    {\n      no: 3,\n      name: \"token\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    }\n  ]\n);\nconst JobTermination = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.JobTermination\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"job_id\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    }\n  ]\n);\n\nconst CreateAgentDispatchRequest = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.CreateAgentDispatchRequest\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"agent_name\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"room\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 3,\n      name: \"metadata\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    }\n  ]\n);\nconst RoomAgentDispatch = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.RoomAgentDispatch\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"agent_name\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"metadata\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    }\n  ]\n);\nconst DeleteAgentDispatchRequest = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.DeleteAgentDispatchRequest\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"dispatch_id\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"room\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    }\n  ]\n);\nconst ListAgentDispatchRequest = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.ListAgentDispatchRequest\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"dispatch_id\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"room\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    }\n  ]\n);\nconst ListAgentDispatchResponse = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.ListAgentDispatchResponse\",\n  () =\u003e [\n    { no: 1, name: \"agent_dispatches\", kind: \"message\", T: AgentDispatch, repeated: true }\n  ]\n);\nconst AgentDispatch = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.AgentDispatch\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"id\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"agent_name\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 3,\n      name: \"room\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 4,\n      name: \"metadata\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 5, name: \"state\", kind: \"message\", T: AgentDispatchState }\n  ]\n);\nconst AgentDispatchState = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.AgentDispatchState\",\n  () =\u003e [\n    { no: 1, name: \"jobs\", kind: \"message\", T: Job, repeated: true },\n    {\n      no: 2,\n      name: \"created_at\",\n      kind: \"scalar\",\n      T: 3\n      /* ScalarType.INT64 */\n    },\n    {\n      no: 3,\n      name: \"deleted_at\",\n      kind: \"scalar\",\n      T: 3\n      /* ScalarType.INT64 */\n    }\n  ]\n);\n\nconst EncodedFileType = /* @__PURE__ */ proto3.makeEnum(\n  \"livekit.EncodedFileType\",\n  [\n    { no: 0, name: \"DEFAULT_FILETYPE\" },\n    { no: 1, name: \"MP4\" },\n    { no: 2, name: \"OGG\" }\n  ]\n);\nconst SegmentedFileProtocol = /* @__PURE__ */ proto3.makeEnum(\n  \"livekit.SegmentedFileProtocol\",\n  [\n    { no: 0, name: \"DEFAULT_SEGMENTED_FILE_PROTOCOL\" },\n    { no: 1, name: \"HLS_PROTOCOL\" }\n  ]\n);\nconst SegmentedFileSuffix = /* @__PURE__ */ proto3.makeEnum(\n  \"livekit.SegmentedFileSuffix\",\n  [\n    { no: 0, name: \"INDEX\" },\n    { no: 1, name: \"TIMESTAMP\" }\n  ]\n);\nconst ImageFileSuffix = /* @__PURE__ */ proto3.makeEnum(\n  \"livekit.ImageFileSuffix\",\n  [\n    { no: 0, name: \"IMAGE_SUFFIX_INDEX\" },\n    { no: 1, name: \"IMAGE_SUFFIX_TIMESTAMP\" },\n    { no: 2, name: \"IMAGE_SUFFIX_NONE_OVERWRITE\" }\n  ]\n);\nconst StreamProtocol = /* @__PURE__ */ proto3.makeEnum(\n  \"livekit.StreamProtocol\",\n  [\n    { no: 0, name: \"DEFAULT_PROTOCOL\" },\n    { no: 1, name: \"RTMP\" },\n    { no: 2, name: \"SRT\" }\n  ]\n);\nconst AudioMixing = /* @__PURE__ */ proto3.makeEnum(\n  \"livekit.AudioMixing\",\n  [\n    { no: 0, name: \"DEFAULT_MIXING\" },\n    { no: 1, name: \"DUAL_CHANNEL_AGENT\" },\n    { no: 2, name: \"DUAL_CHANNEL_ALTERNATE\" }\n  ]\n);\nconst EncodingOptionsPreset = /* @__PURE__ */ proto3.makeEnum(\n  \"livekit.EncodingOptionsPreset\",\n  [\n    { no: 0, name: \"H264_720P_30\" },\n    { no: 1, name: \"H264_720P_60\" },\n    { no: 2, name: \"H264_1080P_30\" },\n    { no: 3, name: \"H264_1080P_60\" },\n    { no: 4, name: \"PORTRAIT_H264_720P_30\" },\n    { no: 5, name: \"PORTRAIT_H264_720P_60\" },\n    { no: 6, name: \"PORTRAIT_H264_1080P_30\" },\n    { no: 7, name: \"PORTRAIT_H264_1080P_60\" }\n  ]\n);\nconst EgressStatus = /* @__PURE__ */ proto3.makeEnum(\n  \"livekit.EgressStatus\",\n  [\n    { no: 0, name: \"EGRESS_STARTING\" },\n    { no: 1, name: \"EGRESS_ACTIVE\" },\n    { no: 2, name: \"EGRESS_ENDING\" },\n    { no: 3, name: \"EGRESS_COMPLETE\" },\n    { no: 4, name: \"EGRESS_FAILED\" },\n    { no: 5, name: \"EGRESS_ABORTED\" },\n    { no: 6, name: \"EGRESS_LIMIT_REACHED\" }\n  ]\n);\nconst EgressSourceType = /* @__PURE__ */ proto3.makeEnum(\n  \"livekit.EgressSourceType\",\n  [\n    { no: 0, name: \"EGRESS_SOURCE_TYPE_WEB\", localName: \"WEB\" },\n    { no: 1, name: \"EGRESS_SOURCE_TYPE_SDK\", localName: \"SDK\" }\n  ]\n);\nconst RoomCompositeEgressRequest = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.RoomCompositeEgressRequest\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"room_name\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"layout\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 3,\n      name: \"audio_only\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    { no: 15, name: \"audio_mixing\", kind: \"enum\", T: proto3.getEnumType(AudioMixing) },\n    {\n      no: 4,\n      name: \"video_only\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    {\n      no: 5,\n      name: \"custom_base_url\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 6, name: \"file\", kind: \"message\", T: EncodedFileOutput, oneof: \"output\" },\n    { no: 7, name: \"stream\", kind: \"message\", T: StreamOutput, oneof: \"output\" },\n    { no: 10, name: \"segments\", kind: \"message\", T: SegmentedFileOutput, oneof: \"output\" },\n    { no: 8, name: \"preset\", kind: \"enum\", T: proto3.getEnumType(EncodingOptionsPreset), oneof: \"options\" },\n    { no: 9, name: \"advanced\", kind: \"message\", T: EncodingOptions, oneof: \"options\" },\n    { no: 11, name: \"file_outputs\", kind: \"message\", T: EncodedFileOutput, repeated: true },\n    { no: 12, name: \"stream_outputs\", kind: \"message\", T: StreamOutput, repeated: true },\n    { no: 13, name: \"segment_outputs\", kind: \"message\", T: SegmentedFileOutput, repeated: true },\n    { no: 14, name: \"image_outputs\", kind: \"message\", T: ImageOutput, repeated: true },\n    { no: 16, name: \"webhooks\", kind: \"message\", T: WebhookConfig, repeated: true }\n  ]\n);\nconst WebEgressRequest = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.WebEgressRequest\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"url\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"audio_only\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    {\n      no: 3,\n      name: \"video_only\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    {\n      no: 12,\n      name: \"await_start_signal\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    { no: 4, name: \"file\", kind: \"message\", T: EncodedFileOutput, oneof: \"output\" },\n    { no: 5, name: \"stream\", kind: \"message\", T: StreamOutput, oneof: \"output\" },\n    { no: 6, name: \"segments\", kind: \"message\", T: SegmentedFileOutput, oneof: \"output\" },\n    { no: 7, name: \"preset\", kind: \"enum\", T: proto3.getEnumType(EncodingOptionsPreset), oneof: \"options\" },\n    { no: 8, name: \"advanced\", kind: \"message\", T: EncodingOptions, oneof: \"options\" },\n    { no: 9, name: \"file_outputs\", kind: \"message\", T: EncodedFileOutput, repeated: true },\n    { no: 10, name: \"stream_outputs\", kind: \"message\", T: StreamOutput, repeated: true },\n    { no: 11, name: \"segment_outputs\", kind: \"message\", T: SegmentedFileOutput, repeated: true },\n    { no: 13, name: \"image_outputs\", kind: \"message\", T: ImageOutput, repeated: true },\n    { no: 14, name: \"webhooks\", kind: \"message\", T: WebhookConfig, repeated: true }\n  ]\n);\nconst ParticipantEgressRequest = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.ParticipantEgressRequest\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"room_name\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"identity\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 3,\n      name: \"screen_share\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    { no: 4, name: \"preset\", kind: \"enum\", T: proto3.getEnumType(EncodingOptionsPreset), oneof: \"options\" },\n    { no: 5, name: \"advanced\", kind: \"message\", T: EncodingOptions, oneof: \"options\" },\n    { no: 6, name: \"file_outputs\", kind: \"message\", T: EncodedFileOutput, repeated: true },\n    { no: 7, name: \"stream_outputs\", kind: \"message\", T: StreamOutput, repeated: true },\n    { no: 8, name: \"segment_outputs\", kind: \"message\", T: SegmentedFileOutput, repeated: true },\n    { no: 9, name: \"image_outputs\", kind: \"message\", T: ImageOutput, repeated: true },\n    { no: 10, name: \"webhooks\", kind: \"message\", T: WebhookConfig, repeated: true }\n  ]\n);\nconst TrackCompositeEgressRequest = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.TrackCompositeEgressRequest\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"room_name\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"audio_track_id\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 3,\n      name: \"video_track_id\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 4, name: \"file\", kind: \"message\", T: EncodedFileOutput, oneof: \"output\" },\n    { no: 5, name: \"stream\", kind: \"message\", T: StreamOutput, oneof: \"output\" },\n    { no: 8, name: \"segments\", kind: \"message\", T: SegmentedFileOutput, oneof: \"output\" },\n    { no: 6, name: \"preset\", kind: \"enum\", T: proto3.getEnumType(EncodingOptionsPreset), oneof: \"options\" },\n    { no: 7, name: \"advanced\", kind: \"message\", T: EncodingOptions, oneof: \"options\" },\n    { no: 11, name: \"file_outputs\", kind: \"message\", T: EncodedFileOutput, repeated: true },\n    { no: 12, name: \"stream_outputs\", kind: \"message\", T: StreamOutput, repeated: true },\n    { no: 13, name: \"segment_outputs\", kind: \"message\", T: SegmentedFileOutput, repeated: true },\n    { no: 14, name: \"image_outputs\", kind: \"message\", T: ImageOutput, repeated: true },\n    { no: 15, name: \"webhooks\", kind: \"message\", T: WebhookConfig, repeated: true }\n  ]\n);\nconst TrackEgressRequest = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.TrackEgressRequest\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"room_name\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"track_id\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 3, name: \"file\", kind: \"message\", T: DirectFileOutput, oneof: \"output\" },\n    { no: 4, name: \"websocket_url\", kind: \"scalar\", T: 9, oneof: \"output\" },\n    { no: 5, name: \"webhooks\", kind: \"message\", T: WebhookConfig, repeated: true }\n  ]\n);\nconst EncodedFileOutput = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.EncodedFileOutput\",\n  () =\u003e [\n    { no: 1, name: \"file_type\", kind: \"enum\", T: proto3.getEnumType(EncodedFileType) },\n    {\n      no: 2,\n      name: \"filepath\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 6,\n      name: \"disable_manifest\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    { no: 3, name: \"s3\", kind: \"message\", T: S3Upload, oneof: \"output\" },\n    { no: 4, name: \"gcp\", kind: \"message\", T: GCPUpload, oneof: \"output\" },\n    { no: 5, name: \"azure\", kind: \"message\", T: AzureBlobUpload, oneof: \"output\" },\n    { no: 7, name: \"aliOSS\", kind: \"message\", T: AliOSSUpload, oneof: \"output\" }\n  ]\n);\nconst SegmentedFileOutput = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.SegmentedFileOutput\",\n  () =\u003e [\n    { no: 1, name: \"protocol\", kind: \"enum\", T: proto3.getEnumType(SegmentedFileProtocol) },\n    {\n      no: 2,\n      name: \"filename_prefix\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 3,\n      name: \"playlist_name\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 11,\n      name: \"live_playlist_name\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 4,\n      name: \"segment_duration\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    { no: 10, name: \"filename_suffix\", kind: \"enum\", T: proto3.getEnumType(SegmentedFileSuffix) },\n    {\n      no: 8,\n      name: \"disable_manifest\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    { no: 5, name: \"s3\", kind: \"message\", T: S3Upload, oneof: \"output\" },\n    { no: 6, name: \"gcp\", kind: \"message\", T: GCPUpload, oneof: \"output\" },\n    { no: 7, name: \"azure\", kind: \"message\", T: AzureBlobUpload, oneof: \"output\" },\n    { no: 9, name: \"aliOSS\", kind: \"message\", T: AliOSSUpload, oneof: \"output\" }\n  ]\n);\nconst DirectFileOutput = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.DirectFileOutput\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"filepath\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 5,\n      name: \"disable_manifest\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    { no: 2, name: \"s3\", kind: \"message\", T: S3Upload, oneof: \"output\" },\n    { no: 3, name: \"gcp\", kind: \"message\", T: GCPUpload, oneof: \"output\" },\n    { no: 4, name: \"azure\", kind: \"message\", T: AzureBlobUpload, oneof: \"output\" },\n    { no: 6, name: \"aliOSS\", kind: \"message\", T: AliOSSUpload, oneof: \"output\" }\n  ]\n);\nconst ImageOutput = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.ImageOutput\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"capture_interval\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    {\n      no: 2,\n      name: \"width\",\n      kind: \"scalar\",\n      T: 5\n      /* ScalarType.INT32 */\n    },\n    {\n      no: 3,\n      name: \"height\",\n      kind: \"scalar\",\n      T: 5\n      /* ScalarType.INT32 */\n    },\n    {\n      no: 4,\n      name: \"filename_prefix\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 5, name: \"filename_suffix\", kind: \"enum\", T: proto3.getEnumType(ImageFileSuffix) },\n    { no: 6, name: \"image_codec\", kind: \"enum\", T: proto3.getEnumType(ImageCodec) },\n    {\n      no: 7,\n      name: \"disable_manifest\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    { no: 8, name: \"s3\", kind: \"message\", T: S3Upload, oneof: \"output\" },\n    { no: 9, name: \"gcp\", kind: \"message\", T: GCPUpload, oneof: \"output\" },\n    { no: 10, name: \"azure\", kind: \"message\", T: AzureBlobUpload, oneof: \"output\" },\n    { no: 11, name: \"aliOSS\", kind: \"message\", T: AliOSSUpload, oneof: \"output\" }\n  ]\n);\nconst S3Upload = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.S3Upload\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"access_key\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"secret\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 11,\n      name: \"session_token\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 3,\n      name: \"region\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 4,\n      name: \"endpoint\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 5,\n      name: \"bucket\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 6,\n      name: \"force_path_style\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    { no: 7, name: \"metadata\", kind: \"map\", K: 9, V: {\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    } },\n    {\n      no: 8,\n      name: \"tagging\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 9,\n      name: \"content_disposition\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 10, name: \"proxy\", kind: \"message\", T: ProxyConfig }\n  ]\n);\nconst GCPUpload = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.GCPUpload\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"credentials\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"bucket\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 3, name: \"proxy\", kind: \"message\", T: ProxyConfig }\n  ]\n);\nconst AzureBlobUpload = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.AzureBlobUpload\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"account_name\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"account_key\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 3,\n      name: \"container_name\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    }\n  ]\n);\nconst AliOSSUpload = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.AliOSSUpload\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"access_key\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"secret\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 3,\n      name: \"region\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 4,\n      name: \"endpoint\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 5,\n      name: \"bucket\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    }\n  ]\n);\nconst ProxyConfig = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.ProxyConfig\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"url\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"username\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 3,\n      name: \"password\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    }\n  ]\n);\nconst StreamOutput = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.StreamOutput\",\n  () =\u003e [\n    { no: 1, name: \"protocol\", kind: \"enum\", T: proto3.getEnumType(StreamProtocol) },\n    { no: 2, name: \"urls\", kind: \"scalar\", T: 9, repeated: true }\n  ]\n);\nconst EncodingOptions = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.EncodingOptions\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"width\",\n      kind: \"scalar\",\n      T: 5\n      /* ScalarType.INT32 */\n    },\n    {\n      no: 2,\n      name: \"height\",\n      kind: \"scalar\",\n      T: 5\n      /* ScalarType.INT32 */\n    },\n    {\n      no: 3,\n      name: \"depth\",\n      kind: \"scalar\",\n      T: 5\n      /* ScalarType.INT32 */\n    },\n    {\n      no: 4,\n      name: \"framerate\",\n      kind: \"scalar\",\n      T: 5\n      /* ScalarType.INT32 */\n    },\n    { no: 5, name: \"audio_codec\", kind: \"enum\", T: proto3.getEnumType(AudioCodec) },\n    {\n      no: 6,\n      name: \"audio_bitrate\",\n      kind: \"scalar\",\n      T: 5\n      /* ScalarType.INT32 */\n    },\n    {\n      no: 11,\n      name: \"audio_quality\",\n      kind: \"scalar\",\n      T: 5\n      /* ScalarType.INT32 */\n    },\n    {\n      no: 7,\n      name: \"audio_frequency\",\n      kind: \"scalar\",\n      T: 5\n      /* ScalarType.INT32 */\n    },\n    { no: 8, name: \"video_codec\", kind: \"enum\", T: proto3.getEnumType(VideoCodec) },\n    {\n      no: 9,\n      name: \"video_bitrate\",\n      kind: \"scalar\",\n      T: 5\n      /* ScalarType.INT32 */\n    },\n    {\n      no: 12,\n      name: \"video_quality\",\n      kind: \"scalar\",\n      T: 5\n      /* ScalarType.INT32 */\n    },\n    {\n      no: 10,\n      name: \"key_frame_interval\",\n      kind: \"scalar\",\n      T: 1\n      /* ScalarType.DOUBLE */\n    }\n  ]\n);\nconst UpdateLayoutRequest = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.UpdateLayoutRequest\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"egress_id\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"layout\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    }\n  ]\n);\nconst UpdateStreamRequest = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.UpdateStreamRequest\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"egress_id\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 2, name: \"add_output_urls\", kind: \"scalar\", T: 9, repeated: true },\n    { no: 3, name: \"remove_output_urls\", kind: \"scalar\", T: 9, repeated: true }\n  ]\n);\nconst ListEgressRequest = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.ListEgressRequest\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"room_name\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"egress_id\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 3,\n      name: \"active\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    }\n  ]\n);\nconst ListEgressResponse = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.ListEgressResponse\",\n  () =\u003e [\n    { no: 1, name: \"items\", kind: \"message\", T: EgressInfo, repeated: true }\n  ]\n);\nconst StopEgressRequest = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.StopEgressRequest\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"egress_id\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    }\n  ]\n);\nconst EgressInfo = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.EgressInfo\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"egress_id\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"room_id\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 13,\n      name: \"room_name\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 26, name: \"source_type\", kind: \"enum\", T: proto3.getEnumType(EgressSourceType) },\n    { no: 3, name: \"status\", kind: \"enum\", T: proto3.getEnumType(EgressStatus) },\n    {\n      no: 10,\n      name: \"started_at\",\n      kind: \"scalar\",\n      T: 3\n      /* ScalarType.INT64 */\n    },\n    {\n      no: 11,\n      name: \"ended_at\",\n      kind: \"scalar\",\n      T: 3\n      /* ScalarType.INT64 */\n    },\n    {\n      no: 18,\n      name: \"updated_at\",\n      kind: \"scalar\",\n      T: 3\n      /* ScalarType.INT64 */\n    },\n    {\n      no: 21,\n      name: \"details\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 9,\n      name: \"error\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 22,\n      name: \"error_code\",\n      kind: \"scalar\",\n      T: 5\n      /* ScalarType.INT32 */\n    },\n    { no: 4, name: \"room_composite\", kind: \"message\", T: RoomCompositeEgressRequest, oneof: \"request\" },\n    { no: 14, name: \"web\", kind: \"message\", T: WebEgressRequest, oneof: \"request\" },\n    { no: 19, name: \"participant\", kind: \"message\", T: ParticipantEgressRequest, oneof: \"request\" },\n    { no: 5, name: \"track_composite\", kind: \"message\", T: TrackCompositeEgressRequest, oneof: \"request\" },\n    { no: 6, name: \"track\", kind: \"message\", T: TrackEgressRequest, oneof: \"request\" },\n    { no: 7, name: \"stream\", kind: \"message\", T: StreamInfoList, oneof: \"result\" },\n    { no: 8, name: \"file\", kind: \"message\", T: FileInfo, oneof: \"result\" },\n    { no: 12, name: \"segments\", kind: \"message\", T: SegmentsInfo, oneof: \"result\" },\n    { no: 15, name: \"stream_results\", kind: \"message\", T: StreamInfo, repeated: true },\n    { no: 16, name: \"file_results\", kind: \"message\", T: FileInfo, repeated: true },\n    { no: 17, name: \"segment_results\", kind: \"message\", T: SegmentsInfo, repeated: true },\n    { no: 20, name: \"image_results\", kind: \"message\", T: ImagesInfo, repeated: true },\n    {\n      no: 23,\n      name: \"manifest_location\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 25,\n      name: \"backup_storage_used\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    }\n  ]\n);\nconst StreamInfoList = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.StreamInfoList\",\n  () =\u003e [\n    { no: 1, name: \"info\", kind: \"message\", T: StreamInfo, repeated: true }\n  ]\n);\nconst StreamInfo = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.StreamInfo\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"url\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"started_at\",\n      kind: \"scalar\",\n      T: 3\n      /* ScalarType.INT64 */\n    },\n    {\n      no: 3,\n      name: \"ended_at\",\n      kind: \"scalar\",\n      T: 3\n      /* ScalarType.INT64 */\n    },\n    {\n      no: 4,\n      name: \"duration\",\n      kind: \"scalar\",\n      T: 3\n      /* ScalarType.INT64 */\n    },\n    { no: 5, name: \"status\", kind: \"enum\", T: proto3.getEnumType(StreamInfo_Status) },\n    {\n      no: 6,\n      name: \"error\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    }\n  ]\n);\nconst StreamInfo_Status = /* @__PURE__ */ proto3.makeEnum(\n  \"livekit.StreamInfo.Status\",\n  [\n    { no: 0, name: \"ACTIVE\" },\n    { no: 1, name: \"FINISHED\" },\n    { no: 2, name: \"FAILED\" }\n  ]\n);\nconst FileInfo = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.FileInfo\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"filename\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"started_at\",\n      kind: \"scalar\",\n      T: 3\n      /* ScalarType.INT64 */\n    },\n    {\n      no: 3,\n      name: \"ended_at\",\n      kind: \"scalar\",\n      T: 3\n      /* ScalarType.INT64 */\n    },\n    {\n      no: 6,\n      name: \"duration\",\n      kind: \"scalar\",\n      T: 3\n      /* ScalarType.INT64 */\n    },\n    {\n      no: 4,\n      name: \"size\",\n      kind: \"scalar\",\n      T: 3\n      /* ScalarType.INT64 */\n    },\n    {\n      no: 5,\n      name: \"location\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    }\n  ]\n);\nconst SegmentsInfo = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.SegmentsInfo\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"playlist_name\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 8,\n      name: \"live_playlist_name\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"duration\",\n      kind: \"scalar\",\n      T: 3\n      /* ScalarType.INT64 */\n    },\n    {\n      no: 3,\n      name: \"size\",\n      kind: \"scalar\",\n      T: 3\n      /* ScalarType.INT64 */\n    },\n    {\n      no: 4,\n      name: \"playlist_location\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 9,\n      name: \"live_playlist_location\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 5,\n      name: \"segment_count\",\n      kind: \"scalar\",\n      T: 3\n      /* ScalarType.INT64 */\n    },\n    {\n      no: 6,\n      name: \"started_at\",\n      kind: \"scalar\",\n      T: 3\n      /* ScalarType.INT64 */\n    },\n    {\n      no: 7,\n      name: \"ended_at\",\n      kind: \"scalar\",\n      T: 3\n      /* ScalarType.INT64 */\n    }\n  ]\n);\nconst ImagesInfo = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.ImagesInfo\",\n  () =\u003e [\n    {\n      no: 4,\n      name: \"filename_prefix\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 1,\n      name: \"image_count\",\n      kind: \"scalar\",\n      T: 3\n      /* ScalarType.INT64 */\n    },\n    {\n      no: 2,\n      name: \"started_at\",\n      kind: \"scalar\",\n      T: 3\n      /* ScalarType.INT64 */\n    },\n    {\n      no: 3,\n      name: \"ended_at\",\n      kind: \"scalar\",\n      T: 3\n      /* ScalarType.INT64 */\n    }\n  ]\n);\nconst AutoParticipantEgress = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.AutoParticipantEgress\",\n  () =\u003e [\n    { no: 1, name: \"preset\", kind: \"enum\", T: proto3.getEnumType(EncodingOptionsPreset), oneof: \"options\" },\n    { no: 2, name: \"advanced\", kind: \"message\", T: EncodingOptions, oneof: \"options\" },\n    { no: 3, name: \"file_outputs\", kind: \"message\", T: EncodedFileOutput, repeated: true },\n    { no: 4, name: \"segment_outputs\", kind: \"message\", T: SegmentedFileOutput, repeated: true }\n  ]\n);\nconst AutoTrackEgress = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.AutoTrackEgress\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"filepath\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 5,\n      name: \"disable_manifest\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    { no: 2, name: \"s3\", kind: \"message\", T: S3Upload, oneof: \"output\" },\n    { no: 3, name: \"gcp\", kind: \"message\", T: GCPUpload, oneof: \"output\" },\n    { no: 4, name: \"azure\", kind: \"message\", T: AzureBlobUpload, oneof: \"output\" },\n    { no: 6, name: \"aliOSS\", kind: \"message\", T: AliOSSUpload, oneof: \"output\" }\n  ]\n);\n\nconst IngressInput = /* @__PURE__ */ proto3.makeEnum(\n  \"livekit.IngressInput\",\n  [\n    { no: 0, name: \"RTMP_INPUT\" },\n    { no: 1, name: \"WHIP_INPUT\" },\n    { no: 2, name: \"URL_INPUT\" }\n  ]\n);\nconst IngressAudioEncodingPreset = /* @__PURE__ */ proto3.makeEnum(\n  \"livekit.IngressAudioEncodingPreset\",\n  [\n    { no: 0, name: \"OPUS_STEREO_96KBPS\" },\n    { no: 1, name: \"OPUS_MONO_64KBS\" }\n  ]\n);\nconst IngressVideoEncodingPreset = /* @__PURE__ */ proto3.makeEnum(\n  \"livekit.IngressVideoEncodingPreset\",\n  [\n    { no: 0, name: \"H264_720P_30FPS_3_LAYERS\" },\n    { no: 1, name: \"H264_1080P_30FPS_3_LAYERS\" },\n    { no: 2, name: \"H264_540P_25FPS_2_LAYERS\" },\n    { no: 3, name: \"H264_720P_30FPS_1_LAYER\" },\n    { no: 4, name: \"H264_1080P_30FPS_1_LAYER\" },\n    { no: 5, name: \"H264_720P_30FPS_3_LAYERS_HIGH_MOTION\" },\n    { no: 6, name: \"H264_1080P_30FPS_3_LAYERS_HIGH_MOTION\" },\n    { no: 7, name: \"H264_540P_25FPS_2_LAYERS_HIGH_MOTION\" },\n    { no: 8, name: \"H264_720P_30FPS_1_LAYER_HIGH_MOTION\" },\n    { no: 9, name: \"H264_1080P_30FPS_1_LAYER_HIGH_MOTION\" }\n  ]\n);\nconst CreateIngressRequest = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.CreateIngressRequest\",\n  () =\u003e [\n    { no: 1, name: \"input_type\", kind: \"enum\", T: proto3.getEnumType(IngressInput) },\n    {\n      no: 9,\n      name: \"url\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"name\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 3,\n      name: \"room_name\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 4,\n      name: \"participant_identity\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 5,\n      name: \"participant_name\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 10,\n      name: \"participant_metadata\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 8,\n      name: \"bypass_transcoding\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    { no: 11, name: \"enable_transcoding\", kind: \"scalar\", T: 8, opt: true },\n    { no: 6, name: \"audio\", kind: \"message\", T: IngressAudioOptions },\n    { no: 7, name: \"video\", kind: \"message\", T: IngressVideoOptions },\n    { no: 12, name: \"enabled\", kind: \"scalar\", T: 8, opt: true }\n  ]\n);\nconst IngressAudioOptions = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.IngressAudioOptions\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"name\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 2, name: \"source\", kind: \"enum\", T: proto3.getEnumType(TrackSource) },\n    { no: 3, name: \"preset\", kind: \"enum\", T: proto3.getEnumType(IngressAudioEncodingPreset), oneof: \"encoding_options\" },\n    { no: 4, name: \"options\", kind: \"message\", T: IngressAudioEncodingOptions, oneof: \"encoding_options\" }\n  ]\n);\nconst IngressVideoOptions = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.IngressVideoOptions\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"name\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 2, name: \"source\", kind: \"enum\", T: proto3.getEnumType(TrackSource) },\n    { no: 3, name: \"preset\", kind: \"enum\", T: proto3.getEnumType(IngressVideoEncodingPreset), oneof: \"encoding_options\" },\n    { no: 4, name: \"options\", kind: \"message\", T: IngressVideoEncodingOptions, oneof: \"encoding_options\" }\n  ]\n);\nconst IngressAudioEncodingOptions = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.IngressAudioEncodingOptions\",\n  () =\u003e [\n    { no: 1, name: \"audio_codec\", kind: \"enum\", T: proto3.getEnumType(AudioCodec) },\n    {\n      no: 2,\n      name: \"bitrate\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    {\n      no: 3,\n      name: \"disable_dtx\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    {\n      no: 4,\n      name: \"channels\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    }\n  ]\n);\nconst IngressVideoEncodingOptions = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.IngressVideoEncodingOptions\",\n  () =\u003e [\n    { no: 1, name: \"video_codec\", kind: \"enum\", T: proto3.getEnumType(VideoCodec) },\n    {\n      no: 2,\n      name: \"frame_rate\",\n      kind: \"scalar\",\n      T: 1\n      /* ScalarType.DOUBLE */\n    },\n    { no: 3, name: \"layers\", kind: \"message\", T: VideoLayer, repeated: true }\n  ]\n);\nconst IngressInfo = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.IngressInfo\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"ingress_id\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"name\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 3,\n      name: \"stream_key\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 4,\n      name: \"url\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 5, name: \"input_type\", kind: \"enum\", T: proto3.getEnumType(IngressInput) },\n    {\n      no: 13,\n      name: \"bypass_transcoding\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    { no: 15, name: \"enable_transcoding\", kind: \"scalar\", T: 8, opt: true },\n    { no: 6, name: \"audio\", kind: \"message\", T: IngressAudioOptions },\n    { no: 7, name: \"video\", kind: \"message\", T: IngressVideoOptions },\n    {\n      no: 8,\n      name: \"room_name\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 9,\n      name: \"participant_identity\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 10,\n      name: \"participant_name\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 14,\n      name: \"participant_metadata\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 11,\n      name: \"reusable\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    { no: 12, name: \"state\", kind: \"message\", T: IngressState },\n    { no: 16, name: \"enabled\", kind: \"scalar\", T: 8, opt: true }\n  ]\n);\nconst IngressState = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.IngressState\",\n  () =\u003e [\n    { no: 1, name: \"status\", kind: \"enum\", T: proto3.getEnumType(IngressState_Status) },\n    {\n      no: 2,\n      name: \"error\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 3, name: \"video\", kind: \"message\", T: InputVideoState },\n    { no: 4, name: \"audio\", kind: \"message\", T: InputAudioState },\n    {\n      no: 5,\n      name: \"room_id\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 7,\n      name: \"started_at\",\n      kind: \"scalar\",\n      T: 3\n      /* ScalarType.INT64 */\n    },\n    {\n      no: 8,\n      name: \"ended_at\",\n      kind: \"scalar\",\n      T: 3\n      /* ScalarType.INT64 */\n    },\n    {\n      no: 10,\n      name: \"updated_at\",\n      kind: \"scalar\",\n      T: 3\n      /* ScalarType.INT64 */\n    },\n    {\n      no: 9,\n      name: \"resource_id\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 6, name: \"tracks\", kind: \"message\", T: TrackInfo, repeated: true }\n  ]\n);\nconst IngressState_Status = /* @__PURE__ */ proto3.makeEnum(\n  \"livekit.IngressState.Status\",\n  [\n    { no: 0, name: \"ENDPOINT_INACTIVE\" },\n    { no: 1, name: \"ENDPOINT_BUFFERING\" },\n    { no: 2, name: \"ENDPOINT_PUBLISHING\" },\n    { no: 3, name: \"ENDPOINT_ERROR\" },\n    { no: 4, name: \"ENDPOINT_COMPLETE\" }\n  ]\n);\nconst InputVideoState = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.InputVideoState\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"mime_type\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"average_bitrate\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    {\n      no: 3,\n      name: \"width\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    {\n      no: 4,\n      name: \"height\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    {\n      no: 5,\n      name: \"framerate\",\n      kind: \"scalar\",\n      T: 1\n      /* ScalarType.DOUBLE */\n    }\n  ]\n);\nconst InputAudioState = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.InputAudioState\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"mime_type\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"average_bitrate\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    {\n      no: 3,\n      name: \"channels\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    {\n      no: 4,\n      name: \"sample_rate\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    }\n  ]\n);\nconst UpdateIngressRequest = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.UpdateIngressRequest\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"ingress_id\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"name\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 3,\n      name: \"room_name\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 4,\n      name: \"participant_identity\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 5,\n      name: \"participant_name\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 9,\n      name: \"participant_metadata\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 8, name: \"bypass_transcoding\", kind: \"scalar\", T: 8, opt: true },\n    { no: 10, name: \"enable_transcoding\", kind: \"scalar\", T: 8, opt: true },\n    { no: 6, name: \"audio\", kind: \"message\", T: IngressAudioOptions },\n    { no: 7, name: \"video\", kind: \"message\", T: IngressVideoOptions },\n    { no: 11, name: \"enabled\", kind: \"scalar\", T: 8, opt: true }\n  ]\n);\nconst ListIngressRequest = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.ListIngressRequest\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"room_name\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"ingress_id\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    }\n  ]\n);\nconst ListIngressResponse = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.ListIngressResponse\",\n  () =\u003e [\n    { no: 1, name: \"items\", kind: \"message\", T: IngressInfo, repeated: true }\n  ]\n);\nconst DeleteIngressRequest = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.DeleteIngressRequest\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"ingress_id\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    }\n  ]\n);\n\nconst CreateRoomRequest = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.CreateRoomRequest\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"name\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 12,\n      name: \"room_preset\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"empty_timeout\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    {\n      no: 10,\n      name: \"departure_timeout\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    {\n      no: 3,\n      name: \"max_participants\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    {\n      no: 4,\n      name: \"node_id\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 5,\n      name: \"metadata\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 6, name: \"egress\", kind: \"message\", T: RoomEgress },\n    {\n      no: 7,\n      name: \"min_playout_delay\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    {\n      no: 8,\n      name: \"max_playout_delay\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    {\n      no: 9,\n      name: \"sync_streams\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    {\n      no: 13,\n      name: \"replay_enabled\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    { no: 14, name: \"agents\", kind: \"message\", T: RoomAgentDispatch, repeated: true }\n  ]\n);\nconst RoomEgress = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.RoomEgress\",\n  () =\u003e [\n    { no: 1, name: \"room\", kind: \"message\", T: RoomCompositeEgressRequest },\n    { no: 3, name: \"participant\", kind: \"message\", T: AutoParticipantEgress },\n    { no: 2, name: \"tracks\", kind: \"message\", T: AutoTrackEgress }\n  ]\n);\nconst RoomAgent = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.RoomAgent\",\n  () =\u003e [\n    { no: 1, name: \"dispatches\", kind: \"message\", T: RoomAgentDispatch, repeated: true }\n  ]\n);\nconst ListRoomsRequest = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.ListRoomsRequest\",\n  () =\u003e [\n    { no: 1, name: \"names\", kind: \"scalar\", T: 9, repeated: true }\n  ]\n);\nconst ListRoomsResponse = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.ListRoomsResponse\",\n  () =\u003e [\n    { no: 1, name: \"rooms\", kind: \"message\", T: Room, repeated: true }\n  ]\n);\nconst DeleteRoomRequest = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.DeleteRoomRequest\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"room\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    }\n  ]\n);\nconst DeleteRoomResponse = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.DeleteRoomResponse\",\n  []\n);\nconst ListParticipantsRequest = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.ListParticipantsRequest\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"room\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    }\n  ]\n);\nconst ListParticipantsResponse = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.ListParticipantsResponse\",\n  () =\u003e [\n    { no: 1, name: \"participants\", kind: \"message\", T: ParticipantInfo, repeated: true }\n  ]\n);\nconst RoomParticipantIdentity = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.RoomParticipantIdentity\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"room\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"identity\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    }\n  ]\n);\nconst RemoveParticipantResponse = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.RemoveParticipantResponse\",\n  []\n);\nconst MuteRoomTrackRequest = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.MuteRoomTrackRequest\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"room\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"identity\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 3,\n      name: \"track_sid\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 4,\n      name: \"muted\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    }\n  ]\n);\nconst MuteRoomTrackResponse = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.MuteRoomTrackResponse\",\n  () =\u003e [\n    { no: 1, name: \"track\", kind: \"message\", T: TrackInfo }\n  ]\n);\nconst UpdateParticipantRequest = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.UpdateParticipantRequest\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"room\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"identity\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 3,\n      name: \"metadata\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 4, name: \"permission\", kind: \"message\", T: ParticipantPermission },\n    {\n      no: 5,\n      name: \"name\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 6, name: \"attributes\", kind: \"map\", K: 9, V: {\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    } }\n  ]\n);\nconst UpdateSubscriptionsRequest = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.UpdateSubscriptionsRequest\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"room\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"identity\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 3, name: \"track_sids\", kind: \"scalar\", T: 9, repeated: true },\n    {\n      no: 4,\n      name: \"subscribe\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    { no: 5, name: \"participant_tracks\", kind: \"message\", T: ParticipantTracks, repeated: true }\n  ]\n);\nconst UpdateSubscriptionsResponse = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.UpdateSubscriptionsResponse\",\n  []\n);\nconst SendDataRequest = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.SendDataRequest\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"room\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"data\",\n      kind: \"scalar\",\n      T: 12\n      /* ScalarType.BYTES */\n    },\n    { no: 3, name: \"kind\", kind: \"enum\", T: proto3.getEnumType(DataPacket_Kind) },\n    { no: 4, name: \"destination_sids\", kind: \"scalar\", T: 9, repeated: true },\n    { no: 6, name: \"destination_identities\", kind: \"scalar\", T: 9, repeated: true },\n    { no: 5, name: \"topic\", kind: \"scalar\", T: 9, opt: true },\n    {\n      no: 7,\n      name: \"nonce\",\n      kind: \"scalar\",\n      T: 12\n      /* ScalarType.BYTES */\n    }\n  ]\n);\nconst SendDataResponse = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.SendDataResponse\",\n  []\n);\nconst UpdateRoomMetadataRequest = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.UpdateRoomMetadataRequest\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"room\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"metadata\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    }\n  ]\n);\nconst RoomConfiguration = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.RoomConfiguration\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"name\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"empty_timeout\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    {\n      no: 3,\n      name: \"departure_timeout\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    {\n      no: 4,\n      name: \"max_participants\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    { no: 5, name: \"egress\", kind: \"message\", T: RoomEgress },\n    {\n      no: 7,\n      name: \"min_playout_delay\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    {\n      no: 8,\n      name: \"max_playout_delay\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    {\n      no: 9,\n      name: \"sync_streams\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    { no: 10, name: \"agents\", kind: \"message\", T: RoomAgentDispatch, repeated: true }\n  ]\n);\nconst ForwardParticipantRequest = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.ForwardParticipantRequest\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"room\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"identity\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 3,\n      name: \"destination_room\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    }\n  ]\n);\nconst ForwardParticipantResponse = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.ForwardParticipantResponse\",\n  []\n);\nconst MoveParticipantRequest = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.MoveParticipantRequest\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"room\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"identity\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 3,\n      name: \"destination_room\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    }\n  ]\n);\nconst MoveParticipantResponse = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.MoveParticipantResponse\",\n  []\n);\n\nconst SignalTarget = /* @__PURE__ */ proto3.makeEnum(\n  \"livekit.SignalTarget\",\n  [\n    { no: 0, name: \"PUBLISHER\" },\n    { no: 1, name: \"SUBSCRIBER\" }\n  ]\n);\nconst StreamState = /* @__PURE__ */ proto3.makeEnum(\n  \"livekit.StreamState\",\n  [\n    { no: 0, name: \"ACTIVE\" },\n    { no: 1, name: \"PAUSED\" }\n  ]\n);\nconst CandidateProtocol = /* @__PURE__ */ proto3.makeEnum(\n  \"livekit.CandidateProtocol\",\n  [\n    { no: 0, name: \"UDP\" },\n    { no: 1, name: \"TCP\" },\n    { no: 2, name: \"TLS\" }\n  ]\n);\nconst SignalRequest = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.SignalRequest\",\n  () =\u003e [\n    { no: 1, name: \"offer\", kind: \"message\", T: SessionDescription, oneof: \"message\" },\n    { no: 2, name: \"answer\", kind: \"message\", T: SessionDescription, oneof: \"message\" },\n    { no: 3, name: \"trickle\", kind: \"message\", T: TrickleRequest, oneof: \"message\" },\n    { no: 4, name: \"add_track\", kind: \"message\", T: AddTrackRequest, oneof: \"message\" },\n    { no: 5, name: \"mute\", kind: \"message\", T: MuteTrackRequest, oneof: \"message\" },\n    { no: 6, name: \"subscription\", kind: \"message\", T: UpdateSubscription, oneof: \"message\" },\n    { no: 7, name: \"track_setting\", kind: \"message\", T: UpdateTrackSettings, oneof: \"message\" },\n    { no: 8, name: \"leave\", kind: \"message\", T: LeaveRequest, oneof: \"message\" },\n    { no: 10, name: \"update_layers\", kind: \"message\", T: UpdateVideoLayers, oneof: \"message\" },\n    { no: 11, name: \"subscription_permission\", kind: \"message\", T: SubscriptionPermission, oneof: \"message\" },\n    { no: 12, name: \"sync_state\", kind: \"message\", T: SyncState, oneof: \"message\" },\n    { no: 13, name: \"simulate\", kind: \"message\", T: SimulateScenario, oneof: \"message\" },\n    { no: 14, name: \"ping\", kind: \"scalar\", T: 3, oneof: \"message\" },\n    { no: 15, name: \"update_metadata\", kind: \"message\", T: UpdateParticipantMetadata, oneof: \"message\" },\n    { no: 16, name: \"ping_req\", kind: \"message\", T: Ping, oneof: \"message\" },\n    { no: 17, name: \"update_audio_track\", kind: \"message\", T: UpdateLocalAudioTrack, oneof: \"message\" },\n    { no: 18, name: \"update_video_track\", kind: \"message\", T: UpdateLocalVideoTrack, oneof: \"message\" }\n  ]\n);\nconst SignalResponse = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.SignalResponse\",\n  () =\u003e [\n    { no: 1, name: \"join\", kind: \"message\", T: JoinResponse, oneof: \"message\" },\n    { no: 2, name: \"answer\", kind: \"message\", T: SessionDescription, oneof: \"message\" },\n    { no: 3, name: \"offer\", kind: \"message\", T: SessionDescription, oneof: \"message\" },\n    { no: 4, name: \"trickle\", kind: \"message\", T: TrickleRequest, oneof: \"message\" },\n    { no: 5, name: \"update\", kind: \"message\", T: ParticipantUpdate, oneof: \"message\" },\n    { no: 6, name: \"track_published\", kind: \"message\", T: TrackPublishedResponse, oneof: \"message\" },\n    { no: 8, name: \"leave\", kind: \"message\", T: LeaveRequest, oneof: \"message\" },\n    { no: 9, name: \"mute\", kind: \"message\", T: MuteTrackRequest, oneof: \"message\" },\n    { no: 10, name: \"speakers_changed\", kind: \"message\", T: SpeakersChanged, oneof: \"message\" },\n    { no: 11, name: \"room_update\", kind: \"message\", T: RoomUpdate, oneof: \"message\" },\n    { no: 12, name: \"connection_quality\", kind: \"message\", T: ConnectionQualityUpdate, oneof: \"message\" },\n    { no: 13, name: \"stream_state_update\", kind: \"message\", T: StreamStateUpdate, oneof: \"message\" },\n    { no: 14, name: \"subscribed_quality_update\", kind: \"message\", T: SubscribedQualityUpdate, oneof: \"message\" },\n    { no: 15, name: \"subscription_permission_update\", kind: \"message\", T: SubscriptionPermissionUpdate, oneof: \"message\" },\n    { no: 16, name: \"refresh_token\", kind: \"scalar\", T: 9, oneof: \"message\" },\n    { no: 17, name: \"track_unpublished\", kind: \"message\", T: TrackUnpublishedResponse, oneof: \"message\" },\n    { no: 18, name: \"pong\", kind: \"scalar\", T: 3, oneof: \"message\" },\n    { no: 19, name: \"reconnect\", kind: \"message\", T: ReconnectResponse, oneof: \"message\" },\n    { no: 20, name: \"pong_resp\", kind: \"message\", T: Pong, oneof: \"message\" },\n    { no: 21, name: \"subscription_response\", kind: \"message\", T: SubscriptionResponse, oneof: \"message\" },\n    { no: 22, name: \"request_response\", kind: \"message\", T: RequestResponse, oneof: \"message\" },\n    { no: 23, name: \"track_subscribed\", kind: \"message\", T: TrackSubscribed, oneof: \"message\" },\n    { no: 24, name: \"room_moved\", kind: \"message\", T: RoomMovedResponse, oneof: \"message\" }\n  ]\n);\nconst SimulcastCodec = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.SimulcastCodec\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"codec\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"cid\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    }\n  ]\n);\nconst AddTrackRequest = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.AddTrackRequest\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"cid\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"name\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 3, name: \"type\", kind: \"enum\", T: proto3.getEnumType(TrackType) },\n    {\n      no: 4,\n      name: \"width\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    {\n      no: 5,\n      name: \"height\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    {\n      no: 6,\n      name: \"muted\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    {\n      no: 7,\n      name: \"disable_dtx\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    { no: 8, name: \"source\", kind: \"enum\", T: proto3.getEnumType(TrackSource) },\n    { no: 9, name: \"layers\", kind: \"message\", T: VideoLayer, repeated: true },\n    { no: 10, name: \"simulcast_codecs\", kind: \"message\", T: SimulcastCodec, repeated: true },\n    {\n      no: 11,\n      name: \"sid\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 12,\n      name: \"stereo\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    {\n      no: 13,\n      name: \"disable_red\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    { no: 14, name: \"encryption\", kind: \"enum\", T: proto3.getEnumType(Encryption_Type) },\n    {\n      no: 15,\n      name: \"stream\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 16, name: \"backup_codec_policy\", kind: \"enum\", T: proto3.getEnumType(BackupCodecPolicy) },\n    { no: 17, name: \"audio_features\", kind: \"enum\", T: proto3.getEnumType(AudioTrackFeature), repeated: true }\n  ]\n);\nconst TrickleRequest = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.TrickleRequest\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"candidateInit\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 2, name: \"target\", kind: \"enum\", T: proto3.getEnumType(SignalTarget) },\n    {\n      no: 3,\n      name: \"final\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    }\n  ]\n);\nconst MuteTrackRequest = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.MuteTrackRequest\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"sid\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"muted\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    }\n  ]\n);\nconst JoinResponse = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.JoinResponse\",\n  () =\u003e [\n    { no: 1, name: \"room\", kind: \"message\", T: Room },\n    { no: 2, name: \"participant\", kind: \"message\", T: ParticipantInfo },\n    { no: 3, name: \"other_participants\", kind: \"message\", T: ParticipantInfo, repeated: true },\n    {\n      no: 4,\n      name: \"server_version\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 5, name: \"ice_servers\", kind: \"message\", T: ICEServer, repeated: true },\n    {\n      no: 6,\n      name: \"subscriber_primary\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    {\n      no: 7,\n      name: \"alternative_url\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 8, name: \"client_configuration\", kind: \"message\", T: ClientConfiguration },\n    {\n      no: 9,\n      name: \"server_region\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 10,\n      name: \"ping_timeout\",\n      kind: \"scalar\",\n      T: 5\n      /* ScalarType.INT32 */\n    },\n    {\n      no: 11,\n      name: \"ping_interval\",\n      kind: \"scalar\",\n      T: 5\n      /* ScalarType.INT32 */\n    },\n    { no: 12, name: \"server_info\", kind: \"message\", T: ServerInfo },\n    {\n      no: 13,\n      name: \"sif_trailer\",\n      kind: \"scalar\",\n      T: 12\n      /* ScalarType.BYTES */\n    },\n    { no: 14, name: \"enabled_publish_codecs\", kind: \"message\", T: Codec, repeated: true },\n    {\n      no: 15,\n      name: \"fast_publish\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    }\n  ]\n);\nconst ReconnectResponse = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.ReconnectResponse\",\n  () =\u003e [\n    { no: 1, name: \"ice_servers\", kind: \"message\", T: ICEServer, repeated: true },\n    { no: 2, name: \"client_configuration\", kind: \"message\", T: ClientConfiguration },\n    { no: 3, name: \"server_info\", kind: \"message\", T: ServerInfo },\n    {\n      no: 4,\n      name: \"last_message_seq\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    }\n  ]\n);\nconst TrackPublishedResponse = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.TrackPublishedResponse\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"cid\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 2, name: \"track\", kind: \"message\", T: TrackInfo }\n  ]\n);\nconst TrackUnpublishedResponse = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.TrackUnpublishedResponse\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"track_sid\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    }\n  ]\n);\nconst SessionDescription = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.SessionDescription\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"type\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"sdp\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 3,\n      name: \"id\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    }\n  ]\n);\nconst ParticipantUpdate = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.ParticipantUpdate\",\n  () =\u003e [\n    { no: 1, name: \"participants\", kind: \"message\", T: ParticipantInfo, repeated: true }\n  ]\n);\nconst UpdateSubscription = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.UpdateSubscription\",\n  () =\u003e [\n    { no: 1, name: \"track_sids\", kind: \"scalar\", T: 9, repeated: true },\n    {\n      no: 2,\n      name: \"subscribe\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    { no: 3, name: \"participant_tracks\", kind: \"message\", T: ParticipantTracks, repeated: true }\n  ]\n);\nconst UpdateTrackSettings = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.UpdateTrackSettings\",\n  () =\u003e [\n    { no: 1, name: \"track_sids\", kind: \"scalar\", T: 9, repeated: true },\n    {\n      no: 3,\n      name: \"disabled\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    { no: 4, name: \"quality\", kind: \"enum\", T: proto3.getEnumType(VideoQuality) },\n    {\n      no: 5,\n      name: \"width\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    {\n      no: 6,\n      name: \"height\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    {\n      no: 7,\n      name: \"fps\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    {\n      no: 8,\n      name: \"priority\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    }\n  ]\n);\nconst UpdateLocalAudioTrack = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.UpdateLocalAudioTrack\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"track_sid\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 2, name: \"features\", kind: \"enum\", T: proto3.getEnumType(AudioTrackFeature), repeated: true }\n  ]\n);\nconst UpdateLocalVideoTrack = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.UpdateLocalVideoTrack\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"track_sid\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"width\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    {\n      no: 3,\n      name: \"height\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    }\n  ]\n);\nconst LeaveRequest = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.LeaveRequest\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"can_reconnect\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    { no: 2, name: \"reason\", kind: \"enum\", T: proto3.getEnumType(DisconnectReason) },\n    { no: 3, name: \"action\", kind: \"enum\", T: proto3.getEnumType(LeaveRequest_Action) },\n    { no: 4, name: \"regions\", kind: \"message\", T: RegionSettings }\n  ]\n);\nconst LeaveRequest_Action = /* @__PURE__ */ proto3.makeEnum(\n  \"livekit.LeaveRequest.Action\",\n  [\n    { no: 0, name: \"DISCONNECT\" },\n    { no: 1, name: \"RESUME\" },\n    { no: 2, name: \"RECONNECT\" }\n  ]\n);\nconst UpdateVideoLayers = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.UpdateVideoLayers\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"track_sid\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 2, name: \"layers\", kind: \"message\", T: VideoLayer, repeated: true }\n  ]\n);\nconst UpdateParticipantMetadata = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.UpdateParticipantMetadata\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"metadata\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"name\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 3, name: \"attributes\", kind: \"map\", K: 9, V: {\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    } },\n    {\n      no: 4,\n      name: \"request_id\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    }\n  ]\n);\nconst ICEServer = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.ICEServer\",\n  () =\u003e [\n    { no: 1, name: \"urls\", kind: \"scalar\", T: 9, repeated: true },\n    {\n      no: 2,\n      name: \"username\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 3,\n      name: \"credential\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    }\n  ]\n);\nconst SpeakersChanged = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.SpeakersChanged\",\n  () =\u003e [\n    { no: 1, name: \"speakers\", kind: \"message\", T: SpeakerInfo, repeated: true }\n  ]\n);\nconst RoomUpdate = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.RoomUpdate\",\n  () =\u003e [\n    { no: 1, name: \"room\", kind: \"message\", T: Room }\n  ]\n);\nconst ConnectionQualityInfo = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.ConnectionQualityInfo\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"participant_sid\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 2, name: \"quality\", kind: \"enum\", T: proto3.getEnumType(ConnectionQuality) },\n    {\n      no: 3,\n      name: \"score\",\n      kind: \"scalar\",\n      T: 2\n      /* ScalarType.FLOAT */\n    }\n  ]\n);\nconst ConnectionQualityUpdate = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.ConnectionQualityUpdate\",\n  () =\u003e [\n    { no: 1, name: \"updates\", kind: \"message\", T: ConnectionQualityInfo, repeated: true }\n  ]\n);\nconst StreamStateInfo = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.StreamStateInfo\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"participant_sid\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"track_sid\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 3, name: \"state\", kind: \"enum\", T: proto3.getEnumType(StreamState) }\n  ]\n);\nconst StreamStateUpdate = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.StreamStateUpdate\",\n  () =\u003e [\n    { no: 1, name: \"stream_states\", kind: \"message\", T: StreamStateInfo, repeated: true }\n  ]\n);\nconst SubscribedQuality = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.SubscribedQuality\",\n  () =\u003e [\n    { no: 1, name: \"quality\", kind: \"enum\", T: proto3.getEnumType(VideoQuality) },\n    {\n      no: 2,\n      name: \"enabled\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    }\n  ]\n);\nconst SubscribedCodec = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.SubscribedCodec\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"codec\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 2, name: \"qualities\", kind: \"message\", T: SubscribedQuality, repeated: true }\n  ]\n);\nconst SubscribedQualityUpdate = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.SubscribedQualityUpdate\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"track_sid\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 2, name: \"subscribed_qualities\", kind: \"message\", T: SubscribedQuality, repeated: true },\n    { no: 3, name: \"subscribed_codecs\", kind: \"message\", T: SubscribedCodec, repeated: true }\n  ]\n);\nconst TrackPermission = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.TrackPermission\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"participant_sid\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"all_tracks\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    { no: 3, name: \"track_sids\", kind: \"scalar\", T: 9, repeated: true },\n    {\n      no: 4,\n      name: \"participant_identity\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    }\n  ]\n);\nconst SubscriptionPermission = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.SubscriptionPermission\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"all_participants\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    { no: 2, name: \"track_permissions\", kind: \"message\", T: TrackPermission, repeated: true }\n  ]\n);\nconst SubscriptionPermissionUpdate = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.SubscriptionPermissionUpdate\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"participant_sid\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"track_sid\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 3,\n      name: \"allowed\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    }\n  ]\n);\nconst RoomMovedResponse = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.RoomMovedResponse\",\n  () =\u003e [\n    { no: 1, name: \"room\", kind: \"message\", T: Room },\n    {\n      no: 2,\n      name: \"token\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 3, name: \"participant\", kind: \"message\", T: ParticipantInfo },\n    { no: 4, name: \"other_participants\", kind: \"message\", T: ParticipantInfo, repeated: true }\n  ]\n);\nconst SyncState = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.SyncState\",\n  () =\u003e [\n    { no: 1, name: \"answer\", kind: \"message\", T: SessionDescription },\n    { no: 2, name: \"subscription\", kind: \"message\", T: UpdateSubscription },\n    { no: 3, name: \"publish_tracks\", kind: \"message\", T: TrackPublishedResponse, repeated: true },\n    { no: 4, name: \"data_channels\", kind: \"message\", T: DataChannelInfo, repeated: true },\n    { no: 5, name: \"offer\", kind: \"message\", T: SessionDescription },\n    { no: 6, name: \"track_sids_disabled\", kind: \"scalar\", T: 9, repeated: true },\n    { no: 7, name: \"datachannel_receive_states\", kind: \"message\", T: DataChannelReceiveState, repeated: true }\n  ]\n);\nconst DataChannelReceiveState = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.DataChannelReceiveState\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"publisher_sid\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"last_seq\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    }\n  ]\n);\nconst DataChannelInfo = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.DataChannelInfo\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"label\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"id\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    { no: 3, name: \"target\", kind: \"enum\", T: proto3.getEnumType(SignalTarget) }\n  ]\n);\nconst SimulateScenario = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.SimulateScenario\",\n  () =\u003e [\n    { no: 1, name: \"speaker_update\", kind: \"scalar\", T: 5, oneof: \"scenario\" },\n    { no: 2, name: \"node_failure\", kind: \"scalar\", T: 8, oneof: \"scenario\" },\n    { no: 3, name: \"migration\", kind: \"scalar\", T: 8, oneof: \"scenario\" },\n    { no: 4, name: \"server_leave\", kind: \"scalar\", T: 8, oneof: \"scenario\" },\n    { no: 5, name: \"switch_candidate_protocol\", kind: \"enum\", T: proto3.getEnumType(CandidateProtocol), oneof: \"scenario\" },\n    { no: 6, name: \"subscriber_bandwidth\", kind: \"scalar\", T: 3, oneof: \"scenario\" },\n    { no: 7, name: \"disconnect_signal_on_resume\", kind: \"scalar\", T: 8, oneof: \"scenario\" },\n    { no: 8, name: \"disconnect_signal_on_resume_no_messages\", kind: \"scalar\", T: 8, oneof: \"scenario\" },\n    { no: 9, name: \"leave_request_full_reconnect\", kind: \"scalar\", T: 8, oneof: \"scenario\" }\n  ]\n);\nconst Ping = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.Ping\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"timestamp\",\n      kind: \"scalar\",\n      T: 3\n      /* ScalarType.INT64 */\n    },\n    {\n      no: 2,\n      name: \"rtt\",\n      kind: \"scalar\",\n      T: 3\n      /* ScalarType.INT64 */\n    }\n  ]\n);\nconst Pong = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.Pong\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"last_ping_timestamp\",\n      kind: \"scalar\",\n      T: 3\n      /* ScalarType.INT64 */\n    },\n    {\n      no: 2,\n      name: \"timestamp\",\n      kind: \"scalar\",\n      T: 3\n      /* ScalarType.INT64 */\n    }\n  ]\n);\nconst RegionSettings = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.RegionSettings\",\n  () =\u003e [\n    { no: 1, name: \"regions\", kind: \"message\", T: RegionInfo, repeated: true }\n  ]\n);\nconst RegionInfo = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.RegionInfo\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"region\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"url\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 3,\n      name: \"distance\",\n      kind: \"scalar\",\n      T: 3\n      /* ScalarType.INT64 */\n    }\n  ]\n);\nconst SubscriptionResponse = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.SubscriptionResponse\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"track_sid\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 2, name: \"err\", kind: \"enum\", T: proto3.getEnumType(SubscriptionError) }\n  ]\n);\nconst RequestResponse = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.RequestResponse\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"request_id\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    { no: 2, name: \"reason\", kind: \"enum\", T: proto3.getEnumType(RequestResponse_Reason) },\n    {\n      no: 3,\n      name: \"message\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    }\n  ]\n);\nconst RequestResponse_Reason = /* @__PURE__ */ proto3.makeEnum(\n  \"livekit.RequestResponse.Reason\",\n  [\n    { no: 0, name: \"OK\" },\n    { no: 1, name: \"NOT_FOUND\" },\n    { no: 2, name: \"NOT_ALLOWED\" },\n    { no: 3, name: \"LIMIT_EXCEEDED\" }\n  ]\n);\nconst TrackSubscribed = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.TrackSubscribed\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"track_sid\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    }\n  ]\n);\n\nconst SIPStatusCode = /* @__PURE__ */ proto3.makeEnum(\n  \"livekit.SIPStatusCode\",\n  [\n    { no: 0, name: \"SIP_STATUS_UNKNOWN\" },\n    { no: 100, name: \"SIP_STATUS_TRYING\" },\n    { no: 180, name: \"SIP_STATUS_RINGING\" },\n    { no: 181, name: \"SIP_STATUS_CALL_IS_FORWARDED\" },\n    { no: 182, name: \"SIP_STATUS_QUEUED\" },\n    { no: 183, name: \"SIP_STATUS_SESSION_PROGRESS\" },\n    { no: 200, name: \"SIP_STATUS_OK\" },\n    { no: 202, name: \"SIP_STATUS_ACCEPTED\" },\n    { no: 301, name: \"SIP_STATUS_MOVED_PERMANENTLY\" },\n    { no: 302, name: \"SIP_STATUS_MOVED_TEMPORARILY\" },\n    { no: 305, name: \"SIP_STATUS_USE_PROXY\" },\n    { no: 400, name: \"SIP_STATUS_BAD_REQUEST\" },\n    { no: 401, name: \"SIP_STATUS_UNAUTHORIZED\" },\n    { no: 402, name: \"SIP_STATUS_PAYMENT_REQUIRED\" },\n    { no: 403, name: \"SIP_STATUS_FORBIDDEN\" },\n    { no: 404, name: \"SIP_STATUS_NOTFOUND\" },\n    { no: 405, name: \"SIP_STATUS_METHOD_NOT_ALLOWED\" },\n    { no: 406, name: \"SIP_STATUS_NOT_ACCEPTABLE\" },\n    { no: 407, name: \"SIP_STATUS_PROXY_AUTH_REQUIRED\" },\n    { no: 408, name: \"SIP_STATUS_REQUEST_TIMEOUT\" },\n    { no: 409, name: \"SIP_STATUS_CONFLICT\" },\n    { no: 410, name: \"SIP_STATUS_GONE\" },\n    { no: 413, name: \"SIP_STATUS_REQUEST_ENTITY_TOO_LARGE\" },\n    { no: 414, name: \"SIP_STATUS_REQUEST_URI_TOO_LONG\" },\n    { no: 415, name: \"SIP_STATUS_UNSUPPORTED_MEDIA_TYPE\" },\n    { no: 416, name: \"SIP_STATUS_REQUESTED_RANGE_NOT_SATISFIABLE\" },\n    { no: 420, name: \"SIP_STATUS_BAD_EXTENSION\" },\n    { no: 421, name: \"SIP_STATUS_EXTENSION_REQUIRED\" },\n    { no: 423, name: \"SIP_STATUS_INTERVAL_TOO_BRIEF\" },\n    { no: 480, name: \"SIP_STATUS_TEMPORARILY_UNAVAILABLE\" },\n    { no: 481, name: \"SIP_STATUS_CALL_TRANSACTION_DOES_NOT_EXISTS\" },\n    { no: 482, name: \"SIP_STATUS_LOOP_DETECTED\" },\n    { no: 483, name: \"SIP_STATUS_TOO_MANY_HOPS\" },\n    { no: 484, name: \"SIP_STATUS_ADDRESS_INCOMPLETE\" },\n    { no: 485, name: \"SIP_STATUS_AMBIGUOUS\" },\n    { no: 486, name: \"SIP_STATUS_BUSY_HERE\" },\n    { no: 487, name: \"SIP_STATUS_REQUEST_TERMINATED\" },\n    { no: 488, name: \"SIP_STATUS_NOT_ACCEPTABLE_HERE\" },\n    { no: 500, name: \"SIP_STATUS_INTERNAL_SERVER_ERROR\" },\n    { no: 501, name: \"SIP_STATUS_NOT_IMPLEMENTED\" },\n    { no: 502, name: \"SIP_STATUS_BAD_GATEWAY\" },\n    { no: 503, name: \"SIP_STATUS_SERVICE_UNAVAILABLE\" },\n    { no: 504, name: \"SIP_STATUS_GATEWAY_TIMEOUT\" },\n    { no: 505, name: \"SIP_STATUS_VERSION_NOT_SUPPORTED\" },\n    { no: 513, name: \"SIP_STATUS_MESSAGE_TOO_LARGE\" },\n    { no: 600, name: \"SIP_STATUS_GLOBAL_BUSY_EVERYWHERE\" },\n    { no: 603, name: \"SIP_STATUS_GLOBAL_DECLINE\" },\n    { no: 604, name: \"SIP_STATUS_GLOBAL_DOES_NOT_EXIST_ANYWHERE\" },\n    { no: 606, name: \"SIP_STATUS_GLOBAL_NOT_ACCEPTABLE\" }\n  ]\n);\nconst SIPTransport = /* @__PURE__ */ proto3.makeEnum(\n  \"livekit.SIPTransport\",\n  [\n    { no: 0, name: \"SIP_TRANSPORT_AUTO\" },\n    { no: 1, name: \"SIP_TRANSPORT_UDP\" },\n    { no: 2, name: \"SIP_TRANSPORT_TCP\" },\n    { no: 3, name: \"SIP_TRANSPORT_TLS\" }\n  ]\n);\nconst SIPHeaderOptions = /* @__PURE__ */ proto3.makeEnum(\n  \"livekit.SIPHeaderOptions\",\n  [\n    { no: 0, name: \"SIP_NO_HEADERS\" },\n    { no: 1, name: \"SIP_X_HEADERS\" },\n    { no: 2, name: \"SIP_ALL_HEADERS\" }\n  ]\n);\nconst SIPMediaEncryption = /* @__PURE__ */ proto3.makeEnum(\n  \"livekit.SIPMediaEncryption\",\n  [\n    { no: 0, name: \"SIP_MEDIA_ENCRYPT_DISABLE\" },\n    { no: 1, name: \"SIP_MEDIA_ENCRYPT_ALLOW\" },\n    { no: 2, name: \"SIP_MEDIA_ENCRYPT_REQUIRE\" }\n  ]\n);\nconst SIPCallStatus = /* @__PURE__ */ proto3.makeEnum(\n  \"livekit.SIPCallStatus\",\n  [\n    { no: 0, name: \"SCS_CALL_INCOMING\" },\n    { no: 1, name: \"SCS_PARTICIPANT_JOINED\" },\n    { no: 2, name: \"SCS_ACTIVE\" },\n    { no: 3, name: \"SCS_DISCONNECTED\" },\n    { no: 4, name: \"SCS_ERROR\" }\n  ]\n);\nconst SIPTransferStatus = /* @__PURE__ */ proto3.makeEnum(\n  \"livekit.SIPTransferStatus\",\n  [\n    { no: 0, name: \"STS_TRANSFER_ONGOING\" },\n    { no: 1, name: \"STS_TRANSFER_FAILED\" },\n    { no: 2, name: \"STS_TRANSFER_SUCCESSFUL\" }\n  ]\n);\nconst SIPFeature = /* @__PURE__ */ proto3.makeEnum(\n  \"livekit.SIPFeature\",\n  [\n    { no: 0, name: \"NONE\" },\n    { no: 1, name: \"KRISP_ENABLED\" }\n  ]\n);\nconst SIPCallDirection = /* @__PURE__ */ proto3.makeEnum(\n  \"livekit.SIPCallDirection\",\n  [\n    { no: 0, name: \"SCD_UNKNOWN\" },\n    { no: 1, name: \"SCD_INBOUND\" },\n    { no: 2, name: \"SCD_OUTBOUND\" }\n  ]\n);\nconst SIPStatus = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.SIPStatus\",\n  () =\u003e [\n    { no: 1, name: \"code\", kind: \"enum\", T: proto3.getEnumType(SIPStatusCode) },\n    {\n      no: 2,\n      name: \"status\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    }\n  ]\n);\nconst CreateSIPTrunkRequest = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.CreateSIPTrunkRequest\",\n  () =\u003e [\n    { no: 1, name: \"inbound_addresses\", kind: \"scalar\", T: 9, repeated: true },\n    {\n      no: 2,\n      name: \"outbound_address\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 3,\n      name: \"outbound_number\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 4, name: \"inbound_numbers_regex\", kind: \"scalar\", T: 9, repeated: true },\n    { no: 9, name: \"inbound_numbers\", kind: \"scalar\", T: 9, repeated: true },\n    {\n      no: 5,\n      name: \"inbound_username\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 6,\n      name: \"inbound_password\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 7,\n      name: \"outbound_username\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 8,\n      name: \"outbound_password\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 10,\n      name: \"name\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 11,\n      name: \"metadata\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    }\n  ]\n);\nconst SIPTrunkInfo = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.SIPTrunkInfo\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"sip_trunk_id\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 14, name: \"kind\", kind: \"enum\", T: proto3.getEnumType(SIPTrunkInfo_TrunkKind) },\n    { no: 2, name: \"inbound_addresses\", kind: \"scalar\", T: 9, repeated: true },\n    {\n      no: 3,\n      name: \"outbound_address\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 4,\n      name: \"outbound_number\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 13, name: \"transport\", kind: \"enum\", T: proto3.getEnumType(SIPTransport) },\n    { no: 5, name: \"inbound_numbers_regex\", kind: \"scalar\", T: 9, repeated: true },\n    { no: 10, name: \"inbound_numbers\", kind: \"scalar\", T: 9, repeated: true },\n    {\n      no: 6,\n      name: \"inbound_username\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 7,\n      name: \"inbound_password\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 8,\n      name: \"outbound_username\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 9,\n      name: \"outbound_password\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 11,\n      name: \"name\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 12,\n      name: \"metadata\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    }\n  ]\n);\nconst SIPTrunkInfo_TrunkKind = /* @__PURE__ */ proto3.makeEnum(\n  \"livekit.SIPTrunkInfo.TrunkKind\",\n  [\n    { no: 0, name: \"TRUNK_LEGACY\" },\n    { no: 1, name: \"TRUNK_INBOUND\" },\n    { no: 2, name: \"TRUNK_OUTBOUND\" }\n  ]\n);\nconst CreateSIPInboundTrunkRequest = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.CreateSIPInboundTrunkRequest\",\n  () =\u003e [\n    { no: 1, name: \"trunk\", kind: \"message\", T: SIPInboundTrunkInfo }\n  ]\n);\nconst UpdateSIPInboundTrunkRequest = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.UpdateSIPInboundTrunkRequest\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"sip_trunk_id\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 2, name: \"replace\", kind: \"message\", T: SIPInboundTrunkInfo, oneof: \"action\" },\n    { no: 3, name: \"update\", kind: \"message\", T: SIPInboundTrunkUpdate, oneof: \"action\" }\n  ]\n);\nconst SIPInboundTrunkInfo = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.SIPInboundTrunkInfo\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"sip_trunk_id\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"name\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 3,\n      name: \"metadata\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 4, name: \"numbers\", kind: \"scalar\", T: 9, repeated: true },\n    { no: 5, name: \"allowed_addresses\", kind: \"scalar\", T: 9, repeated: true },\n    { no: 6, name: \"allowed_numbers\", kind: \"scalar\", T: 9, repeated: true },\n    {\n      no: 7,\n      name: \"auth_username\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 8,\n      name: \"auth_password\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 9, name: \"headers\", kind: \"map\", K: 9, V: {\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    } },\n    { no: 10, name: \"headers_to_attributes\", kind: \"map\", K: 9, V: {\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    } },\n    { no: 14, name: \"attributes_to_headers\", kind: \"map\", K: 9, V: {\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    } },\n    { no: 15, name: \"include_headers\", kind: \"enum\", T: proto3.getEnumType(SIPHeaderOptions) },\n    { no: 11, name: \"ringing_timeout\", kind: \"message\", T: Duration },\n    { no: 12, name: \"max_call_duration\", kind: \"message\", T: Duration },\n    {\n      no: 13,\n      name: \"krisp_enabled\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    { no: 16, name: \"media_encryption\", kind: \"enum\", T: proto3.getEnumType(SIPMediaEncryption) }\n  ]\n);\nconst SIPInboundTrunkUpdate = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.SIPInboundTrunkUpdate\",\n  () =\u003e [\n    { no: 1, name: \"numbers\", kind: \"message\", T: ListUpdate },\n    { no: 2, name: \"allowed_addresses\", kind: \"message\", T: ListUpdate },\n    { no: 3, name: \"allowed_numbers\", kind: \"message\", T: ListUpdate },\n    { no: 4, name: \"auth_username\", kind: \"scalar\", T: 9, opt: true },\n    { no: 5, name: \"auth_password\", kind: \"scalar\", T: 9, opt: true },\n    { no: 6, name: \"name\", kind: \"scalar\", T: 9, opt: true },\n    { no: 7, name: \"metadata\", kind: \"scalar\", T: 9, opt: true },\n    { no: 8, name: \"media_encryption\", kind: \"enum\", T: proto3.getEnumType(SIPMediaEncryption), opt: true }\n  ]\n);\nconst CreateSIPOutboundTrunkRequest = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.CreateSIPOutboundTrunkRequest\",\n  () =\u003e [\n    { no: 1, name: \"trunk\", kind: \"message\", T: SIPOutboundTrunkInfo }\n  ]\n);\nconst UpdateSIPOutboundTrunkRequest = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.UpdateSIPOutboundTrunkRequest\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"sip_trunk_id\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 2, name: \"replace\", kind: \"message\", T: SIPOutboundTrunkInfo, oneof: \"action\" },\n    { no: 3, name: \"update\", kind: \"message\", T: SIPOutboundTrunkUpdate, oneof: \"action\" }\n  ]\n);\nconst SIPOutboundTrunkInfo = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.SIPOutboundTrunkInfo\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"sip_trunk_id\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"name\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 3,\n      name: \"metadata\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 4,\n      name: \"address\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 14,\n      name: \"destination_country\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 5, name: \"transport\", kind: \"enum\", T: proto3.getEnumType(SIPTransport) },\n    { no: 6, name: \"numbers\", kind: \"scalar\", T: 9, repeated: true },\n    {\n      no: 7,\n      name: \"auth_username\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 8,\n      name: \"auth_password\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 9, name: \"headers\", kind: \"map\", K: 9, V: {\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    } },\n    { no: 10, name: \"headers_to_attributes\", kind: \"map\", K: 9, V: {\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    } },\n    { no: 11, name: \"attributes_to_headers\", kind: \"map\", K: 9, V: {\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    } },\n    { no: 12, name: \"include_headers\", kind: \"enum\", T: proto3.getEnumType(SIPHeaderOptions) },\n    { no: 13, name: \"media_encryption\", kind: \"enum\", T: proto3.getEnumType(SIPMediaEncryption) }\n  ]\n);\nconst SIPOutboundTrunkUpdate = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.SIPOutboundTrunkUpdate\",\n  () =\u003e [\n    { no: 1, name: \"address\", kind: \"scalar\", T: 9, opt: true },\n    { no: 2, name: \"transport\", kind: \"enum\", T: proto3.getEnumType(SIPTransport), opt: true },\n    { no: 9, name: \"destination_country\", kind: \"scalar\", T: 9, opt: true },\n    { no: 3, name: \"numbers\", kind: \"message\", T: ListUpdate },\n    { no: 4, name: \"auth_username\", kind: \"scalar\", T: 9, opt: true },\n    { no: 5, name: \"auth_password\", kind: \"scalar\", T: 9, opt: true },\n    { no: 6, name: \"name\", kind: \"scalar\", T: 9, opt: true },\n    { no: 7, name: \"metadata\", kind: \"scalar\", T: 9, opt: true },\n    { no: 8, name: \"media_encryption\", kind: \"enum\", T: proto3.getEnumType(SIPMediaEncryption), opt: true }\n  ]\n);\nconst GetSIPInboundTrunkRequest = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.GetSIPInboundTrunkRequest\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"sip_trunk_id\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    }\n  ]\n);\nconst GetSIPInboundTrunkResponse = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.GetSIPInboundTrunkResponse\",\n  () =\u003e [\n    { no: 1, name: \"trunk\", kind: \"message\", T: SIPInboundTrunkInfo }\n  ]\n);\nconst GetSIPOutboundTrunkRequest = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.GetSIPOutboundTrunkRequest\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"sip_trunk_id\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    }\n  ]\n);\nconst GetSIPOutboundTrunkResponse = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.GetSIPOutboundTrunkResponse\",\n  () =\u003e [\n    { no: 1, name: \"trunk\", kind: \"message\", T: SIPOutboundTrunkInfo }\n  ]\n);\nconst ListSIPTrunkRequest = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.ListSIPTrunkRequest\",\n  () =\u003e [\n    { no: 1, name: \"page\", kind: \"message\", T: Pagination }\n  ]\n);\nconst ListSIPTrunkResponse = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.ListSIPTrunkResponse\",\n  () =\u003e [\n    { no: 1, name: \"items\", kind: \"message\", T: SIPTrunkInfo, repeated: true }\n  ]\n);\nconst ListSIPInboundTrunkRequest = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.ListSIPInboundTrunkRequest\",\n  () =\u003e [\n    { no: 3, name: \"page\", kind: \"message\", T: Pagination },\n    { no: 1, name: \"trunk_ids\", kind: \"scalar\", T: 9, repeated: true },\n    { no: 2, name: \"numbers\", kind: \"scalar\", T: 9, repeated: true }\n  ]\n);\nconst ListSIPInboundTrunkResponse = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.ListSIPInboundTrunkResponse\",\n  () =\u003e [\n    { no: 1, name: \"items\", kind: \"message\", T: SIPInboundTrunkInfo, repeated: true }\n  ]\n);\nconst ListSIPOutboundTrunkRequest = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.ListSIPOutboundTrunkRequest\",\n  () =\u003e [\n    { no: 3, name: \"page\", kind: \"message\", T: Pagination },\n    { no: 1, name: \"trunk_ids\", kind: \"scalar\", T: 9, repeated: true },\n    { no: 2, name: \"numbers\", kind: \"scalar\", T: 9, repeated: true }\n  ]\n);\nconst ListSIPOutboundTrunkResponse = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.ListSIPOutboundTrunkResponse\",\n  () =\u003e [\n    { no: 1, name: \"items\", kind: \"message\", T: SIPOutboundTrunkInfo, repeated: true }\n  ]\n);\nconst DeleteSIPTrunkRequest = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.DeleteSIPTrunkRequest\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"sip_trunk_id\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    }\n  ]\n);\nconst SIPDispatchRuleDirect = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.SIPDispatchRuleDirect\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"room_name\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"pin\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    }\n  ]\n);\nconst SIPDispatchRuleIndividual = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.SIPDispatchRuleIndividual\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"room_prefix\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"pin\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    }\n  ]\n);\nconst SIPDispatchRuleCallee = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.SIPDispatchRuleCallee\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"room_prefix\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"pin\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 3,\n      name: \"randomize\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    }\n  ]\n);\nconst SIPDispatchRule = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.SIPDispatchRule\",\n  () =\u003e [\n    { no: 1, name: \"dispatch_rule_direct\", kind: \"message\", T: SIPDispatchRuleDirect, oneof: \"rule\" },\n    { no: 2, name: \"dispatch_rule_individual\", kind: \"message\", T: SIPDispatchRuleIndividual, oneof: \"rule\" },\n    { no: 3, name: \"dispatch_rule_callee\", kind: \"message\", T: SIPDispatchRuleCallee, oneof: \"rule\" }\n  ]\n);\nconst CreateSIPDispatchRuleRequest = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.CreateSIPDispatchRuleRequest\",\n  () =\u003e [\n    { no: 10, name: \"dispatch_rule\", kind: \"message\", T: SIPDispatchRuleInfo },\n    { no: 1, name: \"rule\", kind: \"message\", T: SIPDispatchRule },\n    { no: 2, name: \"trunk_ids\", kind: \"scalar\", T: 9, repeated: true },\n    {\n      no: 3,\n      name: \"hide_phone_number\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    { no: 6, name: \"inbound_numbers\", kind: \"scalar\", T: 9, repeated: true },\n    {\n      no: 4,\n      name: \"name\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 5,\n      name: \"metadata\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 7, name: \"attributes\", kind: \"map\", K: 9, V: {\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    } },\n    {\n      no: 8,\n      name: \"room_preset\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 9, name: \"room_config\", kind: \"message\", T: RoomConfiguration }\n  ]\n);\nconst UpdateSIPDispatchRuleRequest = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.UpdateSIPDispatchRuleRequest\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"sip_dispatch_rule_id\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 2, name: \"replace\", kind: \"message\", T: SIPDispatchRuleInfo, oneof: \"action\" },\n    { no: 3, name: \"update\", kind: \"message\", T: SIPDispatchRuleUpdate, oneof: \"action\" }\n  ]\n);\nconst SIPDispatchRuleInfo = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.SIPDispatchRuleInfo\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"sip_dispatch_rule_id\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 2, name: \"rule\", kind: \"message\", T: SIPDispatchRule },\n    { no: 3, name: \"trunk_ids\", kind: \"scalar\", T: 9, repeated: true },\n    {\n      no: 4,\n      name: \"hide_phone_number\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    { no: 7, name: \"inbound_numbers\", kind: \"scalar\", T: 9, repeated: true },\n    {\n      no: 5,\n      name: \"name\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 6,\n      name: \"metadata\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 8, name: \"attributes\", kind: \"map\", K: 9, V: {\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    } },\n    {\n      no: 9,\n      name: \"room_preset\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 10, name: \"room_config\", kind: \"message\", T: RoomConfiguration },\n    {\n      no: 11,\n      name: \"krisp_enabled\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    { no: 12, name: \"media_encryption\", kind: \"enum\", T: proto3.getEnumType(SIPMediaEncryption) }\n  ]\n);\nconst SIPDispatchRuleUpdate = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.SIPDispatchRuleUpdate\",\n  () =\u003e [\n    { no: 1, name: \"trunk_ids\", kind: \"message\", T: ListUpdate },\n    { no: 2, name: \"rule\", kind: \"message\", T: SIPDispatchRule },\n    { no: 3, name: \"name\", kind: \"scalar\", T: 9, opt: true },\n    { no: 4, name: \"metadata\", kind: \"scalar\", T: 9, opt: true },\n    { no: 5, name: \"attributes\", kind: \"map\", K: 9, V: {\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    } },\n    { no: 6, name: \"media_encryption\", kind: \"enum\", T: proto3.getEnumType(SIPMediaEncryption), opt: true }\n  ]\n);\nconst ListSIPDispatchRuleRequest = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.ListSIPDispatchRuleRequest\",\n  () =\u003e [\n    { no: 3, name: \"page\", kind: \"message\", T: Pagination },\n    { no: 1, name: \"dispatch_rule_ids\", kind: \"scalar\", T: 9, repeated: true },\n    { no: 2, name: \"trunk_ids\", kind: \"scalar\", T: 9, repeated: true }\n  ]\n);\nconst ListSIPDispatchRuleResponse = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.ListSIPDispatchRuleResponse\",\n  () =\u003e [\n    { no: 1, name: \"items\", kind: \"message\", T: SIPDispatchRuleInfo, repeated: true }\n  ]\n);\nconst DeleteSIPDispatchRuleRequest = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.DeleteSIPDispatchRuleRequest\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"sip_dispatch_rule_id\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    }\n  ]\n);\nconst SIPOutboundConfig = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.SIPOutboundConfig\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"hostname\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 7,\n      name: \"destination_country\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 2, name: \"transport\", kind: \"enum\", T: proto3.getEnumType(SIPTransport) },\n    {\n      no: 3,\n      name: \"auth_username\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 4,\n      name: \"auth_password\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 5, name: \"headers_to_attributes\", kind: \"map\", K: 9, V: {\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    } },\n    { no: 6, name: \"attributes_to_headers\", kind: \"map\", K: 9, V: {\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    } }\n  ]\n);\nconst CreateSIPParticipantRequest = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.CreateSIPParticipantRequest\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"sip_trunk_id\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 20, name: \"trunk\", kind: \"message\", T: SIPOutboundConfig },\n    {\n      no: 2,\n      name: \"sip_call_to\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 15,\n      name: \"sip_number\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 3,\n      name: \"room_name\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 4,\n      name: \"participant_identity\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 7,\n      name: \"participant_name\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 8,\n      name: \"participant_metadata\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 9, name: \"participant_attributes\", kind: \"map\", K: 9, V: {\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    } },\n    {\n      no: 5,\n      name: \"dtmf\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 6,\n      name: \"play_ringtone\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    {\n      no: 13,\n      name: \"play_dialtone\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    {\n      no: 10,\n      name: \"hide_phone_number\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    { no: 16, name: \"headers\", kind: \"map\", K: 9, V: {\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    } },\n    { no: 17, name: \"include_headers\", kind: \"enum\", T: proto3.getEnumType(SIPHeaderOptions) },\n    { no: 11, name: \"ringing_timeout\", kind: \"message\", T: Duration },\n    { no: 12, name: \"max_call_duration\", kind: \"message\", T: Duration },\n    {\n      no: 14,\n      name: \"krisp_enabled\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    { no: 18, name: \"media_encryption\", kind: \"enum\", T: proto3.getEnumType(SIPMediaEncryption) },\n    {\n      no: 19,\n      name: \"wait_until_answered\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    }\n  ]\n);\nconst SIPParticipantInfo = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.SIPParticipantInfo\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"participant_id\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"participant_identity\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 3,\n      name: \"room_name\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 4,\n      name: \"sip_call_id\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    }\n  ]\n);\nconst TransferSIPParticipantRequest = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.TransferSIPParticipantRequest\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"participant_identity\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"room_name\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 3,\n      name: \"transfer_to\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 4,\n      name: \"play_dialtone\",\n      kind: \"scalar\",\n      T: 8\n      /* ScalarType.BOOL */\n    },\n    { no: 5, name: \"headers\", kind: \"map\", K: 9, V: {\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    } },\n    { no: 6, name: \"ringing_timeout\", kind: \"message\", T: Duration }\n  ]\n);\nconst SIPCallInfo = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.SIPCallInfo\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"call_id\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"trunk_id\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 16,\n      name: \"dispatch_rule_id\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 17,\n      name: \"region\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 3,\n      name: \"room_name\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 4,\n      name: \"room_id\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 5,\n      name: \"participant_identity\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 18, name: \"participant_attributes\", kind: \"map\", K: 9, V: {\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    } },\n    { no: 6, name: \"from_uri\", kind: \"message\", T: SIPUri },\n    { no: 7, name: \"to_uri\", kind: \"message\", T: SIPUri },\n    {\n      no: 9,\n      name: \"created_at\",\n      kind: \"scalar\",\n      T: 3\n      /* ScalarType.INT64 */\n    },\n    {\n      no: 10,\n      name: \"started_at\",\n      kind: \"scalar\",\n      T: 3\n      /* ScalarType.INT64 */\n    },\n    {\n      no: 11,\n      name: \"ended_at\",\n      kind: \"scalar\",\n      T: 3\n      /* ScalarType.INT64 */\n    },\n    { no: 14, name: \"enabled_features\", kind: \"enum\", T: proto3.getEnumType(SIPFeature), repeated: true },\n    { no: 15, name: \"call_direction\", kind: \"enum\", T: proto3.getEnumType(SIPCallDirection) },\n    { no: 8, name: \"call_status\", kind: \"enum\", T: proto3.getEnumType(SIPCallStatus) },\n    {\n      no: 22,\n      name: \"created_at_ns\",\n      kind: \"scalar\",\n      T: 3\n      /* ScalarType.INT64 */\n    },\n    {\n      no: 23,\n      name: \"started_at_ns\",\n      kind: \"scalar\",\n      T: 3\n      /* ScalarType.INT64 */\n    },\n    {\n      no: 24,\n      name: \"ended_at_ns\",\n      kind: \"scalar\",\n      T: 3\n      /* ScalarType.INT64 */\n    },\n    { no: 12, name: \"disconnect_reason\", kind: \"enum\", T: proto3.getEnumType(DisconnectReason) },\n    {\n      no: 13,\n      name: \"error\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 19, name: \"call_status_code\", kind: \"message\", T: SIPStatus },\n    {\n      no: 20,\n      name: \"audio_codec\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 21,\n      name: \"media_encryption\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    }\n  ]\n);\nconst SIPTransferInfo = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.SIPTransferInfo\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"transfer_id\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"call_id\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 3,\n      name: \"transfer_to\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 4,\n      name: \"transfer_initiated_at_ns\",\n      kind: \"scalar\",\n      T: 3\n      /* ScalarType.INT64 */\n    },\n    {\n      no: 5,\n      name: \"transfer_completed_at_ns\",\n      kind: \"scalar\",\n      T: 3\n      /* ScalarType.INT64 */\n    },\n    { no: 6, name: \"transfer_status\", kind: \"enum\", T: proto3.getEnumType(SIPTransferStatus) },\n    {\n      no: 7,\n      name: \"error\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 8, name: \"transfer_status_code\", kind: \"message\", T: SIPStatus }\n  ]\n);\nconst SIPUri = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.SIPUri\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"user\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 2,\n      name: \"host\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 3,\n      name: \"ip\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 4,\n      name: \"port\",\n      kind: \"scalar\",\n      T: 13\n      /* ScalarType.UINT32 */\n    },\n    { no: 5, name: \"transport\", kind: \"enum\", T: proto3.getEnumType(SIPTransport) }\n  ]\n);\n\nconst WebhookEvent = /* @__PURE__ */ proto3.makeMessageType(\n  \"livekit.WebhookEvent\",\n  () =\u003e [\n    {\n      no: 1,\n      name: \"event\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    { no: 2, name: \"room\", kind: \"message\", T: Room },\n    { no: 3, name: \"participant\", kind: \"message\", T: ParticipantInfo },\n    { no: 9, name: \"egress_info\", kind: \"message\", T: EgressInfo },\n    { no: 10, name: \"ingress_info\", kind: \"message\", T: IngressInfo },\n    { no: 8, name: \"track\", kind: \"message\", T: TrackInfo },\n    {\n      no: 6,\n      name: \"id\",\n      kind: \"scalar\",\n      T: 9\n      /* ScalarType.STRING */\n    },\n    {\n      no: 7,\n      name: \"created_at\",\n      kind: \"scalar\",\n      T: 3\n      /* ScalarType.INT64 */\n    },\n    {\n      no: 11,\n      name: \"num_dropped\",\n      kind: \"scalar\",\n      T: 5\n      /* ScalarType.INT32 */\n    }\n  ]\n);\n\nconst version = \"1.39.3\";\n\nexport { ActiveSpeakerUpdate, AddTrackRequest, AgentDispatch, AgentDispatchState, AliOSSUpload, AudioCodec, AudioMixing, AudioTrackFeature, AutoParticipantEgress, AutoTrackEgress, AvailabilityRequest, AvailabilityResponse, AzureBlobUpload, BackupCodecPolicy, CandidateProtocol, ChatMessage, ClientConfigSetting, ClientConfiguration, ClientInfo, ClientInfo_SDK, Codec, ConnectionQuality, ConnectionQualityInfo, ConnectionQualityUpdate, CreateAgentDispatchRequest, CreateIngressRequest, CreateRoomRequest, CreateSIPDispatchRuleRequest, CreateSIPInboundTrunkRequest, CreateSIPOutboundTrunkRequest, CreateSIPParticipantRequest, CreateSIPTrunkRequest, DataChannelInfo, DataChannelReceiveState, DataPacket, DataPacket_Kind, DataStream, DataStream_ByteHeader, DataStream_Chunk, DataStream_Header, DataStream_OperationType, DataStream_TextHeader, DataStream_Trailer, DeleteAgentDispatchRequest, DeleteIngressRequest, DeleteRoomRequest, DeleteRoomResponse, DeleteSIPDispatchRuleRequest, DeleteSIPTrunkRequest, DirectFileOutput, DisabledCodecs, DisconnectReason, EgressInfo, EgressSourceType, EgressStatus, EncodedFileOutput, EncodedFileType, EncodingOptions, EncodingOptionsPreset, Encryption, Encryption_Type, EventMetric, FileInfo, ForwardParticipantRequest, ForwardParticipantResponse, GCPUpload, GetSIPInboundTrunkRequest, GetSIPInboundTrunkResponse, GetSIPOutboundTrunkRequest, GetSIPOutboundTrunkResponse, ICEServer, ImageCodec, ImageFileSuffix, ImageOutput, ImagesInfo, IngressAudioEncodingOptions, IngressAudioEncodingPreset, IngressAudioOptions, IngressInfo, IngressInput, IngressState, IngressState_Status, IngressVideoEncodingOptions, IngressVideoEncodingPreset, IngressVideoOptions, InputAudioState, InputVideoState, Job, JobAssignment, JobState, JobStatus, JobTermination, JobType, JoinResponse, LeaveRequest, LeaveRequest_Action, ListAgentDispatchRequest, ListAgentDispatchResponse, ListEgressRequest, ListEgressResponse, ListIngressRequest, ListIngressResponse, ListParticipantsRequest, ListParticipantsResponse, ListRoomsRequest, ListRoomsResponse, ListSIPDispatchRuleRequest, ListSIPDispatchRuleResponse, ListSIPInboundTrunkRequest, ListSIPInboundTrunkResponse, ListSIPOutboundTrunkRequest, ListSIPOutboundTrunkResponse, ListSIPTrunkRequest, ListSIPTrunkResponse, ListUpdate, MetricLabel, MetricSample, MetricsBatch, MigrateJobRequest, MoveParticipantRequest, MoveParticipantResponse, MuteRoomTrackRequest, MuteRoomTrackResponse, MuteTrackRequest, Pagination, ParticipantEgressRequest, ParticipantInfo, ParticipantInfo_Kind, ParticipantInfo_KindDetail, ParticipantInfo_State, ParticipantPermission, ParticipantTracks, ParticipantUpdate, Ping, PlayoutDelay, Pong, ProxyConfig, RTCPSenderReportState, RTPDrift, RTPForwarderState, RTPMungerState, RTPStats, ReconnectReason, ReconnectResponse, RegionInfo, RegionSettings, RegisterWorkerRequest, RegisterWorkerResponse, RemoveParticipantResponse, RequestResponse, RequestResponse_Reason, Room, RoomAgent, RoomAgentDispatch, RoomCompositeEgressRequest, RoomConfiguration, RoomEgress, RoomMovedResponse, RoomParticipantIdentity, RoomUpdate, RpcAck, RpcError, RpcRequest, RpcResponse, S3Upload, SIPCallDirection, SIPCallInfo, SIPCallStatus, SIPDispatchRule, SIPDispatchRuleCallee, SIPDispatchRuleDirect, SIPDispatchRuleIndividual, SIPDispatchRuleInfo, SIPDispatchRuleUpdate, SIPFeature, SIPHeaderOptions, SIPInboundTrunkInfo, SIPInboundTrunkUpdate, SIPMediaEncryption, SIPOutboundConfig, SIPOutboundTrunkInfo, SIPOutboundTrunkUpdate, SIPParticipantInfo, SIPStatus, SIPStatusCode, SIPTransferInfo, SIPTransferStatus, SIPTransport, SIPTrunkInfo, SIPTrunkInfo_TrunkKind, SIPUri, SegmentedFileOutput, SegmentedFileProtocol, SegmentedFileSuffix, SegmentsInfo, SendDataRequest, SendDataResponse, ServerInfo, ServerInfo_Edition, ServerMessage, SessionDescription, SignalRequest, SignalResponse, SignalTarget, SimulateJobRequest, SimulateScenario, SimulcastCodec, SimulcastCodecInfo, SipDTMF, SpeakerInfo, SpeakersChanged, StopEgressRequest, StreamInfo, StreamInfoList, StreamInfo_Status, StreamOutput, StreamProtocol, StreamState, StreamStateInfo, StreamStateUpdate, SubscribedCodec, SubscribedQuality, SubscribedQualityUpdate, SubscriptionError, SubscriptionPermission, SubscriptionPermissionUpdate, SubscriptionResponse, SyncState, TimeSeriesMetric, TimedVersion, TrackCompositeEgressRequest, TrackEgressRequest, TrackInfo, TrackPermission, TrackPublishedResponse, TrackSource, TrackSubscribed, TrackType, TrackUnpublishedResponse, Transcription, TranscriptionSegment, TransferSIPParticipantRequest, TrickleRequest, UpdateIngressRequest, UpdateJobStatus, UpdateLayoutRequest, UpdateLocalAudioTrack, UpdateLocalVideoTrack, UpdateParticipantMetadata, UpdateParticipantRequest, UpdateRoomMetadataRequest, UpdateSIPDispatchRuleRequest, UpdateSIPInboundTrunkRequest, UpdateSIPOutboundTrunkRequest, UpdateStreamRequest, UpdateSubscription, UpdateSubscriptionsRequest, UpdateSubscriptionsResponse, UpdateTrackSettings, UpdateVideoLayers, UpdateWorkerStatus, UserPacket, VP8MungerState, VideoCodec, VideoConfiguration, VideoLayer, VideoQuality, WebEgressRequest, WebhookConfig, WebhookEvent, WorkerMessage, WorkerPing, WorkerPong, WorkerStatus, version };\n//# sourceMappingURL=index.mjs.map\n","/*\n* loglevel - https://github.com/pimterry/loglevel\n*\n* Copyright (c) 2013 Tim Perry\n* Licensed under the MIT license.\n*/\n(function (root, definition) {\n    \"use strict\";\n    if (typeof define === 'function' \u0026\u0026 define.amd) {\n        define(definition);\n    } else if (typeof module === 'object' \u0026\u0026 module.exports) {\n        module.exports = definition();\n    } else {\n        root.log = definition();\n    }\n}(this, function () {\n    \"use strict\";\n\n    // Slightly dubious tricks to cut down minimized file size\n    var noop = function() {};\n    var undefinedType = \"undefined\";\n    var isIE = (typeof window !== undefinedType) \u0026\u0026 (typeof window.navigator !== undefinedType) \u0026\u0026 (\n        /Trident\\/|MSIE /.test(window.navigator.userAgent)\n    );\n\n    var logMethods = [\n        \"trace\",\n        \"debug\",\n        \"info\",\n        \"warn\",\n        \"error\"\n    ];\n\n    var _loggersByName = {};\n    var defaultLogger = null;\n\n    // Cross-browser bind equivalent that works at least back to IE6\n    function bindMethod(obj, methodName) {\n        var method = obj[methodName];\n        if (typeof method.bind === 'function') {\n            return method.bind(obj);\n        } else {\n            try {\n                return Function.prototype.bind.call(method, obj);\n            } catch (e) {\n                // Missing bind shim or IE8 + Modernizr, fallback to wrapping\n                return function() {\n                    return Function.prototype.apply.apply(method, [obj, arguments]);\n                };\n            }\n        }\n    }\n\n    // Trace() doesn't print the message in IE, so for that case we need to wrap it\n    function traceForIE() {\n        if (console.log) {\n            if (console.log.apply) {\n                console.log.apply(console, arguments);\n            } else {\n                // In old IE, native console methods themselves don't have apply().\n                Function.prototype.apply.apply(console.log, [console, arguments]);\n            }\n        }\n        if (console.trace) console.trace();\n    }\n\n    // Build the best logging method possible for this env\n    // Wherever possible we want to bind, not wrap, to preserve stack traces\n    function realMethod(methodName) {\n        if (methodName === 'debug') {\n            methodName = 'log';\n        }\n\n        if (typeof console === undefinedType) {\n            return false; // No method possible, for now - fixed later by enableLoggingWhenConsoleArrives\n        } else if (methodName === 'trace' \u0026\u0026 isIE) {\n            return traceForIE;\n        } else if (console[methodName] !== undefined) {\n            return bindMethod(console, methodName);\n        } else if (console.log !== undefined) {\n            return bindMethod(console, 'log');\n        } else {\n            return noop;\n        }\n    }\n\n    // These private functions always need `this` to be set properly\n\n    function replaceLoggingMethods() {\n        /*jshint validthis:true */\n        var level = this.getLevel();\n\n        // Replace the actual methods.\n        for (var i = 0; i \u003c logMethods.length; i++) {\n            var methodName = logMethods[i];\n            this[methodName] = (i \u003c level) ?\n                noop :\n                this.methodFactory(methodName, level, this.name);\n        }\n\n        // Define log.log as an alias for log.debug\n        this.log = this.debug;\n\n        // Return any important warnings.\n        if (typeof console === undefinedType \u0026\u0026 level \u003c this.levels.SILENT) {\n            return \"No console available for logging\";\n        }\n    }\n\n    // In old IE versions, the console isn't present until you first open it.\n    // We build realMethod() replacements here that regenerate logging methods\n    function enableLoggingWhenConsoleArrives(methodName) {\n        return function () {\n            if (typeof console !== undefinedType) {\n                replaceLoggingMethods.call(this);\n                this[methodName].apply(this, arguments);\n            }\n        };\n    }\n\n    // By default, we use closely bound real methods wherever possible, and\n    // otherwise we wait for a console to appear, and then try again.\n    function defaultMethodFactory(methodName, _level, _loggerName) {\n        /*jshint validthis:true */\n        return realMethod(methodName) ||\n               enableLoggingWhenConsoleArrives.apply(this, arguments);\n    }\n\n    function Logger(name, factory) {\n      // Private instance variables.\n      var self = this;\n      /**\n       * The level inherited from a parent logger (or a global default). We\n       * cache this here rather than delegating to the parent so that it stays\n       * in sync with the actual logging methods that we have installed (the\n       * parent could change levels but we might not have rebuilt the loggers\n       * in this child yet).\n       * @type {number}\n       */\n      var inheritedLevel;\n      /**\n       * The default level for this logger, if any. If set, this overrides\n       * `inheritedLevel`.\n       * @type {number|null}\n       */\n      var defaultLevel;\n      /**\n       * A user-specific level for this logger. If set, this overrides\n       * `defaultLevel`.\n       * @type {number|null}\n       */\n      var userLevel;\n\n      var storageKey = \"loglevel\";\n      if (typeof name === \"string\") {\n        storageKey += \":\" + name;\n      } else if (typeof name === \"symbol\") {\n        storageKey = undefined;\n      }\n\n      function persistLevelIfPossible(levelNum) {\n          var levelName = (logMethods[levelNum] || 'silent').toUpperCase();\n\n          if (typeof window === undefinedType || !storageKey) return;\n\n          // Use localStorage if available\n          try {\n              window.localStorage[storageKey] = levelName;\n              return;\n          } catch (ignore) {}\n\n          // Use session cookie as fallback\n          try {\n              window.document.cookie =\n                encodeURIComponent(storageKey) + \"=\" + levelName + \";\";\n          } catch (ignore) {}\n      }\n\n      function getPersistedLevel() {\n          var storedLevel;\n\n          if (typeof window === undefinedType || !storageKey) return;\n\n          try {\n              storedLevel = window.localStorage[storageKey];\n          } catch (ignore) {}\n\n          // Fallback to cookies if local storage gives us nothing\n          if (typeof storedLevel === undefinedType) {\n              try {\n                  var cookie = window.document.cookie;\n                  var cookieName = encodeURIComponent(storageKey);\n                  var location = cookie.indexOf(cookieName + \"=\");\n                  if (location !== -1) {\n                      storedLevel = /^([^;]+)/.exec(\n                          cookie.slice(location + cookieName.length + 1)\n                      )[1];\n                  }\n              } catch (ignore) {}\n          }\n\n          // If the stored level is not valid, treat it as if nothing was stored.\n          if (self.levels[storedLevel] === undefined) {\n              storedLevel = undefined;\n          }\n\n          return storedLevel;\n      }\n\n      function clearPersistedLevel() {\n          if (typeof window === undefinedType || !storageKey) return;\n\n          // Use localStorage if available\n          try {\n              window.localStorage.removeItem(storageKey);\n          } catch (ignore) {}\n\n          // Use session cookie as fallback\n          try {\n              window.document.cookie =\n                encodeURIComponent(storageKey) + \"=; expires=Thu, 01 Jan 1970 00:00:00 UTC\";\n          } catch (ignore) {}\n      }\n\n      function normalizeLevel(input) {\n          var level = input;\n          if (typeof level === \"string\" \u0026\u0026 self.levels[level.toUpperCase()] !== undefined) {\n              level = self.levels[level.toUpperCase()];\n          }\n          if (typeof level === \"number\" \u0026\u0026 level \u003e= 0 \u0026\u0026 level \u003c= self.levels.SILENT) {\n              return level;\n          } else {\n              throw new TypeError(\"log.setLevel() called with invalid level: \" + input);\n          }\n      }\n\n      /*\n       *\n       * Public logger API - see https://github.com/pimterry/loglevel for details\n       *\n       */\n\n      self.name = name;\n\n      self.levels = { \"TRACE\": 0, \"DEBUG\": 1, \"INFO\": 2, \"WARN\": 3,\n          \"ERROR\": 4, \"SILENT\": 5};\n\n      self.methodFactory = factory || defaultMethodFactory;\n\n      self.getLevel = function () {\n          if (userLevel != null) {\n            return userLevel;\n          } else if (defaultLevel != null) {\n            return defaultLevel;\n          } else {\n            return inheritedLevel;\n          }\n      };\n\n      self.setLevel = function (level, persist) {\n          userLevel = normalizeLevel(level);\n          if (persist !== false) {  // defaults to true\n              persistLevelIfPossible(userLevel);\n          }\n\n          // NOTE: in v2, this should call rebuild(), which updates children.\n          return replaceLoggingMethods.call(self);\n      };\n\n      self.setDefaultLevel = function (level) {\n          defaultLevel = normalizeLevel(level);\n          if (!getPersistedLevel()) {\n              self.setLevel(level, false);\n          }\n      };\n\n      self.resetLevel = function () {\n          userLevel = null;\n          clearPersistedLevel();\n          replaceLoggingMethods.call(self);\n      };\n\n      self.enableAll = function(persist) {\n          self.setLevel(self.levels.TRACE, persist);\n      };\n\n      self.disableAll = function(persist) {\n          self.setLevel(self.levels.SILENT, persist);\n      };\n\n      self.rebuild = function () {\n          if (defaultLogger !== self) {\n              inheritedLevel = normalizeLevel(defaultLogger.getLevel());\n          }\n          replaceLoggingMethods.call(self);\n\n          if (defaultLogger === self) {\n              for (var childName in _loggersByName) {\n                _loggersByName[childName].rebuild();\n              }\n          }\n      };\n\n      // Initialize all the internal levels.\n      inheritedLevel = normalizeLevel(\n          defaultLogger ? defaultLogger.getLevel() : \"WARN\"\n      );\n      var initialLevel = getPersistedLevel();\n      if (initialLevel != null) {\n          userLevel = normalizeLevel(initialLevel);\n      }\n      replaceLoggingMethods.call(self);\n    }\n\n    /*\n     *\n     * Top-level API\n     *\n     */\n\n    defaultLogger = new Logger();\n\n    defaultLogger.getLogger = function getLogger(name) {\n        if ((typeof name !== \"symbol\" \u0026\u0026 typeof name !== \"string\") || name === \"\") {\n            throw new TypeError(\"You must supply a name when creating a logger.\");\n        }\n\n        var logger = _loggersByName[name];\n        if (!logger) {\n            logger = _loggersByName[name] = new Logger(\n                name,\n                defaultLogger.methodFactory\n            );\n        }\n        return logger;\n    };\n\n    // Grab the current global log variable in case of overwrite\n    var _log = (typeof window !== undefinedType) ? window.log : undefined;\n    defaultLogger.noConflict = function() {\n        if (typeof window !== undefinedType \u0026\u0026\n               window.log === defaultLogger) {\n            window.log = _log;\n        }\n\n        return defaultLogger;\n    };\n\n    defaultLogger.getLoggers = function getLoggers() {\n        return _loggersByName;\n    };\n\n    // ES6 default export, for compatibility\n    defaultLogger['default'] = defaultLogger;\n\n    return defaultLogger;\n}));\n","import * as log from 'loglevel';\n\nexport enum LogLevel {\n  trace = 0,\n  debug = 1,\n  info = 2,\n  warn = 3,\n  error = 4,\n  silent = 5,\n}\n\nexport enum LoggerNames {\n  Default = 'livekit',\n  Room = 'livekit-room',\n  Participant = 'livekit-participant',\n  Track = 'livekit-track',\n  Publication = 'livekit-track-publication',\n  Engine = 'livekit-engine',\n  Signal = 'livekit-signal',\n  PCManager = 'livekit-pc-manager',\n  PCTransport = 'livekit-pc-transport',\n  E2EE = 'lk-e2ee',\n}\n\ntype LogLevelString = keyof typeof LogLevel;\n\nexport type StructuredLogger = log.Logger \u0026 {\n  trace: (msg: string, context?: object) =\u003e void;\n  debug: (msg: string, context?: object) =\u003e void;\n  info: (msg: string, context?: object) =\u003e void;\n  warn: (msg: string, context?: object) =\u003e void;\n  error: (msg: string, context?: object) =\u003e void;\n  setDefaultLevel: (level: log.LogLevelDesc) =\u003e void;\n  setLevel: (level: log.LogLevelDesc) =\u003e void;\n  getLevel: () =\u003e number;\n};\n\nlet livekitLogger = log.getLogger('livekit');\nconst livekitLoggers = Object.values(LoggerNames).map((name) =\u003e log.getLogger(name));\n\nlivekitLogger.setDefaultLevel(LogLevel.info);\n\nexport default livekitLogger as StructuredLogger;\n\n/**\n * @internal\n */\nexport function getLogger(name: string) {\n  const logger = log.getLogger(name);\n  logger.setDefaultLevel(livekitLogger.getLevel());\n  return logger as StructuredLogger;\n}\n\nexport function setLogLevel(level: LogLevel | LogLevelString, loggerName?: LoggerNames) {\n  if (loggerName) {\n    log.getLogger(loggerName).setLevel(level);\n  } else {\n    for (const logger of livekitLoggers) {\n      logger.setLevel(level);\n    }\n  }\n}\n\nexport type LogExtension = (level: LogLevel, msg: string, context?: object) =\u003e void;\n\n/**\n * use this to hook into the logging function to allow sending internal livekit logs to third party services\n * if set, the browser logs will lose their stacktrace information (see https://github.com/pimterry/loglevel#writing-plugins)\n */\nexport function setLogExtension(extension: LogExtension, logger?: StructuredLogger) {\n  const loggers = logger ? [logger] : livekitLoggers;\n\n  loggers.forEach((logR) =\u003e {\n    const originalFactory = logR.methodFactory;\n\n    logR.methodFactory = (methodName, configLevel, loggerName) =\u003e {\n      const rawMethod = originalFactory(methodName, configLevel, loggerName);\n\n      const logLevel = LogLevel[methodName as LogLevelString];\n      const needLog = logLevel \u003e= configLevel \u0026\u0026 logLevel \u003c LogLevel.silent;\n\n      return (msg, context?: [msg: string, context: object]) =\u003e {\n        if (context) rawMethod(msg, context);\n        else rawMethod(msg);\n        if (needLog) {\n          extension(logLevel, msg, context);\n        }\n      };\n    };\n    logR.setLevel(logR.getLevel());\n  });\n}\n\nexport const workerLogger = log.getLogger('lk-e2ee') as StructuredLogger;\n","import type { ReconnectContext, ReconnectPolicy } from './ReconnectPolicy';\n\nconst maxRetryDelay = 7000;\n\nconst DEFAULT_RETRY_DELAYS_IN_MS = [\n  0,\n  300,\n  2 * 2 * 300,\n  3 * 3 * 300,\n  4 * 4 * 300,\n  maxRetryDelay,\n  maxRetryDelay,\n  maxRetryDelay,\n  maxRetryDelay,\n  maxRetryDelay,\n];\n\nclass DefaultReconnectPolicy implements ReconnectPolicy {\n  private readonly _retryDelays: number[];\n\n  constructor(retryDelays?: number[]) {\n    this._retryDelays = retryDelays !== undefined ? [...retryDelays] : DEFAULT_RETRY_DELAYS_IN_MS;\n  }\n\n  public nextRetryDelayInMs(context: ReconnectContext): number | null {\n    if (context.retryCount \u003e= this._retryDelays.length) return null;\n\n    const retryDelay = this._retryDelays[context.retryCount];\n    if (context.retryCount \u003c= 1) return retryDelay;\n\n    return retryDelay + Math.random() * 1_000;\n  }\n}\n\nexport default DefaultReconnectPolicy;\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar R = typeof Reflect === 'object' ? Reflect : null\nvar ReflectApply = R \u0026\u0026 typeof R.apply === 'function'\n  ? R.apply\n  : function ReflectApply(target, receiver, args) {\n    return Function.prototype.apply.call(target, receiver, args);\n  }\n\nvar ReflectOwnKeys\nif (R \u0026\u0026 typeof R.ownKeys === 'function') {\n  ReflectOwnKeys = R.ownKeys\n} else if (Object.getOwnPropertySymbols) {\n  ReflectOwnKeys = function ReflectOwnKeys(target) {\n    return Object.getOwnPropertyNames(target)\n      .concat(Object.getOwnPropertySymbols(target));\n  };\n} else {\n  ReflectOwnKeys = function ReflectOwnKeys(target) {\n    return Object.getOwnPropertyNames(target);\n  };\n}\n\nfunction ProcessEmitWarning(warning) {\n  if (console \u0026\u0026 console.warn) console.warn(warning);\n}\n\nvar NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {\n  return value !== value;\n}\n\nfunction EventEmitter() {\n  EventEmitter.init.call(this);\n}\nmodule.exports = EventEmitter;\nmodule.exports.once = once;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._eventsCount = 0;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nvar defaultMaxListeners = 10;\n\nfunction checkListener(listener) {\n  if (typeof listener !== 'function') {\n    throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n  }\n}\n\nObject.defineProperty(EventEmitter, 'defaultMaxListeners', {\n  enumerable: true,\n  get: function() {\n    return defaultMaxListeners;\n  },\n  set: function(arg) {\n    if (typeof arg !== 'number' || arg \u003c 0 || NumberIsNaN(arg)) {\n      throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received ' + arg + '.');\n    }\n    defaultMaxListeners = arg;\n  }\n});\n\nEventEmitter.init = function() {\n\n  if (this._events === undefined ||\n      this._events === Object.getPrototypeOf(this)._events) {\n    this._events = Object.create(null);\n    this._eventsCount = 0;\n  }\n\n  this._maxListeners = this._maxListeners || undefined;\n};\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n  if (typeof n !== 'number' || n \u003c 0 || NumberIsNaN(n)) {\n    throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received ' + n + '.');\n  }\n  this._maxListeners = n;\n  return this;\n};\n\nfunction _getMaxListeners(that) {\n  if (that._maxListeners === undefined)\n    return EventEmitter.defaultMaxListeners;\n  return that._maxListeners;\n}\n\nEventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n  return _getMaxListeners(this);\n};\n\nEventEmitter.prototype.emit = function emit(type) {\n  var args = [];\n  for (var i = 1; i \u003c arguments.length; i++) args.push(arguments[i]);\n  var doError = (type === 'error');\n\n  var events = this._events;\n  if (events !== undefined)\n    doError = (doError \u0026\u0026 events.error === undefined);\n  else if (!doError)\n    return false;\n\n  // If there is no 'error' event listener then throw.\n  if (doError) {\n    var er;\n    if (args.length \u003e 0)\n      er = args[0];\n    if (er instanceof Error) {\n      // Note: The comments on the `throw` lines are intentional, they show\n      // up in Node's output if this results in an unhandled exception.\n      throw er; // Unhandled 'error' event\n    }\n    // At least give some kind of context to the user\n    var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));\n    err.context = er;\n    throw err; // Unhandled 'error' event\n  }\n\n  var handler = events[type];\n\n  if (handler === undefined)\n    return false;\n\n  if (typeof handler === 'function') {\n    ReflectApply(handler, this, args);\n  } else {\n    var len = handler.length;\n    var listeners = arrayClone(handler, len);\n    for (var i = 0; i \u003c len; ++i)\n      ReflectApply(listeners[i], this, args);\n  }\n\n  return true;\n};\n\nfunction _addListener(target, type, listener, prepend) {\n  var m;\n  var events;\n  var existing;\n\n  checkListener(listener);\n\n  events = target._events;\n  if (events === undefined) {\n    events = target._events = Object.create(null);\n    target._eventsCount = 0;\n  } else {\n    // To avoid recursion in the case that type === \"newListener\"! Before\n    // adding it to the listeners, first emit \"newListener\".\n    if (events.newListener !== undefined) {\n      target.emit('newListener', type,\n                  listener.listener ? listener.listener : listener);\n\n      // Re-assign `events` because a newListener handler could have caused the\n      // this._events to be assigned to a new object\n      events = target._events;\n    }\n    existing = events[type];\n  }\n\n  if (existing === undefined) {\n    // Optimize the case of one listener. Don't need the extra array object.\n    existing = events[type] = listener;\n    ++target._eventsCount;\n  } else {\n    if (typeof existing === 'function') {\n      // Adding the second element, need to change to array.\n      existing = events[type] =\n        prepend ? [listener, existing] : [existing, listener];\n      // If we've already got an array, just append.\n    } else if (prepend) {\n      existing.unshift(listener);\n    } else {\n      existing.push(listener);\n    }\n\n    // Check for listener leak\n    m = _getMaxListeners(target);\n    if (m \u003e 0 \u0026\u0026 existing.length \u003e m \u0026\u0026 !existing.warned) {\n      existing.warned = true;\n      // No error code for this since it is a Warning\n      // eslint-disable-next-line no-restricted-syntax\n      var w = new Error('Possible EventEmitter memory leak detected. ' +\n                          existing.length + ' ' + String(type) + ' listeners ' +\n                          'added. Use emitter.setMaxListeners() to ' +\n                          'increase limit');\n      w.name = 'MaxListenersExceededWarning';\n      w.emitter = target;\n      w.type = type;\n      w.count = existing.length;\n      ProcessEmitWarning(w);\n    }\n  }\n\n  return target;\n}\n\nEventEmitter.prototype.addListener = function addListener(type, listener) {\n  return _addListener(this, type, listener, false);\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.prependListener =\n    function prependListener(type, listener) {\n      return _addListener(this, type, listener, true);\n    };\n\nfunction onceWrapper() {\n  if (!this.fired) {\n    this.target.removeListener(this.type, this.wrapFn);\n    this.fired = true;\n    if (arguments.length === 0)\n      return this.listener.call(this.target);\n    return this.listener.apply(this.target, arguments);\n  }\n}\n\nfunction _onceWrap(target, type, listener) {\n  var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };\n  var wrapped = onceWrapper.bind(state);\n  wrapped.listener = listener;\n  state.wrapFn = wrapped;\n  return wrapped;\n}\n\nEventEmitter.prototype.once = function once(type, listener) {\n  checkListener(listener);\n  this.on(type, _onceWrap(this, type, listener));\n  return this;\n};\n\nEventEmitter.prototype.prependOnceListener =\n    function prependOnceListener(type, listener) {\n      checkListener(listener);\n      this.prependListener(type, _onceWrap(this, type, listener));\n      return this;\n    };\n\n// Emits a 'removeListener' event if and only if the listener was removed.\nEventEmitter.prototype.removeListener =\n    function removeListener(type, listener) {\n      var list, events, position, i, originalListener;\n\n      checkListener(listener);\n\n      events = this._events;\n      if (events === undefined)\n        return this;\n\n      list = events[type];\n      if (list === undefined)\n        return this;\n\n      if (list === listener || list.listener === listener) {\n        if (--this._eventsCount === 0)\n          this._events = Object.create(null);\n        else {\n          delete events[type];\n          if (events.removeListener)\n            this.emit('removeListener', type, list.listener || listener);\n        }\n      } else if (typeof list !== 'function') {\n        position = -1;\n\n        for (i = list.length - 1; i \u003e= 0; i--) {\n          if (list[i] === listener || list[i].listener === listener) {\n            originalListener = list[i].listener;\n            position = i;\n            break;\n          }\n        }\n\n        if (position \u003c 0)\n          return this;\n\n        if (position === 0)\n          list.shift();\n        else {\n          spliceOne(list, position);\n        }\n\n        if (list.length === 1)\n          events[type] = list[0];\n\n        if (events.removeListener !== undefined)\n          this.emit('removeListener', type, originalListener || listener);\n      }\n\n      return this;\n    };\n\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n\nEventEmitter.prototype.removeAllListeners =\n    function removeAllListeners(type) {\n      var listeners, events, i;\n\n      events = this._events;\n      if (events === undefined)\n        return this;\n\n      // not listening for removeListener, no need to emit\n      if (events.removeListener === undefined) {\n        if (arguments.length === 0) {\n          this._events = Object.create(null);\n          this._eventsCount = 0;\n        } else if (events[type] !== undefined) {\n          if (--this._eventsCount === 0)\n            this._events = Object.create(null);\n          else\n            delete events[type];\n        }\n        return this;\n      }\n\n      // emit removeListener for all listeners on all events\n      if (arguments.length === 0) {\n        var keys = Object.keys(events);\n        var key;\n        for (i = 0; i \u003c keys.length; ++i) {\n          key = keys[i];\n          if (key === 'removeListener') continue;\n          this.removeAllListeners(key);\n        }\n        this.removeAllListeners('removeListener');\n        this._events = Object.create(null);\n        this._eventsCount = 0;\n        return this;\n      }\n\n      listeners = events[type];\n\n      if (typeof listeners === 'function') {\n        this.removeListener(type, listeners);\n      } else if (listeners !== undefined) {\n        // LIFO order\n        for (i = listeners.length - 1; i \u003e= 0; i--) {\n          this.removeListener(type, listeners[i]);\n        }\n      }\n\n      return this;\n    };\n\nfunction _listeners(target, type, unwrap) {\n  var events = target._events;\n\n  if (events === undefined)\n    return [];\n\n  var evlistener = events[type];\n  if (evlistener === undefined)\n    return [];\n\n  if (typeof evlistener === 'function')\n    return unwrap ? [evlistener.listener || evlistener] : [evlistener];\n\n  return unwrap ?\n    unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);\n}\n\nEventEmitter.prototype.listeners = function listeners(type) {\n  return _listeners(this, type, true);\n};\n\nEventEmitter.prototype.rawListeners = function rawListeners(type) {\n  return _listeners(this, type, false);\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n  if (typeof emitter.listenerCount === 'function') {\n    return emitter.listenerCount(type);\n  } else {\n    return listenerCount.call(emitter, type);\n  }\n};\n\nEventEmitter.prototype.listenerCount = listenerCount;\nfunction listenerCount(type) {\n  var events = this._events;\n\n  if (events !== undefined) {\n    var evlistener = events[type];\n\n    if (typeof evlistener === 'function') {\n      return 1;\n    } else if (evlistener !== undefined) {\n      return evlistener.length;\n    }\n  }\n\n  return 0;\n}\n\nEventEmitter.prototype.eventNames = function eventNames() {\n  return this._eventsCount \u003e 0 ? ReflectOwnKeys(this._events) : [];\n};\n\nfunction arrayClone(arr, n) {\n  var copy = new Array(n);\n  for (var i = 0; i \u003c n; ++i)\n    copy[i] = arr[i];\n  return copy;\n}\n\nfunction spliceOne(list, index) {\n  for (; index + 1 \u003c list.length; index++)\n    list[index] = list[index + 1];\n  list.pop();\n}\n\nfunction unwrapListeners(arr) {\n  var ret = new Array(arr.length);\n  for (var i = 0; i \u003c ret.length; ++i) {\n    ret[i] = arr[i].listener || arr[i];\n  }\n  return ret;\n}\n\nfunction once(emitter, name) {\n  return new Promise(function (resolve, reject) {\n    function errorListener(err) {\n      emitter.removeListener(name, resolver);\n      reject(err);\n    }\n\n    function resolver() {\n      if (typeof emitter.removeListener === 'function') {\n        emitter.removeListener('error', errorListener);\n      }\n      resolve([].slice.call(arguments));\n    };\n\n    eventTargetAgnosticAddListener(emitter, name, resolver, { once: true });\n    if (name !== 'error') {\n      addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true });\n    }\n  });\n}\n\nfunction addErrorHandlerIfEventEmitter(emitter, handler, flags) {\n  if (typeof emitter.on === 'function') {\n    eventTargetAgnosticAddListener(emitter, 'error', handler, flags);\n  }\n}\n\nfunction eventTargetAgnosticAddListener(emitter, name, listener, flags) {\n  if (typeof emitter.on === 'function') {\n    if (flags.once) {\n      emitter.once(name, listener);\n    } else {\n      emitter.on(name, listener);\n    }\n  } else if (typeof emitter.addEventListener === 'function') {\n    // EventTarget does not have `error` event semantics like Node\n    // EventEmitters, we do not listen for `error` events here.\n    emitter.addEventListener(name, function wrapListener(arg) {\n      // IE does not have builtin `{ once: true }` support so we\n      // have to do it manually.\n      if (flags.once) {\n        emitter.removeEventListener(name, wrapListener);\n      }\n      listener(arg);\n    });\n  } else {\n    throw new TypeError('The \"emitter\" argument must be of type EventEmitter. Received type ' + typeof emitter);\n  }\n}\n","/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n/* eslint-env node */\n'use strict';\n\nlet logDisabled_ = true;\nlet deprecationWarnings_ = true;\n\n/**\n * Extract browser version out of the provided user agent string.\n *\n * @param {!string} uastring userAgent string.\n * @param {!string} expr Regular expression used as match criteria.\n * @param {!number} pos position in the version string to be returned.\n * @return {!number} browser version.\n */\nexport function extractVersion(uastring, expr, pos) {\n  const match = uastring.match(expr);\n  return match \u0026\u0026 match.length \u003e= pos \u0026\u0026 parseFloat(match[pos], 10);\n}\n\n// Wraps the peerconnection event eventNameToWrap in a function\n// which returns the modified event object (or false to prevent\n// the event).\nexport function wrapPeerConnectionEvent(window, eventNameToWrap, wrapper) {\n  if (!window.RTCPeerConnection) {\n    return;\n  }\n  const proto = window.RTCPeerConnection.prototype;\n  const nativeAddEventListener = proto.addEventListener;\n  proto.addEventListener = function(nativeEventName, cb) {\n    if (nativeEventName !== eventNameToWrap) {\n      return nativeAddEventListener.apply(this, arguments);\n    }\n    const wrappedCallback = (e) =\u003e {\n      const modifiedEvent = wrapper(e);\n      if (modifiedEvent) {\n        if (cb.handleEvent) {\n          cb.handleEvent(modifiedEvent);\n        } else {\n          cb(modifiedEvent);\n        }\n      }\n    };\n    this._eventMap = this._eventMap || {};\n    if (!this._eventMap[eventNameToWrap]) {\n      this._eventMap[eventNameToWrap] = new Map();\n    }\n    this._eventMap[eventNameToWrap].set(cb, wrappedCallback);\n    return nativeAddEventListener.apply(this, [nativeEventName,\n      wrappedCallback]);\n  };\n\n  const nativeRemoveEventListener = proto.removeEventListener;\n  proto.removeEventListener = function(nativeEventName, cb) {\n    if (nativeEventName !== eventNameToWrap || !this._eventMap\n        || !this._eventMap[eventNameToWrap]) {\n      return nativeRemoveEventListener.apply(this, arguments);\n    }\n    if (!this._eventMap[eventNameToWrap].has(cb)) {\n      return nativeRemoveEventListener.apply(this, arguments);\n    }\n    const unwrappedCb = this._eventMap[eventNameToWrap].get(cb);\n    this._eventMap[eventNameToWrap].delete(cb);\n    if (this._eventMap[eventNameToWrap].size === 0) {\n      delete this._eventMap[eventNameToWrap];\n    }\n    if (Object.keys(this._eventMap).length === 0) {\n      delete this._eventMap;\n    }\n    return nativeRemoveEventListener.apply(this, [nativeEventName,\n      unwrappedCb]);\n  };\n\n  Object.defineProperty(proto, 'on' + eventNameToWrap, {\n    get() {\n      return this['_on' + eventNameToWrap];\n    },\n    set(cb) {\n      if (this['_on' + eventNameToWrap]) {\n        this.removeEventListener(eventNameToWrap,\n          this['_on' + eventNameToWrap]);\n        delete this['_on' + eventNameToWrap];\n      }\n      if (cb) {\n        this.addEventListener(eventNameToWrap,\n          this['_on' + eventNameToWrap] = cb);\n      }\n    },\n    enumerable: true,\n    configurable: true\n  });\n}\n\nexport function disableLog(bool) {\n  if (typeof bool !== 'boolean') {\n    return new Error('Argument type: ' + typeof bool +\n        '. Please use a boolean.');\n  }\n  logDisabled_ = bool;\n  return (bool) ? 'adapter.js logging disabled' :\n    'adapter.js logging enabled';\n}\n\n/**\n * Disable or enable deprecation warnings\n * @param {!boolean} bool set to true to disable warnings.\n */\nexport function disableWarnings(bool) {\n  if (typeof bool !== 'boolean') {\n    return new Error('Argument type: ' + typeof bool +\n        '. Please use a boolean.');\n  }\n  deprecationWarnings_ = !bool;\n  return 'adapter.js deprecation warnings ' + (bool ? 'disabled' : 'enabled');\n}\n\nexport function log() {\n  if (typeof window === 'object') {\n    if (logDisabled_) {\n      return;\n    }\n    if (typeof console !== 'undefined' \u0026\u0026 typeof console.log === 'function') {\n      console.log.apply(console, arguments);\n    }\n  }\n}\n\n/**\n * Shows a deprecation warning suggesting the modern and spec-compatible API.\n */\nexport function deprecated(oldMethod, newMethod) {\n  if (!deprecationWarnings_) {\n    return;\n  }\n  console.warn(oldMethod + ' is deprecated, please use ' + newMethod +\n      ' instead.');\n}\n\n/**\n * Browser detector.\n *\n * @return {object} result containing browser and version\n *     properties.\n */\nexport function detectBrowser(window) {\n  // Returned result object.\n  const result = {browser: null, version: null};\n\n  // Fail early if it's not a browser\n  if (typeof window === 'undefined' || !window.navigator ||\n      !window.navigator.userAgent) {\n    result.browser = 'Not a browser.';\n    return result;\n  }\n\n  const {navigator} = window;\n\n  // Prefer navigator.userAgentData.\n  if (navigator.userAgentData \u0026\u0026 navigator.userAgentData.brands) {\n    const chromium = navigator.userAgentData.brands.find((brand) =\u003e {\n      return brand.brand === 'Chromium';\n    });\n    if (chromium) {\n      return {browser: 'chrome', version: parseInt(chromium.version, 10)};\n    }\n  }\n\n  if (navigator.mozGetUserMedia) { // Firefox.\n    result.browser = 'firefox';\n    result.version = parseInt(extractVersion(navigator.userAgent,\n      /Firefox\\/(\\d+)\\./, 1));\n  } else if (navigator.webkitGetUserMedia ||\n      (window.isSecureContext === false \u0026\u0026 window.webkitRTCPeerConnection)) {\n    // Chrome, Chromium, Webview, Opera.\n    // Version matches Chrome/WebRTC version.\n    // Chrome 74 removed webkitGetUserMedia on http as well so we need the\n    // more complicated fallback to webkitRTCPeerConnection.\n    result.browser = 'chrome';\n    result.version = parseInt(extractVersion(navigator.userAgent,\n      /Chrom(e|ium)\\/(\\d+)\\./, 2));\n  } else if (window.RTCPeerConnection \u0026\u0026\n      navigator.userAgent.match(/AppleWebKit\\/(\\d+)\\./)) { // Safari.\n    result.browser = 'safari';\n    result.version = parseInt(extractVersion(navigator.userAgent,\n      /AppleWebKit\\/(\\d+)\\./, 1));\n    result.supportsUnifiedPlan = window.RTCRtpTransceiver \u0026\u0026\n        'currentDirection' in window.RTCRtpTransceiver.prototype;\n    // Only for internal usage.\n    result._safariVersion = extractVersion(navigator.userAgent,\n      /Version\\/(\\d+(\\.?\\d+))/, 1);\n  } else { // Default fallthrough: not supported.\n    result.browser = 'Not a supported browser.';\n    return result;\n  }\n\n  return result;\n}\n\n/**\n * Checks if something is an object.\n *\n * @param {*} val The something you want to check.\n * @return true if val is an object, false otherwise.\n */\nfunction isObject(val) {\n  return Object.prototype.toString.call(val) === '[object Object]';\n}\n\n/**\n * Remove all empty objects and undefined values\n * from a nested object -- an enhanced and vanilla version\n * of Lodash's `compact`.\n */\nexport function compactObject(data) {\n  if (!isObject(data)) {\n    return data;\n  }\n\n  return Object.keys(data).reduce(function(accumulator, key) {\n    const isObj = isObject(data[key]);\n    const value = isObj ? compactObject(data[key]) : data[key];\n    const isEmptyObject = isObj \u0026\u0026 !Object.keys(value).length;\n    if (value === undefined || isEmptyObject) {\n      return accumulator;\n    }\n    return Object.assign(accumulator, {[key]: value});\n  }, {});\n}\n\n/* iterates the stats graph recursively. */\nexport function walkStats(stats, base, resultSet) {\n  if (!base || resultSet.has(base.id)) {\n    return;\n  }\n  resultSet.set(base.id, base);\n  Object.keys(base).forEach(name =\u003e {\n    if (name.endsWith('Id')) {\n      walkStats(stats, stats.get(base[name]), resultSet);\n    } else if (name.endsWith('Ids')) {\n      base[name].forEach(id =\u003e {\n        walkStats(stats, stats.get(id), resultSet);\n      });\n    }\n  });\n}\n\n/* filter getStats for a sender/receiver track. */\nexport function filterStats(result, track, outbound) {\n  const streamStatsType = outbound ? 'outbound-rtp' : 'inbound-rtp';\n  const filteredResult = new Map();\n  if (track === null) {\n    return filteredResult;\n  }\n  const trackStats = [];\n  result.forEach(value =\u003e {\n    if (value.type === 'track' \u0026\u0026\n        value.trackIdentifier === track.id) {\n      trackStats.push(value);\n    }\n  });\n  trackStats.forEach(trackStat =\u003e {\n    result.forEach(stats =\u003e {\n      if (stats.type === streamStatsType \u0026\u0026 stats.trackId === trackStat.id) {\n        walkStats(result, stats, filteredResult);\n      }\n    });\n  });\n  return filteredResult;\n}\n\n","/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n/* eslint-env node */\n'use strict';\nimport * as utils from '../utils.js';\nconst logging = utils.log;\n\nexport function shimGetUserMedia(window, browserDetails) {\n  const navigator = window \u0026\u0026 window.navigator;\n\n  if (!navigator.mediaDevices) {\n    return;\n  }\n\n  const constraintsToChrome_ = function(c) {\n    if (typeof c !== 'object' || c.mandatory || c.optional) {\n      return c;\n    }\n    const cc = {};\n    Object.keys(c).forEach(key =\u003e {\n      if (key === 'require' || key === 'advanced' || key === 'mediaSource') {\n        return;\n      }\n      const r = (typeof c[key] === 'object') ? c[key] : {ideal: c[key]};\n      if (r.exact !== undefined \u0026\u0026 typeof r.exact === 'number') {\n        r.min = r.max = r.exact;\n      }\n      const oldname_ = function(prefix, name) {\n        if (prefix) {\n          return prefix + name.charAt(0).toUpperCase() + name.slice(1);\n        }\n        return (name === 'deviceId') ? 'sourceId' : name;\n      };\n      if (r.ideal !== undefined) {\n        cc.optional = cc.optional || [];\n        let oc = {};\n        if (typeof r.ideal === 'number') {\n          oc[oldname_('min', key)] = r.ideal;\n          cc.optional.push(oc);\n          oc = {};\n          oc[oldname_('max', key)] = r.ideal;\n          cc.optional.push(oc);\n        } else {\n          oc[oldname_('', key)] = r.ideal;\n          cc.optional.push(oc);\n        }\n      }\n      if (r.exact !== undefined \u0026\u0026 typeof r.exact !== 'number') {\n        cc.mandatory = cc.mandatory || {};\n        cc.mandatory[oldname_('', key)] = r.exact;\n      } else {\n        ['min', 'max'].forEach(mix =\u003e {\n          if (r[mix] !== undefined) {\n            cc.mandatory = cc.mandatory || {};\n            cc.mandatory[oldname_(mix, key)] = r[mix];\n          }\n        });\n      }\n    });\n    if (c.advanced) {\n      cc.optional = (cc.optional || []).concat(c.advanced);\n    }\n    return cc;\n  };\n\n  const shimConstraints_ = function(constraints, func) {\n    if (browserDetails.version \u003e= 61) {\n      return func(constraints);\n    }\n    constraints = JSON.parse(JSON.stringify(constraints));\n    if (constraints \u0026\u0026 typeof constraints.audio === 'object') {\n      const remap = function(obj, a, b) {\n        if (a in obj \u0026\u0026 !(b in obj)) {\n          obj[b] = obj[a];\n          delete obj[a];\n        }\n      };\n      constraints = JSON.parse(JSON.stringify(constraints));\n      remap(constraints.audio, 'autoGainControl', 'googAutoGainControl');\n      remap(constraints.audio, 'noiseSuppression', 'googNoiseSuppression');\n      constraints.audio = constraintsToChrome_(constraints.audio);\n    }\n    if (constraints \u0026\u0026 typeof constraints.video === 'object') {\n      // Shim facingMode for mobile \u0026 surface pro.\n      let face = constraints.video.facingMode;\n      face = face \u0026\u0026 ((typeof face === 'object') ? face : {ideal: face});\n      const getSupportedFacingModeLies = browserDetails.version \u003c 66;\n\n      if ((face \u0026\u0026 (face.exact === 'user' || face.exact === 'environment' ||\n                    face.ideal === 'user' || face.ideal === 'environment')) \u0026\u0026\n          !(navigator.mediaDevices.getSupportedConstraints \u0026\u0026\n            navigator.mediaDevices.getSupportedConstraints().facingMode \u0026\u0026\n            !getSupportedFacingModeLies)) {\n        delete constraints.video.facingMode;\n        let matches;\n        if (face.exact === 'environment' || face.ideal === 'environment') {\n          matches = ['back', 'rear'];\n        } else if (face.exact === 'user' || face.ideal === 'user') {\n          matches = ['front'];\n        }\n        if (matches) {\n          // Look for matches in label, or use last cam for back (typical).\n          return navigator.mediaDevices.enumerateDevices()\n            .then(devices =\u003e {\n              devices = devices.filter(d =\u003e d.kind === 'videoinput');\n              let dev = devices.find(d =\u003e matches.some(match =\u003e\n                d.label.toLowerCase().includes(match)));\n              if (!dev \u0026\u0026 devices.length \u0026\u0026 matches.includes('back')) {\n                dev = devices[devices.length - 1]; // more likely the back cam\n              }\n              if (dev) {\n                constraints.video.deviceId = face.exact\n                  ? {exact: dev.deviceId}\n                  : {ideal: dev.deviceId};\n              }\n              constraints.video = constraintsToChrome_(constraints.video);\n              logging('chrome: ' + JSON.stringify(constraints));\n              return func(constraints);\n            });\n        }\n      }\n      constraints.video = constraintsToChrome_(constraints.video);\n    }\n    logging('chrome: ' + JSON.stringify(constraints));\n    return func(constraints);\n  };\n\n  const shimError_ = function(e) {\n    if (browserDetails.version \u003e= 64) {\n      return e;\n    }\n    return {\n      name: {\n        PermissionDeniedError: 'NotAllowedError',\n        PermissionDismissedError: 'NotAllowedError',\n        InvalidStateError: 'NotAllowedError',\n        DevicesNotFoundError: 'NotFoundError',\n        ConstraintNotSatisfiedError: 'OverconstrainedError',\n        TrackStartError: 'NotReadableError',\n        MediaDeviceFailedDueToShutdown: 'NotAllowedError',\n        MediaDeviceKillSwitchOn: 'NotAllowedError',\n        TabCaptureError: 'AbortError',\n        ScreenCaptureError: 'AbortError',\n        DeviceCaptureError: 'AbortError'\n      }[e.name] || e.name,\n      message: e.message,\n      constraint: e.constraint || e.constraintName,\n      toString() {\n        return this.name + (this.message \u0026\u0026 ': ') + this.message;\n      }\n    };\n  };\n\n  const getUserMedia_ = function(constraints, onSuccess, onError) {\n    shimConstraints_(constraints, c =\u003e {\n      navigator.webkitGetUserMedia(c, onSuccess, e =\u003e {\n        if (onError) {\n          onError(shimError_(e));\n        }\n      });\n    });\n  };\n  navigator.getUserMedia = getUserMedia_.bind(navigator);\n\n  // Even though Chrome 45 has navigator.mediaDevices and a getUserMedia\n  // function which returns a Promise, it does not accept spec-style\n  // constraints.\n  if (navigator.mediaDevices.getUserMedia) {\n    const origGetUserMedia = navigator.mediaDevices.getUserMedia.\n      bind(navigator.mediaDevices);\n    navigator.mediaDevices.getUserMedia = function(cs) {\n      return shimConstraints_(cs, c =\u003e origGetUserMedia(c).then(stream =\u003e {\n        if (c.audio \u0026\u0026 !stream.getAudioTracks().length ||\n            c.video \u0026\u0026 !stream.getVideoTracks().length) {\n          stream.getTracks().forEach(track =\u003e {\n            track.stop();\n          });\n          throw new DOMException('', 'NotFoundError');\n        }\n        return stream;\n      }, e =\u003e Promise.reject(shimError_(e))));\n    };\n  }\n}\n","/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n/* eslint-env node */\n'use strict';\nimport * as utils from '../utils.js';\n\nexport {shimGetUserMedia} from './getusermedia';\n\nexport function shimMediaStream(window) {\n  window.MediaStream = window.MediaStream || window.webkitMediaStream;\n}\n\nexport function shimOnTrack(window) {\n  if (typeof window === 'object' \u0026\u0026 window.RTCPeerConnection \u0026\u0026 !('ontrack' in\n      window.RTCPeerConnection.prototype)) {\n    Object.defineProperty(window.RTCPeerConnection.prototype, 'ontrack', {\n      get() {\n        return this._ontrack;\n      },\n      set(f) {\n        if (this._ontrack) {\n          this.removeEventListener('track', this._ontrack);\n        }\n        this.addEventListener('track', this._ontrack = f);\n      },\n      enumerable: true,\n      configurable: true\n    });\n    const origSetRemoteDescription =\n        window.RTCPeerConnection.prototype.setRemoteDescription;\n    window.RTCPeerConnection.prototype.setRemoteDescription =\n      function setRemoteDescription() {\n        if (!this._ontrackpoly) {\n          this._ontrackpoly = (e) =\u003e {\n            // onaddstream does not fire when a track is added to an existing\n            // stream. But stream.onaddtrack is implemented so we use that.\n            e.stream.addEventListener('addtrack', te =\u003e {\n              let receiver;\n              if (window.RTCPeerConnection.prototype.getReceivers) {\n                receiver = this.getReceivers()\n                  .find(r =\u003e r.track \u0026\u0026 r.track.id === te.track.id);\n              } else {\n                receiver = {track: te.track};\n              }\n\n              const event = new Event('track');\n              event.track = te.track;\n              event.receiver = receiver;\n              event.transceiver = {receiver};\n              event.streams = [e.stream];\n              this.dispatchEvent(event);\n            });\n            e.stream.getTracks().forEach(track =\u003e {\n              let receiver;\n              if (window.RTCPeerConnection.prototype.getReceivers) {\n                receiver = this.getReceivers()\n                  .find(r =\u003e r.track \u0026\u0026 r.track.id === track.id);\n              } else {\n                receiver = {track};\n              }\n              const event = new Event('track');\n              event.track = track;\n              event.receiver = receiver;\n              event.transceiver = {receiver};\n              event.streams = [e.stream];\n              this.dispatchEvent(event);\n            });\n          };\n          this.addEventListener('addstream', this._ontrackpoly);\n        }\n        return origSetRemoteDescription.apply(this, arguments);\n      };\n  } else {\n    // even if RTCRtpTransceiver is in window, it is only used and\n    // emitted in unified-plan. Unfortunately this means we need\n    // to unconditionally wrap the event.\n    utils.wrapPeerConnectionEvent(window, 'track', e =\u003e {\n      if (!e.transceiver) {\n        Object.defineProperty(e, 'transceiver',\n          {value: {receiver: e.receiver}});\n      }\n      return e;\n    });\n  }\n}\n\nexport function shimGetSendersWithDtmf(window) {\n  // Overrides addTrack/removeTrack, depends on shimAddTrackRemoveTrack.\n  if (typeof window === 'object' \u0026\u0026 window.RTCPeerConnection \u0026\u0026\n      !('getSenders' in window.RTCPeerConnection.prototype) \u0026\u0026\n      'createDTMFSender' in window.RTCPeerConnection.prototype) {\n    const shimSenderWithDtmf = function(pc, track) {\n      return {\n        track,\n        get dtmf() {\n          if (this._dtmf === undefined) {\n            if (track.kind === 'audio') {\n              this._dtmf = pc.createDTMFSender(track);\n            } else {\n              this._dtmf = null;\n            }\n          }\n          return this._dtmf;\n        },\n        _pc: pc\n      };\n    };\n\n    // augment addTrack when getSenders is not available.\n    if (!window.RTCPeerConnection.prototype.getSenders) {\n      window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n        this._senders = this._senders || [];\n        return this._senders.slice(); // return a copy of the internal state.\n      };\n      const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n      window.RTCPeerConnection.prototype.addTrack =\n        function addTrack(track, stream) {\n          let sender = origAddTrack.apply(this, arguments);\n          if (!sender) {\n            sender = shimSenderWithDtmf(this, track);\n            this._senders.push(sender);\n          }\n          return sender;\n        };\n\n      const origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack;\n      window.RTCPeerConnection.prototype.removeTrack =\n        function removeTrack(sender) {\n          origRemoveTrack.apply(this, arguments);\n          const idx = this._senders.indexOf(sender);\n          if (idx !== -1) {\n            this._senders.splice(idx, 1);\n          }\n        };\n    }\n    const origAddStream = window.RTCPeerConnection.prototype.addStream;\n    window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n      this._senders = this._senders || [];\n      origAddStream.apply(this, [stream]);\n      stream.getTracks().forEach(track =\u003e {\n        this._senders.push(shimSenderWithDtmf(this, track));\n      });\n    };\n\n    const origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n    window.RTCPeerConnection.prototype.removeStream =\n      function removeStream(stream) {\n        this._senders = this._senders || [];\n        origRemoveStream.apply(this, [stream]);\n\n        stream.getTracks().forEach(track =\u003e {\n          const sender = this._senders.find(s =\u003e s.track === track);\n          if (sender) { // remove sender\n            this._senders.splice(this._senders.indexOf(sender), 1);\n          }\n        });\n      };\n  } else if (typeof window === 'object' \u0026\u0026 window.RTCPeerConnection \u0026\u0026\n             'getSenders' in window.RTCPeerConnection.prototype \u0026\u0026\n             'createDTMFSender' in window.RTCPeerConnection.prototype \u0026\u0026\n             window.RTCRtpSender \u0026\u0026\n             !('dtmf' in window.RTCRtpSender.prototype)) {\n    const origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n    window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n      const senders = origGetSenders.apply(this, []);\n      senders.forEach(sender =\u003e sender._pc = this);\n      return senders;\n    };\n\n    Object.defineProperty(window.RTCRtpSender.prototype, 'dtmf', {\n      get() {\n        if (this._dtmf === undefined) {\n          if (this.track.kind === 'audio') {\n            this._dtmf = this._pc.createDTMFSender(this.track);\n          } else {\n            this._dtmf = null;\n          }\n        }\n        return this._dtmf;\n      }\n    });\n  }\n}\n\nexport function shimSenderReceiverGetStats(window) {\n  if (!(typeof window === 'object' \u0026\u0026 window.RTCPeerConnection \u0026\u0026\n      window.RTCRtpSender \u0026\u0026 window.RTCRtpReceiver)) {\n    return;\n  }\n\n  // shim sender stats.\n  if (!('getStats' in window.RTCRtpSender.prototype)) {\n    const origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n    if (origGetSenders) {\n      window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n        const senders = origGetSenders.apply(this, []);\n        senders.forEach(sender =\u003e sender._pc = this);\n        return senders;\n      };\n    }\n\n    const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n    if (origAddTrack) {\n      window.RTCPeerConnection.prototype.addTrack = function addTrack() {\n        const sender = origAddTrack.apply(this, arguments);\n        sender._pc = this;\n        return sender;\n      };\n    }\n    window.RTCRtpSender.prototype.getStats = function getStats() {\n      const sender = this;\n      return this._pc.getStats().then(result =\u003e\n        /* Note: this will include stats of all senders that\n         *   send a track with the same id as sender.track as\n         *   it is not possible to identify the RTCRtpSender.\n         */\n        utils.filterStats(result, sender.track, true));\n    };\n  }\n\n  // shim receiver stats.\n  if (!('getStats' in window.RTCRtpReceiver.prototype)) {\n    const origGetReceivers = window.RTCPeerConnection.prototype.getReceivers;\n    if (origGetReceivers) {\n      window.RTCPeerConnection.prototype.getReceivers =\n        function getReceivers() {\n          const receivers = origGetReceivers.apply(this, []);\n          receivers.forEach(receiver =\u003e receiver._pc = this);\n          return receivers;\n        };\n    }\n    utils.wrapPeerConnectionEvent(window, 'track', e =\u003e {\n      e.receiver._pc = e.srcElement;\n      return e;\n    });\n    window.RTCRtpReceiver.prototype.getStats = function getStats() {\n      const receiver = this;\n      return this._pc.getStats().then(result =\u003e\n        utils.filterStats(result, receiver.track, false));\n    };\n  }\n\n  if (!('getStats' in window.RTCRtpSender.prototype \u0026\u0026\n      'getStats' in window.RTCRtpReceiver.prototype)) {\n    return;\n  }\n\n  // shim RTCPeerConnection.getStats(track).\n  const origGetStats = window.RTCPeerConnection.prototype.getStats;\n  window.RTCPeerConnection.prototype.getStats = function getStats() {\n    if (arguments.length \u003e 0 \u0026\u0026\n        arguments[0] instanceof window.MediaStreamTrack) {\n      const track = arguments[0];\n      let sender;\n      let receiver;\n      let err;\n      this.getSenders().forEach(s =\u003e {\n        if (s.track === track) {\n          if (sender) {\n            err = true;\n          } else {\n            sender = s;\n          }\n        }\n      });\n      this.getReceivers().forEach(r =\u003e {\n        if (r.track === track) {\n          if (receiver) {\n            err = true;\n          } else {\n            receiver = r;\n          }\n        }\n        return r.track === track;\n      });\n      if (err || (sender \u0026\u0026 receiver)) {\n        return Promise.reject(new DOMException(\n          'There are more than one sender or receiver for the track.',\n          'InvalidAccessError'));\n      } else if (sender) {\n        return sender.getStats();\n      } else if (receiver) {\n        return receiver.getStats();\n      }\n      return Promise.reject(new DOMException(\n        'There is no sender or receiver for the track.',\n        'InvalidAccessError'));\n    }\n    return origGetStats.apply(this, arguments);\n  };\n}\n\nexport function shimAddTrackRemoveTrackWithNative(window) {\n  // shim addTrack/removeTrack with native variants in order to make\n  // the interactions with legacy getLocalStreams behave as in other browsers.\n  // Keeps a mapping stream.id =\u003e [stream, rtpsenders...]\n  window.RTCPeerConnection.prototype.getLocalStreams =\n    function getLocalStreams() {\n      this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n      return Object.keys(this._shimmedLocalStreams)\n        .map(streamId =\u003e this._shimmedLocalStreams[streamId][0]);\n    };\n\n  const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n  window.RTCPeerConnection.prototype.addTrack =\n    function addTrack(track, stream) {\n      if (!stream) {\n        return origAddTrack.apply(this, arguments);\n      }\n      this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n\n      const sender = origAddTrack.apply(this, arguments);\n      if (!this._shimmedLocalStreams[stream.id]) {\n        this._shimmedLocalStreams[stream.id] = [stream, sender];\n      } else if (this._shimmedLocalStreams[stream.id].indexOf(sender) === -1) {\n        this._shimmedLocalStreams[stream.id].push(sender);\n      }\n      return sender;\n    };\n\n  const origAddStream = window.RTCPeerConnection.prototype.addStream;\n  window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n    this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n\n    stream.getTracks().forEach(track =\u003e {\n      const alreadyExists = this.getSenders().find(s =\u003e s.track === track);\n      if (alreadyExists) {\n        throw new DOMException('Track already exists.',\n          'InvalidAccessError');\n      }\n    });\n    const existingSenders = this.getSenders();\n    origAddStream.apply(this, arguments);\n    const newSenders = this.getSenders()\n      .filter(newSender =\u003e existingSenders.indexOf(newSender) === -1);\n    this._shimmedLocalStreams[stream.id] = [stream].concat(newSenders);\n  };\n\n  const origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n  window.RTCPeerConnection.prototype.removeStream =\n    function removeStream(stream) {\n      this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n      delete this._shimmedLocalStreams[stream.id];\n      return origRemoveStream.apply(this, arguments);\n    };\n\n  const origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack;\n  window.RTCPeerConnection.prototype.removeTrack =\n    function removeTrack(sender) {\n      this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n      if (sender) {\n        Object.keys(this._shimmedLocalStreams).forEach(streamId =\u003e {\n          const idx = this._shimmedLocalStreams[streamId].indexOf(sender);\n          if (idx !== -1) {\n            this._shimmedLocalStreams[streamId].splice(idx, 1);\n          }\n          if (this._shimmedLocalStreams[streamId].length === 1) {\n            delete this._shimmedLocalStreams[streamId];\n          }\n        });\n      }\n      return origRemoveTrack.apply(this, arguments);\n    };\n}\n\nexport function shimAddTrackRemoveTrack(window, browserDetails) {\n  if (!window.RTCPeerConnection) {\n    return;\n  }\n  // shim addTrack and removeTrack.\n  if (window.RTCPeerConnection.prototype.addTrack \u0026\u0026\n      browserDetails.version \u003e= 65) {\n    return shimAddTrackRemoveTrackWithNative(window);\n  }\n\n  // also shim pc.getLocalStreams when addTrack is shimmed\n  // to return the original streams.\n  const origGetLocalStreams = window.RTCPeerConnection.prototype\n    .getLocalStreams;\n  window.RTCPeerConnection.prototype.getLocalStreams =\n    function getLocalStreams() {\n      const nativeStreams = origGetLocalStreams.apply(this);\n      this._reverseStreams = this._reverseStreams || {};\n      return nativeStreams.map(stream =\u003e this._reverseStreams[stream.id]);\n    };\n\n  const origAddStream = window.RTCPeerConnection.prototype.addStream;\n  window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n    this._streams = this._streams || {};\n    this._reverseStreams = this._reverseStreams || {};\n\n    stream.getTracks().forEach(track =\u003e {\n      const alreadyExists = this.getSenders().find(s =\u003e s.track === track);\n      if (alreadyExists) {\n        throw new DOMException('Track already exists.',\n          'InvalidAccessError');\n      }\n    });\n    // Add identity mapping for consistency with addTrack.\n    // Unless this is being used with a stream from addTrack.\n    if (!this._reverseStreams[stream.id]) {\n      const newStream = new window.MediaStream(stream.getTracks());\n      this._streams[stream.id] = newStream;\n      this._reverseStreams[newStream.id] = stream;\n      stream = newStream;\n    }\n    origAddStream.apply(this, [stream]);\n  };\n\n  const origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n  window.RTCPeerConnection.prototype.removeStream =\n    function removeStream(stream) {\n      this._streams = this._streams || {};\n      this._reverseStreams = this._reverseStreams || {};\n\n      origRemoveStream.apply(this, [(this._streams[stream.id] || stream)]);\n      delete this._reverseStreams[(this._streams[stream.id] ?\n        this._streams[stream.id].id : stream.id)];\n      delete this._streams[stream.id];\n    };\n\n  window.RTCPeerConnection.prototype.addTrack =\n    function addTrack(track, stream) {\n      if (this.signalingState === 'closed') {\n        throw new DOMException(\n          'The RTCPeerConnection\\'s signalingState is \\'closed\\'.',\n          'InvalidStateError');\n      }\n      const streams = [].slice.call(arguments, 1);\n      if (streams.length !== 1 ||\n          !streams[0].getTracks().find(t =\u003e t === track)) {\n        // this is not fully correct but all we can manage without\n        // [[associated MediaStreams]] internal slot.\n        throw new DOMException(\n          'The adapter.js addTrack polyfill only supports a single ' +\n          ' stream which is associated with the specified track.',\n          'NotSupportedError');\n      }\n\n      const alreadyExists = this.getSenders().find(s =\u003e s.track === track);\n      if (alreadyExists) {\n        throw new DOMException('Track already exists.',\n          'InvalidAccessError');\n      }\n\n      this._streams = this._streams || {};\n      this._reverseStreams = this._reverseStreams || {};\n      const oldStream = this._streams[stream.id];\n      if (oldStream) {\n        // this is using odd Chrome behaviour, use with caution:\n        // https://bugs.chromium.org/p/webrtc/issues/detail?id=7815\n        // Note: we rely on the high-level addTrack/dtmf shim to\n        // create the sender with a dtmf sender.\n        oldStream.addTrack(track);\n\n        // Trigger ONN async.\n        Promise.resolve().then(() =\u003e {\n          this.dispatchEvent(new Event('negotiationneeded'));\n        });\n      } else {\n        const newStream = new window.MediaStream([track]);\n        this._streams[stream.id] = newStream;\n        this._reverseStreams[newStream.id] = stream;\n        this.addStream(newStream);\n      }\n      return this.getSenders().find(s =\u003e s.track === track);\n    };\n\n  // replace the internal stream id with the external one and\n  // vice versa.\n  function replaceInternalStreamId(pc, description) {\n    let sdp = description.sdp;\n    Object.keys(pc._reverseStreams || []).forEach(internalId =\u003e {\n      const externalStream = pc._reverseStreams[internalId];\n      const internalStream = pc._streams[externalStream.id];\n      sdp = sdp.replace(new RegExp(internalStream.id, 'g'),\n        externalStream.id);\n    });\n    return new RTCSessionDescription({\n      type: description.type,\n      sdp\n    });\n  }\n  function replaceExternalStreamId(pc, description) {\n    let sdp = description.sdp;\n    Object.keys(pc._reverseStreams || []).forEach(internalId =\u003e {\n      const externalStream = pc._reverseStreams[internalId];\n      const internalStream = pc._streams[externalStream.id];\n      sdp = sdp.replace(new RegExp(externalStream.id, 'g'),\n        internalStream.id);\n    });\n    return new RTCSessionDescription({\n      type: description.type,\n      sdp\n    });\n  }\n  ['createOffer', 'createAnswer'].forEach(function(method) {\n    const nativeMethod = window.RTCPeerConnection.prototype[method];\n    const methodObj = {[method]() {\n      const args = arguments;\n      const isLegacyCall = arguments.length \u0026\u0026\n          typeof arguments[0] === 'function';\n      if (isLegacyCall) {\n        return nativeMethod.apply(this, [\n          (description) =\u003e {\n            const desc = replaceInternalStreamId(this, description);\n            args[0].apply(null, [desc]);\n          },\n          (err) =\u003e {\n            if (args[1]) {\n              args[1].apply(null, err);\n            }\n          }, arguments[2]\n        ]);\n      }\n      return nativeMethod.apply(this, arguments)\n        .then(description =\u003e replaceInternalStreamId(this, description));\n    }};\n    window.RTCPeerConnection.prototype[method] = methodObj[method];\n  });\n\n  const origSetLocalDescription =\n      window.RTCPeerConnection.prototype.setLocalDescription;\n  window.RTCPeerConnection.prototype.setLocalDescription =\n    function setLocalDescription() {\n      if (!arguments.length || !arguments[0].type) {\n        return origSetLocalDescription.apply(this, arguments);\n      }\n      arguments[0] = replaceExternalStreamId(this, arguments[0]);\n      return origSetLocalDescription.apply(this, arguments);\n    };\n\n  // TODO: mangle getStats: https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamstats-streamidentifier\n\n  const origLocalDescription = Object.getOwnPropertyDescriptor(\n    window.RTCPeerConnection.prototype, 'localDescription');\n  Object.defineProperty(window.RTCPeerConnection.prototype,\n    'localDescription', {\n      get() {\n        const description = origLocalDescription.get.apply(this);\n        if (description.type === '') {\n          return description;\n        }\n        return replaceInternalStreamId(this, description);\n      }\n    });\n\n  window.RTCPeerConnection.prototype.removeTrack =\n    function removeTrack(sender) {\n      if (this.signalingState === 'closed') {\n        throw new DOMException(\n          'The RTCPeerConnection\\'s signalingState is \\'closed\\'.',\n          'InvalidStateError');\n      }\n      // We can not yet check for sender instanceof RTCRtpSender\n      // since we shim RTPSender. So we check if sender._pc is set.\n      if (!sender._pc) {\n        throw new DOMException('Argument 1 of RTCPeerConnection.removeTrack ' +\n            'does not implement interface RTCRtpSender.', 'TypeError');\n      }\n      const isLocal = sender._pc === this;\n      if (!isLocal) {\n        throw new DOMException('Sender was not created by this connection.',\n          'InvalidAccessError');\n      }\n\n      // Search for the native stream the senders track belongs to.\n      this._streams = this._streams || {};\n      let stream;\n      Object.keys(this._streams).forEach(streamid =\u003e {\n        const hasTrack = this._streams[streamid].getTracks()\n          .find(track =\u003e sender.track === track);\n        if (hasTrack) {\n          stream = this._streams[streamid];\n        }\n      });\n\n      if (stream) {\n        if (stream.getTracks().length === 1) {\n          // if this is the last track of the stream, remove the stream. This\n          // takes care of any shimmed _senders.\n          this.removeStream(this._reverseStreams[stream.id]);\n        } else {\n          // relying on the same odd chrome behaviour as above.\n          stream.removeTrack(sender.track);\n        }\n        this.dispatchEvent(new Event('negotiationneeded'));\n      }\n    };\n}\n\nexport function shimPeerConnection(window, browserDetails) {\n  if (!window.RTCPeerConnection \u0026\u0026 window.webkitRTCPeerConnection) {\n    // very basic support for old versions.\n    window.RTCPeerConnection = window.webkitRTCPeerConnection;\n  }\n  if (!window.RTCPeerConnection) {\n    return;\n  }\n\n  // shim implicit creation of RTCSessionDescription/RTCIceCandidate\n  if (browserDetails.version \u003c 53) {\n    ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']\n      .forEach(function(method) {\n        const nativeMethod = window.RTCPeerConnection.prototype[method];\n        const methodObj = {[method]() {\n          arguments[0] = new ((method === 'addIceCandidate') ?\n            window.RTCIceCandidate :\n            window.RTCSessionDescription)(arguments[0]);\n          return nativeMethod.apply(this, arguments);\n        }};\n        window.RTCPeerConnection.prototype[method] = methodObj[method];\n      });\n  }\n}\n\n// Attempt to fix ONN in plan-b mode.\nexport function fixNegotiationNeeded(window, browserDetails) {\n  utils.wrapPeerConnectionEvent(window, 'negotiationneeded', e =\u003e {\n    const pc = e.target;\n    if (browserDetails.version \u003c 72 || (pc.getConfiguration \u0026\u0026\n        pc.getConfiguration().sdpSemantics === 'plan-b')) {\n      if (pc.signalingState !== 'stable') {\n        return;\n      }\n    }\n    return e;\n  });\n}\n","/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n/* eslint-env node */\n'use strict';\n\nimport * as utils from '../utils';\n\nexport function shimGetUserMedia(window, browserDetails) {\n  const navigator = window \u0026\u0026 window.navigator;\n  const MediaStreamTrack = window \u0026\u0026 window.MediaStreamTrack;\n\n  navigator.getUserMedia = function(constraints, onSuccess, onError) {\n    // Replace Firefox 44+'s deprecation warning with unprefixed version.\n    utils.deprecated('navigator.getUserMedia',\n      'navigator.mediaDevices.getUserMedia');\n    navigator.mediaDevices.getUserMedia(constraints).then(onSuccess, onError);\n  };\n\n  if (!(browserDetails.version \u003e 55 \u0026\u0026\n      'autoGainControl' in navigator.mediaDevices.getSupportedConstraints())) {\n    const remap = function(obj, a, b) {\n      if (a in obj \u0026\u0026 !(b in obj)) {\n        obj[b] = obj[a];\n        delete obj[a];\n      }\n    };\n\n    const nativeGetUserMedia = navigator.mediaDevices.getUserMedia.\n      bind(navigator.mediaDevices);\n    navigator.mediaDevices.getUserMedia = function(c) {\n      if (typeof c === 'object' \u0026\u0026 typeof c.audio === 'object') {\n        c = JSON.parse(JSON.stringify(c));\n        remap(c.audio, 'autoGainControl', 'mozAutoGainControl');\n        remap(c.audio, 'noiseSuppression', 'mozNoiseSuppression');\n      }\n      return nativeGetUserMedia(c);\n    };\n\n    if (MediaStreamTrack \u0026\u0026 MediaStreamTrack.prototype.getSettings) {\n      const nativeGetSettings = MediaStreamTrack.prototype.getSettings;\n      MediaStreamTrack.prototype.getSettings = function() {\n        const obj = nativeGetSettings.apply(this, arguments);\n        remap(obj, 'mozAutoGainControl', 'autoGainControl');\n        remap(obj, 'mozNoiseSuppression', 'noiseSuppression');\n        return obj;\n      };\n    }\n\n    if (MediaStreamTrack \u0026\u0026 MediaStreamTrack.prototype.applyConstraints) {\n      const nativeApplyConstraints =\n        MediaStreamTrack.prototype.applyConstraints;\n      MediaStreamTrack.prototype.applyConstraints = function(c) {\n        if (this.kind === 'audio' \u0026\u0026 typeof c === 'object') {\n          c = JSON.parse(JSON.stringify(c));\n          remap(c, 'autoGainControl', 'mozAutoGainControl');\n          remap(c, 'noiseSuppression', 'mozNoiseSuppression');\n        }\n        return nativeApplyConstraints.apply(this, [c]);\n      };\n    }\n  }\n}\n","/*\n *  Copyright (c) 2018 The adapter.js project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n/* eslint-env node */\n'use strict';\n\nexport function shimGetDisplayMedia(window, preferredMediaSource) {\n  if (window.navigator.mediaDevices \u0026\u0026\n    'getDisplayMedia' in window.navigator.mediaDevices) {\n    return;\n  }\n  if (!(window.navigator.mediaDevices)) {\n    return;\n  }\n  window.navigator.mediaDevices.getDisplayMedia =\n    function getDisplayMedia(constraints) {\n      if (!(constraints \u0026\u0026 constraints.video)) {\n        const err = new DOMException('getDisplayMedia without video ' +\n            'constraints is undefined');\n        err.name = 'NotFoundError';\n        // from https://heycam.github.io/webidl/#idl-DOMException-error-names\n        err.code = 8;\n        return Promise.reject(err);\n      }\n      if (constraints.video === true) {\n        constraints.video = {mediaSource: preferredMediaSource};\n      } else {\n        constraints.video.mediaSource = preferredMediaSource;\n      }\n      return window.navigator.mediaDevices.getUserMedia(constraints);\n    };\n}\n","/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n/* eslint-env node */\n'use strict';\n\nimport * as utils from '../utils';\nexport {shimGetUserMedia} from './getusermedia';\nexport {shimGetDisplayMedia} from './getdisplaymedia';\n\nexport function shimOnTrack(window) {\n  if (typeof window === 'object' \u0026\u0026 window.RTCTrackEvent \u0026\u0026\n      ('receiver' in window.RTCTrackEvent.prototype) \u0026\u0026\n      !('transceiver' in window.RTCTrackEvent.prototype)) {\n    Object.defineProperty(window.RTCTrackEvent.prototype, 'transceiver', {\n      get() {\n        return {receiver: this.receiver};\n      }\n    });\n  }\n}\n\nexport function shimPeerConnection(window, browserDetails) {\n  if (typeof window !== 'object' ||\n      !(window.RTCPeerConnection || window.mozRTCPeerConnection)) {\n    return; // probably media.peerconnection.enabled=false in about:config\n  }\n  if (!window.RTCPeerConnection \u0026\u0026 window.mozRTCPeerConnection) {\n    // very basic support for old versions.\n    window.RTCPeerConnection = window.mozRTCPeerConnection;\n  }\n\n  if (browserDetails.version \u003c 53) {\n    // shim away need for obsolete RTCIceCandidate/RTCSessionDescription.\n    ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']\n      .forEach(function(method) {\n        const nativeMethod = window.RTCPeerConnection.prototype[method];\n        const methodObj = {[method]() {\n          arguments[0] = new ((method === 'addIceCandidate') ?\n            window.RTCIceCandidate :\n            window.RTCSessionDescription)(arguments[0]);\n          return nativeMethod.apply(this, arguments);\n        }};\n        window.RTCPeerConnection.prototype[method] = methodObj[method];\n      });\n  }\n\n  const modernStatsTypes = {\n    inboundrtp: 'inbound-rtp',\n    outboundrtp: 'outbound-rtp',\n    candidatepair: 'candidate-pair',\n    localcandidate: 'local-candidate',\n    remotecandidate: 'remote-candidate'\n  };\n\n  const nativeGetStats = window.RTCPeerConnection.prototype.getStats;\n  window.RTCPeerConnection.prototype.getStats = function getStats() {\n    const [selector, onSucc, onErr] = arguments;\n    return nativeGetStats.apply(this, [selector || null])\n      .then(stats =\u003e {\n        if (browserDetails.version \u003c 53 \u0026\u0026 !onSucc) {\n          // Shim only promise getStats with spec-hyphens in type names\n          // Leave callback version alone; misc old uses of forEach before Map\n          try {\n            stats.forEach(stat =\u003e {\n              stat.type = modernStatsTypes[stat.type] || stat.type;\n            });\n          } catch (e) {\n            if (e.name !== 'TypeError') {\n              throw e;\n            }\n            // Avoid TypeError: \"type\" is read-only, in old versions. 34-43ish\n            stats.forEach((stat, i) =\u003e {\n              stats.set(i, Object.assign({}, stat, {\n                type: modernStatsTypes[stat.type] || stat.type\n              }));\n            });\n          }\n        }\n        return stats;\n      })\n      .then(onSucc, onErr);\n  };\n}\n\nexport function shimSenderGetStats(window) {\n  if (!(typeof window === 'object' \u0026\u0026 window.RTCPeerConnection \u0026\u0026\n      window.RTCRtpSender)) {\n    return;\n  }\n  if (window.RTCRtpSender \u0026\u0026 'getStats' in window.RTCRtpSender.prototype) {\n    return;\n  }\n  const origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n  if (origGetSenders) {\n    window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n      const senders = origGetSenders.apply(this, []);\n      senders.forEach(sender =\u003e sender._pc = this);\n      return senders;\n    };\n  }\n\n  const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n  if (origAddTrack) {\n    window.RTCPeerConnection.prototype.addTrack = function addTrack() {\n      const sender = origAddTrack.apply(this, arguments);\n      sender._pc = this;\n      return sender;\n    };\n  }\n  window.RTCRtpSender.prototype.getStats = function getStats() {\n    return this.track ? this._pc.getStats(this.track) :\n      Promise.resolve(new Map());\n  };\n}\n\nexport function shimReceiverGetStats(window) {\n  if (!(typeof window === 'object' \u0026\u0026 window.RTCPeerConnection \u0026\u0026\n      window.RTCRtpSender)) {\n    return;\n  }\n  if (window.RTCRtpSender \u0026\u0026 'getStats' in window.RTCRtpReceiver.prototype) {\n    return;\n  }\n  const origGetReceivers = window.RTCPeerConnection.prototype.getReceivers;\n  if (origGetReceivers) {\n    window.RTCPeerConnection.prototype.getReceivers = function getReceivers() {\n      const receivers = origGetReceivers.apply(this, []);\n      receivers.forEach(receiver =\u003e receiver._pc = this);\n      return receivers;\n    };\n  }\n  utils.wrapPeerConnectionEvent(window, 'track', e =\u003e {\n    e.receiver._pc = e.srcElement;\n    return e;\n  });\n  window.RTCRtpReceiver.prototype.getStats = function getStats() {\n    return this._pc.getStats(this.track);\n  };\n}\n\nexport function shimRemoveStream(window) {\n  if (!window.RTCPeerConnection ||\n      'removeStream' in window.RTCPeerConnection.prototype) {\n    return;\n  }\n  window.RTCPeerConnection.prototype.removeStream =\n    function removeStream(stream) {\n      utils.deprecated('removeStream', 'removeTrack');\n      this.getSenders().forEach(sender =\u003e {\n        if (sender.track \u0026\u0026 stream.getTracks().includes(sender.track)) {\n          this.removeTrack(sender);\n        }\n      });\n    };\n}\n\nexport function shimRTCDataChannel(window) {\n  // rename DataChannel to RTCDataChannel (native fix in FF60):\n  // https://bugzilla.mozilla.org/show_bug.cgi?id=1173851\n  if (window.DataChannel \u0026\u0026 !window.RTCDataChannel) {\n    window.RTCDataChannel = window.DataChannel;\n  }\n}\n\nexport function shimAddTransceiver(window) {\n  // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647\n  // Firefox ignores the init sendEncodings options passed to addTransceiver\n  // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918\n  if (!(typeof window === 'object' \u0026\u0026 window.RTCPeerConnection)) {\n    return;\n  }\n  const origAddTransceiver = window.RTCPeerConnection.prototype.addTransceiver;\n  if (origAddTransceiver) {\n    window.RTCPeerConnection.prototype.addTransceiver =\n      function addTransceiver() {\n        this.setParametersPromises = [];\n        // WebIDL input coercion and validation\n        let sendEncodings = arguments[1] \u0026\u0026 arguments[1].sendEncodings;\n        if (sendEncodings === undefined) {\n          sendEncodings = [];\n        }\n        sendEncodings = [...sendEncodings];\n        const shouldPerformCheck = sendEncodings.length \u003e 0;\n        if (shouldPerformCheck) {\n          // If sendEncodings params are provided, validate grammar\n          sendEncodings.forEach((encodingParam) =\u003e {\n            if ('rid' in encodingParam) {\n              const ridRegex = /^[a-z0-9]{0,16}$/i;\n              if (!ridRegex.test(encodingParam.rid)) {\n                throw new TypeError('Invalid RID value provided.');\n              }\n            }\n            if ('scaleResolutionDownBy' in encodingParam) {\n              if (!(parseFloat(encodingParam.scaleResolutionDownBy) \u003e= 1.0)) {\n                throw new RangeError('scale_resolution_down_by must be \u003e= 1.0');\n              }\n            }\n            if ('maxFramerate' in encodingParam) {\n              if (!(parseFloat(encodingParam.maxFramerate) \u003e= 0)) {\n                throw new RangeError('max_framerate must be \u003e= 0.0');\n              }\n            }\n          });\n        }\n        const transceiver = origAddTransceiver.apply(this, arguments);\n        if (shouldPerformCheck) {\n          // Check if the init options were applied. If not we do this in an\n          // asynchronous way and save the promise reference in a global object.\n          // This is an ugly hack, but at the same time is way more robust than\n          // checking the sender parameters before and after the createOffer\n          // Also note that after the createoffer we are not 100% sure that\n          // the params were asynchronously applied so we might miss the\n          // opportunity to recreate offer.\n          const {sender} = transceiver;\n          const params = sender.getParameters();\n          if (!('encodings' in params) ||\n              // Avoid being fooled by patched getParameters() below.\n              (params.encodings.length === 1 \u0026\u0026\n               Object.keys(params.encodings[0]).length === 0)) {\n            params.encodings = sendEncodings;\n            sender.sendEncodings = sendEncodings;\n            this.setParametersPromises.push(sender.setParameters(params)\n              .then(() =\u003e {\n                delete sender.sendEncodings;\n              }).catch(() =\u003e {\n                delete sender.sendEncodings;\n              })\n            );\n          }\n        }\n        return transceiver;\n      };\n  }\n}\n\nexport function shimGetParameters(window) {\n  if (!(typeof window === 'object' \u0026\u0026 window.RTCRtpSender)) {\n    return;\n  }\n  const origGetParameters = window.RTCRtpSender.prototype.getParameters;\n  if (origGetParameters) {\n    window.RTCRtpSender.prototype.getParameters =\n      function getParameters() {\n        const params = origGetParameters.apply(this, arguments);\n        if (!('encodings' in params)) {\n          params.encodings = [].concat(this.sendEncodings || [{}]);\n        }\n        return params;\n      };\n  }\n}\n\nexport function shimCreateOffer(window) {\n  // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647\n  // Firefox ignores the init sendEncodings options passed to addTransceiver\n  // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918\n  if (!(typeof window === 'object' \u0026\u0026 window.RTCPeerConnection)) {\n    return;\n  }\n  const origCreateOffer = window.RTCPeerConnection.prototype.createOffer;\n  window.RTCPeerConnection.prototype.createOffer = function createOffer() {\n    if (this.setParametersPromises \u0026\u0026 this.setParametersPromises.length) {\n      return Promise.all(this.setParametersPromises)\n        .then(() =\u003e {\n          return origCreateOffer.apply(this, arguments);\n        })\n        .finally(() =\u003e {\n          this.setParametersPromises = [];\n        });\n    }\n    return origCreateOffer.apply(this, arguments);\n  };\n}\n\nexport function shimCreateAnswer(window) {\n  // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647\n  // Firefox ignores the init sendEncodings options passed to addTransceiver\n  // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918\n  if (!(typeof window === 'object' \u0026\u0026 window.RTCPeerConnection)) {\n    return;\n  }\n  const origCreateAnswer = window.RTCPeerConnection.prototype.createAnswer;\n  window.RTCPeerConnection.prototype.createAnswer = function createAnswer() {\n    if (this.setParametersPromises \u0026\u0026 this.setParametersPromises.length) {\n      return Promise.all(this.setParametersPromises)\n        .then(() =\u003e {\n          return origCreateAnswer.apply(this, arguments);\n        })\n        .finally(() =\u003e {\n          this.setParametersPromises = [];\n        });\n    }\n    return origCreateAnswer.apply(this, arguments);\n  };\n}\n","/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n'use strict';\nimport * as utils from '../utils';\n\nexport function shimLocalStreamsAPI(window) {\n  if (typeof window !== 'object' || !window.RTCPeerConnection) {\n    return;\n  }\n  if (!('getLocalStreams' in window.RTCPeerConnection.prototype)) {\n    window.RTCPeerConnection.prototype.getLocalStreams =\n      function getLocalStreams() {\n        if (!this._localStreams) {\n          this._localStreams = [];\n        }\n        return this._localStreams;\n      };\n  }\n  if (!('addStream' in window.RTCPeerConnection.prototype)) {\n    const _addTrack = window.RTCPeerConnection.prototype.addTrack;\n    window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n      if (!this._localStreams) {\n        this._localStreams = [];\n      }\n      if (!this._localStreams.includes(stream)) {\n        this._localStreams.push(stream);\n      }\n      // Try to emulate Chrome's behaviour of adding in audio-video order.\n      // Safari orders by track id.\n      stream.getAudioTracks().forEach(track =\u003e _addTrack.call(this, track,\n        stream));\n      stream.getVideoTracks().forEach(track =\u003e _addTrack.call(this, track,\n        stream));\n    };\n\n    window.RTCPeerConnection.prototype.addTrack =\n      function addTrack(track, ...streams) {\n        if (streams) {\n          streams.forEach((stream) =\u003e {\n            if (!this._localStreams) {\n              this._localStreams = [stream];\n            } else if (!this._localStreams.includes(stream)) {\n              this._localStreams.push(stream);\n            }\n          });\n        }\n        return _addTrack.apply(this, arguments);\n      };\n  }\n  if (!('removeStream' in window.RTCPeerConnection.prototype)) {\n    window.RTCPeerConnection.prototype.removeStream =\n      function removeStream(stream) {\n        if (!this._localStreams) {\n          this._localStreams = [];\n        }\n        const index = this._localStreams.indexOf(stream);\n        if (index === -1) {\n          return;\n        }\n        this._localStreams.splice(index, 1);\n        const tracks = stream.getTracks();\n        this.getSenders().forEach(sender =\u003e {\n          if (tracks.includes(sender.track)) {\n            this.removeTrack(sender);\n          }\n        });\n      };\n  }\n}\n\nexport function shimRemoteStreamsAPI(window) {\n  if (typeof window !== 'object' || !window.RTCPeerConnection) {\n    return;\n  }\n  if (!('getRemoteStreams' in window.RTCPeerConnection.prototype)) {\n    window.RTCPeerConnection.prototype.getRemoteStreams =\n      function getRemoteStreams() {\n        return this._remoteStreams ? this._remoteStreams : [];\n      };\n  }\n  if (!('onaddstream' in window.RTCPeerConnection.prototype)) {\n    Object.defineProperty(window.RTCPeerConnection.prototype, 'onaddstream', {\n      get() {\n        return this._onaddstream;\n      },\n      set(f) {\n        if (this._onaddstream) {\n          this.removeEventListener('addstream', this._onaddstream);\n          this.removeEventListener('track', this._onaddstreampoly);\n        }\n        this.addEventListener('addstream', this._onaddstream = f);\n        this.addEventListener('track', this._onaddstreampoly = (e) =\u003e {\n          e.streams.forEach(stream =\u003e {\n            if (!this._remoteStreams) {\n              this._remoteStreams = [];\n            }\n            if (this._remoteStreams.includes(stream)) {\n              return;\n            }\n            this._remoteStreams.push(stream);\n            const event = new Event('addstream');\n            event.stream = stream;\n            this.dispatchEvent(event);\n          });\n        });\n      }\n    });\n    const origSetRemoteDescription =\n      window.RTCPeerConnection.prototype.setRemoteDescription;\n    window.RTCPeerConnection.prototype.setRemoteDescription =\n      function setRemoteDescription() {\n        const pc = this;\n        if (!this._onaddstreampoly) {\n          this.addEventListener('track', this._onaddstreampoly = function(e) {\n            e.streams.forEach(stream =\u003e {\n              if (!pc._remoteStreams) {\n                pc._remoteStreams = [];\n              }\n              if (pc._remoteStreams.indexOf(stream) \u003e= 0) {\n                return;\n              }\n              pc._remoteStreams.push(stream);\n              const event = new Event('addstream');\n              event.stream = stream;\n              pc.dispatchEvent(event);\n            });\n          });\n        }\n        return origSetRemoteDescription.apply(pc, arguments);\n      };\n  }\n}\n\nexport function shimCallbacksAPI(window) {\n  if (typeof window !== 'object' || !window.RTCPeerConnection) {\n    return;\n  }\n  const prototype = window.RTCPeerConnection.prototype;\n  const origCreateOffer = prototype.createOffer;\n  const origCreateAnswer = prototype.createAnswer;\n  const setLocalDescription = prototype.setLocalDescription;\n  const setRemoteDescription = prototype.setRemoteDescription;\n  const addIceCandidate = prototype.addIceCandidate;\n\n  prototype.createOffer =\n    function createOffer(successCallback, failureCallback) {\n      const options = (arguments.length \u003e= 2) ? arguments[2] : arguments[0];\n      const promise = origCreateOffer.apply(this, [options]);\n      if (!failureCallback) {\n        return promise;\n      }\n      promise.then(successCallback, failureCallback);\n      return Promise.resolve();\n    };\n\n  prototype.createAnswer =\n    function createAnswer(successCallback, failureCallback) {\n      const options = (arguments.length \u003e= 2) ? arguments[2] : arguments[0];\n      const promise = origCreateAnswer.apply(this, [options]);\n      if (!failureCallback) {\n        return promise;\n      }\n      promise.then(successCallback, failureCallback);\n      return Promise.resolve();\n    };\n\n  let withCallback = function(description, successCallback, failureCallback) {\n    const promise = setLocalDescription.apply(this, [description]);\n    if (!failureCallback) {\n      return promise;\n    }\n    promise.then(successCallback, failureCallback);\n    return Promise.resolve();\n  };\n  prototype.setLocalDescription = withCallback;\n\n  withCallback = function(description, successCallback, failureCallback) {\n    const promise = setRemoteDescription.apply(this, [description]);\n    if (!failureCallback) {\n      return promise;\n    }\n    promise.then(successCallback, failureCallback);\n    return Promise.resolve();\n  };\n  prototype.setRemoteDescription = withCallback;\n\n  withCallback = function(candidate, successCallback, failureCallback) {\n    const promise = addIceCandidate.apply(this, [candidate]);\n    if (!failureCallback) {\n      return promise;\n    }\n    promise.then(successCallback, failureCallback);\n    return Promise.resolve();\n  };\n  prototype.addIceCandidate = withCallback;\n}\n\nexport function shimGetUserMedia(window) {\n  const navigator = window \u0026\u0026 window.navigator;\n\n  if (navigator.mediaDevices \u0026\u0026 navigator.mediaDevices.getUserMedia) {\n    // shim not needed in Safari 12.1\n    const mediaDevices = navigator.mediaDevices;\n    const _getUserMedia = mediaDevices.getUserMedia.bind(mediaDevices);\n    navigator.mediaDevices.getUserMedia = (constraints) =\u003e {\n      return _getUserMedia(shimConstraints(constraints));\n    };\n  }\n\n  if (!navigator.getUserMedia \u0026\u0026 navigator.mediaDevices \u0026\u0026\n    navigator.mediaDevices.getUserMedia) {\n    navigator.getUserMedia = function getUserMedia(constraints, cb, errcb) {\n      navigator.mediaDevices.getUserMedia(constraints)\n        .then(cb, errcb);\n    }.bind(navigator);\n  }\n}\n\nexport function shimConstraints(constraints) {\n  if (constraints \u0026\u0026 constraints.video !== undefined) {\n    return Object.assign({},\n      constraints,\n      {video: utils.compactObject(constraints.video)}\n    );\n  }\n\n  return constraints;\n}\n\nexport function shimRTCIceServerUrls(window) {\n  if (!window.RTCPeerConnection) {\n    return;\n  }\n  // migrate from non-spec RTCIceServer.url to RTCIceServer.urls\n  const OrigPeerConnection = window.RTCPeerConnection;\n  window.RTCPeerConnection =\n    function RTCPeerConnection(pcConfig, pcConstraints) {\n      if (pcConfig \u0026\u0026 pcConfig.iceServers) {\n        const newIceServers = [];\n        for (let i = 0; i \u003c pcConfig.iceServers.length; i++) {\n          let server = pcConfig.iceServers[i];\n          if (server.urls === undefined \u0026\u0026 server.url) {\n            utils.deprecated('RTCIceServer.url', 'RTCIceServer.urls');\n            server = JSON.parse(JSON.stringify(server));\n            server.urls = server.url;\n            delete server.url;\n            newIceServers.push(server);\n          } else {\n            newIceServers.push(pcConfig.iceServers[i]);\n          }\n        }\n        pcConfig.iceServers = newIceServers;\n      }\n      return new OrigPeerConnection(pcConfig, pcConstraints);\n    };\n  window.RTCPeerConnection.prototype = OrigPeerConnection.prototype;\n  // wrap static methods. Currently just generateCertificate.\n  if ('generateCertificate' in OrigPeerConnection) {\n    Object.defineProperty(window.RTCPeerConnection, 'generateCertificate', {\n      get() {\n        return OrigPeerConnection.generateCertificate;\n      }\n    });\n  }\n}\n\nexport function shimTrackEventTransceiver(window) {\n  // Add event.transceiver member over deprecated event.receiver\n  if (typeof window === 'object' \u0026\u0026 window.RTCTrackEvent \u0026\u0026\n      'receiver' in window.RTCTrackEvent.prototype \u0026\u0026\n      !('transceiver' in window.RTCTrackEvent.prototype)) {\n    Object.defineProperty(window.RTCTrackEvent.prototype, 'transceiver', {\n      get() {\n        return {receiver: this.receiver};\n      }\n    });\n  }\n}\n\nexport function shimCreateOfferLegacy(window) {\n  const origCreateOffer = window.RTCPeerConnection.prototype.createOffer;\n  window.RTCPeerConnection.prototype.createOffer =\n    function createOffer(offerOptions) {\n      if (offerOptions) {\n        if (typeof offerOptions.offerToReceiveAudio !== 'undefined') {\n          // support bit values\n          offerOptions.offerToReceiveAudio =\n            !!offerOptions.offerToReceiveAudio;\n        }\n        const audioTransceiver = this.getTransceivers().find(transceiver =\u003e\n          transceiver.receiver.track.kind === 'audio');\n        if (offerOptions.offerToReceiveAudio === false \u0026\u0026 audioTransceiver) {\n          if (audioTransceiver.direction === 'sendrecv') {\n            if (audioTransceiver.setDirection) {\n              audioTransceiver.setDirection('sendonly');\n            } else {\n              audioTransceiver.direction = 'sendonly';\n            }\n          } else if (audioTransceiver.direction === 'recvonly') {\n            if (audioTransceiver.setDirection) {\n              audioTransceiver.setDirection('inactive');\n            } else {\n              audioTransceiver.direction = 'inactive';\n            }\n          }\n        } else if (offerOptions.offerToReceiveAudio === true \u0026\u0026\n            !audioTransceiver) {\n          this.addTransceiver('audio', {direction: 'recvonly'});\n        }\n\n        if (typeof offerOptions.offerToReceiveVideo !== 'undefined') {\n          // support bit values\n          offerOptions.offerToReceiveVideo =\n            !!offerOptions.offerToReceiveVideo;\n        }\n        const videoTransceiver = this.getTransceivers().find(transceiver =\u003e\n          transceiver.receiver.track.kind === 'video');\n        if (offerOptions.offerToReceiveVideo === false \u0026\u0026 videoTransceiver) {\n          if (videoTransceiver.direction === 'sendrecv') {\n            if (videoTransceiver.setDirection) {\n              videoTransceiver.setDirection('sendonly');\n            } else {\n              videoTransceiver.direction = 'sendonly';\n            }\n          } else if (videoTransceiver.direction === 'recvonly') {\n            if (videoTransceiver.setDirection) {\n              videoTransceiver.setDirection('inactive');\n            } else {\n              videoTransceiver.direction = 'inactive';\n            }\n          }\n        } else if (offerOptions.offerToReceiveVideo === true \u0026\u0026\n            !videoTransceiver) {\n          this.addTransceiver('video', {direction: 'recvonly'});\n        }\n      }\n      return origCreateOffer.apply(this, arguments);\n    };\n}\n\nexport function shimAudioContext(window) {\n  if (typeof window !== 'object' || window.AudioContext) {\n    return;\n  }\n  window.AudioContext = window.webkitAudioContext;\n}\n\n","/* eslint-env node */\n'use strict';\n\n// SDP helpers.\nconst SDPUtils = {};\n\n// Generate an alphanumeric identifier for cname or mids.\n// TODO: use UUIDs instead? https://gist.github.com/jed/982883\nSDPUtils.generateIdentifier = function() {\n  return Math.random().toString(36).substring(2, 12);\n};\n\n// The RTCP CNAME used by all peerconnections from the same JS.\nSDPUtils.localCName = SDPUtils.generateIdentifier();\n\n// Splits SDP into lines, dealing with both CRLF and LF.\nSDPUtils.splitLines = function(blob) {\n  return blob.trim().split('\\n').map(line =\u003e line.trim());\n};\n// Splits SDP into sessionpart and mediasections. Ensures CRLF.\nSDPUtils.splitSections = function(blob) {\n  const parts = blob.split('\\nm=');\n  return parts.map((part, index) =\u003e (index \u003e 0 ?\n    'm=' + part : part).trim() + '\\r\\n');\n};\n\n// Returns the session description.\nSDPUtils.getDescription = function(blob) {\n  const sections = SDPUtils.splitSections(blob);\n  return sections \u0026\u0026 sections[0];\n};\n\n// Returns the individual media sections.\nSDPUtils.getMediaSections = function(blob) {\n  const sections = SDPUtils.splitSections(blob);\n  sections.shift();\n  return sections;\n};\n\n// Returns lines that start with a certain prefix.\nSDPUtils.matchPrefix = function(blob, prefix) {\n  return SDPUtils.splitLines(blob).filter(line =\u003e line.indexOf(prefix) === 0);\n};\n\n// Parses an ICE candidate line. Sample input:\n// candidate:702786350 2 udp 41819902 8.8.8.8 60769 typ relay raddr 8.8.8.8\n// rport 55996\"\n// Input can be prefixed with a=.\nSDPUtils.parseCandidate = function(line) {\n  let parts;\n  // Parse both variants.\n  if (line.indexOf('a=candidate:') === 0) {\n    parts = line.substring(12).split(' ');\n  } else {\n    parts = line.substring(10).split(' ');\n  }\n\n  const candidate = {\n    foundation: parts[0],\n    component: {1: 'rtp', 2: 'rtcp'}[parts[1]] || parts[1],\n    protocol: parts[2].toLowerCase(),\n    priority: parseInt(parts[3], 10),\n    ip: parts[4],\n    address: parts[4], // address is an alias for ip.\n    port: parseInt(parts[5], 10),\n    // skip parts[6] == 'typ'\n    type: parts[7],\n  };\n\n  for (let i = 8; i \u003c parts.length; i += 2) {\n    switch (parts[i]) {\n      case 'raddr':\n        candidate.relatedAddress = parts[i + 1];\n        break;\n      case 'rport':\n        candidate.relatedPort = parseInt(parts[i + 1], 10);\n        break;\n      case 'tcptype':\n        candidate.tcpType = parts[i + 1];\n        break;\n      case 'ufrag':\n        candidate.ufrag = parts[i + 1]; // for backward compatibility.\n        candidate.usernameFragment = parts[i + 1];\n        break;\n      default: // extension handling, in particular ufrag. Don't overwrite.\n        if (candidate[parts[i]] === undefined) {\n          candidate[parts[i]] = parts[i + 1];\n        }\n        break;\n    }\n  }\n  return candidate;\n};\n\n// Translates a candidate object into SDP candidate attribute.\n// This does not include the a= prefix!\nSDPUtils.writeCandidate = function(candidate) {\n  const sdp = [];\n  sdp.push(candidate.foundation);\n\n  const component = candidate.component;\n  if (component === 'rtp') {\n    sdp.push(1);\n  } else if (component === 'rtcp') {\n    sdp.push(2);\n  } else {\n    sdp.push(component);\n  }\n  sdp.push(candidate.protocol.toUpperCase());\n  sdp.push(candidate.priority);\n  sdp.push(candidate.address || candidate.ip);\n  sdp.push(candidate.port);\n\n  const type = candidate.type;\n  sdp.push('typ');\n  sdp.push(type);\n  if (type !== 'host' \u0026\u0026 candidate.relatedAddress \u0026\u0026\n      candidate.relatedPort) {\n    sdp.push('raddr');\n    sdp.push(candidate.relatedAddress);\n    sdp.push('rport');\n    sdp.push(candidate.relatedPort);\n  }\n  if (candidate.tcpType \u0026\u0026 candidate.protocol.toLowerCase() === 'tcp') {\n    sdp.push('tcptype');\n    sdp.push(candidate.tcpType);\n  }\n  if (candidate.usernameFragment || candidate.ufrag) {\n    sdp.push('ufrag');\n    sdp.push(candidate.usernameFragment || candidate.ufrag);\n  }\n  return 'candidate:' + sdp.join(' ');\n};\n\n// Parses an ice-options line, returns an array of option tags.\n// Sample input:\n// a=ice-options:foo bar\nSDPUtils.parseIceOptions = function(line) {\n  return line.substring(14).split(' ');\n};\n\n// Parses a rtpmap line, returns RTCRtpCoddecParameters. Sample input:\n// a=rtpmap:111 opus/48000/2\nSDPUtils.parseRtpMap = function(line) {\n  let parts = line.substring(9).split(' ');\n  const parsed = {\n    payloadType: parseInt(parts.shift(), 10), // was: id\n  };\n\n  parts = parts[0].split('/');\n\n  parsed.name = parts[0];\n  parsed.clockRate = parseInt(parts[1], 10); // was: clockrate\n  parsed.channels = parts.length === 3 ? parseInt(parts[2], 10) : 1;\n  // legacy alias, got renamed back to channels in ORTC.\n  parsed.numChannels = parsed.channels;\n  return parsed;\n};\n\n// Generates a rtpmap line from RTCRtpCodecCapability or\n// RTCRtpCodecParameters.\nSDPUtils.writeRtpMap = function(codec) {\n  let pt = codec.payloadType;\n  if (codec.preferredPayloadType !== undefined) {\n    pt = codec.preferredPayloadType;\n  }\n  const channels = codec.channels || codec.numChannels || 1;\n  return 'a=rtpmap:' + pt + ' ' + codec.name + '/' + codec.clockRate +\n      (channels !== 1 ? '/' + channels : '') + '\\r\\n';\n};\n\n// Parses a extmap line (headerextension from RFC 5285). Sample input:\n// a=extmap:2 urn:ietf:params:rtp-hdrext:toffset\n// a=extmap:2/sendonly urn:ietf:params:rtp-hdrext:toffset\nSDPUtils.parseExtmap = function(line) {\n  const parts = line.substring(9).split(' ');\n  return {\n    id: parseInt(parts[0], 10),\n    direction: parts[0].indexOf('/') \u003e 0 ? parts[0].split('/')[1] : 'sendrecv',\n    uri: parts[1],\n    attributes: parts.slice(2).join(' '),\n  };\n};\n\n// Generates an extmap line from RTCRtpHeaderExtensionParameters or\n// RTCRtpHeaderExtension.\nSDPUtils.writeExtmap = function(headerExtension) {\n  return 'a=extmap:' + (headerExtension.id || headerExtension.preferredId) +\n      (headerExtension.direction \u0026\u0026 headerExtension.direction !== 'sendrecv'\n        ? '/' + headerExtension.direction\n        : '') +\n      ' ' + headerExtension.uri +\n      (headerExtension.attributes ? ' ' + headerExtension.attributes : '') +\n      '\\r\\n';\n};\n\n// Parses a fmtp line, returns dictionary. Sample input:\n// a=fmtp:96 vbr=on;cng=on\n// Also deals with vbr=on; cng=on\nSDPUtils.parseFmtp = function(line) {\n  const parsed = {};\n  let kv;\n  const parts = line.substring(line.indexOf(' ') + 1).split(';');\n  for (let j = 0; j \u003c parts.length; j++) {\n    kv = parts[j].trim().split('=');\n    parsed[kv[0].trim()] = kv[1];\n  }\n  return parsed;\n};\n\n// Generates a fmtp line from RTCRtpCodecCapability or RTCRtpCodecParameters.\nSDPUtils.writeFmtp = function(codec) {\n  let line = '';\n  let pt = codec.payloadType;\n  if (codec.preferredPayloadType !== undefined) {\n    pt = codec.preferredPayloadType;\n  }\n  if (codec.parameters \u0026\u0026 Object.keys(codec.parameters).length) {\n    const params = [];\n    Object.keys(codec.parameters).forEach(param =\u003e {\n      if (codec.parameters[param] !== undefined) {\n        params.push(param + '=' + codec.parameters[param]);\n      } else {\n        params.push(param);\n      }\n    });\n    line += 'a=fmtp:' + pt + ' ' + params.join(';') + '\\r\\n';\n  }\n  return line;\n};\n\n// Parses a rtcp-fb line, returns RTCPRtcpFeedback object. Sample input:\n// a=rtcp-fb:98 nack rpsi\nSDPUtils.parseRtcpFb = function(line) {\n  const parts = line.substring(line.indexOf(' ') + 1).split(' ');\n  return {\n    type: parts.shift(),\n    parameter: parts.join(' '),\n  };\n};\n\n// Generate a=rtcp-fb lines from RTCRtpCodecCapability or RTCRtpCodecParameters.\nSDPUtils.writeRtcpFb = function(codec) {\n  let lines = '';\n  let pt = codec.payloadType;\n  if (codec.preferredPayloadType !== undefined) {\n    pt = codec.preferredPayloadType;\n  }\n  if (codec.rtcpFeedback \u0026\u0026 codec.rtcpFeedback.length) {\n    // FIXME: special handling for trr-int?\n    codec.rtcpFeedback.forEach(fb =\u003e {\n      lines += 'a=rtcp-fb:' + pt + ' ' + fb.type +\n      (fb.parameter \u0026\u0026 fb.parameter.length ? ' ' + fb.parameter : '') +\n          '\\r\\n';\n    });\n  }\n  return lines;\n};\n\n// Parses a RFC 5576 ssrc media attribute. Sample input:\n// a=ssrc:3735928559 cname:something\nSDPUtils.parseSsrcMedia = function(line) {\n  const sp = line.indexOf(' ');\n  const parts = {\n    ssrc: parseInt(line.substring(7, sp), 10),\n  };\n  const colon = line.indexOf(':', sp);\n  if (colon \u003e -1) {\n    parts.attribute = line.substring(sp + 1, colon);\n    parts.value = line.substring(colon + 1);\n  } else {\n    parts.attribute = line.substring(sp + 1);\n  }\n  return parts;\n};\n\n// Parse a ssrc-group line (see RFC 5576). Sample input:\n// a=ssrc-group:semantics 12 34\nSDPUtils.parseSsrcGroup = function(line) {\n  const parts = line.substring(13).split(' ');\n  return {\n    semantics: parts.shift(),\n    ssrcs: parts.map(ssrc =\u003e parseInt(ssrc, 10)),\n  };\n};\n\n// Extracts the MID (RFC 5888) from a media section.\n// Returns the MID or undefined if no mid line was found.\nSDPUtils.getMid = function(mediaSection) {\n  const mid = SDPUtils.matchPrefix(mediaSection, 'a=mid:')[0];\n  if (mid) {\n    return mid.substring(6);\n  }\n};\n\n// Parses a fingerprint line for DTLS-SRTP.\nSDPUtils.parseFingerprint = function(line) {\n  const parts = line.substring(14).split(' ');\n  return {\n    algorithm: parts[0].toLowerCase(), // algorithm is case-sensitive in Edge.\n    value: parts[1].toUpperCase(), // the definition is upper-case in RFC 4572.\n  };\n};\n\n// Extracts DTLS parameters from SDP media section or sessionpart.\n// FIXME: for consistency with other functions this should only\n//   get the fingerprint line as input. See also getIceParameters.\nSDPUtils.getDtlsParameters = function(mediaSection, sessionpart) {\n  const lines = SDPUtils.matchPrefix(mediaSection + sessionpart,\n    'a=fingerprint:');\n  // Note: a=setup line is ignored since we use the 'auto' role in Edge.\n  return {\n    role: 'auto',\n    fingerprints: lines.map(SDPUtils.parseFingerprint),\n  };\n};\n\n// Serializes DTLS parameters to SDP.\nSDPUtils.writeDtlsParameters = function(params, setupType) {\n  let sdp = 'a=setup:' + setupType + '\\r\\n';\n  params.fingerprints.forEach(fp =\u003e {\n    sdp += 'a=fingerprint:' + fp.algorithm + ' ' + fp.value + '\\r\\n';\n  });\n  return sdp;\n};\n\n// Parses a=crypto lines into\n//   https://rawgit.com/aboba/edgertc/master/msortc-rs4.html#dictionary-rtcsrtpsdesparameters-members\nSDPUtils.parseCryptoLine = function(line) {\n  const parts = line.substring(9).split(' ');\n  return {\n    tag: parseInt(parts[0], 10),\n    cryptoSuite: parts[1],\n    keyParams: parts[2],\n    sessionParams: parts.slice(3),\n  };\n};\n\nSDPUtils.writeCryptoLine = function(parameters) {\n  return 'a=crypto:' + parameters.tag + ' ' +\n    parameters.cryptoSuite + ' ' +\n    (typeof parameters.keyParams === 'object'\n      ? SDPUtils.writeCryptoKeyParams(parameters.keyParams)\n      : parameters.keyParams) +\n    (parameters.sessionParams ? ' ' + parameters.sessionParams.join(' ') : '') +\n    '\\r\\n';\n};\n\n// Parses the crypto key parameters into\n//   https://rawgit.com/aboba/edgertc/master/msortc-rs4.html#rtcsrtpkeyparam*\nSDPUtils.parseCryptoKeyParams = function(keyParams) {\n  if (keyParams.indexOf('inline:') !== 0) {\n    return null;\n  }\n  const parts = keyParams.substring(7).split('|');\n  return {\n    keyMethod: 'inline',\n    keySalt: parts[0],\n    lifeTime: parts[1],\n    mkiValue: parts[2] ? parts[2].split(':')[0] : undefined,\n    mkiLength: parts[2] ? parts[2].split(':')[1] : undefined,\n  };\n};\n\nSDPUtils.writeCryptoKeyParams = function(keyParams) {\n  return keyParams.keyMethod + ':'\n    + keyParams.keySalt +\n    (keyParams.lifeTime ? '|' + keyParams.lifeTime : '') +\n    (keyParams.mkiValue \u0026\u0026 keyParams.mkiLength\n      ? '|' + keyParams.mkiValue + ':' + keyParams.mkiLength\n      : '');\n};\n\n// Extracts all SDES parameters.\nSDPUtils.getCryptoParameters = function(mediaSection, sessionpart) {\n  const lines = SDPUtils.matchPrefix(mediaSection + sessionpart,\n    'a=crypto:');\n  return lines.map(SDPUtils.parseCryptoLine);\n};\n\n// Parses ICE information from SDP media section or sessionpart.\n// FIXME: for consistency with other functions this should only\n//   get the ice-ufrag and ice-pwd lines as input.\nSDPUtils.getIceParameters = function(mediaSection, sessionpart) {\n  const ufrag = SDPUtils.matchPrefix(mediaSection + sessionpart,\n    'a=ice-ufrag:')[0];\n  const pwd = SDPUtils.matchPrefix(mediaSection + sessionpart,\n    'a=ice-pwd:')[0];\n  if (!(ufrag \u0026\u0026 pwd)) {\n    return null;\n  }\n  return {\n    usernameFragment: ufrag.substring(12),\n    password: pwd.substring(10),\n  };\n};\n\n// Serializes ICE parameters to SDP.\nSDPUtils.writeIceParameters = function(params) {\n  let sdp = 'a=ice-ufrag:' + params.usernameFragment + '\\r\\n' +\n      'a=ice-pwd:' + params.password + '\\r\\n';\n  if (params.iceLite) {\n    sdp += 'a=ice-lite\\r\\n';\n  }\n  return sdp;\n};\n\n// Parses the SDP media section and returns RTCRtpParameters.\nSDPUtils.parseRtpParameters = function(mediaSection) {\n  const description = {\n    codecs: [],\n    headerExtensions: [],\n    fecMechanisms: [],\n    rtcp: [],\n  };\n  const lines = SDPUtils.splitLines(mediaSection);\n  const mline = lines[0].split(' ');\n  description.profile = mline[2];\n  for (let i = 3; i \u003c mline.length; i++) { // find all codecs from mline[3..]\n    const pt = mline[i];\n    const rtpmapline = SDPUtils.matchPrefix(\n      mediaSection, 'a=rtpmap:' + pt + ' ')[0];\n    if (rtpmapline) {\n      const codec = SDPUtils.parseRtpMap(rtpmapline);\n      const fmtps = SDPUtils.matchPrefix(\n        mediaSection, 'a=fmtp:' + pt + ' ');\n      // Only the first a=fmtp:\u003cpt\u003e is considered.\n      codec.parameters = fmtps.length ? SDPUtils.parseFmtp(fmtps[0]) : {};\n      codec.rtcpFeedback = SDPUtils.matchPrefix(\n        mediaSection, 'a=rtcp-fb:' + pt + ' ')\n        .map(SDPUtils.parseRtcpFb);\n      description.codecs.push(codec);\n      // parse FEC mechanisms from rtpmap lines.\n      switch (codec.name.toUpperCase()) {\n        case 'RED':\n        case 'ULPFEC':\n          description.fecMechanisms.push(codec.name.toUpperCase());\n          break;\n        default: // only RED and ULPFEC are recognized as FEC mechanisms.\n          break;\n      }\n    }\n  }\n  SDPUtils.matchPrefix(mediaSection, 'a=extmap:').forEach(line =\u003e {\n    description.headerExtensions.push(SDPUtils.parseExtmap(line));\n  });\n  const wildcardRtcpFb = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-fb:* ')\n    .map(SDPUtils.parseRtcpFb);\n  description.codecs.forEach(codec =\u003e {\n    wildcardRtcpFb.forEach(fb=\u003e {\n      const duplicate = codec.rtcpFeedback.find(existingFeedback =\u003e {\n        return existingFeedback.type === fb.type \u0026\u0026\n          existingFeedback.parameter === fb.parameter;\n      });\n      if (!duplicate) {\n        codec.rtcpFeedback.push(fb);\n      }\n    });\n  });\n  // FIXME: parse rtcp.\n  return description;\n};\n\n// Generates parts of the SDP media section describing the capabilities /\n// parameters.\nSDPUtils.writeRtpDescription = function(kind, caps) {\n  let sdp = '';\n\n  // Build the mline.\n  sdp += 'm=' + kind + ' ';\n  sdp += caps.codecs.length \u003e 0 ? '9' : '0'; // reject if no codecs.\n  sdp += ' ' + (caps.profile || 'UDP/TLS/RTP/SAVPF') + ' ';\n  sdp += caps.codecs.map(codec =\u003e {\n    if (codec.preferredPayloadType !== undefined) {\n      return codec.preferredPayloadType;\n    }\n    return codec.payloadType;\n  }).join(' ') + '\\r\\n';\n\n  sdp += 'c=IN IP4 0.0.0.0\\r\\n';\n  sdp += 'a=rtcp:9 IN IP4 0.0.0.0\\r\\n';\n\n  // Add a=rtpmap lines for each codec. Also fmtp and rtcp-fb.\n  caps.codecs.forEach(codec =\u003e {\n    sdp += SDPUtils.writeRtpMap(codec);\n    sdp += SDPUtils.writeFmtp(codec);\n    sdp += SDPUtils.writeRtcpFb(codec);\n  });\n  let maxptime = 0;\n  caps.codecs.forEach(codec =\u003e {\n    if (codec.maxptime \u003e maxptime) {\n      maxptime = codec.maxptime;\n    }\n  });\n  if (maxptime \u003e 0) {\n    sdp += 'a=maxptime:' + maxptime + '\\r\\n';\n  }\n\n  if (caps.headerExtensions) {\n    caps.headerExtensions.forEach(extension =\u003e {\n      sdp += SDPUtils.writeExtmap(extension);\n    });\n  }\n  // FIXME: write fecMechanisms.\n  return sdp;\n};\n\n// Parses the SDP media section and returns an array of\n// RTCRtpEncodingParameters.\nSDPUtils.parseRtpEncodingParameters = function(mediaSection) {\n  const encodingParameters = [];\n  const description = SDPUtils.parseRtpParameters(mediaSection);\n  const hasRed = description.fecMechanisms.indexOf('RED') !== -1;\n  const hasUlpfec = description.fecMechanisms.indexOf('ULPFEC') !== -1;\n\n  // filter a=ssrc:... cname:, ignore PlanB-msid\n  const ssrcs = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n    .map(line =\u003e SDPUtils.parseSsrcMedia(line))\n    .filter(parts =\u003e parts.attribute === 'cname');\n  const primarySsrc = ssrcs.length \u003e 0 \u0026\u0026 ssrcs[0].ssrc;\n  let secondarySsrc;\n\n  const flows = SDPUtils.matchPrefix(mediaSection, 'a=ssrc-group:FID')\n    .map(line =\u003e {\n      const parts = line.substring(17).split(' ');\n      return parts.map(part =\u003e parseInt(part, 10));\n    });\n  if (flows.length \u003e 0 \u0026\u0026 flows[0].length \u003e 1 \u0026\u0026 flows[0][0] === primarySsrc) {\n    secondarySsrc = flows[0][1];\n  }\n\n  description.codecs.forEach(codec =\u003e {\n    if (codec.name.toUpperCase() === 'RTX' \u0026\u0026 codec.parameters.apt) {\n      let encParam = {\n        ssrc: primarySsrc,\n        codecPayloadType: parseInt(codec.parameters.apt, 10),\n      };\n      if (primarySsrc \u0026\u0026 secondarySsrc) {\n        encParam.rtx = {ssrc: secondarySsrc};\n      }\n      encodingParameters.push(encParam);\n      if (hasRed) {\n        encParam = JSON.parse(JSON.stringify(encParam));\n        encParam.fec = {\n          ssrc: primarySsrc,\n          mechanism: hasUlpfec ? 'red+ulpfec' : 'red',\n        };\n        encodingParameters.push(encParam);\n      }\n    }\n  });\n  if (encodingParameters.length === 0 \u0026\u0026 primarySsrc) {\n    encodingParameters.push({\n      ssrc: primarySsrc,\n    });\n  }\n\n  // we support both b=AS and b=TIAS but interpret AS as TIAS.\n  let bandwidth = SDPUtils.matchPrefix(mediaSection, 'b=');\n  if (bandwidth.length) {\n    if (bandwidth[0].indexOf('b=TIAS:') === 0) {\n      bandwidth = parseInt(bandwidth[0].substring(7), 10);\n    } else if (bandwidth[0].indexOf('b=AS:') === 0) {\n      // use formula from JSEP to convert b=AS to TIAS value.\n      bandwidth = parseInt(bandwidth[0].substring(5), 10) * 1000 * 0.95\n          - (50 * 40 * 8);\n    } else {\n      bandwidth = undefined;\n    }\n    encodingParameters.forEach(params =\u003e {\n      params.maxBitrate = bandwidth;\n    });\n  }\n  return encodingParameters;\n};\n\n// parses http://draft.ortc.org/#rtcrtcpparameters*\nSDPUtils.parseRtcpParameters = function(mediaSection) {\n  const rtcpParameters = {};\n\n  // Gets the first SSRC. Note that with RTX there might be multiple\n  // SSRCs.\n  const remoteSsrc = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n    .map(line =\u003e SDPUtils.parseSsrcMedia(line))\n    .filter(obj =\u003e obj.attribute === 'cname')[0];\n  if (remoteSsrc) {\n    rtcpParameters.cname = remoteSsrc.value;\n    rtcpParameters.ssrc = remoteSsrc.ssrc;\n  }\n\n  // Edge uses the compound attribute instead of reducedSize\n  // compound is !reducedSize\n  const rsize = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-rsize');\n  rtcpParameters.reducedSize = rsize.length \u003e 0;\n  rtcpParameters.compound = rsize.length === 0;\n\n  // parses the rtcp-mux attrіbute.\n  // Note that Edge does not support unmuxed RTCP.\n  const mux = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-mux');\n  rtcpParameters.mux = mux.length \u003e 0;\n\n  return rtcpParameters;\n};\n\nSDPUtils.writeRtcpParameters = function(rtcpParameters) {\n  let sdp = '';\n  if (rtcpParameters.reducedSize) {\n    sdp += 'a=rtcp-rsize\\r\\n';\n  }\n  if (rtcpParameters.mux) {\n    sdp += 'a=rtcp-mux\\r\\n';\n  }\n  if (rtcpParameters.ssrc !== undefined \u0026\u0026 rtcpParameters.cname) {\n    sdp += 'a=ssrc:' + rtcpParameters.ssrc +\n      ' cname:' + rtcpParameters.cname + '\\r\\n';\n  }\n  return sdp;\n};\n\n\n// parses either a=msid: or a=ssrc:... msid lines and returns\n// the id of the MediaStream and MediaStreamTrack.\nSDPUtils.parseMsid = function(mediaSection) {\n  let parts;\n  const spec = SDPUtils.matchPrefix(mediaSection, 'a=msid:');\n  if (spec.length === 1) {\n    parts = spec[0].substring(7).split(' ');\n    return {stream: parts[0], track: parts[1]};\n  }\n  const planB = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n    .map(line =\u003e SDPUtils.parseSsrcMedia(line))\n    .filter(msidParts =\u003e msidParts.attribute === 'msid');\n  if (planB.length \u003e 0) {\n    parts = planB[0].value.split(' ');\n    return {stream: parts[0], track: parts[1]};\n  }\n};\n\n// SCTP\n// parses draft-ietf-mmusic-sctp-sdp-26 first and falls back\n// to draft-ietf-mmusic-sctp-sdp-05\nSDPUtils.parseSctpDescription = function(mediaSection) {\n  const mline = SDPUtils.parseMLine(mediaSection);\n  const maxSizeLine = SDPUtils.matchPrefix(mediaSection, 'a=max-message-size:');\n  let maxMessageSize;\n  if (maxSizeLine.length \u003e 0) {\n    maxMessageSize = parseInt(maxSizeLine[0].substring(19), 10);\n  }\n  if (isNaN(maxMessageSize)) {\n    maxMessageSize = 65536;\n  }\n  const sctpPort = SDPUtils.matchPrefix(mediaSection, 'a=sctp-port:');\n  if (sctpPort.length \u003e 0) {\n    return {\n      port: parseInt(sctpPort[0].substring(12), 10),\n      protocol: mline.fmt,\n      maxMessageSize,\n    };\n  }\n  const sctpMapLines = SDPUtils.matchPrefix(mediaSection, 'a=sctpmap:');\n  if (sctpMapLines.length \u003e 0) {\n    const parts = sctpMapLines[0]\n      .substring(10)\n      .split(' ');\n    return {\n      port: parseInt(parts[0], 10),\n      protocol: parts[1],\n      maxMessageSize,\n    };\n  }\n};\n\n// SCTP\n// outputs the draft-ietf-mmusic-sctp-sdp-26 version that all browsers\n// support by now receiving in this format, unless we originally parsed\n// as the draft-ietf-mmusic-sctp-sdp-05 format (indicated by the m-line\n// protocol of DTLS/SCTP -- without UDP/ or TCP/)\nSDPUtils.writeSctpDescription = function(media, sctp) {\n  let output = [];\n  if (media.protocol !== 'DTLS/SCTP') {\n    output = [\n      'm=' + media.kind + ' 9 ' + media.protocol + ' ' + sctp.protocol + '\\r\\n',\n      'c=IN IP4 0.0.0.0\\r\\n',\n      'a=sctp-port:' + sctp.port + '\\r\\n',\n    ];\n  } else {\n    output = [\n      'm=' + media.kind + ' 9 ' + media.protocol + ' ' + sctp.port + '\\r\\n',\n      'c=IN IP4 0.0.0.0\\r\\n',\n      'a=sctpmap:' + sctp.port + ' ' + sctp.protocol + ' 65535\\r\\n',\n    ];\n  }\n  if (sctp.maxMessageSize !== undefined) {\n    output.push('a=max-message-size:' + sctp.maxMessageSize + '\\r\\n');\n  }\n  return output.join('');\n};\n\n// Generate a session ID for SDP.\n// https://tools.ietf.org/html/draft-ietf-rtcweb-jsep-20#section-5.2.1\n// recommends using a cryptographically random +ve 64-bit value\n// but right now this should be acceptable and within the right range\nSDPUtils.generateSessionId = function() {\n  return Math.random().toString().substr(2, 22);\n};\n\n// Write boiler plate for start of SDP\n// sessId argument is optional - if not supplied it will\n// be generated randomly\n// sessVersion is optional and defaults to 2\n// sessUser is optional and defaults to 'thisisadapterortc'\nSDPUtils.writeSessionBoilerplate = function(sessId, sessVer, sessUser) {\n  let sessionId;\n  const version = sessVer !== undefined ? sessVer : 2;\n  if (sessId) {\n    sessionId = sessId;\n  } else {\n    sessionId = SDPUtils.generateSessionId();\n  }\n  const user = sessUser || 'thisisadapterortc';\n  // FIXME: sess-id should be an NTP timestamp.\n  return 'v=0\\r\\n' +\n      'o=' + user + ' ' + sessionId + ' ' + version +\n        ' IN IP4 127.0.0.1\\r\\n' +\n      's=-\\r\\n' +\n      't=0 0\\r\\n';\n};\n\n// Gets the direction from the mediaSection or the sessionpart.\nSDPUtils.getDirection = function(mediaSection, sessionpart) {\n  // Look for sendrecv, sendonly, recvonly, inactive, default to sendrecv.\n  const lines = SDPUtils.splitLines(mediaSection);\n  for (let i = 0; i \u003c lines.length; i++) {\n    switch (lines[i]) {\n      case 'a=sendrecv':\n      case 'a=sendonly':\n      case 'a=recvonly':\n      case 'a=inactive':\n        return lines[i].substring(2);\n      default:\n        // FIXME: What should happen here?\n    }\n  }\n  if (sessionpart) {\n    return SDPUtils.getDirection(sessionpart);\n  }\n  return 'sendrecv';\n};\n\nSDPUtils.getKind = function(mediaSection) {\n  const lines = SDPUtils.splitLines(mediaSection);\n  const mline = lines[0].split(' ');\n  return mline[0].substring(2);\n};\n\nSDPUtils.isRejected = function(mediaSection) {\n  return mediaSection.split(' ', 2)[1] === '0';\n};\n\nSDPUtils.parseMLine = function(mediaSection) {\n  const lines = SDPUtils.splitLines(mediaSection);\n  const parts = lines[0].substring(2).split(' ');\n  return {\n    kind: parts[0],\n    port: parseInt(parts[1], 10),\n    protocol: parts[2],\n    fmt: parts.slice(3).join(' '),\n  };\n};\n\nSDPUtils.parseOLine = function(mediaSection) {\n  const line = SDPUtils.matchPrefix(mediaSection, 'o=')[0];\n  const parts = line.substring(2).split(' ');\n  return {\n    username: parts[0],\n    sessionId: parts[1],\n    sessionVersion: parseInt(parts[2], 10),\n    netType: parts[3],\n    addressType: parts[4],\n    address: parts[5],\n  };\n};\n\n// a very naive interpretation of a valid SDP.\nSDPUtils.isValidSDP = function(blob) {\n  if (typeof blob !== 'string' || blob.length === 0) {\n    return false;\n  }\n  const lines = SDPUtils.splitLines(blob);\n  for (let i = 0; i \u003c lines.length; i++) {\n    if (lines[i].length \u003c 2 || lines[i].charAt(1) !== '=') {\n      return false;\n    }\n    // TODO: check the modifier a bit more.\n  }\n  return true;\n};\n\n// Expose public methods.\nif (typeof module === 'object') {\n  module.exports = SDPUtils;\n}\n","/*\n *  Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n/* eslint-env node */\n'use strict';\n\nimport SDPUtils from 'sdp';\nimport * as utils from './utils';\n\nexport function shimRTCIceCandidate(window) {\n  // foundation is arbitrarily chosen as an indicator for full support for\n  // https://w3c.github.io/webrtc-pc/#rtcicecandidate-interface\n  if (!window.RTCIceCandidate || (window.RTCIceCandidate \u0026\u0026 'foundation' in\n      window.RTCIceCandidate.prototype)) {\n    return;\n  }\n\n  const NativeRTCIceCandidate = window.RTCIceCandidate;\n  window.RTCIceCandidate = function RTCIceCandidate(args) {\n    // Remove the a= which shouldn't be part of the candidate string.\n    if (typeof args === 'object' \u0026\u0026 args.candidate \u0026\u0026\n        args.candidate.indexOf('a=') === 0) {\n      args = JSON.parse(JSON.stringify(args));\n      args.candidate = args.candidate.substring(2);\n    }\n\n    if (args.candidate \u0026\u0026 args.candidate.length) {\n      // Augment the native candidate with the parsed fields.\n      const nativeCandidate = new NativeRTCIceCandidate(args);\n      const parsedCandidate = SDPUtils.parseCandidate(args.candidate);\n      for (const key in parsedCandidate) {\n        if (!(key in nativeCandidate)) {\n          Object.defineProperty(nativeCandidate, key,\n            {value: parsedCandidate[key]});\n        }\n      }\n\n      // Override serializer to not serialize the extra attributes.\n      nativeCandidate.toJSON = function toJSON() {\n        return {\n          candidate: nativeCandidate.candidate,\n          sdpMid: nativeCandidate.sdpMid,\n          sdpMLineIndex: nativeCandidate.sdpMLineIndex,\n          usernameFragment: nativeCandidate.usernameFragment,\n        };\n      };\n      return nativeCandidate;\n    }\n    return new NativeRTCIceCandidate(args);\n  };\n  window.RTCIceCandidate.prototype = NativeRTCIceCandidate.prototype;\n\n  // Hook up the augmented candidate in onicecandidate and\n  // addEventListener('icecandidate', ...)\n  utils.wrapPeerConnectionEvent(window, 'icecandidate', e =\u003e {\n    if (e.candidate) {\n      Object.defineProperty(e, 'candidate', {\n        value: new window.RTCIceCandidate(e.candidate),\n        writable: 'false'\n      });\n    }\n    return e;\n  });\n}\n\nexport function shimRTCIceCandidateRelayProtocol(window) {\n  if (!window.RTCIceCandidate || (window.RTCIceCandidate \u0026\u0026 'relayProtocol' in\n      window.RTCIceCandidate.prototype)) {\n    return;\n  }\n\n  // Hook up the augmented candidate in onicecandidate and\n  // addEventListener('icecandidate', ...)\n  utils.wrapPeerConnectionEvent(window, 'icecandidate', e =\u003e {\n    if (e.candidate) {\n      const parsedCandidate = SDPUtils.parseCandidate(e.candidate.candidate);\n      if (parsedCandidate.type === 'relay') {\n        // This is a libwebrtc-specific mapping of local type preference\n        // to relayProtocol.\n        e.candidate.relayProtocol = {\n          0: 'tls',\n          1: 'tcp',\n          2: 'udp',\n        }[parsedCandidate.priority \u003e\u003e 24];\n      }\n    }\n    return e;\n  });\n}\n\nexport function shimMaxMessageSize(window, browserDetails) {\n  if (!window.RTCPeerConnection) {\n    return;\n  }\n\n  if (!('sctp' in window.RTCPeerConnection.prototype)) {\n    Object.defineProperty(window.RTCPeerConnection.prototype, 'sctp', {\n      get() {\n        return typeof this._sctp === 'undefined' ? null : this._sctp;\n      }\n    });\n  }\n\n  const sctpInDescription = function(description) {\n    if (!description || !description.sdp) {\n      return false;\n    }\n    const sections = SDPUtils.splitSections(description.sdp);\n    sections.shift();\n    return sections.some(mediaSection =\u003e {\n      const mLine = SDPUtils.parseMLine(mediaSection);\n      return mLine \u0026\u0026 mLine.kind === 'application'\n          \u0026\u0026 mLine.protocol.indexOf('SCTP') !== -1;\n    });\n  };\n\n  const getRemoteFirefoxVersion = function(description) {\n    // TODO: Is there a better solution for detecting Firefox?\n    const match = description.sdp.match(/mozilla...THIS_IS_SDPARTA-(\\d+)/);\n    if (match === null || match.length \u003c 2) {\n      return -1;\n    }\n    const version = parseInt(match[1], 10);\n    // Test for NaN (yes, this is ugly)\n    return version !== version ? -1 : version;\n  };\n\n  const getCanSendMaxMessageSize = function(remoteIsFirefox) {\n    // Every implementation we know can send at least 64 KiB.\n    // Note: Although Chrome is technically able to send up to 256 KiB, the\n    //       data does not reach the other peer reliably.\n    //       See: https://bugs.chromium.org/p/webrtc/issues/detail?id=8419\n    let canSendMaxMessageSize = 65536;\n    if (browserDetails.browser === 'firefox') {\n      if (browserDetails.version \u003c 57) {\n        if (remoteIsFirefox === -1) {\n          // FF \u003c 57 will send in 16 KiB chunks using the deprecated PPID\n          // fragmentation.\n          canSendMaxMessageSize = 16384;\n        } else {\n          // However, other FF (and RAWRTC) can reassemble PPID-fragmented\n          // messages. Thus, supporting ~2 GiB when sending.\n          canSendMaxMessageSize = 2147483637;\n        }\n      } else if (browserDetails.version \u003c 60) {\n        // Currently, all FF \u003e= 57 will reset the remote maximum message size\n        // to the default value when a data channel is created at a later\n        // stage. :(\n        // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1426831\n        canSendMaxMessageSize =\n          browserDetails.version === 57 ? 65535 : 65536;\n      } else {\n        // FF \u003e= 60 supports sending ~2 GiB\n        canSendMaxMessageSize = 2147483637;\n      }\n    }\n    return canSendMaxMessageSize;\n  };\n\n  const getMaxMessageSize = function(description, remoteIsFirefox) {\n    // Note: 65536 bytes is the default value from the SDP spec. Also,\n    //       every implementation we know supports receiving 65536 bytes.\n    let maxMessageSize = 65536;\n\n    // FF 57 has a slightly incorrect default remote max message size, so\n    // we need to adjust it here to avoid a failure when sending.\n    // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1425697\n    if (browserDetails.browser === 'firefox'\n         \u0026\u0026 browserDetails.version === 57) {\n      maxMessageSize = 65535;\n    }\n\n    const match = SDPUtils.matchPrefix(description.sdp,\n      'a=max-message-size:');\n    if (match.length \u003e 0) {\n      maxMessageSize = parseInt(match[0].substring(19), 10);\n    } else if (browserDetails.browser === 'firefox' \u0026\u0026\n                remoteIsFirefox !== -1) {\n      // If the maximum message size is not present in the remote SDP and\n      // both local and remote are Firefox, the remote peer can receive\n      // ~2 GiB.\n      maxMessageSize = 2147483637;\n    }\n    return maxMessageSize;\n  };\n\n  const origSetRemoteDescription =\n      window.RTCPeerConnection.prototype.setRemoteDescription;\n  window.RTCPeerConnection.prototype.setRemoteDescription =\n    function setRemoteDescription() {\n      this._sctp = null;\n      // Chrome decided to not expose .sctp in plan-b mode.\n      // As usual, adapter.js has to do an 'ugly worakaround'\n      // to cover up the mess.\n      if (browserDetails.browser === 'chrome' \u0026\u0026 browserDetails.version \u003e= 76) {\n        const {sdpSemantics} = this.getConfiguration();\n        if (sdpSemantics === 'plan-b') {\n          Object.defineProperty(this, 'sctp', {\n            get() {\n              return typeof this._sctp === 'undefined' ? null : this._sctp;\n            },\n            enumerable: true,\n            configurable: true,\n          });\n        }\n      }\n\n      if (sctpInDescription(arguments[0])) {\n        // Check if the remote is FF.\n        const isFirefox = getRemoteFirefoxVersion(arguments[0]);\n\n        // Get the maximum message size the local peer is capable of sending\n        const canSendMMS = getCanSendMaxMessageSize(isFirefox);\n\n        // Get the maximum message size of the remote peer.\n        const remoteMMS = getMaxMessageSize(arguments[0], isFirefox);\n\n        // Determine final maximum message size\n        let maxMessageSize;\n        if (canSendMMS === 0 \u0026\u0026 remoteMMS === 0) {\n          maxMessageSize = Number.POSITIVE_INFINITY;\n        } else if (canSendMMS === 0 || remoteMMS === 0) {\n          maxMessageSize = Math.max(canSendMMS, remoteMMS);\n        } else {\n          maxMessageSize = Math.min(canSendMMS, remoteMMS);\n        }\n\n        // Create a dummy RTCSctpTransport object and the 'maxMessageSize'\n        // attribute.\n        const sctp = {};\n        Object.defineProperty(sctp, 'maxMessageSize', {\n          get() {\n            return maxMessageSize;\n          }\n        });\n        this._sctp = sctp;\n      }\n\n      return origSetRemoteDescription.apply(this, arguments);\n    };\n}\n\nexport function shimSendThrowTypeError(window) {\n  if (!(window.RTCPeerConnection \u0026\u0026\n      'createDataChannel' in window.RTCPeerConnection.prototype)) {\n    return;\n  }\n\n  // Note: Although Firefox \u003e= 57 has a native implementation, the maximum\n  //       message size can be reset for all data channels at a later stage.\n  //       See: https://bugzilla.mozilla.org/show_bug.cgi?id=1426831\n\n  function wrapDcSend(dc, pc) {\n    const origDataChannelSend = dc.send;\n    dc.send = function send() {\n      const data = arguments[0];\n      const length = data.length || data.size || data.byteLength;\n      if (dc.readyState === 'open' \u0026\u0026\n          pc.sctp \u0026\u0026 length \u003e pc.sctp.maxMessageSize) {\n        throw new TypeError('Message too large (can send a maximum of ' +\n          pc.sctp.maxMessageSize + ' bytes)');\n      }\n      return origDataChannelSend.apply(dc, arguments);\n    };\n  }\n  const origCreateDataChannel =\n    window.RTCPeerConnection.prototype.createDataChannel;\n  window.RTCPeerConnection.prototype.createDataChannel =\n    function createDataChannel() {\n      const dataChannel = origCreateDataChannel.apply(this, arguments);\n      wrapDcSend(dataChannel, this);\n      return dataChannel;\n    };\n  utils.wrapPeerConnectionEvent(window, 'datachannel', e =\u003e {\n    wrapDcSend(e.channel, e.target);\n    return e;\n  });\n}\n\n\n/* shims RTCConnectionState by pretending it is the same as iceConnectionState.\n * See https://bugs.chromium.org/p/webrtc/issues/detail?id=6145#c12\n * for why this is a valid hack in Chrome. In Firefox it is slightly incorrect\n * since DTLS failures would be hidden. See\n * https://bugzilla.mozilla.org/show_bug.cgi?id=1265827\n * for the Firefox tracking bug.\n */\nexport function shimConnectionState(window) {\n  if (!window.RTCPeerConnection ||\n      'connectionState' in window.RTCPeerConnection.prototype) {\n    return;\n  }\n  const proto = window.RTCPeerConnection.prototype;\n  Object.defineProperty(proto, 'connectionState', {\n    get() {\n      return {\n        completed: 'connected',\n        checking: 'connecting'\n      }[this.iceConnectionState] || this.iceConnectionState;\n    },\n    enumerable: true,\n    configurable: true\n  });\n  Object.defineProperty(proto, 'onconnectionstatechange', {\n    get() {\n      return this._onconnectionstatechange || null;\n    },\n    set(cb) {\n      if (this._onconnectionstatechange) {\n        this.removeEventListener('connectionstatechange',\n          this._onconnectionstatechange);\n        delete this._onconnectionstatechange;\n      }\n      if (cb) {\n        this.addEventListener('connectionstatechange',\n          this._onconnectionstatechange = cb);\n      }\n    },\n    enumerable: true,\n    configurable: true\n  });\n\n  ['setLocalDescription', 'setRemoteDescription'].forEach((method) =\u003e {\n    const origMethod = proto[method];\n    proto[method] = function() {\n      if (!this._connectionstatechangepoly) {\n        this._connectionstatechangepoly = e =\u003e {\n          const pc = e.target;\n          if (pc._lastConnectionState !== pc.connectionState) {\n            pc._lastConnectionState = pc.connectionState;\n            const newEvent = new Event('connectionstatechange', e);\n            pc.dispatchEvent(newEvent);\n          }\n          return e;\n        };\n        this.addEventListener('iceconnectionstatechange',\n          this._connectionstatechangepoly);\n      }\n      return origMethod.apply(this, arguments);\n    };\n  });\n}\n\nexport function removeExtmapAllowMixed(window, browserDetails) {\n  /* remove a=extmap-allow-mixed for webrtc.org \u003c M71 */\n  if (!window.RTCPeerConnection) {\n    return;\n  }\n  if (browserDetails.browser === 'chrome' \u0026\u0026 browserDetails.version \u003e= 71) {\n    return;\n  }\n  if (browserDetails.browser === 'safari' \u0026\u0026\n      browserDetails._safariVersion \u003e= 13.1) {\n    return;\n  }\n  const nativeSRD = window.RTCPeerConnection.prototype.setRemoteDescription;\n  window.RTCPeerConnection.prototype.setRemoteDescription =\n  function setRemoteDescription(desc) {\n    if (desc \u0026\u0026 desc.sdp \u0026\u0026 desc.sdp.indexOf('\\na=extmap-allow-mixed') !== -1) {\n      const sdp = desc.sdp.split('\\n').filter((line) =\u003e {\n        return line.trim() !== 'a=extmap-allow-mixed';\n      }).join('\\n');\n      // Safari enforces read-only-ness of RTCSessionDescription fields.\n      if (window.RTCSessionDescription \u0026\u0026\n          desc instanceof window.RTCSessionDescription) {\n        arguments[0] = new window.RTCSessionDescription({\n          type: desc.type,\n          sdp,\n        });\n      } else {\n        desc.sdp = sdp;\n      }\n    }\n    return nativeSRD.apply(this, arguments);\n  };\n}\n\nexport function shimAddIceCandidateNullOrEmpty(window, browserDetails) {\n  // Support for addIceCandidate(null or undefined)\n  // as well as addIceCandidate({candidate: \"\", ...})\n  // https://bugs.chromium.org/p/chromium/issues/detail?id=978582\n  // Note: must be called before other polyfills which change the signature.\n  if (!(window.RTCPeerConnection \u0026\u0026 window.RTCPeerConnection.prototype)) {\n    return;\n  }\n  const nativeAddIceCandidate =\n      window.RTCPeerConnection.prototype.addIceCandidate;\n  if (!nativeAddIceCandidate || nativeAddIceCandidate.length === 0) {\n    return;\n  }\n  window.RTCPeerConnection.prototype.addIceCandidate =\n    function addIceCandidate() {\n      if (!arguments[0]) {\n        if (arguments[1]) {\n          arguments[1].apply(null);\n        }\n        return Promise.resolve();\n      }\n      // Firefox 68+ emits and processes {candidate: \"\", ...}, ignore\n      // in older versions.\n      // Native support for ignoring exists for Chrome M77+.\n      // Safari ignores as well, exact version unknown but works in the same\n      // version that also ignores addIceCandidate(null).\n      if (((browserDetails.browser === 'chrome' \u0026\u0026 browserDetails.version \u003c 78)\n           || (browserDetails.browser === 'firefox'\n               \u0026\u0026 browserDetails.version \u003c 68)\n           || (browserDetails.browser === 'safari'))\n          \u0026\u0026 arguments[0] \u0026\u0026 arguments[0].candidate === '') {\n        return Promise.resolve();\n      }\n      return nativeAddIceCandidate.apply(this, arguments);\n    };\n}\n\n// Note: Make sure to call this ahead of APIs that modify\n// setLocalDescription.length\nexport function shimParameterlessSetLocalDescription(window, browserDetails) {\n  if (!(window.RTCPeerConnection \u0026\u0026 window.RTCPeerConnection.prototype)) {\n    return;\n  }\n  const nativeSetLocalDescription =\n      window.RTCPeerConnection.prototype.setLocalDescription;\n  if (!nativeSetLocalDescription || nativeSetLocalDescription.length === 0) {\n    return;\n  }\n  window.RTCPeerConnection.prototype.setLocalDescription =\n    function setLocalDescription() {\n      let desc = arguments[0] || {};\n      if (typeof desc !== 'object' || (desc.type \u0026\u0026 desc.sdp)) {\n        return nativeSetLocalDescription.apply(this, arguments);\n      }\n      // The remaining steps should technically happen when SLD comes off the\n      // RTCPeerConnection's operations chain (not ahead of going on it), but\n      // this is too difficult to shim. Instead, this shim only covers the\n      // common case where the operations chain is empty. This is imperfect, but\n      // should cover many cases. Rationale: Even if we can't reduce the glare\n      // window to zero on imperfect implementations, there's value in tapping\n      // into the perfect negotiation pattern that several browsers support.\n      desc = {type: desc.type, sdp: desc.sdp};\n      if (!desc.type) {\n        switch (this.signalingState) {\n          case 'stable':\n          case 'have-local-offer':\n          case 'have-remote-pranswer':\n            desc.type = 'offer';\n            break;\n          default:\n            desc.type = 'answer';\n            break;\n        }\n      }\n      if (desc.sdp || (desc.type !== 'offer' \u0026\u0026 desc.type !== 'answer')) {\n        return nativeSetLocalDescription.apply(this, [desc]);\n      }\n      const func = desc.type === 'offer' ? this.createOffer : this.createAnswer;\n      return func.apply(this)\n        .then(d =\u003e nativeSetLocalDescription.apply(this, [d]));\n    };\n}\n","/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\nimport * as utils from './utils';\n\n// Browser shims.\nimport * as chromeShim from './chrome/chrome_shim';\nimport * as firefoxShim from './firefox/firefox_shim';\nimport * as safariShim from './safari/safari_shim';\nimport * as commonShim from './common_shim';\nimport * as sdp from 'sdp';\n\n// Shimming starts here.\nexport function adapterFactory({window} = {}, options = {\n  shimChrome: true,\n  shimFirefox: true,\n  shimSafari: true,\n}) {\n  // Utils.\n  const logging = utils.log;\n  const browserDetails = utils.detectBrowser(window);\n\n  const adapter = {\n    browserDetails,\n    commonShim,\n    extractVersion: utils.extractVersion,\n    disableLog: utils.disableLog,\n    disableWarnings: utils.disableWarnings,\n    // Expose sdp as a convenience. For production apps include directly.\n    sdp,\n  };\n\n  // Shim browser if found.\n  switch (browserDetails.browser) {\n    case 'chrome':\n      if (!chromeShim || !chromeShim.shimPeerConnection ||\n          !options.shimChrome) {\n        logging('Chrome shim is not included in this adapter release.');\n        return adapter;\n      }\n      if (browserDetails.version === null) {\n        logging('Chrome shim can not determine version, not shimming.');\n        return adapter;\n      }\n      logging('adapter.js shimming chrome.');\n      // Export to the adapter global object visible in the browser.\n      adapter.browserShim = chromeShim;\n\n      // Must be called before shimPeerConnection.\n      commonShim.shimAddIceCandidateNullOrEmpty(window, browserDetails);\n      commonShim.shimParameterlessSetLocalDescription(window, browserDetails);\n\n      chromeShim.shimGetUserMedia(window, browserDetails);\n      chromeShim.shimMediaStream(window, browserDetails);\n      chromeShim.shimPeerConnection(window, browserDetails);\n      chromeShim.shimOnTrack(window, browserDetails);\n      chromeShim.shimAddTrackRemoveTrack(window, browserDetails);\n      chromeShim.shimGetSendersWithDtmf(window, browserDetails);\n      chromeShim.shimSenderReceiverGetStats(window, browserDetails);\n      chromeShim.fixNegotiationNeeded(window, browserDetails);\n\n      commonShim.shimRTCIceCandidate(window, browserDetails);\n      commonShim.shimRTCIceCandidateRelayProtocol(window, browserDetails);\n      commonShim.shimConnectionState(window, browserDetails);\n      commonShim.shimMaxMessageSize(window, browserDetails);\n      commonShim.shimSendThrowTypeError(window, browserDetails);\n      commonShim.removeExtmapAllowMixed(window, browserDetails);\n      break;\n    case 'firefox':\n      if (!firefoxShim || !firefoxShim.shimPeerConnection ||\n          !options.shimFirefox) {\n        logging('Firefox shim is not included in this adapter release.');\n        return adapter;\n      }\n      logging('adapter.js shimming firefox.');\n      // Export to the adapter global object visible in the browser.\n      adapter.browserShim = firefoxShim;\n\n      // Must be called before shimPeerConnection.\n      commonShim.shimAddIceCandidateNullOrEmpty(window, browserDetails);\n      commonShim.shimParameterlessSetLocalDescription(window, browserDetails);\n\n      firefoxShim.shimGetUserMedia(window, browserDetails);\n      firefoxShim.shimPeerConnection(window, browserDetails);\n      firefoxShim.shimOnTrack(window, browserDetails);\n      firefoxShim.shimRemoveStream(window, browserDetails);\n      firefoxShim.shimSenderGetStats(window, browserDetails);\n      firefoxShim.shimReceiverGetStats(window, browserDetails);\n      firefoxShim.shimRTCDataChannel(window, browserDetails);\n      firefoxShim.shimAddTransceiver(window, browserDetails);\n      firefoxShim.shimGetParameters(window, browserDetails);\n      firefoxShim.shimCreateOffer(window, browserDetails);\n      firefoxShim.shimCreateAnswer(window, browserDetails);\n\n      commonShim.shimRTCIceCandidate(window, browserDetails);\n      commonShim.shimConnectionState(window, browserDetails);\n      commonShim.shimMaxMessageSize(window, browserDetails);\n      commonShim.shimSendThrowTypeError(window, browserDetails);\n      break;\n    case 'safari':\n      if (!safariShim || !options.shimSafari) {\n        logging('Safari shim is not included in this adapter release.');\n        return adapter;\n      }\n      logging('adapter.js shimming safari.');\n      // Export to the adapter global object visible in the browser.\n      adapter.browserShim = safariShim;\n\n      // Must be called before shimCallbackAPI.\n      commonShim.shimAddIceCandidateNullOrEmpty(window, browserDetails);\n      commonShim.shimParameterlessSetLocalDescription(window, browserDetails);\n\n      safariShim.shimRTCIceServerUrls(window, browserDetails);\n      safariShim.shimCreateOfferLegacy(window, browserDetails);\n      safariShim.shimCallbacksAPI(window, browserDetails);\n      safariShim.shimLocalStreamsAPI(window, browserDetails);\n      safariShim.shimRemoteStreamsAPI(window, browserDetails);\n      safariShim.shimTrackEventTransceiver(window, browserDetails);\n      safariShim.shimGetUserMedia(window, browserDetails);\n      safariShim.shimAudioContext(window, browserDetails);\n\n      commonShim.shimRTCIceCandidate(window, browserDetails);\n      commonShim.shimRTCIceCandidateRelayProtocol(window, browserDetails);\n      commonShim.shimMaxMessageSize(window, browserDetails);\n      commonShim.shimSendThrowTypeError(window, browserDetails);\n      commonShim.removeExtmapAllowMixed(window, browserDetails);\n      break;\n    default:\n      logging('Unsupported browser!');\n      break;\n  }\n\n  return adapter;\n}\n","/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n/* eslint-env node */\n\n'use strict';\n\nimport {adapterFactory} from './adapter_factory.js';\n\nconst adapter =\n  adapterFactory({window: typeof window === 'undefined' ? undefined : window});\nexport default adapter;\n","import type { KeyProviderOptions } from './types';\n\nexport const ENCRYPTION_ALGORITHM = 'AES-GCM';\n\n// How many consecutive frames can fail decrypting before a particular key gets marked as invalid\nexport const DECRYPTION_FAILURE_TOLERANCE = 10;\n\n// We copy the first bytes of the VP8 payload unencrypted.\n// For keyframes this is 10 bytes, for non-keyframes (delta) 3. See\n//   https://tools.ietf.org/html/rfc6386#section-9.1\n// This allows the bridge to continue detecting keyframes (only one byte needed in the JVB)\n// and is also a bit easier for the VP8 decoder (i.e. it generates funny garbage pictures\n// instead of being unable to decode).\n// This is a bit for show and we might want to reduce to 1 unconditionally in the final version.\n//\n// For audio (where frame.type is not set) we do not encrypt the opus TOC byte:\n//   https://tools.ietf.org/html/rfc6716#section-3.1\nexport const UNENCRYPTED_BYTES = {\n  key: 10,\n  delta: 3,\n  audio: 1, // frame.type is not set on audio, so this is set manually\n  empty: 0,\n} as const;\n\n/* We use a 12 byte bit IV. This is signalled in plain together with the\n packet. See https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/encrypt#parameters */\nexport const IV_LENGTH = 12;\n\n// flag set to indicate that e2ee has been setup for sender/receiver;\nexport const E2EE_FLAG = 'lk_e2ee';\n\nexport const SALT = 'LKFrameEncryptionKey';\n\nexport const KEY_PROVIDER_DEFAULTS: KeyProviderOptions = {\n  sharedKey: false,\n  ratchetSalt: SALT,\n  ratchetWindowSize: 8,\n  failureTolerance: DECRYPTION_FAILURE_TOLERANCE,\n  keyringSize: 16,\n} as const;\n\nexport const MAX_SIF_COUNT = 100;\nexport const MAX_SIF_DURATION = 2000;\n","import type Participant from '../room/participant/Participant';\nimport type { CryptorError } from './errors';\nimport type { KeyInfo, RatchetResult } from './types';\n\nexport enum KeyProviderEvent {\n  SetKey = 'setKey',\n  /** Event for requesting to ratchet the key used to encrypt the stream */\n  RatchetRequest = 'ratchetRequest',\n  /** Emitted when a key is ratcheted. Could be after auto-ratcheting on decryption failure or\n   *  following a `RatchetRequest`, will contain the ratcheted key material */\n  KeyRatcheted = 'keyRatcheted',\n}\n\nexport type KeyProviderCallbacks = {\n  [KeyProviderEvent.SetKey]: (keyInfo: KeyInfo) =\u003e void;\n  [KeyProviderEvent.RatchetRequest]: (participantIdentity?: string, keyIndex?: number) =\u003e void;\n  [KeyProviderEvent.KeyRatcheted]: (\n    ratchetedResult: RatchetResult,\n    participantIdentity?: string,\n    keyIndex?: number,\n  ) =\u003e void;\n};\n\nexport enum KeyHandlerEvent {\n  /** Emitted when a key has been ratcheted. Is emitted when any key has been ratcheted\n   * i.e. when the FrameCryptor tried to ratchet when decryption is failing  */\n  KeyRatcheted = 'keyRatcheted',\n}\n\nexport type ParticipantKeyHandlerCallbacks = {\n  [KeyHandlerEvent.KeyRatcheted]: (\n    ratchetResult: RatchetResult,\n    participantIdentity: string,\n    keyIndex?: number,\n  ) =\u003e void;\n};\n\nexport enum EncryptionEvent {\n  ParticipantEncryptionStatusChanged = 'participantEncryptionStatusChanged',\n  EncryptionError = 'encryptionError',\n}\n\nexport type E2EEManagerCallbacks = {\n  [EncryptionEvent.ParticipantEncryptionStatusChanged]: (\n    enabled: boolean,\n    participant: Participant,\n  ) =\u003e void;\n  [EncryptionEvent.EncryptionError]: (error: Error) =\u003e void;\n};\n\nexport type CryptorCallbacks = {\n  [CryptorEvent.Error]: (error: CryptorError) =\u003e void;\n};\n\nexport enum CryptorEvent {\n  Error = 'cryptorError',\n}\n","import { ENCRYPTION_ALGORITHM } from './constants';\n\nexport function isE2EESupported() {\n  return isInsertableStreamSupported() || isScriptTransformSupported();\n}\n\nexport function isScriptTransformSupported() {\n  // @ts-ignore\n  return typeof window.RTCRtpScriptTransform !== 'undefined';\n}\n\nexport function isInsertableStreamSupported() {\n  return (\n    typeof window.RTCRtpSender !== 'undefined' \u0026\u0026\n    // @ts-ignore\n    typeof window.RTCRtpSender.prototype.createEncodedStreams !== 'undefined'\n  );\n}\n\nexport function isVideoFrame(\n  frame: RTCEncodedAudioFrame | RTCEncodedVideoFrame,\n): frame is RTCEncodedVideoFrame {\n  return 'type' in frame;\n}\n\nexport async function importKey(\n  keyBytes: Uint8Array | ArrayBuffer,\n  algorithm: string | { name: string } = { name: ENCRYPTION_ALGORITHM },\n  usage: 'derive' | 'encrypt' = 'encrypt',\n) {\n  // https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/importKey\n  return crypto.subtle.importKey(\n    'raw',\n    keyBytes,\n    algorithm,\n    false,\n    usage === 'derive' ? ['deriveBits', 'deriveKey'] : ['encrypt', 'decrypt'],\n  );\n}\n\nexport async function createKeyMaterialFromString(password: string) {\n  let enc = new TextEncoder();\n\n  const keyMaterial = await crypto.subtle.importKey(\n    'raw',\n    enc.encode(password),\n    {\n      name: 'PBKDF2',\n    },\n    false,\n    ['deriveBits', 'deriveKey'],\n  );\n\n  return keyMaterial;\n}\n\nexport async function createKeyMaterialFromBuffer(cryptoBuffer: ArrayBuffer) {\n  const keyMaterial = await crypto.subtle.importKey('raw', cryptoBuffer, 'HKDF', false, [\n    'deriveBits',\n    'deriveKey',\n  ]);\n\n  return keyMaterial;\n}\n\nfunction getAlgoOptions(algorithmName: string, salt: string) {\n  const textEncoder = new TextEncoder();\n  const encodedSalt = textEncoder.encode(salt);\n  switch (algorithmName) {\n    case 'HKDF':\n      return {\n        name: 'HKDF',\n        salt: encodedSalt,\n        hash: 'SHA-256',\n        info: new ArrayBuffer(128),\n      };\n    case 'PBKDF2': {\n      return {\n        name: 'PBKDF2',\n        salt: encodedSalt,\n        hash: 'SHA-256',\n        iterations: 100000,\n      };\n    }\n    default:\n      throw new Error(`algorithm ${algorithmName} is currently unsupported`);\n  }\n}\n\n/**\n * Derives a set of keys from the master key.\n * See https://tools.ietf.org/html/draft-omara-sframe-00#section-4.3.1\n */\nexport async function deriveKeys(material: CryptoKey, salt: string) {\n  const algorithmOptions = getAlgoOptions(material.algorithm.name, salt);\n\n  // https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/deriveKey#HKDF\n  // https://developer.mozilla.org/en-US/docs/Web/API/HkdfParams\n  const encryptionKey = await crypto.subtle.deriveKey(\n    algorithmOptions,\n    material,\n    {\n      name: ENCRYPTION_ALGORITHM,\n      length: 128,\n    },\n    false,\n    ['encrypt', 'decrypt'],\n  );\n\n  return { material, encryptionKey };\n}\n\nexport function createE2EEKey(): Uint8Array {\n  return window.crypto.getRandomValues(new Uint8Array(32));\n}\n\n/**\n * Ratchets a key. See\n * https://tools.ietf.org/html/draft-omara-sframe-00#section-4.3.5.1\n */\nexport async function ratchet(material: CryptoKey, salt: string): Promise\u003cArrayBuffer\u003e {\n  const algorithmOptions = getAlgoOptions(material.algorithm.name, salt);\n\n  // https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/deriveBits\n  return crypto.subtle.deriveBits(algorithmOptions, material, 256);\n}\n\nexport function needsRbspUnescaping(frameData: Uint8Array) {\n  for (var i = 0; i \u003c frameData.length - 3; i++) {\n    if (frameData[i] == 0 \u0026\u0026 frameData[i + 1] == 0 \u0026\u0026 frameData[i + 2] == 3) return true;\n  }\n  return false;\n}\n\nexport function parseRbsp(stream: Uint8Array): Uint8Array {\n  const dataOut: number[] = [];\n  var length = stream.length;\n  for (var i = 0; i \u003c stream.length; ) {\n    // Be careful about over/underflow here. byte_length_ - 3 can underflow, and\n    // i + 3 can overflow, but byte_length_ - i can't, because i \u003c byte_length_\n    // above, and that expression will produce the number of bytes left in\n    // the stream including the byte at i.\n    if (length - i \u003e= 3 \u0026\u0026 !stream[i] \u0026\u0026 !stream[i + 1] \u0026\u0026 stream[i + 2] == 3) {\n      // Two rbsp bytes.\n      dataOut.push(stream[i++]);\n      dataOut.push(stream[i++]);\n      // Skip the emulation byte.\n      i++;\n    } else {\n      // Single rbsp byte.\n      dataOut.push(stream[i++]);\n    }\n  }\n  return new Uint8Array(dataOut);\n}\n\nconst kZerosInStartSequence = 2;\nconst kEmulationByte = 3;\n\nexport function writeRbsp(data_in: Uint8Array): Uint8Array {\n  const dataOut: number[] = [];\n  var numConsecutiveZeros = 0;\n  for (var i = 0; i \u003c data_in.length; ++i) {\n    var byte = data_in[i];\n    if (byte \u003c= kEmulationByte \u0026\u0026 numConsecutiveZeros \u003e= kZerosInStartSequence) {\n      // Need to escape.\n      dataOut.push(kEmulationByte);\n      numConsecutiveZeros = 0;\n    }\n    dataOut.push(byte);\n    if (byte == 0) {\n      ++numConsecutiveZeros;\n    } else {\n      numConsecutiveZeros = 0;\n    }\n  }\n  return new Uint8Array(dataOut);\n}\n","import { EventEmitter } from 'events';\nimport type TypedEventEmitter from 'typed-emitter';\nimport log from '../logger';\nimport { KEY_PROVIDER_DEFAULTS } from './constants';\nimport { type KeyProviderCallbacks, KeyProviderEvent } from './events';\nimport type { KeyInfo, KeyProviderOptions, RatchetResult } from './types';\nimport { createKeyMaterialFromBuffer, createKeyMaterialFromString } from './utils';\n\n/**\n * @experimental\n */\nexport class BaseKeyProvider extends (EventEmitter as new () =\u003e TypedEventEmitter\u003cKeyProviderCallbacks\u003e) {\n  private keyInfoMap: Map\u003cstring, KeyInfo\u003e;\n\n  private readonly options: KeyProviderOptions;\n\n  constructor(options: Partial\u003cKeyProviderOptions\u003e = {}) {\n    super();\n    this.keyInfoMap = new Map();\n    this.options = { ...KEY_PROVIDER_DEFAULTS, ...options };\n    this.on(KeyProviderEvent.KeyRatcheted, this.onKeyRatcheted);\n  }\n\n  /**\n   * callback to invoke once a key has been set for a participant\n   * @param key\n   * @param participantIdentity\n   * @param keyIndex\n   */\n  protected onSetEncryptionKey(key: CryptoKey, participantIdentity?: string, keyIndex?: number) {\n    const keyInfo: KeyInfo = { key, participantIdentity, keyIndex };\n    if (!this.options.sharedKey \u0026\u0026 !participantIdentity) {\n      throw new Error(\n        'participant identity needs to be passed for encryption key if sharedKey option is false',\n      );\n    }\n    this.keyInfoMap.set(`${participantIdentity ?? 'shared'}-${keyIndex ?? 0}`, keyInfo);\n    this.emit(KeyProviderEvent.SetKey, keyInfo);\n  }\n\n  /**\n   * Callback being invoked after a key has been ratcheted.\n   * Can happen when:\n   * - A decryption failure occurs and the key is auto-ratcheted\n   * - A ratchet request is sent (see {@link ratchetKey()})\n   * @param ratchetResult Contains the ratcheted chain key (exportable to other participants) and the derived new key material.\n   * @param participantId\n   * @param keyIndex\n   */\n  protected onKeyRatcheted = (\n    ratchetResult: RatchetResult,\n    participantId?: string,\n    keyIndex?: number,\n  ) =\u003e {\n    log.debug('key ratcheted event received', { ratchetResult, participantId, keyIndex });\n  };\n\n  getKeys() {\n    return Array.from(this.keyInfoMap.values());\n  }\n\n  getOptions() {\n    return this.options;\n  }\n\n  ratchetKey(participantIdentity?: string, keyIndex?: number) {\n    this.emit(KeyProviderEvent.RatchetRequest, participantIdentity, keyIndex);\n  }\n}\n\n/**\n * A basic KeyProvider implementation intended for a single shared\n * passphrase between all participants\n * @experimental\n */\nexport class ExternalE2EEKeyProvider extends BaseKeyProvider {\n  ratchetInterval: number | undefined;\n\n  constructor(options: Partial\u003cOmit\u003cKeyProviderOptions, 'sharedKey'\u003e\u003e = {}) {\n    const opts: Partial\u003cKeyProviderOptions\u003e = {\n      ...options,\n      sharedKey: true,\n      // for a shared key provider failing to decrypt for a specific participant\n      // should not mark the key as invalid, so we accept wrong keys forever\n      // and won't try to auto-ratchet\n      ratchetWindowSize: 0,\n      failureTolerance: -1,\n    };\n    super(opts);\n  }\n\n  /**\n   * Accepts a passphrase that's used to create the crypto keys.\n   * When passing in a string, PBKDF2 is used.\n   * When passing in an Array buffer of cryptographically random numbers, HKDF is being used. (recommended)\n   * @param key\n   */\n  async setKey(key: string | ArrayBuffer) {\n    const derivedKey =\n      typeof key === 'string'\n        ? await createKeyMaterialFromString(key)\n        : await createKeyMaterialFromBuffer(key);\n    this.onSetEncryptionKey(derivedKey);\n  }\n}\n","import { DisconnectReason, RequestResponse_Reason } from '@livekit/protocol';\n\nexport class LivekitError extends Error {\n  code: number;\n\n  constructor(code: number, message?: string) {\n    super(message || 'an error has occured');\n    this.name = 'LiveKitError';\n    this.code = code;\n  }\n}\n\nexport enum ConnectionErrorReason {\n  NotAllowed,\n  ServerUnreachable,\n  InternalError,\n  Cancelled,\n  LeaveRequest,\n  Timeout,\n}\n\nexport class ConnectionError extends LivekitError {\n  status?: number;\n\n  context?: unknown | DisconnectReason;\n\n  reason: ConnectionErrorReason;\n\n  reasonName: string;\n\n  constructor(\n    message: string,\n    reason: ConnectionErrorReason,\n    status?: number,\n    context?: unknown | DisconnectReason,\n  ) {\n    super(1, message);\n    this.name = 'ConnectionError';\n    this.status = status;\n    this.reason = reason;\n    this.context = context;\n    this.reasonName = ConnectionErrorReason[reason];\n  }\n}\n\nexport class DeviceUnsupportedError extends LivekitError {\n  constructor(message?: string) {\n    super(21, message ?? 'device is unsupported');\n    this.name = 'DeviceUnsupportedError';\n  }\n}\n\nexport class TrackInvalidError extends LivekitError {\n  constructor(message?: string) {\n    super(20, message ?? 'track is invalid');\n    this.name = 'TrackInvalidError';\n  }\n}\n\nexport class UnsupportedServer extends LivekitError {\n  constructor(message?: string) {\n    super(10, message ?? 'unsupported server');\n    this.name = 'UnsupportedServer';\n  }\n}\n\nexport class UnexpectedConnectionState extends LivekitError {\n  constructor(message?: string) {\n    super(12, message ?? 'unexpected connection state');\n    this.name = 'UnexpectedConnectionState';\n  }\n}\n\nexport class NegotiationError extends LivekitError {\n  constructor(message?: string) {\n    super(13, message ?? 'unable to negotiate');\n    this.name = 'NegotiationError';\n  }\n}\n\nexport class PublishDataError extends LivekitError {\n  constructor(message?: string) {\n    super(14, message ?? 'unable to publish data');\n    this.name = 'PublishDataError';\n  }\n}\n\nexport class PublishTrackError extends LivekitError {\n  status: number;\n\n  constructor(message: string, status: number) {\n    super(15, message);\n    this.name = 'PublishTrackError';\n    this.status = status;\n  }\n}\n\nexport type RequestErrorReason =\n  | Exclude\u003cRequestResponse_Reason, RequestResponse_Reason.OK\u003e\n  | 'TimeoutError';\n\nexport class SignalRequestError extends LivekitError {\n  reason: RequestErrorReason;\n\n  reasonName: string;\n\n  constructor(message: string, reason: RequestErrorReason) {\n    super(15, message);\n    this.reason = reason;\n    this.reasonName = typeof reason === 'string' ? reason : RequestResponse_Reason[reason];\n  }\n}\n\n// NOTE: matches with https://github.com/livekit/client-sdk-swift/blob/f37bbd260d61e165084962db822c79f995f1a113/Sources/LiveKit/DataStream/StreamError.swift#L17\nexport enum DataStreamErrorReason {\n  // Unable to open a stream with the same ID more than once.\n  AlreadyOpened = 0,\n\n  // Stream closed abnormally by remote participant.\n  AbnormalEnd = 1,\n\n  // Incoming chunk data could not be decoded.\n  DecodeFailed = 2,\n\n  // Read length exceeded total length specified in stream header.\n  LengthExceeded = 3,\n\n  // Read length less than total length specified in stream header.\n  Incomplete = 4,\n\n  // Unable to register a stream handler more than once.\n  HandlerAlreadyRegistered = 7,\n}\n\nexport class DataStreamError extends LivekitError {\n  reason: DataStreamErrorReason;\n\n  reasonName: string;\n\n  constructor(message: string, reason: DataStreamErrorReason) {\n    super(16, message);\n    this.name = 'DataStreamError';\n    this.reason = reason;\n    this.reasonName = DataStreamErrorReason[reason];\n  }\n}\n\nexport enum MediaDeviceFailure {\n  // user rejected permissions\n  PermissionDenied = 'PermissionDenied',\n  // device is not available\n  NotFound = 'NotFound',\n  // device is in use. On Windows, only a single tab may get access to a device at a time.\n  DeviceInUse = 'DeviceInUse',\n  Other = 'Other',\n}\n\nexport namespace MediaDeviceFailure {\n  export function getFailure(error: any): MediaDeviceFailure | undefined {\n    if (error \u0026\u0026 'name' in error) {\n      if (error.name === 'NotFoundError' || error.name === 'DevicesNotFoundError') {\n        return MediaDeviceFailure.NotFound;\n      }\n      if (error.name === 'NotAllowedError' || error.name === 'PermissionDeniedError') {\n        return MediaDeviceFailure.PermissionDenied;\n      }\n      if (error.name === 'NotReadableError' || error.name === 'TrackStartError') {\n        return MediaDeviceFailure.DeviceInUse;\n      }\n      return MediaDeviceFailure.Other;\n    }\n  }\n}\n","import { LivekitError } from '../room/errors';\n\nexport enum CryptorErrorReason {\n  InvalidKey = 0,\n  MissingKey = 1,\n  InternalError = 2,\n}\n\nexport class CryptorError extends LivekitError {\n  reason: CryptorErrorReason;\n\n  participantIdentity?: string;\n\n  constructor(\n    message?: string,\n    reason: CryptorErrorReason = CryptorErrorReason.InternalError,\n    participantIdentity?: string,\n  ) {\n    super(40, message);\n    this.reason = reason;\n    this.participantIdentity = participantIdentity;\n  }\n}\n","/**\n * Events are the primary way LiveKit notifies your application of changes.\n *\n * The following are events emitted by [[Room]], listen to room events like\n *\n * ```typescript\n * room.on(RoomEvent.TrackPublished, (track, publication, participant) =\u003e {})\n * ```\n */\n\nexport enum RoomEvent {\n  /**\n   * When the connection to the server has been established\n   */\n  Connected = 'connected',\n\n  /**\n   * When the connection to the server has been interrupted and it's attempting\n   * to reconnect.\n   */\n  Reconnecting = 'reconnecting',\n\n  /**\n   * When the signal connection to the server has been interrupted. This isn't noticeable to users most of the time.\n   * It will resolve with a `RoomEvent.Reconnected` once the signal connection has been re-established.\n   * If media fails additionally it an additional `RoomEvent.Reconnecting` will be emitted.\n   */\n  SignalReconnecting = 'signalReconnecting',\n\n  /**\n   * Fires when a reconnection has been successful.\n   */\n  Reconnected = 'reconnected',\n\n  /**\n   * When disconnected from room. This fires when room.disconnect() is called or\n   * when an unrecoverable connection issue had occured.\n   *\n   * DisconnectReason can be used to determine why the participant was disconnected. Notable reasons are\n   * - DUPLICATE_IDENTITY: another client with the same identity has joined the room\n   * - PARTICIPANT_REMOVED: participant was removed by RemoveParticipant API\n   * - ROOM_DELETED: the room has ended via DeleteRoom API\n   *\n   * args: ([[DisconnectReason]])\n   */\n  Disconnected = 'disconnected',\n\n  /**\n   * Whenever the connection state of the room changes\n   *\n   * args: ([[ConnectionState]])\n   */\n  ConnectionStateChanged = 'connectionStateChanged',\n\n  /**\n   * When participant has been moved to a different room by the service request.\n   * The behavior looks like the participant has been disconnected and reconnected to a different room\n   * seamlessly without connection state transition.\n   * A new token will be provided for reconnecting to the new room if needed.\n   *\n   * args: ([[room: string, token: string]])\n   */\n  Moved = 'moved',\n\n  /**\n   * When input or output devices on the machine have changed.\n   */\n  MediaDevicesChanged = 'mediaDevicesChanged',\n\n  /**\n   * When a [[RemoteParticipant]] joins *after* the local\n   * participant. It will not emit events for participants that are already\n   * in the room\n   *\n   * args: ([[RemoteParticipant]])\n   */\n  ParticipantConnected = 'participantConnected',\n\n  /**\n   * When a [[RemoteParticipant]] leaves *after* the local\n   * participant has joined.\n   *\n   * args: ([[RemoteParticipant]])\n   */\n  ParticipantDisconnected = 'participantDisconnected',\n\n  /**\n   * When a new track is published to room *after* the local\n   * participant has joined. It will not fire for tracks that are already published.\n   *\n   * A track published doesn't mean the participant has subscribed to it. It's\n   * simply reflecting the state of the room.\n   *\n   * args: ([[RemoteTrackPublication]], [[RemoteParticipant]])\n   */\n  TrackPublished = 'trackPublished',\n\n  /**\n   * The [[LocalParticipant]] has subscribed to a new track. This event will **always**\n   * fire as long as new tracks are ready for use.\n   *\n   * args: ([[RemoteTrack]], [[RemoteTrackPublication]], [[RemoteParticipant]])\n   */\n  TrackSubscribed = 'trackSubscribed',\n\n  /**\n   * Could not subscribe to a track\n   *\n   * args: (track sid, [[RemoteParticipant]])\n   */\n  TrackSubscriptionFailed = 'trackSubscriptionFailed',\n\n  /**\n   * A [[RemoteParticipant]] has unpublished a track\n   *\n   * args: ([[RemoteTrackPublication]], [[RemoteParticipant]])\n   */\n  TrackUnpublished = 'trackUnpublished',\n\n  /**\n   * A subscribed track is no longer available. Clients should listen to this\n   * event and ensure they detach tracks.\n   *\n   * args: ([[Track]], [[RemoteTrackPublication]], [[RemoteParticipant]])\n   */\n  TrackUnsubscribed = 'trackUnsubscribed',\n\n  /**\n   * A track that was muted, fires on both [[RemoteParticipant]]s and [[LocalParticipant]]\n   *\n   * args: ([[TrackPublication]], [[Participant]])\n   */\n  TrackMuted = 'trackMuted',\n\n  /**\n   * A track that was unmuted, fires on both [[RemoteParticipant]]s and [[LocalParticipant]]\n   *\n   * args: ([[TrackPublication]], [[Participant]])\n   */\n  TrackUnmuted = 'trackUnmuted',\n\n  /**\n   * A local track was published successfully. This event is helpful to know\n   * when to update your local UI with the newly published track.\n   *\n   * args: ([[LocalTrackPublication]], [[LocalParticipant]])\n   */\n  LocalTrackPublished = 'localTrackPublished',\n\n  /**\n   * A local track was unpublished. This event is helpful to know when to remove\n   * the local track from your UI.\n   *\n   * When a user stops sharing their screen by pressing \"End\" on the browser UI,\n   * this event will also fire.\n   *\n   * args: ([[LocalTrackPublication]], [[LocalParticipant]])\n   */\n  LocalTrackUnpublished = 'localTrackUnpublished',\n\n  /**\n   * When a local audio track is published the SDK checks whether there is complete silence\n   * on that track and emits the LocalAudioSilenceDetected event in that case.\n   * This allows for applications to show UI informing users that they might have to\n   * reset their audio hardware or check for proper device connectivity.\n   */\n  LocalAudioSilenceDetected = 'localAudioSilenceDetected',\n\n  /**\n   * Active speakers changed. List of speakers are ordered by their audio level.\n   * loudest speakers first. This will include the LocalParticipant too.\n   *\n   * Speaker updates are sent only to the publishing participant and their subscribers.\n   *\n   * args: (Array\u003c[[Participant]]\u003e)\n   */\n  ActiveSpeakersChanged = 'activeSpeakersChanged',\n\n  /**\n   * Participant metadata is a simple way for app-specific state to be pushed to\n   * all users.\n   * When RoomService.UpdateParticipantMetadata is called to change a participant's\n   * state, *all*  participants in the room will fire this event.\n   *\n   * args: (prevMetadata: string, [[Participant]])\n   *\n   */\n  ParticipantMetadataChanged = 'participantMetadataChanged',\n\n  /**\n   * Participant's display name changed\n   *\n   * args: (name: string, [[Participant]])\n   *\n   */\n  ParticipantNameChanged = 'participantNameChanged',\n\n  /**\n   * Participant attributes is an app-specific key value state to be pushed to\n   * all users.\n   * When a participant's attributes changed, this event will be emitted with the changed attributes and the participant\n   * args: (changedAttributes: [[Record\u003cstring, string]], participant: [[Participant]])\n   */\n  ParticipantAttributesChanged = 'participantAttributesChanged',\n\n  /**\n   * Emitted when the participant's state changes to ACTIVE and is ready to send/receive data messages\n   *\n   * args: (participant: [[Participant]])\n   */\n  ParticipantActive = 'participantActive',\n\n  /**\n   * Room metadata is a simple way for app-specific state to be pushed to\n   * all users.\n   * When RoomService.UpdateRoomMetadata is called to change a room's state,\n   * *all*  participants in the room will fire this event.\n   *\n   * args: (string)\n   */\n  RoomMetadataChanged = 'roomMetadataChanged',\n\n  /**\n   * Data received from another participant.\n   * Data packets provides the ability to use LiveKit to send/receive arbitrary payloads.\n   * All participants in the room will receive the messages sent to the room.\n   *\n   * args: (payload: Uint8Array, participant: [[Participant]], kind: [[DataPacket_Kind]], topic?: string)\n   */\n  DataReceived = 'dataReceived',\n\n  /**\n   * SIP DTMF tones received from another participant.\n   *\n   * args: (participant: [[Participant]], dtmf: [[DataPacket_Kind]])\n   */\n  SipDTMFReceived = 'sipDTMFReceived',\n\n  /**\n   * Transcription received from a participant's track.\n   * @beta\n   */\n  TranscriptionReceived = 'transcriptionReceived',\n\n  /**\n   * Connection quality was changed for a Participant. It'll receive updates\n   * from the local participant, as well as any [[RemoteParticipant]]s that we are\n   * subscribed to.\n   *\n   * args: (connectionQuality: [[ConnectionQuality]], participant: [[Participant]])\n   */\n  ConnectionQualityChanged = 'connectionQualityChanged',\n\n  /**\n   * StreamState indicates if a subscribed (remote) track has been paused by the SFU\n   * (typically this happens because of subscriber's bandwidth constraints)\n   *\n   * When bandwidth conditions allow, the track will be resumed automatically.\n   * TrackStreamStateChanged will also be emitted when that happens.\n   *\n   * args: (pub: [[RemoteTrackPublication]], streamState: [[Track.StreamState]],\n   *        participant: [[RemoteParticipant]])\n   */\n  TrackStreamStateChanged = 'trackStreamStateChanged',\n\n  /**\n   * One of subscribed tracks have changed its permissions for the current\n   * participant. If permission was revoked, then the track will no longer\n   * be subscribed. If permission was granted, a TrackSubscribed event will\n   * be emitted.\n   *\n   * args: (pub: [[RemoteTrackPublication]],\n   *        status: [[TrackPublication.PermissionStatus]],\n   *        participant: [[RemoteParticipant]])\n   */\n  TrackSubscriptionPermissionChanged = 'trackSubscriptionPermissionChanged',\n\n  /**\n   * One of subscribed tracks have changed its status for the current\n   * participant.\n   *\n   * args: (pub: [[RemoteTrackPublication]],\n   *        status: [[TrackPublication.SubscriptionStatus]],\n   *        participant: [[RemoteParticipant]])\n   */\n  TrackSubscriptionStatusChanged = 'trackSubscriptionStatusChanged',\n\n  /**\n   * LiveKit will attempt to autoplay all audio tracks when you attach them to\n   * audio elements. However, if that fails, we'll notify you via AudioPlaybackStatusChanged.\n   * `Room.canPlaybackAudio` will indicate if audio playback is permitted.\n   */\n  AudioPlaybackStatusChanged = 'audioPlaybackChanged',\n\n  /**\n   * LiveKit will attempt to autoplay all video tracks when you attach them to\n   * a video element. However, if that fails, we'll notify you via VideoPlaybackStatusChanged.\n   * Calling `room.startVideo()` in a user gesture event handler will resume the video playback.\n   */\n  VideoPlaybackStatusChanged = 'videoPlaybackChanged',\n\n  /**\n   * When we have encountered an error while attempting to create a track.\n   * The errors take place in getUserMedia().\n   * Use MediaDeviceFailure.getFailure(error) to get the reason of failure.\n   * [[LocalParticipant.lastCameraError]] and [[LocalParticipant.lastMicrophoneError]]\n   * will indicate if it had an error while creating the audio or video track respectively.\n   *\n   * args: (error: Error)\n   */\n  MediaDevicesError = 'mediaDevicesError',\n\n  /**\n   * A participant's permission has changed.\n   * args: (prevPermissions: [[ParticipantPermission]], participant: [[Participant]])\n   */\n  ParticipantPermissionsChanged = 'participantPermissionsChanged',\n\n  /**\n   * Signal connected, can publish tracks.\n   */\n  SignalConnected = 'signalConnected',\n\n  /**\n   * Recording of a room has started/stopped. Room.isRecording will be updated too.\n   * args: (isRecording: boolean)\n   */\n  RecordingStatusChanged = 'recordingStatusChanged',\n\n  ParticipantEncryptionStatusChanged = 'participantEncryptionStatusChanged',\n\n  EncryptionError = 'encryptionError',\n  /**\n   * Emits whenever the current buffer status of a data channel changes\n   * args: (isLow: boolean, kind: [[DataPacket_Kind]])\n   */\n  DCBufferStatusChanged = 'dcBufferStatusChanged',\n\n  /**\n   * Triggered by a call to room.switchActiveDevice\n   * args: (kind: MediaDeviceKind, deviceId: string)\n   */\n  ActiveDeviceChanged = 'activeDeviceChanged',\n\n  ChatMessage = 'chatMessage',\n  /**\n   * fired when the first remote participant has subscribed to the localParticipant's track\n   */\n  LocalTrackSubscribed = 'localTrackSubscribed',\n\n  /**\n   * fired when the client receives connection metrics from other participants\n   */\n  MetricsReceived = 'metricsReceived',\n}\n\nexport enum ParticipantEvent {\n  /**\n   * When a new track is published to room *after* the local\n   * participant has joined. It will not fire for tracks that are already published.\n   *\n   * A track published doesn't mean the participant has subscribed to it. It's\n   * simply reflecting the state of the room.\n   *\n   * args: ([[RemoteTrackPublication]])\n   */\n  TrackPublished = 'trackPublished',\n\n  /**\n   * Successfully subscribed to the [[RemoteParticipant]]'s track.\n   * This event will **always** fire as long as new tracks are ready for use.\n   *\n   * args: ([[RemoteTrack]], [[RemoteTrackPublication]])\n   */\n  TrackSubscribed = 'trackSubscribed',\n\n  /**\n   * Could not subscribe to a track\n   *\n   * args: (track sid)\n   */\n  TrackSubscriptionFailed = 'trackSubscriptionFailed',\n\n  /**\n   * A [[RemoteParticipant]] has unpublished a track\n   *\n   * args: ([[RemoteTrackPublication]])\n   */\n  TrackUnpublished = 'trackUnpublished',\n\n  /**\n   * A subscribed track is no longer available. Clients should listen to this\n   * event and ensure they detach tracks.\n   *\n   * args: ([[RemoteTrack]], [[RemoteTrackPublication]])\n   */\n  TrackUnsubscribed = 'trackUnsubscribed',\n\n  /**\n   * A track that was muted, fires on both [[RemoteParticipant]]s and [[LocalParticipant]]\n   *\n   * args: ([[TrackPublication]])\n   */\n  TrackMuted = 'trackMuted',\n\n  /**\n   * A track that was unmuted, fires on both [[RemoteParticipant]]s and [[LocalParticipant]]\n   *\n   * args: ([[TrackPublication]])\n   */\n  TrackUnmuted = 'trackUnmuted',\n\n  /**\n   * A local track was published successfully. This event is helpful to know\n   * when to update your local UI with the newly published track.\n   *\n   * args: ([[LocalTrackPublication]])\n   */\n  LocalTrackPublished = 'localTrackPublished',\n\n  /**\n   * A local track was unpublished. This event is helpful to know when to remove\n   * the local track from your UI.\n   *\n   * When a user stops sharing their screen by pressing \"End\" on the browser UI,\n   * this event will also fire.\n   *\n   * args: ([[LocalTrackPublication]])\n   */\n  LocalTrackUnpublished = 'localTrackUnpublished',\n\n  /**\n   * A local track has been constrained by cpu.\n   * This event is useful to know when to reduce the capture resolution of the track.\n   *\n   * This event is emitted on the local participant.\n   *\n   * args: ([[LocalVideoTrack]], [[LocalTrackPublication]])\n   */\n  LocalTrackCpuConstrained = 'localTrackCpuConstrained',\n\n  /**\n   * @internal\n   */\n  LocalSenderCreated = 'localSenderCreated',\n\n  /**\n   * Participant metadata is a simple way for app-specific state to be pushed to\n   * all users.\n   * When RoomService.UpdateParticipantMetadata is called to change a participant's\n   * state, *all*  participants in the room will fire this event.\n   * To access the current metadata, see [[Participant.metadata]].\n   *\n   * args: (prevMetadata: string)\n   *\n   */\n  ParticipantMetadataChanged = 'participantMetadataChanged',\n\n  /**\n   * Participant's display name changed\n   *\n   * args: (name: string, [[Participant]])\n   *\n   */\n  ParticipantNameChanged = 'participantNameChanged',\n\n  /**\n   * Data received from this participant as sender.\n   * Data packets provides the ability to use LiveKit to send/receive arbitrary payloads.\n   * All participants in the room will receive the messages sent to the room.\n   *\n   * args: (payload: Uint8Array, kind: [[DataPacket_Kind]])\n   */\n  DataReceived = 'dataReceived',\n\n  /**\n   * SIP DTMF tones received from this participant as sender.\n   *\n   * args: (dtmf: [[DataPacket_Kind]])\n   */\n  SipDTMFReceived = 'sipDTMFReceived',\n\n  /**\n   * Transcription received from this participant as data source.\n   * @beta\n   */\n  TranscriptionReceived = 'transcriptionReceived',\n\n  /**\n   * Has speaking status changed for the current participant\n   *\n   * args: (speaking: boolean)\n   */\n  IsSpeakingChanged = 'isSpeakingChanged',\n\n  /**\n   * Connection quality was changed for a Participant. It'll receive updates\n   * from the local participant, as well as any [[RemoteParticipant]]s that we are\n   * subscribed to.\n   *\n   * args: (connectionQuality: [[ConnectionQuality]])\n   */\n  ConnectionQualityChanged = 'connectionQualityChanged',\n\n  /**\n   * StreamState indicates if a subscribed track has been paused by the SFU\n   * (typically this happens because of subscriber's bandwidth constraints)\n   *\n   * When bandwidth conditions allow, the track will be resumed automatically.\n   * TrackStreamStateChanged will also be emitted when that happens.\n   *\n   * args: (pub: [[RemoteTrackPublication]], streamState: [[Track.StreamState]])\n   */\n  TrackStreamStateChanged = 'trackStreamStateChanged',\n\n  /**\n   * One of subscribed tracks have changed its permissions for the current\n   * participant. If permission was revoked, then the track will no longer\n   * be subscribed. If permission was granted, a TrackSubscribed event will\n   * be emitted.\n   *\n   * args: (pub: [[RemoteTrackPublication]],\n   *        status: [[TrackPublication.SubscriptionStatus]])\n   */\n  TrackSubscriptionPermissionChanged = 'trackSubscriptionPermissionChanged',\n\n  /**\n   * One of the remote participants publications has changed its subscription status.\n   *\n   */\n  TrackSubscriptionStatusChanged = 'trackSubscriptionStatusChanged',\n\n  /**\n   * a local track has been constrained by cpu\n   */\n  TrackCpuConstrained = 'trackCpuConstrained',\n\n  // fired only on LocalParticipant\n  /** @internal */\n  MediaDevicesError = 'mediaDevicesError',\n\n  // fired only on LocalParticipant\n  /** @internal */\n  AudioStreamAcquired = 'audioStreamAcquired',\n\n  /**\n   * A participant's permission has changed.\n   * args: (prevPermissions: [[ParticipantPermission]])\n   */\n  ParticipantPermissionsChanged = 'participantPermissionsChanged',\n\n  /** @internal */\n  PCTrackAdded = 'pcTrackAdded',\n\n  /**\n   * Participant attributes is an app-specific key value state to be pushed to\n   * all users.\n   * When a participant's attributes changed, this event will be emitted with the changed attributes\n   * args: (changedAttributes: [[Record\u003cstring, string]])\n   */\n  AttributesChanged = 'attributesChanged',\n\n  /**\n   * fired on local participant only, when the first remote participant has subscribed to the track specified in the payload\n   */\n  LocalTrackSubscribed = 'localTrackSubscribed',\n\n  /** only emitted on local participant */\n  ChatMessage = 'chatMessage',\n\n  /**\n   * Emitted when the participant's state changes to ACTIVE and is ready to send/receive data messages\n   */\n  Active = 'active',\n}\n\n/** @internal */\nexport enum EngineEvent {\n  TransportsCreated = 'transportsCreated',\n  Connected = 'connected',\n  Disconnected = 'disconnected',\n  Resuming = 'resuming',\n  Resumed = 'resumed',\n  Restarting = 'restarting',\n  Restarted = 'restarted',\n  SignalResumed = 'signalResumed',\n  SignalRestarted = 'signalRestarted',\n  Closing = 'closing',\n  MediaTrackAdded = 'mediaTrackAdded',\n  ActiveSpeakersUpdate = 'activeSpeakersUpdate',\n  DataPacketReceived = 'dataPacketReceived',\n  RTPVideoMapUpdate = 'rtpVideoMapUpdate',\n  DCBufferStatusChanged = 'dcBufferStatusChanged',\n  ParticipantUpdate = 'participantUpdate',\n  RoomUpdate = 'roomUpdate',\n  SpeakersChanged = 'speakersChanged',\n  StreamStateChanged = 'streamStateChanged',\n  ConnectionQualityUpdate = 'connectionQualityUpdate',\n  SubscriptionError = 'subscriptionError',\n  SubscriptionPermissionUpdate = 'subscriptionPermissionUpdate',\n  RemoteMute = 'remoteMute',\n  SubscribedQualityUpdate = 'subscribedQualityUpdate',\n  LocalTrackUnpublished = 'localTrackUnpublished',\n  LocalTrackSubscribed = 'localTrackSubscribed',\n  Offline = 'offline',\n  SignalRequestResponse = 'signalRequestResponse',\n  SignalConnected = 'signalConnected',\n  RoomMoved = 'roomMoved',\n}\n\nexport enum TrackEvent {\n  Message = 'message',\n  Muted = 'muted',\n  Unmuted = 'unmuted',\n  /**\n   * Only fires on LocalTracks\n   */\n  Restarted = 'restarted',\n  Ended = 'ended',\n  Subscribed = 'subscribed',\n  Unsubscribed = 'unsubscribed',\n  CpuConstrained = 'cpuConstrained',\n  /** @internal */\n  UpdateSettings = 'updateSettings',\n  /** @internal */\n  UpdateSubscription = 'updateSubscription',\n  /** @internal */\n  AudioPlaybackStarted = 'audioPlaybackStarted',\n  /** @internal */\n  AudioPlaybackFailed = 'audioPlaybackFailed',\n  /**\n   * @internal\n   * Only fires on LocalAudioTrack instances\n   */\n  AudioSilenceDetected = 'audioSilenceDetected',\n  /** @internal */\n  VisibilityChanged = 'visibilityChanged',\n  /** @internal */\n  VideoDimensionsChanged = 'videoDimensionsChanged',\n  /** @internal */\n  VideoPlaybackStarted = 'videoPlaybackStarted',\n  /** @internal */\n  VideoPlaybackFailed = 'videoPlaybackFailed',\n  /** @internal */\n  ElementAttached = 'elementAttached',\n  /** @internal */\n  ElementDetached = 'elementDetached',\n  /**\n   * @internal\n   * Only fires on LocalTracks\n   */\n  UpstreamPaused = 'upstreamPaused',\n  /**\n   * @internal\n   * Only fires on LocalTracks\n   */\n  UpstreamResumed = 'upstreamResumed',\n  /**\n   * @internal\n   * Fires on RemoteTrackPublication\n   */\n  SubscriptionPermissionChanged = 'subscriptionPermissionChanged',\n  /**\n   * Fires on RemoteTrackPublication\n   */\n  SubscriptionStatusChanged = 'subscriptionStatusChanged',\n  /**\n   * Fires on RemoteTrackPublication\n   */\n  SubscriptionFailed = 'subscriptionFailed',\n  /**\n   * @internal\n   */\n  TrackProcessorUpdate = 'trackProcessorUpdate',\n\n  /**\n   * @internal\n   */\n  AudioTrackFeatureUpdate = 'audioTrackFeatureUpdate',\n\n  /**\n   * @beta\n   */\n  TranscriptionReceived = 'transcriptionReceived',\n\n  /**\n   * @experimental\n   */\n  TimeSyncUpdate = 'timeSyncUpdate',\n\n  /**\n   * @internal\n   */\n  PreConnectBufferFlushed = 'preConnectBufferFlushed',\n}\n","export function cloneDeep\u003cT\u003e(value: T): T {\n  if (typeof value === 'undefined') {\n    return value as T;\n  }\n\n  if (typeof structuredClone === 'function') {\n    if (typeof value === 'object' \u0026\u0026 value !== null) {\n      // ensure that the value is not a proxy by spreading it\n      return structuredClone({ ...value });\n    }\n    return structuredClone(value);\n  } else {\n    return JSON.parse(JSON.stringify(value)) as T;\n  }\n}\n","// tiny, simplified version of https://github.com/lancedikson/bowser/blob/master/src/parser-browsers.js\n// reduced to only differentiate Chrome(ium) based browsers / Firefox / Safari\n\nconst commonVersionIdentifier = /version\\/(\\d+(\\.?_?\\d+)+)/i;\n\nexport type DetectableBrowser = 'Chrome' | 'Firefox' | 'Safari';\nexport type DetectableOS = 'iOS' | 'macOS';\n\nexport type BrowserDetails = {\n  name: DetectableBrowser;\n  version: string;\n  os?: DetectableOS;\n  osVersion?: string;\n};\n\nlet browserDetails: BrowserDetails | undefined;\n\n/**\n * @internal\n */\nexport function getBrowser(userAgent?: string, force = true): BrowserDetails | undefined {\n  if (typeof userAgent === 'undefined' \u0026\u0026 typeof navigator === 'undefined') {\n    return;\n  }\n  const ua = (userAgent ?? navigator.userAgent).toLowerCase();\n  if (browserDetails === undefined || force) {\n    const browser = browsersList.find(({ test }) =\u003e test.test(ua));\n    browserDetails = browser?.describe(ua);\n  }\n  return browserDetails;\n}\n\nconst browsersList = [\n  {\n    test: /firefox|iceweasel|fxios/i,\n    describe(ua: string) {\n      const browser: BrowserDetails = {\n        name: 'Firefox',\n        version: getMatch(/(?:firefox|iceweasel|fxios)[\\s/](\\d+(\\.?_?\\d+)+)/i, ua),\n        os: ua.toLowerCase().includes('fxios') ? 'iOS' : undefined,\n        osVersion: getOSVersion(ua),\n      };\n      return browser;\n    },\n  },\n  {\n    test: /chrom|crios|crmo/i,\n    describe(ua: string) {\n      const browser: BrowserDetails = {\n        name: 'Chrome',\n        version: getMatch(/(?:chrome|chromium|crios|crmo)\\/(\\d+(\\.?_?\\d+)+)/i, ua),\n        os: ua.toLowerCase().includes('crios') ? 'iOS' : undefined,\n        osVersion: getOSVersion(ua),\n      };\n\n      return browser;\n    },\n  },\n  /* Safari */\n  {\n    test: /safari|applewebkit/i,\n    describe(ua: string) {\n      const browser: BrowserDetails = {\n        name: 'Safari',\n        version: getMatch(commonVersionIdentifier, ua),\n        os: ua.includes('mobile/') ? 'iOS' : 'macOS',\n        osVersion: getOSVersion(ua),\n      };\n\n      return browser;\n    },\n  },\n];\n\nfunction getMatch(exp: RegExp, ua: string, id = 1) {\n  const match = ua.match(exp);\n  return (match \u0026\u0026 match.length \u003e= id \u0026\u0026 match[id]) || '';\n}\n\nfunction getOSVersion(ua: string) {\n  return ua.includes('mac os')\n    ? getMatch(/\\(.+?(\\d+_\\d+(:?_\\d+)?)/, ua, 1).replace(/_/g, '.')\n    : undefined;\n}\n","import { version as v } from '../package.json';\n\nexport const version = v;\nexport const protocolVersion = 16;\n","/**\n * Timers that can be overridden with platform specific implementations\n * that ensure that they are fired. These should be used when it is critical\n * that the timer fires on time.\n */\nexport default class CriticalTimers {\n  static setTimeout: (...args: Parameters\u003ctypeof setTimeout\u003e) =\u003e ReturnType\u003ctypeof setTimeout\u003e = (\n    ...args: Parameters\u003ctypeof setTimeout\u003e\n    // eslint-disable-next-line @typescript-eslint/no-implied-eval\n  ) =\u003e setTimeout(...args);\n\n  static setInterval: (...args: Parameters\u003ctypeof setInterval\u003e) =\u003e ReturnType\u003ctypeof setInterval\u003e =\n    // eslint-disable-next-line @typescript-eslint/no-implied-eval\n    (...args: Parameters\u003ctypeof setInterval\u003e) =\u003e setInterval(...args);\n\n  static clearTimeout: (\n    ...args: Parameters\u003ctypeof clearTimeout\u003e\n  ) =\u003e ReturnType\u003ctypeof clearTimeout\u003e = (...args: Parameters\u003ctypeof clearTimeout\u003e) =\u003e\n    clearTimeout(...args);\n\n  static clearInterval: (\n    ...args: Parameters\u003ctypeof clearInterval\u003e\n  ) =\u003e ReturnType\u003ctypeof clearInterval\u003e = (...args: Parameters\u003ctypeof clearInterval\u003e) =\u003e\n    clearInterval(...args);\n}\n","import {\n  AudioTrackFeature,\n  VideoQuality as ProtoQuality,\n  StreamState as ProtoStreamState,\n  TrackSource,\n  TrackType,\n} from '@livekit/protocol';\nimport { EventEmitter } from 'events';\nimport type TypedEventEmitter from 'typed-emitter';\nimport type { SignalClient } from '../../api/SignalClient';\nimport log, { LoggerNames, type StructuredLogger, getLogger } from '../../logger';\nimport { TrackEvent } from '../events';\nimport type { LoggerOptions } from '../types';\nimport { isFireFox, isSafari, isWeb } from '../utils';\nimport type { TrackProcessor } from './processor/types';\nimport { getLogContextFromTrack } from './utils';\n\nconst BACKGROUND_REACTION_DELAY = 5000;\n\n// keep old audio elements when detached, we would re-use them since on iOS\n// Safari tracks which audio elements have been \"blessed\" by the user.\nconst recycledElements: Array\u003cHTMLAudioElement\u003e = [];\n\nexport enum VideoQuality {\n  LOW = ProtoQuality.LOW,\n  MEDIUM = ProtoQuality.MEDIUM,\n  HIGH = ProtoQuality.HIGH,\n}\nexport abstract class Track\u003c\n  TrackKind extends Track.Kind = Track.Kind,\n\u003e extends (EventEmitter as new () =\u003e TypedEventEmitter\u003cTrackEventCallbacks\u003e) {\n  readonly kind: TrackKind;\n\n  attachedElements: HTMLMediaElement[] = [];\n\n  isMuted: boolean = false;\n\n  source: Track.Source;\n\n  private _streamState: Track.StreamState = Track.StreamState.Active;\n\n  /**\n   * sid is set after track is published to server, or if it's a remote track\n   */\n  sid?: Track.SID;\n\n  /**\n   * @internal\n   */\n  mediaStream?: MediaStream;\n\n  /**\n   * indicates current state of stream, it'll indicate `paused` if the track\n   * has been paused by congestion controller\n   */\n  get streamState(): Track.StreamState {\n    return this._streamState;\n  }\n\n  /** @internal */\n  setStreamState(value: Track.StreamState) {\n    this._streamState = value;\n  }\n\n  /** @internal */\n  rtpTimestamp: number | undefined;\n\n  protected _mediaStreamTrack: MediaStreamTrack;\n\n  protected _mediaStreamID: string;\n\n  protected isInBackground: boolean = false;\n\n  private backgroundTimeout: ReturnType\u003ctypeof setTimeout\u003e | undefined;\n\n  private loggerContextCb: LoggerOptions['loggerContextCb'];\n\n  protected timeSyncHandle: number | undefined;\n\n  protected _currentBitrate: number = 0;\n\n  protected monitorInterval?: ReturnType\u003ctypeof setInterval\u003e;\n\n  protected log: StructuredLogger = log;\n\n  protected constructor(\n    mediaTrack: MediaStreamTrack,\n    kind: TrackKind,\n    loggerOptions: LoggerOptions = {},\n  ) {\n    super();\n    this.log = getLogger(loggerOptions.loggerName ?? LoggerNames.Track);\n    this.loggerContextCb = loggerOptions.loggerContextCb;\n\n    this.setMaxListeners(100);\n    this.kind = kind;\n    this._mediaStreamTrack = mediaTrack;\n    this._mediaStreamID = mediaTrack.id;\n    this.source = Track.Source.Unknown;\n  }\n\n  protected get logContext() {\n    return {\n      ...this.loggerContextCb?.(),\n      ...getLogContextFromTrack(this),\n    };\n  }\n\n  /** current receive bits per second */\n  get currentBitrate(): number {\n    return this._currentBitrate;\n  }\n\n  get mediaStreamTrack() {\n    return this._mediaStreamTrack;\n  }\n\n  abstract get isLocal(): boolean;\n\n  /**\n   * @internal\n   * used for keep mediaStream's first id, since it's id might change\n   * if we disable/enable a track\n   */\n  get mediaStreamID(): string {\n    return this._mediaStreamID;\n  }\n\n  /**\n   * creates a new HTMLAudioElement or HTMLVideoElement, attaches to it, and returns it\n   */\n  attach(): HTMLMediaElement;\n\n  /**\n   * attaches track to an existing HTMLAudioElement or HTMLVideoElement\n   */\n  attach(element: HTMLMediaElement): HTMLMediaElement;\n  attach(element?: HTMLMediaElement): HTMLMediaElement {\n    let elementType = 'audio';\n    if (this.kind === Track.Kind.Video) {\n      elementType = 'video';\n    }\n    if (this.attachedElements.length === 0 \u0026\u0026 this.kind === Track.Kind.Video) {\n      this.addAppVisibilityListener();\n    }\n    if (!element) {\n      if (elementType === 'audio') {\n        recycledElements.forEach((e) =\u003e {\n          if (e.parentElement === null \u0026\u0026 !element) {\n            element = e;\n          }\n        });\n        if (element) {\n          // remove it from pool\n          recycledElements.splice(recycledElements.indexOf(element), 1);\n        }\n      }\n      if (!element) {\n        element = \u003cHTMLMediaElement\u003edocument.createElement(elementType);\n      }\n    }\n\n    if (!this.attachedElements.includes(element)) {\n      this.attachedElements.push(element);\n    }\n\n    // even if we believe it's already attached to the element, it's possible\n    // the element's srcObject was set to something else out of band.\n    // we'll want to re-attach it in that case\n    attachToElement(this.mediaStreamTrack, element);\n\n    // handle auto playback failures\n    const allMediaStreamTracks = (element.srcObject as MediaStream).getTracks();\n    const hasAudio = allMediaStreamTracks.some((tr) =\u003e tr.kind === 'audio');\n\n    // manually play media to detect auto playback status\n    element\n      .play()\n      .then(() =\u003e {\n        this.emit(hasAudio ? TrackEvent.AudioPlaybackStarted : TrackEvent.VideoPlaybackStarted);\n      })\n      .catch((e) =\u003e {\n        if (e.name === 'NotAllowedError') {\n          this.emit(hasAudio ? TrackEvent.AudioPlaybackFailed : TrackEvent.VideoPlaybackFailed, e);\n        } else if (e.name === 'AbortError') {\n          // commonly triggered by another `play` request, only log for debugging purposes\n          log.debug(\n            `${hasAudio ? 'audio' : 'video'} playback aborted, likely due to new play request`,\n          );\n        } else {\n          log.warn(`could not playback ${hasAudio ? 'audio' : 'video'}`, e);\n        }\n        // If audio playback isn't allowed make sure we still play back the video\n        if (\n          hasAudio \u0026\u0026\n          element \u0026\u0026\n          allMediaStreamTracks.some((tr) =\u003e tr.kind === 'video') \u0026\u0026\n          e.name === 'NotAllowedError'\n        ) {\n          element.muted = true;\n          element.play().catch(() =\u003e {\n            // catch for Safari, exceeded options at this point to automatically play the media element\n          });\n        }\n      });\n\n    this.emit(TrackEvent.ElementAttached, element);\n    return element;\n  }\n\n  /**\n   * Detaches from all attached elements\n   */\n  detach(): HTMLMediaElement[];\n\n  /**\n   * Detach from a single element\n   * @param element\n   */\n  detach(element: HTMLMediaElement): HTMLMediaElement;\n  detach(element?: HTMLMediaElement): HTMLMediaElement | HTMLMediaElement[] {\n    try {\n      // detach from a single element\n      if (element) {\n        detachTrack(this.mediaStreamTrack, element);\n        const idx = this.attachedElements.indexOf(element);\n        if (idx \u003e= 0) {\n          this.attachedElements.splice(idx, 1);\n          this.recycleElement(element);\n          this.emit(TrackEvent.ElementDetached, element);\n        }\n        return element;\n      }\n\n      const detached: HTMLMediaElement[] = [];\n      this.attachedElements.forEach((elm) =\u003e {\n        detachTrack(this.mediaStreamTrack, elm);\n        detached.push(elm);\n        this.recycleElement(elm);\n        this.emit(TrackEvent.ElementDetached, elm);\n      });\n\n      // remove all tracks\n      this.attachedElements = [];\n      return detached;\n    } finally {\n      if (this.attachedElements.length === 0) {\n        this.removeAppVisibilityListener();\n      }\n    }\n  }\n\n  stop() {\n    this.stopMonitor();\n    this._mediaStreamTrack.stop();\n  }\n\n  protected enable() {\n    this._mediaStreamTrack.enabled = true;\n  }\n\n  protected disable() {\n    this._mediaStreamTrack.enabled = false;\n  }\n\n  /* @internal */\n  abstract startMonitor(signalClient?: SignalClient): void;\n\n  /* @internal */\n  stopMonitor() {\n    if (this.monitorInterval) {\n      clearInterval(this.monitorInterval);\n    }\n    if (this.timeSyncHandle) {\n      cancelAnimationFrame(this.timeSyncHandle);\n    }\n  }\n\n  /** @internal */\n  updateLoggerOptions(loggerOptions: LoggerOptions) {\n    if (loggerOptions.loggerName) {\n      this.log = getLogger(loggerOptions.loggerName);\n    }\n    if (loggerOptions.loggerContextCb) {\n      this.loggerContextCb = loggerOptions.loggerContextCb;\n    }\n  }\n\n  private recycleElement(element: HTMLMediaElement) {\n    if (element instanceof HTMLAudioElement) {\n      // we only need to re-use a single element\n      let shouldCache = true;\n      element.pause();\n      recycledElements.forEach((e) =\u003e {\n        if (!e.parentElement) {\n          shouldCache = false;\n        }\n      });\n      if (shouldCache) {\n        recycledElements.push(element);\n      }\n    }\n  }\n\n  protected appVisibilityChangedListener = () =\u003e {\n    if (this.backgroundTimeout) {\n      clearTimeout(this.backgroundTimeout);\n    }\n    // delay app visibility update if it goes to hidden\n    // update immediately if it comes back to focus\n    if (document.visibilityState === 'hidden') {\n      this.backgroundTimeout = setTimeout(\n        () =\u003e this.handleAppVisibilityChanged(),\n        BACKGROUND_REACTION_DELAY,\n      );\n    } else {\n      this.handleAppVisibilityChanged();\n    }\n  };\n\n  protected async handleAppVisibilityChanged() {\n    this.isInBackground = document.visibilityState === 'hidden';\n    if (!this.isInBackground \u0026\u0026 this.kind === Track.Kind.Video) {\n      setTimeout(\n        () =\u003e\n          this.attachedElements.forEach((el) =\u003e\n            el.play().catch(() =\u003e {\n              /** catch clause necessary for Safari */\n            }),\n          ),\n        0,\n      );\n    }\n  }\n\n  protected addAppVisibilityListener() {\n    if (isWeb()) {\n      this.isInBackground = document.visibilityState === 'hidden';\n      document.addEventListener('visibilitychange', this.appVisibilityChangedListener);\n    } else {\n      this.isInBackground = false;\n    }\n  }\n\n  protected removeAppVisibilityListener() {\n    if (isWeb()) {\n      document.removeEventListener('visibilitychange', this.appVisibilityChangedListener);\n    }\n  }\n}\n\nexport function attachToElement(track: MediaStreamTrack, element: HTMLMediaElement) {\n  let mediaStream: MediaStream;\n  if (element.srcObject instanceof MediaStream) {\n    mediaStream = element.srcObject;\n  } else {\n    mediaStream = new MediaStream();\n  }\n\n  // check if track matches existing track\n  let existingTracks: MediaStreamTrack[];\n  if (track.kind === 'audio') {\n    existingTracks = mediaStream.getAudioTracks();\n  } else {\n    existingTracks = mediaStream.getVideoTracks();\n  }\n  if (!existingTracks.includes(track)) {\n    existingTracks.forEach((et) =\u003e {\n      mediaStream.removeTrack(et);\n    });\n    mediaStream.addTrack(track);\n  }\n\n  if (!isSafari() || !(element instanceof HTMLVideoElement)) {\n    // when in low power mode (applies to both macOS and iOS), Safari will show a play/pause overlay\n    // when a video starts that has the `autoplay` attribute is set.\n    // we work around this by _not_ setting the autoplay attribute on safari and instead call `setTimeout(() =\u003e el.play(),0)` further down\n    element.autoplay = true;\n  }\n  // In case there are no audio tracks present on the mediastream, we set the element as muted to ensure autoplay works\n  element.muted = mediaStream.getAudioTracks().length === 0;\n  if (element instanceof HTMLVideoElement) {\n    element.playsInline = true;\n  }\n\n  // avoid flicker\n  if (element.srcObject !== mediaStream) {\n    element.srcObject = mediaStream;\n    if ((isSafari() || isFireFox()) \u0026\u0026 element instanceof HTMLVideoElement) {\n      // Firefox also has a timing issue where video doesn't actually get attached unless\n      // performed out-of-band\n      // Safari 15 has a bug where in certain layouts, video element renders\n      // black until the page is resized or other changes take place.\n      // Resetting the src triggers it to render.\n      // https://developer.apple.com/forums/thread/690523\n      setTimeout(() =\u003e {\n        element.srcObject = mediaStream;\n        // Safari 15 sometimes fails to start a video\n        // when the window is backgrounded before the first frame is drawn\n        // manually calling play here seems to fix that\n        element.play().catch(() =\u003e {\n          /** do nothing */\n        });\n      }, 0);\n    }\n  }\n}\n\n/** @internal */\nexport function detachTrack(track: MediaStreamTrack, element: HTMLMediaElement) {\n  if (element.srcObject instanceof MediaStream) {\n    const mediaStream = element.srcObject;\n    mediaStream.removeTrack(track);\n    if (mediaStream.getTracks().length \u003e 0) {\n      element.srcObject = mediaStream;\n    } else {\n      element.srcObject = null;\n    }\n  }\n}\n\nexport namespace Track {\n  export enum Kind {\n    Audio = 'audio',\n    Video = 'video',\n    Unknown = 'unknown',\n  }\n  export type SID = string;\n  export enum Source {\n    Camera = 'camera',\n    Microphone = 'microphone',\n    ScreenShare = 'screen_share',\n    ScreenShareAudio = 'screen_share_audio',\n    Unknown = 'unknown',\n  }\n\n  export enum StreamState {\n    Active = 'active',\n    Paused = 'paused',\n    Unknown = 'unknown',\n  }\n\n  export interface Dimensions {\n    width: number;\n    height: number;\n  }\n\n  /** @internal */\n  export function kindToProto(k: Kind): TrackType {\n    switch (k) {\n      case Kind.Audio:\n        return TrackType.AUDIO;\n      case Kind.Video:\n        return TrackType.VIDEO;\n      default:\n        // FIXME this was UNRECOGNIZED before\n        return TrackType.DATA;\n    }\n  }\n\n  /** @internal */\n  export function kindFromProto(t: TrackType): Kind | undefined {\n    switch (t) {\n      case TrackType.AUDIO:\n        return Kind.Audio;\n      case TrackType.VIDEO:\n        return Kind.Video;\n      default:\n        return Kind.Unknown;\n    }\n  }\n\n  /** @internal */\n  export function sourceToProto(s: Source): TrackSource {\n    switch (s) {\n      case Source.Camera:\n        return TrackSource.CAMERA;\n      case Source.Microphone:\n        return TrackSource.MICROPHONE;\n      case Source.ScreenShare:\n        return TrackSource.SCREEN_SHARE;\n      case Source.ScreenShareAudio:\n        return TrackSource.SCREEN_SHARE_AUDIO;\n      default:\n        return TrackSource.UNKNOWN;\n    }\n  }\n\n  /** @internal */\n  export function sourceFromProto(s: TrackSource): Source {\n    switch (s) {\n      case TrackSource.CAMERA:\n        return Source.Camera;\n      case TrackSource.MICROPHONE:\n        return Source.Microphone;\n      case TrackSource.SCREEN_SHARE:\n        return Source.ScreenShare;\n      case TrackSource.SCREEN_SHARE_AUDIO:\n        return Source.ScreenShareAudio;\n      default:\n        return Source.Unknown;\n    }\n  }\n\n  /** @internal */\n  export function streamStateFromProto(s: ProtoStreamState): StreamState {\n    switch (s) {\n      case ProtoStreamState.ACTIVE:\n        return StreamState.Active;\n      case ProtoStreamState.PAUSED:\n        return StreamState.Paused;\n      default:\n        return StreamState.Unknown;\n    }\n  }\n}\n\nexport type TrackEventCallbacks = {\n  message: () =\u003e void;\n  muted: (track?: any) =\u003e void;\n  unmuted: (track?: any) =\u003e void;\n  restarted: (track?: any) =\u003e void;\n  ended: (track?: any) =\u003e void;\n  updateSettings: () =\u003e void;\n  updateSubscription: () =\u003e void;\n  audioPlaybackStarted: () =\u003e void;\n  audioPlaybackFailed: (error?: Error) =\u003e void;\n  audioSilenceDetected: () =\u003e void;\n  visibilityChanged: (visible: boolean, track?: any) =\u003e void;\n  videoDimensionsChanged: (dimensions: Track.Dimensions, track?: any) =\u003e void;\n  videoPlaybackStarted: () =\u003e void;\n  videoPlaybackFailed: (error?: Error) =\u003e void;\n  elementAttached: (element: HTMLMediaElement) =\u003e void;\n  elementDetached: (element: HTMLMediaElement) =\u003e void;\n  upstreamPaused: (track: any) =\u003e void;\n  upstreamResumed: (track: any) =\u003e void;\n  trackProcessorUpdate: (processor?: TrackProcessor\u003cTrack.Kind, any\u003e) =\u003e void;\n  audioTrackFeatureUpdate: (track: any, feature: AudioTrackFeature, enabled: boolean) =\u003e void;\n  timeSyncUpdate: (update: { timestamp: number; rtpTimestamp: number }) =\u003e void;\n  preConnectBufferFlushed: (buffer: Uint8Array[]) =\u003e void;\n  cpuConstrained: () =\u003e void;\n};\n","import type { Track } from './Track';\nimport type {\n  AudioProcessorOptions,\n  TrackProcessor,\n  VideoProcessorOptions,\n} from './processor/types';\n\nexport interface TrackPublishDefaults {\n  /**\n   * encoding parameters for camera track\n   */\n  videoEncoding?: VideoEncoding;\n\n  /**\n   * Advanced codecs (VP9/AV1/H265) are not supported by all browser clients. When backupCodec is\n   * set, when an incompatible client attempts to subscribe to the track, LiveKit\n   * will automatically publish a secondary track encoded with the backup codec.\n   *\n   * You could customize specific encoding parameters of the backup track by\n   * explicitly setting codec and encoding fields.\n   *\n   * Defaults to `true`\n   */\n  backupCodec?: true | false | { codec: BackupVideoCodec; encoding?: VideoEncoding };\n\n  /**\n   * When backup codec is enabled, there are two options to decide whether to\n   * send the primary codec at the same time:\n   *   * codec regression: publisher stops sending primary codec and all subscribers\n   *       will receive backup codec even if the primary codec is supported on their browser. It is the default\n   *       behavior and provides maximum compatibility. It also reduces CPU\n   *       and bandwidth consumption for publisher.\n   *   * multi-codec simulcast: publisher encodes and sends both codecs at same time,\n   *       subscribers will get most efficient codec. It will provide most bandwidth\n   *       efficiency, especially in the large 1:N room but requires more device performance\n   *       and bandwidth consumption for publisher.\n   */\n  backupCodecPolicy?: BackupCodecPolicy;\n\n  /**\n   * encoding parameters for screen share track\n   */\n  screenShareEncoding?: VideoEncoding;\n\n  /**\n   * codec, defaults to vp8; for svc codecs, auto enable vp8\n   * as backup. (TBD)\n   */\n  videoCodec?: VideoCodec;\n\n  /**\n   * which audio preset should be used for publishing (audio) tracks\n   * defaults to [[AudioPresets.music]]\n   */\n  audioPreset?: AudioPreset;\n\n  /**\n   * dtx (Discontinuous Transmission of audio), enabled by default for mono tracks.\n   */\n  dtx?: boolean;\n\n  /**\n   * red (Redundant Audio Data), enabled by default for mono tracks.\n   */\n  red?: boolean;\n\n  /**\n   * publish track in stereo mode (or set to false to disable). defaults determined by capture channel count.\n   */\n  forceStereo?: boolean;\n\n  /**\n   * use simulcast, defaults to true.\n   * When using simulcast, LiveKit will publish up to three versions of the stream\n   * at various resolutions.\n   */\n  simulcast?: boolean;\n\n  /**\n   * scalability mode for svc codecs, defaults to 'L3T3_KEY'.\n   * for svc codecs, simulcast is disabled.\n   */\n  scalabilityMode?: ScalabilityMode;\n\n  /**\n   * degradation preference\n   */\n  degradationPreference?: RTCDegradationPreference;\n\n  /**\n   * Up to two additional simulcast layers to publish in addition to the original\n   * Track.\n   * When left blank, it defaults to h180, h360.\n   * If a SVC codec is used (VP9 or AV1), this field has no effect.\n   *\n   * To publish three total layers, you would specify:\n   * {\n   *   videoEncoding: {...}, // encoding of the primary layer\n   *   videoSimulcastLayers: [\n   *     VideoPresets.h540,\n   *     VideoPresets.h216,\n   *   ],\n   * }\n   */\n  videoSimulcastLayers?: Array\u003cVideoPreset\u003e;\n\n  /**\n   * custom video simulcast layers for screen tracks\n   * Note: the layers need to be ordered from lowest to highest quality\n   */\n  screenShareSimulcastLayers?: Array\u003cVideoPreset\u003e;\n\n  /**\n   * For local tracks, stop the underlying MediaStreamTrack when the track is muted (or paused)\n   * on some platforms, this option is necessary to disable the microphone recording indicator.\n   * Note: when this is enabled, and BT devices are connected, they will transition between\n   * profiles (e.g. HFP to A2DP) and there will be an audible difference in playback.\n   *\n   * defaults to false\n   */\n  stopMicTrackOnMute?: boolean;\n\n  /**\n   * Enables preconnect buffer for a user's microphone track.\n   * This is useful for reducing perceived latency when the user starts to speak before the connection is established.\n   * Only works for agent use cases.\n   *\n   * Defaults to false.\n   */\n  preConnectBuffer?: boolean;\n}\n\n/**\n * Options when publishing tracks\n */\nexport interface TrackPublishOptions extends TrackPublishDefaults {\n  /**\n   * set a track name\n   */\n  name?: string;\n\n  /**\n   * Source of track, camera, microphone, or screen\n   */\n  source?: Track.Source;\n\n  /**\n   * Set stream name for the track. Audio and video tracks with the same stream name\n   * will be placed in the same `MediaStream` and offer better synchronization.\n   * By default, camera and microphone will be placed in a stream; as would screen_share and screen_share_audio\n   */\n  stream?: string;\n}\n\nexport interface CreateLocalTracksOptions {\n  /**\n   * audio track options, true to create with defaults. false if audio shouldn't be created\n   * default true\n   */\n  audio?: boolean | AudioCaptureOptions;\n\n  /**\n   * video track options, true to create with defaults. false if video shouldn't be created\n   * default true\n   */\n  video?: boolean | VideoCaptureOptions;\n}\n\nexport interface VideoCaptureOptions {\n  /**\n   * A ConstrainDOMString object specifying a device ID or an array of device\n   * IDs which are acceptable and/or required.\n   */\n  deviceId?: ConstrainDOMString;\n\n  /**\n   * A ConstrainDouble specifying the frame rate or range of frame rates which are acceptable and/or required.\n   */\n  frameRate?: ConstrainDouble;\n\n  /**\n   * a facing or an array of facings which are acceptable and/or required.\n   */\n  facingMode?: 'user' | 'environment' | 'left' | 'right';\n\n  resolution?: VideoResolution;\n\n  /**\n   * initialize the track with a given processor\n   */\n  processor?: TrackProcessor\u003cTrack.Kind.Video, VideoProcessorOptions\u003e;\n}\n\nexport interface ScreenShareCaptureOptions {\n  /**\n   * true to capture audio shared. browser support for audio capturing in\n   * screenshare is limited: https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getDisplayMedia#browser_compatibility\n   */\n  audio?: boolean | AudioCaptureOptions;\n\n  /**\n   * only allows for 'true' and chrome allows for additional options to be passed in\n   * https://developer.chrome.com/docs/web-platform/screen-sharing-controls/#displaySurface\n   */\n  video?: true | { displaySurface?: 'window' | 'browser' | 'monitor' };\n\n  /**\n   * capture resolution, defaults to 1080 for all browsers other than Safari\n   * On Safari 17, default resolution is not capped, due to a bug, specifying\n   * any resolution at all would lead to a low-resolution capture.\n   * https://bugs.webkit.org/show_bug.cgi?id=263015\n   */\n  resolution?: VideoResolution;\n\n  /** a CaptureController object instance containing methods that can be used to further manipulate the capture session if included. */\n  controller?: unknown; // TODO replace type with CaptureController once it lands in TypeScript\n\n  /** specifies whether the browser should allow the user to select the current tab for capture */\n  selfBrowserSurface?: 'include' | 'exclude';\n\n  /** specifies whether the browser should display a control to allow the user to dynamically switch the shared tab during screen-sharing. */\n  surfaceSwitching?: 'include' | 'exclude';\n\n  /** specifies whether the browser should include the system audio among the possible audio sources offered to the user */\n  systemAudio?: 'include' | 'exclude';\n\n  /** specify the type of content, see: https://www.w3.org/TR/mst-content-hint/#video-content-hints */\n  contentHint?: 'detail' | 'text' | 'motion';\n\n  /**\n   * Experimental option to control whether the audio playing in a tab will continue to be played out of a user's\n   * local speakers when the tab is captured.\n   */\n  suppressLocalAudioPlayback?: boolean;\n\n  /**\n   * Experimental option to instruct the browser to offer the current tab as the most prominent capture source\n   * @experimental\n   * @see https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getDisplayMedia#prefercurrenttab\n   */\n  preferCurrentTab?: boolean;\n}\n\nexport interface AudioCaptureOptions {\n  /**\n   * specifies whether automatic gain control is preferred and/or required\n   */\n  autoGainControl?: ConstrainBoolean;\n\n  /**\n   * the channel count or range of channel counts which are acceptable and/or required\n   */\n  channelCount?: ConstrainULong;\n\n  /**\n   * A ConstrainDOMString object specifying a device ID or an array of device\n   * IDs which are acceptable and/or required.\n   */\n  deviceId?: ConstrainDOMString;\n\n  /**\n   * whether or not echo cancellation is preferred and/or required\n   */\n  echoCancellation?: ConstrainBoolean;\n\n  /**\n   * the latency or range of latencies which are acceptable and/or required.\n   */\n  latency?: ConstrainDouble;\n\n  /**\n   * whether noise suppression is preferred and/or required.\n   */\n  noiseSuppression?: ConstrainBoolean;\n\n  /**\n   * @experimental\n   * a stronger version of 'noiseSuppression', browser support is not widespread yet.\n   * If this is set (and supported) the value for 'noiseSuppression' will be ignored\n   * @see https://w3c.github.io/mediacapture-extensions/#voiceisolation-constraint\n   */\n  voiceIsolation?: ConstrainBoolean;\n\n  /**\n   * the sample rate or range of sample rates which are acceptable and/or required.\n   */\n  sampleRate?: ConstrainULong;\n\n  /**\n   * sample size or range of sample sizes which are acceptable and/or required.\n   */\n  sampleSize?: ConstrainULong;\n\n  /**\n   * initialize the track with a given processor\n   */\n  processor?: TrackProcessor\u003cTrack.Kind.Audio, AudioProcessorOptions\u003e;\n}\n\nexport interface AudioOutputOptions {\n  /**\n   * deviceId to output audio\n   *\n   * Only supported on browsers where `setSinkId` is available\n   */\n  deviceId?: string;\n}\n\nexport interface VideoResolution {\n  width: number;\n  height: number;\n  frameRate?: number;\n  aspectRatio?: number;\n}\n\nexport interface VideoEncoding {\n  maxBitrate: number;\n  maxFramerate?: number;\n  priority?: RTCPriorityType;\n}\n\nexport interface VideoPresetOptions {\n  width: number;\n  height: number;\n  aspectRatio?: number;\n  maxBitrate: number;\n  maxFramerate?: number;\n  priority?: RTCPriorityType;\n}\n\nexport class VideoPreset {\n  encoding: VideoEncoding;\n\n  width: number;\n\n  height: number;\n\n  aspectRatio?: number;\n\n  constructor(videoPresetOptions: VideoPresetOptions);\n  constructor(\n    width: number,\n    height: number,\n    maxBitrate: number,\n    maxFramerate?: number,\n    priority?: RTCPriorityType,\n  );\n  constructor(\n    widthOrOptions: number | VideoPresetOptions,\n    height?: number,\n    maxBitrate?: number,\n    maxFramerate?: number,\n    priority?: RTCPriorityType,\n  ) {\n    if (typeof widthOrOptions === 'object') {\n      this.width = widthOrOptions.width;\n      this.height = widthOrOptions.height;\n      this.aspectRatio = widthOrOptions.aspectRatio;\n      this.encoding = {\n        maxBitrate: widthOrOptions.maxBitrate,\n        maxFramerate: widthOrOptions.maxFramerate,\n        priority: widthOrOptions.priority,\n      };\n    } else if (height !== undefined \u0026\u0026 maxBitrate !== undefined) {\n      this.width = widthOrOptions;\n      this.height = height;\n      this.aspectRatio = widthOrOptions / height;\n      this.encoding = {\n        maxBitrate,\n        maxFramerate,\n        priority,\n      };\n    } else {\n      throw new TypeError('Unsupported options: provide at least width, height and maxBitrate');\n    }\n  }\n\n  get resolution(): VideoResolution {\n    return {\n      width: this.width,\n      height: this.height,\n      frameRate: this.encoding.maxFramerate,\n      aspectRatio: this.aspectRatio,\n    };\n  }\n}\n\nexport interface AudioPreset {\n  maxBitrate: number;\n  priority?: RTCPriorityType;\n}\n\nconst backupCodecs = ['vp8', 'h264'] as const;\n\nexport const videoCodecs = ['vp8', 'h264', 'vp9', 'av1', 'h265'] as const;\n\nexport type VideoCodec = (typeof videoCodecs)[number];\n\nexport type BackupVideoCodec = (typeof backupCodecs)[number];\n\nexport function isBackupCodec(codec: string): codec is BackupVideoCodec {\n  return !!backupCodecs.find((backup) =\u003e backup === codec);\n}\n\nexport enum BackupCodecPolicy {\n  // codec regression is preferred, the sfu will try to regress codec if possible but not guaranteed\n  PREFER_REGRESSION = 0,\n  // multi-codec simulcast, publish both primary and backup codec at the same time\n  SIMULCAST = 1,\n  // always use backup codec only\n  REGRESSION = 2,\n}\n\n/**\n * scalability modes for svc.\n */\nexport type ScalabilityMode =\n  | 'L1T1'\n  | 'L1T2'\n  | 'L1T3'\n  | 'L2T1'\n  | 'L2T1h'\n  | 'L2T1_KEY'\n  | 'L2T2'\n  | 'L2T2h'\n  | 'L2T2_KEY'\n  | 'L2T3'\n  | 'L2T3h'\n  | 'L2T3_KEY'\n  | 'L3T1'\n  | 'L3T1h'\n  | 'L3T1_KEY'\n  | 'L3T2'\n  | 'L3T2h'\n  | 'L3T2_KEY'\n  | 'L3T3'\n  | 'L3T3h'\n  | 'L3T3_KEY';\n\nexport namespace AudioPresets {\n  export const telephone: AudioPreset = {\n    maxBitrate: 12_000,\n  };\n  export const speech: AudioPreset = {\n    maxBitrate: 24_000,\n  };\n  export const music: AudioPreset = {\n    maxBitrate: 48_000,\n  };\n  export const musicStereo: AudioPreset = {\n    maxBitrate: 64_000,\n  };\n  export const musicHighQuality: AudioPreset = {\n    maxBitrate: 96_000,\n  };\n  export const musicHighQualityStereo: AudioPreset = {\n    maxBitrate: 128_000,\n  };\n}\n\n/**\n * Sane presets for video resolution/encoding\n */\nexport const VideoPresets = {\n  h90: new VideoPreset(160, 90, 90_000, 20),\n  h180: new VideoPreset(320, 180, 160_000, 20),\n  h216: new VideoPreset(384, 216, 180_000, 20),\n  h360: new VideoPreset(640, 360, 450_000, 20),\n  h540: new VideoPreset(960, 540, 800_000, 25),\n  h720: new VideoPreset(1280, 720, 1_700_000, 30),\n  h1080: new VideoPreset(1920, 1080, 3_000_000, 30),\n  h1440: new VideoPreset(2560, 1440, 5_000_000, 30),\n  h2160: new VideoPreset(3840, 2160, 8_000_000, 30),\n} as const;\n\n/**\n * Four by three presets\n */\nexport const VideoPresets43 = {\n  h120: new VideoPreset(160, 120, 70_000, 20),\n  h180: new VideoPreset(240, 180, 125_000, 20),\n  h240: new VideoPreset(320, 240, 140_000, 20),\n  h360: new VideoPreset(480, 360, 330_000, 20),\n  h480: new VideoPreset(640, 480, 500_000, 20),\n  h540: new VideoPreset(720, 540, 600_000, 25),\n  h720: new VideoPreset(960, 720, 1_300_000, 30),\n  h1080: new VideoPreset(1440, 1080, 2_300_000, 30),\n  h1440: new VideoPreset(1920, 1440, 3_800_000, 30),\n} as const;\n\nexport const ScreenSharePresets = {\n  h360fps3: new VideoPreset(640, 360, 200_000, 3, 'medium'),\n  h360fps15: new VideoPreset(640, 360, 400_000, 15, 'medium'),\n  h720fps5: new VideoPreset(1280, 720, 800_000, 5, 'medium'),\n  h720fps15: new VideoPreset(1280, 720, 1_500_000, 15, 'medium'),\n  h720fps30: new VideoPreset(1280, 720, 2_000_000, 30, 'medium'),\n  h1080fps15: new VideoPreset(1920, 1080, 2_500_000, 15, 'medium'),\n  h1080fps30: new VideoPreset(1920, 1080, 5_000_000, 30, 'medium'),\n  // original resolution, without resizing\n  original: new VideoPreset(0, 0, 7_000_000, 30, 'medium'),\n} as const;\n","import {\n  ChatMessage as ChatMessageModel,\n  ClientInfo,\n  ClientInfo_SDK,\n  DisconnectReason,\n  Transcription as TranscriptionModel,\n} from '@livekit/protocol';\nimport { type BrowserDetails, getBrowser } from '../utils/browserParser';\nimport { protocolVersion, version } from '../version';\nimport { type ConnectionError, ConnectionErrorReason } from './errors';\nimport type LocalParticipant from './participant/LocalParticipant';\nimport type Participant from './participant/Participant';\nimport type RemoteParticipant from './participant/RemoteParticipant';\nimport CriticalTimers from './timers';\nimport type LocalAudioTrack from './track/LocalAudioTrack';\nimport type LocalTrack from './track/LocalTrack';\nimport type LocalTrackPublication from './track/LocalTrackPublication';\nimport type LocalVideoTrack from './track/LocalVideoTrack';\nimport type RemoteAudioTrack from './track/RemoteAudioTrack';\nimport type RemoteTrack from './track/RemoteTrack';\nimport type RemoteTrackPublication from './track/RemoteTrackPublication';\nimport type RemoteVideoTrack from './track/RemoteVideoTrack';\nimport { Track } from './track/Track';\nimport type { TrackPublication } from './track/TrackPublication';\nimport { type VideoCodec, videoCodecs } from './track/options';\nimport { getNewAudioContext } from './track/utils';\nimport type { ChatMessage, LiveKitReactNativeInfo, TranscriptionSegment } from './types';\n\nconst separator = '|';\nexport const ddExtensionURI =\n  'https://aomediacodec.github.io/av1-rtp-spec/#dependency-descriptor-rtp-header-extension';\n\nexport function unpackStreamId(packed: string): string[] {\n  const parts = packed.split(separator);\n  if (parts.length \u003e 1) {\n    return [parts[0], packed.substr(parts[0].length + 1)];\n  }\n  return [packed, ''];\n}\n\nexport async function sleep(duration: number): Promise\u003cvoid\u003e {\n  return new Promise((resolve) =\u003e CriticalTimers.setTimeout(resolve, duration));\n}\n\n/** @internal */\nexport function supportsTransceiver() {\n  return 'addTransceiver' in RTCPeerConnection.prototype;\n}\n\n/** @internal */\nexport function supportsAddTrack() {\n  return 'addTrack' in RTCPeerConnection.prototype;\n}\n\nexport function supportsAdaptiveStream() {\n  return typeof ResizeObserver !== undefined \u0026\u0026 typeof IntersectionObserver !== undefined;\n}\n\nexport function supportsDynacast() {\n  return supportsTransceiver();\n}\n\nexport function supportsAV1(): boolean {\n  if (!('getCapabilities' in RTCRtpSender)) {\n    return false;\n  }\n  if (isSafari() || isFireFox()) {\n    // Safari 17 on iPhone14 reports AV1 capability, but does not actually support it\n    // Firefox does support AV1, but SVC publishing is not supported\n    return false;\n  }\n  const capabilities = RTCRtpSender.getCapabilities('video');\n  let hasAV1 = false;\n  if (capabilities) {\n    for (const codec of capabilities.codecs) {\n      if (codec.mimeType === 'video/AV1') {\n        hasAV1 = true;\n        break;\n      }\n    }\n  }\n  return hasAV1;\n}\n\nexport function supportsVP9(): boolean {\n  if (!('getCapabilities' in RTCRtpSender)) {\n    return false;\n  }\n  if (isFireFox()) {\n    // technically speaking FireFox supports VP9, but SVC publishing is broken\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=1633876\n    return false;\n  }\n  if (isSafari()) {\n    const browser = getBrowser();\n    if (browser?.version \u0026\u0026 compareVersions(browser.version, '16') \u003c 0) {\n      // Safari 16 and below does not support VP9\n      return false;\n    }\n    if (\n      browser?.os === 'iOS' \u0026\u0026\n      browser?.osVersion \u0026\u0026\n      compareVersions(browser.osVersion, '16') \u003c 0\n    ) {\n      // Safari 16 and below on iOS does not support VP9 we need the iOS check to account for other browsers running webkit under the hood\n      return false;\n    }\n  }\n  const capabilities = RTCRtpSender.getCapabilities('video');\n  let hasVP9 = false;\n  if (capabilities) {\n    for (const codec of capabilities.codecs) {\n      if (codec.mimeType === 'video/VP9') {\n        hasVP9 = true;\n        break;\n      }\n    }\n  }\n  return hasVP9;\n}\n\nexport function supportsH265(): boolean {\n  if (!('getCapabilities' in RTCRtpSender)) {\n    return false;\n  }\n\n  const capabilities = RTCRtpSender.getCapabilities('video');\n  let hasH265 = false;\n  if (capabilities) {\n    for (const codec of capabilities.codecs) {\n      if (codec.mimeType === 'video/H265') {\n        hasH265 = true;\n        break;\n      }\n    }\n  }\n  return hasH265;\n}\n\nexport function isSVCCodec(codec?: string): boolean {\n  return codec === 'av1' || codec === 'vp9';\n}\n\nexport function supportsSetSinkId(elm?: HTMLMediaElement): boolean {\n  if (!document || isSafariBased()) {\n    return false;\n  }\n  if (!elm) {\n    elm = document.createElement('audio');\n  }\n  return 'setSinkId' in elm;\n}\n\nexport function isBrowserSupported() {\n  if (typeof RTCPeerConnection === 'undefined') {\n    return false;\n  }\n  return supportsTransceiver() || supportsAddTrack();\n}\n\nexport function isFireFox(): boolean {\n  return getBrowser()?.name === 'Firefox';\n}\n\nexport function isChromiumBased(): boolean {\n  return getBrowser()?.name === 'Chrome';\n}\n\nexport function isSafari(): boolean {\n  return getBrowser()?.name === 'Safari';\n}\n\nexport function isSafariBased(): boolean {\n  const b = getBrowser();\n  return b?.name === 'Safari' || b?.os === 'iOS';\n}\n\nexport function isSafari17Based(): boolean {\n  const b = getBrowser();\n  return (\n    (b?.name === 'Safari' \u0026\u0026 b.version.startsWith('17.')) ||\n    (b?.os === 'iOS' \u0026\u0026 !!b?.osVersion \u0026\u0026 compareVersions(b.osVersion, '17') \u003e= 0)\n  );\n}\n\nexport function isSafariSvcApi(browser?: BrowserDetails): boolean {\n  if (!browser) {\n    browser = getBrowser();\n  }\n  // Safari 18.4 requires legacy svc api and scaleResolutionDown to be set\n  return (\n    (browser?.name === 'Safari' \u0026\u0026 compareVersions(browser.version, '18.3') \u003e 0) ||\n    (browser?.os === 'iOS' \u0026\u0026\n      !!browser?.osVersion \u0026\u0026\n      compareVersions(browser.osVersion, '18.3') \u003e 0)\n  );\n}\n\nexport function isMobile(): boolean {\n  if (!isWeb()) return false;\n\n  return (\n    // @ts-expect-error `userAgentData` is not yet part of typescript\n    navigator.userAgentData?.mobile ??\n    /Tablet|iPad|Mobile|Android|BlackBerry/.test(navigator.userAgent)\n  );\n}\n\nexport function isE2EESimulcastSupported() {\n  const browser = getBrowser();\n  const supportedSafariVersion = '17.2'; // see https://bugs.webkit.org/show_bug.cgi?id=257803\n  if (browser) {\n    if (browser.name !== 'Safari' \u0026\u0026 browser.os !== 'iOS') {\n      return true;\n    } else if (\n      browser.os === 'iOS' \u0026\u0026\n      browser.osVersion \u0026\u0026\n      compareVersions(browser.osVersion, supportedSafariVersion) \u003e= 0\n    ) {\n      return true;\n    } else if (\n      browser.name === 'Safari' \u0026\u0026\n      compareVersions(browser.version, supportedSafariVersion) \u003e= 0\n    ) {\n      return true;\n    } else {\n      return false;\n    }\n  }\n}\n\nexport function isWeb(): boolean {\n  return typeof document !== 'undefined';\n}\n\nexport function isReactNative(): boolean {\n  // navigator.product is deprecated on browsers, but will be set appropriately for react-native.\n  return navigator.product == 'ReactNative';\n}\n\nexport function isCloud(serverUrl: URL) {\n  return (\n    serverUrl.hostname.endsWith('.livekit.cloud') || serverUrl.hostname.endsWith('.livekit.run')\n  );\n}\n\nfunction getLKReactNativeInfo(): LiveKitReactNativeInfo | undefined {\n  // global defined only for ReactNative.\n  // @ts-ignore\n  if (global \u0026\u0026 global.LiveKitReactNativeGlobal) {\n    // @ts-ignore\n    return global.LiveKitReactNativeGlobal as LiveKitReactNativeInfo;\n  }\n\n  return undefined;\n}\n\nexport function getReactNativeOs(): string | undefined {\n  if (!isReactNative()) {\n    return undefined;\n  }\n\n  let info = getLKReactNativeInfo();\n  if (info) {\n    return info.platform;\n  }\n\n  return undefined;\n}\n\nexport function getDevicePixelRatio(): number {\n  if (isWeb()) {\n    return window.devicePixelRatio;\n  }\n\n  if (isReactNative()) {\n    let info = getLKReactNativeInfo();\n    if (info) {\n      return info.devicePixelRatio;\n    }\n  }\n\n  return 1;\n}\n\n/**\n * @param v1 - The first version string to compare.\n * @param v2 - The second version string to compare.\n * @returns A number indicating the order of the versions:\n *   - 1 if v1 is greater than v2\n *   - -1 if v1 is less than v2\n *   - 0 if v1 and v2 are equal\n */\nexport function compareVersions(v1: string, v2: string): number {\n  const parts1 = v1.split('.');\n  const parts2 = v2.split('.');\n  const k = Math.min(parts1.length, parts2.length);\n  for (let i = 0; i \u003c k; ++i) {\n    const p1 = parseInt(parts1[i], 10);\n    const p2 = parseInt(parts2[i], 10);\n    if (p1 \u003e p2) return 1;\n    if (p1 \u003c p2) return -1;\n    if (i === k - 1 \u0026\u0026 p1 === p2) return 0;\n  }\n  if (v1 === '' \u0026\u0026 v2 !== '') {\n    return -1;\n  } else if (v2 === '') {\n    return 1;\n  }\n  return parts1.length == parts2.length ? 0 : parts1.length \u003c parts2.length ? -1 : 1;\n}\n\nfunction roDispatchCallback(entries: ResizeObserverEntry[]) {\n  for (const entry of entries) {\n    (entry.target as ObservableMediaElement).handleResize(entry);\n  }\n}\n\nfunction ioDispatchCallback(entries: IntersectionObserverEntry[]) {\n  for (const entry of entries) {\n    (entry.target as ObservableMediaElement).handleVisibilityChanged(entry);\n  }\n}\n\nlet resizeObserver: ResizeObserver | null = null;\nexport const getResizeObserver = () =\u003e {\n  if (!resizeObserver) resizeObserver = new ResizeObserver(roDispatchCallback);\n  return resizeObserver;\n};\n\nlet intersectionObserver: IntersectionObserver | null = null;\nexport const getIntersectionObserver = () =\u003e {\n  if (!intersectionObserver) {\n    intersectionObserver = new IntersectionObserver(ioDispatchCallback, {\n      root: null,\n      rootMargin: '0px',\n    });\n  }\n  return intersectionObserver;\n};\n\nexport interface ObservableMediaElement extends HTMLMediaElement {\n  handleResize: (entry: ResizeObserverEntry) =\u003e void;\n  handleVisibilityChanged: (entry: IntersectionObserverEntry) =\u003e void;\n}\n\nexport function getClientInfo(): ClientInfo {\n  const info = new ClientInfo({\n    sdk: ClientInfo_SDK.JS,\n    protocol: protocolVersion,\n    version,\n  });\n\n  if (isReactNative()) {\n    info.os = getReactNativeOs() ?? '';\n  }\n  return info;\n}\n\nlet emptyVideoStreamTrack: MediaStreamTrack | undefined;\n\nexport function getEmptyVideoStreamTrack() {\n  if (!emptyVideoStreamTrack) {\n    emptyVideoStreamTrack = createDummyVideoStreamTrack();\n  }\n  return emptyVideoStreamTrack.clone();\n}\n\nexport function createDummyVideoStreamTrack(\n  width: number = 16,\n  height: number = 16,\n  enabled: boolean = false,\n  paintContent: boolean = false,\n) {\n  const canvas = document.createElement('canvas');\n  // the canvas size is set to 16 by default, because electron apps seem to fail with smaller values\n  canvas.width = width;\n  canvas.height = height;\n  const ctx = canvas.getContext('2d');\n  ctx?.fillRect(0, 0, canvas.width, canvas.height);\n  if (paintContent \u0026\u0026 ctx) {\n    ctx.beginPath();\n    ctx.arc(width / 2, height / 2, 50, 0, Math.PI * 2, true);\n    ctx.closePath();\n    ctx.fillStyle = 'grey';\n    ctx.fill();\n  }\n  // @ts-ignore\n  const dummyStream = canvas.captureStream();\n  const [dummyTrack] = dummyStream.getTracks();\n  if (!dummyTrack) {\n    throw Error('Could not get empty media stream video track');\n  }\n  dummyTrack.enabled = enabled;\n\n  return dummyTrack;\n}\n\nlet emptyAudioStreamTrack: MediaStreamTrack | undefined;\n\nexport function getEmptyAudioStreamTrack() {\n  if (!emptyAudioStreamTrack) {\n    // implementation adapted from https://blog.mozilla.org/webrtc/warm-up-with-replacetrack/\n    const ctx = new AudioContext();\n    const oscillator = ctx.createOscillator();\n    const gain = ctx.createGain();\n    gain.gain.setValueAtTime(0, 0);\n    const dst = ctx.createMediaStreamDestination();\n    oscillator.connect(gain);\n    gain.connect(dst);\n    oscillator.start();\n    [emptyAudioStreamTrack] = dst.stream.getAudioTracks();\n    if (!emptyAudioStreamTrack) {\n      throw Error('Could not get empty media stream audio track');\n    }\n    emptyAudioStreamTrack.enabled = false;\n  }\n  return emptyAudioStreamTrack.clone();\n}\n\nexport class Future\u003cT\u003e {\n  promise: Promise\u003cT\u003e;\n\n  resolve?: (arg: T) =\u003e void;\n\n  reject?: (e: any) =\u003e void;\n\n  onFinally?: () =\u003e void;\n\n  get isResolved(): boolean {\n    return this._isResolved;\n  }\n\n  private _isResolved: boolean = false;\n\n  constructor(\n    futureBase?: (resolve: (arg: T) =\u003e void, reject: (e: any) =\u003e void) =\u003e void,\n    onFinally?: () =\u003e void,\n  ) {\n    this.onFinally = onFinally;\n    this.promise = new Promise\u003cT\u003e(async (resolve, reject) =\u003e {\n      this.resolve = resolve;\n      this.reject = reject;\n      if (futureBase) {\n        await futureBase(resolve, reject);\n      }\n    }).finally(() =\u003e {\n      this._isResolved = true;\n      this.onFinally?.();\n    });\n  }\n}\n\nexport type AudioAnalyserOptions = {\n  /**\n   * If set to true, the analyser will use a cloned version of the underlying mediastreamtrack, which won't be impacted by muting the track.\n   * Useful for local tracks when implementing things like \"seems like you're muted, but trying to speak\".\n   * Defaults to false\n   */\n  cloneTrack?: boolean;\n  /**\n   * see https://developer.mozilla.org/en-US/docs/Web/API/AnalyserNode/fftSize\n   */\n  fftSize?: number;\n  /**\n   * see https://developer.mozilla.org/en-US/docs/Web/API/AnalyserNode/smoothingTimeConstant\n   */\n  smoothingTimeConstant?: number;\n  /**\n   * see https://developer.mozilla.org/en-US/docs/Web/API/AnalyserNode/minDecibels\n   */\n  minDecibels?: number;\n  /**\n   * see https://developer.mozilla.org/en-US/docs/Web/API/AnalyserNode/maxDecibels\n   */\n  maxDecibels?: number;\n};\n\n/**\n * Creates and returns an analyser web audio node that is attached to the provided track.\n * Additionally returns a convenience method `calculateVolume` to perform instant volume readings on that track.\n * Call the returned `cleanup` function to close the audioContext that has been created for the instance of this helper\n */\nexport function createAudioAnalyser(\n  track: LocalAudioTrack | RemoteAudioTrack,\n  options?: AudioAnalyserOptions,\n) {\n  const opts = {\n    cloneTrack: false,\n    fftSize: 2048,\n    smoothingTimeConstant: 0.8,\n    minDecibels: -100,\n    maxDecibels: -80,\n    ...options,\n  };\n  const audioContext = getNewAudioContext();\n\n  if (!audioContext) {\n    throw new Error('Audio Context not supported on this browser');\n  }\n\n  const streamTrack = opts.cloneTrack ? track.mediaStreamTrack.clone() : track.mediaStreamTrack;\n  const mediaStreamSource = audioContext.createMediaStreamSource(new MediaStream([streamTrack]));\n  const analyser = audioContext.createAnalyser();\n  analyser.minDecibels = opts.minDecibels;\n  analyser.maxDecibels = opts.maxDecibels;\n  analyser.fftSize = opts.fftSize;\n  analyser.smoothingTimeConstant = opts.smoothingTimeConstant;\n\n  mediaStreamSource.connect(analyser);\n  const dataArray = new Uint8Array(analyser.frequencyBinCount);\n\n  /**\n   * Calculates the current volume of the track in the range from 0 to 1\n   */\n  const calculateVolume = () =\u003e {\n    analyser.getByteFrequencyData(dataArray);\n    let sum = 0;\n    for (const amplitude of dataArray) {\n      sum += Math.pow(amplitude / 255, 2);\n    }\n    const volume = Math.sqrt(sum / dataArray.length);\n    return volume;\n  };\n\n  const cleanup = async () =\u003e {\n    await audioContext.close();\n    if (opts.cloneTrack) {\n      streamTrack.stop();\n    }\n  };\n\n  return { calculateVolume, analyser, cleanup };\n}\n\nexport function isVideoCodec(maybeCodec: string): maybeCodec is VideoCodec {\n  return videoCodecs.includes(maybeCodec as VideoCodec);\n}\n\nexport function unwrapConstraint(constraint: ConstrainDOMString): string;\nexport function unwrapConstraint(constraint: ConstrainULong): number;\nexport function unwrapConstraint(constraint: ConstrainDOMString | ConstrainULong): string | number {\n  if (typeof constraint === 'string' || typeof constraint === 'number') {\n    return constraint;\n  }\n\n  if (Array.isArray(constraint)) {\n    return constraint[0];\n  }\n  if (constraint.exact !== undefined) {\n    if (Array.isArray(constraint.exact)) {\n      return constraint.exact[0];\n    }\n    return constraint.exact;\n  }\n  if (constraint.ideal !== undefined) {\n    if (Array.isArray(constraint.ideal)) {\n      return constraint.ideal[0];\n    }\n    return constraint.ideal;\n  }\n  throw Error('could not unwrap constraint');\n}\n\nexport function toWebsocketUrl(url: string): string {\n  if (url.startsWith('http')) {\n    return url.replace(/^(http)/, 'ws');\n  }\n  return url;\n}\n\nexport function toHttpUrl(url: string): string {\n  if (url.startsWith('ws')) {\n    return url.replace(/^(ws)/, 'http');\n  }\n  return url;\n}\n\nexport function extractTranscriptionSegments(\n  transcription: TranscriptionModel,\n  firstReceivedTimesMap: Map\u003cstring, number\u003e,\n): TranscriptionSegment[] {\n  return transcription.segments.map(({ id, text, language, startTime, endTime, final }) =\u003e {\n    const firstReceivedTime = firstReceivedTimesMap.get(id) ?? Date.now();\n    const lastReceivedTime = Date.now();\n    if (final) {\n      firstReceivedTimesMap.delete(id);\n    } else {\n      firstReceivedTimesMap.set(id, firstReceivedTime);\n    }\n    return {\n      id,\n      text,\n      startTime: Number.parseInt(startTime.toString()),\n      endTime: Number.parseInt(endTime.toString()),\n      final,\n      language,\n      firstReceivedTime,\n      lastReceivedTime,\n    };\n  });\n}\n\nexport function extractChatMessage(msg: ChatMessageModel): ChatMessage {\n  const { id, timestamp, message, editTimestamp } = msg;\n  return {\n    id,\n    timestamp: Number.parseInt(timestamp.toString()),\n    editTimestamp: editTimestamp ? Number.parseInt(editTimestamp.toString()) : undefined,\n    message,\n  };\n}\n\nexport function getDisconnectReasonFromConnectionError(e: ConnectionError) {\n  switch (e.reason) {\n    case ConnectionErrorReason.LeaveRequest:\n      return e.context as DisconnectReason;\n    case ConnectionErrorReason.Cancelled:\n      return DisconnectReason.CLIENT_INITIATED;\n    case ConnectionErrorReason.NotAllowed:\n      return DisconnectReason.USER_REJECTED;\n    case ConnectionErrorReason.ServerUnreachable:\n      return DisconnectReason.JOIN_FAILURE;\n    default:\n      return DisconnectReason.UNKNOWN_REASON;\n  }\n}\n\n/** convert bigints to numbers preserving undefined values */\nexport function bigIntToNumber\u003cT extends BigInt | undefined\u003e(\n  value: T,\n): T extends BigInt ? number : undefined {\n  return (value !== undefined ? Number(value) : undefined) as T extends BigInt ? number : undefined;\n}\n\n/** convert numbers to bigints preserving undefined values */\nexport function numberToBigInt\u003cT extends number | undefined\u003e(\n  value: T,\n): T extends number ? bigint : undefined {\n  return (value !== undefined ? BigInt(value) : undefined) as T extends number ? bigint : undefined;\n}\n\nexport function isLocalTrack(track: Track | MediaStreamTrack | undefined): track is LocalTrack {\n  return !!track \u0026\u0026 !(track instanceof MediaStreamTrack) \u0026\u0026 track.isLocal;\n}\n\nexport function isAudioTrack(\n  track: Track | undefined,\n): track is LocalAudioTrack | RemoteAudioTrack {\n  return !!track \u0026\u0026 track.kind == Track.Kind.Audio;\n}\n\nexport function isVideoTrack(\n  track: Track | undefined,\n): track is LocalVideoTrack | RemoteVideoTrack {\n  return !!track \u0026\u0026 track.kind == Track.Kind.Video;\n}\n\nexport function isLocalVideoTrack(\n  track: Track | MediaStreamTrack | undefined,\n): track is LocalVideoTrack {\n  return isLocalTrack(track) \u0026\u0026 isVideoTrack(track);\n}\n\nexport function isLocalAudioTrack(\n  track: Track | MediaStreamTrack | undefined,\n): track is LocalAudioTrack {\n  return isLocalTrack(track) \u0026\u0026 isAudioTrack(track);\n}\n\nexport function isRemoteTrack(track: Track | undefined): track is RemoteTrack {\n  return !!track \u0026\u0026 !track.isLocal;\n}\n\nexport function isRemotePub(pub: TrackPublication | undefined): pub is RemoteTrackPublication {\n  return !!pub \u0026\u0026 !pub.isLocal;\n}\n\nexport function isLocalPub(pub: TrackPublication | undefined): pub is LocalTrackPublication {\n  return !!pub \u0026\u0026 !pub.isLocal;\n}\n\nexport function isRemoteVideoTrack(track: Track | undefined): track is RemoteVideoTrack {\n  return isRemoteTrack(track) \u0026\u0026 isVideoTrack(track);\n}\n\nexport function isLocalParticipant(p: Participant): p is LocalParticipant {\n  return p.isLocal;\n}\n\nexport function isRemoteParticipant(p: Participant): p is RemoteParticipant {\n  return !p.isLocal;\n}\n\nexport function splitUtf8(s: string, n: number): Uint8Array[] {\n  if (n \u003c 4) {\n    throw new Error('n must be at least 4 due to utf8 encoding rules');\n  }\n  // adapted from https://stackoverflow.com/a/6043797\n  const result: Uint8Array[] = [];\n  let encoded = new TextEncoder().encode(s);\n  while (encoded.length \u003e n) {\n    let k = n;\n    while (k \u003e 0) {\n      const byte = encoded[k];\n      if (byte !== undefined \u0026\u0026 (byte \u0026 0xc0) !== 0x80) {\n        break;\n      }\n      k--;\n    }\n    result.push(encoded.slice(0, k));\n    encoded = encoded.slice(k);\n  }\n  if (encoded.length \u003e 0) {\n    result.push(encoded);\n  }\n  return result;\n}\n","import { TrackInfo, TrackPublishedResponse, TrackSource, VideoQuality } from '@livekit/protocol';\nimport type { AudioProcessorOptions, TrackProcessor, VideoProcessorOptions } from '../..';\nimport { cloneDeep } from '../../utils/cloneDeep';\nimport { isSafari, sleep } from '../utils';\nimport { Track } from './Track';\nimport type { TrackPublication } from './TrackPublication';\nimport {\n  type AudioCaptureOptions,\n  type CreateLocalTracksOptions,\n  type ScreenShareCaptureOptions,\n  type VideoCaptureOptions,\n  type VideoCodec,\n} from './options';\nimport type { AudioTrack } from './types';\n\nexport function mergeDefaultOptions(\n  options?: CreateLocalTracksOptions,\n  audioDefaults?: AudioCaptureOptions,\n  videoDefaults?: VideoCaptureOptions,\n): CreateLocalTracksOptions {\n  const { optionsWithoutProcessor, audioProcessor, videoProcessor } = extractProcessorsFromOptions(\n    options ?? {},\n  );\n  const defaultAudioProcessor = audioDefaults?.processor;\n  const defaultVideoProcessor = videoDefaults?.processor;\n  const clonedOptions: CreateLocalTracksOptions = optionsWithoutProcessor ?? {};\n  if (clonedOptions.audio === true) clonedOptions.audio = {};\n  if (clonedOptions.video === true) clonedOptions.video = {};\n\n  // use defaults\n  if (clonedOptions.audio) {\n    mergeObjectWithoutOverwriting(\n      clonedOptions.audio as Record\u003cstring, unknown\u003e,\n      audioDefaults as Record\u003cstring, unknown\u003e,\n    );\n    clonedOptions.audio.deviceId ??= { ideal: 'default' };\n    if (audioProcessor || defaultAudioProcessor) {\n      clonedOptions.audio.processor = audioProcessor ?? defaultAudioProcessor;\n    }\n  }\n  if (clonedOptions.video) {\n    mergeObjectWithoutOverwriting(\n      clonedOptions.video as Record\u003cstring, unknown\u003e,\n      videoDefaults as Record\u003cstring, unknown\u003e,\n    );\n    clonedOptions.video.deviceId ??= { ideal: 'default' };\n    if (videoProcessor || defaultVideoProcessor) {\n      clonedOptions.video.processor = videoProcessor ?? defaultVideoProcessor;\n    }\n  }\n  return clonedOptions;\n}\n\nfunction mergeObjectWithoutOverwriting(\n  mainObject: Record\u003cstring, unknown\u003e,\n  objectToMerge: Record\u003cstring, unknown\u003e,\n): Record\u003cstring, unknown\u003e {\n  Object.keys(objectToMerge).forEach((key) =\u003e {\n    if (mainObject[key] === undefined) mainObject[key] = objectToMerge[key];\n  });\n  return mainObject;\n}\n\nexport function constraintsForOptions(options: CreateLocalTracksOptions): MediaStreamConstraints {\n  const constraints: MediaStreamConstraints = {};\n\n  if (options.video) {\n    // default video options\n    if (typeof options.video === 'object') {\n      const videoOptions: MediaTrackConstraints = {};\n      const target = videoOptions as Record\u003cstring, unknown\u003e;\n      const source = options.video as Record\u003cstring, unknown\u003e;\n      Object.keys(source).forEach((key) =\u003e {\n        switch (key) {\n          case 'resolution':\n            // flatten VideoResolution fields\n            mergeObjectWithoutOverwriting(target, source.resolution as Record\u003cstring, unknown\u003e);\n            break;\n          default:\n            target[key] = source[key];\n        }\n      });\n      constraints.video = videoOptions;\n      constraints.video.deviceId ??= { ideal: 'default' };\n    } else {\n      constraints.video = options.video ? { deviceId: { ideal: 'default' } } : false;\n    }\n  } else {\n    constraints.video = false;\n  }\n\n  if (options.audio) {\n    if (typeof options.audio === 'object') {\n      constraints.audio = options.audio;\n      constraints.audio.deviceId ??= { ideal: 'default' };\n    } else {\n      constraints.audio = { deviceId: { ideal: 'default' } };\n    }\n  } else {\n    constraints.audio = false;\n  }\n  return constraints;\n}\n/**\n * This function detects silence on a given [[Track]] instance.\n * Returns true if the track seems to be entirely silent.\n */\nexport async function detectSilence(track: AudioTrack, timeOffset = 200): Promise\u003cboolean\u003e {\n  const ctx = getNewAudioContext();\n  if (ctx) {\n    const analyser = ctx.createAnalyser();\n    analyser.fftSize = 2048;\n\n    const bufferLength = analyser.frequencyBinCount;\n    const dataArray = new Uint8Array(bufferLength);\n    const source = ctx.createMediaStreamSource(new MediaStream([track.mediaStreamTrack]));\n\n    source.connect(analyser);\n    await sleep(timeOffset);\n    analyser.getByteTimeDomainData(dataArray);\n    const someNoise = dataArray.some((sample) =\u003e sample !== 128 \u0026\u0026 sample !== 0);\n    ctx.close();\n    return !someNoise;\n  }\n  return false;\n}\n\n/**\n * @internal\n */\nexport function getNewAudioContext(): AudioContext | void {\n  const AudioContext =\n    // @ts-ignore\n    typeof window !== 'undefined' \u0026\u0026 (window.AudioContext || window.webkitAudioContext);\n  if (AudioContext) {\n    const audioContext = new AudioContext({ latencyHint: 'interactive' });\n    // If the audio context is suspended, we need to resume it when the user clicks on the page\n    if (\n      audioContext.state === 'suspended' \u0026\u0026\n      typeof window !== 'undefined' \u0026\u0026\n      window.document?.body\n    ) {\n      const handleResume = async () =\u003e {\n        try {\n          if (audioContext.state === 'suspended') {\n            await audioContext.resume();\n          }\n        } catch (e) {\n          console.warn('Error trying to auto-resume audio context', e);\n        }\n\n        window.document.body?.removeEventListener('click', handleResume);\n      };\n      window.document.body.addEventListener('click', handleResume);\n    }\n    return audioContext;\n  }\n}\n\n/**\n * @internal\n */\nexport function kindToSource(kind: MediaDeviceKind) {\n  if (kind === 'audioinput') {\n    return Track.Source.Microphone;\n  } else if (kind === 'videoinput') {\n    return Track.Source.Camera;\n  } else {\n    return Track.Source.Unknown;\n  }\n}\n\n/**\n * @internal\n */\nexport function sourceToKind(source: Track.Source): MediaDeviceKind | undefined {\n  if (source === Track.Source.Microphone) {\n    return 'audioinput';\n  } else if (source === Track.Source.Camera) {\n    return 'videoinput';\n  } else {\n    return undefined;\n  }\n}\n\n/**\n * @internal\n */\nexport function screenCaptureToDisplayMediaStreamOptions(\n  options: ScreenShareCaptureOptions,\n): DisplayMediaStreamOptions {\n  let videoConstraints: MediaTrackConstraints | boolean = options.video ?? true;\n  // treat 0 as uncapped\n  if (options.resolution \u0026\u0026 options.resolution.width \u003e 0 \u0026\u0026 options.resolution.height \u003e 0) {\n    videoConstraints = typeof videoConstraints === 'boolean' ? {} : videoConstraints;\n    if (isSafari()) {\n      videoConstraints = {\n        ...videoConstraints,\n        width: { max: options.resolution.width },\n        height: { max: options.resolution.height },\n        frameRate: options.resolution.frameRate,\n      };\n    } else {\n      videoConstraints = {\n        ...videoConstraints,\n        width: { ideal: options.resolution.width },\n        height: { ideal: options.resolution.height },\n        frameRate: options.resolution.frameRate,\n      };\n    }\n  }\n\n  return {\n    audio: options.audio ?? false,\n    video: videoConstraints,\n    // @ts-expect-error support for experimental display media features\n    controller: options.controller,\n    selfBrowserSurface: options.selfBrowserSurface,\n    surfaceSwitching: options.surfaceSwitching,\n    systemAudio: options.systemAudio,\n    preferCurrentTab: options.preferCurrentTab,\n  };\n}\n\nexport function mimeTypeToVideoCodecString(mimeType: string) {\n  return mimeType.split('/')[1].toLowerCase() as VideoCodec;\n}\n\nexport function getTrackPublicationInfo\u003cT extends TrackPublication\u003e(\n  tracks: T[],\n): TrackPublishedResponse[] {\n  const infos: TrackPublishedResponse[] = [];\n  tracks.forEach((track: TrackPublication) =\u003e {\n    if (track.track !== undefined) {\n      infos.push(\n        new TrackPublishedResponse({\n          cid: track.track.mediaStreamID,\n          track: track.trackInfo,\n        }),\n      );\n    }\n  });\n  return infos;\n}\n\nexport function getLogContextFromTrack(track: Track | TrackPublication): Record\u003cstring, unknown\u003e {\n  if ('mediaStreamTrack' in track) {\n    return {\n      trackID: track.sid,\n      source: track.source,\n      muted: track.isMuted,\n      enabled: track.mediaStreamTrack.enabled,\n      kind: track.kind,\n      streamID: track.mediaStreamID,\n      streamTrackID: track.mediaStreamTrack.id,\n    };\n  } else {\n    return {\n      trackID: track.trackSid,\n      enabled: track.isEnabled,\n      muted: track.isMuted,\n      trackInfo: {\n        mimeType: track.mimeType,\n        name: track.trackName,\n        encrypted: track.isEncrypted,\n        kind: track.kind,\n        source: track.source,\n        ...(track.track ? getLogContextFromTrack(track.track) : {}),\n      },\n    };\n  }\n}\n\nexport function supportsSynchronizationSources(): boolean {\n  return typeof RTCRtpReceiver !== 'undefined' \u0026\u0026 'getSynchronizationSources' in RTCRtpReceiver;\n}\n\nexport function diffAttributes(\n  oldValues: Record\u003cstring, string\u003e | undefined,\n  newValues: Record\u003cstring, string\u003e | undefined,\n) {\n  if (oldValues === undefined) {\n    oldValues = {};\n  }\n  if (newValues === undefined) {\n    newValues = {};\n  }\n  const allKeys = [...Object.keys(newValues), ...Object.keys(oldValues)];\n  const diff: Record\u003cstring, string\u003e = {};\n\n  for (const key of allKeys) {\n    if (oldValues[key] !== newValues[key]) {\n      diff[key] = newValues[key] ?? '';\n    }\n  }\n\n  return diff;\n}\n\n/** @internal */\nexport function extractProcessorsFromOptions(options: CreateLocalTracksOptions) {\n  const newOptions = { ...options };\n  let audioProcessor: TrackProcessor\u003cTrack.Kind.Audio, AudioProcessorOptions\u003e | undefined;\n  let videoProcessor: TrackProcessor\u003cTrack.Kind.Video, VideoProcessorOptions\u003e | undefined;\n\n  if (typeof newOptions.audio === 'object' \u0026\u0026 newOptions.audio.processor) {\n    audioProcessor = newOptions.audio.processor;\n    newOptions.audio = { ...newOptions.audio, processor: undefined };\n  }\n  if (typeof newOptions.video === 'object' \u0026\u0026 newOptions.video.processor) {\n    videoProcessor = newOptions.video.processor;\n    newOptions.video = { ...newOptions.video, processor: undefined };\n  }\n\n  return { audioProcessor, videoProcessor, optionsWithoutProcessor: cloneDeep(newOptions) };\n}\n\nexport function getTrackSourceFromProto(source: TrackSource): Track.Source {\n  switch (source) {\n    case TrackSource.CAMERA:\n      return Track.Source.Camera;\n    case TrackSource.MICROPHONE:\n      return Track.Source.Microphone;\n    case TrackSource.SCREEN_SHARE:\n      return Track.Source.ScreenShare;\n    case TrackSource.SCREEN_SHARE_AUDIO:\n      return Track.Source.ScreenShareAudio;\n    default:\n      return Track.Source.Unknown;\n  }\n}\n\nexport function areDimensionsSmaller(a: Track.Dimensions, b: Track.Dimensions): boolean {\n  return a.width * a.height \u003c b.width * b.height;\n}\n\nexport function layerDimensionsFor(\n  trackInfo: TrackInfo,\n  quality: VideoQuality,\n): Track.Dimensions | undefined {\n  return trackInfo.layers?.find((l) =\u003e l.quality === quality);\n}\n","import { Encryption_Type, TrackInfo } from '@livekit/protocol';\nimport { EventEmitter } from 'events';\nimport type TypedEventEmitter from 'typed-emitter';\nimport log, { LogLevel, workerLogger } from '../logger';\nimport type RTCEngine from '../room/RTCEngine';\nimport type Room from '../room/Room';\nimport { ConnectionState } from '../room/Room';\nimport { DeviceUnsupportedError } from '../room/errors';\nimport { EngineEvent, ParticipantEvent, RoomEvent } from '../room/events';\nimport type RemoteTrack from '../room/track/RemoteTrack';\nimport type { Track } from '../room/track/Track';\nimport type { VideoCodec } from '../room/track/options';\nimport { mimeTypeToVideoCodecString } from '../room/track/utils';\nimport { isLocalTrack, isSafariBased, isVideoTrack } from '../room/utils';\nimport type { BaseKeyProvider } from './KeyProvider';\nimport { E2EE_FLAG } from './constants';\nimport { type E2EEManagerCallbacks, EncryptionEvent, KeyProviderEvent } from './events';\nimport type {\n  E2EEManagerOptions,\n  E2EEWorkerMessage,\n  EnableMessage,\n  EncodeMessage,\n  InitMessage,\n  KeyInfo,\n  RTPVideoMapMessage,\n  RatchetRequestMessage,\n  RemoveTransformMessage,\n  ScriptTransformOptions,\n  SetKeyMessage,\n  SifTrailerMessage,\n  UpdateCodecMessage,\n} from './types';\nimport { isE2EESupported, isScriptTransformSupported } from './utils';\n\nexport interface BaseE2EEManager {\n  setup(room: Room): void;\n  setupEngine(engine: RTCEngine): void;\n  setParticipantCryptorEnabled(enabled: boolean, participantIdentity: string): void;\n  setSifTrailer(trailer: Uint8Array): void;\n  on\u003cE extends keyof E2EEManagerCallbacks\u003e(event: E, listener: E2EEManagerCallbacks[E]): this;\n}\n\n/**\n * @experimental\n */\nexport class E2EEManager\n  extends (EventEmitter as new () =\u003e TypedEventEmitter\u003cE2EEManagerCallbacks\u003e)\n  implements BaseE2EEManager\n{\n  protected worker: Worker;\n\n  protected room?: Room;\n\n  private encryptionEnabled: boolean;\n\n  private keyProvider: BaseKeyProvider;\n\n  constructor(options: E2EEManagerOptions) {\n    super();\n    this.keyProvider = options.keyProvider;\n    this.worker = options.worker;\n    this.encryptionEnabled = false;\n  }\n\n  /**\n   * @internal\n   */\n  setup(room: Room) {\n    if (!isE2EESupported()) {\n      throw new DeviceUnsupportedError(\n        'tried to setup end-to-end encryption on an unsupported browser',\n      );\n    }\n    log.info('setting up e2ee');\n    if (room !== this.room) {\n      this.room = room;\n      this.setupEventListeners(room, this.keyProvider);\n      // this.worker = new Worker('');\n      const msg: InitMessage = {\n        kind: 'init',\n        data: {\n          keyProviderOptions: this.keyProvider.getOptions(),\n          loglevel: workerLogger.getLevel() as LogLevel,\n        },\n      };\n      if (this.worker) {\n        log.info(`initializing worker`, { worker: this.worker });\n        this.worker.onmessage = this.onWorkerMessage;\n        this.worker.onerror = this.onWorkerError;\n        this.worker.postMessage(msg);\n      }\n    }\n  }\n\n  /**\n   * @internal\n   */\n  setParticipantCryptorEnabled(enabled: boolean, participantIdentity: string) {\n    log.debug(`set e2ee to ${enabled} for participant ${participantIdentity}`);\n    this.postEnable(enabled, participantIdentity);\n  }\n\n  /**\n   * @internal\n   */\n  setSifTrailer(trailer: Uint8Array) {\n    if (!trailer || trailer.length === 0) {\n      log.warn(\"ignoring server sent trailer as it's empty\");\n    } else {\n      this.postSifTrailer(trailer);\n    }\n  }\n\n  private onWorkerMessage = (ev: MessageEvent\u003cE2EEWorkerMessage\u003e) =\u003e {\n    const { kind, data } = ev.data;\n    switch (kind) {\n      case 'error':\n        log.error(data.error.message);\n        this.emit(EncryptionEvent.EncryptionError, data.error);\n        break;\n      case 'initAck':\n        if (data.enabled) {\n          this.keyProvider.getKeys().forEach((keyInfo) =\u003e {\n            this.postKey(keyInfo);\n          });\n        }\n        break;\n\n      case 'enable':\n        if (data.enabled) {\n          this.keyProvider.getKeys().forEach((keyInfo) =\u003e {\n            this.postKey(keyInfo);\n          });\n        }\n        if (\n          this.encryptionEnabled !== data.enabled \u0026\u0026\n          data.participantIdentity === this.room?.localParticipant.identity\n        ) {\n          this.emit(\n            EncryptionEvent.ParticipantEncryptionStatusChanged,\n            data.enabled,\n            this.room!.localParticipant,\n          );\n          this.encryptionEnabled = data.enabled;\n        } else if (data.participantIdentity) {\n          const participant = this.room?.getParticipantByIdentity(data.participantIdentity);\n          if (!participant) {\n            throw TypeError(\n              `couldn't set encryption status, participant not found${data.participantIdentity}`,\n            );\n          }\n          this.emit(EncryptionEvent.ParticipantEncryptionStatusChanged, data.enabled, participant);\n        }\n        break;\n      case 'ratchetKey':\n        this.keyProvider.emit(\n          KeyProviderEvent.KeyRatcheted,\n          data.ratchetResult,\n          data.participantIdentity,\n          data.keyIndex,\n        );\n        break;\n      default:\n        break;\n    }\n  };\n\n  private onWorkerError = (ev: ErrorEvent) =\u003e {\n    log.error('e2ee worker encountered an error:', { error: ev.error });\n    this.emit(EncryptionEvent.EncryptionError, ev.error);\n  };\n\n  public setupEngine(engine: RTCEngine) {\n    engine.on(EngineEvent.RTPVideoMapUpdate, (rtpMap) =\u003e {\n      this.postRTPMap(rtpMap);\n    });\n  }\n\n  private setupEventListeners(room: Room, keyProvider: BaseKeyProvider) {\n    room.on(RoomEvent.TrackPublished, (pub, participant) =\u003e\n      this.setParticipantCryptorEnabled(\n        pub.trackInfo!.encryption !== Encryption_Type.NONE,\n        participant.identity,\n      ),\n    );\n    room\n      .on(RoomEvent.ConnectionStateChanged, (state) =\u003e {\n        if (state === ConnectionState.Connected) {\n          room.remoteParticipants.forEach((participant) =\u003e {\n            participant.trackPublications.forEach((pub) =\u003e {\n              this.setParticipantCryptorEnabled(\n                pub.trackInfo!.encryption !== Encryption_Type.NONE,\n                participant.identity,\n              );\n            });\n          });\n        }\n      })\n      .on(RoomEvent.TrackUnsubscribed, (track, _, participant) =\u003e {\n        const msg: RemoveTransformMessage = {\n          kind: 'removeTransform',\n          data: {\n            participantIdentity: participant.identity,\n            trackId: track.mediaStreamID,\n          },\n        };\n        this.worker?.postMessage(msg);\n      })\n      .on(RoomEvent.TrackSubscribed, (track, pub, participant) =\u003e {\n        this.setupE2EEReceiver(track, participant.identity, pub.trackInfo);\n      })\n      .on(RoomEvent.SignalConnected, () =\u003e {\n        if (!this.room) {\n          throw new TypeError(`expected room to be present on signal connect`);\n        }\n        keyProvider.getKeys().forEach((keyInfo) =\u003e {\n          this.postKey(keyInfo);\n        });\n        this.setParticipantCryptorEnabled(\n          this.room.localParticipant.isE2EEEnabled,\n          this.room.localParticipant.identity,\n        );\n      });\n\n    room.localParticipant.on(ParticipantEvent.LocalSenderCreated, async (sender, track) =\u003e {\n      this.setupE2EESender(track, sender);\n    });\n\n    room.localParticipant.on(ParticipantEvent.LocalTrackPublished, (publication) =\u003e {\n      // Safari doesn't support retrieving payload information on RTCEncodedVideoFrame, so we need to update the codec manually once we have the trackInfo from the server\n      if (!isVideoTrack(publication.track) || !isSafariBased()) {\n        return;\n      }\n      const msg: UpdateCodecMessage = {\n        kind: 'updateCodec',\n        data: {\n          trackId: publication.track!.mediaStreamID,\n          codec: mimeTypeToVideoCodecString(publication.trackInfo!.codecs[0].mimeType),\n          participantIdentity: this.room!.localParticipant.identity,\n        },\n      };\n\n      this.worker.postMessage(msg);\n    });\n\n    keyProvider\n      .on(KeyProviderEvent.SetKey, (keyInfo) =\u003e this.postKey(keyInfo))\n      .on(KeyProviderEvent.RatchetRequest, (participantId, keyIndex) =\u003e\n        this.postRatchetRequest(participantId, keyIndex),\n      );\n  }\n\n  private postRatchetRequest(participantIdentity?: string, keyIndex?: number) {\n    if (!this.worker) {\n      throw Error('could not ratchet key, worker is missing');\n    }\n    const msg: RatchetRequestMessage = {\n      kind: 'ratchetRequest',\n      data: {\n        participantIdentity: participantIdentity,\n        keyIndex,\n      },\n    };\n    this.worker.postMessage(msg);\n  }\n\n  private postKey({ key, participantIdentity, keyIndex }: KeyInfo) {\n    if (!this.worker) {\n      throw Error('could not set key, worker is missing');\n    }\n    const msg: SetKeyMessage = {\n      kind: 'setKey',\n      data: {\n        participantIdentity: participantIdentity,\n        isPublisher: participantIdentity === this.room?.localParticipant.identity,\n        key,\n        keyIndex,\n      },\n    };\n    this.worker.postMessage(msg);\n  }\n\n  private postEnable(enabled: boolean, participantIdentity: string) {\n    if (this.worker) {\n      const enableMsg: EnableMessage = {\n        kind: 'enable',\n        data: {\n          enabled,\n          participantIdentity,\n        },\n      };\n      this.worker.postMessage(enableMsg);\n    } else {\n      throw new ReferenceError('failed to enable e2ee, worker is not ready');\n    }\n  }\n\n  private postRTPMap(map: Map\u003cnumber, VideoCodec\u003e) {\n    if (!this.worker) {\n      throw TypeError('could not post rtp map, worker is missing');\n    }\n    if (!this.room?.localParticipant.identity) {\n      throw TypeError('could not post rtp map, local participant identity is missing');\n    }\n    const msg: RTPVideoMapMessage = {\n      kind: 'setRTPMap',\n      data: {\n        map,\n        participantIdentity: this.room.localParticipant.identity,\n      },\n    };\n    this.worker.postMessage(msg);\n  }\n\n  private postSifTrailer(trailer: Uint8Array) {\n    if (!this.worker) {\n      throw Error('could not post SIF trailer, worker is missing');\n    }\n    const msg: SifTrailerMessage = {\n      kind: 'setSifTrailer',\n      data: {\n        trailer,\n      },\n    };\n    this.worker.postMessage(msg);\n  }\n\n  private setupE2EEReceiver(track: RemoteTrack, remoteId: string, trackInfo?: TrackInfo) {\n    if (!track.receiver) {\n      return;\n    }\n    if (!trackInfo?.mimeType || trackInfo.mimeType === '') {\n      throw new TypeError('MimeType missing from trackInfo, cannot set up E2EE cryptor');\n    }\n    this.handleReceiver(\n      track.receiver,\n      track.mediaStreamID,\n      remoteId,\n      track.kind === 'video' ? mimeTypeToVideoCodecString(trackInfo.mimeType) : undefined,\n    );\n  }\n\n  private setupE2EESender(track: Track, sender: RTCRtpSender) {\n    if (!isLocalTrack(track) || !sender) {\n      if (!sender) log.warn('early return because sender is not ready');\n      return;\n    }\n    this.handleSender(sender, track.mediaStreamID, undefined);\n  }\n\n  /**\n   * Handles the given {@code RTCRtpReceiver} by creating a {@code TransformStream} which will inject\n   * a frame decoder.\n   *\n   */\n  private async handleReceiver(\n    receiver: RTCRtpReceiver,\n    trackId: string,\n    participantIdentity: string,\n    codec?: VideoCodec,\n  ) {\n    if (!this.worker) {\n      return;\n    }\n\n    if (isScriptTransformSupported()) {\n      const options: ScriptTransformOptions = {\n        kind: 'decode',\n        participantIdentity,\n        trackId,\n        codec,\n      };\n      // @ts-ignore\n      receiver.transform = new RTCRtpScriptTransform(this.worker, options);\n    } else {\n      if (E2EE_FLAG in receiver \u0026\u0026 codec) {\n        // only update codec\n        const msg: UpdateCodecMessage = {\n          kind: 'updateCodec',\n          data: {\n            trackId,\n            codec,\n            participantIdentity: participantIdentity,\n          },\n        };\n        this.worker.postMessage(msg);\n        return;\n      }\n      // @ts-ignore\n      let writable: WritableStream = receiver.writableStream;\n      // @ts-ignore\n      let readable: ReadableStream = receiver.readableStream;\n\n      if (!writable || !readable) {\n        // @ts-ignore\n        const receiverStreams = receiver.createEncodedStreams();\n        // @ts-ignore\n        receiver.writableStream = receiverStreams.writable;\n        writable = receiverStreams.writable;\n        // @ts-ignore\n        receiver.readableStream = receiverStreams.readable;\n        readable = receiverStreams.readable;\n      }\n\n      const msg: EncodeMessage = {\n        kind: 'decode',\n        data: {\n          readableStream: readable,\n          writableStream: writable,\n          trackId: trackId,\n          codec,\n          participantIdentity: participantIdentity,\n          isReuse: E2EE_FLAG in receiver,\n        },\n      };\n      this.worker.postMessage(msg, [readable, writable]);\n    }\n\n    // @ts-ignore\n    receiver[E2EE_FLAG] = true;\n  }\n\n  /**\n   * Handles the given {@code RTCRtpSender} by creating a {@code TransformStream} which will inject\n   * a frame encoder.\n   *\n   */\n  private handleSender(sender: RTCRtpSender, trackId: string, codec?: VideoCodec) {\n    if (E2EE_FLAG in sender || !this.worker) {\n      return;\n    }\n\n    if (!this.room?.localParticipant.identity || this.room.localParticipant.identity === '') {\n      throw TypeError('local identity needs to be known in order to set up encrypted sender');\n    }\n\n    if (isScriptTransformSupported()) {\n      log.info('initialize script transform');\n      const options = {\n        kind: 'encode',\n        participantIdentity: this.room.localParticipant.identity,\n        trackId,\n        codec,\n      };\n      // @ts-ignore\n      sender.transform = new RTCRtpScriptTransform(this.worker, options);\n    } else {\n      log.info('initialize encoded streams');\n      // @ts-ignore\n      const senderStreams = sender.createEncodedStreams();\n      const msg: EncodeMessage = {\n        kind: 'encode',\n        data: {\n          readableStream: senderStreams.readable,\n          writableStream: senderStreams.writable,\n          codec,\n          trackId,\n          participantIdentity: this.room.localParticipant.identity,\n          isReuse: false,\n        },\n      };\n      this.worker.postMessage(msg, [senderStreams.readable, senderStreams.writable]);\n    }\n\n    // @ts-ignore\n    sender[E2EE_FLAG] = true;\n  }\n}\n","import log from '../logger';\nimport { isSafari } from './utils';\n\nconst defaultId = 'default';\n\nexport default class DeviceManager {\n  private static instance?: DeviceManager;\n\n  static mediaDeviceKinds: MediaDeviceKind[] = ['audioinput', 'audiooutput', 'videoinput'];\n\n  static getInstance(): DeviceManager {\n    if (this.instance === undefined) {\n      this.instance = new DeviceManager();\n    }\n    return this.instance;\n  }\n\n  static userMediaPromiseMap: Map\u003cMediaDeviceKind, Promise\u003cMediaStream\u003e\u003e = new Map();\n\n  private _previousDevices: MediaDeviceInfo[] = [];\n\n  get previousDevices() {\n    return this._previousDevices;\n  }\n\n  async getDevices(\n    kind?: MediaDeviceKind,\n    requestPermissions: boolean = true,\n  ): Promise\u003cMediaDeviceInfo[]\u003e {\n    if (DeviceManager.userMediaPromiseMap?.size \u003e 0) {\n      log.debug('awaiting getUserMedia promise');\n      try {\n        if (kind) {\n          await DeviceManager.userMediaPromiseMap.get(kind);\n        } else {\n          await Promise.all(DeviceManager.userMediaPromiseMap.values());\n        }\n      } catch (e: any) {\n        log.warn('error waiting for media permissons');\n      }\n    }\n    let devices = await navigator.mediaDevices.enumerateDevices();\n\n    if (\n      requestPermissions \u0026\u0026\n      // for safari we need to skip this check, as otherwise it will re-acquire user media and fail on iOS https://bugs.webkit.org/show_bug.cgi?id=179363\n      !(isSafari() \u0026\u0026 this.hasDeviceInUse(kind))\n    ) {\n      const isDummyDeviceOrEmpty =\n        devices.filter((d) =\u003e d.kind === kind).length === 0 ||\n        devices.some((device) =\u003e {\n          const noLabel = device.label === '';\n          const isRelevant = kind ? device.kind === kind : true;\n          return noLabel \u0026\u0026 isRelevant;\n        });\n\n      if (isDummyDeviceOrEmpty) {\n        const permissionsToAcquire = {\n          video: kind !== 'audioinput' \u0026\u0026 kind !== 'audiooutput',\n          audio: kind !== 'videoinput' \u0026\u0026 { deviceId: { ideal: 'default' } },\n        };\n        const stream = await navigator.mediaDevices.getUserMedia(permissionsToAcquire);\n        devices = await navigator.mediaDevices.enumerateDevices();\n        stream.getTracks().forEach((track) =\u003e {\n          track.stop();\n        });\n      }\n    }\n    this._previousDevices = devices;\n\n    if (kind) {\n      devices = devices.filter((device) =\u003e device.kind === kind);\n    }\n    return devices;\n  }\n\n  async normalizeDeviceId(\n    kind: MediaDeviceKind,\n    deviceId?: string,\n    groupId?: string,\n  ): Promise\u003cstring | undefined\u003e {\n    if (deviceId !== defaultId) {\n      return deviceId;\n    }\n\n    // resolve actual device id if it's 'default': Chrome returns it when no\n    // device has been chosen\n    const devices = await this.getDevices(kind);\n\n    const defaultDevice = devices.find((d) =\u003e d.deviceId === defaultId);\n\n    if (!defaultDevice) {\n      log.warn('could not reliably determine default device');\n      return undefined;\n    }\n\n    const device = devices.find(\n      (d) =\u003e d.deviceId !== defaultId \u0026\u0026 d.groupId === (groupId ?? defaultDevice.groupId),\n    );\n\n    if (!device) {\n      log.warn('could not reliably determine default device');\n      return undefined;\n    }\n\n    return device?.deviceId;\n  }\n\n  private hasDeviceInUse(kind?: MediaDeviceKind): boolean {\n    return kind\n      ? DeviceManager.userMediaPromiseMap.has(kind)\n      : DeviceManager.userMediaPromiseMap.size \u003e 0;\n  }\n}\n","import { Mutex } from '@livekit/mutex';\n\ntype QueueTask\u003cT\u003e = () =\u003e PromiseLike\u003cT\u003e;\n\nenum QueueTaskStatus {\n  'WAITING',\n  'RUNNING',\n  'COMPLETED',\n}\n\ntype QueueTaskInfo = {\n  id: number;\n  enqueuedAt: number;\n  executedAt?: number;\n  status: QueueTaskStatus;\n};\n\nexport class AsyncQueue {\n  private pendingTasks: Map\u003cnumber, QueueTaskInfo\u003e;\n\n  private taskMutex: Mutex;\n\n  private nextTaskIndex: number;\n\n  constructor() {\n    this.pendingTasks = new Map();\n    this.taskMutex = new Mutex();\n    this.nextTaskIndex = 0;\n  }\n\n  async run\u003cT\u003e(task: QueueTask\u003cT\u003e) {\n    const taskInfo: QueueTaskInfo = {\n      id: this.nextTaskIndex++,\n      enqueuedAt: Date.now(),\n      status: QueueTaskStatus.WAITING,\n    };\n    this.pendingTasks.set(taskInfo.id, taskInfo);\n    const unlock = await this.taskMutex.lock();\n    try {\n      taskInfo.executedAt = Date.now();\n      taskInfo.status = QueueTaskStatus.RUNNING;\n      return await task();\n    } finally {\n      taskInfo.status = QueueTaskStatus.COMPLETED;\n      this.pendingTasks.delete(taskInfo.id);\n      unlock();\n    }\n  }\n\n  async flush() {\n    return this.run(async () =\u003e {});\n  }\n\n  snapshot() {\n    return Array.from(this.pendingTasks.values());\n  }\n}\n","import { toHttpUrl, toWebsocketUrl } from '../room/utils';\n\nexport function createRtcUrl(url: string, searchParams: URLSearchParams) {\n  const urlObj = new URL(toWebsocketUrl(url));\n  searchParams.forEach((value, key) =\u003e {\n    urlObj.searchParams.set(key, value);\n  });\n  return appendUrlPath(urlObj, 'rtc');\n}\n\nexport function createValidateUrl(rtcWsUrl: string) {\n  const urlObj = new URL(toHttpUrl(rtcWsUrl));\n  return appendUrlPath(urlObj, 'validate');\n}\n\nfunction ensureTrailingSlash(path: string) {\n  return path.endsWith('/') ? path : `${path}/`;\n}\n\nfunction appendUrlPath(urlObj: URL, path: string) {\n  urlObj.pathname = `${ensureTrailingSlash(urlObj.pathname)}${path}`;\n  return urlObj.toString();\n}\n","import { Mutex } from '@livekit/mutex';\nimport {\n  AddTrackRequest,\n  AudioTrackFeature,\n  ClientInfo,\n  ConnectionQualityUpdate,\n  DisconnectReason,\n  JoinResponse,\n  LeaveRequest,\n  LeaveRequest_Action,\n  MuteTrackRequest,\n  ParticipantInfo,\n  Ping,\n  ReconnectReason,\n  ReconnectResponse,\n  RequestResponse,\n  Room,\n  RoomMovedResponse,\n  SessionDescription,\n  SignalRequest,\n  SignalResponse,\n  SignalTarget,\n  SimulateScenario,\n  SpeakerInfo,\n  StreamStateUpdate,\n  SubscribedQualityUpdate,\n  SubscriptionPermission,\n  SubscriptionPermissionUpdate,\n  SubscriptionResponse,\n  SyncState,\n  TrackPermission,\n  TrackPublishedResponse,\n  TrackUnpublishedResponse,\n  TrickleRequest,\n  UpdateLocalAudioTrack,\n  UpdateParticipantMetadata,\n  UpdateSubscription,\n  UpdateTrackSettings,\n  UpdateVideoLayers,\n  VideoLayer,\n  protoInt64,\n} from '@livekit/protocol';\nimport log, { LoggerNames, getLogger } from '../logger';\nimport { ConnectionError, ConnectionErrorReason } from '../room/errors';\nimport CriticalTimers from '../room/timers';\nimport type { LoggerOptions } from '../room/types';\nimport { getClientInfo, isReactNative, sleep } from '../room/utils';\nimport { AsyncQueue } from '../utils/AsyncQueue';\nimport { createRtcUrl, createValidateUrl } from './utils';\n\n// internal options\ninterface ConnectOpts extends SignalOptions {\n  /** internal */\n  reconnect?: boolean;\n  /** internal */\n  reconnectReason?: number;\n  /** internal */\n  sid?: string;\n}\n\n// public options\nexport interface SignalOptions {\n  autoSubscribe: boolean;\n  adaptiveStream?: boolean;\n  maxRetries: number;\n  e2eeEnabled: boolean;\n  websocketTimeout: number;\n}\n\ntype SignalMessage = SignalRequest['message'];\n\ntype SignalKind = NonNullable\u003cSignalMessage\u003e['case'];\n\nconst passThroughQueueSignals: Array\u003cSignalKind\u003e = [\n  'syncState',\n  'trickle',\n  'offer',\n  'answer',\n  'simulate',\n  'leave',\n];\n\nfunction canPassThroughQueue(req: SignalMessage): boolean {\n  const canPass = passThroughQueueSignals.indexOf(req!.case) \u003e= 0;\n  log.trace('request allowed to bypass queue:', { canPass, req });\n  return canPass;\n}\n\nexport enum SignalConnectionState {\n  CONNECTING,\n  CONNECTED,\n  RECONNECTING,\n  DISCONNECTING,\n  DISCONNECTED,\n}\n\n/** @internal */\nexport class SignalClient {\n  requestQueue: AsyncQueue;\n\n  queuedRequests: Array\u003c() =\u003e Promise\u003cvoid\u003e\u003e;\n\n  useJSON: boolean;\n\n  /** signal rtt in milliseconds */\n  rtt: number = 0;\n\n  /** simulate signaling latency by delaying messages */\n  signalLatency?: number;\n\n  onClose?: (reason: string) =\u003e void;\n\n  onAnswer?: (sd: RTCSessionDescriptionInit, offerId: number) =\u003e void;\n\n  onOffer?: (sd: RTCSessionDescriptionInit, offerId: number) =\u003e void;\n\n  // when a new ICE candidate is made available\n  onTrickle?: (sd: RTCIceCandidateInit, target: SignalTarget) =\u003e void;\n\n  onParticipantUpdate?: (updates: ParticipantInfo[]) =\u003e void;\n\n  onLocalTrackPublished?: (res: TrackPublishedResponse) =\u003e void;\n\n  onNegotiateRequested?: () =\u003e void;\n\n  onSpeakersChanged?: (res: SpeakerInfo[]) =\u003e void;\n\n  onRemoteMuteChanged?: (trackSid: string, muted: boolean) =\u003e void;\n\n  onRoomUpdate?: (room: Room) =\u003e void;\n\n  onConnectionQuality?: (update: ConnectionQualityUpdate) =\u003e void;\n\n  onStreamStateUpdate?: (update: StreamStateUpdate) =\u003e void;\n\n  onSubscribedQualityUpdate?: (update: SubscribedQualityUpdate) =\u003e void;\n\n  onSubscriptionPermissionUpdate?: (update: SubscriptionPermissionUpdate) =\u003e void;\n\n  onSubscriptionError?: (update: SubscriptionResponse) =\u003e void;\n\n  onLocalTrackUnpublished?: (res: TrackUnpublishedResponse) =\u003e void;\n\n  onTokenRefresh?: (token: string) =\u003e void;\n\n  onLeave?: (leave: LeaveRequest) =\u003e void;\n\n  onRequestResponse?: (response: RequestResponse) =\u003e void;\n\n  onLocalTrackSubscribed?: (trackSid: string) =\u003e void;\n\n  onRoomMoved?: (res: RoomMovedResponse) =\u003e void;\n\n  connectOptions?: ConnectOpts;\n\n  ws?: WebSocket;\n\n  get currentState() {\n    return this.state;\n  }\n\n  get isDisconnected() {\n    return (\n      this.state === SignalConnectionState.DISCONNECTING ||\n      this.state === SignalConnectionState.DISCONNECTED\n    );\n  }\n\n  private get isEstablishingConnection() {\n    return (\n      this.state === SignalConnectionState.CONNECTING ||\n      this.state === SignalConnectionState.RECONNECTING\n    );\n  }\n\n  private getNextRequestId() {\n    this._requestId += 1;\n    return this._requestId;\n  }\n\n  private options?: SignalOptions;\n\n  private pingTimeout: ReturnType\u003ctypeof setTimeout\u003e | undefined;\n\n  private pingTimeoutDuration: number | undefined;\n\n  private pingIntervalDuration: number | undefined;\n\n  private pingInterval: ReturnType\u003ctypeof setInterval\u003e | undefined;\n\n  private closingLock: Mutex;\n\n  private state: SignalConnectionState = SignalConnectionState.DISCONNECTED;\n\n  private connectionLock: Mutex;\n\n  private log = log;\n\n  private loggerContextCb?: LoggerOptions['loggerContextCb'];\n\n  private _requestId = 0;\n\n  constructor(useJSON: boolean = false, loggerOptions: LoggerOptions = {}) {\n    this.log = getLogger(loggerOptions.loggerName ?? LoggerNames.Signal);\n    this.loggerContextCb = loggerOptions.loggerContextCb;\n    this.useJSON = useJSON;\n    this.requestQueue = new AsyncQueue();\n    this.queuedRequests = [];\n    this.closingLock = new Mutex();\n    this.connectionLock = new Mutex();\n    this.state = SignalConnectionState.DISCONNECTED;\n  }\n\n  private get logContext() {\n    return this.loggerContextCb?.() ?? {};\n  }\n\n  async join(\n    url: string,\n    token: string,\n    opts: SignalOptions,\n    abortSignal?: AbortSignal,\n  ): Promise\u003cJoinResponse\u003e {\n    // during a full reconnect, we'd want to start the sequence even if currently\n    // connected\n    this.state = SignalConnectionState.CONNECTING;\n    this.options = opts;\n    const res = await this.connect(url, token, opts, abortSignal);\n    return res as JoinResponse;\n  }\n\n  async reconnect(\n    url: string,\n    token: string,\n    sid?: string,\n    reason?: ReconnectReason,\n  ): Promise\u003cReconnectResponse | undefined\u003e {\n    if (!this.options) {\n      this.log.warn(\n        'attempted to reconnect without signal options being set, ignoring',\n        this.logContext,\n      );\n      return;\n    }\n    this.state = SignalConnectionState.RECONNECTING;\n    // clear ping interval and restart it once reconnected\n    this.clearPingInterval();\n\n    const res = (await this.connect(url, token, {\n      ...this.options,\n      reconnect: true,\n      sid,\n      reconnectReason: reason,\n    })) as ReconnectResponse;\n    return res;\n  }\n\n  private connect(\n    url: string,\n    token: string,\n    opts: ConnectOpts,\n    abortSignal?: AbortSignal,\n  ): Promise\u003cJoinResponse | ReconnectResponse | undefined\u003e {\n    this.connectOptions = opts;\n    const clientInfo = getClientInfo();\n    const params = createConnectionParams(token, clientInfo, opts);\n    const rtcUrl = createRtcUrl(url, params);\n    const validateUrl = createValidateUrl(rtcUrl);\n\n    return new Promise\u003cJoinResponse | ReconnectResponse | undefined\u003e(async (resolve, reject) =\u003e {\n      const unlock = await this.connectionLock.lock();\n      try {\n        const abortHandler = async () =\u003e {\n          this.close();\n          clearTimeout(wsTimeout);\n          reject(\n            new ConnectionError(\n              'room connection has been cancelled (signal)',\n              ConnectionErrorReason.Cancelled,\n            ),\n          );\n        };\n\n        const wsTimeout = setTimeout(() =\u003e {\n          this.close();\n          reject(\n            new ConnectionError(\n              'room connection has timed out (signal)',\n              ConnectionErrorReason.ServerUnreachable,\n            ),\n          );\n        }, opts.websocketTimeout);\n\n        if (abortSignal?.aborted) {\n          abortHandler();\n        }\n        abortSignal?.addEventListener('abort', abortHandler);\n        const redactedUrl = new URL(rtcUrl);\n        if (redactedUrl.searchParams.has('access_token')) {\n          redactedUrl.searchParams.set('access_token', '\u003credacted\u003e');\n        }\n        this.log.debug(`connecting to ${redactedUrl}`, {\n          reconnect: opts.reconnect,\n          reconnectReason: opts.reconnectReason,\n          ...this.logContext,\n        });\n        if (this.ws) {\n          await this.close(false);\n        }\n        this.ws = new WebSocket(rtcUrl);\n        this.ws.binaryType = 'arraybuffer';\n\n        this.ws.onopen = () =\u003e {\n          clearTimeout(wsTimeout);\n        };\n\n        this.ws.onerror = async (ev: Event) =\u003e {\n          if (this.state !== SignalConnectionState.CONNECTED) {\n            this.state = SignalConnectionState.DISCONNECTED;\n            clearTimeout(wsTimeout);\n            try {\n              const resp = await fetch(validateUrl);\n              if (resp.status.toFixed(0).startsWith('4')) {\n                const msg = await resp.text();\n                reject(new ConnectionError(msg, ConnectionErrorReason.NotAllowed, resp.status));\n              } else {\n                reject(\n                  new ConnectionError(\n                    `Encountered unknown websocket error during connection: ${ev.toString()}`,\n                    ConnectionErrorReason.InternalError,\n                    resp.status,\n                  ),\n                );\n              }\n            } catch (e) {\n              reject(\n                new ConnectionError(\n                  e instanceof Error ? e.message : 'server was not reachable',\n                  ConnectionErrorReason.ServerUnreachable,\n                ),\n              );\n            }\n            return;\n          }\n          // other errors, handle\n          this.handleWSError(ev);\n        };\n\n        this.ws.onmessage = async (ev: MessageEvent) =\u003e {\n          // not considered connected until JoinResponse is received\n          let resp: SignalResponse;\n          if (typeof ev.data === 'string') {\n            const json = JSON.parse(ev.data);\n            resp = SignalResponse.fromJson(json, { ignoreUnknownFields: true });\n          } else if (ev.data instanceof ArrayBuffer) {\n            resp = SignalResponse.fromBinary(new Uint8Array(ev.data));\n          } else {\n            this.log.error(\n              `could not decode websocket message: ${typeof ev.data}`,\n              this.logContext,\n            );\n            return;\n          }\n\n          if (this.state !== SignalConnectionState.CONNECTED) {\n            let shouldProcessMessage = false;\n            // handle join message only\n            if (resp.message?.case === 'join') {\n              this.state = SignalConnectionState.CONNECTED;\n              abortSignal?.removeEventListener('abort', abortHandler);\n              this.pingTimeoutDuration = resp.message.value.pingTimeout;\n              this.pingIntervalDuration = resp.message.value.pingInterval;\n\n              if (this.pingTimeoutDuration \u0026\u0026 this.pingTimeoutDuration \u003e 0) {\n                this.log.debug('ping config', {\n                  ...this.logContext,\n                  timeout: this.pingTimeoutDuration,\n                  interval: this.pingIntervalDuration,\n                });\n                this.startPingInterval();\n              }\n              resolve(resp.message.value);\n            } else if (\n              this.state === SignalConnectionState.RECONNECTING \u0026\u0026\n              resp.message.case !== 'leave'\n            ) {\n              // in reconnecting, any message received means signal reconnected\n              this.state = SignalConnectionState.CONNECTED;\n              abortSignal?.removeEventListener('abort', abortHandler);\n              this.startPingInterval();\n              if (resp.message?.case === 'reconnect') {\n                resolve(resp.message.value);\n              } else {\n                this.log.debug(\n                  'declaring signal reconnected without reconnect response received',\n                  this.logContext,\n                );\n                resolve(undefined);\n                shouldProcessMessage = true;\n              }\n            } else if (this.isEstablishingConnection \u0026\u0026 resp.message.case === 'leave') {\n              reject(\n                new ConnectionError(\n                  'Received leave request while trying to (re)connect',\n                  ConnectionErrorReason.LeaveRequest,\n                  undefined,\n                  resp.message.value.reason,\n                ),\n              );\n            } else if (!opts.reconnect) {\n              // non-reconnect case, should receive join response first\n              reject(\n                new ConnectionError(\n                  `did not receive join response, got ${resp.message?.case} instead`,\n                  ConnectionErrorReason.InternalError,\n                ),\n              );\n            }\n            if (!shouldProcessMessage) {\n              return;\n            }\n          }\n\n          if (this.signalLatency) {\n            await sleep(this.signalLatency);\n          }\n          this.handleSignalResponse(resp);\n        };\n\n        this.ws.onclose = (ev: CloseEvent) =\u003e {\n          if (this.isEstablishingConnection) {\n            reject(\n              new ConnectionError(\n                'Websocket got closed during a (re)connection attempt',\n                ConnectionErrorReason.InternalError,\n              ),\n            );\n          }\n\n          this.log.warn(`websocket closed`, {\n            ...this.logContext,\n            reason: ev.reason,\n            code: ev.code,\n            wasClean: ev.wasClean,\n            state: this.state,\n          });\n          this.handleOnClose(ev.reason);\n        };\n      } finally {\n        unlock();\n      }\n    });\n  }\n\n  /** @internal */\n  resetCallbacks = () =\u003e {\n    this.onAnswer = undefined;\n    this.onLeave = undefined;\n    this.onLocalTrackPublished = undefined;\n    this.onLocalTrackUnpublished = undefined;\n    this.onNegotiateRequested = undefined;\n    this.onOffer = undefined;\n    this.onRemoteMuteChanged = undefined;\n    this.onSubscribedQualityUpdate = undefined;\n    this.onTokenRefresh = undefined;\n    this.onTrickle = undefined;\n    this.onClose = undefined;\n  };\n\n  async close(updateState: boolean = true) {\n    const unlock = await this.closingLock.lock();\n    try {\n      this.clearPingInterval();\n      if (updateState) {\n        this.state = SignalConnectionState.DISCONNECTING;\n      }\n      if (this.ws) {\n        this.ws.onmessage = null;\n        this.ws.onopen = null;\n        this.ws.onclose = null;\n\n        // calling `ws.close()` only starts the closing handshake (CLOSING state), prefer to wait until state is actually CLOSED\n        const closePromise = new Promise\u003cvoid\u003e((resolve) =\u003e {\n          if (this.ws) {\n            this.ws.onclose = () =\u003e {\n              resolve();\n            };\n          } else {\n            resolve();\n          }\n        });\n\n        if (this.ws.readyState \u003c this.ws.CLOSING) {\n          this.ws.close();\n          // 250ms grace period for ws to close gracefully\n          await Promise.race([closePromise, sleep(250)]);\n        }\n        this.ws = undefined;\n      }\n    } finally {\n      if (updateState) {\n        this.state = SignalConnectionState.DISCONNECTED;\n      }\n      unlock();\n    }\n  }\n\n  // initial offer after joining\n  sendOffer(offer: RTCSessionDescriptionInit, offerId: number) {\n    this.log.debug('sending offer', { ...this.logContext, offerSdp: offer.sdp });\n    this.sendRequest({\n      case: 'offer',\n      value: toProtoSessionDescription(offer, offerId),\n    });\n  }\n\n  // answer a server-initiated offer\n  sendAnswer(answer: RTCSessionDescriptionInit, offerId: number) {\n    this.log.debug('sending answer', { ...this.logContext, answerSdp: answer.sdp });\n    return this.sendRequest({\n      case: 'answer',\n      value: toProtoSessionDescription(answer, offerId),\n    });\n  }\n\n  sendIceCandidate(candidate: RTCIceCandidateInit, target: SignalTarget) {\n    this.log.debug('sending ice candidate', { ...this.logContext, candidate });\n    return this.sendRequest({\n      case: 'trickle',\n      value: new TrickleRequest({\n        candidateInit: JSON.stringify(candidate),\n        target,\n      }),\n    });\n  }\n\n  sendMuteTrack(trackSid: string, muted: boolean) {\n    return this.sendRequest({\n      case: 'mute',\n      value: new MuteTrackRequest({\n        sid: trackSid,\n        muted,\n      }),\n    });\n  }\n\n  sendAddTrack(req: AddTrackRequest) {\n    return this.sendRequest({\n      case: 'addTrack',\n      value: req,\n    });\n  }\n\n  async sendUpdateLocalMetadata(\n    metadata: string,\n    name: string,\n    attributes: Record\u003cstring, string\u003e = {},\n  ) {\n    const requestId = this.getNextRequestId();\n    await this.sendRequest({\n      case: 'updateMetadata',\n      value: new UpdateParticipantMetadata({\n        requestId,\n        metadata,\n        name,\n        attributes,\n      }),\n    });\n    return requestId;\n  }\n\n  sendUpdateTrackSettings(settings: UpdateTrackSettings) {\n    this.sendRequest({\n      case: 'trackSetting',\n      value: settings,\n    });\n  }\n\n  sendUpdateSubscription(sub: UpdateSubscription) {\n    return this.sendRequest({\n      case: 'subscription',\n      value: sub,\n    });\n  }\n\n  sendSyncState(sync: SyncState) {\n    return this.sendRequest({\n      case: 'syncState',\n      value: sync,\n    });\n  }\n\n  sendUpdateVideoLayers(trackSid: string, layers: VideoLayer[]) {\n    return this.sendRequest({\n      case: 'updateLayers',\n      value: new UpdateVideoLayers({\n        trackSid,\n        layers,\n      }),\n    });\n  }\n\n  sendUpdateSubscriptionPermissions(allParticipants: boolean, trackPermissions: TrackPermission[]) {\n    return this.sendRequest({\n      case: 'subscriptionPermission',\n      value: new SubscriptionPermission({\n        allParticipants,\n        trackPermissions,\n      }),\n    });\n  }\n\n  sendSimulateScenario(scenario: SimulateScenario) {\n    return this.sendRequest({\n      case: 'simulate',\n      value: scenario,\n    });\n  }\n\n  sendPing() {\n    /** send both of ping and pingReq for compatibility to old and new server */\n    return Promise.all([\n      this.sendRequest({\n        case: 'ping',\n        value: protoInt64.parse(Date.now()),\n      }),\n      this.sendRequest({\n        case: 'pingReq',\n        value: new Ping({\n          timestamp: protoInt64.parse(Date.now()),\n          rtt: protoInt64.parse(this.rtt),\n        }),\n      }),\n    ]);\n  }\n\n  sendUpdateLocalAudioTrack(trackSid: string, features: AudioTrackFeature[]) {\n    return this.sendRequest({\n      case: 'updateAudioTrack',\n      value: new UpdateLocalAudioTrack({ trackSid, features }),\n    });\n  }\n\n  sendLeave() {\n    return this.sendRequest({\n      case: 'leave',\n      value: new LeaveRequest({\n        reason: DisconnectReason.CLIENT_INITIATED,\n        // server doesn't process this field, keeping it here to indicate the intent of a full disconnect\n        action: LeaveRequest_Action.DISCONNECT,\n      }),\n    });\n  }\n\n  async sendRequest(message: SignalMessage, fromQueue: boolean = false) {\n    // capture all requests while reconnecting and put them in a queue\n    // unless the request originates from the queue, then don't enqueue again\n    const canQueue = !fromQueue \u0026\u0026 !canPassThroughQueue(message);\n    if (canQueue \u0026\u0026 this.state === SignalConnectionState.RECONNECTING) {\n      this.queuedRequests.push(async () =\u003e {\n        await this.sendRequest(message, true);\n      });\n      return;\n    }\n    // make sure previously queued requests are being sent first\n    if (!fromQueue) {\n      await this.requestQueue.flush();\n    }\n    if (this.signalLatency) {\n      await sleep(this.signalLatency);\n    }\n    if (this.isDisconnected) {\n      // Skip requests if the signal layer is disconnected\n      // This can happen if an event is sent in the mist of room.connect() initializing\n      this.log.debug(`skipping signal request (type: ${message.case}) - SignalClient disconnected`);\n      return;\n    }\n    if (!this.ws || this.ws.readyState !== this.ws.OPEN) {\n      this.log.error(\n        `cannot send signal request before connected, type: ${message?.case}`,\n        this.logContext,\n      );\n      return;\n    }\n    const req = new SignalRequest({ message });\n\n    try {\n      if (this.useJSON) {\n        this.ws.send(req.toJsonString());\n      } else {\n        this.ws.send(req.toBinary());\n      }\n    } catch (e) {\n      this.log.error('error sending signal message', { ...this.logContext, error: e });\n    }\n  }\n\n  private handleSignalResponse(res: SignalResponse) {\n    const msg = res.message;\n    if (msg == undefined) {\n      this.log.debug('received unsupported message', this.logContext);\n      return;\n    }\n\n    let pingHandled = false;\n    if (msg.case === 'answer') {\n      const sd = fromProtoSessionDescription(msg.value);\n      if (this.onAnswer) {\n        this.onAnswer(sd, msg.value.id);\n      }\n    } else if (msg.case === 'offer') {\n      const sd = fromProtoSessionDescription(msg.value);\n      if (this.onOffer) {\n        this.onOffer(sd, msg.value.id);\n      }\n    } else if (msg.case === 'trickle') {\n      const candidate: RTCIceCandidateInit = JSON.parse(msg.value.candidateInit!);\n      if (this.onTrickle) {\n        this.onTrickle(candidate, msg.value.target);\n      }\n    } else if (msg.case === 'update') {\n      if (this.onParticipantUpdate) {\n        this.onParticipantUpdate(msg.value.participants ?? []);\n      }\n    } else if (msg.case === 'trackPublished') {\n      if (this.onLocalTrackPublished) {\n        this.onLocalTrackPublished(msg.value);\n      }\n    } else if (msg.case === 'speakersChanged') {\n      if (this.onSpeakersChanged) {\n        this.onSpeakersChanged(msg.value.speakers ?? []);\n      }\n    } else if (msg.case === 'leave') {\n      if (this.onLeave) {\n        this.onLeave(msg.value);\n      }\n    } else if (msg.case === 'mute') {\n      if (this.onRemoteMuteChanged) {\n        this.onRemoteMuteChanged(msg.value.sid, msg.value.muted);\n      }\n    } else if (msg.case === 'roomUpdate') {\n      if (this.onRoomUpdate \u0026\u0026 msg.value.room) {\n        this.onRoomUpdate(msg.value.room);\n      }\n    } else if (msg.case === 'connectionQuality') {\n      if (this.onConnectionQuality) {\n        this.onConnectionQuality(msg.value);\n      }\n    } else if (msg.case === 'streamStateUpdate') {\n      if (this.onStreamStateUpdate) {\n        this.onStreamStateUpdate(msg.value);\n      }\n    } else if (msg.case === 'subscribedQualityUpdate') {\n      if (this.onSubscribedQualityUpdate) {\n        this.onSubscribedQualityUpdate(msg.value);\n      }\n    } else if (msg.case === 'subscriptionPermissionUpdate') {\n      if (this.onSubscriptionPermissionUpdate) {\n        this.onSubscriptionPermissionUpdate(msg.value);\n      }\n    } else if (msg.case === 'refreshToken') {\n      if (this.onTokenRefresh) {\n        this.onTokenRefresh(msg.value);\n      }\n    } else if (msg.case === 'trackUnpublished') {\n      if (this.onLocalTrackUnpublished) {\n        this.onLocalTrackUnpublished(msg.value);\n      }\n    } else if (msg.case === 'subscriptionResponse') {\n      if (this.onSubscriptionError) {\n        this.onSubscriptionError(msg.value);\n      }\n    } else if (msg.case === 'pong') {\n    } else if (msg.case === 'pongResp') {\n      this.rtt = Date.now() - Number.parseInt(msg.value.lastPingTimestamp.toString());\n      this.resetPingTimeout();\n      pingHandled = true;\n    } else if (msg.case === 'requestResponse') {\n      if (this.onRequestResponse) {\n        this.onRequestResponse(msg.value);\n      }\n    } else if (msg.case === 'trackSubscribed') {\n      if (this.onLocalTrackSubscribed) {\n        this.onLocalTrackSubscribed(msg.value.trackSid);\n      }\n    } else if (msg.case === 'roomMoved') {\n      if (this.onTokenRefresh) {\n        this.onTokenRefresh(msg.value.token);\n      }\n      if (this.onRoomMoved) {\n        this.onRoomMoved(msg.value);\n      }\n    } else {\n      this.log.debug('unsupported message', { ...this.logContext, msgCase: msg.case });\n    }\n\n    if (!pingHandled) {\n      this.resetPingTimeout();\n    }\n  }\n\n  setReconnected() {\n    while (this.queuedRequests.length \u003e 0) {\n      const req = this.queuedRequests.shift();\n      if (req) {\n        this.requestQueue.run(req);\n      }\n    }\n  }\n\n  private async handleOnClose(reason: string) {\n    if (this.state === SignalConnectionState.DISCONNECTED) return;\n    const onCloseCallback = this.onClose;\n    await this.close();\n    this.log.debug(`websocket connection closed: ${reason}`, { ...this.logContext, reason });\n    if (onCloseCallback) {\n      onCloseCallback(reason);\n    }\n  }\n\n  private handleWSError(ev: Event) {\n    this.log.error('websocket error', { ...this.logContext, error: ev });\n  }\n\n  /**\n   * Resets the ping timeout and starts a new timeout.\n   * Call this after receiving a pong message\n   */\n  private resetPingTimeout() {\n    this.clearPingTimeout();\n    if (!this.pingTimeoutDuration) {\n      this.log.warn('ping timeout duration not set', this.logContext);\n      return;\n    }\n    this.pingTimeout = CriticalTimers.setTimeout(() =\u003e {\n      this.log.warn(\n        `ping timeout triggered. last pong received at: ${new Date(\n          Date.now() - this.pingTimeoutDuration! * 1000,\n        ).toUTCString()}`,\n        this.logContext,\n      );\n      this.handleOnClose('ping timeout');\n    }, this.pingTimeoutDuration * 1000);\n  }\n\n  /**\n   * Clears ping timeout (does not start a new timeout)\n   */\n  private clearPingTimeout() {\n    if (this.pingTimeout) {\n      CriticalTimers.clearTimeout(this.pingTimeout);\n    }\n  }\n\n  private startPingInterval() {\n    this.clearPingInterval();\n    this.resetPingTimeout();\n    if (!this.pingIntervalDuration) {\n      this.log.warn('ping interval duration not set', this.logContext);\n      return;\n    }\n    this.log.debug('start ping interval', this.logContext);\n    this.pingInterval = CriticalTimers.setInterval(() =\u003e {\n      this.sendPing();\n    }, this.pingIntervalDuration * 1000);\n  }\n\n  private clearPingInterval() {\n    this.log.debug('clearing ping interval', this.logContext);\n    this.clearPingTimeout();\n    if (this.pingInterval) {\n      CriticalTimers.clearInterval(this.pingInterval);\n    }\n  }\n}\n\nfunction fromProtoSessionDescription(sd: SessionDescription): RTCSessionDescriptionInit {\n  const rsd: RTCSessionDescriptionInit = {\n    type: 'offer',\n    sdp: sd.sdp,\n  };\n  switch (sd.type) {\n    case 'answer':\n    case 'offer':\n    case 'pranswer':\n    case 'rollback':\n      rsd.type = sd.type;\n      break;\n    default:\n      break;\n  }\n  return rsd;\n}\n\nexport function toProtoSessionDescription(\n  rsd: RTCSessionDescription | RTCSessionDescriptionInit,\n  id?: number,\n): SessionDescription {\n  const sd = new SessionDescription({\n    sdp: rsd.sdp!,\n    type: rsd.type!,\n    id,\n  });\n  return sd;\n}\n\nfunction createConnectionParams(\n  token: string,\n  info: ClientInfo,\n  opts: ConnectOpts,\n): URLSearchParams {\n  const params = new URLSearchParams();\n  params.set('access_token', token);\n\n  // opts\n  if (opts.reconnect) {\n    params.set('reconnect', '1');\n    if (opts.sid) {\n      params.set('sid', opts.sid);\n    }\n  }\n\n  params.set('auto_subscribe', opts.autoSubscribe ? '1' : '0');\n\n  // ClientInfo\n  params.set('sdk', isReactNative() ? 'reactnative' : 'js');\n  params.set('version', info.version!);\n  params.set('protocol', info.protocol!.toString());\n  if (info.deviceModel) {\n    params.set('device_model', info.deviceModel);\n  }\n  if (info.os) {\n    params.set('os', info.os);\n  }\n  if (info.osVersion) {\n    params.set('os_version', info.osVersion);\n  }\n  if (info.browser) {\n    params.set('browser', info.browser);\n  }\n  if (info.browserVersion) {\n    params.set('browser_version', info.browserVersion);\n  }\n\n  if (opts.adaptiveStream) {\n    params.set('adaptive_stream', '1');\n  }\n\n  if (opts.reconnectReason) {\n    params.set('reconnect_reason', opts.reconnectReason.toString());\n  }\n\n  // @ts-ignore\n  if (navigator.connection?.type) {\n    // @ts-ignore\n    params.set('network', navigator.connection.type);\n  }\n\n  return params;\n}\n","export interface DataPacketItem {\n  data: Uint8Array;\n  sequence: number;\n}\n\nexport class DataPacketBuffer {\n  private buffer: DataPacketItem[] = [];\n\n  private _totalSize = 0;\n\n  push(item: DataPacketItem) {\n    this.buffer.push(item);\n    this._totalSize += item.data.byteLength;\n  }\n\n  pop(): DataPacketItem | undefined {\n    const item = this.buffer.shift();\n    if (item) {\n      this._totalSize -= item.data.byteLength;\n    }\n    return item;\n  }\n\n  getAll(): DataPacketItem[] {\n    return this.buffer.slice();\n  }\n\n  popToSequence(sequence: number) {\n    while (this.buffer.length \u003e 0) {\n      const first = this.buffer[0];\n      if (first.sequence \u003c= sequence) {\n        this.pop();\n      } else {\n        break;\n      }\n    }\n  }\n\n  alignBufferedAmount(bufferedAmount: number) {\n    while (this.buffer.length \u003e 0) {\n      const first = this.buffer[0];\n      if (this._totalSize - first.data.byteLength \u003c= bufferedAmount) {\n        break;\n      }\n      this.pop();\n    }\n  }\n\n  get length(): number {\n    return this.buffer.length;\n  }\n}\n","export class TTLMap\u003cK, V\u003e {\n  private _map = new Map\u003cK, { value: V; expiresAt: number }\u003e();\n\n  private ttl: number;\n\n  private _lastCleanup = 0;\n\n  /**\n   * @param ttl ttl of the key (ms)\n   */\n  constructor(ttl: number) {\n    this.ttl = ttl;\n  }\n\n  set(key: K, value: V) {\n    const now = Date.now();\n    if (now - this._lastCleanup \u003e this.ttl / 2) {\n      this.cleanup();\n    }\n    const expiresAt = now + this.ttl;\n    this._map.set(key, { value, expiresAt });\n    return this;\n  }\n\n  get(key: K): V | undefined {\n    const entry = this._map.get(key);\n    if (!entry) return undefined;\n    if (entry.expiresAt \u003c Date.now()) {\n      this._map.delete(key);\n      return undefined;\n    }\n    return entry.value;\n  }\n\n  has(key: K): boolean {\n    const entry = this._map.get(key);\n    if (!entry) return false;\n    if (entry.expiresAt \u003c Date.now()) {\n      this._map.delete(key);\n      return false;\n    }\n    return true;\n  }\n\n  delete(key: K): boolean {\n    return this._map.delete(key);\n  }\n\n  clear() {\n    this._map.clear();\n  }\n\n  cleanup() {\n    const now = Date.now();\n    for (const [key, entry] of this._map.entries()) {\n      if (entry.expiresAt \u003c now) {\n        this._map.delete(key);\n      }\n    }\n    this._lastCleanup = now;\n  }\n\n  get size() {\n    this.cleanup();\n    return this._map.size;\n  }\n\n  forEach(callback: (value: V, key: K, map: Map\u003cK, V\u003e) =\u003e void) {\n    this.cleanup();\n    for (const [key, entry] of this._map.entries()) {\n      if (entry.expiresAt \u003e= Date.now()) {\n        callback(entry.value, key, this.asValueMap());\n      }\n    }\n  }\n\n  map\u003cU\u003e(callback: (value: V, key: K, map: Map\u003cK, V\u003e) =\u003e U): U[] {\n    this.cleanup();\n    const result: U[] = [];\n    const valueMap = this.asValueMap();\n    for (const [key, value] of valueMap.entries()) {\n      result.push(callback(value, key, valueMap));\n    }\n    return result;\n  }\n\n  private asValueMap(): Map\u003cK, V\u003e {\n    const result = new Map\u003cK, V\u003e();\n    for (const [key, entry] of this._map.entries()) {\n      if (entry.expiresAt \u003e= Date.now()) {\n        result.set(key, entry.value);\n      }\n    }\n    return result;\n  }\n}\n","var grammar = module.exports = {\n  v: [{\n    name: 'version',\n    reg: /^(\\d*)$/\n  }],\n  o: [{\n    // o=- 20518 0 IN IP4 203.0.113.1\n    // NB: sessionId will be a String in most cases because it is huge\n    name: 'origin',\n    reg: /^(\\S*) (\\d*) (\\d*) (\\S*) IP(\\d) (\\S*)/,\n    names: ['username', 'sessionId', 'sessionVersion', 'netType', 'ipVer', 'address'],\n    format: '%s %s %d %s IP%d %s'\n  }],\n  // default parsing of these only (though some of these feel outdated)\n  s: [{ name: 'name' }],\n  i: [{ name: 'description' }],\n  u: [{ name: 'uri' }],\n  e: [{ name: 'email' }],\n  p: [{ name: 'phone' }],\n  z: [{ name: 'timezones' }], // TODO: this one can actually be parsed properly...\n  r: [{ name: 'repeats' }],   // TODO: this one can also be parsed properly\n  // k: [{}], // outdated thing ignored\n  t: [{\n    // t=0 0\n    name: 'timing',\n    reg: /^(\\d*) (\\d*)/,\n    names: ['start', 'stop'],\n    format: '%d %d'\n  }],\n  c: [{\n    // c=IN IP4 10.47.197.26\n    name: 'connection',\n    reg: /^IN IP(\\d) (\\S*)/,\n    names: ['version', 'ip'],\n    format: 'IN IP%d %s'\n  }],\n  b: [{\n    // b=AS:4000\n    push: 'bandwidth',\n    reg: /^(TIAS|AS|CT|RR|RS):(\\d*)/,\n    names: ['type', 'limit'],\n    format: '%s:%s'\n  }],\n  m: [{\n    // m=video 51744 RTP/AVP 126 97 98 34 31\n    // NB: special - pushes to session\n    // TODO: rtp/fmtp should be filtered by the payloads found here?\n    reg: /^(\\w*) (\\d*) ([\\w/]*)(?: (.*))?/,\n    names: ['type', 'port', 'protocol', 'payloads'],\n    format: '%s %d %s %s'\n  }],\n  a: [\n    {\n      // a=rtpmap:110 opus/48000/2\n      push: 'rtp',\n      reg: /^rtpmap:(\\d*) ([\\w\\-.]*)(?:\\s*\\/(\\d*)(?:\\s*\\/(\\S*))?)?/,\n      names: ['payload', 'codec', 'rate', 'encoding'],\n      format: function (o) {\n        return (o.encoding)\n          ? 'rtpmap:%d %s/%s/%s'\n          : o.rate\n            ? 'rtpmap:%d %s/%s'\n            : 'rtpmap:%d %s';\n      }\n    },\n    {\n      // a=fmtp:108 profile-level-id=24;object=23;bitrate=64000\n      // a=fmtp:111 minptime=10; useinbandfec=1\n      push: 'fmtp',\n      reg: /^fmtp:(\\d*) ([\\S| ]*)/,\n      names: ['payload', 'config'],\n      format: 'fmtp:%d %s'\n    },\n    {\n      // a=control:streamid=0\n      name: 'control',\n      reg: /^control:(.*)/,\n      format: 'control:%s'\n    },\n    {\n      // a=rtcp:65179 IN IP4 193.84.77.194\n      name: 'rtcp',\n      reg: /^rtcp:(\\d*)(?: (\\S*) IP(\\d) (\\S*))?/,\n      names: ['port', 'netType', 'ipVer', 'address'],\n      format: function (o) {\n        return (o.address != null)\n          ? 'rtcp:%d %s IP%d %s'\n          : 'rtcp:%d';\n      }\n    },\n    {\n      // a=rtcp-fb:98 trr-int 100\n      push: 'rtcpFbTrrInt',\n      reg: /^rtcp-fb:(\\*|\\d*) trr-int (\\d*)/,\n      names: ['payload', 'value'],\n      format: 'rtcp-fb:%s trr-int %d'\n    },\n    {\n      // a=rtcp-fb:98 nack rpsi\n      push: 'rtcpFb',\n      reg: /^rtcp-fb:(\\*|\\d*) ([\\w-_]*)(?: ([\\w-_]*))?/,\n      names: ['payload', 'type', 'subtype'],\n      format: function (o) {\n        return (o.subtype != null)\n          ? 'rtcp-fb:%s %s %s'\n          : 'rtcp-fb:%s %s';\n      }\n    },\n    {\n      // a=extmap:2 urn:ietf:params:rtp-hdrext:toffset\n      // a=extmap:1/recvonly URI-gps-string\n      // a=extmap:3 urn:ietf:params:rtp-hdrext:encrypt urn:ietf:params:rtp-hdrext:smpte-tc 25@600/24\n      push: 'ext',\n      reg: /^extmap:(\\d+)(?:\\/(\\w+))?(?: (urn:ietf:params:rtp-hdrext:encrypt))? (\\S*)(?: (\\S*))?/,\n      names: ['value', 'direction', 'encrypt-uri', 'uri', 'config'],\n      format: function (o) {\n        return (\n          'extmap:%d' +\n          (o.direction ? '/%s' : '%v') +\n          (o['encrypt-uri'] ? ' %s' : '%v') +\n          ' %s' +\n          (o.config ? ' %s' : '')\n        );\n      }\n    },\n    {\n      // a=extmap-allow-mixed\n      name: 'extmapAllowMixed',\n      reg: /^(extmap-allow-mixed)/\n    },\n    {\n      // a=crypto:1 AES_CM_128_HMAC_SHA1_80 inline:PS1uQCVeeCFCanVmcjkpPywjNWhcYD0mXXtxaVBR|2^20|1:32\n      push: 'crypto',\n      reg: /^crypto:(\\d*) ([\\w_]*) (\\S*)(?: (\\S*))?/,\n      names: ['id', 'suite', 'config', 'sessionConfig'],\n      format: function (o) {\n        return (o.sessionConfig != null)\n          ? 'crypto:%d %s %s %s'\n          : 'crypto:%d %s %s';\n      }\n    },\n    {\n      // a=setup:actpass\n      name: 'setup',\n      reg: /^setup:(\\w*)/,\n      format: 'setup:%s'\n    },\n    {\n      // a=connection:new\n      name: 'connectionType',\n      reg: /^connection:(new|existing)/,\n      format: 'connection:%s'\n    },\n    {\n      // a=mid:1\n      name: 'mid',\n      reg: /^mid:([^\\s]*)/,\n      format: 'mid:%s'\n    },\n    {\n      // a=msid:0c8b064d-d807-43b4-b434-f92a889d8587 98178685-d409-46e0-8e16-7ef0db0db64a\n      name: 'msid',\n      reg: /^msid:(.*)/,\n      format: 'msid:%s'\n    },\n    {\n      // a=ptime:20\n      name: 'ptime',\n      reg: /^ptime:(\\d*(?:\\.\\d*)*)/,\n      format: 'ptime:%d'\n    },\n    {\n      // a=maxptime:60\n      name: 'maxptime',\n      reg: /^maxptime:(\\d*(?:\\.\\d*)*)/,\n      format: 'maxptime:%d'\n    },\n    {\n      // a=sendrecv\n      name: 'direction',\n      reg: /^(sendrecv|recvonly|sendonly|inactive)/\n    },\n    {\n      // a=ice-lite\n      name: 'icelite',\n      reg: /^(ice-lite)/\n    },\n    {\n      // a=ice-ufrag:F7gI\n      name: 'iceUfrag',\n      reg: /^ice-ufrag:(\\S*)/,\n      format: 'ice-ufrag:%s'\n    },\n    {\n      // a=ice-pwd:x9cml/YzichV2+XlhiMu8g\n      name: 'icePwd',\n      reg: /^ice-pwd:(\\S*)/,\n      format: 'ice-pwd:%s'\n    },\n    {\n      // a=fingerprint:SHA-1 00:11:22:33:44:55:66:77:88:99:AA:BB:CC:DD:EE:FF:00:11:22:33\n      name: 'fingerprint',\n      reg: /^fingerprint:(\\S*) (\\S*)/,\n      names: ['type', 'hash'],\n      format: 'fingerprint:%s %s'\n    },\n    {\n      // a=candidate:0 1 UDP 2113667327 203.0.113.1 54400 typ host\n      // a=candidate:1162875081 1 udp 2113937151 192.168.34.75 60017 typ host generation 0 network-id 3 network-cost 10\n      // a=candidate:3289912957 2 udp 1845501695 193.84.77.194 60017 typ srflx raddr 192.168.34.75 rport 60017 generation 0 network-id 3 network-cost 10\n      // a=candidate:229815620 1 tcp 1518280447 192.168.150.19 60017 typ host tcptype active generation 0 network-id 3 network-cost 10\n      // a=candidate:3289912957 2 tcp 1845501695 193.84.77.194 60017 typ srflx raddr 192.168.34.75 rport 60017 tcptype passive generation 0 network-id 3 network-cost 10\n      push:'candidates',\n      reg: /^candidate:(\\S*) (\\d*) (\\S*) (\\d*) (\\S*) (\\d*) typ (\\S*)(?: raddr (\\S*) rport (\\d*))?(?: tcptype (\\S*))?(?: generation (\\d*))?(?: network-id (\\d*))?(?: network-cost (\\d*))?/,\n      names: ['foundation', 'component', 'transport', 'priority', 'ip', 'port', 'type', 'raddr', 'rport', 'tcptype', 'generation', 'network-id', 'network-cost'],\n      format: function (o) {\n        var str = 'candidate:%s %d %s %d %s %d typ %s';\n\n        str += (o.raddr != null) ? ' raddr %s rport %d' : '%v%v';\n\n        // NB: candidate has three optional chunks, so %void middles one if it's missing\n        str += (o.tcptype != null) ? ' tcptype %s' : '%v';\n\n        if (o.generation != null) {\n          str += ' generation %d';\n        }\n\n        str += (o['network-id'] != null) ? ' network-id %d' : '%v';\n        str += (o['network-cost'] != null) ? ' network-cost %d' : '%v';\n        return str;\n      }\n    },\n    {\n      // a=end-of-candidates (keep after the candidates line for readability)\n      name: 'endOfCandidates',\n      reg: /^(end-of-candidates)/\n    },\n    {\n      // a=remote-candidates:1 203.0.113.1 54400 2 203.0.113.1 54401 ...\n      name: 'remoteCandidates',\n      reg: /^remote-candidates:(.*)/,\n      format: 'remote-candidates:%s'\n    },\n    {\n      // a=ice-options:google-ice\n      name: 'iceOptions',\n      reg: /^ice-options:(\\S*)/,\n      format: 'ice-options:%s'\n    },\n    {\n      // a=ssrc:2566107569 cname:t9YU8M1UxTF8Y1A1\n      push: 'ssrcs',\n      reg: /^ssrc:(\\d*) ([\\w_-]*)(?::(.*))?/,\n      names: ['id', 'attribute', 'value'],\n      format: function (o) {\n        var str = 'ssrc:%d';\n        if (o.attribute != null) {\n          str += ' %s';\n          if (o.value != null) {\n            str += ':%s';\n          }\n        }\n        return str;\n      }\n    },\n    {\n      // a=ssrc-group:FEC 1 2\n      // a=ssrc-group:FEC-FR 3004364195 1080772241\n      push: 'ssrcGroups',\n      // token-char = %x21 / %x23-27 / %x2A-2B / %x2D-2E / %x30-39 / %x41-5A / %x5E-7E\n      reg: /^ssrc-group:([\\x21\\x23\\x24\\x25\\x26\\x27\\x2A\\x2B\\x2D\\x2E\\w]*) (.*)/,\n      names: ['semantics', 'ssrcs'],\n      format: 'ssrc-group:%s %s'\n    },\n    {\n      // a=msid-semantic: WMS Jvlam5X3SX1OP6pn20zWogvaKJz5Hjf9OnlV\n      name: 'msidSemantic',\n      reg: /^msid-semantic:\\s?(\\w*) (\\S*)/,\n      names: ['semantic', 'token'],\n      format: 'msid-semantic: %s %s' // space after ':' is not accidental\n    },\n    {\n      // a=group:BUNDLE audio video\n      push: 'groups',\n      reg: /^group:(\\w*) (.*)/,\n      names: ['type', 'mids'],\n      format: 'group:%s %s'\n    },\n    {\n      // a=rtcp-mux\n      name: 'rtcpMux',\n      reg: /^(rtcp-mux)/\n    },\n    {\n      // a=rtcp-rsize\n      name: 'rtcpRsize',\n      reg: /^(rtcp-rsize)/\n    },\n    {\n      // a=sctpmap:5000 webrtc-datachannel 1024\n      name: 'sctpmap',\n      reg: /^sctpmap:([\\w_/]*) (\\S*)(?: (\\S*))?/,\n      names: ['sctpmapNumber', 'app', 'maxMessageSize'],\n      format: function (o) {\n        return (o.maxMessageSize != null)\n          ? 'sctpmap:%s %s %s'\n          : 'sctpmap:%s %s';\n      }\n    },\n    {\n      // a=x-google-flag:conference\n      name: 'xGoogleFlag',\n      reg: /^x-google-flag:([^\\s]*)/,\n      format: 'x-google-flag:%s'\n    },\n    {\n      // a=rid:1 send max-width=1280;max-height=720;max-fps=30;depend=0\n      push: 'rids',\n      reg: /^rid:([\\d\\w]+) (\\w+)(?: ([\\S| ]*))?/,\n      names: ['id', 'direction', 'params'],\n      format: function (o) {\n        return (o.params) ? 'rid:%s %s %s' : 'rid:%s %s';\n      }\n    },\n    {\n      // a=imageattr:97 send [x=800,y=640,sar=1.1,q=0.6] [x=480,y=320] recv [x=330,y=250]\n      // a=imageattr:* send [x=800,y=640] recv *\n      // a=imageattr:100 recv [x=320,y=240]\n      push: 'imageattrs',\n      reg: new RegExp(\n        // a=imageattr:97\n        '^imageattr:(\\\\d+|\\\\*)' +\n        // send [x=800,y=640,sar=1.1,q=0.6] [x=480,y=320]\n        '[\\\\s\\\\t]+(send|recv)[\\\\s\\\\t]+(\\\\*|\\\\[\\\\S+\\\\](?:[\\\\s\\\\t]+\\\\[\\\\S+\\\\])*)' +\n        // recv [x=330,y=250]\n        '(?:[\\\\s\\\\t]+(recv|send)[\\\\s\\\\t]+(\\\\*|\\\\[\\\\S+\\\\](?:[\\\\s\\\\t]+\\\\[\\\\S+\\\\])*))?'\n      ),\n      names: ['pt', 'dir1', 'attrs1', 'dir2', 'attrs2'],\n      format: function (o) {\n        return 'imageattr:%s %s %s' + (o.dir2 ? ' %s %s' : '');\n      }\n    },\n    {\n      // a=simulcast:send 1,2,3;~4,~5 recv 6;~7,~8\n      // a=simulcast:recv 1;4,5 send 6;7\n      name: 'simulcast',\n      reg: new RegExp(\n        // a=simulcast:\n        '^simulcast:' +\n        // send 1,2,3;~4,~5\n        '(send|recv) ([a-zA-Z0-9\\\\-_~;,]+)' +\n        // space + recv 6;~7,~8\n        '(?:\\\\s?(send|recv) ([a-zA-Z0-9\\\\-_~;,]+))?' +\n        // end\n        '$'\n      ),\n      names: ['dir1', 'list1', 'dir2', 'list2'],\n      format: function (o) {\n        return 'simulcast:%s %s' + (o.dir2 ? ' %s %s' : '');\n      }\n    },\n    {\n      // old simulcast draft 03 (implemented by Firefox)\n      //   https://tools.ietf.org/html/draft-ietf-mmusic-sdp-simulcast-03\n      // a=simulcast: recv pt=97;98 send pt=97\n      // a=simulcast: send rid=5;6;7 paused=6,7\n      name: 'simulcast_03',\n      reg: /^simulcast:[\\s\\t]+([\\S+\\s\\t]+)$/,\n      names: ['value'],\n      format: 'simulcast: %s'\n    },\n    {\n      // a=framerate:25\n      // a=framerate:29.97\n      name: 'framerate',\n      reg: /^framerate:(\\d+(?:$|\\.\\d+))/,\n      format: 'framerate:%s'\n    },\n    {\n      // RFC4570\n      // a=source-filter: incl IN IP4 239.5.2.31 10.1.15.5\n      name: 'sourceFilter',\n      reg: /^source-filter: *(excl|incl) (\\S*) (IP4|IP6|\\*) (\\S*) (.*)/,\n      names: ['filterMode', 'netType', 'addressTypes', 'destAddress', 'srcList'],\n      format: 'source-filter: %s %s %s %s %s'\n    },\n    {\n      // a=bundle-only\n      name: 'bundleOnly',\n      reg: /^(bundle-only)/\n    },\n    {\n      // a=label:1\n      name: 'label',\n      reg: /^label:(.+)/,\n      format: 'label:%s'\n    },\n    {\n      // RFC version 26 for SCTP over DTLS\n      // https://tools.ietf.org/html/draft-ietf-mmusic-sctp-sdp-26#section-5\n      name: 'sctpPort',\n      reg: /^sctp-port:(\\d+)$/,\n      format: 'sctp-port:%s'\n    },\n    {\n      // RFC version 26 for SCTP over DTLS\n      // https://tools.ietf.org/html/draft-ietf-mmusic-sctp-sdp-26#section-6\n      name: 'maxMessageSize',\n      reg: /^max-message-size:(\\d+)$/,\n      format: 'max-message-size:%s'\n    },\n    {\n      // RFC7273\n      // a=ts-refclk:ptp=IEEE1588-2008:39-A7-94-FF-FE-07-CB-D0:37\n      push:'tsRefClocks',\n      reg: /^ts-refclk:([^\\s=]*)(?:=(\\S*))?/,\n      names: ['clksrc', 'clksrcExt'],\n      format: function (o) {\n        return 'ts-refclk:%s' + (o.clksrcExt != null ? '=%s' : '');\n      }\n    },\n    {\n      // RFC7273\n      // a=mediaclk:direct=963214424\n      name:'mediaClk',\n      reg: /^mediaclk:(?:id=(\\S*))? *([^\\s=]*)(?:=(\\S*))?(?: *rate=(\\d+)\\/(\\d+))?/,\n      names: ['id', 'mediaClockName', 'mediaClockValue', 'rateNumerator', 'rateDenominator'],\n      format: function (o) {\n        var str = 'mediaclk:';\n        str += (o.id != null ? 'id=%s %s' : '%v%s');\n        str += (o.mediaClockValue != null ? '=%s' : '');\n        str += (o.rateNumerator != null ? ' rate=%s' : '');\n        str += (o.rateDenominator != null ? '/%s' : '');\n        return str;\n      }\n    },\n    {\n      // a=keywds:keywords\n      name: 'keywords',\n      reg: /^keywds:(.+)$/,\n      format: 'keywds:%s'\n    },\n    {\n      // a=content:main\n      name: 'content',\n      reg: /^content:(.+)/,\n      format: 'content:%s'\n    },\n    // BFCP https://tools.ietf.org/html/rfc4583\n    {\n      // a=floorctrl:c-s\n      name: 'bfcpFloorCtrl',\n      reg: /^floorctrl:(c-only|s-only|c-s)/,\n      format: 'floorctrl:%s'\n    },\n    {\n      // a=confid:1\n      name: 'bfcpConfId',\n      reg: /^confid:(\\d+)/,\n      format: 'confid:%s'\n    },\n    {\n      // a=userid:1\n      name: 'bfcpUserId',\n      reg: /^userid:(\\d+)/,\n      format: 'userid:%s'\n    },\n    {\n      // a=floorid:1\n      name: 'bfcpFloorId',\n      reg: /^floorid:(.+) (?:m-stream|mstrm):(.+)/,\n      names: ['id', 'mStream'],\n      format: 'floorid:%s mstrm:%s'\n    },\n    {\n      // any a= that we don't understand is kept verbatim on media.invalid\n      push: 'invalid',\n      names: ['value']\n    }\n  ]\n};\n\n// set sensible defaults to avoid polluting the grammar with boring details\nObject.keys(grammar).forEach(function (key) {\n  var objs = grammar[key];\n  objs.forEach(function (obj) {\n    if (!obj.reg) {\n      obj.reg = /(.*)/;\n    }\n    if (!obj.format) {\n      obj.format = '%s';\n    }\n  });\n});\n","var toIntIfInt = function (v) {\n  return String(Number(v)) === v ? Number(v) : v;\n};\n\nvar attachProperties = function (match, location, names, rawName) {\n  if (rawName \u0026\u0026 !names) {\n    location[rawName] = toIntIfInt(match[1]);\n  }\n  else {\n    for (var i = 0; i \u003c names.length; i += 1) {\n      if (match[i+1] != null) {\n        location[names[i]] = toIntIfInt(match[i+1]);\n      }\n    }\n  }\n};\n\nvar parseReg = function (obj, location, content) {\n  var needsBlank = obj.name \u0026\u0026 obj.names;\n  if (obj.push \u0026\u0026 !location[obj.push]) {\n    location[obj.push] = [];\n  }\n  else if (needsBlank \u0026\u0026 !location[obj.name]) {\n    location[obj.name] = {};\n  }\n  var keyLocation = obj.push ?\n    {} :  // blank object that will be pushed\n    needsBlank ? location[obj.name] : location; // otherwise, named location or root\n\n  attachProperties(content.match(obj.reg), keyLocation, obj.names, obj.name);\n\n  if (obj.push) {\n    location[obj.push].push(keyLocation);\n  }\n};\n\nvar grammar = require('./grammar');\nvar validLine = RegExp.prototype.test.bind(/^([a-z])=(.*)/);\n\nexports.parse = function (sdp) {\n  var session = {}\n    , media = []\n    , location = session; // points at where properties go under (one of the above)\n\n  // parse lines we understand\n  sdp.split(/(\\r\\n|\\r|\\n)/).filter(validLine).forEach(function (l) {\n    var type = l[0];\n    var content = l.slice(2);\n    if (type === 'm') {\n      media.push({rtp: [], fmtp: []});\n      location = media[media.length-1]; // point at latest media line\n    }\n\n    for (var j = 0; j \u003c (grammar[type] || []).length; j += 1) {\n      var obj = grammar[type][j];\n      if (obj.reg.test(content)) {\n        return parseReg(obj, location, content);\n      }\n    }\n  });\n\n  session.media = media; // link it up\n  return session;\n};\n\nvar paramReducer = function (acc, expr) {\n  var s = expr.split(/=(.+)/, 2);\n  if (s.length === 2) {\n    acc[s[0]] = toIntIfInt(s[1]);\n  } else if (s.length === 1 \u0026\u0026 expr.length \u003e 1) {\n    acc[s[0]] = undefined;\n  }\n  return acc;\n};\n\nexports.parseParams = function (str) {\n  return str.split(/;\\s?/).reduce(paramReducer, {});\n};\n\n// For backward compatibility - alias will be removed in 3.0.0\nexports.parseFmtpConfig = exports.parseParams;\n\nexports.parsePayloads = function (str) {\n  return str.toString().split(' ').map(Number);\n};\n\nexports.parseRemoteCandidates = function (str) {\n  var candidates = [];\n  var parts = str.split(' ').map(toIntIfInt);\n  for (var i = 0; i \u003c parts.length; i += 3) {\n    candidates.push({\n      component: parts[i],\n      ip: parts[i + 1],\n      port: parts[i + 2]\n    });\n  }\n  return candidates;\n};\n\nexports.parseImageAttributes = function (str) {\n  return str.split(' ').map(function (item) {\n    return item.substring(1, item.length-1).split(',').reduce(paramReducer, {});\n  });\n};\n\nexports.parseSimulcastStreamList = function (str) {\n  return str.split(';').map(function (stream) {\n    return stream.split(',').map(function (format) {\n      var scid, paused = false;\n\n      if (format[0] !== '~') {\n        scid = toIntIfInt(format);\n      } else {\n        scid = toIntIfInt(format.substring(1, format.length));\n        paused = true;\n      }\n\n      return {\n        scid: scid,\n        paused: paused\n      };\n    });\n  });\n};\n","var grammar = require('./grammar');\n\n// customized util.format - discards excess arguments and can void middle ones\nvar formatRegExp = /%[sdv%]/g;\nvar format = function (formatStr) {\n  var i = 1;\n  var args = arguments;\n  var len = args.length;\n  return formatStr.replace(formatRegExp, function (x) {\n    if (i \u003e= len) {\n      return x; // missing argument\n    }\n    var arg = args[i];\n    i += 1;\n    switch (x) {\n    case '%%':\n      return '%';\n    case '%s':\n      return String(arg);\n    case '%d':\n      return Number(arg);\n    case '%v':\n      return '';\n    }\n  });\n  // NB: we discard excess arguments - they are typically undefined from makeLine\n};\n\nvar makeLine = function (type, obj, location) {\n  var str = obj.format instanceof Function ?\n    (obj.format(obj.push ? location : location[obj.name])) :\n    obj.format;\n\n  var args = [type + '=' + str];\n  if (obj.names) {\n    for (var i = 0; i \u003c obj.names.length; i += 1) {\n      var n = obj.names[i];\n      if (obj.name) {\n        args.push(location[obj.name][n]);\n      }\n      else { // for mLine and push attributes\n        args.push(location[obj.names[i]]);\n      }\n    }\n  }\n  else {\n    args.push(location[obj.name]);\n  }\n  return format.apply(null, args);\n};\n\n// RFC specified order\n// TODO: extend this with all the rest\nvar defaultOuterOrder = [\n  'v', 'o', 's', 'i',\n  'u', 'e', 'p', 'c',\n  'b', 't', 'r', 'z', 'a'\n];\nvar defaultInnerOrder = ['i', 'c', 'b', 'a'];\n\n\nmodule.exports = function (session, opts) {\n  opts = opts || {};\n  // ensure certain properties exist\n  if (session.version == null) {\n    session.version = 0; // 'v=0' must be there (only defined version atm)\n  }\n  if (session.name == null) {\n    session.name = ' '; // 's= ' must be there if no meaningful name set\n  }\n  session.media.forEach(function (mLine) {\n    if (mLine.payloads == null) {\n      mLine.payloads = '';\n    }\n  });\n\n  var outerOrder = opts.outerOrder || defaultOuterOrder;\n  var innerOrder = opts.innerOrder || defaultInnerOrder;\n  var sdp = [];\n\n  // loop through outerOrder for matching properties on session\n  outerOrder.forEach(function (type) {\n    grammar[type].forEach(function (obj) {\n      if (obj.name in session \u0026\u0026 session[obj.name] != null) {\n        sdp.push(makeLine(type, obj, session));\n      }\n      else if (obj.push in session \u0026\u0026 session[obj.push] != null) {\n        session[obj.push].forEach(function (el) {\n          sdp.push(makeLine(type, obj, el));\n        });\n      }\n    });\n  });\n\n  // then for each media line, follow the innerOrder\n  session.media.forEach(function (mLine) {\n    sdp.push(makeLine('m', grammar.m[0], mLine));\n\n    innerOrder.forEach(function (type) {\n      grammar[type].forEach(function (obj) {\n        if (obj.name in mLine \u0026\u0026 mLine[obj.name] != null) {\n          sdp.push(makeLine(type, obj, mLine));\n        }\n        else if (obj.push in mLine \u0026\u0026 mLine[obj.push] != null) {\n          mLine[obj.push].forEach(function (el) {\n            sdp.push(makeLine(type, obj, el));\n          });\n        }\n      });\n    });\n  });\n\n  return sdp.join('\\r\\n') + '\\r\\n';\n};\n","var parser = require('./parser');\nvar writer = require('./writer');\nvar grammar = require('./grammar');\n\nexports.grammar = grammar;\nexports.write = writer;\nexports.parse = parser.parse;\nexports.parseParams = parser.parseParams;\nexports.parseFmtpConfig = parser.parseFmtpConfig; // Alias of parseParams().\nexports.parsePayloads = parser.parsePayloads;\nexports.parseRemoteCandidates = parser.parseRemoteCandidates;\nexports.parseImageAttributes = parser.parseImageAttributes;\nexports.parseSimulcastStreamList = parser.parseSimulcastStreamList;\n","function r(r,e,n){var i,t,o;void 0===e\u0026\u0026(e=50),void 0===n\u0026\u0026(n={});var a=null!=(i=n.isImmediate)\u0026\u0026i,u=null!=(t=n.callback)\u0026\u0026t,c=n.maxWait,v=Date.now(),l=[];function f(){if(void 0!==c){var r=Date.now()-v;if(r+e\u003e=c)return c-r}return e}var d=function(){var e=[].slice.call(arguments),n=this;return new Promise(function(i,t){var c=a\u0026\u0026void 0===o;if(void 0!==o\u0026\u0026clearTimeout(o),o=setTimeout(function(){if(o=void 0,v=Date.now(),!a){var i=r.apply(n,e);u\u0026\u0026u(i),l.forEach(function(r){return(0,r.resolve)(i)}),l=[]}},f()),c){var d=r.apply(n,e);return u\u0026\u0026u(d),i(d)}l.push({resolve:i,reject:t})})};return d.cancel=function(r){void 0!==o\u0026\u0026clearTimeout(o),l.forEach(function(e){return(0,e.reject)(r)}),l=[]},d}export{r as debounce};\n//# sourceMappingURL=index.esm.js.map\n","import { Mutex } from '@livekit/mutex';\nimport { EventEmitter } from 'events';\nimport type { MediaDescription, SessionDescription } from 'sdp-transform';\nimport { parse, write } from 'sdp-transform';\nimport { debounce } from 'ts-debounce';\nimport log, { LoggerNames, getLogger } from '../logger';\nimport { NegotiationError, UnexpectedConnectionState } from './errors';\nimport type { LoggerOptions } from './types';\nimport { ddExtensionURI, isSVCCodec, isSafari } from './utils';\n\n/** @internal */\ninterface TrackBitrateInfo {\n  cid?: string;\n  transceiver?: RTCRtpTransceiver;\n  codec: string;\n  maxbr: number;\n}\n\n/* The svc codec (av1/vp9) would use a very low bitrate at the begining and\nincrease slowly by the bandwidth estimator until it reach the target bitrate. The\nprocess commonly cost more than 10 seconds cause subscriber will get blur video at\nthe first few seconds. So we use a 70% of target bitrate here as the start bitrate to\neliminate this issue.\n*/\nconst startBitrateForSVC = 0.7;\n\nconst debounceInterval = 20;\n\nexport const PCEvents = {\n  NegotiationStarted: 'negotiationStarted',\n  NegotiationComplete: 'negotiationComplete',\n  RTPVideoPayloadTypes: 'rtpVideoPayloadTypes',\n} as const;\n\n/** @internal */\nexport default class PCTransport extends EventEmitter {\n  private _pc: RTCPeerConnection | null;\n\n  private get pc() {\n    if (!this._pc) {\n      this._pc = this.createPC();\n    }\n    return this._pc;\n  }\n\n  private config?: RTCConfiguration;\n\n  private log = log;\n\n  private loggerOptions: LoggerOptions;\n\n  private ddExtID = 0;\n\n  private latestOfferId: number = 0;\n\n  private offerLock: Mutex;\n\n  pendingCandidates: RTCIceCandidateInit[] = [];\n\n  restartingIce: boolean = false;\n\n  renegotiate: boolean = false;\n\n  trackBitrates: TrackBitrateInfo[] = [];\n\n  remoteStereoMids: string[] = [];\n\n  remoteNackMids: string[] = [];\n\n  onOffer?: (offer: RTCSessionDescriptionInit, offerId: number) =\u003e void;\n\n  onIceCandidate?: (candidate: RTCIceCandidate) =\u003e void;\n\n  onIceCandidateError?: (ev: Event) =\u003e void;\n\n  onConnectionStateChange?: (state: RTCPeerConnectionState) =\u003e void;\n\n  onIceConnectionStateChange?: (state: RTCIceConnectionState) =\u003e void;\n\n  onSignalingStatechange?: (state: RTCSignalingState) =\u003e void;\n\n  onDataChannel?: (ev: RTCDataChannelEvent) =\u003e void;\n\n  onTrack?: (ev: RTCTrackEvent) =\u003e void;\n\n  constructor(config?: RTCConfiguration, loggerOptions: LoggerOptions = {}) {\n    super();\n    this.log = getLogger(loggerOptions.loggerName ?? LoggerNames.PCTransport);\n    this.loggerOptions = loggerOptions;\n    this.config = config;\n    this._pc = this.createPC();\n    this.offerLock = new Mutex();\n  }\n\n  private createPC() {\n    const pc = new RTCPeerConnection(this.config);\n\n    pc.onicecandidate = (ev) =\u003e {\n      if (!ev.candidate) return;\n      this.onIceCandidate?.(ev.candidate);\n    };\n    pc.onicecandidateerror = (ev) =\u003e {\n      this.onIceCandidateError?.(ev);\n    };\n\n    pc.oniceconnectionstatechange = () =\u003e {\n      this.onIceConnectionStateChange?.(pc.iceConnectionState);\n    };\n\n    pc.onsignalingstatechange = () =\u003e {\n      this.onSignalingStatechange?.(pc.signalingState);\n    };\n\n    pc.onconnectionstatechange = () =\u003e {\n      this.onConnectionStateChange?.(pc.connectionState);\n    };\n    pc.ondatachannel = (ev) =\u003e {\n      this.onDataChannel?.(ev);\n    };\n    pc.ontrack = (ev) =\u003e {\n      this.onTrack?.(ev);\n    };\n    return pc;\n  }\n\n  private get logContext() {\n    return {\n      ...this.loggerOptions.loggerContextCb?.(),\n    };\n  }\n\n  get isICEConnected(): boolean {\n    return (\n      this._pc !== null \u0026\u0026\n      (this.pc.iceConnectionState === 'connected' || this.pc.iceConnectionState === 'completed')\n    );\n  }\n\n  async addIceCandidate(candidate: RTCIceCandidateInit): Promise\u003cvoid\u003e {\n    if (this.pc.remoteDescription \u0026\u0026 !this.restartingIce) {\n      return this.pc.addIceCandidate(candidate);\n    }\n    this.pendingCandidates.push(candidate);\n  }\n\n  async setRemoteDescription(sd: RTCSessionDescriptionInit, offerId: number): Promise\u003cboolean\u003e {\n    if (\n      sd.type === 'answer' \u0026\u0026\n      this.latestOfferId \u003e 0 \u0026\u0026\n      offerId \u003e 0 \u0026\u0026\n      offerId !== this.latestOfferId\n    ) {\n      this.log.warn('ignoring answer for old offer', {\n        ...this.logContext,\n        offerId,\n        latestOfferId: this.latestOfferId,\n      });\n      return false;\n    }\n    let mungedSDP: string | undefined = undefined;\n    if (sd.type === 'offer') {\n      let { stereoMids, nackMids } = extractStereoAndNackAudioFromOffer(sd);\n      this.remoteStereoMids = stereoMids;\n      this.remoteNackMids = nackMids;\n    } else if (sd.type === 'answer') {\n      const sdpParsed = parse(sd.sdp ?? '');\n      sdpParsed.media.forEach((media) =\u003e {\n        const mid = getMidString(media.mid!);\n        if (media.type === 'audio') {\n          // mung sdp for opus bitrate settings\n          this.trackBitrates.some((trackbr): boolean =\u003e {\n            if (!trackbr.transceiver || mid != trackbr.transceiver.mid) {\n              return false;\n            }\n\n            let codecPayload = 0;\n            media.rtp.some((rtp): boolean =\u003e {\n              if (rtp.codec.toUpperCase() === trackbr.codec.toUpperCase()) {\n                codecPayload = rtp.payload;\n                return true;\n              }\n              return false;\n            });\n\n            if (codecPayload === 0) {\n              return true;\n            }\n\n            let fmtpFound = false;\n            for (const fmtp of media.fmtp) {\n              if (fmtp.payload === codecPayload) {\n                fmtp.config = fmtp.config\n                  .split(';')\n                  .filter((attr) =\u003e !attr.includes('maxaveragebitrate'))\n                  .join(';');\n                if (trackbr.maxbr \u003e 0) {\n                  fmtp.config += `;maxaveragebitrate=${trackbr.maxbr * 1000}`;\n                }\n                fmtpFound = true;\n                break;\n              }\n            }\n\n            if (!fmtpFound) {\n              if (trackbr.maxbr \u003e 0) {\n                media.fmtp.push({\n                  payload: codecPayload,\n                  config: `maxaveragebitrate=${trackbr.maxbr * 1000}`,\n                });\n              }\n            }\n\n            return true;\n          });\n        }\n      });\n      mungedSDP = write(sdpParsed);\n    }\n    await this.setMungedSDP(sd, mungedSDP, true);\n\n    this.pendingCandidates.forEach((candidate) =\u003e {\n      this.pc.addIceCandidate(candidate);\n    });\n    this.pendingCandidates = [];\n    this.restartingIce = false;\n\n    if (this.renegotiate) {\n      this.renegotiate = false;\n      await this.createAndSendOffer();\n    } else if (sd.type === 'answer') {\n      this.emit(PCEvents.NegotiationComplete);\n      if (sd.sdp) {\n        const sdpParsed = parse(sd.sdp);\n        sdpParsed.media.forEach((media) =\u003e {\n          if (media.type === 'video') {\n            this.emit(PCEvents.RTPVideoPayloadTypes, media.rtp);\n          }\n        });\n      }\n    }\n    return true;\n  }\n\n  // debounced negotiate interface\n  negotiate = debounce(async (onError?: (e: Error) =\u003e void) =\u003e {\n    this.emit(PCEvents.NegotiationStarted);\n    try {\n      await this.createAndSendOffer();\n    } catch (e) {\n      if (onError) {\n        onError(e as Error);\n      } else {\n        throw e;\n      }\n    }\n  }, debounceInterval);\n\n  async createAndSendOffer(options?: RTCOfferOptions) {\n    const unlock = await this.offerLock.lock();\n\n    try {\n      if (this.onOffer === undefined) {\n        return;\n      }\n\n      if (options?.iceRestart) {\n        this.log.debug('restarting ICE', this.logContext);\n        this.restartingIce = true;\n      }\n\n      if (this._pc \u0026\u0026 this._pc.signalingState === 'have-local-offer') {\n        // we're waiting for the peer to accept our offer, so we'll just wait\n        // the only exception to this is when ICE restart is needed\n        const currentSD = this._pc.remoteDescription;\n        if (options?.iceRestart \u0026\u0026 currentSD) {\n          // TODO: handle when ICE restart is needed but we don't have a remote description\n          // the best thing to do is to recreate the peerconnection\n          await this._pc.setRemoteDescription(currentSD);\n        } else {\n          this.renegotiate = true;\n          return;\n        }\n      } else if (!this._pc || this._pc.signalingState === 'closed') {\n        this.log.warn('could not createOffer with closed peer connection', this.logContext);\n        return;\n      }\n\n      // actually negotiate\n      this.log.debug('starting to negotiate', this.logContext);\n      // increase the offer id at the start to ensure the offer is always \u003e 0 so that we can use 0 as a default value for legacy behavior\n      const offerId = this.latestOfferId + 1;\n      this.latestOfferId = offerId;\n      const offer = await this.pc.createOffer(options);\n      this.log.debug('original offer', { sdp: offer.sdp, ...this.logContext });\n\n      const sdpParsed = parse(offer.sdp ?? '');\n      sdpParsed.media.forEach((media) =\u003e {\n        ensureIPAddrMatchVersion(media);\n        if (media.type === 'audio') {\n          ensureAudioNackAndStereo(media, [], []);\n        } else if (media.type === 'video') {\n          this.trackBitrates.some((trackbr): boolean =\u003e {\n            if (!media.msid || !trackbr.cid || !media.msid.includes(trackbr.cid)) {\n              return false;\n            }\n\n            let codecPayload = 0;\n            media.rtp.some((rtp): boolean =\u003e {\n              if (rtp.codec.toUpperCase() === trackbr.codec.toUpperCase()) {\n                codecPayload = rtp.payload;\n                return true;\n              }\n              return false;\n            });\n\n            if (codecPayload === 0) {\n              return true;\n            }\n\n            if (isSVCCodec(trackbr.codec) \u0026\u0026 !isSafari()) {\n              this.ensureVideoDDExtensionForSVC(media, sdpParsed);\n            }\n\n            // TODO: av1 slow starting issue already fixed in chrome 124, clean this after some versions\n            // mung sdp for av1 bitrate setting that can't apply by sendEncoding\n            if (trackbr.codec !== 'av1') {\n              return true;\n            }\n\n            const startBitrate = Math.round(trackbr.maxbr * startBitrateForSVC);\n\n            for (const fmtp of media.fmtp) {\n              if (fmtp.payload === codecPayload) {\n                // if another track's fmtp already is set, we cannot override the bitrate\n                // this has the unfortunate consequence of being forced to use the\n                // initial track's bitrate for all tracks\n                if (!fmtp.config.includes('x-google-start-bitrate')) {\n                  fmtp.config += `;x-google-start-bitrate=${startBitrate}`;\n                }\n                break;\n              }\n            }\n            return true;\n          });\n        }\n      });\n      if (this.latestOfferId \u003e offerId) {\n        this.log.warn('latestOfferId mismatch', {\n          ...this.logContext,\n          latestOfferId: this.latestOfferId,\n          offerId,\n        });\n        return;\n      }\n      await this.setMungedSDP(offer, write(sdpParsed));\n      this.onOffer(offer, this.latestOfferId);\n    } finally {\n      unlock();\n    }\n  }\n\n  async createAndSetAnswer(): Promise\u003cRTCSessionDescriptionInit\u003e {\n    const answer = await this.pc.createAnswer();\n    const sdpParsed = parse(answer.sdp ?? '');\n    sdpParsed.media.forEach((media) =\u003e {\n      ensureIPAddrMatchVersion(media);\n      if (media.type === 'audio') {\n        ensureAudioNackAndStereo(media, this.remoteStereoMids, this.remoteNackMids);\n      }\n    });\n    await this.setMungedSDP(answer, write(sdpParsed));\n    return answer;\n  }\n\n  createDataChannel(label: string, dataChannelDict: RTCDataChannelInit) {\n    return this.pc.createDataChannel(label, dataChannelDict);\n  }\n\n  addTransceiver(mediaStreamTrack: MediaStreamTrack, transceiverInit: RTCRtpTransceiverInit) {\n    return this.pc.addTransceiver(mediaStreamTrack, transceiverInit);\n  }\n\n  addTrack(track: MediaStreamTrack) {\n    if (!this._pc) {\n      throw new UnexpectedConnectionState('PC closed, cannot add track');\n    }\n    return this._pc.addTrack(track);\n  }\n\n  setTrackCodecBitrate(info: TrackBitrateInfo) {\n    this.trackBitrates.push(info);\n  }\n\n  setConfiguration(rtcConfig: RTCConfiguration) {\n    if (!this._pc) {\n      throw new UnexpectedConnectionState('PC closed, cannot configure');\n    }\n    return this._pc?.setConfiguration(rtcConfig);\n  }\n\n  canRemoveTrack(): boolean {\n    return !!this._pc?.removeTrack;\n  }\n\n  removeTrack(sender: RTCRtpSender) {\n    return this._pc?.removeTrack(sender);\n  }\n\n  getConnectionState() {\n    return this._pc?.connectionState ?? 'closed';\n  }\n\n  getICEConnectionState() {\n    return this._pc?.iceConnectionState ?? 'closed';\n  }\n\n  getSignallingState() {\n    return this._pc?.signalingState ?? 'closed';\n  }\n\n  getTransceivers() {\n    return this._pc?.getTransceivers() ?? [];\n  }\n\n  getSenders() {\n    return this._pc?.getSenders() ?? [];\n  }\n\n  getLocalDescription() {\n    return this._pc?.localDescription;\n  }\n\n  getRemoteDescription() {\n    return this.pc?.remoteDescription;\n  }\n\n  getStats() {\n    return this.pc.getStats();\n  }\n\n  async getConnectedAddress(): Promise\u003cstring | undefined\u003e {\n    if (!this._pc) {\n      return;\n    }\n    let selectedCandidatePairId = '';\n    const candidatePairs = new Map\u003cstring, RTCIceCandidatePairStats\u003e();\n    // id -\u003e candidate ip\n    const candidates = new Map\u003cstring, string\u003e();\n    const stats: RTCStatsReport = await this._pc.getStats();\n    stats.forEach((v) =\u003e {\n      switch (v.type) {\n        case 'transport':\n          selectedCandidatePairId = v.selectedCandidatePairId;\n          break;\n        case 'candidate-pair':\n          if (selectedCandidatePairId === '' \u0026\u0026 v.selected) {\n            selectedCandidatePairId = v.id;\n          }\n          candidatePairs.set(v.id, v);\n          break;\n        case 'remote-candidate':\n          candidates.set(v.id, `${v.address}:${v.port}`);\n          break;\n        default:\n      }\n    });\n\n    if (selectedCandidatePairId === '') {\n      return undefined;\n    }\n    const selectedID = candidatePairs.get(selectedCandidatePairId)?.remoteCandidateId;\n    if (selectedID === undefined) {\n      return undefined;\n    }\n    return candidates.get(selectedID);\n  }\n\n  close = () =\u003e {\n    if (!this._pc) {\n      return;\n    }\n    this._pc.close();\n    this._pc.onconnectionstatechange = null;\n    this._pc.oniceconnectionstatechange = null;\n    this._pc.onicegatheringstatechange = null;\n    this._pc.ondatachannel = null;\n    this._pc.onnegotiationneeded = null;\n    this._pc.onsignalingstatechange = null;\n    this._pc.onicecandidate = null;\n    this._pc.ondatachannel = null;\n    this._pc.ontrack = null;\n    this._pc.onconnectionstatechange = null;\n    this._pc.oniceconnectionstatechange = null;\n    this._pc = null;\n  };\n\n  private async setMungedSDP(sd: RTCSessionDescriptionInit, munged?: string, remote?: boolean) {\n    if (munged) {\n      const originalSdp = sd.sdp;\n      sd.sdp = munged;\n      try {\n        this.log.debug(\n          `setting munged ${remote ? 'remote' : 'local'} description`,\n          this.logContext,\n        );\n        if (remote) {\n          await this.pc.setRemoteDescription(sd);\n        } else {\n          await this.pc.setLocalDescription(sd);\n        }\n        return;\n      } catch (e) {\n        this.log.warn(`not able to set ${sd.type}, falling back to unmodified sdp`, {\n          ...this.logContext,\n          error: e,\n          sdp: munged,\n        });\n        sd.sdp = originalSdp;\n      }\n    }\n\n    try {\n      if (remote) {\n        await this.pc.setRemoteDescription(sd);\n      } else {\n        await this.pc.setLocalDescription(sd);\n      }\n    } catch (e) {\n      let msg = 'unknown error';\n      if (e instanceof Error) {\n        msg = e.message;\n      } else if (typeof e === 'string') {\n        msg = e;\n      }\n\n      const fields: any = {\n        error: msg,\n        sdp: sd.sdp,\n      };\n      if (!remote \u0026\u0026 this.pc.remoteDescription) {\n        fields.remoteSdp = this.pc.remoteDescription;\n      }\n      this.log.error(`unable to set ${sd.type}`, { ...this.logContext, fields });\n      throw new NegotiationError(msg);\n    }\n  }\n\n  private ensureVideoDDExtensionForSVC(\n    media: {\n      type: string;\n      port: number;\n      protocol: string;\n      payloads?: string | undefined;\n    } \u0026 MediaDescription,\n    sdp: SessionDescription,\n  ) {\n    const ddFound = media.ext?.some((ext): boolean =\u003e {\n      if (ext.uri === ddExtensionURI) {\n        return true;\n      }\n      return false;\n    });\n\n    if (!ddFound) {\n      if (this.ddExtID === 0) {\n        let maxID = 0;\n        sdp.media.forEach((m) =\u003e {\n          if (m.type !== 'video') {\n            return;\n          }\n          m.ext?.forEach((ext) =\u003e {\n            if (ext.value \u003e maxID) {\n              maxID = ext.value;\n            }\n          });\n        });\n        this.ddExtID = maxID + 1;\n      }\n      media.ext?.push({\n        value: this.ddExtID,\n        uri: ddExtensionURI,\n      });\n    }\n  }\n}\n\nfunction ensureAudioNackAndStereo(\n  media: {\n    type: string;\n    port: number;\n    protocol: string;\n    payloads?: string | undefined;\n  } \u0026 MediaDescription,\n  stereoMids: string[],\n  nackMids: string[],\n) {\n  // sdp-transform types don't include number however the parser outputs mids as numbers in some cases\n  const mid = getMidString(media.mid!);\n\n  // found opus codec to add nack fb\n  let opusPayload = 0;\n  media.rtp.some((rtp): boolean =\u003e {\n    if (rtp.codec === 'opus') {\n      opusPayload = rtp.payload;\n      return true;\n    }\n    return false;\n  });\n\n  // add nack rtcpfb if not exist\n  if (opusPayload \u003e 0) {\n    if (!media.rtcpFb) {\n      media.rtcpFb = [];\n    }\n\n    if (\n      nackMids.includes(mid) \u0026\u0026\n      !media.rtcpFb.some((fb) =\u003e fb.payload === opusPayload \u0026\u0026 fb.type === 'nack')\n    ) {\n      media.rtcpFb.push({\n        payload: opusPayload,\n        type: 'nack',\n      });\n    }\n\n    if (stereoMids.includes(mid)) {\n      media.fmtp.some((fmtp): boolean =\u003e {\n        if (fmtp.payload === opusPayload) {\n          if (!fmtp.config.includes('stereo=1')) {\n            fmtp.config += ';stereo=1';\n          }\n          return true;\n        }\n        return false;\n      });\n    }\n  }\n}\n\nfunction extractStereoAndNackAudioFromOffer(offer: RTCSessionDescriptionInit): {\n  stereoMids: string[];\n  nackMids: string[];\n} {\n  const stereoMids: string[] = [];\n  const nackMids: string[] = [];\n  const sdpParsed = parse(offer.sdp ?? '');\n  let opusPayload = 0;\n  sdpParsed.media.forEach((media) =\u003e {\n    const mid = getMidString(media.mid!);\n    if (media.type === 'audio') {\n      media.rtp.some((rtp): boolean =\u003e {\n        if (rtp.codec === 'opus') {\n          opusPayload = rtp.payload;\n          return true;\n        }\n        return false;\n      });\n\n      if (media.rtcpFb?.some((fb) =\u003e fb.payload === opusPayload \u0026\u0026 fb.type === 'nack')) {\n        nackMids.push(mid);\n      }\n\n      media.fmtp.some((fmtp): boolean =\u003e {\n        if (fmtp.payload === opusPayload) {\n          if (fmtp.config.includes('sprop-stereo=1')) {\n            stereoMids.push(mid);\n          }\n          return true;\n        }\n        return false;\n      });\n    }\n  });\n  return { stereoMids, nackMids };\n}\n\nfunction ensureIPAddrMatchVersion(media: MediaDescription) {\n  // Chrome could generate sdp with c = IN IP4 \u003cipv6 addr\u003e\n  // in edge case and return error when set sdp.This is not a\n  // sdk error but correct it if the issue detected.\n  if (media.connection) {\n    const isV6 = media.connection.ip.indexOf(':') \u003e= 0;\n    if ((media.connection.version === 4 \u0026\u0026 isV6) || (media.connection.version === 6 \u0026\u0026 !isV6)) {\n      // fallback to dummy address\n      media.connection.ip = '0.0.0.0';\n      media.connection.version = 4;\n    }\n  }\n}\n\nfunction getMidString(mid: string | number) {\n  return typeof mid === 'number' ? mid.toFixed(0) : mid;\n}\n","import type { InternalRoomConnectOptions, InternalRoomOptions } from '../options';\nimport DefaultReconnectPolicy from './DefaultReconnectPolicy';\nimport type {\n  AudioCaptureOptions,\n  TrackPublishDefaults,\n  VideoCaptureOptions,\n} from './track/options';\nimport { AudioPresets, ScreenSharePresets, VideoPresets } from './track/options';\n\nexport const defaultVideoCodec = 'vp8';\n\nexport const publishDefaults: TrackPublishDefaults = {\n  audioPreset: AudioPresets.music,\n  dtx: true,\n  red: true,\n  forceStereo: false,\n  simulcast: true,\n  screenShareEncoding: ScreenSharePresets.h1080fps15.encoding,\n  stopMicTrackOnMute: false,\n  videoCodec: defaultVideoCodec,\n  backupCodec: true,\n  preConnectBuffer: false,\n} as const;\n\nexport const audioDefaults: AudioCaptureOptions = {\n  deviceId: { ideal: 'default' },\n  autoGainControl: true,\n  echoCancellation: true,\n  noiseSuppression: true,\n  voiceIsolation: true,\n};\n\nexport const videoDefaults: VideoCaptureOptions = {\n  deviceId: { ideal: 'default' },\n  resolution: VideoPresets.h720.resolution,\n};\n\nexport const roomOptionDefaults: InternalRoomOptions = {\n  adaptiveStream: false,\n  dynacast: false,\n  stopLocalTrackOnUnpublish: true,\n  reconnectPolicy: new DefaultReconnectPolicy(),\n  disconnectOnPageLeave: true,\n  webAudioMix: false,\n} as const;\n\nexport const roomConnectOptionDefaults: InternalRoomConnectOptions = {\n  autoSubscribe: true,\n  maxRetries: 1,\n  peerConnectionTimeout: 15_000,\n  websocketTimeout: 15_000,\n} as const;\n","import { Mutex } from '@livekit/mutex';\nimport { SignalTarget } from '@livekit/protocol';\nimport log, { LoggerNames, getLogger } from '../logger';\nimport PCTransport, { PCEvents } from './PCTransport';\nimport { roomConnectOptionDefaults } from './defaults';\nimport { ConnectionError, ConnectionErrorReason } from './errors';\nimport CriticalTimers from './timers';\nimport type { LoggerOptions } from './types';\nimport { sleep } from './utils';\n\nexport enum PCTransportState {\n  NEW,\n  CONNECTING,\n  CONNECTED,\n  FAILED,\n  CLOSING,\n  CLOSED,\n}\n\nexport class PCTransportManager {\n  public publisher: PCTransport;\n\n  public subscriber: PCTransport;\n\n  public peerConnectionTimeout: number = roomConnectOptionDefaults.peerConnectionTimeout;\n\n  public get needsPublisher() {\n    return this.isPublisherConnectionRequired;\n  }\n\n  public get needsSubscriber() {\n    return this.isSubscriberConnectionRequired;\n  }\n\n  public get currentState() {\n    return this.state;\n  }\n\n  public onStateChange?: (\n    state: PCTransportState,\n    pubState: RTCPeerConnectionState,\n    subState: RTCPeerConnectionState,\n  ) =\u003e void;\n\n  public onIceCandidate?: (ev: RTCIceCandidate, target: SignalTarget) =\u003e void;\n\n  public onDataChannel?: (ev: RTCDataChannelEvent) =\u003e void;\n\n  public onTrack?: (ev: RTCTrackEvent) =\u003e void;\n\n  public onPublisherOffer?: (offer: RTCSessionDescriptionInit, offerId: number) =\u003e void;\n\n  private isPublisherConnectionRequired: boolean;\n\n  private isSubscriberConnectionRequired: boolean;\n\n  private state: PCTransportState;\n\n  private connectionLock: Mutex;\n\n  private remoteOfferLock: Mutex;\n\n  private log = log;\n\n  private loggerOptions: LoggerOptions;\n\n  constructor(\n    rtcConfig: RTCConfiguration,\n    subscriberPrimary: boolean,\n    loggerOptions: LoggerOptions,\n  ) {\n    this.log = getLogger(loggerOptions.loggerName ?? LoggerNames.PCManager);\n    this.loggerOptions = loggerOptions;\n\n    this.isPublisherConnectionRequired = !subscriberPrimary;\n    this.isSubscriberConnectionRequired = subscriberPrimary;\n    this.publisher = new PCTransport(rtcConfig, loggerOptions);\n    this.subscriber = new PCTransport(rtcConfig, loggerOptions);\n\n    this.publisher.onConnectionStateChange = this.updateState;\n    this.subscriber.onConnectionStateChange = this.updateState;\n    this.publisher.onIceConnectionStateChange = this.updateState;\n    this.subscriber.onIceConnectionStateChange = this.updateState;\n    this.publisher.onSignalingStatechange = this.updateState;\n    this.subscriber.onSignalingStatechange = this.updateState;\n    this.publisher.onIceCandidate = (candidate) =\u003e {\n      this.onIceCandidate?.(candidate, SignalTarget.PUBLISHER);\n    };\n    this.subscriber.onIceCandidate = (candidate) =\u003e {\n      this.onIceCandidate?.(candidate, SignalTarget.SUBSCRIBER);\n    };\n    // in subscriber primary mode, server side opens sub data channels.\n    this.subscriber.onDataChannel = (ev) =\u003e {\n      this.onDataChannel?.(ev);\n    };\n    this.subscriber.onTrack = (ev) =\u003e {\n      this.onTrack?.(ev);\n    };\n    this.publisher.onOffer = (offer, offerId) =\u003e {\n      this.onPublisherOffer?.(offer, offerId);\n    };\n\n    this.state = PCTransportState.NEW;\n\n    this.connectionLock = new Mutex();\n    this.remoteOfferLock = new Mutex();\n  }\n\n  private get logContext() {\n    return {\n      ...this.loggerOptions.loggerContextCb?.(),\n    };\n  }\n\n  requirePublisher(require = true) {\n    this.isPublisherConnectionRequired = require;\n    this.updateState();\n  }\n\n  requireSubscriber(require = true) {\n    this.isSubscriberConnectionRequired = require;\n    this.updateState();\n  }\n\n  createAndSendPublisherOffer(options?: RTCOfferOptions) {\n    return this.publisher.createAndSendOffer(options);\n  }\n\n  setPublisherAnswer(sd: RTCSessionDescriptionInit, offerId: number) {\n    return this.publisher.setRemoteDescription(sd, offerId);\n  }\n\n  removeTrack(sender: RTCRtpSender) {\n    return this.publisher.removeTrack(sender);\n  }\n\n  async close() {\n    if (this.publisher \u0026\u0026 this.publisher.getSignallingState() !== 'closed') {\n      const publisher = this.publisher;\n      for (const sender of publisher.getSenders()) {\n        try {\n          // TODO: react-native-webrtc doesn't have removeTrack yet.\n          if (publisher.canRemoveTrack()) {\n            publisher.removeTrack(sender);\n          }\n        } catch (e) {\n          this.log.warn('could not removeTrack', { ...this.logContext, error: e });\n        }\n      }\n    }\n    await Promise.all([this.publisher.close(), this.subscriber.close()]);\n    this.updateState();\n  }\n\n  async triggerIceRestart() {\n    this.subscriber.restartingIce = true;\n    // only restart publisher if it's needed\n    if (this.needsPublisher) {\n      await this.createAndSendPublisherOffer({ iceRestart: true });\n    }\n  }\n\n  async addIceCandidate(candidate: RTCIceCandidateInit, target: SignalTarget) {\n    if (target === SignalTarget.PUBLISHER) {\n      await this.publisher.addIceCandidate(candidate);\n    } else {\n      await this.subscriber.addIceCandidate(candidate);\n    }\n  }\n\n  async createSubscriberAnswerFromOffer(sd: RTCSessionDescriptionInit, offerId: number) {\n    this.log.debug('received server offer', {\n      ...this.logContext,\n      RTCSdpType: sd.type,\n      sdp: sd.sdp,\n      signalingState: this.subscriber.getSignallingState().toString(),\n    });\n    const unlock = await this.remoteOfferLock.lock();\n    try {\n      const success = await this.subscriber.setRemoteDescription(sd, offerId);\n      if (!success) {\n        return undefined;\n      }\n\n      // answer the offer\n      const answer = await this.subscriber.createAndSetAnswer();\n      return answer;\n    } finally {\n      unlock();\n    }\n  }\n\n  updateConfiguration(config: RTCConfiguration, iceRestart?: boolean) {\n    this.publisher.setConfiguration(config);\n    this.subscriber.setConfiguration(config);\n    if (iceRestart) {\n      this.triggerIceRestart();\n    }\n  }\n\n  async ensurePCTransportConnection(abortController?: AbortController, timeout?: number) {\n    const unlock = await this.connectionLock.lock();\n    try {\n      if (\n        this.isPublisherConnectionRequired \u0026\u0026\n        this.publisher.getConnectionState() !== 'connected' \u0026\u0026\n        this.publisher.getConnectionState() !== 'connecting'\n      ) {\n        this.log.debug('negotiation required, start negotiating', this.logContext);\n        this.publisher.negotiate();\n      }\n      await Promise.all(\n        this.requiredTransports?.map((transport) =\u003e\n          this.ensureTransportConnected(transport, abortController, timeout),\n        ),\n      );\n    } finally {\n      unlock();\n    }\n  }\n\n  async negotiate(abortController: AbortController) {\n    return new Promise\u003cvoid\u003e(async (resolve, reject) =\u003e {\n      const negotiationTimeout = setTimeout(() =\u003e {\n        reject('negotiation timed out');\n      }, this.peerConnectionTimeout);\n\n      const abortHandler = () =\u003e {\n        clearTimeout(negotiationTimeout);\n        reject('negotiation aborted');\n      };\n\n      abortController.signal.addEventListener('abort', abortHandler);\n      this.publisher.once(PCEvents.NegotiationStarted, () =\u003e {\n        if (abortController.signal.aborted) {\n          return;\n        }\n        this.publisher.once(PCEvents.NegotiationComplete, () =\u003e {\n          clearTimeout(negotiationTimeout);\n          resolve();\n        });\n      });\n\n      await this.publisher.negotiate((e) =\u003e {\n        clearTimeout(negotiationTimeout);\n        reject(e);\n      });\n    });\n  }\n\n  addPublisherTransceiver(track: MediaStreamTrack, transceiverInit: RTCRtpTransceiverInit) {\n    return this.publisher.addTransceiver(track, transceiverInit);\n  }\n\n  addPublisherTrack(track: MediaStreamTrack) {\n    return this.publisher.addTrack(track);\n  }\n\n  createPublisherDataChannel(label: string, dataChannelDict: RTCDataChannelInit) {\n    return this.publisher.createDataChannel(label, dataChannelDict);\n  }\n\n  /**\n   * Returns the first required transport's address if no explicit target is specified\n   */\n  getConnectedAddress(target?: SignalTarget) {\n    if (target === SignalTarget.PUBLISHER) {\n      return this.publisher.getConnectedAddress();\n    } else if (target === SignalTarget.SUBSCRIBER) {\n      return this.publisher.getConnectedAddress();\n    }\n    return this.requiredTransports[0].getConnectedAddress();\n  }\n\n  private get requiredTransports() {\n    const transports: PCTransport[] = [];\n    if (this.isPublisherConnectionRequired) {\n      transports.push(this.publisher);\n    }\n    if (this.isSubscriberConnectionRequired) {\n      transports.push(this.subscriber);\n    }\n    return transports;\n  }\n\n  private updateState = () =\u003e {\n    const previousState = this.state;\n\n    const connectionStates = this.requiredTransports.map((tr) =\u003e tr.getConnectionState());\n    if (connectionStates.every((st) =\u003e st === 'connected')) {\n      this.state = PCTransportState.CONNECTED;\n    } else if (connectionStates.some((st) =\u003e st === 'failed')) {\n      this.state = PCTransportState.FAILED;\n    } else if (connectionStates.some((st) =\u003e st === 'connecting')) {\n      this.state = PCTransportState.CONNECTING;\n    } else if (connectionStates.every((st) =\u003e st === 'closed')) {\n      this.state = PCTransportState.CLOSED;\n    } else if (connectionStates.some((st) =\u003e st === 'closed')) {\n      this.state = PCTransportState.CLOSING;\n    } else if (connectionStates.every((st) =\u003e st === 'new')) {\n      this.state = PCTransportState.NEW;\n    }\n\n    if (previousState !== this.state) {\n      this.log.debug(\n        `pc state change: from ${PCTransportState[previousState]} to ${\n          PCTransportState[this.state]\n        }`,\n        this.logContext,\n      );\n      this.onStateChange?.(\n        this.state,\n        this.publisher.getConnectionState(),\n        this.subscriber.getConnectionState(),\n      );\n    }\n  };\n\n  private async ensureTransportConnected(\n    pcTransport: PCTransport,\n    abortController?: AbortController,\n    timeout: number = this.peerConnectionTimeout,\n  ) {\n    const connectionState = pcTransport.getConnectionState();\n    if (connectionState === 'connected') {\n      return;\n    }\n\n    return new Promise\u003cvoid\u003e(async (resolve, reject) =\u003e {\n      const abortHandler = () =\u003e {\n        this.log.warn('abort transport connection', this.logContext);\n        CriticalTimers.clearTimeout(connectTimeout);\n\n        reject(\n          new ConnectionError(\n            'room connection has been cancelled',\n            ConnectionErrorReason.Cancelled,\n          ),\n        );\n      };\n      if (abortController?.signal.aborted) {\n        abortHandler();\n      }\n      abortController?.signal.addEventListener('abort', abortHandler);\n\n      const connectTimeout = CriticalTimers.setTimeout(() =\u003e {\n        abortController?.signal.removeEventListener('abort', abortHandler);\n        reject(\n          new ConnectionError(\n            'could not establish pc connection',\n            ConnectionErrorReason.InternalError,\n          ),\n        );\n      }, timeout);\n\n      while (this.state !== PCTransportState.CONNECTED) {\n        await sleep(50); // FIXME we shouldn't rely on `sleep` in the connection paths, as it invokes `setTimeout` which can be drastically throttled by browser implementations\n        if (abortController?.signal.aborted) {\n          reject(\n            new ConnectionError(\n              'room connection has been cancelled',\n              ConnectionErrorReason.Cancelled,\n            ),\n          );\n          return;\n        }\n      }\n      CriticalTimers.clearTimeout(connectTimeout);\n      abortController?.signal.removeEventListener('abort', abortHandler);\n      resolve();\n    });\n  }\n}\n","// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { RpcError as RpcError_Proto } from '@livekit/protocol';\n\n/** Parameters for initiating an RPC call */\nexport interface PerformRpcParams {\n  /** The `identity` of the destination participant */\n  destinationIdentity: string;\n  /** The method name to call */\n  method: string;\n  /** The method payload */\n  payload: string;\n  /** Timeout for receiving a response after initial connection (milliseconds). Default: 10000 */\n  responseTimeout?: number;\n}\n\n/**\n * Data passed to method handler for incoming RPC invocations\n */\nexport interface RpcInvocationData {\n  /**\n   * The unique request ID. Will match at both sides of the call, useful for debugging or logging.\n   */\n  requestId: string;\n\n  /**\n   * The unique participant identity of the caller.\n   */\n  callerIdentity: string;\n\n  /**\n   * The payload of the request. User-definable format, typically JSON.\n   */\n  payload: string;\n\n  /**\n   * The maximum time the caller will wait for a response.\n   */\n  responseTimeout: number;\n}\n\n/**\n * Specialized error handling for RPC methods.\n *\n * Instances of this type, when thrown in a method handler, will have their `message`\n * serialized and sent across the wire. The sender will receive an equivalent error on the other side.\n *\n * Built-in types are included but developers may use any string, with a max length of 256 bytes.\n */\n\nexport class RpcError extends Error {\n  static MAX_MESSAGE_BYTES = 256;\n\n  static MAX_DATA_BYTES = 15360; // 15 KB\n\n  code: number;\n\n  data?: string;\n\n  /**\n   * Creates an error object with the given code and message, plus an optional data payload.\n   *\n   * If thrown in an RPC method handler, the error will be sent back to the caller.\n   *\n   * Error codes 1001-1999 are reserved for built-in errors (see RpcError.ErrorCode for their meanings).\n   */\n  constructor(code: number, message: string, data?: string) {\n    super(message);\n    this.code = code;\n    this.message = truncateBytes(message, RpcError.MAX_MESSAGE_BYTES);\n    this.data = data ? truncateBytes(data, RpcError.MAX_DATA_BYTES) : undefined;\n  }\n\n  /**\n   * @internal\n   */\n  static fromProto(proto: RpcError_Proto) {\n    return new RpcError(proto.code, proto.message, proto.data);\n  }\n\n  /**\n   * @internal\n   */\n  toProto() {\n    return new RpcError_Proto({\n      code: this.code as number,\n      message: this.message,\n      data: this.data,\n    });\n  }\n\n  static ErrorCode = {\n    APPLICATION_ERROR: 1500,\n    CONNECTION_TIMEOUT: 1501,\n    RESPONSE_TIMEOUT: 1502,\n    RECIPIENT_DISCONNECTED: 1503,\n    RESPONSE_PAYLOAD_TOO_LARGE: 1504,\n    SEND_FAILED: 1505,\n\n    UNSUPPORTED_METHOD: 1400,\n    RECIPIENT_NOT_FOUND: 1401,\n    REQUEST_PAYLOAD_TOO_LARGE: 1402,\n    UNSUPPORTED_SERVER: 1403,\n    UNSUPPORTED_VERSION: 1404,\n  } as const;\n\n  /**\n   * @internal\n   */\n  static ErrorMessage: Record\u003ckeyof typeof RpcError.ErrorCode, string\u003e = {\n    APPLICATION_ERROR: 'Application error in method handler',\n    CONNECTION_TIMEOUT: 'Connection timeout',\n    RESPONSE_TIMEOUT: 'Response timeout',\n    RECIPIENT_DISCONNECTED: 'Recipient disconnected',\n    RESPONSE_PAYLOAD_TOO_LARGE: 'Response payload too large',\n    SEND_FAILED: 'Failed to send',\n\n    UNSUPPORTED_METHOD: 'Method not supported at destination',\n    RECIPIENT_NOT_FOUND: 'Recipient not found',\n    REQUEST_PAYLOAD_TOO_LARGE: 'Request payload too large',\n    UNSUPPORTED_SERVER: 'RPC not supported by server',\n    UNSUPPORTED_VERSION: 'Unsupported RPC version',\n  } as const;\n\n  /**\n   * Creates an error object from the code, with an auto-populated message.\n   *\n   * @internal\n   */\n  static builtIn(key: keyof typeof RpcError.ErrorCode, data?: string): RpcError {\n    return new RpcError(RpcError.ErrorCode[key], RpcError.ErrorMessage[key], data);\n  }\n}\n\n/*\n * Maximum payload size for RPC requests and responses. If a payload exceeds this size,\n * the RPC call will fail with a REQUEST_PAYLOAD_TOO_LARGE(1402) or RESPONSE_PAYLOAD_TOO_LARGE(1504) error.\n */\nexport const MAX_PAYLOAD_BYTES = 15360; // 15 KB\n\n/**\n * @internal\n */\nexport function byteLength(str: string): number {\n  const encoder = new TextEncoder();\n  return encoder.encode(str).length;\n}\n\n/**\n * @internal\n */\nexport function truncateBytes(str: string, maxBytes: number): string {\n  if (byteLength(str) \u003c= maxBytes) {\n    return str;\n  }\n\n  let low = 0;\n  let high = str.length;\n  const encoder = new TextEncoder();\n\n  while (low \u003c high) {\n    const mid = Math.floor((low + high + 1) / 2);\n    if (encoder.encode(str.slice(0, mid)).length \u003c= maxBytes) {\n      low = mid;\n    } else {\n      high = mid - 1;\n    }\n  }\n\n  return str.slice(0, low);\n}\n","export const monitorFrequency = 2000;\n\n// key stats for senders and receivers\ninterface SenderStats {\n  /** number of packets sent */\n  packetsSent?: number;\n\n  /** number of bytes sent */\n  bytesSent?: number;\n\n  /** jitter as perceived by remote */\n  jitter?: number;\n\n  /** packets reported lost by remote */\n  packetsLost?: number;\n\n  /** RTT reported by remote */\n  roundTripTime?: number;\n\n  /** ID of the outbound stream */\n  streamId?: string;\n\n  timestamp: number;\n}\n\nexport interface AudioSenderStats extends SenderStats {\n  type: 'audio';\n}\n\nexport interface VideoSenderStats extends SenderStats {\n  type: 'video';\n\n  firCount: number;\n\n  pliCount: number;\n\n  nackCount: number;\n\n  rid: string;\n\n  frameWidth: number;\n\n  frameHeight: number;\n\n  framesPerSecond: number;\n\n  framesSent: number;\n\n  // bandwidth, cpu, other, none\n  qualityLimitationReason?: string;\n\n  qualityLimitationDurations?: Record\u003cstring, number\u003e;\n\n  qualityLimitationResolutionChanges?: number;\n\n  retransmittedPacketsSent?: number;\n\n  targetBitrate: number;\n}\n\ninterface ReceiverStats {\n  jitterBufferDelay?: number;\n\n  /** packets reported lost by remote */\n  packetsLost?: number;\n\n  /** number of packets sent */\n  packetsReceived?: number;\n\n  bytesReceived?: number;\n\n  streamId?: string;\n\n  jitter?: number;\n\n  timestamp: number;\n}\n\nexport interface AudioReceiverStats extends ReceiverStats {\n  type: 'audio';\n\n  concealedSamples?: number;\n\n  concealmentEvents?: number;\n\n  silentConcealedSamples?: number;\n\n  silentConcealmentEvents?: number;\n\n  totalAudioEnergy?: number;\n\n  totalSamplesDuration?: number;\n}\n\nexport interface VideoReceiverStats extends ReceiverStats {\n  type: 'video';\n\n  framesDecoded: number;\n\n  framesDropped: number;\n\n  framesReceived: number;\n\n  frameWidth?: number;\n\n  frameHeight?: number;\n\n  firCount?: number;\n\n  pliCount?: number;\n\n  nackCount?: number;\n\n  decoderImplementation?: string;\n\n  mimeType?: string;\n}\n\nexport function computeBitrate\u003cT extends ReceiverStats | SenderStats\u003e(\n  currentStats: T,\n  prevStats?: T,\n): number {\n  if (!prevStats) {\n    return 0;\n  }\n  let bytesNow: number | undefined;\n  let bytesPrev: number | undefined;\n  if ('bytesReceived' in currentStats) {\n    bytesNow = (currentStats as ReceiverStats).bytesReceived;\n    bytesPrev = (prevStats as ReceiverStats).bytesReceived;\n  } else if ('bytesSent' in currentStats) {\n    bytesNow = (currentStats as SenderStats).bytesSent;\n    bytesPrev = (prevStats as SenderStats).bytesSent;\n  }\n  if (\n    bytesNow === undefined ||\n    bytesPrev === undefined ||\n    currentStats.timestamp === undefined ||\n    prevStats.timestamp === undefined\n  ) {\n    return 0;\n  }\n  return ((bytesNow - bytesPrev) * 8 * 1000) / (currentStats.timestamp - prevStats.timestamp);\n}\n","import type LocalTrack from './LocalTrack';\n\n// Check if MediaRecorder is available\nconst isMediaRecorderAvailable = typeof MediaRecorder !== 'undefined';\n\n// Fallback class for environments without MediaRecorder\nclass FallbackRecorder {\n  constructor() {\n    throw new Error('MediaRecorder is not available in this environment');\n  }\n}\n\n// Use conditional inheritance to avoid parse-time errors\nconst RecorderBase = isMediaRecorderAvailable\n  ? MediaRecorder\n  : (FallbackRecorder as unknown as typeof MediaRecorder);\n\nexport class LocalTrackRecorder\u003cT extends LocalTrack\u003e extends RecorderBase {\n  byteStream: ReadableStream\u003cUint8Array\u003e;\n\n  constructor(track: T, options?: MediaRecorderOptions) {\n    if (!isMediaRecorderAvailable) {\n      throw new Error('MediaRecorder is not available in this environment');\n    }\n\n    super(new MediaStream([track.mediaStreamTrack]), options);\n\n    let dataListener: (event: BlobEvent) =\u003e void;\n\n    let streamController: ReadableStreamDefaultController\u003cUint8Array\u003e | undefined;\n\n    const isClosed = () =\u003e streamController === undefined;\n\n    const onStop = () =\u003e {\n      this.removeEventListener('dataavailable', dataListener);\n      this.removeEventListener('stop', onStop);\n      this.removeEventListener('error', onError);\n      streamController?.close();\n      streamController = undefined;\n    };\n\n    const onError = (event: Event) =\u003e {\n      streamController?.error(event);\n      this.removeEventListener('dataavailable', dataListener);\n      this.removeEventListener('stop', onStop);\n      this.removeEventListener('error', onError);\n      streamController = undefined;\n    };\n\n    this.byteStream = new ReadableStream({\n      start: (controller) =\u003e {\n        streamController = controller;\n        dataListener = async (event: BlobEvent) =\u003e {\n          let data: Uint8Array;\n\n          if (event.data.arrayBuffer) {\n            const arrayBuffer = await event.data.arrayBuffer();\n            data = new Uint8Array(arrayBuffer);\n\n            // @ts-expect-error react-native passes over Uint8Arrays directly\n          } else if (event.data.byteArray) {\n            // @ts-expect-error\n            data = event.data.byteArray as Uint8Array;\n          } else {\n            throw new Error('no data available!');\n          }\n\n          if (isClosed()) {\n            return;\n          }\n          controller.enqueue(data);\n        };\n        this.addEventListener('dataavailable', dataListener);\n      },\n      cancel: () =\u003e {\n        onStop();\n      },\n    });\n\n    this.addEventListener('stop', onStop);\n    this.addEventListener('error', onError);\n  }\n}\n\n// Helper function to check if recording is supported\nexport function isRecordingSupported(): boolean {\n  return isMediaRecorderAvailable;\n}\n","import { Mutex } from '@livekit/mutex';\nimport { debounce } from 'ts-debounce';\nimport { getBrowser } from '../../utils/browserParser';\nimport DeviceManager from '../DeviceManager';\nimport { DeviceUnsupportedError, TrackInvalidError } from '../errors';\nimport { TrackEvent } from '../events';\nimport type { LoggerOptions } from '../types';\nimport { compareVersions, isMobile, sleep, unwrapConstraint } from '../utils';\nimport { Track, attachToElement, detachTrack } from './Track';\nimport type { VideoCodec } from './options';\nimport type { TrackProcessor } from './processor/types';\nimport { LocalTrackRecorder, isRecordingSupported } from './record';\nimport type { ReplaceTrackOptions } from './types';\n\nconst DEFAULT_DIMENSIONS_TIMEOUT = 1000;\nconst PRE_CONNECT_BUFFER_TIMEOUT = 10_000;\n\nexport default abstract class LocalTrack\u003c\n  TrackKind extends Track.Kind = Track.Kind,\n\u003e extends Track\u003cTrackKind\u003e {\n  protected _sender?: RTCRtpSender;\n\n  private autoStopPreConnectBuffer: ReturnType\u003ctypeof setTimeout\u003e | undefined;\n\n  /** @internal */\n  get sender(): RTCRtpSender | undefined {\n    return this._sender;\n  }\n\n  /** @internal */\n  set sender(sender: RTCRtpSender | undefined) {\n    this._sender = sender;\n  }\n\n  /** @internal */\n  codec?: VideoCodec;\n\n  get constraints() {\n    return this._constraints;\n  }\n\n  get hasPreConnectBuffer() {\n    return !!this.localTrackRecorder;\n  }\n\n  protected _constraints: MediaTrackConstraints;\n\n  protected reacquireTrack: boolean;\n\n  protected providedByUser: boolean;\n\n  protected muteLock: Mutex;\n\n  protected pauseUpstreamLock: Mutex;\n\n  protected processorElement?: HTMLMediaElement;\n\n  protected processor?: TrackProcessor\u003cTrackKind, any\u003e;\n\n  protected audioContext?: AudioContext;\n\n  protected manuallyStopped: boolean = false;\n\n  protected localTrackRecorder: LocalTrackRecorder\u003ctypeof this\u003e | undefined;\n\n  protected trackChangeLock: Mutex;\n\n  /**\n   *\n   * @param mediaTrack\n   * @param kind\n   * @param constraints MediaTrackConstraints that are being used when restarting or reacquiring tracks\n   * @param userProvidedTrack Signals to the SDK whether or not the mediaTrack should be managed (i.e. released and reacquired) internally by the SDK\n   */\n  protected constructor(\n    mediaTrack: MediaStreamTrack,\n    kind: TrackKind,\n    constraints?: MediaTrackConstraints,\n    userProvidedTrack = false,\n    loggerOptions?: LoggerOptions,\n  ) {\n    super(mediaTrack, kind, loggerOptions);\n    this.reacquireTrack = false;\n    this.providedByUser = userProvidedTrack;\n    this.muteLock = new Mutex();\n    this.pauseUpstreamLock = new Mutex();\n    this.trackChangeLock = new Mutex();\n    this.trackChangeLock.lock().then(async (unlock) =\u003e {\n      try {\n        await this.setMediaStreamTrack(mediaTrack, true);\n      } finally {\n        unlock();\n      }\n    });\n\n    // added to satisfy TS compiler, constraints are synced with MediaStreamTrack\n    this._constraints = mediaTrack.getConstraints();\n    if (constraints) {\n      this._constraints = constraints;\n    }\n  }\n\n  get id(): string {\n    return this._mediaStreamTrack.id;\n  }\n\n  get dimensions(): Track.Dimensions | undefined {\n    if (this.kind !== Track.Kind.Video) {\n      return undefined;\n    }\n\n    const { width, height } = this._mediaStreamTrack.getSettings();\n    if (width \u0026\u0026 height) {\n      return {\n        width,\n        height,\n      };\n    }\n    return undefined;\n  }\n\n  private _isUpstreamPaused: boolean = false;\n\n  get isUpstreamPaused() {\n    return this._isUpstreamPaused;\n  }\n\n  get isUserProvided() {\n    return this.providedByUser;\n  }\n\n  get mediaStreamTrack() {\n    return this.processor?.processedTrack ?? this._mediaStreamTrack;\n  }\n\n  get isLocal() {\n    return true;\n  }\n\n  /**\n   * @internal\n   * returns mediaStreamTrack settings of the capturing mediastreamtrack source - ignoring processors\n   */\n  getSourceTrackSettings() {\n    return this._mediaStreamTrack.getSettings();\n  }\n\n  private async setMediaStreamTrack(newTrack: MediaStreamTrack, force?: boolean) {\n    if (newTrack === this._mediaStreamTrack \u0026\u0026 !force) {\n      return;\n    }\n    if (this._mediaStreamTrack) {\n      // detach\n      this.attachedElements.forEach((el) =\u003e {\n        detachTrack(this._mediaStreamTrack, el);\n      });\n      this.debouncedTrackMuteHandler.cancel('new-track');\n      this._mediaStreamTrack.removeEventListener('ended', this.handleEnded);\n      this._mediaStreamTrack.removeEventListener('mute', this.handleTrackMuteEvent);\n      this._mediaStreamTrack.removeEventListener('unmute', this.handleTrackUnmuteEvent);\n    }\n\n    this.mediaStream = new MediaStream([newTrack]);\n    if (newTrack) {\n      newTrack.addEventListener('ended', this.handleEnded);\n      // when underlying track emits mute, it indicates that the device is unable\n      // to produce media. In this case we'll need to signal with remote that\n      // the track is \"muted\"\n      // note this is different from LocalTrack.mute because we do not want to\n      // touch MediaStreamTrack.enabled\n      newTrack.addEventListener('mute', this.handleTrackMuteEvent);\n      newTrack.addEventListener('unmute', this.handleTrackUnmuteEvent);\n      this._constraints = newTrack.getConstraints();\n    }\n    let processedTrack: MediaStreamTrack | undefined;\n    if (this.processor \u0026\u0026 newTrack) {\n      this.log.debug('restarting processor', this.logContext);\n      if (this.kind === 'unknown') {\n        throw TypeError('cannot set processor on track of unknown kind');\n      }\n\n      if (this.processorElement) {\n        attachToElement(newTrack, this.processorElement);\n        // ensure the processorElement itself stays muted\n        this.processorElement.muted = true;\n      }\n      await this.processor.restart({\n        track: newTrack,\n        kind: this.kind,\n        element: this.processorElement,\n      });\n      processedTrack = this.processor.processedTrack;\n    }\n    if (this.sender \u0026\u0026 this.sender.transport?.state !== 'closed') {\n      await this.sender.replaceTrack(processedTrack ?? newTrack);\n    }\n    // if `newTrack` is different from the existing track, stop the\n    // older track just before replacing it\n    if (!this.providedByUser \u0026\u0026 this._mediaStreamTrack !== newTrack) {\n      this._mediaStreamTrack.stop();\n    }\n    this._mediaStreamTrack = newTrack;\n    if (newTrack) {\n      // sync muted state with the enabled state of the newly provided track\n      this._mediaStreamTrack.enabled = !this.isMuted;\n      // when a valid track is replace, we'd want to start producing\n      await this.resumeUpstream();\n      this.attachedElements.forEach((el) =\u003e {\n        attachToElement(processedTrack ?? newTrack, el);\n      });\n    }\n  }\n\n  async waitForDimensions(timeout = DEFAULT_DIMENSIONS_TIMEOUT): Promise\u003cTrack.Dimensions\u003e {\n    if (this.kind === Track.Kind.Audio) {\n      throw new Error('cannot get dimensions for audio tracks');\n    }\n\n    if (getBrowser()?.os === 'iOS') {\n      // browsers report wrong initial resolution on iOS.\n      // when slightly delaying the call to .getSettings(), the correct resolution is being reported\n      await sleep(10);\n    }\n\n    const started = Date.now();\n    while (Date.now() - started \u003c timeout) {\n      const dims = this.dimensions;\n      if (dims) {\n        return dims;\n      }\n      await sleep(50);\n    }\n    throw new TrackInvalidError('unable to get track dimensions after timeout');\n  }\n\n  async setDeviceId(deviceId: ConstrainDOMString): Promise\u003cboolean\u003e {\n    if (\n      this._constraints.deviceId === deviceId \u0026\u0026\n      this._mediaStreamTrack.getSettings().deviceId === unwrapConstraint(deviceId)\n    ) {\n      return true;\n    }\n\n    this._constraints.deviceId = deviceId;\n\n    // when track is muted, underlying media stream track is stopped and\n    // will be restarted later\n    if (this.isMuted) {\n      return true;\n    }\n\n    await this.restartTrack();\n\n    return unwrapConstraint(deviceId) === this._mediaStreamTrack.getSettings().deviceId;\n  }\n\n  abstract restartTrack(constraints?: unknown): Promise\u003cvoid\u003e;\n\n  /**\n   * @returns DeviceID of the device that is currently being used for this track\n   */\n  async getDeviceId(normalize = true): Promise\u003cstring | undefined\u003e {\n    // screen share doesn't have a usable device id\n    if (this.source === Track.Source.ScreenShare) {\n      return;\n    }\n    const { deviceId, groupId } = this._mediaStreamTrack.getSettings();\n    const kind = this.kind === Track.Kind.Audio ? 'audioinput' : 'videoinput';\n\n    return normalize\n      ? DeviceManager.getInstance().normalizeDeviceId(kind, deviceId, groupId)\n      : deviceId;\n  }\n\n  async mute() {\n    this.setTrackMuted(true);\n    return this;\n  }\n\n  async unmute() {\n    this.setTrackMuted(false);\n    return this;\n  }\n\n  async replaceTrack(track: MediaStreamTrack, options?: ReplaceTrackOptions): Promise\u003ctypeof this\u003e;\n  async replaceTrack(track: MediaStreamTrack, userProvidedTrack?: boolean): Promise\u003ctypeof this\u003e;\n  async replaceTrack(\n    track: MediaStreamTrack,\n    userProvidedOrOptions: boolean | ReplaceTrackOptions | undefined,\n  ) {\n    const unlock = await this.trackChangeLock.lock();\n    try {\n      if (!this.sender) {\n        throw new TrackInvalidError('unable to replace an unpublished track');\n      }\n\n      let userProvidedTrack: boolean | undefined;\n      let stopProcessor: boolean | undefined;\n\n      if (typeof userProvidedOrOptions === 'boolean') {\n        userProvidedTrack = userProvidedOrOptions;\n      } else if (userProvidedOrOptions !== undefined) {\n        userProvidedTrack = userProvidedOrOptions.userProvidedTrack;\n        stopProcessor = userProvidedOrOptions.stopProcessor;\n      }\n\n      this.providedByUser = userProvidedTrack ?? true;\n\n      this.log.debug('replace MediaStreamTrack', this.logContext);\n      await this.setMediaStreamTrack(track);\n      // this must be synced *after* setting mediaStreamTrack above, since it relies\n      // on the previous state in order to cleanup\n\n      if (stopProcessor \u0026\u0026 this.processor) {\n        await this.internalStopProcessor();\n      }\n      return this;\n    } finally {\n      unlock();\n    }\n  }\n\n  protected async restart(constraints?: MediaTrackConstraints) {\n    this.manuallyStopped = false;\n    const unlock = await this.trackChangeLock.lock();\n\n    try {\n      if (!constraints) {\n        constraints = this._constraints;\n      }\n      const { deviceId, facingMode, ...otherConstraints } = constraints;\n      this.log.debug('restarting track with constraints', { ...this.logContext, constraints });\n\n      const streamConstraints: MediaStreamConstraints = {\n        audio: false,\n        video: false,\n      };\n\n      if (this.kind === Track.Kind.Video) {\n        streamConstraints.video = deviceId || facingMode ? { deviceId, facingMode } : true;\n      } else {\n        streamConstraints.audio = deviceId ? { deviceId, ...otherConstraints } : true;\n      }\n\n      // these steps are duplicated from setMediaStreamTrack because we must stop\n      // the previous tracks before new tracks can be acquired\n      this.attachedElements.forEach((el) =\u003e {\n        detachTrack(this.mediaStreamTrack, el);\n      });\n      this._mediaStreamTrack.removeEventListener('ended', this.handleEnded);\n      // on Safari, the old audio track must be stopped before attempting to acquire\n      // the new track, otherwise the new track will stop with\n      // 'A MediaStreamTrack ended due to a capture failure`\n      this._mediaStreamTrack.stop();\n\n      // create new track and attach\n      const mediaStream = await navigator.mediaDevices.getUserMedia(streamConstraints);\n      const newTrack = mediaStream.getTracks()[0];\n      if (this.kind === Track.Kind.Video) {\n        // we already captured the audio track with the constraints, so we only need to apply the video constraints\n        await newTrack.applyConstraints(otherConstraints);\n      }\n      newTrack.addEventListener('ended', this.handleEnded);\n      this.log.debug('re-acquired MediaStreamTrack', this.logContext);\n\n      await this.setMediaStreamTrack(newTrack);\n      this._constraints = constraints;\n      this.emit(TrackEvent.Restarted, this);\n      if (this.manuallyStopped) {\n        this.log.warn(\n          'track was stopped during a restart, stopping restarted track',\n          this.logContext,\n        );\n        this.stop();\n      }\n      return this;\n    } finally {\n      unlock();\n    }\n  }\n\n  protected setTrackMuted(muted: boolean) {\n    this.log.debug(`setting ${this.kind} track ${muted ? 'muted' : 'unmuted'}`, this.logContext);\n\n    if (this.isMuted === muted \u0026\u0026 this._mediaStreamTrack.enabled !== muted) {\n      return;\n    }\n\n    this.isMuted = muted;\n    this._mediaStreamTrack.enabled = !muted;\n    this.emit(muted ? TrackEvent.Muted : TrackEvent.Unmuted, this);\n  }\n\n  protected get needsReAcquisition(): boolean {\n    return (\n      this._mediaStreamTrack.readyState !== 'live' ||\n      this._mediaStreamTrack.muted ||\n      !this._mediaStreamTrack.enabled ||\n      this.reacquireTrack\n    );\n  }\n\n  protected async handleAppVisibilityChanged() {\n    await super.handleAppVisibilityChanged();\n    if (!isMobile()) return;\n    this.log.debug(`visibility changed, is in Background: ${this.isInBackground}`, this.logContext);\n\n    if (!this.isInBackground \u0026\u0026 this.needsReAcquisition \u0026\u0026 !this.isUserProvided \u0026\u0026 !this.isMuted) {\n      this.log.debug(`track needs to be reacquired, restarting ${this.source}`, this.logContext);\n      await this.restart();\n      this.reacquireTrack = false;\n    }\n  }\n\n  private handleTrackMuteEvent = () =\u003e\n    this.debouncedTrackMuteHandler().catch(() =\u003e\n      this.log.debug('track mute bounce got cancelled by an unmute event', this.logContext),\n    );\n\n  private debouncedTrackMuteHandler = debounce(async () =\u003e {\n    await this.pauseUpstream();\n  }, 5000);\n\n  private handleTrackUnmuteEvent = async () =\u003e {\n    this.debouncedTrackMuteHandler.cancel('unmute');\n    await this.resumeUpstream();\n  };\n\n  private handleEnded = () =\u003e {\n    if (this.isInBackground) {\n      this.reacquireTrack = true;\n    }\n    this._mediaStreamTrack.removeEventListener('mute', this.handleTrackMuteEvent);\n    this._mediaStreamTrack.removeEventListener('unmute', this.handleTrackUnmuteEvent);\n    this.emit(TrackEvent.Ended, this);\n  };\n\n  stop() {\n    this.manuallyStopped = true;\n    super.stop();\n\n    this._mediaStreamTrack.removeEventListener('ended', this.handleEnded);\n    this._mediaStreamTrack.removeEventListener('mute', this.handleTrackMuteEvent);\n    this._mediaStreamTrack.removeEventListener('unmute', this.handleTrackUnmuteEvent);\n    this.processor?.destroy();\n    this.processor = undefined;\n  }\n\n  /**\n   * pauses publishing to the server without disabling the local MediaStreamTrack\n   * this is used to display a user's own video locally while pausing publishing to\n   * the server.\n   * this API is unsupported on Safari \u003c 12 due to a bug\n   **/\n  async pauseUpstream() {\n    const unlock = await this.pauseUpstreamLock.lock();\n    try {\n      if (this._isUpstreamPaused === true) {\n        return;\n      }\n      if (!this.sender) {\n        this.log.warn('unable to pause upstream for an unpublished track', this.logContext);\n        return;\n      }\n\n      this._isUpstreamPaused = true;\n      this.emit(TrackEvent.UpstreamPaused, this);\n      const browser = getBrowser();\n      if (browser?.name === 'Safari' \u0026\u0026 compareVersions(browser.version, '12.0') \u003c 0) {\n        // https://bugs.webkit.org/show_bug.cgi?id=184911\n        throw new DeviceUnsupportedError('pauseUpstream is not supported on Safari \u003c 12.');\n      }\n      if (this.sender.transport?.state !== 'closed') {\n        await this.sender.replaceTrack(null);\n      }\n    } finally {\n      unlock();\n    }\n  }\n\n  async resumeUpstream() {\n    const unlock = await this.pauseUpstreamLock.lock();\n    try {\n      if (this._isUpstreamPaused === false) {\n        return;\n      }\n      if (!this.sender) {\n        this.log.warn('unable to resume upstream for an unpublished track', this.logContext);\n        return;\n      }\n      this._isUpstreamPaused = false;\n      this.emit(TrackEvent.UpstreamResumed, this);\n\n      if (this.sender.transport?.state !== 'closed') {\n        // this operation is noop if mediastreamtrack is already being sent\n        await this.sender.replaceTrack(this.mediaStreamTrack);\n      }\n    } finally {\n      unlock();\n    }\n  }\n\n  /**\n   * Gets the RTCStatsReport for the LocalTrack's underlying RTCRtpSender\n   * See https://developer.mozilla.org/en-US/docs/Web/API/RTCStatsReport\n   *\n   * @returns Promise\u003cRTCStatsReport\u003e | undefined\n   */\n  async getRTCStatsReport(): Promise\u003cRTCStatsReport | undefined\u003e {\n    if (!this.sender?.getStats) {\n      return;\n    }\n    const statsReport = await this.sender.getStats();\n    return statsReport;\n  }\n\n  /**\n   * Sets a processor on this track.\n   * See https://github.com/livekit/track-processors-js for example usage\n   *\n   * @experimental\n   *\n   * @param processor\n   * @param showProcessedStreamLocally\n   * @returns\n   */\n  async setProcessor(processor: TrackProcessor\u003cTrackKind\u003e, showProcessedStreamLocally = true) {\n    const unlock = await this.trackChangeLock.lock();\n    try {\n      this.log.debug('setting up processor', this.logContext);\n\n      const processorElement = document.createElement(this.kind) as HTMLMediaElement;\n\n      const processorOptions = {\n        kind: this.kind,\n        track: this._mediaStreamTrack,\n        element: processorElement,\n        audioContext: this.audioContext,\n      };\n      await processor.init(processorOptions);\n      this.log.debug('processor initialized', this.logContext);\n\n      if (this.processor) {\n        await this.internalStopProcessor();\n      }\n      if (this.kind === 'unknown') {\n        throw TypeError('cannot set processor on track of unknown kind');\n      }\n\n      attachToElement(this._mediaStreamTrack, processorElement);\n      processorElement.muted = true;\n\n      processorElement.play().catch((error) =\u003e {\n        if (error instanceof DOMException \u0026\u0026 error.name === 'AbortError') {\n          // This happens on Safari when the processor is restarted, try again after a delay\n          this.log.warn('failed to play processor element, retrying', {\n            ...this.logContext,\n            error,\n          });\n          setTimeout(() =\u003e {\n            processorElement.play().catch((err) =\u003e {\n              this.log.error('failed to play processor element', { ...this.logContext, err });\n            });\n          }, 100);\n        } else {\n          this.log.error('failed to play processor element', { ...this.logContext, error });\n        }\n      });\n\n      this.processor = processor;\n      this.processorElement = processorElement;\n      if (this.processor.processedTrack) {\n        for (const el of this.attachedElements) {\n          if (el !== this.processorElement \u0026\u0026 showProcessedStreamLocally) {\n            detachTrack(this._mediaStreamTrack, el);\n            attachToElement(this.processor.processedTrack, el);\n          }\n        }\n        await this.sender?.replaceTrack(this.processor.processedTrack);\n      }\n      this.emit(TrackEvent.TrackProcessorUpdate, this.processor);\n    } finally {\n      unlock();\n    }\n  }\n\n  getProcessor() {\n    return this.processor;\n  }\n\n  /**\n   * Stops the track processor\n   * See https://github.com/livekit/track-processors-js for example usage\n   *\n   * @experimental\n   * @returns\n   */\n  async stopProcessor(keepElement = true) {\n    const unlock = await this.trackChangeLock.lock();\n    try {\n      await this.internalStopProcessor(keepElement);\n    } finally {\n      unlock();\n    }\n  }\n\n  /**\n   * @internal\n   * This method assumes the caller has acquired a trackChangeLock already.\n   * The public facing method for stopping the processor is `stopProcessor` and it wraps this method in the trackChangeLock.\n   */\n  protected async internalStopProcessor(keepElement = true) {\n    if (!this.processor) return;\n    this.log.debug('stopping processor', this.logContext);\n    this.processor.processedTrack?.stop();\n    await this.processor.destroy();\n    this.processor = undefined;\n    if (!keepElement) {\n      this.processorElement?.remove();\n      this.processorElement = undefined;\n    }\n    // apply original track constraints in case the processor changed them\n    await this._mediaStreamTrack.applyConstraints(this._constraints);\n    // force re-setting of the mediaStreamTrack on the sender\n    await this.setMediaStreamTrack(this._mediaStreamTrack, true);\n    this.emit(TrackEvent.TrackProcessorUpdate);\n  }\n\n  /** @internal */\n  startPreConnectBuffer(timeslice: number = 100) {\n    if (!isRecordingSupported()) {\n      this.log.warn(\n        'MediaRecorder is not available, cannot start preconnect buffer',\n        this.logContext,\n      );\n      return;\n    }\n\n    if (!this.localTrackRecorder) {\n      let mimeType = 'audio/webm;codecs=opus';\n      if (!MediaRecorder.isTypeSupported(mimeType)) {\n        // iOS currently only supports video/mp4 as a mime type - even for audio.\n        mimeType = 'video/mp4';\n      }\n      this.localTrackRecorder = new LocalTrackRecorder(this, {\n        mimeType,\n      });\n    } else {\n      this.log.warn('preconnect buffer already started');\n      return;\n    }\n\n    this.localTrackRecorder.start(timeslice);\n    this.autoStopPreConnectBuffer = setTimeout(() =\u003e {\n      this.log.warn(\n        'preconnect buffer timed out, stopping recording automatically',\n        this.logContext,\n      );\n      this.stopPreConnectBuffer();\n    }, PRE_CONNECT_BUFFER_TIMEOUT);\n  }\n\n  /** @internal */\n  stopPreConnectBuffer() {\n    clearTimeout(this.autoStopPreConnectBuffer);\n    if (this.localTrackRecorder) {\n      this.localTrackRecorder.stop();\n      this.localTrackRecorder = undefined;\n    }\n  }\n\n  /** @internal */\n  getPreConnectBuffer() {\n    return this.localTrackRecorder?.byteStream;\n  }\n\n  getPreConnectBufferMimeType() {\n    return this.localTrackRecorder?.mimeType;\n  }\n\n  protected abstract monitorSender(): void;\n}\n","import { AudioTrackFeature } from '@livekit/protocol';\nimport { TrackEvent } from '../events';\nimport { computeBitrate, monitorFrequency } from '../stats';\nimport type { AudioSenderStats } from '../stats';\nimport type { LoggerOptions } from '../types';\nimport { isReactNative, isWeb, unwrapConstraint } from '../utils';\nimport LocalTrack from './LocalTrack';\nimport { Track } from './Track';\nimport type { AudioCaptureOptions } from './options';\nimport type { AudioProcessorOptions, TrackProcessor } from './processor/types';\nimport { constraintsForOptions, detectSilence } from './utils';\n\nexport default class LocalAudioTrack extends LocalTrack\u003cTrack.Kind.Audio\u003e {\n  /** @internal */\n  stopOnMute: boolean = false;\n\n  private prevStats?: AudioSenderStats;\n\n  private isKrispNoiseFilterEnabled = false;\n\n  protected processor?: TrackProcessor\u003cTrack.Kind.Audio, AudioProcessorOptions\u003e | undefined;\n\n  /**\n   * boolean indicating whether enhanced noise cancellation is currently being used on this track\n   */\n  get enhancedNoiseCancellation() {\n    return this.isKrispNoiseFilterEnabled;\n  }\n\n  /**\n   *\n   * @param mediaTrack\n   * @param constraints MediaTrackConstraints that are being used when restarting or reacquiring tracks\n   * @param userProvidedTrack Signals to the SDK whether or not the mediaTrack should be managed (i.e. released and reacquired) internally by the SDK\n   */\n  constructor(\n    mediaTrack: MediaStreamTrack,\n    constraints?: MediaTrackConstraints,\n    userProvidedTrack = true,\n    audioContext?: AudioContext,\n    loggerOptions?: LoggerOptions,\n  ) {\n    super(mediaTrack, Track.Kind.Audio, constraints, userProvidedTrack, loggerOptions);\n    this.audioContext = audioContext;\n    this.checkForSilence();\n  }\n\n  async mute(): Promise\u003ctypeof this\u003e {\n    const unlock = await this.muteLock.lock();\n    try {\n      if (this.isMuted) {\n        this.log.debug('Track already muted', this.logContext);\n        return this;\n      }\n\n      // disabled special handling as it will cause BT headsets to switch communication modes\n      if (this.source === Track.Source.Microphone \u0026\u0026 this.stopOnMute \u0026\u0026 !this.isUserProvided) {\n        this.log.debug('stopping mic track', this.logContext);\n        // also stop the track, so that microphone indicator is turned off\n        this._mediaStreamTrack.stop();\n      }\n      await super.mute();\n      return this;\n    } finally {\n      unlock();\n    }\n  }\n\n  async unmute(): Promise\u003ctypeof this\u003e {\n    const unlock = await this.muteLock.lock();\n    try {\n      if (!this.isMuted) {\n        this.log.debug('Track already unmuted', this.logContext);\n        return this;\n      }\n\n      const deviceHasChanged =\n        this._constraints.deviceId \u0026\u0026\n        this._mediaStreamTrack.getSettings().deviceId !==\n          unwrapConstraint(this._constraints.deviceId);\n\n      if (\n        this.source === Track.Source.Microphone \u0026\u0026\n        (this.stopOnMute || this._mediaStreamTrack.readyState === 'ended' || deviceHasChanged) \u0026\u0026\n        !this.isUserProvided\n      ) {\n        this.log.debug('reacquiring mic track', this.logContext);\n        await this.restartTrack();\n      }\n      await super.unmute();\n\n      return this;\n    } finally {\n      unlock();\n    }\n  }\n\n  async restartTrack(options?: AudioCaptureOptions) {\n    let constraints: MediaTrackConstraints | undefined;\n    if (options) {\n      const streamConstraints = constraintsForOptions({ audio: options });\n      if (typeof streamConstraints.audio !== 'boolean') {\n        constraints = streamConstraints.audio;\n      }\n    }\n    await this.restart(constraints);\n  }\n\n  protected async restart(constraints?: MediaTrackConstraints): Promise\u003ctypeof this\u003e {\n    const track = await super.restart(constraints);\n    this.checkForSilence();\n    return track;\n  }\n\n  /* @internal */\n  startMonitor() {\n    if (!isWeb()) {\n      return;\n    }\n    if (this.monitorInterval) {\n      return;\n    }\n    this.monitorInterval = setInterval(() =\u003e {\n      this.monitorSender();\n    }, monitorFrequency);\n  }\n\n  protected monitorSender = async () =\u003e {\n    if (!this.sender) {\n      this._currentBitrate = 0;\n      return;\n    }\n\n    let stats: AudioSenderStats | undefined;\n    try {\n      stats = await this.getSenderStats();\n    } catch (e) {\n      this.log.error('could not get audio sender stats', { ...this.logContext, error: e });\n      return;\n    }\n\n    if (stats \u0026\u0026 this.prevStats) {\n      this._currentBitrate = computeBitrate(stats, this.prevStats);\n    }\n\n    this.prevStats = stats;\n  };\n\n  private handleKrispNoiseFilterEnable = () =\u003e {\n    this.isKrispNoiseFilterEnabled = true;\n    this.log.debug(`Krisp noise filter enabled`, this.logContext);\n    this.emit(\n      TrackEvent.AudioTrackFeatureUpdate,\n      this,\n      AudioTrackFeature.TF_ENHANCED_NOISE_CANCELLATION,\n      true,\n    );\n  };\n\n  private handleKrispNoiseFilterDisable = () =\u003e {\n    this.isKrispNoiseFilterEnabled = false;\n    this.log.debug(`Krisp noise filter disabled`, this.logContext);\n    this.emit(\n      TrackEvent.AudioTrackFeatureUpdate,\n      this,\n      AudioTrackFeature.TF_ENHANCED_NOISE_CANCELLATION,\n      false,\n    );\n  };\n\n  async setProcessor(processor: TrackProcessor\u003cTrack.Kind.Audio, AudioProcessorOptions\u003e) {\n    const unlock = await this.trackChangeLock.lock();\n    try {\n      if (!isReactNative() \u0026\u0026 !this.audioContext) {\n        throw Error(\n          'Audio context needs to be set on LocalAudioTrack in order to enable processors',\n        );\n      }\n      if (this.processor) {\n        await this.internalStopProcessor();\n      }\n\n      const processorOptions = {\n        kind: this.kind,\n        track: this._mediaStreamTrack,\n        // RN won't have or use AudioContext\n        audioContext: this.audioContext as AudioContext,\n      };\n      this.log.debug(`setting up audio processor ${processor.name}`, this.logContext);\n\n      await processor.init(processorOptions);\n      this.processor = processor;\n      if (this.processor.processedTrack) {\n        await this.sender?.replaceTrack(this.processor.processedTrack);\n        this.processor.processedTrack.addEventListener(\n          'enable-lk-krisp-noise-filter',\n          this.handleKrispNoiseFilterEnable,\n        );\n        this.processor.processedTrack.addEventListener(\n          'disable-lk-krisp-noise-filter',\n          this.handleKrispNoiseFilterDisable,\n        );\n      }\n      this.emit(TrackEvent.TrackProcessorUpdate, this.processor);\n    } finally {\n      unlock();\n    }\n  }\n\n  /**\n   * @internal\n   * @experimental\n   */\n  setAudioContext(audioContext: AudioContext | undefined) {\n    this.audioContext = audioContext;\n  }\n\n  async getSenderStats(): Promise\u003cAudioSenderStats | undefined\u003e {\n    if (!this.sender?.getStats) {\n      return undefined;\n    }\n\n    const stats = await this.sender.getStats();\n    let audioStats: AudioSenderStats | undefined;\n    stats.forEach((v) =\u003e {\n      if (v.type === 'outbound-rtp') {\n        audioStats = {\n          type: 'audio',\n          streamId: v.id,\n          packetsSent: v.packetsSent,\n          packetsLost: v.packetsLost,\n          bytesSent: v.bytesSent,\n          timestamp: v.timestamp,\n          roundTripTime: v.roundTripTime,\n          jitter: v.jitter,\n        };\n      }\n    });\n\n    return audioStats;\n  }\n\n  async checkForSilence() {\n    const trackIsSilent = await detectSilence(this);\n    if (trackIsSilent) {\n      if (!this.isMuted) {\n        this.log.warn('silence detected on local audio track', this.logContext);\n      }\n      this.emit(TrackEvent.AudioSilenceDetected);\n    }\n    return trackIsSilent;\n  }\n}\n","import log from '../../logger';\nimport { getBrowser } from '../../utils/browserParser';\nimport { TrackInvalidError } from '../errors';\nimport LocalAudioTrack from '../track/LocalAudioTrack';\nimport LocalVideoTrack from '../track/LocalVideoTrack';\nimport { Track } from '../track/Track';\nimport type {\n  BackupVideoCodec,\n  TrackPublishOptions,\n  VideoCodec,\n  VideoEncoding,\n} from '../track/options';\nimport { ScreenSharePresets, VideoPreset, VideoPresets, VideoPresets43 } from '../track/options';\nimport type { LoggerOptions } from '../types';\nimport {\n  compareVersions,\n  getReactNativeOs,\n  isFireFox,\n  isReactNative,\n  isSVCCodec,\n  isSafariBased,\n  isSafariSvcApi,\n  unwrapConstraint,\n} from '../utils';\n\n/** @internal */\nexport function mediaTrackToLocalTrack(\n  mediaStreamTrack: MediaStreamTrack,\n  constraints?: MediaTrackConstraints,\n  loggerOptions?: LoggerOptions,\n): LocalVideoTrack | LocalAudioTrack {\n  switch (mediaStreamTrack.kind) {\n    case 'audio':\n      return new LocalAudioTrack(mediaStreamTrack, constraints, false, undefined, loggerOptions);\n    case 'video':\n      return new LocalVideoTrack(mediaStreamTrack, constraints, false, loggerOptions);\n    default:\n      throw new TrackInvalidError(`unsupported track type: ${mediaStreamTrack.kind}`);\n  }\n}\n\n/* @internal */\nexport const presets169 = Object.values(VideoPresets);\n\n/* @internal */\nexport const presets43 = Object.values(VideoPresets43);\n\n/* @internal */\nexport const presetsScreenShare = Object.values(ScreenSharePresets);\n\n/* @internal */\nexport const defaultSimulcastPresets169 = [VideoPresets.h180, VideoPresets.h360];\n\n/* @internal */\nexport const defaultSimulcastPresets43 = [VideoPresets43.h180, VideoPresets43.h360];\n\n/* @internal */\nexport const computeDefaultScreenShareSimulcastPresets = (fromPreset: VideoPreset) =\u003e {\n  const layers = [{ scaleResolutionDownBy: 2, fps: fromPreset.encoding.maxFramerate }];\n  return layers.map(\n    (t) =\u003e\n      new VideoPreset(\n        Math.floor(fromPreset.width / t.scaleResolutionDownBy),\n        Math.floor(fromPreset.height / t.scaleResolutionDownBy),\n        Math.max(\n          150_000,\n          Math.floor(\n            fromPreset.encoding.maxBitrate /\n              (t.scaleResolutionDownBy ** 2 *\n                ((fromPreset.encoding.maxFramerate ?? 30) / (t.fps ?? 30))),\n          ),\n        ),\n        t.fps,\n        fromPreset.encoding.priority,\n      ),\n  );\n};\n\n// /**\n//  *\n//  * @internal\n//  * @experimental\n//  */\n// const computeDefaultMultiCodecSimulcastEncodings = (width: number, height: number) =\u003e {\n//   // use vp8 as a default\n//   const vp8 = determineAppropriateEncoding(false, width, height);\n//   const vp9 = { ...vp8, maxBitrate: vp8.maxBitrate * 0.9 };\n//   const h264 = { ...vp8, maxBitrate: vp8.maxBitrate * 1.1 };\n//   const av1 = { ...vp8, maxBitrate: vp8.maxBitrate * 0.7 };\n//   return {\n//     vp8,\n//     vp9,\n//     h264,\n//     av1,\n//   };\n// };\n\nconst videoRids = ['q', 'h', 'f'];\n\n/* @internal */\nexport function computeVideoEncodings(\n  isScreenShare: boolean,\n  width?: number,\n  height?: number,\n  options?: TrackPublishOptions,\n): RTCRtpEncodingParameters[] {\n  let videoEncoding: VideoEncoding | undefined = options?.videoEncoding;\n\n  if (isScreenShare) {\n    videoEncoding = options?.screenShareEncoding;\n  }\n\n  const useSimulcast = options?.simulcast;\n  const scalabilityMode = options?.scalabilityMode;\n  const videoCodec = options?.videoCodec;\n\n  if ((!videoEncoding \u0026\u0026 !useSimulcast \u0026\u0026 !scalabilityMode) || !width || !height) {\n    // when we aren't simulcasting or svc, will need to return a single encoding without\n    // capping bandwidth. we always require a encoding for dynacast\n    return [{}];\n  }\n\n  if (!videoEncoding) {\n    // find the right encoding based on width/height\n    videoEncoding = determineAppropriateEncoding(isScreenShare, width, height, videoCodec);\n    log.debug('using video encoding', videoEncoding);\n  }\n\n  const sourceFramerate = videoEncoding.maxFramerate;\n\n  const original = new VideoPreset(\n    width,\n    height,\n    videoEncoding.maxBitrate,\n    videoEncoding.maxFramerate,\n    videoEncoding.priority,\n  );\n\n  if (scalabilityMode \u0026\u0026 isSVCCodec(videoCodec)) {\n    const sm = new ScalabilityMode(scalabilityMode);\n\n    const encodings: RTCRtpEncodingParameters[] = [];\n\n    if (sm.spatial \u003e 3) {\n      throw new Error(`unsupported scalabilityMode: ${scalabilityMode}`);\n    }\n    // Before M113 in Chrome, defining multiple encodings with an SVC codec indicated\n    // that SVC mode should be used. Safari still works this way.\n    // This is a bit confusing but is due to how libwebrtc interpreted the encodings field\n    // before M113.\n    // Announced here: https://groups.google.com/g/discuss-webrtc/c/-QQ3pxrl-fw?pli=1\n    const browser = getBrowser();\n    if (\n      isSafariBased() ||\n      // Even tho RN runs M114, it does not produce SVC layers when a single encoding\n      // is provided. So we'll use the legacy SVC specification for now.\n      // TODO: when we upstream libwebrtc, this will need additional verification\n      isReactNative() ||\n      (browser?.name === 'Chrome' \u0026\u0026 compareVersions(browser?.version, '113') \u003c 0)\n    ) {\n      const bitratesRatio = sm.suffix == 'h' ? 2 : 3;\n      // safari 18.4 uses a different svc API that requires scaleResolutionDownBy to be set.\n      const requireScale = isSafariSvcApi(browser);\n      for (let i = 0; i \u003c sm.spatial; i += 1) {\n        // in legacy SVC, scaleResolutionDownBy cannot be set\n        encodings.push({\n          rid: videoRids[2 - i],\n          maxBitrate: videoEncoding.maxBitrate / bitratesRatio ** i,\n          maxFramerate: original.encoding.maxFramerate,\n          scaleResolutionDownBy: requireScale ? 2 ** i : undefined,\n        });\n      }\n      // legacy SVC, scalabilityMode is set only on the first encoding\n      /* @ts-ignore */\n      encodings[0].scalabilityMode = scalabilityMode;\n    } else {\n      encodings.push({\n        maxBitrate: videoEncoding.maxBitrate,\n        maxFramerate: original.encoding.maxFramerate,\n        /* @ts-ignore */\n        scalabilityMode: scalabilityMode,\n      });\n    }\n\n    if (original.encoding.priority) {\n      encodings[0].priority = original.encoding.priority;\n      encodings[0].networkPriority = original.encoding.priority;\n    }\n\n    log.debug(`using svc encoding`, { encodings });\n    return encodings;\n  }\n\n  if (!useSimulcast) {\n    return [videoEncoding];\n  }\n\n  let presets: Array\u003cVideoPreset\u003e = [];\n  if (isScreenShare) {\n    presets =\n      sortPresets(options?.screenShareSimulcastLayers) ??\n      defaultSimulcastLayers(isScreenShare, original);\n  } else {\n    presets =\n      sortPresets(options?.videoSimulcastLayers) ?? defaultSimulcastLayers(isScreenShare, original);\n  }\n  let midPreset: VideoPreset | undefined;\n  if (presets.length \u003e 0) {\n    const lowPreset = presets[0];\n    if (presets.length \u003e 1) {\n      [, midPreset] = presets;\n    }\n\n    // NOTE:\n    //   1. Ordering of these encodings is important. Chrome seems\n    //      to use the index into encodings to decide which layer\n    //      to disable when CPU constrained.\n    //      So encodings should be ordered in increasing spatial\n    //      resolution order.\n    //   2. livekit-server translates rids into layers. So, all encodings\n    //      should have the base layer `q` and then more added\n    //      based on other conditions.\n    const size = Math.max(width, height);\n    if (size \u003e= 960 \u0026\u0026 midPreset) {\n      return encodingsFromPresets(width, height, [lowPreset, midPreset, original], sourceFramerate);\n    }\n    if (size \u003e= 480) {\n      return encodingsFromPresets(width, height, [lowPreset, original], sourceFramerate);\n    }\n  }\n  return encodingsFromPresets(width, height, [original]);\n}\n\nexport function computeTrackBackupEncodings(\n  track: LocalVideoTrack,\n  videoCodec: BackupVideoCodec,\n  opts: TrackPublishOptions,\n) {\n  // backupCodec should not be true anymore, default codec is set in LocalParticipant.publish\n  if (\n    !opts.backupCodec ||\n    opts.backupCodec === true ||\n    opts.backupCodec.codec === opts.videoCodec\n  ) {\n    // backup codec publishing is disabled\n    return;\n  }\n  if (videoCodec !== opts.backupCodec.codec) {\n    log.warn('requested a different codec than specified as backup', {\n      serverRequested: videoCodec,\n      backup: opts.backupCodec.codec,\n    });\n  }\n\n  opts.videoCodec = videoCodec;\n  // use backup encoding setting as videoEncoding for backup codec publishing\n  opts.videoEncoding = opts.backupCodec.encoding;\n\n  const settings = track.mediaStreamTrack.getSettings();\n  const width = settings.width ?? track.dimensions?.width;\n  const height = settings.height ?? track.dimensions?.height;\n\n  // disable simulcast for screenshare backup codec since L1Tx is used by primary codec\n  if (track.source === Track.Source.ScreenShare \u0026\u0026 opts.simulcast) {\n    opts.simulcast = false;\n  }\n  const encodings = computeVideoEncodings(\n    track.source === Track.Source.ScreenShare,\n    width,\n    height,\n    opts,\n  );\n  return encodings;\n}\n\n/* @internal */\nexport function determineAppropriateEncoding(\n  isScreenShare: boolean,\n  width: number,\n  height: number,\n  codec?: VideoCodec,\n): VideoEncoding {\n  const presets = presetsForResolution(isScreenShare, width, height);\n  let { encoding } = presets[0];\n\n  // handle portrait by swapping dimensions\n  const size = Math.max(width, height);\n\n  for (let i = 0; i \u003c presets.length; i += 1) {\n    const preset = presets[i];\n    encoding = preset.encoding;\n    if (preset.width \u003e= size) {\n      break;\n    }\n  }\n\n  // presets are based on the assumption of vp8 as a codec\n  // for other codecs we adjust the maxBitrate if no specific videoEncoding has been provided\n  // users should override these with ones that are optimized for their use case\n  // NOTE: SVC codec bitrates are inclusive of all scalability layers. while\n  // bitrate for non-SVC codecs does not include other simulcast layers.\n  if (codec) {\n    switch (codec) {\n      case 'av1':\n      case 'h265':\n        encoding = { ...encoding };\n        encoding.maxBitrate = encoding.maxBitrate * 0.7;\n        break;\n      case 'vp9':\n        encoding = { ...encoding };\n        encoding.maxBitrate = encoding.maxBitrate * 0.85;\n        break;\n      default:\n        break;\n    }\n  }\n\n  return encoding;\n}\n\n/* @internal */\nexport function presetsForResolution(\n  isScreenShare: boolean,\n  width: number,\n  height: number,\n): VideoPreset[] {\n  if (isScreenShare) {\n    return presetsScreenShare;\n  }\n  const aspect = width \u003e height ? width / height : height / width;\n  if (Math.abs(aspect - 16.0 / 9) \u003c Math.abs(aspect - 4.0 / 3)) {\n    return presets169;\n  }\n  return presets43;\n}\n\n/* @internal */\nexport function defaultSimulcastLayers(\n  isScreenShare: boolean,\n  original: VideoPreset,\n): VideoPreset[] {\n  if (isScreenShare) {\n    return computeDefaultScreenShareSimulcastPresets(original);\n  }\n  const { width, height } = original;\n  const aspect = width \u003e height ? width / height : height / width;\n  if (Math.abs(aspect - 16.0 / 9) \u003c Math.abs(aspect - 4.0 / 3)) {\n    return defaultSimulcastPresets169;\n  }\n  return defaultSimulcastPresets43;\n}\n\n// presets should be ordered by low, medium, high\nfunction encodingsFromPresets(\n  width: number,\n  height: number,\n  presets: VideoPreset[],\n  sourceFramerate?: number | undefined,\n): RTCRtpEncodingParameters[] {\n  const encodings: RTCRtpEncodingParameters[] = [];\n  presets.forEach((preset, idx) =\u003e {\n    if (idx \u003e= videoRids.length) {\n      return;\n    }\n    const size = Math.min(width, height);\n    const rid = videoRids[idx];\n\n    const encoding: RTCRtpEncodingParameters = {\n      rid,\n      scaleResolutionDownBy: Math.max(1, size / Math.min(preset.width, preset.height)),\n      maxBitrate: preset.encoding.maxBitrate,\n    };\n    // ensure that the sourceFramerate is the highest framerate applied across all layers so that the\n    // original encoding doesn't get bumped unintentionally by any of the other layers\n    const maxFramerate =\n      sourceFramerate \u0026\u0026 preset.encoding.maxFramerate\n        ? Math.min(sourceFramerate, preset.encoding.maxFramerate)\n        : preset.encoding.maxFramerate;\n    if (maxFramerate) {\n      encoding.maxFramerate = maxFramerate;\n    }\n    const canSetPriority = isFireFox() || idx === 0;\n    if (preset.encoding.priority \u0026\u0026 canSetPriority) {\n      encoding.priority = preset.encoding.priority;\n      encoding.networkPriority = preset.encoding.priority;\n    }\n    encodings.push(encoding);\n  });\n\n  // RN ios simulcast requires all same framerates.\n  if (isReactNative() \u0026\u0026 getReactNativeOs() === 'ios') {\n    let topFramerate: number | undefined = undefined;\n    encodings.forEach((encoding) =\u003e {\n      if (!topFramerate) {\n        topFramerate = encoding.maxFramerate;\n      } else if (encoding.maxFramerate \u0026\u0026 encoding.maxFramerate \u003e topFramerate) {\n        topFramerate = encoding.maxFramerate;\n      }\n    });\n\n    let notifyOnce = true;\n    encodings.forEach((encoding) =\u003e {\n      if (encoding.maxFramerate != topFramerate) {\n        if (notifyOnce) {\n          notifyOnce = false;\n          log.info(\n            `Simulcast on iOS React-Native requires all encodings to share the same framerate.`,\n          );\n        }\n        log.info(`Setting framerate of encoding \\\"${encoding.rid ?? ''}\\\" to ${topFramerate}`);\n        encoding.maxFramerate = topFramerate;\n      }\n    });\n  }\n\n  return encodings;\n}\n\n/** @internal */\nexport function sortPresets(presets: Array\u003cVideoPreset\u003e | undefined) {\n  if (!presets) return;\n  return presets.sort((a, b) =\u003e {\n    const { encoding: aEnc } = a;\n    const { encoding: bEnc } = b;\n\n    if (aEnc.maxBitrate \u003e bEnc.maxBitrate) {\n      return 1;\n    }\n    if (aEnc.maxBitrate \u003c bEnc.maxBitrate) return -1;\n    if (aEnc.maxBitrate === bEnc.maxBitrate \u0026\u0026 aEnc.maxFramerate \u0026\u0026 bEnc.maxFramerate) {\n      return aEnc.maxFramerate \u003e bEnc.maxFramerate ? 1 : -1;\n    }\n    return 0;\n  });\n}\n\n/** @internal */\nexport class ScalabilityMode {\n  spatial: number;\n\n  temporal: number;\n\n  suffix: undefined | 'h' | '_KEY' | '_KEY_SHIFT';\n\n  constructor(scalabilityMode: string) {\n    const results = scalabilityMode.match(/^L(\\d)T(\\d)(h|_KEY|_KEY_SHIFT){0,1}$/);\n    if (!results) {\n      throw new Error('invalid scalability mode');\n    }\n\n    this.spatial = parseInt(results[1]);\n    this.temporal = parseInt(results[2]);\n    if (results.length \u003e 3) {\n      switch (results[3]) {\n        case 'h':\n        case '_KEY':\n        case '_KEY_SHIFT':\n          this.suffix = results[3];\n      }\n    }\n  }\n\n  toString(): string {\n    return `L${this.spatial}T${this.temporal}${this.suffix ?? ''}`;\n  }\n}\n\nexport function getDefaultDegradationPreference(track: LocalVideoTrack): RTCDegradationPreference {\n  // a few of reasons we have different default paths:\n  // 1. without this, Chrome seems to aggressively resize the SVC video stating `quality-limitation: bandwidth` even when BW isn't an issue\n  // 2. since we are overriding contentHint to motion (to workaround L1T3 publishing), it overrides the default degradationPreference to `balanced`\n  if (\n    track.source === Track.Source.ScreenShare ||\n    (track.constraints.height \u0026\u0026 unwrapConstraint(track.constraints.height) \u003e= 1080)\n  ) {\n    return 'maintain-resolution';\n  } else {\n    return 'balanced';\n  }\n}\n","import { Mutex } from '@livekit/mutex';\nimport {\n  VideoQuality as ProtoVideoQuality,\n  SubscribedCodec,\n  SubscribedQuality,\n  VideoLayer,\n} from '@livekit/protocol';\nimport type { SignalClient } from '../../api/SignalClient';\nimport type { StructuredLogger } from '../../logger';\nimport { TrackEvent } from '../events';\nimport { ScalabilityMode } from '../participant/publishUtils';\nimport type { VideoSenderStats } from '../stats';\nimport { computeBitrate, monitorFrequency } from '../stats';\nimport type { LoggerOptions } from '../types';\nimport { isFireFox, isMobile, isSVCCodec, isWeb } from '../utils';\nimport LocalTrack from './LocalTrack';\nimport { Track, VideoQuality } from './Track';\nimport type { VideoCaptureOptions, VideoCodec } from './options';\nimport type { TrackProcessor } from './processor/types';\nimport { constraintsForOptions } from './utils';\n\nexport class SimulcastTrackInfo {\n  codec: VideoCodec;\n\n  mediaStreamTrack: MediaStreamTrack;\n\n  sender?: RTCRtpSender;\n\n  encodings?: RTCRtpEncodingParameters[];\n\n  constructor(codec: VideoCodec, mediaStreamTrack: MediaStreamTrack) {\n    this.codec = codec;\n    this.mediaStreamTrack = mediaStreamTrack;\n  }\n}\n\nconst refreshSubscribedCodecAfterNewCodec = 5000;\n\nexport default class LocalVideoTrack extends LocalTrack\u003cTrack.Kind.Video\u003e {\n  /* @internal */\n  signalClient?: SignalClient;\n\n  private prevStats?: Map\u003cstring, VideoSenderStats\u003e;\n\n  private encodings?: RTCRtpEncodingParameters[];\n\n  /* @internal */\n  simulcastCodecs: Map\u003cVideoCodec, SimulcastTrackInfo\u003e = new Map\u003cVideoCodec, SimulcastTrackInfo\u003e();\n\n  private subscribedCodecs?: SubscribedCodec[];\n\n  // prevents concurrent manipulations to track sender\n  // if multiple get/setParameter are called concurrently, certain timing of events\n  // could lead to the browser throwing an exception in `setParameter`, due to\n  // a missing `getParameter` call.\n  private senderLock: Mutex;\n\n  private degradationPreference: RTCDegradationPreference = 'balanced';\n\n  private isCpuConstrained: boolean = false;\n\n  private optimizeForPerformance: boolean = false;\n\n  get sender(): RTCRtpSender | undefined {\n    return this._sender;\n  }\n\n  set sender(sender: RTCRtpSender | undefined) {\n    this._sender = sender;\n    if (this.degradationPreference) {\n      this.setDegradationPreference(this.degradationPreference);\n    }\n  }\n\n  /**\n   *\n   * @param mediaTrack\n   * @param constraints MediaTrackConstraints that are being used when restarting or reacquiring tracks\n   * @param userProvidedTrack Signals to the SDK whether or not the mediaTrack should be managed (i.e. released and reacquired) internally by the SDK\n   */\n  constructor(\n    mediaTrack: MediaStreamTrack,\n    constraints?: MediaTrackConstraints,\n    userProvidedTrack = true,\n    loggerOptions?: LoggerOptions,\n  ) {\n    super(mediaTrack, Track.Kind.Video, constraints, userProvidedTrack, loggerOptions);\n    this.senderLock = new Mutex();\n  }\n\n  get isSimulcast(): boolean {\n    if (this.sender \u0026\u0026 this.sender.getParameters().encodings.length \u003e 1) {\n      return true;\n    }\n    return false;\n  }\n\n  /* @internal */\n  startMonitor(signalClient: SignalClient) {\n    this.signalClient = signalClient;\n    if (!isWeb()) {\n      return;\n    }\n    // save original encodings\n    // TODO : merge simulcast tracks stats\n    const params = this.sender?.getParameters();\n    if (params) {\n      this.encodings = params.encodings;\n    }\n\n    if (this.monitorInterval) {\n      return;\n    }\n    this.monitorInterval = setInterval(() =\u003e {\n      this.monitorSender();\n    }, monitorFrequency);\n  }\n\n  stop() {\n    this._mediaStreamTrack.getConstraints();\n    this.simulcastCodecs.forEach((trackInfo) =\u003e {\n      trackInfo.mediaStreamTrack.stop();\n    });\n    super.stop();\n  }\n\n  async pauseUpstream() {\n    await super.pauseUpstream();\n    for await (const sc of this.simulcastCodecs.values()) {\n      await sc.sender?.replaceTrack(null);\n    }\n  }\n\n  async resumeUpstream() {\n    await super.resumeUpstream();\n    for await (const sc of this.simulcastCodecs.values()) {\n      await sc.sender?.replaceTrack(sc.mediaStreamTrack);\n    }\n  }\n\n  async mute(): Promise\u003ctypeof this\u003e {\n    const unlock = await this.muteLock.lock();\n    try {\n      if (this.isMuted) {\n        this.log.debug('Track already muted', this.logContext);\n        return this;\n      }\n\n      if (this.source === Track.Source.Camera \u0026\u0026 !this.isUserProvided) {\n        this.log.debug('stopping camera track', this.logContext);\n        // also stop the track, so that camera indicator is turned off\n        this._mediaStreamTrack.stop();\n      }\n      await super.mute();\n      return this;\n    } finally {\n      unlock();\n    }\n  }\n\n  async unmute(): Promise\u003ctypeof this\u003e {\n    const unlock = await this.muteLock.lock();\n    try {\n      if (!this.isMuted) {\n        this.log.debug('Track already unmuted', this.logContext);\n        return this;\n      }\n\n      if (this.source === Track.Source.Camera \u0026\u0026 !this.isUserProvided) {\n        this.log.debug('reacquiring camera track', this.logContext);\n        await this.restartTrack();\n      }\n      await super.unmute();\n      return this;\n    } finally {\n      unlock();\n    }\n  }\n\n  protected setTrackMuted(muted: boolean) {\n    super.setTrackMuted(muted);\n    for (const sc of this.simulcastCodecs.values()) {\n      sc.mediaStreamTrack.enabled = !muted;\n    }\n  }\n\n  async getSenderStats(): Promise\u003cVideoSenderStats[]\u003e {\n    if (!this.sender?.getStats) {\n      return [];\n    }\n\n    const items: VideoSenderStats[] = [];\n\n    const stats = await this.sender.getStats();\n    stats.forEach((v) =\u003e {\n      if (v.type === 'outbound-rtp') {\n        const vs: VideoSenderStats = {\n          type: 'video',\n          streamId: v.id,\n          frameHeight: v.frameHeight,\n          frameWidth: v.frameWidth,\n          framesPerSecond: v.framesPerSecond,\n          framesSent: v.framesSent,\n          firCount: v.firCount,\n          pliCount: v.pliCount,\n          nackCount: v.nackCount,\n          packetsSent: v.packetsSent,\n          bytesSent: v.bytesSent,\n          qualityLimitationReason: v.qualityLimitationReason,\n          qualityLimitationDurations: v.qualityLimitationDurations,\n          qualityLimitationResolutionChanges: v.qualityLimitationResolutionChanges,\n          rid: v.rid ?? v.id,\n          retransmittedPacketsSent: v.retransmittedPacketsSent,\n          targetBitrate: v.targetBitrate,\n          timestamp: v.timestamp,\n        };\n\n        // locate the appropriate remote-inbound-rtp item\n        const r = stats.get(v.remoteId);\n        if (r) {\n          vs.jitter = r.jitter;\n          vs.packetsLost = r.packetsLost;\n          vs.roundTripTime = r.roundTripTime;\n        }\n\n        items.push(vs);\n      }\n    });\n\n    // make sure highest res layer is always first\n    items.sort((a, b) =\u003e (b.frameWidth ?? 0) - (a.frameWidth ?? 0));\n    return items;\n  }\n\n  setPublishingQuality(maxQuality: VideoQuality) {\n    const qualities: SubscribedQuality[] = [];\n    for (let q = VideoQuality.LOW; q \u003c= VideoQuality.HIGH; q += 1) {\n      qualities.push(\n        new SubscribedQuality({\n          quality: q,\n          enabled: q \u003c= maxQuality,\n        }),\n      );\n    }\n    this.log.debug(`setting publishing quality. max quality ${maxQuality}`, this.logContext);\n    this.setPublishingLayers(isSVCCodec(this.codec), qualities);\n  }\n\n  async restartTrack(options?: VideoCaptureOptions) {\n    let constraints: MediaTrackConstraints | undefined;\n    if (options) {\n      const streamConstraints = constraintsForOptions({ video: options });\n      if (typeof streamConstraints.video !== 'boolean') {\n        constraints = streamConstraints.video;\n      }\n    }\n    await this.restart(constraints);\n\n    // reset cpu constrained state after track is restarted\n    this.isCpuConstrained = false;\n\n    for await (const sc of this.simulcastCodecs.values()) {\n      if (sc.sender \u0026\u0026 sc.sender.transport?.state !== 'closed') {\n        sc.mediaStreamTrack = this.mediaStreamTrack.clone();\n        await sc.sender.replaceTrack(sc.mediaStreamTrack);\n      }\n    }\n  }\n\n  async setProcessor(\n    processor: TrackProcessor\u003cTrack.Kind.Video\u003e,\n    showProcessedStreamLocally = true,\n  ) {\n    await super.setProcessor(processor, showProcessedStreamLocally);\n\n    if (this.processor?.processedTrack) {\n      for await (const sc of this.simulcastCodecs.values()) {\n        await sc.sender?.replaceTrack(this.processor.processedTrack);\n      }\n    }\n  }\n\n  async setDegradationPreference(preference: RTCDegradationPreference) {\n    this.degradationPreference = preference;\n    if (this.sender) {\n      try {\n        this.log.debug(`setting degradationPreference to ${preference}`, this.logContext);\n        const params = this.sender.getParameters();\n        params.degradationPreference = preference;\n        this.sender.setParameters(params);\n      } catch (e: any) {\n        this.log.warn(`failed to set degradationPreference`, { error: e, ...this.logContext });\n      }\n    }\n  }\n\n  addSimulcastTrack(\n    codec: VideoCodec,\n    encodings?: RTCRtpEncodingParameters[],\n  ): SimulcastTrackInfo | undefined {\n    if (this.simulcastCodecs.has(codec)) {\n      this.log.error(`${codec} already added, skipping adding simulcast codec`, this.logContext);\n      return;\n    }\n    const simulcastCodecInfo: SimulcastTrackInfo = {\n      codec,\n      mediaStreamTrack: this.mediaStreamTrack.clone(),\n      sender: undefined,\n      encodings,\n    };\n    this.simulcastCodecs.set(codec, simulcastCodecInfo);\n    return simulcastCodecInfo;\n  }\n\n  setSimulcastTrackSender(codec: VideoCodec, sender: RTCRtpSender) {\n    const simulcastCodecInfo = this.simulcastCodecs.get(codec);\n    if (!simulcastCodecInfo) {\n      return;\n    }\n    simulcastCodecInfo.sender = sender;\n\n    // browser will reenable disabled codec/layers after new codec has been published,\n    // so refresh subscribedCodecs after publish a new codec\n    setTimeout(() =\u003e {\n      if (this.subscribedCodecs) {\n        this.setPublishingCodecs(this.subscribedCodecs);\n      }\n    }, refreshSubscribedCodecAfterNewCodec);\n  }\n\n  /**\n   * @internal\n   * Sets codecs that should be publishing, returns new codecs that have not yet\n   * been published\n   */\n  async setPublishingCodecs(codecs: SubscribedCodec[]): Promise\u003cVideoCodec[]\u003e {\n    this.log.debug('setting publishing codecs', {\n      ...this.logContext,\n      codecs,\n      currentCodec: this.codec,\n    });\n    // only enable simulcast codec for preference codec setted\n    if (!this.codec \u0026\u0026 codecs.length \u003e 0) {\n      await this.setPublishingLayers(isSVCCodec(codecs[0].codec), codecs[0].qualities);\n\n      return [];\n    }\n\n    this.subscribedCodecs = codecs;\n\n    const newCodecs: VideoCodec[] = [];\n    for await (const codec of codecs) {\n      if (!this.codec || this.codec === codec.codec) {\n        await this.setPublishingLayers(isSVCCodec(codec.codec), codec.qualities);\n      } else {\n        const simulcastCodecInfo = this.simulcastCodecs.get(codec.codec as VideoCodec);\n        this.log.debug(`try setPublishingCodec for ${codec.codec}`, {\n          ...this.logContext,\n          simulcastCodecInfo,\n        });\n        if (!simulcastCodecInfo || !simulcastCodecInfo.sender) {\n          for (const q of codec.qualities) {\n            if (q.enabled) {\n              newCodecs.push(codec.codec as VideoCodec);\n              break;\n            }\n          }\n        } else if (simulcastCodecInfo.encodings) {\n          this.log.debug(`try setPublishingLayersForSender ${codec.codec}`, this.logContext);\n          await setPublishingLayersForSender(\n            simulcastCodecInfo.sender,\n            simulcastCodecInfo.encodings!,\n            codec.qualities,\n            this.senderLock,\n            isSVCCodec(codec.codec),\n            this.log,\n            this.logContext,\n          );\n        }\n      }\n    }\n    return newCodecs;\n  }\n\n  /**\n   * @internal\n   * Sets layers that should be publishing\n   */\n  async setPublishingLayers(isSvc: boolean, qualities: SubscribedQuality[]) {\n    if (this.optimizeForPerformance) {\n      this.log.info('skipping setPublishingLayers due to optimized publishing performance', {\n        ...this.logContext,\n        qualities,\n      });\n      return;\n    }\n    this.log.debug('setting publishing layers', { ...this.logContext, qualities });\n    if (!this.sender || !this.encodings) {\n      return;\n    }\n\n    await setPublishingLayersForSender(\n      this.sender,\n      this.encodings,\n      qualities,\n      this.senderLock,\n      isSvc,\n      this.log,\n      this.logContext,\n    );\n  }\n\n  /**\n   * Designed for lower powered devices, reduces video publishing quality and disables simulcast.\n   * @experimental\n   */\n  async prioritizePerformance() {\n    if (!this.sender) {\n      throw new Error('sender not found');\n    }\n\n    const unlock = await this.senderLock.lock();\n\n    try {\n      this.optimizeForPerformance = true;\n      const params = this.sender.getParameters();\n\n      params.encodings = params.encodings.map((e, idx) =\u003e ({\n        ...e,\n        active: idx === 0,\n        scaleResolutionDownBy: Math.max(\n          1,\n          Math.ceil((this.mediaStreamTrack.getSettings().height ?? 360) / 360),\n        ),\n        scalabilityMode: idx === 0 \u0026\u0026 isSVCCodec(this.codec) ? 'L1T3' : undefined,\n        maxFramerate: idx === 0 ? 15 : 0,\n        maxBitrate: idx === 0 ? e.maxBitrate : 0,\n      }));\n      this.log.debug('setting performance optimised encodings', {\n        ...this.logContext,\n        encodings: params.encodings,\n      });\n      this.encodings = params.encodings;\n      await this.sender.setParameters(params);\n    } catch (e) {\n      this.log.error('failed to set performance optimised encodings', {\n        ...this.logContext,\n        error: e,\n      });\n      this.optimizeForPerformance = false;\n    } finally {\n      unlock();\n    }\n  }\n\n  protected monitorSender = async () =\u003e {\n    if (!this.sender) {\n      this._currentBitrate = 0;\n      return;\n    }\n\n    let stats: VideoSenderStats[] | undefined;\n    try {\n      stats = await this.getSenderStats();\n    } catch (e) {\n      this.log.error('could not get video sender stats', { ...this.logContext, error: e });\n      return;\n    }\n    const statsMap = new Map\u003cstring, VideoSenderStats\u003e(stats.map((s) =\u003e [s.rid, s]));\n\n    const isCpuConstrained = stats.some((s) =\u003e s.qualityLimitationReason === 'cpu');\n    if (isCpuConstrained !== this.isCpuConstrained) {\n      this.isCpuConstrained = isCpuConstrained;\n      if (this.isCpuConstrained) {\n        this.emit(TrackEvent.CpuConstrained);\n      }\n    }\n\n    if (this.prevStats) {\n      let totalBitrate = 0;\n      statsMap.forEach((s, key) =\u003e {\n        const prev = this.prevStats?.get(key);\n        totalBitrate += computeBitrate(s, prev);\n      });\n      this._currentBitrate = totalBitrate;\n    }\n\n    this.prevStats = statsMap;\n  };\n\n  protected async handleAppVisibilityChanged() {\n    await super.handleAppVisibilityChanged();\n    if (!isMobile()) return;\n    if (this.isInBackground \u0026\u0026 this.source === Track.Source.Camera) {\n      this._mediaStreamTrack.enabled = false;\n    }\n  }\n}\n\nasync function setPublishingLayersForSender(\n  sender: RTCRtpSender,\n  senderEncodings: RTCRtpEncodingParameters[],\n  qualities: SubscribedQuality[],\n  senderLock: Mutex,\n  isSVC: boolean,\n  log: StructuredLogger,\n  logContext: Record\u003cstring, unknown\u003e,\n) {\n  const unlock = await senderLock.lock();\n  log.debug('setPublishingLayersForSender', { ...logContext, sender, qualities, senderEncodings });\n  try {\n    const params = sender.getParameters();\n    const { encodings } = params;\n    if (!encodings) {\n      return;\n    }\n\n    if (encodings.length !== senderEncodings.length) {\n      log.warn('cannot set publishing layers, encodings mismatch', {\n        ...logContext,\n        encodings,\n        senderEncodings,\n      });\n      return;\n    }\n\n    let hasChanged = false;\n\n    /* disable closable spatial layer as it has video blur / frozen issue with current server / client\n    1. chrome 113: when switching to up layer with scalability Mode change, it will generate a\n          low resolution frame and recover very quickly, but noticable\n    2. livekit sfu: additional pli request cause video frozen for a few frames, also noticable */\n    const closableSpatial = false;\n    /* @ts-ignore */\n    if (closableSpatial \u0026\u0026 encodings[0].scalabilityMode) {\n      // svc dynacast encodings\n      const encoding = encodings[0];\n      /* @ts-ignore */\n      // const mode = new ScalabilityMode(encoding.scalabilityMode);\n      let maxQuality = ProtoVideoQuality.OFF;\n      qualities.forEach((q) =\u003e {\n        if (q.enabled \u0026\u0026 (maxQuality === ProtoVideoQuality.OFF || q.quality \u003e maxQuality)) {\n          maxQuality = q.quality;\n        }\n      });\n\n      if (maxQuality === ProtoVideoQuality.OFF) {\n        if (encoding.active) {\n          encoding.active = false;\n          hasChanged = true;\n        }\n      } else if (!encoding.active /* || mode.spatial !== maxQuality + 1*/) {\n        hasChanged = true;\n        encoding.active = true;\n        /*\n        @ts-ignore\n        const originalMode = new ScalabilityMode(senderEncodings[0].scalabilityMode)\n        mode.spatial = maxQuality + 1;\n        mode.suffix = originalMode.suffix;\n        if (mode.spatial === 1) {\n          // no suffix for L1Tx\n          mode.suffix = undefined;\n        }\n        @ts-ignore\n        encoding.scalabilityMode = mode.toString();\n        encoding.scaleResolutionDownBy = 2 ** (2 - maxQuality);\n      */\n      }\n    } else {\n      if (isSVC) {\n        const hasEnabledEncoding = qualities.some((q) =\u003e q.enabled);\n        if (hasEnabledEncoding) {\n          qualities.forEach((q) =\u003e (q.enabled = true));\n        }\n      }\n      // simulcast dynacast encodings\n      encodings.forEach((encoding, idx) =\u003e {\n        let rid = encoding.rid ?? '';\n        if (rid === '') {\n          rid = 'q';\n        }\n        const quality = videoQualityForRid(rid);\n        const subscribedQuality = qualities.find((q) =\u003e q.quality === quality);\n        if (!subscribedQuality) {\n          return;\n        }\n        if (encoding.active !== subscribedQuality.enabled) {\n          hasChanged = true;\n          encoding.active = subscribedQuality.enabled;\n          log.debug(\n            `setting layer ${subscribedQuality.quality} to ${\n              encoding.active ? 'enabled' : 'disabled'\n            }`,\n            logContext,\n          );\n\n          // FireFox does not support setting encoding.active to false, so we\n          // have a workaround of lowering its bitrate and resolution to the min.\n          if (isFireFox()) {\n            if (subscribedQuality.enabled) {\n              encoding.scaleResolutionDownBy = senderEncodings[idx].scaleResolutionDownBy;\n              encoding.maxBitrate = senderEncodings[idx].maxBitrate;\n              /* @ts-ignore */\n              encoding.maxFrameRate = senderEncodings[idx].maxFrameRate;\n            } else {\n              encoding.scaleResolutionDownBy = 4;\n              encoding.maxBitrate = 10;\n              /* @ts-ignore */\n              encoding.maxFrameRate = 2;\n            }\n          }\n        }\n      });\n    }\n\n    if (hasChanged) {\n      params.encodings = encodings;\n      log.debug(`setting encodings`, { ...logContext, encodings: params.encodings });\n      await sender.setParameters(params);\n    }\n  } finally {\n    unlock();\n  }\n}\n\nexport function videoQualityForRid(rid: string): VideoQuality {\n  switch (rid) {\n    case 'f':\n      return VideoQuality.HIGH;\n    case 'h':\n      return VideoQuality.MEDIUM;\n    case 'q':\n      return VideoQuality.LOW;\n    default:\n      return VideoQuality.HIGH;\n  }\n}\n\nexport function videoLayersFromEncodings(\n  width: number,\n  height: number,\n  encodings?: RTCRtpEncodingParameters[],\n  svc?: boolean,\n): VideoLayer[] {\n  // default to a single layer, HQ\n  if (!encodings) {\n    return [\n      new VideoLayer({\n        quality: VideoQuality.HIGH,\n        width,\n        height,\n        bitrate: 0,\n        ssrc: 0,\n      }),\n    ];\n  }\n\n  if (svc) {\n    // svc layers\n    /* @ts-ignore */\n    const encodingSM = encodings[0].scalabilityMode as string;\n    const sm = new ScalabilityMode(encodingSM);\n    const layers = [];\n    const resRatio = sm.suffix == 'h' ? 1.5 : 2;\n    const bitratesRatio = sm.suffix == 'h' ? 2 : 3;\n    for (let i = 0; i \u003c sm.spatial; i += 1) {\n      layers.push(\n        new VideoLayer({\n          quality: Math.min(VideoQuality.HIGH, sm.spatial - 1) - i,\n          width: Math.ceil(width / resRatio ** i),\n          height: Math.ceil(height / resRatio ** i),\n          bitrate: encodings[0].maxBitrate\n            ? Math.ceil(encodings[0].maxBitrate / bitratesRatio ** i)\n            : 0,\n          ssrc: 0,\n        }),\n      );\n    }\n    return layers;\n  }\n\n  return encodings.map((encoding) =\u003e {\n    const scale = encoding.scaleResolutionDownBy ?? 1;\n    let quality = videoQualityForRid(encoding.rid ?? '');\n    return new VideoLayer({\n      quality,\n      width: Math.ceil(width / scale),\n      height: Math.ceil(height / scale),\n      bitrate: encoding.maxBitrate ?? 0,\n      ssrc: 0,\n    });\n  });\n}\n","import { Mutex } from '@livekit/mutex';\nimport {\n  type AddTrackRequest,\n  ClientConfigSetting,\n  ClientConfiguration,\n  type ConnectionQualityUpdate,\n  DataChannelInfo,\n  DataChannelReceiveState,\n  DataPacket,\n  DataPacket_Kind,\n  DisconnectReason,\n  type JoinResponse,\n  type LeaveRequest,\n  LeaveRequest_Action,\n  ParticipantInfo,\n  ReconnectReason,\n  type ReconnectResponse,\n  RequestResponse,\n  Room as RoomModel,\n  RoomMovedResponse,\n  RpcAck,\n  RpcResponse,\n  SignalTarget,\n  SpeakerInfo,\n  type StreamStateUpdate,\n  SubscribedQualityUpdate,\n  type SubscriptionPermissionUpdate,\n  type SubscriptionResponse,\n  SyncState,\n  TrackInfo,\n  type TrackPublishedResponse,\n  TrackUnpublishedResponse,\n  Transcription,\n  UpdateSubscription,\n  type UserPacket,\n} from '@livekit/protocol';\nimport { EventEmitter } from 'events';\nimport type { MediaAttributes } from 'sdp-transform';\nimport type TypedEventEmitter from 'typed-emitter';\nimport type { SignalOptions } from '../api/SignalClient';\nimport {\n  SignalClient,\n  SignalConnectionState,\n  toProtoSessionDescription,\n} from '../api/SignalClient';\nimport log, { LoggerNames, getLogger } from '../logger';\nimport type { InternalRoomOptions } from '../options';\nimport { DataPacketBuffer } from '../utils/dataPacketBuffer';\nimport { TTLMap } from '../utils/ttlmap';\nimport PCTransport, { PCEvents } from './PCTransport';\nimport { PCTransportManager, PCTransportState } from './PCTransportManager';\nimport type { ReconnectContext, ReconnectPolicy } from './ReconnectPolicy';\nimport type { RegionUrlProvider } from './RegionUrlProvider';\nimport { roomConnectOptionDefaults } from './defaults';\nimport {\n  ConnectionError,\n  ConnectionErrorReason,\n  NegotiationError,\n  TrackInvalidError,\n  UnexpectedConnectionState,\n} from './errors';\nimport { EngineEvent } from './events';\nimport { RpcError } from './rpc';\nimport CriticalTimers from './timers';\nimport type LocalTrack from './track/LocalTrack';\nimport type LocalTrackPublication from './track/LocalTrackPublication';\nimport LocalVideoTrack from './track/LocalVideoTrack';\nimport type { SimulcastTrackInfo } from './track/LocalVideoTrack';\nimport type RemoteTrackPublication from './track/RemoteTrackPublication';\nimport type { Track } from './track/Track';\nimport type { TrackPublishOptions, VideoCodec } from './track/options';\nimport { getTrackPublicationInfo } from './track/utils';\nimport type { LoggerOptions } from './types';\nimport {\n  isVideoCodec,\n  isVideoTrack,\n  isWeb,\n  sleep,\n  supportsAddTrack,\n  supportsTransceiver,\n} from './utils';\n\nconst lossyDataChannel = '_lossy';\nconst reliableDataChannel = '_reliable';\nconst minReconnectWait = 2 * 1000;\nconst leaveReconnect = 'leave-reconnect';\nconst reliabeReceiveStateTTL = 30_000;\n\nenum PCState {\n  New,\n  Connected,\n  Disconnected,\n  Reconnecting,\n  Closed,\n}\n\n/** @internal */\nexport default class RTCEngine extends (EventEmitter as new () =\u003e TypedEventEmitter\u003cEngineEventCallbacks\u003e) {\n  client: SignalClient;\n\n  rtcConfig: RTCConfiguration = {};\n\n  peerConnectionTimeout: number = roomConnectOptionDefaults.peerConnectionTimeout;\n\n  fullReconnectOnNext: boolean = false;\n\n  pcManager?: PCTransportManager;\n\n  /**\n   * @internal\n   */\n  latestJoinResponse?: JoinResponse;\n\n  /**\n   * @internal\n   */\n  latestRemoteOfferId: number = 0;\n\n  get isClosed() {\n    return this._isClosed;\n  }\n\n  get pendingReconnect() {\n    return !!this.reconnectTimeout;\n  }\n\n  private lossyDC?: RTCDataChannel;\n\n  // @ts-ignore noUnusedLocals\n  private lossyDCSub?: RTCDataChannel;\n\n  private reliableDC?: RTCDataChannel;\n\n  private dcBufferStatus: Map\u003cDataPacket_Kind, boolean\u003e;\n\n  // @ts-ignore noUnusedLocals\n  private reliableDCSub?: RTCDataChannel;\n\n  private subscriberPrimary: boolean = false;\n\n  private pcState: PCState = PCState.New;\n\n  private _isClosed: boolean = true;\n\n  private pendingTrackResolvers: {\n    [key: string]: { resolve: (info: TrackInfo) =\u003e void; reject: () =\u003e void };\n  } = {};\n\n  // keep join info around for reconnect, this could be a region url\n  private url?: string;\n\n  private token?: string;\n\n  private signalOpts?: SignalOptions;\n\n  private reconnectAttempts: number = 0;\n\n  private reconnectStart: number = 0;\n\n  private clientConfiguration?: ClientConfiguration;\n\n  private attemptingReconnect: boolean = false;\n\n  private reconnectPolicy: ReconnectPolicy;\n\n  private reconnectTimeout?: ReturnType\u003ctypeof setTimeout\u003e;\n\n  private participantSid?: string;\n\n  /** keeps track of how often an initial join connection has been tried */\n  private joinAttempts: number = 0;\n\n  /** specifies how often an initial join connection is allowed to retry */\n  private maxJoinAttempts: number = 1;\n\n  private closingLock: Mutex;\n\n  private dataProcessLock: Mutex;\n\n  private shouldFailNext: boolean = false;\n\n  private regionUrlProvider?: RegionUrlProvider;\n\n  private log = log;\n\n  private loggerOptions: LoggerOptions;\n\n  private publisherConnectionPromise: Promise\u003cvoid\u003e | undefined;\n\n  private reliableDataSequence: number = 1;\n\n  private reliableMessageBuffer = new DataPacketBuffer();\n\n  private reliableReceivedState: TTLMap\u003cstring, number\u003e = new TTLMap(reliabeReceiveStateTTL);\n\n  constructor(private options: InternalRoomOptions) {\n    super();\n    this.log = getLogger(options.loggerName ?? LoggerNames.Engine);\n    this.loggerOptions = {\n      loggerName: options.loggerName,\n      loggerContextCb: () =\u003e this.logContext,\n    };\n    this.client = new SignalClient(undefined, this.loggerOptions);\n    this.client.signalLatency = this.options.expSignalLatency;\n    this.reconnectPolicy = this.options.reconnectPolicy;\n    this.registerOnLineListener();\n    this.closingLock = new Mutex();\n    this.dataProcessLock = new Mutex();\n    this.dcBufferStatus = new Map([\n      [DataPacket_Kind.LOSSY, true],\n      [DataPacket_Kind.RELIABLE, true],\n    ]);\n\n    this.client.onParticipantUpdate = (updates) =\u003e\n      this.emit(EngineEvent.ParticipantUpdate, updates);\n    this.client.onConnectionQuality = (update) =\u003e\n      this.emit(EngineEvent.ConnectionQualityUpdate, update);\n    this.client.onRoomUpdate = (update) =\u003e this.emit(EngineEvent.RoomUpdate, update);\n    this.client.onSubscriptionError = (resp) =\u003e this.emit(EngineEvent.SubscriptionError, resp);\n    this.client.onSubscriptionPermissionUpdate = (update) =\u003e\n      this.emit(EngineEvent.SubscriptionPermissionUpdate, update);\n    this.client.onSpeakersChanged = (update) =\u003e this.emit(EngineEvent.SpeakersChanged, update);\n    this.client.onStreamStateUpdate = (update) =\u003e this.emit(EngineEvent.StreamStateChanged, update);\n    this.client.onRequestResponse = (response) =\u003e\n      this.emit(EngineEvent.SignalRequestResponse, response);\n  }\n\n  /** @internal */\n  get logContext() {\n    return {\n      room: this.latestJoinResponse?.room?.name,\n      roomID: this.latestJoinResponse?.room?.sid,\n      participant: this.latestJoinResponse?.participant?.identity,\n      pID: this.participantSid,\n    };\n  }\n\n  async join(\n    url: string,\n    token: string,\n    opts: SignalOptions,\n    abortSignal?: AbortSignal,\n  ): Promise\u003cJoinResponse\u003e {\n    this.url = url;\n    this.token = token;\n    this.signalOpts = opts;\n    this.maxJoinAttempts = opts.maxRetries;\n    try {\n      this.joinAttempts += 1;\n\n      this.setupSignalClientCallbacks();\n      const joinResponse = await this.client.join(url, token, opts, abortSignal);\n      this._isClosed = false;\n      this.latestJoinResponse = joinResponse;\n\n      this.subscriberPrimary = joinResponse.subscriberPrimary;\n      if (!this.pcManager) {\n        await this.configure(joinResponse);\n      }\n\n      // create offer\n      if (!this.subscriberPrimary || joinResponse.fastPublish) {\n        this.negotiate();\n      }\n\n      this.clientConfiguration = joinResponse.clientConfiguration;\n      this.emit(EngineEvent.SignalConnected, joinResponse);\n      return joinResponse;\n    } catch (e) {\n      if (e instanceof ConnectionError) {\n        if (e.reason === ConnectionErrorReason.ServerUnreachable) {\n          this.log.warn(\n            `Couldn't connect to server, attempt ${this.joinAttempts} of ${this.maxJoinAttempts}`,\n            this.logContext,\n          );\n          if (this.joinAttempts \u003c this.maxJoinAttempts) {\n            return this.join(url, token, opts, abortSignal);\n          }\n        }\n      }\n      throw e;\n    }\n  }\n\n  async close() {\n    const unlock = await this.closingLock.lock();\n    if (this.isClosed) {\n      unlock();\n      return;\n    }\n    try {\n      this._isClosed = true;\n      this.joinAttempts = 0;\n      this.emit(EngineEvent.Closing);\n      this.removeAllListeners();\n      this.deregisterOnLineListener();\n      this.clearPendingReconnect();\n      await this.cleanupPeerConnections();\n      await this.cleanupClient();\n    } finally {\n      unlock();\n    }\n  }\n\n  async cleanupPeerConnections() {\n    await this.pcManager?.close();\n    this.pcManager = undefined;\n\n    const dcCleanup = (dc: RTCDataChannel | undefined) =\u003e {\n      if (!dc) return;\n      dc.close();\n      dc.onbufferedamountlow = null;\n      dc.onclose = null;\n      dc.onclosing = null;\n      dc.onerror = null;\n      dc.onmessage = null;\n      dc.onopen = null;\n    };\n    dcCleanup(this.lossyDC);\n    dcCleanup(this.lossyDCSub);\n    dcCleanup(this.reliableDC);\n    dcCleanup(this.reliableDCSub);\n\n    this.lossyDC = undefined;\n    this.lossyDCSub = undefined;\n    this.reliableDC = undefined;\n    this.reliableDCSub = undefined;\n    this.reliableMessageBuffer = new DataPacketBuffer();\n    this.reliableDataSequence = 1;\n    this.reliableReceivedState.clear();\n  }\n\n  async cleanupClient() {\n    await this.client.close();\n    this.client.resetCallbacks();\n  }\n\n  addTrack(req: AddTrackRequest): Promise\u003cTrackInfo\u003e {\n    if (this.pendingTrackResolvers[req.cid]) {\n      throw new TrackInvalidError('a track with the same ID has already been published');\n    }\n    return new Promise\u003cTrackInfo\u003e((resolve, reject) =\u003e {\n      const publicationTimeout = setTimeout(() =\u003e {\n        delete this.pendingTrackResolvers[req.cid];\n        reject(\n          new ConnectionError(\n            'publication of local track timed out, no response from server',\n            ConnectionErrorReason.Timeout,\n          ),\n        );\n      }, 10_000);\n      this.pendingTrackResolvers[req.cid] = {\n        resolve: (info: TrackInfo) =\u003e {\n          clearTimeout(publicationTimeout);\n          resolve(info);\n        },\n        reject: () =\u003e {\n          clearTimeout(publicationTimeout);\n          reject(new Error('Cancelled publication by calling unpublish'));\n        },\n      };\n      this.client.sendAddTrack(req);\n    });\n  }\n\n  /**\n   * Removes sender from PeerConnection, returning true if it was removed successfully\n   * and a negotiation is necessary\n   * @param sender\n   * @returns\n   */\n  removeTrack(sender: RTCRtpSender): boolean {\n    if (sender.track \u0026\u0026 this.pendingTrackResolvers[sender.track.id]) {\n      const { reject } = this.pendingTrackResolvers[sender.track.id];\n      if (reject) {\n        reject();\n      }\n      delete this.pendingTrackResolvers[sender.track.id];\n    }\n    try {\n      this.pcManager!.removeTrack(sender);\n      return true;\n    } catch (e: unknown) {\n      this.log.warn('failed to remove track', { ...this.logContext, error: e });\n    }\n    return false;\n  }\n\n  updateMuteStatus(trackSid: string, muted: boolean) {\n    this.client.sendMuteTrack(trackSid, muted);\n  }\n\n  get dataSubscriberReadyState(): string | undefined {\n    return this.reliableDCSub?.readyState;\n  }\n\n  async getConnectedServerAddress(): Promise\u003cstring | undefined\u003e {\n    return this.pcManager?.getConnectedAddress();\n  }\n\n  /* @internal */\n  setRegionUrlProvider(provider: RegionUrlProvider) {\n    this.regionUrlProvider = provider;\n  }\n\n  private async configure(joinResponse: JoinResponse) {\n    // already configured\n    if (this.pcManager \u0026\u0026 this.pcManager.currentState !== PCTransportState.NEW) {\n      return;\n    }\n\n    this.participantSid = joinResponse.participant?.sid;\n\n    const rtcConfig = this.makeRTCConfiguration(joinResponse);\n\n    this.pcManager = new PCTransportManager(\n      rtcConfig,\n      joinResponse.subscriberPrimary,\n      this.loggerOptions,\n    );\n\n    this.emit(EngineEvent.TransportsCreated, this.pcManager.publisher, this.pcManager.subscriber);\n\n    this.pcManager.onIceCandidate = (candidate, target) =\u003e {\n      this.client.sendIceCandidate(candidate, target);\n    };\n\n    this.pcManager.onPublisherOffer = (offer, offerId) =\u003e {\n      this.client.sendOffer(offer, offerId);\n    };\n\n    this.pcManager.onDataChannel = this.handleDataChannel;\n    this.pcManager.onStateChange = async (connectionState, publisherState, subscriberState) =\u003e {\n      this.log.debug(`primary PC state changed ${connectionState}`, this.logContext);\n\n      if (['closed', 'disconnected', 'failed'].includes(publisherState)) {\n        // reset publisher connection promise\n        this.publisherConnectionPromise = undefined;\n      }\n      if (connectionState === PCTransportState.CONNECTED) {\n        const shouldEmit = this.pcState === PCState.New;\n        this.pcState = PCState.Connected;\n        if (shouldEmit) {\n          this.emit(EngineEvent.Connected, joinResponse);\n        }\n      } else if (connectionState === PCTransportState.FAILED) {\n        // on Safari, PeerConnection will switch to 'disconnected' during renegotiation\n        if (this.pcState === PCState.Connected) {\n          this.pcState = PCState.Disconnected;\n\n          this.handleDisconnect(\n            'peerconnection failed',\n            subscriberState === 'failed'\n              ? ReconnectReason.RR_SUBSCRIBER_FAILED\n              : ReconnectReason.RR_PUBLISHER_FAILED,\n          );\n        }\n      }\n\n      // detect cases where both signal client and peer connection are severed and assume that user has lost network connection\n      const isSignalSevered =\n        this.client.isDisconnected ||\n        this.client.currentState === SignalConnectionState.RECONNECTING;\n      const isPCSevered = [\n        PCTransportState.FAILED,\n        PCTransportState.CLOSING,\n        PCTransportState.CLOSED,\n      ].includes(connectionState);\n      if (isSignalSevered \u0026\u0026 isPCSevered \u0026\u0026 !this._isClosed) {\n        this.emit(EngineEvent.Offline);\n      }\n    };\n    this.pcManager.onTrack = (ev: RTCTrackEvent) =\u003e {\n      this.emit(EngineEvent.MediaTrackAdded, ev.track, ev.streams[0], ev.receiver);\n    };\n\n    if (!supportOptionalDatachannel(joinResponse.serverInfo?.protocol)) {\n      this.createDataChannels();\n    }\n  }\n\n  private setupSignalClientCallbacks() {\n    // configure signaling client\n    this.client.onAnswer = async (sd, offerId) =\u003e {\n      if (!this.pcManager) {\n        return;\n      }\n      this.log.debug('received server answer', { ...this.logContext, RTCSdpType: sd.type });\n      await this.pcManager.setPublisherAnswer(sd, offerId);\n    };\n\n    // add candidate on trickle\n    this.client.onTrickle = (candidate, target) =\u003e {\n      if (!this.pcManager) {\n        return;\n      }\n      this.log.debug('got ICE candidate from peer', { ...this.logContext, candidate, target });\n      this.pcManager.addIceCandidate(candidate, target);\n    };\n\n    // when server creates an offer for the client\n    this.client.onOffer = async (sd, offerId) =\u003e {\n      this.latestRemoteOfferId = offerId;\n      if (!this.pcManager) {\n        return;\n      }\n      const answer = await this.pcManager.createSubscriberAnswerFromOffer(sd, offerId);\n      if (answer) {\n        this.client.sendAnswer(answer, offerId);\n      }\n    };\n\n    this.client.onLocalTrackPublished = (res: TrackPublishedResponse) =\u003e {\n      this.log.debug('received trackPublishedResponse', {\n        ...this.logContext,\n        cid: res.cid,\n        track: res.track?.sid,\n      });\n      if (!this.pendingTrackResolvers[res.cid]) {\n        this.log.error(`missing track resolver for ${res.cid}`, {\n          ...this.logContext,\n          cid: res.cid,\n        });\n        return;\n      }\n      const { resolve } = this.pendingTrackResolvers[res.cid];\n      delete this.pendingTrackResolvers[res.cid];\n      resolve(res.track!);\n    };\n\n    this.client.onLocalTrackUnpublished = (response: TrackUnpublishedResponse) =\u003e {\n      this.emit(EngineEvent.LocalTrackUnpublished, response);\n    };\n\n    this.client.onLocalTrackSubscribed = (trackSid: string) =\u003e {\n      this.emit(EngineEvent.LocalTrackSubscribed, trackSid);\n    };\n\n    this.client.onTokenRefresh = (token: string) =\u003e {\n      this.token = token;\n    };\n\n    this.client.onRemoteMuteChanged = (trackSid: string, muted: boolean) =\u003e {\n      this.emit(EngineEvent.RemoteMute, trackSid, muted);\n    };\n\n    this.client.onSubscribedQualityUpdate = (update: SubscribedQualityUpdate) =\u003e {\n      this.emit(EngineEvent.SubscribedQualityUpdate, update);\n    };\n\n    this.client.onRoomMoved = (res: RoomMovedResponse) =\u003e {\n      this.participantSid = res.participant?.sid;\n      if (this.latestJoinResponse) {\n        this.latestJoinResponse.room = res.room;\n      }\n      this.emit(EngineEvent.RoomMoved, res);\n    };\n\n    this.client.onClose = () =\u003e {\n      this.handleDisconnect('signal', ReconnectReason.RR_SIGNAL_DISCONNECTED);\n    };\n\n    this.client.onLeave = (leave: LeaveRequest) =\u003e {\n      this.log.debug('client leave request', { ...this.logContext, reason: leave?.reason });\n      if (leave.regions \u0026\u0026 this.regionUrlProvider) {\n        this.log.debug('updating regions', this.logContext);\n        this.regionUrlProvider.setServerReportedRegions(leave.regions);\n      }\n      switch (leave.action) {\n        case LeaveRequest_Action.DISCONNECT:\n          this.emit(EngineEvent.Disconnected, leave?.reason);\n          this.close();\n          break;\n        case LeaveRequest_Action.RECONNECT:\n          this.fullReconnectOnNext = true;\n          // reconnect immediately instead of waiting for next attempt\n          this.handleDisconnect(leaveReconnect);\n          break;\n        case LeaveRequest_Action.RESUME:\n          // reconnect immediately instead of waiting for next attempt\n          this.handleDisconnect(leaveReconnect);\n        default:\n          break;\n      }\n    };\n  }\n\n  private makeRTCConfiguration(serverResponse: JoinResponse | ReconnectResponse): RTCConfiguration {\n    const rtcConfig = { ...this.rtcConfig };\n\n    if (this.signalOpts?.e2eeEnabled) {\n      this.log.debug('E2EE - setting up transports with insertable streams', this.logContext);\n      //  this makes sure that no data is sent before the transforms are ready\n      // @ts-ignore\n      rtcConfig.encodedInsertableStreams = true;\n    }\n\n    // update ICE servers before creating PeerConnection\n    if (serverResponse.iceServers \u0026\u0026 !rtcConfig.iceServers) {\n      const rtcIceServers: RTCIceServer[] = [];\n      serverResponse.iceServers.forEach((iceServer) =\u003e {\n        const rtcIceServer: RTCIceServer = {\n          urls: iceServer.urls,\n        };\n        if (iceServer.username) rtcIceServer.username = iceServer.username;\n        if (iceServer.credential) {\n          rtcIceServer.credential = iceServer.credential;\n        }\n        rtcIceServers.push(rtcIceServer);\n      });\n      rtcConfig.iceServers = rtcIceServers;\n    }\n\n    if (\n      serverResponse.clientConfiguration \u0026\u0026\n      serverResponse.clientConfiguration.forceRelay === ClientConfigSetting.ENABLED\n    ) {\n      rtcConfig.iceTransportPolicy = 'relay';\n    }\n\n    // @ts-ignore\n    rtcConfig.sdpSemantics = 'unified-plan';\n    // @ts-ignore\n    rtcConfig.continualGatheringPolicy = 'gather_continually';\n\n    return rtcConfig;\n  }\n\n  private createDataChannels() {\n    if (!this.pcManager) {\n      return;\n    }\n\n    // clear old data channel callbacks if recreate\n    if (this.lossyDC) {\n      this.lossyDC.onmessage = null;\n      this.lossyDC.onerror = null;\n    }\n    if (this.reliableDC) {\n      this.reliableDC.onmessage = null;\n      this.reliableDC.onerror = null;\n    }\n\n    // create data channels\n    this.lossyDC = this.pcManager.createPublisherDataChannel(lossyDataChannel, {\n      ordered: false,\n      maxRetransmits: 0,\n    });\n    this.reliableDC = this.pcManager.createPublisherDataChannel(reliableDataChannel, {\n      ordered: true,\n    });\n\n    // also handle messages over the pub channel, for backwards compatibility\n    this.lossyDC.onmessage = this.handleDataMessage;\n    this.reliableDC.onmessage = this.handleDataMessage;\n\n    // handle datachannel errors\n    this.lossyDC.onerror = this.handleDataError;\n    this.reliableDC.onerror = this.handleDataError;\n\n    // set up dc buffer threshold, set to 64kB (otherwise 0 by default)\n    this.lossyDC.bufferedAmountLowThreshold = 65535;\n    this.reliableDC.bufferedAmountLowThreshold = 65535;\n\n    // handle buffer amount low events\n    this.lossyDC.onbufferedamountlow = this.handleBufferedAmountLow;\n    this.reliableDC.onbufferedamountlow = this.handleBufferedAmountLow;\n  }\n\n  private handleDataChannel = async ({ channel }: RTCDataChannelEvent) =\u003e {\n    if (!channel) {\n      return;\n    }\n    if (channel.label === reliableDataChannel) {\n      this.reliableDCSub = channel;\n    } else if (channel.label === lossyDataChannel) {\n      this.lossyDCSub = channel;\n    } else {\n      return;\n    }\n    this.log.debug(`on data channel ${channel.id}, ${channel.label}`, this.logContext);\n    channel.onmessage = this.handleDataMessage;\n  };\n\n  private handleDataMessage = async (message: MessageEvent) =\u003e {\n    // make sure to respect incoming data message order by processing message events one after the other\n    const unlock = await this.dataProcessLock.lock();\n    try {\n      // decode\n      let buffer: ArrayBuffer | undefined;\n      if (message.data instanceof ArrayBuffer) {\n        buffer = message.data;\n      } else if (message.data instanceof Blob) {\n        buffer = await message.data.arrayBuffer();\n      } else {\n        this.log.error('unsupported data type', { ...this.logContext, data: message.data });\n        return;\n      }\n      const dp = DataPacket.fromBinary(new Uint8Array(buffer));\n\n      if (dp.sequence \u003e 0 \u0026\u0026 dp.participantSid !== '') {\n        const lastSeq = this.reliableReceivedState.get(dp.participantSid);\n        if (lastSeq \u0026\u0026 dp.sequence \u003c= lastSeq) {\n          // ignore duplicate or out-of-order packets in reliable channel\n          return;\n        }\n        this.reliableReceivedState.set(dp.participantSid, dp.sequence);\n      }\n\n      if (dp.value?.case === 'speaker') {\n        // dispatch speaker updates\n        this.emit(EngineEvent.ActiveSpeakersUpdate, dp.value.value.speakers);\n      } else {\n        if (dp.value?.case === 'user') {\n          // compatibility\n          applyUserDataCompat(dp, dp.value.value);\n        }\n        this.emit(EngineEvent.DataPacketReceived, dp);\n      }\n    } finally {\n      unlock();\n    }\n  };\n\n  private handleDataError = (event: Event) =\u003e {\n    const channel = event.currentTarget as RTCDataChannel;\n    const channelKind = channel.maxRetransmits === 0 ? 'lossy' : 'reliable';\n\n    if (event instanceof ErrorEvent \u0026\u0026 event.error) {\n      const { error } = event.error;\n      this.log.error(`DataChannel error on ${channelKind}: ${event.message}`, {\n        ...this.logContext,\n        error,\n      });\n    } else {\n      this.log.error(`Unknown DataChannel error on ${channelKind}`, { ...this.logContext, event });\n    }\n  };\n\n  private handleBufferedAmountLow = (event: Event) =\u003e {\n    const channel = event.currentTarget as RTCDataChannel;\n    const channelKind =\n      channel.maxRetransmits === 0 ? DataPacket_Kind.LOSSY : DataPacket_Kind.RELIABLE;\n\n    this.updateAndEmitDCBufferStatus(channelKind);\n  };\n\n  async createSender(\n    track: LocalTrack,\n    opts: TrackPublishOptions,\n    encodings?: RTCRtpEncodingParameters[],\n  ) {\n    if (supportsTransceiver()) {\n      const sender = await this.createTransceiverRTCRtpSender(track, opts, encodings);\n      return sender;\n    }\n    if (supportsAddTrack()) {\n      this.log.warn('using add-track fallback', this.logContext);\n      const sender = await this.createRTCRtpSender(track.mediaStreamTrack);\n      return sender;\n    }\n    throw new UnexpectedConnectionState('Required webRTC APIs not supported on this device');\n  }\n\n  async createSimulcastSender(\n    track: LocalVideoTrack,\n    simulcastTrack: SimulcastTrackInfo,\n    opts: TrackPublishOptions,\n    encodings?: RTCRtpEncodingParameters[],\n  ) {\n    // store RTCRtpSender\n    if (supportsTransceiver()) {\n      return this.createSimulcastTransceiverSender(track, simulcastTrack, opts, encodings);\n    }\n    if (supportsAddTrack()) {\n      this.log.debug('using add-track fallback', this.logContext);\n      return this.createRTCRtpSender(track.mediaStreamTrack);\n    }\n\n    throw new UnexpectedConnectionState('Cannot stream on this device');\n  }\n\n  private async createTransceiverRTCRtpSender(\n    track: LocalTrack,\n    opts: TrackPublishOptions,\n    encodings?: RTCRtpEncodingParameters[],\n  ) {\n    if (!this.pcManager) {\n      throw new UnexpectedConnectionState('publisher is closed');\n    }\n\n    const streams: MediaStream[] = [];\n\n    if (track.mediaStream) {\n      streams.push(track.mediaStream);\n    }\n\n    if (isVideoTrack(track)) {\n      track.codec = opts.videoCodec;\n    }\n\n    const transceiverInit: RTCRtpTransceiverInit = { direction: 'sendonly', streams };\n    if (encodings) {\n      transceiverInit.sendEncodings = encodings;\n    }\n    // addTransceiver for react-native is async. web is synchronous, but await won't effect it.\n    const transceiver = await this.pcManager.addPublisherTransceiver(\n      track.mediaStreamTrack,\n      transceiverInit,\n    );\n\n    return transceiver.sender;\n  }\n\n  private async createSimulcastTransceiverSender(\n    track: LocalVideoTrack,\n    simulcastTrack: SimulcastTrackInfo,\n    opts: TrackPublishOptions,\n    encodings?: RTCRtpEncodingParameters[],\n  ) {\n    if (!this.pcManager) {\n      throw new UnexpectedConnectionState('publisher is closed');\n    }\n    const transceiverInit: RTCRtpTransceiverInit = { direction: 'sendonly' };\n    if (encodings) {\n      transceiverInit.sendEncodings = encodings;\n    }\n    // addTransceiver for react-native is async. web is synchronous, but await won't effect it.\n    const transceiver = await this.pcManager.addPublisherTransceiver(\n      simulcastTrack.mediaStreamTrack,\n      transceiverInit,\n    );\n    if (!opts.videoCodec) {\n      return;\n    }\n    track.setSimulcastTrackSender(opts.videoCodec, transceiver.sender);\n    return transceiver.sender;\n  }\n\n  private async createRTCRtpSender(track: MediaStreamTrack) {\n    if (!this.pcManager) {\n      throw new UnexpectedConnectionState('publisher is closed');\n    }\n    return this.pcManager.addPublisherTrack(track);\n  }\n\n  // websocket reconnect behavior. if websocket is interrupted, and the PeerConnection\n  // continues to work, we can reconnect to websocket to continue the session\n  // after a number of retries, we'll close and give up permanently\n  private handleDisconnect = (connection: string, disconnectReason?: ReconnectReason) =\u003e {\n    if (this._isClosed) {\n      return;\n    }\n\n    this.log.warn(`${connection} disconnected`, this.logContext);\n    if (this.reconnectAttempts === 0) {\n      // only reset start time on the first try\n      this.reconnectStart = Date.now();\n    }\n\n    const disconnect = (duration: number) =\u003e {\n      this.log.warn(\n        `could not recover connection after ${this.reconnectAttempts} attempts, ${duration}ms. giving up`,\n        this.logContext,\n      );\n      this.emit(EngineEvent.Disconnected);\n      this.close();\n    };\n\n    const duration = Date.now() - this.reconnectStart;\n    let delay = this.getNextRetryDelay({\n      elapsedMs: duration,\n      retryCount: this.reconnectAttempts,\n    });\n\n    if (delay === null) {\n      disconnect(duration);\n      return;\n    }\n    if (connection === leaveReconnect) {\n      delay = 0;\n    }\n\n    this.log.debug(`reconnecting in ${delay}ms`, this.logContext);\n\n    this.clearReconnectTimeout();\n    if (this.token \u0026\u0026 this.regionUrlProvider) {\n      // token may have been refreshed, we do not want to recreate the regionUrlProvider\n      // since the current engine may have inherited a regional url\n      this.regionUrlProvider.updateToken(this.token);\n    }\n    this.reconnectTimeout = CriticalTimers.setTimeout(\n      () =\u003e\n        this.attemptReconnect(disconnectReason).finally(() =\u003e (this.reconnectTimeout = undefined)),\n      delay,\n    );\n  };\n\n  private async attemptReconnect(reason?: ReconnectReason) {\n    if (this._isClosed) {\n      return;\n    }\n    // guard for attempting reconnection multiple times while one attempt is still not finished\n    if (this.attemptingReconnect) {\n      log.warn('already attempting reconnect, returning early', this.logContext);\n      return;\n    }\n    if (\n      this.clientConfiguration?.resumeConnection === ClientConfigSetting.DISABLED ||\n      // signaling state could change to closed due to hardware sleep\n      // those connections cannot be resumed\n      (this.pcManager?.currentState ?? PCTransportState.NEW) === PCTransportState.NEW\n    ) {\n      this.fullReconnectOnNext = true;\n    }\n\n    try {\n      this.attemptingReconnect = true;\n      if (this.fullReconnectOnNext) {\n        await this.restartConnection();\n      } else {\n        await this.resumeConnection(reason);\n      }\n      this.clearPendingReconnect();\n      this.fullReconnectOnNext = false;\n    } catch (e) {\n      this.reconnectAttempts += 1;\n      let recoverable = true;\n      if (e instanceof UnexpectedConnectionState) {\n        this.log.debug('received unrecoverable error', { ...this.logContext, error: e });\n        // unrecoverable\n        recoverable = false;\n      } else if (!(e instanceof SignalReconnectError)) {\n        // cannot resume\n        this.fullReconnectOnNext = true;\n      }\n\n      if (recoverable) {\n        this.handleDisconnect('reconnect', ReconnectReason.RR_UNKNOWN);\n      } else {\n        this.log.info(\n          `could not recover connection after ${this.reconnectAttempts} attempts, ${\n            Date.now() - this.reconnectStart\n          }ms. giving up`,\n          this.logContext,\n        );\n        this.emit(EngineEvent.Disconnected);\n        await this.close();\n      }\n    } finally {\n      this.attemptingReconnect = false;\n    }\n  }\n\n  private getNextRetryDelay(context: ReconnectContext) {\n    try {\n      return this.reconnectPolicy.nextRetryDelayInMs(context);\n    } catch (e) {\n      this.log.warn('encountered error in reconnect policy', { ...this.logContext, error: e });\n    }\n\n    // error in user code with provided reconnect policy, stop reconnecting\n    return null;\n  }\n\n  private async restartConnection(regionUrl?: string) {\n    try {\n      if (!this.url || !this.token) {\n        // permanent failure, don't attempt reconnection\n        throw new UnexpectedConnectionState('could not reconnect, url or token not saved');\n      }\n\n      this.log.info(`reconnecting, attempt: ${this.reconnectAttempts}`, this.logContext);\n      this.emit(EngineEvent.Restarting);\n\n      if (!this.client.isDisconnected) {\n        await this.client.sendLeave();\n      }\n      await this.cleanupPeerConnections();\n      await this.cleanupClient();\n\n      let joinResponse: JoinResponse;\n      try {\n        if (!this.signalOpts) {\n          this.log.warn(\n            'attempted connection restart, without signal options present',\n            this.logContext,\n          );\n          throw new SignalReconnectError();\n        }\n        // in case a regionUrl is passed, the region URL takes precedence\n        joinResponse = await this.join(regionUrl ?? this.url, this.token, this.signalOpts);\n      } catch (e) {\n        if (e instanceof ConnectionError \u0026\u0026 e.reason === ConnectionErrorReason.NotAllowed) {\n          throw new UnexpectedConnectionState('could not reconnect, token might be expired');\n        }\n        throw new SignalReconnectError();\n      }\n\n      if (this.shouldFailNext) {\n        this.shouldFailNext = false;\n        throw new Error('simulated failure');\n      }\n\n      this.client.setReconnected();\n      this.emit(EngineEvent.SignalRestarted, joinResponse);\n\n      await this.waitForPCReconnected();\n\n      // re-check signal connection state before setting engine as resumed\n      if (this.client.currentState !== SignalConnectionState.CONNECTED) {\n        throw new SignalReconnectError('Signal connection got severed during reconnect');\n      }\n\n      this.regionUrlProvider?.resetAttempts();\n      // reconnect success\n      this.emit(EngineEvent.Restarted);\n    } catch (error) {\n      const nextRegionUrl = await this.regionUrlProvider?.getNextBestRegionUrl();\n      if (nextRegionUrl) {\n        await this.restartConnection(nextRegionUrl);\n        return;\n      } else {\n        // no more regions to try (or we're not on cloud)\n        this.regionUrlProvider?.resetAttempts();\n        throw error;\n      }\n    }\n  }\n\n  private async resumeConnection(reason?: ReconnectReason): Promise\u003cvoid\u003e {\n    if (!this.url || !this.token) {\n      // permanent failure, don't attempt reconnection\n      throw new UnexpectedConnectionState('could not reconnect, url or token not saved');\n    }\n    // trigger publisher reconnect\n    if (!this.pcManager) {\n      throw new UnexpectedConnectionState('publisher and subscriber connections unset');\n    }\n\n    this.log.info(`resuming signal connection, attempt ${this.reconnectAttempts}`, this.logContext);\n    this.emit(EngineEvent.Resuming);\n    let res: ReconnectResponse | undefined;\n    try {\n      this.setupSignalClientCallbacks();\n      res = await this.client.reconnect(this.url, this.token, this.participantSid, reason);\n    } catch (error) {\n      let message = '';\n      if (error instanceof Error) {\n        message = error.message;\n        this.log.error(error.message, { ...this.logContext, error });\n      }\n      if (error instanceof ConnectionError \u0026\u0026 error.reason === ConnectionErrorReason.NotAllowed) {\n        throw new UnexpectedConnectionState('could not reconnect, token might be expired');\n      }\n      if (error instanceof ConnectionError \u0026\u0026 error.reason === ConnectionErrorReason.LeaveRequest) {\n        throw error;\n      }\n      throw new SignalReconnectError(message);\n    }\n    this.emit(EngineEvent.SignalResumed);\n\n    if (res) {\n      const rtcConfig = this.makeRTCConfiguration(res);\n      this.pcManager.updateConfiguration(rtcConfig);\n      if (this.latestJoinResponse) {\n        this.latestJoinResponse.serverInfo = res.serverInfo;\n      }\n    } else {\n      this.log.warn('Did not receive reconnect response', this.logContext);\n    }\n\n    if (this.shouldFailNext) {\n      this.shouldFailNext = false;\n      throw new Error('simulated failure');\n    }\n\n    await this.pcManager.triggerIceRestart();\n\n    await this.waitForPCReconnected();\n\n    // re-check signal connection state before setting engine as resumed\n    if (this.client.currentState !== SignalConnectionState.CONNECTED) {\n      throw new SignalReconnectError('Signal connection got severed during reconnect');\n    }\n\n    this.client.setReconnected();\n\n    // recreate publish datachannel if it's id is null\n    // (for safari https://bugs.webkit.org/show_bug.cgi?id=184688)\n    if (this.reliableDC?.readyState === 'open' \u0026\u0026 this.reliableDC.id === null) {\n      this.createDataChannels();\n    }\n\n    if (res?.lastMessageSeq) {\n      this.resendReliableMessagesForResume(res.lastMessageSeq);\n    }\n\n    // resume success\n    this.emit(EngineEvent.Resumed);\n  }\n\n  async waitForPCInitialConnection(timeout?: number, abortController?: AbortController) {\n    if (!this.pcManager) {\n      throw new UnexpectedConnectionState('PC manager is closed');\n    }\n    await this.pcManager.ensurePCTransportConnection(abortController, timeout);\n  }\n\n  private async waitForPCReconnected() {\n    this.pcState = PCState.Reconnecting;\n\n    this.log.debug('waiting for peer connection to reconnect', this.logContext);\n    try {\n      await sleep(minReconnectWait); // FIXME setTimeout again not ideal for a connection critical path\n      if (!this.pcManager) {\n        throw new UnexpectedConnectionState('PC manager is closed');\n      }\n      await this.pcManager.ensurePCTransportConnection(undefined, this.peerConnectionTimeout);\n      this.pcState = PCState.Connected;\n    } catch (e: any) {\n      // TODO do we need a `failed` state here for the PC?\n      this.pcState = PCState.Disconnected;\n      throw new ConnectionError(\n        `could not establish PC connection, ${e.message}`,\n        ConnectionErrorReason.InternalError,\n      );\n    }\n  }\n\n  waitForRestarted = () =\u003e {\n    return new Promise\u003cvoid\u003e((resolve, reject) =\u003e {\n      if (this.pcState === PCState.Connected) {\n        resolve();\n      }\n      const onRestarted = () =\u003e {\n        this.off(EngineEvent.Disconnected, onDisconnected);\n        resolve();\n      };\n      const onDisconnected = () =\u003e {\n        this.off(EngineEvent.Restarted, onRestarted);\n        reject();\n      };\n      this.once(EngineEvent.Restarted, onRestarted);\n      this.once(EngineEvent.Disconnected, onDisconnected);\n    });\n  };\n\n  /** @internal */\n  async publishRpcResponse(\n    destinationIdentity: string,\n    requestId: string,\n    payload: string | null,\n    error: RpcError | null,\n  ) {\n    const packet = new DataPacket({\n      destinationIdentities: [destinationIdentity],\n      kind: DataPacket_Kind.RELIABLE,\n      value: {\n        case: 'rpcResponse',\n        value: new RpcResponse({\n          requestId,\n          value: error\n            ? { case: 'error', value: error.toProto() }\n            : { case: 'payload', value: payload ?? '' },\n        }),\n      },\n    });\n\n    await this.sendDataPacket(packet, DataPacket_Kind.RELIABLE);\n  }\n\n  /** @internal */\n  async publishRpcAck(destinationIdentity: string, requestId: string) {\n    const packet = new DataPacket({\n      destinationIdentities: [destinationIdentity],\n      kind: DataPacket_Kind.RELIABLE,\n      value: {\n        case: 'rpcAck',\n        value: new RpcAck({\n          requestId,\n        }),\n      },\n    });\n\n    await this.sendDataPacket(packet, DataPacket_Kind.RELIABLE);\n  }\n\n  /* @internal */\n  async sendDataPacket(packet: DataPacket, kind: DataPacket_Kind) {\n    // make sure we do have a data connection\n    await this.ensurePublisherConnected(kind);\n\n    if (kind === DataPacket_Kind.RELIABLE) {\n      packet.sequence = this.reliableDataSequence;\n      this.reliableDataSequence += 1;\n    }\n    const msg = packet.toBinary();\n    const dc = this.dataChannelForKind(kind);\n    if (dc) {\n      if (kind === DataPacket_Kind.RELIABLE) {\n        this.reliableMessageBuffer.push({ data: msg, sequence: packet.sequence });\n      }\n\n      if (this.attemptingReconnect) {\n        return;\n      }\n\n      dc.send(msg);\n    }\n\n    this.updateAndEmitDCBufferStatus(kind);\n  }\n\n  private async resendReliableMessagesForResume(lastMessageSeq: number) {\n    await this.ensurePublisherConnected(DataPacket_Kind.RELIABLE);\n    const dc = this.dataChannelForKind(DataPacket_Kind.RELIABLE);\n    if (dc) {\n      this.reliableMessageBuffer.popToSequence(lastMessageSeq);\n      this.reliableMessageBuffer.getAll().forEach((msg) =\u003e {\n        dc.send(msg.data);\n      });\n    }\n    this.updateAndEmitDCBufferStatus(DataPacket_Kind.RELIABLE);\n  }\n\n  private updateAndEmitDCBufferStatus = (kind: DataPacket_Kind) =\u003e {\n    const status = this.isBufferStatusLow(kind);\n    if (typeof status !== 'undefined' \u0026\u0026 status !== this.dcBufferStatus.get(kind)) {\n      this.dcBufferStatus.set(kind, status);\n      this.emit(EngineEvent.DCBufferStatusChanged, status, kind);\n    }\n  };\n\n  private isBufferStatusLow = (kind: DataPacket_Kind): boolean | undefined =\u003e {\n    const dc = this.dataChannelForKind(kind);\n    if (dc) {\n      if (kind === DataPacket_Kind.RELIABLE) {\n        this.reliableMessageBuffer.alignBufferedAmount(dc.bufferedAmount);\n      }\n      return dc.bufferedAmount \u003c= dc.bufferedAmountLowThreshold;\n    }\n  };\n\n  waitForBufferStatusLow(kind: DataPacket_Kind): Promise\u003cvoid\u003e {\n    return new Promise(async (resolve, reject) =\u003e {\n      if (this.isBufferStatusLow(kind)) {\n        resolve();\n      } else {\n        const onClosing = () =\u003e reject('Engine closed');\n        this.once(EngineEvent.Closing, onClosing);\n        while (!this.dcBufferStatus.get(kind)) {\n          await sleep(10);\n        }\n        this.off(EngineEvent.Closing, onClosing);\n        resolve();\n      }\n    });\n  }\n\n  /**\n   * @internal\n   */\n  async ensureDataTransportConnected(\n    kind: DataPacket_Kind,\n    subscriber: boolean = this.subscriberPrimary,\n  ) {\n    if (!this.pcManager) {\n      throw new UnexpectedConnectionState('PC manager is closed');\n    }\n    const transport = subscriber ? this.pcManager.subscriber : this.pcManager.publisher;\n    const transportName = subscriber ? 'Subscriber' : 'Publisher';\n    if (!transport) {\n      throw new ConnectionError(\n        `${transportName} connection not set`,\n        ConnectionErrorReason.InternalError,\n      );\n    }\n\n    let needNegotiation = false;\n    if (!subscriber \u0026\u0026 !this.dataChannelForKind(kind, subscriber)) {\n      this.createDataChannels();\n      needNegotiation = true;\n    }\n\n    if (\n      !needNegotiation \u0026\u0026\n      !subscriber \u0026\u0026\n      !this.pcManager.publisher.isICEConnected \u0026\u0026\n      this.pcManager.publisher.getICEConnectionState() !== 'checking'\n    ) {\n      needNegotiation = true;\n    }\n    if (needNegotiation) {\n      // start negotiation\n      this.negotiate();\n    }\n\n    const targetChannel = this.dataChannelForKind(kind, subscriber);\n    if (targetChannel?.readyState === 'open') {\n      return;\n    }\n\n    // wait until ICE connected\n    const endTime = new Date().getTime() + this.peerConnectionTimeout;\n    while (new Date().getTime() \u003c endTime) {\n      if (\n        transport.isICEConnected \u0026\u0026\n        this.dataChannelForKind(kind, subscriber)?.readyState === 'open'\n      ) {\n        return;\n      }\n      await sleep(50);\n    }\n\n    throw new ConnectionError(\n      `could not establish ${transportName} connection, state: ${transport.getICEConnectionState()}`,\n      ConnectionErrorReason.InternalError,\n    );\n  }\n\n  private async ensurePublisherConnected(kind: DataPacket_Kind) {\n    if (!this.publisherConnectionPromise) {\n      this.publisherConnectionPromise = this.ensureDataTransportConnected(kind, false);\n    }\n    await this.publisherConnectionPromise;\n  }\n\n  /* @internal */\n  verifyTransport(): boolean {\n    if (!this.pcManager) {\n      return false;\n    }\n    // primary connection\n    if (this.pcManager.currentState !== PCTransportState.CONNECTED) {\n      return false;\n    }\n\n    // ensure signal is connected\n    if (!this.client.ws || this.client.ws.readyState === WebSocket.CLOSED) {\n      return false;\n    }\n    return true;\n  }\n\n  /** @internal */\n  async negotiate(): Promise\u003cvoid\u003e {\n    // observe signal state\n    return new Promise\u003cvoid\u003e(async (resolve, reject) =\u003e {\n      if (!this.pcManager) {\n        reject(new NegotiationError('PC manager is closed'));\n        return;\n      }\n\n      this.pcManager.requirePublisher();\n      // don't negotiate without any transceivers or data channel, it will generate sdp without ice frag then negotiate failed\n      if (\n        this.pcManager.publisher.getTransceivers().length == 0 \u0026\u0026\n        !this.lossyDC \u0026\u0026\n        !this.reliableDC\n      ) {\n        this.createDataChannels();\n      }\n\n      const abortController = new AbortController();\n\n      const handleClosed = () =\u003e {\n        abortController.abort();\n        this.log.debug('engine disconnected while negotiation was ongoing', this.logContext);\n        resolve();\n        return;\n      };\n\n      if (this.isClosed) {\n        reject('cannot negotiate on closed engine');\n      }\n      this.on(EngineEvent.Closing, handleClosed);\n\n      this.pcManager.publisher.once(\n        PCEvents.RTPVideoPayloadTypes,\n        (rtpTypes: MediaAttributes['rtp']) =\u003e {\n          const rtpMap = new Map\u003cnumber, VideoCodec\u003e();\n          rtpTypes.forEach((rtp) =\u003e {\n            const codec = rtp.codec.toLowerCase();\n            if (isVideoCodec(codec)) {\n              rtpMap.set(rtp.payload, codec);\n            }\n          });\n          this.emit(EngineEvent.RTPVideoMapUpdate, rtpMap);\n        },\n      );\n\n      try {\n        await this.pcManager.negotiate(abortController);\n        resolve();\n      } catch (e: any) {\n        if (e instanceof NegotiationError) {\n          this.fullReconnectOnNext = true;\n        }\n        this.handleDisconnect('negotiation', ReconnectReason.RR_UNKNOWN);\n        reject(e);\n      } finally {\n        this.off(EngineEvent.Closing, handleClosed);\n      }\n    });\n  }\n\n  dataChannelForKind(kind: DataPacket_Kind, sub?: boolean): RTCDataChannel | undefined {\n    if (!sub) {\n      if (kind === DataPacket_Kind.LOSSY) {\n        return this.lossyDC;\n      }\n      if (kind === DataPacket_Kind.RELIABLE) {\n        return this.reliableDC;\n      }\n    } else {\n      if (kind === DataPacket_Kind.LOSSY) {\n        return this.lossyDCSub;\n      }\n      if (kind === DataPacket_Kind.RELIABLE) {\n        return this.reliableDCSub;\n      }\n    }\n  }\n\n  /** @internal */\n  sendSyncState(remoteTracks: RemoteTrackPublication[], localTracks: LocalTrackPublication[]) {\n    if (!this.pcManager) {\n      this.log.warn('sync state cannot be sent without peer connection setup', this.logContext);\n      return;\n    }\n    const previousAnswer = this.pcManager.subscriber.getLocalDescription();\n    const previousOffer = this.pcManager.subscriber.getRemoteDescription();\n\n    /* 1. autosubscribe on, so subscribed tracks = all tracks - unsub tracks,\n          in this case, we send unsub tracks, so server add all tracks to this\n          subscribe pc and unsub special tracks from it.\n       2. autosubscribe off, we send subscribed tracks.\n    */\n    const autoSubscribe = this.signalOpts?.autoSubscribe ?? true;\n    const trackSids = new Array\u003cstring\u003e();\n    const trackSidsDisabled = new Array\u003cstring\u003e();\n\n    remoteTracks.forEach((track) =\u003e {\n      if (track.isDesired !== autoSubscribe) {\n        trackSids.push(track.trackSid);\n      }\n      if (!track.isEnabled) {\n        trackSidsDisabled.push(track.trackSid);\n      }\n    });\n\n    this.client.sendSyncState(\n      new SyncState({\n        answer: previousAnswer\n          ? toProtoSessionDescription({\n              sdp: previousAnswer.sdp,\n              type: previousAnswer.type,\n            })\n          : undefined,\n        offer: previousOffer\n          ? toProtoSessionDescription({\n              sdp: previousOffer.sdp,\n              type: previousOffer.type,\n            })\n          : undefined,\n        subscription: new UpdateSubscription({\n          trackSids,\n          subscribe: !autoSubscribe,\n          participantTracks: [],\n        }),\n        publishTracks: getTrackPublicationInfo(localTracks),\n        dataChannels: this.dataChannelsInfo(),\n        trackSidsDisabled,\n        datachannelReceiveStates: this.reliableReceivedState.map((seq, sid) =\u003e {\n          return new DataChannelReceiveState({\n            publisherSid: sid,\n            lastSeq: seq,\n          });\n        }),\n      }),\n    );\n  }\n\n  /* @internal */\n  failNext() {\n    // debugging method to fail the next reconnect/resume attempt\n    this.shouldFailNext = true;\n  }\n\n  private dataChannelsInfo(): DataChannelInfo[] {\n    const infos: DataChannelInfo[] = [];\n    const getInfo = (dc: RTCDataChannel | undefined, target: SignalTarget) =\u003e {\n      if (dc?.id !== undefined \u0026\u0026 dc.id !== null) {\n        infos.push(\n          new DataChannelInfo({\n            label: dc.label,\n            id: dc.id,\n            target,\n          }),\n        );\n      }\n    };\n    getInfo(this.dataChannelForKind(DataPacket_Kind.LOSSY), SignalTarget.PUBLISHER);\n    getInfo(this.dataChannelForKind(DataPacket_Kind.RELIABLE), SignalTarget.PUBLISHER);\n    getInfo(this.dataChannelForKind(DataPacket_Kind.LOSSY, true), SignalTarget.SUBSCRIBER);\n    getInfo(this.dataChannelForKind(DataPacket_Kind.RELIABLE, true), SignalTarget.SUBSCRIBER);\n    return infos;\n  }\n\n  private clearReconnectTimeout() {\n    if (this.reconnectTimeout) {\n      CriticalTimers.clearTimeout(this.reconnectTimeout);\n    }\n  }\n\n  private clearPendingReconnect() {\n    this.clearReconnectTimeout();\n    this.reconnectAttempts = 0;\n  }\n\n  private handleBrowserOnLine = () =\u003e {\n    // in case the engine is currently reconnecting, attempt a reconnect immediately after the browser state has changed to 'onLine'\n    if (this.client.currentState === SignalConnectionState.RECONNECTING) {\n      this.clearReconnectTimeout();\n      this.attemptReconnect(ReconnectReason.RR_SIGNAL_DISCONNECTED);\n    }\n  };\n\n  private registerOnLineListener() {\n    if (isWeb()) {\n      window.addEventListener('online', this.handleBrowserOnLine);\n    }\n  }\n\n  private deregisterOnLineListener() {\n    if (isWeb()) {\n      window.removeEventListener('online', this.handleBrowserOnLine);\n    }\n  }\n}\n\nclass SignalReconnectError extends Error {}\n\nexport type EngineEventCallbacks = {\n  connected: (joinResp: JoinResponse) =\u003e void;\n  disconnected: (reason?: DisconnectReason) =\u003e void;\n  resuming: () =\u003e void;\n  resumed: () =\u003e void;\n  restarting: () =\u003e void;\n  restarted: () =\u003e void;\n  signalResumed: () =\u003e void;\n  signalRestarted: (joinResp: JoinResponse) =\u003e void;\n  closing: () =\u003e void;\n  mediaTrackAdded: (\n    track: MediaStreamTrack,\n    streams: MediaStream,\n    receiver: RTCRtpReceiver,\n  ) =\u003e void;\n  activeSpeakersUpdate: (speakers: Array\u003cSpeakerInfo\u003e) =\u003e void;\n  dataPacketReceived: (packet: DataPacket) =\u003e void;\n  transcriptionReceived: (transcription: Transcription) =\u003e void;\n  transportsCreated: (publisher: PCTransport, subscriber: PCTransport) =\u003e void;\n  /** @internal */\n  trackSenderAdded: (track: Track, sender: RTCRtpSender) =\u003e void;\n  rtpVideoMapUpdate: (rtpMap: Map\u003cnumber, VideoCodec\u003e) =\u003e void;\n  dcBufferStatusChanged: (isLow: boolean, kind: DataPacket_Kind) =\u003e void;\n  participantUpdate: (infos: ParticipantInfo[]) =\u003e void;\n  roomUpdate: (room: RoomModel) =\u003e void;\n  roomMoved: (room: RoomMovedResponse) =\u003e void;\n  connectionQualityUpdate: (update: ConnectionQualityUpdate) =\u003e void;\n  speakersChanged: (speakerUpdates: SpeakerInfo[]) =\u003e void;\n  streamStateChanged: (update: StreamStateUpdate) =\u003e void;\n  subscriptionError: (resp: SubscriptionResponse) =\u003e void;\n  subscriptionPermissionUpdate: (update: SubscriptionPermissionUpdate) =\u003e void;\n  subscribedQualityUpdate: (update: SubscribedQualityUpdate) =\u003e void;\n  localTrackUnpublished: (unpublishedResponse: TrackUnpublishedResponse) =\u003e void;\n  localTrackSubscribed: (trackSid: string) =\u003e void;\n  remoteMute: (trackSid: string, muted: boolean) =\u003e void;\n  offline: () =\u003e void;\n  signalRequestResponse: (response: RequestResponse) =\u003e void;\n  signalConnected: (joinResp: JoinResponse) =\u003e void;\n};\n\nfunction supportOptionalDatachannel(protocol: number | undefined): boolean {\n  return protocol !== undefined \u0026\u0026 protocol \u003e 13;\n}\n\nfunction applyUserDataCompat(newObj: DataPacket, oldObj: UserPacket) {\n  const participantIdentity = newObj.participantIdentity\n    ? newObj.participantIdentity\n    : oldObj.participantIdentity;\n  newObj.participantIdentity = participantIdentity;\n  oldObj.participantIdentity = participantIdentity;\n\n  const destinationIdentities =\n    newObj.destinationIdentities.length !== 0\n      ? newObj.destinationIdentities\n      : oldObj.destinationIdentities;\n  newObj.destinationIdentities = destinationIdentities;\n  oldObj.destinationIdentities = destinationIdentities;\n}\n","import type { RegionInfo, RegionSettings } from '@livekit/protocol';\nimport log from '../logger';\nimport { ConnectionError, ConnectionErrorReason } from './errors';\nimport { isCloud } from './utils';\n\nexport class RegionUrlProvider {\n  private serverUrl: URL;\n\n  private token: string;\n\n  private regionSettings: RegionSettings | undefined;\n\n  private lastUpdateAt: number = 0;\n\n  private settingsCacheTime = 3_000;\n\n  private attemptedRegions: RegionInfo[] = [];\n\n  constructor(url: string, token: string) {\n    this.serverUrl = new URL(url);\n    this.token = token;\n  }\n\n  updateToken(token: string) {\n    this.token = token;\n  }\n\n  isCloud() {\n    return isCloud(this.serverUrl);\n  }\n\n  getServerUrl() {\n    return this.serverUrl;\n  }\n\n  async getNextBestRegionUrl(abortSignal?: AbortSignal) {\n    if (!this.isCloud()) {\n      throw Error('region availability is only supported for LiveKit Cloud domains');\n    }\n    if (!this.regionSettings || Date.now() - this.lastUpdateAt \u003e this.settingsCacheTime) {\n      this.regionSettings = await this.fetchRegionSettings(abortSignal);\n    }\n    const regionsLeft = this.regionSettings.regions.filter(\n      (region) =\u003e !this.attemptedRegions.find((attempted) =\u003e attempted.url === region.url),\n    );\n    if (regionsLeft.length \u003e 0) {\n      const nextRegion = regionsLeft[0];\n      this.attemptedRegions.push(nextRegion);\n      log.debug(`next region: ${nextRegion.region}`);\n      return nextRegion.url;\n    } else {\n      return null;\n    }\n  }\n\n  resetAttempts() {\n    this.attemptedRegions = [];\n  }\n\n  /* @internal */\n  async fetchRegionSettings(signal?: AbortSignal) {\n    const regionSettingsResponse = await fetch(`${getCloudConfigUrl(this.serverUrl)}/regions`, {\n      headers: { authorization: `Bearer ${this.token}` },\n      signal,\n    });\n    if (regionSettingsResponse.ok) {\n      const regionSettings = (await regionSettingsResponse.json()) as RegionSettings;\n      this.lastUpdateAt = Date.now();\n      return regionSettings;\n    } else {\n      throw new ConnectionError(\n        `Could not fetch region settings: ${regionSettingsResponse.statusText}`,\n        regionSettingsResponse.status === 401\n          ? ConnectionErrorReason.NotAllowed\n          : ConnectionErrorReason.InternalError,\n        regionSettingsResponse.status,\n      );\n    }\n  }\n\n  setServerReportedRegions(regions: RegionSettings) {\n    this.regionSettings = regions;\n    this.lastUpdateAt = Date.now();\n  }\n}\n\nfunction getCloudConfigUrl(serverUrl: URL) {\n  return `${serverUrl.protocol.replace('ws', 'http')}//${serverUrl.host}/settings`;\n}\n","import type { DataStream_Chunk } from '@livekit/protocol';\nimport { DataStreamError, DataStreamErrorReason } from '../../errors';\nimport type { BaseStreamInfo, ByteStreamInfo, TextStreamInfo } from '../../types';\nimport { Future, bigIntToNumber } from '../../utils';\n\nexport type BaseStreamReaderReadAllOpts = {\n  /** An AbortSignal can be used to terminate reads early. */\n  signal?: AbortSignal;\n};\n\nabstract class BaseStreamReader\u003cT extends BaseStreamInfo\u003e {\n  protected reader: ReadableStream\u003cDataStream_Chunk\u003e;\n\n  protected totalByteSize?: number;\n\n  protected _info: T;\n\n  protected bytesReceived: number;\n\n  protected outOfBandFailureRejectingFuture?: Future\u003cnever\u003e;\n\n  get info() {\n    return this._info;\n  }\n\n  /** @internal */\n  protected validateBytesReceived(doneReceiving: boolean = false) {\n    if (typeof this.totalByteSize !== 'number' || this.totalByteSize === 0) {\n      return;\n    }\n\n    if (doneReceiving \u0026\u0026 this.bytesReceived \u003c this.totalByteSize) {\n      throw new DataStreamError(\n        `Not enough chunk(s) received - expected ${this.totalByteSize} bytes of data total, only received ${this.bytesReceived} bytes`,\n        DataStreamErrorReason.Incomplete,\n      );\n    } else if (this.bytesReceived \u003e this.totalByteSize) {\n      throw new DataStreamError(\n        `Extra chunk(s) received - expected ${this.totalByteSize} bytes of data total, received ${this.bytesReceived} bytes`,\n        DataStreamErrorReason.LengthExceeded,\n      );\n    }\n  }\n\n  constructor(\n    info: T,\n    stream: ReadableStream\u003cDataStream_Chunk\u003e,\n    totalByteSize?: number,\n    outOfBandFailureRejectingFuture?: Future\u003cnever\u003e,\n  ) {\n    this.reader = stream;\n    this.totalByteSize = totalByteSize;\n    this._info = info;\n    this.bytesReceived = 0;\n    this.outOfBandFailureRejectingFuture = outOfBandFailureRejectingFuture;\n  }\n\n  protected abstract handleChunkReceived(chunk: DataStream_Chunk): void;\n\n  onProgress?: (progress: number | undefined) =\u003e void;\n\n  abstract readAll(opts?: BaseStreamReaderReadAllOpts): Promise\u003cstring | Array\u003cUint8Array\u003e\u003e;\n}\n\nexport class ByteStreamReader extends BaseStreamReader\u003cByteStreamInfo\u003e {\n  protected handleChunkReceived(chunk: DataStream_Chunk) {\n    this.bytesReceived += chunk.content.byteLength;\n    this.validateBytesReceived();\n\n    const currentProgress = this.totalByteSize\n      ? this.bytesReceived / this.totalByteSize\n      : undefined;\n    this.onProgress?.(currentProgress);\n  }\n\n  onProgress?: (progress: number | undefined) =\u003e void;\n\n  signal?: AbortSignal;\n\n  [Symbol.asyncIterator]() {\n    const reader = this.reader.getReader();\n\n    let rejectingSignalFuture = new Future\u003cnever\u003e();\n    let activeSignal: AbortSignal | null = null;\n    let onAbort: (() =\u003e void) | null = null;\n    if (this.signal) {\n      const signal = this.signal;\n      onAbort = () =\u003e {\n        rejectingSignalFuture.reject?.(signal.reason);\n      };\n      signal.addEventListener('abort', onAbort);\n      activeSignal = signal;\n    }\n\n    const cleanup = () =\u003e {\n      reader.releaseLock();\n\n      if (activeSignal \u0026\u0026 onAbort) {\n        activeSignal.removeEventListener('abort', onAbort);\n      }\n\n      this.signal = undefined;\n    };\n\n    return {\n      next: async (): Promise\u003cIteratorResult\u003cUint8Array\u003e\u003e =\u003e {\n        try {\n          const { done, value } = await Promise.race([\n            reader.read(),\n            // Rejects if this.signal is aborted\n            rejectingSignalFuture.promise,\n            // Rejects if something external says it should, like a participant disconnecting, etc\n            this.outOfBandFailureRejectingFuture?.promise ??\n              new Promise\u003cnever\u003e(() =\u003e {\n                /* never resolves */\n              }),\n          ]);\n          if (done) {\n            this.validateBytesReceived(true);\n            return { done: true, value: undefined as any };\n          } else {\n            this.handleChunkReceived(value);\n            return { done: false, value: value.content };\n          }\n        } catch (err) {\n          cleanup();\n          throw err;\n        }\n      },\n\n      // note: `return` runs only for premature exits, see:\n      // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols#errors_during_iteration\n      async return(): Promise\u003cIteratorResult\u003cUint8Array\u003e\u003e {\n        cleanup();\n        return { done: true, value: undefined };\n      },\n    };\n  }\n\n  /**\n   * Injects an AbortSignal, which if aborted, will terminate the currently active\n   * stream iteration operation.\n   *\n   * Note that when using AbortSignal.timeout(...), the timeout applies across\n   * the whole iteration operation, not just one individual chunk read.\n   */\n  withAbortSignal(signal: AbortSignal) {\n    this.signal = signal;\n    return this;\n  }\n\n  async readAll(opts: BaseStreamReaderReadAllOpts = {}): Promise\u003cArray\u003cUint8Array\u003e\u003e {\n    let chunks: Set\u003cUint8Array\u003e = new Set();\n    const iterator = opts.signal ? this.withAbortSignal(opts.signal) : this;\n    for await (const chunk of iterator) {\n      chunks.add(chunk);\n    }\n    return Array.from(chunks);\n  }\n}\n\n/**\n * A class to read chunks from a ReadableStream and provide them in a structured format.\n */\nexport class TextStreamReader extends BaseStreamReader\u003cTextStreamInfo\u003e {\n  private receivedChunks: Map\u003cnumber, DataStream_Chunk\u003e;\n\n  signal?: AbortSignal;\n\n  /**\n   * A TextStreamReader instance can be used as an AsyncIterator that returns the entire string\n   * that has been received up to the current point in time.\n   */\n  constructor(\n    info: TextStreamInfo,\n    stream: ReadableStream\u003cDataStream_Chunk\u003e,\n    totalChunkCount?: number,\n    outOfBandFailureRejectingFuture?: Future\u003cnever\u003e,\n  ) {\n    super(info, stream, totalChunkCount, outOfBandFailureRejectingFuture);\n    this.receivedChunks = new Map();\n  }\n\n  protected handleChunkReceived(chunk: DataStream_Chunk) {\n    const index = bigIntToNumber(chunk.chunkIndex);\n    const previousChunkAtIndex = this.receivedChunks.get(index);\n    if (previousChunkAtIndex \u0026\u0026 previousChunkAtIndex.version \u003e chunk.version) {\n      // we have a newer version already, dropping the old one\n      return;\n    }\n    this.receivedChunks.set(index, chunk);\n\n    this.bytesReceived += chunk.content.byteLength;\n    this.validateBytesReceived();\n\n    const currentProgress = this.totalByteSize\n      ? this.bytesReceived / this.totalByteSize\n      : undefined;\n    this.onProgress?.(currentProgress);\n  }\n\n  /**\n   * @param progress - progress of the stream between 0 and 1. Undefined for streams of unknown size\n   */\n  onProgress?: (progress: number | undefined) =\u003e void;\n\n  /**\n   * Async iterator implementation to allow usage of `for await...of` syntax.\n   * Yields structured chunks from the stream.\n   *\n   */\n  [Symbol.asyncIterator]() {\n    const reader = this.reader.getReader();\n    const decoder = new TextDecoder('utf-8', { fatal: true });\n\n    let rejectingSignalFuture = new Future\u003cnever\u003e();\n    let activeSignal: AbortSignal | null = null;\n    let onAbort: (() =\u003e void) | null = null;\n    if (this.signal) {\n      const signal = this.signal;\n      onAbort = () =\u003e {\n        rejectingSignalFuture.reject?.(signal.reason);\n      };\n      signal.addEventListener('abort', onAbort);\n      activeSignal = signal;\n    }\n\n    const cleanup = () =\u003e {\n      reader.releaseLock();\n\n      if (activeSignal \u0026\u0026 onAbort) {\n        activeSignal.removeEventListener('abort', onAbort);\n      }\n\n      this.signal = undefined;\n    };\n\n    return {\n      next: async (): Promise\u003cIteratorResult\u003cstring\u003e\u003e =\u003e {\n        try {\n          const { done, value } = await Promise.race([\n            reader.read(),\n            // Rejects if this.signal is aborted\n            rejectingSignalFuture.promise,\n            // Rejects if something external says it should, like a participant disconnecting, etc\n            this.outOfBandFailureRejectingFuture?.promise ??\n              new Promise\u003cnever\u003e(() =\u003e {\n                /* never resolves */\n              }),\n          ]);\n          if (done) {\n            this.validateBytesReceived(true);\n            return { done: true, value: undefined };\n          } else {\n            this.handleChunkReceived(value);\n\n            let decodedResult;\n            try {\n              decodedResult = decoder.decode(value.content);\n            } catch (err) {\n              throw new DataStreamError(\n                `Cannot decode datastream chunk ${value.chunkIndex} as text: ${err}`,\n                DataStreamErrorReason.DecodeFailed,\n              );\n            }\n\n            return {\n              done: false,\n              value: decodedResult,\n            };\n          }\n        } catch (err) {\n          cleanup();\n          throw err;\n        }\n      },\n\n      // note: `return` runs only for premature exits, see:\n      // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols#errors_during_iteration\n      async return(): Promise\u003cIteratorResult\u003cstring\u003e\u003e {\n        cleanup();\n        return { done: true, value: undefined };\n      },\n    };\n  }\n\n  /**\n   * Injects an AbortSignal, which if aborted, will terminate the currently active\n   * stream iteration operation.\n   *\n   * Note that when using AbortSignal.timeout(...), the timeout applies across\n   * the whole iteration operation, not just one individual chunk read.\n   */\n  withAbortSignal(signal: AbortSignal) {\n    this.signal = signal;\n    return this;\n  }\n\n  async readAll(opts: BaseStreamReaderReadAllOpts = {}): Promise\u003cstring\u003e {\n    let finalString: string = '';\n    const iterator = opts.signal ? this.withAbortSignal(opts.signal) : this;\n    for await (const chunk of iterator) {\n      finalString += chunk;\n    }\n    return finalString;\n  }\n}\n\nexport type ByteStreamHandler = (\n  reader: ByteStreamReader,\n  participantInfo: { identity: string },\n) =\u003e void;\n\nexport type TextStreamHandler = (\n  reader: TextStreamReader,\n  participantInfo: { identity: string },\n) =\u003e void;\n","import {\n  type DataPacket,\n  DataStream_Chunk,\n  DataStream_Header,\n  DataStream_Trailer,\n} from '@livekit/protocol';\nimport log from '../../../logger';\nimport { DataStreamError, DataStreamErrorReason } from '../../errors';\nimport { type ByteStreamInfo, type StreamController, type TextStreamInfo } from '../../types';\nimport { Future, bigIntToNumber } from '../../utils';\nimport {\n  type ByteStreamHandler,\n  ByteStreamReader,\n  type TextStreamHandler,\n  TextStreamReader,\n} from './StreamReader';\n\nexport default class IncomingDataStreamManager {\n  private log = log;\n\n  private byteStreamControllers = new Map\u003cstring, StreamController\u003cDataStream_Chunk\u003e\u003e();\n\n  private textStreamControllers = new Map\u003cstring, StreamController\u003cDataStream_Chunk\u003e\u003e();\n\n  private byteStreamHandlers = new Map\u003cstring, ByteStreamHandler\u003e();\n\n  private textStreamHandlers = new Map\u003cstring, TextStreamHandler\u003e();\n\n  registerTextStreamHandler(topic: string, callback: TextStreamHandler) {\n    if (this.textStreamHandlers.has(topic)) {\n      throw new DataStreamError(\n        `A text stream handler for topic \"${topic}\" has already been set.`,\n        DataStreamErrorReason.HandlerAlreadyRegistered,\n      );\n    }\n    this.textStreamHandlers.set(topic, callback);\n  }\n\n  unregisterTextStreamHandler(topic: string) {\n    this.textStreamHandlers.delete(topic);\n  }\n\n  registerByteStreamHandler(topic: string, callback: ByteStreamHandler) {\n    if (this.byteStreamHandlers.has(topic)) {\n      throw new DataStreamError(\n        `A byte stream handler for topic \"${topic}\" has already been set.`,\n        DataStreamErrorReason.HandlerAlreadyRegistered,\n      );\n    }\n    this.byteStreamHandlers.set(topic, callback);\n  }\n\n  unregisterByteStreamHandler(topic: string) {\n    this.byteStreamHandlers.delete(topic);\n  }\n\n  clearHandlersAndControllers() {\n    this.byteStreamControllers.clear();\n    this.textStreamControllers.clear();\n    this.byteStreamHandlers.clear();\n    this.textStreamHandlers.clear();\n  }\n\n  validateParticipantHasNoActiveDataStreams(participantIdentity: string) {\n    // Terminate any in flight data stream receives from the given participant\n    const textStreamsBeingSentByDisconnectingParticipant = Array.from(\n      this.textStreamControllers.entries(),\n    ).filter((entry) =\u003e entry[1].sendingParticipantIdentity === participantIdentity);\n    const byteStreamsBeingSentByDisconnectingParticipant = Array.from(\n      this.byteStreamControllers.entries(),\n    ).filter((entry) =\u003e entry[1].sendingParticipantIdentity === participantIdentity);\n\n    if (\n      textStreamsBeingSentByDisconnectingParticipant.length \u003e 0 ||\n      byteStreamsBeingSentByDisconnectingParticipant.length \u003e 0\n    ) {\n      const abnormalEndError = new DataStreamError(\n        `Participant ${participantIdentity} unexpectedly disconnected in the middle of sending data`,\n        DataStreamErrorReason.AbnormalEnd,\n      );\n      for (const [id, controller] of byteStreamsBeingSentByDisconnectingParticipant) {\n        controller.outOfBandFailureRejectingFuture.reject?.(abnormalEndError);\n        this.byteStreamControllers.delete(id);\n      }\n      for (const [id, controller] of textStreamsBeingSentByDisconnectingParticipant) {\n        controller.outOfBandFailureRejectingFuture.reject?.(abnormalEndError);\n        this.textStreamControllers.delete(id);\n      }\n    }\n  }\n\n  async handleDataStreamPacket(packet: DataPacket) {\n    switch (packet.value.case) {\n      case 'streamHeader':\n        return this.handleStreamHeader(packet.value.value, packet.participantIdentity);\n      case 'streamChunk':\n        return this.handleStreamChunk(packet.value.value);\n      case 'streamTrailer':\n        return this.handleStreamTrailer(packet.value.value);\n      default:\n        throw new Error(`DataPacket of value \"${packet.value.case}\" is not data stream related!`);\n    }\n  }\n\n  private async handleStreamHeader(streamHeader: DataStream_Header, participantIdentity: string) {\n    if (streamHeader.contentHeader.case === 'byteHeader') {\n      const streamHandlerCallback = this.byteStreamHandlers.get(streamHeader.topic);\n      if (!streamHandlerCallback) {\n        this.log.debug(\n          'ignoring incoming byte stream due to no handler for topic',\n          streamHeader.topic,\n        );\n        return;\n      }\n\n      let streamController: ReadableStreamDefaultController\u003cDataStream_Chunk\u003e;\n      const outOfBandFailureRejectingFuture = new Future\u003cnever\u003e();\n\n      const info: ByteStreamInfo = {\n        id: streamHeader.streamId,\n        name: streamHeader.contentHeader.value.name ?? 'unknown',\n        mimeType: streamHeader.mimeType,\n        size: streamHeader.totalLength ? Number(streamHeader.totalLength) : undefined,\n        topic: streamHeader.topic,\n        timestamp: bigIntToNumber(streamHeader.timestamp),\n        attributes: streamHeader.attributes,\n      };\n      const stream = new ReadableStream({\n        start: (controller) =\u003e {\n          streamController = controller;\n\n          if (this.textStreamControllers.has(streamHeader.streamId)) {\n            throw new DataStreamError(\n              `A data stream read is already in progress for a stream with id ${streamHeader.streamId}.`,\n              DataStreamErrorReason.AlreadyOpened,\n            );\n          }\n\n          this.byteStreamControllers.set(streamHeader.streamId, {\n            info,\n            controller: streamController,\n            startTime: Date.now(),\n            sendingParticipantIdentity: participantIdentity,\n            outOfBandFailureRejectingFuture,\n          });\n        },\n      });\n      streamHandlerCallback(\n        new ByteStreamReader(\n          info,\n          stream,\n          bigIntToNumber(streamHeader.totalLength),\n          outOfBandFailureRejectingFuture,\n        ),\n        {\n          identity: participantIdentity,\n        },\n      );\n    } else if (streamHeader.contentHeader.case === 'textHeader') {\n      const streamHandlerCallback = this.textStreamHandlers.get(streamHeader.topic);\n      if (!streamHandlerCallback) {\n        this.log.debug(\n          'ignoring incoming text stream due to no handler for topic',\n          streamHeader.topic,\n        );\n        return;\n      }\n\n      let streamController: ReadableStreamDefaultController\u003cDataStream_Chunk\u003e;\n      const outOfBandFailureRejectingFuture = new Future\u003cnever\u003e();\n      const info: TextStreamInfo = {\n        id: streamHeader.streamId,\n        mimeType: streamHeader.mimeType,\n        size: streamHeader.totalLength ? Number(streamHeader.totalLength) : undefined,\n        topic: streamHeader.topic,\n        timestamp: Number(streamHeader.timestamp),\n        attributes: streamHeader.attributes,\n      };\n\n      const stream = new ReadableStream\u003cDataStream_Chunk\u003e({\n        start: (controller) =\u003e {\n          streamController = controller;\n\n          if (this.textStreamControllers.has(streamHeader.streamId)) {\n            throw new DataStreamError(\n              `A data stream read is already in progress for a stream with id ${streamHeader.streamId}.`,\n              DataStreamErrorReason.AlreadyOpened,\n            );\n          }\n\n          this.textStreamControllers.set(streamHeader.streamId, {\n            info,\n            controller: streamController,\n            startTime: Date.now(),\n            sendingParticipantIdentity: participantIdentity,\n            outOfBandFailureRejectingFuture,\n          });\n        },\n      });\n      streamHandlerCallback(\n        new TextStreamReader(\n          info,\n          stream,\n          bigIntToNumber(streamHeader.totalLength),\n          outOfBandFailureRejectingFuture,\n        ),\n        { identity: participantIdentity },\n      );\n    }\n  }\n\n  private handleStreamChunk(chunk: DataStream_Chunk) {\n    const fileBuffer = this.byteStreamControllers.get(chunk.streamId);\n    if (fileBuffer) {\n      if (chunk.content.length \u003e 0) {\n        fileBuffer.controller.enqueue(chunk);\n      }\n    }\n    const textBuffer = this.textStreamControllers.get(chunk.streamId);\n    if (textBuffer) {\n      if (chunk.content.length \u003e 0) {\n        textBuffer.controller.enqueue(chunk);\n      }\n    }\n  }\n\n  private handleStreamTrailer(trailer: DataStream_Trailer) {\n    const textBuffer = this.textStreamControllers.get(trailer.streamId);\n    if (textBuffer) {\n      textBuffer.info.attributes = {\n        ...textBuffer.info.attributes,\n        ...trailer.attributes,\n      };\n      textBuffer.controller.close();\n      this.textStreamControllers.delete(trailer.streamId);\n    }\n\n    const fileBuffer = this.byteStreamControllers.get(trailer.streamId);\n    if (fileBuffer) {\n      {\n        fileBuffer.info.attributes = { ...fileBuffer.info.attributes, ...trailer.attributes };\n        fileBuffer.controller.close();\n        this.byteStreamControllers.delete(trailer.streamId);\n      }\n    }\n  }\n}\n","import type { BaseStreamInfo, ByteStreamInfo, TextStreamInfo } from '../../types';\n\nclass BaseStreamWriter\u003cT, InfoType extends BaseStreamInfo\u003e {\n  protected writableStream: WritableStream\u003cT\u003e;\n\n  protected defaultWriter: WritableStreamDefaultWriter\u003cT\u003e;\n\n  protected onClose?: () =\u003e void;\n\n  readonly info: InfoType;\n\n  constructor(writableStream: WritableStream\u003cT\u003e, info: InfoType, onClose?: () =\u003e void) {\n    this.writableStream = writableStream;\n    this.defaultWriter = writableStream.getWriter();\n    this.onClose = onClose;\n    this.info = info;\n  }\n\n  write(chunk: T): Promise\u003cvoid\u003e {\n    return this.defaultWriter.write(chunk);\n  }\n\n  async close() {\n    await this.defaultWriter.close();\n    this.defaultWriter.releaseLock();\n    this.onClose?.();\n  }\n}\n\nexport class TextStreamWriter extends BaseStreamWriter\u003cstring, TextStreamInfo\u003e {}\n\nexport class ByteStreamWriter extends BaseStreamWriter\u003cUint8Array, ByteStreamInfo\u003e {}\n","import { Mutex } from '@livekit/mutex';\nimport {\n  DataPacket,\n  DataPacket_Kind,\n  DataStream_ByteHeader,\n  DataStream_Chunk,\n  DataStream_Header,\n  DataStream_OperationType,\n  DataStream_TextHeader,\n  DataStream_Trailer,\n} from '@livekit/protocol';\nimport { type StructuredLogger } from '../../../logger';\nimport type RTCEngine from '../../RTCEngine';\nimport { EngineEvent } from '../../events';\nimport type {\n  ByteStreamInfo,\n  SendFileOptions,\n  SendTextOptions,\n  StreamBytesOptions,\n  StreamTextOptions,\n  TextStreamInfo,\n} from '../../types';\nimport { numberToBigInt, splitUtf8 } from '../../utils';\nimport { ByteStreamWriter, TextStreamWriter } from './StreamWriter';\n\nconst STREAM_CHUNK_SIZE = 15_000;\n\n/**\n * Manages sending custom user data via data channels.\n * @internal\n */\nexport default class OutgoingDataStreamManager {\n  protected engine: RTCEngine;\n\n  protected log: StructuredLogger;\n\n  constructor(engine: RTCEngine, log: StructuredLogger) {\n    this.engine = engine;\n    this.log = log;\n  }\n\n  setupEngine(engine: RTCEngine) {\n    this.engine = engine;\n  }\n\n  /** {@inheritDoc LocalParticipant.sendText} */\n  async sendText(text: string, options?: SendTextOptions): Promise\u003cTextStreamInfo\u003e {\n    const streamId = crypto.randomUUID();\n    const textInBytes = new TextEncoder().encode(text);\n    const totalTextLength = textInBytes.byteLength;\n\n    const fileIds = options?.attachments?.map(() =\u003e crypto.randomUUID());\n\n    const progresses = new Array\u003cnumber\u003e(fileIds ? fileIds.length + 1 : 1).fill(0);\n\n    const handleProgress = (progress: number, idx: number) =\u003e {\n      progresses[idx] = progress;\n      const totalProgress = progresses.reduce((acc, val) =\u003e acc + val, 0);\n      options?.onProgress?.(totalProgress);\n    };\n\n    const writer = await this.streamText({\n      streamId,\n      totalSize: totalTextLength,\n      destinationIdentities: options?.destinationIdentities,\n      topic: options?.topic,\n      attachedStreamIds: fileIds,\n      attributes: options?.attributes,\n    });\n\n    await writer.write(text);\n    // set text part of progress to 1\n    handleProgress(1, 0);\n\n    await writer.close();\n\n    if (options?.attachments \u0026\u0026 fileIds) {\n      await Promise.all(\n        options.attachments.map(async (file, idx) =\u003e\n          this._sendFile(fileIds[idx], file, {\n            topic: options.topic,\n            mimeType: file.type,\n            onProgress: (progress) =\u003e {\n              handleProgress(progress, idx + 1);\n            },\n          }),\n        ),\n      );\n    }\n    return writer.info;\n  }\n\n  /**\n   * @internal\n   * @experimental CAUTION, might get removed in a minor release\n   */\n  async streamText(options?: StreamTextOptions): Promise\u003cTextStreamWriter\u003e {\n    const streamId = options?.streamId ?? crypto.randomUUID();\n\n    const info: TextStreamInfo = {\n      id: streamId,\n      mimeType: 'text/plain',\n      timestamp: Date.now(),\n      topic: options?.topic ?? '',\n      size: options?.totalSize,\n      attributes: options?.attributes,\n    };\n    const header = new DataStream_Header({\n      streamId,\n      mimeType: info.mimeType,\n      topic: info.topic,\n      timestamp: numberToBigInt(info.timestamp),\n      totalLength: numberToBigInt(options?.totalSize),\n      attributes: info.attributes,\n      contentHeader: {\n        case: 'textHeader',\n        value: new DataStream_TextHeader({\n          version: options?.version,\n          attachedStreamIds: options?.attachedStreamIds,\n          replyToStreamId: options?.replyToStreamId,\n          operationType:\n            options?.type === 'update'\n              ? DataStream_OperationType.UPDATE\n              : DataStream_OperationType.CREATE,\n        }),\n      },\n    });\n    const destinationIdentities = options?.destinationIdentities;\n    const packet = new DataPacket({\n      destinationIdentities,\n      value: {\n        case: 'streamHeader',\n        value: header,\n      },\n    });\n    await this.engine.sendDataPacket(packet, DataPacket_Kind.RELIABLE);\n\n    let chunkId = 0;\n    const engine = this.engine;\n\n    const writableStream = new WritableStream\u003cstring\u003e({\n      // Implement the sink\n      async write(text) {\n        for (const textByteChunk of splitUtf8(text, STREAM_CHUNK_SIZE)) {\n          await engine.waitForBufferStatusLow(DataPacket_Kind.RELIABLE);\n          const chunk = new DataStream_Chunk({\n            content: textByteChunk,\n            streamId,\n            chunkIndex: numberToBigInt(chunkId),\n          });\n          const chunkPacket = new DataPacket({\n            destinationIdentities,\n            value: {\n              case: 'streamChunk',\n              value: chunk,\n            },\n          });\n          await engine.sendDataPacket(chunkPacket, DataPacket_Kind.RELIABLE);\n\n          chunkId += 1;\n        }\n      },\n      async close() {\n        const trailer = new DataStream_Trailer({\n          streamId,\n        });\n        const trailerPacket = new DataPacket({\n          destinationIdentities,\n          value: {\n            case: 'streamTrailer',\n            value: trailer,\n          },\n        });\n        await engine.sendDataPacket(trailerPacket, DataPacket_Kind.RELIABLE);\n      },\n      abort(err) {\n        console.log('Sink error:', err);\n        // TODO handle aborts to signal something to receiver side\n      },\n    });\n\n    let onEngineClose = async () =\u003e {\n      await writer.close();\n    };\n\n    engine.once(EngineEvent.Closing, onEngineClose);\n\n    const writer = new TextStreamWriter(writableStream, info, () =\u003e\n      this.engine.off(EngineEvent.Closing, onEngineClose),\n    );\n\n    return writer;\n  }\n\n  async sendFile(file: File, options?: SendFileOptions): Promise\u003c{ id: string }\u003e {\n    const streamId = crypto.randomUUID();\n    await this._sendFile(streamId, file, options);\n    return { id: streamId };\n  }\n\n  private async _sendFile(streamId: string, file: File, options?: SendFileOptions) {\n    const writer = await this.streamBytes({\n      streamId,\n      totalSize: file.size,\n      name: file.name,\n      mimeType: options?.mimeType ?? file.type,\n      topic: options?.topic,\n      destinationIdentities: options?.destinationIdentities,\n    });\n    const reader = file.stream().getReader();\n    while (true) {\n      const { done, value } = await reader.read();\n      if (done) {\n        break;\n      }\n      await writer.write(value);\n    }\n    await writer.close();\n    return writer.info;\n  }\n\n  async streamBytes(options?: StreamBytesOptions) {\n    const streamId = options?.streamId ?? crypto.randomUUID();\n    const destinationIdentities = options?.destinationIdentities;\n\n    const info: ByteStreamInfo = {\n      id: streamId,\n      mimeType: options?.mimeType ?? 'application/octet-stream',\n      topic: options?.topic ?? '',\n      timestamp: Date.now(),\n      attributes: options?.attributes,\n      size: options?.totalSize,\n      name: options?.name ?? 'unknown',\n    };\n\n    const header = new DataStream_Header({\n      totalLength: numberToBigInt(info.size ?? 0),\n      mimeType: info.mimeType,\n      streamId,\n      topic: info.topic,\n      timestamp: numberToBigInt(Date.now()),\n      attributes: info.attributes,\n      contentHeader: {\n        case: 'byteHeader',\n        value: new DataStream_ByteHeader({\n          name: info.name,\n        }),\n      },\n    });\n\n    const packet = new DataPacket({\n      destinationIdentities,\n      value: {\n        case: 'streamHeader',\n        value: header,\n      },\n    });\n\n    await this.engine.sendDataPacket(packet, DataPacket_Kind.RELIABLE);\n\n    let chunkId = 0;\n    const writeMutex = new Mutex();\n    const engine = this.engine;\n    const logLocal = this.log;\n\n    const writableStream = new WritableStream\u003cUint8Array\u003e({\n      async write(chunk) {\n        const unlock = await writeMutex.lock();\n\n        let byteOffset = 0;\n        try {\n          while (byteOffset \u003c chunk.byteLength) {\n            const subChunk = chunk.slice(byteOffset, byteOffset + STREAM_CHUNK_SIZE);\n            await engine.waitForBufferStatusLow(DataPacket_Kind.RELIABLE);\n            const chunkPacket = new DataPacket({\n              destinationIdentities,\n              value: {\n                case: 'streamChunk',\n                value: new DataStream_Chunk({\n                  content: subChunk,\n                  streamId,\n                  chunkIndex: numberToBigInt(chunkId),\n                }),\n              },\n            });\n            await engine.sendDataPacket(chunkPacket, DataPacket_Kind.RELIABLE);\n            chunkId += 1;\n            byteOffset += subChunk.byteLength;\n          }\n        } finally {\n          unlock();\n        }\n      },\n      async close() {\n        const trailer = new DataStream_Trailer({\n          streamId,\n        });\n        const trailerPacket = new DataPacket({\n          destinationIdentities,\n          value: {\n            case: 'streamTrailer',\n            value: trailer,\n          },\n        });\n        await engine.sendDataPacket(trailerPacket, DataPacket_Kind.RELIABLE);\n      },\n      abort(err) {\n        logLocal.error('Sink error:', err);\n      },\n    });\n\n    const byteWriter = new ByteStreamWriter(writableStream, info);\n\n    return byteWriter;\n  }\n}\n","import { TrackEvent } from '../events';\nimport { monitorFrequency } from '../stats';\nimport type { LoggerOptions } from '../types';\nimport { Track } from './Track';\nimport { supportsSynchronizationSources } from './utils';\n\nexport default abstract class RemoteTrack\u003c\n  TrackKind extends Track.Kind = Track.Kind,\n\u003e extends Track\u003cTrackKind\u003e {\n  /** @internal */\n  receiver: RTCRtpReceiver | undefined;\n\n  constructor(\n    mediaTrack: MediaStreamTrack,\n    sid: string,\n    kind: TrackKind,\n    receiver: RTCRtpReceiver,\n    loggerOptions?: LoggerOptions,\n  ) {\n    super(mediaTrack, kind, loggerOptions);\n\n    this.sid = sid;\n    this.receiver = receiver;\n  }\n\n  get isLocal() {\n    return false;\n  }\n\n  /** @internal */\n  setMuted(muted: boolean) {\n    if (this.isMuted !== muted) {\n      this.isMuted = muted;\n      this._mediaStreamTrack.enabled = !muted;\n      this.emit(muted ? TrackEvent.Muted : TrackEvent.Unmuted, this);\n    }\n  }\n\n  /** @internal */\n  setMediaStream(stream: MediaStream) {\n    // this is needed to determine when the track is finished\n    this.mediaStream = stream;\n    const onRemoveTrack = (event: MediaStreamTrackEvent) =\u003e {\n      if (event.track === this._mediaStreamTrack) {\n        stream.removeEventListener('removetrack', onRemoveTrack);\n        if (this.receiver \u0026\u0026 'playoutDelayHint' in this.receiver) {\n          this.receiver.playoutDelayHint = undefined;\n        }\n        this.receiver = undefined;\n        this._currentBitrate = 0;\n        this.emit(TrackEvent.Ended, this);\n      }\n    };\n    stream.addEventListener('removetrack', onRemoveTrack);\n  }\n\n  start() {\n    this.startMonitor();\n    // use `enabled` of track to enable re-use of transceiver\n    super.enable();\n  }\n\n  stop() {\n    this.stopMonitor();\n    // use `enabled` of track to enable re-use of transceiver\n    super.disable();\n  }\n\n  /**\n   * Gets the RTCStatsReport for the RemoteTrack's underlying RTCRtpReceiver\n   * See https://developer.mozilla.org/en-US/docs/Web/API/RTCStatsReport\n   *\n   * @returns Promise\u003cRTCStatsReport\u003e | undefined\n   */\n  async getRTCStatsReport(): Promise\u003cRTCStatsReport | undefined\u003e {\n    if (!this.receiver?.getStats) {\n      return;\n    }\n    const statsReport = await this.receiver.getStats();\n    return statsReport;\n  }\n\n  /**\n   * Allows to set a playout delay (in seconds) for this track.\n   * A higher value allows for more buffering of the track in the browser\n   * and will result in a delay of media being played back of `delayInSeconds`\n   */\n  setPlayoutDelay(delayInSeconds: number): void {\n    if (this.receiver) {\n      if ('playoutDelayHint' in this.receiver) {\n        this.receiver.playoutDelayHint = delayInSeconds;\n      } else {\n        this.log.warn('Playout delay not supported in this browser');\n      }\n    } else {\n      this.log.warn('Cannot set playout delay, track already ended');\n    }\n  }\n\n  /**\n   * Returns the current playout delay (in seconds) of this track.\n   */\n  getPlayoutDelay(): number {\n    if (this.receiver) {\n      if ('playoutDelayHint' in this.receiver) {\n        return this.receiver.playoutDelayHint as number;\n      } else {\n        this.log.warn('Playout delay not supported in this browser');\n      }\n    } else {\n      this.log.warn('Cannot get playout delay, track already ended');\n    }\n    return 0;\n  }\n\n  /* @internal */\n  startMonitor() {\n    if (!this.monitorInterval) {\n      this.monitorInterval = setInterval(() =\u003e this.monitorReceiver(), monitorFrequency);\n    }\n    if (supportsSynchronizationSources()) {\n      this.registerTimeSyncUpdate();\n    }\n  }\n\n  protected abstract monitorReceiver(): void;\n\n  registerTimeSyncUpdate() {\n    const loop = () =\u003e {\n      this.timeSyncHandle = requestAnimationFrame(() =\u003e loop());\n      const sources = this.receiver?.getSynchronizationSources()[0];\n      if (sources) {\n        const { timestamp, rtpTimestamp } = sources;\n        if (rtpTimestamp \u0026\u0026 this.rtpTimestamp !== rtpTimestamp) {\n          this.emit(TrackEvent.TimeSyncUpdate, { timestamp, rtpTimestamp });\n          this.rtpTimestamp = rtpTimestamp;\n        }\n      }\n    };\n    loop();\n  }\n}\n","import { TrackEvent } from '../events';\nimport type { AudioReceiverStats } from '../stats';\nimport { computeBitrate } from '../stats';\nimport type { LoggerOptions } from '../types';\nimport { isReactNative, supportsSetSinkId } from '../utils';\nimport RemoteTrack from './RemoteTrack';\nimport { Track } from './Track';\nimport type { AudioOutputOptions } from './options';\n\nexport default class RemoteAudioTrack extends RemoteTrack\u003cTrack.Kind.Audio\u003e {\n  private prevStats?: AudioReceiverStats;\n\n  private elementVolume: number | undefined;\n\n  private audioContext?: AudioContext;\n\n  private gainNode?: GainNode;\n\n  private sourceNode?: MediaStreamAudioSourceNode;\n\n  private webAudioPluginNodes: AudioNode[];\n\n  private sinkId?: string;\n\n  constructor(\n    mediaTrack: MediaStreamTrack,\n    sid: string,\n    receiver: RTCRtpReceiver,\n    audioContext?: AudioContext,\n    audioOutput?: AudioOutputOptions,\n    loggerOptions?: LoggerOptions,\n  ) {\n    super(mediaTrack, sid, Track.Kind.Audio, receiver, loggerOptions);\n    this.audioContext = audioContext;\n    this.webAudioPluginNodes = [];\n    if (audioOutput) {\n      this.sinkId = audioOutput.deviceId;\n    }\n  }\n\n  /**\n   * sets the volume for all attached audio elements\n   */\n  setVolume(volume: number) {\n    for (const el of this.attachedElements) {\n      if (this.audioContext) {\n        this.gainNode?.gain.setTargetAtTime(volume, 0, 0.1);\n      } else {\n        el.volume = volume;\n      }\n    }\n    if (isReactNative()) {\n      // @ts-ignore\n      this._mediaStreamTrack._setVolume(volume);\n    }\n    this.elementVolume = volume;\n  }\n\n  /**\n   * gets the volume of attached audio elements (loudest)\n   */\n  getVolume(): number {\n    if (this.elementVolume) {\n      return this.elementVolume;\n    }\n    if (isReactNative()) {\n      // RN volume value defaults to 1.0 if hasn't been changed.\n      return 1.0;\n    }\n    let highestVolume = 0;\n    this.attachedElements.forEach((element) =\u003e {\n      if (element.volume \u003e highestVolume) {\n        highestVolume = element.volume;\n      }\n    });\n    return highestVolume;\n  }\n\n  /**\n   * calls setSinkId on all attached elements, if supported\n   * @param deviceId audio output device\n   */\n  async setSinkId(deviceId: string) {\n    this.sinkId = deviceId;\n    await Promise.all(\n      this.attachedElements.map((elm) =\u003e {\n        if (!supportsSetSinkId(elm)) {\n          return;\n        }\n        /* @ts-ignore */\n        return elm.setSinkId(deviceId) as Promise\u003cvoid\u003e;\n      }),\n    );\n  }\n\n  attach(): HTMLMediaElement;\n  attach(element: HTMLMediaElement): HTMLMediaElement;\n  attach(element?: HTMLMediaElement): HTMLMediaElement {\n    const needsNewWebAudioConnection = this.attachedElements.length === 0;\n    if (!element) {\n      element = super.attach();\n    } else {\n      super.attach(element);\n    }\n\n    if (this.sinkId \u0026\u0026 supportsSetSinkId(element)) {\n      element.setSinkId(this.sinkId).catch((e) =\u003e {\n        this.log.error('Failed to set sink id on remote audio track', e, this.logContext);\n      });\n    }\n    if (this.audioContext \u0026\u0026 needsNewWebAudioConnection) {\n      this.log.debug('using audio context mapping', this.logContext);\n      this.connectWebAudio(this.audioContext, element);\n      element.volume = 0;\n      element.muted = true;\n    }\n\n    if (this.elementVolume) {\n      // make sure volume setting is being applied to the newly attached element\n      this.setVolume(this.elementVolume);\n    }\n\n    return element;\n  }\n\n  /**\n   * Detaches from all attached elements\n   */\n  detach(): HTMLMediaElement[];\n\n  /**\n   * Detach from a single element\n   * @param element\n   */\n  detach(element: HTMLMediaElement): HTMLMediaElement;\n  detach(element?: HTMLMediaElement): HTMLMediaElement | HTMLMediaElement[] {\n    let detached: HTMLMediaElement | HTMLMediaElement[];\n    if (!element) {\n      detached = super.detach();\n      this.disconnectWebAudio();\n    } else {\n      detached = super.detach(element);\n      // if there are still any attached elements after detaching, connect webaudio to the first element that's left\n      // disconnect webaudio otherwise\n      if (this.audioContext) {\n        if (this.attachedElements.length \u003e 0) {\n          this.connectWebAudio(this.audioContext, this.attachedElements[0]);\n        } else {\n          this.disconnectWebAudio();\n        }\n      }\n    }\n    return detached;\n  }\n\n  /**\n   * @internal\n   * @experimental\n   */\n  setAudioContext(audioContext: AudioContext | undefined) {\n    this.audioContext = audioContext;\n    if (audioContext \u0026\u0026 this.attachedElements.length \u003e 0) {\n      this.connectWebAudio(audioContext, this.attachedElements[0]);\n    } else if (!audioContext) {\n      this.disconnectWebAudio();\n    }\n  }\n\n  /**\n   * @internal\n   * @experimental\n   * @param {AudioNode[]} nodes - An array of WebAudio nodes. These nodes should not be connected to each other when passed, as the sdk will take care of connecting them in the order of the array.\n   */\n  setWebAudioPlugins(nodes: AudioNode[]) {\n    this.webAudioPluginNodes = nodes;\n    if (this.attachedElements.length \u003e 0 \u0026\u0026 this.audioContext) {\n      this.connectWebAudio(this.audioContext, this.attachedElements[0]);\n    }\n  }\n\n  private connectWebAudio(context: AudioContext, element: HTMLMediaElement) {\n    this.disconnectWebAudio();\n    // @ts-ignore attached elements always have a srcObject set\n    this.sourceNode = context.createMediaStreamSource(element.srcObject);\n    let lastNode: AudioNode = this.sourceNode;\n    this.webAudioPluginNodes.forEach((node) =\u003e {\n      lastNode.connect(node);\n      lastNode = node;\n    });\n    this.gainNode = context.createGain();\n    lastNode.connect(this.gainNode);\n    this.gainNode.connect(context.destination);\n\n    if (this.elementVolume) {\n      this.gainNode.gain.setTargetAtTime(this.elementVolume, 0, 0.1);\n    }\n\n    // try to resume the context if it isn't running already\n    if (context.state !== 'running') {\n      context\n        .resume()\n        .then(() =\u003e {\n          if (context.state !== 'running') {\n            this.emit(\n              TrackEvent.AudioPlaybackFailed,\n              new Error(\"Audio Context couldn't be started automatically\"),\n            );\n          }\n        })\n        .catch((e) =\u003e {\n          this.emit(TrackEvent.AudioPlaybackFailed, e);\n        });\n    }\n  }\n\n  private disconnectWebAudio() {\n    this.gainNode?.disconnect();\n    this.sourceNode?.disconnect();\n    this.gainNode = undefined;\n    this.sourceNode = undefined;\n  }\n\n  protected monitorReceiver = async () =\u003e {\n    if (!this.receiver) {\n      this._currentBitrate = 0;\n      return;\n    }\n    const stats = await this.getReceiverStats();\n\n    if (stats \u0026\u0026 this.prevStats \u0026\u0026 this.receiver) {\n      this._currentBitrate = computeBitrate(stats, this.prevStats);\n    }\n\n    this.prevStats = stats;\n  };\n\n  async getReceiverStats(): Promise\u003cAudioReceiverStats | undefined\u003e {\n    if (!this.receiver || !this.receiver.getStats) {\n      return;\n    }\n\n    const stats = await this.receiver.getStats();\n    let receiverStats: AudioReceiverStats | undefined;\n    stats.forEach((v) =\u003e {\n      if (v.type === 'inbound-rtp') {\n        receiverStats = {\n          type: 'audio',\n          streamId: v.id,\n          timestamp: v.timestamp,\n          jitter: v.jitter,\n          bytesReceived: v.bytesReceived,\n          concealedSamples: v.concealedSamples,\n          concealmentEvents: v.concealmentEvents,\n          silentConcealedSamples: v.silentConcealedSamples,\n          silentConcealmentEvents: v.silentConcealmentEvents,\n          totalAudioEnergy: v.totalAudioEnergy,\n          totalSamplesDuration: v.totalSamplesDuration,\n        };\n      }\n    });\n    return receiverStats;\n  }\n}\n","import { debounce } from 'ts-debounce';\nimport { TrackEvent } from '../events';\nimport type { VideoReceiverStats } from '../stats';\nimport { computeBitrate } from '../stats';\nimport CriticalTimers from '../timers';\nimport type { LoggerOptions } from '../types';\nimport type { ObservableMediaElement } from '../utils';\nimport { getDevicePixelRatio, getIntersectionObserver, getResizeObserver, isWeb } from '../utils';\nimport RemoteTrack from './RemoteTrack';\nimport { Track, attachToElement, detachTrack } from './Track';\nimport type { AdaptiveStreamSettings } from './types';\n\nconst REACTION_DELAY = 100;\n\nexport default class RemoteVideoTrack extends RemoteTrack\u003cTrack.Kind.Video\u003e {\n  private prevStats?: VideoReceiverStats;\n\n  private elementInfos: ElementInfo[] = [];\n\n  private adaptiveStreamSettings?: AdaptiveStreamSettings;\n\n  private lastVisible?: boolean;\n\n  private lastDimensions?: Track.Dimensions;\n\n  constructor(\n    mediaTrack: MediaStreamTrack,\n    sid: string,\n    receiver: RTCRtpReceiver,\n    adaptiveStreamSettings?: AdaptiveStreamSettings,\n    loggerOptions?: LoggerOptions,\n  ) {\n    super(mediaTrack, sid, Track.Kind.Video, receiver, loggerOptions);\n    this.adaptiveStreamSettings = adaptiveStreamSettings;\n  }\n\n  get isAdaptiveStream(): boolean {\n    return this.adaptiveStreamSettings !== undefined;\n  }\n\n  override setStreamState(value: Track.StreamState) {\n    super.setStreamState(value);\n    console.log('setStreamState', value);\n    if (value === Track.StreamState.Active) {\n      // update visibility for adaptive stream tracks when stream state received from server is active\n      // this is needed to ensure the track is stopped when there's no element attached to it at all\n      this.updateVisibility();\n    }\n  }\n\n  /**\n   * Note: When using adaptiveStream, you need to use remoteVideoTrack.attach() to add the track to a HTMLVideoElement, otherwise your video tracks might never start\n   */\n  get mediaStreamTrack() {\n    return this._mediaStreamTrack;\n  }\n\n  /** @internal */\n  setMuted(muted: boolean) {\n    super.setMuted(muted);\n\n    this.attachedElements.forEach((element) =\u003e {\n      // detach or attach\n      if (muted) {\n        detachTrack(this._mediaStreamTrack, element);\n      } else {\n        attachToElement(this._mediaStreamTrack, element);\n      }\n    });\n  }\n\n  attach(): HTMLMediaElement;\n  attach(element: HTMLMediaElement): HTMLMediaElement;\n  attach(element?: HTMLMediaElement): HTMLMediaElement {\n    if (!element) {\n      element = super.attach();\n    } else {\n      super.attach(element);\n    }\n\n    // It's possible attach is called multiple times on an element. When that's\n    // the case, we'd want to avoid adding duplicate elementInfos\n    if (\n      this.adaptiveStreamSettings \u0026\u0026\n      this.elementInfos.find((info) =\u003e info.element === element) === undefined\n    ) {\n      const elementInfo = new HTMLElementInfo(element);\n      this.observeElementInfo(elementInfo);\n    }\n    return element;\n  }\n\n  /**\n   * Observe an ElementInfo for changes when adaptive streaming.\n   * @param elementInfo\n   * @internal\n   */\n  observeElementInfo(elementInfo: ElementInfo) {\n    if (\n      this.adaptiveStreamSettings \u0026\u0026\n      this.elementInfos.find((info) =\u003e info === elementInfo) === undefined\n    ) {\n      elementInfo.handleResize = () =\u003e {\n        this.debouncedHandleResize();\n      };\n      elementInfo.handleVisibilityChanged = () =\u003e {\n        this.updateVisibility();\n      };\n      this.elementInfos.push(elementInfo);\n      elementInfo.observe();\n      // trigger the first resize update cycle\n      // if the tab is backgrounded, the initial resize event does not fire until\n      // the tab comes into focus for the first time.\n      this.debouncedHandleResize();\n      this.updateVisibility();\n    } else {\n      this.log.warn('visibility resize observer not triggered', this.logContext);\n    }\n  }\n\n  /**\n   * Stop observing an ElementInfo for changes.\n   * @param elementInfo\n   * @internal\n   */\n  stopObservingElementInfo(elementInfo: ElementInfo) {\n    if (!this.isAdaptiveStream) {\n      this.log.warn('stopObservingElementInfo ignored', this.logContext);\n      return;\n    }\n    const stopElementInfos = this.elementInfos.filter((info) =\u003e info === elementInfo);\n    for (const info of stopElementInfos) {\n      info.stopObserving();\n    }\n    this.elementInfos = this.elementInfos.filter((info) =\u003e info !== elementInfo);\n    this.updateVisibility();\n    this.debouncedHandleResize();\n  }\n\n  detach(): HTMLMediaElement[];\n  detach(element: HTMLMediaElement): HTMLMediaElement;\n  detach(element?: HTMLMediaElement): HTMLMediaElement | HTMLMediaElement[] {\n    let detachedElements: HTMLMediaElement[] = [];\n    if (element) {\n      this.stopObservingElement(element);\n      return super.detach(element);\n    }\n    detachedElements = super.detach();\n\n    for (const e of detachedElements) {\n      this.stopObservingElement(e);\n    }\n\n    return detachedElements;\n  }\n\n  /** @internal */\n  getDecoderImplementation(): string | undefined {\n    return this.prevStats?.decoderImplementation;\n  }\n\n  protected monitorReceiver = async () =\u003e {\n    if (!this.receiver) {\n      this._currentBitrate = 0;\n      return;\n    }\n    const stats = await this.getReceiverStats();\n\n    if (stats \u0026\u0026 this.prevStats \u0026\u0026 this.receiver) {\n      this._currentBitrate = computeBitrate(stats, this.prevStats);\n    }\n\n    this.prevStats = stats;\n  };\n\n  async getReceiverStats(): Promise\u003cVideoReceiverStats | undefined\u003e {\n    if (!this.receiver || !this.receiver.getStats) {\n      return;\n    }\n\n    const stats = await this.receiver.getStats();\n    let receiverStats: VideoReceiverStats | undefined;\n    let codecID = '';\n    let codecs = new Map\u003cstring, any\u003e();\n    stats.forEach((v) =\u003e {\n      if (v.type === 'inbound-rtp') {\n        codecID = v.codecId;\n        receiverStats = {\n          type: 'video',\n          streamId: v.id,\n          framesDecoded: v.framesDecoded,\n          framesDropped: v.framesDropped,\n          framesReceived: v.framesReceived,\n          packetsReceived: v.packetsReceived,\n          packetsLost: v.packetsLost,\n          frameWidth: v.frameWidth,\n          frameHeight: v.frameHeight,\n          pliCount: v.pliCount,\n          firCount: v.firCount,\n          nackCount: v.nackCount,\n          jitter: v.jitter,\n          timestamp: v.timestamp,\n          bytesReceived: v.bytesReceived,\n          decoderImplementation: v.decoderImplementation,\n        };\n      } else if (v.type === 'codec') {\n        codecs.set(v.id, v);\n      }\n    });\n    if (receiverStats \u0026\u0026 codecID !== '' \u0026\u0026 codecs.get(codecID)) {\n      receiverStats.mimeType = codecs.get(codecID).mimeType;\n    }\n    return receiverStats;\n  }\n\n  private stopObservingElement(element: HTMLMediaElement) {\n    const stopElementInfos = this.elementInfos.filter((info) =\u003e info.element === element);\n    for (const info of stopElementInfos) {\n      this.stopObservingElementInfo(info);\n    }\n  }\n\n  protected async handleAppVisibilityChanged() {\n    await super.handleAppVisibilityChanged();\n    if (!this.isAdaptiveStream) return;\n    this.updateVisibility();\n  }\n\n  private readonly debouncedHandleResize = debounce(() =\u003e {\n    this.updateDimensions();\n  }, REACTION_DELAY);\n\n  private updateVisibility(forceEmit?: boolean) {\n    const lastVisibilityChange = this.elementInfos.reduce(\n      (prev, info) =\u003e Math.max(prev, info.visibilityChangedAt || 0),\n      0,\n    );\n\n    const backgroundPause =\n      (this.adaptiveStreamSettings?.pauseVideoInBackground ?? true) // default to true\n        ? this.isInBackground\n        : false;\n    const isPiPMode = this.elementInfos.some((info) =\u003e info.pictureInPicture);\n    const isVisible =\n      (this.elementInfos.some((info) =\u003e info.visible) \u0026\u0026 !backgroundPause) || isPiPMode;\n\n    if (this.lastVisible === isVisible \u0026\u0026 !forceEmit) {\n      return;\n    }\n\n    if (!isVisible \u0026\u0026 Date.now() - lastVisibilityChange \u003c REACTION_DELAY) {\n      // delay hidden events\n      CriticalTimers.setTimeout(() =\u003e {\n        this.updateVisibility();\n      }, REACTION_DELAY);\n      return;\n    }\n\n    this.lastVisible = isVisible;\n    this.emit(TrackEvent.VisibilityChanged, isVisible, this);\n  }\n\n  private updateDimensions() {\n    let maxWidth = 0;\n    let maxHeight = 0;\n    const pixelDensity = this.getPixelDensity();\n    for (const info of this.elementInfos) {\n      const currentElementWidth = info.width() * pixelDensity;\n      const currentElementHeight = info.height() * pixelDensity;\n      if (currentElementWidth + currentElementHeight \u003e maxWidth + maxHeight) {\n        maxWidth = currentElementWidth;\n        maxHeight = currentElementHeight;\n      }\n    }\n\n    if (this.lastDimensions?.width === maxWidth \u0026\u0026 this.lastDimensions?.height === maxHeight) {\n      return;\n    }\n\n    this.lastDimensions = {\n      width: maxWidth,\n      height: maxHeight,\n    };\n\n    this.emit(TrackEvent.VideoDimensionsChanged, this.lastDimensions, this);\n  }\n\n  private getPixelDensity(): number {\n    const pixelDensity = this.adaptiveStreamSettings?.pixelDensity;\n    if (pixelDensity === 'screen') {\n      return getDevicePixelRatio();\n    } else if (!pixelDensity) {\n      // when unset, we'll pick a sane default here.\n      // for higher pixel density devices (mobile phones, etc), we'll use 2\n      // otherwise it defaults to 1\n      const devicePixelRatio = getDevicePixelRatio();\n      if (devicePixelRatio \u003e 2) {\n        return 2;\n      } else {\n        return 1;\n      }\n    }\n    return pixelDensity;\n  }\n}\n\nexport interface ElementInfo {\n  element: object;\n  width(): number;\n  height(): number;\n  visible: boolean;\n  pictureInPicture: boolean;\n  visibilityChangedAt: number | undefined;\n\n  handleResize?: () =\u003e void;\n  handleVisibilityChanged?: () =\u003e void;\n  observe(): void;\n  stopObserving(): void;\n}\n\nclass HTMLElementInfo implements ElementInfo {\n  element: HTMLMediaElement;\n\n  get visible(): boolean {\n    return this.isPiP || this.isIntersecting;\n  }\n\n  get pictureInPicture(): boolean {\n    return this.isPiP;\n  }\n\n  visibilityChangedAt: number | undefined;\n\n  handleResize?: () =\u003e void;\n\n  handleVisibilityChanged?: () =\u003e void;\n\n  private isPiP: boolean;\n\n  private isIntersecting: boolean;\n\n  constructor(element: HTMLMediaElement, visible?: boolean) {\n    this.element = element;\n    this.isIntersecting = visible ?? isElementInViewport(element);\n    this.isPiP = isWeb() \u0026\u0026 isElementInPiP(element);\n    this.visibilityChangedAt = 0;\n  }\n\n  width(): number {\n    return this.element.clientWidth;\n  }\n\n  height(): number {\n    return this.element.clientHeight;\n  }\n\n  observe() {\n    // make sure we update the current visible state once we start to observe\n    this.isIntersecting = isElementInViewport(this.element);\n    this.isPiP = isElementInPiP(this.element);\n\n    (this.element as ObservableMediaElement).handleResize = () =\u003e {\n      this.handleResize?.();\n    };\n    (this.element as ObservableMediaElement).handleVisibilityChanged = this.onVisibilityChanged;\n\n    getIntersectionObserver().observe(this.element);\n    getResizeObserver().observe(this.element);\n    (this.element as HTMLVideoElement).addEventListener('enterpictureinpicture', this.onEnterPiP);\n    (this.element as HTMLVideoElement).addEventListener('leavepictureinpicture', this.onLeavePiP);\n    window.documentPictureInPicture?.addEventListener('enter', this.onEnterPiP);\n    window.documentPictureInPicture?.window?.addEventListener('pagehide', this.onLeavePiP);\n  }\n\n  private onVisibilityChanged = (entry: IntersectionObserverEntry) =\u003e {\n    const { target, isIntersecting } = entry;\n    if (target === this.element) {\n      this.isIntersecting = isIntersecting;\n      this.isPiP = isElementInPiP(this.element);\n      this.visibilityChangedAt = Date.now();\n      this.handleVisibilityChanged?.();\n    }\n  };\n\n  private onEnterPiP = () =\u003e {\n    window.documentPictureInPicture?.window?.addEventListener('pagehide', this.onLeavePiP);\n    this.isPiP = isElementInPiP(this.element);\n    this.handleVisibilityChanged?.();\n  };\n\n  private onLeavePiP = () =\u003e {\n    this.isPiP = isElementInPiP(this.element);\n    this.handleVisibilityChanged?.();\n  };\n\n  stopObserving() {\n    getIntersectionObserver()?.unobserve(this.element);\n    getResizeObserver()?.unobserve(this.element);\n    (this.element as HTMLVideoElement).removeEventListener(\n      'enterpictureinpicture',\n      this.onEnterPiP,\n    );\n    (this.element as HTMLVideoElement).removeEventListener(\n      'leavepictureinpicture',\n      this.onLeavePiP,\n    );\n    window.documentPictureInPicture?.removeEventListener('enter', this.onEnterPiP);\n    window.documentPictureInPicture?.window?.removeEventListener('pagehide', this.onLeavePiP);\n  }\n}\n\nfunction isElementInPiP(el: HTMLElement) {\n  // Simple video PiP\n  if (document.pictureInPictureElement === el) return true;\n  // Document PiP\n  if (window.documentPictureInPicture?.window)\n    return isElementInViewport(el, window.documentPictureInPicture?.window);\n  return false;\n}\n\n// does not account for occlusion by other elements or opacity property\nfunction isElementInViewport(el: HTMLElement, win?: Window) {\n  const viewportWindow = win || window;\n  let top = el.offsetTop;\n  let left = el.offsetLeft;\n  const width = el.offsetWidth;\n  const height = el.offsetHeight;\n  const { hidden } = el;\n  const { display } = getComputedStyle(el);\n\n  while (el.offsetParent) {\n    el = el.offsetParent as HTMLElement;\n    top += el.offsetTop;\n    left += el.offsetLeft;\n  }\n\n  return (\n    top \u003c viewportWindow.pageYOffset + viewportWindow.innerHeight \u0026\u0026\n    left \u003c viewportWindow.pageXOffset + viewportWindow.innerWidth \u0026\u0026\n    top + height \u003e viewportWindow.pageYOffset \u0026\u0026\n    left + width \u003e viewportWindow.pageXOffset \u0026\u0026\n    !hidden \u0026\u0026\n    display !== 'none'\n  );\n}\n","import { Encryption_Type } from '@livekit/protocol';\nimport type {\n  SubscriptionError,\n  TrackInfo,\n  UpdateSubscription,\n  UpdateTrackSettings,\n} from '@livekit/protocol';\nimport { EventEmitter } from 'events';\nimport type TypedEventEmitter from 'typed-emitter';\nimport log, { LoggerNames, getLogger } from '../../logger';\nimport { TrackEvent } from '../events';\nimport type { LoggerOptions, TranscriptionSegment } from '../types';\nimport { isAudioTrack, isVideoTrack } from '../utils';\nimport LocalAudioTrack from './LocalAudioTrack';\nimport LocalVideoTrack from './LocalVideoTrack';\nimport RemoteAudioTrack from './RemoteAudioTrack';\nimport type RemoteTrack from './RemoteTrack';\nimport RemoteVideoTrack from './RemoteVideoTrack';\nimport { Track } from './Track';\nimport { getLogContextFromTrack } from './utils';\n\nexport abstract class TrackPublication extends (EventEmitter as new () =\u003e TypedEventEmitter\u003cPublicationEventCallbacks\u003e) {\n  kind: Track.Kind;\n\n  trackName: string;\n\n  trackSid: Track.SID;\n\n  track?: Track;\n\n  source: Track.Source;\n\n  /** MimeType of the published track */\n  mimeType?: string;\n\n  /** dimension of the original published stream, video-only */\n  dimensions?: Track.Dimensions;\n\n  /** true if track was simulcasted to server, video-only */\n  simulcasted?: boolean;\n\n  /** @internal */\n  trackInfo?: TrackInfo;\n\n  protected metadataMuted: boolean = false;\n\n  protected encryption: Encryption_Type = Encryption_Type.NONE;\n\n  protected log = log;\n\n  private loggerContextCb?: LoggerOptions['loggerContextCb'];\n\n  constructor(kind: Track.Kind, id: string, name: string, loggerOptions?: LoggerOptions) {\n    super();\n    this.log = getLogger(loggerOptions?.loggerName ?? LoggerNames.Publication);\n    this.loggerContextCb = this.loggerContextCb;\n    this.setMaxListeners(100);\n    this.kind = kind;\n    this.trackSid = id;\n    this.trackName = name;\n    this.source = Track.Source.Unknown;\n  }\n\n  /** @internal */\n  setTrack(track?: Track) {\n    if (this.track) {\n      this.track.off(TrackEvent.Muted, this.handleMuted);\n      this.track.off(TrackEvent.Unmuted, this.handleUnmuted);\n    }\n\n    this.track = track;\n\n    if (track) {\n      // forward events\n      track.on(TrackEvent.Muted, this.handleMuted);\n      track.on(TrackEvent.Unmuted, this.handleUnmuted);\n    }\n  }\n\n  protected get logContext() {\n    return {\n      ...this.loggerContextCb?.(),\n      ...getLogContextFromTrack(this),\n    };\n  }\n\n  get isMuted(): boolean {\n    return this.metadataMuted;\n  }\n\n  get isEnabled(): boolean {\n    return true;\n  }\n\n  get isSubscribed(): boolean {\n    return this.track !== undefined;\n  }\n\n  get isEncrypted(): boolean {\n    return this.encryption !== Encryption_Type.NONE;\n  }\n\n  abstract get isLocal(): boolean;\n\n  /**\n   * an [AudioTrack] if this publication holds an audio track\n   */\n  get audioTrack(): LocalAudioTrack | RemoteAudioTrack | undefined {\n    if (isAudioTrack(this.track)) {\n      return this.track;\n    }\n  }\n\n  /**\n   * an [VideoTrack] if this publication holds a video track\n   */\n  get videoTrack(): LocalVideoTrack | RemoteVideoTrack | undefined {\n    if (isVideoTrack(this.track)) {\n      return this.track;\n    }\n  }\n\n  handleMuted = () =\u003e {\n    this.emit(TrackEvent.Muted);\n  };\n\n  handleUnmuted = () =\u003e {\n    this.emit(TrackEvent.Unmuted);\n  };\n\n  /** @internal */\n  updateInfo(info: TrackInfo) {\n    this.trackSid = info.sid;\n    this.trackName = info.name;\n    this.source = Track.sourceFromProto(info.source);\n    this.mimeType = info.mimeType;\n    if (this.kind === Track.Kind.Video \u0026\u0026 info.width \u003e 0) {\n      this.dimensions = {\n        width: info.width,\n        height: info.height,\n      };\n      this.simulcasted = info.simulcast;\n    }\n    this.encryption = info.encryption;\n    this.trackInfo = info;\n    this.log.debug('update publication info', { ...this.logContext, info });\n  }\n}\n\nexport namespace TrackPublication {\n  export enum SubscriptionStatus {\n    Desired = 'desired',\n    Subscribed = 'subscribed',\n    Unsubscribed = 'unsubscribed',\n  }\n\n  export enum PermissionStatus {\n    Allowed = 'allowed',\n    NotAllowed = 'not_allowed',\n  }\n}\n\nexport type PublicationEventCallbacks = {\n  muted: () =\u003e void;\n  unmuted: () =\u003e void;\n  ended: (track?: Track) =\u003e void;\n  updateSettings: (settings: UpdateTrackSettings) =\u003e void;\n  subscriptionPermissionChanged: (\n    status: TrackPublication.PermissionStatus,\n    prevStatus: TrackPublication.PermissionStatus,\n  ) =\u003e void;\n  updateSubscription: (sub: UpdateSubscription) =\u003e void;\n  subscribed: (track: RemoteTrack) =\u003e void;\n  unsubscribed: (track: RemoteTrack) =\u003e void;\n  subscriptionStatusChanged: (\n    status: TrackPublication.SubscriptionStatus,\n    prevStatus: TrackPublication.SubscriptionStatus,\n  ) =\u003e void;\n  subscriptionFailed: (error: SubscriptionError) =\u003e void;\n  transcriptionReceived: (transcription: TranscriptionSegment[]) =\u003e void;\n  timeSyncUpdate: (timestamp: number) =\u003e void;\n  cpuConstrained: (track: LocalVideoTrack) =\u003e void;\n};\n","import { AudioTrackFeature, TrackInfo } from '@livekit/protocol';\nimport { TrackEvent } from '../events';\nimport type { LoggerOptions } from '../types';\nimport { isAudioTrack, isVideoTrack } from '../utils';\nimport LocalAudioTrack from './LocalAudioTrack';\nimport type LocalTrack from './LocalTrack';\nimport type LocalVideoTrack from './LocalVideoTrack';\nimport type { Track } from './Track';\nimport { TrackPublication } from './TrackPublication';\nimport type { TrackPublishOptions } from './options';\n\nexport default class LocalTrackPublication extends TrackPublication {\n  track?: LocalTrack = undefined;\n\n  options?: TrackPublishOptions;\n\n  get isUpstreamPaused() {\n    return this.track?.isUpstreamPaused;\n  }\n\n  constructor(kind: Track.Kind, ti: TrackInfo, track?: LocalTrack, loggerOptions?: LoggerOptions) {\n    super(kind, ti.sid, ti.name, loggerOptions);\n\n    this.updateInfo(ti);\n    this.setTrack(track);\n  }\n\n  setTrack(track?: Track) {\n    if (this.track) {\n      this.track.off(TrackEvent.Ended, this.handleTrackEnded);\n      this.track.off(TrackEvent.CpuConstrained, this.handleCpuConstrained);\n    }\n\n    super.setTrack(track);\n\n    if (track) {\n      track.on(TrackEvent.Ended, this.handleTrackEnded);\n      track.on(TrackEvent.CpuConstrained, this.handleCpuConstrained);\n    }\n  }\n\n  get isMuted(): boolean {\n    if (this.track) {\n      return this.track.isMuted;\n    }\n    return super.isMuted;\n  }\n\n  get audioTrack(): LocalAudioTrack | undefined {\n    return super.audioTrack as LocalAudioTrack | undefined;\n  }\n\n  get videoTrack(): LocalVideoTrack | undefined {\n    return super.videoTrack as LocalVideoTrack | undefined;\n  }\n\n  get isLocal() {\n    return true;\n  }\n\n  /**\n   * Mute the track associated with this publication\n   */\n  async mute() {\n    return this.track?.mute();\n  }\n\n  /**\n   * Unmute track associated with this publication\n   */\n  async unmute() {\n    return this.track?.unmute();\n  }\n\n  /**\n   * Pauses the media stream track associated with this publication from being sent to the server\n   * and signals \"muted\" event to other participants\n   * Useful if you want to pause the stream without pausing the local media stream track\n   */\n  async pauseUpstream() {\n    await this.track?.pauseUpstream();\n  }\n\n  /**\n   * Resumes sending the media stream track associated with this publication to the server after a call to [[pauseUpstream()]]\n   * and signals \"unmuted\" event to other participants (unless the track is explicitly muted)\n   */\n  async resumeUpstream() {\n    await this.track?.resumeUpstream();\n  }\n\n  getTrackFeatures() {\n    if (isAudioTrack(this.track)) {\n      const settings = this.track!.getSourceTrackSettings();\n      const features: Set\u003cAudioTrackFeature\u003e = new Set();\n      if (settings.autoGainControl) {\n        features.add(AudioTrackFeature.TF_AUTO_GAIN_CONTROL);\n      }\n      if (settings.echoCancellation) {\n        features.add(AudioTrackFeature.TF_ECHO_CANCELLATION);\n      }\n      if (settings.noiseSuppression) {\n        features.add(AudioTrackFeature.TF_NOISE_SUPPRESSION);\n      }\n      if (settings.channelCount \u0026\u0026 settings.channelCount \u003e 1) {\n        features.add(AudioTrackFeature.TF_STEREO);\n      }\n      if (!this.options?.dtx) {\n        features.add(AudioTrackFeature.TF_NO_DTX);\n      }\n      if (this.track.enhancedNoiseCancellation) {\n        features.add(AudioTrackFeature.TF_ENHANCED_NOISE_CANCELLATION);\n      }\n      return Array.from(features.values());\n    } else return [];\n  }\n\n  handleTrackEnded = () =\u003e {\n    this.emit(TrackEvent.Ended);\n  };\n\n  private handleCpuConstrained = () =\u003e {\n    if (this.track \u0026\u0026 isVideoTrack(this.track)) {\n      this.emit(TrackEvent.CpuConstrained, this.track);\n    }\n  };\n}\n","import DeviceManager from '../DeviceManager';\nimport { audioDefaults, videoDefaults } from '../defaults';\nimport { DeviceUnsupportedError, TrackInvalidError } from '../errors';\nimport { mediaTrackToLocalTrack } from '../participant/publishUtils';\nimport type { LoggerOptions } from '../types';\nimport { isAudioTrack, isSafari17Based, isVideoTrack, unwrapConstraint } from '../utils';\nimport LocalAudioTrack from './LocalAudioTrack';\nimport type LocalTrack from './LocalTrack';\nimport LocalVideoTrack from './LocalVideoTrack';\nimport { Track } from './Track';\nimport type {\n  AudioCaptureOptions,\n  CreateLocalTracksOptions,\n  ScreenShareCaptureOptions,\n  VideoCaptureOptions,\n} from './options';\nimport { ScreenSharePresets } from './options';\nimport {\n  constraintsForOptions,\n  extractProcessorsFromOptions,\n  mergeDefaultOptions,\n  screenCaptureToDisplayMediaStreamOptions,\n} from './utils';\n\n/**\n * Creates a local video and audio track at the same time. When acquiring both\n * audio and video tracks together, it'll display a single permission prompt to\n * the user instead of two separate ones.\n * @param options\n */\nexport async function createLocalTracks(\n  options?: CreateLocalTracksOptions,\n  loggerOptions?: LoggerOptions,\n): Promise\u003cArray\u003cLocalTrack\u003e\u003e {\n  options ??= {};\n  let attemptExactMatch = false;\n\n  const {\n    audioProcessor,\n    videoProcessor,\n    optionsWithoutProcessor: internalOptions,\n  } = extractProcessorsFromOptions(options);\n\n  let retryAudioOptions: AudioCaptureOptions | undefined | boolean = internalOptions.audio;\n  let retryVideoOptions: VideoCaptureOptions | undefined | boolean = internalOptions.video;\n\n  if (audioProcessor \u0026\u0026 typeof internalOptions.audio === 'object') {\n    internalOptions.audio.processor = audioProcessor;\n  }\n  if (videoProcessor \u0026\u0026 typeof internalOptions.video === 'object') {\n    internalOptions.video.processor = videoProcessor;\n  }\n\n  // if the user passes a device id as a string, we default to exact match\n  if (\n    options.audio \u0026\u0026\n    typeof internalOptions.audio === 'object' \u0026\u0026\n    typeof internalOptions.audio.deviceId === 'string'\n  ) {\n    const deviceId: string = internalOptions.audio.deviceId;\n    internalOptions.audio.deviceId = { exact: deviceId };\n    attemptExactMatch = true;\n    retryAudioOptions = {\n      ...internalOptions.audio,\n      deviceId: { ideal: deviceId },\n    };\n  }\n  if (\n    internalOptions.video \u0026\u0026\n    typeof internalOptions.video === 'object' \u0026\u0026\n    typeof internalOptions.video.deviceId === 'string'\n  ) {\n    const deviceId: string = internalOptions.video.deviceId;\n    internalOptions.video.deviceId = { exact: deviceId };\n    attemptExactMatch = true;\n    retryVideoOptions = {\n      ...internalOptions.video,\n      deviceId: { ideal: deviceId },\n    };\n  }\n  if (\n    internalOptions.audio === true ||\n    (typeof internalOptions.audio === 'object' \u0026\u0026 !internalOptions.audio.deviceId)\n  ) {\n    internalOptions.audio = { deviceId: 'default' };\n  }\n  if (internalOptions.video === true) {\n    internalOptions.video = { deviceId: 'default' };\n  } else if (typeof internalOptions.video === 'object' \u0026\u0026 !internalOptions.video.deviceId) {\n    internalOptions.video.deviceId = 'default';\n  }\n  const opts = mergeDefaultOptions(internalOptions, audioDefaults, videoDefaults);\n  const constraints = constraintsForOptions(opts);\n\n  // Keep a reference to the promise on DeviceManager and await it in getLocalDevices()\n  // works around iOS Safari Bug https://bugs.webkit.org/show_bug.cgi?id=179363\n  const mediaPromise = navigator.mediaDevices.getUserMedia(constraints);\n\n  if (internalOptions.audio) {\n    DeviceManager.userMediaPromiseMap.set('audioinput', mediaPromise);\n    mediaPromise.catch(() =\u003e DeviceManager.userMediaPromiseMap.delete('audioinput'));\n  }\n  if (internalOptions.video) {\n    DeviceManager.userMediaPromiseMap.set('videoinput', mediaPromise);\n    mediaPromise.catch(() =\u003e DeviceManager.userMediaPromiseMap.delete('videoinput'));\n  }\n  try {\n    const stream = await mediaPromise;\n    return await Promise.all(\n      stream.getTracks().map(async (mediaStreamTrack) =\u003e {\n        const isAudio = mediaStreamTrack.kind === 'audio';\n        let trackOptions = isAudio ? opts!.audio : opts!.video;\n        if (typeof trackOptions === 'boolean' || !trackOptions) {\n          trackOptions = {};\n        }\n        let trackConstraints: MediaTrackConstraints | undefined;\n        const conOrBool = isAudio ? constraints.audio : constraints.video;\n        if (typeof conOrBool !== 'boolean') {\n          trackConstraints = conOrBool;\n        }\n\n        // update the constraints with the device id the user gave permissions to in the permission prompt\n        // otherwise each track restart (e.g. mute - unmute) will try to initialize the device again -\u003e causing additional permission prompts\n        const newDeviceId = mediaStreamTrack.getSettings().deviceId;\n        if (\n          trackConstraints?.deviceId \u0026\u0026\n          unwrapConstraint(trackConstraints.deviceId) !== newDeviceId\n        ) {\n          trackConstraints.deviceId = newDeviceId;\n        } else if (!trackConstraints) {\n          trackConstraints = { deviceId: newDeviceId };\n        }\n\n        const track = mediaTrackToLocalTrack(mediaStreamTrack, trackConstraints, loggerOptions);\n        if (track.kind === Track.Kind.Video) {\n          track.source = Track.Source.Camera;\n        } else if (track.kind === Track.Kind.Audio) {\n          track.source = Track.Source.Microphone;\n        }\n        track.mediaStream = stream;\n\n        if (isAudioTrack(track) \u0026\u0026 audioProcessor) {\n          await track.setProcessor(audioProcessor);\n        } else if (isVideoTrack(track) \u0026\u0026 videoProcessor) {\n          await track.setProcessor(videoProcessor);\n        }\n\n        return track;\n      }),\n    );\n  } catch (e) {\n    if (!attemptExactMatch) {\n      throw e;\n    }\n    return createLocalTracks(\n      {\n        ...options,\n        audio: retryAudioOptions,\n        video: retryVideoOptions,\n      },\n      loggerOptions,\n    );\n  }\n}\n\n/**\n * Creates a [[LocalVideoTrack]] with getUserMedia()\n * @param options\n */\nexport async function createLocalVideoTrack(\n  options?: VideoCaptureOptions,\n): Promise\u003cLocalVideoTrack\u003e {\n  const tracks = await createLocalTracks({\n    audio: false,\n    video: options ?? true,\n  });\n  return \u003cLocalVideoTrack\u003etracks[0];\n}\n\nexport async function createLocalAudioTrack(\n  options?: AudioCaptureOptions,\n): Promise\u003cLocalAudioTrack\u003e {\n  const tracks = await createLocalTracks({\n    audio: options ?? true,\n    video: false,\n  });\n  return \u003cLocalAudioTrack\u003etracks[0];\n}\n\n/**\n * Creates a screen capture tracks with getDisplayMedia().\n * A LocalVideoTrack is always created and returned.\n * If { audio: true }, and the browser supports audio capture, a LocalAudioTrack is also created.\n */\nexport async function createLocalScreenTracks(\n  options?: ScreenShareCaptureOptions,\n): Promise\u003cArray\u003cLocalTrack\u003e\u003e {\n  if (options === undefined) {\n    options = {};\n  }\n  if (options.resolution === undefined \u0026\u0026 !isSafari17Based()) {\n    options.resolution = ScreenSharePresets.h1080fps30.resolution;\n  }\n\n  if (navigator.mediaDevices.getDisplayMedia === undefined) {\n    throw new DeviceUnsupportedError('getDisplayMedia not supported');\n  }\n\n  const constraints = screenCaptureToDisplayMediaStreamOptions(options);\n  const stream: MediaStream = await navigator.mediaDevices.getDisplayMedia(constraints);\n\n  const tracks = stream.getVideoTracks();\n  if (tracks.length === 0) {\n    throw new TrackInvalidError('no video track found');\n  }\n  const screenVideo = new LocalVideoTrack(tracks[0], undefined, false);\n  screenVideo.source = Track.Source.ScreenShare;\n  const localTracks: Array\u003cLocalTrack\u003e = [screenVideo];\n  if (stream.getAudioTracks().length \u003e 0) {\n    const screenAudio = new LocalAudioTrack(stream.getAudioTracks()[0], undefined, false);\n    screenAudio.source = Track.Source.ScreenShareAudio;\n    localTracks.push(screenAudio);\n  }\n  return localTracks;\n}\n","import {\n  DataPacket_Kind,\n  ParticipantInfo,\n  ParticipantInfo_State,\n  ParticipantInfo_Kind as ParticipantKind,\n  ParticipantPermission,\n  ConnectionQuality as ProtoQuality,\n  type SipDTMF,\n  SubscriptionError,\n} from '@livekit/protocol';\nimport { EventEmitter } from 'events';\nimport type TypedEmitter from 'typed-emitter';\nimport log, { LoggerNames, type StructuredLogger, getLogger } from '../../logger';\nimport { ParticipantEvent, TrackEvent } from '../events';\nimport type LocalTrackPublication from '../track/LocalTrackPublication';\nimport type LocalVideoTrack from '../track/LocalVideoTrack';\nimport type RemoteTrack from '../track/RemoteTrack';\nimport type RemoteTrackPublication from '../track/RemoteTrackPublication';\nimport { Track } from '../track/Track';\nimport type { TrackPublication } from '../track/TrackPublication';\nimport { diffAttributes } from '../track/utils';\nimport type { ChatMessage, LoggerOptions, TranscriptionSegment } from '../types';\nimport { Future, isAudioTrack } from '../utils';\n\nexport enum ConnectionQuality {\n  Excellent = 'excellent',\n  Good = 'good',\n  Poor = 'poor',\n  /**\n   * Indicates that a participant has temporarily (or permanently) lost connection to LiveKit.\n   * For permanent disconnection a `ParticipantDisconnected` event will be emitted after a timeout\n   */\n  Lost = 'lost',\n  Unknown = 'unknown',\n}\n\nfunction qualityFromProto(q: ProtoQuality): ConnectionQuality {\n  switch (q) {\n    case ProtoQuality.EXCELLENT:\n      return ConnectionQuality.Excellent;\n    case ProtoQuality.GOOD:\n      return ConnectionQuality.Good;\n    case ProtoQuality.POOR:\n      return ConnectionQuality.Poor;\n    case ProtoQuality.LOST:\n      return ConnectionQuality.Lost;\n    default:\n      return ConnectionQuality.Unknown;\n  }\n}\n\nexport { ParticipantKind };\n\nexport default class Participant extends (EventEmitter as new () =\u003e TypedEmitter\u003cParticipantEventCallbacks\u003e) {\n  protected participantInfo?: ParticipantInfo;\n\n  audioTrackPublications: Map\u003cstring, TrackPublication\u003e;\n\n  videoTrackPublications: Map\u003cstring, TrackPublication\u003e;\n\n  /** map of track sid =\u003e all published tracks */\n  trackPublications: Map\u003cstring, TrackPublication\u003e;\n\n  /** audio level between 0-1.0, 1 being loudest, 0 being softest */\n  audioLevel: number = 0;\n\n  /** if participant is currently speaking */\n  isSpeaking: boolean = false;\n\n  /** server assigned unique id */\n  sid: string;\n\n  /** client assigned identity, encoded in JWT token */\n  identity: string;\n\n  /** client assigned display name, encoded in JWT token */\n  name?: string;\n\n  /** client metadata, opaque to livekit */\n  metadata?: string;\n\n  private _attributes: Record\u003cstring, string\u003e;\n\n  lastSpokeAt?: Date | undefined;\n\n  permissions?: ParticipantPermission;\n\n  protected _kind: ParticipantKind;\n\n  private _connectionQuality: ConnectionQuality = ConnectionQuality.Unknown;\n\n  protected audioContext?: AudioContext;\n\n  protected log: StructuredLogger = log;\n\n  protected loggerOptions?: LoggerOptions;\n\n  protected activeFuture?: Future\u003cvoid\u003e;\n\n  protected get logContext() {\n    return {\n      ...this.loggerOptions?.loggerContextCb?.(),\n    };\n  }\n\n  get isEncrypted() {\n    return (\n      this.trackPublications.size \u003e 0 \u0026\u0026\n      Array.from(this.trackPublications.values()).every((tr) =\u003e tr.isEncrypted)\n    );\n  }\n\n  get isAgent() {\n    return this.permissions?.agent || this.kind === ParticipantKind.AGENT;\n  }\n\n  get isActive() {\n    return this.participantInfo?.state === ParticipantInfo_State.ACTIVE;\n  }\n\n  get kind() {\n    return this._kind;\n  }\n\n  /** participant attributes, similar to metadata, but as a key/value map */\n  get attributes(): Readonly\u003cRecord\u003cstring, string\u003e\u003e {\n    return Object.freeze({ ...this._attributes });\n  }\n\n  /** @internal */\n  constructor(\n    sid: string,\n    identity: string,\n    name?: string,\n    metadata?: string,\n    attributes?: Record\u003cstring, string\u003e,\n    loggerOptions?: LoggerOptions,\n    kind: ParticipantKind = ParticipantKind.STANDARD,\n  ) {\n    super();\n\n    this.log = getLogger(loggerOptions?.loggerName ?? LoggerNames.Participant);\n    this.loggerOptions = loggerOptions;\n\n    this.setMaxListeners(100);\n    this.sid = sid;\n    this.identity = identity;\n    this.name = name;\n    this.metadata = metadata;\n    this.audioTrackPublications = new Map();\n    this.videoTrackPublications = new Map();\n    this.trackPublications = new Map();\n    this._kind = kind;\n    this._attributes = attributes ?? {};\n  }\n\n  getTrackPublications(): TrackPublication[] {\n    return Array.from(this.trackPublications.values());\n  }\n\n  /**\n   * Finds the first track that matches the source filter, for example, getting\n   * the user's camera track with getTrackBySource(Track.Source.Camera).\n   */\n  getTrackPublication(source: Track.Source): TrackPublication | undefined {\n    for (const [, pub] of this.trackPublications) {\n      if (pub.source === source) {\n        return pub;\n      }\n    }\n  }\n\n  /**\n   * Finds the first track that matches the track's name.\n   */\n  getTrackPublicationByName(name: string): TrackPublication | undefined {\n    for (const [, pub] of this.trackPublications) {\n      if (pub.trackName === name) {\n        return pub;\n      }\n    }\n  }\n\n  /**\n   * Waits until the participant is active and ready to receive data messages\n   * @returns a promise that resolves when the participant is active\n   */\n  waitUntilActive(): Promise\u003cvoid\u003e {\n    if (this.isActive) {\n      return Promise.resolve();\n    }\n\n    if (this.activeFuture) {\n      return this.activeFuture.promise;\n    }\n\n    this.activeFuture = new Future\u003cvoid\u003e();\n\n    this.once(ParticipantEvent.Active, () =\u003e {\n      this.activeFuture?.resolve?.();\n      this.activeFuture = undefined;\n    });\n    return this.activeFuture.promise;\n  }\n\n  get connectionQuality(): ConnectionQuality {\n    return this._connectionQuality;\n  }\n\n  get isCameraEnabled(): boolean {\n    const track = this.getTrackPublication(Track.Source.Camera);\n    return !(track?.isMuted ?? true);\n  }\n\n  get isMicrophoneEnabled(): boolean {\n    const track = this.getTrackPublication(Track.Source.Microphone);\n    return !(track?.isMuted ?? true);\n  }\n\n  get isScreenShareEnabled(): boolean {\n    const track = this.getTrackPublication(Track.Source.ScreenShare);\n    return !!track;\n  }\n\n  get isLocal(): boolean {\n    return false;\n  }\n\n  /** when participant joined the room */\n  get joinedAt(): Date | undefined {\n    if (this.participantInfo) {\n      return new Date(Number.parseInt(this.participantInfo.joinedAt.toString()) * 1000);\n    }\n    return new Date();\n  }\n\n  /** @internal */\n  updateInfo(info: ParticipantInfo): boolean {\n    // it's possible the update could be applied out of order due to await\n    // during reconnect sequences. when that happens, it's possible for server\n    // to have sent more recent version of participant info while JS is waiting\n    // to process the existing payload.\n    // when the participant sid remains the same, and we already have a later version\n    // of the payload, they can be safely skipped\n    if (\n      this.participantInfo \u0026\u0026\n      this.participantInfo.sid === info.sid \u0026\u0026\n      this.participantInfo.version \u003e info.version\n    ) {\n      return false;\n    }\n    this.identity = info.identity;\n    this.sid = info.sid;\n    this._setName(info.name);\n    this._setMetadata(info.metadata);\n    this._setAttributes(info.attributes);\n    if (\n      info.state === ParticipantInfo_State.ACTIVE \u0026\u0026\n      this.participantInfo?.state !== ParticipantInfo_State.ACTIVE\n    ) {\n      this.emit(ParticipantEvent.Active);\n    }\n    if (info.permission) {\n      this.setPermissions(info.permission);\n    }\n    // set this last so setMetadata can detect changes\n    this.participantInfo = info;\n    return true;\n  }\n\n  /**\n   * Updates metadata from server\n   **/\n  private _setMetadata(md: string) {\n    const changed = this.metadata !== md;\n    const prevMetadata = this.metadata;\n    this.metadata = md;\n\n    if (changed) {\n      this.emit(ParticipantEvent.ParticipantMetadataChanged, prevMetadata);\n    }\n  }\n\n  private _setName(name: string) {\n    const changed = this.name !== name;\n    this.name = name;\n\n    if (changed) {\n      this.emit(ParticipantEvent.ParticipantNameChanged, name);\n    }\n  }\n\n  /**\n   * Updates metadata from server\n   **/\n  private _setAttributes(attributes: Record\u003cstring, string\u003e) {\n    const diff = diffAttributes(this.attributes, attributes);\n    this._attributes = attributes;\n\n    if (Object.keys(diff).length \u003e 0) {\n      this.emit(ParticipantEvent.AttributesChanged, diff);\n    }\n  }\n\n  /** @internal */\n  setPermissions(permissions: ParticipantPermission): boolean {\n    const prevPermissions = this.permissions;\n    const changed =\n      permissions.canPublish !== this.permissions?.canPublish ||\n      permissions.canSubscribe !== this.permissions?.canSubscribe ||\n      permissions.canPublishData !== this.permissions?.canPublishData ||\n      permissions.hidden !== this.permissions?.hidden ||\n      permissions.recorder !== this.permissions?.recorder ||\n      permissions.canPublishSources.length !== this.permissions.canPublishSources.length ||\n      permissions.canPublishSources.some(\n        (value, index) =\u003e value !== this.permissions?.canPublishSources[index],\n      ) ||\n      permissions.canSubscribeMetrics !== this.permissions?.canSubscribeMetrics;\n    this.permissions = permissions;\n\n    if (changed) {\n      this.emit(ParticipantEvent.ParticipantPermissionsChanged, prevPermissions);\n    }\n    return changed;\n  }\n\n  /** @internal */\n  setIsSpeaking(speaking: boolean) {\n    if (speaking === this.isSpeaking) {\n      return;\n    }\n    this.isSpeaking = speaking;\n    if (speaking) {\n      this.lastSpokeAt = new Date();\n    }\n    this.emit(ParticipantEvent.IsSpeakingChanged, speaking);\n  }\n\n  /** @internal */\n  setConnectionQuality(q: ProtoQuality) {\n    const prevQuality = this._connectionQuality;\n    this._connectionQuality = qualityFromProto(q);\n    if (prevQuality !== this._connectionQuality) {\n      this.emit(ParticipantEvent.ConnectionQualityChanged, this._connectionQuality);\n    }\n  }\n\n  /**\n   * @internal\n   */\n  setDisconnected() {\n    if (this.activeFuture) {\n      this.activeFuture.reject?.(new Error('Participant disconnected'));\n      this.activeFuture = undefined;\n    }\n  }\n\n  /**\n   * @internal\n   */\n  setAudioContext(ctx: AudioContext | undefined) {\n    this.audioContext = ctx;\n    this.audioTrackPublications.forEach(\n      (track) =\u003e isAudioTrack(track.track) \u0026\u0026 track.track.setAudioContext(ctx),\n    );\n  }\n\n  protected addTrackPublication(publication: TrackPublication) {\n    // forward publication driven events\n    publication.on(TrackEvent.Muted, () =\u003e {\n      this.emit(ParticipantEvent.TrackMuted, publication);\n    });\n\n    publication.on(TrackEvent.Unmuted, () =\u003e {\n      this.emit(ParticipantEvent.TrackUnmuted, publication);\n    });\n\n    const pub = publication;\n    if (pub.track) {\n      pub.track.sid = publication.trackSid;\n    }\n\n    this.trackPublications.set(publication.trackSid, publication);\n    switch (publication.kind) {\n      case Track.Kind.Audio:\n        this.audioTrackPublications.set(publication.trackSid, publication);\n        break;\n      case Track.Kind.Video:\n        this.videoTrackPublications.set(publication.trackSid, publication);\n        break;\n      default:\n        break;\n    }\n  }\n}\n\nexport type ParticipantEventCallbacks = {\n  trackPublished: (publication: RemoteTrackPublication) =\u003e void;\n  trackSubscribed: (track: RemoteTrack, publication: RemoteTrackPublication) =\u003e void;\n  trackSubscriptionFailed: (trackSid: string, reason?: SubscriptionError) =\u003e void;\n  trackUnpublished: (publication: RemoteTrackPublication) =\u003e void;\n  trackUnsubscribed: (track: RemoteTrack, publication: RemoteTrackPublication) =\u003e void;\n  trackMuted: (publication: TrackPublication) =\u003e void;\n  trackUnmuted: (publication: TrackPublication) =\u003e void;\n  localTrackPublished: (publication: LocalTrackPublication) =\u003e void;\n  localTrackUnpublished: (publication: LocalTrackPublication) =\u003e void;\n  localTrackCpuConstrained: (track: LocalVideoTrack, publication: LocalTrackPublication) =\u003e void;\n  localSenderCreated: (sender: RTCRtpSender, track: Track) =\u003e void;\n  participantMetadataChanged: (prevMetadata: string | undefined, participant?: any) =\u003e void;\n  participantNameChanged: (name: string) =\u003e void;\n  dataReceived: (payload: Uint8Array, kind: DataPacket_Kind) =\u003e void;\n  sipDTMFReceived: (dtmf: SipDTMF) =\u003e void;\n  transcriptionReceived: (\n    transcription: TranscriptionSegment[],\n    publication?: TrackPublication,\n  ) =\u003e void;\n  isSpeakingChanged: (speaking: boolean) =\u003e void;\n  connectionQualityChanged: (connectionQuality: ConnectionQuality) =\u003e void;\n  trackStreamStateChanged: (\n    publication: RemoteTrackPublication,\n    streamState: Track.StreamState,\n  ) =\u003e void;\n  trackSubscriptionPermissionChanged: (\n    publication: RemoteTrackPublication,\n    status: TrackPublication.PermissionStatus,\n  ) =\u003e void;\n  mediaDevicesError: (error: Error, kind?: MediaDeviceKind) =\u003e void;\n  audioStreamAcquired: () =\u003e void;\n  participantPermissionsChanged: (prevPermissions?: ParticipantPermission) =\u003e void;\n  trackSubscriptionStatusChanged: (\n    publication: RemoteTrackPublication,\n    status: TrackPublication.SubscriptionStatus,\n  ) =\u003e void;\n  attributesChanged: (changedAttributes: Record\u003cstring, string\u003e) =\u003e void;\n  localTrackSubscribed: (trackPublication: LocalTrackPublication) =\u003e void;\n  chatMessage: (msg: ChatMessage) =\u003e void;\n  active: () =\u003e void;\n};\n","import { TrackPermission } from '@livekit/protocol';\n\nexport interface ParticipantTrackPermission {\n  /**\n   * The participant identity this permission applies to.\n   * You can either provide this or `participantSid`\n   */\n  participantIdentity?: string;\n\n  /**\n   * The participant server id this permission applies to.\n   * You can either provide this or `participantIdentity`\n   */\n  participantSid?: string;\n\n  /**\n   * Grant permission to all all tracks. Takes precedence over allowedTrackSids.\n   * false if unset.\n   */\n  allowAll?: boolean;\n\n  /**\n   * The list of track ids that the target participant can subscribe to.\n   * When unset, it'll allow all tracks to be subscribed by the participant.\n   * When empty, this participant is disallowed from subscribing to any tracks.\n   */\n  allowedTrackSids?: string[];\n}\n\nexport function trackPermissionToProto(perms: ParticipantTrackPermission): TrackPermission {\n  if (!perms.participantSid \u0026\u0026 !perms.participantIdentity) {\n    throw new Error(\n      'Invalid track permission, must provide at least one of participantIdentity and participantSid',\n    );\n  }\n  return new TrackPermission({\n    participantIdentity: perms.participantIdentity ?? '',\n    participantSid: perms.participantSid ?? '',\n    allTracks: perms.allowAll ?? false,\n    trackSids: perms.allowedTrackSids || [],\n  });\n}\n","import {\n  AddTrackRequest,\n  AudioTrackFeature,\n  BackupCodecPolicy,\n  ChatMessage as ChatMessageModel,\n  Codec,\n  DataPacket,\n  DataPacket_Kind,\n  Encryption_Type,\n  JoinResponse,\n  ParticipantInfo,\n  RequestResponse,\n  RequestResponse_Reason,\n  RpcAck,\n  RpcRequest,\n  RpcResponse,\n  SimulcastCodec,\n  SipDTMF,\n  SubscribedQualityUpdate,\n  TrackInfo,\n  TrackUnpublishedResponse,\n  UserPacket,\n  protoInt64,\n} from '@livekit/protocol';\nimport { SignalConnectionState } from '../../api/SignalClient';\nimport type { InternalRoomOptions } from '../../options';\nimport { PCTransportState } from '../PCTransportManager';\nimport type RTCEngine from '../RTCEngine';\nimport type OutgoingDataStreamManager from '../data-stream/outgoing/OutgoingDataStreamManager';\nimport type { TextStreamWriter } from '../data-stream/outgoing/StreamWriter';\nimport { defaultVideoCodec } from '../defaults';\nimport {\n  DeviceUnsupportedError,\n  LivekitError,\n  PublishTrackError,\n  SignalRequestError,\n  TrackInvalidError,\n  UnexpectedConnectionState,\n} from '../errors';\nimport { EngineEvent, ParticipantEvent, TrackEvent } from '../events';\nimport {\n  MAX_PAYLOAD_BYTES,\n  type PerformRpcParams,\n  RpcError,\n  type RpcInvocationData,\n  byteLength,\n} from '../rpc';\nimport LocalAudioTrack from '../track/LocalAudioTrack';\nimport LocalTrack from '../track/LocalTrack';\nimport LocalTrackPublication from '../track/LocalTrackPublication';\nimport LocalVideoTrack, { videoLayersFromEncodings } from '../track/LocalVideoTrack';\nimport { Track } from '../track/Track';\nimport { createLocalTracks } from '../track/create';\nimport type {\n  AudioCaptureOptions,\n  BackupVideoCodec,\n  CreateLocalTracksOptions,\n  ScreenShareCaptureOptions,\n  TrackPublishOptions,\n  VideoCaptureOptions,\n} from '../track/options';\nimport { ScreenSharePresets, VideoPresets, isBackupCodec } from '../track/options';\nimport {\n  getLogContextFromTrack,\n  getTrackSourceFromProto,\n  mergeDefaultOptions,\n  mimeTypeToVideoCodecString,\n  screenCaptureToDisplayMediaStreamOptions,\n  sourceToKind,\n} from '../track/utils';\nimport {\n  type ChatMessage,\n  type DataPublishOptions,\n  type SendFileOptions,\n  type SendTextOptions,\n  type StreamBytesOptions,\n  type StreamTextOptions,\n  type TextStreamInfo,\n} from '../types';\nimport {\n  Future,\n  compareVersions,\n  isAudioTrack,\n  isE2EESimulcastSupported,\n  isFireFox,\n  isLocalAudioTrack,\n  isLocalTrack,\n  isLocalVideoTrack,\n  isSVCCodec,\n  isSafari17Based,\n  isVideoTrack,\n  isWeb,\n  sleep,\n  supportsAV1,\n  supportsVP9,\n} from '../utils';\nimport Participant from './Participant';\nimport type { ParticipantTrackPermission } from './ParticipantTrackPermission';\nimport { trackPermissionToProto } from './ParticipantTrackPermission';\nimport type RemoteParticipant from './RemoteParticipant';\nimport {\n  computeTrackBackupEncodings,\n  computeVideoEncodings,\n  getDefaultDegradationPreference,\n} from './publishUtils';\n\nexport default class LocalParticipant extends Participant {\n  audioTrackPublications: Map\u003cstring, LocalTrackPublication\u003e;\n\n  videoTrackPublications: Map\u003cstring, LocalTrackPublication\u003e;\n\n  /** map of track sid =\u003e all published tracks */\n  trackPublications: Map\u003cstring, LocalTrackPublication\u003e;\n\n  /** @internal */\n  engine: RTCEngine;\n\n  /** @internal */\n  activeDeviceMap: Map\u003cMediaDeviceKind, string\u003e;\n\n  private pendingPublishing = new Set\u003cTrack.Source\u003e();\n\n  private pendingPublishPromises = new Map\u003cLocalTrack, Promise\u003cLocalTrackPublication\u003e\u003e();\n\n  private republishPromise: Promise\u003cvoid\u003e | undefined;\n\n  private cameraError: Error | undefined;\n\n  private microphoneError: Error | undefined;\n\n  private participantTrackPermissions: Array\u003cParticipantTrackPermission\u003e = [];\n\n  private allParticipantsAllowedToSubscribe: boolean = true;\n\n  // keep a pointer to room options\n  private roomOptions: InternalRoomOptions;\n\n  private encryptionType: Encryption_Type = Encryption_Type.NONE;\n\n  private reconnectFuture?: Future\u003cvoid\u003e;\n\n  private signalConnectedFuture?: Future\u003cvoid\u003e;\n\n  private activeAgentFuture?: Future\u003cRemoteParticipant\u003e;\n\n  private firstActiveAgent?: RemoteParticipant;\n\n  private rpcHandlers: Map\u003cstring, (data: RpcInvocationData) =\u003e Promise\u003cstring\u003e\u003e;\n\n  private roomOutgoingDataStreamManager: OutgoingDataStreamManager;\n\n  private pendingSignalRequests: Map\u003c\n    number,\n    {\n      resolve: (arg: any) =\u003e void;\n      reject: (reason: LivekitError) =\u003e void;\n      values: Partial\u003cRecord\u003ckeyof LocalParticipant, any\u003e\u003e;\n    }\n  \u003e;\n\n  private enabledPublishVideoCodecs: Codec[] = [];\n\n  private pendingAcks = new Map\u003cstring, { resolve: () =\u003e void; participantIdentity: string }\u003e();\n\n  private pendingResponses = new Map\u003c\n    string,\n    {\n      resolve: (payload: string | null, error: RpcError | null) =\u003e void;\n      participantIdentity: string;\n    }\n  \u003e();\n\n  /** @internal */\n  constructor(\n    sid: string,\n    identity: string,\n    engine: RTCEngine,\n    options: InternalRoomOptions,\n    roomRpcHandlers: Map\u003cstring, (data: RpcInvocationData) =\u003e Promise\u003cstring\u003e\u003e,\n    roomOutgoingDataStreamManager: OutgoingDataStreamManager,\n  ) {\n    super(sid, identity, undefined, undefined, undefined, {\n      loggerName: options.loggerName,\n      loggerContextCb: () =\u003e this.engine.logContext,\n    });\n    this.audioTrackPublications = new Map();\n    this.videoTrackPublications = new Map();\n    this.trackPublications = new Map();\n    this.engine = engine;\n    this.roomOptions = options;\n    this.setupEngine(engine);\n    this.activeDeviceMap = new Map([\n      ['audioinput', 'default'],\n      ['videoinput', 'default'],\n      ['audiooutput', 'default'],\n    ]);\n    this.pendingSignalRequests = new Map();\n    this.rpcHandlers = roomRpcHandlers;\n    this.roomOutgoingDataStreamManager = roomOutgoingDataStreamManager;\n  }\n\n  get lastCameraError(): Error | undefined {\n    return this.cameraError;\n  }\n\n  get lastMicrophoneError(): Error | undefined {\n    return this.microphoneError;\n  }\n\n  get isE2EEEnabled(): boolean {\n    return this.encryptionType !== Encryption_Type.NONE;\n  }\n\n  getTrackPublication(source: Track.Source): LocalTrackPublication | undefined {\n    const track = super.getTrackPublication(source);\n    if (track) {\n      return track as LocalTrackPublication;\n    }\n  }\n\n  getTrackPublicationByName(name: string): LocalTrackPublication | undefined {\n    const track = super.getTrackPublicationByName(name);\n    if (track) {\n      return track as LocalTrackPublication;\n    }\n  }\n\n  /**\n   * @internal\n   */\n  setupEngine(engine: RTCEngine) {\n    this.engine = engine;\n    this.engine.on(EngineEvent.RemoteMute, (trackSid: string, muted: boolean) =\u003e {\n      const pub = this.trackPublications.get(trackSid);\n      if (!pub || !pub.track) {\n        return;\n      }\n      if (muted) {\n        pub.mute();\n      } else {\n        pub.unmute();\n      }\n    });\n\n    if (this.signalConnectedFuture?.isResolved) {\n      this.signalConnectedFuture = undefined;\n    }\n\n    this.engine\n      .on(EngineEvent.Connected, this.handleReconnected)\n      .on(EngineEvent.SignalConnected, this.handleSignalConnected)\n      .on(EngineEvent.SignalRestarted, this.handleReconnected)\n      .on(EngineEvent.SignalResumed, this.handleReconnected)\n      .on(EngineEvent.Restarting, this.handleReconnecting)\n      .on(EngineEvent.Resuming, this.handleReconnecting)\n      .on(EngineEvent.LocalTrackUnpublished, this.handleLocalTrackUnpublished)\n      .on(EngineEvent.SubscribedQualityUpdate, this.handleSubscribedQualityUpdate)\n      .on(EngineEvent.Closing, this.handleClosing)\n      .on(EngineEvent.SignalRequestResponse, this.handleSignalRequestResponse)\n      .on(EngineEvent.DataPacketReceived, this.handleDataPacket);\n  }\n\n  private handleReconnecting = () =\u003e {\n    if (!this.reconnectFuture) {\n      this.reconnectFuture = new Future\u003cvoid\u003e();\n    }\n  };\n\n  private handleReconnected = () =\u003e {\n    this.reconnectFuture?.resolve?.();\n    this.reconnectFuture = undefined;\n    this.updateTrackSubscriptionPermissions();\n  };\n\n  private handleClosing = () =\u003e {\n    if (this.reconnectFuture) {\n      this.reconnectFuture.promise.catch((e) =\u003e this.log.warn(e.message, this.logContext));\n      this.reconnectFuture?.reject?.('Got disconnected during reconnection attempt');\n      this.reconnectFuture = undefined;\n    }\n    if (this.signalConnectedFuture) {\n      this.signalConnectedFuture.reject?.('Got disconnected without signal connected');\n      this.signalConnectedFuture = undefined;\n    }\n\n    this.activeAgentFuture?.reject?.('Got disconnected without active agent present');\n    this.activeAgentFuture = undefined;\n    this.firstActiveAgent = undefined;\n  };\n\n  private handleSignalConnected = (joinResponse: JoinResponse) =\u003e {\n    if (joinResponse.participant) {\n      this.updateInfo(joinResponse.participant);\n    }\n    if (!this.signalConnectedFuture) {\n      this.signalConnectedFuture = new Future\u003cvoid\u003e();\n    }\n\n    this.signalConnectedFuture.resolve?.();\n  };\n\n  private handleSignalRequestResponse = (response: RequestResponse) =\u003e {\n    const { requestId, reason, message } = response;\n    const targetRequest = this.pendingSignalRequests.get(requestId);\n    if (targetRequest) {\n      if (reason !== RequestResponse_Reason.OK) {\n        targetRequest.reject(new SignalRequestError(message, reason));\n      }\n      this.pendingSignalRequests.delete(requestId);\n    }\n  };\n\n  private handleDataPacket = (packet: DataPacket) =\u003e {\n    switch (packet.value.case) {\n      case 'rpcResponse':\n        let rpcResponse = packet.value.value as RpcResponse;\n        let payload: string | null = null;\n        let error: RpcError | null = null;\n\n        if (rpcResponse.value.case === 'payload') {\n          payload = rpcResponse.value.value;\n        } else if (rpcResponse.value.case === 'error') {\n          error = RpcError.fromProto(rpcResponse.value.value);\n        }\n        this.handleIncomingRpcResponse(rpcResponse.requestId, payload, error);\n        break;\n      case 'rpcAck':\n        let rpcAck = packet.value.value as RpcAck;\n        this.handleIncomingRpcAck(rpcAck.requestId);\n        break;\n    }\n  };\n\n  /**\n   * Sets and updates the metadata of the local participant.\n   * Note: this requires `canUpdateOwnMetadata` permission.\n   * method will throw if the user doesn't have the required permissions\n   * @param metadata\n   */\n  async setMetadata(metadata: string): Promise\u003cvoid\u003e {\n    await this.requestMetadataUpdate({ metadata });\n  }\n\n  /**\n   * Sets and updates the name of the local participant.\n   * Note: this requires `canUpdateOwnMetadata` permission.\n   * method will throw if the user doesn't have the required permissions\n   * @param metadata\n   */\n  async setName(name: string): Promise\u003cvoid\u003e {\n    await this.requestMetadataUpdate({ name });\n  }\n\n  /**\n   * Set or update participant attributes. It will make updates only to keys that\n   * are present in `attributes`, and will not override others.\n   * Note: this requires `canUpdateOwnMetadata` permission.\n   * @param attributes attributes to update\n   */\n  async setAttributes(attributes: Record\u003cstring, string\u003e) {\n    await this.requestMetadataUpdate({ attributes });\n  }\n\n  private async requestMetadataUpdate({\n    metadata,\n    name,\n    attributes,\n  }: {\n    metadata?: string;\n    name?: string;\n    attributes?: Record\u003cstring, string\u003e;\n  }) {\n    return new Promise\u003cvoid\u003e(async (resolve, reject) =\u003e {\n      try {\n        let isRejected = false;\n        const requestId = await this.engine.client.sendUpdateLocalMetadata(\n          metadata ?? this.metadata ?? '',\n          name ?? this.name ?? '',\n          attributes,\n        );\n        const startTime = performance.now();\n        this.pendingSignalRequests.set(requestId, {\n          resolve,\n          reject: (error: LivekitError) =\u003e {\n            reject(error);\n            isRejected = true;\n          },\n          values: { name, metadata, attributes },\n        });\n        while (performance.now() - startTime \u003c 5_000 \u0026\u0026 !isRejected) {\n          if (\n            (!name || this.name === name) \u0026\u0026\n            (!metadata || this.metadata === metadata) \u0026\u0026\n            (!attributes ||\n              Object.entries(attributes).every(\n                ([key, value]) =\u003e\n                  this.attributes[key] === value || (value === '' \u0026\u0026 !this.attributes[key]),\n              ))\n          ) {\n            this.pendingSignalRequests.delete(requestId);\n            resolve();\n            return;\n          }\n          await sleep(50);\n        }\n        reject(\n          new SignalRequestError('Request to update local metadata timed out', 'TimeoutError'),\n        );\n      } catch (e: any) {\n        if (e instanceof Error) reject(e);\n      }\n    });\n  }\n\n  /**\n   * Enable or disable a participant's camera track.\n   *\n   * If a track has already published, it'll mute or unmute the track.\n   * Resolves with a `LocalTrackPublication` instance if successful and `undefined` otherwise\n   */\n  setCameraEnabled(\n    enabled: boolean,\n    options?: VideoCaptureOptions,\n    publishOptions?: TrackPublishOptions,\n  ): Promise\u003cLocalTrackPublication | undefined\u003e {\n    return this.setTrackEnabled(Track.Source.Camera, enabled, options, publishOptions);\n  }\n\n  /**\n   * Enable or disable a participant's microphone track.\n   *\n   * If a track has already published, it'll mute or unmute the track.\n   * Resolves with a `LocalTrackPublication` instance if successful and `undefined` otherwise\n   */\n  setMicrophoneEnabled(\n    enabled: boolean,\n    options?: AudioCaptureOptions,\n    publishOptions?: TrackPublishOptions,\n  ): Promise\u003cLocalTrackPublication | undefined\u003e {\n    return this.setTrackEnabled(Track.Source.Microphone, enabled, options, publishOptions);\n  }\n\n  /**\n   * Start or stop sharing a participant's screen\n   * Resolves with a `LocalTrackPublication` instance if successful and `undefined` otherwise\n   */\n  setScreenShareEnabled(\n    enabled: boolean,\n    options?: ScreenShareCaptureOptions,\n    publishOptions?: TrackPublishOptions,\n  ): Promise\u003cLocalTrackPublication | undefined\u003e {\n    return this.setTrackEnabled(Track.Source.ScreenShare, enabled, options, publishOptions);\n  }\n\n  /** @internal */\n  async setE2EEEnabled(enabled: boolean) {\n    this.encryptionType = enabled ? Encryption_Type.GCM : Encryption_Type.NONE;\n    await this.republishAllTracks(undefined, false);\n  }\n\n  /**\n   * Enable or disable publishing for a track by source. This serves as a simple\n   * way to manage the common tracks (camera, mic, or screen share).\n   * Resolves with LocalTrackPublication if successful and void otherwise\n   */\n  private async setTrackEnabled(\n    source: Extract\u003cTrack.Source, Track.Source.Camera\u003e,\n    enabled: boolean,\n    options?: VideoCaptureOptions,\n    publishOptions?: TrackPublishOptions,\n  ): Promise\u003cLocalTrackPublication | undefined\u003e;\n  private async setTrackEnabled(\n    source: Extract\u003cTrack.Source, Track.Source.Microphone\u003e,\n    enabled: boolean,\n    options?: AudioCaptureOptions,\n    publishOptions?: TrackPublishOptions,\n  ): Promise\u003cLocalTrackPublication | undefined\u003e;\n  private async setTrackEnabled(\n    source: Extract\u003cTrack.Source, Track.Source.ScreenShare\u003e,\n    enabled: boolean,\n    options?: ScreenShareCaptureOptions,\n    publishOptions?: TrackPublishOptions,\n  ): Promise\u003cLocalTrackPublication | undefined\u003e;\n  private async setTrackEnabled(\n    source: Track.Source,\n    enabled: true,\n    options?: VideoCaptureOptions | AudioCaptureOptions | ScreenShareCaptureOptions,\n    publishOptions?: TrackPublishOptions,\n  ) {\n    this.log.debug('setTrackEnabled', { ...this.logContext, source, enabled });\n    if (this.republishPromise) {\n      await this.republishPromise;\n    }\n    let track = this.getTrackPublication(source);\n    if (enabled) {\n      if (track) {\n        await track.unmute();\n      } else {\n        let localTracks: Array\u003cLocalTrack\u003e | undefined;\n        if (this.pendingPublishing.has(source)) {\n          const pendingTrack = await this.waitForPendingPublicationOfSource(source);\n          if (!pendingTrack) {\n            this.log.info('waiting for pending publication promise timed out', {\n              ...this.logContext,\n              source,\n            });\n          }\n          await pendingTrack?.unmute();\n          return pendingTrack;\n        }\n        this.pendingPublishing.add(source);\n        try {\n          switch (source) {\n            case Track.Source.Camera:\n              localTracks = await this.createTracks({\n                video: (options as VideoCaptureOptions | undefined) ?? true,\n              });\n\n              break;\n            case Track.Source.Microphone:\n              localTracks = await this.createTracks({\n                audio: (options as AudioCaptureOptions | undefined) ?? true,\n              });\n              break;\n            case Track.Source.ScreenShare:\n              localTracks = await this.createScreenTracks({\n                ...(options as ScreenShareCaptureOptions | undefined),\n              });\n              break;\n            default:\n              throw new TrackInvalidError(source);\n          }\n        } catch (e: unknown) {\n          localTracks?.forEach((tr) =\u003e {\n            tr.stop();\n          });\n          if (e instanceof Error) {\n            this.emit(ParticipantEvent.MediaDevicesError, e, sourceToKind(source));\n          }\n          this.pendingPublishing.delete(source);\n          throw e;\n        }\n\n        for (const localTrack of localTracks) {\n          const opts: TrackPublishOptions = {\n            ...this.roomOptions.publishDefaults,\n            ...options,\n          };\n          if (\n            source === Track.Source.Microphone \u0026\u0026\n            isAudioTrack(localTrack) \u0026\u0026\n            opts.preConnectBuffer\n          ) {\n            this.log.info('starting preconnect buffer for microphone', {\n              ...this.logContext,\n            });\n            localTrack.startPreConnectBuffer();\n          }\n        }\n\n        try {\n          const publishPromises: Array\u003cPromise\u003cLocalTrackPublication\u003e\u003e = [];\n          for (const localTrack of localTracks) {\n            this.log.info('publishing track', {\n              ...this.logContext,\n              ...getLogContextFromTrack(localTrack),\n            });\n\n            publishPromises.push(this.publishTrack(localTrack, publishOptions));\n          }\n          const publishedTracks = await Promise.all(publishPromises);\n\n          // for screen share publications including audio, this will only return the screen share publication, not the screen share audio one\n          // revisit if we want to return an array of tracks instead for v2\n          [track] = publishedTracks;\n        } catch (e) {\n          localTracks?.forEach((tr) =\u003e {\n            tr.stop();\n          });\n          throw e;\n        } finally {\n          this.pendingPublishing.delete(source);\n        }\n      }\n    } else {\n      if (!track?.track \u0026\u0026 this.pendingPublishing.has(source)) {\n        // if there's no track available yet first wait for pending publishing promises of that source to see if it becomes available\n        track = await this.waitForPendingPublicationOfSource(source);\n        if (!track) {\n          this.log.info('waiting for pending publication promise timed out', {\n            ...this.logContext,\n            source,\n          });\n        }\n      }\n      if (track \u0026\u0026 track.track) {\n        // screenshare cannot be muted, unpublish instead\n        if (source === Track.Source.ScreenShare) {\n          track = await this.unpublishTrack(track.track);\n          const screenAudioTrack = this.getTrackPublication(Track.Source.ScreenShareAudio);\n          if (screenAudioTrack \u0026\u0026 screenAudioTrack.track) {\n            this.unpublishTrack(screenAudioTrack.track);\n          }\n        } else {\n          await track.mute();\n        }\n      }\n    }\n    return track;\n  }\n\n  /**\n   * Publish both camera and microphone at the same time. This is useful for\n   * displaying a single Permission Dialog box to the end user.\n   */\n  async enableCameraAndMicrophone() {\n    if (\n      this.pendingPublishing.has(Track.Source.Camera) ||\n      this.pendingPublishing.has(Track.Source.Microphone)\n    ) {\n      // no-op it's already been requested\n      return;\n    }\n\n    this.pendingPublishing.add(Track.Source.Camera);\n    this.pendingPublishing.add(Track.Source.Microphone);\n    try {\n      const tracks: LocalTrack[] = await this.createTracks({\n        audio: true,\n        video: true,\n      });\n\n      await Promise.all(tracks.map((track) =\u003e this.publishTrack(track)));\n    } finally {\n      this.pendingPublishing.delete(Track.Source.Camera);\n      this.pendingPublishing.delete(Track.Source.Microphone);\n    }\n  }\n\n  /**\n   * Create local camera and/or microphone tracks\n   * @param options\n   * @returns\n   */\n  async createTracks(options?: CreateLocalTracksOptions): Promise\u003cLocalTrack[]\u003e {\n    options ??= {};\n\n    const mergedOptionsWithProcessors = mergeDefaultOptions(\n      options,\n      this.roomOptions?.audioCaptureDefaults,\n      this.roomOptions?.videoCaptureDefaults,\n    );\n\n    try {\n      const tracks = await createLocalTracks(mergedOptionsWithProcessors, {\n        loggerName: this.roomOptions.loggerName,\n        loggerContextCb: () =\u003e this.logContext,\n      });\n      const localTracks = tracks.map((track) =\u003e {\n        if (isAudioTrack(track)) {\n          this.microphoneError = undefined;\n          track.setAudioContext(this.audioContext);\n          track.source = Track.Source.Microphone;\n          this.emit(ParticipantEvent.AudioStreamAcquired);\n        }\n        if (isVideoTrack(track)) {\n          this.cameraError = undefined;\n          track.source = Track.Source.Camera;\n        }\n        return track;\n      });\n      return localTracks;\n    } catch (err) {\n      if (err instanceof Error) {\n        if (options.audio) {\n          this.microphoneError = err;\n        }\n        if (options.video) {\n          this.cameraError = err;\n        }\n      }\n\n      throw err;\n    }\n  }\n\n  /**\n   * Creates a screen capture tracks with getDisplayMedia().\n   * A LocalVideoTrack is always created and returned.\n   * If { audio: true }, and the browser supports audio capture, a LocalAudioTrack is also created.\n   */\n  async createScreenTracks(options?: ScreenShareCaptureOptions): Promise\u003cArray\u003cLocalTrack\u003e\u003e {\n    if (options === undefined) {\n      options = {};\n    }\n\n    if (navigator.mediaDevices.getDisplayMedia === undefined) {\n      throw new DeviceUnsupportedError('getDisplayMedia not supported');\n    }\n\n    if (options.resolution === undefined \u0026\u0026 !isSafari17Based()) {\n      // we need to constrain the dimensions, otherwise it could lead to low bitrate\n      // due to encoding a huge video. Encoding such large surfaces is really expensive\n      // unfortunately Safari 17 has a but and cannot be constrained by default\n      options.resolution = ScreenSharePresets.h1080fps30.resolution;\n    }\n\n    const constraints = screenCaptureToDisplayMediaStreamOptions(options);\n    const stream: MediaStream = await navigator.mediaDevices.getDisplayMedia(constraints);\n\n    const tracks = stream.getVideoTracks();\n    if (tracks.length === 0) {\n      throw new TrackInvalidError('no video track found');\n    }\n    const screenVideo = new LocalVideoTrack(tracks[0], undefined, false, {\n      loggerName: this.roomOptions.loggerName,\n      loggerContextCb: () =\u003e this.logContext,\n    });\n    screenVideo.source = Track.Source.ScreenShare;\n    if (options.contentHint) {\n      screenVideo.mediaStreamTrack.contentHint = options.contentHint;\n    }\n\n    const localTracks: Array\u003cLocalTrack\u003e = [screenVideo];\n    if (stream.getAudioTracks().length \u003e 0) {\n      this.emit(ParticipantEvent.AudioStreamAcquired);\n      const screenAudio = new LocalAudioTrack(\n        stream.getAudioTracks()[0],\n        undefined,\n        false,\n        this.audioContext,\n        { loggerName: this.roomOptions.loggerName, loggerContextCb: () =\u003e this.logContext },\n      );\n      screenAudio.source = Track.Source.ScreenShareAudio;\n      localTracks.push(screenAudio);\n    }\n    return localTracks;\n  }\n\n  /**\n   * Publish a new track to the room\n   * @param track\n   * @param options\n   */\n  async publishTrack(track: LocalTrack | MediaStreamTrack, options?: TrackPublishOptions) {\n    return this.publishOrRepublishTrack(track, options);\n  }\n\n  private async publishOrRepublishTrack(\n    track: LocalTrack | MediaStreamTrack,\n    options?: TrackPublishOptions,\n    isRepublish = false,\n  ): Promise\u003cLocalTrackPublication\u003e {\n    if (isLocalAudioTrack(track)) {\n      track.setAudioContext(this.audioContext);\n    }\n\n    await this.reconnectFuture?.promise;\n    if (this.republishPromise \u0026\u0026 !isRepublish) {\n      await this.republishPromise;\n    }\n    if (isLocalTrack(track) \u0026\u0026 this.pendingPublishPromises.has(track)) {\n      await this.pendingPublishPromises.get(track);\n    }\n    let defaultConstraints: MediaTrackConstraints | undefined;\n    if (track instanceof MediaStreamTrack) {\n      defaultConstraints = track.getConstraints();\n    } else {\n      // we want to access constraints directly as `track.mediaStreamTrack`\n      // might be pointing to a non-device track (e.g. processed track) already\n      defaultConstraints = track.constraints;\n      let deviceKind: MediaDeviceKind | undefined = undefined;\n      switch (track.source) {\n        case Track.Source.Microphone:\n          deviceKind = 'audioinput';\n          break;\n        case Track.Source.Camera:\n          deviceKind = 'videoinput';\n        default:\n          break;\n      }\n      if (deviceKind \u0026\u0026 this.activeDeviceMap.has(deviceKind)) {\n        defaultConstraints = {\n          ...defaultConstraints,\n          deviceId: this.activeDeviceMap.get(deviceKind),\n        };\n      }\n    }\n    // convert raw media track into audio or video track\n    if (track instanceof MediaStreamTrack) {\n      switch (track.kind) {\n        case 'audio':\n          track = new LocalAudioTrack(track, defaultConstraints, true, this.audioContext, {\n            loggerName: this.roomOptions.loggerName,\n            loggerContextCb: () =\u003e this.logContext,\n          });\n          break;\n        case 'video':\n          track = new LocalVideoTrack(track, defaultConstraints, true, {\n            loggerName: this.roomOptions.loggerName,\n            loggerContextCb: () =\u003e this.logContext,\n          });\n          break;\n        default:\n          throw new TrackInvalidError(`unsupported MediaStreamTrack kind ${track.kind}`);\n      }\n    } else {\n      track.updateLoggerOptions({\n        loggerName: this.roomOptions.loggerName,\n        loggerContextCb: () =\u003e this.logContext,\n      });\n    }\n\n    // is it already published? if so skip\n    let existingPublication: LocalTrackPublication | undefined;\n    this.trackPublications.forEach((publication) =\u003e {\n      if (!publication.track) {\n        return;\n      }\n      if (publication.track === track) {\n        existingPublication = \u003cLocalTrackPublication\u003epublication;\n      }\n    });\n\n    if (existingPublication) {\n      this.log.warn('track has already been published, skipping', {\n        ...this.logContext,\n        ...getLogContextFromTrack(existingPublication),\n      });\n      return existingPublication;\n    }\n\n    const opts: TrackPublishOptions = {\n      ...this.roomOptions.publishDefaults,\n      ...options,\n    };\n    const isStereoInput =\n      ('channelCount' in track.mediaStreamTrack.getSettings() \u0026\u0026\n        // @ts-ignore `channelCount` on getSettings() is currently only available for Safari, but is generally the best way to determine a stereo track https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackSettings/channelCount\n        track.mediaStreamTrack.getSettings().channelCount === 2) ||\n      track.mediaStreamTrack.getConstraints().channelCount === 2;\n    const isStereo = opts.forceStereo ?? isStereoInput;\n\n    // disable dtx for stereo track if not enabled explicitly\n    if (isStereo) {\n      if (opts.dtx === undefined) {\n        this.log.info(\n          `Opus DTX will be disabled for stereo tracks by default. Enable them explicitly to make it work.`,\n          {\n            ...this.logContext,\n            ...getLogContextFromTrack(track),\n          },\n        );\n      }\n      if (opts.red === undefined) {\n        this.log.info(\n          `Opus RED will be disabled for stereo tracks by default. Enable them explicitly to make it work.`,\n        );\n      }\n      opts.dtx ??= false;\n      opts.red ??= false;\n    }\n\n    if (!isE2EESimulcastSupported() \u0026\u0026 this.roomOptions.e2ee) {\n      this.log.info(\n        `End-to-end encryption is set up, simulcast publishing will be disabled on Safari versions and iOS browsers running iOS \u003c v17.2`,\n        {\n          ...this.logContext,\n        },\n      );\n      opts.simulcast = false;\n    }\n\n    if (opts.source) {\n      track.source = opts.source;\n    }\n    const publishPromise = new Promise\u003cLocalTrackPublication\u003e(async (resolve, reject) =\u003e {\n      try {\n        if (this.engine.client.currentState !== SignalConnectionState.CONNECTED) {\n          this.log.debug('deferring track publication until signal is connected', {\n            ...this.logContext,\n            track: getLogContextFromTrack(track),\n          });\n\n          const timeout = setTimeout(() =\u003e {\n            reject(\n              new PublishTrackError(\n                'publishing rejected as engine not connected within timeout',\n                408,\n              ),\n            );\n          }, 15_000);\n          await this.waitUntilEngineConnected();\n          clearTimeout(timeout);\n          const publication = await this.publish(track, opts, isStereo);\n          resolve(publication);\n        } else {\n          try {\n            const publication = await this.publish(track, opts, isStereo);\n            resolve(publication);\n          } catch (e) {\n            reject(e);\n          }\n        }\n      } catch (e) {\n        reject(e);\n      }\n    });\n    this.pendingPublishPromises.set(track, publishPromise);\n    try {\n      const publication = await publishPromise;\n      return publication;\n    } catch (e) {\n      throw e;\n    } finally {\n      this.pendingPublishPromises.delete(track);\n    }\n  }\n\n  private waitUntilEngineConnected() {\n    if (!this.signalConnectedFuture) {\n      this.signalConnectedFuture = new Future\u003cvoid\u003e();\n    }\n    return this.signalConnectedFuture.promise;\n  }\n\n  private hasPermissionsToPublish(track: LocalTrack): boolean {\n    if (!this.permissions) {\n      this.log.warn('no permissions present for publishing track', {\n        ...this.logContext,\n        ...getLogContextFromTrack(track),\n      });\n      return false;\n    }\n    const { canPublish, canPublishSources } = this.permissions;\n    if (\n      canPublish \u0026\u0026\n      (canPublishSources.length === 0 ||\n        canPublishSources.map((source) =\u003e getTrackSourceFromProto(source)).includes(track.source))\n    ) {\n      return true;\n    }\n    this.log.warn('insufficient permissions to publish', {\n      ...this.logContext,\n      ...getLogContextFromTrack(track),\n    });\n    return false;\n  }\n\n  private async publish(track: LocalTrack, opts: TrackPublishOptions, isStereo: boolean) {\n    if (!this.hasPermissionsToPublish(track)) {\n      throw new PublishTrackError('failed to publish track, insufficient permissions', 403);\n    }\n    const existingTrackOfSource = Array.from(this.trackPublications.values()).find(\n      (publishedTrack) =\u003e isLocalTrack(track) \u0026\u0026 publishedTrack.source === track.source,\n    );\n    if (existingTrackOfSource \u0026\u0026 track.source !== Track.Source.Unknown) {\n      this.log.info(`publishing a second track with the same source: ${track.source}`, {\n        ...this.logContext,\n        ...getLogContextFromTrack(track),\n      });\n    }\n    if (opts.stopMicTrackOnMute \u0026\u0026 isAudioTrack(track)) {\n      track.stopOnMute = true;\n    }\n\n    if (track.source === Track.Source.ScreenShare \u0026\u0026 isFireFox()) {\n      // Firefox does not work well with simulcasted screen share\n      // we frequently get no data on layer 0 when enabled\n      opts.simulcast = false;\n    }\n\n    // require full AV1/VP9 SVC support prior to using it\n    if (opts.videoCodec === 'av1' \u0026\u0026 !supportsAV1()) {\n      opts.videoCodec = undefined;\n    }\n    if (opts.videoCodec === 'vp9' \u0026\u0026 !supportsVP9()) {\n      opts.videoCodec = undefined;\n    }\n    if (opts.videoCodec === undefined) {\n      opts.videoCodec = defaultVideoCodec;\n    }\n    if (this.enabledPublishVideoCodecs.length \u003e 0) {\n      // fallback to a supported codec if it is not supported\n      if (\n        !this.enabledPublishVideoCodecs.some(\n          (c) =\u003e opts.videoCodec === mimeTypeToVideoCodecString(c.mime),\n        )\n      ) {\n        opts.videoCodec = mimeTypeToVideoCodecString(this.enabledPublishVideoCodecs[0].mime);\n      }\n    }\n\n    const videoCodec = opts.videoCodec;\n\n    // handle track actions\n    track.on(TrackEvent.Muted, this.onTrackMuted);\n    track.on(TrackEvent.Unmuted, this.onTrackUnmuted);\n    track.on(TrackEvent.Ended, this.handleTrackEnded);\n    track.on(TrackEvent.UpstreamPaused, this.onTrackUpstreamPaused);\n    track.on(TrackEvent.UpstreamResumed, this.onTrackUpstreamResumed);\n    track.on(TrackEvent.AudioTrackFeatureUpdate, this.onTrackFeatureUpdate);\n\n    const audioFeatures: AudioTrackFeature[] = [];\n    const disableDtx = !(opts.dtx ?? true);\n\n    const settings = track.getSourceTrackSettings();\n\n    if (settings.autoGainControl) {\n      audioFeatures.push(AudioTrackFeature.TF_AUTO_GAIN_CONTROL);\n    }\n    if (settings.echoCancellation) {\n      audioFeatures.push(AudioTrackFeature.TF_ECHO_CANCELLATION);\n    }\n    if (settings.noiseSuppression) {\n      audioFeatures.push(AudioTrackFeature.TF_NOISE_SUPPRESSION);\n    }\n    if (settings.channelCount \u0026\u0026 settings.channelCount \u003e 1) {\n      audioFeatures.push(AudioTrackFeature.TF_STEREO);\n    }\n    if (disableDtx) {\n      audioFeatures.push(AudioTrackFeature.TF_NO_DTX);\n    }\n    if (isLocalAudioTrack(track) \u0026\u0026 track.hasPreConnectBuffer) {\n      audioFeatures.push(AudioTrackFeature.TF_PRECONNECT_BUFFER);\n    }\n\n    // create track publication from track\n    const req = new AddTrackRequest({\n      // get local track id for use during publishing\n      cid: track.mediaStreamTrack.id,\n      name: opts.name,\n      type: Track.kindToProto(track.kind),\n      muted: track.isMuted,\n      source: Track.sourceToProto(track.source),\n      disableDtx,\n      encryption: this.encryptionType,\n      stereo: isStereo,\n      disableRed: this.isE2EEEnabled || !(opts.red ?? true),\n      stream: opts?.stream,\n      backupCodecPolicy: opts?.backupCodecPolicy as BackupCodecPolicy,\n      audioFeatures,\n    });\n\n    // compute encodings and layers for video\n    let encodings: RTCRtpEncodingParameters[] | undefined;\n    if (track.kind === Track.Kind.Video) {\n      let dims: Track.Dimensions = {\n        width: 0,\n        height: 0,\n      };\n      try {\n        dims = await track.waitForDimensions();\n      } catch (e) {\n        // use defaults, it's quite painful for congestion control without simulcast\n        // so using default dims according to publish settings\n        const defaultRes =\n          this.roomOptions.videoCaptureDefaults?.resolution ?? VideoPresets.h720.resolution;\n        dims = {\n          width: defaultRes.width,\n          height: defaultRes.height,\n        };\n        // log failure\n        this.log.error('could not determine track dimensions, using defaults', {\n          ...this.logContext,\n          ...getLogContextFromTrack(track),\n          dims,\n        });\n      }\n      // width and height should be defined for video\n      req.width = dims.width;\n      req.height = dims.height;\n      // for svc codecs, disable simulcast and use vp8 for backup codec\n      if (isLocalVideoTrack(track)) {\n        if (isSVCCodec(videoCodec)) {\n          if (track.source === Track.Source.ScreenShare) {\n            // vp9 svc with screenshare cannot encode multiple spatial layers\n            // doing so reduces publish resolution to minimal resolution\n            opts.scalabilityMode = 'L1T3';\n            // Chrome does not allow more than 5 fps with L1T3, and it has encoding bugs with L3T3\n            // It has a different path for screenshare handling and it seems to be untested/buggy\n            // As a workaround, we are setting contentHint to force it to go through the same\n            // path as regular camera video. While this is not optimal, it delivers the performance\n            // that we need\n            if ('contentHint' in track.mediaStreamTrack) {\n              track.mediaStreamTrack.contentHint = 'motion';\n              this.log.info('forcing contentHint to motion for screenshare with SVC codecs', {\n                ...this.logContext,\n                ...getLogContextFromTrack(track),\n              });\n            }\n          }\n          // set scalabilityMode to 'L3T3_KEY' by default\n          opts.scalabilityMode = opts.scalabilityMode ?? 'L3T3_KEY';\n        }\n\n        req.simulcastCodecs = [\n          new SimulcastCodec({\n            codec: videoCodec,\n            cid: track.mediaStreamTrack.id,\n          }),\n        ];\n\n        // set up backup\n        if (opts.backupCodec === true) {\n          opts.backupCodec = { codec: defaultVideoCodec };\n        }\n        if (\n          opts.backupCodec \u0026\u0026\n          videoCodec !== opts.backupCodec.codec \u0026\u0026\n          // TODO remove this once e2ee is supported for backup codecs\n          req.encryption === Encryption_Type.NONE\n        ) {\n          // multi-codec simulcast requires dynacast\n          if (!this.roomOptions.dynacast) {\n            this.roomOptions.dynacast = true;\n          }\n          req.simulcastCodecs.push(\n            new SimulcastCodec({\n              codec: opts.backupCodec.codec,\n              cid: '',\n            }),\n          );\n        }\n      }\n\n      encodings = computeVideoEncodings(\n        track.source === Track.Source.ScreenShare,\n        req.width,\n        req.height,\n        opts,\n      );\n      req.layers = videoLayersFromEncodings(\n        req.width,\n        req.height,\n        encodings,\n        isSVCCodec(opts.videoCodec),\n      );\n    } else if (track.kind === Track.Kind.Audio) {\n      encodings = [\n        {\n          maxBitrate: opts.audioPreset?.maxBitrate,\n          priority: opts.audioPreset?.priority ?? 'high',\n          networkPriority: opts.audioPreset?.priority ?? 'high',\n        },\n      ];\n    }\n\n    if (!this.engine || this.engine.isClosed) {\n      throw new UnexpectedConnectionState('cannot publish track when not connected');\n    }\n\n    const negotiate = async () =\u003e {\n      if (!this.engine.pcManager) {\n        throw new UnexpectedConnectionState('pcManager is not ready');\n      }\n\n      track.sender = await this.engine.createSender(track, opts, encodings);\n      this.emit(ParticipantEvent.LocalSenderCreated, track.sender, track);\n\n      if (isLocalVideoTrack(track)) {\n        opts.degradationPreference ??= getDefaultDegradationPreference(track);\n        track.setDegradationPreference(opts.degradationPreference);\n      }\n\n      if (encodings) {\n        if (isFireFox() \u0026\u0026 track.kind === Track.Kind.Audio) {\n          /* Refer to RFC https://datatracker.ietf.org/doc/html/rfc7587#section-6.1,\n             livekit-server uses maxaveragebitrate=510000 in the answer sdp to permit client to\n             publish high quality audio track. But firefox always uses this value as the actual\n             bitrates, causing the audio bitrates to rise to 510Kbps in any stereo case unexpectedly.\n             So the client need to modify maxaverragebitrates in answer sdp to user provided value to\n             fix the issue.\n           */\n          let trackTransceiver: RTCRtpTransceiver | undefined = undefined;\n          for (const transceiver of this.engine.pcManager.publisher.getTransceivers()) {\n            if (transceiver.sender === track.sender) {\n              trackTransceiver = transceiver;\n              break;\n            }\n          }\n          if (trackTransceiver) {\n            this.engine.pcManager.publisher.setTrackCodecBitrate({\n              transceiver: trackTransceiver,\n              codec: 'opus',\n              maxbr: encodings[0]?.maxBitrate ? encodings[0].maxBitrate / 1000 : 0,\n            });\n          }\n        } else if (track.codec \u0026\u0026 isSVCCodec(track.codec) \u0026\u0026 encodings[0]?.maxBitrate) {\n          this.engine.pcManager.publisher.setTrackCodecBitrate({\n            cid: req.cid,\n            codec: track.codec,\n            maxbr: encodings[0].maxBitrate / 1000,\n          });\n        }\n      }\n\n      await this.engine.negotiate();\n    };\n\n    let ti: TrackInfo;\n    const addTrackPromise = new Promise\u003cTrackInfo\u003e(async (resolve, reject) =\u003e {\n      try {\n        ti = await this.engine.addTrack(req);\n        resolve(ti);\n      } catch (err) {\n        if (track.sender \u0026\u0026 this.engine.pcManager?.publisher) {\n          this.engine.pcManager.publisher.removeTrack(track.sender);\n          await this.engine.negotiate().catch((negotiateErr) =\u003e {\n            this.log.error(\n              'failed to negotiate after removing track due to failed add track request',\n              {\n                ...this.logContext,\n                ...getLogContextFromTrack(track),\n                error: negotiateErr,\n              },\n            );\n          });\n        }\n        reject(err);\n      }\n    });\n    if (this.enabledPublishVideoCodecs.length \u003e 0) {\n      const rets = await Promise.all([addTrackPromise, negotiate()]);\n      ti = rets[0];\n    } else {\n      ti = await addTrackPromise;\n      // server might not support the codec the client has requested, in that case, fallback\n      // to a supported codec\n      let primaryCodecMime: string | undefined;\n      ti.codecs.forEach((codec) =\u003e {\n        if (primaryCodecMime === undefined) {\n          primaryCodecMime = codec.mimeType;\n        }\n      });\n      if (primaryCodecMime \u0026\u0026 track.kind === Track.Kind.Video) {\n        const updatedCodec = mimeTypeToVideoCodecString(primaryCodecMime);\n        if (updatedCodec !== videoCodec) {\n          this.log.debug('falling back to server selected codec', {\n            ...this.logContext,\n            ...getLogContextFromTrack(track),\n            codec: updatedCodec,\n          });\n          opts.videoCodec = updatedCodec;\n\n          // recompute encodings since bitrates/etc could have changed\n          encodings = computeVideoEncodings(\n            track.source === Track.Source.ScreenShare,\n            req.width,\n            req.height,\n            opts,\n          );\n        }\n      }\n      await negotiate();\n    }\n\n    const publication = new LocalTrackPublication(track.kind, ti, track, {\n      loggerName: this.roomOptions.loggerName,\n      loggerContextCb: () =\u003e this.logContext,\n    });\n    publication.on(TrackEvent.CpuConstrained, (constrainedTrack) =\u003e\n      this.onTrackCpuConstrained(constrainedTrack, publication),\n    );\n    // save options for when it needs to be republished again\n    publication.options = opts;\n    track.sid = ti.sid;\n\n    this.log.debug(`publishing ${track.kind} with encodings`, {\n      ...this.logContext,\n      encodings,\n      trackInfo: ti,\n    });\n\n    if (isLocalVideoTrack(track)) {\n      track.startMonitor(this.engine.client);\n    } else if (isLocalAudioTrack(track)) {\n      track.startMonitor();\n    }\n\n    this.addTrackPublication(publication);\n    // send event for publication\n    this.emit(ParticipantEvent.LocalTrackPublished, publication);\n\n    if (\n      isLocalAudioTrack(track) \u0026\u0026\n      ti.audioFeatures.includes(AudioTrackFeature.TF_PRECONNECT_BUFFER)\n    ) {\n      const stream = track.getPreConnectBuffer();\n      const mimeType = track.getPreConnectBufferMimeType();\n      // TODO: we're registering the listener after negotiation, so there might be a race\n      this.on(ParticipantEvent.LocalTrackSubscribed, (pub) =\u003e {\n        if (pub.trackSid === ti.sid) {\n          if (!track.hasPreConnectBuffer) {\n            this.log.warn('subscribe event came to late, buffer already closed', this.logContext);\n            return;\n          }\n          this.log.debug('finished recording preconnect buffer', {\n            ...this.logContext,\n            ...getLogContextFromTrack(track),\n          });\n          track.stopPreConnectBuffer();\n        }\n      });\n\n      if (stream) {\n        const bufferStreamPromise = new Promise\u003cvoid\u003e(async (resolve, reject) =\u003e {\n          try {\n            this.log.debug('waiting for agent', {\n              ...this.logContext,\n              ...getLogContextFromTrack(track),\n            });\n            const agentActiveTimeout = setTimeout(() =\u003e {\n              reject(new Error('agent not active within 10 seconds'));\n            }, 10_000);\n            const agent = await this.waitUntilActiveAgentPresent();\n            clearTimeout(agentActiveTimeout);\n            this.log.debug('sending preconnect buffer', {\n              ...this.logContext,\n              ...getLogContextFromTrack(track),\n            });\n            const writer = await this.streamBytes({\n              name: 'preconnect-buffer',\n              mimeType,\n              topic: 'lk.agent.pre-connect-audio-buffer',\n              destinationIdentities: [agent.identity],\n              attributes: {\n                trackId: publication.trackSid,\n                sampleRate: String(settings.sampleRate ?? '48000'),\n                channels: String(settings.channelCount ?? '1'),\n              },\n            });\n            for await (const chunk of stream) {\n              await writer.write(chunk);\n            }\n            await writer.close();\n            resolve();\n          } catch (e) {\n            reject(e);\n          }\n        });\n        bufferStreamPromise\n          .then(() =\u003e {\n            this.log.debug('preconnect buffer sent successfully', {\n              ...this.logContext,\n              ...getLogContextFromTrack(track),\n            });\n          })\n          .catch((e) =\u003e {\n            this.log.error('error sending preconnect buffer', {\n              ...this.logContext,\n              ...getLogContextFromTrack(track),\n              error: e,\n            });\n          });\n      }\n    }\n    return publication;\n  }\n\n  override get isLocal(): boolean {\n    return true;\n  }\n\n  /** @internal\n   * publish additional codec to existing track\n   */\n  async publishAdditionalCodecForTrack(\n    track: LocalTrack | MediaStreamTrack,\n    videoCodec: BackupVideoCodec,\n    options?: TrackPublishOptions,\n  ) {\n    // TODO remove once e2ee is supported for backup tracks\n    if (this.encryptionType !== Encryption_Type.NONE) {\n      return;\n    }\n\n    // is it not published? if so skip\n    let existingPublication: LocalTrackPublication | undefined;\n    this.trackPublications.forEach((publication) =\u003e {\n      if (!publication.track) {\n        return;\n      }\n      if (publication.track === track) {\n        existingPublication = \u003cLocalTrackPublication\u003epublication;\n      }\n    });\n    if (!existingPublication) {\n      throw new TrackInvalidError('track is not published');\n    }\n\n    if (!isLocalVideoTrack(track)) {\n      throw new TrackInvalidError('track is not a video track');\n    }\n\n    const opts: TrackPublishOptions = {\n      ...this.roomOptions?.publishDefaults,\n      ...options,\n    };\n\n    const encodings = computeTrackBackupEncodings(track, videoCodec, opts);\n    if (!encodings) {\n      this.log.info(\n        `backup codec has been disabled, ignoring request to add additional codec for track`,\n        {\n          ...this.logContext,\n          ...getLogContextFromTrack(track),\n        },\n      );\n      return;\n    }\n    const simulcastTrack = track.addSimulcastTrack(videoCodec, encodings);\n    if (!simulcastTrack) {\n      return;\n    }\n    const req = new AddTrackRequest({\n      cid: simulcastTrack.mediaStreamTrack.id,\n      type: Track.kindToProto(track.kind),\n      muted: track.isMuted,\n      source: Track.sourceToProto(track.source),\n      sid: track.sid,\n      simulcastCodecs: [\n        {\n          codec: opts.videoCodec,\n          cid: simulcastTrack.mediaStreamTrack.id,\n        },\n      ],\n    });\n    req.layers = videoLayersFromEncodings(req.width, req.height, encodings);\n\n    if (!this.engine || this.engine.isClosed) {\n      throw new UnexpectedConnectionState('cannot publish track when not connected');\n    }\n\n    const negotiate = async () =\u003e {\n      const transceiverInit: RTCRtpTransceiverInit = { direction: 'sendonly' };\n      if (encodings) {\n        transceiverInit.sendEncodings = encodings;\n      }\n      await this.engine.createSimulcastSender(track, simulcastTrack, opts, encodings);\n\n      await this.engine.negotiate();\n    };\n\n    const rets = await Promise.all([this.engine.addTrack(req), negotiate()]);\n    const ti = rets[0];\n\n    this.log.debug(`published ${videoCodec} for track ${track.sid}`, {\n      ...this.logContext,\n      encodings,\n      trackInfo: ti,\n    });\n  }\n\n  async unpublishTrack(\n    track: LocalTrack | MediaStreamTrack,\n    stopOnUnpublish?: boolean,\n  ): Promise\u003cLocalTrackPublication | undefined\u003e {\n    if (isLocalTrack(track)) {\n      const publishPromise = this.pendingPublishPromises.get(track);\n      if (publishPromise) {\n        this.log.info('awaiting publish promise before attempting to unpublish', {\n          ...this.logContext,\n          ...getLogContextFromTrack(track),\n        });\n        await publishPromise;\n      }\n    }\n    // look through all published tracks to find the right ones\n    const publication = this.getPublicationForTrack(track);\n\n    const pubLogContext = publication ? getLogContextFromTrack(publication) : undefined;\n\n    this.log.debug('unpublishing track', {\n      ...this.logContext,\n      ...pubLogContext,\n    });\n\n    if (!publication || !publication.track) {\n      this.log.warn('track was not unpublished because no publication was found', {\n        ...this.logContext,\n        ...pubLogContext,\n      });\n      return undefined;\n    }\n\n    track = publication.track;\n    track.off(TrackEvent.Muted, this.onTrackMuted);\n    track.off(TrackEvent.Unmuted, this.onTrackUnmuted);\n    track.off(TrackEvent.Ended, this.handleTrackEnded);\n    track.off(TrackEvent.UpstreamPaused, this.onTrackUpstreamPaused);\n    track.off(TrackEvent.UpstreamResumed, this.onTrackUpstreamResumed);\n    track.off(TrackEvent.AudioTrackFeatureUpdate, this.onTrackFeatureUpdate);\n\n    if (stopOnUnpublish === undefined) {\n      stopOnUnpublish = this.roomOptions?.stopLocalTrackOnUnpublish ?? true;\n    }\n    if (stopOnUnpublish) {\n      track.stop();\n    } else {\n      track.stopMonitor();\n    }\n\n    let negotiationNeeded = false;\n    const trackSender = track.sender;\n    track.sender = undefined;\n    if (\n      this.engine.pcManager \u0026\u0026\n      this.engine.pcManager.currentState \u003c PCTransportState.FAILED \u0026\u0026\n      trackSender\n    ) {\n      try {\n        for (const transceiver of this.engine.pcManager.publisher.getTransceivers()) {\n          // if sender is not currently sending (after replaceTrack(null))\n          // removeTrack would have no effect.\n          // to ensure we end up successfully removing the track, manually set\n          // the transceiver to inactive\n          if (transceiver.sender === trackSender) {\n            transceiver.direction = 'inactive';\n            negotiationNeeded = true;\n          }\n        }\n        if (this.engine.removeTrack(trackSender)) {\n          negotiationNeeded = true;\n        }\n        if (isLocalVideoTrack(track)) {\n          for (const [, trackInfo] of track.simulcastCodecs) {\n            if (trackInfo.sender) {\n              if (this.engine.removeTrack(trackInfo.sender)) {\n                negotiationNeeded = true;\n              }\n              trackInfo.sender = undefined;\n            }\n          }\n          track.simulcastCodecs.clear();\n        }\n      } catch (e) {\n        this.log.warn('failed to unpublish track', {\n          ...this.logContext,\n          ...pubLogContext,\n          error: e,\n        });\n      }\n    }\n\n    // remove from our maps\n    this.trackPublications.delete(publication.trackSid);\n    switch (publication.kind) {\n      case Track.Kind.Audio:\n        this.audioTrackPublications.delete(publication.trackSid);\n        break;\n      case Track.Kind.Video:\n        this.videoTrackPublications.delete(publication.trackSid);\n        break;\n      default:\n        break;\n    }\n\n    this.emit(ParticipantEvent.LocalTrackUnpublished, publication);\n    publication.setTrack(undefined);\n\n    if (negotiationNeeded) {\n      await this.engine.negotiate();\n    }\n    return publication;\n  }\n\n  async unpublishTracks(\n    tracks: LocalTrack[] | MediaStreamTrack[],\n  ): Promise\u003cLocalTrackPublication[]\u003e {\n    const results = await Promise.all(tracks.map((track) =\u003e this.unpublishTrack(track)));\n    return results.filter((track) =\u003e !!track);\n  }\n\n  async republishAllTracks(options?: TrackPublishOptions, restartTracks: boolean = true) {\n    if (this.republishPromise) {\n      await this.republishPromise;\n    }\n    this.republishPromise = new Promise(async (resolve, reject) =\u003e {\n      try {\n        const localPubs: LocalTrackPublication[] = [];\n        this.trackPublications.forEach((pub) =\u003e {\n          if (pub.track) {\n            if (options) {\n              pub.options = { ...pub.options, ...options };\n            }\n            localPubs.push(pub);\n          }\n        });\n\n        await Promise.all(\n          localPubs.map(async (pub) =\u003e {\n            const track = pub.track!;\n            await this.unpublishTrack(track, false);\n            if (\n              restartTracks \u0026\u0026\n              !track.isMuted \u0026\u0026\n              track.source !== Track.Source.ScreenShare \u0026\u0026\n              track.source !== Track.Source.ScreenShareAudio \u0026\u0026\n              (isLocalAudioTrack(track) || isLocalVideoTrack(track)) \u0026\u0026\n              !track.isUserProvided\n            ) {\n              // generally we need to restart the track before publishing, often a full reconnect\n              // is necessary because computer had gone to sleep.\n              this.log.debug('restarting existing track', {\n                ...this.logContext,\n                track: pub.trackSid,\n              });\n              await track.restartTrack();\n            }\n            await this.publishOrRepublishTrack(track, pub.options, true);\n          }),\n        );\n        resolve();\n      } catch (error: any) {\n        reject(error);\n      } finally {\n        this.republishPromise = undefined;\n      }\n    });\n\n    await this.republishPromise;\n  }\n\n  /**\n   * Publish a new data payload to the room. Data will be forwarded to each\n   * participant in the room if the destination field in publishOptions is empty\n   *\n   * @param data Uint8Array of the payload. To send string data, use TextEncoder.encode\n   * @param options optionally specify a `reliable`, `topic` and `destination`\n   */\n  async publishData(data: Uint8Array, options: DataPublishOptions = {}): Promise\u003cvoid\u003e {\n    const kind = options.reliable ? DataPacket_Kind.RELIABLE : DataPacket_Kind.LOSSY;\n    const destinationIdentities = options.destinationIdentities;\n    const topic = options.topic;\n\n    const packet = new DataPacket({\n      kind: kind,\n      value: {\n        case: 'user',\n        value: new UserPacket({\n          participantIdentity: this.identity,\n          payload: data,\n          destinationIdentities,\n          topic,\n        }),\n      },\n    });\n\n    await this.engine.sendDataPacket(packet, kind);\n  }\n\n  /**\n   * Publish SIP DTMF message to the room.\n   *\n   * @param code DTMF code\n   * @param digit DTMF digit\n   */\n  async publishDtmf(code: number, digit: string): Promise\u003cvoid\u003e {\n    const packet = new DataPacket({\n      kind: DataPacket_Kind.RELIABLE,\n      value: {\n        case: 'sipDtmf',\n        value: new SipDTMF({\n          code: code,\n          digit: digit,\n        }),\n      },\n    });\n\n    await this.engine.sendDataPacket(packet, DataPacket_Kind.RELIABLE);\n  }\n\n  /** @deprecated Consider migrating to {@link sendText} */\n  async sendChatMessage(text: string, options?: SendTextOptions): Promise\u003cChatMessage\u003e {\n    const msg = {\n      id: crypto.randomUUID(),\n      message: text,\n      timestamp: Date.now(),\n      attachedFiles: options?.attachments,\n    } as const satisfies ChatMessage;\n    const packet = new DataPacket({\n      value: {\n        case: 'chatMessage',\n        value: new ChatMessageModel({\n          ...msg,\n          timestamp: protoInt64.parse(msg.timestamp),\n        }),\n      },\n    });\n    await this.engine.sendDataPacket(packet, DataPacket_Kind.RELIABLE);\n\n    this.emit(ParticipantEvent.ChatMessage, msg);\n    return msg;\n  }\n\n  /** @deprecated Consider migrating to {@link sendText} */\n  async editChatMessage(editText: string, originalMessage: ChatMessage) {\n    const msg = {\n      ...originalMessage,\n      message: editText,\n      editTimestamp: Date.now(),\n    } as const satisfies ChatMessage;\n    const packet = new DataPacket({\n      value: {\n        case: 'chatMessage',\n        value: new ChatMessageModel({\n          ...msg,\n          timestamp: protoInt64.parse(msg.timestamp),\n          editTimestamp: protoInt64.parse(msg.editTimestamp),\n        }),\n      },\n    });\n    await this.engine.sendDataPacket(packet, DataPacket_Kind.RELIABLE);\n    this.emit(ParticipantEvent.ChatMessage, msg);\n    return msg;\n  }\n\n  /**\n   * Sends the given string to participants in the room via the data channel.\n   * For longer messages, consider using {@link streamText} instead.\n   *\n   * @param text The text payload\n   * @param options.topic Topic identifier used to route the stream to appropriate handlers.\n   */\n  async sendText(text: string, options?: SendTextOptions): Promise\u003cTextStreamInfo\u003e {\n    return this.roomOutgoingDataStreamManager.sendText(text, options);\n  }\n\n  /**\n   * Creates a new TextStreamWriter which can be used to stream text incrementally\n   * to participants in the room via the data channel.\n   *\n   * @param options.topic Topic identifier used to route the stream to appropriate handlers.\n   *\n   * @internal\n   * @experimental CAUTION, might get removed in a minor release\n   */\n  async streamText(options?: StreamTextOptions): Promise\u003cTextStreamWriter\u003e {\n    return this.roomOutgoingDataStreamManager.streamText(options);\n  }\n\n  /** Send a File to all participants in the room via the data channel.\n   * @param file The File object payload\n   * @param options.topic Topic identifier used to route the stream to appropriate handlers.\n   * @param options.onProgress A callback function used to monitor the upload progress percentage.\n   */\n  async sendFile(file: File, options?: SendFileOptions): Promise\u003c{ id: string }\u003e {\n    return this.roomOutgoingDataStreamManager.sendFile(file, options);\n  }\n\n  /**\n   * Stream bytes incrementally to participants in the room via the data channel.\n   * For sending files, consider using {@link sendFile} instead.\n   *\n   * @param options.topic Topic identifier used to route the stream to appropriate handlers.\n   */\n  async streamBytes(options?: StreamBytesOptions) {\n    return this.roomOutgoingDataStreamManager.streamBytes(options);\n  }\n\n  /**\n   * Initiate an RPC call to a remote participant\n   * @param params - Parameters for initiating the RPC call, see {@link PerformRpcParams}\n   * @returns A promise that resolves with the response payload or rejects with an error.\n   * @throws Error on failure. Details in `message`.\n   */\n  async performRpc({\n    destinationIdentity,\n    method,\n    payload,\n    responseTimeout = 10000,\n  }: PerformRpcParams): Promise\u003cstring\u003e {\n    const maxRoundTripLatency = 2000;\n\n    return new Promise(async (resolve, reject) =\u003e {\n      if (byteLength(payload) \u003e MAX_PAYLOAD_BYTES) {\n        reject(RpcError.builtIn('REQUEST_PAYLOAD_TOO_LARGE'));\n        return;\n      }\n\n      if (\n        this.engine.latestJoinResponse?.serverInfo?.version \u0026\u0026\n        compareVersions(this.engine.latestJoinResponse?.serverInfo?.version, '1.8.0') \u003c 0\n      ) {\n        reject(RpcError.builtIn('UNSUPPORTED_SERVER'));\n        return;\n      }\n\n      const id = crypto.randomUUID();\n      await this.publishRpcRequest(\n        destinationIdentity,\n        id,\n        method,\n        payload,\n        responseTimeout - maxRoundTripLatency,\n      );\n\n      const ackTimeoutId = setTimeout(() =\u003e {\n        this.pendingAcks.delete(id);\n        reject(RpcError.builtIn('CONNECTION_TIMEOUT'));\n        this.pendingResponses.delete(id);\n        clearTimeout(responseTimeoutId);\n      }, maxRoundTripLatency);\n\n      this.pendingAcks.set(id, {\n        resolve: () =\u003e {\n          clearTimeout(ackTimeoutId);\n        },\n        participantIdentity: destinationIdentity,\n      });\n\n      const responseTimeoutId = setTimeout(() =\u003e {\n        this.pendingResponses.delete(id);\n        reject(RpcError.builtIn('RESPONSE_TIMEOUT'));\n      }, responseTimeout);\n\n      this.pendingResponses.set(id, {\n        resolve: (responsePayload: string | null, responseError: RpcError | null) =\u003e {\n          clearTimeout(responseTimeoutId);\n          if (this.pendingAcks.has(id)) {\n            console.warn('RPC response received before ack', id);\n            this.pendingAcks.delete(id);\n            clearTimeout(ackTimeoutId);\n          }\n\n          if (responseError) {\n            reject(responseError);\n          } else {\n            resolve(responsePayload ?? '');\n          }\n        },\n        participantIdentity: destinationIdentity,\n      });\n    });\n  }\n\n  /**\n   * @deprecated use `room.registerRpcMethod` instead\n   */\n  registerRpcMethod(method: string, handler: (data: RpcInvocationData) =\u003e Promise\u003cstring\u003e) {\n    if (this.rpcHandlers.has(method)) {\n      this.log.warn(\n        `you're overriding the RPC handler for method ${method}, in the future this will throw an error`,\n      );\n    }\n\n    this.rpcHandlers.set(method, handler);\n  }\n\n  /**\n   * @deprecated use `room.unregisterRpcMethod` instead\n   */\n  unregisterRpcMethod(method: string) {\n    this.rpcHandlers.delete(method);\n  }\n\n  /**\n   * Control who can subscribe to LocalParticipant's published tracks.\n   *\n   * By default, all participants can subscribe. This allows fine-grained control over\n   * who is able to subscribe at a participant and track level.\n   *\n   * Note: if access is given at a track-level (i.e. both [allParticipantsAllowed] and\n   * [ParticipantTrackPermission.allTracksAllowed] are false), any newer published tracks\n   * will not grant permissions to any participants and will require a subsequent\n   * permissions update to allow subscription.\n   *\n   * @param allParticipantsAllowed Allows all participants to subscribe all tracks.\n   *  Takes precedence over [[participantTrackPermissions]] if set to true.\n   *  By default this is set to true.\n   * @param participantTrackPermissions Full list of individual permissions per\n   *  participant/track. Any omitted participants will not receive any permissions.\n   */\n  setTrackSubscriptionPermissions(\n    allParticipantsAllowed: boolean,\n    participantTrackPermissions: ParticipantTrackPermission[] = [],\n  ) {\n    this.participantTrackPermissions = participantTrackPermissions;\n    this.allParticipantsAllowedToSubscribe = allParticipantsAllowed;\n    if (!this.engine.client.isDisconnected) {\n      this.updateTrackSubscriptionPermissions();\n    }\n  }\n\n  private handleIncomingRpcAck(requestId: string) {\n    const handler = this.pendingAcks.get(requestId);\n    if (handler) {\n      handler.resolve();\n      this.pendingAcks.delete(requestId);\n    } else {\n      console.error('Ack received for unexpected RPC request', requestId);\n    }\n  }\n\n  private handleIncomingRpcResponse(\n    requestId: string,\n    payload: string | null,\n    error: RpcError | null,\n  ) {\n    const handler = this.pendingResponses.get(requestId);\n    if (handler) {\n      handler.resolve(payload, error);\n      this.pendingResponses.delete(requestId);\n    } else {\n      console.error('Response received for unexpected RPC request', requestId);\n    }\n  }\n\n  /** @internal */\n  private async publishRpcRequest(\n    destinationIdentity: string,\n    requestId: string,\n    method: string,\n    payload: string,\n    responseTimeout: number,\n  ) {\n    const packet = new DataPacket({\n      destinationIdentities: [destinationIdentity],\n      kind: DataPacket_Kind.RELIABLE,\n      value: {\n        case: 'rpcRequest',\n        value: new RpcRequest({\n          id: requestId,\n          method,\n          payload,\n          responseTimeoutMs: responseTimeout,\n          version: 1,\n        }),\n      },\n    });\n\n    await this.engine.sendDataPacket(packet, DataPacket_Kind.RELIABLE);\n  }\n\n  /** @internal */\n  handleParticipantDisconnected(participantIdentity: string) {\n    for (const [id, { participantIdentity: pendingIdentity }] of this.pendingAcks) {\n      if (pendingIdentity === participantIdentity) {\n        this.pendingAcks.delete(id);\n      }\n    }\n\n    for (const [id, { participantIdentity: pendingIdentity, resolve }] of this.pendingResponses) {\n      if (pendingIdentity === participantIdentity) {\n        resolve(null, RpcError.builtIn('RECIPIENT_DISCONNECTED'));\n        this.pendingResponses.delete(id);\n      }\n    }\n  }\n\n  /** @internal */\n  setEnabledPublishCodecs(codecs: Codec[]) {\n    this.enabledPublishVideoCodecs = codecs.filter(\n      (c) =\u003e c.mime.split('/')[0].toLowerCase() === 'video',\n    );\n  }\n\n  /** @internal */\n  updateInfo(info: ParticipantInfo): boolean {\n    if (!super.updateInfo(info)) {\n      return false;\n    }\n\n    // reconcile track mute status.\n    // if server's track mute status doesn't match actual, we'll have to update\n    // the server's copy\n    info.tracks.forEach((ti) =\u003e {\n      const pub = this.trackPublications.get(ti.sid);\n\n      if (pub) {\n        const mutedOnServer = pub.isMuted || (pub.track?.isUpstreamPaused ?? false);\n        if (mutedOnServer !== ti.muted) {\n          this.log.debug('updating server mute state after reconcile', {\n            ...this.logContext,\n            ...getLogContextFromTrack(pub),\n            mutedOnServer,\n          });\n          this.engine.client.sendMuteTrack(ti.sid, mutedOnServer);\n        }\n      }\n    });\n    return true;\n  }\n\n  private updateTrackSubscriptionPermissions = () =\u003e {\n    this.log.debug('updating track subscription permissions', {\n      ...this.logContext,\n      allParticipantsAllowed: this.allParticipantsAllowedToSubscribe,\n      participantTrackPermissions: this.participantTrackPermissions,\n    });\n    this.engine.client.sendUpdateSubscriptionPermissions(\n      this.allParticipantsAllowedToSubscribe,\n      this.participantTrackPermissions.map((p) =\u003e trackPermissionToProto(p)),\n    );\n  };\n\n  /** @internal */\n  setActiveAgent(agent: RemoteParticipant | undefined) {\n    this.firstActiveAgent = agent;\n    if (agent \u0026\u0026 !this.firstActiveAgent) {\n      this.firstActiveAgent = agent;\n    }\n    if (agent) {\n      this.activeAgentFuture?.resolve?.(agent);\n    } else {\n      this.activeAgentFuture?.reject?.('Agent disconnected');\n    }\n    this.activeAgentFuture = undefined;\n  }\n\n  private waitUntilActiveAgentPresent() {\n    if (this.firstActiveAgent) {\n      return Promise.resolve(this.firstActiveAgent);\n    }\n    if (!this.activeAgentFuture) {\n      this.activeAgentFuture = new Future\u003cRemoteParticipant\u003e();\n    }\n    return this.activeAgentFuture.promise;\n  }\n\n  /** @internal */\n  private onTrackUnmuted = (track: LocalTrack) =\u003e {\n    this.onTrackMuted(track, track.isUpstreamPaused);\n  };\n\n  // when the local track changes in mute status, we'll notify server as such\n  /** @internal */\n  private onTrackMuted = (track: LocalTrack, muted?: boolean) =\u003e {\n    if (muted === undefined) {\n      muted = true;\n    }\n\n    if (!track.sid) {\n      this.log.error('could not update mute status for unpublished track', {\n        ...this.logContext,\n        ...getLogContextFromTrack(track),\n      });\n      return;\n    }\n\n    this.engine.updateMuteStatus(track.sid, muted);\n  };\n\n  private onTrackUpstreamPaused = (track: LocalTrack) =\u003e {\n    this.log.debug('upstream paused', {\n      ...this.logContext,\n      ...getLogContextFromTrack(track),\n    });\n    this.onTrackMuted(track, true);\n  };\n\n  private onTrackUpstreamResumed = (track: LocalTrack) =\u003e {\n    this.log.debug('upstream resumed', {\n      ...this.logContext,\n      ...getLogContextFromTrack(track),\n    });\n    this.onTrackMuted(track, track.isMuted);\n  };\n\n  private onTrackFeatureUpdate = (track: LocalAudioTrack) =\u003e {\n    const pub = this.audioTrackPublications.get(track.sid!);\n    if (!pub) {\n      this.log.warn(\n        `Could not update local audio track settings, missing publication for track ${track.sid}`,\n        this.logContext,\n      );\n      return;\n    }\n    this.engine.client.sendUpdateLocalAudioTrack(pub.trackSid, pub.getTrackFeatures());\n  };\n\n  private onTrackCpuConstrained = (track: LocalVideoTrack, publication: LocalTrackPublication) =\u003e {\n    this.log.debug('track cpu constrained', {\n      ...this.logContext,\n      ...getLogContextFromTrack(publication),\n    });\n    this.emit(ParticipantEvent.LocalTrackCpuConstrained, track, publication);\n  };\n\n  private handleSubscribedQualityUpdate = async (update: SubscribedQualityUpdate) =\u003e {\n    if (!this.roomOptions?.dynacast) {\n      return;\n    }\n    const pub = this.videoTrackPublications.get(update.trackSid);\n    if (!pub) {\n      this.log.warn('received subscribed quality update for unknown track', {\n        ...this.logContext,\n        trackSid: update.trackSid,\n      });\n      return;\n    }\n    if (!pub.videoTrack) {\n      return;\n    }\n    const newCodecs = await pub.videoTrack.setPublishingCodecs(update.subscribedCodecs);\n    for await (const codec of newCodecs) {\n      if (isBackupCodec(codec)) {\n        this.log.debug(`publish ${codec} for ${pub.videoTrack.sid}`, {\n          ...this.logContext,\n          ...getLogContextFromTrack(pub),\n        });\n        await this.publishAdditionalCodecForTrack(pub.videoTrack, codec, pub.options);\n      }\n    }\n  };\n\n  private handleLocalTrackUnpublished = (unpublished: TrackUnpublishedResponse) =\u003e {\n    const track = this.trackPublications.get(unpublished.trackSid);\n    if (!track) {\n      this.log.warn('received unpublished event for unknown track', {\n        ...this.logContext,\n        trackSid: unpublished.trackSid,\n      });\n      return;\n    }\n    this.unpublishTrack(track.track!);\n  };\n\n  private handleTrackEnded = async (track: LocalTrack) =\u003e {\n    if (\n      track.source === Track.Source.ScreenShare ||\n      track.source === Track.Source.ScreenShareAudio\n    ) {\n      this.log.debug('unpublishing local track due to TrackEnded', {\n        ...this.logContext,\n        ...getLogContextFromTrack(track),\n      });\n      this.unpublishTrack(track);\n    } else if (track.isUserProvided) {\n      await track.mute();\n    } else if (isLocalAudioTrack(track) || isLocalVideoTrack(track)) {\n      try {\n        if (isWeb()) {\n          try {\n            const currentPermissions = await navigator?.permissions.query({\n              // the permission query for camera and microphone currently not supported in Safari and Firefox\n              // @ts-ignore\n              name: track.source === Track.Source.Camera ? 'camera' : 'microphone',\n            });\n            if (currentPermissions \u0026\u0026 currentPermissions.state === 'denied') {\n              this.log.warn(`user has revoked access to ${track.source}`, {\n                ...this.logContext,\n                ...getLogContextFromTrack(track),\n              });\n\n              // detect granted change after permissions were denied to try and resume then\n              currentPermissions.onchange = () =\u003e {\n                if (currentPermissions.state !== 'denied') {\n                  if (!track.isMuted) {\n                    track.restartTrack();\n                  }\n                  currentPermissions.onchange = null;\n                }\n              };\n              throw new Error('GetUserMedia Permission denied');\n            }\n          } catch (e: any) {\n            // permissions query fails for firefox, we continue and try to restart the track\n          }\n        }\n        if (!track.isMuted) {\n          this.log.debug('track ended, attempting to use a different device', {\n            ...this.logContext,\n            ...getLogContextFromTrack(track),\n          });\n          if (isLocalAudioTrack(track)) {\n            // fall back to default device if available\n            await track.restartTrack({ deviceId: 'default' });\n          } else {\n            await track.restartTrack();\n          }\n        }\n      } catch (e) {\n        this.log.warn(`could not restart track, muting instead`, {\n          ...this.logContext,\n          ...getLogContextFromTrack(track),\n        });\n        await track.mute();\n      }\n    }\n  };\n\n  private getPublicationForTrack(\n    track: LocalTrack | MediaStreamTrack,\n  ): LocalTrackPublication | undefined {\n    let publication: LocalTrackPublication | undefined;\n    this.trackPublications.forEach((pub) =\u003e {\n      const localTrack = pub.track;\n      if (!localTrack) {\n        return;\n      }\n\n      // this looks overly complicated due to this object tree\n      if (track instanceof MediaStreamTrack) {\n        if (isLocalAudioTrack(localTrack) || isLocalVideoTrack(localTrack)) {\n          if (localTrack.mediaStreamTrack === track) {\n            publication = \u003cLocalTrackPublication\u003epub;\n          }\n        }\n      } else if (track === localTrack) {\n        publication = \u003cLocalTrackPublication\u003epub;\n      }\n    });\n    return publication;\n  }\n\n  private async waitForPendingPublicationOfSource(source: Track.Source) {\n    const waitForPendingTimeout = 10_000;\n    const startTime = Date.now();\n\n    while (Date.now() \u003c startTime + waitForPendingTimeout) {\n      const publishPromiseEntry = Array.from(this.pendingPublishPromises.entries()).find(\n        ([pendingTrack]) =\u003e pendingTrack.source === source,\n      );\n      if (publishPromiseEntry) {\n        return publishPromiseEntry[1];\n      }\n      await sleep(20);\n    }\n  }\n}\n","import {\n  ParticipantTracks,\n  SubscriptionError,\n  TrackInfo,\n  UpdateSubscription,\n  UpdateTrackSettings,\n} from '@livekit/protocol';\nimport { TrackEvent } from '../events';\nimport type { LoggerOptions } from '../types';\nimport { isRemoteVideoTrack } from '../utils';\nimport type RemoteTrack from './RemoteTrack';\nimport { Track, VideoQuality } from './Track';\nimport { TrackPublication } from './TrackPublication';\nimport { areDimensionsSmaller, layerDimensionsFor } from './utils';\n\nexport default class RemoteTrackPublication extends TrackPublication {\n  track?: RemoteTrack = undefined;\n\n  /** @internal */\n  protected allowed = true;\n\n  // keeps track of client's desire to subscribe to a track, also true if autoSubscribe is active\n  protected subscribed?: boolean;\n\n  protected requestedDisabled: boolean | undefined = undefined;\n\n  protected visible: boolean = true;\n\n  protected videoDimensionsAdaptiveStream?: Track.Dimensions;\n\n  protected requestedVideoDimensions?: Track.Dimensions;\n\n  protected requestedMaxQuality?: VideoQuality;\n\n  protected fps?: number;\n\n  protected subscriptionError?: SubscriptionError;\n\n  constructor(\n    kind: Track.Kind,\n    ti: TrackInfo,\n    autoSubscribe: boolean | undefined,\n    loggerOptions?: LoggerOptions,\n  ) {\n    super(kind, ti.sid, ti.name, loggerOptions);\n    this.subscribed = autoSubscribe;\n    this.updateInfo(ti);\n  }\n\n  /**\n   * Subscribe or unsubscribe to this remote track\n   * @param subscribed true to subscribe to a track, false to unsubscribe\n   */\n  setSubscribed(subscribed: boolean) {\n    const prevStatus = this.subscriptionStatus;\n    const prevPermission = this.permissionStatus;\n    this.subscribed = subscribed;\n    // reset allowed status when desired subscription state changes\n    // server will notify client via signal message if it's not allowed\n    if (subscribed) {\n      this.allowed = true;\n    }\n\n    const sub = new UpdateSubscription({\n      trackSids: [this.trackSid],\n      subscribe: this.subscribed,\n      participantTracks: [\n        new ParticipantTracks({\n          // sending an empty participant id since TrackPublication doesn't keep it\n          // this is filled in by the participant that receives this message\n          participantSid: '',\n          trackSids: [this.trackSid],\n        }),\n      ],\n    });\n    this.emit(TrackEvent.UpdateSubscription, sub);\n    this.emitSubscriptionUpdateIfChanged(prevStatus);\n    this.emitPermissionUpdateIfChanged(prevPermission);\n  }\n\n  get subscriptionStatus(): TrackPublication.SubscriptionStatus {\n    if (this.subscribed === false) {\n      return TrackPublication.SubscriptionStatus.Unsubscribed;\n    }\n    if (!super.isSubscribed) {\n      return TrackPublication.SubscriptionStatus.Desired;\n    }\n    return TrackPublication.SubscriptionStatus.Subscribed;\n  }\n\n  get permissionStatus(): TrackPublication.PermissionStatus {\n    return this.allowed\n      ? TrackPublication.PermissionStatus.Allowed\n      : TrackPublication.PermissionStatus.NotAllowed;\n  }\n\n  /**\n   * Returns true if track is subscribed, and ready for playback\n   */\n  get isSubscribed(): boolean {\n    if (this.subscribed === false) {\n      return false;\n    }\n    return super.isSubscribed;\n  }\n\n  // returns client's desire to subscribe to a track, also true if autoSubscribe is enabled\n  get isDesired(): boolean {\n    return this.subscribed !== false;\n  }\n\n  get isEnabled(): boolean {\n    return this.requestedDisabled !== undefined\n      ? !this.requestedDisabled\n      : this.isAdaptiveStream\n        ? this.visible\n        : true;\n  }\n\n  get isLocal() {\n    return false;\n  }\n\n  /**\n   * disable server from sending down data for this track. this is useful when\n   * the participant is off screen, you may disable streaming down their video\n   * to reduce bandwidth requirements\n   * @param enabled\n   */\n  setEnabled(enabled: boolean) {\n    if (!this.isManualOperationAllowed() || this.requestedDisabled === !enabled) {\n      return;\n    }\n    this.requestedDisabled = !enabled;\n\n    this.emitTrackUpdate();\n  }\n\n  /**\n   * for tracks that support simulcasting, adjust subscribed quality\n   *\n   * This indicates the highest quality the client can accept. if network\n   * bandwidth does not allow, server will automatically reduce quality to\n   * optimize for uninterrupted video\n   */\n  setVideoQuality(quality: VideoQuality) {\n    if (!this.isManualOperationAllowed() || this.requestedMaxQuality === quality) {\n      return;\n    }\n    this.requestedMaxQuality = quality;\n    this.requestedVideoDimensions = undefined;\n\n    this.emitTrackUpdate();\n  }\n\n  /**\n   * Explicitly set the video dimensions for this track.\n   *\n   * This will take precedence over adaptive stream dimensions.\n   *\n   * @param dimensions The video dimensions to set.\n   */\n  setVideoDimensions(dimensions: Track.Dimensions) {\n    if (!this.isManualOperationAllowed()) {\n      return;\n    }\n    if (\n      this.requestedVideoDimensions?.width === dimensions.width \u0026\u0026\n      this.requestedVideoDimensions?.height === dimensions.height\n    ) {\n      return;\n    }\n    if (isRemoteVideoTrack(this.track)) {\n      this.requestedVideoDimensions = dimensions;\n    }\n    this.requestedMaxQuality = undefined;\n\n    this.emitTrackUpdate();\n  }\n\n  setVideoFPS(fps: number) {\n    if (!this.isManualOperationAllowed()) {\n      return;\n    }\n\n    if (!isRemoteVideoTrack(this.track)) {\n      return;\n    }\n\n    if (this.fps === fps) {\n      return;\n    }\n\n    this.fps = fps;\n    this.emitTrackUpdate();\n  }\n\n  get videoQuality(): VideoQuality | undefined {\n    return this.requestedMaxQuality ?? VideoQuality.HIGH;\n  }\n\n  /** @internal */\n  setTrack(track?: RemoteTrack) {\n    const prevStatus = this.subscriptionStatus;\n    const prevPermission = this.permissionStatus;\n    const prevTrack = this.track;\n    if (prevTrack === track) {\n      return;\n    }\n    if (prevTrack) {\n      // unregister listener\n      prevTrack.off(TrackEvent.VideoDimensionsChanged, this.handleVideoDimensionsChange);\n      prevTrack.off(TrackEvent.VisibilityChanged, this.handleVisibilityChange);\n      prevTrack.off(TrackEvent.Ended, this.handleEnded);\n      prevTrack.detach();\n      prevTrack.stopMonitor();\n      this.emit(TrackEvent.Unsubscribed, prevTrack);\n    }\n    super.setTrack(track);\n    if (track) {\n      track.sid = this.trackSid;\n      track.on(TrackEvent.VideoDimensionsChanged, this.handleVideoDimensionsChange);\n      track.on(TrackEvent.VisibilityChanged, this.handleVisibilityChange);\n      track.on(TrackEvent.Ended, this.handleEnded);\n      this.emit(TrackEvent.Subscribed, track);\n    }\n    this.emitPermissionUpdateIfChanged(prevPermission);\n    this.emitSubscriptionUpdateIfChanged(prevStatus);\n  }\n\n  /** @internal */\n  setAllowed(allowed: boolean) {\n    const prevStatus = this.subscriptionStatus;\n    const prevPermission = this.permissionStatus;\n    this.allowed = allowed;\n    this.emitPermissionUpdateIfChanged(prevPermission);\n    this.emitSubscriptionUpdateIfChanged(prevStatus);\n  }\n\n  /** @internal */\n  setSubscriptionError(error: SubscriptionError) {\n    this.emit(TrackEvent.SubscriptionFailed, error);\n  }\n\n  /** @internal */\n  updateInfo(info: TrackInfo) {\n    super.updateInfo(info);\n    const prevMetadataMuted = this.metadataMuted;\n    this.metadataMuted = info.muted;\n    if (this.track) {\n      this.track.setMuted(info.muted);\n    } else if (prevMetadataMuted !== info.muted) {\n      this.emit(info.muted ? TrackEvent.Muted : TrackEvent.Unmuted);\n    }\n  }\n\n  private emitSubscriptionUpdateIfChanged(previousStatus: TrackPublication.SubscriptionStatus) {\n    const currentStatus = this.subscriptionStatus;\n    if (previousStatus === currentStatus) {\n      return;\n    }\n    this.emit(TrackEvent.SubscriptionStatusChanged, currentStatus, previousStatus);\n  }\n\n  private emitPermissionUpdateIfChanged(\n    previousPermissionStatus: TrackPublication.PermissionStatus,\n  ) {\n    const currentPermissionStatus = this.permissionStatus;\n    if (currentPermissionStatus !== previousPermissionStatus) {\n      this.emit(\n        TrackEvent.SubscriptionPermissionChanged,\n        this.permissionStatus,\n        previousPermissionStatus,\n      );\n    }\n  }\n\n  private isManualOperationAllowed(): boolean {\n    if (!this.isDesired) {\n      this.log.warn('cannot update track settings when not subscribed', this.logContext);\n      return false;\n    }\n    return true;\n  }\n\n  protected handleEnded = (track: RemoteTrack) =\u003e {\n    this.setTrack(undefined);\n    this.emit(TrackEvent.Ended, track);\n  };\n\n  protected get isAdaptiveStream(): boolean {\n    return isRemoteVideoTrack(this.track) \u0026\u0026 this.track.isAdaptiveStream;\n  }\n\n  protected handleVisibilityChange = (visible: boolean) =\u003e {\n    this.log.debug(\n      `adaptivestream video visibility ${this.trackSid}, visible=${visible}`,\n      this.logContext,\n    );\n    this.visible = visible;\n    this.emitTrackUpdate();\n  };\n\n  protected handleVideoDimensionsChange = (dimensions: Track.Dimensions) =\u003e {\n    this.log.debug(\n      `adaptivestream video dimensions ${dimensions.width}x${dimensions.height}`,\n      this.logContext,\n    );\n    this.videoDimensionsAdaptiveStream = dimensions;\n    this.emitTrackUpdate();\n  };\n\n  /* @internal */\n  emitTrackUpdate() {\n    const settings: UpdateTrackSettings = new UpdateTrackSettings({\n      trackSids: [this.trackSid],\n      disabled: !this.isEnabled,\n      fps: this.fps,\n    });\n\n    if (this.kind === Track.Kind.Video) {\n      let minDimensions = this.requestedVideoDimensions;\n\n      if (this.videoDimensionsAdaptiveStream !== undefined) {\n        if (minDimensions) {\n          // check whether the adaptive stream dimensions are smaller than the requested dimensions and use smaller one\n          const smallerAdaptive = areDimensionsSmaller(\n            this.videoDimensionsAdaptiveStream,\n            minDimensions,\n          );\n          if (smallerAdaptive) {\n            this.log.debug('using adaptive stream dimensions instead of requested', {\n              ...this.logContext,\n              ...this.videoDimensionsAdaptiveStream,\n            });\n            minDimensions = this.videoDimensionsAdaptiveStream;\n          }\n        } else if (this.requestedMaxQuality !== undefined \u0026\u0026 this.trackInfo) {\n          // check whether adaptive stream dimensions are smaller than the max quality layer and use smaller one\n          const maxQualityLayer = layerDimensionsFor(this.trackInfo, this.requestedMaxQuality);\n\n          if (\n            maxQualityLayer \u0026\u0026\n            areDimensionsSmaller(this.videoDimensionsAdaptiveStream, maxQualityLayer)\n          ) {\n            this.log.debug('using adaptive stream dimensions instead of max quality layer', {\n              ...this.logContext,\n              ...this.videoDimensionsAdaptiveStream,\n            });\n            minDimensions = this.videoDimensionsAdaptiveStream;\n          }\n        } else {\n          this.log.debug('using adaptive stream dimensions', {\n            ...this.logContext,\n            ...this.videoDimensionsAdaptiveStream,\n          });\n          minDimensions = this.videoDimensionsAdaptiveStream;\n        }\n      }\n\n      if (minDimensions) {\n        settings.width = Math.ceil(minDimensions.width);\n        settings.height = Math.ceil(minDimensions.height);\n      } else if (this.requestedMaxQuality !== undefined) {\n        this.log.debug('using requested max quality', {\n          ...this.logContext,\n          quality: this.requestedMaxQuality,\n        });\n        settings.quality = this.requestedMaxQuality;\n      } else {\n        this.log.debug('using default quality', {\n          ...this.logContext,\n          quality: VideoQuality.HIGH,\n        });\n        // defaults to high quality\n        settings.quality = VideoQuality.HIGH;\n      }\n    }\n\n    this.emit(TrackEvent.UpdateSettings, settings);\n  }\n}\n","import type {\n  ParticipantInfo,\n  SubscriptionError,\n  UpdateSubscription,\n  UpdateTrackSettings,\n} from '@livekit/protocol';\nimport type { SignalClient } from '../../api/SignalClient';\nimport { ParticipantEvent, TrackEvent } from '../events';\nimport RemoteAudioTrack from '../track/RemoteAudioTrack';\nimport type RemoteTrack from '../track/RemoteTrack';\nimport RemoteTrackPublication from '../track/RemoteTrackPublication';\nimport RemoteVideoTrack from '../track/RemoteVideoTrack';\nimport { Track } from '../track/Track';\nimport type { TrackPublication } from '../track/TrackPublication';\nimport type { AudioOutputOptions } from '../track/options';\nimport type { AdaptiveStreamSettings } from '../track/types';\nimport { getLogContextFromTrack } from '../track/utils';\nimport type { LoggerOptions } from '../types';\nimport { isAudioTrack, isRemoteTrack } from '../utils';\nimport Participant, { ParticipantKind } from './Participant';\nimport type { ParticipantEventCallbacks } from './Participant';\n\nexport default class RemoteParticipant extends Participant {\n  audioTrackPublications: Map\u003cstring, RemoteTrackPublication\u003e;\n\n  videoTrackPublications: Map\u003cstring, RemoteTrackPublication\u003e;\n\n  trackPublications: Map\u003cstring, RemoteTrackPublication\u003e;\n\n  signalClient: SignalClient;\n\n  private volumeMap: Map\u003cTrack.Source, number\u003e;\n\n  private audioOutput?: AudioOutputOptions;\n\n  /** @internal */\n  static fromParticipantInfo(\n    signalClient: SignalClient,\n    pi: ParticipantInfo,\n    loggerOptions: LoggerOptions,\n  ): RemoteParticipant {\n    return new RemoteParticipant(\n      signalClient,\n      pi.sid,\n      pi.identity,\n      pi.name,\n      pi.metadata,\n      pi.attributes,\n      loggerOptions,\n      pi.kind,\n    );\n  }\n\n  protected get logContext() {\n    return {\n      ...super.logContext,\n      rpID: this.sid,\n      remoteParticipant: this.identity,\n    };\n  }\n\n  /** @internal */\n  constructor(\n    signalClient: SignalClient,\n    sid: string,\n    identity?: string,\n    name?: string,\n    metadata?: string,\n    attributes?: Record\u003cstring, string\u003e,\n    loggerOptions?: LoggerOptions,\n    kind: ParticipantKind = ParticipantKind.STANDARD,\n  ) {\n    super(sid, identity || '', name, metadata, attributes, loggerOptions, kind);\n    this.signalClient = signalClient;\n    this.trackPublications = new Map();\n    this.audioTrackPublications = new Map();\n    this.videoTrackPublications = new Map();\n    this.volumeMap = new Map();\n  }\n\n  protected addTrackPublication(publication: RemoteTrackPublication) {\n    super.addTrackPublication(publication);\n\n    // register action events\n    publication.on(TrackEvent.UpdateSettings, (settings: UpdateTrackSettings) =\u003e {\n      this.log.debug('send update settings', {\n        ...this.logContext,\n        ...getLogContextFromTrack(publication),\n        settings,\n      });\n      this.signalClient.sendUpdateTrackSettings(settings);\n    });\n    publication.on(TrackEvent.UpdateSubscription, (sub: UpdateSubscription) =\u003e {\n      sub.participantTracks.forEach((pt) =\u003e {\n        pt.participantSid = this.sid;\n      });\n      this.signalClient.sendUpdateSubscription(sub);\n    });\n    publication.on(\n      TrackEvent.SubscriptionPermissionChanged,\n      (status: TrackPublication.PermissionStatus) =\u003e {\n        this.emit(ParticipantEvent.TrackSubscriptionPermissionChanged, publication, status);\n      },\n    );\n    publication.on(\n      TrackEvent.SubscriptionStatusChanged,\n      (status: TrackPublication.SubscriptionStatus) =\u003e {\n        this.emit(ParticipantEvent.TrackSubscriptionStatusChanged, publication, status);\n      },\n    );\n    publication.on(TrackEvent.Subscribed, (track: RemoteTrack) =\u003e {\n      this.emit(ParticipantEvent.TrackSubscribed, track, publication);\n    });\n    publication.on(TrackEvent.Unsubscribed, (previousTrack: RemoteTrack) =\u003e {\n      this.emit(ParticipantEvent.TrackUnsubscribed, previousTrack, publication);\n    });\n    publication.on(TrackEvent.SubscriptionFailed, (error: SubscriptionError) =\u003e {\n      this.emit(ParticipantEvent.TrackSubscriptionFailed, publication.trackSid, error);\n    });\n  }\n\n  getTrackPublication(source: Track.Source): RemoteTrackPublication | undefined {\n    const track = super.getTrackPublication(source);\n    if (track) {\n      return track as RemoteTrackPublication;\n    }\n  }\n\n  getTrackPublicationByName(name: string): RemoteTrackPublication | undefined {\n    const track = super.getTrackPublicationByName(name);\n    if (track) {\n      return track as RemoteTrackPublication;\n    }\n  }\n\n  /**\n   * sets the volume on the participant's audio track\n   * by default, this affects the microphone publication\n   * a different source can be passed in as a second argument\n   * if no track exists the volume will be applied when the microphone track is added\n   */\n  setVolume(\n    volume: number,\n    source: Track.Source.Microphone | Track.Source.ScreenShareAudio = Track.Source.Microphone,\n  ) {\n    this.volumeMap.set(source, volume);\n    const audioPublication = this.getTrackPublication(source);\n    if (audioPublication \u0026\u0026 audioPublication.track) {\n      (audioPublication.track as RemoteAudioTrack).setVolume(volume);\n    }\n  }\n\n  /**\n   * gets the volume on the participant's microphone track\n   */\n  getVolume(\n    source: Track.Source.Microphone | Track.Source.ScreenShareAudio = Track.Source.Microphone,\n  ) {\n    const audioPublication = this.getTrackPublication(source);\n    if (audioPublication \u0026\u0026 audioPublication.track) {\n      return (audioPublication.track as RemoteAudioTrack).getVolume();\n    }\n    return this.volumeMap.get(source);\n  }\n\n  /** @internal */\n  addSubscribedMediaTrack(\n    mediaTrack: MediaStreamTrack,\n    sid: Track.SID,\n    mediaStream: MediaStream,\n    receiver: RTCRtpReceiver,\n    adaptiveStreamSettings?: AdaptiveStreamSettings,\n    triesLeft?: number,\n  ) {\n    // find the track publication\n    // it's possible for the media track to arrive before participant info\n    let publication = this.getTrackPublicationBySid(sid);\n\n    // it's also possible that the browser didn't honor our original track id\n    // FireFox would use its own local uuid instead of server track id\n    if (!publication) {\n      if (!sid.startsWith('TR')) {\n        // find the first track that matches type\n        this.trackPublications.forEach((p) =\u003e {\n          if (!publication \u0026\u0026 mediaTrack.kind === p.kind.toString()) {\n            publication = p;\n          }\n        });\n      }\n    }\n\n    // when we couldn't locate the track, it's possible that the metadata hasn't\n    // yet arrived. Wait a bit longer for it to arrive, or fire an error\n    if (!publication) {\n      if (triesLeft === 0) {\n        this.log.error('could not find published track', {\n          ...this.logContext,\n          trackSid: sid,\n        });\n        this.emit(ParticipantEvent.TrackSubscriptionFailed, sid);\n        return;\n      }\n\n      if (triesLeft === undefined) triesLeft = 20;\n      setTimeout(() =\u003e {\n        this.addSubscribedMediaTrack(\n          mediaTrack,\n          sid,\n          mediaStream,\n          receiver,\n          adaptiveStreamSettings,\n          triesLeft! - 1,\n        );\n      }, 150);\n      return;\n    }\n\n    if (mediaTrack.readyState === 'ended') {\n      this.log.error(\n        'unable to subscribe because MediaStreamTrack is ended. Do not call MediaStreamTrack.stop()',\n        { ...this.logContext, ...getLogContextFromTrack(publication) },\n      );\n      this.emit(ParticipantEvent.TrackSubscriptionFailed, sid);\n      return;\n    }\n\n    const isVideo = mediaTrack.kind === 'video';\n    let track: RemoteTrack;\n    if (isVideo) {\n      track = new RemoteVideoTrack(mediaTrack, sid, receiver, adaptiveStreamSettings);\n    } else {\n      track = new RemoteAudioTrack(mediaTrack, sid, receiver, this.audioContext, this.audioOutput);\n    }\n\n    // set track info\n    track.source = publication.source;\n    // keep publication's muted status\n    track.isMuted = publication.isMuted;\n    track.setMediaStream(mediaStream);\n    track.start();\n\n    publication.setTrack(track);\n    // set participant volumes on new audio tracks\n    if (this.volumeMap.has(publication.source) \u0026\u0026 isRemoteTrack(track) \u0026\u0026 isAudioTrack(track)) {\n      track.setVolume(this.volumeMap.get(publication.source)!);\n    }\n\n    return publication;\n  }\n\n  /** @internal */\n  get hasMetadata(): boolean {\n    return !!this.participantInfo;\n  }\n\n  /**\n   * @internal\n   */\n  getTrackPublicationBySid(sid: Track.SID): RemoteTrackPublication | undefined {\n    return this.trackPublications.get(sid);\n  }\n\n  /** @internal */\n  updateInfo(info: ParticipantInfo): boolean {\n    if (!super.updateInfo(info)) {\n      return false;\n    }\n\n    // we are getting a list of all available tracks, reconcile in here\n    // and send out events for changes\n\n    // reconcile track publications, publish events only if metadata is already there\n    // i.e. changes since the local participant has joined\n    const validTracks = new Map\u003cstring, RemoteTrackPublication\u003e();\n    const newTracks = new Map\u003cstring, RemoteTrackPublication\u003e();\n\n    info.tracks.forEach((ti) =\u003e {\n      let publication = this.getTrackPublicationBySid(ti.sid);\n      if (!publication) {\n        // new publication\n        const kind = Track.kindFromProto(ti.type);\n        if (!kind) {\n          return;\n        }\n        publication = new RemoteTrackPublication(\n          kind,\n          ti,\n          this.signalClient.connectOptions?.autoSubscribe,\n          { loggerContextCb: () =\u003e this.logContext, loggerName: this.loggerOptions?.loggerName },\n        );\n        publication.updateInfo(ti);\n        newTracks.set(ti.sid, publication);\n        const existingTrackOfSource = Array.from(this.trackPublications.values()).find(\n          (publishedTrack) =\u003e publishedTrack.source === publication?.source,\n        );\n        if (existingTrackOfSource \u0026\u0026 publication.source !== Track.Source.Unknown) {\n          this.log.debug(\n            `received a second track publication for ${this.identity} with the same source: ${publication.source}`,\n            {\n              ...this.logContext,\n              oldTrack: getLogContextFromTrack(existingTrackOfSource),\n              newTrack: getLogContextFromTrack(publication),\n            },\n          );\n        }\n        this.addTrackPublication(publication);\n      } else {\n        publication.updateInfo(ti);\n      }\n      validTracks.set(ti.sid, publication);\n    });\n\n    // detect removed tracks\n    this.trackPublications.forEach((publication) =\u003e {\n      if (!validTracks.has(publication.trackSid)) {\n        this.log.trace('detected removed track on remote participant, unpublishing', {\n          ...this.logContext,\n          ...getLogContextFromTrack(publication),\n        });\n        this.unpublishTrack(publication.trackSid, true);\n      }\n    });\n\n    // always emit events for new publications, Room will not forward them unless it's ready\n    newTracks.forEach((publication) =\u003e {\n      this.emit(ParticipantEvent.TrackPublished, publication);\n    });\n    return true;\n  }\n\n  /** @internal */\n  unpublishTrack(sid: Track.SID, sendUnpublish?: boolean) {\n    const publication = \u003cRemoteTrackPublication\u003ethis.trackPublications.get(sid);\n    if (!publication) {\n      return;\n    }\n\n    // also send unsubscribe, if track is actively subscribed\n    const { track } = publication;\n    if (track) {\n      track.stop();\n      publication.setTrack(undefined);\n    }\n\n    // remove track from maps only after unsubscribed has been fired\n    this.trackPublications.delete(sid);\n\n    // remove from the right type map\n    switch (publication.kind) {\n      case Track.Kind.Audio:\n        this.audioTrackPublications.delete(sid);\n        break;\n      case Track.Kind.Video:\n        this.videoTrackPublications.delete(sid);\n        break;\n      default:\n        break;\n    }\n\n    if (sendUnpublish) {\n      this.emit(ParticipantEvent.TrackUnpublished, publication);\n    }\n  }\n\n  /**\n   * @internal\n   */\n  async setAudioOutput(output: AudioOutputOptions) {\n    this.audioOutput = output;\n    const promises: Promise\u003cvoid\u003e[] = [];\n    this.audioTrackPublications.forEach((pub) =\u003e {\n      if (isAudioTrack(pub.track) \u0026\u0026 isRemoteTrack(pub.track)) {\n        promises.push(pub.track.setSinkId(output.deviceId ?? 'default'));\n      }\n    });\n    await Promise.all(promises);\n  }\n\n  /** @internal */\n  emit\u003cE extends keyof ParticipantEventCallbacks\u003e(\n    event: E,\n    ...args: Parameters\u003cParticipantEventCallbacks[E]\u003e\n  ): boolean {\n    this.log.trace('participant event', { ...this.logContext, event, args });\n    return super.emit(event, ...args);\n  }\n}\n","import { Mutex } from '@livekit/mutex';\nimport {\n  ChatMessage as ChatMessageModel,\n  ConnectionQualityUpdate,\n  type DataPacket,\n  DataPacket_Kind,\n  DisconnectReason,\n  JoinResponse,\n  LeaveRequest,\n  LeaveRequest_Action,\n  MetricsBatch,\n  ParticipantInfo,\n  ParticipantInfo_State,\n  ParticipantPermission,\n  Room as RoomModel,\n  ServerInfo,\n  SimulateScenario,\n  SipDTMF,\n  SpeakerInfo,\n  StreamStateUpdate,\n  SubscriptionError,\n  SubscriptionPermissionUpdate,\n  SubscriptionResponse,\n  TrackInfo,\n  TrackSource,\n  TrackType,\n  Transcription as TranscriptionModel,\n  TranscriptionSegment as TranscriptionSegmentModel,\n  UserPacket,\n  protoInt64,\n} from '@livekit/protocol';\nimport { EventEmitter } from 'events';\nimport type TypedEmitter from 'typed-emitter';\nimport 'webrtc-adapter';\nimport { EncryptionEvent } from '../e2ee';\nimport { type BaseE2EEManager, E2EEManager } from '../e2ee/E2eeManager';\nimport log, { LoggerNames, getLogger } from '../logger';\nimport type {\n  InternalRoomConnectOptions,\n  InternalRoomOptions,\n  RoomConnectOptions,\n  RoomOptions,\n} from '../options';\nimport { getBrowser } from '../utils/browserParser';\nimport DeviceManager from './DeviceManager';\nimport RTCEngine from './RTCEngine';\nimport { RegionUrlProvider } from './RegionUrlProvider';\nimport IncomingDataStreamManager from './data-stream/incoming/IncomingDataStreamManager';\nimport {\n  type ByteStreamHandler,\n  type TextStreamHandler,\n} from './data-stream/incoming/StreamReader';\nimport OutgoingDataStreamManager from './data-stream/outgoing/OutgoingDataStreamManager';\nimport {\n  audioDefaults,\n  publishDefaults,\n  roomConnectOptionDefaults,\n  roomOptionDefaults,\n  videoDefaults,\n} from './defaults';\nimport { ConnectionError, ConnectionErrorReason, UnsupportedServer } from './errors';\nimport { EngineEvent, ParticipantEvent, RoomEvent, TrackEvent } from './events';\nimport LocalParticipant from './participant/LocalParticipant';\nimport type Participant from './participant/Participant';\nimport { type ConnectionQuality, ParticipantKind } from './participant/Participant';\nimport RemoteParticipant from './participant/RemoteParticipant';\nimport { MAX_PAYLOAD_BYTES, RpcError, type RpcInvocationData, byteLength } from './rpc';\nimport CriticalTimers from './timers';\nimport LocalAudioTrack from './track/LocalAudioTrack';\nimport type LocalTrack from './track/LocalTrack';\nimport LocalTrackPublication from './track/LocalTrackPublication';\nimport LocalVideoTrack from './track/LocalVideoTrack';\nimport type RemoteTrack from './track/RemoteTrack';\nimport RemoteTrackPublication from './track/RemoteTrackPublication';\nimport { Track } from './track/Track';\nimport type { TrackPublication } from './track/TrackPublication';\nimport type { TrackProcessor } from './track/processor/types';\nimport type { AdaptiveStreamSettings } from './track/types';\nimport { getNewAudioContext, kindToSource, sourceToKind } from './track/utils';\nimport {\n  type ChatMessage,\n  type SimulationOptions,\n  type SimulationScenario,\n  type TranscriptionSegment,\n} from './types';\nimport {\n  Future,\n  createDummyVideoStreamTrack,\n  extractChatMessage,\n  extractTranscriptionSegments,\n  getDisconnectReasonFromConnectionError,\n  getEmptyAudioStreamTrack,\n  isBrowserSupported,\n  isCloud,\n  isLocalAudioTrack,\n  isLocalParticipant,\n  isReactNative,\n  isRemotePub,\n  isSafariBased,\n  isWeb,\n  numberToBigInt,\n  sleep,\n  supportsSetSinkId,\n  toHttpUrl,\n  unpackStreamId,\n  unwrapConstraint,\n} from './utils';\n\nexport enum ConnectionState {\n  Disconnected = 'disconnected',\n  Connecting = 'connecting',\n  Connected = 'connected',\n  Reconnecting = 'reconnecting',\n  SignalReconnecting = 'signalReconnecting',\n}\n\nconst connectionReconcileFrequency = 4 * 1000;\n\n/**\n * In LiveKit, a room is the logical grouping for a list of participants.\n * Participants in a room can publish tracks, and subscribe to others' tracks.\n *\n * a Room fires [[RoomEvent | RoomEvents]].\n *\n * @noInheritDoc\n */\nclass Room extends (EventEmitter as new () =\u003e TypedEmitter\u003cRoomEventCallbacks\u003e) {\n  state: ConnectionState = ConnectionState.Disconnected;\n\n  /**\n   * map of identity: [[RemoteParticipant]]\n   */\n  remoteParticipants: Map\u003cstring, RemoteParticipant\u003e;\n\n  /**\n   * list of participants that are actively speaking. when this changes\n   * a [[RoomEvent.ActiveSpeakersChanged]] event is fired\n   */\n  activeSpeakers: Participant[] = [];\n\n  /** @internal */\n  engine!: RTCEngine;\n\n  /** the current participant */\n  localParticipant: LocalParticipant;\n\n  /** options of room */\n  options: InternalRoomOptions;\n\n  /** reflects the sender encryption status of the local participant */\n  isE2EEEnabled: boolean = false;\n\n  serverInfo?: Partial\u003cServerInfo\u003e;\n\n  private roomInfo?: RoomModel;\n\n  private sidToIdentity: Map\u003cstring, string\u003e;\n\n  /** connect options of room */\n  private connOptions?: InternalRoomConnectOptions;\n\n  private audioEnabled = true;\n\n  private audioContext?: AudioContext;\n\n  /** used for aborting pending connections to a LiveKit server */\n  private abortController?: AbortController;\n\n  /** future holding client initiated connection attempt */\n  private connectFuture?: Future\u003cvoid\u003e;\n\n  private disconnectLock: Mutex;\n\n  private e2eeManager: BaseE2EEManager | undefined;\n\n  private connectionReconcileInterval?: ReturnType\u003ctypeof setInterval\u003e;\n\n  private regionUrlProvider?: RegionUrlProvider;\n\n  private regionUrl?: string;\n\n  private isVideoPlaybackBlocked: boolean = false;\n\n  private log = log;\n\n  private bufferedEvents: Array\u003cany\u003e = [];\n\n  private isResuming: boolean = false;\n\n  /**\n   * map to store first point in time when a particular transcription segment was received\n   */\n  private transcriptionReceivedTimes: Map\u003cstring, number\u003e;\n\n  private incomingDataStreamManager: IncomingDataStreamManager;\n\n  private outgoingDataStreamManager: OutgoingDataStreamManager;\n\n  private rpcHandlers: Map\u003cstring, (data: RpcInvocationData) =\u003e Promise\u003cstring\u003e\u003e = new Map();\n\n  /**\n   * Creates a new Room, the primary construct for a LiveKit session.\n   * @param options\n   */\n  constructor(options?: RoomOptions) {\n    super();\n    this.setMaxListeners(100);\n    this.remoteParticipants = new Map();\n    this.sidToIdentity = new Map();\n    this.options = { ...roomOptionDefaults, ...options };\n\n    this.log = getLogger(this.options.loggerName ?? LoggerNames.Room);\n    this.transcriptionReceivedTimes = new Map();\n\n    this.options.audioCaptureDefaults = {\n      ...audioDefaults,\n      ...options?.audioCaptureDefaults,\n    };\n    this.options.videoCaptureDefaults = {\n      ...videoDefaults,\n      ...options?.videoCaptureDefaults,\n    };\n    this.options.publishDefaults = {\n      ...publishDefaults,\n      ...options?.publishDefaults,\n    };\n\n    this.maybeCreateEngine();\n\n    this.incomingDataStreamManager = new IncomingDataStreamManager();\n    this.outgoingDataStreamManager = new OutgoingDataStreamManager(this.engine, this.log);\n\n    this.disconnectLock = new Mutex();\n\n    this.localParticipant = new LocalParticipant(\n      '',\n      '',\n      this.engine,\n      this.options,\n      this.rpcHandlers,\n      this.outgoingDataStreamManager,\n    );\n\n    if (this.options.videoCaptureDefaults.deviceId) {\n      this.localParticipant.activeDeviceMap.set(\n        'videoinput',\n        unwrapConstraint(this.options.videoCaptureDefaults.deviceId),\n      );\n    }\n    if (this.options.audioCaptureDefaults.deviceId) {\n      this.localParticipant.activeDeviceMap.set(\n        'audioinput',\n        unwrapConstraint(this.options.audioCaptureDefaults.deviceId),\n      );\n    }\n    if (this.options.audioOutput?.deviceId) {\n      this.switchActiveDevice(\n        'audiooutput',\n        unwrapConstraint(this.options.audioOutput.deviceId),\n      ).catch((e) =\u003e this.log.warn(`Could not set audio output: ${e.message}`, this.logContext));\n    }\n\n    if (this.options.e2ee) {\n      this.setupE2EE();\n    }\n\n    if (isWeb()) {\n      const abortController = new AbortController();\n\n      // in order to catch device changes prior to room connection we need to register the event in the constructor\n      navigator.mediaDevices?.addEventListener('devicechange', this.handleDeviceChange, {\n        signal: abortController.signal,\n      });\n\n      if (Room.cleanupRegistry) {\n        Room.cleanupRegistry.register(this, () =\u003e {\n          abortController.abort();\n        });\n      }\n    }\n  }\n\n  registerTextStreamHandler(topic: string, callback: TextStreamHandler) {\n    return this.incomingDataStreamManager.registerTextStreamHandler(topic, callback);\n  }\n\n  unregisterTextStreamHandler(topic: string) {\n    return this.incomingDataStreamManager.unregisterTextStreamHandler(topic);\n  }\n\n  registerByteStreamHandler(topic: string, callback: ByteStreamHandler) {\n    return this.incomingDataStreamManager.registerByteStreamHandler(topic, callback);\n  }\n\n  unregisterByteStreamHandler(topic: string) {\n    return this.incomingDataStreamManager.unregisterByteStreamHandler(topic);\n  }\n\n  /**\n   * Establishes the participant as a receiver for calls of the specified RPC method.\n   *\n   * @param method - The name of the indicated RPC method\n   * @param handler - Will be invoked when an RPC request for this method is received\n   * @returns A promise that resolves when the method is successfully registered\n   * @throws {Error} If a handler for this method is already registered (must call unregisterRpcMethod first)\n   *\n   * @example\n   * ```typescript\n   * room.localParticipant?.registerRpcMethod(\n   *   'greet',\n   *   async (data: RpcInvocationData) =\u003e {\n   *     console.log(`Received greeting from ${data.callerIdentity}: ${data.payload}`);\n   *     return `Hello, ${data.callerIdentity}!`;\n   *   }\n   * );\n   * ```\n   *\n   * The handler should return a Promise that resolves to a string.\n   * If unable to respond within `responseTimeout`, the request will result in an error on the caller's side.\n   *\n   * You may throw errors of type `RpcError` with a string `message` in the handler,\n   * and they will be received on the caller's side with the message intact.\n   * Other errors thrown in your handler will not be transmitted as-is, and will instead arrive to the caller as `1500` (\"Application Error\").\n   */\n  registerRpcMethod(method: string, handler: (data: RpcInvocationData) =\u003e Promise\u003cstring\u003e) {\n    if (this.rpcHandlers.has(method)) {\n      throw Error(\n        `RPC handler already registered for method ${method}, unregisterRpcMethod before trying to register again`,\n      );\n    }\n    this.rpcHandlers.set(method, handler);\n  }\n\n  /**\n   * Unregisters a previously registered RPC method.\n   *\n   * @param method - The name of the RPC method to unregister\n   */\n  unregisterRpcMethod(method: string) {\n    this.rpcHandlers.delete(method);\n  }\n\n  /**\n   * @experimental\n   */\n  async setE2EEEnabled(enabled: boolean) {\n    if (this.e2eeManager) {\n      await Promise.all([this.localParticipant.setE2EEEnabled(enabled)]);\n      if (this.localParticipant.identity !== '') {\n        this.e2eeManager.setParticipantCryptorEnabled(enabled, this.localParticipant.identity);\n      }\n    } else {\n      throw Error('e2ee not configured, please set e2ee settings within the room options');\n    }\n  }\n\n  private setupE2EE() {\n    if (this.options.e2ee) {\n      if ('e2eeManager' in this.options.e2ee) {\n        this.e2eeManager = this.options.e2ee.e2eeManager;\n      } else {\n        this.e2eeManager = new E2EEManager(this.options.e2ee);\n      }\n      this.e2eeManager.on(\n        EncryptionEvent.ParticipantEncryptionStatusChanged,\n        (enabled, participant) =\u003e {\n          if (isLocalParticipant(participant)) {\n            this.isE2EEEnabled = enabled;\n          }\n          this.emit(RoomEvent.ParticipantEncryptionStatusChanged, enabled, participant);\n        },\n      );\n      this.e2eeManager.on(EncryptionEvent.EncryptionError, (error) =\u003e\n        this.emit(RoomEvent.EncryptionError, error),\n      );\n      this.e2eeManager?.setup(this);\n    }\n  }\n\n  private get logContext() {\n    return {\n      room: this.name,\n      roomID: this.roomInfo?.sid,\n      participant: this.localParticipant.identity,\n      pID: this.localParticipant.sid,\n    };\n  }\n\n  /**\n   * if the current room has a participant with `recorder: true` in its JWT grant\n   **/\n  get isRecording(): boolean {\n    return this.roomInfo?.activeRecording ?? false;\n  }\n\n  /**\n   * server assigned unique room id.\n   * returns once a sid has been issued by the server.\n   */\n  async getSid(): Promise\u003cstring\u003e {\n    if (this.state === ConnectionState.Disconnected) {\n      return '';\n    }\n    if (this.roomInfo \u0026\u0026 this.roomInfo.sid !== '') {\n      return this.roomInfo.sid;\n    }\n    return new Promise((resolve, reject) =\u003e {\n      const handleRoomUpdate = (roomInfo: RoomModel) =\u003e {\n        if (roomInfo.sid !== '') {\n          this.engine.off(EngineEvent.RoomUpdate, handleRoomUpdate);\n          resolve(roomInfo.sid);\n        }\n      };\n      this.engine.on(EngineEvent.RoomUpdate, handleRoomUpdate);\n      this.once(RoomEvent.Disconnected, () =\u003e {\n        this.engine.off(EngineEvent.RoomUpdate, handleRoomUpdate);\n        reject('Room disconnected before room server id was available');\n      });\n    });\n  }\n\n  /** user assigned name, derived from JWT token */\n  get name(): string {\n    return this.roomInfo?.name ?? '';\n  }\n\n  /** room metadata */\n  get metadata(): string | undefined {\n    return this.roomInfo?.metadata;\n  }\n\n  get numParticipants(): number {\n    return this.roomInfo?.numParticipants ?? 0;\n  }\n\n  get numPublishers(): number {\n    return this.roomInfo?.numPublishers ?? 0;\n  }\n\n  private maybeCreateEngine() {\n    if (this.engine \u0026\u0026 !this.engine.isClosed) {\n      return;\n    }\n\n    this.engine = new RTCEngine(this.options);\n\n    this.engine\n      .on(EngineEvent.ParticipantUpdate, this.handleParticipantUpdates)\n      .on(EngineEvent.RoomUpdate, this.handleRoomUpdate)\n      .on(EngineEvent.SpeakersChanged, this.handleSpeakersChanged)\n      .on(EngineEvent.StreamStateChanged, this.handleStreamStateUpdate)\n      .on(EngineEvent.ConnectionQualityUpdate, this.handleConnectionQualityUpdate)\n      .on(EngineEvent.SubscriptionError, this.handleSubscriptionError)\n      .on(EngineEvent.SubscriptionPermissionUpdate, this.handleSubscriptionPermissionUpdate)\n      .on(\n        EngineEvent.MediaTrackAdded,\n        (mediaTrack: MediaStreamTrack, stream: MediaStream, receiver: RTCRtpReceiver) =\u003e {\n          this.onTrackAdded(mediaTrack, stream, receiver);\n        },\n      )\n      .on(EngineEvent.Disconnected, (reason?: DisconnectReason) =\u003e {\n        this.handleDisconnect(this.options.stopLocalTrackOnUnpublish, reason);\n      })\n      .on(EngineEvent.ActiveSpeakersUpdate, this.handleActiveSpeakersUpdate)\n      .on(EngineEvent.DataPacketReceived, this.handleDataPacket)\n      .on(EngineEvent.Resuming, () =\u003e {\n        this.clearConnectionReconcile();\n        this.isResuming = true;\n        this.log.info('Resuming signal connection', this.logContext);\n        if (this.setAndEmitConnectionState(ConnectionState.SignalReconnecting)) {\n          this.emit(RoomEvent.SignalReconnecting);\n        }\n      })\n      .on(EngineEvent.Resumed, () =\u003e {\n        this.registerConnectionReconcile();\n        this.isResuming = false;\n        this.log.info('Resumed signal connection', this.logContext);\n        this.updateSubscriptions();\n        this.emitBufferedEvents();\n        if (this.setAndEmitConnectionState(ConnectionState.Connected)) {\n          this.emit(RoomEvent.Reconnected);\n        }\n      })\n      .on(EngineEvent.SignalResumed, () =\u003e {\n        this.bufferedEvents = [];\n        if (this.state === ConnectionState.Reconnecting || this.isResuming) {\n          this.sendSyncState();\n        }\n      })\n      .on(EngineEvent.Restarting, this.handleRestarting)\n      .on(EngineEvent.SignalRestarted, this.handleSignalRestarted)\n      .on(EngineEvent.Offline, () =\u003e {\n        if (this.setAndEmitConnectionState(ConnectionState.Reconnecting)) {\n          this.emit(RoomEvent.Reconnecting);\n        }\n      })\n      .on(EngineEvent.DCBufferStatusChanged, (status, kind) =\u003e {\n        this.emit(RoomEvent.DCBufferStatusChanged, status, kind);\n      })\n      .on(EngineEvent.LocalTrackSubscribed, (subscribedSid) =\u003e {\n        const trackPublication = this.localParticipant\n          .getTrackPublications()\n          .find(({ trackSid }) =\u003e trackSid === subscribedSid) as LocalTrackPublication | undefined;\n        if (!trackPublication) {\n          this.log.warn(\n            'could not find local track subscription for subscribed event',\n            this.logContext,\n          );\n          return;\n        }\n        this.localParticipant.emit(ParticipantEvent.LocalTrackSubscribed, trackPublication);\n        this.emitWhenConnected(\n          RoomEvent.LocalTrackSubscribed,\n          trackPublication,\n          this.localParticipant,\n        );\n      })\n      .on(EngineEvent.RoomMoved, (roomMoved) =\u003e {\n        this.log.debug('room moved', roomMoved);\n\n        if (roomMoved.room) {\n          this.handleRoomUpdate(roomMoved.room);\n        }\n\n        this.remoteParticipants.forEach((participant, identity) =\u003e {\n          this.handleParticipantDisconnected(identity, participant);\n        });\n\n        this.emit(RoomEvent.Moved, roomMoved.room!.name);\n\n        if (roomMoved.participant) {\n          this.handleParticipantUpdates([roomMoved.participant, ...roomMoved.otherParticipants]);\n        } else {\n          this.handleParticipantUpdates(roomMoved.otherParticipants);\n        }\n      });\n\n    if (this.localParticipant) {\n      this.localParticipant.setupEngine(this.engine);\n    }\n    if (this.e2eeManager) {\n      this.e2eeManager.setupEngine(this.engine);\n    }\n    if (this.outgoingDataStreamManager) {\n      this.outgoingDataStreamManager.setupEngine(this.engine);\n    }\n  }\n\n  /**\n   * getLocalDevices abstracts navigator.mediaDevices.enumerateDevices.\n   * In particular, it requests device permissions by default if needed\n   * and makes sure the returned device does not consist of dummy devices\n   * @param kind\n   * @returns a list of available local devices\n   */\n  static getLocalDevices(\n    kind?: MediaDeviceKind,\n    requestPermissions: boolean = true,\n  ): Promise\u003cMediaDeviceInfo[]\u003e {\n    return DeviceManager.getInstance().getDevices(kind, requestPermissions);\n  }\n\n  static cleanupRegistry =\n    typeof FinalizationRegistry !== 'undefined' \u0026\u0026\n    new FinalizationRegistry((cleanup: () =\u003e void) =\u003e {\n      cleanup();\n    });\n\n  /**\n   * prepareConnection should be called as soon as the page is loaded, in order\n   * to speed up the connection attempt. This function will\n   * - perform DNS resolution and pre-warm the DNS cache\n   * - establish TLS connection and cache TLS keys\n   *\n   * With LiveKit Cloud, it will also determine the best edge data center for\n   * the current client to connect to if a token is provided.\n   */\n  async prepareConnection(url: string, token?: string) {\n    if (this.state !== ConnectionState.Disconnected) {\n      return;\n    }\n    this.log.debug(`prepareConnection to ${url}`, this.logContext);\n    try {\n      if (isCloud(new URL(url)) \u0026\u0026 token) {\n        this.regionUrlProvider = new RegionUrlProvider(url, token);\n        const regionUrl = await this.regionUrlProvider.getNextBestRegionUrl();\n        // we will not replace the regionUrl if an attempt had already started\n        // to avoid overriding regionUrl after a new connection attempt had started\n        if (regionUrl \u0026\u0026 this.state === ConnectionState.Disconnected) {\n          this.regionUrl = regionUrl;\n          await fetch(toHttpUrl(regionUrl), { method: 'HEAD' });\n          this.log.debug(`prepared connection to ${regionUrl}`, this.logContext);\n        }\n      } else {\n        await fetch(toHttpUrl(url), { method: 'HEAD' });\n      }\n    } catch (e) {\n      this.log.warn('could not prepare connection', { ...this.logContext, error: e });\n    }\n  }\n\n  connect = async (url: string, token: string, opts?: RoomConnectOptions): Promise\u003cvoid\u003e =\u003e {\n    if (!isBrowserSupported()) {\n      if (isReactNative()) {\n        throw Error(\"WebRTC isn't detected, have you called registerGlobals?\");\n      } else {\n        throw Error(\n          \"LiveKit doesn't seem to be supported on this browser. Try to update your browser and make sure no browser extensions are disabling webRTC.\",\n        );\n      }\n    }\n\n    // In case a disconnect called happened right before the connect call, make sure the disconnect is completed first by awaiting its lock\n    const unlockDisconnect = await this.disconnectLock.lock();\n\n    if (this.state === ConnectionState.Connected) {\n      // when the state is reconnecting or connected, this function returns immediately\n      this.log.info(`already connected to room ${this.name}`, this.logContext);\n      unlockDisconnect();\n      return Promise.resolve();\n    }\n\n    if (this.connectFuture) {\n      unlockDisconnect();\n      return this.connectFuture.promise;\n    }\n\n    this.setAndEmitConnectionState(ConnectionState.Connecting);\n    if (this.regionUrlProvider?.getServerUrl().toString() !== url) {\n      this.regionUrl = undefined;\n      this.regionUrlProvider = undefined;\n    }\n    if (isCloud(new URL(url))) {\n      if (this.regionUrlProvider === undefined) {\n        this.regionUrlProvider = new RegionUrlProvider(url, token);\n      } else {\n        this.regionUrlProvider.updateToken(token);\n      }\n      // trigger the first fetch without waiting for a response\n      // if initial connection fails, this will speed up picking regional url\n      // on subsequent runs\n      this.regionUrlProvider\n        .fetchRegionSettings()\n        .then((settings) =\u003e {\n          this.regionUrlProvider?.setServerReportedRegions(settings);\n        })\n        .catch((e) =\u003e {\n          this.log.warn('could not fetch region settings', { ...this.logContext, error: e });\n        });\n    }\n\n    const connectFn = async (\n      resolve: () =\u003e void,\n      reject: (reason: any) =\u003e void,\n      regionUrl?: string,\n    ) =\u003e {\n      if (this.abortController) {\n        this.abortController.abort();\n      }\n\n      // explicit creation as local var needed to satisfy TS compiler when passing it to `attemptConnection` further down\n      const abortController = new AbortController();\n      this.abortController = abortController;\n\n      // at this point the intention to connect has been signalled so we can allow cancelling of the connection via disconnect() again\n      unlockDisconnect?.();\n\n      try {\n        await this.attemptConnection(regionUrl ?? url, token, opts, abortController);\n        this.abortController = undefined;\n        resolve();\n      } catch (e) {\n        if (\n          this.regionUrlProvider \u0026\u0026\n          e instanceof ConnectionError \u0026\u0026\n          e.reason !== ConnectionErrorReason.Cancelled \u0026\u0026\n          e.reason !== ConnectionErrorReason.NotAllowed\n        ) {\n          let nextUrl: string | null = null;\n          try {\n            nextUrl = await this.regionUrlProvider.getNextBestRegionUrl(\n              this.abortController?.signal,\n            );\n          } catch (error) {\n            if (\n              error instanceof ConnectionError \u0026\u0026\n              (error.status === 401 || error.reason === ConnectionErrorReason.Cancelled)\n            ) {\n              this.handleDisconnect(this.options.stopLocalTrackOnUnpublish);\n              reject(error);\n              return;\n            }\n          }\n          if (nextUrl \u0026\u0026 !this.abortController?.signal.aborted) {\n            this.log.info(\n              `Initial connection failed with ConnectionError: ${e.message}. Retrying with another region: ${nextUrl}`,\n              this.logContext,\n            );\n            this.recreateEngine();\n            await connectFn(resolve, reject, nextUrl);\n          } else {\n            this.handleDisconnect(\n              this.options.stopLocalTrackOnUnpublish,\n              getDisconnectReasonFromConnectionError(e),\n            );\n            reject(e);\n          }\n        } else {\n          let disconnectReason = DisconnectReason.UNKNOWN_REASON;\n          if (e instanceof ConnectionError) {\n            disconnectReason = getDisconnectReasonFromConnectionError(e);\n          }\n          this.handleDisconnect(this.options.stopLocalTrackOnUnpublish, disconnectReason);\n          reject(e);\n        }\n      }\n    };\n\n    const regionUrl = this.regionUrl;\n    this.regionUrl = undefined;\n    this.connectFuture = new Future(\n      (resolve, reject) =\u003e {\n        connectFn(resolve, reject, regionUrl);\n      },\n      () =\u003e {\n        this.clearConnectionFutures();\n      },\n    );\n\n    return this.connectFuture.promise;\n  };\n\n  private connectSignal = async (\n    url: string,\n    token: string,\n    engine: RTCEngine,\n    connectOptions: InternalRoomConnectOptions,\n    roomOptions: InternalRoomOptions,\n    abortController: AbortController,\n  ): Promise\u003cJoinResponse\u003e =\u003e {\n    const joinResponse = await engine.join(\n      url,\n      token,\n      {\n        autoSubscribe: connectOptions.autoSubscribe,\n        adaptiveStream:\n          typeof roomOptions.adaptiveStream === 'object' ? true : roomOptions.adaptiveStream,\n        maxRetries: connectOptions.maxRetries,\n        e2eeEnabled: !!this.e2eeManager,\n        websocketTimeout: connectOptions.websocketTimeout,\n      },\n      abortController.signal,\n    );\n\n    let serverInfo: Partial\u003cServerInfo\u003e | undefined = joinResponse.serverInfo;\n    if (!serverInfo) {\n      serverInfo = { version: joinResponse.serverVersion, region: joinResponse.serverRegion };\n    }\n    this.serverInfo = serverInfo;\n\n    this.log.debug(\n      `connected to Livekit Server ${Object.entries(serverInfo)\n        .map(([key, value]) =\u003e `${key}: ${value}`)\n        .join(', ')}`,\n      {\n        room: joinResponse.room?.name,\n        roomSid: joinResponse.room?.sid,\n        identity: joinResponse.participant?.identity,\n      },\n    );\n\n    if (!serverInfo.version) {\n      throw new UnsupportedServer('unknown server version');\n    }\n\n    if (serverInfo.version === '0.15.1' \u0026\u0026 this.options.dynacast) {\n      this.log.debug('disabling dynacast due to server version', this.logContext);\n      // dynacast has a bug in 0.15.1, so we cannot use it then\n      roomOptions.dynacast = false;\n    }\n\n    return joinResponse;\n  };\n\n  private applyJoinResponse = (joinResponse: JoinResponse) =\u003e {\n    const pi = joinResponse.participant!;\n\n    this.localParticipant.sid = pi.sid;\n    this.localParticipant.identity = pi.identity;\n    this.localParticipant.setEnabledPublishCodecs(joinResponse.enabledPublishCodecs);\n\n    if (this.options.e2ee \u0026\u0026 this.e2eeManager) {\n      try {\n        this.e2eeManager.setSifTrailer(joinResponse.sifTrailer);\n      } catch (e: any) {\n        this.log.error(e instanceof Error ? e.message : 'Could not set SifTrailer', {\n          ...this.logContext,\n          error: e,\n        });\n      }\n    }\n\n    // populate remote participants, these should not trigger new events\n    this.handleParticipantUpdates([pi, ...joinResponse.otherParticipants]);\n\n    if (joinResponse.room) {\n      this.handleRoomUpdate(joinResponse.room);\n    }\n  };\n\n  private attemptConnection = async (\n    url: string,\n    token: string,\n    opts: RoomConnectOptions | undefined,\n    abortController: AbortController,\n  ) =\u003e {\n    if (\n      this.state === ConnectionState.Reconnecting ||\n      this.isResuming ||\n      this.engine?.pendingReconnect\n    ) {\n      this.log.info('Reconnection attempt replaced by new connection attempt', this.logContext);\n      // make sure we close and recreate the existing engine in order to get rid of any potentially ongoing reconnection attempts\n      this.recreateEngine();\n    } else {\n      // create engine if previously disconnected\n      this.maybeCreateEngine();\n    }\n    if (this.regionUrlProvider?.isCloud()) {\n      this.engine.setRegionUrlProvider(this.regionUrlProvider);\n    }\n\n    this.acquireAudioContext();\n\n    this.connOptions = { ...roomConnectOptionDefaults, ...opts } as InternalRoomConnectOptions;\n\n    if (this.connOptions.rtcConfig) {\n      this.engine.rtcConfig = this.connOptions.rtcConfig;\n    }\n    if (this.connOptions.peerConnectionTimeout) {\n      this.engine.peerConnectionTimeout = this.connOptions.peerConnectionTimeout;\n    }\n\n    try {\n      const joinResponse = await this.connectSignal(\n        url,\n        token,\n        this.engine,\n        this.connOptions,\n        this.options,\n        abortController,\n      );\n\n      this.applyJoinResponse(joinResponse);\n      // forward metadata changed for the local participant\n      this.setupLocalParticipantEvents();\n      this.emit(RoomEvent.SignalConnected);\n    } catch (err) {\n      await this.engine.close();\n      this.recreateEngine();\n      const resultingError = new ConnectionError(\n        `could not establish signal connection`,\n        ConnectionErrorReason.ServerUnreachable,\n      );\n      if (err instanceof Error) {\n        resultingError.message = `${resultingError.message}: ${err.message}`;\n      }\n      if (err instanceof ConnectionError) {\n        resultingError.reason = err.reason;\n        resultingError.status = err.status;\n      }\n      this.log.debug(`error trying to establish signal connection`, {\n        ...this.logContext,\n        error: err,\n      });\n      throw resultingError;\n    }\n\n    if (abortController.signal.aborted) {\n      await this.engine.close();\n      this.recreateEngine();\n      throw new ConnectionError(`Connection attempt aborted`, ConnectionErrorReason.Cancelled);\n    }\n\n    try {\n      await this.engine.waitForPCInitialConnection(\n        this.connOptions.peerConnectionTimeout,\n        abortController,\n      );\n    } catch (e) {\n      await this.engine.close();\n      this.recreateEngine();\n      throw e;\n    }\n\n    // also hook unload event\n    if (isWeb() \u0026\u0026 this.options.disconnectOnPageLeave) {\n      // capturing both 'pagehide' and 'beforeunload' to capture broadest set of browser behaviors\n      window.addEventListener('pagehide', this.onPageLeave);\n      window.addEventListener('beforeunload', this.onPageLeave);\n    }\n    if (isWeb()) {\n      document.addEventListener('freeze', this.onPageLeave);\n    }\n    this.setAndEmitConnectionState(ConnectionState.Connected);\n    this.emit(RoomEvent.Connected);\n    this.registerConnectionReconcile();\n  };\n\n  /**\n   * disconnects the room, emits [[RoomEvent.Disconnected]]\n   */\n  disconnect = async (stopTracks = true) =\u003e {\n    const unlock = await this.disconnectLock.lock();\n    try {\n      if (this.state === ConnectionState.Disconnected) {\n        this.log.debug('already disconnected', this.logContext);\n        return;\n      }\n      this.log.info('disconnect from room', {\n        ...this.logContext,\n      });\n      if (\n        this.state === ConnectionState.Connecting ||\n        this.state === ConnectionState.Reconnecting ||\n        this.isResuming\n      ) {\n        // try aborting pending connection attempt\n        this.log.warn('abort connection attempt', this.logContext);\n        this.abortController?.abort();\n        // in case the abort controller didn't manage to cancel the connection attempt, reject the connect promise explicitly\n        this.connectFuture?.reject?.(\n          new ConnectionError('Client initiated disconnect', ConnectionErrorReason.Cancelled),\n        );\n        this.connectFuture = undefined;\n      }\n      // send leave\n      if (!this.engine?.client.isDisconnected) {\n        await this.engine.client.sendLeave();\n      }\n      // close engine (also closes client)\n      if (this.engine) {\n        await this.engine.close();\n      }\n      this.handleDisconnect(stopTracks, DisconnectReason.CLIENT_INITIATED);\n      /* @ts-ignore */\n      this.engine = undefined;\n    } finally {\n      unlock();\n    }\n  };\n\n  /**\n   * retrieves a participant by identity\n   * @param identity\n   * @returns\n   */\n  getParticipantByIdentity(identity: string): Participant | undefined {\n    if (this.localParticipant.identity === identity) {\n      return this.localParticipant;\n    }\n    return this.remoteParticipants.get(identity);\n  }\n\n  private clearConnectionFutures() {\n    this.connectFuture = undefined;\n  }\n\n  /**\n   * @internal for testing\n   */\n  async simulateScenario(scenario: SimulationScenario, arg?: any) {\n    let postAction = async () =\u003e {};\n    let req: SimulateScenario | undefined;\n    switch (scenario) {\n      case 'signal-reconnect':\n        // @ts-expect-error function is private\n        await this.engine.client.handleOnClose('simulate disconnect');\n        break;\n      case 'speaker':\n        req = new SimulateScenario({\n          scenario: {\n            case: 'speakerUpdate',\n            value: 3,\n          },\n        });\n        break;\n      case 'node-failure':\n        req = new SimulateScenario({\n          scenario: {\n            case: 'nodeFailure',\n            value: true,\n          },\n        });\n        break;\n      case 'server-leave':\n        req = new SimulateScenario({\n          scenario: {\n            case: 'serverLeave',\n            value: true,\n          },\n        });\n        break;\n      case 'migration':\n        req = new SimulateScenario({\n          scenario: {\n            case: 'migration',\n            value: true,\n          },\n        });\n        break;\n      case 'resume-reconnect':\n        this.engine.failNext();\n        // @ts-expect-error function is private\n        await this.engine.client.handleOnClose('simulate resume-disconnect');\n        break;\n      case 'disconnect-signal-on-resume':\n        postAction = async () =\u003e {\n          // @ts-expect-error function is private\n          await this.engine.client.handleOnClose('simulate resume-disconnect');\n        };\n        req = new SimulateScenario({\n          scenario: {\n            case: 'disconnectSignalOnResume',\n            value: true,\n          },\n        });\n        break;\n      case 'disconnect-signal-on-resume-no-messages':\n        postAction = async () =\u003e {\n          // @ts-expect-error function is private\n          await this.engine.client.handleOnClose('simulate resume-disconnect');\n        };\n        req = new SimulateScenario({\n          scenario: {\n            case: 'disconnectSignalOnResumeNoMessages',\n            value: true,\n          },\n        });\n        break;\n      case 'full-reconnect':\n        this.engine.fullReconnectOnNext = true;\n        // @ts-expect-error function is private\n        await this.engine.client.handleOnClose('simulate full-reconnect');\n        break;\n      case 'force-tcp':\n      case 'force-tls':\n        req = new SimulateScenario({\n          scenario: {\n            case: 'switchCandidateProtocol',\n            value: scenario === 'force-tls' ? 2 : 1,\n          },\n        });\n        postAction = async () =\u003e {\n          const onLeave = this.engine.client.onLeave;\n          if (onLeave) {\n            onLeave(\n              new LeaveRequest({\n                reason: DisconnectReason.CLIENT_INITIATED,\n                action: LeaveRequest_Action.RECONNECT,\n              }),\n            );\n          }\n        };\n        break;\n      case 'subscriber-bandwidth':\n        if (arg === undefined || typeof arg !== 'number') {\n          throw new Error('subscriber-bandwidth requires a number as argument');\n        }\n        req = new SimulateScenario({\n          scenario: {\n            case: 'subscriberBandwidth',\n            value: numberToBigInt(arg),\n          },\n        });\n        break;\n      case 'leave-full-reconnect':\n        req = new SimulateScenario({\n          scenario: {\n            case: 'leaveRequestFullReconnect',\n            value: true,\n          },\n        });\n      default:\n    }\n    if (req) {\n      await this.engine.client.sendSimulateScenario(req);\n      await postAction();\n    }\n  }\n\n  private onPageLeave = async () =\u003e {\n    this.log.info('Page leave detected, disconnecting', this.logContext);\n    await this.disconnect();\n  };\n\n  /**\n   * Browsers have different policies regarding audio playback. Most requiring\n   * some form of user interaction (click/tap/etc).\n   * In those cases, audio will be silent until a click/tap triggering one of the following\n   * - `startAudio`\n   * - `getUserMedia`\n   */\n  startAudio = async () =\u003e {\n    const elements: Array\u003cHTMLMediaElement\u003e = [];\n    const browser = getBrowser();\n    if (browser \u0026\u0026 browser.os === 'iOS') {\n      /**\n       * iOS blocks audio element playback if\n       * - user is not publishing audio themselves and\n       * - no other audio source is playing\n       *\n       * as a workaround, we create an audio element with an empty track, so that\n       * silent audio is always playing\n       */\n      const audioId = 'livekit-dummy-audio-el';\n      let dummyAudioEl = document.getElementById(audioId) as HTMLAudioElement | null;\n      if (!dummyAudioEl) {\n        dummyAudioEl = document.createElement('audio');\n        dummyAudioEl.id = audioId;\n        dummyAudioEl.autoplay = true;\n        dummyAudioEl.hidden = true;\n        const track = getEmptyAudioStreamTrack();\n        track.enabled = true;\n        const stream = new MediaStream([track]);\n        dummyAudioEl.srcObject = stream;\n        document.addEventListener('visibilitychange', () =\u003e {\n          if (!dummyAudioEl) {\n            return;\n          }\n          // set the srcObject to null on page hide in order to prevent lock screen controls to show up for it\n          dummyAudioEl.srcObject = document.hidden ? null : stream;\n          if (!document.hidden) {\n            this.log.debug(\n              'page visible again, triggering startAudio to resume playback and update playback status',\n              this.logContext,\n            );\n            this.startAudio();\n          }\n        });\n        document.body.append(dummyAudioEl);\n        this.once(RoomEvent.Disconnected, () =\u003e {\n          dummyAudioEl?.remove();\n          dummyAudioEl = null;\n        });\n      }\n      elements.push(dummyAudioEl);\n    }\n\n    this.remoteParticipants.forEach((p) =\u003e {\n      p.audioTrackPublications.forEach((t) =\u003e {\n        if (t.track) {\n          t.track.attachedElements.forEach((e) =\u003e {\n            elements.push(e);\n          });\n        }\n      });\n    });\n\n    try {\n      await Promise.all([\n        this.acquireAudioContext(),\n        ...elements.map((e) =\u003e {\n          e.muted = false;\n          return e.play();\n        }),\n      ]);\n      this.handleAudioPlaybackStarted();\n    } catch (err) {\n      this.handleAudioPlaybackFailed(err);\n      throw err;\n    }\n  };\n\n  startVideo = async () =\u003e {\n    const elements: HTMLMediaElement[] = [];\n    for (const p of this.remoteParticipants.values()) {\n      p.videoTrackPublications.forEach((tr) =\u003e {\n        tr.track?.attachedElements.forEach((el) =\u003e {\n          if (!elements.includes(el)) {\n            elements.push(el);\n          }\n        });\n      });\n    }\n    await Promise.all(elements.map((el) =\u003e el.play()))\n      .then(() =\u003e {\n        this.handleVideoPlaybackStarted();\n      })\n      .catch((e) =\u003e {\n        if (e.name === 'NotAllowedError') {\n          this.handleVideoPlaybackFailed();\n        } else {\n          this.log.warn(\n            'Resuming video playback failed, make sure you call `startVideo` directly in a user gesture handler',\n            this.logContext,\n          );\n        }\n      });\n  };\n\n  /**\n   * Returns true if audio playback is enabled\n   */\n  get canPlaybackAudio(): boolean {\n    return this.audioEnabled;\n  }\n\n  /**\n   * Returns true if video playback is enabled\n   */\n  get canPlaybackVideo(): boolean {\n    return !this.isVideoPlaybackBlocked;\n  }\n\n  getActiveDevice(kind: MediaDeviceKind): string | undefined {\n    return this.localParticipant.activeDeviceMap.get(kind);\n  }\n\n  /**\n   * Switches all active devices used in this room to the given device.\n   *\n   * Note: setting AudioOutput is not supported on some browsers. See [setSinkId](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/setSinkId#browser_compatibility)\n   *\n   * @param kind use `videoinput` for camera track,\n   *  `audioinput` for microphone track,\n   *  `audiooutput` to set speaker for all incoming audio tracks\n   * @param deviceId\n   */\n  async switchActiveDevice(kind: MediaDeviceKind, deviceId: string, exact: boolean = true) {\n    let success = true;\n    let shouldTriggerImmediateDeviceChange = false;\n    const deviceConstraint = exact ? { exact: deviceId } : deviceId;\n    if (kind === 'audioinput') {\n      shouldTriggerImmediateDeviceChange = this.localParticipant.audioTrackPublications.size === 0;\n      const prevDeviceId =\n        this.getActiveDevice(kind) ?? this.options.audioCaptureDefaults!.deviceId;\n      this.options.audioCaptureDefaults!.deviceId = deviceConstraint;\n      const tracks = Array.from(this.localParticipant.audioTrackPublications.values()).filter(\n        (track) =\u003e track.source === Track.Source.Microphone,\n      );\n      try {\n        success = (\n          await Promise.all(tracks.map((t) =\u003e t.audioTrack?.setDeviceId(deviceConstraint)))\n        ).every((val) =\u003e val === true);\n      } catch (e) {\n        this.options.audioCaptureDefaults!.deviceId = prevDeviceId;\n        throw e;\n      }\n      const isMuted = tracks.some((t) =\u003e t.track?.isMuted ?? false);\n      if (success \u0026\u0026 isMuted) shouldTriggerImmediateDeviceChange = true;\n    } else if (kind === 'videoinput') {\n      shouldTriggerImmediateDeviceChange = this.localParticipant.videoTrackPublications.size === 0;\n      const prevDeviceId =\n        this.getActiveDevice(kind) ?? this.options.videoCaptureDefaults!.deviceId;\n      this.options.videoCaptureDefaults!.deviceId = deviceConstraint;\n      const tracks = Array.from(this.localParticipant.videoTrackPublications.values()).filter(\n        (track) =\u003e track.source === Track.Source.Camera,\n      );\n      try {\n        success = (\n          await Promise.all(tracks.map((t) =\u003e t.videoTrack?.setDeviceId(deviceConstraint)))\n        ).every((val) =\u003e val === true);\n      } catch (e) {\n        this.options.videoCaptureDefaults!.deviceId = prevDeviceId;\n        throw e;\n      }\n      const isMuted = tracks.some((t) =\u003e t.track?.isMuted ?? false);\n      if (success \u0026\u0026 isMuted) shouldTriggerImmediateDeviceChange = true;\n    } else if (kind === 'audiooutput') {\n      shouldTriggerImmediateDeviceChange = true;\n      if (\n        (!supportsSetSinkId() \u0026\u0026 !this.options.webAudioMix) ||\n        (this.options.webAudioMix \u0026\u0026 this.audioContext \u0026\u0026 !('setSinkId' in this.audioContext))\n      ) {\n        throw new Error('cannot switch audio output, the current browser does not support it');\n      }\n      if (this.options.webAudioMix) {\n        // setting `default` for web audio output doesn't work, so we need to normalize the id before\n        deviceId =\n          (await DeviceManager.getInstance().normalizeDeviceId('audiooutput', deviceId)) ?? '';\n      }\n      this.options.audioOutput ??= {};\n      const prevDeviceId = this.getActiveDevice(kind) ?? this.options.audioOutput.deviceId;\n      this.options.audioOutput.deviceId = deviceId;\n\n      try {\n        if (this.options.webAudioMix) {\n          // @ts-expect-error setSinkId is not yet in the typescript type of AudioContext\n          this.audioContext?.setSinkId(deviceId);\n        }\n\n        // also set audio output on all audio elements, even if webAudioMix is enabled in order to workaround echo cancellation not working on chrome with non-default output devices\n        // see https://issues.chromium.org/issues/40252911#comment7\n        await Promise.all(\n          Array.from(this.remoteParticipants.values()).map((p) =\u003e p.setAudioOutput({ deviceId })),\n        );\n      } catch (e) {\n        this.options.audioOutput.deviceId = prevDeviceId;\n        throw e;\n      }\n    }\n\n    if (shouldTriggerImmediateDeviceChange) {\n      this.localParticipant.activeDeviceMap.set(kind, deviceId);\n      this.emit(RoomEvent.ActiveDeviceChanged, kind, deviceId);\n    }\n\n    return success;\n  }\n\n  private setupLocalParticipantEvents() {\n    this.localParticipant\n      .on(ParticipantEvent.ParticipantMetadataChanged, this.onLocalParticipantMetadataChanged)\n      .on(ParticipantEvent.ParticipantNameChanged, this.onLocalParticipantNameChanged)\n      .on(ParticipantEvent.AttributesChanged, this.onLocalAttributesChanged)\n      .on(ParticipantEvent.TrackMuted, this.onLocalTrackMuted)\n      .on(ParticipantEvent.TrackUnmuted, this.onLocalTrackUnmuted)\n      .on(ParticipantEvent.LocalTrackPublished, this.onLocalTrackPublished)\n      .on(ParticipantEvent.LocalTrackUnpublished, this.onLocalTrackUnpublished)\n      .on(ParticipantEvent.ConnectionQualityChanged, this.onLocalConnectionQualityChanged)\n      .on(ParticipantEvent.MediaDevicesError, this.onMediaDevicesError)\n      .on(ParticipantEvent.AudioStreamAcquired, this.startAudio)\n      .on(ParticipantEvent.ChatMessage, this.onLocalChatMessageSent)\n      .on(\n        ParticipantEvent.ParticipantPermissionsChanged,\n        this.onLocalParticipantPermissionsChanged,\n      );\n  }\n\n  private recreateEngine() {\n    this.engine?.close();\n    /* @ts-ignore */\n    this.engine = undefined;\n    this.isResuming = false;\n\n    // clear out existing remote participants, since they may have attached\n    // the old engine\n    this.remoteParticipants.clear();\n    this.sidToIdentity.clear();\n    this.bufferedEvents = [];\n    this.maybeCreateEngine();\n  }\n\n  private onTrackAdded(\n    mediaTrack: MediaStreamTrack,\n    stream: MediaStream,\n    receiver: RTCRtpReceiver,\n  ) {\n    // don't fire onSubscribed when connecting\n    // WebRTC fires onTrack as soon as setRemoteDescription is called on the offer\n    // at that time, ICE connectivity has not been established so the track is not\n    // technically subscribed.\n    // We'll defer these events until when the room is connected or eventually disconnected.\n    if (this.state === ConnectionState.Connecting || this.state === ConnectionState.Reconnecting) {\n      const reconnectedHandler = () =\u003e {\n        this.onTrackAdded(mediaTrack, stream, receiver);\n        cleanup();\n      };\n      const cleanup = () =\u003e {\n        this.off(RoomEvent.Reconnected, reconnectedHandler);\n        this.off(RoomEvent.Connected, reconnectedHandler);\n        this.off(RoomEvent.Disconnected, cleanup);\n      };\n      this.once(RoomEvent.Reconnected, reconnectedHandler);\n      this.once(RoomEvent.Connected, reconnectedHandler);\n      this.once(RoomEvent.Disconnected, cleanup);\n      return;\n    }\n    if (this.state === ConnectionState.Disconnected) {\n      this.log.warn('skipping incoming track after Room disconnected', this.logContext);\n      return;\n    }\n    if (mediaTrack.readyState === 'ended') {\n      this.log.info('skipping incoming track as it already ended', this.logContext);\n      return;\n    }\n    const parts = unpackStreamId(stream.id);\n    const participantSid = parts[0];\n    let streamId = parts[1];\n    let trackId = mediaTrack.id;\n    // firefox will get streamId (pID|trackId) instead of (pID|streamId) as it doesn't support sync tracks by stream\n    // and generates its own track id instead of infer from sdp track id.\n    if (streamId \u0026\u0026 streamId.startsWith('TR')) trackId = streamId;\n\n    if (participantSid === this.localParticipant.sid) {\n      this.log.warn('tried to create RemoteParticipant for local participant', this.logContext);\n      return;\n    }\n\n    const participant = Array.from(this.remoteParticipants.values()).find(\n      (p) =\u003e p.sid === participantSid,\n    ) as RemoteParticipant | undefined;\n\n    if (!participant) {\n      this.log.error(\n        `Tried to add a track for a participant, that's not present. Sid: ${participantSid}`,\n        this.logContext,\n      );\n      return;\n    }\n\n    let adaptiveStreamSettings: AdaptiveStreamSettings | undefined;\n    if (this.options.adaptiveStream) {\n      if (typeof this.options.adaptiveStream === 'object') {\n        adaptiveStreamSettings = this.options.adaptiveStream;\n      } else {\n        adaptiveStreamSettings = {};\n      }\n    }\n\n    const publication = participant.addSubscribedMediaTrack(\n      mediaTrack,\n      trackId,\n      stream,\n      receiver,\n      adaptiveStreamSettings,\n    );\n\n    if (publication?.isEncrypted \u0026\u0026 !this.e2eeManager) {\n      this.emit(\n        RoomEvent.EncryptionError,\n        new Error(\n          `Encrypted ${publication.source} track received from participant ${participant.sid}, but room does not have encryption enabled!`,\n        ),\n      );\n    }\n  }\n\n  private handleRestarting = () =\u003e {\n    this.clearConnectionReconcile();\n    // in case we went from resuming to full-reconnect, make sure to reflect it on the isResuming flag\n    this.isResuming = false;\n\n    // also unwind existing participants \u0026 existing subscriptions\n    for (const p of this.remoteParticipants.values()) {\n      this.handleParticipantDisconnected(p.identity, p);\n    }\n\n    if (this.setAndEmitConnectionState(ConnectionState.Reconnecting)) {\n      this.emit(RoomEvent.Reconnecting);\n    }\n  };\n\n  private handleSignalRestarted = async (joinResponse: JoinResponse) =\u003e {\n    this.log.debug(`signal reconnected to server, region ${joinResponse.serverRegion}`, {\n      ...this.logContext,\n      region: joinResponse.serverRegion,\n    });\n    this.bufferedEvents = [];\n\n    this.applyJoinResponse(joinResponse);\n\n    try {\n      // unpublish \u0026 republish tracks\n      await this.localParticipant.republishAllTracks(undefined, true);\n    } catch (error) {\n      this.log.error('error trying to re-publish tracks after reconnection', {\n        ...this.logContext,\n        error,\n      });\n    }\n\n    try {\n      await this.engine.waitForRestarted();\n      this.log.debug(`fully reconnected to server`, {\n        ...this.logContext,\n        region: joinResponse.serverRegion,\n      });\n    } catch {\n      // reconnection failed, handleDisconnect is being invoked already, just return here\n      return;\n    }\n    this.setAndEmitConnectionState(ConnectionState.Connected);\n    this.emit(RoomEvent.Reconnected);\n    this.registerConnectionReconcile();\n    this.emitBufferedEvents();\n  };\n\n  private handleDisconnect(shouldStopTracks = true, reason?: DisconnectReason) {\n    this.clearConnectionReconcile();\n    this.isResuming = false;\n    this.bufferedEvents = [];\n    this.transcriptionReceivedTimes.clear();\n    this.incomingDataStreamManager.clearHandlersAndControllers();\n    if (this.state === ConnectionState.Disconnected) {\n      return;\n    }\n\n    this.regionUrl = undefined;\n\n    try {\n      this.remoteParticipants.forEach((p) =\u003e {\n        p.trackPublications.forEach((pub) =\u003e {\n          p.unpublishTrack(pub.trackSid);\n        });\n      });\n\n      this.localParticipant.trackPublications.forEach((pub) =\u003e {\n        if (pub.track) {\n          this.localParticipant.unpublishTrack(pub.track, shouldStopTracks);\n        }\n        if (shouldStopTracks) {\n          pub.track?.detach();\n          pub.track?.stop();\n        } else {\n          pub.track?.stopMonitor();\n        }\n      });\n\n      this.localParticipant\n        .off(ParticipantEvent.ParticipantMetadataChanged, this.onLocalParticipantMetadataChanged)\n        .off(ParticipantEvent.ParticipantNameChanged, this.onLocalParticipantNameChanged)\n        .off(ParticipantEvent.AttributesChanged, this.onLocalAttributesChanged)\n        .off(ParticipantEvent.TrackMuted, this.onLocalTrackMuted)\n        .off(ParticipantEvent.TrackUnmuted, this.onLocalTrackUnmuted)\n        .off(ParticipantEvent.LocalTrackPublished, this.onLocalTrackPublished)\n        .off(ParticipantEvent.LocalTrackUnpublished, this.onLocalTrackUnpublished)\n        .off(ParticipantEvent.ConnectionQualityChanged, this.onLocalConnectionQualityChanged)\n        .off(ParticipantEvent.MediaDevicesError, this.onMediaDevicesError)\n        .off(ParticipantEvent.AudioStreamAcquired, this.startAudio)\n        .off(ParticipantEvent.ChatMessage, this.onLocalChatMessageSent)\n        .off(\n          ParticipantEvent.ParticipantPermissionsChanged,\n          this.onLocalParticipantPermissionsChanged,\n        );\n\n      this.localParticipant.trackPublications.clear();\n      this.localParticipant.videoTrackPublications.clear();\n      this.localParticipant.audioTrackPublications.clear();\n\n      this.remoteParticipants.clear();\n      this.sidToIdentity.clear();\n      this.activeSpeakers = [];\n      if (this.audioContext \u0026\u0026 typeof this.options.webAudioMix === 'boolean') {\n        this.audioContext.close();\n        this.audioContext = undefined;\n      }\n      if (isWeb()) {\n        window.removeEventListener('beforeunload', this.onPageLeave);\n        window.removeEventListener('pagehide', this.onPageLeave);\n        window.removeEventListener('freeze', this.onPageLeave);\n        navigator.mediaDevices?.removeEventListener('devicechange', this.handleDeviceChange);\n      }\n    } finally {\n      this.setAndEmitConnectionState(ConnectionState.Disconnected);\n      this.emit(RoomEvent.Disconnected, reason);\n    }\n  }\n\n  private handleParticipantUpdates = (participantInfos: ParticipantInfo[]) =\u003e {\n    // handle changes to participant state, and send events\n    participantInfos.forEach((info) =\u003e {\n      if (info.identity === this.localParticipant.identity) {\n        this.localParticipant.updateInfo(info);\n        return;\n      }\n\n      // LiveKit server doesn't send identity info prior to version 1.5.2 in disconnect updates\n      // so we try to map an empty identity to an already known sID manually\n      if (info.identity === '') {\n        info.identity = this.sidToIdentity.get(info.sid) ?? '';\n      }\n\n      let remoteParticipant = this.remoteParticipants.get(info.identity);\n\n      // when it's disconnected, send updates\n      if (info.state === ParticipantInfo_State.DISCONNECTED) {\n        this.handleParticipantDisconnected(info.identity, remoteParticipant);\n      } else {\n        // create participant if doesn't exist\n        remoteParticipant = this.getOrCreateParticipant(info.identity, info);\n      }\n    });\n  };\n\n  private handleParticipantDisconnected(identity: string, participant?: RemoteParticipant) {\n    // remove and send event\n    this.remoteParticipants.delete(identity);\n    if (!participant) {\n      return;\n    }\n\n    this.incomingDataStreamManager.validateParticipantHasNoActiveDataStreams(identity);\n\n    participant.trackPublications.forEach((publication) =\u003e {\n      participant.unpublishTrack(publication.trackSid, true);\n    });\n    this.emit(RoomEvent.ParticipantDisconnected, participant);\n    participant.setDisconnected();\n    this.localParticipant?.handleParticipantDisconnected(participant.identity);\n  }\n\n  // updates are sent only when there's a change to speaker ordering\n  private handleActiveSpeakersUpdate = (speakers: SpeakerInfo[]) =\u003e {\n    const activeSpeakers: Participant[] = [];\n    const seenSids: any = {};\n    speakers.forEach((speaker) =\u003e {\n      seenSids[speaker.sid] = true;\n      if (speaker.sid === this.localParticipant.sid) {\n        this.localParticipant.audioLevel = speaker.level;\n        this.localParticipant.setIsSpeaking(true);\n        activeSpeakers.push(this.localParticipant);\n      } else {\n        const p = this.getRemoteParticipantBySid(speaker.sid);\n        if (p) {\n          p.audioLevel = speaker.level;\n          p.setIsSpeaking(true);\n          activeSpeakers.push(p);\n        }\n      }\n    });\n\n    if (!seenSids[this.localParticipant.sid]) {\n      this.localParticipant.audioLevel = 0;\n      this.localParticipant.setIsSpeaking(false);\n    }\n    this.remoteParticipants.forEach((p) =\u003e {\n      if (!seenSids[p.sid]) {\n        p.audioLevel = 0;\n        p.setIsSpeaking(false);\n      }\n    });\n\n    this.activeSpeakers = activeSpeakers;\n    this.emitWhenConnected(RoomEvent.ActiveSpeakersChanged, activeSpeakers);\n  };\n\n  // process list of changed speakers\n  private handleSpeakersChanged = (speakerUpdates: SpeakerInfo[]) =\u003e {\n    const lastSpeakers = new Map\u003cstring, Participant\u003e();\n    this.activeSpeakers.forEach((p) =\u003e {\n      const remoteParticipant = this.remoteParticipants.get(p.identity);\n      if (remoteParticipant \u0026\u0026 remoteParticipant.sid !== p.sid) {\n        return;\n      }\n      lastSpeakers.set(p.sid, p);\n    });\n    speakerUpdates.forEach((speaker) =\u003e {\n      let p: Participant | undefined = this.getRemoteParticipantBySid(speaker.sid);\n      if (speaker.sid === this.localParticipant.sid) {\n        p = this.localParticipant;\n      }\n      if (!p) {\n        return;\n      }\n      p.audioLevel = speaker.level;\n      p.setIsSpeaking(speaker.active);\n\n      if (speaker.active) {\n        lastSpeakers.set(speaker.sid, p);\n      } else {\n        lastSpeakers.delete(speaker.sid);\n      }\n    });\n    const activeSpeakers = Array.from(lastSpeakers.values());\n    activeSpeakers.sort((a, b) =\u003e b.audioLevel - a.audioLevel);\n    this.activeSpeakers = activeSpeakers;\n    this.emitWhenConnected(RoomEvent.ActiveSpeakersChanged, activeSpeakers);\n  };\n\n  private handleStreamStateUpdate = (streamStateUpdate: StreamStateUpdate) =\u003e {\n    streamStateUpdate.streamStates.forEach((streamState) =\u003e {\n      const participant = this.getRemoteParticipantBySid(streamState.participantSid);\n      if (!participant) {\n        return;\n      }\n      const pub = participant.getTrackPublicationBySid(streamState.trackSid);\n      if (!pub || !pub.track) {\n        return;\n      }\n      const newStreamState = Track.streamStateFromProto(streamState.state);\n      pub.track.setStreamState(newStreamState);\n      if (newStreamState !== pub.track.streamState) {\n        participant.emit(ParticipantEvent.TrackStreamStateChanged, pub, pub.track.streamState);\n        this.emitWhenConnected(\n          RoomEvent.TrackStreamStateChanged,\n          pub,\n          pub.track.streamState,\n          participant,\n        );\n      }\n    });\n  };\n\n  private handleSubscriptionPermissionUpdate = (update: SubscriptionPermissionUpdate) =\u003e {\n    const participant = this.getRemoteParticipantBySid(update.participantSid);\n    if (!participant) {\n      return;\n    }\n    const pub = participant.getTrackPublicationBySid(update.trackSid);\n    if (!pub) {\n      return;\n    }\n\n    pub.setAllowed(update.allowed);\n  };\n\n  private handleSubscriptionError = (update: SubscriptionResponse) =\u003e {\n    const participant = Array.from(this.remoteParticipants.values()).find((p) =\u003e\n      p.trackPublications.has(update.trackSid),\n    );\n    if (!participant) {\n      return;\n    }\n    const pub = participant.getTrackPublicationBySid(update.trackSid);\n    if (!pub) {\n      return;\n    }\n\n    pub.setSubscriptionError(update.err);\n  };\n\n  private handleDataPacket = (packet: DataPacket) =\u003e {\n    // find the participant\n    const participant = this.remoteParticipants.get(packet.participantIdentity);\n    if (packet.value.case === 'user') {\n      this.handleUserPacket(participant, packet.value.value, packet.kind);\n    } else if (packet.value.case === 'transcription') {\n      this.handleTranscription(participant, packet.value.value);\n    } else if (packet.value.case === 'sipDtmf') {\n      this.handleSipDtmf(participant, packet.value.value);\n    } else if (packet.value.case === 'chatMessage') {\n      this.handleChatMessage(participant, packet.value.value);\n    } else if (packet.value.case === 'metrics') {\n      this.handleMetrics(packet.value.value, participant);\n    } else if (\n      packet.value.case === 'streamHeader' ||\n      packet.value.case === 'streamChunk' ||\n      packet.value.case === 'streamTrailer'\n    ) {\n      this.handleDataStream(packet);\n    } else if (packet.value.case === 'rpcRequest') {\n      const rpc = packet.value.value;\n      this.handleIncomingRpcRequest(\n        packet.participantIdentity,\n        rpc.id,\n        rpc.method,\n        rpc.payload,\n        rpc.responseTimeoutMs,\n        rpc.version,\n      );\n    }\n  };\n\n  private handleUserPacket = (\n    participant: RemoteParticipant | undefined,\n    userPacket: UserPacket,\n    kind: DataPacket_Kind,\n  ) =\u003e {\n    this.emit(RoomEvent.DataReceived, userPacket.payload, participant, kind, userPacket.topic);\n\n    // also emit on the participant\n    participant?.emit(ParticipantEvent.DataReceived, userPacket.payload, kind);\n  };\n\n  private handleSipDtmf = (participant: RemoteParticipant | undefined, dtmf: SipDTMF) =\u003e {\n    this.emit(RoomEvent.SipDTMFReceived, dtmf, participant);\n\n    // also emit on the participant\n    participant?.emit(ParticipantEvent.SipDTMFReceived, dtmf);\n  };\n\n  private handleTranscription = (\n    _remoteParticipant: RemoteParticipant | undefined,\n    transcription: TranscriptionModel,\n  ) =\u003e {\n    // find the participant\n    const participant =\n      transcription.transcribedParticipantIdentity === this.localParticipant.identity\n        ? this.localParticipant\n        : this.getParticipantByIdentity(transcription.transcribedParticipantIdentity);\n    const publication = participant?.trackPublications.get(transcription.trackId);\n\n    const segments = extractTranscriptionSegments(transcription, this.transcriptionReceivedTimes);\n\n    publication?.emit(TrackEvent.TranscriptionReceived, segments);\n    participant?.emit(ParticipantEvent.TranscriptionReceived, segments, publication);\n    this.emit(RoomEvent.TranscriptionReceived, segments, participant, publication);\n  };\n\n  private handleChatMessage = (\n    participant: RemoteParticipant | undefined,\n    chatMessage: ChatMessageModel,\n  ) =\u003e {\n    const msg = extractChatMessage(chatMessage);\n    this.emit(RoomEvent.ChatMessage, msg, participant);\n  };\n\n  private handleMetrics = (metrics: MetricsBatch, participant?: Participant) =\u003e {\n    this.emit(RoomEvent.MetricsReceived, metrics, participant);\n  };\n\n  private handleDataStream = (packet: DataPacket) =\u003e {\n    this.incomingDataStreamManager.handleDataStreamPacket(packet);\n  };\n\n  private async handleIncomingRpcRequest(\n    callerIdentity: string,\n    requestId: string,\n    method: string,\n    payload: string,\n    responseTimeout: number,\n    version: number,\n  ) {\n    await this.engine.publishRpcAck(callerIdentity, requestId);\n\n    if (version !== 1) {\n      await this.engine.publishRpcResponse(\n        callerIdentity,\n        requestId,\n        null,\n        RpcError.builtIn('UNSUPPORTED_VERSION'),\n      );\n      return;\n    }\n\n    const handler = this.rpcHandlers.get(method);\n\n    if (!handler) {\n      await this.engine.publishRpcResponse(\n        callerIdentity,\n        requestId,\n        null,\n        RpcError.builtIn('UNSUPPORTED_METHOD'),\n      );\n      return;\n    }\n\n    let responseError: RpcError | null = null;\n    let responsePayload: string | null = null;\n\n    try {\n      const response = await handler({\n        requestId,\n        callerIdentity,\n        payload,\n        responseTimeout,\n      });\n      if (byteLength(response) \u003e MAX_PAYLOAD_BYTES) {\n        responseError = RpcError.builtIn('RESPONSE_PAYLOAD_TOO_LARGE');\n        console.warn(`RPC Response payload too large for ${method}`);\n      } else {\n        responsePayload = response;\n      }\n    } catch (error) {\n      if (error instanceof RpcError) {\n        responseError = error;\n      } else {\n        console.warn(\n          `Uncaught error returned by RPC handler for ${method}. Returning APPLICATION_ERROR instead.`,\n          error,\n        );\n        responseError = RpcError.builtIn('APPLICATION_ERROR');\n      }\n    }\n    await this.engine.publishRpcResponse(callerIdentity, requestId, responsePayload, responseError);\n  }\n\n  bufferedSegments: Map\u003cstring, TranscriptionSegmentModel\u003e = new Map();\n\n  private handleAudioPlaybackStarted = () =\u003e {\n    if (this.canPlaybackAudio) {\n      return;\n    }\n    this.audioEnabled = true;\n    this.emit(RoomEvent.AudioPlaybackStatusChanged, true);\n  };\n\n  private handleAudioPlaybackFailed = (e: any) =\u003e {\n    this.log.warn('could not playback audio', { ...this.logContext, error: e });\n    if (!this.canPlaybackAudio) {\n      return;\n    }\n    this.audioEnabled = false;\n    this.emit(RoomEvent.AudioPlaybackStatusChanged, false);\n  };\n\n  private handleVideoPlaybackStarted = () =\u003e {\n    if (this.isVideoPlaybackBlocked) {\n      this.isVideoPlaybackBlocked = false;\n      this.emit(RoomEvent.VideoPlaybackStatusChanged, true);\n    }\n  };\n\n  private handleVideoPlaybackFailed = () =\u003e {\n    if (!this.isVideoPlaybackBlocked) {\n      this.isVideoPlaybackBlocked = true;\n      this.emit(RoomEvent.VideoPlaybackStatusChanged, false);\n    }\n  };\n\n  /**\n   * attempt to select the default devices if the previously selected devices are no longer available after a device change event\n   */\n  private async selectDefaultDevices() {\n    const previousDevices = DeviceManager.getInstance().previousDevices;\n    // check for available devices, but don't request permissions in order to avoid prompts for kinds that haven't been used before\n    const availableDevices = await DeviceManager.getInstance().getDevices(undefined, false);\n    const browser = getBrowser();\n    if (browser?.name === 'Chrome' \u0026\u0026 browser.os !== 'iOS') {\n      for (let availableDevice of availableDevices) {\n        const previousDevice = previousDevices.find(\n          (info) =\u003e info.deviceId === availableDevice.deviceId,\n        );\n        if (\n          previousDevice \u0026\u0026\n          previousDevice.label !== '' \u0026\u0026\n          previousDevice.kind === availableDevice.kind \u0026\u0026\n          previousDevice.label !== availableDevice.label\n        ) {\n          // label has changed on device the same deviceId, indicating that the default device has changed on the OS level\n          if (this.getActiveDevice(availableDevice.kind) === 'default') {\n            // emit an active device change event only if the selected output device is actually on `default`\n            this.emit(\n              RoomEvent.ActiveDeviceChanged,\n              availableDevice.kind,\n              availableDevice.deviceId,\n            );\n          }\n        }\n      }\n    }\n\n    const kinds: MediaDeviceKind[] = ['audiooutput', 'audioinput', 'videoinput'];\n    for (let kind of kinds) {\n      const targetSource = kindToSource(kind);\n      const targetPublication = this.localParticipant.getTrackPublication(targetSource);\n      if (targetPublication \u0026\u0026 targetPublication.track?.isUserProvided) {\n        // if the track is user provided, we don't want to switch devices on behalf of the user\n        continue;\n      }\n      const devicesOfKind = availableDevices.filter((d) =\u003e d.kind === kind);\n      const activeDevice = this.getActiveDevice(kind);\n\n      if (activeDevice === previousDevices.filter((info) =\u003e info.kind === kind)[0]?.deviceId) {\n        // in  Safari the first device is always the default, so we assume a user on the default device would like to switch to the default once it changes\n        // FF doesn't emit an event when the default device changes, so we perform the same best effort and switch to the new device once connected and if it's the first in the array\n        if (devicesOfKind.length \u003e 0 \u0026\u0026 devicesOfKind[0]?.deviceId !== activeDevice) {\n          await this.switchActiveDevice(kind, devicesOfKind[0].deviceId);\n          continue;\n        }\n      }\n\n      if ((kind === 'audioinput' \u0026\u0026 !isSafariBased()) || kind === 'videoinput') {\n        // airpods on Safari need special handling for audioinput as the track doesn't end as soon as you take them out\n        continue;\n      }\n      // switch to first available device if previously active device is not available any more\n      if (\n        devicesOfKind.length \u003e 0 \u0026\u0026\n        !devicesOfKind.find((deviceInfo) =\u003e deviceInfo.deviceId === this.getActiveDevice(kind)) \u0026\u0026\n        // avoid switching audio output on safari without explicit user action as it leads to slowed down audio playback\n        (kind !== 'audiooutput' || !isSafariBased())\n      ) {\n        await this.switchActiveDevice(kind, devicesOfKind[0].deviceId);\n      }\n    }\n  }\n\n  private handleDeviceChange = async () =\u003e {\n    if (getBrowser()?.os !== 'iOS') {\n      // default devices are non deterministic on iOS, so we don't attempt to select them here\n      await this.selectDefaultDevices();\n    }\n    this.emit(RoomEvent.MediaDevicesChanged);\n  };\n\n  private handleRoomUpdate = (room: RoomModel) =\u003e {\n    const oldRoom = this.roomInfo;\n    this.roomInfo = room;\n    if (oldRoom \u0026\u0026 oldRoom.metadata !== room.metadata) {\n      this.emitWhenConnected(RoomEvent.RoomMetadataChanged, room.metadata);\n    }\n    if (oldRoom?.activeRecording !== room.activeRecording) {\n      this.emitWhenConnected(RoomEvent.RecordingStatusChanged, room.activeRecording);\n    }\n  };\n\n  private handleConnectionQualityUpdate = (update: ConnectionQualityUpdate) =\u003e {\n    update.updates.forEach((info) =\u003e {\n      if (info.participantSid === this.localParticipant.sid) {\n        this.localParticipant.setConnectionQuality(info.quality);\n        return;\n      }\n      const participant = this.getRemoteParticipantBySid(info.participantSid);\n      if (participant) {\n        participant.setConnectionQuality(info.quality);\n      }\n    });\n  };\n\n  private async acquireAudioContext() {\n    if (typeof this.options.webAudioMix !== 'boolean' \u0026\u0026 this.options.webAudioMix.audioContext) {\n      // override audio context with custom audio context if supplied by user\n      this.audioContext = this.options.webAudioMix.audioContext;\n    } else if (!this.audioContext || this.audioContext.state === 'closed') {\n      // by using an AudioContext, it reduces lag on audio elements\n      // https://stackoverflow.com/questions/9811429/html5-audio-tag-on-safari-has-a-delay/54119854#54119854\n      this.audioContext = getNewAudioContext() ?? undefined;\n    }\n\n    if (this.options.webAudioMix) {\n      this.remoteParticipants.forEach((participant) =\u003e\n        participant.setAudioContext(this.audioContext),\n      );\n    }\n\n    this.localParticipant.setAudioContext(this.audioContext);\n\n    if (this.audioContext \u0026\u0026 this.audioContext.state === 'suspended') {\n      // for iOS a newly created AudioContext is always in `suspended` state.\n      // we try our best to resume the context here, if that doesn't work, we just continue with regular processing\n      try {\n        await Promise.race([this.audioContext.resume(), sleep(200)]);\n      } catch (e: any) {\n        this.log.warn('Could not resume audio context', { ...this.logContext, error: e });\n      }\n    }\n\n    const newContextIsRunning = this.audioContext?.state === 'running';\n    if (newContextIsRunning !== this.canPlaybackAudio) {\n      this.audioEnabled = newContextIsRunning;\n      this.emit(RoomEvent.AudioPlaybackStatusChanged, newContextIsRunning);\n    }\n  }\n\n  private createParticipant(identity: string, info?: ParticipantInfo): RemoteParticipant {\n    let participant: RemoteParticipant;\n    if (info) {\n      participant = RemoteParticipant.fromParticipantInfo(this.engine.client, info, {\n        loggerContextCb: () =\u003e this.logContext,\n        loggerName: this.options.loggerName,\n      });\n    } else {\n      participant = new RemoteParticipant(\n        this.engine.client,\n        '',\n        identity,\n        undefined,\n        undefined,\n        undefined,\n        {\n          loggerContextCb: () =\u003e this.logContext,\n          loggerName: this.options.loggerName,\n        },\n      );\n    }\n    if (this.options.webAudioMix) {\n      participant.setAudioContext(this.audioContext);\n    }\n    if (this.options.audioOutput?.deviceId) {\n      participant\n        .setAudioOutput(this.options.audioOutput)\n        .catch((e) =\u003e this.log.warn(`Could not set audio output: ${e.message}`, this.logContext));\n    }\n    return participant;\n  }\n\n  private getOrCreateParticipant(identity: string, info: ParticipantInfo): RemoteParticipant {\n    if (this.remoteParticipants.has(identity)) {\n      const existingParticipant = this.remoteParticipants.get(identity)!;\n      if (info) {\n        const wasUpdated = existingParticipant.updateInfo(info);\n        if (wasUpdated) {\n          this.sidToIdentity.set(info.sid, info.identity);\n        }\n      }\n      return existingParticipant;\n    }\n    const participant = this.createParticipant(identity, info);\n    this.remoteParticipants.set(identity, participant);\n\n    this.sidToIdentity.set(info.sid, info.identity);\n    // if we have valid info and the participant wasn't in the map before, we can assume the participant is new\n    // firing here to make sure that `ParticipantConnected` fires before the initial track events\n    this.emitWhenConnected(RoomEvent.ParticipantConnected, participant);\n\n    // also forward events\n    // trackPublished is only fired for tracks added after both local participant\n    // and remote participant joined the room\n    participant\n      .on(ParticipantEvent.TrackPublished, (trackPublication: RemoteTrackPublication) =\u003e {\n        this.emitWhenConnected(RoomEvent.TrackPublished, trackPublication, participant);\n      })\n      .on(\n        ParticipantEvent.TrackSubscribed,\n        (track: RemoteTrack, publication: RemoteTrackPublication) =\u003e {\n          // monitor playback status\n          if (track.kind === Track.Kind.Audio) {\n            track.on(TrackEvent.AudioPlaybackStarted, this.handleAudioPlaybackStarted);\n            track.on(TrackEvent.AudioPlaybackFailed, this.handleAudioPlaybackFailed);\n          } else if (track.kind === Track.Kind.Video) {\n            track.on(TrackEvent.VideoPlaybackFailed, this.handleVideoPlaybackFailed);\n            track.on(TrackEvent.VideoPlaybackStarted, this.handleVideoPlaybackStarted);\n          }\n          this.emit(RoomEvent.TrackSubscribed, track, publication, participant);\n        },\n      )\n      .on(ParticipantEvent.TrackUnpublished, (publication: RemoteTrackPublication) =\u003e {\n        this.emit(RoomEvent.TrackUnpublished, publication, participant);\n      })\n      .on(\n        ParticipantEvent.TrackUnsubscribed,\n        (track: RemoteTrack, publication: RemoteTrackPublication) =\u003e {\n          this.emit(RoomEvent.TrackUnsubscribed, track, publication, participant);\n        },\n      )\n      .on(ParticipantEvent.TrackMuted, (pub: TrackPublication) =\u003e {\n        this.emitWhenConnected(RoomEvent.TrackMuted, pub, participant);\n      })\n      .on(ParticipantEvent.TrackUnmuted, (pub: TrackPublication) =\u003e {\n        this.emitWhenConnected(RoomEvent.TrackUnmuted, pub, participant);\n      })\n      .on(ParticipantEvent.ParticipantMetadataChanged, (metadata: string | undefined) =\u003e {\n        this.emitWhenConnected(RoomEvent.ParticipantMetadataChanged, metadata, participant);\n      })\n      .on(ParticipantEvent.ParticipantNameChanged, (name) =\u003e {\n        this.emitWhenConnected(RoomEvent.ParticipantNameChanged, name, participant);\n      })\n      .on(ParticipantEvent.AttributesChanged, (changedAttributes: Record\u003cstring, string\u003e) =\u003e {\n        this.emitWhenConnected(\n          RoomEvent.ParticipantAttributesChanged,\n          changedAttributes,\n          participant,\n        );\n      })\n      .on(ParticipantEvent.ConnectionQualityChanged, (quality: ConnectionQuality) =\u003e {\n        this.emitWhenConnected(RoomEvent.ConnectionQualityChanged, quality, participant);\n      })\n      .on(\n        ParticipantEvent.ParticipantPermissionsChanged,\n        (prevPermissions?: ParticipantPermission) =\u003e {\n          this.emitWhenConnected(\n            RoomEvent.ParticipantPermissionsChanged,\n            prevPermissions,\n            participant,\n          );\n        },\n      )\n      .on(ParticipantEvent.TrackSubscriptionStatusChanged, (pub, status) =\u003e {\n        this.emitWhenConnected(RoomEvent.TrackSubscriptionStatusChanged, pub, status, participant);\n      })\n      .on(ParticipantEvent.TrackSubscriptionFailed, (trackSid, error) =\u003e {\n        this.emit(RoomEvent.TrackSubscriptionFailed, trackSid, participant, error);\n      })\n      .on(ParticipantEvent.TrackSubscriptionPermissionChanged, (pub, status) =\u003e {\n        this.emitWhenConnected(\n          RoomEvent.TrackSubscriptionPermissionChanged,\n          pub,\n          status,\n          participant,\n        );\n      })\n      .on(ParticipantEvent.Active, () =\u003e {\n        this.emitWhenConnected(RoomEvent.ParticipantActive, participant);\n        if (participant.kind === ParticipantKind.AGENT) {\n          this.localParticipant.setActiveAgent(participant);\n        }\n      });\n\n    // update info at the end after callbacks have been set up\n    if (info) {\n      participant.updateInfo(info);\n    }\n    return participant;\n  }\n\n  private sendSyncState() {\n    const remoteTracks = Array.from(this.remoteParticipants.values()).reduce((acc, participant) =\u003e {\n      acc.push(...(participant.getTrackPublications() as RemoteTrackPublication[])); // FIXME would be nice to have this return RemoteTrackPublications directly instead of the type cast\n      return acc;\n    }, [] as RemoteTrackPublication[]);\n    const localTracks = this.localParticipant.getTrackPublications() as LocalTrackPublication[]; // FIXME would be nice to have this return LocalTrackPublications directly instead of the type cast\n    this.engine.sendSyncState(remoteTracks, localTracks);\n  }\n\n  /**\n   * After resuming, we'll need to notify the server of the current\n   * subscription settings.\n   */\n  private updateSubscriptions() {\n    for (const p of this.remoteParticipants.values()) {\n      for (const pub of p.videoTrackPublications.values()) {\n        if (pub.isSubscribed \u0026\u0026 isRemotePub(pub)) {\n          pub.emitTrackUpdate();\n        }\n      }\n    }\n  }\n\n  private getRemoteParticipantBySid(sid: string): RemoteParticipant | undefined {\n    const identity = this.sidToIdentity.get(sid);\n    if (identity) {\n      return this.remoteParticipants.get(identity);\n    }\n  }\n\n  private registerConnectionReconcile() {\n    this.clearConnectionReconcile();\n    let consecutiveFailures = 0;\n    this.connectionReconcileInterval = CriticalTimers.setInterval(() =\u003e {\n      if (\n        // ensure we didn't tear it down\n        !this.engine ||\n        // engine detected close, but Room missed it\n        this.engine.isClosed ||\n        // transports failed without notifying engine\n        !this.engine.verifyTransport()\n      ) {\n        consecutiveFailures++;\n        this.log.warn('detected connection state mismatch', {\n          ...this.logContext,\n          numFailures: consecutiveFailures,\n          engine: this.engine\n            ? {\n                closed: this.engine.isClosed,\n                transportsConnected: this.engine.verifyTransport(),\n              }\n            : undefined,\n        });\n        if (consecutiveFailures \u003e= 3) {\n          this.recreateEngine();\n          this.handleDisconnect(\n            this.options.stopLocalTrackOnUnpublish,\n            DisconnectReason.STATE_MISMATCH,\n          );\n        }\n      } else {\n        consecutiveFailures = 0;\n      }\n    }, connectionReconcileFrequency);\n  }\n\n  private clearConnectionReconcile() {\n    if (this.connectionReconcileInterval) {\n      CriticalTimers.clearInterval(this.connectionReconcileInterval);\n    }\n  }\n\n  private setAndEmitConnectionState(state: ConnectionState): boolean {\n    if (state === this.state) {\n      // unchanged\n      return false;\n    }\n    this.state = state;\n    this.emit(RoomEvent.ConnectionStateChanged, this.state);\n    return true;\n  }\n\n  private emitBufferedEvents() {\n    this.bufferedEvents.forEach(([ev, args]) =\u003e {\n      this.emit(ev, ...args);\n    });\n    this.bufferedEvents = [];\n  }\n\n  private emitWhenConnected\u003cE extends keyof RoomEventCallbacks\u003e(\n    event: E,\n    ...args: Parameters\u003cRoomEventCallbacks[E]\u003e\n  ): boolean {\n    if (\n      this.state === ConnectionState.Reconnecting ||\n      this.isResuming ||\n      !this.engine ||\n      this.engine.pendingReconnect\n    ) {\n      // in case the room is reconnecting, buffer the events by firing them later after emitting RoomEvent.Reconnected\n      this.bufferedEvents.push([event, args]);\n    } else if (this.state === ConnectionState.Connected) {\n      return this.emit(event, ...args);\n    }\n    return false;\n  }\n\n  private onLocalParticipantMetadataChanged = (metadata: string | undefined) =\u003e {\n    this.emit(RoomEvent.ParticipantMetadataChanged, metadata, this.localParticipant);\n  };\n\n  private onLocalParticipantNameChanged = (name: string) =\u003e {\n    this.emit(RoomEvent.ParticipantNameChanged, name, this.localParticipant);\n  };\n\n  private onLocalAttributesChanged = (changedAttributes: Record\u003cstring, string\u003e) =\u003e {\n    this.emit(RoomEvent.ParticipantAttributesChanged, changedAttributes, this.localParticipant);\n  };\n\n  private onLocalTrackMuted = (pub: TrackPublication) =\u003e {\n    this.emit(RoomEvent.TrackMuted, pub, this.localParticipant);\n  };\n\n  private onLocalTrackUnmuted = (pub: TrackPublication) =\u003e {\n    this.emit(RoomEvent.TrackUnmuted, pub, this.localParticipant);\n  };\n\n  private onTrackProcessorUpdate = (processor?: TrackProcessor\u003cTrack.Kind, any\u003e) =\u003e {\n    processor?.onPublish?.(this);\n  };\n\n  private onLocalTrackPublished = async (pub: LocalTrackPublication) =\u003e {\n    pub.track?.on(TrackEvent.TrackProcessorUpdate, this.onTrackProcessorUpdate);\n    pub.track?.on(TrackEvent.Restarted, this.onLocalTrackRestarted);\n    pub.track?.getProcessor()?.onPublish?.(this);\n\n    this.emit(RoomEvent.LocalTrackPublished, pub, this.localParticipant);\n\n    if (isLocalAudioTrack(pub.track)) {\n      const trackIsSilent = await pub.track.checkForSilence();\n      if (trackIsSilent) {\n        this.emit(RoomEvent.LocalAudioSilenceDetected, pub);\n      }\n    }\n    const deviceId = await pub.track?.getDeviceId(false);\n    const deviceKind = sourceToKind(pub.source);\n    if (\n      deviceKind \u0026\u0026\n      deviceId \u0026\u0026\n      deviceId !== this.localParticipant.activeDeviceMap.get(deviceKind)\n    ) {\n      this.localParticipant.activeDeviceMap.set(deviceKind, deviceId);\n      this.emit(RoomEvent.ActiveDeviceChanged, deviceKind, deviceId);\n    }\n  };\n\n  private onLocalTrackUnpublished = (pub: LocalTrackPublication) =\u003e {\n    pub.track?.off(TrackEvent.TrackProcessorUpdate, this.onTrackProcessorUpdate);\n    pub.track?.off(TrackEvent.Restarted, this.onLocalTrackRestarted);\n    this.emit(RoomEvent.LocalTrackUnpublished, pub, this.localParticipant);\n  };\n\n  private onLocalTrackRestarted = async (track: LocalTrack) =\u003e {\n    const deviceId = await track.getDeviceId(false);\n    const deviceKind = sourceToKind(track.source);\n    if (\n      deviceKind \u0026\u0026\n      deviceId \u0026\u0026\n      deviceId !== this.localParticipant.activeDeviceMap.get(deviceKind)\n    ) {\n      this.log.debug(\n        `local track restarted, setting ${deviceKind} ${deviceId} active`,\n        this.logContext,\n      );\n      this.localParticipant.activeDeviceMap.set(deviceKind, deviceId);\n      this.emit(RoomEvent.ActiveDeviceChanged, deviceKind, deviceId);\n    }\n  };\n\n  private onLocalConnectionQualityChanged = (quality: ConnectionQuality) =\u003e {\n    this.emit(RoomEvent.ConnectionQualityChanged, quality, this.localParticipant);\n  };\n\n  private onMediaDevicesError = (e: Error, kind?: MediaDeviceKind) =\u003e {\n    this.emit(RoomEvent.MediaDevicesError, e, kind);\n  };\n\n  private onLocalParticipantPermissionsChanged = (prevPermissions?: ParticipantPermission) =\u003e {\n    this.emit(RoomEvent.ParticipantPermissionsChanged, prevPermissions, this.localParticipant);\n  };\n\n  private onLocalChatMessageSent = (msg: ChatMessage) =\u003e {\n    this.emit(RoomEvent.ChatMessage, msg, this.localParticipant);\n  };\n\n  /**\n   * Allows to populate a room with simulated participants.\n   * No actual connection to a server will be established, all state is\n   * @experimental\n   */\n  async simulateParticipants(options: SimulationOptions) {\n    const publishOptions = {\n      audio: true,\n      video: true,\n      useRealTracks: false,\n      ...options.publish,\n    };\n    const participantOptions = {\n      count: 9,\n      audio: false,\n      video: true,\n      aspectRatios: [1.66, 1.7, 1.3],\n      ...options.participants,\n    };\n    this.handleDisconnect();\n    this.roomInfo = new RoomModel({\n      sid: 'RM_SIMULATED',\n      name: 'simulated-room',\n      emptyTimeout: 0,\n      maxParticipants: 0,\n      creationTime: protoInt64.parse(new Date().getTime()),\n      metadata: '',\n      numParticipants: 1,\n      numPublishers: 1,\n      turnPassword: '',\n      enabledCodecs: [],\n      activeRecording: false,\n    });\n\n    this.localParticipant.updateInfo(\n      new ParticipantInfo({\n        identity: 'simulated-local',\n        name: 'local-name',\n      }),\n    );\n    this.setupLocalParticipantEvents();\n    this.emit(RoomEvent.SignalConnected);\n    this.emit(RoomEvent.Connected);\n    this.setAndEmitConnectionState(ConnectionState.Connected);\n    if (publishOptions.video) {\n      const camPub = new LocalTrackPublication(\n        Track.Kind.Video,\n        new TrackInfo({\n          source: TrackSource.CAMERA,\n          sid: Math.floor(Math.random() * 10_000).toString(),\n          type: TrackType.AUDIO,\n          name: 'video-dummy',\n        }),\n        new LocalVideoTrack(\n          publishOptions.useRealTracks\n            ? (\n                await window.navigator.mediaDevices.getUserMedia({ video: true })\n              ).getVideoTracks()[0]\n            : createDummyVideoStreamTrack(\n                160 * (participantOptions.aspectRatios[0] ?? 1),\n                160,\n                true,\n                true,\n              ),\n          undefined,\n          false,\n          { loggerName: this.options.loggerName, loggerContextCb: () =\u003e this.logContext },\n        ),\n        { loggerName: this.options.loggerName, loggerContextCb: () =\u003e this.logContext },\n      );\n      // @ts-ignore\n      this.localParticipant.addTrackPublication(camPub);\n      this.localParticipant.emit(ParticipantEvent.LocalTrackPublished, camPub);\n    }\n    if (publishOptions.audio) {\n      const audioPub = new LocalTrackPublication(\n        Track.Kind.Audio,\n        new TrackInfo({\n          source: TrackSource.MICROPHONE,\n          sid: Math.floor(Math.random() * 10_000).toString(),\n          type: TrackType.AUDIO,\n        }),\n        new LocalAudioTrack(\n          publishOptions.useRealTracks\n            ? (await navigator.mediaDevices.getUserMedia({ audio: true })).getAudioTracks()[0]\n            : getEmptyAudioStreamTrack(),\n          undefined,\n          false,\n          this.audioContext,\n          { loggerName: this.options.loggerName, loggerContextCb: () =\u003e this.logContext },\n        ),\n        { loggerName: this.options.loggerName, loggerContextCb: () =\u003e this.logContext },\n      );\n      // @ts-ignore\n      this.localParticipant.addTrackPublication(audioPub);\n      this.localParticipant.emit(ParticipantEvent.LocalTrackPublished, audioPub);\n    }\n\n    for (let i = 0; i \u003c participantOptions.count - 1; i += 1) {\n      let info: ParticipantInfo = new ParticipantInfo({\n        sid: Math.floor(Math.random() * 10_000).toString(),\n        identity: `simulated-${i}`,\n        state: ParticipantInfo_State.ACTIVE,\n        tracks: [],\n        joinedAt: protoInt64.parse(Date.now()),\n      });\n      const p = this.getOrCreateParticipant(info.identity, info);\n      if (participantOptions.video) {\n        const dummyVideo = createDummyVideoStreamTrack(\n          160 * (participantOptions.aspectRatios[i % participantOptions.aspectRatios.length] ?? 1),\n          160,\n          false,\n          true,\n        );\n        const videoTrack = new TrackInfo({\n          source: TrackSource.CAMERA,\n          sid: Math.floor(Math.random() * 10_000).toString(),\n          type: TrackType.AUDIO,\n        });\n        p.addSubscribedMediaTrack(\n          dummyVideo,\n          videoTrack.sid,\n          new MediaStream([dummyVideo]),\n          new RTCRtpReceiver(),\n        );\n        info.tracks = [...info.tracks, videoTrack];\n      }\n      if (participantOptions.audio) {\n        const dummyTrack = getEmptyAudioStreamTrack();\n        const audioTrack = new TrackInfo({\n          source: TrackSource.MICROPHONE,\n          sid: Math.floor(Math.random() * 10_000).toString(),\n          type: TrackType.AUDIO,\n        });\n        p.addSubscribedMediaTrack(\n          dummyTrack,\n          audioTrack.sid,\n          new MediaStream([dummyTrack]),\n          new RTCRtpReceiver(),\n        );\n        info.tracks = [...info.tracks, audioTrack];\n      }\n\n      p.updateInfo(info);\n    }\n  }\n\n  // /** @internal */\n  emit\u003cE extends keyof RoomEventCallbacks\u003e(\n    event: E,\n    ...args: Parameters\u003cRoomEventCallbacks[E]\u003e\n  ): boolean {\n    // active speaker updates are too spammy\n    if (event !== RoomEvent.ActiveSpeakersChanged \u0026\u0026 event !== RoomEvent.TranscriptionReceived) {\n      // only extract logContext from arguments in order to avoid logging the whole object tree\n      const minimizedArgs = mapArgs(args).filter((arg: unknown) =\u003e arg !== undefined);\n      this.log.debug(`room event ${event}`, { ...this.logContext, event, args: minimizedArgs });\n    }\n    return super.emit(event, ...args);\n  }\n}\n\nfunction mapArgs(args: unknown[]): any {\n  return args.map((arg: unknown) =\u003e {\n    if (!arg) {\n      return;\n    }\n    if (Array.isArray(arg)) {\n      return mapArgs(arg);\n    }\n    if (typeof arg === 'object') {\n      return 'logContext' in arg ? arg.logContext : undefined;\n    }\n    return arg;\n  });\n}\n\nexport default Room;\n\nexport type RoomEventCallbacks = {\n  connected: () =\u003e void;\n  reconnecting: () =\u003e void;\n  signalReconnecting: () =\u003e void;\n  reconnected: () =\u003e void;\n  disconnected: (reason?: DisconnectReason) =\u003e void;\n  connectionStateChanged: (state: ConnectionState) =\u003e void;\n  moved: (name: string) =\u003e void;\n  mediaDevicesChanged: () =\u003e void;\n  participantConnected: (participant: RemoteParticipant) =\u003e void;\n  participantDisconnected: (participant: RemoteParticipant) =\u003e void;\n  trackPublished: (publication: RemoteTrackPublication, participant: RemoteParticipant) =\u003e void;\n  trackSubscribed: (\n    track: RemoteTrack,\n    publication: RemoteTrackPublication,\n    participant: RemoteParticipant,\n  ) =\u003e void;\n  trackSubscriptionFailed: (\n    trackSid: string,\n    participant: RemoteParticipant,\n    reason?: SubscriptionError,\n  ) =\u003e void;\n  trackUnpublished: (publication: RemoteTrackPublication, participant: RemoteParticipant) =\u003e void;\n  trackUnsubscribed: (\n    track: RemoteTrack,\n    publication: RemoteTrackPublication,\n    participant: RemoteParticipant,\n  ) =\u003e void;\n  trackMuted: (publication: TrackPublication, participant: Participant) =\u003e void;\n  trackUnmuted: (publication: TrackPublication, participant: Participant) =\u003e void;\n  localTrackPublished: (publication: LocalTrackPublication, participant: LocalParticipant) =\u003e void;\n  localTrackUnpublished: (\n    publication: LocalTrackPublication,\n    participant: LocalParticipant,\n  ) =\u003e void;\n  localAudioSilenceDetected: (publication: LocalTrackPublication) =\u003e void;\n  participantMetadataChanged: (\n    metadata: string | undefined,\n    participant: RemoteParticipant | LocalParticipant,\n  ) =\u003e void;\n  participantNameChanged: (name: string, participant: RemoteParticipant | LocalParticipant) =\u003e void;\n  participantPermissionsChanged: (\n    prevPermissions: ParticipantPermission | undefined,\n    participant: RemoteParticipant | LocalParticipant,\n  ) =\u003e void;\n  participantAttributesChanged: (\n    changedAttributes: Record\u003cstring, string\u003e,\n    participant: RemoteParticipant | LocalParticipant,\n  ) =\u003e void;\n  activeSpeakersChanged: (speakers: Array\u003cParticipant\u003e) =\u003e void;\n  roomMetadataChanged: (metadata: string) =\u003e void;\n  dataReceived: (\n    payload: Uint8Array,\n    participant?: RemoteParticipant,\n    kind?: DataPacket_Kind,\n    topic?: string,\n  ) =\u003e void;\n  sipDTMFReceived: (dtmf: SipDTMF, participant?: RemoteParticipant) =\u003e void;\n  transcriptionReceived: (\n    transcription: TranscriptionSegment[],\n    participant?: Participant,\n    publication?: TrackPublication,\n  ) =\u003e void;\n  connectionQualityChanged: (quality: ConnectionQuality, participant: Participant) =\u003e void;\n  mediaDevicesError: (error: Error, kind?: MediaDeviceKind) =\u003e void;\n  trackStreamStateChanged: (\n    publication: RemoteTrackPublication,\n    streamState: Track.StreamState,\n    participant: RemoteParticipant,\n  ) =\u003e void;\n  trackSubscriptionPermissionChanged: (\n    publication: RemoteTrackPublication,\n    status: TrackPublication.PermissionStatus,\n    participant: RemoteParticipant,\n  ) =\u003e void;\n  trackSubscriptionStatusChanged: (\n    publication: RemoteTrackPublication,\n    status: TrackPublication.SubscriptionStatus,\n    participant: RemoteParticipant,\n  ) =\u003e void;\n  audioPlaybackChanged: (playing: boolean) =\u003e void;\n  videoPlaybackChanged: (playing: boolean) =\u003e void;\n  signalConnected: () =\u003e void;\n  recordingStatusChanged: (recording: boolean) =\u003e void;\n  participantEncryptionStatusChanged: (encrypted: boolean, participant?: Participant) =\u003e void;\n  encryptionError: (error: Error) =\u003e void;\n  dcBufferStatusChanged: (isLow: boolean, kind: DataPacket_Kind) =\u003e void;\n  activeDeviceChanged: (kind: MediaDeviceKind, deviceId: string) =\u003e void;\n  chatMessage: (message: ChatMessage, participant?: RemoteParticipant | LocalParticipant) =\u003e void;\n  localTrackSubscribed: (publication: LocalTrackPublication, participant: LocalParticipant) =\u003e void;\n  metricsReceived: (metrics: MetricsBatch, participant?: Participant) =\u003e void;\n  participantActive: (participant: Participant) =\u003e void;\n};\n","// This file was generated from JSON Schema using quicktype, do not modify it directly.\n// The code generation lives at https://github.com/livekit/attribute-definitions\n//\n// To parse this data:\n//\n//   import { Convert, AgentAttributes, TranscriptionAttributes } from \"./file\";\n//\n//   const agentAttributes = Convert.toAgentAttributes(json);\n//   const transcriptionAttributes = Convert.toTranscriptionAttributes(json);\n\nexport interface AgentAttributes {\n  'lk.agent.inputs'?: AgentInput[];\n  'lk.agent.outputs'?: AgentOutput[];\n  'lk.agent.state'?: AgentState;\n  'lk.publish_on_behalf'?: string;\n  [property: string]: any;\n}\n\nexport type AgentInput = 'audio' | 'video' | 'text';\n\nexport type AgentOutput = 'transcription' | 'audio';\n\nexport type AgentState = 'idle' | 'initializing' | 'listening' | 'thinking' | 'speaking';\n\n/**\n * Schema for transcription-related attributes\n */\nexport interface TranscriptionAttributes {\n  /**\n   * The segment id of the transcription\n   */\n  'lk.segment_id'?: string;\n  /**\n   * The associated track id of the transcription\n   */\n  'lk.transcribed_track_id'?: string;\n  /**\n   * Whether the transcription is final\n   */\n  'lk.transcription_final'?: boolean;\n  [property: string]: any;\n}\n\n// Converts JSON strings to/from your types\nexport class Convert {\n  public static toAgentAttributes(json: string): AgentAttributes {\n    return JSON.parse(json);\n  }\n\n  public static agentAttributesToJson(value: AgentAttributes): string {\n    return JSON.stringify(value);\n  }\n\n  public static toTranscriptionAttributes(json: string): TranscriptionAttributes {\n    return JSON.parse(json);\n  }\n\n  public static transcriptionAttributesToJson(value: TranscriptionAttributes): string {\n    return JSON.stringify(value);\n  }\n}\n","import { EventEmitter } from 'events';\nimport type TypedEmitter from 'typed-emitter';\nimport type { RoomConnectOptions, RoomOptions } from '../../options';\nimport type RTCEngine from '../../room/RTCEngine';\nimport Room, { ConnectionState } from '../../room/Room';\nimport { RoomEvent } from '../../room/events';\nimport type { SimulationScenario } from '../../room/types';\nimport { sleep } from '../../room/utils';\n\ntype LogMessage = {\n  level: 'info' | 'warning' | 'error';\n  message: string;\n};\n\nexport enum CheckStatus {\n  IDLE,\n  RUNNING,\n  SKIPPED,\n  SUCCESS,\n  FAILED,\n}\n\nexport type CheckInfo = {\n  name: string;\n  logs: Array\u003cLogMessage\u003e;\n  status: CheckStatus;\n  description: string;\n  data?: any;\n};\n\nexport interface CheckerOptions {\n  errorsAsWarnings?: boolean;\n  roomOptions?: RoomOptions;\n  connectOptions?: RoomConnectOptions;\n  protocol?: 'udp' | 'tcp';\n}\n\nexport abstract class Checker extends (EventEmitter as new () =\u003e TypedEmitter\u003cCheckerCallbacks\u003e) {\n  protected url: string;\n\n  protected token: string;\n\n  room: Room;\n\n  connectOptions?: RoomConnectOptions;\n\n  status: CheckStatus = CheckStatus.IDLE;\n\n  logs: Array\u003cLogMessage\u003e = [];\n\n  name: string;\n\n  options: CheckerOptions = {};\n\n  constructor(url: string, token: string, options: CheckerOptions = {}) {\n    super();\n    this.url = url;\n    this.token = token;\n    this.name = this.constructor.name;\n    this.room = new Room(options.roomOptions);\n    this.connectOptions = options.connectOptions;\n    this.options = options;\n  }\n\n  abstract get description(): string;\n\n  protected abstract perform(): Promise\u003cvoid\u003e;\n\n  async run(onComplete?: () =\u003e void) {\n    if (this.status !== CheckStatus.IDLE) {\n      throw Error('check is running already');\n    }\n    this.setStatus(CheckStatus.RUNNING);\n\n    try {\n      await this.perform();\n    } catch (err) {\n      if (err instanceof Error) {\n        if (this.options.errorsAsWarnings) {\n          this.appendWarning(err.message);\n        } else {\n          this.appendError(err.message);\n        }\n      }\n    }\n\n    await this.disconnect();\n\n    // sleep for a bit to ensure disconnect\n    await new Promise((resolve) =\u003e setTimeout(resolve, 500));\n\n    // @ts-ignore\n    if (this.status !== CheckStatus.SKIPPED) {\n      this.setStatus(this.isSuccess() ? CheckStatus.SUCCESS : CheckStatus.FAILED);\n    }\n\n    if (onComplete) {\n      onComplete();\n    }\n    return this.getInfo();\n  }\n\n  protected isSuccess(): boolean {\n    return !this.logs.some((l) =\u003e l.level === 'error');\n  }\n\n  protected async connect(url?: string): Promise\u003cRoom\u003e {\n    if (this.room.state === ConnectionState.Connected) {\n      return this.room;\n    }\n    if (!url) {\n      url = this.url;\n    }\n    await this.room.connect(url, this.token, this.connectOptions);\n    return this.room;\n  }\n\n  protected async disconnect() {\n    if (this.room \u0026\u0026 this.room.state !== ConnectionState.Disconnected) {\n      await this.room.disconnect();\n      // wait for it to go through\n      await new Promise((resolve) =\u003e setTimeout(resolve, 500));\n    }\n  }\n\n  protected skip() {\n    this.setStatus(CheckStatus.SKIPPED);\n  }\n\n  protected async switchProtocol(protocol: 'udp' | 'tcp' | 'tls') {\n    let hasReconnecting = false;\n    let hasReconnected = false;\n    this.room.on(RoomEvent.Reconnecting, () =\u003e {\n      hasReconnecting = true;\n    });\n    this.room.once(RoomEvent.Reconnected, () =\u003e {\n      hasReconnected = true;\n    });\n    this.room.simulateScenario(`force-${protocol}` as SimulationScenario);\n    await new Promise((resolve) =\u003e setTimeout(resolve, 1000));\n    if (!hasReconnecting) {\n      // no need to wait for reconnection\n      return;\n    }\n\n    // wait for 10 seconds for reconnection\n    const timeout = Date.now() + 10000;\n    while (Date.now() \u003c timeout) {\n      if (hasReconnected) {\n        return;\n      }\n      await sleep(100);\n    }\n    throw new Error(`Could not reconnect using ${protocol} protocol after 10 seconds`);\n  }\n\n  protected appendMessage(message: string) {\n    this.logs.push({ level: 'info', message });\n    this.emit('update', this.getInfo());\n  }\n\n  protected appendWarning(message: string) {\n    this.logs.push({ level: 'warning', message });\n    this.emit('update', this.getInfo());\n  }\n\n  protected appendError(message: string) {\n    this.logs.push({ level: 'error', message });\n    this.emit('update', this.getInfo());\n  }\n\n  protected setStatus(status: CheckStatus) {\n    this.status = status;\n    this.emit('update', this.getInfo());\n  }\n\n  protected get engine(): RTCEngine | undefined {\n    return this.room?.engine;\n  }\n\n  getInfo(): CheckInfo {\n    return {\n      logs: this.logs,\n      name: this.name,\n      status: this.status,\n      description: this.description,\n    };\n  }\n}\nexport type InstantiableCheck\u003cT extends Checker\u003e = {\n  new (url: string, token: string, options?: CheckerOptions): T;\n};\n\ntype CheckerCallbacks = {\n  update: (info: CheckInfo) =\u003e void;\n};\n","import { RegionUrlProvider } from '../../room/RegionUrlProvider';\nimport { type CheckInfo, Checker } from './Checker';\n\nexport interface RegionStats {\n  region: string;\n  rtt: number;\n  duration: number;\n}\n\n/**\n * Checks for connections quality to closests Cloud regions and determining the best quality\n */\nexport class CloudRegionCheck extends Checker {\n  private bestStats?: RegionStats;\n\n  get description(): string {\n    return 'Cloud regions';\n  }\n\n  async perform(): Promise\u003cvoid\u003e {\n    const regionProvider = new RegionUrlProvider(this.url, this.token);\n    if (!regionProvider.isCloud()) {\n      this.skip();\n      return;\n    }\n\n    const regionStats: RegionStats[] = [];\n    const seenUrls: Set\u003cstring\u003e = new Set();\n    for (let i = 0; i \u003c 3; i++) {\n      const regionUrl = await regionProvider.getNextBestRegionUrl();\n      if (!regionUrl) {\n        break;\n      }\n      if (seenUrls.has(regionUrl)) {\n        continue;\n      }\n      seenUrls.add(regionUrl);\n      const stats = await this.checkCloudRegion(regionUrl);\n      this.appendMessage(`${stats.region} RTT: ${stats.rtt}ms, duration: ${stats.duration}ms`);\n      regionStats.push(stats);\n    }\n\n    regionStats.sort((a, b) =\u003e {\n      return (a.duration - b.duration) * 0.5 + (a.rtt - b.rtt) * 0.5;\n    });\n    const bestRegion = regionStats[0];\n    this.bestStats = bestRegion;\n    this.appendMessage(`best Cloud region: ${bestRegion.region}`);\n  }\n\n  getInfo(): CheckInfo {\n    const info = super.getInfo();\n    info.data = this.bestStats;\n    return info;\n  }\n\n  private async checkCloudRegion(url: string): Promise\u003cRegionStats\u003e {\n    await this.connect(url);\n    if (this.options.protocol === 'tcp') {\n      await this.switchProtocol('tcp');\n    }\n    const region = this.room.serverInfo?.region;\n    if (!region) {\n      throw new Error('Region not found');\n    }\n\n    const writer = await this.room.localParticipant.streamText({ topic: 'test' });\n    const chunkSize = 1000; // each chunk is about 1000 bytes\n    const totalSize = 1_000_000; // approximately 1MB of data\n    const numChunks = totalSize / chunkSize; // will yield 1000 chunks\n    const chunkData = 'A'.repeat(chunkSize); // create a string of 1000 'A' characters\n\n    const startTime = Date.now();\n    for (let i = 0; i \u003c numChunks; i++) {\n      await writer.write(chunkData);\n    }\n    await writer.close();\n    const endTime = Date.now();\n    const stats = await this.room.engine.pcManager?.publisher.getStats();\n    const regionStats: RegionStats = {\n      region: region,\n      rtt: 10000,\n      duration: endTime - startTime,\n    };\n    stats?.forEach((stat) =\u003e {\n      if (stat.type === 'candidate-pair' \u0026\u0026 stat.nominated) {\n        regionStats.rtt = stat.currentRoundTripTime * 1000;\n      }\n    });\n\n    await this.disconnect();\n    return regionStats;\n  }\n}\n","import { type CheckInfo, Checker } from './Checker';\n\nexport interface ProtocolStats {\n  protocol: 'udp' | 'tcp';\n  packetsLost: number;\n  packetsSent: number;\n  qualityLimitationDurations: Record\u003cstring, number\u003e;\n  // total metrics measure sum of all measurements, along with a count\n  rttTotal: number;\n  jitterTotal: number;\n  bitrateTotal: number;\n  count: number;\n}\n\nconst TEST_DURATION = 10000;\n\nexport class ConnectionProtocolCheck extends Checker {\n  private bestStats?: ProtocolStats;\n\n  get description(): string {\n    return 'Connection via UDP vs TCP';\n  }\n\n  async perform(): Promise\u003cvoid\u003e {\n    const udpStats = await this.checkConnectionProtocol('udp');\n    const tcpStats = await this.checkConnectionProtocol('tcp');\n    this.bestStats = udpStats;\n    // udp should is the better protocol typically. however, we'd prefer TCP when either of these conditions are true:\n    // 1. the bandwidth limitation is worse on UDP by 500ms\n    // 2. the packet loss is higher on UDP by 1%\n    if (\n      udpStats.qualityLimitationDurations.bandwidth -\n        tcpStats.qualityLimitationDurations.bandwidth \u003e\n        0.5 ||\n      (udpStats.packetsLost - tcpStats.packetsLost) / udpStats.packetsSent \u003e 0.01\n    ) {\n      this.appendMessage('best connection quality via tcp');\n      this.bestStats = tcpStats;\n    } else {\n      this.appendMessage('best connection quality via udp');\n    }\n\n    const stats = this.bestStats;\n    this.appendMessage(\n      `upstream bitrate: ${(stats.bitrateTotal / stats.count / 1000 / 1000).toFixed(2)} mbps`,\n    );\n    this.appendMessage(`RTT: ${((stats.rttTotal / stats.count) * 1000).toFixed(2)} ms`);\n    this.appendMessage(`jitter: ${((stats.jitterTotal / stats.count) * 1000).toFixed(2)} ms`);\n\n    if (stats.packetsLost \u003e 0) {\n      this.appendWarning(\n        `packets lost: ${((stats.packetsLost / stats.packetsSent) * 100).toFixed(2)}%`,\n      );\n    }\n    if (stats.qualityLimitationDurations.bandwidth \u003e 1) {\n      this.appendWarning(\n        `bandwidth limited ${((stats.qualityLimitationDurations.bandwidth / (TEST_DURATION / 1000)) * 100).toFixed(2)}%`,\n      );\n    }\n    if (stats.qualityLimitationDurations.cpu \u003e 0) {\n      this.appendWarning(\n        `cpu limited ${((stats.qualityLimitationDurations.cpu / (TEST_DURATION / 1000)) * 100).toFixed(2)}%`,\n      );\n    }\n  }\n\n  getInfo(): CheckInfo {\n    const info = super.getInfo();\n    info.data = this.bestStats;\n    return info;\n  }\n\n  private async checkConnectionProtocol(protocol: 'tcp' | 'udp'): Promise\u003cProtocolStats\u003e {\n    await this.connect();\n    if (protocol === 'tcp') {\n      await this.switchProtocol('tcp');\n    } else {\n      await this.switchProtocol('udp');\n    }\n\n    // create a canvas with animated content\n    const canvas = document.createElement('canvas');\n    canvas.width = 1280;\n    canvas.height = 720;\n    const ctx = canvas.getContext('2d');\n    if (!ctx) {\n      throw new Error('Could not get canvas context');\n    }\n\n    let hue = 0;\n    const animate = () =\u003e {\n      hue = (hue + 1) % 360;\n      ctx.fillStyle = `hsl(${hue}, 100%, 50%)`;\n      ctx.fillRect(0, 0, canvas.width, canvas.height);\n      requestAnimationFrame(animate);\n    };\n    animate();\n\n    // create video track from canvas\n    const stream = canvas.captureStream(30); // 30fps\n    const videoTrack = stream.getVideoTracks()[0];\n\n    // publish to room\n    const pub = await this.room.localParticipant.publishTrack(videoTrack, {\n      simulcast: false,\n      degradationPreference: 'maintain-resolution',\n      videoEncoding: {\n        maxBitrate: 2000000,\n      },\n    });\n    const track = pub!.track!;\n\n    const protocolStats: ProtocolStats = {\n      protocol,\n      packetsLost: 0,\n      packetsSent: 0,\n      qualityLimitationDurations: {},\n      rttTotal: 0,\n      jitterTotal: 0,\n      bitrateTotal: 0,\n      count: 0,\n    };\n    // gather stats once a second\n    const interval = setInterval(async () =\u003e {\n      const stats = await track.getRTCStatsReport();\n      stats?.forEach((stat) =\u003e {\n        if (stat.type === 'outbound-rtp') {\n          protocolStats.packetsSent = stat.packetsSent;\n          protocolStats.qualityLimitationDurations = stat.qualityLimitationDurations;\n          protocolStats.bitrateTotal += stat.targetBitrate;\n          protocolStats.count++;\n        } else if (stat.type === 'remote-inbound-rtp') {\n          protocolStats.packetsLost = stat.packetsLost;\n          protocolStats.rttTotal += stat.roundTripTime;\n          protocolStats.jitterTotal += stat.jitter;\n        }\n      });\n    }, 1000);\n\n    // wait a bit to gather stats\n    await new Promise((resolve) =\u003e setTimeout(resolve, TEST_DURATION));\n    clearInterval(interval);\n\n    videoTrack.stop();\n    canvas.remove();\n    await this.disconnect();\n    return protocolStats;\n  }\n}\n","import { createLocalAudioTrack } from '../../room/track/create';\nimport { detectSilence } from '../../room/track/utils';\nimport { Checker } from './Checker';\n\nexport class PublishAudioCheck extends Checker {\n  get description(): string {\n    return 'Can publish audio';\n  }\n\n  async perform(): Promise\u003cvoid\u003e {\n    const room = await this.connect();\n\n    const track = await createLocalAudioTrack();\n\n    const trackIsSilent = await detectSilence(track, 1000);\n    if (trackIsSilent) {\n      throw new Error('unable to detect audio from microphone');\n    }\n    this.appendMessage('detected audio from microphone');\n\n    room.localParticipant.publishTrack(track);\n    // wait for a few seconds to publish\n    await new Promise((resolve) =\u003e setTimeout(resolve, 3000));\n\n    // verify RTC stats that it's publishing\n    const stats = await track.sender?.getStats();\n    if (!stats) {\n      throw new Error('Could not get RTCStats');\n    }\n    let numPackets = 0;\n    stats.forEach((stat) =\u003e {\n      if (\n        stat.type === 'outbound-rtp' \u0026\u0026\n        (stat.kind === 'audio' || (!stat.kind \u0026\u0026 stat.mediaType === 'audio'))\n      ) {\n        numPackets = stat.packetsSent;\n      }\n    });\n    if (numPackets === 0) {\n      throw new Error('Could not determine packets are sent');\n    }\n    this.appendMessage(`published ${numPackets} audio packets`);\n  }\n}\n","import { createLocalVideoTrack } from '../../room/track/create';\nimport { Checker } from './Checker';\n\nexport class PublishVideoCheck extends Checker {\n  get description(): string {\n    return 'Can publish video';\n  }\n\n  async perform(): Promise\u003cvoid\u003e {\n    const room = await this.connect();\n\n    const track = await createLocalVideoTrack();\n\n    // check if we have video from camera\n    await this.checkForVideo(track.mediaStreamTrack);\n\n    room.localParticipant.publishTrack(track);\n    // wait for a few seconds to publish\n    await new Promise((resolve) =\u003e setTimeout(resolve, 5000));\n\n    // verify RTC stats that it's publishing\n    const stats = await track.sender?.getStats();\n    if (!stats) {\n      throw new Error('Could not get RTCStats');\n    }\n    let numPackets = 0;\n    stats.forEach((stat) =\u003e {\n      if (\n        stat.type === 'outbound-rtp' \u0026\u0026\n        (stat.kind === 'video' || (!stat.kind \u0026\u0026 stat.mediaType === 'video'))\n      ) {\n        numPackets += stat.packetsSent;\n      }\n    });\n    if (numPackets === 0) {\n      throw new Error('Could not determine packets are sent');\n    }\n    this.appendMessage(`published ${numPackets} video packets`);\n  }\n\n  async checkForVideo(track: MediaStreamTrack) {\n    const stream = new MediaStream();\n    stream.addTrack(track.clone());\n\n    // Create video element to check frames\n    const video = document.createElement('video');\n    video.srcObject = stream;\n    video.muted = true;\n\n    await new Promise\u003cvoid\u003e((resolve) =\u003e {\n      video.onplay = () =\u003e {\n        setTimeout(() =\u003e {\n          const canvas = document.createElement('canvas');\n          const settings = track.getSettings();\n          const width = settings.width ?? video.videoWidth ?? 1280;\n          const height = settings.height ?? video.videoHeight ?? 720;\n          canvas.width = width;\n          canvas.height = height;\n          const ctx = canvas.getContext('2d')!;\n\n          // Draw video frame to canvas\n          ctx.drawImage(video, 0, 0);\n\n          // Get image data and check if all pixels are black\n          const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);\n          const data = imageData.data;\n          let isAllBlack = true;\n          for (let i = 0; i \u003c data.length; i += 4) {\n            if (data[i] !== 0 || data[i + 1] !== 0 || data[i + 2] !== 0) {\n              isAllBlack = false;\n              break;\n            }\n          }\n\n          if (isAllBlack) {\n            this.appendError('camera appears to be producing only black frames');\n          } else {\n            this.appendMessage('received video frames');\n          }\n          resolve();\n        }, 1000);\n      };\n      video.play();\n    });\n\n    stream.getTracks().forEach((t) =\u003e t.stop());\n    video.remove();\n  }\n}\n","import { ConnectionState } from '../../room/Room';\nimport { RoomEvent } from '../../room/events';\nimport { Checker } from './Checker';\n\nexport class ReconnectCheck extends Checker {\n  get description(): string {\n    return 'Resuming connection after interruption';\n  }\n\n  async perform(): Promise\u003cvoid\u003e {\n    const room = await this.connect();\n    let reconnectingTriggered = false;\n    let reconnected = false;\n\n    let reconnectResolver: (value: unknown) =\u003e void;\n    const reconnectTimeout = new Promise((resolve) =\u003e {\n      setTimeout(resolve, 5000);\n      reconnectResolver = resolve;\n    });\n\n    const handleReconnecting = () =\u003e {\n      reconnectingTriggered = true;\n    };\n\n    room\n      .on(RoomEvent.SignalReconnecting, handleReconnecting)\n      .on(RoomEvent.Reconnecting, handleReconnecting)\n      .on(RoomEvent.Reconnected, () =\u003e {\n        reconnected = true;\n        reconnectResolver(true);\n      });\n\n    room.engine.client.ws?.close();\n    const onClose = room.engine.client.onClose;\n    if (onClose) {\n      onClose('');\n    }\n\n    await reconnectTimeout;\n\n    if (!reconnectingTriggered) {\n      throw new Error('Did not attempt to reconnect');\n    } else if (!reconnected || room.state !== ConnectionState.Connected) {\n      this.appendWarning('reconnection is only possible in Redis-based configurations');\n      throw new Error('Not able to reconnect');\n    }\n  }\n}\n","import { SignalClient } from '../../api/SignalClient';\nimport { Checker } from './Checker';\n\nexport class TURNCheck extends Checker {\n  get description(): string {\n    return 'Can connect via TURN';\n  }\n\n  async perform(): Promise\u003cvoid\u003e {\n    const signalClient = new SignalClient();\n    const joinRes = await signalClient.join(this.url, this.token, {\n      autoSubscribe: true,\n      maxRetries: 0,\n      e2eeEnabled: false,\n      websocketTimeout: 15_000,\n    });\n\n    let hasTLS = false;\n    let hasTURN = false;\n    let hasSTUN = false;\n\n    for (let iceServer of joinRes.iceServers) {\n      for (let url of iceServer.urls) {\n        if (url.startsWith('turn:')) {\n          hasTURN = true;\n          hasSTUN = true;\n        } else if (url.startsWith('turns:')) {\n          hasTURN = true;\n          hasSTUN = true;\n          hasTLS = true;\n        }\n        if (url.startsWith('stun:')) {\n          hasSTUN = true;\n        }\n      }\n    }\n    if (!hasSTUN) {\n      this.appendWarning('No STUN servers configured on server side.');\n    } else if (hasTURN \u0026\u0026 !hasTLS) {\n      this.appendWarning('TURN is configured server side, but TURN/TLS is unavailable.');\n    }\n    await signalClient.close();\n    if (this.connectOptions?.rtcConfig?.iceServers || hasTURN) {\n      await this.room!.connect(this.url, this.token, {\n        rtcConfig: {\n          iceTransportPolicy: 'relay',\n        },\n      });\n    } else {\n      this.appendWarning('No TURN servers configured.');\n      this.skip();\n      await new Promise((resolve) =\u003e setTimeout(resolve, 0));\n    }\n  }\n}\n","import log from '../../logger';\nimport { RoomEvent } from '../../room/events';\nimport { Checker } from './Checker';\n\nexport class WebRTCCheck extends Checker {\n  get description(): string {\n    return 'Establishing WebRTC connection';\n  }\n\n  protected async perform(): Promise\u003cvoid\u003e {\n    let hasTcp = false;\n    let hasIpv4Udp = false;\n    this.room.on(RoomEvent.SignalConnected, () =\u003e {\n      const prevTrickle = this.room.engine.client.onTrickle;\n\n      const candidates: RTCIceCandidate[] = [];\n      this.room.engine.client.onTrickle = (sd, target) =\u003e {\n        if (sd.candidate) {\n          const candidate = new RTCIceCandidate(sd);\n          candidates.push(candidate);\n          let str = `${candidate.protocol} ${candidate.address}:${candidate.port} ${candidate.type}`;\n          if (candidate.address) {\n            if (isIPPrivate(candidate.address)) {\n              str += ' (private)';\n            } else {\n              if (candidate.protocol === 'tcp' \u0026\u0026 candidate.tcpType === 'passive') {\n                hasTcp = true;\n                str += ' (passive)';\n              } else if (candidate.protocol === 'udp') {\n                hasIpv4Udp = true;\n              }\n            }\n          }\n          this.appendMessage(str);\n        }\n        if (prevTrickle) {\n          prevTrickle(sd, target);\n        }\n      };\n\n      if (this.room.engine.pcManager) {\n        this.room.engine.pcManager.subscriber.onIceCandidateError = (ev) =\u003e {\n          if (ev instanceof RTCPeerConnectionIceErrorEvent) {\n            this.appendWarning(\n              `error with ICE candidate: ${ev.errorCode} ${ev.errorText} ${ev.url}`,\n            );\n          }\n        };\n      }\n    });\n    try {\n      await this.connect();\n      log.info('now the room is connected');\n    } catch (err) {\n      this.appendWarning('ports need to be open on firewall in order to connect.');\n      throw err;\n    }\n    if (!hasTcp) {\n      this.appendWarning('Server is not configured for ICE/TCP');\n    }\n    if (!hasIpv4Udp) {\n      this.appendWarning(\n        'No public IPv4 UDP candidates were found. Your server is likely not configured correctly',\n      );\n    }\n  }\n}\n\nfunction isIPPrivate(address: string): boolean {\n  const parts = address.split('.');\n  if (parts.length === 4) {\n    if (parts[0] === '10') {\n      return true;\n    } else if (parts[0] === '192' \u0026\u0026 parts[1] === '168') {\n      return true;\n    } else if (parts[0] === '172') {\n      const second = parseInt(parts[1], 10);\n      if (second \u003e= 16 \u0026\u0026 second \u003c= 31) {\n        return true;\n      }\n    }\n  }\n  return false;\n}\n","import { ServerInfo_Edition } from '@livekit/protocol';\nimport { SignalClient } from '../../api/SignalClient';\nimport { Checker } from './Checker';\n\nexport class WebSocketCheck extends Checker {\n  get description(): string {\n    return 'Connecting to signal connection via WebSocket';\n  }\n\n  protected async perform(): Promise\u003cvoid\u003e {\n    if (this.url.startsWith('ws:') || this.url.startsWith('http:')) {\n      this.appendWarning('Server is insecure, clients may block connections to it');\n    }\n\n    let signalClient = new SignalClient();\n    const joinRes = await signalClient.join(this.url, this.token, {\n      autoSubscribe: true,\n      maxRetries: 0,\n      e2eeEnabled: false,\n      websocketTimeout: 15_000,\n    });\n    this.appendMessage(`Connected to server, version ${joinRes.serverVersion}.`);\n    if (joinRes.serverInfo?.edition === ServerInfo_Edition.Cloud \u0026\u0026 joinRes.serverInfo?.region) {\n      this.appendMessage(`LiveKit Cloud: ${joinRes.serverInfo?.region}`);\n    }\n    await signalClient.close();\n  }\n}\n","import { EventEmitter } from 'events';\nimport type TypedEmitter from 'typed-emitter';\nimport type { CheckInfo, CheckerOptions, InstantiableCheck } from './checks/Checker';\nimport { CheckStatus, Checker } from './checks/Checker';\nimport { CloudRegionCheck } from './checks/cloudRegion';\nimport { ConnectionProtocolCheck, type ProtocolStats } from './checks/connectionProtocol';\nimport { PublishAudioCheck } from './checks/publishAudio';\nimport { PublishVideoCheck } from './checks/publishVideo';\nimport { ReconnectCheck } from './checks/reconnect';\nimport { TURNCheck } from './checks/turn';\nimport { WebRTCCheck } from './checks/webrtc';\nimport { WebSocketCheck } from './checks/websocket';\n\nexport type { CheckInfo, CheckStatus };\n\nexport class ConnectionCheck extends (EventEmitter as new () =\u003e TypedEmitter\u003cConnectionCheckCallbacks\u003e) {\n  token: string;\n\n  url: string;\n\n  options: CheckerOptions = {};\n\n  private checkResults: Map\u003cnumber, CheckInfo\u003e = new Map();\n\n  constructor(url: string, token: string, options: CheckerOptions = {}) {\n    super();\n    this.url = url;\n    this.token = token;\n    this.options = options;\n  }\n\n  private getNextCheckId() {\n    const nextId = this.checkResults.size;\n    this.checkResults.set(nextId, {\n      logs: [],\n      status: CheckStatus.IDLE,\n      name: '',\n      description: '',\n    });\n    return nextId;\n  }\n\n  private updateCheck(checkId: number, info: CheckInfo) {\n    this.checkResults.set(checkId, info);\n    this.emit('checkUpdate', checkId, info);\n  }\n\n  isSuccess() {\n    return Array.from(this.checkResults.values()).every((r) =\u003e r.status !== CheckStatus.FAILED);\n  }\n\n  getResults() {\n    return Array.from(this.checkResults.values());\n  }\n\n  async createAndRunCheck\u003cT extends Checker\u003e(check: InstantiableCheck\u003cT\u003e) {\n    const checkId = this.getNextCheckId();\n    const test = new check(this.url, this.token, this.options);\n    const handleUpdate = (info: CheckInfo) =\u003e {\n      this.updateCheck(checkId, info);\n    };\n    test.on('update', handleUpdate);\n    const result = await test.run();\n    test.off('update', handleUpdate);\n    return result;\n  }\n\n  async checkWebsocket() {\n    return this.createAndRunCheck(WebSocketCheck);\n  }\n\n  async checkWebRTC() {\n    return this.createAndRunCheck(WebRTCCheck);\n  }\n\n  async checkTURN() {\n    return this.createAndRunCheck(TURNCheck);\n  }\n\n  async checkReconnect() {\n    return this.createAndRunCheck(ReconnectCheck);\n  }\n\n  async checkPublishAudio() {\n    return this.createAndRunCheck(PublishAudioCheck);\n  }\n\n  async checkPublishVideo() {\n    return this.createAndRunCheck(PublishVideoCheck);\n  }\n\n  async checkConnectionProtocol() {\n    const info = await this.createAndRunCheck(ConnectionProtocolCheck);\n    if (info.data \u0026\u0026 'protocol' in info.data) {\n      const stats = info.data as ProtocolStats;\n      this.options.protocol = stats.protocol;\n    }\n    return info;\n  }\n\n  async checkCloudRegion() {\n    return this.createAndRunCheck(CloudRegionCheck);\n  }\n}\n\ntype ConnectionCheckCallbacks = {\n  checkUpdate: (id: number, info: CheckInfo) =\u003e void;\n};\n","import log from '../../logger';\nimport { isLocalTrack } from '../utils';\nimport LocalTrack from './LocalTrack';\nimport type { VideoCaptureOptions } from './options';\n\ntype FacingMode = NonNullable\u003cVideoCaptureOptions['facingMode']\u003e;\ntype FacingModeFromLocalTrackOptions = {\n  /**\n   * If no facing mode can be determined, this value will be used.\n   * @defaultValue 'user'\n   */\n  defaultFacingMode?: FacingMode;\n};\ntype FacingModeFromLocalTrackReturnValue = {\n  /**\n   * The (probable) facingMode of the track.\n   * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackConstraints/facingMode | MDN docs on facingMode}\n   */\n  facingMode: FacingMode;\n  /**\n   * The confidence that the returned facingMode is correct.\n   */\n  confidence: 'high' | 'medium' | 'low';\n};\n\n/**\n * Try to analyze the local track to determine the facing mode of a track.\n *\n * @remarks\n * There is no property supported by all browsers to detect whether a video track originated from a user- or environment-facing camera device.\n * For this reason, we use the `facingMode` property when available, but will fall back on a string-based analysis of the device label to determine the facing mode.\n * If both methods fail, the default facing mode will be used.\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackConstraints/facingMode | MDN docs on facingMode}\n * @experimental\n */\nexport function facingModeFromLocalTrack(\n  localTrack: LocalTrack | MediaStreamTrack,\n  options: FacingModeFromLocalTrackOptions = {},\n): FacingModeFromLocalTrackReturnValue {\n  const track = isLocalTrack(localTrack) ? localTrack.mediaStreamTrack : localTrack;\n  const trackSettings = track.getSettings();\n  let result: FacingModeFromLocalTrackReturnValue = {\n    facingMode: options.defaultFacingMode ?? 'user',\n    confidence: 'low',\n  };\n\n  // 1. Try to get facingMode from track settings.\n  if ('facingMode' in trackSettings) {\n    const rawFacingMode = trackSettings.facingMode;\n    log.trace('rawFacingMode', { rawFacingMode });\n    if (rawFacingMode \u0026\u0026 typeof rawFacingMode === 'string' \u0026\u0026 isFacingModeValue(rawFacingMode)) {\n      result = { facingMode: rawFacingMode, confidence: 'high' };\n    }\n  }\n\n  // 2. If we don't have a high confidence we try to get the facing mode from the device label.\n  if (['low', 'medium'].includes(result.confidence)) {\n    log.trace(`Try to get facing mode from device label: (${track.label})`);\n    const labelAnalysisResult = facingModeFromDeviceLabel(track.label);\n    if (labelAnalysisResult !== undefined) {\n      result = labelAnalysisResult;\n    }\n  }\n\n  return result;\n}\n\nconst knownDeviceLabels = new Map\u003cstring, FacingModeFromLocalTrackReturnValue\u003e([\n  ['obs virtual camera', { facingMode: 'environment', confidence: 'medium' }],\n]);\nconst knownDeviceLabelSections = new Map\u003cstring, FacingModeFromLocalTrackReturnValue\u003e([\n  ['iphone', { facingMode: 'environment', confidence: 'medium' }],\n  ['ipad', { facingMode: 'environment', confidence: 'medium' }],\n]);\n/**\n * Attempt to analyze the device label to determine the facing mode.\n *\n * @experimental\n */\nexport function facingModeFromDeviceLabel(\n  deviceLabel: string,\n): FacingModeFromLocalTrackReturnValue | undefined {\n  const label = deviceLabel.trim().toLowerCase();\n  // Empty string is a valid device label but we can't infer anything from it.\n  if (label === '') {\n    return undefined;\n  }\n\n  // Can we match against widely known device labels.\n  if (knownDeviceLabels.has(label)) {\n    return knownDeviceLabels.get(label);\n  }\n\n  // Can we match against sections of the device label.\n  return Array.from(knownDeviceLabelSections.entries()).find(([section]) =\u003e\n    label.includes(section),\n  )?.[1];\n}\n\nfunction isFacingModeValue(item: string): item is FacingMode {\n  const allowedValues: FacingMode[] = ['user', 'environment', 'left', 'right'];\n  return item === undefined || allowedValues.includes(item as FacingMode);\n}\n","import { ConnectionQuality as ConnectionQuality$1, ParticipantEvent, RoomEvent, ConnectionState, Track, createLocalAudioTrack, TrackEvent, Room, VideoPresets, supportsDynacast, supportsAdaptiveStream } from 'livekit-client';\nimport { EventEmitter } from 'events';\nimport WebRTCIssueDetector from 'webrtc-issue-detector';\n\n/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\n\r\nfunction __awaiter(thisArg, _arguments, P, generator) {\r\n    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n    return new (P || (P = Promise))(function (resolve, reject) {\r\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n    });\r\n}\r\n\r\ntypeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n    var e = new Error(message);\r\n    return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\n\nvar SessionEvent;\n(function (SessionEvent) {\n    SessionEvent[\"SESSION_STATE_CHANGED\"] = \"session.state_changed\";\n    SessionEvent[\"SESSION_STREAM_READY\"] = \"session.stream_ready\";\n    SessionEvent[\"SESSION_CONNECTION_QUALITY_CHANGED\"] = \"session.connection_quality_changed\";\n    SessionEvent[\"SESSION_DISCONNECTED\"] = \"session.disconnected\";\n})(SessionEvent || (SessionEvent = {}));\nvar AgentEventsEnum;\n(function (AgentEventsEnum) {\n    AgentEventsEnum[\"SESSION_UPDATED\"] = \"session.updated\";\n    AgentEventsEnum[\"SESSION_STATE_UPDATED\"] = \"session.state_updated\";\n    AgentEventsEnum[\"USER_SPEAK_STARTED\"] = \"user.speak_started\";\n    AgentEventsEnum[\"USER_SPEAK_ENDED\"] = \"user.speak_ended\";\n    AgentEventsEnum[\"USER_TRANSCRIPTION\"] = \"user.transcription\";\n    AgentEventsEnum[\"USER_TRANSCRIPTION_CHUNK\"] = \"user.transcription.chunk\";\n    AgentEventsEnum[\"AVATAR_TRANSCRIPTION\"] = \"avatar.transcription\";\n    AgentEventsEnum[\"AVATAR_TRANSCRIPTION_CHUNK\"] = \"avatar.transcription.chunk\";\n    AgentEventsEnum[\"AVATAR_SPEAK_STARTED\"] = \"avatar.speak_started\";\n    AgentEventsEnum[\"AVATAR_SPEAK_ENDED\"] = \"avatar.speak_ended\";\n    AgentEventsEnum[\"ELEVENLABS_AGENT_EVENT\"] = \"elevenlabs_agent_event\";\n    AgentEventsEnum[\"SESSION_STOPPED\"] = \"session.stopped\";\n})(AgentEventsEnum || (AgentEventsEnum = {}));\nconst getAgentEventEmitArgs = (event) =\u003e {\n    if (\"event_type\" in event) {\n        switch (event.event_type) {\n            case AgentEventsEnum.USER_SPEAK_STARTED: {\n                const payload = {\n                    event_id: event.event_id,\n                    event_type: event.event_type,\n                    source_event_id: event.source_event_id,\n                    session_id: event.session_id,\n                };\n                return [AgentEventsEnum.USER_SPEAK_STARTED, payload];\n            }\n            case AgentEventsEnum.USER_SPEAK_ENDED: {\n                const payload = {\n                    event_id: event.event_id,\n                    event_type: event.event_type,\n                    source_event_id: event.source_event_id,\n                    session_id: event.session_id,\n                };\n                return [AgentEventsEnum.USER_SPEAK_ENDED, payload];\n            }\n            case AgentEventsEnum.USER_TRANSCRIPTION: {\n                const payload = {\n                    event_id: event.event_id,\n                    event_type: event.event_type,\n                    source_event_id: event.source_event_id,\n                    session_id: event.session_id,\n                    text: event.text,\n                };\n                return [AgentEventsEnum.USER_TRANSCRIPTION, payload];\n            }\n            case AgentEventsEnum.USER_TRANSCRIPTION_CHUNK: {\n                const payload = {\n                    event_id: event.event_id,\n                    event_type: event.event_type,\n                    source_event_id: event.source_event_id,\n                    session_id: event.session_id,\n                    text: event.text,\n                };\n                return [AgentEventsEnum.USER_TRANSCRIPTION_CHUNK, payload];\n            }\n            case AgentEventsEnum.AVATAR_SPEAK_STARTED: {\n                const payload = {\n                    event_id: event.event_id,\n                    event_type: event.event_type,\n                    source_event_id: event.source_event_id,\n                    session_id: event.session_id,\n                };\n                return [AgentEventsEnum.AVATAR_SPEAK_STARTED, payload];\n            }\n            case AgentEventsEnum.AVATAR_SPEAK_ENDED: {\n                const payload = {\n                    event_id: event.event_id,\n                    event_type: event.event_type,\n                    source_event_id: event.source_event_id,\n                    session_id: event.session_id,\n                };\n                return [AgentEventsEnum.AVATAR_SPEAK_ENDED, payload];\n            }\n            case AgentEventsEnum.AVATAR_TRANSCRIPTION: {\n                const payload = {\n                    event_id: event.event_id,\n                    event_type: event.event_type,\n                    source_event_id: event.source_event_id,\n                    session_id: event.session_id,\n                    text: event.text,\n                };\n                return [AgentEventsEnum.AVATAR_TRANSCRIPTION, payload];\n            }\n            case AgentEventsEnum.AVATAR_TRANSCRIPTION_CHUNK: {\n                const payload = {\n                    event_id: event.event_id,\n                    event_type: event.event_type,\n                    source_event_id: event.source_event_id,\n                    session_id: event.session_id,\n                    text: event.text,\n                };\n                return [AgentEventsEnum.AVATAR_TRANSCRIPTION_CHUNK, payload];\n            }\n            case AgentEventsEnum.ELEVENLABS_AGENT_EVENT: {\n                const payload = {\n                    event_id: event.event_id,\n                    event_type: event.event_type,\n                    source_event_id: event.source_event_id,\n                    session_id: event.session_id,\n                    elevenlabs_event_type: event.elevenlabs_event_type,\n                    data: event.data,\n                };\n                return [AgentEventsEnum.ELEVENLABS_AGENT_EVENT, payload];\n            }\n            case AgentEventsEnum.SESSION_STOPPED: {\n                const payload = {\n                    event_id: event.event_id,\n                    event_type: event.event_type,\n                    source_event_id: event.source_event_id,\n                    session_id: event.session_id,\n                    stop_reason: event.stop_reason,\n                };\n                return [AgentEventsEnum.SESSION_STOPPED, payload];\n            }\n            default:\n                console.warn(\"Received event type:\", event === null || event === void 0 ? void 0 : event.event_type);\n                console.warn(\"New unsupported event type\");\n                return null;\n        }\n    }\n    return null;\n};\nvar CommandEventsEnum;\n(function (CommandEventsEnum) {\n    CommandEventsEnum[\"SESSION_UPDATE\"] = \"session.update\";\n    CommandEventsEnum[\"SESSION_STOP\"] = \"session.stop\";\n    CommandEventsEnum[\"AVATAR_INTERRUPT\"] = \"avatar.interrupt\";\n    // AVATAR_INTERRUPT_VIDEO = \"avatar.interrupt_video\",\n    CommandEventsEnum[\"AVATAR_SPEAK_TEXT\"] = \"avatar.speak_text\";\n    CommandEventsEnum[\"AVATAR_SPEAK_RESPONSE\"] = \"avatar.speak_response\";\n    CommandEventsEnum[\"AVATAR_SPEAK_AUDIO\"] = \"avatar.speak_audio\";\n    CommandEventsEnum[\"AVATAR_START_LISTENING\"] = \"avatar.start_listening\";\n    CommandEventsEnum[\"AVATAR_STOP_LISTENING\"] = \"avatar.stop_listening\";\n    CommandEventsEnum[\"ELEVENLABS_AGENT_COMMAND\"] = \"elevenlabs_agent_command\";\n})(CommandEventsEnum || (CommandEventsEnum = {}));\nvar ElevenLabsAgentCommandType;\n(function (ElevenLabsAgentCommandType) {\n    ElevenLabsAgentCommandType[\"USER_MESSAGE\"] = \"user_message\";\n    ElevenLabsAgentCommandType[\"CONTEXTUAL_UPDATE\"] = \"contextual_update\";\n    ElevenLabsAgentCommandType[\"USER_ACTIVITY\"] = \"user_activity\";\n    ElevenLabsAgentCommandType[\"CLIENT_TOOL_RESULT\"] = \"client_tool_result\";\n})(ElevenLabsAgentCommandType || (ElevenLabsAgentCommandType = {}));\n\nvar SessionMode;\n(function (SessionMode) {\n    SessionMode[\"FULL\"] = \"FULL\";\n    SessionMode[\"LITE\"] = \"LITE\";\n})(SessionMode || (SessionMode = {}));\nvar AgentType;\n(function (AgentType) {\n    AgentType[\"FULL\"] = \"FULL\";\n    AgentType[\"OPENAI_REALTIME\"] = \"OPENAI_REALTIME\";\n    AgentType[\"ELEVENLABS_AGENT\"] = \"ELEVENLABS_AGENT\";\n    AgentType[\"GEMINI_REALTIME\"] = \"GEMINI_REALTIME\";\n    AgentType[\"UNKNOWN\"] = \"UNKNOWN\";\n})(AgentType || (AgentType = {}));\nvar SessionState;\n(function (SessionState) {\n    SessionState[\"INACTIVE\"] = \"INACTIVE\";\n    SessionState[\"CONNECTING\"] = \"CONNECTING\";\n    SessionState[\"CONNECTED\"] = \"CONNECTED\";\n    SessionState[\"DISCONNECTING\"] = \"DISCONNECTING\";\n    SessionState[\"DISCONNECTED\"] = \"DISCONNECTED\";\n})(SessionState || (SessionState = {}));\nvar SessionDisconnectReason;\n(function (SessionDisconnectReason) {\n    SessionDisconnectReason[\"UNKNOWN_REASON\"] = \"UNKNOWN_REASON\";\n    SessionDisconnectReason[\"CLIENT_INITIATED\"] = \"CLIENT_INITIATED\";\n    SessionDisconnectReason[\"SESSION_START_FAILED\"] = \"SESSION_START_FAILED\";\n    SessionDisconnectReason[\"SERVER_INITIATED\"] = \"SERVER_INITIATED\";\n})(SessionDisconnectReason || (SessionDisconnectReason = {}));\nvar Language;\n(function (Language) {\n    Language[\"af\"] = \"af\";\n    Language[\"sq\"] = \"sq\";\n    Language[\"am\"] = \"am\";\n    Language[\"ar\"] = \"ar\";\n    Language[\"hy\"] = \"hy\";\n    Language[\"as\"] = \"as\";\n    Language[\"ast\"] = \"ast\";\n    Language[\"az\"] = \"az\";\n    Language[\"ba\"] = \"ba\";\n    Language[\"eu\"] = \"eu\";\n    Language[\"be\"] = \"be\";\n    Language[\"bn\"] = \"bn\";\n    Language[\"bs\"] = \"bs\";\n    Language[\"br\"] = \"br\";\n    Language[\"bg\"] = \"bg\";\n    Language[\"my\"] = \"my\";\n    Language[\"ca\"] = \"ca\";\n    Language[\"ceb\"] = \"ceb\";\n    Language[\"zh\"] = \"zh\";\n    Language[\"hr\"] = \"hr\";\n    Language[\"cs\"] = \"cs\";\n    Language[\"da\"] = \"da\";\n    Language[\"nl\"] = \"nl\";\n    Language[\"en\"] = \"en\";\n    Language[\"et\"] = \"et\";\n    Language[\"fo\"] = \"fo\";\n    Language[\"fi\"] = \"fi\";\n    Language[\"fr\"] = \"fr\";\n    Language[\"fy\"] = \"fy\";\n    Language[\"ff\"] = \"ff\";\n    Language[\"gd\"] = \"gd\";\n    Language[\"gl\"] = \"gl\";\n    Language[\"lg\"] = \"lg\";\n    Language[\"ka\"] = \"ka\";\n    Language[\"de\"] = \"de\";\n    Language[\"el\"] = \"el\";\n    Language[\"gu\"] = \"gu\";\n    Language[\"ht\"] = \"ht\";\n    Language[\"ha\"] = \"ha\";\n    Language[\"haw\"] = \"haw\";\n    Language[\"he\"] = \"he\";\n    Language[\"hi\"] = \"hi\";\n    Language[\"hu\"] = \"hu\";\n    Language[\"is\"] = \"is\";\n    Language[\"ig\"] = \"ig\";\n    Language[\"ilo\"] = \"ilo\";\n    Language[\"id\"] = \"id\";\n    Language[\"ga\"] = \"ga\";\n    Language[\"it\"] = \"it\";\n    Language[\"ja\"] = \"ja\";\n    Language[\"jv\"] = \"jv\";\n    Language[\"kn\"] = \"kn\";\n    Language[\"kk\"] = \"kk\";\n    Language[\"km\"] = \"km\";\n    Language[\"ko\"] = \"ko\";\n    Language[\"lo\"] = \"lo\";\n    Language[\"la\"] = \"la\";\n    Language[\"lv\"] = \"lv\";\n    Language[\"lb\"] = \"lb\";\n    Language[\"ln\"] = \"ln\";\n    Language[\"lt\"] = \"lt\";\n    Language[\"mk\"] = \"mk\";\n    Language[\"mg\"] = \"mg\";\n    Language[\"ms\"] = \"ms\";\n    Language[\"ml\"] = \"ml\";\n    Language[\"mt\"] = \"mt\";\n    Language[\"mi\"] = \"mi\";\n    Language[\"mr\"] = \"mr\";\n    Language[\"mo\"] = \"mo\";\n    Language[\"mn\"] = \"mn\";\n    Language[\"ne\"] = \"ne\";\n    Language[\"no\"] = \"no\";\n    Language[\"nn\"] = \"nn\";\n    Language[\"oc\"] = \"oc\";\n    Language[\"or\"] = \"or\";\n    Language[\"pa\"] = \"pa\";\n    Language[\"ps\"] = \"ps\";\n    Language[\"fa\"] = \"fa\";\n    Language[\"pl\"] = \"pl\";\n    Language[\"pt\"] = \"pt\";\n    Language[\"ro\"] = \"ro\";\n    Language[\"ru\"] = \"ru\";\n    Language[\"sa\"] = \"sa\";\n    Language[\"sr\"] = \"sr\";\n    Language[\"sn\"] = \"sn\";\n    Language[\"sd\"] = \"sd\";\n    Language[\"si\"] = \"si\";\n    Language[\"sk\"] = \"sk\";\n    Language[\"sl\"] = \"sl\";\n    Language[\"so\"] = \"so\";\n    Language[\"es\"] = \"es\";\n    Language[\"su\"] = \"su\";\n    Language[\"sw\"] = \"sw\";\n    Language[\"ss\"] = \"ss\";\n    Language[\"sv\"] = \"sv\";\n    Language[\"tl\"] = \"tl\";\n    Language[\"tg\"] = \"tg\";\n    Language[\"ta\"] = \"ta\";\n    Language[\"tt\"] = \"tt\";\n    Language[\"te\"] = \"te\";\n    Language[\"th\"] = \"th\";\n    Language[\"bo\"] = \"bo\";\n    Language[\"tn\"] = \"tn\";\n    Language[\"tr\"] = \"tr\";\n    Language[\"tk\"] = \"tk\";\n    Language[\"uk\"] = \"uk\";\n    Language[\"ur\"] = \"ur\";\n    Language[\"uz\"] = \"uz\";\n    Language[\"vi\"] = \"vi\";\n    Language[\"cy\"] = \"cy\";\n    Language[\"wo\"] = \"wo\";\n    Language[\"xh\"] = \"xh\";\n    Language[\"yi\"] = \"yi\";\n    Language[\"yo\"] = \"yo\";\n    Language[\"zu\"] = \"zu\";\n})(Language || (Language = {}));\n\nvar ConnectionQuality;\n(function (ConnectionQuality) {\n    ConnectionQuality[\"UNKNOWN\"] = \"UNKNOWN\";\n    ConnectionQuality[\"GOOD\"] = \"GOOD\";\n    ConnectionQuality[\"BAD\"] = \"BAD\";\n})(ConnectionQuality || (ConnectionQuality = {}));\n\nclass AbstractConnectionQualityIndicator {\n    constructor(onConnectionQualityChanged) {\n        this._connectionQuality = ConnectionQuality.UNKNOWN;\n        this.onConnectionQualityChanged = onConnectionQualityChanged;\n    }\n    get connectionQuality() {\n        return this._connectionQuality;\n    }\n    handleStatsChanged() {\n        const newConnectionQuality = this.calculateConnectionQuality();\n        if (newConnectionQuality !== this._connectionQuality) {\n            this._connectionQuality = newConnectionQuality;\n            this.onConnectionQualityChanged(newConnectionQuality);\n        }\n    }\n    start(params) {\n        this.stop(true);\n        this._start(params);\n    }\n    stop(muted = false) {\n        this._stop();\n        this._connectionQuality = ConnectionQuality.UNKNOWN;\n        if (!muted) {\n            this.onConnectionQualityChanged(ConnectionQuality.UNKNOWN);\n        }\n    }\n}\nfunction QualityIndicatorComposite(...configs) {\n    class CombinedQualityIndicator extends AbstractConnectionQualityIndicator {\n        constructor(onConnectionQualityChanged) {\n            super(onConnectionQualityChanged);\n            this.childTrackers = configs.map(({ getParams, TrackerClass }) =\u003e ({\n                tracker: new TrackerClass(() =\u003e this.handleStatsChanged()),\n                getParams,\n            }));\n        }\n        calculateConnectionQuality() {\n            const connectionQualities = this.childTrackers.map(({ tracker }) =\u003e tracker.connectionQuality);\n            if (connectionQualities.some((quality) =\u003e quality === ConnectionQuality.BAD)) {\n                return ConnectionQuality.BAD;\n            }\n            if (connectionQualities.every((quality) =\u003e quality === ConnectionQuality.UNKNOWN)) {\n                return ConnectionQuality.UNKNOWN;\n            }\n            return ConnectionQuality.GOOD;\n        }\n        _start(params) {\n            this.childTrackers.forEach(({ tracker, getParams }) =\u003e tracker.start(getParams(params)));\n        }\n        _stop() {\n            this.childTrackers.forEach(({ tracker }) =\u003e tracker.stop(true));\n        }\n    }\n    return CombinedQualityIndicator;\n}\n\nclass LiveKitConnectionQualityIndicator extends AbstractConnectionQualityIndicator {\n    constructor() {\n        super(...arguments);\n        this.room = null;\n        this.liveKitConnectionQuality = ConnectionQuality$1.Unknown;\n        this.liveKitConnectionState = null;\n        this.handleConnectionQualityChanged = (quality) =\u003e {\n            this.liveKitConnectionQuality = quality;\n            this.handleStatsChanged();\n        };\n        this.handleConnectionStateChanged = (state) =\u003e {\n            this.liveKitConnectionState = state;\n            this.handleStatsChanged();\n        };\n    }\n    _start(room) {\n        this.room = room;\n        this.room.localParticipant.on(ParticipantEvent.ConnectionQualityChanged, this.handleConnectionQualityChanged);\n        this.room.on(RoomEvent.ConnectionStateChanged, this.handleConnectionStateChanged);\n    }\n    _stop() {\n        if (this.room) {\n            this.room.localParticipant.off(ParticipantEvent.ConnectionQualityChanged, this.handleConnectionQualityChanged);\n            this.room.off(RoomEvent.ConnectionStateChanged, this.handleConnectionStateChanged);\n        }\n    }\n    calculateConnectionQuality() {\n        if ([ConnectionQuality$1.Lost, ConnectionQuality$1.Poor].includes(this.liveKitConnectionQuality)) {\n            return ConnectionQuality.BAD;\n        }\n        if (this.liveKitConnectionState \u0026\u0026\n            [\n                ConnectionState.Disconnected,\n                ConnectionState.Reconnecting,\n                ConnectionState.SignalReconnecting,\n            ].includes(this.liveKitConnectionState)) {\n            return ConnectionQuality.BAD;\n        }\n        return ConnectionQuality.GOOD;\n    }\n}\n\nclass WebRTCConnectionQualityIndicator extends AbstractConnectionQualityIndicator {\n    constructor() {\n        super(...arguments);\n        this.issueDetector = null;\n        this.mosScores = null;\n    }\n    _start(peerConnection) {\n        this.issueDetector = new WebRTCIssueDetector({\n            autoAddPeerConnections: false,\n            getStatsInterval: 3000,\n            onNetworkScoresUpdated: (scores) =\u003e {\n                this.mosScores = scores;\n                this.handleStatsChanged();\n            },\n        });\n        this.issueDetector.handleNewPeerConnection(peerConnection);\n    }\n    _stop() {\n        if (this.issueDetector) {\n            this.issueDetector.stopWatchingNewPeerConnections();\n            this.issueDetector = null;\n        }\n        this.mosScores = null;\n    }\n    calculateConnectionQuality() {\n        if (!this.mosScores ||\n            (!this.mosScores.inbound \u0026\u0026 !this.mosScores.outbound)) {\n            return ConnectionQuality.UNKNOWN;\n        }\n        if ((this.mosScores.inbound \u0026\u0026 this.mosScores.inbound \u003c 3) ||\n            (this.mosScores.outbound \u0026\u0026 this.mosScores.outbound \u003c 3)) {\n            return ConnectionQuality.BAD;\n        }\n        return ConnectionQuality.GOOD;\n    }\n}\n\nconst ConnectionQualityIndicator = QualityIndicatorComposite({\n    TrackerClass: LiveKitConnectionQualityIndicator,\n    getParams: (room) =\u003e room,\n}, {\n    TrackerClass: WebRTCConnectionQualityIndicator,\n    getParams: (room) =\u003e { var _a; return ((_a = room.engine.pcManager) === null || _a === void 0 ? void 0 : _a.subscriber)._pc; },\n});\n\nvar VoiceChatEvent;\n(function (VoiceChatEvent) {\n    VoiceChatEvent[\"MUTED\"] = \"MUTED\";\n    VoiceChatEvent[\"UNMUTED\"] = \"UNMUTED\";\n    // DEVICE_CHANGED = \"DEVICE_CHANGED\",\n    VoiceChatEvent[\"STATE_CHANGED\"] = \"STATE_CHANGED\";\n})(VoiceChatEvent || (VoiceChatEvent = {}));\nvar PushToTalkCommandEvent;\n(function (PushToTalkCommandEvent) {\n    PushToTalkCommandEvent[\"START\"] = \"user.start_push_to_talk\";\n    PushToTalkCommandEvent[\"STOP\"] = \"user.stop_push_to_talk\";\n})(PushToTalkCommandEvent || (PushToTalkCommandEvent = {}));\nvar PushToTalkServerEvent;\n(function (PushToTalkServerEvent) {\n    PushToTalkServerEvent[\"START_SUCCESS\"] = \"user.push_to_talk_started\";\n    PushToTalkServerEvent[\"START_FAILED\"] = \"user.push_to_talk_start_failed\";\n    PushToTalkServerEvent[\"STOP_SUCCESS\"] = \"user.push_to_talk_stopped\";\n    PushToTalkServerEvent[\"STOP_FAILED\"] = \"user.push_to_talk_stop_failed\";\n})(PushToTalkServerEvent || (PushToTalkServerEvent = {}));\n\nvar VoiceChatState;\n(function (VoiceChatState) {\n    VoiceChatState[\"INACTIVE\"] = \"INACTIVE\";\n    VoiceChatState[\"STARTING\"] = \"STARTING\";\n    VoiceChatState[\"ACTIVE\"] = \"ACTIVE\";\n})(VoiceChatState || (VoiceChatState = {}));\nvar SessionInteractivityMode;\n(function (SessionInteractivityMode) {\n    SessionInteractivityMode[\"CONVERSATIONAL\"] = \"CONVERSATIONAL\";\n    SessionInteractivityMode[\"PUSH_TO_TALK\"] = \"PUSH_TO_TALK\";\n})(SessionInteractivityMode || (SessionInteractivityMode = {}));\n\nconst LIVEKIT_COMMAND_CHANNEL_TOPIC = \"agent-control\";\nconst LIVEKIT_SERVER_RESPONSE_CHANNEL_TOPIC = \"agent-response\";\nconst API_URL = \"https://api.liveavatar.com\";\n\nconst initEventPromise = (room, eventType, rejectionEventType) =\u003e {\n    return new Promise((resolve, reject) =\u003e {\n        const messageHandler = (roomMessage, _, __, topic) =\u003e {\n            if (topic !== LIVEKIT_SERVER_RESPONSE_CHANNEL_TOPIC) {\n                return;\n            }\n            let eventData = null;\n            try {\n                const messageString = new TextDecoder().decode(roomMessage);\n                eventData = JSON.parse(messageString);\n            }\n            catch (_a) {\n                return;\n            }\n            if (eventData \u0026\u0026 \"event_type\" in eventData) {\n                const type = eventData.event_type;\n                if (type === eventType || type === rejectionEventType) {\n                    room.removeListener(RoomEvent.DataReceived, messageHandler);\n                    const isRejection = type === rejectionEventType;\n                    if (isRejection) {\n                        reject();\n                    }\n                    else {\n                        resolve();\n                    }\n                }\n            }\n        };\n        room.on(RoomEvent.DataReceived, messageHandler);\n    });\n};\n\nclass VoiceChat extends EventEmitter {\n    constructor(room) {\n        super();\n        this._state = VoiceChatState.INACTIVE;\n        this.track = null;\n        this.mode = null;\n        this.pushToTalkStarted = false;\n        this.room = room;\n    }\n    get isConnected() {\n        return (this.room.state !== ConnectionState.Disconnected \u0026\u0026\n            this.room.state !== ConnectionState.Connecting);\n    }\n    setMode(mode) {\n        if (this.mode) {\n            console.warn(\"Voice chat mode can only be set once\");\n            return;\n        }\n        this.mode = mode;\n    }\n    get state() {\n        return this._state;\n    }\n    get isMuted() {\n        var _a, _b;\n        return (_b = (_a = this.track) === null || _a === void 0 ? void 0 : _a.isMuted) !== null \u0026\u0026 _b !== void 0 ? _b : true;\n    }\n    start() {\n        return __awaiter(this, arguments, void 0, function* (config = {}) {\n            if (!this.isConnected) {\n                console.warn(\"Voice chat can only be started when session is active\");\n                return;\n            }\n            if (this._state !== VoiceChatState.INACTIVE) {\n                console.warn(\"Voice chat is already started\");\n                return;\n            }\n            this.state = VoiceChatState.STARTING;\n            const { defaultMuted, deviceId, mode } = config;\n            if (mode) {\n                this.setMode(mode);\n            }\n            try {\n                this.track = yield createLocalAudioTrack({\n                    echoCancellation: true,\n                    noiseSuppression: true,\n                    autoGainControl: true,\n                    deviceId,\n                });\n            }\n            catch (error) {\n                this.state = VoiceChatState.INACTIVE;\n                throw error;\n            }\n            if (defaultMuted) {\n                yield this.track.mute();\n                this.emit(VoiceChatEvent.MUTED);\n            }\n            else {\n                this.emit(VoiceChatEvent.UNMUTED);\n            }\n            yield this.room.localParticipant.publishTrack(this.track);\n            this.track.on(TrackEvent.Muted, () =\u003e {\n                this.emit(VoiceChatEvent.MUTED);\n            });\n            this.track.on(TrackEvent.Unmuted, () =\u003e {\n                this.emit(VoiceChatEvent.UNMUTED);\n            });\n            this.state = VoiceChatState.ACTIVE;\n        });\n    }\n    stop() {\n        this.room.localParticipant.getTrackPublications().forEach((publication) =\u003e {\n            if (publication.track \u0026\u0026 publication.track.kind === Track.Kind.Audio) {\n                publication.track.stop();\n            }\n        });\n        if (this.track) {\n            this.track.removeAllListeners();\n            this.track.stop();\n            this.track = null;\n        }\n        this.state = VoiceChatState.INACTIVE;\n    }\n    mute() {\n        return __awaiter(this, void 0, void 0, function* () {\n            if (!this.assertActive(\"Voice chat can only be muted when active\")) {\n                return;\n            }\n            if (this.track) {\n                yield this.track.mute();\n            }\n        });\n    }\n    unmute() {\n        return __awaiter(this, void 0, void 0, function* () {\n            if (!this.assertActive(\"Voice chat can only be unmuted when active\")) {\n                return;\n            }\n            if (this.track) {\n                yield this.track.unmute();\n            }\n        });\n    }\n    setDevice(deviceId) {\n        return __awaiter(this, void 0, void 0, function* () {\n            if (!this.assertActive(\"Voice chat device can only be set when active\")) {\n                return false;\n            }\n            if (this.track) {\n                return this.track.setDeviceId(deviceId);\n            }\n            return false;\n        });\n    }\n    startPushToTalk() {\n        return __awaiter(this, void 0, void 0, function* () {\n            if (!this.assertActive(\"Push to talk can only be started when voice chat is active\")) {\n                return;\n            }\n            console.error(\"Session interactivity mode\", this.mode);\n            if (this.mode !== SessionInteractivityMode.PUSH_TO_TALK) {\n                console.warn(\"Push to talk can only be started in push to talk mode\");\n                return;\n            }\n            if (this.pushToTalkStarted) {\n                console.warn(\"Push to talk has already been started\");\n                return;\n            }\n            this.pushToTalkStarted = true;\n            const promise = initEventPromise(this.room, PushToTalkServerEvent.START_SUCCESS, PushToTalkServerEvent.START_FAILED);\n            this.sendPushToTalkCommand(PushToTalkCommandEvent.START);\n            try {\n                yield promise;\n                yield this.unmute();\n            }\n            catch (e) {\n                console.error(\"Failed to start push to talk\", e);\n                this.pushToTalkStarted = false;\n                throw e;\n            }\n        });\n    }\n    stopPushToTalk() {\n        return __awaiter(this, void 0, void 0, function* () {\n            if (!this.pushToTalkStarted) {\n                console.warn(\"Push to talk has not been started\");\n                return;\n            }\n            const promise = initEventPromise(this.room, PushToTalkServerEvent.STOP_SUCCESS, PushToTalkServerEvent.STOP_FAILED);\n            this.sendPushToTalkCommand(PushToTalkCommandEvent.STOP);\n            try {\n                yield promise;\n                this.pushToTalkStarted = false;\n            }\n            catch (e) {\n                console.error(\"Failed to stop push to talk\", e);\n                throw e;\n            }\n        });\n    }\n    sendPushToTalkCommand(command) {\n        const data = new TextEncoder().encode(JSON.stringify({ event_type: command }));\n        this.room.localParticipant.publishData(data, {\n            reliable: true,\n            topic: LIVEKIT_COMMAND_CHANNEL_TOPIC,\n        });\n    }\n    set state(state) {\n        if (this._state !== state) {\n            this._state = state;\n            this.emit(VoiceChatEvent.STATE_CHANGED, state);\n        }\n    }\n    assertActive(warnMessage) {\n        if (this.state !== VoiceChatState.ACTIVE) {\n            console.warn(warnMessage !== null \u0026\u0026 warnMessage !== void 0 ? warnMessage : \"Voice chat is not active\");\n            return false;\n        }\n        return true;\n    }\n}\n\nconst DEFAULT_ERROR_CODE = 500;\nconst SUCCESS_CODE = 1000;\nclass SessionApiError extends Error {\n    constructor(message, errorCode, status) {\n        super(message);\n        this.status = null;\n        this.errorCode = errorCode !== null \u0026\u0026 errorCode !== void 0 ? errorCode : DEFAULT_ERROR_CODE;\n        this.status = status !== null \u0026\u0026 status !== void 0 ? status : null;\n    }\n}\nclass SessionAPIClient {\n    constructor(sessionToken, apiUrl = API_URL) {\n        this.sessionToken = sessionToken;\n        this.apiUrl = apiUrl !== null \u0026\u0026 apiUrl !== void 0 ? apiUrl : API_URL;\n    }\n    request(path, params) {\n        return __awaiter(this, void 0, void 0, function* () {\n            try {\n                const response = yield fetch(`${this.apiUrl}${path}`, Object.assign(Object.assign({}, params), { credentials: \"include\", headers: Object.assign({ Authorization: `Bearer ${this.sessionToken}`, \"Content-Type\": \"application/json\" }, params.headers) }));\n                if (!response.ok) {\n                    const data = yield response.json();\n                    throw new SessionApiError(data.message || `API request failed with status ${response.status}`, data.code, response.status);\n                }\n                const data = yield response.json();\n                if (data.code !== SUCCESS_CODE) {\n                    throw new SessionApiError(data.message || \"API request failed\");\n                }\n                return data.data;\n            }\n            catch (err) {\n                if (err instanceof SessionApiError) {\n                    throw err;\n                }\n                throw new SessionApiError(\"API request failed\");\n            }\n        });\n    }\n    startSession() {\n        return __awaiter(this, void 0, void 0, function* () {\n            return yield this.request(`/v1/sessions/start`, { method: \"POST\" });\n        });\n    }\n    stopSession() {\n        return __awaiter(this, void 0, void 0, function* () {\n            return yield this.request(`/v1/sessions/stop`, { method: \"POST\" });\n        });\n    }\n    keepAlive() {\n        return __awaiter(this, void 0, void 0, function* () {\n            return yield this.request(`/v1/sessions/keep-alive`, { method: \"POST\" });\n        });\n    }\n}\n\n/**\n * Splits a PCM 24KHz audio string (raw 16-bit signed PCM) into chunks.\n *\n * The first chunk is 400ms to minimize time-to-first-audio; subsequent chunks\n * are 1s to reduce message overhead once playback is underway.\n *\n * At 24,000Hz, 16-bit mono: 1 sample = 2 bytes.\n *   400ms =\u003e 24000 * 0.4 * 2 = 19200 bytes\n *   1000ms =\u003e 24000 * 1.0 * 2 = 48000 bytes\n */\nfunction splitPcm24kStringToChunks(pcmString) {\n    const firstChunkBytes = 24000 * 0.4 * 2; // 19200 bytes == 400ms\n    const subsequentChunkBytes = 24000 * 1.0 * 2; // 48000 bytes == 1s\n    const totalLength = pcmString.length;\n    const result = [];\n    if (totalLength === 0)\n        return result;\n    result.push(pcmString.slice(0, firstChunkBytes));\n    for (let i = firstChunkBytes; i \u003c totalLength; i += subsequentChunkBytes) {\n        result.push(pcmString.slice(i, i + subsequentChunkBytes));\n    }\n    return result;\n}\n\nconst HEYGEN_PARTICIPANT_ID = \"heygen\";\nconst LIVEAVATAR_AGENT_PARTICIPANT_ID_PREFIX = \"liveavatar-agent-\";\nconst REQUIRED_PARTICIPANTS_TIMEOUT_MS = 30000;\nfunction decodeSessionTokenPayload(token) {\n    try {\n        const parts = token.split(\".\");\n        if (parts.length \u003c 2) {\n            console.warn(\"[decodeSessionTokenPayload] Token does not look like a JWT (parts.length =\", parts.length, \"). Raw token (first 40 chars):\", token.slice(0, 40));\n            return null;\n        }\n        const payload = parts[1];\n        const decoded = JSON.parse(atob(payload.replace(/-/g, \"+\").replace(/_/g, \"/\")));\n        return decoded;\n    }\n    catch (e) {\n        console.warn(\"[decodeSessionTokenPayload] Failed to decode session token payload. Raw token (first 40 chars):\", token.slice(0, 40), \"Error:\", e);\n        return null;\n    }\n}\nfunction parseSessionModeFromToken(token) {\n    var _a;\n    const decoded = decodeSessionTokenPayload(token);\n    const mode = (_a = decoded === null || decoded === void 0 ? void 0 : decoded.start_session_data) === null || _a === void 0 ? void 0 : _a.mode;\n    if (mode === SessionMode.LITE)\n        return SessionMode.LITE;\n    if (mode === SessionMode.FULL)\n        return SessionMode.FULL;\n    return SessionMode.FULL;\n}\n// TODO(LA-1410): replace heuristic once backend exposes explicit agent_type\n// claim. Today we infer ELEVENLABS_AGENT from presence of\n// elevenlabs_agent_config (and similar for other realtime providers).\nfunction parseAgentTypeFromToken(token) {\n    const decoded = decodeSessionTokenPayload(token);\n    if (!decoded)\n        return AgentType.UNKNOWN;\n    const data = decoded.start_session_data;\n    if (!data)\n        return AgentType.UNKNOWN;\n    // Prefer explicit agent_type claim if backend exposes one.\n    if (typeof data.agent_type === \"string\") {\n        const explicit = data.agent_type.toUpperCase();\n        if (explicit in AgentType)\n            return explicit;\n    }\n    if (data.elevenlabs_agent_config)\n        return AgentType.ELEVENLABS_AGENT;\n    if (data.openai_realtime_config)\n        return AgentType.OPENAI_REALTIME;\n    if (data.gemini_realtime_config)\n        return AgentType.GEMINI_REALTIME;\n    return AgentType.FULL;\n}\nclass LiveAvatarSession extends EventEmitter {\n    constructor(sessionAccessToken, config) {\n        super();\n        this.connectionQualityIndicator = new ConnectionQualityIndicator((quality) =\u003e this.emit(SessionEvent.SESSION_CONNECTION_QUALITY_CHANGED, quality));\n        this._sessionInfo = null;\n        this._sessionEventSocket = null;\n        this._state = SessionState.INACTIVE;\n        this._remoteAudioTrack = null;\n        this._remoteVideoTrack = null;\n        this._mode = parseSessionModeFromToken(sessionAccessToken);\n        this._agentType = parseAgentTypeFromToken(sessionAccessToken);\n        // Required to construct the room\n        this.config = config !== null \u0026\u0026 config !== void 0 ? config : {};\n        this.sessionClient = new SessionAPIClient(sessionAccessToken, this.config.apiUrl);\n        this.room = new Room({\n            adaptiveStream: supportsAdaptiveStream()\n                ? {\n                    pauseVideoInBackground: false,\n                }\n                : false,\n            dynacast: supportsDynacast(),\n            videoCaptureDefaults: {\n                resolution: VideoPresets.h720.resolution,\n            },\n        });\n        this._voiceChat = new VoiceChat(this.room);\n        if (this.config.voiceChat \u0026\u0026\n            typeof this.config.voiceChat === \"object\" \u0026\u0026\n            this.config.voiceChat.mode) {\n            this._voiceChat.setMode(this.config.voiceChat.mode);\n        }\n    }\n    get state() {\n        return this._state;\n    }\n    get mode() {\n        return this._mode;\n    }\n    get agentType() {\n        return this._agentType;\n    }\n    get sessionId() {\n        var _a, _b;\n        return (_b = (_a = this._sessionInfo) === null || _a === void 0 ? void 0 : _a.session_id) !== null \u0026\u0026 _b !== void 0 ? _b : null;\n    }\n    get connectionQuality() {\n        return this.connectionQualityIndicator.connectionQuality;\n    }\n    get voiceChat() {\n        return this._voiceChat;\n    }\n    get maxSessionDuration() {\n        var _a, _b;\n        return (_b = (_a = this._sessionInfo) === null || _a === void 0 ? void 0 : _a.max_session_duration) !== null \u0026\u0026 _b !== void 0 ? _b : null;\n    }\n    start() {\n        return __awaiter(this, void 0, void 0, function* () {\n            if (this.state !== SessionState.INACTIVE) {\n                console.warn(\"Session is already started\");\n                return;\n            }\n            try {\n                this.state = SessionState.CONNECTING;\n                this._sessionInfo = yield this.sessionClient.startSession();\n                const livekitRoomUrl = this._sessionInfo.livekit_url;\n                const livekitClientToken = this._sessionInfo.livekit_client_token;\n                const websocketUrl = this._sessionInfo.ws_url;\n                // Connect to LiveKit room if provided\n                if (livekitRoomUrl \u0026\u0026 livekitClientToken) {\n                    // Track the different events from the room, server, and websocket\n                    this.trackEvents();\n                    yield this.room.connect(livekitRoomUrl, livekitClientToken);\n                    yield this.waitForRequiredParticipants();\n                    this.connectionQualityIndicator.start(this.room);\n                }\n                // Connect to WebSocket if provided\n                if (websocketUrl) {\n                    yield this.connectWebSocket(websocketUrl);\n                    this.setupWebSocketManagement();\n                }\n                // Run configurations as needed\n                yield this.configureSession();\n                this.state = SessionState.CONNECTED;\n            }\n            catch (error) {\n                console.error(\"Session start failed:\", error);\n                this.cleanup();\n                this.postStop(SessionDisconnectReason.SESSION_START_FAILED);\n                throw error;\n            }\n        });\n    }\n    stop() {\n        return __awaiter(this, void 0, void 0, function* () {\n            if (!this.assertConnected()) {\n                return;\n            }\n            this.state = SessionState.DISCONNECTING;\n            this.cleanup();\n            this.postStop(SessionDisconnectReason.CLIENT_INITIATED);\n        });\n    }\n    keepAlive() {\n        return __awaiter(this, void 0, void 0, function* () {\n            if (!this.assertConnected()) {\n                return;\n            }\n            try {\n                this.sessionClient.keepAlive();\n            }\n            catch (error) {\n                console.error(\"Session keep alive error on server:\", error);\n                throw error;\n            }\n        });\n    }\n    attach(element) {\n        if (!this._remoteVideoTrack || !this._remoteAudioTrack) {\n            console.warn(\"Stream is not yet ready\");\n            return;\n        }\n        this._remoteVideoTrack.attach(element);\n        this._remoteAudioTrack.attach(element);\n    }\n    message(message) {\n        if (!this.assertConnected()) {\n            throw new Error(\"Session needs to be connected to send command event\");\n        }\n        const event_id = this.generateEventId();\n        const data = {\n            event_id: event_id,\n            event_type: CommandEventsEnum.AVATAR_SPEAK_RESPONSE,\n            text: message,\n        };\n        this.sendCommandEvent(data);\n        return event_id;\n    }\n    repeat(message) {\n        if (!this.assertConnected()) {\n            throw new Error(\"Session needs to be connected to send command event\");\n        }\n        const event_id = this.generateEventId();\n        const data = {\n            event_id: event_id,\n            event_type: CommandEventsEnum.AVATAR_SPEAK_TEXT,\n            text: message,\n        };\n        console.warn(\"sending repeat command event\", data);\n        this.sendCommandEvent(data);\n        return event_id;\n    }\n    repeatAudio(audio) {\n        if (!this.assertConnected()) {\n            throw new Error(\"Session needs to be connected to send command event\");\n        }\n        if (!this._sessionEventSocket) {\n            console.warn(\"Cannot repeat audio. Please check you're using a supported mode.\");\n            throw new Error(\"Session needs to be connected to send command event\");\n        }\n        const event_id = this.generateEventId();\n        const data = {\n            event_id: event_id,\n            event_type: CommandEventsEnum.AVATAR_SPEAK_AUDIO,\n            audio: audio,\n        };\n        this.sendCommandEvent(data);\n        return event_id;\n    }\n    startListening() {\n        if (!this.assertConnected()) {\n            throw new Error(\"Session needs to be connected to send command event\");\n        }\n        const event_id = this.generateEventId();\n        const data = {\n            event_id: event_id,\n            event_type: CommandEventsEnum.AVATAR_START_LISTENING,\n        };\n        this.sendCommandEvent(data);\n        return event_id;\n    }\n    stopListening() {\n        if (!this.assertConnected()) {\n            throw new Error(\"Session needs to be connected to send command event\");\n        }\n        const event_id = this.generateEventId();\n        const data = {\n            event_type: CommandEventsEnum.AVATAR_STOP_LISTENING,\n            event_id: event_id,\n        };\n        this.sendCommandEvent(data);\n        return event_id;\n    }\n    interrupt() {\n        if (!this.assertConnected()) {\n            throw new Error(\"Session needs to be connected to send command event\");\n        }\n        const data = {\n            event_type: CommandEventsEnum.AVATAR_INTERRUPT,\n        };\n        this.sendCommandEvent(data);\n    }\n    trackEvents() {\n        const mediaStream = new MediaStream();\n        this.room.on(RoomEvent.TrackSubscribed, (track, _publication, participant) =\u003e {\n            // We need to actively track the HeyGen participant's tracks\n            if (participant.identity !== HEYGEN_PARTICIPANT_ID) {\n                return;\n            }\n            if (track.kind === \"video\" || track.kind === \"audio\") {\n                if (track.kind === \"video\") {\n                    this._remoteVideoTrack = track;\n                }\n                else {\n                    this._remoteAudioTrack = track;\n                }\n                mediaStream.addTrack(track.mediaStreamTrack);\n                const hasVideoTrack = mediaStream.getVideoTracks().length \u003e 0;\n                const hasAudioTrack = mediaStream.getAudioTracks().length \u003e 0;\n                if (hasVideoTrack \u0026\u0026 hasAudioTrack) {\n                    this.emit(SessionEvent.SESSION_STREAM_READY);\n                }\n            }\n        });\n        this.room.on(RoomEvent.DataReceived, (roomMessage, _, __, topic) =\u003e {\n            if (topic !== LIVEKIT_SERVER_RESPONSE_CHANNEL_TOPIC) {\n                return;\n            }\n            let eventMsg = null;\n            try {\n                const messageString = new TextDecoder().decode(roomMessage);\n                eventMsg = JSON.parse(messageString);\n            }\n            catch (e) {\n                console.error(e);\n            }\n            if (!eventMsg) {\n                return;\n            }\n            const emitArgs = getAgentEventEmitArgs(eventMsg);\n            if (emitArgs) {\n                const [event_type, ...event_data] = emitArgs;\n                this.emit(event_type, ...event_data);\n            }\n        });\n        this.on(AgentEventsEnum.SESSION_STOPPED, (event) =\u003e {\n            console.warn(\"[SDK:SESSION_STOPPED] Server stopped session, reason:\", event.stop_reason);\n            this.cleanup();\n            this.postStop(SessionDisconnectReason.SERVER_INITIATED);\n        });\n        this.room.on(RoomEvent.ParticipantConnected, (participant) =\u003e {\n            console.warn(\"participantConnected\", participant.identity);\n        });\n        this.room.on(RoomEvent.TrackUnsubscribed, (track) =\u003e {\n            console.warn(\"trackUnsubscribed\", track);\n            const mediaTrack = track.mediaStreamTrack;\n            if (mediaTrack) {\n                mediaStream.removeTrack(mediaTrack);\n            }\n        });\n        this.room.on(RoomEvent.Disconnected, (reason) =\u003e {\n            console.warn(\"Room disconnected, reason:\", reason);\n            this.handleRoomDisconnect();\n        });\n        this.room.on(RoomEvent.TrackPublished, (track) =\u003e {\n            console.warn(\"trackPublished\", track);\n        });\n    }\n    waitForRequiredParticipants() {\n        var _a;\n        if (this._mode !== SessionMode.FULL) {\n            return Promise.resolve();\n        }\n        const sessionId = (_a = this._sessionInfo) === null || _a === void 0 ? void 0 : _a.session_id;\n        if (!sessionId) {\n            return Promise.resolve();\n        }\n        const agentId = `${LIVEAVATAR_AGENT_PARTICIPANT_ID_PREFIX}${sessionId}`;\n        const required = new Set([HEYGEN_PARTICIPANT_ID, agentId]);\n        for (const p of this.room.remoteParticipants.values()) {\n            required.delete(p.identity);\n        }\n        if (required.size === 0) {\n            return Promise.resolve();\n        }\n        return new Promise((resolve, reject) =\u003e {\n            const onConnected = (participant) =\u003e {\n                required.delete(participant.identity);\n                if (required.size === 0) {\n                    cleanup();\n                    resolve();\n                }\n            };\n            const timeout = setTimeout(() =\u003e {\n                cleanup();\n                reject(new Error(`Timed out waiting for required participants: ${Array.from(required).join(\", \")}`));\n            }, REQUIRED_PARTICIPANTS_TIMEOUT_MS);\n            const cleanup = () =\u003e {\n                clearTimeout(timeout);\n                this.room.off(RoomEvent.ParticipantConnected, onConnected);\n            };\n            this.room.on(RoomEvent.ParticipantConnected, onConnected);\n        });\n    }\n    connectWebSocket(websocketUrl) {\n        return __awaiter(this, void 0, void 0, function* () {\n            return new Promise((resolve, _reject) =\u003e {\n                this._sessionEventSocket = new WebSocket(websocketUrl);\n                this._sessionEventSocket.onopen = () =\u003e {\n                    resolve();\n                };\n            });\n        });\n    }\n    setupWebSocketManagement() {\n        if (!this._sessionEventSocket) {\n            return;\n        }\n        this._sessionEventSocket.onmessage = (event) =\u003e {\n            this.handleWebSocketMessage(event);\n        };\n        this._sessionEventSocket.onerror = (error) =\u003e {\n            console.error(\"WebSocket error:\", error);\n        };\n        this._sessionEventSocket.onclose = (event) =\u003e {\n            console.warn(\"WebSocket closed - code:\", event.code, \"reason:\", event.reason, \"wasClean:\", event.wasClean);\n            this.handleWebSocketDisconnect();\n        };\n    }\n    handleWebSocketMessage(event) {\n        let eventData = null;\n        try {\n            eventData = JSON.parse(event.data);\n        }\n        catch (e) {\n            console.error(\"Failed to parse WebSocket message:\", e);\n            return;\n        }\n        if (!eventData) {\n            return;\n        }\n        const { type, event_id } = eventData;\n        if (type === \"agent.speak_started\") {\n            this.emit(AgentEventsEnum.AVATAR_SPEAK_STARTED, {\n                event_type: AgentEventsEnum.AVATAR_SPEAK_STARTED,\n                event_id: event_id,\n            });\n        }\n        else if (type === \"agent.speak_ended\") {\n            this.emit(AgentEventsEnum.AVATAR_SPEAK_ENDED, {\n                event_type: AgentEventsEnum.AVATAR_SPEAK_ENDED,\n                event_id: event_id,\n            });\n        }\n    }\n    handleWebSocketDisconnect() {\n        if (this.state === SessionState.DISCONNECTING ||\n            this.state === SessionState.DISCONNECTED) {\n            return;\n        }\n        if (this._sessionEventSocket \u0026\u0026\n            this._sessionEventSocket.readyState === WebSocket.OPEN) {\n            this._sessionEventSocket.close();\n        }\n        this._sessionEventSocket = null;\n        this.cleanup();\n        this.postStop(SessionDisconnectReason.UNKNOWN_REASON);\n    }\n    configureSession() {\n        return __awaiter(this, void 0, void 0, function* () {\n            if (this.config.voiceChat) {\n                try {\n                    yield this.voiceChat.start(typeof this.config.voiceChat === \"boolean\"\n                        ? {}\n                        : this.config.voiceChat);\n                }\n                catch (error) {\n                    console.warn(\"Failed to start voice chat (microphone may be unavailable):\", error);\n                }\n            }\n        });\n    }\n    set state(state) {\n        if (this._state === state) {\n            return;\n        }\n        this._state = state;\n        this.emit(SessionEvent.SESSION_STATE_CHANGED, state);\n    }\n    cleanup() {\n        return __awaiter(this, void 0, void 0, function* () {\n            this.connectionQualityIndicator.stop();\n            this.voiceChat.stop();\n            if (this._remoteAudioTrack) {\n                this._remoteAudioTrack.stop();\n            }\n            if (this._remoteVideoTrack) {\n                this._remoteVideoTrack.stop();\n            }\n            this._remoteAudioTrack = null;\n            this._remoteVideoTrack = null;\n            this.room.localParticipant.removeAllListeners();\n            this.room.removeAllListeners();\n            // Clean up WebSocket\n            if (this._sessionEventSocket) {\n                // Remove event listeners to prevent callbacks during cleanup\n                this._sessionEventSocket.onopen = null;\n                this._sessionEventSocket.onmessage = null;\n                this._sessionEventSocket.onerror = null;\n                this._sessionEventSocket.onclose = null;\n                if (this._sessionEventSocket.readyState === WebSocket.OPEN ||\n                    this._sessionEventSocket.readyState === WebSocket.CONNECTING) {\n                    this._sessionEventSocket.close();\n                }\n                this._sessionEventSocket = null;\n            }\n            // Disconnect from room if connected\n            if (this.room.state === \"connected\") {\n                this.room.disconnect();\n            }\n            // Kill the session on the server\n            yield this.sessionClient.stopSession();\n        });\n    }\n    postStop(reason) {\n        this.state = SessionState.DISCONNECTED;\n        this.emit(SessionEvent.SESSION_DISCONNECTED, reason);\n    }\n    handleRoomDisconnect() {\n        this.cleanup();\n        this.postStop(SessionDisconnectReason.UNKNOWN_REASON);\n    }\n    sendCommandEvent(commandEvent) {\n        // Use WebSocket if available, otherwise use LiveKit data channel\n        if (this._sessionEventSocket \u0026\u0026\n            this._sessionEventSocket.readyState === WebSocket.OPEN) {\n            this.sendCommandEventToWebSocket(commandEvent);\n        }\n        else if (this.room.state === \"connected\") {\n            this.publishAgentControl(commandEvent);\n        }\n        else {\n            console.warn(\"No active connection to send command event\");\n        }\n    }\n    publishAgentControl(payload) {\n        if (this.room.state !== \"connected\") {\n            throw new Error(\"LiveKit room not connected — cannot publish agent-control payload\");\n        }\n        const data = new TextEncoder().encode(JSON.stringify(payload));\n        this.room.localParticipant.publishData(data, {\n            reliable: true,\n            topic: LIVEKIT_COMMAND_CHANNEL_TOPIC,\n        });\n    }\n    generateEventId() {\n        // Use native browser crypto API\n        if (typeof crypto !== \"undefined\" \u0026\u0026 crypto.randomUUID) {\n            return crypto.randomUUID();\n        }\n        // Fallback for older browsers\n        return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) =\u003e {\n            const r = (Math.random() * 16) | 0;\n            const v = c === \"x\" ? r : (r \u0026 0x3) | 0x8;\n            return v.toString(16);\n        });\n    }\n    sendCommandEventToWebSocket(commandEvent) {\n        if (!this._sessionEventSocket ||\n            this._sessionEventSocket.readyState !== WebSocket.OPEN) {\n            console.warn(\"WebSocket not open to send command event\");\n            return;\n        }\n        const event_type = commandEvent.event_type;\n        const event_id = this.generateEventId();\n        let audioChunks = [];\n        switch (event_type) {\n            case CommandEventsEnum.AVATAR_SPEAK_AUDIO:\n                audioChunks = splitPcm24kStringToChunks(commandEvent.audio);\n                for (const audioChunk of audioChunks) {\n                    this._sessionEventSocket.send(JSON.stringify({\n                        type: \"agent.speak\",\n                        event_id: event_id,\n                        audio: audioChunk,\n                    }));\n                }\n                this._sessionEventSocket.send(JSON.stringify({\n                    type: \"agent.speak_end\",\n                    event_id: event_id,\n                }));\n                return;\n            case CommandEventsEnum.AVATAR_SPEAK_TEXT:\n            case CommandEventsEnum.AVATAR_SPEAK_RESPONSE:\n                throw new Error(\"Not permitted in LITE mode\");\n            case CommandEventsEnum.AVATAR_INTERRUPT:\n                this._sessionEventSocket.send(JSON.stringify({\n                    type: \"agent.interrupt\",\n                    event_id: event_id,\n                }));\n                return;\n            case CommandEventsEnum.AVATAR_START_LISTENING:\n                this._sessionEventSocket.send(JSON.stringify({\n                    type: \"agent.start_listening\",\n                    event_id: event_id,\n                }));\n                return;\n            case CommandEventsEnum.AVATAR_STOP_LISTENING:\n                this._sessionEventSocket.send(JSON.stringify({\n                    type: \"agent.stop_listening\",\n                    event_id: event_id,\n                }));\n                return;\n            default:\n                console.warn(\"Unsupported command event type:\", event_type);\n                break;\n        }\n    }\n    assertConnected() {\n        if (this.state !== SessionState.CONNECTED) {\n            console.warn(\"Session is not connected\");\n            return false;\n        }\n        return true;\n    }\n}\n\nclass ElevenLabsAgentSessionError extends Error {\n    constructor(message) {\n        super(message);\n        this.name = \"ElevenLabsAgentSessionError\";\n    }\n}\n/**\n * Session class for LiveAvatar sessions backed by an ElevenLabs Agent.\n *\n * Inherits the connection lifecycle, voice chat, and inbound event surface\n * from LiveAvatarSession. Adds outbound commands that wrap ElevenLabs\n * client-event types (user_message, contextual_update, user_activity,\n * client_tool_result) and ship them on the LiveKit `agent-control` topic.\n *\n * Refuses to send if the JWT does not indicate an ELEVENLABS agent.\n *\n * NOTE: The non-ElevenLabs LiveAvatar command methods (`message`, `repeat`,\n * `repeatAudio`) are not supported on this path and will throw. In a future\n * iteration we may map these onto ElevenLabs equivalents (e.g. `message` -\u003e\n * `sendUserMessage`) so a developer can swap LiveAvatarSession for\n * ElevenLabsAgentSession with no call-site changes.\n */\nclass ElevenLabsAgentSession extends LiveAvatarSession {\n    constructor(sessionAccessToken, config) {\n        super(sessionAccessToken, config);\n        // TODO(LA-1410): Re-enable agent_type validation once the backend echoes\n        // `start_session_data.agent_type = \"ELEVENLABS_AGENT\"` in the JWT. Today\n        // the token omits agent_type entirely, so any client-side check is\n        // unreliable. We trust the caller's choice of class — the server still\n        // enforces the real agent type and silently drops mismatched commands.\n        //\n        // if (this.agentType !== AgentType.ELEVENLABS_AGENT) {\n        //   console.warn(\n        //     `[ElevenLabsAgentSession] Token agent_type detected as \"${this.agentType}\", ` +\n        //       `expected \"${AgentType.ELEVENLABS_AGENT}\".`,\n        //   );\n        // }\n    }\n    /**\n     * Low-level: send any whitelisted ElevenLabs agent command. Prefer the\n     * named convenience methods below.\n     */\n    sendElevenLabsAgentCommand(payload, options) {\n        var _a;\n        if (!this.assertConnected()) {\n            throw new ElevenLabsAgentSessionError(\"Session must be connected before sending ElevenLabs agent commands\");\n        }\n        const sessionId = this.sessionId;\n        if (!sessionId) {\n            throw new ElevenLabsAgentSessionError(\"Session id is not yet available — wait for session.started\");\n        }\n        const event_id = this.generateEventId();\n        const wrapper = Object.assign({ event_type: CommandEventsEnum.ELEVENLABS_AGENT_COMMAND, event_id, session_id: sessionId, source_event_id: (_a = options === null || options === void 0 ? void 0 : options.sourceEventId) !== null \u0026\u0026 _a !== void 0 ? _a : null }, payload);\n        this.publishAgentControl(wrapper);\n        return event_id;\n    }\n    /** Send a user message — equivalent to typing in the ElevenLabs widget. */\n    sendUserMessage(text) {\n        return this.sendElevenLabsAgentCommand({\n            elevenlabs_event_type: ElevenLabsAgentCommandType.USER_MESSAGE,\n            data: { text },\n        });\n    }\n    /** Send a contextual update — silent context the agent can use. */\n    sendContextualUpdate(text) {\n        return this.sendElevenLabsAgentCommand({\n            elevenlabs_event_type: ElevenLabsAgentCommandType.CONTEXTUAL_UPDATE,\n            data: { text },\n        });\n    }\n    /** Keepalive / typing-indicator ping. */\n    sendUserActivity() {\n        return this.sendElevenLabsAgentCommand({\n            elevenlabs_event_type: ElevenLabsAgentCommandType.USER_ACTIVITY,\n        });\n    }\n    /** Reply to a client_tool_call inbound event with the tool result. */\n    sendClientToolResult(args) {\n        var _a;\n        return this.sendElevenLabsAgentCommand({\n            elevenlabs_event_type: ElevenLabsAgentCommandType.CLIENT_TOOL_RESULT,\n            data: {\n                tool_call_id: args.toolCallId,\n                result: args.result,\n                is_error: (_a = args.isError) !== null \u0026\u0026 _a !== void 0 ? _a : false,\n            },\n        }, { sourceEventId: args.sourceEventId });\n    }\n    // ---------------------------------------------------------------------\n    // Disabled LiveAvatar command surface\n    //\n    // TODO(LA-1410-followup): Remap these onto the ElevenLabs equivalents so\n    // a consumer can swap LiveAvatarSession \u003c-\u003e ElevenLabsAgentSession with\n    // no call-site changes. Likely mapping:\n    //   message(text)     -\u003e sendUserMessage(text)\n    //   repeat(text)      -\u003e sendContextualUpdate(text)  (or a new EL event)\n    //   repeatAudio(b64)  -\u003e not supported (no analogue)\n    // ---------------------------------------------------------------------\n    message(_message) {\n        throw new ElevenLabsAgentSessionError(\"message() is not supported on ElevenLabsAgentSession — use sendUserMessage()\");\n    }\n    repeat(_message) {\n        throw new ElevenLabsAgentSessionError(\"repeat() is not supported on ElevenLabsAgentSession — the ElevenLabs agent owns response generation\");\n    }\n    repeatAudio(_audio) {\n        throw new ElevenLabsAgentSessionError(\"repeatAudio() is not supported on ElevenLabsAgentSession\");\n    }\n}\n\nexport { AgentEventsEnum, AgentType, CommandEventsEnum, ConnectionQuality, ElevenLabsAgentCommandType, ElevenLabsAgentSession, ElevenLabsAgentSessionError, Language, LiveAvatarSession, SessionDisconnectReason, SessionEvent, SessionInteractivityMode, SessionMode, SessionState, VoiceChatEvent, VoiceChatState, parseAgentTypeFromToken };\n","var t,e,s,n;function r(){}function o(){o.init.call(this)}function i(t){return void 0===t._maxListeners?o.defaultMaxListeners:t._maxListeners}function a(t,e,s){if(e)t.call(s);else for(var n=t.length,r=m(t,n),o=0;o\u003cn;++o)r[o].call(s)}function c(t,e,s,n){if(e)t.call(s,n);else for(var r=t.length,o=m(t,r),i=0;i\u003cr;++i)o[i].call(s,n)}function d(t,e,s,n,r){if(e)t.call(s,n,r);else for(var o=t.length,i=m(t,o),a=0;a\u003co;++a)i[a].call(s,n,r)}function u(t,e,s,n,r,o){if(e)t.call(s,n,r,o);else for(var i=t.length,a=m(t,i),c=0;c\u003ci;++c)a[c].call(s,n,r,o)}function h(t,e,s,n){if(e)t.apply(s,n);else for(var r=t.length,o=m(t,r),i=0;i\u003cr;++i)o[i].apply(s,n)}function l(t,e,s,n){var o,a,c,d;if(\"function\"!=typeof s)throw new TypeError('\"listener\" argument must be a function');if((a=t._events)?(a.newListener\u0026\u0026(t.emit(\"newListener\",e,s.listener?s.listener:s),a=t._events),c=a[e]):(a=t._events=new r,t._eventsCount=0),c){if(\"function\"==typeof c?c=a[e]=n?[s,c]:[c,s]:n?c.unshift(s):c.push(s),!c.warned\u0026\u0026(o=i(t))\u0026\u0026o\u003e0\u0026\u0026c.length\u003eo){c.warned=!0;var u=new Error(\"Possible EventEmitter memory leak detected. \"+c.length+\" \"+e+\" listeners added. Use emitter.setMaxListeners() to increase limit\");u.name=\"MaxListenersExceededWarning\",u.emitter=t,u.type=e,u.count=c.length,d=u,\"function\"==typeof console.warn?console.warn(d):console.log(d)}}else c=a[e]=s,++t._eventsCount;return t}function p(t,e,s){var n=!1;function r(){t.removeListener(e,r),n||(n=!0,s.apply(t,arguments))}return r.listener=s,r}function f(t){var e=this._events;if(e){var s=e[t];if(\"function\"==typeof s)return 1;if(s)return s.length}return 0}function m(t,e){for(var s=new Array(e);e--;)s[e]=t[e];return s}r.prototype=Object.create(null),o.EventEmitter=o,o.usingDomains=!1,o.prototype.domain=void 0,o.prototype._events=void 0,o.prototype._maxListeners=void 0,o.defaultMaxListeners=10,o.init=function(){this.domain=null,o.usingDomains\u0026\u0026undefined.active,this._events\u0026\u0026this._events!==Object.getPrototypeOf(this)._events||(this._events=new r,this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},o.prototype.setMaxListeners=function(t){if(\"number\"!=typeof t||t\u003c0||isNaN(t))throw new TypeError('\"n\" argument must be a positive number');return this._maxListeners=t,this},o.prototype.getMaxListeners=function(){return i(this)},o.prototype.emit=function(t){var e,s,n,r,o,i,l,p=\"error\"===t;if(i=this._events)p=p\u0026\u0026null==i.error;else if(!p)return!1;if(l=this.domain,p){if(e=arguments[1],!l){if(e instanceof Error)throw e;var f=new Error('Uncaught, unspecified \"error\" event. ('+e+\")\");throw f.context=e,f}return e||(e=new Error('Uncaught, unspecified \"error\" event')),e.domainEmitter=this,e.domain=l,e.domainThrown=!1,l.emit(\"error\",e),!1}if(!(s=i[t]))return!1;var m=\"function\"==typeof s;switch(n=arguments.length){case 1:a(s,m,this);break;case 2:c(s,m,this,arguments[1]);break;case 3:d(s,m,this,arguments[1],arguments[2]);break;case 4:u(s,m,this,arguments[1],arguments[2],arguments[3]);break;default:for(r=new Array(n-1),o=1;o\u003cn;o++)r[o-1]=arguments[o];h(s,m,this,r)}return!0},o.prototype.addListener=function(t,e){return l(this,t,e,!1)},o.prototype.on=o.prototype.addListener,o.prototype.prependListener=function(t,e){return l(this,t,e,!0)},o.prototype.once=function(t,e){if(\"function\"!=typeof e)throw new TypeError('\"listener\" argument must be a function');return this.on(t,p(this,t,e)),this},o.prototype.prependOnceListener=function(t,e){if(\"function\"!=typeof e)throw new TypeError('\"listener\" argument must be a function');return this.prependListener(t,p(this,t,e)),this},o.prototype.removeListener=function(t,e){var s,n,o,i,a;if(\"function\"!=typeof e)throw new TypeError('\"listener\" argument must be a function');if(!(n=this._events))return this;if(!(s=n[t]))return this;if(s===e||s.listener\u0026\u0026s.listener===e)0==--this._eventsCount?this._events=new r:(delete n[t],n.removeListener\u0026\u0026this.emit(\"removeListener\",t,s.listener||e));else if(\"function\"!=typeof s){for(o=-1,i=s.length;i-- \u003e0;)if(s[i]===e||s[i].listener\u0026\u0026s[i].listener===e){a=s[i].listener,o=i;break}if(o\u003c0)return this;if(1===s.length){if(s[0]=void 0,0==--this._eventsCount)return this._events=new r,this;delete n[t]}else!function(t,e){for(var s=e,n=s+1,r=t.length;n\u003cr;s+=1,n+=1)t[s]=t[n];t.pop()}(s,o);n.removeListener\u0026\u0026this.emit(\"removeListener\",t,a||e)}return this},o.prototype.off=function(t,e){return this.removeListener(t,e)},o.prototype.removeAllListeners=function(t){var e,s;if(!(s=this._events))return this;if(!s.removeListener)return 0===arguments.length?(this._events=new r,this._eventsCount=0):s[t]\u0026\u0026(0==--this._eventsCount?this._events=new r:delete s[t]),this;if(0===arguments.length){for(var n,o=Object.keys(s),i=0;i\u003co.length;++i)\"removeListener\"!==(n=o[i])\u0026\u0026this.removeAllListeners(n);return this.removeAllListeners(\"removeListener\"),this._events=new r,this._eventsCount=0,this}if(\"function\"==typeof(e=s[t]))this.removeListener(t,e);else if(e)do{this.removeListener(t,e[e.length-1])}while(e[0]);return this},o.prototype.listeners=function(t){var e,s=this._events;return s\u0026\u0026(e=s[t])?\"function\"==typeof e?[e.listener||e]:function(t){for(var e=new Array(t.length),s=0;s\u003ce.length;++s)e[s]=t[s].listener||t[s];return e}(e):[]},o.listenerCount=function(t,e){return\"function\"==typeof t.listenerCount?t.listenerCount(e):f.call(t,e)},o.prototype.listenerCount=f,o.prototype.eventNames=function(){return this._eventsCount\u003e0?Reflect.ownKeys(this._events):[]};class g extends o{}!function(t){t.Issue=\"issue\",t.NetworkScoresUpdated=\"network-scores-updated\",t.StatsParsingFinished=\"stats-parsing-finished\"}(t||(t={})),function(t){t.Network=\"network\",t.CPU=\"cpu\",t.Server=\"server\",t.Stream=\"stream\"}(e||(e={})),function(t){t.OutboundNetworkQuality=\"outbound-network-quality\",t.InboundNetworkQuality=\"inbound-network-quality\",t.OutboundNetworkMediaLatency=\"outbound-network-media-latency\",t.InboundNetworkMediaLatency=\"inbound-network-media-latency\",t.NetworkMediaSyncFailure=\"network-media-sync-failure\",t.OutboundNetworkThroughput=\"outbound-network-throughput\",t.InboundNetworkThroughput=\"inbound-network-throughput\",t.EncoderCPUThrottling=\"encoder-cpu-throttling\",t.DecoderCPUThrottling=\"decoder-cpu-throttling\",t.ServerIssue=\"server-issue\",t.UnknownVideoDecoderIssue=\"unknown-video-decoder\",t.LowInboundMOS=\"low-inbound-mean-opinion-score\",t.LowOutboundMOS=\"low-outbound-mean-opinion-score\",t.FrozenVideoTrack=\"frozen-video-track\",t.MissingVideoStreamData=\"missing-video-stream-data\",t.MissingAudioStreamData=\"missing-audio-stream-data\"}(s||(s={})),function(t){t[t.BAD=2.1]=\"BAD\",t[t.POOR=2.6]=\"POOR\",t[t.FAIR=3.1]=\"FAIR\",t[t.GOOD=3.8]=\"GOOD\",t[t.EXCELLENT=4.3]=\"EXCELLENT\"}(n||(n={}));class S extends o{static STATS_REPORT_READY_EVENT=\"stats-report-ready\";static STATS_REPORTS_PARSED=\"stats-reports-parsed\";isStopped=!1;reportTimer;getStatsInterval;compositeStatsParser;constructor(t){super(),this.compositeStatsParser=t.compositeStatsParser,this.getStatsInterval=t.getStatsInterval??1e4}get isRunning(){return!!this.reportTimer\u0026\u0026!this.isStopped}startReporting(){if(this.reportTimer)return;const t=()=\u003esetTimeout((()=\u003e{this.isStopped?this.reportTimer=void 0:this.parseReports().finally((()=\u003e{this.reportTimer=t()}))}),this.getStatsInterval);this.isStopped=!1,this.reportTimer=t()}stopReporting(){this.isStopped=!0,this.reportTimer\u0026\u0026(clearTimeout(this.reportTimer),this.reportTimer=void 0)}async parseReports(){const t=Date.now(),e=await this.compositeStatsParser.parse(),s=Date.now()-t;this.emit(S.STATS_REPORTS_PARSED,{timeTaken:s,reportItems:e}),e.forEach((t=\u003e{this.emit(S.STATS_REPORT_READY_EVENT,t)}))}}const v=(()=\u003e{const t=new Map;return e=\u003e{const{taskId:s,delayMs:n,maxJitterMs:r,callback:o}=e,i=Math.ceil(Math.random()*(r||0)),a=t.get(s);a\u0026\u0026clearTimeout(a);const c=setTimeout((()=\u003e{o(),t.delete(s)}),n+i);t.set(s,c)}})();class k{#t={};calculate(t){const{connection:{id:e}}=t,{mos:s,stats:n}=this.calculateOutboundScore(t)||{},{mos:r,stats:o}=this.calculateInboundScore(t)||{};return this.#t[e]=t,v({taskId:e,delayMs:35e3,callback:()=\u003edelete this.#t[e]}),{outbound:s,inbound:r,connectionId:e,statsSamples:{inboundStatsSample:o,outboundStatsSample:n}}}calculateOutboundScore(t){const e=[...t.remote?.audio.inbound||[],...t.remote?.video.inbound||[]];if(!e.length)return;const s=this.#t[t.connection.id];if(!s)return;const n=[...s.remote?.audio.inbound||[],...s.remote?.video.inbound||[]],{packetsSent:r}=t.connection,o=s.connection.packetsSent,i=e.reduce(((t,e)=\u003e{const s=n.find((t=\u003et.ssrc===e.ssrc));return{sumJitter:t.sumJitter+e.jitter,packetsLost:t.packetsLost+e.packetsLost,lastPacketsLost:t.lastPacketsLost+(s?.packetsLost||0)}}),{sumJitter:0,packetsLost:0,lastPacketsLost:0}),a=1e3*t.connection.currentRoundTripTime||0,{sumJitter:c}=i,d=c/e.length,u=r-o,h=i.packetsLost-i.lastPacketsLost,l=u\u0026\u0026h?Math.round(100*h/(u+h)):0;return{mos:this.calculateMOS({avgJitter:d,rtt:a,packetsLoss:l}),stats:{avgJitter:d,rtt:a,packetsLoss:l}}}calculateInboundScore(t){const e=[...t.audio?.inbound,...t.video?.inbound];if(!e.length)return;const s=this.#t[t.connection.id];if(!s)return;const n=[...s.video?.inbound,...s.audio?.inbound],{packetsReceived:r}=t.connection,o=s.connection.packetsReceived,i=e.reduce(((t,e)=\u003e{const s=n.find((t=\u003et.ssrc===e.ssrc));return{sumJitter:t.sumJitter+e.jitter,packetsLost:t.packetsLost+e.packetsLost,lastPacketsLost:t.lastPacketsLost+(s?.packetsLost||0)}}),{sumJitter:0,packetsLost:0,lastPacketsLost:0}),a=1e3*t.connection.currentRoundTripTime||0,{sumJitter:c}=i,d=c/e.length,u=r-o,h=i.packetsLost-i.lastPacketsLost,l=u\u0026\u0026h?Math.round(100*h/(u+h)):0;return{mos:this.calculateMOS({avgJitter:d,rtt:a,packetsLoss:l}),stats:{avgJitter:d,rtt:a,packetsLoss:l}}}calculateMOS({avgJitter:t,rtt:e,packetsLoss:s}){const n=e+2*t+10;let r=n\u003c160?93.2-n/40:93.2-n/120-10;return r-=2.5*s,1+.035*r+7e-6*r*(r-60)*(100-r)}}class y{#e=new Map;#s;#n;constructor(t={}){this.#s=t.statsCleanupTtlMs??35e3,this.#n=t.maxParsedStatsStorageSize??5}detect(t,e){const s={...t,networkScores:{...e,statsSamples:e?.statsSamples||{}}},n=this.performDetection(s);return this.setLastProcessedStats(t.connection.id,s),this.performPrevStatsCleanup({connectionId:t.connection.id}),n}performPrevStatsCleanup(t){const{connectionId:e,cleanupCallback:s}=t;this.#e.has(e)\u0026\u0026v({taskId:e,delayMs:this.#s,callback:()=\u003e{this.deleteLastProcessedStats(e),\"function\"==typeof s\u0026\u0026s()}})}setLastProcessedStats(t,e){if(!t||e.connection.id!==t)return;const s=this.#e.get(t)??[];s.push(e),s.length\u003ethis.#n\u0026\u0026s.shift(),this.#e.set(t,s)}getLastProcessedStats(t){const e=this.#e.get(t);return e?.[e.length-1]}getAllLastProcessedStats(t){return this.#e.get(t)??[]}deleteLastProcessedStats(t){this.#e.delete(t)}}class w extends y{#r;constructor(t={}){super(t),this.#r=t.availableOutgoingBitrateThreshold??1e5}performDetection(t){const n=[],{availableOutgoingBitrate:r}=t.connection;if(void 0===r)return n;const o=t.audio.outbound.reduce(((t,e)=\u003et+e.targetBitrate),0),i=t.video.outbound.reduce(((t,e)=\u003et+e.bitrate),0);if(!o\u0026\u0026!i)return n;const a={availableOutgoingBitrate:r,videoStreamsTotalBitrate:i,audioStreamsTotalTargetBitrate:o};return o\u003er||i\u003e0\u0026\u0026r\u003cthis.#r?(n.push({statsSample:a,type:e.Network,reason:s.OutboundNetworkThroughput}),n):n}}class b extends y{#o;#i;#a;#c;constructor(t={}){super(),this.#o=t.highPacketLossThresholdPct??5,this.#i=t.highJitterThreshold??200,this.#a=t.highJitterBufferDelayThresholdMs??500,this.#c=t.highRttThresholdMs??250}performDetection(t){return this.processData(t)}processData(t){const n=[],r=[...t.audio?.inbound,...t.video?.inbound];if(!r.length)return n;const o=this.getLastProcessedStats(t.connection.id);if(!o)return n;const i=[...o.video?.inbound,...o.audio?.inbound],{packetsReceived:a}=t.connection,c=o.connection.packetsReceived,d=r.reduce(((t,e)=\u003e{const s=i.find((t=\u003et.ssrc===e.ssrc)),n=s?.jitterBufferDelay||0,r=s?.jitterBufferEmittedCount||0,o=e.jitterBufferDelay-n,a=e.jitterBufferEmittedCount-r,c=o\u0026\u0026a?1e3*o/a:0;return{sumJitter:t.sumJitter+e.jitter,sumJitterBufferDelayMs:t.sumJitterBufferDelayMs+c,packetsLost:t.packetsLost+e.packetsLost,lastPacketsLost:t.lastPacketsLost+(s?.packetsLost||0)}}),{sumJitter:0,sumJitterBufferDelayMs:0,packetsLost:0,lastPacketsLost:0}),u=1e3*t.connection.currentRoundTripTime||0,{sumJitter:h,sumJitterBufferDelayMs:l}=d,p=h/r.length,f=l/r.length,m=a-c,g=d.packetsLost-d.lastPacketsLost,S=m\u0026\u0026g?Math.round(100*g/(m+g)):0,v=S\u003ethis.#o,k=p\u003e=this.#i,y=u\u003e=this.#c,w=f\u003ethis.#a,b=y\u0026\u0026!k\u0026\u0026!v,P=v\u0026\u0026k,T=k\u0026\u0026w,L={rtt:u,packetLossPct:S,avgJitter:p,avgJitterBufferDelay:f};return(k||v)\u0026\u0026n.push({statsSample:L,type:e.Network,reason:s.InboundNetworkQuality,iceCandidate:t.connection.local.id}),b\u0026\u0026n.push({statsSample:L,type:e.Server,reason:s.ServerIssue,iceCandidate:t.connection.remote.id}),P\u0026\u0026n.push({statsSample:L,type:e.Network,reason:s.InboundNetworkMediaLatency,iceCandidate:t.connection.local.id}),T\u0026\u0026n.push({statsSample:L,type:e.Network,reason:s.NetworkMediaSyncFailure,iceCandidate:t.connection.local.id}),n}}class P extends y{#d;constructor(t={}){super(),this.#d=t.correctedSamplesThresholdPct??5}performDetection(t){return this.processData(t)}processData(t){const n=t.audio.inbound,r=[],o=this.getLastProcessedStats(t.connection.id)?.audio.inbound;return o?(n.forEach((t=\u003e{const n=o.find((e=\u003ee.ssrc===t.ssrc));if(!n)return;const i=t.track.insertedSamplesForDeceleration+t.track.removedSamplesForAcceleration,a=n.track.insertedSamplesForDeceleration+n.track.removedSamplesForAcceleration;if(i===a)return;const c=t.track.totalSamplesReceived-n.track.totalSamplesReceived,d=i-a,u=Math.round(100*d/c),h={correctedSamplesPct:u};u\u003ethis.#d\u0026\u0026r.push({statsSample:h,type:e.Network,reason:s.NetworkMediaSyncFailure,ssrc:t.ssrc})})),r):r}}class T extends y{#o;#i;constructor(t={}){super(),this.#o=t.highPacketLossThresholdPct??5,this.#i=t.highJitterThreshold??200}performDetection(t){return this.processData(t)}processData(t){const n=[],r=[...t.remote?.audio.inbound||[],...t.remote?.video.inbound||[]];if(!r.length)return n;const o=this.getLastProcessedStats(t.connection.id);if(!o)return n;const i=[...o.remote?.audio.inbound||[],...o.remote?.video.inbound||[]],{packetsSent:a}=t.connection,c=o.connection.packetsSent,d=r.reduce(((t,e)=\u003e{const s=i.find((t=\u003et.ssrc===e.ssrc));return{sumJitter:t.sumJitter+e.jitter,packetsLost:t.packetsLost+e.packetsLost,lastPacketsLost:t.lastPacketsLost+(s?.packetsLost||0)}}),{sumJitter:0,packetsLost:0,lastPacketsLost:0}),u=1e3*t.connection.currentRoundTripTime||0,{sumJitter:h}=d,l=h/r.length,p=a-c,f=d.packetsLost-d.lastPacketsLost,m=p\u0026\u0026f?Math.round(100*f/(p+f)):0,g=m\u003ethis.#o,S=l\u003e=this.#i,v=!g\u0026\u0026S||S||g,k={rtt:u,avgJitter:l,packetLossPct:m};return g\u0026\u0026S\u0026\u0026n.push({statsSample:k,type:e.Network,reason:s.OutboundNetworkMediaLatency,iceCandidate:t.connection.local.id}),v\u0026\u0026n.push({statsSample:k,type:e.Network,reason:s.OutboundNetworkQuality,iceCandidate:t.connection.local.id}),n}}class L extends y{performDetection(t){return this.processData(t)}processData(t){const n=t.video.outbound.filter((t=\u003e\"none\"!==t.qualityLimitationReason)),r=[],o=this.getLastProcessedStats(t.connection.id)?.video.outbound;return o?(n.forEach((t=\u003e{const n=o.find((e=\u003ee.ssrc===t.ssrc));if(!n)return;const i={qualityLimitationReason:t.qualityLimitationReason};t.framesSent\u003en.framesSent||(\"cpu\"===t.qualityLimitationReason\u0026\u0026r.push({statsSample:i,type:e.CPU,reason:s.EncoderCPUThrottling,ssrc:t.ssrc}),\"bandwidth\"===t.qualityLimitationReason\u0026\u0026r.push({statsSample:i,type:e.Network,reason:s.OutboundNetworkThroughput,ssrc:t.ssrc}))})),r):r}}class D extends y{UNKNOWN_DECODER=\"unknown\";#u={};performDetection(t){return this.processData(t)}performPrevStatsCleanup(t){const{connectionId:e,cleanupCallback:s}=t;super.performPrevStatsCleanup({...t,cleanupCallback:()=\u003e{delete this.#u[e],\"function\"==typeof s\u0026\u0026s()}})}processData(t){const n=[],{id:r}=t.connection,o=this.getLastProcessedStats(r)?.video.inbound;return t.video.inbound.forEach((t=\u003e{const{decoderImplementation:i,ssrc:a}=t,c=o?.find((t=\u003et.ssrc===a));if(c)if(i===this.UNKNOWN_DECODER){if(!this.hadLastDecoderWithIssue(r,a)){this.setLastDecoderWithIssue(r,a,this.UNKNOWN_DECODER);const o={mimeType:t.mimeType,decoderImplementation:i};n.push({ssrc:a,statsSample:o,type:e.Stream,reason:s.UnknownVideoDecoderIssue,trackIdentifier:t.track.trackIdentifier})}}else this.setLastDecoderWithIssue(r,a,void 0)})),n}setLastDecoderWithIssue(t,e,s){const n=this.#u[t]??{};void 0===s?delete n[e]:n[e]=s,this.#u[t]=n}hadLastDecoderWithIssue(t,e){const s=this.#u[t];return(s\u0026\u0026s[e])===this.UNKNOWN_DECODER}}const C=t=\u003et.reduce(((t,e)=\u003et+e),0)/t.length,R=(t,e,s=30)=\u003e{const n=[];for(let s=1;s\u003ce.length-1;s+=1){const r=e[s]?.video?.inbound.find((e=\u003ee.ssrc===t));if(!r)continue;const o=e[s-1]?.video?.inbound?.find((e=\u003ee.ssrc===t));if(!r||!o)continue;const i=r.timestamp-o.timestamp,a=r.framesDecoded-o.framesDecoded;if(a\u003e0){const t=i/a;n.push(t)}}if(n.length\u003c=1)return!1;return(t=\u003e{const e=((t,e)=\u003ee.reduce(((e,s)=\u003ee+(s-t)**2),0)/e.length)(C(t),t);return Math.sqrt(e)})(n)\u003es},M=(t,e)=\u003e{for(let s=1;s\u003ce.length;s+=1){const n=e[s].video.inbound.find((e=\u003ee.ssrc===t));if(!n)continue;const r=e[s-1].video.inbound.find((e=\u003ee.ssrc===t)),o=n.frameWidth!==r?.frameWidth,i=n.frameHeight!==r?.frameHeight;if(o||i)return!0}return!1};class I extends y{#h;#l;#p;constructor(t={}){super(),this.#h=t.avgFreezeDurationThresholdMs??1e3,this.#l=t.frozenDurationThresholdPct??30,this.#p=t.minMosQuality??n.BAD}performDetection(t){const e=t.networkScores.inbound;return void 0!==e\u0026\u0026e\u003c=this.#p?[]:this.processData(t)}processData(t){const n=[],r=this.getAllLastProcessedStats(t.connection.id);if(0===r.length)return[];const o=t.video.inbound.map((e=\u003e{const s=r[r.length-1].video.inbound.find((t=\u003et.ssrc===e.ssrc));if(!s)return;if(M(e.ssrc,[r[r.length-1],t]))return;if(R(e.ssrc,r))return;const n=e.freezeCount-(s.freezeCount??0),o=1e3*(e.totalFreezesDuration-(s.totalFreezesDuration??0)),i=n\u003e0?o/n:0,a=o/(e.timestamp-s.timestamp)*100;return a\u003ethis.#l||i\u003ethis.#h?{ssrc:e.ssrc,avgFreezeDurationMs:i,frozenDurationPct:a}:void 0})).filter((t=\u003evoid 0!==t));return o.length\u003e0\u0026\u0026(n.push({type:e.Stream,reason:s.FrozenVideoTrack,statsSample:{ssrcs:o.map((t=\u003et.ssrc))}}),this.deleteLastProcessedStats(t.connection.id)),n}}class E extends y{#f;#m;#p;constructor(t={}){super(t),this.#f=t.volatilityThreshold??8,this.#m=t.affectedStreamsPercentThreshold??30,this.#p=t.minMosQuality??n.BAD}performDetection(t){return[...this.getAllLastProcessedStats(t.connection.id),t].find((t=\u003evoid 0!==t.networkScores.inbound\u0026\u0026t.networkScores.inbound\u003c=this.#p))?[]:this.processData(t)}processData(t){const n=[],r=[...this.getAllLastProcessedStats(t.connection.id),t],o=t.video.inbound.map((t=\u003e{if(r.length\u003c5)return;if(M(t.ssrc,r))return;const e=[];for(let s=0;s\u003cr.length-1;s+=1){const n=r[s].video.inbound.find((e=\u003ee.ssrc===t.ssrc));void 0!==n?.framesPerSecond\u0026\u0026e.push(n.framesPerSecond)}if(e.length\u003c5)return;if(R(t.ssrc,r))return;const s=(t=\u003e{if(0===t.length)throw new Error(\"Cannot calculate volatility for empty array\");const e=C(t);return t.reduce(((t,s)=\u003et+Math.abs(s-e)),0)/t.length*100/e})(e);return s\u003ethis.#f?{ssrc:t.ssrc,allFps:e,volatility:s}:void 0})).filter((t=\u003eBoolean(t)));if(0===o.length)return n;const i=o.length/(t.video.inbound.length/100);return i\u003ethis.#m\u0026\u0026(n.push({type:e.CPU,reason:s.DecoderCPUThrottling,statsSample:{affectedStreamsPercent:i,throtthedStreams:o}}),this.deleteLastProcessedStats(t.connection.id)),n}}const N=t=\u003e\"closed\"===t.iceConnectionState||\"closed\"===t.connectionState,_=(t,e,s)=\u003e8*((t,e,s)=\u003e{if(!e)return 0;const n=t[s],r=e[s];if(null==n||null==r)return 0;const o=Math.floor(t.timestamp)-Math.floor(e.timestamp);return 0===o?0:(Number(n)-Number(r))/o*1e3})(t,e,s);class A{connections=[];statsParser;constructor(t){this.statsParser=t.statsParser}listConnections(){return[...this.connections]}addPeerConnection(t){this.connections.push({id:t.id??String(Date.now()+Math.random().toString(32)),pc:t.pc})}removePeerConnection(t){const e=this.connections.findIndex((({pc:e})=\u003ee===t.pc));e\u003e=0\u0026\u0026this.removeConnectionsByIndexes([e])}async parse(){const t=[],e=this.connections.map((async(e,s)=\u003e{if(!N(e.pc))return this.statsParser.parse(e);t.unshift(s)}));t.length\u0026\u0026this.removeConnectionsByIndexes(t);return(await Promise.all(e)).filter((t=\u003evoid 0!==t))}removeConnectionsByIndexes(t){t.forEach((t=\u003e{this.connections.splice(t,1)}))}}class O{prevStats=new Map;allowedReportTypes=new Set([\"candidate-pair\",\"inbound-rtp\",\"outbound-rtp\",\"remote-outbound-rtp\",\"remote-inbound-rtp\",\"track\",\"transport\"]);ignoreSSRCList;logger;constructor(t){this.ignoreSSRCList=t.ignoreSSRCList??[],this.logger=t.logger}get previouslyParsedStatsConnectionsIds(){return[...this.prevStats.keys()]}async parse(t){if(!N(t.pc))return this.getConnectionStats(t);this.logger.debug(\"Skip stats parsing. Connection is closed.\",{connection:t})}async getConnectionStats(t){const{pc:e,id:s}=t;try{const n=Date.now(),r=e.getReceivers().filter((t=\u003et.track?.enabled)),o=e.getSenders().filter((t=\u003et.track?.enabled)),i=await Promise.all(r.map((t=\u003et.getStats()))),a=await Promise.all(o.map((t=\u003et.getStats())));return{id:s,stats:this.mapReportsStats([...i,...a],t),timeTaken:Date.now()-n}}catch(t){return void this.logger.error(\"Failed to get stats for PC\",{id:s,pc:e,error:t})}}mapReportsStats(t,e){const s={audio:{inbound:[],outbound:[]},video:{inbound:[],outbound:[]},connection:{},remote:{video:{inbound:[],outbound:[]},audio:{inbound:[],outbound:[]}}};t.forEach((t=\u003e{t.forEach((e=\u003e{this.allowedReportTypes.has(e.type)\u0026\u0026this.updateMappedStatsWithReportItemData(e,s,t)}))}));const{id:n}=e,r=this.prevStats.get(n);return r\u0026\u0026this.propagateStatsWithRateValues(s,r.stats),this.prevStats.set(n,{stats:s,ts:Date.now()}),v({taskId:n,delayMs:35e3,callback:()=\u003ethis.prevStats.delete(n)}),s}updateMappedStatsWithReportItemData(t,e,s){const n=t.type;if(\"candidate-pair\"===n\u0026\u0026\"succeeded\"===t.state\u0026\u0026t.nominated)return void(e.connection=this.prepareConnectionStats(t,s));const r=this.getMediaType(t);if(!r)return;const o=t.ssrc;if(!o||!this.ignoreSSRCList.includes(o))if(\"outbound-rtp\"!==n)if(\"inbound-rtp\"!==n)\"remote-outbound-rtp\"!==n?\"remote-inbound-rtp\"===n\u0026\u0026(this.mapConnectionStatsIfNecessary(e,t,s),e.remote[r].inbound.push({...t})):e.remote[r].outbound.push({...t});else{const n=s.get(t.trackId)||s.get(t.mediaSourceId)||{};this.mapConnectionStatsIfNecessary(e,t,s);const o={...t,track:{...n}};e[r].inbound.push(o)}else{const n=s.get(t.trackId)||s.get(t.mediaSourceId)||{},o={...t,track:{...n}};e[r].outbound.push(o)}}getMediaType(t){const e=t.mediaType||t.kind;if(![\"audio\",\"video\"].includes(e)){const{id:e}=t;if(!e)return;return String(e).includes(\"Video\")?\"video\":String(e).includes(\"Audio\")?\"audio\":void 0}return e}propagateStatsWithRateValues(t,e){t.audio.inbound.forEach((t=\u003e{const s=e.audio.inbound.find((({id:e})=\u003ee===t.id));t.bitrate=_(t,s,\"bytesReceived\"),t.packetRate=_(t,s,\"packetsReceived\")})),t.audio.outbound.forEach((t=\u003e{const s=e.audio.outbound.find((({id:e})=\u003ee===t.id));t.bitrate=_(t,s,\"bytesSent\"),t.packetRate=_(t,s,\"packetsSent\")})),t.video.inbound.forEach((t=\u003e{const s=e.video.inbound.find((({id:e})=\u003ee===t.id));t.bitrate=_(t,s,\"bytesReceived\"),t.packetRate=_(t,s,\"packetsReceived\")})),t.video.outbound.forEach((t=\u003e{const s=e.video.outbound.find((({id:e})=\u003ee===t.id));t.bitrate=_(t,s,\"bytesSent\"),t.packetRate=_(t,s,\"packetsSent\")}))}mapConnectionStatsIfNecessary(t,e,s){if(t.connection.id||!e.transportId)return;const n=s.get(e.transportId);if(n\u0026\u0026n.selectedCandidatePairId){const e=s.get(n.selectedCandidatePairId);t.connection=this.prepareConnectionStats(e,s)}}prepareConnectionStats(t,e){if(!t||!e)return{};const s={...t};if(s.remoteCandidateId){const t=e.get(s.remoteCandidateId);s.remote={...t}}if(s.localCandidateId){const t=e.get(s.localCandidateId);s.local={...t}}return s}}class J extends y{#g=new Map;#S;#v;constructor(t={}){super(),this.#S=t.timeoutMs??15e3,this.#v=t.steps??3}performDetection(t){return this.processData(t)}processData(t){const n=[],r=[...this.getAllLastProcessedStats(t.connection.id),t];if(r.length\u003cthis.#v)return n;const o=r.slice(-this.#v),i=o.map((t=\u003et.video.inbound)),a=o.map((t=\u003et.audio.inbound));n.push(...this.detectMissingData(a,e.Stream,s.MissingAudioStreamData)),n.push(...this.detectMissingData(i,e.Stream,s.MissingVideoStreamData));return new Set(this.#g.keys()).forEach((t=\u003e{const e=this.#g.get(t);e\u0026\u0026Date.now()-e\u003ethis.#S\u0026\u0026this.removeMarkedIssue(t)})),n}detectMissingData(t,e,s){const n=[],r=t.pop(),o=J.mapStatsByTrackId(t);return r.forEach((t=\u003e{const r=t.track.trackIdentifier,i=o.get(r);if(!Array.isArray(i)||0===i.length)return;if(t.track.detached||t.track.ended)return;if(!J.isAllBytesReceivedDidntChange(t.bytesReceived,i))return void this.removeMarkedIssue(r);if(!this.markIssue(r))return;const a={bytesReceived:t.bytesReceived};n.push({type:e,reason:s,statsSample:a,trackIdentifier:r})})),n}static mapStatsByTrackId(t){const e=new Map;return t.forEach((t=\u003e{t.forEach((t=\u003e{const s=e.get(t.track.trackIdentifier)||[];s.push(t),e.set(t.track.trackIdentifier,s)}))})),e}static isAllBytesReceivedDidntChange(t,e){for(let s=0;s\u003ce.length;s+=1){if(e[s].bytesReceived!==t)return!1}return!0}markIssue(t){const e=Date.now(),s=this.#g.get(t);return(!s||e-s\u003ethis.#S)\u0026\u0026(this.#g.set(t,e),!0)}removeMarkedIssue(t){this.#g.delete(t)}}class x{eventEmitter;#k=!1;detectors=[];networkScoresCalculator;statsReporter;compositeStatsParser;logger;autoAddPeerConnections;constructor(e){this.logger=e.logger??{debug:()=\u003e{},info:()=\u003e{},warn:()=\u003e{},error:()=\u003e{}},this.eventEmitter=e.issueEmitter??new g,e.onIssues\u0026\u0026this.eventEmitter.on(t.Issue,e.onIssues),e.onNetworkScoresUpdated\u0026\u0026this.eventEmitter.on(t.NetworkScoresUpdated,e.onNetworkScoresUpdated),this.detectors=e.detectors??[new L,new b,new T,new P,new w,new D,new I,new E,new J],this.networkScoresCalculator=e.networkScoresCalculator??new k,this.compositeStatsParser=e.compositeStatsParser??new A({statsParser:new O({ignoreSSRCList:e.ignoreSSRCList,logger:this.logger})}),this.statsReporter=e.statsReporter??new S({compositeStatsParser:this.compositeStatsParser,getStatsInterval:e.getStatsInterval??5e3}),window.wid=this,this.autoAddPeerConnections=e.autoAddPeerConnections??!0,this.autoAddPeerConnections\u0026\u0026this.wrapRTCPeerConnection(),this.statsReporter.on(S.STATS_REPORT_READY_EVENT,(t=\u003e{const e=this.calculateNetworkScores(t.stats);this.detectIssues({data:t.stats},e)})),this.statsReporter.on(S.STATS_REPORTS_PARSED,(s=\u003e{const n={timeTaken:s.timeTaken,ts:Date.now()};e.onStats\u0026\u0026e.onStats(s.reportItems),this.eventEmitter.emit(t.StatsParsingFinished,n)}))}watchNewPeerConnections(){if(!this.autoAddPeerConnections)throw new Error(\"Auto add peer connections was disabled in the constructor.\");this.#k?this.logger.warn(\"WebRTCIssueDetector is already started. Skip processing\"):(this.logger.info(\"Start watching peer connections\"),this.#k=!0,this.statsReporter.startReporting())}stopWatchingNewPeerConnections(){this.#k?(this.logger.info(\"Stop watching peer connections\"),this.#k=!1,this.statsReporter.stopReporting()):this.logger.warn(\"WebRTCIssueDetector is already stopped. Skip processing\")}handleNewPeerConnection(t,e){this.#k||!this.autoAddPeerConnections?(this.#k||!1!==this.autoAddPeerConnections||(this.logger.info(\"Starting stats reporting for new peer connection\"),this.#k=!0,this.statsReporter.startReporting()),this.logger.debug(\"Handling new peer connection\",t),this.compositeStatsParser.addPeerConnection({pc:t,id:e})):this.logger.debug(\"Skip handling new peer connection. Detector is not running\",t)}emitIssues(e){this.eventEmitter.emit(t.Issue,e)}detectIssues({data:t},e){const s=this.detectors.reduce(((s,n)=\u003e[...s,...n.detect(t,e)]),[]);s.length\u003e0\u0026\u0026this.emitIssues(s)}calculateNetworkScores(e){const s=this.networkScoresCalculator.calculate(e);return this.eventEmitter.emit(t.NetworkScoresUpdated,s),s}wrapRTCPeerConnection(){if(!window.RTCPeerConnection)return void this.logger.warn(\"No RTCPeerConnection found in browser window. Skipping\");const t=window.RTCPeerConnection,e=t=\u003ethis.handleNewPeerConnection(t);function s(s){const n=new t(s);return e(n),n}s.prototype=t.prototype,window.RTCPeerConnection=s}}export{w as AvailableOutgoingBitrateIssueDetector,y as BaseIssueDetector,A as CompositeRTCStatsParser,t as EventType,I as FrozenVideoTrackDetector,b as InboundNetworkIssueDetector,s as IssueReason,e as IssueType,n as MosQuality,P as NetworkMediaSyncIssueDetector,k as NetworkScoresCalculator,T as OutboundNetworkIssueDetector,S as PeriodicWebRTCStatsReporter,L as QualityLimitationsIssueDetector,O as RTCStatsParser,D as UnknownVideoDecoderImplementationDetector,E as VideoDecoderIssueDetector,g as WebRTCIssueEmitter,x as default};\n"],"version":3}
