@webex/plugin-meetings 3.12.0-next.40 → 3.12.0-next.42
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/aiEnableRequest/index.js +1 -1
- package/dist/breakouts/breakout.js +1 -1
- package/dist/breakouts/index.js +1 -1
- package/dist/constants.js +2 -1
- package/dist/constants.js.map +1 -1
- package/dist/interpretation/index.js +1 -1
- package/dist/interpretation/siLanguage.js +1 -1
- package/dist/media/properties.js +1 -0
- package/dist/media/properties.js.map +1 -1
- package/dist/meeting/index.js +37 -6
- package/dist/meeting/index.js.map +1 -1
- package/dist/types/constants.d.ts +1 -0
- package/dist/types/media/properties.d.ts +1 -0
- package/dist/webinar/index.js +1 -1
- package/package.json +13 -13
- package/src/constants.ts +1 -0
- package/src/media/properties.ts +1 -0
- package/src/meeting/index.ts +27 -0
- package/test/unit/spec/meeting/index.js +291 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_tsSdp","require","_lodash","_metrics","_interopRequireDefault","_constants","_loggerProxy","_MediaConnectionAwaiter","_constants2","_createForOfIteratorHelper","r","e","t","_Symbol","_Symbol$iterator","_Array$isArray","_unsupportedIterableToArray","length","_n","F","s","n","done","value","f","TypeError","o","a","u","call","next","return","_arrayLikeToArray","toString","slice","constructor","name","_Array$from","test","Array","ownKeys","_Object$keys2","_Object$getOwnPropertySymbols","filter","_Object$getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","Object","forEach","_defineProperty2","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty","MediaProperties","exports","_this","_classCallCheck2","MEETINGS","webrtcMediaConnection","mediaDirection","receiveAudio","receiveVideo","receiveShare","sendAudio","sendVideo","sendShare","videoStream","audioStream","shareVideoStream","shareAudioStream","remoteShareStream","undefined","remoteAudioStream","remoteVideoStream","remoteQualityLevel","QUALITY_LEVELS","HIGH","mediaSettings","videoDeviceId","throttledSendMediaIssueMetric","throttle","eventPayload","Metrics","sendBehavioralMetric","BEHAVIORAL_METRICS","MEDIA_ISSUE_DETECTED","_keys","mediaIssueCounters","key","_createClass2","getVideoDeviceId","setMediaDirection","setMediaSettings","type","values","setMediaPeerConnection","mediaPeerConnection","setLocalVideoStream","setLocalAudioStream","setLocalShareVideoStream","setLocalShareAudioStream","setRemoteQualityLevel","setRemoteShareStream","setRemoteAudioStream","setRemoteVideoStream","setVideoDeviceId","deviceId","unsetPeerConnection","flush","unsetRemoteMedia","unsetRemoteShareStream","unsetRemoteStreams","hasLocalShareStream","waitForMediaConnectionConnected","correlationId","mediaConnectionAwaiter","MediaConnectionAwaiter","getTransportInfo","allStatsReports","transports","report","LoggerProxy","logger","warn","concat","selectedCandidatePairChanges","numTransports","isIPv6","ip","includes","getConnectionIpVersion","selectedCandidatePair","selectedCandidatePairId","find","id","selected","localCandidate","localCandidateId","address","localSdp","localDescription","sdp","parsedSdp","parse","_iterator","avMedia","_step","mediaLine","matchingCandidate","iceInfo","candidates","candidate","port","connectionAddress","err","error","_transports$","getConnectionType","successfulCandidatePairs","_report$state","state","toLowerCase","foundConnectionType","some","pair","connectionType","relayProtocol","toUpperCase","_localCandidate$proto","protocol","candidateType","candidatePairStates","map","_stringify","_getCurrentConnectionInfo","_asyncToGenerator2","_regenerator","mark","_callee","_this2","_this$webrtcMediaConn","_this$webrtcMediaConn2","rtcPeerconnection","ipVersion","_this$getTransportInf","_t","wrap","_context","prev","_promise","resolve","reject","timeout","setTimeout","Error","getStats","then","statsResult","clearTimeout","catch","multistreamConnection","pc","mediaConnection","abrupt","stop","getCurrentConnectionInfo","sendMediaIssueMetric","issueType","issueSubType","count"],"sources":["properties.ts"],"sourcesContent":["/* eslint-disable class-methods-use-this */\nimport {\n LocalCameraStream,\n LocalMicrophoneStream,\n LocalDisplayStream,\n LocalSystemAudioStream,\n RemoteStream,\n} from '@webex/media-helpers';\n\nimport {parse} from '@webex/ts-sdp';\nimport {ClientEvent} from '@webex/internal-plugin-metrics';\nimport {throttle} from 'lodash';\nimport Metrics from '../metrics';\nimport {MEETINGS, QUALITY_LEVELS} from '../constants';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport MediaConnectionAwaiter from './MediaConnectionAwaiter';\nimport BEHAVIORAL_METRICS from '../metrics/constants';\n\nexport type MediaDirection = {\n sendAudio: boolean;\n sendVideo: boolean;\n sendShare: boolean;\n receiveAudio: boolean;\n receiveVideo: boolean;\n receiveShare: boolean;\n};\n\nexport type IPVersion = ClientEvent['payload']['ipVersion'];\n\n/**\n * @class MediaProperties\n */\nexport default class MediaProperties {\n audioStream?: LocalMicrophoneStream;\n mediaDirection: MediaDirection;\n mediaSettings: any;\n webrtcMediaConnection: any;\n remoteAudioStream: RemoteStream;\n remoteQualityLevel: any;\n remoteShareStream: RemoteStream;\n remoteVideoStream: RemoteStream;\n shareVideoStream?: LocalDisplayStream;\n shareAudioStream?: LocalSystemAudioStream;\n videoDeviceId: any;\n videoStream?: LocalCameraStream;\n namespace = MEETINGS;\n mediaIssueCounters: {[key: string]: number} = {};\n throttledSendMediaIssueMetric: ReturnType<typeof throttle>;\n\n /**\n * @param {Object} [options] -- to auto construct\n * @returns {MediaProperties}\n */\n constructor() {\n this.webrtcMediaConnection = null;\n this.mediaDirection = {\n receiveAudio: false,\n receiveVideo: false,\n receiveShare: false,\n sendAudio: false,\n sendVideo: false,\n sendShare: false,\n };\n this.videoStream = null;\n this.audioStream = null;\n this.shareVideoStream = null;\n this.shareAudioStream = null;\n this.remoteShareStream = undefined;\n this.remoteAudioStream = undefined;\n this.remoteVideoStream = undefined;\n this.remoteQualityLevel = QUALITY_LEVELS.HIGH;\n this.mediaSettings = {};\n this.videoDeviceId = null;\n\n this.throttledSendMediaIssueMetric = throttle((eventPayload) => {\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MEDIA_ISSUE_DETECTED, {\n ...eventPayload,\n });\n Object.keys(this.mediaIssueCounters).forEach((key) => {\n this.mediaIssueCounters[key] = 0;\n });\n }, 1000 * 60 * 5); // at most once every 5 minutes\n }\n\n /**\n * Retrieves the preferred video input device\n * @returns {Object|null}\n */\n getVideoDeviceId() {\n return this.videoDeviceId || null;\n }\n\n setMediaDirection(mediaDirection) {\n this.mediaDirection = mediaDirection;\n }\n\n setMediaSettings(type, values) {\n this.mediaSettings[type] = values;\n }\n\n setMediaPeerConnection(mediaPeerConnection) {\n this.webrtcMediaConnection = mediaPeerConnection;\n }\n\n setLocalVideoStream(videoStream?: LocalCameraStream) {\n this.videoStream = videoStream;\n }\n\n setLocalAudioStream(audioStream?: LocalMicrophoneStream) {\n this.audioStream = audioStream;\n }\n\n setLocalShareVideoStream(shareVideoStream?: LocalDisplayStream) {\n this.shareVideoStream = shareVideoStream;\n }\n\n setLocalShareAudioStream(shareAudioStream?: LocalSystemAudioStream) {\n this.shareAudioStream = shareAudioStream;\n }\n\n setRemoteQualityLevel(remoteQualityLevel) {\n this.remoteQualityLevel = remoteQualityLevel;\n }\n\n setRemoteShareStream(remoteShareStream: RemoteStream) {\n this.remoteShareStream = remoteShareStream;\n }\n\n /**\n * Sets the remote audio stream\n * @param {RemoteStream} remoteAudioStream RemoteStream to save\n * @returns {void}\n */\n setRemoteAudioStream(remoteAudioStream: RemoteStream) {\n this.remoteAudioStream = remoteAudioStream;\n }\n\n /**\n * Sets the remote video stream\n * @param {RemoteStream} remoteVideoStream RemoteStream to save\n * @returns {void}\n */\n setRemoteVideoStream(remoteVideoStream: RemoteStream) {\n this.remoteVideoStream = remoteVideoStream;\n }\n\n /**\n * Stores the preferred video input device\n * @param {string} deviceId Preferred video input device\n * @returns {void}\n */\n setVideoDeviceId(deviceId: string) {\n this.videoDeviceId = deviceId;\n }\n\n /**\n * Clears the webrtcMediaConnection. This method should be called after\n * peer connection is closed and no longer needed.\n * @returns {void}\n */\n unsetPeerConnection() {\n this.webrtcMediaConnection = null;\n this.throttledSendMediaIssueMetric.flush();\n }\n\n /**\n * Removes both remote audio and video from class instance\n * @returns {void}\n */\n unsetRemoteMedia() {\n this.remoteAudioStream = null;\n this.remoteVideoStream = null;\n }\n\n unsetRemoteShareStream() {\n this.remoteShareStream = null;\n }\n\n /**\n * Unsets all remote streams\n * @returns {void}\n */\n unsetRemoteStreams() {\n this.unsetRemoteMedia();\n this.unsetRemoteShareStream();\n }\n\n /**\n * Returns if we have at least one local share stream or not.\n * @returns {Boolean}\n */\n hasLocalShareStream() {\n return !!(this.shareAudioStream || this.shareVideoStream);\n }\n\n /**\n * Waits for the webrtc media connection to be connected.\n *\n * @param {string} correlationId\n * @returns {Promise<void>}\n */\n waitForMediaConnectionConnected(correlationId: string): Promise<void> {\n const mediaConnectionAwaiter = new MediaConnectionAwaiter({\n webrtcMediaConnection: this.webrtcMediaConnection,\n correlationId,\n });\n\n return mediaConnectionAwaiter.waitForMediaConnectionConnected();\n }\n\n /**\n * Returns ICE transport information:\n * - selectedCandidatePairChanges - number of times the selected candidate pair was changed, it should be at least 1 for successful connections\n * it will be -1 if browser doesn't supply this information\n * - numTransports - number of transports (should be 1 if we're using bundle)\n *\n * @param {Array<any>} allStatsReports array of RTC stats reports\n * @returns {Object}\n */\n private getTransportInfo(allStatsReports: any[]): {\n selectedCandidatePairChanges: number;\n numTransports: number;\n } {\n const transports = allStatsReports.filter((report) => report.type === 'transport');\n\n if (transports.length > 1) {\n LoggerProxy.logger.warn(\n `Media:properties#getSelectedCandidatePairChanges --> found more than 1 transport: ${transports.length}`\n );\n }\n\n return {\n selectedCandidatePairChanges:\n transports.length > 0 && transports[0].selectedCandidatePairChanges !== undefined\n ? transports[0].selectedCandidatePairChanges\n : -1,\n numTransports: transports.length,\n };\n }\n\n /**\n * Checks if the given IP address is IPv6\n * @param {string} ip address to check\n * @returns {boolean} true if the address is IPv6, false otherwise\n */\n private isIPv6(ip: string): boolean {\n return ip.includes(':');\n }\n\n /** Finds out if we connected using IPv4 or IPv6\n * @param {RTCPeerConnection} webrtcMediaConnection\n * @param {Array<any>} allStatsReports array of RTC stats reports\n * @returns {string} IPVersion\n */\n private getConnectionIpVersion(\n webrtcMediaConnection: RTCPeerConnection,\n allStatsReports: any[]\n ): IPVersion | undefined {\n const transports = allStatsReports.filter((report) => report.type === 'transport');\n\n let selectedCandidatePair;\n\n if (transports.length > 0 && transports[0].selectedCandidatePairId) {\n selectedCandidatePair = allStatsReports.find(\n (report) =>\n report.type === 'candidate-pair' && report.id === transports[0].selectedCandidatePairId\n );\n } else {\n // Firefox doesn't have selectedCandidatePairId, but has selected property on the candidate pair\n selectedCandidatePair = allStatsReports.find(\n (report) => report.type === 'candidate-pair' && report.selected\n );\n }\n\n if (selectedCandidatePair) {\n const localCandidate = allStatsReports.find(\n (report) =>\n report.type === 'local-candidate' && report.id === selectedCandidatePair.localCandidateId\n );\n\n if (localCandidate) {\n if (localCandidate.address) {\n return this.isIPv6(localCandidate.address) ? 'IPv6' : 'IPv4';\n }\n\n try {\n // safari doesn't have address field on the candidate, so we have to use the port to look up the candidate in the SDP\n const localSdp = webrtcMediaConnection.localDescription.sdp;\n\n const parsedSdp = parse(localSdp);\n\n for (const mediaLine of parsedSdp.avMedia) {\n const matchingCandidate = mediaLine.iceInfo.candidates.find(\n (candidate) => candidate.port === localCandidate.port\n );\n if (matchingCandidate) {\n return this.isIPv6(matchingCandidate.connectionAddress) ? 'IPv6' : 'IPv4';\n }\n }\n\n LoggerProxy.logger.warn(\n `Media:properties#getConnectionIpVersion --> failed to find local candidate in the SDP for port ${localCandidate.port}`\n );\n } catch (error) {\n LoggerProxy.logger.warn(\n `Media:properties#getConnectionIpVersion --> error while trying to find candidate in local SDP:`,\n error\n );\n\n return undefined;\n }\n } else {\n LoggerProxy.logger.warn(\n `Media:properties#getConnectionIpVersion --> failed to find local candidate \"${selectedCandidatePair.localCandidateId}\" in getStats() results`\n );\n }\n } else {\n LoggerProxy.logger.warn(\n `Media:properties#getConnectionIpVersion --> failed to find selected candidate pair in getStats() results (transports.length=${transports.length}, selectedCandidatePairId=${transports[0]?.selectedCandidatePairId})`\n );\n }\n\n return undefined;\n }\n\n /**\n * Returns the type of a connection that has been established\n * It should be 'UDP' | 'TCP' | 'TURN-TLS' | 'TURN-TCP' | 'TURN-UDP' | 'unknown'\n *\n * If connection was not established, it returns 'unknown'\n *\n * @param {Array<any>} allStatsReports array of RTC stats reports\n * @returns {string}\n */\n private getConnectionType(allStatsReports: any[]) {\n const successfulCandidatePairs = allStatsReports.filter(\n (report) => report.type === 'candidate-pair' && report.state?.toLowerCase() === 'succeeded'\n );\n\n let foundConnectionType = 'unknown';\n\n // all of the successful pairs should have the same connection type, so just return the type for the first one\n successfulCandidatePairs.some((pair) => {\n const localCandidate = allStatsReports.find(\n (report) => report.type === 'local-candidate' && report.id === pair.localCandidateId\n );\n\n if (localCandidate === undefined) {\n LoggerProxy.logger.warn(\n `Media:properties#getConnectionType --> failed to find local candidate \"${pair.localCandidateId}\" in getStats() results`\n );\n\n return false;\n }\n\n let connectionType;\n\n if (localCandidate.relayProtocol) {\n connectionType = `TURN-${localCandidate.relayProtocol.toUpperCase()}`;\n } else {\n connectionType = localCandidate.protocol?.toUpperCase(); // it will be UDP or TCP\n }\n\n if (connectionType) {\n foundConnectionType = connectionType;\n\n return true;\n }\n LoggerProxy.logger.warn(\n `Media:properties#getConnectionType --> missing localCandidate.protocol, candidateType=${localCandidate.candidateType}`\n );\n\n return false;\n });\n\n if (foundConnectionType === 'unknown') {\n const candidatePairStates = allStatsReports\n .filter((report) => report.type === 'candidate-pair')\n .map((report) => report.state);\n\n LoggerProxy.logger.warn(\n `Media:properties#getConnectionType --> all candidate pair states: ${JSON.stringify(\n candidatePairStates\n )}`\n );\n }\n\n return foundConnectionType;\n }\n\n /**\n * Returns information about current webrtc media connection\n *\n * @returns {Promise<Object>}\n */\n async getCurrentConnectionInfo(): Promise<{\n connectionType: string;\n ipVersion?: IPVersion;\n selectedCandidatePairChanges: number;\n numTransports: number;\n }> {\n try {\n const allStatsReports = [];\n\n await new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(new Error('timed out'));\n }, 1000);\n\n this.webrtcMediaConnection\n .getStats()\n .then((statsResult) => {\n clearTimeout(timeout);\n statsResult.forEach((report) => allStatsReports.push(report));\n resolve(allStatsReports);\n })\n .catch((error) => {\n clearTimeout(timeout);\n reject(error);\n });\n });\n\n const connectionType = this.getConnectionType(allStatsReports);\n const rtcPeerconnection =\n this.webrtcMediaConnection.multistreamConnection?.pc.pc ||\n this.webrtcMediaConnection.mediaConnection?.pc;\n const ipVersion = this.getConnectionIpVersion(rtcPeerconnection, allStatsReports);\n const {selectedCandidatePairChanges, numTransports} = this.getTransportInfo(allStatsReports);\n\n return {\n connectionType,\n ipVersion,\n selectedCandidatePairChanges,\n numTransports,\n };\n } catch (error) {\n LoggerProxy.logger.warn(\n `Media:properties#getCurrentConnectionInfo --> getStats() failed: ${error}`\n );\n\n return {\n connectionType: 'unknown',\n ipVersion: undefined,\n selectedCandidatePairChanges: -1,\n numTransports: 0,\n };\n }\n }\n\n /**\n * Sends a metric about a media issue. Metrics are throttled so that we don't\n * send too many of them, but include a count so that we know how many issues\n * were detected.\n *\n * @param {string} issueType\n * @param {string} issueSubType\n * @param {string} correlationId\n * @returns {void}\n */\n public sendMediaIssueMetric(issueType: string, issueSubType: string, correlationId) {\n const key = `${issueType}_${issueSubType}`;\n\n const count = (this.mediaIssueCounters[key] || 0) + 1;\n\n this.mediaIssueCounters[key] = count;\n\n this.throttledSendMediaIssueMetric({\n correlationId,\n ...this.mediaIssueCounters,\n });\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_tsSdp","require","_lodash","_metrics","_interopRequireDefault","_constants","_loggerProxy","_MediaConnectionAwaiter","_constants2","_createForOfIteratorHelper","r","e","t","_Symbol","_Symbol$iterator","_Array$isArray","_unsupportedIterableToArray","length","_n","F","s","n","done","value","f","TypeError","o","a","u","call","next","return","_arrayLikeToArray","toString","slice","constructor","name","_Array$from","test","Array","ownKeys","_Object$keys2","_Object$getOwnPropertySymbols","filter","_Object$getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","Object","forEach","_defineProperty2","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty","MediaProperties","exports","_this","_classCallCheck2","MEETINGS","webrtcMediaConnection","mediaDirection","receiveAudio","receiveVideo","receiveShare","sendAudio","sendVideo","sendShare","videoStream","audioStream","shareVideoStream","shareAudioStream","remoteShareStream","undefined","remoteAudioStream","remoteVideoStream","remoteQualityLevel","QUALITY_LEVELS","HIGH","mediaSettings","videoDeviceId","throttledSendMediaIssueMetric","throttle","eventPayload","Metrics","sendBehavioralMetric","BEHAVIORAL_METRICS","MEDIA_ISSUE_DETECTED","_keys","mediaIssueCounters","key","_createClass2","getVideoDeviceId","setMediaDirection","setMediaSettings","type","values","setMediaPeerConnection","mediaPeerConnection","setLocalVideoStream","setLocalAudioStream","setLocalShareVideoStream","setLocalShareAudioStream","setRemoteQualityLevel","setRemoteShareStream","setRemoteAudioStream","setRemoteVideoStream","setVideoDeviceId","deviceId","unsetPeerConnection","flush","unsetRemoteMedia","unsetRemoteShareStream","unsetRemoteStreams","hasLocalShareStream","waitForMediaConnectionConnected","correlationId","mediaConnectionAwaiter","MediaConnectionAwaiter","getTransportInfo","allStatsReports","transports","report","LoggerProxy","logger","warn","concat","selectedCandidatePairChanges","numTransports","isIPv6","ip","includes","getConnectionIpVersion","selectedCandidatePair","selectedCandidatePairId","find","id","selected","localCandidate","localCandidateId","address","localSdp","localDescription","sdp","parsedSdp","parse","_iterator","avMedia","_step","mediaLine","matchingCandidate","iceInfo","candidates","candidate","port","connectionAddress","err","error","_transports$","getConnectionType","successfulCandidatePairs","_report$state","state","toLowerCase","foundConnectionType","some","pair","connectionType","relayProtocol","toUpperCase","_localCandidate$proto","protocol","candidateType","candidatePairStates","map","_stringify","_getCurrentConnectionInfo","_asyncToGenerator2","_regenerator","mark","_callee","_this2","_this$webrtcMediaConn","_this$webrtcMediaConn2","rtcPeerconnection","ipVersion","_this$getTransportInf","_t","wrap","_context","prev","_promise","resolve","reject","timeout","setTimeout","Error","getStats","then","statsResult","clearTimeout","catch","multistreamConnection","pc","mediaConnection","abrupt","stop","getCurrentConnectionInfo","sendMediaIssueMetric","issueType","issueSubType","count"],"sources":["properties.ts"],"sourcesContent":["/* eslint-disable class-methods-use-this */\nimport {\n LocalCameraStream,\n LocalMicrophoneStream,\n LocalDisplayStream,\n LocalSystemAudioStream,\n RemoteStream,\n} from '@webex/media-helpers';\n\nimport {parse} from '@webex/ts-sdp';\nimport {ClientEvent} from '@webex/internal-plugin-metrics';\nimport {throttle} from 'lodash';\nimport Metrics from '../metrics';\nimport {MEETINGS, QUALITY_LEVELS} from '../constants';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport MediaConnectionAwaiter from './MediaConnectionAwaiter';\nimport BEHAVIORAL_METRICS from '../metrics/constants';\n\nexport type MediaDirection = {\n sendAudio: boolean;\n sendVideo: boolean;\n sendShare: boolean;\n receiveAudio: boolean;\n receiveVideo: boolean;\n receiveShare: boolean;\n};\n\nexport type IPVersion = ClientEvent['payload']['ipVersion'];\n\n/**\n * @class MediaProperties\n */\nexport default class MediaProperties {\n audioStream?: LocalMicrophoneStream;\n mediaDirection: MediaDirection;\n mediaSettings: any;\n webrtcMediaConnection: any;\n remoteAudioStream: RemoteStream;\n remoteQualityLevel: any;\n remoteShareStream: RemoteStream;\n remoteVideoStream: RemoteStream;\n shareVideoStream?: LocalDisplayStream;\n shareAudioStream?: LocalSystemAudioStream;\n videoDeviceId: any;\n videoStream?: LocalCameraStream;\n srtpCipher: string | undefined;\n namespace = MEETINGS;\n mediaIssueCounters: {[key: string]: number} = {};\n throttledSendMediaIssueMetric: ReturnType<typeof throttle>;\n\n /**\n * @param {Object} [options] -- to auto construct\n * @returns {MediaProperties}\n */\n constructor() {\n this.webrtcMediaConnection = null;\n this.mediaDirection = {\n receiveAudio: false,\n receiveVideo: false,\n receiveShare: false,\n sendAudio: false,\n sendVideo: false,\n sendShare: false,\n };\n this.videoStream = null;\n this.audioStream = null;\n this.shareVideoStream = null;\n this.shareAudioStream = null;\n this.remoteShareStream = undefined;\n this.remoteAudioStream = undefined;\n this.remoteVideoStream = undefined;\n this.remoteQualityLevel = QUALITY_LEVELS.HIGH;\n this.mediaSettings = {};\n this.videoDeviceId = null;\n\n this.throttledSendMediaIssueMetric = throttle((eventPayload) => {\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MEDIA_ISSUE_DETECTED, {\n ...eventPayload,\n });\n Object.keys(this.mediaIssueCounters).forEach((key) => {\n this.mediaIssueCounters[key] = 0;\n });\n }, 1000 * 60 * 5); // at most once every 5 minutes\n }\n\n /**\n * Retrieves the preferred video input device\n * @returns {Object|null}\n */\n getVideoDeviceId() {\n return this.videoDeviceId || null;\n }\n\n setMediaDirection(mediaDirection) {\n this.mediaDirection = mediaDirection;\n }\n\n setMediaSettings(type, values) {\n this.mediaSettings[type] = values;\n }\n\n setMediaPeerConnection(mediaPeerConnection) {\n this.webrtcMediaConnection = mediaPeerConnection;\n }\n\n setLocalVideoStream(videoStream?: LocalCameraStream) {\n this.videoStream = videoStream;\n }\n\n setLocalAudioStream(audioStream?: LocalMicrophoneStream) {\n this.audioStream = audioStream;\n }\n\n setLocalShareVideoStream(shareVideoStream?: LocalDisplayStream) {\n this.shareVideoStream = shareVideoStream;\n }\n\n setLocalShareAudioStream(shareAudioStream?: LocalSystemAudioStream) {\n this.shareAudioStream = shareAudioStream;\n }\n\n setRemoteQualityLevel(remoteQualityLevel) {\n this.remoteQualityLevel = remoteQualityLevel;\n }\n\n setRemoteShareStream(remoteShareStream: RemoteStream) {\n this.remoteShareStream = remoteShareStream;\n }\n\n /**\n * Sets the remote audio stream\n * @param {RemoteStream} remoteAudioStream RemoteStream to save\n * @returns {void}\n */\n setRemoteAudioStream(remoteAudioStream: RemoteStream) {\n this.remoteAudioStream = remoteAudioStream;\n }\n\n /**\n * Sets the remote video stream\n * @param {RemoteStream} remoteVideoStream RemoteStream to save\n * @returns {void}\n */\n setRemoteVideoStream(remoteVideoStream: RemoteStream) {\n this.remoteVideoStream = remoteVideoStream;\n }\n\n /**\n * Stores the preferred video input device\n * @param {string} deviceId Preferred video input device\n * @returns {void}\n */\n setVideoDeviceId(deviceId: string) {\n this.videoDeviceId = deviceId;\n }\n\n /**\n * Clears the webrtcMediaConnection. This method should be called after\n * peer connection is closed and no longer needed.\n * @returns {void}\n */\n unsetPeerConnection() {\n this.webrtcMediaConnection = null;\n this.throttledSendMediaIssueMetric.flush();\n }\n\n /**\n * Removes both remote audio and video from class instance\n * @returns {void}\n */\n unsetRemoteMedia() {\n this.remoteAudioStream = null;\n this.remoteVideoStream = null;\n }\n\n unsetRemoteShareStream() {\n this.remoteShareStream = null;\n }\n\n /**\n * Unsets all remote streams\n * @returns {void}\n */\n unsetRemoteStreams() {\n this.unsetRemoteMedia();\n this.unsetRemoteShareStream();\n }\n\n /**\n * Returns if we have at least one local share stream or not.\n * @returns {Boolean}\n */\n hasLocalShareStream() {\n return !!(this.shareAudioStream || this.shareVideoStream);\n }\n\n /**\n * Waits for the webrtc media connection to be connected.\n *\n * @param {string} correlationId\n * @returns {Promise<void>}\n */\n waitForMediaConnectionConnected(correlationId: string): Promise<void> {\n const mediaConnectionAwaiter = new MediaConnectionAwaiter({\n webrtcMediaConnection: this.webrtcMediaConnection,\n correlationId,\n });\n\n return mediaConnectionAwaiter.waitForMediaConnectionConnected();\n }\n\n /**\n * Returns ICE transport information:\n * - selectedCandidatePairChanges - number of times the selected candidate pair was changed, it should be at least 1 for successful connections\n * it will be -1 if browser doesn't supply this information\n * - numTransports - number of transports (should be 1 if we're using bundle)\n *\n * @param {Array<any>} allStatsReports array of RTC stats reports\n * @returns {Object}\n */\n private getTransportInfo(allStatsReports: any[]): {\n selectedCandidatePairChanges: number;\n numTransports: number;\n } {\n const transports = allStatsReports.filter((report) => report.type === 'transport');\n\n if (transports.length > 1) {\n LoggerProxy.logger.warn(\n `Media:properties#getSelectedCandidatePairChanges --> found more than 1 transport: ${transports.length}`\n );\n }\n\n return {\n selectedCandidatePairChanges:\n transports.length > 0 && transports[0].selectedCandidatePairChanges !== undefined\n ? transports[0].selectedCandidatePairChanges\n : -1,\n numTransports: transports.length,\n };\n }\n\n /**\n * Checks if the given IP address is IPv6\n * @param {string} ip address to check\n * @returns {boolean} true if the address is IPv6, false otherwise\n */\n private isIPv6(ip: string): boolean {\n return ip.includes(':');\n }\n\n /** Finds out if we connected using IPv4 or IPv6\n * @param {RTCPeerConnection} webrtcMediaConnection\n * @param {Array<any>} allStatsReports array of RTC stats reports\n * @returns {string} IPVersion\n */\n private getConnectionIpVersion(\n webrtcMediaConnection: RTCPeerConnection,\n allStatsReports: any[]\n ): IPVersion | undefined {\n const transports = allStatsReports.filter((report) => report.type === 'transport');\n\n let selectedCandidatePair;\n\n if (transports.length > 0 && transports[0].selectedCandidatePairId) {\n selectedCandidatePair = allStatsReports.find(\n (report) =>\n report.type === 'candidate-pair' && report.id === transports[0].selectedCandidatePairId\n );\n } else {\n // Firefox doesn't have selectedCandidatePairId, but has selected property on the candidate pair\n selectedCandidatePair = allStatsReports.find(\n (report) => report.type === 'candidate-pair' && report.selected\n );\n }\n\n if (selectedCandidatePair) {\n const localCandidate = allStatsReports.find(\n (report) =>\n report.type === 'local-candidate' && report.id === selectedCandidatePair.localCandidateId\n );\n\n if (localCandidate) {\n if (localCandidate.address) {\n return this.isIPv6(localCandidate.address) ? 'IPv6' : 'IPv4';\n }\n\n try {\n // safari doesn't have address field on the candidate, so we have to use the port to look up the candidate in the SDP\n const localSdp = webrtcMediaConnection.localDescription.sdp;\n\n const parsedSdp = parse(localSdp);\n\n for (const mediaLine of parsedSdp.avMedia) {\n const matchingCandidate = mediaLine.iceInfo.candidates.find(\n (candidate) => candidate.port === localCandidate.port\n );\n if (matchingCandidate) {\n return this.isIPv6(matchingCandidate.connectionAddress) ? 'IPv6' : 'IPv4';\n }\n }\n\n LoggerProxy.logger.warn(\n `Media:properties#getConnectionIpVersion --> failed to find local candidate in the SDP for port ${localCandidate.port}`\n );\n } catch (error) {\n LoggerProxy.logger.warn(\n `Media:properties#getConnectionIpVersion --> error while trying to find candidate in local SDP:`,\n error\n );\n\n return undefined;\n }\n } else {\n LoggerProxy.logger.warn(\n `Media:properties#getConnectionIpVersion --> failed to find local candidate \"${selectedCandidatePair.localCandidateId}\" in getStats() results`\n );\n }\n } else {\n LoggerProxy.logger.warn(\n `Media:properties#getConnectionIpVersion --> failed to find selected candidate pair in getStats() results (transports.length=${transports.length}, selectedCandidatePairId=${transports[0]?.selectedCandidatePairId})`\n );\n }\n\n return undefined;\n }\n\n /**\n * Returns the type of a connection that has been established\n * It should be 'UDP' | 'TCP' | 'TURN-TLS' | 'TURN-TCP' | 'TURN-UDP' | 'unknown'\n *\n * If connection was not established, it returns 'unknown'\n *\n * @param {Array<any>} allStatsReports array of RTC stats reports\n * @returns {string}\n */\n private getConnectionType(allStatsReports: any[]) {\n const successfulCandidatePairs = allStatsReports.filter(\n (report) => report.type === 'candidate-pair' && report.state?.toLowerCase() === 'succeeded'\n );\n\n let foundConnectionType = 'unknown';\n\n // all of the successful pairs should have the same connection type, so just return the type for the first one\n successfulCandidatePairs.some((pair) => {\n const localCandidate = allStatsReports.find(\n (report) => report.type === 'local-candidate' && report.id === pair.localCandidateId\n );\n\n if (localCandidate === undefined) {\n LoggerProxy.logger.warn(\n `Media:properties#getConnectionType --> failed to find local candidate \"${pair.localCandidateId}\" in getStats() results`\n );\n\n return false;\n }\n\n let connectionType;\n\n if (localCandidate.relayProtocol) {\n connectionType = `TURN-${localCandidate.relayProtocol.toUpperCase()}`;\n } else {\n connectionType = localCandidate.protocol?.toUpperCase(); // it will be UDP or TCP\n }\n\n if (connectionType) {\n foundConnectionType = connectionType;\n\n return true;\n }\n LoggerProxy.logger.warn(\n `Media:properties#getConnectionType --> missing localCandidate.protocol, candidateType=${localCandidate.candidateType}`\n );\n\n return false;\n });\n\n if (foundConnectionType === 'unknown') {\n const candidatePairStates = allStatsReports\n .filter((report) => report.type === 'candidate-pair')\n .map((report) => report.state);\n\n LoggerProxy.logger.warn(\n `Media:properties#getConnectionType --> all candidate pair states: ${JSON.stringify(\n candidatePairStates\n )}`\n );\n }\n\n return foundConnectionType;\n }\n\n /**\n * Returns information about current webrtc media connection\n *\n * @returns {Promise<Object>}\n */\n async getCurrentConnectionInfo(): Promise<{\n connectionType: string;\n ipVersion?: IPVersion;\n selectedCandidatePairChanges: number;\n numTransports: number;\n }> {\n try {\n const allStatsReports = [];\n\n await new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(new Error('timed out'));\n }, 1000);\n\n this.webrtcMediaConnection\n .getStats()\n .then((statsResult) => {\n clearTimeout(timeout);\n statsResult.forEach((report) => allStatsReports.push(report));\n resolve(allStatsReports);\n })\n .catch((error) => {\n clearTimeout(timeout);\n reject(error);\n });\n });\n\n const connectionType = this.getConnectionType(allStatsReports);\n const rtcPeerconnection =\n this.webrtcMediaConnection.multistreamConnection?.pc.pc ||\n this.webrtcMediaConnection.mediaConnection?.pc;\n const ipVersion = this.getConnectionIpVersion(rtcPeerconnection, allStatsReports);\n const {selectedCandidatePairChanges, numTransports} = this.getTransportInfo(allStatsReports);\n\n return {\n connectionType,\n ipVersion,\n selectedCandidatePairChanges,\n numTransports,\n };\n } catch (error) {\n LoggerProxy.logger.warn(\n `Media:properties#getCurrentConnectionInfo --> getStats() failed: ${error}`\n );\n\n return {\n connectionType: 'unknown',\n ipVersion: undefined,\n selectedCandidatePairChanges: -1,\n numTransports: 0,\n };\n }\n }\n\n /**\n * Sends a metric about a media issue. Metrics are throttled so that we don't\n * send too many of them, but include a count so that we know how many issues\n * were detected.\n *\n * @param {string} issueType\n * @param {string} issueSubType\n * @param {string} correlationId\n * @returns {void}\n */\n public sendMediaIssueMetric(issueType: string, issueSubType: string, correlationId) {\n const key = `${issueType}_${issueSubType}`;\n\n const count = (this.mediaIssueCounters[key] || 0) + 1;\n\n this.mediaIssueCounters[key] = count;\n\n this.throttledSendMediaIssueMetric({\n correlationId,\n ...this.mediaIssueCounters,\n });\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AASA,IAAAA,MAAA,GAAAC,OAAA;AAEA,IAAAC,OAAA,GAAAD,OAAA;AACA,IAAAE,QAAA,GAAAC,sBAAA,CAAAH,OAAA;AACA,IAAAI,UAAA,GAAAJ,OAAA;AACA,IAAAK,YAAA,GAAAF,sBAAA,CAAAH,OAAA;AACA,IAAAM,uBAAA,GAAAH,sBAAA,CAAAH,OAAA;AACA,IAAAO,WAAA,GAAAJ,sBAAA,CAAAH,OAAA;AAAsD,SAAAQ,2BAAAC,CAAA,EAAAC,CAAA,QAAAC,CAAA,yBAAAC,OAAA,IAAAH,CAAA,CAAAI,gBAAA,KAAAJ,CAAA,qBAAAE,CAAA,QAAAG,cAAA,CAAAL,CAAA,MAAAE,CAAA,GAAAI,2BAAA,CAAAN,CAAA,MAAAC,CAAA,IAAAD,CAAA,uBAAAA,CAAA,CAAAO,MAAA,IAAAL,CAAA,KAAAF,CAAA,GAAAE,CAAA,OAAAM,EAAA,MAAAC,CAAA,YAAAA,EAAA,eAAAC,CAAA,EAAAD,CAAA,EAAAE,CAAA,WAAAA,EAAA,WAAAH,EAAA,IAAAR,CAAA,CAAAO,MAAA,KAAAK,IAAA,WAAAA,IAAA,MAAAC,KAAA,EAAAb,CAAA,CAAAQ,EAAA,UAAAP,CAAA,WAAAA,EAAAD,CAAA,UAAAA,CAAA,KAAAc,CAAA,EAAAL,CAAA,gBAAAM,SAAA,iJAAAC,CAAA,EAAAC,CAAA,OAAAC,CAAA,gBAAAR,CAAA,WAAAA,EAAA,IAAAR,CAAA,GAAAA,CAAA,CAAAiB,IAAA,CAAAnB,CAAA,MAAAW,CAAA,WAAAA,EAAA,QAAAX,CAAA,GAAAE,CAAA,CAAAkB,IAAA,WAAAH,CAAA,GAAAjB,CAAA,CAAAY,IAAA,EAAAZ,CAAA,KAAAC,CAAA,WAAAA,EAAAD,CAAA,IAAAkB,CAAA,OAAAF,CAAA,GAAAhB,CAAA,KAAAc,CAAA,WAAAA,EAAA,UAAAG,CAAA,YAAAf,CAAA,CAAAmB,MAAA,IAAAnB,CAAA,CAAAmB,MAAA,oBAAAH,CAAA,QAAAF,CAAA;AAAA,SAAAV,4BAAAN,CAAA,EAAAiB,CAAA,QAAAjB,CAAA,2BAAAA,CAAA,SAAAsB,iBAAA,CAAAtB,CAAA,EAAAiB,CAAA,OAAAf,CAAA,MAAAqB,QAAA,CAAAJ,IAAA,CAAAnB,CAAA,EAAAwB,KAAA,6BAAAtB,CAAA,IAAAF,CAAA,CAAAyB,WAAA,KAAAvB,CAAA,GAAAF,CAAA,CAAAyB,WAAA,CAAAC,IAAA,aAAAxB,CAAA,cAAAA,CAAA,GAAAyB,WAAA,CAAA3B,CAAA,oBAAAE,CAAA,+CAAA0B,IAAA,CAAA1B,CAAA,IAAAoB,iBAAA,CAAAtB,CAAA,EAAAiB,CAAA;AAAA,SAAAK,kBAAAtB,CAAA,EAAAiB,CAAA,aAAAA,CAAA,IAAAA,CAAA,GAAAjB,CAAA,CAAAO,MAAA,MAAAU,CAAA,GAAAjB,CAAA,CAAAO,MAAA,YAAAN,CAAA,MAAAU,CAAA,GAAAkB,KAAA,CAAAZ,CAAA,GAAAhB,CAAA,GAAAgB,CAAA,EAAAhB,CAAA,IAAAU,CAAA,CAAAV,CAAA,IAAAD,CAAA,CAAAC,CAAA,UAAAU,CAAA;AAAA,SAAAmB,QAAA7B,CAAA,EAAAD,CAAA,QAAAE,CAAA,GAAA6B,aAAA,CAAA9B,CAAA,OAAA+B,6BAAA,QAAAhB,CAAA,GAAAgB,6BAAA,CAAA/B,CAAA,GAAAD,CAAA,KAAAgB,CAAA,GAAAA,CAAA,CAAAiB,MAAA,WAAAjC,CAAA,WAAAkC,gCAAA,CAAAjC,CAAA,EAAAD,CAAA,EAAAmC,UAAA,OAAAjC,CAAA,CAAAkC,IAAA,CAAAC,KAAA,CAAAnC,CAAA,EAAAc,CAAA,YAAAd,CAAA;AAAA,SAAAoC,cAAArC,CAAA,aAAAD,CAAA,MAAAA,CAAA,GAAAuC,SAAA,CAAAhC,MAAA,EAAAP,CAAA,UAAAE,CAAA,WAAAqC,SAAA,CAAAvC,CAAA,IAAAuC,SAAA,CAAAvC,CAAA,QAAAA,CAAA,OAAA8B,OAAA,CAAAU,MAAA,CAAAtC,CAAA,OAAAuC,OAAA,WAAAzC,CAAA,QAAA0C,gBAAA,CAAAC,OAAA,EAAA1C,CAAA,EAAAD,CAAA,EAAAE,CAAA,CAAAF,CAAA,SAAA4C,iCAAA,GAAAC,wBAAA,CAAA5C,CAAA,EAAA2C,iCAAA,CAAA1C,CAAA,KAAA4B,OAAA,CAAAU,MAAA,CAAAtC,CAAA,GAAAuC,OAAA,WAAAzC,CAAA,IAAA8C,sBAAA,CAAA7C,CAAA,EAAAD,CAAA,EAAAkC,gCAAA,CAAAhC,CAAA,EAAAF,CAAA,iBAAAC,CAAA,IAhBtD;AA6BA;AACA;AACA;AAFA,IAGqB8C,eAAe,GAAAC,OAAA,CAAAL,OAAA;EAkBlC;AACF;AACA;AACA;EACE,SAAAI,gBAAA,EAAc;IAAA,IAAAE,KAAA;IAAA,IAAAC,gBAAA,CAAAP,OAAA,QAAAI,eAAA;IAAA,IAAAL,gBAAA,CAAAC,OAAA;IAAA,IAAAD,gBAAA,CAAAC,OAAA;IAAA,IAAAD,gBAAA,CAAAC,OAAA;IAAA,IAAAD,gBAAA,CAAAC,OAAA;IAAA,IAAAD,gBAAA,CAAAC,OAAA;IAAA,IAAAD,gBAAA,CAAAC,OAAA;IAAA,IAAAD,gBAAA,CAAAC,OAAA;IAAA,IAAAD,gBAAA,CAAAC,OAAA;IAAA,IAAAD,gBAAA,CAAAC,OAAA;IAAA,IAAAD,gBAAA,CAAAC,OAAA;IAAA,IAAAD,gBAAA,CAAAC,OAAA;IAAA,IAAAD,gBAAA,CAAAC,OAAA;IAAA,IAAAD,gBAAA,CAAAC,OAAA;IAAA,IAAAD,gBAAA,CAAAC,OAAA,qBARFQ,mBAAQ;IAAA,IAAAT,gBAAA,CAAAC,OAAA,8BAC0B,CAAC,CAAC;IAAA,IAAAD,gBAAA,CAAAC,OAAA;IAQ9C,IAAI,CAACS,qBAAqB,GAAG,IAAI;IACjC,IAAI,CAACC,cAAc,GAAG;MACpBC,YAAY,EAAE,KAAK;MACnBC,YAAY,EAAE,KAAK;MACnBC,YAAY,EAAE,KAAK;MACnBC,SAAS,EAAE,KAAK;MAChBC,SAAS,EAAE,KAAK;MAChBC,SAAS,EAAE;IACb,CAAC;IACD,IAAI,CAACC,WAAW,GAAG,IAAI;IACvB,IAAI,CAACC,WAAW,GAAG,IAAI;IACvB,IAAI,CAACC,gBAAgB,GAAG,IAAI;IAC5B,IAAI,CAACC,gBAAgB,GAAG,IAAI;IAC5B,IAAI,CAACC,iBAAiB,GAAGC,SAAS;IAClC,IAAI,CAACC,iBAAiB,GAAGD,SAAS;IAClC,IAAI,CAACE,iBAAiB,GAAGF,SAAS;IAClC,IAAI,CAACG,kBAAkB,GAAGC,yBAAc,CAACC,IAAI;IAC7C,IAAI,CAACC,aAAa,GAAG,CAAC,CAAC;IACvB,IAAI,CAACC,aAAa,GAAG,IAAI;IAEzB,IAAI,CAACC,6BAA6B,GAAG,IAAAC,gBAAQ,EAAC,UAACC,YAAY,EAAK;MAC9DC,gBAAO,CAACC,oBAAoB,CAACC,mBAAkB,CAACC,oBAAoB,EAAAzC,aAAA,KAC/DqC,YAAY,CAChB,CAAC;MACF,IAAAK,KAAA,CAAArC,OAAA,EAAYM,KAAI,CAACgC,kBAAkB,CAAC,CAACxC,OAAO,CAAC,UAACyC,GAAG,EAAK;QACpDjC,KAAI,CAACgC,kBAAkB,CAACC,GAAG,CAAC,GAAG,CAAC;MAClC,CAAC,CAAC;IACJ,CAAC,EAAE,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;EACrB;;EAEA;AACF;AACA;AACA;EAHE,WAAAC,aAAA,CAAAxC,OAAA,EAAAI,eAAA;IAAAmC,GAAA;IAAArE,KAAA,EAIA,SAAAuE,gBAAgBA,CAAA,EAAG;MACjB,OAAO,IAAI,CAACZ,aAAa,IAAI,IAAI;IACnC;EAAC;IAAAU,GAAA;IAAArE,KAAA,EAED,SAAAwE,iBAAiBA,CAAChC,cAAc,EAAE;MAChC,IAAI,CAACA,cAAc,GAAGA,cAAc;IACtC;EAAC;IAAA6B,GAAA;IAAArE,KAAA,EAED,SAAAyE,gBAAgBA,CAACC,IAAI,EAAEC,MAAM,EAAE;MAC7B,IAAI,CAACjB,aAAa,CAACgB,IAAI,CAAC,GAAGC,MAAM;IACnC;EAAC;IAAAN,GAAA;IAAArE,KAAA,EAED,SAAA4E,sBAAsBA,CAACC,mBAAmB,EAAE;MAC1C,IAAI,CAACtC,qBAAqB,GAAGsC,mBAAmB;IAClD;EAAC;IAAAR,GAAA;IAAArE,KAAA,EAED,SAAA8E,mBAAmBA,CAAC/B,WAA+B,EAAE;MACnD,IAAI,CAACA,WAAW,GAAGA,WAAW;IAChC;EAAC;IAAAsB,GAAA;IAAArE,KAAA,EAED,SAAA+E,mBAAmBA,CAAC/B,WAAmC,EAAE;MACvD,IAAI,CAACA,WAAW,GAAGA,WAAW;IAChC;EAAC;IAAAqB,GAAA;IAAArE,KAAA,EAED,SAAAgF,wBAAwBA,CAAC/B,gBAAqC,EAAE;MAC9D,IAAI,CAACA,gBAAgB,GAAGA,gBAAgB;IAC1C;EAAC;IAAAoB,GAAA;IAAArE,KAAA,EAED,SAAAiF,wBAAwBA,CAAC/B,gBAAyC,EAAE;MAClE,IAAI,CAACA,gBAAgB,GAAGA,gBAAgB;IAC1C;EAAC;IAAAmB,GAAA;IAAArE,KAAA,EAED,SAAAkF,qBAAqBA,CAAC3B,kBAAkB,EAAE;MACxC,IAAI,CAACA,kBAAkB,GAAGA,kBAAkB;IAC9C;EAAC;IAAAc,GAAA;IAAArE,KAAA,EAED,SAAAmF,oBAAoBA,CAAChC,iBAA+B,EAAE;MACpD,IAAI,CAACA,iBAAiB,GAAGA,iBAAiB;IAC5C;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAAkB,GAAA;IAAArE,KAAA,EAKA,SAAAoF,oBAAoBA,CAAC/B,iBAA+B,EAAE;MACpD,IAAI,CAACA,iBAAiB,GAAGA,iBAAiB;IAC5C;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAAgB,GAAA;IAAArE,KAAA,EAKA,SAAAqF,oBAAoBA,CAAC/B,iBAA+B,EAAE;MACpD,IAAI,CAACA,iBAAiB,GAAGA,iBAAiB;IAC5C;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAAe,GAAA;IAAArE,KAAA,EAKA,SAAAsF,gBAAgBA,CAACC,QAAgB,EAAE;MACjC,IAAI,CAAC5B,aAAa,GAAG4B,QAAQ;IAC/B;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAAlB,GAAA;IAAArE,KAAA,EAKA,SAAAwF,mBAAmBA,CAAA,EAAG;MACpB,IAAI,CAACjD,qBAAqB,GAAG,IAAI;MACjC,IAAI,CAACqB,6BAA6B,CAAC6B,KAAK,CAAC,CAAC;IAC5C;;IAEA;AACF;AACA;AACA;EAHE;IAAApB,GAAA;IAAArE,KAAA,EAIA,SAAA0F,gBAAgBA,CAAA,EAAG;MACjB,IAAI,CAACrC,iBAAiB,GAAG,IAAI;MAC7B,IAAI,CAACC,iBAAiB,GAAG,IAAI;IAC/B;EAAC;IAAAe,GAAA;IAAArE,KAAA,EAED,SAAA2F,sBAAsBA,CAAA,EAAG;MACvB,IAAI,CAACxC,iBAAiB,GAAG,IAAI;IAC/B;;IAEA;AACF;AACA;AACA;EAHE;IAAAkB,GAAA;IAAArE,KAAA,EAIA,SAAA4F,kBAAkBA,CAAA,EAAG;MACnB,IAAI,CAACF,gBAAgB,CAAC,CAAC;MACvB,IAAI,CAACC,sBAAsB,CAAC,CAAC;IAC/B;;IAEA;AACF;AACA;AACA;EAHE;IAAAtB,GAAA;IAAArE,KAAA,EAIA,SAAA6F,mBAAmBA,CAAA,EAAG;MACpB,OAAO,CAAC,EAAE,IAAI,CAAC3C,gBAAgB,IAAI,IAAI,CAACD,gBAAgB,CAAC;IAC3D;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAAoB,GAAA;IAAArE,KAAA,EAMA,SAAA8F,+BAA+BA,CAACC,aAAqB,EAAiB;MACpE,IAAMC,sBAAsB,GAAG,IAAIC,+BAAsB,CAAC;QACxD1D,qBAAqB,EAAE,IAAI,CAACA,qBAAqB;QACjDwD,aAAa,EAAbA;MACF,CAAC,CAAC;MAEF,OAAOC,sBAAsB,CAACF,+BAA+B,CAAC,CAAC;IACjE;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EARE;IAAAzB,GAAA;IAAArE,KAAA,EASA,SAAQkG,gBAAgBA,CAACC,eAAsB,EAG7C;MACA,IAAMC,UAAU,GAAGD,eAAe,CAAC/E,MAAM,CAAC,UAACiF,MAAM;QAAA,OAAKA,MAAM,CAAC3B,IAAI,KAAK,WAAW;MAAA,EAAC;MAElF,IAAI0B,UAAU,CAAC1G,MAAM,GAAG,CAAC,EAAE;QACzB4G,oBAAW,CAACC,MAAM,CAACC,IAAI,sFAAAC,MAAA,CACgEL,UAAU,CAAC1G,MAAM,CACxG,CAAC;MACH;MAEA,OAAO;QACLgH,4BAA4B,EAC1BN,UAAU,CAAC1G,MAAM,GAAG,CAAC,IAAI0G,UAAU,CAAC,CAAC,CAAC,CAACM,4BAA4B,KAAKtD,SAAS,GAC7EgD,UAAU,CAAC,CAAC,CAAC,CAACM,4BAA4B,GAC1C,CAAC,CAAC;QACRC,aAAa,EAAEP,UAAU,CAAC1G;MAC5B,CAAC;IACH;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAA2E,GAAA;IAAArE,KAAA,EAKA,SAAQ4G,MAAMA,CAACC,EAAU,EAAW;MAClC,OAAOA,EAAE,CAACC,QAAQ,CAAC,GAAG,CAAC;IACzB;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAAzC,GAAA;IAAArE,KAAA,EAKA,SAAQ+G,sBAAsBA,CAC5BxE,qBAAwC,EACxC4D,eAAsB,EACC;MACvB,IAAMC,UAAU,GAAGD,eAAe,CAAC/E,MAAM,CAAC,UAACiF,MAAM;QAAA,OAAKA,MAAM,CAAC3B,IAAI,KAAK,WAAW;MAAA,EAAC;MAElF,IAAIsC,qBAAqB;MAEzB,IAAIZ,UAAU,CAAC1G,MAAM,GAAG,CAAC,IAAI0G,UAAU,CAAC,CAAC,CAAC,CAACa,uBAAuB,EAAE;QAClED,qBAAqB,GAAGb,eAAe,CAACe,IAAI,CAC1C,UAACb,MAAM;UAAA,OACLA,MAAM,CAAC3B,IAAI,KAAK,gBAAgB,IAAI2B,MAAM,CAACc,EAAE,KAAKf,UAAU,CAAC,CAAC,CAAC,CAACa,uBAAuB;QAAA,CAC3F,CAAC;MACH,CAAC,MAAM;QACL;QACAD,qBAAqB,GAAGb,eAAe,CAACe,IAAI,CAC1C,UAACb,MAAM;UAAA,OAAKA,MAAM,CAAC3B,IAAI,KAAK,gBAAgB,IAAI2B,MAAM,CAACe,QAAQ;QAAA,CACjE,CAAC;MACH;MAEA,IAAIJ,qBAAqB,EAAE;QACzB,IAAMK,cAAc,GAAGlB,eAAe,CAACe,IAAI,CACzC,UAACb,MAAM;UAAA,OACLA,MAAM,CAAC3B,IAAI,KAAK,iBAAiB,IAAI2B,MAAM,CAACc,EAAE,KAAKH,qBAAqB,CAACM,gBAAgB;QAAA,CAC7F,CAAC;QAED,IAAID,cAAc,EAAE;UAClB,IAAIA,cAAc,CAACE,OAAO,EAAE;YAC1B,OAAO,IAAI,CAACX,MAAM,CAACS,cAAc,CAACE,OAAO,CAAC,GAAG,MAAM,GAAG,MAAM;UAC9D;UAEA,IAAI;YACF;YACA,IAAMC,QAAQ,GAAGjF,qBAAqB,CAACkF,gBAAgB,CAACC,GAAG;YAE3D,IAAMC,SAAS,GAAG,IAAAC,YAAK,EAACJ,QAAQ,CAAC;YAAC,IAAAK,SAAA,GAAA3I,0BAAA,CAEVyI,SAAS,CAACG,OAAO;cAAAC,KAAA;YAAA;cAAzC,KAAAF,SAAA,CAAAhI,CAAA,MAAAkI,KAAA,GAAAF,SAAA,CAAA/H,CAAA,IAAAC,IAAA,GAA2C;gBAAA,IAAhCiI,SAAS,GAAAD,KAAA,CAAA/H,KAAA;gBAClB,IAAMiI,iBAAiB,GAAGD,SAAS,CAACE,OAAO,CAACC,UAAU,CAACjB,IAAI,CACzD,UAACkB,SAAS;kBAAA,OAAKA,SAAS,CAACC,IAAI,KAAKhB,cAAc,CAACgB,IAAI;gBAAA,CACvD,CAAC;gBACD,IAAIJ,iBAAiB,EAAE;kBACrB,OAAO,IAAI,CAACrB,MAAM,CAACqB,iBAAiB,CAACK,iBAAiB,CAAC,GAAG,MAAM,GAAG,MAAM;gBAC3E;cACF;YAAC,SAAAC,GAAA;cAAAV,SAAA,CAAAzI,CAAA,CAAAmJ,GAAA;YAAA;cAAAV,SAAA,CAAA5H,CAAA;YAAA;YAEDqG,oBAAW,CAACC,MAAM,CAACC,IAAI,mGAAAC,MAAA,CAC6EY,cAAc,CAACgB,IAAI,CACvH,CAAC;UACH,CAAC,CAAC,OAAOG,KAAK,EAAE;YACdlC,oBAAW,CAACC,MAAM,CAACC,IAAI,mGAErBgC,KACF,CAAC;YAED,OAAOpF,SAAS;UAClB;QACF,CAAC,MAAM;UACLkD,oBAAW,CAACC,MAAM,CAACC,IAAI,iFAAAC,MAAA,CAC0DO,qBAAqB,CAACM,gBAAgB,6BACvH,CAAC;QACH;MACF,CAAC,MAAM;QAAA,IAAAmB,YAAA;QACLnC,oBAAW,CAACC,MAAM,CAACC,IAAI,gIAAAC,MAAA,CAC0GL,UAAU,CAAC1G,MAAM,gCAAA+G,MAAA,EAAAgC,YAAA,GAA6BrC,UAAU,CAAC,CAAC,CAAC,cAAAqC,YAAA,uBAAbA,YAAA,CAAexB,uBAAuB,MACrN,CAAC;MACH;MAEA,OAAO7D,SAAS;IAClB;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EARE;IAAAiB,GAAA;IAAArE,KAAA,EASA,SAAQ0I,iBAAiBA,CAACvC,eAAsB,EAAE;MAChD,IAAMwC,wBAAwB,GAAGxC,eAAe,CAAC/E,MAAM,CACrD,UAACiF,MAAM;QAAA,IAAAuC,aAAA;QAAA,OAAKvC,MAAM,CAAC3B,IAAI,KAAK,gBAAgB,IAAI,EAAAkE,aAAA,GAAAvC,MAAM,CAACwC,KAAK,cAAAD,aAAA,uBAAZA,aAAA,CAAcE,WAAW,CAAC,CAAC,MAAK,WAAW;MAAA,CAC7F,CAAC;MAED,IAAIC,mBAAmB,GAAG,SAAS;;MAEnC;MACAJ,wBAAwB,CAACK,IAAI,CAAC,UAACC,IAAI,EAAK;QACtC,IAAM5B,cAAc,GAAGlB,eAAe,CAACe,IAAI,CACzC,UAACb,MAAM;UAAA,OAAKA,MAAM,CAAC3B,IAAI,KAAK,iBAAiB,IAAI2B,MAAM,CAACc,EAAE,KAAK8B,IAAI,CAAC3B,gBAAgB;QAAA,CACtF,CAAC;QAED,IAAID,cAAc,KAAKjE,SAAS,EAAE;UAChCkD,oBAAW,CAACC,MAAM,CAACC,IAAI,4EAAAC,MAAA,CACqDwC,IAAI,CAAC3B,gBAAgB,6BACjG,CAAC;UAED,OAAO,KAAK;QACd;QAEA,IAAI4B,cAAc;QAElB,IAAI7B,cAAc,CAAC8B,aAAa,EAAE;UAChCD,cAAc,WAAAzC,MAAA,CAAWY,cAAc,CAAC8B,aAAa,CAACC,WAAW,CAAC,CAAC,CAAE;QACvE,CAAC,MAAM;UAAA,IAAAC,qBAAA;UACLH,cAAc,IAAAG,qBAAA,GAAGhC,cAAc,CAACiC,QAAQ,cAAAD,qBAAA,uBAAvBA,qBAAA,CAAyBD,WAAW,CAAC,CAAC,CAAC,CAAC;QAC3D;QAEA,IAAIF,cAAc,EAAE;UAClBH,mBAAmB,GAAGG,cAAc;UAEpC,OAAO,IAAI;QACb;QACA5C,oBAAW,CAACC,MAAM,CAACC,IAAI,0FAAAC,MAAA,CACoEY,cAAc,CAACkC,aAAa,CACvH,CAAC;QAED,OAAO,KAAK;MACd,CAAC,CAAC;MAEF,IAAIR,mBAAmB,KAAK,SAAS,EAAE;QACrC,IAAMS,mBAAmB,GAAGrD,eAAe,CACxC/E,MAAM,CAAC,UAACiF,MAAM;UAAA,OAAKA,MAAM,CAAC3B,IAAI,KAAK,gBAAgB;QAAA,EAAC,CACpD+E,GAAG,CAAC,UAACpD,MAAM;UAAA,OAAKA,MAAM,CAACwC,KAAK;QAAA,EAAC;QAEhCvC,oBAAW,CAACC,MAAM,CAACC,IAAI,sEAAAC,MAAA,CACgD,IAAAiD,UAAA,CAAA5H,OAAA,EACnE0H,mBACF,CAAC,CACH,CAAC;MACH;MAEA,OAAOT,mBAAmB;IAC5B;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAA1E,GAAA;IAAArE,KAAA;MAAA,IAAA2J,yBAAA,OAAAC,kBAAA,CAAA9H,OAAA,eAAA+H,YAAA,CAAA/H,OAAA,CAAAgI,IAAA,CAKA,SAAAC,QAAA;QAAA,IAAAC,MAAA;QAAA,IAAAC,qBAAA,EAAAC,sBAAA,EAAA/D,eAAA,EAAA+C,cAAA,EAAAiB,iBAAA,EAAAC,SAAA,EAAAC,qBAAA,EAAA3D,4BAAA,EAAAC,aAAA,EAAA2D,EAAA;QAAA,OAAAT,YAAA,CAAA/H,OAAA,CAAAyI,IAAA,WAAAC,QAAA;UAAA,kBAAAA,QAAA,CAAAC,IAAA,GAAAD,QAAA,CAAAjK,IAAA;YAAA;cAAAiK,QAAA,CAAAC,IAAA;cAOUtE,eAAe,GAAG,EAAE;cAAAqE,QAAA,CAAAjK,IAAA;cAAA,OAEpB,IAAAmK,QAAA,CAAA5I,OAAA,CAAY,UAAC6I,OAAO,EAAEC,MAAM,EAAK;gBACrC,IAAMC,OAAO,GAAGC,UAAU,CAAC,YAAM;kBAC/BF,MAAM,CAAC,IAAIG,KAAK,CAAC,WAAW,CAAC,CAAC;gBAChC,CAAC,EAAE,IAAI,CAAC;gBAERf,MAAI,CAACzH,qBAAqB,CACvByI,QAAQ,CAAC,CAAC,CACVC,IAAI,CAAC,UAACC,WAAW,EAAK;kBACrBC,YAAY,CAACN,OAAO,CAAC;kBACrBK,WAAW,CAACtJ,OAAO,CAAC,UAACyE,MAAM;oBAAA,OAAKF,eAAe,CAAC5E,IAAI,CAAC8E,MAAM,CAAC;kBAAA,EAAC;kBAC7DsE,OAAO,CAACxE,eAAe,CAAC;gBAC1B,CAAC,CAAC,CACDiF,KAAK,CAAC,UAAC5C,KAAK,EAAK;kBAChB2C,YAAY,CAACN,OAAO,CAAC;kBACrBD,MAAM,CAACpC,KAAK,CAAC;gBACf,CAAC,CAAC;cACN,CAAC,CAAC;YAAA;cAEIU,cAAc,GAAG,IAAI,CAACR,iBAAiB,CAACvC,eAAe,CAAC;cACxDgE,iBAAiB,GACrB,EAAAF,qBAAA,OAAI,CAAC1H,qBAAqB,CAAC8I,qBAAqB,cAAApB,qBAAA,uBAAhDA,qBAAA,CAAkDqB,EAAE,CAACA,EAAE,OAAApB,sBAAA,GACvD,IAAI,CAAC3H,qBAAqB,CAACgJ,eAAe,cAAArB,sBAAA,uBAA1CA,sBAAA,CAA4CoB,EAAE;cAC1ClB,SAAS,GAAG,IAAI,CAACrD,sBAAsB,CAACoD,iBAAiB,EAAEhE,eAAe,CAAC;cAAAkE,qBAAA,GAC3B,IAAI,CAACnE,gBAAgB,CAACC,eAAe,CAAC,EAArFO,4BAA4B,GAAA2D,qBAAA,CAA5B3D,4BAA4B,EAAEC,aAAa,GAAA0D,qBAAA,CAAb1D,aAAa;cAAA,OAAA6D,QAAA,CAAAgB,MAAA,WAE3C;gBACLtC,cAAc,EAAdA,cAAc;gBACdkB,SAAS,EAATA,SAAS;gBACT1D,4BAA4B,EAA5BA,4BAA4B;gBAC5BC,aAAa,EAAbA;cACF,CAAC;YAAA;cAAA6D,QAAA,CAAAC,IAAA;cAAAH,EAAA,GAAAE,QAAA;cAEDlE,oBAAW,CAACC,MAAM,CAACC,IAAI,qEAAAC,MAAA,CAAA6D,EAAA,CAEvB,CAAC;cAAC,OAAAE,QAAA,CAAAgB,MAAA,WAEK;gBACLtC,cAAc,EAAE,SAAS;gBACzBkB,SAAS,EAAEhH,SAAS;gBACpBsD,4BAA4B,EAAE,CAAC,CAAC;gBAChCC,aAAa,EAAE;cACjB,CAAC;YAAA;YAAA;cAAA,OAAA6D,QAAA,CAAAiB,IAAA;UAAA;QAAA,GAAA1B,OAAA;MAAA,CAEJ;MAAA,SApDK2B,wBAAwBA,CAAA;QAAA,OAAA/B,yBAAA,CAAAnI,KAAA,OAAAE,SAAA;MAAA;MAAA,OAAxBgK,wBAAwB;IAAA;IAsD9B;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IATE;EAAA;IAAArH,GAAA;IAAArE,KAAA,EAUA,SAAO2L,oBAAoBA,CAACC,SAAiB,EAAEC,YAAoB,EAAE9F,aAAa,EAAE;MAClF,IAAM1B,GAAG,MAAAoC,MAAA,CAAMmF,SAAS,OAAAnF,MAAA,CAAIoF,YAAY,CAAE;MAE1C,IAAMC,KAAK,GAAG,CAAC,IAAI,CAAC1H,kBAAkB,CAACC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;MAErD,IAAI,CAACD,kBAAkB,CAACC,GAAG,CAAC,GAAGyH,KAAK;MAEpC,IAAI,CAAClI,6BAA6B,CAAAnC,aAAA;QAChCsE,aAAa,EAAbA;MAAa,GACV,IAAI,CAAC3B,kBAAkB,CAC3B,CAAC;IACJ;EAAC;AAAA","ignoreList":[]}
|
package/dist/meeting/index.js
CHANGED
|
@@ -1319,6 +1319,37 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
|
|
|
1319
1319
|
}
|
|
1320
1320
|
}
|
|
1321
1321
|
});
|
|
1322
|
+
_this.statsAnalyzer.on(_internalMediaCore.StatsAnalyzerEventNames.STATS_UPDATE, function (data) {
|
|
1323
|
+
// Extract srtpCipher from transport stats
|
|
1324
|
+
var srtpCipher;
|
|
1325
|
+
var _iterator = _createForOfIteratorHelper(data.stats.values()),
|
|
1326
|
+
_step;
|
|
1327
|
+
try {
|
|
1328
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
1329
|
+
var stats = _step.value;
|
|
1330
|
+
if (stats.type === 'transport' && stats.srtpCipher) {
|
|
1331
|
+
srtpCipher = stats.srtpCipher;
|
|
1332
|
+
break;
|
|
1333
|
+
}
|
|
1334
|
+
}
|
|
1335
|
+
|
|
1336
|
+
// Only emit event if srtpCipher has changed
|
|
1337
|
+
} catch (err) {
|
|
1338
|
+
_iterator.e(err);
|
|
1339
|
+
} finally {
|
|
1340
|
+
_iterator.f();
|
|
1341
|
+
}
|
|
1342
|
+
if (srtpCipher && srtpCipher !== _this.mediaProperties.srtpCipher) {
|
|
1343
|
+
_loggerProxy.default.logger.info("Meeting:index#setupStatsAnalyzerEventHandlers --> SRTP cipher changed from ".concat(_this.mediaProperties.srtpCipher, " to ").concat(srtpCipher));
|
|
1344
|
+
_this.mediaProperties.srtpCipher = srtpCipher;
|
|
1345
|
+
_triggerProxy.default.trigger(_this, {
|
|
1346
|
+
file: 'meeting/index',
|
|
1347
|
+
function: 'setupStatsAnalyzerEventHandlers'
|
|
1348
|
+
}, _constants.EVENT_TRIGGERS.MEETING_SRTP_CIPHER_UPDATED, {
|
|
1349
|
+
srtpCipher: srtpCipher
|
|
1350
|
+
});
|
|
1351
|
+
}
|
|
1352
|
+
});
|
|
1322
1353
|
});
|
|
1323
1354
|
/**
|
|
1324
1355
|
* media failed, so collect a stats report from webrtc using the wcme connection to grab the rtc stats report
|
|
@@ -10027,19 +10058,19 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
|
|
|
10027
10058
|
key: "unpublishStreams",
|
|
10028
10059
|
value: (function () {
|
|
10029
10060
|
var _unpublishStreams = (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee44(streams) {
|
|
10030
|
-
var promises,
|
|
10061
|
+
var promises, _iterator2, _step2, stream;
|
|
10031
10062
|
return _regenerator.default.wrap(function (_context44) {
|
|
10032
10063
|
while (1) switch (_context44.prev = _context44.next) {
|
|
10033
10064
|
case 0:
|
|
10034
10065
|
_loggerProxy.default.logger.info("Meeting:index#unpublishStreams --> called with: ".concat((0, _stringify.default)(streams)));
|
|
10035
10066
|
this.checkMediaConnection();
|
|
10036
10067
|
promises = [];
|
|
10037
|
-
|
|
10068
|
+
_iterator2 = _createForOfIteratorHelper(streams.filter(function (t) {
|
|
10038
10069
|
return !!t;
|
|
10039
10070
|
}));
|
|
10040
10071
|
try {
|
|
10041
|
-
for (
|
|
10042
|
-
stream =
|
|
10072
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
10073
|
+
stream = _step2.value;
|
|
10043
10074
|
if (stream === this.mediaProperties.shareAudioStream) {
|
|
10044
10075
|
promises.push(this.setLocalShareAudioStream(undefined));
|
|
10045
10076
|
}
|
|
@@ -10054,9 +10085,9 @@ var Meeting = exports.default = /*#__PURE__*/function (_StatelessWebexPlugin) {
|
|
|
10054
10085
|
}
|
|
10055
10086
|
}
|
|
10056
10087
|
} catch (err) {
|
|
10057
|
-
|
|
10088
|
+
_iterator2.e(err);
|
|
10058
10089
|
} finally {
|
|
10059
|
-
|
|
10090
|
+
_iterator2.f();
|
|
10060
10091
|
}
|
|
10061
10092
|
if (!this.isMultistream) {
|
|
10062
10093
|
promises.push(this.updateTranscodedMediaConnection());
|