@webex/plugin-meetings 1.146.1 → 1.147.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/config.js CHANGED
@@ -96,6 +96,7 @@ var _default = {
96
96
  autoUploadLogs: true,
97
97
  enableRtx: true,
98
98
  receiveTranscription: false,
99
+ enableExtmap: false,
99
100
  experimental: {
100
101
  enableMediaNegotiatedEvent: false,
101
102
  enableUnifiedMeetings: false
@@ -1 +1 @@
1
- {"version":3,"sources":["config.js"],"names":["meetings","deviceType","WEB","mediaSettings","sendAudio","sendVideo","receiveAudio","receiveVideo","pstn","sendShare","receiveShare","reconnection","enabled","autoRejoin","detection","iceReconnectionTimeout","maxRejoinAttempts","stats","enableStatsAnalyzer","autoDowngradeEnabled","interval","analyzerInterval","historyMax","videoPacketLossRatioThreshold","rttThreshold","jitterThreshold","metrics","clientName","clientType","subClientType","mqaMetricsInterval","autoSendMQA","logging","enable","verboseEvents","resolution","maxWidth","maxHeight","idealWidth","idealHeight","screenResolution","bandwidth","audio","video","screenFrameRate","videoShareFrameRate","aspectRatio","autoUploadLogs","enableRtx","receiveTranscription","experimental","enableMediaNegotiatedEvent","enableUnifiedMeetings"],"mappings":";;;;;;;;;;AAAA;;eAIe;AACb;AACA;AACA;AACAA,EAAAA,QAAQ,EAAE;AACRC,IAAAA,UAAU,EAAEA,mBAAWC,GADf;AAERC,IAAAA,aAAa,EAAE;AACbC,MAAAA,SAAS,EAAE,IADE;AAEbC,MAAAA,SAAS,EAAE,IAFE;AAGbC,MAAAA,YAAY,EAAE,IAHD;AAIbC,MAAAA,YAAY,EAAE,IAJD;AAKbC,MAAAA,IAAI,EAAE,KALO;AAMbC,MAAAA,SAAS,EAAE,KANE;AAObC,MAAAA,YAAY,EAAE;AAPD,KAFP;AAWRC,IAAAA,YAAY,EAAE;AACZC,MAAAA,OAAO,EAAE,KADG;AAEZC,MAAAA,UAAU,EAAE,IAFA;AAGZC,MAAAA,SAAS,EAAE,IAHC;AAIZ;AACAC,MAAAA,sBAAsB,EAAE,KALZ;AAMZ;AACAC,MAAAA,iBAAiB,EAAE;AAPP,KAXN;AAoBRC,IAAAA,KAAK,EAAE;AACL;AACAC,MAAAA,mBAAmB,EAAE,IAFhB;AAGL;AACAC,MAAAA,oBAAoB,EAAE,KAJjB;AAKL;AACAC,MAAAA,QAAQ,EAAE,IANL;AAOL;AACAC,MAAAA,gBAAgB,EAAE,IARb;AASL;AACAC,MAAAA,UAAU,EAAE,GAVP;AAWL;AACAC,MAAAA,6BAA6B,EAAE,CAZ1B;AAY6B;AAClCC,MAAAA,YAAY,EAAE,GAbT;AAac;AACnBC,MAAAA,eAAe,EAAE,GAdZ,CAcgB;;AAdhB,KApBC;AAoCRC,IAAAA,OAAO,EAAE;AACP;AACA;AACAC,MAAAA,UAAU,EAAE,cAHL;AAIP;AACAC,MAAAA,UAAU,EAAE,WALL;AAMP;AACAC,MAAAA,aAAa,EAAE,SAPR;AAQP;AACAC,MAAAA,kBAAkB,EAAE,KATb;AAUP;AACA;AACAC,MAAAA,WAAW,EAAE;AAZN,KApCD;AAkDRC,IAAAA,OAAO,EAAE;AACPC,MAAAA,MAAM,EAAE,IADD;AAEPC,MAAAA,aAAa,EAAE;AAFR,KAlDD;AAsDRC,IAAAA,UAAU,EAAE;AACVC,MAAAA,QAAQ,EAAE,IADA;AAEVC,MAAAA,SAAS,EAAE,GAFD;AAGVC,MAAAA,UAAU,EAAE,IAHF;AAIVC,MAAAA,WAAW,EAAE;AAJH,KAtDJ;AA4DRC,IAAAA,gBAAgB,EAAE;AAChBJ,MAAAA,QAAQ,EAAE,IADM;AAEhBC,MAAAA,SAAS,EAAE,IAFK;AAGhBC,MAAAA,UAAU,EAAE,IAHI;AAIhBC,MAAAA,WAAW,EAAE;AAJG,KA5DV;AAkERE,IAAAA,SAAS,EAAE;AACT;AACA;AACAC,MAAAA,KAAK,EAAE,KAHE;AAITC,MAAAA,KAAK,EAAE;AAJE,KAlEH;AAwERC,IAAAA,eAAe,EAAE,EAxET;AAyERC,IAAAA,mBAAmB,EAAE,EAzEb;AA0ERC,IAAAA,WAAW,EAAE,kBA1EL;AA2ER;AACAC,IAAAA,cAAc,EAAE,IA5ER;AA6ERC,IAAAA,SAAS,EAAE,IA7EH;AA8ERC,IAAAA,oBAAoB,EAAE,KA9Ed;AA+ERC,IAAAA,YAAY,EAAE;AACZC,MAAAA,0BAA0B,EAAE,KADhB;AAEZC,MAAAA,qBAAqB,EAAE;AAFX;AA/EN;AAJG,C","sourcesContent":["import {\n deviceType\n} from '@webex/common';\n\nexport default {\n // TODO: this needs to be defaulted\n // to JS_SDK and clients set it to WEB or others\n // see https://jira-eng-gpk2.cisco.com/jira/browse/SPARK-73167\n meetings: {\n deviceType: deviceType.WEB,\n mediaSettings: {\n sendAudio: true,\n sendVideo: true,\n receiveAudio: true,\n receiveVideo: true,\n pstn: false,\n sendShare: false,\n receiveShare: false\n },\n reconnection: {\n enabled: false,\n autoRejoin: true,\n detection: true,\n // Timeout duration to wait for ICE to reconnect if a disconnect is received.\n iceReconnectionTimeout: 10000,\n // Amount of times attempting to rejoin a meeting during reconnect\n maxRejoinAttempts: 3\n },\n stats: {\n // Enable the webrtc stats analyzer that emits quality degradation events\n enableStatsAnalyzer: true,\n // Enable the auto downgrade video quality feature\n autoDowngradeEnabled: false,\n // 1 second intervals to collect stats data\n interval: 1000,\n // we just want to analyze data every 5 sec interval\n analyzerInterval: 5000,\n // hold the last 2 minute of a calls data\n historyMax: 120,\n // Once packet loss hits this ratio, the video will downgrade\n videoPacketLossRatioThreshold: 9, // comparison of packets lost / packets received\n rttThreshold: 500, // 500 ms noticeable quality lag begins based on bandwidth of user\n jitterThreshold: 500 // 500 ms noticeable quality lag begins based on bandwidth of user\n },\n metrics: {\n // change to your client name else data will be muddled\n // you do not need a specific format, and you do not need to register it\n clientName: 'WEBEX_JS_SDK',\n // TODO: for now this line has to be whitelisted, which is problematic for third party\n clientType: 'WEBEX_SDK',\n // Stores the sub client type used when sending metrics\n subClientType: 'WEB_APP',\n // send average values MQA in 60 second intervals\n mqaMetricsInterval: 60000,\n // send to cisco internal MQA data automatically\n // we already send CA\n autoSendMQA: true\n },\n logging: {\n enable: true,\n verboseEvents: true\n },\n resolution: {\n maxWidth: 1280,\n maxHeight: 720,\n idealWidth: 1280,\n idealHeight: 720\n },\n screenResolution: {\n maxWidth: 1920,\n maxHeight: 1080,\n idealWidth: 1920,\n idealHeight: 1080\n },\n bandwidth: {\n // please note, these are the maximum bandwidth values\n // the server supports, minimums have to be tested\n audio: 64000,\n video: 4000000\n },\n screenFrameRate: 10,\n videoShareFrameRate: 30,\n aspectRatio: 1.7695852534562213,\n // When enabled, as calls are ended, it will upload the SDK logs and correlate them\n autoUploadLogs: true,\n enableRtx: true,\n receiveTranscription: false,\n experimental: {\n enableMediaNegotiatedEvent: false,\n enableUnifiedMeetings: false\n }\n }\n};\n"]}
1
+ {"version":3,"sources":["config.js"],"names":["meetings","deviceType","WEB","mediaSettings","sendAudio","sendVideo","receiveAudio","receiveVideo","pstn","sendShare","receiveShare","reconnection","enabled","autoRejoin","detection","iceReconnectionTimeout","maxRejoinAttempts","stats","enableStatsAnalyzer","autoDowngradeEnabled","interval","analyzerInterval","historyMax","videoPacketLossRatioThreshold","rttThreshold","jitterThreshold","metrics","clientName","clientType","subClientType","mqaMetricsInterval","autoSendMQA","logging","enable","verboseEvents","resolution","maxWidth","maxHeight","idealWidth","idealHeight","screenResolution","bandwidth","audio","video","screenFrameRate","videoShareFrameRate","aspectRatio","autoUploadLogs","enableRtx","receiveTranscription","enableExtmap","experimental","enableMediaNegotiatedEvent","enableUnifiedMeetings"],"mappings":";;;;;;;;;;AAAA;;eAIe;AACb;AACA;AACA;AACAA,EAAAA,QAAQ,EAAE;AACRC,IAAAA,UAAU,EAAEA,mBAAWC,GADf;AAERC,IAAAA,aAAa,EAAE;AACbC,MAAAA,SAAS,EAAE,IADE;AAEbC,MAAAA,SAAS,EAAE,IAFE;AAGbC,MAAAA,YAAY,EAAE,IAHD;AAIbC,MAAAA,YAAY,EAAE,IAJD;AAKbC,MAAAA,IAAI,EAAE,KALO;AAMbC,MAAAA,SAAS,EAAE,KANE;AAObC,MAAAA,YAAY,EAAE;AAPD,KAFP;AAWRC,IAAAA,YAAY,EAAE;AACZC,MAAAA,OAAO,EAAE,KADG;AAEZC,MAAAA,UAAU,EAAE,IAFA;AAGZC,MAAAA,SAAS,EAAE,IAHC;AAIZ;AACAC,MAAAA,sBAAsB,EAAE,KALZ;AAMZ;AACAC,MAAAA,iBAAiB,EAAE;AAPP,KAXN;AAoBRC,IAAAA,KAAK,EAAE;AACL;AACAC,MAAAA,mBAAmB,EAAE,IAFhB;AAGL;AACAC,MAAAA,oBAAoB,EAAE,KAJjB;AAKL;AACAC,MAAAA,QAAQ,EAAE,IANL;AAOL;AACAC,MAAAA,gBAAgB,EAAE,IARb;AASL;AACAC,MAAAA,UAAU,EAAE,GAVP;AAWL;AACAC,MAAAA,6BAA6B,EAAE,CAZ1B;AAY6B;AAClCC,MAAAA,YAAY,EAAE,GAbT;AAac;AACnBC,MAAAA,eAAe,EAAE,GAdZ,CAcgB;;AAdhB,KApBC;AAoCRC,IAAAA,OAAO,EAAE;AACP;AACA;AACAC,MAAAA,UAAU,EAAE,cAHL;AAIP;AACAC,MAAAA,UAAU,EAAE,WALL;AAMP;AACAC,MAAAA,aAAa,EAAE,SAPR;AAQP;AACAC,MAAAA,kBAAkB,EAAE,KATb;AAUP;AACA;AACAC,MAAAA,WAAW,EAAE;AAZN,KApCD;AAkDRC,IAAAA,OAAO,EAAE;AACPC,MAAAA,MAAM,EAAE,IADD;AAEPC,MAAAA,aAAa,EAAE;AAFR,KAlDD;AAsDRC,IAAAA,UAAU,EAAE;AACVC,MAAAA,QAAQ,EAAE,IADA;AAEVC,MAAAA,SAAS,EAAE,GAFD;AAGVC,MAAAA,UAAU,EAAE,IAHF;AAIVC,MAAAA,WAAW,EAAE;AAJH,KAtDJ;AA4DRC,IAAAA,gBAAgB,EAAE;AAChBJ,MAAAA,QAAQ,EAAE,IADM;AAEhBC,MAAAA,SAAS,EAAE,IAFK;AAGhBC,MAAAA,UAAU,EAAE,IAHI;AAIhBC,MAAAA,WAAW,EAAE;AAJG,KA5DV;AAkERE,IAAAA,SAAS,EAAE;AACT;AACA;AACAC,MAAAA,KAAK,EAAE,KAHE;AAITC,MAAAA,KAAK,EAAE;AAJE,KAlEH;AAwERC,IAAAA,eAAe,EAAE,EAxET;AAyERC,IAAAA,mBAAmB,EAAE,EAzEb;AA0ERC,IAAAA,WAAW,EAAE,kBA1EL;AA2ER;AACAC,IAAAA,cAAc,EAAE,IA5ER;AA6ERC,IAAAA,SAAS,EAAE,IA7EH;AA8ERC,IAAAA,oBAAoB,EAAE,KA9Ed;AA+ERC,IAAAA,YAAY,EAAE,KA/EN;AAgFRC,IAAAA,YAAY,EAAE;AACZC,MAAAA,0BAA0B,EAAE,KADhB;AAEZC,MAAAA,qBAAqB,EAAE;AAFX;AAhFN;AAJG,C","sourcesContent":["import {\n deviceType\n} from '@webex/common';\n\nexport default {\n // TODO: this needs to be defaulted\n // to JS_SDK and clients set it to WEB or others\n // see https://jira-eng-gpk2.cisco.com/jira/browse/SPARK-73167\n meetings: {\n deviceType: deviceType.WEB,\n mediaSettings: {\n sendAudio: true,\n sendVideo: true,\n receiveAudio: true,\n receiveVideo: true,\n pstn: false,\n sendShare: false,\n receiveShare: false\n },\n reconnection: {\n enabled: false,\n autoRejoin: true,\n detection: true,\n // Timeout duration to wait for ICE to reconnect if a disconnect is received.\n iceReconnectionTimeout: 10000,\n // Amount of times attempting to rejoin a meeting during reconnect\n maxRejoinAttempts: 3\n },\n stats: {\n // Enable the webrtc stats analyzer that emits quality degradation events\n enableStatsAnalyzer: true,\n // Enable the auto downgrade video quality feature\n autoDowngradeEnabled: false,\n // 1 second intervals to collect stats data\n interval: 1000,\n // we just want to analyze data every 5 sec interval\n analyzerInterval: 5000,\n // hold the last 2 minute of a calls data\n historyMax: 120,\n // Once packet loss hits this ratio, the video will downgrade\n videoPacketLossRatioThreshold: 9, // comparison of packets lost / packets received\n rttThreshold: 500, // 500 ms noticeable quality lag begins based on bandwidth of user\n jitterThreshold: 500 // 500 ms noticeable quality lag begins based on bandwidth of user\n },\n metrics: {\n // change to your client name else data will be muddled\n // you do not need a specific format, and you do not need to register it\n clientName: 'WEBEX_JS_SDK',\n // TODO: for now this line has to be whitelisted, which is problematic for third party\n clientType: 'WEBEX_SDK',\n // Stores the sub client type used when sending metrics\n subClientType: 'WEB_APP',\n // send average values MQA in 60 second intervals\n mqaMetricsInterval: 60000,\n // send to cisco internal MQA data automatically\n // we already send CA\n autoSendMQA: true\n },\n logging: {\n enable: true,\n verboseEvents: true\n },\n resolution: {\n maxWidth: 1280,\n maxHeight: 720,\n idealWidth: 1280,\n idealHeight: 720\n },\n screenResolution: {\n maxWidth: 1920,\n maxHeight: 1080,\n idealWidth: 1920,\n idealHeight: 1080\n },\n bandwidth: {\n // please note, these are the maximum bandwidth values\n // the server supports, minimums have to be tested\n audio: 64000,\n video: 4000000\n },\n screenFrameRate: 10,\n videoShareFrameRate: 30,\n aspectRatio: 1.7695852534562213,\n // When enabled, as calls are ended, it will upload the SDK logs and correlate them\n autoUploadLogs: true,\n enableRtx: true,\n receiveTranscription: false,\n enableExtmap: false,\n experimental: {\n enableMediaNegotiatedEvent: false,\n enableUnifiedMeetings: false\n }\n }\n};\n"]}
@@ -105,7 +105,8 @@ Media.setLocalTrack = function (enabled, track) {
105
105
  Media.reconnectMedia = function (peerConnection, _ref) {
106
106
  var meetingId = _ref.meetingId,
107
107
  remoteQualityLevel = _ref.remoteQualityLevel,
108
- enableRtx = _ref.enableRtx;
108
+ enableRtx = _ref.enableRtx,
109
+ enableExtmap = _ref.enableExtmap;
109
110
 
110
111
  if (peerConnection.connectionState === _constants.PEER_CONNECTION_STATE.CLOSED || peerConnection.connectionState === _constants.PEER_CONNECTION_STATE.FAILED) {
111
112
  return _promise.default.reject(new _reconnection.default('Reinitiate peerconnection'));
@@ -114,7 +115,8 @@ Media.reconnectMedia = function (peerConnection, _ref) {
114
115
  return _peerConnectionManager.default.createOffer(peerConnection, {
115
116
  meetingId: meetingId,
116
117
  remoteQualityLevel: remoteQualityLevel,
117
- enableRtx: enableRtx
118
+ enableRtx: enableRtx,
119
+ enableExtmap: enableExtmap
118
120
  });
119
121
  };
120
122
  /**
@@ -219,7 +221,8 @@ Media.checkTracks = function (trackType, track, receiveTracks) {
219
221
  Media.attachMedia = function (mediaProperties, _ref2) {
220
222
  var meetingId = _ref2.meetingId,
221
223
  remoteQualityLevel = _ref2.remoteQualityLevel,
222
- enableRtx = _ref2.enableRtx;
224
+ enableRtx = _ref2.enableRtx,
225
+ enableExtmap = _ref2.enableExtmap;
223
226
  var mediaDirection = mediaProperties.mediaDirection,
224
227
  audioTrack = mediaProperties.audioTrack,
225
228
  videoTrack = mediaProperties.videoTrack,
@@ -249,7 +252,8 @@ Media.attachMedia = function (mediaProperties, _ref2) {
249
252
  return _peerConnectionManager.default.createOffer(peerConnection, {
250
253
  meetingId: meetingId,
251
254
  remoteQualityLevel: remoteQualityLevel,
252
- enableRtx: enableRtx
255
+ enableRtx: enableRtx,
256
+ enableExtmap: enableExtmap
253
257
  });
254
258
  };
255
259
  /**
@@ -265,7 +269,8 @@ Media.attachMedia = function (mediaProperties, _ref2) {
265
269
  Media.updateMedia = function (mediaProperties, _ref3) {
266
270
  var meetingId = _ref3.meetingId,
267
271
  remoteQualityLevel = _ref3.remoteQualityLevel,
268
- enableRtx = _ref3.enableRtx;
272
+ enableRtx = _ref3.enableRtx,
273
+ enableExtmap = _ref3.enableExtmap;
269
274
  var mediaDirection = mediaProperties.mediaDirection,
270
275
  audioTrack = mediaProperties.audioTrack,
271
276
  videoTrack = mediaProperties.videoTrack,
@@ -300,7 +305,8 @@ Media.updateMedia = function (mediaProperties, _ref3) {
300
305
  return _peerConnectionManager.default.createOffer(peerConnection, {
301
306
  meetingId: meetingId,
302
307
  remoteQualityLevel: remoteQualityLevel,
303
- enableRtx: enableRtx
308
+ enableRtx: enableRtx,
309
+ enableExtmap: enableExtmap
304
310
  });
305
311
  };
306
312
  /**
@@ -345,12 +351,14 @@ Media.setTrackOnTransceiver = function (transceiver, options) {
345
351
  Media.updateTransceiver = function (_ref4, peerConnection, transceiver, options) {
346
352
  var meetingId = _ref4.meetingId,
347
353
  remoteQualityLevel = _ref4.remoteQualityLevel,
348
- enableRtx = _ref4.enableRtx;
354
+ enableRtx = _ref4.enableRtx,
355
+ enableExtmap = _ref4.enableExtmap;
349
356
  Media.setTrackOnTransceiver(transceiver, options);
350
357
  return _peerConnectionManager.default.createOffer(peerConnection, {
351
358
  meetingId: meetingId,
352
359
  remoteQualityLevel: remoteQualityLevel,
353
- enableRtx: enableRtx
360
+ enableRtx: enableRtx,
361
+ enableExtmap: enableExtmap
354
362
  });
355
363
  };
356
364
  /**
@@ -1 +1 @@
1
- {"version":3,"sources":["index.js"],"names":["isBrowser","Media","setLocalTrack","enabled","track","reconnectMedia","peerConnection","meetingId","remoteQualityLevel","enableRtx","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"],"mappings":"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","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, {meetingId, remoteQualityLevel, enableRtx}) => {\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, {meetingId, remoteQualityLevel, enableRtx});\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, {meetingId, remoteQualityLevel, enableRtx}) => {\n const {\n mediaDirection, audioTrack, videoTrack, shareTrack, 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, {meetingId, remoteQualityLevel, enableRtx});\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, {meetingId, remoteQualityLevel, enableRtx}) => {\n const {\n mediaDirection, audioTrack, videoTrack, shareTrack, 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, {meetingId, remoteQualityLevel, enableRtx});\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 = ({meetingId, remoteQualityLevel, enableRtx}, peerConnection, transceiver, options) => {\n Media.setTrackOnTransceiver(transceiver, options);\n\n return PeerConnectionManager.createOffer(peerConnection, {meetingId, remoteQualityLevel, enableRtx});\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"]}
1
+ {"version":3,"sources":["index.js"],"names":["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"],"mappings":"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","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"]}
@@ -3964,7 +3964,8 @@ var Meeting = /*#__PURE__*/function (_StatelessWebexPlugin) {
3964
3964
  return _media.default.attachMedia(_this36.mediaProperties, {
3965
3965
  meetingId: _this36.id,
3966
3966
  remoteQualityLevel: _this36.mediaProperties.remoteQualityLevel,
3967
- enableRtx: _this36.config.enableRtx
3967
+ enableRtx: _this36.config.enableRtx,
3968
+ enableExtmap: _this36.config.enableExtmap
3968
3969
  }).then(function (peerConnection) {
3969
3970
  return _this36.getDevices().then(function (devices) {
3970
3971
  _util.default.handleDeviceLogging(devices);
@@ -4215,7 +4216,8 @@ var Meeting = /*#__PURE__*/function (_StatelessWebexPlugin) {
4215
4216
  return _media.default.updateMedia(_this38.mediaProperties, {
4216
4217
  meetingId: _this38.id,
4217
4218
  remoteQualityLevel: _this38.mediaProperties.remoteQualityLevel,
4218
- enableRtx: _this38.config.enableRtx
4219
+ enableRtx: _this38.config.enableRtx,
4220
+ enableExtmap: _this38.config.enableExtmap
4219
4221
  }).then(function (peerConnection) {
4220
4222
  _loggerProxy.default.logger.info("".concat(LOG_HEADER, " PeerConnection received from updateMedia, ").concat(peerConnection));
4221
4223