@webex/plugin-meetings 3.0.0-beta.86 → 3.0.0-beta.87

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.
Files changed (36) hide show
  1. package/dist/breakouts/breakout.js +1 -1
  2. package/dist/breakouts/index.js +1 -1
  3. package/dist/index.js +63 -1
  4. package/dist/index.js.map +1 -1
  5. package/dist/media/index.js.map +1 -1
  6. package/dist/media/properties.js.map +1 -1
  7. package/dist/meeting/index.js +139 -88
  8. package/dist/meeting/index.js.map +1 -1
  9. package/dist/meeting/muteState.js +169 -26
  10. package/dist/meeting/muteState.js.map +1 -1
  11. package/dist/meeting/util.js.map +1 -1
  12. package/dist/meetings/index.js +20 -2
  13. package/dist/meetings/index.js.map +1 -1
  14. package/dist/types/controls-options-manager/util.d.ts +0 -102
  15. package/dist/types/index.d.ts +6 -5
  16. package/dist/types/media/properties.d.ts +1 -1
  17. package/dist/types/meeting/index.d.ts +8 -5
  18. package/dist/types/meeting/muteState.d.ts +58 -5
  19. package/dist/types/meetings/index.d.ts +1 -0
  20. package/dist/types/multistream/remoteMedia.d.ts +1 -29
  21. package/dist/types/multistream/remoteMediaGroup.d.ts +0 -9
  22. package/package.json +19 -18
  23. package/src/{index.js → index.ts} +15 -0
  24. package/src/media/index.ts +2 -7
  25. package/src/media/properties.ts +3 -7
  26. package/src/meeting/index.ts +108 -51
  27. package/src/meeting/muteState.ts +158 -15
  28. package/src/meeting/util.ts +1 -1
  29. package/src/meetings/index.ts +14 -0
  30. package/test/integration/spec/converged-space-meetings.js +4 -3
  31. package/test/integration/spec/journey.js +4 -3
  32. package/test/integration/spec/space-meeting.js +4 -3
  33. package/test/unit/spec/meeting/index.js +24 -28
  34. package/test/unit/spec/meeting/muteState.js +226 -13
  35. package/test/utils/integrationTestUtils.js +64 -0
  36. package/test/utils/testUtils.js +0 -57
@@ -173,7 +173,7 @@ var Breakout = _webexCore.WebexPlugin.extend({
173
173
  sessionId: this.sessionId
174
174
  });
175
175
  },
176
- version: "3.0.0-beta.86"
176
+ version: "3.0.0-beta.87"
177
177
  });
178
178
  var _default = Breakout;
179
179
  exports.default = _default;
@@ -839,7 +839,7 @@ var Breakouts = _webexCore.WebexPlugin.extend({
839
839
  body: body
840
840
  });
841
841
  },
842
- version: "3.0.0-beta.86"
842
+ version: "3.0.0-beta.87"
843
843
  });
844
844
  var _default = Breakouts;
845
845
  exports.default = _default;
package/dist/index.js CHANGED
@@ -8,7 +8,50 @@ var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequ
8
8
  _Object$defineProperty(exports, "__esModule", {
9
9
  value: true
10
10
  });
11
- exports.REACTIONS = exports.CONSTANTS = void 0;
11
+ exports.CONSTANTS = void 0;
12
+ _Object$defineProperty(exports, "LocalCameraTrack", {
13
+ enumerable: true,
14
+ get: function get() {
15
+ return _mediaHelpers.LocalCameraTrack;
16
+ }
17
+ });
18
+ _Object$defineProperty(exports, "LocalCameraTrackEvents", {
19
+ enumerable: true,
20
+ get: function get() {
21
+ return _mediaHelpers.LocalCameraTrackEvents;
22
+ }
23
+ });
24
+ _Object$defineProperty(exports, "LocalDisplayTrack", {
25
+ enumerable: true,
26
+ get: function get() {
27
+ return _mediaHelpers.LocalDisplayTrack;
28
+ }
29
+ });
30
+ _Object$defineProperty(exports, "LocalMicrophoneTrack", {
31
+ enumerable: true,
32
+ get: function get() {
33
+ return _mediaHelpers.LocalMicrophoneTrack;
34
+ }
35
+ });
36
+ _Object$defineProperty(exports, "LocalMicrophoneTrackEvents", {
37
+ enumerable: true,
38
+ get: function get() {
39
+ return _mediaHelpers.LocalMicrophoneTrackEvents;
40
+ }
41
+ });
42
+ _Object$defineProperty(exports, "LocalTrack", {
43
+ enumerable: true,
44
+ get: function get() {
45
+ return _mediaHelpers.LocalTrack;
46
+ }
47
+ });
48
+ _Object$defineProperty(exports, "LocalTrackEvents", {
49
+ enumerable: true,
50
+ get: function get() {
51
+ return _mediaHelpers.LocalTrackEvents;
52
+ }
53
+ });
54
+ exports.REACTIONS = void 0;
12
55
  _Object$defineProperty(exports, "RemoteMedia", {
13
56
  enumerable: true,
14
57
  get: function get() {
@@ -21,10 +64,29 @@ _Object$defineProperty(exports, "TriggerProxy", {
21
64
  return _triggerProxy.default;
22
65
  }
23
66
  });
67
+ _Object$defineProperty(exports, "createCameraTrack", {
68
+ enumerable: true,
69
+ get: function get() {
70
+ return _mediaHelpers.createCameraTrack;
71
+ }
72
+ });
73
+ _Object$defineProperty(exports, "createDisplayTrack", {
74
+ enumerable: true,
75
+ get: function get() {
76
+ return _mediaHelpers.createDisplayTrack;
77
+ }
78
+ });
79
+ _Object$defineProperty(exports, "createMicrophoneTrack", {
80
+ enumerable: true,
81
+ get: function get() {
82
+ return _mediaHelpers.createMicrophoneTrack;
83
+ }
84
+ });
24
85
  exports.default = void 0;
25
86
  var _webexCore = require("@webex/webex-core");
26
87
  var _meetings = _interopRequireDefault(require("./meetings"));
27
88
  var _config = _interopRequireDefault(require("./config"));
89
+ var _mediaHelpers = require("@webex/media-helpers");
28
90
  var _CONSTANTS = _interopRequireWildcard(require("./constants"));
29
91
  exports.CONSTANTS = _CONSTANTS;
30
92
  var _REACTIONS = _interopRequireWildcard(require("./reactions/reactions"));
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"names":["registerPlugin","Meetings","config"],"sources":["index.js"],"sourcesContent":["/* eslint-env browser */\nimport {registerPlugin} from '@webex/webex-core';\n\nimport Meetings from './meetings';\nimport config from './config';\n\nregisterPlugin('meetings', Meetings, {\n config,\n});\n\nexport default Meetings;\n\nexport * as CONSTANTS from './constants';\nexport * as REACTIONS from './reactions/reactions';\n\nexport {RemoteMedia} from './multistream/remoteMedia';\n\nexport {default as TriggerProxy} from './common/events/trigger-proxy';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AACA;AAEA;AACA;AAA8B;AAAA;AAAA;AAAA;AAW9B;AAEA;AAAsE;AAAA;AAjBtE;;AAMA,IAAAA,yBAAc,EAAC,UAAU,EAAEC,iBAAQ,EAAE;EACnCC,MAAM,EAANA;AACF,CAAC,CAAC;AAAC,eAEYD,iBAAQ;AAAA"}
1
+ {"version":3,"names":["registerPlugin","Meetings","config"],"sources":["index.ts"],"sourcesContent":["/* eslint-env browser */\nimport {registerPlugin} from '@webex/webex-core';\n\nimport Meetings from './meetings';\nimport config from './config';\n\nregisterPlugin('meetings', Meetings, {\n config,\n});\n\nexport {\n LocalTrack,\n LocalDisplayTrack,\n LocalTrackEvents,\n type TrackMuteEvent,\n type ServerMuteReason,\n LocalMicrophoneTrackEvents,\n LocalCameraTrackEvents,\n LocalMicrophoneTrack,\n LocalCameraTrack,\n createMicrophoneTrack,\n createCameraTrack,\n createDisplayTrack,\n} from '@webex/media-helpers';\n\nexport default Meetings;\n\nexport * as CONSTANTS from './constants';\nexport * as REACTIONS from './reactions/reactions';\n\nexport {RemoteMedia} from './multistream/remoteMedia';\n\nexport {default as TriggerProxy} from './common/events/trigger-proxy';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA;AAEA;AACA;AAMA;AAa8B;AAAA;AAAA;AAAA;AAO9B;AAEA;AAAsE;AAAA;AAhCtE;;AAMA,IAAAA,yBAAc,EAAC,UAAU,EAAEC,iBAAQ,EAAE;EACnCC,MAAM,EAANA;AACF,CAAC,CAAC;AAAC,eAiBYD,iBAAQ;AAAA"}
@@ -1 +1 @@
1
- {"version":3,"names":["BrowserDetection","isBrowser","Media","generateLocalMedias","mediaId","audioMuted","videoMuted","localSdp","getLocalMedia","options","config","sendAudio","sendVideo","sendShare","sharePreferences","isSharing","getMedia","getDisplayMedia","resolve","undefined","createMediaConnection","isMultistream","debugId","mediaProperties","remoteQualityLevel","enableRtx","enableExtmap","turnServerInfo","bundlePolicy","iceServers","push","urls","url","username","credential","password","enableMainAudio","mediaDirection","receiveAudio","enableMainVideo","receiveVideo","MultistreamRoapMediaConnection","Error","audioTrack","videoTrack","shareTrack","RoapMediaConnection","skipInactiveTransceivers","requireH264","sdpMunging","convertPort9to0","addContentSlides","bandwidthLimits","audio","StaticConfig","meetings","bandwidth","video","startBitrate","periodicKeyframes","disableExtmap","disableRtx","send","underlyingTrack","screenShareVideo","receive","receiveShare","customResolution","screenResolution","customShareFrameRate","screenFrameRate","hasSharePreferences","hasCustomConstraints","shareConstraints","hasHighFrameRate","highFrameRate","Config","resolution","videoShareFrameRate","aspectRatio","cursor","MEDIA_TRACK_CONSTRAINT","CURSOR","AWLAYS","frameRate","height","idealHeight","width","idealWidth","mediaConfig","navigator","mediaDevices","then","stream","getVideoTracks","length","applyConstraints","getDisplayMediaParams","defaultWidth","ideal","max","maxWidth","defaultHeight","maxHeight","deviceId","facingMode","fake","process","env","NODE_ENV","getUserMedia","catch","err","logPath","LoggerProxy","logger","error","constraint","getSupportedDevice","enumerateDevices","devices","supported","filter","device","kind","AUDIO_INPUT","VIDEO_INPUT","getDevices","reject","MediaError","toggleStream","stopTracks","track","stop","e","readyState","mediaSetting","audioVideo","localStream","shareStream"],"sources":["index.ts"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n/* globals navigator */\n\nimport {\n LocalCameraTrack,\n LocalDisplayTrack,\n LocalMicrophoneTrack,\n RoapMediaConnection,\n MultistreamRoapMediaConnection,\n} from '@webex/internal-media-core';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {AUDIO_INPUT, VIDEO_INPUT, MEDIA_TRACK_CONSTRAINT} from '../constants';\nimport Config from '../config';\nimport StaticConfig from '../common/config';\nimport MediaError from '../common/errors/media';\nimport BrowserDetection from '../common/browser-detection';\n\nconst {isBrowser} = BrowserDetection();\n\ntype MultistreamConnectionConfig = ConstructorParameters<typeof MultistreamRoapMediaConnection>[0];\n\nexport type BundlePolicy = ConstructorParameters<\n typeof MultistreamRoapMediaConnection\n>[0]['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 * format the media array for send\n * @param {String} mediaId\n * @param {Boolean} audioMuted\n * @param {Boolean} videoMuted\n * @returns {Array} medias\n */\nMedia.generateLocalMedias = (mediaId: string, audioMuted: boolean, videoMuted: boolean) => {\n if (mediaId) {\n return [\n {\n localSdp: JSON.stringify({\n audioMuted,\n videoMuted,\n }),\n mediaId,\n },\n ];\n }\n\n return [];\n};\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\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 {Object} options\n * @param {Object} [options.mediaProperties] contains mediaDirection and local tracks:\n * audioTrack, videoTrack and shareTrack\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 options: {\n mediaProperties: {\n mediaDirection?: {\n receiveAudio: boolean;\n receiveVideo: boolean;\n receiveShare: boolean;\n sendAudio: boolean;\n sendVideo: boolean;\n sendShare: boolean;\n };\n audioTrack?: LocalMicrophoneTrack;\n videoTrack?: LocalCameraTrack;\n shareTrack?: LocalDisplayTrack;\n };\n remoteQualityLevel?: 'LOW' | 'MEDIUM' | 'HIGH';\n enableRtx?: boolean;\n enableExtmap?: boolean;\n turnServerInfo?: {\n url: string;\n username: string;\n password: string;\n };\n bundlePolicy?: BundlePolicy;\n }\n) => {\n const {\n mediaProperties,\n remoteQualityLevel,\n enableRtx,\n enableExtmap,\n turnServerInfo,\n bundlePolicy,\n } = options;\n\n const iceServers = [];\n\n if (turnServerInfo) {\n iceServers.push({\n urls: turnServerInfo.url,\n username: turnServerInfo.username || '',\n credential: turnServerInfo.password || '',\n });\n }\n\n if (isMultistream) {\n const config: MultistreamConnectionConfig = {\n iceServers,\n enableMainAudio:\n mediaProperties.mediaDirection?.sendAudio || mediaProperties.mediaDirection?.receiveAudio,\n enableMainVideo:\n mediaProperties.mediaDirection?.sendVideo || mediaProperties.mediaDirection?.receiveVideo,\n };\n\n if (bundlePolicy) {\n config.bundlePolicy = bundlePolicy;\n }\n\n return new MultistreamRoapMediaConnection(config, debugId);\n }\n\n if (!mediaProperties) {\n throw new Error('mediaProperties have to be provided for non-multistream media connections');\n }\n\n const {mediaDirection, audioTrack, videoTrack, shareTrack} = mediaProperties;\n\n return new RoapMediaConnection(\n {\n iceServers,\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 send: {\n audio: audioTrack?.underlyingTrack,\n video: videoTrack?.underlyingTrack,\n screenShareVideo: shareTrack?.underlyingTrack,\n },\n receive: {\n audio: mediaDirection.receiveAudio,\n video: mediaDirection.receiveVideo,\n screenShareVideo: mediaDirection.receiveShare,\n remoteQualityLevel,\n },\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 * Checks if the machine has at least one audio or video device (Dont use this for screen share)\n * @param {object} [options]\n * {\n * sendAudio: true/false,\n * sendVideo: true/false\n * }\n * @returns {Object} {\n * sendAudio: true/false,\n * sendVideo: true/false\n *}\n */\nMedia.getSupportedDevice = ({sendAudio, sendVideo}: {sendAudio: boolean; sendVideo: boolean}) =>\n Promise.resolve().then(() => {\n if (!navigator.mediaDevices || navigator.mediaDevices.enumerateDevices === undefined) {\n return {\n sendAudio: false,\n sendVideo: false,\n };\n }\n\n return navigator.mediaDevices.enumerateDevices().then((devices) => {\n const supported = {\n audio: devices.filter((device) => device.kind === AUDIO_INPUT).length > 0,\n video: devices.filter((device) => device.kind === VIDEO_INPUT).length > 0,\n };\n\n return {\n sendAudio: supported.audio && sendAudio,\n sendVideo: supported.video && sendVideo,\n };\n });\n });\n\n/**\n * proxy to browser navigator.mediaDevices.enumerateDevices()\n * @returns {Promise}\n */\nMedia.getDevices = () => {\n if (navigator && navigator.mediaDevices && navigator.mediaDevices.enumerateDevices) {\n return navigator.mediaDevices.enumerateDevices();\n }\n\n return Promise.reject(new MediaError('enumerateDevices not supported.'));\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 {MediaTrack} track A media stream\n * @returns {null}\n */\nMedia.stopTracks = (track: any) => {\n if (!track) {\n return Promise.resolve();\n }\n\n return Promise.resolve().then(() => {\n if (track && track.stop) {\n try {\n track.stop();\n } catch (e) {\n LoggerProxy.logger.error(\n `Media:index#stopTracks --> Unable to stop the track with state ${track.readyState}, error: ${e}`\n );\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":["BrowserDetection","isBrowser","Media","generateLocalMedias","mediaId","audioMuted","videoMuted","localSdp","getLocalMedia","options","config","sendAudio","sendVideo","sendShare","sharePreferences","isSharing","getMedia","getDisplayMedia","resolve","undefined","createMediaConnection","isMultistream","debugId","mediaProperties","remoteQualityLevel","enableRtx","enableExtmap","turnServerInfo","bundlePolicy","iceServers","push","urls","url","username","credential","password","enableMainAudio","mediaDirection","receiveAudio","enableMainVideo","receiveVideo","MultistreamRoapMediaConnection","Error","audioTrack","videoTrack","shareTrack","RoapMediaConnection","skipInactiveTransceivers","requireH264","sdpMunging","convertPort9to0","addContentSlides","bandwidthLimits","audio","StaticConfig","meetings","bandwidth","video","startBitrate","periodicKeyframes","disableExtmap","disableRtx","send","underlyingTrack","screenShareVideo","receive","receiveShare","customResolution","screenResolution","customShareFrameRate","screenFrameRate","hasSharePreferences","hasCustomConstraints","shareConstraints","hasHighFrameRate","highFrameRate","Config","resolution","videoShareFrameRate","aspectRatio","cursor","MEDIA_TRACK_CONSTRAINT","CURSOR","AWLAYS","frameRate","height","idealHeight","width","idealWidth","mediaConfig","navigator","mediaDevices","then","stream","getVideoTracks","length","applyConstraints","getDisplayMediaParams","defaultWidth","ideal","max","maxWidth","defaultHeight","maxHeight","deviceId","facingMode","fake","process","env","NODE_ENV","getUserMedia","catch","err","logPath","LoggerProxy","logger","error","constraint","getSupportedDevice","enumerateDevices","devices","supported","filter","device","kind","AUDIO_INPUT","VIDEO_INPUT","getDevices","reject","MediaError","toggleStream","stopTracks","track","stop","e","readyState","mediaSetting","audioVideo","localStream","shareStream"],"sources":["index.ts"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n/* globals navigator */\n\nimport {RoapMediaConnection, MultistreamRoapMediaConnection} from '@webex/internal-media-core';\nimport {LocalCameraTrack, LocalDisplayTrack, LocalMicrophoneTrack} from '@webex/media-helpers';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {AUDIO_INPUT, VIDEO_INPUT, MEDIA_TRACK_CONSTRAINT} from '../constants';\nimport Config from '../config';\nimport StaticConfig from '../common/config';\nimport MediaError from '../common/errors/media';\nimport BrowserDetection from '../common/browser-detection';\n\nconst {isBrowser} = BrowserDetection();\n\ntype MultistreamConnectionConfig = ConstructorParameters<typeof MultistreamRoapMediaConnection>[0];\n\nexport type BundlePolicy = ConstructorParameters<\n typeof MultistreamRoapMediaConnection\n>[0]['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 * format the media array for send\n * @param {String} mediaId\n * @param {Boolean} audioMuted\n * @param {Boolean} videoMuted\n * @returns {Array} medias\n */\nMedia.generateLocalMedias = (mediaId: string, audioMuted: boolean, videoMuted: boolean) => {\n if (mediaId) {\n return [\n {\n localSdp: JSON.stringify({\n audioMuted,\n videoMuted,\n }),\n mediaId,\n },\n ];\n }\n\n return [];\n};\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\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 {Object} options\n * @param {Object} [options.mediaProperties] contains mediaDirection and local tracks:\n * audioTrack, videoTrack and shareTrack\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 options: {\n mediaProperties: {\n mediaDirection?: {\n receiveAudio: boolean;\n receiveVideo: boolean;\n receiveShare: boolean;\n sendAudio: boolean;\n sendVideo: boolean;\n sendShare: boolean;\n };\n audioTrack?: LocalMicrophoneTrack;\n videoTrack?: LocalCameraTrack;\n shareTrack?: LocalDisplayTrack;\n };\n remoteQualityLevel?: 'LOW' | 'MEDIUM' | 'HIGH';\n enableRtx?: boolean;\n enableExtmap?: boolean;\n turnServerInfo?: {\n url: string;\n username: string;\n password: string;\n };\n bundlePolicy?: BundlePolicy;\n }\n) => {\n const {\n mediaProperties,\n remoteQualityLevel,\n enableRtx,\n enableExtmap,\n turnServerInfo,\n bundlePolicy,\n } = options;\n\n const iceServers = [];\n\n if (turnServerInfo) {\n iceServers.push({\n urls: turnServerInfo.url,\n username: turnServerInfo.username || '',\n credential: turnServerInfo.password || '',\n });\n }\n\n if (isMultistream) {\n const config: MultistreamConnectionConfig = {\n iceServers,\n enableMainAudio:\n mediaProperties.mediaDirection?.sendAudio || mediaProperties.mediaDirection?.receiveAudio,\n enableMainVideo:\n mediaProperties.mediaDirection?.sendVideo || mediaProperties.mediaDirection?.receiveVideo,\n };\n\n if (bundlePolicy) {\n config.bundlePolicy = bundlePolicy;\n }\n\n return new MultistreamRoapMediaConnection(config, debugId);\n }\n\n if (!mediaProperties) {\n throw new Error('mediaProperties have to be provided for non-multistream media connections');\n }\n\n const {mediaDirection, audioTrack, videoTrack, shareTrack} = mediaProperties;\n\n return new RoapMediaConnection(\n {\n iceServers,\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 send: {\n audio: audioTrack?.underlyingTrack,\n video: videoTrack?.underlyingTrack,\n screenShareVideo: shareTrack?.underlyingTrack,\n },\n receive: {\n audio: mediaDirection.receiveAudio,\n video: mediaDirection.receiveVideo,\n screenShareVideo: mediaDirection.receiveShare,\n remoteQualityLevel,\n },\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 * Checks if the machine has at least one audio or video device (Dont use this for screen share)\n * @param {object} [options]\n * {\n * sendAudio: true/false,\n * sendVideo: true/false\n * }\n * @returns {Object} {\n * sendAudio: true/false,\n * sendVideo: true/false\n *}\n */\nMedia.getSupportedDevice = ({sendAudio, sendVideo}: {sendAudio: boolean; sendVideo: boolean}) =>\n Promise.resolve().then(() => {\n if (!navigator.mediaDevices || navigator.mediaDevices.enumerateDevices === undefined) {\n return {\n sendAudio: false,\n sendVideo: false,\n };\n }\n\n return navigator.mediaDevices.enumerateDevices().then((devices) => {\n const supported = {\n audio: devices.filter((device) => device.kind === AUDIO_INPUT).length > 0,\n video: devices.filter((device) => device.kind === VIDEO_INPUT).length > 0,\n };\n\n return {\n sendAudio: supported.audio && sendAudio,\n sendVideo: supported.video && sendVideo,\n };\n });\n });\n\n/**\n * proxy to browser navigator.mediaDevices.enumerateDevices()\n * @returns {Promise}\n */\nMedia.getDevices = () => {\n if (navigator && navigator.mediaDevices && navigator.mediaDevices.enumerateDevices) {\n return navigator.mediaDevices.enumerateDevices();\n }\n\n return Promise.reject(new MediaError('enumerateDevices not supported.'));\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 {MediaTrack} track A media stream\n * @returns {null}\n */\nMedia.stopTracks = (track: any) => {\n if (!track) {\n return Promise.resolve();\n }\n\n return Promise.resolve().then(() => {\n if (track && track.stop) {\n try {\n track.stop();\n } catch (e) {\n LoggerProxy.logger.error(\n `Media:index#stopTracks --> Unable to stop the track with state ${track.readyState}, error: ${e}`\n );\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 +1 @@
1
- {"version":3,"names":["MediaProperties","options","MEETINGS","webrtcMediaConnection","mediaDirection","videoTrack","audioTrack","shareTrack","remoteShare","remoteAudioTrack","remoteVideoTrack","localQualityLevel","QUALITY_LEVELS","remoteQualityLevel","HIGH","mediaSettings","videoDeviceId","type","values","mediaPeerConnection","deviceId","LoggerProxy","logger","warn","unsetRemoteMedia","unsetLocalVideoTrack","unsetLocalShareTrack","unsetRemoteStream","unsetRemoteShare","isConnected","getConnectionState","ConnectionState","Connected","resolve","reject","timer","connectionStateListener","log","clearTimeout","off","Event","CONNECTION_STATE_CHANGED","setTimeout","PC_BAIL_TIMEOUT","on","waitForMediaConnectionConnected","allStatsReports","getStats","statsResult","forEach","report","push","successfulCandidatePairs","filter","state","toLowerCase","foundConnectionType","some","pair","localCandidate","find","id","localCandidateId","undefined","connectionType","relayProtocol","toUpperCase","protocol"],"sources":["properties.ts"],"sourcesContent":["import {\n ConnectionState,\n Event,\n LocalCameraTrack,\n LocalMicrophoneTrack,\n LocalDisplayTrack,\n} from '@webex/internal-media-core';\n\nimport {MEETINGS, PC_BAIL_TIMEOUT, QUALITY_LEVELS} from '../constants';\nimport LoggerProxy from '../common/logs/logger-proxy';\n\n/**\n * @class MediaProperties\n */\nexport default class MediaProperties {\n audioTrack: LocalMicrophoneTrack | null;\n localQualityLevel: any;\n mediaDirection: any;\n mediaSettings: any;\n webrtcMediaConnection: any;\n remoteAudioTrack: any;\n remoteQualityLevel: any;\n remoteShare: any;\n remoteVideoTrack: any;\n shareTrack: LocalDisplayTrack | null;\n videoDeviceId: any;\n videoTrack: LocalCameraTrack | null;\n namespace = MEETINGS;\n\n /**\n * @param {Object} [options] -- to auto construct\n * @returns {MediaProperties}\n */\n constructor(options: any = {}) {\n this.webrtcMediaConnection = null;\n this.mediaDirection = options.mediaDirection;\n this.videoTrack = options.videoTrack || null;\n this.audioTrack = options.audioTrack || null;\n this.shareTrack = options.shareTrack || null;\n this.remoteShare = options.remoteShare;\n this.remoteAudioTrack = options.remoteAudioTrack;\n this.remoteVideoTrack = options.remoteVideoTrack;\n this.localQualityLevel = options.localQualityLevel || QUALITY_LEVELS['720p'];\n this.remoteQualityLevel = options.remoteQualityLevel || QUALITY_LEVELS.HIGH;\n this.mediaSettings = {};\n this.videoDeviceId = null;\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 setLocalVideoTrack(videoTrack: LocalCameraTrack | null) {\n this.videoTrack = videoTrack;\n }\n\n setLocalAudioTrack(audioTrack: LocalMicrophoneTrack | null) {\n this.audioTrack = audioTrack;\n }\n\n setLocalQualityLevel(localQualityLevel) {\n this.localQualityLevel = localQualityLevel;\n }\n\n setLocalShareTrack(shareTrack: LocalDisplayTrack | null) {\n this.shareTrack = shareTrack;\n }\n\n setRemoteQualityLevel(remoteQualityLevel) {\n this.remoteQualityLevel = remoteQualityLevel;\n }\n\n setRemoteShare(remoteShare) {\n this.remoteShare = remoteShare;\n }\n\n /**\n * Sets the remote audio track\n * @param {MediaTrack} remoteAudioTrack MediaTrack to save\n * @returns {void}\n */\n setRemoteAudioTrack(remoteAudioTrack: any) {\n this.remoteAudioTrack = remoteAudioTrack;\n }\n\n /**\n * Sets the remote video track\n * @param {MediaTrack} remoteVideoTrack MediaTrack to save\n * @returns {void}\n */\n setRemoteVideoTrack(remoteVideoTrack: any) {\n this.remoteVideoTrack = remoteVideoTrack;\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 unsetPeerConnection() {\n this.webrtcMediaConnection = null;\n }\n\n unsetLocalVideoTrack() {\n this.videoTrack = null;\n }\n\n unsetLocalShareTrack() {\n this.shareTrack = null;\n }\n\n unsetLocalAudioTrack() {\n this.audioTrack = null;\n }\n\n /**\n * Removes remote stream from class instance\n * @deprecated after v1.89.3\n * @returns {void}\n */\n unsetRemoteStream() {\n LoggerProxy.logger.warn(\n 'Media:properties#unsetRemoteStream --> [DEPRECATION WARNING]: unsetRemoteStream has been deprecated after v1.89.3 (use unsetRemoteTracks instead)'\n );\n // unsets audio and video only\n this.unsetRemoteMedia();\n }\n\n /**\n * Removes both remote audio and video from class instance\n * @returns {void}\n */\n unsetRemoteMedia() {\n this.remoteAudioTrack = null;\n this.remoteVideoTrack = null;\n }\n\n unsetRemoteShare() {\n this.remoteShare = null;\n }\n\n unsetLocalVideoTracks() {\n this.unsetLocalVideoTrack();\n this.unsetLocalShareTrack();\n }\n\n /**\n * Removes remote stream and remote share from class instance\n * @deprecated after v1.89.3\n * @returns {void}\n */\n unsetRemoteStreams() {\n LoggerProxy.logger.warn(\n 'Media:properties#unsetRemoteStreams --> [DEPRECATION WARNING]: unsetRemoteStreams has been deprecated after v1.89.3 (use unsetRemoteTracks instead)'\n );\n this.unsetRemoteStream();\n this.unsetRemoteShare();\n }\n\n /**\n * Unsets all remote tracks\n * @returns {void}\n */\n unsetRemoteTracks() {\n this.unsetRemoteMedia();\n this.unsetRemoteShare();\n }\n\n unsetShareStreams() {\n this.unsetLocalShareTrack();\n this.unsetRemoteShare();\n }\n\n /**\n * Removes both local and remote video stream from class instance\n * @deprecated after v1.89.3\n * @returns {void}\n */\n unsetMediaStreams() {\n LoggerProxy.logger.warn(\n 'Media:properties#unsetMediaStreams --> [DEPRECATION WARNING]: unsetMediaStreams has been deprecated after v1.89.3 (use unsetMediaTracks instead)'\n );\n this.unsetLocalVideoTrack();\n this.unsetRemoteStream();\n }\n\n /**\n * Removes both local and remote video stream from class instance\n * @returns {void}\n */\n unsetMediaTracks() {\n this.unsetLocalVideoTrack();\n this.unsetRemoteMedia();\n }\n\n /**\n * Waits for the webrtc media connection to be connected.\n *\n * @returns {Promise<void>}\n */\n waitForMediaConnectionConnected(): Promise<void> {\n const isConnected = () =>\n this.webrtcMediaConnection.getConnectionState() === ConnectionState.Connected;\n\n if (isConnected()) {\n return Promise.resolve();\n }\n\n return new Promise<void>((resolve, reject) => {\n let timer;\n\n const connectionStateListener = () => {\n LoggerProxy.logger.log(\n `Media:properties#waitForMediaConnectionConnected --> connection state: ${this.webrtcMediaConnection.getConnectionState()}`\n );\n\n if (isConnected()) {\n clearTimeout(timer);\n this.webrtcMediaConnection.off(Event.CONNECTION_STATE_CHANGED, connectionStateListener);\n resolve();\n }\n };\n\n timer = setTimeout(() => {\n this.webrtcMediaConnection.off(Event.CONNECTION_STATE_CHANGED, connectionStateListener);\n reject();\n }, PC_BAIL_TIMEOUT);\n\n this.webrtcMediaConnection.on(Event.CONNECTION_STATE_CHANGED, connectionStateListener);\n });\n }\n\n /**\n * Returns the type of a connection that has been established\n *\n * @returns {Promise<'UDP' | 'TCP' | 'TURN-TLS' | 'TURN-TCP' | 'TURN-UDP' | 'unknown'>}\n */\n async getCurrentConnectionType() {\n // we can only get the connection type after ICE connection has been established\n await this.waitForMediaConnectionConnected();\n\n const allStatsReports = [];\n\n try {\n const statsResult = await this.webrtcMediaConnection.getStats();\n statsResult.forEach((report) => allStatsReports.push(report));\n } catch (error) {\n LoggerProxy.logger.warn(\n `Media:properties#getCurrentConnectionType --> getStats() failed: ${error}`\n );\n }\n\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#getCurrentConnectionType --> 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\n return false;\n });\n\n return foundConnectionType;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["MediaProperties","options","MEETINGS","webrtcMediaConnection","mediaDirection","videoTrack","audioTrack","shareTrack","remoteShare","remoteAudioTrack","remoteVideoTrack","localQualityLevel","QUALITY_LEVELS","remoteQualityLevel","HIGH","mediaSettings","videoDeviceId","type","values","mediaPeerConnection","deviceId","LoggerProxy","logger","warn","unsetRemoteMedia","unsetLocalVideoTrack","unsetLocalShareTrack","unsetRemoteStream","unsetRemoteShare","isConnected","getConnectionState","ConnectionState","Connected","resolve","reject","timer","connectionStateListener","log","clearTimeout","off","Event","CONNECTION_STATE_CHANGED","setTimeout","PC_BAIL_TIMEOUT","on","waitForMediaConnectionConnected","allStatsReports","getStats","statsResult","forEach","report","push","successfulCandidatePairs","filter","state","toLowerCase","foundConnectionType","some","pair","localCandidate","find","id","localCandidateId","undefined","connectionType","relayProtocol","toUpperCase","protocol"],"sources":["properties.ts"],"sourcesContent":["import {ConnectionState, Event} from '@webex/internal-media-core';\n\nimport {LocalCameraTrack, LocalMicrophoneTrack, LocalDisplayTrack} from '@webex/media-helpers';\n\nimport {MEETINGS, PC_BAIL_TIMEOUT, QUALITY_LEVELS} from '../constants';\nimport LoggerProxy from '../common/logs/logger-proxy';\n\n/**\n * @class MediaProperties\n */\nexport default class MediaProperties {\n audioTrack: LocalMicrophoneTrack | null;\n localQualityLevel: any;\n mediaDirection: any;\n mediaSettings: any;\n webrtcMediaConnection: any;\n remoteAudioTrack: any;\n remoteQualityLevel: any;\n remoteShare: any;\n remoteVideoTrack: any;\n shareTrack: LocalDisplayTrack | null;\n videoDeviceId: any;\n videoTrack: LocalCameraTrack | null;\n namespace = MEETINGS;\n\n /**\n * @param {Object} [options] -- to auto construct\n * @returns {MediaProperties}\n */\n constructor(options: any = {}) {\n this.webrtcMediaConnection = null;\n this.mediaDirection = options.mediaDirection;\n this.videoTrack = options.videoTrack || null;\n this.audioTrack = options.audioTrack || null;\n this.shareTrack = options.shareTrack || null;\n this.remoteShare = options.remoteShare;\n this.remoteAudioTrack = options.remoteAudioTrack;\n this.remoteVideoTrack = options.remoteVideoTrack;\n this.localQualityLevel = options.localQualityLevel || QUALITY_LEVELS['720p'];\n this.remoteQualityLevel = options.remoteQualityLevel || QUALITY_LEVELS.HIGH;\n this.mediaSettings = {};\n this.videoDeviceId = null;\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 setLocalVideoTrack(videoTrack: LocalCameraTrack | null) {\n this.videoTrack = videoTrack;\n }\n\n setLocalAudioTrack(audioTrack: LocalMicrophoneTrack | null) {\n this.audioTrack = audioTrack;\n }\n\n setLocalQualityLevel(localQualityLevel) {\n this.localQualityLevel = localQualityLevel;\n }\n\n setLocalShareTrack(shareTrack: LocalDisplayTrack | null) {\n this.shareTrack = shareTrack;\n }\n\n setRemoteQualityLevel(remoteQualityLevel) {\n this.remoteQualityLevel = remoteQualityLevel;\n }\n\n setRemoteShare(remoteShare) {\n this.remoteShare = remoteShare;\n }\n\n /**\n * Sets the remote audio track\n * @param {MediaTrack} remoteAudioTrack MediaTrack to save\n * @returns {void}\n */\n setRemoteAudioTrack(remoteAudioTrack: any) {\n this.remoteAudioTrack = remoteAudioTrack;\n }\n\n /**\n * Sets the remote video track\n * @param {MediaTrack} remoteVideoTrack MediaTrack to save\n * @returns {void}\n */\n setRemoteVideoTrack(remoteVideoTrack: any) {\n this.remoteVideoTrack = remoteVideoTrack;\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 unsetPeerConnection() {\n this.webrtcMediaConnection = null;\n }\n\n unsetLocalVideoTrack() {\n this.videoTrack = null;\n }\n\n unsetLocalShareTrack() {\n this.shareTrack = null;\n }\n\n unsetLocalAudioTrack() {\n this.audioTrack = null;\n }\n\n /**\n * Removes remote stream from class instance\n * @deprecated after v1.89.3\n * @returns {void}\n */\n unsetRemoteStream() {\n LoggerProxy.logger.warn(\n 'Media:properties#unsetRemoteStream --> [DEPRECATION WARNING]: unsetRemoteStream has been deprecated after v1.89.3 (use unsetRemoteTracks instead)'\n );\n // unsets audio and video only\n this.unsetRemoteMedia();\n }\n\n /**\n * Removes both remote audio and video from class instance\n * @returns {void}\n */\n unsetRemoteMedia() {\n this.remoteAudioTrack = null;\n this.remoteVideoTrack = null;\n }\n\n unsetRemoteShare() {\n this.remoteShare = null;\n }\n\n unsetLocalVideoTracks() {\n this.unsetLocalVideoTrack();\n this.unsetLocalShareTrack();\n }\n\n /**\n * Removes remote stream and remote share from class instance\n * @deprecated after v1.89.3\n * @returns {void}\n */\n unsetRemoteStreams() {\n LoggerProxy.logger.warn(\n 'Media:properties#unsetRemoteStreams --> [DEPRECATION WARNING]: unsetRemoteStreams has been deprecated after v1.89.3 (use unsetRemoteTracks instead)'\n );\n this.unsetRemoteStream();\n this.unsetRemoteShare();\n }\n\n /**\n * Unsets all remote tracks\n * @returns {void}\n */\n unsetRemoteTracks() {\n this.unsetRemoteMedia();\n this.unsetRemoteShare();\n }\n\n unsetShareStreams() {\n this.unsetLocalShareTrack();\n this.unsetRemoteShare();\n }\n\n /**\n * Removes both local and remote video stream from class instance\n * @deprecated after v1.89.3\n * @returns {void}\n */\n unsetMediaStreams() {\n LoggerProxy.logger.warn(\n 'Media:properties#unsetMediaStreams --> [DEPRECATION WARNING]: unsetMediaStreams has been deprecated after v1.89.3 (use unsetMediaTracks instead)'\n );\n this.unsetLocalVideoTrack();\n this.unsetRemoteStream();\n }\n\n /**\n * Removes both local and remote video stream from class instance\n * @returns {void}\n */\n unsetMediaTracks() {\n this.unsetLocalVideoTrack();\n this.unsetRemoteMedia();\n }\n\n /**\n * Waits for the webrtc media connection to be connected.\n *\n * @returns {Promise<void>}\n */\n waitForMediaConnectionConnected(): Promise<void> {\n const isConnected = () =>\n this.webrtcMediaConnection.getConnectionState() === ConnectionState.Connected;\n\n if (isConnected()) {\n return Promise.resolve();\n }\n\n return new Promise<void>((resolve, reject) => {\n let timer;\n\n const connectionStateListener = () => {\n LoggerProxy.logger.log(\n `Media:properties#waitForMediaConnectionConnected --> connection state: ${this.webrtcMediaConnection.getConnectionState()}`\n );\n\n if (isConnected()) {\n clearTimeout(timer);\n this.webrtcMediaConnection.off(Event.CONNECTION_STATE_CHANGED, connectionStateListener);\n resolve();\n }\n };\n\n timer = setTimeout(() => {\n this.webrtcMediaConnection.off(Event.CONNECTION_STATE_CHANGED, connectionStateListener);\n reject();\n }, PC_BAIL_TIMEOUT);\n\n this.webrtcMediaConnection.on(Event.CONNECTION_STATE_CHANGED, connectionStateListener);\n });\n }\n\n /**\n * Returns the type of a connection that has been established\n *\n * @returns {Promise<'UDP' | 'TCP' | 'TURN-TLS' | 'TURN-TCP' | 'TURN-UDP' | 'unknown'>}\n */\n async getCurrentConnectionType() {\n // we can only get the connection type after ICE connection has been established\n await this.waitForMediaConnectionConnected();\n\n const allStatsReports = [];\n\n try {\n const statsResult = await this.webrtcMediaConnection.getStats();\n statsResult.forEach((report) => allStatsReports.push(report));\n } catch (error) {\n LoggerProxy.logger.warn(\n `Media:properties#getCurrentConnectionType --> getStats() failed: ${error}`\n );\n }\n\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#getCurrentConnectionType --> 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\n return false;\n });\n\n return foundConnectionType;\n }\n}\n"],"mappings":"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"}