@webex/plugin-meetings 3.0.0-beta.0 → 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 +1130 -647
- 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} +1016 -550
- 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
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
import { parse } from '@webex/ts-sdp';
|
|
2
|
-
|
|
3
|
-
interface IPeerConnectionUtils {
|
|
4
|
-
convertCLineToIpv4: (sdp: string) => string;
|
|
5
|
-
adjustH264Profile: (sdp: string, maxFsValue: number) => string;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
const PeerConnectionUtils = {} as IPeerConnectionUtils;
|
|
9
|
-
|
|
10
|
-
// max-fs values for all H264 profile levels
|
|
11
|
-
const maxFsForProfileLevel = {
|
|
12
|
-
10: 99,
|
|
13
|
-
11: 396,
|
|
14
|
-
12: 396,
|
|
15
|
-
13: 396,
|
|
16
|
-
20: 396,
|
|
17
|
-
21: 792,
|
|
18
|
-
22: 1620,
|
|
19
|
-
30: 1620,
|
|
20
|
-
31: 3600,
|
|
21
|
-
32: 5120,
|
|
22
|
-
40: 8192,
|
|
23
|
-
41: 8192,
|
|
24
|
-
42: 8704,
|
|
25
|
-
50: 22080,
|
|
26
|
-
51: 36864,
|
|
27
|
-
52: 36864,
|
|
28
|
-
60: 139264,
|
|
29
|
-
61: 139264,
|
|
30
|
-
62: 139264,
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
const framesPerSecond = 30;
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Convert C line to IPv4
|
|
37
|
-
* @param {string} sdp
|
|
38
|
-
* @returns {string}
|
|
39
|
-
*/
|
|
40
|
-
PeerConnectionUtils.convertCLineToIpv4 = (sdp: string) => {
|
|
41
|
-
let replaceSdp = sdp;
|
|
42
|
-
|
|
43
|
-
// TODO: remove this once linus supports Ipv6 c line.currently linus rejects SDP with c line having ipv6 candidates we are
|
|
44
|
-
// mocking ipv6 to ipv4 candidates
|
|
45
|
-
// https://jira-eng-gpk2.cisco.com/jira/browse/SPARK-299232
|
|
46
|
-
replaceSdp = replaceSdp.replace(/c=IN IP6 .*/gi, 'c=IN IP4 0.0.0.0');
|
|
47
|
-
|
|
48
|
-
return replaceSdp;
|
|
49
|
-
};
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* estimate profile levels for max-fs & max-mbps values
|
|
53
|
-
* @param {string} sdp
|
|
54
|
-
* @param {number} maxFsValue
|
|
55
|
-
* @returns {string}
|
|
56
|
-
*/
|
|
57
|
-
PeerConnectionUtils.adjustH264Profile = (sdp: string, maxFsValue: number) => {
|
|
58
|
-
// converting with ts-sdp parser, no munging
|
|
59
|
-
const parsedSdp = parse(sdp);
|
|
60
|
-
|
|
61
|
-
parsedSdp.avMedia.forEach((media) => {
|
|
62
|
-
if (media.type === 'video') {
|
|
63
|
-
media.codecs.forEach((codec) => {
|
|
64
|
-
if (codec.name?.toUpperCase() === 'H264') {
|
|
65
|
-
// there should really be just 1 fmtp line, but just in case, we process all of them
|
|
66
|
-
codec.fmtParams = codec.fmtParams.map((fmtp) => {
|
|
67
|
-
const parsedRegex = fmtp.match(/(.*)profile-level-id=(\w{4})(\w{2})(.*)/);
|
|
68
|
-
|
|
69
|
-
if (parsedRegex && parsedRegex.length === 5) {
|
|
70
|
-
const stuffBeforeProfileLevelId = parsedRegex[1];
|
|
71
|
-
const profile = parsedRegex[2].toLowerCase();
|
|
72
|
-
const levelId = parseInt(parsedRegex[3], 16);
|
|
73
|
-
const stuffAfterProfileLevelId = parsedRegex[4];
|
|
74
|
-
|
|
75
|
-
if (!maxFsForProfileLevel[levelId]) {
|
|
76
|
-
throw new Error(
|
|
77
|
-
`found unsupported h264 profile level id value in the SDP: ${levelId}`
|
|
78
|
-
);
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
if (maxFsForProfileLevel[levelId] === maxFsValue) {
|
|
82
|
-
// profile level already matches our desired max-fs value, so we don't need to do anything
|
|
83
|
-
return fmtp;
|
|
84
|
-
}
|
|
85
|
-
if (maxFsForProfileLevel[levelId] < maxFsValue) {
|
|
86
|
-
// profile level has too low max-fs, so we need to override it (this is upgrading)
|
|
87
|
-
return `${fmtp};max-fs=${maxFsValue};max-mbps=${maxFsValue * framesPerSecond}`;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
// profile level has too high max-fs value, so we need to use a lower level
|
|
91
|
-
|
|
92
|
-
// find highest level that has the matching maxFs
|
|
93
|
-
const newLevelId = Object.keys(maxFsForProfileLevel)
|
|
94
|
-
.reverse()
|
|
95
|
-
.find((key) => maxFsForProfileLevel[key] === maxFsValue);
|
|
96
|
-
|
|
97
|
-
if (newLevelId) {
|
|
98
|
-
// Object.keys returns keys as strings, so we need to parse it to an int again and then convert to hex
|
|
99
|
-
const newLevelIdHex = parseInt(newLevelId, 10).toString(16);
|
|
100
|
-
|
|
101
|
-
return `${stuffBeforeProfileLevelId}profile-level-id=${profile}${newLevelIdHex};max-mbps=${maxFsValue * framesPerSecond}${stuffAfterProfileLevelId}`;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
throw new Error(`unsupported maxFsValue: ${maxFsValue}`);
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
return fmtp;
|
|
108
|
-
});
|
|
109
|
-
}
|
|
110
|
-
});
|
|
111
|
-
}
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
return parsedSdp.toString();
|
|
115
|
-
};
|
|
116
|
-
|
|
117
|
-
export default PeerConnectionUtils;
|
package/src/roap/collection.js
DELETED
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
import RoapStateMachine from '../roap/state';
|
|
2
|
-
|
|
3
|
-
/* eslint-disable */
|
|
4
|
-
const RoapCollection = {
|
|
5
|
-
sessions: {},
|
|
6
|
-
|
|
7
|
-
getSession(id) {
|
|
8
|
-
if (!this.sessions[id]) {
|
|
9
|
-
this.sessions[id] = {
|
|
10
|
-
activeSequences: 0,
|
|
11
|
-
};
|
|
12
|
-
}
|
|
13
|
-
return this.sessions[id];
|
|
14
|
-
},
|
|
15
|
-
|
|
16
|
-
deleteSession(id) {
|
|
17
|
-
if (this.getSession(id)) {
|
|
18
|
-
delete this.sessions[id];
|
|
19
|
-
}
|
|
20
|
-
},
|
|
21
|
-
|
|
22
|
-
getSessionSequence(id, seqId) {
|
|
23
|
-
const session = this.getSession(id);
|
|
24
|
-
if (!session[seqId]) {
|
|
25
|
-
session[seqId] = {
|
|
26
|
-
state: RoapStateMachine.createState(),
|
|
27
|
-
finished: false,
|
|
28
|
-
};
|
|
29
|
-
session.activeSequences += 1;
|
|
30
|
-
|
|
31
|
-
}
|
|
32
|
-
return session[seqId];
|
|
33
|
-
},
|
|
34
|
-
|
|
35
|
-
deleteSessionSequence(id, seqId) {
|
|
36
|
-
const seq = this.getSessionSequence(id, seqId);
|
|
37
|
-
if (seq) {
|
|
38
|
-
if (!seq.finished) {
|
|
39
|
-
session.activeSequences -= 1;
|
|
40
|
-
}
|
|
41
|
-
delete this.sessions[id][seqId];
|
|
42
|
-
}
|
|
43
|
-
},
|
|
44
|
-
|
|
45
|
-
isBusy(id) {
|
|
46
|
-
const session = this.getSession(id);
|
|
47
|
-
if (!session) return false;
|
|
48
|
-
|
|
49
|
-
return session.activeSequences > 0;
|
|
50
|
-
},
|
|
51
|
-
|
|
52
|
-
onSessionSequenceFinish(id, seqId) {
|
|
53
|
-
const session = this.getSession(id);
|
|
54
|
-
const seq = session[seqId];
|
|
55
|
-
if (seq && !seq.finished) {
|
|
56
|
-
seq.finished = true;
|
|
57
|
-
session.activeSequences -= 1;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
};
|
|
62
|
-
|
|
63
|
-
export default RoapCollection;
|
package/src/roap/handler.js
DELETED
|
@@ -1,252 +0,0 @@
|
|
|
1
|
-
/* no-param-reassign */
|
|
2
|
-
import {StatelessWebexPlugin} from '@webex/webex-core';
|
|
3
|
-
|
|
4
|
-
import LoggerProxy from '../common/logs/logger-proxy';
|
|
5
|
-
import {ROAP, _OFFER_} from '../constants';
|
|
6
|
-
import Metrics from '../metrics';
|
|
7
|
-
import BEHAVIORAL_METRICS from '../metrics/constants';
|
|
8
|
-
|
|
9
|
-
import RoapUtil from './util';
|
|
10
|
-
import RoapCollection from './collection';
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
const checkForAndHandleErrors = (action, meeting, correlationId) => {
|
|
14
|
-
if (action && action.type) {
|
|
15
|
-
if (action.msg && action.msg.messageType && action.msg.errorType) {
|
|
16
|
-
if (RoapUtil.findError(action.msg.messageType, action.msg.errorType, action.type)) {
|
|
17
|
-
RoapUtil.handleError(meeting.mediaProperties.peerConnection)
|
|
18
|
-
.then((res) => {
|
|
19
|
-
if (res) {
|
|
20
|
-
RoapCollection.deleteSessionSequence(correlationId, action.msg.seq);
|
|
21
|
-
}
|
|
22
|
-
})
|
|
23
|
-
.catch((err) => {
|
|
24
|
-
LoggerProxy.logger.warn(`Roap:handler#checkForAndHandleErrors --> Cannot reset the peer connection with error: ${err}`);
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
return true;
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
if (!RoapUtil.ensureMeeting(meeting, action.type)) {
|
|
31
|
-
return true;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
return false;
|
|
36
|
-
};
|
|
37
|
-
|
|
38
|
-
const compareWithLastRoapMessage = (lastRoapMessage, currentRoapMessage) => lastRoapMessage?.msg?.seq === currentRoapMessage.msg.seq && lastRoapMessage?.msg?.messageType === currentRoapMessage.msg.messageType;
|
|
39
|
-
|
|
40
|
-
const handleSessionStep = ({
|
|
41
|
-
roap, session, locusUrl, correlationId
|
|
42
|
-
}) => {
|
|
43
|
-
const {seq: sequenceId, messageType} = roap.msg;
|
|
44
|
-
|
|
45
|
-
if (session.OFFER && messageType === _OFFER_) {
|
|
46
|
-
session.GLARE_OFFER = roap.msg;
|
|
47
|
-
session.GLARE_OFFER.remote = !!roap.remote;
|
|
48
|
-
const metricName = BEHAVIORAL_METRICS.ROAP_GLARE_CONDITION;
|
|
49
|
-
const data = {
|
|
50
|
-
correlation_id: correlationId,
|
|
51
|
-
locus_id: locusUrl.split('/').pop(),
|
|
52
|
-
sequence: sequenceId
|
|
53
|
-
};
|
|
54
|
-
|
|
55
|
-
Metrics.sendBehavioralMetric(metricName, data);
|
|
56
|
-
|
|
57
|
-
LoggerProxy.logger.warn(`Roap:handler#handleSessionStep --> Glare condition occurred with new mercury event, sequenceId: ${sequenceId}`);
|
|
58
|
-
}
|
|
59
|
-
else {
|
|
60
|
-
LoggerProxy.logger.info(`Roap:handler#handleSessionStep --> Save OFFER/ANSWER seq:${sequenceId} new mercury event ${messageType}local state: ${JSON.stringify(session.state.state, null, 2)}`);
|
|
61
|
-
session[messageType] = roap.msg;
|
|
62
|
-
session[messageType].remote = !!roap.remote;
|
|
63
|
-
}
|
|
64
|
-
};
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* @class RoapHandler
|
|
68
|
-
*/
|
|
69
|
-
export default class RoapHandler extends StatelessWebexPlugin {
|
|
70
|
-
constructor(attrs, options, roapOk, roapAnswer, roapFinished) {
|
|
71
|
-
super({}, options);
|
|
72
|
-
this.attrs = attrs;
|
|
73
|
-
this.options = options;
|
|
74
|
-
this.roapOk = roapOk;
|
|
75
|
-
this.roapFinished = roapFinished;
|
|
76
|
-
this.roapAnswer = roapAnswer;
|
|
77
|
-
this.lastRoapMessage = null;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
*
|
|
82
|
-
* @param {Object} session
|
|
83
|
-
* @param {Meeting} meeting
|
|
84
|
-
* @param {Object} action
|
|
85
|
-
* @returns {null}
|
|
86
|
-
*/
|
|
87
|
-
perform(session, meeting, action) {
|
|
88
|
-
switch (session.state.state) {
|
|
89
|
-
case ROAP.ROAP_STATE.INIT:
|
|
90
|
-
this.roapFinished(meeting.correlationId, action.msg.seq);
|
|
91
|
-
break;
|
|
92
|
-
|
|
93
|
-
// TODO: (important )handle roap state for sending offers as well
|
|
94
|
-
// case ROAP.ROAP_STATE.WAIT_RX_OFFER:
|
|
95
|
-
// case ROAP.ROAP_STATE.WAIT_RX_ANSWER:
|
|
96
|
-
// case ROAP.ROAP_STATE.WAIT_RX_OK:
|
|
97
|
-
case ROAP.ROAP_STATE.WAIT_TX_ANSWER:
|
|
98
|
-
// eslint-disable-next-line no-warning-comments
|
|
99
|
-
// TODO: sometime the you get an answer while you are creating an offer so SKIP
|
|
100
|
-
// Server will send the mercury event comes back
|
|
101
|
-
if (RoapUtil.shouldHandleMedia(meeting)) {
|
|
102
|
-
RoapUtil.updatePeerConnection(meeting, session)
|
|
103
|
-
.then((answerSdps) => {
|
|
104
|
-
this.roapAnswer({
|
|
105
|
-
mediaId: meeting.mediaId,
|
|
106
|
-
sdps: answerSdps,
|
|
107
|
-
seq: session.OFFER.seq,
|
|
108
|
-
correlationId: meeting.correlationId,
|
|
109
|
-
audioMuted: meeting.isAudioMuted(),
|
|
110
|
-
videoMuted: meeting.isVideoMuted()
|
|
111
|
-
});
|
|
112
|
-
})
|
|
113
|
-
.catch((error) => {
|
|
114
|
-
const metricName = BEHAVIORAL_METRICS.ROAP_ANSWER_FAILURE;
|
|
115
|
-
const data = {
|
|
116
|
-
correlation_id: meeting.correlationId,
|
|
117
|
-
locus_id: meeting.locusUrl.split('/').pop(),
|
|
118
|
-
reason: error.message,
|
|
119
|
-
stack: error.stack
|
|
120
|
-
};
|
|
121
|
-
const metadata = {
|
|
122
|
-
type: error.name
|
|
123
|
-
};
|
|
124
|
-
|
|
125
|
-
Metrics.sendBehavioralMetric(metricName, data, metadata);
|
|
126
|
-
LoggerProxy.logger.error(`Roap:handler#perform --> Error occured during wait receive answer, continuing, ${error}`);
|
|
127
|
-
});
|
|
128
|
-
}
|
|
129
|
-
break;
|
|
130
|
-
case ROAP.ROAP_STATE.WAIT_TX_OK:
|
|
131
|
-
if (!RoapUtil.shouldHandleMedia(meeting)) {
|
|
132
|
-
RoapUtil.setRemoteDescription(meeting, session).then((res) => {
|
|
133
|
-
this.roapOk(res);
|
|
134
|
-
});
|
|
135
|
-
}
|
|
136
|
-
break;
|
|
137
|
-
// case ROAP.ROAP_STATE.IDLE_LOCAL_OFFER:
|
|
138
|
-
case ROAP.ROAP_STATE.ERROR:
|
|
139
|
-
LoggerProxy.logger.error(`Roap:handler#perform --> Roap State ERROR for session: ${session}`);
|
|
140
|
-
break;
|
|
141
|
-
case ROAP.ROAP_STATE.GLARE:
|
|
142
|
-
session.GLARE_OFFER.tieBreaker = session.GLARE_OFFER.tieBreaker || 0;
|
|
143
|
-
session.OFFER.tieBreaker = session.OFFER.tieBreaker || 0;
|
|
144
|
-
LoggerProxy.logger.warn('Roap:handler#perform --> Roap State resolved the GLARE condition.');
|
|
145
|
-
if (session.GLARE_OFFER.tieBreaker < session.OFFER.tieBreaker) {
|
|
146
|
-
// 2
|
|
147
|
-
LoggerProxy.logger.log('Roap:handler#perform --> Roap State local offer won after GLARE.');
|
|
148
|
-
}
|
|
149
|
-
else {
|
|
150
|
-
LoggerProxy.logger.log('Roap:handler#perform --> Roap State remote offer won after GLARE.');
|
|
151
|
-
}
|
|
152
|
-
session.state.step(ROAP.ROAP_SIGNAL.GLARE_RESOLVED, meeting, action);
|
|
153
|
-
this.perform(session, meeting);
|
|
154
|
-
break;
|
|
155
|
-
default:
|
|
156
|
-
break;
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
/**
|
|
161
|
-
*
|
|
162
|
-
* @param {String} signal
|
|
163
|
-
* @param {Object} session
|
|
164
|
-
* @param {Object} action
|
|
165
|
-
* @param {Meeting} meeting
|
|
166
|
-
* @param {String} prefix
|
|
167
|
-
* @returns {null}
|
|
168
|
-
*/
|
|
169
|
-
execute(signal, session, action, meeting, prefix) {
|
|
170
|
-
if (session && session.state) {
|
|
171
|
-
handleSessionStep({
|
|
172
|
-
roap: action,
|
|
173
|
-
locusUrl: meeting.locusUrl,
|
|
174
|
-
correlationId: meeting.correlationId,
|
|
175
|
-
session
|
|
176
|
-
});
|
|
177
|
-
signal = ROAP.ROAP_SIGNAL[`${prefix}${action.msg.messageType}`];
|
|
178
|
-
session.state.step(signal, meeting, action);
|
|
179
|
-
this.perform(session, meeting, action);
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
/**
|
|
184
|
-
*
|
|
185
|
-
* @param {Object} session
|
|
186
|
-
* @param {Object} action
|
|
187
|
-
* @param {Meeting} meeting
|
|
188
|
-
* @param {String} correlationId
|
|
189
|
-
* @returns {Boolean}
|
|
190
|
-
*/
|
|
191
|
-
handleAction(session, action, meeting, correlationId) {
|
|
192
|
-
let signal;
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
switch (action.type) {
|
|
196
|
-
case ROAP.RECEIVE_ROAP_MSG:
|
|
197
|
-
LoggerProxy.logger.log(`Roap:handler#handleAction --> RECEIVE_ROAP_MSG event captured, reciving a roap message : ${JSON.stringify(action)}`);
|
|
198
|
-
if (compareWithLastRoapMessage(this.lastRoapMessage, action)) {
|
|
199
|
-
LoggerProxy.logger.warn(`Roap:handler#handleAction --> duplicate roap offer from server: ${action.msg.seq}`);
|
|
200
|
-
}
|
|
201
|
-
else {
|
|
202
|
-
this.lastRoapMessage = action;
|
|
203
|
-
action.remote = true;
|
|
204
|
-
this.execute(signal, session, action, meeting, ROAP.RX_);
|
|
205
|
-
}
|
|
206
|
-
break;
|
|
207
|
-
case ROAP.SEND_ROAP_MSG:
|
|
208
|
-
LoggerProxy.logger.log(`Roap:handler#handleAction --> SEND_ROAP_MSG event captured, sending roap message ${JSON.stringify(action)}`);
|
|
209
|
-
|
|
210
|
-
action.local = true;
|
|
211
|
-
this.execute(signal, session, action, meeting, ROAP.TX_);
|
|
212
|
-
break;
|
|
213
|
-
case ROAP.SEND_ROAP_MSG_SUCCESS:
|
|
214
|
-
// NOTE: When server send back an answer via mercury the
|
|
215
|
-
// remote SDP is already saved sent and ok message is sent back
|
|
216
|
-
// We dont have to indicate the roapHandler about the RX_ANSWER via SEND_ROAP_MSG_SUCCESS
|
|
217
|
-
break;
|
|
218
|
-
case ROAP.RECEIVE_CALL_LEAVE:
|
|
219
|
-
RoapCollection.deleteSession(correlationId);
|
|
220
|
-
LoggerProxy.logger.log(`Roap:handler#handleAction --> RECEIVE_CALL_LEAVE event captured, cleaning up the RoapHandler for correlationId: ${correlationId}`); break;
|
|
221
|
-
case ROAP.RESET_ROAP_STATE:
|
|
222
|
-
RoapCollection.deleteSessionSequence(correlationId, action.msg.seq);
|
|
223
|
-
LoggerProxy.logger.log(`Roap:handler#handleAction --> RESET_ROAP_STATE event captured, resetting the RoapHandler state based on sequenceId: ${action.msg.seq}`); break;
|
|
224
|
-
default:
|
|
225
|
-
return true;
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
return true;
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
/**
|
|
232
|
-
*
|
|
233
|
-
* @param {Object} action
|
|
234
|
-
* @returns {Boolean}
|
|
235
|
-
*/
|
|
236
|
-
submit(action) {
|
|
237
|
-
const {correlationId} = action;
|
|
238
|
-
let {seq} = action;
|
|
239
|
-
|
|
240
|
-
if (!seq && action.msg) {
|
|
241
|
-
seq = action.msg.seq;
|
|
242
|
-
}
|
|
243
|
-
const session = RoapCollection.getSessionSequence(correlationId, seq);
|
|
244
|
-
const meeting = this.webex.meetings.meetingCollection.getByKey('correlationId', correlationId);
|
|
245
|
-
|
|
246
|
-
if (checkForAndHandleErrors(action, meeting, correlationId)) {
|
|
247
|
-
return true;
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
return this.handleAction(session, action, meeting, correlationId);
|
|
251
|
-
}
|
|
252
|
-
}
|