@webex/plugin-meetings 3.1.0 → 3.2.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 (205) hide show
  1. package/dist/breakouts/breakout.js +1 -1
  2. package/dist/breakouts/index.js +1 -1
  3. package/dist/common/errors/reconnection-not-started.js +46 -0
  4. package/dist/common/errors/reconnection-not-started.js.map +1 -0
  5. package/dist/constants.js +16 -5
  6. package/dist/constants.js.map +1 -1
  7. package/dist/index.js +80 -0
  8. package/dist/index.js.map +1 -1
  9. package/dist/interpretation/index.js +1 -1
  10. package/dist/interpretation/siLanguage.js +1 -1
  11. package/dist/locus-info/controlsUtils.js +7 -1
  12. package/dist/locus-info/controlsUtils.js.map +1 -1
  13. package/dist/locus-info/index.js +10 -0
  14. package/dist/locus-info/index.js.map +1 -1
  15. package/dist/media/properties.js +102 -57
  16. package/dist/media/properties.js.map +1 -1
  17. package/dist/mediaQualityMetrics/config.js +10 -10
  18. package/dist/mediaQualityMetrics/config.js.map +1 -1
  19. package/dist/meeting/in-meeting-actions.js +6 -0
  20. package/dist/meeting/in-meeting-actions.js.map +1 -1
  21. package/dist/meeting/index.js +564 -475
  22. package/dist/meeting/index.js.map +1 -1
  23. package/dist/meeting/locusMediaRequest.js +27 -0
  24. package/dist/meeting/locusMediaRequest.js.map +1 -1
  25. package/dist/meeting/util.js +9 -16
  26. package/dist/meeting/util.js.map +1 -1
  27. package/dist/meeting/voicea-meeting.js +37 -49
  28. package/dist/meeting/voicea-meeting.js.map +1 -1
  29. package/dist/meeting-info/util.js +304 -267
  30. package/dist/meeting-info/util.js.map +1 -1
  31. package/dist/meeting-info/utilv2.js +334 -298
  32. package/dist/meeting-info/utilv2.js.map +1 -1
  33. package/dist/meetings/index.js +12 -28
  34. package/dist/meetings/index.js.map +1 -1
  35. package/dist/reachability/index.js +88 -9
  36. package/dist/reachability/index.js.map +1 -1
  37. package/dist/reconnection-manager/index.js +138 -109
  38. package/dist/reconnection-manager/index.js.map +1 -1
  39. package/dist/roap/request.js +3 -27
  40. package/dist/roap/request.js.map +1 -1
  41. package/dist/statsAnalyzer/index.js +8 -2
  42. package/dist/statsAnalyzer/index.js.map +1 -1
  43. package/dist/statsAnalyzer/mqaUtil.js +17 -0
  44. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  45. package/dist/types/annotation/annotation.types.d.ts +42 -0
  46. package/dist/types/annotation/constants.d.ts +31 -0
  47. package/dist/types/annotation/index.d.ts +117 -0
  48. package/dist/types/breakouts/breakout.d.ts +8 -0
  49. package/dist/types/breakouts/collection.d.ts +5 -0
  50. package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
  51. package/dist/types/breakouts/events.d.ts +8 -0
  52. package/dist/types/breakouts/index.d.ts +5 -0
  53. package/dist/types/breakouts/request.d.ts +22 -0
  54. package/dist/types/breakouts/utils.d.ts +15 -0
  55. package/dist/types/common/browser-detection.d.ts +9 -0
  56. package/dist/types/common/collection.d.ts +48 -0
  57. package/dist/types/common/config.d.ts +2 -0
  58. package/dist/types/common/errors/captcha-error.d.ts +15 -0
  59. package/dist/types/common/errors/intent-to-join.d.ts +16 -0
  60. package/dist/types/common/errors/join-meeting.d.ts +17 -0
  61. package/dist/types/common/errors/media.d.ts +15 -0
  62. package/dist/types/common/errors/no-meeting-info.d.ts +14 -0
  63. package/dist/types/common/errors/parameter.d.ts +15 -0
  64. package/dist/types/common/errors/password-error.d.ts +15 -0
  65. package/dist/types/common/errors/permission.d.ts +14 -0
  66. package/dist/types/common/errors/reclaim-host-role-errors.d.ts +60 -0
  67. package/dist/types/common/errors/reconnection-not-started.d.ts +13 -0
  68. package/dist/types/common/errors/reconnection.d.ts +15 -0
  69. package/dist/types/common/errors/stats.d.ts +15 -0
  70. package/dist/types/common/errors/webex-errors.d.ts +93 -0
  71. package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
  72. package/dist/types/common/events/events-scope.d.ts +17 -0
  73. package/dist/types/common/events/events.d.ts +12 -0
  74. package/dist/types/common/events/trigger-proxy.d.ts +2 -0
  75. package/dist/types/common/events/util.d.ts +2 -0
  76. package/dist/types/common/logs/logger-config.d.ts +2 -0
  77. package/dist/types/common/logs/logger-proxy.d.ts +2 -0
  78. package/dist/types/common/logs/request.d.ts +36 -0
  79. package/dist/types/common/queue.d.ts +34 -0
  80. package/dist/types/config.d.ts +73 -0
  81. package/dist/types/constants.d.ts +1098 -0
  82. package/dist/types/controls-options-manager/constants.d.ts +4 -0
  83. package/dist/types/controls-options-manager/enums.d.ts +15 -0
  84. package/dist/types/controls-options-manager/index.d.ts +136 -0
  85. package/dist/types/controls-options-manager/types.d.ts +43 -0
  86. package/dist/types/controls-options-manager/util.d.ts +1 -0
  87. package/dist/types/index.d.ts +19 -0
  88. package/dist/types/interceptors/index.d.ts +2 -0
  89. package/dist/types/interceptors/locusRetry.d.ts +27 -0
  90. package/dist/types/interpretation/collection.d.ts +5 -0
  91. package/dist/types/interpretation/index.d.ts +5 -0
  92. package/dist/types/interpretation/siLanguage.d.ts +5 -0
  93. package/dist/types/locus-info/controlsUtils.d.ts +2 -0
  94. package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
  95. package/dist/types/locus-info/fullState.d.ts +2 -0
  96. package/dist/types/locus-info/hostUtils.d.ts +2 -0
  97. package/dist/types/locus-info/index.d.ts +322 -0
  98. package/dist/types/locus-info/infoUtils.d.ts +2 -0
  99. package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
  100. package/dist/types/locus-info/parser.d.ts +272 -0
  101. package/dist/types/locus-info/selfUtils.d.ts +2 -0
  102. package/dist/types/media/MediaConnectionAwaiter.d.ts +61 -0
  103. package/dist/types/media/index.d.ts +34 -0
  104. package/dist/types/media/properties.d.ts +117 -0
  105. package/dist/types/media/util.d.ts +2 -0
  106. package/dist/types/mediaQualityMetrics/config.d.ts +247 -0
  107. package/dist/types/meeting/in-meeting-actions.d.ts +173 -0
  108. package/dist/types/meeting/index.d.ts +1832 -0
  109. package/dist/types/meeting/locusMediaRequest.d.ts +75 -0
  110. package/dist/types/meeting/muteState.d.ts +178 -0
  111. package/dist/types/meeting/request.d.ts +295 -0
  112. package/dist/types/meeting/request.type.d.ts +11 -0
  113. package/dist/types/meeting/state.d.ts +9 -0
  114. package/dist/types/meeting/util.d.ts +122 -0
  115. package/dist/types/meeting/voicea-meeting.d.ts +17 -0
  116. package/dist/types/meeting-info/collection.d.ts +20 -0
  117. package/dist/types/meeting-info/index.d.ts +69 -0
  118. package/dist/types/meeting-info/meeting-info-v2.d.ts +123 -0
  119. package/dist/types/meeting-info/request.d.ts +22 -0
  120. package/dist/types/meeting-info/util.d.ts +49 -0
  121. package/dist/types/meeting-info/utilv2.d.ts +65 -0
  122. package/dist/types/meetings/collection.d.ts +40 -0
  123. package/dist/types/meetings/index.d.ts +383 -0
  124. package/dist/types/meetings/meetings.types.d.ts +4 -0
  125. package/dist/types/meetings/request.d.ts +27 -0
  126. package/dist/types/meetings/util.d.ts +18 -0
  127. package/dist/types/member/index.d.ts +160 -0
  128. package/dist/types/member/types.d.ts +32 -0
  129. package/dist/types/member/util.d.ts +2 -0
  130. package/dist/types/members/collection.d.ts +29 -0
  131. package/dist/types/members/index.d.ts +353 -0
  132. package/dist/types/members/request.d.ts +114 -0
  133. package/dist/types/members/types.d.ts +25 -0
  134. package/dist/types/members/util.d.ts +215 -0
  135. package/dist/types/metrics/constants.d.ts +70 -0
  136. package/dist/types/metrics/index.d.ts +45 -0
  137. package/dist/types/multistream/mediaRequestManager.d.ts +119 -0
  138. package/dist/types/multistream/receiveSlot.d.ts +68 -0
  139. package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
  140. package/dist/types/multistream/remoteMedia.d.ts +72 -0
  141. package/dist/types/multistream/remoteMediaGroup.d.ts +49 -0
  142. package/dist/types/multistream/remoteMediaManager.d.ts +300 -0
  143. package/dist/types/multistream/sendSlotManager.d.ts +69 -0
  144. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  145. package/dist/types/personal-meeting-room/index.d.ts +47 -0
  146. package/dist/types/personal-meeting-room/request.d.ts +14 -0
  147. package/dist/types/personal-meeting-room/util.d.ts +2 -0
  148. package/dist/types/reachability/clusterReachability.d.ts +110 -0
  149. package/dist/types/reachability/index.d.ts +120 -0
  150. package/dist/types/reachability/request.d.ts +39 -0
  151. package/dist/types/reachability/util.d.ts +15 -0
  152. package/dist/types/reactions/constants.d.ts +3 -0
  153. package/dist/types/reactions/reactions.d.ts +4 -0
  154. package/dist/types/reactions/reactions.type.d.ts +52 -0
  155. package/dist/types/reconnection-manager/index.d.ts +126 -0
  156. package/dist/types/recording-controller/enums.d.ts +7 -0
  157. package/dist/types/recording-controller/index.d.ts +207 -0
  158. package/dist/types/recording-controller/util.d.ts +14 -0
  159. package/dist/types/roap/index.d.ts +86 -0
  160. package/dist/types/roap/request.d.ts +39 -0
  161. package/dist/types/roap/turnDiscovery.d.ts +155 -0
  162. package/dist/types/rtcMetrics/constants.d.ts +4 -0
  163. package/dist/types/rtcMetrics/index.d.ts +61 -0
  164. package/dist/types/statsAnalyzer/global.d.ts +36 -0
  165. package/dist/types/statsAnalyzer/index.d.ts +217 -0
  166. package/dist/types/statsAnalyzer/mqaUtil.d.ts +48 -0
  167. package/dist/types/transcription/index.d.ts +64 -0
  168. package/dist/types/webinar/collection.d.ts +16 -0
  169. package/dist/types/webinar/index.d.ts +5 -0
  170. package/dist/webinar/index.js +1 -1
  171. package/package.json +22 -22
  172. package/src/common/errors/reconnection-not-started.ts +25 -0
  173. package/src/constants.ts +14 -5
  174. package/src/index.ts +30 -0
  175. package/src/locus-info/controlsUtils.ts +11 -0
  176. package/src/locus-info/index.ts +16 -0
  177. package/src/media/properties.ts +67 -15
  178. package/src/mediaQualityMetrics/config.ts +13 -7
  179. package/src/meeting/in-meeting-actions.ts +12 -0
  180. package/src/meeting/index.ts +144 -107
  181. package/src/meeting/locusMediaRequest.ts +31 -0
  182. package/src/meeting/util.ts +9 -16
  183. package/src/meeting/voicea-meeting.ts +44 -46
  184. package/src/meeting-info/util.ts +241 -233
  185. package/src/meeting-info/utilv2.ts +250 -244
  186. package/src/meetings/index.ts +15 -27
  187. package/src/reachability/index.ts +60 -0
  188. package/src/reconnection-manager/index.ts +128 -105
  189. package/src/roap/request.ts +1 -24
  190. package/src/statsAnalyzer/index.ts +10 -3
  191. package/src/statsAnalyzer/mqaUtil.ts +23 -0
  192. package/test/unit/spec/locus-info/controlsUtils.js +20 -0
  193. package/test/unit/spec/locus-info/index.js +21 -0
  194. package/test/unit/spec/media/properties.ts +145 -140
  195. package/test/unit/spec/meeting/in-meeting-actions.ts +6 -0
  196. package/test/unit/spec/meeting/index.js +271 -105
  197. package/test/unit/spec/meeting/locusMediaRequest.ts +49 -0
  198. package/test/unit/spec/meeting/utils.js +3 -10
  199. package/test/unit/spec/meeting/voicea-meeting.ts +5 -14
  200. package/test/unit/spec/meetings/index.js +59 -17
  201. package/test/unit/spec/reachability/index.ts +266 -0
  202. package/test/unit/spec/reconnection-manager/index.js +127 -39
  203. package/test/unit/spec/roap/request.ts +0 -37
  204. package/test/unit/spec/stats-analyzer/index.js +100 -8
  205. package/src/common/errors/reconnection-in-progress.ts +0 -8
@@ -106,6 +106,12 @@ describe('LocusMediaRequest.send()', () => {
106
106
  },
107
107
  });
108
108
 
109
+ mockWebex.internal = {
110
+ newMetrics: {
111
+ submitClientEvent: sinon.stub()
112
+ },
113
+ };
114
+
109
115
  locusMediaRequest = new LocusMediaRequest({
110
116
  device: {
111
117
  url: 'deviceUrl',
@@ -113,6 +119,7 @@ describe('LocusMediaRequest.send()', () => {
113
119
  regionCode: 'regionCode',
114
120
  },
115
121
  correlationId: 'correlationId',
122
+ meetingId: 'meetingId',
116
123
  preferTranscoding: true,
117
124
  }, {
118
125
  parent: mockWebex,
@@ -134,6 +141,27 @@ describe('LocusMediaRequest.send()', () => {
134
141
  await sendRoapMessage('OFFER');
135
142
 
136
143
  webexRequestStub.resetHistory();
144
+ mockWebex.internal.newMetrics.submitClientEvent.resetHistory();
145
+ }
146
+
147
+ const checkMetrics = (expectedMetrics: boolean = true) => {
148
+ if (expectedMetrics) {
149
+ assert.calledWith(mockWebex.internal.newMetrics.submitClientEvent, {
150
+ name: 'client.locus.media.request',
151
+ options: {
152
+ meetingId: 'meetingId',
153
+ },
154
+ });
155
+
156
+ assert.calledWith(mockWebex.internal.newMetrics.submitClientEvent, {
157
+ name: 'client.locus.media.response',
158
+ options: {
159
+ meetingId: 'meetingId',
160
+ },
161
+ });
162
+ } else {
163
+ assert.notCalled(mockWebex.internal.newMetrics.submitClientEvent);
164
+ }
137
165
  }
138
166
 
139
167
  it('sends a roap message', async () => {
@@ -146,6 +174,21 @@ describe('LocusMediaRequest.send()', () => {
146
174
  uri: 'fakeMeetingSelfUrl/media',
147
175
  body: createExpectedRoapBody('OFFER', {audioMuted: true, videoMuted: true}),
148
176
  });
177
+
178
+ checkMetrics();
179
+ });
180
+
181
+ it('sends correct metric event when roap message fails', async () => {
182
+ webexRequestStub.rejects({code: 300, message: 'fake error'});
183
+ await assert.isRejected(sendRoapMessage('OFFER'));
184
+
185
+ assert.calledWith(mockWebex.internal.newMetrics.submitClientEvent, {
186
+ name: 'client.locus.media.response',
187
+ options: {
188
+ meetingId: 'meetingId',
189
+ rawError: {code: 300, message: 'fake error'},
190
+ },
191
+ });
149
192
  });
150
193
 
151
194
  it('sends a local mute request', async () => {
@@ -160,6 +203,8 @@ describe('LocusMediaRequest.send()', () => {
160
203
  uri: 'fakeMeetingSelfUrl/media',
161
204
  body: createExpectedLocalMuteBody({audioMuted: false, videoMuted: false}),
162
205
  });
206
+
207
+ checkMetrics(false);
163
208
  });
164
209
 
165
210
  it('sends a local mute request with sequence', async () => {
@@ -207,6 +252,7 @@ describe('LocusMediaRequest.send()', () => {
207
252
  body: createExpectedLocalMuteBody({audioMuted: false, videoMuted: true}),
208
253
  });
209
254
 
255
+ checkMetrics(false);
210
256
  });
211
257
 
212
258
  it('sends a local mute request with the last audio/video mute values', async () => {
@@ -225,6 +271,7 @@ describe('LocusMediaRequest.send()', () => {
225
271
  body: createExpectedLocalMuteBody({audioMuted: true, videoMuted: false}),
226
272
  });
227
273
 
274
+ checkMetrics(false);
228
275
  });
229
276
 
230
277
  it('sends only roap when roap and local mute are requested', async () => {
@@ -242,6 +289,8 @@ describe('LocusMediaRequest.send()', () => {
242
289
  uri: 'fakeMeetingSelfUrl/media',
243
290
  body: createExpectedRoapBody('OFFER', {audioMuted: true, videoMuted: false}),
244
291
  });
292
+
293
+ checkMetrics();
245
294
  });
246
295
 
247
296
  describe('queueing', () => {
@@ -370,16 +370,6 @@ describe('plugin-meetings', () => {
370
370
  sequence: {},
371
371
  type: 'LocalMute',
372
372
  });
373
-
374
- assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
375
- name: 'client.locus.media.request',
376
- options: {meetingId: meeting.id},
377
- });
378
-
379
- assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
380
- name: 'client.locus.media.response',
381
- options: {meetingId: meeting.id},
382
- });
383
373
  });
384
374
  });
385
375
 
@@ -765,6 +755,9 @@ describe('plugin-meetings', () => {
765
755
  {functionName: 'canStartTranscribing', displayHint: 'TRANSCRIPTION_CONTROL_START'},
766
756
  {functionName: 'canStopTranscribing', displayHint: 'TRANSCRIPTION_CONTROL_STOP'},
767
757
  {functionName: 'isClosedCaptionActive', displayHint: 'CAPTION_STATUS_ACTIVE'},
758
+ {functionName: 'canStartManualCaption', displayHint: 'MANUAL_CAPTION_START'},
759
+ {functionName: 'canStopManualCaption', displayHint: 'MANUAL_CAPTION_STOP'},
760
+ {functionName: 'isManualCaptionActive', displayHint: 'MANUAL_CAPTION_STATUS_ACTIVE'},
768
761
  {functionName: 'isWebexAssistantActive', displayHint: 'WEBEX_ASSISTANT_STATUS_ACTIVE'},
769
762
  {functionName: 'canViewCaptionPanel', displayHint: 'ENABLE_CAPTION_PANEL'},
770
763
  {functionName: 'isRealTimeTranslationEnabled', displayHint: 'DISPLAY_REAL_TIME_TRANSLATION'},
@@ -101,14 +101,7 @@ describe('plugin-meetings', () => {
101
101
  ],
102
102
  transcript_language_code: "en"
103
103
  }
104
- ],
105
- transcript: {
106
- text: "Don't bother me talking I'm just going to get the transcript data that is interim and I needed if I keep talking, I get the interim data",
107
- csis: [
108
- 1234867712
109
- ],
110
- transcript_language_code: "en"
111
- }
104
+ ]
112
105
  };
113
106
  });
114
107
 
@@ -160,7 +153,6 @@ describe('plugin-meetings', () => {
160
153
  it('should process new final captions correctly', () => {
161
154
  let transcriptData = fakeMeeting.transcription;
162
155
  let transcriptId = fakeVoiceaPayload.transcriptId;
163
- delete fakeVoiceaPayload.transcripts;
164
156
 
165
157
  // Assuming that processNewCaptions is a pure function that doesn't mutate the input but returns a new state
166
158
  processNewCaptions({
@@ -169,7 +161,7 @@ describe('plugin-meetings', () => {
169
161
  });
170
162
 
171
163
  // Check if speaker details are cached if needed
172
- const csisKey = fakeVoiceaPayload.transcript.csis[0];
164
+ const csisKey = fakeVoiceaPayload.transcripts[0].csis[0];
173
165
  const speaker = transcriptData.speakerProxy[csisKey];
174
166
  expect(speaker).to.exist;
175
167
 
@@ -178,6 +170,7 @@ describe('plugin-meetings', () => {
178
170
 
179
171
  //check if the interim caption is removed
180
172
  const oldInterimCaption = transcriptData.captions.find(caption => caption.id === `${transcriptId}_${speaker.speakerId}`);
173
+ console.log(oldInterimCaption);
181
174
  expect(oldInterimCaption).to.not.exist;
182
175
 
183
176
  // Check the final caption data
@@ -186,8 +179,8 @@ describe('plugin-meetings', () => {
186
179
  expect(newCaption).to.include({
187
180
  id: transcriptId,
188
181
  isFinal: fakeVoiceaPayload.isFinal,
189
- text: fakeVoiceaPayload.transcript.text,
190
- currentSpokenLanguage: fakeVoiceaPayload.transcript.transcript_language_code,
182
+ text: fakeVoiceaPayload.transcripts[0].text,
183
+ currentSpokenLanguage: fakeVoiceaPayload.transcripts[0].transcript_language_code,
191
184
  });
192
185
 
193
186
  // Check the speaker data in the new caption
@@ -197,7 +190,6 @@ describe('plugin-meetings', () => {
197
190
  it('should process new interim captions correctly', () => {
198
191
  let transcriptData = fakeMeeting.transcription;
199
192
  let transcriptId = fakeVoiceaPayload.transcriptId;
200
- delete fakeVoiceaPayload.transcript;
201
193
 
202
194
  transcriptData.captions.splice(transcriptData.length - 1, 1);
203
195
  fakeVoiceaPayload.isFinal = false;
@@ -232,7 +224,6 @@ describe('plugin-meetings', () => {
232
224
  it('should process interim captions with an existing one correctly', () => {
233
225
  let transcriptData = fakeMeeting.transcription;
234
226
  let transcriptId = fakeVoiceaPayload.transcriptId;
235
- delete fakeVoiceaPayload.transcript;
236
227
  fakeVoiceaPayload.isFinal = false;
237
228
 
238
229
  processNewCaptions({
@@ -18,6 +18,7 @@ import TriggerProxy from '@webex/plugin-meetings/src/common/events/trigger-proxy
18
18
  import LoggerProxy from '@webex/plugin-meetings/src/common/logs/logger-proxy';
19
19
  import LoggerConfig from '@webex/plugin-meetings/src/common/logs/logger-config';
20
20
  import Meeting, {CallStateForMetrics} from '@webex/plugin-meetings/src/meeting';
21
+ import {Services} from '@webex/webex-core';
21
22
  import MeetingUtil from '@webex/plugin-meetings/src/meeting/util';
22
23
  import Meetings from '@webex/plugin-meetings/src/meetings';
23
24
  import MeetingCollection from '@webex/plugin-meetings/src/meetings/collection';
@@ -75,6 +76,8 @@ describe('plugin-meetings', () => {
75
76
  let test1;
76
77
  let test2;
77
78
  let locusInfo;
79
+ let services;
80
+ let catalog;
78
81
 
79
82
  describe('meetings index', () => {
80
83
  beforeEach(() => {
@@ -93,9 +96,13 @@ describe('plugin-meetings', () => {
93
96
  device: Device,
94
97
  mercury: Mercury,
95
98
  meetings: Meetings,
99
+ services: Services,
96
100
  },
97
101
  });
98
102
 
103
+ services = webex.internal.services;
104
+ catalog = services._getCatalog();
105
+
99
106
  Object.assign(webex, {
100
107
  logging: logger,
101
108
  });
@@ -161,6 +168,7 @@ describe('plugin-meetings', () => {
161
168
  ],
162
169
  })
163
170
  ),
171
+ _getCatalog: sinon.stub().returns(catalog),
164
172
  fetchClientRegionInfo: sinon.stub().returns(Promise.resolve()),
165
173
  },
166
174
  metrics: {
@@ -513,13 +521,8 @@ describe('plugin-meetings', () => {
513
521
  });
514
522
  describe('#getAllMeetings', () => {
515
523
  it('calls MeetingCollection to get all meetings with supplied options', () => {
516
- webex.meetings.getAllMeetings({
517
- test: test1,
518
- });
524
+ webex.meetings.getAllMeetings();
519
525
  assert.calledOnce(webex.meetings.meetingCollection.getAll);
520
- assert.calledWith(webex.meetings.meetingCollection.getAll, {
521
- test: test1,
522
- });
523
526
  });
524
527
  });
525
528
  });
@@ -1011,6 +1014,7 @@ describe('plugin-meetings', () => {
1011
1014
  callBackInfo: {
1012
1015
  callbackAddress: uri1,
1013
1016
  },
1017
+ devices: [],
1014
1018
  },
1015
1019
  info: {
1016
1020
  webExMeetingId,
@@ -1038,6 +1042,7 @@ describe('plugin-meetings', () => {
1038
1042
  callBackInfo: {
1039
1043
  callbackAddress: uri1,
1040
1044
  },
1045
+ devices: [],
1041
1046
  },
1042
1047
  info: {
1043
1048
  webExMeetingId,
@@ -1052,6 +1057,7 @@ describe('plugin-meetings', () => {
1052
1057
  callBackInfo: {
1053
1058
  callbackAddress: uri1,
1054
1059
  },
1060
+ devices: [],
1055
1061
  },
1056
1062
  info: {
1057
1063
  webExMeetingId,
@@ -1074,6 +1080,7 @@ describe('plugin-meetings', () => {
1074
1080
  callBackInfo: {
1075
1081
  callbackAddress: uri1,
1076
1082
  },
1083
+ devices: [],
1077
1084
  },
1078
1085
  info: {
1079
1086
  webExMeetingId,
@@ -1091,6 +1098,7 @@ describe('plugin-meetings', () => {
1091
1098
  callBackInfo: {
1092
1099
  callbackAddress: uri1,
1093
1100
  },
1101
+ devices: [],
1094
1102
  },
1095
1103
  info: {
1096
1104
  webExMeetingId,
@@ -1121,6 +1129,7 @@ describe('plugin-meetings', () => {
1121
1129
  callBackInfo: {
1122
1130
  callbackAddress: uri1,
1123
1131
  },
1132
+ devices: [],
1124
1133
  },
1125
1134
  info: {
1126
1135
  webExMeetingId,
@@ -1143,6 +1152,7 @@ describe('plugin-meetings', () => {
1143
1152
  callBackInfo: {
1144
1153
  callbackAddress: uri1,
1145
1154
  },
1155
+ devices: [],
1146
1156
  },
1147
1157
  info: {
1148
1158
  webExMeetingId,
@@ -1157,6 +1167,7 @@ describe('plugin-meetings', () => {
1157
1167
  callbackInfo: {
1158
1168
  callbackAddress: uri1,
1159
1169
  },
1170
+ devices: [],
1160
1171
  },
1161
1172
  info: {
1162
1173
  isUnifiedSpaceMeeting,
@@ -1914,34 +1925,34 @@ describe('plugin-meetings', () => {
1914
1925
  let loggerProxySpy;
1915
1926
 
1916
1927
  it('should call request.getMeetingPreferences to get the preferred webex site ', async () => {
1928
+ assert.deepEqual(webex.internal.services._getCatalog().getAllowedDomains(), []);
1917
1929
  assert.isDefined(webex.meetings.preferredWebexSite);
1918
1930
  await webex.meetings.fetchUserPreferredWebexSite();
1919
1931
 
1920
1932
  assert.equal(webex.meetings.preferredWebexSite, 'go.webex.com');
1933
+ assert.deepEqual(webex.internal.services._getCatalog().getAllowedDomains(), [
1934
+ 'go.webex.com',
1935
+ ]);
1921
1936
  });
1922
1937
 
1923
1938
  const setup = ({user} = {}) => {
1924
1939
  loggerProxySpy = sinon.spy(LoggerProxy.logger, 'error');
1940
+ assert.deepEqual(webex.internal.services._getCatalog().getAllowedDomains(), []);
1925
1941
 
1926
1942
  Object.assign(webex.internal, {
1927
- services: {
1928
- getMeetingPreferences: sinon.stub().returns(Promise.resolve({})),
1929
- },
1930
1943
  user: {
1931
1944
  get: sinon.stub().returns(Promise.resolve(user)),
1932
1945
  },
1933
1946
  });
1947
+
1948
+ Object.assign(webex.internal.services, {
1949
+ getMeetingPreferences: sinon.stub().returns(Promise.resolve({})),
1950
+ });
1934
1951
  };
1935
1952
 
1936
1953
  it('should not fail if UserPreferred info is not fetched ', async () => {
1937
1954
  setup();
1938
1955
 
1939
- Object.assign(webex.internal, {
1940
- services: {
1941
- getMeetingPreferences: sinon.stub().returns(Promise.resolve({})),
1942
- },
1943
- });
1944
-
1945
1956
  await webex.meetings.fetchUserPreferredWebexSite().then(() => {
1946
1957
  assert.equal(webex.meetings.preferredWebexSite, '');
1947
1958
  });
@@ -1949,6 +1960,7 @@ describe('plugin-meetings', () => {
1949
1960
  loggerProxySpy,
1950
1961
  'Failed to fetch preferred site from user - no site will be set'
1951
1962
  );
1963
+ assert.deepEqual(webex.internal.services._getCatalog().getAllowedDomains(), ['']);
1952
1964
  });
1953
1965
 
1954
1966
  it('should fall back to fetching the site from the user', async () => {
@@ -1965,6 +1977,10 @@ describe('plugin-meetings', () => {
1965
1977
  await webex.meetings.fetchUserPreferredWebexSite();
1966
1978
 
1967
1979
  assert.equal(webex.meetings.preferredWebexSite, 'site.webex.com');
1980
+ assert.deepEqual(webex.internal.services._getCatalog().getAllowedDomains(), [
1981
+ '',
1982
+ 'site.webex.com',
1983
+ ]);
1968
1984
  assert.notCalled(loggerProxySpy);
1969
1985
  });
1970
1986
 
@@ -1986,6 +2002,7 @@ describe('plugin-meetings', () => {
1986
2002
  loggerProxySpy,
1987
2003
  'Failed to fetch preferred site from user - no site will be set'
1988
2004
  );
2005
+ assert.deepEqual(webex.internal.services._getCatalog().getAllowedDomains(), ['']);
1989
2006
  });
1990
2007
  }
1991
2008
  );
@@ -2002,6 +2019,7 @@ describe('plugin-meetings', () => {
2002
2019
  loggerProxySpy,
2003
2020
  'Failed to fetch preferred site from user - no site will be set'
2004
2021
  );
2022
+ assert.deepEqual(webex.internal.services._getCatalog().getAllowedDomains(), ['']);
2005
2023
  });
2006
2024
 
2007
2025
  it('should fall back to fetching the site from the user', async () => {
@@ -2019,6 +2037,10 @@ describe('plugin-meetings', () => {
2019
2037
 
2020
2038
  assert.equal(webex.meetings.preferredWebexSite, 'site.webex.com');
2021
2039
  assert.notCalled(loggerProxySpy);
2040
+ assert.deepEqual(webex.internal.services._getCatalog().getAllowedDomains(), [
2041
+ '',
2042
+ 'site.webex.com',
2043
+ ]);
2022
2044
  });
2023
2045
 
2024
2046
  forEach(
@@ -2039,6 +2061,7 @@ describe('plugin-meetings', () => {
2039
2061
  loggerProxySpy,
2040
2062
  'Failed to fetch preferred site from user - no site will be set'
2041
2063
  );
2064
+ assert.deepEqual(webex.internal.services._getCatalog().getAllowedDomains(), ['']);
2042
2065
  });
2043
2066
  }
2044
2067
  );
@@ -2055,6 +2078,7 @@ describe('plugin-meetings', () => {
2055
2078
  loggerProxySpy,
2056
2079
  'Failed to fetch preferred site from user - no site will be set'
2057
2080
  );
2081
+ assert.deepEqual(webex.internal.services._getCatalog().getAllowedDomains(), ['']);
2058
2082
  });
2059
2083
  });
2060
2084
  });
@@ -2299,6 +2323,7 @@ describe('plugin-meetings', () => {
2299
2323
  sessionType: 'BREAKOUT',
2300
2324
  };
2301
2325
  newLocus.self.state = 'JOINED';
2326
+ newLocus.self.devices = [];
2302
2327
  newLocus.fullState = {
2303
2328
  active: true,
2304
2329
  };
@@ -2315,7 +2340,7 @@ describe('plugin-meetings', () => {
2315
2340
  sessionType: 'MAIN',
2316
2341
  };
2317
2342
  newLocus.self.state = 'JOINED';
2318
-
2343
+ newLocus.self.devices = [];
2319
2344
  LoggerProxy.logger.log = sinon.stub();
2320
2345
  const result = webex.meetings.isNeedHandleLocusDTO(meeting, newLocus);
2321
2346
  assert.equal(result, true);
@@ -2330,11 +2355,28 @@ describe('plugin-meetings', () => {
2330
2355
  };
2331
2356
  newLocus.self.state = 'LEFT';
2332
2357
  newLocus.self.reason = 'MOVED';
2333
-
2358
+ newLocus.self.devices = [];
2334
2359
  LoggerProxy.logger.log = sinon.stub();
2335
2360
  const result = webex.meetings.isNeedHandleLocusDTO(meeting, newLocus);
2336
2361
  assert.equal(result, false);
2337
2362
  });
2363
+ it('moved to lobby, return true', () => {
2364
+ newLocus.controls.breakout = {
2365
+ sessionType: 'MAIN',
2366
+ };
2367
+ newLocus.self.state = 'JOINED';
2368
+ newLocus.self.devices = [
2369
+ {
2370
+ intent: {
2371
+ reason: 'ON_HOLD_LOBBY',
2372
+ type: 'WAIT',
2373
+ },
2374
+ },
2375
+ ];
2376
+ LoggerProxy.logger.log = sinon.stub();
2377
+ const result = webex.meetings.isNeedHandleLocusDTO(meeting, newLocus);
2378
+ assert.equal(result, true);
2379
+ });
2338
2380
  });
2339
2381
 
2340
2382
  describe('#getCorrespondingMeetingByLocus', () => {