@webex/plugin-meetings 3.12.0-next.46 → 3.12.0-next.47

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.
@@ -191,7 +191,7 @@ var AIEnableRequest = _webexCore.WebexPlugin.extend({
191
191
  method: _constants.HTTP_VERBS.PUT
192
192
  });
193
193
  },
194
- version: "3.12.0-next.46"
194
+ version: "3.12.0-next.47"
195
195
  });
196
196
  var _default = exports.default = AIEnableRequest;
197
197
  //# sourceMappingURL=index.js.map
@@ -213,7 +213,7 @@ var Breakout = _webexCore.WebexPlugin.extend({
213
213
  sessionId: this.sessionId
214
214
  });
215
215
  },
216
- version: "3.12.0-next.46"
216
+ version: "3.12.0-next.47"
217
217
  });
218
218
  var _default = exports.default = Breakout;
219
219
  //# sourceMappingURL=breakout.js.map
@@ -1109,7 +1109,7 @@ var Breakouts = _webexCore.WebexPlugin.extend({
1109
1109
  this.trigger(_constants.BREAKOUTS.EVENTS.ASK_RETURN_TO_MAIN);
1110
1110
  }
1111
1111
  },
1112
- version: "3.12.0-next.46"
1112
+ version: "3.12.0-next.47"
1113
1113
  });
1114
1114
  var _default = exports.default = Breakouts;
1115
1115
  //# sourceMappingURL=index.js.map
@@ -37,8 +37,10 @@ var _wrapNativeSuper2 = _interopRequireDefault(require("@babel/runtime-corejs2/h
37
37
  var _lodash = require("lodash");
38
38
  var _hashTree = _interopRequireDefault(require("./hashTree"));
39
39
  var _loggerProxy = _interopRequireDefault(require("../common/logs/logger-proxy"));
40
- var _constants = require("../constants");
41
- var _constants2 = require("./constants");
40
+ var _metrics = _interopRequireDefault(require("../metrics"));
41
+ var _constants = _interopRequireDefault(require("../metrics/constants"));
42
+ var _constants2 = require("../constants");
43
+ var _constants3 = require("./constants");
42
44
  var _types = require("./types");
43
45
  var _utils = require("./utils");
44
46
  function ownKeys(e, r) { var t = _Object$keys4(e); if (_Object$getOwnPropertySymbols) { var o = _Object$getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return _Object$getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
@@ -67,8 +69,8 @@ var MeetingEndedError = exports.MeetingEndedError = /*#__PURE__*/function (_Erro
67
69
  /* Currently Locus always sends Metadata objects only in the "self" dataset.
68
70
  * If this ever changes, update all the code that relies on this constant.
69
71
  */
70
- var MetadataDataSetName = _constants2.DataSetNames.SELF;
71
- var PossibleSentinelMessageDataSetNames = [_constants2.DataSetNames.MAIN, _constants2.DataSetNames.SELF, _constants2.DataSetNames.UNJOINED];
72
+ var MetadataDataSetName = _constants3.DataSetNames.SELF;
73
+ var PossibleSentinelMessageDataSetNames = [_constants3.DataSetNames.MAIN, _constants3.DataSetNames.SELF, _constants3.DataSetNames.UNJOINED];
72
74
 
73
75
  /**
74
76
  * Parses hash tree eventing locus data
@@ -269,7 +271,7 @@ var HashTreeParser = /*#__PURE__*/function () {
269
271
  return _promise.default.resolve([]);
270
272
  }
271
273
  return this.webexRequest({
272
- method: _constants.HTTP_VERBS.GET,
274
+ method: _constants2.HTTP_VERBS.GET,
273
275
  uri: this.visibleDataSetsUrl
274
276
  }).then(function (response) {
275
277
  return response.body.dataSets;
@@ -379,7 +381,7 @@ var HashTreeParser = /*#__PURE__*/function () {
379
381
  }
380
382
  return _context4.abrupt("return");
381
383
  case 1:
382
- _iterator2 = _createForOfIteratorHelper((0, _utils.sortByInitPriority)(visibleDataSets, _constants2.DATA_SET_INIT_PRIORITY));
384
+ _iterator2 = _createForOfIteratorHelper((0, _utils.sortByInitPriority)(visibleDataSets, _constants3.DATA_SET_INIT_PRIORITY));
383
385
  _context4.prev = 2;
384
386
  _iterator2.s();
385
387
  case 3:
@@ -574,7 +576,7 @@ var HashTreeParser = /*#__PURE__*/function () {
574
576
  value: function isEndMessage(message) {
575
577
  var _this3 = this;
576
578
  return message.dataSets.some(function (dataSet) {
577
- if (dataSet.leafCount === 1 && dataSet.root === _constants2.EMPTY_HASH && (!_this3.dataSets[dataSet.name] || _this3.dataSets[dataSet.name].version < dataSet.version) && PossibleSentinelMessageDataSetNames.includes(dataSet.name.toLowerCase())) {
579
+ if (dataSet.leafCount === 1 && dataSet.root === _constants3.EMPTY_HASH && (!_this3.dataSets[dataSet.name] || _this3.dataSets[dataSet.name].version < dataSet.version) && PossibleSentinelMessageDataSetNames.includes(dataSet.name.toLowerCase())) {
578
580
  // this is a special way for Locus to indicate that this meeting has ended
579
581
  return true;
580
582
  }
@@ -801,6 +803,21 @@ var HashTreeParser = /*#__PURE__*/function () {
801
803
  }
802
804
  }
803
805
 
806
+ /**
807
+ * Updates the leaf count for a data set, resizing its hash tree accordingly.
808
+ *
809
+ * @param {InternalDataSet} dataSet - The data set to update
810
+ * @param {number} newLeafCount - The new leaf count
811
+ * @returns {void}
812
+ */
813
+ }, {
814
+ key: "updateDataSetLeafCount",
815
+ value: function updateDataSetLeafCount(dataSet, newLeafCount) {
816
+ var _dataSet$hashTree;
817
+ (_dataSet$hashTree = dataSet.hashTree) === null || _dataSet$hashTree === void 0 ? void 0 : _dataSet$hashTree.resize(newLeafCount);
818
+ dataSet.leafCount = newLeafCount;
819
+ }
820
+
804
821
  /**
805
822
  * Checks for changes in the visible data sets based on the updated objects.
806
823
  * @param {HashTreeObject[]} updatedObjects - The list of updated hash tree objects.
@@ -981,7 +998,7 @@ var HashTreeParser = /*#__PURE__*/function () {
981
998
  return this.getAllVisibleDataSetsFromLocus();
982
999
  case 2:
983
1000
  allDataSets = _context6.sent;
984
- _iterator7 = _createForOfIteratorHelper((0, _utils.sortByInitPriority)(addedDataSets, _constants2.DATA_SET_INIT_PRIORITY));
1001
+ _iterator7 = _createForOfIteratorHelper((0, _utils.sortByInitPriority)(addedDataSets, _constants3.DATA_SET_INIT_PRIORITY));
985
1002
  _context6.prev = 3;
986
1003
  _loop = /*#__PURE__*/_regenerator.default.mark(function _loop() {
987
1004
  var ds, dataSetInfo;
@@ -1317,7 +1334,7 @@ var HashTreeParser = /*#__PURE__*/function () {
1317
1334
  return _context7.abrupt("return");
1318
1335
  case 5:
1319
1336
  receivedHashes = hashesResult.hashes;
1320
- hashTree.resize(hashesResult.dataSet.leafCount);
1337
+ this.updateDataSetLeafCount(dataSet, hashesResult.dataSet.leafCount);
1321
1338
  _context7.next = 8;
1322
1339
  break;
1323
1340
  case 6:
@@ -1529,7 +1546,7 @@ var HashTreeParser = /*#__PURE__*/function () {
1529
1546
  name: dataSet.name
1530
1547
  };
1531
1548
  });
1532
- sorted = (0, _utils.sortByInitPriority)(dataSetsWithHashTrees, _constants2.DATA_SET_INIT_PRIORITY);
1549
+ sorted = (0, _utils.sortByInitPriority)(dataSetsWithHashTrees, _constants3.DATA_SET_INIT_PRIORITY);
1533
1550
  _loggerProxy.default.logger.info("HashTreeParser#syncAllDatasets --> ".concat(this.debugId, " syncing datasets: ").concat(sorted.map(function (ds) {
1534
1551
  return ds.name;
1535
1552
  }).join(', ')));
@@ -1803,7 +1820,7 @@ var HashTreeParser = /*#__PURE__*/function () {
1803
1820
  var dataSet = this.dataSets[dataSetName];
1804
1821
  var url = "".concat(dataSet.url, "/hashtree");
1805
1822
  return this.webexRequest({
1806
- method: _constants.HTTP_VERBS.GET,
1823
+ method: _constants2.HTTP_VERBS.GET,
1807
1824
  uri: url,
1808
1825
  qs: {
1809
1826
  rootHash: currentRootHash
@@ -1829,6 +1846,13 @@ var HashTreeParser = /*#__PURE__*/function () {
1829
1846
  }).catch(function (error) {
1830
1847
  _loggerProxy.default.logger.error("HashTreeParser#getHashesFromLocus --> ".concat(_this12.debugId, " Error ").concat(error.statusCode, " fetching hashes for data set \"").concat(dataSetName, "\":"), error);
1831
1848
  _this12.checkForSentinelHttpResponse(error, dataSet.name);
1849
+ _metrics.default.sendBehavioralMetric(_constants.default.HASH_TREE_SYNC_FAILURE, {
1850
+ debugId: _this12.debugId,
1851
+ dataSetName: dataSetName,
1852
+ request: 'GET /hashtree',
1853
+ statusCode: error.statusCode,
1854
+ reason: error.message
1855
+ });
1832
1856
  throw error;
1833
1857
  });
1834
1858
  }
@@ -1867,9 +1891,9 @@ var HashTreeParser = /*#__PURE__*/function () {
1867
1891
  });
1868
1892
  });
1869
1893
  }
1870
- var ourCurrentRootHash = dataSet.hashTree ? dataSet.hashTree.getRootHash() : _constants2.EMPTY_HASH;
1894
+ var ourCurrentRootHash = dataSet.hashTree ? dataSet.hashTree.getRootHash() : _constants3.EMPTY_HASH;
1871
1895
  return this.webexRequest({
1872
- method: _constants.HTTP_VERBS.POST,
1896
+ method: _constants2.HTTP_VERBS.POST,
1873
1897
  uri: url,
1874
1898
  qs: {
1875
1899
  rootHash: ourCurrentRootHash
@@ -1885,6 +1909,13 @@ var HashTreeParser = /*#__PURE__*/function () {
1885
1909
  }).catch(function (error) {
1886
1910
  _loggerProxy.default.logger.error("HashTreeParser#sendSyncRequestToLocus --> ".concat(_this13.debugId, " Error ").concat(error.statusCode, " sending sync request for data set \"").concat(dataSet.name, "\":"), error);
1887
1911
  _this13.checkForSentinelHttpResponse(error, dataSet.name);
1912
+ _metrics.default.sendBehavioralMetric(_constants.default.HASH_TREE_SYNC_FAILURE, {
1913
+ debugId: _this13.debugId,
1914
+ dataSetName: dataSet.name,
1915
+ request: 'POST /sync',
1916
+ statusCode: error.statusCode,
1917
+ reason: error.message
1918
+ });
1888
1919
  throw error;
1889
1920
  });
1890
1921
  }
@@ -1 +1 @@
1
- {"version":3,"names":["_lodash","require","_hashTree","_interopRequireDefault","_loggerProxy","_constants","_constants2","_types","_utils","ownKeys","e","r","t","_Object$keys4","_Object$getOwnPropertySymbols","o","filter","_Object$getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","Object","forEach","_defineProperty2","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty","_createForOfIteratorHelper","_Symbol","_Symbol$iterator","_Array$isArray2","_unsupportedIterableToArray","_n","F","s","n","done","value","f","TypeError","a","u","call","next","return","_arrayLikeToArray","toString","slice","constructor","name","_Array$from","test","Array","_callSuper","_getPrototypeOf2","_possibleConstructorReturn2","_isNativeReflectConstruct","_Reflect$construct","Boolean","prototype","valueOf","LocusInfoUpdateType","exports","OBJECTS_UPDATED","MEETING_ENDED","MeetingEndedError","_Error","_classCallCheck2","_inherits2","_createClass2","_wrapNativeSuper2","Error","MetadataDataSetName","DataSetNames","SELF","PossibleSentinelMessageDataSetNames","MAIN","UNJOINED","HashTreeParser","options","_locus$links","_locus$links$resource","_locus$links$resource2","_options$metadata","_options$metadata2","_options$metadata2$vi","_promise","resolve","_options$initialLocus","initialLocus","dataSets","locus","debugId","webexRequest","locusInfoUpdateCallback","excludedDataSets","visibleDataSetsUrl","links","resources","visibleDataSets","url","setVisibleDataSets","metadata","state","LoggerProxy","logger","warn","concat","leafData","analyzeLocusHtMeta","analyzeMetadata","info","_stringify","map","ds","vds","_iterator","_step","dataSet","leafCount","hashTree","isVisibleDataSet","HashTree","undefined","err","key","_this","cloneDeep","isExcludedDataSet","some","dataSetName","addToVisibleDataSetsList","dataSetInfo","_initializeNewVisibleDataSet","_asyncToGenerator2","_regenerator","mark","_callee","visibleDataSetInfo","wrap","_context","prev","abrupt","enqueueSyncForDataset","syncQueueProcessingPromise","stop","initializeNewVisibleDataSet","_x","_x2","getAllVisibleDataSetsFromLocus","_this2","method","HTTP_VERBS","GET","uri","then","response","body","catch","error","checkForSentinelHttpResponse","_initializeFromMessage","_callee2","message","_context2","sent","initializeDataSets","initializeFromMessage","_x3","_initializeFromGetLociResponse","_callee3","_locus$links2","_locus$links2$resourc","_locus$links2$resourc2","_context3","initializeFromGetLociResponse","_x4","_initializeDataSets","_callee4","debugText","_iterator2","_step2","_t","_context4","sortByInitPriority","DATA_SET_INIT_PRIORITY","finish","_x5","_x6","_ref","_ref$copyData","copyData","leafInfo","findAndStoreMetaData","currentLocusPart","currentLocusPartName","_typeof2","htMeta","dataSetNames","_currentLocusPart$htM","elementId","type","id","version","newLeafInfo","toLowerCase","ObjectType","control","data","deleteNestedObjectsWithHtMeta","_iterator3","_step3","_isArray","_iterator4","entries","_step4","_step4$value","_slicedToArray2","index","item","_i","_Object$keys","_keys","hasOwnProperty","_htMeta$dataSetNames","_metadata$htMeta$elem","join","isEndMessage","_this3","root","EMPTY_HASH","includes","handleRootHashHeartBeatMessage","_this4","_ref2","updateDataSetInfo","runSyncAlgorithm","queueInitForNewVisibleDataSets","dataSetsRequiringInitialization","_this5","queueMicrotask","initializeNewVisibleDataSets","callLocusInfoUpdateCallback","updateType","handleMetadataUpdate","updatedObjects","_this$dataSets$Metada","metadataUpdated","putItem","metadataObject","_this$checkForVisible","checkForVisibleDataSetChanges","changeDetected","removedDataSets","addedDataSets","processVisibleDataSetChanges","handleLocusUpdate","update","_this6","_iterator5","_step5","appliedChangesList","putItems","leaf","zip","_ref3","_ref4","changeApplied","receivedDataSet","idleMs","backoff","maxMs","exponent","_this7","object","_object$data","isMetadata","newVisibleDataSets","nvs","every","deleteHashTree","timer","clearTimeout","heartbeatWatchdogTimer","_this8","removedObjects","_this8$dataSets$ds$na","i","numLeaves","_toConsumableArray2","getLeafData","rds","_iterator6","_step6","_initializeNewVisibleDataSets","_callee5","_this9","allDataSets","_iterator7","_step7","_loop","_t2","_context6","_context5","find","d","delegateYield","_x7","parseMessage","_message$locusStateEl","_this0","locusStateElements","metadataUpdates","updatedMetadataObjects","_iterator8","_step8","_this0$dataSets$dataS","_this$checkForVisible2","locusStateElementsForThisSet","updateItems","operation","_ref5","_ref6","handleMessage","heartbeatIntervalMs","stopAllTimers","resetHeartbeatWatchdogs","updates","_updates$updatedObjec","_this1","filteredUpdates","_i2","_Object$keys3","existingVersion","getItemVersion","getWeightedBackoffTime","randomValue","Math","random","round","pow","_performSync","_callee6","reason","isInitialization","rootHash","leavesData","receivedHashes","hashesResult","mismatchedLeaveIndexes","syncResponse","_t3","_t4","_context7","getRootHash","getHashesFromLocus","hashes","resize","statusCode","diffHashes","sendSyncRequestToLocus","mismatchedLeavesData","performSync","_x8","_x9","_x0","existingEntry","syncQueue","entry","isSyncInProgress","processSyncQueue","_processSyncQueue","_callee7","_ref7","_context8","shift","_syncAllDatasets","_callee8","dataSetsWithHashTrees","sorted","_iterator9","_step9","_context9","isSyncAllInProgress","_values","syncAllDatasets","_this10","delay","setTimeout","receivedDataSets","_this11","_iterator0","_step0","_loop2","backoffTime","cleanUp","resumeFromMessage","_message$locusStateEl2","_metadataObject$data","el","_iterator1","_step1","_resumeFromApiResponse","_callee9","_context0","resumeFromApiResponse","_x1","_error$body","isValidDataSetForSentinel","errorCode","currentRootHash","_this12","qs","_response$body","_response$body2","isEmpty","dataSetFromResponse","_this13","leafDataEntries","leafIndex","elementIds","_parseInt2","ourCurrentRootHash","POST","resp","_default"],"sources":["hashTreeParser.ts"],"sourcesContent":["import {cloneDeep, isEmpty, zip} from 'lodash';\nimport HashTree, {LeafDataItem} from './hashTree';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {Enum, HTTP_VERBS} from '../constants';\nimport {DataSetNames, DATA_SET_INIT_PRIORITY, EMPTY_HASH} from './constants';\nimport {ObjectType, HtMeta, HashTreeObject} from './types';\nimport {LocusDTO} from '../locus-info/types';\nimport {deleteNestedObjectsWithHtMeta, isMetadata, sortByInitPriority} from './utils';\n\nexport interface DataSet {\n url: string;\n root: string;\n version: number;\n leafCount: number;\n name: string;\n idleMs: number;\n backoff: {\n maxMs: number;\n exponent: number;\n };\n}\n\nexport interface RootHashMessage {\n dataSets: Array<DataSet>;\n}\nexport interface HashTreeMessage {\n dataSets: Array<DataSet>;\n visibleDataSetsUrl: string; // url from which we can get more info about all data sets - now it seems to be visibleDataSetsUrl\n locusStateElements?: Array<HashTreeObject>;\n locusSessionId?: string;\n locusUrl: string;\n heartbeatIntervalMs?: number;\n}\n\nexport interface VisibleDataSetInfo {\n name: string;\n url: string;\n dataChannelUrl?: string;\n}\n\nexport interface Metadata {\n htMeta: HtMeta;\n visibleDataSets: VisibleDataSetInfo[];\n}\n\ninterface InternalDataSet extends DataSet {\n hashTree?: HashTree; // set only for visible data sets\n timer?: ReturnType<typeof setTimeout>;\n heartbeatWatchdogTimer?: ReturnType<typeof setTimeout>;\n}\n\ntype WebexRequestMethod = (options: Record<string, any>) => Promise<any>;\n\nexport const LocusInfoUpdateType = {\n OBJECTS_UPDATED: 'OBJECTS_UPDATED',\n MEETING_ENDED: 'MEETING_ENDED',\n} as const;\n\nexport type LocusInfoUpdateType = Enum<typeof LocusInfoUpdateType>;\nexport type LocusInfoUpdate =\n | {\n updateType: typeof LocusInfoUpdateType.OBJECTS_UPDATED;\n updatedObjects: HashTreeObject[];\n }\n | {\n updateType: typeof LocusInfoUpdateType.MEETING_ENDED;\n };\nexport type LocusInfoUpdateCallback = (update: LocusInfoUpdate) => void;\n\ninterface LeafInfo {\n type: ObjectType;\n id: number;\n version: number;\n data?: any;\n}\n\n/**\n * This error is thrown if we receive information that the meeting has ended while we're processing some hash messages.\n * It's handled internally by HashTreeParser and results in MEETING_ENDED being sent up.\n */\nexport class MeetingEndedError extends Error {}\n\n/* Currently Locus always sends Metadata objects only in the \"self\" dataset.\n * If this ever changes, update all the code that relies on this constant.\n */\nconst MetadataDataSetName = DataSetNames.SELF;\n\nconst PossibleSentinelMessageDataSetNames = [\n DataSetNames.MAIN,\n DataSetNames.SELF,\n DataSetNames.UNJOINED,\n];\n\n/**\n * Parses hash tree eventing locus data\n */\nclass HashTreeParser {\n dataSets: Record<string, InternalDataSet> = {};\n visibleDataSetsUrl: string; // url from which we can get info about all data sets\n webexRequest: WebexRequestMethod;\n locusInfoUpdateCallback: LocusInfoUpdateCallback;\n visibleDataSets: VisibleDataSetInfo[];\n debugId: string;\n heartbeatIntervalMs?: number;\n private excludedDataSets: string[];\n state: 'active' | 'stopped';\n private syncQueue: Array<{dataSetName: string; reason: string; isInitialization?: boolean}> = [];\n private isSyncInProgress = false;\n private isSyncAllInProgress = false;\n private syncQueueProcessingPromise: Promise<void> = Promise.resolve();\n\n /**\n * Constructor for HashTreeParser\n * @param {Object} options\n * @param {Object} options.initialLocus The initial locus data containing the hash tree information\n */\n constructor(options: {\n initialLocus: {\n dataSets: Array<DataSet>;\n locus: any;\n };\n metadata: Metadata | null;\n webexRequest: WebexRequestMethod;\n locusInfoUpdateCallback: LocusInfoUpdateCallback;\n debugId: string;\n excludedDataSets?: string[];\n }) {\n const {dataSets, locus} = options.initialLocus; // extract dataSets from initialLocus\n\n this.debugId = options.debugId;\n this.webexRequest = options.webexRequest;\n this.locusInfoUpdateCallback = options.locusInfoUpdateCallback;\n this.excludedDataSets = options.excludedDataSets || [];\n this.visibleDataSetsUrl = locus?.links?.resources?.visibleDataSets?.url;\n this.setVisibleDataSets(options.metadata?.visibleDataSets || [], dataSets);\n\n this.state = 'active';\n\n if (options.metadata?.visibleDataSets?.length === 0) {\n LoggerProxy.logger.warn(\n `HashTreeParser#constructor --> ${this.debugId} No visibleDataSets found in Metadata`\n );\n }\n // object mapping dataset names to arrays of leaf data\n const leafData = this.analyzeLocusHtMeta(locus);\n\n if (options.metadata) {\n // add also the metadata that's outside of locus object itself\n this.analyzeMetadata(leafData, options.metadata);\n }\n\n LoggerProxy.logger.info(\n `HashTreeParser#constructor --> ${\n this.debugId\n } creating HashTreeParser for datasets: ${JSON.stringify(\n dataSets.map((ds) => ds.name)\n )} with visible datasets: ${JSON.stringify(this.visibleDataSets.map((vds) => vds.name))}`\n );\n\n for (const dataSet of dataSets) {\n const {name, leafCount} = dataSet;\n\n this.dataSets[name] = {\n ...dataSet,\n hashTree: this.isVisibleDataSet(name)\n ? new HashTree(leafData[name] || [], leafCount)\n : undefined,\n };\n }\n }\n\n /**\n * Sets the visible data sets list for the HashTreeParser. This method should be called only at the start, to initialize\n * the visible data sets, before any message processsing, so for example from the constructor or when resuming the parser.\n *\n * @param {Array<VisibleDataSetInfo>} visibleDataSets - The visible data sets to set\n * @param {Array<DataSet>} dataSets - The \"dataSets\" list from Locus (yes, Locus sends visibleDataSets and dataSets as separate lists and they can differ)\n * @returns {void}\n */\n private setVisibleDataSets(visibleDataSets: VisibleDataSetInfo[], dataSets: Array<DataSet>) {\n this.visibleDataSets = cloneDeep(visibleDataSets).filter(\n (vds) =>\n // exclude data sets we will never care about\n !this.isExcludedDataSet(vds.name) &&\n // and make sure that visibleDataSets list is consistent with dataSets list\n dataSets.some((ds) => ds.name === vds.name)\n );\n }\n\n /**\n * Checks if the given data set name is in the list of visible data sets\n * @param {string} dataSetName data set name to check\n * @returns {Boolean} True if the data set is visible, false otherwise\n */\n private isVisibleDataSet(dataSetName: string): boolean {\n return this.visibleDataSets.some((vds) => vds.name === dataSetName);\n }\n\n /**\n * Checks if the given data set name is in the excluded list\n * @param {string} dataSetName data set name to check\n * @returns {boolean} True if the data set is excluded, false otherwise\n */\n private isExcludedDataSet(dataSetName: string): boolean {\n return this.excludedDataSets.some((name) => name === dataSetName);\n }\n\n /**\n * Adds a data set to the visible data sets list, unless it is in the excluded list.\n * @param {VisibleDataSetInfo} dataSetInfo data set info to add\n * @returns {boolean} True if the data set was added, false if it was excluded\n */\n private addToVisibleDataSetsList(dataSetInfo: VisibleDataSetInfo): boolean {\n if (this.isExcludedDataSet(dataSetInfo.name)) {\n LoggerProxy.logger.info(\n `HashTreeParser#addToVisibleDataSetsList --> ${this.debugId} Data set \"${dataSetInfo.name}\" is in the excluded list, ignoring`\n );\n\n return false;\n }\n\n this.visibleDataSets.push(dataSetInfo);\n\n return true;\n }\n\n /**\n * Initializes a new visible data set by creating a hash tree for it, adding it to all the internal structures,\n * and sending an initial sync request to Locus with empty leaf data - that will trigger Locus to gives us all the data\n * from that dataset (in the response or via messages).\n *\n * @param {VisibleDataSetInfo} visibleDataSetInfo Information about the new visible data set\n * @param {DataSet} dataSetInfo The new data set to be added\n * @returns {Promise}\n */\n private async initializeNewVisibleDataSet(\n visibleDataSetInfo: VisibleDataSetInfo,\n dataSetInfo: DataSet\n ): Promise<void> {\n if (this.isVisibleDataSet(dataSetInfo.name)) {\n LoggerProxy.logger.info(\n `HashTreeParser#initializeNewVisibleDataSet --> ${this.debugId} Data set \"${dataSetInfo.name}\" already exists, skipping init`\n );\n\n return;\n }\n\n LoggerProxy.logger.info(\n `HashTreeParser#initializeNewVisibleDataSet --> ${this.debugId} Adding visible data set \"${dataSetInfo.name}\"`\n );\n\n if (!this.addToVisibleDataSetsList(visibleDataSetInfo)) {\n return;\n }\n\n const hashTree = new HashTree([], dataSetInfo.leafCount);\n\n this.dataSets[dataSetInfo.name] = {\n ...dataSetInfo,\n hashTree,\n };\n\n this.enqueueSyncForDataset(dataSetInfo.name, 'new visible data set initialization', true);\n await this.syncQueueProcessingPromise;\n }\n\n /**\n * Queries Locus for all up-to-date information about all visible data sets\n *\n * @returns {Promise}\n */\n private getAllVisibleDataSetsFromLocus() {\n if (!this.visibleDataSetsUrl) {\n LoggerProxy.logger.warn(\n `HashTreeParser#getAllVisibleDataSetsFromLocus --> ${this.debugId} No visibleDataSetsUrl, cannot get data sets information`\n );\n\n return Promise.resolve([]);\n }\n\n return this.webexRequest({\n method: HTTP_VERBS.GET,\n uri: this.visibleDataSetsUrl,\n })\n .then((response) => {\n return response.body.dataSets as Array<DataSet>;\n })\n .catch((error) => {\n this.checkForSentinelHttpResponse(error);\n\n throw error;\n });\n }\n\n /**\n * Initializes the hash tree parser from a message received from Locus.\n *\n * @param {HashTreeMessage} message - initial hash tree message received from Locus\n * @returns {Promise}\n */\n async initializeFromMessage(message: HashTreeMessage) {\n this.visibleDataSetsUrl = message.visibleDataSetsUrl;\n\n LoggerProxy.logger.info(\n `HashTreeParser#initializeFromMessage --> ${this.debugId} visibleDataSetsUrl=${this.visibleDataSetsUrl}`\n );\n const visibleDataSets = await this.getAllVisibleDataSetsFromLocus();\n\n await this.initializeDataSets(visibleDataSets, 'initialization from message');\n }\n\n /**\n * Initializes the hash tree parser from GET /loci API response by fetching all data sets metadata\n * first and then doing an initialization sync on each data set\n *\n * This function requires that this.visibleDataSets have been already populated correctly by the constructor.\n *\n * @param {LocusDTO} locus - locus object received from GET /loci\n * @returns {Promise}\n */\n async initializeFromGetLociResponse(locus: LocusDTO) {\n if (!locus?.links?.resources?.visibleDataSets?.url) {\n LoggerProxy.logger.warn(\n `HashTreeParser#initializeFromGetLociResponse --> ${this.debugId} missing visibleDataSets url in GET Loci response, cannot initialize hash trees`\n );\n\n return;\n }\n this.visibleDataSetsUrl = locus.links.resources.visibleDataSets.url;\n\n LoggerProxy.logger.info(\n `HashTreeParser#initializeFromGetLociResponse --> ${this.debugId} visibleDataSets url: ${this.visibleDataSetsUrl}`\n );\n\n const visibleDataSets = await this.getAllVisibleDataSetsFromLocus();\n\n await this.initializeDataSets(visibleDataSets, 'initialization from GET /loci response');\n }\n\n /**\n * Initializes data sets by doing an initialization sync on each visible data set that doesn't have a hash tree yet.\n *\n * @param {DataSet[]} visibleDataSets Array of visible DataSet objects to initialize\n * @param {string} debugText Text to include in logs for debugging purposes\n * @returns {Promise}\n */\n private async initializeDataSets(visibleDataSets: Array<DataSet>, debugText: string) {\n if (this.state === 'stopped') {\n return;\n }\n\n for (const dataSet of sortByInitPriority(visibleDataSets, DATA_SET_INIT_PRIORITY)) {\n const {name, leafCount, url} = dataSet;\n\n if (!this.dataSets[name]) {\n LoggerProxy.logger.info(\n `HashTreeParser#initializeDataSets --> ${this.debugId} initializing dataset \"${name}\" (${debugText})`\n );\n\n this.dataSets[name] = {\n ...dataSet,\n };\n } else {\n LoggerProxy.logger.info(\n `HashTreeParser#initializeDataSets --> ${this.debugId} dataset \"${name}\" already exists (${debugText})`\n );\n }\n\n if (!this.isVisibleDataSet(name)) {\n if (\n !this.addToVisibleDataSetsList({\n name,\n url,\n })\n ) {\n // dataset is excluded, skip it\n // eslint-disable-next-line no-continue\n continue;\n }\n }\n\n if (!this.dataSets[name].hashTree) {\n LoggerProxy.logger.info(\n `HashTreeParser#initializeDataSets --> ${this.debugId} creating hash tree for visible dataset \"${name}\" (${debugText})`\n );\n this.dataSets[name].hashTree = new HashTree([], leafCount);\n\n this.enqueueSyncForDataset(name, `initialization sync for ${debugText}`, true);\n }\n }\n\n // wait for all enqueued initialization syncs to complete\n await this.syncQueueProcessingPromise;\n }\n\n /**\n * Each dataset exists at a different place in the dto\n * iterate recursively over the locus and if it has a htMeta key,\n * create an object with the type, id and version and add it to the appropriate leafData array\n *\n * @param {any} locus - The current part of the locus being processed\n * @param {Object} [options]\n * @param {boolean} [options.copyData=false] - Whether to copy the data for each leaf into returned result\n * @returns {any} - An object mapping dataset names to arrays of leaf data\n */\n private analyzeLocusHtMeta(locus: any, options?: {copyData?: boolean}) {\n const {copyData = false} = options || {};\n // object mapping dataset names to arrays of leaf data\n const leafInfo: Record<string, Array<LeafInfo>> = {};\n\n const findAndStoreMetaData = (currentLocusPart: any, currentLocusPartName: string) => {\n if (typeof currentLocusPart !== 'object' || currentLocusPart === null) {\n return;\n }\n\n if (currentLocusPart.htMeta && currentLocusPart.htMeta.dataSetNames) {\n const {type, id, version} = currentLocusPart.htMeta.elementId;\n const {dataSetNames} = currentLocusPart.htMeta;\n const newLeafInfo: LeafInfo = {\n type,\n id,\n version,\n };\n\n if (copyData) {\n if ((type as string).toLowerCase() === ObjectType.control) {\n // control entries require special handling, because they are signalled by Locus\n // differently when coming in messages vs API responses\n newLeafInfo.data = {\n [currentLocusPartName]: cloneDeep(currentLocusPart),\n };\n } else {\n newLeafInfo.data = cloneDeep(currentLocusPart);\n\n // remove any nested other objects that have their own htMeta\n deleteNestedObjectsWithHtMeta(newLeafInfo.data);\n }\n }\n\n for (const dataSetName of dataSetNames) {\n if (!leafInfo[dataSetName]) {\n leafInfo[dataSetName] = [];\n }\n leafInfo[dataSetName].push(newLeafInfo);\n }\n }\n\n if (Array.isArray(currentLocusPart)) {\n for (const [index, item] of currentLocusPart.entries()) {\n findAndStoreMetaData(item, index.toString());\n }\n } else {\n for (const key of Object.keys(currentLocusPart)) {\n if (Object.prototype.hasOwnProperty.call(currentLocusPart, key)) {\n findAndStoreMetaData(currentLocusPart[key], key);\n }\n }\n }\n };\n\n findAndStoreMetaData(locus, 'locus');\n\n return leafInfo;\n }\n\n /**\n * Analyzes the Metadata object that is sent outside of Locus object, and appends its data to passed in leafInfo\n * structure.\n *\n * @param {Record<string, LeafInfo[]>} leafInfo the structure to which the Metadata info will be appended\n * @param {Metadata} metadata Metadata object\n * @returns {void}\n */\n private analyzeMetadata(leafInfo: Record<string, LeafInfo[]>, metadata: Metadata) {\n const {htMeta} = metadata;\n\n if (\n htMeta?.dataSetNames?.length === 1 &&\n htMeta.dataSetNames[0].toLowerCase() === MetadataDataSetName\n ) {\n const {type, id, version} = metadata.htMeta.elementId;\n\n const dataSetName = htMeta.dataSetNames[0];\n\n if (!leafInfo[dataSetName]) {\n leafInfo[dataSetName] = [];\n }\n\n leafInfo[dataSetName].push({\n type,\n id,\n version,\n });\n } else {\n throw new Error(\n `${this.debugId} Metadata htMeta has unexpected dataSetNames: ${\n htMeta && htMeta.dataSetNames.join(',')\n }`\n );\n }\n }\n\n /**\n * Checks if the provided hash tree message indicates the end of the meeting and that there won't be any more updates.\n *\n * @param {HashTreeMessage} message - The hash tree message to check\n * @returns {boolean} - Returns true if the message indicates the end of the meeting, false otherwise\n */\n private isEndMessage(message: HashTreeMessage) {\n return message.dataSets.some((dataSet) => {\n if (\n dataSet.leafCount === 1 &&\n dataSet.root === EMPTY_HASH &&\n (!this.dataSets[dataSet.name] || this.dataSets[dataSet.name].version < dataSet.version) &&\n PossibleSentinelMessageDataSetNames.includes(dataSet.name.toLowerCase())\n ) {\n // this is a special way for Locus to indicate that this meeting has ended\n return true;\n }\n\n return false;\n });\n }\n\n /**\n * Handles the root hash heartbeat message\n *\n * @param {RootHashMessage} message - The root hash heartbeat message\n * @returns {void}\n */\n private handleRootHashHeartBeatMessage(message: RootHashMessage): void {\n const {dataSets} = message;\n\n LoggerProxy.logger.info(\n `HashTreeParser#handleRootHashMessage --> ${\n this.debugId\n } Received heartbeat root hash message with data sets: ${JSON.stringify(\n dataSets.map(({name, root, leafCount, version}) => ({\n name,\n root,\n leafCount,\n version,\n }))\n )}`\n );\n\n dataSets.forEach((dataSet) => {\n this.updateDataSetInfo(dataSet);\n this.runSyncAlgorithm(dataSet);\n });\n }\n\n /**\n * Asynchronously initializes new visible data sets\n *\n * @param {VisibleDataSetInfo[]} dataSetsRequiringInitialization list of datasets to initialize\n * @returns {void}\n */\n private queueInitForNewVisibleDataSets(dataSetsRequiringInitialization: VisibleDataSetInfo[]) {\n LoggerProxy.logger.info(\n `HashTreeParser#queueInitForNewVisibleDataSets --> ${\n this.debugId\n } queuing initialization of new visible datasets: ${dataSetsRequiringInitialization\n .map((ds) => ds.name)\n .join(', ')}`\n );\n queueMicrotask(() => {\n this.initializeNewVisibleDataSets(dataSetsRequiringInitialization).catch((error) => {\n if (error instanceof MeetingEndedError) {\n this.callLocusInfoUpdateCallback({\n updateType: LocusInfoUpdateType.MEETING_ENDED,\n });\n } else {\n LoggerProxy.logger.warn(\n `HashTreeParser#queueInitForNewVisibleDataSets --> ${\n this.debugId\n } error while initializing new visible datasets: ${dataSetsRequiringInitialization\n .map((ds) => ds.name)\n .join(', ')}: `,\n error\n );\n }\n });\n });\n }\n\n /**\n * Handles updates to Metadata object that we receive from Locus via other means than messages. Right now\n * that means only in the API response alongside locus object.\n *\n * @param {Metadata} metadata received in Locus update other than a message (for example in an API response)\n * @param {HashTreeObject[]} updatedObjects a list of updated hash tree objects to which any updates resulting from new Metadata will be added\n * @returns {void}\n */\n handleMetadataUpdate(metadata: Metadata, updatedObjects: HashTreeObject[]): void {\n let dataSetsRequiringInitialization: VisibleDataSetInfo[] = [];\n\n // current assumption based on Locus docs is that Metadata object lives always in \"self\" data set\n const hashTree = this.dataSets[MetadataDataSetName]?.hashTree;\n\n if (!hashTree) {\n LoggerProxy.logger.warn(\n `HashTreeParser#handleLocusUpdate --> ${this.debugId} received Metadata object but no hash tree for \"${MetadataDataSetName}\" data set exists`\n );\n } else {\n const metadataUpdated = hashTree.putItem(metadata.htMeta.elementId);\n\n if (metadataUpdated) {\n // metadata in Locus API response is in a slightly different format than the objects in messages, so need to adapt it\n const metadataObject: HashTreeObject = {\n htMeta: metadata.htMeta,\n data: metadata,\n };\n\n updatedObjects.push(metadataObject);\n\n const {changeDetected, removedDataSets, addedDataSets} = this.checkForVisibleDataSetChanges(\n [metadataObject]\n );\n\n if (changeDetected) {\n dataSetsRequiringInitialization = this.processVisibleDataSetChanges(\n removedDataSets,\n addedDataSets,\n updatedObjects\n );\n }\n\n if (dataSetsRequiringInitialization.length > 0) {\n // there are some data sets that we need to initialize asynchronously\n this.queueInitForNewVisibleDataSets(dataSetsRequiringInitialization);\n }\n }\n }\n }\n\n /**\n * This method should be called when we receive a partial locus DTO that contains dataSets and htMeta information\n * It updates the hash trees with the new leaf data based on the received Locus\n *\n * @param {Object} update - The locus update containing data sets and locus information\n * @returns {void}\n */\n handleLocusUpdate(update: {dataSets?: Array<DataSet>; locus: any; metadata?: Metadata}): void {\n if (this.state === 'stopped') {\n return;\n }\n\n const {dataSets, locus, metadata} = update;\n\n if (!dataSets) {\n // this happens for example when we handle GET /loci response\n LoggerProxy.logger.info(\n `HashTreeParser#handleLocusUpdate --> ${this.debugId} received hash tree update without dataSets`\n );\n } else {\n for (const dataSet of dataSets) {\n this.updateDataSetInfo(dataSet);\n }\n }\n const updatedObjects: HashTreeObject[] = [];\n\n // first, analyze the locus object to extract the hash tree objects' htMeta and data from it\n const leafInfo = this.analyzeLocusHtMeta(locus, {copyData: true});\n\n // if we got metadata, process it (currently that means only potential visible data set list changes)\n if (metadata) {\n this.handleMetadataUpdate(metadata, updatedObjects);\n }\n\n // then process the data in hash trees, if it is a new version, then add it to updatedObjects\n Object.keys(leafInfo).forEach((dataSetName) => {\n if (this.dataSets[dataSetName]) {\n if (this.dataSets[dataSetName].hashTree) {\n const appliedChangesList = this.dataSets[dataSetName].hashTree.putItems(\n leafInfo[dataSetName].map((leaf) => ({\n id: leaf.id,\n type: leaf.type,\n version: leaf.version,\n }))\n );\n\n zip(appliedChangesList, leafInfo[dataSetName]).forEach(([changeApplied, leaf]) => {\n if (changeApplied) {\n updatedObjects.push({\n htMeta: {\n elementId: {\n type: leaf.type,\n id: leaf.id,\n version: leaf.version,\n },\n dataSetNames: [dataSetName],\n },\n data: leaf.data,\n });\n }\n });\n } else {\n // no hash tree means that the data set is not visible\n LoggerProxy.logger.warn(\n `HashTreeParser#handleLocusUpdate --> ${this.debugId} received leaf data for data set \"${dataSetName}\" that has no hash tree created, ignoring`\n );\n }\n } else {\n LoggerProxy.logger.info(\n `HashTreeParser#handleLocusUpdate --> ${this.debugId} received leaf data for unknown data set \"${dataSetName}\", ignoring`\n );\n }\n });\n\n if (updatedObjects.length === 0) {\n LoggerProxy.logger.info(\n `HashTreeParser#handleLocusUpdate --> ${this.debugId} No objects updated as a result of received API response`\n );\n } else {\n this.callLocusInfoUpdateCallback({\n updateType: LocusInfoUpdateType.OBJECTS_UPDATED,\n updatedObjects,\n });\n }\n }\n\n /**\n * Updates the internal data set information based on the received data set from Locus.\n *\n * @param {DataSet} receivedDataSet - The latest data set information received from Locus to update the internal state.\n * @returns {void}\n */\n private updateDataSetInfo(receivedDataSet: DataSet) {\n if (!this.dataSets[receivedDataSet.name]) {\n this.dataSets[receivedDataSet.name] = {\n ...receivedDataSet,\n };\n\n LoggerProxy.logger.info(\n `HashTreeParser#updateDataSetInfo --> ${this.debugId} created entry for \"${receivedDataSet.name}\" dataset: version=${receivedDataSet.version}, root=${receivedDataSet.root}`\n );\n\n return;\n }\n // update our version of the dataSet\n if (this.dataSets[receivedDataSet.name].version < receivedDataSet.version) {\n this.dataSets[receivedDataSet.name].version = receivedDataSet.version;\n this.dataSets[receivedDataSet.name].root = receivedDataSet.root;\n this.dataSets[receivedDataSet.name].idleMs = receivedDataSet.idleMs;\n this.dataSets[receivedDataSet.name].backoff = {\n maxMs: receivedDataSet.backoff.maxMs,\n exponent: receivedDataSet.backoff.exponent,\n };\n LoggerProxy.logger.info(\n `HashTreeParser#updateDataSetInfo --> ${this.debugId} updated \"${receivedDataSet.name}\" dataset to version=${receivedDataSet.version}, root=${receivedDataSet.root}`\n );\n }\n }\n\n /**\n * Checks for changes in the visible data sets based on the updated objects.\n * @param {HashTreeObject[]} updatedObjects - The list of updated hash tree objects.\n * @returns {Object} An object containing the removed and added visible data sets.\n */\n private checkForVisibleDataSetChanges(updatedObjects: HashTreeObject[]) {\n let removedDataSets: VisibleDataSetInfo[] = [];\n let addedDataSets: VisibleDataSetInfo[] = [];\n\n // visibleDataSets can only be changed by Metadata object updates\n updatedObjects.forEach((object) => {\n if (isMetadata(object) && object.data?.visibleDataSets) {\n const newVisibleDataSets = object.data.visibleDataSets.filter(\n (vds) => !this.isExcludedDataSet(vds.name)\n );\n\n removedDataSets = this.visibleDataSets.filter(\n (ds) => !newVisibleDataSets.some((nvs) => nvs.name === ds.name)\n );\n addedDataSets = newVisibleDataSets.filter((nvs) =>\n this.visibleDataSets.every((ds) => ds.name !== nvs.name)\n );\n\n if (removedDataSets.length > 0 || addedDataSets.length > 0) {\n LoggerProxy.logger.info(\n `HashTreeParser#checkForVisibleDataSetChanges --> ${\n this.debugId\n } visible data sets change: removed: ${removedDataSets\n .map((ds) => ds.name)\n .join(', ')}, added: ${addedDataSets.map((ds) => ds.name).join(', ')}`\n );\n }\n }\n });\n\n return {\n changeDetected: removedDataSets.length > 0 || addedDataSets.length > 0,\n removedDataSets,\n addedDataSets,\n };\n }\n\n /**\n * Deletes the hash tree for the specified data set.\n *\n * @param {string} dataSetName name of the data set to delete\n * @returns {void}\n */\n private deleteHashTree(dataSetName: string) {\n this.dataSets[dataSetName].hashTree = undefined;\n\n // we also need to stop the timers as there is no hash tree anymore to sync\n if (this.dataSets[dataSetName].timer) {\n clearTimeout(this.dataSets[dataSetName].timer);\n this.dataSets[dataSetName].timer = undefined;\n }\n if (this.dataSets[dataSetName].heartbeatWatchdogTimer) {\n clearTimeout(this.dataSets[dataSetName].heartbeatWatchdogTimer);\n this.dataSets[dataSetName].heartbeatWatchdogTimer = undefined;\n }\n }\n\n /**\n * Adds entries to the passed in updateObjects array\n * for the changes that result from removing visible data sets and creates hash\n * trees for the new visible data sets, but without populating the hash trees.\n *\n * This function is synchronous. If we are missing information about some new\n * visible data sets and they require async initialization, the names of these data sets\n * are returned in an array.\n *\n * @param {VisibleDataSetInfo[]} removedDataSets - The list of removed data sets.\n * @param {VisibleDataSetInfo[]} addedDataSets - The list of added data sets.\n * @param {HashTreeObject[]} updatedObjects - The list of updated hash tree objects to which changes will be added.\n * @returns {VisibleDataSetInfo[]} list of data sets that couldn't be initialized synchronously\n */\n private processVisibleDataSetChanges(\n removedDataSets: VisibleDataSetInfo[],\n addedDataSets: VisibleDataSetInfo[],\n updatedObjects: HashTreeObject[]\n ): VisibleDataSetInfo[] {\n const dataSetsRequiringInitialization: VisibleDataSetInfo[] = [];\n\n // if a visible data set was removed, we need to tell our client that all objects from it are removed\n const removedObjects: HashTreeObject[] = [];\n\n removedDataSets.forEach((ds) => {\n if (this.dataSets[ds.name]?.hashTree) {\n for (let i = 0; i < this.dataSets[ds.name].hashTree.numLeaves; i += 1) {\n removedObjects.push(\n ...this.dataSets[ds.name].hashTree.getLeafData(i).map((elementId) => ({\n htMeta: {\n elementId,\n dataSetNames: [ds.name],\n },\n data: null,\n }))\n );\n }\n\n this.deleteHashTree(ds.name);\n }\n });\n this.visibleDataSets = this.visibleDataSets.filter(\n (vds) => !removedDataSets.some((rds) => rds.name === vds.name)\n );\n updatedObjects.push(...removedObjects);\n\n // now setup the new visible data sets\n for (const ds of addedDataSets) {\n const dataSetInfo = this.dataSets[ds.name];\n\n if (dataSetInfo) {\n if (this.isVisibleDataSet(dataSetInfo.name)) {\n LoggerProxy.logger.info(\n `HashTreeParser#processVisibleDataSetChanges --> ${this.debugId} Data set \"${ds.name}\" is already visible, skipping`\n );\n\n // eslint-disable-next-line no-continue\n continue;\n }\n\n LoggerProxy.logger.info(\n `HashTreeParser#processVisibleDataSetChanges --> ${this.debugId} Adding visible data set \"${ds.name}\"`\n );\n\n if (!this.addToVisibleDataSetsList(ds)) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n const hashTree = new HashTree([], dataSetInfo.leafCount);\n\n this.dataSets[dataSetInfo.name] = {\n ...dataSetInfo,\n hashTree,\n };\n\n // this call is needed here for the edge case where we receive a message with new visible data sets\n // and there are no objects belonging to these data sets in the message but we already have the info about them in this.dataSets\n this.runSyncAlgorithm(this.dataSets[dataSetInfo.name]);\n } else {\n LoggerProxy.logger.info(\n `HashTreeParser#processVisibleDataSetChanges --> ${this.debugId} visible data set \"${ds.name}\" added but no info about it in our dataSets structures`\n );\n // todo: add a metric here\n dataSetsRequiringInitialization.push(ds);\n }\n }\n\n return dataSetsRequiringInitialization;\n }\n\n /**\n * Adds entries to the passed in updateObjects array\n * for the changes that result from adding and removing visible data sets.\n *\n * @param {VisibleDataSetInfo[]} addedDataSets - The list of added data sets.\n * @returns {Promise<void>}\n */\n private async initializeNewVisibleDataSets(addedDataSets: VisibleDataSetInfo[]): Promise<void> {\n if (this.state === 'stopped') {\n return;\n }\n const allDataSets = await this.getAllVisibleDataSetsFromLocus();\n\n for (const ds of sortByInitPriority(addedDataSets, DATA_SET_INIT_PRIORITY)) {\n const dataSetInfo = allDataSets.find((d) => d.name === ds.name);\n\n LoggerProxy.logger.info(\n `HashTreeParser#initializeNewVisibleDataSets --> ${this.debugId} initializing data set \"${ds.name}\"`\n );\n\n if (!dataSetInfo) {\n LoggerProxy.logger.warn(\n `HashTreeParser#initializeNewVisibleDataSets --> ${this.debugId} missing info about data set \"${ds.name}\" in Locus response from visibleDataSetsUrl`\n );\n } else {\n // eslint-disable-next-line no-await-in-loop\n await this.initializeNewVisibleDataSet(ds, dataSetInfo);\n }\n }\n }\n\n /**\n * Parses incoming hash tree messages, updates the hash trees and returns information about the changes\n *\n * @param {HashTreeMessage} message - The hash tree message containing data sets and objects to be processed\n * @param {string} [debugText] - Optional debug text to include in logs\n * @returns {HashTreeObject[]} list of hash tree objects that were updated as a result of processing the message\n */\n private parseMessage(message: HashTreeMessage, debugText?: string): HashTreeObject[] {\n if (this.state === 'stopped') {\n return [];\n }\n\n const {dataSets, visibleDataSetsUrl} = message;\n\n LoggerProxy.logger.info(\n `HashTreeParser#parseMessage --> ${this.debugId} received message ${debugText || ''}:`,\n message\n );\n if (message.locusStateElements?.length === 0) {\n LoggerProxy.logger.warn(\n `HashTreeParser#parseMessage --> ${this.debugId} got empty locusStateElements!!!`\n );\n // todo: send a metric\n }\n\n // first, update our metadata about the datasets with info from the message\n this.visibleDataSetsUrl = visibleDataSetsUrl;\n dataSets.forEach((dataSet) => this.updateDataSetInfo(dataSet));\n\n const updatedObjects: HashTreeObject[] = [];\n\n // when we detect new visible datasets, it may be that the metadata about them is not\n // available in the message, they will require separate async initialization\n let dataSetsRequiringInitialization: VisibleDataSetInfo[] = [];\n\n // first find out if there are any visible data set changes - they're signalled in Metadata object updates\n const metadataUpdates = (message.locusStateElements || []).filter((object) =>\n isMetadata(object)\n );\n\n if (metadataUpdates.length > 0) {\n const updatedMetadataObjects: HashTreeObject[] = [];\n\n metadataUpdates.forEach((object) => {\n // todo: once Locus supports it, we will use the \"view\" field here instead of dataSetNames\n for (const dataSetName of object.htMeta.dataSetNames) {\n const hashTree = this.dataSets[dataSetName]?.hashTree;\n\n if (hashTree && object.data) {\n if (hashTree.putItem(object.htMeta.elementId)) {\n updatedMetadataObjects.push(object);\n }\n }\n }\n });\n\n updatedObjects.push(...updatedMetadataObjects);\n\n const {changeDetected, removedDataSets, addedDataSets} =\n this.checkForVisibleDataSetChanges(updatedMetadataObjects);\n\n if (changeDetected) {\n dataSetsRequiringInitialization = this.processVisibleDataSetChanges(\n removedDataSets,\n addedDataSets,\n updatedObjects\n );\n }\n }\n\n if (message.locusStateElements && message.locusStateElements.length > 0) {\n // by this point we now have this.dataSets setup for data sets from this message\n // and hash trees created for the new visible data sets,\n // so we can now process all the updates from the message\n dataSets.forEach((dataSet) => {\n if (this.dataSets[dataSet.name]) {\n const {hashTree} = this.dataSets[dataSet.name];\n\n if (hashTree) {\n const locusStateElementsForThisSet = message.locusStateElements.filter((object) =>\n object.htMeta.dataSetNames.includes(dataSet.name)\n );\n\n const appliedChangesList = hashTree.updateItems(\n locusStateElementsForThisSet.map((object) =>\n object.data\n ? {operation: 'update', item: object.htMeta.elementId}\n : {operation: 'remove', item: object.htMeta.elementId}\n )\n );\n\n zip(appliedChangesList, locusStateElementsForThisSet).forEach(\n ([changeApplied, object]) => {\n if (changeApplied) {\n // add to updatedObjects so that our locus DTO will get updated with the new object\n updatedObjects.push(object);\n }\n }\n );\n } else {\n LoggerProxy.logger.info(\n `Locus-info:index#parseMessage --> ${this.debugId} unexpected (not visible) dataSet ${dataSet.name} received in hash tree message`\n );\n }\n }\n\n this.runSyncAlgorithm(dataSet);\n });\n }\n\n if (dataSetsRequiringInitialization.length > 0) {\n // there are some data sets that we need to initialize asynchronously\n this.queueInitForNewVisibleDataSets(dataSetsRequiringInitialization);\n }\n\n if (updatedObjects.length === 0) {\n LoggerProxy.logger.info(\n `HashTreeParser#parseMessage --> ${this.debugId} No objects updated as a result of received message`\n );\n }\n\n return updatedObjects;\n }\n\n /**\n * Handles incoming hash tree messages, updates the hash trees and calls locusInfoUpdateCallback\n *\n * @param {HashTreeMessage} message - The hash tree message containing data sets and objects to be processed\n * @param {string} [debugText] - Optional debug text to include in logs\n * @returns {void}\n */\n handleMessage(message: HashTreeMessage, debugText?: string) {\n if (this.state === 'stopped') {\n return;\n }\n\n if (message.heartbeatIntervalMs) {\n this.heartbeatIntervalMs = message.heartbeatIntervalMs;\n }\n if (this.isEndMessage(message)) {\n LoggerProxy.logger.info(\n `HashTreeParser#handleMessage --> ${this.debugId} received sentinel END MEETING message`\n );\n this.stopAllTimers();\n\n this.callLocusInfoUpdateCallback({updateType: LocusInfoUpdateType.MEETING_ENDED});\n } else if (message.locusStateElements === undefined) {\n this.handleRootHashHeartBeatMessage(message);\n this.resetHeartbeatWatchdogs(message.dataSets);\n } else {\n const updatedObjects = this.parseMessage(message, debugText);\n\n this.resetHeartbeatWatchdogs(message.dataSets);\n this.callLocusInfoUpdateCallback({\n updateType: LocusInfoUpdateType.OBJECTS_UPDATED,\n updatedObjects,\n });\n }\n }\n\n /**\n * Calls the updateInfo callback if there are any updates to report\n *\n * @param {Object} updates parsed from a Locus message\n * @returns {void}\n */\n private callLocusInfoUpdateCallback(updates: LocusInfoUpdate) {\n if (this.state === 'stopped') {\n return;\n }\n\n const {updateType} = updates;\n\n if (updateType === LocusInfoUpdateType.OBJECTS_UPDATED && updates.updatedObjects?.length > 0) {\n // Filter out updates for objects that already have a higher version in their datasets,\n // or removals for objects that still exist in any of their datasets\n const filteredUpdates = updates.updatedObjects.filter((object) => {\n const {elementId} = object.htMeta;\n const {type, id, version} = elementId;\n\n // Check all datasets\n for (const dataSetName of Object.keys(this.dataSets)) {\n const dataSet = this.dataSets[dataSetName];\n\n // only visible datasets have hash trees set\n if (dataSet?.hashTree) {\n const existingVersion = dataSet.hashTree.getItemVersion(id, type);\n if (existingVersion !== undefined) {\n if (object.data) {\n // For updates: filter out if any dataset has a higher version\n if (existingVersion > version) {\n LoggerProxy.logger.info(\n `HashTreeParser#callLocusInfoUpdateCallback --> ${this.debugId} Filtering out update for ${type}:${id} v${version} because dataset \"${dataSetName}\" has v${existingVersion}`\n );\n\n return false;\n }\n } else if (existingVersion >= version) {\n // For removals: filter out if the object still exists in any dataset\n LoggerProxy.logger.info(\n `HashTreeParser#callLocusInfoUpdateCallback --> ${this.debugId} Filtering out removal for ${type}:${id} v${version} because dataset \"${dataSetName}\" still has v${existingVersion}`\n );\n\n return false;\n }\n }\n }\n }\n\n return true;\n });\n\n if (filteredUpdates.length > 0) {\n this.locusInfoUpdateCallback({updateType, updatedObjects: filteredUpdates});\n }\n } else if (updateType !== LocusInfoUpdateType.OBJECTS_UPDATED) {\n this.locusInfoUpdateCallback({updateType});\n }\n }\n\n /**\n * Calculates a weighted backoff time that should be used for syncs\n *\n * @param {Object} backoff - The backoff configuration containing maxMs and exponent\n * @returns {number} - A weighted backoff time based on the provided configuration, using algorithm supplied by Locus team\n */\n private getWeightedBackoffTime(backoff: {maxMs: number; exponent: number}): number {\n const {maxMs, exponent} = backoff;\n\n const randomValue = Math.random();\n\n return Math.round(randomValue ** exponent * maxMs);\n }\n\n /**\n * Performs a sync for the given data set.\n *\n * @param {InternalDataSet} dataSet - The data set to sync\n * @param {string} reason - The reason for the sync (used for logging)\n * @param {boolean} [isInitialization] - Whether this is an initialization sync (sends empty leaves data instead of comparing hashes)\n * @returns {Promise<void>}\n */\n private async performSync(\n dataSet: InternalDataSet,\n reason: string,\n isInitialization?: boolean\n ): Promise<void> {\n if (!dataSet.hashTree) {\n return;\n }\n\n const {hashTree} = dataSet;\n const rootHash = hashTree.getRootHash();\n\n try {\n LoggerProxy.logger.info(\n `HashTreeParser#performSync --> ${this.debugId} ${reason}, syncing data set \"${dataSet.name}\"`\n );\n\n let leavesData: Record<number, LeafDataItem[]> = {};\n\n if (!isInitialization) {\n if (dataSet.leafCount !== 1) {\n let receivedHashes;\n\n try {\n // request hashes from sender\n const hashesResult = await this.getHashesFromLocus(dataSet.name, rootHash);\n\n if (!hashesResult) {\n // hashes match, no sync needed\n return;\n }\n\n receivedHashes = hashesResult.hashes;\n\n hashTree.resize(hashesResult.dataSet.leafCount);\n } catch (error: any) {\n if (error?.statusCode === 409) {\n // this is a leaf count mismatch, we should do nothing, just wait for another heartbeat message from Locus\n LoggerProxy.logger.info(\n `HashTreeParser#getHashesFromLocus --> ${this.debugId} Got 409 when fetching hashes for data set \"${dataSet.name}\": ${error.message}`\n );\n\n return;\n }\n throw error;\n }\n\n // identify mismatched leaves\n const mismatchedLeaveIndexes = hashTree.diffHashes(receivedHashes);\n\n mismatchedLeaveIndexes.forEach((index) => {\n leavesData[index] = hashTree.getLeafData(index);\n });\n } else {\n leavesData = {0: hashTree.getLeafData(0)};\n }\n }\n // request sync for mismatched leaves\n let syncResponse: HashTreeMessage | null = null;\n\n if (isInitialization) {\n syncResponse = await this.sendSyncRequestToLocus(dataSet, {isInitialization: true});\n } else if (Object.keys(leavesData).length > 0) {\n syncResponse = await this.sendSyncRequestToLocus(dataSet, {\n mismatchedLeavesData: leavesData,\n });\n }\n\n // sync API may return nothing (in that case data will arrive via messages)\n // or it may return a response in the same format as messages\n // We still need to restart the sync timer as a safety net in case the messages don't arrive.\n this.runSyncAlgorithm(dataSet);\n\n if (syncResponse) {\n // the format of sync response is the same as messages, so we can reuse the same handler\n this.handleMessage(syncResponse, 'via sync API');\n }\n } catch (error) {\n if (error instanceof MeetingEndedError) {\n this.callLocusInfoUpdateCallback({\n updateType: LocusInfoUpdateType.MEETING_ENDED,\n });\n } else {\n LoggerProxy.logger.warn(\n `HashTreeParser#performSync --> ${this.debugId} error during sync for data set \"${dataSet.name}\":`,\n error\n );\n }\n }\n }\n\n /**\n * Enqueues a sync for the given data set. If the data set is already in the queue, the request is ignored.\n * This ensures that all syncs are executed sequentially and no more than 1 sync runs at a time.\n *\n * @param {string} dataSetName - The name of the data set to sync\n * @param {string} reason - The reason for the sync (used for logging)\n * @param {boolean} [isInitialization=false] - Whether this is an initialization sync (uses empty leaves data instead of hash comparison)\n * @returns {void}\n */\n private enqueueSyncForDataset(\n dataSetName: string,\n reason: string,\n isInitialization = false\n ): void {\n if (this.state === 'stopped') return;\n\n const existingEntry = this.syncQueue.find((entry) => entry.dataSetName === dataSetName);\n\n if (existingEntry) {\n if (isInitialization) {\n existingEntry.isInitialization = true;\n }\n LoggerProxy.logger.info(\n `HashTreeParser#enqueueSyncForDataset --> ${this.debugId} data set \"${dataSetName}\" already in sync queue, skipping`\n );\n\n return;\n }\n\n this.syncQueue.push({dataSetName, reason, isInitialization});\n\n if (!this.isSyncInProgress) {\n this.syncQueueProcessingPromise = this.processSyncQueue();\n }\n }\n\n /**\n * Processes the sync queue sequentially. Only one instance of this method runs at a time.\n *\n * @returns {Promise<void>}\n */\n private async processSyncQueue(): Promise<void> {\n if (this.isSyncInProgress) return;\n\n this.isSyncInProgress = true;\n try {\n while (this.syncQueue.length > 0 && this.state !== 'stopped') {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const {dataSetName, reason, isInitialization} = this.syncQueue.shift()!;\n const dataSet = this.dataSets[dataSetName];\n\n if (!dataSet?.hashTree) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n // eslint-disable-next-line no-await-in-loop\n await this.performSync(dataSet, reason, isInitialization);\n }\n } finally {\n this.isSyncInProgress = false;\n }\n }\n\n /**\n * Syncs all data sets that have hash trees, one by one in sequence, using the priority order\n * provided by sortByInitPriority(). Does nothing if the parser is stopped or if a syncAllDatasets\n * call is already in progress.\n *\n * @returns {Promise<void>}\n */\n public async syncAllDatasets(): Promise<void> {\n if (this.state === 'stopped') return;\n if (this.isSyncAllInProgress) return;\n\n this.isSyncAllInProgress = true;\n try {\n const dataSetsWithHashTrees = Object.values(this.dataSets)\n .filter((dataSet) => dataSet?.hashTree)\n .map((dataSet) => ({name: dataSet.name}));\n\n const sorted = sortByInitPriority(dataSetsWithHashTrees, DATA_SET_INIT_PRIORITY);\n\n LoggerProxy.logger.info(\n `HashTreeParser#syncAllDatasets --> ${this.debugId} syncing datasets: ${sorted\n .map((ds) => ds.name)\n .join(', ')}`\n );\n\n for (const ds of sorted) {\n this.enqueueSyncForDataset(ds.name, 'syncAllDatasets');\n }\n\n await this.syncQueueProcessingPromise;\n } finally {\n this.isSyncAllInProgress = false;\n }\n }\n\n /**\n * Runs the sync algorithm for the given data set.\n *\n * @param {DataSet} receivedDataSet - The data set to run the sync algorithm for.\n * @returns {void}\n */\n private runSyncAlgorithm(receivedDataSet: DataSet) {\n const dataSet = this.dataSets[receivedDataSet.name];\n\n if (!dataSet) {\n LoggerProxy.logger.warn(\n `HashTreeParser#runSyncAlgorithm --> ${this.debugId} No data set found for ${receivedDataSet.name}, skipping sync algorithm`\n );\n\n return;\n }\n\n if (!dataSet.hashTree) {\n LoggerProxy.logger.info(\n `HashTreeParser#runSyncAlgorithm --> ${this.debugId} Data set \"${dataSet.name}\" has no hash tree, skipping sync algorithm`\n );\n\n return;\n }\n\n dataSet.hashTree.resize(receivedDataSet.leafCount);\n\n const delay = dataSet.idleMs + this.getWeightedBackoffTime(dataSet.backoff);\n\n if (delay > 0) {\n if (dataSet.timer) {\n clearTimeout(dataSet.timer);\n }\n\n LoggerProxy.logger.info(\n `HashTreeParser#runSyncAlgorithm --> ${this.debugId} setting \"${dataSet.name}\" sync timer for ${delay}`\n );\n\n dataSet.timer = setTimeout(() => {\n dataSet.timer = undefined;\n\n if (!dataSet.hashTree) {\n LoggerProxy.logger.warn(\n `HashTreeParser#runSyncAlgorithm --> ${this.debugId} Data set \"${dataSet.name}\" no longer has a hash tree, cannot run sync algorithm`\n );\n\n return;\n }\n\n const rootHash = dataSet.hashTree.getRootHash();\n\n if (dataSet.root !== rootHash) {\n this.enqueueSyncForDataset(\n dataSet.name,\n `Root hash mismatch: received=${dataSet.root}, ours=${rootHash}`\n );\n } else {\n LoggerProxy.logger.info(\n `HashTreeParser#runSyncAlgorithm --> ${this.debugId} \"${dataSet.name}\" root hash matching: ${rootHash}, version=${dataSet.version}`\n );\n }\n }, delay);\n } else {\n LoggerProxy.logger.info(\n `HashTreeParser#runSyncAlgorithm --> ${this.debugId} No delay for \"${dataSet.name}\" data set, skipping sync timer reset/setup`\n );\n }\n }\n\n /**\n * Resets the heartbeat watchdog timers for the specified data sets. Each data set has its own\n * watchdog timer that monitors whether heartbeats are being received within the expected interval.\n * If a heartbeat is not received for a specific data set within heartbeatIntervalMs plus\n * a backoff-calculated time, the sync algorithm is initiated for that data set\n *\n * @param {Array<DataSet>} receivedDataSets - The data sets from the received message for which watchdog timers should be reset\n * @returns {void}\n */\n private resetHeartbeatWatchdogs(receivedDataSets: Array<DataSet>): void {\n if (!this.heartbeatIntervalMs) {\n return;\n }\n\n for (const receivedDataSet of receivedDataSets) {\n const dataSet = this.dataSets[receivedDataSet.name];\n\n if (!dataSet?.hashTree) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n if (dataSet.heartbeatWatchdogTimer) {\n clearTimeout(dataSet.heartbeatWatchdogTimer);\n dataSet.heartbeatWatchdogTimer = undefined;\n }\n\n const backoffTime = this.getWeightedBackoffTime(dataSet.backoff);\n const delay = this.heartbeatIntervalMs + backoffTime;\n\n dataSet.heartbeatWatchdogTimer = setTimeout(() => {\n dataSet.heartbeatWatchdogTimer = undefined;\n\n LoggerProxy.logger.warn(\n `HashTreeParser#resetHeartbeatWatchdogs --> ${this.debugId} Heartbeat watchdog fired for data set \"${dataSet.name}\" - no heartbeat received within expected interval, initiating sync`\n );\n\n this.enqueueSyncForDataset(dataSet.name, `heartbeat watchdog expired`);\n this.resetHeartbeatWatchdogs([dataSet]);\n }, delay);\n }\n }\n\n /**\n * Stops all timers for the data sets to prevent any further sync attempts.\n * @returns {void}\n */\n private stopAllTimers() {\n Object.values(this.dataSets).forEach((dataSet) => {\n if (dataSet.timer) {\n clearTimeout(dataSet.timer);\n dataSet.timer = undefined;\n }\n if (dataSet.heartbeatWatchdogTimer) {\n clearTimeout(dataSet.heartbeatWatchdogTimer);\n dataSet.heartbeatWatchdogTimer = undefined;\n }\n });\n }\n\n /**\n * Stops the HashTreeParser, preventing it from processing any further messages and clearing all timers.\n * It also clears all the hash trees, so if the parser is resumed later, it will need to do a sync\n * to be up-to-date.\n * @returns {void}\n */\n public stop() {\n LoggerProxy.logger.info(\n `HashTreeParser#stop --> ${this.debugId} Stopping HashTreeParser, clearing timers and hash trees`\n );\n this.stopAllTimers();\n this.syncQueue = [];\n Object.values(this.dataSets).forEach((dataSet) => {\n dataSet.hashTree = undefined;\n });\n this.visibleDataSets = [];\n this.state = 'stopped';\n }\n\n /**\n * Cleans up the HashTreeParser, stopping all timers and clearing all internal state.\n * After calling this, the parser should not be used anymore.\n * @returns {void}\n */\n public cleanUp() {\n this.stop();\n this.dataSets = {};\n }\n\n /**\n * Resumes the HashTreeParser that was previously stopped, using a hash tree message.\n * @param {HashTreeMessage} message - The message to resume with, it must contain metadata with visible data sets info\n * @returns {void}\n */\n public resumeFromMessage(message: HashTreeMessage) {\n // check that message contains metadata with visible data sets - this is essential to be able to resume\n const metadataObject = message.locusStateElements?.find((el) => isMetadata(el));\n\n if (!metadataObject?.data?.visibleDataSets) {\n LoggerProxy.logger.warn(\n `HashTreeParser#resumeFromMessage --> ${this.debugId} Cannot resume HashTreeParser because the message is missing metadata with visible data sets info`\n );\n\n return;\n }\n this.setVisibleDataSets(\n metadataObject.data.visibleDataSets as VisibleDataSetInfo[],\n message.dataSets\n );\n\n this.dataSets = {};\n\n for (const dataSet of message.dataSets) {\n const {name, leafCount} = dataSet;\n\n this.dataSets[name] = {\n ...dataSet,\n hashTree: this.isVisibleDataSet(name) ? new HashTree([], leafCount) : undefined,\n };\n }\n LoggerProxy.logger.info(\n `HashTreeParser#resumeFromMessage --> ${\n this.debugId\n } Resuming HashTreeParser with data sets: ${Object.keys(this.dataSets).join(\n ', '\n )}, visible data sets: ${this.visibleDataSets.map((ds) => ds.name).join(', ')}`\n );\n this.state = 'active';\n\n this.handleMessage(message, 'on resume');\n }\n\n /**\n * Resumes the HashTreeParser that was previously stopped, using a Locus API response.\n * Unlike resumeFromMessage(), this does not require metadata/dataSets in the input,\n * as it fetches all necessary information from Locus via initializeFromGetLociResponse.\n * @param {LocusDTO} locus - locus object from an API response\n * @returns {Promise}\n */\n public async resumeFromApiResponse(locus: LocusDTO) {\n this.state = 'active';\n this.dataSets = {};\n\n LoggerProxy.logger.info(\n `HashTreeParser#resumeFromApiResponse --> ${this.debugId} Resuming HashTreeParser from API response`\n );\n\n await this.initializeFromGetLociResponse(locus);\n }\n\n private checkForSentinelHttpResponse(error: any, dataSetName?: string) {\n const isValidDataSetForSentinel =\n dataSetName === undefined ||\n PossibleSentinelMessageDataSetNames.includes(dataSetName.toLowerCase());\n\n if (\n ((error.statusCode === 409 && error.body?.errorCode === 2403004) ||\n error.statusCode === 404) &&\n isValidDataSetForSentinel\n ) {\n LoggerProxy.logger.info(\n `HashTreeParser#checkForSentinelHttpResponse --> ${this.debugId} Received ${error.statusCode} for data set \"${dataSetName}\", indicating that the meeting has ended`\n );\n this.stopAllTimers();\n\n throw new MeetingEndedError();\n }\n }\n\n /**\n * Gets the current hashes from the locus for a specific data set.\n * @param {string} dataSetName\n * @param {string} currentRootHash\n * @returns {Object|null} An object containing the hashes and leaf count, or null if the hashes match and no sync is needed\n */\n private getHashesFromLocus(dataSetName: string, currentRootHash: string) {\n LoggerProxy.logger.info(\n `HashTreeParser#getHashesFromLocus --> ${this.debugId} Requesting hashes for data set \"${dataSetName}\"`\n );\n\n const dataSet = this.dataSets[dataSetName];\n\n const url = `${dataSet.url}/hashtree`;\n\n return this.webexRequest({\n method: HTTP_VERBS.GET,\n uri: url,\n qs: {\n rootHash: currentRootHash,\n },\n })\n .then((response) => {\n if (!response.body || isEmpty(response.body)) {\n // 204 with empty body means our hashes match Locus, no sync needed\n LoggerProxy.logger.info(\n `HashTreeParser#getHashesFromLocus --> ${this.debugId} Got ${response.statusCode} with empty body for data set \"${dataSetName}\", hashes match - no sync needed`\n );\n\n return null;\n }\n\n const hashes = response.body?.hashes as string[] | undefined;\n const dataSetFromResponse = response.body?.dataSet;\n\n if (!hashes || !Array.isArray(hashes)) {\n LoggerProxy.logger.warn(\n `HashTreeParser#getHashesFromLocus --> ${this.debugId} Locus returned invalid hashes, response body=`,\n response.body\n );\n throw new Error(`Locus returned invalid hashes: ${hashes}`);\n }\n\n LoggerProxy.logger.info(\n `HashTreeParser#getHashesFromLocus --> ${\n this.debugId\n } Received hashes for data set \"${dataSetName}\": ${JSON.stringify(hashes)}`\n );\n\n return {\n hashes,\n dataSet: dataSetFromResponse as DataSet,\n };\n })\n .catch((error) => {\n LoggerProxy.logger.error(\n `HashTreeParser#getHashesFromLocus --> ${this.debugId} Error ${error.statusCode} fetching hashes for data set \"${dataSetName}\":`,\n error\n );\n this.checkForSentinelHttpResponse(error, dataSet.name);\n\n throw error;\n });\n }\n\n /**\n * Sends a sync request to Locus for the specified data set.\n *\n * @param {InternalDataSet} dataSet The data set to sync.\n * @param {Object} options Either `{ isInitialization: true }` for init syncs (uses leafCount=1 with empty leaf data) or `{ mismatchedLeavesData }` for normal syncs.\n * @returns {Promise<HashTreeMessage|null>}\n */\n private sendSyncRequestToLocus(\n dataSet: InternalDataSet,\n options: {isInitialization: true} | {mismatchedLeavesData: Record<number, LeafDataItem[]>}\n ): Promise<HashTreeMessage | null> {\n LoggerProxy.logger.info(\n `HashTreeParser#sendSyncRequestToLocus --> ${this.debugId} Sending sync request for data set \"${dataSet.name}\"`\n );\n\n const isInitialization = 'isInitialization' in options;\n\n const url = `${dataSet.url}/sync`;\n const body: {\n leafCount: number;\n leafDataEntries: {leafIndex: number; elementIds: LeafDataItem[]}[];\n } = {\n leafCount: isInitialization ? 1 : dataSet.leafCount,\n leafDataEntries: [],\n };\n\n if (isInitialization) {\n // initialization sync: Locus requires leafCount=1 with a single empty leaf\n body.leafDataEntries.push({leafIndex: 0, elementIds: []});\n } else {\n const {mismatchedLeavesData} = options;\n\n Object.keys(mismatchedLeavesData).forEach((index) => {\n const leafIndex = parseInt(index, 10);\n\n body.leafDataEntries.push({\n leafIndex,\n elementIds: mismatchedLeavesData[leafIndex],\n });\n });\n }\n\n const ourCurrentRootHash = dataSet.hashTree ? dataSet.hashTree.getRootHash() : EMPTY_HASH;\n\n return this.webexRequest({\n method: HTTP_VERBS.POST,\n uri: url,\n qs: {\n rootHash: ourCurrentRootHash,\n },\n body,\n })\n .then((resp) => {\n LoggerProxy.logger.info(\n `HashTreeParser#sendSyncRequestToLocus --> ${this.debugId} Sync request succeeded for \"${dataSet.name}\"`\n );\n\n if (!resp.body || isEmpty(resp.body)) {\n LoggerProxy.logger.info(\n `HashTreeParser#sendSyncRequestToLocus --> ${this.debugId} Got ${resp.statusCode} with empty body for sync request for data set \"${dataSet.name}\", data should arrive via messages`\n );\n\n return null;\n }\n\n return resp.body as HashTreeMessage;\n })\n .catch((error) => {\n LoggerProxy.logger.error(\n `HashTreeParser#sendSyncRequestToLocus --> ${this.debugId} Error ${error.statusCode} sending sync request for data set \"${dataSet.name}\":`,\n error\n );\n this.checkForSentinelHttpResponse(error, dataSet.name);\n\n throw error;\n });\n }\n}\n\nexport default HashTreeParser;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_lodash","require","_hashTree","_interopRequireDefault","_loggerProxy","_metrics","_constants","_constants2","_constants3","_types","_utils","ownKeys","e","r","t","_Object$keys4","_Object$getOwnPropertySymbols","o","filter","_Object$getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","Object","forEach","_defineProperty2","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty","_createForOfIteratorHelper","_Symbol","_Symbol$iterator","_Array$isArray2","_unsupportedIterableToArray","_n","F","s","n","done","value","f","TypeError","a","u","call","next","return","_arrayLikeToArray","toString","slice","constructor","name","_Array$from","test","Array","_callSuper","_getPrototypeOf2","_possibleConstructorReturn2","_isNativeReflectConstruct","_Reflect$construct","Boolean","prototype","valueOf","LocusInfoUpdateType","exports","OBJECTS_UPDATED","MEETING_ENDED","MeetingEndedError","_Error","_classCallCheck2","_inherits2","_createClass2","_wrapNativeSuper2","Error","MetadataDataSetName","DataSetNames","SELF","PossibleSentinelMessageDataSetNames","MAIN","UNJOINED","HashTreeParser","options","_locus$links","_locus$links$resource","_locus$links$resource2","_options$metadata","_options$metadata2","_options$metadata2$vi","_promise","resolve","_options$initialLocus","initialLocus","dataSets","locus","debugId","webexRequest","locusInfoUpdateCallback","excludedDataSets","visibleDataSetsUrl","links","resources","visibleDataSets","url","setVisibleDataSets","metadata","state","LoggerProxy","logger","warn","concat","leafData","analyzeLocusHtMeta","analyzeMetadata","info","_stringify","map","ds","vds","_iterator","_step","dataSet","leafCount","hashTree","isVisibleDataSet","HashTree","undefined","err","key","_this","cloneDeep","isExcludedDataSet","some","dataSetName","addToVisibleDataSetsList","dataSetInfo","_initializeNewVisibleDataSet","_asyncToGenerator2","_regenerator","mark","_callee","visibleDataSetInfo","wrap","_context","prev","abrupt","enqueueSyncForDataset","syncQueueProcessingPromise","stop","initializeNewVisibleDataSet","_x","_x2","getAllVisibleDataSetsFromLocus","_this2","method","HTTP_VERBS","GET","uri","then","response","body","catch","error","checkForSentinelHttpResponse","_initializeFromMessage","_callee2","message","_context2","sent","initializeDataSets","initializeFromMessage","_x3","_initializeFromGetLociResponse","_callee3","_locus$links2","_locus$links2$resourc","_locus$links2$resourc2","_context3","initializeFromGetLociResponse","_x4","_initializeDataSets","_callee4","debugText","_iterator2","_step2","_t","_context4","sortByInitPriority","DATA_SET_INIT_PRIORITY","finish","_x5","_x6","_ref","_ref$copyData","copyData","leafInfo","findAndStoreMetaData","currentLocusPart","currentLocusPartName","_typeof2","htMeta","dataSetNames","_currentLocusPart$htM","elementId","type","id","version","newLeafInfo","toLowerCase","ObjectType","control","data","deleteNestedObjectsWithHtMeta","_iterator3","_step3","_isArray","_iterator4","entries","_step4","_step4$value","_slicedToArray2","index","item","_i","_Object$keys","_keys","hasOwnProperty","_htMeta$dataSetNames","_metadata$htMeta$elem","join","isEndMessage","_this3","root","EMPTY_HASH","includes","handleRootHashHeartBeatMessage","_this4","_ref2","updateDataSetInfo","runSyncAlgorithm","queueInitForNewVisibleDataSets","dataSetsRequiringInitialization","_this5","queueMicrotask","initializeNewVisibleDataSets","callLocusInfoUpdateCallback","updateType","handleMetadataUpdate","updatedObjects","_this$dataSets$Metada","metadataUpdated","putItem","metadataObject","_this$checkForVisible","checkForVisibleDataSetChanges","changeDetected","removedDataSets","addedDataSets","processVisibleDataSetChanges","handleLocusUpdate","update","_this6","_iterator5","_step5","appliedChangesList","putItems","leaf","zip","_ref3","_ref4","changeApplied","receivedDataSet","idleMs","backoff","maxMs","exponent","updateDataSetLeafCount","newLeafCount","_dataSet$hashTree","resize","_this7","object","_object$data","isMetadata","newVisibleDataSets","nvs","every","deleteHashTree","timer","clearTimeout","heartbeatWatchdogTimer","_this8","removedObjects","_this8$dataSets$ds$na","i","numLeaves","_toConsumableArray2","getLeafData","rds","_iterator6","_step6","_initializeNewVisibleDataSets","_callee5","_this9","allDataSets","_iterator7","_step7","_loop","_t2","_context6","_context5","find","d","delegateYield","_x7","parseMessage","_message$locusStateEl","_this0","locusStateElements","metadataUpdates","updatedMetadataObjects","_iterator8","_step8","_this0$dataSets$dataS","_this$checkForVisible2","locusStateElementsForThisSet","updateItems","operation","_ref5","_ref6","handleMessage","heartbeatIntervalMs","stopAllTimers","resetHeartbeatWatchdogs","updates","_updates$updatedObjec","_this1","filteredUpdates","_i2","_Object$keys3","existingVersion","getItemVersion","getWeightedBackoffTime","randomValue","Math","random","round","pow","_performSync","_callee6","reason","isInitialization","rootHash","leavesData","receivedHashes","hashesResult","mismatchedLeaveIndexes","syncResponse","_t3","_t4","_context7","getRootHash","getHashesFromLocus","hashes","statusCode","diffHashes","sendSyncRequestToLocus","mismatchedLeavesData","performSync","_x8","_x9","_x0","existingEntry","syncQueue","entry","isSyncInProgress","processSyncQueue","_processSyncQueue","_callee7","_ref7","_context8","shift","_syncAllDatasets","_callee8","dataSetsWithHashTrees","sorted","_iterator9","_step9","_context9","isSyncAllInProgress","_values","syncAllDatasets","_this10","delay","setTimeout","receivedDataSets","_this11","_iterator0","_step0","_loop2","backoffTime","cleanUp","resumeFromMessage","_message$locusStateEl2","_metadataObject$data","el","_iterator1","_step1","_resumeFromApiResponse","_callee9","_context0","resumeFromApiResponse","_x1","_error$body","isValidDataSetForSentinel","errorCode","currentRootHash","_this12","qs","_response$body","_response$body2","isEmpty","dataSetFromResponse","Metrics","sendBehavioralMetric","BEHAVIORAL_METRICS","HASH_TREE_SYNC_FAILURE","request","_this13","leafDataEntries","leafIndex","elementIds","_parseInt2","ourCurrentRootHash","POST","resp","_default"],"sources":["hashTreeParser.ts"],"sourcesContent":["import {cloneDeep, isEmpty, zip} from 'lodash';\nimport HashTree, {LeafDataItem} from './hashTree';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport Metrics from '../metrics';\nimport BEHAVIORAL_METRICS from '../metrics/constants';\nimport {Enum, HTTP_VERBS} from '../constants';\nimport {DataSetNames, DATA_SET_INIT_PRIORITY, EMPTY_HASH} from './constants';\nimport {ObjectType, HtMeta, HashTreeObject} from './types';\nimport {LocusDTO} from '../locus-info/types';\nimport {deleteNestedObjectsWithHtMeta, isMetadata, sortByInitPriority} from './utils';\n\nexport interface DataSet {\n url: string;\n root: string;\n version: number;\n leafCount: number;\n name: string;\n idleMs: number;\n backoff: {\n maxMs: number;\n exponent: number;\n };\n}\n\nexport interface RootHashMessage {\n dataSets: Array<DataSet>;\n}\nexport interface HashTreeMessage {\n dataSets: Array<DataSet>;\n visibleDataSetsUrl: string; // url from which we can get more info about all data sets - now it seems to be visibleDataSetsUrl\n locusStateElements?: Array<HashTreeObject>;\n locusSessionId?: string;\n locusUrl: string;\n heartbeatIntervalMs?: number;\n}\n\nexport interface VisibleDataSetInfo {\n name: string;\n url: string;\n dataChannelUrl?: string;\n}\n\nexport interface Metadata {\n htMeta: HtMeta;\n visibleDataSets: VisibleDataSetInfo[];\n}\n\ninterface InternalDataSet extends DataSet {\n hashTree?: HashTree; // set only for visible data sets\n timer?: ReturnType<typeof setTimeout>;\n heartbeatWatchdogTimer?: ReturnType<typeof setTimeout>;\n}\n\ntype WebexRequestMethod = (options: Record<string, any>) => Promise<any>;\n\nexport const LocusInfoUpdateType = {\n OBJECTS_UPDATED: 'OBJECTS_UPDATED',\n MEETING_ENDED: 'MEETING_ENDED',\n} as const;\n\nexport type LocusInfoUpdateType = Enum<typeof LocusInfoUpdateType>;\nexport type LocusInfoUpdate =\n | {\n updateType: typeof LocusInfoUpdateType.OBJECTS_UPDATED;\n updatedObjects: HashTreeObject[];\n }\n | {\n updateType: typeof LocusInfoUpdateType.MEETING_ENDED;\n };\nexport type LocusInfoUpdateCallback = (update: LocusInfoUpdate) => void;\n\ninterface LeafInfo {\n type: ObjectType;\n id: number;\n version: number;\n data?: any;\n}\n\n/**\n * This error is thrown if we receive information that the meeting has ended while we're processing some hash messages.\n * It's handled internally by HashTreeParser and results in MEETING_ENDED being sent up.\n */\nexport class MeetingEndedError extends Error {}\n\n/* Currently Locus always sends Metadata objects only in the \"self\" dataset.\n * If this ever changes, update all the code that relies on this constant.\n */\nconst MetadataDataSetName = DataSetNames.SELF;\n\nconst PossibleSentinelMessageDataSetNames = [\n DataSetNames.MAIN,\n DataSetNames.SELF,\n DataSetNames.UNJOINED,\n];\n\n/**\n * Parses hash tree eventing locus data\n */\nclass HashTreeParser {\n dataSets: Record<string, InternalDataSet> = {};\n visibleDataSetsUrl: string; // url from which we can get info about all data sets\n webexRequest: WebexRequestMethod;\n locusInfoUpdateCallback: LocusInfoUpdateCallback;\n visibleDataSets: VisibleDataSetInfo[];\n debugId: string;\n heartbeatIntervalMs?: number;\n private excludedDataSets: string[];\n state: 'active' | 'stopped';\n private syncQueue: Array<{dataSetName: string; reason: string; isInitialization?: boolean}> = [];\n private isSyncInProgress = false;\n private isSyncAllInProgress = false;\n private syncQueueProcessingPromise: Promise<void> = Promise.resolve();\n\n /**\n * Constructor for HashTreeParser\n * @param {Object} options\n * @param {Object} options.initialLocus The initial locus data containing the hash tree information\n */\n constructor(options: {\n initialLocus: {\n dataSets: Array<DataSet>;\n locus: any;\n };\n metadata: Metadata | null;\n webexRequest: WebexRequestMethod;\n locusInfoUpdateCallback: LocusInfoUpdateCallback;\n debugId: string;\n excludedDataSets?: string[];\n }) {\n const {dataSets, locus} = options.initialLocus; // extract dataSets from initialLocus\n\n this.debugId = options.debugId;\n this.webexRequest = options.webexRequest;\n this.locusInfoUpdateCallback = options.locusInfoUpdateCallback;\n this.excludedDataSets = options.excludedDataSets || [];\n this.visibleDataSetsUrl = locus?.links?.resources?.visibleDataSets?.url;\n this.setVisibleDataSets(options.metadata?.visibleDataSets || [], dataSets);\n\n this.state = 'active';\n\n if (options.metadata?.visibleDataSets?.length === 0) {\n LoggerProxy.logger.warn(\n `HashTreeParser#constructor --> ${this.debugId} No visibleDataSets found in Metadata`\n );\n }\n // object mapping dataset names to arrays of leaf data\n const leafData = this.analyzeLocusHtMeta(locus);\n\n if (options.metadata) {\n // add also the metadata that's outside of locus object itself\n this.analyzeMetadata(leafData, options.metadata);\n }\n\n LoggerProxy.logger.info(\n `HashTreeParser#constructor --> ${\n this.debugId\n } creating HashTreeParser for datasets: ${JSON.stringify(\n dataSets.map((ds) => ds.name)\n )} with visible datasets: ${JSON.stringify(this.visibleDataSets.map((vds) => vds.name))}`\n );\n\n for (const dataSet of dataSets) {\n const {name, leafCount} = dataSet;\n\n this.dataSets[name] = {\n ...dataSet,\n hashTree: this.isVisibleDataSet(name)\n ? new HashTree(leafData[name] || [], leafCount)\n : undefined,\n };\n }\n }\n\n /**\n * Sets the visible data sets list for the HashTreeParser. This method should be called only at the start, to initialize\n * the visible data sets, before any message processsing, so for example from the constructor or when resuming the parser.\n *\n * @param {Array<VisibleDataSetInfo>} visibleDataSets - The visible data sets to set\n * @param {Array<DataSet>} dataSets - The \"dataSets\" list from Locus (yes, Locus sends visibleDataSets and dataSets as separate lists and they can differ)\n * @returns {void}\n */\n private setVisibleDataSets(visibleDataSets: VisibleDataSetInfo[], dataSets: Array<DataSet>) {\n this.visibleDataSets = cloneDeep(visibleDataSets).filter(\n (vds) =>\n // exclude data sets we will never care about\n !this.isExcludedDataSet(vds.name) &&\n // and make sure that visibleDataSets list is consistent with dataSets list\n dataSets.some((ds) => ds.name === vds.name)\n );\n }\n\n /**\n * Checks if the given data set name is in the list of visible data sets\n * @param {string} dataSetName data set name to check\n * @returns {Boolean} True if the data set is visible, false otherwise\n */\n private isVisibleDataSet(dataSetName: string): boolean {\n return this.visibleDataSets.some((vds) => vds.name === dataSetName);\n }\n\n /**\n * Checks if the given data set name is in the excluded list\n * @param {string} dataSetName data set name to check\n * @returns {boolean} True if the data set is excluded, false otherwise\n */\n private isExcludedDataSet(dataSetName: string): boolean {\n return this.excludedDataSets.some((name) => name === dataSetName);\n }\n\n /**\n * Adds a data set to the visible data sets list, unless it is in the excluded list.\n * @param {VisibleDataSetInfo} dataSetInfo data set info to add\n * @returns {boolean} True if the data set was added, false if it was excluded\n */\n private addToVisibleDataSetsList(dataSetInfo: VisibleDataSetInfo): boolean {\n if (this.isExcludedDataSet(dataSetInfo.name)) {\n LoggerProxy.logger.info(\n `HashTreeParser#addToVisibleDataSetsList --> ${this.debugId} Data set \"${dataSetInfo.name}\" is in the excluded list, ignoring`\n );\n\n return false;\n }\n\n this.visibleDataSets.push(dataSetInfo);\n\n return true;\n }\n\n /**\n * Initializes a new visible data set by creating a hash tree for it, adding it to all the internal structures,\n * and sending an initial sync request to Locus with empty leaf data - that will trigger Locus to gives us all the data\n * from that dataset (in the response or via messages).\n *\n * @param {VisibleDataSetInfo} visibleDataSetInfo Information about the new visible data set\n * @param {DataSet} dataSetInfo The new data set to be added\n * @returns {Promise}\n */\n private async initializeNewVisibleDataSet(\n visibleDataSetInfo: VisibleDataSetInfo,\n dataSetInfo: DataSet\n ): Promise<void> {\n if (this.isVisibleDataSet(dataSetInfo.name)) {\n LoggerProxy.logger.info(\n `HashTreeParser#initializeNewVisibleDataSet --> ${this.debugId} Data set \"${dataSetInfo.name}\" already exists, skipping init`\n );\n\n return;\n }\n\n LoggerProxy.logger.info(\n `HashTreeParser#initializeNewVisibleDataSet --> ${this.debugId} Adding visible data set \"${dataSetInfo.name}\"`\n );\n\n if (!this.addToVisibleDataSetsList(visibleDataSetInfo)) {\n return;\n }\n\n const hashTree = new HashTree([], dataSetInfo.leafCount);\n\n this.dataSets[dataSetInfo.name] = {\n ...dataSetInfo,\n hashTree,\n };\n\n this.enqueueSyncForDataset(dataSetInfo.name, 'new visible data set initialization', true);\n await this.syncQueueProcessingPromise;\n }\n\n /**\n * Queries Locus for all up-to-date information about all visible data sets\n *\n * @returns {Promise}\n */\n private getAllVisibleDataSetsFromLocus() {\n if (!this.visibleDataSetsUrl) {\n LoggerProxy.logger.warn(\n `HashTreeParser#getAllVisibleDataSetsFromLocus --> ${this.debugId} No visibleDataSetsUrl, cannot get data sets information`\n );\n\n return Promise.resolve([]);\n }\n\n return this.webexRequest({\n method: HTTP_VERBS.GET,\n uri: this.visibleDataSetsUrl,\n })\n .then((response) => {\n return response.body.dataSets as Array<DataSet>;\n })\n .catch((error) => {\n this.checkForSentinelHttpResponse(error);\n\n throw error;\n });\n }\n\n /**\n * Initializes the hash tree parser from a message received from Locus.\n *\n * @param {HashTreeMessage} message - initial hash tree message received from Locus\n * @returns {Promise}\n */\n async initializeFromMessage(message: HashTreeMessage) {\n this.visibleDataSetsUrl = message.visibleDataSetsUrl;\n\n LoggerProxy.logger.info(\n `HashTreeParser#initializeFromMessage --> ${this.debugId} visibleDataSetsUrl=${this.visibleDataSetsUrl}`\n );\n const visibleDataSets = await this.getAllVisibleDataSetsFromLocus();\n\n await this.initializeDataSets(visibleDataSets, 'initialization from message');\n }\n\n /**\n * Initializes the hash tree parser from GET /loci API response by fetching all data sets metadata\n * first and then doing an initialization sync on each data set\n *\n * This function requires that this.visibleDataSets have been already populated correctly by the constructor.\n *\n * @param {LocusDTO} locus - locus object received from GET /loci\n * @returns {Promise}\n */\n async initializeFromGetLociResponse(locus: LocusDTO) {\n if (!locus?.links?.resources?.visibleDataSets?.url) {\n LoggerProxy.logger.warn(\n `HashTreeParser#initializeFromGetLociResponse --> ${this.debugId} missing visibleDataSets url in GET Loci response, cannot initialize hash trees`\n );\n\n return;\n }\n this.visibleDataSetsUrl = locus.links.resources.visibleDataSets.url;\n\n LoggerProxy.logger.info(\n `HashTreeParser#initializeFromGetLociResponse --> ${this.debugId} visibleDataSets url: ${this.visibleDataSetsUrl}`\n );\n\n const visibleDataSets = await this.getAllVisibleDataSetsFromLocus();\n\n await this.initializeDataSets(visibleDataSets, 'initialization from GET /loci response');\n }\n\n /**\n * Initializes data sets by doing an initialization sync on each visible data set that doesn't have a hash tree yet.\n *\n * @param {DataSet[]} visibleDataSets Array of visible DataSet objects to initialize\n * @param {string} debugText Text to include in logs for debugging purposes\n * @returns {Promise}\n */\n private async initializeDataSets(visibleDataSets: Array<DataSet>, debugText: string) {\n if (this.state === 'stopped') {\n return;\n }\n\n for (const dataSet of sortByInitPriority(visibleDataSets, DATA_SET_INIT_PRIORITY)) {\n const {name, leafCount, url} = dataSet;\n\n if (!this.dataSets[name]) {\n LoggerProxy.logger.info(\n `HashTreeParser#initializeDataSets --> ${this.debugId} initializing dataset \"${name}\" (${debugText})`\n );\n\n this.dataSets[name] = {\n ...dataSet,\n };\n } else {\n LoggerProxy.logger.info(\n `HashTreeParser#initializeDataSets --> ${this.debugId} dataset \"${name}\" already exists (${debugText})`\n );\n }\n\n if (!this.isVisibleDataSet(name)) {\n if (\n !this.addToVisibleDataSetsList({\n name,\n url,\n })\n ) {\n // dataset is excluded, skip it\n // eslint-disable-next-line no-continue\n continue;\n }\n }\n\n if (!this.dataSets[name].hashTree) {\n LoggerProxy.logger.info(\n `HashTreeParser#initializeDataSets --> ${this.debugId} creating hash tree for visible dataset \"${name}\" (${debugText})`\n );\n this.dataSets[name].hashTree = new HashTree([], leafCount);\n\n this.enqueueSyncForDataset(name, `initialization sync for ${debugText}`, true);\n }\n }\n\n // wait for all enqueued initialization syncs to complete\n await this.syncQueueProcessingPromise;\n }\n\n /**\n * Each dataset exists at a different place in the dto\n * iterate recursively over the locus and if it has a htMeta key,\n * create an object with the type, id and version and add it to the appropriate leafData array\n *\n * @param {any} locus - The current part of the locus being processed\n * @param {Object} [options]\n * @param {boolean} [options.copyData=false] - Whether to copy the data for each leaf into returned result\n * @returns {any} - An object mapping dataset names to arrays of leaf data\n */\n private analyzeLocusHtMeta(locus: any, options?: {copyData?: boolean}) {\n const {copyData = false} = options || {};\n // object mapping dataset names to arrays of leaf data\n const leafInfo: Record<string, Array<LeafInfo>> = {};\n\n const findAndStoreMetaData = (currentLocusPart: any, currentLocusPartName: string) => {\n if (typeof currentLocusPart !== 'object' || currentLocusPart === null) {\n return;\n }\n\n if (currentLocusPart.htMeta && currentLocusPart.htMeta.dataSetNames) {\n const {type, id, version} = currentLocusPart.htMeta.elementId;\n const {dataSetNames} = currentLocusPart.htMeta;\n const newLeafInfo: LeafInfo = {\n type,\n id,\n version,\n };\n\n if (copyData) {\n if ((type as string).toLowerCase() === ObjectType.control) {\n // control entries require special handling, because they are signalled by Locus\n // differently when coming in messages vs API responses\n newLeafInfo.data = {\n [currentLocusPartName]: cloneDeep(currentLocusPart),\n };\n } else {\n newLeafInfo.data = cloneDeep(currentLocusPart);\n\n // remove any nested other objects that have their own htMeta\n deleteNestedObjectsWithHtMeta(newLeafInfo.data);\n }\n }\n\n for (const dataSetName of dataSetNames) {\n if (!leafInfo[dataSetName]) {\n leafInfo[dataSetName] = [];\n }\n leafInfo[dataSetName].push(newLeafInfo);\n }\n }\n\n if (Array.isArray(currentLocusPart)) {\n for (const [index, item] of currentLocusPart.entries()) {\n findAndStoreMetaData(item, index.toString());\n }\n } else {\n for (const key of Object.keys(currentLocusPart)) {\n if (Object.prototype.hasOwnProperty.call(currentLocusPart, key)) {\n findAndStoreMetaData(currentLocusPart[key], key);\n }\n }\n }\n };\n\n findAndStoreMetaData(locus, 'locus');\n\n return leafInfo;\n }\n\n /**\n * Analyzes the Metadata object that is sent outside of Locus object, and appends its data to passed in leafInfo\n * structure.\n *\n * @param {Record<string, LeafInfo[]>} leafInfo the structure to which the Metadata info will be appended\n * @param {Metadata} metadata Metadata object\n * @returns {void}\n */\n private analyzeMetadata(leafInfo: Record<string, LeafInfo[]>, metadata: Metadata) {\n const {htMeta} = metadata;\n\n if (\n htMeta?.dataSetNames?.length === 1 &&\n htMeta.dataSetNames[0].toLowerCase() === MetadataDataSetName\n ) {\n const {type, id, version} = metadata.htMeta.elementId;\n\n const dataSetName = htMeta.dataSetNames[0];\n\n if (!leafInfo[dataSetName]) {\n leafInfo[dataSetName] = [];\n }\n\n leafInfo[dataSetName].push({\n type,\n id,\n version,\n });\n } else {\n throw new Error(\n `${this.debugId} Metadata htMeta has unexpected dataSetNames: ${\n htMeta && htMeta.dataSetNames.join(',')\n }`\n );\n }\n }\n\n /**\n * Checks if the provided hash tree message indicates the end of the meeting and that there won't be any more updates.\n *\n * @param {HashTreeMessage} message - The hash tree message to check\n * @returns {boolean} - Returns true if the message indicates the end of the meeting, false otherwise\n */\n private isEndMessage(message: HashTreeMessage) {\n return message.dataSets.some((dataSet) => {\n if (\n dataSet.leafCount === 1 &&\n dataSet.root === EMPTY_HASH &&\n (!this.dataSets[dataSet.name] || this.dataSets[dataSet.name].version < dataSet.version) &&\n PossibleSentinelMessageDataSetNames.includes(dataSet.name.toLowerCase())\n ) {\n // this is a special way for Locus to indicate that this meeting has ended\n return true;\n }\n\n return false;\n });\n }\n\n /**\n * Handles the root hash heartbeat message\n *\n * @param {RootHashMessage} message - The root hash heartbeat message\n * @returns {void}\n */\n private handleRootHashHeartBeatMessage(message: RootHashMessage): void {\n const {dataSets} = message;\n\n LoggerProxy.logger.info(\n `HashTreeParser#handleRootHashMessage --> ${\n this.debugId\n } Received heartbeat root hash message with data sets: ${JSON.stringify(\n dataSets.map(({name, root, leafCount, version}) => ({\n name,\n root,\n leafCount,\n version,\n }))\n )}`\n );\n\n dataSets.forEach((dataSet) => {\n this.updateDataSetInfo(dataSet);\n this.runSyncAlgorithm(dataSet);\n });\n }\n\n /**\n * Asynchronously initializes new visible data sets\n *\n * @param {VisibleDataSetInfo[]} dataSetsRequiringInitialization list of datasets to initialize\n * @returns {void}\n */\n private queueInitForNewVisibleDataSets(dataSetsRequiringInitialization: VisibleDataSetInfo[]) {\n LoggerProxy.logger.info(\n `HashTreeParser#queueInitForNewVisibleDataSets --> ${\n this.debugId\n } queuing initialization of new visible datasets: ${dataSetsRequiringInitialization\n .map((ds) => ds.name)\n .join(', ')}`\n );\n queueMicrotask(() => {\n this.initializeNewVisibleDataSets(dataSetsRequiringInitialization).catch((error) => {\n if (error instanceof MeetingEndedError) {\n this.callLocusInfoUpdateCallback({\n updateType: LocusInfoUpdateType.MEETING_ENDED,\n });\n } else {\n LoggerProxy.logger.warn(\n `HashTreeParser#queueInitForNewVisibleDataSets --> ${\n this.debugId\n } error while initializing new visible datasets: ${dataSetsRequiringInitialization\n .map((ds) => ds.name)\n .join(', ')}: `,\n error\n );\n }\n });\n });\n }\n\n /**\n * Handles updates to Metadata object that we receive from Locus via other means than messages. Right now\n * that means only in the API response alongside locus object.\n *\n * @param {Metadata} metadata received in Locus update other than a message (for example in an API response)\n * @param {HashTreeObject[]} updatedObjects a list of updated hash tree objects to which any updates resulting from new Metadata will be added\n * @returns {void}\n */\n handleMetadataUpdate(metadata: Metadata, updatedObjects: HashTreeObject[]): void {\n let dataSetsRequiringInitialization: VisibleDataSetInfo[] = [];\n\n // current assumption based on Locus docs is that Metadata object lives always in \"self\" data set\n const hashTree = this.dataSets[MetadataDataSetName]?.hashTree;\n\n if (!hashTree) {\n LoggerProxy.logger.warn(\n `HashTreeParser#handleLocusUpdate --> ${this.debugId} received Metadata object but no hash tree for \"${MetadataDataSetName}\" data set exists`\n );\n } else {\n const metadataUpdated = hashTree.putItem(metadata.htMeta.elementId);\n\n if (metadataUpdated) {\n // metadata in Locus API response is in a slightly different format than the objects in messages, so need to adapt it\n const metadataObject: HashTreeObject = {\n htMeta: metadata.htMeta,\n data: metadata,\n };\n\n updatedObjects.push(metadataObject);\n\n const {changeDetected, removedDataSets, addedDataSets} = this.checkForVisibleDataSetChanges(\n [metadataObject]\n );\n\n if (changeDetected) {\n dataSetsRequiringInitialization = this.processVisibleDataSetChanges(\n removedDataSets,\n addedDataSets,\n updatedObjects\n );\n }\n\n if (dataSetsRequiringInitialization.length > 0) {\n // there are some data sets that we need to initialize asynchronously\n this.queueInitForNewVisibleDataSets(dataSetsRequiringInitialization);\n }\n }\n }\n }\n\n /**\n * This method should be called when we receive a partial locus DTO that contains dataSets and htMeta information\n * It updates the hash trees with the new leaf data based on the received Locus\n *\n * @param {Object} update - The locus update containing data sets and locus information\n * @returns {void}\n */\n handleLocusUpdate(update: {dataSets?: Array<DataSet>; locus: any; metadata?: Metadata}): void {\n if (this.state === 'stopped') {\n return;\n }\n\n const {dataSets, locus, metadata} = update;\n\n if (!dataSets) {\n // this happens for example when we handle GET /loci response\n LoggerProxy.logger.info(\n `HashTreeParser#handleLocusUpdate --> ${this.debugId} received hash tree update without dataSets`\n );\n } else {\n for (const dataSet of dataSets) {\n this.updateDataSetInfo(dataSet);\n }\n }\n const updatedObjects: HashTreeObject[] = [];\n\n // first, analyze the locus object to extract the hash tree objects' htMeta and data from it\n const leafInfo = this.analyzeLocusHtMeta(locus, {copyData: true});\n\n // if we got metadata, process it (currently that means only potential visible data set list changes)\n if (metadata) {\n this.handleMetadataUpdate(metadata, updatedObjects);\n }\n\n // then process the data in hash trees, if it is a new version, then add it to updatedObjects\n Object.keys(leafInfo).forEach((dataSetName) => {\n if (this.dataSets[dataSetName]) {\n if (this.dataSets[dataSetName].hashTree) {\n const appliedChangesList = this.dataSets[dataSetName].hashTree.putItems(\n leafInfo[dataSetName].map((leaf) => ({\n id: leaf.id,\n type: leaf.type,\n version: leaf.version,\n }))\n );\n\n zip(appliedChangesList, leafInfo[dataSetName]).forEach(([changeApplied, leaf]) => {\n if (changeApplied) {\n updatedObjects.push({\n htMeta: {\n elementId: {\n type: leaf.type,\n id: leaf.id,\n version: leaf.version,\n },\n dataSetNames: [dataSetName],\n },\n data: leaf.data,\n });\n }\n });\n } else {\n // no hash tree means that the data set is not visible\n LoggerProxy.logger.warn(\n `HashTreeParser#handleLocusUpdate --> ${this.debugId} received leaf data for data set \"${dataSetName}\" that has no hash tree created, ignoring`\n );\n }\n } else {\n LoggerProxy.logger.info(\n `HashTreeParser#handleLocusUpdate --> ${this.debugId} received leaf data for unknown data set \"${dataSetName}\", ignoring`\n );\n }\n });\n\n if (updatedObjects.length === 0) {\n LoggerProxy.logger.info(\n `HashTreeParser#handleLocusUpdate --> ${this.debugId} No objects updated as a result of received API response`\n );\n } else {\n this.callLocusInfoUpdateCallback({\n updateType: LocusInfoUpdateType.OBJECTS_UPDATED,\n updatedObjects,\n });\n }\n }\n\n /**\n * Updates the internal data set information based on the received data set from Locus.\n *\n * @param {DataSet} receivedDataSet - The latest data set information received from Locus to update the internal state.\n * @returns {void}\n */\n private updateDataSetInfo(receivedDataSet: DataSet) {\n if (!this.dataSets[receivedDataSet.name]) {\n this.dataSets[receivedDataSet.name] = {\n ...receivedDataSet,\n };\n\n LoggerProxy.logger.info(\n `HashTreeParser#updateDataSetInfo --> ${this.debugId} created entry for \"${receivedDataSet.name}\" dataset: version=${receivedDataSet.version}, root=${receivedDataSet.root}`\n );\n\n return;\n }\n // update our version of the dataSet\n if (this.dataSets[receivedDataSet.name].version < receivedDataSet.version) {\n this.dataSets[receivedDataSet.name].version = receivedDataSet.version;\n this.dataSets[receivedDataSet.name].root = receivedDataSet.root;\n this.dataSets[receivedDataSet.name].idleMs = receivedDataSet.idleMs;\n this.dataSets[receivedDataSet.name].backoff = {\n maxMs: receivedDataSet.backoff.maxMs,\n exponent: receivedDataSet.backoff.exponent,\n };\n LoggerProxy.logger.info(\n `HashTreeParser#updateDataSetInfo --> ${this.debugId} updated \"${receivedDataSet.name}\" dataset to version=${receivedDataSet.version}, root=${receivedDataSet.root}`\n );\n }\n }\n\n /**\n * Updates the leaf count for a data set, resizing its hash tree accordingly.\n *\n * @param {InternalDataSet} dataSet - The data set to update\n * @param {number} newLeafCount - The new leaf count\n * @returns {void}\n */\n private updateDataSetLeafCount(dataSet: InternalDataSet, newLeafCount: number): void {\n dataSet.hashTree?.resize(newLeafCount);\n dataSet.leafCount = newLeafCount;\n }\n\n /**\n * Checks for changes in the visible data sets based on the updated objects.\n * @param {HashTreeObject[]} updatedObjects - The list of updated hash tree objects.\n * @returns {Object} An object containing the removed and added visible data sets.\n */\n private checkForVisibleDataSetChanges(updatedObjects: HashTreeObject[]) {\n let removedDataSets: VisibleDataSetInfo[] = [];\n let addedDataSets: VisibleDataSetInfo[] = [];\n\n // visibleDataSets can only be changed by Metadata object updates\n updatedObjects.forEach((object) => {\n if (isMetadata(object) && object.data?.visibleDataSets) {\n const newVisibleDataSets = object.data.visibleDataSets.filter(\n (vds) => !this.isExcludedDataSet(vds.name)\n );\n\n removedDataSets = this.visibleDataSets.filter(\n (ds) => !newVisibleDataSets.some((nvs) => nvs.name === ds.name)\n );\n addedDataSets = newVisibleDataSets.filter((nvs) =>\n this.visibleDataSets.every((ds) => ds.name !== nvs.name)\n );\n\n if (removedDataSets.length > 0 || addedDataSets.length > 0) {\n LoggerProxy.logger.info(\n `HashTreeParser#checkForVisibleDataSetChanges --> ${\n this.debugId\n } visible data sets change: removed: ${removedDataSets\n .map((ds) => ds.name)\n .join(', ')}, added: ${addedDataSets.map((ds) => ds.name).join(', ')}`\n );\n }\n }\n });\n\n return {\n changeDetected: removedDataSets.length > 0 || addedDataSets.length > 0,\n removedDataSets,\n addedDataSets,\n };\n }\n\n /**\n * Deletes the hash tree for the specified data set.\n *\n * @param {string} dataSetName name of the data set to delete\n * @returns {void}\n */\n private deleteHashTree(dataSetName: string) {\n this.dataSets[dataSetName].hashTree = undefined;\n\n // we also need to stop the timers as there is no hash tree anymore to sync\n if (this.dataSets[dataSetName].timer) {\n clearTimeout(this.dataSets[dataSetName].timer);\n this.dataSets[dataSetName].timer = undefined;\n }\n if (this.dataSets[dataSetName].heartbeatWatchdogTimer) {\n clearTimeout(this.dataSets[dataSetName].heartbeatWatchdogTimer);\n this.dataSets[dataSetName].heartbeatWatchdogTimer = undefined;\n }\n }\n\n /**\n * Adds entries to the passed in updateObjects array\n * for the changes that result from removing visible data sets and creates hash\n * trees for the new visible data sets, but without populating the hash trees.\n *\n * This function is synchronous. If we are missing information about some new\n * visible data sets and they require async initialization, the names of these data sets\n * are returned in an array.\n *\n * @param {VisibleDataSetInfo[]} removedDataSets - The list of removed data sets.\n * @param {VisibleDataSetInfo[]} addedDataSets - The list of added data sets.\n * @param {HashTreeObject[]} updatedObjects - The list of updated hash tree objects to which changes will be added.\n * @returns {VisibleDataSetInfo[]} list of data sets that couldn't be initialized synchronously\n */\n private processVisibleDataSetChanges(\n removedDataSets: VisibleDataSetInfo[],\n addedDataSets: VisibleDataSetInfo[],\n updatedObjects: HashTreeObject[]\n ): VisibleDataSetInfo[] {\n const dataSetsRequiringInitialization: VisibleDataSetInfo[] = [];\n\n // if a visible data set was removed, we need to tell our client that all objects from it are removed\n const removedObjects: HashTreeObject[] = [];\n\n removedDataSets.forEach((ds) => {\n if (this.dataSets[ds.name]?.hashTree) {\n for (let i = 0; i < this.dataSets[ds.name].hashTree.numLeaves; i += 1) {\n removedObjects.push(\n ...this.dataSets[ds.name].hashTree.getLeafData(i).map((elementId) => ({\n htMeta: {\n elementId,\n dataSetNames: [ds.name],\n },\n data: null,\n }))\n );\n }\n\n this.deleteHashTree(ds.name);\n }\n });\n this.visibleDataSets = this.visibleDataSets.filter(\n (vds) => !removedDataSets.some((rds) => rds.name === vds.name)\n );\n updatedObjects.push(...removedObjects);\n\n // now setup the new visible data sets\n for (const ds of addedDataSets) {\n const dataSetInfo = this.dataSets[ds.name];\n\n if (dataSetInfo) {\n if (this.isVisibleDataSet(dataSetInfo.name)) {\n LoggerProxy.logger.info(\n `HashTreeParser#processVisibleDataSetChanges --> ${this.debugId} Data set \"${ds.name}\" is already visible, skipping`\n );\n\n // eslint-disable-next-line no-continue\n continue;\n }\n\n LoggerProxy.logger.info(\n `HashTreeParser#processVisibleDataSetChanges --> ${this.debugId} Adding visible data set \"${ds.name}\"`\n );\n\n if (!this.addToVisibleDataSetsList(ds)) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n const hashTree = new HashTree([], dataSetInfo.leafCount);\n\n this.dataSets[dataSetInfo.name] = {\n ...dataSetInfo,\n hashTree,\n };\n\n // this call is needed here for the edge case where we receive a message with new visible data sets\n // and there are no objects belonging to these data sets in the message but we already have the info about them in this.dataSets\n this.runSyncAlgorithm(this.dataSets[dataSetInfo.name]);\n } else {\n LoggerProxy.logger.info(\n `HashTreeParser#processVisibleDataSetChanges --> ${this.debugId} visible data set \"${ds.name}\" added but no info about it in our dataSets structures`\n );\n // todo: add a metric here\n dataSetsRequiringInitialization.push(ds);\n }\n }\n\n return dataSetsRequiringInitialization;\n }\n\n /**\n * Adds entries to the passed in updateObjects array\n * for the changes that result from adding and removing visible data sets.\n *\n * @param {VisibleDataSetInfo[]} addedDataSets - The list of added data sets.\n * @returns {Promise<void>}\n */\n private async initializeNewVisibleDataSets(addedDataSets: VisibleDataSetInfo[]): Promise<void> {\n if (this.state === 'stopped') {\n return;\n }\n const allDataSets = await this.getAllVisibleDataSetsFromLocus();\n\n for (const ds of sortByInitPriority(addedDataSets, DATA_SET_INIT_PRIORITY)) {\n const dataSetInfo = allDataSets.find((d) => d.name === ds.name);\n\n LoggerProxy.logger.info(\n `HashTreeParser#initializeNewVisibleDataSets --> ${this.debugId} initializing data set \"${ds.name}\"`\n );\n\n if (!dataSetInfo) {\n LoggerProxy.logger.warn(\n `HashTreeParser#initializeNewVisibleDataSets --> ${this.debugId} missing info about data set \"${ds.name}\" in Locus response from visibleDataSetsUrl`\n );\n } else {\n // eslint-disable-next-line no-await-in-loop\n await this.initializeNewVisibleDataSet(ds, dataSetInfo);\n }\n }\n }\n\n /**\n * Parses incoming hash tree messages, updates the hash trees and returns information about the changes\n *\n * @param {HashTreeMessage} message - The hash tree message containing data sets and objects to be processed\n * @param {string} [debugText] - Optional debug text to include in logs\n * @returns {HashTreeObject[]} list of hash tree objects that were updated as a result of processing the message\n */\n private parseMessage(message: HashTreeMessage, debugText?: string): HashTreeObject[] {\n if (this.state === 'stopped') {\n return [];\n }\n\n const {dataSets, visibleDataSetsUrl} = message;\n\n LoggerProxy.logger.info(\n `HashTreeParser#parseMessage --> ${this.debugId} received message ${debugText || ''}:`,\n message\n );\n if (message.locusStateElements?.length === 0) {\n LoggerProxy.logger.warn(\n `HashTreeParser#parseMessage --> ${this.debugId} got empty locusStateElements!!!`\n );\n // todo: send a metric\n }\n\n // first, update our metadata about the datasets with info from the message\n this.visibleDataSetsUrl = visibleDataSetsUrl;\n dataSets.forEach((dataSet) => this.updateDataSetInfo(dataSet));\n\n const updatedObjects: HashTreeObject[] = [];\n\n // when we detect new visible datasets, it may be that the metadata about them is not\n // available in the message, they will require separate async initialization\n let dataSetsRequiringInitialization: VisibleDataSetInfo[] = [];\n\n // first find out if there are any visible data set changes - they're signalled in Metadata object updates\n const metadataUpdates = (message.locusStateElements || []).filter((object) =>\n isMetadata(object)\n );\n\n if (metadataUpdates.length > 0) {\n const updatedMetadataObjects: HashTreeObject[] = [];\n\n metadataUpdates.forEach((object) => {\n // todo: once Locus supports it, we will use the \"view\" field here instead of dataSetNames\n for (const dataSetName of object.htMeta.dataSetNames) {\n const hashTree = this.dataSets[dataSetName]?.hashTree;\n\n if (hashTree && object.data) {\n if (hashTree.putItem(object.htMeta.elementId)) {\n updatedMetadataObjects.push(object);\n }\n }\n }\n });\n\n updatedObjects.push(...updatedMetadataObjects);\n\n const {changeDetected, removedDataSets, addedDataSets} =\n this.checkForVisibleDataSetChanges(updatedMetadataObjects);\n\n if (changeDetected) {\n dataSetsRequiringInitialization = this.processVisibleDataSetChanges(\n removedDataSets,\n addedDataSets,\n updatedObjects\n );\n }\n }\n\n if (message.locusStateElements && message.locusStateElements.length > 0) {\n // by this point we now have this.dataSets setup for data sets from this message\n // and hash trees created for the new visible data sets,\n // so we can now process all the updates from the message\n dataSets.forEach((dataSet) => {\n if (this.dataSets[dataSet.name]) {\n const {hashTree} = this.dataSets[dataSet.name];\n\n if (hashTree) {\n const locusStateElementsForThisSet = message.locusStateElements.filter((object) =>\n object.htMeta.dataSetNames.includes(dataSet.name)\n );\n\n const appliedChangesList = hashTree.updateItems(\n locusStateElementsForThisSet.map((object) =>\n object.data\n ? {operation: 'update', item: object.htMeta.elementId}\n : {operation: 'remove', item: object.htMeta.elementId}\n )\n );\n\n zip(appliedChangesList, locusStateElementsForThisSet).forEach(\n ([changeApplied, object]) => {\n if (changeApplied) {\n // add to updatedObjects so that our locus DTO will get updated with the new object\n updatedObjects.push(object);\n }\n }\n );\n } else {\n LoggerProxy.logger.info(\n `Locus-info:index#parseMessage --> ${this.debugId} unexpected (not visible) dataSet ${dataSet.name} received in hash tree message`\n );\n }\n }\n\n this.runSyncAlgorithm(dataSet);\n });\n }\n\n if (dataSetsRequiringInitialization.length > 0) {\n // there are some data sets that we need to initialize asynchronously\n this.queueInitForNewVisibleDataSets(dataSetsRequiringInitialization);\n }\n\n if (updatedObjects.length === 0) {\n LoggerProxy.logger.info(\n `HashTreeParser#parseMessage --> ${this.debugId} No objects updated as a result of received message`\n );\n }\n\n return updatedObjects;\n }\n\n /**\n * Handles incoming hash tree messages, updates the hash trees and calls locusInfoUpdateCallback\n *\n * @param {HashTreeMessage} message - The hash tree message containing data sets and objects to be processed\n * @param {string} [debugText] - Optional debug text to include in logs\n * @returns {void}\n */\n handleMessage(message: HashTreeMessage, debugText?: string) {\n if (this.state === 'stopped') {\n return;\n }\n\n if (message.heartbeatIntervalMs) {\n this.heartbeatIntervalMs = message.heartbeatIntervalMs;\n }\n if (this.isEndMessage(message)) {\n LoggerProxy.logger.info(\n `HashTreeParser#handleMessage --> ${this.debugId} received sentinel END MEETING message`\n );\n this.stopAllTimers();\n\n this.callLocusInfoUpdateCallback({updateType: LocusInfoUpdateType.MEETING_ENDED});\n } else if (message.locusStateElements === undefined) {\n this.handleRootHashHeartBeatMessage(message);\n this.resetHeartbeatWatchdogs(message.dataSets);\n } else {\n const updatedObjects = this.parseMessage(message, debugText);\n\n this.resetHeartbeatWatchdogs(message.dataSets);\n this.callLocusInfoUpdateCallback({\n updateType: LocusInfoUpdateType.OBJECTS_UPDATED,\n updatedObjects,\n });\n }\n }\n\n /**\n * Calls the updateInfo callback if there are any updates to report\n *\n * @param {Object} updates parsed from a Locus message\n * @returns {void}\n */\n private callLocusInfoUpdateCallback(updates: LocusInfoUpdate) {\n if (this.state === 'stopped') {\n return;\n }\n\n const {updateType} = updates;\n\n if (updateType === LocusInfoUpdateType.OBJECTS_UPDATED && updates.updatedObjects?.length > 0) {\n // Filter out updates for objects that already have a higher version in their datasets,\n // or removals for objects that still exist in any of their datasets\n const filteredUpdates = updates.updatedObjects.filter((object) => {\n const {elementId} = object.htMeta;\n const {type, id, version} = elementId;\n\n // Check all datasets\n for (const dataSetName of Object.keys(this.dataSets)) {\n const dataSet = this.dataSets[dataSetName];\n\n // only visible datasets have hash trees set\n if (dataSet?.hashTree) {\n const existingVersion = dataSet.hashTree.getItemVersion(id, type);\n if (existingVersion !== undefined) {\n if (object.data) {\n // For updates: filter out if any dataset has a higher version\n if (existingVersion > version) {\n LoggerProxy.logger.info(\n `HashTreeParser#callLocusInfoUpdateCallback --> ${this.debugId} Filtering out update for ${type}:${id} v${version} because dataset \"${dataSetName}\" has v${existingVersion}`\n );\n\n return false;\n }\n } else if (existingVersion >= version) {\n // For removals: filter out if the object still exists in any dataset\n LoggerProxy.logger.info(\n `HashTreeParser#callLocusInfoUpdateCallback --> ${this.debugId} Filtering out removal for ${type}:${id} v${version} because dataset \"${dataSetName}\" still has v${existingVersion}`\n );\n\n return false;\n }\n }\n }\n }\n\n return true;\n });\n\n if (filteredUpdates.length > 0) {\n this.locusInfoUpdateCallback({updateType, updatedObjects: filteredUpdates});\n }\n } else if (updateType !== LocusInfoUpdateType.OBJECTS_UPDATED) {\n this.locusInfoUpdateCallback({updateType});\n }\n }\n\n /**\n * Calculates a weighted backoff time that should be used for syncs\n *\n * @param {Object} backoff - The backoff configuration containing maxMs and exponent\n * @returns {number} - A weighted backoff time based on the provided configuration, using algorithm supplied by Locus team\n */\n private getWeightedBackoffTime(backoff: {maxMs: number; exponent: number}): number {\n const {maxMs, exponent} = backoff;\n\n const randomValue = Math.random();\n\n return Math.round(randomValue ** exponent * maxMs);\n }\n\n /**\n * Performs a sync for the given data set.\n *\n * @param {InternalDataSet} dataSet - The data set to sync\n * @param {string} reason - The reason for the sync (used for logging)\n * @param {boolean} [isInitialization] - Whether this is an initialization sync (sends empty leaves data instead of comparing hashes)\n * @returns {Promise<void>}\n */\n private async performSync(\n dataSet: InternalDataSet,\n reason: string,\n isInitialization?: boolean\n ): Promise<void> {\n if (!dataSet.hashTree) {\n return;\n }\n\n const {hashTree} = dataSet;\n const rootHash = hashTree.getRootHash();\n\n try {\n LoggerProxy.logger.info(\n `HashTreeParser#performSync --> ${this.debugId} ${reason}, syncing data set \"${dataSet.name}\"`\n );\n\n let leavesData: Record<number, LeafDataItem[]> = {};\n\n if (!isInitialization) {\n if (dataSet.leafCount !== 1) {\n let receivedHashes;\n\n try {\n // request hashes from sender\n const hashesResult = await this.getHashesFromLocus(dataSet.name, rootHash);\n\n if (!hashesResult) {\n // hashes match, no sync needed\n return;\n }\n\n receivedHashes = hashesResult.hashes;\n\n this.updateDataSetLeafCount(dataSet, hashesResult.dataSet.leafCount);\n } catch (error: any) {\n if (error?.statusCode === 409) {\n // this is a leaf count mismatch, we should do nothing, just wait for another heartbeat message from Locus\n LoggerProxy.logger.info(\n `HashTreeParser#getHashesFromLocus --> ${this.debugId} Got 409 when fetching hashes for data set \"${dataSet.name}\": ${error.message}`\n );\n\n return;\n }\n throw error;\n }\n\n // identify mismatched leaves\n const mismatchedLeaveIndexes = hashTree.diffHashes(receivedHashes);\n\n mismatchedLeaveIndexes.forEach((index) => {\n leavesData[index] = hashTree.getLeafData(index);\n });\n } else {\n leavesData = {0: hashTree.getLeafData(0)};\n }\n }\n // request sync for mismatched leaves\n let syncResponse: HashTreeMessage | null = null;\n\n if (isInitialization) {\n syncResponse = await this.sendSyncRequestToLocus(dataSet, {isInitialization: true});\n } else if (Object.keys(leavesData).length > 0) {\n syncResponse = await this.sendSyncRequestToLocus(dataSet, {\n mismatchedLeavesData: leavesData,\n });\n }\n\n // sync API may return nothing (in that case data will arrive via messages)\n // or it may return a response in the same format as messages\n // We still need to restart the sync timer as a safety net in case the messages don't arrive.\n this.runSyncAlgorithm(dataSet);\n\n if (syncResponse) {\n // the format of sync response is the same as messages, so we can reuse the same handler\n this.handleMessage(syncResponse, 'via sync API');\n }\n } catch (error) {\n if (error instanceof MeetingEndedError) {\n this.callLocusInfoUpdateCallback({\n updateType: LocusInfoUpdateType.MEETING_ENDED,\n });\n } else {\n LoggerProxy.logger.warn(\n `HashTreeParser#performSync --> ${this.debugId} error during sync for data set \"${dataSet.name}\":`,\n error\n );\n }\n }\n }\n\n /**\n * Enqueues a sync for the given data set. If the data set is already in the queue, the request is ignored.\n * This ensures that all syncs are executed sequentially and no more than 1 sync runs at a time.\n *\n * @param {string} dataSetName - The name of the data set to sync\n * @param {string} reason - The reason for the sync (used for logging)\n * @param {boolean} [isInitialization=false] - Whether this is an initialization sync (uses empty leaves data instead of hash comparison)\n * @returns {void}\n */\n private enqueueSyncForDataset(\n dataSetName: string,\n reason: string,\n isInitialization = false\n ): void {\n if (this.state === 'stopped') return;\n\n const existingEntry = this.syncQueue.find((entry) => entry.dataSetName === dataSetName);\n\n if (existingEntry) {\n if (isInitialization) {\n existingEntry.isInitialization = true;\n }\n LoggerProxy.logger.info(\n `HashTreeParser#enqueueSyncForDataset --> ${this.debugId} data set \"${dataSetName}\" already in sync queue, skipping`\n );\n\n return;\n }\n\n this.syncQueue.push({dataSetName, reason, isInitialization});\n\n if (!this.isSyncInProgress) {\n this.syncQueueProcessingPromise = this.processSyncQueue();\n }\n }\n\n /**\n * Processes the sync queue sequentially. Only one instance of this method runs at a time.\n *\n * @returns {Promise<void>}\n */\n private async processSyncQueue(): Promise<void> {\n if (this.isSyncInProgress) return;\n\n this.isSyncInProgress = true;\n try {\n while (this.syncQueue.length > 0 && this.state !== 'stopped') {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const {dataSetName, reason, isInitialization} = this.syncQueue.shift()!;\n const dataSet = this.dataSets[dataSetName];\n\n if (!dataSet?.hashTree) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n // eslint-disable-next-line no-await-in-loop\n await this.performSync(dataSet, reason, isInitialization);\n }\n } finally {\n this.isSyncInProgress = false;\n }\n }\n\n /**\n * Syncs all data sets that have hash trees, one by one in sequence, using the priority order\n * provided by sortByInitPriority(). Does nothing if the parser is stopped or if a syncAllDatasets\n * call is already in progress.\n *\n * @returns {Promise<void>}\n */\n public async syncAllDatasets(): Promise<void> {\n if (this.state === 'stopped') return;\n if (this.isSyncAllInProgress) return;\n\n this.isSyncAllInProgress = true;\n try {\n const dataSetsWithHashTrees = Object.values(this.dataSets)\n .filter((dataSet) => dataSet?.hashTree)\n .map((dataSet) => ({name: dataSet.name}));\n\n const sorted = sortByInitPriority(dataSetsWithHashTrees, DATA_SET_INIT_PRIORITY);\n\n LoggerProxy.logger.info(\n `HashTreeParser#syncAllDatasets --> ${this.debugId} syncing datasets: ${sorted\n .map((ds) => ds.name)\n .join(', ')}`\n );\n\n for (const ds of sorted) {\n this.enqueueSyncForDataset(ds.name, 'syncAllDatasets');\n }\n\n await this.syncQueueProcessingPromise;\n } finally {\n this.isSyncAllInProgress = false;\n }\n }\n\n /**\n * Runs the sync algorithm for the given data set.\n *\n * @param {DataSet} receivedDataSet - The data set to run the sync algorithm for.\n * @returns {void}\n */\n private runSyncAlgorithm(receivedDataSet: DataSet) {\n const dataSet = this.dataSets[receivedDataSet.name];\n\n if (!dataSet) {\n LoggerProxy.logger.warn(\n `HashTreeParser#runSyncAlgorithm --> ${this.debugId} No data set found for ${receivedDataSet.name}, skipping sync algorithm`\n );\n\n return;\n }\n\n if (!dataSet.hashTree) {\n LoggerProxy.logger.info(\n `HashTreeParser#runSyncAlgorithm --> ${this.debugId} Data set \"${dataSet.name}\" has no hash tree, skipping sync algorithm`\n );\n\n return;\n }\n\n dataSet.hashTree.resize(receivedDataSet.leafCount);\n\n const delay = dataSet.idleMs + this.getWeightedBackoffTime(dataSet.backoff);\n\n if (delay > 0) {\n if (dataSet.timer) {\n clearTimeout(dataSet.timer);\n }\n\n LoggerProxy.logger.info(\n `HashTreeParser#runSyncAlgorithm --> ${this.debugId} setting \"${dataSet.name}\" sync timer for ${delay}`\n );\n\n dataSet.timer = setTimeout(() => {\n dataSet.timer = undefined;\n\n if (!dataSet.hashTree) {\n LoggerProxy.logger.warn(\n `HashTreeParser#runSyncAlgorithm --> ${this.debugId} Data set \"${dataSet.name}\" no longer has a hash tree, cannot run sync algorithm`\n );\n\n return;\n }\n\n const rootHash = dataSet.hashTree.getRootHash();\n\n if (dataSet.root !== rootHash) {\n this.enqueueSyncForDataset(\n dataSet.name,\n `Root hash mismatch: received=${dataSet.root}, ours=${rootHash}`\n );\n } else {\n LoggerProxy.logger.info(\n `HashTreeParser#runSyncAlgorithm --> ${this.debugId} \"${dataSet.name}\" root hash matching: ${rootHash}, version=${dataSet.version}`\n );\n }\n }, delay);\n } else {\n LoggerProxy.logger.info(\n `HashTreeParser#runSyncAlgorithm --> ${this.debugId} No delay for \"${dataSet.name}\" data set, skipping sync timer reset/setup`\n );\n }\n }\n\n /**\n * Resets the heartbeat watchdog timers for the specified data sets. Each data set has its own\n * watchdog timer that monitors whether heartbeats are being received within the expected interval.\n * If a heartbeat is not received for a specific data set within heartbeatIntervalMs plus\n * a backoff-calculated time, the sync algorithm is initiated for that data set\n *\n * @param {Array<DataSet>} receivedDataSets - The data sets from the received message for which watchdog timers should be reset\n * @returns {void}\n */\n private resetHeartbeatWatchdogs(receivedDataSets: Array<DataSet>): void {\n if (!this.heartbeatIntervalMs) {\n return;\n }\n\n for (const receivedDataSet of receivedDataSets) {\n const dataSet = this.dataSets[receivedDataSet.name];\n\n if (!dataSet?.hashTree) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n if (dataSet.heartbeatWatchdogTimer) {\n clearTimeout(dataSet.heartbeatWatchdogTimer);\n dataSet.heartbeatWatchdogTimer = undefined;\n }\n\n const backoffTime = this.getWeightedBackoffTime(dataSet.backoff);\n const delay = this.heartbeatIntervalMs + backoffTime;\n\n dataSet.heartbeatWatchdogTimer = setTimeout(() => {\n dataSet.heartbeatWatchdogTimer = undefined;\n\n LoggerProxy.logger.warn(\n `HashTreeParser#resetHeartbeatWatchdogs --> ${this.debugId} Heartbeat watchdog fired for data set \"${dataSet.name}\" - no heartbeat received within expected interval, initiating sync`\n );\n\n this.enqueueSyncForDataset(dataSet.name, `heartbeat watchdog expired`);\n this.resetHeartbeatWatchdogs([dataSet]);\n }, delay);\n }\n }\n\n /**\n * Stops all timers for the data sets to prevent any further sync attempts.\n * @returns {void}\n */\n private stopAllTimers() {\n Object.values(this.dataSets).forEach((dataSet) => {\n if (dataSet.timer) {\n clearTimeout(dataSet.timer);\n dataSet.timer = undefined;\n }\n if (dataSet.heartbeatWatchdogTimer) {\n clearTimeout(dataSet.heartbeatWatchdogTimer);\n dataSet.heartbeatWatchdogTimer = undefined;\n }\n });\n }\n\n /**\n * Stops the HashTreeParser, preventing it from processing any further messages and clearing all timers.\n * It also clears all the hash trees, so if the parser is resumed later, it will need to do a sync\n * to be up-to-date.\n * @returns {void}\n */\n public stop() {\n LoggerProxy.logger.info(\n `HashTreeParser#stop --> ${this.debugId} Stopping HashTreeParser, clearing timers and hash trees`\n );\n this.stopAllTimers();\n this.syncQueue = [];\n Object.values(this.dataSets).forEach((dataSet) => {\n dataSet.hashTree = undefined;\n });\n this.visibleDataSets = [];\n this.state = 'stopped';\n }\n\n /**\n * Cleans up the HashTreeParser, stopping all timers and clearing all internal state.\n * After calling this, the parser should not be used anymore.\n * @returns {void}\n */\n public cleanUp() {\n this.stop();\n this.dataSets = {};\n }\n\n /**\n * Resumes the HashTreeParser that was previously stopped, using a hash tree message.\n * @param {HashTreeMessage} message - The message to resume with, it must contain metadata with visible data sets info\n * @returns {void}\n */\n public resumeFromMessage(message: HashTreeMessage) {\n // check that message contains metadata with visible data sets - this is essential to be able to resume\n const metadataObject = message.locusStateElements?.find((el) => isMetadata(el));\n\n if (!metadataObject?.data?.visibleDataSets) {\n LoggerProxy.logger.warn(\n `HashTreeParser#resumeFromMessage --> ${this.debugId} Cannot resume HashTreeParser because the message is missing metadata with visible data sets info`\n );\n\n return;\n }\n this.setVisibleDataSets(\n metadataObject.data.visibleDataSets as VisibleDataSetInfo[],\n message.dataSets\n );\n\n this.dataSets = {};\n\n for (const dataSet of message.dataSets) {\n const {name, leafCount} = dataSet;\n\n this.dataSets[name] = {\n ...dataSet,\n hashTree: this.isVisibleDataSet(name) ? new HashTree([], leafCount) : undefined,\n };\n }\n LoggerProxy.logger.info(\n `HashTreeParser#resumeFromMessage --> ${\n this.debugId\n } Resuming HashTreeParser with data sets: ${Object.keys(this.dataSets).join(\n ', '\n )}, visible data sets: ${this.visibleDataSets.map((ds) => ds.name).join(', ')}`\n );\n this.state = 'active';\n\n this.handleMessage(message, 'on resume');\n }\n\n /**\n * Resumes the HashTreeParser that was previously stopped, using a Locus API response.\n * Unlike resumeFromMessage(), this does not require metadata/dataSets in the input,\n * as it fetches all necessary information from Locus via initializeFromGetLociResponse.\n * @param {LocusDTO} locus - locus object from an API response\n * @returns {Promise}\n */\n public async resumeFromApiResponse(locus: LocusDTO) {\n this.state = 'active';\n this.dataSets = {};\n\n LoggerProxy.logger.info(\n `HashTreeParser#resumeFromApiResponse --> ${this.debugId} Resuming HashTreeParser from API response`\n );\n\n await this.initializeFromGetLociResponse(locus);\n }\n\n private checkForSentinelHttpResponse(error: any, dataSetName?: string) {\n const isValidDataSetForSentinel =\n dataSetName === undefined ||\n PossibleSentinelMessageDataSetNames.includes(dataSetName.toLowerCase());\n\n if (\n ((error.statusCode === 409 && error.body?.errorCode === 2403004) ||\n error.statusCode === 404) &&\n isValidDataSetForSentinel\n ) {\n LoggerProxy.logger.info(\n `HashTreeParser#checkForSentinelHttpResponse --> ${this.debugId} Received ${error.statusCode} for data set \"${dataSetName}\", indicating that the meeting has ended`\n );\n this.stopAllTimers();\n\n throw new MeetingEndedError();\n }\n }\n\n /**\n * Gets the current hashes from the locus for a specific data set.\n * @param {string} dataSetName\n * @param {string} currentRootHash\n * @returns {Object|null} An object containing the hashes and leaf count, or null if the hashes match and no sync is needed\n */\n private getHashesFromLocus(dataSetName: string, currentRootHash: string) {\n LoggerProxy.logger.info(\n `HashTreeParser#getHashesFromLocus --> ${this.debugId} Requesting hashes for data set \"${dataSetName}\"`\n );\n\n const dataSet = this.dataSets[dataSetName];\n\n const url = `${dataSet.url}/hashtree`;\n\n return this.webexRequest({\n method: HTTP_VERBS.GET,\n uri: url,\n qs: {\n rootHash: currentRootHash,\n },\n })\n .then((response) => {\n if (!response.body || isEmpty(response.body)) {\n // 204 with empty body means our hashes match Locus, no sync needed\n LoggerProxy.logger.info(\n `HashTreeParser#getHashesFromLocus --> ${this.debugId} Got ${response.statusCode} with empty body for data set \"${dataSetName}\", hashes match - no sync needed`\n );\n\n return null;\n }\n\n const hashes = response.body?.hashes as string[] | undefined;\n const dataSetFromResponse = response.body?.dataSet;\n\n if (!hashes || !Array.isArray(hashes)) {\n LoggerProxy.logger.warn(\n `HashTreeParser#getHashesFromLocus --> ${this.debugId} Locus returned invalid hashes, response body=`,\n response.body\n );\n throw new Error(`Locus returned invalid hashes: ${hashes}`);\n }\n\n LoggerProxy.logger.info(\n `HashTreeParser#getHashesFromLocus --> ${\n this.debugId\n } Received hashes for data set \"${dataSetName}\": ${JSON.stringify(hashes)}`\n );\n\n return {\n hashes,\n dataSet: dataSetFromResponse as DataSet,\n };\n })\n .catch((error) => {\n LoggerProxy.logger.error(\n `HashTreeParser#getHashesFromLocus --> ${this.debugId} Error ${error.statusCode} fetching hashes for data set \"${dataSetName}\":`,\n error\n );\n this.checkForSentinelHttpResponse(error, dataSet.name);\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.HASH_TREE_SYNC_FAILURE, {\n debugId: this.debugId,\n dataSetName,\n request: 'GET /hashtree',\n statusCode: error.statusCode,\n reason: error.message,\n });\n\n throw error;\n });\n }\n\n /**\n * Sends a sync request to Locus for the specified data set.\n *\n * @param {InternalDataSet} dataSet The data set to sync.\n * @param {Object} options Either `{ isInitialization: true }` for init syncs (uses leafCount=1 with empty leaf data) or `{ mismatchedLeavesData }` for normal syncs.\n * @returns {Promise<HashTreeMessage|null>}\n */\n private sendSyncRequestToLocus(\n dataSet: InternalDataSet,\n options: {isInitialization: true} | {mismatchedLeavesData: Record<number, LeafDataItem[]>}\n ): Promise<HashTreeMessage | null> {\n LoggerProxy.logger.info(\n `HashTreeParser#sendSyncRequestToLocus --> ${this.debugId} Sending sync request for data set \"${dataSet.name}\"`\n );\n\n const isInitialization = 'isInitialization' in options;\n\n const url = `${dataSet.url}/sync`;\n const body: {\n leafCount: number;\n leafDataEntries: {leafIndex: number; elementIds: LeafDataItem[]}[];\n } = {\n leafCount: isInitialization ? 1 : dataSet.leafCount,\n leafDataEntries: [],\n };\n\n if (isInitialization) {\n // initialization sync: Locus requires leafCount=1 with a single empty leaf\n body.leafDataEntries.push({leafIndex: 0, elementIds: []});\n } else {\n const {mismatchedLeavesData} = options;\n\n Object.keys(mismatchedLeavesData).forEach((index) => {\n const leafIndex = parseInt(index, 10);\n\n body.leafDataEntries.push({\n leafIndex,\n elementIds: mismatchedLeavesData[leafIndex],\n });\n });\n }\n\n const ourCurrentRootHash = dataSet.hashTree ? dataSet.hashTree.getRootHash() : EMPTY_HASH;\n\n return this.webexRequest({\n method: HTTP_VERBS.POST,\n uri: url,\n qs: {\n rootHash: ourCurrentRootHash,\n },\n body,\n })\n .then((resp) => {\n LoggerProxy.logger.info(\n `HashTreeParser#sendSyncRequestToLocus --> ${this.debugId} Sync request succeeded for \"${dataSet.name}\"`\n );\n\n if (!resp.body || isEmpty(resp.body)) {\n LoggerProxy.logger.info(\n `HashTreeParser#sendSyncRequestToLocus --> ${this.debugId} Got ${resp.statusCode} with empty body for sync request for data set \"${dataSet.name}\", data should arrive via messages`\n );\n\n return null;\n }\n\n return resp.body as HashTreeMessage;\n })\n .catch((error) => {\n LoggerProxy.logger.error(\n `HashTreeParser#sendSyncRequestToLocus --> ${this.debugId} Error ${error.statusCode} sending sync request for data set \"${dataSet.name}\":`,\n error\n );\n this.checkForSentinelHttpResponse(error, dataSet.name);\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.HASH_TREE_SYNC_FAILURE, {\n debugId: this.debugId,\n dataSetName: dataSet.name,\n request: 'POST /sync',\n statusCode: error.statusCode,\n reason: error.message,\n });\n\n throw error;\n });\n }\n}\n\nexport default HashTreeParser;\n"],"mappings":"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","ignoreList":[]}
@@ -381,7 +381,7 @@ var SimultaneousInterpretation = _webexCore.WebexPlugin.extend({
381
381
  throw error;
382
382
  });
383
383
  },
384
- version: "3.12.0-next.46"
384
+ version: "3.12.0-next.47"
385
385
  });
386
386
  var _default = exports.default = SimultaneousInterpretation;
387
387
  //# sourceMappingURL=index.js.map
@@ -18,7 +18,7 @@ var SILanguage = _webexCore.WebexPlugin.extend({
18
18
  languageCode: 'number',
19
19
  languageName: 'string'
20
20
  },
21
- version: "3.12.0-next.46"
21
+ version: "3.12.0-next.47"
22
22
  });
23
23
  var _default = exports.default = SILanguage;
24
24
  //# sourceMappingURL=siLanguage.js.map
@@ -100,6 +100,7 @@ var BEHAVIORAL_METRICS = exports.default = {
100
100
  DEPRECATED_SET_CODEC_PARAMETERS_USED: 'js_sdk_deprecated_set_codec_parameters_used',
101
101
  DEPRECATED_DELETE_CODEC_PARAMETERS_USED: 'js_sdk_deprecated_delete_codec_parameters_used',
102
102
  SET_CUSTOM_CODEC_PARAMETERS_USED: 'js_sdk_set_custom_codec_parameters_used',
103
- MARK_CUSTOM_CODEC_PARAMETERS_FOR_DELETION_USED: 'js_sdk_mark_custom_codec_parameters_for_deletion_used'
103
+ MARK_CUSTOM_CODEC_PARAMETERS_FOR_DELETION_USED: 'js_sdk_mark_custom_codec_parameters_for_deletion_used',
104
+ HASH_TREE_SYNC_FAILURE: 'js_sdk_hash_tree_sync_failure'
104
105
  };
105
106
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["BEHAVIORAL_METRICS","exports","default","MEETINGS_REGISTRATION_FAILED","MEETINGS_REGISTRATION_SUCCESS","MEETINGS_REGISTRATION_STEP","MERCURY_CONNECTION_FAILURE","MERCURY_CONNECTION_RESTORED","JOIN_SUCCESS","JOIN_FAILURE","ADD_MEDIA_SUCCESS","ADD_MEDIA_FAILURE","ADD_MEDIA_RETRY","ROAP_MERCURY_EVENT_RECEIVED","CONNECTION_SUCCESS","CONNECTION_FAILURE","MEETING_LEAVE_FAILURE","MEETING_END_ALL_FAILURE","MEETING_END_ALL_INITIATED","GET_USER_MEDIA_FAILURE","GET_DISPLAY_MEDIA_FAILURE","JOIN_WITH_MEDIA_FAILURE","LLM_CONNECTION_AFTER_JOIN_FAILURE","LLM_HEALTHCHECK_FAILURE","RECEIVE_TRANSCRIPTION_AFTER_JOIN_FAILURE","DISCONNECT_DUE_TO_INACTIVITY","MEETING_MEDIA_INACTIVE","MEETING_RECONNECT_FAILURE","MEETING_MAX_REJOIN_FAILURE","MEETING_SHARE_SUCCESS","MEETING_SHARE_FAILURE","MEETING_START_WHITEBOARD_SHARE_FAILURE","MEETING_STOP_WHITEBOARD_SHARE_FAILURE","MEETING_SHARE_VIDEO_MUTE_STATE_CHANGE","MUTE_AUDIO_FAILURE","MUTE_VIDEO_FAILURE","SET_MEETING_QUALITY_FAILURE","STOP_FLOOR_REQUEST_FAILURE","ADD_DIAL_IN_FAILURE","ADD_DIAL_OUT_FAILURE","UPDATE_MEDIA_FAILURE","UNMUTE_AUDIO_FAILURE","UNMUTE_VIDEO_FAILURE","ROAP_ANSWER_FAILURE","ROAP_GLARE_CONDITION","PEERCONNECTION_FAILURE","INVALID_ICE_CANDIDATE","UPLOAD_LOGS_FAILURE","UPLOAD_LOGS_SUCCESS","RECEIVE_TRANSCRIPTION_FAILURE","MEETING_IS_IN_PROGRESS_ERROR","STATIC_MEETING_LINK_ALREADY_EXISTS_ERROR","FETCH_MEETING_INFO_V1_SUCCESS","FETCH_MEETING_INFO_V1_FAILURE","ENABLE_STATIC_METTING_LINK_SUCCESS","ENABLE_STATIC_METTING_LINK_FAILURE","DISABLE_STATIC_MEETING_LINK_SUCCESS","DISABLE_STATIC_MEETING_LINK_FAILURE","ADHOC_MEETING_SUCCESS","ADHOC_MEETING_FAILURE","FETCH_STATIC_MEETING_LINK_SUCCESS","FETCH_STATIC_MEETING_LINK_FAILURE","MEETING_LINK_DOES_NOT_EXIST_ERROR","VERIFY_PASSWORD_SUCCESS","VERIFY_PASSWORD_ERROR","VERIFY_CAPTCHA_ERROR","MOVE_TO_SUCCESS","MOVE_TO_FAILURE","MOVE_FROM_SUCCESS","MOVE_FROM_FAILURE","TURN_DISCOVERY_FAILURE","MEETING_INFO_POLICY_ERROR","LOCUS_DELTA_SYNC_FAILED","LOCUS_DELTA_OUT_OF_ORDER","LOCUS_SYNC_HANDLING_FAILED","PERMISSION_TOKEN_REFRESH","PERMISSION_TOKEN_REFRESH_ERROR","TURN_DISCOVERY_LATENCY","ROAP_OFFER_TO_ANSWER_LATENCY","ROAP_HTTP_RESPONSE_MISSING","TURN_DISCOVERY_REQUIRES_OK","REACHABILITY_COMPLETED","JOIN_WEBINAR_ERROR","GUEST_ENTERED_LOBBY","GUEST_EXITED_LOBBY","VERIFY_REGISTRATION_ID_SUCCESS","VERIFY_REGISTRATION_ID_ERROR","JOIN_FORBIDDEN_ERROR","MEDIA_ISSUE_DETECTED","LOCUS_CLASSIC_VS_HASH_TREE_MISMATCH","LOCUS_HASH_TREE_UNSUPPORTED_OPERATION","MEDIA_STILL_NOT_CONNECTED","DEPRECATED_SET_CODEC_PARAMETERS_USED","DEPRECATED_DELETE_CODEC_PARAMETERS_USED","SET_CUSTOM_CODEC_PARAMETERS_USED","MARK_CUSTOM_CODEC_PARAMETERS_FOR_DELETION_USED"],"sources":["constants.ts"],"sourcesContent":["// Metrics constants ----------------------------------------------------------\n\nconst BEHAVIORAL_METRICS = {\n MEETINGS_REGISTRATION_FAILED: 'js_sdk_meetings_registration_failed',\n MEETINGS_REGISTRATION_SUCCESS: 'js_sdk_meetings_registration_success',\n MEETINGS_REGISTRATION_STEP: 'meetings_registration_step',\n MERCURY_CONNECTION_FAILURE: 'js_sdk_mercury_connection_failure',\n MERCURY_CONNECTION_RESTORED: 'js_sdk_mercury_connection_restored',\n JOIN_SUCCESS: 'js_sdk_join_success',\n JOIN_FAILURE: 'js_sdk_join_failures',\n ADD_MEDIA_SUCCESS: 'js_sdk_add_media_success',\n ADD_MEDIA_FAILURE: 'js_sdk_add_media_failures',\n ADD_MEDIA_RETRY: 'js_sdk_add_media_retry',\n ROAP_MERCURY_EVENT_RECEIVED: 'js_sdk_roap_mercury_received',\n CONNECTION_SUCCESS: 'js_sdk_connection_success',\n CONNECTION_FAILURE: 'js_sdk_connection_failures',\n MEETING_LEAVE_FAILURE: 'js_sdk_meeting_leave_failure',\n MEETING_END_ALL_FAILURE: 'js_sdk_meeting_end_for_all_failure',\n MEETING_END_ALL_INITIATED: 'js_sdk_meeting_end_for_all_initiated',\n GET_USER_MEDIA_FAILURE: 'js_sdk_get_user_media_failures',\n GET_DISPLAY_MEDIA_FAILURE: 'js_sdk_get_display_media_failures',\n JOIN_WITH_MEDIA_FAILURE: 'js_sdk_join_with_media_failures',\n LLM_CONNECTION_AFTER_JOIN_FAILURE: 'js_sdk_llm_connection_after_join_failure',\n LLM_HEALTHCHECK_FAILURE: 'js_sdk_llm_healthcheck_failure',\n RECEIVE_TRANSCRIPTION_AFTER_JOIN_FAILURE: 'js_sdk_receive_transcription_after_join_failure',\n\n DISCONNECT_DUE_TO_INACTIVITY: 'js_sdk_disconnect_due_to_inactivity',\n MEETING_MEDIA_INACTIVE: 'js_sdk_meeting_media_inactive',\n MEETING_RECONNECT_FAILURE: 'js_sdk_meeting_reconnect_failures',\n MEETING_MAX_REJOIN_FAILURE: 'js_sdk_meeting_max_rejoin_failure',\n MEETING_SHARE_SUCCESS: 'js_sdk_meeting_share_success',\n MEETING_SHARE_FAILURE: 'js_sdk_meeting_share_failures',\n MEETING_START_WHITEBOARD_SHARE_FAILURE: 'js_sdk_meeting_start_whiteboard_share_failures',\n MEETING_STOP_WHITEBOARD_SHARE_FAILURE: 'js_sdk_meeting_stop_whiteboard_share_failures',\n MEETING_SHARE_VIDEO_MUTE_STATE_CHANGE: 'js_sdk_meeting_share_video_mute_state_change',\n MUTE_AUDIO_FAILURE: 'js_sdk_mute_audio_failures',\n MUTE_VIDEO_FAILURE: 'js_sdk_mute_video_failures',\n SET_MEETING_QUALITY_FAILURE: 'js_sdk_set_meeting_quality_failures',\n STOP_FLOOR_REQUEST_FAILURE: 'js_sdk_stop_floor_request_failures',\n ADD_DIAL_IN_FAILURE: 'js_sdk_add_dial_in_failure',\n ADD_DIAL_OUT_FAILURE: 'js_sdk_add_dial_out_failure',\n UPDATE_MEDIA_FAILURE: 'js_sdk_update_media_failures',\n UNMUTE_AUDIO_FAILURE: 'js_sdk_unmute_audio_failures',\n UNMUTE_VIDEO_FAILURE: 'js_sdk_unmute_video_failures',\n ROAP_ANSWER_FAILURE: 'js_sdk_roap_answer_failures',\n ROAP_GLARE_CONDITION: 'js_sdk_roap_glar_condition',\n PEERCONNECTION_FAILURE: 'js_sdk_peerConnection_failures',\n INVALID_ICE_CANDIDATE: 'js_sdk_invalid_ice_candidate',\n UPLOAD_LOGS_FAILURE: 'js_sdk_upload_logs_failure',\n UPLOAD_LOGS_SUCCESS: 'js_sdk_upload_logs_success',\n RECEIVE_TRANSCRIPTION_FAILURE: 'js_sdk_receive_transcription_failure',\n MEETING_IS_IN_PROGRESS_ERROR: 'js_sdk_meeting_is_in_progress_error',\n STATIC_MEETING_LINK_ALREADY_EXISTS_ERROR: 'js_sdk_static_meeting_link_already_exists_error',\n FETCH_MEETING_INFO_V1_SUCCESS: 'js_sdk_fetch_meeting_info_v1_success',\n FETCH_MEETING_INFO_V1_FAILURE: 'js_sdk_fetch_meeting_info_v1_failure',\n ENABLE_STATIC_METTING_LINK_SUCCESS: 'js_sdk_enable_static_meeting_link_success',\n ENABLE_STATIC_METTING_LINK_FAILURE: 'js_sdk_enable_static_meeting_link_failure',\n DISABLE_STATIC_MEETING_LINK_SUCCESS: 'js_sdk_disable_static_meeting_link_success',\n DISABLE_STATIC_MEETING_LINK_FAILURE: 'js_sdk_disable_static_meeting_link_failure',\n ADHOC_MEETING_SUCCESS: 'js_sdk_adhoc_meeting_success',\n ADHOC_MEETING_FAILURE: 'js_sdk_adhoc_meeting_failure',\n FETCH_STATIC_MEETING_LINK_SUCCESS: 'js_sdk_fetch_static_meeting_link_success',\n FETCH_STATIC_MEETING_LINK_FAILURE: 'js_sdk_fetch_static_meeting_link_failure',\n MEETING_LINK_DOES_NOT_EXIST_ERROR: 'js_sdk_meeting_link_does_not_exist_error',\n VERIFY_PASSWORD_SUCCESS: 'js_sdk_verify_password_success',\n VERIFY_PASSWORD_ERROR: 'js_sdk_verify_password_error',\n VERIFY_CAPTCHA_ERROR: 'js_sdk_verify_captcha_error',\n MOVE_TO_SUCCESS: 'js_sdk_move_to_success',\n MOVE_TO_FAILURE: 'js_sdk_move_to_failure',\n MOVE_FROM_SUCCESS: 'js_sdk_move_from_success',\n MOVE_FROM_FAILURE: 'js_sdk_move_from_failure',\n TURN_DISCOVERY_FAILURE: 'js_sdk_turn_discovery_failure',\n MEETING_INFO_POLICY_ERROR: 'js_sdk_meeting_info_policy_error',\n LOCUS_DELTA_SYNC_FAILED: 'js_sdk_locus_delta_sync_failed',\n LOCUS_DELTA_OUT_OF_ORDER: 'js_sdk_locus_delta_ooo',\n LOCUS_SYNC_HANDLING_FAILED: 'js_sdk_locus_sync_handling_failed',\n PERMISSION_TOKEN_REFRESH: 'js_sdk_permission_token_refresh',\n PERMISSION_TOKEN_REFRESH_ERROR: 'js_sdk_permission_token_refresh_error',\n TURN_DISCOVERY_LATENCY: 'js_sdk_turn_discovery_latency',\n ROAP_OFFER_TO_ANSWER_LATENCY: 'js_sdk_roap_offer_to_answer_latency',\n ROAP_HTTP_RESPONSE_MISSING: 'js_sdk_roap_http_response_missing',\n TURN_DISCOVERY_REQUIRES_OK: 'js_sdk_turn_discovery_requires_ok',\n REACHABILITY_COMPLETED: 'js_sdk_reachability_completed',\n JOIN_WEBINAR_ERROR: 'js_sdk_join_webinar_error',\n GUEST_ENTERED_LOBBY: 'js_sdk_guest_entered_lobby',\n GUEST_EXITED_LOBBY: 'js_sdk_guest_exited_lobby',\n VERIFY_REGISTRATION_ID_SUCCESS: 'js_sdk_verify_registrationId_success',\n VERIFY_REGISTRATION_ID_ERROR: 'js_sdk_verify_registrationId_error',\n JOIN_FORBIDDEN_ERROR: 'js_sdk_join_forbidden_error',\n MEDIA_ISSUE_DETECTED: 'js_sdk_media_issue_detected',\n LOCUS_CLASSIC_VS_HASH_TREE_MISMATCH: 'js_sdk_locus_classic_vs_hash_tree_mismatch',\n LOCUS_HASH_TREE_UNSUPPORTED_OPERATION: 'js_sdk_locus_hash_tree_unsupported_operation',\n MEDIA_STILL_NOT_CONNECTED: 'js_sdk_media_still_not_connected',\n DEPRECATED_SET_CODEC_PARAMETERS_USED: 'js_sdk_deprecated_set_codec_parameters_used',\n DEPRECATED_DELETE_CODEC_PARAMETERS_USED: 'js_sdk_deprecated_delete_codec_parameters_used',\n SET_CUSTOM_CODEC_PARAMETERS_USED: 'js_sdk_set_custom_codec_parameters_used',\n MARK_CUSTOM_CODEC_PARAMETERS_FOR_DELETION_USED:\n 'js_sdk_mark_custom_codec_parameters_for_deletion_used',\n};\n\nexport {BEHAVIORAL_METRICS as default};\n"],"mappings":";;;;;;;AAAA;;AAEA,IAAMA,kBAAkB,GAAAC,OAAA,CAAAC,OAAA,GAAG;EACzBC,4BAA4B,EAAE,qCAAqC;EACnEC,6BAA6B,EAAE,sCAAsC;EACrEC,0BAA0B,EAAE,4BAA4B;EACxDC,0BAA0B,EAAE,mCAAmC;EAC/DC,2BAA2B,EAAE,oCAAoC;EACjEC,YAAY,EAAE,qBAAqB;EACnCC,YAAY,EAAE,sBAAsB;EACpCC,iBAAiB,EAAE,0BAA0B;EAC7CC,iBAAiB,EAAE,2BAA2B;EAC9CC,eAAe,EAAE,wBAAwB;EACzCC,2BAA2B,EAAE,8BAA8B;EAC3DC,kBAAkB,EAAE,2BAA2B;EAC/CC,kBAAkB,EAAE,4BAA4B;EAChDC,qBAAqB,EAAE,8BAA8B;EACrDC,uBAAuB,EAAE,oCAAoC;EAC7DC,yBAAyB,EAAE,sCAAsC;EACjEC,sBAAsB,EAAE,gCAAgC;EACxDC,yBAAyB,EAAE,mCAAmC;EAC9DC,uBAAuB,EAAE,iCAAiC;EAC1DC,iCAAiC,EAAE,0CAA0C;EAC7EC,uBAAuB,EAAE,gCAAgC;EACzDC,wCAAwC,EAAE,iDAAiD;EAE3FC,4BAA4B,EAAE,qCAAqC;EACnEC,sBAAsB,EAAE,+BAA+B;EACvDC,yBAAyB,EAAE,mCAAmC;EAC9DC,0BAA0B,EAAE,mCAAmC;EAC/DC,qBAAqB,EAAE,8BAA8B;EACrDC,qBAAqB,EAAE,+BAA+B;EACtDC,sCAAsC,EAAE,gDAAgD;EACxFC,qCAAqC,EAAE,+CAA+C;EACtFC,qCAAqC,EAAE,8CAA8C;EACrFC,kBAAkB,EAAE,4BAA4B;EAChDC,kBAAkB,EAAE,4BAA4B;EAChDC,2BAA2B,EAAE,qCAAqC;EAClEC,0BAA0B,EAAE,oCAAoC;EAChEC,mBAAmB,EAAE,4BAA4B;EACjDC,oBAAoB,EAAE,6BAA6B;EACnDC,oBAAoB,EAAE,8BAA8B;EACpDC,oBAAoB,EAAE,8BAA8B;EACpDC,oBAAoB,EAAE,8BAA8B;EACpDC,mBAAmB,EAAE,6BAA6B;EAClDC,oBAAoB,EAAE,4BAA4B;EAClDC,sBAAsB,EAAE,gCAAgC;EACxDC,qBAAqB,EAAE,8BAA8B;EACrDC,mBAAmB,EAAE,4BAA4B;EACjDC,mBAAmB,EAAE,4BAA4B;EACjDC,6BAA6B,EAAE,sCAAsC;EACrEC,4BAA4B,EAAE,qCAAqC;EACnEC,wCAAwC,EAAE,iDAAiD;EAC3FC,6BAA6B,EAAE,sCAAsC;EACrEC,6BAA6B,EAAE,sCAAsC;EACrEC,kCAAkC,EAAE,2CAA2C;EAC/EC,kCAAkC,EAAE,2CAA2C;EAC/EC,mCAAmC,EAAE,4CAA4C;EACjFC,mCAAmC,EAAE,4CAA4C;EACjFC,qBAAqB,EAAE,8BAA8B;EACrDC,qBAAqB,EAAE,8BAA8B;EACrDC,iCAAiC,EAAE,0CAA0C;EAC7EC,iCAAiC,EAAE,0CAA0C;EAC7EC,iCAAiC,EAAE,0CAA0C;EAC7EC,uBAAuB,EAAE,gCAAgC;EACzDC,qBAAqB,EAAE,8BAA8B;EACrDC,oBAAoB,EAAE,6BAA6B;EACnDC,eAAe,EAAE,wBAAwB;EACzCC,eAAe,EAAE,wBAAwB;EACzCC,iBAAiB,EAAE,0BAA0B;EAC7CC,iBAAiB,EAAE,0BAA0B;EAC7CC,sBAAsB,EAAE,+BAA+B;EACvDC,yBAAyB,EAAE,kCAAkC;EAC7DC,uBAAuB,EAAE,gCAAgC;EACzDC,wBAAwB,EAAE,wBAAwB;EAClDC,0BAA0B,EAAE,mCAAmC;EAC/DC,wBAAwB,EAAE,iCAAiC;EAC3DC,8BAA8B,EAAE,uCAAuC;EACvEC,sBAAsB,EAAE,+BAA+B;EACvDC,4BAA4B,EAAE,qCAAqC;EACnEC,0BAA0B,EAAE,mCAAmC;EAC/DC,0BAA0B,EAAE,mCAAmC;EAC/DC,sBAAsB,EAAE,+BAA+B;EACvDC,kBAAkB,EAAE,2BAA2B;EAC/CC,mBAAmB,EAAE,4BAA4B;EACjDC,kBAAkB,EAAE,2BAA2B;EAC/CC,8BAA8B,EAAE,sCAAsC;EACtEC,4BAA4B,EAAE,oCAAoC;EAClEC,oBAAoB,EAAE,6BAA6B;EACnDC,oBAAoB,EAAE,6BAA6B;EACnDC,mCAAmC,EAAE,4CAA4C;EACjFC,qCAAqC,EAAE,8CAA8C;EACrFC,yBAAyB,EAAE,kCAAkC;EAC7DC,oCAAoC,EAAE,6CAA6C;EACnFC,uCAAuC,EAAE,gDAAgD;EACzFC,gCAAgC,EAAE,yCAAyC;EAC3EC,8CAA8C,EAC5C;AACJ,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["BEHAVIORAL_METRICS","exports","default","MEETINGS_REGISTRATION_FAILED","MEETINGS_REGISTRATION_SUCCESS","MEETINGS_REGISTRATION_STEP","MERCURY_CONNECTION_FAILURE","MERCURY_CONNECTION_RESTORED","JOIN_SUCCESS","JOIN_FAILURE","ADD_MEDIA_SUCCESS","ADD_MEDIA_FAILURE","ADD_MEDIA_RETRY","ROAP_MERCURY_EVENT_RECEIVED","CONNECTION_SUCCESS","CONNECTION_FAILURE","MEETING_LEAVE_FAILURE","MEETING_END_ALL_FAILURE","MEETING_END_ALL_INITIATED","GET_USER_MEDIA_FAILURE","GET_DISPLAY_MEDIA_FAILURE","JOIN_WITH_MEDIA_FAILURE","LLM_CONNECTION_AFTER_JOIN_FAILURE","LLM_HEALTHCHECK_FAILURE","RECEIVE_TRANSCRIPTION_AFTER_JOIN_FAILURE","DISCONNECT_DUE_TO_INACTIVITY","MEETING_MEDIA_INACTIVE","MEETING_RECONNECT_FAILURE","MEETING_MAX_REJOIN_FAILURE","MEETING_SHARE_SUCCESS","MEETING_SHARE_FAILURE","MEETING_START_WHITEBOARD_SHARE_FAILURE","MEETING_STOP_WHITEBOARD_SHARE_FAILURE","MEETING_SHARE_VIDEO_MUTE_STATE_CHANGE","MUTE_AUDIO_FAILURE","MUTE_VIDEO_FAILURE","SET_MEETING_QUALITY_FAILURE","STOP_FLOOR_REQUEST_FAILURE","ADD_DIAL_IN_FAILURE","ADD_DIAL_OUT_FAILURE","UPDATE_MEDIA_FAILURE","UNMUTE_AUDIO_FAILURE","UNMUTE_VIDEO_FAILURE","ROAP_ANSWER_FAILURE","ROAP_GLARE_CONDITION","PEERCONNECTION_FAILURE","INVALID_ICE_CANDIDATE","UPLOAD_LOGS_FAILURE","UPLOAD_LOGS_SUCCESS","RECEIVE_TRANSCRIPTION_FAILURE","MEETING_IS_IN_PROGRESS_ERROR","STATIC_MEETING_LINK_ALREADY_EXISTS_ERROR","FETCH_MEETING_INFO_V1_SUCCESS","FETCH_MEETING_INFO_V1_FAILURE","ENABLE_STATIC_METTING_LINK_SUCCESS","ENABLE_STATIC_METTING_LINK_FAILURE","DISABLE_STATIC_MEETING_LINK_SUCCESS","DISABLE_STATIC_MEETING_LINK_FAILURE","ADHOC_MEETING_SUCCESS","ADHOC_MEETING_FAILURE","FETCH_STATIC_MEETING_LINK_SUCCESS","FETCH_STATIC_MEETING_LINK_FAILURE","MEETING_LINK_DOES_NOT_EXIST_ERROR","VERIFY_PASSWORD_SUCCESS","VERIFY_PASSWORD_ERROR","VERIFY_CAPTCHA_ERROR","MOVE_TO_SUCCESS","MOVE_TO_FAILURE","MOVE_FROM_SUCCESS","MOVE_FROM_FAILURE","TURN_DISCOVERY_FAILURE","MEETING_INFO_POLICY_ERROR","LOCUS_DELTA_SYNC_FAILED","LOCUS_DELTA_OUT_OF_ORDER","LOCUS_SYNC_HANDLING_FAILED","PERMISSION_TOKEN_REFRESH","PERMISSION_TOKEN_REFRESH_ERROR","TURN_DISCOVERY_LATENCY","ROAP_OFFER_TO_ANSWER_LATENCY","ROAP_HTTP_RESPONSE_MISSING","TURN_DISCOVERY_REQUIRES_OK","REACHABILITY_COMPLETED","JOIN_WEBINAR_ERROR","GUEST_ENTERED_LOBBY","GUEST_EXITED_LOBBY","VERIFY_REGISTRATION_ID_SUCCESS","VERIFY_REGISTRATION_ID_ERROR","JOIN_FORBIDDEN_ERROR","MEDIA_ISSUE_DETECTED","LOCUS_CLASSIC_VS_HASH_TREE_MISMATCH","LOCUS_HASH_TREE_UNSUPPORTED_OPERATION","MEDIA_STILL_NOT_CONNECTED","DEPRECATED_SET_CODEC_PARAMETERS_USED","DEPRECATED_DELETE_CODEC_PARAMETERS_USED","SET_CUSTOM_CODEC_PARAMETERS_USED","MARK_CUSTOM_CODEC_PARAMETERS_FOR_DELETION_USED","HASH_TREE_SYNC_FAILURE"],"sources":["constants.ts"],"sourcesContent":["// Metrics constants ----------------------------------------------------------\n\nconst BEHAVIORAL_METRICS = {\n MEETINGS_REGISTRATION_FAILED: 'js_sdk_meetings_registration_failed',\n MEETINGS_REGISTRATION_SUCCESS: 'js_sdk_meetings_registration_success',\n MEETINGS_REGISTRATION_STEP: 'meetings_registration_step',\n MERCURY_CONNECTION_FAILURE: 'js_sdk_mercury_connection_failure',\n MERCURY_CONNECTION_RESTORED: 'js_sdk_mercury_connection_restored',\n JOIN_SUCCESS: 'js_sdk_join_success',\n JOIN_FAILURE: 'js_sdk_join_failures',\n ADD_MEDIA_SUCCESS: 'js_sdk_add_media_success',\n ADD_MEDIA_FAILURE: 'js_sdk_add_media_failures',\n ADD_MEDIA_RETRY: 'js_sdk_add_media_retry',\n ROAP_MERCURY_EVENT_RECEIVED: 'js_sdk_roap_mercury_received',\n CONNECTION_SUCCESS: 'js_sdk_connection_success',\n CONNECTION_FAILURE: 'js_sdk_connection_failures',\n MEETING_LEAVE_FAILURE: 'js_sdk_meeting_leave_failure',\n MEETING_END_ALL_FAILURE: 'js_sdk_meeting_end_for_all_failure',\n MEETING_END_ALL_INITIATED: 'js_sdk_meeting_end_for_all_initiated',\n GET_USER_MEDIA_FAILURE: 'js_sdk_get_user_media_failures',\n GET_DISPLAY_MEDIA_FAILURE: 'js_sdk_get_display_media_failures',\n JOIN_WITH_MEDIA_FAILURE: 'js_sdk_join_with_media_failures',\n LLM_CONNECTION_AFTER_JOIN_FAILURE: 'js_sdk_llm_connection_after_join_failure',\n LLM_HEALTHCHECK_FAILURE: 'js_sdk_llm_healthcheck_failure',\n RECEIVE_TRANSCRIPTION_AFTER_JOIN_FAILURE: 'js_sdk_receive_transcription_after_join_failure',\n\n DISCONNECT_DUE_TO_INACTIVITY: 'js_sdk_disconnect_due_to_inactivity',\n MEETING_MEDIA_INACTIVE: 'js_sdk_meeting_media_inactive',\n MEETING_RECONNECT_FAILURE: 'js_sdk_meeting_reconnect_failures',\n MEETING_MAX_REJOIN_FAILURE: 'js_sdk_meeting_max_rejoin_failure',\n MEETING_SHARE_SUCCESS: 'js_sdk_meeting_share_success',\n MEETING_SHARE_FAILURE: 'js_sdk_meeting_share_failures',\n MEETING_START_WHITEBOARD_SHARE_FAILURE: 'js_sdk_meeting_start_whiteboard_share_failures',\n MEETING_STOP_WHITEBOARD_SHARE_FAILURE: 'js_sdk_meeting_stop_whiteboard_share_failures',\n MEETING_SHARE_VIDEO_MUTE_STATE_CHANGE: 'js_sdk_meeting_share_video_mute_state_change',\n MUTE_AUDIO_FAILURE: 'js_sdk_mute_audio_failures',\n MUTE_VIDEO_FAILURE: 'js_sdk_mute_video_failures',\n SET_MEETING_QUALITY_FAILURE: 'js_sdk_set_meeting_quality_failures',\n STOP_FLOOR_REQUEST_FAILURE: 'js_sdk_stop_floor_request_failures',\n ADD_DIAL_IN_FAILURE: 'js_sdk_add_dial_in_failure',\n ADD_DIAL_OUT_FAILURE: 'js_sdk_add_dial_out_failure',\n UPDATE_MEDIA_FAILURE: 'js_sdk_update_media_failures',\n UNMUTE_AUDIO_FAILURE: 'js_sdk_unmute_audio_failures',\n UNMUTE_VIDEO_FAILURE: 'js_sdk_unmute_video_failures',\n ROAP_ANSWER_FAILURE: 'js_sdk_roap_answer_failures',\n ROAP_GLARE_CONDITION: 'js_sdk_roap_glar_condition',\n PEERCONNECTION_FAILURE: 'js_sdk_peerConnection_failures',\n INVALID_ICE_CANDIDATE: 'js_sdk_invalid_ice_candidate',\n UPLOAD_LOGS_FAILURE: 'js_sdk_upload_logs_failure',\n UPLOAD_LOGS_SUCCESS: 'js_sdk_upload_logs_success',\n RECEIVE_TRANSCRIPTION_FAILURE: 'js_sdk_receive_transcription_failure',\n MEETING_IS_IN_PROGRESS_ERROR: 'js_sdk_meeting_is_in_progress_error',\n STATIC_MEETING_LINK_ALREADY_EXISTS_ERROR: 'js_sdk_static_meeting_link_already_exists_error',\n FETCH_MEETING_INFO_V1_SUCCESS: 'js_sdk_fetch_meeting_info_v1_success',\n FETCH_MEETING_INFO_V1_FAILURE: 'js_sdk_fetch_meeting_info_v1_failure',\n ENABLE_STATIC_METTING_LINK_SUCCESS: 'js_sdk_enable_static_meeting_link_success',\n ENABLE_STATIC_METTING_LINK_FAILURE: 'js_sdk_enable_static_meeting_link_failure',\n DISABLE_STATIC_MEETING_LINK_SUCCESS: 'js_sdk_disable_static_meeting_link_success',\n DISABLE_STATIC_MEETING_LINK_FAILURE: 'js_sdk_disable_static_meeting_link_failure',\n ADHOC_MEETING_SUCCESS: 'js_sdk_adhoc_meeting_success',\n ADHOC_MEETING_FAILURE: 'js_sdk_adhoc_meeting_failure',\n FETCH_STATIC_MEETING_LINK_SUCCESS: 'js_sdk_fetch_static_meeting_link_success',\n FETCH_STATIC_MEETING_LINK_FAILURE: 'js_sdk_fetch_static_meeting_link_failure',\n MEETING_LINK_DOES_NOT_EXIST_ERROR: 'js_sdk_meeting_link_does_not_exist_error',\n VERIFY_PASSWORD_SUCCESS: 'js_sdk_verify_password_success',\n VERIFY_PASSWORD_ERROR: 'js_sdk_verify_password_error',\n VERIFY_CAPTCHA_ERROR: 'js_sdk_verify_captcha_error',\n MOVE_TO_SUCCESS: 'js_sdk_move_to_success',\n MOVE_TO_FAILURE: 'js_sdk_move_to_failure',\n MOVE_FROM_SUCCESS: 'js_sdk_move_from_success',\n MOVE_FROM_FAILURE: 'js_sdk_move_from_failure',\n TURN_DISCOVERY_FAILURE: 'js_sdk_turn_discovery_failure',\n MEETING_INFO_POLICY_ERROR: 'js_sdk_meeting_info_policy_error',\n LOCUS_DELTA_SYNC_FAILED: 'js_sdk_locus_delta_sync_failed',\n LOCUS_DELTA_OUT_OF_ORDER: 'js_sdk_locus_delta_ooo',\n LOCUS_SYNC_HANDLING_FAILED: 'js_sdk_locus_sync_handling_failed',\n PERMISSION_TOKEN_REFRESH: 'js_sdk_permission_token_refresh',\n PERMISSION_TOKEN_REFRESH_ERROR: 'js_sdk_permission_token_refresh_error',\n TURN_DISCOVERY_LATENCY: 'js_sdk_turn_discovery_latency',\n ROAP_OFFER_TO_ANSWER_LATENCY: 'js_sdk_roap_offer_to_answer_latency',\n ROAP_HTTP_RESPONSE_MISSING: 'js_sdk_roap_http_response_missing',\n TURN_DISCOVERY_REQUIRES_OK: 'js_sdk_turn_discovery_requires_ok',\n REACHABILITY_COMPLETED: 'js_sdk_reachability_completed',\n JOIN_WEBINAR_ERROR: 'js_sdk_join_webinar_error',\n GUEST_ENTERED_LOBBY: 'js_sdk_guest_entered_lobby',\n GUEST_EXITED_LOBBY: 'js_sdk_guest_exited_lobby',\n VERIFY_REGISTRATION_ID_SUCCESS: 'js_sdk_verify_registrationId_success',\n VERIFY_REGISTRATION_ID_ERROR: 'js_sdk_verify_registrationId_error',\n JOIN_FORBIDDEN_ERROR: 'js_sdk_join_forbidden_error',\n MEDIA_ISSUE_DETECTED: 'js_sdk_media_issue_detected',\n LOCUS_CLASSIC_VS_HASH_TREE_MISMATCH: 'js_sdk_locus_classic_vs_hash_tree_mismatch',\n LOCUS_HASH_TREE_UNSUPPORTED_OPERATION: 'js_sdk_locus_hash_tree_unsupported_operation',\n MEDIA_STILL_NOT_CONNECTED: 'js_sdk_media_still_not_connected',\n DEPRECATED_SET_CODEC_PARAMETERS_USED: 'js_sdk_deprecated_set_codec_parameters_used',\n DEPRECATED_DELETE_CODEC_PARAMETERS_USED: 'js_sdk_deprecated_delete_codec_parameters_used',\n SET_CUSTOM_CODEC_PARAMETERS_USED: 'js_sdk_set_custom_codec_parameters_used',\n MARK_CUSTOM_CODEC_PARAMETERS_FOR_DELETION_USED:\n 'js_sdk_mark_custom_codec_parameters_for_deletion_used',\n HASH_TREE_SYNC_FAILURE: 'js_sdk_hash_tree_sync_failure',\n};\n\nexport {BEHAVIORAL_METRICS as default};\n"],"mappings":"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","ignoreList":[]}
@@ -228,6 +228,14 @@ declare class HashTreeParser {
228
228
  * @returns {void}
229
229
  */
230
230
  private updateDataSetInfo;
231
+ /**
232
+ * Updates the leaf count for a data set, resizing its hash tree accordingly.
233
+ *
234
+ * @param {InternalDataSet} dataSet - The data set to update
235
+ * @param {number} newLeafCount - The new leaf count
236
+ * @returns {void}
237
+ */
238
+ private updateDataSetLeafCount;
231
239
  /**
232
240
  * Checks for changes in the visible data sets based on the updated objects.
233
241
  * @param {HashTreeObject[]} updatedObjects - The list of updated hash tree objects.
@@ -92,5 +92,6 @@ declare const BEHAVIORAL_METRICS: {
92
92
  DEPRECATED_DELETE_CODEC_PARAMETERS_USED: string;
93
93
  SET_CUSTOM_CODEC_PARAMETERS_USED: string;
94
94
  MARK_CUSTOM_CODEC_PARAMETERS_FOR_DELETION_USED: string;
95
+ HASH_TREE_SYNC_FAILURE: string;
95
96
  };
96
97
  export { BEHAVIORAL_METRICS as default };
@@ -774,7 +774,7 @@ var Webinar = _webexCore.WebexPlugin.extend({
774
774
  }, _callee1);
775
775
  }))();
776
776
  },
777
- version: "3.12.0-next.46"
777
+ version: "3.12.0-next.47"
778
778
  });
779
779
  var _default = exports.default = Webinar;
780
780
  //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -94,5 +94,5 @@
94
94
  "//": [
95
95
  "TODO: upgrade jwt-decode when moving to node 18"
96
96
  ],
97
- "version": "3.12.0-next.46"
97
+ "version": "3.12.0-next.47"
98
98
  }
@@ -1,6 +1,8 @@
1
1
  import {cloneDeep, isEmpty, zip} from 'lodash';
2
2
  import HashTree, {LeafDataItem} from './hashTree';
3
3
  import LoggerProxy from '../common/logs/logger-proxy';
4
+ import Metrics from '../metrics';
5
+ import BEHAVIORAL_METRICS from '../metrics/constants';
4
6
  import {Enum, HTTP_VERBS} from '../constants';
5
7
  import {DataSetNames, DATA_SET_INIT_PRIORITY, EMPTY_HASH} from './constants';
6
8
  import {ObjectType, HtMeta, HashTreeObject} from './types';
@@ -753,6 +755,18 @@ class HashTreeParser {
753
755
  }
754
756
  }
755
757
 
758
+ /**
759
+ * Updates the leaf count for a data set, resizing its hash tree accordingly.
760
+ *
761
+ * @param {InternalDataSet} dataSet - The data set to update
762
+ * @param {number} newLeafCount - The new leaf count
763
+ * @returns {void}
764
+ */
765
+ private updateDataSetLeafCount(dataSet: InternalDataSet, newLeafCount: number): void {
766
+ dataSet.hashTree?.resize(newLeafCount);
767
+ dataSet.leafCount = newLeafCount;
768
+ }
769
+
756
770
  /**
757
771
  * Checks for changes in the visible data sets based on the updated objects.
758
772
  * @param {HashTreeObject[]} updatedObjects - The list of updated hash tree objects.
@@ -1213,7 +1227,7 @@ class HashTreeParser {
1213
1227
 
1214
1228
  receivedHashes = hashesResult.hashes;
1215
1229
 
1216
- hashTree.resize(hashesResult.dataSet.leafCount);
1230
+ this.updateDataSetLeafCount(dataSet, hashesResult.dataSet.leafCount);
1217
1231
  } catch (error: any) {
1218
1232
  if (error?.statusCode === 409) {
1219
1233
  // this is a leaf count mismatch, we should do nothing, just wait for another heartbeat message from Locus
@@ -1667,6 +1681,13 @@ class HashTreeParser {
1667
1681
  error
1668
1682
  );
1669
1683
  this.checkForSentinelHttpResponse(error, dataSet.name);
1684
+ Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.HASH_TREE_SYNC_FAILURE, {
1685
+ debugId: this.debugId,
1686
+ dataSetName,
1687
+ request: 'GET /hashtree',
1688
+ statusCode: error.statusCode,
1689
+ reason: error.message,
1690
+ });
1670
1691
 
1671
1692
  throw error;
1672
1693
  });
@@ -1745,6 +1766,13 @@ class HashTreeParser {
1745
1766
  error
1746
1767
  );
1747
1768
  this.checkForSentinelHttpResponse(error, dataSet.name);
1769
+ Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.HASH_TREE_SYNC_FAILURE, {
1770
+ debugId: this.debugId,
1771
+ dataSetName: dataSet.name,
1772
+ request: 'POST /sync',
1773
+ statusCode: error.statusCode,
1774
+ reason: error.message,
1775
+ });
1748
1776
 
1749
1777
  throw error;
1750
1778
  });
@@ -96,6 +96,7 @@ const BEHAVIORAL_METRICS = {
96
96
  SET_CUSTOM_CODEC_PARAMETERS_USED: 'js_sdk_set_custom_codec_parameters_used',
97
97
  MARK_CUSTOM_CODEC_PARAMETERS_FOR_DELETION_USED:
98
98
  'js_sdk_mark_custom_codec_parameters_for_deletion_used',
99
+ HASH_TREE_SYNC_FAILURE: 'js_sdk_hash_tree_sync_failure',
99
100
  };
100
101
 
101
102
  export {BEHAVIORAL_METRICS as default};
@@ -8,6 +8,8 @@ import sinon from 'sinon';
8
8
  import {assert} from '@webex/test-helper-chai';
9
9
  import {EMPTY_HASH} from '@webex/plugin-meetings/src/hashTree/constants';
10
10
  import { some } from 'lodash';
11
+ import Metrics from '@webex/plugin-meetings/src/metrics';
12
+ import BEHAVIORAL_METRICS from '@webex/plugin-meetings/src/metrics/constants';
11
13
 
12
14
  const visibleDataSetsUrl = 'https://locus-a.wbx2.com/locus/api/v1/loci/97d64a5f/visibleDataSets';
13
15
 
@@ -152,16 +154,19 @@ describe('HashTreeParser', () => {
152
154
  let webexRequest: sinon.SinonStub;
153
155
  let callback: sinon.SinonStub;
154
156
  let mathRandomStub: sinon.SinonStub;
157
+ let metricsStub: sinon.SinonStub;
155
158
 
156
159
  beforeEach(() => {
157
160
  clock = sinon.useFakeTimers();
158
161
  webexRequest = sinon.stub();
159
162
  callback = sinon.stub();
160
163
  mathRandomStub = sinon.stub(Math, 'random').returns(0);
164
+ metricsStub = sinon.stub(Metrics, 'sendBehavioralMetric');
161
165
  });
162
166
  afterEach(() => {
163
167
  clock.restore();
164
168
  mathRandomStub.restore();
169
+ metricsStub.restore();
165
170
  });
166
171
 
167
172
  // Helper to create a HashTreeParser instance with common defaults
@@ -1817,6 +1822,9 @@ describe('HashTreeParser', () => {
1817
1822
  assert.isUndefined(ds.timer);
1818
1823
  assert.isUndefined(ds.heartbeatWatchdogTimer);
1819
1824
  });
1825
+
1826
+ // Verify no sync failure metric was sent for end-meeting sentinel
1827
+ assert.notCalled(metricsStub);
1820
1828
  });
1821
1829
 
1822
1830
  it(`when /sync returns ${statusCode}`, async () => {
@@ -1880,6 +1888,9 @@ describe('HashTreeParser', () => {
1880
1888
  assert.isUndefined(ds.timer);
1881
1889
  assert.isUndefined(ds.heartbeatWatchdogTimer);
1882
1890
  });
1891
+
1892
+ // Verify no sync failure metric was sent for end-meeting sentinel
1893
+ assert.notCalled(metricsStub);
1883
1894
  });
1884
1895
  });
1885
1896
  });
@@ -2125,6 +2136,153 @@ describe('HashTreeParser', () => {
2125
2136
  })
2126
2137
  );
2127
2138
  });
2139
+
2140
+ it('updates dataSet.leafCount when hash tree is resized during sync so that the sync request has the correct leafCount', async () => {
2141
+ const parser = createHashTreeParser();
2142
+
2143
+ // Send a heartbeat with a mismatched root hash to trigger runSyncAlgorithm
2144
+ const heartbeatMessage = {
2145
+ dataSets: [
2146
+ {
2147
+ ...createDataSet('main', 16, 1100),
2148
+ root: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1', // different from ours
2149
+ },
2150
+ ],
2151
+ visibleDataSetsUrl,
2152
+ locusUrl,
2153
+ };
2154
+
2155
+ parser.handleMessage(heartbeatMessage, 'heartbeat with mismatch');
2156
+
2157
+ // The sync timer should be set
2158
+ expect(parser.dataSets.main.timer).to.not.be.undefined;
2159
+
2160
+ const mainDataSetUrl = parser.dataSets.main.url;
2161
+ const newLeafCount = 32;
2162
+
2163
+ // Mock getHashesFromLocus response with a DIFFERENT leafCount (32 instead of 16)
2164
+ mockGetHashesFromLocusResponse(
2165
+ mainDataSetUrl,
2166
+ new Array(newLeafCount).fill('00000000000000000000000000000000'),
2167
+ createDataSet('main', newLeafCount, 1101)
2168
+ );
2169
+
2170
+ // Mock the sync request - use matching root hash
2171
+ const syncResponseDataSet = createDataSet('main', newLeafCount, 1102);
2172
+ syncResponseDataSet.root = parser.dataSets.main.hashTree.getRootHash();
2173
+ mockSendSyncRequestResponse(mainDataSetUrl, {
2174
+ dataSets: [syncResponseDataSet],
2175
+ visibleDataSetsUrl,
2176
+ locusUrl,
2177
+ locusStateElements: [],
2178
+ });
2179
+
2180
+ // Advance time to fire the sync timer (idleMs=1000 + backoff=0)
2181
+ await clock.tickAsync(1000);
2182
+
2183
+ // Verify the sync request was sent with the NEW leafCount (32), not the old one (16)
2184
+ assert.calledWith(
2185
+ webexRequest,
2186
+ sinon.match({
2187
+ method: 'POST',
2188
+ uri: `${mainDataSetUrl}/sync`,
2189
+ body: sinon.match({
2190
+ leafCount: newLeafCount,
2191
+ }),
2192
+ })
2193
+ );
2194
+ });
2195
+
2196
+ it('sends HASH_TREE_SYNC_FAILURE metric when GET /hashtree request fails', async () => {
2197
+ const parser = createHashTreeParser();
2198
+
2199
+ // Send a heartbeat with a mismatched root hash to trigger runSyncAlgorithm
2200
+ const heartbeatMessage = {
2201
+ dataSets: [
2202
+ {
2203
+ ...createDataSet('main', 16, 1100),
2204
+ root: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1',
2205
+ },
2206
+ ],
2207
+ visibleDataSetsUrl,
2208
+ locusUrl,
2209
+ };
2210
+
2211
+ parser.handleMessage(heartbeatMessage, 'heartbeat with mismatch');
2212
+
2213
+ const mainDataSetUrl = parser.dataSets.main.url;
2214
+ const hashTreeError = new Error('server error') as any;
2215
+ hashTreeError.statusCode = 500;
2216
+
2217
+ webexRequest
2218
+ .withArgs(
2219
+ sinon.match({
2220
+ method: 'GET',
2221
+ uri: `${mainDataSetUrl}/hashtree`,
2222
+ })
2223
+ )
2224
+ .rejects(hashTreeError);
2225
+
2226
+ await clock.tickAsync(1000);
2227
+
2228
+ assert.calledOnceWithExactly(metricsStub, BEHAVIORAL_METRICS.HASH_TREE_SYNC_FAILURE, {
2229
+ debugId: 'test',
2230
+ dataSetName: 'main',
2231
+ request: 'GET /hashtree',
2232
+ statusCode: 500,
2233
+ reason: 'server error',
2234
+ });
2235
+ });
2236
+
2237
+ it('sends HASH_TREE_SYNC_FAILURE metric when POST /sync request fails', async () => {
2238
+ const parser = createHashTreeParser();
2239
+
2240
+ // Send a heartbeat with a mismatched root hash to trigger runSyncAlgorithm
2241
+ const heartbeatMessage = {
2242
+ dataSets: [
2243
+ {
2244
+ ...createDataSet('main', 16, 1100),
2245
+ root: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1',
2246
+ },
2247
+ ],
2248
+ visibleDataSetsUrl,
2249
+ locusUrl,
2250
+ };
2251
+
2252
+ parser.handleMessage(heartbeatMessage, 'heartbeat with mismatch');
2253
+
2254
+ const mainDataSetUrl = parser.dataSets.main.url;
2255
+
2256
+ // Mock getHashesFromLocus to succeed
2257
+ mockGetHashesFromLocusResponse(
2258
+ mainDataSetUrl,
2259
+ new Array(16).fill('00000000000000000000000000000000'),
2260
+ createDataSet('main', 16, 1101)
2261
+ );
2262
+
2263
+ // Mock sendSyncRequestToLocus to fail
2264
+ const syncError = new Error('sync failed') as any;
2265
+ syncError.statusCode = 500;
2266
+
2267
+ webexRequest
2268
+ .withArgs(
2269
+ sinon.match({
2270
+ method: 'POST',
2271
+ uri: `${mainDataSetUrl}/sync`,
2272
+ })
2273
+ )
2274
+ .rejects(syncError);
2275
+
2276
+ await clock.tickAsync(1000);
2277
+
2278
+ assert.calledOnceWithExactly(metricsStub, BEHAVIORAL_METRICS.HASH_TREE_SYNC_FAILURE, {
2279
+ debugId: 'test',
2280
+ dataSetName: 'main',
2281
+ request: 'POST /sync',
2282
+ statusCode: 500,
2283
+ reason: 'sync failed',
2284
+ });
2285
+ });
2128
2286
  });
2129
2287
 
2130
2288
  describe('handles visible data sets changes correctly', () => {