@webex/plugin-meetings 3.1.0 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/breakouts/breakout.js +1 -1
- package/dist/breakouts/index.js +1 -1
- package/dist/common/errors/reconnection-not-started.js +46 -0
- package/dist/common/errors/reconnection-not-started.js.map +1 -0
- package/dist/constants.js +16 -5
- package/dist/constants.js.map +1 -1
- package/dist/index.js +80 -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 +7 -1
- package/dist/locus-info/controlsUtils.js.map +1 -1
- package/dist/locus-info/index.js +10 -0
- package/dist/locus-info/index.js.map +1 -1
- package/dist/media/properties.js +102 -57
- package/dist/media/properties.js.map +1 -1
- package/dist/mediaQualityMetrics/config.js +10 -10
- package/dist/mediaQualityMetrics/config.js.map +1 -1
- package/dist/meeting/in-meeting-actions.js +6 -0
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +564 -475
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/locusMediaRequest.js +27 -0
- package/dist/meeting/locusMediaRequest.js.map +1 -1
- package/dist/meeting/util.js +9 -16
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting/voicea-meeting.js +37 -49
- package/dist/meeting/voicea-meeting.js.map +1 -1
- package/dist/meeting-info/util.js +304 -267
- package/dist/meeting-info/util.js.map +1 -1
- package/dist/meeting-info/utilv2.js +334 -298
- package/dist/meeting-info/utilv2.js.map +1 -1
- package/dist/meetings/index.js +12 -28
- package/dist/meetings/index.js.map +1 -1
- package/dist/reachability/index.js +88 -9
- package/dist/reachability/index.js.map +1 -1
- package/dist/reconnection-manager/index.js +138 -109
- package/dist/reconnection-manager/index.js.map +1 -1
- package/dist/roap/request.js +3 -27
- package/dist/roap/request.js.map +1 -1
- package/dist/statsAnalyzer/index.js +8 -2
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.js +17 -0
- package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
- package/dist/types/annotation/annotation.types.d.ts +42 -0
- package/dist/types/annotation/constants.d.ts +31 -0
- package/dist/types/annotation/index.d.ts +117 -0
- package/dist/types/breakouts/breakout.d.ts +8 -0
- package/dist/types/breakouts/collection.d.ts +5 -0
- package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
- package/dist/types/breakouts/events.d.ts +8 -0
- package/dist/types/breakouts/index.d.ts +5 -0
- package/dist/types/breakouts/request.d.ts +22 -0
- package/dist/types/breakouts/utils.d.ts +15 -0
- package/dist/types/common/browser-detection.d.ts +9 -0
- package/dist/types/common/collection.d.ts +48 -0
- package/dist/types/common/config.d.ts +2 -0
- package/dist/types/common/errors/captcha-error.d.ts +15 -0
- package/dist/types/common/errors/intent-to-join.d.ts +16 -0
- package/dist/types/common/errors/join-meeting.d.ts +17 -0
- package/dist/types/common/errors/media.d.ts +15 -0
- package/dist/types/common/errors/no-meeting-info.d.ts +14 -0
- package/dist/types/common/errors/parameter.d.ts +15 -0
- package/dist/types/common/errors/password-error.d.ts +15 -0
- package/dist/types/common/errors/permission.d.ts +14 -0
- package/dist/types/common/errors/reclaim-host-role-errors.d.ts +60 -0
- package/dist/types/common/errors/reconnection-not-started.d.ts +13 -0
- package/dist/types/common/errors/reconnection.d.ts +15 -0
- package/dist/types/common/errors/stats.d.ts +15 -0
- package/dist/types/common/errors/webex-errors.d.ts +93 -0
- package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
- package/dist/types/common/events/events-scope.d.ts +17 -0
- package/dist/types/common/events/events.d.ts +12 -0
- package/dist/types/common/events/trigger-proxy.d.ts +2 -0
- package/dist/types/common/events/util.d.ts +2 -0
- package/dist/types/common/logs/logger-config.d.ts +2 -0
- package/dist/types/common/logs/logger-proxy.d.ts +2 -0
- package/dist/types/common/logs/request.d.ts +36 -0
- package/dist/types/common/queue.d.ts +34 -0
- package/dist/types/config.d.ts +73 -0
- package/dist/types/constants.d.ts +1098 -0
- package/dist/types/controls-options-manager/constants.d.ts +4 -0
- package/dist/types/controls-options-manager/enums.d.ts +15 -0
- package/dist/types/controls-options-manager/index.d.ts +136 -0
- package/dist/types/controls-options-manager/types.d.ts +43 -0
- package/dist/types/controls-options-manager/util.d.ts +1 -0
- package/dist/types/index.d.ts +19 -0
- package/dist/types/interceptors/index.d.ts +2 -0
- package/dist/types/interceptors/locusRetry.d.ts +27 -0
- package/dist/types/interpretation/collection.d.ts +5 -0
- package/dist/types/interpretation/index.d.ts +5 -0
- package/dist/types/interpretation/siLanguage.d.ts +5 -0
- package/dist/types/locus-info/controlsUtils.d.ts +2 -0
- package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
- package/dist/types/locus-info/fullState.d.ts +2 -0
- package/dist/types/locus-info/hostUtils.d.ts +2 -0
- package/dist/types/locus-info/index.d.ts +322 -0
- package/dist/types/locus-info/infoUtils.d.ts +2 -0
- package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
- package/dist/types/locus-info/parser.d.ts +272 -0
- package/dist/types/locus-info/selfUtils.d.ts +2 -0
- package/dist/types/media/MediaConnectionAwaiter.d.ts +61 -0
- package/dist/types/media/index.d.ts +34 -0
- package/dist/types/media/properties.d.ts +117 -0
- package/dist/types/media/util.d.ts +2 -0
- package/dist/types/mediaQualityMetrics/config.d.ts +247 -0
- package/dist/types/meeting/in-meeting-actions.d.ts +173 -0
- package/dist/types/meeting/index.d.ts +1832 -0
- package/dist/types/meeting/locusMediaRequest.d.ts +75 -0
- package/dist/types/meeting/muteState.d.ts +178 -0
- package/dist/types/meeting/request.d.ts +295 -0
- package/dist/types/meeting/request.type.d.ts +11 -0
- package/dist/types/meeting/state.d.ts +9 -0
- package/dist/types/meeting/util.d.ts +122 -0
- package/dist/types/meeting/voicea-meeting.d.ts +17 -0
- package/dist/types/meeting-info/collection.d.ts +20 -0
- package/dist/types/meeting-info/index.d.ts +69 -0
- package/dist/types/meeting-info/meeting-info-v2.d.ts +123 -0
- package/dist/types/meeting-info/request.d.ts +22 -0
- package/dist/types/meeting-info/util.d.ts +49 -0
- package/dist/types/meeting-info/utilv2.d.ts +65 -0
- package/dist/types/meetings/collection.d.ts +40 -0
- package/dist/types/meetings/index.d.ts +383 -0
- package/dist/types/meetings/meetings.types.d.ts +4 -0
- package/dist/types/meetings/request.d.ts +27 -0
- package/dist/types/meetings/util.d.ts +18 -0
- package/dist/types/member/index.d.ts +160 -0
- package/dist/types/member/types.d.ts +32 -0
- package/dist/types/member/util.d.ts +2 -0
- package/dist/types/members/collection.d.ts +29 -0
- package/dist/types/members/index.d.ts +353 -0
- package/dist/types/members/request.d.ts +114 -0
- package/dist/types/members/types.d.ts +25 -0
- package/dist/types/members/util.d.ts +215 -0
- package/dist/types/metrics/constants.d.ts +70 -0
- package/dist/types/metrics/index.d.ts +45 -0
- package/dist/types/multistream/mediaRequestManager.d.ts +119 -0
- package/dist/types/multistream/receiveSlot.d.ts +68 -0
- package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
- package/dist/types/multistream/remoteMedia.d.ts +72 -0
- package/dist/types/multistream/remoteMediaGroup.d.ts +49 -0
- package/dist/types/multistream/remoteMediaManager.d.ts +300 -0
- package/dist/types/multistream/sendSlotManager.d.ts +69 -0
- package/dist/types/networkQualityMonitor/index.d.ts +70 -0
- package/dist/types/personal-meeting-room/index.d.ts +47 -0
- package/dist/types/personal-meeting-room/request.d.ts +14 -0
- package/dist/types/personal-meeting-room/util.d.ts +2 -0
- package/dist/types/reachability/clusterReachability.d.ts +110 -0
- package/dist/types/reachability/index.d.ts +120 -0
- package/dist/types/reachability/request.d.ts +39 -0
- package/dist/types/reachability/util.d.ts +15 -0
- package/dist/types/reactions/constants.d.ts +3 -0
- package/dist/types/reactions/reactions.d.ts +4 -0
- package/dist/types/reactions/reactions.type.d.ts +52 -0
- package/dist/types/reconnection-manager/index.d.ts +126 -0
- package/dist/types/recording-controller/enums.d.ts +7 -0
- package/dist/types/recording-controller/index.d.ts +207 -0
- package/dist/types/recording-controller/util.d.ts +14 -0
- package/dist/types/roap/index.d.ts +86 -0
- package/dist/types/roap/request.d.ts +39 -0
- package/dist/types/roap/turnDiscovery.d.ts +155 -0
- package/dist/types/rtcMetrics/constants.d.ts +4 -0
- package/dist/types/rtcMetrics/index.d.ts +61 -0
- package/dist/types/statsAnalyzer/global.d.ts +36 -0
- package/dist/types/statsAnalyzer/index.d.ts +217 -0
- package/dist/types/statsAnalyzer/mqaUtil.d.ts +48 -0
- package/dist/types/transcription/index.d.ts +64 -0
- package/dist/types/webinar/collection.d.ts +16 -0
- package/dist/types/webinar/index.d.ts +5 -0
- package/dist/webinar/index.js +1 -1
- package/package.json +22 -22
- package/src/common/errors/reconnection-not-started.ts +25 -0
- package/src/constants.ts +14 -5
- package/src/index.ts +30 -0
- package/src/locus-info/controlsUtils.ts +11 -0
- package/src/locus-info/index.ts +16 -0
- package/src/media/properties.ts +67 -15
- package/src/mediaQualityMetrics/config.ts +13 -7
- package/src/meeting/in-meeting-actions.ts +12 -0
- package/src/meeting/index.ts +144 -107
- package/src/meeting/locusMediaRequest.ts +31 -0
- package/src/meeting/util.ts +9 -16
- package/src/meeting/voicea-meeting.ts +44 -46
- package/src/meeting-info/util.ts +241 -233
- package/src/meeting-info/utilv2.ts +250 -244
- package/src/meetings/index.ts +15 -27
- package/src/reachability/index.ts +60 -0
- package/src/reconnection-manager/index.ts +128 -105
- package/src/roap/request.ts +1 -24
- package/src/statsAnalyzer/index.ts +10 -3
- package/src/statsAnalyzer/mqaUtil.ts +23 -0
- package/test/unit/spec/locus-info/controlsUtils.js +20 -0
- package/test/unit/spec/locus-info/index.js +21 -0
- package/test/unit/spec/media/properties.ts +145 -140
- package/test/unit/spec/meeting/in-meeting-actions.ts +6 -0
- package/test/unit/spec/meeting/index.js +271 -105
- package/test/unit/spec/meeting/locusMediaRequest.ts +49 -0
- package/test/unit/spec/meeting/utils.js +3 -10
- package/test/unit/spec/meeting/voicea-meeting.ts +5 -14
- package/test/unit/spec/meetings/index.js +59 -17
- package/test/unit/spec/reachability/index.ts +266 -0
- package/test/unit/spec/reconnection-manager/index.js +127 -39
- package/test/unit/spec/roap/request.ts +0 -37
- package/test/unit/spec/stats-analyzer/index.js +100 -8
- package/src/common/errors/reconnection-in-progress.ts +0 -8
package/src/meeting/index.ts
CHANGED
|
@@ -38,6 +38,7 @@ import {
|
|
|
38
38
|
import {
|
|
39
39
|
EVENT_TRIGGERS as VOICEAEVENTS,
|
|
40
40
|
TURN_ON_CAPTION_STATUS,
|
|
41
|
+
type MeetingTranscriptPayload,
|
|
41
42
|
} from '@webex/internal-plugin-voicea';
|
|
42
43
|
import {processNewCaptions} from './voicea-meeting';
|
|
43
44
|
|
|
@@ -66,6 +67,7 @@ import {createMuteState} from './muteState';
|
|
|
66
67
|
import LocusInfo from '../locus-info';
|
|
67
68
|
import Metrics from '../metrics';
|
|
68
69
|
import ReconnectionManager from '../reconnection-manager';
|
|
70
|
+
import ReconnectionNotStartedError from '../common/errors/reconnection-not-started';
|
|
69
71
|
import MeetingRequest from './request';
|
|
70
72
|
import Members from '../members/index';
|
|
71
73
|
import MeetingUtil from './util';
|
|
@@ -76,8 +78,6 @@ import MediaUtil from '../media/util';
|
|
|
76
78
|
import {Reactions, SkinTones} from '../reactions/reactions';
|
|
77
79
|
import PasswordError from '../common/errors/password-error';
|
|
78
80
|
import CaptchaError from '../common/errors/captcha-error';
|
|
79
|
-
import ReconnectionError from '../common/errors/reconnection';
|
|
80
|
-
import ReconnectInProgress from '../common/errors/reconnection-in-progress';
|
|
81
81
|
import {
|
|
82
82
|
_CONVERSATION_URL_,
|
|
83
83
|
_INCOMING_,
|
|
@@ -631,6 +631,7 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
631
631
|
turnDiscoverySkippedReason: TurnDiscoverySkipReason;
|
|
632
632
|
turnServerUsed: boolean;
|
|
633
633
|
areVoiceaEventsSetup = false;
|
|
634
|
+
isMoveToInProgress = false;
|
|
634
635
|
|
|
635
636
|
voiceaListenerCallbacks: object = {
|
|
636
637
|
[VOICEAEVENTS.VOICEA_ANNOUNCEMENT]: (payload: Transcription['languageOptions']) => {
|
|
@@ -655,7 +656,7 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
655
656
|
this.transcription.isListening = !!data.isListening;
|
|
656
657
|
this.transcription.commandText = data.text ?? '';
|
|
657
658
|
},
|
|
658
|
-
[VOICEAEVENTS.NEW_CAPTION]: (data) => {
|
|
659
|
+
[VOICEAEVENTS.NEW_CAPTION]: (data: MeetingTranscriptPayload) => {
|
|
659
660
|
processNewCaptions({data, meeting: this});
|
|
660
661
|
|
|
661
662
|
LoggerProxy.logger.debug(
|
|
@@ -678,6 +679,7 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
678
679
|
private deferSDPAnswer?: Defer; // used for waiting for a response
|
|
679
680
|
private sdpResponseTimer?: ReturnType<typeof setTimeout>;
|
|
680
681
|
private hasMediaConnectionConnectedAtLeastOnce: boolean;
|
|
682
|
+
private joinWithMediaRetryInfo?: {isRetry: boolean; prevJoinResponse?: any};
|
|
681
683
|
|
|
682
684
|
/**
|
|
683
685
|
* @param {Object} attrs
|
|
@@ -1389,11 +1391,11 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
1389
1391
|
this.remoteMediaManager = null;
|
|
1390
1392
|
|
|
1391
1393
|
this.localAudioStreamMuteStateHandler = () => {
|
|
1392
|
-
this.audio
|
|
1394
|
+
this.audio?.handleLocalStreamMuteStateChange(this);
|
|
1393
1395
|
};
|
|
1394
1396
|
|
|
1395
1397
|
this.localVideoStreamMuteStateHandler = () => {
|
|
1396
|
-
this.video
|
|
1398
|
+
this.video?.handleLocalStreamMuteStateChange(this);
|
|
1397
1399
|
};
|
|
1398
1400
|
|
|
1399
1401
|
// The handling of output track changes should be done inside
|
|
@@ -1459,6 +1461,15 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
1459
1461
|
* @memberof Meeting
|
|
1460
1462
|
*/
|
|
1461
1463
|
this.hasMediaConnectionConnectedAtLeastOnce = false;
|
|
1464
|
+
|
|
1465
|
+
/**
|
|
1466
|
+
* Information needed for a retry of a call to joinWithMedia
|
|
1467
|
+
* @instance
|
|
1468
|
+
* @type {{isRetry: boolean; prevJoinResponse?: any}}
|
|
1469
|
+
* @private
|
|
1470
|
+
* @memberof Meeting
|
|
1471
|
+
*/
|
|
1472
|
+
this.joinWithMediaRetryInfo = {isRetry: false, prevJoinResponse: undefined};
|
|
1462
1473
|
}
|
|
1463
1474
|
|
|
1464
1475
|
/**
|
|
@@ -2401,6 +2412,18 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
2401
2412
|
}
|
|
2402
2413
|
);
|
|
2403
2414
|
|
|
2415
|
+
this.locusInfo.on(LOCUSINFO.EVENTS.CONTROLS_MEETING_MANUAL_CAPTION_UPDATED, ({enable}) => {
|
|
2416
|
+
Trigger.trigger(
|
|
2417
|
+
this,
|
|
2418
|
+
{
|
|
2419
|
+
file: 'meeting/index',
|
|
2420
|
+
function: 'setupLocusControlsListener',
|
|
2421
|
+
},
|
|
2422
|
+
EVENT_TRIGGERS.MEETING_MANUAL_CAPTION_UPDATED,
|
|
2423
|
+
{enable}
|
|
2424
|
+
);
|
|
2425
|
+
});
|
|
2426
|
+
|
|
2404
2427
|
this.locusInfo.on(LOCUSINFO.EVENTS.CONTROLS_MEETING_BREAKOUT_UPDATED, ({breakout}) => {
|
|
2405
2428
|
this.breakouts.updateBreakout(breakout);
|
|
2406
2429
|
Trigger.trigger(
|
|
@@ -3058,6 +3081,7 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
3058
3081
|
options: {meetingId: this.id},
|
|
3059
3082
|
});
|
|
3060
3083
|
}
|
|
3084
|
+
this.updateLLMConnection();
|
|
3061
3085
|
});
|
|
3062
3086
|
this.locusInfo.on(LOCUSINFO.EVENTS.SELF_ADMITTED_GUEST, async (payload) => {
|
|
3063
3087
|
this.stopKeepAlive();
|
|
@@ -3575,6 +3599,9 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
3575
3599
|
canStartTranscribing: MeetingUtil.canStartTranscribing(this.userDisplayHints),
|
|
3576
3600
|
canStopTranscribing: MeetingUtil.canStopTranscribing(this.userDisplayHints),
|
|
3577
3601
|
isClosedCaptionActive: MeetingUtil.isClosedCaptionActive(this.userDisplayHints),
|
|
3602
|
+
canStartManualCaption: MeetingUtil.canStartManualCaption(this.userDisplayHints),
|
|
3603
|
+
canStopManualCaption: MeetingUtil.canStopManualCaption(this.userDisplayHints),
|
|
3604
|
+
isManualCaptionActive: MeetingUtil.isManualCaptionActive(this.userDisplayHints),
|
|
3578
3605
|
isSaveTranscriptsEnabled: MeetingUtil.isSaveTranscriptsEnabled(this.userDisplayHints),
|
|
3579
3606
|
isWebexAssistantActive: MeetingUtil.isWebexAssistantActive(this.userDisplayHints),
|
|
3580
3607
|
canViewCaptionPanel: MeetingUtil.canViewCaptionPanel(this.userDisplayHints),
|
|
@@ -3918,7 +3945,7 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
3918
3945
|
// we don't update this.mediaProperties.mediaDirection.sendAudio, because we always keep it as true to avoid extra SDP exchanges
|
|
3919
3946
|
this.mediaProperties.setLocalAudioStream(localStream);
|
|
3920
3947
|
|
|
3921
|
-
this.audio
|
|
3948
|
+
this.audio?.handleLocalStreamChange(this);
|
|
3922
3949
|
|
|
3923
3950
|
localStream?.on(
|
|
3924
3951
|
LocalStreamEventNames.UserMuteStateChange,
|
|
@@ -3960,7 +3987,7 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
3960
3987
|
// we don't update this.mediaProperties.mediaDirection.sendVideo, because we always keep it as true to avoid extra SDP exchanges
|
|
3961
3988
|
this.mediaProperties.setLocalVideoStream(localStream);
|
|
3962
3989
|
|
|
3963
|
-
this.video
|
|
3990
|
+
this.video?.handleLocalStreamChange(this);
|
|
3964
3991
|
|
|
3965
3992
|
localStream?.on(
|
|
3966
3993
|
LocalStreamEventNames.UserMuteStateChange,
|
|
@@ -4512,6 +4539,7 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
4512
4539
|
} = {}
|
|
4513
4540
|
) {
|
|
4514
4541
|
const {mediaOptions, joinOptions = {}} = options;
|
|
4542
|
+
const {isRetry, prevJoinResponse} = this.joinWithMediaRetryInfo;
|
|
4515
4543
|
|
|
4516
4544
|
if (!mediaOptions?.allowMediaInLobby) {
|
|
4517
4545
|
return Promise.reject(
|
|
@@ -4523,6 +4551,7 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
4523
4551
|
LoggerProxy.logger.info('Meeting:index#joinWithMedia called');
|
|
4524
4552
|
|
|
4525
4553
|
let joined = false;
|
|
4554
|
+
let joinResponse = prevJoinResponse;
|
|
4526
4555
|
|
|
4527
4556
|
try {
|
|
4528
4557
|
let turnServerInfo;
|
|
@@ -4535,7 +4564,14 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
4535
4564
|
({turnDiscoverySkippedReason} = turnDiscoveryRequest);
|
|
4536
4565
|
joinOptions.roapMessage = turnDiscoveryRequest.roapMessage;
|
|
4537
4566
|
|
|
4538
|
-
|
|
4567
|
+
if (!joinResponse) {
|
|
4568
|
+
LoggerProxy.logger.info(
|
|
4569
|
+
'Meeting:index#joinWithMedia ---> calling join with joinOptions, ',
|
|
4570
|
+
joinOptions
|
|
4571
|
+
);
|
|
4572
|
+
|
|
4573
|
+
joinResponse = await this.join(joinOptions);
|
|
4574
|
+
}
|
|
4539
4575
|
|
|
4540
4576
|
joined = true;
|
|
4541
4577
|
|
|
@@ -4553,6 +4589,8 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
4553
4589
|
|
|
4554
4590
|
const mediaResponse = await this.addMedia(mediaOptions, turnServerInfo);
|
|
4555
4591
|
|
|
4592
|
+
this.joinWithMediaRetryInfo = {isRetry: false, prevJoinResponse: undefined};
|
|
4593
|
+
|
|
4556
4594
|
return {
|
|
4557
4595
|
join: joinResponse,
|
|
4558
4596
|
media: mediaResponse,
|
|
@@ -4564,7 +4602,7 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
4564
4602
|
|
|
4565
4603
|
this.roap.abortTurnDiscovery();
|
|
4566
4604
|
|
|
4567
|
-
if (joined) {
|
|
4605
|
+
if (joined && isRetry) {
|
|
4568
4606
|
try {
|
|
4569
4607
|
await this.leave({resourceId: joinOptions?.resourceId, reason: 'joinWithMedia failure'});
|
|
4570
4608
|
} catch (e) {
|
|
@@ -4581,12 +4619,23 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
4581
4619
|
reason: error.message,
|
|
4582
4620
|
stack: error.stack,
|
|
4583
4621
|
leaveErrorReason: leaveError?.message,
|
|
4622
|
+
isRetry,
|
|
4584
4623
|
},
|
|
4585
4624
|
{
|
|
4586
4625
|
type: error.name,
|
|
4587
4626
|
}
|
|
4588
4627
|
);
|
|
4589
4628
|
|
|
4629
|
+
if (!isRetry) {
|
|
4630
|
+
LoggerProxy.logger.warn('Meeting:index#joinWithMedia --> retrying call to joinWithMedia');
|
|
4631
|
+
this.joinWithMediaRetryInfo.isRetry = true;
|
|
4632
|
+
this.joinWithMediaRetryInfo.prevJoinResponse = joinResponse;
|
|
4633
|
+
|
|
4634
|
+
return this.joinWithMedia(options);
|
|
4635
|
+
}
|
|
4636
|
+
|
|
4637
|
+
this.joinWithMediaRetryInfo = {isRetry: false, prevJoinResponse: undefined};
|
|
4638
|
+
|
|
4590
4639
|
throw error;
|
|
4591
4640
|
}
|
|
4592
4641
|
}
|
|
@@ -4617,90 +4666,28 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
4617
4666
|
);
|
|
4618
4667
|
}
|
|
4619
4668
|
|
|
4620
|
-
try {
|
|
4621
|
-
LoggerProxy.logger.info('Meeting:index#reconnect --> Validating reconnect ability.');
|
|
4622
|
-
// @ts-ignore
|
|
4623
|
-
this.reconnectionManager.validate();
|
|
4624
|
-
} catch (error) {
|
|
4625
|
-
// Unable to reconnect this call
|
|
4626
|
-
if (error instanceof ReconnectInProgress) {
|
|
4627
|
-
LoggerProxy.logger.info(
|
|
4628
|
-
'Meeting:index#reconnect --> Unable to reconnect, reconnection in progress.'
|
|
4629
|
-
);
|
|
4630
|
-
} else {
|
|
4631
|
-
LoggerProxy.logger.log('Meeting:index#reconnect --> Unable to reconnect.', error);
|
|
4632
|
-
}
|
|
4633
|
-
|
|
4634
|
-
return Promise.resolve();
|
|
4635
|
-
}
|
|
4636
|
-
|
|
4637
|
-
Trigger.trigger(
|
|
4638
|
-
this,
|
|
4639
|
-
{
|
|
4640
|
-
file: 'meeting/index',
|
|
4641
|
-
function: 'reconnect',
|
|
4642
|
-
},
|
|
4643
|
-
EVENT_TRIGGERS.MEETING_RECONNECTION_STARTING
|
|
4644
|
-
);
|
|
4645
|
-
|
|
4646
4669
|
return this.reconnectionManager
|
|
4647
|
-
.reconnect(options)
|
|
4648
|
-
|
|
4649
|
-
|
|
4670
|
+
.reconnect(options, async () => {
|
|
4671
|
+
await this.waitForRemoteSDPAnswer();
|
|
4672
|
+
await this.waitForMediaConnectionConnected();
|
|
4673
|
+
})
|
|
4650
4674
|
.then(() => {
|
|
4651
|
-
Trigger.trigger(
|
|
4652
|
-
this,
|
|
4653
|
-
{
|
|
4654
|
-
file: 'meeting/index',
|
|
4655
|
-
function: 'reconnect',
|
|
4656
|
-
},
|
|
4657
|
-
EVENT_TRIGGERS.MEETING_RECONNECTION_SUCCESS
|
|
4658
|
-
);
|
|
4659
4675
|
LoggerProxy.logger.log('Meeting:index#reconnect --> Meeting reconnect success');
|
|
4660
|
-
|
|
4661
|
-
// @ts-ignore
|
|
4662
|
-
this.webex.internal.newMetrics.submitClientEvent({
|
|
4663
|
-
name: 'client.media.recovered',
|
|
4664
|
-
payload: {
|
|
4665
|
-
recoveredBy: 'new',
|
|
4666
|
-
},
|
|
4667
|
-
options: {
|
|
4668
|
-
meetingId: this.id,
|
|
4669
|
-
},
|
|
4670
|
-
});
|
|
4671
|
-
this.reconnectionManager.setStatus(RECONNECTION.STATE.COMPLETE);
|
|
4672
4676
|
})
|
|
4673
4677
|
.catch((error) => {
|
|
4674
|
-
|
|
4675
|
-
|
|
4676
|
-
{
|
|
4677
|
-
file: 'meeting/index',
|
|
4678
|
-
function: 'reconnect',
|
|
4679
|
-
},
|
|
4680
|
-
EVENT_TRIGGERS.MEETING_RECONNECTION_FAILURE,
|
|
4681
|
-
{
|
|
4682
|
-
error: new ReconnectionError('Reconnection failure event', error),
|
|
4683
|
-
}
|
|
4684
|
-
);
|
|
4678
|
+
if (error instanceof ReconnectionNotStartedError) {
|
|
4679
|
+
LoggerProxy.logger.log('Meeting:index#reconnect --> Meeting reconnect not started');
|
|
4685
4680
|
|
|
4681
|
+
return Promise.resolve();
|
|
4682
|
+
}
|
|
4686
4683
|
LoggerProxy.logger.error('Meeting:index#reconnect --> Meeting reconnect failed', error);
|
|
4687
4684
|
|
|
4688
|
-
Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MEETING_RECONNECT_FAILURE, {
|
|
4689
|
-
correlation_id: this.correlationId,
|
|
4690
|
-
locus_id: this.locusUrl.split('/').pop(),
|
|
4691
|
-
reason: error.message,
|
|
4692
|
-
stack: error.stack,
|
|
4693
|
-
});
|
|
4694
|
-
|
|
4695
4685
|
this.uploadLogs({
|
|
4696
4686
|
file: 'meeting/index',
|
|
4697
4687
|
function: 'reconnect',
|
|
4698
4688
|
});
|
|
4699
4689
|
|
|
4700
|
-
return Promise.reject(
|
|
4701
|
-
})
|
|
4702
|
-
.finally(() => {
|
|
4703
|
-
this.reconnectionManager.reset();
|
|
4690
|
+
return Promise.reject(error);
|
|
4704
4691
|
});
|
|
4705
4692
|
}
|
|
4706
4693
|
|
|
@@ -4710,12 +4697,12 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
4710
4697
|
* @throws TranscriptionNotSupportedError
|
|
4711
4698
|
*/
|
|
4712
4699
|
isTranscriptionSupported() {
|
|
4713
|
-
if (this.locusInfo.controls.transcribe?.
|
|
4700
|
+
if (this.locusInfo.controls.transcribe?.caption) {
|
|
4714
4701
|
return true;
|
|
4715
4702
|
}
|
|
4716
4703
|
|
|
4717
4704
|
LoggerProxy.logger.error(
|
|
4718
|
-
'Meeting:index#isTranscriptionSupported -->
|
|
4705
|
+
'Meeting:index#isTranscriptionSupported --> Closed Captions is not enabled/supported'
|
|
4719
4706
|
);
|
|
4720
4707
|
|
|
4721
4708
|
return false;
|
|
@@ -4854,7 +4841,7 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
4854
4841
|
|
|
4855
4842
|
if (this.getCurUserType() === 'host') {
|
|
4856
4843
|
// @ts-ignore
|
|
4857
|
-
await this.webex.internal.voicea.
|
|
4844
|
+
await this.webex.internal.voicea.turnOnCaptions(options?.spokenLanguage);
|
|
4858
4845
|
}
|
|
4859
4846
|
} catch (error) {
|
|
4860
4847
|
LoggerProxy.logger.error(`Meeting:index#startTranscription --> ${error}`);
|
|
@@ -4966,6 +4953,27 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
4966
4953
|
);
|
|
4967
4954
|
}
|
|
4968
4955
|
|
|
4956
|
+
/**
|
|
4957
|
+
* This is a callback for the LLM event that is triggered when it comes online
|
|
4958
|
+
* This method in turn will trigger an event to the developers that the LLM is connected
|
|
4959
|
+
* @private
|
|
4960
|
+
* @memberof Meeting
|
|
4961
|
+
* @returns {null}
|
|
4962
|
+
*/
|
|
4963
|
+
private handleLLMOnline = (): void => {
|
|
4964
|
+
// @ts-ignore
|
|
4965
|
+
this.webex.internal.llm.off('online', this.handleLLMOnline);
|
|
4966
|
+
Trigger.trigger(
|
|
4967
|
+
this,
|
|
4968
|
+
{
|
|
4969
|
+
file: 'meeting/index',
|
|
4970
|
+
function: 'handleLLMOnline',
|
|
4971
|
+
},
|
|
4972
|
+
EVENT_TRIGGERS.MEETING_TRANSCRIPTION_CONNECTED,
|
|
4973
|
+
undefined
|
|
4974
|
+
);
|
|
4975
|
+
};
|
|
4976
|
+
|
|
4969
4977
|
/**
|
|
4970
4978
|
* Specify joining via audio (option: pstn), video, screenshare
|
|
4971
4979
|
* @param {JoinOptions} options A configurable options object for joining a meeting
|
|
@@ -5185,6 +5193,8 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
5185
5193
|
.then((join) => {
|
|
5186
5194
|
// @ts-ignore - config coming from registerPlugin
|
|
5187
5195
|
if (this.config.enableAutomaticLLM) {
|
|
5196
|
+
// @ts-ignore
|
|
5197
|
+
this.webex.internal.llm.on('online', this.handleLLMOnline);
|
|
5188
5198
|
this.updateLLMConnection()
|
|
5189
5199
|
.catch((error) => {
|
|
5190
5200
|
LoggerProxy.logger.error(
|
|
@@ -5202,15 +5212,6 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
5202
5212
|
LoggerProxy.logger.info(
|
|
5203
5213
|
'Meeting:index#join --> Transcription Socket Connection Success'
|
|
5204
5214
|
);
|
|
5205
|
-
Trigger.trigger(
|
|
5206
|
-
this,
|
|
5207
|
-
{
|
|
5208
|
-
file: 'meeting/index',
|
|
5209
|
-
function: 'join',
|
|
5210
|
-
},
|
|
5211
|
-
EVENT_TRIGGERS.MEETING_TRANSCRIPTION_CONNECTED,
|
|
5212
|
-
undefined
|
|
5213
|
-
);
|
|
5214
5215
|
});
|
|
5215
5216
|
}
|
|
5216
5217
|
|
|
@@ -5442,17 +5443,28 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
5442
5443
|
},
|
|
5443
5444
|
};
|
|
5444
5445
|
|
|
5445
|
-
this.cleanupLocalStreams();
|
|
5446
|
-
|
|
5447
5446
|
this.mediaProperties.setMediaDirection(mediaSettings.mediaDirection);
|
|
5448
5447
|
this.mediaProperties.unsetRemoteMedia();
|
|
5449
5448
|
|
|
5450
|
-
// when a move to is intiated by the client , Locus delets the existing media node from the server as soon the
|
|
5451
|
-
// once the
|
|
5452
|
-
|
|
5453
|
-
|
|
5454
|
-
|
|
5449
|
+
// when a move to is intiated by the client , Locus delets the existing media node from the server as soon the device answers the meeting
|
|
5450
|
+
// once the device answers we close the old connection and create new media server connection with only share enabled
|
|
5451
|
+
if (this.statsAnalyzer) {
|
|
5452
|
+
await this.statsAnalyzer.stopAnalyzer();
|
|
5453
|
+
}
|
|
5454
|
+
await this.closeRemoteStreams();
|
|
5455
|
+
await this.closePeerConnections();
|
|
5456
|
+
this.cleanupLocalStreams();
|
|
5457
|
+
this.unsetRemoteStreams();
|
|
5458
|
+
this.unsetPeerConnections();
|
|
5459
|
+
this.reconnectionManager.cleanUp();
|
|
5460
|
+
|
|
5461
|
+
await this.addMedia({
|
|
5462
|
+
audioEnabled: false,
|
|
5463
|
+
videoEnabled: false,
|
|
5464
|
+
shareVideoEnabled: true,
|
|
5455
5465
|
});
|
|
5466
|
+
Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MOVE_TO_SUCCESS);
|
|
5467
|
+
this.isMoveToInProgress = false;
|
|
5456
5468
|
} catch (error) {
|
|
5457
5469
|
LoggerProxy.logger.error('Meeting:index#moveTo --> Failed to moveTo resourceId', error);
|
|
5458
5470
|
Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MOVE_TO_FAILURE, {
|
|
@@ -5461,6 +5473,7 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
5461
5473
|
reason: error.message,
|
|
5462
5474
|
stack: error.stack,
|
|
5463
5475
|
});
|
|
5476
|
+
this.isMoveToInProgress = false;
|
|
5464
5477
|
}
|
|
5465
5478
|
});
|
|
5466
5479
|
|
|
@@ -5469,6 +5482,10 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
5469
5482
|
resourceId
|
|
5470
5483
|
);
|
|
5471
5484
|
|
|
5485
|
+
// TODO: Check with locus if SELF_OBSERVING event would ever be not emitted
|
|
5486
|
+
// If yes, introduce a timeout mechanism
|
|
5487
|
+
this.isMoveToInProgress = true;
|
|
5488
|
+
|
|
5472
5489
|
return MeetingUtil.joinMeetingOptions(this, {resourceId, moveToResource: true})
|
|
5473
5490
|
.then(() => {
|
|
5474
5491
|
this.meetingFiniteStateMachine.join();
|
|
@@ -5482,6 +5499,7 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
5482
5499
|
stack: error.stack,
|
|
5483
5500
|
});
|
|
5484
5501
|
LoggerProxy.logger.error('Meeting:index#moveTo --> Failed to moveTo resourceId', error);
|
|
5502
|
+
this.isMoveToInProgress = false;
|
|
5485
5503
|
|
|
5486
5504
|
return Promise.reject(error);
|
|
5487
5505
|
});
|
|
@@ -6468,11 +6486,14 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
6468
6486
|
/**
|
|
6469
6487
|
* Performs TURN discovery as a separate call to the Locus /media API
|
|
6470
6488
|
*
|
|
6471
|
-
* @param {boolean}
|
|
6489
|
+
* @param {boolean} isReconnecting
|
|
6472
6490
|
* @param {boolean} isForced
|
|
6473
6491
|
* @returns {Promise}
|
|
6474
6492
|
*/
|
|
6475
|
-
private async doTurnDiscovery(
|
|
6493
|
+
private async doTurnDiscovery(
|
|
6494
|
+
isReconnecting: boolean,
|
|
6495
|
+
isForced: boolean
|
|
6496
|
+
): Promise<TurnDiscoveryResult> {
|
|
6476
6497
|
// @ts-ignore
|
|
6477
6498
|
const cdl = this.webex.internal.newMetrics.callDiagnosticLatencies;
|
|
6478
6499
|
|
|
@@ -6481,7 +6502,7 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
6481
6502
|
name: 'internal.client.add-media.turn-discovery.start',
|
|
6482
6503
|
});
|
|
6483
6504
|
|
|
6484
|
-
const turnDiscoveryResult = await this.roap.doTurnDiscovery(this,
|
|
6505
|
+
const turnDiscoveryResult = await this.roap.doTurnDiscovery(this, isReconnecting, isForced);
|
|
6485
6506
|
|
|
6486
6507
|
this.turnDiscoverySkippedReason = turnDiscoveryResult?.turnDiscoverySkippedReason;
|
|
6487
6508
|
this.turnServerUsed = !this.turnDiscoverySkippedReason;
|
|
@@ -6520,11 +6541,16 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
6520
6541
|
turnServerInfo?: TurnServerInfo
|
|
6521
6542
|
): Promise<void> {
|
|
6522
6543
|
const LOG_HEADER = 'Meeting:index#addMedia():establishMediaConnection -->';
|
|
6523
|
-
const
|
|
6544
|
+
const isReconnecting = this.isMoveToInProgress || this.retriedWithTurnServer;
|
|
6545
|
+
|
|
6546
|
+
// We are forcing turn discovery if the case is moveTo and a turn server was used already
|
|
6547
|
+
if (this.isMoveToInProgress && this.turnServerUsed) {
|
|
6548
|
+
isForced = true;
|
|
6549
|
+
}
|
|
6524
6550
|
|
|
6525
6551
|
try {
|
|
6526
6552
|
if (!turnServerInfo) {
|
|
6527
|
-
({turnServerInfo} = await this.doTurnDiscovery(
|
|
6553
|
+
({turnServerInfo} = await this.doTurnDiscovery(isReconnecting, isForced));
|
|
6528
6554
|
}
|
|
6529
6555
|
|
|
6530
6556
|
const mc = await this.createMediaConnection(turnServerInfo, bundlePolicy);
|
|
@@ -6721,6 +6747,7 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
6721
6747
|
this.locusMediaRequest = new LocusMediaRequest(
|
|
6722
6748
|
{
|
|
6723
6749
|
correlationId: this.correlationId,
|
|
6750
|
+
meetingId: this.id,
|
|
6724
6751
|
device: {
|
|
6725
6752
|
url: this.deviceUrl,
|
|
6726
6753
|
// @ts-ignore
|
|
@@ -6765,7 +6792,8 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
6765
6792
|
await this.enqueueScreenShareFloorRequest();
|
|
6766
6793
|
}
|
|
6767
6794
|
|
|
6768
|
-
const connectionType
|
|
6795
|
+
const {connectionType, selectedCandidatePairChanges, numTransports} =
|
|
6796
|
+
await this.mediaProperties.getCurrentConnectionInfo();
|
|
6769
6797
|
// @ts-ignore
|
|
6770
6798
|
const reachabilityStats = await this.webex.meetings.reachability.getReachabilityMetrics();
|
|
6771
6799
|
|
|
@@ -6773,8 +6801,11 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
6773
6801
|
correlation_id: this.correlationId,
|
|
6774
6802
|
locus_id: this.locusUrl.split('/').pop(),
|
|
6775
6803
|
connectionType,
|
|
6804
|
+
selectedCandidatePairChanges,
|
|
6805
|
+
numTransports,
|
|
6776
6806
|
isMultistream: this.isMultistream,
|
|
6777
6807
|
retriedWithTurnServer: this.retriedWithTurnServer,
|
|
6808
|
+
isJoinWithMediaRetry: this.joinWithMediaRetryInfo.isRetry,
|
|
6778
6809
|
...reachabilityStats,
|
|
6779
6810
|
});
|
|
6780
6811
|
// @ts-ignore
|
|
@@ -6796,16 +6827,22 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
6796
6827
|
// @ts-ignore
|
|
6797
6828
|
const reachabilityMetrics = await this.webex.meetings.reachability.getReachabilityMetrics();
|
|
6798
6829
|
|
|
6830
|
+
const {selectedCandidatePairChanges, numTransports} =
|
|
6831
|
+
await this.mediaProperties.getCurrentConnectionInfo();
|
|
6832
|
+
|
|
6799
6833
|
Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.ADD_MEDIA_FAILURE, {
|
|
6800
6834
|
correlation_id: this.correlationId,
|
|
6801
6835
|
locus_id: this.locusUrl.split('/').pop(),
|
|
6802
6836
|
reason: error.message,
|
|
6803
6837
|
stack: error.stack,
|
|
6804
6838
|
code: error.code,
|
|
6839
|
+
selectedCandidatePairChanges,
|
|
6840
|
+
numTransports,
|
|
6805
6841
|
turnDiscoverySkippedReason: this.turnDiscoverySkippedReason,
|
|
6806
6842
|
turnServerUsed: this.turnServerUsed,
|
|
6807
6843
|
retriedWithTurnServer: this.retriedWithTurnServer,
|
|
6808
6844
|
isMultistream: this.isMultistream,
|
|
6845
|
+
isJoinWithMediaRetry: this.joinWithMediaRetryInfo.isRetry,
|
|
6809
6846
|
signalingState:
|
|
6810
6847
|
this.mediaProperties.webrtcMediaConnection?.multistreamConnection?.pc?.pc
|
|
6811
6848
|
?.signalingState ||
|
|
@@ -7013,7 +7050,7 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
7013
7050
|
if (audioEnabled !== undefined) {
|
|
7014
7051
|
this.mediaProperties.mediaDirection.sendAudio = audioEnabled;
|
|
7015
7052
|
this.mediaProperties.mediaDirection.receiveAudio = audioEnabled;
|
|
7016
|
-
this.audio
|
|
7053
|
+
this.audio?.enable(this, audioEnabled);
|
|
7017
7054
|
if (this.isMultistream) {
|
|
7018
7055
|
this.sendSlotManager.setActive(MediaType.AudioMain, audioEnabled);
|
|
7019
7056
|
}
|
|
@@ -7022,7 +7059,7 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
7022
7059
|
if (videoEnabled !== undefined) {
|
|
7023
7060
|
this.mediaProperties.mediaDirection.sendVideo = videoEnabled;
|
|
7024
7061
|
this.mediaProperties.mediaDirection.receiveVideo = videoEnabled;
|
|
7025
|
-
this.video
|
|
7062
|
+
this.video?.enable(this, videoEnabled);
|
|
7026
7063
|
if (this.isMultistream) {
|
|
7027
7064
|
this.sendSlotManager.setActive(MediaType.VideoMain, videoEnabled);
|
|
7028
7065
|
}
|
|
@@ -88,6 +88,7 @@ export type Config = {
|
|
|
88
88
|
regionCode?: string;
|
|
89
89
|
};
|
|
90
90
|
correlationId: string;
|
|
91
|
+
meetingId: string;
|
|
91
92
|
preferTranscoding: boolean;
|
|
92
93
|
};
|
|
93
94
|
|
|
@@ -223,6 +224,14 @@ export class LocusMediaRequest extends WebexPlugin {
|
|
|
223
224
|
localMedias.roapMessage = request.roapMessage;
|
|
224
225
|
localMedias.reachability = request.reachability;
|
|
225
226
|
body.clientMediaPreferences.joinCookie = request.joinCookie;
|
|
227
|
+
|
|
228
|
+
// @ts-ignore
|
|
229
|
+
this.webex.internal.newMetrics.submitClientEvent({
|
|
230
|
+
name: 'client.locus.media.request',
|
|
231
|
+
options: {
|
|
232
|
+
meetingId: this.config.meetingId,
|
|
233
|
+
},
|
|
234
|
+
});
|
|
226
235
|
break;
|
|
227
236
|
}
|
|
228
237
|
|
|
@@ -256,6 +265,16 @@ export class LocusMediaRequest extends WebexPlugin {
|
|
|
256
265
|
this.confluenceState = 'created';
|
|
257
266
|
}
|
|
258
267
|
|
|
268
|
+
if (request.type === 'RoapMessage') {
|
|
269
|
+
// @ts-ignore
|
|
270
|
+
this.webex.internal.newMetrics.submitClientEvent({
|
|
271
|
+
name: 'client.locus.media.response',
|
|
272
|
+
options: {
|
|
273
|
+
meetingId: this.config.meetingId,
|
|
274
|
+
},
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
|
|
259
278
|
return result;
|
|
260
279
|
})
|
|
261
280
|
.catch((e) => {
|
|
@@ -265,6 +284,18 @@ export class LocusMediaRequest extends WebexPlugin {
|
|
|
265
284
|
) {
|
|
266
285
|
this.confluenceState = 'not created';
|
|
267
286
|
}
|
|
287
|
+
|
|
288
|
+
if (request.type === 'RoapMessage') {
|
|
289
|
+
// @ts-ignore
|
|
290
|
+
this.webex.internal.newMetrics.submitClientEvent({
|
|
291
|
+
name: 'client.locus.media.response',
|
|
292
|
+
options: {
|
|
293
|
+
meetingId: this.config.meetingId,
|
|
294
|
+
rawError: e,
|
|
295
|
+
},
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
|
|
268
299
|
throw e;
|
|
269
300
|
});
|
|
270
301
|
}
|
package/src/meeting/util.ts
CHANGED
|
@@ -47,7 +47,6 @@ const MeetingUtil = {
|
|
|
47
47
|
},
|
|
48
48
|
|
|
49
49
|
remoteUpdateAudioVideo: (meeting, audioMuted?: boolean, videoMuted?: boolean) => {
|
|
50
|
-
const webex = meeting.getWebexObject();
|
|
51
50
|
if (!meeting) {
|
|
52
51
|
return Promise.reject(new ParameterError('You need a meeting object.'));
|
|
53
52
|
}
|
|
@@ -60,12 +59,6 @@ const MeetingUtil = {
|
|
|
60
59
|
);
|
|
61
60
|
}
|
|
62
61
|
|
|
63
|
-
// @ts-ignore
|
|
64
|
-
webex.internal.newMetrics.submitClientEvent({
|
|
65
|
-
name: 'client.locus.media.request',
|
|
66
|
-
options: {meetingId: meeting.id},
|
|
67
|
-
});
|
|
68
|
-
|
|
69
62
|
return meeting.locusMediaRequest
|
|
70
63
|
.send({
|
|
71
64
|
type: 'LocalMute',
|
|
@@ -77,15 +70,7 @@ const MeetingUtil = {
|
|
|
77
70
|
videoMuted,
|
|
78
71
|
},
|
|
79
72
|
})
|
|
80
|
-
.then((response) =>
|
|
81
|
-
// @ts-ignore
|
|
82
|
-
webex.internal.newMetrics.submitClientEvent({
|
|
83
|
-
name: 'client.locus.media.response',
|
|
84
|
-
options: {meetingId: meeting.id},
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
return response?.body?.locus;
|
|
88
|
-
});
|
|
73
|
+
.then((response) => response?.body?.locus);
|
|
89
74
|
},
|
|
90
75
|
|
|
91
76
|
hasOwner: (info) => info && info.owner,
|
|
@@ -535,6 +520,14 @@ const MeetingUtil = {
|
|
|
535
520
|
isClosedCaptionActive: (displayHints) =>
|
|
536
521
|
displayHints.includes(DISPLAY_HINTS.CAPTION_STATUS_ACTIVE),
|
|
537
522
|
|
|
523
|
+
canStartManualCaption: (displayHints) =>
|
|
524
|
+
displayHints.includes(DISPLAY_HINTS.MANUAL_CAPTION_START),
|
|
525
|
+
|
|
526
|
+
canStopManualCaption: (displayHints) => displayHints.includes(DISPLAY_HINTS.MANUAL_CAPTION_STOP),
|
|
527
|
+
|
|
528
|
+
isManualCaptionActive: (displayHints) =>
|
|
529
|
+
displayHints.includes(DISPLAY_HINTS.MANUAL_CAPTION_STATUS_ACTIVE),
|
|
530
|
+
|
|
538
531
|
isWebexAssistantActive: (displayHints) =>
|
|
539
532
|
displayHints.includes(DISPLAY_HINTS.WEBEX_ASSISTANT_STATUS_ACTIVE),
|
|
540
533
|
|