@webex/plugin-meetings 3.6.0 → 3.7.0-ipv6-multi-turn-urls.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/README.md +2 -1
- package/dist/breakouts/breakout.js +1 -1
- package/dist/breakouts/index.js +1 -1
- package/dist/common/errors/join-webinar-error.js +50 -0
- package/dist/common/errors/join-webinar-error.js.map +1 -0
- package/dist/config.js +4 -1
- package/dist/config.js.map +1 -1
- package/dist/constants.js +54 -4
- package/dist/constants.js.map +1 -1
- package/dist/controls-options-manager/enums.js +1 -0
- package/dist/controls-options-manager/enums.js.map +1 -1
- package/dist/controls-options-manager/index.js +10 -3
- package/dist/controls-options-manager/index.js.map +1 -1
- package/dist/controls-options-manager/types.js.map +1 -1
- package/dist/controls-options-manager/util.js +12 -0
- package/dist/controls-options-manager/util.js.map +1 -1
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/interpretation/index.js +1 -1
- package/dist/interpretation/siLanguage.js +1 -1
- package/dist/locus-info/controlsUtils.js +28 -4
- package/dist/locus-info/controlsUtils.js.map +1 -1
- package/dist/locus-info/fullState.js +2 -1
- package/dist/locus-info/fullState.js.map +1 -1
- package/dist/locus-info/index.js +61 -3
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/parser.js +5 -1
- package/dist/locus-info/parser.js.map +1 -1
- package/dist/media/index.js +29 -1
- package/dist/media/index.js.map +1 -1
- package/dist/meeting/in-meeting-actions.js +29 -1
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +807 -540
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/locusMediaRequest.js +2 -6
- package/dist/meeting/locusMediaRequest.js.map +1 -1
- package/dist/meeting/muteState.js +5 -2
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.js +21 -29
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/util.js +98 -61
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js +80 -17
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meetings/index.js +29 -2
- package/dist/meetings/index.js.map +1 -1
- package/dist/members/index.js +3 -2
- package/dist/members/index.js.map +1 -1
- package/dist/members/util.js +13 -7
- package/dist/members/util.js.map +1 -1
- package/dist/metrics/constants.js +4 -1
- package/dist/metrics/constants.js.map +1 -1
- package/dist/multistream/remoteMedia.js +34 -15
- package/dist/multistream/remoteMedia.js.map +1 -1
- package/dist/reachability/clusterReachability.js +12 -15
- package/dist/reachability/clusterReachability.js.map +1 -1
- package/dist/reachability/index.js +433 -136
- package/dist/reachability/index.js.map +1 -1
- package/dist/{rtcMetrics/constants.js → reachability/reachability.types.js} +1 -5
- package/dist/reachability/reachability.types.js.map +1 -0
- package/dist/reachability/request.js +23 -9
- package/dist/reachability/request.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/roap/index.js +5 -7
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.js +45 -79
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/turnDiscovery.js +3 -6
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/{common/errors/parameter.d.ts → types/common/errors/join-webinar-error.d.ts} +4 -5
- package/dist/types/config.d.ts +3 -0
- package/dist/types/constants.d.ts +43 -0
- package/dist/types/controls-options-manager/enums.d.ts +2 -1
- package/dist/types/controls-options-manager/index.d.ts +2 -1
- package/dist/types/controls-options-manager/types.d.ts +2 -0
- package/dist/types/index.d.ts +2 -1
- package/dist/types/locus-info/index.d.ts +9 -0
- package/dist/types/meeting/in-meeting-actions.d.ts +28 -0
- package/dist/types/meeting/index.d.ts +34 -3
- package/dist/types/meeting/locusMediaRequest.d.ts +2 -3
- package/dist/types/meeting/muteState.d.ts +2 -1
- package/dist/types/meeting/request.d.ts +2 -2
- package/dist/types/meeting/util.d.ts +2 -2
- package/dist/types/meeting-info/meeting-info-v2.d.ts +23 -0
- package/dist/types/meetings/index.d.ts +13 -1
- package/dist/types/members/index.d.ts +2 -1
- package/dist/types/members/util.d.ts +5 -1
- package/dist/types/metrics/constants.d.ts +3 -0
- package/dist/types/multistream/remoteMedia.d.ts +1 -0
- package/dist/types/reachability/clusterReachability.d.ts +1 -10
- package/dist/types/reachability/index.d.ts +74 -35
- package/dist/types/reachability/reachability.types.d.ts +64 -0
- package/dist/types/reachability/request.d.ts +5 -1
- 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/types/roap/request.d.ts +1 -13
- package/dist/webinar/index.js +382 -19
- package/dist/webinar/index.js.map +1 -1
- package/package.json +22 -22
- package/src/common/errors/join-webinar-error.ts +24 -0
- package/src/config.ts +3 -0
- package/src/constants.ts +52 -0
- package/src/controls-options-manager/enums.ts +1 -0
- package/src/controls-options-manager/index.ts +19 -2
- package/src/controls-options-manager/types.ts +2 -0
- package/src/controls-options-manager/util.ts +12 -0
- package/src/index.ts +2 -0
- package/src/locus-info/controlsUtils.ts +46 -2
- package/src/locus-info/fullState.ts +1 -0
- package/src/locus-info/index.ts +60 -0
- package/src/locus-info/parser.ts +8 -1
- package/src/media/index.ts +15 -0
- package/src/meeting/in-meeting-actions.ts +58 -0
- package/src/meeting/index.ts +268 -32
- package/src/meeting/locusMediaRequest.ts +4 -8
- package/src/meeting/muteState.ts +6 -2
- package/src/meeting/request.ts +4 -11
- package/src/meeting/util.ts +31 -6
- package/src/meeting-info/meeting-info-v2.ts +63 -0
- package/src/meetings/index.ts +74 -40
- package/src/members/index.ts +4 -2
- package/src/members/util.ts +4 -1
- package/src/metrics/constants.ts +3 -0
- package/src/multistream/remoteMedia.ts +33 -15
- package/src/reachability/clusterReachability.ts +5 -15
- package/src/reachability/index.ts +285 -77
- package/src/reachability/reachability.types.ts +85 -0
- package/src/reachability/request.ts +55 -30
- 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/roap/index.ts +4 -5
- package/src/roap/request.ts +32 -44
- package/src/roap/turnDiscovery.ts +2 -4
- package/src/webinar/index.ts +223 -17
- package/test/unit/spec/controls-options-manager/index.js +56 -32
- package/test/unit/spec/controls-options-manager/util.js +44 -0
- package/test/unit/spec/locus-info/controlsUtils.js +80 -4
- package/test/unit/spec/locus-info/index.js +88 -2
- package/test/unit/spec/meeting/in-meeting-actions.ts +31 -1
- package/test/unit/spec/meeting/index.js +407 -82
- package/test/unit/spec/meeting/locusMediaRequest.ts +18 -11
- package/test/unit/spec/meeting/muteState.js +8 -4
- package/test/unit/spec/meeting/request.js +3 -26
- package/test/unit/spec/meeting/utils.js +71 -14
- package/test/unit/spec/meeting-info/meetinginfov2.js +42 -0
- package/test/unit/spec/meetings/index.js +41 -6
- package/test/unit/spec/members/index.js +25 -2
- package/test/unit/spec/members/request.js +37 -3
- package/test/unit/spec/members/utils.js +110 -1
- package/test/unit/spec/multistream/remoteMedia.ts +27 -9
- package/test/unit/spec/reachability/clusterReachability.ts +7 -0
- package/test/unit/spec/reachability/index.ts +265 -1
- package/test/unit/spec/reachability/request.js +56 -15
- package/test/unit/spec/recording-controller/index.js +61 -5
- package/test/unit/spec/recording-controller/util.js +39 -3
- package/test/unit/spec/roap/index.ts +1 -1
- package/test/unit/spec/roap/request.ts +51 -109
- package/test/unit/spec/roap/turnDiscovery.ts +202 -147
- package/test/unit/spec/webinar/index.ts +443 -14
- package/dist/annotation/annotation.types.d.ts +0 -42
- package/dist/annotation/constants.d.ts +0 -31
- package/dist/annotation/index.d.ts +0 -117
- package/dist/breakouts/breakout.d.ts +0 -8
- package/dist/breakouts/collection.d.ts +0 -5
- package/dist/breakouts/edit-lock-error.d.ts +0 -15
- package/dist/breakouts/events.d.ts +0 -8
- package/dist/breakouts/index.d.ts +0 -5
- package/dist/breakouts/request.d.ts +0 -22
- package/dist/breakouts/utils.d.ts +0 -15
- package/dist/common/browser-detection.d.ts +0 -9
- package/dist/common/collection.d.ts +0 -48
- package/dist/common/config.d.ts +0 -2
- package/dist/common/errors/captcha-error.d.ts +0 -15
- package/dist/common/errors/intent-to-join.d.ts +0 -16
- package/dist/common/errors/join-meeting.d.ts +0 -17
- package/dist/common/errors/media.d.ts +0 -15
- package/dist/common/errors/no-meeting-info.d.ts +0 -14
- package/dist/common/errors/password-error.d.ts +0 -15
- package/dist/common/errors/permission.d.ts +0 -14
- package/dist/common/errors/reclaim-host-role-error.js +0 -149
- package/dist/common/errors/reclaim-host-role-error.js.map +0 -1
- package/dist/common/errors/reclaim-host-role-errors.d.ts +0 -60
- package/dist/common/errors/reconnection-in-progress.d.ts +0 -9
- package/dist/common/errors/reconnection-in-progress.js +0 -33
- package/dist/common/errors/reconnection-in-progress.js.map +0 -1
- package/dist/common/errors/reconnection.d.ts +0 -15
- package/dist/common/errors/stats.d.ts +0 -15
- package/dist/common/errors/webex-errors.d.ts +0 -93
- package/dist/common/errors/webex-meetings-error.d.ts +0 -20
- package/dist/common/events/events-scope.d.ts +0 -17
- package/dist/common/events/events.d.ts +0 -12
- package/dist/common/events/trigger-proxy.d.ts +0 -2
- package/dist/common/events/util.d.ts +0 -2
- package/dist/common/logs/logger-config.d.ts +0 -2
- package/dist/common/logs/logger-proxy.d.ts +0 -2
- package/dist/common/logs/request.d.ts +0 -36
- package/dist/common/queue.d.ts +0 -34
- package/dist/config.d.ts +0 -72
- package/dist/constants.d.ts +0 -1088
- package/dist/controls-options-manager/constants.d.ts +0 -4
- package/dist/controls-options-manager/enums.d.ts +0 -15
- package/dist/controls-options-manager/index.d.ts +0 -136
- package/dist/controls-options-manager/types.d.ts +0 -43
- package/dist/controls-options-manager/util.d.ts +0 -1
- package/dist/index.d.ts +0 -7
- package/dist/interceptors/index.d.ts +0 -2
- package/dist/interceptors/locusRetry.d.ts +0 -27
- package/dist/interpretation/collection.d.ts +0 -5
- package/dist/interpretation/index.d.ts +0 -5
- package/dist/interpretation/siLanguage.d.ts +0 -5
- package/dist/locus-info/controlsUtils.d.ts +0 -2
- package/dist/locus-info/embeddedAppsUtils.d.ts +0 -2
- package/dist/locus-info/fullState.d.ts +0 -2
- package/dist/locus-info/hostUtils.d.ts +0 -2
- package/dist/locus-info/index.d.ts +0 -322
- package/dist/locus-info/infoUtils.d.ts +0 -2
- package/dist/locus-info/mediaSharesUtils.d.ts +0 -2
- package/dist/locus-info/parser.d.ts +0 -272
- package/dist/locus-info/selfUtils.d.ts +0 -2
- package/dist/media/index.d.ts +0 -34
- package/dist/media/properties.d.ts +0 -93
- package/dist/media/util.d.ts +0 -2
- package/dist/mediaQualityMetrics/config.d.ts +0 -241
- package/dist/mediaQualityMetrics/config.js +0 -502
- package/dist/mediaQualityMetrics/config.js.map +0 -1
- package/dist/meeting/effectsState.js +0 -260
- package/dist/meeting/effectsState.js.map +0 -1
- package/dist/meeting/in-meeting-actions.d.ts +0 -167
- package/dist/meeting/index.d.ts +0 -1825
- package/dist/meeting/locusMediaRequest.d.ts +0 -74
- package/dist/meeting/muteState.d.ts +0 -178
- package/dist/meeting/request.d.ts +0 -295
- package/dist/meeting/request.type.d.ts +0 -11
- package/dist/meeting/state.d.ts +0 -9
- package/dist/meeting/util.d.ts +0 -119
- package/dist/meeting/voicea-meeting.d.ts +0 -16
- package/dist/meeting-info/collection.d.ts +0 -20
- package/dist/meeting-info/index.d.ts +0 -69
- package/dist/meeting-info/meeting-info-v2.d.ts +0 -123
- package/dist/meeting-info/request.d.ts +0 -22
- package/dist/meeting-info/util.d.ts +0 -2
- package/dist/meeting-info/utilv2.d.ts +0 -2
- package/dist/meetings/collection.d.ts +0 -40
- package/dist/meetings/index.d.ts +0 -390
- package/dist/meetings/meetings.types.d.ts +0 -4
- package/dist/meetings/request.d.ts +0 -27
- package/dist/meetings/util.d.ts +0 -18
- package/dist/member/index.d.ts +0 -160
- package/dist/member/member.types.js +0 -17
- package/dist/member/member.types.js.map +0 -1
- package/dist/member/types.d.ts +0 -32
- package/dist/member/util.d.ts +0 -2
- package/dist/members/collection.d.ts +0 -29
- package/dist/members/index.d.ts +0 -353
- package/dist/members/request.d.ts +0 -114
- package/dist/members/types.d.ts +0 -25
- package/dist/members/util.d.ts +0 -215
- package/dist/metrics/config.js +0 -276
- package/dist/metrics/config.js.map +0 -1
- package/dist/metrics/constants.d.ts +0 -70
- package/dist/metrics/index.d.ts +0 -45
- package/dist/multistream/mediaRequestManager.d.ts +0 -119
- package/dist/multistream/receiveSlot.d.ts +0 -68
- package/dist/multistream/receiveSlotManager.d.ts +0 -56
- package/dist/multistream/remoteMedia.d.ts +0 -72
- package/dist/multistream/remoteMediaGroup.d.ts +0 -49
- package/dist/multistream/remoteMediaManager.d.ts +0 -300
- package/dist/multistream/sendSlotManager.d.ts +0 -69
- package/dist/networkQualityMonitor/index.d.ts +0 -70
- package/dist/networkQualityMonitor/index.js +0 -221
- package/dist/networkQualityMonitor/index.js.map +0 -1
- package/dist/peer-connection-manager/index.js +0 -671
- package/dist/peer-connection-manager/index.js.map +0 -1
- package/dist/peer-connection-manager/util.js +0 -109
- package/dist/peer-connection-manager/util.js.map +0 -1
- package/dist/personal-meeting-room/index.d.ts +0 -47
- package/dist/personal-meeting-room/request.d.ts +0 -14
- package/dist/personal-meeting-room/util.d.ts +0 -2
- package/dist/reachability/clusterReachability.d.ts +0 -109
- package/dist/reachability/index.d.ts +0 -105
- package/dist/reachability/request.d.ts +0 -39
- package/dist/reachability/util.d.ts +0 -8
- package/dist/reactions/constants.d.ts +0 -3
- package/dist/reactions/reactions.d.ts +0 -4
- package/dist/reactions/reactions.type.d.ts +0 -52
- package/dist/reconnection-manager/index.d.ts +0 -136
- package/dist/recording-controller/enums.d.ts +0 -7
- package/dist/recording-controller/index.d.ts +0 -207
- package/dist/recording-controller/util.d.ts +0 -14
- package/dist/roap/collection.js +0 -62
- package/dist/roap/collection.js.map +0 -1
- package/dist/roap/handler.js +0 -275
- package/dist/roap/handler.js.map +0 -1
- package/dist/roap/index.d.ts +0 -86
- package/dist/roap/request.d.ts +0 -39
- package/dist/roap/state.js +0 -126
- package/dist/roap/state.js.map +0 -1
- package/dist/roap/turnDiscovery.d.ts +0 -155
- package/dist/roap/util.js +0 -75
- package/dist/roap/util.js.map +0 -1
- package/dist/rtcMetrics/constants.d.ts +0 -4
- package/dist/rtcMetrics/constants.js.map +0 -1
- package/dist/rtcMetrics/index.d.ts +0 -61
- package/dist/rtcMetrics/index.js +0 -197
- package/dist/rtcMetrics/index.js.map +0 -1
- package/dist/statsAnalyzer/global.d.ts +0 -36
- package/dist/statsAnalyzer/global.js +0 -126
- package/dist/statsAnalyzer/global.js.map +0 -1
- package/dist/statsAnalyzer/index.d.ts +0 -217
- package/dist/statsAnalyzer/index.js +0 -1013
- package/dist/statsAnalyzer/index.js.map +0 -1
- package/dist/statsAnalyzer/mqaUtil.d.ts +0 -48
- package/dist/statsAnalyzer/mqaUtil.js +0 -179
- package/dist/statsAnalyzer/mqaUtil.js.map +0 -1
- package/dist/transcription/index.d.ts +0 -64
- package/dist/types/common/errors/reconnection-in-progress.d.ts +0 -9
- package/dist/types/mediaQualityMetrics/config.d.ts +0 -241
- package/dist/types/networkQualityMonitor/index.d.ts +0 -70
- package/dist/types/rtcMetrics/constants.d.ts +0 -4
- package/dist/types/rtcMetrics/index.d.ts +0 -71
- package/dist/types/statsAnalyzer/global.d.ts +0 -36
- package/dist/types/statsAnalyzer/index.d.ts +0 -217
- package/dist/types/statsAnalyzer/mqaUtil.d.ts +0 -48
- package/dist/webinar/collection.d.ts +0 -16
- package/dist/webinar/index.d.ts +0 -5
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,
|
|
@@ -121,6 +122,8 @@ import {
|
|
|
121
122
|
MEETING_PERMISSION_TOKEN_REFRESH_REASON,
|
|
122
123
|
ROAP_OFFER_ANSWER_EXCHANGE_TIMEOUT,
|
|
123
124
|
NAMED_MEDIA_GROUP_TYPE_AUDIO,
|
|
125
|
+
WEBINAR_ERROR_WEBCAST,
|
|
126
|
+
WEBINAR_ERROR_REGISTRATIONID,
|
|
124
127
|
} from '../constants';
|
|
125
128
|
import BEHAVIORAL_METRICS from '../metrics/constants';
|
|
126
129
|
import ParameterError from '../common/errors/parameter';
|
|
@@ -128,6 +131,7 @@ import {
|
|
|
128
131
|
MeetingInfoV2PasswordError,
|
|
129
132
|
MeetingInfoV2CaptchaError,
|
|
130
133
|
MeetingInfoV2PolicyError,
|
|
134
|
+
MeetingInfoV2JoinWebinarError,
|
|
131
135
|
} from '../meeting-info/meeting-info-v2';
|
|
132
136
|
import {CSI, ReceiveSlotManager} from '../multistream/receiveSlotManager';
|
|
133
137
|
import SendSlotManager from '../multistream/sendSlotManager';
|
|
@@ -156,6 +160,7 @@ import ControlsOptionsManager from '../controls-options-manager';
|
|
|
156
160
|
import PermissionError from '../common/errors/permission';
|
|
157
161
|
import {LocusMediaRequest} from './locusMediaRequest';
|
|
158
162
|
import {ConnectionStateHandler, ConnectionStateEvent} from './connectionStateHandler';
|
|
163
|
+
import JoinWebinarError from '../common/errors/join-webinar-error';
|
|
159
164
|
|
|
160
165
|
// default callback so we don't call an undefined function, but in practice it should never be used
|
|
161
166
|
const DEFAULT_ICE_PHASE_CALLBACK = () => 'JOIN_MEETING_FINAL';
|
|
@@ -700,6 +705,8 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
700
705
|
private iceCandidateErrors: Map<string, number>;
|
|
701
706
|
private iceCandidatesCount: number;
|
|
702
707
|
private rtcMetrics?: RtcMetrics;
|
|
708
|
+
private uploadLogsTimer?: ReturnType<typeof setTimeout>;
|
|
709
|
+
private logUploadIntervalIndex: number;
|
|
703
710
|
|
|
704
711
|
/**
|
|
705
712
|
* @param {Object} attrs
|
|
@@ -768,6 +775,8 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
768
775
|
);
|
|
769
776
|
this.callStateForMetrics.correlationId = this.id;
|
|
770
777
|
}
|
|
778
|
+
this.logUploadIntervalIndex = 0;
|
|
779
|
+
|
|
771
780
|
/**
|
|
772
781
|
* @instance
|
|
773
782
|
* @type {String}
|
|
@@ -1759,8 +1768,21 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
1759
1768
|
if (err.meetingInfo) {
|
|
1760
1769
|
this.meetingInfo = err.meetingInfo;
|
|
1761
1770
|
}
|
|
1762
|
-
|
|
1763
1771
|
throw new PermissionError();
|
|
1772
|
+
} else if (err instanceof MeetingInfoV2JoinWebinarError) {
|
|
1773
|
+
this.meetingInfoFailureReason = MEETING_INFO_FAILURE_REASON.WEBINAR_REGISTRATION;
|
|
1774
|
+
if (WEBINAR_ERROR_WEBCAST.includes(err.wbxAppApiCode)) {
|
|
1775
|
+
this.meetingInfoFailureReason = MEETING_INFO_FAILURE_REASON.NEED_JOIN_WITH_WEBCAST;
|
|
1776
|
+
} else if (WEBINAR_ERROR_REGISTRATIONID.includes(err.wbxAppApiCode)) {
|
|
1777
|
+
this.meetingInfoFailureReason = MEETING_INFO_FAILURE_REASON.WEBINAR_NEED_REGISTRATIONID;
|
|
1778
|
+
}
|
|
1779
|
+
this.meetingInfoFailureCode = err.wbxAppApiCode;
|
|
1780
|
+
|
|
1781
|
+
if (err.meetingInfo) {
|
|
1782
|
+
this.meetingInfo = err.meetingInfo;
|
|
1783
|
+
}
|
|
1784
|
+
|
|
1785
|
+
throw new JoinWebinarError();
|
|
1764
1786
|
} else if (err instanceof MeetingInfoV2PasswordError) {
|
|
1765
1787
|
LoggerProxy.logger.info(
|
|
1766
1788
|
// @ts-ignore
|
|
@@ -2004,6 +2026,7 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
2004
2026
|
this.setUpLocusInfoSelfListener();
|
|
2005
2027
|
this.setUpLocusInfoMeetingListener();
|
|
2006
2028
|
this.setUpLocusServicesListener();
|
|
2029
|
+
this.setUpLocusResourcesListener();
|
|
2007
2030
|
// members update listeners
|
|
2008
2031
|
this.setUpLocusFullStateListener();
|
|
2009
2032
|
this.setUpLocusUrlListener();
|
|
@@ -2625,6 +2648,43 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
2625
2648
|
);
|
|
2626
2649
|
});
|
|
2627
2650
|
|
|
2651
|
+
this.locusInfo.on(LOCUSINFO.EVENTS.CONTROLS_WEBCAST_CHANGED, ({state}) => {
|
|
2652
|
+
Trigger.trigger(
|
|
2653
|
+
this,
|
|
2654
|
+
{file: 'meeting/index', function: 'setupLocusControlsListener'},
|
|
2655
|
+
EVENT_TRIGGERS.MEETING_CONTROLS_WEBCAST_UPDATED,
|
|
2656
|
+
{state}
|
|
2657
|
+
);
|
|
2658
|
+
});
|
|
2659
|
+
|
|
2660
|
+
this.locusInfo.on(LOCUSINFO.EVENTS.CONTROLS_MEETING_FULL_CHANGED, ({state}) => {
|
|
2661
|
+
Trigger.trigger(
|
|
2662
|
+
this,
|
|
2663
|
+
{file: 'meeting/index', function: 'setupLocusControlsListener'},
|
|
2664
|
+
EVENT_TRIGGERS.MEETING_CONTROLS_MEETING_FULL_UPDATED,
|
|
2665
|
+
{state}
|
|
2666
|
+
);
|
|
2667
|
+
});
|
|
2668
|
+
|
|
2669
|
+
this.locusInfo.on(LOCUSINFO.EVENTS.CONTROLS_PRACTICE_SESSION_STATUS_UPDATED, ({state}) => {
|
|
2670
|
+
this.webinar.updatePracticeSessionStatus(state);
|
|
2671
|
+
Trigger.trigger(
|
|
2672
|
+
this,
|
|
2673
|
+
{file: 'meeting/index', function: 'setupLocusControlsListener'},
|
|
2674
|
+
EVENT_TRIGGERS.MEETING_CONTROLS_PRACTICE_SESSION_STATUS_UPDATED,
|
|
2675
|
+
{state}
|
|
2676
|
+
);
|
|
2677
|
+
});
|
|
2678
|
+
|
|
2679
|
+
this.locusInfo.on(LOCUSINFO.EVENTS.CONTROLS_STAGE_VIEW_UPDATED, ({state}) => {
|
|
2680
|
+
Trigger.trigger(
|
|
2681
|
+
this,
|
|
2682
|
+
{file: 'meeting/index', function: 'setupLocusControlsListener'},
|
|
2683
|
+
EVENT_TRIGGERS.MEETING_CONTROLS_STAGE_VIEW_UPDATED,
|
|
2684
|
+
{state}
|
|
2685
|
+
);
|
|
2686
|
+
});
|
|
2687
|
+
|
|
2628
2688
|
this.locusInfo.on(LOCUSINFO.EVENTS.CONTROLS_VIDEO_CHANGED, ({state}) => {
|
|
2629
2689
|
Trigger.trigger(
|
|
2630
2690
|
this,
|
|
@@ -2739,6 +2799,9 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
2739
2799
|
newShareStatus = SHARE_STATUS.NO_SHARE;
|
|
2740
2800
|
}
|
|
2741
2801
|
|
|
2802
|
+
LoggerProxy.logger.info(
|
|
2803
|
+
`Meeting:index#setUpLocusInfoMediaInactiveListener --> this.shareStatus=${this.shareStatus} newShareStatus=${newShareStatus}`
|
|
2804
|
+
);
|
|
2742
2805
|
if (newShareStatus !== this.shareStatus) {
|
|
2743
2806
|
const oldShareStatus = this.shareStatus;
|
|
2744
2807
|
|
|
@@ -2983,10 +3046,20 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
2983
3046
|
this.breakouts.breakoutServiceUrlUpdate(payload?.services?.breakout?.url);
|
|
2984
3047
|
this.annotation.approvalUrlUpdate(payload?.services?.approval?.url);
|
|
2985
3048
|
this.simultaneousInterpretation.approvalUrlUpdate(payload?.services?.approval?.url);
|
|
2986
|
-
|
|
2987
|
-
|
|
2988
|
-
|
|
2989
|
-
|
|
3049
|
+
});
|
|
3050
|
+
}
|
|
3051
|
+
|
|
3052
|
+
/**
|
|
3053
|
+
* Set up the locus info resources link listener
|
|
3054
|
+
* update the locusInfo for webcast instance url
|
|
3055
|
+
* @param {Object} payload - The event payload
|
|
3056
|
+
* @returns {undefined}
|
|
3057
|
+
* @private
|
|
3058
|
+
* @memberof Meeting
|
|
3059
|
+
*/
|
|
3060
|
+
private setUpLocusResourcesListener() {
|
|
3061
|
+
this.locusInfo.on(LOCUSINFO.EVENTS.LINKS_RESOURCES, (payload) => {
|
|
3062
|
+
this.webinar.updateWebcastUrl(payload);
|
|
2990
3063
|
});
|
|
2991
3064
|
}
|
|
2992
3065
|
|
|
@@ -3091,7 +3164,7 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
3091
3164
|
private setUpLocusInfoSelfListener() {
|
|
3092
3165
|
this.locusInfo.on(LOCUSINFO.EVENTS.LOCAL_UNMUTE_REQUIRED, (payload) => {
|
|
3093
3166
|
if (this.audio) {
|
|
3094
|
-
this.audio.handleServerLocalUnmuteRequired(this);
|
|
3167
|
+
this.audio.handleServerLocalUnmuteRequired(this, payload.unmuteAllowed);
|
|
3095
3168
|
Trigger.trigger(
|
|
3096
3169
|
this,
|
|
3097
3170
|
{
|
|
@@ -3189,6 +3262,9 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
3189
3262
|
options: {meetingId: this.id},
|
|
3190
3263
|
});
|
|
3191
3264
|
}
|
|
3265
|
+
Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.GUEST_ENTERED_LOBBY, {
|
|
3266
|
+
correlation_id: this.correlationId,
|
|
3267
|
+
});
|
|
3192
3268
|
this.updateLLMConnection();
|
|
3193
3269
|
});
|
|
3194
3270
|
this.locusInfo.on(LOCUSINFO.EVENTS.SELF_ADMITTED_GUEST, async (payload) => {
|
|
@@ -3212,6 +3288,9 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
3212
3288
|
name: 'client.lobby.exited',
|
|
3213
3289
|
options: {meetingId: this.id},
|
|
3214
3290
|
});
|
|
3291
|
+
Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.GUEST_EXITED_LOBBY, {
|
|
3292
|
+
correlation_id: this.correlationId,
|
|
3293
|
+
});
|
|
3215
3294
|
}
|
|
3216
3295
|
this.rtcMetrics?.sendNextMetrics();
|
|
3217
3296
|
this.updateLLMConnection();
|
|
@@ -3298,7 +3377,7 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
3298
3377
|
this.simultaneousInterpretation.updateCanManageInterpreters(
|
|
3299
3378
|
payload.newRoles?.includes(SELF_ROLES.MODERATOR)
|
|
3300
3379
|
);
|
|
3301
|
-
this.webinar.
|
|
3380
|
+
this.webinar.updateRoleChanged(payload);
|
|
3302
3381
|
Trigger.trigger(
|
|
3303
3382
|
this,
|
|
3304
3383
|
{
|
|
@@ -3445,6 +3524,7 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
3445
3524
|
emailAddress: string;
|
|
3446
3525
|
email: string;
|
|
3447
3526
|
phoneNumber: string;
|
|
3527
|
+
roles: Array<string>;
|
|
3448
3528
|
},
|
|
3449
3529
|
alertIfActive = true
|
|
3450
3530
|
) {
|
|
@@ -3701,6 +3781,10 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
3701
3781
|
this.userDisplayHints,
|
|
3702
3782
|
this.selfUserPolicies
|
|
3703
3783
|
),
|
|
3784
|
+
isPremiseRecordingEnabled: RecordingUtil.isPremiseRecordingEnabled(
|
|
3785
|
+
this.userDisplayHints,
|
|
3786
|
+
this.selfUserPolicies
|
|
3787
|
+
),
|
|
3704
3788
|
canRaiseHand: MeetingUtil.canUserRaiseHand(this.userDisplayHints),
|
|
3705
3789
|
canLowerAllHands: MeetingUtil.canUserLowerAllHands(this.userDisplayHints),
|
|
3706
3790
|
canLowerSomeoneElsesHand: MeetingUtil.canUserLowerSomeoneElsesHand(this.userDisplayHints),
|
|
@@ -3792,6 +3876,22 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
3792
3876
|
requiredHints: [DISPLAY_HINTS.DISABLE_VIEW_THE_PARTICIPANT_LIST],
|
|
3793
3877
|
displayHints: this.userDisplayHints,
|
|
3794
3878
|
}),
|
|
3879
|
+
canEnableViewTheParticipantsListPanelist: ControlsOptionsUtil.hasHints({
|
|
3880
|
+
requiredHints: [DISPLAY_HINTS.ENABLE_VIEW_THE_PARTICIPANT_LIST_PANELIST],
|
|
3881
|
+
displayHints: this.userDisplayHints,
|
|
3882
|
+
}),
|
|
3883
|
+
canDisableViewTheParticipantsListPanelist: ControlsOptionsUtil.hasHints({
|
|
3884
|
+
requiredHints: [DISPLAY_HINTS.DISABLE_VIEW_THE_PARTICIPANT_LIST_PANELIST],
|
|
3885
|
+
displayHints: this.userDisplayHints,
|
|
3886
|
+
}),
|
|
3887
|
+
canEnableShowAttendeeCount: ControlsOptionsUtil.hasHints({
|
|
3888
|
+
requiredHints: [DISPLAY_HINTS.ENABLE_SHOW_ATTENDEE_COUNT],
|
|
3889
|
+
displayHints: this.userDisplayHints,
|
|
3890
|
+
}),
|
|
3891
|
+
canDisableShowAttendeeCount: ControlsOptionsUtil.hasHints({
|
|
3892
|
+
requiredHints: [DISPLAY_HINTS.DISABLE_SHOW_ATTENDEE_COUNT],
|
|
3893
|
+
displayHints: this.userDisplayHints,
|
|
3894
|
+
}),
|
|
3795
3895
|
canEnableRaiseHand: ControlsOptionsUtil.hasHints({
|
|
3796
3896
|
requiredHints: [DISPLAY_HINTS.ENABLE_RAISE_HAND],
|
|
3797
3897
|
displayHints: this.userDisplayHints,
|
|
@@ -3808,6 +3908,42 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
3808
3908
|
requiredHints: [DISPLAY_HINTS.DISABLE_VIDEO],
|
|
3809
3909
|
displayHints: this.userDisplayHints,
|
|
3810
3910
|
}),
|
|
3911
|
+
canStartWebcast: ControlsOptionsUtil.hasHints({
|
|
3912
|
+
requiredHints: [DISPLAY_HINTS.WEBCAST_CONTROL_START],
|
|
3913
|
+
displayHints: this.userDisplayHints,
|
|
3914
|
+
}),
|
|
3915
|
+
canStopWebcast: ControlsOptionsUtil.hasHints({
|
|
3916
|
+
requiredHints: [DISPLAY_HINTS.WEBCAST_CONTROL_STOP],
|
|
3917
|
+
displayHints: this.userDisplayHints,
|
|
3918
|
+
}),
|
|
3919
|
+
canShowStageView: ControlsOptionsUtil.hasHints({
|
|
3920
|
+
requiredHints: [DISPLAY_HINTS.STAGE_VIEW_ACTIVE],
|
|
3921
|
+
displayHints: this.userDisplayHints,
|
|
3922
|
+
}),
|
|
3923
|
+
canEnableStageView: ControlsOptionsUtil.hasHints({
|
|
3924
|
+
requiredHints: [DISPLAY_HINTS.ENABLE_STAGE_VIEW],
|
|
3925
|
+
displayHints: this.userDisplayHints,
|
|
3926
|
+
}),
|
|
3927
|
+
canDisableStageView: ControlsOptionsUtil.hasHints({
|
|
3928
|
+
requiredHints: [DISPLAY_HINTS.DISABLE_STAGE_VIEW],
|
|
3929
|
+
displayHints: this.userDisplayHints,
|
|
3930
|
+
}),
|
|
3931
|
+
isPracticeSessionOn: ControlsOptionsUtil.hasHints({
|
|
3932
|
+
requiredHints: [DISPLAY_HINTS.PRACTICE_SESSION_ON],
|
|
3933
|
+
displayHints: this.userDisplayHints,
|
|
3934
|
+
}),
|
|
3935
|
+
isPracticeSessionOff: ControlsOptionsUtil.hasHints({
|
|
3936
|
+
requiredHints: [DISPLAY_HINTS.PRACTICE_SESSION_OFF],
|
|
3937
|
+
displayHints: this.userDisplayHints,
|
|
3938
|
+
}),
|
|
3939
|
+
canStartPracticeSession: ControlsOptionsUtil.hasHints({
|
|
3940
|
+
requiredHints: [DISPLAY_HINTS.SHOW_PRACTICE_SESSION_START],
|
|
3941
|
+
displayHints: this.userDisplayHints,
|
|
3942
|
+
}),
|
|
3943
|
+
canStopPracticeSession: ControlsOptionsUtil.hasHints({
|
|
3944
|
+
requiredHints: [DISPLAY_HINTS.SHOW_PRACTICE_SESSION_STOP],
|
|
3945
|
+
displayHints: this.userDisplayHints,
|
|
3946
|
+
}),
|
|
3811
3947
|
canShareFile:
|
|
3812
3948
|
(ControlsOptionsUtil.hasHints({
|
|
3813
3949
|
requiredHints: [DISPLAY_HINTS.SHARE_FILE],
|
|
@@ -3964,6 +4100,66 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
3964
4100
|
Trigger.trigger(this, options, EVENTS.REQUEST_UPLOAD_LOGS, this);
|
|
3965
4101
|
}
|
|
3966
4102
|
|
|
4103
|
+
/**
|
|
4104
|
+
* sets the timer for periodic log upload
|
|
4105
|
+
* @returns {void}
|
|
4106
|
+
*/
|
|
4107
|
+
private setLogUploadTimer() {
|
|
4108
|
+
// 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
|
|
4109
|
+
const LOG_UPLOAD_INTERVALS = [0.1, 15, 30, 60]; // in minutes
|
|
4110
|
+
|
|
4111
|
+
const delay =
|
|
4112
|
+
1000 *
|
|
4113
|
+
60 *
|
|
4114
|
+
// @ts-ignore - config coming from registerPlugin
|
|
4115
|
+
this.config.logUploadIntervalMultiplicationFactor *
|
|
4116
|
+
LOG_UPLOAD_INTERVALS[this.logUploadIntervalIndex];
|
|
4117
|
+
|
|
4118
|
+
if (this.logUploadIntervalIndex < LOG_UPLOAD_INTERVALS.length - 1) {
|
|
4119
|
+
this.logUploadIntervalIndex += 1;
|
|
4120
|
+
}
|
|
4121
|
+
|
|
4122
|
+
this.uploadLogsTimer = safeSetTimeout(() => {
|
|
4123
|
+
this.uploadLogsTimer = undefined;
|
|
4124
|
+
|
|
4125
|
+
this.uploadLogs();
|
|
4126
|
+
|
|
4127
|
+
// just as an extra precaution, to avoid uploading logs forever in case something goes wrong
|
|
4128
|
+
// and the page remains opened, we stop it if there is no media connection
|
|
4129
|
+
if (!this.mediaProperties.webrtcMediaConnection) {
|
|
4130
|
+
return;
|
|
4131
|
+
}
|
|
4132
|
+
|
|
4133
|
+
this.setLogUploadTimer();
|
|
4134
|
+
}, delay);
|
|
4135
|
+
}
|
|
4136
|
+
|
|
4137
|
+
/**
|
|
4138
|
+
* Starts a periodic upload of logs
|
|
4139
|
+
*
|
|
4140
|
+
* @returns {undefined}
|
|
4141
|
+
*/
|
|
4142
|
+
public startPeriodicLogUpload() {
|
|
4143
|
+
// @ts-ignore - config coming from registerPlugin
|
|
4144
|
+
if (this.config.logUploadIntervalMultiplicationFactor && !this.uploadLogsTimer) {
|
|
4145
|
+
this.logUploadIntervalIndex = 0;
|
|
4146
|
+
|
|
4147
|
+
this.setLogUploadTimer();
|
|
4148
|
+
}
|
|
4149
|
+
}
|
|
4150
|
+
|
|
4151
|
+
/**
|
|
4152
|
+
* Stops the periodic upload of logs
|
|
4153
|
+
*
|
|
4154
|
+
* @returns {undefined}
|
|
4155
|
+
*/
|
|
4156
|
+
public stopPeriodicLogUpload() {
|
|
4157
|
+
if (this.uploadLogsTimer) {
|
|
4158
|
+
clearTimeout(this.uploadLogsTimer);
|
|
4159
|
+
this.uploadLogsTimer = undefined;
|
|
4160
|
+
}
|
|
4161
|
+
}
|
|
4162
|
+
|
|
3967
4163
|
/**
|
|
3968
4164
|
* Removes remote audio, video and share streams from class instance's mediaProperties
|
|
3969
4165
|
* @returns {undefined}
|
|
@@ -4675,8 +4871,6 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
4675
4871
|
if (!joinResponse) {
|
|
4676
4872
|
// This is the 1st attempt or a retry after join request failed -> we need to do a join with TURN discovery
|
|
4677
4873
|
|
|
4678
|
-
// @ts-ignore
|
|
4679
|
-
joinOptions.reachability = await this.webex.meetings.reachability.getReachabilityResults();
|
|
4680
4874
|
const turnDiscoveryRequest = await this.roap.generateTurnDiscoveryRequestMessage(
|
|
4681
4875
|
this,
|
|
4682
4876
|
true
|
|
@@ -4808,6 +5002,8 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
4808
5002
|
);
|
|
4809
5003
|
}
|
|
4810
5004
|
|
|
5005
|
+
this.cleanUpBeforeReconnection();
|
|
5006
|
+
|
|
4811
5007
|
return this.reconnectionManager
|
|
4812
5008
|
.reconnect(options, async () => {
|
|
4813
5009
|
await this.waitForRemoteSDPAnswer();
|
|
@@ -5185,16 +5381,19 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
5185
5381
|
this.meetingFiniteStateMachine.reset();
|
|
5186
5382
|
}
|
|
5187
5383
|
|
|
5188
|
-
//
|
|
5189
|
-
|
|
5190
|
-
|
|
5191
|
-
|
|
5192
|
-
|
|
5193
|
-
|
|
5194
|
-
|
|
5195
|
-
|
|
5196
|
-
|
|
5197
|
-
|
|
5384
|
+
// send client.call.initiated unless told not to
|
|
5385
|
+
if (options.sendCallInitiated !== false) {
|
|
5386
|
+
// @ts-ignore
|
|
5387
|
+
this.webex.internal.newMetrics.submitClientEvent({
|
|
5388
|
+
name: 'client.call.initiated',
|
|
5389
|
+
payload: {
|
|
5390
|
+
trigger: this.callStateForMetrics.joinTrigger || 'user-interaction',
|
|
5391
|
+
isRoapCallEnabled: true,
|
|
5392
|
+
pstnAudioType: options?.pstnAudioType,
|
|
5393
|
+
},
|
|
5394
|
+
options: {meetingId: this.id},
|
|
5395
|
+
});
|
|
5396
|
+
}
|
|
5198
5397
|
|
|
5199
5398
|
LoggerProxy.logger.log('Meeting:index#join --> Joining a meeting');
|
|
5200
5399
|
|
|
@@ -6225,7 +6424,7 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
6225
6424
|
this.mediaProperties.webrtcMediaConnection.on(
|
|
6226
6425
|
MediaConnectionEventNames.ICE_CANDIDATE,
|
|
6227
6426
|
(event) => {
|
|
6228
|
-
if (event.candidate) {
|
|
6427
|
+
if (event.candidate && event.candidate.candidate && event.candidate.candidate.length > 0) {
|
|
6229
6428
|
this.iceCandidatesCount += 1;
|
|
6230
6429
|
}
|
|
6231
6430
|
}
|
|
@@ -6936,6 +7135,23 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
6936
7135
|
}
|
|
6937
7136
|
}
|
|
6938
7137
|
|
|
7138
|
+
private async cleanUpBeforeReconnection(): Promise<void> {
|
|
7139
|
+
try {
|
|
7140
|
+
// when media fails, we want to upload a webrtc dump to see whats going on
|
|
7141
|
+
// this function is async, but returns once the stats have been gathered
|
|
7142
|
+
await this.forceSendStatsReport({callFrom: 'cleanUpBeforeReconnection'});
|
|
7143
|
+
|
|
7144
|
+
if (this.statsAnalyzer) {
|
|
7145
|
+
await this.statsAnalyzer.stopAnalyzer();
|
|
7146
|
+
}
|
|
7147
|
+
} catch (error) {
|
|
7148
|
+
LoggerProxy.logger.error(
|
|
7149
|
+
'Meeting:index#cleanUpBeforeReconnection --> Error during cleanup: ',
|
|
7150
|
+
error
|
|
7151
|
+
);
|
|
7152
|
+
}
|
|
7153
|
+
}
|
|
7154
|
+
|
|
6939
7155
|
/**
|
|
6940
7156
|
* Creates an instance of LocusMediaRequest for this meeting - it is needed for doing any calls
|
|
6941
7157
|
* to Locus /media API (these are used for sending Roap messages and updating audio/video mute status).
|
|
@@ -7027,7 +7243,7 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
7027
7243
|
shareAudioEnabled = true,
|
|
7028
7244
|
shareVideoEnabled = true,
|
|
7029
7245
|
remoteMediaManagerConfig,
|
|
7030
|
-
bundlePolicy,
|
|
7246
|
+
bundlePolicy = 'max-bundle',
|
|
7031
7247
|
} = options;
|
|
7032
7248
|
|
|
7033
7249
|
this.allowMediaInLobby = options?.allowMediaInLobby;
|
|
@@ -7132,6 +7348,7 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
7132
7348
|
|
|
7133
7349
|
// We can log ReceiveSlot SSRCs only after the SDP exchange, so doing it here:
|
|
7134
7350
|
this.remoteMediaManager?.logAllReceiveSlots();
|
|
7351
|
+
this.startPeriodicLogUpload();
|
|
7135
7352
|
} catch (error) {
|
|
7136
7353
|
LoggerProxy.logger.error(`${LOG_HEADER} failed to establish media connection: `, error);
|
|
7137
7354
|
|
|
@@ -7914,18 +8131,21 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
7914
8131
|
* @param {boolean} mutedEnabled
|
|
7915
8132
|
* @param {boolean} disallowUnmuteEnabled
|
|
7916
8133
|
* @param {boolean} muteOnEntryEnabled
|
|
8134
|
+
* @param {array} roles
|
|
7917
8135
|
* @public
|
|
7918
8136
|
* @memberof Meeting
|
|
7919
8137
|
*/
|
|
7920
8138
|
public setMuteAll(
|
|
7921
8139
|
mutedEnabled: boolean,
|
|
7922
8140
|
disallowUnmuteEnabled: boolean,
|
|
7923
|
-
muteOnEntryEnabled: boolean
|
|
8141
|
+
muteOnEntryEnabled: boolean,
|
|
8142
|
+
roles: Array<string>
|
|
7924
8143
|
) {
|
|
7925
8144
|
return this.controlsOptionsManager.setMuteAll(
|
|
7926
8145
|
mutedEnabled,
|
|
7927
8146
|
disallowUnmuteEnabled,
|
|
7928
|
-
muteOnEntryEnabled
|
|
8147
|
+
muteOnEntryEnabled,
|
|
8148
|
+
roles
|
|
7929
8149
|
);
|
|
7930
8150
|
}
|
|
7931
8151
|
|
|
@@ -8182,6 +8402,9 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
8182
8402
|
* @returns {undefined}
|
|
8183
8403
|
*/
|
|
8184
8404
|
private handleShareAudioStreamEnded = async () => {
|
|
8405
|
+
LoggerProxy.logger.info(
|
|
8406
|
+
`Meeting:index#handleShareAudioStreamEnded --> audio share stream ended`
|
|
8407
|
+
);
|
|
8185
8408
|
// current share audio stream has ended, but there might be an active
|
|
8186
8409
|
// share video stream. we only leave from wireless share if share has
|
|
8187
8410
|
// completely ended, which means no share audio or video streams active
|
|
@@ -8224,6 +8447,9 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
8224
8447
|
* @returns {undefined}
|
|
8225
8448
|
*/
|
|
8226
8449
|
private handleShareVideoStreamEnded = async () => {
|
|
8450
|
+
LoggerProxy.logger.info(
|
|
8451
|
+
`Meeting:index#handleShareVideoStreamEnded --> video share stream ended`
|
|
8452
|
+
);
|
|
8227
8453
|
// current share video stream has ended, but there might be an active
|
|
8228
8454
|
// share audio stream. we only leave from wireless share if share has
|
|
8229
8455
|
// completely ended, which means no share audio or video streams active
|
|
@@ -8712,6 +8938,9 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
8712
8938
|
* @returns {Promise}
|
|
8713
8939
|
*/
|
|
8714
8940
|
async publishStreams(streams: LocalStreams): Promise<void> {
|
|
8941
|
+
LoggerProxy.logger.info(
|
|
8942
|
+
`Meeting:index#publishStreams --> called with: ${JSON.stringify(streams)}`
|
|
8943
|
+
);
|
|
8715
8944
|
this.checkMediaConnection();
|
|
8716
8945
|
if (
|
|
8717
8946
|
!streams.microphone &&
|
|
@@ -8723,15 +8952,19 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
8723
8952
|
return;
|
|
8724
8953
|
}
|
|
8725
8954
|
|
|
8726
|
-
|
|
8727
|
-
streams?.microphone
|
|
8728
|
-
streams?.camera
|
|
8729
|
-
streams?.screenShare?.audio
|
|
8730
|
-
streams?.screenShare?.video
|
|
8731
|
-
|
|
8732
|
-
|
|
8733
|
-
|
|
8734
|
-
)
|
|
8955
|
+
const streamChecks = [
|
|
8956
|
+
{stream: streams?.microphone, name: 'microphone'},
|
|
8957
|
+
{stream: streams?.camera, name: 'camera'},
|
|
8958
|
+
{stream: streams?.screenShare?.audio, name: 'screenShare audio'},
|
|
8959
|
+
{stream: streams?.screenShare?.video, name: 'screenShare video'},
|
|
8960
|
+
];
|
|
8961
|
+
|
|
8962
|
+
for (const {stream, name} of streamChecks) {
|
|
8963
|
+
if (stream?.readyState === 'ended') {
|
|
8964
|
+
throw new Error(
|
|
8965
|
+
`Attempted to publish ${name} stream with ended readyState, correlationId=${this.correlationId}`
|
|
8966
|
+
);
|
|
8967
|
+
}
|
|
8735
8968
|
}
|
|
8736
8969
|
|
|
8737
8970
|
let floorRequestNeeded = false;
|
|
@@ -8793,6 +9026,9 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
8793
9026
|
* @returns {Promise}
|
|
8794
9027
|
*/
|
|
8795
9028
|
async unpublishStreams(streams: LocalStream[]): Promise<void> {
|
|
9029
|
+
LoggerProxy.logger.info(
|
|
9030
|
+
`Meeting:index#unpublishStreams --> called with: ${JSON.stringify(streams)}`
|
|
9031
|
+
);
|
|
8796
9032
|
this.checkMediaConnection();
|
|
8797
9033
|
|
|
8798
9034
|
const promises = [];
|
|
@@ -2,8 +2,9 @@
|
|
|
2
2
|
import {defer} from 'lodash';
|
|
3
3
|
import {Defer} from '@webex/common';
|
|
4
4
|
import {WebexPlugin} from '@webex/webex-core';
|
|
5
|
-
import {MEDIA, HTTP_VERBS, ROAP
|
|
5
|
+
import {MEDIA, HTTP_VERBS, ROAP} from '../constants';
|
|
6
6
|
import LoggerProxy from '../common/logs/logger-proxy';
|
|
7
|
+
import {ClientMediaPreferences} from '../reachability/reachability.types';
|
|
7
8
|
|
|
8
9
|
export type MediaRequestType = 'RoapMessage' | 'LocalMute';
|
|
9
10
|
export type RequestResult = any;
|
|
@@ -14,9 +15,8 @@ export type RoapRequest = {
|
|
|
14
15
|
mediaId: string;
|
|
15
16
|
roapMessage: any;
|
|
16
17
|
reachability: any;
|
|
18
|
+
clientMediaPreferences: ClientMediaPreferences;
|
|
17
19
|
sequence?: any;
|
|
18
|
-
joinCookie: any; // any, because this is opaque to the client, we pass whatever object we got from one backend component (Orpheus) to the other (Locus)
|
|
19
|
-
ipVersion?: IP_VERSION;
|
|
20
20
|
};
|
|
21
21
|
|
|
22
22
|
export type LocalMuteRequest = {
|
|
@@ -202,10 +202,6 @@ export class LocusMediaRequest extends WebexPlugin {
|
|
|
202
202
|
const body: any = {
|
|
203
203
|
device: this.config.device,
|
|
204
204
|
correlationId: this.config.correlationId,
|
|
205
|
-
clientMediaPreferences: {
|
|
206
|
-
preferTranscoding: this.config.preferTranscoding,
|
|
207
|
-
ipver: request.type === 'RoapMessage' ? request.ipVersion : undefined,
|
|
208
|
-
},
|
|
209
205
|
};
|
|
210
206
|
|
|
211
207
|
const localMedias: any = {
|
|
@@ -223,7 +219,7 @@ export class LocusMediaRequest extends WebexPlugin {
|
|
|
223
219
|
case 'RoapMessage':
|
|
224
220
|
localMedias.roapMessage = request.roapMessage;
|
|
225
221
|
localMedias.reachability = request.reachability;
|
|
226
|
-
body.clientMediaPreferences
|
|
222
|
+
body.clientMediaPreferences = request.clientMediaPreferences;
|
|
227
223
|
|
|
228
224
|
// @ts-ignore
|
|
229
225
|
this.webex.internal.newMetrics.submitClientEvent({
|
package/src/meeting/muteState.ts
CHANGED
|
@@ -394,21 +394,25 @@ export class MuteState {
|
|
|
394
394
|
* @public
|
|
395
395
|
* @memberof MuteState
|
|
396
396
|
* @param {Object} [meeting] the meeting object
|
|
397
|
+
* @param {Boolean} [unmuteAllowed] whether the user is allowed to unmute self
|
|
397
398
|
* @returns {undefined}
|
|
398
399
|
*/
|
|
399
|
-
public handleServerLocalUnmuteRequired(meeting
|
|
400
|
+
public handleServerLocalUnmuteRequired(meeting: any, unmuteAllowed: boolean) {
|
|
400
401
|
if (!this.state.client.enabled) {
|
|
401
402
|
LoggerProxy.logger.warn(
|
|
402
403
|
`Meeting:muteState#handleServerLocalUnmuteRequired --> ${this.type}: localAudioUnmuteRequired received while ${this.type} is disabled -> local unmute will not result in ${this.type} being sent`
|
|
403
404
|
);
|
|
404
405
|
} else {
|
|
405
406
|
LoggerProxy.logger.info(
|
|
406
|
-
`Meeting:muteState#handleServerLocalUnmuteRequired --> ${this.type}: localAudioUnmuteRequired received -> doing local unmute`
|
|
407
|
+
`Meeting:muteState#handleServerLocalUnmuteRequired --> ${this.type}: localAudioUnmuteRequired received -> doing local unmute (unmuteAllowed=${unmuteAllowed})`
|
|
407
408
|
);
|
|
408
409
|
}
|
|
409
410
|
|
|
410
411
|
// todo: I'm seeing "you can now unmute yourself " popup when this happens - but same thing happens on web.w.c so we can ignore for now
|
|
411
412
|
this.state.server.remoteMute = false;
|
|
413
|
+
this.state.server.unmuteAllowed = unmuteAllowed;
|
|
414
|
+
|
|
415
|
+
this.applyUnmuteAllowedToStream(meeting);
|
|
412
416
|
|
|
413
417
|
// change user mute state to false, but keep localMute true if overall mute state is still true
|
|
414
418
|
this.muteLocalStream(meeting, false, 'localUnmuteRequired');
|
package/src/meeting/request.ts
CHANGED
|
@@ -26,11 +26,11 @@ import {
|
|
|
26
26
|
SEND_DTMF_ENDPOINT,
|
|
27
27
|
_SLIDES_,
|
|
28
28
|
ANNOTATION,
|
|
29
|
-
IP_VERSION,
|
|
30
29
|
} from '../constants';
|
|
31
30
|
import {SendReactionOptions, ToggleReactionsOptions} from './request.type';
|
|
32
31
|
import MeetingUtil from './util';
|
|
33
32
|
import {AnnotationInfo} from '../annotation/annotation.types';
|
|
33
|
+
import {ClientMediaPreferences} from '../reachability/reachability.types';
|
|
34
34
|
|
|
35
35
|
/**
|
|
36
36
|
* @class MeetingRequest
|
|
@@ -128,8 +128,8 @@ export default class MeetingRequest extends StatelessWebexPlugin {
|
|
|
128
128
|
locale?: string;
|
|
129
129
|
deviceCapabilities?: Array<string>;
|
|
130
130
|
liveAnnotationSupported: boolean;
|
|
131
|
-
ipVersion?: IP_VERSION;
|
|
132
131
|
alias?: string;
|
|
132
|
+
clientMediaPreferences: ClientMediaPreferences;
|
|
133
133
|
}) {
|
|
134
134
|
const {
|
|
135
135
|
asResourceOccupant,
|
|
@@ -147,12 +147,11 @@ export default class MeetingRequest extends StatelessWebexPlugin {
|
|
|
147
147
|
moveToResource,
|
|
148
148
|
roapMessage,
|
|
149
149
|
reachability,
|
|
150
|
-
preferTranscoding,
|
|
151
150
|
breakoutsSupported,
|
|
152
151
|
locale,
|
|
153
152
|
deviceCapabilities = [],
|
|
154
153
|
liveAnnotationSupported,
|
|
155
|
-
|
|
154
|
+
clientMediaPreferences,
|
|
156
155
|
alias,
|
|
157
156
|
} = options;
|
|
158
157
|
|
|
@@ -160,8 +159,6 @@ export default class MeetingRequest extends StatelessWebexPlugin {
|
|
|
160
159
|
|
|
161
160
|
let url = '';
|
|
162
161
|
|
|
163
|
-
const joinCookie = await this.getJoinCookie();
|
|
164
|
-
|
|
165
162
|
const body: any = {
|
|
166
163
|
asResourceOccupant,
|
|
167
164
|
device: {
|
|
@@ -176,11 +173,7 @@ export default class MeetingRequest extends StatelessWebexPlugin {
|
|
|
176
173
|
allowMultiDevice: true,
|
|
177
174
|
ensureConversation: ensureConversation || false,
|
|
178
175
|
supportsNativeLobby: 1,
|
|
179
|
-
clientMediaPreferences
|
|
180
|
-
preferTranscoding: preferTranscoding ?? true,
|
|
181
|
-
joinCookie,
|
|
182
|
-
ipver: ipVersion,
|
|
183
|
-
},
|
|
176
|
+
clientMediaPreferences,
|
|
184
177
|
};
|
|
185
178
|
|
|
186
179
|
if (alias) {
|