@webex/plugin-meetings 3.10.0-next.9 → 3.10.0-webex-services-ready.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.
Files changed (73) hide show
  1. package/dist/breakouts/breakout.js +1 -1
  2. package/dist/breakouts/index.js +1 -1
  3. package/dist/constants.js +11 -3
  4. package/dist/constants.js.map +1 -1
  5. package/dist/hashTree/constants.js +20 -0
  6. package/dist/hashTree/constants.js.map +1 -0
  7. package/dist/hashTree/hashTree.js +515 -0
  8. package/dist/hashTree/hashTree.js.map +1 -0
  9. package/dist/hashTree/hashTreeParser.js +1266 -0
  10. package/dist/hashTree/hashTreeParser.js.map +1 -0
  11. package/dist/hashTree/types.js +21 -0
  12. package/dist/hashTree/types.js.map +1 -0
  13. package/dist/hashTree/utils.js +48 -0
  14. package/dist/hashTree/utils.js.map +1 -0
  15. package/dist/interpretation/index.js +1 -1
  16. package/dist/interpretation/siLanguage.js +1 -1
  17. package/dist/locus-info/index.js +511 -48
  18. package/dist/locus-info/index.js.map +1 -1
  19. package/dist/locus-info/types.js +7 -0
  20. package/dist/locus-info/types.js.map +1 -0
  21. package/dist/meeting/index.js +41 -15
  22. package/dist/meeting/index.js.map +1 -1
  23. package/dist/meeting/util.js +1 -0
  24. package/dist/meeting/util.js.map +1 -1
  25. package/dist/meetings/index.js +112 -70
  26. package/dist/meetings/index.js.map +1 -1
  27. package/dist/metrics/constants.js +3 -1
  28. package/dist/metrics/constants.js.map +1 -1
  29. package/dist/reachability/clusterReachability.js +44 -358
  30. package/dist/reachability/clusterReachability.js.map +1 -1
  31. package/dist/reachability/reachability.types.js +14 -1
  32. package/dist/reachability/reachability.types.js.map +1 -1
  33. package/dist/reachability/reachabilityPeerConnection.js +445 -0
  34. package/dist/reachability/reachabilityPeerConnection.js.map +1 -0
  35. package/dist/types/constants.d.ts +26 -21
  36. package/dist/types/hashTree/constants.d.ts +8 -0
  37. package/dist/types/hashTree/hashTree.d.ts +129 -0
  38. package/dist/types/hashTree/hashTreeParser.d.ts +260 -0
  39. package/dist/types/hashTree/types.d.ts +25 -0
  40. package/dist/types/hashTree/utils.d.ts +9 -0
  41. package/dist/types/locus-info/index.d.ts +91 -42
  42. package/dist/types/locus-info/types.d.ts +46 -0
  43. package/dist/types/meeting/index.d.ts +22 -9
  44. package/dist/types/meetings/index.d.ts +9 -2
  45. package/dist/types/metrics/constants.d.ts +2 -0
  46. package/dist/types/reachability/clusterReachability.d.ts +10 -88
  47. package/dist/types/reachability/reachability.types.d.ts +12 -1
  48. package/dist/types/reachability/reachabilityPeerConnection.d.ts +111 -0
  49. package/dist/webinar/index.js +1 -1
  50. package/package.json +22 -21
  51. package/src/constants.ts +13 -1
  52. package/src/hashTree/constants.ts +9 -0
  53. package/src/hashTree/hashTree.ts +463 -0
  54. package/src/hashTree/hashTreeParser.ts +1161 -0
  55. package/src/hashTree/types.ts +30 -0
  56. package/src/hashTree/utils.ts +42 -0
  57. package/src/locus-info/index.ts +556 -85
  58. package/src/locus-info/types.ts +48 -0
  59. package/src/meeting/index.ts +58 -26
  60. package/src/meeting/util.ts +1 -0
  61. package/src/meetings/index.ts +104 -51
  62. package/src/metrics/constants.ts +2 -0
  63. package/src/reachability/clusterReachability.ts +50 -347
  64. package/src/reachability/reachability.types.ts +15 -1
  65. package/src/reachability/reachabilityPeerConnection.ts +416 -0
  66. package/test/unit/spec/hashTree/hashTree.ts +655 -0
  67. package/test/unit/spec/hashTree/hashTreeParser.ts +1532 -0
  68. package/test/unit/spec/hashTree/utils.ts +103 -0
  69. package/test/unit/spec/locus-info/index.js +667 -1
  70. package/test/unit/spec/meeting/index.js +91 -20
  71. package/test/unit/spec/meeting/utils.js +77 -0
  72. package/test/unit/spec/meetings/index.js +71 -26
  73. package/test/unit/spec/reachability/clusterReachability.ts +281 -138
@@ -0,0 +1,48 @@
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 LocusDTO = {
16
+ controls?: any;
17
+ fullState?: LocusFullState;
18
+ host?: {
19
+ id: string;
20
+ incomingCallProtocols: any[];
21
+ isExternal: boolean;
22
+ name: string;
23
+ orgId: string;
24
+ };
25
+ htMeta?: HtMeta;
26
+ info?: any;
27
+ jsSdkMeta?: {
28
+ removedParticipantIds: string[]; // list of ids of participants that are removed in the last update
29
+ };
30
+ links?: any;
31
+ mediaShares?: any[];
32
+ meetings?: any[];
33
+ participants: any[];
34
+ replaces?: any[];
35
+ self?: any;
36
+ sequence?: {
37
+ dirtyParticipants: number;
38
+ entries: number[];
39
+ rangeEnd: number;
40
+ rangeStart: number;
41
+ sequenceHash: number;
42
+ sessionToken: string;
43
+ since: string;
44
+ totalParticipants: number;
45
+ };
46
+ syncUrl?: string;
47
+ url?: string;
48
+ };
@@ -70,7 +70,7 @@ import Media, {type BundlePolicy} from '../media';
70
70
  import MediaProperties from '../media/properties';
71
71
  import MeetingStateMachine from './state';
72
72
  import {createMuteState} from './muteState';
73
- import LocusInfo from '../locus-info';
73
+ import LocusInfo, {LocusLLMEvent} from '../locus-info';
74
74
  import Metrics from '../metrics';
75
75
  import ReconnectionManager from '../reconnection-manager';
76
76
  import ReconnectionNotStartedError from '../common/errors/reconnection-not-started';
@@ -126,6 +126,8 @@ import {
126
126
  JOIN_BEFORE_HOST,
127
127
  REGISTRATION_ID_STATUS,
128
128
  STAGE_MANAGER_TYPE,
129
+ LOCUSEVENT,
130
+ LOCUS_LLM_EVENT,
129
131
  } from '../constants';
130
132
  import BEHAVIORAL_METRICS from '../metrics/constants';
131
133
  import ParameterError from '../common/errors/parameter';
@@ -171,6 +173,8 @@ import JoinForbiddenError from '../common/errors/join-forbidden-error';
171
173
  import {ReachabilityMetrics} from '../reachability/reachability.types';
172
174
  import {SetStageOptions, SetStageVideoLayout, UnsetStageVideoLayout} from './request.type';
173
175
  import {Invitee} from './type';
176
+ import {DataSet} from '../hashTree/hashTreeParser';
177
+ import {LocusDTO} from '../locus-info/types';
174
178
 
175
179
  // default callback so we don't call an undefined function, but in practice it should never be used
176
180
  const DEFAULT_ICE_PHASE_CALLBACK = () => 'JOIN_MEETING_FINAL';
@@ -4551,40 +4555,45 @@ export default class Meeting extends StatelessWebexPlugin {
4551
4555
  }
4552
4556
 
4553
4557
  /**
4554
- * Set the locus info the class instance
4555
- * @param {Object} locus
4556
- * @param {Array} locus.mediaConnections
4557
- * @param {String} locus.locusUrl
4558
- * @param {String} locus.locusId
4559
- * @param {String} locus.mediaId
4560
- * @param {Object} locus.host
4558
+ * Set the locus info the class instance. Should be called with the parsed locus
4559
+ * we got in the join response.
4560
+ *
4561
+ * @param {Object} data
4562
+ * @param {Array} data.mediaConnections
4563
+ * @param {String} data.locusUrl
4564
+ * @param {String} data.locusId
4565
+ * @param {String} data.mediaId
4566
+ * @param {Object} data.host
4561
4567
  * @todo change name to genertic parser
4562
4568
  * @returns {undefined}
4563
4569
  * @private
4564
4570
  * @memberof Meeting
4565
4571
  */
4566
- setLocus(
4567
- locus:
4568
- | {
4569
- mediaConnections: Array<any>;
4570
- locusUrl: string;
4571
- locusId: string;
4572
- mediaId: string;
4573
- host: object;
4574
- }
4575
- | any
4576
- ) {
4577
- const mtgLocus: any = locus.locus || locus;
4572
+ setLocus(data: {
4573
+ locus: LocusDTO;
4574
+ mediaConnections: Array<any>;
4575
+ locusUrl: string;
4576
+ locusId: string;
4577
+ mediaId: string;
4578
+ host: object;
4579
+ selfId: string;
4580
+ dataSets: DataSet[];
4581
+ }) {
4582
+ const mtgLocus: any = data.locus;
4578
4583
 
4579
4584
  // LocusInfo object saves the locus object
4580
4585
  // this.locus = mtgLocus;
4581
- this.mediaConnections = locus.mediaConnections;
4582
- this.locusUrl = locus.locusUrl || locus.url;
4583
- this.locusId = locus.locusId;
4584
- this.selfId = locus.selfId;
4585
- this.mediaId = locus.mediaId;
4586
+ this.mediaConnections = data.mediaConnections;
4587
+ this.locusUrl = data.locusUrl;
4588
+ this.locusId = data.locusId;
4589
+ this.selfId = data.selfId;
4590
+ this.mediaId = data.mediaId;
4586
4591
  this.hostId = mtgLocus.host ? mtgLocus.host.id : this.hostId;
4587
- this.locusInfo.initialSetup(mtgLocus);
4592
+ this.locusInfo.initialSetup({
4593
+ trigger: 'join-response',
4594
+ locus: mtgLocus,
4595
+ dataSets: data.dataSets,
4596
+ });
4588
4597
  }
4589
4598
 
4590
4599
  /**
@@ -5697,6 +5706,21 @@ export default class Meeting extends StatelessWebexPlugin {
5697
5706
  }
5698
5707
  }
5699
5708
 
5709
+ /** Handles Locus LLM events
5710
+ *
5711
+ * @param {LocusLLMEvent} event - The Locus LLM event to process
5712
+ * @returns {void}
5713
+ */
5714
+ private processLocusLLMEvent = (event: LocusLLMEvent): void => {
5715
+ if (event.data.eventType === LOCUSEVENT.HASH_TREE_DATA_UPDATED) {
5716
+ this.locusInfo.parse(this, event.data);
5717
+ } else {
5718
+ LoggerProxy.logger.warn(
5719
+ `Meeting:index#processLocusLLMEvent --> Unknown event type: ${event.data.eventType}`
5720
+ );
5721
+ }
5722
+ };
5723
+
5700
5724
  /**
5701
5725
  * Callback called when a relay event is received from meeting LLM Connection
5702
5726
  * @param {RelayEvent} e Event object coming from LLM Connection
@@ -6108,6 +6132,8 @@ export default class Meeting extends StatelessWebexPlugin {
6108
6132
  );
6109
6133
  // @ts-ignore - Fix type
6110
6134
  this.webex.internal.llm.off('event:relay.event', this.processRelayEvent);
6135
+ // @ts-ignore - Fix type
6136
+ this.webex.internal.llm.off(LOCUS_LLM_EVENT, this.processLocusLLMEvent);
6111
6137
  }
6112
6138
 
6113
6139
  if (!isJoined) {
@@ -6122,6 +6148,10 @@ export default class Meeting extends StatelessWebexPlugin {
6122
6148
  this.webex.internal.llm.off('event:relay.event', this.processRelayEvent);
6123
6149
  // @ts-ignore - Fix type
6124
6150
  this.webex.internal.llm.on('event:relay.event', this.processRelayEvent);
6151
+ // @ts-ignore - Fix type
6152
+ this.webex.internal.llm.off(LOCUS_LLM_EVENT, this.processLocusLLMEvent);
6153
+ // @ts-ignore - Fix type
6154
+ this.webex.internal.llm.on(LOCUS_LLM_EVENT, this.processLocusLLMEvent);
6125
6155
  LoggerProxy.logger.info(
6126
6156
  'Meeting:index#updateLLMConnection --> enabled to receive relay events!'
6127
6157
  );
@@ -9373,6 +9403,8 @@ export default class Meeting extends StatelessWebexPlugin {
9373
9403
 
9374
9404
  // @ts-ignore - fix types
9375
9405
  this.webex.internal.llm.off('event:relay.event', this.processRelayEvent);
9406
+ // @ts-ignore - Fix type
9407
+ this.webex.internal.llm.off(LOCUS_LLM_EVENT, this.processLocusLLMEvent);
9376
9408
  };
9377
9409
 
9378
9410
  /**
@@ -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();
@@ -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.self &&
424
- data.locus.self.callbackInfo &&
425
- data.locus.self.callbackInfo.callbackAddress
446
+ data.locus?.self?.callbackInfo?.callbackAddress
426
447
  ) ||
427
- (data.locus.info?.isUnifiedSpaceMeeting
448
+ (data.locus?.info?.isUnifiedSpaceMeeting
428
449
  ? undefined
429
450
  : this.meetingCollection.getByKey(
430
451
  MEETING_KEY.CONVERSATION_URL,
431
- data.locus.conversationUrl
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: {locusUrl: string; locus: any}, useRandomDelayForInfo = false) {
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 (!meeting && data.locus?.replaces?.length > 0) {
455
- // Always the last element in the replace is the active one
456
- meeting = this.meetingCollection.getByKey(
457
- MEETING_KEY.LOCUS_URL,
458
- data.locus.replaces[data.locus.replaces.length - 1].locusUrl
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
- if (meeting && !MeetingsUtil.isBreakoutLocusDTO(data.locus)) {
463
- meeting.locusInfo.updateMainSessionLocusCache(data.locus);
464
- }
465
- if (!this.isNeedHandleLocusDTO(meeting, data.locus)) {
466
- LoggerProxy.logger.log(
467
- `Meetings:index#handleLocusEvent --> doesn't need to process locus event`
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
- return;
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
- data.locus &&
494
- data.locus.fullState &&
495
- data.locus.fullState.state === LOCUS.STATE.INACTIVE
496
- ) {
497
- // just ignore the event as its already ended and not active
498
- LoggerProxy.logger.warn(
499
- 'Meetings:index#handleLocusEvent --> Locus event received for meeting, after it was ended.'
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
- return;
503
- }
527
+ return;
528
+ }
504
529
 
505
- // When its wireless share or guest and user leaves the meeting we dont have to keep the meeting object
506
- // Any future events will be neglected
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
- if (
509
- data.locus &&
510
- data.locus.self &&
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
- return;
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
- // It's a new meeting so initialize the locus data
527
- meeting.locusInfo.initialSetup(data.locus);
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({locus: associateBreakoutLocus, locusUrl: associateBreakoutLocus.url});
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
 
@@ -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};