@webex/plugin-meetings 3.1.0-next.9 → 3.2.0

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 (181) hide show
  1. package/dist/annotation/annotation.types.d.ts +42 -0
  2. package/dist/annotation/constants.d.ts +31 -0
  3. package/dist/annotation/index.d.ts +117 -0
  4. package/dist/breakouts/breakout.d.ts +8 -0
  5. package/dist/breakouts/breakout.js +1 -1
  6. package/dist/breakouts/collection.d.ts +5 -0
  7. package/dist/breakouts/edit-lock-error.d.ts +15 -0
  8. package/dist/breakouts/events.d.ts +8 -0
  9. package/dist/breakouts/index.d.ts +5 -0
  10. package/dist/breakouts/index.js +1 -1
  11. package/dist/breakouts/request.d.ts +22 -0
  12. package/dist/breakouts/utils.d.ts +15 -0
  13. package/dist/common/browser-detection.d.ts +9 -0
  14. package/dist/common/collection.d.ts +48 -0
  15. package/dist/common/config.d.ts +2 -0
  16. package/dist/common/errors/captcha-error.d.ts +15 -0
  17. package/dist/common/errors/intent-to-join.d.ts +16 -0
  18. package/dist/common/errors/join-meeting.d.ts +17 -0
  19. package/dist/common/errors/media.d.ts +15 -0
  20. package/dist/common/errors/no-meeting-info.d.ts +14 -0
  21. package/dist/common/errors/parameter.d.ts +15 -0
  22. package/dist/common/errors/password-error.d.ts +15 -0
  23. package/dist/common/errors/permission.d.ts +14 -0
  24. package/dist/common/errors/reclaim-host-role-errors.d.ts +60 -0
  25. package/dist/common/errors/reconnection-in-progress.d.ts +9 -0
  26. package/dist/common/errors/reconnection-in-progress.js +34 -0
  27. package/dist/common/errors/reconnection-in-progress.js.map +1 -0
  28. package/dist/common/errors/reconnection.d.ts +15 -0
  29. package/dist/common/errors/stats.d.ts +15 -0
  30. package/dist/common/errors/webex-errors.d.ts +93 -0
  31. package/dist/common/errors/webex-meetings-error.d.ts +20 -0
  32. package/dist/common/events/events-scope.d.ts +17 -0
  33. package/dist/common/events/events.d.ts +12 -0
  34. package/dist/common/events/trigger-proxy.d.ts +2 -0
  35. package/dist/common/events/util.d.ts +2 -0
  36. package/dist/common/logs/logger-config.d.ts +2 -0
  37. package/dist/common/logs/logger-proxy.d.ts +2 -0
  38. package/dist/common/logs/request.d.ts +36 -0
  39. package/dist/common/queue.d.ts +34 -0
  40. package/dist/config.d.ts +73 -0
  41. package/dist/constants.d.ts +1088 -0
  42. package/dist/constants.js +6 -3
  43. package/dist/constants.js.map +1 -1
  44. package/dist/controls-options-manager/constants.d.ts +4 -0
  45. package/dist/controls-options-manager/enums.d.ts +15 -0
  46. package/dist/controls-options-manager/index.d.ts +136 -0
  47. package/dist/controls-options-manager/types.d.ts +43 -0
  48. package/dist/controls-options-manager/util.d.ts +1 -0
  49. package/dist/index.d.ts +7 -0
  50. package/dist/interceptors/index.d.ts +2 -0
  51. package/dist/interceptors/locusRetry.d.ts +27 -0
  52. package/dist/interpretation/collection.d.ts +5 -0
  53. package/dist/interpretation/index.d.ts +5 -0
  54. package/dist/interpretation/index.js +1 -1
  55. package/dist/interpretation/siLanguage.d.ts +5 -0
  56. package/dist/interpretation/siLanguage.js +1 -1
  57. package/dist/locus-info/controlsUtils.d.ts +2 -0
  58. package/dist/locus-info/embeddedAppsUtils.d.ts +2 -0
  59. package/dist/locus-info/fullState.d.ts +2 -0
  60. package/dist/locus-info/hostUtils.d.ts +2 -0
  61. package/dist/locus-info/index.d.ts +322 -0
  62. package/dist/locus-info/infoUtils.d.ts +2 -0
  63. package/dist/locus-info/mediaSharesUtils.d.ts +2 -0
  64. package/dist/locus-info/parser.d.ts +272 -0
  65. package/dist/locus-info/selfUtils.d.ts +2 -0
  66. package/dist/media/MediaConnectionAwaiter.d.ts +61 -0
  67. package/dist/media/index.d.ts +34 -0
  68. package/dist/media/properties.d.ts +93 -0
  69. package/dist/media/util.d.ts +2 -0
  70. package/dist/mediaQualityMetrics/config.d.ts +241 -0
  71. package/dist/mediaQualityMetrics/config.js +10 -10
  72. package/dist/mediaQualityMetrics/config.js.map +1 -1
  73. package/dist/meeting/in-meeting-actions.d.ts +167 -0
  74. package/dist/meeting/index.d.ts +1825 -0
  75. package/dist/meeting/index.js +112 -64
  76. package/dist/meeting/index.js.map +1 -1
  77. package/dist/meeting/locusMediaRequest.d.ts +74 -0
  78. package/dist/meeting/locusMediaRequest.js +27 -0
  79. package/dist/meeting/locusMediaRequest.js.map +1 -1
  80. package/dist/meeting/muteState.d.ts +178 -0
  81. package/dist/meeting/request.d.ts +295 -0
  82. package/dist/meeting/request.type.d.ts +11 -0
  83. package/dist/meeting/state.d.ts +9 -0
  84. package/dist/meeting/util.d.ts +119 -0
  85. package/dist/meeting/util.js +0 -16
  86. package/dist/meeting/util.js.map +1 -1
  87. package/dist/meeting/voicea-meeting.d.ts +16 -0
  88. package/dist/meeting/voicea-meeting.js +37 -49
  89. package/dist/meeting/voicea-meeting.js.map +1 -1
  90. package/dist/meeting-info/collection.d.ts +20 -0
  91. package/dist/meeting-info/index.d.ts +69 -0
  92. package/dist/meeting-info/meeting-info-v2.d.ts +123 -0
  93. package/dist/meeting-info/request.d.ts +22 -0
  94. package/dist/meeting-info/util.d.ts +2 -0
  95. package/dist/meeting-info/utilv2.d.ts +2 -0
  96. package/dist/meetings/collection.d.ts +40 -0
  97. package/dist/meetings/index.d.ts +398 -0
  98. package/dist/meetings/index.js +12 -28
  99. package/dist/meetings/index.js.map +1 -1
  100. package/dist/meetings/meetings.types.d.ts +4 -0
  101. package/dist/meetings/request.d.ts +27 -0
  102. package/dist/meetings/util.d.ts +18 -0
  103. package/dist/member/index.d.ts +160 -0
  104. package/dist/member/types.d.ts +32 -0
  105. package/dist/member/util.d.ts +2 -0
  106. package/dist/members/collection.d.ts +29 -0
  107. package/dist/members/index.d.ts +353 -0
  108. package/dist/members/request.d.ts +114 -0
  109. package/dist/members/types.d.ts +25 -0
  110. package/dist/members/util.d.ts +215 -0
  111. package/dist/metrics/constants.d.ts +70 -0
  112. package/dist/metrics/index.d.ts +45 -0
  113. package/dist/multistream/mediaRequestManager.d.ts +119 -0
  114. package/dist/multistream/receiveSlot.d.ts +68 -0
  115. package/dist/multistream/receiveSlotManager.d.ts +56 -0
  116. package/dist/multistream/remoteMedia.d.ts +72 -0
  117. package/dist/multistream/remoteMediaGroup.d.ts +49 -0
  118. package/dist/multistream/remoteMediaManager.d.ts +300 -0
  119. package/dist/multistream/sendSlotManager.d.ts +69 -0
  120. package/dist/networkQualityMonitor/index.d.ts +70 -0
  121. package/dist/personal-meeting-room/index.d.ts +47 -0
  122. package/dist/personal-meeting-room/request.d.ts +14 -0
  123. package/dist/personal-meeting-room/util.d.ts +2 -0
  124. package/dist/reachability/clusterReachability.d.ts +110 -0
  125. package/dist/reachability/index.d.ts +109 -0
  126. package/dist/reachability/index.js +88 -9
  127. package/dist/reachability/index.js.map +1 -1
  128. package/dist/reachability/request.d.ts +39 -0
  129. package/dist/reachability/util.d.ts +15 -0
  130. package/dist/reactions/constants.d.ts +3 -0
  131. package/dist/reactions/reactions.d.ts +4 -0
  132. package/dist/reactions/reactions.type.d.ts +52 -0
  133. package/dist/reconnection-manager/index.d.ts +136 -0
  134. package/dist/recording-controller/enums.d.ts +7 -0
  135. package/dist/recording-controller/index.d.ts +207 -0
  136. package/dist/recording-controller/util.d.ts +14 -0
  137. package/dist/roap/index.d.ts +86 -0
  138. package/dist/roap/request.d.ts +39 -0
  139. package/dist/roap/request.js +3 -27
  140. package/dist/roap/request.js.map +1 -1
  141. package/dist/roap/turnDiscovery.d.ts +155 -0
  142. package/dist/rtcMetrics/constants.d.ts +4 -0
  143. package/dist/rtcMetrics/index.d.ts +61 -0
  144. package/dist/statsAnalyzer/global.d.ts +36 -0
  145. package/dist/statsAnalyzer/index.d.ts +217 -0
  146. package/dist/statsAnalyzer/index.js +4 -2
  147. package/dist/statsAnalyzer/index.js.map +1 -1
  148. package/dist/statsAnalyzer/mqaUtil.d.ts +48 -0
  149. package/dist/statsAnalyzer/mqaUtil.js +14 -0
  150. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  151. package/dist/transcription/index.d.ts +64 -0
  152. package/dist/types/constants.d.ts +3 -1
  153. package/dist/types/mediaQualityMetrics/config.d.ts +8 -2
  154. package/dist/types/meeting/index.d.ts +10 -1
  155. package/dist/types/meeting/locusMediaRequest.d.ts +1 -0
  156. package/dist/types/meeting/voicea-meeting.d.ts +3 -2
  157. package/dist/types/meetings/index.d.ts +1 -16
  158. package/dist/types/reachability/index.d.ts +11 -0
  159. package/dist/webinar/collection.d.ts +16 -0
  160. package/dist/webinar/index.d.ts +5 -0
  161. package/dist/webinar/index.js +1 -1
  162. package/package.json +21 -21
  163. package/src/constants.ts +3 -2
  164. package/src/mediaQualityMetrics/config.ts +13 -7
  165. package/src/meeting/index.ts +73 -30
  166. package/src/meeting/locusMediaRequest.ts +31 -0
  167. package/src/meeting/util.ts +1 -16
  168. package/src/meeting/voicea-meeting.ts +44 -46
  169. package/src/meetings/index.ts +15 -27
  170. package/src/reachability/index.ts +60 -0
  171. package/src/roap/request.ts +1 -24
  172. package/src/statsAnalyzer/index.ts +6 -3
  173. package/src/statsAnalyzer/mqaUtil.ts +18 -0
  174. package/test/unit/spec/meeting/index.js +70 -33
  175. package/test/unit/spec/meeting/locusMediaRequest.ts +49 -0
  176. package/test/unit/spec/meeting/utils.js +0 -10
  177. package/test/unit/spec/meeting/voicea-meeting.ts +5 -14
  178. package/test/unit/spec/meetings/index.js +59 -17
  179. package/test/unit/spec/reachability/index.ts +266 -0
  180. package/test/unit/spec/roap/request.ts +0 -37
  181. package/test/unit/spec/stats-analyzer/index.js +89 -8
@@ -18,6 +18,7 @@ import TriggerProxy from '@webex/plugin-meetings/src/common/events/trigger-proxy
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 Meeting, {CallStateForMetrics} from '@webex/plugin-meetings/src/meeting';
21
+ import {Services} from '@webex/webex-core';
21
22
  import MeetingUtil from '@webex/plugin-meetings/src/meeting/util';
22
23
  import Meetings from '@webex/plugin-meetings/src/meetings';
23
24
  import MeetingCollection from '@webex/plugin-meetings/src/meetings/collection';
@@ -75,6 +76,8 @@ describe('plugin-meetings', () => {
75
76
  let test1;
76
77
  let test2;
77
78
  let locusInfo;
79
+ let services;
80
+ let catalog;
78
81
 
79
82
  describe('meetings index', () => {
80
83
  beforeEach(() => {
@@ -93,9 +96,13 @@ describe('plugin-meetings', () => {
93
96
  device: Device,
94
97
  mercury: Mercury,
95
98
  meetings: Meetings,
99
+ services: Services,
96
100
  },
97
101
  });
98
102
 
103
+ services = webex.internal.services;
104
+ catalog = services._getCatalog();
105
+
99
106
  Object.assign(webex, {
100
107
  logging: logger,
101
108
  });
@@ -161,6 +168,7 @@ describe('plugin-meetings', () => {
161
168
  ],
162
169
  })
163
170
  ),
171
+ _getCatalog: sinon.stub().returns(catalog),
164
172
  fetchClientRegionInfo: sinon.stub().returns(Promise.resolve()),
165
173
  },
166
174
  metrics: {
@@ -513,13 +521,8 @@ describe('plugin-meetings', () => {
513
521
  });
514
522
  describe('#getAllMeetings', () => {
515
523
  it('calls MeetingCollection to get all meetings with supplied options', () => {
516
- webex.meetings.getAllMeetings({
517
- test: test1,
518
- });
524
+ webex.meetings.getAllMeetings();
519
525
  assert.calledOnce(webex.meetings.meetingCollection.getAll);
520
- assert.calledWith(webex.meetings.meetingCollection.getAll, {
521
- test: test1,
522
- });
523
526
  });
524
527
  });
525
528
  });
@@ -1011,6 +1014,7 @@ describe('plugin-meetings', () => {
1011
1014
  callBackInfo: {
1012
1015
  callbackAddress: uri1,
1013
1016
  },
1017
+ devices: [],
1014
1018
  },
1015
1019
  info: {
1016
1020
  webExMeetingId,
@@ -1038,6 +1042,7 @@ describe('plugin-meetings', () => {
1038
1042
  callBackInfo: {
1039
1043
  callbackAddress: uri1,
1040
1044
  },
1045
+ devices: [],
1041
1046
  },
1042
1047
  info: {
1043
1048
  webExMeetingId,
@@ -1052,6 +1057,7 @@ describe('plugin-meetings', () => {
1052
1057
  callBackInfo: {
1053
1058
  callbackAddress: uri1,
1054
1059
  },
1060
+ devices: [],
1055
1061
  },
1056
1062
  info: {
1057
1063
  webExMeetingId,
@@ -1074,6 +1080,7 @@ describe('plugin-meetings', () => {
1074
1080
  callBackInfo: {
1075
1081
  callbackAddress: uri1,
1076
1082
  },
1083
+ devices: [],
1077
1084
  },
1078
1085
  info: {
1079
1086
  webExMeetingId,
@@ -1091,6 +1098,7 @@ describe('plugin-meetings', () => {
1091
1098
  callBackInfo: {
1092
1099
  callbackAddress: uri1,
1093
1100
  },
1101
+ devices: [],
1094
1102
  },
1095
1103
  info: {
1096
1104
  webExMeetingId,
@@ -1121,6 +1129,7 @@ describe('plugin-meetings', () => {
1121
1129
  callBackInfo: {
1122
1130
  callbackAddress: uri1,
1123
1131
  },
1132
+ devices: [],
1124
1133
  },
1125
1134
  info: {
1126
1135
  webExMeetingId,
@@ -1143,6 +1152,7 @@ describe('plugin-meetings', () => {
1143
1152
  callBackInfo: {
1144
1153
  callbackAddress: uri1,
1145
1154
  },
1155
+ devices: [],
1146
1156
  },
1147
1157
  info: {
1148
1158
  webExMeetingId,
@@ -1157,6 +1167,7 @@ describe('plugin-meetings', () => {
1157
1167
  callbackInfo: {
1158
1168
  callbackAddress: uri1,
1159
1169
  },
1170
+ devices: [],
1160
1171
  },
1161
1172
  info: {
1162
1173
  isUnifiedSpaceMeeting,
@@ -1914,34 +1925,34 @@ describe('plugin-meetings', () => {
1914
1925
  let loggerProxySpy;
1915
1926
 
1916
1927
  it('should call request.getMeetingPreferences to get the preferred webex site ', async () => {
1928
+ assert.deepEqual(webex.internal.services._getCatalog().getAllowedDomains(), []);
1917
1929
  assert.isDefined(webex.meetings.preferredWebexSite);
1918
1930
  await webex.meetings.fetchUserPreferredWebexSite();
1919
1931
 
1920
1932
  assert.equal(webex.meetings.preferredWebexSite, 'go.webex.com');
1933
+ assert.deepEqual(webex.internal.services._getCatalog().getAllowedDomains(), [
1934
+ 'go.webex.com',
1935
+ ]);
1921
1936
  });
1922
1937
 
1923
1938
  const setup = ({user} = {}) => {
1924
1939
  loggerProxySpy = sinon.spy(LoggerProxy.logger, 'error');
1940
+ assert.deepEqual(webex.internal.services._getCatalog().getAllowedDomains(), []);
1925
1941
 
1926
1942
  Object.assign(webex.internal, {
1927
- services: {
1928
- getMeetingPreferences: sinon.stub().returns(Promise.resolve({})),
1929
- },
1930
1943
  user: {
1931
1944
  get: sinon.stub().returns(Promise.resolve(user)),
1932
1945
  },
1933
1946
  });
1947
+
1948
+ Object.assign(webex.internal.services, {
1949
+ getMeetingPreferences: sinon.stub().returns(Promise.resolve({})),
1950
+ });
1934
1951
  };
1935
1952
 
1936
1953
  it('should not fail if UserPreferred info is not fetched ', async () => {
1937
1954
  setup();
1938
1955
 
1939
- Object.assign(webex.internal, {
1940
- services: {
1941
- getMeetingPreferences: sinon.stub().returns(Promise.resolve({})),
1942
- },
1943
- });
1944
-
1945
1956
  await webex.meetings.fetchUserPreferredWebexSite().then(() => {
1946
1957
  assert.equal(webex.meetings.preferredWebexSite, '');
1947
1958
  });
@@ -1949,6 +1960,7 @@ describe('plugin-meetings', () => {
1949
1960
  loggerProxySpy,
1950
1961
  'Failed to fetch preferred site from user - no site will be set'
1951
1962
  );
1963
+ assert.deepEqual(webex.internal.services._getCatalog().getAllowedDomains(), ['']);
1952
1964
  });
1953
1965
 
1954
1966
  it('should fall back to fetching the site from the user', async () => {
@@ -1965,6 +1977,10 @@ describe('plugin-meetings', () => {
1965
1977
  await webex.meetings.fetchUserPreferredWebexSite();
1966
1978
 
1967
1979
  assert.equal(webex.meetings.preferredWebexSite, 'site.webex.com');
1980
+ assert.deepEqual(webex.internal.services._getCatalog().getAllowedDomains(), [
1981
+ '',
1982
+ 'site.webex.com',
1983
+ ]);
1968
1984
  assert.notCalled(loggerProxySpy);
1969
1985
  });
1970
1986
 
@@ -1986,6 +2002,7 @@ describe('plugin-meetings', () => {
1986
2002
  loggerProxySpy,
1987
2003
  'Failed to fetch preferred site from user - no site will be set'
1988
2004
  );
2005
+ assert.deepEqual(webex.internal.services._getCatalog().getAllowedDomains(), ['']);
1989
2006
  });
1990
2007
  }
1991
2008
  );
@@ -2002,6 +2019,7 @@ describe('plugin-meetings', () => {
2002
2019
  loggerProxySpy,
2003
2020
  'Failed to fetch preferred site from user - no site will be set'
2004
2021
  );
2022
+ assert.deepEqual(webex.internal.services._getCatalog().getAllowedDomains(), ['']);
2005
2023
  });
2006
2024
 
2007
2025
  it('should fall back to fetching the site from the user', async () => {
@@ -2019,6 +2037,10 @@ describe('plugin-meetings', () => {
2019
2037
 
2020
2038
  assert.equal(webex.meetings.preferredWebexSite, 'site.webex.com');
2021
2039
  assert.notCalled(loggerProxySpy);
2040
+ assert.deepEqual(webex.internal.services._getCatalog().getAllowedDomains(), [
2041
+ '',
2042
+ 'site.webex.com',
2043
+ ]);
2022
2044
  });
2023
2045
 
2024
2046
  forEach(
@@ -2039,6 +2061,7 @@ describe('plugin-meetings', () => {
2039
2061
  loggerProxySpy,
2040
2062
  'Failed to fetch preferred site from user - no site will be set'
2041
2063
  );
2064
+ assert.deepEqual(webex.internal.services._getCatalog().getAllowedDomains(), ['']);
2042
2065
  });
2043
2066
  }
2044
2067
  );
@@ -2055,6 +2078,7 @@ describe('plugin-meetings', () => {
2055
2078
  loggerProxySpy,
2056
2079
  'Failed to fetch preferred site from user - no site will be set'
2057
2080
  );
2081
+ assert.deepEqual(webex.internal.services._getCatalog().getAllowedDomains(), ['']);
2058
2082
  });
2059
2083
  });
2060
2084
  });
@@ -2299,6 +2323,7 @@ describe('plugin-meetings', () => {
2299
2323
  sessionType: 'BREAKOUT',
2300
2324
  };
2301
2325
  newLocus.self.state = 'JOINED';
2326
+ newLocus.self.devices = [];
2302
2327
  newLocus.fullState = {
2303
2328
  active: true,
2304
2329
  };
@@ -2315,7 +2340,7 @@ describe('plugin-meetings', () => {
2315
2340
  sessionType: 'MAIN',
2316
2341
  };
2317
2342
  newLocus.self.state = 'JOINED';
2318
-
2343
+ newLocus.self.devices = [];
2319
2344
  LoggerProxy.logger.log = sinon.stub();
2320
2345
  const result = webex.meetings.isNeedHandleLocusDTO(meeting, newLocus);
2321
2346
  assert.equal(result, true);
@@ -2330,11 +2355,28 @@ describe('plugin-meetings', () => {
2330
2355
  };
2331
2356
  newLocus.self.state = 'LEFT';
2332
2357
  newLocus.self.reason = 'MOVED';
2333
-
2358
+ newLocus.self.devices = [];
2334
2359
  LoggerProxy.logger.log = sinon.stub();
2335
2360
  const result = webex.meetings.isNeedHandleLocusDTO(meeting, newLocus);
2336
2361
  assert.equal(result, false);
2337
2362
  });
2363
+ it('moved to lobby, return true', () => {
2364
+ newLocus.controls.breakout = {
2365
+ sessionType: 'MAIN',
2366
+ };
2367
+ newLocus.self.state = 'JOINED';
2368
+ newLocus.self.devices = [
2369
+ {
2370
+ intent: {
2371
+ reason: 'ON_HOLD_LOBBY',
2372
+ type: 'WAIT',
2373
+ },
2374
+ },
2375
+ ];
2376
+ LoggerProxy.logger.log = sinon.stub();
2377
+ const result = webex.meetings.isNeedHandleLocusDTO(meeting, newLocus);
2378
+ assert.equal(result, true);
2379
+ });
2338
2380
  });
2339
2381
 
2340
2382
  describe('#getCorrespondingMeetingByLocus', () => {
@@ -141,6 +141,272 @@ describe('isAnyPublicClusterReachable', () => {
141
141
  });
142
142
  });
143
143
 
144
+
145
+ describe('isWebexMediaBackendUnreachable', () => {
146
+ let webex;
147
+
148
+ beforeEach(() => {
149
+ webex = new MockWebex();
150
+
151
+ sinon.stub(MeetingUtil, 'getIpVersion').returns(IP_VERSION.unknown);
152
+ });
153
+
154
+ afterEach(() => {
155
+ sinon.restore();
156
+ });
157
+
158
+ const runCheck = async (mockStorage: any, expectedValue: boolean) => {
159
+ if (mockStorage) {
160
+ await webex.boundedStorage.put(
161
+ 'Reachability',
162
+ 'reachability.result',
163
+ JSON.stringify(mockStorage)
164
+ );
165
+ }
166
+ const reachability = new Reachability(webex);
167
+
168
+ const result = await reachability.isWebexMediaBackendUnreachable();
169
+
170
+ assert.equal(result, expectedValue);
171
+ };
172
+
173
+ [
174
+ {
175
+ title: 'no clusters at all',
176
+ mockStorage: {},
177
+ expectedResult: false,
178
+ },
179
+ {
180
+ title: 'clusters without results',
181
+ mockStorage: {a: {}, b: {}},
182
+ expectedResult: false,
183
+ },
184
+ {
185
+ title: 'all clusters untested',
186
+ mockStorage: {
187
+ a: {udp: 'untested'},
188
+ b: {udp: 'untested', tcp: 'untested'},
189
+ },
190
+ expectedResult: false,
191
+ },
192
+ {
193
+ title: 'one cluster with udp reachable',
194
+ mockStorage: {x: {udp: {result: 'reachable'}, tcp: {result: 'unreachable'}}},
195
+ expectedResult: false,
196
+ },
197
+ {
198
+ title: 'one cluster with tcp reachable',
199
+ mockStorage: {x: {tcp: {result: 'reachable'}}},
200
+ expectedResult: false,
201
+ },
202
+ {
203
+ title: 'one cluster with xtls reachable',
204
+ mockStorage: {x: {xtls: {result: 'reachable'}}, y: {xtls: {result: 'unreachable'}}},
205
+ expectedResult: false,
206
+ },
207
+ {
208
+ title: 'multiple clusters with various protocols reachable',
209
+ mockStorage: {
210
+ a: {udp: {result: 'reachable'}, tcp: {result: 'reachable'}},
211
+ b: {udp: {result: 'unreachable'}, tcp: {result: 'reachable'}},
212
+ c: {tcp: {result: 'reachable'}},
213
+ d: {xtls: {result: 'reachable'}},
214
+ },
215
+ expectedResult: false,
216
+ },
217
+ {
218
+ title: 'multiple clusters with all protocols unreachable',
219
+ mockStorage: {
220
+ a: {
221
+ udp: {result: 'unreachable'},
222
+ tcp: {result: 'unreachable'},
223
+ xtls: {result: 'unreachable'},
224
+ },
225
+ b: {
226
+ udp: {result: 'unreachable'},
227
+ tcp: {result: 'unreachable'},
228
+ xtls: {result: 'unreachable'},
229
+ },
230
+ c: {
231
+ udp: {result: 'unreachable'},
232
+ tcp: {result: 'unreachable'},
233
+ xtls: {result: 'unreachable'},
234
+ },
235
+ },
236
+ expectedResult: true,
237
+ },
238
+ {
239
+ title: 'multiple clusters with UDP and TCP protocols unreachable, but TLS not tested',
240
+ mockStorage: {
241
+ a: {
242
+ udp: {result: 'unreachable'},
243
+ tcp: {result: 'unreachable'},
244
+ xtls: {result: 'untested'},
245
+ },
246
+ b: {
247
+ udp: {result: 'unreachable'},
248
+ tcp: {result: 'unreachable'},
249
+ xtls: {result: 'untested'},
250
+ },
251
+ c: {
252
+ udp: {result: 'unreachable'},
253
+ tcp: {result: 'unreachable'},
254
+ xtls: {result: 'untested'},
255
+ },
256
+ },
257
+ expectedResult: false,
258
+ },
259
+ {
260
+ title: 'multiple clusters with UDP and TCP protocols unreachable, but TLS missing',
261
+ mockStorage: {
262
+ a: {
263
+ udp: {result: 'unreachable'},
264
+ tcp: {result: 'unreachable'},
265
+ },
266
+ b: {
267
+ udp: {result: 'unreachable'},
268
+ tcp: {result: 'unreachable'},
269
+ },
270
+ c: {
271
+ udp: {result: 'unreachable'},
272
+ tcp: {result: 'unreachable'},
273
+ },
274
+ },
275
+ expectedResult: false,
276
+ },
277
+ {
278
+ title: 'multiple clusters with UDP and TLS protocols unreachable, but TCP not tested',
279
+ mockStorage: {
280
+ a: {
281
+ udp: {result: 'unreachable'},
282
+ tcp: {result: 'untested'},
283
+ xtls: {result: 'unreachable'},
284
+ },
285
+ b: {
286
+ udp: {result: 'unreachable'},
287
+ tcp: {result: 'untested'},
288
+ xtls: {result: 'unreachable'},
289
+ },
290
+ c: {
291
+ udp: {result: 'unreachable'},
292
+ tcp: {result: 'untested'},
293
+ xtls: {result: 'unreachable'},
294
+ },
295
+ },
296
+ expectedResult: false,
297
+ },
298
+ {
299
+ title: 'multiple clusters with UDP and TLS protocols unreachable, but TCP missing',
300
+ mockStorage: {
301
+ a: {
302
+ udp: {result: 'unreachable'},
303
+ xtls: {result: 'unreachable'},
304
+ },
305
+ b: {
306
+ udp: {result: 'unreachable'},
307
+ xtls: {result: 'unreachable'},
308
+ },
309
+ c: {
310
+ udp: {result: 'unreachable'},
311
+ xtls: {result: 'unreachable'},
312
+ },
313
+ },
314
+ expectedResult: false,
315
+ },
316
+ {
317
+ title: 'multiple clusters with all protocols unreachable, some untested',
318
+ mockStorage: {
319
+ a: {
320
+ udp: {result: 'unreachable'},
321
+ tcp: {result: 'unreachable'},
322
+ xtls: {result: 'unreachable'},
323
+ },
324
+ b: {udp: {result: 'unreachable'}, tcp: {result: 'untested'}, xtls: {result: 'unreachable'}},
325
+ c: {udp: {result: 'unreachable'}, tcp: {result: 'unreachable'}, xtls: {result: 'untested'}},
326
+ },
327
+ expectedResult: true,
328
+ },
329
+ {
330
+ title: 'multiple clusters with all protocols unreachable, except for 1 reachable on udp',
331
+ mockStorage: {
332
+ a: {
333
+ udp: {result: 'reachable'},
334
+ tcp: {result: 'unreachable'},
335
+ xtls: {result: 'unreachable'},
336
+ },
337
+ b: {
338
+ udp: {result: 'unreachable'},
339
+ tcp: {result: 'unreachable'},
340
+ xtls: {result: 'unreachable'},
341
+ },
342
+ c: {
343
+ udp: {result: 'unreachable'},
344
+ tcp: {result: 'unreachable'},
345
+ xtls: {result: 'unreachable'},
346
+ },
347
+ },
348
+ expectedResult: false,
349
+ },
350
+ {
351
+ title: 'multiple clusters with all protocols unreachable, except for 1 reachable on tcp',
352
+ mockStorage: {
353
+ a: {
354
+ udp: {result: 'unreachable'},
355
+ tcp: {result: 'unreachable'},
356
+ xtls: {result: 'unreachable'},
357
+ },
358
+ b: {
359
+ udp: {result: 'unreachable'},
360
+ tcp: {result: 'unreachable'},
361
+ xtls: {result: 'unreachable'},
362
+ },
363
+ c: {
364
+ udp: {result: 'unreachable'},
365
+ tcp: {result: 'reachable'},
366
+ xtls: {result: 'unreachable'},
367
+ },
368
+ },
369
+ expectedResult: false,
370
+ },
371
+ {
372
+ title: 'multiple clusters with all protocols unreachable, except for 1 reachable on xtls',
373
+ mockStorage: {
374
+ a: {
375
+ udp: {result: 'unreachable'},
376
+ tcp: {result: 'unreachable'},
377
+ xtls: {result: 'unreachable'},
378
+ },
379
+ b: {
380
+ udp: {result: 'unreachable'},
381
+ tcp: {result: 'unreachable'},
382
+ xtls: {result: 'reachable'},
383
+ },
384
+ c: {
385
+ udp: {result: 'unreachable'},
386
+ tcp: {result: 'unreachable'},
387
+ xtls: {result: 'unreachable'},
388
+ },
389
+ },
390
+ expectedResult: false,
391
+ },
392
+ {
393
+ title: 'multiple clusters with some missing results',
394
+ mockStorage: {
395
+ a: {udp: {result: 'unreachable'}},
396
+ b: {tcp: {result: 'unreachable'}},
397
+ c: {xtls: {result: 'unreachable'}},
398
+ d: {},
399
+ },
400
+ expectedResult: true,
401
+ },
402
+ ].forEach(({mockStorage, expectedResult, title}) => {
403
+ it(`returns ${expectedResult} when ${title}`, async () => {
404
+ await runCheck(mockStorage, expectedResult);
405
+ });
406
+ });
407
+ });
408
+
409
+
144
410
  describe('gatherReachability', () => {
145
411
  let webex;
146
412
 
@@ -133,20 +133,6 @@ describe('plugin-meetings/roap', () => {
133
133
  locusMediaRequest,
134
134
  });
135
135
 
136
- assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
137
- name: 'client.locus.media.request',
138
- options: {
139
- meetingId: 'meeting-id',
140
- },
141
- });
142
-
143
- assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
144
- name: 'client.locus.media.response',
145
- options: {
146
- meetingId: 'meeting-id',
147
- },
148
- });
149
-
150
136
  const requestParams = locusMediaRequest.send.getCall(0).args[0];
151
137
  assert.deepEqual(requestParams, {
152
138
  type: 'RoapMessage',
@@ -175,29 +161,6 @@ describe('plugin-meetings/roap', () => {
175
161
  },
176
162
  });
177
163
  });
178
-
179
- it('sends correct client event when fails', async () => {
180
- const locusMediaRequest = {send: sinon.stub().rejects({code: 300, message: 'error'})};
181
- try {
182
- await roapRequest.sendRoap({
183
- locusSelfUrl: locusUrl,
184
- mediaId: 'mediaId',
185
- roapMessage: {
186
- seq: 'seq',
187
- },
188
- meetingId: 'meeting-id',
189
- locusMediaRequest,
190
- });
191
- } catch (err) {
192
- assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
193
- name: 'client.locus.media.response',
194
- options: {
195
- meetingId: 'meeting-id',
196
- rawError: {code: 300, message: 'error'},
197
- },
198
- });
199
- }
200
- });
201
164
  });
202
165
 
203
166
  it('calls attachReachabilityData when sendRoap', async () => {