@webex/plugin-meetings 3.8.1 → 3.9.0-next.10

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 (294) hide show
  1. package/README.md +26 -13
  2. package/dist/breakouts/breakout.js +1 -1
  3. package/dist/breakouts/index.js +1 -1
  4. package/dist/constants.js +32 -3
  5. package/dist/constants.js.map +1 -1
  6. package/dist/controls-options-manager/enums.js +1 -0
  7. package/dist/controls-options-manager/enums.js.map +1 -1
  8. package/dist/controls-options-manager/types.js.map +1 -1
  9. package/dist/controls-options-manager/util.js +26 -0
  10. package/dist/controls-options-manager/util.js.map +1 -1
  11. package/dist/interpretation/index.js +1 -1
  12. package/dist/interpretation/siLanguage.js +1 -1
  13. package/dist/locus-info/controlsUtils.js +11 -3
  14. package/dist/locus-info/controlsUtils.js.map +1 -1
  15. package/dist/locus-info/index.js +84 -91
  16. package/dist/locus-info/index.js.map +1 -1
  17. package/dist/locus-info/parser.js +4 -1
  18. package/dist/locus-info/parser.js.map +1 -1
  19. package/dist/media/index.js +2 -2
  20. package/dist/media/index.js.map +1 -1
  21. package/dist/meeting/brbState.js +17 -14
  22. package/dist/meeting/brbState.js.map +1 -1
  23. package/dist/meeting/in-meeting-actions.js +11 -1
  24. package/dist/meeting/in-meeting-actions.js.map +1 -1
  25. package/dist/meeting/index.js +484 -287
  26. package/dist/meeting/index.js.map +1 -1
  27. package/dist/meeting/request.js +19 -0
  28. package/dist/meeting/request.js.map +1 -1
  29. package/dist/meeting/request.type.js.map +1 -1
  30. package/dist/{rtcMetrics/constants.js → meeting/type.js} +1 -5
  31. package/dist/meeting/type.js.map +1 -0
  32. package/dist/meeting/util.js +68 -2
  33. package/dist/meeting/util.js.map +1 -1
  34. package/dist/meetings/index.js +35 -33
  35. package/dist/meetings/index.js.map +1 -1
  36. package/dist/members/index.js +14 -11
  37. package/dist/members/index.js.map +1 -1
  38. package/dist/members/request.js +3 -3
  39. package/dist/members/request.js.map +1 -1
  40. package/dist/members/util.js +25 -8
  41. package/dist/members/util.js.map +1 -1
  42. package/dist/metrics/constants.js +1 -0
  43. package/dist/metrics/constants.js.map +1 -1
  44. package/dist/multistream/mediaRequestManager.js +1 -1
  45. package/dist/multistream/mediaRequestManager.js.map +1 -1
  46. package/dist/multistream/remoteMedia.js +34 -5
  47. package/dist/multistream/remoteMedia.js.map +1 -1
  48. package/dist/multistream/remoteMediaGroup.js +42 -2
  49. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  50. package/dist/multistream/sendSlotManager.js +32 -2
  51. package/dist/multistream/sendSlotManager.js.map +1 -1
  52. package/dist/reachability/index.js +8 -13
  53. package/dist/reachability/index.js.map +1 -1
  54. package/dist/types/constants.d.ts +28 -0
  55. package/dist/types/controls-options-manager/enums.d.ts +2 -1
  56. package/dist/types/controls-options-manager/types.d.ts +4 -1
  57. package/dist/types/locus-info/index.d.ts +2 -9
  58. package/dist/types/meeting/brbState.d.ts +0 -1
  59. package/dist/types/meeting/in-meeting-actions.d.ts +10 -0
  60. package/dist/types/meeting/index.d.ts +47 -19
  61. package/dist/types/meeting/request.d.ts +9 -1
  62. package/dist/types/meeting/request.type.d.ts +74 -0
  63. package/dist/types/meeting/type.d.ts +9 -0
  64. package/dist/types/meeting/util.d.ts +3 -0
  65. package/dist/types/members/index.d.ts +12 -8
  66. package/dist/types/members/request.d.ts +1 -1
  67. package/dist/types/members/util.d.ts +13 -6
  68. package/dist/types/metrics/constants.d.ts +1 -0
  69. package/dist/types/multistream/remoteMedia.d.ts +20 -1
  70. package/dist/types/multistream/remoteMediaGroup.d.ts +11 -0
  71. package/dist/types/multistream/sendSlotManager.d.ts +16 -0
  72. package/dist/types/reachability/index.d.ts +2 -2
  73. package/dist/webinar/index.js +1 -1
  74. package/package.json +24 -25
  75. package/src/constants.ts +32 -2
  76. package/src/controls-options-manager/enums.ts +1 -0
  77. package/src/controls-options-manager/types.ts +6 -1
  78. package/src/controls-options-manager/util.ts +31 -0
  79. package/src/locus-info/controlsUtils.ts +15 -0
  80. package/src/locus-info/index.ts +103 -92
  81. package/src/locus-info/parser.ts +5 -1
  82. package/src/media/index.ts +2 -2
  83. package/src/meeting/brbState.ts +13 -9
  84. package/src/meeting/in-meeting-actions.ts +21 -0
  85. package/src/meeting/index.ts +278 -73
  86. package/src/meeting/request.ts +16 -0
  87. package/src/meeting/request.type.ts +64 -0
  88. package/src/meeting/type.ts +9 -0
  89. package/src/meeting/util.ts +73 -2
  90. package/src/meetings/index.ts +3 -2
  91. package/src/members/index.ts +22 -12
  92. package/src/members/request.ts +2 -2
  93. package/src/members/util.ts +34 -6
  94. package/src/metrics/constants.ts +1 -0
  95. package/src/multistream/mediaRequestManager.ts +7 -7
  96. package/src/multistream/remoteMedia.ts +34 -4
  97. package/src/multistream/remoteMediaGroup.ts +37 -2
  98. package/src/multistream/sendSlotManager.ts +34 -2
  99. package/src/reachability/index.ts +8 -16
  100. package/test/unit/spec/controls-options-manager/util.js +58 -0
  101. package/test/unit/spec/locus-info/controlsUtils.js +52 -0
  102. package/test/unit/spec/locus-info/index.js +247 -89
  103. package/test/unit/spec/locus-info/parser.js +3 -2
  104. package/test/unit/spec/media/index.ts +107 -0
  105. package/test/unit/spec/meeting/brbState.ts +23 -4
  106. package/test/unit/spec/meeting/in-meeting-actions.ts +10 -0
  107. package/test/unit/spec/meeting/index.js +976 -91
  108. package/test/unit/spec/meeting/request.js +71 -0
  109. package/test/unit/spec/meeting/utils.js +122 -1
  110. package/test/unit/spec/meetings/index.js +2 -0
  111. package/test/unit/spec/members/index.js +98 -11
  112. package/test/unit/spec/members/request.js +57 -2
  113. package/test/unit/spec/members/utils.js +139 -17
  114. package/test/unit/spec/multistream/mediaRequestManager.ts +19 -6
  115. package/test/unit/spec/multistream/remoteMedia.ts +66 -2
  116. package/test/unit/spec/multistream/sendSlotManager.ts +59 -0
  117. package/test/unit/spec/reachability/index.ts +160 -9
  118. package/dist/annotation/annotation.types.d.ts +0 -42
  119. package/dist/annotation/constants.d.ts +0 -31
  120. package/dist/annotation/index.d.ts +0 -117
  121. package/dist/breakouts/breakout.d.ts +0 -8
  122. package/dist/breakouts/collection.d.ts +0 -5
  123. package/dist/breakouts/edit-lock-error.d.ts +0 -15
  124. package/dist/breakouts/events.d.ts +0 -8
  125. package/dist/breakouts/index.d.ts +0 -5
  126. package/dist/breakouts/request.d.ts +0 -22
  127. package/dist/breakouts/utils.d.ts +0 -15
  128. package/dist/common/browser-detection.d.ts +0 -9
  129. package/dist/common/collection.d.ts +0 -48
  130. package/dist/common/config.d.ts +0 -2
  131. package/dist/common/errors/captcha-error.d.ts +0 -15
  132. package/dist/common/errors/intent-to-join.d.ts +0 -16
  133. package/dist/common/errors/join-meeting.d.ts +0 -17
  134. package/dist/common/errors/media.d.ts +0 -15
  135. package/dist/common/errors/no-meeting-info.d.ts +0 -14
  136. package/dist/common/errors/parameter.d.ts +0 -15
  137. package/dist/common/errors/password-error.d.ts +0 -15
  138. package/dist/common/errors/permission.d.ts +0 -14
  139. package/dist/common/errors/reclaim-host-role-error.d.ts +0 -60
  140. package/dist/common/errors/reclaim-host-role-error.js +0 -158
  141. package/dist/common/errors/reclaim-host-role-error.js.map +0 -1
  142. package/dist/common/errors/reclaim-host-role-errors.d.ts +0 -60
  143. package/dist/common/errors/reconnection-in-progress.d.ts +0 -9
  144. package/dist/common/errors/reconnection-in-progress.js +0 -35
  145. package/dist/common/errors/reconnection-in-progress.js.map +0 -1
  146. package/dist/common/errors/reconnection.d.ts +0 -15
  147. package/dist/common/errors/stats.d.ts +0 -15
  148. package/dist/common/errors/webex-errors.d.ts +0 -81
  149. package/dist/common/errors/webex-meetings-error.d.ts +0 -20
  150. package/dist/common/events/events-scope.d.ts +0 -17
  151. package/dist/common/events/events.d.ts +0 -12
  152. package/dist/common/events/trigger-proxy.d.ts +0 -2
  153. package/dist/common/events/util.d.ts +0 -2
  154. package/dist/common/logs/logger-config.d.ts +0 -2
  155. package/dist/common/logs/logger-proxy.d.ts +0 -2
  156. package/dist/common/logs/request.d.ts +0 -34
  157. package/dist/common/queue.d.ts +0 -32
  158. package/dist/config.d.ts +0 -73
  159. package/dist/constants.d.ts +0 -952
  160. package/dist/controls-options-manager/constants.d.ts +0 -4
  161. package/dist/controls-options-manager/enums.d.ts +0 -5
  162. package/dist/controls-options-manager/index.d.ts +0 -120
  163. package/dist/controls-options-manager/types.d.ts +0 -43
  164. package/dist/controls-options-manager/util.d.ts +0 -7
  165. package/dist/index.d.ts +0 -4
  166. package/dist/interceptors/index.d.ts +0 -2
  167. package/dist/interceptors/locusRetry.d.ts +0 -27
  168. package/dist/interpretation/collection.d.ts +0 -5
  169. package/dist/interpretation/index.d.ts +0 -5
  170. package/dist/interpretation/siLanguage.d.ts +0 -5
  171. package/dist/locus-info/controlsUtils.d.ts +0 -2
  172. package/dist/locus-info/embeddedAppsUtils.d.ts +0 -2
  173. package/dist/locus-info/fullState.d.ts +0 -2
  174. package/dist/locus-info/hostUtils.d.ts +0 -2
  175. package/dist/locus-info/index.d.ts +0 -269
  176. package/dist/locus-info/infoUtils.d.ts +0 -2
  177. package/dist/locus-info/mediaSharesUtils.d.ts +0 -2
  178. package/dist/locus-info/parser.d.ts +0 -212
  179. package/dist/locus-info/selfUtils.d.ts +0 -2
  180. package/dist/media/index.d.ts +0 -32
  181. package/dist/media/properties.d.ts +0 -108
  182. package/dist/media/util.d.ts +0 -2
  183. package/dist/mediaQualityMetrics/config.d.ts +0 -233
  184. package/dist/mediaQualityMetrics/config.js +0 -513
  185. package/dist/mediaQualityMetrics/config.js.map +0 -1
  186. package/dist/meeting/effectsState.d.ts +0 -42
  187. package/dist/meeting/effectsState.js +0 -260
  188. package/dist/meeting/effectsState.js.map +0 -1
  189. package/dist/meeting/in-meeting-actions.d.ts +0 -79
  190. package/dist/meeting/index.d.ts +0 -1622
  191. package/dist/meeting/locusMediaRequest.d.ts +0 -74
  192. package/dist/meeting/muteState.d.ts +0 -116
  193. package/dist/meeting/request.d.ts +0 -257
  194. package/dist/meeting/request.type.d.ts +0 -11
  195. package/dist/meeting/state.d.ts +0 -9
  196. package/dist/meeting/util.d.ts +0 -2
  197. package/dist/meeting/voicea-meeting.d.ts +0 -16
  198. package/dist/meeting-info/collection.d.ts +0 -20
  199. package/dist/meeting-info/index.d.ts +0 -57
  200. package/dist/meeting-info/meeting-info-v2.d.ts +0 -93
  201. package/dist/meeting-info/request.d.ts +0 -22
  202. package/dist/meeting-info/util.d.ts +0 -2
  203. package/dist/meeting-info/utilv2.d.ts +0 -2
  204. package/dist/meetings/collection.d.ts +0 -23
  205. package/dist/meetings/index.d.ts +0 -296
  206. package/dist/meetings/meetings.types.d.ts +0 -4
  207. package/dist/meetings/request.d.ts +0 -27
  208. package/dist/meetings/util.d.ts +0 -18
  209. package/dist/member/index.d.ts +0 -148
  210. package/dist/member/member.types.d.ts +0 -11
  211. package/dist/member/member.types.js +0 -18
  212. package/dist/member/member.types.js.map +0 -1
  213. package/dist/member/types.d.ts +0 -32
  214. package/dist/member/util.d.ts +0 -2
  215. package/dist/members/collection.d.ts +0 -24
  216. package/dist/members/index.d.ts +0 -308
  217. package/dist/members/request.d.ts +0 -58
  218. package/dist/members/types.d.ts +0 -25
  219. package/dist/members/util.d.ts +0 -2
  220. package/dist/metrics/config.d.ts +0 -169
  221. package/dist/metrics/config.js +0 -289
  222. package/dist/metrics/config.js.map +0 -1
  223. package/dist/metrics/constants.d.ts +0 -59
  224. package/dist/metrics/index.d.ts +0 -152
  225. package/dist/multistream/mediaRequestManager.d.ts +0 -119
  226. package/dist/multistream/receiveSlot.d.ts +0 -68
  227. package/dist/multistream/receiveSlotManager.d.ts +0 -56
  228. package/dist/multistream/remoteMedia.d.ts +0 -72
  229. package/dist/multistream/remoteMediaGroup.d.ts +0 -49
  230. package/dist/multistream/remoteMediaManager.d.ts +0 -300
  231. package/dist/multistream/sendSlotManager.d.ts +0 -69
  232. package/dist/networkQualityMonitor/index.d.ts +0 -70
  233. package/dist/networkQualityMonitor/index.js +0 -226
  234. package/dist/networkQualityMonitor/index.js.map +0 -1
  235. package/dist/peer-connection-manager/index.d.ts +0 -6
  236. package/dist/peer-connection-manager/index.js +0 -671
  237. package/dist/peer-connection-manager/index.js.map +0 -1
  238. package/dist/peer-connection-manager/util.d.ts +0 -6
  239. package/dist/peer-connection-manager/util.js +0 -110
  240. package/dist/peer-connection-manager/util.js.map +0 -1
  241. package/dist/personal-meeting-room/index.d.ts +0 -47
  242. package/dist/personal-meeting-room/request.d.ts +0 -14
  243. package/dist/personal-meeting-room/util.d.ts +0 -2
  244. package/dist/reachability/clusterReachability.d.ts +0 -109
  245. package/dist/reachability/index.d.ts +0 -139
  246. package/dist/reachability/request.d.ts +0 -35
  247. package/dist/reachability/util.d.ts +0 -8
  248. package/dist/reactions/constants.d.ts +0 -3
  249. package/dist/reactions/reactions.d.ts +0 -4
  250. package/dist/reactions/reactions.type.d.ts +0 -32
  251. package/dist/reconnection-manager/index.d.ts +0 -112
  252. package/dist/recording-controller/enums.d.ts +0 -7
  253. package/dist/recording-controller/index.d.ts +0 -193
  254. package/dist/recording-controller/util.d.ts +0 -13
  255. package/dist/roap/collection.d.ts +0 -10
  256. package/dist/roap/collection.js +0 -63
  257. package/dist/roap/collection.js.map +0 -1
  258. package/dist/roap/handler.d.ts +0 -47
  259. package/dist/roap/handler.js +0 -279
  260. package/dist/roap/handler.js.map +0 -1
  261. package/dist/roap/index.d.ts +0 -116
  262. package/dist/roap/request.d.ts +0 -35
  263. package/dist/roap/state.d.ts +0 -9
  264. package/dist/roap/state.js +0 -127
  265. package/dist/roap/state.js.map +0 -1
  266. package/dist/roap/turnDiscovery.d.ts +0 -81
  267. package/dist/roap/util.d.ts +0 -2
  268. package/dist/roap/util.js +0 -76
  269. package/dist/roap/util.js.map +0 -1
  270. package/dist/rtcMetrics/constants.d.ts +0 -4
  271. package/dist/rtcMetrics/constants.js.map +0 -1
  272. package/dist/rtcMetrics/index.d.ts +0 -61
  273. package/dist/rtcMetrics/index.js +0 -197
  274. package/dist/rtcMetrics/index.js.map +0 -1
  275. package/dist/statsAnalyzer/global.d.ts +0 -118
  276. package/dist/statsAnalyzer/global.js +0 -127
  277. package/dist/statsAnalyzer/global.js.map +0 -1
  278. package/dist/statsAnalyzer/index.d.ts +0 -193
  279. package/dist/statsAnalyzer/index.js +0 -1019
  280. package/dist/statsAnalyzer/index.js.map +0 -1
  281. package/dist/statsAnalyzer/mqaUtil.d.ts +0 -22
  282. package/dist/statsAnalyzer/mqaUtil.js +0 -181
  283. package/dist/statsAnalyzer/mqaUtil.js.map +0 -1
  284. package/dist/transcription/index.d.ts +0 -64
  285. package/dist/types/common/errors/reconnection-in-progress.d.ts +0 -9
  286. package/dist/types/mediaQualityMetrics/config.d.ts +0 -241
  287. package/dist/types/networkQualityMonitor/index.d.ts +0 -70
  288. package/dist/types/rtcMetrics/constants.d.ts +0 -4
  289. package/dist/types/rtcMetrics/index.d.ts +0 -71
  290. package/dist/types/statsAnalyzer/global.d.ts +0 -36
  291. package/dist/types/statsAnalyzer/index.d.ts +0 -217
  292. package/dist/types/statsAnalyzer/mqaUtil.d.ts +0 -48
  293. package/dist/webinar/collection.d.ts +0 -16
  294. package/dist/webinar/index.d.ts +0 -5
@@ -826,4 +826,75 @@ describe('plugin-meetings', () => {
826
826
  });
827
827
  });
828
828
  });
829
+
830
+ describe('#synchronizeStage', () => {
831
+ [
832
+ ['an unset stage', {overrideDefault: false}],
833
+ [
834
+ 'a minimally set stage',
835
+ {
836
+ overrideDefault: true,
837
+ lockAttendeeViewOnStageOnly: false,
838
+ stageParameters: {
839
+ activeSpeakerProportion: 0.5,
840
+ showActiveSpeaker: {show: false, order: 0},
841
+ stageManagerType: 0,
842
+ },
843
+ },
844
+ ],
845
+ [
846
+ 'a fully set stage',
847
+ {
848
+ overrideDefault: true,
849
+ lockAttendeeViewOnStageOnly: true,
850
+ stageParameters: {
851
+ activeSpeakerProportion: 0.6,
852
+ importantParticipants: [
853
+ {mainCsi: 11111111, participantId: uuidv4(), order: 1},
854
+ {mainCsi: 22222222, participantId: uuidv4(), order: 2},
855
+ {mainCsi: 33333333, participantId: uuidv4(), order: 3},
856
+ {mainCsi: 44444444, participantId: uuidv4(), order: 4},
857
+ {mainCsi: 55555555, participantId: uuidv4(), order: 5},
858
+ {mainCsi: 66666666, participantId: uuidv4(), order: 6},
859
+ {mainCsi: 77777777, participantId: uuidv4(), order: 7},
860
+ {mainCsi: 88888888, participantId: uuidv4(), order: 8},
861
+ ],
862
+ showActiveSpeaker: {show: true, order: 0},
863
+ stageManagerType: 7,
864
+ },
865
+ customLayouts: {
866
+ background: {url: `https://test.wbx2.com/background/${uuidv4()}.jpg`},
867
+ logo: {url: `https://test.wbx2.com/logo/${uuidv4()}.png`, position: 'UpperMiddle'},
868
+ },
869
+ nameLabelStyle: {
870
+ accentColor: '#00A3FF',
871
+ background: {color: 'rgba(0, 163, 255, 1)'},
872
+ border: {color: 'rgba(0, 163, 255, 1)'},
873
+ content: {
874
+ displayName: {color: 'rgba(255, 255, 255, 0.95)'},
875
+ subtitle: {color: 'rgba(255, 255, 255, 0.7)'},
876
+ },
877
+ decoration: {color: 'rgba(255, 255, 255, 0.95)'},
878
+ fadeOut: {delay: 15},
879
+ type: 'PrimaryInverted',
880
+ },
881
+ },
882
+ ],
883
+ ].forEach(([description, videoLayout]) => {
884
+ it(`sends request to synchronize the stage with ${description} video layout`, async () => {
885
+ const locusUrl = `https://locus-test.wbx2.com/locus/api/v1/loci/${uuidv4()}`;
886
+
887
+ const synchronizePromise = meetingsRequest.synchronizeStage(locusUrl, videoLayout);
888
+
889
+ assert.exists(synchronizePromise.then);
890
+ await synchronizePromise;
891
+
892
+ checkRequest({
893
+ method: 'PATCH',
894
+ uri: `${locusUrl}/controls`,
895
+ body: {videoLayout},
896
+ });
897
+ });
898
+ });
899
+ });
829
900
  });
@@ -3,12 +3,14 @@ import sinon from 'sinon';
3
3
  import {assert} from '@webex/test-helper-chai';
4
4
  import Meetings from '@webex/plugin-meetings';
5
5
  import MeetingUtil from '@webex/plugin-meetings/src/meeting/util';
6
- import {LOCAL_SHARE_ERRORS} from '@webex/plugin-meetings/src/constants';
6
+ import {LOCAL_SHARE_ERRORS, PASSWORD_STATUS} from '@webex/plugin-meetings/src/constants';
7
7
  import LoggerProxy from '@webex/plugin-meetings/src/common/logs/logger-proxy';
8
8
  import LoggerConfig from '@webex/plugin-meetings/src/common/logs/logger-config';
9
9
  import {SELF_POLICY, IP_VERSION} from '@webex/plugin-meetings/src/constants';
10
10
  import MockWebex from '@webex/test-helper-mock-webex';
11
11
  import * as BrowserDetectionModule from '@webex/plugin-meetings/src/common/browser-detection';
12
+ import PasswordError from '@webex/plugin-meetings/src/common/errors/password-error';
13
+ import CaptchaError from '@webex/plugin-meetings/src/common/errors/captcha-error';
12
14
 
13
15
  describe('plugin-meetings', () => {
14
16
  let webex;
@@ -57,6 +59,10 @@ describe('plugin-meetings', () => {
57
59
  meeting.getWebexObject = sinon.stub().returns(webex);
58
60
  meeting.simultaneousInterpretation = {cleanUp: sinon.stub()};
59
61
  meeting.trigger = sinon.stub();
62
+ meeting.webex = webex;
63
+ meeting.webex.internal.newMetrics.callDiagnosticMetrics =
64
+ meeting.webex.internal.newMetrics.callDiagnosticMetrics || {};
65
+ meeting.webex.internal.newMetrics.callDiagnosticMetrics.clearEventLimitsForCorrelationId = sinon.stub();
60
66
  });
61
67
 
62
68
  afterEach(() => {
@@ -81,6 +87,10 @@ describe('plugin-meetings', () => {
81
87
  assert.calledOnce(meeting.breakouts.cleanUp);
82
88
  assert.calledOnce(meeting.simultaneousInterpretation.cleanUp);
83
89
  assert.calledOnce(webex.internal.device.meetingEnded);
90
+ assert.calledOnceWithExactly(
91
+ meeting.webex.internal.newMetrics.callDiagnosticMetrics.clearEventLimitsForCorrelationId,
92
+ meeting.correlationId
93
+ );
84
94
  });
85
95
 
86
96
  it('do clean up on meeting object with LLM disabled', async () => {
@@ -98,6 +108,10 @@ describe('plugin-meetings', () => {
98
108
  assert.calledOnce(meeting.breakouts.cleanUp);
99
109
  assert.calledOnce(meeting.simultaneousInterpretation.cleanUp);
100
110
  assert.calledOnce(webex.internal.device.meetingEnded);
111
+ assert.calledOnceWithExactly(
112
+ meeting.webex.internal.newMetrics.callDiagnosticMetrics.clearEventLimitsForCorrelationId,
113
+ meeting.correlationId
114
+ );
101
115
  });
102
116
 
103
117
  it('do clean up on meeting object with no config', async () => {
@@ -114,6 +128,10 @@ describe('plugin-meetings', () => {
114
128
  assert.calledOnce(meeting.breakouts.cleanUp);
115
129
  assert.calledOnce(meeting.simultaneousInterpretation.cleanUp);
116
130
  assert.calledOnce(webex.internal.device.meetingEnded);
131
+ assert.calledOnceWithExactly(
132
+ meeting.webex.internal.newMetrics.callDiagnosticMetrics.clearEventLimitsForCorrelationId,
133
+ meeting.correlationId
134
+ );
117
135
  });
118
136
  });
119
137
 
@@ -622,6 +640,28 @@ describe('plugin-meetings', () => {
622
640
 
623
641
  assert.equal(parameter.locusClusterUrl, 'locusClusterUrl');
624
642
  });
643
+
644
+ it('should post client event with error when join fails', async () => {
645
+ const joinError = new Error('Join failed');
646
+ meeting.meetingRequest.joinMeeting.rejects(joinError);
647
+ meeting.meetingInfo = { meetingLookupUrl: 'test-lookup-url' };
648
+
649
+ try {
650
+ await MeetingUtil.joinMeeting(meeting, {});
651
+ assert.fail('Expected joinMeeting to throw an error');
652
+ } catch (error) {
653
+ assert.equal(error, joinError);
654
+
655
+ // Verify error client event was submitted
656
+ assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
657
+ name: 'client.locus.join.response',
658
+ payload: {
659
+ identifiers: { meetingLookupUrl: 'test-lookup-url' },
660
+ },
661
+ options: { meetingId: meeting.id, rawError: joinError },
662
+ });
663
+ }
664
+ });
625
665
  });
626
666
 
627
667
  describe('joinMeetingOptions', () => {
@@ -661,6 +701,82 @@ describe('plugin-meetings', () => {
661
701
  joinMeetingSpy.restore();
662
702
  }
663
703
  });
704
+
705
+ it('should submit client event and reject with PasswordError when password is required', async () => {
706
+ const meeting = {
707
+ id: 'meeting-id',
708
+ passwordStatus: PASSWORD_STATUS.REQUIRED,
709
+ resourceId: null,
710
+ requiredCaptcha: null,
711
+ getWebexObject: sinon.stub().returns(webex),
712
+ };
713
+
714
+ try {
715
+ await MeetingUtil.joinMeetingOptions(meeting, {});
716
+ assert.fail('Expected joinMeetingOptions to throw PasswordError');
717
+ } catch (error) {
718
+ assert.instanceOf(error, PasswordError);
719
+
720
+ // Verify client event was submitted with error details
721
+ assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
722
+ name: 'client.meetinginfo.response',
723
+ options: {
724
+ meetingId: meeting.id,
725
+ },
726
+ payload: {
727
+ errors: [
728
+ {
729
+ fatal: false,
730
+ category: 'expected',
731
+ name: 'other',
732
+ shownToUser: false,
733
+ errorCode: error.code,
734
+ errorDescription: error.name,
735
+ rawErrorMessage: error.sdkMessage,
736
+ },
737
+ ],
738
+ },
739
+ });
740
+ }
741
+ });
742
+
743
+ it('should submit client event and reject with CaptchaError when captcha is required', async () => {
744
+ const meeting = {
745
+ id: 'meeting-id',
746
+ passwordStatus: null,
747
+ resourceId: null,
748
+ requiredCaptcha: {captchaId: 'test-captcha'},
749
+ getWebexObject: sinon.stub().returns(webex),
750
+ };
751
+
752
+ try {
753
+ await MeetingUtil.joinMeetingOptions(meeting, {});
754
+ assert.fail('Expected joinMeetingOptions to throw CaptchaError');
755
+ } catch (error) {
756
+ assert.instanceOf(error, CaptchaError);
757
+
758
+ // Verify client event was submitted with error details
759
+ assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
760
+ name: 'client.meetinginfo.response',
761
+ options: {
762
+ meetingId: meeting.id,
763
+ },
764
+ payload: {
765
+ errors: [
766
+ {
767
+ fatal: false,
768
+ category: 'expected',
769
+ name: 'other',
770
+ shownToUser: false,
771
+ errorCode: error.code,
772
+ errorDescription: error.name,
773
+ rawErrorMessage: error.sdkMessage,
774
+ },
775
+ ],
776
+ },
777
+ });
778
+ }
779
+ });
664
780
  });
665
781
 
666
782
  describe('getUserDisplayHintsFromLocusInfo', () => {
@@ -850,6 +966,11 @@ describe('plugin-meetings', () => {
850
966
  {functionName: 'isClosedCaptionActive', displayHint: 'CAPTION_STATUS_ACTIVE'},
851
967
  {functionName: 'canStartManualCaption', displayHint: 'MANUAL_CAPTION_START'},
852
968
  {functionName: 'canStopManualCaption', displayHint: 'MANUAL_CAPTION_STOP'},
969
+
970
+ {functionName: 'isLocalRecordingStarted',displayHint:'LOCAL_RECORDING_STATUS_STARTED'},
971
+ {functionName: 'isLocalRecordingStopped', displayHint: 'LOCAL_RECORDING_STATUS_STOPPED'},
972
+ {functionName: 'isLocalRecordingPaused', displayHint: 'LOCAL_RECORDING_STATUS_PAUSED'},
973
+
853
974
  {functionName: 'isManualCaptionActive', displayHint: 'MANUAL_CAPTION_STATUS_ACTIVE'},
854
975
  {functionName: 'isWebexAssistantActive', displayHint: 'WEBEX_ASSISTANT_STATUS_ACTIVE'},
855
976
  {functionName: 'canViewCaptionPanel', displayHint: 'ENABLE_CAPTION_PANEL'},
@@ -189,6 +189,7 @@ describe('plugin-meetings', () => {
189
189
  },
190
190
  callDiagnosticMetrics: {
191
191
  clearErrorCache: sinon.stub(),
192
+ clearEventLimits: sinon.stub(),
192
193
  },
193
194
  },
194
195
  });
@@ -1716,6 +1717,7 @@ describe('plugin-meetings', () => {
1716
1717
  {file: 'meetings', function: 'fetchMeetingInfo'},
1717
1718
  'meeting:meetingInfoAvailable'
1718
1719
  );
1720
+ assert.equal(webex.meetings.meetingCollection.get(meeting.id), meeting);
1719
1721
  };
1720
1722
 
1721
1723
  it('creates the meeting from a successful meeting info fetch promise testing', async () => {
@@ -176,6 +176,56 @@ describe('plugin-meetings', () => {
176
176
  assert.calledOnce(MembersUtil.isInvalidInvitee);
177
177
  assert.isFalse(MembersUtil.isInvalidInvitee({email: 'sip:test@cisco.com'}), 'SIP email should be valid');
178
178
  });
179
+
180
+ it('should skip email validation if skipEmailValidation is true', async () => {
181
+ sandbox.spy(MembersUtil, 'isInvalidInvitee');
182
+
183
+ const members = createMembers({url: true});
184
+
185
+ await members.addMember({email: '8618578675309', skipEmailValidation: true});
186
+
187
+ assert.notCalled(MembersUtil.isInvalidInvitee);
188
+ });
189
+
190
+ it('should not skip email validation if skipEmailValidation is not equal true', async () => {
191
+ sandbox.spy(MembersUtil, 'isInvalidInvitee');
192
+
193
+ const members = createMembers({url: true});
194
+
195
+ await members.addMember({email: '86185786@ds.com'});
196
+
197
+ assert.called(MembersUtil.isInvalidInvitee);
198
+ });
199
+
200
+ it('should accept valid phone with isInternalNumber', async () => {
201
+ sandbox.spy(MembersUtil, 'isInvalidInvitee');
202
+
203
+ const members = createMembers({url: true});
204
+
205
+ await members.addMember({phoneNumber: '+8618578675309', isInternalNumber: false});
206
+
207
+ assert.calledOnce(MembersUtil.isInvalidInvitee);
208
+ assert.isFalse(MembersUtil.isInvalidInvitee({ phoneNumber: '+8618578675309', isInternalNumber: false }));
209
+ assert.isTrue(MembersUtil.isInvalidInvitee({ phoneNumber: '18578675309', isInternalNumber: false }));
210
+ assert.isFalse(MembersUtil.isInvalidInvitee({phoneNumber: '18578675309', isInternalNumber: true}));
211
+ assert.isTrue(MembersUtil.isInvalidInvitee({phoneNumber: '+8618578675309', isInternalNumber: true}));
212
+ });
213
+
214
+ it('should not crash if params is undefined', async () => {
215
+ sandbox.spy(MembersUtil, 'isInvalidInvitee');
216
+
217
+ const members = createMembers({url: true});
218
+
219
+ try {
220
+ await members.addMember(undefined);
221
+ } catch (err) {
222
+ assert.instanceOf(err, ParameterError);
223
+
224
+ assert.equal(err.message, 'The invitee must be defined with either a valid email, emailAddress or phoneNumber property.');
225
+ }
226
+
227
+ assert.called(MembersUtil.isInvalidInvitee);
228
+ });
179
229
  });
180
230
 
181
231
  describe('#admitMembers', () => {
@@ -465,29 +515,38 @@ describe('plugin-meetings', () => {
465
515
  });
466
516
  });
467
517
 
468
- describe('#cancelSIPInvite', () => {
518
+ describe('#cancelInviteByMemberId', () => {
469
519
  const memberId = uuid.v4();
470
- it('should invoke cancelSIPInviteOptions from MembersUtil when cancelSIPInvite is called with valid params', async () => {
471
- sandbox.spy(MembersUtil, 'cancelSIPInviteOptions');
520
+ it('should invoke cancelInviteByMemberIdOptions from MembersUtil when cancelInviteByMemberId is called with valid params', async () => {
521
+ sandbox.spy(MembersUtil, 'cancelInviteByMemberIdOptions');
472
522
 
473
523
  const members = createMembers({url: url1});
474
524
 
475
- await members.cancelSIPInvite({memberId});
476
- assert.calledOnce(MembersUtil.cancelSIPInviteOptions);
525
+ await members.cancelInviteByMemberId({memberId});
526
+ assert.calledOnce(MembersUtil.cancelInviteByMemberIdOptions);
527
+ });
528
+
529
+ it('should invoke cancelInviteByMemberIdOptions from MembersUtil when cancelInviteByMemberId is called with isInternalNumber', async () => {
530
+ sandbox.spy(MembersUtil, 'cancelInviteByMemberIdOptions');
531
+
532
+ const members = createMembers({url: url1});
533
+
534
+ await members.cancelInviteByMemberId({memberId, isInternalNumber: true});
535
+ assert.calledOnce(MembersUtil.cancelInviteByMemberIdOptions);
477
536
  });
478
537
 
479
538
  it('should throw a rejection if there is no locus url', async () => {
480
539
  const members = createMembers({url: false});
481
540
 
482
- assert.isRejected(members.cancelSIPInvite({memberId}));
541
+ assert.isRejected(members.cancelInviteByMemberId({memberId}));
483
542
  });
484
543
 
485
544
  it('should throw a rejection if memberId is not provided', async () => {
486
545
  const members = createMembers({url: url1});
487
546
 
488
- assert.isRejected(members.cancelSIPInvite({}));
489
- assert.isRejected(members.cancelSIPInvite({memberId: null}));
490
- assert.isRejected(members.cancelSIPInvite({memberId: undefined}));
547
+ assert.isRejected(members.cancelInviteByMemberId({}));
548
+ assert.isRejected(members.cancelInviteByMemberId({memberId: null}));
549
+ assert.isRejected(members.cancelInviteByMemberId({memberId: undefined}));
491
550
  });
492
551
  });
493
552
 
@@ -914,7 +973,8 @@ describe('plugin-meetings', () => {
914
973
  expectedMemberId,
915
974
  expectedRequestingParticipantId,
916
975
  expectedAlias,
917
- expectedLocusUrl
976
+ expectedLocusUrl,
977
+ expectedSuffix
918
978
  ) => {
919
979
  await assert.isFulfilled(resultPromise);
920
980
  assert.calledOnceWithExactly(
@@ -922,13 +982,15 @@ describe('plugin-meetings', () => {
922
982
  expectedMemberId,
923
983
  expectedRequestingParticipantId,
924
984
  expectedAlias,
925
- expectedLocusUrl
985
+ expectedLocusUrl,
986
+ expectedSuffix
926
987
  );
927
988
  assert.calledOnceWithExactly(spies.editDisplayNameMember, {
928
989
  memberId: expectedMemberId,
929
990
  requestingParticipantId: expectedRequestingParticipantId,
930
991
  alias: expectedAlias,
931
992
  locusUrl: expectedLocusUrl,
993
+ suffix: expectedSuffix,
932
994
  });
933
995
  assert.strictEqual(resultPromise, spies.editDisplayNameMember.getCall(0).returnValue);
934
996
  };
@@ -958,6 +1020,31 @@ describe('plugin-meetings', () => {
958
1020
  });
959
1021
 
960
1022
  it('should make the correct request when called with respective parameters', async () => {
1023
+ const requestingParticipantId = uuid.v4();
1024
+ const memberId = uuid.v4();
1025
+ const alias = 'aliasName';
1026
+ const suffix = 'suffixName';
1027
+ const {members, spies} = setup(url1);
1028
+
1029
+ const resultPromise = members.editDisplayName(
1030
+ memberId,
1031
+ requestingParticipantId,
1032
+ alias,
1033
+ suffix
1034
+ );
1035
+
1036
+ await checkValid(
1037
+ resultPromise,
1038
+ spies,
1039
+ memberId,
1040
+ requestingParticipantId,
1041
+ alias,
1042
+ url1,
1043
+ suffix
1044
+ );
1045
+ });
1046
+
1047
+ it('should make the correct request when called with respective parameters - no suffix', async () => {
961
1048
  const requestingParticipantId = uuid.v4();
962
1049
  const memberId = uuid.v4();
963
1050
  const alias = 'aliasName';
@@ -221,7 +221,7 @@ describe('plugin-meetings', () => {
221
221
  });
222
222
  });
223
223
 
224
- describe('#cancelSIPInvite', () => {
224
+ describe('#cancelInviteByMemberId', () => {
225
225
  const memberId = uuid.v4();
226
226
  it('sends a PUT to the locus endpoint', async () => {
227
227
  const options = {
@@ -231,7 +231,7 @@ describe('plugin-meetings', () => {
231
231
  locusUrl: url1,
232
232
  };
233
233
 
234
- await membersRequest.cancelSIPInvite(options);
234
+ await membersRequest.cancelInviteByMemberId(options);
235
235
 
236
236
  checkRequest({
237
237
  method: 'PUT',
@@ -429,6 +429,61 @@ describe('plugin-meetings', () => {
429
429
  },
430
430
  });
431
431
  });
432
+
433
+ it('sends a POST request to the locus endpoint with suffix empty string', async () => {
434
+ const locusUrl = url1;
435
+ const memberId = 'test1';
436
+ const requestingParticipantId = 'test2';
437
+ const aliasValue = 'alias';
438
+
439
+ const options = {
440
+ memberId,
441
+ requestingParticipantId,
442
+ alias: aliasValue,
443
+ locusUrl,
444
+ suffix: '',
445
+ };
446
+
447
+ await membersRequest.editDisplayNameMember(options);
448
+
449
+ checkRequest({
450
+ method: 'POST',
451
+ uri: `${locusUrl}/participant/${memberId}/alias`,
452
+ body: {
453
+ aliasValue,
454
+ requestingParticipantId,
455
+ suffixValue: '',
456
+ },
457
+ });
458
+ });
459
+
460
+ it('sends a POST request to the locus endpoint with suffixValue', async () => {
461
+ const locusUrl = url1;
462
+ const memberId = 'test1';
463
+ const requestingParticipantId = 'test2';
464
+ const aliasValue = 'alias';
465
+ const suffixValue = 'suffix';
466
+
467
+ const options = {
468
+ memberId,
469
+ requestingParticipantId,
470
+ alias: aliasValue,
471
+ locusUrl,
472
+ suffix: suffixValue,
473
+ };
474
+
475
+ await membersRequest.editDisplayNameMember(options);
476
+
477
+ checkRequest({
478
+ method: 'POST',
479
+ uri: `${locusUrl}/participant/${memberId}/alias`,
480
+ body: {
481
+ aliasValue,
482
+ requestingParticipantId,
483
+ suffixValue,
484
+ },
485
+ });
486
+ });
432
487
  });
433
488
 
434
489
  describe('#moveToLobby', () => {