@webex/plugin-meetings 3.12.0-next.7 → 3.12.0-next.70

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 (178) 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 -0
  9. package/dist/config.js.map +1 -1
  10. package/dist/constants.js +30 -7
  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 +38 -24
  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 +298 -87
  38. package/dist/locus-info/index.js.map +1 -1
  39. package/dist/locus-info/types.js +19 -0
  40. package/dist/locus-info/types.js.map +1 -1
  41. package/dist/media/index.js +3 -1
  42. package/dist/media/index.js.map +1 -1
  43. package/dist/media/properties.js +1 -0
  44. package/dist/media/properties.js.map +1 -1
  45. package/dist/meeting/in-meeting-actions.js +3 -1
  46. package/dist/meeting/in-meeting-actions.js.map +1 -1
  47. package/dist/meeting/index.js +1046 -689
  48. package/dist/meeting/index.js.map +1 -1
  49. package/dist/meeting/muteState.js +10 -1
  50. package/dist/meeting/muteState.js.map +1 -1
  51. package/dist/meeting/request.js +5 -2
  52. package/dist/meeting/request.js.map +1 -1
  53. package/dist/meeting/util.js +20 -2
  54. package/dist/meeting/util.js.map +1 -1
  55. package/dist/meeting-info/meeting-info-v2.js +2 -2
  56. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  57. package/dist/meetings/index.js +231 -78
  58. package/dist/meetings/index.js.map +1 -1
  59. package/dist/meetings/meetings.types.js +6 -1
  60. package/dist/meetings/meetings.types.js.map +1 -1
  61. package/dist/meetings/request.js +39 -0
  62. package/dist/meetings/request.js.map +1 -1
  63. package/dist/meetings/util.js +79 -5
  64. package/dist/meetings/util.js.map +1 -1
  65. package/dist/member/index.js +10 -0
  66. package/dist/member/index.js.map +1 -1
  67. package/dist/member/types.js.map +1 -1
  68. package/dist/member/util.js +3 -0
  69. package/dist/member/util.js.map +1 -1
  70. package/dist/metrics/constants.js +4 -1
  71. package/dist/metrics/constants.js.map +1 -1
  72. package/dist/multistream/codec/constants.js +63 -0
  73. package/dist/multistream/codec/constants.js.map +1 -0
  74. package/dist/multistream/mediaRequestManager.js +62 -15
  75. package/dist/multistream/mediaRequestManager.js.map +1 -1
  76. package/dist/multistream/receiveSlot.js +9 -0
  77. package/dist/multistream/receiveSlot.js.map +1 -1
  78. package/dist/reactions/reactions.type.js.map +1 -1
  79. package/dist/recording-controller/index.js +1 -3
  80. package/dist/recording-controller/index.js.map +1 -1
  81. package/dist/types/config.d.ts +2 -0
  82. package/dist/types/constants.d.ts +9 -1
  83. package/dist/types/controls-options-manager/constants.d.ts +6 -1
  84. package/dist/types/controls-options-manager/index.d.ts +10 -0
  85. package/dist/types/hashTree/constants.d.ts +2 -0
  86. package/dist/types/hashTree/hashTreeParser.d.ts +146 -17
  87. package/dist/types/hashTree/utils.d.ts +18 -0
  88. package/dist/types/index.d.ts +3 -0
  89. package/dist/types/interceptors/locusRetry.d.ts +4 -4
  90. package/dist/types/interpretation/interpretation.types.d.ts +10 -0
  91. package/dist/types/locus-info/index.d.ts +50 -6
  92. package/dist/types/locus-info/types.d.ts +21 -1
  93. package/dist/types/media/properties.d.ts +1 -0
  94. package/dist/types/meeting/in-meeting-actions.d.ts +2 -0
  95. package/dist/types/meeting/index.d.ts +78 -5
  96. package/dist/types/meeting/request.d.ts +1 -0
  97. package/dist/types/meeting/util.d.ts +8 -0
  98. package/dist/types/meetings/index.d.ts +30 -2
  99. package/dist/types/meetings/meetings.types.d.ts +15 -0
  100. package/dist/types/meetings/request.d.ts +14 -0
  101. package/dist/types/member/index.d.ts +1 -0
  102. package/dist/types/member/types.d.ts +1 -0
  103. package/dist/types/member/util.d.ts +1 -0
  104. package/dist/types/metrics/constants.d.ts +3 -0
  105. package/dist/types/multistream/codec/constants.d.ts +7 -0
  106. package/dist/types/multistream/mediaRequestManager.d.ts +22 -5
  107. package/dist/types/reactions/reactions.type.d.ts +3 -0
  108. package/dist/webinar/index.js +305 -159
  109. package/dist/webinar/index.js.map +1 -1
  110. package/package.json +22 -22
  111. package/src/aiEnableRequest/index.ts +16 -0
  112. package/src/breakouts/breakout.ts +3 -1
  113. package/src/breakouts/index.ts +31 -0
  114. package/src/config.ts +2 -0
  115. package/src/constants.ts +13 -2
  116. package/src/controls-options-manager/constants.ts +14 -1
  117. package/src/controls-options-manager/index.ts +47 -24
  118. package/src/controls-options-manager/util.ts +81 -1
  119. package/src/hashTree/constants.ts +16 -0
  120. package/src/hashTree/hashTreeParser.ts +580 -196
  121. package/src/hashTree/utils.ts +36 -0
  122. package/src/index.ts +6 -0
  123. package/src/interceptors/dataChannelAuthToken.ts +88 -12
  124. package/src/interceptors/locusRetry.ts +25 -4
  125. package/src/interpretation/index.ts +27 -9
  126. package/src/interpretation/interpretation.types.ts +11 -0
  127. package/src/locus-info/controlsUtils.ts +3 -1
  128. package/src/locus-info/index.ts +293 -97
  129. package/src/locus-info/types.ts +25 -1
  130. package/src/media/index.ts +3 -0
  131. package/src/media/properties.ts +1 -0
  132. package/src/meeting/in-meeting-actions.ts +4 -0
  133. package/src/meeting/index.ts +386 -48
  134. package/src/meeting/muteState.ts +10 -1
  135. package/src/meeting/request.ts +11 -0
  136. package/src/meeting/util.ts +21 -2
  137. package/src/meeting-info/meeting-info-v2.ts +4 -2
  138. package/src/meetings/index.ts +134 -44
  139. package/src/meetings/meetings.types.ts +19 -0
  140. package/src/meetings/request.ts +43 -0
  141. package/src/meetings/util.ts +97 -1
  142. package/src/member/index.ts +10 -0
  143. package/src/member/types.ts +1 -0
  144. package/src/member/util.ts +3 -0
  145. package/src/metrics/constants.ts +3 -0
  146. package/src/multistream/codec/constants.ts +58 -0
  147. package/src/multistream/mediaRequestManager.ts +119 -28
  148. package/src/multistream/receiveSlot.ts +18 -0
  149. package/src/reactions/reactions.type.ts +3 -0
  150. package/src/recording-controller/index.ts +1 -2
  151. package/src/webinar/index.ts +214 -36
  152. package/test/unit/spec/aiEnableRequest/index.ts +86 -0
  153. package/test/unit/spec/breakouts/breakout.ts +9 -3
  154. package/test/unit/spec/breakouts/index.ts +49 -0
  155. package/test/unit/spec/controls-options-manager/index.js +140 -29
  156. package/test/unit/spec/controls-options-manager/util.js +165 -0
  157. package/test/unit/spec/hashTree/hashTreeParser.ts +1838 -180
  158. package/test/unit/spec/hashTree/utils.ts +125 -1
  159. package/test/unit/spec/interceptors/dataChannelAuthToken.ts +196 -0
  160. package/test/unit/spec/interceptors/locusRetry.ts +205 -4
  161. package/test/unit/spec/interpretation/index.ts +26 -4
  162. package/test/unit/spec/locus-info/controlsUtils.js +172 -57
  163. package/test/unit/spec/locus-info/index.js +487 -81
  164. package/test/unit/spec/media/index.ts +31 -0
  165. package/test/unit/spec/meeting/in-meeting-actions.ts +2 -0
  166. package/test/unit/spec/meeting/index.js +1240 -37
  167. package/test/unit/spec/meeting/muteState.js +81 -0
  168. package/test/unit/spec/meeting/request.js +12 -0
  169. package/test/unit/spec/meeting/utils.js +33 -0
  170. package/test/unit/spec/meeting-info/meetinginfov2.js +19 -10
  171. package/test/unit/spec/meetings/index.js +360 -10
  172. package/test/unit/spec/meetings/request.js +141 -0
  173. package/test/unit/spec/meetings/utils.js +189 -0
  174. package/test/unit/spec/member/index.js +7 -0
  175. package/test/unit/spec/member/util.js +24 -0
  176. package/test/unit/spec/multistream/mediaRequestManager.ts +501 -37
  177. package/test/unit/spec/recording-controller/index.js +9 -8
  178. package/test/unit/spec/webinar/index.ts +329 -28
@@ -11,6 +11,7 @@ describe('plugin-meetings', () => {
11
11
  let audio;
12
12
  let video;
13
13
  let originalRemoteUpdateAudioVideo;
14
+ let originalUpdateLocusFromApiResponse;
14
15
 
15
16
  const fakeLocusResponse = {body: {locus: {info: 'this is a fake locus'}}};
16
17
 
@@ -45,6 +46,7 @@ describe('plugin-meetings', () => {
45
46
  };
46
47
 
47
48
  originalRemoteUpdateAudioVideo = MeetingUtil.remoteUpdateAudioVideo;
49
+ originalUpdateLocusFromApiResponse = MeetingUtil.updateLocusFromApiResponse;
48
50
 
49
51
  MeetingUtil.remoteUpdateAudioVideo = sinon.stub().resolves(fakeLocusResponse);
50
52
  MeetingUtil.updateLocusFromApiResponse = sinon.stub();
@@ -57,6 +59,7 @@ describe('plugin-meetings', () => {
57
59
 
58
60
  afterEach(() => {
59
61
  MeetingUtil.remoteUpdateAudioVideo = originalRemoteUpdateAudioVideo;
62
+ MeetingUtil.updateLocusFromApiResponse = originalUpdateLocusFromApiResponse;
60
63
  });
61
64
 
62
65
  describe('mute state library', () => {
@@ -109,6 +112,82 @@ describe('plugin-meetings', () => {
109
112
  assert.isTrue(audio.isRemotelyMuted());
110
113
  });
111
114
 
115
+ it('does not unmute the local stream when server clears remote mute while user is locally muted (breakout -> main regression)', async () => {
116
+ // Panelist is locally muted before joining a breakout.
117
+ meeting.mediaProperties.audioStream.userMuted = true;
118
+ audio.handleLocalStreamChange(meeting);
119
+ await testUtils.flushPromises();
120
+
121
+ // Server applied a remote mute at some point.
122
+ audio.handleServerRemoteMuteUpdate(meeting, true, true);
123
+ assert.isTrue(audio.isRemotelyMuted());
124
+
125
+ meeting.mediaProperties.audioStream.setServerMuted.resetHistory();
126
+
127
+ // Now the user returns from breakout to main, and Locus clears the remote mute.
128
+ audio.handleServerRemoteMuteUpdate(meeting, false, true);
129
+
130
+ // Stream must NOT be force-unmuted - user's local mute intent must be preserved.
131
+ // The stale remoteMute=false must not trigger setServerMuted again.
132
+ assert.notCalled(meeting.mediaProperties.audioStream.setServerMuted);
133
+ assert.isFalse(audio.isRemotelyMuted());
134
+ assert.isTrue(audio.isMuted());
135
+ });
136
+
137
+ it('does not touch the local stream when remote mute stays false (no transition)', async () => {
138
+ // No remote mute has been applied yet (initial state has server.remoteMute=false).
139
+ meeting.mediaProperties.audioStream.setServerMuted.resetHistory();
140
+
141
+ audio.handleServerRemoteMuteUpdate(meeting, false, true);
142
+
143
+ // setServerMuted must not be called - there is no remoteMute transition to act on.
144
+ assert.notCalled(meeting.mediaProperties.audioStream.setServerMuted);
145
+ });
146
+
147
+ it('keeps isMuted() true when a stale remoteMute=false replays after remote mute', async () => {
148
+ // User was unmuted by host (userMuted=false locally).
149
+ meeting.mediaProperties.audioStream.userMuted = false;
150
+ audio.handleLocalStreamChange(meeting);
151
+ await testUtils.flushPromises();
152
+
153
+ // Host then hard-mutes the user.
154
+ audio.handleServerRemoteMuteUpdate(meeting, true, true);
155
+ await testUtils.flushPromises();
156
+ assert.isTrue(audio.isMuted());
157
+
158
+ meeting.mediaProperties.audioStream.setServerMuted.resetHistory();
159
+
160
+ // BO -> main replays a stale remoteMute=false from the locus cache.
161
+ audio.handleServerRemoteMuteUpdate(meeting, false, true);
162
+
163
+ // isMuted() must remain true (client.localMute is the safety net),
164
+ // and the stream must not be force-unmuted.
165
+ assert.isTrue(audio.isMuted());
166
+ assert.isFalse(audio.isRemotelyMuted());
167
+ assert.notCalled(meeting.mediaProperties.audioStream.setServerMuted);
168
+ });
169
+
170
+ it('syncs client mute intent back to server on stale remoteMute=false', async () => {
171
+ // client wants mute (localMute=true) but server's
172
+ // local-mute is out of sync (=false) - e.g. an attendee promoted to panelist whose
173
+ // server-side mute state got mis-set during promotion. remoteMute is currently true.
174
+ audio.state.client.localMute = true;
175
+ audio.state.server.localMute = false;
176
+ audio.state.server.remoteMute = true;
177
+
178
+ MeetingUtil.remoteUpdateAudioVideo.resetHistory();
179
+
180
+ // Stale event after BO -> main clears remoteMute.
181
+ audio.handleServerRemoteMuteUpdate(meeting, false, true);
182
+ await testUtils.flushPromises();
183
+
184
+ // applyClientStateToServer must detect the mismatch and push local mute back
185
+ // to server, so server.controls.audio.muted stays true for other participants' tiles.
186
+ assert.calledOnce(MeetingUtil.remoteUpdateAudioVideo);
187
+ assert.calledWith(MeetingUtil.remoteUpdateAudioVideo, meeting, true, undefined);
188
+ assert.isTrue(audio.isMuted());
189
+ });
190
+
112
191
  it('does local audio unmute if localAudioUnmuteRequired is received', async () => {
113
192
  // first we need to have the local stream user muted
114
193
  meeting.mediaProperties.audioStream.userMuted = true;
@@ -826,6 +905,8 @@ describe('plugin-meetings', () => {
826
905
  it('does not do anything if current state is already the same', async () => {
827
906
  // set it up so that we are remotely muted (so that a sync to server would do a remote unmute)
828
907
  audio.handleServerRemoteMuteUpdate(meeting, true, true);
908
+ await testUtils.flushPromises();
909
+ resetStubHistory();
829
910
 
830
911
  // audio is already enabled and we call to enable it again
831
912
  audio.enable(meeting, true);
@@ -347,6 +347,18 @@ describe('plugin-meetings', () => {
347
347
  'ANNOTATION_ON_SHARE_SUPPORTED',
348
348
  ]);
349
349
  });
350
+ it('adds deviceCapabilities to request when simultaneous interpretation is enabled', async () => {
351
+ await meetingsRequest.joinMeeting({
352
+ enableSimultaneousInterpretation: true,
353
+ });
354
+ const requestParams = meetingsRequest.request.getCall(0).args[0];
355
+ assert.deepEqual(requestParams.body.deviceCapabilities, [
356
+ 'HOST_CONTROL_SI_SUPPORTED',
357
+ 'INTERPRETER_CONTROL_SI_SUPPORTED',
358
+ 'SI_HANDOVER_SUPPORTED',
359
+ 'SIGN_INTERPRETER_SUPPORTED',
360
+ ]);
361
+ });
350
362
  it('does not add deviceCapabilities to request when breakouts and live annotation are not supported', async () => {
351
363
  await meetingsRequest.joinMeeting({});
352
364
 
@@ -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: {
@@ -1146,6 +1175,10 @@ describe('plugin-meetings', () => {
1146
1175
  {functionName: 'canSelectSpokenLanguages', displayHint: 'DISPLAY_NON_ENGLISH_ASR'},
1147
1176
  {functionName: 'waitingForOthersToJoin', displayHint: 'WAITING_FOR_OTHERS'},
1148
1177
  {functionName: 'showAutoEndMeetingWarning', displayHint: 'SHOW_AUTO_END_MEETING_WARNING'},
1178
+ {
1179
+ functionName: 'isAnonymizeDisplayNamesEnabled',
1180
+ displayHint: 'ANONYMOUS_DISPLAY_NAMES_ENABLED',
1181
+ },
1149
1182
  ].forEach(({functionName, displayHint}) => {
1150
1183
  describe(functionName, () => {
1151
1184
  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 () => {