@webex/plugin-meetings 3.8.0-next.30 → 3.8.0-next.32

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 (36) hide show
  1. package/dist/breakouts/breakout.js +1 -1
  2. package/dist/breakouts/index.js +1 -1
  3. package/dist/interpretation/index.js +1 -1
  4. package/dist/interpretation/siLanguage.js +1 -1
  5. package/dist/media/index.js +3 -15
  6. package/dist/media/index.js.map +1 -1
  7. package/dist/meeting/index.js +196 -189
  8. package/dist/meeting/index.js.map +1 -1
  9. package/dist/meeting/muteState.js +0 -2
  10. package/dist/meeting/muteState.js.map +1 -1
  11. package/dist/reconnection-manager/index.js +2 -2
  12. package/dist/reconnection-manager/index.js.map +1 -1
  13. package/dist/roap/index.js.map +1 -1
  14. package/dist/roap/turnDiscovery.js +31 -23
  15. package/dist/roap/turnDiscovery.js.map +1 -1
  16. package/dist/roap/types.js +17 -0
  17. package/dist/roap/types.js.map +1 -0
  18. package/dist/types/meeting/index.d.ts +2 -1
  19. package/dist/types/meeting/muteState.d.ts +0 -1
  20. package/dist/types/roap/index.d.ts +3 -2
  21. package/dist/types/roap/turnDiscovery.d.ts +1 -17
  22. package/dist/types/roap/types.d.ts +16 -0
  23. package/dist/webinar/index.js +1 -1
  24. package/package.json +3 -3
  25. package/src/media/index.ts +5 -21
  26. package/src/meeting/index.ts +13 -7
  27. package/src/meeting/muteState.ts +0 -2
  28. package/src/reconnection-manager/index.ts +2 -2
  29. package/src/roap/index.ts +3 -7
  30. package/src/roap/turnDiscovery.ts +21 -35
  31. package/src/roap/types.ts +23 -0
  32. package/test/unit/spec/media/index.ts +6 -16
  33. package/test/unit/spec/meeting/index.js +32 -21
  34. package/test/unit/spec/meeting/muteState.js +0 -2
  35. package/test/unit/spec/reconnection-manager/index.js +4 -4
  36. package/test/unit/spec/roap/turnDiscovery.ts +72 -28
@@ -15,7 +15,8 @@ describe('TurnDiscovery', () => {
15
15
  let mockRoapRequest: RoapRequest;
16
16
  let testMeeting: any;
17
17
 
18
- const FAKE_TURN_URL = 'turns:fakeTurnServer.com:443?transport=tcp';
18
+ const FAKE_TURN_URL1 = 'turns:fakeTurnServer1.com:443?transport=tcp';
19
+ const FAKE_TURN_URL2 = 'turns:fakeTurnServer2.com:443?transport=tcp';
19
20
  const FAKE_TURN_USERNAME = 'someUsernameFromServer';
20
21
  const FAKE_TURN_PASSWORD = 'fakePasswordFromServer';
21
22
  const FAKE_LOCUS_ID = '09493311-f5d5-3e58-b491-009cc628162e';
@@ -186,7 +187,8 @@ describe('TurnDiscovery', () => {
186
187
  {
187
188
  messageType: 'TURN_DISCOVERY_RESPONSE',
188
189
  headers: [
189
- `x-cisco-turn-url=${FAKE_TURN_URL}`,
190
+ `x-cisco-turn-url=${FAKE_TURN_URL1}`,
191
+ `x-cisco-turn-url=${FAKE_TURN_URL2}`,
190
192
  `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
191
193
  `x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
192
194
  ],
@@ -195,7 +197,7 @@ describe('TurnDiscovery', () => {
195
197
  );
196
198
 
197
199
  await checkResult(result, 'OK', {
198
- url: FAKE_TURN_URL,
200
+ urls: [FAKE_TURN_URL1, FAKE_TURN_URL2],
199
201
  username: FAKE_TURN_USERNAME,
200
202
  password: FAKE_TURN_PASSWORD,
201
203
  });
@@ -220,7 +222,7 @@ describe('TurnDiscovery', () => {
220
222
  {
221
223
  messageType: 'TURN_DISCOVERY_RESPONSE',
222
224
  headers: [
223
- `x-cisco-turn-url=${FAKE_TURN_URL}`,
225
+ `x-cisco-turn-url=${FAKE_TURN_URL1}`,
224
226
  `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
225
227
  `x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
226
228
  'noOkInTransaction',
@@ -230,7 +232,7 @@ describe('TurnDiscovery', () => {
230
232
  );
231
233
 
232
234
  await checkResult(result, undefined, {
233
- url: FAKE_TURN_URL,
235
+ urls: [FAKE_TURN_URL1],
234
236
  username: FAKE_TURN_USERNAME,
235
237
  password: FAKE_TURN_PASSWORD,
236
238
  });
@@ -241,7 +243,7 @@ describe('TurnDiscovery', () => {
241
243
  mediaConnections: [
242
244
  {
243
245
  mediaId: '464ff97f-4bda-466a-ad06-3a22184a2274',
244
- remoteSdp: `{"roapMessage": {"messageType":"TURN_DISCOVERY_RESPONSE","seq":"0","headers": ["x-cisco-turn-url=${FAKE_TURN_URL}","x-cisco-turn-username=${FAKE_TURN_USERNAME}","x-cisco-turn-password=${FAKE_TURN_PASSWORD}", "noOkInTransaction"]}}`,
246
+ remoteSdp: `{"roapMessage": {"messageType":"TURN_DISCOVERY_RESPONSE","seq":"0","headers": ["x-cisco-turn-url=${FAKE_TURN_URL1}","x-cisco-turn-username=${FAKE_TURN_USERNAME}","x-cisco-turn-password=${FAKE_TURN_PASSWORD}", "noOkInTransaction"]}}`,
245
247
  },
246
248
  ],
247
249
  });
@@ -256,7 +258,7 @@ describe('TurnDiscovery', () => {
256
258
  mockRoapRequest.sendRoap.resetHistory();
257
259
 
258
260
  await checkResult(result, undefined, {
259
- url: FAKE_TURN_URL,
261
+ urls: [FAKE_TURN_URL1],
260
262
  username: FAKE_TURN_USERNAME,
261
263
  password: FAKE_TURN_PASSWORD,
262
264
  });
@@ -268,7 +270,7 @@ describe('TurnDiscovery', () => {
268
270
  mediaConnections: [
269
271
  {
270
272
  mediaId: '464ff97f-4bda-466a-ad06-3a22184a2274',
271
- remoteSdp: `{"roapMessage": {"messageType":"TURN_DISCOVERY_RESPONSE","seq":"0","headers": ["x-cisco-turn-url=${FAKE_TURN_URL}","x-cisco-turn-username=${FAKE_TURN_USERNAME}","x-cisco-turn-password=${FAKE_TURN_PASSWORD}"]}}`,
273
+ remoteSdp: `{"roapMessage": {"messageType":"TURN_DISCOVERY_RESPONSE","seq":"0","headers": ["x-cisco-turn-url=${FAKE_TURN_URL1}","x-cisco-turn-username=${FAKE_TURN_USERNAME}","x-cisco-turn-password=${FAKE_TURN_PASSWORD}"]}}`,
272
274
  },
273
275
  ],
274
276
  };
@@ -290,7 +292,7 @@ describe('TurnDiscovery', () => {
290
292
  sendRoapPromiseResolve(sendRoapResult);
291
293
 
292
294
  await checkResult(result, 'OK', {
293
- url: FAKE_TURN_URL,
295
+ urls: [FAKE_TURN_URL1],
294
296
  username: FAKE_TURN_USERNAME,
295
297
  password: FAKE_TURN_PASSWORD,
296
298
  });
@@ -350,16 +352,17 @@ describe('TurnDiscovery', () => {
350
352
  {
351
353
  messageType: 'TURN_DISCOVERY_RESPONSE',
352
354
  headers: [
353
- `x-cisco-turn-url=${FAKE_TURN_URL}`,
355
+ `x-cisco-turn-url=${FAKE_TURN_URL1}`,
354
356
  `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
355
357
  `x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
358
+ `x-cisco-turn-url=${FAKE_TURN_URL2}`,
356
359
  ],
357
360
  },
358
361
  'from test'
359
362
  );
360
363
 
361
364
  await checkResult(result, 'OK', {
362
- url: FAKE_TURN_URL,
365
+ urls: [FAKE_TURN_URL1, FAKE_TURN_URL2],
363
366
  username: FAKE_TURN_USERNAME,
364
367
  password: FAKE_TURN_PASSWORD,
365
368
  });
@@ -415,7 +418,7 @@ describe('TurnDiscovery', () => {
415
418
  {
416
419
  messageType: 'TURN_DISCOVERY_RESPONSE',
417
420
  headers: [
418
- `x-cisco-turn-url=${FAKE_TURN_URL}`,
421
+ `x-cisco-turn-url=${FAKE_TURN_URL1}`,
419
422
  `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
420
423
  `x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
421
424
  ],
@@ -428,7 +431,7 @@ describe('TurnDiscovery', () => {
428
431
 
429
432
  const {turnServerInfo, turnDiscoverySkippedReason} = await result;
430
433
  assert.deepEqual(turnServerInfo, {
431
- url: FAKE_TURN_URL,
434
+ urls: [FAKE_TURN_URL1],
432
435
  username: FAKE_TURN_USERNAME,
433
436
  password: FAKE_TURN_PASSWORD,
434
437
  });
@@ -455,7 +458,7 @@ describe('TurnDiscovery', () => {
455
458
  {
456
459
  messageType: 'TURN_DISCOVERY_RESPONSE',
457
460
  headers: [
458
- `x-cisco-turn-url=${FAKE_TURN_URL}`,
461
+ `x-cisco-turn-url=${FAKE_TURN_URL1}`,
459
462
  `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
460
463
  `x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
461
464
  ],
@@ -471,7 +474,7 @@ describe('TurnDiscovery', () => {
471
474
  const {turnServerInfo, turnDiscoverySkippedReason} = await result;
472
475
 
473
476
  assert.deepEqual(turnServerInfo, {
474
- url: FAKE_TURN_URL,
477
+ urls: [FAKE_TURN_URL1],
475
478
  username: FAKE_TURN_USERNAME,
476
479
  password: FAKE_TURN_PASSWORD,
477
480
  });
@@ -493,7 +496,7 @@ describe('TurnDiscovery', () => {
493
496
  messageType: 'TURN_DISCOVERY_RESPONSE',
494
497
  headers: [
495
498
  'x-cisco-turn-unexpected-header=xxx',
496
- `x-cisco-turn-url=${FAKE_TURN_URL}`,
499
+ `x-cisco-turn-url=${FAKE_TURN_URL1}`,
497
500
  'x-cisco-some-other-header',
498
501
  `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
499
502
  `x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
@@ -510,7 +513,47 @@ describe('TurnDiscovery', () => {
510
513
 
511
514
  const {turnServerInfo, turnDiscoverySkippedReason} = await result;
512
515
  assert.deepEqual(turnServerInfo, {
513
- url: FAKE_TURN_URL,
516
+ urls: [FAKE_TURN_URL1],
517
+ username: FAKE_TURN_USERNAME,
518
+ password: FAKE_TURN_PASSWORD,
519
+ });
520
+ assert.isUndefined(turnDiscoverySkippedReason);
521
+ });
522
+
523
+ // this happens when we land on video-mesh nodes (VMN) - we will get a single empty url
524
+ it('filters out any empty TURN urls', async () => {
525
+ const td = new TurnDiscovery(mockRoapRequest);
526
+ const result = td.doTurnDiscovery(testMeeting, false);
527
+
528
+ // check that TURN_DISCOVERY_REQUEST was sent
529
+ await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
530
+ // @ts-ignore
531
+ mockRoapRequest.sendRoap.resetHistory();
532
+
533
+ // simulate the response with some empty urls, normally there would be just 1, but we put more just for the sake of testing
534
+ td.handleTurnDiscoveryResponse(
535
+ {
536
+ messageType: 'TURN_DISCOVERY_RESPONSE',
537
+ headers: [
538
+ 'x-cisco-turn-url=',
539
+ `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
540
+ 'x-cisco-turn-url=',
541
+ `x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
542
+ 'x-cisco-turn-url=non-empty-url',
543
+ 'x-cisco-turn-url=',
544
+ ],
545
+ },
546
+ 'from test'
547
+ );
548
+
549
+ await testUtils.flushPromises();
550
+
551
+ // check that we've sent OK and still parsed the headers we care about
552
+ await checkRoapMessageSent('OK', 0);
553
+
554
+ const {turnServerInfo, turnDiscoverySkippedReason} = await result;
555
+ assert.deepEqual(turnServerInfo, {
556
+ urls: ['non-empty-url'], // empty urls should be filtered out
514
557
  username: FAKE_TURN_USERNAME,
515
558
  password: FAKE_TURN_PASSWORD,
516
559
  });
@@ -575,7 +618,7 @@ describe('TurnDiscovery', () => {
575
618
  {
576
619
  messageType: 'TURN_DISCOVERY_RESPONSE',
577
620
  headers: [
578
- `x-cisco-turn-url=${FAKE_TURN_URL}`,
621
+ `x-cisco-turn-url=${FAKE_TURN_URL1}`,
579
622
  `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
580
623
  ],
581
624
  },
@@ -587,7 +630,7 @@ describe('TurnDiscovery', () => {
587
630
  assert.isUndefined(turnServerInfo);
588
631
  assert.equal(
589
632
  turnDiscoverySkippedReason,
590
- `failure: TURN_DISCOVERY_RESPONSE from test missing some headers: ["x-cisco-turn-url=${FAKE_TURN_URL}","x-cisco-turn-username=${FAKE_TURN_USERNAME}"]`
633
+ `failure: TURN_DISCOVERY_RESPONSE from test missing some headers: ["x-cisco-turn-url=${FAKE_TURN_URL1}","x-cisco-turn-username=${FAKE_TURN_USERNAME}"]`
591
634
  );
592
635
  checkFailureMetricsSent();
593
636
  });
@@ -655,7 +698,7 @@ describe('TurnDiscovery', () => {
655
698
  {
656
699
  messageType: 'TURN_DISCOVERY_RESPONSE',
657
700
  headers: [
658
- `x-cisco-turn-url=${FAKE_TURN_URL}`,
701
+ `x-cisco-turn-url=${FAKE_TURN_URL1}`,
659
702
  `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
660
703
  `x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
661
704
  ],
@@ -707,7 +750,7 @@ describe('TurnDiscovery', () => {
707
750
  {
708
751
  messageType: 'TURN_DISCOVERY_RESPONSE',
709
752
  headers: [
710
- `x-cisco-turn-url=${FAKE_TURN_URL}`,
753
+ `x-cisco-turn-url=${FAKE_TURN_URL1}`,
711
754
  `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
712
755
  `x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
713
756
  ],
@@ -816,7 +859,8 @@ describe('TurnDiscovery', () => {
816
859
  errorType: undefined,
817
860
  errorCause: undefined,
818
861
  headers: [
819
- `x-cisco-turn-url=${FAKE_TURN_URL}`,
862
+ `x-cisco-turn-url=${FAKE_TURN_URL1}`,
863
+ `x-cisco-turn-url=${FAKE_TURN_URL2}`,
820
864
  `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
821
865
  `x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
822
866
  'noOkInTransaction',
@@ -902,7 +946,7 @@ describe('TurnDiscovery', () => {
902
946
 
903
947
  assert.deepEqual(result, {
904
948
  turnServerInfo: {
905
- url: FAKE_TURN_URL,
949
+ urls: [FAKE_TURN_URL1, FAKE_TURN_URL2],
906
950
  username: FAKE_TURN_USERNAME,
907
951
  password: FAKE_TURN_PASSWORD,
908
952
  },
@@ -914,7 +958,7 @@ describe('TurnDiscovery', () => {
914
958
 
915
959
  it('works as expected when httpResponse is missing some headers', async () => {
916
960
  roapMessage.headers = [
917
- `x-cisco-turn-url=${FAKE_TURN_URL}`, // missing headers for username and password
961
+ `x-cisco-turn-url=${FAKE_TURN_URL1}`, // missing headers for username and password
918
962
  ];
919
963
 
920
964
  const httpResponse = {mediaConnections: [{remoteSdp: JSON.stringify({roapMessage})}]};
@@ -930,7 +974,7 @@ describe('TurnDiscovery', () => {
930
974
  assert.deepEqual(result, {
931
975
  turnServerInfo: undefined,
932
976
  turnDiscoverySkippedReason:
933
- 'failure: TURN_DISCOVERY_RESPONSE in http response missing some headers: ["x-cisco-turn-url=turns:fakeTurnServer.com:443?transport=tcp"]',
977
+ 'failure: TURN_DISCOVERY_RESPONSE in http response missing some headers: ["x-cisco-turn-url=turns:fakeTurnServer1.com:443?transport=tcp"]',
934
978
  });
935
979
  assert.calledOnceWithExactly(handleTurnDiscoveryResponseSpy, roapMessage, 'in http response');
936
980
 
@@ -939,7 +983,7 @@ describe('TurnDiscovery', () => {
939
983
 
940
984
  it('sends OK when required', async () => {
941
985
  roapMessage.headers = [
942
- `x-cisco-turn-url=${FAKE_TURN_URL}`,
986
+ `x-cisco-turn-url=${FAKE_TURN_URL1}`,
943
987
  `x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
944
988
  `x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
945
989
  // noOkInTransaction is missing
@@ -951,7 +995,7 @@ describe('TurnDiscovery', () => {
951
995
 
952
996
  assert.deepEqual(result, {
953
997
  turnServerInfo: {
954
- url: FAKE_TURN_URL,
998
+ urls: [FAKE_TURN_URL1],
955
999
  username: FAKE_TURN_USERNAME,
956
1000
  password: FAKE_TURN_PASSWORD,
957
1001
  },
@@ -982,7 +1026,7 @@ describe('TurnDiscovery', () => {
982
1026
  mediaConnections: [
983
1027
  {
984
1028
  mediaId: '464ff97f-4bda-466a-ad06-3a22184a2274',
985
- remoteSdp: `{"roapMessage": {"messageType":"TURN_DISCOVERY_RESPONSE","seq":"0","headers": ["x-cisco-turn-url=${FAKE_TURN_URL}","x-cisco-turn-username=${FAKE_TURN_USERNAME}","x-cisco-turn-password=${FAKE_TURN_PASSWORD}", "noOkInTransaction"]}}`,
1029
+ remoteSdp: `{"roapMessage": {"messageType":"TURN_DISCOVERY_RESPONSE","seq":"0","headers": ["x-cisco-turn-url=${FAKE_TURN_URL1}","x-cisco-turn-username=${FAKE_TURN_USERNAME}","x-cisco-turn-password=${FAKE_TURN_PASSWORD}", "noOkInTransaction"]}}`,
986
1030
  },
987
1031
  ],
988
1032
  });