@webex/plugin-meetings 3.8.1 → 3.9.0-multipleLLM.1

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 (317) 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 +34 -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 +107 -95
  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/media/properties.js +53 -5
  22. package/dist/media/properties.js.map +1 -1
  23. package/dist/meeting/brbState.js +17 -14
  24. package/dist/meeting/brbState.js.map +1 -1
  25. package/dist/meeting/in-meeting-actions.js +13 -1
  26. package/dist/meeting/in-meeting-actions.js.map +1 -1
  27. package/dist/meeting/index.js +555 -296
  28. package/dist/meeting/index.js.map +1 -1
  29. package/dist/meeting/muteState.js +2 -5
  30. package/dist/meeting/muteState.js.map +1 -1
  31. package/dist/meeting/request.js +44 -0
  32. package/dist/meeting/request.js.map +1 -1
  33. package/dist/meeting/request.type.js.map +1 -1
  34. package/dist/{rtcMetrics/constants.js → meeting/type.js} +1 -5
  35. package/dist/meeting/type.js.map +1 -0
  36. package/dist/meeting/util.js +98 -13
  37. package/dist/meeting/util.js.map +1 -1
  38. package/dist/meeting-info/meeting-info-v2.js +29 -21
  39. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  40. package/dist/meetings/index.js +18 -10
  41. package/dist/meetings/index.js.map +1 -1
  42. package/dist/member/types.js.map +1 -1
  43. package/dist/members/collection.js +13 -0
  44. package/dist/members/collection.js.map +1 -1
  45. package/dist/members/index.js +53 -29
  46. package/dist/members/index.js.map +1 -1
  47. package/dist/members/request.js +3 -3
  48. package/dist/members/request.js.map +1 -1
  49. package/dist/members/util.js +25 -8
  50. package/dist/members/util.js.map +1 -1
  51. package/dist/metrics/constants.js +3 -1
  52. package/dist/metrics/constants.js.map +1 -1
  53. package/dist/multistream/mediaRequestManager.js +1 -1
  54. package/dist/multistream/mediaRequestManager.js.map +1 -1
  55. package/dist/multistream/remoteMedia.js +34 -5
  56. package/dist/multistream/remoteMedia.js.map +1 -1
  57. package/dist/multistream/remoteMediaGroup.js +42 -2
  58. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  59. package/dist/multistream/sendSlotManager.js +32 -2
  60. package/dist/multistream/sendSlotManager.js.map +1 -1
  61. package/dist/reachability/index.js +8 -13
  62. package/dist/reachability/index.js.map +1 -1
  63. package/dist/types/constants.d.ts +30 -0
  64. package/dist/types/controls-options-manager/enums.d.ts +2 -1
  65. package/dist/types/controls-options-manager/types.d.ts +4 -1
  66. package/dist/types/locus-info/index.d.ts +54 -10
  67. package/dist/types/media/properties.d.ts +21 -0
  68. package/dist/types/meeting/brbState.d.ts +0 -1
  69. package/dist/types/meeting/in-meeting-actions.d.ts +12 -0
  70. package/dist/types/meeting/index.d.ts +58 -20
  71. package/dist/types/meeting/request.d.ts +18 -1
  72. package/dist/types/meeting/request.type.d.ts +74 -0
  73. package/dist/types/meeting/type.d.ts +9 -0
  74. package/dist/types/meeting/util.d.ts +13 -3
  75. package/dist/types/meeting-info/meeting-info-v2.d.ts +6 -3
  76. package/dist/types/meetings/index.d.ts +3 -1
  77. package/dist/types/member/types.d.ts +1 -0
  78. package/dist/types/members/collection.d.ts +6 -0
  79. package/dist/types/members/index.d.ts +22 -9
  80. package/dist/types/members/request.d.ts +1 -1
  81. package/dist/types/members/util.d.ts +13 -6
  82. package/dist/types/metrics/constants.d.ts +2 -0
  83. package/dist/types/multistream/remoteMedia.d.ts +20 -1
  84. package/dist/types/multistream/remoteMediaGroup.d.ts +11 -0
  85. package/dist/types/multistream/sendSlotManager.d.ts +16 -0
  86. package/dist/types/reachability/index.d.ts +2 -2
  87. package/dist/webinar/index.js +1 -1
  88. package/package.json +24 -25
  89. package/src/constants.ts +34 -2
  90. package/src/controls-options-manager/enums.ts +1 -0
  91. package/src/controls-options-manager/types.ts +6 -1
  92. package/src/controls-options-manager/util.ts +31 -0
  93. package/src/locus-info/controlsUtils.ts +15 -0
  94. package/src/locus-info/index.ts +174 -96
  95. package/src/locus-info/parser.ts +5 -1
  96. package/src/media/index.ts +2 -2
  97. package/src/media/properties.ts +43 -0
  98. package/src/meeting/brbState.ts +13 -9
  99. package/src/meeting/in-meeting-actions.ts +25 -0
  100. package/src/meeting/index.ts +362 -75
  101. package/src/meeting/muteState.ts +2 -6
  102. package/src/meeting/request.ts +39 -0
  103. package/src/meeting/request.type.ts +64 -0
  104. package/src/meeting/type.ts +9 -0
  105. package/src/meeting/util.ts +114 -22
  106. package/src/meeting-info/meeting-info-v2.ts +24 -5
  107. package/src/meetings/index.ts +12 -5
  108. package/src/member/types.ts +1 -0
  109. package/src/members/collection.ts +11 -0
  110. package/src/members/index.ts +51 -15
  111. package/src/members/request.ts +2 -2
  112. package/src/members/util.ts +34 -6
  113. package/src/metrics/constants.ts +2 -0
  114. package/src/multistream/mediaRequestManager.ts +7 -7
  115. package/src/multistream/remoteMedia.ts +34 -4
  116. package/src/multistream/remoteMediaGroup.ts +37 -2
  117. package/src/multistream/sendSlotManager.ts +34 -2
  118. package/src/reachability/index.ts +8 -16
  119. package/test/unit/spec/controls-options-manager/util.js +58 -0
  120. package/test/unit/spec/locus-info/controlsUtils.js +52 -0
  121. package/test/unit/spec/locus-info/index.js +270 -97
  122. package/test/unit/spec/locus-info/parser.js +3 -2
  123. package/test/unit/spec/media/index.ts +107 -0
  124. package/test/unit/spec/media/properties.ts +137 -0
  125. package/test/unit/spec/meeting/brbState.ts +23 -4
  126. package/test/unit/spec/meeting/in-meeting-actions.ts +12 -0
  127. package/test/unit/spec/meeting/index.js +1194 -97
  128. package/test/unit/spec/meeting/muteState.js +32 -6
  129. package/test/unit/spec/meeting/request.js +92 -0
  130. package/test/unit/spec/meeting/utils.js +167 -17
  131. package/test/unit/spec/meeting-info/meetinginfov2.js +8 -3
  132. package/test/unit/spec/meetings/index.js +12 -1
  133. package/test/unit/spec/members/collection.js +120 -0
  134. package/test/unit/spec/members/index.js +140 -12
  135. package/test/unit/spec/members/request.js +57 -2
  136. package/test/unit/spec/members/utils.js +139 -17
  137. package/test/unit/spec/multistream/mediaRequestManager.ts +19 -6
  138. package/test/unit/spec/multistream/remoteMedia.ts +66 -2
  139. package/test/unit/spec/multistream/sendSlotManager.ts +59 -0
  140. package/test/unit/spec/reachability/index.ts +160 -9
  141. package/dist/annotation/annotation.types.d.ts +0 -42
  142. package/dist/annotation/constants.d.ts +0 -31
  143. package/dist/annotation/index.d.ts +0 -117
  144. package/dist/breakouts/breakout.d.ts +0 -8
  145. package/dist/breakouts/collection.d.ts +0 -5
  146. package/dist/breakouts/edit-lock-error.d.ts +0 -15
  147. package/dist/breakouts/events.d.ts +0 -8
  148. package/dist/breakouts/index.d.ts +0 -5
  149. package/dist/breakouts/request.d.ts +0 -22
  150. package/dist/breakouts/utils.d.ts +0 -15
  151. package/dist/common/browser-detection.d.ts +0 -9
  152. package/dist/common/collection.d.ts +0 -48
  153. package/dist/common/config.d.ts +0 -2
  154. package/dist/common/errors/captcha-error.d.ts +0 -15
  155. package/dist/common/errors/intent-to-join.d.ts +0 -16
  156. package/dist/common/errors/join-meeting.d.ts +0 -17
  157. package/dist/common/errors/media.d.ts +0 -15
  158. package/dist/common/errors/no-meeting-info.d.ts +0 -14
  159. package/dist/common/errors/parameter.d.ts +0 -15
  160. package/dist/common/errors/password-error.d.ts +0 -15
  161. package/dist/common/errors/permission.d.ts +0 -14
  162. package/dist/common/errors/reclaim-host-role-error.d.ts +0 -60
  163. package/dist/common/errors/reclaim-host-role-error.js +0 -158
  164. package/dist/common/errors/reclaim-host-role-error.js.map +0 -1
  165. package/dist/common/errors/reclaim-host-role-errors.d.ts +0 -60
  166. package/dist/common/errors/reconnection-in-progress.d.ts +0 -9
  167. package/dist/common/errors/reconnection-in-progress.js +0 -35
  168. package/dist/common/errors/reconnection-in-progress.js.map +0 -1
  169. package/dist/common/errors/reconnection.d.ts +0 -15
  170. package/dist/common/errors/stats.d.ts +0 -15
  171. package/dist/common/errors/webex-errors.d.ts +0 -81
  172. package/dist/common/errors/webex-meetings-error.d.ts +0 -20
  173. package/dist/common/events/events-scope.d.ts +0 -17
  174. package/dist/common/events/events.d.ts +0 -12
  175. package/dist/common/events/trigger-proxy.d.ts +0 -2
  176. package/dist/common/events/util.d.ts +0 -2
  177. package/dist/common/logs/logger-config.d.ts +0 -2
  178. package/dist/common/logs/logger-proxy.d.ts +0 -2
  179. package/dist/common/logs/request.d.ts +0 -34
  180. package/dist/common/queue.d.ts +0 -32
  181. package/dist/config.d.ts +0 -73
  182. package/dist/constants.d.ts +0 -952
  183. package/dist/controls-options-manager/constants.d.ts +0 -4
  184. package/dist/controls-options-manager/enums.d.ts +0 -5
  185. package/dist/controls-options-manager/index.d.ts +0 -120
  186. package/dist/controls-options-manager/types.d.ts +0 -43
  187. package/dist/controls-options-manager/util.d.ts +0 -7
  188. package/dist/index.d.ts +0 -4
  189. package/dist/interceptors/index.d.ts +0 -2
  190. package/dist/interceptors/locusRetry.d.ts +0 -27
  191. package/dist/interpretation/collection.d.ts +0 -5
  192. package/dist/interpretation/index.d.ts +0 -5
  193. package/dist/interpretation/siLanguage.d.ts +0 -5
  194. package/dist/locus-info/controlsUtils.d.ts +0 -2
  195. package/dist/locus-info/embeddedAppsUtils.d.ts +0 -2
  196. package/dist/locus-info/fullState.d.ts +0 -2
  197. package/dist/locus-info/hostUtils.d.ts +0 -2
  198. package/dist/locus-info/index.d.ts +0 -269
  199. package/dist/locus-info/infoUtils.d.ts +0 -2
  200. package/dist/locus-info/mediaSharesUtils.d.ts +0 -2
  201. package/dist/locus-info/parser.d.ts +0 -212
  202. package/dist/locus-info/selfUtils.d.ts +0 -2
  203. package/dist/media/index.d.ts +0 -32
  204. package/dist/media/properties.d.ts +0 -108
  205. package/dist/media/util.d.ts +0 -2
  206. package/dist/mediaQualityMetrics/config.d.ts +0 -233
  207. package/dist/mediaQualityMetrics/config.js +0 -513
  208. package/dist/mediaQualityMetrics/config.js.map +0 -1
  209. package/dist/meeting/effectsState.d.ts +0 -42
  210. package/dist/meeting/effectsState.js +0 -260
  211. package/dist/meeting/effectsState.js.map +0 -1
  212. package/dist/meeting/in-meeting-actions.d.ts +0 -79
  213. package/dist/meeting/index.d.ts +0 -1622
  214. package/dist/meeting/locusMediaRequest.d.ts +0 -74
  215. package/dist/meeting/muteState.d.ts +0 -116
  216. package/dist/meeting/request.d.ts +0 -257
  217. package/dist/meeting/request.type.d.ts +0 -11
  218. package/dist/meeting/state.d.ts +0 -9
  219. package/dist/meeting/util.d.ts +0 -2
  220. package/dist/meeting/voicea-meeting.d.ts +0 -16
  221. package/dist/meeting-info/collection.d.ts +0 -20
  222. package/dist/meeting-info/index.d.ts +0 -57
  223. package/dist/meeting-info/meeting-info-v2.d.ts +0 -93
  224. package/dist/meeting-info/request.d.ts +0 -22
  225. package/dist/meeting-info/util.d.ts +0 -2
  226. package/dist/meeting-info/utilv2.d.ts +0 -2
  227. package/dist/meetings/collection.d.ts +0 -23
  228. package/dist/meetings/index.d.ts +0 -296
  229. package/dist/meetings/meetings.types.d.ts +0 -4
  230. package/dist/meetings/request.d.ts +0 -27
  231. package/dist/meetings/util.d.ts +0 -18
  232. package/dist/member/index.d.ts +0 -148
  233. package/dist/member/member.types.d.ts +0 -11
  234. package/dist/member/member.types.js +0 -18
  235. package/dist/member/member.types.js.map +0 -1
  236. package/dist/member/types.d.ts +0 -32
  237. package/dist/member/util.d.ts +0 -2
  238. package/dist/members/collection.d.ts +0 -24
  239. package/dist/members/index.d.ts +0 -308
  240. package/dist/members/request.d.ts +0 -58
  241. package/dist/members/types.d.ts +0 -25
  242. package/dist/members/util.d.ts +0 -2
  243. package/dist/metrics/config.d.ts +0 -169
  244. package/dist/metrics/config.js +0 -289
  245. package/dist/metrics/config.js.map +0 -1
  246. package/dist/metrics/constants.d.ts +0 -59
  247. package/dist/metrics/index.d.ts +0 -152
  248. package/dist/multistream/mediaRequestManager.d.ts +0 -119
  249. package/dist/multistream/receiveSlot.d.ts +0 -68
  250. package/dist/multistream/receiveSlotManager.d.ts +0 -56
  251. package/dist/multistream/remoteMedia.d.ts +0 -72
  252. package/dist/multistream/remoteMediaGroup.d.ts +0 -49
  253. package/dist/multistream/remoteMediaManager.d.ts +0 -300
  254. package/dist/multistream/sendSlotManager.d.ts +0 -69
  255. package/dist/networkQualityMonitor/index.d.ts +0 -70
  256. package/dist/networkQualityMonitor/index.js +0 -226
  257. package/dist/networkQualityMonitor/index.js.map +0 -1
  258. package/dist/peer-connection-manager/index.d.ts +0 -6
  259. package/dist/peer-connection-manager/index.js +0 -671
  260. package/dist/peer-connection-manager/index.js.map +0 -1
  261. package/dist/peer-connection-manager/util.d.ts +0 -6
  262. package/dist/peer-connection-manager/util.js +0 -110
  263. package/dist/peer-connection-manager/util.js.map +0 -1
  264. package/dist/personal-meeting-room/index.d.ts +0 -47
  265. package/dist/personal-meeting-room/request.d.ts +0 -14
  266. package/dist/personal-meeting-room/util.d.ts +0 -2
  267. package/dist/reachability/clusterReachability.d.ts +0 -109
  268. package/dist/reachability/index.d.ts +0 -139
  269. package/dist/reachability/request.d.ts +0 -35
  270. package/dist/reachability/util.d.ts +0 -8
  271. package/dist/reactions/constants.d.ts +0 -3
  272. package/dist/reactions/reactions.d.ts +0 -4
  273. package/dist/reactions/reactions.type.d.ts +0 -32
  274. package/dist/reconnection-manager/index.d.ts +0 -112
  275. package/dist/recording-controller/enums.d.ts +0 -7
  276. package/dist/recording-controller/index.d.ts +0 -193
  277. package/dist/recording-controller/util.d.ts +0 -13
  278. package/dist/roap/collection.d.ts +0 -10
  279. package/dist/roap/collection.js +0 -63
  280. package/dist/roap/collection.js.map +0 -1
  281. package/dist/roap/handler.d.ts +0 -47
  282. package/dist/roap/handler.js +0 -279
  283. package/dist/roap/handler.js.map +0 -1
  284. package/dist/roap/index.d.ts +0 -116
  285. package/dist/roap/request.d.ts +0 -35
  286. package/dist/roap/state.d.ts +0 -9
  287. package/dist/roap/state.js +0 -127
  288. package/dist/roap/state.js.map +0 -1
  289. package/dist/roap/turnDiscovery.d.ts +0 -81
  290. package/dist/roap/util.d.ts +0 -2
  291. package/dist/roap/util.js +0 -76
  292. package/dist/roap/util.js.map +0 -1
  293. package/dist/rtcMetrics/constants.d.ts +0 -4
  294. package/dist/rtcMetrics/constants.js.map +0 -1
  295. package/dist/rtcMetrics/index.d.ts +0 -61
  296. package/dist/rtcMetrics/index.js +0 -197
  297. package/dist/rtcMetrics/index.js.map +0 -1
  298. package/dist/statsAnalyzer/global.d.ts +0 -118
  299. package/dist/statsAnalyzer/global.js +0 -127
  300. package/dist/statsAnalyzer/global.js.map +0 -1
  301. package/dist/statsAnalyzer/index.d.ts +0 -193
  302. package/dist/statsAnalyzer/index.js +0 -1019
  303. package/dist/statsAnalyzer/index.js.map +0 -1
  304. package/dist/statsAnalyzer/mqaUtil.d.ts +0 -22
  305. package/dist/statsAnalyzer/mqaUtil.js +0 -181
  306. package/dist/statsAnalyzer/mqaUtil.js.map +0 -1
  307. package/dist/transcription/index.d.ts +0 -64
  308. package/dist/types/common/errors/reconnection-in-progress.d.ts +0 -9
  309. package/dist/types/mediaQualityMetrics/config.d.ts +0 -241
  310. package/dist/types/networkQualityMonitor/index.d.ts +0 -70
  311. package/dist/types/rtcMetrics/constants.d.ts +0 -4
  312. package/dist/types/rtcMetrics/index.d.ts +0 -71
  313. package/dist/types/statsAnalyzer/global.d.ts +0 -36
  314. package/dist/types/statsAnalyzer/index.d.ts +0 -217
  315. package/dist/types/statsAnalyzer/mqaUtil.d.ts +0 -48
  316. package/dist/webinar/collection.d.ts +0 -16
  317. package/dist/webinar/index.d.ts +0 -5
@@ -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
  });
@@ -1098,6 +1099,7 @@ describe('plugin-meetings', () => {
1098
1099
  const FAKE_USE_RANDOM_DELAY = true;
1099
1100
  const correlationId = 'my-correlationId';
1100
1101
  const sessionCorrelationId = 'my-session-correlationId';
1102
+ const classificationId = 'my-classificationId';
1101
1103
  const callStateForMetrics = {
1102
1104
  sessionCorrelationId: 'my-session-correlationId2',
1103
1105
  correlationId: 'my-correlationId2',
@@ -1118,7 +1120,8 @@ describe('plugin-meetings', () => {
1118
1120
  callStateForMetrics,
1119
1121
  undefined,
1120
1122
  undefined,
1121
- sessionCorrelationId
1123
+ sessionCorrelationId,
1124
+ classificationId
1122
1125
  );
1123
1126
  assert.calledOnceWithExactly(fakeMeeting.updateCallStateForMetrics, {
1124
1127
  ...callStateForMetrics,
@@ -1200,6 +1203,13 @@ describe('plugin-meetings', () => {
1200
1203
  );
1201
1204
  });
1202
1205
 
1206
+ it('calls createMeeting with classificationId and returns its promise', async () => {
1207
+ await checkCallCreateMeeting(
1208
+ [test1, test2, FAKE_USE_RANDOM_DELAY, {}, undefined, true, callStateForMetrics, undefined, undefined, undefined, classificationId],
1209
+ [test1, test2, FAKE_USE_RANDOM_DELAY, {}, callStateForMetrics, true, undefined, undefined, classificationId],
1210
+ );
1211
+ });
1212
+
1203
1213
  it('calls createMeeting with callStateForMetrics overwritten with correlationId and returns its promise', async () => {
1204
1214
  await checkCallCreateMeeting(
1205
1215
  [test1, test2, FAKE_USE_RANDOM_DELAY, {}, correlationId, true, callStateForMetrics],
@@ -1716,6 +1726,7 @@ describe('plugin-meetings', () => {
1716
1726
  {file: 'meetings', function: 'fetchMeetingInfo'},
1717
1727
  'meeting:meetingInfoAvailable'
1718
1728
  );
1729
+ assert.equal(webex.meetings.meetingCollection.get(meeting.id), meeting);
1719
1730
  };
1720
1731
 
1721
1732
  it('creates the meeting from a successful meeting info fetch promise testing', async () => {
@@ -0,0 +1,120 @@
1
+ const { default: MembersCollection } = require("../../../../src/members/collection");
2
+ const { default: Member } = require("../../../../src/member");
3
+ const { assert } = require('@webex/test-helper-chai');
4
+
5
+
6
+ describe('plugin-meetings', () => {
7
+ describe('MembersCollection', () => {
8
+ let collection;
9
+ let member1;
10
+ let member2;
11
+ const participant1 = { controls: {}, status: {} };
12
+ const participant2 = { controls: {}, status: {} };
13
+
14
+ beforeEach(() => {
15
+ collection = new MembersCollection();
16
+ member1 = new Member(participant1);
17
+ member2 = new Member(participant2);
18
+ });
19
+
20
+ it('starts with no members', () => {
21
+ assert.equal(Object.keys(collection.getAll()).length, 0);
22
+ });
23
+
24
+ it('can add members', () => {
25
+ collection.set('member1', member1);
26
+ assert.equal(Object.keys(collection.getAll()).length, 1);
27
+ assert.equal(collection.get('member1'), member1);
28
+
29
+ collection.set('member2', member2);
30
+ assert.equal(Object.keys(collection.getAll()).length, 2);
31
+ assert.equal(collection.get('member2'), member2);
32
+ });
33
+
34
+ it('can remove members', () => {
35
+ // Add some members first
36
+ collection.set('member1', member1);
37
+ collection.set('member2', member2);
38
+ assert.equal(Object.keys(collection.getAll()).length, 2);
39
+
40
+ // Remove one member
41
+ collection.remove('member1');
42
+ assert.equal(Object.keys(collection.getAll()).length, 1);
43
+ assert.equal(collection.get('member1'), undefined);
44
+ assert.equal(collection.get('member2'), member2);
45
+
46
+ // Remove another member
47
+ collection.remove('member2');
48
+ assert.equal(Object.keys(collection.getAll()).length, 0);
49
+ assert.equal(collection.get('member2'), undefined);
50
+
51
+ // Removing non-existent member should not cause errors
52
+ collection.remove('nonExistent');
53
+ assert.equal(Object.keys(collection.getAll()).length, 0);
54
+ });
55
+
56
+ describe('reset', () => {
57
+ it('removes all members', () => {
58
+ // Add some members first
59
+ collection.set('member1', member1);
60
+ collection.set('member2', member2);
61
+ assert.equal(Object.keys(collection.getAll()).length, 2);
62
+
63
+ // Reset should clear all members
64
+ collection.reset();
65
+ assert.equal(Object.keys(collection.getAll()).length, 0);
66
+ assert.equal(collection.get('member1'), undefined);
67
+ assert.equal(collection.get('member2'), undefined);
68
+ });
69
+ });
70
+
71
+ describe('setAll', () => {
72
+ it('replaces all members with new collection', () => {
73
+ // Add initial member
74
+ collection.set('member1', member1);
75
+ assert.equal(Object.keys(collection.getAll()).length, 1);
76
+
77
+ // Set all with new collection
78
+ const newMembers = {
79
+ 'member2': member2,
80
+ 'member3': new Member(participant1)
81
+ };
82
+ collection.setAll(newMembers);
83
+
84
+ assert.equal(Object.keys(collection.getAll()).length, 2);
85
+ assert.equal(collection.get('member1'), undefined);
86
+ assert.equal(collection.get('member2'), member2);
87
+ assert.exists(collection.get('member3'));
88
+ });
89
+ });
90
+
91
+ describe('get', () => {
92
+ it('returns undefined for non-existent members', () => {
93
+ assert.equal(collection.get('nonExistent'), undefined);
94
+ });
95
+
96
+ it('returns correct member for existing id', () => {
97
+ collection.set('member1', member1);
98
+ assert.equal(collection.get('member1'), member1);
99
+ });
100
+ });
101
+
102
+ describe('getAll', () => {
103
+ it('returns empty object when no members', () => {
104
+ const allMembers = collection.getAll();
105
+ assert.isObject(allMembers);
106
+ assert.equal(Object.keys(allMembers).length, 0);
107
+ });
108
+
109
+ it('returns all members', () => {
110
+ collection.set('member1', member1);
111
+ collection.set('member2', member2);
112
+
113
+ const allMembers = collection.getAll();
114
+ assert.equal(Object.keys(allMembers).length, 2);
115
+ assert.equal(allMembers.member1, member1);
116
+ assert.equal(allMembers.member2, member2);
117
+ });
118
+ });
119
+ });
120
+ });
@@ -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', () => {
@@ -270,9 +320,18 @@ describe('plugin-meetings', () => {
270
320
  EVENT_TRIGGERS.MEMBERS_CLEAR,
271
321
  {}
272
322
  );
323
+ sinon.restore();
273
324
  });
274
325
  });
275
326
  describe('#locusParticipantsUpdate', () => {
327
+ beforeEach(() => {
328
+ sinon.stub(Trigger, 'trigger');
329
+ });
330
+
331
+ afterEach(() => {
332
+ sinon.restore();
333
+ });
334
+
276
335
  it('should send member update event with session info', () => {
277
336
  const members = createMembers({url: url1});
278
337
  const fakePayload = {
@@ -293,13 +352,45 @@ describe('plugin-meetings', () => {
293
352
  },
294
353
  EVENT_TRIGGERS.MEMBERS_UPDATE,
295
354
  {
296
- delta: {added: [], updated: []},
355
+ delta: {added: [], updated: [], removedIds: []},
297
356
  full: {},
298
357
  isReplace: true,
299
358
  }
300
359
  );
301
360
  });
302
361
 
362
+ it('should handle participants being removed', () => {
363
+ const members = createMembers({url: url1});
364
+
365
+ // setup the collection with a fake member
366
+ members.membersCollection.setAll(fakeMembersCollection);
367
+ assert.equal(Object.keys(members.membersCollection.getAll()).length, 1);
368
+
369
+ // remove the member
370
+ members.locusParticipantsUpdate({
371
+ participants: [],
372
+ removedParticipantIds: ['test1'],
373
+ });
374
+
375
+ assert.equal(Object.keys(members.membersCollection.getAll()).length, 0);
376
+
377
+ // check that the event was emitted
378
+ assert.calledWith(
379
+ Trigger.trigger,
380
+ members,
381
+ {
382
+ file: 'members',
383
+ function: 'locusParticipantsUpdate',
384
+ },
385
+ EVENT_TRIGGERS.MEMBERS_UPDATE,
386
+ {
387
+ delta: {added: [], updated: [], removedIds: ['test1']},
388
+ full: {},
389
+ isReplace: false,
390
+ }
391
+ );
392
+ });
393
+
303
394
  describe('handles members with paired devices correctly', () => {
304
395
  const runCheck = (propsForUpdate, expectedPropsOnPairedMember) => {
305
396
  const members = createMembers({url: url1});
@@ -465,29 +556,38 @@ describe('plugin-meetings', () => {
465
556
  });
466
557
  });
467
558
 
468
- describe('#cancelSIPInvite', () => {
559
+ describe('#cancelInviteByMemberId', () => {
469
560
  const memberId = uuid.v4();
470
- it('should invoke cancelSIPInviteOptions from MembersUtil when cancelSIPInvite is called with valid params', async () => {
471
- sandbox.spy(MembersUtil, 'cancelSIPInviteOptions');
561
+ it('should invoke cancelInviteByMemberIdOptions from MembersUtil when cancelInviteByMemberId is called with valid params', async () => {
562
+ sandbox.spy(MembersUtil, 'cancelInviteByMemberIdOptions');
563
+
564
+ const members = createMembers({url: url1});
565
+
566
+ await members.cancelInviteByMemberId({memberId});
567
+ assert.calledOnce(MembersUtil.cancelInviteByMemberIdOptions);
568
+ });
569
+
570
+ it('should invoke cancelInviteByMemberIdOptions from MembersUtil when cancelInviteByMemberId is called with isInternalNumber', async () => {
571
+ sandbox.spy(MembersUtil, 'cancelInviteByMemberIdOptions');
472
572
 
473
573
  const members = createMembers({url: url1});
474
574
 
475
- await members.cancelSIPInvite({memberId});
476
- assert.calledOnce(MembersUtil.cancelSIPInviteOptions);
575
+ await members.cancelInviteByMemberId({memberId, isInternalNumber: true});
576
+ assert.calledOnce(MembersUtil.cancelInviteByMemberIdOptions);
477
577
  });
478
578
 
479
579
  it('should throw a rejection if there is no locus url', async () => {
480
580
  const members = createMembers({url: false});
481
581
 
482
- assert.isRejected(members.cancelSIPInvite({memberId}));
582
+ assert.isRejected(members.cancelInviteByMemberId({memberId}));
483
583
  });
484
584
 
485
585
  it('should throw a rejection if memberId is not provided', async () => {
486
586
  const members = createMembers({url: url1});
487
587
 
488
- assert.isRejected(members.cancelSIPInvite({}));
489
- assert.isRejected(members.cancelSIPInvite({memberId: null}));
490
- assert.isRejected(members.cancelSIPInvite({memberId: undefined}));
588
+ assert.isRejected(members.cancelInviteByMemberId({}));
589
+ assert.isRejected(members.cancelInviteByMemberId({memberId: null}));
590
+ assert.isRejected(members.cancelInviteByMemberId({memberId: undefined}));
491
591
  });
492
592
  });
493
593
 
@@ -914,7 +1014,8 @@ describe('plugin-meetings', () => {
914
1014
  expectedMemberId,
915
1015
  expectedRequestingParticipantId,
916
1016
  expectedAlias,
917
- expectedLocusUrl
1017
+ expectedLocusUrl,
1018
+ expectedSuffix
918
1019
  ) => {
919
1020
  await assert.isFulfilled(resultPromise);
920
1021
  assert.calledOnceWithExactly(
@@ -922,13 +1023,15 @@ describe('plugin-meetings', () => {
922
1023
  expectedMemberId,
923
1024
  expectedRequestingParticipantId,
924
1025
  expectedAlias,
925
- expectedLocusUrl
1026
+ expectedLocusUrl,
1027
+ expectedSuffix
926
1028
  );
927
1029
  assert.calledOnceWithExactly(spies.editDisplayNameMember, {
928
1030
  memberId: expectedMemberId,
929
1031
  requestingParticipantId: expectedRequestingParticipantId,
930
1032
  alias: expectedAlias,
931
1033
  locusUrl: expectedLocusUrl,
1034
+ suffix: expectedSuffix,
932
1035
  });
933
1036
  assert.strictEqual(resultPromise, spies.editDisplayNameMember.getCall(0).returnValue);
934
1037
  };
@@ -958,6 +1061,31 @@ describe('plugin-meetings', () => {
958
1061
  });
959
1062
 
960
1063
  it('should make the correct request when called with respective parameters', async () => {
1064
+ const requestingParticipantId = uuid.v4();
1065
+ const memberId = uuid.v4();
1066
+ const alias = 'aliasName';
1067
+ const suffix = 'suffixName';
1068
+ const {members, spies} = setup(url1);
1069
+
1070
+ const resultPromise = members.editDisplayName(
1071
+ memberId,
1072
+ requestingParticipantId,
1073
+ alias,
1074
+ suffix
1075
+ );
1076
+
1077
+ await checkValid(
1078
+ resultPromise,
1079
+ spies,
1080
+ memberId,
1081
+ requestingParticipantId,
1082
+ alias,
1083
+ url1,
1084
+ suffix
1085
+ );
1086
+ });
1087
+
1088
+ it('should make the correct request when called with respective parameters - no suffix', async () => {
961
1089
  const requestingParticipantId = uuid.v4();
962
1090
  const memberId = uuid.v4();
963
1091
  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', () => {
@@ -129,7 +129,32 @@ describe('plugin-meetings', () => {
129
129
  });
130
130
  });
131
131
  describe('#generateEditDisplayNameMemberOptions', () => {
132
- it('returns the correct options', () => {
132
+ it('returns the correct options with suffix when suffix is there', () => {
133
+ const locusUrl = 'urlTest1';
134
+ const memberId = 'test1';
135
+ const requestingParticipantId = 'test2';
136
+ const alias = 'alias';
137
+ const suffix = 'suffix';
138
+
139
+ assert.deepEqual(
140
+ MembersUtil.generateEditDisplayNameMemberOptions(
141
+ memberId,
142
+ requestingParticipantId,
143
+ alias,
144
+ locusUrl,
145
+ suffix
146
+ ),
147
+ {
148
+ memberId,
149
+ requestingParticipantId,
150
+ alias,
151
+ locusUrl,
152
+ suffix,
153
+ }
154
+ );
155
+ });
156
+
157
+ it('returns the correct options without suffix when suffix is not there', () => {
133
158
  const locusUrl = 'urlTest1';
134
159
  const memberId = 'test1';
135
160
  const requestingParticipantId = 'test2';
@@ -147,6 +172,7 @@ describe('plugin-meetings', () => {
147
172
  requestingParticipantId,
148
173
  alias,
149
174
  locusUrl,
175
+ suffix: undefined,
150
176
  }
151
177
  );
152
178
  });
@@ -302,6 +328,26 @@ describe('plugin-meetings', () => {
302
328
  });
303
329
  });
304
330
 
331
+ it('returns the correct body with phone number and isInternalNumber', () => {
332
+ const options = {
333
+ invitee: {
334
+ phoneNumber: '1234567890',
335
+ isInternalNumber: false,
336
+ },
337
+ alertIfActive: false,
338
+ };
339
+
340
+ assert.deepEqual(MembersUtil.getAddMemberBody(options), {
341
+ invitees: [
342
+ {
343
+ address: '1234567890',
344
+ isInternalNumber: false,
345
+ },
346
+ ],
347
+ alertIfActive: false,
348
+ });
349
+ });
350
+
305
351
  it('returns the correct body with fallback to email', () => {
306
352
  const options = {
307
353
  invitee: {
@@ -391,46 +437,122 @@ describe('plugin-meetings', () => {
391
437
  });
392
438
  });
393
439
 
394
- describe('#cancelSIPInviteOptions', () => {
440
+ describe('#cancelInviteByMemberIdOptions', () => {
395
441
  it('returns the correct options', () => {
396
442
  const locusUrl = 'TestLocusUrl';
397
443
  const memberId = 'test';
398
- const invitee = {memberId};
444
+ const invitee = {memberId, isInternalNumber: false};
399
445
 
400
- assert.deepEqual(
401
- MembersUtil.cancelSIPInviteOptions(
402
- invitee,
403
- locusUrl
404
- ),
405
- {
406
- invitee,
407
- locusUrl,
408
- }
409
- );
446
+ assert.deepEqual(MembersUtil.cancelInviteByMemberIdOptions(invitee, locusUrl), {
447
+ invitee,
448
+ locusUrl,
449
+ });
410
450
  });
411
451
  });
412
452
 
413
- describe('#generateCancelSIPInviteRequestParams', () => {
453
+ describe('#generateCancelInviteByMemberIdRequestParams', () => {
414
454
  it('returns the correct params', () => {
415
455
  const locusUrl = 'TestLocusUrl';
416
456
  const memberId = 'test';
417
457
  const options = {
418
458
  locusUrl,
419
- invitee: {memberId}
459
+ invitee: {memberId, isInternalNumber: false},
420
460
  };
421
461
  const body = {
422
462
  actionType: 'REMOVE',
423
- invitees: [{address: options.invitee.memberId}],
463
+ invitees: [{address: options.invitee.memberId, isInternalNumber: false}],
424
464
  };
425
465
 
426
466
  const uri = options.locusUrl;
427
467
 
428
- assert.deepEqual(MembersUtil.generateCancelSIPInviteRequestParams(options), {
468
+ assert.deepEqual(MembersUtil.generateCancelInviteByMemberIdRequestParams(options), {
429
469
  method: HTTP_VERBS.PUT,
430
470
  uri,
431
471
  body,
432
472
  });
433
473
  });
434
474
  });
475
+
476
+ describe('#editDisplayNameMemberRequestParams', () => {
477
+ it('returns the correct params when suffix is available', () => {
478
+ const locusUrl = 'TestLocusUrl1';
479
+ const memberId = 'test1';
480
+ const alias = 'alias1';
481
+ const requestingParticipantId = '23131';
482
+ const suffix = 'suffix1';
483
+ const options = {
484
+ locusUrl: locusUrl,
485
+ memberId,
486
+ alias,
487
+ requestingParticipantId,
488
+ suffix,
489
+ };
490
+
491
+ const uri = `${locusUrl}/participant/${memberId}/alias`;
492
+
493
+ assert.deepEqual(MembersUtil.editDisplayNameMemberRequestParams(options), {
494
+ method: HTTP_VERBS.POST,
495
+ uri,
496
+ body: {
497
+ aliasValue: alias,
498
+ requestingParticipantId,
499
+ suffixValue: suffix,
500
+ },
501
+ });
502
+ });
503
+
504
+ it('returns the correct params when suffix is not available', () => {
505
+ const locusUrl = 'TestLocusUrl2';
506
+ const memberId = 'test2';
507
+ const alias = 'alias2';
508
+ const requestingParticipantId = '12345';
509
+
510
+ const options = {
511
+ locusUrl: locusUrl,
512
+ memberId,
513
+ alias,
514
+ requestingParticipantId,
515
+ };
516
+
517
+ const uri = `${locusUrl}/participant/${memberId}/alias`;
518
+
519
+ assert.deepEqual(MembersUtil.editDisplayNameMemberRequestParams(options), {
520
+ method: HTTP_VERBS.POST,
521
+ uri,
522
+ body: {
523
+ aliasValue: alias,
524
+ requestingParticipantId,
525
+ },
526
+ });
527
+ });
528
+
529
+ it('returns the correct params when suffix is empty string', () => {
530
+ const locusUrl = 'TestLocusUrl3';
531
+ const memberId = 'test3';
532
+ const alias = 'alias3';
533
+ const requestingParticipantId = '322424';
534
+ const suffix = '';
535
+
536
+ const options = {
537
+ locusUrl: locusUrl,
538
+ memberId,
539
+ alias,
540
+ suffix,
541
+ requestingParticipantId,
542
+ };
543
+
544
+ const uri = `${locusUrl}/participant/${memberId}/alias`;
545
+
546
+ assert.deepEqual(MembersUtil.editDisplayNameMemberRequestParams(options), {
547
+ method: HTTP_VERBS.POST,
548
+ uri,
549
+ body: {
550
+ aliasValue: alias,
551
+ requestingParticipantId,
552
+ suffixValue: suffix,
553
+ },
554
+ });
555
+ });
556
+ });
435
557
  });
436
558
  });