@webex/plugin-meetings 3.0.0-beta.25 → 3.0.0-beta.250
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 +114 -14
- 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 +841 -19
- package/dist/breakouts/index.js.map +1 -1
- package/dist/breakouts/request.js +78 -0
- package/dist/breakouts/request.js.map +1 -0
- package/dist/breakouts/utils.js +67 -0
- package/dist/breakouts/utils.js.map +1 -0
- package/dist/common/errors/webex-errors.js +28 -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/queue.js +24 -9
- package/dist/common/queue.js.map +1 -1
- package/dist/config.js +5 -10
- package/dist/config.js.map +1 -1
- package/dist/constants.js +193 -28
- package/dist/constants.js.map +1 -1
- package/dist/controls-options-manager/constants.js +14 -0
- package/dist/controls-options-manager/constants.js.map +1 -0
- package/dist/controls-options-manager/enums.js +27 -0
- package/dist/controls-options-manager/enums.js.map +1 -0
- package/dist/controls-options-manager/index.js +297 -0
- package/dist/controls-options-manager/index.js.map +1 -0
- 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 +319 -0
- package/dist/controls-options-manager/util.js.map +1 -0
- package/dist/index.js +106 -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 +381 -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 +43 -1
- package/dist/locus-info/mediaSharesUtils.js.map +1 -1
- package/dist/locus-info/parser.js +224 -63
- 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 +49 -106
- package/dist/media/index.js.map +1 -1
- package/dist/media/properties.js +29 -90
- package/dist/media/properties.js.map +1 -1
- package/dist/meeting/in-meeting-actions.js +90 -2
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +2627 -2557
- 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 +228 -123
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.js +256 -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 +48 -7
- package/dist/meeting-info/index.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js +171 -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 +22 -0
- package/dist/meetings/collection.js.map +1 -1
- package/dist/meetings/index.js +370 -90
- 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 +88 -1
- package/dist/meetings/util.js.map +1 -1
- package/dist/member/index.js +49 -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 +121 -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 +86 -5
- 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 +316 -233
- package/dist/members/util.js.map +1 -1
- package/dist/metrics/constants.js +6 -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 +49 -16
- package/dist/multistream/receiveSlot.js.map +1 -1
- package/dist/multistream/receiveSlotManager.js +52 -34
- 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/reachability/index.js +81 -30
- package/dist/reachability/index.js.map +1 -1
- package/dist/reachability/request.js +16 -7
- package/dist/reachability/request.js.map +1 -1
- package/dist/reconnection-manager/index.js +199 -154
- 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 +23 -29
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.js +112 -89
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/turnDiscovery.js +96 -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 +51 -34
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.js +6 -6
- 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/request.d.ts +22 -0
- package/dist/types/breakouts/utils.d.ts +15 -0
- package/dist/types/common/errors/webex-errors.d.ts +13 -1
- package/dist/types/common/queue.d.ts +9 -7
- package/dist/types/config.d.ts +1 -6
- package/dist/types/constants.d.ts +155 -21
- package/dist/types/controls-options-manager/constants.d.ts +4 -0
- package/dist/types/controls-options-manager/enums.d.ts +15 -0
- package/dist/types/controls-options-manager/index.d.ts +136 -0
- package/dist/types/controls-options-manager/types.d.ts +43 -0
- package/dist/types/controls-options-manager/util.d.ts +1 -0
- 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 +65 -6
- package/dist/types/media/index.d.ts +2 -0
- package/dist/types/media/properties.d.ts +22 -36
- package/dist/types/meeting/in-meeting-actions.d.ts +90 -2
- package/dist/types/meeting/index.d.ts +312 -492
- package/dist/types/meeting/locusMediaRequest.d.ts +74 -0
- package/dist/types/meeting/muteState.d.ts +98 -22
- 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 +6 -1
- package/dist/types/meeting-info/meeting-info-v2.d.ts +30 -1
- package/dist/types/meetings/collection.d.ts +8 -0
- package/dist/types/meetings/index.d.ts +76 -12
- package/dist/types/meetings/meetings.types.d.ts +4 -0
- package/dist/types/member/index.d.ts +13 -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 +24 -0
- package/dist/types/members/util.d.ts +209 -1
- package/dist/types/metrics/constants.d.ts +5 -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 +16 -12
- package/dist/types/multistream/receiveSlotManager.d.ts +19 -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/reachability/index.d.ts +15 -3
- 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/request.d.ts +15 -11
- package/dist/types/roap/turnDiscovery.d.ts +18 -1
- 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 +6 -1
- 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 +44 -14
- package/src/breakouts/breakout.ts +87 -9
- package/src/breakouts/edit-lock-error.ts +25 -0
- package/src/breakouts/events.ts +56 -0
- package/src/breakouts/index.ts +710 -10
- package/src/breakouts/request.ts +55 -0
- package/src/breakouts/utils.ts +57 -0
- package/src/common/errors/webex-errors.ts +27 -2
- package/src/common/logs/logger-proxy.ts +1 -1
- package/src/common/queue.ts +22 -8
- package/src/config.ts +4 -9
- package/src/constants.ts +176 -18
- package/src/controls-options-manager/constants.ts +5 -0
- package/src/controls-options-manager/enums.ts +18 -0
- package/src/controls-options-manager/index.ts +278 -0
- package/src/controls-options-manager/types.ts +59 -0
- package/src/controls-options-manager/util.ts +300 -0
- package/src/index.ts +39 -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 +412 -59
- package/src/locus-info/infoUtils.ts +10 -2
- package/src/locus-info/mediaSharesUtils.ts +48 -0
- package/src/locus-info/parser.ts +231 -39
- package/src/locus-info/selfUtils.ts +81 -5
- package/src/media/index.ts +89 -109
- package/src/media/properties.ts +48 -87
- package/src/meeting/in-meeting-actions.ts +179 -3
- package/src/meeting/index.ts +2111 -2143
- package/src/meeting/locusMediaRequest.ts +313 -0
- package/src/meeting/muteState.ts +227 -130
- package/src/meeting/request.ts +172 -121
- package/src/meeting/util.ts +588 -395
- package/src/meeting-info/index.ts +54 -8
- package/src/meeting-info/meeting-info-v2.ts +148 -14
- package/src/meeting-info/util.ts +1 -1
- package/src/meeting-info/utilv2.ts +23 -23
- package/src/meetings/collection.ts +20 -0
- package/src/meetings/index.ts +407 -108
- package/src/meetings/meetings.types.ts +12 -0
- package/src/meetings/request.ts +2 -0
- package/src/meetings/util.ts +103 -4
- package/src/member/index.ts +49 -0
- package/src/member/types.ts +38 -0
- package/src/member/util.ts +127 -25
- package/src/members/collection.ts +8 -0
- package/src/members/index.ts +107 -6
- package/src/members/request.ts +97 -17
- package/src/members/types.ts +28 -0
- package/src/members/util.ts +319 -240
- package/src/metrics/constants.ts +5 -4
- package/src/metrics/index.ts +1 -490
- package/src/multistream/mediaRequestManager.ts +289 -79
- package/src/multistream/receiveSlot.ts +55 -18
- package/src/multistream/receiveSlotManager.ts +46 -24
- package/src/multistream/remoteMedia.ts +27 -2
- package/src/multistream/remoteMediaGroup.ts +59 -0
- package/src/multistream/remoteMediaManager.ts +148 -30
- package/src/reachability/index.ts +69 -17
- package/src/reachability/request.ts +16 -7
- package/src/reconnection-manager/index.ts +81 -54
- package/src/recording-controller/index.ts +20 -3
- package/src/recording-controller/util.ts +26 -9
- package/src/roap/index.ts +23 -30
- package/src/roap/request.ts +104 -95
- package/src/roap/turnDiscovery.ts +50 -25
- package/src/rtcMetrics/constants.ts +3 -0
- package/src/rtcMetrics/index.ts +100 -0
- package/src/statsAnalyzer/index.ts +73 -35
- package/src/statsAnalyzer/mqaUtil.ts +8 -10
- package/test/integration/spec/converged-space-meetings.js +233 -0
- package/test/integration/spec/journey.js +336 -259
- 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 +142 -24
- 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 +1545 -48
- package/test/unit/spec/breakouts/request.ts +104 -0
- package/test/unit/spec/breakouts/utils.js +72 -0
- package/test/unit/spec/common/queue.js +31 -2
- package/test/unit/spec/controls-options-manager/index.js +287 -0
- package/test/unit/spec/controls-options-manager/util.js +582 -0
- 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 +1283 -33
- package/test/unit/spec/locus-info/infoUtils.js +37 -15
- package/test/unit/spec/locus-info/mediaSharesUtils.ts +22 -0
- package/test/unit/spec/locus-info/parser.js +62 -22
- 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 +138 -28
- package/test/unit/spec/meeting/in-meeting-actions.ts +89 -3
- package/test/unit/spec/meeting/index.js +3576 -1748
- package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
- package/test/unit/spec/meeting/muteState.js +370 -208
- package/test/unit/spec/meeting/request.js +440 -45
- package/test/unit/spec/meeting/utils.js +671 -54
- package/test/unit/spec/meeting-info/index.js +181 -0
- package/test/unit/spec/meeting-info/meetinginfov2.js +383 -5
- package/test/unit/spec/meeting-info/utilv2.js +21 -0
- package/test/unit/spec/meetings/collection.js +14 -0
- package/test/unit/spec/meetings/index.js +939 -150
- package/test/unit/spec/meetings/utils.js +206 -2
- package/test/unit/spec/member/index.js +58 -4
- package/test/unit/spec/member/util.js +479 -35
- package/test/unit/spec/members/index.js +319 -1
- package/test/unit/spec/members/request.js +206 -27
- package/test/unit/spec/members/utils.js +184 -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 +72 -13
- package/test/unit/spec/multistream/receiveSlotManager.ts +58 -28
- 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/reachability/index.ts +185 -7
- package/test/unit/spec/reachability/request.js +68 -0
- package/test/unit/spec/reconnection-manager/index.js +80 -6
- 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 +31 -51
- package/test/unit/spec/roap/request.ts +202 -85
- package/test/unit/spec/roap/turnDiscovery.ts +45 -10
- package/test/unit/spec/rtcMetrics/index.ts +68 -0
- package/test/unit/spec/stats-analyzer/index.js +29 -2
- package/test/utils/constants.js +9 -0
- package/test/utils/integrationTestUtils.js +46 -0
- package/test/utils/testUtils.js +0 -45
- package/test/utils/webex-config.js +4 -0
- package/test/utils/webex-test-users.js +6 -3
- 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 LoggerProxy from '../common/logs/logger-proxy';
|
|
2
|
-
import {HTTP_VERBS, RESOURCE, API} from '../constants';
|
|
2
|
+
import {HTTP_VERBS, RESOURCE, API, IP_VERSION} from '../constants';
|
|
3
3
|
|
|
4
4
|
export interface ClusterNode {
|
|
5
5
|
isVideoMesh: boolean;
|
|
@@ -28,31 +28,40 @@ class ReachabilityRequest {
|
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
/**
|
|
31
|
-
*
|
|
31
|
+
* Gets the cluster information
|
|
32
32
|
*
|
|
33
|
-
* @param {
|
|
33
|
+
* @param {IP_VERSION} ipVersion information about current ip network we're on
|
|
34
34
|
* @returns {Promise}
|
|
35
35
|
*/
|
|
36
|
-
getClusters = (): Promise<ClusterList> =>
|
|
36
|
+
getClusters = (ipVersion?: IP_VERSION): Promise<{clusters: ClusterList; joinCookie: any}> =>
|
|
37
37
|
this.webex
|
|
38
38
|
.request({
|
|
39
39
|
method: HTTP_VERBS.GET,
|
|
40
40
|
shouldRefreshAccessToken: false,
|
|
41
41
|
api: API.CALLIOPEDISCOVERY,
|
|
42
42
|
resource: RESOURCE.CLUSTERS,
|
|
43
|
+
qs: {
|
|
44
|
+
JCSupport: 1,
|
|
45
|
+
ipver: ipVersion,
|
|
46
|
+
},
|
|
43
47
|
})
|
|
44
48
|
.then((res) => {
|
|
45
|
-
const {clusters} = res.body;
|
|
49
|
+
const {clusters, joinCookie} = res.body;
|
|
46
50
|
|
|
47
51
|
Object.keys(clusters).forEach((key) => {
|
|
48
52
|
clusters[key].isVideoMesh = res.body.clusterClasses?.hybridMedia?.includes(key);
|
|
49
53
|
});
|
|
50
54
|
|
|
51
55
|
LoggerProxy.logger.log(
|
|
52
|
-
`Reachability:request#getClusters --> get clusters successful:${JSON.stringify(
|
|
56
|
+
`Reachability:request#getClusters --> get clusters (ipver=${ipVersion}) successful:${JSON.stringify(
|
|
57
|
+
clusters
|
|
58
|
+
)}`
|
|
53
59
|
);
|
|
54
60
|
|
|
55
|
-
return
|
|
61
|
+
return {
|
|
62
|
+
clusters,
|
|
63
|
+
joinCookie,
|
|
64
|
+
};
|
|
56
65
|
});
|
|
57
66
|
|
|
58
67
|
/**
|
|
@@ -18,10 +18,9 @@ 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 {eventType, reconnection, errorObjects} from '../metrics/config';
|
|
22
|
-
import Media from '../media';
|
|
23
21
|
import Metrics from '../metrics';
|
|
24
22
|
import Meeting from '../meeting';
|
|
23
|
+
import {MediaRequestManager} from '../multistream/mediaRequestManager';
|
|
25
24
|
|
|
26
25
|
/**
|
|
27
26
|
* Used to indicate that the reconnect logic needs to be retried.
|
|
@@ -231,6 +230,32 @@ export default class ReconnectionManager {
|
|
|
231
230
|
this.meeting = null;
|
|
232
231
|
}
|
|
233
232
|
|
|
233
|
+
/**
|
|
234
|
+
* Stop the local share track.
|
|
235
|
+
*
|
|
236
|
+
* @param {string} reason a {@link SHARE_STOPPED_REASON}
|
|
237
|
+
* @returns {undefined}
|
|
238
|
+
* @private
|
|
239
|
+
* @memberof ReconnectionManager
|
|
240
|
+
*/
|
|
241
|
+
private async stopLocalShareTrack(reason: string) {
|
|
242
|
+
await this.meeting.unpublishTracks([
|
|
243
|
+
this.meeting.mediaProperties.shareVideoTrack,
|
|
244
|
+
this.meeting.mediaProperties.shareAudioTrack,
|
|
245
|
+
]);
|
|
246
|
+
Trigger.trigger(
|
|
247
|
+
this.meeting,
|
|
248
|
+
{
|
|
249
|
+
file: 'reconnection-manager/index',
|
|
250
|
+
function: 'stopLocalShareTrack',
|
|
251
|
+
},
|
|
252
|
+
EVENT_TRIGGERS.MEETING_STOPPED_SHARING_LOCAL,
|
|
253
|
+
{
|
|
254
|
+
reason,
|
|
255
|
+
}
|
|
256
|
+
);
|
|
257
|
+
}
|
|
258
|
+
|
|
234
259
|
/**
|
|
235
260
|
* @public
|
|
236
261
|
* @memberof ReconnectionManager
|
|
@@ -302,9 +327,13 @@ export default class ReconnectionManager {
|
|
|
302
327
|
LoggerProxy.logger.info(
|
|
303
328
|
'ReconnectionManager:index#reconnect --> Sending reconnect start metric.'
|
|
304
329
|
);
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
330
|
+
|
|
331
|
+
// @ts-ignore
|
|
332
|
+
this.webex.internal.newMetrics.submitClientEvent({
|
|
333
|
+
name: 'client.media.reconnecting',
|
|
334
|
+
options: {
|
|
335
|
+
meetingId: this.meeting.id,
|
|
336
|
+
},
|
|
308
337
|
});
|
|
309
338
|
}
|
|
310
339
|
|
|
@@ -314,10 +343,16 @@ export default class ReconnectionManager {
|
|
|
314
343
|
LoggerProxy.logger.info(
|
|
315
344
|
'ReconnectionManager:index#reconnect --> Sending reconnect success metric.'
|
|
316
345
|
);
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
346
|
+
|
|
347
|
+
// @ts-ignore
|
|
348
|
+
this.webex.internal.newMetrics.submitClientEvent({
|
|
349
|
+
name: 'client.media.recovered',
|
|
350
|
+
payload: {
|
|
351
|
+
recoveredBy: 'new',
|
|
352
|
+
},
|
|
353
|
+
options: {
|
|
354
|
+
meetingId: this.meeting.id,
|
|
355
|
+
},
|
|
321
356
|
});
|
|
322
357
|
})
|
|
323
358
|
.catch((reconnectError) => {
|
|
@@ -341,23 +376,24 @@ export default class ReconnectionManager {
|
|
|
341
376
|
'ReconnectionManager:index#reconnect --> Sending reconnect abort metric.'
|
|
342
377
|
);
|
|
343
378
|
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
379
|
+
// @ts-ignore
|
|
380
|
+
this.webex.internal.newMetrics.submitClientEvent({
|
|
381
|
+
name: 'client.call.aborted',
|
|
382
|
+
payload: {
|
|
348
383
|
errors: [
|
|
349
384
|
{
|
|
350
|
-
category:
|
|
385
|
+
category: 'expected',
|
|
351
386
|
errorCode: 2008,
|
|
352
387
|
fatal: true,
|
|
353
|
-
name:
|
|
388
|
+
name: 'media-engine',
|
|
354
389
|
shownToUser: false,
|
|
355
390
|
},
|
|
356
391
|
],
|
|
357
392
|
},
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
393
|
+
options: {
|
|
394
|
+
meetingId: this.meeting.id,
|
|
395
|
+
},
|
|
396
|
+
});
|
|
361
397
|
if (reconnectError instanceof NeedsRejoinError) {
|
|
362
398
|
// send call aborded event with catogery as expected as we are trying to rejoin
|
|
363
399
|
|
|
@@ -385,6 +421,12 @@ export default class ReconnectionManager {
|
|
|
385
421
|
'ReconnectionManager:index#executeReconnection --> Attempting to reconnect to meeting.'
|
|
386
422
|
);
|
|
387
423
|
|
|
424
|
+
const wasSharing = this.meeting.shareStatus === SHARE_STATUS.LOCAL_SHARE_ACTIVE;
|
|
425
|
+
|
|
426
|
+
if (wasSharing) {
|
|
427
|
+
await this.stopLocalShareTrack(SHARE_STOPPED_REASON.MEDIA_RECONNECTION);
|
|
428
|
+
}
|
|
429
|
+
|
|
388
430
|
if (networkDisconnect) {
|
|
389
431
|
try {
|
|
390
432
|
await this.reconnectMercuryWebSocket();
|
|
@@ -401,29 +443,29 @@ export default class ReconnectionManager {
|
|
|
401
443
|
}
|
|
402
444
|
}
|
|
403
445
|
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
446
|
+
if (!this.webex.credentials.isUnverifiedGuest) {
|
|
447
|
+
try {
|
|
448
|
+
LoggerProxy.logger.info(
|
|
449
|
+
'ReconnectionManager:index#executeReconnection --> Updating meeting data from server.'
|
|
450
|
+
);
|
|
451
|
+
await this.webex.meetings.syncMeetings();
|
|
452
|
+
} catch (syncError) {
|
|
453
|
+
LoggerProxy.logger.info(
|
|
454
|
+
'ReconnectionManager:index#executeReconnection --> Unable to sync meetings, reconnecting.',
|
|
455
|
+
syncError
|
|
456
|
+
);
|
|
457
|
+
throw new NeedsRetryError(syncError);
|
|
458
|
+
}
|
|
417
459
|
}
|
|
418
460
|
|
|
419
461
|
// TODO: try to improve this logic as the reconnection manager saves the instance of deleted meeting object
|
|
420
462
|
// So that on rejoin it known what parametrs it was using
|
|
421
463
|
if (!this.meeting || !this.webex.meetings.getMeetingByType(_ID_, this.meeting.id)) {
|
|
422
464
|
LoggerProxy.logger.info(
|
|
423
|
-
'ReconnectionManager:index#executeReconnection --> Meeting got deleted due to inactivity or ended remotely
|
|
465
|
+
'ReconnectionManager:index#executeReconnection --> Meeting got deleted due to inactivity or ended remotely.'
|
|
424
466
|
);
|
|
425
467
|
|
|
426
|
-
throw new Error('Unable to rejoin a meeting already ended or inactive
|
|
468
|
+
throw new Error('Unable to rejoin a meeting already ended or inactive.');
|
|
427
469
|
}
|
|
428
470
|
|
|
429
471
|
LoggerProxy.logger.info(
|
|
@@ -475,24 +517,7 @@ export default class ReconnectionManager {
|
|
|
475
517
|
LoggerProxy.logger.info('ReconnectionManager:index#rejoinMeeting --> meeting rejoined');
|
|
476
518
|
|
|
477
519
|
if (wasSharing) {
|
|
478
|
-
|
|
479
|
-
Media.stopTracks(this.meeting.mediaProperties.shareTrack);
|
|
480
|
-
this.meeting.isSharing = false;
|
|
481
|
-
if (this.shareStatus === SHARE_STATUS.LOCAL_SHARE_ACTIVE) {
|
|
482
|
-
this.meeting.shareStatus = SHARE_STATUS.NO_SHARE;
|
|
483
|
-
}
|
|
484
|
-
this.meeting.mediaProperties.mediaDirection.sendShare = false;
|
|
485
|
-
Trigger.trigger(
|
|
486
|
-
this.meeting,
|
|
487
|
-
{
|
|
488
|
-
file: 'reconnection-manager/index',
|
|
489
|
-
function: 'rejoinMeeting',
|
|
490
|
-
},
|
|
491
|
-
EVENT_TRIGGERS.MEETING_STOPPED_SHARING_LOCAL,
|
|
492
|
-
{
|
|
493
|
-
reason: SHARE_STOPPED_REASON.MEETING_REJOIN,
|
|
494
|
-
}
|
|
495
|
-
);
|
|
520
|
+
await this.stopLocalShareTrack(SHARE_STOPPED_REASON.MEETING_REJOIN);
|
|
496
521
|
}
|
|
497
522
|
} catch (joinError) {
|
|
498
523
|
this.rejoinAttempts += 1;
|
|
@@ -555,9 +580,11 @@ export default class ReconnectionManager {
|
|
|
555
580
|
|
|
556
581
|
// resend media requests
|
|
557
582
|
if (this.meeting.isMultistream) {
|
|
558
|
-
Object.values(this.meeting.mediaRequestManagers).forEach(
|
|
559
|
-
|
|
560
|
-
|
|
583
|
+
Object.values(this.meeting.mediaRequestManagers).forEach(
|
|
584
|
+
(mediaRequestManager: MediaRequestManager) => {
|
|
585
|
+
mediaRequestManager.clearPreviousRequests();
|
|
586
|
+
mediaRequestManager.commit();
|
|
587
|
+
}
|
|
561
588
|
);
|
|
562
589
|
}
|
|
563
590
|
}
|
|
@@ -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,7 @@ 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';
|
|
10
11
|
|
|
11
12
|
/**
|
|
12
13
|
* Roap options
|
|
@@ -98,11 +99,8 @@ export default class Roap extends StatelessWebexPlugin {
|
|
|
98
99
|
roapMessage,
|
|
99
100
|
locusSelfUrl: meeting.selfUrl,
|
|
100
101
|
mediaId: options.mediaId,
|
|
101
|
-
correlationId: options.correlationId,
|
|
102
|
-
audioMuted: meeting.isAudioMuted(),
|
|
103
|
-
videoMuted: meeting.isVideoMuted(),
|
|
104
102
|
meetingId: meeting.id,
|
|
105
|
-
|
|
103
|
+
locusMediaRequest: meeting.locusMediaRequest,
|
|
106
104
|
})
|
|
107
105
|
.then(() => {
|
|
108
106
|
LoggerProxy.logger.log(`Roap:index#sendRoapOK --> ROAP OK sent with seq ${options.seq}`);
|
|
@@ -135,11 +133,8 @@ export default class Roap extends StatelessWebexPlugin {
|
|
|
135
133
|
roapMessage,
|
|
136
134
|
locusSelfUrl: meeting.selfUrl,
|
|
137
135
|
mediaId: options.mediaId,
|
|
138
|
-
correlationId: options.correlationId,
|
|
139
|
-
audioMuted: meeting.isAudioMuted(),
|
|
140
|
-
videoMuted: meeting.isVideoMuted(),
|
|
141
136
|
meetingId: meeting.id,
|
|
142
|
-
|
|
137
|
+
locusMediaRequest: meeting.locusMediaRequest,
|
|
143
138
|
});
|
|
144
139
|
}
|
|
145
140
|
|
|
@@ -167,11 +162,8 @@ export default class Roap extends StatelessWebexPlugin {
|
|
|
167
162
|
roapMessage,
|
|
168
163
|
locusSelfUrl: meeting.selfUrl,
|
|
169
164
|
mediaId: options.mediaId,
|
|
170
|
-
correlationId: options.correlationId,
|
|
171
|
-
audioMuted: meeting.isAudioMuted(),
|
|
172
|
-
videoMuted: meeting.isVideoMuted(),
|
|
173
165
|
meetingId: meeting.id,
|
|
174
|
-
|
|
166
|
+
locusMediaRequest: meeting.locusMediaRequest,
|
|
175
167
|
})
|
|
176
168
|
.then(() => {
|
|
177
169
|
LoggerProxy.logger.log(
|
|
@@ -199,26 +191,27 @@ export default class Roap extends StatelessWebexPlugin {
|
|
|
199
191
|
// When reconnecting, it's important that the first roap message being sent out has empty media id.
|
|
200
192
|
// Normally this is the roap offer, but when TURN discovery is enabled,
|
|
201
193
|
// then this is the TURN discovery request message
|
|
202
|
-
|
|
194
|
+
return this.turnDiscovery.isSkipped(meeting).then((isTurnDiscoverySkipped) => {
|
|
195
|
+
const sendEmptyMediaId = reconnect && isTurnDiscoverySkipped;
|
|
203
196
|
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
}
|
|
197
|
+
return this.roapRequest
|
|
198
|
+
.sendRoap({
|
|
199
|
+
roapMessage,
|
|
200
|
+
locusSelfUrl: meeting.selfUrl,
|
|
201
|
+
mediaId: sendEmptyMediaId ? '' : meeting.mediaId,
|
|
202
|
+
meetingId: meeting.id,
|
|
203
|
+
preferTranscoding: !meeting.isMultistream,
|
|
204
|
+
locusMediaRequest: meeting.locusMediaRequest,
|
|
205
|
+
ipVersion: MeetingUtil.getIpVersion(meeting.webex),
|
|
206
|
+
})
|
|
207
|
+
.then(({locus, mediaConnections}) => {
|
|
208
|
+
if (mediaConnections) {
|
|
209
|
+
meeting.updateMediaConnections(mediaConnections);
|
|
210
|
+
}
|
|
219
211
|
|
|
220
|
-
|
|
221
|
-
|
|
212
|
+
return locus;
|
|
213
|
+
});
|
|
214
|
+
});
|
|
222
215
|
}
|
|
223
216
|
|
|
224
217
|
/**
|