@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.
- package/UPGRADING.md +9 -9
- package/browsers.js +19 -24
- package/dist/common/browser-detection.js +1 -0
- package/dist/common/browser-detection.js.map +1 -1
- package/dist/common/collection.js.map +1 -1
- package/dist/common/errors/captcha-error.js +5 -5
- package/dist/common/errors/captcha-error.js.map +1 -1
- package/dist/common/errors/intent-to-join.js +5 -5
- package/dist/common/errors/intent-to-join.js.map +1 -1
- package/dist/common/errors/join-meeting.js +6 -6
- package/dist/common/errors/join-meeting.js.map +1 -1
- package/dist/common/errors/media.js +5 -5
- package/dist/common/errors/media.js.map +1 -1
- package/dist/common/errors/parameter.js +5 -5
- package/dist/common/errors/parameter.js.map +1 -1
- package/dist/common/errors/password-error.js +5 -5
- package/dist/common/errors/password-error.js.map +1 -1
- package/dist/common/errors/permission.js +4 -4
- package/dist/common/errors/permission.js.map +1 -1
- package/dist/common/errors/reconnection.js +5 -5
- package/dist/common/errors/reconnection.js.map +1 -1
- package/dist/common/errors/stats.js +5 -5
- package/dist/common/errors/stats.js.map +1 -1
- package/dist/common/errors/webex-errors.js.map +1 -1
- package/dist/common/errors/webex-meetings-error.js.map +1 -1
- package/dist/common/events/events-scope.js.map +1 -1
- package/dist/common/events/events.js.map +1 -1
- package/dist/common/events/trigger-proxy.js.map +1 -1
- package/dist/common/events/util.js.map +1 -1
- package/dist/common/logs/logger-proxy.js.map +1 -1
- package/dist/common/logs/request.js.map +1 -1
- package/dist/config.js.map +1 -1
- package/dist/constants.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/locus-info/controlsUtils.js.map +1 -1
- package/dist/locus-info/fullState.js.map +1 -1
- package/dist/locus-info/hostUtils.js.map +1 -1
- package/dist/locus-info/index.js +11 -8
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/infoUtils.js.map +1 -1
- package/dist/locus-info/mediaSharesUtils.js.map +1 -1
- package/dist/locus-info/parser.js +2 -1
- package/dist/locus-info/parser.js.map +1 -1
- package/dist/locus-info/selfUtils.js +2 -1
- package/dist/locus-info/selfUtils.js.map +1 -1
- package/dist/media/index.js.map +1 -1
- package/dist/media/internal-media-core-wrapper.js.map +1 -1
- package/dist/media/properties.js.map +1 -1
- package/dist/media/util.js +1 -1
- package/dist/media/util.js.map +1 -1
- package/dist/mediaQualityMetrics/config.js.map +1 -1
- package/dist/meeting/effectsState.js +1 -1
- package/dist/meeting/effectsState.js.map +1 -1
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +118 -89
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/muteState.js +1 -1
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.js +25 -0
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/request.type.js +8 -0
- package/dist/meeting/request.type.js.map +1 -0
- package/dist/meeting/state.js +5 -5
- package/dist/meeting/state.js.map +1 -1
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/collection.js.map +1 -1
- package/dist/meeting-info/index.js +2 -2
- package/dist/meeting-info/index.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js +48 -48
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meeting-info/request.js.map +1 -1
- package/dist/meeting-info/util.js.map +1 -1
- package/dist/meeting-info/utilv2.js +1 -1
- package/dist/meeting-info/utilv2.js.map +1 -1
- package/dist/meetings/collection.js.map +1 -1
- package/dist/meetings/index.js +251 -250
- package/dist/meetings/index.js.map +1 -1
- package/dist/meetings/request.js +2 -2
- package/dist/meetings/request.js.map +1 -1
- package/dist/meetings/util.js +14 -14
- package/dist/meetings/util.js.map +1 -1
- package/dist/member/index.js +31 -31
- package/dist/member/index.js.map +1 -1
- package/dist/member/util.js.map +1 -1
- package/dist/members/collection.js.map +1 -1
- package/dist/members/index.js +43 -43
- package/dist/members/index.js.map +1 -1
- package/dist/members/request.js.map +1 -1
- package/dist/members/util.js.map +1 -1
- package/dist/metrics/config.js.map +1 -1
- package/dist/metrics/constants.js.map +1 -1
- package/dist/metrics/index.js +23 -20
- package/dist/metrics/index.js.map +1 -1
- package/dist/multistream/multistreamMedia.js +2 -1
- package/dist/multistream/multistreamMedia.js.map +1 -1
- package/dist/multistream/receiveSlot.js.map +1 -1
- package/dist/multistream/receiveSlotManager.js +2 -0
- package/dist/multistream/receiveSlotManager.js.map +1 -1
- package/dist/multistream/remoteMedia.js.map +1 -1
- package/dist/multistream/remoteMediaGroup.js.map +1 -1
- package/dist/multistream/remoteMediaManager.js.map +1 -1
- package/dist/networkQualityMonitor/index.js +8 -8
- package/dist/networkQualityMonitor/index.js.map +1 -1
- package/dist/personal-meeting-room/index.js +7 -7
- package/dist/personal-meeting-room/index.js.map +1 -1
- package/dist/personal-meeting-room/request.js.map +1 -1
- package/dist/personal-meeting-room/util.js.map +1 -1
- package/dist/reachability/index.js.map +1 -1
- package/dist/reachability/request.js.map +1 -1
- package/dist/reactions/reactions.js.map +1 -1
- package/dist/reactions/reactions.type.js +3 -1
- package/dist/reactions/reactions.type.js.map +1 -1
- package/dist/reconnection-manager/index.js +4 -4
- package/dist/reconnection-manager/index.js.map +1 -1
- package/dist/roap/index.js +5 -5
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/statsAnalyzer/global.js.map +1 -1
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
- package/dist/transcription/index.js +4 -1
- package/dist/transcription/index.js.map +1 -1
- package/internal-README.md +7 -6
- package/package.json +18 -18
- package/src/common/browser-detection.ts +9 -6
- package/src/common/collection.ts +3 -1
- package/src/common/errors/captcha-error.ts +6 -6
- package/src/common/errors/intent-to-join.ts +6 -6
- package/src/common/errors/join-meeting.ts +12 -8
- package/src/common/errors/media.ts +6 -6
- package/src/common/errors/parameter.ts +9 -6
- package/src/common/errors/password-error.ts +6 -6
- package/src/common/errors/permission.ts +5 -5
- package/src/common/errors/reconnection.ts +6 -6
- package/src/common/errors/stats.ts +6 -6
- package/src/common/errors/webex-errors.ts +7 -5
- package/src/common/errors/webex-meetings-error.ts +1 -1
- package/src/common/events/events-scope.ts +5 -1
- package/src/common/events/events.ts +5 -1
- package/src/common/events/trigger-proxy.ts +8 -3
- package/src/common/events/util.ts +1 -2
- package/src/common/logs/logger-proxy.ts +21 -10
- package/src/common/logs/request.ts +11 -8
- package/src/config.ts +11 -11
- package/src/constants.ts +1 -1
- package/src/index.js +1 -1
- package/src/locus-info/controlsUtils.ts +34 -24
- package/src/locus-info/fullState.ts +15 -11
- package/src/locus-info/hostUtils.ts +4 -3
- package/src/locus-info/index.ts +25 -34
- package/src/locus-info/infoUtils.ts +12 -4
- package/src/locus-info/mediaSharesUtils.ts +4 -4
- package/src/locus-info/parser.ts +45 -68
- package/src/locus-info/selfUtils.ts +106 -57
- package/src/media/index.ts +123 -135
- package/src/media/internal-media-core-wrapper.ts +2 -2
- package/src/media/properties.ts +30 -20
- package/src/media/util.ts +1 -1
- package/src/mediaQualityMetrics/config.ts +46 -46
- package/src/meeting/effectsState.ts +35 -35
- package/src/meeting/in-meeting-actions.ts +7 -3
- package/src/meeting/index.ts +1576 -1291
- package/src/meeting/muteState.ts +62 -31
- package/src/meeting/request.ts +174 -113
- package/src/meeting/request.type.ts +11 -0
- package/src/meeting/state.ts +45 -30
- package/src/meeting/util.ts +101 -70
- package/src/meeting-info/collection.ts +2 -1
- package/src/meeting-info/index.ts +32 -30
- package/src/meeting-info/meeting-info-v2.ts +106 -108
- package/src/meeting-info/request.ts +9 -3
- package/src/meeting-info/util.ts +54 -46
- package/src/meeting-info/utilv2.ts +59 -53
- package/src/meetings/collection.ts +1 -1
- package/src/meetings/index.ts +512 -440
- package/src/meetings/request.ts +26 -24
- package/src/meetings/util.ts +29 -29
- package/src/member/index.ts +55 -49
- package/src/member/util.ts +26 -13
- package/src/members/collection.ts +0 -1
- package/src/members/index.ts +182 -126
- package/src/members/request.ts +46 -14
- package/src/members/util.ts +44 -42
- package/src/metrics/config.ts +254 -81
- package/src/metrics/constants.ts +0 -2
- package/src/metrics/index.ts +84 -71
- package/src/multistream/multistreamMedia.ts +1 -0
- package/src/multistream/receiveSlot.ts +1 -0
- package/src/multistream/receiveSlotManager.ts +1 -0
- package/src/multistream/remoteMedia.ts +1 -1
- package/src/multistream/remoteMediaGroup.ts +2 -1
- package/src/multistream/remoteMediaManager.ts +3 -0
- package/src/networkQualityMonitor/index.ts +20 -23
- package/src/personal-meeting-room/index.ts +12 -16
- package/src/personal-meeting-room/request.ts +10 -3
- package/src/personal-meeting-room/util.ts +3 -3
- package/src/reachability/index.ts +61 -59
- package/src/reachability/request.ts +36 -32
- package/src/reactions/reactions.ts +4 -4
- package/src/reactions/reactions.type.ts +4 -3
- package/src/reconnection-manager/index.ts +139 -84
- package/src/roap/index.ts +46 -38
- package/src/roap/request.ts +44 -31
- package/src/roap/turnDiscovery.ts +59 -30
- package/src/statsAnalyzer/global.ts +30 -33
- package/src/statsAnalyzer/index.ts +432 -175
- package/src/statsAnalyzer/mqaUtil.ts +178 -72
- package/src/transcription/index.ts +34 -32
- package/test/integration/spec/journey.js +663 -462
- package/test/integration/spec/space-meeting.js +318 -203
- package/test/integration/spec/transcription.js +6 -7
- package/test/unit/spec/common/browser-detection.js +9 -28
- package/test/unit/spec/fixture/locus.js +92 -90
- package/test/unit/spec/locus-info/controlsUtils.js +5 -5
- package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
- package/test/unit/spec/locus-info/index.js +1 -2
- package/test/unit/spec/locus-info/infoUtils.js +26 -33
- package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
- package/test/unit/spec/locus-info/lib/SeqCmp.json +513 -685
- package/test/unit/spec/locus-info/parser.js +3 -9
- package/test/unit/spec/locus-info/selfConstant.js +72 -103
- package/test/unit/spec/locus-info/selfUtils.js +21 -12
- package/test/unit/spec/meeting/effectsState.js +36 -46
- package/test/unit/spec/meeting/in-meeting-actions.ts +2 -3
- package/test/unit/spec/meeting/index.js +1342 -684
- package/test/unit/spec/meeting/muteState.js +42 -33
- package/test/unit/spec/meeting/request.js +75 -45
- package/test/unit/spec/meeting/utils.js +78 -53
- package/test/unit/spec/meeting-info/meetinginfov2.js +100 -73
- package/test/unit/spec/meeting-info/request.js +7 -9
- package/test/unit/spec/meeting-info/util.js +11 -12
- package/test/unit/spec/meeting-info/utilv2.js +110 -74
- package/test/unit/spec/meetings/collection.js +1 -1
- package/test/unit/spec/meetings/index.js +438 -257
- package/test/unit/spec/meetings/utils.js +14 -12
- package/test/unit/spec/member/index.js +0 -1
- package/test/unit/spec/member/util.js +5 -6
- package/test/unit/spec/members/index.js +104 -54
- package/test/unit/spec/members/request.js +29 -20
- package/test/unit/spec/members/utils.js +8 -5
- package/test/unit/spec/metrics/index.js +16 -21
- package/test/unit/spec/networkQualityMonitor/index.js +21 -15
- package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
- package/test/unit/spec/reachability/index.ts +9 -11
- package/test/unit/spec/reconnection-manager/index.js +16 -18
- package/test/unit/spec/roap/turnDiscovery.ts +22 -19
- package/test/unit/spec/stats-analyzer/index.js +25 -20
- package/test/utils/cmr.js +44 -42
- package/test/utils/testUtils.js +83 -74
- package/test/utils/webex-config.js +18 -18
- 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(
|
|
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(
|
|
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
|
|
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(
|
|
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(
|
|
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
|
-
|
|
289
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
324
|
-
|
|
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({
|
|
381
|
+
private async executeReconnection({networkDisconnect = false}: {networkDisconnect?: boolean}) {
|
|
365
382
|
this.status = RECONNECTION.STATE.IN_PROGRESS;
|
|
366
383
|
|
|
367
|
-
LoggerProxy.logger.info(
|
|
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(
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
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
|
|
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(
|
|
407
|
+
LoggerProxy.logger.info(
|
|
408
|
+
'ReconnectionManager:index#executeReconnection --> Updating meeting data from server.'
|
|
409
|
+
);
|
|
385
410
|
await this.webex.meetings.syncMeetings();
|
|
386
|
-
}
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
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(
|
|
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(
|
|
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
|
|
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(
|
|
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
|
-
|
|
420
|
-
|
|
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
|
|
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
|
|
468
|
+
async rejoinMeeting(wasSharing = false) {
|
|
435
469
|
try {
|
|
436
|
-
LoggerProxy.logger.info(
|
|
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(
|
|
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
|
-
|
|
469
|
-
|
|
470
|
-
|
|
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
|
-
|
|
487
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
529
|
-
|
|
530
|
-
|
|
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(
|
|
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(
|
|
587
|
+
LoggerProxy.logger.info(
|
|
588
|
+
'ReconnectionManager:index#reconnectMercuryWebSocket --> Connecting websocket.'
|
|
589
|
+
);
|
|
539
590
|
await this.webex.internal.mercury.connect();
|
|
540
|
-
LoggerProxy.logger.info(
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
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
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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(
|
|
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(
|
|
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
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
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(
|
|
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
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
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(
|
|
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.
|