@webex/plugin-meetings 3.0.0-beta.1 → 3.0.0-beta.10
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/dist/common/browser-detection.js.map +1 -1
- package/dist/common/collection.js.map +1 -1
- package/dist/common/config.js.map +1 -1
- package/dist/common/errors/captcha-error.js +7 -0
- package/dist/common/errors/captcha-error.js.map +1 -1
- package/dist/common/errors/intent-to-join.js +8 -0
- package/dist/common/errors/intent-to-join.js.map +1 -1
- package/dist/common/errors/join-meeting.js +8 -0
- package/dist/common/errors/join-meeting.js.map +1 -1
- package/dist/common/errors/media.js +7 -0
- package/dist/common/errors/media.js.map +1 -1
- package/dist/common/errors/parameter.js.map +1 -1
- package/dist/common/errors/password-error.js +7 -0
- package/dist/common/errors/password-error.js.map +1 -1
- package/dist/common/errors/permission.js +7 -0
- package/dist/common/errors/permission.js.map +1 -1
- package/dist/common/errors/reconnection-in-progress.js.map +1 -1
- package/dist/common/errors/reconnection.js +7 -0
- package/dist/common/errors/reconnection.js.map +1 -1
- package/dist/common/errors/stats.js +7 -0
- package/dist/common/errors/stats.js.map +1 -1
- package/dist/common/errors/webex-errors.js +5 -29
- package/dist/common/errors/webex-errors.js.map +1 -1
- package/dist/common/errors/webex-meetings-error.js +5 -2
- 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-config.js.map +1 -1
- package/dist/common/logs/logger-proxy.js.map +1 -1
- package/dist/common/logs/request.js +3 -0
- package/dist/common/logs/request.js.map +1 -1
- package/dist/common/queue.js.map +1 -1
- package/dist/config.js +1 -0
- package/dist/config.js.map +1 -1
- package/dist/constants.js +15 -74
- package/dist/constants.js.map +1 -1
- package/dist/locus-info/controlsUtils.js.map +1 -1
- package/dist/locus-info/embeddedAppsUtils.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 +43 -5
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/infoUtils.js +4 -0
- package/dist/locus-info/infoUtils.js.map +1 -1
- package/dist/locus-info/mediaSharesUtils.js.map +1 -1
- package/dist/locus-info/parser.js +12 -3
- package/dist/locus-info/parser.js.map +1 -1
- package/dist/locus-info/selfUtils.js.map +1 -1
- package/dist/media/index.js +71 -210
- package/dist/media/index.js.map +1 -1
- package/dist/media/internal-media-core-wrapper.js +22 -0
- package/dist/media/internal-media-core-wrapper.js.map +1 -0
- package/dist/media/properties.js +32 -25
- package/dist/media/properties.js.map +1 -1
- package/dist/media/util.js +0 -27
- package/dist/media/util.js.map +1 -1
- package/dist/mediaQualityMetrics/config.js.map +1 -1
- package/dist/meeting/effectsState.js +8 -1
- package/dist/meeting/effectsState.js.map +1 -1
- package/dist/meeting/index.js +1116 -613
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/muteState.js +6 -0
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.js +55 -24
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/state.js.map +1 -1
- package/dist/meeting/util.js +5 -44
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/collection.js +4 -1
- package/dist/meeting-info/collection.js.map +1 -1
- package/dist/meeting-info/index.js +5 -0
- package/dist/meeting-info/index.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js +14 -2
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meeting-info/request.js +3 -0
- package/dist/meeting-info/request.js.map +1 -1
- package/dist/meeting-info/util.js.map +1 -1
- package/dist/meeting-info/utilv2.js.map +1 -1
- package/dist/meetings/collection.js +4 -1
- package/dist/meetings/collection.js.map +1 -1
- package/dist/meetings/index.js +136 -25
- package/dist/meetings/index.js.map +1 -1
- package/dist/meetings/request.js +4 -0
- package/dist/meetings/request.js.map +1 -1
- package/dist/meetings/util.js +24 -1
- package/dist/meetings/util.js.map +1 -1
- package/dist/member/index.js +30 -7
- package/dist/member/index.js.map +1 -1
- package/dist/member/util.js +2 -1
- package/dist/member/util.js.map +1 -1
- package/dist/members/collection.js +1 -0
- package/dist/members/collection.js.map +1 -1
- package/dist/members/index.js +82 -1
- package/dist/members/index.js.map +1 -1
- package/dist/members/request.js +19 -9
- 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 +8 -0
- package/dist/metrics/index.js.map +1 -1
- package/dist/multistream/mediaRequestManager.js +133 -0
- package/dist/multistream/mediaRequestManager.js.map +1 -0
- package/dist/multistream/multistreamMedia.js +116 -0
- package/dist/multistream/multistreamMedia.js.map +1 -0
- package/dist/multistream/receiveSlot.js +209 -0
- package/dist/multistream/receiveSlot.js.map +1 -0
- package/dist/multistream/receiveSlotManager.js +195 -0
- package/dist/multistream/receiveSlotManager.js.map +1 -0
- package/dist/multistream/remoteMedia.js +289 -0
- package/dist/multistream/remoteMedia.js.map +1 -0
- package/dist/multistream/remoteMediaGroup.js +243 -0
- package/dist/multistream/remoteMediaGroup.js.map +1 -0
- package/dist/multistream/remoteMediaManager.js +1113 -0
- package/dist/multistream/remoteMediaManager.js.map +1 -0
- package/dist/networkQualityMonitor/index.js +10 -2
- package/dist/networkQualityMonitor/index.js.map +1 -1
- package/dist/personal-meeting-room/index.js +11 -0
- package/dist/personal-meeting-room/index.js.map +1 -1
- package/dist/personal-meeting-room/request.js +2 -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 +17 -7
- package/dist/reachability/index.js.map +1 -1
- package/dist/reachability/request.js +1 -0
- package/dist/reachability/request.js.map +1 -1
- package/dist/reconnection-manager/index.js +130 -132
- package/dist/reconnection-manager/index.js.map +1 -1
- package/dist/roap/index.js +58 -231
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.js +7 -116
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/turnDiscovery.js +20 -6
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/statsAnalyzer/global.js +2 -0
- package/dist/statsAnalyzer/global.js.map +1 -1
- package/dist/statsAnalyzer/index.js +58 -37
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.js +9 -3
- package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
- package/dist/transcription/index.js +10 -3
- package/dist/transcription/index.js.map +1 -1
- package/package.json +21 -20
- package/src/common/{browser-detection.js → browser-detection.ts} +1 -1
- package/src/common/collection.ts +6 -6
- package/src/common/{config.js → config.ts} +1 -1
- package/src/common/errors/{captcha-error.js → captcha-error.ts} +5 -1
- package/src/common/errors/{intent-to-join.js → intent-to-join.ts} +6 -1
- package/src/common/errors/{join-meeting.js → join-meeting.ts} +6 -1
- package/src/common/errors/{media.js → media.ts} +5 -1
- package/src/common/errors/parameter.ts +3 -2
- package/src/common/errors/{password-error.js → password-error.ts} +5 -1
- package/src/common/errors/{permission.js → permission.ts} +5 -1
- package/src/common/errors/{reconnection-in-progress.js → reconnection-in-progress.ts} +0 -0
- package/src/common/errors/{reconnection.js → reconnection.ts} +5 -1
- package/src/common/errors/{stats.js → stats.ts} +5 -1
- package/src/common/errors/{webex-errors.js → webex-errors.ts} +1 -20
- package/src/common/errors/{webex-meetings-error.js → webex-meetings-error.ts} +3 -1
- package/src/common/events/{events-scope.js → events-scope.ts} +1 -1
- package/src/common/events/{events.js → events.ts} +0 -0
- package/src/common/events/{trigger-proxy.js → trigger-proxy.ts} +1 -2
- package/src/common/events/{util.js → util.ts} +1 -1
- package/src/common/logs/{logger-config.js → logger-config.ts} +1 -2
- package/src/common/logs/{logger-proxy.js → logger-proxy.ts} +1 -1
- package/src/common/logs/{request.js → request.ts} +12 -2
- package/src/common/queue.ts +1 -2
- package/src/{config.js → config.ts} +2 -0
- package/src/constants.ts +139 -179
- package/src/locus-info/{controlsUtils.js → controlsUtils.ts} +4 -4
- package/src/locus-info/{embeddedAppsUtils.js → embeddedAppsUtils.ts} +5 -6
- package/src/locus-info/{fullState.js → fullState.ts} +1 -1
- package/src/locus-info/{hostUtils.js → hostUtils.ts} +5 -5
- package/src/locus-info/{index.js → index.ts} +67 -32
- package/src/locus-info/{infoUtils.js → infoUtils.ts} +7 -4
- package/src/locus-info/{mediaSharesUtils.js → mediaSharesUtils.ts} +13 -13
- package/src/locus-info/{parser.js → parser.ts} +22 -12
- package/src/locus-info/{selfUtils.js → selfUtils.ts} +17 -19
- package/src/media/{index.js → index.ts} +130 -205
- package/src/media/internal-media-core-wrapper.ts +9 -0
- package/src/media/{properties.js → properties.ts} +35 -29
- package/src/media/util.ts +16 -0
- package/src/mediaQualityMetrics/{config.js → config.ts} +1 -1
- package/src/meeting/{effectsState.js → effectsState.ts} +12 -6
- package/src/meeting/{index.js → index.ts} +961 -474
- package/src/meeting/{muteState.js → muteState.ts} +16 -11
- package/src/meeting/{request.js → request.ts} +125 -36
- package/src/meeting/{state.js → state.ts} +6 -6
- package/src/meeting/{util.js → util.ts} +9 -51
- package/src/meeting-info/{collection.js → collection.ts} +4 -1
- package/src/meeting-info/{index.js → index.ts} +10 -6
- package/src/meeting-info/{meeting-info-v2.js → meeting-info-v2.ts} +28 -10
- package/src/meeting-info/{request.js → request.ts} +6 -2
- package/src/meeting-info/{util.js → util.ts} +6 -5
- package/src/meeting-info/{utilv2.js → utilv2.ts} +8 -7
- package/src/meetings/{collection.js → collection.ts} +5 -2
- package/src/meetings/{index.js → index.ts} +118 -22
- package/src/meetings/{request.js → request.ts} +6 -1
- package/src/meetings/{util.js → util.ts} +28 -5
- package/src/member/{index.js → index.ts} +46 -15
- package/src/member/{util.js → util.ts} +17 -16
- package/src/members/{collection.js → collection.ts} +2 -1
- package/src/members/{index.js → index.ts} +94 -26
- package/src/members/{request.js → request.ts} +16 -5
- package/src/members/{util.js → util.ts} +7 -7
- package/src/metrics/{config.js → config.ts} +0 -2
- package/src/metrics/{constants.js → constants.ts} +0 -0
- package/src/metrics/{index.js → index.ts} +27 -8
- package/src/multistream/mediaRequestManager.ts +166 -0
- package/src/multistream/multistreamMedia.ts +92 -0
- package/src/multistream/receiveSlot.ts +141 -0
- package/src/multistream/receiveSlotManager.ts +142 -0
- package/src/multistream/remoteMedia.ts +228 -0
- package/src/multistream/remoteMediaGroup.ts +224 -0
- package/src/multistream/remoteMediaManager.ts +911 -0
- package/src/networkQualityMonitor/{index.js → index.ts} +18 -3
- package/src/personal-meeting-room/{index.js → index.ts} +17 -4
- package/src/personal-meeting-room/{request.js → request.ts} +3 -1
- package/src/personal-meeting-room/{util.js → util.ts} +1 -1
- package/src/reachability/{index.js → index.ts} +28 -17
- package/src/reachability/request.ts +4 -2
- package/src/reconnection-manager/{index.js → index.ts} +81 -65
- package/src/roap/index.ts +229 -0
- package/src/roap/{request.js → request.ts} +15 -74
- package/src/roap/turnDiscovery.ts +26 -11
- package/src/statsAnalyzer/{global.js → global.ts} +2 -0
- package/src/statsAnalyzer/{index.js → index.ts} +66 -61
- package/src/statsAnalyzer/{mqaUtil.js → mqaUtil.ts} +6 -1
- package/src/transcription/{index.js → index.ts} +16 -11
- package/test/integration/spec/journey.js +1 -1
- package/test/integration/spec/space-meeting.js +1 -2
- package/test/unit/spec/locus-info/infoUtils.js +17 -1
- package/test/unit/spec/media/index.ts +207 -0
- package/test/unit/spec/media/properties.ts +73 -82
- package/test/unit/spec/meeting/effectsState.js +1 -3
- package/test/unit/spec/meeting/index.js +585 -245
- package/test/unit/spec/meeting/muteState.js +7 -0
- package/test/unit/spec/meeting/utils.js +63 -2
- package/test/unit/spec/meetings/index.js +0 -4
- package/test/unit/spec/members/index.js +164 -2
- package/test/unit/spec/multistream/mediaRequestManager.ts +515 -0
- package/test/unit/spec/multistream/receiveSlot.ts +104 -0
- package/test/unit/spec/multistream/receiveSlotManager.ts +173 -0
- package/test/unit/spec/multistream/remoteMedia.ts +225 -0
- package/test/unit/spec/multistream/remoteMediaGroup.ts +396 -0
- package/test/unit/spec/multistream/remoteMediaManager.ts +1309 -0
- package/test/unit/spec/reconnection-manager/index.js +68 -2
- package/test/unit/spec/roap/index.ts +63 -35
- package/test/unit/spec/stats-analyzer/index.js +19 -22
- package/dist/peer-connection-manager/index.js +0 -794
- package/dist/peer-connection-manager/index.js.map +0 -1
- package/dist/peer-connection-manager/util.js +0 -124
- package/dist/peer-connection-manager/util.js.map +0 -1
- package/dist/roap/collection.js +0 -73
- package/dist/roap/collection.js.map +0 -1
- package/dist/roap/handler.js +0 -337
- package/dist/roap/handler.js.map +0 -1
- package/dist/roap/state.js +0 -164
- package/dist/roap/state.js.map +0 -1
- package/dist/roap/util.js +0 -102
- package/dist/roap/util.js.map +0 -1
- package/src/media/util.js +0 -38
- package/src/peer-connection-manager/index.js +0 -723
- package/src/peer-connection-manager/util.ts +0 -117
- package/src/roap/collection.js +0 -63
- package/src/roap/handler.js +0 -252
- package/src/roap/index.js +0 -380
- package/src/roap/state.js +0 -149
- package/src/roap/util.js +0 -93
- package/test/unit/spec/peerconnection-manager/index.js +0 -188
- package/test/unit/spec/peerconnection-manager/utils.js +0 -48
- package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -389
- package/test/unit/spec/roap/util.js +0 -30
|
@@ -18,6 +18,13 @@ import {EVENT_TRIGGERS, STATS} from '../constants';
|
|
|
18
18
|
* @extends {EventsScope}
|
|
19
19
|
*/
|
|
20
20
|
export default class NetworkQualityMonitor extends EventsScope {
|
|
21
|
+
config: any;
|
|
22
|
+
frequencyTypes: any;
|
|
23
|
+
indicatorTypes: any;
|
|
24
|
+
mediaType: any;
|
|
25
|
+
networkQualityScore: any;
|
|
26
|
+
networkQualityStatus: any;
|
|
27
|
+
|
|
21
28
|
/**
|
|
22
29
|
* Creates a new instance of NetworkQualityMonitor
|
|
23
30
|
* @constructor
|
|
@@ -29,7 +36,7 @@ export default class NetworkQualityMonitor extends EventsScope {
|
|
|
29
36
|
* @property {Object} networkQualityStatus - hash object based on indicatorTypes and frequencyTypes
|
|
30
37
|
* @property {string} mediaType - audio|video
|
|
31
38
|
*/
|
|
32
|
-
constructor(config) {
|
|
39
|
+
constructor(config: any) {
|
|
33
40
|
super();
|
|
34
41
|
this.config = config;
|
|
35
42
|
this.indicatorTypes = Object.freeze({
|
|
@@ -96,7 +103,15 @@ export default class NetworkQualityMonitor extends EventsScope {
|
|
|
96
103
|
* @public
|
|
97
104
|
* @memberof NetworkQualityMonitor
|
|
98
105
|
*/
|
|
99
|
-
determineUplinkNetworkQuality({
|
|
106
|
+
public determineUplinkNetworkQuality({
|
|
107
|
+
mediaType,
|
|
108
|
+
remoteRtpResults,
|
|
109
|
+
statsAnalyzerCurrentStats,
|
|
110
|
+
}: {
|
|
111
|
+
mediaType: string;
|
|
112
|
+
remoteRtpResults: any;
|
|
113
|
+
statsAnalyzerCurrentStats: object;
|
|
114
|
+
}) {
|
|
100
115
|
const roundTripTimeInMilliseconds = remoteRtpResults.roundTripTime * 1000;
|
|
101
116
|
const jitterInMilliseconds = remoteRtpResults.jitter * 1000;
|
|
102
117
|
const {currentPacketLossRatio} = statsAnalyzerCurrentStats[mediaType].send;
|
|
@@ -157,7 +172,7 @@ export default class NetworkQualityMonitor extends EventsScope {
|
|
|
157
172
|
* @param {(number|undefined)} value
|
|
158
173
|
* @returns {(number|null)}
|
|
159
174
|
*/
|
|
160
|
-
const determineIfUndefined = (value) => (typeof value === 'undefined' ? null : value);
|
|
175
|
+
const determineIfUndefined = (value: number | undefined) => (typeof value === 'undefined' ? null : value);
|
|
161
176
|
|
|
162
177
|
/**
|
|
163
178
|
* Values for some browsers specifically Safari will be undefined we explicitly set to null
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
// @ts-ignore
|
|
1
2
|
import {StatelessWebexPlugin} from '@webex/webex-core';
|
|
2
3
|
|
|
3
4
|
import {MEETINGS, _PERSONAL_ROOM_} from '../constants';
|
|
@@ -10,6 +11,16 @@ import PersonalMeetingRoomRequest from './request';
|
|
|
10
11
|
* @class PersonalMeetingRoom
|
|
11
12
|
*/
|
|
12
13
|
export default class PersonalMeetingRoom extends StatelessWebexPlugin {
|
|
14
|
+
link: any;
|
|
15
|
+
meetingInfo: any;
|
|
16
|
+
name: any;
|
|
17
|
+
personalMeetingRoomRequest: any;
|
|
18
|
+
pmr: any;
|
|
19
|
+
sipUri: any;
|
|
20
|
+
userId: any;
|
|
21
|
+
meetingLink: any;
|
|
22
|
+
number: any;
|
|
23
|
+
|
|
13
24
|
namespace = MEETINGS;
|
|
14
25
|
|
|
15
26
|
/**
|
|
@@ -17,7 +28,7 @@ export default class PersonalMeetingRoom extends StatelessWebexPlugin {
|
|
|
17
28
|
* @param {Object} attrs
|
|
18
29
|
* @param {Object} options
|
|
19
30
|
*/
|
|
20
|
-
constructor(attrs, options) {
|
|
31
|
+
constructor(attrs: any, options: any) {
|
|
21
32
|
super({}, options);
|
|
22
33
|
/**
|
|
23
34
|
* The pmr server object
|
|
@@ -74,6 +85,7 @@ export default class PersonalMeetingRoom extends StatelessWebexPlugin {
|
|
|
74
85
|
* @private
|
|
75
86
|
* @memberof PersonalMeetingRoom
|
|
76
87
|
*/
|
|
88
|
+
// @ts-ignore
|
|
77
89
|
this.personalMeetingRoomRequest = new PersonalMeetingRoomRequest({}, options);
|
|
78
90
|
}
|
|
79
91
|
|
|
@@ -86,8 +98,9 @@ export default class PersonalMeetingRoom extends StatelessWebexPlugin {
|
|
|
86
98
|
* @public
|
|
87
99
|
* @memberof PersonalMeetingRoom
|
|
88
100
|
*/
|
|
89
|
-
claim(link, pin, preferred = true) {
|
|
101
|
+
public claim(link: string, pin: string, preferred: boolean = true) {
|
|
90
102
|
const options = {
|
|
103
|
+
// @ts-ignore
|
|
91
104
|
userId: this.webex.internal.device.userId,
|
|
92
105
|
passcode: pin,
|
|
93
106
|
meetingAddress: link,
|
|
@@ -112,7 +125,7 @@ export default class PersonalMeetingRoom extends StatelessWebexPlugin {
|
|
|
112
125
|
* @private
|
|
113
126
|
* @memberof PersonalMeetingRoom
|
|
114
127
|
*/
|
|
115
|
-
set(body) {
|
|
128
|
+
private set(body: any) {
|
|
116
129
|
this.pmr = body;
|
|
117
130
|
this.sipUri = body.sipMeetingUri;
|
|
118
131
|
this.meetingLink = body.webExMeetingLink || body.meetingLink;
|
|
@@ -128,7 +141,7 @@ export default class PersonalMeetingRoom extends StatelessWebexPlugin {
|
|
|
128
141
|
* @public
|
|
129
142
|
* @memberof PersonalMeetingRoom
|
|
130
143
|
*/
|
|
131
|
-
get() {
|
|
144
|
+
public get() {
|
|
132
145
|
const options = {
|
|
133
146
|
type: _PERSONAL_ROOM_
|
|
134
147
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
// @ts-ignore
|
|
1
2
|
import {StatelessWebexPlugin} from '@webex/webex-core';
|
|
2
3
|
|
|
3
4
|
import {MEETINGS} from '../constants';
|
|
@@ -18,7 +19,7 @@ export default class PersonalMeetingRoomRequest extends StatelessWebexPlugin {
|
|
|
18
19
|
* @returns {Promise} returns a promise that resolves/rejects the result of the request
|
|
19
20
|
* @memberof PersonalMeetingRoomRequest
|
|
20
21
|
*/
|
|
21
|
-
claimPmr(options) {
|
|
22
|
+
claimPmr(options: any) {
|
|
22
23
|
if (!options || !options.userId || !options.passcode || !options.meetingAddress || !options.preferred) {
|
|
23
24
|
throw new ParameterError('Claiming a PMR should be done with userId, passcode, preferred, and meetingAddress in options.');
|
|
24
25
|
}
|
|
@@ -34,6 +35,7 @@ export default class PersonalMeetingRoomRequest extends StatelessWebexPlugin {
|
|
|
34
35
|
}
|
|
35
36
|
const request = PersonalMeetingRoomUtil.getClaimedRequestParams(validLink, validPin, options);
|
|
36
37
|
|
|
38
|
+
// @ts-ignore
|
|
37
39
|
return this.request(request);
|
|
38
40
|
}
|
|
39
41
|
}
|
|
@@ -23,12 +23,16 @@ const VIDEO_MESH_TIMEOUT = 1000;
|
|
|
23
23
|
* @export
|
|
24
24
|
*/
|
|
25
25
|
export default class Reachability {
|
|
26
|
+
webex: object;
|
|
27
|
+
reachabilityRequest: any;
|
|
28
|
+
clusterLatencyResults: any;
|
|
29
|
+
|
|
26
30
|
/**
|
|
27
31
|
* Creates an instance of Reachability.
|
|
28
32
|
* @param {object} webex
|
|
29
33
|
* @memberof Reachability
|
|
30
34
|
*/
|
|
31
|
-
constructor(webex) {
|
|
35
|
+
constructor(webex: object) {
|
|
32
36
|
this.webex = webex;
|
|
33
37
|
|
|
34
38
|
/**
|
|
@@ -58,7 +62,7 @@ export default class Reachability {
|
|
|
58
62
|
* @async
|
|
59
63
|
* @memberof Reachability
|
|
60
64
|
*/
|
|
61
|
-
async gatherReachability() {
|
|
65
|
+
public async gatherReachability() {
|
|
62
66
|
this.setup();
|
|
63
67
|
|
|
64
68
|
// Remove stored reachability results to ensure no stale data
|
|
@@ -105,7 +109,7 @@ export default class Reachability {
|
|
|
105
109
|
try {
|
|
106
110
|
const reachabilityResults = JSON.parse(reachabilityData);
|
|
107
111
|
|
|
108
|
-
reachable = Object.values(reachabilityResults).some((result) => result.udp?.reachable === 'true' || result.tcp?.reachable === 'true');
|
|
112
|
+
reachable = Object.values(reachabilityResults).some((result: any) => result.udp?.reachable === 'true' || result.tcp?.reachable === 'true');
|
|
109
113
|
}
|
|
110
114
|
catch (e) {
|
|
111
115
|
LoggerProxy.logger.error(`Roap:request#attachReachabilityData --> Error in parsing reachability data: ${e}`);
|
|
@@ -123,7 +127,7 @@ export default class Reachability {
|
|
|
123
127
|
* @private
|
|
124
128
|
* @memberof Reachability
|
|
125
129
|
*/
|
|
126
|
-
buildPeerConnectionConfig(cluster) {
|
|
130
|
+
private buildPeerConnectionConfig(cluster: any) {
|
|
127
131
|
const iceServers = _.uniq([
|
|
128
132
|
...cluster.udp,
|
|
129
133
|
...cluster.tcp
|
|
@@ -150,12 +154,13 @@ export default class Reachability {
|
|
|
150
154
|
* @private
|
|
151
155
|
* @memberof Reachability
|
|
152
156
|
*/
|
|
153
|
-
createPeerConnection(cluster) {
|
|
157
|
+
private createPeerConnection(cluster: any) {
|
|
154
158
|
const {key, config} = cluster;
|
|
155
159
|
|
|
156
160
|
try {
|
|
157
161
|
const peerConnection = new window.RTCPeerConnection(config);
|
|
158
162
|
|
|
163
|
+
// @ts-ignore
|
|
159
164
|
peerConnection.key = key;
|
|
160
165
|
|
|
161
166
|
return peerConnection;
|
|
@@ -175,7 +180,7 @@ export default class Reachability {
|
|
|
175
180
|
* @private
|
|
176
181
|
* @memberof Reachability
|
|
177
182
|
*/
|
|
178
|
-
getElapsedTime(peerConnection) {
|
|
183
|
+
private getElapsedTime(peerConnection: any) {
|
|
179
184
|
const startTime = peerConnection.begin;
|
|
180
185
|
|
|
181
186
|
delete peerConnection.begin;
|
|
@@ -191,8 +196,8 @@ export default class Reachability {
|
|
|
191
196
|
* @private
|
|
192
197
|
* @memberof Reachability
|
|
193
198
|
*/
|
|
194
|
-
getLocalSDPForClusters(clusterList) {
|
|
195
|
-
let clusters = [...Object.keys(clusterList)];
|
|
199
|
+
private getLocalSDPForClusters(clusterList: object) {
|
|
200
|
+
let clusters: any[] = [...Object.keys(clusterList)];
|
|
196
201
|
|
|
197
202
|
clusters = clusters.map(async (key) => {
|
|
198
203
|
const cluster = clusterList[key];
|
|
@@ -200,6 +205,7 @@ export default class Reachability {
|
|
|
200
205
|
const peerConnection = this.createPeerConnection({key, config});
|
|
201
206
|
const description = await peerConnection.createOffer({offerToReceiveAudio: true});
|
|
202
207
|
|
|
208
|
+
// @ts-ignore
|
|
203
209
|
peerConnection.begin = Date.now();
|
|
204
210
|
peerConnection.setLocalDescription(description);
|
|
205
211
|
|
|
@@ -226,7 +232,7 @@ export default class Reachability {
|
|
|
226
232
|
* @private
|
|
227
233
|
* @memberof Reachability
|
|
228
234
|
*/
|
|
229
|
-
getUnreachablClusters() {
|
|
235
|
+
private getUnreachablClusters() {
|
|
230
236
|
const unreachableList = [];
|
|
231
237
|
const clusters = this.clusterLatencyResults;
|
|
232
238
|
|
|
@@ -250,13 +256,14 @@ export default class Reachability {
|
|
|
250
256
|
* @private
|
|
251
257
|
* @memberof Reachability
|
|
252
258
|
*/
|
|
253
|
-
handleIceGatheringStateChange(peerConnection) {
|
|
259
|
+
private handleIceGatheringStateChange(peerConnection: RTCPeerConnection) {
|
|
254
260
|
peerConnection.onicegatheringstatechange = () => {
|
|
255
261
|
const {COMPLETE} = ICE_GATHERING_STATE;
|
|
256
262
|
|
|
257
263
|
if (peerConnection.iceConnectionState === COMPLETE) {
|
|
258
264
|
const elapsed = this.getElapsedTime(peerConnection);
|
|
259
265
|
|
|
266
|
+
// @ts-ignore
|
|
260
267
|
LoggerProxy.logger.log(`Reachability:index#onIceGatheringStateChange --> Successfully pinged ${peerConnection.key}:`, elapsed);
|
|
261
268
|
this.setLatencyAndClose(peerConnection, elapsed);
|
|
262
269
|
}
|
|
@@ -272,13 +279,14 @@ export default class Reachability {
|
|
|
272
279
|
* @private
|
|
273
280
|
* @memberof Reachability
|
|
274
281
|
*/
|
|
275
|
-
handleOnIceCandidate(peerConnection) {
|
|
282
|
+
private handleOnIceCandidate(peerConnection: RTCPeerConnection) {
|
|
276
283
|
peerConnection.onicecandidate = (e) => {
|
|
277
284
|
const SERVER_REFLEXIVE = 'srflx';
|
|
278
285
|
|
|
279
286
|
if (e.candidate && String(e.candidate.type).toLowerCase() === SERVER_REFLEXIVE) {
|
|
280
287
|
const elapsed = this.getElapsedTime(peerConnection);
|
|
281
288
|
|
|
289
|
+
// @ts-ignore
|
|
282
290
|
LoggerProxy.logger.log(`Reachability:index#onIceCandidate --> Successfully pinged ${peerConnection.key}:`, elapsed);
|
|
283
291
|
this.setLatencyAndClose(peerConnection, elapsed);
|
|
284
292
|
}
|
|
@@ -294,7 +302,7 @@ export default class Reachability {
|
|
|
294
302
|
* @param {number} timeout
|
|
295
303
|
* @returns {Promise}
|
|
296
304
|
*/
|
|
297
|
-
iceGatheringState(peerConnection, timeout) {
|
|
305
|
+
private iceGatheringState(peerConnection: RTCPeerConnection, timeout: number) {
|
|
298
306
|
const ELAPSED = 'elapsed';
|
|
299
307
|
|
|
300
308
|
return new Promise((resolve) => {
|
|
@@ -311,6 +319,7 @@ export default class Reachability {
|
|
|
311
319
|
set: (target, property, value) => {
|
|
312
320
|
// only intercept elapsed property
|
|
313
321
|
if (property === ELAPSED) {
|
|
322
|
+
// @ts-ignore
|
|
314
323
|
resolve({clusterId: peerConnection.key, elapsed: value});
|
|
315
324
|
|
|
316
325
|
return true;
|
|
@@ -345,7 +354,7 @@ export default class Reachability {
|
|
|
345
354
|
* @private
|
|
346
355
|
* @memberof Reachability
|
|
347
356
|
*/
|
|
348
|
-
logUnreachableClusters() {
|
|
357
|
+
private logUnreachableClusters() {
|
|
349
358
|
const list = this.getUnreachablClusters();
|
|
350
359
|
|
|
351
360
|
list.forEach((cluster) => {
|
|
@@ -361,7 +370,7 @@ export default class Reachability {
|
|
|
361
370
|
* @private
|
|
362
371
|
* @memberof Reachability
|
|
363
372
|
*/
|
|
364
|
-
parseIceResultsToReachabilityResults(iceResults) {
|
|
373
|
+
private parseIceResultsToReachabilityResults(iceResults: Array<any>) {
|
|
365
374
|
const reachabilityMap = {};
|
|
366
375
|
|
|
367
376
|
iceResults.forEach(({clusterId, elapsed}) => {
|
|
@@ -394,7 +403,7 @@ export default class Reachability {
|
|
|
394
403
|
* @private
|
|
395
404
|
* @memberof Reachability
|
|
396
405
|
*/
|
|
397
|
-
performReachabilityCheck(clusterList) {
|
|
406
|
+
private performReachabilityCheck(clusterList: object) {
|
|
398
407
|
if (!clusterList || !Object.keys(clusterList).length) {
|
|
399
408
|
return Promise.resolve({});
|
|
400
409
|
}
|
|
@@ -427,10 +436,11 @@ export default class Reachability {
|
|
|
427
436
|
* @private
|
|
428
437
|
* @memberof Reachability
|
|
429
438
|
*/
|
|
430
|
-
setLatencyAndClose(peerConnection, elapsed) {
|
|
439
|
+
private setLatencyAndClose(peerConnection: RTCPeerConnection, elapsed: number) {
|
|
431
440
|
const REACHABLE = 'reachable';
|
|
432
441
|
const UNREACHABLE = 'unreachable';
|
|
433
442
|
const {CLOSED} = CONNECTION_STATE;
|
|
443
|
+
// @ts-ignore
|
|
434
444
|
const {key} = peerConnection;
|
|
435
445
|
const resultKey = elapsed === null ? UNREACHABLE : REACHABLE;
|
|
436
446
|
const intialState = {[REACHABLE]: 0, [UNREACHABLE]: 0};
|
|
@@ -448,6 +458,7 @@ export default class Reachability {
|
|
|
448
458
|
// an event other than onIceCandidate
|
|
449
459
|
peerConnection.onicecandidate = null;
|
|
450
460
|
peerConnection.close();
|
|
461
|
+
// @ts-ignore
|
|
451
462
|
peerConnection.elapsed = elapsed;
|
|
452
463
|
}
|
|
453
464
|
|
|
@@ -458,7 +469,7 @@ export default class Reachability {
|
|
|
458
469
|
* @private
|
|
459
470
|
* @memberof Reachability
|
|
460
471
|
*/
|
|
461
|
-
setup() {
|
|
472
|
+
private setup() {
|
|
462
473
|
this.clusterLatencyResults = {};
|
|
463
474
|
}
|
|
464
475
|
}
|
|
@@ -20,12 +20,14 @@ export type ClusterList = {
|
|
|
20
20
|
* @class ReachabilityRequest
|
|
21
21
|
*/
|
|
22
22
|
class ReachabilityRequest {
|
|
23
|
+
webex: any;
|
|
24
|
+
|
|
23
25
|
/**
|
|
24
26
|
* Creates an instance of ReachabilityRequest.
|
|
25
27
|
* @param {object} webex
|
|
26
28
|
* @memberof ReachabilityRequest
|
|
27
29
|
*/
|
|
28
|
-
constructor(webex) {
|
|
30
|
+
constructor(webex: object) {
|
|
29
31
|
this.webex = webex;
|
|
30
32
|
}
|
|
31
33
|
|
|
@@ -58,7 +60,7 @@ class ReachabilityRequest {
|
|
|
58
60
|
* @param {Object} localSDPList localSDPs for the cluster
|
|
59
61
|
* @returns {Object}
|
|
60
62
|
*/
|
|
61
|
-
remoteSDPForClusters = (localSDPList) => this.webex.request({
|
|
63
|
+
remoteSDPForClusters = (localSDPList: object) => this.webex.request({
|
|
62
64
|
method: HTTP_VERBS.POST,
|
|
63
65
|
shouldRefreshAccessToken: false,
|
|
64
66
|
api: API.CALLIOPEDISCOVERY,
|
|
@@ -18,11 +18,10 @@ import {
|
|
|
18
18
|
import BEHAVIORAL_METRICS from '../metrics/constants';
|
|
19
19
|
import ReconnectionError from '../common/errors/reconnection';
|
|
20
20
|
import ReconnectInProgress from '../common/errors/reconnection-in-progress';
|
|
21
|
-
import PeerConnectionManager from '../peer-connection-manager';
|
|
22
21
|
import {eventType, reconnection, errorObjects} from '../metrics/config';
|
|
23
22
|
import Media from '../media';
|
|
24
23
|
import Metrics from '../metrics';
|
|
25
|
-
import
|
|
24
|
+
import Meeting from '../meeting';
|
|
26
25
|
|
|
27
26
|
/**
|
|
28
27
|
* Used to indicate that the reconnect logic needs to be retried.
|
|
@@ -39,6 +38,8 @@ class NeedsRetryError extends Error {}
|
|
|
39
38
|
* @extends {Error}
|
|
40
39
|
*/
|
|
41
40
|
class NeedsRejoinError extends Error {
|
|
41
|
+
wasSharing: any;
|
|
42
|
+
|
|
42
43
|
/**
|
|
43
44
|
* Creates an instance of NeedsRejoinError.
|
|
44
45
|
* @param {Object} params
|
|
@@ -46,7 +47,14 @@ class NeedsRejoinError extends Error {
|
|
|
46
47
|
* @param {Error} params.error
|
|
47
48
|
* @memberof NeedsRejoinError
|
|
48
49
|
*/
|
|
49
|
-
constructor({
|
|
50
|
+
constructor({
|
|
51
|
+
wasSharing,
|
|
52
|
+
error = new Error('Meeting needs to be rejoined'),
|
|
53
|
+
}: {
|
|
54
|
+
wasSharing?: boolean;
|
|
55
|
+
error?: Error;
|
|
56
|
+
}) {
|
|
57
|
+
// @ts-ignore
|
|
50
58
|
super(error);
|
|
51
59
|
|
|
52
60
|
this.wasSharing = wasSharing;
|
|
@@ -58,10 +66,19 @@ class NeedsRejoinError extends Error {
|
|
|
58
66
|
* @class ReconnectionManager
|
|
59
67
|
*/
|
|
60
68
|
export default class ReconnectionManager {
|
|
69
|
+
autoRejoinEnabled: any;
|
|
70
|
+
iceState: any;
|
|
71
|
+
maxRejoinAttempts: any;
|
|
72
|
+
meeting: any;
|
|
73
|
+
rejoinAttempts: any;
|
|
74
|
+
shareStatus: any;
|
|
75
|
+
status: any;
|
|
76
|
+
tryCount: any;
|
|
77
|
+
webex: any;
|
|
61
78
|
/**
|
|
62
79
|
* @param {Meeting} meeting
|
|
63
80
|
*/
|
|
64
|
-
constructor(meeting) {
|
|
81
|
+
constructor(meeting: Meeting) {
|
|
65
82
|
/**
|
|
66
83
|
* Stores ICE reconnection state data.
|
|
67
84
|
*
|
|
@@ -74,6 +91,7 @@ export default class ReconnectionManager {
|
|
|
74
91
|
disconnected: false,
|
|
75
92
|
resolve: () => {},
|
|
76
93
|
timer: undefined,
|
|
94
|
+
// @ts-ignore
|
|
77
95
|
timeoutDuration: meeting.config.reconnection.iceReconnectionTimeout
|
|
78
96
|
};
|
|
79
97
|
|
|
@@ -99,6 +117,7 @@ export default class ReconnectionManager {
|
|
|
99
117
|
*/
|
|
100
118
|
// TODO : change this logic to not save the meeting instance
|
|
101
119
|
// It gets complicated when meeting ends on remote side , We have a old meeting instance which is not up to date
|
|
120
|
+
// @ts-ignore
|
|
102
121
|
this.webex = meeting.webex;
|
|
103
122
|
/**
|
|
104
123
|
* @instance
|
|
@@ -110,8 +129,10 @@ export default class ReconnectionManager {
|
|
|
110
129
|
// try moving this to meetings collection
|
|
111
130
|
this.meeting = meeting;
|
|
112
131
|
|
|
132
|
+
// @ts-ignore
|
|
113
133
|
this.maxRejoinAttempts = meeting.config.reconnection.maxRejoinAttempts;
|
|
114
134
|
this.rejoinAttempts = RECONNECTION.STATE.DEFAULT_TRY_COUNT;
|
|
135
|
+
// @ts-ignore
|
|
115
136
|
this.autoRejoinEnabled = meeting.config.reconnection.autoRejoin;
|
|
116
137
|
|
|
117
138
|
|
|
@@ -119,6 +140,21 @@ export default class ReconnectionManager {
|
|
|
119
140
|
this.reset();
|
|
120
141
|
}
|
|
121
142
|
|
|
143
|
+
/**
|
|
144
|
+
* @public
|
|
145
|
+
* @memberof ReconnectionManager
|
|
146
|
+
* @returns {void}
|
|
147
|
+
*/
|
|
148
|
+
resetReconnectionTimer() {
|
|
149
|
+
this.iceState.resolve();
|
|
150
|
+
this.iceState.resolve = () => {};
|
|
151
|
+
|
|
152
|
+
if (this.iceState.timer) {
|
|
153
|
+
clearTimeout(this.iceState.timer);
|
|
154
|
+
delete this.iceState.timer;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
122
158
|
/**
|
|
123
159
|
* Sets the iceState to connected and clears any disconnect timeouts and
|
|
124
160
|
* related timeout data within the iceState.
|
|
@@ -127,17 +163,11 @@ export default class ReconnectionManager {
|
|
|
127
163
|
* @public
|
|
128
164
|
* @memberof ReconnectionManager
|
|
129
165
|
*/
|
|
130
|
-
iceReconnected() {
|
|
166
|
+
public iceReconnected() {
|
|
131
167
|
if (this.iceState.disconnected) {
|
|
132
168
|
LoggerProxy.logger.log('ReconnectionManager:index#iceReconnected --> ice has reconnected');
|
|
133
169
|
|
|
134
|
-
this.
|
|
135
|
-
this.iceState.resolve = () => {};
|
|
136
|
-
|
|
137
|
-
if (this.iceState.timer) {
|
|
138
|
-
clearTimeout(this.iceState.timer);
|
|
139
|
-
delete this.iceState.timer;
|
|
140
|
-
}
|
|
170
|
+
this.resetReconnectionTimer();
|
|
141
171
|
|
|
142
172
|
this.iceState.disconnected = false;
|
|
143
173
|
}
|
|
@@ -153,13 +183,13 @@ export default class ReconnectionManager {
|
|
|
153
183
|
* @public
|
|
154
184
|
* @memberof ReconnectionManager
|
|
155
185
|
*/
|
|
156
|
-
waitForIceReconnect() {
|
|
186
|
+
public waitForIceReconnect() {
|
|
157
187
|
if (!this.iceState.disconnected) {
|
|
158
188
|
LoggerProxy.logger.log('ReconnectionManager:index#waitForIceReconnect --> waiting for ice reconnect');
|
|
159
189
|
|
|
160
190
|
this.iceState.disconnected = true;
|
|
161
191
|
|
|
162
|
-
return new Promise((resolve, reject) => {
|
|
192
|
+
return new Promise<void>((resolve, reject) => {
|
|
163
193
|
this.iceState.timer = setTimeout(() => {
|
|
164
194
|
if (this.iceState.disconnected === false) {
|
|
165
195
|
resolve();
|
|
@@ -183,7 +213,7 @@ export default class ReconnectionManager {
|
|
|
183
213
|
* @public
|
|
184
214
|
* @memberof ReconnectionManager
|
|
185
215
|
*/
|
|
186
|
-
reset() {
|
|
216
|
+
public reset() {
|
|
187
217
|
this.status = RECONNECTION.STATE.DEFAULT_STATUS;
|
|
188
218
|
this.tryCount = RECONNECTION.STATE.DEFAULT_TRY_COUNT;
|
|
189
219
|
this.rejoinAttempts = RECONNECTION.STATE.DEFAULT_TRY_COUNT;
|
|
@@ -194,18 +224,28 @@ export default class ReconnectionManager {
|
|
|
194
224
|
* @public
|
|
195
225
|
* @memberof ReconnectionManager
|
|
196
226
|
*/
|
|
197
|
-
cleanUp() {
|
|
227
|
+
public cleanUp() {
|
|
198
228
|
this.reset();
|
|
199
229
|
this.meeting = null;
|
|
200
230
|
}
|
|
201
231
|
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* @public
|
|
235
|
+
* @memberof ReconnectionManager
|
|
236
|
+
* @returns {Boolean} true if reconnection operation is in progress
|
|
237
|
+
*/
|
|
238
|
+
isReconnectInProgress() {
|
|
239
|
+
return (this.status === RECONNECTION.STATE.IN_PROGRESS);
|
|
240
|
+
}
|
|
241
|
+
|
|
202
242
|
/**
|
|
203
243
|
* @returns {Boolean}
|
|
204
244
|
* @throws {ReconnectionError}
|
|
205
245
|
* @private
|
|
206
246
|
* @memberof ReconnectionManager
|
|
207
247
|
*/
|
|
208
|
-
validate() {
|
|
248
|
+
private validate() {
|
|
209
249
|
if (this.meeting.config.reconnection.enabled) {
|
|
210
250
|
if (
|
|
211
251
|
this.status === RECONNECTION.STATE.DEFAULT_STATUS ||
|
|
@@ -233,7 +273,13 @@ export default class ReconnectionManager {
|
|
|
233
273
|
* @public
|
|
234
274
|
* @memberof ReconnectionManager
|
|
235
275
|
*/
|
|
236
|
-
async reconnect({
|
|
276
|
+
public async reconnect({
|
|
277
|
+
networkDisconnect = false,
|
|
278
|
+
networkRetry = false,
|
|
279
|
+
}: {
|
|
280
|
+
networkDisconnect?: boolean;
|
|
281
|
+
networkRetry?: boolean;
|
|
282
|
+
} = {}) {
|
|
237
283
|
LoggerProxy.logger.info(`ReconnectionManager:index#reconnect --> Reconnection start for meeting ${this.meeting.id}.`);
|
|
238
284
|
// First, validate that we can reconnect, if not, it will throw an error
|
|
239
285
|
try {
|
|
@@ -315,7 +361,7 @@ export default class ReconnectionManager {
|
|
|
315
361
|
* @private
|
|
316
362
|
* @memberof ReconnectionManager
|
|
317
363
|
*/
|
|
318
|
-
async executeReconnection({networkDisconnect = false}) {
|
|
364
|
+
private async executeReconnection({ networkDisconnect = false }: { networkDisconnect?: boolean }) {
|
|
319
365
|
this.status = RECONNECTION.STATE.IN_PROGRESS;
|
|
320
366
|
|
|
321
367
|
LoggerProxy.logger.info('ReconnectionManager:index#executeReconnection --> Attempting to reconnect to meeting.');
|
|
@@ -385,16 +431,13 @@ export default class ReconnectionManager {
|
|
|
385
431
|
* @param {boolean} wasSharing
|
|
386
432
|
* @returns {Promise}
|
|
387
433
|
*/
|
|
388
|
-
async rejoinMeeting(wasSharing = false) {
|
|
434
|
+
async rejoinMeeting(wasSharing: boolean = false) {
|
|
389
435
|
try {
|
|
390
436
|
LoggerProxy.logger.info('ReconnectionManager:index#rejoinMeeting --> attemping meeting rejoin');
|
|
391
|
-
const previousCorrelationId = this.meeting.correlationId;
|
|
392
437
|
|
|
393
438
|
await this.meeting.join({rejoin: true});
|
|
394
439
|
LoggerProxy.logger.info('ReconnectionManager:index#rejoinMeeting --> meeting rejoined');
|
|
395
440
|
|
|
396
|
-
RoapCollection.deleteSession(previousCorrelationId);
|
|
397
|
-
|
|
398
441
|
if (wasSharing) {
|
|
399
442
|
// Stop the share streams if user tried to rejoin
|
|
400
443
|
Media.stopTracks(this.meeting.mediaProperties.shareTrack);
|
|
@@ -451,28 +494,22 @@ export default class ReconnectionManager {
|
|
|
451
494
|
* @private
|
|
452
495
|
* @memberof ReconnectionManager
|
|
453
496
|
*/
|
|
454
|
-
reconnectMedia() {
|
|
497
|
+
async reconnectMedia() {
|
|
455
498
|
LoggerProxy.logger.log('ReconnectionManager:index#reconnectMedia --> Begin reestablishment of media');
|
|
456
499
|
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
sdp: this.meeting.mediaProperties.peerConnection.sdp,
|
|
471
|
-
roapSeq: this.meeting.roapSeq,
|
|
472
|
-
meeting: this.meeting,
|
|
473
|
-
reconnect: true
|
|
474
|
-
});
|
|
475
|
-
});
|
|
500
|
+
// we are not simply calling this.meeting.mediaProperties.webrtcMediaConnection.reconnect(),
|
|
501
|
+
// but instead manually closing and creating new media connection, because we need to do the TURN discovery again
|
|
502
|
+
|
|
503
|
+
await this.meeting.closePeerConnections();
|
|
504
|
+
this.meeting.mediaProperties.unsetPeerConnection();
|
|
505
|
+
|
|
506
|
+
const turnServerResult = await this.meeting.roap.doTurnDiscovery(this.meeting, true);
|
|
507
|
+
|
|
508
|
+
const mc = this.meeting.createMediaConnection(turnServerResult.turnServerInfo);
|
|
509
|
+
|
|
510
|
+
this.meeting.statsAnalyzer.updateMediaConnection(mc);
|
|
511
|
+
|
|
512
|
+
return mc.initiateOffer();
|
|
476
513
|
}
|
|
477
514
|
|
|
478
515
|
/**
|
|
@@ -481,7 +518,7 @@ export default class ReconnectionManager {
|
|
|
481
518
|
* @private
|
|
482
519
|
* @memberof ReconnectionManager
|
|
483
520
|
*/
|
|
484
|
-
async reconnectMercuryWebSocket() {
|
|
521
|
+
private async reconnectMercuryWebSocket() {
|
|
485
522
|
LoggerProxy.logger.info('ReconnectionManager:index#reconnectMercuryWebSocket --> Reconnecting websocket.');
|
|
486
523
|
// First, attempt to disconnect if we think we are already connected.
|
|
487
524
|
if (this.webex.internal.mercury.connected) {
|
|
@@ -508,25 +545,4 @@ export default class ReconnectionManager {
|
|
|
508
545
|
throw (connectError);
|
|
509
546
|
}
|
|
510
547
|
}
|
|
511
|
-
|
|
512
|
-
/**
|
|
513
|
-
* @param {Meeting} meeting
|
|
514
|
-
* @returns {undefined}
|
|
515
|
-
* @private
|
|
516
|
-
* @memberof ReconnectionManager
|
|
517
|
-
*/
|
|
518
|
-
static async setupPeerConnection(meeting) {
|
|
519
|
-
LoggerProxy.logger.log('ReconnectionManager:index#setupPeerConnection --> Begin resetting peer connection');
|
|
520
|
-
// close pcs, unset to null and create a new one with out closing any streams
|
|
521
|
-
PeerConnectionManager.close(meeting.mediaProperties.peerConnection);
|
|
522
|
-
meeting.mediaProperties.unsetPeerConnection();
|
|
523
|
-
|
|
524
|
-
const turnInfo = await meeting.roap.doTurnDiscovery(meeting, true);
|
|
525
|
-
|
|
526
|
-
meeting.mediaProperties.reInitiatePeerconnection(turnInfo);
|
|
527
|
-
PeerConnectionManager.setPeerConnectionEvents(meeting);
|
|
528
|
-
|
|
529
|
-
// update the peerconnection in the stats manager when ever we reconnect
|
|
530
|
-
meeting.statsAnalyzer.updatePeerconnection(meeting.mediaProperties.peerConnection);
|
|
531
|
-
}
|
|
532
548
|
}
|