@webex/plugin-meetings 3.10.0-next.2 → 3.10.0-next.21
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/annotation/annotation.types.js.map +1 -1
- package/dist/annotation/constants.js.map +1 -1
- package/dist/annotation/index.js +19 -22
- package/dist/annotation/index.js.map +1 -1
- package/dist/breakouts/breakout.js +6 -6
- package/dist/breakouts/breakout.js.map +1 -1
- package/dist/breakouts/collection.js.map +1 -1
- package/dist/breakouts/edit-lock-error.js +9 -11
- package/dist/breakouts/edit-lock-error.js.map +1 -1
- package/dist/breakouts/events.js.map +1 -1
- package/dist/breakouts/index.js +126 -127
- package/dist/breakouts/index.js.map +1 -1
- package/dist/breakouts/request.js +6 -8
- package/dist/breakouts/request.js.map +1 -1
- package/dist/breakouts/utils.js.map +1 -1
- package/dist/common/browser-detection.js.map +1 -1
- package/dist/common/collection.js +1 -2
- package/dist/common/collection.js.map +1 -1
- package/dist/common/config.js.map +1 -1
- package/dist/common/errors/captcha-error.js +9 -11
- package/dist/common/errors/captcha-error.js.map +1 -1
- package/dist/common/errors/intent-to-join.js +10 -12
- package/dist/common/errors/intent-to-join.js.map +1 -1
- package/dist/common/errors/join-forbidden-error.js +10 -12
- package/dist/common/errors/join-forbidden-error.js.map +1 -1
- package/dist/common/errors/join-meeting.js +10 -12
- package/dist/common/errors/join-meeting.js.map +1 -1
- package/dist/common/errors/join-webinar-error.js +9 -11
- package/dist/common/errors/join-webinar-error.js.map +1 -1
- package/dist/common/errors/media.js +9 -11
- package/dist/common/errors/media.js.map +1 -1
- package/dist/common/errors/multistream-not-supported-error.js +9 -11
- package/dist/common/errors/multistream-not-supported-error.js.map +1 -1
- package/dist/common/errors/no-meeting-info.js +9 -11
- package/dist/common/errors/no-meeting-info.js.map +1 -1
- package/dist/common/errors/parameter.js +11 -14
- package/dist/common/errors/parameter.js.map +1 -1
- package/dist/common/errors/password-error.js +9 -11
- package/dist/common/errors/password-error.js.map +1 -1
- package/dist/common/errors/permission.js +9 -11
- package/dist/common/errors/permission.js.map +1 -1
- package/dist/common/errors/reclaim-host-role-errors.js +32 -38
- package/dist/common/errors/reclaim-host-role-errors.js.map +1 -1
- package/dist/common/errors/reconnection-not-started.js +5 -6
- package/dist/common/errors/reconnection-not-started.js.map +1 -1
- package/dist/common/errors/reconnection.js +9 -11
- package/dist/common/errors/reconnection.js.map +1 -1
- package/dist/common/errors/stats.js +9 -11
- package/dist/common/errors/stats.js.map +1 -1
- package/dist/common/errors/webex-errors.js +38 -27
- package/dist/common/errors/webex-errors.js.map +1 -1
- package/dist/common/errors/webex-meetings-error.js +9 -12
- package/dist/common/errors/webex-meetings-error.js.map +1 -1
- package/dist/common/events/events-scope.js +9 -10
- package/dist/common/events/events-scope.js.map +1 -1
- package/dist/common/events/events.js +9 -10
- package/dist/common/events/events.js.map +1 -1
- package/dist/common/events/trigger-proxy.js.map +1 -1
- package/dist/common/events/util.js.map +1 -1
- package/dist/common/logs/logger-config.js.map +1 -1
- package/dist/common/logs/logger-proxy.js.map +1 -1
- package/dist/common/logs/request.js +17 -17
- package/dist/common/logs/request.js.map +1 -1
- package/dist/common/queue.js +1 -2
- package/dist/common/queue.js.map +1 -1
- package/dist/config.js +0 -1
- package/dist/config.js.map +1 -1
- package/dist/constants.js +11 -8
- package/dist/constants.js.map +1 -1
- package/dist/controls-options-manager/constants.js.map +1 -1
- package/dist/controls-options-manager/enums.js.map +1 -1
- package/dist/controls-options-manager/index.js +1 -2
- 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 +1 -2
- package/dist/controls-options-manager/util.js.map +1 -1
- package/dist/hashTree/constants.js +20 -0
- package/dist/hashTree/constants.js.map +1 -0
- package/dist/hashTree/hashTree.js +515 -0
- package/dist/hashTree/hashTree.js.map +1 -0
- package/dist/hashTree/hashTreeParser.js +1266 -0
- package/dist/hashTree/hashTreeParser.js.map +1 -0
- package/dist/hashTree/types.js +22 -0
- package/dist/hashTree/types.js.map +1 -0
- package/dist/hashTree/utils.js +48 -0
- package/dist/hashTree/utils.js.map +1 -0
- package/dist/index.js +8 -2
- package/dist/index.js.map +1 -1
- package/dist/interceptors/index.js.map +1 -1
- package/dist/interceptors/locusRetry.js +6 -8
- package/dist/interceptors/locusRetry.js.map +1 -1
- package/dist/interceptors/locusRouteToken.js +6 -8
- package/dist/interceptors/locusRouteToken.js.map +1 -1
- package/dist/interpretation/collection.js.map +1 -1
- package/dist/interpretation/index.js +1 -2
- package/dist/interpretation/index.js.map +1 -1
- package/dist/interpretation/siLanguage.js +1 -1
- package/dist/interpretation/siLanguage.js.map +1 -1
- package/dist/locus-info/controlsUtils.js.map +1 -1
- package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
- package/dist/locus-info/fullState.js.map +1 -1
- package/dist/locus-info/hostUtils.js.map +1 -1
- package/dist/locus-info/index.js +584 -170
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/infoUtils.js.map +1 -1
- package/dist/locus-info/mediaSharesUtils.js.map +1 -1
- package/dist/locus-info/parser.js +3 -4
- package/dist/locus-info/parser.js.map +1 -1
- package/dist/locus-info/selfUtils.js.map +1 -1
- package/dist/locus-info/types.js +7 -0
- package/dist/locus-info/types.js.map +1 -0
- package/dist/media/MediaConnectionAwaiter.js +1 -2
- package/dist/media/MediaConnectionAwaiter.js.map +1 -1
- package/dist/media/index.js +0 -2
- package/dist/media/index.js.map +1 -1
- package/dist/media/properties.js +15 -17
- package/dist/media/properties.js.map +1 -1
- package/dist/media/util.js.map +1 -1
- package/dist/meeting/brbState.js +8 -9
- package/dist/meeting/brbState.js.map +1 -1
- package/dist/meeting/connectionStateHandler.js +10 -13
- package/dist/meeting/connectionStateHandler.js.map +1 -1
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +1577 -1534
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/locusMediaRequest.js +13 -17
- package/dist/meeting/locusMediaRequest.js.map +1 -1
- package/dist/meeting/muteState.js +11 -12
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.js +101 -104
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/request.type.js.map +1 -1
- package/dist/meeting/state.js.map +1 -1
- package/dist/meeting/type.js.map +1 -1
- package/dist/meeting/util.js +24 -23
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting/voicea-meeting.js +3 -3
- package/dist/meeting/voicea-meeting.js.map +1 -1
- package/dist/meeting-info/collection.js +7 -10
- package/dist/meeting-info/collection.js.map +1 -1
- package/dist/meeting-info/index.js +1 -2
- package/dist/meeting-info/index.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js +135 -146
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meeting-info/request.js +1 -2
- package/dist/meeting-info/request.js.map +1 -1
- package/dist/meeting-info/util.js +36 -37
- package/dist/meeting-info/util.js.map +1 -1
- package/dist/meeting-info/utilv2.js +30 -31
- package/dist/meeting-info/utilv2.js.map +1 -1
- package/dist/meetings/collection.js +6 -8
- package/dist/meetings/collection.js.map +1 -1
- package/dist/meetings/index.js +179 -141
- package/dist/meetings/index.js.map +1 -1
- package/dist/meetings/meetings.types.js.map +1 -1
- package/dist/meetings/request.js +6 -8
- package/dist/meetings/request.js.map +1 -1
- package/dist/meetings/util.js +25 -23
- package/dist/meetings/util.js.map +1 -1
- package/dist/member/index.js +1 -2
- package/dist/member/index.js.map +1 -1
- package/dist/member/types.js +6 -3
- package/dist/member/types.js.map +1 -1
- package/dist/member/util.js.map +1 -1
- package/dist/members/collection.js +1 -2
- package/dist/members/collection.js.map +1 -1
- package/dist/members/index.js +18 -21
- package/dist/members/index.js.map +1 -1
- package/dist/members/request.js +8 -11
- package/dist/members/request.js.map +1 -1
- package/dist/members/types.js.map +1 -1
- package/dist/members/util.js.map +1 -1
- package/dist/metrics/constants.js +3 -1
- package/dist/metrics/constants.js.map +1 -1
- package/dist/metrics/index.js +3 -4
- package/dist/metrics/index.js.map +1 -1
- package/dist/multistream/mediaRequestManager.js +1 -2
- package/dist/multistream/mediaRequestManager.js.map +1 -1
- package/dist/multistream/receiveSlot.js +34 -45
- package/dist/multistream/receiveSlot.js.map +1 -1
- package/dist/multistream/receiveSlotManager.js +8 -9
- package/dist/multistream/receiveSlotManager.js.map +1 -1
- package/dist/multistream/remoteMedia.js +12 -15
- package/dist/multistream/remoteMedia.js.map +1 -1
- package/dist/multistream/remoteMediaGroup.js +1 -2
- package/dist/multistream/remoteMediaGroup.js.map +1 -1
- package/dist/multistream/remoteMediaManager.js +122 -123
- package/dist/multistream/remoteMediaManager.js.map +1 -1
- package/dist/multistream/sendSlotManager.js +29 -30
- package/dist/multistream/sendSlotManager.js.map +1 -1
- package/dist/personal-meeting-room/index.js +16 -19
- package/dist/personal-meeting-room/index.js.map +1 -1
- package/dist/personal-meeting-room/request.js +7 -10
- package/dist/personal-meeting-room/request.js.map +1 -1
- package/dist/personal-meeting-room/util.js.map +1 -1
- package/dist/reachability/clusterReachability.js +56 -373
- package/dist/reachability/clusterReachability.js.map +1 -1
- package/dist/reachability/index.js +203 -205
- package/dist/reachability/index.js.map +1 -1
- package/dist/reachability/reachability.types.js +14 -1
- package/dist/reachability/reachability.types.js.map +1 -1
- package/dist/reachability/reachabilityPeerConnection.js +445 -0
- package/dist/reachability/reachabilityPeerConnection.js.map +1 -0
- package/dist/reachability/request.js.map +1 -1
- package/dist/reachability/util.js.map +1 -1
- package/dist/reactions/constants.js.map +1 -1
- package/dist/reactions/reactions.js.map +1 -1
- package/dist/reactions/reactions.type.js.map +1 -1
- package/dist/reconnection-manager/index.js +178 -176
- package/dist/reconnection-manager/index.js.map +1 -1
- package/dist/recording-controller/enums.js.map +1 -1
- package/dist/recording-controller/index.js +1 -2
- package/dist/recording-controller/index.js.map +1 -1
- package/dist/recording-controller/util.js.map +1 -1
- package/dist/roap/index.js +12 -15
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.js +24 -26
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/turnDiscovery.js +75 -76
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/roap/types.js.map +1 -1
- package/dist/transcription/index.js +4 -5
- package/dist/transcription/index.js.map +1 -1
- package/dist/types/common/errors/webex-errors.d.ts +12 -0
- package/dist/types/constants.d.ts +26 -21
- package/dist/types/hashTree/constants.d.ts +8 -0
- package/dist/types/hashTree/hashTree.d.ts +129 -0
- package/dist/types/hashTree/hashTreeParser.d.ts +260 -0
- package/dist/types/hashTree/types.d.ts +27 -0
- package/dist/types/hashTree/utils.d.ts +9 -0
- package/dist/types/index.d.ts +2 -1
- package/dist/types/locus-info/index.d.ts +97 -80
- package/dist/types/locus-info/types.d.ts +54 -0
- package/dist/types/meeting/index.d.ts +22 -9
- package/dist/types/meetings/index.d.ts +9 -2
- package/dist/types/metrics/constants.d.ts +2 -0
- package/dist/types/reachability/clusterReachability.d.ts +10 -88
- package/dist/types/reachability/reachability.types.d.ts +12 -1
- package/dist/types/reachability/reachabilityPeerConnection.d.ts +111 -0
- package/dist/webinar/collection.js +1 -2
- package/dist/webinar/collection.js.map +1 -1
- package/dist/webinar/index.js +148 -158
- package/dist/webinar/index.js.map +1 -1
- package/package.json +23 -22
- package/src/common/errors/webex-errors.ts +19 -0
- package/src/constants.ts +13 -1
- package/src/hashTree/constants.ts +9 -0
- package/src/hashTree/hashTree.ts +463 -0
- package/src/hashTree/hashTreeParser.ts +1161 -0
- package/src/hashTree/types.ts +32 -0
- package/src/hashTree/utils.ts +42 -0
- package/src/index.ts +2 -0
- package/src/locus-info/index.ts +597 -154
- package/src/locus-info/types.ts +53 -0
- package/src/meeting/index.ts +80 -28
- package/src/meeting/util.ts +1 -0
- package/src/meetings/index.ts +104 -51
- package/src/metrics/constants.ts +2 -0
- package/src/reachability/clusterReachability.ts +50 -347
- package/src/reachability/reachability.types.ts +15 -1
- package/src/reachability/reachabilityPeerConnection.ts +416 -0
- package/test/unit/spec/hashTree/hashTree.ts +655 -0
- package/test/unit/spec/hashTree/hashTreeParser.ts +1532 -0
- package/test/unit/spec/hashTree/utils.ts +103 -0
- package/test/unit/spec/locus-info/index.js +795 -16
- package/test/unit/spec/meeting/index.js +207 -94
- package/test/unit/spec/meeting/utils.js +77 -0
- package/test/unit/spec/meetings/index.js +71 -26
- package/test/unit/spec/reachability/clusterReachability.ts +281 -138
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import {HtMeta} from '../hashTree/types';
|
|
2
|
+
|
|
3
|
+
export type LocusFullState = {
|
|
4
|
+
active: boolean;
|
|
5
|
+
count: number;
|
|
6
|
+
lastActive: string;
|
|
7
|
+
locked: boolean;
|
|
8
|
+
sessionId: string;
|
|
9
|
+
seessionIds: string[];
|
|
10
|
+
startTime: number;
|
|
11
|
+
state: string;
|
|
12
|
+
type: string;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export type Links = {
|
|
16
|
+
services: Record<'breakout' | 'record', {url: string}>; // there exist also other services, but these are the ones we currently use
|
|
17
|
+
resources: Record<'webcastInstance' | 'visibleDataSets', {url: string}>; // there exist also other resources, but these are the ones we currently use
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export type LocusDTO = {
|
|
21
|
+
controls?: any;
|
|
22
|
+
fullState?: LocusFullState;
|
|
23
|
+
host?: {
|
|
24
|
+
id: string;
|
|
25
|
+
incomingCallProtocols: any[];
|
|
26
|
+
isExternal: boolean;
|
|
27
|
+
name: string;
|
|
28
|
+
orgId: string;
|
|
29
|
+
};
|
|
30
|
+
htMeta?: HtMeta;
|
|
31
|
+
info?: any;
|
|
32
|
+
jsSdkMeta?: {
|
|
33
|
+
removedParticipantIds: string[]; // list of ids of participants that are removed in the last update
|
|
34
|
+
};
|
|
35
|
+
links?: Links;
|
|
36
|
+
mediaShares?: any[];
|
|
37
|
+
meetings?: any[];
|
|
38
|
+
participants: any[];
|
|
39
|
+
replaces?: any[];
|
|
40
|
+
self?: any;
|
|
41
|
+
sequence?: {
|
|
42
|
+
dirtyParticipants: number;
|
|
43
|
+
entries: number[];
|
|
44
|
+
rangeEnd: number;
|
|
45
|
+
rangeStart: number;
|
|
46
|
+
sequenceHash: number;
|
|
47
|
+
sessionToken: string;
|
|
48
|
+
since: string;
|
|
49
|
+
totalParticipants: number;
|
|
50
|
+
};
|
|
51
|
+
syncUrl?: string;
|
|
52
|
+
url?: string;
|
|
53
|
+
};
|
package/src/meeting/index.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import uuid from 'uuid';
|
|
2
|
-
import {cloneDeep, isEqual, isEmpty} from 'lodash';
|
|
2
|
+
import {cloneDeep, isEqual, isEmpty, merge} from 'lodash';
|
|
3
3
|
import jwtDecode from 'jwt-decode';
|
|
4
4
|
// @ts-ignore - Fix this
|
|
5
5
|
import {StatelessWebexPlugin} from '@webex/webex-core';
|
|
@@ -50,6 +50,11 @@ import {
|
|
|
50
50
|
type MeetingTranscriptPayload,
|
|
51
51
|
} from '@webex/internal-plugin-voicea';
|
|
52
52
|
|
|
53
|
+
import {
|
|
54
|
+
getBrowserMediaErrorCode,
|
|
55
|
+
isBrowserMediaError,
|
|
56
|
+
isBrowserMediaErrorName,
|
|
57
|
+
} from '@webex/internal-plugin-metrics/src/call-diagnostic/call-diagnostic-metrics.util';
|
|
53
58
|
import {processNewCaptions} from './voicea-meeting';
|
|
54
59
|
|
|
55
60
|
import {
|
|
@@ -58,6 +63,7 @@ import {
|
|
|
58
63
|
NoMediaEstablishedYetError,
|
|
59
64
|
UserNotJoinedError,
|
|
60
65
|
AddMediaFailed,
|
|
66
|
+
SdpResponseTimeoutError,
|
|
61
67
|
} from '../common/errors/webex-errors';
|
|
62
68
|
|
|
63
69
|
import LoggerProxy from '../common/logs/logger-proxy';
|
|
@@ -69,7 +75,7 @@ import Media, {type BundlePolicy} from '../media';
|
|
|
69
75
|
import MediaProperties from '../media/properties';
|
|
70
76
|
import MeetingStateMachine from './state';
|
|
71
77
|
import {createMuteState} from './muteState';
|
|
72
|
-
import LocusInfo from '../locus-info';
|
|
78
|
+
import LocusInfo, {LocusLLMEvent} from '../locus-info';
|
|
73
79
|
import Metrics from '../metrics';
|
|
74
80
|
import ReconnectionManager from '../reconnection-manager';
|
|
75
81
|
import ReconnectionNotStartedError from '../common/errors/reconnection-not-started';
|
|
@@ -125,6 +131,8 @@ import {
|
|
|
125
131
|
JOIN_BEFORE_HOST,
|
|
126
132
|
REGISTRATION_ID_STATUS,
|
|
127
133
|
STAGE_MANAGER_TYPE,
|
|
134
|
+
LOCUSEVENT,
|
|
135
|
+
LOCUS_LLM_EVENT,
|
|
128
136
|
} from '../constants';
|
|
129
137
|
import BEHAVIORAL_METRICS from '../metrics/constants';
|
|
130
138
|
import ParameterError from '../common/errors/parameter';
|
|
@@ -170,6 +178,8 @@ import JoinForbiddenError from '../common/errors/join-forbidden-error';
|
|
|
170
178
|
import {ReachabilityMetrics} from '../reachability/reachability.types';
|
|
171
179
|
import {SetStageOptions, SetStageVideoLayout, UnsetStageVideoLayout} from './request.type';
|
|
172
180
|
import {Invitee} from './type';
|
|
181
|
+
import {DataSet} from '../hashTree/hashTreeParser';
|
|
182
|
+
import {LocusDTO} from '../locus-info/types';
|
|
173
183
|
|
|
174
184
|
// default callback so we don't call an undefined function, but in practice it should never be used
|
|
175
185
|
const DEFAULT_ICE_PHASE_CALLBACK = () => 'JOIN_MEETING_FINAL';
|
|
@@ -4550,40 +4560,45 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
4550
4560
|
}
|
|
4551
4561
|
|
|
4552
4562
|
/**
|
|
4553
|
-
* Set the locus info the class instance
|
|
4554
|
-
*
|
|
4555
|
-
*
|
|
4556
|
-
* @param {
|
|
4557
|
-
* @param {
|
|
4558
|
-
* @param {String}
|
|
4559
|
-
* @param {
|
|
4563
|
+
* Set the locus info the class instance. Should be called with the parsed locus
|
|
4564
|
+
* we got in the join response.
|
|
4565
|
+
*
|
|
4566
|
+
* @param {Object} data
|
|
4567
|
+
* @param {Array} data.mediaConnections
|
|
4568
|
+
* @param {String} data.locusUrl
|
|
4569
|
+
* @param {String} data.locusId
|
|
4570
|
+
* @param {String} data.mediaId
|
|
4571
|
+
* @param {Object} data.host
|
|
4560
4572
|
* @todo change name to genertic parser
|
|
4561
4573
|
* @returns {undefined}
|
|
4562
4574
|
* @private
|
|
4563
4575
|
* @memberof Meeting
|
|
4564
4576
|
*/
|
|
4565
|
-
setLocus(
|
|
4566
|
-
locus:
|
|
4567
|
-
|
|
4568
|
-
|
|
4569
|
-
|
|
4570
|
-
|
|
4571
|
-
|
|
4572
|
-
|
|
4573
|
-
|
|
4574
|
-
|
|
4575
|
-
|
|
4576
|
-
const mtgLocus: any = locus.locus || locus;
|
|
4577
|
+
setLocus(data: {
|
|
4578
|
+
locus: LocusDTO;
|
|
4579
|
+
mediaConnections: Array<any>;
|
|
4580
|
+
locusUrl: string;
|
|
4581
|
+
locusId: string;
|
|
4582
|
+
mediaId: string;
|
|
4583
|
+
host: object;
|
|
4584
|
+
selfId: string;
|
|
4585
|
+
dataSets: DataSet[];
|
|
4586
|
+
}) {
|
|
4587
|
+
const mtgLocus: any = data.locus;
|
|
4577
4588
|
|
|
4578
4589
|
// LocusInfo object saves the locus object
|
|
4579
4590
|
// this.locus = mtgLocus;
|
|
4580
|
-
this.mediaConnections =
|
|
4581
|
-
this.locusUrl =
|
|
4582
|
-
this.locusId =
|
|
4583
|
-
this.selfId =
|
|
4584
|
-
this.mediaId =
|
|
4591
|
+
this.mediaConnections = data.mediaConnections;
|
|
4592
|
+
this.locusUrl = data.locusUrl;
|
|
4593
|
+
this.locusId = data.locusId;
|
|
4594
|
+
this.selfId = data.selfId;
|
|
4595
|
+
this.mediaId = data.mediaId;
|
|
4585
4596
|
this.hostId = mtgLocus.host ? mtgLocus.host.id : this.hostId;
|
|
4586
|
-
this.locusInfo.initialSetup(
|
|
4597
|
+
this.locusInfo.initialSetup({
|
|
4598
|
+
trigger: 'join-response',
|
|
4599
|
+
locus: mtgLocus,
|
|
4600
|
+
dataSets: data.dataSets,
|
|
4601
|
+
});
|
|
4587
4602
|
}
|
|
4588
4603
|
|
|
4589
4604
|
/**
|
|
@@ -5430,6 +5445,20 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
5430
5445
|
shouldRetry = false;
|
|
5431
5446
|
}
|
|
5432
5447
|
|
|
5448
|
+
if (CallDiagnosticUtils.isBrowserMediaError(error)) {
|
|
5449
|
+
shouldRetry = false;
|
|
5450
|
+
// eslint-disable-next-line no-ex-assign
|
|
5451
|
+
error = merge({
|
|
5452
|
+
error: {
|
|
5453
|
+
body: {
|
|
5454
|
+
errorCode: CallDiagnosticUtils.getBrowserMediaErrorCode(error),
|
|
5455
|
+
message: error?.message,
|
|
5456
|
+
name: error?.name,
|
|
5457
|
+
},
|
|
5458
|
+
},
|
|
5459
|
+
});
|
|
5460
|
+
}
|
|
5461
|
+
|
|
5433
5462
|
// we only want to call leave if join was successful and this was a retry or we won't be doing any more retries
|
|
5434
5463
|
if (joined && (isRetry || !shouldRetry)) {
|
|
5435
5464
|
try {
|
|
@@ -5696,6 +5725,21 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
5696
5725
|
}
|
|
5697
5726
|
}
|
|
5698
5727
|
|
|
5728
|
+
/** Handles Locus LLM events
|
|
5729
|
+
*
|
|
5730
|
+
* @param {LocusLLMEvent} event - The Locus LLM event to process
|
|
5731
|
+
* @returns {void}
|
|
5732
|
+
*/
|
|
5733
|
+
private processLocusLLMEvent = (event: LocusLLMEvent): void => {
|
|
5734
|
+
if (event.data.eventType === LOCUSEVENT.HASH_TREE_DATA_UPDATED) {
|
|
5735
|
+
this.locusInfo.parse(this, event.data);
|
|
5736
|
+
} else {
|
|
5737
|
+
LoggerProxy.logger.warn(
|
|
5738
|
+
`Meeting:index#processLocusLLMEvent --> Unknown event type: ${event.data.eventType}`
|
|
5739
|
+
);
|
|
5740
|
+
}
|
|
5741
|
+
};
|
|
5742
|
+
|
|
5699
5743
|
/**
|
|
5700
5744
|
* Callback called when a relay event is received from meeting LLM Connection
|
|
5701
5745
|
* @param {RelayEvent} e Event object coming from LLM Connection
|
|
@@ -6107,6 +6151,8 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
6107
6151
|
);
|
|
6108
6152
|
// @ts-ignore - Fix type
|
|
6109
6153
|
this.webex.internal.llm.off('event:relay.event', this.processRelayEvent);
|
|
6154
|
+
// @ts-ignore - Fix type
|
|
6155
|
+
this.webex.internal.llm.off(LOCUS_LLM_EVENT, this.processLocusLLMEvent);
|
|
6110
6156
|
}
|
|
6111
6157
|
|
|
6112
6158
|
if (!isJoined) {
|
|
@@ -6121,6 +6167,10 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
6121
6167
|
this.webex.internal.llm.off('event:relay.event', this.processRelayEvent);
|
|
6122
6168
|
// @ts-ignore - Fix type
|
|
6123
6169
|
this.webex.internal.llm.on('event:relay.event', this.processRelayEvent);
|
|
6170
|
+
// @ts-ignore - Fix type
|
|
6171
|
+
this.webex.internal.llm.off(LOCUS_LLM_EVENT, this.processLocusLLMEvent);
|
|
6172
|
+
// @ts-ignore - Fix type
|
|
6173
|
+
this.webex.internal.llm.on(LOCUS_LLM_EVENT, this.processLocusLLMEvent);
|
|
6124
6174
|
LoggerProxy.logger.info(
|
|
6125
6175
|
'Meeting:index#updateLLMConnection --> enabled to receive relay events!'
|
|
6126
6176
|
);
|
|
@@ -7452,7 +7502,7 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
7452
7502
|
} seconds`
|
|
7453
7503
|
);
|
|
7454
7504
|
|
|
7455
|
-
const error = new
|
|
7505
|
+
const error = new SdpResponseTimeoutError();
|
|
7456
7506
|
|
|
7457
7507
|
// @ts-ignore
|
|
7458
7508
|
this.webex.internal.newMetrics.submitClientEvent({
|
|
@@ -9372,6 +9422,8 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
9372
9422
|
|
|
9373
9423
|
// @ts-ignore - fix types
|
|
9374
9424
|
this.webex.internal.llm.off('event:relay.event', this.processRelayEvent);
|
|
9425
|
+
// @ts-ignore - Fix type
|
|
9426
|
+
this.webex.internal.llm.off(LOCUS_LLM_EVENT, this.processLocusLLMEvent);
|
|
9375
9427
|
};
|
|
9376
9428
|
|
|
9377
9429
|
/**
|
package/src/meeting/util.ts
CHANGED
|
@@ -31,6 +31,7 @@ const MeetingUtil = {
|
|
|
31
31
|
|
|
32
32
|
// First todo: add check for existance
|
|
33
33
|
parsed.locus = response.body.locus;
|
|
34
|
+
parsed.dataSets = response.body.dataSets;
|
|
34
35
|
parsed.mediaConnections = response.body.mediaConnections;
|
|
35
36
|
parsed.locusUrl = parsed.locus.url;
|
|
36
37
|
parsed.locusId = parsed.locus.url.split('/').pop();
|
package/src/meetings/index.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/* eslint no-shadow: ["error", { "allow": ["eventType"] }] */
|
|
2
|
-
import {cloneDeep, clone} from 'lodash';
|
|
2
|
+
import {cloneDeep, clone, set} from 'lodash';
|
|
3
3
|
import '@webex/internal-plugin-mercury';
|
|
4
4
|
import '@webex/internal-plugin-conversation';
|
|
5
5
|
import '@webex/internal-plugin-metrics';
|
|
@@ -66,6 +66,7 @@ import JoinWebinarError from '../common/errors/join-webinar-error';
|
|
|
66
66
|
import {SpaceIDDeprecatedError} from '../common/errors/webex-errors';
|
|
67
67
|
import NoMeetingInfoError from '../common/errors/no-meeting-info';
|
|
68
68
|
import JoinForbiddenError from '../common/errors/join-forbidden-error';
|
|
69
|
+
import {HashTreeMessage} from '../hashTree/hashTreeParser';
|
|
69
70
|
|
|
70
71
|
let mediaLogger;
|
|
71
72
|
|
|
@@ -94,6 +95,18 @@ class MediaLogger {
|
|
|
94
95
|
LoggerProxy.logger.debug(...args);
|
|
95
96
|
}
|
|
96
97
|
}
|
|
98
|
+
|
|
99
|
+
export type LocusEvent = {
|
|
100
|
+
eventType: LOCUSEVENT;
|
|
101
|
+
|
|
102
|
+
// fields populated for "classic" locus events (eventType = 'locus.difference' and others, see LOCUSEVENT)
|
|
103
|
+
locusUrl?: string;
|
|
104
|
+
locus?: any;
|
|
105
|
+
|
|
106
|
+
// fields populated for "hash tree" locus events (eventType = 'locus.state_message' - see LOCUSEVENT.HASH_TREE_DATA_UPDATED)
|
|
107
|
+
stateElementsMessage?: HashTreeMessage;
|
|
108
|
+
};
|
|
109
|
+
|
|
97
110
|
/**
|
|
98
111
|
* Meetings Ready Event
|
|
99
112
|
* Emitted when the meetings instance on webex is ready
|
|
@@ -406,7 +419,17 @@ export default class Meetings extends WebexPlugin {
|
|
|
406
419
|
* @private
|
|
407
420
|
* @memberof Meetings
|
|
408
421
|
*/
|
|
409
|
-
getCorrespondingMeetingByLocus(data) {
|
|
422
|
+
getCorrespondingMeetingByLocus(data: LocusEvent) {
|
|
423
|
+
if (
|
|
424
|
+
data.eventType === LOCUSEVENT.HASH_TREE_DATA_UPDATED &&
|
|
425
|
+
data.stateElementsMessage?.locusUrl
|
|
426
|
+
) {
|
|
427
|
+
return this.meetingCollection.getByKey(
|
|
428
|
+
MEETING_KEY.LOCUS_URL,
|
|
429
|
+
data.stateElementsMessage.locusUrl
|
|
430
|
+
);
|
|
431
|
+
}
|
|
432
|
+
|
|
410
433
|
// getting meeting by correlationId. This will happen for the new event
|
|
411
434
|
// Either the locus
|
|
412
435
|
// TODO : Add check for the callBack Address
|
|
@@ -420,15 +443,13 @@ export default class Meetings extends WebexPlugin {
|
|
|
420
443
|
) ||
|
|
421
444
|
this.meetingCollection.getByKey(
|
|
422
445
|
MEETING_KEY.SIP_URI,
|
|
423
|
-
data.locus
|
|
424
|
-
data.locus.self.callbackInfo &&
|
|
425
|
-
data.locus.self.callbackInfo.callbackAddress
|
|
446
|
+
data.locus?.self?.callbackInfo?.callbackAddress
|
|
426
447
|
) ||
|
|
427
|
-
(data.locus
|
|
448
|
+
(data.locus?.info?.isUnifiedSpaceMeeting
|
|
428
449
|
? undefined
|
|
429
450
|
: this.meetingCollection.getByKey(
|
|
430
451
|
MEETING_KEY.CONVERSATION_URL,
|
|
431
|
-
data.locus
|
|
452
|
+
data.locus?.conversationUrl
|
|
432
453
|
)) ||
|
|
433
454
|
this.meetingCollection.getByKey(MEETING_KEY.MEETINGNUMBER, data.locus?.info?.webExMeetingId)
|
|
434
455
|
);
|
|
@@ -445,30 +466,33 @@ export default class Meetings extends WebexPlugin {
|
|
|
445
466
|
* @private
|
|
446
467
|
* @memberof Meetings
|
|
447
468
|
*/
|
|
448
|
-
private handleLocusEvent(data:
|
|
469
|
+
private handleLocusEvent(data: LocusEvent, useRandomDelayForInfo = false) {
|
|
449
470
|
let meeting = this.getCorrespondingMeetingByLocus(data);
|
|
450
471
|
|
|
451
472
|
// Special case when locus has got replaced, This only happend once if a replace locus exists
|
|
452
473
|
// https://sqbu-github.cisco.com/WebExSquared/locus/wiki/Locus-changing-mid-call
|
|
453
474
|
|
|
454
|
-
if (
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
475
|
+
if (data.eventType !== LOCUSEVENT.HASH_TREE_DATA_UPDATED) {
|
|
476
|
+
if (!meeting && data.locus?.replaces?.length > 0) {
|
|
477
|
+
// Always the last element in the replace is the active one
|
|
478
|
+
meeting = this.meetingCollection.getByKey(
|
|
479
|
+
MEETING_KEY.LOCUS_URL,
|
|
480
|
+
data.locus.replaces[data.locus.replaces.length - 1].locusUrl
|
|
481
|
+
);
|
|
482
|
+
}
|
|
461
483
|
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
484
|
+
if (meeting && !MeetingsUtil.isBreakoutLocusDTO(data.locus)) {
|
|
485
|
+
meeting.locusInfo.updateMainSessionLocusCache(data.locus);
|
|
486
|
+
}
|
|
487
|
+
if (!this.isNeedHandleLocusDTO(meeting, data.locus)) {
|
|
488
|
+
LoggerProxy.logger.log(
|
|
489
|
+
`Meetings:index#handleLocusEvent --> doesn't need to process locus event`
|
|
490
|
+
);
|
|
469
491
|
|
|
470
|
-
|
|
492
|
+
return;
|
|
493
|
+
}
|
|
471
494
|
}
|
|
495
|
+
|
|
472
496
|
if (!meeting) {
|
|
473
497
|
// TODO: create meeting when we get a meeting object
|
|
474
498
|
// const checkForEnded = (locus) => {
|
|
@@ -489,42 +513,65 @@ export default class Meetings extends WebexPlugin {
|
|
|
489
513
|
// };
|
|
490
514
|
// rather then locus object change to locus url
|
|
491
515
|
|
|
492
|
-
if (
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
516
|
+
if (data.eventType !== LOCUSEVENT.HASH_TREE_DATA_UPDATED) {
|
|
517
|
+
if (
|
|
518
|
+
data.locus &&
|
|
519
|
+
data.locus.fullState &&
|
|
520
|
+
data.locus.fullState.state === LOCUS.STATE.INACTIVE
|
|
521
|
+
) {
|
|
522
|
+
// just ignore the event as its already ended and not active
|
|
523
|
+
LoggerProxy.logger.warn(
|
|
524
|
+
'Meetings:index#handleLocusEvent --> Locus event received for meeting, after it was ended.'
|
|
525
|
+
);
|
|
501
526
|
|
|
502
|
-
|
|
503
|
-
|
|
527
|
+
return;
|
|
528
|
+
}
|
|
504
529
|
|
|
505
|
-
|
|
506
|
-
|
|
530
|
+
// When its wireless share or guest and user leaves the meeting we dont have to keep the meeting object
|
|
531
|
+
// Any future events will be neglected
|
|
532
|
+
|
|
533
|
+
if (
|
|
534
|
+
data.locus &&
|
|
535
|
+
data.locus.self &&
|
|
536
|
+
data.locus.self.state === _LEFT_ &&
|
|
537
|
+
data.locus.self.removed === true
|
|
538
|
+
) {
|
|
539
|
+
// just ignore the event as its already ended and not active
|
|
540
|
+
LoggerProxy.logger.warn(
|
|
541
|
+
'Meetings:index#handleLocusEvent --> Locus event received for meeting, after it was ended.'
|
|
542
|
+
);
|
|
507
543
|
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
data.locus.self.state === _LEFT_ &&
|
|
512
|
-
data.locus.self.removed === true
|
|
513
|
-
) {
|
|
514
|
-
// just ignore the event as its already ended and not active
|
|
515
|
-
LoggerProxy.logger.warn(
|
|
516
|
-
'Meetings:index#handleLocusEvent --> Locus event received for meeting, after it was ended.'
|
|
517
|
-
);
|
|
544
|
+
return;
|
|
545
|
+
}
|
|
546
|
+
}
|
|
518
547
|
|
|
519
|
-
|
|
548
|
+
if (data.eventType === LOCUSEVENT.HASH_TREE_DATA_UPDATED) {
|
|
549
|
+
// in hash tree messages we don't ge the locus object, but the meeting constructor needs at least locus.url
|
|
550
|
+
set(data, 'locus.url', data.stateElementsMessage.locusUrl);
|
|
520
551
|
}
|
|
521
552
|
|
|
522
553
|
this.create(data.locus, DESTINATION_TYPE.LOCUS_ID, useRandomDelayForInfo)
|
|
523
|
-
.then((newMeeting) => {
|
|
554
|
+
.then(async (newMeeting) => {
|
|
524
555
|
meeting = newMeeting;
|
|
525
556
|
|
|
526
|
-
|
|
527
|
-
|
|
557
|
+
try {
|
|
558
|
+
// It's a new meeting so initialize the locus data
|
|
559
|
+
await meeting.locusInfo.initialSetup({
|
|
560
|
+
trigger:
|
|
561
|
+
data.eventType === LOCUSEVENT.SDK_LOCUS_FROM_SYNC_MEETINGS
|
|
562
|
+
? 'get-loci-response'
|
|
563
|
+
: 'locus-message',
|
|
564
|
+
locus: data.locus,
|
|
565
|
+
hashTreeMessage: data.stateElementsMessage,
|
|
566
|
+
});
|
|
567
|
+
} catch (error) {
|
|
568
|
+
LoggerProxy.logger.warn(
|
|
569
|
+
`Meetings:index#handleLocusEvent --> Error initializing locus data: ${error.message}`
|
|
570
|
+
);
|
|
571
|
+
// @ts-ignore
|
|
572
|
+
this.destroy(meeting, MEETING_REMOVED_REASON.LOCUS_DTO_SYNC_FAILED);
|
|
573
|
+
}
|
|
574
|
+
|
|
528
575
|
this.checkHandleBreakoutLocus(data.locus);
|
|
529
576
|
})
|
|
530
577
|
.catch((e) => {
|
|
@@ -1739,6 +1786,7 @@ export default class Meetings extends WebexPlugin {
|
|
|
1739
1786
|
lociToUpdate.forEach((locus) => {
|
|
1740
1787
|
activeLocusUrl.push(locus.url);
|
|
1741
1788
|
this.handleLocusEvent({
|
|
1789
|
+
eventType: LOCUSEVENT.SDK_LOCUS_FROM_SYNC_MEETINGS,
|
|
1742
1790
|
locus,
|
|
1743
1791
|
locusUrl: locus.url,
|
|
1744
1792
|
});
|
|
@@ -1786,6 +1834,7 @@ export default class Meetings extends WebexPlugin {
|
|
|
1786
1834
|
(mainLocus) => mainLocus.controls?.breakout?.url === breakoutLocus.controls?.breakout?.url
|
|
1787
1835
|
);
|
|
1788
1836
|
const existCorrespondingMeeting = this.getCorrespondingMeetingByLocus({
|
|
1837
|
+
eventType: LOCUSEVENT.SDK_NO_EVENT,
|
|
1789
1838
|
locus: breakoutLocus,
|
|
1790
1839
|
locusUrl: breakoutLocus.url,
|
|
1791
1840
|
});
|
|
@@ -1831,7 +1880,11 @@ export default class Meetings extends WebexPlugin {
|
|
|
1831
1880
|
}
|
|
1832
1881
|
|
|
1833
1882
|
const associateBreakoutLocus = this.breakoutLocusForHandleLater[existIndex];
|
|
1834
|
-
this.handleLocusEvent({
|
|
1883
|
+
this.handleLocusEvent({
|
|
1884
|
+
eventType: LOCUSEVENT.SDK_NO_EVENT,
|
|
1885
|
+
locus: associateBreakoutLocus,
|
|
1886
|
+
locusUrl: associateBreakoutLocus.url,
|
|
1887
|
+
});
|
|
1835
1888
|
this.breakoutLocusForHandleLater.splice(existIndex, 1);
|
|
1836
1889
|
}
|
|
1837
1890
|
|
package/src/metrics/constants.ts
CHANGED
|
@@ -87,6 +87,8 @@ const BEHAVIORAL_METRICS = {
|
|
|
87
87
|
VERIFY_REGISTRATION_ID_ERROR: 'js_sdk_verify_registrationId_error',
|
|
88
88
|
JOIN_FORBIDDEN_ERROR: 'js_sdk_join_forbidden_error',
|
|
89
89
|
MEDIA_ISSUE_DETECTED: 'js_sdk_media_issue_detected',
|
|
90
|
+
LOCUS_CLASSIC_VS_HASH_TREE_MISMATCH: 'js_sdk_locus_classic_vs_hash_tree_mismatch',
|
|
91
|
+
LOCUS_HASH_TREE_UNSUPPORTED_OPERATION: 'js_sdk_locus_hash_tree_unsupported_operation',
|
|
90
92
|
};
|
|
91
93
|
|
|
92
94
|
export {BEHAVIORAL_METRICS as default};
|