@webex/plugin-meetings 3.0.0-beta.1 → 3.0.0-beta.3

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 (111) hide show
  1. package/dist/common/errors/webex-errors.js +5 -29
  2. package/dist/common/errors/webex-errors.js.map +1 -1
  3. package/dist/constants.js +15 -74
  4. package/dist/constants.js.map +1 -1
  5. package/dist/media/index.js +68 -213
  6. package/dist/media/index.js.map +1 -1
  7. package/dist/media/internal-media-core-wrapper.js +22 -0
  8. package/dist/media/internal-media-core-wrapper.js.map +1 -0
  9. package/dist/media/properties.js +20 -25
  10. package/dist/media/properties.js.map +1 -1
  11. package/dist/media/util.js +0 -27
  12. package/dist/media/util.js.map +1 -1
  13. package/dist/meeting/index.js +694 -432
  14. package/dist/meeting/index.js.map +1 -1
  15. package/dist/meeting/request.js +1 -0
  16. package/dist/meeting/request.js.map +1 -1
  17. package/dist/meeting/util.js +3 -44
  18. package/dist/meeting/util.js.map +1 -1
  19. package/dist/meetings/index.js +64 -5
  20. package/dist/meetings/index.js.map +1 -1
  21. package/dist/meetings/util.js +24 -1
  22. package/dist/meetings/util.js.map +1 -1
  23. package/dist/members/index.js +68 -0
  24. package/dist/members/index.js.map +1 -1
  25. package/dist/multistream/mediaRequestManager.js +133 -0
  26. package/dist/multistream/mediaRequestManager.js.map +1 -0
  27. package/dist/multistream/multistreamMedia.js +116 -0
  28. package/dist/multistream/multistreamMedia.js.map +1 -0
  29. package/dist/multistream/receiveSlot.js +209 -0
  30. package/dist/multistream/receiveSlot.js.map +1 -0
  31. package/dist/multistream/receiveSlotManager.js +195 -0
  32. package/dist/multistream/receiveSlotManager.js.map +1 -0
  33. package/dist/multistream/remoteMedia.js +284 -0
  34. package/dist/multistream/remoteMedia.js.map +1 -0
  35. package/dist/multistream/remoteMediaGroup.js +243 -0
  36. package/dist/multistream/remoteMediaGroup.js.map +1 -0
  37. package/dist/multistream/remoteMediaManager.js +1113 -0
  38. package/dist/multistream/remoteMediaManager.js.map +1 -0
  39. package/dist/reconnection-manager/index.js +109 -130
  40. package/dist/reconnection-manager/index.js.map +1 -1
  41. package/dist/roap/index.js +57 -240
  42. package/dist/roap/index.js.map +1 -1
  43. package/dist/roap/request.js +2 -114
  44. package/dist/roap/request.js.map +1 -1
  45. package/dist/roap/turnDiscovery.js +11 -5
  46. package/dist/roap/turnDiscovery.js.map +1 -1
  47. package/dist/statsAnalyzer/global.js +2 -0
  48. package/dist/statsAnalyzer/global.js.map +1 -1
  49. package/dist/statsAnalyzer/index.js +39 -36
  50. package/dist/statsAnalyzer/index.js.map +1 -1
  51. package/package.json +20 -19
  52. package/src/common/errors/webex-errors.js +0 -18
  53. package/src/constants.ts +139 -180
  54. package/src/media/index.js +60 -194
  55. package/src/media/internal-media-core-wrapper.ts +9 -0
  56. package/src/media/properties.js +19 -25
  57. package/src/media/util.js +0 -22
  58. package/src/meeting/index.js +565 -320
  59. package/src/meeting/request.js +1 -0
  60. package/src/meeting/util.js +3 -46
  61. package/src/meetings/index.js +30 -1
  62. package/src/meetings/util.js +23 -2
  63. package/src/members/index.js +48 -0
  64. package/src/multistream/mediaRequestManager.ts +166 -0
  65. package/src/multistream/multistreamMedia.ts +92 -0
  66. package/src/multistream/receiveSlot.ts +141 -0
  67. package/src/multistream/receiveSlotManager.ts +142 -0
  68. package/src/multistream/remoteMedia.ts +219 -0
  69. package/src/multistream/remoteMediaGroup.ts +224 -0
  70. package/src/multistream/remoteMediaManager.ts +911 -0
  71. package/src/reconnection-manager/index.js +40 -53
  72. package/src/roap/index.js +47 -207
  73. package/src/roap/request.js +1 -72
  74. package/src/roap/turnDiscovery.ts +12 -6
  75. package/src/statsAnalyzer/global.js +2 -0
  76. package/src/statsAnalyzer/index.js +32 -46
  77. package/test/integration/spec/journey.js +1 -1
  78. package/test/unit/spec/media/index.ts +223 -0
  79. package/test/unit/spec/media/properties.ts +73 -82
  80. package/test/unit/spec/meeting/effectsState.js +1 -3
  81. package/test/unit/spec/meeting/index.js +420 -228
  82. package/test/unit/spec/meeting/muteState.js +7 -0
  83. package/test/unit/spec/meeting/utils.js +61 -2
  84. package/test/unit/spec/meetings/index.js +0 -4
  85. package/test/unit/spec/members/index.js +164 -2
  86. package/test/unit/spec/multistream/mediaRequestManager.ts +515 -0
  87. package/test/unit/spec/multistream/receiveSlot.ts +104 -0
  88. package/test/unit/spec/multistream/receiveSlotManager.ts +173 -0
  89. package/test/unit/spec/multistream/remoteMedia.ts +217 -0
  90. package/test/unit/spec/multistream/remoteMediaGroup.ts +396 -0
  91. package/test/unit/spec/multistream/remoteMediaManager.ts +1251 -0
  92. package/test/unit/spec/roap/index.ts +63 -35
  93. package/test/unit/spec/stats-analyzer/index.js +19 -22
  94. package/dist/peer-connection-manager/index.js +0 -794
  95. package/dist/peer-connection-manager/index.js.map +0 -1
  96. package/dist/roap/collection.js +0 -73
  97. package/dist/roap/collection.js.map +0 -1
  98. package/dist/roap/handler.js +0 -337
  99. package/dist/roap/handler.js.map +0 -1
  100. package/dist/roap/state.js +0 -164
  101. package/dist/roap/state.js.map +0 -1
  102. package/dist/roap/util.js +0 -102
  103. package/dist/roap/util.js.map +0 -1
  104. package/src/peer-connection-manager/index.js +0 -723
  105. package/src/roap/collection.js +0 -63
  106. package/src/roap/handler.js +0 -252
  107. package/src/roap/state.js +0 -149
  108. package/src/roap/util.js +0 -93
  109. package/test/unit/spec/peerconnection-manager/index.js +0 -188
  110. package/test/unit/spec/peerconnection-manager/utils.js +0 -48
  111. package/test/unit/spec/roap/util.js +0 -30
@@ -22,24 +22,24 @@ exports.default = void 0;
22
22
 
23
23
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
24
24
 
25
- var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
26
-
27
25
  var _stringify = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/json/stringify"));
28
26
 
27
+ var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
28
+
29
29
  var _loggerProxy = _interopRequireDefault(require("../common/logs/logger-proxy"));
30
30
 
31
31
  var _constants = require("../constants");
32
32
 
33
33
  var _config = _interopRequireDefault(require("../config"));
34
34
 
35
- var _peerConnectionManager = _interopRequireDefault(require("../peer-connection-manager"));
36
-
37
- var _reconnection = _interopRequireDefault(require("../common/errors/reconnection"));
35
+ var _config2 = _interopRequireDefault(require("../common/config"));
38
36
 
39
37
  var _media = _interopRequireDefault(require("../common/errors/media"));
40
38
 
41
39
  var _browserDetection = _interopRequireDefault(require("../common/browser-detection"));
42
40
 
41
+ var _internalMediaCoreWrapper = require("./internal-media-core-wrapper");
42
+
43
43
  function ownKeys(object, enumerableOnly) { var keys = _Object$keys(object); if (_Object$getOwnPropertySymbols) { var symbols = _Object$getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return _Object$getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
44
44
 
45
45
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } return target; }
@@ -93,32 +93,6 @@ Media.setLocalTrack = function (enabled, track) {
93
93
 
94
94
  return false;
95
95
  };
96
- /**
97
- * @param {RTCPeerConnection} peerConnection
98
- * @param {Object} meetingProperties
99
- * @param {string} meetingProperties.meetingId
100
- * @param {string} meetingProperties.remoteQualityLevel LOW|MEDIUM|HIGH
101
- * @returns {Promise}
102
- */
103
-
104
-
105
- Media.reconnectMedia = function (peerConnection, _ref) {
106
- var meetingId = _ref.meetingId,
107
- remoteQualityLevel = _ref.remoteQualityLevel,
108
- enableRtx = _ref.enableRtx,
109
- enableExtmap = _ref.enableExtmap;
110
-
111
- if (peerConnection.connectionState === _constants.PEER_CONNECTION_STATE.CLOSED || peerConnection.connectionState === _constants.PEER_CONNECTION_STATE.FAILED) {
112
- return _promise.default.reject(new _reconnection.default('Reinitiate peerconnection'));
113
- }
114
-
115
- return _peerConnectionManager.default.createOffer(peerConnection, {
116
- meetingId: meetingId,
117
- remoteQualityLevel: remoteQualityLevel,
118
- enableRtx: enableRtx,
119
- enableExtmap: enableExtmap
120
- });
121
- };
122
96
  /**
123
97
  * format the media array for send
124
98
  * @param {String} mediaId
@@ -171,195 +145,76 @@ Media.getLocalMedia = function (options, config) {
171
145
  return _promise.default.resolve(undefined);
172
146
  };
173
147
  /**
174
- * Returns the direction and tracks
175
- * @param {string} trackType type of track (audio/video)
176
- * @param {object} track tracks passed
177
- * @param {boolean} receiveTracks do you want to receive tracks from the remote side
178
- * @returns {Object} returns direction tracks to be added in transceiver
179
- */
180
-
181
-
182
- Media.checkTracks = function (trackType, track, receiveTracks) {
183
- var getDirection = function getDirection(sendTracks, receiveTracks) {
184
- if (sendTracks && receiveTracks) {
185
- return 'sendrecv';
186
- }
187
-
188
- if (sendTracks && !receiveTracks) {
189
- return 'sendonly';
190
- }
191
-
192
- if (!sendTracks && receiveTracks) {
193
- return 'recvonly';
194
- }
195
-
196
- return 'inactive';
197
- };
198
-
199
- if (track) {
200
- return {
201
- track: track,
202
- direction: getDirection(!!track, receiveTracks)
203
- };
204
- }
205
-
206
- return {
207
- track: trackType,
208
- direction: getDirection(!!track, receiveTracks)
209
- };
210
- };
211
- /**
212
- * creates peerconnection and attaches streams
213
- * @param {MediaDirection} mediaProperties
214
- * @param {Object} meetingProperties
215
- * @param {string} meetingProperties.meetingId
216
- * @param {string} meetingProperties.remoteQualityLevel LOW|MEDIUM|HIGH
217
- * @returns {Array} [peerConnection, ]
218
- */
219
-
220
-
221
- Media.attachMedia = function (mediaProperties, _ref2) {
222
- var meetingId = _ref2.meetingId,
223
- remoteQualityLevel = _ref2.remoteQualityLevel,
224
- enableRtx = _ref2.enableRtx,
225
- enableExtmap = _ref2.enableExtmap;
226
- var mediaDirection = mediaProperties.mediaDirection,
227
- audioTrack = mediaProperties.audioTrack,
228
- videoTrack = mediaProperties.videoTrack,
229
- shareTrack = mediaProperties.shareTrack,
230
- peerConnection = mediaProperties.peerConnection;
231
- var result = null; // Add Transceiver for audio
232
-
233
- result = Media.checkTracks('audio', mediaDirection.sendAudio && audioTrack, mediaDirection.receiveAudio);
234
- peerConnection.audioTransceiver = peerConnection.addTransceiver(result.track, {
235
- direction: result.direction
236
- }); // Add Transceiver for video
237
-
238
- result = Media.checkTracks('video', mediaDirection.sendVideo && videoTrack, mediaDirection.receiveVideo);
239
- peerConnection.videoTransceiver = peerConnection.addTransceiver(result.track, {
240
- direction: result.direction
241
- }); // Add Transceiver for share
242
-
243
- result = Media.checkTracks('video', mediaDirection.sendShare && shareTrack, mediaDirection.receiveShare);
244
- peerConnection.shareTransceiver = peerConnection.addTransceiver(result.track, {
245
- direction: result.direction
246
- });
247
-
248
- peerConnection.onnegotiationneeded = function (event) {
249
- _loggerProxy.default.logger.info("Media:index#attachMedia --> onnegotiationneeded#PeerConnection: ".concat(event));
250
- };
251
-
252
- return _peerConnectionManager.default.createOffer(peerConnection, {
253
- meetingId: meetingId,
254
- remoteQualityLevel: remoteQualityLevel,
255
- enableRtx: enableRtx,
256
- enableExtmap: enableExtmap
257
- });
258
- };
259
- /**
260
- * updates all the media streams and creates a new media offer
261
- * @param {MediaDirection} mediaProperties
262
- * @param {Object} meetingProperties
263
- * @param {string} meetingProperties.meetingId
264
- * @param {string} meetingProperties.remoteQualityLevel LOW|MEDIUM|HIGH
265
- * @returns {Promise}
148
+ * creates a webrtc media connection with provided tracks and mediaDirection configuration
149
+ * @param {Object} mediaProperties only applicable to non-multistream connections, contains mediaDirection and local tracks:
150
+ * audioTrack, videoTrack and shareTrack
151
+ * @param {Object} options
152
+ * @param {boolean} options.isMultistream
153
+ * @param {string} [options.remoteQualityLevel] LOW|MEDIUM|HIGH applicable only to non-multistream connections
154
+ * @param {boolean} [options.enableRtx] applicable only to non-multistream connections
155
+ * @param {boolean} [options.enableExtmap] applicable only to non-multistream connections
156
+ * @param {Object} [options.turnServerInfo]
157
+ * @returns {RoapMediaConnection}
266
158
  */
267
159
 
268
160
 
269
- Media.updateMedia = function (mediaProperties, _ref3) {
270
- var meetingId = _ref3.meetingId,
271
- remoteQualityLevel = _ref3.remoteQualityLevel,
272
- enableRtx = _ref3.enableRtx,
273
- enableExtmap = _ref3.enableExtmap;
161
+ Media.createMediaConnection = function (mediaProperties, _ref) {
162
+ var isMultistream = _ref.isMultistream,
163
+ remoteQualityLevel = _ref.remoteQualityLevel,
164
+ enableRtx = _ref.enableRtx,
165
+ enableExtmap = _ref.enableExtmap,
166
+ turnServerInfo = _ref.turnServerInfo;
274
167
  var mediaDirection = mediaProperties.mediaDirection,
275
168
  audioTrack = mediaProperties.audioTrack,
276
169
  videoTrack = mediaProperties.videoTrack,
277
- shareTrack = mediaProperties.shareTrack,
278
- peerConnection = mediaProperties.peerConnection; // update audio transceiver
279
-
280
- Media.setTrackOnTransceiver(peerConnection.audioTransceiver, {
281
- type: 'audio',
282
- track: audioTrack,
283
- sendTrack: mediaDirection.sendAudio && audioTrack,
284
- receiveTrack: mediaDirection.receiveAudio
285
- }); // update video transceiver
286
-
287
- Media.setTrackOnTransceiver(peerConnection.videoTransceiver, {
288
- type: 'video',
289
- track: videoTrack,
290
- sendTrack: mediaDirection.sendVideo && videoTrack,
291
- receiveTrack: mediaDirection.receiveVideo
292
- }); // update content transceiver
293
-
294
- Media.setTrackOnTransceiver(peerConnection.shareTransceiver, {
295
- type: 'video',
296
- track: shareTrack,
297
- sendTrack: mediaDirection.sendShare && shareTrack,
298
- receiveTrack: mediaDirection.receiveShare
299
- });
300
-
301
- peerConnection.onnegotiationneeded = function (event) {
302
- _loggerProxy.default.logger.info("Media:index#updateMedia --> onnegotiationneeded#PeerConnection: ".concat(event));
303
- };
304
-
305
- return _peerConnectionManager.default.createOffer(peerConnection, {
306
- meetingId: meetingId,
307
- remoteQualityLevel: remoteQualityLevel,
308
- enableRtx: enableRtx,
309
- enableExtmap: enableExtmap
310
- });
311
- };
312
- /**
313
- * @param {RTCRtpTransceiver} transceiver
314
- * @param {Object} options
315
- * @param {MediaStreamTrack} options.track
316
- * @returns {undefined}
317
- */
318
-
319
-
320
- Media.setTrackOnTransceiver = function (transceiver, options) {
321
- var type = options.type,
322
- track = options.track,
323
- sendTrack = options.sendTrack,
324
- receiveTrack = options.receiveTrack;
325
-
326
- try {
327
- var result = Media.checkTracks(type, sendTrack && track, receiveTrack);
328
- transceiver.direction = result.direction;
329
-
330
- if (options.track) {
331
- transceiver.sender.replaceTrack(track);
332
- }
333
- } catch (e) {
334
- _loggerProxy.default.logger.error("Media:index#setTrackOnTransceiver --> ".concat(e));
170
+ shareTrack = mediaProperties.shareTrack;
171
+ var iceServers = [];
172
+
173
+ if (turnServerInfo) {
174
+ iceServers.push({
175
+ urls: turnServerInfo.url,
176
+ username: turnServerInfo.username || '',
177
+ credential: turnServerInfo.password || ''
178
+ });
179
+ }
335
180
 
336
- throw e;
181
+ if (isMultistream) {
182
+ return new _internalMediaCoreWrapper.MultistreamRoapMediaConnection({
183
+ iceServers: iceServers
184
+ }, 'mc');
337
185
  }
338
- };
339
- /**
340
- * creates a new offer
341
- * @param {Object} meetingProperties
342
- * @param {string} meetingProperties.meetingId
343
- * @param {string} meetingProperties.remoteQualityLevel LOW|MEDIUM|HIGH
344
- * @param {RTCPeerConnection} peerConnection
345
- * @param {RTCRtpTransceiver} transceiver
346
- * @param {Object} options see #Media.setTrackOnTransceiver
347
- * @returns {Promise}
348
- */
349
186
 
187
+ return new _internalMediaCoreWrapper.RoapMediaConnection({
188
+ iceServers: iceServers,
189
+ skipInactiveTransceivers: false,
190
+ requireH264: true,
191
+ sdpMunging: {
192
+ convertPort9to0: false,
193
+ addContentSlides: true,
194
+ bandwidthLimits: {
195
+ audio: _config2.default.meetings.bandwidth.audio,
196
+ video: _config2.default.meetings.bandwidth.video
197
+ },
198
+ startBitrate: _config2.default.meetings.bandwidth.startBitrate,
199
+ periodicKeyframes: 20,
200
+ // it's always been hardcoded in SDK so for now keeping it that way
201
+ disableExtmap: !enableExtmap,
202
+ disableRtx: !enableRtx // see https://bugs.chromium.org/p/chromium/issues/detail?id=1020642 why we might want to remove RTX from SDP
350
203
 
351
- Media.updateTransceiver = function (_ref4, peerConnection, transceiver, options) {
352
- var meetingId = _ref4.meetingId,
353
- remoteQualityLevel = _ref4.remoteQualityLevel,
354
- enableRtx = _ref4.enableRtx,
355
- enableExtmap = _ref4.enableExtmap;
356
- Media.setTrackOnTransceiver(transceiver, options);
357
- return _peerConnectionManager.default.createOffer(peerConnection, {
358
- meetingId: meetingId,
359
- remoteQualityLevel: remoteQualityLevel,
360
- enableRtx: enableRtx,
361
- enableExtmap: enableExtmap
362
- });
204
+ }
205
+ }, {
206
+ send: {
207
+ audio: audioTrack,
208
+ video: videoTrack,
209
+ screenShareVideo: shareTrack
210
+ },
211
+ receive: {
212
+ audio: mediaDirection.receiveAudio,
213
+ video: mediaDirection.receiveVideo,
214
+ screenShareVideo: mediaDirection.receiveShare,
215
+ remoteQualityLevel: remoteQualityLevel
216
+ }
217
+ }, 'mc');
363
218
  };
364
219
  /**
365
220
  * generates share streams
@@ -505,9 +360,9 @@ Media.getMedia = function (audio, video, config) {
505
360
  */
506
361
 
507
362
 
508
- Media.getSupportedDevice = function (_ref5) {
509
- var sendAudio = _ref5.sendAudio,
510
- sendVideo = _ref5.sendVideo;
363
+ Media.getSupportedDevice = function (_ref2) {
364
+ var sendAudio = _ref2.sendAudio,
365
+ sendVideo = _ref2.sendVideo;
511
366
  return _promise.default.resolve().then(function () {
512
367
  if (!navigator.mediaDevices || navigator.mediaDevices.enumerateDevices === undefined) {
513
368
  return {
@@ -1 +1 @@
1
- {"version":3,"names":["BrowserDetection","isBrowser","Media","setLocalTrack","enabled","track","reconnectMedia","peerConnection","meetingId","remoteQualityLevel","enableRtx","enableExtmap","connectionState","PEER_CONNECTION_STATE","CLOSED","FAILED","reject","ReconnectionError","PeerConnectionManager","createOffer","generateLocalMedias","mediaId","audioMuted","videoMuted","localSdp","getLocalMedia","options","config","sendAudio","sendVideo","sendShare","sharePreferences","isSharing","getMedia","getDisplayMedia","resolve","undefined","checkTracks","trackType","receiveTracks","getDirection","sendTracks","direction","attachMedia","mediaProperties","mediaDirection","audioTrack","videoTrack","shareTrack","result","receiveAudio","audioTransceiver","addTransceiver","receiveVideo","videoTransceiver","receiveShare","shareTransceiver","onnegotiationneeded","event","LoggerProxy","logger","info","updateMedia","setTrackOnTransceiver","type","sendTrack","receiveTrack","transceiver","sender","replaceTrack","e","error","updateTransceiver","customResolution","screenResolution","customShareFrameRate","screenFrameRate","hasSharePreferences","hasCustomConstraints","shareConstraints","hasHighFrameRate","highFrameRate","Config","meetings","resolution","videoShareFrameRate","aspectRatio","cursor","MEDIA_TRACK_CONSTRAINT","CURSOR","AWLAYS","frameRate","height","idealHeight","width","idealWidth","mediaConfig","audio","video","navigator","mediaDevices","then","stream","getVideoTracks","length","applyConstraints","getDisplayMediaParams","defaultWidth","ideal","max","maxWidth","defaultHeight","maxHeight","deviceId","fake","process","env","NODE_ENV","getUserMedia","catch","err","logPath","constraint","getSupportedDevice","enumerateDevices","devices","supported","filter","device","kind","AUDIO_INPUT","VIDEO_INPUT","getDevices","MediaError","toggleStream","stopTracks","stop","readyState","stopStream","warn","getTracks","forEach","mediaSetting","audioVideo","localStream","shareStream"],"sources":["index.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n/* globals navigator */\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {\n AUDIO_INPUT,\n VIDEO_INPUT,\n PEER_CONNECTION_STATE,\n MEDIA_TRACK_CONSTRAINT\n} from '../constants';\nimport Config from '../config';\nimport PeerConnectionManager from '../peer-connection-manager';\nimport ReconnectionError from '../common/errors/reconnection';\nimport MediaError from '../common/errors/media';\nimport BrowserDetection from '../common/browser-detection';\n\nconst {isBrowser} = BrowserDetection();\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 = {};\n\n/**\n * @param {boolean} enabled\n * @param {MediaStreamTrack} track\n * @returns {Boolean}\n * @public\n */\nMedia.setLocalTrack = (enabled, track) => {\n if (track) {\n track.enabled = enabled;\n\n return true;\n }\n\n return false;\n};\n\n/**\n * @param {RTCPeerConnection} peerConnection\n * @param {Object} meetingProperties\n * @param {string} meetingProperties.meetingId\n * @param {string} meetingProperties.remoteQualityLevel LOW|MEDIUM|HIGH\n * @returns {Promise}\n */\nMedia.reconnectMedia = (peerConnection, {\n meetingId,\n remoteQualityLevel,\n enableRtx,\n enableExtmap\n}) => {\n if (peerConnection.connectionState === PEER_CONNECTION_STATE.CLOSED ||\n peerConnection.connectionState === PEER_CONNECTION_STATE.FAILED) {\n return Promise.reject(new ReconnectionError('Reinitiate peerconnection'));\n }\n\n return PeerConnectionManager.createOffer(peerConnection, {\n meetingId,\n remoteQualityLevel,\n enableRtx,\n enableExtmap\n });\n};\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, audioMuted, videoMuted) => {\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, config) => {\n const {\n sendAudio, sendVideo, sendShare, sharePreferences, isSharing\n } = 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 * Returns the direction and tracks\n * @param {string} trackType type of track (audio/video)\n * @param {object} track tracks passed\n * @param {boolean} receiveTracks do you want to receive tracks from the remote side\n * @returns {Object} returns direction tracks to be added in transceiver\n */\nMedia.checkTracks = (trackType, track, receiveTracks) => {\n const getDirection = (sendTracks, receiveTracks) => {\n if (sendTracks && receiveTracks) {\n return 'sendrecv';\n } if (sendTracks && !receiveTracks) {\n return 'sendonly';\n } if (!sendTracks && receiveTracks) {\n return 'recvonly';\n }\n\n return 'inactive';\n };\n\n if (track) {\n return {track, direction: getDirection(!!track, receiveTracks)};\n }\n\n return {track: trackType, direction: getDirection(!!track, receiveTracks)};\n};\n/**\n * creates peerconnection and attaches streams\n * @param {MediaDirection} mediaProperties\n * @param {Object} meetingProperties\n * @param {string} meetingProperties.meetingId\n * @param {string} meetingProperties.remoteQualityLevel LOW|MEDIUM|HIGH\n * @returns {Array} [peerConnection, ]\n */\nMedia.attachMedia = (mediaProperties, {\n meetingId,\n remoteQualityLevel,\n enableRtx,\n enableExtmap\n}) => {\n const {\n mediaDirection,\n audioTrack,\n videoTrack,\n shareTrack,\n peerConnection\n } = mediaProperties;\n\n let result = null;\n\n // Add Transceiver for audio\n result = Media.checkTracks('audio', mediaDirection.sendAudio && audioTrack, mediaDirection.receiveAudio);\n peerConnection.audioTransceiver = peerConnection.addTransceiver(result.track, {direction: result.direction});\n\n // Add Transceiver for video\n result = Media.checkTracks('video', mediaDirection.sendVideo && videoTrack, mediaDirection.receiveVideo);\n peerConnection.videoTransceiver = peerConnection.addTransceiver(result.track, {direction: result.direction});\n\n // Add Transceiver for share\n result = Media.checkTracks('video', mediaDirection.sendShare && shareTrack, mediaDirection.receiveShare);\n peerConnection.shareTransceiver = peerConnection.addTransceiver(result.track, {direction: result.direction});\n\n peerConnection.onnegotiationneeded = (event) => {\n LoggerProxy.logger.info(`Media:index#attachMedia --> onnegotiationneeded#PeerConnection: ${event}`);\n };\n\n return PeerConnectionManager.createOffer(peerConnection, {\n meetingId,\n remoteQualityLevel,\n enableRtx,\n enableExtmap\n });\n};\n\n/**\n * updates all the media streams and creates a new media offer\n * @param {MediaDirection} mediaProperties\n * @param {Object} meetingProperties\n * @param {string} meetingProperties.meetingId\n * @param {string} meetingProperties.remoteQualityLevel LOW|MEDIUM|HIGH\n * @returns {Promise}\n */\nMedia.updateMedia = (mediaProperties, {\n meetingId,\n remoteQualityLevel,\n enableRtx,\n enableExtmap\n}) => {\n const {\n mediaDirection,\n audioTrack,\n videoTrack,\n shareTrack,\n peerConnection\n } = mediaProperties;\n\n // update audio transceiver\n Media.setTrackOnTransceiver(peerConnection.audioTransceiver, {\n type: 'audio',\n track: audioTrack,\n sendTrack: mediaDirection.sendAudio && audioTrack,\n receiveTrack: mediaDirection.receiveAudio\n });\n\n // update video transceiver\n Media.setTrackOnTransceiver(peerConnection.videoTransceiver, {\n type: 'video',\n track: videoTrack,\n sendTrack: mediaDirection.sendVideo && videoTrack,\n receiveTrack: mediaDirection.receiveVideo\n });\n\n // update content transceiver\n Media.setTrackOnTransceiver(peerConnection.shareTransceiver, {\n type: 'video',\n track: shareTrack,\n sendTrack: mediaDirection.sendShare && shareTrack,\n receiveTrack: mediaDirection.receiveShare\n });\n peerConnection.onnegotiationneeded = (event) => {\n LoggerProxy.logger.info(`Media:index#updateMedia --> onnegotiationneeded#PeerConnection: ${event}`);\n };\n\n return PeerConnectionManager.createOffer(peerConnection, {\n meetingId,\n remoteQualityLevel,\n enableRtx,\n enableExtmap\n });\n};\n\n/**\n * @param {RTCRtpTransceiver} transceiver\n * @param {Object} options\n * @param {MediaStreamTrack} options.track\n * @returns {undefined}\n */\nMedia.setTrackOnTransceiver = (transceiver, options) => {\n const {\n type, track, sendTrack, receiveTrack\n } = options;\n\n try {\n const result = Media.checkTracks(type, sendTrack && track, receiveTrack);\n\n transceiver.direction = result.direction;\n if (options.track) {\n transceiver.sender.replaceTrack(track);\n }\n }\n catch (e) {\n LoggerProxy.logger.error(`Media:index#setTrackOnTransceiver --> ${e}`);\n throw e;\n }\n};\n\n/**\n * creates a new offer\n * @param {Object} meetingProperties\n * @param {string} meetingProperties.meetingId\n * @param {string} meetingProperties.remoteQualityLevel LOW|MEDIUM|HIGH\n * @param {RTCPeerConnection} peerConnection\n * @param {RTCRtpTransceiver} transceiver\n * @param {Object} options see #Media.setTrackOnTransceiver\n * @returns {Promise}\n */\nMedia.updateTransceiver = ({\n meetingId,\n remoteQualityLevel,\n enableRtx,\n enableExtmap\n}, peerConnection, transceiver, options) => {\n Media.setTrackOnTransceiver(transceiver, options);\n\n return PeerConnectionManager.createOffer(peerConnection, {\n meetingId,\n remoteQualityLevel,\n enableRtx,\n enableExtmap\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 = (options, config = {}) => {\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 {\n screenResolution,\n resolution,\n videoShareFrameRate,\n screenFrameRate,\n aspectRatio\n } = Config.meetings;\n\n let shareConstraints = {\n cursor: MEDIA_TRACK_CONSTRAINT.CURSOR.AWLAYS,\n aspectRatio\n };\n\n if (hasCustomConstraints) {\n shareConstraints = hasSharePreferences.shareConstraints;\n }\n else if (hasHighFrameRate) {\n shareConstraints = {\n ...shareConstraints,\n frameRate: videoShareFrameRate,\n height: resolution.idealHeight,\n width: resolution.idealWidth,\n ...config.resolution\n };\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\n if (isBrowser('firefox')) {\n const mediaConfig = {\n audio: options.sendAudio,\n video: options.sendShare\n };\n\n\n return navigator.mediaDevices.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\n return stream;\n });\n }\n\n const getDisplayMediaParams = {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, video, config) => {\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 } :\n {\n deviceId: video.deviceId ? video.deviceId : undefined,\n width: video.width ? video.width : defaultWidth,\n height: video.height ? video.height : defaultHeight\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\n .getUserMedia(mediaConfig)\n .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}) =>\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) => {\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 }\n catch (e) {\n LoggerProxy.logger.error(`Media:index#stopTracks --> Unable to stop the track with state ${track.readyState}, error: ${e}`);\n }\n }\n });\n};\n\n/**\n *\n * Stop input stream\n * @param {Stream} stream A media stream\n * @returns {null}\n * @deprecated after v1.89.3\n */\nMedia.stopStream = (stream) => {\n LoggerProxy.logger.warn('Media:index#stopStream --> [DEPRECATION WARNING]: stopStream has been deprecated after v1.89.3');\n if (!stream) {\n return Promise.resolve();\n }\n\n /*\n * To release local media\n * 1) Chrome requires all tracks to be stopped (stream.stop got deprecated)\n * 2) Firefox requires the stream to be stopped\n */\n return Promise.resolve().then(() => {\n if (stream.getTracks) {\n stream.getTracks().forEach((track) => {\n track.stop();\n });\n }\n else if (stream.stop) {\n stream.stop();\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 = (mediaSetting, audioVideo, sharePreferences, config) => Media.getLocalMedia({\n sendAudio: mediaSetting.sendAudio ? audioVideo.audio || mediaSetting.sendAudio : false,\n sendVideo: mediaSetting.sendVideo ? audioVideo.video || mediaSetting.sendVideo : false\n}, config).then((localStream) => Media.getLocalMedia({\n sendShare: mediaSetting.sendShare,\n isSharing: mediaSetting.isSharing,\n sharePreferences\n}, config).then((shareStream) => [localStream, shareStream]));\n\nexport default Media;\n"],"mappings":"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"}
1
+ {"version":3,"names":["BrowserDetection","isBrowser","Media","setLocalTrack","enabled","track","generateLocalMedias","mediaId","audioMuted","videoMuted","localSdp","getLocalMedia","options","config","sendAudio","sendVideo","sendShare","sharePreferences","isSharing","getMedia","getDisplayMedia","resolve","undefined","createMediaConnection","mediaProperties","isMultistream","remoteQualityLevel","enableRtx","enableExtmap","turnServerInfo","mediaDirection","audioTrack","videoTrack","shareTrack","iceServers","push","urls","url","username","credential","password","MultistreamRoapMediaConnection","RoapMediaConnection","skipInactiveTransceivers","requireH264","sdpMunging","convertPort9to0","addContentSlides","bandwidthLimits","audio","StaticConfig","meetings","bandwidth","video","startBitrate","periodicKeyframes","disableExtmap","disableRtx","send","screenShareVideo","receive","receiveAudio","receiveVideo","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","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","stop","e","readyState","stopStream","warn","getTracks","forEach","mediaSetting","audioVideo","localStream","shareStream"],"sources":["index.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n/* globals navigator */\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {\n AUDIO_INPUT,\n VIDEO_INPUT,\n MEDIA_TRACK_CONSTRAINT,\n} from '../constants';\nimport Config from '../config';\nimport StaticConfig from '../common/config';\nimport MediaError from '../common/errors/media';\nimport BrowserDetection from '../common/browser-detection';\n\nimport {RoapMediaConnection, MultistreamRoapMediaConnection} from './internal-media-core-wrapper';\n\nconst {isBrowser} = BrowserDetection();\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 = {};\n\n/**\n * @param {boolean} enabled\n * @param {MediaStreamTrack} track\n * @returns {Boolean}\n * @public\n */\nMedia.setLocalTrack = (enabled, track) => {\n if (track) {\n track.enabled = enabled;\n\n return true;\n }\n\n return false;\n};\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, audioMuted, videoMuted) => {\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, config) => {\n const {\n sendAudio, sendVideo, sendShare, sharePreferences, isSharing\n } = 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 * @param {Object} mediaProperties only applicable to non-multistream connections, contains mediaDirection and local tracks:\n * audioTrack, videoTrack and shareTrack\n * @param {Object} options\n * @param {boolean} options.isMultistream\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 * @returns {RoapMediaConnection}\n */\nMedia.createMediaConnection = (mediaProperties, {\n isMultistream,\n remoteQualityLevel,\n enableRtx,\n enableExtmap,\n turnServerInfo\n}) => {\n const {\n mediaDirection,\n audioTrack,\n videoTrack,\n shareTrack\n } = mediaProperties;\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 return new MultistreamRoapMediaConnection({\n iceServers,\n }, 'mc');\n }\n\n return new RoapMediaConnection({\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 send: {\n audio: audioTrack,\n video: videoTrack,\n screenShareVideo: shareTrack\n },\n receive: {\n audio: mediaDirection.receiveAudio,\n video: mediaDirection.receiveVideo,\n screenShareVideo: mediaDirection.receiveShare,\n remoteQualityLevel\n }\n }, 'mc');\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 = (options, config = {}) => {\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 {\n screenResolution,\n resolution,\n videoShareFrameRate,\n screenFrameRate,\n aspectRatio\n } = Config.meetings;\n\n let shareConstraints = {\n cursor: MEDIA_TRACK_CONSTRAINT.CURSOR.AWLAYS,\n aspectRatio\n };\n\n if (hasCustomConstraints) {\n shareConstraints = hasSharePreferences.shareConstraints;\n }\n else if (hasHighFrameRate) {\n shareConstraints = {\n ...shareConstraints,\n frameRate: videoShareFrameRate,\n height: resolution.idealHeight,\n width: resolution.idealWidth,\n ...config.resolution\n };\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\n if (isBrowser('firefox')) {\n const mediaConfig = {\n audio: options.sendAudio,\n video: options.sendShare\n };\n\n\n return navigator.mediaDevices.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\n return stream;\n });\n }\n\n const getDisplayMediaParams = {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, video, config) => {\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 } :\n {\n deviceId: video.deviceId ? video.deviceId : undefined,\n width: video.width ? video.width : defaultWidth,\n height: video.height ? video.height : defaultHeight\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\n .getUserMedia(mediaConfig)\n .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}) =>\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) => {\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 }\n catch (e) {\n LoggerProxy.logger.error(`Media:index#stopTracks --> Unable to stop the track with state ${track.readyState}, error: ${e}`);\n }\n }\n });\n};\n\n/**\n *\n * Stop input stream\n * @param {Stream} stream A media stream\n * @returns {null}\n * @deprecated after v1.89.3\n */\nMedia.stopStream = (stream) => {\n LoggerProxy.logger.warn('Media:index#stopStream --> [DEPRECATION WARNING]: stopStream has been deprecated after v1.89.3');\n if (!stream) {\n return Promise.resolve();\n }\n\n /*\n * To release local media\n * 1) Chrome requires all tracks to be stopped (stream.stop got deprecated)\n * 2) Firefox requires the stream to be stopped\n */\n return Promise.resolve().then(() => {\n if (stream.getTracks) {\n stream.getTracks().forEach((track) => {\n track.stop();\n });\n }\n else if (stream.stop) {\n stream.stop();\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 = (mediaSetting, audioVideo, sharePreferences, config) => Media.getLocalMedia({\n sendAudio: mediaSetting.sendAudio ? audioVideo.audio || mediaSetting.sendAudio : false,\n sendVideo: mediaSetting.sendVideo ? audioVideo.video || mediaSetting.sendVideo : false\n}, config).then((localStream) => Media.getLocalMedia({\n sendShare: mediaSetting.sendShare,\n isSharing: mediaSetting.isSharing,\n sharePreferences\n}, config).then((shareStream) => [localStream, shareStream]));\n\nexport default Media;\n"],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+
3
+ var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
4
+
5
+ _Object$defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+
9
+ exports.RoapMediaConnection = exports.MultistreamRoapMediaConnection = void 0;
10
+
11
+ var _internalMediaCore = require("@webex/internal-media-core");
12
+
13
+ /* We have this wrapper just because otherwise it's impossible to mock
14
+ * RoapMediaConnection and MultistreamRoapMediaConnection constructors in unit tests,
15
+ * because they are exported by @webex/internal-media-core as non-writable, non-configurable
16
+ * properties of MediaConnection and sinon doesn't allow spying on them or stubbing them.
17
+ */
18
+ var RoapMediaConnection = _internalMediaCore.MediaConnection.RoapMediaConnection;
19
+ exports.RoapMediaConnection = RoapMediaConnection;
20
+ var MultistreamRoapMediaConnection = _internalMediaCore.MediaConnection.MultistreamRoapMediaConnection;
21
+ exports.MultistreamRoapMediaConnection = MultistreamRoapMediaConnection;
22
+ //# sourceMappingURL=internal-media-core-wrapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["RoapMediaConnection","MC","MultistreamRoapMediaConnection"],"sources":["internal-media-core-wrapper.ts"],"sourcesContent":["import {MediaConnection as MC} from '@webex/internal-media-core';\n\n/* We have this wrapper just because otherwise it's impossible to mock\n * RoapMediaConnection and MultistreamRoapMediaConnection constructors in unit tests,\n * because they are exported by @webex/internal-media-core as non-writable, non-configurable\n * properties of MediaConnection and sinon doesn't allow spying on them or stubbing them.\n */\nexport const RoapMediaConnection = MC.RoapMediaConnection;\nexport const MultistreamRoapMediaConnection = MC.MultistreamRoapMediaConnection;\n"],"mappings":";;;;;;;;;;AAAA;;AAEA;AACA;AACA;AACA;AACA;AACO,IAAMA,mBAAmB,GAAGC,kCAAA,CAAGD,mBAA/B;;AACA,IAAME,8BAA8B,GAAGD,kCAAA,CAAGC,8BAA1C"}
@@ -22,12 +22,12 @@ var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpe
22
22
 
23
23
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
24
24
 
25
+ var _internalMediaCore = require("@webex/internal-media-core");
26
+
25
27
  var _constants = require("../constants");
26
28
 
27
29
  var _loggerProxy = _interopRequireDefault(require("../common/logs/logger-proxy"));
28
30
 
29
- var _util = _interopRequireDefault(require("./util"));
30
-
31
31
  /**
32
32
  * @class MediaProperties
33
33
  */
@@ -40,7 +40,7 @@ var MediaProperties = /*#__PURE__*/function () {
40
40
  var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
41
41
  (0, _classCallCheck2.default)(this, MediaProperties);
42
42
  (0, _defineProperty2.default)(this, "namespace", _constants.MEETINGS);
43
- this.peerConnection = _util.default.createPeerConnection();
43
+ this.webrtcMediaConnection = null;
44
44
  this.mediaDirection = options.mediaDirection;
45
45
  this.videoTrack = options.videoTrack;
46
46
  this.audioTrack = options.audioTrack;
@@ -76,8 +76,8 @@ var MediaProperties = /*#__PURE__*/function () {
76
76
  }
77
77
  }, {
78
78
  key: "setMediaPeerConnection",
79
- value: function setMediaPeerConnection(peerConnection) {
80
- this.peerConnection = peerConnection;
79
+ value: function setMediaPeerConnection(mediaPeerConnection) {
80
+ this.webrtcMediaConnection = mediaPeerConnection;
81
81
  }
82
82
  }, {
83
83
  key: "setLocalVideoTrack",
@@ -145,12 +145,7 @@ var MediaProperties = /*#__PURE__*/function () {
145
145
  }, {
146
146
  key: "unsetPeerConnection",
147
147
  value: function unsetPeerConnection() {
148
- this.peerConnection = null;
149
- }
150
- }, {
151
- key: "reInitiatePeerconnection",
152
- value: function reInitiatePeerconnection(turnServerInfo) {
153
- this.peerConnection = _util.default.createPeerConnection(turnServerInfo);
148
+ this.webrtcMediaConnection = null;
154
149
  }
155
150
  }, {
156
151
  key: "unsetLocalVideoTrack",
@@ -260,46 +255,46 @@ var MediaProperties = /*#__PURE__*/function () {
260
255
  this.unsetRemoteMedia();
261
256
  }
262
257
  /**
263
- * Waits until ice connection is established
258
+ * Waits for the webrtc media connection to be connected.
264
259
  *
265
260
  * @returns {Promise<void>}
266
261
  */
267
262
 
268
263
  }, {
269
- key: "waitForIceConnectedState",
270
- value: function waitForIceConnectedState() {
264
+ key: "waitForMediaConnectionConnected",
265
+ value: function waitForMediaConnectionConnected() {
271
266
  var _this = this;
272
267
 
273
- var isIceConnected = function isIceConnected() {
274
- return _this.peerConnection.iceConnectionState === _constants.ICE_STATE.CONNECTED || _this.peerConnection.iceConnectionState === _constants.ICE_STATE.COMPLETED;
268
+ var isConnected = function isConnected() {
269
+ return _this.webrtcMediaConnection.getConnectionState() === _internalMediaCore.MediaConnection.ConnectionState.Connected;
275
270
  };
276
271
 
277
- if (isIceConnected()) {
272
+ if (isConnected()) {
278
273
  return _promise.default.resolve();
279
274
  }
280
275
 
281
276
  return new _promise.default(function (resolve, reject) {
282
277
  var timer;
283
278
 
284
- var iceListener = function iceListener() {
285
- _loggerProxy.default.logger.log("Media:properties#waitForIceConnectedState --> ice state: ".concat(_this.peerConnection.iceConnectionState, ", conn state: ").concat(_this.peerConnection.connectionState));
279
+ var connectionStateListener = function connectionStateListener() {
280
+ _loggerProxy.default.logger.log("Media:properties#waitForMediaConnectionConnected --> connection state: ".concat(_this.webrtcMediaConnection.getConnectionState()));
286
281
 
287
- if (isIceConnected()) {
282
+ if (isConnected()) {
288
283
  clearTimeout(timer);
289
284
 
290
- _this.peerConnection.removeEventListener('iceconnectionstatechange', iceListener);
285
+ _this.webrtcMediaConnection.off(_internalMediaCore.MediaConnection.Event.CONNECTION_STATE_CHANGED, connectionStateListener);
291
286
 
292
287
  resolve();
293
288
  }
294
289
  };
295
290
 
296
291
  timer = setTimeout(function () {
297
- _this.peerConnection.removeEventListener('iceconnectionstatechange', iceListener);
292
+ _this.webrtcMediaConnection.off(_internalMediaCore.MediaConnection.Event.CONNECTION_STATE_CHANGED, connectionStateListener);
298
293
 
299
294
  reject();
300
295
  }, _constants.PC_BAIL_TIMEOUT);
301
296
 
302
- _this.peerConnection.addEventListener('iceconnectionstatechange', iceListener);
297
+ _this.webrtcMediaConnection.on(_internalMediaCore.MediaConnection.Event.CONNECTION_STATE_CHANGED, connectionStateListener);
303
298
  });
304
299
  }
305
300
  /**
@@ -318,13 +313,13 @@ var MediaProperties = /*#__PURE__*/function () {
318
313
  switch (_context.prev = _context.next) {
319
314
  case 0:
320
315
  _context.next = 2;
321
- return this.waitForIceConnectedState();
316
+ return this.waitForMediaConnectionConnected();
322
317
 
323
318
  case 2:
324
319
  allStatsReports = [];
325
320
  _context.prev = 3;
326
321
  _context.next = 6;
327
- return this.peerConnection.getStats();
322
+ return this.webrtcMediaConnection.getStats();
328
323
 
329
324
  case 6:
330
325
  statsResult = _context.sent;