@webex/plugin-meetings 3.0.0-next.2 → 3.0.0-next.21

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 (94) hide show
  1. package/dist/breakouts/breakout.js +1 -1
  2. package/dist/breakouts/index.js +1 -1
  3. package/dist/constants.d.ts +3 -9
  4. package/dist/constants.js +4 -9
  5. package/dist/constants.js.map +1 -1
  6. package/dist/index.d.ts +1 -1
  7. package/dist/index.js +6 -0
  8. package/dist/index.js.map +1 -1
  9. package/dist/interpretation/index.js +3 -3
  10. package/dist/interpretation/index.js.map +1 -1
  11. package/dist/interpretation/siLanguage.js +1 -1
  12. package/dist/locus-info/mediaSharesUtils.js +15 -1
  13. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  14. package/dist/media/index.js +4 -1
  15. package/dist/media/index.js.map +1 -1
  16. package/dist/mediaQualityMetrics/config.d.ts +9 -1
  17. package/dist/mediaQualityMetrics/config.js +10 -1
  18. package/dist/mediaQualityMetrics/config.js.map +1 -1
  19. package/dist/meeting/index.d.ts +18 -7
  20. package/dist/meeting/index.js +745 -567
  21. package/dist/meeting/index.js.map +1 -1
  22. package/dist/meeting/muteState.d.ts +2 -8
  23. package/dist/meeting/muteState.js +37 -25
  24. package/dist/meeting/muteState.js.map +1 -1
  25. package/dist/meeting/request.d.ts +3 -0
  26. package/dist/meeting/request.js +32 -23
  27. package/dist/meeting/request.js.map +1 -1
  28. package/dist/meeting/util.js +1 -0
  29. package/dist/meeting/util.js.map +1 -1
  30. package/dist/multistream/mediaRequestManager.d.ts +1 -2
  31. package/dist/multistream/mediaRequestManager.js.map +1 -1
  32. package/dist/multistream/remoteMediaGroup.d.ts +1 -1
  33. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  34. package/dist/multistream/remoteMediaManager.d.ts +1 -2
  35. package/dist/multistream/remoteMediaManager.js.map +1 -1
  36. package/dist/multistream/sendSlotManager.d.ts +1 -2
  37. package/dist/multistream/sendSlotManager.js.map +1 -1
  38. package/dist/reachability/request.js +12 -10
  39. package/dist/reachability/request.js.map +1 -1
  40. package/dist/reconnection-manager/index.js +2 -1
  41. package/dist/reconnection-manager/index.js.map +1 -1
  42. package/dist/roap/index.d.ts +10 -2
  43. package/dist/roap/index.js +15 -0
  44. package/dist/roap/index.js.map +1 -1
  45. package/dist/roap/request.js +3 -3
  46. package/dist/roap/request.js.map +1 -1
  47. package/dist/roap/turnDiscovery.d.ts +64 -17
  48. package/dist/roap/turnDiscovery.js +307 -126
  49. package/dist/roap/turnDiscovery.js.map +1 -1
  50. package/dist/statsAnalyzer/index.js +61 -41
  51. package/dist/statsAnalyzer/index.js.map +1 -1
  52. package/dist/webinar/index.js +1 -1
  53. package/package.json +22 -22
  54. package/src/constants.ts +3 -9
  55. package/src/index.ts +1 -0
  56. package/src/interpretation/index.ts +2 -2
  57. package/src/locus-info/mediaSharesUtils.ts +16 -0
  58. package/src/media/index.ts +3 -1
  59. package/src/mediaQualityMetrics/config.ts +11 -1
  60. package/src/meeting/index.ts +264 -90
  61. package/src/meeting/muteState.ts +34 -20
  62. package/src/meeting/request.ts +18 -2
  63. package/src/meeting/util.ts +1 -0
  64. package/src/multistream/mediaRequestManager.ts +1 -1
  65. package/src/multistream/remoteMediaGroup.ts +1 -1
  66. package/src/multistream/remoteMediaManager.ts +1 -2
  67. package/src/multistream/sendSlotManager.ts +1 -2
  68. package/src/reachability/request.ts +15 -11
  69. package/src/reconnection-manager/index.ts +1 -1
  70. package/src/roap/index.ts +25 -3
  71. package/src/roap/request.ts +3 -3
  72. package/src/roap/turnDiscovery.ts +244 -78
  73. package/src/statsAnalyzer/index.ts +72 -43
  74. package/test/integration/spec/journey.js +14 -14
  75. package/test/integration/spec/space-meeting.js +1 -1
  76. package/test/unit/spec/interpretation/index.ts +4 -1
  77. package/test/unit/spec/locus-info/mediaSharesUtils.ts +9 -0
  78. package/test/unit/spec/media/index.ts +89 -78
  79. package/test/unit/spec/meeting/index.js +611 -125
  80. package/test/unit/spec/meeting/muteState.js +219 -67
  81. package/test/unit/spec/meeting/request.js +21 -0
  82. package/test/unit/spec/meeting/utils.js +6 -1
  83. package/test/unit/spec/meetings/index.js +27 -20
  84. package/test/unit/spec/multistream/remoteMediaGroup.ts +0 -1
  85. package/test/unit/spec/multistream/remoteMediaManager.ts +0 -1
  86. package/test/unit/spec/reachability/request.js +15 -7
  87. package/test/unit/spec/reconnection-manager/index.js +28 -0
  88. package/test/unit/spec/roap/index.ts +61 -6
  89. package/test/unit/spec/roap/turnDiscovery.ts +298 -16
  90. package/test/unit/spec/stats-analyzer/index.js +183 -8
  91. package/dist/member/member.types.d.ts +0 -11
  92. package/dist/member/member.types.js +0 -17
  93. package/dist/member/member.types.js.map +0 -1
  94. package/src/member/member.types.ts +0 -13
@@ -412,9 +412,13 @@ describe('plugin-meetings', () => {
412
412
  assert.exists(result);
413
413
  assert.instanceOf(result, NoiseReductionEffect);
414
414
  assert.containsAllKeys(result, ['audioContext', 'isEnabled', 'isReady', 'options']);
415
+ assert.equal(result.options.authToken, 'fake_token');
415
416
  assert.deepEqual(result.options, {
416
- authToken: 'fake_token',
417
417
  audioContext: {},
418
+ authToken: 'fake_token',
419
+ mode: 'WORKLET',
420
+ env: 'prod',
421
+ avoidSimd: false,
418
422
  });
419
423
  assert.exists(result.enable);
420
424
  assert.exists(result.disable);
@@ -424,8 +428,9 @@ describe('plugin-meetings', () => {
424
428
  it('creates noise reduction effect with custom options passed', async () => {
425
429
  const effectOptions = {
426
430
  audioContext: {},
427
- mode: 'WORKLET',
428
- env: 'prod',
431
+ mode: 'LEGACY',
432
+ env: 'int',
433
+ avoidSimd: true,
429
434
  };
430
435
 
431
436
  const result = await webex.meetings.createNoiseReductionEffect(effectOptions);
@@ -2003,24 +2008,27 @@ describe('plugin-meetings', () => {
2003
2008
  assert.notCalled(loggerProxySpy);
2004
2009
  });
2005
2010
 
2006
- forEach([
2007
- {user: undefined},
2008
- {user: {userPreferences: {}}},
2009
- {user: {userPreferences: {userPreferencesItems: {}}}},
2010
- {user: {userPreferences: {userPreferencesItems: {preferredWebExSite: undefined}}}},
2011
- ], ({user}) => {
2012
- it(`should handle invalid user data ${user}`, async () => {
2013
- setup({user});
2011
+ forEach(
2012
+ [
2013
+ {user: undefined},
2014
+ {user: {userPreferences: {}}},
2015
+ {user: {userPreferences: {userPreferencesItems: {}}}},
2016
+ {user: {userPreferences: {userPreferencesItems: {preferredWebExSite: undefined}}}},
2017
+ ],
2018
+ ({user}) => {
2019
+ it(`should handle invalid user data ${user}`, async () => {
2020
+ setup({user});
2014
2021
 
2015
- await webex.meetings.fetchUserPreferredWebexSite();
2022
+ await webex.meetings.fetchUserPreferredWebexSite();
2016
2023
 
2017
- assert.equal(webex.meetings.preferredWebexSite, '');
2018
- assert.calledOnceWithExactly(
2019
- loggerProxySpy,
2020
- 'Failed to fetch preferred site from user - no site will be set'
2021
- );
2022
- });
2023
- });
2024
+ assert.equal(webex.meetings.preferredWebexSite, '');
2025
+ assert.calledOnceWithExactly(
2026
+ loggerProxySpy,
2027
+ 'Failed to fetch preferred site from user - no site will be set'
2028
+ );
2029
+ });
2030
+ }
2031
+ );
2024
2032
 
2025
2033
  it('should handle a get user failure', async () => {
2026
2034
  setup();
@@ -2035,7 +2043,6 @@ describe('plugin-meetings', () => {
2035
2043
  'Failed to fetch preferred site from user - no site will be set'
2036
2044
  );
2037
2045
  });
2038
-
2039
2046
  });
2040
2047
  });
2041
2048
 
@@ -6,7 +6,6 @@ import {RemoteMedia} from '@webex/plugin-meetings/src/multistream/remoteMedia';
6
6
  import {ReceiveSlot} from '@webex/plugin-meetings/src/multistream/receiveSlot';
7
7
  import sinon from 'sinon';
8
8
  import {assert} from '@webex/test-helper-chai';
9
- import { NamedMediaGroup } from "@webex/json-multistream";
10
9
 
11
10
  class FakeSlot extends EventEmitter {
12
11
  public mediaType: MediaType;
@@ -18,7 +18,6 @@ import testUtils from '../../../utils/testUtils';
18
18
  import LoggerProxy from '@webex/plugin-meetings/src/common/logs/logger-proxy';
19
19
  import LoggerConfig from '@webex/plugin-meetings/src/common/logs/logger-config';
20
20
  import { expect } from 'chai';
21
- import { NamedMediaGroup } from "@webex/json-multistream";
22
21
 
23
22
  class FakeSlot extends EventEmitter {
24
23
  public mediaType: MediaType;
@@ -4,6 +4,7 @@ import MockWebex from '@webex/test-helper-mock-webex';
4
4
  import Meetings from '@webex/plugin-meetings';
5
5
  import ReachabilityRequest from '@webex/plugin-meetings/src/reachability/request';
6
6
  import {IP_VERSION} from '@webex/plugin-meetings/src/constants';
7
+ import {NewMetrics} from '@webex/internal-plugin-metrics';
7
8
 
8
9
 
9
10
  describe('plugin-meetings/reachability', () => {
@@ -14,6 +15,7 @@ describe('plugin-meetings/reachability', () => {
14
15
  webex = new MockWebex({
15
16
  children: {
16
17
  meetings: Meetings,
18
+ newMetrics: NewMetrics
17
19
  },
18
20
  });
19
21
 
@@ -22,19 +24,25 @@ describe('plugin-meetings/reachability', () => {
22
24
  regionCode: 'WEST-COAST',
23
25
  };
24
26
 
25
- webex.internal = {
26
- services: {
27
- get: sinon.mock().returns('locusUrl'),
28
- waitForCatalog: sinon.mock().returns(Promise.resolve({})),
29
- },
27
+ webex.internal.services = {
28
+ get: sinon.mock().returns('locusUrl'),
29
+ waitForCatalog: sinon.mock().returns(Promise.resolve({})),
30
30
  };
31
31
 
32
-
33
32
  reachabilityRequest = new ReachabilityRequest(webex);
34
33
 
35
34
  });
36
35
 
37
36
  describe('#getClusters', () => {
37
+
38
+ beforeEach(() => {
39
+ sinon.spy(webex.internal.newMetrics.callDiagnosticLatencies, 'measureLatency');
40
+ });
41
+
42
+ afterEach(() => {
43
+ sinon.restore();
44
+ });
45
+
38
46
  it('sends a GET request with the correct params', async () => {
39
47
  webex.request = sinon.mock().returns(Promise.resolve({
40
48
  body: {
@@ -49,7 +57,6 @@ describe('plugin-meetings/reachability', () => {
49
57
  }));
50
58
 
51
59
  const res = await reachabilityRequest.getClusters(IP_VERSION.only_ipv4);
52
-
53
60
  const requestParams = webex.request.getCall(0).args[0];
54
61
 
55
62
  assert.equal(requestParams.method, 'GET');
@@ -63,6 +70,7 @@ describe('plugin-meetings/reachability', () => {
63
70
  });
64
71
  assert.deepEqual(res.clusters.clusterId, {udp: "testUDP", isVideoMesh: true})
65
72
  assert.deepEqual(res.joinCookie, {anycastEntryPoint: "aws-eu-west-1"})
73
+ assert.calledOnceWithExactly(webex.internal.newMetrics.callDiagnosticLatencies.measureLatency, sinon.match.func, 'internal.get.cluster.time');
66
74
  });
67
75
  });
68
76
  });
@@ -144,6 +144,34 @@ describe('plugin-meetings', () => {
144
144
  });
145
145
  });
146
146
 
147
+ // this can happen when we land on a video mesh node
148
+ it('does not use TURN server if TURN url is an empty string', async () => {
149
+ const rm = new ReconnectionManager(fakeMeeting);
150
+
151
+ fakeMeeting.roap.doTurnDiscovery.resolves({
152
+ turnServerInfo: {
153
+ url: '',
154
+ username: 'whatever',
155
+ password: 'whatever',
156
+ },
157
+ turnDiscoverySkippedReason: undefined,
158
+ });
159
+
160
+ await rm.reconnect();
161
+
162
+ assert.calledOnce(fakeMeeting.roap.doTurnDiscovery);
163
+ assert.calledWith(fakeMeeting.roap.doTurnDiscovery, fakeMeeting, true, true);
164
+ assert.calledOnce(fakeMediaConnection.reconnect);
165
+ assert.calledWith(fakeMediaConnection.reconnect, []);
166
+
167
+ assert.calledWith(fakeMeeting.webex.internal.newMetrics.submitClientEvent, {
168
+ name: 'client.media.reconnecting',
169
+ options: {
170
+ meetingId: rm.meeting.id,
171
+ },
172
+ });
173
+ });
174
+
147
175
  it('does not clear previous requests and re-request media for non-multistream meetings', async () => {
148
176
  fakeMeeting.isMultistream = false;
149
177
  const rm = new ReconnectionManager(fakeMeeting);
@@ -13,15 +13,23 @@ import BEHAVIORAL_METRICS from '@webex/plugin-meetings/src/metrics/constants';
13
13
  import { IP_VERSION } from '../../../../src/constants';
14
14
 
15
15
  describe('Roap', () => {
16
+ let webex;
17
+
18
+ const RESULT = {something: 'some value'};
19
+ const meeting = {id: 'some meeting id'} as Meeting;
20
+
21
+ beforeEach(() => {
22
+ webex = new MockWebex({});
23
+ });
24
+
25
+ afterEach(() => {
26
+ sinon.restore();
27
+ });
28
+
16
29
  describe('doTurnDiscovery', () => {
17
30
  [false, true].forEach(function (isReconnecting) {
18
31
  [false, true, undefined].forEach(function (isForced) {
19
32
  it(`calls this.turnDiscovery.doTurnDiscovery() and forwards all the arguments when isReconnecting = ${isReconnecting} and isForced = ${isForced}`, async () => {
20
- const webex = new MockWebex({});
21
-
22
- const RESULT = {something: 'some value'};
23
- const meeting = {id: 'some meeting id'} as Meeting;
24
-
25
33
  const doTurnDiscoveryStub = sinon
26
34
  .stub(TurnDiscovery.prototype, 'doTurnDiscovery')
27
35
  .resolves(RESULT);
@@ -32,11 +40,58 @@ describe('Roap', () => {
32
40
 
33
41
  assert.calledOnceWithExactly(doTurnDiscoveryStub, meeting, isReconnecting, isForced);
34
42
  assert.deepEqual(result, RESULT);
43
+ });
44
+ });
45
+ });
46
+
47
+ describe('generateTurnDiscoveryRequestMessage', () => {
48
+ [false, true].forEach(function (isForced) {
49
+ it(`calls this.turnDiscovery.generateTurnDiscoveryRequestMessage with isForced=${isForced}`, async () => {
50
+ const generateTurnDiscoveryRequestMessageStub = sinon
51
+ .stub(TurnDiscovery.prototype, 'generateTurnDiscoveryRequestMessage')
52
+ .resolves(RESULT);
53
+
54
+ const roap = new Roap({}, {parent: webex});
35
55
 
36
- sinon.restore();
56
+ const result = await roap.generateTurnDiscoveryRequestMessage(meeting, isForced);
57
+
58
+ assert.calledOnceWithExactly(generateTurnDiscoveryRequestMessageStub, meeting, isForced);
59
+ assert.deepEqual(result, RESULT);
37
60
  });
38
61
  });
39
62
  });
63
+
64
+ describe('handleTurnDiscoveryHttpResponse', () => {
65
+ it('calls this.turnDiscovery.handleTurnDiscoveryHttpResponse', async () => {
66
+ const handleTurnDiscoveryHttpResponseStub = sinon
67
+ .stub(TurnDiscovery.prototype, 'handleTurnDiscoveryHttpResponse')
68
+ .resolves(RESULT);
69
+
70
+ const httpReponse = {some: 'http response'};
71
+
72
+ const roap = new Roap({}, {parent: webex});
73
+
74
+ const result = await roap.handleTurnDiscoveryHttpResponse(meeting, httpReponse);
75
+
76
+ assert.calledOnceWithExactly(handleTurnDiscoveryHttpResponseStub, meeting, httpReponse);
77
+ assert.deepEqual(result, RESULT);
78
+ });
79
+ });
80
+
81
+ describe('abortTurnDiscovery', () => {
82
+ it('calls this.turnDiscovery.abort', async () => {
83
+ const abortStub = sinon
84
+ .stub(TurnDiscovery.prototype, 'abort')
85
+ .returns(RESULT);
86
+
87
+ const roap = new Roap({}, {parent: webex});
88
+
89
+ const result = await roap.abortTurnDiscovery();
90
+
91
+ assert.calledOnceWithExactly(abortStub);
92
+ assert.deepEqual(result, RESULT);
93
+ });
94
+ });
40
95
  });
41
96
 
42
97
  describe('sendRoapMediaRequest', () => {