@webex/plugin-meetings 1.148.0 → 1.150.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.
Files changed (37) hide show
  1. package/dist/constants.js +12 -4
  2. package/dist/constants.js.map +1 -1
  3. package/dist/locus-info/mediaSharesUtils.js +88 -11
  4. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  5. package/dist/meeting/index.js +247 -38
  6. package/dist/meeting/index.js.map +1 -1
  7. package/dist/meeting/request.js +17 -41
  8. package/dist/meeting/request.js.map +1 -1
  9. package/dist/meeting-info/index.js +1 -1
  10. package/dist/meeting-info/index.js.map +1 -1
  11. package/dist/meeting-info/util.js +14 -0
  12. package/dist/meeting-info/util.js.map +1 -1
  13. package/dist/meetings/index.js +12 -13
  14. package/dist/meetings/index.js.map +1 -1
  15. package/dist/meetings/util.js +0 -16
  16. package/dist/meetings/util.js.map +1 -1
  17. package/dist/members/index.js +72 -11
  18. package/dist/members/index.js.map +1 -1
  19. package/dist/metrics/config.js +6 -0
  20. package/dist/metrics/config.js.map +1 -1
  21. package/dist/metrics/index.js +6 -0
  22. package/dist/metrics/index.js.map +1 -1
  23. package/package.json +5 -5
  24. package/src/constants.js +9 -2
  25. package/src/locus-info/mediaSharesUtils.js +84 -12
  26. package/src/meeting/index.js +225 -19
  27. package/src/meeting/request.js +50 -29
  28. package/src/meeting-info/index.js +4 -1
  29. package/src/meeting-info/util.js +13 -0
  30. package/src/meetings/index.js +10 -11
  31. package/src/meetings/util.js +0 -14
  32. package/src/members/index.js +80 -11
  33. package/src/metrics/config.js +6 -0
  34. package/src/metrics/index.js +5 -1
  35. package/test/integration/spec/journey.js +141 -5
  36. package/test/integration/spec/space-meeting.js +10 -1
  37. package/test/unit/spec/meeting/index.js +547 -2
@@ -20,8 +20,15 @@ var MediaSharesUtils = {};
20
20
  MediaSharesUtils.parse = function (mediaShares) {
21
21
  if (mediaShares) {
22
22
  return {
23
- contentId: MediaSharesUtils.getContentId(mediaShares),
24
- disposition: MediaSharesUtils.getDisposition(mediaShares)
23
+ content: {
24
+ beneficiaryId: MediaSharesUtils.getContentBeneficiaryId(mediaShares),
25
+ disposition: MediaSharesUtils.getContentDisposition(mediaShares)
26
+ },
27
+ whiteboard: {
28
+ beneficiaryId: MediaSharesUtils.getWhiteboardBeneficiaryId(mediaShares),
29
+ disposition: MediaSharesUtils.getWhiteboardDisposition(mediaShares),
30
+ resourceUrl: MediaSharesUtils.getWhiteboardResourceUrl(mediaShares)
31
+ }
25
32
  };
26
33
  }
27
34
 
@@ -45,16 +52,27 @@ MediaSharesUtils.getMediaShares = function (oldShare, newShare) {
45
52
  };
46
53
  };
47
54
  /**
48
- * get the floor disposition (released, granted)
55
+ * get the content floor disposition (released, granted)
49
56
  * @param {Object} mediaShares
50
57
  * @returns {Boolean} disposition
51
58
  */
52
59
 
53
60
 
54
- MediaSharesUtils.getDisposition = function (mediaShares) {
61
+ MediaSharesUtils.getContentDisposition = function (mediaShares) {
55
62
  var contentFloor = MediaSharesUtils.extractContentFloor(mediaShares);
56
63
  return contentFloor ? contentFloor.disposition : null;
57
64
  };
65
+ /**
66
+ * get the whiteboard floor disposition (released, granted)
67
+ * @param {Object} mediaShares
68
+ * @returns {Boolean} disposition
69
+ */
70
+
71
+
72
+ MediaSharesUtils.getWhiteboardDisposition = function (mediaShares) {
73
+ var whiteboardFloor = MediaSharesUtils.extractWhiteboardFloor(mediaShares);
74
+ return whiteboardFloor ? whiteboardFloor.disposition : null;
75
+ };
58
76
  /**
59
77
  * extract the content property from media shares
60
78
  * @param {Object} mediaShares
@@ -72,18 +90,34 @@ MediaSharesUtils.extractContent = function (mediaShares) {
72
90
  }) || null;
73
91
  };
74
92
  /**
75
- * extract the floor property from content object
76
- * @param {Object} content
93
+ * extract the whiteboard property from media shares
94
+ * @param {Object} mediaShares
77
95
  * @returns {Object}
78
96
  */
79
97
 
80
98
 
81
- MediaSharesUtils.extractFloor = function (content) {
82
- if (!content) {
99
+ MediaSharesUtils.extractWhiteboard = function (mediaShares) {
100
+ if (!mediaShares || !mediaShares.length) {
83
101
  return null;
84
102
  }
85
103
 
86
- return content.floor;
104
+ return mediaShares.find(function (share) {
105
+ return share.name === _constants.WHITEBOARD;
106
+ }) || null;
107
+ };
108
+ /**
109
+ * extract the media stream floor property from content object
110
+ * @param {Object} mediaStream
111
+ * @returns {Object}
112
+ */
113
+
114
+
115
+ MediaSharesUtils.extractFloor = function (mediaStream) {
116
+ if (!mediaStream) {
117
+ return null;
118
+ }
119
+
120
+ return mediaStream.floor;
87
121
  };
88
122
  /**
89
123
  * extract the content's floor from media shares
@@ -97,13 +131,24 @@ MediaSharesUtils.extractContentFloor = function (mediaShares) {
97
131
  return MediaSharesUtils.extractFloor(content);
98
132
  };
99
133
  /**
100
- * get who is sharing from media shares
134
+ * extract the whiteboard's floor from media shares
101
135
  * @param {Object} mediaShares
102
136
  * @returns {Object}
103
137
  */
104
138
 
105
139
 
106
- MediaSharesUtils.getContentId = function (mediaShares) {
140
+ MediaSharesUtils.extractWhiteboardFloor = function (mediaShares) {
141
+ var whiteboard = MediaSharesUtils.extractWhiteboard(mediaShares);
142
+ return MediaSharesUtils.extractFloor(whiteboard);
143
+ };
144
+ /**
145
+ * get who is sharing from media shares (content)
146
+ * @param {Object} mediaShares
147
+ * @returns {Object}
148
+ */
149
+
150
+
151
+ MediaSharesUtils.getContentBeneficiaryId = function (mediaShares) {
107
152
  var contentFloor = MediaSharesUtils.extractContentFloor(mediaShares);
108
153
 
109
154
  if (!contentFloor || !contentFloor.beneficiary) {
@@ -112,6 +157,38 @@ MediaSharesUtils.getContentId = function (mediaShares) {
112
157
 
113
158
  return contentFloor.beneficiary.id;
114
159
  };
160
+ /**
161
+ * get who is sharing from media shares (whiteboard)
162
+ * @param {Object} mediaShares
163
+ * @returns {Object}
164
+ */
165
+
166
+
167
+ MediaSharesUtils.getWhiteboardBeneficiaryId = function (mediaShares) {
168
+ var whiteboardFloor = MediaSharesUtils.extractWhiteboardFloor(mediaShares);
169
+
170
+ if (!whiteboardFloor || !whiteboardFloor.beneficiary) {
171
+ return null;
172
+ }
173
+
174
+ return whiteboardFloor.beneficiary.id;
175
+ };
176
+ /**
177
+ * get the which whiteboard is being shared via resource url
178
+ * @param {Object} mediaShares
179
+ * @returns {Object}
180
+ */
181
+
182
+
183
+ MediaSharesUtils.getWhiteboardResourceUrl = function (mediaShares) {
184
+ var whiteboard = MediaSharesUtils.extractWhiteboard(mediaShares);
185
+
186
+ if (!whiteboard || !whiteboard.resourceUrl) {
187
+ return null;
188
+ }
189
+
190
+ return whiteboard.resourceUrl;
191
+ };
115
192
 
116
193
  var _default = MediaSharesUtils;
117
194
  exports.default = _default;
@@ -1 +1 @@
1
- {"version":3,"sources":["mediaSharesUtils.js"],"names":["MediaSharesUtils","parse","mediaShares","contentId","getContentId","disposition","getDisposition","getMediaShares","oldShare","newShare","previous","current","contentFloor","extractContentFloor","extractContent","length","find","share","name","CONTENT","extractFloor","content","floor","beneficiary","id"],"mappings":";;;;;;;;;;AAAA;;AAEA,IAAMA,gBAAgB,GAAG,EAAzB;AAEA;AACA;AACA;AACA;AACA;;AACAA,gBAAgB,CAACC,KAAjB,GAAyB,UAACC,WAAD,EAAiB;AACxC,MAAIA,WAAJ,EAAiB;AACf,WAAO;AACLC,MAAAA,SAAS,EAAEH,gBAAgB,CAACI,YAAjB,CAA8BF,WAA9B,CADN;AAELG,MAAAA,WAAW,EAAEL,gBAAgB,CAACM,cAAjB,CAAgCJ,WAAhC;AAFR,KAAP;AAID;;AAED,SAAO,IAAP;AACD,CATD;AAWA;AACA;AACA;AACA;AACA;AACA;AACA;;;AACAF,gBAAgB,CAACO,cAAjB,GAAkC,UAACC,QAAD,EAAWC,QAAX,EAAwB;AACxD,MAAMC,QAAQ,GAAGF,QAAQ,IAAIR,gBAAgB,CAACC,KAAjB,CAAuBO,QAAvB,CAA7B;AACA,MAAMG,OAAO,GAAGF,QAAQ,IAAIT,gBAAgB,CAACC,KAAjB,CAAuBQ,QAAvB,CAA5B;AAEA,SAAO;AACLC,IAAAA,QAAQ,EAARA,QADK;AAELC,IAAAA,OAAO,EAAPA;AAFK,GAAP;AAID,CARD;AAUA;AACA;AACA;AACA;AACA;;;AACAX,gBAAgB,CAACM,cAAjB,GAAkC,UAACJ,WAAD,EAAiB;AACjD,MAAMU,YAAY,GAAGZ,gBAAgB,CAACa,mBAAjB,CAAqCX,WAArC,CAArB;AAEA,SAAOU,YAAY,GAAGA,YAAY,CAACP,WAAhB,GAA8B,IAAjD;AACD,CAJD;AAMA;AACA;AACA;AACA;AACA;;;AACAL,gBAAgB,CAACc,cAAjB,GAAkC,UAACZ,WAAD,EAAiB;AACjD,MAAI,CAACA,WAAD,IAAgB,CAACA,WAAW,CAACa,MAAjC,EAAyC;AACvC,WAAO,IAAP;AACD;;AAED,SAAOb,WAAW,CAACc,IAAZ,CAAiB,UAACC,KAAD;AAAA,WAAWA,KAAK,CAACC,IAAN,KAAeC,kBAA1B;AAAA,GAAjB,KAAuD,IAA9D;AACD,CAND;AAQA;AACA;AACA;AACA;AACA;;;AACAnB,gBAAgB,CAACoB,YAAjB,GAAgC,UAACC,OAAD,EAAa;AAC3C,MAAI,CAACA,OAAL,EAAc;AACZ,WAAO,IAAP;AACD;;AAED,SAAOA,OAAO,CAACC,KAAf;AACD,CAND;AAQA;AACA;AACA;AACA;AACA;;;AACAtB,gBAAgB,CAACa,mBAAjB,GAAuC,UAACX,WAAD,EAAiB;AACtD,MAAMmB,OAAO,GAAGrB,gBAAgB,CAACc,cAAjB,CAAgCZ,WAAhC,CAAhB;AAEA,SAAOF,gBAAgB,CAACoB,YAAjB,CAA8BC,OAA9B,CAAP;AACD,CAJD;AAMA;AACA;AACA;AACA;AACA;;;AACArB,gBAAgB,CAACI,YAAjB,GAAgC,UAACF,WAAD,EAAiB;AAC/C,MAAMU,YAAY,GAAGZ,gBAAgB,CAACa,mBAAjB,CAAqCX,WAArC,CAArB;;AAEA,MAAI,CAACU,YAAD,IAAiB,CAACA,YAAY,CAACW,WAAnC,EAAgD;AAC9C,WAAO,IAAP;AACD;;AAED,SAAOX,YAAY,CAACW,WAAb,CAAyBC,EAAhC;AACD,CARD;;eAUexB,gB","sourcesContent":["import {CONTENT} from '../constants';\n\nconst MediaSharesUtils = {};\n\n/**\n * parses the relevant values for mediaShares: contentId, disposition\n * @param {Object} mediaShares\n * @returns {undefined}\n */\nMediaSharesUtils.parse = (mediaShares) => {\n if (mediaShares) {\n return {\n contentId: MediaSharesUtils.getContentId(mediaShares),\n disposition: MediaSharesUtils.getDisposition(mediaShares)\n };\n }\n\n return null;\n};\n\n/**\n * get the previous and current mediaShares values parsed, as well as the boolean updates\n * @param {Object} oldShare\n * @param {Object} newShare\n * @returns {Object}\n * previous: {Object} old share, current: {Object} new share,\n */\nMediaSharesUtils.getMediaShares = (oldShare, newShare) => {\n const previous = oldShare && MediaSharesUtils.parse(oldShare);\n const current = newShare && MediaSharesUtils.parse(newShare);\n\n return {\n previous,\n current\n };\n};\n\n/**\n * get the floor disposition (released, granted)\n * @param {Object} mediaShares\n * @returns {Boolean} disposition\n */\nMediaSharesUtils.getDisposition = (mediaShares) => {\n const contentFloor = MediaSharesUtils.extractContentFloor(mediaShares);\n\n return contentFloor ? contentFloor.disposition : null;\n};\n\n/**\n * extract the content property from media shares\n * @param {Object} mediaShares\n * @returns {Object}\n */\nMediaSharesUtils.extractContent = (mediaShares) => {\n if (!mediaShares || !mediaShares.length) {\n return null;\n }\n\n return mediaShares.find((share) => share.name === CONTENT) || null;\n};\n\n/**\n * extract the floor property from content object\n * @param {Object} content\n * @returns {Object}\n */\nMediaSharesUtils.extractFloor = (content) => {\n if (!content) {\n return null;\n }\n\n return content.floor;\n};\n\n/**\n * extract the content's floor from media shares\n * @param {Object} mediaShares\n * @returns {Object}\n */\nMediaSharesUtils.extractContentFloor = (mediaShares) => {\n const content = MediaSharesUtils.extractContent(mediaShares);\n\n return MediaSharesUtils.extractFloor(content);\n};\n\n/**\n * get who is sharing from media shares\n * @param {Object} mediaShares\n * @returns {Object}\n */\nMediaSharesUtils.getContentId = (mediaShares) => {\n const contentFloor = MediaSharesUtils.extractContentFloor(mediaShares);\n\n if (!contentFloor || !contentFloor.beneficiary) {\n return null;\n }\n\n return contentFloor.beneficiary.id;\n};\n\nexport default MediaSharesUtils;\n"]}
1
+ {"version":3,"sources":["mediaSharesUtils.js"],"names":["MediaSharesUtils","parse","mediaShares","content","beneficiaryId","getContentBeneficiaryId","disposition","getContentDisposition","whiteboard","getWhiteboardBeneficiaryId","getWhiteboardDisposition","resourceUrl","getWhiteboardResourceUrl","getMediaShares","oldShare","newShare","previous","current","contentFloor","extractContentFloor","whiteboardFloor","extractWhiteboardFloor","extractContent","length","find","share","name","CONTENT","extractWhiteboard","WHITEBOARD","extractFloor","mediaStream","floor","beneficiary","id"],"mappings":"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","sourcesContent":["import {CONTENT, WHITEBOARD} from '../constants';\n\nconst MediaSharesUtils = {};\n\n/**\n * parses the relevant values for mediaShares: contentId, disposition\n * @param {Object} mediaShares\n * @returns {undefined}\n */\nMediaSharesUtils.parse = (mediaShares) => {\n if (mediaShares) {\n return {\n content: {\n beneficiaryId: MediaSharesUtils.getContentBeneficiaryId(mediaShares),\n disposition: MediaSharesUtils.getContentDisposition(mediaShares)\n },\n whiteboard: {\n beneficiaryId: MediaSharesUtils.getWhiteboardBeneficiaryId(mediaShares),\n disposition: MediaSharesUtils.getWhiteboardDisposition(mediaShares),\n resourceUrl: MediaSharesUtils.getWhiteboardResourceUrl(mediaShares)\n }\n };\n }\n\n return null;\n};\n\n/**\n * get the previous and current mediaShares values parsed, as well as the boolean updates\n * @param {Object} oldShare\n * @param {Object} newShare\n * @returns {Object}\n * previous: {Object} old share, current: {Object} new share,\n */\nMediaSharesUtils.getMediaShares = (oldShare, newShare) => {\n const previous = oldShare && MediaSharesUtils.parse(oldShare);\n const current = newShare && MediaSharesUtils.parse(newShare);\n\n return {\n previous,\n current\n };\n};\n\n/**\n * get the content floor disposition (released, granted)\n * @param {Object} mediaShares\n * @returns {Boolean} disposition\n */\nMediaSharesUtils.getContentDisposition = (mediaShares) => {\n const contentFloor = MediaSharesUtils.extractContentFloor(mediaShares);\n\n return contentFloor ? contentFloor.disposition : null;\n};\n\n/**\n * get the whiteboard floor disposition (released, granted)\n * @param {Object} mediaShares\n * @returns {Boolean} disposition\n */\nMediaSharesUtils.getWhiteboardDisposition = (mediaShares) => {\n const whiteboardFloor = MediaSharesUtils.extractWhiteboardFloor(mediaShares);\n\n return whiteboardFloor ? whiteboardFloor.disposition : null;\n};\n\n/**\n * extract the content property from media shares\n * @param {Object} mediaShares\n * @returns {Object}\n */\nMediaSharesUtils.extractContent = (mediaShares) => {\n if (!mediaShares || !mediaShares.length) {\n return null;\n }\n\n return mediaShares.find((share) => share.name === CONTENT) || null;\n};\n\n/**\n * extract the whiteboard property from media shares\n * @param {Object} mediaShares\n * @returns {Object}\n */\nMediaSharesUtils.extractWhiteboard = (mediaShares) => {\n if (!mediaShares || !mediaShares.length) {\n return null;\n }\n\n return mediaShares.find((share) => share.name === WHITEBOARD) || null;\n};\n\n/**\n * extract the media stream floor property from content object\n * @param {Object} mediaStream\n * @returns {Object}\n */\nMediaSharesUtils.extractFloor = (mediaStream) => {\n if (!mediaStream) {\n return null;\n }\n\n return mediaStream.floor;\n};\n\n/**\n * extract the content's floor from media shares\n * @param {Object} mediaShares\n * @returns {Object}\n */\nMediaSharesUtils.extractContentFloor = (mediaShares) => {\n const content = MediaSharesUtils.extractContent(mediaShares);\n\n return MediaSharesUtils.extractFloor(content);\n};\n\n/**\n * extract the whiteboard's floor from media shares\n * @param {Object} mediaShares\n * @returns {Object}\n */\nMediaSharesUtils.extractWhiteboardFloor = (mediaShares) => {\n const whiteboard = MediaSharesUtils.extractWhiteboard(mediaShares);\n\n return MediaSharesUtils.extractFloor(whiteboard);\n};\n\n/**\n * get who is sharing from media shares (content)\n * @param {Object} mediaShares\n * @returns {Object}\n */\nMediaSharesUtils.getContentBeneficiaryId = (mediaShares) => {\n const contentFloor = MediaSharesUtils.extractContentFloor(mediaShares);\n\n if (!contentFloor || !contentFloor.beneficiary) {\n return null;\n }\n\n return contentFloor.beneficiary.id;\n};\n\n/**\n * get who is sharing from media shares (whiteboard)\n * @param {Object} mediaShares\n * @returns {Object}\n */\nMediaSharesUtils.getWhiteboardBeneficiaryId = (mediaShares) => {\n const whiteboardFloor = MediaSharesUtils.extractWhiteboardFloor(mediaShares);\n\n if (!whiteboardFloor || !whiteboardFloor.beneficiary) {\n return null;\n }\n\n return whiteboardFloor.beneficiary.id;\n};\n\n/**\n * get the which whiteboard is being shared via resource url\n * @param {Object} mediaShares\n * @returns {Object}\n */\nMediaSharesUtils.getWhiteboardResourceUrl = (mediaShares) => {\n const whiteboard = MediaSharesUtils.extractWhiteboard(mediaShares);\n\n if (!whiteboard || !whiteboard.resourceUrl) {\n return null;\n }\n\n return whiteboard.resourceUrl;\n};\n\nexport default MediaSharesUtils;\n"]}
@@ -1305,6 +1305,22 @@ var Meeting = /*#__PURE__*/function (_StatelessWebexPlugin) {
1305
1305
  };
1306
1306
  }
1307
1307
 
1308
+ var joinRespTxStartAudio = this.getSendingMediaDelayDuration('audio');
1309
+
1310
+ if (joinRespTxStartAudio) {
1311
+ options.audioSetupDelay = _objectSpread(_objectSpread({}, options.audioSetupDelay), {}, {
1312
+ joinRespTxStart: joinRespTxStartAudio
1313
+ });
1314
+ }
1315
+
1316
+ var joinRespTxStartVideo = this.getSendingMediaDelayDuration('video');
1317
+
1318
+ if (joinRespTxStartVideo) {
1319
+ options.videoSetupDelay = _objectSpread(_objectSpread({}, options.videoSetupDelay), {}, {
1320
+ joinRespTxStart: joinRespTxStartVideo
1321
+ });
1322
+ }
1323
+
1308
1324
  if (options.type === _constants.MQA_STATS.CA_TYPE) {
1309
1325
  payload = _metrics.default.initMediaPayload(options.event, identifiers, options);
1310
1326
  } else {
@@ -1564,7 +1580,7 @@ var Meeting = /*#__PURE__*/function (_StatelessWebexPlugin) {
1564
1580
  }
1565
1581
  /**
1566
1582
  * Set up the locus info media shares listener
1567
- * update content sharing id value for members, and updates the member
1583
+ * update content and whiteboard sharing id value for members, and updates the member
1568
1584
  * notifies consumer with members:content:update {activeContentSharingId, endedContentSharingId}
1569
1585
  * @returns {undefined}
1570
1586
  * @private
@@ -1581,10 +1597,12 @@ var Meeting = /*#__PURE__*/function (_StatelessWebexPlugin) {
1581
1597
  var _payload$previous, _payload$previous2;
1582
1598
 
1583
1599
  var _payload$current = payload.current,
1584
- contentId = _payload$current.contentId,
1585
- disposition = _payload$current.disposition;
1600
+ contentShare = _payload$current.content,
1601
+ whiteboardShare = _payload$current.whiteboard;
1602
+ var previousContentShare = (_payload$previous = payload.previous) === null || _payload$previous === void 0 ? void 0 : _payload$previous.content;
1603
+ var previousWhiteboardShare = (_payload$previous2 = payload.previous) === null || _payload$previous2 === void 0 ? void 0 : _payload$previous2.whiteboard;
1586
1604
 
1587
- if (contentId === ((_payload$previous = payload.previous) === null || _payload$previous === void 0 ? void 0 : _payload$previous.contentId) && disposition === ((_payload$previous2 = payload.previous) === null || _payload$previous2 === void 0 ? void 0 : _payload$previous2.disposition)) {
1605
+ if (contentShare.beneficiaryId === (previousContentShare === null || previousContentShare === void 0 ? void 0 : previousContentShare.beneficiaryId) && contentShare.disposition === (previousContentShare === null || previousContentShare === void 0 ? void 0 : previousContentShare.disposition) && whiteboardShare.beneficiaryId === (previousWhiteboardShare === null || previousWhiteboardShare === void 0 ? void 0 : previousWhiteboardShare.beneficiaryId) && whiteboardShare.disposition === (previousWhiteboardShare === null || previousWhiteboardShare === void 0 ? void 0 : previousWhiteboardShare.disposition) && whiteboardShare.resourceUrl === (previousWhiteboardShare === null || previousWhiteboardShare === void 0 ? void 0 : previousWhiteboardShare.resourceUrl)) {
1588
1606
  // nothing changed, so ignore
1589
1607
  // (this happens when we steal presentation from remote)
1590
1608
  return;
@@ -1592,10 +1610,11 @@ var Meeting = /*#__PURE__*/function (_StatelessWebexPlugin) {
1592
1610
 
1593
1611
  var newShareStatus = _this10.shareStatus; // REMOTE - check if remote started sharing
1594
1612
 
1595
- if (_this10.selfId !== contentId && disposition === _constants.FLOOR_ACTION.GRANTED) {
1613
+ if (_this10.selfId !== contentShare.beneficiaryId && contentShare.disposition === _constants.FLOOR_ACTION.GRANTED) {
1614
+ // CONTENT - sharing content remote
1596
1615
  newShareStatus = _constants.SHARE_STATUS.REMOTE_SHARE_ACTIVE;
1597
- } // LOCAL - check if we started sharing
1598
- else if (_this10.selfId === contentId && disposition === _constants.FLOOR_ACTION.GRANTED) {
1616
+ } // LOCAL - check if we started sharing content
1617
+ else if (_this10.selfId === contentShare.beneficiaryId && contentShare.disposition === _constants.FLOOR_ACTION.GRANTED) {
1599
1618
  var _this10$mediaProperti;
1600
1619
 
1601
1620
  if (((_this10$mediaProperti = _this10.mediaProperties.shareTrack) === null || _this10$mediaProperti === void 0 ? void 0 : _this10$mediaProperti.readyState) === 'ended') {
@@ -1605,10 +1624,17 @@ var Meeting = /*#__PURE__*/function (_StatelessWebexPlugin) {
1605
1624
  _loggerProxy.default.logger.log('Meeting:index#setUpLocusMediaSharesListener --> Error stopping share: ', error);
1606
1625
  });
1607
1626
  } else {
1627
+ // CONTENT - sharing content local
1608
1628
  newShareStatus = _constants.SHARE_STATUS.LOCAL_SHARE_ACTIVE;
1609
1629
  }
1610
- } // or if sharing has been stopped
1611
- else if (payload.previous && disposition === _constants.FLOOR_ACTION.RELEASED) {
1630
+ } // If we did not hit the cases above, no one is sharng content, so we check if we are sharing whiteboard
1631
+ // There is no concept of local/remote share for whiteboard
1632
+ // It does not matter who requested to share the whiteboard, everyone gets the same view
1633
+ else if (whiteboardShare.disposition === _constants.FLOOR_ACTION.GRANTED) {
1634
+ // WHITEBOARD - sharing whiteboard
1635
+ newShareStatus = _constants.SHARE_STATUS.WHITEBOARD_SHARE_ACTIVE;
1636
+ } // or if content share is either released or null and whiteboard share is either released or null, no one is sharing
1637
+ else if ((previousContentShare && contentShare.disposition === _constants.FLOOR_ACTION.RELEASED || contentShare.disposition === null) && (previousWhiteboardShare && whiteboardShare.disposition === _constants.FLOOR_ACTION.RELEASED || whiteboardShare.disposition === null)) {
1612
1638
  newShareStatus = _constants.SHARE_STATUS.NO_SHARE;
1613
1639
  }
1614
1640
 
@@ -1636,6 +1662,14 @@ var Meeting = /*#__PURE__*/function (_StatelessWebexPlugin) {
1636
1662
 
1637
1663
  break;
1638
1664
 
1665
+ case _constants.SHARE_STATUS.WHITEBOARD_SHARE_ACTIVE:
1666
+ _triggerProxy.default.trigger(_this10, {
1667
+ file: 'meeting/index',
1668
+ function: 'stopWhiteboardShare'
1669
+ }, _constants.EVENT_TRIGGERS.MEETING_STOPPED_SHARING_WHITEBOARD);
1670
+
1671
+ break;
1672
+
1639
1673
  case _constants.SHARE_STATUS.NO_SHARE:
1640
1674
  // nothing to do
1641
1675
  break;
@@ -1655,20 +1689,20 @@ var Meeting = /*#__PURE__*/function (_StatelessWebexPlugin) {
1655
1689
  file: 'meetings/index',
1656
1690
  function: 'remoteShare'
1657
1691
  }, _constants.EVENT_TRIGGERS.MEETING_STARTED_SHARING_REMOTE, {
1658
- memberId: contentId
1692
+ memberId: contentShare.beneficiaryId
1659
1693
  });
1660
1694
  }; // if a remote participant is stealing the presentation from us
1661
1695
 
1662
1696
 
1663
- if ((_this10$mediaProperti2 = _this10.mediaProperties.mediaDirection) !== null && _this10$mediaProperti2 !== void 0 && _this10$mediaProperti2.sendShare) {
1697
+ if (!((_this10$mediaProperti2 = _this10.mediaProperties.mediaDirection) !== null && _this10$mediaProperti2 !== void 0 && _this10$mediaProperti2.sendShare) || oldShareStatus === _constants.SHARE_STATUS.WHITEBOARD_SHARE_ACTIVE) {
1698
+ sendStartedSharingRemote();
1699
+ } else {
1664
1700
  _this10.updateShare({
1665
1701
  sendShare: false,
1666
1702
  receiveShare: _this10.mediaProperties.mediaDirection.receiveShare
1667
1703
  }).finally(function () {
1668
1704
  sendStartedSharingRemote();
1669
1705
  });
1670
- } else {
1671
- sendStartedSharingRemote();
1672
1706
  }
1673
1707
 
1674
1708
  break;
@@ -1687,6 +1721,22 @@ var Meeting = /*#__PURE__*/function (_StatelessWebexPlugin) {
1687
1721
 
1688
1722
  break;
1689
1723
 
1724
+ case _constants.SHARE_STATUS.WHITEBOARD_SHARE_ACTIVE:
1725
+ _triggerProxy.default.trigger(_this10, {
1726
+ file: 'meeting/index',
1727
+ function: 'startWhiteboardShare'
1728
+ }, _constants.EVENT_TRIGGERS.MEETING_STARTED_SHARING_WHITEBOARD, {
1729
+ resourceUrl: whiteboardShare.resourceUrl,
1730
+ memberId: whiteboardShare.beneficiaryId
1731
+ });
1732
+
1733
+ _metrics.default.postEvent({
1734
+ event: _config.eventType.WHITEBOARD_SHARE_FLOOR_GRANTED,
1735
+ meeting: _this10
1736
+ });
1737
+
1738
+ break;
1739
+
1690
1740
  case _constants.SHARE_STATUS.NO_SHARE:
1691
1741
  // nothing to do
1692
1742
  break;
@@ -1703,7 +1753,24 @@ var Meeting = /*#__PURE__*/function (_StatelessWebexPlugin) {
1703
1753
  file: 'meetings/index',
1704
1754
  function: 'remoteShare'
1705
1755
  }, _constants.EVENT_TRIGGERS.MEETING_STARTED_SHARING_REMOTE, {
1706
- memberId: contentId
1756
+ memberId: contentShare.beneficiaryId
1757
+ });
1758
+
1759
+ _this10.members.locusMediaSharesUpdate(payload);
1760
+ } else if (newShareStatus === _constants.SHARE_STATUS.WHITEBOARD_SHARE_ACTIVE) {
1761
+ // if we got here, then some remote participant has stolen
1762
+ // the presentation from another remote participant
1763
+ _triggerProxy.default.trigger(_this10, {
1764
+ file: 'meeting/index',
1765
+ function: 'startWhiteboardShare'
1766
+ }, _constants.EVENT_TRIGGERS.MEETING_STARTED_SHARING_WHITEBOARD, {
1767
+ resourceUrl: whiteboardShare.resourceUrl,
1768
+ memberId: whiteboardShare.beneficiaryId
1769
+ });
1770
+
1771
+ _metrics.default.postEvent({
1772
+ event: _config.eventType.WHITEBOARD_SHARE_FLOOR_GRANTED,
1773
+ meeting: _this10
1707
1774
  });
1708
1775
 
1709
1776
  _this10.members.locusMediaSharesUpdate(payload);
@@ -4779,6 +4846,115 @@ var Meeting = /*#__PURE__*/function (_StatelessWebexPlugin) {
4779
4846
  return _promise.default.reject(error);
4780
4847
  });
4781
4848
  }
4849
+ /**
4850
+ * Start sharing whiteboard given channelUrl
4851
+ * @param {string} channelUrl whiteboard url
4852
+ * @param {String} resourceToken token created by authorize media injector
4853
+ * @returns {Promise}
4854
+ * @public
4855
+ * @memberof Meeting
4856
+ */
4857
+
4858
+ }, {
4859
+ key: "startWhiteboardShare",
4860
+ value: function startWhiteboardShare(channelUrl, resourceToken) {
4861
+ var _this46 = this;
4862
+
4863
+ var whiteboard = this.locusInfo.mediaShares.find(function (element) {
4864
+ return element.name === 'whiteboard';
4865
+ });
4866
+
4867
+ if (!channelUrl) {
4868
+ return _promise.default.reject(new _parameter.default('Cannot share without channelUrl.'));
4869
+ }
4870
+
4871
+ if (whiteboard) {
4872
+ _metrics.default.postEvent({
4873
+ event: _config.eventType.WHITEBOARD_SHARE_INITIATED,
4874
+ meeting: this
4875
+ });
4876
+
4877
+ var body = {
4878
+ disposition: _constants.FLOOR_ACTION.GRANTED,
4879
+ personUrl: this.locusInfo.self.url,
4880
+ deviceUrl: this.deviceUrl,
4881
+ uri: whiteboard.url,
4882
+ resourceUrl: channelUrl
4883
+ };
4884
+
4885
+ if (resourceToken) {
4886
+ body.resourceToken = resourceToken;
4887
+ }
4888
+
4889
+ return this.meetingRequest.changeMeetingFloor(body).then(function () {
4890
+ _this46.isSharing = false;
4891
+ return _promise.default.resolve();
4892
+ }).catch(function (error) {
4893
+ _loggerProxy.default.logger.error('Meeting:index#startWhiteboardShare --> Error ', error);
4894
+
4895
+ _metrics.default.sendOperationalMetric(_constants.METRICS_OPERATIONAL_MEASURES.MEETING_START_WHITEBOARD_SHARE_FAILURE, {
4896
+ correlation_id: _this46.correlationId,
4897
+ locus_id: _this46.locusUrl.split('/').pop(),
4898
+ reason: error.message,
4899
+ stack: error.stack,
4900
+ board: {
4901
+ channelUrl: channelUrl
4902
+ }
4903
+ });
4904
+
4905
+ return _promise.default.reject(error);
4906
+ });
4907
+ }
4908
+
4909
+ return _promise.default.reject(new _parameter.default('Cannot share without whiteboard.'));
4910
+ }
4911
+ /**
4912
+ * Stop sharing whiteboard given channelUrl
4913
+ * @param {string} channelUrl whiteboard url
4914
+ * @returns {Promise}
4915
+ * @public
4916
+ * @memberof Meeting
4917
+ */
4918
+
4919
+ }, {
4920
+ key: "stopWhiteboardShare",
4921
+ value: function stopWhiteboardShare(channelUrl) {
4922
+ var _this47 = this;
4923
+
4924
+ var whiteboard = this.locusInfo.mediaShares.find(function (element) {
4925
+ return element.name === 'whiteboard';
4926
+ });
4927
+
4928
+ if (whiteboard) {
4929
+ _metrics.default.postEvent({
4930
+ event: _config.eventType.WHITEBOARD_SHARE_STOPPED,
4931
+ meeting: this
4932
+ });
4933
+
4934
+ return this.meetingRequest.changeMeetingFloor({
4935
+ disposition: _constants.FLOOR_ACTION.RELEASED,
4936
+ personUrl: this.locusInfo.self.url,
4937
+ deviceUrl: this.deviceUrl,
4938
+ uri: whiteboard.url
4939
+ }).catch(function (error) {
4940
+ _loggerProxy.default.logger.error('Meeting:index#stopWhiteboardShare --> Error ', error);
4941
+
4942
+ _metrics.default.sendOperationalMetric(_constants.METRICS_OPERATIONAL_MEASURES.STOP_WHITEBOARD_SHARE_FAILURE, {
4943
+ correlation_id: _this47.correlationId,
4944
+ locus_id: _this47.locusUrl.split('/').pop(),
4945
+ reason: error.message,
4946
+ stack: error.stack,
4947
+ board: {
4948
+ channelUrl: channelUrl
4949
+ }
4950
+ });
4951
+
4952
+ return _promise.default.reject(error);
4953
+ }).finally(function () {});
4954
+ }
4955
+
4956
+ return _promise.default.reject(new _parameter.default('Cannot stop share without whiteboard.'));
4957
+ }
4782
4958
  /**
4783
4959
  * Start sharing content with server
4784
4960
  * @returns {Promise} see #meetingRequest.changeMeetingFloor
@@ -4789,7 +4965,7 @@ var Meeting = /*#__PURE__*/function (_StatelessWebexPlugin) {
4789
4965
  }, {
4790
4966
  key: "share",
4791
4967
  value: function share() {
4792
- var _this46 = this;
4968
+ var _this48 = this;
4793
4969
 
4794
4970
  var content = this.locusInfo.mediaShares.find(function (element) {
4795
4971
  return element.name === _constants.CONTENT;
@@ -4808,14 +4984,14 @@ var Meeting = /*#__PURE__*/function (_StatelessWebexPlugin) {
4808
4984
  uri: content.url,
4809
4985
  resourceUrl: this.resourceUrl
4810
4986
  }).then(function () {
4811
- _this46.isSharing = true;
4987
+ _this48.isSharing = true;
4812
4988
  return _promise.default.resolve();
4813
4989
  }).catch(function (error) {
4814
4990
  _loggerProxy.default.logger.error('Meeting:index#share --> Error ', error);
4815
4991
 
4816
4992
  _metrics.default.sendOperationalMetric(_constants.METRICS_OPERATIONAL_MEASURES.MEETING_SHARE_FAILURE, {
4817
- correlation_id: _this46.correlationId,
4818
- locus_id: _this46.locusUrl.split('/').pop(),
4993
+ correlation_id: _this48.correlationId,
4994
+ locus_id: _this48.locusUrl.split('/').pop(),
4819
4995
  reason: error.message,
4820
4996
  stack: error.stack
4821
4997
  });
@@ -4854,7 +5030,7 @@ var Meeting = /*#__PURE__*/function (_StatelessWebexPlugin) {
4854
5030
  }, {
4855
5031
  key: "stopFloorRequest",
4856
5032
  value: function stopFloorRequest() {
4857
- var _this47 = this;
5033
+ var _this49 = this;
4858
5034
 
4859
5035
  var content = this.locusInfo.mediaShares.find(function (element) {
4860
5036
  return element.name === _constants.CONTENT;
@@ -4868,7 +5044,7 @@ var Meeting = /*#__PURE__*/function (_StatelessWebexPlugin) {
4868
5044
 
4869
5045
  _media.default.stopTracks(this.mediaProperties.shareTrack);
4870
5046
 
4871
- if (this.contentId !== this.selfId) {
5047
+ if (content.floor.beneficiary.id !== this.selfId) {
4872
5048
  // remote participant started sharing and caused our sharing to stop, we don't want to send any floor action request in that case
4873
5049
  this.isSharing = false;
4874
5050
  return _promise.default.resolve();
@@ -4884,15 +5060,15 @@ var Meeting = /*#__PURE__*/function (_StatelessWebexPlugin) {
4884
5060
  _loggerProxy.default.logger.error('Meeting:index#stopFloorRequest --> Error ', error);
4885
5061
 
4886
5062
  _metrics.default.sendOperationalMetric(_constants.METRICS_OPERATIONAL_MEASURES.STOP_FLOOR_REQUEST_FAILURE, {
4887
- correlation_id: _this47.correlationId,
4888
- locus_id: _this47.locusUrl.split('/').pop(),
5063
+ correlation_id: _this49.correlationId,
5064
+ locus_id: _this49.locusUrl.split('/').pop(),
4889
5065
  reason: error.message,
4890
5066
  stack: error.stack
4891
5067
  });
4892
5068
 
4893
5069
  return _promise.default.reject(error);
4894
5070
  }).finally(function () {
4895
- _this47.isSharing = false;
5071
+ _this49.isSharing = false;
4896
5072
  });
4897
5073
  }
4898
5074
 
@@ -5028,7 +5204,7 @@ var Meeting = /*#__PURE__*/function (_StatelessWebexPlugin) {
5028
5204
  }, {
5029
5205
  key: "changeVideoLayout",
5030
5206
  value: function changeVideoLayout(layoutType) {
5031
- var _this48 = this;
5207
+ var _this50 = this;
5032
5208
 
5033
5209
  var renderInfo = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
5034
5210
  var main = renderInfo.main,
@@ -5091,7 +5267,7 @@ var Meeting = /*#__PURE__*/function (_StatelessWebexPlugin) {
5091
5267
  content: layoutInfo.content
5092
5268
  }).then(function (response) {
5093
5269
  if (response && response.body && response.body.locus) {
5094
- _this48.locusInfo.onFullLocus(response.body.locus);
5270
+ _this50.locusInfo.onFullLocus(response.body.locus);
5095
5271
  }
5096
5272
  }).catch(function (error) {
5097
5273
  _loggerProxy.default.logger.error('Meeting:index#changeVideoLayout --> Error ', error);
@@ -5108,7 +5284,7 @@ var Meeting = /*#__PURE__*/function (_StatelessWebexPlugin) {
5108
5284
  }, {
5109
5285
  key: "setLocalVideoQuality",
5110
5286
  value: function setLocalVideoQuality(level) {
5111
- var _this49 = this;
5287
+ var _this51 = this;
5112
5288
 
5113
5289
  _loggerProxy.default.logger.log("Meeting:index#setLocalVideoQuality --> Setting quality to ".concat(level));
5114
5290
 
@@ -5138,7 +5314,7 @@ var Meeting = /*#__PURE__*/function (_StatelessWebexPlugin) {
5138
5314
  var _ref11 = (0, _slicedToArray2.default)(_ref10, 1),
5139
5315
  localStream = _ref11[0];
5140
5316
 
5141
- return _this49.updateVideo({
5317
+ return _this51.updateVideo({
5142
5318
  sendVideo: true,
5143
5319
  receiveVideo: true,
5144
5320
  stream: localStream
@@ -5186,7 +5362,7 @@ var Meeting = /*#__PURE__*/function (_StatelessWebexPlugin) {
5186
5362
  }, {
5187
5363
  key: "setMeetingQuality",
5188
5364
  value: function setMeetingQuality(level) {
5189
- var _this50 = this;
5365
+ var _this52 = this;
5190
5366
 
5191
5367
  _loggerProxy.default.logger.log("Meeting:index#setMeetingQuality --> Setting quality to ".concat(level));
5192
5368
 
@@ -5211,18 +5387,18 @@ var Meeting = /*#__PURE__*/function (_StatelessWebexPlugin) {
5211
5387
  receiveVideo = _this$mediaProperties4.receiveVideo,
5212
5388
  sendVideo = _this$mediaProperties4.sendVideo;
5213
5389
  return (sendVideo ? this.setLocalVideoQuality(level) : _promise.default.resolve()).then(function () {
5214
- return receiveAudio || receiveVideo ? _this50.setRemoteQualityLevel(level) : _promise.default.resolve();
5390
+ return receiveAudio || receiveVideo ? _this52.setRemoteQualityLevel(level) : _promise.default.resolve();
5215
5391
  }).catch(function (error) {
5216
5392
  // From troubleshooting it seems that the stream itself doesn't change the max-fs if the peer connection isn't stable
5217
- _this50.mediaProperties.setLocalQualityLevel(previousLevel.local);
5393
+ _this52.mediaProperties.setLocalQualityLevel(previousLevel.local);
5218
5394
 
5219
- _this50.mediaProperties.setRemoteQualityLevel(previousLevel.remote);
5395
+ _this52.mediaProperties.setRemoteQualityLevel(previousLevel.remote);
5220
5396
 
5221
5397
  _loggerProxy.default.logger.error("Meeting:index#setMeetingQuality --> ".concat(error.message));
5222
5398
 
5223
5399
  _metrics.default.sendOperationalMetric(_constants.METRICS_OPERATIONAL_MEASURES.SET_MEETING_QUALITY_FAILURE, {
5224
- correlation_id: _this50.correlationId,
5225
- locus_id: _this50.locusUrl.split('/').pop(),
5400
+ correlation_id: _this52.correlationId,
5401
+ locus_id: _this52.locusUrl.split('/').pop(),
5226
5402
  reason: error.message,
5227
5403
  stack: error.stack
5228
5404
  }, {
@@ -5246,7 +5422,7 @@ var Meeting = /*#__PURE__*/function (_StatelessWebexPlugin) {
5246
5422
  }, {
5247
5423
  key: "shareScreen",
5248
5424
  value: function shareScreen() {
5249
- var _this51 = this;
5425
+ var _this53 = this;
5250
5426
 
5251
5427
  var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
5252
5428
 
@@ -5258,9 +5434,9 @@ var Meeting = /*#__PURE__*/function (_StatelessWebexPlugin) {
5258
5434
  }, options);
5259
5435
 
5260
5436
  return _media.default.getDisplayMedia(shareConstraints, this.config).then(function (shareStream) {
5261
- return _this51.updateShare({
5437
+ return _this53.updateShare({
5262
5438
  sendShare: true,
5263
- receiveShare: _this51.mediaProperties.mediaDirection.receiveShare,
5439
+ receiveShare: _this53.mediaProperties.mediaDirection.receiveShare,
5264
5440
  stream: shareStream
5265
5441
  });
5266
5442
  }).catch(function (error) {
@@ -5272,8 +5448,8 @@ var Meeting = /*#__PURE__*/function (_StatelessWebexPlugin) {
5272
5448
  // TODO: The getDisplayMedia errors need to be moved inside `media.getDisplayMedia`
5273
5449
  var metricName = _constants.METRICS_OPERATIONAL_MEASURES.GET_DISPLAY_MEDIA_FAILURE;
5274
5450
  var data = {
5275
- correlation_id: _this51.correlationId,
5276
- locus_id: _this51.locusUrl.split('/').pop(),
5451
+ correlation_id: _this53.correlationId,
5452
+ locus_id: _this53.locusUrl.split('/').pop(),
5277
5453
  reason: error.message,
5278
5454
  stack: error.stack
5279
5455
  };
@@ -5393,6 +5569,39 @@ var Meeting = /*#__PURE__*/function (_StatelessWebexPlugin) {
5393
5569
  var end = this["endSetupDelay".concat(typeMedia)];
5394
5570
  return start && end ? end - start : undefined;
5395
5571
  }
5572
+ /**
5573
+ * @param {string} typeMedia 'audio' or 'video'
5574
+ * @returns {undefined}
5575
+ */
5576
+
5577
+ }, {
5578
+ key: "setStartSendingMediaDelay",
5579
+ value: function setStartSendingMediaDelay(typeMedia) {
5580
+ this["startSendingMediaDelay".concat(typeMedia)] = performance.now();
5581
+ this["endSendingMediaDelay".concat(typeMedia)] = undefined;
5582
+ }
5583
+ /**
5584
+ * @param {string} typeMedia 'audio' or 'video'
5585
+ * @returns {undefined}
5586
+ */
5587
+
5588
+ }, {
5589
+ key: "setEndSendingMediaDelay",
5590
+ value: function setEndSendingMediaDelay(typeMedia) {
5591
+ this["endSendingMediaDelay".concat(typeMedia)] = performance.now();
5592
+ }
5593
+ /**
5594
+ * @param {string} typeMedia 'audio' or 'video'
5595
+ * @returns {string} duration between join response and first media tx
5596
+ */
5597
+
5598
+ }, {
5599
+ key: "getSendingMediaDelayDuration",
5600
+ value: function getSendingMediaDelayDuration(typeMedia) {
5601
+ var start = this["startSendingMediaDelay".concat(typeMedia)];
5602
+ var end = this["endSendingMediaDelay".concat(typeMedia)];
5603
+ return start && end ? end - start : undefined;
5604
+ }
5396
5605
  }]);
5397
5606
  return Meeting;
5398
5607
  }(_webexCore.StatelessWebexPlugin);