@webex/plugin-meetings 3.12.0-next.9 → 3.12.0-next.91

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 (213) hide show
  1. package/AGENTS.md +9 -0
  2. package/dist/aiEnableRequest/index.js +15 -2
  3. package/dist/aiEnableRequest/index.js.map +1 -1
  4. package/dist/breakouts/breakout.js +8 -3
  5. package/dist/breakouts/breakout.js.map +1 -1
  6. package/dist/breakouts/index.js +26 -2
  7. package/dist/breakouts/index.js.map +1 -1
  8. package/dist/config.js +2 -2
  9. package/dist/config.js.map +1 -1
  10. package/dist/constants.js +35 -9
  11. package/dist/constants.js.map +1 -1
  12. package/dist/controls-options-manager/constants.js +11 -1
  13. package/dist/controls-options-manager/constants.js.map +1 -1
  14. package/dist/controls-options-manager/index.js +67 -29
  15. package/dist/controls-options-manager/index.js.map +1 -1
  16. package/dist/controls-options-manager/util.js +91 -0
  17. package/dist/controls-options-manager/util.js.map +1 -1
  18. package/dist/hashTree/constants.js +13 -1
  19. package/dist/hashTree/constants.js.map +1 -1
  20. package/dist/hashTree/hashTreeParser.js +880 -382
  21. package/dist/hashTree/hashTreeParser.js.map +1 -1
  22. package/dist/hashTree/utils.js +42 -0
  23. package/dist/hashTree/utils.js.map +1 -1
  24. package/dist/index.js +7 -0
  25. package/dist/index.js.map +1 -1
  26. package/dist/interceptors/dataChannelAuthToken.js +75 -15
  27. package/dist/interceptors/dataChannelAuthToken.js.map +1 -1
  28. package/dist/interceptors/locusRetry.js +23 -8
  29. package/dist/interceptors/locusRetry.js.map +1 -1
  30. package/dist/interpretation/index.js +10 -1
  31. package/dist/interpretation/index.js.map +1 -1
  32. package/dist/interpretation/interpretation.types.js +7 -0
  33. package/dist/interpretation/interpretation.types.js.map +1 -0
  34. package/dist/interpretation/siLanguage.js +1 -1
  35. package/dist/locus-info/controlsUtils.js +4 -1
  36. package/dist/locus-info/controlsUtils.js.map +1 -1
  37. package/dist/locus-info/index.js +303 -88
  38. package/dist/locus-info/index.js.map +1 -1
  39. package/dist/locus-info/infoUtils.js +36 -5
  40. package/dist/locus-info/infoUtils.js.map +1 -1
  41. package/dist/locus-info/types.js +19 -0
  42. package/dist/locus-info/types.js.map +1 -1
  43. package/dist/media/index.js +3 -1
  44. package/dist/media/index.js.map +1 -1
  45. package/dist/media/properties.js +1 -0
  46. package/dist/media/properties.js.map +1 -1
  47. package/dist/meeting/in-meeting-actions.js +5 -1
  48. package/dist/meeting/in-meeting-actions.js.map +1 -1
  49. package/dist/meeting/index.js +1233 -793
  50. package/dist/meeting/index.js.map +1 -1
  51. package/dist/meeting/locusMediaRequest.js +229 -82
  52. package/dist/meeting/locusMediaRequest.js.map +1 -1
  53. package/dist/meeting/muteState.js +10 -1
  54. package/dist/meeting/muteState.js.map +1 -1
  55. package/dist/meeting/request.js +5 -2
  56. package/dist/meeting/request.js.map +1 -1
  57. package/dist/meeting/util.js +35 -2
  58. package/dist/meeting/util.js.map +1 -1
  59. package/dist/meeting-info/meeting-info-v2.js +2 -2
  60. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  61. package/dist/meetings/index.js +231 -118
  62. package/dist/meetings/index.js.map +1 -1
  63. package/dist/meetings/meetings.types.js +6 -1
  64. package/dist/meetings/meetings.types.js.map +1 -1
  65. package/dist/meetings/request.js +39 -0
  66. package/dist/meetings/request.js.map +1 -1
  67. package/dist/meetings/util.js +79 -5
  68. package/dist/meetings/util.js.map +1 -1
  69. package/dist/member/index.js +10 -0
  70. package/dist/member/index.js.map +1 -1
  71. package/dist/member/types.js.map +1 -1
  72. package/dist/member/util.js +30 -0
  73. package/dist/member/util.js.map +1 -1
  74. package/dist/members/index.js +101 -43
  75. package/dist/members/index.js.map +1 -1
  76. package/dist/members/util.js +8 -1
  77. package/dist/members/util.js.map +1 -1
  78. package/dist/metrics/constants.js +5 -1
  79. package/dist/metrics/constants.js.map +1 -1
  80. package/dist/multistream/codec/constants.js +63 -0
  81. package/dist/multistream/codec/constants.js.map +1 -0
  82. package/dist/multistream/mediaRequestManager.js +62 -15
  83. package/dist/multistream/mediaRequestManager.js.map +1 -1
  84. package/dist/multistream/receiveSlot.js +9 -0
  85. package/dist/multistream/receiveSlot.js.map +1 -1
  86. package/dist/reachability/index.js +10 -13
  87. package/dist/reachability/index.js.map +1 -1
  88. package/dist/reachability/reachability.types.js +2 -0
  89. package/dist/reachability/reachability.types.js.map +1 -1
  90. package/dist/reachability/util.js +45 -0
  91. package/dist/reachability/util.js.map +1 -1
  92. package/dist/reactions/reactions.type.js.map +1 -1
  93. package/dist/recording-controller/index.js +1 -3
  94. package/dist/recording-controller/index.js.map +1 -1
  95. package/dist/types/config.d.ts +2 -2
  96. package/dist/types/constants.d.ts +12 -1
  97. package/dist/types/controls-options-manager/constants.d.ts +6 -1
  98. package/dist/types/controls-options-manager/index.d.ts +16 -0
  99. package/dist/types/hashTree/constants.d.ts +2 -0
  100. package/dist/types/hashTree/hashTreeParser.d.ts +146 -17
  101. package/dist/types/hashTree/utils.d.ts +18 -0
  102. package/dist/types/index.d.ts +3 -0
  103. package/dist/types/interceptors/locusRetry.d.ts +4 -4
  104. package/dist/types/interpretation/interpretation.types.d.ts +10 -0
  105. package/dist/types/locus-info/index.d.ts +50 -6
  106. package/dist/types/locus-info/infoUtils.d.ts +8 -0
  107. package/dist/types/locus-info/types.d.ts +21 -1
  108. package/dist/types/media/properties.d.ts +1 -0
  109. package/dist/types/meeting/in-meeting-actions.d.ts +4 -0
  110. package/dist/types/meeting/index.d.ts +94 -7
  111. package/dist/types/meeting/locusMediaRequest.d.ts +12 -0
  112. package/dist/types/meeting/request.d.ts +1 -0
  113. package/dist/types/meeting/util.d.ts +9 -0
  114. package/dist/types/meetings/index.d.ts +30 -18
  115. package/dist/types/meetings/meetings.types.d.ts +15 -0
  116. package/dist/types/meetings/request.d.ts +14 -0
  117. package/dist/types/member/index.d.ts +1 -0
  118. package/dist/types/member/types.d.ts +1 -0
  119. package/dist/types/member/util.d.ts +9 -0
  120. package/dist/types/members/index.d.ts +15 -2
  121. package/dist/types/members/util.d.ts +1 -5
  122. package/dist/types/metrics/constants.d.ts +4 -0
  123. package/dist/types/multistream/codec/constants.d.ts +7 -0
  124. package/dist/types/multistream/mediaRequestManager.d.ts +22 -5
  125. package/dist/types/reachability/index.d.ts +1 -1
  126. package/dist/types/reachability/reachability.types.d.ts +7 -0
  127. package/dist/types/reachability/util.d.ts +17 -0
  128. package/dist/types/reactions/reactions.type.d.ts +3 -0
  129. package/dist/webinar/index.js +305 -159
  130. package/dist/webinar/index.js.map +1 -1
  131. package/package.json +22 -22
  132. package/src/aiEnableRequest/index.ts +16 -0
  133. package/src/breakouts/breakout.ts +3 -1
  134. package/src/breakouts/index.ts +31 -0
  135. package/src/config.ts +2 -2
  136. package/src/constants.ts +20 -3
  137. package/src/controls-options-manager/constants.ts +14 -1
  138. package/src/controls-options-manager/index.ts +87 -28
  139. package/src/controls-options-manager/util.ts +81 -1
  140. package/src/hashTree/constants.ts +16 -0
  141. package/src/hashTree/hashTreeParser.ts +580 -196
  142. package/src/hashTree/utils.ts +36 -0
  143. package/src/index.ts +6 -0
  144. package/src/interceptors/dataChannelAuthToken.ts +88 -12
  145. package/src/interceptors/locusRetry.ts +25 -4
  146. package/src/interpretation/index.ts +27 -9
  147. package/src/interpretation/interpretation.types.ts +11 -0
  148. package/src/locus-info/controlsUtils.ts +3 -1
  149. package/src/locus-info/index.ts +304 -100
  150. package/src/locus-info/infoUtils.ts +41 -6
  151. package/src/locus-info/types.ts +25 -1
  152. package/src/media/index.ts +3 -0
  153. package/src/media/properties.ts +1 -0
  154. package/src/meeting/in-meeting-actions.ts +8 -0
  155. package/src/meeting/index.ts +494 -67
  156. package/src/meeting/locusMediaRequest.ts +106 -6
  157. package/src/meeting/muteState.ts +10 -1
  158. package/src/meeting/request.ts +11 -0
  159. package/src/meeting/util.ts +47 -5
  160. package/src/meeting-info/meeting-info-v2.ts +4 -2
  161. package/src/meetings/index.ts +133 -78
  162. package/src/meetings/meetings.types.ts +19 -0
  163. package/src/meetings/request.ts +43 -0
  164. package/src/meetings/util.ts +97 -1
  165. package/src/member/index.ts +10 -0
  166. package/src/member/types.ts +1 -0
  167. package/src/member/util.ts +29 -0
  168. package/src/members/index.ts +70 -7
  169. package/src/members/util.ts +12 -4
  170. package/src/metrics/constants.ts +4 -0
  171. package/src/multistream/codec/constants.ts +58 -0
  172. package/src/multistream/mediaRequestManager.ts +119 -28
  173. package/src/multistream/receiveSlot.ts +18 -0
  174. package/src/reachability/index.ts +19 -15
  175. package/src/reachability/reachability.types.ts +11 -0
  176. package/src/reachability/util.ts +36 -0
  177. package/src/reactions/reactions.type.ts +3 -0
  178. package/src/recording-controller/index.ts +1 -2
  179. package/src/webinar/index.ts +214 -36
  180. package/test/unit/spec/aiEnableRequest/index.ts +86 -0
  181. package/test/unit/spec/breakouts/breakout.ts +9 -3
  182. package/test/unit/spec/breakouts/index.ts +49 -0
  183. package/test/unit/spec/controls-options-manager/index.js +244 -29
  184. package/test/unit/spec/controls-options-manager/util.js +165 -0
  185. package/test/unit/spec/hashTree/hashTreeParser.ts +1838 -180
  186. package/test/unit/spec/hashTree/utils.ts +125 -1
  187. package/test/unit/spec/interceptors/dataChannelAuthToken.ts +196 -0
  188. package/test/unit/spec/interceptors/locusRetry.ts +205 -4
  189. package/test/unit/spec/interpretation/index.ts +26 -4
  190. package/test/unit/spec/locus-info/controlsUtils.js +172 -57
  191. package/test/unit/spec/locus-info/index.js +499 -81
  192. package/test/unit/spec/locus-info/infoUtils.js +184 -1
  193. package/test/unit/spec/media/index.ts +31 -0
  194. package/test/unit/spec/meeting/in-meeting-actions.ts +4 -0
  195. package/test/unit/spec/meeting/index.js +1615 -42
  196. package/test/unit/spec/meeting/locusMediaRequest.ts +302 -4
  197. package/test/unit/spec/meeting/muteState.js +81 -0
  198. package/test/unit/spec/meeting/request.js +12 -0
  199. package/test/unit/spec/meeting/utils.js +157 -1
  200. package/test/unit/spec/meeting-info/meetinginfov2.js +19 -10
  201. package/test/unit/spec/meetings/index.js +363 -36
  202. package/test/unit/spec/meetings/request.js +141 -0
  203. package/test/unit/spec/meetings/utils.js +189 -0
  204. package/test/unit/spec/member/index.js +7 -0
  205. package/test/unit/spec/member/util.js +89 -0
  206. package/test/unit/spec/members/index.js +216 -0
  207. package/test/unit/spec/members/request.js +37 -1
  208. package/test/unit/spec/members/utils.js +63 -0
  209. package/test/unit/spec/multistream/mediaRequestManager.ts +501 -37
  210. package/test/unit/spec/reachability/index.ts +59 -46
  211. package/test/unit/spec/reachability/util.ts +31 -0
  212. package/test/unit/spec/recording-controller/index.js +9 -8
  213. package/test/unit/spec/webinar/index.ts +329 -28
@@ -60,6 +60,7 @@ describe('plugin-meetings', () => {
60
60
  meeting.annotaion = {cleanUp: sinon.stub()};
61
61
  meeting.getWebexObject = sinon.stub().returns(webex);
62
62
  meeting.simultaneousInterpretation = {cleanUp: sinon.stub()};
63
+ meeting.locusInfo = {cleanUp: sinon.stub()};
63
64
  meeting.trigger = sinon.stub();
64
65
  meeting.webex = webex;
65
66
  meeting.webex.internal.newMetrics.callDiagnosticMetrics =
@@ -89,6 +90,7 @@ describe('plugin-meetings', () => {
89
90
  assert.calledOnceWithExactly(meeting.cleanupLLMConneciton, {throwOnError: false});
90
91
  assert.calledOnce(meeting.breakouts.cleanUp);
91
92
  assert.calledOnce(meeting.simultaneousInterpretation.cleanUp);
93
+ assert.calledOnce(meeting.locusInfo.cleanUp);
92
94
  assert.calledOnce(webex.internal.device.meetingEnded);
93
95
  assert.calledOnceWithExactly(
94
96
  meeting.webex.internal.newMetrics.callDiagnosticMetrics.clearEventLimitsForCorrelationId,
@@ -110,6 +112,7 @@ describe('plugin-meetings', () => {
110
112
  assert.notCalled(meeting.cleanupLLMConneciton);
111
113
  assert.calledOnce(meeting.breakouts.cleanUp);
112
114
  assert.calledOnce(meeting.simultaneousInterpretation.cleanUp);
115
+ assert.calledOnce(meeting.locusInfo.cleanUp);
113
116
  assert.calledOnce(webex.internal.device.meetingEnded);
114
117
  assert.calledOnceWithExactly(
115
118
  meeting.webex.internal.newMetrics.callDiagnosticMetrics.clearEventLimitsForCorrelationId,
@@ -130,6 +133,7 @@ describe('plugin-meetings', () => {
130
133
  assert.notCalled(meeting.cleanupLLMConneciton);
131
134
  assert.calledOnce(meeting.breakouts.cleanUp);
132
135
  assert.calledOnce(meeting.simultaneousInterpretation.cleanUp);
136
+ assert.calledOnce(meeting.locusInfo.cleanUp);
133
137
  assert.calledOnce(webex.internal.device.meetingEnded);
134
138
  assert.calledOnceWithExactly(
135
139
  meeting.webex.internal.newMetrics.callDiagnosticMetrics.clearEventLimitsForCorrelationId,
@@ -272,6 +276,31 @@ describe('plugin-meetings', () => {
272
276
  assert.notCalled(meeting.locusInfo.handleLocusAPIResponse);
273
277
  });
274
278
 
279
+ it('should call handleLocusAPIResponse when response body is an unwrapped LocusDTO', () => {
280
+ const meeting = {
281
+ locusInfo: {
282
+ handleLocusAPIResponse: sinon.stub(),
283
+ },
284
+ };
285
+
286
+ const originalResponse = {
287
+ body: {
288
+ url: 'https://locus-a.wbx2.com/locus/api/v1/loci/some-id',
289
+ participants: [],
290
+ self: {},
291
+ },
292
+ };
293
+
294
+ const response = MeetingUtil.updateLocusFromApiResponse(meeting, originalResponse);
295
+
296
+ assert.deepEqual(response, originalResponse);
297
+ assert.calledOnceWithExactly(
298
+ meeting.locusInfo.handleLocusAPIResponse,
299
+ meeting,
300
+ originalResponse.body
301
+ );
302
+ });
303
+
275
304
  it('should work with an undefined meeting', () => {
276
305
  const originalResponse = {
277
306
  body: {
@@ -290,6 +319,7 @@ describe('plugin-meetings', () => {
290
319
  const addSequenceSpy = sinon.spy(MeetingUtil, 'addSequence');
291
320
 
292
321
  const meeting = {
322
+ locusUrl: 'https://locus.example.com/loci/abc',
293
323
  request: sinon.stub().returns(Promise.resolve('result')),
294
324
  };
295
325
 
@@ -297,6 +327,7 @@ describe('plugin-meetings', () => {
297
327
 
298
328
  const options = {
299
329
  some: 'option',
330
+ uri: 'https://locus.example.com/loci/abc',
300
331
  body: {},
301
332
  };
302
333
 
@@ -310,7 +341,7 @@ describe('plugin-meetings', () => {
310
341
  addSequenceSpy.resetHistory();
311
342
 
312
343
  // body missing from options
313
- result = await locusDeltaRequest({});
344
+ result = await locusDeltaRequest({uri: 'https://locus.example.com/loci/abc'});
314
345
  assert.equal(result, 'result');
315
346
  assert.calledOnceWithExactly(updateLocusFromApiResponseSpy, meeting, 'result');
316
347
  assert.calledOnceWithExactly(addSequenceSpy, meeting, options.body);
@@ -324,6 +355,78 @@ describe('plugin-meetings', () => {
324
355
  WeakRef.prototype.deref.restore();
325
356
  });
326
357
 
358
+ it('calls updateLocusFromApiResponse when request uri starts with the meeting locusUrl', async () => {
359
+ const updateLocusFromApiResponseSpy = sinon.spy(MeetingUtil, 'updateLocusFromApiResponse');
360
+
361
+ const meeting = {
362
+ locusUrl: 'https://locus.example.com/loci/abc',
363
+ request: sinon.stub().returns(Promise.resolve('result')),
364
+ };
365
+
366
+ const locusDeltaRequest = MeetingUtil.generateLocusDeltaRequest(meeting);
367
+
368
+ const result = await locusDeltaRequest({
369
+ uri: 'https://locus.example.com/loci/abc/participant/123',
370
+ body: {},
371
+ });
372
+
373
+ assert.equal(result, 'result');
374
+ assert.calledOnceWithExactly(updateLocusFromApiResponseSpy, meeting, 'result');
375
+ });
376
+
377
+ it('does not call updateLocusFromApiResponse when request uri does not match the meeting locusUrl', async () => {
378
+ const updateLocusFromApiResponseSpy = sinon.spy(MeetingUtil, 'updateLocusFromApiResponse');
379
+
380
+ const meeting = {
381
+ locusUrl: 'https://locus.example.com/loci/abc',
382
+ request: sinon.stub().returns(Promise.resolve('result')),
383
+ };
384
+
385
+ const locusDeltaRequest = MeetingUtil.generateLocusDeltaRequest(meeting);
386
+
387
+ const result = await locusDeltaRequest({
388
+ uri: 'https://locus.example.com/loci/different',
389
+ body: {},
390
+ });
391
+
392
+ assert.equal(result, 'result');
393
+ assert.notCalled(updateLocusFromApiResponseSpy);
394
+ });
395
+
396
+ it('does not call updateLocusFromApiResponse when request uri is missing', async () => {
397
+ const updateLocusFromApiResponseSpy = sinon.spy(MeetingUtil, 'updateLocusFromApiResponse');
398
+
399
+ const meeting = {
400
+ locusUrl: 'https://locus.example.com/loci/abc',
401
+ request: sinon.stub().returns(Promise.resolve('result')),
402
+ };
403
+
404
+ const locusDeltaRequest = MeetingUtil.generateLocusDeltaRequest(meeting);
405
+
406
+ const result = await locusDeltaRequest({body: {}});
407
+
408
+ assert.equal(result, 'result');
409
+ assert.notCalled(updateLocusFromApiResponseSpy);
410
+ });
411
+
412
+ it('does not call updateLocusFromApiResponse when meeting locusUrl is missing', async () => {
413
+ const updateLocusFromApiResponseSpy = sinon.spy(MeetingUtil, 'updateLocusFromApiResponse');
414
+
415
+ const meeting = {
416
+ request: sinon.stub().returns(Promise.resolve('result')),
417
+ };
418
+
419
+ const locusDeltaRequest = MeetingUtil.generateLocusDeltaRequest(meeting);
420
+
421
+ const result = await locusDeltaRequest({
422
+ uri: 'https://locus.example.com/loci/abc',
423
+ body: {},
424
+ });
425
+
426
+ assert.equal(result, 'result');
427
+ assert.notCalled(updateLocusFromApiResponseSpy);
428
+ });
429
+
327
430
  it('calls generateBuildLocusDeltaRequestOptions as expected', () => {
328
431
  const generateBuildLocusDeltaRequestOptionsSpy = sinon.spy(
329
432
  MeetingUtil,
@@ -938,6 +1041,55 @@ describe('plugin-meetings', () => {
938
1041
  });
939
1042
  });
940
1043
 
1044
+ describe('canViewTheParticipantList', () => {
1045
+ it('returns true when both VIEW_THE_PARTICIPANT_LIST and CAN_VIEW_THE_PARTICIPANT_LIST hints are present and canNotViewTheParticipantList is false', () => {
1046
+ assert.isTrue(
1047
+ MeetingUtil.canViewTheParticipantList(
1048
+ ['VIEW_THE_PARTICIPANT_LIST', 'CAN_VIEW_THE_PARTICIPANT_LIST'],
1049
+ false
1050
+ )
1051
+ );
1052
+ });
1053
+
1054
+ it('returns false when VIEW_THE_PARTICIPANT_LIST hint is missing', () => {
1055
+ assert.isFalse(
1056
+ MeetingUtil.canViewTheParticipantList(['CAN_VIEW_THE_PARTICIPANT_LIST'], false)
1057
+ );
1058
+ });
1059
+
1060
+ it('returns false when CAN_VIEW_THE_PARTICIPANT_LIST hint is missing', () => {
1061
+ assert.isFalse(
1062
+ MeetingUtil.canViewTheParticipantList(['VIEW_THE_PARTICIPANT_LIST'], false)
1063
+ );
1064
+ });
1065
+
1066
+ it('returns false when canNotViewTheParticipantList is true', () => {
1067
+ assert.isFalse(
1068
+ MeetingUtil.canViewTheParticipantList(
1069
+ ['VIEW_THE_PARTICIPANT_LIST', 'CAN_VIEW_THE_PARTICIPANT_LIST'],
1070
+ true
1071
+ )
1072
+ );
1073
+ });
1074
+
1075
+ it('returns false when display hints array is empty', () => {
1076
+ assert.isFalse(MeetingUtil.canViewTheParticipantList([], false));
1077
+ });
1078
+
1079
+ it('returns false when both conditions are violated', () => {
1080
+ assert.isFalse(MeetingUtil.canViewTheParticipantList([], true));
1081
+ });
1082
+
1083
+ it('returns true when canNotViewTheParticipantList is undefined (not yet set on meeting)', () => {
1084
+ assert.isTrue(
1085
+ MeetingUtil.canViewTheParticipantList(
1086
+ ['VIEW_THE_PARTICIPANT_LIST', 'CAN_VIEW_THE_PARTICIPANT_LIST'],
1087
+ undefined
1088
+ )
1089
+ );
1090
+ });
1091
+ });
1092
+
941
1093
  describe('canAttendeeRequestAiAssistantEnabled', () => {
942
1094
  it('returns false when user is a cohost', () => {
943
1095
  assert.deepEqual(
@@ -1146,6 +1298,10 @@ describe('plugin-meetings', () => {
1146
1298
  {functionName: 'canSelectSpokenLanguages', displayHint: 'DISPLAY_NON_ENGLISH_ASR'},
1147
1299
  {functionName: 'waitingForOthersToJoin', displayHint: 'WAITING_FOR_OTHERS'},
1148
1300
  {functionName: 'showAutoEndMeetingWarning', displayHint: 'SHOW_AUTO_END_MEETING_WARNING'},
1301
+ {
1302
+ functionName: 'isAnonymizeDisplayNamesEnabled',
1303
+ displayHint: 'ANONYMOUS_DISPLAY_NAMES_ENABLED',
1304
+ },
1149
1305
  ].forEach(({functionName, displayHint}) => {
1150
1306
  describe(functionName, () => {
1151
1307
  it('works as expected', () => {
@@ -654,7 +654,7 @@ describe('plugin-meetings', () => {
654
654
  meetingInfo.createAdhocSpaceMeeting,
655
655
  'conversationUrl',
656
656
  installedOrgID,
657
- null,
657
+ null
658
658
  );
659
659
  assert.notCalled(webex.request);
660
660
  meetingInfo.createAdhocSpaceMeeting.restore();
@@ -1068,13 +1068,16 @@ describe('plugin-meetings', () => {
1068
1068
  await runTest(423006, true);
1069
1069
  });
1070
1070
 
1071
+ it('should throw MeetingInfoV2CaptchaError for 423 response (wbxappapi code 423008)', async () => {
1072
+ await runTest(423008, true);
1073
+ });
1074
+
1071
1075
  it('should throw MeetingInfoV2CaptchaError for 423 response (wbxappapi code 423001)', async () => {
1072
1076
  await runTest(423001, false);
1073
1077
  });
1074
1078
  });
1075
1079
 
1076
1080
  describe('should stop call fetchMeetingInfo if siteFullUrl is empty for 404 response', () => {
1077
-
1078
1081
  const runTest = async (wbxAppApiCode, expectedIsPasswordRequired) => {
1079
1082
  webex.request = sinon.stub().rejects({
1080
1083
  statusCode: 404,
@@ -1082,12 +1085,11 @@ describe('plugin-meetings', () => {
1082
1085
  code: wbxAppApiCode,
1083
1086
  message: 'Alternate Meeting Server',
1084
1087
  data: {
1085
- 'siteFullUrl': ''
1086
- }
1088
+ siteFullUrl: '',
1089
+ },
1087
1090
  },
1088
1091
  });
1089
1092
 
1090
-
1091
1093
  try {
1092
1094
  await meetingInfo.fetchMeetingInfo('1234323', DESTINATION_TYPE.MEETING_ID, 'abc', {
1093
1095
  id: '999',
@@ -1097,7 +1099,7 @@ describe('plugin-meetings', () => {
1097
1099
  } catch (err) {
1098
1100
  assert(Metrics.sendBehavioralMetric.calledOnce);
1099
1101
  assert.deepEqual(err.body.data, {
1100
- siteFullUrl: ''
1102
+ siteFullUrl: '',
1101
1103
  });
1102
1104
  }
1103
1105
  };
@@ -1107,7 +1109,6 @@ describe('plugin-meetings', () => {
1107
1109
  });
1108
1110
  });
1109
1111
 
1110
-
1111
1112
  it('should throw an error and not fetch with an "empty" body', async () => {
1112
1113
  const body = {supportHostKey: 'foo', supportCountryList: 'bar'};
1113
1114
  const requestResponse = {statusCode: 200, body};
@@ -1176,7 +1177,11 @@ describe('plugin-meetings', () => {
1176
1177
  body: conversation,
1177
1178
  });
1178
1179
 
1179
- const result = await meetingInfo.createAdhocSpaceMeeting(conversationUrl, installedOrgID, classificationId);
1180
+ const result = await meetingInfo.createAdhocSpaceMeeting(
1181
+ conversationUrl,
1182
+ installedOrgID,
1183
+ classificationId
1184
+ );
1180
1185
 
1181
1186
  assert.calledWith(webex.request, {
1182
1187
  uri: conversationUrl,
@@ -1210,7 +1215,11 @@ describe('plugin-meetings', () => {
1210
1215
  webex.request = sinon.stub().resolves({
1211
1216
  body: conversation,
1212
1217
  });
1213
- await meetingInfo.createAdhocSpaceMeeting(conversationUrl, installedOrgID, classificationId);
1218
+ await meetingInfo.createAdhocSpaceMeeting(
1219
+ conversationUrl,
1220
+ installedOrgID,
1221
+ classificationId
1222
+ );
1214
1223
 
1215
1224
  assert.calledWith(webex.request, {
1216
1225
  uri: conversationUrl,
@@ -1282,7 +1291,7 @@ describe('plugin-meetings', () => {
1282
1291
  {errorCode: 423007},
1283
1292
  {errorCode: 403026},
1284
1293
  {errorCode: 403037},
1285
- {errorCode: 403137},
1294
+ {errorCode: 403106},
1286
1295
  ],
1287
1296
  ({errorCode}) => {
1288
1297
  it(`should throw a MeetingInfoV2JoinWebinarError for error code ${errorCode}`, async () => {