@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
@@ -13,7 +13,7 @@ import {
13
13
  SHARE_STOPPED_REASON,
14
14
  _CALL_,
15
15
  _LEFT_,
16
- _ID_
16
+ _ID_,
17
17
  } from '../constants';
18
18
  import BEHAVIORAL_METRICS from '../metrics/constants';
19
19
  import ReconnectionError from '../common/errors/reconnection';
@@ -64,7 +64,7 @@ class NeedsRejoinError extends Error {
64
64
  /**
65
65
  * @export
66
66
  * @class ReconnectionManager
67
- */
67
+ */
68
68
  export default class ReconnectionManager {
69
69
  autoRejoinEnabled: any;
70
70
  iceState: any;
@@ -92,7 +92,7 @@ export default class ReconnectionManager {
92
92
  resolve: () => {},
93
93
  timer: undefined,
94
94
  // @ts-ignore
95
- timeoutDuration: meeting.config.reconnection.iceReconnectionTimeout
95
+ timeoutDuration: meeting.config.reconnection.iceReconnectionTimeout,
96
96
  };
97
97
 
98
98
  /**
@@ -100,21 +100,21 @@ export default class ReconnectionManager {
100
100
  * @type {String}
101
101
  * @private
102
102
  * @memberof ReconnectionManager
103
- */
103
+ */
104
104
  this.status = RECONNECTION.STATE.DEFAULT_STATUS;
105
105
  /**
106
106
  * @instance
107
107
  * @type {Number}
108
108
  * @private
109
109
  * @memberof ReconnectionManager
110
- */
110
+ */
111
111
  this.tryCount = RECONNECTION.STATE.DEFAULT_TRY_COUNT;
112
112
  /**
113
113
  * @instance
114
114
  * @type {Object}
115
115
  * @private
116
116
  * @memberof ReconnectionManager
117
- */
117
+ */
118
118
  // TODO : change this logic to not save the meeting instance
119
119
  // It gets complicated when meeting ends on remote side , We have a old meeting instance which is not up to date
120
120
  // @ts-ignore
@@ -135,7 +135,6 @@ export default class ReconnectionManager {
135
135
  // @ts-ignore
136
136
  this.autoRejoinEnabled = meeting.config.reconnection.autoRejoin;
137
137
 
138
-
139
138
  // Make sure reconnection state is in default
140
139
  this.reset();
141
140
  }
@@ -185,7 +184,9 @@ export default class ReconnectionManager {
185
184
  */
186
185
  public waitForIceReconnect() {
187
186
  if (!this.iceState.disconnected) {
188
- LoggerProxy.logger.log('ReconnectionManager:index#waitForIceReconnect --> waiting for ice reconnect');
187
+ LoggerProxy.logger.log(
188
+ 'ReconnectionManager:index#waitForIceReconnect --> waiting for ice reconnect'
189
+ );
189
190
 
190
191
  this.iceState.disconnected = true;
191
192
 
@@ -193,10 +194,11 @@ export default class ReconnectionManager {
193
194
  this.iceState.timer = setTimeout(() => {
194
195
  if (this.iceState.disconnected === false) {
195
196
  resolve();
196
- }
197
- else {
197
+ } else {
198
198
  this.iceState.disconnected = false;
199
- reject(new Error(`ice reconnection did not occur in ${this.iceState.timeoutDuration}ms`));
199
+ reject(
200
+ new Error(`ice reconnection did not occur in ${this.iceState.timeoutDuration}ms`)
201
+ );
200
202
  }
201
203
  }, this.iceState.timeoutDuration);
202
204
 
@@ -229,14 +231,13 @@ export default class ReconnectionManager {
229
231
  this.meeting = null;
230
232
  }
231
233
 
232
-
233
234
  /**
234
235
  * @public
235
236
  * @memberof ReconnectionManager
236
237
  * @returns {Boolean} true if reconnection operation is in progress
237
238
  */
238
239
  isReconnectInProgress() {
239
- return (this.status === RECONNECTION.STATE.IN_PROGRESS);
240
+ return this.status === RECONNECTION.STATE.IN_PROGRESS;
240
241
  }
241
242
 
242
243
  /**
@@ -254,7 +255,9 @@ export default class ReconnectionManager {
254
255
  return true;
255
256
  }
256
257
 
257
- LoggerProxy.logger.info('ReconnectionManager:index#validate --> Reconnection already in progress.');
258
+ LoggerProxy.logger.info(
259
+ 'ReconnectionManager:index#validate --> Reconnection already in progress.'
260
+ );
258
261
 
259
262
  throw new ReconnectInProgress('Reconnection already in progress.');
260
263
  }
@@ -280,38 +283,48 @@ export default class ReconnectionManager {
280
283
  networkDisconnect?: boolean;
281
284
  networkRetry?: boolean;
282
285
  } = {}) {
283
- LoggerProxy.logger.info(`ReconnectionManager:index#reconnect --> Reconnection start for meeting ${this.meeting.id}.`);
286
+ LoggerProxy.logger.info(
287
+ `ReconnectionManager:index#reconnect --> Reconnection start for meeting ${this.meeting.id}.`
288
+ );
284
289
  // First, validate that we can reconnect, if not, it will throw an error
285
290
  try {
286
291
  this.validate();
287
- }
288
- catch (error) {
289
- LoggerProxy.logger.info('ReconnectionManager:index#reconnect --> Reconnection unable to begin.', error);
292
+ } catch (error) {
293
+ LoggerProxy.logger.info(
294
+ 'ReconnectionManager:index#reconnect --> Reconnection unable to begin.',
295
+ error
296
+ );
290
297
  throw error;
291
298
  }
292
299
 
293
300
  if (!networkRetry) {
294
301
  // Only log START metrics on the initial reconnect
295
- LoggerProxy.logger.info('ReconnectionManager:index#reconnect --> Sending reconnect start metric.');
302
+ LoggerProxy.logger.info(
303
+ 'ReconnectionManager:index#reconnect --> Sending reconnect start metric.'
304
+ );
296
305
  Metrics.postEvent({
297
306
  event: eventType.MEDIA_RECONNECTING,
298
- meeting: this.meeting
307
+ meeting: this.meeting,
299
308
  });
300
309
  }
301
310
 
302
311
  return this.executeReconnection({networkDisconnect})
303
312
  .then(() => {
304
313
  LoggerProxy.logger.info('ReconnectionManager:index#reconnect --> Reconnection successful.');
305
- LoggerProxy.logger.info('ReconnectionManager:index#reconnect --> Sending reconnect success metric.');
314
+ LoggerProxy.logger.info(
315
+ 'ReconnectionManager:index#reconnect --> Sending reconnect success metric.'
316
+ );
306
317
  Metrics.postEvent({
307
318
  event: eventType.MEDIA_RECOVERED,
308
319
  meeting: this.meeting,
309
- data: {recoveredBy: reconnection.RECOVERED_BY_NEW}
320
+ data: {recoveredBy: reconnection.RECOVERED_BY_NEW},
310
321
  });
311
322
  })
312
323
  .catch((reconnectError) => {
313
324
  if (reconnectError instanceof NeedsRetryError) {
314
- LoggerProxy.logger.info('ReconnectionManager:index#reconnect --> Reconnection not successful, retrying.');
325
+ LoggerProxy.logger.info(
326
+ 'ReconnectionManager:index#reconnect --> Reconnection not successful, retrying.'
327
+ );
315
328
  // Reset our reconnect status since we are looping back to the beginning
316
329
  this.status = RECONNECTION.STATE.DEFAULT_STATUS;
317
330
 
@@ -320,8 +333,13 @@ export default class ReconnectionManager {
320
333
  }
321
334
 
322
335
  // Reconnect has failed
323
- LoggerProxy.logger.error('ReconnectionManager:index#reconnect --> Reconnection failed.', reconnectError.message);
324
- LoggerProxy.logger.info('ReconnectionManager:index#reconnect --> Sending reconnect abort metric.');
336
+ LoggerProxy.logger.error(
337
+ 'ReconnectionManager:index#reconnect --> Reconnection failed.',
338
+ reconnectError.message
339
+ );
340
+ LoggerProxy.logger.info(
341
+ 'ReconnectionManager:index#reconnect --> Sending reconnect abort metric.'
342
+ );
325
343
 
326
344
  const reconnectMetric = {
327
345
  event: eventType.CALL_ABORTED,
@@ -333,10 +351,10 @@ export default class ReconnectionManager {
333
351
  errorCode: 2008,
334
352
  fatal: true,
335
353
  name: errorObjects.name.mediaEngine,
336
- shownToUser: false
337
- }
338
- ]
339
- }
354
+ shownToUser: false,
355
+ },
356
+ ],
357
+ },
340
358
  };
341
359
 
342
360
  Metrics.postEvent(reconnectMetric);
@@ -348,7 +366,6 @@ export default class ReconnectionManager {
348
366
  }
349
367
  }
350
368
 
351
-
352
369
  throw reconnectError;
353
370
  });
354
371
  }
@@ -361,43 +378,57 @@ export default class ReconnectionManager {
361
378
  * @private
362
379
  * @memberof ReconnectionManager
363
380
  */
364
- private async executeReconnection({ networkDisconnect = false }: { networkDisconnect?: boolean }) {
381
+ private async executeReconnection({networkDisconnect = false}: {networkDisconnect?: boolean}) {
365
382
  this.status = RECONNECTION.STATE.IN_PROGRESS;
366
383
 
367
- LoggerProxy.logger.info('ReconnectionManager:index#executeReconnection --> Attempting to reconnect to meeting.');
384
+ LoggerProxy.logger.info(
385
+ 'ReconnectionManager:index#executeReconnection --> Attempting to reconnect to meeting.'
386
+ );
368
387
 
369
388
  if (networkDisconnect) {
370
389
  try {
371
390
  await this.reconnectMercuryWebSocket();
372
- LoggerProxy.logger.error('ReconnectionManager:index#executeReconnection --> Websocket reconnected.', this.webex.internal.device.url);
373
- }
374
- catch (error) {
375
- LoggerProxy.logger.error('ReconnectionManager:index#executeReconnection --> Unable to reconnect to websocket, giving up.');
391
+ LoggerProxy.logger.error(
392
+ 'ReconnectionManager:index#executeReconnection --> Websocket reconnected.',
393
+ this.webex.internal.device.url
394
+ );
395
+ } catch (error) {
396
+ LoggerProxy.logger.error(
397
+ 'ReconnectionManager:index#executeReconnection --> Unable to reconnect to websocket, giving up.'
398
+ );
376
399
  this.status = RECONNECTION.STATE.FAILURE;
377
- throw (error);
400
+ throw error;
378
401
  }
379
402
  }
380
403
 
381
404
  const wasSharing = this.meeting.shareStatus === SHARE_STATUS.LOCAL_SHARE_ACTIVE;
382
405
 
383
406
  try {
384
- LoggerProxy.logger.info('ReconnectionManager:index#executeReconnection --> Updating meeting data from server.');
407
+ LoggerProxy.logger.info(
408
+ 'ReconnectionManager:index#executeReconnection --> Updating meeting data from server.'
409
+ );
385
410
  await this.webex.meetings.syncMeetings();
386
- }
387
- catch (syncError) {
388
- LoggerProxy.logger.info('ReconnectionManager:index#executeReconnection --> Unable to sync meetings, reconnecting.', syncError);
389
- throw (new NeedsRetryError(syncError));
411
+ } catch (syncError) {
412
+ LoggerProxy.logger.info(
413
+ 'ReconnectionManager:index#executeReconnection --> Unable to sync meetings, reconnecting.',
414
+ syncError
415
+ );
416
+ throw new NeedsRetryError(syncError);
390
417
  }
391
418
 
392
419
  // TODO: try to improve this logic as the reconnection manager saves the instance of deleted meeting object
393
420
  // So that on rejoin it known what parametrs it was using
394
421
  if (!this.meeting || !this.webex.meetings.getMeetingByType(_ID_, this.meeting.id)) {
395
- LoggerProxy.logger.info('ReconnectionManager:index#executeReconnection --> Meeting got deleted due to inactivity or ended remotely ');
422
+ LoggerProxy.logger.info(
423
+ 'ReconnectionManager:index#executeReconnection --> Meeting got deleted due to inactivity or ended remotely '
424
+ );
396
425
 
397
426
  throw new Error('Unable to rejoin a meeting already ended or inactive .');
398
427
  }
399
428
 
400
- LoggerProxy.logger.info(`ReconnectionManager:index#executeReconnection --> Current state of meeting is ${this.meeting.state}`);
429
+ LoggerProxy.logger.info(
430
+ `ReconnectionManager:index#executeReconnection --> Current state of meeting is ${this.meeting.state}`
431
+ );
401
432
 
402
433
  // If the meeting state was left, no longer reconnect media
403
434
  if (this.meeting.state === _LEFT_) {
@@ -405,22 +436,25 @@ export default class ReconnectionManager {
405
436
  throw new Error('Unable to rejoin a call in LEFT state.');
406
437
  }
407
438
 
408
- throw (new NeedsRejoinError({wasSharing}));
439
+ throw new NeedsRejoinError({wasSharing});
409
440
  }
410
441
 
411
442
  try {
412
443
  const media = await this.reconnectMedia();
413
444
 
414
- LoggerProxy.logger.log('ReconnectionManager:index#executeReconnection --> Media reestablished');
445
+ LoggerProxy.logger.log(
446
+ 'ReconnectionManager:index#executeReconnection --> Media reestablished'
447
+ );
415
448
  this.status = RECONNECTION.STATE.COMPLETE;
416
449
 
417
450
  return media;
418
- }
419
- catch (error) {
420
- LoggerProxy.logger.error('ReconnectionManager:index#executeReconnection --> Media reestablishment failed');
451
+ } catch (error) {
452
+ LoggerProxy.logger.error(
453
+ 'ReconnectionManager:index#executeReconnection --> Media reestablishment failed'
454
+ );
421
455
  this.status = RECONNECTION.STATE.FAILURE;
422
456
 
423
- throw (error);
457
+ throw error;
424
458
  }
425
459
  }
426
460
 
@@ -431,9 +465,11 @@ export default class ReconnectionManager {
431
465
  * @param {boolean} wasSharing
432
466
  * @returns {Promise}
433
467
  */
434
- async rejoinMeeting(wasSharing: boolean = false) {
468
+ async rejoinMeeting(wasSharing = false) {
435
469
  try {
436
- LoggerProxy.logger.info('ReconnectionManager:index#rejoinMeeting --> attemping meeting rejoin');
470
+ LoggerProxy.logger.info(
471
+ 'ReconnectionManager:index#rejoinMeeting --> attemping meeting rejoin'
472
+ );
437
473
 
438
474
  await this.meeting.join({rejoin: true});
439
475
  LoggerProxy.logger.info('ReconnectionManager:index#rejoinMeeting --> meeting rejoined');
@@ -450,31 +486,32 @@ export default class ReconnectionManager {
450
486
  this.meeting,
451
487
  {
452
488
  file: 'reconnection-manager/index',
453
- function: 'rejoinMeeting'
489
+ function: 'rejoinMeeting',
454
490
  },
455
491
  EVENT_TRIGGERS.MEETING_STOPPED_SHARING_LOCAL,
456
492
  {
457
- reason: SHARE_STOPPED_REASON.MEETING_REJOIN
493
+ reason: SHARE_STOPPED_REASON.MEETING_REJOIN,
458
494
  }
459
495
  );
460
496
  }
461
- }
462
- catch (joinError) {
497
+ } catch (joinError) {
463
498
  this.rejoinAttempts += 1;
464
499
  if (this.rejoinAttempts <= this.maxRejoinAttempts) {
465
- LoggerProxy.logger.info(`ReconnectionManager:index#rejoinMeeting --> Unable to rejoin meeting, attempt #${this.rejoinAttempts}, retrying.`, joinError);
500
+ LoggerProxy.logger.info(
501
+ `ReconnectionManager:index#rejoinMeeting --> Unable to rejoin meeting, attempt #${this.rejoinAttempts}, retrying.`,
502
+ joinError
503
+ );
466
504
  this.rejoinMeeting();
467
- }
468
- else {
469
- LoggerProxy.logger.error('ReconnectionManager:index#rejoinMeeting --> Unable to rejoin meeting after max attempts.', joinError);
470
- Metrics.sendBehavioralMetric(
471
- BEHAVIORAL_METRICS.MEETING_MAX_REJOIN_FAILURE,
472
- {
473
- locus_id: this.meeting.locusUrl.split('/').pop(),
474
- reason: joinError.message,
475
- stack: joinError.stack
476
- }
505
+ } else {
506
+ LoggerProxy.logger.error(
507
+ 'ReconnectionManager:index#rejoinMeeting --> Unable to rejoin meeting after max attempts.',
508
+ joinError
477
509
  );
510
+ Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MEETING_MAX_REJOIN_FAILURE, {
511
+ locus_id: this.meeting.locusUrl.split('/').pop(),
512
+ reason: joinError.message,
513
+ stack: joinError.stack,
514
+ });
478
515
  this.status = RECONNECTION.STATE.FAILURE;
479
516
  throw joinError;
480
517
  }
@@ -482,9 +519,11 @@ export default class ReconnectionManager {
482
519
 
483
520
  try {
484
521
  await this.reconnectMedia();
485
- }
486
- catch (mediaError) {
487
- LoggerProxy.logger.error('ReconnectionManager:index#rejoinMeeting --> Unable to reestablish media after rejoining.', mediaError);
522
+ } catch (mediaError) {
523
+ LoggerProxy.logger.error(
524
+ 'ReconnectionManager:index#rejoinMeeting --> Unable to reestablish media after rejoining.',
525
+ mediaError
526
+ );
488
527
  throw mediaError;
489
528
  }
490
529
  }
@@ -495,7 +534,9 @@ export default class ReconnectionManager {
495
534
  * @memberof ReconnectionManager
496
535
  */
497
536
  async reconnectMedia() {
498
- LoggerProxy.logger.log('ReconnectionManager:index#reconnectMedia --> Begin reestablishment of media');
537
+ LoggerProxy.logger.log(
538
+ 'ReconnectionManager:index#reconnectMedia --> Begin reestablishment of media'
539
+ );
499
540
 
500
541
  // we are not simply calling this.meeting.mediaProperties.webrtcMediaConnection.reconnect(),
501
542
  // but instead manually closing and creating new media connection, because we need to do the TURN discovery again
@@ -519,30 +560,44 @@ export default class ReconnectionManager {
519
560
  * @memberof ReconnectionManager
520
561
  */
521
562
  private async reconnectMercuryWebSocket() {
522
- LoggerProxy.logger.info('ReconnectionManager:index#reconnectMercuryWebSocket --> Reconnecting websocket.');
563
+ LoggerProxy.logger.info(
564
+ 'ReconnectionManager:index#reconnectMercuryWebSocket --> Reconnecting websocket.'
565
+ );
523
566
  // First, attempt to disconnect if we think we are already connected.
524
567
  if (this.webex.internal.mercury.connected) {
525
- LoggerProxy.logger.info('ReconnectionManager:index#reconnectMercuryWebSocket --> Disconnecting existing websocket.');
568
+ LoggerProxy.logger.info(
569
+ 'ReconnectionManager:index#reconnectMercuryWebSocket --> Disconnecting existing websocket.'
570
+ );
526
571
  try {
527
572
  await this.webex.internal.mercury.disconnect();
528
- LoggerProxy.logger.info('ReconnectionManager:index#reconnectMercuryWebSocket --> Websocket disconnected successfully.');
529
- }
530
- catch (disconnectError) {
573
+ LoggerProxy.logger.info(
574
+ 'ReconnectionManager:index#reconnectMercuryWebSocket --> Websocket disconnected successfully.'
575
+ );
576
+ } catch (disconnectError) {
531
577
  // If we can't disconnect, the sdk is in such a bad state that reconnecting is not going to happen.
532
- LoggerProxy.logger.error('ReconnectionManager:index#reconnectMercuryWebSocket --> Unable to disconnect from websocket, giving up.', disconnectError);
578
+ LoggerProxy.logger.error(
579
+ 'ReconnectionManager:index#reconnectMercuryWebSocket --> Unable to disconnect from websocket, giving up.',
580
+ disconnectError
581
+ );
533
582
  throw disconnectError;
534
583
  }
535
584
  }
536
585
 
537
586
  try {
538
- LoggerProxy.logger.info('ReconnectionManager:index#reconnectMercuryWebSocket --> Connecting websocket.');
587
+ LoggerProxy.logger.info(
588
+ 'ReconnectionManager:index#reconnectMercuryWebSocket --> Connecting websocket.'
589
+ );
539
590
  await this.webex.internal.mercury.connect();
540
- LoggerProxy.logger.info('ReconnectionManager:index#reconnectMercuryWebSocket --> Websocket connected successfully.');
541
- }
542
- catch (connectError) {
543
- LoggerProxy.logger.error('ReconnectionManager:index#reconnectMercuryWebSocket --> Unable to connect to websocket, giving up.', connectError);
544
-
545
- throw (connectError);
591
+ LoggerProxy.logger.info(
592
+ 'ReconnectionManager:index#reconnectMercuryWebSocket --> Websocket connected successfully.'
593
+ );
594
+ } catch (connectError) {
595
+ LoggerProxy.logger.error(
596
+ 'ReconnectionManager:index#reconnectMercuryWebSocket --> Unable to connect to websocket, giving up.',
597
+ connectError
598
+ );
599
+
600
+ throw connectError;
546
601
  }
547
602
  }
548
603
  }
package/src/roap/index.ts CHANGED
@@ -19,11 +19,11 @@ import Meeting from '../meeting';
19
19
  */
20
20
 
21
21
  /**
22
- * @typedef {Object} SeqOptions
23
- * @property {String} correlationId
24
- * @property {String} mediaId
25
- * @property {Number} seq
26
- */
22
+ * @typedef {Object} SeqOptions
23
+ * @property {String} correlationId
24
+ * @property {String} mediaId
25
+ * @property {Number} seq
26
+ */
27
27
 
28
28
  /**
29
29
  * @class Roap
@@ -81,11 +81,14 @@ export default class Roap extends StatelessWebexPlugin {
81
81
  public sendRoapOK(options: any) {
82
82
  return Promise.resolve().then(() => {
83
83
  // @ts-ignore
84
- const meeting = this.webex.meetings.meetingCollection.getByKey('correlationId', options.correlationId);
84
+ const meeting = this.webex.meetings.meetingCollection.getByKey(
85
+ 'correlationId',
86
+ options.correlationId
87
+ );
85
88
  const roapMessage = {
86
89
  messageType: ROAP.ROAP_TYPES.OK,
87
90
  version: ROAP.ROAP_VERSION,
88
- seq: options.seq
91
+ seq: options.seq,
89
92
  };
90
93
 
91
94
  LoggerProxy.logger.log(`Roap:index#sendRoapOK --> ROAP OK sending with seq ${options.seq}`);
@@ -117,25 +120,27 @@ export default class Roap extends StatelessWebexPlugin {
117
120
  */
118
121
  public sendRoapAnswer(options: any) {
119
122
  // @ts-ignore
120
- const meeting = this.webex.meetings.meetingCollection.getByKey('correlationId', options.correlationId);
123
+ const meeting = this.webex.meetings.meetingCollection.getByKey(
124
+ 'correlationId',
125
+ options.correlationId
126
+ );
121
127
  const roapMessage = {
122
128
  messageType: ROAP.ROAP_TYPES.ANSWER,
123
129
  sdps: [options.sdp],
124
130
  version: ROAP.ROAP_VERSION,
125
- seq: options.seq
131
+ seq: options.seq,
126
132
  };
127
133
 
128
- return this.roapRequest
129
- .sendRoap({
130
- roapMessage,
131
- locusSelfUrl: meeting.selfUrl,
132
- mediaId: options.mediaId,
133
- correlationId: options.correlationId,
134
- audioMuted: meeting.isAudioMuted(),
135
- videoMuted: meeting.isVideoMuted(),
136
- meetingId: meeting.id,
137
- preferTranscoding: !meeting.isMultistream,
138
- });
134
+ return this.roapRequest.sendRoap({
135
+ roapMessage,
136
+ locusSelfUrl: meeting.selfUrl,
137
+ mediaId: options.mediaId,
138
+ correlationId: options.correlationId,
139
+ audioMuted: meeting.isAudioMuted(),
140
+ videoMuted: meeting.isVideoMuted(),
141
+ meetingId: meeting.id,
142
+ preferTranscoding: !meeting.isMultistream,
143
+ });
139
144
  }
140
145
 
141
146
  /**
@@ -146,27 +151,32 @@ export default class Roap extends StatelessWebexPlugin {
146
151
  */
147
152
  sendRoapError(options) {
148
153
  // @ts-ignore
149
- const meeting = this.webex.meetings.meetingCollection.getByKey('correlationId', options.correlationId);
154
+ const meeting = this.webex.meetings.meetingCollection.getByKey(
155
+ 'correlationId',
156
+ options.correlationId
157
+ );
150
158
  const roapMessage = {
151
159
  messageType: ROAP.ROAP_TYPES.ERROR,
152
160
  version: ROAP.ROAP_VERSION,
153
161
  errorType: options.errorType,
154
- seq: options.seq
155
-
162
+ seq: options.seq,
156
163
  };
157
164
 
158
- return this.roapRequest.sendRoap({
159
- roapMessage,
160
- locusSelfUrl: meeting.selfUrl,
161
- mediaId: options.mediaId,
162
- correlationId: options.correlationId,
163
- audioMuted: meeting.isAudioMuted(),
164
- videoMuted: meeting.isVideoMuted(),
165
- meetingId: meeting.id,
166
- preferTranscoding: !meeting.isMultistream,
167
- })
165
+ return this.roapRequest
166
+ .sendRoap({
167
+ roapMessage,
168
+ locusSelfUrl: meeting.selfUrl,
169
+ mediaId: options.mediaId,
170
+ correlationId: options.correlationId,
171
+ audioMuted: meeting.isAudioMuted(),
172
+ videoMuted: meeting.isVideoMuted(),
173
+ meetingId: meeting.id,
174
+ preferTranscoding: !meeting.isMultistream,
175
+ })
168
176
  .then(() => {
169
- LoggerProxy.logger.log(`Roap:index#sendRoapError --> ROAP ERROR sent with seq ${options.seq}`);
177
+ LoggerProxy.logger.log(
178
+ `Roap:index#sendRoapError --> ROAP ERROR sent with seq ${options.seq}`
179
+ );
170
180
  });
171
181
  }
172
182
 
@@ -177,15 +187,13 @@ export default class Roap extends StatelessWebexPlugin {
177
187
  * @memberof Roap
178
188
  */
179
189
  sendRoapMediaRequest(options: any) {
180
- const {
181
- meeting, seq, sdp, reconnect, tieBreaker
182
- } = options;
190
+ const {meeting, seq, sdp, reconnect, tieBreaker} = options;
183
191
  const roapMessage = {
184
192
  messageType: ROAP.ROAP_TYPES.OFFER,
185
193
  sdps: [sdp],
186
194
  version: ROAP.ROAP_VERSION,
187
195
  seq,
188
- tieBreaker
196
+ tieBreaker,
189
197
  };
190
198
 
191
199
  // When reconnecting, it's important that the first roap message being sent out has empty media id.