@webex/plugin-meetings 3.12.0-next.24 → 3.12.0-next.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/aiEnableRequest/index.js +1 -1
- package/dist/breakouts/breakout.js +1 -1
- package/dist/breakouts/index.js +1 -1
- package/dist/hashTree/hashTreeParser.js +64 -45
- package/dist/hashTree/hashTreeParser.js.map +1 -1
- package/dist/interpretation/index.js +1 -1
- package/dist/interpretation/siLanguage.js +1 -1
- package/dist/types/hashTree/hashTreeParser.d.ts +1 -1
- package/dist/webinar/index.js +1 -1
- package/package.json +1 -1
- package/src/hashTree/hashTreeParser.ts +61 -51
- package/test/unit/spec/hashTree/hashTreeParser.ts +26 -0
|
@@ -178,7 +178,7 @@ var AIEnableRequest = _webexCore.WebexPlugin.extend({
|
|
|
178
178
|
method: _constants.HTTP_VERBS.PUT
|
|
179
179
|
});
|
|
180
180
|
},
|
|
181
|
-
version: "3.12.0-next.
|
|
181
|
+
version: "3.12.0-next.25"
|
|
182
182
|
});
|
|
183
183
|
var _default = exports.default = AIEnableRequest;
|
|
184
184
|
//# sourceMappingURL=index.js.map
|
package/dist/breakouts/index.js
CHANGED
|
@@ -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.
|
|
1112
|
+
version: "3.12.0-next.25"
|
|
1113
1113
|
});
|
|
1114
1114
|
var _default = exports.default = Breakouts;
|
|
1115
1115
|
//# sourceMappingURL=index.js.map
|
|
@@ -1282,7 +1282,7 @@ var HashTreeParser = /*#__PURE__*/function () {
|
|
|
1282
1282
|
key: "performSync",
|
|
1283
1283
|
value: (function () {
|
|
1284
1284
|
var _performSync = (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee6(dataSet, reason, isInitialization) {
|
|
1285
|
-
var hashTree, rootHash, leavesData,
|
|
1285
|
+
var hashTree, rootHash, leavesData, receivedHashes, hashesResult, mismatchedLeaveIndexes, syncResponse, _t3, _t4;
|
|
1286
1286
|
return _regenerator.default.wrap(function (_context7) {
|
|
1287
1287
|
while (1) switch (_context7.prev = _context7.next) {
|
|
1288
1288
|
case 0:
|
|
@@ -1296,81 +1296,90 @@ var HashTreeParser = /*#__PURE__*/function () {
|
|
|
1296
1296
|
rootHash = hashTree.getRootHash();
|
|
1297
1297
|
_context7.prev = 2;
|
|
1298
1298
|
_loggerProxy.default.logger.info("HashTreeParser#performSync --> ".concat(this.debugId, " ").concat(reason, ", syncing data set \"").concat(dataSet.name, "\""));
|
|
1299
|
-
if (!isInitialization) {
|
|
1300
|
-
_context7.next = 3;
|
|
1301
|
-
break;
|
|
1302
|
-
}
|
|
1303
|
-
// initialization sync: send all leaves as empty to get all data from Locus
|
|
1304
1299
|
leavesData = {};
|
|
1305
|
-
|
|
1306
|
-
|
|
1300
|
+
if (isInitialization) {
|
|
1301
|
+
_context7.next = 10;
|
|
1302
|
+
break;
|
|
1307
1303
|
}
|
|
1308
|
-
_context7.next = 11;
|
|
1309
|
-
break;
|
|
1310
|
-
case 3:
|
|
1311
1304
|
if (!(dataSet.leafCount !== 1)) {
|
|
1312
|
-
_context7.next =
|
|
1305
|
+
_context7.next = 9;
|
|
1313
1306
|
break;
|
|
1314
1307
|
}
|
|
1315
|
-
|
|
1316
|
-
_context7.
|
|
1317
|
-
_context7.next = 5;
|
|
1308
|
+
_context7.prev = 3;
|
|
1309
|
+
_context7.next = 4;
|
|
1318
1310
|
return this.getHashesFromLocus(dataSet.name, rootHash);
|
|
1319
|
-
case
|
|
1311
|
+
case 4:
|
|
1320
1312
|
hashesResult = _context7.sent;
|
|
1321
1313
|
if (hashesResult) {
|
|
1322
|
-
_context7.next =
|
|
1314
|
+
_context7.next = 5;
|
|
1323
1315
|
break;
|
|
1324
1316
|
}
|
|
1325
1317
|
return _context7.abrupt("return");
|
|
1326
|
-
case
|
|
1318
|
+
case 5:
|
|
1327
1319
|
receivedHashes = hashesResult.hashes;
|
|
1328
1320
|
hashTree.resize(hashesResult.dataSet.leafCount);
|
|
1329
|
-
_context7.next =
|
|
1321
|
+
_context7.next = 8;
|
|
1330
1322
|
break;
|
|
1331
|
-
case
|
|
1332
|
-
_context7.prev =
|
|
1333
|
-
_t3 = _context7["catch"](
|
|
1323
|
+
case 6:
|
|
1324
|
+
_context7.prev = 6;
|
|
1325
|
+
_t3 = _context7["catch"](3);
|
|
1334
1326
|
if (!((_t3 === null || _t3 === void 0 ? void 0 : _t3.statusCode) === 409)) {
|
|
1335
|
-
_context7.next =
|
|
1327
|
+
_context7.next = 7;
|
|
1336
1328
|
break;
|
|
1337
1329
|
}
|
|
1338
1330
|
// this is a leaf count mismatch, we should do nothing, just wait for another heartbeat message from Locus
|
|
1339
1331
|
_loggerProxy.default.logger.info("HashTreeParser#getHashesFromLocus --> ".concat(this.debugId, " Got 409 when fetching hashes for data set \"").concat(dataSet.name, "\": ").concat(_t3.message));
|
|
1340
1332
|
return _context7.abrupt("return");
|
|
1341
|
-
case
|
|
1333
|
+
case 7:
|
|
1342
1334
|
throw _t3;
|
|
1343
|
-
case
|
|
1335
|
+
case 8:
|
|
1344
1336
|
// identify mismatched leaves
|
|
1345
1337
|
mismatchedLeaveIndexes = hashTree.diffHashes(receivedHashes);
|
|
1346
1338
|
mismatchedLeaveIndexes.forEach(function (index) {
|
|
1347
1339
|
leavesData[index] = hashTree.getLeafData(index);
|
|
1348
1340
|
});
|
|
1349
|
-
_context7.next =
|
|
1341
|
+
_context7.next = 10;
|
|
1350
1342
|
break;
|
|
1351
|
-
case
|
|
1343
|
+
case 9:
|
|
1352
1344
|
leavesData = {
|
|
1353
1345
|
0: hashTree.getLeafData(0)
|
|
1354
1346
|
};
|
|
1347
|
+
case 10:
|
|
1348
|
+
// request sync for mismatched leaves
|
|
1349
|
+
syncResponse = null;
|
|
1350
|
+
if (!isInitialization) {
|
|
1351
|
+
_context7.next = 12;
|
|
1352
|
+
break;
|
|
1353
|
+
}
|
|
1354
|
+
_context7.next = 11;
|
|
1355
|
+
return this.sendSyncRequestToLocus(dataSet, {
|
|
1356
|
+
isInitialization: true
|
|
1357
|
+
});
|
|
1355
1358
|
case 11:
|
|
1359
|
+
syncResponse = _context7.sent;
|
|
1360
|
+
_context7.next = 14;
|
|
1361
|
+
break;
|
|
1362
|
+
case 12:
|
|
1356
1363
|
if (!((0, _keys.default)(leavesData).length > 0)) {
|
|
1357
|
-
_context7.next =
|
|
1364
|
+
_context7.next = 14;
|
|
1358
1365
|
break;
|
|
1359
1366
|
}
|
|
1360
|
-
_context7.next =
|
|
1361
|
-
return this.sendSyncRequestToLocus(dataSet,
|
|
1362
|
-
|
|
1367
|
+
_context7.next = 13;
|
|
1368
|
+
return this.sendSyncRequestToLocus(dataSet, {
|
|
1369
|
+
mismatchedLeavesData: leavesData
|
|
1370
|
+
});
|
|
1371
|
+
case 13:
|
|
1363
1372
|
syncResponse = _context7.sent;
|
|
1373
|
+
case 14:
|
|
1364
1374
|
// sync API may return nothing (in that case data will arrive via messages)
|
|
1365
1375
|
// or it may return a response in the same format as messages
|
|
1366
1376
|
if (syncResponse) {
|
|
1367
1377
|
this.handleMessage(syncResponse, 'via sync API');
|
|
1368
1378
|
}
|
|
1369
|
-
|
|
1370
|
-
_context7.next = 15;
|
|
1379
|
+
_context7.next = 16;
|
|
1371
1380
|
break;
|
|
1372
|
-
case
|
|
1373
|
-
_context7.prev =
|
|
1381
|
+
case 15:
|
|
1382
|
+
_context7.prev = 15;
|
|
1374
1383
|
_t4 = _context7["catch"](2);
|
|
1375
1384
|
if (_t4 instanceof MeetingEndedError) {
|
|
1376
1385
|
this.callLocusInfoUpdateCallback({
|
|
@@ -1379,11 +1388,11 @@ var HashTreeParser = /*#__PURE__*/function () {
|
|
|
1379
1388
|
} else {
|
|
1380
1389
|
_loggerProxy.default.logger.warn("HashTreeParser#performSync --> ".concat(this.debugId, " error during sync for data set \"").concat(dataSet.name, "\":"), _t4);
|
|
1381
1390
|
}
|
|
1382
|
-
case
|
|
1391
|
+
case 16:
|
|
1383
1392
|
case "end":
|
|
1384
1393
|
return _context7.stop();
|
|
1385
1394
|
}
|
|
1386
|
-
}, _callee6, this, [[2,
|
|
1395
|
+
}, _callee6, this, [[2, 15], [3, 6]]);
|
|
1387
1396
|
}));
|
|
1388
1397
|
function performSync(_x8, _x9, _x0) {
|
|
1389
1398
|
return _performSync.apply(this, arguments);
|
|
@@ -1828,26 +1837,36 @@ var HashTreeParser = /*#__PURE__*/function () {
|
|
|
1828
1837
|
* Sends a sync request to Locus for the specified data set.
|
|
1829
1838
|
*
|
|
1830
1839
|
* @param {InternalDataSet} dataSet The data set to sync.
|
|
1831
|
-
* @param {
|
|
1840
|
+
* @param {Object} options Either `{ isInitialization: true }` for init syncs (uses leafCount=1 with empty leaf data) or `{ mismatchedLeavesData }` for normal syncs.
|
|
1832
1841
|
* @returns {Promise<HashTreeMessage|null>}
|
|
1833
1842
|
*/
|
|
1834
1843
|
}, {
|
|
1835
1844
|
key: "sendSyncRequestToLocus",
|
|
1836
|
-
value: function sendSyncRequestToLocus(dataSet,
|
|
1845
|
+
value: function sendSyncRequestToLocus(dataSet, options) {
|
|
1837
1846
|
var _this13 = this;
|
|
1838
1847
|
_loggerProxy.default.logger.info("HashTreeParser#sendSyncRequestToLocus --> ".concat(this.debugId, " Sending sync request for data set \"").concat(dataSet.name, "\""));
|
|
1848
|
+
var isInitialization = 'isInitialization' in options;
|
|
1839
1849
|
var url = "".concat(dataSet.url, "/sync");
|
|
1840
1850
|
var body = {
|
|
1841
|
-
leafCount: dataSet.leafCount,
|
|
1851
|
+
leafCount: isInitialization ? 1 : dataSet.leafCount,
|
|
1842
1852
|
leafDataEntries: []
|
|
1843
1853
|
};
|
|
1844
|
-
|
|
1845
|
-
|
|
1854
|
+
if (isInitialization) {
|
|
1855
|
+
// initialization sync: Locus requires leafCount=1 with a single empty leaf
|
|
1846
1856
|
body.leafDataEntries.push({
|
|
1847
|
-
leafIndex:
|
|
1848
|
-
elementIds:
|
|
1857
|
+
leafIndex: 0,
|
|
1858
|
+
elementIds: []
|
|
1849
1859
|
});
|
|
1850
|
-
}
|
|
1860
|
+
} else {
|
|
1861
|
+
var mismatchedLeavesData = options.mismatchedLeavesData;
|
|
1862
|
+
(0, _keys.default)(mismatchedLeavesData).forEach(function (index) {
|
|
1863
|
+
var leafIndex = (0, _parseInt2.default)(index, 10);
|
|
1864
|
+
body.leafDataEntries.push({
|
|
1865
|
+
leafIndex: leafIndex,
|
|
1866
|
+
elementIds: mismatchedLeavesData[leafIndex]
|
|
1867
|
+
});
|
|
1868
|
+
});
|
|
1869
|
+
}
|
|
1851
1870
|
var ourCurrentRootHash = dataSet.hashTree ? dataSet.hashTree.getRootHash() : _constants2.EMPTY_HASH;
|
|
1852
1871
|
return this.webexRequest({
|
|
1853
1872
|
method: _constants.HTTP_VERBS.POST,
|
|
@@ -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","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","ourCurrentRootHash","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","mismatchedLeavesData","_this13","leafDataEntries","leafIndex","_parseInt2","elementIds","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 // initialization sync: send all leaves as empty to get all data from Locus\n leavesData = {};\n for (let i = 0; i < dataSet.leafCount; i += 1) {\n leavesData[i] = [];\n }\n } else if (dataSet.leafCount !== 1) {\n leavesData = {};\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 // request sync for mismatched leaves\n if (Object.keys(leavesData).length > 0) {\n const syncResponse = await this.sendSyncRequestToLocus(dataSet, leavesData);\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 if (syncResponse) {\n this.handleMessage(syncResponse, 'via sync API');\n }\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 // temporary log for the workshop // todo: remove\n const ourCurrentRootHash = dataSet.hashTree.getRootHash();\n LoggerProxy.logger.info(\n `HashTreeParser#runSyncAlgorithm --> ${this.debugId} dataSet=\"${dataSet.name}\" version=${dataSet.version} hashes before starting timer: ours=${ourCurrentRootHash} Locus=${dataSet.root}`\n );\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 }, 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 {Record<number, LeafDataItem[]>} mismatchedLeavesData The mismatched leaves data to include in the sync request.\n * @returns {Promise<HashTreeMessage|null>}\n */\n private sendSyncRequestToLocus(\n dataSet: InternalDataSet,\n 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 url = `${dataSet.url}/sync`;\n const body: {\n leafCount: number;\n leafDataEntries: {leafIndex: number; elementIds: LeafDataItem[]}[];\n } = {\n leafCount: dataSet.leafCount,\n leafDataEntries: [],\n };\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 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","_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","ourCurrentRootHash","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","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 if (syncResponse) {\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 // temporary log for the workshop // todo: remove\n const ourCurrentRootHash = dataSet.hashTree.getRootHash();\n LoggerProxy.logger.info(\n `HashTreeParser#runSyncAlgorithm --> ${this.debugId} dataSet=\"${dataSet.name}\" version=${dataSet.version} hashes before starting timer: ours=${ourCurrentRootHash} Locus=${dataSet.root}`\n );\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 }, 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":[]}
|
|
@@ -372,7 +372,7 @@ var SimultaneousInterpretation = _webexCore.WebexPlugin.extend({
|
|
|
372
372
|
throw error;
|
|
373
373
|
});
|
|
374
374
|
},
|
|
375
|
-
version: "3.12.0-next.
|
|
375
|
+
version: "3.12.0-next.25"
|
|
376
376
|
});
|
|
377
377
|
var _default = exports.default = SimultaneousInterpretation;
|
|
378
378
|
//# 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.
|
|
21
|
+
version: "3.12.0-next.25"
|
|
22
22
|
});
|
|
23
23
|
var _default = exports.default = SILanguage;
|
|
24
24
|
//# sourceMappingURL=siLanguage.js.map
|
|
@@ -388,7 +388,7 @@ declare class HashTreeParser {
|
|
|
388
388
|
* Sends a sync request to Locus for the specified data set.
|
|
389
389
|
*
|
|
390
390
|
* @param {InternalDataSet} dataSet The data set to sync.
|
|
391
|
-
* @param {
|
|
391
|
+
* @param {Object} options Either `{ isInitialization: true }` for init syncs (uses leafCount=1 with empty leaf data) or `{ mismatchedLeavesData }` for normal syncs.
|
|
392
392
|
* @returns {Promise<HashTreeMessage|null>}
|
|
393
393
|
*/
|
|
394
394
|
private sendSyncRequestToLocus;
|
package/dist/webinar/index.js
CHANGED
package/package.json
CHANGED
|
@@ -1196,60 +1196,61 @@ class HashTreeParser {
|
|
|
1196
1196
|
`HashTreeParser#performSync --> ${this.debugId} ${reason}, syncing data set "${dataSet.name}"`
|
|
1197
1197
|
);
|
|
1198
1198
|
|
|
1199
|
-
let leavesData: Record<number, LeafDataItem[]
|
|
1199
|
+
let leavesData: Record<number, LeafDataItem[]> = {};
|
|
1200
1200
|
|
|
1201
|
-
if (isInitialization) {
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
for (let i = 0; i < dataSet.leafCount; i += 1) {
|
|
1205
|
-
leavesData[i] = [];
|
|
1206
|
-
}
|
|
1207
|
-
} else if (dataSet.leafCount !== 1) {
|
|
1208
|
-
leavesData = {};
|
|
1209
|
-
let receivedHashes;
|
|
1201
|
+
if (!isInitialization) {
|
|
1202
|
+
if (dataSet.leafCount !== 1) {
|
|
1203
|
+
let receivedHashes;
|
|
1210
1204
|
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1205
|
+
try {
|
|
1206
|
+
// request hashes from sender
|
|
1207
|
+
const hashesResult = await this.getHashesFromLocus(dataSet.name, rootHash);
|
|
1214
1208
|
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1209
|
+
if (!hashesResult) {
|
|
1210
|
+
// hashes match, no sync needed
|
|
1211
|
+
return;
|
|
1212
|
+
}
|
|
1219
1213
|
|
|
1220
|
-
|
|
1214
|
+
receivedHashes = hashesResult.hashes;
|
|
1221
1215
|
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1216
|
+
hashTree.resize(hashesResult.dataSet.leafCount);
|
|
1217
|
+
} catch (error: any) {
|
|
1218
|
+
if (error?.statusCode === 409) {
|
|
1219
|
+
// this is a leaf count mismatch, we should do nothing, just wait for another heartbeat message from Locus
|
|
1220
|
+
LoggerProxy.logger.info(
|
|
1221
|
+
`HashTreeParser#getHashesFromLocus --> ${this.debugId} Got 409 when fetching hashes for data set "${dataSet.name}": ${error.message}`
|
|
1222
|
+
);
|
|
1229
1223
|
|
|
1230
|
-
|
|
1224
|
+
return;
|
|
1225
|
+
}
|
|
1226
|
+
throw error;
|
|
1231
1227
|
}
|
|
1232
|
-
throw error;
|
|
1233
|
-
}
|
|
1234
1228
|
|
|
1235
|
-
|
|
1236
|
-
|
|
1229
|
+
// identify mismatched leaves
|
|
1230
|
+
const mismatchedLeaveIndexes = hashTree.diffHashes(receivedHashes);
|
|
1237
1231
|
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
|
|
1242
|
-
|
|
1232
|
+
mismatchedLeaveIndexes.forEach((index) => {
|
|
1233
|
+
leavesData[index] = hashTree.getLeafData(index);
|
|
1234
|
+
});
|
|
1235
|
+
} else {
|
|
1236
|
+
leavesData = {0: hashTree.getLeafData(0)};
|
|
1237
|
+
}
|
|
1243
1238
|
}
|
|
1244
1239
|
// request sync for mismatched leaves
|
|
1245
|
-
|
|
1246
|
-
const syncResponse = await this.sendSyncRequestToLocus(dataSet, leavesData);
|
|
1240
|
+
let syncResponse: HashTreeMessage | null = null;
|
|
1247
1241
|
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1242
|
+
if (isInitialization) {
|
|
1243
|
+
syncResponse = await this.sendSyncRequestToLocus(dataSet, {isInitialization: true});
|
|
1244
|
+
} else if (Object.keys(leavesData).length > 0) {
|
|
1245
|
+
syncResponse = await this.sendSyncRequestToLocus(dataSet, {
|
|
1246
|
+
mismatchedLeavesData: leavesData,
|
|
1247
|
+
});
|
|
1248
|
+
}
|
|
1249
|
+
|
|
1250
|
+
// sync API may return nothing (in that case data will arrive via messages)
|
|
1251
|
+
// or it may return a response in the same format as messages
|
|
1252
|
+
if (syncResponse) {
|
|
1253
|
+
this.handleMessage(syncResponse, 'via sync API');
|
|
1253
1254
|
}
|
|
1254
1255
|
} catch (error) {
|
|
1255
1256
|
if (error instanceof MeetingEndedError) {
|
|
@@ -1676,34 +1677,43 @@ class HashTreeParser {
|
|
|
1676
1677
|
* Sends a sync request to Locus for the specified data set.
|
|
1677
1678
|
*
|
|
1678
1679
|
* @param {InternalDataSet} dataSet The data set to sync.
|
|
1679
|
-
* @param {
|
|
1680
|
+
* @param {Object} options Either `{ isInitialization: true }` for init syncs (uses leafCount=1 with empty leaf data) or `{ mismatchedLeavesData }` for normal syncs.
|
|
1680
1681
|
* @returns {Promise<HashTreeMessage|null>}
|
|
1681
1682
|
*/
|
|
1682
1683
|
private sendSyncRequestToLocus(
|
|
1683
1684
|
dataSet: InternalDataSet,
|
|
1684
|
-
mismatchedLeavesData: Record<number, LeafDataItem[]>
|
|
1685
|
+
options: {isInitialization: true} | {mismatchedLeavesData: Record<number, LeafDataItem[]>}
|
|
1685
1686
|
): Promise<HashTreeMessage | null> {
|
|
1686
1687
|
LoggerProxy.logger.info(
|
|
1687
1688
|
`HashTreeParser#sendSyncRequestToLocus --> ${this.debugId} Sending sync request for data set "${dataSet.name}"`
|
|
1688
1689
|
);
|
|
1689
1690
|
|
|
1691
|
+
const isInitialization = 'isInitialization' in options;
|
|
1692
|
+
|
|
1690
1693
|
const url = `${dataSet.url}/sync`;
|
|
1691
1694
|
const body: {
|
|
1692
1695
|
leafCount: number;
|
|
1693
1696
|
leafDataEntries: {leafIndex: number; elementIds: LeafDataItem[]}[];
|
|
1694
1697
|
} = {
|
|
1695
|
-
leafCount: dataSet.leafCount,
|
|
1698
|
+
leafCount: isInitialization ? 1 : dataSet.leafCount,
|
|
1696
1699
|
leafDataEntries: [],
|
|
1697
1700
|
};
|
|
1698
1701
|
|
|
1699
|
-
|
|
1700
|
-
|
|
1702
|
+
if (isInitialization) {
|
|
1703
|
+
// initialization sync: Locus requires leafCount=1 with a single empty leaf
|
|
1704
|
+
body.leafDataEntries.push({leafIndex: 0, elementIds: []});
|
|
1705
|
+
} else {
|
|
1706
|
+
const {mismatchedLeavesData} = options;
|
|
1707
|
+
|
|
1708
|
+
Object.keys(mismatchedLeavesData).forEach((index) => {
|
|
1709
|
+
const leafIndex = parseInt(index, 10);
|
|
1701
1710
|
|
|
1702
|
-
|
|
1703
|
-
|
|
1704
|
-
|
|
1711
|
+
body.leafDataEntries.push({
|
|
1712
|
+
leafIndex,
|
|
1713
|
+
elementIds: mismatchedLeavesData[leafIndex],
|
|
1714
|
+
});
|
|
1705
1715
|
});
|
|
1706
|
-
}
|
|
1716
|
+
}
|
|
1707
1717
|
|
|
1708
1718
|
const ourCurrentRootHash = dataSet.hashTree ? dataSet.hashTree.getRootHash() : EMPTY_HASH;
|
|
1709
1719
|
|
|
@@ -637,6 +637,32 @@ describe('HashTreeParser', () => {
|
|
|
637
637
|
expect(syncCalls[2].args[0].uri).to.equal(`${atdActiveDataSet.url}/sync`);
|
|
638
638
|
});
|
|
639
639
|
|
|
640
|
+
it('sends leafCount=1 with a single empty leaf for initialization sync, regardless of actual dataset leafCount', async () => {
|
|
641
|
+
const parser = createHashTreeParser({dataSets: [], locus: null}, null);
|
|
642
|
+
|
|
643
|
+
// Use a dataset with leafCount=16 to verify the initialization sync always uses leafCount=1
|
|
644
|
+
const mainDataSet = createDataSet('main', 16, 1100);
|
|
645
|
+
|
|
646
|
+
mockGetAllDataSetsMetadata(webexRequest, visibleDataSetsUrl, [mainDataSet]);
|
|
647
|
+
mockSyncRequest(webexRequest, mainDataSet.url);
|
|
648
|
+
|
|
649
|
+
await parser.initializeFromMessage({
|
|
650
|
+
dataSets: [],
|
|
651
|
+
visibleDataSetsUrl,
|
|
652
|
+
locusUrl,
|
|
653
|
+
});
|
|
654
|
+
|
|
655
|
+
assert.calledWith(webexRequest, {
|
|
656
|
+
method: 'POST',
|
|
657
|
+
uri: `${mainDataSet.url}/sync`,
|
|
658
|
+
qs: {rootHash: sinon.match.string},
|
|
659
|
+
body: {
|
|
660
|
+
leafCount: 1,
|
|
661
|
+
leafDataEntries: [{leafIndex: 0, elementIds: []}],
|
|
662
|
+
},
|
|
663
|
+
});
|
|
664
|
+
});
|
|
665
|
+
|
|
640
666
|
it('handles sync response that has locusStateElements undefined', async () => {
|
|
641
667
|
const minimalInitialLocus = {
|
|
642
668
|
dataSets: [],
|