@webex/plugin-meetings 3.0.0-beta.31 → 3.0.0-beta.310
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/README.md +46 -8
- package/dist/annotation/annotation.types.js +7 -0
- package/dist/annotation/annotation.types.js.map +1 -0
- package/dist/annotation/constants.js +49 -0
- package/dist/annotation/constants.js.map +1 -0
- package/dist/annotation/index.js +342 -0
- package/dist/annotation/index.js.map +1 -0
- package/dist/breakouts/breakout.js +94 -15
- package/dist/breakouts/breakout.js.map +1 -1
- package/dist/breakouts/edit-lock-error.js +52 -0
- package/dist/breakouts/edit-lock-error.js.map +1 -0
- package/dist/breakouts/events.js +45 -0
- package/dist/breakouts/events.js.map +1 -0
- package/dist/breakouts/index.js +709 -35
- package/dist/breakouts/index.js.map +1 -1
- package/dist/breakouts/utils.js +45 -1
- package/dist/breakouts/utils.js.map +1 -1
- package/dist/common/errors/no-meeting-info.js +51 -0
- package/dist/common/errors/no-meeting-info.js.map +1 -0
- package/dist/common/errors/reclaim-host-role-errors.js +158 -0
- package/dist/common/errors/reclaim-host-role-errors.js.map +1 -0
- package/dist/common/errors/webex-errors.js +48 -7
- package/dist/common/errors/webex-errors.js.map +1 -1
- package/dist/common/logs/logger-proxy.js +1 -1
- package/dist/common/logs/logger-proxy.js.map +1 -1
- package/dist/common/logs/request.js +5 -1
- package/dist/common/logs/request.js.map +1 -1
- package/dist/common/queue.js +24 -9
- package/dist/common/queue.js.map +1 -1
- package/dist/config.js +5 -11
- package/dist/config.js.map +1 -1
- package/dist/constants.js +233 -29
- package/dist/constants.js.map +1 -1
- package/dist/controls-options-manager/enums.js +14 -2
- package/dist/controls-options-manager/enums.js.map +1 -1
- package/dist/controls-options-manager/index.js +109 -15
- package/dist/controls-options-manager/index.js.map +1 -1
- package/dist/controls-options-manager/types.js +7 -0
- package/dist/controls-options-manager/types.js.map +1 -0
- package/dist/controls-options-manager/util.js +309 -18
- package/dist/controls-options-manager/util.js.map +1 -1
- package/dist/index.js +112 -1
- package/dist/index.js.map +1 -1
- package/dist/interpretation/collection.js +23 -0
- package/dist/interpretation/collection.js.map +1 -0
- package/dist/interpretation/index.js +366 -0
- package/dist/interpretation/index.js.map +1 -0
- package/dist/interpretation/siLanguage.js +25 -0
- package/dist/interpretation/siLanguage.js.map +1 -0
- package/dist/locus-info/controlsUtils.js +91 -2
- package/dist/locus-info/controlsUtils.js.map +1 -1
- package/dist/locus-info/index.js +383 -62
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/infoUtils.js +7 -1
- package/dist/locus-info/infoUtils.js.map +1 -1
- package/dist/locus-info/mediaSharesUtils.js +57 -1
- package/dist/locus-info/mediaSharesUtils.js.map +1 -1
- package/dist/locus-info/parser.js +249 -72
- package/dist/locus-info/parser.js.map +1 -1
- package/dist/locus-info/selfUtils.js +89 -14
- package/dist/locus-info/selfUtils.js.map +1 -1
- package/dist/media/index.js +61 -116
- package/dist/media/index.js.map +1 -1
- package/dist/media/properties.js +73 -124
- package/dist/media/properties.js.map +1 -1
- package/dist/meeting/in-meeting-actions.js +82 -2
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +3777 -2929
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/locusMediaRequest.js +292 -0
- package/dist/meeting/locusMediaRequest.js.map +1 -0
- package/dist/meeting/muteState.js +230 -124
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.js +260 -196
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/util.js +601 -417
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/index.js +73 -7
- package/dist/meeting-info/index.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js +192 -51
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meeting-info/util.js +1 -1
- package/dist/meeting-info/util.js.map +1 -1
- package/dist/meeting-info/utilv2.js +36 -36
- package/dist/meeting-info/utilv2.js.map +1 -1
- package/dist/meetings/collection.js +39 -0
- package/dist/meetings/collection.js.map +1 -1
- package/dist/meetings/index.js +415 -115
- package/dist/meetings/index.js.map +1 -1
- package/dist/meetings/meetings.types.js +7 -0
- package/dist/meetings/meetings.types.js.map +1 -0
- package/dist/meetings/request.js +2 -0
- package/dist/meetings/request.js.map +1 -1
- package/dist/meetings/util.js +72 -6
- package/dist/meetings/util.js.map +1 -1
- package/dist/member/index.js +58 -0
- package/dist/member/index.js.map +1 -1
- package/dist/member/types.js +25 -0
- package/dist/member/types.js.map +1 -0
- package/dist/member/util.js +132 -25
- package/dist/member/util.js.map +1 -1
- package/dist/members/collection.js +10 -0
- package/dist/members/collection.js.map +1 -1
- package/dist/members/index.js +102 -6
- package/dist/members/index.js.map +1 -1
- package/dist/members/request.js +106 -38
- package/dist/members/request.js.map +1 -1
- package/dist/members/types.js +15 -0
- package/dist/members/types.js.map +1 -0
- package/dist/members/util.js +326 -232
- package/dist/members/util.js.map +1 -1
- package/dist/metrics/constants.js +13 -5
- package/dist/metrics/constants.js.map +1 -1
- package/dist/metrics/index.js +1 -468
- package/dist/metrics/index.js.map +1 -1
- package/dist/multistream/mediaRequestManager.js +238 -49
- package/dist/multistream/mediaRequestManager.js.map +1 -1
- package/dist/multistream/receiveSlot.js +29 -16
- package/dist/multistream/receiveSlot.js.map +1 -1
- package/dist/multistream/receiveSlotManager.js +39 -36
- package/dist/multistream/receiveSlotManager.js.map +1 -1
- package/dist/multistream/remoteMedia.js +44 -18
- package/dist/multistream/remoteMedia.js.map +1 -1
- package/dist/multistream/remoteMediaGroup.js +60 -3
- package/dist/multistream/remoteMediaGroup.js.map +1 -1
- package/dist/multistream/remoteMediaManager.js +209 -59
- package/dist/multistream/remoteMediaManager.js.map +1 -1
- package/dist/multistream/sendSlotManager.js +233 -0
- package/dist/multistream/sendSlotManager.js.map +1 -0
- package/dist/reachability/index.js +225 -59
- package/dist/reachability/index.js.map +1 -1
- package/dist/reachability/request.js +17 -8
- package/dist/reachability/request.js.map +1 -1
- package/dist/reconnection-manager/index.js +201 -156
- package/dist/reconnection-manager/index.js.map +1 -1
- package/dist/recording-controller/index.js +21 -2
- package/dist/recording-controller/index.js.map +1 -1
- package/dist/recording-controller/util.js +9 -8
- package/dist/recording-controller/util.js.map +1 -1
- package/dist/roap/index.js +62 -32
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.js +112 -97
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/turnDiscovery.js +95 -36
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/rtcMetrics/constants.js +12 -0
- package/dist/rtcMetrics/constants.js.map +1 -0
- package/dist/rtcMetrics/index.js +117 -0
- package/dist/rtcMetrics/index.js.map +1 -0
- package/dist/statsAnalyzer/index.js +86 -78
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.js +11 -10
- package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
- package/dist/types/annotation/annotation.types.d.ts +42 -0
- package/dist/types/annotation/constants.d.ts +31 -0
- package/dist/types/annotation/index.d.ts +117 -0
- package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
- package/dist/types/breakouts/events.d.ts +8 -0
- package/dist/types/breakouts/utils.d.ts +14 -0
- package/dist/types/common/errors/no-meeting-info.d.ts +14 -0
- package/dist/types/common/errors/reclaim-host-role-errors.d.ts +60 -0
- package/dist/types/common/errors/webex-errors.d.ts +25 -1
- package/dist/types/common/logs/request.d.ts +2 -0
- package/dist/types/common/queue.d.ts +9 -7
- package/dist/types/config.d.ts +1 -7
- package/dist/types/constants.d.ts +194 -24
- package/dist/types/controls-options-manager/enums.d.ts +11 -1
- package/dist/types/controls-options-manager/index.d.ts +17 -1
- package/dist/types/controls-options-manager/types.d.ts +43 -0
- package/dist/types/controls-options-manager/util.d.ts +1 -7
- package/dist/types/index.d.ts +6 -4
- package/dist/types/interpretation/collection.d.ts +5 -0
- package/dist/types/interpretation/index.d.ts +5 -0
- package/dist/types/interpretation/siLanguage.d.ts +5 -0
- package/dist/types/locus-info/index.d.ts +57 -4
- package/dist/types/locus-info/parser.d.ts +67 -6
- package/dist/types/media/index.d.ts +2 -0
- package/dist/types/media/properties.d.ts +34 -48
- package/dist/types/meeting/in-meeting-actions.d.ts +82 -2
- package/dist/types/meeting/index.d.ts +463 -510
- package/dist/types/meeting/locusMediaRequest.d.ts +74 -0
- package/dist/types/meeting/muteState.d.ts +99 -23
- package/dist/types/meeting/request.d.ts +72 -43
- package/dist/types/meeting/util.d.ts +101 -1
- package/dist/types/meeting-info/index.d.ts +13 -1
- package/dist/types/meeting-info/meeting-info-v2.d.ts +31 -1
- package/dist/types/meetings/collection.d.ts +17 -0
- package/dist/types/meetings/index.d.ts +98 -20
- package/dist/types/meetings/meetings.types.d.ts +4 -0
- package/dist/types/member/index.d.ts +14 -0
- package/dist/types/member/types.d.ts +32 -0
- package/dist/types/members/collection.d.ts +5 -0
- package/dist/types/members/index.d.ts +35 -2
- package/dist/types/members/request.d.ts +73 -9
- package/dist/types/members/types.d.ts +25 -0
- package/dist/types/members/util.d.ts +214 -1
- package/dist/types/metrics/constants.d.ts +12 -4
- package/dist/types/metrics/index.d.ts +4 -119
- package/dist/types/multistream/mediaRequestManager.d.ts +73 -5
- package/dist/types/multistream/receiveSlot.d.ts +13 -11
- package/dist/types/multistream/receiveSlotManager.d.ts +14 -4
- package/dist/types/multistream/remoteMedia.d.ts +8 -29
- package/dist/types/multistream/remoteMediaGroup.d.ts +0 -9
- package/dist/types/multistream/remoteMediaManager.d.ts +46 -2
- package/dist/types/multistream/sendSlotManager.d.ts +61 -0
- package/dist/types/reachability/index.d.ts +61 -7
- package/dist/types/reachability/request.d.ts +7 -3
- package/dist/types/reconnection-manager/index.d.ts +9 -0
- package/dist/types/recording-controller/index.d.ts +15 -1
- package/dist/types/recording-controller/util.d.ts +5 -4
- package/dist/types/roap/index.d.ts +2 -1
- package/dist/types/roap/request.d.ts +15 -11
- package/dist/types/roap/turnDiscovery.d.ts +21 -3
- package/dist/types/rtcMetrics/constants.d.ts +4 -0
- package/dist/types/rtcMetrics/index.d.ts +47 -0
- package/dist/types/statsAnalyzer/index.d.ts +7 -1
- package/dist/types/webinar/collection.d.ts +16 -0
- package/dist/types/webinar/index.d.ts +5 -0
- package/dist/webinar/collection.js +44 -0
- package/dist/webinar/collection.js.map +1 -0
- package/dist/webinar/index.js +69 -0
- package/dist/webinar/index.js.map +1 -0
- package/package.json +23 -20
- package/src/annotation/annotation.types.ts +50 -0
- package/src/annotation/constants.ts +36 -0
- package/src/annotation/index.ts +328 -0
- package/src/breakouts/README.md +42 -12
- package/src/breakouts/breakout.ts +67 -9
- package/src/breakouts/edit-lock-error.ts +25 -0
- package/src/breakouts/events.ts +56 -0
- package/src/breakouts/index.ts +592 -20
- package/src/breakouts/utils.ts +42 -0
- package/src/common/errors/no-meeting-info.ts +24 -0
- package/src/common/errors/reclaim-host-role-errors.ts +134 -0
- package/src/common/errors/webex-errors.ts +44 -2
- package/src/common/logs/logger-proxy.ts +1 -1
- package/src/common/logs/request.ts +5 -1
- package/src/common/queue.ts +22 -8
- package/src/config.ts +4 -10
- package/src/constants.ts +221 -19
- package/src/controls-options-manager/enums.ts +12 -0
- package/src/controls-options-manager/index.ts +116 -21
- package/src/controls-options-manager/types.ts +59 -0
- package/src/controls-options-manager/util.ts +294 -14
- package/src/index.ts +40 -0
- package/src/interpretation/README.md +60 -0
- package/src/interpretation/collection.ts +19 -0
- package/src/interpretation/index.ts +332 -0
- package/src/interpretation/siLanguage.ts +18 -0
- package/src/locus-info/controlsUtils.ts +108 -0
- package/src/locus-info/index.ts +413 -59
- package/src/locus-info/infoUtils.ts +10 -2
- package/src/locus-info/mediaSharesUtils.ts +64 -0
- package/src/locus-info/parser.ts +258 -47
- package/src/locus-info/selfUtils.ts +81 -5
- package/src/media/index.ts +102 -122
- package/src/media/properties.ts +87 -110
- package/src/meeting/in-meeting-actions.ts +163 -3
- package/src/meeting/index.ts +3132 -2541
- package/src/meeting/locusMediaRequest.ts +313 -0
- package/src/meeting/muteState.ts +229 -131
- package/src/meeting/request.ts +177 -121
- package/src/meeting/util.ts +588 -394
- package/src/meeting-info/index.ts +81 -8
- package/src/meeting-info/meeting-info-v2.ts +170 -14
- package/src/meeting-info/util.ts +1 -1
- package/src/meeting-info/utilv2.ts +23 -23
- package/src/meetings/collection.ts +33 -0
- package/src/meetings/index.ts +445 -123
- package/src/meetings/meetings.types.ts +12 -0
- package/src/meetings/request.ts +2 -0
- package/src/meetings/util.ts +80 -11
- package/src/member/index.ts +58 -0
- package/src/member/types.ts +38 -0
- package/src/member/util.ts +141 -25
- package/src/members/collection.ts +8 -0
- package/src/members/index.ts +134 -8
- package/src/members/request.ts +97 -17
- package/src/members/types.ts +29 -0
- package/src/members/util.ts +333 -240
- package/src/metrics/constants.ts +12 -4
- package/src/metrics/index.ts +1 -490
- package/src/multistream/mediaRequestManager.ts +289 -79
- package/src/multistream/receiveSlot.ts +31 -17
- package/src/multistream/receiveSlotManager.ts +34 -24
- package/src/multistream/remoteMedia.ts +27 -2
- package/src/multistream/remoteMediaGroup.ts +59 -0
- package/src/multistream/remoteMediaManager.ts +148 -30
- package/src/multistream/sendSlotManager.ts +170 -0
- package/src/reachability/index.ts +228 -37
- package/src/reachability/request.ts +17 -8
- package/src/reconnection-manager/index.ts +83 -56
- package/src/recording-controller/index.ts +20 -3
- package/src/recording-controller/util.ts +26 -9
- package/src/roap/index.ts +63 -32
- package/src/roap/request.ts +100 -104
- package/src/roap/turnDiscovery.ts +48 -26
- package/src/rtcMetrics/constants.ts +3 -0
- package/src/rtcMetrics/index.ts +100 -0
- package/src/statsAnalyzer/index.ts +105 -91
- package/src/statsAnalyzer/mqaUtil.ts +13 -14
- package/src/webinar/collection.ts +31 -0
- package/src/webinar/index.ts +62 -0
- package/test/integration/spec/converged-space-meetings.js +60 -3
- package/test/integration/spec/journey.js +320 -261
- package/test/integration/spec/space-meeting.js +76 -3
- package/test/unit/spec/annotation/index.ts +418 -0
- package/test/unit/spec/breakouts/breakout.ts +118 -28
- package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
- package/test/unit/spec/breakouts/events.ts +89 -0
- package/test/unit/spec/breakouts/index.ts +1395 -69
- package/test/unit/spec/breakouts/utils.js +52 -1
- package/test/unit/spec/common/queue.js +31 -2
- package/test/unit/spec/controls-options-manager/index.js +163 -0
- package/test/unit/spec/controls-options-manager/util.js +576 -60
- package/test/unit/spec/fixture/locus.js +1 -0
- package/test/unit/spec/interpretation/collection.ts +15 -0
- package/test/unit/spec/interpretation/index.ts +589 -0
- package/test/unit/spec/interpretation/siLanguage.ts +28 -0
- package/test/unit/spec/locus-info/controlsUtils.js +316 -43
- package/test/unit/spec/locus-info/index.js +1304 -33
- package/test/unit/spec/locus-info/infoUtils.js +37 -15
- package/test/unit/spec/locus-info/lib/SeqCmp.json +16 -0
- package/test/unit/spec/locus-info/mediaSharesUtils.ts +32 -0
- package/test/unit/spec/locus-info/parser.js +116 -35
- package/test/unit/spec/locus-info/selfConstant.js +27 -4
- package/test/unit/spec/locus-info/selfUtils.js +208 -17
- package/test/unit/spec/media/index.ts +104 -37
- package/test/unit/spec/media/properties.ts +2 -2
- package/test/unit/spec/meeting/in-meeting-actions.ts +81 -3
- package/test/unit/spec/meeting/index.js +5216 -1956
- package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
- package/test/unit/spec/meeting/muteState.js +408 -208
- package/test/unit/spec/meeting/request.js +483 -49
- package/test/unit/spec/meeting/utils.js +679 -64
- package/test/unit/spec/meeting-info/index.js +300 -0
- package/test/unit/spec/meeting-info/meetinginfov2.js +526 -5
- package/test/unit/spec/meeting-info/utilv2.js +21 -0
- package/test/unit/spec/meetings/collection.js +26 -0
- package/test/unit/spec/meetings/index.js +1011 -205
- package/test/unit/spec/meetings/utils.js +202 -2
- package/test/unit/spec/member/index.js +61 -6
- package/test/unit/spec/member/util.js +510 -34
- package/test/unit/spec/members/index.js +432 -1
- package/test/unit/spec/members/request.js +206 -27
- package/test/unit/spec/members/utils.js +210 -0
- package/test/unit/spec/metrics/index.js +1 -50
- package/test/unit/spec/multistream/mediaRequestManager.ts +803 -162
- package/test/unit/spec/multistream/receiveSlot.ts +28 -20
- package/test/unit/spec/multistream/receiveSlotManager.ts +32 -30
- package/test/unit/spec/multistream/remoteMedia.ts +30 -0
- package/test/unit/spec/multistream/remoteMediaGroup.ts +266 -0
- package/test/unit/spec/multistream/remoteMediaManager.ts +326 -0
- package/test/unit/spec/multistream/sendSlotManager.ts +242 -0
- package/test/unit/spec/reachability/index.ts +549 -9
- package/test/unit/spec/reachability/request.js +68 -0
- package/test/unit/spec/reconnection-manager/index.js +85 -9
- package/test/unit/spec/recording-controller/index.js +294 -218
- package/test/unit/spec/recording-controller/util.js +223 -96
- package/test/unit/spec/roap/index.ts +178 -64
- package/test/unit/spec/roap/request.ts +203 -85
- package/test/unit/spec/roap/turnDiscovery.ts +82 -36
- package/test/unit/spec/rtcMetrics/index.ts +73 -0
- package/test/unit/spec/stats-analyzer/index.js +136 -2
- package/test/unit/spec/webinar/collection.ts +13 -0
- package/test/unit/spec/webinar/index.ts +60 -0
- package/test/utils/integrationTestUtils.js +46 -0
- package/test/utils/testUtils.js +0 -52
- package/dist/meeting/effectsState.js +0 -262
- package/dist/meeting/effectsState.js.map +0 -1
- package/dist/metrics/config.js +0 -299
- package/dist/metrics/config.js.map +0 -1
- package/dist/types/meeting/effectsState.d.ts +0 -42
- package/dist/types/metrics/config.d.ts +0 -178
- package/src/index.js +0 -16
- package/src/meeting/effectsState.ts +0 -211
- package/src/metrics/config.ts +0 -495
- package/test/unit/spec/meeting/effectsState.js +0 -285
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import PermissionError from '../common/errors/permission';
|
|
2
|
-
import {CONTROLS, HTTP_VERBS} from '../constants';
|
|
2
|
+
import {CONTROLS, HTTP_VERBS, SELF_POLICY} from '../constants';
|
|
3
3
|
import MeetingRequest from '../meeting/request';
|
|
4
4
|
import RecordingAction from './enums';
|
|
5
5
|
import Util from './util';
|
|
@@ -28,6 +28,14 @@ export default class RecordingController {
|
|
|
28
28
|
*/
|
|
29
29
|
private displayHints: Array<string> = [];
|
|
30
30
|
|
|
31
|
+
/**
|
|
32
|
+
* @instance
|
|
33
|
+
* @type {Object}
|
|
34
|
+
* @private
|
|
35
|
+
* @memberof RecordingInfo
|
|
36
|
+
*/
|
|
37
|
+
private selfUserPolicies: Record<SELF_POLICY, boolean>;
|
|
38
|
+
|
|
31
39
|
/**
|
|
32
40
|
* @instance
|
|
33
41
|
* @type {string}
|
|
@@ -81,7 +89,6 @@ export default class RecordingController {
|
|
|
81
89
|
|
|
82
90
|
/**
|
|
83
91
|
* @param {MeetingRequest} request
|
|
84
|
-
* @param {LocusInfo} info
|
|
85
92
|
* @returns {void}
|
|
86
93
|
* @private
|
|
87
94
|
* @memberof RecordingController
|
|
@@ -126,6 +133,16 @@ export default class RecordingController {
|
|
|
126
133
|
this.displayHints = hints;
|
|
127
134
|
}
|
|
128
135
|
|
|
136
|
+
/**
|
|
137
|
+
* @param {Object} selfUserPolicies
|
|
138
|
+
* @returns {void}
|
|
139
|
+
* @public
|
|
140
|
+
* @memberof RecordingController
|
|
141
|
+
*/
|
|
142
|
+
public setUserPolicy(selfUserPolicies: Record<SELF_POLICY, boolean>) {
|
|
143
|
+
this.selfUserPolicies = selfUserPolicies;
|
|
144
|
+
}
|
|
145
|
+
|
|
129
146
|
/**
|
|
130
147
|
* @param {string} id
|
|
131
148
|
* @returns {void}
|
|
@@ -264,7 +281,7 @@ export default class RecordingController {
|
|
|
264
281
|
);
|
|
265
282
|
|
|
266
283
|
// assumes action is proper cased (i.e., Example)
|
|
267
|
-
if (Util?.[`canUser${action}`](this.displayHints)) {
|
|
284
|
+
if (Util?.[`canUser${action}`](this.displayHints, this.selfUserPolicies)) {
|
|
268
285
|
if (this.serviceUrl) {
|
|
269
286
|
return this.recordingService(action);
|
|
270
287
|
}
|
|
@@ -1,17 +1,34 @@
|
|
|
1
|
-
import {DISPLAY_HINTS} from '../constants';
|
|
1
|
+
import {DISPLAY_HINTS, SELF_POLICY} from '../constants';
|
|
2
2
|
import RecordingAction from './enums';
|
|
3
|
+
import MeetingUtil from '../meeting/util';
|
|
3
4
|
|
|
4
|
-
const canUserStart = (
|
|
5
|
-
displayHints
|
|
5
|
+
const canUserStart = (
|
|
6
|
+
displayHints: Array<string>,
|
|
7
|
+
userPolicies: Record<SELF_POLICY, boolean>
|
|
8
|
+
): boolean =>
|
|
9
|
+
displayHints.includes(DISPLAY_HINTS.RECORDING_CONTROL_START) &&
|
|
10
|
+
MeetingUtil.selfSupportsFeature(SELF_POLICY.SUPPORT_NETWORK_BASED_RECORD, userPolicies);
|
|
6
11
|
|
|
7
|
-
const canUserPause = (
|
|
8
|
-
displayHints
|
|
12
|
+
const canUserPause = (
|
|
13
|
+
displayHints: Array<string>,
|
|
14
|
+
userPolicies: Record<SELF_POLICY, boolean>
|
|
15
|
+
): boolean =>
|
|
16
|
+
displayHints.includes(DISPLAY_HINTS.RECORDING_CONTROL_PAUSE) &&
|
|
17
|
+
MeetingUtil.selfSupportsFeature(SELF_POLICY.SUPPORT_NETWORK_BASED_RECORD, userPolicies);
|
|
9
18
|
|
|
10
|
-
const canUserResume = (
|
|
11
|
-
displayHints
|
|
19
|
+
const canUserResume = (
|
|
20
|
+
displayHints: Array<string>,
|
|
21
|
+
userPolicies: Record<SELF_POLICY, boolean>
|
|
22
|
+
): boolean =>
|
|
23
|
+
displayHints.includes(DISPLAY_HINTS.RECORDING_CONTROL_RESUME) &&
|
|
24
|
+
MeetingUtil.selfSupportsFeature(SELF_POLICY.SUPPORT_NETWORK_BASED_RECORD, userPolicies);
|
|
12
25
|
|
|
13
|
-
const canUserStop = (
|
|
14
|
-
displayHints
|
|
26
|
+
const canUserStop = (
|
|
27
|
+
displayHints: Array<string>,
|
|
28
|
+
userPolicies: Record<SELF_POLICY, boolean>
|
|
29
|
+
): boolean =>
|
|
30
|
+
displayHints.includes(DISPLAY_HINTS.RECORDING_CONTROL_STOP) &&
|
|
31
|
+
MeetingUtil.selfSupportsFeature(SELF_POLICY.SUPPORT_NETWORK_BASED_RECORD, userPolicies);
|
|
15
32
|
|
|
16
33
|
const extractLocusId = (url: string) => {
|
|
17
34
|
return url?.split('/').pop();
|
package/src/roap/index.ts
CHANGED
|
@@ -7,6 +7,9 @@ import LoggerProxy from '../common/logs/logger-proxy';
|
|
|
7
7
|
import RoapRequest from './request';
|
|
8
8
|
import TurnDiscovery from './turnDiscovery';
|
|
9
9
|
import Meeting from '../meeting';
|
|
10
|
+
import MeetingUtil from '../meeting/util';
|
|
11
|
+
import Metrics from '../metrics';
|
|
12
|
+
import BEHAVIORAL_METRICS from '../metrics/constants';
|
|
10
13
|
|
|
11
14
|
/**
|
|
12
15
|
* Roap options
|
|
@@ -98,11 +101,8 @@ export default class Roap extends StatelessWebexPlugin {
|
|
|
98
101
|
roapMessage,
|
|
99
102
|
locusSelfUrl: meeting.selfUrl,
|
|
100
103
|
mediaId: options.mediaId,
|
|
101
|
-
correlationId: options.correlationId,
|
|
102
|
-
audioMuted: meeting.isAudioMuted(),
|
|
103
|
-
videoMuted: meeting.isVideoMuted(),
|
|
104
104
|
meetingId: meeting.id,
|
|
105
|
-
|
|
105
|
+
locusMediaRequest: meeting.locusMediaRequest,
|
|
106
106
|
})
|
|
107
107
|
.then(() => {
|
|
108
108
|
LoggerProxy.logger.log(`Roap:index#sendRoapOK --> ROAP OK sent with seq ${options.seq}`);
|
|
@@ -135,11 +135,8 @@ export default class Roap extends StatelessWebexPlugin {
|
|
|
135
135
|
roapMessage,
|
|
136
136
|
locusSelfUrl: meeting.selfUrl,
|
|
137
137
|
mediaId: options.mediaId,
|
|
138
|
-
correlationId: options.correlationId,
|
|
139
|
-
audioMuted: meeting.isAudioMuted(),
|
|
140
|
-
videoMuted: meeting.isVideoMuted(),
|
|
141
138
|
meetingId: meeting.id,
|
|
142
|
-
|
|
139
|
+
locusMediaRequest: meeting.locusMediaRequest,
|
|
143
140
|
});
|
|
144
141
|
}
|
|
145
142
|
|
|
@@ -167,11 +164,8 @@ export default class Roap extends StatelessWebexPlugin {
|
|
|
167
164
|
roapMessage,
|
|
168
165
|
locusSelfUrl: meeting.selfUrl,
|
|
169
166
|
mediaId: options.mediaId,
|
|
170
|
-
correlationId: options.correlationId,
|
|
171
|
-
audioMuted: meeting.isAudioMuted(),
|
|
172
|
-
videoMuted: meeting.isVideoMuted(),
|
|
173
167
|
meetingId: meeting.id,
|
|
174
|
-
|
|
168
|
+
locusMediaRequest: meeting.locusMediaRequest,
|
|
175
169
|
})
|
|
176
170
|
.then(() => {
|
|
177
171
|
LoggerProxy.logger.log(
|
|
@@ -194,31 +188,67 @@ export default class Roap extends StatelessWebexPlugin {
|
|
|
194
188
|
version: ROAP.ROAP_VERSION,
|
|
195
189
|
seq,
|
|
196
190
|
tieBreaker,
|
|
191
|
+
headers: ['includeAnswerInHttpResponse', 'noOkInTransaction'],
|
|
197
192
|
};
|
|
198
193
|
|
|
199
194
|
// When reconnecting, it's important that the first roap message being sent out has empty media id.
|
|
200
195
|
// Normally this is the roap offer, but when TURN discovery is enabled,
|
|
201
196
|
// then this is the TURN discovery request message
|
|
202
|
-
|
|
197
|
+
return this.turnDiscovery.isSkipped(meeting).then((isTurnDiscoverySkipped) => {
|
|
198
|
+
const sendEmptyMediaId = reconnect && isTurnDiscoverySkipped;
|
|
203
199
|
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
}
|
|
200
|
+
return this.roapRequest
|
|
201
|
+
.sendRoap({
|
|
202
|
+
roapMessage,
|
|
203
|
+
locusSelfUrl: meeting.selfUrl,
|
|
204
|
+
mediaId: sendEmptyMediaId ? '' : meeting.mediaId,
|
|
205
|
+
meetingId: meeting.id,
|
|
206
|
+
preferTranscoding: !meeting.isMultistream,
|
|
207
|
+
locusMediaRequest: meeting.locusMediaRequest,
|
|
208
|
+
ipVersion: MeetingUtil.getIpVersion(meeting.webex),
|
|
209
|
+
})
|
|
210
|
+
.then(({locus, mediaConnections}) => {
|
|
211
|
+
if (mediaConnections) {
|
|
212
|
+
meeting.updateMediaConnections(mediaConnections);
|
|
213
|
+
}
|
|
219
214
|
|
|
220
|
-
|
|
221
|
-
|
|
215
|
+
let roapAnswer;
|
|
216
|
+
|
|
217
|
+
if (mediaConnections?.[0]?.remoteSdp) {
|
|
218
|
+
const remoteSdp = JSON.parse(mediaConnections[0].remoteSdp);
|
|
219
|
+
|
|
220
|
+
if (remoteSdp.roapMessage) {
|
|
221
|
+
const {
|
|
222
|
+
seq: answerSeq,
|
|
223
|
+
messageType,
|
|
224
|
+
sdps,
|
|
225
|
+
errorType,
|
|
226
|
+
errorCause,
|
|
227
|
+
headers,
|
|
228
|
+
} = remoteSdp.roapMessage;
|
|
229
|
+
|
|
230
|
+
roapAnswer = {
|
|
231
|
+
seq: answerSeq,
|
|
232
|
+
messageType,
|
|
233
|
+
sdp: sdps[0],
|
|
234
|
+
errorType,
|
|
235
|
+
errorCause,
|
|
236
|
+
headers,
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
if (!roapAnswer) {
|
|
242
|
+
Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.ROAP_HTTP_RESPONSE_MISSING, {
|
|
243
|
+
correlationId: meeting.correlationId,
|
|
244
|
+
messageType: 'ANSWER',
|
|
245
|
+
isMultistream: meeting.isMultistream,
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
return {locus, roapAnswer};
|
|
250
|
+
});
|
|
251
|
+
});
|
|
222
252
|
}
|
|
223
253
|
|
|
224
254
|
/**
|
|
@@ -229,9 +259,10 @@ export default class Roap extends StatelessWebexPlugin {
|
|
|
229
259
|
* @param {Meeting} meeting
|
|
230
260
|
* @param {Boolean} isReconnecting should be set to true if this is a new
|
|
231
261
|
* media connection just after a reconnection
|
|
262
|
+
* @param {Boolean} [isForced]
|
|
232
263
|
* @returns {Promise}
|
|
233
264
|
*/
|
|
234
|
-
doTurnDiscovery(meeting: Meeting, isReconnecting: boolean) {
|
|
235
|
-
return this.turnDiscovery.doTurnDiscovery(meeting, isReconnecting);
|
|
265
|
+
doTurnDiscovery(meeting: Meeting, isReconnecting: boolean, isForced?: boolean) {
|
|
266
|
+
return this.turnDiscovery.doTurnDiscovery(meeting, isReconnecting, isForced);
|
|
236
267
|
}
|
|
237
268
|
}
|
package/src/roap/request.ts
CHANGED
|
@@ -1,43 +1,45 @@
|
|
|
1
|
-
/* global window */
|
|
2
1
|
// @ts-ignore
|
|
3
2
|
import {StatelessWebexPlugin} from '@webex/webex-core';
|
|
4
3
|
|
|
5
4
|
import LoggerProxy from '../common/logs/logger-proxy';
|
|
6
|
-
import {
|
|
7
|
-
import
|
|
8
|
-
import {eventType} from '../metrics/config';
|
|
5
|
+
import {IP_VERSION, REACHABILITY} from '../constants';
|
|
6
|
+
import {LocusMediaRequest} from '../meeting/locusMediaRequest';
|
|
9
7
|
|
|
10
8
|
/**
|
|
11
9
|
* @class RoapRequest
|
|
12
10
|
*/
|
|
13
11
|
export default class RoapRequest extends StatelessWebexPlugin {
|
|
14
12
|
/**
|
|
15
|
-
*
|
|
13
|
+
* Returns reachability data.
|
|
16
14
|
* @param {Object} localSdp
|
|
17
|
-
* @returns {
|
|
15
|
+
* @returns {Object}
|
|
18
16
|
*/
|
|
19
|
-
async
|
|
17
|
+
async attachReachabilityData(localSdp) {
|
|
18
|
+
let joinCookie;
|
|
19
|
+
|
|
20
|
+
// @ts-ignore
|
|
21
|
+
const reachabilityResult = await this.webex.meetings.reachability.getReachabilityResults();
|
|
22
|
+
|
|
23
|
+
if (reachabilityResult && Object.keys(reachabilityResult).length) {
|
|
24
|
+
localSdp.reachability = reachabilityResult;
|
|
25
|
+
}
|
|
26
|
+
|
|
20
27
|
// @ts-ignore
|
|
21
|
-
const
|
|
22
|
-
.get(REACHABILITY.namespace, REACHABILITY.
|
|
28
|
+
const joinCookieRaw = await this.webex.boundedStorage
|
|
29
|
+
.get(REACHABILITY.namespace, REACHABILITY.localStorageJoinCookie)
|
|
23
30
|
.catch(() => {});
|
|
24
31
|
|
|
25
|
-
if (
|
|
32
|
+
if (joinCookieRaw) {
|
|
26
33
|
try {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
/* istanbul ignore else */
|
|
30
|
-
if (reachabilityResult && Object.keys(reachabilityResult).length) {
|
|
31
|
-
localSdp.reachability = reachabilityResult;
|
|
32
|
-
}
|
|
34
|
+
joinCookie = JSON.parse(joinCookieRaw);
|
|
33
35
|
} catch (e) {
|
|
34
36
|
LoggerProxy.logger.error(
|
|
35
|
-
`
|
|
37
|
+
`MeetingRequest#constructor --> Error in parsing join cookie data: ${e}`
|
|
36
38
|
);
|
|
37
39
|
}
|
|
38
40
|
}
|
|
39
41
|
|
|
40
|
-
return localSdp;
|
|
42
|
+
return {localSdp, joinCookie};
|
|
41
43
|
}
|
|
42
44
|
|
|
43
45
|
/**
|
|
@@ -47,111 +49,105 @@ export default class RoapRequest extends StatelessWebexPlugin {
|
|
|
47
49
|
* @param {String} options.locusSelfUrl
|
|
48
50
|
* @param {String} options.mediaId
|
|
49
51
|
* @param {String} options.correlationId
|
|
50
|
-
* @param {Boolean} options.audioMuted
|
|
51
|
-
* @param {Boolean} options.videoMuted
|
|
52
52
|
* @param {String} options.meetingId
|
|
53
|
-
* @param {
|
|
53
|
+
* @param {IP_VERSION} options.ipVersion only required for offers
|
|
54
54
|
* @returns {Promise} returns the response/failure of the request
|
|
55
55
|
*/
|
|
56
|
-
sendRoap(options: {
|
|
56
|
+
async sendRoap(options: {
|
|
57
57
|
roapMessage: any;
|
|
58
58
|
locusSelfUrl: string;
|
|
59
59
|
mediaId: string;
|
|
60
|
-
correlationId: string;
|
|
61
|
-
audioMuted: boolean;
|
|
62
|
-
videoMuted: boolean;
|
|
63
60
|
meetingId: string;
|
|
64
|
-
|
|
61
|
+
ipVersion?: IP_VERSION;
|
|
62
|
+
locusMediaRequest?: LocusMediaRequest;
|
|
65
63
|
}) {
|
|
66
|
-
const {roapMessage, locusSelfUrl, mediaId,
|
|
64
|
+
const {roapMessage, locusSelfUrl, mediaId, meetingId, locusMediaRequest, ipVersion} = options;
|
|
67
65
|
|
|
68
66
|
if (!mediaId) {
|
|
69
|
-
LoggerProxy.logger.info('Roap:request#sendRoap -->
|
|
67
|
+
LoggerProxy.logger.info('Roap:request#sendRoap --> sending empty mediaID');
|
|
70
68
|
}
|
|
71
69
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
70
|
+
if (!locusMediaRequest) {
|
|
71
|
+
LoggerProxy.logger.warn(
|
|
72
|
+
'Roap:request#sendRoap --> locusMediaRequest unavailable, not sending roap'
|
|
73
|
+
);
|
|
74
|
+
|
|
75
|
+
return Promise.reject(new Error('sendRoap called when locusMediaRequest is undefined'));
|
|
76
|
+
}
|
|
77
|
+
const {localSdp: localSdpWithReachabilityData, joinCookie} = await this.attachReachabilityData({
|
|
78
|
+
roapMessage,
|
|
79
|
+
});
|
|
75
80
|
|
|
76
81
|
LoggerProxy.logger.info(
|
|
77
|
-
`Roap:request#sendRoap --> ${
|
|
82
|
+
`Roap:request#sendRoap --> ${locusSelfUrl} \n ${roapMessage.messageType} \n seq:${roapMessage.seq}`
|
|
78
83
|
);
|
|
79
84
|
|
|
80
|
-
|
|
85
|
+
// @ts-ignore
|
|
86
|
+
this.webex.internal.newMetrics.submitClientEvent({
|
|
87
|
+
name: 'client.locus.media.request',
|
|
88
|
+
options: {
|
|
89
|
+
meetingId,
|
|
90
|
+
},
|
|
91
|
+
});
|
|
81
92
|
|
|
82
|
-
return
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
deviceType: this.config.meetings.deviceType,
|
|
99
|
-
},
|
|
100
|
-
correlationId,
|
|
101
|
-
localMedias: [
|
|
102
|
-
{
|
|
103
|
-
localSdp: JSON.stringify(sdpWithReachability),
|
|
104
|
-
mediaId: options.mediaId,
|
|
105
|
-
},
|
|
106
|
-
],
|
|
107
|
-
clientMediaPreferences: {
|
|
108
|
-
preferTranscoding: options.preferTranscoding ?? true,
|
|
109
|
-
},
|
|
93
|
+
return locusMediaRequest
|
|
94
|
+
.send({
|
|
95
|
+
type: 'RoapMessage',
|
|
96
|
+
selfUrl: locusSelfUrl,
|
|
97
|
+
joinCookie,
|
|
98
|
+
mediaId,
|
|
99
|
+
roapMessage,
|
|
100
|
+
reachability: localSdpWithReachabilityData.reachability,
|
|
101
|
+
ipVersion,
|
|
102
|
+
})
|
|
103
|
+
.then((res) => {
|
|
104
|
+
// @ts-ignore
|
|
105
|
+
this.webex.internal.newMetrics.submitClientEvent({
|
|
106
|
+
name: 'client.locus.media.response',
|
|
107
|
+
options: {
|
|
108
|
+
meetingId,
|
|
110
109
|
},
|
|
111
|
-
})
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
locus
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
event: eventType.MEDIA_RESPONSE,
|
|
110
|
+
});
|
|
111
|
+
// always it will be the first mediaConnection Object
|
|
112
|
+
const mediaConnections =
|
|
113
|
+
res.body.mediaConnections &&
|
|
114
|
+
res.body.mediaConnections.length > 0 &&
|
|
115
|
+
res.body.mediaConnections[0];
|
|
116
|
+
|
|
117
|
+
LoggerProxy.logger.debug(
|
|
118
|
+
`Roap:request#sendRoap --> response:${JSON.stringify(
|
|
119
|
+
mediaConnections,
|
|
120
|
+
null,
|
|
121
|
+
2
|
|
122
|
+
)}'\n StatusCode:'${res.statusCode}`
|
|
123
|
+
);
|
|
124
|
+
const {locus} = res.body;
|
|
125
|
+
|
|
126
|
+
locus.roapSeq = options.roapMessage.seq;
|
|
127
|
+
|
|
128
|
+
return {
|
|
129
|
+
locus,
|
|
130
|
+
...(mediaConnections && {mediaConnections: res.body.mediaConnections}),
|
|
131
|
+
};
|
|
132
|
+
})
|
|
133
|
+
.catch((err) => {
|
|
134
|
+
// @ts-ignore
|
|
135
|
+
this.webex.internal.newMetrics.submitClientEvent({
|
|
136
|
+
name: 'client.locus.media.response',
|
|
137
|
+
options: {
|
|
140
138
|
meetingId,
|
|
141
|
-
|
|
142
|
-
}
|
|
143
|
-
LoggerProxy.logger.error(
|
|
144
|
-
`Roap:request#sendRoap --> Error:${JSON.stringify(err, null, 2)}`
|
|
145
|
-
);
|
|
146
|
-
LoggerProxy.logger.error(
|
|
147
|
-
`Roap:request#sendRoapRequest --> errorBody:${JSON.stringify(
|
|
148
|
-
roapMessage,
|
|
149
|
-
null,
|
|
150
|
-
2
|
|
151
|
-
)} + '\\n mediaId:'${options.mediaId}`
|
|
152
|
-
);
|
|
153
|
-
throw err;
|
|
139
|
+
rawError: err,
|
|
140
|
+
},
|
|
154
141
|
});
|
|
155
|
-
|
|
142
|
+
LoggerProxy.logger.error(`Roap:request#sendRoap --> Error:${JSON.stringify(err, null, 2)}`);
|
|
143
|
+
LoggerProxy.logger.error(
|
|
144
|
+
`Roap:request#sendRoapRequest --> errorBody:${JSON.stringify(
|
|
145
|
+
roapMessage,
|
|
146
|
+
null,
|
|
147
|
+
2
|
|
148
|
+
)} + '\\n mediaId:'${options.mediaId}`
|
|
149
|
+
);
|
|
150
|
+
throw err;
|
|
151
|
+
});
|
|
156
152
|
}
|
|
157
153
|
}
|
|
@@ -8,6 +8,7 @@ import {ROAP} from '../constants';
|
|
|
8
8
|
|
|
9
9
|
import RoapRequest from './request';
|
|
10
10
|
import Meeting from '../meeting';
|
|
11
|
+
import MeetingUtil from '../meeting/util';
|
|
11
12
|
|
|
12
13
|
const TURN_DISCOVERY_TIMEOUT = 10; // in seconds
|
|
13
14
|
|
|
@@ -176,15 +177,14 @@ export default class TurnDiscovery {
|
|
|
176
177
|
return this.roapRequest
|
|
177
178
|
.sendRoap({
|
|
178
179
|
roapMessage,
|
|
179
|
-
correlationId: meeting.correlationId,
|
|
180
180
|
// @ts-ignore - Fix missing type
|
|
181
181
|
locusSelfUrl: meeting.selfUrl,
|
|
182
182
|
// @ts-ignore - Fix missing type
|
|
183
183
|
mediaId: isReconnecting ? '' : meeting.mediaId,
|
|
184
|
-
audioMuted: meeting.isAudioMuted(),
|
|
185
|
-
videoMuted: meeting.isVideoMuted(),
|
|
186
184
|
meetingId: meeting.id,
|
|
187
|
-
|
|
185
|
+
locusMediaRequest: meeting.locusMediaRequest,
|
|
186
|
+
// @ts-ignore - because of meeting.webex
|
|
187
|
+
ipVersion: MeetingUtil.getIpVersion(meeting.webex),
|
|
188
188
|
})
|
|
189
189
|
.then(({mediaConnections}) => {
|
|
190
190
|
if (mediaConnections) {
|
|
@@ -213,14 +213,45 @@ export default class TurnDiscovery {
|
|
|
213
213
|
locusSelfUrl: meeting.selfUrl,
|
|
214
214
|
// @ts-ignore - fix type
|
|
215
215
|
mediaId: meeting.mediaId,
|
|
216
|
-
correlationId: meeting.correlationId,
|
|
217
|
-
audioMuted: meeting.isAudioMuted(),
|
|
218
|
-
videoMuted: meeting.isVideoMuted(),
|
|
219
216
|
meetingId: meeting.id,
|
|
220
|
-
|
|
217
|
+
locusMediaRequest: meeting.locusMediaRequest,
|
|
221
218
|
});
|
|
222
219
|
}
|
|
223
220
|
|
|
221
|
+
/**
|
|
222
|
+
* Gets the reason why reachability is skipped.
|
|
223
|
+
*
|
|
224
|
+
* @param {Meeting} meeting
|
|
225
|
+
* @returns {Promise<string>} Promise with empty string if reachability is not skipped or a reason if it is skipped
|
|
226
|
+
*/
|
|
227
|
+
private async getSkipReason(meeting: Meeting): Promise<string> {
|
|
228
|
+
const isAnyPublicClusterReachable =
|
|
229
|
+
// @ts-ignore - fix type
|
|
230
|
+
await meeting.webex.meetings.reachability.isAnyPublicClusterReachable();
|
|
231
|
+
|
|
232
|
+
if (isAnyPublicClusterReachable) {
|
|
233
|
+
LoggerProxy.logger.info(
|
|
234
|
+
'Roap:turnDiscovery#getSkipReason --> reachability has not failed, skipping TURN discovery'
|
|
235
|
+
);
|
|
236
|
+
|
|
237
|
+
return 'reachability';
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
return '';
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* Checks if TURN discovery is skipped.
|
|
245
|
+
*
|
|
246
|
+
* @param {Meeting} meeting
|
|
247
|
+
* @returns {Boolean} true if TURN discovery is being skipped, false if it is being done
|
|
248
|
+
*/
|
|
249
|
+
async isSkipped(meeting) {
|
|
250
|
+
const skipReason = await this.getSkipReason(meeting);
|
|
251
|
+
|
|
252
|
+
return !!skipReason;
|
|
253
|
+
}
|
|
254
|
+
|
|
224
255
|
/**
|
|
225
256
|
* Retrieves TURN server information from the backend by doing
|
|
226
257
|
* a roap message exchange:
|
|
@@ -234,34 +265,25 @@ export default class TurnDiscovery {
|
|
|
234
265
|
* so it works fine no matter if TURN discovery is done or not.
|
|
235
266
|
*
|
|
236
267
|
* @param {Meeting} meeting
|
|
237
|
-
* @param {Boolean} isReconnecting should be set to true if this is a new
|
|
268
|
+
* @param {Boolean} [isReconnecting] should be set to true if this is a new
|
|
238
269
|
* media connection just after a reconnection
|
|
270
|
+
* @param {Boolean} [isForced]
|
|
239
271
|
* @returns {Promise}
|
|
240
272
|
*/
|
|
241
|
-
async doTurnDiscovery(meeting: Meeting, isReconnecting?: boolean) {
|
|
242
|
-
|
|
243
|
-
const isAnyClusterReachable = await meeting.webex.meetings.reachability.isAnyClusterReachable();
|
|
273
|
+
async doTurnDiscovery(meeting: Meeting, isReconnecting?: boolean, isForced?: boolean) {
|
|
274
|
+
let turnDiscoverySkippedReason: string;
|
|
244
275
|
|
|
245
|
-
if (
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
);
|
|
276
|
+
if (!isForced) {
|
|
277
|
+
turnDiscoverySkippedReason = await this.getSkipReason(meeting);
|
|
278
|
+
}
|
|
249
279
|
|
|
280
|
+
if (turnDiscoverySkippedReason) {
|
|
250
281
|
return {
|
|
251
282
|
turnServerInfo: undefined,
|
|
252
|
-
turnDiscoverySkippedReason
|
|
283
|
+
turnDiscoverySkippedReason,
|
|
253
284
|
};
|
|
254
285
|
}
|
|
255
286
|
|
|
256
|
-
// @ts-ignore - fix type
|
|
257
|
-
if (!meeting.config.experimental.enableTurnDiscovery) {
|
|
258
|
-
LoggerProxy.logger.info(
|
|
259
|
-
'Roap:turnDiscovery#doTurnDiscovery --> TURN discovery disabled in config, skipping it'
|
|
260
|
-
);
|
|
261
|
-
|
|
262
|
-
return {turnServerInfo: undefined, turnDiscoverySkippedReason: 'config'};
|
|
263
|
-
}
|
|
264
|
-
|
|
265
287
|
return this.sendRoapTurnDiscoveryRequest(meeting, isReconnecting)
|
|
266
288
|
.then(() => this.waitForTurnDiscoveryResponse())
|
|
267
289
|
.then(() => this.sendRoapOK(meeting))
|