@webex/plugin-meetings 3.8.0-web-workers-keepalive.1 → 3.8.1-next.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/breakouts/breakout.js +1 -1
- package/dist/breakouts/index.js +70 -6
- package/dist/breakouts/index.js.map +1 -1
- package/dist/common/errors/webex-errors.js +12 -2
- package/dist/common/errors/webex-errors.js.map +1 -1
- package/dist/config.js +4 -1
- package/dist/config.js.map +1 -1
- package/dist/constants.js +22 -123
- package/dist/constants.js.map +1 -1
- package/dist/controls-options-manager/enums.js +2 -0
- package/dist/controls-options-manager/enums.js.map +1 -1
- package/dist/controls-options-manager/types.js.map +1 -1
- package/dist/controls-options-manager/util.js +52 -0
- package/dist/controls-options-manager/util.js.map +1 -1
- package/dist/interpretation/index.js +1 -1
- package/dist/interpretation/siLanguage.js +1 -1
- package/dist/locus-info/controlsUtils.js +30 -10
- package/dist/locus-info/controlsUtils.js.map +1 -1
- package/dist/locus-info/index.js +83 -12
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/selfUtils.js +432 -418
- package/dist/locus-info/selfUtils.js.map +1 -1
- package/dist/media/index.js +17 -17
- package/dist/media/index.js.map +1 -1
- package/dist/media/properties.js +94 -6
- package/dist/media/properties.js.map +1 -1
- package/dist/meeting/brbState.js +9 -2
- package/dist/meeting/brbState.js.map +1 -1
- package/dist/meeting/in-meeting-actions.js +17 -1
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +568 -328
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/locusMediaRequest.js +0 -17
- package/dist/meeting/locusMediaRequest.js.map +1 -1
- package/dist/meeting/muteState.js +4 -4
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.js +30 -0
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/request.type.js.map +1 -1
- package/dist/meeting/util.js +9 -1
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js +19 -13
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meeting-info/utilv2.js +5 -1
- package/dist/meeting-info/utilv2.js.map +1 -1
- package/dist/meetings/index.js +76 -0
- package/dist/meetings/index.js.map +1 -1
- package/dist/meetings/util.js +14 -0
- package/dist/meetings/util.js.map +1 -1
- package/dist/member/index.js +45 -9
- package/dist/member/index.js.map +1 -1
- package/dist/member/types.js +3 -0
- package/dist/member/types.js.map +1 -1
- package/dist/member/util.js +335 -356
- package/dist/member/util.js.map +1 -1
- package/dist/members/collection.js.map +1 -1
- package/dist/members/index.js +137 -29
- package/dist/members/index.js.map +1 -1
- package/dist/members/request.js +38 -0
- package/dist/members/request.js.map +1 -1
- package/dist/members/util.js +36 -1
- package/dist/members/util.js.map +1 -1
- package/dist/metrics/constants.js +1 -0
- package/dist/metrics/constants.js.map +1 -1
- package/dist/reachability/clusterReachability.js +23 -31
- package/dist/reachability/clusterReachability.js.map +1 -1
- package/dist/reachability/index.js +42 -2
- package/dist/reachability/index.js.map +1 -1
- package/dist/reconnection-manager/index.js +2 -2
- package/dist/reconnection-manager/index.js.map +1 -1
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/turnDiscovery.js +45 -27
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/roap/types.js +17 -0
- package/dist/roap/types.js.map +1 -0
- package/dist/types/common/errors/webex-errors.d.ts +7 -1
- package/dist/types/config.d.ts +2 -0
- package/dist/types/constants.d.ts +15 -85
- package/dist/types/controls-options-manager/enums.d.ts +3 -1
- package/dist/types/controls-options-manager/types.d.ts +7 -1
- package/dist/types/locus-info/index.d.ts +3 -3
- package/dist/types/locus-info/selfUtils.d.ts +216 -1
- package/dist/types/media/properties.d.ts +15 -0
- package/dist/types/meeting/in-meeting-actions.d.ts +16 -0
- package/dist/types/meeting/index.d.ts +35 -1
- package/dist/types/meeting/muteState.d.ts +0 -1
- package/dist/types/meeting/request.d.ts +12 -1
- package/dist/types/meeting/request.type.d.ts +6 -0
- package/dist/types/meeting/util.d.ts +3 -1
- package/dist/types/meeting-info/meeting-info-v2.d.ts +2 -1
- package/dist/types/meetings/index.d.ts +28 -0
- package/dist/types/member/index.d.ts +20 -6
- package/dist/types/member/types.d.ts +73 -14
- package/dist/types/member/util.d.ts +156 -1
- package/dist/types/members/collection.d.ts +6 -5
- package/dist/types/members/index.d.ts +32 -43
- package/dist/types/members/request.d.ts +26 -0
- package/dist/types/members/util.d.ts +27 -0
- package/dist/types/metrics/constants.d.ts +1 -0
- package/dist/types/reachability/clusterReachability.d.ts +2 -6
- package/dist/types/reachability/index.d.ts +8 -0
- package/dist/types/roap/index.d.ts +3 -2
- package/dist/types/roap/turnDiscovery.d.ts +5 -17
- package/dist/types/roap/types.d.ts +16 -0
- package/dist/webinar/index.js +1 -1
- package/package.json +24 -23
- package/src/breakouts/index.ts +69 -0
- package/src/common/errors/webex-errors.ts +8 -1
- package/src/config.ts +2 -0
- package/src/constants.ts +23 -90
- package/src/controls-options-manager/enums.ts +2 -0
- package/src/controls-options-manager/types.ts +11 -1
- package/src/controls-options-manager/util.ts +62 -0
- package/src/locus-info/controlsUtils.ts +48 -12
- package/src/locus-info/index.ts +88 -13
- package/src/locus-info/selfUtils.ts +496 -442
- package/src/media/index.ts +23 -21
- package/src/media/properties.ts +96 -0
- package/src/meeting/brbState.ts +11 -2
- package/src/meeting/in-meeting-actions.ts +32 -0
- package/src/meeting/index.ts +356 -87
- package/src/meeting/locusMediaRequest.ts +0 -18
- package/src/meeting/muteState.ts +4 -4
- package/src/meeting/request.ts +36 -1
- package/src/meeting/request.type.ts +7 -0
- package/src/meeting/util.ts +9 -1
- package/src/meeting-info/meeting-info-v2.ts +7 -2
- package/src/meeting-info/utilv2.ts +5 -0
- package/src/meetings/index.ts +76 -0
- package/src/meetings/util.ts +18 -0
- package/src/member/index.ts +57 -22
- package/src/member/types.ts +82 -16
- package/src/member/util.ts +357 -353
- package/src/members/collection.ts +4 -3
- package/src/members/index.ts +137 -18
- package/src/members/request.ts +44 -0
- package/src/members/util.ts +43 -1
- package/src/metrics/constants.ts +1 -0
- package/src/reachability/clusterReachability.ts +26 -25
- package/src/reachability/index.ts +55 -1
- package/src/reconnection-manager/index.ts +2 -2
- package/src/roap/index.ts +3 -7
- package/src/roap/turnDiscovery.ts +34 -39
- package/src/roap/types.ts +23 -0
- package/test/unit/spec/breakouts/index.ts +167 -95
- package/test/unit/spec/controls-options-manager/util.js +120 -0
- package/test/unit/spec/locus-info/controlsUtils.js +131 -9
- package/test/unit/spec/locus-info/index.js +195 -73
- package/test/unit/spec/locus-info/selfUtils.js +98 -24
- package/test/unit/spec/media/index.ts +150 -18
- package/test/unit/spec/media/properties.ts +130 -0
- package/test/unit/spec/meeting/brbState.ts +40 -2
- package/test/unit/spec/meeting/in-meeting-actions.ts +19 -4
- package/test/unit/spec/meeting/index.js +553 -36
- package/test/unit/spec/meeting/locusMediaRequest.ts +0 -30
- package/test/unit/spec/meeting/muteState.js +73 -2
- package/test/unit/spec/meeting/request.js +32 -1
- package/test/unit/spec/meeting/utils.js +79 -33
- package/test/unit/spec/meeting-info/meetinginfov2.js +41 -0
- package/test/unit/spec/meeting-info/utilv2.js +19 -0
- package/test/unit/spec/meetings/index.js +68 -1
- package/test/unit/spec/members/index.js +304 -78
- package/test/unit/spec/members/request.js +68 -22
- package/test/unit/spec/members/utils.js +75 -0
- package/test/unit/spec/reachability/clusterReachability.ts +41 -55
- package/test/unit/spec/reachability/index.ts +89 -0
- package/test/unit/spec/reconnection-manager/index.js +4 -4
- package/test/unit/spec/roap/turnDiscovery.ts +110 -28
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.8.
|
47
|
-
"@webex/plugin-rooms": "3.8.0-
|
48
|
-
"@webex/test-helper-chai": "3.8.0-
|
49
|
-
"@webex/test-helper-mocha": "3.8.0-
|
50
|
-
"@webex/test-helper-mock-webex": "3.8.0-
|
51
|
-
"@webex/test-helper-retry": "3.8.0-
|
52
|
-
"@webex/test-helper-test-users": "3.8.0-
|
46
|
+
"@webex/plugin-meetings": "3.8.1-next.1",
|
47
|
+
"@webex/plugin-rooms": "3.8.0-next.29",
|
48
|
+
"@webex/test-helper-chai": "3.8.0-next.24",
|
49
|
+
"@webex/test-helper-mocha": "3.8.0-next.24",
|
50
|
+
"@webex/test-helper-mock-webex": "3.8.0-next.24",
|
51
|
+
"@webex/test-helper-retry": "3.8.0-next.24",
|
52
|
+
"@webex/test-helper-test-users": "3.8.0-next.24",
|
53
53
|
"chai": "^4.3.4",
|
54
54
|
"chai-as-promised": "^7.1.1",
|
55
55
|
"eslint": "^8.24.0",
|
@@ -61,22 +61,23 @@
|
|
61
61
|
"typescript": "^4.7.4"
|
62
62
|
},
|
63
63
|
"dependencies": {
|
64
|
-
"@webex/common": "3.8.0-
|
65
|
-
"@webex/event-dictionary-ts": "^1.0.
|
66
|
-
"@webex/internal-media-core": "2.
|
67
|
-
"@webex/internal-plugin-conversation": "3.8.0-
|
68
|
-
"@webex/internal-plugin-device": "3.8.0-
|
69
|
-
"@webex/internal-plugin-llm": "3.8.0-
|
70
|
-
"@webex/internal-plugin-mercury": "3.8.0-
|
71
|
-
"@webex/internal-plugin-metrics": "3.8.0-
|
72
|
-
"@webex/internal-plugin-support": "3.8.0-
|
73
|
-
"@webex/internal-plugin-user": "3.8.0-
|
74
|
-
"@webex/internal-plugin-voicea": "3.8.
|
75
|
-
"@webex/media-helpers": "3.8.0-
|
76
|
-
"@webex/plugin-people": "3.8.0-
|
77
|
-
"@webex/plugin-rooms": "3.8.0-
|
64
|
+
"@webex/common": "3.8.0-next.24",
|
65
|
+
"@webex/event-dictionary-ts": "^1.0.1753",
|
66
|
+
"@webex/internal-media-core": "2.17.1",
|
67
|
+
"@webex/internal-plugin-conversation": "3.8.0-next.29",
|
68
|
+
"@webex/internal-plugin-device": "3.8.0-next.24",
|
69
|
+
"@webex/internal-plugin-llm": "3.8.0-next.27",
|
70
|
+
"@webex/internal-plugin-mercury": "3.8.0-next.26",
|
71
|
+
"@webex/internal-plugin-metrics": "3.8.0-next.24",
|
72
|
+
"@webex/internal-plugin-support": "3.8.0-next.29",
|
73
|
+
"@webex/internal-plugin-user": "3.8.0-next.24",
|
74
|
+
"@webex/internal-plugin-voicea": "3.8.1-next.1",
|
75
|
+
"@webex/media-helpers": "3.8.0-next.30",
|
76
|
+
"@webex/plugin-people": "3.8.0-next.26",
|
77
|
+
"@webex/plugin-rooms": "3.8.0-next.29",
|
78
|
+
"@webex/ts-sdp": "^1.8.1",
|
78
79
|
"@webex/web-capabilities": "^1.4.0",
|
79
|
-
"@webex/webex-core": "3.8.0-
|
80
|
+
"@webex/webex-core": "3.8.0-next.24",
|
80
81
|
"ampersand-collection": "^2.0.2",
|
81
82
|
"bowser": "^2.11.0",
|
82
83
|
"btoa": "^1.2.1",
|
@@ -92,5 +93,5 @@
|
|
92
93
|
"//": [
|
93
94
|
"TODO: upgrade jwt-decode when moving to node 18"
|
94
95
|
],
|
95
|
-
"version": "3.8.
|
96
|
+
"version": "3.8.1-next.1"
|
96
97
|
}
|
package/src/breakouts/index.ts
CHANGED
@@ -45,6 +45,8 @@ const Breakouts = WebexPlugin.extend({
|
|
45
45
|
intervalID: 'number',
|
46
46
|
meetingId: 'string',
|
47
47
|
canManageBreakouts: 'boolean', // appear the ability to manage breakouts
|
48
|
+
mainGroupId: 'string', // appears from the moment you enable breakouts
|
49
|
+
mainSessionId: 'string', // appears from the moment you enable breakouts
|
48
50
|
},
|
49
51
|
children: {
|
50
52
|
currentBreakoutSession: Breakout,
|
@@ -544,6 +546,28 @@ const Breakouts = WebexPlugin.extend({
|
|
544
546
|
}
|
545
547
|
},
|
546
548
|
|
549
|
+
/**
|
550
|
+
* set main group id
|
551
|
+
* @param {Object} breakoutInfo -- breakout groups
|
552
|
+
* @returns {void}
|
553
|
+
*/
|
554
|
+
_setMainGroupId(breakoutInfo) {
|
555
|
+
if (breakoutInfo?.body?.mainGroupId) {
|
556
|
+
this.set('mainGroupId', breakoutInfo.body.mainGroupId);
|
557
|
+
}
|
558
|
+
},
|
559
|
+
|
560
|
+
/**
|
561
|
+
* set main session id
|
562
|
+
* @param {Object} breakoutInfo -- breakout groups
|
563
|
+
* @returns {void}
|
564
|
+
*/
|
565
|
+
_setMainSessionId(breakoutInfo) {
|
566
|
+
if (breakoutInfo?.body?.mainSessionId) {
|
567
|
+
this.set('mainSessionId', breakoutInfo.body.mainSessionId);
|
568
|
+
}
|
569
|
+
},
|
570
|
+
|
547
571
|
/**
|
548
572
|
* Create new breakout sessions
|
549
573
|
* @param {object} params -- breakout session group
|
@@ -567,6 +591,8 @@ const Breakouts = WebexPlugin.extend({
|
|
567
591
|
});
|
568
592
|
|
569
593
|
this._setManageGroups(breakoutInfo);
|
594
|
+
this._setMainGroupId(breakoutInfo);
|
595
|
+
this._setMainSessionId(breakoutInfo);
|
570
596
|
|
571
597
|
// clear edit lock info after save breakout session info
|
572
598
|
this._clearEditLockInfo();
|
@@ -630,6 +656,8 @@ const Breakouts = WebexPlugin.extend({
|
|
630
656
|
});
|
631
657
|
|
632
658
|
this._setManageGroups(breakoutInfo);
|
659
|
+
this._setMainGroupId(breakoutInfo);
|
660
|
+
this._setMainSessionId(breakoutInfo);
|
633
661
|
|
634
662
|
return breakoutInfo;
|
635
663
|
},
|
@@ -665,6 +693,8 @@ const Breakouts = WebexPlugin.extend({
|
|
665
693
|
});
|
666
694
|
|
667
695
|
this._setManageGroups(breakoutInfo);
|
696
|
+
this._setMainGroupId(breakoutInfo);
|
697
|
+
this._setMainSessionId(breakoutInfo);
|
668
698
|
|
669
699
|
return breakoutInfo;
|
670
700
|
},
|
@@ -718,6 +748,9 @@ const Breakouts = WebexPlugin.extend({
|
|
718
748
|
});
|
719
749
|
|
720
750
|
this._setManageGroups(breakout);
|
751
|
+
this._setMainGroupId(breakout);
|
752
|
+
this._setMainSessionId(breakout);
|
753
|
+
|
721
754
|
if (editlock && breakout.body?.editlock?.token) {
|
722
755
|
this.set('editLock', breakout.body.editlock);
|
723
756
|
this.keepEditLockAlive();
|
@@ -916,6 +949,42 @@ const Breakouts = WebexPlugin.extend({
|
|
916
949
|
body,
|
917
950
|
});
|
918
951
|
},
|
952
|
+
/**
|
953
|
+
* Move participants to main session lobby
|
954
|
+
* @param {Array} sessions
|
955
|
+
* @param {string} sessions[].participants - Participant IDs to move
|
956
|
+
* @returns {void}
|
957
|
+
*/
|
958
|
+
moveToLobby(sessions: Array<{participants: string[]}>) {
|
959
|
+
if (!this.mainGroupId || !this.mainSessionId) {
|
960
|
+
throw new Error(
|
961
|
+
'Main group ID and session ID must be available to move participants to lobby'
|
962
|
+
);
|
963
|
+
}
|
964
|
+
|
965
|
+
const updatedSessions = sessions.map((item) => {
|
966
|
+
return {
|
967
|
+
id: this.mainSessionId,
|
968
|
+
participants: item.participants,
|
969
|
+
targetState: 'LOBBY',
|
970
|
+
};
|
971
|
+
});
|
972
|
+
|
973
|
+
const body = {
|
974
|
+
groups: [
|
975
|
+
{
|
976
|
+
id: this.mainGroupId,
|
977
|
+
sessions: updatedSessions,
|
978
|
+
},
|
979
|
+
],
|
980
|
+
};
|
981
|
+
|
982
|
+
return this.request({
|
983
|
+
method: HTTP_VERBS.PUT,
|
984
|
+
uri: `${this.url}/dynamicAssign`,
|
985
|
+
body,
|
986
|
+
});
|
987
|
+
},
|
919
988
|
/**
|
920
989
|
* trigger ASK_RETURN_TO_MAIN event when main session requested
|
921
990
|
* @param {Object} breakout
|
@@ -152,12 +152,19 @@ WebExMeetingsErrors[IceGatheringFailed.CODE] = IceGatheringFailed;
|
|
152
152
|
* @extends WebexMeetingsError
|
153
153
|
* @property {number} code - 30203
|
154
154
|
* @property {string} message - 'Failed to add media'
|
155
|
+
* @property {Error} [cause] - The underlying error that caused the failure
|
155
156
|
*/
|
156
157
|
class AddMediaFailed extends WebexMeetingsError {
|
157
158
|
static CODE = 30203;
|
159
|
+
cause?: Error;
|
158
160
|
|
159
|
-
|
161
|
+
/**
|
162
|
+
* Creates a new AddMediaFailed error
|
163
|
+
* @param {Error} [cause] - The underlying error that caused the media addition to fail
|
164
|
+
*/
|
165
|
+
constructor(cause?: Error) {
|
160
166
|
super(AddMediaFailed.CODE, 'Failed to add media');
|
167
|
+
this.cause = cause;
|
161
168
|
}
|
162
169
|
}
|
163
170
|
export {AddMediaFailed};
|
package/src/config.ts
CHANGED
@@ -98,5 +98,7 @@ export default {
|
|
98
98
|
enableReachabilityChecks: true,
|
99
99
|
reachabilityGetClusterTimeout: 5000,
|
100
100
|
logUploadIntervalMultiplicationFactor: 0, // if set to 0 or undefined, logs won't be uploaded periodically, if you want periodic logs, recommended value is 1
|
101
|
+
stopIceGatheringAfterFirstRelayCandidate: false,
|
102
|
+
enableAudioTwccForMultistream: false,
|
101
103
|
},
|
102
104
|
};
|
package/src/constants.ts
CHANGED
@@ -369,6 +369,9 @@ export const EVENT_TRIGGERS = {
|
|
369
369
|
MEETING_CONTROLS_MEETING_FULL_UPDATED: 'meeting:controls:meeting-full:updated',
|
370
370
|
MEETING_CONTROLS_PRACTICE_SESSION_STATUS_UPDATED:
|
371
371
|
'meeting:controls:practice-session-status:updated',
|
372
|
+
MEETING_CONTROLS_ANNOTATION_UPDATED: 'meeting:controls:annotation:updated',
|
373
|
+
MEETING_CONTROLS_REMOTE_DESKTOP_CONTROL_UPDATED:
|
374
|
+
'meeting:controls:remote-desktop-control:updated',
|
372
375
|
// Locus URL changed
|
373
376
|
MEETING_LOCUS_URL_UPDATE: 'meeting:locus:locusUrl:update',
|
374
377
|
MEETING_STREAM_PUBLISH_STATE_CHANGED: 'meeting:streamPublishStateChanged',
|
@@ -376,8 +379,10 @@ export const EVENT_TRIGGERS = {
|
|
376
379
|
MEETING_TRANSCRIPTION_CONNECTED: 'meeting:transcription:connected',
|
377
380
|
MEETING_STARTED_RECEIVING_TRANSCRIPTION: 'meeting:receiveTranscription:started',
|
378
381
|
MEETING_STOPPED_RECEIVING_TRANSCRIPTION: 'meeting:receiveTranscription:stopped',
|
382
|
+
MEETING_TRANSCRIPTION_SPOKEN_LANGUAGE_UPDATED: 'meeting:transcription:spokenLanguageUpdate',
|
379
383
|
MEETING_MANUAL_CAPTION_UPDATED: 'meeting:manualCaptionControl:updated',
|
380
384
|
MEETING_CAPTION_RECEIVED: 'meeting:caption-received',
|
385
|
+
MEETING_PARTICIPANT_REASON_CHANGED: 'meeting:participant-reason-changed',
|
381
386
|
};
|
382
387
|
|
383
388
|
export const EVENT_TYPES = {
|
@@ -695,6 +700,8 @@ export const LOCUSINFO = {
|
|
695
700
|
CONTROLS_MEETING_LAYOUT_UPDATED: 'CONTROLS_MEETING_LAYOUT_UPDATED',
|
696
701
|
CONTROLS_RECORDING_UPDATED: 'CONTROLS_RECORDING_UPDATED',
|
697
702
|
CONTROLS_MEETING_TRANSCRIBE_UPDATED: 'CONTROLS_MEETING_TRANSCRIBE_UPDATED',
|
703
|
+
CONTROLS_MEETING_TRANSCRIPTION_SPOKEN_LANGUAGE_UPDATED:
|
704
|
+
'CONTROLS_MEETING_TRANSCRIPTION_SPOKEN_LANGUAGE_UPDATED',
|
698
705
|
CONTROLS_MEETING_MANUAL_CAPTION_UPDATED: 'CONTROLS_MEETING_MANUAL_CAPTION_UPDATED',
|
699
706
|
CONTROLS_MEETING_BREAKOUT_UPDATED: 'CONTROLS_MEETING_BREAKOUT_UPDATED',
|
700
707
|
CONTROLS_MEETING_CONTAINER_UPDATED: 'CONTROLS_MEETING_CONTAINER_UPDATED',
|
@@ -711,6 +718,8 @@ export const LOCUSINFO = {
|
|
711
718
|
CONTROLS_PRACTICE_SESSION_STATUS_UPDATED: 'CONTROLS_PRACTICE_SESSION_STATUS_UPDATED',
|
712
719
|
CONTROLS_VIDEO_CHANGED: 'CONTROLS_VIDEO_CHANGED',
|
713
720
|
CONTROLS_STAGE_VIEW_UPDATED: 'CONTROLS_STAGE_VIEW_UPDATED',
|
721
|
+
CONTROLS_ANNOTATION_CHANGED: 'CONTROLS_ANNOTATION_CHANGED',
|
722
|
+
CONTROLS_REMOTE_DESKTOP_CONTROL_CHANGED: 'CONTROLS_REMOTE_DESKTOP_CONTROL_CHANGED',
|
714
723
|
SELF_UNADMITTED_GUEST: 'SELF_UNADMITTED_GUEST',
|
715
724
|
SELF_ADMITTED_GUEST: 'SELF_ADMITTED_GUEST',
|
716
725
|
SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED: 'SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED',
|
@@ -738,6 +747,7 @@ export const LOCUSINFO = {
|
|
738
747
|
MEDIA_INACTIVITY: 'MEDIA_INACTIVITY',
|
739
748
|
LINKS_SERVICES: 'LINKS_SERVICES',
|
740
749
|
LINKS_RESOURCES: 'LINKS_RESOURCES',
|
750
|
+
PARTICIPANT_REASON_CHANGED: 'PARTICIPANT_REASON_CHANGED',
|
741
751
|
},
|
742
752
|
};
|
743
753
|
|
@@ -906,6 +916,7 @@ export enum SELF_POLICY {
|
|
906
916
|
SUPPORT_NETWORK_BASED_RECORD = 'supportNetworkBasedRecord',
|
907
917
|
SUPPORT_PREMISE_RECORD = 'supportPremiseRecord',
|
908
918
|
SUPPORT_REALTIME_CLOSE_CAPTION = 'supportRealtimeCloseCaption',
|
919
|
+
SUPPORT_REALTIME_CLOSE_CAPTION_MANUAL = 'supportRealtimeCloseCaptionManual',
|
909
920
|
SUPPORT_CHAT = 'supportChat',
|
910
921
|
SUPPORT_DESKTOP_SHARE_REMOTE = 'supportDesktopShareRemote',
|
911
922
|
SUPPORT_DESKTOP_SHARE = 'supportDesktopShare',
|
@@ -973,6 +984,7 @@ export const DISPLAY_HINTS = {
|
|
973
984
|
PRESENTER_CONTROL: 'PRESENTER_CONTROL',
|
974
985
|
CAN_RENAME_SELF_AND_OBSERVED: 'CAN_RENAME_SELF_AND_OBSERVED',
|
975
986
|
CAN_RENAME_OTHERS: 'CAN_RENAME_OTHERS',
|
987
|
+
MOVE_TO_LOBBY: 'MOVE_TO_LOBBY',
|
976
988
|
|
977
989
|
// breakout session
|
978
990
|
BREAKOUT_MANAGEMENT: 'BREAKOUT_MANAGEMENT',
|
@@ -1026,6 +1038,17 @@ export const DISPLAY_HINTS = {
|
|
1026
1038
|
PRACTICE_SESSION_OFF: 'PRACTICE_SESSION_OFF',
|
1027
1039
|
SHOW_PRACTICE_SESSION_START: 'SHOW_PRACTICE_SESSION_START',
|
1028
1040
|
SHOW_PRACTICE_SESSION_STOP: 'SHOW_PRACTICE_SESSION_STOP',
|
1041
|
+
|
1042
|
+
// Explicit consent for post meeting data
|
1043
|
+
SHOW_POST_MEETING_DATA_CONSENT_PROMPT: 'SHOW_POST_MEETING_DATA_CONSENT_PROMPT',
|
1044
|
+
|
1045
|
+
// Annotations
|
1046
|
+
ENABLE_ANNOTATION_MEETING_OPTION: 'ENABLE_ANNOTATION_MEETING_OPTION',
|
1047
|
+
DISABLE_ANNOTATION_MEETING_OPTION: 'DISABLE_ANNOTATION_MEETING_OPTION',
|
1048
|
+
|
1049
|
+
// Remote Desktop Control
|
1050
|
+
ENABLE_RDC_MEETING_OPTION: 'ENABLE_RDC_MEETING_OPTION',
|
1051
|
+
DISABLE_RDC_MEETING_OPTION: 'DISABLE_RDC_MEETING_OPTION',
|
1029
1052
|
};
|
1030
1053
|
|
1031
1054
|
export const INTERSTITIAL_DISPLAY_HINTS = [DISPLAY_HINTS.VOIP_IS_ENABLED];
|
@@ -1150,96 +1173,6 @@ export const NETWORK_STATUS = {
|
|
1150
1173
|
|
1151
1174
|
export type NETWORK_STATUS = Enum<typeof NETWORK_STATUS>;
|
1152
1175
|
|
1153
|
-
export const NETWORK_TYPE = {
|
1154
|
-
VPN: 'vpn',
|
1155
|
-
UNKNOWN: 'unknown',
|
1156
|
-
WIFI: 'wifi',
|
1157
|
-
ETHERNET: 'ethernet',
|
1158
|
-
};
|
1159
|
-
|
1160
|
-
export const STATS = {
|
1161
|
-
SEND_DIRECTION: 'send',
|
1162
|
-
RECEIVE_DIRECTION: 'recv',
|
1163
|
-
REMOTE: 'remote',
|
1164
|
-
LOCAL: 'local',
|
1165
|
-
};
|
1166
|
-
|
1167
|
-
export const MQA_STATS = {
|
1168
|
-
MQA_SIZE: 120, // MQA is done on 60 second intervals by server def, add a buffer for missed events
|
1169
|
-
CA_TYPE: 'MQA',
|
1170
|
-
DEFAULT_IP: '0.0.0.0',
|
1171
|
-
DEFAULT_SHARE_SENDER_STATS: {
|
1172
|
-
common: {
|
1173
|
-
common: {
|
1174
|
-
direction: 'sendrecv', // TODO: parse from SDP and save globally
|
1175
|
-
isMain: false, // always true for share sender
|
1176
|
-
mariFecEnabled: false, // unavailable
|
1177
|
-
mariRtxEnabled: false, // unavailable
|
1178
|
-
mariLiteEnabled: false, // unavailable
|
1179
|
-
mariQosEnabled: false, // unavailable
|
1180
|
-
multistreamEnabled: false, // unavailable
|
1181
|
-
},
|
1182
|
-
availableBitrate: 0,
|
1183
|
-
dtlsBitrate: 0, // unavailable
|
1184
|
-
dtlsPackets: 0, // unavailable
|
1185
|
-
fecBitrate: 0, // unavailable
|
1186
|
-
fecPackets: 0, // unavailable
|
1187
|
-
maxBitrate: 0, // unavailable
|
1188
|
-
queueDelay: 0, // unavailable
|
1189
|
-
remoteJitter: 0, // unavailable
|
1190
|
-
remoteLossRate: 0,
|
1191
|
-
roundTripTime: 0,
|
1192
|
-
rtcpBitrate: 0, // unavailable
|
1193
|
-
rtcpPackets: 0, // unavailable
|
1194
|
-
rtpBitrate: 0, // unavailable
|
1195
|
-
rtpPackets: 0,
|
1196
|
-
stunBitrate: 0, // unavailable
|
1197
|
-
stunPackets: 0, // unavailable
|
1198
|
-
transportType: 'UDP', // TODO: parse the transport type from the SDP and save globally
|
1199
|
-
},
|
1200
|
-
streams: [
|
1201
|
-
{
|
1202
|
-
common: {
|
1203
|
-
codec: 'H264', // TODO: parse the codec from the SDP and save globally
|
1204
|
-
duplicateSsci: 0, // unavailable
|
1205
|
-
requestedBitrate: 0, // unavailable
|
1206
|
-
requestedFrames: 0, // unavailable
|
1207
|
-
rtpPackets: 0,
|
1208
|
-
ssci: 0, // unavailable
|
1209
|
-
transmittedBitrate: 0,
|
1210
|
-
transmittedFrameRate: 0,
|
1211
|
-
},
|
1212
|
-
h264CodecProfile: 'BP', // TODO: parse the profile level from h264 in the SDP and save globally
|
1213
|
-
localConfigurationChanges: 0, // unavailable
|
1214
|
-
remoteConfigurationChanges: 0, // unavailable
|
1215
|
-
requestedFrameSize: 0, // unavailable
|
1216
|
-
requestedKeyFrames: 0, // unavailable
|
1217
|
-
transmittedFrameSize: 0, // unavailable
|
1218
|
-
transmittedHeight: 0,
|
1219
|
-
transmittedKeyFrames: 0,
|
1220
|
-
transmittedWidth: 0,
|
1221
|
-
},
|
1222
|
-
],
|
1223
|
-
},
|
1224
|
-
intervalMetadata: {
|
1225
|
-
memoryUsage: {
|
1226
|
-
cpuBitWidth: 0,
|
1227
|
-
mainProcessMaximumMemoryBytes: 0,
|
1228
|
-
osBitWidth: 0,
|
1229
|
-
processAverageMemoryUsage: 0,
|
1230
|
-
processMaximumMemoryBytes: 0,
|
1231
|
-
processMaximumMemoryUsage: 0,
|
1232
|
-
systemAverageMemoryUsage: 0,
|
1233
|
-
systemMaximumMemoryUsage: 0,
|
1234
|
-
},
|
1235
|
-
peerReflexiveIP: 'NULL', // TODO: save after ice trickling completes and use as a global variable
|
1236
|
-
processAverageCPU: 0,
|
1237
|
-
processMaximumCPU: 0,
|
1238
|
-
systemAverageCPU: 0,
|
1239
|
-
systemMaximumCPU: 0,
|
1240
|
-
},
|
1241
|
-
};
|
1242
|
-
|
1243
1176
|
// ****** MEDIA QUALITY CONSTANTS ****** //
|
1244
1177
|
|
1245
1178
|
// these values must match allowed values of RemoteQualityLevel from the @webex/internal-media-core lib
|
@@ -40,13 +40,23 @@ export interface ViewTheParticipantListProperties {
|
|
40
40
|
attendeeCount?: boolean;
|
41
41
|
}
|
42
42
|
|
43
|
+
export interface AnnotationProperties {
|
44
|
+
enabled?: boolean;
|
45
|
+
}
|
46
|
+
|
47
|
+
export interface RemoteDesktopControlProperties {
|
48
|
+
enabled?: boolean;
|
49
|
+
}
|
50
|
+
|
43
51
|
export type Properties =
|
44
52
|
| AudioProperties
|
45
53
|
| RaiseHandProperties
|
46
54
|
| ReactionsProperties
|
47
55
|
| ShareControlProperties
|
48
56
|
| VideoProperties
|
49
|
-
| ViewTheParticipantListProperties
|
57
|
+
| ViewTheParticipantListProperties
|
58
|
+
| AnnotationProperties
|
59
|
+
| RemoteDesktopControlProperties;
|
50
60
|
|
51
61
|
export interface ControlConfig<Props = Properties> {
|
52
62
|
/**
|
@@ -7,6 +7,8 @@ import {
|
|
7
7
|
ReactionsProperties,
|
8
8
|
ViewTheParticipantListProperties,
|
9
9
|
VideoProperties,
|
10
|
+
type RemoteDesktopControlProperties,
|
11
|
+
type AnnotationProperties,
|
10
12
|
} from './types';
|
11
13
|
|
12
14
|
/**
|
@@ -256,6 +258,52 @@ class Utils {
|
|
256
258
|
return Utils.hasHints({requiredHints, displayHints});
|
257
259
|
}
|
258
260
|
|
261
|
+
/**
|
262
|
+
* Validate if a annotation-scoped control is allowed to be sent to the service.
|
263
|
+
*
|
264
|
+
* @param {ControlConfig<AnnotationProperties>} control - Annotation control config to validate
|
265
|
+
* @param {Array<string>} displayHints - All available hints
|
266
|
+
* @returns {boolean} - True if all of the actions are allowed.
|
267
|
+
*/
|
268
|
+
public static canUpdateAnnotation(
|
269
|
+
control: ControlConfig<AnnotationProperties>,
|
270
|
+
displayHints: Array<string>
|
271
|
+
): boolean {
|
272
|
+
const requiredHints = [];
|
273
|
+
|
274
|
+
if (control.properties.enabled === true) {
|
275
|
+
requiredHints.push(DISPLAY_HINTS.ENABLE_ANNOTATION_MEETING_OPTION);
|
276
|
+
}
|
277
|
+
if (control.properties.enabled === false) {
|
278
|
+
requiredHints.push(DISPLAY_HINTS.DISABLE_ANNOTATION_MEETING_OPTION);
|
279
|
+
}
|
280
|
+
|
281
|
+
return Utils.hasHints({requiredHints, displayHints});
|
282
|
+
}
|
283
|
+
|
284
|
+
/**
|
285
|
+
* Validate if a rdc-scoped control is allowed to be sent to the service.
|
286
|
+
*
|
287
|
+
* @param {ControlConfig<RemoteDesktopControlProperties>} control - Remote Desktop Control config to validate
|
288
|
+
* @param {Array<string>} displayHints - All available hints
|
289
|
+
* @returns {boolean} - True if all of the actions are allowed.
|
290
|
+
*/
|
291
|
+
public static canUpdateRemoteDesktopControl(
|
292
|
+
control: ControlConfig<RemoteDesktopControlProperties>,
|
293
|
+
displayHints: Array<string>
|
294
|
+
): boolean {
|
295
|
+
const requiredHints = [];
|
296
|
+
|
297
|
+
if (control.properties.enabled === true) {
|
298
|
+
requiredHints.push(DISPLAY_HINTS.ENABLE_RDC_MEETING_OPTION);
|
299
|
+
}
|
300
|
+
if (control.properties.enabled === false) {
|
301
|
+
requiredHints.push(DISPLAY_HINTS.DISABLE_RDC_MEETING_OPTION);
|
302
|
+
}
|
303
|
+
|
304
|
+
return Utils.hasHints({requiredHints, displayHints});
|
305
|
+
}
|
306
|
+
|
259
307
|
/**
|
260
308
|
* Validate that a control can be sent to the service based on the provided
|
261
309
|
* display hints.
|
@@ -301,6 +349,20 @@ class Utils {
|
|
301
349
|
);
|
302
350
|
break;
|
303
351
|
|
352
|
+
case Control.annotation:
|
353
|
+
determinant = Utils.canUpdateAnnotation(
|
354
|
+
control as ControlConfig<AnnotationProperties>,
|
355
|
+
displayHints
|
356
|
+
);
|
357
|
+
break;
|
358
|
+
|
359
|
+
case Control.rdc:
|
360
|
+
determinant = Utils.canUpdateRemoteDesktopControl(
|
361
|
+
control as ControlConfig<RemoteDesktopControlProperties>,
|
362
|
+
displayHints
|
363
|
+
);
|
364
|
+
break;
|
365
|
+
|
304
366
|
default:
|
305
367
|
determinant = false;
|
306
368
|
}
|
@@ -1,5 +1,5 @@
|
|
1
1
|
import {isEqual} from 'lodash';
|
2
|
-
import {BREAKOUTS} from '../constants';
|
2
|
+
import {BREAKOUTS, MEETING_STATE} from '../constants';
|
3
3
|
|
4
4
|
const ControlsUtils: any = {};
|
5
5
|
|
@@ -40,6 +40,7 @@ ControlsUtils.parse = (controls: any) => {
|
|
40
40
|
parsedControls.transcribe = {
|
41
41
|
transcribing: controls.transcribe.transcribing,
|
42
42
|
caption: controls.transcribe.caption,
|
43
|
+
spokenLanguage: controls.transcribe.spokenLanguage,
|
43
44
|
};
|
44
45
|
}
|
45
46
|
|
@@ -111,6 +112,18 @@ ControlsUtils.parse = (controls: any) => {
|
|
111
112
|
};
|
112
113
|
}
|
113
114
|
|
115
|
+
if (controls?.annotationControl) {
|
116
|
+
parsedControls.annotationControl = {
|
117
|
+
enabled: controls.annotationControl.enabled,
|
118
|
+
};
|
119
|
+
}
|
120
|
+
|
121
|
+
if (controls?.rdcControl) {
|
122
|
+
parsedControls.rdcControl = {
|
123
|
+
enabled: controls.rdcControl.enabled,
|
124
|
+
};
|
125
|
+
}
|
126
|
+
|
114
127
|
return parsedControls;
|
115
128
|
};
|
116
129
|
|
@@ -174,6 +187,11 @@ ControlsUtils.getControls = (oldControls: any, newControls: any) => {
|
|
174
187
|
!isEqual(previous?.transcribe?.transcribing, current?.transcribe?.transcribing) && // upon first join, previous?.record?.recording = undefined; thus, never going to be equal and will always return true
|
175
188
|
(previous?.transcribe?.transcribing || current?.transcribe?.transcribing), // therefore, condition added to prevent false firings of #meeting:recording:stopped upon first joining a meeting
|
176
189
|
|
190
|
+
hasTranscribeSpokenLanguageChanged:
|
191
|
+
current?.transcribe &&
|
192
|
+
!isEqual(previous?.transcribe?.spokenLanguage, current?.transcribe?.spokenLanguage) &&
|
193
|
+
!!(previous?.transcribe?.spokenLanguage || current?.transcribe?.spokenLanguage),
|
194
|
+
|
177
195
|
hasManualCaptionChanged:
|
178
196
|
current?.manualCaptionControl &&
|
179
197
|
!isEqual(previous?.manualCaptionControl?.enabled, current?.manualCaptionControl?.enabled) &&
|
@@ -211,6 +229,12 @@ ControlsUtils.getControls = (oldControls: any, newControls: any) => {
|
|
211
229
|
),
|
212
230
|
|
213
231
|
hasStageViewChanged: !isEqual(previous?.videoLayout, current?.videoLayout),
|
232
|
+
|
233
|
+
hasAnnotationControlChanged:
|
234
|
+
current?.annotationControl?.enabled !== previous?.annotationControl?.enabled,
|
235
|
+
|
236
|
+
hasRemoteDesktopControlChanged:
|
237
|
+
current?.rdcControl?.enabled !== previous?.rdcControl?.enabled,
|
214
238
|
},
|
215
239
|
};
|
216
240
|
};
|
@@ -242,30 +266,42 @@ ControlsUtils.isNeedReplaceMembers = (oldControls: any, controls: any) => {
|
|
242
266
|
}
|
243
267
|
|
244
268
|
return (
|
245
|
-
oldControls
|
246
|
-
oldControls
|
269
|
+
oldControls?.breakout?.groupId !== controls?.breakout?.groupId ||
|
270
|
+
oldControls?.breakout?.sessionId !== controls?.breakout?.sessionId
|
247
271
|
);
|
248
272
|
};
|
249
273
|
|
250
274
|
/**
|
251
275
|
* determine the switch status between breakout session and main session.
|
252
|
-
* @param {
|
253
|
-
* @param {
|
276
|
+
* @param {LocusInfo} oldLocus
|
277
|
+
* @param {LocusInfo} newLocus
|
254
278
|
* @returns {Object}
|
255
279
|
*/
|
256
|
-
ControlsUtils.getSessionSwitchStatus = (
|
280
|
+
ControlsUtils.getSessionSwitchStatus = (oldLocus: any, newLocus: any) => {
|
257
281
|
const status = {isReturnToMain: false, isJoinToBreakout: false};
|
258
282
|
// no breakout case
|
259
|
-
if (!
|
283
|
+
if (!oldLocus.controls?.breakout || !newLocus.controls?.breakout) {
|
260
284
|
return status;
|
261
285
|
}
|
262
286
|
|
263
|
-
|
264
|
-
|
265
|
-
|
287
|
+
// It is used to fix the timing issue triggered when the creator leaves session to ensure that the member list is complete
|
288
|
+
const needUseCache = !!(
|
289
|
+
oldLocus.self?.isCreator &&
|
290
|
+
newLocus.participants?.length === 1 &&
|
291
|
+
newLocus.participants?.[0].isCreator &&
|
292
|
+
newLocus.participants?.[0].state === MEETING_STATE.STATES.JOINED &&
|
293
|
+
newLocus.controls?.breakout?.sessionType === BREAKOUTS.SESSION_TYPES.MAIN &&
|
294
|
+
newLocus.controls?.breakout?.groups?.length
|
295
|
+
);
|
296
|
+
|
297
|
+
const isReturnToMain =
|
298
|
+
oldLocus.controls.breakout.sessionType === BREAKOUTS.SESSION_TYPES.BREAKOUT &&
|
299
|
+
newLocus.controls.breakout.sessionType === BREAKOUTS.SESSION_TYPES.MAIN;
|
300
|
+
|
301
|
+
status.isReturnToMain = needUseCache || isReturnToMain;
|
266
302
|
status.isJoinToBreakout =
|
267
|
-
|
268
|
-
controls.breakout.sessionType === BREAKOUTS.SESSION_TYPES.BREAKOUT;
|
303
|
+
oldLocus.controls.breakout.sessionType === BREAKOUTS.SESSION_TYPES.MAIN &&
|
304
|
+
newLocus.controls.breakout.sessionType === BREAKOUTS.SESSION_TYPES.BREAKOUT;
|
269
305
|
|
270
306
|
return status;
|
271
307
|
};
|