@webex/plugin-meetings 2.37.2 → 2.38.1
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/config.js +1 -1
- package/dist/config.js.map +1 -1
- package/dist/constants.js +2 -1
- package/dist/constants.js.map +1 -1
- package/dist/locus-info/index.js +24 -0
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/parser.js +1 -0
- package/dist/locus-info/parser.js.map +1 -1
- package/dist/media/properties.js.map +1 -1
- package/dist/meeting/index.js +405 -352
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/muteState.js +13 -0
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.js +0 -27
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/util.js +0 -56
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js +2 -0
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meetings/index.js +27 -17
- package/dist/meetings/index.js.map +1 -1
- package/dist/meetings/request.js +14 -12
- package/dist/meetings/request.js.map +1 -1
- package/dist/member/util.js +3 -1
- package/dist/member/util.js.map +1 -1
- package/dist/members/request.js +3 -1
- package/dist/members/request.js.map +1 -1
- package/dist/reachability/index.js +4 -4
- package/dist/reachability/index.js.map +1 -1
- package/dist/reactions/reactions.type.js +1 -0
- package/dist/reactions/reactions.type.js.map +1 -1
- package/dist/recording-controller/enums.js +17 -0
- package/dist/recording-controller/enums.js.map +1 -0
- package/dist/recording-controller/index.js +343 -0
- package/dist/recording-controller/index.js.map +1 -0
- package/dist/recording-controller/util.js +63 -0
- package/dist/recording-controller/util.js.map +1 -0
- package/dist/roap/index.js +16 -10
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/turnDiscovery.js +6 -4
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.js +18 -6
- package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
- package/package.json +23 -18
- package/src/config.ts +1 -1
- package/src/constants.ts +1 -0
- package/src/locus-info/index.ts +24 -0
- package/src/locus-info/parser.ts +1 -0
- package/src/media/properties.ts +1 -1
- package/src/meeting/index.ts +121 -70
- package/src/meeting/muteState.ts +11 -0
- package/src/meeting/request.ts +0 -31
- package/src/meeting/util.ts +0 -60
- package/src/meeting-info/meeting-info-v2.ts +2 -0
- package/src/meetings/index.ts +8 -3
- package/src/meetings/request.ts +1 -1
- package/src/member/util.ts +2 -1
- package/src/members/request.ts +1 -0
- package/src/reachability/index.ts +2 -1
- package/src/reactions/reactions.type.ts +2 -1
- package/src/recording-controller/enums.ts +8 -0
- package/src/recording-controller/index.ts +315 -0
- package/src/recording-controller/util.ts +58 -0
- package/src/roap/index.ts +8 -8
- package/src/roap/turnDiscovery.ts +5 -5
- package/src/statsAnalyzer/mqaUtil.ts +6 -0
- package/test/integration/spec/journey.js +1 -1
- package/test/integration/spec/space-meeting.js +1 -1
- package/test/integration/spec/transcription.js +1 -1
- package/test/unit/spec/meeting/index.js +33 -6
- package/test/unit/spec/meeting/muteState.js +11 -0
- package/test/unit/spec/meeting/utils.js +0 -127
- package/test/unit/spec/recording-controller/index.js +231 -0
- package/test/unit/spec/recording-controller/util.js +102 -0
- package/test/unit/spec/roap/index.ts +10 -5
- package/test/unit/spec/roap/turnDiscovery.ts +13 -8
- package/tsconfig.json +6 -0
package/src/meetings/index.ts
CHANGED
|
@@ -221,6 +221,7 @@ export default class Meetings extends WebexPlugin {
|
|
|
221
221
|
// @ts-ignore
|
|
222
222
|
this.meetingCollection.getByKey(
|
|
223
223
|
CORRELATION_ID,
|
|
224
|
+
// @ts-ignore
|
|
224
225
|
MeetingsUtil.checkForCorrelationId(this.webex.internal.device.url, data.locus)
|
|
225
226
|
) ||
|
|
226
227
|
this.meetingCollection.getByKey(
|
|
@@ -440,11 +441,14 @@ export default class Meetings extends WebexPlugin {
|
|
|
440
441
|
*/
|
|
441
442
|
// @ts-ignore
|
|
442
443
|
this.meetingInfo = this.config.experimental.enableUnifiedMeetings
|
|
443
|
-
?
|
|
444
|
-
|
|
444
|
+
? // @ts-ignore
|
|
445
|
+
new MeetingInfoV2(this.webex)
|
|
446
|
+
: // @ts-ignore
|
|
447
|
+
new MeetingInfo(this.webex);
|
|
445
448
|
// @ts-ignore
|
|
446
449
|
this.personalMeetingRoom = new PersonalMeetingRoom(
|
|
447
450
|
{meetingInfo: this.meetingInfo},
|
|
451
|
+
// @ts-ignore
|
|
448
452
|
{parent: this.webex}
|
|
449
453
|
);
|
|
450
454
|
|
|
@@ -554,6 +558,7 @@ export default class Meetings extends WebexPlugin {
|
|
|
554
558
|
// @ts-ignore
|
|
555
559
|
.then(() =>
|
|
556
560
|
LoggerProxy.logger.info(
|
|
561
|
+
// @ts-ignore
|
|
557
562
|
`Meetings:index#register --> INFO, Device registered ${this.webex.internal.device.url}`
|
|
558
563
|
)
|
|
559
564
|
)
|
|
@@ -607,8 +612,8 @@ export default class Meetings extends WebexPlugin {
|
|
|
607
612
|
|
|
608
613
|
this.stopListeningForEvents();
|
|
609
614
|
|
|
610
|
-
// @ts-ignore
|
|
611
615
|
return (
|
|
616
|
+
// @ts-ignore
|
|
612
617
|
this.webex.internal.mercury
|
|
613
618
|
.disconnect()
|
|
614
619
|
// @ts-ignore
|
package/src/meetings/request.ts
CHANGED
|
@@ -53,9 +53,9 @@ export default class MeetingRequest extends StatelessWebexPlugin {
|
|
|
53
53
|
*/
|
|
54
54
|
determineRedirections(responseBody: any) {
|
|
55
55
|
if (responseBody.remoteLocusClusterUrls && responseBody.remoteLocusClusterUrls.length) {
|
|
56
|
-
// @ts-ignore
|
|
57
56
|
return Promise.all(
|
|
58
57
|
responseBody.remoteLocusClusterUrls.map((url) =>
|
|
58
|
+
// @ts-ignore
|
|
59
59
|
this.request({
|
|
60
60
|
method: HTTP_VERBS.GET,
|
|
61
61
|
url,
|
package/src/member/util.ts
CHANGED
|
@@ -72,7 +72,7 @@ MemberUtil.isAssociatedSame = (participant: any, id: string) =>
|
|
|
72
72
|
* @param {String} status
|
|
73
73
|
* @returns {Boolean}
|
|
74
74
|
*/
|
|
75
|
-
MemberUtil.isNotAdmitted = (participant: any, isGuest: boolean, status: string) =>
|
|
75
|
+
MemberUtil.isNotAdmitted = (participant: any, isGuest: boolean, status: string): boolean =>
|
|
76
76
|
participant &&
|
|
77
77
|
participant.guest &&
|
|
78
78
|
((participant.devices &&
|
|
@@ -82,6 +82,7 @@ MemberUtil.isNotAdmitted = (participant: any, isGuest: boolean, status: string)
|
|
|
82
82
|
// @ts-ignore
|
|
83
83
|
isGuest &&
|
|
84
84
|
status === _IN_LOBBY_) ||
|
|
85
|
+
// @ts-ignore
|
|
85
86
|
!status === _IN_MEETING_);
|
|
86
87
|
|
|
87
88
|
/**
|
package/src/members/request.ts
CHANGED
|
@@ -261,6 +261,7 @@ export default class Reachability {
|
|
|
261
261
|
|
|
262
262
|
// @ts-ignore
|
|
263
263
|
LoggerProxy.logger.log(
|
|
264
|
+
// @ts-ignore
|
|
264
265
|
`Reachability:index#onIceGatheringStateChange --> Successfully pinged ${peerConnection.key}:`,
|
|
265
266
|
elapsed
|
|
266
267
|
);
|
|
@@ -284,8 +285,8 @@ export default class Reachability {
|
|
|
284
285
|
if (e.candidate && String(e.candidate.type).toLowerCase() === SERVER_REFLEXIVE) {
|
|
285
286
|
const elapsed = this.getElapsedTime(peerConnection);
|
|
286
287
|
|
|
287
|
-
// @ts-ignore
|
|
288
288
|
LoggerProxy.logger.log(
|
|
289
|
+
// @ts-ignore
|
|
289
290
|
`Reachability:index#onIceCandidate --> Successfully pinged ${peerConnection.key}:`,
|
|
290
291
|
elapsed
|
|
291
292
|
);
|
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
import PermissionError from '../common/errors/permission';
|
|
2
|
+
import {CONTROLS, HTTP_VERBS} from '../constants';
|
|
3
|
+
import MeetingRequest from '../meeting/request';
|
|
4
|
+
import RecordingAction from './enums';
|
|
5
|
+
import Util from './util';
|
|
6
|
+
import LoggerProxy from '../common/logs/logger-proxy';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @description Recording manages the recording functionality of the meeting object, there should only be one instantation of recording per meeting
|
|
10
|
+
* @export
|
|
11
|
+
* @private
|
|
12
|
+
* @class Recording
|
|
13
|
+
*/
|
|
14
|
+
export default class RecordingController {
|
|
15
|
+
/**
|
|
16
|
+
* @instance
|
|
17
|
+
* @type {MeetingRequest}
|
|
18
|
+
* @private
|
|
19
|
+
* @memberof RecordingController
|
|
20
|
+
*/
|
|
21
|
+
private request: MeetingRequest;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* @instance
|
|
25
|
+
* @type {Array}
|
|
26
|
+
* @private
|
|
27
|
+
* @memberof RecordingInfo
|
|
28
|
+
*/
|
|
29
|
+
private displayHints: Array<string> = [];
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* @instance
|
|
33
|
+
* @type {string}
|
|
34
|
+
* @private
|
|
35
|
+
* @memberof RecordingInfo
|
|
36
|
+
*/
|
|
37
|
+
private serviceUrl: string;
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* @instance
|
|
41
|
+
* @type {string}
|
|
42
|
+
* @private
|
|
43
|
+
* @memberof RecordingInfo
|
|
44
|
+
*/
|
|
45
|
+
private sessionId: string;
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* @instance
|
|
49
|
+
* @type {string}
|
|
50
|
+
* @private
|
|
51
|
+
* @memberof RecordingInfo
|
|
52
|
+
*/
|
|
53
|
+
private locusUrl: string;
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* @instance
|
|
57
|
+
* @type {string}
|
|
58
|
+
* @private
|
|
59
|
+
* @memberof RecordingInfo
|
|
60
|
+
*/
|
|
61
|
+
private locusId: string;
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* @param {MeetingRequest} request
|
|
65
|
+
* @param {Object} options
|
|
66
|
+
* @constructor
|
|
67
|
+
* @memberof RecordingController
|
|
68
|
+
*/
|
|
69
|
+
constructor(
|
|
70
|
+
request: MeetingRequest,
|
|
71
|
+
options?: {
|
|
72
|
+
serviceUrl?: string;
|
|
73
|
+
sessionId: string;
|
|
74
|
+
locusUrl: string;
|
|
75
|
+
displayHints?: Array<string>;
|
|
76
|
+
}
|
|
77
|
+
) {
|
|
78
|
+
this.initialize(request);
|
|
79
|
+
this.set(options);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* @param {MeetingRequest} request
|
|
84
|
+
* @param {LocusInfo} info
|
|
85
|
+
* @returns {void}
|
|
86
|
+
* @private
|
|
87
|
+
* @memberof RecordingController
|
|
88
|
+
*/
|
|
89
|
+
private initialize(request: MeetingRequest) {
|
|
90
|
+
this.request = request;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* @param {Object} options
|
|
95
|
+
* @returns {void}
|
|
96
|
+
* @public
|
|
97
|
+
* @memberof RecordingController
|
|
98
|
+
*/
|
|
99
|
+
public set(options?: {
|
|
100
|
+
serviceUrl?: string;
|
|
101
|
+
sessionId: string;
|
|
102
|
+
locusUrl: string;
|
|
103
|
+
displayHints?: Array<string>;
|
|
104
|
+
}) {
|
|
105
|
+
this.extract(options);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* @param {string} url
|
|
110
|
+
* @returns {void}
|
|
111
|
+
* @public
|
|
112
|
+
* @memberof RecordingController
|
|
113
|
+
*/
|
|
114
|
+
public setLocusUrl(url: string) {
|
|
115
|
+
this.locusUrl = url;
|
|
116
|
+
this.locusId = Util.extractLocusId(this.locusUrl);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* @param {Array} hints
|
|
121
|
+
* @returns {void}
|
|
122
|
+
* @public
|
|
123
|
+
* @memberof RecordingController
|
|
124
|
+
*/
|
|
125
|
+
public setDisplayHints(hints: Array<string>) {
|
|
126
|
+
this.displayHints = hints;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* @param {string} id
|
|
131
|
+
* @returns {void}
|
|
132
|
+
* @public
|
|
133
|
+
* @memberof RecordingController
|
|
134
|
+
*/
|
|
135
|
+
public setSessionId(id: string) {
|
|
136
|
+
this.sessionId = id;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* @param {string} url
|
|
141
|
+
* @returns {void}
|
|
142
|
+
* @public
|
|
143
|
+
* @memberof RecordingController
|
|
144
|
+
*/
|
|
145
|
+
public setServiceUrl(url: string) {
|
|
146
|
+
this.serviceUrl = url;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* @returns {string}
|
|
151
|
+
* @public
|
|
152
|
+
* @memberof RecordingController
|
|
153
|
+
*/
|
|
154
|
+
public getLocusUrl() {
|
|
155
|
+
return this.locusUrl;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* @returns {string}
|
|
160
|
+
* @public
|
|
161
|
+
* @memberof RecordingController
|
|
162
|
+
*/
|
|
163
|
+
public getLocusId() {
|
|
164
|
+
return this.locusId;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* @returns {string}
|
|
169
|
+
* @public
|
|
170
|
+
* @memberof RecordingController
|
|
171
|
+
*/
|
|
172
|
+
public getSessionId() {
|
|
173
|
+
return this.sessionId;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* @returns {string}
|
|
178
|
+
* @public
|
|
179
|
+
* @memberof RecordingController
|
|
180
|
+
*/
|
|
181
|
+
public getServiceUrl() {
|
|
182
|
+
return this.serviceUrl;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* @returns {Array}
|
|
187
|
+
* @public
|
|
188
|
+
* @memberof RecordingController
|
|
189
|
+
*/
|
|
190
|
+
public getDisplayHints() {
|
|
191
|
+
return this.displayHints;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* @param {Object} options
|
|
196
|
+
* @returns {void}
|
|
197
|
+
* @private
|
|
198
|
+
* @memberof RecordingController
|
|
199
|
+
*/
|
|
200
|
+
private extract(options?: {
|
|
201
|
+
serviceUrl?: string;
|
|
202
|
+
sessionId: string;
|
|
203
|
+
locusUrl: string;
|
|
204
|
+
displayHints?: Array<string>;
|
|
205
|
+
}) {
|
|
206
|
+
this.setServiceUrl(options?.serviceUrl);
|
|
207
|
+
this.setSessionId(options?.sessionId);
|
|
208
|
+
this.setDisplayHints(options?.displayHints);
|
|
209
|
+
this.setLocusUrl(options?.locusUrl);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* @param {RecordingAction} action
|
|
214
|
+
* @private
|
|
215
|
+
* @memberof RecordingController
|
|
216
|
+
* @returns {Promise}
|
|
217
|
+
*/
|
|
218
|
+
private recordingService(action: RecordingAction): Promise<any> {
|
|
219
|
+
// @ts-ignore
|
|
220
|
+
return this.request.request({
|
|
221
|
+
body: {
|
|
222
|
+
meetingInfo: {
|
|
223
|
+
locusSessionId: this.sessionId,
|
|
224
|
+
},
|
|
225
|
+
recording: {
|
|
226
|
+
action: action.toLowerCase(),
|
|
227
|
+
},
|
|
228
|
+
},
|
|
229
|
+
uri: `${this.serviceUrl}/loci/${this.locusId}/recording`,
|
|
230
|
+
method: HTTP_VERBS.PUT,
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* @param {RecordingAction} action
|
|
236
|
+
* @private
|
|
237
|
+
* @memberof RecordingController
|
|
238
|
+
* @returns {Promise}
|
|
239
|
+
*/
|
|
240
|
+
private recordingControls(action: RecordingAction): Promise<any> {
|
|
241
|
+
const record = Util.deriveRecordingStates(action);
|
|
242
|
+
|
|
243
|
+
LoggerProxy.logger.log(`RecordingController:index#recordingControls --> ${record}`);
|
|
244
|
+
|
|
245
|
+
// @ts-ignore
|
|
246
|
+
return this.request.request({
|
|
247
|
+
uri: `${this.locusUrl}/${CONTROLS}`,
|
|
248
|
+
body: {
|
|
249
|
+
record,
|
|
250
|
+
},
|
|
251
|
+
method: HTTP_VERBS.PATCH,
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/**
|
|
256
|
+
* @param {RecordingAction} action
|
|
257
|
+
* @private
|
|
258
|
+
* @memberof RecordingController
|
|
259
|
+
* @returns {Promise}
|
|
260
|
+
*/
|
|
261
|
+
private recordingFacade(action: RecordingAction): Promise<any> {
|
|
262
|
+
LoggerProxy.logger.log(
|
|
263
|
+
`RecordingController:index#recordingFacade --> recording action [${action}]`
|
|
264
|
+
);
|
|
265
|
+
|
|
266
|
+
// assumes action is proper cased (i.e., Example)
|
|
267
|
+
if (Util?.[`canUser${action}`](this.displayHints)) {
|
|
268
|
+
if (this.serviceUrl) {
|
|
269
|
+
return this.recordingService(action);
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
return this.recordingControls(action);
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
return Promise.reject(
|
|
276
|
+
new PermissionError(`${action} recording not allowed, due to moderator property.`)
|
|
277
|
+
);
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* @private
|
|
282
|
+
* @memberof RecordingController
|
|
283
|
+
* @returns {Promise}
|
|
284
|
+
*/
|
|
285
|
+
public startRecording(): Promise<any> {
|
|
286
|
+
return this.recordingFacade(RecordingAction.Start);
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* @private
|
|
291
|
+
* @memberof RecordingController
|
|
292
|
+
* @returns {Promise}
|
|
293
|
+
*/
|
|
294
|
+
public stopRecording(): Promise<any> {
|
|
295
|
+
return this.recordingFacade(RecordingAction.Stop);
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
/**
|
|
299
|
+
* @private
|
|
300
|
+
* @memberof RecordingController
|
|
301
|
+
* @returns {Promise}
|
|
302
|
+
*/
|
|
303
|
+
public pauseRecording(): Promise<any> {
|
|
304
|
+
return this.recordingFacade(RecordingAction.Pause);
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
/**
|
|
308
|
+
* @private
|
|
309
|
+
* @memberof RecordingController
|
|
310
|
+
* @returns {Promise}
|
|
311
|
+
*/
|
|
312
|
+
public resumeRecording(): Promise<any> {
|
|
313
|
+
return this.recordingFacade(RecordingAction.Resume);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import {DISPLAY_HINTS} from '../constants';
|
|
2
|
+
import RecordingAction from './enums';
|
|
3
|
+
|
|
4
|
+
const canUserStart = (displayHints: Array<string>): boolean =>
|
|
5
|
+
displayHints.includes(DISPLAY_HINTS.RECORDING_CONTROL_START);
|
|
6
|
+
|
|
7
|
+
const canUserPause = (displayHints: Array<string>): boolean =>
|
|
8
|
+
displayHints.includes(DISPLAY_HINTS.RECORDING_CONTROL_PAUSE);
|
|
9
|
+
|
|
10
|
+
const canUserResume = (displayHints: Array<string>): boolean =>
|
|
11
|
+
displayHints.includes(DISPLAY_HINTS.RECORDING_CONTROL_RESUME);
|
|
12
|
+
|
|
13
|
+
const canUserStop = (displayHints: Array<string>): boolean =>
|
|
14
|
+
displayHints.includes(DISPLAY_HINTS.RECORDING_CONTROL_STOP);
|
|
15
|
+
|
|
16
|
+
const extractLocusId = (url: string) => {
|
|
17
|
+
return url?.split('/').pop();
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
const deriveRecordingStates = (action: RecordingAction): {recording: boolean; paused: boolean} => {
|
|
21
|
+
let recording;
|
|
22
|
+
let paused;
|
|
23
|
+
|
|
24
|
+
switch (action) {
|
|
25
|
+
case RecordingAction.Start:
|
|
26
|
+
recording = true;
|
|
27
|
+
paused = false;
|
|
28
|
+
break;
|
|
29
|
+
case RecordingAction.Stop:
|
|
30
|
+
recording = false;
|
|
31
|
+
paused = false;
|
|
32
|
+
break;
|
|
33
|
+
case RecordingAction.Resume:
|
|
34
|
+
recording = true;
|
|
35
|
+
paused = false;
|
|
36
|
+
break;
|
|
37
|
+
case RecordingAction.Pause:
|
|
38
|
+
recording = true;
|
|
39
|
+
paused = true;
|
|
40
|
+
break;
|
|
41
|
+
default:
|
|
42
|
+
throw new Error(`Recording state cannot be derived from invalid action: ${action}`);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return {
|
|
46
|
+
recording,
|
|
47
|
+
paused,
|
|
48
|
+
};
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
export default {
|
|
52
|
+
canUserStart,
|
|
53
|
+
canUserPause,
|
|
54
|
+
canUserResume,
|
|
55
|
+
canUserStop,
|
|
56
|
+
deriveRecordingStates,
|
|
57
|
+
extractLocusId,
|
|
58
|
+
};
|
package/src/roap/index.ts
CHANGED
|
@@ -170,8 +170,8 @@ export default class Roap extends StatelessWebexPlugin {
|
|
|
170
170
|
locusSelfUrl: meeting.selfUrl,
|
|
171
171
|
mediaId: options.mediaId,
|
|
172
172
|
correlationId: options.correlationId,
|
|
173
|
-
audioMuted: meeting.
|
|
174
|
-
videoMuted: meeting.
|
|
173
|
+
audioMuted: meeting.audio?.isLocallyMuted(),
|
|
174
|
+
videoMuted: meeting.video?.isLocallyMuted(),
|
|
175
175
|
meetingId: meeting.id,
|
|
176
176
|
})
|
|
177
177
|
.then(() => {
|
|
@@ -222,8 +222,8 @@ export default class Roap extends StatelessWebexPlugin {
|
|
|
222
222
|
locusSelfUrl: meeting.selfUrl,
|
|
223
223
|
mediaId: options.mediaId,
|
|
224
224
|
correlationId: options.correlationId,
|
|
225
|
-
audioMuted:
|
|
226
|
-
videoMuted:
|
|
225
|
+
audioMuted: meeting.audio?.isLocallyMuted(),
|
|
226
|
+
videoMuted: meeting.video?.isLocallyMuted(),
|
|
227
227
|
meetingId: meeting.id,
|
|
228
228
|
})
|
|
229
229
|
.then(() => {
|
|
@@ -295,8 +295,8 @@ export default class Roap extends StatelessWebexPlugin {
|
|
|
295
295
|
correlationId: meeting.correlationId,
|
|
296
296
|
locusSelfUrl: meeting.selfUrl,
|
|
297
297
|
mediaId: sendEmptyMediaId ? '' : meeting.mediaId,
|
|
298
|
-
audioMuted: meeting.
|
|
299
|
-
videoMuted: meeting.
|
|
298
|
+
audioMuted: meeting.audio?.isLocallyMuted(),
|
|
299
|
+
videoMuted: meeting.video?.isLocallyMuted(),
|
|
300
300
|
meetingId: meeting.id,
|
|
301
301
|
})
|
|
302
302
|
.then(({locus, mediaConnections}) => {
|
|
@@ -353,8 +353,8 @@ export default class Roap extends StatelessWebexPlugin {
|
|
|
353
353
|
roapMessage,
|
|
354
354
|
// eslint-disable-next-line no-warning-comments
|
|
355
355
|
// TODO: check whats the need for video and audiomute
|
|
356
|
-
audioMuted:
|
|
357
|
-
videoMuted:
|
|
356
|
+
audioMuted: meeting.audio?.isLocallyMuted(),
|
|
357
|
+
videoMuted: meeting.video?.isLocallyMuted(),
|
|
358
358
|
})
|
|
359
359
|
),
|
|
360
360
|
// mediaId: meeting.mediaId
|
|
@@ -177,8 +177,8 @@ export default class TurnDiscovery {
|
|
|
177
177
|
locusSelfUrl: meeting.selfUrl,
|
|
178
178
|
// @ts-ignore - Fix missing type
|
|
179
179
|
mediaId: isReconnecting ? '' : meeting.mediaId,
|
|
180
|
-
audioMuted: meeting.
|
|
181
|
-
videoMuted: meeting.
|
|
180
|
+
audioMuted: meeting.audio?.isLocallyMuted(),
|
|
181
|
+
videoMuted: meeting.video?.isLocallyMuted(),
|
|
182
182
|
meetingId: meeting.id,
|
|
183
183
|
})
|
|
184
184
|
.then(({mediaConnections}) => {
|
|
@@ -211,8 +211,8 @@ export default class TurnDiscovery {
|
|
|
211
211
|
// @ts-ignore - fix type
|
|
212
212
|
mediaId: meeting.mediaId,
|
|
213
213
|
correlationId: meeting.correlationId,
|
|
214
|
-
audioMuted: meeting.
|
|
215
|
-
videoMuted: meeting.
|
|
214
|
+
audioMuted: meeting.audio?.isLocallyMuted(),
|
|
215
|
+
videoMuted: meeting.video?.isLocallyMuted(),
|
|
216
216
|
meetingId: meeting.id,
|
|
217
217
|
});
|
|
218
218
|
}
|
|
@@ -230,7 +230,7 @@ export default class TurnDiscovery {
|
|
|
230
230
|
* media connection just after a reconnection
|
|
231
231
|
* @returns {Promise}
|
|
232
232
|
*/
|
|
233
|
-
doTurnDiscovery(meeting: Meeting, isReconnecting
|
|
233
|
+
doTurnDiscovery(meeting: Meeting, isReconnecting?: boolean) {
|
|
234
234
|
// @ts-ignore - fix type
|
|
235
235
|
const isAnyClusterReachable = meeting.webex.meetings.reachability.isAnyClusterReachable();
|
|
236
236
|
|
|
@@ -26,6 +26,7 @@ export const getAudioReceiverMqa = ({audioReceiver, statsResults, lastMqaDataSen
|
|
|
26
26
|
|
|
27
27
|
// @ts-ignore
|
|
28
28
|
audioReceiver.streams[0].common.maxRtpJitter =
|
|
29
|
+
// @ts-ignore
|
|
29
30
|
max(statsResults[mediaType][sendrecvType].meanRtpJitter) * 1000 || 0;
|
|
30
31
|
audioReceiver.streams[0].common.meanRtpJitter =
|
|
31
32
|
mean(statsResults[mediaType][sendrecvType].meanRtpJitter) * 1000 || 0;
|
|
@@ -72,6 +73,7 @@ export const getAudioSenderMqa = ({audioSender, statsResults, lastMqaDataSent})
|
|
|
72
73
|
|
|
73
74
|
// @ts-ignore
|
|
74
75
|
audioSender.common.maxRemoteJitter =
|
|
76
|
+
// @ts-ignore
|
|
75
77
|
max(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;
|
|
76
78
|
audioSender.common.meanRemoteJitter =
|
|
77
79
|
mean(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;
|
|
@@ -96,6 +98,7 @@ export const getAudioSenderMqa = ({audioSender, statsResults, lastMqaDataSent})
|
|
|
96
98
|
|
|
97
99
|
// @ts-ignore
|
|
98
100
|
audioSender.common.maxRoundTripTime =
|
|
101
|
+
// @ts-ignore
|
|
99
102
|
max(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;
|
|
100
103
|
audioSender.common.meanRoundTripTime =
|
|
101
104
|
mean(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;
|
|
@@ -152,6 +155,7 @@ export const getVideoReceiverMqa = ({
|
|
|
152
155
|
|
|
153
156
|
// @ts-ignore
|
|
154
157
|
videoReceiver.common.maxRemoteJitter =
|
|
158
|
+
// @ts-ignore
|
|
155
159
|
max(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;
|
|
156
160
|
videoReceiver.common.meanRemoteJitter =
|
|
157
161
|
mean(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;
|
|
@@ -217,6 +221,7 @@ export const getVideoSenderMqa = ({
|
|
|
217
221
|
|
|
218
222
|
// @ts-ignore
|
|
219
223
|
videoSender.common.maxRemoteJitter =
|
|
224
|
+
// @ts-ignore
|
|
220
225
|
max(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;
|
|
221
226
|
videoSender.common.meanRemoteJitter =
|
|
222
227
|
mean(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;
|
|
@@ -239,6 +244,7 @@ export const getVideoSenderMqa = ({
|
|
|
239
244
|
|
|
240
245
|
// @ts-ignore
|
|
241
246
|
videoSender.common.maxRoundTripTime =
|
|
247
|
+
// @ts-ignore
|
|
242
248
|
max(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;
|
|
243
249
|
videoSender.common.meanRoundTripTime =
|
|
244
250
|
mean(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;
|
|
@@ -5,7 +5,7 @@ import {assert} from '@webex/test-helper-chai';
|
|
|
5
5
|
import {skipInNode} from '@webex/test-helper-mocha';
|
|
6
6
|
import sinon from 'sinon';
|
|
7
7
|
|
|
8
|
-
import BrowserDetection from '@webex/plugin-meetings/
|
|
8
|
+
import BrowserDetection from '@webex/plugin-meetings/dist/common/browser-detection';
|
|
9
9
|
|
|
10
10
|
import DEFAULT_RESOLUTIONS from '../../../src/config';
|
|
11
11
|
import testUtils from '../../utils/testUtils';
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import {assert} from '@webex/test-helper-chai';
|
|
3
3
|
import {skipInNode, jenkinsOnly} from '@webex/test-helper-mocha';
|
|
4
4
|
import {patterns} from '@webex/common';
|
|
5
|
-
import MeetingInfoUtil from '@webex/plugin-meetings/
|
|
5
|
+
import MeetingInfoUtil from '@webex/plugin-meetings/dist/meeting-info/utilv2';
|
|
6
6
|
|
|
7
7
|
import CMR from '../../utils/cmr';
|
|
8
8
|
import testUtils from '../../utils/testUtils';
|