@webex/plugin-meetings 3.0.0-beta.13 → 3.0.0-beta.15

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 (252) hide show
  1. package/UPGRADING.md +9 -9
  2. package/browsers.js +19 -24
  3. package/dist/common/browser-detection.js +1 -0
  4. package/dist/common/browser-detection.js.map +1 -1
  5. package/dist/common/collection.js.map +1 -1
  6. package/dist/common/errors/captcha-error.js +5 -5
  7. package/dist/common/errors/captcha-error.js.map +1 -1
  8. package/dist/common/errors/intent-to-join.js +5 -5
  9. package/dist/common/errors/intent-to-join.js.map +1 -1
  10. package/dist/common/errors/join-meeting.js +6 -6
  11. package/dist/common/errors/join-meeting.js.map +1 -1
  12. package/dist/common/errors/media.js +5 -5
  13. package/dist/common/errors/media.js.map +1 -1
  14. package/dist/common/errors/parameter.js +5 -5
  15. package/dist/common/errors/parameter.js.map +1 -1
  16. package/dist/common/errors/password-error.js +5 -5
  17. package/dist/common/errors/password-error.js.map +1 -1
  18. package/dist/common/errors/permission.js +4 -4
  19. package/dist/common/errors/permission.js.map +1 -1
  20. package/dist/common/errors/reconnection.js +5 -5
  21. package/dist/common/errors/reconnection.js.map +1 -1
  22. package/dist/common/errors/stats.js +5 -5
  23. package/dist/common/errors/stats.js.map +1 -1
  24. package/dist/common/errors/webex-errors.js.map +1 -1
  25. package/dist/common/errors/webex-meetings-error.js.map +1 -1
  26. package/dist/common/events/events-scope.js.map +1 -1
  27. package/dist/common/events/events.js.map +1 -1
  28. package/dist/common/events/trigger-proxy.js.map +1 -1
  29. package/dist/common/events/util.js.map +1 -1
  30. package/dist/common/logs/logger-proxy.js.map +1 -1
  31. package/dist/common/logs/request.js.map +1 -1
  32. package/dist/config.js.map +1 -1
  33. package/dist/constants.js.map +1 -1
  34. package/dist/index.js.map +1 -1
  35. package/dist/locus-info/controlsUtils.js.map +1 -1
  36. package/dist/locus-info/fullState.js.map +1 -1
  37. package/dist/locus-info/hostUtils.js.map +1 -1
  38. package/dist/locus-info/index.js +11 -8
  39. package/dist/locus-info/index.js.map +1 -1
  40. package/dist/locus-info/infoUtils.js.map +1 -1
  41. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  42. package/dist/locus-info/parser.js +2 -1
  43. package/dist/locus-info/parser.js.map +1 -1
  44. package/dist/locus-info/selfUtils.js +2 -1
  45. package/dist/locus-info/selfUtils.js.map +1 -1
  46. package/dist/media/index.js.map +1 -1
  47. package/dist/media/internal-media-core-wrapper.js.map +1 -1
  48. package/dist/media/properties.js.map +1 -1
  49. package/dist/media/util.js +1 -1
  50. package/dist/media/util.js.map +1 -1
  51. package/dist/mediaQualityMetrics/config.js.map +1 -1
  52. package/dist/meeting/effectsState.js +1 -1
  53. package/dist/meeting/effectsState.js.map +1 -1
  54. package/dist/meeting/in-meeting-actions.js.map +1 -1
  55. package/dist/meeting/index.js +118 -89
  56. package/dist/meeting/index.js.map +1 -1
  57. package/dist/meeting/muteState.js +1 -1
  58. package/dist/meeting/muteState.js.map +1 -1
  59. package/dist/meeting/request.js +25 -0
  60. package/dist/meeting/request.js.map +1 -1
  61. package/dist/meeting/request.type.js +8 -0
  62. package/dist/meeting/request.type.js.map +1 -0
  63. package/dist/meeting/state.js +5 -5
  64. package/dist/meeting/state.js.map +1 -1
  65. package/dist/meeting/util.js.map +1 -1
  66. package/dist/meeting-info/collection.js.map +1 -1
  67. package/dist/meeting-info/index.js +2 -2
  68. package/dist/meeting-info/index.js.map +1 -1
  69. package/dist/meeting-info/meeting-info-v2.js +48 -48
  70. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  71. package/dist/meeting-info/request.js.map +1 -1
  72. package/dist/meeting-info/util.js.map +1 -1
  73. package/dist/meeting-info/utilv2.js +1 -1
  74. package/dist/meeting-info/utilv2.js.map +1 -1
  75. package/dist/meetings/collection.js.map +1 -1
  76. package/dist/meetings/index.js +251 -250
  77. package/dist/meetings/index.js.map +1 -1
  78. package/dist/meetings/request.js +2 -2
  79. package/dist/meetings/request.js.map +1 -1
  80. package/dist/meetings/util.js +14 -14
  81. package/dist/meetings/util.js.map +1 -1
  82. package/dist/member/index.js +31 -31
  83. package/dist/member/index.js.map +1 -1
  84. package/dist/member/util.js.map +1 -1
  85. package/dist/members/collection.js.map +1 -1
  86. package/dist/members/index.js +43 -43
  87. package/dist/members/index.js.map +1 -1
  88. package/dist/members/request.js.map +1 -1
  89. package/dist/members/util.js.map +1 -1
  90. package/dist/metrics/config.js.map +1 -1
  91. package/dist/metrics/constants.js.map +1 -1
  92. package/dist/metrics/index.js +23 -20
  93. package/dist/metrics/index.js.map +1 -1
  94. package/dist/multistream/multistreamMedia.js +2 -1
  95. package/dist/multistream/multistreamMedia.js.map +1 -1
  96. package/dist/multistream/receiveSlot.js.map +1 -1
  97. package/dist/multistream/receiveSlotManager.js +2 -0
  98. package/dist/multistream/receiveSlotManager.js.map +1 -1
  99. package/dist/multistream/remoteMedia.js.map +1 -1
  100. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  101. package/dist/multistream/remoteMediaManager.js.map +1 -1
  102. package/dist/networkQualityMonitor/index.js +8 -8
  103. package/dist/networkQualityMonitor/index.js.map +1 -1
  104. package/dist/personal-meeting-room/index.js +7 -7
  105. package/dist/personal-meeting-room/index.js.map +1 -1
  106. package/dist/personal-meeting-room/request.js.map +1 -1
  107. package/dist/personal-meeting-room/util.js.map +1 -1
  108. package/dist/reachability/index.js.map +1 -1
  109. package/dist/reachability/request.js.map +1 -1
  110. package/dist/reactions/reactions.js.map +1 -1
  111. package/dist/reactions/reactions.type.js +3 -1
  112. package/dist/reactions/reactions.type.js.map +1 -1
  113. package/dist/reconnection-manager/index.js +4 -4
  114. package/dist/reconnection-manager/index.js.map +1 -1
  115. package/dist/roap/index.js +5 -5
  116. package/dist/roap/index.js.map +1 -1
  117. package/dist/roap/request.js.map +1 -1
  118. package/dist/roap/turnDiscovery.js.map +1 -1
  119. package/dist/statsAnalyzer/global.js.map +1 -1
  120. package/dist/statsAnalyzer/index.js.map +1 -1
  121. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  122. package/dist/transcription/index.js +4 -1
  123. package/dist/transcription/index.js.map +1 -1
  124. package/internal-README.md +7 -6
  125. package/package.json +18 -18
  126. package/src/common/browser-detection.ts +9 -6
  127. package/src/common/collection.ts +3 -1
  128. package/src/common/errors/captcha-error.ts +6 -6
  129. package/src/common/errors/intent-to-join.ts +6 -6
  130. package/src/common/errors/join-meeting.ts +12 -8
  131. package/src/common/errors/media.ts +6 -6
  132. package/src/common/errors/parameter.ts +9 -6
  133. package/src/common/errors/password-error.ts +6 -6
  134. package/src/common/errors/permission.ts +5 -5
  135. package/src/common/errors/reconnection.ts +6 -6
  136. package/src/common/errors/stats.ts +6 -6
  137. package/src/common/errors/webex-errors.ts +7 -5
  138. package/src/common/errors/webex-meetings-error.ts +1 -1
  139. package/src/common/events/events-scope.ts +5 -1
  140. package/src/common/events/events.ts +5 -1
  141. package/src/common/events/trigger-proxy.ts +8 -3
  142. package/src/common/events/util.ts +1 -2
  143. package/src/common/logs/logger-proxy.ts +21 -10
  144. package/src/common/logs/request.ts +11 -8
  145. package/src/config.ts +11 -11
  146. package/src/constants.ts +1 -1
  147. package/src/index.js +1 -1
  148. package/src/locus-info/controlsUtils.ts +34 -24
  149. package/src/locus-info/fullState.ts +15 -11
  150. package/src/locus-info/hostUtils.ts +4 -3
  151. package/src/locus-info/index.ts +25 -34
  152. package/src/locus-info/infoUtils.ts +12 -4
  153. package/src/locus-info/mediaSharesUtils.ts +4 -4
  154. package/src/locus-info/parser.ts +45 -68
  155. package/src/locus-info/selfUtils.ts +106 -57
  156. package/src/media/index.ts +123 -135
  157. package/src/media/internal-media-core-wrapper.ts +2 -2
  158. package/src/media/properties.ts +30 -20
  159. package/src/media/util.ts +1 -1
  160. package/src/mediaQualityMetrics/config.ts +46 -46
  161. package/src/meeting/effectsState.ts +35 -35
  162. package/src/meeting/in-meeting-actions.ts +7 -3
  163. package/src/meeting/index.ts +1576 -1291
  164. package/src/meeting/muteState.ts +62 -31
  165. package/src/meeting/request.ts +174 -113
  166. package/src/meeting/request.type.ts +11 -0
  167. package/src/meeting/state.ts +45 -30
  168. package/src/meeting/util.ts +101 -70
  169. package/src/meeting-info/collection.ts +2 -1
  170. package/src/meeting-info/index.ts +32 -30
  171. package/src/meeting-info/meeting-info-v2.ts +106 -108
  172. package/src/meeting-info/request.ts +9 -3
  173. package/src/meeting-info/util.ts +54 -46
  174. package/src/meeting-info/utilv2.ts +59 -53
  175. package/src/meetings/collection.ts +1 -1
  176. package/src/meetings/index.ts +512 -440
  177. package/src/meetings/request.ts +26 -24
  178. package/src/meetings/util.ts +29 -29
  179. package/src/member/index.ts +55 -49
  180. package/src/member/util.ts +26 -13
  181. package/src/members/collection.ts +0 -1
  182. package/src/members/index.ts +182 -126
  183. package/src/members/request.ts +46 -14
  184. package/src/members/util.ts +44 -42
  185. package/src/metrics/config.ts +254 -81
  186. package/src/metrics/constants.ts +0 -2
  187. package/src/metrics/index.ts +84 -71
  188. package/src/multistream/multistreamMedia.ts +1 -0
  189. package/src/multistream/receiveSlot.ts +1 -0
  190. package/src/multistream/receiveSlotManager.ts +1 -0
  191. package/src/multistream/remoteMedia.ts +1 -1
  192. package/src/multistream/remoteMediaGroup.ts +2 -1
  193. package/src/multistream/remoteMediaManager.ts +3 -0
  194. package/src/networkQualityMonitor/index.ts +20 -23
  195. package/src/personal-meeting-room/index.ts +12 -16
  196. package/src/personal-meeting-room/request.ts +10 -3
  197. package/src/personal-meeting-room/util.ts +3 -3
  198. package/src/reachability/index.ts +61 -59
  199. package/src/reachability/request.ts +36 -32
  200. package/src/reactions/reactions.ts +4 -4
  201. package/src/reactions/reactions.type.ts +4 -3
  202. package/src/reconnection-manager/index.ts +139 -84
  203. package/src/roap/index.ts +46 -38
  204. package/src/roap/request.ts +44 -31
  205. package/src/roap/turnDiscovery.ts +59 -30
  206. package/src/statsAnalyzer/global.ts +30 -33
  207. package/src/statsAnalyzer/index.ts +432 -175
  208. package/src/statsAnalyzer/mqaUtil.ts +178 -72
  209. package/src/transcription/index.ts +34 -32
  210. package/test/integration/spec/journey.js +663 -462
  211. package/test/integration/spec/space-meeting.js +318 -203
  212. package/test/integration/spec/transcription.js +6 -7
  213. package/test/unit/spec/common/browser-detection.js +9 -28
  214. package/test/unit/spec/fixture/locus.js +92 -90
  215. package/test/unit/spec/locus-info/controlsUtils.js +5 -5
  216. package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
  217. package/test/unit/spec/locus-info/index.js +1 -2
  218. package/test/unit/spec/locus-info/infoUtils.js +26 -33
  219. package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
  220. package/test/unit/spec/locus-info/lib/SeqCmp.json +513 -685
  221. package/test/unit/spec/locus-info/parser.js +3 -9
  222. package/test/unit/spec/locus-info/selfConstant.js +72 -103
  223. package/test/unit/spec/locus-info/selfUtils.js +21 -12
  224. package/test/unit/spec/meeting/effectsState.js +36 -46
  225. package/test/unit/spec/meeting/in-meeting-actions.ts +2 -3
  226. package/test/unit/spec/meeting/index.js +1342 -684
  227. package/test/unit/spec/meeting/muteState.js +42 -33
  228. package/test/unit/spec/meeting/request.js +75 -45
  229. package/test/unit/spec/meeting/utils.js +78 -53
  230. package/test/unit/spec/meeting-info/meetinginfov2.js +100 -73
  231. package/test/unit/spec/meeting-info/request.js +7 -9
  232. package/test/unit/spec/meeting-info/util.js +11 -12
  233. package/test/unit/spec/meeting-info/utilv2.js +110 -74
  234. package/test/unit/spec/meetings/collection.js +1 -1
  235. package/test/unit/spec/meetings/index.js +438 -257
  236. package/test/unit/spec/meetings/utils.js +14 -12
  237. package/test/unit/spec/member/index.js +0 -1
  238. package/test/unit/spec/member/util.js +5 -6
  239. package/test/unit/spec/members/index.js +104 -54
  240. package/test/unit/spec/members/request.js +29 -20
  241. package/test/unit/spec/members/utils.js +8 -5
  242. package/test/unit/spec/metrics/index.js +16 -21
  243. package/test/unit/spec/networkQualityMonitor/index.js +21 -15
  244. package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
  245. package/test/unit/spec/reachability/index.ts +9 -11
  246. package/test/unit/spec/reconnection-manager/index.js +16 -18
  247. package/test/unit/spec/roap/turnDiscovery.ts +22 -19
  248. package/test/unit/spec/stats-analyzer/index.js +25 -20
  249. package/test/utils/cmr.js +44 -42
  250. package/test/utils/testUtils.js +83 -74
  251. package/test/utils/webex-config.js +18 -18
  252. package/test/utils/webex-test-users.js +53 -50
@@ -20,17 +20,17 @@ describe('plugin-meetings', () => {
20
20
  meeting = {
21
21
  mediaProperties: {
22
22
  audioTrack: 'fake audio track',
23
- videoTrack: 'fake video track'
23
+ videoTrack: 'fake video track',
24
24
  },
25
25
  remoteMuted: false,
26
26
  unmuteAllowed: true,
27
27
  locusInfo: {
28
- onFullLocus: sinon.stub()
28
+ onFullLocus: sinon.stub(),
29
29
  },
30
30
  members: {
31
31
  selfId: 'fake self id',
32
- muteMember: sinon.stub().resolves()
33
- }
32
+ muteMember: sinon.stub().resolves(),
33
+ },
34
34
  };
35
35
  audio = createMuteState(AUDIO, meeting, {sendAudio: true});
36
36
  video = createMuteState(VIDEO, meeting, {sendVideo: true});
@@ -128,11 +128,14 @@ describe('plugin-meetings', () => {
128
128
  // first we need to mute and make that request last forever
129
129
  let serverResponseResolve;
130
130
 
131
- MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(new Promise((resolve) => {
132
- serverResponseResolve = resolve;
133
- }));
131
+ MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
132
+ new Promise((resolve) => {
133
+ serverResponseResolve = resolve;
134
+ })
135
+ );
134
136
 
135
- audio.handleClientRequest(meeting, true)
137
+ audio
138
+ .handleClientRequest(meeting, true)
136
139
  .then(() => {
137
140
  clientPromiseResolved = true;
138
141
  })
@@ -236,14 +239,15 @@ describe('plugin-meetings', () => {
236
239
 
237
240
  let serverResponseResolve;
238
241
 
239
- MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(new Promise((resolve) => {
240
- serverResponseResolve = resolve;
241
- }));
242
+ MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
243
+ new Promise((resolve) => {
244
+ serverResponseResolve = resolve;
245
+ })
246
+ );
242
247
 
243
- audio.handleClientRequest(meeting, true)
244
- .then(() => {
245
- clientPromiseResolved = true;
246
- });
248
+ audio.handleClientRequest(meeting, true).then(() => {
249
+ clientPromiseResolved = true;
250
+ });
247
251
 
248
252
  // do a small delay to make sure that the client promise doesn't resolve in that time
249
253
  await testUtils.waitUntil(200);
@@ -257,9 +261,11 @@ describe('plugin-meetings', () => {
257
261
  });
258
262
 
259
263
  it('rejects client request promise if server request for local mute fails', async () => {
260
- MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(new Promise((resolve, reject) => {
261
- reject();
262
- }));
264
+ MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
265
+ new Promise((resolve, reject) => {
266
+ reject();
267
+ })
268
+ );
263
269
 
264
270
  assert.isRejected(audio.handleClientRequest(meeting, true));
265
271
  });
@@ -282,9 +288,11 @@ describe('plugin-meetings', () => {
282
288
  it('does not send a server request if client state matches the server', async () => {
283
289
  let serverResponseResolve;
284
290
 
285
- MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(new Promise((resolve) => {
286
- serverResponseResolve = resolve;
287
- }));
291
+ MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
292
+ new Promise((resolve) => {
293
+ serverResponseResolve = resolve;
294
+ })
295
+ );
288
296
 
289
297
  // simulate many client requests, with the last one matching the initial one
290
298
  audio.handleClientRequest(meeting, true);
@@ -309,22 +317,22 @@ describe('plugin-meetings', () => {
309
317
  it('queues up server requests when multiple client requests are received', async () => {
310
318
  let serverResponseResolve;
311
319
 
312
- MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(new Promise((resolve) => {
313
- serverResponseResolve = resolve;
314
- }));
320
+ MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
321
+ new Promise((resolve) => {
322
+ serverResponseResolve = resolve;
323
+ })
324
+ );
315
325
 
316
326
  let firstClientPromiseResolved = false;
317
327
  let secondClientPromiseResolved = false;
318
328
 
319
329
  // 2 client requests, one after another without waiting for first one to resolve
320
- audio.handleClientRequest(meeting, true)
321
- .then(() => {
322
- firstClientPromiseResolved = true;
323
- });
324
- audio.handleClientRequest(meeting, false)
325
- .then(() => {
326
- secondClientPromiseResolved = true;
327
- });
330
+ audio.handleClientRequest(meeting, true).then(() => {
331
+ firstClientPromiseResolved = true;
332
+ });
333
+ audio.handleClientRequest(meeting, false).then(() => {
334
+ secondClientPromiseResolved = true;
335
+ });
328
336
 
329
337
  await testUtils.flushPromises();
330
338
 
@@ -351,7 +359,8 @@ describe('plugin-meetings', () => {
351
359
  it('rejects client request to unmute if hard mute is used', (done) => {
352
360
  audio.handleServerRemoteMuteUpdate(true, false);
353
361
 
354
- audio.handleClientRequest(meeting, false)
362
+ audio
363
+ .handleClientRequest(meeting, false)
355
364
  .then(() => {
356
365
  done(new Error('expected handleClientRequest to fail, but it did not!'));
357
366
  })
@@ -10,26 +10,28 @@ describe('plugin-meetings', () => {
10
10
  beforeEach(() => {
11
11
  const webex = new MockWebex({
12
12
  children: {
13
- meetings: Meetings
14
- }
13
+ meetings: Meetings,
14
+ },
15
15
  });
16
16
 
17
17
  webex.meetings.clientRegion = {
18
18
  countryCode: 'US',
19
- regionCode: 'WEST-COAST'
19
+ regionCode: 'WEST-COAST',
20
20
  };
21
21
 
22
22
  webex.internal = {
23
23
  services: {
24
24
  get: sinon.mock().returns('locusUrl'),
25
- waitForCatalog: sinon.mock().returns(Promise.resolve({}))
26
- }
25
+ waitForCatalog: sinon.mock().returns(Promise.resolve({})),
26
+ },
27
27
  };
28
28
 
29
- meetingsRequest = new MeetingRequest({}, {
30
- parent: webex
31
- });
32
-
29
+ meetingsRequest = new MeetingRequest(
30
+ {},
31
+ {
32
+ parent: webex,
33
+ }
34
+ );
33
35
 
34
36
  meetingsRequest.request = sinon.mock().returns(Promise.resolve({}));
35
37
  });
@@ -44,7 +46,7 @@ describe('plugin-meetings', () => {
44
46
  await meetingsRequest.sendDTMF({
45
47
  locusUrl,
46
48
  deviceUrl,
47
- tones
49
+ tones,
48
50
  });
49
51
  const requestParams = meetingsRequest.request.getCall(0).args[0];
50
52
 
@@ -66,7 +68,7 @@ describe('plugin-meetings', () => {
66
68
  deviceUrl,
67
69
  layoutType,
68
70
  main: {width: 640, height: 480},
69
- content: {width: 1280, height: 720}
71
+ content: {width: 1280, height: 720},
70
72
  });
71
73
  const requestParams = meetingsRequest.request.getCall(0).args[0];
72
74
 
@@ -74,43 +76,53 @@ describe('plugin-meetings', () => {
74
76
  assert.equal(requestParams.uri, `${locusUrl}/controls`);
75
77
  assert.equal(requestParams.body.layout.type, layoutType);
76
78
  assert.equal(requestParams.body.layout.deviceUrl, deviceUrl);
77
- assert.deepEqual(requestParams.body.layout.layoutParams, {renderInfo: {main: {width: 640, height: 480}, content: {width: 1280, height: 720}}});
79
+ assert.deepEqual(requestParams.body.layout.layoutParams, {
80
+ renderInfo: {main: {width: 640, height: 480}, content: {width: 1280, height: 720}},
81
+ });
78
82
  });
79
83
 
80
84
  it('throws if width is missing for main', async () => {
81
- await assert.isRejected(meetingsRequest.changeVideoLayout({
82
- locusUrl,
83
- deviceUrl,
84
- layoutType,
85
- main: {height: 100}
86
- }));
85
+ await assert.isRejected(
86
+ meetingsRequest.changeVideoLayout({
87
+ locusUrl,
88
+ deviceUrl,
89
+ layoutType,
90
+ main: {height: 100},
91
+ })
92
+ );
87
93
  });
88
94
 
89
95
  it('throws if height is missing for main', async () => {
90
- await assert.isRejected(meetingsRequest.changeVideoLayout({
91
- locusUrl,
92
- deviceUrl,
93
- layoutType,
94
- main: {width: 100}
95
- }));
96
+ await assert.isRejected(
97
+ meetingsRequest.changeVideoLayout({
98
+ locusUrl,
99
+ deviceUrl,
100
+ layoutType,
101
+ main: {width: 100},
102
+ })
103
+ );
96
104
  });
97
105
 
98
106
  it('throws if width is missing for content', async () => {
99
- await assert.isRejected(meetingsRequest.changeVideoLayout({
100
- locusUrl,
101
- deviceUrl,
102
- layoutType,
103
- content: {height: 100}
104
- }));
107
+ await assert.isRejected(
108
+ meetingsRequest.changeVideoLayout({
109
+ locusUrl,
110
+ deviceUrl,
111
+ layoutType,
112
+ content: {height: 100},
113
+ })
114
+ );
105
115
  });
106
116
 
107
117
  it('throws if height is missing for content', async () => {
108
- await assert.isRejected(meetingsRequest.changeVideoLayout({
109
- locusUrl,
110
- deviceUrl,
111
- layoutType,
112
- content: {width: 100}
113
- }));
118
+ await assert.isRejected(
119
+ meetingsRequest.changeVideoLayout({
120
+ locusUrl,
121
+ deviceUrl,
122
+ layoutType,
123
+ content: {width: 100},
124
+ })
125
+ );
114
126
  });
115
127
  });
116
128
 
@@ -127,8 +139,7 @@ describe('plugin-meetings', () => {
127
139
  deviceUrl,
128
140
  correlationId,
129
141
  roapMessage,
130
- permissionToken
131
-
142
+ permissionToken,
132
143
  });
133
144
  const requestParams = meetingsRequest.request.getCall(0).args[0];
134
145
 
@@ -150,7 +161,7 @@ describe('plugin-meetings', () => {
150
161
  deviceUrl,
151
162
  correlationId,
152
163
  roapMessage,
153
- meetingNumber
164
+ meetingNumber,
154
165
  });
155
166
  const requestParams = meetingsRequest.request.getCall(0).args[0];
156
167
 
@@ -171,7 +182,7 @@ describe('plugin-meetings', () => {
171
182
  correlationId,
172
183
  roapMessage,
173
184
  meetingNumber,
174
- inviteeAddress
185
+ inviteeAddress,
175
186
  });
176
187
  const requestParams = meetingsRequest.request.getCall(0).args[0];
177
188
 
@@ -192,7 +203,7 @@ describe('plugin-meetings', () => {
192
203
  locusUrl,
193
204
  clientUrl,
194
205
  correlationId,
195
- dialInUrl
206
+ dialInUrl,
196
207
  });
197
208
  const requestParams = meetingsRequest.request.getCall(0).args[0];
198
209
 
@@ -216,7 +227,7 @@ describe('plugin-meetings', () => {
216
227
  clientUrl,
217
228
  correlationId,
218
229
  dialOutUrl,
219
- phoneNumber
230
+ phoneNumber,
220
231
  });
221
232
  const requestParams = meetingsRequest.request.getCall(0).args[0];
222
233
 
@@ -239,7 +250,7 @@ describe('plugin-meetings', () => {
239
250
  locusUrl,
240
251
  selfId,
241
252
  correlationId,
242
- phoneUrl
253
+ phoneUrl,
243
254
  });
244
255
  const requestParams = meetingsRequest.request.getCall(0).args[0];
245
256
 
@@ -286,13 +297,13 @@ describe('plugin-meetings', () => {
286
297
  type: 'thumb_down',
287
298
  codepoints: '1F44E',
288
299
  shortcodes: ':thumbsdown:',
289
- tone: {type: 'normal_skin_tone', codepoints: '', shortcodes: ''}
300
+ tone: {type: 'normal_skin_tone', codepoints: '', shortcodes: ''},
290
301
  };
291
302
 
292
303
  await meetingsRequest.sendReaction({
293
304
  reactionChannelUrl,
294
305
  reaction,
295
- participantId
306
+ participantId,
296
307
  });
297
308
  const requestParams = meetingsRequest.request.getCall(0).args[0];
298
309
 
@@ -302,5 +313,24 @@ describe('plugin-meetings', () => {
302
313
  assert.equal(requestParams.body.reaction, reaction);
303
314
  });
304
315
  });
316
+
317
+ describe('#toggleReactions', () => {
318
+ it('sends request to toggleReactions', async () => {
319
+ const locusUrl = 'locusUrl';
320
+ const requestingParticipantId = 'requestingParticipantId';
321
+
322
+ await meetingsRequest.toggleReactions({
323
+ enable: true,
324
+ locusUrl,
325
+ requestingParticipantId,
326
+ });
327
+ const requestParams = meetingsRequest.request.getCall(0).args[0];
328
+
329
+ assert.equal(requestParams.method, 'PUT');
330
+ assert.equal(requestParams.uri, `${locusUrl}/controls`);
331
+ assert.equal(requestParams.body.reactions.enabled, true);
332
+ assert.equal(requestParams.body.requestingParticipantId, requestingParticipantId);
333
+ });
334
+ });
305
335
  });
306
336
  });
@@ -2,11 +2,9 @@ import sinon from 'sinon';
2
2
  import {assert} from '@webex/test-helper-chai';
3
3
  import MeetingUtil from '@webex/plugin-meetings/src/meeting/util';
4
4
  import LoggerProxy from '@webex/plugin-meetings/src/common/logs/logger-proxy';
5
- import LoggerConfig
6
- from '@webex/plugin-meetings/src/common/logs/logger-config';
5
+ import LoggerConfig from '@webex/plugin-meetings/src/common/logs/logger-config';
7
6
  import Metrics from '@webex/plugin-meetings/src/metrics/index';
8
7
 
9
-
10
8
  describe('plugin-meetings', () => {
11
9
  describe('Meeting utils function', () => {
12
10
  const sandbox = sinon.createSandbox();
@@ -18,23 +16,19 @@ describe('plugin-meetings', () => {
18
16
  info: sandbox.stub(),
19
17
  log: sandbox.stub(),
20
18
  error: sandbox.stub(),
21
- warn: sandbox.stub()
19
+ warn: sandbox.stub(),
22
20
  };
23
21
 
24
22
  LoggerConfig.set({
25
23
  verboseEvents: true,
26
- enable: true
24
+ enable: true,
27
25
  });
28
26
  LoggerProxy.set(logger);
29
27
 
30
- meeting.closeLocalStream = sinon.stub()
31
- .returns(Promise.resolve());
32
- meeting.closeLocalShare = sinon.stub()
33
- .returns(Promise.resolve());
34
- meeting.closeRemoteTracks = sinon.stub()
35
- .returns(Promise.resolve());
36
- meeting.closePeerConnections = sinon.stub()
37
- .returns(Promise.resolve());
28
+ meeting.closeLocalStream = sinon.stub().returns(Promise.resolve());
29
+ meeting.closeLocalShare = sinon.stub().returns(Promise.resolve());
30
+ meeting.closeRemoteTracks = sinon.stub().returns(Promise.resolve());
31
+ meeting.closePeerConnections = sinon.stub().returns(Promise.resolve());
38
32
 
39
33
  meeting.unsetLocalVideoTrack = sinon.stub();
40
34
  meeting.unsetLocalShareTrack = sinon.stub();
@@ -70,11 +64,11 @@ describe('plugin-meetings', () => {
70
64
 
71
65
  describe('logging', () => {
72
66
  const fakeDevice = sinon.fake.returns({
73
- deviceId: 'device-1'
67
+ deviceId: 'device-1',
74
68
  });
75
69
 
76
70
  const mockTrack = {
77
- getSettings: fakeDevice
71
+ getSettings: fakeDevice,
78
72
  };
79
73
 
80
74
  it('#log - should log [info, warn, error, log] to console', () => {
@@ -124,10 +118,7 @@ describe('plugin-meetings', () => {
124
118
  });
125
119
 
126
120
  it('should log device settings', () => {
127
- const mockDevices = [
128
- {deviceId: 'device-1'},
129
- {deviceId: 'device-2'}
130
- ];
121
+ const mockDevices = [{deviceId: 'device-1'}, {deviceId: 'device-2'}];
131
122
 
132
123
  assert(MeetingUtil.handleDeviceLogging, 'is defined');
133
124
  MeetingUtil.handleDeviceLogging(mockDevices);
@@ -146,7 +137,9 @@ describe('plugin-meetings', () => {
146
137
  locusUrl: 'locusUrl',
147
138
  deviceUrl: 'some device url',
148
139
  selfId: 'self id',
149
- meetingRequest: {remoteAudioVideoToggle: sinon.stub().returns(Promise.resolve({body: {}, headers: {}}))}
140
+ meetingRequest: {
141
+ remoteAudioVideoToggle: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
142
+ },
150
143
  };
151
144
 
152
145
  await MeetingUtil.remoteUpdateAudioVideo(true, false, meeting);
@@ -158,7 +151,9 @@ describe('plugin-meetings', () => {
158
151
  assert.equal(parameter.selfId, 'self id');
159
152
  assert.equal(parameter.correlationId, 'correlation id');
160
153
  assert.equal(parameter.deviceUrl, 'some device url');
161
- assert.deepEqual(parameter.localMedias, [{localSdp: '{"audioMuted":true,"videoMuted":false}', mediaId: '12345'}]);
154
+ assert.deepEqual(parameter.localMedias, [
155
+ {localSdp: '{"audioMuted":true,"videoMuted":false}', mediaId: '12345'},
156
+ ]);
162
157
  assert.equal(parameter.preferTranscoding, false);
163
158
  });
164
159
 
@@ -166,7 +161,9 @@ describe('plugin-meetings', () => {
166
161
  const meeting = {
167
162
  isMultistream: false,
168
163
  mediaId: '12345',
169
- meetingRequest: {remoteAudioVideoToggle: sinon.stub().returns(Promise.resolve({body: {}, headers: {}}))}
164
+ meetingRequest: {
165
+ remoteAudioVideoToggle: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
166
+ },
170
167
  };
171
168
 
172
169
  await MeetingUtil.remoteUpdateAudioVideo(true, false, meeting);
@@ -180,7 +177,13 @@ describe('plugin-meetings', () => {
180
177
 
181
178
  describe('joinMeeting', () => {
182
179
  it('#Should call `meetingRequest.joinMeeting', async () => {
183
- const meeting = {meetingJoinUrl: 'meetingJoinUrl', locusUrl: 'locusUrl', meetingRequest: {joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}}))}};
180
+ const meeting = {
181
+ meetingJoinUrl: 'meetingJoinUrl',
182
+ locusUrl: 'locusUrl',
183
+ meetingRequest: {
184
+ joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
185
+ },
186
+ };
184
187
 
185
188
  MeetingUtil.parseLocusJoin = sinon.stub();
186
189
  await MeetingUtil.joinMeeting(meeting, {});
@@ -197,7 +200,9 @@ describe('plugin-meetings', () => {
197
200
  isMultistream: true,
198
201
  meetingJoinUrl: 'meetingJoinUrl',
199
202
  locusUrl: 'locusUrl',
200
- meetingRequest: {joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}}))}
203
+ meetingRequest: {
204
+ joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
205
+ },
201
206
  };
202
207
 
203
208
  MeetingUtil.parseLocusJoin = sinon.stub();
@@ -211,7 +216,13 @@ describe('plugin-meetings', () => {
211
216
  });
212
217
 
213
218
  it('#Should fallback sipUrl if meetingJoinUrl does not exists', async () => {
214
- const meeting = {sipUri: 'sipUri', locusUrl: 'locusUrl', meetingRequest: {joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}}))}};
219
+ const meeting = {
220
+ sipUri: 'sipUri',
221
+ locusUrl: 'locusUrl',
222
+ meetingRequest: {
223
+ joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
224
+ },
225
+ };
215
226
 
216
227
  MeetingUtil.parseLocusJoin = sinon.stub();
217
228
  await MeetingUtil.joinMeeting(meeting, {});
@@ -223,7 +234,13 @@ describe('plugin-meetings', () => {
223
234
  });
224
235
 
225
236
  it('#Should fallback to meetingNumber if meetingJoinUrl/sipUrl does not exists', async () => {
226
- const meeting = {meetingNumber: 'meetingNumber', locusUrl: 'locusUrl', meetingRequest: {joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}}))}};
237
+ const meeting = {
238
+ meetingNumber: 'meetingNumber',
239
+ locusUrl: 'locusUrl',
240
+ meetingRequest: {
241
+ joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
242
+ },
243
+ };
227
244
 
228
245
  MeetingUtil.parseLocusJoin = sinon.stub();
229
246
  await MeetingUtil.joinMeeting(meeting, {});
@@ -240,15 +257,9 @@ describe('plugin-meetings', () => {
240
257
  it('returns display hints', () => {
241
258
  assert.deepEqual(MeetingUtil.getUserDisplayHintsFromLocusInfo(), []);
242
259
 
243
- assert.deepEqual(
244
- MeetingUtil.getUserDisplayHintsFromLocusInfo({}),
245
- []
246
- );
260
+ assert.deepEqual(MeetingUtil.getUserDisplayHintsFromLocusInfo({}), []);
247
261
 
248
- assert.deepEqual(
249
- MeetingUtil.getUserDisplayHintsFromLocusInfo({parsedLocus: {}}),
250
- []
251
- );
262
+ assert.deepEqual(MeetingUtil.getUserDisplayHintsFromLocusInfo({parsedLocus: {}}), []);
252
263
 
253
264
  assert.deepEqual(
254
265
  MeetingUtil.getUserDisplayHintsFromLocusInfo({parsedLocus: {info: {}}}),
@@ -256,7 +267,9 @@ describe('plugin-meetings', () => {
256
267
  );
257
268
 
258
269
  assert.deepEqual(
259
- MeetingUtil.getUserDisplayHintsFromLocusInfo({parsedLocus: {info: {userDisplayHints: []}}}),
270
+ MeetingUtil.getUserDisplayHintsFromLocusInfo({
271
+ parsedLocus: {info: {userDisplayHints: []}},
272
+ }),
260
273
  []
261
274
  );
262
275
 
@@ -264,11 +277,9 @@ describe('plugin-meetings', () => {
264
277
  MeetingUtil.getUserDisplayHintsFromLocusInfo({
265
278
  parsedLocus: {
266
279
  info: {
267
- userDisplayHints: [
268
- 'HINT_1'
269
- ]
270
- }
271
- }
280
+ userDisplayHints: ['HINT_1'],
281
+ },
282
+ },
272
283
  }),
273
284
  ['HINT_1']
274
285
  );
@@ -305,23 +316,38 @@ describe('plugin-meetings', () => {
305
316
 
306
317
  describe('canUserLowerSomeoneElsesHand', () => {
307
318
  it('works as expected', () => {
308
- assert.deepEqual(MeetingUtil.canUserLowerSomeoneElsesHand(['LOWER_SOMEONE_ELSES_HAND']), true);
319
+ assert.deepEqual(
320
+ MeetingUtil.canUserLowerSomeoneElsesHand(['LOWER_SOMEONE_ELSES_HAND']),
321
+ true
322
+ );
309
323
  assert.deepEqual(MeetingUtil.canUserLowerSomeoneElsesHand([]), false);
310
324
  });
311
325
  });
312
326
 
313
327
  describe('bothLeaveAndEndMeetingAvailable', () => {
314
328
  it('works as expected', () => {
315
- assert.deepEqual(MeetingUtil.bothLeaveAndEndMeetingAvailable(['LEAVE_TRANSFER_HOST_END_MEETING']), true);
329
+ assert.deepEqual(
330
+ MeetingUtil.bothLeaveAndEndMeetingAvailable(['LEAVE_TRANSFER_HOST_END_MEETING']),
331
+ true
332
+ );
316
333
  assert.deepEqual(MeetingUtil.bothLeaveAndEndMeetingAvailable(['LEAVE_END_MEETING']), true);
317
- assert.deepEqual(MeetingUtil.bothLeaveAndEndMeetingAvailable(['LEAVE_TRANSFER_HOST_END_MEETING', 'LEAVE_END_MEETING']), true);
334
+ assert.deepEqual(
335
+ MeetingUtil.bothLeaveAndEndMeetingAvailable([
336
+ 'LEAVE_TRANSFER_HOST_END_MEETING',
337
+ 'LEAVE_END_MEETING',
338
+ ]),
339
+ true
340
+ );
318
341
  assert.deepEqual(MeetingUtil.bothLeaveAndEndMeetingAvailable([]), false);
319
342
  });
320
343
  });
321
344
 
322
345
  describe('canUserLock', () => {
323
346
  it('works as expected', () => {
324
- assert.deepEqual(MeetingUtil.canUserLock(['LOCK_CONTROL_LOCK', 'LOCK_STATUS_UNLOCKED']), true);
347
+ assert.deepEqual(
348
+ MeetingUtil.canUserLock(['LOCK_CONTROL_LOCK', 'LOCK_STATUS_UNLOCKED']),
349
+ true
350
+ );
325
351
  assert.deepEqual(MeetingUtil.canUserLock(['LOCK_CONTROL_LOCK']), false);
326
352
  assert.deepEqual(MeetingUtil.canUserLock(['LOCK_STATUS_UNLOCKED']), false);
327
353
  assert.deepEqual(MeetingUtil.canUserLock([]), false);
@@ -330,7 +356,10 @@ describe('plugin-meetings', () => {
330
356
 
331
357
  describe('canUserUnlock', () => {
332
358
  it('works as expected', () => {
333
- assert.deepEqual(MeetingUtil.canUserUnlock(['LOCK_CONTROL_UNLOCK', 'LOCK_STATUS_LOCKED']), true);
359
+ assert.deepEqual(
360
+ MeetingUtil.canUserUnlock(['LOCK_CONTROL_UNLOCK', 'LOCK_STATUS_LOCKED']),
361
+ true
362
+ );
334
363
  assert.deepEqual(MeetingUtil.canUserUnlock(['LOCK_CONTROL_UNLOCK']), false);
335
364
  assert.deepEqual(MeetingUtil.canUserUnlock(['LOCK_STATUS_LOCKED']), false);
336
365
  assert.deepEqual(MeetingUtil.canUserUnlock([]), false);
@@ -358,7 +387,6 @@ describe('plugin-meetings', () => {
358
387
  });
359
388
  });
360
389
 
361
-
362
390
  describe('canUserStop', () => {
363
391
  it('works as expected', () => {
364
392
  assert.deepEqual(MeetingUtil.canUserStop(['RECORDING_CONTROL_STOP']), true);
@@ -385,7 +413,6 @@ describe('plugin-meetings', () => {
385
413
  });
386
414
  });
387
415
 
388
-
389
416
  describe('recording tests', () => {
390
417
  let request;
391
418
  let locusInfo;
@@ -395,14 +422,12 @@ describe('plugin-meetings', () => {
395
422
  locusInfo = {
396
423
  parsedLocus: {
397
424
  info: {
398
- userDisplayHints: [
399
- 'RECORDING_CONTROL_START'
400
- ]
401
- }
402
- }
425
+ userDisplayHints: ['RECORDING_CONTROL_START'],
426
+ },
427
+ },
403
428
  };
404
429
  request = {
405
- recordMeeting: sinon.stub().returns(Promise.resolve())
430
+ recordMeeting: sinon.stub().returns(Promise.resolve()),
406
431
  };
407
432
  });
408
433