@webex/plugin-meetings 3.5.0 → 3.6.0
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/annotation/annotation.types.d.ts +42 -0
- package/dist/annotation/constants.d.ts +31 -0
- package/dist/annotation/index.d.ts +117 -0
- package/dist/breakouts/breakout.d.ts +8 -0
- package/dist/breakouts/breakout.js +1 -1
- package/dist/breakouts/collection.d.ts +5 -0
- package/dist/breakouts/edit-lock-error.d.ts +15 -0
- package/dist/breakouts/events.d.ts +8 -0
- package/dist/breakouts/index.d.ts +5 -0
- package/dist/breakouts/index.js +1 -1
- package/dist/breakouts/request.d.ts +22 -0
- package/dist/breakouts/utils.d.ts +15 -0
- package/dist/common/browser-detection.d.ts +9 -0
- package/dist/common/collection.d.ts +48 -0
- package/dist/common/config.d.ts +2 -0
- package/dist/common/errors/captcha-error.d.ts +15 -0
- package/dist/common/errors/intent-to-join.d.ts +16 -0
- package/dist/common/errors/join-meeting.d.ts +17 -0
- package/dist/common/errors/media.d.ts +15 -0
- package/dist/common/errors/no-meeting-info.d.ts +14 -0
- package/dist/common/errors/parameter.d.ts +15 -0
- package/dist/common/errors/password-error.d.ts +15 -0
- package/dist/common/errors/permission.d.ts +14 -0
- package/dist/common/errors/reclaim-host-role-error.js +149 -0
- package/dist/common/errors/reclaim-host-role-error.js.map +1 -0
- package/dist/common/errors/reclaim-host-role-errors.d.ts +60 -0
- package/dist/common/errors/reconnection-in-progress.d.ts +9 -0
- package/dist/common/errors/reconnection-in-progress.js +33 -0
- package/dist/common/errors/reconnection-in-progress.js.map +1 -0
- package/dist/common/errors/reconnection.d.ts +15 -0
- package/dist/common/errors/stats.d.ts +15 -0
- package/dist/common/errors/webex-errors.d.ts +93 -0
- package/dist/common/errors/webex-meetings-error.d.ts +20 -0
- package/dist/common/events/events-scope.d.ts +17 -0
- package/dist/common/events/events.d.ts +12 -0
- package/dist/common/events/trigger-proxy.d.ts +2 -0
- package/dist/common/events/util.d.ts +2 -0
- package/dist/common/logs/logger-config.d.ts +2 -0
- package/dist/common/logs/logger-proxy.d.ts +2 -0
- package/dist/common/logs/request.d.ts +36 -0
- package/dist/common/queue.d.ts +34 -0
- package/dist/config.d.ts +72 -0
- package/dist/config.js +3 -1
- package/dist/config.js.map +1 -1
- package/dist/constants.d.ts +1088 -0
- package/dist/constants.js +1 -0
- package/dist/constants.js.map +1 -1
- package/dist/controls-options-manager/constants.d.ts +4 -0
- package/dist/controls-options-manager/enums.d.ts +15 -0
- package/dist/controls-options-manager/index.d.ts +136 -0
- package/dist/controls-options-manager/types.d.ts +43 -0
- package/dist/controls-options-manager/util.d.ts +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/interceptors/index.d.ts +2 -0
- package/dist/interceptors/locusRetry.d.ts +27 -0
- package/dist/interpretation/collection.d.ts +5 -0
- package/dist/interpretation/index.d.ts +5 -0
- package/dist/interpretation/index.js +1 -1
- package/dist/interpretation/siLanguage.d.ts +5 -0
- package/dist/interpretation/siLanguage.js +1 -1
- package/dist/locus-info/controlsUtils.d.ts +2 -0
- package/dist/locus-info/embeddedAppsUtils.d.ts +2 -0
- package/dist/locus-info/fullState.d.ts +2 -0
- package/dist/locus-info/hostUtils.d.ts +2 -0
- package/dist/locus-info/index.d.ts +322 -0
- package/dist/locus-info/infoUtils.d.ts +2 -0
- package/dist/locus-info/mediaSharesUtils.d.ts +2 -0
- package/dist/locus-info/parser.d.ts +272 -0
- package/dist/locus-info/selfUtils.d.ts +2 -0
- package/dist/media/index.d.ts +34 -0
- package/dist/media/index.js +3 -1
- package/dist/media/index.js.map +1 -1
- package/dist/media/properties.d.ts +93 -0
- package/dist/media/util.d.ts +2 -0
- package/dist/mediaQualityMetrics/config.d.ts +241 -0
- package/dist/mediaQualityMetrics/config.js +502 -0
- package/dist/mediaQualityMetrics/config.js.map +1 -0
- package/dist/meeting/effectsState.js +260 -0
- package/dist/meeting/effectsState.js.map +1 -0
- package/dist/meeting/in-meeting-actions.d.ts +167 -0
- package/dist/meeting/in-meeting-actions.js +3 -1
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.d.ts +1825 -0
- package/dist/meeting/index.js +39 -4
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/locusMediaRequest.d.ts +74 -0
- package/dist/meeting/muteState.d.ts +178 -0
- package/dist/meeting/request.d.ts +295 -0
- package/dist/meeting/request.type.d.ts +11 -0
- package/dist/meeting/state.d.ts +9 -0
- package/dist/meeting/util.d.ts +119 -0
- package/dist/meeting/util.js +5 -8
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting/voicea-meeting.d.ts +16 -0
- package/dist/meeting-info/collection.d.ts +20 -0
- package/dist/meeting-info/index.d.ts +69 -0
- package/dist/meeting-info/meeting-info-v2.d.ts +123 -0
- package/dist/meeting-info/request.d.ts +22 -0
- package/dist/meeting-info/util.d.ts +2 -0
- package/dist/meeting-info/utilv2.d.ts +2 -0
- package/dist/meetings/collection.d.ts +40 -0
- package/dist/meetings/index.d.ts +390 -0
- package/dist/meetings/index.js +79 -26
- package/dist/meetings/index.js.map +1 -1
- package/dist/meetings/meetings.types.d.ts +4 -0
- package/dist/meetings/request.d.ts +27 -0
- package/dist/meetings/util.d.ts +18 -0
- package/dist/member/index.d.ts +160 -0
- package/dist/member/member.types.js +17 -0
- package/dist/member/member.types.js.map +1 -0
- package/dist/member/types.d.ts +32 -0
- package/dist/member/util.d.ts +2 -0
- package/dist/members/collection.d.ts +29 -0
- package/dist/members/index.d.ts +353 -0
- package/dist/members/request.d.ts +114 -0
- package/dist/members/types.d.ts +25 -0
- package/dist/members/util.d.ts +215 -0
- package/dist/metrics/config.js +276 -0
- package/dist/metrics/config.js.map +1 -0
- package/dist/metrics/constants.d.ts +70 -0
- package/dist/metrics/index.d.ts +45 -0
- package/dist/multistream/mediaRequestManager.d.ts +119 -0
- package/dist/multistream/receiveSlot.d.ts +68 -0
- package/dist/multistream/receiveSlotManager.d.ts +56 -0
- package/dist/multistream/remoteMedia.d.ts +72 -0
- package/dist/multistream/remoteMediaGroup.d.ts +49 -0
- package/dist/multistream/remoteMediaManager.d.ts +300 -0
- package/dist/multistream/sendSlotManager.d.ts +69 -0
- package/dist/networkQualityMonitor/index.d.ts +70 -0
- package/dist/networkQualityMonitor/index.js +13 -19
- package/dist/networkQualityMonitor/index.js.map +1 -1
- package/dist/peer-connection-manager/index.js +671 -0
- package/dist/peer-connection-manager/index.js.map +1 -0
- package/dist/peer-connection-manager/util.js +109 -0
- package/dist/peer-connection-manager/util.js.map +1 -0
- package/dist/personal-meeting-room/index.d.ts +47 -0
- package/dist/personal-meeting-room/request.d.ts +14 -0
- package/dist/personal-meeting-room/util.d.ts +2 -0
- package/dist/reachability/clusterReachability.d.ts +109 -0
- package/dist/reachability/index.d.ts +105 -0
- package/dist/reachability/request.d.ts +39 -0
- package/dist/reachability/util.d.ts +8 -0
- package/dist/reactions/constants.d.ts +3 -0
- package/dist/reactions/reactions.d.ts +4 -0
- package/dist/reactions/reactions.type.d.ts +52 -0
- package/dist/reconnection-manager/index.d.ts +136 -0
- package/dist/recording-controller/enums.d.ts +7 -0
- package/dist/recording-controller/index.d.ts +207 -0
- package/dist/recording-controller/util.d.ts +14 -0
- package/dist/roap/collection.js +62 -0
- package/dist/roap/collection.js.map +1 -0
- package/dist/roap/handler.js +275 -0
- package/dist/roap/handler.js.map +1 -0
- package/dist/roap/index.d.ts +86 -0
- package/dist/roap/request.d.ts +39 -0
- package/dist/roap/state.js +126 -0
- package/dist/roap/state.js.map +1 -0
- package/dist/roap/turnDiscovery.d.ts +155 -0
- package/dist/roap/util.js +75 -0
- package/dist/roap/util.js.map +1 -0
- package/dist/rtcMetrics/constants.d.ts +4 -0
- package/dist/rtcMetrics/index.d.ts +61 -0
- package/dist/statsAnalyzer/global.d.ts +36 -0
- package/dist/statsAnalyzer/global.js +126 -0
- package/dist/statsAnalyzer/global.js.map +1 -0
- package/dist/statsAnalyzer/index.d.ts +217 -0
- package/dist/statsAnalyzer/index.js +1013 -0
- package/dist/statsAnalyzer/index.js.map +1 -0
- package/dist/statsAnalyzer/mqaUtil.d.ts +48 -0
- package/dist/statsAnalyzer/mqaUtil.js +179 -0
- package/dist/statsAnalyzer/mqaUtil.js.map +1 -0
- package/dist/transcription/index.d.ts +64 -0
- package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
- package/dist/types/config.d.ts +1 -0
- package/dist/types/constants.d.ts +2 -1
- package/dist/types/mediaQualityMetrics/config.d.ts +241 -0
- package/dist/types/meeting/in-meeting-actions.d.ts +2 -0
- package/dist/types/meeting/index.d.ts +11 -0
- package/dist/types/meetings/index.d.ts +34 -2
- package/dist/types/statsAnalyzer/global.d.ts +36 -0
- package/dist/types/statsAnalyzer/index.d.ts +217 -0
- package/dist/types/statsAnalyzer/mqaUtil.d.ts +48 -0
- package/dist/webinar/collection.d.ts +16 -0
- package/dist/webinar/index.d.ts +5 -0
- package/dist/webinar/index.js +1 -1
- package/package.json +22 -22
- package/src/config.ts +2 -0
- package/src/constants.ts +1 -0
- package/src/media/index.ts +4 -1
- package/src/meeting/in-meeting-actions.ts +3 -0
- package/src/meeting/index.ts +42 -2
- package/src/meeting/util.ts +21 -29
- package/src/meetings/index.ts +107 -37
- package/test/unit/spec/media/index.ts +4 -0
- package/test/unit/spec/meeting/in-meeting-actions.ts +2 -0
- package/test/unit/spec/meeting/index.js +58 -17
- package/test/unit/spec/meeting/utils.js +34 -84
- package/test/unit/spec/meetings/index.js +112 -13
- package/src/rtcMetrics/constants.ts +0 -3
- package/src/rtcMetrics/index.ts +0 -186
- package/test/unit/spec/rtcMetrics/index.ts +0 -154
package/package.json
CHANGED
|
@@ -43,13 +43,13 @@
|
|
|
43
43
|
"@webex/eslint-config-legacy": "0.0.0",
|
|
44
44
|
"@webex/jest-config-legacy": "0.0.0",
|
|
45
45
|
"@webex/legacy-tools": "0.0.0",
|
|
46
|
-
"@webex/plugin-meetings": "3.
|
|
47
|
-
"@webex/plugin-rooms": "3.
|
|
48
|
-
"@webex/test-helper-chai": "3.
|
|
49
|
-
"@webex/test-helper-mocha": "3.
|
|
50
|
-
"@webex/test-helper-mock-webex": "3.
|
|
51
|
-
"@webex/test-helper-retry": "3.
|
|
52
|
-
"@webex/test-helper-test-users": "3.
|
|
46
|
+
"@webex/plugin-meetings": "3.6.0",
|
|
47
|
+
"@webex/plugin-rooms": "3.6.0",
|
|
48
|
+
"@webex/test-helper-chai": "3.6.0",
|
|
49
|
+
"@webex/test-helper-mocha": "3.6.0",
|
|
50
|
+
"@webex/test-helper-mock-webex": "3.6.0",
|
|
51
|
+
"@webex/test-helper-retry": "3.6.0",
|
|
52
|
+
"@webex/test-helper-test-users": "3.6.0",
|
|
53
53
|
"chai": "^4.3.4",
|
|
54
54
|
"chai-as-promised": "^7.1.1",
|
|
55
55
|
"eslint": "^8.24.0",
|
|
@@ -61,21 +61,21 @@
|
|
|
61
61
|
"typescript": "^4.7.4"
|
|
62
62
|
},
|
|
63
63
|
"dependencies": {
|
|
64
|
-
"@webex/common": "3.
|
|
65
|
-
"@webex/internal-media-core": "2.11.
|
|
66
|
-
"@webex/internal-plugin-conversation": "3.
|
|
67
|
-
"@webex/internal-plugin-device": "3.
|
|
68
|
-
"@webex/internal-plugin-llm": "3.
|
|
69
|
-
"@webex/internal-plugin-mercury": "3.
|
|
70
|
-
"@webex/internal-plugin-metrics": "3.
|
|
71
|
-
"@webex/internal-plugin-support": "3.
|
|
72
|
-
"@webex/internal-plugin-user": "3.
|
|
73
|
-
"@webex/internal-plugin-voicea": "3.
|
|
74
|
-
"@webex/media-helpers": "3.
|
|
75
|
-
"@webex/plugin-people": "3.
|
|
76
|
-
"@webex/plugin-rooms": "3.
|
|
64
|
+
"@webex/common": "3.6.0",
|
|
65
|
+
"@webex/internal-media-core": "2.11.3",
|
|
66
|
+
"@webex/internal-plugin-conversation": "3.6.0",
|
|
67
|
+
"@webex/internal-plugin-device": "3.6.0",
|
|
68
|
+
"@webex/internal-plugin-llm": "3.6.0",
|
|
69
|
+
"@webex/internal-plugin-mercury": "3.6.0",
|
|
70
|
+
"@webex/internal-plugin-metrics": "3.6.0",
|
|
71
|
+
"@webex/internal-plugin-support": "3.6.0",
|
|
72
|
+
"@webex/internal-plugin-user": "3.6.0",
|
|
73
|
+
"@webex/internal-plugin-voicea": "3.6.0",
|
|
74
|
+
"@webex/media-helpers": "3.6.0",
|
|
75
|
+
"@webex/plugin-people": "3.6.0",
|
|
76
|
+
"@webex/plugin-rooms": "3.6.0",
|
|
77
77
|
"@webex/web-capabilities": "^1.4.0",
|
|
78
|
-
"@webex/webex-core": "3.
|
|
78
|
+
"@webex/webex-core": "3.6.0",
|
|
79
79
|
"ampersand-collection": "^2.0.2",
|
|
80
80
|
"bowser": "^2.11.0",
|
|
81
81
|
"btoa": "^1.2.1",
|
|
@@ -91,5 +91,5 @@
|
|
|
91
91
|
"//": [
|
|
92
92
|
"TODO: upgrade jwt-decode when moving to node 18"
|
|
93
93
|
],
|
|
94
|
-
"version": "3.
|
|
94
|
+
"version": "3.6.0"
|
|
95
95
|
}
|
package/src/config.ts
CHANGED
package/src/constants.ts
CHANGED
package/src/media/index.ts
CHANGED
|
@@ -15,12 +15,12 @@ import {
|
|
|
15
15
|
LocalSystemAudioStream,
|
|
16
16
|
LocalMicrophoneStream,
|
|
17
17
|
} from '@webex/media-helpers';
|
|
18
|
+
import {RtcMetrics} from '@webex/internal-plugin-metrics';
|
|
18
19
|
import LoggerProxy from '../common/logs/logger-proxy';
|
|
19
20
|
import {MEDIA_TRACK_CONSTRAINT} from '../constants';
|
|
20
21
|
import Config from '../config';
|
|
21
22
|
import StaticConfig from '../common/config';
|
|
22
23
|
import BrowserDetection from '../common/browser-detection';
|
|
23
|
-
import RtcMetrics from '../rtcMetrics';
|
|
24
24
|
|
|
25
25
|
const {isBrowser} = BrowserDetection();
|
|
26
26
|
|
|
@@ -144,6 +144,7 @@ Media.createMediaConnection = (
|
|
|
144
144
|
password: string;
|
|
145
145
|
};
|
|
146
146
|
bundlePolicy?: BundlePolicy;
|
|
147
|
+
iceCandidatesTimeout?: number;
|
|
147
148
|
}
|
|
148
149
|
) => {
|
|
149
150
|
const {
|
|
@@ -154,6 +155,7 @@ Media.createMediaConnection = (
|
|
|
154
155
|
enableExtmap,
|
|
155
156
|
turnServerInfo,
|
|
156
157
|
bundlePolicy,
|
|
158
|
+
iceCandidatesTimeout,
|
|
157
159
|
} = options;
|
|
158
160
|
|
|
159
161
|
const iceServers = [];
|
|
@@ -210,6 +212,7 @@ Media.createMediaConnection = (
|
|
|
210
212
|
return new RoapMediaConnection(
|
|
211
213
|
{
|
|
212
214
|
iceServers,
|
|
215
|
+
iceCandidatesTimeout,
|
|
213
216
|
skipInactiveTransceivers: false,
|
|
214
217
|
requireH264: true,
|
|
215
218
|
sdpMunging: {
|
|
@@ -82,6 +82,7 @@ interface IInMeetingActions {
|
|
|
82
82
|
supportHDV?: boolean;
|
|
83
83
|
canShareWhiteBoard?: boolean;
|
|
84
84
|
enforceVirtualBackground?: boolean;
|
|
85
|
+
canPollingAndQA?: boolean;
|
|
85
86
|
}
|
|
86
87
|
|
|
87
88
|
/**
|
|
@@ -236,6 +237,7 @@ export default class InMeetingActions implements IInMeetingActions {
|
|
|
236
237
|
|
|
237
238
|
canShareWhiteBoard = null;
|
|
238
239
|
|
|
240
|
+
canPollingAndQA = null;
|
|
239
241
|
/**
|
|
240
242
|
* Returns all meeting action options
|
|
241
243
|
* @returns {Object}
|
|
@@ -314,6 +316,7 @@ export default class InMeetingActions implements IInMeetingActions {
|
|
|
314
316
|
supportHQV: this.supportHQV,
|
|
315
317
|
supportHDV: this.supportHDV,
|
|
316
318
|
canShareWhiteBoard: this.canShareWhiteBoard,
|
|
319
|
+
canPollingAndQA: this.canPollingAndQA,
|
|
317
320
|
});
|
|
318
321
|
|
|
319
322
|
/**
|
package/src/meeting/index.ts
CHANGED
|
@@ -10,6 +10,7 @@ import {
|
|
|
10
10
|
ClientEventLeaveReason,
|
|
11
11
|
CallDiagnosticUtils,
|
|
12
12
|
CALL_DIAGNOSTIC_CONFIG,
|
|
13
|
+
RtcMetrics,
|
|
13
14
|
} from '@webex/internal-plugin-metrics';
|
|
14
15
|
import {ClientEvent as RawClientEvent} from '@webex/event-dictionary-ts';
|
|
15
16
|
|
|
@@ -155,7 +156,6 @@ import ControlsOptionsManager from '../controls-options-manager';
|
|
|
155
156
|
import PermissionError from '../common/errors/permission';
|
|
156
157
|
import {LocusMediaRequest} from './locusMediaRequest';
|
|
157
158
|
import {ConnectionStateHandler, ConnectionStateEvent} from './connectionStateHandler';
|
|
158
|
-
import RtcMetrics from '../rtcMetrics';
|
|
159
159
|
|
|
160
160
|
// default callback so we don't call an undefined function, but in practice it should never be used
|
|
161
161
|
const DEFAULT_ICE_PHASE_CALLBACK = () => 'JOIN_MEETING_FINAL';
|
|
@@ -227,6 +227,7 @@ export type AddMediaOptions = {
|
|
|
227
227
|
|
|
228
228
|
export type CallStateForMetrics = {
|
|
229
229
|
correlationId?: string;
|
|
230
|
+
sessionCorrelationId?: string;
|
|
230
231
|
joinTrigger?: string;
|
|
231
232
|
loginType?: string;
|
|
232
233
|
};
|
|
@@ -742,12 +743,29 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
742
743
|
*/
|
|
743
744
|
this.callStateForMetrics = attrs.callStateForMetrics || {};
|
|
744
745
|
const correlationId = attrs.correlationId || attrs.callStateForMetrics?.correlationId;
|
|
746
|
+
const sessionCorrelationId =
|
|
747
|
+
attrs.sessionCorrelationId || attrs.callStateForMetrics?.sessionCorrelationId;
|
|
748
|
+
if (sessionCorrelationId) {
|
|
749
|
+
LoggerProxy.logger.log(
|
|
750
|
+
`Meetings:index#constructor --> Initializing the meeting object with session correlation id from app ${correlationId}`
|
|
751
|
+
);
|
|
752
|
+
this.callStateForMetrics.sessionCorrelationId = sessionCorrelationId;
|
|
753
|
+
} else {
|
|
754
|
+
LoggerProxy.logger.log(
|
|
755
|
+
`Meetings:index#constructor --> No session correlation id supplied. None will be generated and this field will remain blank`
|
|
756
|
+
);
|
|
757
|
+
// TODO: supply a session from the meetings instance
|
|
758
|
+
this.callStateForMetrics.sessionCorrelationId = '';
|
|
759
|
+
}
|
|
745
760
|
if (correlationId) {
|
|
746
761
|
LoggerProxy.logger.log(
|
|
747
762
|
`Meetings:index#constructor --> Initializing the meeting object with correlation id from app ${correlationId}`
|
|
748
763
|
);
|
|
749
764
|
this.callStateForMetrics.correlationId = correlationId;
|
|
750
765
|
} else {
|
|
766
|
+
LoggerProxy.logger.log(
|
|
767
|
+
`Meetings:index#constructor --> Initializing the meeting object with generated correlation id from sdk ${this.id}`
|
|
768
|
+
);
|
|
751
769
|
this.callStateForMetrics.correlationId = this.id;
|
|
752
770
|
}
|
|
753
771
|
/**
|
|
@@ -1581,6 +1599,22 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
1581
1599
|
this.callStateForMetrics.correlationId = correlationId;
|
|
1582
1600
|
}
|
|
1583
1601
|
|
|
1602
|
+
/**
|
|
1603
|
+
* Getter - Returns callStateForMetrics.sessionCorrelationId
|
|
1604
|
+
* @returns {string}
|
|
1605
|
+
*/
|
|
1606
|
+
get sessionCorrelationId() {
|
|
1607
|
+
return this.callStateForMetrics.sessionCorrelationId;
|
|
1608
|
+
}
|
|
1609
|
+
|
|
1610
|
+
/**
|
|
1611
|
+
* Setter - sets callStateForMetrics.sessionCorrelationId
|
|
1612
|
+
* @param {string} sessionCorrelationId
|
|
1613
|
+
*/
|
|
1614
|
+
set sessionCorrelationId(sessionCorrelationId: string) {
|
|
1615
|
+
this.callStateForMetrics.sessionCorrelationId = sessionCorrelationId;
|
|
1616
|
+
}
|
|
1617
|
+
|
|
1584
1618
|
/**
|
|
1585
1619
|
* Getter - Returns isoLocalClientMeetingJoinTime
|
|
1586
1620
|
* This will be set once on meeting join, and not updated again
|
|
@@ -3792,6 +3826,10 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
3792
3826
|
requiredPolicies: [SELF_POLICY.SUPPORT_CHAT],
|
|
3793
3827
|
policies: this.selfUserPolicies,
|
|
3794
3828
|
}),
|
|
3829
|
+
canPollingAndQA: ControlsOptionsUtil.hasPolicies({
|
|
3830
|
+
requiredPolicies: [SELF_POLICY.SUPPORT_POLLING_AND_QA],
|
|
3831
|
+
policies: this.selfUserPolicies,
|
|
3832
|
+
}),
|
|
3795
3833
|
canShareApplication:
|
|
3796
3834
|
(ControlsOptionsUtil.hasHints({
|
|
3797
3835
|
requiredHints: [DISPLAY_HINTS.SHARE_APPLICATION],
|
|
@@ -6338,7 +6376,7 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
6338
6376
|
private async createMediaConnection(turnServerInfo, bundlePolicy?: BundlePolicy) {
|
|
6339
6377
|
this.rtcMetrics = this.isMultistream
|
|
6340
6378
|
? // @ts-ignore
|
|
6341
|
-
new RtcMetrics(this.webex, this.id, this.correlationId)
|
|
6379
|
+
new RtcMetrics(this.webex, {meetingId: this.id}, this.correlationId)
|
|
6342
6380
|
: undefined;
|
|
6343
6381
|
|
|
6344
6382
|
const mc = Media.createMediaConnection(
|
|
@@ -6355,6 +6393,8 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
6355
6393
|
enableExtmap: this.config.enableExtmap,
|
|
6356
6394
|
turnServerInfo,
|
|
6357
6395
|
bundlePolicy,
|
|
6396
|
+
// @ts-ignore - config coming from registerPlugin
|
|
6397
|
+
iceCandidatesTimeout: this.config.iceCandidatesGatheringTimeout,
|
|
6358
6398
|
}
|
|
6359
6399
|
);
|
|
6360
6400
|
|
package/src/meeting/util.ts
CHANGED
|
@@ -150,7 +150,9 @@ const MeetingUtil = {
|
|
|
150
150
|
ipVersion: MeetingUtil.getIpVersion(meeting.getWebexObject()),
|
|
151
151
|
})
|
|
152
152
|
.then((res) => {
|
|
153
|
-
|
|
153
|
+
const parsed = MeetingUtil.parseLocusJoin(res);
|
|
154
|
+
meeting.setLocus(parsed);
|
|
155
|
+
|
|
154
156
|
webex.internal.newMetrics.submitClientEvent({
|
|
155
157
|
name: 'client.locus.join.response',
|
|
156
158
|
payload: {
|
|
@@ -161,11 +163,11 @@ const MeetingUtil = {
|
|
|
161
163
|
},
|
|
162
164
|
options: {
|
|
163
165
|
meetingId: meeting.id,
|
|
164
|
-
mediaConnections:
|
|
166
|
+
mediaConnections: parsed.mediaConnections,
|
|
165
167
|
},
|
|
166
168
|
});
|
|
167
169
|
|
|
168
|
-
return
|
|
170
|
+
return parsed;
|
|
169
171
|
});
|
|
170
172
|
},
|
|
171
173
|
|
|
@@ -313,34 +315,24 @@ const MeetingUtil = {
|
|
|
313
315
|
}
|
|
314
316
|
|
|
315
317
|
// normal join meeting, scenario A, D
|
|
316
|
-
return MeetingUtil.joinMeeting(meeting, options)
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
// @ts-ignore
|
|
326
|
-
webex.internal.newMetrics.submitClientEvent({
|
|
327
|
-
name: 'client.pin.prompt',
|
|
328
|
-
options: {
|
|
329
|
-
meetingId: meeting.id,
|
|
330
|
-
},
|
|
331
|
-
});
|
|
318
|
+
return MeetingUtil.joinMeeting(meeting, options).catch((err) => {
|
|
319
|
+
// joining a claimed PMR that is not my own, scenario B
|
|
320
|
+
if (MeetingUtil.isPinOrGuest(err)) {
|
|
321
|
+
webex.internal.newMetrics.submitClientEvent({
|
|
322
|
+
name: 'client.pin.prompt',
|
|
323
|
+
options: {
|
|
324
|
+
meetingId: meeting.id,
|
|
325
|
+
},
|
|
326
|
+
});
|
|
332
327
|
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
'Meeting:util#joinMeetingOptions --> Error joining the call, ',
|
|
339
|
-
err
|
|
340
|
-
);
|
|
328
|
+
// request host pin or non host for unclaimed PMR, start of Scenario C
|
|
329
|
+
// see https://sqbu-github.cisco.com/WebExSquared/locus/wiki/Locus-Lobby-and--IVR-Feature
|
|
330
|
+
return Promise.reject(new IntentToJoinError('Error Joining Meeting', err));
|
|
331
|
+
}
|
|
332
|
+
LoggerProxy.logger.error('Meeting:util#joinMeetingOptions --> Error joining the call, ', err);
|
|
341
333
|
|
|
342
|
-
|
|
343
|
-
|
|
334
|
+
return Promise.reject(new JoinMeetingError(options, 'Error Joining Meeting', err));
|
|
335
|
+
});
|
|
344
336
|
},
|
|
345
337
|
|
|
346
338
|
/**
|
package/src/meetings/index.ts
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
/* eslint no-shadow: ["error", { "allow": ["eventType"] }] */
|
|
2
|
-
import {
|
|
2
|
+
import {cloneDeep} from 'lodash';
|
|
3
3
|
import '@webex/internal-plugin-mercury';
|
|
4
4
|
import '@webex/internal-plugin-conversation';
|
|
5
5
|
import '@webex/internal-plugin-metrics';
|
|
6
6
|
// @ts-ignore
|
|
7
7
|
import {WebexPlugin} from '@webex/webex-core';
|
|
8
8
|
import {setLogger} from '@webex/internal-media-core';
|
|
9
|
+
import {DeviceRegistrationOptions} from '@webex/internal-plugin-device';
|
|
9
10
|
|
|
10
11
|
import * as mediaHelpersModule from '@webex/media-helpers';
|
|
11
12
|
|
|
@@ -133,6 +134,28 @@ class MediaLogger {
|
|
|
133
134
|
* @memberof Meetings
|
|
134
135
|
*/
|
|
135
136
|
|
|
137
|
+
/**
|
|
138
|
+
* Object containing only the most basic information about a meeting.
|
|
139
|
+
* This is the information that is kept even after the meeting is deleted from the MeetingCollection
|
|
140
|
+
*/
|
|
141
|
+
export type BasicMeetingInformation = {
|
|
142
|
+
allowMediaInLobby: boolean;
|
|
143
|
+
correlationId: string;
|
|
144
|
+
environment: string;
|
|
145
|
+
id: string;
|
|
146
|
+
locusUrl: string;
|
|
147
|
+
locusInfo: {
|
|
148
|
+
// it's only a very small subset of the locus info, to avoid using much memory
|
|
149
|
+
url: string;
|
|
150
|
+
fullState: {
|
|
151
|
+
lastActive: string;
|
|
152
|
+
sessionId: string;
|
|
153
|
+
};
|
|
154
|
+
};
|
|
155
|
+
meetingInfo: any;
|
|
156
|
+
sessionCorrelationId: string;
|
|
157
|
+
};
|
|
158
|
+
|
|
136
159
|
/**
|
|
137
160
|
* Maintain a cache of meetings and sync with services.
|
|
138
161
|
* @class
|
|
@@ -141,6 +164,7 @@ export default class Meetings extends WebexPlugin {
|
|
|
141
164
|
loggerRequest: any;
|
|
142
165
|
media: any;
|
|
143
166
|
meetingCollection: any;
|
|
167
|
+
deletedMeetings: Map<string, BasicMeetingInformation>;
|
|
144
168
|
personalMeetingRoom: any;
|
|
145
169
|
preferredWebexSite: any;
|
|
146
170
|
reachability: Reachability;
|
|
@@ -191,6 +215,8 @@ export default class Meetings extends WebexPlugin {
|
|
|
191
215
|
// @ts-ignore
|
|
192
216
|
this.loggerRequest = new LoggerRequest({webex: this.webex});
|
|
193
217
|
this.meetingCollection = new MeetingCollection();
|
|
218
|
+
this.deletedMeetings = new Map();
|
|
219
|
+
|
|
194
220
|
/**
|
|
195
221
|
* The PersonalMeetingRoom object to interact with server
|
|
196
222
|
* @instance
|
|
@@ -740,11 +766,12 @@ export default class Meetings extends WebexPlugin {
|
|
|
740
766
|
* Explicitly sets up the meetings plugin by registering
|
|
741
767
|
* the device, connecting to mercury, and listening for locus events.
|
|
742
768
|
*
|
|
769
|
+
* @param {DeviceRegistrationOptions} [deviceRegistrationOptions] - The options for registering the device (optional)
|
|
743
770
|
* @returns {Promise}
|
|
744
771
|
* @public
|
|
745
772
|
* @memberof Meetings
|
|
746
773
|
*/
|
|
747
|
-
public register() {
|
|
774
|
+
public register(deviceRegistrationOptions?: DeviceRegistrationOptions): Promise<any> {
|
|
748
775
|
// @ts-ignore
|
|
749
776
|
if (!this.webex.canAuthorize) {
|
|
750
777
|
LoggerProxy.logger.error(
|
|
@@ -770,7 +797,7 @@ export default class Meetings extends WebexPlugin {
|
|
|
770
797
|
}),
|
|
771
798
|
// @ts-ignore
|
|
772
799
|
this.webex.internal.device
|
|
773
|
-
.register()
|
|
800
|
+
.register(deviceRegistrationOptions)
|
|
774
801
|
// @ts-ignore
|
|
775
802
|
.then(() =>
|
|
776
803
|
LoggerProxy.logger.info(
|
|
@@ -996,35 +1023,45 @@ export default class Meetings extends WebexPlugin {
|
|
|
996
1023
|
* @memberof Meetings
|
|
997
1024
|
*/
|
|
998
1025
|
fetchUserPreferredWebexSite() {
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1026
|
+
// @ts-ignore
|
|
1027
|
+
return this.webex.people._getMe().then((me) => {
|
|
1028
|
+
const isGuestUser = me.type === 'appuser';
|
|
1029
|
+
if (!isGuestUser) {
|
|
1030
|
+
return this.request.getMeetingPreferences().then((res) => {
|
|
1031
|
+
if (res) {
|
|
1032
|
+
const preferredWebexSite = MeetingsUtil.parseDefaultSiteFromMeetingPreferences(res);
|
|
1033
|
+
this.preferredWebexSite = preferredWebexSite;
|
|
1034
|
+
// @ts-ignore
|
|
1035
|
+
this.webex.internal.services._getCatalog().addAllowedDomains([preferredWebexSite]);
|
|
1036
|
+
}
|
|
1006
1037
|
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1038
|
+
// fall back to getting the preferred site from the user information
|
|
1039
|
+
if (!this.preferredWebexSite) {
|
|
1040
|
+
// @ts-ignore
|
|
1041
|
+
return this.webex.internal.user
|
|
1042
|
+
.get()
|
|
1043
|
+
.then((user) => {
|
|
1044
|
+
const preferredWebexSite =
|
|
1045
|
+
user?.userPreferences?.userPreferencesItems?.preferredWebExSite;
|
|
1046
|
+
if (preferredWebexSite) {
|
|
1047
|
+
this.preferredWebexSite = preferredWebexSite;
|
|
1048
|
+
// @ts-ignore
|
|
1049
|
+
this.webex.internal.services
|
|
1050
|
+
._getCatalog()
|
|
1051
|
+
.addAllowedDomains([preferredWebexSite]);
|
|
1052
|
+
} else {
|
|
1053
|
+
throw new Error('site not found');
|
|
1054
|
+
}
|
|
1055
|
+
})
|
|
1056
|
+
.catch(() => {
|
|
1057
|
+
LoggerProxy.logger.error(
|
|
1058
|
+
'Failed to fetch preferred site from user - no site will be set'
|
|
1059
|
+
);
|
|
1060
|
+
});
|
|
1061
|
+
}
|
|
1062
|
+
|
|
1063
|
+
return Promise.resolve();
|
|
1064
|
+
});
|
|
1028
1065
|
}
|
|
1029
1066
|
|
|
1030
1067
|
return Promise.resolve();
|
|
@@ -1037,11 +1074,21 @@ export default class Meetings extends WebexPlugin {
|
|
|
1037
1074
|
* @public
|
|
1038
1075
|
* @memberof Meetings
|
|
1039
1076
|
*/
|
|
1040
|
-
|
|
1041
1077
|
getPersonalMeetingRoom() {
|
|
1042
1078
|
return this.personalMeetingRoom;
|
|
1043
1079
|
}
|
|
1044
1080
|
|
|
1081
|
+
/**
|
|
1082
|
+
* Returns basic information about a meeting that exists or
|
|
1083
|
+
* used to exist in the MeetingCollection
|
|
1084
|
+
*
|
|
1085
|
+
* @param {string} meetingId
|
|
1086
|
+
* @returns {BasicMeetingInformation|undefined}
|
|
1087
|
+
*/
|
|
1088
|
+
public getBasicMeetingInformation(meetingId: string): BasicMeetingInformation {
|
|
1089
|
+
return this.meetingCollection.get(meetingId) || this.deletedMeetings.get(meetingId);
|
|
1090
|
+
}
|
|
1091
|
+
|
|
1045
1092
|
/**
|
|
1046
1093
|
* @param {Meeting} meeting
|
|
1047
1094
|
* @param {Object} reason
|
|
@@ -1052,6 +1099,24 @@ export default class Meetings extends WebexPlugin {
|
|
|
1052
1099
|
*/
|
|
1053
1100
|
private destroy(meeting: Meeting, reason: object) {
|
|
1054
1101
|
MeetingUtil.cleanUp(meeting);
|
|
1102
|
+
// keep some basic info about the deleted meeting forever
|
|
1103
|
+
this.deletedMeetings.set(meeting.id, {
|
|
1104
|
+
id: meeting.id,
|
|
1105
|
+
allowMediaInLobby: meeting.allowMediaInLobby,
|
|
1106
|
+
correlationId: meeting.correlationId,
|
|
1107
|
+
sessionCorrelationId: meeting.sessionCorrelationId,
|
|
1108
|
+
environment: meeting.environment,
|
|
1109
|
+
locusUrl: meeting.locusUrl,
|
|
1110
|
+
meetingInfo: cloneDeep(meeting.meetingInfo),
|
|
1111
|
+
locusInfo: {
|
|
1112
|
+
// locusInfo can be quite big, so keep just the minimal info
|
|
1113
|
+
url: meeting.locusInfo?.url,
|
|
1114
|
+
fullState: {
|
|
1115
|
+
lastActive: meeting.locusInfo?.fullState?.lastActive,
|
|
1116
|
+
sessionId: meeting.locusInfo?.fullState?.sessionId,
|
|
1117
|
+
},
|
|
1118
|
+
},
|
|
1119
|
+
});
|
|
1055
1120
|
this.meetingCollection.delete(meeting.id);
|
|
1056
1121
|
Trigger.trigger(
|
|
1057
1122
|
this,
|
|
@@ -1081,6 +1146,7 @@ export default class Meetings extends WebexPlugin {
|
|
|
1081
1146
|
* @param {CallStateForMetrics} callStateForMetrics - information about call state for metrics
|
|
1082
1147
|
* @param {Object} [meetingInfo] - Pre-fetched complete meeting info
|
|
1083
1148
|
* @param {String} [meetingLookupUrl] - meeting info prefetch url
|
|
1149
|
+
* @param {string} sessionCorrelationId - the optional specified sessionCorrelationId (callStateForMetrics.sessionCorrelationId) can be provided instead
|
|
1084
1150
|
* @returns {Promise<Meeting>} A new Meeting.
|
|
1085
1151
|
* @public
|
|
1086
1152
|
* @memberof Meetings
|
|
@@ -1094,7 +1160,8 @@ export default class Meetings extends WebexPlugin {
|
|
|
1094
1160
|
failOnMissingMeetingInfo = false,
|
|
1095
1161
|
callStateForMetrics: CallStateForMetrics = undefined,
|
|
1096
1162
|
meetingInfo = undefined,
|
|
1097
|
-
meetingLookupUrl = undefined
|
|
1163
|
+
meetingLookupUrl = undefined,
|
|
1164
|
+
sessionCorrelationId: string = undefined
|
|
1098
1165
|
) {
|
|
1099
1166
|
// Validate meeting information based on the provided destination and
|
|
1100
1167
|
// type. This must be performed prior to determining if the meeting is
|
|
@@ -1105,6 +1172,10 @@ export default class Meetings extends WebexPlugin {
|
|
|
1105
1172
|
callStateForMetrics = {...(callStateForMetrics || {}), correlationId};
|
|
1106
1173
|
}
|
|
1107
1174
|
|
|
1175
|
+
if (sessionCorrelationId) {
|
|
1176
|
+
callStateForMetrics = {...(callStateForMetrics || {}), sessionCorrelationId};
|
|
1177
|
+
}
|
|
1178
|
+
|
|
1108
1179
|
return (
|
|
1109
1180
|
this.meetingInfo
|
|
1110
1181
|
.fetchInfoOptions(destination, type)
|
|
@@ -1176,10 +1247,9 @@ export default class Meetings extends WebexPlugin {
|
|
|
1176
1247
|
locusId: createdMeeting.locusId,
|
|
1177
1248
|
meetingId: createdMeeting.locusInfo?.info?.webExMeetingId,
|
|
1178
1249
|
autoupload: true,
|
|
1179
|
-
})
|
|
1180
|
-
} else {
|
|
1181
|
-
this.destroy(createdMeeting, payload.reason);
|
|
1250
|
+
});
|
|
1182
1251
|
}
|
|
1252
|
+
this.destroy(createdMeeting, payload.reason);
|
|
1183
1253
|
});
|
|
1184
1254
|
|
|
1185
1255
|
createdMeeting.on(EVENTS.REQUEST_UPLOAD_LOGS, (meetingInstance) => {
|
|
@@ -1206,7 +1276,7 @@ export default class Meetings extends WebexPlugin {
|
|
|
1206
1276
|
return Promise.resolve(createdMeeting);
|
|
1207
1277
|
});
|
|
1208
1278
|
}
|
|
1209
|
-
meeting.
|
|
1279
|
+
meeting.updateCallStateForMetrics(callStateForMetrics);
|
|
1210
1280
|
|
|
1211
1281
|
// Return the existing meeting.
|
|
1212
1282
|
return Promise.resolve(meeting);
|
|
@@ -83,6 +83,7 @@ describe('createMediaConnection', () => {
|
|
|
83
83
|
username: 'turn username',
|
|
84
84
|
password: 'turn password',
|
|
85
85
|
},
|
|
86
|
+
iceCandidatesTimeout: undefined,
|
|
86
87
|
});
|
|
87
88
|
assert.calledOnce(roapMediaConnectionConstructorStub);
|
|
88
89
|
assert.calledWith(
|
|
@@ -100,6 +101,7 @@ describe('createMediaConnection', () => {
|
|
|
100
101
|
credential: 'turn password',
|
|
101
102
|
},
|
|
102
103
|
],
|
|
104
|
+
iceCandidatesTimeout: undefined,
|
|
103
105
|
skipInactiveTransceivers: false,
|
|
104
106
|
requireH264: true,
|
|
105
107
|
sdpMunging: {
|
|
@@ -306,12 +308,14 @@ describe('createMediaConnection', () => {
|
|
|
306
308
|
enableRtx: ENABLE_RTX,
|
|
307
309
|
enableExtmap: ENABLE_EXTMAP,
|
|
308
310
|
turnServerInfo,
|
|
311
|
+
iceCandidatesTimeout: undefined,
|
|
309
312
|
});
|
|
310
313
|
assert.calledOnce(roapMediaConnectionConstructorStub);
|
|
311
314
|
assert.calledWith(
|
|
312
315
|
roapMediaConnectionConstructorStub,
|
|
313
316
|
{
|
|
314
317
|
iceServers: [],
|
|
318
|
+
iceCandidatesTimeout: undefined,
|
|
315
319
|
skipInactiveTransceivers: false,
|
|
316
320
|
requireH264: true,
|
|
317
321
|
sdpMunging: {
|
|
@@ -78,6 +78,7 @@ describe('plugin-meetings', () => {
|
|
|
78
78
|
supportHDV: null,
|
|
79
79
|
canShareWhiteBoard: null,
|
|
80
80
|
enforceVirtualBackground: null,
|
|
81
|
+
canPollingAndQA: null,
|
|
81
82
|
...expected,
|
|
82
83
|
};
|
|
83
84
|
|
|
@@ -161,6 +162,7 @@ describe('plugin-meetings', () => {
|
|
|
161
162
|
'supportHDV',
|
|
162
163
|
'canShareWhiteBoard',
|
|
163
164
|
'enforceVirtualBackground',
|
|
165
|
+
'canPollingAndQA',
|
|
164
166
|
].forEach((key) => {
|
|
165
167
|
it(`get and set for ${key} work as expected`, () => {
|
|
166
168
|
const inMeetingActions = new InMeetingActions();
|