@webex/plugin-meetings 3.6.0-next.9 → 3.7.0-next.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 (118) hide show
  1. package/README.md +2 -1
  2. package/dist/breakouts/breakout.js +1 -1
  3. package/dist/breakouts/index.js +1 -1
  4. package/dist/config.js +2 -1
  5. package/dist/config.js.map +1 -1
  6. package/dist/constants.js +24 -2
  7. package/dist/constants.js.map +1 -1
  8. package/dist/controls-options-manager/enums.js +1 -0
  9. package/dist/controls-options-manager/enums.js.map +1 -1
  10. package/dist/controls-options-manager/index.js +10 -3
  11. package/dist/controls-options-manager/index.js.map +1 -1
  12. package/dist/controls-options-manager/types.js.map +1 -1
  13. package/dist/controls-options-manager/util.js +12 -0
  14. package/dist/controls-options-manager/util.js.map +1 -1
  15. package/dist/interpretation/index.js +1 -1
  16. package/dist/interpretation/siLanguage.js +1 -1
  17. package/dist/locus-info/controlsUtils.js +28 -4
  18. package/dist/locus-info/controlsUtils.js.map +1 -1
  19. package/dist/locus-info/fullState.js +2 -1
  20. package/dist/locus-info/fullState.js.map +1 -1
  21. package/dist/locus-info/index.js +61 -3
  22. package/dist/locus-info/index.js.map +1 -1
  23. package/dist/meeting/in-meeting-actions.js +19 -1
  24. package/dist/meeting/in-meeting-actions.js.map +1 -1
  25. package/dist/meeting/index.js +564 -441
  26. package/dist/meeting/index.js.map +1 -1
  27. package/dist/meeting/locusMediaRequest.js +2 -6
  28. package/dist/meeting/locusMediaRequest.js.map +1 -1
  29. package/dist/meeting/request.js +21 -29
  30. package/dist/meeting/request.js.map +1 -1
  31. package/dist/meeting/util.js +94 -59
  32. package/dist/meeting/util.js.map +1 -1
  33. package/dist/meetings/index.js +2 -0
  34. package/dist/meetings/index.js.map +1 -1
  35. package/dist/members/index.js +3 -2
  36. package/dist/members/index.js.map +1 -1
  37. package/dist/members/util.js +9 -5
  38. package/dist/members/util.js.map +1 -1
  39. package/dist/reachability/clusterReachability.js +0 -4
  40. package/dist/reachability/clusterReachability.js.map +1 -1
  41. package/dist/reachability/index.js +433 -136
  42. package/dist/reachability/index.js.map +1 -1
  43. package/dist/reachability/reachability.types.js +7 -0
  44. package/dist/reachability/reachability.types.js.map +1 -0
  45. package/dist/reachability/request.js +23 -9
  46. package/dist/reachability/request.js.map +1 -1
  47. package/dist/roap/index.js +5 -7
  48. package/dist/roap/index.js.map +1 -1
  49. package/dist/roap/request.js +45 -79
  50. package/dist/roap/request.js.map +1 -1
  51. package/dist/roap/turnDiscovery.js +3 -6
  52. package/dist/roap/turnDiscovery.js.map +1 -1
  53. package/dist/types/config.d.ts +1 -0
  54. package/dist/types/constants.d.ts +19 -0
  55. package/dist/types/controls-options-manager/enums.d.ts +2 -1
  56. package/dist/types/controls-options-manager/index.d.ts +2 -1
  57. package/dist/types/controls-options-manager/types.d.ts +2 -0
  58. package/dist/types/locus-info/index.d.ts +9 -0
  59. package/dist/types/meeting/in-meeting-actions.d.ts +18 -0
  60. package/dist/types/meeting/index.d.ts +14 -3
  61. package/dist/types/meeting/locusMediaRequest.d.ts +2 -3
  62. package/dist/types/meeting/request.d.ts +2 -2
  63. package/dist/types/meeting/util.d.ts +2 -2
  64. package/dist/types/meetings/index.d.ts +1 -1
  65. package/dist/types/members/index.d.ts +2 -1
  66. package/dist/types/members/util.d.ts +3 -1
  67. package/dist/types/reachability/clusterReachability.d.ts +1 -10
  68. package/dist/types/reachability/index.d.ts +74 -35
  69. package/dist/types/reachability/reachability.types.d.ts +64 -0
  70. package/dist/types/reachability/request.d.ts +5 -1
  71. package/dist/types/roap/request.d.ts +1 -13
  72. package/dist/webinar/index.js +32 -19
  73. package/dist/webinar/index.js.map +1 -1
  74. package/package.json +22 -22
  75. package/src/config.ts +1 -0
  76. package/src/constants.ts +25 -0
  77. package/src/controls-options-manager/enums.ts +1 -0
  78. package/src/controls-options-manager/index.ts +19 -2
  79. package/src/controls-options-manager/types.ts +2 -0
  80. package/src/controls-options-manager/util.ts +12 -0
  81. package/src/locus-info/controlsUtils.ts +46 -2
  82. package/src/locus-info/fullState.ts +1 -0
  83. package/src/locus-info/index.ts +60 -0
  84. package/src/meeting/in-meeting-actions.ts +37 -0
  85. package/src/meeting/index.ts +114 -11
  86. package/src/meeting/locusMediaRequest.ts +4 -8
  87. package/src/meeting/request.ts +4 -11
  88. package/src/meeting/util.ts +24 -4
  89. package/src/meetings/index.ts +46 -39
  90. package/src/members/index.ts +4 -2
  91. package/src/members/util.ts +3 -1
  92. package/src/reachability/clusterReachability.ts +1 -14
  93. package/src/reachability/index.ts +285 -77
  94. package/src/reachability/reachability.types.ts +85 -0
  95. package/src/reachability/request.ts +55 -30
  96. package/src/roap/index.ts +4 -5
  97. package/src/roap/request.ts +30 -44
  98. package/src/roap/turnDiscovery.ts +2 -4
  99. package/src/webinar/index.ts +31 -17
  100. package/test/unit/spec/controls-options-manager/index.js +56 -32
  101. package/test/unit/spec/controls-options-manager/util.js +44 -0
  102. package/test/unit/spec/locus-info/controlsUtils.js +80 -4
  103. package/test/unit/spec/locus-info/index.js +59 -2
  104. package/test/unit/spec/meeting/in-meeting-actions.ts +18 -0
  105. package/test/unit/spec/meeting/index.js +231 -100
  106. package/test/unit/spec/meeting/locusMediaRequest.ts +18 -11
  107. package/test/unit/spec/meeting/request.js +3 -26
  108. package/test/unit/spec/meeting/utils.js +53 -13
  109. package/test/unit/spec/meetings/index.js +16 -1
  110. package/test/unit/spec/members/index.js +25 -2
  111. package/test/unit/spec/members/request.js +37 -3
  112. package/test/unit/spec/members/utils.js +15 -1
  113. package/test/unit/spec/reachability/index.ts +265 -1
  114. package/test/unit/spec/reachability/request.js +56 -15
  115. package/test/unit/spec/roap/index.ts +1 -1
  116. package/test/unit/spec/roap/request.ts +51 -109
  117. package/test/unit/spec/roap/turnDiscovery.ts +202 -147
  118. package/test/unit/spec/webinar/index.ts +82 -16
@@ -35,16 +35,11 @@ describe('plugin-meetings/reachability', () => {
35
35
  });
36
36
 
37
37
  describe('#getClusters', () => {
38
+ let previousReport;
38
39
 
39
40
  beforeEach(() => {
40
41
  sinon.spy(webex.internal.newMetrics.callDiagnosticLatencies, 'measureLatency');
41
- });
42
42
 
43
- afterEach(() => {
44
- sinon.restore();
45
- });
46
-
47
- it('sends a GET request with the correct params', async () => {
48
43
  webex.request = sinon.mock().returns(Promise.resolve({
49
44
  body: {
50
45
  clusterClasses: {
@@ -57,21 +52,67 @@ describe('plugin-meetings/reachability', () => {
57
52
  }
58
53
  }));
59
54
 
60
- const res = await reachabilityRequest.getClusters(IP_VERSION.only_ipv4);
61
- const requestParams = webex.request.getCall(0).args[0];
55
+ webex.config.meetings.reachabilityGetClusterTimeout = 3000;
62
56
 
63
- assert.equal(requestParams.method, 'GET');
64
- assert.equal(requestParams.resource, `clusters`);
65
- assert.equal(requestParams.api, 'calliopeDiscovery');
66
- assert.equal(requestParams.shouldRefreshAccessToken, false);
57
+ previousReport = {
58
+ id: 'fake previous report',
59
+ }
60
+ });
61
+
62
+ afterEach(() => {
63
+ sinon.restore();
64
+ });
65
+
66
+ it('sends a POST request with the correct params when trigger is "startup"', async () => {
67
+ const res = await reachabilityRequest.getClusters('startup', IP_VERSION.only_ipv4, previousReport);
68
+ const requestParams = webex.request.getCall(0).args[0];
67
69
 
68
- assert.deepEqual(requestParams.qs, {
69
- JCSupport: 1,
70
- ipver: 4,
70
+ assert.deepEqual(requestParams, {
71
+ method: 'POST',
72
+ resource: `clusters`,
73
+ api: 'calliopeDiscovery',
74
+ shouldRefreshAccessToken: false,
75
+ timeout: 3000,
76
+ body: {
77
+ ipver: IP_VERSION.only_ipv4,
78
+ 'supported-options': {
79
+ 'report-version': 1,
80
+ 'early-call-min-clusters': true,
81
+ },
82
+ 'previous-report': previousReport,
83
+ trigger: 'startup',
84
+ },
71
85
  });
86
+
72
87
  assert.deepEqual(res.clusters.clusterId, {udp: "testUDP", isVideoMesh: true})
73
88
  assert.deepEqual(res.joinCookie, {anycastEntryPoint: "aws-eu-west-1"})
74
89
  assert.calledOnceWithExactly(webex.internal.newMetrics.callDiagnosticLatencies.measureLatency, sinon.match.func, 'internal.get.cluster.time');
75
90
  });
91
+
92
+ it('sends a POST request with the correct params when trigger is other than "startup"', async () => {
93
+ const res = await reachabilityRequest.getClusters('early-call/no-min-reached', IP_VERSION.only_ipv4, previousReport);
94
+ const requestParams = webex.request.getCall(0).args[0];
95
+
96
+ assert.deepEqual(requestParams, {
97
+ method: 'POST',
98
+ resource: `clusters`,
99
+ api: 'calliopeDiscovery',
100
+ shouldRefreshAccessToken: false,
101
+ timeout: 3000,
102
+ body: {
103
+ ipver: IP_VERSION.only_ipv4,
104
+ 'supported-options': {
105
+ 'report-version': 1,
106
+ 'early-call-min-clusters': true,
107
+ },
108
+ 'previous-report': previousReport,
109
+ trigger: 'early-call/no-min-reached',
110
+ },
111
+ });
112
+
113
+ assert.deepEqual(res.clusters.clusterId, {udp: "testUDP", isVideoMesh: true})
114
+ assert.deepEqual(res.joinCookie, {anycastEntryPoint: "aws-eu-west-1"})
115
+ assert.notCalled(webex.internal.newMetrics.callDiagnosticLatencies.measureLatency);
116
+ });
76
117
  });
77
118
  });
@@ -161,7 +161,7 @@ describe('Roap', () => {
161
161
  roapMessage: expectedRoapMessage,
162
162
  locusSelfUrl: meeting.selfUrl,
163
163
  mediaId: meeting.mediaId,
164
- meetingId: meeting.id,
164
+ isMultistream: meeting.isMultistream,
165
165
  locusMediaRequest: meeting.locusMediaRequest,
166
166
  })
167
167
  );
@@ -4,6 +4,7 @@ import {assert} from '@webex/test-helper-chai';
4
4
  import MockWebex from '@webex/test-helper-mock-webex';
5
5
  import Meetings from '@webex/plugin-meetings';
6
6
  import RoapRequest from '@webex/plugin-meetings/src/roap/request';
7
+ import MeetingUtil from '@webex/plugin-meetings/src/meeting/util';
7
8
  import {IP_VERSION, REACHABILITY} from '@webex/plugin-meetings/src/constants';
8
9
 
9
10
  describe('plugin-meetings/roap', () => {
@@ -23,6 +24,11 @@ describe('plugin-meetings/roap', () => {
23
24
  regionCode: 'WEST-COAST',
24
25
  };
25
26
 
27
+ webex.meetings.reachability = {
28
+ getReachabilityReportToAttachToRoap: sinon.stub().resolves({}),
29
+ getClientMediaPreferences: sinon.stub().resolves({}),
30
+ };
31
+
26
32
  webex.internal = {
27
33
  services: {
28
34
  get: sinon.mock().returns(locusUrl),
@@ -36,6 +42,8 @@ describe('plugin-meetings/roap', () => {
36
42
  },
37
43
  };
38
44
 
45
+ sinon.stub(MeetingUtil, 'getIpVersion').returns(IP_VERSION.ipv4_and_ipv6);
46
+
39
47
  // @ts-ignore
40
48
  roapRequest = new RoapRequest({webex});
41
49
 
@@ -74,146 +82,80 @@ describe('plugin-meetings/roap', () => {
74
82
  );
75
83
  });
76
84
 
77
- describe('#attachReachabilityData', () => {
78
- it('returns the correct reachability data', async () => {
79
- const res = await roapRequest.attachReachabilityData({});
80
-
81
- assert.deepEqual(res.localSdp, {
82
- reachability: {
83
- clusterId: {
84
- udp: {
85
- reachable: 'true',
86
- latencyInMilliseconds: '10',
87
- },
88
- tcp: {
89
- reachable: 'false',
90
- },
91
- xtls: {
92
- untested: 'true',
93
- }
94
- },
95
- },
96
- });
97
- assert.deepEqual(res.joinCookie, {
98
- anycastEntryPoint: 'aws-eu-west-1',
99
- });
100
- });
85
+ afterEach(() => {
86
+ sinon.restore();
87
+ })
101
88
 
102
- it('handles the case when reachability data does not exist', async () => {
103
- await webex.boundedStorage.del(REACHABILITY.namespace, REACHABILITY.localStorageJoinCookie);
89
+ describe('sendRoap', () => {
90
+ it('includes clientMediaPreferences and reachability in the request correctly', async () => {
91
+ const locusMediaRequest = {send: sinon.stub().resolves({body: {locus: {}}})};
104
92
 
105
- await webex.boundedStorage.del(REACHABILITY.namespace, REACHABILITY.localStorageResult);
106
- const sdp = {
107
- some: 'attribute',
93
+ const FAKE_REACHABILITY_REPORT = {
94
+ id: 'fake reachability report',
95
+ };
96
+ const FAKE_CLIENT_MEDIA_PREFERENCES = {
97
+ id: 'fake client media preferences',
108
98
  };
109
99
 
110
- const result = await roapRequest.attachReachabilityData(sdp);
111
-
112
- assert.deepEqual(result, {
113
- joinCookie: undefined,
114
- localSdp: {
115
- some: 'attribute',
116
- },
117
- });
118
- });
119
- });
120
-
121
- describe('sendRoap', () => {
122
- it('includes joinCookie in the request correctly', async () => {
123
- const locusMediaRequest = {send: sinon.stub().resolves({body: {locus: {}}})};
124
- const ipVersion = IP_VERSION.unknown;
100
+ webex.meetings.reachability.getReachabilityReportToAttachToRoap.resolves(FAKE_REACHABILITY_REPORT);
101
+ webex.meetings.reachability.getClientMediaPreferences.resolves(FAKE_CLIENT_MEDIA_PREFERENCES);
125
102
 
126
103
  await roapRequest.sendRoap({
127
104
  locusSelfUrl: locusUrl,
128
- ipVersion,
129
105
  mediaId: 'mediaId',
130
106
  roapMessage: {
131
107
  seq: 'seq',
132
108
  },
133
109
  meetingId: 'meeting-id',
110
+ isMultistream: true,
134
111
  locusMediaRequest,
135
112
  });
136
113
 
114
+ assert.calledOnceWithExactly(webex.meetings.reachability.getReachabilityReportToAttachToRoap);
115
+ assert.calledOnceWithExactly(webex.meetings.reachability.getClientMediaPreferences, true, IP_VERSION.ipv4_and_ipv6);
116
+
137
117
  const requestParams = locusMediaRequest.send.getCall(0).args[0];
138
118
  assert.deepEqual(requestParams, {
139
119
  type: 'RoapMessage',
140
120
  selfUrl: locusUrl,
141
- ipVersion,
142
- joinCookie: {
143
- anycastEntryPoint: 'aws-eu-west-1',
144
- },
121
+ clientMediaPreferences: FAKE_CLIENT_MEDIA_PREFERENCES,
145
122
  mediaId: 'mediaId',
146
123
  roapMessage: {
147
124
  seq: 'seq',
148
125
  },
149
- reachability: {
150
- clusterId: {
151
- tcp: {
152
- reachable: 'false',
153
- },
154
- udp: {
155
- latencyInMilliseconds: '10',
156
- reachable: 'true',
157
- },
158
- xtls: {
159
- untested: 'true',
160
- },
161
- },
162
- },
126
+ reachability: FAKE_REACHABILITY_REPORT,
163
127
  });
164
128
  });
165
- });
166
129
 
167
- it('calls attachReachabilityData when sendRoap', async () => {
168
- const locusMediaRequest = { send: sinon.stub().resolves({body: {locus: {}}})};
130
+ it('includes default clientMediaPreferences if calls to reachability fail', async () => {
131
+ const locusMediaRequest = {send: sinon.stub().resolves({body: {locus: {}}})};
169
132
 
170
- const newSdp = {
171
- new: 'sdp',
172
- reachability: { someResult: 'whatever' }
173
- };
174
- const ipVersion = IP_VERSION.only_ipv6;
133
+ webex.meetings.reachability.getClientMediaPreferences.rejects(new Error('fake error'));
175
134
 
176
- roapRequest.attachReachabilityData = sinon.stub().returns(
177
- Promise.resolve({
178
- localSdp: newSdp,
179
- joinCookie: {
180
- anycastEntryPoint: 'aws-eu-west-1',
135
+ await roapRequest.sendRoap({
136
+ locusSelfUrl: locusUrl,
137
+ mediaId: 'mediaId',
138
+ roapMessage: {
139
+ seq: 'seq',
181
140
  },
182
- })
183
- );
184
-
185
- await roapRequest.sendRoap({
186
- roapMessage: {
187
- seq: 1,
188
- },
189
- locusSelfUrl: 'locusSelfUrl',
190
- ipVersion,
191
- mediaId: 'mediaId',
192
- meetingId: 'meetingId',
193
- preferTranscoding: true,
194
- locusMediaRequest
195
- });
196
-
197
- const requestParams = locusMediaRequest.send.getCall(0).args[0];
141
+ meetingId: 'meeting-id',
142
+ isMultistream: true,
143
+ locusMediaRequest,
144
+ });
198
145
 
199
- assert.deepEqual(requestParams, {
200
- type: 'RoapMessage',
201
- selfUrl: 'locusSelfUrl',
202
- ipVersion,
203
- joinCookie: {
204
- anycastEntryPoint: 'aws-eu-west-1',
205
- },
206
- mediaId: 'mediaId',
207
- roapMessage: {
208
- seq: 1,
209
- },
210
- reachability: { someResult: 'whatever' },
211
- });
146
+ assert.calledOnce(webex.meetings.reachability.getClientMediaPreferences);
212
147
 
213
- assert.calledOnceWithExactly(roapRequest.attachReachabilityData, {
214
- roapMessage: {
215
- seq: 1,
216
- },
148
+ const requestParams = locusMediaRequest.send.getCall(0).args[0];
149
+ assert.deepEqual(requestParams, {
150
+ type: 'RoapMessage',
151
+ selfUrl: locusUrl,
152
+ clientMediaPreferences: {ipver: 0, joinCookie: undefined, preferTranscoding: false},
153
+ mediaId: 'mediaId',
154
+ roapMessage: {
155
+ seq: 'seq',
156
+ },
157
+ reachability: undefined,
158
+ });
217
159
  });
218
160
  });
219
161
  });