@webex/plugin-meetings 3.7.0-next.1 → 3.7.0-next.11
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/breakouts/breakout.js +1 -1
- package/dist/breakouts/index.js +1 -1
- package/dist/config.js +2 -1
- package/dist/config.js.map +1 -1
- package/dist/constants.js +10 -1
- package/dist/constants.js.map +1 -1
- package/dist/interpretation/index.js +1 -1
- package/dist/interpretation/siLanguage.js +1 -1
- package/dist/meeting/in-meeting-actions.js +11 -1
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +287 -198
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/util.js +1 -0
- package/dist/meeting/util.js.map +1 -1
- package/dist/meetings/index.js +4 -1
- package/dist/meetings/index.js.map +1 -1
- package/dist/members/util.js +4 -2
- package/dist/members/util.js.map +1 -1
- package/dist/metrics/constants.js +3 -1
- package/dist/metrics/constants.js.map +1 -1
- package/dist/reachability/clusterReachability.js +12 -11
- package/dist/reachability/clusterReachability.js.map +1 -1
- package/dist/recording-controller/enums.js +8 -4
- package/dist/recording-controller/enums.js.map +1 -1
- package/dist/recording-controller/index.js +18 -9
- package/dist/recording-controller/index.js.map +1 -1
- package/dist/recording-controller/util.js +13 -9
- package/dist/recording-controller/util.js.map +1 -1
- package/dist/types/config.d.ts +1 -0
- package/dist/types/constants.d.ts +8 -0
- package/dist/types/meeting/in-meeting-actions.d.ts +10 -0
- package/dist/types/meeting/index.d.ts +20 -0
- package/dist/types/meetings/index.d.ts +3 -0
- package/dist/types/members/util.d.ts +2 -0
- package/dist/types/metrics/constants.d.ts +2 -0
- package/dist/types/recording-controller/enums.d.ts +5 -2
- package/dist/types/recording-controller/index.d.ts +1 -0
- package/dist/types/recording-controller/util.d.ts +2 -1
- package/dist/webinar/index.js +39 -7
- package/dist/webinar/index.js.map +1 -1
- package/package.json +21 -21
- package/src/config.ts +1 -0
- package/src/constants.ts +10 -0
- package/src/meeting/in-meeting-actions.ts +21 -0
- package/src/meeting/index.ts +94 -0
- package/src/meeting/util.ts +1 -0
- package/src/meetings/index.ts +6 -0
- package/src/members/util.ts +1 -0
- package/src/metrics/constants.ts +2 -0
- package/src/reachability/clusterReachability.ts +4 -1
- package/src/recording-controller/enums.ts +5 -2
- package/src/recording-controller/index.ts +17 -4
- package/src/recording-controller/util.ts +20 -5
- package/src/webinar/index.ts +40 -8
- package/test/unit/spec/meeting/in-meeting-actions.ts +13 -1
- package/test/unit/spec/meeting/index.js +72 -0
- package/test/unit/spec/meeting/utils.js +2 -0
- package/test/unit/spec/meetings/index.js +9 -5
- package/test/unit/spec/members/utils.js +95 -0
- package/test/unit/spec/reachability/clusterReachability.ts +7 -0
- package/test/unit/spec/recording-controller/index.js +61 -5
- package/test/unit/spec/recording-controller/util.js +39 -3
- package/test/unit/spec/webinar/index.ts +47 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_constants","require","_enums","
|
|
1
|
+
{"version":3,"names":["_constants","require","_enums","_util","_interopRequireDefault","canUserStart","displayHints","userPolicies","includes","DISPLAY_HINTS","RECORDING_CONTROL_START","PREMISE_RECORDING_CONTROL_START","MeetingUtil","selfSupportsFeature","SELF_POLICY","SUPPORT_NETWORK_BASED_RECORD","canUserPause","RECORDING_CONTROL_PAUSE","PREMISE_RECORDING_CONTROL_PAUSE","canUserResume","RECORDING_CONTROL_RESUME","PREMISE_RECORDING_CONTROL_RESUME","canUserStop","RECORDING_CONTROL_STOP","PREMISE_RECORDING_CONTROL_STOP","isPremiseRecordingEnabled","extractLocusId","url","split","pop","deriveRecordingStates","action","recording","paused","RecordingAction","Start","Stop","Resume","Pause","Error","concat","_default","exports","default"],"sources":["util.ts"],"sourcesContent":["import {DISPLAY_HINTS, SELF_POLICY} from '../constants';\nimport {RecordingAction} from './enums';\nimport MeetingUtil from '../meeting/util';\n\nconst canUserStart = (\n displayHints: Array<string>,\n userPolicies: Record<SELF_POLICY, boolean>\n): boolean =>\n (displayHints.includes(DISPLAY_HINTS.RECORDING_CONTROL_START) ||\n displayHints.includes(DISPLAY_HINTS.PREMISE_RECORDING_CONTROL_START)) &&\n MeetingUtil.selfSupportsFeature(SELF_POLICY.SUPPORT_NETWORK_BASED_RECORD, userPolicies);\n\nconst canUserPause = (\n displayHints: Array<string>,\n userPolicies: Record<SELF_POLICY, boolean>\n): boolean =>\n (displayHints.includes(DISPLAY_HINTS.RECORDING_CONTROL_PAUSE) ||\n displayHints.includes(DISPLAY_HINTS.PREMISE_RECORDING_CONTROL_PAUSE)) &&\n MeetingUtil.selfSupportsFeature(SELF_POLICY.SUPPORT_NETWORK_BASED_RECORD, userPolicies);\n\nconst canUserResume = (\n displayHints: Array<string>,\n userPolicies: Record<SELF_POLICY, boolean>\n): boolean =>\n (displayHints.includes(DISPLAY_HINTS.RECORDING_CONTROL_RESUME) ||\n displayHints.includes(DISPLAY_HINTS.PREMISE_RECORDING_CONTROL_RESUME)) &&\n MeetingUtil.selfSupportsFeature(SELF_POLICY.SUPPORT_NETWORK_BASED_RECORD, userPolicies);\n\nconst canUserStop = (\n displayHints: Array<string>,\n userPolicies: Record<SELF_POLICY, boolean>\n): boolean =>\n (displayHints.includes(DISPLAY_HINTS.RECORDING_CONTROL_STOP) ||\n displayHints.includes(DISPLAY_HINTS.PREMISE_RECORDING_CONTROL_STOP)) &&\n MeetingUtil.selfSupportsFeature(SELF_POLICY.SUPPORT_NETWORK_BASED_RECORD, userPolicies);\n\nconst isPremiseRecordingEnabled = (\n displayHints: Array<string>,\n userPolicies: Record<SELF_POLICY, boolean>\n): boolean =>\n (displayHints.includes(DISPLAY_HINTS.PREMISE_RECORDING_CONTROL_START) ||\n displayHints.includes(DISPLAY_HINTS.PREMISE_RECORDING_CONTROL_PAUSE) ||\n displayHints.includes(DISPLAY_HINTS.PREMISE_RECORDING_CONTROL_STOP) ||\n displayHints.includes(DISPLAY_HINTS.PREMISE_RECORDING_CONTROL_RESUME)) &&\n MeetingUtil.selfSupportsFeature(SELF_POLICY.SUPPORT_NETWORK_BASED_RECORD, userPolicies);\n\nconst extractLocusId = (url: string) => {\n return url?.split('/').pop();\n};\n\nconst deriveRecordingStates = (action: RecordingAction): {recording: boolean; paused: boolean} => {\n let recording;\n let paused;\n\n switch (action) {\n case RecordingAction.Start:\n recording = true;\n paused = false;\n break;\n case RecordingAction.Stop:\n recording = false;\n paused = false;\n break;\n case RecordingAction.Resume:\n recording = true;\n paused = false;\n break;\n case RecordingAction.Pause:\n recording = true;\n paused = true;\n break;\n default:\n throw new Error(`Recording state cannot be derived from invalid action: ${action}`);\n }\n\n return {\n recording,\n paused,\n };\n};\n\nexport default {\n canUserStart,\n canUserPause,\n canUserResume,\n canUserStop,\n isPremiseRecordingEnabled,\n deriveRecordingStates,\n extractLocusId,\n};\n"],"mappings":"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"}
|
package/dist/types/config.d.ts
CHANGED
|
@@ -738,6 +738,10 @@ export declare const DISPLAY_HINTS: {
|
|
|
738
738
|
RECORDING_CONTROL_PAUSE: string;
|
|
739
739
|
RECORDING_CONTROL_STOP: string;
|
|
740
740
|
RECORDING_CONTROL_RESUME: string;
|
|
741
|
+
PREMISE_RECORDING_CONTROL_START: string;
|
|
742
|
+
PREMISE_RECORDING_CONTROL_PAUSE: string;
|
|
743
|
+
PREMISE_RECORDING_CONTROL_STOP: string;
|
|
744
|
+
PREMISE_RECORDING_CONTROL_RESUME: string;
|
|
741
745
|
LOCK_CONTROL_UNLOCK: string;
|
|
742
746
|
LOCK_CONTROL_LOCK: string;
|
|
743
747
|
LOCK_STATUS_LOCKED: string;
|
|
@@ -805,6 +809,10 @@ export declare const DISPLAY_HINTS: {
|
|
|
805
809
|
STAGE_VIEW_INACTIVE: string;
|
|
806
810
|
ENABLE_STAGE_VIEW: string;
|
|
807
811
|
DISABLE_STAGE_VIEW: string;
|
|
812
|
+
PRACTICE_SESSION_ON: string;
|
|
813
|
+
PRACTICE_SESSION_OFF: string;
|
|
814
|
+
SHOW_PRACTICE_SESSION_START: string;
|
|
815
|
+
SHOW_PRACTICE_SESSION_STOP: string;
|
|
808
816
|
};
|
|
809
817
|
export declare const INTERSTITIAL_DISPLAY_HINTS: string[];
|
|
810
818
|
export declare const SELF_ROLES: {
|
|
@@ -22,6 +22,7 @@ interface IInMeetingActions {
|
|
|
22
22
|
canStartRecording?: boolean;
|
|
23
23
|
canPauseRecording?: boolean;
|
|
24
24
|
canResumeRecording?: boolean;
|
|
25
|
+
isPremiseRecordingEnabled?: boolean;
|
|
25
26
|
canStopRecording?: boolean;
|
|
26
27
|
canRaiseHand?: boolean;
|
|
27
28
|
canLowerAllHands?: boolean;
|
|
@@ -89,6 +90,10 @@ interface IInMeetingActions {
|
|
|
89
90
|
canShowStageView?: boolean;
|
|
90
91
|
canEnableStageView?: boolean;
|
|
91
92
|
canDisableStageView?: boolean;
|
|
93
|
+
isPracticeSessionOn?: boolean;
|
|
94
|
+
isPracticeSessionOff?: boolean;
|
|
95
|
+
canStartPracticeSession?: boolean;
|
|
96
|
+
canStopPracticeSession?: boolean;
|
|
92
97
|
}
|
|
93
98
|
/**
|
|
94
99
|
* @class InMeetingActions
|
|
@@ -103,6 +108,7 @@ export default class InMeetingActions implements IInMeetingActions {
|
|
|
103
108
|
canStartRecording: any;
|
|
104
109
|
canPauseRecording: any;
|
|
105
110
|
canResumeRecording: any;
|
|
111
|
+
isPremiseRecordingEnabled: any;
|
|
106
112
|
canStopRecording: any;
|
|
107
113
|
canSetMuteOnEntry: any;
|
|
108
114
|
canSetPresenter: any;
|
|
@@ -178,6 +184,10 @@ export default class InMeetingActions implements IInMeetingActions {
|
|
|
178
184
|
canShowStageView: any;
|
|
179
185
|
canEnableStageView: any;
|
|
180
186
|
canDisableStageView: any;
|
|
187
|
+
isPracticeSessionOn: any;
|
|
188
|
+
isPracticeSessionOff: any;
|
|
189
|
+
canStartPracticeSession: any;
|
|
190
|
+
canStopPracticeSession: any;
|
|
181
191
|
/**
|
|
182
192
|
* Returns all meeting action options
|
|
183
193
|
* @returns {Object}
|
|
@@ -460,6 +460,8 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
460
460
|
private iceCandidateErrors;
|
|
461
461
|
private iceCandidatesCount;
|
|
462
462
|
private rtcMetrics?;
|
|
463
|
+
private uploadLogsTimer?;
|
|
464
|
+
private logUploadIntervalIndex;
|
|
463
465
|
/**
|
|
464
466
|
* @param {Object} attrs
|
|
465
467
|
* @param {Object} options
|
|
@@ -804,6 +806,7 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
804
806
|
emailAddress: string;
|
|
805
807
|
email: string;
|
|
806
808
|
phoneNumber: string;
|
|
809
|
+
roles: Array<string>;
|
|
807
810
|
}, alertIfActive?: boolean): any;
|
|
808
811
|
/**
|
|
809
812
|
* Cancel an outgoing phone call invitation made during a meeting
|
|
@@ -961,6 +964,23 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
961
964
|
* @memberof Meeting
|
|
962
965
|
*/
|
|
963
966
|
uploadLogs(options?: object): void;
|
|
967
|
+
/**
|
|
968
|
+
* sets the timer for periodic log upload
|
|
969
|
+
* @returns {void}
|
|
970
|
+
*/
|
|
971
|
+
private setLogUploadTimer;
|
|
972
|
+
/**
|
|
973
|
+
* Starts a periodic upload of logs
|
|
974
|
+
*
|
|
975
|
+
* @returns {undefined}
|
|
976
|
+
*/
|
|
977
|
+
startPeriodicLogUpload(): void;
|
|
978
|
+
/**
|
|
979
|
+
* Stops the periodic upload of logs
|
|
980
|
+
*
|
|
981
|
+
* @returns {undefined}
|
|
982
|
+
*/
|
|
983
|
+
stopPeriodicLogUpload(): void;
|
|
964
984
|
/**
|
|
965
985
|
* Removes remote audio, video and share streams from class instance's mediaProperties
|
|
966
986
|
* @returns {undefined}
|
|
@@ -71,6 +71,9 @@ export type BasicMeetingInformation = {
|
|
|
71
71
|
};
|
|
72
72
|
meetingInfo: any;
|
|
73
73
|
sessionCorrelationId: string;
|
|
74
|
+
roles: string[];
|
|
75
|
+
getCurUserType: () => string | null;
|
|
76
|
+
callStateForMetrics: CallStateForMetrics;
|
|
74
77
|
};
|
|
75
78
|
/**
|
|
76
79
|
* Maintain a cache of meetings and sync with services.
|
|
@@ -26,6 +26,7 @@ declare const MembersUtil: {
|
|
|
26
26
|
*/
|
|
27
27
|
getAddMemberBody: (options: any) => {
|
|
28
28
|
invitees: {
|
|
29
|
+
roles?: any;
|
|
29
30
|
address: any;
|
|
30
31
|
}[];
|
|
31
32
|
alertIfActive: any;
|
|
@@ -54,6 +55,7 @@ declare const MembersUtil: {
|
|
|
54
55
|
uri: any;
|
|
55
56
|
body: {
|
|
56
57
|
invitees: {
|
|
58
|
+
roles?: any;
|
|
57
59
|
address: any;
|
|
58
60
|
}[];
|
|
59
61
|
alertIfActive: any;
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
-
declare enum RecordingAction {
|
|
1
|
+
export declare enum RecordingAction {
|
|
2
2
|
Start = "Start",
|
|
3
3
|
Stop = "Stop",
|
|
4
4
|
Pause = "Pause",
|
|
5
5
|
Resume = "Resume"
|
|
6
6
|
}
|
|
7
|
-
export
|
|
7
|
+
export declare enum RecordingType {
|
|
8
|
+
Premise = "premise",
|
|
9
|
+
Cloud = "cloud"
|
|
10
|
+
}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { SELF_POLICY } from '../constants';
|
|
2
|
-
import RecordingAction from './enums';
|
|
2
|
+
import { RecordingAction } from './enums';
|
|
3
3
|
declare const _default: {
|
|
4
4
|
canUserStart: (displayHints: string[], userPolicies: Record<SELF_POLICY, boolean>) => boolean;
|
|
5
5
|
canUserPause: (displayHints: string[], userPolicies: Record<SELF_POLICY, boolean>) => boolean;
|
|
6
6
|
canUserResume: (displayHints: string[], userPolicies: Record<SELF_POLICY, boolean>) => boolean;
|
|
7
7
|
canUserStop: (displayHints: string[], userPolicies: Record<SELF_POLICY, boolean>) => boolean;
|
|
8
|
+
isPremiseRecordingEnabled: (displayHints: string[], userPolicies: Record<SELF_POLICY, boolean>) => boolean;
|
|
8
9
|
deriveRecordingStates: (action: RecordingAction) => {
|
|
9
10
|
recording: boolean;
|
|
10
11
|
paused: boolean;
|
package/dist/webinar/index.js
CHANGED
|
@@ -10,6 +10,7 @@ var _webexCore = require("@webex/webex-core");
|
|
|
10
10
|
var _lodash = require("lodash");
|
|
11
11
|
var _constants = require("../constants");
|
|
12
12
|
var _collection = _interopRequireDefault(require("./collection"));
|
|
13
|
+
var _loggerProxy = _interopRequireDefault(require("../common/logs/logger-proxy"));
|
|
13
14
|
/*!
|
|
14
15
|
* Copyright (c) 2015-2023 Cisco Systems, Inc. See LICENSE file.
|
|
15
16
|
*/
|
|
@@ -31,7 +32,9 @@ var Webinar = _webexCore.WebexPlugin.extend({
|
|
|
31
32
|
// appears the ability to manage webcast
|
|
32
33
|
selfIsPanelist: 'boolean',
|
|
33
34
|
// self is panelist
|
|
34
|
-
selfIsAttendee: 'boolean'
|
|
35
|
+
selfIsAttendee: 'boolean',
|
|
36
|
+
// self is attendee
|
|
37
|
+
practiceSessionEnabled: 'boolean' // practice session enabled
|
|
35
38
|
},
|
|
36
39
|
/**
|
|
37
40
|
* Update the current locus url of the webinar
|
|
@@ -65,17 +68,46 @@ var Webinar = _webexCore.WebexPlugin.extend({
|
|
|
65
68
|
* @returns {{isPromoted: boolean, isDemoted: boolean}} Role transition states
|
|
66
69
|
*/
|
|
67
70
|
updateRoleChanged: function updateRoleChanged(payload) {
|
|
68
|
-
var
|
|
69
|
-
var
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
this.
|
|
71
|
+
var oldRoles = (0, _lodash.get)(payload, 'oldRoles', []);
|
|
72
|
+
var newRoles = (0, _lodash.get)(payload, 'newRoles', []);
|
|
73
|
+
var isPromoted = oldRoles.includes(_constants.SELF_ROLES.ATTENDEE) && newRoles.includes(_constants.SELF_ROLES.PANELIST);
|
|
74
|
+
var isDemoted = oldRoles.includes(_constants.SELF_ROLES.PANELIST) && newRoles.includes(_constants.SELF_ROLES.ATTENDEE);
|
|
75
|
+
this.set('selfIsPanelist', newRoles.includes(_constants.SELF_ROLES.PANELIST));
|
|
76
|
+
this.set('selfIsAttendee', newRoles.includes(_constants.SELF_ROLES.ATTENDEE));
|
|
77
|
+
this.updateCanManageWebcast(newRoles.includes(_constants.SELF_ROLES.MODERATOR));
|
|
73
78
|
return {
|
|
74
79
|
isPromoted: isPromoted,
|
|
75
80
|
isDemoted: isDemoted
|
|
76
81
|
};
|
|
77
82
|
},
|
|
78
|
-
|
|
83
|
+
/**
|
|
84
|
+
* start or stop practice session for webinar
|
|
85
|
+
* @param {boolean} enabled
|
|
86
|
+
* @returns {Promise}
|
|
87
|
+
*/
|
|
88
|
+
setPracticeSessionState: function setPracticeSessionState(enabled) {
|
|
89
|
+
return this.request({
|
|
90
|
+
method: _constants.HTTP_VERBS.PATCH,
|
|
91
|
+
uri: "".concat(this.locusUrl, "/controls"),
|
|
92
|
+
body: {
|
|
93
|
+
practiceSession: {
|
|
94
|
+
enabled: enabled
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}).catch(function (error) {
|
|
98
|
+
_loggerProxy.default.logger.error('Meeting:webinar#setPracticeSessionState failed', error);
|
|
99
|
+
throw error;
|
|
100
|
+
});
|
|
101
|
+
},
|
|
102
|
+
/**
|
|
103
|
+
* update practice session status
|
|
104
|
+
* @param {object} payload
|
|
105
|
+
* @returns {void}
|
|
106
|
+
*/
|
|
107
|
+
updatePracticeSessionStatus: function updatePracticeSessionStatus(payload) {
|
|
108
|
+
this.set('practiceSessionEnabled', payload.enabled);
|
|
109
|
+
},
|
|
110
|
+
version: "3.7.0-next.11"
|
|
79
111
|
});
|
|
80
112
|
var _default = exports.default = Webinar;
|
|
81
113
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_webexCore","require","_lodash","_constants","_collection","_interopRequireDefault","Webinar","WebexPlugin","extend","namespace","MEETINGS","collections","webinar","WebinarCollection","props","locusUrl","webcastInstanceUrl","canManageWebcast","selfIsPanelist","selfIsAttendee","locusUrlUpdate","set","updateWebcastUrl","payload","get","updateCanManageWebcast","updateRoleChanged","isPromoted","includes","SELF_ROLES","ATTENDEE","PANELIST","isDemoted","MODERATOR","version","_default","exports","default"],"sources":["index.ts"],"sourcesContent":["/*!\n * Copyright (c) 2015-2023 Cisco Systems, Inc. See LICENSE file.\n */\nimport {WebexPlugin} from '@webex/webex-core';\nimport {get} from 'lodash';\nimport {MEETINGS, SELF_ROLES} from '../constants';\n\nimport WebinarCollection from './collection';\n\n/**\n * @class Webinar\n */\nconst Webinar = WebexPlugin.extend({\n namespace: MEETINGS,\n collections: {\n webinar: WebinarCollection,\n },\n\n props: {\n locusUrl: 'string', // appears current webinar's locus url\n webcastInstanceUrl: 'string', // current webinar's webcast instance url\n canManageWebcast: 'boolean', // appears the ability to manage webcast\n selfIsPanelist: 'boolean', // self is panelist\n selfIsAttendee: 'boolean', // self is attendee\n },\n\n /**\n * Update the current locus url of the webinar\n * @param {string} locusUrl\n * @returns {void}\n */\n locusUrlUpdate(locusUrl) {\n this.set('locusUrl', locusUrl);\n },\n\n /**\n * Update the current webcast instance url of the meeting\n * @param {object} payload\n * @returns {void}\n */\n updateWebcastUrl(payload) {\n this.set('webcastInstanceUrl', get(payload, 'resources.webcastInstance.url'));\n },\n\n /**\n * Update whether self has capability to manage start/stop webcast (only host can manage it)\n * @param {boolean} canManageWebcast\n * @returns {void}\n */\n updateCanManageWebcast(canManageWebcast) {\n this.set('canManageWebcast', canManageWebcast);\n },\n\n /**\n * Updates user roles and manages associated state transitions\n * @param {object} payload\n * @param {string[]} payload.oldRoles - Previous roles of the user\n * @param {string[]} payload.newRoles - New roles of the user\n * @returns {{isPromoted: boolean, isDemoted: boolean}} Role transition states\n */\n updateRoleChanged(payload) {\n const
|
|
1
|
+
{"version":3,"names":["_webexCore","require","_lodash","_constants","_collection","_interopRequireDefault","_loggerProxy","Webinar","WebexPlugin","extend","namespace","MEETINGS","collections","webinar","WebinarCollection","props","locusUrl","webcastInstanceUrl","canManageWebcast","selfIsPanelist","selfIsAttendee","practiceSessionEnabled","locusUrlUpdate","set","updateWebcastUrl","payload","get","updateCanManageWebcast","updateRoleChanged","oldRoles","newRoles","isPromoted","includes","SELF_ROLES","ATTENDEE","PANELIST","isDemoted","MODERATOR","setPracticeSessionState","enabled","request","method","HTTP_VERBS","PATCH","uri","concat","body","practiceSession","catch","error","LoggerProxy","logger","updatePracticeSessionStatus","version","_default","exports","default"],"sources":["index.ts"],"sourcesContent":["/*!\n * Copyright (c) 2015-2023 Cisco Systems, Inc. See LICENSE file.\n */\nimport {WebexPlugin} from '@webex/webex-core';\nimport {get} from 'lodash';\nimport {HTTP_VERBS, MEETINGS, SELF_ROLES} from '../constants';\n\nimport WebinarCollection from './collection';\nimport LoggerProxy from '../common/logs/logger-proxy';\n\n/**\n * @class Webinar\n */\nconst Webinar = WebexPlugin.extend({\n namespace: MEETINGS,\n collections: {\n webinar: WebinarCollection,\n },\n\n props: {\n locusUrl: 'string', // appears current webinar's locus url\n webcastInstanceUrl: 'string', // current webinar's webcast instance url\n canManageWebcast: 'boolean', // appears the ability to manage webcast\n selfIsPanelist: 'boolean', // self is panelist\n selfIsAttendee: 'boolean', // self is attendee\n practiceSessionEnabled: 'boolean', // practice session enabled\n },\n\n /**\n * Update the current locus url of the webinar\n * @param {string} locusUrl\n * @returns {void}\n */\n locusUrlUpdate(locusUrl) {\n this.set('locusUrl', locusUrl);\n },\n\n /**\n * Update the current webcast instance url of the meeting\n * @param {object} payload\n * @returns {void}\n */\n updateWebcastUrl(payload) {\n this.set('webcastInstanceUrl', get(payload, 'resources.webcastInstance.url'));\n },\n\n /**\n * Update whether self has capability to manage start/stop webcast (only host can manage it)\n * @param {boolean} canManageWebcast\n * @returns {void}\n */\n updateCanManageWebcast(canManageWebcast) {\n this.set('canManageWebcast', canManageWebcast);\n },\n\n /**\n * Updates user roles and manages associated state transitions\n * @param {object} payload\n * @param {string[]} payload.oldRoles - Previous roles of the user\n * @param {string[]} payload.newRoles - New roles of the user\n * @returns {{isPromoted: boolean, isDemoted: boolean}} Role transition states\n */\n updateRoleChanged(payload) {\n const oldRoles = get(payload, 'oldRoles', []);\n const newRoles = get(payload, 'newRoles', []);\n\n const isPromoted =\n oldRoles.includes(SELF_ROLES.ATTENDEE) && newRoles.includes(SELF_ROLES.PANELIST);\n const isDemoted =\n oldRoles.includes(SELF_ROLES.PANELIST) && newRoles.includes(SELF_ROLES.ATTENDEE);\n this.set('selfIsPanelist', newRoles.includes(SELF_ROLES.PANELIST));\n this.set('selfIsAttendee', newRoles.includes(SELF_ROLES.ATTENDEE));\n this.updateCanManageWebcast(newRoles.includes(SELF_ROLES.MODERATOR));\n\n return {isPromoted, isDemoted};\n },\n\n /**\n * start or stop practice session for webinar\n * @param {boolean} enabled\n * @returns {Promise}\n */\n setPracticeSessionState(enabled) {\n return this.request({\n method: HTTP_VERBS.PATCH,\n uri: `${this.locusUrl}/controls`,\n body: {\n practiceSession: {\n enabled,\n },\n },\n }).catch((error) => {\n LoggerProxy.logger.error('Meeting:webinar#setPracticeSessionState failed', error);\n throw error;\n });\n },\n\n /**\n * update practice session status\n * @param {object} payload\n * @returns {void}\n */\n updatePracticeSessionStatus(payload) {\n this.set('practiceSessionEnabled', payload.enabled);\n },\n});\n\nexport default Webinar;\n"],"mappings":"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"}
|
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.7.0-next.
|
|
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.7.0-next.11",
|
|
47
|
+
"@webex/plugin-rooms": "3.7.0-next.4",
|
|
48
|
+
"@webex/test-helper-chai": "3.7.0-next.2",
|
|
49
|
+
"@webex/test-helper-mocha": "3.7.0-next.2",
|
|
50
|
+
"@webex/test-helper-mock-webex": "3.7.0-next.2",
|
|
51
|
+
"@webex/test-helper-retry": "3.7.0-next.2",
|
|
52
|
+
"@webex/test-helper-test-users": "3.7.0-next.2",
|
|
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.
|
|
64
|
+
"@webex/common": "3.7.0-next.2",
|
|
65
65
|
"@webex/internal-media-core": "2.12.2",
|
|
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.7.0-next.
|
|
74
|
-
"@webex/media-helpers": "3.
|
|
75
|
-
"@webex/plugin-people": "3.
|
|
76
|
-
"@webex/plugin-rooms": "3.
|
|
66
|
+
"@webex/internal-plugin-conversation": "3.7.0-next.4",
|
|
67
|
+
"@webex/internal-plugin-device": "3.7.0-next.2",
|
|
68
|
+
"@webex/internal-plugin-llm": "3.7.0-next.2",
|
|
69
|
+
"@webex/internal-plugin-mercury": "3.7.0-next.2",
|
|
70
|
+
"@webex/internal-plugin-metrics": "3.7.0-next.2",
|
|
71
|
+
"@webex/internal-plugin-support": "3.7.0-next.5",
|
|
72
|
+
"@webex/internal-plugin-user": "3.7.0-next.2",
|
|
73
|
+
"@webex/internal-plugin-voicea": "3.7.0-next.11",
|
|
74
|
+
"@webex/media-helpers": "3.7.0-next.2",
|
|
75
|
+
"@webex/plugin-people": "3.7.0-next.2",
|
|
76
|
+
"@webex/plugin-rooms": "3.7.0-next.4",
|
|
77
77
|
"@webex/web-capabilities": "^1.4.0",
|
|
78
|
-
"@webex/webex-core": "3.
|
|
78
|
+
"@webex/webex-core": "3.7.0-next.2",
|
|
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.7.0-next.
|
|
94
|
+
"version": "3.7.0-next.11"
|
|
95
95
|
}
|
package/src/config.ts
CHANGED
|
@@ -96,5 +96,6 @@ export default {
|
|
|
96
96
|
iceCandidatesGatheringTimeout: undefined,
|
|
97
97
|
backendIpv6NativeSupport: false,
|
|
98
98
|
reachabilityGetClusterTimeout: 5000,
|
|
99
|
+
logUploadIntervalMultiplicationFactor: 0, // if set to 0 or undefined, logs won't be uploaded periodically, if you want periodic logs, recommended value is 1
|
|
99
100
|
},
|
|
100
101
|
};
|
package/src/constants.ts
CHANGED
|
@@ -904,6 +904,10 @@ export const DISPLAY_HINTS = {
|
|
|
904
904
|
RECORDING_CONTROL_PAUSE: 'RECORDING_CONTROL_PAUSE',
|
|
905
905
|
RECORDING_CONTROL_STOP: 'RECORDING_CONTROL_STOP',
|
|
906
906
|
RECORDING_CONTROL_RESUME: 'RECORDING_CONTROL_RESUME',
|
|
907
|
+
PREMISE_RECORDING_CONTROL_START: 'PREMISE_RECORDING_CONTROL_START',
|
|
908
|
+
PREMISE_RECORDING_CONTROL_PAUSE: 'PREMISE_RECORDING_CONTROL_PAUSE',
|
|
909
|
+
PREMISE_RECORDING_CONTROL_STOP: 'PREMISE_RECORDING_CONTROL_STOP',
|
|
910
|
+
PREMISE_RECORDING_CONTROL_RESUME: 'PREMISE_RECORDING_CONTROL_RESUME',
|
|
907
911
|
LOCK_CONTROL_UNLOCK: 'LOCK_CONTROL_UNLOCK',
|
|
908
912
|
LOCK_CONTROL_LOCK: 'LOCK_CONTROL_LOCK',
|
|
909
913
|
LOCK_STATUS_LOCKED: 'LOCK_STATUS_LOCKED',
|
|
@@ -988,6 +992,12 @@ export const DISPLAY_HINTS = {
|
|
|
988
992
|
STAGE_VIEW_INACTIVE: 'STAGE_VIEW_INACTIVE',
|
|
989
993
|
ENABLE_STAGE_VIEW: 'ENABLE_STAGE_VIEW',
|
|
990
994
|
DISABLE_STAGE_VIEW: 'DISABLE_STAGE_VIEW',
|
|
995
|
+
|
|
996
|
+
// Practice Session
|
|
997
|
+
PRACTICE_SESSION_ON: 'PRACTICE_SESSION_ON',
|
|
998
|
+
PRACTICE_SESSION_OFF: 'PRACTICE_SESSION_OFF',
|
|
999
|
+
SHOW_PRACTICE_SESSION_START: 'SHOW_PRACTICE_SESSION_START',
|
|
1000
|
+
SHOW_PRACTICE_SESSION_STOP: 'SHOW_PRACTICE_SESSION_STOP',
|
|
991
1001
|
};
|
|
992
1002
|
|
|
993
1003
|
export const INTERSTITIAL_DISPLAY_HINTS = [DISPLAY_HINTS.VOIP_IS_ENABLED];
|
|
@@ -26,6 +26,7 @@ interface IInMeetingActions {
|
|
|
26
26
|
canStartRecording?: boolean;
|
|
27
27
|
canPauseRecording?: boolean;
|
|
28
28
|
canResumeRecording?: boolean;
|
|
29
|
+
isPremiseRecordingEnabled?: boolean;
|
|
29
30
|
canStopRecording?: boolean;
|
|
30
31
|
canRaiseHand?: boolean;
|
|
31
32
|
canLowerAllHands?: boolean;
|
|
@@ -93,6 +94,10 @@ interface IInMeetingActions {
|
|
|
93
94
|
canShowStageView?: boolean;
|
|
94
95
|
canEnableStageView?: boolean;
|
|
95
96
|
canDisableStageView?: boolean;
|
|
97
|
+
isPracticeSessionOn?: boolean;
|
|
98
|
+
isPracticeSessionOff?: boolean;
|
|
99
|
+
canStartPracticeSession?: boolean;
|
|
100
|
+
canStopPracticeSession?: boolean;
|
|
96
101
|
}
|
|
97
102
|
|
|
98
103
|
/**
|
|
@@ -117,6 +122,8 @@ export default class InMeetingActions implements IInMeetingActions {
|
|
|
117
122
|
|
|
118
123
|
canResumeRecording = null;
|
|
119
124
|
|
|
125
|
+
isPremiseRecordingEnabled = null;
|
|
126
|
+
|
|
120
127
|
canStopRecording = null;
|
|
121
128
|
|
|
122
129
|
canSetMuteOnEntry = null;
|
|
@@ -266,6 +273,15 @@ export default class InMeetingActions implements IInMeetingActions {
|
|
|
266
273
|
canEnableStageView = null;
|
|
267
274
|
|
|
268
275
|
canDisableStageView = null;
|
|
276
|
+
|
|
277
|
+
isPracticeSessionOn = null;
|
|
278
|
+
|
|
279
|
+
isPracticeSessionOff = null;
|
|
280
|
+
|
|
281
|
+
canStartPracticeSession = null;
|
|
282
|
+
|
|
283
|
+
canStopPracticeSession = null;
|
|
284
|
+
|
|
269
285
|
/**
|
|
270
286
|
* Returns all meeting action options
|
|
271
287
|
* @returns {Object}
|
|
@@ -288,6 +304,7 @@ export default class InMeetingActions implements IInMeetingActions {
|
|
|
288
304
|
canPauseRecording: this.canPauseRecording,
|
|
289
305
|
canResumeRecording: this.canResumeRecording,
|
|
290
306
|
canStopRecording: this.canStopRecording,
|
|
307
|
+
isPremiseRecordingEnabled: this.isPremiseRecordingEnabled,
|
|
291
308
|
canRaiseHand: this.canRaiseHand,
|
|
292
309
|
canLowerAllHands: this.canLowerAllHands,
|
|
293
310
|
canLowerSomeoneElsesHand: this.canLowerSomeoneElsesHand,
|
|
@@ -354,6 +371,10 @@ export default class InMeetingActions implements IInMeetingActions {
|
|
|
354
371
|
canShowStageView: this.canShowStageView,
|
|
355
372
|
canEnableStageView: this.canEnableStageView,
|
|
356
373
|
canDisableStageView: this.canDisableStageView,
|
|
374
|
+
isPracticeSessionOn: this.isPracticeSessionOn,
|
|
375
|
+
isPracticeSessionOff: this.isPracticeSessionOff,
|
|
376
|
+
canStartPracticeSession: this.canStartPracticeSession,
|
|
377
|
+
canStopPracticeSession: this.canStopPracticeSession,
|
|
357
378
|
});
|
|
358
379
|
|
|
359
380
|
/**
|
package/src/meeting/index.ts
CHANGED
|
@@ -5,6 +5,7 @@ import jwtDecode from 'jwt-decode';
|
|
|
5
5
|
import {StatelessWebexPlugin} from '@webex/webex-core';
|
|
6
6
|
// @ts-ignore - Types not available for @webex/common
|
|
7
7
|
import {Defer} from '@webex/common';
|
|
8
|
+
import {safeSetTimeout, safeSetInterval} from '@webex/common-timers';
|
|
8
9
|
import {
|
|
9
10
|
ClientEvent,
|
|
10
11
|
ClientEventLeaveReason,
|
|
@@ -702,6 +703,8 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
702
703
|
private iceCandidateErrors: Map<string, number>;
|
|
703
704
|
private iceCandidatesCount: number;
|
|
704
705
|
private rtcMetrics?: RtcMetrics;
|
|
706
|
+
private uploadLogsTimer?: ReturnType<typeof setTimeout>;
|
|
707
|
+
private logUploadIntervalIndex: number;
|
|
705
708
|
|
|
706
709
|
/**
|
|
707
710
|
* @param {Object} attrs
|
|
@@ -770,6 +773,8 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
770
773
|
);
|
|
771
774
|
this.callStateForMetrics.correlationId = this.id;
|
|
772
775
|
}
|
|
776
|
+
this.logUploadIntervalIndex = 0;
|
|
777
|
+
|
|
773
778
|
/**
|
|
774
779
|
* @instance
|
|
775
780
|
* @type {String}
|
|
@@ -2655,6 +2660,7 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
2655
2660
|
});
|
|
2656
2661
|
|
|
2657
2662
|
this.locusInfo.on(LOCUSINFO.EVENTS.CONTROLS_PRACTICE_SESSION_STATUS_UPDATED, ({state}) => {
|
|
2663
|
+
this.webinar.updatePracticeSessionStatus(state);
|
|
2658
2664
|
Trigger.trigger(
|
|
2659
2665
|
this,
|
|
2660
2666
|
{file: 'meeting/index', function: 'setupLocusControlsListener'},
|
|
@@ -3249,6 +3255,9 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
3249
3255
|
options: {meetingId: this.id},
|
|
3250
3256
|
});
|
|
3251
3257
|
}
|
|
3258
|
+
Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.GUEST_ENTERED_LOBBY, {
|
|
3259
|
+
correlation_id: this.correlationId,
|
|
3260
|
+
});
|
|
3252
3261
|
this.updateLLMConnection();
|
|
3253
3262
|
});
|
|
3254
3263
|
this.locusInfo.on(LOCUSINFO.EVENTS.SELF_ADMITTED_GUEST, async (payload) => {
|
|
@@ -3272,6 +3281,9 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
3272
3281
|
name: 'client.lobby.exited',
|
|
3273
3282
|
options: {meetingId: this.id},
|
|
3274
3283
|
});
|
|
3284
|
+
Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.GUEST_EXITED_LOBBY, {
|
|
3285
|
+
correlation_id: this.correlationId,
|
|
3286
|
+
});
|
|
3275
3287
|
}
|
|
3276
3288
|
this.rtcMetrics?.sendNextMetrics();
|
|
3277
3289
|
this.updateLLMConnection();
|
|
@@ -3505,6 +3517,7 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
3505
3517
|
emailAddress: string;
|
|
3506
3518
|
email: string;
|
|
3507
3519
|
phoneNumber: string;
|
|
3520
|
+
roles: Array<string>;
|
|
3508
3521
|
},
|
|
3509
3522
|
alertIfActive = true
|
|
3510
3523
|
) {
|
|
@@ -3761,6 +3774,10 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
3761
3774
|
this.userDisplayHints,
|
|
3762
3775
|
this.selfUserPolicies
|
|
3763
3776
|
),
|
|
3777
|
+
isPremiseRecordingEnabled: RecordingUtil.isPremiseRecordingEnabled(
|
|
3778
|
+
this.userDisplayHints,
|
|
3779
|
+
this.selfUserPolicies
|
|
3780
|
+
),
|
|
3764
3781
|
canRaiseHand: MeetingUtil.canUserRaiseHand(this.userDisplayHints),
|
|
3765
3782
|
canLowerAllHands: MeetingUtil.canUserLowerAllHands(this.userDisplayHints),
|
|
3766
3783
|
canLowerSomeoneElsesHand: MeetingUtil.canUserLowerSomeoneElsesHand(this.userDisplayHints),
|
|
@@ -3904,6 +3921,22 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
3904
3921
|
requiredHints: [DISPLAY_HINTS.DISABLE_STAGE_VIEW],
|
|
3905
3922
|
displayHints: this.userDisplayHints,
|
|
3906
3923
|
}),
|
|
3924
|
+
isPracticeSessionOn: ControlsOptionsUtil.hasHints({
|
|
3925
|
+
requiredHints: [DISPLAY_HINTS.PRACTICE_SESSION_ON],
|
|
3926
|
+
displayHints: this.userDisplayHints,
|
|
3927
|
+
}),
|
|
3928
|
+
isPracticeSessionOff: ControlsOptionsUtil.hasHints({
|
|
3929
|
+
requiredHints: [DISPLAY_HINTS.PRACTICE_SESSION_OFF],
|
|
3930
|
+
displayHints: this.userDisplayHints,
|
|
3931
|
+
}),
|
|
3932
|
+
canStartPracticeSession: ControlsOptionsUtil.hasHints({
|
|
3933
|
+
requiredHints: [DISPLAY_HINTS.SHOW_PRACTICE_SESSION_START],
|
|
3934
|
+
displayHints: this.userDisplayHints,
|
|
3935
|
+
}),
|
|
3936
|
+
canStopPracticeSession: ControlsOptionsUtil.hasHints({
|
|
3937
|
+
requiredHints: [DISPLAY_HINTS.SHOW_PRACTICE_SESSION_STOP],
|
|
3938
|
+
displayHints: this.userDisplayHints,
|
|
3939
|
+
}),
|
|
3907
3940
|
canShareFile:
|
|
3908
3941
|
(ControlsOptionsUtil.hasHints({
|
|
3909
3942
|
requiredHints: [DISPLAY_HINTS.SHARE_FILE],
|
|
@@ -4060,6 +4093,66 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
4060
4093
|
Trigger.trigger(this, options, EVENTS.REQUEST_UPLOAD_LOGS, this);
|
|
4061
4094
|
}
|
|
4062
4095
|
|
|
4096
|
+
/**
|
|
4097
|
+
* sets the timer for periodic log upload
|
|
4098
|
+
* @returns {void}
|
|
4099
|
+
*/
|
|
4100
|
+
private setLogUploadTimer() {
|
|
4101
|
+
// start with short timeouts and increase them later on so in case users have very long multi-hour meetings we don't get too fragmented logs
|
|
4102
|
+
const LOG_UPLOAD_INTERVALS = [0.1, 15, 30, 60]; // in minutes
|
|
4103
|
+
|
|
4104
|
+
const delay =
|
|
4105
|
+
1000 *
|
|
4106
|
+
60 *
|
|
4107
|
+
// @ts-ignore - config coming from registerPlugin
|
|
4108
|
+
this.config.logUploadIntervalMultiplicationFactor *
|
|
4109
|
+
LOG_UPLOAD_INTERVALS[this.logUploadIntervalIndex];
|
|
4110
|
+
|
|
4111
|
+
if (this.logUploadIntervalIndex < LOG_UPLOAD_INTERVALS.length - 1) {
|
|
4112
|
+
this.logUploadIntervalIndex += 1;
|
|
4113
|
+
}
|
|
4114
|
+
|
|
4115
|
+
this.uploadLogsTimer = safeSetTimeout(() => {
|
|
4116
|
+
this.uploadLogsTimer = undefined;
|
|
4117
|
+
|
|
4118
|
+
this.uploadLogs();
|
|
4119
|
+
|
|
4120
|
+
// just as an extra precaution, to avoid uploading logs forever in case something goes wrong
|
|
4121
|
+
// and the page remains opened, we stop it if there is no media connection
|
|
4122
|
+
if (!this.mediaProperties.webrtcMediaConnection) {
|
|
4123
|
+
return;
|
|
4124
|
+
}
|
|
4125
|
+
|
|
4126
|
+
this.setLogUploadTimer();
|
|
4127
|
+
}, delay);
|
|
4128
|
+
}
|
|
4129
|
+
|
|
4130
|
+
/**
|
|
4131
|
+
* Starts a periodic upload of logs
|
|
4132
|
+
*
|
|
4133
|
+
* @returns {undefined}
|
|
4134
|
+
*/
|
|
4135
|
+
public startPeriodicLogUpload() {
|
|
4136
|
+
// @ts-ignore - config coming from registerPlugin
|
|
4137
|
+
if (this.config.logUploadIntervalMultiplicationFactor && !this.uploadLogsTimer) {
|
|
4138
|
+
this.logUploadIntervalIndex = 0;
|
|
4139
|
+
|
|
4140
|
+
this.setLogUploadTimer();
|
|
4141
|
+
}
|
|
4142
|
+
}
|
|
4143
|
+
|
|
4144
|
+
/**
|
|
4145
|
+
* Stops the periodic upload of logs
|
|
4146
|
+
*
|
|
4147
|
+
* @returns {undefined}
|
|
4148
|
+
*/
|
|
4149
|
+
public stopPeriodicLogUpload() {
|
|
4150
|
+
if (this.uploadLogsTimer) {
|
|
4151
|
+
clearTimeout(this.uploadLogsTimer);
|
|
4152
|
+
this.uploadLogsTimer = undefined;
|
|
4153
|
+
}
|
|
4154
|
+
}
|
|
4155
|
+
|
|
4063
4156
|
/**
|
|
4064
4157
|
* Removes remote audio, video and share streams from class instance's mediaProperties
|
|
4065
4158
|
* @returns {undefined}
|
|
@@ -7245,6 +7338,7 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
7245
7338
|
|
|
7246
7339
|
// We can log ReceiveSlot SSRCs only after the SDP exchange, so doing it here:
|
|
7247
7340
|
this.remoteMediaManager?.logAllReceiveSlots();
|
|
7341
|
+
this.startPeriodicLogUpload();
|
|
7248
7342
|
} catch (error) {
|
|
7249
7343
|
LoggerProxy.logger.error(`${LOG_HEADER} failed to establish media connection: `, error);
|
|
7250
7344
|
|