@webex/plugin-meetings 3.8.1-next.3 → 3.8.1-next.31
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/README.md +26 -13
- package/dist/breakouts/breakout.js +1 -1
- package/dist/breakouts/index.js +1 -1
- package/dist/constants.js +21 -2
- package/dist/constants.js.map +1 -1
- package/dist/interpretation/index.js +1 -1
- package/dist/interpretation/siLanguage.js +1 -1
- package/dist/locus-info/index.js +38 -84
- package/dist/locus-info/index.js.map +1 -1
- package/dist/media/index.js +2 -2
- package/dist/media/index.js.map +1 -1
- package/dist/meeting/brbState.js +14 -12
- package/dist/meeting/brbState.js.map +1 -1
- package/dist/meeting/index.js +169 -66
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/request.js +19 -0
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/request.type.js.map +1 -1
- package/dist/meetings/index.js +35 -33
- package/dist/meetings/index.js.map +1 -1
- package/dist/members/index.js +8 -6
- package/dist/members/index.js.map +1 -1
- package/dist/members/request.js +3 -3
- package/dist/members/request.js.map +1 -1
- package/dist/members/util.js +18 -6
- package/dist/members/util.js.map +1 -1
- package/dist/multistream/mediaRequestManager.js +1 -1
- package/dist/multistream/mediaRequestManager.js.map +1 -1
- package/dist/multistream/remoteMedia.js +34 -5
- package/dist/multistream/remoteMedia.js.map +1 -1
- package/dist/multistream/remoteMediaGroup.js +42 -2
- package/dist/multistream/remoteMediaGroup.js.map +1 -1
- package/dist/multistream/sendSlotManager.js +32 -2
- package/dist/multistream/sendSlotManager.js.map +1 -1
- package/dist/reachability/index.js +5 -10
- package/dist/reachability/index.js.map +1 -1
- package/dist/types/constants.d.ts +19 -0
- package/dist/types/locus-info/index.d.ts +0 -9
- package/dist/types/meeting/brbState.d.ts +0 -1
- package/dist/types/meeting/index.d.ts +28 -4
- package/dist/types/meeting/request.d.ts +9 -1
- package/dist/types/meeting/request.type.d.ts +74 -0
- package/dist/types/members/index.d.ts +8 -3
- package/dist/types/members/request.d.ts +1 -1
- package/dist/types/members/util.d.ts +5 -2
- package/dist/types/multistream/remoteMedia.d.ts +20 -1
- package/dist/types/multistream/remoteMediaGroup.d.ts +11 -0
- package/dist/types/multistream/sendSlotManager.d.ts +16 -0
- package/dist/types/reachability/index.d.ts +2 -2
- package/dist/webinar/index.js +1 -1
- package/package.json +24 -24
- package/src/constants.ts +20 -0
- package/src/locus-info/index.ts +47 -82
- package/src/media/index.ts +2 -2
- package/src/meeting/brbState.ts +9 -7
- package/src/meeting/index.ts +126 -23
- package/src/meeting/request.ts +16 -0
- package/src/meeting/request.type.ts +64 -0
- package/src/meetings/index.ts +3 -2
- package/src/members/index.ts +7 -5
- package/src/members/request.ts +2 -2
- package/src/members/util.ts +14 -3
- package/src/multistream/mediaRequestManager.ts +7 -7
- package/src/multistream/remoteMedia.ts +34 -4
- package/src/multistream/remoteMediaGroup.ts +37 -2
- package/src/multistream/sendSlotManager.ts +34 -2
- package/src/reachability/index.ts +5 -13
- package/test/unit/spec/locus-info/index.js +177 -83
- package/test/unit/spec/media/index.ts +107 -0
- package/test/unit/spec/meeting/brbState.ts +9 -9
- package/test/unit/spec/meeting/index.js +606 -55
- package/test/unit/spec/meeting/request.js +71 -0
- package/test/unit/spec/meetings/index.js +1 -0
- package/test/unit/spec/members/index.js +32 -9
- package/test/unit/spec/members/request.js +2 -2
- package/test/unit/spec/members/utils.js +27 -7
- package/test/unit/spec/multistream/mediaRequestManager.ts +19 -6
- package/test/unit/spec/multistream/remoteMedia.ts +66 -2
- package/test/unit/spec/multistream/sendSlotManager.ts +59 -0
- package/test/unit/spec/reachability/index.ts +2 -6
package/dist/media/index.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"names":["_internalMediaCore","require","_webCapabilities","_loggerProxy","_interopRequireDefault","_constants","_config","_config2","_browserDetection","ownKeys","e","r","t","_Object$keys","_Object$getOwnPropertySymbols","o","filter","_Object$getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","Object","forEach","_defineProperty2","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty","_BrowserDetection","BrowserDetection","isBrowser","Media","getLocalMedia","options","config","sendAudio","sendVideo","sendShare","sharePreferences","isSharing","getMedia","getDisplayMedia","_promise","resolve","undefined","getDirection","forceSendRecv","receive","send","createMediaConnection","isMultistream","debugId","meetingId","_audioStream$outputSt","_videoStream$outputSt","_shareVideoStream$out","_shareAudioStream$out","rtcMetrics","mediaProperties","remoteQualityLevel","enableRtx","enableExtmap","turnServerInfo","bundlePolicy","iceCandidatesTimeout","disableAudioMainDtx","enableAudioTwcc","stopIceGatheringAfterFirstRelayCandidate","iceServers","urls","username","credential","password","disableAudioTwcc","BrowserInfo","isFirefox","doFullIce","MultistreamRoapMediaConnection","data","addMetrics","closeMetrics","sendMetricsInQueue","Error","mediaDirection","audioStream","videoStream","shareVideoStream","shareAudioStream","RoapMediaConnection","skipInactiveTransceivers","requireH264","sdpMunging","convertPort9to0","addContentSlides","bandwidthLimits","audio","StaticConfig","meetings","bandwidth","video","startBitrate","periodicKeyframes","disableExtmap","disableRtx","localTracks","outputStream","getTracks","screenShareVideo","screenShareAudio","direction","receiveAudio","receiveVideo","receiveShare","customResolution","screenResolution","customShareFrameRate","screenFrameRate","hasSharePreferences","hasCustomConstraints","shareConstraints","hasHighFrameRate","highFrameRate","_Config$meetings","Config","resolution","videoShareFrameRate","aspectRatio","cursor","MEDIA_TRACK_CONSTRAINT","CURSOR","AWLAYS","frameRate","height","idealHeight","width","idealWidth","mediaConfig","navigator","mediaDevices","then","stream","getVideoTracks","applyConstraints","getDisplayMediaParams","defaultWidth","ideal","max","maxWidth","defaultHeight","maxHeight","deviceId","facingMode","fake","process","env","NODE_ENV","getUserMedia","catch","err","logPath","LoggerProxy","logger","error","concat","constraint","toggleStream","stopStream","stop","readyState","mediaSetting","audioVideo","localStream","shareStream","_default","exports"],"sources":["index.ts"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n/* globals navigator */\n\nimport {\n RoapMediaConnection,\n MultistreamRoapMediaConnection,\n type MultistreamConnectionConfig,\n} from '@webex/internal-media-core';\nimport {\n LocalStream,\n LocalCameraStream,\n LocalDisplayStream,\n LocalSystemAudioStream,\n LocalMicrophoneStream,\n} from '@webex/media-helpers';\nimport {RtcMetrics} from '@webex/internal-plugin-metrics';\nimport {BrowserInfo} from '@webex/web-capabilities';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {MEDIA_TRACK_CONSTRAINT} from '../constants';\nimport Config from '../config';\nimport StaticConfig from '../common/config';\nimport BrowserDetection from '../common/browser-detection';\nimport {TurnServerInfo} from '../roap/types';\n\nconst {isBrowser} = BrowserDetection();\n\nexport type BundlePolicy = MultistreamConnectionConfig['bundlePolicy'];\n\n/**\n * MediaDirection\n * @typedef {Object} MediaDirection\n * @property {boolean} sendAudio\n * @property {boolean} receiveAudio\n * @property {boolean} sendVideo\n * @property {boolean} receiveVideo\n * @property {boolean} sendShare\n * @property {boolean} receiveShare\n */\n\n/**\n * SendOptions\n * @typedef {Object} SendOptions\n * @property sendAudio\n * @property sendVideo\n * @property sendShare\n * @property isSharing\n * @property {Object} sharePreferences\n */\n/**\n *\n * @public\n * @export\n * Mimic browser APIs as \"the ultimate browser\".\n * Handles the quirks of each browser.\n * Extends and enhances adapter.js, i.e., the \"media\" file from the web client.\n */\nconst Media: any = {};\n\n/**\n * make a browser call to get the media\n * @param {SendOptions} options\n * @param {Object} config SDK Configuration for meetings plugin\n * @returns {Promise}\n */\nMedia.getLocalMedia = (options: any, config: object) => {\n const {sendAudio, sendVideo, sendShare, sharePreferences, isSharing} = options;\n\n if (sendAudio || sendVideo) {\n return Media.getMedia(sendAudio, sendVideo, config);\n }\n\n if (sendShare && !isSharing) {\n return Media.getDisplayMedia(\n {\n sendAudio: false,\n sendShare: true,\n sharePreferences,\n },\n config\n );\n }\n\n return Promise.resolve(undefined);\n};\n\nMedia.getDirection = (forceSendRecv: boolean, receive: boolean, send: boolean) => {\n if (!receive && !send) {\n return 'inactive';\n }\n\n if (forceSendRecv || (receive && send)) {\n return 'sendrecv';\n }\n\n if (receive) {\n return 'recvonly';\n }\n\n return 'sendonly';\n};\n\n/**\n * creates a webrtc media connection with provided tracks and mediaDirection configuration\n *\n * @param {boolean} isMultistream\n * @param {string} debugId string useful for debugging (will appear in media connection logs)\n * @param {string} meetingId id for the meeting using this connection\n * @param {Object} options\n * @param {Object} [options.mediaProperties] contains mediaDirection and local tracks:\n * audioTrack, videoTrack, shareVideoTrack, and shareAudioTrack\n * @param {string} [options.remoteQualityLevel] LOW|MEDIUM|HIGH applicable only to non-multistream connections\n * @param {boolean} [options.enableRtx] applicable only to non-multistream connections\n * @param {boolean} [options.enableExtmap] applicable only to non-multistream connections\n * @param {Object} [options.turnServerInfo]\n * @param {BundlePolicy} [options.bundlePolicy]\n * @returns {RoapMediaConnection | MultistreamRoapMediaConnection}\n */\nMedia.createMediaConnection = (\n isMultistream: boolean,\n debugId: string,\n meetingId: string,\n options: {\n rtcMetrics?: RtcMetrics;\n mediaProperties: {\n mediaDirection?: {\n receiveAudio: boolean;\n receiveVideo: boolean;\n receiveShare: boolean;\n sendAudio: boolean;\n sendVideo: boolean;\n sendShare: boolean;\n };\n audioStream?: LocalMicrophoneStream;\n videoStream?: LocalCameraStream;\n shareVideoStream?: LocalDisplayStream;\n shareAudioStream?: LocalSystemAudioStream;\n };\n remoteQualityLevel?: 'LOW' | 'MEDIUM' | 'HIGH';\n enableRtx?: boolean;\n enableExtmap?: boolean;\n turnServerInfo?: TurnServerInfo;\n bundlePolicy?: BundlePolicy;\n iceCandidatesTimeout?: number;\n disableAudioMainDtx?: boolean;\n enableAudioTwcc?: boolean;\n stopIceGatheringAfterFirstRelayCandidate?: boolean;\n }\n) => {\n const {\n rtcMetrics,\n mediaProperties,\n remoteQualityLevel,\n enableRtx,\n enableExtmap,\n turnServerInfo,\n bundlePolicy,\n iceCandidatesTimeout,\n disableAudioMainDtx,\n enableAudioTwcc,\n stopIceGatheringAfterFirstRelayCandidate,\n } = options;\n\n const iceServers = [];\n\n // we might not have any TURN server if TURN discovery failed or wasn't done or we land on a video mesh node\n if (turnServerInfo?.urls.length > 0) {\n // TURN-TLS server\n iceServers.push({\n urls: turnServerInfo.urls,\n username: turnServerInfo.username || '',\n credential: turnServerInfo.password || '',\n });\n }\n\n if (isMultistream) {\n const config: MultistreamConnectionConfig = {\n iceServers,\n disableAudioTwcc: !enableAudioTwcc,\n };\n\n if (bundlePolicy) {\n config.bundlePolicy = bundlePolicy;\n }\n\n if (disableAudioMainDtx !== undefined) {\n config.disableAudioMainDtx = disableAudioMainDtx;\n }\n\n if (BrowserInfo.isFirefox()) {\n config.doFullIce = true;\n\n config.stopIceGatheringAfterFirstRelayCandidate = stopIceGatheringAfterFirstRelayCandidate;\n }\n\n return new MultistreamRoapMediaConnection(\n config,\n meetingId,\n /* the rtc metrics objects callbacks */\n (data) => rtcMetrics?.addMetrics(data),\n () => rtcMetrics?.closeMetrics(),\n () => rtcMetrics?.sendMetricsInQueue()\n );\n }\n\n if (!mediaProperties) {\n throw new Error('mediaProperties have to be provided for non-multistream media connections');\n }\n\n const {mediaDirection, audioStream, videoStream, shareVideoStream, shareAudioStream} =\n mediaProperties;\n\n return new RoapMediaConnection(\n {\n iceServers,\n iceCandidatesTimeout,\n skipInactiveTransceivers: false,\n requireH264: true,\n sdpMunging: {\n convertPort9to0: false,\n addContentSlides: true,\n bandwidthLimits: {\n audio: StaticConfig.meetings.bandwidth.audio,\n video: StaticConfig.meetings.bandwidth.video,\n },\n startBitrate: StaticConfig.meetings.bandwidth.startBitrate,\n periodicKeyframes: 20, // it's always been hardcoded in SDK so for now keeping it that way\n disableExtmap: !enableExtmap,\n disableRtx: !enableRtx, // see https://bugs.chromium.org/p/chromium/issues/detail?id=1020642 why we might want to remove RTX from SDP\n },\n },\n {\n // TODO: RoapMediaConnection is not ready to use stream classes yet, so we pass the raw MediaStreamTrack for now SPARK-460530\n localTracks: {\n audio: audioStream?.outputStream?.getTracks()[0],\n video: videoStream?.outputStream?.getTracks()[0],\n screenShareVideo: shareVideoStream?.outputStream?.getTracks()[0],\n screenShareAudio: shareAudioStream?.outputStream?.getTracks()[0], // TODO: add type for screenShareAudio in internal-media-core SPARK-446923\n } as unknown,\n direction: {\n audio: Media.getDirection(true, mediaDirection.receiveAudio, mediaDirection.sendAudio),\n video: Media.getDirection(true, mediaDirection.receiveVideo, mediaDirection.sendVideo),\n screenShareVideo: Media.getDirection(\n false,\n mediaDirection.receiveShare,\n mediaDirection.sendShare\n ),\n },\n remoteQualityLevel,\n },\n debugId\n );\n};\n\n/**\n * generates share streams\n * @param {Object} options parameter\n * @param {Boolean} options.sendAudio send audio from the display share\n * @param {Boolean} options.sendShare send video from the display share\n * @param {Object} options.sharePreferences\n * @param {MediaTrackConstraints} options.sharePreferences.shareConstraints constraints to apply to video\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackConstraints}\n * @param {Boolean} options.sharePreferences.highFrameRate if shareConstraints isn't provided, set default values based off of this boolean\n * @param {Object} config SDK Configuration for meetings plugin\n * @returns {Promise.<MediaStream>}\n */\nMedia.getDisplayMedia = (\n options: {\n sendAudio: boolean;\n sendShare: boolean;\n sharePreferences: {\n shareConstraints: MediaTrackConstraints;\n highFrameRate: any;\n };\n },\n config: any = {}\n) => {\n // SDK screen share resolution settings from Webex.init\n const customResolution = config.screenResolution || {};\n // user defined screen share frame rate\n const customShareFrameRate = config.screenFrameRate || null;\n // user defined share preferences\n const hasSharePreferences = options.sharePreferences;\n const hasCustomConstraints = hasSharePreferences && hasSharePreferences.shareConstraints;\n const hasHighFrameRate = hasSharePreferences && hasSharePreferences.highFrameRate;\n const {screenResolution, resolution, videoShareFrameRate, screenFrameRate, aspectRatio} =\n Config.meetings;\n\n let shareConstraints: any = {\n cursor: MEDIA_TRACK_CONSTRAINT.CURSOR.AWLAYS,\n aspectRatio,\n };\n\n if (hasCustomConstraints) {\n shareConstraints = hasSharePreferences.shareConstraints;\n } else if (hasHighFrameRate) {\n shareConstraints = {\n ...shareConstraints,\n frameRate: videoShareFrameRate,\n height: resolution.idealHeight,\n width: resolution.idealWidth,\n ...config.resolution,\n };\n } else {\n shareConstraints = {\n ...shareConstraints,\n frameRate: customShareFrameRate || screenFrameRate,\n height: customResolution.idealHeight || screenResolution.idealHeight,\n width: customResolution.idealWidth || screenResolution.idealWidth,\n ...config.screenResolution,\n };\n }\n\n // chrome and webkit based browsers (edge, safari) automatically adjust everything\n // and we have noticed higher quality with those browser types\n // firefox specifically has some issues with resolution and frame rate decision making\n // so we are making it optional and configurable (with defaults) for firefox\n // to have higher quality, and for developers to control the values\n // eventually we may have to add the same functionality to chrome, OR conversely, get to with firefox\n\n if (isBrowser('firefox')) {\n const mediaConfig: any = {\n audio: options.sendAudio,\n video: options.sendShare,\n };\n\n return navigator.mediaDevices\n .getDisplayMedia({audio: options.sendAudio, video: mediaConfig})\n .then((stream) => {\n if (options.sendShare && stream.getVideoTracks().length > 0) {\n // Firefox has a bug with the spec where changing in the height and width only happens\n // after we get the inital tracks\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1321221\n stream.getVideoTracks()[0].applyConstraints(shareConstraints);\n }\n\n return stream;\n });\n }\n\n const getDisplayMediaParams: any = {video: options.sendShare ? shareConstraints : false};\n\n // safari doesn't support sending screen share audio\n // https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getDisplayMedia\n if (options.sendAudio && isBrowser('safari')) {\n getDisplayMediaParams.audio = options.sendAudio;\n }\n\n return navigator.mediaDevices.getDisplayMedia(getDisplayMediaParams);\n};\n\n/**\n * generates audio and video using constraints (often called after getSupportedDevices)\n * @param {Object|Boolean} audio gum constraints\n * @param {Object|Boolean} video gum constraints\n * @param {Object} config SDK Configuration for meetings plugin\n * @returns {Object} {streams}\n */\nMedia.getMedia = (audio: any | boolean, video: any | boolean, config: any) => {\n const defaultWidth = {ideal: config.resolution.idealWidth, max: config.resolution.maxWidth};\n const defaultHeight = {ideal: config.resolution.idealHeight, max: config.resolution.maxHeight};\n const mediaConfig = {\n audio,\n // TODO: Remove temporary workaround once Firefox fixes low constraint issues\n // eslint-disable-next-line no-nested-ternary\n video: video\n ? isBrowser('firefox') && video.width && video.width.max === 320\n ? {\n deviceId: video.deviceId ? video.deviceId : undefined,\n width: 320,\n height: 180,\n frameRate: video.frameRate ? video.frameRate : undefined,\n facingMode: video.facingMode ? video.facingMode : undefined,\n }\n : {\n deviceId: video.deviceId ? video.deviceId : undefined,\n width: video.width ? video.width : defaultWidth,\n height: video.height ? video.height : defaultHeight,\n frameRate: video.frameRate ? video.frameRate : undefined,\n facingMode: video.facingMode ? video.facingMode : undefined,\n }\n : false,\n fake: process.env.NODE_ENV === 'test', // Special case to get fake media for Firefox browser for testing\n };\n\n return navigator.mediaDevices.getUserMedia(mediaConfig).catch((err) => {\n const logPath = 'Media:index#getMedia --> navigator.mediaDevices.getUserMedia';\n\n LoggerProxy.logger.error(`${logPath} failed - ${err} (${err.constraint})`);\n throw err;\n });\n};\n\n/**\n *\n * Toggle a specific stream\n * noop as of now, does nothing\n * @returns {null}\n */\nMedia.toggleStream = () => {};\n\n/**\n * Stop input stream\n * @param {LocalStream} stream A local stream\n * @returns {null}\n */\nMedia.stopStream = (stream: LocalStream) => {\n if (!stream) {\n return Promise.resolve();\n }\n\n return Promise.resolve().then(() => {\n try {\n stream.stop();\n } catch (e) {\n LoggerProxy.logger.error(\n `Media:index#stopStream --> Unable to stop the stream with ready state => ${stream.readyState}, error: ${e}`\n );\n }\n });\n};\n\n/**\n * generates streams for audio video and share\n * @param {object} mediaSetting parameter\n * @param {Object} mediaSetting.sendAudio sendAudio: {Boolean} sendAudio constraints\n * @param {Object} mediaSetting.sendVideo sendVideo: {Boolean} sendVideo constraints\n * @param {Object} mediaSetting.sendShare sendShare: {Boolean} sendShare constraints\n * @param {Object} mediaSetting.isSharing isSharing: {Boolean} isSharing constraints\n * @param {Object} audioVideo parameter\n * @param {Object} audioVideo.audio {deviceId: {String}}\n * @param {Object} audioVideo.video {deviceId: {String}}\n * @param {Object} sharePreferences parameter\n * @param {Object} sharePreferences.shareConstraints parameter\n * @param {Boolean} sharePreferences.highFrameRate parameter\n * @param {Object} config SDK Config\n * @returns {Array} [localStream, shareStream]\n */\nMedia.getUserMedia = (\n mediaSetting: {\n sendAudio: object;\n sendVideo: object;\n sendShare: object;\n isSharing: object;\n },\n audioVideo: {\n audio: object;\n video: object;\n },\n sharePreferences: {\n shareConstraints: object;\n highFrameRate: boolean;\n },\n config: object\n) =>\n Media.getLocalMedia(\n {\n sendAudio: mediaSetting.sendAudio ? audioVideo.audio || mediaSetting.sendAudio : false,\n sendVideo: mediaSetting.sendVideo ? audioVideo.video || mediaSetting.sendVideo : false,\n },\n config\n ).then((localStream) =>\n Media.getLocalMedia(\n {\n sendShare: mediaSetting.sendShare,\n isSharing: mediaSetting.isSharing,\n sharePreferences,\n },\n config\n ).then((shareStream) => [localStream, shareStream])\n );\n\nexport default Media;\n"],"mappings":"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"}
|
1
|
+
{"version":3,"names":["_internalMediaCore","require","_webCapabilities","_loggerProxy","_interopRequireDefault","_constants","_config","_config2","_browserDetection","ownKeys","e","r","t","_Object$keys","_Object$getOwnPropertySymbols","o","filter","_Object$getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","Object","forEach","_defineProperty2","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty","_BrowserDetection","BrowserDetection","isBrowser","Media","getLocalMedia","options","config","sendAudio","sendVideo","sendShare","sharePreferences","isSharing","getMedia","getDisplayMedia","_promise","resolve","undefined","getDirection","forceSendRecv","receive","send","createMediaConnection","isMultistream","debugId","meetingId","_audioStream$outputSt","_videoStream$outputSt","_shareVideoStream$out","_shareAudioStream$out","rtcMetrics","mediaProperties","remoteQualityLevel","enableRtx","enableExtmap","turnServerInfo","bundlePolicy","iceCandidatesTimeout","disableAudioMainDtx","enableAudioTwcc","stopIceGatheringAfterFirstRelayCandidate","iceServers","urls","username","credential","password","disableAudioTwcc","BrowserInfo","isFirefox","doFullIce","MultistreamRoapMediaConnection","data","addMetrics","closeMetrics","sendMetricsInQueue","Error","mediaDirection","audioStream","videoStream","shareVideoStream","shareAudioStream","RoapMediaConnection","skipInactiveTransceivers","requireH264","sdpMunging","convertPort9to0","addContentSlides","bandwidthLimits","audio","StaticConfig","meetings","bandwidth","video","startBitrate","periodicKeyframes","disableExtmap","disableRtx","localTracks","outputStream","getTracks","screenShareVideo","screenShareAudio","direction","receiveAudio","receiveVideo","receiveShare","customResolution","screenResolution","customShareFrameRate","screenFrameRate","hasSharePreferences","hasCustomConstraints","shareConstraints","hasHighFrameRate","highFrameRate","_Config$meetings","Config","resolution","videoShareFrameRate","aspectRatio","cursor","MEDIA_TRACK_CONSTRAINT","CURSOR","AWLAYS","frameRate","height","idealHeight","width","idealWidth","mediaConfig","navigator","mediaDevices","then","stream","getVideoTracks","applyConstraints","getDisplayMediaParams","defaultWidth","ideal","max","maxWidth","defaultHeight","maxHeight","deviceId","facingMode","fake","process","env","NODE_ENV","getUserMedia","catch","err","logPath","LoggerProxy","logger","error","concat","constraint","toggleStream","stopStream","stop","readyState","mediaSetting","audioVideo","localStream","shareStream","_default","exports"],"sources":["index.ts"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n/* globals navigator */\n\nimport {\n RoapMediaConnection,\n MultistreamRoapMediaConnection,\n type MultistreamConnectionConfig,\n} from '@webex/internal-media-core';\nimport {\n LocalStream,\n LocalCameraStream,\n LocalDisplayStream,\n LocalSystemAudioStream,\n LocalMicrophoneStream,\n} from '@webex/media-helpers';\nimport {RtcMetrics} from '@webex/internal-plugin-metrics';\nimport {BrowserInfo} from '@webex/web-capabilities';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {MEDIA_TRACK_CONSTRAINT} from '../constants';\nimport Config from '../config';\nimport StaticConfig from '../common/config';\nimport BrowserDetection from '../common/browser-detection';\nimport {TurnServerInfo} from '../roap/types';\n\nconst {isBrowser} = BrowserDetection();\n\nexport type BundlePolicy = MultistreamConnectionConfig['bundlePolicy'];\n\n/**\n * MediaDirection\n * @typedef {Object} MediaDirection\n * @property {boolean} sendAudio\n * @property {boolean} receiveAudio\n * @property {boolean} sendVideo\n * @property {boolean} receiveVideo\n * @property {boolean} sendShare\n * @property {boolean} receiveShare\n */\n\n/**\n * SendOptions\n * @typedef {Object} SendOptions\n * @property sendAudio\n * @property sendVideo\n * @property sendShare\n * @property isSharing\n * @property {Object} sharePreferences\n */\n/**\n *\n * @public\n * @export\n * Mimic browser APIs as \"the ultimate browser\".\n * Handles the quirks of each browser.\n * Extends and enhances adapter.js, i.e., the \"media\" file from the web client.\n */\nconst Media: any = {};\n\n/**\n * make a browser call to get the media\n * @param {SendOptions} options\n * @param {Object} config SDK Configuration for meetings plugin\n * @returns {Promise}\n */\nMedia.getLocalMedia = (options: any, config: object) => {\n const {sendAudio, sendVideo, sendShare, sharePreferences, isSharing} = options;\n\n if (sendAudio || sendVideo) {\n return Media.getMedia(sendAudio, sendVideo, config);\n }\n\n if (sendShare && !isSharing) {\n return Media.getDisplayMedia(\n {\n sendAudio: false,\n sendShare: true,\n sharePreferences,\n },\n config\n );\n }\n\n return Promise.resolve(undefined);\n};\n\nMedia.getDirection = (forceSendRecv: boolean, receive: boolean, send: boolean) => {\n if (!receive && !send) {\n return 'inactive';\n }\n\n if (forceSendRecv || (receive && send)) {\n return 'sendrecv';\n }\n\n if (receive) {\n return 'recvonly';\n }\n\n return 'sendonly';\n};\n\n/**\n * creates a webrtc media connection with provided tracks and mediaDirection configuration\n *\n * @param {boolean} isMultistream\n * @param {string} debugId string useful for debugging (will appear in media connection logs)\n * @param {string} meetingId id for the meeting using this connection\n * @param {Object} options\n * @param {Object} [options.mediaProperties] contains mediaDirection and local tracks:\n * audioTrack, videoTrack, shareVideoTrack, and shareAudioTrack\n * @param {string} [options.remoteQualityLevel] LOW|MEDIUM|HIGH applicable only to non-multistream connections\n * @param {boolean} [options.enableRtx] applicable only to non-multistream connections\n * @param {boolean} [options.enableExtmap] applicable only to non-multistream connections\n * @param {Object} [options.turnServerInfo]\n * @param {BundlePolicy} [options.bundlePolicy]\n * @returns {RoapMediaConnection | MultistreamRoapMediaConnection}\n */\nMedia.createMediaConnection = (\n isMultistream: boolean,\n debugId: string,\n meetingId: string,\n options: {\n rtcMetrics?: RtcMetrics;\n mediaProperties: {\n mediaDirection?: {\n receiveAudio: boolean;\n receiveVideo: boolean;\n receiveShare: boolean;\n sendAudio: boolean;\n sendVideo: boolean;\n sendShare: boolean;\n };\n audioStream?: LocalMicrophoneStream;\n videoStream?: LocalCameraStream;\n shareVideoStream?: LocalDisplayStream;\n shareAudioStream?: LocalSystemAudioStream;\n };\n remoteQualityLevel?: 'LOW' | 'MEDIUM' | 'HIGH';\n enableRtx?: boolean;\n enableExtmap?: boolean;\n turnServerInfo?: TurnServerInfo;\n bundlePolicy?: BundlePolicy;\n iceCandidatesTimeout?: number;\n disableAudioMainDtx?: boolean;\n enableAudioTwcc?: boolean;\n stopIceGatheringAfterFirstRelayCandidate?: boolean;\n }\n) => {\n const {\n rtcMetrics,\n mediaProperties,\n remoteQualityLevel,\n enableRtx,\n enableExtmap,\n turnServerInfo,\n bundlePolicy,\n iceCandidatesTimeout,\n disableAudioMainDtx,\n enableAudioTwcc,\n stopIceGatheringAfterFirstRelayCandidate,\n } = options;\n\n const iceServers = [];\n\n // we might not have any TURN server if TURN discovery failed or wasn't done or we land on a video mesh node\n if (turnServerInfo?.urls.length > 0) {\n // TURN-TLS server\n iceServers.push({\n urls: turnServerInfo.urls,\n username: turnServerInfo.username || '',\n credential: turnServerInfo.password || '',\n });\n }\n\n if (isMultistream) {\n const config: MultistreamConnectionConfig = {\n iceServers,\n disableAudioTwcc: !enableAudioTwcc,\n };\n\n if (bundlePolicy) {\n config.bundlePolicy = bundlePolicy;\n }\n\n if (disableAudioMainDtx !== undefined) {\n config.disableAudioMainDtx = disableAudioMainDtx;\n }\n\n if (BrowserInfo.isFirefox()) {\n config.doFullIce = true;\n\n config.stopIceGatheringAfterFirstRelayCandidate = stopIceGatheringAfterFirstRelayCandidate;\n }\n\n return new MultistreamRoapMediaConnection(\n config,\n meetingId,\n /* the rtc metrics objects callbacks */\n (data) => rtcMetrics?.addMetrics(data),\n () => rtcMetrics?.closeMetrics(),\n () => rtcMetrics?.sendMetricsInQueue()\n );\n }\n\n if (!mediaProperties) {\n throw new Error('mediaProperties have to be provided for non-multistream media connections');\n }\n\n const {mediaDirection, audioStream, videoStream, shareVideoStream, shareAudioStream} =\n mediaProperties;\n\n return new RoapMediaConnection(\n {\n iceServers,\n iceCandidatesTimeout,\n skipInactiveTransceivers: false,\n requireH264: true,\n sdpMunging: {\n convertPort9to0: false,\n addContentSlides: true,\n bandwidthLimits: {\n audio: StaticConfig.meetings.bandwidth.audio,\n video: StaticConfig.meetings.bandwidth.video,\n },\n startBitrate: StaticConfig.meetings.bandwidth.startBitrate,\n periodicKeyframes: 20, // it's always been hardcoded in SDK so for now keeping it that way\n disableExtmap: !enableExtmap,\n disableRtx: !enableRtx, // see https://bugs.chromium.org/p/chromium/issues/detail?id=1020642 why we might want to remove RTX from SDP\n },\n },\n {\n // TODO: RoapMediaConnection is not ready to use stream classes yet, so we pass the raw MediaStreamTrack for now SPARK-460530\n localTracks: {\n audio: audioStream?.outputStream?.getTracks()[0],\n video: videoStream?.outputStream?.getTracks()[0],\n screenShareVideo: shareVideoStream?.outputStream?.getTracks()[0],\n screenShareAudio: shareAudioStream?.outputStream?.getTracks()[0], // TODO: add type for screenShareAudio in internal-media-core SPARK-446923\n } as unknown,\n direction: {\n audio: Media.getDirection(false, mediaDirection.receiveAudio, mediaDirection.sendAudio),\n video: Media.getDirection(false, mediaDirection.receiveVideo, mediaDirection.sendVideo),\n screenShareVideo: Media.getDirection(\n false,\n mediaDirection.receiveShare,\n mediaDirection.sendShare\n ),\n },\n remoteQualityLevel,\n },\n debugId\n );\n};\n\n/**\n * generates share streams\n * @param {Object} options parameter\n * @param {Boolean} options.sendAudio send audio from the display share\n * @param {Boolean} options.sendShare send video from the display share\n * @param {Object} options.sharePreferences\n * @param {MediaTrackConstraints} options.sharePreferences.shareConstraints constraints to apply to video\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackConstraints}\n * @param {Boolean} options.sharePreferences.highFrameRate if shareConstraints isn't provided, set default values based off of this boolean\n * @param {Object} config SDK Configuration for meetings plugin\n * @returns {Promise.<MediaStream>}\n */\nMedia.getDisplayMedia = (\n options: {\n sendAudio: boolean;\n sendShare: boolean;\n sharePreferences: {\n shareConstraints: MediaTrackConstraints;\n highFrameRate: any;\n };\n },\n config: any = {}\n) => {\n // SDK screen share resolution settings from Webex.init\n const customResolution = config.screenResolution || {};\n // user defined screen share frame rate\n const customShareFrameRate = config.screenFrameRate || null;\n // user defined share preferences\n const hasSharePreferences = options.sharePreferences;\n const hasCustomConstraints = hasSharePreferences && hasSharePreferences.shareConstraints;\n const hasHighFrameRate = hasSharePreferences && hasSharePreferences.highFrameRate;\n const {screenResolution, resolution, videoShareFrameRate, screenFrameRate, aspectRatio} =\n Config.meetings;\n\n let shareConstraints: any = {\n cursor: MEDIA_TRACK_CONSTRAINT.CURSOR.AWLAYS,\n aspectRatio,\n };\n\n if (hasCustomConstraints) {\n shareConstraints = hasSharePreferences.shareConstraints;\n } else if (hasHighFrameRate) {\n shareConstraints = {\n ...shareConstraints,\n frameRate: videoShareFrameRate,\n height: resolution.idealHeight,\n width: resolution.idealWidth,\n ...config.resolution,\n };\n } else {\n shareConstraints = {\n ...shareConstraints,\n frameRate: customShareFrameRate || screenFrameRate,\n height: customResolution.idealHeight || screenResolution.idealHeight,\n width: customResolution.idealWidth || screenResolution.idealWidth,\n ...config.screenResolution,\n };\n }\n\n // chrome and webkit based browsers (edge, safari) automatically adjust everything\n // and we have noticed higher quality with those browser types\n // firefox specifically has some issues with resolution and frame rate decision making\n // so we are making it optional and configurable (with defaults) for firefox\n // to have higher quality, and for developers to control the values\n // eventually we may have to add the same functionality to chrome, OR conversely, get to with firefox\n\n if (isBrowser('firefox')) {\n const mediaConfig: any = {\n audio: options.sendAudio,\n video: options.sendShare,\n };\n\n return navigator.mediaDevices\n .getDisplayMedia({audio: options.sendAudio, video: mediaConfig})\n .then((stream) => {\n if (options.sendShare && stream.getVideoTracks().length > 0) {\n // Firefox has a bug with the spec where changing in the height and width only happens\n // after we get the inital tracks\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1321221\n stream.getVideoTracks()[0].applyConstraints(shareConstraints);\n }\n\n return stream;\n });\n }\n\n const getDisplayMediaParams: any = {video: options.sendShare ? shareConstraints : false};\n\n // safari doesn't support sending screen share audio\n // https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getDisplayMedia\n if (options.sendAudio && isBrowser('safari')) {\n getDisplayMediaParams.audio = options.sendAudio;\n }\n\n return navigator.mediaDevices.getDisplayMedia(getDisplayMediaParams);\n};\n\n/**\n * generates audio and video using constraints (often called after getSupportedDevices)\n * @param {Object|Boolean} audio gum constraints\n * @param {Object|Boolean} video gum constraints\n * @param {Object} config SDK Configuration for meetings plugin\n * @returns {Object} {streams}\n */\nMedia.getMedia = (audio: any | boolean, video: any | boolean, config: any) => {\n const defaultWidth = {ideal: config.resolution.idealWidth, max: config.resolution.maxWidth};\n const defaultHeight = {ideal: config.resolution.idealHeight, max: config.resolution.maxHeight};\n const mediaConfig = {\n audio,\n // TODO: Remove temporary workaround once Firefox fixes low constraint issues\n // eslint-disable-next-line no-nested-ternary\n video: video\n ? isBrowser('firefox') && video.width && video.width.max === 320\n ? {\n deviceId: video.deviceId ? video.deviceId : undefined,\n width: 320,\n height: 180,\n frameRate: video.frameRate ? video.frameRate : undefined,\n facingMode: video.facingMode ? video.facingMode : undefined,\n }\n : {\n deviceId: video.deviceId ? video.deviceId : undefined,\n width: video.width ? video.width : defaultWidth,\n height: video.height ? video.height : defaultHeight,\n frameRate: video.frameRate ? video.frameRate : undefined,\n facingMode: video.facingMode ? video.facingMode : undefined,\n }\n : false,\n fake: process.env.NODE_ENV === 'test', // Special case to get fake media for Firefox browser for testing\n };\n\n return navigator.mediaDevices.getUserMedia(mediaConfig).catch((err) => {\n const logPath = 'Media:index#getMedia --> navigator.mediaDevices.getUserMedia';\n\n LoggerProxy.logger.error(`${logPath} failed - ${err} (${err.constraint})`);\n throw err;\n });\n};\n\n/**\n *\n * Toggle a specific stream\n * noop as of now, does nothing\n * @returns {null}\n */\nMedia.toggleStream = () => {};\n\n/**\n * Stop input stream\n * @param {LocalStream} stream A local stream\n * @returns {null}\n */\nMedia.stopStream = (stream: LocalStream) => {\n if (!stream) {\n return Promise.resolve();\n }\n\n return Promise.resolve().then(() => {\n try {\n stream.stop();\n } catch (e) {\n LoggerProxy.logger.error(\n `Media:index#stopStream --> Unable to stop the stream with ready state => ${stream.readyState}, error: ${e}`\n );\n }\n });\n};\n\n/**\n * generates streams for audio video and share\n * @param {object} mediaSetting parameter\n * @param {Object} mediaSetting.sendAudio sendAudio: {Boolean} sendAudio constraints\n * @param {Object} mediaSetting.sendVideo sendVideo: {Boolean} sendVideo constraints\n * @param {Object} mediaSetting.sendShare sendShare: {Boolean} sendShare constraints\n * @param {Object} mediaSetting.isSharing isSharing: {Boolean} isSharing constraints\n * @param {Object} audioVideo parameter\n * @param {Object} audioVideo.audio {deviceId: {String}}\n * @param {Object} audioVideo.video {deviceId: {String}}\n * @param {Object} sharePreferences parameter\n * @param {Object} sharePreferences.shareConstraints parameter\n * @param {Boolean} sharePreferences.highFrameRate parameter\n * @param {Object} config SDK Config\n * @returns {Array} [localStream, shareStream]\n */\nMedia.getUserMedia = (\n mediaSetting: {\n sendAudio: object;\n sendVideo: object;\n sendShare: object;\n isSharing: object;\n },\n audioVideo: {\n audio: object;\n video: object;\n },\n sharePreferences: {\n shareConstraints: object;\n highFrameRate: boolean;\n },\n config: object\n) =>\n Media.getLocalMedia(\n {\n sendAudio: mediaSetting.sendAudio ? audioVideo.audio || mediaSetting.sendAudio : false,\n sendVideo: mediaSetting.sendVideo ? audioVideo.video || mediaSetting.sendVideo : false,\n },\n config\n ).then((localStream) =>\n Media.getLocalMedia(\n {\n sendShare: mediaSetting.sendShare,\n isSharing: mediaSetting.isSharing,\n sharePreferences,\n },\n config\n ).then((shareStream) => [localStream, shareStream])\n );\n\nexport default Media;\n"],"mappings":"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"}
|
package/dist/meeting/brbState.js
CHANGED
@@ -56,8 +56,13 @@ var BrbState = exports.BrbState = /*#__PURE__*/function () {
|
|
56
56
|
(0, _createClass2.default)(BrbState, [{
|
57
57
|
key: "enable",
|
58
58
|
value: function enable(enabled, sendSlotManager) {
|
59
|
+
var _this = this;
|
59
60
|
this.state.client.enabled = enabled;
|
60
|
-
|
61
|
+
|
62
|
+
// Don't set the source state override if enabling brb fails
|
63
|
+
return this.applyClientStateToServer(sendSlotManager).then(function () {
|
64
|
+
sendSlotManager.setSourceStateOverride(_internalMediaCore.MediaType.VideoMain, _this.state.client.enabled ? 'away' : null);
|
65
|
+
});
|
61
66
|
}
|
62
67
|
|
63
68
|
/**
|
@@ -69,7 +74,7 @@ var BrbState = exports.BrbState = /*#__PURE__*/function () {
|
|
69
74
|
}, {
|
70
75
|
key: "applyClientStateToServer",
|
71
76
|
value: function applyClientStateToServer(sendSlotManager) {
|
72
|
-
var
|
77
|
+
var _this2 = this;
|
73
78
|
if (this.state.syncToServerInProgress) {
|
74
79
|
_loggerProxy.default.logger.info("Meeting:brbState#applyClientStateToServer: request to server in progress, we need to wait for it to complete");
|
75
80
|
return _promise.default.resolve();
|
@@ -81,20 +86,20 @@ var BrbState = exports.BrbState = /*#__PURE__*/function () {
|
|
81
86
|
return _promise.default.resolve();
|
82
87
|
}
|
83
88
|
this.state.syncToServerInProgress = true;
|
84
|
-
return this.sendLocalBrbStateToServer(
|
85
|
-
|
89
|
+
return this.sendLocalBrbStateToServer().then(function () {
|
90
|
+
_this2.state.syncToServerInProgress = false;
|
86
91
|
|
87
92
|
// This is a workaround for the fact that the server does not send the brb state
|
88
93
|
// in the locus update when a user joins from multiple devices but not all devices are requested brb.
|
89
94
|
// In the future, this could be improved with a new brb locus update handler
|
90
95
|
// https://jira-eng-gpk2.cisco.com/jira/browse/SPARK-655626
|
91
|
-
|
96
|
+
_this2.handleServerBrbUpdate(_this2.state.client.enabled);
|
92
97
|
_loggerProxy.default.logger.info("Meeting:brbState#applyClientStateToServer: sync with server completed");
|
93
98
|
|
94
99
|
// need to check if a new sync is required, because this.state.client may have changed while we were doing the current sync
|
95
|
-
|
100
|
+
_this2.applyClientStateToServer(sendSlotManager);
|
96
101
|
}).catch(function (error) {
|
97
|
-
|
102
|
+
_this2.state.syncToServerInProgress = false;
|
98
103
|
_loggerProxy.default.logger.warn("Meeting:brbState#applyClientStateToServer: Error: ".concat(error));
|
99
104
|
return _promise.default.reject(error);
|
100
105
|
});
|
@@ -103,13 +108,12 @@ var BrbState = exports.BrbState = /*#__PURE__*/function () {
|
|
103
108
|
/**
|
104
109
|
* Send the local brb state to the server
|
105
110
|
*
|
106
|
-
* @param {SendSlotManager} sendSlotManager
|
107
111
|
* @returns {Promise}
|
108
112
|
*/
|
109
113
|
}, {
|
110
114
|
key: "sendLocalBrbStateToServer",
|
111
115
|
value: (function () {
|
112
|
-
var _sendLocalBrbStateToServer = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(
|
116
|
+
var _sendLocalBrbStateToServer = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() {
|
113
117
|
var enabled, errorMessage, error, _errorMessage, _error;
|
114
118
|
return _regenerator.default.wrap(function _callee$(_context) {
|
115
119
|
while (1) switch (_context.prev = _context.next) {
|
@@ -138,8 +142,6 @@ var BrbState = exports.BrbState = /*#__PURE__*/function () {
|
|
138
142
|
locusUrl: this.meeting.locusUrl,
|
139
143
|
deviceUrl: this.meeting.deviceUrl,
|
140
144
|
selfId: this.meeting.selfId
|
141
|
-
}).then(function () {
|
142
|
-
sendSlotManager.setSourceStateOverride(_internalMediaCore.MediaType.VideoMain, enabled ? 'away' : null);
|
143
145
|
}).catch(function (error) {
|
144
146
|
_loggerProxy.default.logger.error('Meeting:brbState#sendLocalBrbStateToServer: Error ', error);
|
145
147
|
return _promise.default.reject(error);
|
@@ -150,7 +152,7 @@ var BrbState = exports.BrbState = /*#__PURE__*/function () {
|
|
150
152
|
}
|
151
153
|
}, _callee, this);
|
152
154
|
}));
|
153
|
-
function sendLocalBrbStateToServer(
|
155
|
+
function sendLocalBrbStateToServer() {
|
154
156
|
return _sendLocalBrbStateToServer.apply(this, arguments);
|
155
157
|
}
|
156
158
|
return sendLocalBrbStateToServer;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"names":["_internalMediaCore","require","_loggerProxy","_interopRequireDefault","createBrbState","exports","meeting","enabled","LoggerProxy","logger","info","concat","id","brbState","BrbState","_classCallCheck2","default","_defineProperty2","state","client","server","syncToServerInProgress","_createClass2","key","value","enable","sendSlotManager","applyClientStateToServer","_this","_promise","resolve","remoteBrbRequiresSync","sendLocalBrbStateToServer","then","handleServerBrbUpdate","catch","error","warn","reject","_sendLocalBrbStateToServer","_asyncToGenerator2","_regenerator","mark","_callee","errorMessage","_errorMessage","_error","wrap","_callee$","_context","prev","next","isMultistream","Error","abrupt","mediaProperties","webrtcMediaConnection","meetingRequest","setBrb","locusUrl","deviceUrl","selfId","setSourceStateOverride","MediaType","VideoMain","stop","_x","apply","arguments"],"sources":["brbState.ts"],"sourcesContent":["import {MediaType} from '@webex/internal-media-core';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport type Meeting from '.';\nimport SendSlotManager from '../multistream/sendSlotManager';\n\nexport const createBrbState = (meeting: Meeting, enabled: boolean) => {\n LoggerProxy.logger.info(\n `Meeting:brbState#createBrbState: creating BrbState for meeting id ${meeting?.id}`\n );\n\n const brbState = new BrbState(meeting, enabled);\n\n return brbState;\n};\n\n/** The purpose of this class is to manage the local and remote brb state\n * and make sure that the server state always matches the last requested state by the client.\n */\nexport class BrbState {\n state: {\n client: {\n enabled: boolean;\n };\n server: {\n enabled: boolean;\n };\n syncToServerInProgress: boolean;\n };\n\n meeting: Meeting;\n\n /**\n * Constructor\n *\n * @param {Meeting} meeting - the meeting object\n * @param {boolean} enabled - whether the client audio/video is enabled at all\n */\n constructor(meeting: Meeting, enabled: boolean) {\n this.meeting = meeting;\n this.state = {\n client: {\n enabled,\n },\n server: {\n enabled: false,\n },\n syncToServerInProgress: false,\n };\n }\n\n /**\n * Enables/disables brb\n *\n * @param {boolean} enabled\n * @param {SendSlotManager} sendSlotManager\n * @returns {Promise}\n */\n public enable(enabled: boolean, sendSlotManager: SendSlotManager) {\n this.state.client.enabled = enabled;\n\n return this.applyClientStateToServer(sendSlotManager);\n }\n\n /**\n * Updates the server local and remote brb values so that they match the current client desired state.\n *\n * @param {SendSlotManager} sendSlotManager\n * @returns {Promise}\n */\n private applyClientStateToServer(sendSlotManager: SendSlotManager) {\n if (this.state.syncToServerInProgress) {\n LoggerProxy.logger.info(\n `Meeting:brbState#applyClientStateToServer: request to server in progress, we need to wait for it to complete`\n );\n\n return Promise.resolve();\n }\n\n const remoteBrbRequiresSync = this.state.client.enabled !== this.state.server.enabled;\n\n LoggerProxy.logger.info(\n `Meeting:brbState#applyClientStateToServer: remoteBrbRequiresSync: ${remoteBrbRequiresSync}`\n );\n\n if (!remoteBrbRequiresSync) {\n LoggerProxy.logger.info(\n `Meeting:brbState#applyClientStateToServer: client state already matching server state, nothing to do`\n );\n\n return Promise.resolve();\n }\n\n this.state.syncToServerInProgress = true;\n\n return this.sendLocalBrbStateToServer(sendSlotManager)\n .then(() => {\n this.state.syncToServerInProgress = false;\n\n // This is a workaround for the fact that the server does not send the brb state\n // in the locus update when a user joins from multiple devices but not all devices are requested brb.\n // In the future, this could be improved with a new brb locus update handler\n // https://jira-eng-gpk2.cisco.com/jira/browse/SPARK-655626\n this.handleServerBrbUpdate(this.state.client.enabled);\n\n LoggerProxy.logger.info(\n `Meeting:brbState#applyClientStateToServer: sync with server completed`\n );\n\n // need to check if a new sync is required, because this.state.client may have changed while we were doing the current sync\n this.applyClientStateToServer(sendSlotManager);\n })\n .catch((error) => {\n this.state.syncToServerInProgress = false;\n LoggerProxy.logger.warn(`Meeting:brbState#applyClientStateToServer: Error: ${error}`);\n\n return Promise.reject(error);\n });\n }\n\n /**\n * Send the local brb state to the server\n *\n * @param {SendSlotManager} sendSlotManager\n * @returns {Promise}\n */\n private async sendLocalBrbStateToServer(sendSlotManager: SendSlotManager) {\n const {enabled} = this.state.client;\n\n if (!this.meeting.isMultistream) {\n const errorMessage = 'Meeting:brbState#sendLocalBrbStateToServer: Not a multistream meeting';\n const error = new Error(errorMessage);\n\n LoggerProxy.logger.error(error);\n\n return Promise.reject(error);\n }\n\n if (!this.meeting.mediaProperties.webrtcMediaConnection) {\n const errorMessage =\n 'Meeting:brbState#sendLocalBrbStateToServer: WebRTC media connection is not defined';\n const error = new Error(errorMessage);\n\n LoggerProxy.logger.error(error);\n\n return Promise.reject(error);\n }\n\n // this logic should be applied only to multistream meetings\n return this.meeting.meetingRequest\n .setBrb({\n enabled,\n locusUrl: this.meeting.locusUrl,\n deviceUrl: this.meeting.deviceUrl,\n selfId: this.meeting.selfId,\n })\n .then(() => {\n sendSlotManager.setSourceStateOverride(MediaType.VideoMain, enabled ? 'away' : null);\n })\n .catch((error) => {\n LoggerProxy.logger.error('Meeting:brbState#sendLocalBrbStateToServer: Error ', error);\n\n return Promise.reject(error);\n });\n }\n\n /**\n * This method should be called whenever the server brb state is changed\n *\n * @param {Boolean} [enabled] true if user has brb enabled, false otherwise\n * @returns {undefined}\n */\n public handleServerBrbUpdate(enabled?: boolean) {\n LoggerProxy.logger.info(\n `Meeting:brbState#handleServerBrbUpdate: updating server brb to (${enabled})`\n );\n this.state.server.enabled = !!enabled;\n }\n}\n"],"mappings":"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"}
|
1
|
+
{"version":3,"names":["_internalMediaCore","require","_loggerProxy","_interopRequireDefault","createBrbState","exports","meeting","enabled","LoggerProxy","logger","info","concat","id","brbState","BrbState","_classCallCheck2","default","_defineProperty2","state","client","server","syncToServerInProgress","_createClass2","key","value","enable","sendSlotManager","_this","applyClientStateToServer","then","setSourceStateOverride","MediaType","VideoMain","_this2","_promise","resolve","remoteBrbRequiresSync","sendLocalBrbStateToServer","handleServerBrbUpdate","catch","error","warn","reject","_sendLocalBrbStateToServer","_asyncToGenerator2","_regenerator","mark","_callee","errorMessage","_errorMessage","_error","wrap","_callee$","_context","prev","next","isMultistream","Error","abrupt","mediaProperties","webrtcMediaConnection","meetingRequest","setBrb","locusUrl","deviceUrl","selfId","stop","apply","arguments"],"sources":["brbState.ts"],"sourcesContent":["import {MediaType} from '@webex/internal-media-core';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport type Meeting from '.';\nimport SendSlotManager from '../multistream/sendSlotManager';\n\nexport const createBrbState = (meeting: Meeting, enabled: boolean) => {\n LoggerProxy.logger.info(\n `Meeting:brbState#createBrbState: creating BrbState for meeting id ${meeting?.id}`\n );\n\n const brbState = new BrbState(meeting, enabled);\n\n return brbState;\n};\n\n/** The purpose of this class is to manage the local and remote brb state\n * and make sure that the server state always matches the last requested state by the client.\n */\nexport class BrbState {\n state: {\n client: {\n enabled: boolean;\n };\n server: {\n enabled: boolean;\n };\n syncToServerInProgress: boolean;\n };\n\n meeting: Meeting;\n\n /**\n * Constructor\n *\n * @param {Meeting} meeting - the meeting object\n * @param {boolean} enabled - whether the client audio/video is enabled at all\n */\n constructor(meeting: Meeting, enabled: boolean) {\n this.meeting = meeting;\n this.state = {\n client: {\n enabled,\n },\n server: {\n enabled: false,\n },\n syncToServerInProgress: false,\n };\n }\n\n /**\n * Enables/disables brb\n *\n * @param {boolean} enabled\n * @param {SendSlotManager} sendSlotManager\n * @returns {Promise}\n */\n public enable(enabled: boolean, sendSlotManager: SendSlotManager) {\n this.state.client.enabled = enabled;\n\n // Don't set the source state override if enabling brb fails\n return this.applyClientStateToServer(sendSlotManager).then(() => {\n sendSlotManager.setSourceStateOverride(\n MediaType.VideoMain,\n this.state.client.enabled ? 'away' : null\n );\n });\n }\n\n /**\n * Updates the server local and remote brb values so that they match the current client desired state.\n *\n * @param {SendSlotManager} sendSlotManager\n * @returns {Promise}\n */\n private applyClientStateToServer(sendSlotManager: SendSlotManager) {\n if (this.state.syncToServerInProgress) {\n LoggerProxy.logger.info(\n `Meeting:brbState#applyClientStateToServer: request to server in progress, we need to wait for it to complete`\n );\n\n return Promise.resolve();\n }\n\n const remoteBrbRequiresSync = this.state.client.enabled !== this.state.server.enabled;\n\n LoggerProxy.logger.info(\n `Meeting:brbState#applyClientStateToServer: remoteBrbRequiresSync: ${remoteBrbRequiresSync}`\n );\n\n if (!remoteBrbRequiresSync) {\n LoggerProxy.logger.info(\n `Meeting:brbState#applyClientStateToServer: client state already matching server state, nothing to do`\n );\n\n return Promise.resolve();\n }\n\n this.state.syncToServerInProgress = true;\n\n return this.sendLocalBrbStateToServer()\n .then(() => {\n this.state.syncToServerInProgress = false;\n\n // This is a workaround for the fact that the server does not send the brb state\n // in the locus update when a user joins from multiple devices but not all devices are requested brb.\n // In the future, this could be improved with a new brb locus update handler\n // https://jira-eng-gpk2.cisco.com/jira/browse/SPARK-655626\n this.handleServerBrbUpdate(this.state.client.enabled);\n\n LoggerProxy.logger.info(\n `Meeting:brbState#applyClientStateToServer: sync with server completed`\n );\n\n // need to check if a new sync is required, because this.state.client may have changed while we were doing the current sync\n this.applyClientStateToServer(sendSlotManager);\n })\n .catch((error) => {\n this.state.syncToServerInProgress = false;\n LoggerProxy.logger.warn(`Meeting:brbState#applyClientStateToServer: Error: ${error}`);\n\n return Promise.reject(error);\n });\n }\n\n /**\n * Send the local brb state to the server\n *\n * @returns {Promise}\n */\n private async sendLocalBrbStateToServer() {\n const {enabled} = this.state.client;\n\n if (!this.meeting.isMultistream) {\n const errorMessage = 'Meeting:brbState#sendLocalBrbStateToServer: Not a multistream meeting';\n const error = new Error(errorMessage);\n\n LoggerProxy.logger.error(error);\n\n return Promise.reject(error);\n }\n\n if (!this.meeting.mediaProperties.webrtcMediaConnection) {\n const errorMessage =\n 'Meeting:brbState#sendLocalBrbStateToServer: WebRTC media connection is not defined';\n const error = new Error(errorMessage);\n\n LoggerProxy.logger.error(error);\n\n return Promise.reject(error);\n }\n\n // this logic should be applied only to multistream meetings\n return this.meeting.meetingRequest\n .setBrb({\n enabled,\n locusUrl: this.meeting.locusUrl,\n deviceUrl: this.meeting.deviceUrl,\n selfId: this.meeting.selfId,\n })\n .catch((error) => {\n LoggerProxy.logger.error('Meeting:brbState#sendLocalBrbStateToServer: Error ', error);\n\n return Promise.reject(error);\n });\n }\n\n /**\n * This method should be called whenever the server brb state is changed\n *\n * @param {Boolean} [enabled] true if user has brb enabled, false otherwise\n * @returns {undefined}\n */\n public handleServerBrbUpdate(enabled?: boolean) {\n LoggerProxy.logger.info(\n `Meeting:brbState#handleServerBrbUpdate: updating server brb to (${enabled})`\n );\n this.state.server.enabled = !!enabled;\n }\n}\n"],"mappings":"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"}
|